blob: 60e4f0de04fc03a6d0973d4ed1b59097b9d1db55 [file] [log] [blame]
Angel Pons7c1d70e2020-04-04 18:51:19 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Varadarajan Narayanana6935c22016-03-02 16:57:10 +05302
3#include <arch/cache.h>
Kyösti Mälkki13f66502019-03-03 08:01:05 +02004#include <device/mmio.h>
Varadarajan Narayanana6935c22016-03-02 16:57:10 +05305#include <cbfs.h>
6#include <console/console.h>
7#include <string.h>
Varadarajan Narayanan6fbc7632016-01-06 14:13:25 +05308#include <program_loading.h>
Varadarajan Narayanana6935c22016-03-02 16:57:10 +05309#include <soc/iomap.h>
10#include <soc/soc_services.h>
11
12#include "mbn_header.h"
13
Varadarajan Narayanan6fbc7632016-01-06 14:13:25 +053014struct cdt_info {
15 uint32_t size; /* size of the whole table */
16 uint8_t *cdt_ptr; /* pointer to CDT */
17};
18
Varadarajan Narayanana6935c22016-03-02 16:57:10 +053019static void *load_ipq_blob(const char *file_name)
20{
21 struct mbn_header *blob_mbn;
22 void *blob_dest;
23 size_t blob_size;
24
Julius Werner834b3ec2020-03-04 16:52:08 -080025 blob_mbn = cbfs_map(file_name, &blob_size);
Varadarajan Narayanana6935c22016-03-02 16:57:10 +053026 if (!blob_mbn)
27 return NULL;
28
29 /* some sanity checks on the headers */
30 if ((blob_mbn->mbn_version != 3) ||
31 (blob_mbn->mbn_total_size > blob_size))
32 return NULL;
33
34 blob_dest = (void *) blob_mbn->mbn_destination;
Varadarajan Narayanan6fbc7632016-01-06 14:13:25 +053035
Varadarajan Narayanana6935c22016-03-02 16:57:10 +053036 if (blob_mbn->mbn_destination) {
37 /* Copy the blob to the appropriate memory location. */
38 memcpy(blob_dest, blob_mbn + 1, blob_mbn->mbn_total_size);
39 cache_sync_instructions();
40 return blob_dest;
41 }
42
Varadarajan Narayanan6fbc7632016-01-06 14:13:25 +053043 return blob_mbn;
Varadarajan Narayanana6935c22016-03-02 16:57:10 +053044}
45
Varadarajan Narayanan6fbc7632016-01-06 14:13:25 +053046#define DDR_VERSION() ((const char *)"private build")
Varadarajan Narayanana6935c22016-03-02 16:57:10 +053047#define MAX_DDR_VERSION_SIZE 48
48
Varadarajan Narayanan6fbc7632016-01-06 14:13:25 +053049typedef struct {
50 uint64_t entry_point; /* Write only for Core Boot */
51 uint32_t elf_class;
52} sys_debug_qsee_info_type_t;
53
54typedef struct {
55 sys_debug_qsee_info_type_t *qsee_info;
56 uint64_t sdi_entry; /* Read only for Core Boot */
57} sbl_rw_ret_info_t;
58
59sbl_rw_ret_info_t *sbl_rw_ret_info;
60
Varadarajan Narayanana6935c22016-03-02 16:57:10 +053061int initialize_dram(void)
62{
Varadarajan Narayanan6fbc7632016-01-06 14:13:25 +053063 struct mbn_header *cdt;
64 struct cdt_info cdt_header;
65 uint32_t sw_entry;
66 /*
67 * FIXME: Hard coding the address. Have to somehow get it
68 * automatically
69 */
70 void *tzbsp = (uint8_t *)0x87e80000;
Varadarajan Narayanana6935c22016-03-02 16:57:10 +053071
Varadarajan Narayanan6fbc7632016-01-06 14:13:25 +053072 sbl_rw_ret_info_t (*(*ddr_init_function)(struct cdt_info *cdt_header));
73
74 cdt = load_ipq_blob(CONFIG_CDT_MBN);
75 ddr_init_function = load_ipq_blob(CONFIG_DDR_MBN);
Varadarajan Narayanana6935c22016-03-02 16:57:10 +053076
77 if (!cdt || !ddr_init_function) {
78 printk(BIOS_ERR, "cdt: %p, ddr_init_function: %p\n",
79 cdt, ddr_init_function);
80 die("could not find DDR initialization blobs\n");
81 }
82
Varadarajan Narayanan6fbc7632016-01-06 14:13:25 +053083 cdt_header.size = cdt->mbn_total_size;
84 cdt_header.cdt_ptr = (uint8_t *)(cdt + 1);
85
86 sbl_rw_ret_info = ddr_init_function(&cdt_header);
87 if (sbl_rw_ret_info == NULL)
Varadarajan Narayanana6935c22016-03-02 16:57:10 +053088 die("Fail to Initialize DDR\n");
89
90 /*
Jonathan Neuschäfer5268b762018-02-12 12:24:25 +010091 * Once DDR initializer finished, its version can be found at a fixed
Varadarajan Narayanana6935c22016-03-02 16:57:10 +053092 * address in SRAM.
93 */
94 printk(BIOS_INFO, "DDR version %.*s initialized\n",
95 MAX_DDR_VERSION_SIZE, DDR_VERSION());
96
Varadarajan Narayanan6fbc7632016-01-06 14:13:25 +053097 printk(BIOS_INFO, "SDI Entry: 0x%llx\n", sbl_rw_ret_info->sdi_entry);
98 sw_entry = read32(TCSR_RESET_DEBUG_SW_ENTRY) & 0x1;
99 sw_entry |= (sbl_rw_ret_info->sdi_entry & ~0x1);
100 write32(TCSR_RESET_DEBUG_SW_ENTRY, sw_entry);
101 sbl_rw_ret_info->qsee_info->entry_point = (uint32_t)tzbsp;
102
Varadarajan Narayanana6935c22016-03-02 16:57:10 +0530103 return 0;
104}
105
Varadarajan Narayanana6935c22016-03-02 16:57:10 +0530106void start_tzbsp(void)
107{
Varadarajan Narayanan6fbc7632016-01-06 14:13:25 +0530108 void *tzbsp = load_ipq_blob(CONFIG_TZ_MBN);
Varadarajan Narayanana6935c22016-03-02 16:57:10 +0530109
110 if (!tzbsp)
111 die("could not find or map TZBSP\n");
112
113 printk(BIOS_INFO, "Starting TZBSP\n");
114
115 tz_init_wrapper(0, 0, tzbsp);
Varadarajan Narayanana6935c22016-03-02 16:57:10 +0530116
Varadarajan Narayanana6935c22016-03-02 16:57:10 +0530117}