cpu.c 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. /*
  2. * Copyright (C) 2016 Stefan Roese <sr@denx.de>
  3. *
  4. * SPDX-License-Identifier: GPL-2.0+
  5. */
  6. #include <common.h>
  7. #include <dm.h>
  8. #include <fdtdec.h>
  9. #include <linux/libfdt.h>
  10. #include <asm/io.h>
  11. #include <asm/system.h>
  12. #include <asm/arch/cpu.h>
  13. #include <asm/arch/soc.h>
  14. #include <asm/armv8/mmu.h>
  15. DECLARE_GLOBAL_DATA_PTR;
  16. /* Armada 3700 */
  17. #define MVEBU_GPIO_NB_REG_BASE (MVEBU_REGISTER(0x13800))
  18. #define MVEBU_TEST_PIN_LATCH_N (MVEBU_GPIO_NB_REG_BASE + 0x8)
  19. #define MVEBU_XTAL_MODE_MASK BIT(9)
  20. #define MVEBU_XTAL_MODE_OFFS 9
  21. #define MVEBU_XTAL_CLOCK_25MHZ 0x0
  22. #define MVEBU_XTAL_CLOCK_40MHZ 0x1
  23. #define MVEBU_NB_WARM_RST_REG (MVEBU_GPIO_NB_REG_BASE + 0x40)
  24. #define MVEBU_NB_WARM_RST_MAGIC_NUM 0x1d1e
  25. static struct mm_region mvebu_mem_map[] = {
  26. {
  27. /* RAM */
  28. .phys = 0x0UL,
  29. .virt = 0x0UL,
  30. .size = 0x80000000UL,
  31. .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
  32. PTE_BLOCK_INNER_SHARE
  33. },
  34. {
  35. /* SRAM, MMIO regions */
  36. .phys = 0xd0000000UL,
  37. .virt = 0xd0000000UL,
  38. .size = 0x02000000UL, /* 32MiB internal registers */
  39. .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
  40. PTE_BLOCK_NON_SHARE
  41. },
  42. {
  43. /* PCI regions */
  44. .phys = 0xe8000000UL,
  45. .virt = 0xe8000000UL,
  46. .size = 0x02000000UL, /* 32MiB master PCI space */
  47. .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
  48. PTE_BLOCK_NON_SHARE
  49. },
  50. {
  51. /* List terminator */
  52. 0,
  53. }
  54. };
  55. struct mm_region *mem_map = mvebu_mem_map;
  56. void reset_cpu(ulong ignored)
  57. {
  58. /*
  59. * Write magic number of 0x1d1e to North Bridge Warm Reset register
  60. * to trigger warm reset
  61. */
  62. writel(MVEBU_NB_WARM_RST_MAGIC_NUM, MVEBU_NB_WARM_RST_REG);
  63. }
  64. /*
  65. * get_ref_clk
  66. *
  67. * return: reference clock in MHz (25 or 40)
  68. */
  69. u32 get_ref_clk(void)
  70. {
  71. u32 regval;
  72. regval = (readl(MVEBU_TEST_PIN_LATCH_N) & MVEBU_XTAL_MODE_MASK) >>
  73. MVEBU_XTAL_MODE_OFFS;
  74. if (regval == MVEBU_XTAL_CLOCK_25MHZ)
  75. return 25;
  76. else
  77. return 40;
  78. }