HPM SDK
HPMicro Software Development Kit
hpm_pmp_drv.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2021-2025 HPMicro
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 #ifndef HPM_PMP_DRV_H
8 #define HPM_PMP_DRV_H
9 
10 #include "hpm_common.h"
11 #include "hpm_soc_feature.h"
12 
16 typedef struct pmp_entry_struct {
17  union {
18  struct {
19  uint8_t read_access_ctrl : 1;
20  uint8_t write_access_ctrl : 1;
21  uint8_t execution_ctrl : 1;
22  uint8_t addr_matching_mode : 2;
23  uint8_t reserved : 2;
24  uint8_t lock : 1;
25  };
26  uint8_t val;
28  uint8_t reserved0[3];
29  uint32_t pmp_addr;
30 #if (!defined(PMP_SUPPORT_PMA)) || (defined(PMP_SUPPORT_PMA) && (PMP_SUPPORT_PMA == 1))
31  union {
32  struct {
34  uint8_t mem_type_attribute : 4;
36  uint8_t reserved : 1;
37  };
38  uint8_t val;
40  uint8_t reserved1[3];
41  uint32_t pma_addr;
42 #endif
44 
49 typedef struct pmp_attribute_struct {
50  union {
51  struct {
52  uint8_t read_access_ctrl : 1;
53  uint8_t write_access_ctrl : 1;
54  uint8_t execution_ctrl : 1;
55  uint8_t addr_matching_mode : 2;
56  uint8_t reserved : 2;
57  uint8_t lock : 1;
58  };
59  uint8_t val;
61  uint8_t reserved0[3];
62  uint32_t pmp_addr;
64 
68 typedef struct pma_attribute_struct {
69  union {
70  struct {
72  uint8_t mem_type_attribute : 4;
74  uint8_t reserved : 1;
75  };
76  uint8_t val;
78  uint8_t reserved1[3];
79  uint32_t pma_addr;
81 
85 #define READ_EN (1U)
86 #define READ_DIS (0U)
87 #define WRITE_EN (1U)
88 #define WRITE_DIS (0U)
89 #define EXECUTE_EN (1U)
90 #define EXECUTE_DIS (0U)
91 #define ADDR_MATCH_MODE_OFF (0U)
92 #define ADDR_MATCH_TOR (1U)
93 #define ADDR_MATCH_NAPOT (3U)
94 #define REG_LOCK (1U)
95 #define REG_UNLOCK (0U)
96 #define PMP_REG_LOCK_MASK (1UL << 7)
97 
101 #define MEM_TYPE_DEV_NON_BUF (0U)
102 #define MEM_TYPE_DEV_BUF (1U)
103 #define MEM_TYPE_MEM_NON_CACHE_NON_BUF (2U)
104 #define MEM_TYPE_MEM_NON_CACHE_BUF (3U)
105 #define MEM_TYPE_MEM_WT_NO_ALLOC (4U)
106 #define MEM_TYPE_MEM_WT_READ_ALLOC (5U)
107 #define MEM_TYPE_MEM_WB_NO_ALLOC (8U)
108 #define MEM_TYPE_MEM_WB_READ_ALLOC (9U)
109 #define MEM_TYPE_MEM_WB_WRITE_ALLOC (10U)
110 #define MEM_TYPE_MEM_WB_READ_WRITE_ALLOC (11U)
111 #define MEM_TYPE_EMPTY_HOLE (15U)
112 
113 #define AMO_EN (0U)
114 #define AMO_DIS (1U)
115 
130 #define PMP_CFG(r, w, x, m, l) ((r) | ((w) << 1) | ((x) << 2) | ((m) << 3) | ((l) << 7))
152 #define PMA_CFG(m, t, n) ((m) | ((t) << 2) | ((n) << 6))
156 #define PMP_TOR_ADDR(addr) ((addr) >> 2)
168 #define PMP_NAPOT_ADDR(x, n) (((uint32_t)(x) + (((uint32_t)(n)) >> 1) - 1U) >> 2)
180 #define PMA_NAPOT_ADDR(x, n) (((uint32_t)(x) + (((uint32_t)(n)) >> 1) - 1U) >> 2)
181 
182 #ifdef __cplusplus
183 extern "C" {
184 #endif
190 void write_pmp_cfg(uint32_t value, uint32_t idx);
191 
197 uint32_t read_pmp_cfg(uint32_t idx);
198 
204 void write_pmp_addr(uint32_t value, uint32_t idx);
205 
211 uint32_t read_pmp_addr(uint32_t idx);
212 
220 hpm_stat_t pmp_config_attributes(const pmp_attr_t *attrs, uint32_t num_of_entries);
221 
230 hpm_stat_t pmp_lock_pmp_entry(uint32_t pmp_index);
231 
232 #if (!defined(PMP_SUPPORT_PMA)) || (defined(PMP_SUPPORT_PMA) && (PMP_SUPPORT_PMA == 1))
238 uint32_t read_pma_cfg(uint32_t idx);
239 
245 void write_pma_cfg(uint32_t value, uint32_t idx);
246 
252 void write_pma_addr(uint32_t value, uint32_t idx);
253 
259 uint32_t read_pma_addr(uint32_t idx);
260 
268 hpm_stat_t pma_config_attributes(const pma_attr_t *attrs, uint32_t num_of_entries);
269 #endif /* #if (!defined(PMP_SUPPORT_PMA)) || (defined(PMP_SUPPORT_PMA) && (PMP_SUPPORT_PMA == 1)) */
270 
279 hpm_stat_t pmp_config_entry(const pmp_entry_t *entry, uint32_t entry_index);
280 
289 hpm_stat_t pmp_config(const pmp_entry_t *entry, uint32_t num_of_entries);
290 
291 
297 uint32_t pmp_get_aligned_len(uint32_t len);
298 
302 void pmp_disable(void);
303 
304 #ifdef __cplusplus
305 }
306 #endif
307 
308 #endif /* HPM_PMP_DRV_H */
uint32_t hpm_stat_t
Definition: hpm_common.h:135
void write_pma_cfg(uint32_t value, uint32_t idx)
Write PMA Configuration to corresponding PMA_CFG register.
Definition: hpm_pmp_drv.c:251
struct pma_attribute_struct pma_attr_t
PMA Attribute structure.
uint32_t pmp_get_aligned_len(uint32_t len)
Get the aligned length of the PMP/PMA entry, the length is round up to next power of 2.
Definition: hpm_pmp_drv.c:548
uint32_t read_pmp_addr(uint32_t idx)
Read PMP address entry.
Definition: hpm_pmp_drv.c:114
uint32_t read_pma_addr(uint32_t idx)
Read PMA address entry.
Definition: hpm_pmp_drv.c:328
void write_pmp_addr(uint32_t value, uint32_t idx)
Write PMP address to corresponding PMP_ADDR register.
Definition: hpm_pmp_drv.c:57
hpm_stat_t pmp_config_attributes(const pmp_attr_t *attrs, uint32_t num_of_entries)
Configure PMP Attributes (including PMPi_CFG and PMPADDRi)
Definition: hpm_pmp_drv.c:173
struct pmp_attribute_struct pmp_attr_t
PMP attribute structure.
hpm_stat_t pmp_config_entry(const pmp_entry_t *entry, uint32_t entry_index)
Configure PMP and PMA for specified PMP/PMA entry.
Definition: hpm_pmp_drv.c:410
uint32_t read_pma_cfg(uint32_t idx)
Read PMA configuration.
Definition: hpm_pmp_drv.c:228
uint32_t read_pmp_cfg(uint32_t idx)
Read PMP configuration.
Definition: hpm_pmp_drv.c:13
struct pmp_entry_struct pmp_entry_t
PMP Entry structure.
void pmp_disable(void)
Disable PMP and PMA.
Definition: hpm_pmp_drv.c:491
hpm_stat_t pma_config_attributes(const pma_attr_t *attrs, uint32_t num_of_entries)
Configure PMA Attributes (including PMAiCFG and PMAADDRi)
Definition: hpm_pmp_drv.c:387
void write_pmp_cfg(uint32_t value, uint32_t idx)
Write PMP Configuration to corresponding PMP_CFG register.
Definition: hpm_pmp_drv.c:36
void write_pma_addr(uint32_t value, uint32_t idx)
Write PMA address to corresponding PMA_ADDR register.
Definition: hpm_pmp_drv.c:271
hpm_stat_t pmp_lock_pmp_entry(uint32_t pmp_index)
Lock the specified PMP entry.
Definition: hpm_pmp_drv.c:205
hpm_stat_t pmp_config(const pmp_entry_t *entry, uint32_t num_of_entries)
Configure PMP and PMA based on the PMP entry list.
Definition: hpm_pmp_drv.c:448
PMA Attribute structure.
Definition: hpm_pmp_drv.h:68
uint8_t val
Definition: hpm_pmp_drv.h:76
uint8_t reserved1[3]
Definition: hpm_pmp_drv.h:78
uint32_t pma_addr
Definition: hpm_pmp_drv.h:79
uint8_t reserved
Definition: hpm_pmp_drv.h:74
union pma_attribute_struct::@186 pma_cfg
uint8_t mem_type_attribute
Definition: hpm_pmp_drv.h:72
uint8_t entry_addr_matching_mode
Definition: hpm_pmp_drv.h:71
uint8_t atomic_mem_operation_ctrl
Definition: hpm_pmp_drv.h:73
PMP attribute structure.
Definition: hpm_pmp_drv.h:49
uint8_t lock
Definition: hpm_pmp_drv.h:57
uint8_t addr_matching_mode
Definition: hpm_pmp_drv.h:55
uint8_t reserved0[3]
Definition: hpm_pmp_drv.h:61
uint8_t write_access_ctrl
Definition: hpm_pmp_drv.h:53
uint32_t pmp_addr
Definition: hpm_pmp_drv.h:62
uint8_t read_access_ctrl
Definition: hpm_pmp_drv.h:52
uint8_t reserved
Definition: hpm_pmp_drv.h:56
union pmp_attribute_struct::@183 pmp_cfg
uint8_t val
Definition: hpm_pmp_drv.h:59
uint8_t execution_ctrl
Definition: hpm_pmp_drv.h:54
PMP Entry structure.
Definition: hpm_pmp_drv.h:16
uint8_t execution_ctrl
Definition: hpm_pmp_drv.h:21
union pmp_entry_struct::@177 pmp_cfg
uint32_t pma_addr
Definition: hpm_pmp_drv.h:41
uint8_t addr_matching_mode
Definition: hpm_pmp_drv.h:22
uint32_t pmp_addr
Definition: hpm_pmp_drv.h:29
uint8_t reserved0[3]
Definition: hpm_pmp_drv.h:28
uint8_t entry_addr_matching_mode
Definition: hpm_pmp_drv.h:33
uint8_t lock
Definition: hpm_pmp_drv.h:24
union pmp_entry_struct::@178 pma_cfg
uint8_t read_access_ctrl
Definition: hpm_pmp_drv.h:19
uint8_t write_access_ctrl
Definition: hpm_pmp_drv.h:20
uint8_t reserved1[3]
Definition: hpm_pmp_drv.h:40
uint8_t val
Definition: hpm_pmp_drv.h:26
uint8_t reserved
Definition: hpm_pmp_drv.h:23
uint8_t mem_type_attribute
Definition: hpm_pmp_drv.h:34
uint8_t atomic_mem_operation_ctrl
Definition: hpm_pmp_drv.h:35