ddrc.c 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. /*
  2. * Copyright (C) 2012 - 2013 Michal Simek <monstr@monstr.eu>
  3. * Copyright (C) 2012 - 2013 Xilinx, Inc. All rights reserved.
  4. *
  5. * SPDX-License-Identifier: GPL-2.0+
  6. */
  7. #include <common.h>
  8. #include <asm/io.h>
  9. #include <asm/arch/sys_proto.h>
  10. #include <asm/arch/hardware.h>
  11. DECLARE_GLOBAL_DATA_PTR;
  12. #ifndef CONFIG_ZYNQ_DDRC_INIT
  13. void zynq_ddrc_init(void) {}
  14. #else
  15. /* Control regsiter bitfield definitions */
  16. #define ZYNQ_DDRC_CTRLREG_BUSWIDTH_MASK 0xC
  17. #define ZYNQ_DDRC_CTRLREG_BUSWIDTH_SHIFT 2
  18. #define ZYNQ_DDRC_CTRLREG_BUSWIDTH_16BIT 1
  19. /* ECC scrub regsiter definitions */
  20. #define ZYNQ_DDRC_ECC_SCRUBREG_ECC_MODE_MASK 0x7
  21. #define ZYNQ_DDRC_ECC_SCRUBREG_ECCMODE_SECDED 0x4
  22. void zynq_ddrc_init(void)
  23. {
  24. u32 width, ecctype;
  25. width = readl(&ddrc_base->ddrc_ctrl);
  26. width = (width & ZYNQ_DDRC_CTRLREG_BUSWIDTH_MASK) >>
  27. ZYNQ_DDRC_CTRLREG_BUSWIDTH_SHIFT;
  28. ecctype = (readl(&ddrc_base->ecc_scrub) &
  29. ZYNQ_DDRC_ECC_SCRUBREG_ECC_MODE_MASK);
  30. /* ECC is enabled when memory is in 16bit mode and it is enabled */
  31. if ((ecctype == ZYNQ_DDRC_ECC_SCRUBREG_ECCMODE_SECDED) &&
  32. (width == ZYNQ_DDRC_CTRLREG_BUSWIDTH_16BIT)) {
  33. puts("ECC enabled ");
  34. /*
  35. * Clear the first 1MB because it is not initialized from
  36. * first stage bootloader. To get ECC to work all memory has
  37. * been initialized by writing any value.
  38. */
  39. /* cppcheck-suppress nullPointer */
  40. memset((void *)0, 0, 1 * 1024 * 1024);
  41. } else {
  42. puts("ECC disabled ");
  43. }
  44. }
  45. #endif