xref: /rk3399_ARM-atf/plat/hisilicon/hikey960/hikey960_mcu_load.c (revision 61f72a34250d063da67f4fc2b0eb8c3fda3376be)
1 /*
2  * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #include <arch_helpers.h>
8 #include <assert.h>
9 #include <bl_common.h>
10 #include <debug.h>
11 #include <delay_timer.h>
12 #include <errno.h>
13 #include <hi3660.h>
14 #include <mmio.h>
15 #include <string.h>
16 
17 #define ADDR_CONVERT(addr)		((addr) < 0x40000 ?	\
18 					 (addr) + 0xFFF30000 :	\
19 					 (addr) + 0x40000000)
20 
21 static void fw_data_init(void)
22 {
23 	unsigned long data_head_addr;
24 	unsigned int *data_addr;
25 
26 	data_head_addr = mmio_read_32((uintptr_t) HISI_DATA_HEAD_BASE) + 0x14;
27 	data_addr = (unsigned int *) ADDR_CONVERT(data_head_addr);
28 
29 	memcpy((void *)HISI_DATA0_BASE,
30 	       (const void *)(unsigned long)ADDR_CONVERT(data_addr[0]),
31 	       HISI_DATA0_SIZE);
32 	memcpy((void *)HISI_DATA1_BASE,
33 	       (const void *)(unsigned long)ADDR_CONVERT(data_addr[1]),
34 	       HISI_DATA1_SIZE);
35 }
36 
37 int load_lpm3(void)
38 {
39 	INFO("start fw loading\n");
40 
41 	fw_data_init();
42 
43 	flush_dcache_range((uintptr_t)HISI_RESERVED_MEM_BASE,
44 			   HISI_RESERVED_MEM_SIZE);
45 
46 	sev();
47 	sev();
48 
49 	INFO("fw load success\n");
50 
51 	return 0;
52 }
53