spi-boot.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. /*
  2. * Copyright (C) 2013 Renesas Solutions Corp.
  3. *
  4. * SPDX-License-Identifier: GPL-2.0+
  5. */
  6. #include <common.h>
  7. #define CONFIG_SPI_ADDR 0x00000000
  8. #define PHYADDR(_addr) ((_addr & 0x1fffffff) | 0x40000000)
  9. #define CONFIG_RAM_BOOT_PHYS PHYADDR(CONFIG_SYS_TEXT_BASE)
  10. #define SPIWDMADR 0xFE001018
  11. #define SPIWDMCNTR 0xFE001020
  12. #define SPIDMCOR 0xFE001028
  13. #define SPIDMINTSR 0xFE001188
  14. #define SPIDMINTMR 0xFE001190
  15. #define SPIDMINTSR_DMEND 0x00000004
  16. #define TBR 0xFE002000
  17. #define RBR 0xFE002000
  18. #define CR1 0xFE002008
  19. #define CR2 0xFE002010
  20. #define CR3 0xFE002018
  21. #define CR4 0xFE002020
  22. #define CR7 0xFE002038
  23. #define CR8 0xFE002040
  24. /* CR1 */
  25. #define SPI_TBE 0x80
  26. #define SPI_TBF 0x40
  27. #define SPI_RBE 0x20
  28. #define SPI_RBF 0x10
  29. #define SPI_PFONRD 0x08
  30. #define SPI_SSDB 0x04
  31. #define SPI_SSD 0x02
  32. #define SPI_SSA 0x01
  33. /* CR2 */
  34. #define SPI_RSTF 0x80
  35. #define SPI_LOOPBK 0x40
  36. #define SPI_CPOL 0x20
  37. #define SPI_CPHA 0x10
  38. #define SPI_L1M0 0x08
  39. /* CR4 */
  40. #define SPI_TBEI 0x80
  41. #define SPI_TBFI 0x40
  42. #define SPI_RBEI 0x20
  43. #define SPI_RBFI 0x10
  44. #define SPI_SpiS0 0x02
  45. #define SPI_SSS 0x01
  46. /* CR7 */
  47. #define CR7_IDX_OR12 0x12
  48. #define OR12_ADDR32 0x00000001
  49. #define spi_write(val, addr) (*(volatile unsigned long *)(addr)) = val
  50. #define spi_read(addr) (*(volatile unsigned long *)(addr))
  51. /* M25P80 */
  52. #define M25_READ 0x03
  53. #define M25_READ_4BYTE 0x13
  54. extern void bss_start(void);
  55. #define __uses_spiboot2 __attribute__((section(".spiboot2.text")))
  56. static void __uses_spiboot2 spi_reset(void)
  57. {
  58. int timeout = 0x00100000;
  59. /* Make sure the last transaction is finalized */
  60. spi_write(0x00, CR3);
  61. spi_write(0x02, CR1);
  62. while (!(spi_read(CR4) & SPI_SpiS0)) {
  63. if (timeout-- < 0)
  64. break;
  65. }
  66. spi_write(0x00, CR1);
  67. spi_write(spi_read(CR2) | SPI_RSTF, CR2); /* fifo reset */
  68. spi_write(spi_read(CR2) & ~SPI_RSTF, CR2);
  69. spi_write(0, SPIDMCOR);
  70. }
  71. static void __uses_spiboot2 spi_read_flash(void *buf, unsigned long addr,
  72. unsigned long len)
  73. {
  74. spi_write(CR7_IDX_OR12, CR7);
  75. if (spi_read(CR8) & OR12_ADDR32) {
  76. /* 4-bytes address mode */
  77. spi_write(M25_READ_4BYTE, TBR);
  78. spi_write((addr >> 24) & 0xFF, TBR); /* ADDR31-24 */
  79. } else {
  80. /* 3-bytes address mode */
  81. spi_write(M25_READ, TBR);
  82. }
  83. spi_write((addr >> 16) & 0xFF, TBR); /* ADDR23-16 */
  84. spi_write((addr >> 8) & 0xFF, TBR); /* ADDR15-8 */
  85. spi_write(addr & 0xFF, TBR); /* ADDR7-0 */
  86. spi_write(SPIDMINTSR_DMEND, SPIDMINTSR);
  87. spi_write((unsigned long)buf, SPIWDMADR);
  88. spi_write(len & 0xFFFFFFE0, SPIWDMCNTR);
  89. spi_write(1, SPIDMCOR);
  90. spi_write(0xff, CR3);
  91. spi_write(spi_read(CR1) | SPI_SSDB, CR1);
  92. spi_write(spi_read(CR1) | SPI_SSA, CR1);
  93. while (!(spi_read(SPIDMINTSR) & SPIDMINTSR_DMEND))
  94. ;
  95. /* Nagate SP0-SS0 */
  96. spi_write(0, CR1);
  97. }
  98. void __uses_spiboot2 spiboot_main(void)
  99. {
  100. /*
  101. * This code rounds len up for SPIWDMCNTR. We should set it to 0 in
  102. * lower 5-bits.
  103. */
  104. void (*_start)(void) = (void *)CONFIG_SYS_TEXT_BASE;
  105. volatile unsigned long len = (bss_start - _start + 31) & 0xffffffe0;
  106. spi_reset();
  107. spi_read_flash((void *)CONFIG_RAM_BOOT_PHYS, CONFIG_SPI_ADDR, len);
  108. _start();
  109. }