Patchwork [4/7] seabios: smm_init: move out i440fx smram operation into dev-i440fx.c

login
register
mail settings
Submitter Isaku Yamahata
Date July 12, 2010, 11:47 a.m.
Message ID <d96300f02be0fbe5a13219a1f822d9a71e8a826d.1278935094.git.yamahata@valinux.co.jp>
Download mbox | patch
Permalink /patch/58606/
State New
Headers show

Comments

Isaku Yamahata - July 12, 2010, 11:47 a.m.
move out i440fx smram operation into dev-i440fx.c.

Signed-off-by: Isaku Yamahata <yamahata@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(-)

Patch

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