HPM SDK
HPMicro Software Development Kit
hpm_pmp_drv.h File Reference
#include "hpm_common.h"
#include "hpm_soc_feature.h"

Go to the source code of this file.

Data Structures

struct  pmp_entry_struct
 PMP Entry structure. More...
 

Macros

#define READ_EN   (1U)
 PMP Configuration definitions. More...
 
#define READ_DIS   (0U)
 
#define WRITE_EN   (1U)
 
#define WRITE_DIS   (0U)
 
#define EXECUTE_EN   (1U)
 
#define EXECUTE_DIS   (0U)
 
#define ADDR_MATCH_MODE_OFF   (0U)
 
#define ADDR_MATCH_TOR   (1U)
 
#define ADDR_MATCH_NAPOT   (3U)
 
#define REG_LOCK   (1U)
 
#define REG_UNLOCK   (0U)
 
#define MEM_TYPE_DEV_NON_BUF   (0U)
 PMA Configuration definitions. More...
 
#define MEM_TYPE_DEV_BUF   (1U)
 
#define MEM_TYPE_MEM_NON_CACHE_NON_BUF   (2U)
 
#define MEM_TYPE_MEM_NON_CACHE_BUF   (3U)
 
#define MEM_TYPE_MEM_WT_NO_ALLOC   (4U)
 
#define MEM_TYPE_MEM_WT_READ_ALLOC   (5U)
 
#define MEM_TYPE_MEM_WB_NO_ALLOC   (8U)
 
#define MEM_TYPE_MEM_WB_READ_ALLOC   (9U)
 
#define MEM_TYPE_MEM_WB_WRITE_ALLOC   (10U)
 
#define MEM_TYPE_MEM_WB_READ_WRITE_ALLOC   (11U)
 
#define MEM_TYPE_EMPTY_HOLE   (15U)
 
#define AMO_EN   (0U)
 
#define AMO_DIS   (1U)
 
#define PMP_CFG(r, w, x, m, l)   ((r) | ((w) << 1) | ((x) << 2) | ((m) << 3) | ((l) << 7))
 PMP Configuration. More...
 
#define PMA_CFG(m, t, n)   ((m) | ((t) << 2) | ((n) << 6))
 PMA Configuration. More...
 
#define PMP_TOR_ADDR(addr)   ((addr) >> 2)
 Format Top Address Region. More...
 
#define PMP_NAPOT_ADDR(x, n)   (((uint32_t)(x) >> 2) | (((uint32_t)(n)-1U) >> 3))
 Format PMP Natural Aligned Region. More...
 
#define PMA_NAPOT_ADDR(x, n)   (((uint32_t)(x) >> 2) | ((((uint32_t)(n)-1U) >> 3)))
 Format PMA Natural Aligned Region. More...
 

Typedefs

typedef struct pmp_entry_struct pmp_entry_t
 PMP Entry structure. More...
 

Functions

void write_pmp_cfg (uint32_t value, uint32_t idx)
 Write PMP Configuration to corresponding PMP_CFG register. More...
 
uint32_t read_pmp_cfg (uint32_t idx)
 Read PMP configuration. More...
 
void write_pmp_addr (uint32_t value, uint32_t idx)
 Write PMP address to corresponding PMP_ADDR register. More...
 
uint32_t read_pmp_addr (uint32_t idx)
 Read PMP address entry. More...
 
uint32_t read_pma_cfg (uint32_t idx)
 Read PMA configuration. More...
 
void write_pma_cfg (uint32_t value, uint32_t idx)
 Write PMA Configuration to corresponding PMA_CFG register. More...
 
void write_pma_addr (uint32_t value, uint32_t idx)
 Write PMA address to corresponding PMA_ADDR register. More...
 
uint32_t read_pma_addr (uint32_t idx)
 Read PMA address entry. More...
 
hpm_stat_t pmp_config_entry (const pmp_entry_t *entry, uint32_t entry_index)
 Configure PMP and PMA for specified PMP/PMA entry. More...
 
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. More...
 
void pmp_disable (void)
 Disable PMP and PMA. More...
 

Macro Definition Documentation

◆ ADDR_MATCH_MODE_OFF

#define ADDR_MATCH_MODE_OFF   (0U)

◆ ADDR_MATCH_NAPOT

#define ADDR_MATCH_NAPOT   (3U)

◆ ADDR_MATCH_TOR

#define ADDR_MATCH_TOR   (1U)

◆ AMO_DIS

#define AMO_DIS   (1U)

◆ AMO_EN

#define AMO_EN   (0U)

◆ EXECUTE_DIS

#define EXECUTE_DIS   (0U)

◆ EXECUTE_EN

#define EXECUTE_EN   (1U)

◆ MEM_TYPE_DEV_BUF

#define MEM_TYPE_DEV_BUF   (1U)

◆ MEM_TYPE_DEV_NON_BUF

#define MEM_TYPE_DEV_NON_BUF   (0U)

PMA Configuration definitions.

◆ MEM_TYPE_EMPTY_HOLE

#define MEM_TYPE_EMPTY_HOLE   (15U)

◆ MEM_TYPE_MEM_NON_CACHE_BUF

#define MEM_TYPE_MEM_NON_CACHE_BUF   (3U)

◆ MEM_TYPE_MEM_NON_CACHE_NON_BUF

#define MEM_TYPE_MEM_NON_CACHE_NON_BUF   (2U)

◆ MEM_TYPE_MEM_WB_NO_ALLOC

#define MEM_TYPE_MEM_WB_NO_ALLOC   (8U)

◆ MEM_TYPE_MEM_WB_READ_ALLOC

#define MEM_TYPE_MEM_WB_READ_ALLOC   (9U)

◆ MEM_TYPE_MEM_WB_READ_WRITE_ALLOC

#define MEM_TYPE_MEM_WB_READ_WRITE_ALLOC   (11U)

◆ MEM_TYPE_MEM_WB_WRITE_ALLOC

#define MEM_TYPE_MEM_WB_WRITE_ALLOC   (10U)

◆ MEM_TYPE_MEM_WT_NO_ALLOC

#define MEM_TYPE_MEM_WT_NO_ALLOC   (4U)

◆ MEM_TYPE_MEM_WT_READ_ALLOC

#define MEM_TYPE_MEM_WT_READ_ALLOC   (5U)

◆ PMA_CFG

#define PMA_CFG (   m,
  t,
 
)    ((m) | ((t) << 2) | ((n) << 6))

PMA Configuration.

Parameters
m- Entry address matching mode, valid value: ADDR_MATCH_MODE_OFF - This PMA entry is disabled ADDR_MATCH_NAPOT - Naturally aligned power-of-2 region, the granularity is 4K bytes
t- Memory type attributes, valid value: MEM_TYPE_DEV_NON_BUF - Device, Non-bufferable MEM_TYPE_DEV_BUF - Device, bufferable MEM_TYPE_MEM_NON_CACHE_NON_BUF - Memory, Non-cacheable, Non-bufferable MEM_TYPE_MEM_NON_CACHE_BUF - Memory, Non-cacheable, bufferable MEM_TYPE_MEM_WT_NO_ALLOC - Memory, Write-through, No-allocate MEM_TYPE_MEM_WT_READ_ALLOC - Memory, Write-through, read-allocate MEM_TYPE_MEM_WB_NO_ALLOC - Memory, Write-back, No-allocate MEM_TYPE_MEM_WB_READ_ALLOC - Memory, Write-back, Read-allocate MEM_TYPE_MEM_WB_READ_WRITE_ALLOC - Memory, Write-back, Write-Allocate, Read-Allocate MEM_TYPE_EMPTY_HOLE - Empty hole, nothing exists
n- Indicate Whether Atomic Memory Operation instructions are not supported in this region, valid value: AMO_EN - Atomic Memory Operations are supported AMO_DIS - Atomic Memory Operations are not supported

◆ PMA_NAPOT_ADDR

#define PMA_NAPOT_ADDR (   x,
 
)    (((uint32_t)(x) >> 2) | ((((uint32_t)(n)-1U) >> 3)))

Format PMA Natural Aligned Region.

Parameters
x- start address
n- power-of-2 aligned length

◆ PMP_CFG

#define PMP_CFG (   r,
  w,
  x,
  m,
 
)    ((r) | ((w) << 1) | ((x) << 2) | ((m) << 3) | ((l) << 7))

PMP Configuration.

Parameters
r- READ Access control, valid value: READ_EN, READ_DIS
w- Write access control, valid value: WRITE_EN, WRITE_DIS
x- Instruction Execution control, valid value: EXECUTE_EN, EXECUTE_DIS
m- Address matching mode, valid value: ADDR_MATCH_MODE_OFF - Null region ADDR_MATCH_TOR - Top of range. For pmp_addr0, any address < pmp_addr0 matches, for other regions, any address which meets ( pmp_addr[i-1] <= addr < pmp_addr) matches. ADDR_MATCH_NAPOT - Naturally aligned power-of-2 region, minimal size must be 8 bytes
l- Write lock and permission enforcement bit for Machine mode, valid value: REG_LOCK, REG_UNLOCK

◆ PMP_NAPOT_ADDR

#define PMP_NAPOT_ADDR (   x,
 
)    (((uint32_t)(x) >> 2) | (((uint32_t)(n)-1U) >> 3))

Format PMP Natural Aligned Region.

Parameters
x- start address
n- power-of-2 aligned length

◆ PMP_TOR_ADDR

#define PMP_TOR_ADDR (   addr)    ((addr) >> 2)

Format Top Address Region.

◆ READ_DIS

#define READ_DIS   (0U)

◆ READ_EN

#define READ_EN   (1U)

PMP Configuration definitions.

◆ REG_LOCK

#define REG_LOCK   (1U)

◆ REG_UNLOCK

#define REG_UNLOCK   (0U)

◆ WRITE_DIS

#define WRITE_DIS   (0U)

◆ WRITE_EN

#define WRITE_EN   (1U)

Typedef Documentation

◆ pmp_entry_t

typedef struct pmp_entry_struct pmp_entry_t

PMP Entry structure.

Function Documentation

◆ pmp_config()

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.

Parameters
entrystart of the PMP entry list
num_of_entriesNumber of entries in the PMP entry list
Return values
status_invalid_argumentInvalid Arguments were detected
status_successConfiguration completed without errors

◆ pmp_config_entry()

hpm_stat_t pmp_config_entry ( const pmp_entry_t entry,
uint32_t  entry_index 
)

Configure PMP and PMA for specified PMP/PMA entry.

Parameters
[in]entryPMP entry
entry_indexPMP/PMA entry index
Return values
status_invalid_argumentInvalid Arguments were detected
status_successConfiguration completed without errors

◆ pmp_disable()

void pmp_disable ( void  )

Disable PMP and PMA.

◆ read_pma_addr()

uint32_t read_pma_addr ( uint32_t  idx)

Read PMA address entry.

Parameters
idxPMA address entry index, valid value is 0-15
Returns
PMA address

◆ read_pma_cfg()

uint32_t read_pma_cfg ( uint32_t  idx)

Read PMA configuration.

Parameters
idxPMA entry index
Returns
PMA configuration

◆ read_pmp_addr()

uint32_t read_pmp_addr ( uint32_t  idx)

Read PMP address entry.

Parameters
idxPMP address entry index
Returns
PMP address

◆ read_pmp_cfg()

uint32_t read_pmp_cfg ( uint32_t  idx)

Read PMP configuration.

Parameters
idxPMP entry index
Returns
PMP configuration

◆ write_pma_addr()

void write_pma_addr ( uint32_t  value,
uint32_t  idx 
)

Write PMA address to corresponding PMA_ADDR register.

Parameters
valuePMA address
idxPMA address entry index, valid value is 0-15

◆ write_pma_cfg()

void write_pma_cfg ( uint32_t  value,
uint32_t  idx 
)

Write PMA Configuration to corresponding PMA_CFG register.

Parameters
valuePMA configuration
idxPMA entry index, valid value is 0-15

◆ write_pmp_addr()

void write_pmp_addr ( uint32_t  value,
uint32_t  idx 
)

Write PMP address to corresponding PMP_ADDR register.

Parameters
valuePMP address
idxPMP address entry index, valid value is 0-15

◆ write_pmp_cfg()

void write_pmp_cfg ( uint32_t  value,
uint32_t  idx 
)

Write PMP Configuration to corresponding PMP_CFG register.

Parameters
valuePMP configuration
idxPMP entry index, valid value is 0-15