forked from Mirrors/opensbi
lib: sbi: Update pmp_get() to return decoded size directly
Currently pmp_get() returns the log2 length of the PMP memory region size. The caller has to calculate the size based on that and the same codes are duplicated. Update this function to return decoded size directly. Signed-off-by: Bin Meng <bmeng.cn@gmail.com> Reviewed-by: Atish Patra <atish.patra@wdc.com>
This commit is contained in:
@@ -191,7 +191,7 @@ int pmp_set(unsigned int n, unsigned long prot, unsigned long addr,
|
|||||||
unsigned long log2len);
|
unsigned long log2len);
|
||||||
|
|
||||||
int pmp_get(unsigned int n, unsigned long *prot_out, unsigned long *addr_out,
|
int pmp_get(unsigned int n, unsigned long *prot_out, unsigned long *addr_out,
|
||||||
unsigned long *log2len_out);
|
unsigned long *size);
|
||||||
|
|
||||||
#endif /* !__ASSEMBLY__ */
|
#endif /* !__ASSEMBLY__ */
|
||||||
|
|
||||||
|
@@ -249,16 +249,16 @@ int pmp_set(unsigned int n, unsigned long prot, unsigned long addr,
|
|||||||
}
|
}
|
||||||
|
|
||||||
int pmp_get(unsigned int n, unsigned long *prot_out, unsigned long *addr_out,
|
int pmp_get(unsigned int n, unsigned long *prot_out, unsigned long *addr_out,
|
||||||
unsigned long *log2len_out)
|
unsigned long *size)
|
||||||
{
|
{
|
||||||
int pmpcfg_csr, pmpcfg_shift, pmpaddr_csr;
|
int pmpcfg_csr, pmpcfg_shift, pmpaddr_csr;
|
||||||
unsigned long cfgmask, pmpcfg, prot;
|
unsigned long cfgmask, pmpcfg, prot;
|
||||||
unsigned long t1, addr, log2len;
|
unsigned long t1, addr, log2len;
|
||||||
|
|
||||||
/* check parameters */
|
/* check parameters */
|
||||||
if (n >= PMP_COUNT || !prot_out || !addr_out || !log2len_out)
|
if (n >= PMP_COUNT || !prot_out || !addr_out || !size)
|
||||||
return SBI_EINVAL;
|
return SBI_EINVAL;
|
||||||
*prot_out = *addr_out = *log2len_out = 0;
|
*prot_out = *addr_out = *size = 0;
|
||||||
|
|
||||||
/* calculate PMP register and offset */
|
/* calculate PMP register and offset */
|
||||||
#if __riscv_xlen == 32
|
#if __riscv_xlen == 32
|
||||||
@@ -299,7 +299,9 @@ int pmp_get(unsigned int n, unsigned long *prot_out, unsigned long *addr_out,
|
|||||||
/* return details */
|
/* return details */
|
||||||
*prot_out = prot;
|
*prot_out = prot;
|
||||||
*addr_out = addr;
|
*addr_out = addr;
|
||||||
*log2len_out = log2len;
|
|
||||||
|
if (log2len < __riscv_xlen)
|
||||||
|
*size = (1UL << log2len);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@@ -125,20 +125,16 @@ unsigned long log2roundup(unsigned long x)
|
|||||||
void sbi_hart_pmp_dump(struct sbi_scratch *scratch)
|
void sbi_hart_pmp_dump(struct sbi_scratch *scratch)
|
||||||
{
|
{
|
||||||
const struct sbi_platform *plat = sbi_platform_ptr(scratch);
|
const struct sbi_platform *plat = sbi_platform_ptr(scratch);
|
||||||
unsigned long prot, addr, size, l2l;
|
unsigned long prot, addr, size;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
if (!sbi_platform_has_pmp(plat))
|
if (!sbi_platform_has_pmp(plat))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (i = 0; i < PMP_COUNT; i++) {
|
for (i = 0; i < PMP_COUNT; i++) {
|
||||||
pmp_get(i, &prot, &addr, &l2l);
|
pmp_get(i, &prot, &addr, &size);
|
||||||
if (!(prot & PMP_A))
|
if (!(prot & PMP_A))
|
||||||
continue;
|
continue;
|
||||||
if (l2l < __riscv_xlen)
|
|
||||||
size = (1UL << l2l);
|
|
||||||
else
|
|
||||||
size = 0;
|
|
||||||
#if __riscv_xlen == 32
|
#if __riscv_xlen == 32
|
||||||
sbi_printf("PMP%d : 0x%08lx-0x%08lx (A",
|
sbi_printf("PMP%d : 0x%08lx-0x%08lx (A",
|
||||||
#else
|
#else
|
||||||
@@ -160,20 +156,16 @@ void sbi_hart_pmp_dump(struct sbi_scratch *scratch)
|
|||||||
int sbi_hart_pmp_check_addr(struct sbi_scratch *scratch, unsigned long addr,
|
int sbi_hart_pmp_check_addr(struct sbi_scratch *scratch, unsigned long addr,
|
||||||
unsigned long attr)
|
unsigned long attr)
|
||||||
{
|
{
|
||||||
unsigned long prot, size, l2l, i, tempaddr;
|
unsigned long prot, size, i, tempaddr;
|
||||||
const struct sbi_platform *plat = sbi_platform_ptr(scratch);
|
const struct sbi_platform *plat = sbi_platform_ptr(scratch);
|
||||||
|
|
||||||
if (!sbi_platform_has_pmp(plat))
|
if (!sbi_platform_has_pmp(plat))
|
||||||
return SBI_OK;
|
return SBI_OK;
|
||||||
|
|
||||||
for (i = 0; i < PMP_COUNT; i++) {
|
for (i = 0; i < PMP_COUNT; i++) {
|
||||||
pmp_get(i, &prot, &tempaddr, &l2l);
|
pmp_get(i, &prot, &tempaddr, &size);
|
||||||
if (!(prot & PMP_A))
|
if (!(prot & PMP_A))
|
||||||
continue;
|
continue;
|
||||||
if (l2l < __riscv_xlen)
|
|
||||||
size = (1UL << l2l);
|
|
||||||
else
|
|
||||||
size = 0;
|
|
||||||
if (tempaddr <= addr && addr <= tempaddr + size)
|
if (tempaddr <= addr && addr <= tempaddr + size)
|
||||||
if (!(prot & attr))
|
if (!(prot & attr))
|
||||||
return SBI_INVALID_ADDR;
|
return SBI_INVALID_ADDR;
|
||||||
|
Reference in New Issue
Block a user