mirror of
https://git.rtems.org/rtems-libbsd/
synced 2025-10-17 15:07:04 +08:00
Update to FreeBSD 9.3
This commit is contained in:
@@ -164,7 +164,7 @@ static device_method_t pci_methods[] = {
|
||||
DEVMETHOD(bus_delete_resource, pci_delete_resource),
|
||||
DEVMETHOD(bus_alloc_resource, pci_alloc_resource),
|
||||
DEVMETHOD(bus_adjust_resource, bus_generic_adjust_resource),
|
||||
DEVMETHOD(bus_release_resource, bus_generic_rl_release_resource),
|
||||
DEVMETHOD(bus_release_resource, pci_release_resource),
|
||||
DEVMETHOD(bus_activate_resource, pci_activate_resource),
|
||||
DEVMETHOD(bus_deactivate_resource, pci_deactivate_resource),
|
||||
DEVMETHOD(bus_child_pnpinfo_str, pci_child_pnpinfo_str_method),
|
||||
@@ -347,6 +347,11 @@ SYSCTL_INT(_hw_pci, OID_AUTO, usb_early_takeover, CTLFLAG_RDTUN,
|
||||
Disable this if you depend on BIOS emulation of USB devices, that is\n\
|
||||
you use USB devices (like keyboard or mouse) but do not load USB drivers");
|
||||
|
||||
static int pci_clear_bars;
|
||||
TUNABLE_INT("hw.pci.clear_bars", &pci_clear_bars);
|
||||
SYSCTL_INT(_hw_pci, OID_AUTO, clear_bars, CTLFLAG_RDTUN, &pci_clear_bars, 0,
|
||||
"Ignore firmware-assigned resources for BARs.");
|
||||
|
||||
static int
|
||||
pci_has_quirk(uint32_t devid, int quirk)
|
||||
{
|
||||
@@ -999,7 +1004,7 @@ pci_read_vpd(device_t pcib, pcicfgregs *cfg)
|
||||
state = -2;
|
||||
break;
|
||||
}
|
||||
dflen = byte2;
|
||||
cfg->vpd.vpd_ros[off].len = dflen = byte2;
|
||||
if (dflen == 0 &&
|
||||
strncmp(cfg->vpd.vpd_ros[off].keyword, "RV",
|
||||
2) == 0) {
|
||||
@@ -1200,6 +1205,17 @@ pci_get_vpd_readonly_method(device_t dev, device_t child, const char *kw,
|
||||
return (ENXIO);
|
||||
}
|
||||
|
||||
struct pcicfg_vpd *
|
||||
pci_fetch_vpd_list(device_t dev)
|
||||
{
|
||||
struct pci_devinfo *dinfo = device_get_ivars(dev);
|
||||
pcicfgregs *cfg = &dinfo->cfg;
|
||||
|
||||
if (!cfg->vpd.vpd_cached && cfg->vpd.vpd_reg != 0)
|
||||
pci_read_vpd(device_get_parent(device_get_parent(dev)), cfg);
|
||||
return (&cfg->vpd);
|
||||
}
|
||||
|
||||
/*
|
||||
* Find the requested extended capability and return the offset in
|
||||
* configuration space via the pointer provided. The function returns
|
||||
@@ -2668,7 +2684,7 @@ pci_add_map(device_t bus, device_t dev, int reg, struct resource_list *rl,
|
||||
struct pci_map *pm;
|
||||
pci_addr_t base, map, testval;
|
||||
pci_addr_t start, end, count;
|
||||
int barlen, basezero, maprange, mapsize, type;
|
||||
int barlen, basezero, flags, maprange, mapsize, type;
|
||||
uint16_t cmd;
|
||||
struct resource *res;
|
||||
|
||||
@@ -2774,7 +2790,10 @@ pci_add_map(device_t bus, device_t dev, int reg, struct resource_list *rl,
|
||||
}
|
||||
|
||||
count = (pci_addr_t)1 << mapsize;
|
||||
if (basezero || base == pci_mapbase(testval)) {
|
||||
flags = RF_ALIGNMENT_LOG2(mapsize);
|
||||
if (prefetch)
|
||||
flags |= RF_PREFETCHABLE;
|
||||
if (basezero || base == pci_mapbase(testval) || pci_clear_bars) {
|
||||
start = 0; /* Let the parent decide. */
|
||||
end = ~0ul;
|
||||
} else {
|
||||
@@ -2790,7 +2809,7 @@ pci_add_map(device_t bus, device_t dev, int reg, struct resource_list *rl,
|
||||
* pci_alloc_resource().
|
||||
*/
|
||||
res = resource_list_reserve(rl, bus, dev, type, ®, start, end, count,
|
||||
prefetch ? RF_PREFETCHABLE : 0);
|
||||
flags);
|
||||
if (pci_do_realloc_bars && res == NULL && (start != 0 || end != ~0ul)) {
|
||||
/*
|
||||
* If the allocation fails, try to allocate a resource for
|
||||
@@ -2801,7 +2820,7 @@ pci_add_map(device_t bus, device_t dev, int reg, struct resource_list *rl,
|
||||
resource_list_delete(rl, type, reg);
|
||||
resource_list_add(rl, type, reg, 0, ~0ul, count);
|
||||
res = resource_list_reserve(rl, bus, dev, type, ®, 0, ~0ul,
|
||||
count, prefetch ? RF_PREFETCHABLE : 0);
|
||||
count, flags);
|
||||
}
|
||||
if (res == NULL) {
|
||||
/*
|
||||
@@ -3650,105 +3669,107 @@ static const struct
|
||||
{
|
||||
int class;
|
||||
int subclass;
|
||||
int report; /* 0 = bootverbose, 1 = always */
|
||||
const char *desc;
|
||||
} pci_nomatch_tab[] = {
|
||||
{PCIC_OLD, -1, "old"},
|
||||
{PCIC_OLD, PCIS_OLD_NONVGA, "non-VGA display device"},
|
||||
{PCIC_OLD, PCIS_OLD_VGA, "VGA-compatible display device"},
|
||||
{PCIC_STORAGE, -1, "mass storage"},
|
||||
{PCIC_STORAGE, PCIS_STORAGE_SCSI, "SCSI"},
|
||||
{PCIC_STORAGE, PCIS_STORAGE_IDE, "ATA"},
|
||||
{PCIC_STORAGE, PCIS_STORAGE_FLOPPY, "floppy disk"},
|
||||
{PCIC_STORAGE, PCIS_STORAGE_IPI, "IPI"},
|
||||
{PCIC_STORAGE, PCIS_STORAGE_RAID, "RAID"},
|
||||
{PCIC_STORAGE, PCIS_STORAGE_ATA_ADMA, "ATA (ADMA)"},
|
||||
{PCIC_STORAGE, PCIS_STORAGE_SATA, "SATA"},
|
||||
{PCIC_STORAGE, PCIS_STORAGE_SAS, "SAS"},
|
||||
{PCIC_STORAGE, PCIS_STORAGE_NVM, "NVM"},
|
||||
{PCIC_NETWORK, -1, "network"},
|
||||
{PCIC_NETWORK, PCIS_NETWORK_ETHERNET, "ethernet"},
|
||||
{PCIC_NETWORK, PCIS_NETWORK_TOKENRING, "token ring"},
|
||||
{PCIC_NETWORK, PCIS_NETWORK_FDDI, "fddi"},
|
||||
{PCIC_NETWORK, PCIS_NETWORK_ATM, "ATM"},
|
||||
{PCIC_NETWORK, PCIS_NETWORK_ISDN, "ISDN"},
|
||||
{PCIC_DISPLAY, -1, "display"},
|
||||
{PCIC_DISPLAY, PCIS_DISPLAY_VGA, "VGA"},
|
||||
{PCIC_DISPLAY, PCIS_DISPLAY_XGA, "XGA"},
|
||||
{PCIC_DISPLAY, PCIS_DISPLAY_3D, "3D"},
|
||||
{PCIC_MULTIMEDIA, -1, "multimedia"},
|
||||
{PCIC_MULTIMEDIA, PCIS_MULTIMEDIA_VIDEO, "video"},
|
||||
{PCIC_MULTIMEDIA, PCIS_MULTIMEDIA_AUDIO, "audio"},
|
||||
{PCIC_MULTIMEDIA, PCIS_MULTIMEDIA_TELE, "telephony"},
|
||||
{PCIC_MULTIMEDIA, PCIS_MULTIMEDIA_HDA, "HDA"},
|
||||
{PCIC_MEMORY, -1, "memory"},
|
||||
{PCIC_MEMORY, PCIS_MEMORY_RAM, "RAM"},
|
||||
{PCIC_MEMORY, PCIS_MEMORY_FLASH, "flash"},
|
||||
{PCIC_BRIDGE, -1, "bridge"},
|
||||
{PCIC_BRIDGE, PCIS_BRIDGE_HOST, "HOST-PCI"},
|
||||
{PCIC_BRIDGE, PCIS_BRIDGE_ISA, "PCI-ISA"},
|
||||
{PCIC_BRIDGE, PCIS_BRIDGE_EISA, "PCI-EISA"},
|
||||
{PCIC_BRIDGE, PCIS_BRIDGE_MCA, "PCI-MCA"},
|
||||
{PCIC_BRIDGE, PCIS_BRIDGE_PCI, "PCI-PCI"},
|
||||
{PCIC_BRIDGE, PCIS_BRIDGE_PCMCIA, "PCI-PCMCIA"},
|
||||
{PCIC_BRIDGE, PCIS_BRIDGE_NUBUS, "PCI-NuBus"},
|
||||
{PCIC_BRIDGE, PCIS_BRIDGE_CARDBUS, "PCI-CardBus"},
|
||||
{PCIC_BRIDGE, PCIS_BRIDGE_RACEWAY, "PCI-RACEway"},
|
||||
{PCIC_SIMPLECOMM, -1, "simple comms"},
|
||||
{PCIC_SIMPLECOMM, PCIS_SIMPLECOMM_UART, "UART"}, /* could detect 16550 */
|
||||
{PCIC_SIMPLECOMM, PCIS_SIMPLECOMM_PAR, "parallel port"},
|
||||
{PCIC_SIMPLECOMM, PCIS_SIMPLECOMM_MULSER, "multiport serial"},
|
||||
{PCIC_SIMPLECOMM, PCIS_SIMPLECOMM_MODEM, "generic modem"},
|
||||
{PCIC_BASEPERIPH, -1, "base peripheral"},
|
||||
{PCIC_BASEPERIPH, PCIS_BASEPERIPH_PIC, "interrupt controller"},
|
||||
{PCIC_BASEPERIPH, PCIS_BASEPERIPH_DMA, "DMA controller"},
|
||||
{PCIC_BASEPERIPH, PCIS_BASEPERIPH_TIMER, "timer"},
|
||||
{PCIC_BASEPERIPH, PCIS_BASEPERIPH_RTC, "realtime clock"},
|
||||
{PCIC_BASEPERIPH, PCIS_BASEPERIPH_PCIHOT, "PCI hot-plug controller"},
|
||||
{PCIC_BASEPERIPH, PCIS_BASEPERIPH_SDHC, "SD host controller"},
|
||||
{PCIC_INPUTDEV, -1, "input device"},
|
||||
{PCIC_INPUTDEV, PCIS_INPUTDEV_KEYBOARD, "keyboard"},
|
||||
{PCIC_INPUTDEV, PCIS_INPUTDEV_DIGITIZER,"digitizer"},
|
||||
{PCIC_INPUTDEV, PCIS_INPUTDEV_MOUSE, "mouse"},
|
||||
{PCIC_INPUTDEV, PCIS_INPUTDEV_SCANNER, "scanner"},
|
||||
{PCIC_INPUTDEV, PCIS_INPUTDEV_GAMEPORT, "gameport"},
|
||||
{PCIC_DOCKING, -1, "docking station"},
|
||||
{PCIC_PROCESSOR, -1, "processor"},
|
||||
{PCIC_SERIALBUS, -1, "serial bus"},
|
||||
{PCIC_SERIALBUS, PCIS_SERIALBUS_FW, "FireWire"},
|
||||
{PCIC_SERIALBUS, PCIS_SERIALBUS_ACCESS, "AccessBus"},
|
||||
{PCIC_SERIALBUS, PCIS_SERIALBUS_SSA, "SSA"},
|
||||
{PCIC_SERIALBUS, PCIS_SERIALBUS_USB, "USB"},
|
||||
{PCIC_SERIALBUS, PCIS_SERIALBUS_FC, "Fibre Channel"},
|
||||
{PCIC_SERIALBUS, PCIS_SERIALBUS_SMBUS, "SMBus"},
|
||||
{PCIC_WIRELESS, -1, "wireless controller"},
|
||||
{PCIC_WIRELESS, PCIS_WIRELESS_IRDA, "iRDA"},
|
||||
{PCIC_WIRELESS, PCIS_WIRELESS_IR, "IR"},
|
||||
{PCIC_WIRELESS, PCIS_WIRELESS_RF, "RF"},
|
||||
{PCIC_INTELLIIO, -1, "intelligent I/O controller"},
|
||||
{PCIC_INTELLIIO, PCIS_INTELLIIO_I2O, "I2O"},
|
||||
{PCIC_SATCOM, -1, "satellite communication"},
|
||||
{PCIC_SATCOM, PCIS_SATCOM_TV, "sat TV"},
|
||||
{PCIC_SATCOM, PCIS_SATCOM_AUDIO, "sat audio"},
|
||||
{PCIC_SATCOM, PCIS_SATCOM_VOICE, "sat voice"},
|
||||
{PCIC_SATCOM, PCIS_SATCOM_DATA, "sat data"},
|
||||
{PCIC_CRYPTO, -1, "encrypt/decrypt"},
|
||||
{PCIC_CRYPTO, PCIS_CRYPTO_NETCOMP, "network/computer crypto"},
|
||||
{PCIC_CRYPTO, PCIS_CRYPTO_ENTERTAIN, "entertainment crypto"},
|
||||
{PCIC_DASP, -1, "dasp"},
|
||||
{PCIC_DASP, PCIS_DASP_DPIO, "DPIO module"},
|
||||
{0, 0, NULL}
|
||||
{PCIC_OLD, -1, 1, "old"},
|
||||
{PCIC_OLD, PCIS_OLD_NONVGA, 1, "non-VGA display device"},
|
||||
{PCIC_OLD, PCIS_OLD_VGA, 1, "VGA-compatible display device"},
|
||||
{PCIC_STORAGE, -1, 1, "mass storage"},
|
||||
{PCIC_STORAGE, PCIS_STORAGE_SCSI, 1, "SCSI"},
|
||||
{PCIC_STORAGE, PCIS_STORAGE_IDE, 1, "ATA"},
|
||||
{PCIC_STORAGE, PCIS_STORAGE_FLOPPY, 1, "floppy disk"},
|
||||
{PCIC_STORAGE, PCIS_STORAGE_IPI, 1, "IPI"},
|
||||
{PCIC_STORAGE, PCIS_STORAGE_RAID, 1, "RAID"},
|
||||
{PCIC_STORAGE, PCIS_STORAGE_ATA_ADMA, 1, "ATA (ADMA)"},
|
||||
{PCIC_STORAGE, PCIS_STORAGE_SATA, 1, "SATA"},
|
||||
{PCIC_STORAGE, PCIS_STORAGE_SAS, 1, "SAS"},
|
||||
{PCIC_STORAGE, PCIS_STORAGE_NVM, 1, "NVM"},
|
||||
{PCIC_NETWORK, -1, 1, "network"},
|
||||
{PCIC_NETWORK, PCIS_NETWORK_ETHERNET, 1, "ethernet"},
|
||||
{PCIC_NETWORK, PCIS_NETWORK_TOKENRING, 1, "token ring"},
|
||||
{PCIC_NETWORK, PCIS_NETWORK_FDDI, 1, "fddi"},
|
||||
{PCIC_NETWORK, PCIS_NETWORK_ATM, 1, "ATM"},
|
||||
{PCIC_NETWORK, PCIS_NETWORK_ISDN, 1, "ISDN"},
|
||||
{PCIC_DISPLAY, -1, 1, "display"},
|
||||
{PCIC_DISPLAY, PCIS_DISPLAY_VGA, 1, "VGA"},
|
||||
{PCIC_DISPLAY, PCIS_DISPLAY_XGA, 1, "XGA"},
|
||||
{PCIC_DISPLAY, PCIS_DISPLAY_3D, 1, "3D"},
|
||||
{PCIC_MULTIMEDIA, -1, 1, "multimedia"},
|
||||
{PCIC_MULTIMEDIA, PCIS_MULTIMEDIA_VIDEO, 1, "video"},
|
||||
{PCIC_MULTIMEDIA, PCIS_MULTIMEDIA_AUDIO, 1, "audio"},
|
||||
{PCIC_MULTIMEDIA, PCIS_MULTIMEDIA_TELE, 1, "telephony"},
|
||||
{PCIC_MULTIMEDIA, PCIS_MULTIMEDIA_HDA, 1, "HDA"},
|
||||
{PCIC_MEMORY, -1, 1, "memory"},
|
||||
{PCIC_MEMORY, PCIS_MEMORY_RAM, 1, "RAM"},
|
||||
{PCIC_MEMORY, PCIS_MEMORY_FLASH, 1, "flash"},
|
||||
{PCIC_BRIDGE, -1, 1, "bridge"},
|
||||
{PCIC_BRIDGE, PCIS_BRIDGE_HOST, 1, "HOST-PCI"},
|
||||
{PCIC_BRIDGE, PCIS_BRIDGE_ISA, 1, "PCI-ISA"},
|
||||
{PCIC_BRIDGE, PCIS_BRIDGE_EISA, 1, "PCI-EISA"},
|
||||
{PCIC_BRIDGE, PCIS_BRIDGE_MCA, 1, "PCI-MCA"},
|
||||
{PCIC_BRIDGE, PCIS_BRIDGE_PCI, 1, "PCI-PCI"},
|
||||
{PCIC_BRIDGE, PCIS_BRIDGE_PCMCIA, 1, "PCI-PCMCIA"},
|
||||
{PCIC_BRIDGE, PCIS_BRIDGE_NUBUS, 1, "PCI-NuBus"},
|
||||
{PCIC_BRIDGE, PCIS_BRIDGE_CARDBUS, 1, "PCI-CardBus"},
|
||||
{PCIC_BRIDGE, PCIS_BRIDGE_RACEWAY, 1, "PCI-RACEway"},
|
||||
{PCIC_SIMPLECOMM, -1, 1, "simple comms"},
|
||||
{PCIC_SIMPLECOMM, PCIS_SIMPLECOMM_UART, 1, "UART"}, /* could detect 16550 */
|
||||
{PCIC_SIMPLECOMM, PCIS_SIMPLECOMM_PAR, 1, "parallel port"},
|
||||
{PCIC_SIMPLECOMM, PCIS_SIMPLECOMM_MULSER, 1, "multiport serial"},
|
||||
{PCIC_SIMPLECOMM, PCIS_SIMPLECOMM_MODEM, 1, "generic modem"},
|
||||
{PCIC_BASEPERIPH, -1, 0, "base peripheral"},
|
||||
{PCIC_BASEPERIPH, PCIS_BASEPERIPH_PIC, 1, "interrupt controller"},
|
||||
{PCIC_BASEPERIPH, PCIS_BASEPERIPH_DMA, 1, "DMA controller"},
|
||||
{PCIC_BASEPERIPH, PCIS_BASEPERIPH_TIMER, 1, "timer"},
|
||||
{PCIC_BASEPERIPH, PCIS_BASEPERIPH_RTC, 1, "realtime clock"},
|
||||
{PCIC_BASEPERIPH, PCIS_BASEPERIPH_PCIHOT, 1, "PCI hot-plug controller"},
|
||||
{PCIC_BASEPERIPH, PCIS_BASEPERIPH_SDHC, 1, "SD host controller"},
|
||||
{PCIC_INPUTDEV, -1, 1, "input device"},
|
||||
{PCIC_INPUTDEV, PCIS_INPUTDEV_KEYBOARD, 1, "keyboard"},
|
||||
{PCIC_INPUTDEV, PCIS_INPUTDEV_DIGITIZER,1, "digitizer"},
|
||||
{PCIC_INPUTDEV, PCIS_INPUTDEV_MOUSE, 1, "mouse"},
|
||||
{PCIC_INPUTDEV, PCIS_INPUTDEV_SCANNER, 1, "scanner"},
|
||||
{PCIC_INPUTDEV, PCIS_INPUTDEV_GAMEPORT, 1, "gameport"},
|
||||
{PCIC_DOCKING, -1, 1, "docking station"},
|
||||
{PCIC_PROCESSOR, -1, 1, "processor"},
|
||||
{PCIC_SERIALBUS, -1, 1, "serial bus"},
|
||||
{PCIC_SERIALBUS, PCIS_SERIALBUS_FW, 1, "FireWire"},
|
||||
{PCIC_SERIALBUS, PCIS_SERIALBUS_ACCESS, 1, "AccessBus"},
|
||||
{PCIC_SERIALBUS, PCIS_SERIALBUS_SSA, 1, "SSA"},
|
||||
{PCIC_SERIALBUS, PCIS_SERIALBUS_USB, 1, "USB"},
|
||||
{PCIC_SERIALBUS, PCIS_SERIALBUS_FC, 1, "Fibre Channel"},
|
||||
{PCIC_SERIALBUS, PCIS_SERIALBUS_SMBUS, 0, "SMBus"},
|
||||
{PCIC_WIRELESS, -1, 1, "wireless controller"},
|
||||
{PCIC_WIRELESS, PCIS_WIRELESS_IRDA, 1, "iRDA"},
|
||||
{PCIC_WIRELESS, PCIS_WIRELESS_IR, 1, "IR"},
|
||||
{PCIC_WIRELESS, PCIS_WIRELESS_RF, 1, "RF"},
|
||||
{PCIC_INTELLIIO, -1, 1, "intelligent I/O controller"},
|
||||
{PCIC_INTELLIIO, PCIS_INTELLIIO_I2O, 1, "I2O"},
|
||||
{PCIC_SATCOM, -1, 1, "satellite communication"},
|
||||
{PCIC_SATCOM, PCIS_SATCOM_TV, 1, "sat TV"},
|
||||
{PCIC_SATCOM, PCIS_SATCOM_AUDIO, 1, "sat audio"},
|
||||
{PCIC_SATCOM, PCIS_SATCOM_VOICE, 1, "sat voice"},
|
||||
{PCIC_SATCOM, PCIS_SATCOM_DATA, 1, "sat data"},
|
||||
{PCIC_CRYPTO, -1, 1, "encrypt/decrypt"},
|
||||
{PCIC_CRYPTO, PCIS_CRYPTO_NETCOMP, 1, "network/computer crypto"},
|
||||
{PCIC_CRYPTO, PCIS_CRYPTO_ENTERTAIN, 1, "entertainment crypto"},
|
||||
{PCIC_DASP, -1, 0, "dasp"},
|
||||
{PCIC_DASP, PCIS_DASP_DPIO, 1, "DPIO module"},
|
||||
{0, 0, 0, NULL}
|
||||
};
|
||||
|
||||
void
|
||||
pci_probe_nomatch(device_t dev, device_t child)
|
||||
{
|
||||
int i;
|
||||
int i, report;
|
||||
const char *cp, *scp;
|
||||
char *device;
|
||||
|
||||
/*
|
||||
* Look for a listing for this device in a loaded device database.
|
||||
*/
|
||||
report = 1;
|
||||
if ((device = pci_describe_device(child)) != NULL) {
|
||||
device_printf(dev, "<%s>", device);
|
||||
free(device, M_DEVBUF);
|
||||
@@ -3763,19 +3784,25 @@ pci_probe_nomatch(device_t dev, device_t child)
|
||||
if (pci_nomatch_tab[i].class == pci_get_class(child)) {
|
||||
if (pci_nomatch_tab[i].subclass == -1) {
|
||||
cp = pci_nomatch_tab[i].desc;
|
||||
report = pci_nomatch_tab[i].report;
|
||||
} else if (pci_nomatch_tab[i].subclass ==
|
||||
pci_get_subclass(child)) {
|
||||
scp = pci_nomatch_tab[i].desc;
|
||||
report = pci_nomatch_tab[i].report;
|
||||
}
|
||||
}
|
||||
}
|
||||
device_printf(dev, "<%s%s%s>",
|
||||
cp ? cp : "",
|
||||
((cp != NULL) && (scp != NULL)) ? ", " : "",
|
||||
scp ? scp : "");
|
||||
if (report || bootverbose) {
|
||||
device_printf(dev, "<%s%s%s>",
|
||||
cp ? cp : "",
|
||||
((cp != NULL) && (scp != NULL)) ? ", " : "",
|
||||
scp ? scp : "");
|
||||
}
|
||||
}
|
||||
if (report || bootverbose) {
|
||||
printf(" at device %d.%d (no driver attached)\n",
|
||||
pci_get_slot(child), pci_get_function(child));
|
||||
}
|
||||
printf(" at device %d.%d (no driver attached)\n",
|
||||
pci_get_slot(child), pci_get_function(child));
|
||||
pci_cfg_save(child, device_get_ivars(child), 1);
|
||||
}
|
||||
|
||||
@@ -4078,7 +4105,6 @@ pci_reserve_map(device_t dev, device_t child, int type, int *rid,
|
||||
{
|
||||
struct pci_devinfo *dinfo = device_get_ivars(child);
|
||||
struct resource_list *rl = &dinfo->resources;
|
||||
struct resource_list_entry *rle;
|
||||
struct resource *res;
|
||||
struct pci_map *pm;
|
||||
pci_addr_t map, testval;
|
||||
@@ -4151,23 +4177,16 @@ pci_reserve_map(device_t dev, device_t child, int type, int *rid,
|
||||
* Allocate enough resource, and then write back the
|
||||
* appropriate BAR for that resource.
|
||||
*/
|
||||
res = BUS_ALLOC_RESOURCE(device_get_parent(dev), child, type, rid,
|
||||
start, end, count, flags & ~RF_ACTIVE);
|
||||
resource_list_add(rl, type, *rid, start, end, count);
|
||||
res = resource_list_reserve(rl, dev, child, type, rid, start, end,
|
||||
count, flags & ~RF_ACTIVE);
|
||||
if (res == NULL) {
|
||||
resource_list_delete(rl, type, *rid);
|
||||
device_printf(child,
|
||||
"%#lx bytes of rid %#x res %d failed (%#lx, %#lx).\n",
|
||||
count, *rid, type, start, end);
|
||||
goto out;
|
||||
}
|
||||
resource_list_add(rl, type, *rid, start, end, count);
|
||||
rle = resource_list_find(rl, type, *rid);
|
||||
if (rle == NULL)
|
||||
panic("pci_reserve_map: unexpectedly can't find resource.");
|
||||
rle->res = res;
|
||||
rle->start = rman_get_start(res);
|
||||
rle->end = rman_get_end(res);
|
||||
rle->count = count;
|
||||
rle->flags = RLE_RESERVED;
|
||||
if (bootverbose)
|
||||
device_printf(child,
|
||||
"Lazy allocation of %#lx bytes rid %#x type %d at %#lx\n",
|
||||
@@ -4182,11 +4201,11 @@ struct resource *
|
||||
pci_alloc_resource(device_t dev, device_t child, int type, int *rid,
|
||||
u_long start, u_long end, u_long count, u_int flags)
|
||||
{
|
||||
struct pci_devinfo *dinfo = device_get_ivars(child);
|
||||
struct resource_list *rl = &dinfo->resources;
|
||||
struct pci_devinfo *dinfo;
|
||||
struct resource_list *rl;
|
||||
struct resource_list_entry *rle;
|
||||
struct resource *res;
|
||||
pcicfgregs *cfg = &dinfo->cfg;
|
||||
pcicfgregs *cfg;
|
||||
|
||||
if (device_get_parent(child) != dev)
|
||||
return (BUS_ALLOC_RESOURCE(device_get_parent(dev), child,
|
||||
@@ -4195,6 +4214,9 @@ pci_alloc_resource(device_t dev, device_t child, int type, int *rid,
|
||||
/*
|
||||
* Perform lazy resource allocation
|
||||
*/
|
||||
dinfo = device_get_ivars(child);
|
||||
rl = &dinfo->resources;
|
||||
cfg = &dinfo->cfg;
|
||||
switch (type) {
|
||||
case SYS_RES_IRQ:
|
||||
/*
|
||||
@@ -4249,6 +4271,41 @@ pci_alloc_resource(device_t dev, device_t child, int type, int *rid,
|
||||
start, end, count, flags));
|
||||
}
|
||||
|
||||
int
|
||||
pci_release_resource(device_t dev, device_t child, int type, int rid,
|
||||
struct resource *r)
|
||||
{
|
||||
struct pci_devinfo *dinfo;
|
||||
struct resource_list *rl;
|
||||
pcicfgregs *cfg;
|
||||
|
||||
if (device_get_parent(child) != dev)
|
||||
return (BUS_RELEASE_RESOURCE(device_get_parent(dev), child,
|
||||
type, rid, r));
|
||||
|
||||
dinfo = device_get_ivars(child);
|
||||
cfg = &dinfo->cfg;
|
||||
#ifdef NEW_PCIB
|
||||
/*
|
||||
* PCI-PCI bridge I/O window resources are not BARs. For
|
||||
* those allocations just pass the request up the tree.
|
||||
*/
|
||||
if (cfg->hdrtype == PCIM_HDRTYPE_BRIDGE &&
|
||||
(type == SYS_RES_IOPORT || type == SYS_RES_MEMORY)) {
|
||||
switch (rid) {
|
||||
case PCIR_IOBASEL_1:
|
||||
case PCIR_MEMBASE_1:
|
||||
case PCIR_PMBASEL_1:
|
||||
return (bus_generic_release_resource(dev, child, type,
|
||||
rid, r));
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
rl = &dinfo->resources;
|
||||
return (resource_list_release(rl, dev, child, type, rid, r));
|
||||
}
|
||||
|
||||
int
|
||||
pci_activate_resource(device_t dev, device_t child, int type, int rid,
|
||||
struct resource *r)
|
||||
|
Reference in New Issue
Block a user