See patch.
Uwe.
Uwe Hermann wrote:
See patch.
Uwe.
Various code cleanups:
Simplify lots of code, especially msr-related code.
Move struct msrinit declaration into msr.h as we use it quite often and there's no use to duplicate it again and again in each file.
Remove unrequired variable usage (e.g. numEnabled, msrnum, val, port).
Remove useless comments.
Signed-off-by: Uwe Hermann uwe@hermann-uwe.de
The changes look good. I had some problems patching 5536.c so you might want to double check it before you submit it to svn.
Acked-by: Marc Jones marc.jones@amd.com
Index: southbridge/amd/cs5536/stage1.c
--- southbridge/amd/cs5536/stage1.c (Revision 460) +++ southbridge/amd/cs5536/stage1.c (Arbeitskopie) @@ -19,6 +19,7 @@
#include <types.h> #include <msr.h> +#include <lib.h> #include <amd_geodelx.h> #include "cs5536.h"
@@ -43,7 +44,7 @@ struct msr msr;
/* Forward MSR access to CS5536_GLINK_PORT_NUM to CS5536_DEV_NUM. */
- msr.hi = msr.lo = 0x00000000;
msr.hi = msr.lo = 0;
/* TODO: unsigned char -> u8? */
#if CS5536_GLINK_PORT_NUM <= 4 @@ -88,6 +89,14 @@ } }
+static const struct msrinit msr_table[] = {
- {MDD_LBAR_SMB, {.hi = 0x0000f001, .lo = SMBUS_IO_BASE}},
- {MDD_LBAR_GPIO, {.hi = 0x0000f001, .lo = GPIO_IO_BASE}},
- {MDD_LBAR_MFGPT, {.hi = 0x0000f001, .lo = MFGPT_IO_BASE}},
- {MDD_LBAR_ACPI, {.hi = 0x0000f001, .lo = ACPI_IO_BASE}},
- {MDD_LBAR_PMS, {.hi = 0x0000f001, .lo = PMS_IO_BASE}},
+};
/**
- Set up I/O bases for SMBus, GPIO, MFGPT, ACPI, and PM.
@@ -97,32 +106,10 @@ */ static void cs5536_setup_iobase(void) {
- struct msr msr;
- int i;
- /* Setup LBAR for SMBus controller. */
- msr.hi = 0x0000f001;
- msr.lo = SMBUS_IO_BASE;
- wrmsr(MDD_LBAR_SMB, msr);
- /* Setup LBAR for GPIO. */
- msr.hi = 0x0000f001;
- msr.lo = GPIO_IO_BASE;
- wrmsr(MDD_LBAR_GPIO, msr);
- /* Setup LBAR for MFGPT. */
- msr.hi = 0x0000f001;
- msr.lo = MFGPT_IO_BASE;
- wrmsr(MDD_LBAR_MFGPT, msr);
- /* Setup LBAR for ACPI. */
- msr.hi = 0x0000f001;
- msr.lo = ACPI_IO_BASE;
- wrmsr(MDD_LBAR_ACPI, msr);
- /* Setup LBAR for PM support. */
- msr.hi = 0x0000f001;
- msr.lo = PMS_IO_BASE;
- wrmsr(MDD_LBAR_PMS, msr);
- for (i = 0; i < ARRAY_SIZE(msr_table); i++)
wrmsr(msr_table[i].msrnum, msr_table[i].msr);
}
/** Index: southbridge/amd/cs5536/cs5536.c =================================================================== --- southbridge/amd/cs5536/cs5536.c (Revision 460) +++ southbridge/amd/cs5536/cs5536.c (Arbeitskopie) @@ -29,13 +29,8 @@ #include <statictree.h> #include "cs5536.h"
-struct msrinit {
- u32 msrnum;
- struct msr msr;
-};
/* Master configuration register for bus masters */ -static struct msrinit SB_MASTER_CONF_TABLE[] = { +static const struct msrinit SB_MASTER_CONF_TABLE[] = { {USB2_SB_GLD_MSR_CONF, {.hi = 0,.lo = 0x00008f000}}, {ATA_SB_GLD_MSR_CONF, {.hi = 0,.lo = 0x00048f000}}, {AC97_SB_GLD_MSR_CONF, {.hi = 0,.lo = 0x00008f000}}, @@ -44,7 +39,7 @@ };
/* CS5536 clock gating */ -static struct msrinit CS5536_CLOCK_GATING_TABLE[] = { +static const struct msrinit CS5536_CLOCK_GATING_TABLE[] = { {GLIU_SB_GLD_MSR_PM, {.hi = 0,.lo = 0x000000004}}, {GLPCI_SB_GLD_MSR_PM, {.hi = 0,.lo = 0x000000005}}, {GLCP_SB_GLD_MSR_PM, {.hi = 0,.lo = 0x000000004}}, @@ -99,32 +94,18 @@ */ static void pm_chipset_init(void) {
- u32 val = 0;
- u16 port;
- outl(0x0E00, PMS_IO_BASE + 0x010); /* 1ms */
- port = (PMS_IO_BASE + 0x010);
- val = 0x0E00; /* 1ms */
- outl(val, port);
- /* PM_WKXD */ /* Make sure bits[3:0]=0000b to clear the saved Sx state. */
- port = (PMS_IO_BASE + PM_WKXD);
- val = 0x0A0; /* 5ms */
- outl(val, port);
- outl(0x00A0, PMS_IO_BASE + PM_WKXD); /* 5ms */
- /* PM_WKD */
- port = (PMS_IO_BASE + PM_WKD);
- outl(val, port);
- outl(0x00A0, PMS_IO_BASE + PM_WKD);
- /* PM_SED */
- port = (PMS_IO_BASE + PM_SED);
- val = 0x04601; /* 5ms, # of 3.57954MHz clock edges */
- outl(val, port);
- /* 5ms, # of 3.57954MHz clock edges */
- outl(0x4601, PMS_IO_BASE + PM_SED);
- /* PM_SIDD */
- port = (PMS_IO_BASE + PM_SIDD);
- val = 0x08C02; /* 10ms, # of 3.57954MHz clock edges */
- outl(val, port);
- /* 10ms, # of 3.57954MHz clock edges */
- outl(0x8C02, PMS_IO_BASE + PM_SIDD);
}
/** @@ -136,7 +117,6 @@ { int i; struct msr msr;
int numEnabled = 0;
printk(BIOS_DEBUG, "chipset_flash_setup: Start\n"); for (i = 0; i < ARRAY_SIZE(FlashInitTable); i++) {
@@ -164,9 +144,6 @@ printk(BIOS_DEBUG, "MSR(0x%08X, %08X_%08X)\n", MDD_NORF_CNTRL, msr.hi, msr.lo); wrmsr(MDD_NORF_CNTRL, msr);
/* Update the number enabled. */
} } printk(BIOS_DEBUG, "chipset_flash_setup: Finish\n");numEnabled++;
@@ -253,6 +230,7 @@
dev = dev_find_device(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CS5536_ISA, 0);
- gpio_addr = pci_read_config32(dev, PCI_BASE_ADDRESS_1); gpio_addr &= ~1; /* Clear I/O bit */ printk(BIOS_DEBUG, "GPIO_ADDR: %08X\n", gpio_addr);
@@ -440,16 +418,14 @@ *(bar + UOCMUX) &= PUEN_SET;
/* Host or Device? */
if (sb->enable_USBP4_device) {
if (sb->enable_USBP4_device) *(bar + UOCMUX) |= PMUX_DEVICE;
} else {
else *(bar + UOCMUX) |= PMUX_HOST;
}
/* Overcurrent configuration */
if (sb->enable_USBP4_overcurrent) {
if (sb->enable_USBP4_overcurrent) *(bar + UOCCAP) |= sb->enable_USBP4_overcurrent;
}
}
/* PBz#6466: If the UOC(OTG) device, port 4, is configured as a
@@ -478,15 +454,13 @@ /* Disable virtual PCI UDC and OTG headers. */ dev = dev_find_device(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CS5536_UDC, 0);
- if (dev) {
- if (dev) pci_write_config32(dev, 0x7C, 0xDEADBEEF);
}
dev = dev_find_device(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CS5536_OTG, 0);
if (dev) {
- if (dev) pci_write_config32(dev, 0x7C, 0xDEADBEEF);
- }
}
/** @@ -502,9 +476,8 @@ { struct device *dev; struct msr msr;
- u32 msrnum; struct southbridge_amd_cs5536_config *sb;
- struct msrinit *csi;
const struct msrinit *csi;
post_code(P80_CHIPSET_INIT); dev = dev_find_device(PCI_VENDOR_ID_AMD,
@@ -520,7 +493,7 @@ if (!IsS3Resume()) { struct acpi_init *aci = acpi_init_table;
for (; aci->ioreg; aci++) {
}for (/* Nothing */; aci->ioreg; aci++) { outl(aci->regdata, aci->ioreg); inl(aci->ioreg);
@@ -535,22 +508,20 @@ /* Allow I/O reads and writes during a ATA DMA operation. This could * be done in the HD ROM but do it here for easier debugging. */
- msrnum = ATA_SB_GLD_MSR_ERR;
- msr = rdmsr(msrnum);
- msr = rdmsr(ATA_SB_GLD_MSR_ERR); msr.lo &= ~0x100;
- wrmsr(msrnum, msr);
wrmsr(ATA_SB_GLD_MSR_ERR, msr);
/* Enable post primary IDE. */
- msrnum = GLPCI_SB_CTRL;
- msr = rdmsr(msrnum);
- msr = rdmsr(GLPCI_SB_CTRL); msr.lo |= GLPCI_CRTL_PPIDE_SET;
- wrmsr(msrnum, msr);
wrmsr(GLPCI_SB_CTRL, msr);
csi = SB_MASTER_CONF_TABLE; for (/* Nothing */; csi->msrnum; csi++) { msr.lo = csi->msr.lo;
msr.hi = csi->msr.hi;
wrmsr(csi->msrnum, msr); /* MSR - see table above */
wrmsr(csi->msrnum, msr);
}
/* Flash BAR size setup. */
@@ -566,7 +537,7 @@ for (/* Nothing */; csi->msrnum; csi++) { msr.lo = csi->msr.lo; msr.hi = csi->msr.hi;
wrmsr(csi->msrnum, msr); /* MSR - see table above */
} }wrmsr(csi->msrnum, msr);
} @@ -601,9 +572,8 @@
printk(BIOS_ERR, "cs5536: %s: enable_ide_nand_flash is %d\n", __FUNCTION__, sb->enable_ide_nand_flash);
- if (sb->enable_ide_nand_flash == 1) {
- if (sb->enable_ide_nand_flash == 1) enable_ide_nand_flash_header();
}
enable_USB_port4(sb);
@@ -633,8 +603,7 @@ */ static void cs5536_pci_dev_enable_resources(struct device *dev) {
- /* TODO: Shouldn't this be BIOS_SPEW? */
- printk(BIOS_ERR, "cs5536: %s()\n", __FUNCTION__);
- printk(BIOS_SPEW, "cs5536: %s()\n", __FUNCTION__); pci_dev_enable_resources(dev); enable_childrens_resources(dev);
} Index: include/arch/x86/msr.h =================================================================== --- include/arch/x86/msr.h (Revision 460) +++ include/arch/x86/msr.h (Arbeitskopie) @@ -21,12 +21,16 @@ #define CPU_X86_MSR_H
/* standard MSR operations, everyone has written these one hundred times */ -struct msr -{ +struct msr { u32 lo; u32 hi; };
+struct msrinit {
u32 msrnum;
struct msr msr;
+};
static inline struct msr rdmsr(u32 index) { struct msr result; Index: northbridge/amd/geodelx/raminit.c =================================================================== --- northbridge/amd/geodelx/raminit.c (Revision 460) +++ northbridge/amd/geodelx/raminit.c (Arbeitskopie) @@ -80,14 +80,17 @@
/* Size = Module Density * Module Banks */ dimm_size = smbus_read_byte(dimm, SPD_BANK_DENSITY);
- /* Align so 1 GB (bit 0) is bit 8. This is a little weird to get gcc
*/ dimm_size |= (dimm_size << 8);
- to not optimize this out.
- /* And off 2 GB DIMM size: not supported and the 1 GB size we just
*/ dimm_size &= 0x01FC;
- moved up to bit 8 as well as all the extra on top.
- /* Module Density * Module Banks */ /* Shift to multiply by the number of DIMM banks. */ dimm_size <<= (dimm_setting >> CF07_UPPER_D0_MB_SHIFT) & 1;
@@ -130,11 +133,11 @@ post_code(ERROR_SET_PAGE); hlt(); }
- spd_byte -= 7; /* If the value is above 6 it means >12 address lines... */
- if (spd_byte > 5) {
- if (spd_byte > 5) spd_byte = 7; /* ...which means >32k so set to disabled. */
- } /* 0 = 1k, 1 = 2k, 2 = 4k, etc. */ dimm_setting |= spd_byte << CF07_UPPER_D0_PSZ_SHIFT;
@@ -181,9 +184,8 @@ #endif
/* Use the slowest DIMM. */
- if (spd_byte0 < spd_byte1) {
- if (spd_byte0 < spd_byte1) spd_byte0 = spd_byte1;
}
/* Turn SPD ns time into MHz. Check what the asm does to this math. */ speed = 2 * ((10000 / (((spd_byte0 >> 4) * 10) + (spd_byte0 & 0x0F))));
@@ -214,22 +216,19 @@
spd_byte0 = smbus_read_byte(dimm0, SPD_REFRESH); spd_byte0 &= 0xF;
- if (spd_byte0 > 5) {
- if (spd_byte0 > 5) spd_byte0 = 5;
} rate0 = REFRESH_RATE[spd_byte0];
spd_byte1 = smbus_read_byte(dimm1, SPD_REFRESH); spd_byte1 &= 0xF;
if (spd_byte1 > 5) {
- if (spd_byte1 > 5) spd_byte1 = 5;
} rate1 = REFRESH_RATE[spd_byte1];
/* Use the faster rate (lowest number). */
if (rate0 > rate1) {
- if (rate0 > rate1) rate0 = rate1;
}
msr = rdmsr(MC_CF07_DATA); msr.lo |= ((rate0 * (geode_link_speed() / 2)) / 16)
@@ -488,14 +487,10 @@ spd_byte1 &= spd_byte0;
msr = rdmsr(MC_CF07_DATA);
- if (spd_byte1 & 1) {
/* Drive Strength Control */
msr.lo |= CF07_LOWER_EMR_DRV_SET;
- }
- if (spd_byte1 & 2) {
/* FET Control */
msr.lo |= CF07_LOWER_EMR_QFC_SET;
- }
- if (spd_byte1 & 1)
msr.lo |= CF07_LOWER_EMR_DRV_SET; /* Drive Strength Control */
- if (spd_byte1 & 2)
wrmsr(MC_CF07_DATA, msr);msr.lo |= CF07_LOWER_EMR_QFC_SET; /* FET Control */
}
@@ -508,15 +503,13 @@
msr = rdmsr(GLCP_DELAY_CONTROLS); msr.hi &= ~(7 << 20); /* Clear bits 54:52. */
- if (geode_link_speed() < 200) {
- if (geode_link_speed() < 200) msr.hi |= 2 << 20;
} wrmsr(GLCP_DELAY_CONTROLS, msr);
msr = rdmsr(MC_CFCLK_DBUG);
msr.hi |=
CFCLK_UPPER_MTST_B2B_DIS_SET | CFCLK_UPPER_MTEST_EN_SET |
CFCLK_UPPER_MTST_RBEX_EN_SET;
- msr.hi |= CFCLK_UPPER_MTST_B2B_DIS_SET | CFCLK_UPPER_MTEST_EN_SET |
msr.lo |= CFCLK_LOWER_TRISTATE_DIS_SET; wrmsr(MC_CFCLK_DBUG, msr);CFCLK_UPPER_MTST_RBEX_EN_SET;
@@ -530,32 +523,27 @@ void sdram_set_registers(void) { struct msr msr;
u32 msrnum;
/* Set Timing Control */
msrnum = MC_CF1017_DATA;
msr = rdmsr(msrnum);
- msr = rdmsr(MC_CF1017_DATA); msr.lo &= ~(7 << CF1017_LOWER_RD_TMG_CTL_SHIFT);
- if (geode_link_speed() < 334) {
- if (geode_link_speed() < 334) msr.lo |= (3 << CF1017_LOWER_RD_TMG_CTL_SHIFT);
- } else {
- else msr.lo |= (4 << CF1017_LOWER_RD_TMG_CTL_SHIFT);
- }
- wrmsr(msrnum, msr);
wrmsr(MC_CF1017_DATA, msr);
/* Set Refresh Staggering */
- msrnum = MC_CF07_DATA;
- msr = rdmsr(msrnum);
- msr = rdmsr(MC_CF07_DATA); msr.lo &= ~0xF0; msr.lo |= 0x40; /* Set refresh to 4 SDRAM clocks. */
- wrmsr(msrnum, msr);
wrmsr(MC_CF07_DATA, msr);
/* Memory Interleave: Set HOI here otherwise default is LOI. */
#if 0
- msrnum = MC_CF8F_DATA;
- msr = rdmsr(msrnum);
- msr = rdmsr(MC_CF8F_DATA); msr.hi |= CF8F_UPPER_HOI_LOI_SET;
- wrmsr(msrnum, msr);
- wrmsr(MC_CF8F_DATA, msr);
#endif }
@@ -636,7 +624,7 @@ */ void sdram_enable(u8 dimm0, u8 dimm1) {
- u32 i, msrnum;
u32 i; struct msr msr;
post_code(POST_MEM_ENABLE);
@@ -658,38 +646,33 @@ }
/* Set CKEs. */
- msrnum = MC_CFCLK_DBUG;
- msr = rdmsr(msrnum);
- msr = rdmsr(MC_CFCLK_DBUG); msr.lo &= ~(CFCLK_LOWER_MASK_CKE_SET0 | CFCLK_LOWER_MASK_CKE_SET1);
- wrmsr(msrnum, msr);
wrmsr(MC_CFCLK_DBUG, msr);
/* Force Precharge All on next command, EMRS. */
- msrnum = MC_CFCLK_DBUG;
- msr = rdmsr(msrnum);
- msr = rdmsr(MC_CFCLK_DBUG); msr.lo |= CFCLK_LOWER_FORCE_PRE_SET;
- wrmsr(msrnum, msr);
wrmsr(MC_CFCLK_DBUG, msr);
/* EMRS to enable DLL (pre-setup done in setExtendedModeRegisters). */
- msrnum = MC_CF07_DATA;
- msr = rdmsr(msrnum);
- msr = rdmsr(MC_CF07_DATA); msr.lo |= CF07_LOWER_PROG_DRAM_SET | CF07_LOWER_LOAD_MODE_DDR_SET;
- wrmsr(msrnum, msr);
- wrmsr(MC_CF07_DATA, msr); msr.lo &= ~(CF07_LOWER_PROG_DRAM_SET | CF07_LOWER_LOAD_MODE_DDR_SET);
- wrmsr(msrnum, msr);
wrmsr(MC_CF07_DATA, msr);
/* Clear Force Precharge All. */
- msrnum = MC_CFCLK_DBUG;
- msr = rdmsr(msrnum);
- msr = rdmsr(MC_CFCLK_DBUG); msr.lo &= ~CFCLK_LOWER_FORCE_PRE_SET;
- wrmsr(msrnum, msr);
wrmsr(MC_CFCLK_DBUG, msr);
/* MRS Reset DLL - set. */
- msrnum = MC_CF07_DATA;
- msr = rdmsr(msrnum);
- msr = rdmsr(MC_CF07_DATA); msr.lo |= CF07_LOWER_PROG_DRAM_SET | CF07_LOWER_LOAD_MODE_DLL_RESET;
- wrmsr(msrnum, msr);
- wrmsr(MC_CF07_DATA, msr); msr.lo &= ~(CF07_LOWER_PROG_DRAM_SET | CF07_LOWER_LOAD_MODE_DLL_RESET);
- wrmsr(msrnum, msr);
wrmsr(MC_CF07_DATA, msr);
/* 2us delay (200 clocks @ 200Mhz). We probably really don't need
- this but... better safe.
@@ -701,59 +684,52 @@ while (!(~inb(0x61)));
/* Force Precharge All on the next command, auto-refresh. */
- msrnum = MC_CFCLK_DBUG;
- msr = rdmsr(msrnum);
- msr = rdmsr(MC_CFCLK_DBUG); msr.lo |= CFCLK_LOWER_FORCE_PRE_SET;
- wrmsr(msrnum, msr);
wrmsr(MC_CFCLK_DBUG, msr);
/* Manually AUTO refresh #1. If auto refresh was not enabled above we
- would need to do 8 refreshes to prime the pump before these 2.
*/
- msrnum = MC_CF07_DATA;
- msr = rdmsr(msrnum);
- msr = rdmsr(MC_CF07_DATA); msr.lo |= CF07_LOWER_REF_TEST_SET;
- wrmsr(msrnum, msr);
- wrmsr(MC_CF07_DATA, msr); msr.lo &= ~CF07_LOWER_REF_TEST_SET;
- wrmsr(msrnum, msr);
wrmsr(MC_CF07_DATA, msr);
/* Clear Force Precharge All. */
- msrnum = MC_CFCLK_DBUG;
- msr = rdmsr(msrnum);
- msr = rdmsr(MC_CFCLK_DBUG); msr.lo &= ~CFCLK_LOWER_FORCE_PRE_SET;
- wrmsr(msrnum, msr);
wrmsr(MC_CFCLK_DBUG, msr);
/* Manually AUTO refresh.
- The MC should insert the right delay between the refreshes.
*/
- msrnum = MC_CF07_DATA;
- msr = rdmsr(msrnum);
- msr = rdmsr(MC_CF07_DATA); msr.lo |= CF07_LOWER_REF_TEST_SET;
- wrmsr(msrnum, msr);
- wrmsr(MC_CF07_DATA, msr); msr.lo &= ~CF07_LOWER_REF_TEST_SET;
- wrmsr(msrnum, msr);
wrmsr(MC_CF07_DATA, msr);
/* MRS Reset DLL - clear. */
- msrnum = MC_CF07_DATA;
- msr = rdmsr(msrnum);
- msr = rdmsr(MC_CF07_DATA); msr.lo |= CF07_LOWER_PROG_DRAM_SET;
- wrmsr(msrnum, msr);
- wrmsr(MC_CF07_DATA, msr); msr.lo &= ~CF07_LOWER_PROG_DRAM_SET;
- wrmsr(msrnum, msr);
wrmsr(MC_CF07_DATA, msr);
/* Allow MC to tristate during idle cycles with MTEST OFF. */
- msrnum = MC_CFCLK_DBUG;
- msr = rdmsr(msrnum);
- msr = rdmsr(MC_CFCLK_DBUG); msr.lo &= ~CFCLK_LOWER_TRISTATE_DIS_SET;
- wrmsr(msrnum, msr);
wrmsr(MC_CFCLK_DBUG, msr);
/* Disable SDCLK DIMM 1 slot if no DIMM installed (to save power). */ msr = rdmsr(MC_CF07_DATA); if ((msr.hi & (7 << CF07_UPPER_D1_PSZ_SHIFT)) == (7 << CF07_UPPER_D1_PSZ_SHIFT)) {
msrnum = GLCP_DELAY_CONTROLS;
msr = rdmsr(msrnum);
msr.hi |= (1 << 23); /* SDCLK bit for 2.0 */msr = rdmsr(GLCP_DELAY_CONTROLS);
wrmsr(msrnum, msr);
wrmsr(GLCP_DELAY_CONTROLS, msr);
}
/* Set PMode0 Sensitivity Counter. */
@@ -762,10 +738,9 @@ wrmsr(MC_CF_PMCTR, msr);
/* Set PMode1 Up delay enable. */
- msrnum = MC_CF1017_DATA;
- msr = rdmsr(msrnum);
- msr = rdmsr(MC_CF1017_DATA); msr.lo |= (209 << 8); /* bits[15:8] = 209 */
- wrmsr(msrnum, msr);
wrmsr(MC_CF1017_DATA, msr);
printk(BIOS_DEBUG, "DRAM controller init done.\n"); post_code(POST_MEM_SETUP_GOOD);
@@ -786,8 +761,7 @@ * Check for failed DLL settings now that we have done a * memory write. */
- msrnum = GLCP_DELAY_CONTROLS;
- msr = rdmsr(msrnum);
- msr = rdmsr(GLCP_DELAY_CONTROLS); if ((msr.lo & 0x7FF) == 0x104) { /* If you had it you would need to clear out the fail boot
- count flag (depending on where it counts from etc).
@@ -799,10 +773,9 @@ */
/* Reset the system. */
msrnum = MDD_SOFT_RESET;
msr = rdmsr(msrnum);
msr.lo |= 1;msr = rdmsr(MDD_SOFT_RESET);
wrmsr(msrnum, msr);
wrmsr(MDD_SOFT_RESET, msr);
}
printk(BIOS_DEBUG, "RAM DLL lock\n");
Index: northbridge/amd/geodelx/geodelx.c
--- northbridge/amd/geodelx/geodelx.c (Revision 460) +++ northbridge/amd/geodelx/geodelx.c (Arbeitskopie) @@ -100,10 +100,7 @@ #define BRIDGE_IO_MASK (IORESOURCE_IO | IORESOURCE_MEM)
/* TODO: Not used!? */ -static const struct msr_defaults {
- u32 msr_no;
- struct msr msr;
-} msr_defaults[] = { +static const struct msrinit msr_defaults[] = { { 0x1700, {.hi = 0,.lo = IM_QWAIT}}, { 0x1800, {.hi = DMCF_WRITE_SERIALIZE_REQUEST, .lo = DMCF_SERIAL_LOAD_MISSES}}, @@ -235,6 +232,7 @@ { struct resource *resource, *last; unsigned int link;
struct bus *bus; u8 line;
last = &dev->resource[dev->resources];
@@ -248,7 +246,6 @@ }
for (link = 0; link < dev->links; link++) {
bus = &dev->link[link]; if (bus->children) { printk(BIOS_DEBUG,struct bus *bus;
@@ -402,9 +399,7 @@ unsigned int max) { printk(BIOS_SPEW, ">> Entering northbridge.c: %s\n", __FUNCTION__);
- max = pci_scan_bus(&dev->link[0], PCI_DEVFN(0, 0), 0xff, max);
- return max;
- return pci_scan_bus(&dev->link[0], PCI_DEVFN(0, 0), 0xff, max);
}
/** Index: northbridge/amd/geodelx/geodelxinit.c =================================================================== --- northbridge/amd/geodelx/geodelxinit.c (Revision 460) +++ northbridge/amd/geodelx/geodelxinit.c (Arbeitskopie) @@ -25,6 +25,9 @@ #include <cpu.h> #include <amd_geodelx.h>
+/* Function prototypes */ +extern int sizeram(void);
struct gliutable { unsigned long desc_name; unsigned short desc_type; @@ -80,11 +83,6 @@
static struct gliutable *gliutables[] = { gliu0table, gliu1table, 0 };
-struct msrinit {
- unsigned long msrnum;
- struct msr msr;
-};
static struct msrinit clock_gating_default[] = { {GLIU0_GLD_MSR_PM, {.hi = 0x00,.lo = 0x0005}}, {MC_GLD_MSR_PM, {.hi = 0x00,.lo = 0x0001}}, @@ -113,8 +111,6 @@ {0x0FFFFFFFF, {0x0FFFFFFFF, 0x0FFFFFFFF}}, };
-extern int sizeram(void);
/**
- Write a GeodeLink MSR.
@@ -126,9 +122,8 @@
msr.lo = gl->lo; msr.hi = gl->hi;
- wrmsr(gl->desc_name, msr); /* MSR - see table above. */
- printk(BIOS_SPEW,
"%s: MSR 0x%08x, val 0x%08x:0x%08x\n",
- wrmsr(gl->desc_name, msr);
- printk(BIOS_SPEW, "%s: MSR 0x%08x, val 0x%08x:0x%08x\n", __FUNCTION__, gl->desc_name, msr.hi, msr.lo);
}
@@ -179,7 +174,7 @@ sizebytes |= 0x100; /* Start at 1 MB. */ msr.lo = sizebytes;
- wrmsr(gl->desc_name, msr); /* MSR - see table above. */
- wrmsr(gl->desc_name, msr); printk(BIOS_DEBUG, "%s: MSR 0x%08x, val 0x%08x:0x%08x\n", __FUNCTION__, gl->desc_name, msr.hi, msr.lo);
} @@ -210,7 +205,7 @@ msr.lo = SMM_OFFSET << 8; msr.lo |= ((~(SMM_SIZE * 1024) + 1) >> 12) & 0xfffff;
- wrmsr(gl->desc_name, msr); /* MSR - See table above. */
- wrmsr(gl->desc_name, msr); printk(BIOS_DEBUG, "%s: MSR 0x%08x, val 0x%08x:0x%08x\n", __FUNCTION__, gl->desc_name, msr.hi, msr.lo);
} @@ -232,7 +227,7 @@ msr.lo = (SMM_OFFSET << 8) & 0xFFF00000; msr.lo |= ((~(SMM_SIZE * 1024) + 1) >> 12) & 0xfffff;
- wrmsr(gl->desc_name, msr); /* MSR - See table above. */
- wrmsr(gl->desc_name, msr); printk(BIOS_DEBUG, "%s: MSR 0x%08x, val 0x%08x:0x%08x\n", __FUNCTION__, gl->desc_name, msr.hi, msr.lo);
} @@ -280,16 +275,16 @@ { struct gliutable *gl = NULL; struct msr msr;
- int i, msrnum, enable_preempt, enable_cpu_override;
int i, enable_preempt, enable_cpu_override; int nic_grants_control, enable_bus_parking;
unsigned long pah, pal;
/* R0 - GLPCI settings for Conventional Memory space. */ msr.hi = (0x09F000 >> 12) << GLPCI_RC_UPPER_TOP_SHIFT; /* 640 */ msr.lo = 0; /* 0 */ msr.lo |= GLPCI_RC_LOWER_EN_SET + GLPCI_RC_LOWER_PF_SET + GLPCI_RC_LOWER_WC_SET;
- msrnum = GLPCI_RC0;
- wrmsr(msrnum, msr);
wrmsr(GLPCI_RC0, msr);
/* R1 - GLPCI settings for SysMem space. */ /* Get systop from GLIU0 SYSTOP Descriptor. */
@@ -299,10 +294,9 @@ break; } }
- if (gl) {
unsigned long pah, pal;
msrnum = gl->desc_name;
msr = rdmsr(msrnum);
msr = rdmsr(gl->desc_name);
/* Example: R_SYSMEM value 20:00:00:0f:fb:f0:01:00
- translates to a base of 0x00100000 and top of 0xffbf0000
@@ -327,8 +321,7 @@ printk(BIOS_DEBUG, "GLPCI R1: system msr.lo 0x%08x msr.hi 0x%08x\n", msr.lo, msr.hi);
msrnum = GLPCI_RC1;
wrmsr(msrnum, msr);
wrmsr(GLPCI_RC1, msr);
}
/* R2 - GLPCI settings for SMM space. */
@@ -338,8 +331,7 @@ msr.lo |= GLPCI_RC_LOWER_EN_SET | GLPCI_RC_LOWER_PF_SET; printk(BIOS_DEBUG, "GLPCI R2: system msr.lo 0x%08x msr.hi 0x%08x\n", msr.lo, msr.hi);
- msrnum = GLPCI_RC2;
- wrmsr(msrnum, msr);
wrmsr(GLPCI_RC2, msr);
/* This is done elsewhere already, but it does no harm to do
- it more than once.
@@ -349,41 +341,25 @@ */ msr.lo = 0x021212121; /* Cache disabled and write serialized. */ msr.hi = 0x021212121; /* Cache disabled and write serialized. */
- wrmsr(CPU_RCONF_A0_BF, msr);
- wrmsr(CPU_RCONF_C0_DF, msr);
- wrmsr(CPU_RCONF_E0_FF, msr);
- msrnum = CPU_RCONF_A0_BF;
- wrmsr(msrnum, msr);
- msrnum = CPU_RCONF_C0_DF;
- wrmsr(msrnum, msr);
- msrnum = CPU_RCONF_E0_FF;
- wrmsr(msrnum, msr);
- /* Set Non-Cacheable Read Only for NorthBound Transactions to
*/
- Memory. The Enable bit is handled in the Shadow setup.
- msrnum = GLPCI_A0_BF;
- msr.hi = 0x35353535; msr.lo = 0x35353535;
- wrmsr(msrnum, msr);
- msrnum = GLPCI_C0_DF; msr.hi = 0x35353535;
- msr.lo = 0x35353535;
- wrmsr(msrnum, msr);
- wrmsr(GLPCI_A0_BF, msr);
- wrmsr(GLPCI_C0_DF, msr);
- wrmsr(GLPCI_E0_FF, msr);
- msrnum = GLPCI_E0_FF;
- msr.hi = 0x35353535;
- msr.lo = 0x35353535;
- wrmsr(msrnum, msr);
- /* Set WSREQ. */
- msrnum = CPU_DM_CONFIG0;
- msr = rdmsr(msrnum);
- msr = rdmsr(CPU_DM_CONFIG0); msr.hi &= ~(7 << DM_CONFIG0_UPPER_WSREQ_SHIFT); /* Reduce to 1 for safe mode. */ msr.hi |= 2 << DM_CONFIG0_UPPER_WSREQ_SHIFT;
- wrmsr(msrnum, msr);
wrmsr(CPU_DM_CONFIG0, msr);
/* The following settings will not work with a CS5530 southbridge.
- We are ignoring the CS5530 case for now, and perhaps forever.
@@ -392,28 +368,22 @@ /* 553x NB Init */
/* Arbiter setup */
- enable_preempt =
GLPCI_ARB_LOWER_PRE0_SET | GLPCI_ARB_LOWER_PRE1_SET |
GLPCI_ARB_LOWER_PRE2_SET | GLPCI_ARB_LOWER_CPRE_SET;
- enable_preempt = GLPCI_ARB_LOWER_PRE0_SET | GLPCI_ARB_LOWER_PRE1_SET |
enable_cpu_override = GLPCI_ARB_LOWER_COV_SET; enable_bus_parking = GLPCI_ARB_LOWER_PARK_SET;GLPCI_ARB_LOWER_PRE2_SET | GLPCI_ARB_LOWER_CPRE_SET;
- nic_grants_control =
(0x4 << GLPCI_ARB_UPPER_R2_SHIFT) | (0x3 <<
GLPCI_ARB_UPPER_H2_SHIFT);
- nic_grants_control = (0x4 << GLPCI_ARB_UPPER_R2_SHIFT) |
(0x3 << GLPCI_ARB_UPPER_H2_SHIFT);
- msrnum = GLPCI_ARB;
- msr = rdmsr(msrnum);
- msr = rdmsr(GLPCI_ARB); msr.hi |= nic_grants_control; msr.lo |= enable_cpu_override | enable_preempt | enable_bus_parking;
- wrmsr(msrnum, msr);
- wrmsr(GLPCI_ARB, msr);
- msrnum = GLPCI_CTRL;
- msr = rdmsr(msrnum);
- msr = rdmsr(GLPCI_CTRL); /* Out will be disabled in CPUBUG649 for < 2.0 parts. */ msr.lo |= GLPCI_CTRL_LOWER_ME_SET | GLPCI_CTRL_LOWER_OWC_SET |
GLPCI_CTRL_LOWER_PCD_SET;
- msr.lo |= GLPCI_CTRL_LOWER_LDE_SET;
GLPCI_CTRL_LOWER_PCD_SET | GLPCI_CTRL_LOWER_LDE_SET;
msr.lo &= ~(0x03 << GLPCI_CTRL_LOWER_IRFC_SHIFT); msr.lo |= 0x02 << GLPCI_CTRL_LOWER_IRFC_SHIFT;
@@ -435,24 +405,21 @@
msr.hi &= ~(0x03 << GLPCI_CTRL_UPPER_ILTO_SHIFT); msr.hi |= 0x00 << GLPCI_CTRL_UPPER_ILTO_SHIFT;
- wrmsr(msrnum, msr);
wrmsr(GLPCI_CTRL, msr);
/* Set GLPCI Latency Timer */
- msrnum = GLPCI_CTRL;
- msr = rdmsr(msrnum);
- msr = rdmsr(GLPCI_CTRL); /* Change once 1.x is gone. */ msr.hi |= 0x1F << GLPCI_CTRL_UPPER_LAT_SHIFT;
- wrmsr(msrnum, msr);
wrmsr(GLPCI_CTRL, msr);
/* GLPCI_SPARE */
- msrnum = GLPCI_SPARE;
- msr = rdmsr(msrnum);
- msr = rdmsr(GLPCI_SPARE); msr.lo &= ~0x7;
- msr.lo |=
GLPCI_SPARE_LOWER_AILTO_SET | GLPCI_SPARE_LOWER_PPD_SET |
GLPCI_SPARE_LOWER_PPC_SET | GLPCI_SPARE_LOWER_MPC_SET |
GLPCI_SPARE_LOWER_NSE_SET | GLPCI_SPARE_LOWER_SUPO_SET;
- wrmsr(msrnum, msr);
- msr.lo |= GLPCI_SPARE_LOWER_AILTO_SET | GLPCI_SPARE_LOWER_PPD_SET |
GLPCI_SPARE_LOWER_PPC_SET | GLPCI_SPARE_LOWER_MPC_SET |
GLPCI_SPARE_LOWER_NSE_SET | GLPCI_SPARE_LOWER_SUPO_SET;
- wrmsr(GLPCI_SPARE, msr);
}
/** @@ -462,14 +429,12 @@ { struct msr msr; struct msrinit *gating = clock_gating_default;
int i;
for (i = 0; gating->msrnum != 0xffffffff; i++) {
- for (/* Nothing */; gating->msrnum != 0xffffffff; gating++) { msr = rdmsr(gating->msrnum); msr.hi |= gating->msr.hi; msr.lo |= gating->msr.lo;
wrmsr(gating->msrnum, msr); /* MSR - See table above. */
gating += 1;
}wrmsr(gating->msrnum, msr);
}
@@ -480,15 +445,13 @@ { struct msr msr; struct msrinit *prio = geode_link_priority_table;
int i;
for (i = 0; prio->msrnum != 0xffffffff; i++) {
- for (/* Nothing */; prio->msrnum != 0xffffffff; prio++) { msr = rdmsr(prio->msrnum); msr.hi |= prio->msr.hi; msr.lo &= ~0xfff; msr.lo |= prio->msr.lo;
wrmsr(prio->msrnum, msr); /* MSR - See table above. */
prio += 1;
}wrmsr(prio->msrnum, msr);
}
@@ -523,6 +486,7 @@ int bit; u8 shadowByte; struct msr msr = { 0, 0 };
shadowByte = (u8) (shadowLo >> 16);
/* Load up D000 settings in edx. */
@@ -614,7 +578,6 @@ msr.hi &= 0xFFFF0000; msr.hi |= ((u32) (shadowSettings >> 32)) & 0x0000FFFF;
}/* MSR - See the table above. */ wrmsr(pTable->desc_name, msr); }
@@ -661,8 +624,8 @@ */ static void enable_L1_cache(void) {
- struct gliutable *gl = NULL; int i;
- struct gliutable *gl = NULL; struct msr msr; u8 SysMemCacheProp;
@@ -678,7 +641,6 @@ while (1); /* TODO: Should be hlt()? */ }
-// sysdescfound: msr = rdmsr(gl->desc_name);
/* 20 bit address - The bottom 12 bits go into bits 20-31 in eax, the @@ -806,7 +768,7 @@ if (gl) { msr = rdmsr(gl->desc_name); systop = ((msr.hi & 0xFF) << 24) | ((msr.lo & 0xFFF00000) >> 8);
systop += 0x1000; /* 4K */
} else { systop = ((sizeram() - CONFIG_VIDEO_MB) * 1024) - SMM_SIZE - 1024;systop += 4 * 1024; /* 4K */
@@ -824,7 +786,6 @@ void northbridge_init_early(void) { int i;
struct msr msr;
printk(BIOS_DEBUG, "Enter %s\n", __FUNCTION__);
Index: arch/x86/geodelx/stage1.c
--- arch/x86/geodelx/stage1.c (Revision 460) +++ arch/x86/geodelx/stage1.c (Arbeitskopie) @@ -23,10 +23,7 @@ #include <msr.h> #include <amd_geodelx.h>
-static const struct msrinit {
- u32 msrnum;
- struct msr msr;
-} msr_table[] = { +static const struct msrinit msr_table[] = { /* Setup access to cache under 1MB. */ {CPU_RCONF_DEFAULT, {.hi = 0x24fffc02,.lo = 0x1000A000}}, // 0x00000-0xA0000 {CPU_RCONF_A0_BF, {.hi = 0x00000000,.lo = 0x00000000}}, // 0xA0000-0xBFFFF @@ -43,17 +40,18 @@ };
/**
- Set up Geode LX registers for sane behaviour.
- */
- Set up Geode LX registers for sane behaviour.
- */
void geodelx_msr_init(void) { }
/**
- Disable Cache As RAM(CAR) after memory is setup.
- Geode can write back the cache contents to RAM and continue on.
- Assumes that anything in the cache was under 1MB.
- */
- Disable Cache As RAM (CAR) after memory is setup.
- Geode can write back the cache contents to RAM and continue on.
- Assumes that anything in the cache was under 1MB.
- */
void disable_car(void) { int i; Index: arch/x86/geodelx/geodelx.c =================================================================== --- arch/x86/geodelx/geodelx.c (Revision 460) +++ arch/x86/geodelx/geodelx.c (Arbeitskopie) @@ -255,6 +255,12 @@ return 33; }
+static const struct msrinit msr_table[] = {
- {CPU_BC_MSS_ARRAY_CTL0, {.hi = 0x00000000, .lo = 0x2814D352}},
- {CPU_BC_MSS_ARRAY_CTL1, {.hi = 0x00000000, .lo = 0x1068334D}},
- {CPU_BC_MSS_ARRAY_CTL2, {.hi = 0x00000106, .lo = 0x83104104}},
+};
/**
- Delay Control Settings table from AMD (MCP 0x4C00000F).
*/ @@ -308,44 +314,29 @@ */ static void set_delay_control(u8 dimm0, u8 dimm1) {
- u32 msrnum, glspeed;
u32 glspeed; u8 spdbyte0, spdbyte1, dimms, i; struct msr msr;
glspeed = geode_link_speed();
/* Fix delay controls for DM and IM arrays. */
- msrnum = CPU_BC_MSS_ARRAY_CTL0;
- msr.hi = 0;
- msr.lo = 0x2814D352;
- wrmsr(msrnum, msr);
- for (i = 0; i < ARRAY_SIZE(msr_table); i++)
wrmsr(msr_table[i].msrnum, msr_table[i].msr);
- msrnum = CPU_BC_MSS_ARRAY_CTL1;
- msr.hi = 0;
- msr.lo = 0x1068334D;
- wrmsr(msrnum, msr);
- msrnum = CPU_BC_MSS_ARRAY_CTL2;
- msr.hi = 0x00000106;
- msr.lo = 0x83104104;
- wrmsr(msrnum, msr);
- msrnum = GLCP_FIFOCTL;
- msr = rdmsr(msrnum);
- msr = rdmsr(GLCP_FIFOCTL); msr.hi = 0x00000005;
- wrmsr(msrnum, msr);
wrmsr(GLCP_FIFOCTL, msr);
/* Enable setting. */
- msrnum = CPU_BC_MSS_ARRAY_CTL_ENA; msr.hi = 0; msr.lo = 0x00000001;
- wrmsr(msrnum, msr);
wrmsr(CPU_BC_MSS_ARRAY_CTL_ENA, msr);
/* Debug Delay Control setup check.
- Leave it alone if it has been setup. FS2 or something is here.
*/
- msrnum = GLCP_DELAY_CONTROLS;
- msr = rdmsr(msrnum);
- msr = rdmsr(GLCP_DELAY_CONTROLS); if (msr.lo & ~(DELAY_LOWER_STATUS_MASK)) return;
@@ -409,85 +400,74 @@ */ void cpu_reg_init(int debug_clock_disable, u8 dimm0, u8 dimm1) {
int msrnum; struct msr msr;
/* Castle 2.0 BTM periodic sync period. */ /* [40:37] 1 sync record per 256 bytes. */
msrnum = CPU_PF_CONF;
msr = rdmsr(msrnum);
- msr = rdmsr(CPU_PF_CONF); msr.hi |= (0x8 << 5);
- wrmsr(msrnum, msr);
wrmsr(CPU_PF_CONF, msr);
/* Castle performance setting.
- Enable Quack for fewer re-RAS on the MC.
*/
- msrnum = GLIU0_ARB;
- msr = rdmsr(msrnum);
- msr = rdmsr(GLIU0_ARB); msr.hi &= ~ARB_UPPER_DACK_EN_SET; msr.hi |= ARB_UPPER_QUACK_EN_SET;
- wrmsr(msrnum, msr);
- wrmsr(GLIU0_ARB, msr);
- msrnum = GLIU1_ARB;
- msr = rdmsr(msrnum);
- msr = rdmsr(GLIU1_ARB); msr.hi &= ~ARB_UPPER_DACK_EN_SET; msr.hi |= ARB_UPPER_QUACK_EN_SET;
- wrmsr(msrnum, msr);
wrmsr(GLIU1_ARB, msr);
/* GLIU port active enable, limit south pole masters (AES and PCI) to
- one outstanding transaction.
*/
- msrnum = GLIU1_PORT_ACTIVE;
- msr = rdmsr(msrnum);
- msr = rdmsr(GLIU1_PORT_ACTIVE); msr.lo &= ~0x880;
- wrmsr(msrnum, msr);
wrmsr(GLIU1_PORT_ACTIVE, msr);
/* Set the Delay Control in GLCP. */ set_delay_control(dimm0, dimm1);
/* Enable RSDC. */
- msrnum = CPU_AC_SMM_CTL;
- msr = rdmsr(msrnum);
- msr = rdmsr(CPU_AC_SMM_CTL); msr.lo |= SMM_INST_EN_SET;
- wrmsr(msrnum, msr);
wrmsr(CPU_AC_SMM_CTL, msr);
/* FPU imprecise exceptions bit. */
- msrnum = CPU_FPU_MSR_MODE;
- msr = rdmsr(msrnum);
- msr = rdmsr(CPU_FPU_MSR_MODE); msr.lo |= FPU_IE_SET;
- wrmsr(msrnum, msr);
wrmsr(CPU_FPU_MSR_MODE, msr);
/* Power savers (do after BIST). */ /* Enable Suspend on HLT & PAUSE instructions. */
- msrnum = CPU_XC_CONFIG;
- msr = rdmsr(msrnum);
- msr = rdmsr(CPU_XC_CONFIG); msr.lo |= XC_CONFIG_SUSP_ON_HLT | XC_CONFIG_SUSP_ON_PAUSE;
- wrmsr(msrnum, msr);
wrmsr(CPU_XC_CONFIG, msr);
/* Enable SUSP and allow TSC to run in Suspend (keep speed
- detection happy).
*/
- msrnum = CPU_BC_CONF_0;
- msr = rdmsr(msrnum);
- msr = rdmsr(CPU_BC_CONF_0); msr.lo |= TSC_SUSP_SET | SUSP_EN_SET; msr.lo &= 0x0F0FFFFFF; msr.lo |= 0x002000000; /* PBZ213: Set PAUSEDLY = 2. */
- wrmsr(msrnum, msr);
wrmsr(CPU_BC_CONF_0, msr);
/* Disable the debug clock to save power. */ /* Note: Leave it enabled for FS2 debug. */ if (debug_clock_disable && 0) {
msr.hi = 0; msr.lo = 0;msrnum = GLCP_DBGCLKCTL;
wrmsr(msrnum, msr);
wrmsr(GLCP_DBGCLKCTL, msr);
}
/* Setup throttling delays to proper mode if it is ever enabled. */
- msrnum = GLCP_TH_OD; msr.hi = 0; msr.lo = 0x00000603C;
- wrmsr(msrnum, msr);
wrmsr(GLCP_TH_OD, msr);
/* Fix CPU bugs. */
#warning testing fixing bugs in initram
On Mon, Jul 23, 2007 at 02:32:01PM -0600, Marc Jones wrote:
The changes look good. I had some problems patching 5536.c so you might want to double check it before you submit it to svn.
Acked-by: Marc Jones marc.jones@amd.com
Thanks, r464.
I didn't have problems with applying the patch and I tested building all currently supported targets, which worked, so I hope the patch is fine.
Cheers, Uwe.