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