cpu.c 1.8 KB

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