summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Brown2023-11-02 16:16:19 +0100
committerMichael Brown2023-11-02 16:20:27 +0100
commit1f3a37e342ff110a451afcdf15c75a90e643208d (patch)
tree6816c463a8afc898bf018d2599c82505657541b0
parent[pci] Handle non-zero starting bus in ECAM allocations (diff)
downloadipxe-1f3a37e342ff110a451afcdf15c75a90e643208d.tar.gz
ipxe-1f3a37e342ff110a451afcdf15c75a90e643208d.tar.xz
ipxe-1f3a37e342ff110a451afcdf15c75a90e643208d.zip
[pci] Cache ECAM mapping errors
When an error occurs during ECAM configuration space mapping, preserve the error within the existing cached mapping (instead of invalidating the cached mapping) in order to avoid flooding the debug log with repeated identical mapping errors. Signed-off-by: Michael Brown <mcb30@ipxe.org>
-rw-r--r--src/drivers/bus/ecam.c6
-rw-r--r--src/include/ipxe/ecam.h2
2 files changed, 6 insertions, 2 deletions
diff --git a/src/drivers/bus/ecam.c b/src/drivers/bus/ecam.c
index dd3e1e51..62baebee 100644
--- a/src/drivers/bus/ecam.c
+++ b/src/drivers/bus/ecam.c
@@ -127,7 +127,7 @@ static int ecam_access ( struct pci_device *pci ) {
/* Reuse mapping if possible */
if ( ( pci->busdevfn - ecam.range.start ) < ecam.range.count )
- return 0;
+ return ecam.rc;
/* Clear any existing mapping */
if ( ecam.regs ) {
@@ -145,6 +145,7 @@ static int ecam_access ( struct pci_device *pci ) {
if ( ecam.range.start > pci->busdevfn ) {
DBGC ( &ecam, "ECAM found no allocation for " PCI_FMT "\n",
PCI_ARGS ( pci ) );
+ rc = -ENOENT;
goto err_find;
}
@@ -165,12 +166,13 @@ static int ecam_access ( struct pci_device *pci ) {
DBGC ( &ecam, "ECAM %04x:[%02x-%02x] mapped [%08llx,%08llx) -> %p\n",
le16_to_cpu ( ecam.alloc.segment ), ecam.alloc.start,
ecam.alloc.end, base, ( base + len ), ecam.regs );
+ ecam.rc = 0;
return 0;
iounmap ( ecam.regs );
err_ioremap:
err_find:
- ecam.range.count = 0;
+ ecam.rc = rc;
return rc;
}
diff --git a/src/include/ipxe/ecam.h b/src/include/ipxe/ecam.h
index 683d613a..ff08aee5 100644
--- a/src/include/ipxe/ecam.h
+++ b/src/include/ipxe/ecam.h
@@ -50,6 +50,8 @@ struct ecam_mapping {
struct pci_range range;
/** MMIO base address */
void *regs;
+ /** Mapping result */
+ int rc;
};
extern struct pci_api ecam_api;