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