mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-30 12:04:07 +00:00
Add a MD __PCI_BAR_ZERO_VALID which denotes that BARs containing 0
actually specify valid bases that should be treated just as normal. The PCI specifications have no indication that 0 would be a magic value indicating a disabled BAR as commonly used on at least amd64 and i386 but not sparc64. It's unclear what to do in pci_delete_resource() instead of writing 0 to a BAR though as there's no (other) way do disable individual BARs so its decoding is left enabled in case of __PCI_BAR_ZERO_VALID for now. Approved by: re (kib), jhb MFC after: 1 week
This commit is contained in:
parent
fe0dd78965
commit
fada2a867d
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=195808
@ -2352,7 +2352,7 @@ pci_add_map(device_t bus, device_t dev, int reg, struct resource_list *rl,
|
||||
{
|
||||
pci_addr_t base, map, testval;
|
||||
pci_addr_t start, end, count;
|
||||
int barlen, maprange, mapsize, type;
|
||||
int barlen, basezero, maprange, mapsize, type;
|
||||
uint16_t cmd;
|
||||
struct resource *res;
|
||||
|
||||
@ -2365,6 +2365,11 @@ pci_add_map(device_t bus, device_t dev, int reg, struct resource_list *rl,
|
||||
type = SYS_RES_IOPORT;
|
||||
mapsize = pci_mapsize(testval);
|
||||
base = pci_mapbase(map);
|
||||
#ifdef __PCI_BAR_ZERO_VALID
|
||||
basezero = 0;
|
||||
#else
|
||||
basezero = base == 0;
|
||||
#endif
|
||||
maprange = pci_maprange(map);
|
||||
barlen = maprange == 64 ? 2 : 1;
|
||||
|
||||
@ -2393,17 +2398,17 @@ pci_add_map(device_t bus, device_t dev, int reg, struct resource_list *rl,
|
||||
}
|
||||
|
||||
/*
|
||||
* If base is 0, then we have problems. It is best to ignore
|
||||
* such entries for the moment. These will be allocated later if
|
||||
* the driver specifically requests them. However, some
|
||||
* removable busses look better when all resources are allocated,
|
||||
* so allow '0' to be overriden.
|
||||
* If base is 0, then we have problems if this architecture does
|
||||
* not allow that. It is best to ignore such entries for the
|
||||
* moment. These will be allocated later if the driver specifically
|
||||
* requests them. However, some removable busses look better when
|
||||
* all resources are allocated, so allow '0' to be overriden.
|
||||
*
|
||||
* Similarly treat maps whose values is the same as the test value
|
||||
* read back. These maps have had all f's written to them by the
|
||||
* BIOS in an attempt to disable the resources.
|
||||
*/
|
||||
if (!force && (base == 0 || map == testval))
|
||||
if (!force && (basezero || map == testval))
|
||||
return (barlen);
|
||||
if ((u_long)base != base) {
|
||||
device_printf(bus,
|
||||
@ -2440,7 +2445,7 @@ pci_add_map(device_t bus, device_t dev, int reg, struct resource_list *rl,
|
||||
}
|
||||
|
||||
count = 1 << mapsize;
|
||||
if (base == 0 || base == pci_mapbase(testval)) {
|
||||
if (basezero || base == pci_mapbase(testval)) {
|
||||
start = 0; /* Let the parent decide. */
|
||||
end = ~0ULL;
|
||||
} else {
|
||||
@ -3683,6 +3688,7 @@ pci_delete_resource(device_t dev, device_t child, int type, int rid)
|
||||
return;
|
||||
}
|
||||
|
||||
#ifndef __PCI_BAR_ZERO_VALID
|
||||
/*
|
||||
* If this is a BAR, clear the BAR so it stops
|
||||
* decoding before releasing the resource.
|
||||
@ -3693,6 +3699,7 @@ pci_delete_resource(device_t dev, device_t child, int type, int rid)
|
||||
pci_write_bar(child, rid, 0);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
bus_release_resource(dev, type, rid, rle->res);
|
||||
}
|
||||
resource_list_delete(rl, type, rid);
|
||||
|
@ -48,6 +48,8 @@
|
||||
|
||||
#ifndef _NO_NAMESPACE_POLLUTION
|
||||
|
||||
#define __PCI_BAR_ZERO_VALID
|
||||
|
||||
#ifndef _MACHINE_PARAM_H_
|
||||
#define _MACHINE_PARAM_H_
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user