Module Name: src Committed By: macallan Date: Wed Aug 15 17:02:41 UTC 2012
Modified Files: src/sys/dev/pci: machfb.c Log Message: some cleanup: - get rid of some redundant variables ( sc_*phys and sc_*base were essentially the same ) - we don't access video memory directly anymore, so: * no more need for byte order tests * don't map video memory if we have a MMIO register aperture * get rid of various bits of support code dealing with video memory access - use MMIO register aperture if available, turn off register blocks in the main aperture if not in use, to avoid overlap with video memory on 8MB cards - don't scissor off access to off-screen memory. How the hell did this work on Rage II? Apparently Rage XL treats the scissor registers slightly different. Now this works properly on 8MB and Rage XL boards like Sun's PGX64. To generate a diff of this commit: cvs rdiff -u -r1.80 -r1.81 src/sys/dev/pci/machfb.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/pci/machfb.c diff -u src/sys/dev/pci/machfb.c:1.80 src/sys/dev/pci/machfb.c:1.81 --- src/sys/dev/pci/machfb.c:1.80 Fri Aug 3 01:23:32 2012 +++ src/sys/dev/pci/machfb.c Wed Aug 15 17:02:41 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: machfb.c,v 1.80 2012/08/03 01:23:32 macallan Exp $ */ +/* $NetBSD: machfb.c,v 1.81 2012/08/15 17:02:41 macallan Exp $ */ /* * Copyright (c) 2002 Bang Jun-Young @@ -34,7 +34,7 @@ #include <sys/cdefs.h> __KERNEL_RCSID(0, - "$NetBSD: machfb.c,v 1.80 2012/08/03 01:23:32 macallan Exp $"); + "$NetBSD: machfb.c,v 1.81 2012/08/15 17:02:41 macallan Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -74,13 +74,12 @@ __KERNEL_RCSID(0, #include "opt_machfb.h" #define MACH64_REG_SIZE 1024 -#define MACH64_REG_OFF 0x7ffc00 +#define MACH64_REG_OFF 0x7ff800 #define NBARS 3 /* number of Mach64 PCI BARs */ struct vga_bar { bus_addr_t vb_base; - pcireg_t vb_busaddr; bus_size_t vb_size; pcireg_t vb_type; int vb_flags; @@ -99,23 +98,22 @@ struct mach64_softc { #define sc_aperbase sc_bars[0].vb_base #define sc_apersize sc_bars[0].vb_size -#define sc_aperphys sc_bars[0].vb_busaddr #define sc_iobase sc_bars[1].vb_base #define sc_iosize sc_bars[1].vb_size #define sc_regbase sc_bars[2].vb_base #define sc_regsize sc_bars[2].vb_size -#define sc_regphys sc_bars[2].vb_busaddr bus_space_tag_t sc_regt; bus_space_tag_t sc_memt; bus_space_tag_t sc_iot; bus_space_handle_t sc_regh; bus_space_handle_t sc_memh; +#if 0 void *sc_aperture; /* mapped aperture vaddr */ void *sc_registers; /* mapped registers vaddr */ - +#endif uint32_t sc_nbus, sc_ndev, sc_nfunc; size_t memsize; int memtype; @@ -295,7 +293,6 @@ static void mach64_feed_bytes(struct mac static void mach64_showpal(struct mach64_softc *); #endif -static void set_address(struct rasops_info *, void *); static void machfb_blank(struct mach64_softc *, int); static int machfb_drm_print(void *, const char *); @@ -412,19 +409,19 @@ static struct fbdriver machfb_fbdriver = static inline uint32_t regr(struct mach64_softc *sc, uint32_t index) { - return bus_space_read_4(sc->sc_regt, sc->sc_regh, index); + return bus_space_read_4(sc->sc_regt, sc->sc_regh, index + 0x400); } static inline uint8_t regrb(struct mach64_softc *sc, uint32_t index) { - return bus_space_read_1(sc->sc_regt, sc->sc_regh, index); + return bus_space_read_1(sc->sc_regt, sc->sc_regh, index + 0x400); } static inline void regw(struct mach64_softc *sc, uint32_t index, uint32_t data) { - bus_space_write_4(sc->sc_regt, sc->sc_regh, index, data); + bus_space_write_4(sc->sc_regt, sc->sc_regh, index + 0x400, data); bus_space_barrier(sc->sc_regt, sc->sc_regh, index, 4, BUS_SPACE_BARRIER_WRITE); } @@ -432,16 +429,16 @@ regw(struct mach64_softc *sc, uint32_t i static inline void regws(struct mach64_softc *sc, uint32_t index, uint32_t data) { - bus_space_write_stream_4(sc->sc_regt, sc->sc_regh, index, data); - bus_space_barrier(sc->sc_regt, sc->sc_regh, index, 4, + bus_space_write_stream_4(sc->sc_regt, sc->sc_regh, index + 0x400, data); + bus_space_barrier(sc->sc_regt, sc->sc_regh, index + 0x400, 4, BUS_SPACE_BARRIER_WRITE); } static inline void regwb(struct mach64_softc *sc, uint32_t index, uint8_t data) { - bus_space_write_1(sc->sc_regt, sc->sc_regh, index, data); - bus_space_barrier(sc->sc_regt, sc->sc_regh, index, 1, + bus_space_write_1(sc->sc_regt, sc->sc_regh, index + 0x400, data); + bus_space_barrier(sc->sc_regt, sc->sc_regh, index + 0x400, 1, BUS_SPACE_BARRIER_WRITE); } @@ -524,6 +521,7 @@ mach64_attach(device_t parent, device_t pcireg_t screg; uint32_t reg; const pcireg_t enables = PCI_COMMAND_MEM_ENABLE; + int use_mmio = FALSE; sc->sc_dev = self; sc->sc_pc = pa->pa_pc; @@ -557,8 +555,6 @@ mach64_attach(device_t parent, device_t (void)pci_mapreg_info(sc->sc_pc, sc->sc_pcitag, reg, sc->sc_bars[bar].vb_type, &sc->sc_bars[bar].vb_base, &sc->sc_bars[bar].vb_size, &sc->sc_bars[bar].vb_flags); - sc->sc_bars[bar].vb_busaddr = pci_conf_read(sc->sc_pc, - sc->sc_pcitag, reg) & 0xfffffff0; } aprint_debug_dev(sc->sc_dev, "aperture size %08x\n", (uint32_t)sc->sc_apersize); @@ -569,31 +565,44 @@ mach64_attach(device_t parent, device_t &sc->sc_rom.vb_size, &sc->sc_rom.vb_flags); sc->sc_memt = pa->pa_memt; - if (bus_space_map(sc->sc_memt, sc->sc_aperbase, sc->sc_apersize, - BUS_SPACE_MAP_LINEAR, &sc->sc_memh)) { - panic("%s: failed to map aperture", device_xname(sc->sc_dev)); - } - sc->sc_aperture = (void *)bus_space_vaddr(sc->sc_memt, sc->sc_memh); + /* use MMIO register aperture if available */ + if ((sc->sc_regbase != 0) && (sc->sc_regbase != 0xffffffff)) { + if (pci_mapreg_map(pa, MACH64_BAR_MMIO, PCI_MAPREG_TYPE_MEM, 0, + &sc->sc_regt, &sc->sc_regh, &sc->sc_regbase, + &sc->sc_regsize) == 0) { + + /* + * the MMIO aperture maps both 1KB register blocks, but + * all register offsets are relative to the 2nd one so + * for now fix this up in MACH64_REG_OFF and the access + * functions + */ + aprint_normal_dev(sc->sc_dev, "using MMIO aperture\n"); + use_mmio = TRUE; + } + } + if (!use_mmio) { + if (bus_space_map(sc->sc_memt, sc->sc_aperbase, sc->sc_apersize, + BUS_SPACE_MAP_LINEAR, &sc->sc_memh)) { + panic("%s: failed to map aperture", + device_xname(sc->sc_dev)); + } - /* If the BAR was never mapped, fix it up in MMIO. */ - if(sc->sc_regsize == 0) { + /* If the BAR was never mapped, fix it up in MMIO. */ sc->sc_regsize = MACH64_REG_SIZE; sc->sc_regbase = sc->sc_aperbase + MACH64_REG_OFF; - sc->sc_regphys = sc->sc_aperphys + MACH64_REG_OFF; + sc->sc_regt = sc->sc_memt; + bus_space_subregion(sc->sc_regt, sc->sc_memh, MACH64_REG_OFF, + sc->sc_regsize, &sc->sc_regh); } - sc->sc_regt = sc->sc_memt; - bus_space_subregion(sc->sc_regt, sc->sc_memh, MACH64_REG_OFF, - sc->sc_regsize, &sc->sc_regh); - sc->sc_registers = (char *)sc->sc_aperture + 0x7ffc00; - mach64_init(sc); aprint_normal_dev(sc->sc_dev, "%d MB aperture at 0x%08x, %d KB registers at 0x%08x\n", (u_int)(sc->sc_apersize / (1024 * 1024)), - (u_int)sc->sc_aperphys, (u_int)(sc->sc_regsize / 1024), - (u_int)sc->sc_regphys); + (u_int)sc->sc_aperbase, (u_int)(sc->sc_regsize / 1024), + (u_int)sc->sc_regbase); printf("%s: %d KB ROM at 0x%08x\n", device_xname(sc->sc_dev), (int)sc->sc_rom.vb_size >> 10, (uint32_t)sc->sc_rom.vb_base); @@ -639,9 +648,7 @@ mach64_attach(device_t parent, device_t memtype_names = is_gx ? mach64_gx_memtype_names : mach64_memtype_names; sc->memsize = mach64_get_memsize(sc); - if (sc->memsize == 8192) - /* The last page is used as register aperture. */ - sc->memsize -= 4; + if(is_gx) sc->memtype = (regr(sc, CONFIG_STAT0) >> 3) & 0x07; else @@ -817,7 +824,18 @@ mach64_attach(device_t parent, device_t aa.accesscookie = &sc->vd; config_found(self, &aa, wsemuldisplaydevprint); - + if (use_mmio) { + /* + * Now that we took over, turn off the aperture registers if we + * don't use them. Can't do this earlier since on some hardware + * we use firmware calls as early console output which may in + * turn try to access these registers. + */ + reg = regr(sc, BUS_CNTL); + aprint_debug_dev(sc->sc_dev, "BUS_CNTL: %08x\n", reg); + reg |= BUS_APER_REG_DIS; + regw(sc, BUS_CNTL, reg); + } config_found_ia(self, "drm", aux, machfb_drm_print); } @@ -846,7 +864,6 @@ mach64_init_screen(void *cookie, struct ri->ri_flg = RI_CENTER; if (ri->ri_depth == 8) ri->ri_flg |= RI_8BIT_IS_RGB | RI_ENABLE_ALPHA; - set_address(ri, sc->sc_aperture); #ifdef VCONS_DRAW_INTR scr->scr_flags |= VCONS_DONT_READ; @@ -882,31 +899,6 @@ mach64_init_screen(void *cookie, struct static void mach64_init(struct mach64_softc *sc) { - uint32_t *p32, saved_value; - uint8_t *p; - int need_swap; - - /* - * Test whether the aperture is byte swapped or not - */ - p32 = (uint32_t*)sc->sc_aperture; - saved_value = *p32; - p = (uint8_t*)(u_long)sc->sc_aperture; - *p32 = 0x12345678; - if (p[0] == 0x12 && p[1] == 0x34 && p[2] == 0x56 && p[3] == 0x78) - need_swap = 0; - else - need_swap = 1; - if (need_swap) { - sc->sc_aperture = (char *)sc->sc_aperture + 0x800000; -#if 0 - /* what the fsck is this for? */ - sc->sc_aperbase += 0x800000; - sc->sc_apersize -= 0x800000; -#endif - } - *p32 = saved_value; - sc->sc_blanked = 0; } @@ -1142,7 +1134,7 @@ mach64_init_engine(struct mach64_softc * regw(sc, SC_LEFT, 0); regw(sc, SC_TOP, 0); - regw(sc, SC_BOTTOM, sc->sc_my_mode->vdisplay - 1); + regw(sc, SC_BOTTOM, 0x3fff); regw(sc, SC_RIGHT, pitch_value - 1); regw(sc, DP_BKGD_CLR, WS_DEFAULT_BG); @@ -1951,35 +1943,35 @@ mach64_mmap(void *v, void *vs, off_t off } reg = (pci_conf_read(sc->sc_pc, sc->sc_pcitag, 0x18) & 0xffffff00); - if (reg != sc->sc_regphys) { + if (reg != sc->sc_regbase) { #ifdef DIAGNOSTIC printf("%s: BAR 0x18 changed! (%x %x)\n", - device_xname(sc->sc_dev), (uint32_t)sc->sc_regphys, + device_xname(sc->sc_dev), (uint32_t)sc->sc_regbase, (uint32_t)reg); #endif - sc->sc_regphys = reg; + sc->sc_regbase = reg; } reg = (pci_conf_read(sc->sc_pc, sc->sc_pcitag, 0x10) & 0xffffff00); - if (reg != sc->sc_aperphys) { + if (reg != sc->sc_aperbase) { #ifdef DIAGNOSTIC printf("%s: BAR 0x10 changed! (%x %x)\n", - device_xname(sc->sc_dev), (uint32_t)sc->sc_aperphys, + device_xname(sc->sc_dev), (uint32_t)sc->sc_aperbase, (uint32_t)reg); #endif - sc->sc_aperphys = reg; + sc->sc_aperbase = reg; } - if ((offset >= sc->sc_aperphys) && - (offset < (sc->sc_aperphys + sc->sc_apersize))) { + if ((offset >= sc->sc_aperbase) && + (offset < (sc->sc_aperbase + sc->sc_apersize))) { pa = bus_space_mmap(sc->sc_memt, offset, 0, prot, BUS_SPACE_MAP_LINEAR); return pa; } - if ((offset >= sc->sc_regphys) && - (offset < (sc->sc_regphys + sc->sc_regsize))) { - pa = bus_space_mmap(sc->sc_memt, offset, 0, prot, + if ((offset >= sc->sc_regbase) && + (offset < (sc->sc_regbase + sc->sc_regsize))) { + pa = bus_space_mmap(sc->sc_regt, offset, 0, prot, BUS_SPACE_MAP_LINEAR); return pa; } @@ -1995,24 +1987,13 @@ mach64_mmap(void *v, void *vs, off_t off if ((offset >= PCI_MAGIC_IO_RANGE) && (offset <= PCI_MAGIC_IO_RANGE + 0x10000)) { return bus_space_mmap(sc->sc_iot, offset - PCI_MAGIC_IO_RANGE, - 0, prot, BUS_SPACE_MAP_LINEAR); + 0, prot, 0); } #endif return -1; } -/* set ri->ri_bits according to fb, ri_xorigin and ri_yorigin */ -static void -set_address(struct rasops_info *ri, void *fb) -{ -#ifdef notdef - printf(" %d %d %d\n", ri->ri_xorigin, ri->ri_yorigin, ri->ri_stride); -#endif - ri->ri_bits = (void *)((char *)fb + ri->ri_stride * ri->ri_yorigin + - ri->ri_xorigin); -} - #if 0 static int mach64_load_font(void *v, void *cookie, struct wsdisplay_font *data) @@ -2074,7 +2055,6 @@ machfb_fbattach(struct mach64_softc *sc) fb->fb_type.fb_width = sc->virt_x; fb->fb_type.fb_height = sc->virt_y; - fb->fb_pixels = sc->sc_aperture; fb_attach(fb, sc->sc_console); }