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>
This commit is contained in:
Tim Wawrzynczak 2021-04-29 09:45:59 -06:00
parent d87bbde169
commit 93982c3a6e
6 changed files with 25 additions and 59 deletions

View File

@ -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);

View File

@ -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);
}

View File

@ -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 */

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}