Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/sgimips/gio general overhaul, in no particular order:
details: https://anonhg.NetBSD.org/src/rev/ca783d33915a
branches: trunk
changeset: 998993:ca783d33915a
user: macallan <macallan%NetBSD.org@localhost>
date: Fri May 10 23:21:42 2019 +0000
description:
general overhaul, in no particular order:
- use MIPS_PHYS_TO_KSEG1()
- get rid of duplicated rasops_allocattr() and _mapchar() methods
- use rasops_init()
- support fonts that aren't 8x16
- use fastclear mode for rectangle fills
- don't mess with XMAP9's config register
- initialize all 32 XMAP9 mode registers, just in case
- make newport_fill_rectangle() use x, y, wi, he like everyone else
- use R3G3B2 palette in preparation for alpha font support
diffstat:
sys/arch/sgimips/gio/newport.c | 306 +++++++++++++++++++++-------------------
1 files changed, 160 insertions(+), 146 deletions(-)
diffs (truncated from 549 to 300 lines):
diff -r e90350300584 -r ca783d33915a sys/arch/sgimips/gio/newport.c
--- a/sys/arch/sgimips/gio/newport.c Fri May 10 22:54:51 2019 +0000
+++ b/sys/arch/sgimips/gio/newport.c Fri May 10 23:21:42 2019 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: newport.c,v 1.19 2015/08/25 02:09:18 macallan Exp $ */
+/* $NetBSD: newport.c,v 1.20 2019/05/10 23:21:42 macallan Exp $ */
/*
* Copyright (c) 2003 Ilpo Ruotsalainen
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: newport.c,v 1.19 2015/08/25 02:09:18 macallan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: newport.c,v 1.20 2019/05/10 23:21:42 macallan Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -73,7 +73,6 @@
int dc_font;
struct wsscreen_descr *dc_screen;
- struct wsdisplay_font *dc_fontdata;
int dc_mode;
struct vcons_data dc_vd;
};
@@ -87,13 +86,11 @@
/* textops */
static void newport_cursor(void *, int, int, int);
static void newport_cursor_dummy(void *, int, int, int);
-static int newport_mapchar(void *, int, unsigned int *);
static void newport_putchar(void *, int, int, u_int, long);
static void newport_copycols(void *, int, int, int, int);
static void newport_erasecols(void *, int, int, int, long);
static void newport_copyrows(void *, int, int, int);
static void newport_eraserows(void *, int, int, long);
-static int newport_allocattr(void *, int, int, int, long *);
static void newport_init_screen(void *, struct vcons_screen *, int, long *);
@@ -107,22 +104,10 @@
.mmap = newport_mmap,
};
-static struct wsdisplay_emulops newport_textops = {
- .cursor = newport_cursor_dummy,
- .mapchar = newport_mapchar,
- .putchar = newport_putchar,
- .copycols = newport_copycols,
- .erasecols = newport_erasecols,
- .copyrows = newport_copyrows,
- .eraserows = newport_eraserows,
- .allocattr = newport_allocattr
-};
-
static struct wsscreen_descr newport_screen = {
.name = "default",
.ncols = 160,
.nrows = 64,
- .textops = &newport_textops,
.fontwidth = 8,
.fontheight = 16,
.capabilities = WSSCREEN_WSCOLORS | WSSCREEN_HILIT | WSSCREEN_REVERSE
@@ -141,11 +126,7 @@
static struct newport_devconfig newport_console_dc;
static int newport_is_console = 0;
-#define NEWPORT_ATTR_ENCODE(fg,bg) (((fg) << 8) | (bg))
-#define NEWPORT_ATTR_BG(a) ((a) & 0xff)
-#define NEWPORT_ATTR_FG(a) (((a) >> 8) & 0xff)
-
-extern const u_char rasops_cmap[768];
+uint8_t our_cmap[768];
/**** Low-level hardware register groveling functions ****/
static void
@@ -273,9 +254,19 @@
rex3_write(dc, REX3_REG_DCBDATA0, val << 24);
}
+static inline void
+xmap9_wait(struct newport_devconfig *dc)
+{
+ do {} while (xmap9_read(dc, XMAP9_DCBCRS_FIFOAVAIL) == 0);
+}
+
static void
xmap9_write_mode(struct newport_devconfig *dc, uint8_t index, uint32_t mode)
{
+ volatile uint32_t junk;
+ /* wait for FIFO if needed */
+ xmap9_wait(dc);
+
rex3_write(dc, REX3_REG_DCBMODE,
REX3_DCBMODE_DW_4 |
(NEWPORT_DCBADDR_XMAP_BOTH << REX3_DCBMODE_DCBADDR_SHIFT) |
@@ -284,30 +275,40 @@
(2 << REX3_DCBMODE_CSHOLD_SHIFT) |
(1 << REX3_DCBMODE_CSSETUP_SHIFT));
+ xmap9_wait(dc);
+
rex3_write(dc, REX3_REG_DCBDATA0, (index << 24) | mode);
+ junk = rex3_read(dc, REX3_REG_DCBDATA0);
+ __USE(junk);
}
/**** Helper functions ****/
static void
-newport_fill_rectangle(struct newport_devconfig *dc, int x1, int y1, int x2,
- int y2, uint8_t color)
+newport_fill_rectangle(struct newport_devconfig *dc, int x1, int y1, int wi,
+ int he, uint32_t color)
{
+ int x2 = x1 + wi - 1;
+ int y2 = y1 + he - 1;
+
rex3_wait_gfifo(dc);
rex3_write(dc, REX3_REG_DRAWMODE0, REX3_DRAWMODE0_OPCODE_DRAW |
REX3_DRAWMODE0_ADRMODE_BLOCK | REX3_DRAWMODE0_DOSETUP |
REX3_DRAWMODE0_STOPONX | REX3_DRAWMODE0_STOPONY);
+ rex3_write(dc, REX3_REG_CLIPMODE, 0x1e00);
rex3_write(dc, REX3_REG_DRAWMODE1,
- REX3_DRAWMODE1_PLANES_CI |
+ REX3_DRAWMODE1_PLANES_RGB |
REX3_DRAWMODE1_DD_DD8 |
REX3_DRAWMODE1_RWPACKED |
REX3_DRAWMODE1_HD_HD8 |
REX3_DRAWMODE1_COMPARE_LT |
REX3_DRAWMODE1_COMPARE_EQ |
REX3_DRAWMODE1_COMPARE_GT |
+ REX3_DRAWMODE1_RGBMODE |
+ REX3_DRAWMODE1_FASTCLEAR |
REX3_DRAWMODE1_LO_SRC);
rex3_write(dc, REX3_REG_WRMASK, 0xffffffff);
- rex3_write(dc, REX3_REG_COLORI, color);
+ rex3_write(dc, REX3_REG_COLORVRAM, color);
rex3_write(dc, REX3_REG_XYSTARTI, (x1 << REX3_XYSTARTI_XSHIFT) | y1);
rex3_write_go(dc, REX3_REG_XYENDI, (x2 << REX3_XYENDI_XSHIFT) | y2);
@@ -430,7 +431,7 @@
}
static void
-newport_setup_hw(struct newport_devconfig *dc)
+newport_setup_hw(struct newport_devconfig *dc, int depth)
{
uint16_t __unused(curp), tmp;
int i;
@@ -467,25 +468,74 @@
VC2_CONTROL_CURSORFUNC_ENABLE /*|
VC2_CONTROL_CURSOR_ENABLE*/);
+ /* disable all clipping */
+ rex3_write(dc, REX3_REG_CLIPMODE, 0x1e00);
+
/* Setup XMAP9s */
- xmap9_write(dc, XMAP9_DCBCRS_CONFIG,
- XMAP9_CONFIG_8BIT_SYSTEM | XMAP9_CONFIG_RGBMAP_CI);
-
xmap9_write(dc, XMAP9_DCBCRS_CURSOR_CMAP, 0);
- xmap9_write_mode(dc, 0,
- XMAP9_MODE_GAMMA_BYPASS |
- XMAP9_MODE_PIXSIZE_8BPP);
- xmap9_write(dc, XMAP9_DCBCRS_MODE_SELECT, 0);
+ if (depth == 8) {
+
+ for (i = 0; i < 32; i++) {
+ xmap9_write_mode(dc, i,
+ XMAP9_MODE_GAMMA_BYPASS |
+ XMAP9_MODE_PIXSIZE_8BPP | XMAP9_MODE_PIXMODE_RGB2);
+ }
+ xmap9_write(dc, XMAP9_DCBCRS_MODE_SELECT, 0);
+
+ /* Setup REX3 */
+ rex3_write(dc, REX3_REG_XYWIN, (4096 << 16) | 4096);
+ rex3_write(dc, REX3_REG_TOPSCAN, 0x3ff); /* XXX Why? XXX */
+
+ /* Setup CMAP */
+ uint8_t ctmp;
+ for (i = 0; i < 256; i++) {
+ ctmp = i & 0xe0;
+ /*
+ * replicate bits so 0xe0 maps to a red value of 0xff
+ * in order to make white look actually white
+ */
+ ctmp |= (ctmp >> 3) | (ctmp >> 6);
+ our_cmap[i * 3] = ctmp;
+
+ ctmp = (i & 0x1c) << 3;
+ ctmp |= (ctmp >> 3) | (ctmp >> 6);
+ our_cmap[i * 3 + 1] = ctmp;
- /* Setup REX3 */
- rex3_write(dc, REX3_REG_XYWIN, (4096 << 16) | 4096);
- rex3_write(dc, REX3_REG_TOPSCAN, 0x3ff); /* XXX Why? XXX */
+ ctmp = (i & 0x03) << 6;
+ ctmp |= ctmp >> 2;
+ ctmp |= ctmp >> 4;
+ our_cmap[i * 3 + 2] = ctmp;
+
+ newport_cmap_setrgb(dc, i, our_cmap[i * 3],
+ our_cmap[i * 3 + 1], our_cmap[i * 3 + 2]);
+ }
+ /* Write a ramp into RGB2 cmap */
+ for (i = 0; i < 256; i++)
+ newport_cmap_setrgb(dc, 0x1f00 + i, i, i, i);
+ } else {
+ uint8_t dcbcfg;
- /* Setup CMAP */
- for (i = 0; i < 256; i++)
- newport_cmap_setrgb(dc, i, rasops_cmap[i * 3],
- rasops_cmap[i * 3 + 1], rasops_cmap[i * 3 + 2]);
+ dcbcfg = xmap9_read(dc, XMAP9_DCBCRS_CONFIG);
+ aprint_debug("dcbcfg: %02x\n", dcbcfg);
+ dcbcfg &= 0x3c;
+ xmap9_write(dc, XMAP9_DCBCRS_CONFIG, dcbcfg | XMAP9_CONFIG_RGBMAP_2);
+
+ for (i = 0; i < 32; i++) {
+ xmap9_write_mode(dc, i,
+ XMAP9_MODE_GAMMA_BYPASS |
+ XMAP9_MODE_PIXSIZE_24BPP |
+ XMAP9_MODE_PIXMODE_RGB2);
+ }
+
+ /* Setup REX3 */
+ rex3_write(dc, REX3_REG_XYWIN, (4096 << 16) | 4096);
+ rex3_write(dc, REX3_REG_TOPSCAN, 0x3ff); /* XXX Why? XXX */
+
+ /* Write a ramp into RGB2 cmap */
+ for (i = 0; i < 256; i++)
+ newport_cmap_setrgb(dc, 0x1f00 + i, i, i, i);
+ }
}
/**** Attach routines ****/
@@ -504,11 +554,11 @@
return 1;
if (platform.badaddr(
- (void *)(ga->ga_ioh + NEWPORT_REX3_OFFSET + REX3_REG_XSTARTI),
+ (void *)MIPS_PHYS_TO_KSEG1(ga->ga_addr + NEWPORT_REX3_OFFSET + REX3_REG_XSTARTI),
sizeof(uint32_t)))
return 0;
if (platform.badaddr(
- (void *)(ga->ga_ioh + NEWPORT_REX3_OFFSET + REX3_REG_XSTART),
+ (void *)MIPS_PHYS_TO_KSEG1(ga->ga_addr + NEWPORT_REX3_OFFSET + REX3_REG_XSTART),
sizeof(uint32_t)))
return 0;
@@ -532,21 +582,18 @@
dc->dc_st = ga->ga_iot;
dc->dc_sh = ga->ga_ioh;
- wsfont_init();
-
- dc->dc_font = wsfont_find(NULL, 8, 16, 0, WSDISPLAY_FONTORDER_L2R,
- WSDISPLAY_FONTORDER_L2R, WSFONT_FIND_BITMAP);
- if (dc->dc_font < 0)
- panic("newport_attach_common: no suitable fonts");
-
- if (wsfont_lock(dc->dc_font, &dc->dc_fontdata))
- panic("newport_attach_common: unable to lock font data");
-
- newport_setup_hw(dc);
+ newport_setup_hw(dc, 8);
newport_get_resolution(dc);
newport_fill_rectangle(dc, 0, 0, dc->dc_xres, dc->dc_yres, 0);
+
+#ifdef NEWPORT_DEBUG
+ int i;
+ for (i = 0; i < 256; i++)
+ newport_fill_rectangle(dc, 10, i * 3 + 10, 500, 2, i);
+ delay(10000000);
+#endif
dc->dc_screen = &newport_screen;
dc->dc_mode = WSDISPLAYIO_MODE_EMUL;
@@ -588,8 +635,6 @@
1, &defattr);
sc->sc_dc->dc_screen->textops =
&newport_console_screen.scr_ri.ri_ops;
- memcpy(&newport_textops, &newport_console_screen.scr_ri.ri_ops,
- sizeof(struct wsdisplay_emulops));
vcons_replay_msgbuf(&newport_console_screen);
}
wa.scrdata = &newport_screenlist;
@@ -603,7 +648,7 @@
newport_cnattach(struct gio_attach_args *ga)
{
struct rasops_info *ri = &newport_console_screen.scr_ri;
- long defattr = NEWPORT_ATTR_ENCODE(WSCOL_WHITE, WSCOL_BLACK);
+ long defattr = 0x000f0000;
if (!newport_match(NULL, NULL, ga)) {
Home |
Main Index |
Thread Index |
Old Index