blob: 18d36ca2623bb2e63612130486db0ebf739d9634 [file] [log] [blame]
Pankaj Gupta988bbb22020-12-09 14:02:40 +05301/*
2 * Copyright 2018-2020 NXP
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7
8#ifndef PLAT_COMMON_H
9#define PLAT_COMMON_H
10
11#include <stdbool.h>
12
13#include <lib/el3_runtime/cpu_data.h>
14#include <platform_def.h>
15
16#ifdef IMAGE_BL31
17
18#define BL31_END (uintptr_t)(&__BL31_END__)
19
20/*******************************************************************************
21 * This structure represents the superset of information that can be passed to
22 * BL31 e.g. while passing control to it from BL2. The BL32 parameters will be
23 * populated only if BL2 detects its presence. A pointer to a structure of this
24 * type should be passed in X0 to BL31's cold boot entrypoint.
25 *
26 * Use of this structure and the X0 parameter is not mandatory: the BL31
27 * platform code can use other mechanisms to provide the necessary information
28 * about BL32 and BL33 to the common and SPD code.
29 *
30 * BL31 image information is mandatory if this structure is used. If either of
31 * the optional BL32 and BL33 image information is not provided, this is
32 * indicated by the respective image_info pointers being zero.
33 ******************************************************************************/
34typedef struct bl31_params {
35 param_header_t h;
36 image_info_t *bl31_image_info;
37 entry_point_info_t *bl32_ep_info;
38 image_info_t *bl32_image_info;
39 entry_point_info_t *bl33_ep_info;
40 image_info_t *bl33_image_info;
41} bl31_params_t;
42
43/* BL3 utility functions */
44void ls_bl31_early_platform_setup(void *from_bl2,
45 void *plat_params_from_bl2);
46/* LS Helper functions */
47unsigned int plat_my_core_mask(void);
48unsigned int plat_core_mask(u_register_t mpidr);
49unsigned int plat_core_pos(u_register_t mpidr);
50//unsigned int plat_my_core_pos(void);
51
52/* BL31 Data API(s) */
53void _init_global_data(void);
54void _initialize_psci(void);
55uint32_t _getCoreState(u_register_t core_mask);
56void _setCoreState(u_register_t core_mask, u_register_t core_state);
57
58/* SoC defined structure and API(s) */
59void soc_runtime_setup(void);
60void soc_init(void);
61void soc_platform_setup(void);
62void soc_early_platform_setup2(void);
63#endif /* IMAGE_BL31 */
64
65#ifdef IMAGE_BL2
66void soc_early_init(void);
67void soc_mem_access(void);
68void soc_preload_setup(void);
69void soc_bl2_prepare_exit(void);
70
71/* IO storage utility functions */
72int plat_io_setup(void);
73int open_backend(const uintptr_t spec);
74
75void ls_bl2_plat_arch_setup(void);
76void ls_bl2_el3_plat_arch_setup(void);
77
78enum boot_device {
79 BOOT_DEVICE_IFC_NOR,
80 BOOT_DEVICE_IFC_NAND,
81 BOOT_DEVICE_QSPI,
82 BOOT_DEVICE_EMMC,
83 BOOT_DEVICE_SDHC2_EMMC,
84 BOOT_DEVICE_FLEXSPI_NOR,
85 BOOT_DEVICE_FLEXSPI_NAND,
86 BOOT_DEVICE_NONE
87};
88
89enum boot_device get_boot_dev(void);
90
91/* DDR Related functions */
92#if DDR_INIT
93#ifdef NXP_WARM_BOOT
94long long init_ddr(uint32_t wrm_bt_flg);
95#else
96long long init_ddr(void);
97#endif
98#endif
99
100/* Board specific weak functions */
101bool board_enable_povdd(void);
102bool board_disable_povdd(void);
103
104void mmap_add_ddr_region_dynamically(void);
105#endif /* IMAGE_BL2 */
106
107typedef struct {
108 uint64_t addr;
109 uint64_t size;
110} region_info_t;
111
112typedef struct {
113 uint64_t num_dram_regions;
114 uint64_t total_dram_size;
115 region_info_t region[NUM_DRAM_REGIONS];
116} dram_regions_info_t;
117
118dram_regions_info_t *get_dram_regions_info(void);
119
120void ls_setup_page_tables(uintptr_t total_base,
121 size_t total_size,
122 uintptr_t code_start,
123 uintptr_t code_limit,
124 uintptr_t rodata_start,
125 uintptr_t rodata_limit
126#if USE_COHERENT_MEM
127 , uintptr_t coh_start,
128 uintptr_t coh_limit
129#endif
130);
131
132
133/* Structure to define SoC personality */
134struct soc_type {
135 char name[10];
136 uint32_t personality;
137 uint32_t num_clusters;
138 uint32_t cores_per_cluster;
139};
140
141#define SOC_ENTRY(n, v, ncl, nc) { \
142 .name = #n, \
143 .personality = SVR_##v, \
144 .num_clusters = (ncl), \
145 .cores_per_cluster = (nc)}
146
147#endif /* PLAT_COMMON_H */