[coreboot] Patch set updated for coreboot: d7ac5e1 SMM: Extract function for finding save state node

Stefan Reinauer (stefan.reinauer@coreboot.org) gerrit at coreboot.org
Thu Nov 8 20:31:34 CET 2012


Stefan Reinauer (stefan.reinauer at coreboot.org) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/1763

-gerrit

commit d7ac5e151f995081e92671a78a8652aa0ebc2cb0
Author: Duncan Laurie <dlaurie at chromium.org>
Date:   Wed Oct 3 18:22:16 2012 -0700

    SMM: Extract function for finding save state node
    
    This is currently used by the ELOG GSMI interface but is a
    good way to pass data to SMM so move the current searching code
    to a separate function and make it a bit more versatile with the
    checks it does to find a match so it can be used in other
    situations.
    
    Change-Id: I5b6f92169f77c7707448ec38684cdd53c02fe0a5
    Signed-off-by: Duncan Laurie <dlaurie at chromium.org>
---
 src/southbridge/intel/bd82x6x/smihandler.c | 68 ++++++++++++++++++------------
 1 file changed, 41 insertions(+), 27 deletions(-)

diff --git a/src/southbridge/intel/bd82x6x/smihandler.c b/src/southbridge/intel/bd82x6x/smihandler.c
index 8ed29e4..fb63030 100644
--- a/src/southbridge/intel/bd82x6x/smihandler.c
+++ b/src/southbridge/intel/bd82x6x/smihandler.c
@@ -418,39 +418,53 @@ static void southbridge_smi_sleep(unsigned int node, smm_state_save_area_t *stat
 	}
 }
 
-#if CONFIG_ELOG_GSMI
-static void southbridge_smi_gsmi(void)
+/*
+ * Look for Synchronous IO SMI and use save state from that
+ * core in case we are not running on the same core that
+ * initiated the IO transaction.
+ */
+static em64t101_smm_state_save_area_t *smi_apmc_find_state_save(u64 cmd)
 {
-	em64t101_smm_state_save_area_t *io_smi;
-	u32 base = smi_get_tseg_base() + 0x8000;
-	u32 *ret, *param;
-	u8 sub_command, node;
+	em64t101_smm_state_save_area_t *state;
+	u32 base = smi_get_tseg_base() + 0x8000 + 0x7d00;
+	int node;
 
-	/*
-	 * Check for Synchronous IO SMI and use save state from that
-	 * core in case we are not running on the same core that
-	 * initiated the IO transaction.
-	 */
+	/* Check all nodes looking for the one that issued the IO */
 	for (node = 0; node < CONFIG_MAX_CPUS; node++) {
-		/*
-		 * Look for IO Misc Info:
-		 *  Synchronous bit[0]=1
-		 *  Byte bit[3:1]=1
-		 *  Output bit[7:4]=0
-		 *  APMC port bit[31:16]=0xb2
-		 * RAX[7:0] == 0xEF
-		 */
-		u32 io_want_info = (APM_CNT << 16) | 0x3;
-		io_smi = (em64t101_smm_state_save_area_t *)
-			(base + 0x7d00 - (node * 0x400));
+		state = (em64t101_smm_state_save_area_t *)
+			(base - (node * 0x400));
+
+		/* Check for Synchronous IO (bit0==1) */
+		if (!(state->io_misc_info & (1 << 0)))
+			continue;
+
+		/* Make sure it was a write (bit4==0) */
+		if (state->io_misc_info & (1 << 4))
+			continue;
 
-		if (io_smi->io_misc_info == io_want_info &&
-		    ((u8)io_smi->rax == ELOG_GSMI_APM_CNT))
-			break;
+		/* Check for APMC IO port */
+		if (((state->io_misc_info >> 16) & 0xff) != APM_CNT)
+			continue;
+
+		/* Check AX against the requested command */
+		if (state->rax != cmd)
+			continue;
+
+		return state;
 	}
 
-	/* Did not find matching CPU Save State */
-	if (node == CONFIG_MAX_CPUS)
+	return NULL;
+}
+
+#if CONFIG_ELOG_GSMI
+static void southbridge_smi_gsmi(void)
+{
+	u32 *ret, *param;
+	u8 sub_command;
+	em64t101_smm_state_save_area_t *io_smi =
+		smi_apmc_find_state_save(ELOG_GSMI_APM_CNT);
+
+	if (!io_smi)
 		return;
 
 	/* Command and return value in EAX */




More information about the coreboot mailing list