1414#include <fences.h>
1515#include <config.h>
1616
17- extern uint8_t _image_start , _image_load_end , _image_end , _vm_image_start , _vm_image_end ;
17+ extern uint8_t _image_start , _image_load_end , _image_end , _vm_image_start , _vm_image_end ,
18+ _data_vma_start ;
1819
1920struct list page_pool_list ;
2021
@@ -45,6 +46,15 @@ static bool pp_bitmap_alloc(size_t pool_num_pages, bitmap_t** bitmap)
4546 return allocated ;
4647}
4748
49+ static size_t calc_root_mem_size (void )
50+ {
51+ if (DEFINED (MEM_NON_UNIFIED )) {
52+ return (size_t )(& _image_end - & _data_vma_start );
53+ } else {
54+ return (size_t )(& _image_end - & _image_start );
55+ }
56+ }
57+
4858bool pp_alloc (struct page_pool * pool , size_t num_pages , bool aligned , struct ppages * ppages )
4959{
5060 ppages -> colors = 0 ;
@@ -176,27 +186,75 @@ static bool root_pool_set_up_bitmap(struct page_pool* root_pool)
176186}
177187
178188static bool pp_root_reserve_hyp_image_load (struct page_pool * root_pool )
189+ {
190+ size_t image_load_size = (size_t )(& _image_load_end - & _image_start );
191+
192+ struct ppages images_load_ppages = mem_ppages_get (img_addr , NUM_PAGES (image_load_size ));
193+
194+ return mem_reserve_ppool_ppages (root_pool , & images_load_ppages );
195+ }
196+
197+ static bool pp_root_reserve_hyp_image_noload (struct page_pool * root_pool )
179198{
180199 size_t image_load_size = (size_t )(& _image_load_end - & _image_start );
181200 size_t image_noload_size = (size_t )(& _image_end - & _image_load_end );
182201 size_t vm_image_size = (size_t )(& _vm_image_end - & _vm_image_start );
183- size_t cpu_size = platform .cpu_num * mem_cpu_boot_alloc_size ();
184- paddr_t image_noload_addr = load_addr + image_load_size + vm_image_size ;
185- paddr_t cpu_base_addr = image_noload_addr + image_noload_size ;
202+ paddr_t image_noload_addr = img_addr + image_load_size + vm_image_size ;
186203
187- struct ppages images_load_ppages = mem_ppages_get (load_addr , NUM_PAGES (image_load_size ));
188204 struct ppages images_noload_ppages =
189205 mem_ppages_get (image_noload_addr , NUM_PAGES (image_noload_size ));
206+
207+ return mem_reserve_ppool_ppages (root_pool , & images_noload_ppages );
208+ }
209+
210+ static bool pp_root_reserve_cpus (struct page_pool * root_pool )
211+ {
212+ size_t cpu_size = platform .cpu_num * mem_cpu_boot_alloc_size ();
213+ paddr_t cpu_base_addr ;
214+
215+ if (DEFINED (MEM_NON_UNIFIED )) {
216+ size_t data_size = (size_t )(& _image_end - & _data_vma_start );
217+ cpu_base_addr = (paddr_t )& _data_vma_start + data_size ;
218+ } else {
219+ size_t image_load_size = (size_t )(& _image_load_end - & _image_start );
220+ size_t image_noload_size = (size_t )(& _image_end - & _image_load_end );
221+ size_t vm_image_size = (size_t )(& _vm_image_end - & _vm_image_start );
222+
223+ paddr_t image_noload_addr = img_addr + image_load_size + vm_image_size ;
224+ cpu_base_addr = image_noload_addr + image_noload_size ;
225+ }
226+
190227 struct ppages cpu_ppages = mem_ppages_get (cpu_base_addr , NUM_PAGES (cpu_size ));
191228
192- bool image_load_reserved = mem_reserve_ppool_ppages (root_pool , & images_load_ppages );
193- bool image_noload_reserved = mem_reserve_ppool_ppages (root_pool , & images_noload_ppages );
194- bool cpu_reserved = mem_reserve_ppool_ppages (root_pool , & cpu_ppages );
229+ return mem_reserve_ppool_ppages (root_pool , & cpu_ppages );
230+ }
231+
232+ static bool pp_root_reserve_hyp_data (struct page_pool * root_pool )
233+ {
234+ size_t data_size = (size_t )(& _image_end - & _data_vma_start );
235+ paddr_t data_base_addr = (paddr_t )& _data_vma_start ;
236+
237+ struct ppages data_ppages = mem_ppages_get (data_base_addr , NUM_PAGES (data_size ));
195238
196- return image_load_reserved && image_noload_reserved && cpu_reserved ;
239+ return mem_reserve_ppool_ppages ( root_pool , & data_ppages ) ;
197240}
198241
199242static bool pp_root_reserve_hyp_mem (struct page_pool * root_pool )
243+ {
244+ if (DEFINED (MEM_NON_UNIFIED )) {
245+ bool hyp_data_mem = pp_root_reserve_hyp_data (root_pool );
246+ bool cpus_mem = pp_root_reserve_cpus (root_pool );
247+ return hyp_data_mem && cpus_mem ;
248+
249+ } else {
250+ bool hyp_image_load_mem = pp_root_reserve_hyp_image_load (root_pool );
251+ bool hyp_image_noload_mem = pp_root_reserve_hyp_image_noload (root_pool );
252+ bool cpus_mem = pp_root_reserve_cpus (root_pool );
253+ return hyp_image_load_mem && hyp_image_noload_mem && cpus_mem ;
254+ }
255+ }
256+
257+ static bool pp_root_init (struct mem_region * root_region )
200258{
201259 struct page_pool * root_pool = & root_region -> page_pool ;
202260 root_pool -> base = ALIGN (root_region -> base , PAGE_SIZE );
@@ -262,6 +320,12 @@ static bool mem_reserve_physical_memory(struct page_pool* pool)
262320 return false;
263321 }
264322
323+ if (DEFINED (MEM_NON_UNIFIED )) {
324+ if (!pp_root_reserve_hyp_image_load (pool )) {
325+ return false;
326+ }
327+ }
328+
265329 for (size_t i = 0 ; i < config .vmlist_size ; i ++ ) {
266330 struct vm_config * vm_cfg = & config .vmlist [i ];
267331 size_t n_pg = NUM_PAGES (vm_cfg -> image .size );
@@ -335,13 +399,21 @@ static bool mem_create_ppools(struct mem_region* root_mem_region)
335399
336400static struct mem_region * mem_find_root_region (void )
337401{
338- size_t image_size = ( size_t )( & _image_end - & _image_start );
402+ size_t root_mem_size = calc_root_mem_size ( );
339403
340- /* Find the root memory region in which the hypervisor was loaded. */
404+ /* Find the root memory region */
341405 struct mem_region * root_mem_region = NULL ;
342406 for (size_t i = 0 ; i < platform .region_num ; i ++ ) {
343407 struct mem_region * region = & (platform .regions [i ]);
344- bool is_in_rgn = range_in_range (load_addr , image_size , region -> base , region -> size );
408+ bool is_in_rgn ;
409+ vaddr_t root_base_addr ;
410+ if (DEFINED (MEM_NON_UNIFIED )) {
411+ root_base_addr = data_addr ;
412+ } else {
413+ root_base_addr = img_addr ;
414+ }
415+ is_in_rgn = range_in_range (root_base_addr , root_mem_size , region -> base , region -> size );
416+
345417 if (is_in_rgn ) {
346418 root_mem_region = region ;
347419 break ;
@@ -353,7 +425,7 @@ static struct mem_region* mem_find_root_region(void)
353425
354426static bool mem_setup_root_pool (struct mem_region * * root_mem_region )
355427{
356- * root_mem_region = mem_find_root_region (load_addr );
428+ * root_mem_region = mem_find_root_region ();
357429 if (* root_mem_region == NULL ) {
358430 return false;
359431 }
0 commit comments