dram_init.S 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. /*
  2. * DDR SDRAM initialization - alter with care
  3. * This file is intended to be included from other assembler files
  4. *
  5. * Note: This file may not modify r8 or r9 because they are used to
  6. * carry information from the decompresser to the kernel
  7. *
  8. * Copyright (C) 2005-2007 Axis Communications AB
  9. *
  10. * Authors: Mikael Starvik <starvik@axis.com>
  11. */
  12. /* Just to be certain the config file is included, we include it here
  13. * explicitely instead of depending on it being included in the file that
  14. * uses this code.
  15. */
  16. #include <hwregs/asm/reg_map_asm.h>
  17. #include <hwregs/asm/ddr2_defs_asm.h>
  18. ;; WARNING! The registers r8 and r9 are used as parameters carrying
  19. ;; information from the decompressor (if the kernel was compressed).
  20. ;; They should not be used in the code below.
  21. ;; Refer to ddr2 MDS for initialization sequence
  22. ; Start clock
  23. move.d REG_ADDR(ddr2, regi_ddr2_ctrl, rw_phy_cfg), $r0
  24. move.d REG_STATE(ddr2, rw_phy_cfg, en, yes), $r1
  25. move.d $r1, [$r0]
  26. ; Reset phy and start calibration
  27. move.d REG_ADDR(ddr2, regi_ddr2_ctrl, rw_phy_ctrl), $r0
  28. move.d REG_STATE(ddr2, rw_phy_ctrl, rst, yes) | \
  29. REG_STATE(ddr2, rw_phy_ctrl, cal_rst, yes), $r1
  30. move.d $r1, [$r0]
  31. move.d REG_STATE(ddr2, rw_phy_ctrl, cal_start, yes), $r1
  32. move.d $r1, [$r0]
  33. ; 2. Wait 200us
  34. move.d 10000, $r2
  35. 1: bne 1b
  36. subq 1, $r2
  37. ; Issue commands
  38. move.d REG_ADDR(ddr2, regi_ddr2_ctrl, rw_ctrl), $r0
  39. move.d sdram_commands_start, $r2
  40. command_loop:
  41. movu.b [$r2+], $r1
  42. movu.w [$r2+], $r3
  43. do_cmd:
  44. lslq 16, $r1
  45. or.d $r3, $r1
  46. move.d $r1, [$r0]
  47. cmp.d sdram_commands_end, $r2
  48. blo command_loop
  49. nop
  50. ; Set timing
  51. move.d REG_ADDR(ddr2, regi_ddr2_ctrl, rw_timing), $r0
  52. move.d CONFIG_ETRAX_DDR2_TIMING, $r1
  53. move.d $r1, [$r0]
  54. ; Set latency
  55. move.d REG_ADDR(ddr2, regi_ddr2_ctrl, rw_latency), $r0
  56. move.d 0x13, $r1
  57. move.d $r1, [$r0]
  58. ; Set configuration
  59. move.d REG_ADDR(ddr2, regi_ddr2_ctrl, rw_cfg), $r0
  60. move.d CONFIG_ETRAX_DDR2_CONFIG, $r1
  61. move.d $r1, [$r0]
  62. ba after_sdram_commands
  63. nop
  64. sdram_commands_start:
  65. .byte regk_ddr2_deselect
  66. .word 0
  67. .byte regk_ddr2_pre
  68. .word regk_ddr2_pre_all
  69. .byte regk_ddr2_emrs2
  70. .word 0
  71. .byte regk_ddr2_emrs3
  72. .word 0
  73. .byte regk_ddr2_emrs
  74. .word regk_ddr2_dll_en
  75. .byte regk_ddr2_mrs
  76. .word regk_ddr2_dll_rst
  77. .byte regk_ddr2_pre
  78. .word regk_ddr2_pre_all
  79. .byte regk_ddr2_ref
  80. .word 0
  81. .byte regk_ddr2_ref
  82. .word 0
  83. .byte regk_ddr2_mrs
  84. .word CONFIG_ETRAX_DDR2_MRS & 0xffff
  85. .byte regk_ddr2_emrs
  86. .word regk_ddr2_ocd_default | regk_ddr2_dll_en
  87. .byte regk_ddr2_emrs
  88. .word regk_ddr2_ocd_exit | regk_ddr2_dll_en | (CONFIG_ETRAX_DDR2_MRS >> 16)
  89. sdram_commands_end:
  90. .align 1
  91. after_sdram_commands: