From dcdaf3027489cadd513767eda6dcaa0c1ecd2d29 Mon Sep 17 00:00:00 2001 From: Yu Chien Peter Lin Date: Fri, 14 Oct 2022 08:32:42 +0800 Subject: lib: sbi: Add sbi_domain_root_add_memrange() API This patch generalizes the logic to add a memory range with desired alignment and flags of consecutive regions to the root domain. Signed-off-by: Yu Chien Peter Lin Reviewed-by: Anup Patel --- lib/utils/timer/aclint_mtimer.c | 50 ++++++++++++----------------------------- 1 file changed, 14 insertions(+), 36 deletions(-) (limited to 'lib/utils/timer') diff --git a/lib/utils/timer/aclint_mtimer.c b/lib/utils/timer/aclint_mtimer.c index a957b1ca..3f00c218 100644 --- a/lib/utils/timer/aclint_mtimer.c +++ b/lib/utils/timer/aclint_mtimer.c @@ -142,34 +142,6 @@ int aclint_mtimer_warm_init(void) return 0; } -static int aclint_mtimer_add_regions(unsigned long addr, unsigned long size) -{ -#define MTIMER_ADD_REGION_ALIGN 0x1000 - int rc; - unsigned long pos, end, rsize; - struct sbi_domain_memregion reg; - - pos = addr; - end = addr + size; - while (pos < end) { - rsize = pos & (MTIMER_ADD_REGION_ALIGN - 1); - if (rsize) - rsize = 1UL << sbi_ffs(pos); - else - rsize = ((end - pos) < MTIMER_ADD_REGION_ALIGN) ? - (end - pos) : MTIMER_ADD_REGION_ALIGN; - - sbi_domain_memregion_init(pos, rsize, - SBI_DOMAIN_MEMREGION_MMIO, ®); - rc = sbi_domain_root_add_memregion(®); - if (rc) - return rc; - pos += rsize; - } - - return 0; -} - int aclint_mtimer_cold_init(struct aclint_mtimer_data *mt, struct aclint_mtimer_data *reference) { @@ -208,23 +180,29 @@ int aclint_mtimer_cold_init(struct aclint_mtimer_data *mt, /* Add MTIMER regions to the root domain */ if (mt->mtime_addr == (mt->mtimecmp_addr + mt->mtimecmp_size)) { - rc = aclint_mtimer_add_regions(mt->mtimecmp_addr, - mt->mtime_size + mt->mtimecmp_size); + rc = sbi_domain_root_add_memrange(mt->mtimecmp_addr, + mt->mtime_size + mt->mtimecmp_size, + MTIMER_REGION_ALIGN, + SBI_DOMAIN_MEMREGION_MMIO); if (rc) return rc; } else if (mt->mtimecmp_addr == (mt->mtime_addr + mt->mtime_size)) { - rc = aclint_mtimer_add_regions(mt->mtime_addr, - mt->mtime_size + mt->mtimecmp_size); + rc = sbi_domain_root_add_memrange(mt->mtime_addr, + mt->mtime_size + mt->mtimecmp_size, + MTIMER_REGION_ALIGN, + SBI_DOMAIN_MEMREGION_MMIO); if (rc) return rc; } else { - rc = aclint_mtimer_add_regions(mt->mtime_addr, - mt->mtime_size); + rc = sbi_domain_root_add_memrange(mt->mtime_addr, + mt->mtime_size, MTIMER_REGION_ALIGN, + SBI_DOMAIN_MEMREGION_MMIO); if (rc) return rc; - rc = aclint_mtimer_add_regions(mt->mtimecmp_addr, - mt->mtimecmp_size); + rc = sbi_domain_root_add_memrange(mt->mtimecmp_addr, + mt->mtimecmp_size, MTIMER_REGION_ALIGN, + SBI_DOMAIN_MEMREGION_MMIO); if (rc) return rc; } -- cgit v1.3.1