move out i440fx smram operation into dev-i440fx.c. Signed-off-by: Isaku Yamahata <yamah...@valinux.co.jp> --- src/dev-i440fx.c | 8 ++++++++ src/dev-i440fx.h | 1 + src/post.h | 5 +++++ src/smm.c | 17 ++++++++++++----- 4 files changed, 26 insertions(+), 5 deletions(-)
diff --git a/src/dev-i440fx.c b/src/dev-i440fx.c index 17d42ce..c9e0c3e 100644 --- a/src/dev-i440fx.c +++ b/src/dev-i440fx.c @@ -26,6 +26,14 @@ void i440fx_shadow_detected(u16 bdf, void *arg) pam_regs->pam0 = I440FX_PAM0; } +#define I440FX_SMRAM 0x72 + +void i440fx_smram_detected(u16 bdf, void *arg) +{ + struct smram_regs *smram_regs = arg; + smram_regs->smram = I440FX_SMRAM; +} + /* PIIX3/PIIX4 PCI to ISA bridge */ void piix_isa_bridge_init(u16 bdf, void *arg) { diff --git a/src/dev-i440fx.h b/src/dev-i440fx.h index 934e7f2..6250c5e 100644 --- a/src/dev-i440fx.h +++ b/src/dev-i440fx.h @@ -4,6 +4,7 @@ #include "types.h" // u16 void i440fx_shadow_detected(u16 bdf, void *arg); +void i440fx_smram_detected(u16 bdf, void *arg); void piix_isa_bridge_init(u16 bdf, void *arg); void piix_ide_init(u16 bdf, void *arg); void piix4_pm_init(u16 bdf, void *arg); diff --git a/src/post.h b/src/post.h index 2996878..c82ee8f 100644 --- a/src/post.h +++ b/src/post.h @@ -16,4 +16,9 @@ struct apmc_ops void (*enable)(u16 bdf); }; +struct smram_regs +{ + u32 smram; +}; + #endif /* __POST_H */ diff --git a/src/smm.c b/src/smm.c index baa272f..4518d95 100644 --- a/src/smm.c +++ b/src/smm.c @@ -81,6 +81,13 @@ static const struct pci_device_id apmc_ops_tbl[] = { PCI_DEVICE_END, }; +static const struct pci_device_id smram_tbl[] = { + PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82441, + i440fx_smram_detected), + + PCI_DEVICE_END, +}; + void smm_init(void) { @@ -98,9 +105,9 @@ smm_init(void) if (bdf < 0) // Device not found return; - int i440_bdf = pci_find_device(PCI_VENDOR_ID_INTEL - , PCI_DEVICE_ID_INTEL_82441); - if (i440_bdf < 0) + struct smram_regs smram_regs; + int smram_bdf = pci_find_init_device(smram_tbl, &smram_regs); + if (smram_bdf < 0) return; /* check if SMM init is already done */ @@ -108,7 +115,7 @@ smm_init(void) return; /* enable the SMM memory window */ - pci_config_writeb(i440_bdf, 0x72, 0x02 | 0x48); + pci_config_writeb(smram_bdf, smram_regs.smram, 0x02 | 0x48); /* save original memory content */ memcpy((void *)BUILD_SMM_ADDR, (void *)BUILD_SMM_INIT_ADDR, BUILD_SMM_SIZE); @@ -139,5 +146,5 @@ smm_init(void) wbinvd(); /* close the SMM memory window and enable normal SMM */ - pci_config_writeb(i440_bdf, 0x72, 0x02 | 0x08); + pci_config_writeb(smram_bdf, smram_regs.smram, 0x02 | 0x08); } -- 1.7.1.1