summaryrefslogtreecommitdiff
path: root/include/sbi/sbi_hart.h
blob: 543393bba41526017cd95596348e26eaa897850a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
/*
 * SPDX-License-Identifier: BSD-2-Clause
 *
 * Copyright (c) 2019 Western Digital Corporation or its affiliates.
 *
 * Authors:
 *   Anup Patel <[email protected]>
 */

#ifndef __SBI_HART_H__
#define __SBI_HART_H__

#include <sbi/sbi_types.h>
#include <sbi/sbi_bitops.h>

/** Possible privileged specification versions of a hart */
enum sbi_hart_priv_versions {
	/** Unknown privileged specification */
	SBI_HART_PRIV_VER_UNKNOWN = 0,
	/** Privileged specification v1.10 */
	SBI_HART_PRIV_VER_1_10 = 1,
	/** Privileged specification v1.11 */
	SBI_HART_PRIV_VER_1_11 = 2,
	/** Privileged specification v1.12 */
	SBI_HART_PRIV_VER_1_12 = 3,
};

/** Possible ISA extensions of a hart */
enum sbi_hart_extensions {
	/** HART has AIA M-mode CSRs */
	SBI_HART_EXT_SMAIA = 0,
	/** HART has Smepmp */
	SBI_HART_EXT_SMEPMP,
	/** HART has Smstateen extension **/
	SBI_HART_EXT_SMSTATEEN,
	/** Hart has Sscofpmt extension */
	SBI_HART_EXT_SSCOFPMF,
	/** HART has Sstc extension */
	SBI_HART_EXT_SSTC,
	/** HART has Zicntr extension (i.e. HW cycle, time & instret CSRs) */
	SBI_HART_EXT_ZICNTR,
	/** HART has Zihpm extension */
	SBI_HART_EXT_ZIHPM,
	/** HART has Zkr extension */
	SBI_HART_EXT_ZKR,
	/** Hart has Smcntrpmf extension */
	SBI_HART_EXT_SMCNTRPMF,
	/** Hart has Xandespmu extension */
	SBI_HART_EXT_XANDESPMU,
	/** Hart has Zicboz extension */
	SBI_HART_EXT_ZICBOZ,
	/** Hart has Zicbom extension */
	SBI_HART_EXT_ZICBOM,
	/** Hart has Svpbmt extension */
	SBI_HART_EXT_SVPBMT,
	/** Hart has debug trigger extension */
	SBI_HART_EXT_SDTRIG,
	/** Hart has Smcsrind extension */
	SBI_HART_EXT_SMCSRIND,
	/** Hart has Smcdeleg extension */
	SBI_HART_EXT_SMCDELEG,
	/** Hart has Sscsrind extension */
	SBI_HART_EXT_SSCSRIND,
	/** Hart has Ssccfg extension */
	SBI_HART_EXT_SSCCFG,
	/** Hart has Svade extension */
	SBI_HART_EXT_SVADE,
	/** Hart has Svadu extension */
	SBI_HART_EXT_SVADU,
	/** Hart has Smnpm extension */
	SBI_HART_EXT_SMNPM,
	/** HART has zicfilp extension */
	SBI_HART_EXT_ZICFILP,
	/** HART has zicfiss extension */
	SBI_HART_EXT_ZICFISS,
	/** Hart has Ssdbltrp extension */
	SBI_HART_EXT_SSDBLTRP,
	/** HART has CTR M-mode CSRs */
	SBI_HART_EXT_SMCTR,
	/** HART has CTR S-mode CSRs */
	SBI_HART_EXT_SSCTR,
	/** Hart has Ssqosid extension */
	SBI_HART_EXT_SSQOSID,
	/** HART has Ssstateen extension **/
	SBI_HART_EXT_SSSTATEEN,
	/** Hart has Xsfcflushdlone extension */
	SBI_HART_EXT_XSIFIVE_CFLUSH_D_L1,
	/** Hart has Xsfcease extension */
	SBI_HART_EXT_XSIFIVE_CEASE,
	/** Hart has Smrnmi extension */
	SBI_HART_EXT_SMRNMI,
	/** Hart has V extension */
	SBI_HART_EXT_V,
	/** Hart has F extension */
	SBI_HART_EXT_F,
	/** Hart has D extension */
	SBI_HART_EXT_D,

	/** Maximum index of Hart extension */
	SBI_HART_EXT_MAX,
};

struct sbi_hart_ext_data {
	const unsigned int id;
	const char *name;
};

extern const struct sbi_hart_ext_data sbi_hart_ext[];

/** CSRs should be detected by access and trapping */
enum sbi_hart_csrs {
	SBI_HART_CSR_CYCLE = 0,
	SBI_HART_CSR_TIME,
	SBI_HART_CSR_INSTRET,
	SBI_HART_CSR_MAX,
};

struct sbi_hart_features {
	bool detected;
	int priv_version;
	unsigned long extensions[BITS_TO_LONGS(SBI_HART_EXT_MAX)];
	unsigned long csrs[BITS_TO_LONGS(SBI_HART_CSR_MAX)];
	unsigned int pmp_count;
	unsigned int pmp_addr_bits;
	unsigned int pmp_log2gran;
	unsigned int mhpm_mask;
	unsigned int mhpm_bits;
};

extern unsigned long hart_features_offset;
#define sbi_hart_features_ptr(__s)	sbi_scratch_offset_ptr(__s, hart_features_offset)

struct sbi_scratch;

int sbi_hart_reinit(struct sbi_scratch *scratch);
int sbi_hart_init(struct sbi_scratch *scratch, bool cold_boot);

extern void (*sbi_hart_expected_trap)(void);

unsigned int sbi_hart_mhpm_mask(struct sbi_scratch *scratch);
void sbi_hart_delegation_dump(struct sbi_scratch *scratch,
			      const char *prefix, const char *suffix);
unsigned int sbi_hart_mhpm_bits(struct sbi_scratch *scratch);
int sbi_hart_priv_version(struct sbi_scratch *scratch);
void sbi_hart_get_priv_version_str(struct sbi_scratch *scratch,
				   char *version_str, int nvstr);
void sbi_hart_update_extension(struct sbi_scratch *scratch,
			       enum sbi_hart_extensions ext,
			       bool enable);
bool sbi_hart_has_extension(struct sbi_scratch *scratch,
			    enum sbi_hart_extensions ext);
void sbi_hart_get_extensions_str(struct sbi_scratch *scratch,
				 char *extension_str, int nestr);
bool sbi_hart_has_csr(struct sbi_scratch *scratch, enum sbi_hart_csrs csr);

void __attribute__((noreturn)) sbi_hart_hang(void);

void __attribute__((noreturn))
sbi_hart_switch_mode(unsigned long arg0, unsigned long arg1,
		     unsigned long next_addr, unsigned long next_mode,
		     bool next_virt);

#endif