summaryrefslogtreecommitdiff
path: root/src/northbridge/motorola/mpc107/mpc107.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/northbridge/motorola/mpc107/mpc107.c')
-rw-r--r--src/northbridge/motorola/mpc107/mpc107.c259
1 files changed, 252 insertions, 7 deletions
diff --git a/src/northbridge/motorola/mpc107/mpc107.c b/src/northbridge/motorola/mpc107/mpc107.c
index 77142c4999..d9f859f02b 100644
--- a/src/northbridge/motorola/mpc107/mpc107.c
+++ b/src/northbridge/motorola/mpc107/mpc107.c
@@ -23,28 +23,273 @@
#include <printk.h>
#include <arch/io.h>
#include <arch/pciconf.h>
+#include <timer.h>
+#include <clock.h>
+#include <mem.h>
#include "i2c.h"
#include "mpc107.h"
-#include <timer.h>
#define NUM_DIMMS 1
#define NUM_BANKS 2
+void mpc107_init(void);
+
void
sdram_init(void)
{
- sdram_dimm_info sdram_dimms[NUM_DIMMS];
- sdram_bank_info sdram_banks[NUM_BANKS];
+ struct sdram_dimm_info dimms[NUM_DIMMS];
+ struct sdram_bank_info banks[NUM_BANKS];
+
+ mpc107_init();
+ mpc107_probe_dimms(NUM_DIMMS, dimms, banks);
+ (void)mpc107_config_memory(NUM_BANKS, banks, 2);
+}
+
+struct mem_range *
+sizeram(void)
+{
+ int i;
+ struct sdram_dimm_info dimms[NUM_DIMMS];
+ struct sdram_bank_info banks[NUM_BANKS];
+ static struct mem_range meminfo;
+
+ meminfo.basek = 0;
+ meminfo.sizek = 0;
+
+ mpc107_probe_dimms(NUM_DIMMS, dimms, banks);
+
+ for (i = 0; i < NUM_BANKS; i++)
+ meminfo.sizek += banks[i].size;
- hostbridge_probe_dimms(NUM_DIMMS, sdram_dimms, sdram_banks);
- (void)hostbridge_config_memory(NUM_BANKS, sdram_banks, 2);
+ meminfo.sizek >>= 10;
+
+ return &meminfo;
+}
+
+void
+mpc107_init(void)
+{
+ uint16_t reg16;
+ uint32_t reg32;
+
+ /*
+ * PCI Cmd
+ */
+ pci_ppc_write_config16(0, 0, 0x04, 0x06);
+
+ /*
+ * PCI Stat
+ */
+ reg16 = pci_ppc_read_config16(0, 0, 0x06);
+ reg16 |= 0xffff;
+ pci_ppc_write_config16(0, 0, 0x06, reg16);
+
+ /*
+ * PICR1
+ * 0x00400000 burst read wait states = 1
+ * 0x00040000 processor type = 603/750
+ * 0x00002000 enable LocalBusSlave
+ * 0x00001000 enable Flash write
+ * 0x00000800 enable MCP* assertion
+ * 0x00000400 enable TEA* assertion
+ * 0x00000200 enable data bus parking
+ * 0x00000040 enable PCI store gathering
+ * 0x00000010 enable loop-snoop
+ * 0x00000008 enable address bus parking
+ * 0x00000004 enable speculative PCI reads
+ */
+ reg32 = pci_ppc_read_config32(0, 0, 0xa8);
+
+ /*
+ * Preserve RCS0/Addr Map bits
+ */
+ reg32 &= 0x11;
+
+ reg32 |= 0xff041a18;
+ pci_ppc_write_config32(0, 0, 0xa8, reg32);
+
+ /*
+ * PICR2
+ * 0x20000000 no Serialize Config cycles
+ * 0x08000000 No PCI Snoop cycles
+ * 0x04000000 FF0 is Local ROM
+ * 0x02000000 Flash write lockout
+ * 0x00000000 snoop wt states = 0
+ * 0x00040000 snoop wt states = 1
+ * 0x00080000 snoop wt states = 2
+ * 0x000c0000 snoop wt states = 3
+ * 0x00000000 addr phase wt states = 0
+ * 0x00000004 addr phase wt states = 1
+ * 0x00000008 addr phase wt states = 2
+ * 0x0000000c addr phase wt states = 3
+ */
+
+ pci_ppc_write_config32(0, 0, 0xac, 0x04040004);
+
+ /*
+ * EUMBBAR
+ */
+ pci_ppc_write_config32(0, 0, 0x78, 0xfc000000);
+
+ /*
+ * MCCR1 - Set MEMGO bit later!
+ * 0x75800000 Safe local ROM = 10+3 clocks
+ * 0x73800000 Fast local ROM = 7+3 clocks
+ * 0x00100000 Burst ROM/Flash enable
+ * 0x00040000 Self-refresh enable
+ * 0x00020000 EDO/FP enable (else SDRAM)
+ * 0x00010000 Parity check
+ * 0x0000FFFF 16Mbit/2 bank SDRAM
+ * 0x00005555 64Mbit/2 bank SDRAM
+ * 0x00000000 64Mbit/4 bank SDRAM
+ */
+ reg32 = pci_ppc_read_config32(0, 0, 0xf0);
+ reg32 &= 0x00080000; /* Preserve MEMGO bit in case we're in RAM */
+ reg32 |= 0x75800000;
+ pci_ppc_write_config32(0, 0, 0xf0, reg32);
+
+ /*
+ * MCCR2
+ * 0x40000000 TS_WAIT_TIMER = 3 clocks
+ * 0x04000000 ASRISE = 2 clocks
+ * 0x00400000 ASFALL = 2 clocks
+ * 0x00100000 SDRAM parity (else ECC)
+ * 0x00080000 SDRAM inline writes
+ * 0x00040000 SDRAM inline reads
+ * 0x00020000 ECC enable
+ * 0x00010000 EDO (else FP)
+ * 0x000006b8 Refresh 33MHz bus
+ * 0x0000035c Refresh 66MHz bus
+ * 0x0000023c Refresh 100MHz bus
+ * 0x000001ac Refresh 133MHz bus
+ * 0x00000002 Reserve a page
+ * 0x00000001 RWM parity
+ */
+ pci_ppc_write_config32(0, 0, 0xf4, 0x0440023c);
+
+ /*
+ * MCCR3
+ * 0x70000000 BSTOPRE_M = 7
+ * 0x08000000 REFREC = 8 clocks
+ * 0x00400000 RDLAT = 4 clocks
+ * 0x00300000 RDLAT = 3 clocks
+ */
+ pci_ppc_write_config32(0, 0, 0xf8, 0x78400000);
+
+ /*
+ * MCCR4
+ * 0x30000000 PRETOACT = 3 clocks
+ * 0x05000000 ACTOPRE = 5 clocks
+ * 0x00800000 Enable 8-beat burst (32-bit bus)
+ * 0x00400000 Enable Inline ECC/Parity
+ * 0x00200000 Enable Extended ROM (RCS2/RCS3)
+ * 0x00100000 Registered buffers
+ * 0x00000000 BSTOPRE_U = 0
+ * 0x00020000 Change RCS1 to 8-bit mode
+ * 0x00008000 Registered DIMMs
+ * 0x00003000 CAS Latencey (CL=3)
+ * 0x00002000 CAS Latencey (CL=2)
+ * 0x00000200 Sequential wrap/4-beat burst
+ * 0x00000030 Reserve a page
+ * 0x00000009 RWM parity
+ */
+ pci_ppc_write_config32(0, 0, 0xfc, 0x35323239);
+
+ /*
+ * MSAR1/MSAR2/MESAR1/MESAR2
+ */
+ pci_ppc_write_config32(0, 0, 0x80, 0x60402000);
+ pci_ppc_write_config32(0, 0, 0x84, 0xe0c0a080);
+ pci_ppc_write_config32(0, 0, 0x88, 0x00000000);
+ pci_ppc_write_config32(0, 0, 0x8c, 0x00000000);
+
+ /*
+ * MEAR1/MEAR2/MEEAR1/MEEAR2
+ */
+ pci_ppc_write_config32(0, 0, 0x90, 0x7f5f3f1f);
+ pci_ppc_write_config32(0, 0, 0x94, 0xffdfbf9f);
+ pci_ppc_write_config32(0, 0, 0x98, 0x00000000);
+ pci_ppc_write_config32(0, 0, 0x9c, 0x00000000);
+
+ /*
+ * ODCR
+ * 0x80 PCI I/O 50 ohms
+ * 0x40 CPU I/O 50 ohms
+ * 0x30 Mem I/O 8 ohms
+ * 0x20 Mem I/O 13 ohms
+ * 0x10 Mem I/O 20 ohms
+ * 0x00 Mem I/O 40 ohms
+ * 0x0c PCIClk 8 ohms
+ * 0x08 PCIClk 13 ohms
+ * 0x04 PCIClk 20 ohms
+ * 0x00 PCIClk 40 ohms
+ * 0x03 MemClk 8 ohms
+ * 0x02 MemClk 13.3 ohms
+ * 0x01 MemClk 20 ohms
+ * 0x00 MemClk 40 ohms
+ */
+ pci_ppc_write_config8(0, 0, 0x73, 0xc0);
+
+ /*
+ * CDCR
+ * 0x8000 PCI_SYNC_OUT disabled
+ * 0x7c00 PCI_CLK disabled
+ * 0x0300 CPU_CLK 8 ohms
+ * 0x0200 CPU_CLK 13 ohms
+ * 0x0100 CPU_CLK 20 ohms
+ * 0x0000 CPU_CLK 40 ohms
+ * 0x0080 SDRAM_SYNC_OUT disabled
+ * 0x0078 SDRAM_CLK disabled
+ * 0x0004 CPU_CLK0 disabled
+ * 0x0002 CPU_CLK1 disabled
+ * 0x0001 CPU_CLK2 disabled
+ */
+ pci_ppc_write_config16(0, 0, 0x74, 0xfc01);
+
+ /*
+ * MDCR
+ * 0x80 MCP 1=open-drain, 0=output
+ * 0x40 SRESET 1=open-drain, 0=output
+ * 0x20 QACK 1=high-Z, 0=output
+ */
+ pci_ppc_write_config8(0, 0, 0x76, 0x60);
+
+ /*
+ * MBEN
+ * 0x03 Enable banks 0 and 1
+ */
+ pci_ppc_write_config8(0, 0, 0xa0, 0x03);
+
+ /*
+ * PGMAX
+ * 0x32 33MHz value w/ROMFAL=8
+ */
+ pci_ppc_write_config8(0, 0, 0xa3, 0x32);
+
+ /*
+ * Wait 200us
+ */
+ udelay(200);
+
+ /*
+ * Now set memgo bit in MCCR1
+ */
+ reg32 = pci_ppc_read_config32(0, 0, 0xf0);
+ reg32 |= 0x00080000; /* MEMGO=1 */
+ pci_ppc_write_config32(0, 0, 0xf0, reg32);
+
+ /*
+ * Wait again
+ */
+
+ udelay(10000);
}
/*
* Configure memory settings.
*/
unsigned long
-hostbridge_config_memory(int no_banks, sdram_bank_info * bank, int for_real)
+mpc107_config_memory(int no_banks, sdram_bank_info * bank, int for_real)
{
int i, j;
char ignore[8];
@@ -421,7 +666,7 @@ i2c_fn mpc107_i2c_fn = {
* Find dimm information.
*/
void
-hostbridge_probe_dimms(int no_dimms, sdram_dimm_info *dimms, sdram_bank_info * bank)
+mpc107_probe_dimms(int no_dimms, sdram_dimm_info *dimms, sdram_bank_info * bank)
{
unsigned char data[256];
unsigned dimm;