1 /* 2 // Copyright (C) 2022 Beken Corporation 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 17 #ifndef __PMP_H__ 18 #define __PMP_H__ 19 20 /* Check platform support which PMP scheme! 21 * CLIC platform only support NAPOT scheme! */ 22 #define USE_NAPOT 0 23 #define USE_TOR !(USE_NAPOT) 24 #define SCHEME_NAPOT 3 25 #define SCHEME_NA4 2 26 #define SCHEME_TOR 1 27 #define SCHEME_OFF 0 28 #define NAPOT(base, size) (unsigned long)(((size) > 0) ? ((((unsigned long)(base) & (~((unsigned long)(size) - 1))) >> 2) | (((unsigned long)(size) - 1) >> 3)) : 0) 29 #define TOR(top) (unsigned long)((unsigned long)(top) >> 2) 30 #define PMP_L_OFF 0 31 #define PMP_L_ON 1 32 #define PMP_A_OFF 0 33 #define PMP_A_TOR SCHEME_TOR 34 #define PMP_A_NA4 SCHEME_NA4 35 #define PMP_A_NAPOT SCHEME_NAPOT 36 #define PMP_X_OFF 0 37 #define PMP_X_ON 1 38 #define PMP_W_OFF 0 39 #define PMP_W_ON 1 40 #define PMP_R_OFF 0 41 #define PMP_R_ON 1 42 43 /* attribute is used for PA */ 44 #define PMPCFG_ALXWR(a,l,x,w,r) (((a) << 3) | ((l) << 7) | ((x) << 2) | ((w) << 1) | ((r) << 0)) 45 46 /* Machine CSR */ 47 #define MSTATUS_MPP_MSK ((1ULL << 11) | (1ULL << 12)) 48 #define MSTATUS_MPP_USER (0ULL << 11) 49 #define MSTATUS_MPP_SV (1ULL << 11) 50 #define MSTATUS_MPP_MC ((1ULL << 11) | (1ULL << 12)) 51 52 /* Supervisor CSR */ 53 #define SSTATUS_SPP_MSK (1ULL << 8) 54 55 /* Hart mode for machine/supervisor/user */ 56 #define HART_USER 0x0 57 #define HART_SV 0x1 58 #define HART_MC 0x3 59 60 #define KB (0x1 << 10) 61 62 enum 63 { 64 ENTRY_PMPADDR0 = 0, 65 ENTRY_PMPADDR1, 66 ENTRY_PMPADDR2, 67 ENTRY_PMPADDR3, 68 ENTRY_PMPADDR4, 69 ENTRY_PMPADDR5, 70 ENTRY_PMPADDR6, 71 ENTRY_PMPADDR7, 72 ENTRY_PMPADDR8, 73 ENTRY_PMPADDR9, 74 ENTRY_PMPADDR10, 75 ENTRY_PMPADDR11, 76 ENTRY_PMPADDR12, 77 ENTRY_PMPADDR13, 78 ENTRY_PMPADDR14, 79 ENTRY_PMPADDR15, 80 ENTRY_PMPADDR_COUNT 81 }; 82 83 enum 84 { 85 ENTRY_PMPCFG0 = 0, 86 ENTRY_PMPCFG1, 87 ENTRY_PMPCFG2, 88 ENTRY_PMPCFG3, 89 }; 90 91 typedef struct { 92 uint8_t pmp_entry; 93 uint8_t pmp_config; 94 /* 95 union 96 { 97 struct 98 { 99 volatile uint8_t R : 1; //[0], Read Access Control 100 volatile uint8_t W : 1; //[1], Write Access Control 101 volatile uint8_t X : 1; //[2], Instruction execution Control 102 volatile uint8_t A : 2; //[4:3], Address matching mode 103 volatile uint8_t reserved : 2; //[6:5], 104 volatile uint8_t L : 1; //[7], Write Lock and permission enforcement bit for Machine mode 105 }; 106 uint8_t value; 107 }pmp_config; 108 */ 109 void *pmp_addr; 110 } pmp_config_t; 111 112 #endif // __PMP_H__ 113