summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTim Wawrzynczak <twawrzynczak@chromium.org>2021-04-29 09:45:59 -0600
committerTim Wawrzynczak <twawrzynczak@chromium.org>2021-05-03 16:28:42 +0000
commit93982c3a6ede0bdb8dd0e94597e4de7b09406947 (patch)
tree8c058b87b2adcd220d41a3530742c67b2426161e /src
parentd87bbde169f84b8c723b0d5289f39df164251b52 (diff)
downloadcoreboot-93982c3a6ede0bdb8dd0e94597e4de7b09406947.tar.gz
coreboot-93982c3a6ede0bdb8dd0e94597e4de7b09406947.tar.bz2
coreboot-93982c3a6ede0bdb8dd0e94597e4de7b09406947.zip
device: Switch pci_dev_is_wake_source to take pci_devfn_t
With the recent switch to SMM module loader v2, the size of the SMM for module google/volteer increased to above 64K in size, and thus failed to install the permanent SMM handler. Turns out, the devicetree is all pulled into the SMM build because of elog, which calls `pci_dev_is_wake_source`, and is the only user of `struct device` in SMM. Changing this function to take a pci_devfn_t instead allows the linker to remove almost the entire devicetree from SMM (only usage left is when disabling HECI via SMM). BUG=b:186661594 TEST=Verify loaded program size of `smm.elf` for google/volteer is almost ~50% smaller. Signed-off-by: Tim Wawrzynczak <twawrzynczak@chromium.org> Change-Id: I4c39e5188321c8711d6479b15065e5aaedad8f38 Reviewed-on: https://review.coreboot.org/c/coreboot/+/52765 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Furquan Shaikh <furquan@google.com>
Diffstat (limited to 'src')
-rw-r--r--src/device/pci_ops.c9
-rw-r--r--src/drivers/wifi/generic/generic.c2
-rw-r--r--src/include/device/pci_ops.h2
-rw-r--r--src/soc/intel/alderlake/elog.c28
-rw-r--r--src/soc/intel/jasperlake/elog.c14
-rw-r--r--src/soc/intel/tigerlake/elog.c29
6 files changed, 25 insertions, 59 deletions
diff --git a/src/device/pci_ops.c b/src/device/pci_ops.c
index aaa9f95fb1f4..76d5e96aec54 100644
--- a/src/device/pci_ops.c
+++ b/src/device/pci_ops.c
@@ -79,19 +79,16 @@ void __noreturn pcidev_die(void)
die("PCI: dev is NULL!\n");
}
-bool pci_dev_is_wake_source(const struct device *dev)
+bool pci_dev_is_wake_source(pci_devfn_t dev)
{
unsigned int pm_cap;
uint16_t pmcs;
- if (dev->path.type != DEVICE_PATH_PCI)
- return false;
-
- pm_cap = pci_find_capability(dev, PCI_CAP_ID_PM);
+ pm_cap = pci_s_find_capability(dev, PCI_CAP_ID_PM);
if (!pm_cap)
return false;
- pmcs = pci_s_read_config16(PCI_BDF(dev), pm_cap + PCI_PM_CTRL);
+ pmcs = pci_s_read_config16(dev, pm_cap + PCI_PM_CTRL);
/* PCI Device is a wake source if PME_ENABLE and PME_STATUS are set in PMCS register. */
return (pmcs & PCI_PM_CTRL_PME_ENABLE) && (pmcs & PCI_PM_CTRL_PME_STATUS);
diff --git a/src/drivers/wifi/generic/generic.c b/src/drivers/wifi/generic/generic.c
index 5429f6ba4533..1ee7ab23eedc 100644
--- a/src/drivers/wifi/generic/generic.c
+++ b/src/drivers/wifi/generic/generic.c
@@ -10,7 +10,7 @@
static void wifi_pci_dev_init(struct device *dev)
{
- if (pci_dev_is_wake_source(dev))
+ if (pci_dev_is_wake_source(PCI_BDF(dev)))
elog_add_event_wake(ELOG_WAKE_SOURCE_PME_WIFI, 0);
}
diff --git a/src/include/device/pci_ops.h b/src/include/device/pci_ops.h
index 7fe7d429e2fb..a1678255c451 100644
--- a/src/include/device/pci_ops.h
+++ b/src/include/device/pci_ops.h
@@ -215,6 +215,6 @@ u16 pci_find_capability(const struct device *dev, u16 cap)
*
* Returns true if PCI device is wake source, false otherwise.
*/
-bool pci_dev_is_wake_source(const struct device *dev);
+bool pci_dev_is_wake_source(pci_devfn_t dev);
#endif /* PCI_OPS_H */
diff --git a/src/soc/intel/alderlake/elog.c b/src/soc/intel/alderlake/elog.c
index 1efba25eed0e..84765d9b586d 100644
--- a/src/soc/intel/alderlake/elog.c
+++ b/src/soc/intel/alderlake/elog.c
@@ -48,11 +48,8 @@ static void pch_log_rp_wake_source(void)
};
for (i = 0; i < MIN(CONFIG_MAX_ROOT_PORTS, ARRAY_SIZE(pme_map)); ++i) {
- const struct device *dev = pcidev_path_on_root(pme_map[i].devfn);
- if (!dev)
- continue;
-
- if (pci_dev_is_wake_source(dev))
+ if (pci_dev_is_wake_source(PCI_DEV(0, PCI_SLOT(pme_map[i].devfn),
+ PCI_FUNC(pme_map[i].devfn))))
elog_add_event_wake(pme_map[i].wake_source, 0);
}
}
@@ -77,11 +74,8 @@ static void pch_log_pme_internal_wake_source(void)
size_t i;
for (i = 0; i < ARRAY_SIZE(ipme_map); i++) {
- const struct device *dev = pcidev_path_on_root(ipme_map[i].devfn);
- if (!dev)
- continue;
-
- if (pci_dev_is_wake_source(dev)) {
+ unsigned int devfn = ipme_map[i].devfn;
+ if (pci_dev_is_wake_source(PCI_DEV(0, PCI_SLOT(devfn), PCI_FUNC(devfn)))) {
elog_add_event_wake(ipme_map[i].wake_source, 0);
dev_found = true;
}
@@ -89,11 +83,8 @@ static void pch_log_pme_internal_wake_source(void)
/* Check Thunderbolt ports */
for (i = 0; i < NUM_TBT_FUNCTIONS; i++) {
- const struct device *dev = pcidev_path_on_root(SA_DEVFN_TBT(i));
- if (!dev)
- continue;
-
- if (pci_dev_is_wake_source(dev)) {
+ unsigned int devfn = SA_DEVFN_TBT(i);
+ if (pci_dev_is_wake_source(PCI_DEV(0, PCI_SLOT(devfn), PCI_FUNC(devfn)))) {
elog_add_event_wake(ELOG_WAKE_SOURCE_PME_TBT, i);
dev_found = true;
}
@@ -101,11 +92,8 @@ static void pch_log_pme_internal_wake_source(void)
/* Check DMA devices */
for (i = 0; i < NUM_TCSS_DMA_FUNCTIONS; i++) {
- const struct device *dev = pcidev_path_on_root(SA_DEVFN_TCSS_DMA(i));
- if (!dev)
- continue;
-
- if (pci_dev_is_wake_source(dev)) {
+ unsigned int devfn = SA_DEVFN_TCSS_DMA(i);
+ if (pci_dev_is_wake_source(PCI_DEV(0, PCI_SLOT(devfn), PCI_FUNC(devfn)))) {
elog_add_event_wake(ELOG_WAKE_SOURCE_PME_TCSS_DMA, i);
dev_found = true;
}
diff --git a/src/soc/intel/jasperlake/elog.c b/src/soc/intel/jasperlake/elog.c
index ccf6fd048b75..858b3714d4ed 100644
--- a/src/soc/intel/jasperlake/elog.c
+++ b/src/soc/intel/jasperlake/elog.c
@@ -48,11 +48,8 @@ static void pch_log_rp_wake_source(void)
};
for (i = 0; i < MIN(CONFIG_MAX_ROOT_PORTS, ARRAY_SIZE(pme_map)); ++i) {
- const struct device *dev = pcidev_path_on_root(pme_map[i].devfn);
- if (!dev)
- continue;
-
- if (pci_dev_is_wake_source(dev))
+ if (pci_dev_is_wake_source(PCI_DEV(0, PCI_SLOT(pme_map[i].devfn),
+ PCI_FUNC(pme_map[i].devfn))))
elog_add_event_wake(pme_map[i].wake_source, 0);
}
}
@@ -75,11 +72,8 @@ static void pch_log_pme_internal_wake_source(void)
};
for (i = 0; i < ARRAY_SIZE(ipme_map); i++) {
- const struct device *dev = pcidev_path_on_root(ipme_map[i].devfn);
- if (!dev)
- continue;
-
- if (pci_dev_is_wake_source(dev)) {
+ if (pci_dev_is_wake_source(PCI_DEV(0, PCI_SLOT(ipme_map[i].devfn),
+ PCI_FUNC(ipme_map[i].devfn)))) {
elog_add_event_wake(ipme_map[i].wake_source, 0);
dev_found = true;
}
diff --git a/src/soc/intel/tigerlake/elog.c b/src/soc/intel/tigerlake/elog.c
index 878959a9b582..0fccf84d5c6b 100644
--- a/src/soc/intel/tigerlake/elog.c
+++ b/src/soc/intel/tigerlake/elog.c
@@ -48,11 +48,8 @@ static void pch_log_rp_wake_source(void)
};
for (i = 0; i < MIN(CONFIG_MAX_ROOT_PORTS, ARRAY_SIZE(pme_map)); ++i) {
- const struct device *dev = pcidev_path_on_root(pme_map[i].devfn);
- if (!dev)
- continue;
-
- if (pci_dev_is_wake_source(dev))
+ if (pci_dev_is_wake_source(PCI_DEV(0, PCI_SLOT(pme_map[i].devfn),
+ PCI_FUNC(pme_map[i].devfn))))
elog_add_event_wake(pme_map[i].wake_source, 0);
}
}
@@ -76,12 +73,8 @@ static void pch_log_pme_internal_wake_source(void)
size_t i;
for (i = 0; i < ARRAY_SIZE(ipme_map); i++) {
- const struct device *dev =
- pcidev_path_on_root(ipme_map[i].devfn);
- if (!dev)
- continue;
-
- if (pci_dev_is_wake_source(dev)) {
+ if (pci_dev_is_wake_source(PCI_DEV(0, PCI_SLOT(ipme_map[i].devfn),
+ PCI_FUNC(ipme_map[i].devfn)))) {
elog_add_event_wake(ipme_map[i].wake_source, 0);
dev_found = true;
}
@@ -89,11 +82,8 @@ static void pch_log_pme_internal_wake_source(void)
/* Check Thunderbolt ports */
for (i = 0; i < NUM_TBT_FUNCTIONS; i++) {
- const struct device *dev = pcidev_path_on_root(SA_DEVFN_TBT(i));
- if (!dev)
- continue;
-
- if (pci_dev_is_wake_source(dev)) {
+ const unsigned int devfn = SA_DEVFN_TBT(i);
+ if (pci_dev_is_wake_source(PCI_DEV(0, PCI_SLOT(devfn), PCI_FUNC(devfn)))) {
elog_add_event_wake(ELOG_WAKE_SOURCE_PME_TBT, i);
dev_found = true;
}
@@ -101,11 +91,8 @@ static void pch_log_pme_internal_wake_source(void)
/* Check DMA devices */
for (i = 0; i < NUM_TCSS_DMA_FUNCTIONS; i++) {
- const struct device *dev = pcidev_path_on_root(SA_DEVFN_TCSS_DMA(i));
- if (!dev)
- continue;
-
- if (pci_dev_is_wake_source(dev)) {
+ const unsigned int devfn = SA_DEVFN_TCSS_DMA(i);
+ if (pci_dev_is_wake_source(PCI_DEV(0, PCI_SLOT(devfn), PCI_FUNC(devfn)))) {
elog_add_event_wake(ELOG_WAKE_SOURCE_PME_TCSS_DMA, i);
dev_found = true;
}