• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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