⬢ DragonFlyBSD Kernel Audit
DF-3986 / fix.diff
← back to finding ↓ download raw
--- a/sys/dev/drm/radeon/ni.c
+++ b/sys/dev/drm/radeon/ni.c
@@ -2434,6 +2434,18 @@
 	ring->ring_obj = NULL;
 	r600_ring_init(rdev, ring, 1024 * 1024);
 
+	/* compute rings (dropped in the DFly port, present upstream):
+	 * without these cayman_cp_resume() runs order_base_2(0) (UB:
+	 * 1UL << 64) and programs CP_RB1/2 with a zero-size/zero-base
+	 * ring on every Cayman/Aruba boot (DF-3986). */
+	ring = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX];
+	ring->ring_obj = NULL;
+	r600_ring_init(rdev, ring, 1024 * 1024);
+
+	ring = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX];
+	ring->ring_obj = NULL;
+	r600_ring_init(rdev, ring, 1024 * 1024);
+
 	ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
 	ring->ring_obj = NULL;
 	r600_ring_init(rdev, ring, 64 * 1024);