diff options
Diffstat (limited to 'sys/dev/puc/puc_pci.c')
-rw-r--r-- | sys/dev/puc/puc_pci.c | 219 |
1 files changed, 35 insertions, 184 deletions
diff --git a/sys/dev/puc/puc_pci.c b/sys/dev/puc/puc_pci.c index 2be23cf..5a458cc 100644 --- a/sys/dev/puc/puc_pci.c +++ b/sys/dev/puc/puc_pci.c @@ -60,8 +60,6 @@ #include <sys/cdefs.h> __FBSDID("$FreeBSD$"); -#include "opt_puc.h" - #include <sys/param.h> #include <sys/systm.h> #include <sys/kernel.h> @@ -77,215 +75,68 @@ __FBSDID("$FreeBSD$"); #include <dev/pci/pcireg.h> #include <dev/pci/pcivar.h> -#define PUC_ENTRAILS 1 -#include <dev/puc/pucvar.h> - -extern const struct puc_device_description puc_devices[]; - -int puc_config_win877(struct puc_softc *); +#include <dev/puc/puc_bfe.h> +#include <dev/puc/puc_cfg.h> -static const struct puc_device_description * -puc_find_description(uint32_t vend, uint32_t prod, uint32_t svend, - uint32_t sprod) +static const struct puc_cfg * +puc_pci_match(device_t dev, const struct puc_cfg *desc) { - int i; - -#define checkreg(val, index) \ - (((val) & puc_devices[i].rmask[(index)]) == puc_devices[i].rval[(index)]) - - for (i = 0; puc_devices[i].name != NULL; i++) { - if (checkreg(vend, PUC_REG_VEND) && - checkreg(prod, PUC_REG_PROD) && - checkreg(svend, PUC_REG_SVEND) && - checkreg(sprod, PUC_REG_SPROD)) - return (&puc_devices[i]); - } - -#undef checkreg - - return (NULL); + uint16_t device, subdev, subven, vendor; + + vendor = pci_get_vendor(dev); + device = pci_get_device(dev); + while (desc->vendor != 0xffff && + (desc->vendor != vendor || desc->device != device)) + desc++; + if (desc->vendor == 0xffff) + return (NULL); + if (desc->subvendor == 0xffff) + return (desc); + subven = pci_get_subvendor(dev); + subdev = pci_get_subdevice(dev); + while (desc->vendor == vendor && desc->device == device && + (desc->subvendor != subven || desc->subdevice != subdev)) + desc++; + return ((desc->vendor == vendor && desc->device == device) + ? desc : NULL); } static int puc_pci_probe(device_t dev) { - uint32_t v1, v2, d1, d2; - const struct puc_device_description *desc; + const struct puc_cfg *desc; if ((pci_read_config(dev, PCIR_HDRTYPE, 1) & PCIM_HDRTYPE) != 0) return (ENXIO); - v1 = pci_read_config(dev, PCIR_VENDOR, 2); - d1 = pci_read_config(dev, PCIR_DEVICE, 2); - v2 = pci_read_config(dev, PCIR_SUBVEND_0, 2); - d2 = pci_read_config(dev, PCIR_SUBDEV_0, 2); - - desc = puc_find_description(v1, d1, v2, d2); + desc = puc_pci_match(dev, puc_pci_devices); if (desc == NULL) return (ENXIO); - device_set_desc(dev, desc->name); - return (BUS_PROBE_DEFAULT); -} - -static int -puc_pci_attach(device_t dev) -{ - uint32_t v1, v2, d1, d2; - - v1 = pci_read_config(dev, PCIR_VENDOR, 2); - d1 = pci_read_config(dev, PCIR_DEVICE, 2); - v2 = pci_read_config(dev, PCIR_SUBVEND_0, 2); - d2 = pci_read_config(dev, PCIR_SUBDEV_0, 2); - return (puc_attach(dev, puc_find_description(v1, d1, v2, d2))); + return (puc_bfe_probe(dev, desc)); } static device_method_t puc_pci_methods[] = { /* Device interface */ DEVMETHOD(device_probe, puc_pci_probe), - DEVMETHOD(device_attach, puc_pci_attach), - - DEVMETHOD(bus_alloc_resource, puc_alloc_resource), - DEVMETHOD(bus_release_resource, puc_release_resource), - DEVMETHOD(bus_get_resource, puc_get_resource), - DEVMETHOD(bus_read_ivar, puc_read_ivar), - DEVMETHOD(bus_setup_intr, puc_setup_intr), - DEVMETHOD(bus_teardown_intr, puc_teardown_intr), + DEVMETHOD(device_attach, puc_bfe_attach), + DEVMETHOD(device_detach, puc_bfe_detach), + + DEVMETHOD(bus_alloc_resource, puc_bus_alloc_resource), + DEVMETHOD(bus_release_resource, puc_bus_release_resource), + DEVMETHOD(bus_get_resource, puc_bus_get_resource), + DEVMETHOD(bus_read_ivar, puc_bus_read_ivar), + DEVMETHOD(bus_setup_intr, puc_bus_setup_intr), + DEVMETHOD(bus_teardown_intr, puc_bus_teardown_intr), DEVMETHOD(bus_print_child, bus_generic_print_child), DEVMETHOD(bus_driver_added, bus_generic_driver_added), { 0, 0 } }; static driver_t puc_pci_driver = { - "puc", + puc_driver_name, puc_pci_methods, sizeof(struct puc_softc), }; DRIVER_MODULE(puc, pci, puc_pci_driver, puc_devclass, 0, 0); DRIVER_MODULE(puc, cardbus, puc_pci_driver, puc_devclass, 0, 0); - - -#define rdspio(indx) (bus_space_write_1(bst, bsh, efir, indx), \ - bus_space_read_1(bst, bsh, efdr)) -#define wrspio(indx,data) (bus_space_write_1(bst, bsh, efir, indx), \ - bus_space_write_1(bst, bsh, efdr, data)) - -#ifdef PUC_DEBUG -static void -puc_print_win877(bus_space_tag_t bst, bus_space_handle_t bsh, u_int efir, - u_int efdr) -{ - u_char cr00, cr01, cr04, cr09, cr0d, cr14, cr15, cr16, cr17; - u_char cr18, cr19, cr24, cr25, cr28, cr2c, cr31, cr32; - - cr00 = rdspio(0x00); - cr01 = rdspio(0x01); - cr04 = rdspio(0x04); - cr09 = rdspio(0x09); - cr0d = rdspio(0x0d); - cr14 = rdspio(0x14); - cr15 = rdspio(0x15); - cr16 = rdspio(0x16); - cr17 = rdspio(0x17); - cr18 = rdspio(0x18); - cr19 = rdspio(0x19); - cr24 = rdspio(0x24); - cr25 = rdspio(0x25); - cr28 = rdspio(0x28); - cr2c = rdspio(0x2c); - cr31 = rdspio(0x31); - cr32 = rdspio(0x32); - printf("877T: cr00 %x, cr01 %x, cr04 %x, cr09 %x, cr0d %x, cr14 %x, " - "cr15 %x, cr16 %x, cr17 %x, cr18 %x, cr19 %x, cr24 %x, cr25 %x, " - "cr28 %x, cr2c %x, cr31 %x, cr32 %x\n", cr00, cr01, cr04, cr09, - cr0d, cr14, cr15, cr16, cr17, - cr18, cr19, cr24, cr25, cr28, cr2c, cr31, cr32); -} -#endif - -int -puc_config_win877(struct puc_softc *sc) -{ - u_char val; - u_int efir, efdr; - bus_space_tag_t bst; - bus_space_handle_t bsh; - struct resource *res; - - res = sc->sc_bar_mappings[0].res; - - bst = rman_get_bustag(res); - bsh = rman_get_bushandle(res); - - /* configure the first W83877TF */ - bus_space_write_1(bst, bsh, 0x250, 0x89); - efir = 0x251; - efdr = 0x252; - val = rdspio(0x09) & 0x0f; - if (val != 0x0c) { - printf("conf_win877: Oops not a W83877TF\n"); - return (ENXIO); - } - -#ifdef PUC_DEBUG - printf("before: "); - puc_print_win877(bst, bsh, efir, efdr); -#endif - - val = rdspio(0x16); - val |= 0x04; - wrspio(0x16, val); - val &= ~0x04; - wrspio(0x16, val); - - wrspio(0x24, 0x2e8 >> 2); - wrspio(0x25, 0x2f8 >> 2); - wrspio(0x17, 0x03); - wrspio(0x28, 0x43); - -#ifdef PUC_DEBUG - printf("after: "); - puc_print_win877(bst, bsh, efir, efdr); -#endif - - bus_space_write_1(bst, bsh, 0x250, 0xaa); - - /* configure the second W83877TF */ - bus_space_write_1(bst, bsh, 0x3f0, 0x87); - bus_space_write_1(bst, bsh, 0x3f0, 0x87); - efir = 0x3f0; - efdr = 0x3f1; - val = rdspio(0x09) & 0x0f; - if (val != 0x0c) { - printf("conf_win877: Oops not a W83877TF\n"); - return(ENXIO); - } - -#ifdef PUC_DEBUG - printf("before: "); - puc_print_win877(bst, bsh, efir, efdr); -#endif - - val = rdspio(0x16); - val |= 0x04; - wrspio(0x16, val); - val &= ~0x04; - wrspio(0x16, val); - - wrspio(0x24, 0x3e8 >> 2); - wrspio(0x25, 0x3f8 >> 2); - wrspio(0x17, 0x03); - wrspio(0x28, 0x43); - -#ifdef PUC_DEBUG - printf("after: "); - puc_print_win877(bst, bsh, efir, efdr); -#endif - - bus_space_write_1(bst, bsh, 0x3f0, 0xaa); - return (0); -} - -#undef rdspio -#undef wrspio - |