diff options
-rw-r--r-- | include/sbi/sbi_platform.h | 20 | ||||
-rw-r--r-- | lib/sbi/sbi_domain.c | 16 |
2 files changed, 27 insertions, 9 deletions
diff --git a/include/sbi/sbi_platform.h b/include/sbi/sbi_platform.h index 7b8fe89..c252628 100644 --- a/include/sbi/sbi_platform.h +++ b/include/sbi/sbi_platform.h @@ -45,7 +45,7 @@ #include <sbi/sbi_scratch.h> #include <sbi/sbi_version.h> -struct sbi_domain; +struct sbi_domain_memregion; struct sbi_trap_info; struct sbi_trap_regs; @@ -92,6 +92,8 @@ struct sbi_platform_operations { */ int (*misa_get_xlen)(void); + /** Get platform specific root domain memory regions */ + struct sbi_domain_memregion *(*domains_root_regions)(void); /** Initialize (or populate) domains for the platform */ int (*domains_init)(void); @@ -453,6 +455,22 @@ static inline int sbi_platform_misa_xlen(const struct sbi_platform *plat) } /** + * Get platform specific root domain memory regions + * + * @param plat pointer to struct sbi_platform + * + * @return an array of memory regions terminated by a region with order zero + * or NULL for no memory regions + */ +static inline struct sbi_domain_memregion * +sbi_platform_domains_root_regions(const struct sbi_platform *plat) +{ + if (plat && sbi_platform_ops(plat)->domains_root_regions) + return sbi_platform_ops(plat)->domains_root_regions(); + return NULL; +} + +/** * Initialize (or populate) domains for the platform * * @param plat pointer to struct sbi_platform diff --git a/lib/sbi/sbi_domain.c b/lib/sbi/sbi_domain.c index 6d4c608..195c941 100644 --- a/lib/sbi/sbi_domain.c +++ b/lib/sbi/sbi_domain.c @@ -496,6 +496,7 @@ int sbi_domain_finalize(struct sbi_scratch *scratch, u32 cold_hartid) int sbi_domain_init(struct sbi_scratch *scratch, u32 cold_hartid) { u32 i; + struct sbi_domain_memregion *memregs; const struct sbi_platform *plat = sbi_platform_ptr(scratch); /* Root domain firmware memory region */ @@ -514,6 +515,11 @@ int sbi_domain_init(struct sbi_scratch *scratch, u32 cold_hartid) /* Root domain memory region end */ root_memregs[ROOT_END_REGION].order = 0; + /* Use platform specific root memory regions when available */ + memregs = sbi_platform_domains_root_regions(plat); + if (memregs) + root.regions = memregs; + /* Root domain boot HART id is same as coldboot HART id */ root.boot_hartid = cold_hartid; @@ -522,18 +528,12 @@ int sbi_domain_init(struct sbi_scratch *scratch, u32 cold_hartid) root.next_addr = scratch->next_addr; root.next_mode = scratch->next_mode; - /* Select root domain for all valid HARTs */ + /* Root domain possible and assigned HARTs */ for (i = 0; i < SBI_HARTMASK_MAX_BITS; i++) { if (sbi_platform_hart_invalid(plat, i)) continue; sbi_hartmask_set_hart(i, &root_hmask); - hartid_to_domain_table[i] = &root; - sbi_hartmask_set_hart(i, &root.assigned_harts); } - /* Set root domain index */ - root.index = domain_count++; - domidx_to_domain_table[root.index] = &root; - - return 0; + return sbi_domain_register(&root, &root_hmask); } |