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)
{