diff options
author | imp <imp@FreeBSD.org> | 2002-02-27 05:09:14 +0000 |
---|---|---|
committer | imp <imp@FreeBSD.org> | 2002-02-27 05:09:14 +0000 |
commit | 08e793ff1516af442ad2104e345dc13f96a5189c (patch) | |
tree | ee76a2dce2896540a9561f86f7b47399fc382ce4 /sys/dev/cardbus/cardbus_cis.c | |
parent | c8a6bd99227ca59b48fafa66f2a21ddb86096d9e (diff) | |
download | FreeBSD-src-08e793ff1516af442ad2104e345dc13f96a5189c.zip FreeBSD-src-08e793ff1516af442ad2104e345dc13f96a5189c.tar.gz |
Use the pci.c code wherever possible, rather than copying all the pci
code into cardbus and s/pci/cardbus. This exposes a few pci_*
functions that are now static.
This work is similar to work Justin posted to the mobile list about a
year or two ago, which I have neglected since then.
This is a subset of his current work with the multiple inheritance
newbus architecutre. When completed, that will eliminate the need for
pci/pci_private.h.
Similar work is needed for the cardbus_cis and pccard_cis code as well.
Diffstat (limited to 'sys/dev/cardbus/cardbus_cis.c')
-rw-r--r-- | sys/dev/cardbus/cardbus_cis.c | 79 |
1 files changed, 43 insertions, 36 deletions
diff --git a/sys/dev/cardbus/cardbus_cis.c b/sys/dev/cardbus/cardbus_cis.c index f0b4274..e2bbe90 100644 --- a/sys/dev/cardbus/cardbus_cis.c +++ b/sys/dev/cardbus/cardbus_cis.c @@ -44,9 +44,9 @@ #include <machine/resource.h> #include <sys/rman.h> +#include <sys/pciio.h> #include <dev/pci/pcivar.h> #include <dev/pci/pcireg.h> -#include <sys/pciio.h> #include <dev/cardbus/cardbusreg.h> #include <dev/cardbus/cardbusvar.h> @@ -318,7 +318,7 @@ DECODE_PROTOTYPE(bar) :(dinfo->ibelow1mb&BARBIT(bar))?" (Below 1Mb)":"" )); - resource_list_add(&dinfo->resources, type, bar, 0UL, ~0UL, len); + resource_list_add(&dinfo->pci.resources, type, bar, 0UL, ~0UL, len); } return 0; } @@ -614,15 +614,14 @@ cardbus_alloc_resources(device_t cbdev, device_t child) int rid, flags; count = 0; - SLIST_FOREACH(rle, &dinfo->resources, link) { + SLIST_FOREACH(rle, &dinfo->pci.resources, link) count++; - } if (count == 0) return 0; barlist = malloc(sizeof(struct resource_list_entry*) * count, M_DEVBUF, M_WAITOK); count = 0; - SLIST_FOREACH(rle, &dinfo->resources, link) { + SLIST_FOREACH(rle, &dinfo->pci.resources, link) { barlist[count] = rle; if (rle->type == SYS_RES_IOPORT) { io_size += rle->count; @@ -689,20 +688,22 @@ cardbus_alloc_resources(device_t cbdev, device_t child) DEVPRINTF((cbdev, "Cannot pre-allocate " "prefetchable memory, will try as " "non-prefetchable.\n")); - } else { - barlist[tmp]->start = - rman_get_start(barlist[tmp]->res); - barlist[tmp]->end = - rman_get_end(barlist[tmp]->res); - pci_write_config(child, - barlist[tmp]->rid, - barlist[tmp]->start, 4); - DEVPRINTF((cbdev, "Prefetchable memory " - "rid=%x at %lx-%lx\n", - barlist[tmp]->rid, - barlist[tmp]->start, - barlist[tmp]->end)); + continue; } + barlist[tmp]->start = + rman_get_start(barlist[tmp]->res); + barlist[tmp]->end = + rman_get_end(barlist[tmp]->res); + pci_write_config(child, + barlist[tmp]->rid, + barlist[tmp]->start, 4); + bus_release_resource(cbdev, SYS_RES_MEMORY, + barlist[tmp]->rid, barlist[tmp]->res); + DEVPRINTF((cbdev, "Prefetchable memory " + "rid=%x at %lx-%lx\n", + barlist[tmp]->rid, + barlist[tmp]->start, + barlist[tmp]->end)); } } } @@ -749,7 +750,7 @@ cardbus_alloc_resources(device_t cbdev, device_t child) if (barlist[tmp]->res == NULL) { DEVPRINTF((cbdev, "Cannot pre-allocate " "memory for cardbus device\n")); - return ENOMEM; + return (ENOMEM); } barlist[tmp]->start = rman_get_start(barlist[tmp]->res); @@ -757,6 +758,9 @@ cardbus_alloc_resources(device_t cbdev, device_t child) barlist[tmp]->res); pci_write_config(child, barlist[tmp]->rid, barlist[tmp]->start, 4); + bus_release_resource(cbdev, SYS_RES_MEMORY, + barlist[tmp]->rid, barlist[tmp]->res); + barlist[tmp]->res = NULL; DEVPRINTF((cbdev, "Non-prefetchable memory " "rid=%x at %lx-%lx (%lx)\n", barlist[tmp]->rid, barlist[tmp]->start, @@ -784,14 +788,15 @@ cardbus_alloc_resources(device_t cbdev, device_t child) * (XXX: Perhaps there might be a better way to do this?) */ rid = 0; - res = bus_alloc_resource(cbdev, SYS_RES_IOPORT, &rid, 0, - (dinfo->ibelow1mb)?0xFFFFF:~0UL, io_size, flags); + res = bus_alloc_resource(cbdev, SYS_RES_IOPORT, &rid, 0, ~0UL, + io_size, flags); start = rman_get_start(res); end = rman_get_end(res); DEVPRINTF((cbdev, "IO port at %x-%x\n", start, end)); /* * Now that we know the region is free, release it and hand it - * out piece by piece. + * out piece by piece. XXX Need to interlock with the RM + * so we don't race here. */ bus_release_resource(cbdev, SYS_RES_IOPORT, rid, res); for (tmp = 0; tmp < count; tmp++) { @@ -811,26 +816,27 @@ cardbus_alloc_resources(device_t cbdev, device_t child) rman_get_start(barlist[tmp]->res); barlist[tmp]->end = rman_get_end(barlist[tmp]->res); - pci_write_config(child, barlist[tmp]->rid, - barlist[tmp]->start, 4); - DEVPRINTF((cbdev, "IO port rid=%x at %lx-%lx\n", - barlist[tmp]->rid, barlist[tmp]->start, - barlist[tmp]->end)); + pci_write_config(child, barlist[tmp]->rid, + barlist[tmp]->start, 4); + bus_release_resource(cbdev, SYS_RES_IOPORT, + barlist[tmp]->rid, barlist[tmp]->res); + barlist[tmp]->res = NULL; + DEVPRINTF((cbdev, "IO port rid=%x at %lx-%lx\n", + barlist[tmp]->rid, barlist[tmp]->start, + barlist[tmp]->end)); } } } /* Allocate IRQ */ - /* XXX: Search CIS for IRQ description */ rid = 0; res = bus_alloc_resource(cbdev, SYS_RES_IRQ, &rid, 0, ~0UL, 1, RF_SHAREABLE); - resource_list_add(&dinfo->resources, SYS_RES_IRQ, rid, + resource_list_add(&dinfo->pci.resources, SYS_RES_IRQ, rid, rman_get_start(res), rman_get_end(res), 1); - rle = resource_list_find(&dinfo->resources, SYS_RES_IRQ, rid); - rle->res = res; - dinfo->cfg.intline = rman_get_start(res); + dinfo->pci.cfg.intline = rman_get_start(res); pci_write_config(child, PCIR_INTLINE, rman_get_start(res), 1); + bus_release_resource(cbdev, SYS_RES_IRQ, rid, res); return 0; } @@ -848,7 +854,7 @@ cardbus_add_map(device_t cbdev, device_t child, int reg) u_int32_t testval; int type; - SLIST_FOREACH(rle, &dinfo->resources, link) { + SLIST_FOREACH(rle, &dinfo->pci.resources, link) { if (rle->rid == reg) return; } @@ -872,7 +878,7 @@ cardbus_add_map(device_t cbdev, device_t child, int reg) size = CARDBUS_MAPREG_MEM_SIZE(testval); device_printf(cbdev, "Resource not specified in CIS: id=%x, size=%x\n", reg, size); - resource_list_add(&dinfo->resources, type, reg, 0UL, ~0UL, size); + resource_list_add(&dinfo->pci.resources, type, reg, 0UL, ~0UL, size); } static void @@ -888,12 +894,13 @@ cardbus_pickup_maps(device_t cbdev, device_t child) * the driver in its CIS. * XXX: should we do this or use quirks? */ - for (reg = 0; reg < dinfo->cfg.nummaps; reg++) { + for (reg = 0; reg < dinfo->pci.cfg.nummaps; reg++) { cardbus_add_map(cbdev, child, PCIR_MAPS + reg * 4); } for (q = &cardbus_quirks[0]; q->devid; q++) { - if (q->devid == ((dinfo->cfg.device << 16) | dinfo->cfg.vendor) + if (q->devid == ((dinfo->pci.cfg.device << 16) | + dinfo->pci.cfg.vendor) && q->type == CARDBUS_QUIRK_MAP_REG) { cardbus_add_map(cbdev, child, q->arg1); } |