|
12 | 12 |
|
13 | 13 | #include "mm_drv_intel_adsp.h"
|
14 | 14 |
|
| 15 | + |
| 16 | +/* virtual memory regions table, last item is an end marker */ |
15 | 17 | struct sys_mm_drv_region
|
16 |
| -virtual_memory_regions[CONFIG_MP_MAX_NUM_CPUS + VIRTUAL_REGION_COUNT] = { {0} }; |
| 18 | +virtual_memory_regions[CONFIG_MM_DRV_INTEL_VIRTUAL_REGION_COUNT+1] = { {0} }; |
17 | 19 |
|
18 | 20 | const struct sys_mm_drv_region *sys_mm_drv_query_memory_regions(void)
|
19 | 21 | {
|
20 | 22 | return (const struct sys_mm_drv_region *) virtual_memory_regions;
|
21 | 23 | }
|
22 | 24 |
|
23 |
| -static inline void append_region(void *address, uint32_t mem_size, |
24 |
| - uint32_t attributes, uint32_t position, uint32_t *total_size) |
| 25 | +int adsp_add_virtual_memory_region(uintptr_t region_address, uint32_t region_size, uint32_t attr) |
25 | 26 | {
|
26 |
| - virtual_memory_regions[position].addr = address; |
27 |
| - virtual_memory_regions[position].size = mem_size; |
28 |
| - virtual_memory_regions[position].attr = attributes; |
29 |
| - total_size += mem_size; |
30 |
| -} |
| 27 | + struct sys_mm_drv_region *region; |
| 28 | + uint32_t pos = 0; |
| 29 | + uintptr_t new_region_end = region_address + region_size; |
31 | 30 |
|
32 |
| -int calculate_memory_regions(uintptr_t static_alloc_end_ptr) |
33 |
| -{ |
34 |
| - int i, total_size = 0; |
35 |
| - |
36 |
| - for (i = 0; i < CONFIG_MP_MAX_NUM_CPUS; i++) { |
37 |
| - append_region((void *)(static_alloc_end_ptr + i * CORE_HEAP_SIZE), |
38 |
| - CORE_HEAP_SIZE, MEM_REG_ATTR_CORE_HEAP, i, &total_size); |
| 31 | + /* check if the region fits to virtual memory */ |
| 32 | + if (region_address < L2_VIRTUAL_SRAM_BASE || |
| 33 | + new_region_end > L2_VIRTUAL_SRAM_BASE + L2_VIRTUAL_SRAM_SIZE) { |
| 34 | + return -EINVAL; |
39 | 35 | }
|
40 | 36 |
|
41 |
| - append_region((void *)((uintptr_t)virtual_memory_regions[i - 1].addr + |
42 |
| - virtual_memory_regions[i - 1].size), |
43 |
| - CORE_HEAP_SIZE, MEM_REG_ATTR_SHARED_HEAP, i, &total_size); |
44 |
| - i++; |
45 |
| - append_region((void *)((uintptr_t)virtual_memory_regions[i - 1].addr + |
46 |
| - virtual_memory_regions[i - 1].size), |
47 |
| - OPPORTUNISTIC_REGION_SIZE, MEM_REG_ATTR_OPPORTUNISTIC_MEMORY, i, &total_size); |
48 |
| - i++; |
49 |
| - /* Apending last region as 0 so iterators know where table is over |
50 |
| - * check is for size = 0; |
51 |
| - */ |
52 |
| - append_region(NULL, 0, 0, i, &total_size); |
53 |
| - |
54 |
| - if (total_size > L2_VIRTUAL_SRAM_SIZE) { |
55 |
| - return -EINVAL; |
| 37 | + /* find an empty slot, verify if the region is not overlapping */ |
| 38 | + SYS_MM_DRV_MEMORY_REGION_FOREACH(virtual_memory_regions, region) { |
| 39 | + uintptr_t region_start = (uintptr_t)region->addr; |
| 40 | + uintptr_t region_end = region_start + region->size; |
| 41 | + |
| 42 | + /* check region overlapping */ |
| 43 | + if (region_address < region_end && new_region_end > region_start) |
| 44 | + return -EINVAL; |
| 45 | + pos++; |
56 | 46 | }
|
57 | 47 |
|
| 48 | + /* SYS_MM_DRV_MEMORY_REGION_FOREACH exits when an empty slot is found */ |
| 49 | + if (pos == CONFIG_MM_DRV_INTEL_VIRTUAL_REGION_COUNT) |
| 50 | + /* no more free slots */ |
| 51 | + return -ENOMEM; |
| 52 | + |
| 53 | + /* add new region */ |
| 54 | + virtual_memory_regions[pos].addr = (void*)region_address; |
| 55 | + virtual_memory_regions[pos].size = region_size; |
| 56 | + virtual_memory_regions[pos].attr = attr; |
| 57 | + |
58 | 58 | return 0;
|
59 | 59 | }
|
0 commit comments