]> git.sur5r.net Git - u-boot/blobdiff - board/amcc/yellowstone/yellowstone.c
Merge branch 'master' of rsync://rsync.denx.de/git/u-boot
[u-boot] / board / amcc / yellowstone / yellowstone.c
index a6b81e6008a9acda3c95f2bd799d9340189f77f1..20965c8e3ead7e039b17eb289f5e864af425e6ea 100644 (file)
  */
 
 #include <common.h>
+#include <ppc4xx.h>
 #include <asm/processor.h>
 #include <spd_sdram.h>
 
+DECLARE_GLOBAL_DATA_PTR;
+
+extern flash_info_t flash_info[CFG_MAX_FLASH_BANKS]; /* info for FLASH chips   */
+
 int board_early_init_f(void)
 {
        register uint reg;
@@ -35,7 +40,7 @@ int board_early_init_f(void)
        mtdcr(ebccfgd, reg | 0x04000000);       /* Set ATC */
 
        mtebc(pb0ap, 0x03017300);       /* FLASH/SRAM */
-       mtebc(pb0cr, 0xfe0ba000);       /* BAS=0xfe0 32MB r/w 16-bit */
+       mtebc(pb0cr, 0xfc0da000);       /* BAS=0xfc0 64MB r/w 16-bit */
 
        mtebc(pb1ap, 0x00000000);
        mtebc(pb1cr, 0x00000000);
@@ -52,33 +57,14 @@ int board_early_init_f(void)
        mtebc(pb5ap, 0x00000000);
        mtebc(pb5cr, 0x00000000);
 
-       /*--------------------------------------------------------------------
-        * Setup the interrupt controller polarities, triggers, etc.
-        *-------------------------------------------------------------------*/
-       mtdcr(uic0sr, 0xffffffff);      /* clear all */
-       mtdcr(uic0er, 0x00000000);      /* disable all */
-       mtdcr(uic0cr, 0x00000009);      /* ATI & UIC1 crit are critical */
-       mtdcr(uic0pr, 0xfffffe13);      /* per ref-board manual */
-       mtdcr(uic0tr, 0x01c00008);      /* per ref-board manual */
-       mtdcr(uic0vr, 0x00000001);      /* int31 highest, base=0x000 */
-       mtdcr(uic0sr, 0xffffffff);      /* clear all */
-
-       mtdcr(uic1sr, 0xffffffff);      /* clear all */
-       mtdcr(uic1er, 0x00000000);      /* disable all */
-       mtdcr(uic1cr, 0x00000000);      /* all non-critical */
-       mtdcr(uic1pr, 0xffffe0ff);      /* per ref-board manual */
-       mtdcr(uic1tr, 0x00ffc000);      /* per ref-board manual */
-       mtdcr(uic1vr, 0x00000001);      /* int31 highest, base=0x000 */
-       mtdcr(uic1sr, 0xffffffff);      /* clear all */
-
        /*--------------------------------------------------------------------
         * Setup the GPIO pins
         *-------------------------------------------------------------------*/
        /*CPLD cs */
-       /*setup Address lines for flash sizes larger than 16Meg. */
-       out32(GPIO0_OSRL, in32(GPIO0_OSRL) | 0x40010000);
-       out32(GPIO0_TSRL, in32(GPIO0_TSRL) | 0x40010000);
-       out32(GPIO0_ISR1L, in32(GPIO0_ISR1L) | 0x40000000);
+       /*setup Address lines for flash size 64Meg. */
+       out32(GPIO0_OSRL, in32(GPIO0_OSRL) | 0x50010000);
+       out32(GPIO0_TSRL, in32(GPIO0_TSRL) | 0x50010000);
+       out32(GPIO0_ISR1L, in32(GPIO0_ISR1L) | 0x50000000);
 
        /*setup emac */
        out32(GPIO0_TCR, in32(GPIO0_TCR) | 0xC080);
@@ -92,12 +78,38 @@ int board_early_init_f(void)
        out32(GPIO1_OSRL, in32(GPIO1_OSRL) | 0x00080000);
        out32(GPIO1_ISR2L, in32(GPIO1_ISR2L) | 0x00010000);
 
+       /* external interrupts IRQ0...3 */
+       out32(GPIO1_TCR, in32(GPIO1_TCR) & ~0x0f000000);
+       out32(GPIO1_TSRL, in32(GPIO1_TSRL) & ~0x00005500);
+       out32(GPIO1_ISR1L, in32(GPIO1_ISR1L) | 0x00005500);
+
+#if 0 /* test-only */
        /*setup USB 2.0 */
        out32(GPIO1_TCR, in32(GPIO1_TCR) | 0xc0000000);
        out32(GPIO1_OSRL, in32(GPIO1_OSRL) | 0x50000000);
        out32(GPIO0_TCR, in32(GPIO0_TCR) | 0xf);
        out32(GPIO0_OSRH, in32(GPIO0_OSRH) | 0xaa);
        out32(GPIO0_ISR2H, in32(GPIO0_ISR2H) | 0x00000500);
+#endif
+
+       /*--------------------------------------------------------------------
+        * Setup the interrupt controller polarities, triggers, etc.
+        *-------------------------------------------------------------------*/
+       mtdcr(uic0sr, 0xffffffff);      /* clear all */
+       mtdcr(uic0er, 0x00000000);      /* disable all */
+       mtdcr(uic0cr, 0x00000009);      /* ATI & UIC1 crit are critical */
+       mtdcr(uic0pr, 0xfffffe13);      /* per ref-board manual */
+       mtdcr(uic0tr, 0x01c00008);      /* per ref-board manual */
+       mtdcr(uic0vr, 0x00000001);      /* int31 highest, base=0x000 */
+       mtdcr(uic0sr, 0xffffffff);      /* clear all */
+
+       mtdcr(uic1sr, 0xffffffff);      /* clear all */
+       mtdcr(uic1er, 0x00000000);      /* disable all */
+       mtdcr(uic1cr, 0x00000000);      /* all non-critical */
+       mtdcr(uic1pr, 0xffffe0ff);      /* per ref-board manual */
+       mtdcr(uic1tr, 0x00ffc000);      /* per ref-board manual */
+       mtdcr(uic1vr, 0x00000001);      /* int31 highest, base=0x000 */
+       mtdcr(uic1sr, 0xffffffff);      /* clear all */
 
        /*--------------------------------------------------------------------
         * Setup other serial configuration
@@ -113,28 +125,79 @@ int board_early_init_f(void)
        /*enable ethernet */
        *(unsigned char *)(CFG_BCSR_BASE | 0x08) = 0xf0;
 
+#if 0 /* test-only */
        /*enable usb 1.1 fs device and remove usb 2.0 reset */
        *(unsigned char *)(CFG_BCSR_BASE | 0x09) = 0x00;
+#endif
 
        /*get rid of flash write protect */
-       *(unsigned char *)(CFG_BCSR_BASE | 0x07) = 0x40;
+       *(unsigned char *)(CFG_BCSR_BASE | 0x07) = 0x00;
+
+       return 0;
+}
+
+int misc_init_r (void)
+{
+       uint pbcr;
+       int size_val = 0;
+
+       /* Re-do sizing to get full correct info */
+       mtdcr(ebccfga, pb0cr);
+       pbcr = mfdcr(ebccfgd);
+       switch (gd->bd->bi_flashsize) {
+       case 1 << 20:
+               size_val = 0;
+               break;
+       case 2 << 20:
+               size_val = 1;
+               break;
+       case 4 << 20:
+               size_val = 2;
+               break;
+       case 8 << 20:
+               size_val = 3;
+               break;
+       case 16 << 20:
+               size_val = 4;
+               break;
+       case 32 << 20:
+               size_val = 5;
+               break;
+       case 64 << 20:
+               size_val = 6;
+               break;
+       case 128 << 20:
+               size_val = 7;
+               break;
+       }
+       pbcr = (pbcr & 0x0001ffff) | gd->bd->bi_flashstart | (size_val << 17);
+       mtdcr(ebccfga, pb0cr);
+       mtdcr(ebccfgd, pbcr);
+
+       /* adjust flash start and offset */
+       gd->bd->bi_flashstart = 0 - gd->bd->bi_flashsize;
+       gd->bd->bi_flashoffset = 0;
+
+       /* Monitor protection ON by default */
+       (void)flash_protect(FLAG_PROTECT_SET,
+                           -CFG_MONITOR_LEN,
+                           0xffffffff,
+                           &flash_info[0]);
 
        return 0;
 }
 
 int checkboard(void)
 {
-       sys_info_t sysinfo;
+       char *s = getenv("serial#");
 
-       get_sys_info(&sysinfo);
+       printf("Board: Yellowstone - AMCC PPC440GR Evaluation Board");
+       if (s != NULL) {
+               puts(", serial# ");
+               puts(s);
+       }
+       putc('\n');
 
-       printf("Board: AMCC YELLOWSTONE\n");
-       printf("\tVCO: %lu MHz\n", sysinfo.freqVCOMhz / 1000000);
-       printf("\tCPU: %lu MHz\n", sysinfo.freqProcessor / 1000000);
-       printf("\tPLB: %lu MHz\n", sysinfo.freqPLB / 1000000);
-       printf("\tOPB: %lu MHz\n", sysinfo.freqOPB / 1000000);
-       printf("\tPER: %lu MHz\n", sysinfo.freqEPB / 1000000);
-       printf("\tPCI: %lu MHz\n", sysinfo.freqPCI / 1000000);
        return (0);
 }
 
@@ -145,9 +208,85 @@ int checkboard(void)
  *              PLB @ 133 MHz
  *
  ************************************************************************/
+#define NUM_TRIES 64
+#define NUM_READS 10
+
+void sdram_tr1_set(int ram_address, int* tr1_value)
+{
+       int i;
+       int j, k;
+       volatile unsigned int* ram_pointer =  (unsigned int*)ram_address;
+       int first_good = -1, last_bad = 0x1ff;
+
+       unsigned long test[NUM_TRIES] = {
+               0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF,
+               0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF,
+               0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000,
+               0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000,
+               0xAAAAAAAA, 0xAAAAAAAA, 0x55555555, 0x55555555,
+               0xAAAAAAAA, 0xAAAAAAAA, 0x55555555, 0x55555555,
+               0x55555555, 0x55555555, 0xAAAAAAAA, 0xAAAAAAAA,
+               0x55555555, 0x55555555, 0xAAAAAAAA, 0xAAAAAAAA,
+               0xA5A5A5A5, 0xA5A5A5A5, 0x5A5A5A5A, 0x5A5A5A5A,
+               0xA5A5A5A5, 0xA5A5A5A5, 0x5A5A5A5A, 0x5A5A5A5A,
+               0x5A5A5A5A, 0x5A5A5A5A, 0xA5A5A5A5, 0xA5A5A5A5,
+               0x5A5A5A5A, 0x5A5A5A5A, 0xA5A5A5A5, 0xA5A5A5A5,
+               0xAA55AA55, 0xAA55AA55, 0x55AA55AA, 0x55AA55AA,
+               0xAA55AA55, 0xAA55AA55, 0x55AA55AA, 0x55AA55AA,
+               0x55AA55AA, 0x55AA55AA, 0xAA55AA55, 0xAA55AA55,
+               0x55AA55AA, 0x55AA55AA, 0xAA55AA55, 0xAA55AA55 };
+
+       /* go through all possible SDRAM0_TR1[RDCT] values */
+       for (i=0; i<=0x1ff; i++) {
+               /* set the current value for TR1 */
+               mtsdram(mem_tr1, (0x80800800 | i));
+
+               /* write values */
+               for (j=0; j<NUM_TRIES; j++) {
+                       ram_pointer[j] = test[j];
+
+                       /* clear any cache at ram location */
+                       __asm__("dcbf 0,%0": :"r" (&ram_pointer[j]));
+               }
+
+               /* read values back */
+               for (j=0; j<NUM_TRIES; j++) {
+                       for (k=0; k<NUM_READS; k++) {
+                               /* clear any cache at ram location */
+                               __asm__("dcbf 0,%0": :"r" (&ram_pointer[j]));
+
+                               if (ram_pointer[j] != test[j])
+                                       break;
+                       }
+
+                       /* read error */
+                       if (k != NUM_READS) {
+                               break;
+                       }
+               }
+
+               /* we have a SDRAM0_TR1[RDCT] that is part of the window */
+               if (j == NUM_TRIES) {
+                       if (first_good == -1)
+                               first_good = i;         /* found beginning of window */
+               } else { /* bad read */
+                       /* if we have not had a good read then don't care */
+                       if(first_good != -1) {
+                               /* first failure after a good read */
+                               last_bad = i-1;
+                               break;
+                       }
+               }
+       }
+
+       /* return the current value for TR1 */
+       *tr1_value = (first_good + last_bad) / 2;
+}
+
 void sdram_init(void)
 {
        register uint reg;
+       int tr1_bank1, tr1_bank2;
 
        /*--------------------------------------------------------------------
         * Setup some default
@@ -159,7 +298,7 @@ void sdram_init(void)
        mtsdram(mem_wddctr, 0x40000000);        /* ?? */
 
        /*clear this first, if the DDR is enabled by a debugger
-          then you can not make changes. */
+         then you can not make changes. */
        mtsdram(mem_cfg0, 0x00000000);  /* Disable EEC */
 
        /*--------------------------------------------------------------------
@@ -170,8 +309,8 @@ void sdram_init(void)
         */
        mtsdram(mem_b0cr, 0x000a4001);  /* SDBA=0x000 128MB, Mode 3, enabled */
        mtsdram(mem_b1cr, 0x080a4001);  /* SDBA=0x080 128MB, Mode 3, enabled */
+
        mtsdram(mem_tr0, 0x410a4012);   /* ?? */
-       mtsdram(mem_tr1, 0x8080080b);   /* ?? */
        mtsdram(mem_rtr, 0x04080000);   /* ?? */
        mtsdram(mem_cfg1, 0x00000000);  /* Self-refresh exit, disable PM    */
        mtsdram(mem_cfg0, 0x34000000);  /* Disable EEC */
@@ -187,6 +326,10 @@ void sdram_init(void)
                if (reg & 0x80000000)
                        break;
        }
+
+       sdram_tr1_set(0x00000000, &tr1_bank1);
+       sdram_tr1_set(0x08000000, &tr1_bank2);
+       mtsdram(mem_tr1, (((tr1_bank1+tr1_bank2)/2) | 0x80800800) );
 }
 
 /*************************************************************************
@@ -252,41 +395,29 @@ int testdram(void)
 #if defined(CONFIG_PCI) && defined(CFG_PCI_PRE_INIT)
 int pci_pre_init(struct pci_controller *hose)
 {
-       unsigned long strap;
        unsigned long addr;
 
-       /*--------------------------------------------------------------------------+
-     * Bamboo is always configured as the host & requires the
-     * PCI arbiter to be enabled.
-        *--------------------------------------------------------------------------*/
-       mfsdr(sdr_sdstp1, strap);
-       if ((strap & SDR0_SDSTP1_PAE_MASK) == 0) {
-               printf("PCI: SDR0_STRP1[PAE] not set.\n");
-               printf("PCI: Configuration aborted.\n");
-               return 0;
-       }
-
-    /*-------------------------------------------------------------------------+
-    | Set priority for all PLB3 devices to 0.
-    | Set PLB3 arbiter to fair mode.
-    +-------------------------------------------------------------------------*/
+       /*-------------------------------------------------------------------------+
+         | Set priority for all PLB3 devices to 0.
+         | Set PLB3 arbiter to fair mode.
+         +-------------------------------------------------------------------------*/
        mfsdr(sdr_amp1, addr);
        mtsdr(sdr_amp1, (addr & 0x000000FF) | 0x0000FF00);
        addr = mfdcr(plb3_acr);
        mtdcr(plb3_acr, addr | 0x80000000);
 
-    /*-------------------------------------------------------------------------+
-    | Set priority for all PLB4 devices to 0.
-    +-------------------------------------------------------------------------*/
+       /*-------------------------------------------------------------------------+
+         | Set priority for all PLB4 devices to 0.
+         +-------------------------------------------------------------------------*/
        mfsdr(sdr_amp0, addr);
        mtsdr(sdr_amp0, (addr & 0x000000FF) | 0x0000FF00);
        addr = mfdcr(plb4_acr) | 0xa0000000;    /* Was 0x8---- */
        mtdcr(plb4_acr, addr);
 
-    /*-------------------------------------------------------------------------+
-    | Set Nebula PLB4 arbiter to fair mode.
-    +-------------------------------------------------------------------------*/
-       /*  Segment0 */
+       /*-------------------------------------------------------------------------+
+         | Set Nebula PLB4 arbiter to fair mode.
+         +-------------------------------------------------------------------------*/
+       /* Segment0 */
        addr = (mfdcr(plb0_acr) & ~plb0_acr_ppm_mask) | plb0_acr_ppm_fair;
        addr = (addr & ~plb0_acr_hbu_mask) | plb0_acr_hbu_enabled;
        addr = (addr & ~plb0_acr_rdp_mask) | plb0_acr_rdp_4deep;
@@ -318,13 +449,13 @@ void pci_target_init(struct pci_controller *hose)
        /*--------------------------------------------------------------------------+
         * Set up Direct MMIO registers
         *--------------------------------------------------------------------------*/
-   /*--------------------------------------------------------------------------+
-   | PowerPC440 EP PCI Master configuration.
-   | Map one 1Gig range of PLB/processor addresses to PCI memory space.
-   |   PLB address 0xA0000000-0xDFFFFFFF ==> PCI address 0xA0000000-0xDFFFFFFF
-   |   Use byte reversed out routines to handle endianess.
-   | Make this region non-prefetchable.
-   +--------------------------------------------------------------------------*/
+       /*--------------------------------------------------------------------------+
+         | PowerPC440 EP PCI Master configuration.
+         | Map one 1Gig range of PLB/processor addresses to PCI memory space.
+         |   PLB address 0xA0000000-0xDFFFFFFF ==> PCI address 0xA0000000-0xDFFFFFFF
+         |   Use byte reversed out routines to handle endianess.
+         | Make this region non-prefetchable.
+         +--------------------------------------------------------------------------*/
        out32r(PCIX0_PMM0MA, 0x00000000);       /* PMM0 Mask/Attribute - disabled b4 setting */
        out32r(PCIX0_PMM0LA, CFG_PCI_MEMBASE);  /* PMM0 Local Address */
        out32r(PCIX0_PMM0PCILA, CFG_PCI_MEMBASE);       /* PMM0 PCI Low Address */
@@ -374,11 +505,11 @@ void pci_master_init(struct pci_controller *hose)
 {
        unsigned short temp_short;
 
-   /*--------------------------------------------------------------------------+
-   | Write the PowerPC440 EP PCI Configuration regs.
-   |   Enable PowerPC440 EP to be a master on the PCI bus (PMM).
-   |   Enable PowerPC440 EP to act as a PCI memory target (PTM).
-   +--------------------------------------------------------------------------*/
+       /*--------------------------------------------------------------------------+
+         | Write the PowerPC440 EP PCI Configuration regs.
+         |   Enable PowerPC440 EP to be a master on the PCI bus (PMM).
+         |   Enable PowerPC440 EP to act as a PCI memory target (PTM).
+         +--------------------------------------------------------------------------*/
        pci_read_config_word(0, PCI_COMMAND, &temp_short);
        pci_write_config_word(0, PCI_COMMAND,
                              temp_short | PCI_COMMAND_MASTER |
@@ -418,5 +549,6 @@ int is_pci_host(struct pci_controller *hose)
 #if defined(CONFIG_HW_WATCHDOG)
 void hw_watchdog_reset(void)
 {
+
 }
 #endif