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 Zhuangstatic 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 Zhuangint 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