44 * @ingroup hal_riscv_mem
55 */
66
7+ #include "hal/include/memory_regions.h"
8+
79#include <libboot/dt/dt.h>
810#include <libcore/buffer.h>
911#include <libcore/error.h>
1012
11- #include "../../hal_internal.h"
12- #include "../../include/memory_regions.h"
13-
14- static fdt_t g_hal_riscv_fdt ;
15- static void * g_hal_riscv_fdt_addr = NULL ;
13+ #include "hal/hal_internal.h"
1614
17- static error_t hal_riscv_read_u32_cells_be (buffer_t buf , size_t offset , u32 cell_count , u64 * out );
15+ static error_t s_get_fdt (const fdt_t * * fdtOUT ) {
16+ static fdt_t hal_riscv_fdt ;
17+ static void * hal_riscv_fdt_addr = NULL ;
1818
19- static error_t hal_riscv_init_fdt (fdt_t * fdtOUT ) {
2019 if (fdtOUT == nullptr )
2120 return ERR_BAD_ARG ;
22-
2321 if (!ihal_is_init ())
2422 return ERR_NOT_INITIALIZED ;
2523
@@ -28,31 +26,18 @@ static error_t hal_riscv_init_fdt(fdt_t* fdtOUT) {
2826 if (err )
2927 return err ;
3028
31- return dt_init (dtb , fdtOUT );
32- }
33-
34- static error_t hal_riscv_get_fdt (const fdt_t * * fdtOUT ) {
35- if (fdtOUT == nullptr )
36- return ERR_BAD_ARG ;
37-
38- void * dtb = nullptr ;
39- error_t err = ihal_get_dtb (& dtb );
40- if (err )
41- return err ;
42-
43- if (g_hal_riscv_fdt_addr != dtb ) {
44- error_t err = hal_riscv_init_fdt (& g_hal_riscv_fdt );
29+ if (hal_riscv_fdt_addr != dtb ) {
30+ err = dt_init (dtb , & hal_riscv_fdt );
4531 if (err )
4632 return err ;
47-
48- g_hal_riscv_fdt_addr = dtb ;
33+ hal_riscv_fdt_addr = dtb ;
4934 }
5035
51- * fdtOUT = & g_hal_riscv_fdt ;
36+ * fdtOUT = & hal_riscv_fdt ;
5237 return ERR_NONE ;
5338}
5439
55- static error_t hal_riscv_node_is_memory (const fdt_t * fdt , dt_node_t node , bool * isMemoryOUT ) {
40+ static error_t s_node_is_memory (const fdt_t * fdt , dt_node_t node , bool * isMemoryOUT ) {
5641 if (fdt == nullptr || isMemoryOUT == nullptr )
5742 return ERR_BAD_ARG ;
5843
@@ -90,7 +75,7 @@ static error_t hal_riscv_node_is_memory(const fdt_t* fdt, dt_node_t node, bool*
9075/// \param node Current node (0 to get first memory node, or previous memory node to get next)
9176/// \param nodeOUT Output parameter for the found memory node
9277/// \return ERR_NONE on success, error code otherwise
93- static error_t hal_riscv_find_next_memory_node (const fdt_t * fdt , dt_node_t node , dt_node_t * nodeOUT ) {
78+ static error_t s_find_next_memory_node (const fdt_t * fdt , dt_node_t node , dt_node_t * nodeOUT ) {
9479 if (fdt == nullptr || nodeOUT == nullptr )
9580 return ERR_BAD_ARG ;
9681
@@ -105,7 +90,7 @@ static error_t hal_riscv_find_next_memory_node(const fdt_t* fdt, dt_node_t node,
10590
10691 while (true) {
10792 bool is_memory ;
108- err = hal_riscv_node_is_memory (fdt , node , & is_memory );
93+ err = s_node_is_memory (fdt , node , & is_memory );
10994 if (err )
11095 return err ;
11196
@@ -120,8 +105,30 @@ static error_t hal_riscv_find_next_memory_node(const fdt_t* fdt, dt_node_t node,
120105 }
121106}
122107
123- static error_t hal_riscv_read_reg_entry (const fdt_t * fdt , dt_node_t node , u32 reg_idx , u32 address_cells ,
124- u32 size_cells , u64 * addrOUT , u64 * sizeOUT ) {
108+ static error_t s_read_u32_cells_be (buffer_t buf , size_t offset , u32 cell_count , u64 * out ) {
109+ if (out == nullptr || cell_count == 0 || cell_count > 2 )
110+ return ERR_BAD_ARG ;
111+
112+ if (buf .size < offset )
113+ return ERR_NOT_VALID ;
114+ if (buf .size - offset < (size_t )cell_count * sizeof (u32 ))
115+ return ERR_NOT_VALID ;
116+
117+ u64 value = 0 ;
118+ for (u32 idx = 0 ; idx < cell_count ; ++ idx ) {
119+ u32 cell = 0 ;
120+ if (!buffer_read_u32_be (buf , offset + (size_t )idx * sizeof (u32 ), & cell ))
121+ return ERR_NOT_VALID ;
122+
123+ value = (value << 32 ) | cell ;
124+ }
125+
126+ * out = value ;
127+ return ERR_NONE ;
128+ }
129+
130+ static error_t s_read_reg_entry (const fdt_t * fdt , dt_node_t node , u32 reg_idx , u32 address_cells , u32 size_cells ,
131+ u64 * addrOUT , u64 * sizeOUT ) {
125132 if (fdt == nullptr || addrOUT == nullptr || sizeOUT == nullptr )
126133 return ERR_BAD_ARG ;
127134
@@ -146,11 +153,11 @@ static error_t hal_riscv_read_reg_entry(const fdt_t* fdt, dt_node_t node, u32 re
146153
147154 u64 addr ;
148155 u64 size ;
149- err = hal_riscv_read_u32_cells_be (reg_buf , entry_offset , address_cells , & addr );
156+ err = s_read_u32_cells_be (reg_buf , entry_offset , address_cells , & addr );
150157 if (err )
151158 return err ;
152159
153- err = hal_riscv_read_u32_cells_be (reg_buf , entry_offset + (size_t )address_cells * sizeof (u32 ), size_cells , & size );
160+ err = s_read_u32_cells_be (reg_buf , entry_offset + (size_t )address_cells * sizeof (u32 ), size_cells , & size );
154161 if (err )
155162 return err ;
156163
@@ -159,44 +166,26 @@ static error_t hal_riscv_read_reg_entry(const fdt_t* fdt, dt_node_t node, u32 re
159166 return ERR_NONE ;
160167}
161168
162- static error_t hal_riscv_read_u32_cells_be (buffer_t buf , size_t offset , u32 cell_count , u64 * out ) {
163- if (out == nullptr || cell_count == 0 || cell_count > 2 )
164- return ERR_BAD_ARG ;
165-
166- if (buf .size < offset )
167- return ERR_NOT_VALID ;
168- if (buf .size - offset < (size_t )cell_count * sizeof (u32 ))
169- return ERR_NOT_VALID ;
170-
171- u64 value = 0 ;
172- for (u32 idx = 0 ; idx < cell_count ; ++ idx ) {
173- u32 cell = 0 ;
174- if (!buffer_read_u32_be (buf , offset + (size_t )idx * sizeof (u32 ), & cell ))
175- return ERR_NOT_VALID ;
176-
177- value = (value << 32 ) | cell ;
178- }
179-
180- * out = value ;
181- return ERR_NONE ;
182- }
183-
184169typedef struct {
185170 u32 memreserve_idx ;
186171 bool is_in_resmem ;
187172 dt_node_t resmem_current_node ;
188173 u32 resmem_address_cells ;
189174 u32 resmem_size_cells ;
190175 u32 resmem_reg_idx ;
191- } riscv_hal_res_mem_iter_t ;
192- static_assert (sizeof (riscv_hal_res_mem_iter_t ) <= sizeof (hal_reserved_memory_iterator_t ));
176+ } internal_res_mem_iter_t ;
177+ static_assert (sizeof (internal_res_mem_iter_t ) <= sizeof (hal_reserved_memory_iterator_t ));
178+
179+ // ==========================================
180+ // Public
181+ // ==========================================
193182
194183error_t hal_get_reserved_regions_iterator (hal_reserved_memory_iterator_t * iterOUT ) {
195184 if (iterOUT == nullptr )
196185 return ERR_BAD_ARG ;
197186
198187 const fdt_t * fdt ;
199- error_t err = hal_riscv_get_fdt (& fdt );
188+ error_t err = s_get_fdt (& fdt );
200189 if (err )
201190 return err ;
202191
@@ -216,15 +205,15 @@ error_t hal_get_reserved_regions_iterator(hal_reserved_memory_iterator_t* iterOU
216205 if (err )
217206 return err ;
218207
219- const riscv_hal_res_mem_iter_t init = {
208+ const internal_res_mem_iter_t init = {
220209 .memreserve_idx = 0 ,
221210 .is_in_resmem = false,
222211 .resmem_current_node = resmem_first_node ,
223212 .resmem_address_cells = address_cells ,
224213 .resmem_size_cells = size_cells ,
225214 .resmem_reg_idx = 0 ,
226215 };
227- * (riscv_hal_res_mem_iter_t * )iterOUT = init ;
216+ * (internal_res_mem_iter_t * )iterOUT = init ;
228217 return ERR_NONE ;
229218}
230219
@@ -233,11 +222,11 @@ error_t hal_get_next_reserved_region(hal_reserved_memory_iterator_t* iter, memor
233222 return ERR_BAD_ARG ;
234223
235224 const fdt_t * fdt ;
236- error_t err = hal_riscv_get_fdt (& fdt );
225+ error_t err = s_get_fdt (& fdt );
237226 if (err )
238227 return err ;
239228
240- riscv_hal_res_mem_iter_t next_iter = * (riscv_hal_res_mem_iter_t * )iter ;
229+ internal_res_mem_iter_t next_iter = * (internal_res_mem_iter_t * )iter ;
241230
242231 if (!next_iter .is_in_resmem ) {
243232 fdt_rsv_entry entry ;
@@ -248,7 +237,7 @@ error_t hal_get_next_reserved_region(hal_reserved_memory_iterator_t* iter, memor
248237 .size = entry .size ,
249238 };
250239 next_iter .memreserve_idx += 1 ;
251- * (riscv_hal_res_mem_iter_t * )iter = next_iter ;
240+ * (internal_res_mem_iter_t * )iter = next_iter ;
252241 * areaOUT = area ;
253242 return ERR_NONE ;
254243 }
@@ -262,8 +251,8 @@ error_t hal_get_next_reserved_region(hal_reserved_memory_iterator_t* iter, memor
262251 while (next_iter .resmem_current_node ) {
263252 u64 addr ;
264253 u64 size ;
265- err = hal_riscv_read_reg_entry (fdt , next_iter .resmem_current_node , next_iter .resmem_reg_idx ,
266- next_iter .resmem_address_cells , next_iter .resmem_size_cells , & addr , & size );
254+ err = s_read_reg_entry (fdt , next_iter .resmem_current_node , next_iter .resmem_reg_idx ,
255+ next_iter .resmem_address_cells , next_iter .resmem_size_cells , & addr , & size );
267256 if (err != ERR_NONE && err != ERR_NOT_FOUND ) {
268257 return err ;
269258 }
@@ -273,7 +262,7 @@ error_t hal_get_next_reserved_region(hal_reserved_memory_iterator_t* iter, memor
273262 .size = size ,
274263 };
275264 next_iter .resmem_reg_idx += 1 ;
276- * (riscv_hal_res_mem_iter_t * )iter = next_iter ;
265+ * (internal_res_mem_iter_t * )iter = next_iter ;
277266 * areaOUT = area ;
278267 return ERR_NONE ;
279268 }
@@ -297,15 +286,15 @@ typedef struct {
297286 u32 reg_idx ;
298287 u32 size_cells ;
299288 u32 address_cells ;
300- } riscv_hal_mem_iter_t ;
301- static_assert (sizeof (riscv_hal_mem_iter_t ) <= sizeof (hal_memory_iterator_t ));
289+ } internal_hal_mem_iter_t ;
290+ static_assert (sizeof (internal_hal_mem_iter_t ) <= sizeof (hal_memory_iterator_t ));
302291
303292error_t hal_get_memory_regions_iterator (hal_memory_iterator_t * iterOUT ) {
304293 if (iterOUT == nullptr )
305294 return ERR_BAD_ARG ;
306295
307296 const fdt_t * fdt ;
308- error_t err = hal_riscv_get_fdt (& fdt );
297+ error_t err = s_get_fdt (& fdt );
309298 if (err )
310299 return err ;
311300
@@ -316,28 +305,28 @@ error_t hal_get_memory_regions_iterator(hal_memory_iterator_t* iterOUT) {
316305 return err ;
317306
318307 dt_node_t first_memory_node ;
319- err = hal_riscv_find_next_memory_node (fdt , 0 , & first_memory_node );
308+ err = s_find_next_memory_node (fdt , 0 , & first_memory_node );
320309 if (err )
321310 return err ;
322311
323- const riscv_hal_mem_iter_t init = {
312+ const internal_hal_mem_iter_t init = {
324313 .node = first_memory_node ,
325314 .reg_idx = 0 ,
326315 .size_cells = size_cells ,
327316 .address_cells = address_cells ,
328317 };
329- * (riscv_hal_mem_iter_t * )iterOUT = init ;
318+ * (internal_hal_mem_iter_t * )iterOUT = init ;
330319 return ERR_NONE ;
331320}
332321
333322error_t hal_get_next_memory_region (hal_memory_iterator_t * iter , physical_memory_region_t * areaOUT ) {
334323 if (iter == nullptr || areaOUT == nullptr )
335324 return ERR_BAD_ARG ;
336325
337- riscv_hal_mem_iter_t next_iter = * (riscv_hal_mem_iter_t * )iter ;
326+ internal_hal_mem_iter_t next_iter = * (internal_hal_mem_iter_t * )iter ;
338327
339328 const fdt_t * fdt ;
340- error_t err = hal_riscv_get_fdt (& fdt );
329+ error_t err = s_get_fdt (& fdt );
341330 if (err )
342331 return err ;
343332
@@ -347,7 +336,7 @@ error_t hal_get_next_memory_region(hal_memory_iterator_t* iter, physical_memory_
347336 while (next_iter .node != 0 ) {
348337 u64 addr ;
349338 u64 size ;
350- err = hal_riscv_read_reg_entry (fdt , next_iter .node , next_iter .reg_idx , address_cells , size_cells , & addr , & size );
339+ err = s_read_reg_entry (fdt , next_iter .node , next_iter .reg_idx , address_cells , size_cells , & addr , & size );
351340 if (err != ERR_NONE && err != ERR_NOT_FOUND ) {
352341 return err ;
353342 }
@@ -357,13 +346,13 @@ error_t hal_get_next_memory_region(hal_memory_iterator_t* iter, physical_memory_
357346 .size = size ,
358347 };
359348 next_iter .reg_idx += 1 ;
360- * (riscv_hal_mem_iter_t * )iter = next_iter ;
349+ * (internal_hal_mem_iter_t * )iter = next_iter ;
361350 * areaOUT = area ;
362351 return ERR_NONE ;
363352 }
364353
365354 dt_node_t next_memory_node ;
366- err = hal_riscv_find_next_memory_node (fdt , next_iter .node , & next_memory_node );
355+ err = s_find_next_memory_node (fdt , next_iter .node , & next_memory_node );
367356 if (err == ERR_NONE ) {
368357 next_iter .node = next_memory_node ;
369358 next_iter .reg_idx = 0 ;
0 commit comments