hikey: support BL1
authorHaojian Zhuang <haojian.zhuang@linaro.org>
Wed, 24 May 2017 00:45:05 +0000 (08:45 +0800)
committerDan Handley <dan.handley@arm.com>
Wed, 24 May 2017 16:34:35 +0000 (17:34 +0100)
Initialize regulators, pins and eMMC in BL1. Only SRAM could be used in BL1.
So BL2 will be loaded from eMMC into SRAM later.

Change-Id: I8e7ef82ffa29a3c647c9d2d2981e8759ee85d833
Signed-off-by: Haojian Zhuang <haojian.zhuang@linaro.org>
Signed-off-by: Dan Handley <dan.handley@arm.com>
16 files changed:
plat/hisilicon/hikey/aarch64/hikey_common.c [new file with mode: 0644]
plat/hisilicon/hikey/aarch64/hikey_helpers.S [new file with mode: 0644]
plat/hisilicon/hikey/hikey_bl1_setup.c [new file with mode: 0644]
plat/hisilicon/hikey/hikey_def.h [new file with mode: 0644]
plat/hisilicon/hikey/hikey_io_storage.c [new file with mode: 0644]
plat/hisilicon/hikey/hikey_private.h [new file with mode: 0644]
plat/hisilicon/hikey/include/hi6220.h [new file with mode: 0644]
plat/hisilicon/hikey/include/hi6220_regs_acpu.h [new file with mode: 0644]
plat/hisilicon/hikey/include/hi6220_regs_ao.h [new file with mode: 0644]
plat/hisilicon/hikey/include/hi6220_regs_peri.h [new file with mode: 0644]
plat/hisilicon/hikey/include/hi6220_regs_pin.h [new file with mode: 0644]
plat/hisilicon/hikey/include/hi6220_regs_pmctrl.h [new file with mode: 0644]
plat/hisilicon/hikey/include/hi6553.h [new file with mode: 0644]
plat/hisilicon/hikey/include/plat_macros.S [new file with mode: 0644]
plat/hisilicon/hikey/include/platform_def.h [new file with mode: 0644]
plat/hisilicon/hikey/platform.mk [new file with mode: 0644]

diff --git a/plat/hisilicon/hikey/aarch64/hikey_common.c b/plat/hisilicon/hikey/aarch64/hikey_common.c
new file mode 100644 (file)
index 0000000..d8a68cf
--- /dev/null
@@ -0,0 +1,113 @@
+/*
+ * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <arch_helpers.h>
+#include <arm_gic.h>
+#include <assert.h>
+#include <bl_common.h>
+#include <debug.h>
+#include <mmio.h>
+#include <platform.h>
+#include <platform_def.h>
+#include <xlat_tables.h>
+
+#include "../hikey_def.h"
+
+#define MAP_DDR                MAP_REGION_FLAT(DDR_BASE,                       \
+                                       DDR_SIZE,                       \
+                                       MT_DEVICE | MT_RW | MT_NS)
+
+#define MAP_DEVICE     MAP_REGION_FLAT(DEVICE_BASE,                    \
+                                       DEVICE_SIZE,                    \
+                                       MT_DEVICE | MT_RW | MT_SECURE)
+
+#define MAP_ROM_PARAM  MAP_REGION_FLAT(XG2RAM0_BASE,                   \
+                                       BL1_XG2RAM0_OFFSET,             \
+                                       MT_DEVICE | MT_RO | MT_SECURE)
+
+#define MAP_SRAM       MAP_REGION_FLAT(SRAM_BASE,                      \
+                                       SRAM_SIZE,                      \
+                                       MT_DEVICE | MT_RW | MT_SECURE)
+
+/*
+ * BL1 needs to access the areas of MMC_SRAM.
+ * BL1 loads BL2 from eMMC into SRAM before DDR initialized.
+ */
+#define MAP_MMC_SRAM   MAP_REGION_FLAT(HIKEY_BL1_MMC_DESC_BASE,        \
+                                       HIKEY_BL1_MMC_DESC_SIZE +       \
+                                       HIKEY_BL1_MMC_DATA_SIZE,        \
+                                       MT_DEVICE | MT_RW | MT_SECURE)
+
+/*
+ * Table of regions for different BL stages to map using the MMU.
+ * This doesn't include Trusted RAM as the 'mem_layout' argument passed to
+ * hikey_init_mmu_elx() will give the available subset of that,
+ */
+#if IMAGE_BL1
+static const mmap_region_t hikey_mmap[] = {
+       MAP_DEVICE,
+       MAP_ROM_PARAM,
+       MAP_MMC_SRAM,
+       {0}
+};
+#endif
+
+#if IMAGE_BL2
+static const mmap_region_t hikey_mmap[] = {
+       MAP_DDR,
+       MAP_DEVICE,
+       {0}
+};
+#endif
+
+#if IMAGE_BL31
+static const mmap_region_t hikey_mmap[] = {
+       MAP_DEVICE,
+       MAP_SRAM,
+       {0}
+};
+#endif
+
+/*
+ * Macro generating the code for the function setting up the pagetables as per
+ * the platform memory map & initialize the mmu, for the given exception level
+ */
+#define HIKEY_CONFIGURE_MMU_EL(_el)                            \
+       void hikey_init_mmu_el##_el(unsigned long total_base,   \
+                                 unsigned long total_size,     \
+                                 unsigned long ro_start,       \
+                                 unsigned long ro_limit,       \
+                                 unsigned long coh_start,      \
+                                 unsigned long coh_limit)      \
+       {                                                       \
+              mmap_add_region(total_base, total_base,          \
+                              total_size,                      \
+                              MT_MEMORY | MT_RW | MT_SECURE);  \
+              mmap_add_region(ro_start, ro_start,              \
+                              ro_limit - ro_start,             \
+                              MT_MEMORY | MT_RO | MT_SECURE);  \
+              mmap_add_region(coh_start, coh_start,            \
+                              coh_limit - coh_start,           \
+                              MT_DEVICE | MT_RW | MT_SECURE);  \
+              mmap_add(hikey_mmap);                            \
+              init_xlat_tables();                              \
+                                                               \
+              enable_mmu_el##_el(0);                           \
+       }
+
+/* Define EL1 and EL3 variants of the function initialising the MMU */
+HIKEY_CONFIGURE_MMU_EL(1)
+HIKEY_CONFIGURE_MMU_EL(3)
+
+unsigned long plat_get_ns_image_entrypoint(void)
+{
+       return HIKEY_NS_IMAGE_OFFSET;
+}
+
+unsigned int plat_get_syscnt_freq2(void)
+{
+       return 1200000;
+}
diff --git a/plat/hisilicon/hikey/aarch64/hikey_helpers.S b/plat/hisilicon/hikey/aarch64/hikey_helpers.S
new file mode 100644 (file)
index 0000000..680c0a1
--- /dev/null
@@ -0,0 +1,145 @@
+/*
+ * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <arch.h>
+#include <asm_macros.S>
+#include "../hikey_def.h"
+
+       .globl  plat_my_core_pos
+       .globl  platform_mem_init
+       .globl  plat_crash_console_init
+       .globl  plat_crash_console_putc
+       .globl  plat_report_exception
+       .globl  plat_reset_handler
+
+func plat_my_core_pos
+       mrs     x0, mpidr_el1
+       and     x1, x0, #MPIDR_CPU_MASK
+       and     x0, x0, #MPIDR_CLUSTER_MASK
+       add     x0, x1, x0, LSR #6
+       ret
+endfunc plat_my_core_pos
+
+       /* -----------------------------------------------------
+        * void platform_mem_init(void);
+        *
+        * We don't need to carry out any memory initialization
+        * on HIKEY. The Secure RAM is accessible straight away.
+        * -----------------------------------------------------
+        */
+func platform_mem_init
+       ret
+endfunc platform_mem_init
+
+       /* ---------------------------------------------
+        * int plat_crash_console_init(void)
+        * Function to initialize the crash console
+        * without a C Runtime to print crash report.
+        * Clobber list : x0, x1, x2
+        * ---------------------------------------------
+        */
+func plat_crash_console_init
+       mov_imm x0, CRASH_CONSOLE_BASE
+       mov_imm x1, PL011_UART_CLK_IN_HZ
+       mov_imm x2, PL011_BAUDRATE
+       b       console_core_init
+endfunc plat_crash_console_init
+
+       /* ---------------------------------------------
+        * int plat_crash_console_putc(int c)
+        * Function to print a character on the crash
+        * console without a C Runtime.
+        * Clobber list : x1, x2
+        * ---------------------------------------------
+        */
+func plat_crash_console_putc
+       mov_imm x1, CRASH_CONSOLE_BASE
+       b       console_core_putc
+endfunc plat_crash_console_putc
+
+       /* ---------------------------------------------
+        * void plat_report_exception(unsigned int type)
+        * Function to report an unhandled exception
+        * with platform-specific means.
+        * On HIKEY platform, it updates the LEDs
+        * to indicate where we are
+        * ---------------------------------------------
+        */
+func plat_report_exception
+       mov     x8, x30
+
+       /* Turn on LED according to x0 (0 -- f) */
+       ldr     x2, =0xf7020000
+       and     x1, x0, #1
+       str     w1, [x2, #4]
+       and     x1, x0, #2
+       str     w1, [x2, #8]
+       and     x1, x0, #4
+       str     w1, [x2, #16]
+       and     x1, x0, #8
+       str     w1, [x2, #32]
+
+       mrs     x2, currentel
+       and     x2, x2, #0xc0
+       /* Check EL1 */
+       cmp     x2, #0x04
+       beq     plat_report_el1
+
+       adr     x4, plat_err_str
+       bl      asm_print_str
+
+       adr     x4, esr_el3_str
+       bl      asm_print_str
+
+       mrs     x4, esr_el3
+       bl      asm_print_hex
+
+       adr     x4, elr_el3_str
+       bl      asm_print_str
+
+       mrs     x4, elr_el3
+       bl      asm_print_hex
+       b       plat_report_end
+
+plat_report_el1:
+       adr     x4, plat_err_str
+       bl      asm_print_str
+
+       adr     x4, esr_el1_str
+       bl      asm_print_str
+
+       mrs     x4, esr_el1
+       bl      asm_print_hex
+
+       adr     x4, elr_el1_str
+       bl      asm_print_str
+
+       mrs     x4, elr_el1
+       bl      asm_print_hex
+plat_report_end:
+       mov     x30, x8
+       ret
+endfunc plat_report_exception
+
+       /* -----------------------------------------------------
+        * void plat_reset_handler(void);
+        * -----------------------------------------------------
+        */
+func plat_reset_handler
+       ret
+endfunc plat_reset_handler
+
+.section .rodata.rev_err_str, "aS"
+plat_err_str:
+       .asciz "\nPlatform exception reporting:"
+esr_el3_str:
+       .asciz "\nESR_EL3: "
+elr_el3_str:
+       .asciz "\nELR_EL3: "
+esr_el1_str:
+       .asciz "\nESR_EL1: "
+elr_el1_str:
+       .asciz "\nELR_EL1: "
diff --git a/plat/hisilicon/hikey/hikey_bl1_setup.c b/plat/hisilicon/hikey/hikey_bl1_setup.c
new file mode 100644 (file)
index 0000000..b005874
--- /dev/null
@@ -0,0 +1,551 @@
+/*
+ * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <arch_helpers.h>
+#include <assert.h>
+#include <bl_common.h>
+#include <console.h>
+#include <debug.h>
+#include <dw_mmc.h>
+#include <emmc.h>
+#include <errno.h>
+#include <gpio.h>
+#include <hi6220.h>
+#include <hi6553.h>
+#include <mmio.h>
+#include <pl061_gpio.h>
+#include <platform.h>
+#include <platform_def.h>
+#include <sp804_delay_timer.h>
+#include <string.h>
+#include <tbbr/tbbr_img_desc.h>
+
+#include "../../bl1/bl1_private.h"
+#include "hikey_def.h"
+#include "hikey_private.h"
+
+/*
+ * Declarations of linker defined symbols which will help us find the layout
+ * of trusted RAM
+ */
+extern unsigned long __COHERENT_RAM_START__;
+extern unsigned long __COHERENT_RAM_END__;
+
+/*
+ * The next 2 constants identify the extents of the coherent memory region.
+ * These addresses are used by the MMU setup code and therefore they must be
+ * page-aligned.  It is the responsibility of the linker script to ensure that
+ * __COHERENT_RAM_START__ and __COHERENT_RAM_END__ linker symbols refer to
+ * page-aligned addresses.
+ */
+#define BL1_COHERENT_RAM_BASE (unsigned long)(&__COHERENT_RAM_START__)
+#define BL1_COHERENT_RAM_LIMIT (unsigned long)(&__COHERENT_RAM_END__)
+
+/* Data structure which holds the extents of the trusted RAM for BL1 */
+static meminfo_t bl1_tzram_layout;
+
+enum {
+       BOOT_NORMAL = 0,
+       BOOT_USB_DOWNLOAD,
+       BOOT_UART_DOWNLOAD,
+};
+
+meminfo_t *bl1_plat_sec_mem_layout(void)
+{
+       return &bl1_tzram_layout;
+}
+
+/*
+ * Perform any BL1 specific platform actions.
+ */
+void bl1_early_platform_setup(void)
+{
+       const size_t bl1_size = BL1_RAM_LIMIT - BL1_RAM_BASE;
+
+       /* Initialize the console to provide early debug support */
+       console_init(CONSOLE_BASE, PL011_UART_CLK_IN_HZ, PL011_BAUDRATE);
+
+       /* Allow BL1 to see the whole Trusted RAM */
+       bl1_tzram_layout.total_base = BL1_RW_BASE;
+       bl1_tzram_layout.total_size = BL1_RW_SIZE;
+
+       /* Calculate how much RAM BL1 is using and how much remains free */
+       bl1_tzram_layout.free_base = BL1_RW_BASE;
+       bl1_tzram_layout.free_size = BL1_RW_SIZE;
+       reserve_mem(&bl1_tzram_layout.free_base,
+                   &bl1_tzram_layout.free_size,
+                   BL1_RAM_BASE,
+                   bl1_size);
+
+       INFO("BL1: 0x%lx - 0x%lx [size = %lu]\n", BL1_RAM_BASE, BL1_RAM_LIMIT,
+            bl1_size);
+}
+
+/*
+ * Perform the very early platform specific architecture setup here. At the
+ * moment this only does basic initialization. Later architectural setup
+ * (bl1_arch_setup()) does not do anything platform specific.
+ */
+void bl1_plat_arch_setup(void)
+{
+       hikey_init_mmu_el3(bl1_tzram_layout.total_base,
+                          bl1_tzram_layout.total_size,
+                          BL1_RO_BASE,
+                          BL1_RO_LIMIT,
+                          BL1_COHERENT_RAM_BASE,
+                          BL1_COHERENT_RAM_LIMIT);
+}
+
+static void hikey_sp804_init(void)
+{
+       uint32_t data;
+
+       /* select the clock of dual timer0 */
+       data = mmio_read_32(AO_SC_TIMER_EN0);
+       while (data & 3) {
+               data &= ~3;
+               data |= 3 << 16;
+               mmio_write_32(AO_SC_TIMER_EN0, data);
+               data = mmio_read_32(AO_SC_TIMER_EN0);
+       }
+       /* enable the pclk of dual timer0 */
+       data = mmio_read_32(AO_SC_PERIPH_CLKSTAT4);
+       while (!(data & PCLK_TIMER1) || !(data & PCLK_TIMER0)) {
+               mmio_write_32(AO_SC_PERIPH_CLKEN4, PCLK_TIMER1 | PCLK_TIMER0);
+               data = mmio_read_32(AO_SC_PERIPH_CLKSTAT4);
+       }
+       /* reset dual timer0 */
+       data = mmio_read_32(AO_SC_PERIPH_RSTSTAT4);
+       mmio_write_32(AO_SC_PERIPH_RSTEN4, PCLK_TIMER1 | PCLK_TIMER0);
+       do {
+               data = mmio_read_32(AO_SC_PERIPH_RSTSTAT4);
+       } while (!(data & PCLK_TIMER1) || !(data & PCLK_TIMER0));
+       /* unreset dual timer0 */
+       mmio_write_32(AO_SC_PERIPH_RSTDIS4, PCLK_TIMER1 | PCLK_TIMER0);
+       do {
+               data = mmio_read_32(AO_SC_PERIPH_RSTSTAT4);
+       } while ((data & PCLK_TIMER1) || (data & PCLK_TIMER0));
+
+       sp804_timer_init(SP804_TIMER0_BASE, 10, 192);
+}
+
+static void hikey_gpio_init(void)
+{
+       pl061_gpio_init();
+       pl061_gpio_register(GPIO0_BASE, 0);
+       pl061_gpio_register(GPIO1_BASE, 1);
+       pl061_gpio_register(GPIO2_BASE, 2);
+       pl061_gpio_register(GPIO3_BASE, 3);
+       pl061_gpio_register(GPIO4_BASE, 4);
+       pl061_gpio_register(GPIO5_BASE, 5);
+       pl061_gpio_register(GPIO6_BASE, 6);
+       pl061_gpio_register(GPIO7_BASE, 7);
+       pl061_gpio_register(GPIO8_BASE, 8);
+       pl061_gpio_register(GPIO9_BASE, 9);
+       pl061_gpio_register(GPIO10_BASE, 10);
+       pl061_gpio_register(GPIO11_BASE, 11);
+       pl061_gpio_register(GPIO12_BASE, 12);
+       pl061_gpio_register(GPIO13_BASE, 13);
+       pl061_gpio_register(GPIO14_BASE, 14);
+       pl061_gpio_register(GPIO15_BASE, 15);
+       pl061_gpio_register(GPIO16_BASE, 16);
+       pl061_gpio_register(GPIO17_BASE, 17);
+       pl061_gpio_register(GPIO18_BASE, 18);
+       pl061_gpio_register(GPIO19_BASE, 19);
+
+       /* Power on indicator LED (USER_LED1). */
+       gpio_set_direction(32, GPIO_DIR_OUT);   /* LED1 */
+       gpio_set_value(32, GPIO_LEVEL_HIGH);
+       gpio_set_direction(33, GPIO_DIR_OUT);   /* LED2 */
+       gpio_set_value(33, GPIO_LEVEL_LOW);
+       gpio_set_direction(34, GPIO_DIR_OUT);   /* LED3 */
+       gpio_set_direction(35, GPIO_DIR_OUT);   /* LED4 */
+}
+
+static void hikey_pmussi_init(void)
+{
+       uint32_t data;
+
+       /* Initialize PWR_HOLD GPIO */
+       gpio_set_direction(0, GPIO_DIR_OUT);
+       gpio_set_value(0, GPIO_LEVEL_LOW);
+
+       /*
+        * After reset, PMUSSI stays in reset mode.
+        * Now make it out of reset.
+        */
+       mmio_write_32(AO_SC_PERIPH_RSTDIS4,
+                     AO_SC_PERIPH_RSTDIS4_PRESET_PMUSSI_N);
+       do {
+               data = mmio_read_32(AO_SC_PERIPH_RSTSTAT4);
+       } while (data & AO_SC_PERIPH_RSTDIS4_PRESET_PMUSSI_N);
+
+       /* Set PMUSSI clock latency for read operation. */
+       data = mmio_read_32(AO_SC_MCU_SUBSYS_CTRL3);
+       data &= ~AO_SC_MCU_SUBSYS_CTRL3_RCLK_MASK;
+       data |= AO_SC_MCU_SUBSYS_CTRL3_RCLK_3;
+       mmio_write_32(AO_SC_MCU_SUBSYS_CTRL3, data);
+
+       /* enable PMUSSI clock */
+       data = AO_SC_PERIPH_CLKEN5_PCLK_PMUSSI_CCPU |
+              AO_SC_PERIPH_CLKEN5_PCLK_PMUSSI_MCU;
+       mmio_write_32(AO_SC_PERIPH_CLKEN5, data);
+       data = AO_SC_PERIPH_CLKEN4_PCLK_PMUSSI;
+       mmio_write_32(AO_SC_PERIPH_CLKEN4, data);
+
+       gpio_set_value(0, GPIO_LEVEL_HIGH);
+}
+
+static void hikey_hi6553_init(void)
+{
+       uint8_t data;
+
+       mmio_write_8(HI6553_PERI_EN_MARK, 0x1e);
+       mmio_write_8(HI6553_NP_REG_ADJ1, 0);
+       data = DISABLE6_XO_CLK_CONN | DISABLE6_XO_CLK_NFC |
+               DISABLE6_XO_CLK_RF1 | DISABLE6_XO_CLK_RF2;
+       mmio_write_8(HI6553_DISABLE6_XO_CLK, data);
+
+       /* configure BUCK0 & BUCK1 */
+       mmio_write_8(HI6553_BUCK01_CTRL2, 0x5e);
+       mmio_write_8(HI6553_BUCK0_CTRL7, 0x10);
+       mmio_write_8(HI6553_BUCK1_CTRL7, 0x10);
+       mmio_write_8(HI6553_BUCK0_CTRL5, 0x1e);
+       mmio_write_8(HI6553_BUCK1_CTRL5, 0x1e);
+       mmio_write_8(HI6553_BUCK0_CTRL1, 0xfc);
+       mmio_write_8(HI6553_BUCK1_CTRL1, 0xfc);
+
+       /* configure BUCK2 */
+       mmio_write_8(HI6553_BUCK2_REG1, 0x4f);
+       mmio_write_8(HI6553_BUCK2_REG5, 0x99);
+       mmio_write_8(HI6553_BUCK2_REG6, 0x45);
+       mdelay(1);
+       mmio_write_8(HI6553_VSET_BUCK2_ADJ, 0x22);
+       mdelay(1);
+
+       /* configure BUCK3 */
+       mmio_write_8(HI6553_BUCK3_REG3, 0x02);
+       mmio_write_8(HI6553_BUCK3_REG5, 0x99);
+       mmio_write_8(HI6553_BUCK3_REG6, 0x41);
+       mmio_write_8(HI6553_VSET_BUCK3_ADJ, 0x02);
+       mdelay(1);
+
+       /* configure BUCK4 */
+       mmio_write_8(HI6553_BUCK4_REG2, 0x9a);
+       mmio_write_8(HI6553_BUCK4_REG5, 0x99);
+       mmio_write_8(HI6553_BUCK4_REG6, 0x45);
+
+       /* configure LDO20 */
+       mmio_write_8(HI6553_LDO20_REG_ADJ, 0x50);
+
+       mmio_write_8(HI6553_NP_REG_CHG, 0x0f);
+       mmio_write_8(HI6553_CLK_TOP0, 0x06);
+       mmio_write_8(HI6553_CLK_TOP3, 0xc0);
+       mmio_write_8(HI6553_CLK_TOP4, 0x00);
+
+       /* configure LDO7 & LDO10 for SD slot */
+       /* enable LDO7 */
+       data = mmio_read_8(HI6553_LDO7_REG_ADJ);
+       data = (data & 0xf8) | 0x2;
+       mmio_write_8(HI6553_LDO7_REG_ADJ, data);
+       mdelay(5);
+       mmio_write_8(HI6553_ENABLE2_LDO1_8, 1 << 6);
+       mdelay(5);
+       /* enable LDO10 */
+       data = mmio_read_8(HI6553_LDO10_REG_ADJ);
+       data = (data & 0xf8) | 0x5;
+       mmio_write_8(HI6553_LDO10_REG_ADJ, data);
+       mdelay(5);
+       mmio_write_8(HI6553_ENABLE3_LDO9_16, 1 << 1);
+       mdelay(5);
+       /* enable LDO15 */
+       data = mmio_read_8(HI6553_LDO15_REG_ADJ);
+       data = (data & 0xf8) | 0x4;
+       mmio_write_8(HI6553_LDO15_REG_ADJ, data);
+       mmio_write_8(HI6553_ENABLE3_LDO9_16, 1 << 6);
+       mdelay(5);
+       /* enable LDO19 */
+       data = mmio_read_8(HI6553_LDO19_REG_ADJ);
+       data |= 0x7;
+       mmio_write_8(HI6553_LDO19_REG_ADJ, data);
+       mmio_write_8(HI6553_ENABLE4_LDO17_22, 1 << 2);
+       mdelay(5);
+       /* enable LDO21 */
+       data = mmio_read_8(HI6553_LDO21_REG_ADJ);
+       data = (data & 0xf8) | 0x3;
+       mmio_write_8(HI6553_LDO21_REG_ADJ, data);
+       mmio_write_8(HI6553_ENABLE4_LDO17_22, 1 << 4);
+       mdelay(5);
+       /* enable LDO22 */
+       data = mmio_read_8(HI6553_LDO22_REG_ADJ);
+       data = (data & 0xf8) | 0x7;
+       mmio_write_8(HI6553_LDO22_REG_ADJ, data);
+       mmio_write_8(HI6553_ENABLE4_LDO17_22, 1 << 5);
+       mdelay(5);
+
+       /* select 32.764KHz */
+       mmio_write_8(HI6553_CLK19M2_600_586_EN, 0x01);
+}
+
+static void init_mmc0_pll(void)
+{
+       unsigned int data;
+
+       /* select SYSPLL as the source of MMC0 */
+       /* select SYSPLL as the source of MUX1 (SC_CLK_SEL0) */
+       mmio_write_32(PERI_SC_CLK_SEL0, 1 << 5 | 1 << 21);
+       do {
+               data = mmio_read_32(PERI_SC_CLK_SEL0);
+       } while (!(data & (1 << 5)));
+       /* select MUX1 as the source of MUX2 (SC_CLK_SEL0) */
+       mmio_write_32(PERI_SC_CLK_SEL0, 1 << 29);
+       do {
+               data = mmio_read_32(PERI_SC_CLK_SEL0);
+       } while (data & (1 << 13));
+
+       mmio_write_32(PERI_SC_PERIPH_CLKEN0, (1 << 0));
+       do {
+               data = mmio_read_32(PERI_SC_PERIPH_CLKSTAT0);
+       } while (!(data & (1 << 0)));
+
+       data = mmio_read_32(PERI_SC_PERIPH_CLKEN12);
+       data |= 1 << 1;
+       mmio_write_32(PERI_SC_PERIPH_CLKEN12, data);
+
+       do {
+               mmio_write_32(PERI_SC_CLKCFG8BIT1, (1 << 7) | 0xb);
+               data = mmio_read_32(PERI_SC_CLKCFG8BIT1);
+       } while ((data & 0xb) != 0xb);
+}
+
+static void reset_mmc0_clk(void)
+{
+       unsigned int data;
+
+       /* disable mmc0 bus clock */
+       mmio_write_32(PERI_SC_PERIPH_CLKDIS0, PERI_CLK0_MMC0);
+       do {
+               data = mmio_read_32(PERI_SC_PERIPH_CLKSTAT0);
+       } while (data & PERI_CLK0_MMC0);
+       /* enable mmc0 bus clock */
+       mmio_write_32(PERI_SC_PERIPH_CLKEN0, PERI_CLK0_MMC0);
+       do {
+               data = mmio_read_32(PERI_SC_PERIPH_CLKSTAT0);
+       } while (!(data & PERI_CLK0_MMC0));
+       /* reset mmc0 clock domain */
+       mmio_write_32(PERI_SC_PERIPH_RSTEN0, PERI_RST0_MMC0);
+
+       /* bypass mmc0 clock phase */
+       data = mmio_read_32(PERI_SC_PERIPH_CTRL2);
+       data |= 3;
+       mmio_write_32(PERI_SC_PERIPH_CTRL2, data);
+
+       /* disable low power */
+       data = mmio_read_32(PERI_SC_PERIPH_CTRL13);
+       data |= 1 << 3;
+       mmio_write_32(PERI_SC_PERIPH_CTRL13, data);
+       do {
+               data = mmio_read_32(PERI_SC_PERIPH_RSTSTAT0);
+       } while (!(data & PERI_RST0_MMC0));
+
+       /* unreset mmc0 clock domain */
+       mmio_write_32(PERI_SC_PERIPH_RSTDIS0, PERI_RST0_MMC0);
+       do {
+               data = mmio_read_32(PERI_SC_PERIPH_RSTSTAT0);
+       } while (data & PERI_RST0_MMC0);
+}
+
+static void init_media_clk(void)
+{
+       unsigned int data, value;
+
+       data = mmio_read_32(PMCTRL_MEDPLLCTRL);
+       data |= 1;
+       mmio_write_32(PMCTRL_MEDPLLCTRL, data);
+
+       for (;;) {
+               data = mmio_read_32(PMCTRL_MEDPLLCTRL);
+               value = 1 << 28;
+               if ((data & value) == value)
+                       break;
+       }
+
+       data = mmio_read_32(PERI_SC_PERIPH_CLKEN12);
+       data = 1 << 10;
+       mmio_write_32(PERI_SC_PERIPH_CLKEN12, data);
+}
+
+static void init_mmc1_pll(void)
+{
+       uint32_t data;
+
+       /* select SYSPLL as the source of MMC1 */
+       /* select SYSPLL as the source of MUX1 (SC_CLK_SEL0) */
+       mmio_write_32(PERI_SC_CLK_SEL0, 1 << 11 | 1 << 27);
+       do {
+               data = mmio_read_32(PERI_SC_CLK_SEL0);
+       } while (!(data & (1 << 11)));
+       /* select MUX1 as the source of MUX2 (SC_CLK_SEL0) */
+       mmio_write_32(PERI_SC_CLK_SEL0, 1 << 30);
+       do {
+               data = mmio_read_32(PERI_SC_CLK_SEL0);
+       } while (data & (1 << 14));
+
+       mmio_write_32(PERI_SC_PERIPH_CLKEN0, (1 << 1));
+       do {
+               data = mmio_read_32(PERI_SC_PERIPH_CLKSTAT0);
+       } while (!(data & (1 << 1)));
+
+       data = mmio_read_32(PERI_SC_PERIPH_CLKEN12);
+       data |= 1 << 2;
+       mmio_write_32(PERI_SC_PERIPH_CLKEN12, data);
+
+       do {
+               /* 1.2GHz / 50 = 24MHz */
+               mmio_write_32(PERI_SC_CLKCFG8BIT2, 0x31 | (1 << 7));
+               data = mmio_read_32(PERI_SC_CLKCFG8BIT2);
+       } while ((data & 0x31) != 0x31);
+}
+
+static void reset_mmc1_clk(void)
+{
+       unsigned int data;
+
+       /* disable mmc1 bus clock */
+       mmio_write_32(PERI_SC_PERIPH_CLKDIS0, PERI_CLK0_MMC1);
+       do {
+               data = mmio_read_32(PERI_SC_PERIPH_CLKSTAT0);
+       } while (data & PERI_CLK0_MMC1);
+       /* enable mmc1 bus clock */
+       mmio_write_32(PERI_SC_PERIPH_CLKEN0, PERI_CLK0_MMC1);
+       do {
+               data = mmio_read_32(PERI_SC_PERIPH_CLKSTAT0);
+       } while (!(data & PERI_CLK0_MMC1));
+       /* reset mmc1 clock domain */
+       mmio_write_32(PERI_SC_PERIPH_RSTEN0, PERI_RST0_MMC1);
+
+       /* bypass mmc1 clock phase */
+       data = mmio_read_32(PERI_SC_PERIPH_CTRL2);
+       data |= 3 << 2;
+       mmio_write_32(PERI_SC_PERIPH_CTRL2, data);
+
+       /* disable low power */
+       data = mmio_read_32(PERI_SC_PERIPH_CTRL13);
+       data |= 1 << 4;
+       mmio_write_32(PERI_SC_PERIPH_CTRL13, data);
+       do {
+               data = mmio_read_32(PERI_SC_PERIPH_RSTSTAT0);
+       } while (!(data & PERI_RST0_MMC1));
+
+       /* unreset mmc0 clock domain */
+       mmio_write_32(PERI_SC_PERIPH_RSTDIS0, PERI_RST0_MMC1);
+       do {
+               data = mmio_read_32(PERI_SC_PERIPH_RSTSTAT0);
+       } while (data & PERI_RST0_MMC1);
+}
+
+/* Initialize PLL of both eMMC and SD controllers. */
+static void hikey_mmc_pll_init(void)
+{
+       init_mmc0_pll();
+       reset_mmc0_clk();
+       init_media_clk();
+
+       dsb();
+
+       init_mmc1_pll();
+       reset_mmc1_clk();
+}
+
+/*
+ * Function which will perform any remaining platform-specific setup that can
+ * occur after the MMU and data cache have been enabled.
+ */
+void bl1_platform_setup(void)
+{
+       dw_mmc_params_t params;
+
+       assert((HIKEY_BL1_MMC_DESC_BASE >= SRAM_BASE) &&
+              ((SRAM_BASE + SRAM_SIZE) >=
+               (HIKEY_BL1_MMC_DATA_BASE + HIKEY_BL1_MMC_DATA_SIZE)));
+       hikey_sp804_init();
+       hikey_gpio_init();
+       hikey_pmussi_init();
+       hikey_hi6553_init();
+
+       hikey_mmc_pll_init();
+
+       memset(&params, 0, sizeof(dw_mmc_params_t));
+       params.reg_base = DWMMC0_BASE;
+       params.desc_base = HIKEY_BL1_MMC_DESC_BASE;
+       params.desc_size = 1 << 20;
+       params.clk_rate = 24 * 1000 * 1000;
+       params.bus_width = EMMC_BUS_WIDTH_8;
+       params.flags = EMMC_FLAG_CMD23;
+       dw_mmc_init(&params);
+
+       hikey_io_setup();
+}
+
+/*
+ * The following function checks if Firmware update is needed,
+ * by checking if TOC in FIP image is valid or not.
+ */
+unsigned int bl1_plat_get_next_image_id(void)
+{
+       int32_t boot_mode;
+       unsigned int ret;
+
+       boot_mode = mmio_read_32(ONCHIPROM_PARAM_BASE);
+       switch (boot_mode) {
+       case BOOT_NORMAL:
+               ret = BL2_IMAGE_ID;
+               break;
+       case BOOT_USB_DOWNLOAD:
+       case BOOT_UART_DOWNLOAD:
+               ret = NS_BL1U_IMAGE_ID;
+               break;
+       default:
+               WARN("Invalid boot mode is found:%d\n", boot_mode);
+               panic();
+       }
+       return ret;
+}
+
+image_desc_t *bl1_plat_get_image_desc(unsigned int image_id)
+{
+       unsigned int index = 0;
+
+       while (bl1_tbbr_image_descs[index].image_id != INVALID_IMAGE_ID) {
+               if (bl1_tbbr_image_descs[index].image_id == image_id)
+                       return &bl1_tbbr_image_descs[index];
+
+               index++;
+       }
+
+       return NULL;
+}
+
+void bl1_plat_set_ep_info(unsigned int image_id,
+               entry_point_info_t *ep_info)
+{
+       unsigned int data = 0;
+
+       if (image_id == BL2_IMAGE_ID)
+               return;
+       inv_dcache_range(NS_BL1U_BASE, NS_BL1U_SIZE);
+       __asm__ volatile ("mrs  %0, cpacr_el1" : "=r"(data));
+       do {
+               data |= 3 << 20;
+               __asm__ volatile ("msr  cpacr_el1, %0" : : "r"(data));
+               __asm__ volatile ("mrs  %0, cpacr_el1" : "=r"(data));
+       } while ((data & (3 << 20)) != (3 << 20));
+       INFO("cpacr_el1:0x%x\n", data);
+
+       ep_info->args.arg0 = 0xffff & read_mpidr();
+       ep_info->spsr = SPSR_64(MODE_EL1, MODE_SP_ELX,
+                               DISABLE_ALL_EXCEPTIONS);
+}
diff --git a/plat/hisilicon/hikey/hikey_def.h b/plat/hisilicon/hikey/hikey_def.h
new file mode 100644 (file)
index 0000000..28ff553
--- /dev/null
@@ -0,0 +1,101 @@
+/*
+ * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef __HIKEY_DEF_H__
+#define __HIKEY_DEF_H__
+
+#include <common_def.h>
+#include <tbbr_img_def.h>
+
+/* Always assume DDR is 1GB size. */
+#define DDR_BASE                       0x0
+#define DDR_SIZE                       0x80000000
+
+#define DEVICE_BASE                    0xF4000000
+#define DEVICE_SIZE                    0x05800000
+
+#define XG2RAM0_BASE                   0xF9800000
+#define XG2RAM0_SIZE                   0x00400000
+
+#define SRAM_BASE                      0xFFF80000
+#define SRAM_SIZE                      0x00012000
+
+/*
+ * BL1 is stored in XG2RAM0_HIRQ that is 784KB large (0xF980_0000~0xF98C_4000).
+ */
+#define ONCHIPROM_PARAM_BASE           (XG2RAM0_BASE + 0x700)
+#define LOADER_RAM_BASE                        (XG2RAM0_BASE + 0x800)
+#define BL1_XG2RAM0_OFFSET             0x1000
+
+/*
+ * PL011 related constants
+ */
+#define PL011_UART0_BASE               0xF8015000
+#define PL011_UART3_BASE               0xF7113000
+#define PL011_BAUDRATE                 115200
+#define PL011_UART_CLK_IN_HZ           19200000
+
+#define HIKEY_USB_DESC_BASE            (DDR_BASE + 0x00800000)
+#define HIKEY_USB_DESC_SIZE            0x00100000
+#define HIKEY_USB_DATA_BASE            (DDR_BASE + 0x10000000)
+#define HIKEY_USB_DATA_SIZE            0x10000000
+#define HIKEY_FB_BUFFER_BASE           (HIKEY_USB_DATA_BASE)
+#define HIKEY_FB_BUFFER_SIZE           HIKEY_USB_DATA_SIZE
+#define HIKEY_FB_DOWNLOAD_BASE         (HIKEY_FB_BUFFER_BASE +         \
+                                        HIKEY_FB_BUFFER_SIZE)
+#define HIKEY_FB_DOWNLOAD_SIZE         HIKEY_USB_DATA_SIZE
+
+#define HIKEY_USB_DESC_IN_BASE         (DDR_BASE + 0x00800000)
+#define HIKEY_USB_DESC_IN_SIZE         0x00040000
+#define HIKEY_USB_DESC_EP0_OUT_BASE    (HIKEY_USB_DESC_IN_BASE +       \
+                                        HIKEY_USB_DESC_IN_SIZE)
+#define HIKEY_USB_DESC_EP0_OUT_SIZE    0x00040000
+#define HIKEY_USB_DESC_EPX_OUT_BASE    (HIKEY_USB_DESC_EP0_OUT_BASE +  \
+                                        HIKEY_USB_DESC_EP0_OUT_SIZE)
+#define HIKEY_USB_DESC_EPX_OUT_SIZE    0x00080000
+
+#define HIKEY_MMC_DESC_BASE            (DDR_BASE + 0x03000000)
+#define HIKEY_MMC_DESC_SIZE            0x00100000
+
+/*
+ * HIKEY_MMC_DATA_BASE & HIKEY_MMC_DATA_SIZE are shared between fastboot
+ * and eMMC driver. Since it could avoid to memory copy.
+ * So this SRAM region is used twice. First, it's used in BL1 as temporary
+ * buffer in eMMC driver. Second, it's used by MCU in BL2. The SRAM region
+ * needs to be clear before used in BL2.
+ */
+#define HIKEY_MMC_DATA_BASE            (DDR_BASE + 0x10000000)
+#define HIKEY_MMC_DATA_SIZE            0x20000000
+#define HIKEY_NS_IMAGE_OFFSET          (DDR_BASE + 0x35000000)
+#define HIKEY_BL1_MMC_DESC_BASE                (SRAM_BASE)
+#define HIKEY_BL1_MMC_DESC_SIZE                0x00001000
+#define HIKEY_BL1_MMC_DATA_BASE                (HIKEY_BL1_MMC_DESC_BASE +      \
+                                        HIKEY_BL1_MMC_DESC_SIZE)
+#define HIKEY_BL1_MMC_DATA_SIZE                0x0000B000
+
+#define EMMC_BASE                      0
+#define HIKEY_FIP_BASE                 (EMMC_BASE + (4 << 20))
+#define HIKEY_FIP_MAX_SIZE             (8 << 20)
+#define HIKEY_EMMC_RPMB_BASE           (EMMC_BASE + 0)
+#define HIKEY_EMMC_RPMB_MAX_SIZE       (128 << 10)
+#define HIKEY_EMMC_USERDATA_BASE       (EMMC_BASE + 0)
+#define HIKEY_EMMC_USERDATA_MAX_SIZE   (4 << 30)
+
+/*
+ * GIC400 interrupt handling related constants
+ */
+#define IRQ_SEC_PHY_TIMER                      29
+#define IRQ_SEC_SGI_0                          8
+#define IRQ_SEC_SGI_1                          9
+#define IRQ_SEC_SGI_2                          10
+#define IRQ_SEC_SGI_3                          11
+#define IRQ_SEC_SGI_4                          12
+#define IRQ_SEC_SGI_5                          13
+#define IRQ_SEC_SGI_6                          14
+#define IRQ_SEC_SGI_7                          15
+#define IRQ_SEC_SGI_8                          16
+
+#endif /* __HIKEY_DEF_H__ */
diff --git a/plat/hisilicon/hikey/hikey_io_storage.c b/plat/hisilicon/hikey/hikey_io_storage.c
new file mode 100644 (file)
index 0000000..4ca1846
--- /dev/null
@@ -0,0 +1,183 @@
+/*
+ * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <arch_helpers.h>
+#include <assert.h>
+#include <debug.h>
+#include <emmc.h>
+#include <errno.h>
+#include <firmware_image_package.h>
+#include <io_block.h>
+#include <io_driver.h>
+#include <io_fip.h>
+#include <io_memmap.h>
+#include <io_storage.h>
+#include <mmio.h>
+#include <platform_def.h>
+#include <semihosting.h>       /* For FOPEN_MODE_... */
+#include <string.h>
+#include "hikey_private.h"
+
+#define EMMC_BLOCK_SHIFT                       9
+
+/* Page 1024, since only a few pages before 2048 are used as partition table */
+#define SERIALNO_EMMC_OFFSET                   (1024 * 512)
+
+struct plat_io_policy {
+       uintptr_t *dev_handle;
+       uintptr_t image_spec;
+       int (*check)(const uintptr_t spec);
+};
+
+static const io_dev_connector_t *emmc_dev_con;
+static uintptr_t emmc_dev_handle;
+static const io_dev_connector_t *fip_dev_con;
+static uintptr_t fip_dev_handle;
+
+static int check_emmc(const uintptr_t spec);
+static int check_fip(const uintptr_t spec);
+
+static const io_block_spec_t emmc_fip_spec = {
+       .offset         = HIKEY_FIP_BASE,
+       .length         = HIKEY_FIP_MAX_SIZE,
+};
+
+static const io_block_dev_spec_t emmc_dev_spec = {
+       /* It's used as temp buffer in block driver. */
+#if IMAGE_BL1
+       .buffer         = {
+               .offset = HIKEY_BL1_MMC_DATA_BASE,
+               .length = HIKEY_BL1_MMC_DATA_SIZE,
+       },
+#else
+       .buffer         = {
+               .offset = HIKEY_MMC_DATA_BASE,
+               .length = HIKEY_MMC_DATA_SIZE,
+       },
+#endif
+       .ops            = {
+               .read   = emmc_read_blocks,
+               .write  = emmc_write_blocks,
+       },
+       .block_size     = EMMC_BLOCK_SIZE,
+};
+
+static const io_uuid_spec_t bl2_uuid_spec = {
+       .uuid = UUID_TRUSTED_BOOT_FIRMWARE_BL2,
+};
+
+static const io_uuid_spec_t bl31_uuid_spec = {
+       .uuid = UUID_EL3_RUNTIME_FIRMWARE_BL31,
+};
+
+static const io_uuid_spec_t bl33_uuid_spec = {
+       .uuid = UUID_NON_TRUSTED_FIRMWARE_BL33,
+};
+
+static const io_uuid_spec_t scp_bl2_uuid_spec = {
+       .uuid = UUID_SCP_FIRMWARE_SCP_BL2,
+};
+
+static const struct plat_io_policy policies[] = {
+       [FIP_IMAGE_ID] = {
+               &emmc_dev_handle,
+               (uintptr_t)&emmc_fip_spec,
+               check_emmc
+       },
+       [BL2_IMAGE_ID] = {
+               &fip_dev_handle,
+               (uintptr_t)&bl2_uuid_spec,
+               check_fip
+       },
+       [SCP_BL2_IMAGE_ID] = {
+               &fip_dev_handle,
+               (uintptr_t)&scp_bl2_uuid_spec,
+               check_fip
+       },
+       [BL31_IMAGE_ID] = {
+               &fip_dev_handle,
+               (uintptr_t)&bl31_uuid_spec,
+               check_fip
+       },
+       [BL33_IMAGE_ID] = {
+               &fip_dev_handle,
+               (uintptr_t)&bl33_uuid_spec,
+               check_fip
+       }
+};
+
+static int check_emmc(const uintptr_t spec)
+{
+       int result;
+       uintptr_t local_handle;
+
+       result = io_dev_init(emmc_dev_handle, (uintptr_t)NULL);
+       if (result == 0) {
+               result = io_open(emmc_dev_handle, spec, &local_handle);
+               if (result == 0)
+                       io_close(local_handle);
+       }
+       return result;
+}
+
+static int check_fip(const uintptr_t spec)
+{
+       int result;
+       uintptr_t local_image_handle;
+
+       /* See if a Firmware Image Package is available */
+       result = io_dev_init(fip_dev_handle, (uintptr_t)FIP_IMAGE_ID);
+       if (result == 0) {
+               result = io_open(fip_dev_handle, spec, &local_image_handle);
+               if (result == 0) {
+                       VERBOSE("Using FIP\n");
+                       io_close(local_image_handle);
+               }
+       }
+       return result;
+}
+
+void hikey_io_setup(void)
+{
+       int result;
+
+       result = register_io_dev_block(&emmc_dev_con);
+       assert(result == 0);
+
+       result = register_io_dev_fip(&fip_dev_con);
+       assert(result == 0);
+
+       result = io_dev_open(emmc_dev_con, (uintptr_t)&emmc_dev_spec,
+                            &emmc_dev_handle);
+       assert(result == 0);
+
+       result = io_dev_open(fip_dev_con, (uintptr_t)NULL, &fip_dev_handle);
+       assert(result == 0);
+
+       /* Ignore improbable errors in release builds */
+       (void)result;
+}
+
+/* Return an IO device handle and specification which can be used to access
+ * an image. Use this to enforce platform load policy
+ */
+int plat_get_image_source(unsigned int image_id, uintptr_t *dev_handle,
+                         uintptr_t *image_spec)
+{
+       int result;
+       const struct plat_io_policy *policy;
+
+       assert(image_id < ARRAY_SIZE(policies));
+
+       policy = &policies[image_id];
+       result = policy->check(policy->image_spec);
+       assert(result == 0);
+
+       *image_spec = policy->image_spec;
+       *dev_handle = *(policy->dev_handle);
+
+       return result;
+}
diff --git a/plat/hisilicon/hikey/hikey_private.h b/plat/hisilicon/hikey/hikey_private.h
new file mode 100644 (file)
index 0000000..a7709b2
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef __HIKEY_PRIVATE_H__
+#define __HIKEY_PRIVATE_H__
+
+#include <bl_common.h>
+
+#define RANDOM_MAX             0x7fffffffffffffff
+#define RANDOM_MAGIC           0x9a4dbeaf
+
+struct random_serial_num {
+       uint64_t        magic;
+       uint64_t        data;
+       char            serialno[32];
+};
+
+/*
+ * Function and variable prototypes
+ */
+void hikey_init_mmu_el1(unsigned long total_base,
+                       unsigned long total_size,
+                       unsigned long ro_start,
+                       unsigned long ro_limit,
+                       unsigned long coh_start,
+                       unsigned long coh_limit);
+void hikey_init_mmu_el3(unsigned long total_base,
+                       unsigned long total_size,
+                       unsigned long ro_start,
+                       unsigned long ro_limit,
+                       unsigned long coh_start,
+                       unsigned long coh_limit);
+
+void hikey_ddr_init(void);
+void hikey_io_setup(void);
+
+int hikey_get_partition_size(const char *arg, int left, char *response);
+int hikey_get_partition_type(const char *arg, int left, char *response);
+
+int hikey_erase(const char *arg);
+int hikey_flash(const char *arg);
+int hikey_oem(const char *arg);
+int hikey_reboot(const char *arg);
+
+const char *hikey_init_serialno(void);
+int hikey_read_serialno(struct random_serial_num *serialno);
+int hikey_write_serialno(struct random_serial_num *serialno);
+
+void init_acpu_dvfs(void);
+
+#endif /* __HIKEY_PRIVATE_H__ */
diff --git a/plat/hisilicon/hikey/include/hi6220.h b/plat/hisilicon/hikey/include/hi6220.h
new file mode 100644 (file)
index 0000000..a9c408d
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef __HI6220_H__
+#define __HI6220_H__
+
+#include <hi6220_regs_acpu.h>
+#include <hi6220_regs_ao.h>
+#include <hi6220_regs_peri.h>
+#include <hi6220_regs_pin.h>
+#include <hi6220_regs_pmctrl.h>
+
+/*******************************************************************************
+ * Implementation defined ACTLR_EL2 bit definitions
+ ******************************************************************************/
+#define ACTLR_EL2_L2ACTLR_BIT          (1 << 6)
+#define ACTLR_EL2_L2ECTLR_BIT          (1 << 5)
+#define ACTLR_EL2_L2CTLR_BIT           (1 << 4)
+#define ACTLR_EL2_CPUECTLR_BIT         (1 << 1)
+#define ACTLR_EL2_CPUACTLR_BIT         (1 << 0)
+
+/*******************************************************************************
+ * Implementation defined ACTLR_EL3 bit definitions
+ ******************************************************************************/
+#define ACTLR_EL3_L2ACTLR_BIT          (1 << 6)
+#define ACTLR_EL3_L2ECTLR_BIT          (1 << 5)
+#define ACTLR_EL3_L2CTLR_BIT           (1 << 4)
+#define ACTLR_EL3_CPUECTLR_BIT         (1 << 1)
+#define ACTLR_EL3_CPUACTLR_BIT         (1 << 0)
+
+/*******************************************************************************
+ * CCI-400 related constants
+ ******************************************************************************/
+#define CCI400_BASE                            0xF6E90000
+#define CCI400_SL_IFACE3_CLUSTER_IX            3
+#define CCI400_SL_IFACE4_CLUSTER_IX            4
+
+#define DWMMC0_BASE                            0xF723D000
+
+#define DWUSB_BASE                             0xF72C0000
+
+#define PMUSSI_BASE                            0xF8000000
+
+#define SP804_TIMER0_BASE                      0xF8008000
+
+#define GPIO0_BASE                             0xF8011000
+#define GPIO1_BASE                             0xF8012000
+#define GPIO2_BASE                             0xF8013000
+#define GPIO3_BASE                             0xF8014000
+#define GPIO4_BASE                             0xF7020000
+#define GPIO5_BASE                             0xF7021000
+#define GPIO6_BASE                             0xF7022000
+#define GPIO7_BASE                             0xF7023000
+#define GPIO8_BASE                             0xF7024000
+#define GPIO9_BASE                             0xF7025000
+#define GPIO10_BASE                            0xF7026000
+#define GPIO11_BASE                            0xF7027000
+#define GPIO12_BASE                            0xF7028000
+#define GPIO13_BASE                            0xF7029000
+#define GPIO14_BASE                            0xF702A000
+#define GPIO15_BASE                            0xF702B000
+#define GPIO16_BASE                            0xF702C000
+#define GPIO17_BASE                            0xF702D000
+#define GPIO18_BASE                            0xF702E000
+#define GPIO19_BASE                            0xF702F000
+
+#endif /* __HI6220_H__ */
diff --git a/plat/hisilicon/hikey/include/hi6220_regs_acpu.h b/plat/hisilicon/hikey/include/hi6220_regs_acpu.h
new file mode 100644 (file)
index 0000000..dde9e65
--- /dev/null
@@ -0,0 +1,300 @@
+/*
+ * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef __HI6220_REGS_ACPU_H__
+#define __HI6220_REGS_ACPU_H__
+
+#define ACPU_CTRL_BASE                         0xF6504000
+
+#define ACPU_SC_CPU_CTRL                       (ACPU_CTRL_BASE + 0x000)
+#define ACPU_SC_CPU_STAT                       (ACPU_CTRL_BASE + 0x008)
+#define ACPU_SC_CPU_STAT_SC_STANDBYWFIL2               (1 << 0)
+#define ACPU_SC_CPU_STAT_SC_STANDBYWFIL2_SHIFT         (0)
+#define ACPU_SC_CPU_STAT_SC_STANDBYWFI0                        (1 << 1)
+#define ACPU_SC_CPU_STAT_SC_STANDBYWFI0_SHIFT          (1)
+#define ACPU_SC_CPU_STAT_SC_STANDBYWFI1                        (1 << 2)
+#define ACPU_SC_CPU_STAT_SC_STANDBYWFI1_SHIFT          (2)
+#define ACPU_SC_CPU_STAT_SC_STANDBYWFI2                        (1 << 3)
+#define ACPU_SC_CPU_STAT_SC_STANDBYWFI2_SHIFT          (3)
+#define ACPU_SC_CPU_STAT_SC_STANDBYWFI3                        (1 << 4)
+#define ACPU_SC_CPU_STAT_SC_STANDBYWFI3_SHIFT          (4)
+#define ACPU_SC_CPU_STAT_A53_1_STANDBYWFIL2            (1 << 8)
+#define ACPU_SC_CPU_STAT_A53_1_STANDBYWFIL2_SHIFT      (8)
+#define ACPU_SC_CPU_STAT_A53_1_STANDBYWFI              (1 << 9)
+#define ACPU_SC_CPU_STAT_A53_1_STANDBYWFI_SHIFT                (9)
+#define ACPU_SC_CPU_STAT_L2FLSHUDONE0                  (1 << 16)
+#define ACPU_SC_CPU_STAT_L2FLSHUDONE0_SHIFT            (16)
+#define ACPU_SC_CPU_STAT_L2FLSHUDONE1                  (1 << 17)
+#define ACPU_SC_CPU_STAT_L2FLSHUDONE1_SHIFT            (17)
+#define ACPU_SC_CPU_STAT_CCI400_ACTIVE                 (1 << 18)
+#define ACPU_SC_CPU_STAT_CCI400_ACTIVE_SHIFT           (18)
+#define ACPU_SC_CPU_STAT_CLK_DIV_STATUS_VD             (1 << 20)
+#define ACPU_SC_CPU_STAT_CLK_DIV_STATUS_VD_SHIFT       (20)
+
+#define ACPU_SC_CLKEN                          (ACPU_CTRL_BASE + 0x00c)
+#define HPM_L2_1_CLKEN                         (1 << 9)
+#define G_CPU_1_CLKEN                          (1 << 8)
+#define HPM_L2_CLKEN                           (1 << 1)
+#define G_CPU_CLKEN                            (1 << 0)
+
+#define ACPU_SC_CLKDIS                         (ACPU_CTRL_BASE + 0x010)
+#define ACPU_SC_CLK_STAT                       (ACPU_CTRL_BASE + 0x014)
+#define ACPU_SC_RSTEN                          (ACPU_CTRL_BASE + 0x018)
+#define SRST_PRESET1_RSTEN                     (1 << 11)
+#define SRST_PRESET0_RSTEN                     (1 << 10)
+#define SRST_CLUSTER1_RSTEN                    (1 << 9)
+#define SRST_CLUSTER0_RSTEN                    (1 << 8)
+#define SRST_L2_HPM_1_RSTEN                    (1 << 5)
+#define SRST_AARM_L2_1_RSTEN                   (1 << 4)
+#define SRST_L2_HPM_0_RSTEN                    (1 << 3)
+#define SRST_AARM_L2_0_RSTEN                   (1 << 1)
+#define SRST_CLUSTER1                          (SRST_PRESET1_RSTEN | \
+                                                SRST_CLUSTER1_RSTEN | \
+                                                SRST_L2_HPM_1_RSTEN | \
+                                                SRST_AARM_L2_1_RSTEN)
+#define SRST_CLUSTER0                          (SRST_PRESET0_RSTEN | \
+                                                SRST_CLUSTER0_RSTEN | \
+                                                SRST_L2_HPM_0_RSTEN | \
+                                                SRST_AARM_L2_0_RSTEN)
+
+#define ACPU_SC_RSTDIS                         (ACPU_CTRL_BASE + 0x01c)
+#define ACPU_SC_RST_STAT                       (ACPU_CTRL_BASE + 0x020)
+#define ACPU_SC_PDBGUP_MBIST                   (ACPU_CTRL_BASE + 0x02c)
+#define PDBGUP_CLUSTER1_SHIFT                  8
+
+#define ACPU_SC_VD_CTRL                                (ACPU_CTRL_BASE + 0x054)
+#define ACPU_SC_VD_MASK_PATTERN_CTRL           (ACPU_CTRL_BASE + 0x058)
+#define ACPU_SC_VD_MASK_PATTERN_VAL            (0xCCB << 12)
+#define ACPU_SC_VD_MASK_PATTERN_MASK           ((0x1 << 13) - 1)
+
+#define ACPU_SC_VD_DLY_FIXED_CTRL              (ACPU_CTRL_BASE + 0x05c)
+#define ACPU_SC_VD_DLY_TABLE0_CTRL             (ACPU_CTRL_BASE + 0x060)
+#define ACPU_SC_VD_DLY_TABLE1_CTRL             (ACPU_CTRL_BASE + 0x064)
+#define ACPU_SC_VD_DLY_TABLE2_CTRL             (ACPU_CTRL_BASE + 0x068)
+#define ACPU_SC_VD_HPM_CTRL                    (ACPU_CTRL_BASE + 0x06c)
+#define ACPU_SC_A53_CLUSTER_MTCMOS_EN          (ACPU_CTRL_BASE + 0x088)
+#define PW_MTCMOS_EN_A53_1_EN                  (1 << 1)
+#define PW_MTCMOS_EN_A53_0_EN                  (1 << 0)
+
+#define ACPU_SC_A53_CLUSTER_MTCMOS_STA         (ACPU_CTRL_BASE + 0x090)
+#define ACPU_SC_A53_CLUSTER_ISO_EN             (ACPU_CTRL_BASE + 0x098)
+#define PW_ISO_A53_1_EN                                (1 << 1)
+#define PW_ISO_A53_0_EN                                (1 << 0)
+
+#define ACPU_SC_A53_CLUSTER_ISO_DIS            (ACPU_CTRL_BASE + 0x09c)
+#define ACPU_SC_A53_CLUSTER_ISO_STA            (ACPU_CTRL_BASE + 0x0a0)
+#define ACPU_SC_A53_1_MTCMOS_TIMER             (ACPU_CTRL_BASE + 0x0b4)
+#define ACPU_SC_A53_0_MTCMOS_TIMER             (ACPU_CTRL_BASE + 0x0bc)
+#define ACPU_SC_A53_x_MTCMOS_TIMER(x)          ((x) ? ACPU_SC_A53_1_MTCMOS_TIMER : ACPU_SC_A53_0_MTCMOS_TIMER)
+
+#define ACPU_SC_SNOOP_PWD                      (ACPU_CTRL_BASE + 0xe4)
+#define PD_DETECT_START1                       (1 << 16)
+#define PD_DETECT_START0                       (1 << 0)
+
+#define ACPU_SC_CPU0_CTRL                      (ACPU_CTRL_BASE + 0x100)
+#define CPU_CTRL_AARCH64_MODE                  (1 << 7)
+
+#define ACPU_SC_CPU0_STAT                      (ACPU_CTRL_BASE + 0x104)
+#define ACPU_SC_CPU0_CLKEN                     (ACPU_CTRL_BASE + 0x108)
+#define CPU_CLKEN_HPM                          (1 << 1)
+
+#define ACPU_SC_CPU0_CLK_STAT                  (ACPU_CTRL_BASE + 0x110)
+
+#define ACPU_SC_CPU0_RSTEN                     (ACPU_CTRL_BASE + 0x114)
+#define ACPU_SC_CPU0_RSTDIS                    (ACPU_CTRL_BASE + 0x118)
+#define ACPU_SC_CPU0_MTCMOS_EN                 (ACPU_CTRL_BASE + 0x120)
+#define CPU_MTCMOS_PW                          (1 << 0)
+
+#define ACPU_SC_CPU0_PW_ISOEN                  (ACPU_CTRL_BASE + 0x130)
+#define CPU_PW_ISO                             (1 << 0)
+
+#define ACPU_SC_CPU0_PW_ISODIS                 (ACPU_CTRL_BASE + 0x134)
+#define ACPU_SC_CPU0_PW_ISO_STAT               (ACPU_CTRL_BASE + 0x138)
+#define ACPU_SC_CPU0_MTCMOS_TIMER_STAT         (ACPU_CTRL_BASE + 0x154)
+#define CPU_MTCMOS_TIMER_STA                   (1 << 0)
+
+#define ACPU_SC_CPU0_RVBARADDR                 (ACPU_CTRL_BASE + 0x158)
+#define ACPU_SC_CPU1_CTRL                      (ACPU_CTRL_BASE + 0x200)
+#define ACPU_SC_CPU1_STAT                      (ACPU_CTRL_BASE + 0x204)
+#define ACPU_SC_CPU1_CLKEN                     (ACPU_CTRL_BASE + 0x208)
+#define ACPU_SC_CPU1_CLK_STAT                  (ACPU_CTRL_BASE + 0x210)
+#define ACPU_SC_CPU1_RSTEN                     (ACPU_CTRL_BASE + 0x214)
+#define ACPU_SC_CPU1_RSTDIS                    (ACPU_CTRL_BASE + 0x218)
+#define ACPU_SC_CPU1_MTCMOS_EN                 (ACPU_CTRL_BASE + 0x220)
+#define ACPU_SC_CPU1_PW_ISODIS                 (ACPU_CTRL_BASE + 0x234)
+#define ACPU_SC_CPU1_PW_ISO_STAT               (ACPU_CTRL_BASE + 0x238)
+#define ACPU_SC_CPU1_MTCMOS_TIMER_STAT         (ACPU_CTRL_BASE + 0x254)
+#define ACPU_SC_CPU1_RVBARADDR                 (ACPU_CTRL_BASE + 0x258)
+#define ACPU_SC_CPU2_CTRL                      (ACPU_CTRL_BASE + 0x300)
+#define ACPU_SC_CPU2_STAT                      (ACPU_CTRL_BASE + 0x304)
+#define ACPU_SC_CPU2_CLKEN                     (ACPU_CTRL_BASE + 0x308)
+#define ACPU_SC_CPU2_CLK_STAT                  (ACPU_CTRL_BASE + 0x310)
+#define ACPU_SC_CPU2_RSTEN                     (ACPU_CTRL_BASE + 0x314)
+#define ACPU_SC_CPU2_RSTDIS                    (ACPU_CTRL_BASE + 0x318)
+#define ACPU_SC_CPU2_MTCMOS_EN                 (ACPU_CTRL_BASE + 0x320)
+#define ACPU_SC_CPU2_PW_ISODIS                 (ACPU_CTRL_BASE + 0x334)
+#define ACPU_SC_CPU2_PW_ISO_STAT               (ACPU_CTRL_BASE + 0x338)
+#define ACPU_SC_CPU2_MTCMOS_TIMER_STAT         (ACPU_CTRL_BASE + 0x354)
+#define ACPU_SC_CPU2_RVBARADDR                 (ACPU_CTRL_BASE + 0x358)
+#define ACPU_SC_CPU3_CTRL                      (ACPU_CTRL_BASE + 0x400)
+#define ACPU_SC_CPU3_STAT                      (ACPU_CTRL_BASE + 0x404)
+#define ACPU_SC_CPU3_CLKEN                     (ACPU_CTRL_BASE + 0x408)
+#define ACPU_SC_CPU3_CLK_STAT                  (ACPU_CTRL_BASE + 0x410)
+#define ACPU_SC_CPU3_RSTEN                     (ACPU_CTRL_BASE + 0x414)
+#define ACPU_SC_CPU3_RSTDIS                    (ACPU_CTRL_BASE + 0x418)
+#define ACPU_SC_CPU3_MTCMOS_EN                 (ACPU_CTRL_BASE + 0x420)
+#define ACPU_SC_CPU3_PW_ISODIS                 (ACPU_CTRL_BASE + 0x434)
+#define ACPU_SC_CPU3_PW_ISO_STAT               (ACPU_CTRL_BASE + 0x438)
+#define ACPU_SC_CPU3_MTCMOS_TIMER_STAT         (ACPU_CTRL_BASE + 0x454)
+#define ACPU_SC_CPU3_RVBARADDR                 (ACPU_CTRL_BASE + 0x458)
+#define ACPU_SC_CPU4_CTRL                      (ACPU_CTRL_BASE + 0x500)
+#define ACPU_SC_CPU4_STAT                      (ACPU_CTRL_BASE + 0x504)
+#define ACPU_SC_CPU4_CLKEN                     (ACPU_CTRL_BASE + 0x508)
+#define ACPU_SC_CPU4_CLK_STAT                  (ACPU_CTRL_BASE + 0x510)
+#define ACPU_SC_CPU4_RSTEN                     (ACPU_CTRL_BASE + 0x514)
+#define ACPU_SC_CPU4_RSTDIS                    (ACPU_CTRL_BASE + 0x518)
+#define ACPU_SC_CPU4_MTCMOS_EN                 (ACPU_CTRL_BASE + 0x520)
+#define ACPU_SC_CPU4_PW_ISODIS                 (ACPU_CTRL_BASE + 0x534)
+#define ACPU_SC_CPU4_PW_ISO_STAT               (ACPU_CTRL_BASE + 0x538)
+#define ACPU_SC_CPU4_MTCMOS_TIMER_STAT         (ACPU_CTRL_BASE + 0x554)
+#define ACPU_SC_CPU4_RVBARADDR                 (ACPU_CTRL_BASE + 0x558)
+#define ACPU_SC_CPU5_CTRL                      (ACPU_CTRL_BASE + 0x600)
+#define ACPU_SC_CPU5_STAT                      (ACPU_CTRL_BASE + 0x604)
+#define ACPU_SC_CPU5_CLKEN                     (ACPU_CTRL_BASE + 0x608)
+#define ACPU_SC_CPU5_CLK_STAT                  (ACPU_CTRL_BASE + 0x610)
+#define ACPU_SC_CPU5_RSTEN                     (ACPU_CTRL_BASE + 0x614)
+#define ACPU_SC_CPU5_RSTDIS                    (ACPU_CTRL_BASE + 0x618)
+#define ACPU_SC_CPU5_MTCMOS_EN                 (ACPU_CTRL_BASE + 0x620)
+#define ACPU_SC_CPU5_PW_ISODIS                 (ACPU_CTRL_BASE + 0x634)
+#define ACPU_SC_CPU5_PW_ISO_STAT               (ACPU_CTRL_BASE + 0x638)
+#define ACPU_SC_CPU5_MTCMOS_TIMER_STAT         (ACPU_CTRL_BASE + 0x654)
+#define ACPU_SC_CPU5_RVBARADDR                 (ACPU_CTRL_BASE + 0x658)
+#define ACPU_SC_CPU6_CTRL                      (ACPU_CTRL_BASE + 0x700)
+#define ACPU_SC_CPU6_STAT                      (ACPU_CTRL_BASE + 0x704)
+#define ACPU_SC_CPU6_CLKEN                     (ACPU_CTRL_BASE + 0x708)
+#define ACPU_SC_CPU6_CLK_STAT                  (ACPU_CTRL_BASE + 0x710)
+#define ACPU_SC_CPU6_RSTEN                     (ACPU_CTRL_BASE + 0x714)
+#define ACPU_SC_CPU6_RSTDIS                    (ACPU_CTRL_BASE + 0x718)
+#define ACPU_SC_CPU6_MTCMOS_EN                 (ACPU_CTRL_BASE + 0x720)
+#define ACPU_SC_CPU6_PW_ISODIS                 (ACPU_CTRL_BASE + 0x734)
+#define ACPU_SC_CPU6_PW_ISO_STAT               (ACPU_CTRL_BASE + 0x738)
+#define ACPU_SC_CPU6_MTCMOS_TIMER_STAT         (ACPU_CTRL_BASE + 0x754)
+#define ACPU_SC_CPU6_RVBARADDR                 (ACPU_CTRL_BASE + 0x758)
+#define ACPU_SC_CPU7_CTRL                      (ACPU_CTRL_BASE + 0x800)
+#define ACPU_SC_CPU7_STAT                      (ACPU_CTRL_BASE + 0x804)
+#define ACPU_SC_CPU7_CLKEN                     (ACPU_CTRL_BASE + 0x808)
+#define ACPU_SC_CPU7_CLK_STAT                  (ACPU_CTRL_BASE + 0x810)
+#define ACPU_SC_CPU7_RSTEN                     (ACPU_CTRL_BASE + 0x814)
+#define ACPU_SC_CPU7_RSTDIS                    (ACPU_CTRL_BASE + 0x818)
+#define ACPU_SC_CPU7_MTCMOS_EN                 (ACPU_CTRL_BASE + 0x820)
+#define ACPU_SC_CPU7_PW_ISODIS                 (ACPU_CTRL_BASE + 0x834)
+#define ACPU_SC_CPU7_PW_ISO_STAT               (ACPU_CTRL_BASE + 0x838)
+#define ACPU_SC_CPU7_MTCMOS_TIMER_STAT         (ACPU_CTRL_BASE + 0x854)
+#define ACPU_SC_CPU7_RVBARADDR                 (ACPU_CTRL_BASE + 0x858)
+#define ACPU_SC_CPUx_CTRL(x)                   ((x < 8) ? (ACPU_SC_CPU0_CTRL + 0x100 * x) : ACPU_SC_CPU0_CTRL)
+#define ACPU_SC_CPUx_STAT(x)                   ((x < 8) ? (ACPU_SC_CPU0_STAT + 0x100 * x) : ACPU_SC_CPU0_STAT)
+#define ACPU_SC_CPUx_CLKEN(x)                  ((x < 8) ? (ACPU_SC_CPU0_CLKEN + 0x100 * x) : ACPU_SC_CPU0_CLKEN)
+#define ACPU_SC_CPUx_CLK_STAT(x)               ((x < 8) ? (ACPU_SC_CPU0_CLK_STAT + 0x100 * x) : ACPU_SC_CPU0_CLK_STAT)
+#define ACPU_SC_CPUx_RSTEN(x)                  ((x < 8) ? (ACPU_SC_CPU0_RSTEN + 0x100 * x) : ACPU_SC_CPU0_RSTEN)
+#define ACPU_SC_CPUx_RSTDIS(x)                 ((x < 8) ? (ACPU_SC_CPU0_RSTDIS + 0x100 * x) : ACPU_SC_CPU0_RSTDIS)
+#define ACPU_SC_CPUx_MTCMOS_EN(x)              ((x < 8) ? (ACPU_SC_CPU0_MTCMOS_EN + 0x100 * x) : ACPU_SC_CPU0_MTCMOS_EN)
+#define ACPU_SC_CPUx_PW_ISODIS(x)              ((x < 8) ? (ACPU_SC_CPU0_PW_ISODIS + 0x100 * x) : ACPU_SC_CPU0_PW_ISODIS)
+#define ACPU_SC_CPUx_PW_ISO_STAT(x)            ((x < 8) ? (ACPU_SC_CPU0_PW_ISO_STAT + 0x100 * x) : ACPU_SC_CPU0_PW_ISO_STAT)
+#define ACPU_SC_CPUx_MTCMOS_TIMER_STAT(x)      ((x < 8) ? (ACPU_SC_CPU0_MTCMOS_TIMER_STAT + 0x100 * x) : ACPU_SC_CPU0_MTCMOS_TIMER_STAT)
+#define ACPU_SC_CPUx_RVBARADDR(x)              ((x < 8) ? (ACPU_SC_CPU0_RVBARADDR + 0x100 * x) : ACPU_SC_CPU0_RVBARADDR)
+
+#define ACPU_SC_CPU_STAT_CLKDIV_VD_MASK                (3 << 20)
+
+#define ACPU_SC_VD_CTRL_TUNE_EN_DIF            (1 << 0)
+#define ACPU_SC_VD_CTRL_TUNE_EN_DIF_SHIFT      (0)
+#define ACPU_SC_VD_CTRL_TUNE                   (1 << 1)
+#define ACPU_SC_VD_CTRL_TUNE_SHIFT             (1)
+#define ACPU_SC_VD_CTRL_CALIBRATE_EN_DIF       (1 << 7)
+#define ACPU_SC_VD_CTRL_CALIBRATE_EN_DIF_SHIFT (7)
+#define ACPU_SC_VD_CTRL_CALIBRATE_EN_INI       (1 << 8)
+#define ACPU_SC_VD_CTRL_CALIBRATE_EN_INI_SHIFT (8)
+#define ACPU_SC_VD_CTRL_CLK_DIS_CNT_CLR                (1 << 9)
+#define ACPU_SC_VD_CTRL_CLK_DIS_CNT_CLR_SHIFT  (9)
+#define ACPU_SC_VD_CTRL_CLK_DIS_CNT_EN         (1 << 10)
+#define ACPU_SC_VD_CTRL_CLK_DIS_CNT_EN_SHIFT   (10)
+#define ACPU_SC_VD_CTRL_TUNE_EN_INT            (1 << 11)
+#define ACPU_SC_VD_CTRL_TUNE_EN_INT_SHIFT      (11)
+#define ACPU_SC_VD_CTRL_SHIFT_TABLE0           (1 << 12)
+#define ACPU_SC_VD_CTRL_SHIFT_TABLE0_MASK      (0xf << 12)
+#define ACPU_SC_VD_CTRL_SHIFT_TABLE0_SHIFT     (12)
+#define ACPU_SC_VD_CTRL_SHIFT_TABLE1           (1 << 16)
+#define ACPU_SC_VD_CTRL_SHIFT_TABLE1_MASK      (0xf << 16)
+#define ACPU_SC_VD_CTRL_SHIFT_TABLE1_SHIFT     (16)
+#define ACPU_SC_VD_CTRL_SHIFT_TABLE2           (1 << 20)
+#define ACPU_SC_VD_CTRL_SHIFT_TABLE2_MASK      (0xf << 20)
+#define ACPU_SC_VD_CTRL_SHIFT_TABLE2_SHIFT     (20)
+#define ACPU_SC_VD_CTRL_SHIFT_TABLE3           (1 << 24)
+#define ACPU_SC_VD_CTRL_SHIFT_TABLE3_MASK      (0xf << 24)
+#define ACPU_SC_VD_CTRL_SHIFT_TABLE3_SHIFT     (24)
+#define ACPU_SC_VD_CTRL_FORCE_CLK_EN           (1 << 28)
+#define ACPU_SC_VD_CTRL_FORCE_CLK_EN_SHIFT     (28)
+#define ACPU_SC_VD_CTRL_DIV_EN_DIF             (1 << 29)
+#define ACPU_SC_VD_CTRL_DIV_EN_DIF_SHIFT       (29)
+
+#define ACPU_SC_VD_SHIFT_TABLE_TUNE_VAL                        \
+       ((0x1 << ACPU_SC_VD_CTRL_SHIFT_TABLE0_SHIFT) |  \
+        (0x3 << ACPU_SC_VD_CTRL_SHIFT_TABLE1_SHIFT) |  \
+        (0x5 << ACPU_SC_VD_CTRL_SHIFT_TABLE2_SHIFT) |  \
+        (0x6 << ACPU_SC_VD_CTRL_SHIFT_TABLE3_SHIFT) |  \
+        (0x7 << ACPU_SC_VD_CTRL_TUNE_SHIFT))
+
+#define ACPU_SC_VD_SHIFT_TABLE_TUNE_MASK               \
+       ((0xF << ACPU_SC_VD_CTRL_SHIFT_TABLE0_SHIFT) |  \
+        (0xF << ACPU_SC_VD_CTRL_SHIFT_TABLE1_SHIFT) |  \
+        (0xF << ACPU_SC_VD_CTRL_SHIFT_TABLE2_SHIFT) |  \
+        (0xF << ACPU_SC_VD_CTRL_SHIFT_TABLE3_SHIFT) |  \
+        (0x3F << ACPU_SC_VD_CTRL_TUNE_SHIFT))
+
+#define ACPU_SC_VD_HPM_CTRL_OSC_DIV            (1 << 0)
+#define ACPU_SC_VD_HPM_CTRL_OSC_DIV_SHIFT      (0)
+#define ACPU_SC_VD_HPM_CTRL_OSC_DIV_MASK       (0x000000FF)
+#define ACPU_SC_VD_HPM_CTRL_DLY_EXP            (1 << 8)
+#define ACPU_SC_VD_HPM_CTRL_DLY_EXP_SHIFT      (8)
+#define ACPU_SC_VD_HPM_CTRL_DLY_EXP_MASK       (0x001FFF00)
+
+#define HPM_OSC_DIV_VAL \
+       (0x56 << ACPU_SC_VD_HPM_CTRL_OSC_DIV_SHIFT)
+#define HPM_OSC_DIV_MASK \
+       (ACPU_SC_VD_HPM_CTRL_OSC_DIV_MASK)
+
+#define HPM_DLY_EXP_VAL \
+       (0xC7A << ACPU_SC_VD_HPM_CTRL_DLY_EXP_SHIFT)
+#define HPM_DLY_EXP_MASK \
+       (ACPU_SC_VD_HPM_CTRL_DLY_EXP_MASK)
+
+#define ACPU_SC_VD_EN_ASIC_VAL                                 \
+       ((0x0 << ACPU_SC_VD_CTRL_FORCE_CLK_EN_SHIFT) |          \
+        (0x0 << ACPU_SC_VD_CTRL_CLK_DIS_CNT_EN_SHIFT) |        \
+        (0x0 << ACPU_SC_VD_CTRL_CALIBRATE_EN_INI_SHIFT) |      \
+        (0x0 << ACPU_SC_VD_CTRL_CALIBRATE_EN_DIF_SHIFT) |      \
+        (0X0 << ACPU_SC_VD_CTRL_DIV_EN_DIF_SHIFT) |            \
+        (0X0 << ACPU_SC_VD_CTRL_TUNE_EN_INT_SHIFT) |           \
+        (0x0 << ACPU_SC_VD_CTRL_TUNE_EN_DIF_SHIFT))
+
+#define ACPU_SC_VD_EN_SFT_VAL                                  \
+       ((0x0 << ACPU_SC_VD_CTRL_FORCE_CLK_EN_SHIFT) |          \
+        (0x0 << ACPU_SC_VD_CTRL_CLK_DIS_CNT_EN_SHIFT) |        \
+        (0x0 << ACPU_SC_VD_CTRL_CALIBRATE_EN_INI_SHIFT) |      \
+        (0x0 << ACPU_SC_VD_CTRL_CALIBRATE_EN_DIF_SHIFT) |      \
+        (0x0 << ACPU_SC_VD_CTRL_DIV_EN_DIF_SHIFT) |            \
+        (0x0 << ACPU_SC_VD_CTRL_TUNE_EN_INT_SHIFT) |           \
+        (0x0 << ACPU_SC_VD_CTRL_TUNE_EN_DIF_SHIFT))
+
+#define ACPU_SC_VD_EN_MASK                                     \
+       ((0x1 << ACPU_SC_VD_CTRL_FORCE_CLK_EN_SHIFT) |          \
+        (0x1 << ACPU_SC_VD_CTRL_CLK_DIS_CNT_EN_SHIFT) |        \
+        (0x1 << ACPU_SC_VD_CTRL_CALIBRATE_EN_INI_SHIFT) |      \
+        (0x1 << ACPU_SC_VD_CTRL_CALIBRATE_EN_DIF_SHIFT) |      \
+        (0x1 << ACPU_SC_VD_CTRL_DIV_EN_DIF_SHIFT) |            \
+        (0x1 << ACPU_SC_VD_CTRL_TUNE_EN_INT_SHIFT) |           \
+        (0x1 << ACPU_SC_VD_CTRL_TUNE_EN_DIF_SHIFT))
+
+#endif /* __HI6220_REGS_ACPU_H__ */
diff --git a/plat/hisilicon/hikey/include/hi6220_regs_ao.h b/plat/hisilicon/hikey/include/hi6220_regs_ao.h
new file mode 100644 (file)
index 0000000..79a5404
--- /dev/null
@@ -0,0 +1,334 @@
+/*
+ * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef __HI6220_AO_H__
+#define __HI6220_AO_H__
+
+#define AO_CTRL_BASE                           0xF7800000
+
+#define AO_SC_SYS_CTRL0                                (AO_CTRL_BASE + 0x000)
+#define AO_SC_SYS_CTRL1                                (AO_CTRL_BASE + 0x004)
+#define AO_SC_SYS_CTRL2                                (AO_CTRL_BASE + 0x008)
+#define AO_SC_SYS_STAT0                                (AO_CTRL_BASE + 0x010)
+#define AO_SC_SYS_STAT1                                (AO_CTRL_BASE + 0x014)
+#define AO_SC_MCU_IMCTRL                       (AO_CTRL_BASE + 0x018)
+#define AO_SC_MCU_IMSTAT                       (AO_CTRL_BASE + 0x01C)
+#define AO_SC_SECONDRY_INT_EN0                 (AO_CTRL_BASE + 0x044)
+#define AO_SC_SECONDRY_INT_STATR0              (AO_CTRL_BASE + 0x048)
+#define AO_SC_SECONDRY_INT_STATM0              (AO_CTRL_BASE + 0x04C)
+#define AO_SC_MCU_WKUP_INT_EN6                 (AO_CTRL_BASE + 0x054)
+#define AO_SC_MCU_WKUP_INT_STATR6              (AO_CTRL_BASE + 0x058)
+#define AO_SC_MCU_WKUP_INT_STATM6              (AO_CTRL_BASE + 0x05C)
+#define AO_SC_MCU_WKUP_INT_EN5                 (AO_CTRL_BASE + 0x064)
+#define AO_SC_MCU_WKUP_INT_STATR5              (AO_CTRL_BASE + 0x068)
+#define AO_SC_MCU_WKUP_INT_STATM5              (AO_CTRL_BASE + 0x06C)
+#define AO_SC_MCU_WKUP_INT_EN4                 (AO_CTRL_BASE + 0x094)
+#define AO_SC_MCU_WKUP_INT_STATR4              (AO_CTRL_BASE + 0x098)
+#define AO_SC_MCU_WKUP_INT_STATM4              (AO_CTRL_BASE + 0x09C)
+#define AO_SC_MCU_WKUP_INT_EN0                 (AO_CTRL_BASE + 0x0A8)
+#define AO_SC_MCU_WKUP_INT_STATR0              (AO_CTRL_BASE + 0x0AC)
+#define AO_SC_MCU_WKUP_INT_STATM0              (AO_CTRL_BASE + 0x0B0)
+#define AO_SC_MCU_WKUP_INT_EN1                 (AO_CTRL_BASE + 0x0B4)
+#define AO_SC_MCU_WKUP_INT_STATR1              (AO_CTRL_BASE + 0x0B8)
+#define AO_SC_MCU_WKUP_INT_STATM1              (AO_CTRL_BASE + 0x0BC)
+#define AO_SC_INT_STATR                                (AO_CTRL_BASE + 0x0C4)
+#define AO_SC_INT_STATM                                (AO_CTRL_BASE + 0x0C8)
+#define AO_SC_INT_CLEAR                                (AO_CTRL_BASE + 0x0CC)
+#define AO_SC_INT_EN_SET                       (AO_CTRL_BASE + 0x0D0)
+#define AO_SC_INT_EN_DIS                       (AO_CTRL_BASE + 0x0D4)
+#define AO_SC_INT_EN_STAT                      (AO_CTRL_BASE + 0x0D8)
+#define AO_SC_INT_STATR1                       (AO_CTRL_BASE + 0x0E4)
+#define AO_SC_INT_STATM1                       (AO_CTRL_BASE + 0x0E8)
+#define AO_SC_INT_CLEAR1                       (AO_CTRL_BASE + 0x0EC)
+#define AO_SC_INT_EN_SET1                      (AO_CTRL_BASE + 0x0F0)
+#define AO_SC_INT_EN_DIS1                      (AO_CTRL_BASE + 0x0F4)
+#define AO_SC_INT_EN_STAT1                     (AO_CTRL_BASE + 0x0F8)
+#define AO_SC_TIMER_EN0                                (AO_CTRL_BASE + 0x1D0)
+#define AO_SC_TIMER_EN1                                (AO_CTRL_BASE + 0x1D4)
+#define AO_SC_TIMER_EN4                                (AO_CTRL_BASE + 0x1F0)
+#define AO_SC_TIMER_EN5                                (AO_CTRL_BASE + 0x1F4)
+#define AO_SC_MCU_SUBSYS_CTRL0                 (AO_CTRL_BASE + 0x400)
+#define AO_SC_MCU_SUBSYS_CTRL1                 (AO_CTRL_BASE + 0x404)
+#define AO_SC_MCU_SUBSYS_CTRL2                 (AO_CTRL_BASE + 0x408)
+#define AO_SC_MCU_SUBSYS_CTRL3                 (AO_CTRL_BASE + 0x40C)
+#define AO_SC_MCU_SUBSYS_CTRL4                 (AO_CTRL_BASE + 0x410)
+#define AO_SC_MCU_SUBSYS_CTRL5                 (AO_CTRL_BASE + 0x414)
+#define AO_SC_MCU_SUBSYS_CTRL6                 (AO_CTRL_BASE + 0x418)
+#define AO_SC_MCU_SUBSYS_CTRL7                 (AO_CTRL_BASE + 0x41C)
+#define AO_SC_MCU_SUBSYS_STAT0                 (AO_CTRL_BASE + 0x440)
+#define AO_SC_MCU_SUBSYS_STAT1                 (AO_CTRL_BASE + 0x444)
+#define AO_SC_MCU_SUBSYS_STAT2                 (AO_CTRL_BASE + 0x448)
+#define AO_SC_MCU_SUBSYS_STAT3                 (AO_CTRL_BASE + 0x44C)
+#define AO_SC_MCU_SUBSYS_STAT4                 (AO_CTRL_BASE + 0x450)
+#define AO_SC_MCU_SUBSYS_STAT5                 (AO_CTRL_BASE + 0x454)
+#define AO_SC_MCU_SUBSYS_STAT6                 (AO_CTRL_BASE + 0x458)
+#define AO_SC_MCU_SUBSYS_STAT7                 (AO_CTRL_BASE + 0x45C)
+#define AO_SC_PERIPH_CLKEN4                    (AO_CTRL_BASE + 0x630)
+#define AO_SC_PERIPH_CLKDIS4                   (AO_CTRL_BASE + 0x634)
+#define AO_SC_PERIPH_CLKSTAT4                  (AO_CTRL_BASE + 0x638)
+#define AO_SC_PERIPH_CLKEN5                    (AO_CTRL_BASE + 0x63C)
+#define AO_SC_PERIPH_CLKDIS5                   (AO_CTRL_BASE + 0x640)
+#define AO_SC_PERIPH_CLKSTAT5                  (AO_CTRL_BASE + 0x644)
+#define AO_SC_PERIPH_RSTEN4                    (AO_CTRL_BASE + 0x6F0)
+#define AO_SC_PERIPH_RSTDIS4                   (AO_CTRL_BASE + 0x6F4)
+#define AO_SC_PERIPH_RSTSTAT4                  (AO_CTRL_BASE + 0x6F8)
+#define AO_SC_PERIPH_RSTEN5                    (AO_CTRL_BASE + 0x6FC)
+#define AO_SC_PERIPH_RSTDIS5                   (AO_CTRL_BASE + 0x700)
+#define AO_SC_PERIPH_RSTSTAT5                  (AO_CTRL_BASE + 0x704)
+#define AO_SC_PW_CLKEN0                                (AO_CTRL_BASE + 0x800)
+#define AO_SC_PW_CLKDIS0                       (AO_CTRL_BASE + 0x804)
+#define AO_SC_PW_CLK_STAT0                     (AO_CTRL_BASE + 0x808)
+#define AO_SC_PW_RSTEN0                                (AO_CTRL_BASE + 0x810)
+#define AO_SC_PW_RSTDIS0                       (AO_CTRL_BASE + 0x814)
+#define AO_SC_PW_RST_STAT0                     (AO_CTRL_BASE + 0x818)
+#define AO_SC_PW_ISOEN0                                (AO_CTRL_BASE + 0x820)
+#define AO_SC_PW_ISODIS0                       (AO_CTRL_BASE + 0x824)
+#define AO_SC_PW_ISO_STAT0                     (AO_CTRL_BASE + 0x828)
+#define AO_SC_PW_MTCMOS_EN0                    (AO_CTRL_BASE + 0x830)
+#define AO_SC_PW_MTCMOS_DIS0                   (AO_CTRL_BASE + 0x834)
+#define AO_SC_PW_MTCMOS_STAT0                  (AO_CTRL_BASE + 0x838)
+#define AO_SC_PW_MTCMOS_ACK_STAT0              (AO_CTRL_BASE + 0x83C)
+#define AO_SC_PW_MTCMOS_TIMEOUT_STAT0          (AO_CTRL_BASE + 0x840)
+#define AO_SC_PW_STAT0                         (AO_CTRL_BASE + 0x850)
+#define AO_SC_PW_STAT1                         (AO_CTRL_BASE + 0x854)
+#define AO_SC_SYSTEST_STAT                     (AO_CTRL_BASE + 0x880)
+#define AO_SC_SYSTEST_SLICER_CNT0              (AO_CTRL_BASE + 0x890)
+#define AO_SC_SYSTEST_SLICER_CNT1              (AO_CTRL_BASE + 0x894)
+#define AO_SC_PW_CTRL1                         (AO_CTRL_BASE + 0x8C8)
+#define AO_SC_PW_CTRL                          (AO_CTRL_BASE + 0x8CC)
+#define AO_SC_MCPU_VOTEEN                      (AO_CTRL_BASE + 0x8D0)
+#define AO_SC_MCPU_VOTEDIS                     (AO_CTRL_BASE + 0x8D4)
+#define AO_SC_MCPU_VOTESTAT                    (AO_CTRL_BASE + 0x8D8)
+#define AO_SC_MCPU_VOTE_MSK0                   (AO_CTRL_BASE + 0x8E0)
+#define AO_SC_MCPU_VOTE_MSK1                   (AO_CTRL_BASE + 0x8E4)
+#define AO_SC_MCPU_VOTESTAT0_MSK               (AO_CTRL_BASE + 0x8E8)
+#define AO_SC_MCPU_VOTESTAT1_MSK               (AO_CTRL_BASE + 0x8EC)
+#define AO_SC_PERI_VOTEEN                      (AO_CTRL_BASE + 0x8F0)
+#define AO_SC_PERI_VOTEDIS                     (AO_CTRL_BASE + 0x8F4)
+#define AO_SC_PERI_VOTESTAT                    (AO_CTRL_BASE + 0x8F8)
+#define AO_SC_PERI_VOTE_MSK0                   (AO_CTRL_BASE + 0x900)
+#define AO_SC_PERI_VOTE_MSK1                   (AO_CTRL_BASE + 0x904)
+#define AO_SC_PERI_VOTESTAT0_MSK               (AO_CTRL_BASE + 0x908)
+#define AO_SC_PERI_VOTESTAT1_MSK               (AO_CTRL_BASE + 0x90C)
+#define AO_SC_ACPU_VOTEEN                      (AO_CTRL_BASE + 0x910)
+#define AO_SC_ACPU_VOTEDIS                     (AO_CTRL_BASE + 0x914)
+#define AO_SC_ACPU_VOTESTAT                    (AO_CTRL_BASE + 0x918)
+#define AO_SC_ACPU_VOTE_MSK0                   (AO_CTRL_BASE + 0x920)
+#define AO_SC_ACPU_VOTE_MSK1                   (AO_CTRL_BASE + 0x924)
+#define AO_SC_ACPU_VOTESTAT0_MSK               (AO_CTRL_BASE + 0x928)
+#define AO_SC_ACPU_VOTESTAT1_MSK               (AO_CTRL_BASE + 0x92C)
+#define AO_SC_MCU_VOTEEN                       (AO_CTRL_BASE + 0x930)
+#define AO_SC_MCU_VOTEDIS                      (AO_CTRL_BASE + 0x934)
+#define AO_SC_MCU_VOTESTAT                     (AO_CTRL_BASE + 0x938)
+#define AO_SC_MCU_VOTE_MSK0                    (AO_CTRL_BASE + 0x940)
+#define AO_SC_MCU_VOTE_MSK1                    (AO_CTRL_BASE + 0x944)
+#define AO_SC_MCU_VOTESTAT0_MSK                        (AO_CTRL_BASE + 0x948)
+#define AO_SC_MCU_VOTESTAT1_MSK                        (AO_CTRL_BASE + 0x94C)
+#define AO_SC_MCU_VOTE1EN                      (AO_CTRL_BASE + 0x960)
+#define AO_SC_MCU_VOTE1DIS                     (AO_CTRL_BASE + 0x964)
+#define AO_SC_MCU_VOTE1STAT                    (AO_CTRL_BASE + 0x968)
+#define AO_SC_MCU_VOTE1_MSK0                   (AO_CTRL_BASE + 0x970)
+#define AO_SC_MCU_VOTE1_MSK1                   (AO_CTRL_BASE + 0x974)
+#define AO_SC_MCU_VOTE1STAT0_MSK               (AO_CTRL_BASE + 0x978)
+#define AO_SC_MCU_VOTE1STAT1_MSK               (AO_CTRL_BASE + 0x97C)
+#define AO_SC_MCU_VOTE2EN                      (AO_CTRL_BASE + 0x980)
+#define AO_SC_MCU_VOTE2DIS                     (AO_CTRL_BASE + 0x984)
+#define AO_SC_MCU_VOTE2STAT                    (AO_CTRL_BASE + 0x988)
+#define AO_SC_MCU_VOTE2_MSK0                   (AO_CTRL_BASE + 0x990)
+#define AO_SC_MCU_VOTE2_MSK1                   (AO_CTRL_BASE + 0x994)
+#define AO_SC_MCU_VOTE2STAT0_MSK               (AO_CTRL_BASE + 0x998)
+#define AO_SC_MCU_VOTE2STAT1_MSK               (AO_CTRL_BASE + 0x99C)
+#define AO_SC_VOTE_CTRL                                (AO_CTRL_BASE + 0x9A0)
+#define AO_SC_VOTE_STAT                                (AO_CTRL_BASE + 0x9A4)
+#define AO_SC_ECONUM                           (AO_CTRL_BASE + 0xF00)
+#define AO_SCCHIPID                            (AO_CTRL_BASE + 0xF10)
+#define AO_SCSOCID                             (AO_CTRL_BASE + 0xF1C)
+#define AO_SC_SOC_FPGA_RTL_DEF                 (AO_CTRL_BASE + 0xFE0)
+#define AO_SC_SOC_FPGA_PR_DEF                  (AO_CTRL_BASE + 0xFE4)
+#define AO_SC_SOC_FPGA_RES_DEF0                        (AO_CTRL_BASE + 0xFE8)
+#define AO_SC_SOC_FPGA_RES_DEF1                        (AO_CTRL_BASE + 0xFEC)
+#define AO_SC_XTAL_CTRL0                       (AO_CTRL_BASE + 0x102)
+#define AO_SC_XTAL_CTRL1                       (AO_CTRL_BASE + 0x102)
+#define AO_SC_XTAL_CTRL3                       (AO_CTRL_BASE + 0x103)
+#define AO_SC_XTAL_CTRL5                       (AO_CTRL_BASE + 0x103)
+#define AO_SC_XTAL_STAT0                       (AO_CTRL_BASE + 0x106)
+#define AO_SC_XTAL_STAT1                       (AO_CTRL_BASE + 0x107)
+#define AO_SC_EFUSE_CHIPID0                    (AO_CTRL_BASE + 0x108)
+#define AO_SC_EFUSE_CHIPID1                    (AO_CTRL_BASE + 0x108)
+#define AO_SC_EFUSE_SYS_CTRL                   (AO_CTRL_BASE + 0x108)
+#define AO_SC_DEBUG_CTRL1                      (AO_CTRL_BASE + 0x128)
+#define AO_SC_DBG_STAT                         (AO_CTRL_BASE + 0x12B)
+#define AO_SC_ARM_DBG_KEY0                     (AO_CTRL_BASE + 0x12B)
+#define AO_SC_RESERVED31                       (AO_CTRL_BASE + 0x13A)
+#define AO_SC_RESERVED32                       (AO_CTRL_BASE + 0x13A)
+#define AO_SC_RESERVED33                       (AO_CTRL_BASE + 0x13A)
+#define AO_SC_RESERVED34                       (AO_CTRL_BASE + 0x13A)
+#define AO_SC_RESERVED35                       (AO_CTRL_BASE + 0x13B)
+#define AO_SC_RESERVED36                       (AO_CTRL_BASE + 0x13B)
+#define AO_SC_RESERVED37                       (AO_CTRL_BASE + 0x13B)
+#define AO_SC_RESERVED38                       (AO_CTRL_BASE + 0x13B)
+#define AO_SC_ALWAYSON_SYS_CTRL0               (AO_CTRL_BASE + 0x148)
+#define AO_SC_ALWAYSON_SYS_CTRL1               (AO_CTRL_BASE + 0x148)
+#define AO_SC_ALWAYSON_SYS_CTRL2               (AO_CTRL_BASE + 0x148)
+#define AO_SC_ALWAYSON_SYS_CTRL3               (AO_CTRL_BASE + 0x148)
+#define AO_SC_ALWAYSON_SYS_CTRL10              (AO_CTRL_BASE + 0x14A)
+#define AO_SC_ALWAYSON_SYS_CTRL11              (AO_CTRL_BASE + 0x14A)
+#define AO_SC_ALWAYSON_SYS_STAT0               (AO_CTRL_BASE + 0x14C)
+#define AO_SC_ALWAYSON_SYS_STAT1               (AO_CTRL_BASE + 0x14C)
+#define AO_SC_ALWAYSON_SYS_STAT2               (AO_CTRL_BASE + 0x14C)
+#define AO_SC_ALWAYSON_SYS_STAT3               (AO_CTRL_BASE + 0x14C)
+#define AO_SC_PWUP_TIME0                       (AO_CTRL_BASE + 0x188)
+#define AO_SC_PWUP_TIME1                       (AO_CTRL_BASE + 0x188)
+#define AO_SC_PWUP_TIME2                       (AO_CTRL_BASE + 0x188)
+#define AO_SC_PWUP_TIME3                       (AO_CTRL_BASE + 0x188)
+#define AO_SC_PWUP_TIME4                       (AO_CTRL_BASE + 0x189)
+#define AO_SC_PWUP_TIME5                       (AO_CTRL_BASE + 0x189)
+#define AO_SC_PWUP_TIME6                       (AO_CTRL_BASE + 0x189)
+#define AO_SC_PWUP_TIME7                       (AO_CTRL_BASE + 0x189)
+#define AO_SC_SECURITY_CTRL1                   (AO_CTRL_BASE + 0x1C0)
+#define AO_SC_SYSTEST_SLICER_CNT0              (AO_CTRL_BASE + 0x890)
+#define AO_SC_SYSTEST_SLICER_CNT1              (AO_CTRL_BASE + 0x894)
+
+#define AO_SC_SYS_CTRL0_MODE_NORMAL                            0x004
+#define AO_SC_SYS_CTRL0_MODE_MASK                              0x007
+
+#define AO_SC_SYS_CTRL1_AARM_WD_RST_CFG                                (1 << 0)
+#define AO_SC_SYS_CTRL1_REMAP_SRAM_AARM                                (1 << 1)
+#define AO_SC_SYS_CTRL1_EFUSEC_REMAP                           (1 << 2)
+#define AO_SC_SYS_CTRL1_EXT_PLL_SEL                            (1 << 3)
+#define AO_SC_SYS_CTRL1_MCU_WDG0_RSTMCU_CFG                    (1 << 4)
+#define AO_SC_SYS_CTRL1_USIM0_HPD_DE_BOUNCE_CFG                        (1 << 6)
+#define AO_SC_SYS_CTRL1_USIM0_HPD_OE_CFG                       (1 << 7)
+#define AO_SC_SYS_CTRL1_USIM1_HPD_DE_BOUNCE_CFG                        (1 << 8)
+#define AO_SC_SYS_CTRL1_USIM1_HPD_OE_CFG                       (1 << 9)
+#define AO_SC_SYS_CTRL1_BUS_DFS_FORE_HD_CFG                    (1 << 10)
+#define AO_SC_SYS_CTRL1_BUS_DFS_FORE_HD_CFG1                   (1 << 11)
+#define AO_SC_SYS_CTRL1_USIM0_HPD_OE_SFT                       (1 << 12)
+#define AO_SC_SYS_CTRL1_USIM1_HPD_OE_SFT                       (1 << 13)
+#define AO_SC_SYS_CTRL1_MCU_CLKEN_HARDCFG                      (1 << 15)
+#define AO_SC_SYS_CTRL1_AARM_WD_RST_CFG_MSK                    (1 << 16)
+#define AO_SC_SYS_CTRL1_REMAP_SRAM_AARM_MSK                    (1 << 17)
+#define AO_SC_SYS_CTRL1_EFUSEC_REMAP_MSK                       (1 << 18)
+#define AO_SC_SYS_CTRL1_EXT_PLL_SEL_MSK                                (1 << 19)
+#define AO_SC_SYS_CTRL1_MCU_WDG0_RSTMCU_CFG_MSK                        (1 << 20)
+#define AO_SC_SYS_CTRL1_USIM0_HPD_DE_BOUNCE_CFG_MSK            (1 << 22)
+#define AO_SC_SYS_CTRL1_USIM0_HPD_OE_CFG_MSK                   (1 << 23)
+#define AO_SC_SYS_CTRL1_USIM1_HPD_DE_BOUNCE_CFG_MSK            (1 << 24)
+#define AO_SC_SYS_CTRL1_USIM1_HPD_OE_CFG_MSK                   (1 << 25)
+#define AO_SC_SYS_CTRL1_BUS_DFS_FORE_HD_CFG_MSK                        (1 << 26)
+#define AO_SC_SYS_CTRL1_BUS_DFS_FORE_HD_CFG1_MSK               (1 << 27)
+#define AO_SC_SYS_CTRL1_USIM0_HPD_OE_SFT_MSK                   (1 << 28)
+#define AO_SC_SYS_CTRL1_USIM1_HPD_OE_SFT_MSK                   (1 << 29)
+#define AO_SC_SYS_CTRL1_MCU_CLKEN_HARDCFG_MSK                  (1 << 31)
+
+#define AO_SC_SYS_CTRL2_MCU_SFT_RST_STAT_CLEAR                 (1 << 26)
+#define AO_SC_SYS_CTRL2_MCU_WDG0_RST_STAT_CLEAR                        (1 << 27)
+#define AO_SC_SYS_CTRL2_TSENSOR_RST_STAT_CLEAR                 (1 << 28)
+#define AO_SC_SYS_CTRL2_ACPU_WDG_RST_STAT_CLEAR                        (1 << 29)
+#define AO_SC_SYS_CTRL2_MCU_WDG1_RST_STAT_CLEAR                        (1 << 30)
+#define AO_SC_SYS_CTRL2_GLB_SRST_STAT_CLEAR                    (1 << 31)
+
+#define AO_SC_SYS_STAT0_MCU_RST_STAT                           (1 << 25)
+#define AO_SC_SYS_STAT0_MCU_SOFTRST_STAT                       (1 << 26)
+#define AO_SC_SYS_STAT0_MCU_WDGRST_STAT                                (1 << 27)
+#define AO_SC_SYS_STAT0_TSENSOR_HARDRST_STAT                   (1 << 28)
+#define AO_SC_SYS_STAT0_ACPU_WD_GLB_RST_STAT                   (1 << 29)
+#define AO_SC_SYS_STAT0_CM3_WDG1_RST_STAT                      (1 << 30)
+#define AO_SC_SYS_STAT0_GLB_SRST_STAT                          (1 << 31)
+
+#define AO_SC_SYS_STAT1_MODE_STATUS                            (1 << 0)
+#define AO_SC_SYS_STAT1_BOOT_SEL_LOCK                          (1 << 16)
+#define AO_SC_SYS_STAT1_FUNC_MODE_LOCK                         (1 << 17)
+#define AO_SC_SYS_STAT1_BOOT_MODE_LOCK                         (1 << 19)
+#define AO_SC_SYS_STAT1_FUN_JTAG_MODE_OUT                      (1 << 20)
+#define AO_SC_SYS_STAT1_SECURITY_BOOT_FLG                      (1 << 27)
+#define AO_SC_SYS_STAT1_EFUSE_NANDBOOT_MSK                     (1 << 28)
+#define AO_SC_SYS_STAT1_EFUSE_NAND_BITWIDE                     (1 << 29)
+
+#define AO_SC_PERIPH_RSTDIS4_RESET_MCU_ECTR_N                  (1 << 0)
+#define AO_SC_PERIPH_RSTDIS4_RESET_MCU_SYS_N                   (1 << 1)
+#define AO_SC_PERIPH_RSTDIS4_RESET_MCU_POR_N                   (1 << 2)
+#define AO_SC_PERIPH_RSTDIS4_RESET_MCU_DAP_N                   (1 << 3)
+#define AO_SC_PERIPH_RSTDIS4_PRESET_CM3_TIMER0_N               (1 << 4)
+#define AO_SC_PERIPH_RSTDIS4_PRESET_CM3_TIMER1_N               (1 << 5)
+#define AO_SC_PERIPH_RSTDIS4_PRESET_CM3_WDT0_N                 (1 << 6)
+#define AO_SC_PERIPH_RSTDIS4_PRESET_CM3_WDT1_N                 (1 << 7)
+#define AO_SC_PERIPH_RSTDIS4_HRESET_IPC_S_N                    (1 << 8)
+#define AO_SC_PERIPH_RSTDIS4_HRESET_IPC_NS_N                   (1 << 9)
+#define AO_SC_PERIPH_RSTDIS4_PRESET_EFUSEC_N                   (1 << 10)
+#define AO_SC_PERIPH_RSTDIS4_PRESET_WDT0_N                     (1 << 12)
+#define AO_SC_PERIPH_RSTDIS4_PRESET_WDT1_N                     (1 << 13)
+#define AO_SC_PERIPH_RSTDIS4_PRESET_WDT2_N                     (1 << 14)
+#define AO_SC_PERIPH_RSTDIS4_PRESET_TIMER0_N                   (1 << 15)
+#define AO_SC_PERIPH_RSTDIS4_PRESET_TIMER1_N                   (1 << 16)
+#define AO_SC_PERIPH_RSTDIS4_PRESET_TIMER2_N                   (1 << 17)
+#define AO_SC_PERIPH_RSTDIS4_PRESET_TIMER3_N                   (1 << 18)
+#define AO_SC_PERIPH_RSTDIS4_PRESET_TIMER4_N                   (1 << 19)
+#define AO_SC_PERIPH_RSTDIS4_PRESET_TIMER5_N                   (1 << 20)
+#define AO_SC_PERIPH_RSTDIS4_PRESET_TIMER6_N                   (1 << 21)
+#define AO_SC_PERIPH_RSTDIS4_PRESET_TIMER7_N                   (1 << 22)
+#define AO_SC_PERIPH_RSTDIS4_PRESET_TIMER8_N                   (1 << 23)
+#define AO_SC_PERIPH_RSTDIS4_PRESET_UART0_N                    (1 << 24)
+#define AO_SC_PERIPH_RSTDIS4_RESET_RTC0_N                      (1 << 25)
+#define AO_SC_PERIPH_RSTDIS4_RESET_RTC1_N                      (1 << 26)
+#define AO_SC_PERIPH_RSTDIS4_PRESET_PMUSSI_N                   (1 << 27)
+#define AO_SC_PERIPH_RSTDIS4_RESET_JTAG_AUTH_N                 (1 << 28)
+#define AO_SC_PERIPH_RSTDIS4_RESET_CS_DAPB_ON_N                        (1 << 29)
+#define AO_SC_PERIPH_RSTDIS4_MDM_SUBSYS_GLB                    (1 << 30)
+
+#define AO_SC_PERIPH_CLKEN4_HCLK_MCU                           (1 << 0)
+#define AO_SC_PERIPH_CLKEN4_CLK_MCU_DAP                                (1 << 3)
+#define AO_SC_PERIPH_CLKEN4_PCLK_CM3_TIMER0                    (1 << 4)
+#define AO_SC_PERIPH_CLKEN4_PCLK_CM3_TIMER1                    (1 << 5)
+#define AO_SC_PERIPH_CLKEN4_PCLK_CM3_WDT0                      (1 << 6)
+#define AO_SC_PERIPH_CLKEN4_PCLK_CM3_WDT1                      (1 << 7)
+#define AO_SC_PERIPH_CLKEN4_HCLK_IPC_S                         (1 << 8)
+#define AO_SC_PERIPH_CLKEN4_HCLK_IPC_NS                                (1 << 9)
+#define AO_SC_PERIPH_CLKEN4_PCLK_EFUSEC                                (1 << 10)
+#define AO_SC_PERIPH_CLKEN4_PCLK_TZPC                          (1 << 11)
+#define AO_SC_PERIPH_CLKEN4_PCLK_WDT0                          (1 << 12)
+#define AO_SC_PERIPH_CLKEN4_PCLK_WDT1                          (1 << 13)
+#define AO_SC_PERIPH_CLKEN4_PCLK_WDT2                          (1 << 14)
+#define AO_SC_PERIPH_CLKEN4_PCLK_TIMER0                                (1 << 15)
+#define AO_SC_PERIPH_CLKEN4_PCLK_TIMER1                                (1 << 16)
+#define AO_SC_PERIPH_CLKEN4_PCLK_TIMER2                                (1 << 17)
+#define AO_SC_PERIPH_CLKEN4_PCLK_TIMER3                                (1 << 18)
+#define AO_SC_PERIPH_CLKEN4_PCLK_TIMER4                                (1 << 19)
+#define AO_SC_PERIPH_CLKEN4_PCLK_TIMER5                                (1 << 20)
+#define AO_SC_PERIPH_CLKEN4_PCLK_TIMER6                                (1 << 21)
+#define AO_SC_PERIPH_CLKEN4_PCLK_TIMER7                                (1 << 22)
+#define AO_SC_PERIPH_CLKEN4_PCLK_TIMER8                                (1 << 23)
+#define AO_SC_PERIPH_CLKEN4_CLK_UART0                          (1 << 24)
+#define AO_SC_PERIPH_CLKEN4_CLK_RTC0                           (1 << 25)
+#define AO_SC_PERIPH_CLKEN4_CLK_RTC1                           (1 << 26)
+#define AO_SC_PERIPH_CLKEN4_PCLK_PMUSSI                                (1 << 27)
+#define AO_SC_PERIPH_CLKEN4_CLK_JTAG_AUTH                      (1 << 28)
+#define AO_SC_PERIPH_CLKEN4_CLK_CS_DAPB_ON                     (1 << 29)
+#define AO_SC_PERIPH_CLKEN4_CLK_PDM                            (1 << 30)
+#define AO_SC_PERIPH_CLKEN4_CLK_SSI_PAD                                (1 << 31)
+
+#define AO_SC_PERIPH_CLKEN5_PCLK_PMUSSI_CCPU                   (1 << 0)
+#define AO_SC_PERIPH_CLKEN5_PCLK_EFUSEC_CCPU                   (1 << 1)
+#define AO_SC_PERIPH_CLKEN5_HCLK_IPC_CCPU                      (1 << 2)
+#define AO_SC_PERIPH_CLKEN5_HCLK_IPC_NS_CCPU                   (1 << 3)
+#define AO_SC_PERIPH_CLKEN5_PCLK_PMUSSI_MCU                    (1 << 16)
+#define AO_SC_PERIPH_CLKEN5_PCLK_EFUSEC_MCU                    (1 << 17)
+#define AO_SC_PERIPH_CLKEN5_HCLK_IPC_MCU                       (1 << 18)
+#define AO_SC_PERIPH_CLKEN5_HCLK_IPC_NS_MCU                    (1 << 19)
+
+#define AO_SC_MCU_SUBSYS_CTRL3_RCLK_3                          0x003
+#define AO_SC_MCU_SUBSYS_CTRL3_RCLK_MASK                       0x007
+#define AO_SC_MCU_SUBSYS_CTRL3_CSSYS_CTRL_PROT                 (1 << 3)
+#define AO_SC_MCU_SUBSYS_CTRL3_TCXO_AFC_OEN_CRG                        (1 << 4)
+#define AO_SC_MCU_SUBSYS_CTRL3_AOB_IO_SEL18_USIM1              (1 << 8)
+#define AO_SC_MCU_SUBSYS_CTRL3_AOB_IO_SEL18_USIM0              (1 << 9)
+#define AO_SC_MCU_SUBSYS_CTRL3_AOB_IO_SEL18_SD                 (1 << 10)
+#define AO_SC_MCU_SUBSYS_CTRL3_MCU_SUBSYS_CTRL3_RESERVED       (1 << 11)
+
+#define PCLK_TIMER1                                            (1 << 16)
+#define PCLK_TIMER0                                            (1 << 15)
+
+#endif /* __HI6220_AO_H__ */
diff --git a/plat/hisilicon/hikey/include/hi6220_regs_peri.h b/plat/hisilicon/hikey/include/hi6220_regs_peri.h
new file mode 100644 (file)
index 0000000..d2c0460
--- /dev/null
@@ -0,0 +1,380 @@
+/*
+ * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef __HI6220_PERI_H__
+#define __HI6220_PERI_H__
+
+#define PERI_BASE                              0xF7030000
+
+#define PERI_SC_PERIPH_CTRL1                   (PERI_BASE + 0x000)
+#define PERI_SC_PERIPH_CTRL2                   (PERI_BASE + 0x004)
+#define PERI_SC_PERIPH_CTRL3                   (PERI_BASE + 0x008)
+#define PERI_SC_PERIPH_CTRL4                   (PERI_BASE + 0x00c)
+#define PERI_SC_PERIPH_CTRL5                   (PERI_BASE + 0x010)
+#define PERI_SC_PERIPH_CTRL6                   (PERI_BASE + 0x014)
+#define PERI_SC_PERIPH_CTRL8                   (PERI_BASE + 0x018)
+#define PERI_SC_PERIPH_CTRL9                   (PERI_BASE + 0x01c)
+#define PERI_SC_PERIPH_CTRL10                  (PERI_BASE + 0x020)
+#define PERI_SC_PERIPH_CTRL12                  (PERI_BASE + 0x024)
+#define PERI_SC_PERIPH_CTRL13                  (PERI_BASE + 0x028)
+#define PERI_SC_PERIPH_CTRL14                  (PERI_BASE + 0x02c)
+
+#define PERI_SC_DDR_CTRL0                      (PERI_BASE + 0x050)
+#define PERI_SC_PERIPH_STAT1                   (PERI_BASE + 0x094)
+
+#define PERI_SC_PERIPH_CLKEN0                  (PERI_BASE + 0x200)
+#define PERI_SC_PERIPH_CLKDIS0                 (PERI_BASE + 0x204)
+#define PERI_SC_PERIPH_CLKSTAT0                        (PERI_BASE + 0x208)
+#define PERI_SC_PERIPH_CLKEN1                  (PERI_BASE + 0x210)
+#define PERI_SC_PERIPH_CLKDIS1                 (PERI_BASE + 0x214)
+#define PERI_SC_PERIPH_CLKSTAT1                        (PERI_BASE + 0x218)
+#define PERI_SC_PERIPH_CLKEN2                  (PERI_BASE + 0x220)
+#define PERI_SC_PERIPH_CLKDIS2                 (PERI_BASE + 0x224)
+#define PERI_SC_PERIPH_CLKSTAT2                        (PERI_BASE + 0x228)
+#define PERI_SC_PERIPH_CLKEN3                  (PERI_BASE + 0x230)
+#define PERI_SC_PERIPH_CLKDIS3                 (PERI_BASE + 0x234)
+#define PERI_SC_PERIPH_CLKSTAT3                        (PERI_BASE + 0x238)
+#define PERI_SC_PERIPH_CLKEN8                  (PERI_BASE + 0x240)
+#define PERI_SC_PERIPH_CLKDIS8                 (PERI_BASE + 0x244)
+#define PERI_SC_PERIPH_CLKSTAT8                        (PERI_BASE + 0x248)
+#define PERI_SC_PERIPH_CLKEN9                  (PERI_BASE + 0x250)
+#define PERI_SC_PERIPH_CLKDIS9                 (PERI_BASE + 0x254)
+#define PERI_SC_PERIPH_CLKSTAT9                        (PERI_BASE + 0x258)
+#define PERI_SC_PERIPH_CLKEN10                 (PERI_BASE + 0x260)
+#define PERI_SC_PERIPH_CLKDIS10                        (PERI_BASE + 0x264)
+#define PERI_SC_PERIPH_CLKSTAT10               (PERI_BASE + 0x268)
+#define PERI_SC_PERIPH_CLKEN12                 (PERI_BASE + 0x270)
+#define PERI_SC_PERIPH_CLKDIS12                        (PERI_BASE + 0x274)
+#define PERI_SC_PERIPH_CLKSTAT12               (PERI_BASE + 0x278)
+
+#define PERI_SC_PERIPH_RSTEN0                  (PERI_BASE + 0x300)
+#define PERI_SC_PERIPH_RSTDIS0                 (PERI_BASE + 0x304)
+#define PERI_SC_PERIPH_RSTSTAT0                        (PERI_BASE + 0x308)
+#define PERI_SC_PERIPH_RSTEN1                  (PERI_BASE + 0x310)
+#define PERI_SC_PERIPH_RSTDIS1                 (PERI_BASE + 0x314)
+#define PERI_SC_PERIPH_RSTSTAT1                        (PERI_BASE + 0x318)
+#define PERI_SC_PERIPH_RSTEN2                  (PERI_BASE + 0x320)
+#define PERI_SC_PERIPH_RSTDIS2                 (PERI_BASE + 0x324)
+#define PERI_SC_PERIPH_RSTSTAT2                        (PERI_BASE + 0x328)
+#define PERI_SC_PERIPH_RSTEN3                  (PERI_BASE + 0x330)
+#define PERI_SC_PERIPH_RSTDIS3                 (PERI_BASE + 0x334)
+#define PERI_SC_PERIPH_RSTSTAT3                        (PERI_BASE + 0x338)
+#define PERI_SC_PERIPH_RSTEN8                  (PERI_BASE + 0x340)
+#define PERI_SC_PERIPH_RSTDIS8                 (PERI_BASE + 0x344)
+#define PERI_SC_PERIPH_RSTSTAT8                        (PERI_BASE + 0x338)
+
+#define PERI_SC_CLK_SEL0                       (PERI_BASE + 0x400)
+#define PERI_SC_CLKCFG8BIT1                    (PERI_BASE + 0x494)
+#define PERI_SC_CLKCFG8BIT2                    (PERI_BASE + 0x498)
+#define PERI_SC_RESERVED8_ADDR                 (PERI_BASE + 0xd04)
+
+/* PERI_SC_PERIPH_CTRL1 */
+#define PERI_CTRL1_ETR_AXI_CSYSREQ_N           (1 << 0)
+#define PERI_CTRL1_ETR_AXI_CSYSREQ_N           (1 << 0)
+#define PERI_CTRL1_HIFI_INT_MASK               (1 << 1)
+#define PERI_CTRL1_HIFI_ALL_INT_MASK           (1 << 2)
+#define PERI_CTRL1_ETR_AXI_CSYSREQ_N_MSK       (1 << 16)
+#define PERI_CTRL1_HIFI_INT_MASK_MSK           (1 << 17)
+#define PERI_CTRL1_HIFI_ALL_INT_MASK_MSK       (1 << 18)
+
+/* PERI_SC_PERIPH_CTRL2        */
+#define PERI_CTRL2_MMC_CLK_PHASE_BYPASS_EN_MMC0        (1 << 0)
+#define PERI_CTRL2_MMC_CLK_PHASE_BYPASS_EN_MMC1        (1 << 2)
+#define PERI_CTRL2_NAND_SYS_MEM_SEL            (1 << 6)
+#define PERI_CTRL2_G3D_DDRT_AXI_SEL            (1 << 7)
+#define PERI_CTRL2_GU_MDM_BBP_TESTPIN_SEL      (1 << 8)
+#define PERI_CTRL2_CODEC_SSI_MASTER_CHECK      (1 << 9)
+#define PERI_CTRL2_FUNC_TEST_SOFT              (1 << 12)
+#define PERI_CTRL2_CSSYS_TS_ENABLE             (1 << 15)
+#define PERI_CTRL2_HIFI_RAMCTRL_S_EMA          (1 << 16)
+#define PERI_CTRL2_HIFI_RAMCTRL_S_EMAW         (1 << 20)
+#define PERI_CTRL2_HIFI_RAMCTRL_S_EMAS         (1 << 22)
+#define PERI_CTRL2_HIFI_RAMCTRL_S_RET1N                (1 << 26)
+#define PERI_CTRL2_HIFI_RAMCTRL_S_RET2N                (1 << 27)
+#define PERI_CTRL2_HIFI_RAMCTRL_S_PGEN         (1 << 28)
+
+/* PERI_SC_PERIPH_CTRL3 */
+#define PERI_CTRL3_HIFI_DDR_HARQMEM_ADDR       (1 << 0)
+#define PERI_CTRL3_HIFI_HARQMEMRMP_EN          (1 << 12)
+#define PERI_CTRL3_HARQMEM_SYS_MED_SEL         (1 << 13)
+#define PERI_CTRL3_SOC_AP_OCCUPY_GRP1          (1 << 14)
+#define PERI_CTRL3_SOC_AP_OCCUPY_GRP2          (1 << 16)
+#define PERI_CTRL3_SOC_AP_OCCUPY_GRP3          (1 << 18)
+#define PERI_CTRL3_SOC_AP_OCCUPY_GRP4          (1 << 20)
+#define PERI_CTRL3_SOC_AP_OCCUPY_GRP5          (1 << 22)
+#define PERI_CTRL3_SOC_AP_OCCUPY_GRP6          (1 << 24)
+
+/* PERI_SC_PERIPH_CTRL4 */
+#define PERI_CTRL4_PICO_FSELV                  (1 << 0)
+#define PERI_CTRL4_FPGA_EXT_PHY_SEL            (1 << 3)
+#define PERI_CTRL4_PICO_REFCLKSEL              (1 << 4)
+#define PERI_CTRL4_PICO_SIDDQ                  (1 << 6)
+#define PERI_CTRL4_PICO_SUSPENDM_SLEEPM                (1 << 7)
+#define PERI_CTRL4_PICO_OGDISABLE              (1 << 8)
+#define PERI_CTRL4_PICO_COMMONONN              (1 << 9)
+#define PERI_CTRL4_PICO_VBUSVLDEXT             (1 << 10)
+#define PERI_CTRL4_PICO_VBUSVLDEXTSEL          (1 << 11)
+#define PERI_CTRL4_PICO_VATESTENB              (1 << 12)
+#define PERI_CTRL4_PICO_SUSPENDM               (1 << 14)
+#define PERI_CTRL4_PICO_SLEEPM                 (1 << 15)
+#define PERI_CTRL4_BC11_C                      (1 << 16)
+#define PERI_CTRL4_BC11_B                      (1 << 17)
+#define PERI_CTRL4_BC11_A                      (1 << 18)
+#define PERI_CTRL4_BC11_GND                    (1 << 19)
+#define PERI_CTRL4_BC11_FLOAT                  (1 << 20)
+#define PERI_CTRL4_OTG_PHY_SEL                 (1 << 21)
+#define PERI_CTRL4_USB_OTG_SS_SCALEDOWN_MODE   (1 << 22)
+#define PERI_CTRL4_OTG_DM_PULLDOWN             (1 << 24)
+#define PERI_CTRL4_OTG_DP_PULLDOWN             (1 << 25)
+#define PERI_CTRL4_OTG_IDPULLUP                        (1 << 26)
+#define PERI_CTRL4_OTG_DRVBUS                  (1 << 27)
+#define PERI_CTRL4_OTG_SESSEND                 (1 << 28)
+#define PERI_CTRL4_OTG_BVALID                  (1 << 29)
+#define PERI_CTRL4_OTG_AVALID                  (1 << 30)
+#define PERI_CTRL4_OTG_VBUSVALID               (1 << 31)
+
+/* PERI_SC_PERIPH_CTRL5 */
+#define PERI_CTRL5_USBOTG_RES_SEL              (1 << 3)
+#define PERI_CTRL5_PICOPHY_ACAENB              (1 << 4)
+#define PERI_CTRL5_PICOPHY_BC_MODE             (1 << 5)
+#define PERI_CTRL5_PICOPHY_CHRGSEL             (1 << 6)
+#define PERI_CTRL5_PICOPHY_VDATSRCEND          (1 << 7)
+#define PERI_CTRL5_PICOPHY_VDATDETENB          (1 << 8)
+#define PERI_CTRL5_PICOPHY_DCDENB              (1 << 9)
+#define PERI_CTRL5_PICOPHY_IDDIG               (1 << 10)
+#define PERI_CTRL5_DBG_MUX                     (1 << 11)
+
+/* PERI_SC_PERIPH_CTRL6 */
+#define PERI_CTRL6_CSSYSOFF_RAMCTRL_S_EMA      (1 << 0)
+#define PERI_CTRL6_CSSYSOFF_RAMCTRL_S_EMAW     (1 << 4)
+#define PERI_CTRL6_CSSYSOFF_RAMCTRL_S_EMAS     (1 << 6)
+#define PERI_CTRL6_CSSYSOFF_RAMCTRL_S_RET1N    (1 << 10)
+#define PERI_CTRL6_CSSYSOFF_RAMCTRL_S_RET2N    (1 << 11)
+#define PERI_CTRL6_CSSYSOFF_RAMCTRL_S_PGEN     (1 << 12)
+
+/* PERI_SC_PERIPH_CTRL8 */
+#define PERI_CTRL8_PICOPHY_TXRISETUNE0         (1 << 0)
+#define PERI_CTRL8_PICOPHY_TXPREEMPAMPTUNE0    (1 << 2)
+#define PERI_CTRL8_PICOPHY_TXRESTUNE0          (1 << 4)
+#define PERI_CTRL8_PICOPHY_TXHSSVTUNE0         (1 << 6)
+#define PERI_CTRL8_PICOPHY_COMPDISTUNE0                (1 << 8)
+#define PERI_CTRL8_PICOPHY_TXPREEMPPULSETUNE0  (1 << 11)
+#define PERI_CTRL8_PICOPHY_OTGTUNE0            (1 << 12)
+#define PERI_CTRL8_PICOPHY_SQRXTUNE0           (1 << 16)
+#define PERI_CTRL8_PICOPHY_TXVREFTUNE0         (1 << 20)
+#define PERI_CTRL8_PICOPHY_TXFSLSTUNE0         (1 << 28)
+
+/* PERI_SC_PERIPH_CTRL9        */
+#define PERI_CTRL9_PICOPLY_TESTCLKEN           (1 << 0)
+#define PERI_CTRL9_PICOPLY_TESTDATAOUTSEL      (1 << 1)
+#define PERI_CTRL9_PICOPLY_TESTADDR            (1 << 4)
+#define PERI_CTRL9_PICOPLY_TESTDATAIN          (1 << 8)
+
+/*
+ * PERI_SC_PERIPH_CLKEN0
+ * PERI_SC_PERIPH_CLKDIS0
+ * PERI_SC_PERIPH_CLKSTAT0
+ */
+#define PERI_CLK0_MMC0                         (1 << 0)
+#define PERI_CLK0_MMC1                         (1 << 1)
+#define PERI_CLK0_MMC2                         (1 << 2)
+#define PERI_CLK0_NANDC                                (1 << 3)
+#define PERI_CLK0_USBOTG                       (1 << 4)
+#define PERI_CLK0_PICOPHY                      (1 << 5)
+#define PERI_CLK0_PLL                          (1 << 6)
+
+/*
+ * PERI_SC_PERIPH_CLKEN1
+ * PERI_SC_PERIPH_CLKDIS1
+ * PERI_SC_PERIPH_CLKSTAT1
+ */
+#define PERI_CLK1_HIFI                         (1 << 0)
+#define PERI_CLK1_DIGACODEC                    (1 << 5)
+
+/*
+ * PERI_SC_PERIPH_CLKEN2
+ * PERI_SC_PERIPH_CLKDIS2
+ * PERI_SC_PERIPH_CLKSTAT2
+ */
+#define PERI_CLK2_IPF                          (1 << 0)
+#define PERI_CLK2_SOCP                         (1 << 1)
+#define PERI_CLK2_DMAC                         (1 << 2)
+#define PERI_CLK2_SECENG                       (1 << 3)
+#define PERI_CLK2_HPM0                         (1 << 5)
+#define PERI_CLK2_HPM1                         (1 << 6)
+#define PERI_CLK2_HPM2                         (1 << 7)
+#define PERI_CLK2_HPM3                         (1 << 8)
+
+/*
+ * PERI_SC_PERIPH_CLKEN3
+ * PERI_SC_PERIPH_CLKDIS3
+ * PERI_SC_PERIPH_CLKSTAT3
+ */
+#define PERI_CLK3_CSSYS                                (1 << 0)
+#define PERI_CLK3_I2C0                         (1 << 1)
+#define PERI_CLK3_I2C1                         (1 << 2)
+#define PERI_CLK3_I2C2                         (1 << 3)
+#define PERI_CLK3_I2C3                         (1 << 4)
+#define PERI_CLK3_UART1                                (1 << 5)
+#define PERI_CLK3_UART2                                (1 << 6)
+#define PERI_CLK3_UART3                                (1 << 7)
+#define PERI_CLK3_UART4                                (1 << 8)
+#define PERI_CLK3_SSP                          (1 << 9)
+#define PERI_CLK3_PWM                          (1 << 10)
+#define PERI_CLK3_BLPWM                                (1 << 11)
+#define PERI_CLK3_TSENSOR                      (1 << 12)
+#define PERI_CLK3_GPS                          (1 << 15)
+#define PERI_CLK3_TCXO_PAD0                    (1 << 16)
+#define PERI_CLK3_TCXO_PAD1                    (1 << 17)
+#define PERI_CLK3_DAPB                         (1 << 18)
+#define PERI_CLK3_HKADC                                (1 << 19)
+#define PERI_CLK3_CODEC_SSI                    (1 << 20)
+#define PERI_CLK3_TZPC_DEP                     (1 << 21)
+
+/*
+ * PERI_SC_PERIPH_CLKEN8
+ * PERI_SC_PERIPH_CLKDIS8
+ * PERI_SC_PERIPH_CLKSTAT8
+ */
+#define PERI_CLK8_RS0                          (1 << 0)
+#define PERI_CLK8_RS2                          (1 << 1)
+#define PERI_CLK8_RS3                          (1 << 2)
+#define PERI_CLK8_MS0                          (1 << 3)
+#define PERI_CLK8_MS2                          (1 << 5)
+#define PERI_CLK8_XG2RAM0                      (1 << 6)
+#define PERI_CLK8_X2SRAM                       (1 << 7)
+#define PERI_CLK8_SRAM                         (1 << 8)
+#define PERI_CLK8_ROM                          (1 << 9)
+#define PERI_CLK8_HARQ                         (1 << 10)
+#define PERI_CLK8_MMU                          (1 << 11)
+#define PERI_CLK8_DDRC                         (1 << 12)
+#define PERI_CLK8_DDRPHY                       (1 << 13)
+#define PERI_CLK8_DDRPHY_REF                   (1 << 14)
+#define PERI_CLK8_X2X_SYSNOC                   (1 << 15)
+#define PERI_CLK8_X2X_CCPU                     (1 << 16)
+#define PERI_CLK8_DDRT                         (1 << 17)
+#define PERI_CLK8_DDRPACK_RS                   (1 << 18)
+
+/*
+ * PERI_SC_PERIPH_CLKEN9
+ * PERI_SC_PERIPH_CLKDIS9
+ * PERI_SC_PERIPH_CLKSTAT9
+ */
+#define PERI_CLK9_CARM_DAP                     (1 << 0)
+#define PERI_CLK9_CARM_ATB                     (1 << 1)
+#define PERI_CLK9_CARM_LBUS                    (1 << 2)
+#define PERI_CLK9_CARM_KERNEL                  (1 << 3)
+
+/*
+ * PERI_SC_PERIPH_CLKEN10
+ * PERI_SC_PERIPH_CLKDIS10
+ * PERI_SC_PERIPH_CLKSTAT10
+ */
+#define PERI_CLK10_IPF_CCPU                    (1 << 0)
+#define PERI_CLK10_SOCP_CCPU                   (1 << 1)
+#define PERI_CLK10_SECENG_CCPU                 (1 << 2)
+#define PERI_CLK10_HARQ_CCPU                   (1 << 3)
+#define PERI_CLK10_IPF_MCU                     (1 << 16)
+#define PERI_CLK10_SOCP_MCU                    (1 << 17)
+#define PERI_CLK10_SECENG_MCU                  (1 << 18)
+#define PERI_CLK10_HARQ_MCU                    (1 << 19)
+
+/*
+ * PERI_SC_PERIPH_CLKEN12
+ * PERI_SC_PERIPH_CLKDIS12
+ * PERI_SC_PERIPH_CLKSTAT12
+ */
+#define PERI_CLK12_HIFI_SRC                    (1 << 0)
+#define PERI_CLK12_MMC0_SRC                    (1 << 1)
+#define PERI_CLK12_MMC1_SRC                    (1 << 2)
+#define PERI_CLK12_MMC2_SRC                    (1 << 3)
+#define PERI_CLK12_SYSPLL_DIV                  (1 << 4)
+#define PERI_CLK12_TPIU_SRC                    (1 << 5)
+#define PERI_CLK12_MMC0_HF                     (1 << 6)
+#define PERI_CLK12_MMC1_HF                     (1 << 7)
+#define PERI_CLK12_PLL_TEST_SRC                        (1 << 8)
+#define PERI_CLK12_CODEC_SOC                   (1 << 9)
+#define PERI_CLK12_MEDIA                       (1 << 10)
+
+/*
+ * PERI_SC_PERIPH_RSTEN0
+ * PERI_SC_PERIPH_RSTDIS0
+ * PERI_SC_PERIPH_RSTSTAT0
+ */
+#define PERI_RST0_MMC0                         (1 << 0)
+#define PERI_RST0_MMC1                         (1 << 1)
+#define PERI_RST0_MMC2                         (1 << 2)
+#define PERI_RST0_NANDC                                (1 << 3)
+#define PERI_RST0_USBOTG_BUS                   (1 << 4)
+#define PERI_RST0_POR_PICOPHY                  (1 << 5)
+#define PERI_RST0_USBOTG                       (1 << 6)
+#define PERI_RST0_USBOTG_32K                   (1 << 7)
+
+/*
+ * PERI_SC_PERIPH_RSTEN1
+ * PERI_SC_PERIPH_RSTDIS1
+ * PERI_SC_PERIPH_RSTSTAT1
+ */
+#define PERI_RST1_HIFI                         (1 << 0)
+#define PERI_RST1_DIGACODEC                    (1 << 5)
+
+/*
+ * PERI_SC_PERIPH_RSTEN2
+ * PERI_SC_PERIPH_RSTDIS2
+ * PERI_SC_PERIPH_RSTSTAT2
+ */
+#define PERI_RST2_IPF                          (1 << 0)
+#define PERI_RST2_SOCP                         (1 << 1)
+#define PERI_RST2_DMAC                         (1 << 2)
+#define PERI_RST2_SECENG                       (1 << 3)
+#define PERI_RST2_ABB                          (1 << 4)
+#define PERI_RST2_HPM0                         (1 << 5)
+#define PERI_RST2_HPM1                         (1 << 6)
+#define PERI_RST2_HPM2                         (1 << 7)
+#define PERI_RST2_HPM3                         (1 << 8)
+
+/*
+ * PERI_SC_PERIPH_RSTEN3
+ * PERI_SC_PERIPH_RSTDIS3
+ * PERI_SC_PERIPH_RSTSTAT3
+ */
+#define PERI_RST3_CSSYS                                (1 << 0)
+#define PERI_RST3_I2C0                         (1 << 1)
+#define PERI_RST3_I2C1                         (1 << 2)
+#define PERI_RST3_I2C2                         (1 << 3)
+#define PERI_RST3_I2C3                         (1 << 4)
+#define PERI_RST3_UART1                                (1 << 5)
+#define PERI_RST3_UART2                                (1 << 6)
+#define PERI_RST3_UART3                                (1 << 7)
+#define PERI_RST3_UART4                                (1 << 8)
+#define PERI_RST3_SSP                          (1 << 9)
+#define PERI_RST3_PWM                          (1 << 10)
+#define PERI_RST3_BLPWM                                (1 << 11)
+#define PERI_RST3_TSENSOR                      (1 << 12)
+#define PERI_RST3_DAPB                         (1 << 18)
+#define PERI_RST3_HKADC                                (1 << 19)
+#define PERI_RST3_CODEC                                (1 << 20)
+
+/*
+ * PERI_SC_PERIPH_RSTEN8
+ * PERI_SC_PERIPH_RSTDIS8
+ * PERI_SC_PERIPH_RSTSTAT8
+ */
+#define PERI_RST8_RS0                          (1 << 0)
+#define PERI_RST8_RS2                          (1 << 1)
+#define PERI_RST8_RS3                          (1 << 2)
+#define PERI_RST8_MS0                          (1 << 3)
+#define PERI_RST8_MS2                          (1 << 5)
+#define PERI_RST8_XG2RAM0                      (1 << 6)
+#define PERI_RST8_X2SRAM_TZMA                  (1 << 7)
+#define PERI_RST8_SRAM                         (1 << 8)
+#define PERI_RST8_HARQ                         (1 << 10)
+#define PERI_RST8_DDRC                         (1 << 12)
+#define PERI_RST8_DDRC_APB                     (1 << 13)
+#define PERI_RST8_DDRPACK_APB                  (1 << 14)
+#define PERI_RST8_DDRT                         (1 << 17)
+
+#endif /* __HI6220_PERI_H__ */
diff --git a/plat/hisilicon/hikey/include/hi6220_regs_pin.h b/plat/hisilicon/hikey/include/hi6220_regs_pin.h
new file mode 100644 (file)
index 0000000..7de4c3c
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef __HI6220_PIN_H__
+#define __HI6220_PIN_H__
+
+#define IOMG_BASE                              0xF7010000
+
+#define IOMG_SD_CLK                            (IOMG_BASE + 0x0C)
+#define IOMG_SD_CMD                            (IOMG_BASE + 0x10)
+#define IOMG_SD_DATA0                          (IOMG_BASE + 0x14)
+#define IOMG_SD_DATA1                          (IOMG_BASE + 0x18)
+#define IOMG_SD_DATA2                          (IOMG_BASE + 0x1C)
+#define IOMG_SD_DATA3                          (IOMG_BASE + 0x20)
+#define IOMG_GPIO24                            (IOMG_BASE + 0x140)
+
+#define IOMG_MUX_FUNC0                         0
+#define IOMG_MUX_FUNC1                         1
+#define IOMG_MUX_FUNC2                         2
+
+#define IOCG1_BASE                             0xF7010800
+#define IOCG2_BASE                             0xF8001800
+
+#define IOCG_SD_CLK                            (IOCG1_BASE + 0x0C)
+#define IOCG_SD_CMD                            (IOCG1_BASE + 0x10)
+#define IOCG_SD_DATA0                          (IOCG1_BASE + 0x14)
+#define IOCG_SD_DATA1                          (IOCG1_BASE + 0x18)
+#define IOCG_SD_DATA2                          (IOCG1_BASE + 0x1C)
+#define IOCG_SD_DATA3                          (IOCG1_BASE + 0x20)
+#define IOCG_GPIO24                            (IOCG1_BASE + 0x150)
+#define IOCG_GPIO8                             (IOCG2_BASE + 0x30)
+
+#define IOCG_DRIVE_8MA                         (2 << 4)
+#define IOCG_DRIVE_10MA                                (3 << 4)
+#define IOCG_INPUT_16MA                                0x64
+#define IOCG_INPUT_12MA                                0x54
+#define IOCG_PULLDOWN                          (1 << 1)
+#define IOCG_PULLUP                            (1 << 0)
+
+#endif /* __HI6220_PIN_H__ */
diff --git a/plat/hisilicon/hikey/include/hi6220_regs_pmctrl.h b/plat/hisilicon/hikey/include/hi6220_regs_pmctrl.h
new file mode 100644 (file)
index 0000000..dc09b20
--- /dev/null
@@ -0,0 +1,101 @@
+/*
+ * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef __HI6220_REGS_PMCTRL_H__
+#define __HI6220_REGS_PMCTRL_H__
+
+#define PMCTRL_BASE                            0xF7032000
+
+#define PMCTRL_ACPUPLLCTRL                     (PMCTRL_BASE + 0x000)
+#define PMCTRL_ACPUPLLFREQ                     (PMCTRL_BASE + 0x004)
+#define PMCTRL_DDRPLL1CTRL                     (PMCTRL_BASE + 0x010)
+#define PMCTRL_DDRPLL0CTRL                     (PMCTRL_BASE + 0x030)
+#define PMCTRL_MEDPLLCTRL                      (PMCTRL_BASE + 0x038)
+#define PMCTRL_ACPUPLLSEL                      (PMCTRL_BASE + 0x100)
+#define PMCTRL_ACPUCLKDIV                      (PMCTRL_BASE + 0x104)
+#define PMCTRL_ACPUSYSPLLCFG                   (PMCTRL_BASE + 0x110)
+#define PMCTRL_ACPUCLKOFFCFG                   (PMCTRL_BASE + 0x114)
+#define PMCTRL_ACPUPLLFRAC                     (PMCTRL_BASE + 0x134)
+#define PMCTRL_ACPUPMUVOLUPTIME                        (PMCTRL_BASE + 0x360)
+#define PMCTRL_ACPUPMUVOLDNTIME                        (PMCTRL_BASE + 0x364)
+#define PMCTRL_ACPUVOLPMUADDR                  (PMCTRL_BASE + 0x368)
+#define PMCTRL_ACPUVOLUPSTEP                   (PMCTRL_BASE + 0x36c)
+#define PMCTRL_ACPUVOLDNSTEP                   (PMCTRL_BASE + 0x370)
+#define PMCTRL_ACPUDFTVOL                      (PMCTRL_BASE + 0x374)
+#define PMCTRL_ACPUDESTVOL                     (PMCTRL_BASE + 0x378)
+#define PMCTRL_ACPUVOLTTIMEOUT                 (PMCTRL_BASE + 0x37c)
+
+#define PMCTRL_ACPUPLLCTRL_EN_CFG              (1 << 0)
+
+#define PMCTRL_ACPUCLKDIV_CPUEXT_CFG_MASK      (3 << 0)
+#define PMCTRL_ACPUCLKDIV_DDR_CFG_MASK         (3 << 8)
+#define PMCTRL_ACPUCLKDIV_CPUEXT_STAT_MASK     (3 << 16)
+#define PMCTRL_ACPUCLKDIV_DDR_STAT_MASK                (3 << 24)
+
+#define PMCTRL_ACPUPLLSEL_ACPUPLL_CFG          (1 << 0)
+#define PMCTRL_ACPUPLLSEL_ACPUPLL_STAT         (1 << 1)
+#define PMCTRL_ACPUPLLSEL_SYSPLL_STAT          (1 << 2)
+
+#define PMCTRL_ACPUSYSPLL_CLKDIV_CFG_MASK      0x7
+#define PMCTRL_ACPUSYSPLL_CLKEN_CFG            (1 << 4)
+#define PMCTRL_ACPUSYSPLL_CLKDIV_SW            (3 << 12)
+
+#define PMCTRL_ACPUSYSPLLCFG_SYSPLL_CLKEN      (1 << 4)
+#define PMCTRL_ACPUSYSPLLCFG_CLKDIV_MASK       (3 << 12)
+
+#define PMCTRL_ACPUDESTVOL_DEST_VOL_MASK       0x7f
+#define PMCTRL_ACPUDESTVOL_CURR_VOL_MASK       (0x7f << 8)
+
+#define SOC_PMCTRL_ACPUPLLCTRL_acpupll_en_cfg_START   (0)
+#define SOC_PMCTRL_ACPUPLLCTRL_acpupll_en_cfg_END     (0)
+#define SOC_PMCTRL_ACPUPLLCTRL_acpupll_rst_START      (2)
+#define SOC_PMCTRL_ACPUPLLCTRL_acpupll_rst_END        (2)
+#define SOC_PMCTRL_ACPUPLLCTRL_acpupll_time_START     (4)
+#define SOC_PMCTRL_ACPUPLLCTRL_acpupll_time_END       (27)
+#define SOC_PMCTRL_ACPUPLLCTRL_acpupll_timeout_START  (28)
+#define SOC_PMCTRL_ACPUPLLCTRL_acpupll_timeout_END    (28)
+#define SOC_PMCTRL_ACPUPLLCTRL_acpupll_lock_START     (29)
+#define SOC_PMCTRL_ACPUPLLCTRL_acpupll_lock_END       (29)
+
+#define SOC_PMCTRL_ACPUPLLFRAC_ADDR(base)   ((base) + (0x134))
+#define SOC_PMCTRL_ACPUSYSPLLCFG_acpu_subsys_clk_div_sw_START   (12)
+
+#define SOC_PMCTRL_ACPUPLLSEL_acpu_pllsw_cfg_START   (0)
+#define SOC_PMCTRL_ACPUPLLSEL_acpu_pllsw_cfg_END     (0)
+#define SOC_PMCTRL_ACPUPLLSEL_acpu_pllsw_stat_START  (1)
+#define SOC_PMCTRL_ACPUPLLSEL_acpu_pllsw_stat_END    (1)
+#define SOC_PMCTRL_ACPUPLLSEL_syspll_sw_stat_START   (2)
+#define SOC_PMCTRL_ACPUPLLSEL_syspll_sw_stat_END     (2)
+
+#define SOC_PMCTRL_ACPUCLKDIV_cpuext_clk_div_cfg_START     (0)
+#define SOC_PMCTRL_ACPUCLKDIV_cpuext_clk_div_cfg_END       (1)
+#define SOC_PMCTRL_ACPUCLKDIV_acpu_ddr_clk_div_cfg_START   (8)
+#define SOC_PMCTRL_ACPUCLKDIV_acpu_ddr_clk_div_cfg_END     (9)
+#define SOC_PMCTRL_ACPUCLKDIV_cpuext_clk_div_stat_START    (16)
+#define SOC_PMCTRL_ACPUCLKDIV_cpuext_clk_div_stat_END      (17)
+#define SOC_PMCTRL_ACPUCLKDIV_acpu_ddr_clk_div_stat_START  (24)
+#define SOC_PMCTRL_ACPUCLKDIV_acpu_ddr_clk_div_stat_END    (25)
+
+#define SOC_PMCTRL_ACPUDESTVOL_acpu_dest_vol_START   (0)
+#define SOC_PMCTRL_ACPUDESTVOL_acpu_dest_vol_END     (6)
+#define SOC_PMCTRL_ACPUDESTVOL_acpu_vol_using_START  (8)
+#define SOC_PMCTRL_ACPUDESTVOL_acpu_vol_using_END    (14)
+
+#define SOC_PMCTRL_ACPUVOLTIMEOUT_acpu_vol_timeout_START  (0)
+#define SOC_PMCTRL_ACPUVOLTIMEOUT_acpu_vol_timeout_END    (0)
+
+#define SOC_PMCTRL_ACPUSYSPLLCFG_acpu_syspll_div_cfg_START      (0)
+#define SOC_PMCTRL_ACPUSYSPLLCFG_acpu_syspll_div_cfg_END        (2)
+#define SOC_PMCTRL_ACPUSYSPLLCFG_acpu_syspll_clken_cfg_START    (4)
+#define SOC_PMCTRL_ACPUSYSPLLCFG_acpu_syspll_clken_cfg_END      (4)
+#define SOC_PMCTRL_ACPUSYSPLLCFG_acpu_subsys_clk_div_cfg_START  (8)
+#define SOC_PMCTRL_ACPUSYSPLLCFG_acpu_subsys_clk_div_cfg_END    (9)
+#define SOC_PMCTRL_ACPUSYSPLLCFG_acpu_syspll_div_stat_START     (16)
+#define SOC_PMCTRL_ACPUSYSPLLCFG_acpu_syspll_div_stat_END       (19)
+#define SOC_PMCTRL_ACPUSYSPLLCFG_acpu_syspll_clken_stat_START   (20)
+#define SOC_PMCTRL_ACPUSYSPLLCFG_acpu_syspll_clken_stat_END     (20)
+
+#endif /* __HI6220_REGS_PMCTRL_H__ */
diff --git a/plat/hisilicon/hikey/include/hi6553.h b/plat/hisilicon/hikey/include/hi6553.h
new file mode 100644 (file)
index 0000000..76cb8ff
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef __HI6553_H__
+#define __HI6553_H__
+
+#include <hi6220.h>
+#include <mmio.h>
+
+#define HI6553_DISABLE6_XO_CLK                 (PMUSSI_BASE + (0x036 << 2))
+
+#define DISABLE6_XO_CLK_BB                     (1 << 0)
+#define DISABLE6_XO_CLK_CONN                   (1 << 1)
+#define DISABLE6_XO_CLK_NFC                    (1 << 2)
+#define DISABLE6_XO_CLK_RF1                    (1 << 3)
+#define DISABLE6_XO_CLK_RF2                    (1 << 4)
+
+#define HI6553_VERSION_REG                     (PMUSSI_BASE + (0x000 << 2))
+#define HI6553_ENABLE2_LDO1_8                  (PMUSSI_BASE + (0x029 << 2))
+#define HI6553_DISABLE2_LDO1_8                 (PMUSSI_BASE + (0x02a << 2))
+#define HI6553_ONOFF_STATUS2_LDO1_8            (PMUSSI_BASE + (0x02b << 2))
+#define HI6553_ENABLE3_LDO9_16                 (PMUSSI_BASE + (0x02c << 2))
+#define HI6553_DISABLE3_LDO9_16                        (PMUSSI_BASE + (0x02d << 2))
+#define HI6553_ONOFF_STATUS3_LDO9_16           (PMUSSI_BASE + (0x02e << 2))
+#define HI6553_ENABLE4_LDO17_22                        (PMUSSI_BASE + (0x02f << 2))
+#define HI6553_DISABLE4_LDO17_22               (PMUSSI_BASE + (0x030 << 2))
+#define HI6553_ONOFF_STATUS4_LDO17_22          (PMUSSI_BASE + (0x031 << 2))
+#define HI6553_PERI_EN_MARK                    (PMUSSI_BASE + (0x040 << 2))
+#define HI6553_BUCK2_REG1                      (PMUSSI_BASE + (0x04a << 2))
+#define HI6553_BUCK2_REG5                      (PMUSSI_BASE + (0x04e << 2))
+#define HI6553_BUCK2_REG6                      (PMUSSI_BASE + (0x04f << 2))
+#define HI6553_BUCK3_REG3                      (PMUSSI_BASE + (0x054 << 2))
+#define HI6553_BUCK3_REG5                      (PMUSSI_BASE + (0x056 << 2))
+#define HI6553_BUCK3_REG6                      (PMUSSI_BASE + (0x057 << 2))
+#define HI6553_BUCK4_REG2                      (PMUSSI_BASE + (0x05b << 2))
+#define HI6553_BUCK4_REG5                      (PMUSSI_BASE + (0x05e << 2))
+#define HI6553_BUCK4_REG6                      (PMUSSI_BASE + (0x05f << 2))
+#define HI6553_CLK_TOP0                                (PMUSSI_BASE + (0x063 << 2))
+#define HI6553_CLK_TOP3                                (PMUSSI_BASE + (0x066 << 2))
+#define HI6553_CLK_TOP4                                (PMUSSI_BASE + (0x067 << 2))
+#define HI6553_VSET_BUCK2_ADJ                  (PMUSSI_BASE + (0x06d << 2))
+#define HI6553_VSET_BUCK3_ADJ                  (PMUSSI_BASE + (0x06e << 2))
+#define HI6553_LDO7_REG_ADJ                    (PMUSSI_BASE + (0x078 << 2))
+#define HI6553_LDO10_REG_ADJ                   (PMUSSI_BASE + (0x07b << 2))
+#define HI6553_LDO15_REG_ADJ                   (PMUSSI_BASE + (0x080 << 2))
+#define HI6553_LDO19_REG_ADJ                   (PMUSSI_BASE + (0x084 << 2))
+#define HI6553_LDO20_REG_ADJ                   (PMUSSI_BASE + (0x085 << 2))
+#define HI6553_LDO21_REG_ADJ                   (PMUSSI_BASE + (0x086 << 2))
+#define HI6553_LDO22_REG_ADJ                   (PMUSSI_BASE + (0x087 << 2))
+#define HI6553_DR_LED_CTRL                     (PMUSSI_BASE + (0x098 << 2))
+#define HI6553_DR_OUT_CTRL                     (PMUSSI_BASE + (0x099 << 2))
+#define HI6553_DR3_ISET                                (PMUSSI_BASE + (0x09a << 2))
+#define HI6553_DR3_START_DEL                   (PMUSSI_BASE + (0x09b << 2))
+#define HI6553_DR4_ISET                                (PMUSSI_BASE + (0x09c << 2))
+#define HI6553_DR4_START_DEL                   (PMUSSI_BASE + (0x09d << 2))
+#define HI6553_DR345_TIM_CONF0                 (PMUSSI_BASE + (0x0a0 << 2))
+#define HI6553_NP_REG_ADJ1                     (PMUSSI_BASE + (0x0be << 2))
+#define HI6553_NP_REG_CHG                      (PMUSSI_BASE + (0x0c0 << 2))
+#define HI6553_BUCK01_CTRL2                    (PMUSSI_BASE + (0x0d9 << 2))
+#define HI6553_BUCK0_CTRL1                     (PMUSSI_BASE + (0x0dd << 2))
+#define HI6553_BUCK0_CTRL5                     (PMUSSI_BASE + (0x0e1 << 2))
+#define HI6553_BUCK0_CTRL7                     (PMUSSI_BASE + (0x0e3 << 2))
+#define HI6553_BUCK1_CTRL1                     (PMUSSI_BASE + (0x0e8 << 2))
+#define HI6553_BUCK1_CTRL5                     (PMUSSI_BASE + (0x0ec << 2))
+#define HI6553_BUCK1_CTRL7                     (PMUSSI_BASE + (0x0ef << 2))
+#define HI6553_CLK19M2_600_586_EN              (PMUSSI_BASE + (0x0fe << 2))
+
+#define LED_START_DELAY_TIME                   0x00
+#define LED_ELEC_VALUE                         0x07
+#define LED_LIGHT_TIME                         0xf0
+#define LED_GREEN_ENABLE                       (1 << 1)
+#define LED_OUT_CTRL                           0x00
+
+#define PMU_HI6552_V300                                0x30
+#define PMU_HI6552_V310                                0x31
+
+#endif /* __HI6553_H__ */
diff --git a/plat/hisilicon/hikey/include/plat_macros.S b/plat/hisilicon/hikey/include/plat_macros.S
new file mode 100644 (file)
index 0000000..1ad217a
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef __PLAT_MACROS_S__
+#define __PLAT_MACROS_S__
+
+#include <cci.h>
+#include <gic_v2.h>
+#include <hi6220.h>
+#include <platform_def.h>
+
+.section .rodata.gic_reg_name, "aS"
+gicc_regs:
+       .asciz "gicc_hppir", "gicc_ahppir", "gicc_ctlr", ""
+gicd_pend_reg:
+       .asciz "gicd_ispendr regs (Offsets 0x200 - 0x278)\n"    \
+               " Offset:\t\t\tvalue\n"
+newline:
+       .asciz "\n"
+spacer:
+       .asciz ":\t\t0x"
+
+.section .rodata.cci_reg_name, "aS"
+cci_iface_regs:
+       .asciz "cci_snoop_ctrl_cluster0", "cci_snoop_ctrl_cluster1" , ""
+
+/* ---------------------------------------------
+ * The below macro prints out relevant GIC
+ * registers whenever an unhandled exception is
+ * taken in BL31.
+ * ---------------------------------------------
+ */
+.macro plat_crash_print_regs
+       mov_imm x16, PLAT_ARM_GICD_BASE
+       mov_imm x17, PLAT_ARM_GICC_BASE
+
+       /* Load the gicc reg list to x6 */
+       adr     x6, gicc_regs
+       /* Load the gicc regs to gp regs used by str_in_crash_buf_print */
+       ldr     w8, [x17, #GICC_HPPIR]
+       ldr     w9, [x17, #GICC_AHPPIR]
+       ldr     w10, [x17, #GICC_CTLR]
+       /* Store to the crash buf and print to cosole */
+       bl      str_in_crash_buf_print
+
+       /* Print the GICD_ISPENDR regs */
+       add     x7, x16, #GICD_ISPENDR
+       adr     x4, gicd_pend_reg
+       bl      asm_print_str
+2:
+       sub     x4, x7, x16
+       cmp     x4, #0x280
+       b.eq    1f
+       bl      asm_print_hex
+       adr     x4, spacer
+       bl      asm_print_str
+       ldr     x4, [x7], #8
+       bl      asm_print_hex
+       adr     x4, newline
+       bl      asm_print_str
+       b       2b
+1:
+       adr     x6, cci_iface_regs
+       /* Store in x7 the base address of the first interface */
+       mov_imm x7, (CCI400_BASE + SLAVE_IFACE_OFFSET(  \
+                       CCI400_SL_IFACE3_CLUSTER_IX))
+       ldr     w8, [x7, #SNOOP_CTRL_REG]
+       /* Store in x7 the base address of the second interface */
+       mov_imm x7, (CCI400_BASE + SLAVE_IFACE_OFFSET(  \
+                       CCI400_SL_IFACE4_CLUSTER_IX))
+       ldr     w9, [x7, #SNOOP_CTRL_REG]
+       /* Store to the crash buf and print to console */
+       bl      str_in_crash_buf_print
+.endm
+
+#endif /* __PLAT_MACROS_S__ */
diff --git a/plat/hisilicon/hikey/include/platform_def.h b/plat/hisilicon/hikey/include/platform_def.h
new file mode 100644 (file)
index 0000000..a91a9b0
--- /dev/null
@@ -0,0 +1,136 @@
+/*
+ * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef __PLATFORM_DEF_H__
+#define __PLATFORM_DEF_H__
+
+#include <arch.h>
+#include "../hikey_def.h"
+
+/*
+ * Platform binary types for linking
+ */
+#define PLATFORM_LINKER_FORMAT          "elf64-littleaarch64"
+#define PLATFORM_LINKER_ARCH            aarch64
+
+
+/*
+ * Generic platform constants
+ */
+
+/* Size of cacheable stacks */
+#define PLATFORM_STACK_SIZE            0x800
+
+#define FIRMWARE_WELCOME_STR           "Booting Trusted Firmware\n"
+
+#define PLATFORM_CACHE_LINE_SIZE       64
+#define PLATFORM_CLUSTER_COUNT         2
+#define PLATFORM_CORE_COUNT_PER_CLUSTER        4
+#define PLATFORM_CORE_COUNT            (PLATFORM_CLUSTER_COUNT *       \
+                                        PLATFORM_CORE_COUNT_PER_CLUSTER)
+#define PLAT_MAX_PWR_LVL               MPIDR_AFFLVL2
+#define PLAT_NUM_PWR_DOMAINS           (PLATFORM_CORE_COUNT + \
+                                        PLATFORM_CLUSTER_COUNT + 1)
+
+#define PLAT_MAX_RET_STATE             1
+#define PLAT_MAX_OFF_STATE             2
+
+#define MAX_IO_DEVICES                 3
+#define MAX_IO_HANDLES                 4
+/* eMMC RPMB and eMMC User Data */
+#define MAX_IO_BLOCK_DEVICES           2
+
+/* GIC related constants (no GICR in GIC-400) */
+#define PLAT_ARM_GICD_BASE             0xF6801000
+#define PLAT_ARM_GICC_BASE             0xF6802000
+#define PLAT_ARM_GICH_BASE             0xF6804000
+#define PLAT_ARM_GICV_BASE             0xF6806000
+
+
+/*
+ * Platform memory map related constants
+ */
+
+/*
+ * BL1 is stored in XG2RAM0_HIRQ that is 784KB large (0xF980_0000~0xF98C_4000).
+ */
+#define ONCHIPROM_PARAM_BASE           (XG2RAM0_BASE + 0x700)
+#define LOADER_RAM_BASE                        (XG2RAM0_BASE + 0x800)
+#define BL1_XG2RAM0_OFFSET             0x1000
+
+/*
+ * BL1 specific defines.
+ *
+ * Both loader and BL1_RO region stay in SRAM since they are used to simulate
+ * ROM.
+ * Loader is used to switch Hi6220 SoC from 32-bit to 64-bit mode.
+ *
+ * ++++++++++  0xF980_0000
+ * + loader +
+ * ++++++++++  0xF980_1000
+ * + BL1_RO +
+ * ++++++++++  0xF981_0000
+ * + BL1_RW +
+ * ++++++++++  0xF989_8000
+ */
+#define BL1_RO_BASE                    (XG2RAM0_BASE + BL1_XG2RAM0_OFFSET)
+#define BL1_RO_LIMIT                   (XG2RAM0_BASE + 0x10000)
+#define BL1_RW_BASE                    (BL1_RO_LIMIT)  /* 0xf981_0000 */
+#define BL1_RW_SIZE                    (0x00088000)
+#define BL1_RW_LIMIT                   (0xF9898000)
+
+/*
+ * BL2 specific defines.
+ */
+#define BL2_BASE                       (BL1_RW_BASE + 0x8000)  /* 0xf981_8000 */
+#define BL2_LIMIT                      (BL2_BASE + 0x40000)
+
+/*
+ * SCP_BL2 specific defines.
+ * In HiKey, SCP_BL2 means MCU firmware. It's loaded into the temporary buffer
+ * at 0x0100_0000. Then BL2 will parse the sections and loaded them into
+ * predefined separated buffers.
+ */
+#define SCP_BL2_BASE                   (DDR_BASE + 0x01000000)
+#define SCP_BL2_LIMIT                  (SCP_BL2_BASE + 0x00100000)
+#define SCP_BL2_SIZE                   (SCP_BL2_LIMIT - SCP_BL2_BASE)
+
+/*
+ * BL31 specific defines.
+ */
+#define BL31_BASE                      BL2_LIMIT
+#define BL31_LIMIT                     0xF9898000
+
+#define NS_BL1U_BASE                   (BL2_BASE)
+#define NS_BL1U_SIZE                   (0x00010000)
+#define NS_BL1U_LIMIT                  (NS_BL1U_BASE + NS_BL1U_SIZE)
+
+/*
+ * Platform specific page table and MMU setup constants
+ */
+#define ADDR_SPACE_SIZE                        (1ull << 32)
+
+#if IMAGE_BL1 || IMAGE_BL2 || IMAGE_BL31
+#define MAX_XLAT_TABLES                        3
+#endif
+
+#define MAX_MMAP_REGIONS               16
+
+#define HIKEY_NS_IMAGE_OFFSET          (DDR_BASE + 0x35000000)
+
+/*
+ * Declarations and constants to access the mailboxes safely. Each mailbox is
+ * aligned on the biggest cache line size in the platform. This is known only
+ * to the platform as it might have a combination of integrated and external
+ * caches. Such alignment ensures that two maiboxes do not sit on the same cache
+ * line at any cache level. They could belong to different cpus/clusters &
+ * get written while being protected by different locks causing corruption of
+ * a valid mailbox address.
+ */
+#define CACHE_WRITEBACK_SHIFT          6
+#define CACHE_WRITEBACK_GRANULE                (1 << CACHE_WRITEBACK_SHIFT)
+
+#endif /* __PLATFORM_DEF_H__ */
diff --git a/plat/hisilicon/hikey/platform.mk b/plat/hisilicon/hikey/platform.mk
new file mode 100644 (file)
index 0000000..5aa9b15
--- /dev/null
@@ -0,0 +1,43 @@
+#
+# Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+
+CONSOLE_BASE                   :=      PL011_UART3_BASE
+CRASH_CONSOLE_BASE             :=      PL011_UART3_BASE
+PLAT_PL061_MAX_GPIOS           :=      160
+COLD_BOOT_SINGLE_CPU           :=      1
+PROGRAMMABLE_RESET_ADDRESS     :=      1
+
+# Process flags
+$(eval $(call add_define,CONSOLE_BASE))
+$(eval $(call add_define,CRASH_CONSOLE_BASE))
+$(eval $(call add_define,PLAT_PL061_MAX_GPIOS))
+
+ENABLE_PLAT_COMPAT     :=      0
+
+USE_COHERENT_MEM       :=      1
+
+PLAT_INCLUDES          :=      -Iinclude/common/tbbr                   \
+                               -Iinclude/drivers/synopsys              \
+                               -Iplat/hisilicon/hikey/include
+
+PLAT_BL_COMMON_SOURCES :=      drivers/arm/pl011/pl011_console.S       \
+                               lib/aarch64/xlat_tables.c               \
+                               plat/hisilicon/hikey/aarch64/hikey_common.c
+
+BL1_SOURCES            +=      bl1/tbbr/tbbr_img_desc.c                \
+                               drivers/arm/pl061/pl061_gpio.c          \
+                               drivers/arm/sp804/sp804_delay_timer.c   \
+                               drivers/delay_timer/delay_timer.c       \
+                               drivers/gpio/gpio.c                     \
+                               drivers/io/io_block.c                   \
+                               drivers/io/io_fip.c                     \
+                               drivers/io/io_storage.c                 \
+                               drivers/emmc/emmc.c                     \
+                               drivers/synopsys/emmc/dw_mmc.c          \
+                               lib/cpus/aarch64/cortex_a53.S           \
+                               plat/hisilicon/hikey/aarch64/hikey_helpers.S \
+                               plat/hisilicon/hikey/hikey_bl1_setup.c  \
+                               plat/hisilicon/hikey/hikey_io_storage.c