Module Name: src Committed By: martin Date: Tue Jul 8 13:35:43 UTC 2014
Modified Files: src/sys/arch/playstation2/ee: gsfb.c Log Message: Split softc, fix wsfont_find call. To generate a diff of this commit: cvs rdiff -u -r1.21 -r1.22 src/sys/arch/playstation2/ee/gsfb.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/arch/playstation2/ee/gsfb.c diff -u src/sys/arch/playstation2/ee/gsfb.c:1.21 src/sys/arch/playstation2/ee/gsfb.c:1.22 --- src/sys/arch/playstation2/ee/gsfb.c:1.21 Mon Mar 31 11:25:49 2014 +++ src/sys/arch/playstation2/ee/gsfb.c Tue Jul 8 13:35:43 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: gsfb.c,v 1.21 2014/03/31 11:25:49 martin Exp $ */ +/* $NetBSD: gsfb.c,v 1.22 2014/07/08 13:35:43 martin Exp $ */ /*- * Copyright (c) 2001 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: gsfb.c,v 1.21 2014/03/31 11:25:49 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: gsfb.c,v 1.22 2014/07/08 13:35:43 martin Exp $"); #include "debug_playstation2.h" @@ -59,13 +59,15 @@ __KERNEL_RCSID(0, "$NetBSD: gsfb.c,v 1.2 #define STATIC static #endif -STATIC struct gsfb { - int initialized; - int attached; - int is_console; - const struct wsscreen_descr *screen; - struct wsdisplay_font *font; -} gsfb; +struct gsfb_softc { + device_t sc_dev; + const struct wsscreen_descr *sc_screen; + struct wsdisplay_font *sc_font; + bool sc_is_console; +}; + +static int gsfb_is_console; +static struct gsfb_softc gsfb_console_softc; STATIC void gsfb_dma_kick(paddr_t, size_t); STATIC void gsfb_font_expand_psmct32(const struct wsdisplay_font *, u_int, @@ -177,14 +179,14 @@ STATIC const struct _gsfb_debug_window { STATIC char _gsfb_debug_buf[80 * 2]; #endif /* GSFB_DEBUG_MONITOR */ -STATIC int gsfb_match(struct device *, struct cfdata *, void *); -STATIC void gsfb_attach(struct device *, struct device *, void *); +STATIC int gsfb_match(device_t, cfdata_t, void *); +STATIC void gsfb_attach(device_t, device_t, void *); -CFATTACH_DECL(gsfb, sizeof(struct device), +CFATTACH_DECL_NEW(gsfb, sizeof(struct gsfb_softc), gsfb_match, gsfb_attach, NULL, NULL); STATIC void gsfb_hwinit(void); -STATIC int gsfb_swinit(void); +STATIC int gsfb_swinit(struct gsfb_softc*); /* console */ void gsfbcnprobe(struct consdev *); @@ -265,7 +267,7 @@ struct wsdisplay_accessops _gsfb_accesso }; int -gsfb_match(struct device *parent, struct cfdata *cf, void *aux) +gsfb_match(device_t parent, cfdata_t cf, void *aux) { extern struct cfdriver gsfb_cd; struct mainbus_attach_args *ma = aux; @@ -273,24 +275,30 @@ gsfb_match(struct device *parent, struct if (strcmp(ma->ma_name, gsfb_cd.cd_name) != 0) return (0); - return (!gsfb.attached); + return 1; } void -gsfb_attach(struct device *parent, struct device *self, void *aux) +gsfb_attach(device_t parent, device_t self, void *aux) { struct wsemuldisplaydev_attach_args wa; + struct gsfb_softc *sc = device_private(self); + + if (gsfb_is_console) { + memcpy(sc, &gsfb_console_softc, sizeof(gsfb_console_softc)); + sc->sc_is_console = true; + } + sc->sc_dev = self; - gsfb.attached = 1; - if (!gsfb.is_console && gsfb_swinit() != 0) + if (!sc->sc_is_console && !gsfb_swinit(sc) != 0) return; printf("\n"); - wa.console = gsfb.is_console; + wa.console = sc->sc_is_console; wa.scrdata = &_gsfb_screen_list; wa.accessops = &_gsfb_accessops; - wa.accesscookie = &gsfb; + wa.accesscookie = sc; config_found(self, &wa, wsdisplaydevprint); } @@ -312,10 +320,10 @@ gsfbcninit(struct consdev *cndev) u_int32_t *buf = (void *)MIPS_PHYS_TO_KSEG1(paddr); long defattr = ATTR_BG_SET(WS_DEFAULT_BG) | ATTR_FG_SET(WS_DEFAULT_FG); - gsfb.is_console = 1; + gsfb_is_console = 1; gsfb_hwinit(); - gsfb_swinit(); + gsfb_swinit(&gsfb_console_softc); /* Set the screen to the default background color at boot */ buf[28] = gsfb_ansi_psmct32[ATTR_BG_GET(defattr)]; @@ -332,7 +340,8 @@ gsfbcninit(struct consdev *cndev) } #endif /* GSFB_DEBUG_MONITOR */ - wsdisplay_cnattach(&_gsfb_std_screen, &gsfb, 0, 0, defattr); + wsdisplay_cnattach(&_gsfb_std_screen, &gsfb_console_softc, 0, 0, + defattr); } void @@ -355,21 +364,20 @@ gsfb_hwinit(void) } int -gsfb_swinit(void) +gsfb_swinit(struct gsfb_softc *sc) { int font; wsfont_init(); - font = wsfont_find(NULL, 8, 16, 0, WSDISPLAY_FONTORDER_L2R, - WSDISPLAY_FONTORDER_L2R); + font = wsfont_find(NULL, 8, 16, 0, WSDISPLAY_FONTORDER_L2R, + WSDISPLAY_FONTORDER_L2R, WSFONT_FIND_BITMAP); if (font < 0) return (1); - if (wsfont_lock(font, &gsfb.font)) + if (wsfont_lock(font, &sc->sc_font)) return (1); - gsfb.screen = &_gsfb_std_screen; - gsfb.initialized = 1; + sc->sc_screen = &_gsfb_std_screen; return (0); } @@ -380,9 +388,10 @@ gsfb_swinit(void) void _gsfb_cursor(void *cookie, int on, int row, int col) { + struct gsfb_softc *sc = cookie; paddr_t paddr = MIPS_KSEG0_TO_PHYS(gsfb_cursor_cmd); u_int32_t *buf = (void *)MIPS_PHYS_TO_KSEG1(paddr); - struct wsdisplay_font *font = gsfb.font; + struct wsdisplay_font *font = sc->sc_font; gsfb_set_cursor_pos(buf, col, row, font->fontwidth, font->fontheight); @@ -402,7 +411,8 @@ gsfb_set_cursor_pos(u_int32_t *p, int x, int _gsfb_mapchar(void *cookie, int c, unsigned int *cp) { - struct wsdisplay_font *font = gsfb.font; + struct gsfb_softc *sc = cookie; + struct wsdisplay_font *font = sc->sc_font; if (font->encoding != WSDISPLAY_FONTENC_ISO) if ((c = wsfont_map_unichar(font, c)) < 0) @@ -422,9 +432,10 @@ _gsfb_mapchar(void *cookie, int c, unsig void _gsfb_putchar(void *cookie, int row, int col, u_int uc, long attr) { + struct gsfb_softc *sc = cookie; paddr_t paddr = MIPS_KSEG0_TO_PHYS(gsfb_load_cmd_8x16_psmct32); u_int32_t *buf = (void *)MIPS_PHYS_TO_KSEG1(paddr); - struct wsdisplay_font *font = gsfb.font; + struct wsdisplay_font *font = sc->sc_font; /* copy font data to DMA region */ gsfb_font_expand_psmct32(font, uc, attr, &buf[FONT_SCRATCH_BASE]); @@ -439,10 +450,11 @@ _gsfb_putchar(void *cookie, int row, int void _gsfb_copycols(void *cookie, int row, int srccol, int dstcol, int ncols) { + struct gsfb_softc *sc = cookie; paddr_t paddr = MIPS_KSEG0_TO_PHYS(gsfb_copy_cmd_8x16); u_int32_t *cmd = (void *)MIPS_PHYS_TO_KSEG1(paddr); - int y = gsfb.font->fontheight * row; - int w = gsfb.font->fontwidth; + int y = sc->sc_font->fontheight * row; + int w = sc->sc_font->fontwidth; int i; if (dstcol > srccol) { @@ -470,10 +482,11 @@ _gsfb_erasecols(void *cookie, int row, i void _gsfb_copyrows(void *cookie, int src, int dst, int num) { + struct gsfb_softc *sc = cookie; paddr_t paddr = MIPS_KSEG0_TO_PHYS(gsfb_scroll_cmd_640x16); u_int32_t *cmd = (void *)MIPS_PHYS_TO_KSEG1(paddr); int i; - int h = gsfb.font->fontheight; + int h = sc->sc_font->fontheight; if (dst > src) { for (i = num - 1; i >= 0; i--) { @@ -491,10 +504,11 @@ _gsfb_copyrows(void *cookie, int src, in void _gsfb_eraserows(void *cookie, int row, int nrow, long attr) { + struct gsfb_softc *sc = cookie; int i, j; for (j = 0; j < nrow; j++) - for (i = 0; i < gsfb.screen->ncols; i++) + for (i = 0; i < sc->sc_screen->ncols; i++) _gsfb_putchar(cookie, row + j, i, ' ', attr); }