aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWojciech Macek <wma@FreeBSD.org>2021-04-09 07:28:44 +0000
committerWojciech Macek <wma@FreeBSD.org>2021-04-09 07:37:59 +0000
commit243000b19f8b4ab104b584b2d16bc6aa9131c9b5 (patch)
treedc42186c50cb41e3fd6fba147d32687d9aa42844
parent6dadf78f115cbdcb17dff8974a2044dd5129f7dc (diff)
downloadsrc-243000b19f8b4ab104b584b2d16bc6aa9131c9b5.tar.gz
src-243000b19f8b4ab104b584b2d16bc6aa9131c9b5.zip
pci_dw: Trim ATU windows bigger than 4GB
The size of the ATU MEM/IO windows is implicitly casted to uint32_t. Because of that some window sizes were silently demoted to 0 and ignored. Check the size if its too large, trim it to 4GB and print a warning message. Submitted by: Kornel Duleba <mindal@semihalf.com> Reviewed by: mw Obtained from: Semihalf Sponsored by: Marvell Differential revision: https://reviews.freebsd.org/D29625
-rw-r--r--sys/dev/pci/pci_dw.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/sys/dev/pci/pci_dw.c b/sys/dev/pci/pci_dw.c
index 161a68d2929d..f0aae5bf8418 100644
--- a/sys/dev/pci/pci_dw.c
+++ b/sys/dev/pci/pci_dw.c
@@ -342,6 +342,18 @@ pci_dw_decode_ranges(struct pci_dw_softc *sc, struct ofw_pci_range *ranges,
" Not all required ranges are found in DT\n");
return (ENXIO);
}
+ if (sc->io_range.size > UINT32_MAX) {
+ device_printf(sc->dev,
+ "ATU IO window size is too large. Up to 4GB windows "
+ "are supported, trimming window size to 4GB\n");
+ sc->io_range.size = UINT32_MAX;
+ }
+ if (sc->mem_range.size > UINT32_MAX) {
+ device_printf(sc->dev,
+ "ATU MEM window size is too large. Up to 4GB windows "
+ "are supported, trimming window size to 4GB\n");
+ sc->mem_range.size = UINT32_MAX;
+ }
return (0);
}