1 #ifndef _RV_PMP_H_ 2 #define _RV_PMP_H_ 3 4 #include "stdint.h" 5 6 #define RV_PMP_ENTRY (8) 7 8 #define ENTRY_FLAG_PERM_R (1 << 0) 9 #define ENTRY_FLAG_PERM_W (1 << 1) 10 #define ENTRY_FLAG_PERM_X (1 << 2) 11 #define ENTRY_FLAG_ADDR_OFF (0 << 3) 12 #define ENTRY_FLAG_ADDR_TOR (1 << 3) 13 #define ENTRY_FLAG_ADDR_NAPOT (3 << 3) 14 #define ENTRY_FLAG_ADDR_MASK (3 << 3) 15 #define ENTRY_FLAG_M_MODE_L (1 << 7) 16 17 #define ENTRY_FLAG_SIZE (8) 18 #define ENTRY_FLAG_MASK (0xFF) 19 20 #define ENTRY_IN_CFG_REG (__riscv_xlen / ENTRY_FLAG_SIZE) 21 22 /* E907: the smallest granularity is 128B */ 23 /* C906: the smallest granularity is 4K */ 24 #define PMP_REG_SZ_128B (1 << 7) 25 #define PMP_REG_SZ_256B (1 << 8) 26 #define PMP_REG_SZ_512B (1 << 9) 27 #define PMP_REG_SZ_1K (1 << 10) 28 #define PMP_REG_SZ_2K (1 << 11) 29 #define PMP_REG_SZ_4K (1 << 12) 30 #define PMP_REG_SZ_8K (1 << 13) 31 #define PMP_REG_SZ_16K (1 << 14) 32 #define PMP_REG_SZ_32K (1 << 15) 33 #define PMP_REG_SZ_64K (1 << 16) 34 #define PMP_REG_SZ_128K (1 << 17) 35 #define PMP_REG_SZ_256K (1 << 18) 36 #define PMP_REG_SZ_512K (1 << 19) 37 #define PMP_REG_SZ_1M (1 << 20) 38 #define PMP_REG_SZ_2M (1 << 21) 39 #define PMP_REG_SZ_4M (1 << 22) 40 #define PMP_REG_SZ_8M (1 << 23) 41 #define PMP_REG_SZ_16M (1 << 24) 42 #define PMP_REG_SZ_32M (1 << 25) 43 #define PMP_REG_SZ_64M (1 << 26) 44 #define PMP_REG_SZ_128M (1 << 27) 45 #define PMP_REG_SZ_256M (1 << 28) 46 #define PMP_REG_SZ_512M (1 << 29) 47 #define PMP_REG_SZ_1G (1 << 30) 48 #define PMP_REG_SZ_1024M (PMP_REG_SZ_1G) 49 50 typedef enum _pmp_status_type_ { 51 PMP_STATUS_OK = 0, 52 PMP_STATUS_BUSY, 53 PMP_STATUS_DENIED, 54 PMP_STATUS_INVALID, 55 PMP_STATUS_UNSUPPORTED, 56 PMP_STATUS_MAX = 0x7FFFFFFF 57 } pmp_status_type_e; 58 59 typedef enum _addr_match_type_ { 60 PMP_ADDR_MATCH_OFF = 0, 61 PMP_ADDR_MATCH_TOR, 62 PMP_ADDR_MATCH_NA4, 63 PMP_ADDR_MATCH_NAPOT 64 } pmp_addr_match_type_e; 65 66 typedef struct _pmp_config_entry { 67 uintptr_t entry_pa_base; 68 uintptr_t entry_pa_length; 69 uintptr_t entry_flag; 70 } pmp_config_entry_t; 71 72 pmp_status_type_e rvpmp_fill_entry(const pmp_config_entry_t *entry, uintptr_t i, uintptr_t force); 73 pmp_status_type_e rvpmp_init(const pmp_config_entry_t *entry, uintptr_t n); 74 75 #endif /* _RV_PMP_H_ */ 76