Module Name:    src
Committed By:   macallan
Date:           Wed Nov 20 05:23:15 UTC 2024

Modified Files:
        src/sys/dev/ic: sti.c

Log Message:
add fb / cmap support for Summit family, aka FX2/4/6


To generate a diff of this commit:
cvs rdiff -u -r1.39 -r1.40 src/sys/dev/ic/sti.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/ic/sti.c
diff -u src/sys/dev/ic/sti.c:1.39 src/sys/dev/ic/sti.c:1.40
--- src/sys/dev/ic/sti.c:1.39	Mon Aug 19 16:09:42 2024
+++ src/sys/dev/ic/sti.c	Wed Nov 20 05:23:15 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: sti.c,v 1.39 2024/08/19 16:09:42 skrll Exp $	*/
+/*	$NetBSD: sti.c,v 1.40 2024/11/20 05:23:15 macallan Exp $	*/
 
 /*	$OpenBSD: sti.c,v 1.61 2009/09/05 14:09:35 miod Exp $	*/
 
@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sti.c,v 1.39 2024/08/19 16:09:42 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sti.c,v 1.40 2024/11/20 05:23:15 macallan Exp $");
 
 #include "wsdisplay.h"
 
@@ -52,6 +52,7 @@ __KERNEL_RCSID(0, "$NetBSD: sti.c,v 1.39
 #include <dev/wscons/wsconsio.h>
 
 #include <dev/ic/stireg.h>
+#include <dev/ic/summitreg.h>
 #include <dev/ic/stivar.h>
 
 #ifdef STIDEBUG
@@ -132,8 +133,10 @@ int	ngle_default_putcmap(struct sti_scre
 void	ngle_artist_setupfb(struct sti_screen *);
 void	ngle_elk_setupfb(struct sti_screen *);
 void	ngle_timber_setupfb(struct sti_screen *);
+void	summit_setupfb(struct sti_screen *);
 int	ngle_putcmap(struct sti_screen *, u_int, u_int);
 int	ngle_hcrx_putcmap(struct sti_screen *, u_int, u_int);
+int	summit_putcmap(struct sti_screen *, u_int, u_int);
 #endif
 
 #define	STI_ENABLE_ROM(sc) \
@@ -698,13 +701,18 @@ sti_screen_setup(struct sti_screen *scr,
 		scr->cmap_finish_register = NGLE_REG_38;
 		break;
 
+	case STI_DD_SUMMIT:
+		scr->setupfb = summit_setupfb;
+		scr->putcmap = summit_putcmap;
+		scr->scr_bpp = 8;	/* for now */
+		break;
+
 	case STI_DD_GRX:
 	case STI_DD_CRX24:
 	case STI_DD_EVRX:
 	case STI_DD_3X2V:
 	case STI_DD_DUAL_CRX:
 	case STI_DD_LEGO:
-	case STI_DD_SUMMIT:
 	case STI_DD_PINNACLE:
 	default:
 		scr->setupfb = NULL;
@@ -1583,6 +1591,44 @@ ngle_timber_setupfb(struct sti_screen *s
 	ngle_bt458_write(memt, memh, 0x0e, 0x43);
 }
 
+static void
+summit_wait(struct sti_screen *scr)
+{
+	struct sti_rom *rom = scr->scr_rom;
+	bus_space_tag_t memt = rom->memt;
+	bus_space_handle_t memh = rom->regh[0];
+
+	while (bus_space_read_stream_4(memt, memh, VISFX_STATUS) != 0)
+		continue;
+}
+
+void
+summit_setupfb(struct sti_screen *scr)
+{
+	struct sti_rom *rom = scr->scr_rom;
+	bus_space_tag_t memt = rom->memt;
+	bus_space_handle_t memh = rom->regh[0];
+
+	summit_wait(scr);
+	bus_space_write_stream_4(memt, memh, 0xb08044, 0x1b);
+	bus_space_write_stream_4(memt, memh, 0xb08048, 0x1b);
+	bus_space_write_stream_4(memt, memh, 0x920860, 0xe4);
+	bus_space_write_stream_4(memt, memh, 0xa00818, 0);
+	bus_space_write_stream_4(memt, memh, 0xa00404, 0);
+	bus_space_write_stream_4(memt, memh, 0x921110, 0);
+	bus_space_write_stream_4(memt, memh, 0x9211d8, 0);
+	bus_space_write_stream_4(memt, memh, 0xa0086c, 0);
+	bus_space_write_stream_4(memt, memh, 0x921114, 0);
+	bus_space_write_stream_4(memt, memh, 0xac1050, 0);
+	bus_space_write_stream_4(memt, memh, 0xa00858, 0xb0);
+
+	bus_space_write_stream_4(memt, memh, VISFX_PIXEL_MASK, 0xffffffff);
+	bus_space_write_stream_4(memt, memh, VISFX_PLANE_MASK, 0xffffffff);
+	bus_space_write_stream_4(memt, memh, VISFX_VRAM_WRITE_MODE,
+	    VISFX_WRITE_MODE_PLAIN);
+
+}
+
 void
 ngle_setup_bt458(struct sti_screen *scr)
 {
@@ -1708,6 +1754,33 @@ ngle_hcrx_putcmap(struct sti_screen *scr
 	return 0;
 }
 
+int
+summit_putcmap(struct sti_screen *scr, u_int idx, u_int count)
+{
+	struct sti_rom *rom = scr->scr_rom;
+	bus_space_tag_t memt = rom->memt;
+	bus_space_handle_t memh = rom->regh[0];
+	uint8_t *r, *g, *b;
+
+	r = scr->scr_rcmap + idx;
+	g = scr->scr_gcmap + idx;
+	b = scr->scr_bcmap + idx;
+
+	bus_space_write_stream_4(memt, memh, VISFX_COLOR_INDEX,
+	     0xc0005100 + idx);
+
+	while (count-- != 0) {
+		bus_space_write_stream_4(memt, memh,
+		     VISFX_COLOR_VALUE, (*r << 16) | (*g << 8) | *b);
+		r++, g++, b++;
+	}
+	bus_space_write_stream_4(memt, memh, VISFX_COLOR_MASK, 0xff);
+	bus_space_write_stream_4(memt, memh, 0x80004c, 0xc);
+	bus_space_write_stream_4(memt, memh, 0x800000, 0);
+
+	return 0;
+}
+
 void
 ngle_setup_hw(bus_space_tag_t memt, bus_space_handle_t memh)
 {

Reply via email to