*/
int (*misa_get_xlen)(void);
- /** Get number of PMP regions for given HART */
- u32 (*pmp_region_count)(u32 hartid);
- /**
- * Get PMP regions details (namely: protection, base address,
- * and size) for given HART
- */
- int (*pmp_region_info)(u32 hartid, u32 index, ulong *prot, ulong *addr,
- ulong *log2size);
-
/** Write a character to the platform console output */
void (*console_putc)(char ch);
/** Read a character from the platform console input */
}
/**
- * Get the number of PMP regions of a HART
- *
- * @param plat pointer to struct sbi_platform
- * @param hartid HART ID
- *
- * @return number of PMP regions
- */
-static inline u32 sbi_platform_pmp_region_count(const struct sbi_platform *plat,
- u32 hartid)
-{
- if (plat && sbi_platform_ops(plat)->pmp_region_count)
- return sbi_platform_ops(plat)->pmp_region_count(hartid);
- return 0;
-}
-
-/**
- * Get PMP regions details (namely: protection, base address,
- * and size) of a HART
- *
- * @param plat pointer to struct sbi_platform
- * @param hartid HART ID
- * @param index index of PMP region for which we want details
- * @param prot output pointer for PMP region protection
- * @param addr output pointer for PMP region base address
- * @param log2size output pointer for log-of-2 PMP region size
- *
- * @return 0 on success and negative error code on failure
- */
-static inline int sbi_platform_pmp_region_info(const struct sbi_platform *plat,
- u32 hartid, u32 index,
- ulong *prot, ulong *addr,
- ulong *log2size)
-{
- if (plat && sbi_platform_ops(plat)->pmp_region_info)
- return sbi_platform_ops(plat)->pmp_region_info(hartid, index,
- prot, addr,
- log2size);
- return 0;
-}
-
-/**
* Write a character to the platform console output
*
* @param plat pointer to struct sbi_platform
static int pmp_init(struct sbi_scratch *scratch, u32 hartid)
{
- u32 i, pmp_idx = 0, pmp_count, count;
+ u32 pmp_idx = 0;
unsigned long fw_start, fw_size_log2;
- ulong prot, addr, log2size;
- const struct sbi_platform *plat = sbi_platform_ptr(scratch);
if (!sbi_hart_pmp_count(scratch))
return 0;
fw_start = scratch->fw_start & ~((1UL << fw_size_log2) - 1UL);
pmp_set(pmp_idx++, 0, fw_start, fw_size_log2);
- /* Platform specific PMP regions */
- count = sbi_platform_pmp_region_count(plat, hartid);
- pmp_count = sbi_hart_pmp_count(scratch);
- for (i = 0; i < count && pmp_idx < (pmp_count - 1); i++) {
- if (sbi_platform_pmp_region_info(plat, hartid, i, &prot, &addr,
- &log2size))
- continue;
- pmp_set(pmp_idx++, prot, addr, log2size);
- }
-
/*
* Default PMP region for allowing S-mode and U-mode access to
* memory not covered by: