1 /*
2  * Copyright (c) 2023-2024, Arm Limited. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 
8 #ifndef __NI_TOWER_APU_DRV_H__
9 #define __NI_TOWER_APU_DRV_H__
10 
11 #include "ni_tower_drv.h"
12 
13 #include <stdint.h>
14 
15 /* Number of possible apu entities in NI-Tower */
16 #define NI_TOWER_APU_NUM_ENTITIES 4
17 
18 /**
19  * \brief NI-Tower APU background type enumerations
20  */
21 enum ni_tower_apu_br_type {
22     NI_T_FOREGROUND = 0x0,
23     NI_T_BACKGROUND = 0x1
24 };
25 
26 /**
27  * \brief NI-Tower APU access permission type enumerations
28  */
29 enum ni_tower_apu_access_perm_type {
30     /* As per spec */
31     NI_T_N_SEC_W = 0b00000001,
32     NI_T_SEC_W   = 0b00000010,
33     NI_T_N_SEC_R = 0b00000100,
34     NI_T_SEC_R   = 0b00001000,
35     NI_T_REALM_W = 0b00010000,
36     NI_T_ROOT_W  = 0b00100000,
37     NI_T_REALM_R = 0b01000000,
38     NI_T_ROOT_R  = 0b10000000,
39 
40     NI_T_N_SEC_RW = NI_T_N_SEC_R | NI_T_N_SEC_W,
41     NI_T_SEC_RW   = NI_T_SEC_R | NI_T_SEC_W,
42     NI_T_REALM_RW = NI_T_REALM_R | NI_T_REALM_W,
43     NI_T_ROOT_RW  = NI_T_ROOT_R | NI_T_ROOT_W,
44 
45     NI_T_ALL_PERM = NI_T_N_SEC_RW | NI_T_SEC_RW | NI_T_REALM_RW | NI_T_ROOT_RW
46 };
47 
48 /**
49  * \brief NI-Tower APU entity selection type enumerations
50  */
51 enum ni_tower_apu_entity_type {
52     NI_T_ID_0_SELECT = 0b0001,
53     NI_T_ID_1_SELECT = 0b0010,
54     NI_T_ID_2_SELECT = 0b0100,
55     NI_T_ID_3_SELECT = 0b1000,
56 };
57 
58 /**
59  * \brief NI-Tower APU entity valid type enumerations
60  */
61 enum ni_tower_apu_entity_valid_type {
62     NI_T_ID_VALID_NONE = 0x0,
63 
64     NI_T_ID_0_VALID = 0b0001,
65     NI_T_ID_1_VALID = 0b0010,
66     NI_T_ID_2_VALID = 0b0100,
67     NI_T_ID_3_VALID = 0b1000,
68 
69     NI_T_ID_VALID_ALL = NI_T_ID_0_VALID | NI_T_ID_1_VALID | NI_T_ID_2_VALID |
70                         NI_T_ID_3_VALID,
71 };
72 
73 /**
74  * \brief NI-Tower APU lock type enumerations
75  */
76 enum ni_tower_apu_lock_type {
77     NI_T_UNLOCK = 0x0,
78     NI_T_LOCK = 0x1,
79 };
80 
81 /**
82  * \brief NI-Tower APU region enable type enumerations
83  */
84 enum ni_tower_apu_region_enable_type {
85     NI_T_REGION_DISABLE = 0x0,
86     NI_T_REGION_ENABLE = 0x1,
87 };
88 
89 /**
90  * \brief NI-Tower APU region configuration info structure
91  */
92 struct ni_tower_apu_reg_cfg_info {
93     /* Base address of the region */
94     uint64_t base_addr;
95     /* End address of the region */
96     uint64_t end_addr;
97     /* Whether the region is background or a foreground region*/
98     enum ni_tower_apu_br_type background;
99     /* Array of access permissions for all entities */
100     enum ni_tower_apu_access_perm_type permissions[NI_TOWER_APU_NUM_ENTITIES];
101     /* Array of entity ids */
102     uint8_t entity_ids[NI_TOWER_APU_NUM_ENTITIES];
103     /* Value for id_valid */
104     enum ni_tower_apu_entity_valid_type id_valid;
105     /* Whether the region should be enabled or not */
106     enum ni_tower_apu_region_enable_type region_enable;
107     /* Whether the region should be locked or not */
108     enum ni_tower_apu_lock_type lock;
109 };
110 
111 /**
112  * \brief NI-Tower APU device structure
113  */
114 struct ni_tower_apu_dev {
115     uintptr_t base;
116     /* Offset to be added to the memory map base and end addresses */
117     uint64_t region_mapping_offset;
118 };
119 
120 /**
121  * \brief Initialize and return APU device
122  *
123  * \param[in]  ni_tower_dev          NI-Tower device struct \ref ni_tower_dev.
124  * \param[in]  component             NI-Tower component node struct \ref
125  *                                   ni_tower_component_node.
126  * \param[in]  region_mapping_offset Offset which will added to the memory map
127  *                                   base and end addresses.
128  * \param[out] dev                   NI-Tower APU device struct \ref
129  *                                   ni_tower_apu_dev.
130  *
131  * \return Returns error code as specified in \ref ni_tower_err
132  */
133 enum ni_tower_err ni_tower_apu_dev_init(
134     const struct ni_tower_dev *ni_tower_dev,
135     const struct ni_tower_component_node* component,
136     const uint64_t region_mapping_offset,
137     struct ni_tower_apu_dev *dev);
138 
139 /**
140  * \brief Configure NI-Tower APU
141  *
142  * \param[in] dev           NI-Tower APU device struct \ref ni_tower_apu_dev.
143  * \param[in] cfg_info      Configuration info of a region to be configured
144  *                          struct \ref ni_tower_apu_reg_cfg_info.
145  * \param[in] region        Region number to be configured.
146  *
147  * \return Returns error code as specified in \ref ni_tower_err
148  */
149 enum ni_tower_err ni_tower_apu_configure_region(
150     const struct ni_tower_apu_dev *dev,
151     const struct ni_tower_apu_reg_cfg_info *cfg_info,
152     const uint32_t region);
153 
154 /**
155  * \brief Get the next available region number and configure NI-Tower APU
156  *        region
157  *
158  * \param[in] dev           NI-Tower APU device struct \ref ni_tower_apu_dev.
159  * \param[in] cfg_info      Configuration info of the region to be configured
160  *                          struct \ref ni_tower_apu_reg_cfg_info.
161  *
162  * \return Returns error code as specified in \ref ni_tower_err
163  */
164 enum ni_tower_err ni_tower_apu_configure_next_available_region(
165     const struct ni_tower_apu_dev *dev,
166     const struct ni_tower_apu_reg_cfg_info *cfg_info);
167 
168 /**
169  * \brief Enables NI-Tower APU
170  *
171  * \param[in] dev           NI-Tower APU device struct \ref ni_tower_apu_dev.
172  *
173  * \return Returns error code as specified in \ref ni_tower_err
174  */
175 enum ni_tower_err ni_tower_apu_enable(const struct ni_tower_apu_dev *dev);
176 
177 /**
178  * \brief Enables NI-Tower APU SLVERR response.
179  *
180  * \param[in] dev           NI-Tower APU device struct \ref ni_tower_apu_dev.
181  *
182  * \return Returns error code as specified in \ref ni_tower_err
183  */
184 enum ni_tower_err ni_tower_apu_sync_err_enable(
185     const struct ni_tower_apu_dev *dev);
186 
187 #endif /* __NI_TOWER_APU_DRV_H__ */
188