From d7801d853b64e65a184efec07e768954568f17e4 Mon Sep 17 00:00:00 2001 From: nyan Date: Sun, 16 Sep 2001 12:38:39 +0000 Subject: Allocate i/o and memory resources using gdc driver. --- sys/pc98/cbus/gdc.c | 213 ++++++++++++++++++++++++++++++++++++++++++------ sys/pc98/pc98/pc98gdc.c | 213 ++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 378 insertions(+), 48 deletions(-) (limited to 'sys') diff --git a/sys/pc98/cbus/gdc.c b/sys/pc98/cbus/gdc.c index 6547a4e..eb7576a 100644 --- a/sys/pc98/cbus/gdc.c +++ b/sys/pc98/cbus/gdc.c @@ -36,6 +36,9 @@ #include #include #include +#include +#include +#include #include @@ -47,11 +50,11 @@ #include -#include #include #include -#define TEXT_GDC IO_GDC1 /* 0x60 */ +#define TEXT_GDC 0x60 +#define GRAPHIC_GDC 0xa0 #define ROW 25 #define COL 80 @@ -64,15 +67,22 @@ typedef struct gdc_softc { video_adapter_t *adp; + struct resource *res_tgdc, *res_ggdc; + struct resource *res_egc, *res_pegc, *res_grcg, *res_kcg; + struct resource *res_tmem, *res_gmem1, *res_gmem2; } gdc_softc_t; #define GDC_SOFTC(unit) \ ((gdc_softc_t *)devclass_get_softc(gdc_devclass, unit)) +static bus_addr_t gdc_iat[] = {0, 2, 4, 6, 8, 10, 12, 14}; + static devclass_t gdc_devclass; static int gdc_probe_unit(int unit, gdc_softc_t *sc, int flags); static int gdc_attach_unit(int unit, gdc_softc_t *sc, int flags); +static int gdc_alloc_resource(device_t dev); +static int gdc_release_resource(device_t dev); #if FB_INSTALL_CDEV @@ -110,15 +120,25 @@ gdc_identify(driver_t *driver, device_t parent) static int gdcprobe(device_t dev) { - gdc_softc_t *sc; + int error; /* Check isapnp ids */ if (isa_get_vendorid(dev)) return (ENXIO); device_set_desc(dev, "Generic GDC"); - sc = device_get_softc(dev); - return gdc_probe_unit(device_get_unit(dev), sc, device_get_flags(dev)); + + error = gdc_alloc_resource(dev); + if (error) + return (error); + + error = gdc_probe_unit(device_get_unit(dev), + device_get_softc(dev), + device_get_flags(dev)); + + gdc_release_resource(dev); + + return (error); } static int @@ -127,16 +147,26 @@ gdc_attach(device_t dev) gdc_softc_t *sc; int error; - sc = device_get_softc(dev); - error = gdc_attach_unit(device_get_unit(dev), sc, device_get_flags(dev)); + error = gdc_alloc_resource(dev); if (error) + return (error); + + sc = device_get_softc(dev); + error = gdc_attach_unit(device_get_unit(dev), + sc, + device_get_flags(dev)); + if (error) { + gdc_release_resource(dev); return error; + } #ifdef FB_INSTALL_CDEV /* attach a virtual frame buffer device */ error = fb_attach(makedev(0, GDC_MKMINOR(unit)), sc->adp, &gdc_cdevsw); - if (error) + if (error) { + gdc_release_resource(dev); return error; + } #endif /* FB_INSTALL_CDEV */ if (bootverbose) @@ -150,7 +180,6 @@ gdc_probe_unit(int unit, gdc_softc_t *sc, int flags) { video_switch_t *sw; - bzero(sc, sizeof(*sc)); sw = vid_get_switch(DRIVER_NAME); if (sw == NULL) return ENXIO; @@ -168,6 +197,142 @@ gdc_attach_unit(int unit, gdc_softc_t *sc, int flags) return (*sw->init)(unit, sc->adp, flags); } + +static int +gdc_alloc_resource(device_t dev) +{ + int rid; + gdc_softc_t *sc; + + sc = device_get_softc(dev); + + /* TEXT GDC */ + rid = 0; + bus_set_resource(dev, SYS_RES_IOPORT, rid, TEXT_GDC, 1); + sc->res_tgdc = isa_alloc_resourcev(dev, SYS_RES_IOPORT, &rid, + gdc_iat, 8, RF_ACTIVE); + if (sc->res_tgdc == NULL) { + gdc_release_resource(dev); + return (ENXIO); + } + isa_load_resourcev(sc->res_tgdc, gdc_iat, 8); + + /* GRAPHIC GDC */ + rid = 8; + bus_set_resource(dev, SYS_RES_IOPORT, rid, GRAPHIC_GDC, 1); + sc->res_ggdc = isa_alloc_resourcev(dev, SYS_RES_IOPORT, &rid, + gdc_iat, 8, RF_ACTIVE); + if (sc->res_ggdc == NULL) { + gdc_release_resource(dev); + return (ENXIO); + } + isa_load_resourcev(sc->res_ggdc, gdc_iat, 8); + + /* EGC */ + rid = 16; + bus_set_resource(dev, SYS_RES_IOPORT, rid, 0x4a0, 1); + sc->res_egc = isa_alloc_resourcev(dev, SYS_RES_IOPORT, &rid, + gdc_iat, 8, RF_ACTIVE); + if (sc->res_egc == NULL) { + gdc_release_resource(dev); + return (ENXIO); + } + isa_load_resourcev(sc->res_egc, gdc_iat, 8); + + /* PEGC */ + rid = 24; + bus_set_resource(dev, SYS_RES_IOPORT, rid, 0x9a0, 1); + sc->res_pegc = isa_alloc_resourcev(dev, SYS_RES_IOPORT, &rid, + gdc_iat, 8, RF_ACTIVE); + if (sc->res_pegc == NULL) { + gdc_release_resource(dev); + return (ENXIO); + } + isa_load_resourcev(sc->res_pegc, gdc_iat, 8); + + /* CRTC/GRCG */ + rid = 32; + bus_set_resource(dev, SYS_RES_IOPORT, rid, 0x70, 1); + sc->res_grcg = isa_alloc_resourcev(dev, SYS_RES_IOPORT, &rid, + gdc_iat, 8, RF_ACTIVE); + if (sc->res_grcg == NULL) { + gdc_release_resource(dev); + return (ENXIO); + } + isa_load_resourcev(sc->res_grcg, gdc_iat, 8); + + /* KCG */ + rid = 40; + bus_set_resource(dev, SYS_RES_IOPORT, rid, 0xa1, 1); + sc->res_kcg = isa_alloc_resourcev(dev, SYS_RES_IOPORT, &rid, + gdc_iat, 8, RF_ACTIVE); + if (sc->res_kcg == NULL) { + gdc_release_resource(dev); + return (ENXIO); + } + isa_load_resourcev(sc->res_kcg, gdc_iat, 8); + + + /* TEXT Memory */ + rid = 0; + sc->res_tmem = bus_alloc_resource(dev, SYS_RES_MEMORY, &rid, + 0xa0000, 0xa4fff, 0x5000, RF_ACTIVE); + if (sc->res_tmem == NULL) { + gdc_release_resource(dev); + return (ENXIO); + } + + /* GRAPHIC Memory */ + rid = 1; + sc->res_gmem1 = bus_alloc_resource(dev, SYS_RES_MEMORY, &rid, + 0xa8000, 0xbffff, 0x18000, + RF_ACTIVE); + if (sc->res_gmem1 == NULL) { + gdc_release_resource(dev); + return (ENXIO); + } + rid = 2; + sc->res_gmem2 = bus_alloc_resource(dev, SYS_RES_MEMORY, &rid, + 0xe0000, 0xe7fff, 0x8000, + RF_ACTIVE); + if (sc->res_gmem2 == NULL) { + gdc_release_resource(dev); + return (ENXIO); + } + + return (0); +} + +static int +gdc_release_resource(device_t dev) +{ + gdc_softc_t *sc; + + sc = device_get_softc(dev); + + if (sc->res_tgdc) + bus_release_resource(dev, SYS_RES_IOPORT, 0, sc->res_tgdc); + if (sc->res_ggdc) + bus_release_resource(dev, SYS_RES_IOPORT, 8, sc->res_ggdc); + if (sc->res_egc) + bus_release_resource(dev, SYS_RES_IOPORT, 16, sc->res_egc); + if (sc->res_pegc) + bus_release_resource(dev, SYS_RES_IOPORT, 24, sc->res_pegc); + if (sc->res_grcg) + bus_release_resource(dev, SYS_RES_IOPORT, 32, sc->res_grcg); + if (sc->res_kcg) + bus_release_resource(dev, SYS_RES_IOPORT, 40, sc->res_kcg); + + if (sc->res_tmem) + bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->res_tmem); + if (sc->res_gmem1) + bus_release_resource(dev, SYS_RES_MEMORY, 1, sc->res_gmem1); + if (sc->res_gmem2) + bus_release_resource(dev, SYS_RES_MEMORY, 2, sc->res_gmem2); + + return (0); +} + /* cdev driver functions */ #ifdef FB_INSTALL_CDEV @@ -274,7 +439,7 @@ static video_adapter_t adapter_init_value[] = { KD_PC98, "gdc", /* va_type, va_name */ 0, 0, /* va_unit, va_minor */ V_ADP_COLOR | V_ADP_MODECHANGE | V_ADP_BORDER, - IO_GDC1, 16, TEXT_GDC, /* va_io*, XXX */ + TEXT_GDC, 16, TEXT_GDC, /* va_io*, XXX */ VIDEO_BUF_BASE, VIDEO_BUF_SIZE, /* va_mem* */ TEXT_BUF_BASE, TEXT_BUF_SIZE, TEXT_BUF_SIZE, 0, /* va_window* */ 0, 0, /* va_buffer, va_buffer_size */ @@ -496,14 +661,14 @@ probe_adapters(void) static void master_gdc_cmd(unsigned int cmd) { - while ( (inb(IO_GDC1) & 2) != 0); - outb(IO_GDC1+2, cmd); + while ( (inb(TEXT_GDC) & 2) != 0); + outb(TEXT_GDC+2, cmd); } static void master_gdc_prm(unsigned int pmtr) { - while ( (inb(IO_GDC1) & 2) != 0); - outb(IO_GDC1, pmtr); + while ( (inb(TEXT_GDC) & 2) != 0); + outb(TEXT_GDC, pmtr); } static void master_gdc_word_prm(unsigned int wpmtr) @@ -515,27 +680,27 @@ static void master_gdc_word_prm(unsigned int wpmtr) #ifdef LINE30 static void master_gdc_fifo_empty(void) { - while ( (inb(IO_GDC1) & 4) == 0); + while ( (inb(TEXT_GDC) & 4) == 0); } #endif static void master_gdc_wait_vsync(void) { - while ( (inb(IO_GDC1) & 0x20) != 0); - while ( (inb(IO_GDC1) & 0x20) == 0); + while ( (inb(TEXT_GDC) & 0x20) != 0); + while ( (inb(TEXT_GDC) & 0x20) == 0); } static void gdc_cmd(unsigned int cmd) { - while ( (inb(IO_GDC2) & 2) != 0); - outb( IO_GDC2+2, cmd); + while ( (inb(GRAPHIC_GDC) & 2) != 0); + outb( GRAPHIC_GDC+2, cmd); } #ifdef LINE30 static void gdc_prm(unsigned int pmtr) { - while ( (inb(IO_GDC2) & 2) != 0); - outb( IO_GDC2, pmtr); + while ( (inb(GRAPHIC_GDC) & 2) != 0); + outb( GRAPHIC_GDC, pmtr); } static void gdc_word_prm(unsigned int wpmtr) @@ -546,14 +711,14 @@ static void gdc_word_prm(unsigned int wpmtr) static void gdc_fifo_empty(void) { - while ( (inb(IO_GDC2) & 0x04) == 0); + while ( (inb(GRAPHIC_GDC) & 0x04) == 0); } #endif static void gdc_wait_vsync(void) { - while ( (inb(IO_GDC2) & 0x20) != 0); - while ( (inb(IO_GDC2) & 0x20) == 0); + while ( (inb(GRAPHIC_GDC) & 0x20) != 0); + while ( (inb(GRAPHIC_GDC) & 0x20) == 0); } #ifdef LINE30 diff --git a/sys/pc98/pc98/pc98gdc.c b/sys/pc98/pc98/pc98gdc.c index 6547a4e..eb7576a 100644 --- a/sys/pc98/pc98/pc98gdc.c +++ b/sys/pc98/pc98/pc98gdc.c @@ -36,6 +36,9 @@ #include #include #include +#include +#include +#include #include @@ -47,11 +50,11 @@ #include -#include #include #include -#define TEXT_GDC IO_GDC1 /* 0x60 */ +#define TEXT_GDC 0x60 +#define GRAPHIC_GDC 0xa0 #define ROW 25 #define COL 80 @@ -64,15 +67,22 @@ typedef struct gdc_softc { video_adapter_t *adp; + struct resource *res_tgdc, *res_ggdc; + struct resource *res_egc, *res_pegc, *res_grcg, *res_kcg; + struct resource *res_tmem, *res_gmem1, *res_gmem2; } gdc_softc_t; #define GDC_SOFTC(unit) \ ((gdc_softc_t *)devclass_get_softc(gdc_devclass, unit)) +static bus_addr_t gdc_iat[] = {0, 2, 4, 6, 8, 10, 12, 14}; + static devclass_t gdc_devclass; static int gdc_probe_unit(int unit, gdc_softc_t *sc, int flags); static int gdc_attach_unit(int unit, gdc_softc_t *sc, int flags); +static int gdc_alloc_resource(device_t dev); +static int gdc_release_resource(device_t dev); #if FB_INSTALL_CDEV @@ -110,15 +120,25 @@ gdc_identify(driver_t *driver, device_t parent) static int gdcprobe(device_t dev) { - gdc_softc_t *sc; + int error; /* Check isapnp ids */ if (isa_get_vendorid(dev)) return (ENXIO); device_set_desc(dev, "Generic GDC"); - sc = device_get_softc(dev); - return gdc_probe_unit(device_get_unit(dev), sc, device_get_flags(dev)); + + error = gdc_alloc_resource(dev); + if (error) + return (error); + + error = gdc_probe_unit(device_get_unit(dev), + device_get_softc(dev), + device_get_flags(dev)); + + gdc_release_resource(dev); + + return (error); } static int @@ -127,16 +147,26 @@ gdc_attach(device_t dev) gdc_softc_t *sc; int error; - sc = device_get_softc(dev); - error = gdc_attach_unit(device_get_unit(dev), sc, device_get_flags(dev)); + error = gdc_alloc_resource(dev); if (error) + return (error); + + sc = device_get_softc(dev); + error = gdc_attach_unit(device_get_unit(dev), + sc, + device_get_flags(dev)); + if (error) { + gdc_release_resource(dev); return error; + } #ifdef FB_INSTALL_CDEV /* attach a virtual frame buffer device */ error = fb_attach(makedev(0, GDC_MKMINOR(unit)), sc->adp, &gdc_cdevsw); - if (error) + if (error) { + gdc_release_resource(dev); return error; + } #endif /* FB_INSTALL_CDEV */ if (bootverbose) @@ -150,7 +180,6 @@ gdc_probe_unit(int unit, gdc_softc_t *sc, int flags) { video_switch_t *sw; - bzero(sc, sizeof(*sc)); sw = vid_get_switch(DRIVER_NAME); if (sw == NULL) return ENXIO; @@ -168,6 +197,142 @@ gdc_attach_unit(int unit, gdc_softc_t *sc, int flags) return (*sw->init)(unit, sc->adp, flags); } + +static int +gdc_alloc_resource(device_t dev) +{ + int rid; + gdc_softc_t *sc; + + sc = device_get_softc(dev); + + /* TEXT GDC */ + rid = 0; + bus_set_resource(dev, SYS_RES_IOPORT, rid, TEXT_GDC, 1); + sc->res_tgdc = isa_alloc_resourcev(dev, SYS_RES_IOPORT, &rid, + gdc_iat, 8, RF_ACTIVE); + if (sc->res_tgdc == NULL) { + gdc_release_resource(dev); + return (ENXIO); + } + isa_load_resourcev(sc->res_tgdc, gdc_iat, 8); + + /* GRAPHIC GDC */ + rid = 8; + bus_set_resource(dev, SYS_RES_IOPORT, rid, GRAPHIC_GDC, 1); + sc->res_ggdc = isa_alloc_resourcev(dev, SYS_RES_IOPORT, &rid, + gdc_iat, 8, RF_ACTIVE); + if (sc->res_ggdc == NULL) { + gdc_release_resource(dev); + return (ENXIO); + } + isa_load_resourcev(sc->res_ggdc, gdc_iat, 8); + + /* EGC */ + rid = 16; + bus_set_resource(dev, SYS_RES_IOPORT, rid, 0x4a0, 1); + sc->res_egc = isa_alloc_resourcev(dev, SYS_RES_IOPORT, &rid, + gdc_iat, 8, RF_ACTIVE); + if (sc->res_egc == NULL) { + gdc_release_resource(dev); + return (ENXIO); + } + isa_load_resourcev(sc->res_egc, gdc_iat, 8); + + /* PEGC */ + rid = 24; + bus_set_resource(dev, SYS_RES_IOPORT, rid, 0x9a0, 1); + sc->res_pegc = isa_alloc_resourcev(dev, SYS_RES_IOPORT, &rid, + gdc_iat, 8, RF_ACTIVE); + if (sc->res_pegc == NULL) { + gdc_release_resource(dev); + return (ENXIO); + } + isa_load_resourcev(sc->res_pegc, gdc_iat, 8); + + /* CRTC/GRCG */ + rid = 32; + bus_set_resource(dev, SYS_RES_IOPORT, rid, 0x70, 1); + sc->res_grcg = isa_alloc_resourcev(dev, SYS_RES_IOPORT, &rid, + gdc_iat, 8, RF_ACTIVE); + if (sc->res_grcg == NULL) { + gdc_release_resource(dev); + return (ENXIO); + } + isa_load_resourcev(sc->res_grcg, gdc_iat, 8); + + /* KCG */ + rid = 40; + bus_set_resource(dev, SYS_RES_IOPORT, rid, 0xa1, 1); + sc->res_kcg = isa_alloc_resourcev(dev, SYS_RES_IOPORT, &rid, + gdc_iat, 8, RF_ACTIVE); + if (sc->res_kcg == NULL) { + gdc_release_resource(dev); + return (ENXIO); + } + isa_load_resourcev(sc->res_kcg, gdc_iat, 8); + + + /* TEXT Memory */ + rid = 0; + sc->res_tmem = bus_alloc_resource(dev, SYS_RES_MEMORY, &rid, + 0xa0000, 0xa4fff, 0x5000, RF_ACTIVE); + if (sc->res_tmem == NULL) { + gdc_release_resource(dev); + return (ENXIO); + } + + /* GRAPHIC Memory */ + rid = 1; + sc->res_gmem1 = bus_alloc_resource(dev, SYS_RES_MEMORY, &rid, + 0xa8000, 0xbffff, 0x18000, + RF_ACTIVE); + if (sc->res_gmem1 == NULL) { + gdc_release_resource(dev); + return (ENXIO); + } + rid = 2; + sc->res_gmem2 = bus_alloc_resource(dev, SYS_RES_MEMORY, &rid, + 0xe0000, 0xe7fff, 0x8000, + RF_ACTIVE); + if (sc->res_gmem2 == NULL) { + gdc_release_resource(dev); + return (ENXIO); + } + + return (0); +} + +static int +gdc_release_resource(device_t dev) +{ + gdc_softc_t *sc; + + sc = device_get_softc(dev); + + if (sc->res_tgdc) + bus_release_resource(dev, SYS_RES_IOPORT, 0, sc->res_tgdc); + if (sc->res_ggdc) + bus_release_resource(dev, SYS_RES_IOPORT, 8, sc->res_ggdc); + if (sc->res_egc) + bus_release_resource(dev, SYS_RES_IOPORT, 16, sc->res_egc); + if (sc->res_pegc) + bus_release_resource(dev, SYS_RES_IOPORT, 24, sc->res_pegc); + if (sc->res_grcg) + bus_release_resource(dev, SYS_RES_IOPORT, 32, sc->res_grcg); + if (sc->res_kcg) + bus_release_resource(dev, SYS_RES_IOPORT, 40, sc->res_kcg); + + if (sc->res_tmem) + bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->res_tmem); + if (sc->res_gmem1) + bus_release_resource(dev, SYS_RES_MEMORY, 1, sc->res_gmem1); + if (sc->res_gmem2) + bus_release_resource(dev, SYS_RES_MEMORY, 2, sc->res_gmem2); + + return (0); +} + /* cdev driver functions */ #ifdef FB_INSTALL_CDEV @@ -274,7 +439,7 @@ static video_adapter_t adapter_init_value[] = { KD_PC98, "gdc", /* va_type, va_name */ 0, 0, /* va_unit, va_minor */ V_ADP_COLOR | V_ADP_MODECHANGE | V_ADP_BORDER, - IO_GDC1, 16, TEXT_GDC, /* va_io*, XXX */ + TEXT_GDC, 16, TEXT_GDC, /* va_io*, XXX */ VIDEO_BUF_BASE, VIDEO_BUF_SIZE, /* va_mem* */ TEXT_BUF_BASE, TEXT_BUF_SIZE, TEXT_BUF_SIZE, 0, /* va_window* */ 0, 0, /* va_buffer, va_buffer_size */ @@ -496,14 +661,14 @@ probe_adapters(void) static void master_gdc_cmd(unsigned int cmd) { - while ( (inb(IO_GDC1) & 2) != 0); - outb(IO_GDC1+2, cmd); + while ( (inb(TEXT_GDC) & 2) != 0); + outb(TEXT_GDC+2, cmd); } static void master_gdc_prm(unsigned int pmtr) { - while ( (inb(IO_GDC1) & 2) != 0); - outb(IO_GDC1, pmtr); + while ( (inb(TEXT_GDC) & 2) != 0); + outb(TEXT_GDC, pmtr); } static void master_gdc_word_prm(unsigned int wpmtr) @@ -515,27 +680,27 @@ static void master_gdc_word_prm(unsigned int wpmtr) #ifdef LINE30 static void master_gdc_fifo_empty(void) { - while ( (inb(IO_GDC1) & 4) == 0); + while ( (inb(TEXT_GDC) & 4) == 0); } #endif static void master_gdc_wait_vsync(void) { - while ( (inb(IO_GDC1) & 0x20) != 0); - while ( (inb(IO_GDC1) & 0x20) == 0); + while ( (inb(TEXT_GDC) & 0x20) != 0); + while ( (inb(TEXT_GDC) & 0x20) == 0); } static void gdc_cmd(unsigned int cmd) { - while ( (inb(IO_GDC2) & 2) != 0); - outb( IO_GDC2+2, cmd); + while ( (inb(GRAPHIC_GDC) & 2) != 0); + outb( GRAPHIC_GDC+2, cmd); } #ifdef LINE30 static void gdc_prm(unsigned int pmtr) { - while ( (inb(IO_GDC2) & 2) != 0); - outb( IO_GDC2, pmtr); + while ( (inb(GRAPHIC_GDC) & 2) != 0); + outb( GRAPHIC_GDC, pmtr); } static void gdc_word_prm(unsigned int wpmtr) @@ -546,14 +711,14 @@ static void gdc_word_prm(unsigned int wpmtr) static void gdc_fifo_empty(void) { - while ( (inb(IO_GDC2) & 0x04) == 0); + while ( (inb(GRAPHIC_GDC) & 0x04) == 0); } #endif static void gdc_wait_vsync(void) { - while ( (inb(IO_GDC2) & 0x20) != 0); - while ( (inb(IO_GDC2) & 0x20) == 0); + while ( (inb(GRAPHIC_GDC) & 0x20) != 0); + while ( (inb(GRAPHIC_GDC) & 0x20) == 0); } #ifdef LINE30 -- cgit v1.1