summaryrefslogtreecommitdiffstats
path: root/sys/dev/cardbus/cardbus_cis.c
diff options
context:
space:
mode:
authorimp <imp@FreeBSD.org>2002-02-27 05:09:14 +0000
committerimp <imp@FreeBSD.org>2002-02-27 05:09:14 +0000
commit08e793ff1516af442ad2104e345dc13f96a5189c (patch)
treeee76a2dce2896540a9561f86f7b47399fc382ce4 /sys/dev/cardbus/cardbus_cis.c
parentc8a6bd99227ca59b48fafa66f2a21ddb86096d9e (diff)
downloadFreeBSD-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.c79
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);
}
OpenPOWER on IntegriCloud