[coreboot] Patch set updated for coreboot: ed38bcd pcie init: move to romstage

Siyuan Wang (wangsiyuanbuaa@gmail.com) gerrit at coreboot.org
Mon Oct 22 14:55:58 CEST 2012


Siyuan Wang (wangsiyuanbuaa at gmail.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/1593

-gerrit

commit ed38bcd0fdde9052e7e71cd4cd9594f0a5ed049d
Author: Siyuan Wang <wangsiyuanbuaa at gmail.com>
Date:   Mon Oct 22 22:10:33 2012 +0800

    pcie init: move to romstage
    
    We move 2 cimx wrappers to romstage: Pcie_Early_Init, Pcie_Late_Init
    The reasons we do these changes are:
    1) The pcie bridge with devices shoud be on and without devices should
    be off before device enumerate.
    2) Now, the code do pcie training in device enable. So the pcie bridge
    is scanned whether there is a device or not. This could lead to some
    errors. For example: coreboot scans device tree twice and gets two
    different VGA devices, so the VGA bios could not be loaded correctly.
    
    Change-Id: I4bb6b54823cd08eae94b224130b46cc20b3ec43f
    Signed-off-by: Siyuan Wang <SiYuan.Wang at amd.com>
    Signed-off-by: Siyuan Wang <wangsiyuanbuaa at gmail.com>
---
 src/northbridge/amd/cimx/rd890/early.c   |  10 ++
 src/northbridge/amd/cimx/rd890/late.c    | 159 +++++--------------------------
 src/northbridge/amd/cimx/rd890/nb_cimx.h |  12 ++-
 3 files changed, 41 insertions(+), 140 deletions(-)

diff --git a/src/northbridge/amd/cimx/rd890/early.c b/src/northbridge/amd/cimx/rd890/early.c
index 8008223..1b325d3 100644
--- a/src/northbridge/amd/cimx/rd890/early.c
+++ b/src/northbridge/amd/cimx/rd890/early.c
@@ -111,3 +111,13 @@ void nb_S3_Init(void)
 {
 	//TODO
 }
+
+void nb_Pcie_Early_Init(AMD_NB_CONFIG_BLOCK *pConfig)
+{
+	LibSystemApiCall(AmdPcieEarlyInit, pConfig);
+}
+
+void nb_Pcie_Late_Init(AMD_NB_CONFIG_BLOCK *pConfig)
+{
+	LibSystemApiCall(AmdPcieLateInit, pConfig);
+}
diff --git a/src/northbridge/amd/cimx/rd890/late.c b/src/northbridge/amd/cimx/rd890/late.c
index 33da2b4..cefa684 100644
--- a/src/northbridge/amd/cimx/rd890/late.c
+++ b/src/northbridge/amd/cimx/rd890/late.c
@@ -27,150 +27,41 @@
 #include "nb_cimx.h"
 #include "rd890_cfg.h"
 
-
-/**
- * Global RD890 CIMX Configuration structure
- */
-static NB_CONFIG nb_cfg[MAX_NB_COUNT];
-static HT_CONFIG ht_cfg[MAX_NB_COUNT];
-static PCIE_CONFIG pcie_cfg[MAX_NB_COUNT];
-static AMD_NB_CONFIG_BLOCK gConfig;
-
-
-/**
- * Reset PCIE Cores, Training the Ports selected by port_enable of devicetree
- * After this call EP are fully operational on particular NB
- */
-void nb_Pcie_Early_Init(void)
-{
-	LibSystemApiCall(AmdPcieEarlyInit, &gConfig); //AmdPcieEarlyInit(&gConfig);
-}
-
-void nb_Pcie_Late_Init(void)
+void nb_Early_Post_Init(AMD_NB_CONFIG_BLOCK *pConfig)
 {
-	LibSystemApiCall(AmdPcieLateInit, &gConfig);
+	LibSystemApiCall(AmdEarlyPostInit, pConfig);
 }
 
-void nb_Early_Post_Init(void)
+void nb_Mid_Post_Init(AMD_NB_CONFIG_BLOCK *pConfig)
 {
-	LibSystemApiCall(AmdEarlyPostInit, &gConfig);
+	LibSystemApiCall(AmdMidPostInit, pConfig);
 }
 
-void nb_Mid_Post_Init(void)
+void nb_Late_Post_Init(AMD_NB_CONFIG_BLOCK *pConfig)
 {
-	LibSystemApiCall(AmdMidPostInit, &gConfig);
-}
-
-void nb_Late_Post_Init(void)
-{
-	LibSystemApiCall(AmdLatePostInit, &gConfig);
+	LibSystemApiCall(AmdLatePostInit, pConfig);
 }
 
 static void rd890_enable(device_t dev)
 {
-	u32 address = 0;
-	u32 mask;
-	u32 val;
-	u32 devfn;
-	u32 port;
-	AMD_NB_CONFIG *NbConfigPtr = NULL;
-
-	u8 nb_index = 0; /* The first IO Hub, TODO: other NBs */
-	address = MAKE_SBDFO(0, 0x0, 0x0, 0x0, 0x0);
-	NbConfigPtr = &(gConfig.Northbridges[nb_index]);
-
-	devfn = dev->path.pci.devfn;
-	port = devfn >> 3;
-	printk(BIOS_INFO, "rd890_enable  ");
-	printk(BIOS_INFO, "Bus-%x Dev-%X Fun-%X, enable=%x\n",
-			0, (devfn >> 3), (devfn & 0x07), dev->enabled);
-	if (port != 0) {
-		if (dev->enabled) {
-			NbConfigPtr->pPcieConfig->PortConfiguration[port].ForcePortDisable = OFF;
-		} else {
-			NbConfigPtr->pPcieConfig->PortConfiguration[port].ForcePortDisable = ON;
-		}
-	}
-
-	switch (port) {
-		case 0x0: /* Root Complex, and ClkConfig */
-
-			if ((devfn & 0x07) == 1) { /* skip dev-0 fun-1 */
-				break;
-			}
-
-			/* CIMX configuration defualt initialize */
-			rd890_cimx_config(&gConfig, &nb_cfg[0], &ht_cfg[0], &pcie_cfg[0]);
-			if (gConfig.StandardHeader.CalloutPtr != NULL) {
-				/* NOTE: not use LibNbCallBack */
-				gConfig.StandardHeader.CalloutPtr(CB_AmdSetPcieEarlyConfig, (u32)dev, (VOID*)NbConfigPtr);
-			}
-			/* Reset PCIE Cores, Training the Ports selected by port_enable of devicetree
-			 * After this call EP are fully operational on particular NB
-			 */
-			nb_Pcie_Early_Init();
-			break;
-
-		case 0x2: /* Gpp1 Port0 */
-		case 0x3: /* Gpp1 Port1 */
-			mask = ~(1 << port);
-			val = (dev->enabled ? 0 : 1) << port;
-			LibNbPciIndexRMW(address | NB_MISC_INDEX, NB_MISC_REG0C, AccessS3SaveWidth32, mask, val, NbConfigPtr);
-			break;
-
-		case 0x4: /* Gpp3a Port0 */
-		case 0x5: /* Gpp3a Port1 */
-		case 0x6: /* Gpp3a Port2 */
-		case 0x7: /* Gpp3a Port3 */
-			mask = ~(1 << port);
-			val = (dev->enabled ? 0 : 1) << port;
-			LibNbPciIndexRMW(address | NB_MISC_INDEX, NB_MISC_REG0C, AccessS3SaveWidth32, mask, val, NbConfigPtr);
-			break;
-
-		case 0x8: /* SB ALink */
-			mask = ~(1 << 6);
-			val = (dev->enabled ? 1 : 0) << 6;
-			LibNbPciIndexRMW(address | NB_MISC_INDEX, NB_MISC_REG0C, AccessS3SaveWidth32, mask, val, NbConfigPtr);
-			break;
-
-		case 0x9: /* Gpp3a Port4 */
-		case 0xa: /* Gpp3a Port5 */
-			mask = ~(1 << (7 + port));
-			val = (dev->enabled ? 0 : 1) << (7 + port);
-			LibNbPciIndexRMW(address | NB_MISC_INDEX, NB_MISC_REG0C, AccessS3SaveWidth32, mask, val, NbConfigPtr);
-			break;
-
-		case 0xb: /* Gpp2 Port0 */
-		case 0xc: /* Gpp2 Port1 */
-			mask = ~(1 << (7 + port));
-			val = (dev->enabled ? 0 : 1) << (7 + port);
-			LibNbPciIndexRMW(address | NB_MISC_INDEX, NB_MISC_REG0C, AccessS3SaveWidth32, mask, val, NbConfigPtr);
-			break;
-
-		case 0xd: /* Gpp3b */
-			mask = ~(1 << (7 + port));
-			val = (dev->enabled ? 0 : 1) << (7 + port);
-			LibNbPciIndexRMW(address | NB_MISC_INDEX, NB_MISC_REG0C, AccessS3SaveWidth32, mask, val, NbConfigPtr);
-
-			/* Init NB at Early Post */
-			if (gConfig.StandardHeader.CalloutPtr != NULL) {
-				gConfig.StandardHeader.CalloutPtr(CB_AmdSetEarlyPostConfig, 0, (VOID*)NbConfigPtr);
-			}
-			nb_Early_Post_Init();//
-			if (gConfig.StandardHeader.CalloutPtr != NULL) {
-				gConfig.StandardHeader.CalloutPtr(CB_AmdSetMidPostConfig, 0, (VOID*)NbConfigPtr);
-			}
-			nb_Mid_Post_Init();
-			nb_Pcie_Late_Init();
-			if (gConfig.StandardHeader.CalloutPtr != NULL) {
-				gConfig.StandardHeader.CalloutPtr(CB_AmdSetLatePostConfig, 0, (VOID*)NbConfigPtr);
-			}
-			nb_Late_Post_Init();
-			break;
-
-		default:
-			printk(BIOS_INFO, "Buggy Device Tree\n");
-			break;
+	NB_CONFIG nb_cfg[MAX_NB_COUNT];
+	HT_CONFIG ht_cfg[MAX_NB_COUNT];
+	PCIE_CONFIG pcie_cfg[MAX_NB_COUNT];
+	AMD_NB_CONFIG_BLOCK gConfig;
+	u32 devfn = dev->path.pci.devfn;
+
+	/* only do Post init once */
+	if(devfn == 0)
+	{
+		printk(BIOS_INFO, "cimx Post init start...\n");
+		rd890_cimx_config(&gConfig, &nb_cfg[0], &ht_cfg[0], &pcie_cfg[0]);
+		nb_platform_config(&gConfig);
+
+		//nb_Pcie_Late_Init(&gConfig);
+		nb_Early_Post_Init(&gConfig);
+		nb_Mid_Post_Init(&gConfig);
+		nb_Late_Post_Init(&gConfig);
+		printk(BIOS_INFO, "cimx Post init exit...\n");
 	}
 }
 
@@ -179,7 +70,6 @@ struct chip_operations northbridge_amd_cimx_rd890_ops = {
 	.enable_dev = rd890_enable,
 };
 
-
 static void ioapic_init(struct device *dev)
 {
 	u32 ioapic_base;
@@ -196,7 +86,6 @@ static void rd890_read_resource(struct device *dev)
 	/* rpr6.2.(1). Write the Base Address Register (BAR) */
 	pci_write_config32(dev, 0xF8, 0x1); /* set IOAPIC's index as 1 and make sure no one changes it. */
 	pci_get_resource(dev, 0xFC); /* APIC located in sr5690 */
-
 	compact_resources(dev);
 }
 
diff --git a/src/northbridge/amd/cimx/rd890/nb_cimx.h b/src/northbridge/amd/cimx/rd890/nb_cimx.h
index a6f77db..65dcbc3 100644
--- a/src/northbridge/amd/cimx/rd890/nb_cimx.h
+++ b/src/northbridge/amd/cimx/rd890/nb_cimx.h
@@ -20,6 +20,8 @@
 #ifndef _NB_CIMX_H_
 #define _NB_CIMX_H_
 
+#include "NbPlatform.h"
+
 /**
  * @brief disable GPP1 Port0,1, GPP2, GPP3a Port0,1,2,3,4,5, GPP3b
  *
@@ -34,11 +36,11 @@ void sr56x0_rd890_disable_pcie_bridge(void);
 void nb_Poweron_Init(void);
 void nb_Ht_Init(void);
 void nb_S3_Init(void);
-void nb_Early_Post_Init(void);
-void nb_Mid_Post_Init(void);
-void nb_Late_Post_Init(void);
-void nb_Pcie_Early_Init(void);
-void nb_Pcie_Late_Init(void);
+void nb_Pcie_Early_Init(AMD_NB_CONFIG_BLOCK *pConfig);
+void nb_Pcie_Late_Init(AMD_NB_CONFIG_BLOCK *pConfig);
+void nb_Early_Post_Init(AMD_NB_CONFIG_BLOCK *pConfig);
+void nb_Mid_Post_Init(AMD_NB_CONFIG_BLOCK *pConfig);
+void nb_Late_Post_Init(AMD_NB_CONFIG_BLOCK *pConfig);
 
 #endif//_RD890_EARLY_H_
 




More information about the coreboot mailing list