📄 tqm8260.c
字号:
putc ('\n'); return 0;}/* ------------------------------------------------------------------------- *//* Try SDRAM initialization with P/LSDMR=sdmr and ORx=orx * * This routine performs standard 8260 initialization sequence * and calculates the available memory size. It may be called * several times to try different SDRAM configurations on both * 60x and local buses. */static long int try_init (volatile memctl8260_t * memctl, ulong sdmr, ulong orx, volatile uchar * base){ volatile uchar c = 0xff; ulong cnt, val; volatile ulong *addr; volatile uint *sdmr_ptr; volatile uint *orx_ptr; int i; ulong save[32]; /* to make test non-destructive */ ulong maxsize, size; /* We must be able to test a location outsize the maximum legal size * to find out THAT we are outside; but this address still has to be * mapped by the controller. That means, that the initial mapping has * to be (at least) twice as large as the maximum expected size. */ maxsize = (1 + (~orx | 0x7fff)) / 2; /* Since CFG_SDRAM_BASE is always 0 (??), we assume that * we are configuring CS1 if base != 0 */ sdmr_ptr = base ? &memctl->memc_lsdmr : &memctl->memc_psdmr; orx_ptr = base ? &memctl->memc_or2 : &memctl->memc_or1; *orx_ptr = orx; /* * Quote from 8260 UM (10.4.2 SDRAM Power-On Initialization, 10-35): * * "At system reset, initialization software must set up the * programmable parameters in the memory controller banks registers * (ORx, BRx, P/LSDMR). After all memory parameters are configured, * system software should execute the following initialization sequence * for each SDRAM device. * * 1. Issue a PRECHARGE-ALL-BANKS command * 2. Issue eight CBR REFRESH commands * 3. Issue a MODE-SET command to initialize the mode register * * The initial commands are executed by setting P/LSDMR[OP] and * accessing the SDRAM with a single-byte transaction." * * The appropriate BRx/ORx registers have already been set when we * get here. The SDRAM can be accessed at the address CFG_SDRAM_BASE. */ *sdmr_ptr = sdmr | PSDMR_OP_PREA; *base = c; *sdmr_ptr = sdmr | PSDMR_OP_CBRR; for (i = 0; i < 8; i++) *base = c; *sdmr_ptr = sdmr | PSDMR_OP_MRW; *(base + CFG_MRS_OFFS) = c; /* setting MR on address lines */ *sdmr_ptr = sdmr | PSDMR_OP_NORM | PSDMR_RFEN; *base = c; /* * Check memory range for valid RAM. A simple memory test determines * the actually available RAM size between addresses `base' and * `base + maxsize'. Some (not all) hardware errors are detected: * - short between address lines * - short between data lines */ i = 0; for (cnt = maxsize / sizeof (long); cnt > 0; cnt >>= 1) { addr = (volatile ulong *) base + cnt; /* pointer arith! */ save[i++] = *addr; *addr = ~cnt; } addr = (volatile ulong *) base; save[i] = *addr; *addr = 0; if ((val = *addr) != 0) { /* Restore the original data before leaving the function. */ *addr = save[i]; for (cnt = 1; cnt <= maxsize / sizeof(long); cnt <<= 1) { addr = (volatile ulong *) base + cnt; *addr = save[--i]; } return (0); } for (cnt = 1; cnt <= maxsize / sizeof (long); cnt <<= 1) { addr = (volatile ulong *) base + cnt; /* pointer arith! */ val = *addr; *addr = save[--i]; if (val != ~cnt) { size = cnt * sizeof (long); /* Restore the original data before leaving the function. */ for (cnt <<= 1; cnt <= maxsize / sizeof (long); cnt <<= 1) { addr = (volatile ulong *) base + cnt; *addr = save[--i]; } /* Write the actual size to ORx */ *orx_ptr = orx | ~(size - 1); return (size); } } return (maxsize);}long int initdram (int board_type){ volatile immap_t *immap = (immap_t *) CFG_IMMR; volatile memctl8260_t *memctl = &immap->im_memctl;#ifndef CFG_RAMBOOT long size8, size9;#endif long psize, lsize; psize = 16 * 1024 * 1024; lsize = 0; memctl->memc_psrt = CFG_PSRT; memctl->memc_mptpr = CFG_MPTPR;#if 0 /* Just for debugging */#define prt_br_or(brX,orX) do { \ ulong start = memctl->memc_ ## brX & 0xFFFF8000; \ ulong sizem = ~memctl->memc_ ## orX | 0x00007FFF; \ printf ("\n" \ #brX " 0x%08x " #orX " 0x%08x " \ "==> 0x%08lx ... 0x%08lx = %ld MB\n", \ memctl->memc_ ## brX, memctl->memc_ ## orX, \ start, start+sizem, (sizem+1)>>20); \ } while (0) prt_br_or (br0, or0); prt_br_or (br1, or1); prt_br_or (br2, or2); prt_br_or (br3, or3);#endif#ifndef CFG_RAMBOOT /* 60x SDRAM setup: */ size8 = try_init (memctl, CFG_PSDMR_8COL, CFG_OR1_8COL, (uchar *) CFG_SDRAM_BASE); size9 = try_init (memctl, CFG_PSDMR_9COL, CFG_OR1_9COL, (uchar *) CFG_SDRAM_BASE); if (size8 < size9) { psize = size9; printf ("(60x:9COL - %ld MB, ", psize >> 20); } else { psize = try_init (memctl, CFG_PSDMR_8COL, CFG_OR1_8COL, (uchar *) CFG_SDRAM_BASE); printf ("(60x:8COL - %ld MB, ", psize >> 20); } /* Local SDRAM setup: */#ifdef CFG_INIT_LOCAL_SDRAM memctl->memc_lsrt = CFG_LSRT; size8 = try_init (memctl, CFG_LSDMR_8COL, CFG_OR2_8COL, (uchar *) SDRAM_BASE2_PRELIM); size9 = try_init (memctl, CFG_LSDMR_9COL, CFG_OR2_9COL, (uchar *) SDRAM_BASE2_PRELIM); if (size8 < size9) { lsize = size9; printf ("Local:9COL - %ld MB) using ", lsize >> 20); } else { lsize = try_init (memctl, CFG_LSDMR_8COL, CFG_OR2_8COL, (uchar *) SDRAM_BASE2_PRELIM); printf ("Local:8COL - %ld MB) using ", lsize >> 20); }#if 0 /* Set up BR2 so that the local SDRAM goes * right after the 60x SDRAM */ memctl->memc_br2 = (CFG_BR2_PRELIM & ~BRx_BA_MSK) | (CFG_SDRAM_BASE + psize);#endif#endif /* CFG_INIT_LOCAL_SDRAM */#endif /* CFG_RAMBOOT */ icache_enable (); return (psize);}/* ------------------------------------------------------------------------- */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -