summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/device/device_util.c10
-rw-r--r--src/device/pci_device.c6
-rw-r--r--src/device/pciexp_device.c1
-rw-r--r--src/include/device/device.h4
4 files changed, 20 insertions, 1 deletions
diff --git a/src/device/device_util.c b/src/device/device_util.c
index 809748465f..45dbccc28d 100644
--- a/src/device/device_util.c
+++ b/src/device/device_util.c
@@ -5,6 +5,7 @@
#include <device/path.h>
#include <device/pci_def.h>
#include <device/resource.h>
+#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
@@ -939,6 +940,15 @@ const char *dev_path_name(enum device_path_type type)
return type_name;
}
+bool dev_path_hotplug(const struct device *dev)
+{
+ for (dev = dev->bus->dev; dev != dev->bus->dev; dev = dev->bus->dev) {
+ if (dev->hotplug_port)
+ return true;
+ }
+ return false;
+}
+
void log_resource(const char *type, const struct device *dev, const struct resource *res,
const char *srcfile, const int line)
{
diff --git a/src/device/pci_device.c b/src/device/pci_device.c
index 232328dca8..52107f2fd3 100644
--- a/src/device/pci_device.c
+++ b/src/device/pci_device.c
@@ -164,8 +164,12 @@ struct resource *pci_get_resource(struct device *dev, unsigned long index)
/* A Memory mapped base address. */
attr &= PCI_BASE_ADDRESS_MEM_ATTR_MASK;
resource->flags |= IORESOURCE_MEM;
- if (attr & PCI_BASE_ADDRESS_MEM_PREFETCH)
+ if (attr & PCI_BASE_ADDRESS_MEM_PREFETCH) {
resource->flags |= IORESOURCE_PREFETCH;
+ if (CONFIG(PCIEXP_HOTPLUG_PREFETCH_MEM_ABOVE_4G)
+ && dev_path_hotplug(dev))
+ resource->flags |= IORESOURCE_ABOVE_4G;
+ }
attr &= PCI_BASE_ADDRESS_MEM_LIMIT_MASK;
if (attr == PCI_BASE_ADDRESS_MEM_LIMIT_32) {
/* 32bit limit. */
diff --git a/src/device/pciexp_device.c b/src/device/pciexp_device.c
index c8ac391c06..6023497241 100644
--- a/src/device/pciexp_device.c
+++ b/src/device/pciexp_device.c
@@ -646,6 +646,7 @@ static struct device_operations pciexp_hotplug_dummy_ops = {
void pciexp_hotplug_scan_bridge(struct device *dev)
{
+ dev->hotplug_port = 1;
dev->hotplug_buses = CONFIG_PCIEXP_HOTPLUG_BUSES;
/* Normal PCIe Scan */
diff --git a/src/include/device/device.h b/src/include/device/device.h
index 43ac66dc0f..cd08f1db68 100644
--- a/src/include/device/device.h
+++ b/src/include/device/device.h
@@ -128,6 +128,7 @@ struct device {
unsigned int hidden : 1;
/* set if this device is used even in minimum PCI cases */
unsigned int mandatory : 1;
+ unsigned int hotplug_port : 1;
u8 command;
uint16_t hotplug_buses; /* Number of hotplug buses to allocate */
@@ -207,6 +208,9 @@ void add_more_links(struct device *dev, unsigned int total_links);
bool is_dev_enabled(const struct device *const dev);
bool is_devfn_enabled(unsigned int devfn);
+/* Returns whether there is a hotplug port on the path to the given device. */
+extern bool dev_path_hotplug(const struct device *);
+
/* Option ROM helper functions */
void run_bios(struct device *dev, unsigned long addr);