sys_info.c 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. /*
  2. * (C) Copyright 2008
  3. * Texas Instruments, <www.ti.com>
  4. *
  5. * Author :
  6. * Manikandan Pillai <mani.pillai@ti.com>
  7. *
  8. * Derived from Beagle Board and 3430 SDP code by
  9. * Richard Woodruff <r-woodruff2@ti.com>
  10. * Syed Mohammed Khasim <khasim@ti.com>
  11. *
  12. * This program is free software; you can redistribute it and/or
  13. * modify it under the terms of the GNU General Public License as
  14. * published by the Free Software Foundation; either version 2 of
  15. * the License, or (at your option) any later version.
  16. *
  17. * This program is distributed in the hope that it will be useful,
  18. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  19. * MERCHANTABILITY or FITNESS FOR A PARTICULAR /PURPOSE. See the
  20. * GNU General Public License for more details.
  21. *
  22. * You should have received a copy of the GNU General Public License
  23. * along with this program; if not, write to the Free Software
  24. * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  25. * MA 02111-1307 USA
  26. */
  27. #include <common.h>
  28. #include <asm/io.h>
  29. #include <asm/arch/mem.h> /* get mem tables */
  30. #include <asm/arch/sys_proto.h>
  31. #include <i2c.h>
  32. extern omap3_sysinfo sysinfo;
  33. static gpmc_csx_t *gpmc_cs_base = (gpmc_csx_t *)GPMC_CONFIG_CS0_BASE;
  34. static sdrc_t *sdrc_base = (sdrc_t *)OMAP34XX_SDRC_BASE;
  35. static ctrl_t *ctrl_base = (ctrl_t *)OMAP34XX_CTRL_BASE;
  36. /******************************************
  37. * get_cpu_rev(void) - extract version info
  38. ******************************************/
  39. u32 get_cpu_rev(void)
  40. {
  41. u32 cpuid = 0;
  42. /*
  43. * On ES1.0 the IDCODE register is not exposed on L4
  44. * so using CPU ID to differentiate
  45. * between ES2.0 and ES1.0.
  46. */
  47. __asm__ __volatile__("mrc p15, 0, %0, c0, c0, 0":"=r"(cpuid));
  48. if ((cpuid & 0xf) == 0x0)
  49. return CPU_3430_ES1;
  50. else
  51. return CPU_3430_ES2;
  52. }
  53. /****************************************************
  54. * is_mem_sdr() - return 1 if mem type in use is SDR
  55. ****************************************************/
  56. u32 is_mem_sdr(void)
  57. {
  58. if (readl(&sdrc_base->cs[CS0].mr) == SDP_SDRC_MR_0_SDR)
  59. return 1;
  60. return 0;
  61. }
  62. /***********************************************************************
  63. * get_cs0_size() - get size of chip select 0/1
  64. ************************************************************************/
  65. u32 get_sdr_cs_size(u32 cs)
  66. {
  67. u32 size;
  68. /* get ram size field */
  69. size = readl(&sdrc_base->cs[cs].mcfg) >> 8;
  70. size &= 0x3FF; /* remove unwanted bits */
  71. size *= SZ_2M; /* find size in MB */
  72. return size;
  73. }
  74. /***********************************************************************
  75. * get_sdr_cs_offset() - get offset of cs from cs0 start
  76. ************************************************************************/
  77. u32 get_sdr_cs_offset(u32 cs)
  78. {
  79. u32 offset;
  80. if (!cs)
  81. return 0;
  82. offset = readl(&sdrc_base->cs_cfg);
  83. offset = (offset & 15) << 27 | (offset & 0x30) >> 17;
  84. return offset;
  85. }
  86. /***********************************************************************
  87. * get_board_type() - get board type based on current production stats.
  88. * - NOTE-1-: 2 I2C EEPROMs will someday be populated with proper info.
  89. * when they are available we can get info from there. This should
  90. * be correct of all known boards up until today.
  91. * - NOTE-2- EEPROMs are populated but they are updated very slowly. To
  92. * avoid waiting on them we will use ES version of the chip to get info.
  93. * A later version of the FPGA migth solve their speed issue.
  94. ************************************************************************/
  95. u32 get_board_type(void)
  96. {
  97. if (get_cpu_rev() == CPU_3430_ES2)
  98. return sysinfo.board_type_v2;
  99. else
  100. return sysinfo.board_type_v1;
  101. }
  102. /***************************************************************************
  103. * get_gpmc0_base() - Return current address hardware will be
  104. * fetching from. The below effectively gives what is correct, its a bit
  105. * mis-leading compared to the TRM. For the most general case the mask
  106. * needs to be also taken into account this does work in practice.
  107. * - for u-boot we currently map:
  108. * -- 0 to nothing,
  109. * -- 4 to flash
  110. * -- 8 to enent
  111. * -- c to wifi
  112. ****************************************************************************/
  113. u32 get_gpmc0_base(void)
  114. {
  115. u32 b;
  116. b = readl(&gpmc_cs_base->config7);
  117. b &= 0x1F; /* keep base [5:0] */
  118. b = b << 24; /* ret 0x0b000000 */
  119. return b;
  120. }
  121. /*******************************************************************
  122. * get_gpmc0_width() - See if bus is in x8 or x16 (mainly for nand)
  123. *******************************************************************/
  124. u32 get_gpmc0_width(void)
  125. {
  126. return WIDTH_16BIT;
  127. }
  128. /*************************************************************************
  129. * get_board_rev() - setup to pass kernel board revision information
  130. * returns:(bit[0-3] sub version, higher bit[7-4] is higher version)
  131. *************************************************************************/
  132. u32 get_board_rev(void)
  133. {
  134. return 0x20;
  135. }
  136. /*********************************************************************
  137. * display_board_info() - print banner with board info.
  138. *********************************************************************/
  139. void display_board_info(u32 btype)
  140. {
  141. char *mem_s, *sec_s;
  142. if (is_mem_sdr())
  143. mem_s = "mSDR";
  144. else
  145. mem_s = "LPDDR";
  146. switch (get_device_type()) {
  147. case TST_DEVICE:
  148. sec_s = "TST";
  149. break;
  150. case EMU_DEVICE:
  151. sec_s = "EMU";
  152. break;
  153. case HS_DEVICE:
  154. sec_s = "HS";
  155. break;
  156. case GP_DEVICE:
  157. sec_s = "GP";
  158. break;
  159. default:
  160. sec_s = "?";
  161. }
  162. printf("OMAP%s-%s rev %d, CPU-OPP2 L3-165MHz\n", sysinfo.cpu_string,
  163. sec_s, get_cpu_rev());
  164. printf("%s + %s/%s\n", sysinfo.board_string,
  165. mem_s, sysinfo.nand_string);
  166. }
  167. /********************************************************
  168. * get_base(); get upper addr of current execution
  169. *******************************************************/
  170. u32 get_base(void)
  171. {
  172. u32 val;
  173. __asm__ __volatile__("mov %0, pc \n":"=r"(val)::"memory");
  174. val &= 0xF0000000;
  175. val >>= 28;
  176. return val;
  177. }
  178. /********************************************************
  179. * is_running_in_flash() - tell if currently running in
  180. * FLASH.
  181. *******************************************************/
  182. u32 is_running_in_flash(void)
  183. {
  184. if (get_base() < 4)
  185. return 1; /* in FLASH */
  186. return 0; /* running in SRAM or SDRAM */
  187. }
  188. /********************************************************
  189. * is_running_in_sram() - tell if currently running in
  190. * SRAM.
  191. *******************************************************/
  192. u32 is_running_in_sram(void)
  193. {
  194. if (get_base() == 4)
  195. return 1; /* in SRAM */
  196. return 0; /* running in FLASH or SDRAM */
  197. }
  198. /********************************************************
  199. * is_running_in_sdram() - tell if currently running in
  200. * SDRAM.
  201. *******************************************************/
  202. u32 is_running_in_sdram(void)
  203. {
  204. if (get_base() > 4)
  205. return 1; /* in SDRAM */
  206. return 0; /* running in SRAM or FLASH */
  207. }
  208. /***************************************************************
  209. * get_boot_type() - Is this an XIP type device or a stream one
  210. * bits 4-0 specify type. Bit 5 says mem/perif
  211. ***************************************************************/
  212. u32 get_boot_type(void)
  213. {
  214. return (readl(&ctrl_base->status) & SYSBOOT_MASK);
  215. }
  216. /*************************************************************
  217. * get_device_type(): tell if GP/HS/EMU/TST
  218. *************************************************************/
  219. u32 get_device_type(void)
  220. {
  221. return ((readl(&ctrl_base->status) & (DEVICE_MASK)) >> 8);
  222. }