summaryrefslogtreecommitdiffstats
path: root/sys/dev/puc/puc_pci.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/puc/puc_pci.c')
-rw-r--r--sys/dev/puc/puc_pci.c219
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
-
OpenPOWER on IntegriCloud