mpc85xx_ddr_gen1.c 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. /*
  2. * Copyright 2008 Freescale Semiconductor, Inc.
  3. *
  4. * SPDX-License-Identifier: GPL-2.0
  5. */
  6. #include <common.h>
  7. #include <asm/io.h>
  8. #include <fsl_ddr_sdram.h>
  9. #if (CONFIG_CHIP_SELECTS_PER_CTRL > 4)
  10. #error Invalid setting for CONFIG_CHIP_SELECTS_PER_CTRL
  11. #endif
  12. void fsl_ddr_set_memctl_regs(const fsl_ddr_cfg_regs_t *regs,
  13. unsigned int ctrl_num, int step)
  14. {
  15. unsigned int i;
  16. struct ccsr_ddr __iomem *ddr =
  17. (struct ccsr_ddr __iomem *)CONFIG_SYS_FSL_DDR_ADDR;
  18. if (ctrl_num != 0) {
  19. printf("%s unexpected ctrl_num = %u\n", __FUNCTION__, ctrl_num);
  20. return;
  21. }
  22. for (i = 0; i < CONFIG_CHIP_SELECTS_PER_CTRL; i++) {
  23. if (i == 0) {
  24. out_be32(&ddr->cs0_bnds, regs->cs[i].bnds);
  25. out_be32(&ddr->cs0_config, regs->cs[i].config);
  26. } else if (i == 1) {
  27. out_be32(&ddr->cs1_bnds, regs->cs[i].bnds);
  28. out_be32(&ddr->cs1_config, regs->cs[i].config);
  29. } else if (i == 2) {
  30. out_be32(&ddr->cs2_bnds, regs->cs[i].bnds);
  31. out_be32(&ddr->cs2_config, regs->cs[i].config);
  32. } else if (i == 3) {
  33. out_be32(&ddr->cs3_bnds, regs->cs[i].bnds);
  34. out_be32(&ddr->cs3_config, regs->cs[i].config);
  35. }
  36. }
  37. out_be32(&ddr->timing_cfg_1, regs->timing_cfg_1);
  38. out_be32(&ddr->timing_cfg_2, regs->timing_cfg_2);
  39. out_be32(&ddr->sdram_mode, regs->ddr_sdram_mode);
  40. out_be32(&ddr->sdram_interval, regs->ddr_sdram_interval);
  41. #if defined(CONFIG_ARCH_MPC8555) || defined(CONFIG_ARCH_MPC8541)
  42. out_be32(&ddr->sdram_clk_cntl, regs->ddr_sdram_clk_cntl);
  43. #endif
  44. /*
  45. * 200 painful micro-seconds must elapse between
  46. * the DDR clock setup and the DDR config enable.
  47. */
  48. udelay(200);
  49. asm volatile("sync;isync");
  50. out_be32(&ddr->sdram_cfg, regs->ddr_sdram_cfg);
  51. asm("sync;isync;msync");
  52. udelay(500);
  53. }
  54. #if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRCONTROLLER)
  55. /*
  56. * Initialize all of memory for ECC, then enable errors.
  57. */
  58. void
  59. ddr_enable_ecc(unsigned int dram_size)
  60. {
  61. struct ccsr_ddr __iomem *ddr =
  62. (struct ccsr_ddr __iomem *)(CONFIG_SYS_FSL_DDR_ADDR);
  63. dma_meminit(CONFIG_MEM_INIT_VALUE, dram_size);
  64. /*
  65. * Enable errors for ECC.
  66. */
  67. debug("DMA DDR: err_disable = 0x%08x\n", ddr->err_disable);
  68. ddr->err_disable = 0x00000000;
  69. asm("sync;isync;msync");
  70. debug("DMA DDR: err_disable = 0x%08x\n", ddr->err_disable);
  71. }
  72. #endif /* CONFIG_DDR_ECC && ! CONFIG_ECC_INIT_VIA_DDRCONTROLLER */