NMSIS-Core  Version 1.5.0
NMSIS-Core support for Nuclei processor-based devices
core_feature_iinfo.h
1 /*
2  * Copyright (c) 2019 Nuclei Limited. All rights reserved.
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Licensed under the Apache License, Version 2.0 (the License); you may
7  * not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  * www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an AS IS BASIS, WITHOUT
14  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  */
16 #ifndef __CORE_FEATURE_IINFO_H__
17 #define __CORE_FEATURE_IINFO_H__
27 /*
28  * IREGION INFO Configuration Macro:
29  *
30  * 1. __IINFO_BASE: Base address of the IREGION INFO
31  *
32  */
33 #ifdef __cplusplus
34 extern "C" {
35 #endif
36 
37 #include "core_feature_base.h"
38 
43 #ifdef __IINFO_BASEADDR
44 
56 typedef union {
57  struct {
58  __IM uint32_t cmo_cfg:1;
59  __IM uint32_t cmo_pft:1;
60  __IM uint32_t cmo_size:4;
61  __IM uint32_t cbozero_size:4;
62  uint32_t :22;
63  } b;
64  uint32_t d;
65 } IINFO_MCMO_INFO_Type;
66 
70 typedef union {
71  struct {
72  __IM uint32_t exist:1;
73  __IM uint32_t vector:1;
74  __IM uint32_t vector_b:1;
75  __IM uint32_t vector_k:1;
76  __IM uint32_t smepmp:1;
77  __IM uint32_t sscofpmf:1;
78  __IM uint32_t zfh:1;
79  __IM uint32_t zfhmin:1;
80  __IM uint32_t zfa:1;
81  __IM uint32_t svnapot:1;
82  __IM uint32_t svpbmt:1;
83  __IM uint32_t svinval:1;
84  __IM uint32_t bf16:1;
85  __IM uint32_t zve32x:1;
86  __IM uint32_t zve32f:1;
87  __IM uint32_t zve64x:1;
88  __IM uint32_t zve64f:1;
89  __IM uint32_t zve64d:1;
90  __IM uint32_t zimop:1;
91  __IM uint32_t zcmop:1;
92  __IM uint32_t zicond:1;
93  __IM uint32_t zihintntl:1;
94  __IM uint32_t zihintpause:1;
95  __IM uint32_t zvfh:1;
96  __IM uint32_t zvfhmin:1;
97  __IM uint32_t smrnmi:1;
98  __IM uint32_t zihpm:1;
99  __IM uint32_t smcntrpmf:1;
100  __IM uint32_t zicntr:1;
101  __IM uint32_t zawrs:1;
102  uint32_t :2;
103  } b;
104  uint32_t d;
105 } IINFO_ISA_SUPPORT0_Type;
106 
110 typedef union {
111  struct {
112  __IM uint32_t exist:1;
113  __IM uint32_t ssqosid:1;
114  __IM uint32_t zicflip:1;
115  __IM uint32_t zicfiss:1;
116  __IM uint32_t smctr:1;
117  __IM uint32_t zacas:1;
118  __IM uint32_t zabha:1;
119  __IM uint32_t smdbltrp:1;
120  __IM uint32_t ssdbltrp:1;
121  __IM uint32_t smcdeleg:1;
122  __IM uint32_t smmpm:1;
123  __IM uint32_t smnpm:1;
124  __IM uint32_t ssnpm:1;
125  __IM uint32_t smstateen:1;
126  __IM uint32_t sstateen:1;
127  __IM uint32_t smcsrind:1;
128  __IM uint32_t sscsrind:1;
129  __IM uint32_t svadu:1;
130  uint32_t :14;
131  } b;
132  uint32_t d;
133 } IINFO_ISA_SUPPORT1_Type;
134 
138 typedef union {
139  struct {
140  __IM uint32_t exist:1;
141  __IM uint32_t fpu_cycle:5;
142  __IM uint32_t high_div:1;
143  __IM uint32_t dcache_2stage:1;
144  __IM uint32_t delay_branch_flush:1;
145  __IM uint32_t bus_type:3;
146  __IM uint32_t dual_issue:1;
147  __IM uint32_t cross_4k:1;
148  __IM uint32_t dlm_2stage:1;
149  __IM uint32_t lsu_cut_fwd:1;
150  __IM uint32_t dsp_cycle:4;
151  __IM uint32_t ifu_cut_timing:1;
152  __IM uint32_t mem_cut_timing:1;
153  __IM uint32_t dcache_prefetch:1;
154  __IM uint32_t dcache_lbuf_num:5;
155  __IM uint32_t mul_cyc:3;
156  uint32_t :1;
157  } b;
158  uint32_t d;
159 } IINFO_PERFORMANCE_CFG0_Type;
160 
164 typedef union {
165  struct {
166  __IM uint32_t exist:1;
167  __IM uint32_t vfpu_cyc:5;
168  __IM uint32_t bht_entry_width:5;
169  __IM uint32_t high_performance:1;
170  __IM uint32_t agu_quick_forward:1;
171  __IM uint32_t cau_fwd:1;
172  __IM uint32_t hpm_ver:2;
173  uint32_t :16;
174  } b;
175  uint32_t d;
176 } IINFO_PERFORMANCE_CFG1_Type;
177 
181 typedef union {
182  struct {
183  __IOM uint32_t l1d_ena:1;
184  __IOM uint32_t cc_ena:1;
185  __IOM uint32_t scalar_ena:1;
186  __IOM uint32_t vector_ena:1;
187  __IOM uint32_t write_pref_ena:1;
188  __IOM uint32_t cross_page_pref_ena:1;
189  __IOM uint32_t mmu_ena:1;
190  __IOM uint32_t pl2_ena:1;
191  __IOM uint32_t pref_conflict_stop_th:4;
192  __IOM uint32_t pref_conflict_decr_sel:3;
193  uint32_t :17;
194  } b;
195  struct {
211  __IM uint32_t level:8;
212  __IM uint32_t pref_conflict_stop_th:4;
213  __IM uint32_t pref_conflict_decr_sel:3;
214  uint32_t :17;
215  } lv;
216  uint32_t d;
217 } IINFO_PFL1DCTRL1_Type;
218 
219 #define IINFO_PFL1DCTRL1_LEVEL_Pos (1UL << 0) /* IINFO PFL1DCTRL1 level position */
220 #define IINFO_PFL1DCTRL1_LEVEL_Msk (0xFFUL << IINFO_PFL1DCTRL1_LEVEL_Pos) /* IINFO PFL1DCTRL1 level mask */
221 
222 #define IINFO_PFL1DCTRL1_DISABLE (0UL)
223 #define IINFO_PFL1DCTRL1_L1D_ENA (1UL << 0)
224 #define IINFO_PFL1DCTRL1_CC_ENA (1UL << 1)
225 #define IINFO_PFL1DCTRL1_SCALAR_ENA (1UL << 2)
226 #define IINFO_PFL1DCTRL1_VECTOR_ENA (1UL << 3)
227 #define IINFO_PFL1DCTRL1_WRITE_PREF_ENA (1UL << 4)
228 #define IINFO_PFL1DCTRL1_CROSS_PAGE_PREF_ENA (1UL << 5)
229 #define IINFO_PFL1DCTRL1_MMU_PREF_ENA (1UL << 6)
230 #define IINFO_PFL1DCTRL1_PL2_ENA (1UL << 7)
235 typedef union {
236  struct {
237  __IOM uint32_t degree_incr_th:6;
238  __IOM uint32_t degree_decr_th:6;
239  __IOM uint32_t next_line_ena_th:4;
240  __IOM uint32_t write_noalloc_l1_th:2;
241  __IOM uint32_t write_noalloc_l2_th:2;
242  uint32_t :12;
243  } b;
244  uint32_t d;
245 } IINFO_PFL1DCTRL2_Type;
246 
250 typedef union {
251  struct {
252  __IOM uint32_t ws_tmout_max:12;
253  uint32_t :4;
254  __IOM uint32_t nc_tmout_max:8;
255  __IOM uint32_t dev_store_early_ret: 1;
256  uint32_t :7;
257  } b;
258  uint32_t d;
259 } IINFO_MERGEL1DCTRL_Type;
260 
264 typedef union {
265  struct {
266  __IOM uint32_t reg_prot_chck_en:2;
267  uint32_t :30;
268  } b;
269  uint32_t d;
270 } IINFO_SAFETY_CTRL_Type;
271 
275 typedef union {
276  struct {
277  uint32_t :1;
278  __IOM uint32_t pf_access: 1;
279  __IOM uint32_t cache_csr_access: 1;
280  __IOM uint32_t pma_csr_access: 1;
281  uint32_t :28;
282  } b;
283  uint32_t d;
284 } IINFO_ACCESS_CTRL_Type;
285 
289 typedef union {
290  struct {
291  __IOM uint32_t max_stream_l1_degree:4;
292  uint32_t :1;
293  __IOM uint32_t max_stream_l2_degree:7;
294  uint32_t :4;
295  __IOM uint32_t max_stride_cplx_l1_degree:4;
296  uint32_t :1;
297  __IOM uint32_t max_stride_cplx_l2_degree:7;
298  uint32_t :4;
299  } b;
300  uint32_t d;
301 } IINFO_PFL1DCTRL3_Type;
302 
306 typedef union {
307  struct {
308  __IOM uint32_t pf_enable:1;
309  __IOM uint32_t cc_short_enable:1;
310  uint32_t :30;
311  } b;
312  uint32_t d;
313 } IINFO_PFL1DCTRL4_Type;
314 
318 typedef union {
319  struct {
320  __IM uint32_t pf_cfg:8;
321  __IM uint32_t l2_pf_lbuf_num:8;
322  __IM uint32_t l2_pf_dbuf_num:8;
323  __IM uint32_t pf_ver:8;
324  } b;
325  uint32_t d;
326 } IINFO_PFL1INFO_Type;
327 
328 /* IREGION INFO Memory-Mapped Register Type*/
329 typedef struct {
330  __IM uint32_t mpasize;
331  __IM IINFO_MCMO_INFO_Type cmo_info;
332  __IM uint32_t sec_base_addr_lo;
333  __IM uint32_t sec_base_addr_hi;
334  __IM uint32_t sec_cfg_info;
335  __IM uint32_t reserved0[4];
336  __IM uint32_t mvlm_cfg_lo;
337  __IM uint32_t mvlm_cfg_hi;
338  __IM uint32_t flash_base_addr_lo;
339  __IM uint32_t flash_base_addr_hi;
340  __IM uint32_t reserved1[7];
341  __IM uint32_t vpu_cfg_info;
342  __IOM uint32_t mem_region0_cfg_lo;
343  __IM uint32_t mem_region0_cfg_hi;
344  __IOM uint32_t mem_region1_cfg_lo;
345  __IM uint32_t mem_region1_cfg_hi;
346  uint32_t reserved2[3];
347  __IM IINFO_ISA_SUPPORT0_Type isa_support0;
348  __IM IINFO_ISA_SUPPORT1_Type isa_support1;
349  uint32_t reserved3[2];
350  __IOM uint32_t mcppi_cfg_lo;
351  __IM uint32_t mcppi_cfg_hi;
352  __IOM uint32_t mpftctl;
353  uint32_t reserved4;
354  __IM IINFO_PERFORMANCE_CFG0_Type performance_cfg0;
355  __IM IINFO_PERFORMANCE_CFG1_Type performance_cfg1;
356  uint32_t reserved5[26];
357  __IOM IINFO_PFL1DCTRL1_Type pfl1dctrl1;
358  __IOM IINFO_PFL1DCTRL2_Type pfl1dctrl2;
359  __IOM IINFO_MERGEL1DCTRL_Type mergel1dctrl;
360  uint32_t reserved6;
361  __IOM IINFO_SAFETY_CTRL_Type safety_ctrl;
362  __IOM IINFO_ACCESS_CTRL_Type access_ctrl;
363  uint32_t reserved7[2];
364  __IOM IINFO_PFL1DCTRL3_Type pfl1dctrl3;
365  __IOM IINFO_PFL1DCTRL4_Type pfl1dctrl4;
366  __IM IINFO_PFL1INFO_Type pfl1info;
367  uint32_t reserved8[27];
368  __IOM uint32_t crc_rf0;
369  __IOM uint32_t crc_rf1;
370  __IOM uint32_t crc_fp0;
371  __IM uint32_t etrace_info;
372  __IOM uint32_t ecc_inj_addr_lo;
373  __IOM uint32_t ecc_inj_addr_hi;
374  __IOM uint32_t ecc_inj_way;
375  uint32_t reserved9[83];
376  __IOM uint32_t mem_crc_x22_lo;
377  __IOM uint32_t mem_crc_x22_hi;
378  __IOM uint32_t mem_crc_x23_lo;
379  __IOM uint32_t mem_crc_x23_hi;
380  __IOM uint32_t mem_crc_f23_lo;
381  __IOM uint32_t mem_crc_f23_hi;
382 } IINFO_Type;
383 
384 /* IREGION INFO Memory mapping of Device */
385 #define IINFO_BASE __IINFO_BASEADDR
386 #define IINFO ((IINFO_Type *)IINFO_BASE)
391 typedef enum {
392  IINFO_HPM_VER_UNKNOWN = 0,
393  IINFO_HPM_VER_1,
394  IINFO_HPM_VER_2,
395  IINFO_HPM_VER_MAX
396 } IINFO_HPM_VER_Type;
397  /* end of group NMSIS_Core_IINFO_Registers */
399 
414 __STATIC_FORCEINLINE int32_t IINFO_IsCMOSupported(void)
415 {
416  return IINFO->cmo_info.b.cmo_cfg;
417 }
418 
425 __STATIC_FORCEINLINE int32_t IINFO_IsCMOPrefetchSupported(void)
426 {
427  return IINFO->cmo_info.b.cmo_cfg && IINFO->cmo_info.b.cmo_pft;
428 }
429 
437 __STATIC_FORCEINLINE IINFO_HPM_VER_Type IINFO_GetHPMVersion(void)
438 {
439  if (!IINFO->performance_cfg1.b.exist) {
440  return IINFO_HPM_VER_UNKNOWN;
441  }
442  return (IINFO_HPM_VER_Type)IINFO->performance_cfg1.b.hpm_ver;
443 }
444 
480 __STATIC_FORCEINLINE void IINFO_SetPrefetchLevel(uint32_t val)
481 {
482  IINFO->pfl1dctrl1.d = (IINFO->pfl1dctrl1.d & ~IINFO_PFL1DCTRL1_LEVEL_Msk) |
483  _VAL2FLD(IINFO_PFL1DCTRL1_LEVEL, val);
484 }
485 
493 __STATIC_FORCEINLINE uint32_t IINFO_GetPrefetchLevel(void)
494 {
495  return IINFO->pfl1dctrl1.lv.level;
496 }
497 
503 __STATIC_FORCEINLINE void IINFO_SetPFL1DCTRL2(uint32_t val)
504 {
505  IINFO->pfl1dctrl2.d = val;
506 }
507 
513 __STATIC_FORCEINLINE uint32_t IINFO_GetPFL1DCTRL2(void)
514 {
515  return IINFO->pfl1dctrl2.d;
516 }
517 
523 __STATIC_FORCEINLINE void IINFO_SetPFL1DCTRL3(uint32_t val)
524 {
525  IINFO->pfl1dctrl3.d = val;
526 }
527 
533 __STATIC_FORCEINLINE uint32_t IINFO_GetPFL1DCTRL3(void)
534 {
535  return IINFO->pfl1dctrl3.d;
536 }
537 
542 __STATIC_FORCEINLINE void IINFO_EnablePrefetchOverall(void)
543 {
544  IINFO->pfl1dctrl4.b.pf_enable = 1;
545 }
546 
551 __STATIC_FORCEINLINE void IINFO_DisablePrefetchOverall(void)
552 {
553  IINFO->pfl1dctrl4.b.pf_enable = 0;
554 }
555  /* End of Doxygen Group NMSIS_Core_IINFO_Functions */
557 
558 #endif /* #ifdef __IINFO_BASEADDR */
559 
560 #ifdef __cplusplus
561 }
562 #endif
563 #endif /* __CORE_FEATURE_IINFO_H__ */
564 
#define __STATIC_FORCEINLINE
Define a static function that should be always inlined by the compiler.
Definition: nmsis_gcc.h:70
#define _VAL2FLD(field, value)
Mask and shift a bit field value for use in a register bit range.
#define __IM
Defines 'read only' structure member permissions.
#define __IOM
Defines 'read/write' structure member permissions.