Index | Thread | Search

From:
tbullock@comlore.com
Subject:
radeondrm: use the common KMS console path on sparc64
To:
tech@openbsd.org
Date:
Tue, 6 Oct 2026 00:04:39 -0600

Download raw body.

Thread
Hello,

I'm revisiting an old problem with the XVR100 on Sun Blade and other Sun
systems. The card uses the Radeon RV100, and its support in OpenBSD has a
variety of problems. I've decided to work through them systematically,
one fix at a time.

The current console implementation is completely broken as it stands on
the XVR100. Fixing the console is what's needed first. I'm going to try
to remove as much of the sparc64 specific code as possible. Doing that
already helps a lot, since the console becomes readable, although the
console text is still blurred. The small byte order fix included in this
patch corrects the colours to show a white background with black text.

Here is the first patch in that process. I've built and tested it on my
Sun Blade 100 with an XVR100, and I recommend accepting this patch as
tested. There are still further problems to work through.

Ted

Diff against src 9a41316fee4f8507967e487ca8ed12429c06d449:

diff /usr/src
path + /usr/src
commit - 9a41316fee4f8507967e487ca8ed12429c06d449
blob - 3490c1675a5465ca6e0a0cf331f9c4d812658394
file + sys/dev/pci/drm/radeon/radeon_drv.c
--- sys/dev/pci/drm/radeon/radeon_drv.c
+++ sys/dev/pci/drm/radeon/radeon_drv.c
@@ -743,9 +743,6 @@ int radeondrm_show_screen(void *, void *, int,
     void (*)(void *, int, int), void *);
 void radeondrm_doswitch(void *);
 void radeondrm_enter_ddb(void *, void *);
-#ifdef __sparc64__
-void radeondrm_setcolor(void *, u_int, u_int8_t, u_int8_t, u_int8_t);
-#endif
 void radeondrm_setpal(struct radeon_device *, struct rasops_info *);
 
 struct wsscreen_descr radeondrm_stdscreen = {
@@ -864,11 +861,7 @@ radeondrm_doswitch(void *v)
 	struct radeon_device *rdev = ri->ri_hw;
 
 	rasops_show_screen(ri, rdev->switchcookie, 0, NULL, NULL);
-#ifdef __sparc64__
-	fbwscons_setcolormap(&rdev->sf, radeondrm_setcolor);
-#else
 	radeondrm_setpal(rdev, ri);
-#endif
 	drm_fb_helper_restore_fbdev_mode_unlocked(rdev_to_drm(rdev)->fb_helper,
 	    false);
 
@@ -890,26 +883,7 @@ radeondrm_enter_ddb(void *v, void *cookie)
 	drm_fb_helper_debug_enter(fb_helper->info);
 }
 
-#ifdef __sparc64__
 void
-radeondrm_setcolor(void *v, u_int index, u_int8_t r, u_int8_t g, u_int8_t b)
-{
-	struct sunfb *sf = v;
-	struct radeon_device *rdev = sf->sf_ro.ri_hw;
-
-	/* see legacy_crtc_load_lut() */
-	if (rdev->family < CHIP_RS600) {
-		WREG8(RADEON_PALETTE_INDEX, index);
-		WREG32(RADEON_PALETTE_30_DATA,
-		    (r << 22) | (g << 12) | (b << 2));
-	} else {
-		printf("%s: setcolor family %d not handled\n",
-		    rdev->self.dv_xname, rdev->family);
-	}
-}
-#endif
-
-void
 radeondrm_setpal(struct radeon_device *rdev, struct rasops_info *ri)
 {
 	struct drm_device *dev = rdev_to_drm(rdev);
@@ -1287,16 +1261,14 @@ radeondrm_attachhook(struct device *self)
 	if (ri->ri_bits == NULL)
 		return;
 
-#ifdef __sparc64__
-	fbwscons_setcolormap(&rdev->sf, radeondrm_setcolor);
-	ri = &rdev->sf.sf_ro;
-#else
 	radeondrm_setpal(rdev, ri);
 	ri->ri_flg = RI_CENTER | RI_VCONS | RI_WRONLY;
+#ifdef __sparc64__
+	ri->ri_flg |= RI_BSWAP;
+#endif
 	rasops_init(ri, 160, 160);
 
 	ri->ri_hw = rdev;
-#endif
 
 	radeondrm_stdscreen.capabilities = ri->ri_caps;
 	radeondrm_stdscreen.nrows = ri->ri_rows;