xref: /rk3399_ARM-atf/plat/hisilicon/hikey960/hikey960_mcu_load.c (revision 9a207532f8216bf83fed0891fed9ed0bc72ca450)
17cb09cb4SHaojian Zhuang /*
27cb09cb4SHaojian Zhuang  * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
37cb09cb4SHaojian Zhuang  *
47cb09cb4SHaojian Zhuang  * SPDX-License-Identifier: BSD-3-Clause
57cb09cb4SHaojian Zhuang  */
67cb09cb4SHaojian Zhuang 
77cb09cb4SHaojian Zhuang #include <assert.h>
87cb09cb4SHaojian Zhuang #include <errno.h>
97cb09cb4SHaojian Zhuang #include <string.h>
107cb09cb4SHaojian Zhuang 
11*09d40e0eSAntonio Nino Diaz #include <arch_helpers.h>
12*09d40e0eSAntonio Nino Diaz #include <common/bl_common.h>
13*09d40e0eSAntonio Nino Diaz #include <common/debug.h>
14*09d40e0eSAntonio Nino Diaz #include <drivers/delay_timer.h>
15*09d40e0eSAntonio Nino Diaz #include <lib/mmio.h>
16*09d40e0eSAntonio Nino Diaz 
17*09d40e0eSAntonio Nino Diaz #include <hi3660.h>
18*09d40e0eSAntonio Nino Diaz 
197cb09cb4SHaojian Zhuang #define ADDR_CONVERT(addr)		((addr) < 0x40000 ?	\
207cb09cb4SHaojian Zhuang 					 (addr) + 0xFFF30000 :	\
217cb09cb4SHaojian Zhuang 					 (addr) + 0x40000000)
227cb09cb4SHaojian Zhuang 
fw_data_init(void)237cb09cb4SHaojian Zhuang static void fw_data_init(void)
247cb09cb4SHaojian Zhuang {
257cb09cb4SHaojian Zhuang 	unsigned long data_head_addr;
267cb09cb4SHaojian Zhuang 	unsigned int *data_addr;
277cb09cb4SHaojian Zhuang 
287cb09cb4SHaojian Zhuang 	data_head_addr = mmio_read_32((uintptr_t) HISI_DATA_HEAD_BASE) + 0x14;
297cb09cb4SHaojian Zhuang 	data_addr = (unsigned int *) ADDR_CONVERT(data_head_addr);
307cb09cb4SHaojian Zhuang 
317cb09cb4SHaojian Zhuang 	memcpy((void *)HISI_DATA0_BASE,
327cb09cb4SHaojian Zhuang 	       (const void *)(unsigned long)ADDR_CONVERT(data_addr[0]),
337cb09cb4SHaojian Zhuang 	       HISI_DATA0_SIZE);
347cb09cb4SHaojian Zhuang 	memcpy((void *)HISI_DATA1_BASE,
357cb09cb4SHaojian Zhuang 	       (const void *)(unsigned long)ADDR_CONVERT(data_addr[1]),
367cb09cb4SHaojian Zhuang 	       HISI_DATA1_SIZE);
377cb09cb4SHaojian Zhuang }
387cb09cb4SHaojian Zhuang 
load_lpm3(void)397cb09cb4SHaojian Zhuang int load_lpm3(void)
407cb09cb4SHaojian Zhuang {
417cb09cb4SHaojian Zhuang 	INFO("start fw loading\n");
427cb09cb4SHaojian Zhuang 
437cb09cb4SHaojian Zhuang 	fw_data_init();
447cb09cb4SHaojian Zhuang 
457cb09cb4SHaojian Zhuang 	flush_dcache_range((uintptr_t)HISI_RESERVED_MEM_BASE,
467cb09cb4SHaojian Zhuang 			   HISI_RESERVED_MEM_SIZE);
477cb09cb4SHaojian Zhuang 
487cb09cb4SHaojian Zhuang 	sev();
497cb09cb4SHaojian Zhuang 	sev();
507cb09cb4SHaojian Zhuang 
517cb09cb4SHaojian Zhuang 	INFO("fw load success\n");
527cb09cb4SHaojian Zhuang 
537cb09cb4SHaojian Zhuang 	return 0;
547cb09cb4SHaojian Zhuang }
55