forked from Mirrors/opensbi

It is possible to guess privileged spec versions based on the CSRs that where introduced in different privileged spec versions. In future, if we are not able guess privileged spec version then we can have platform provide it. We add privileged spec version as per-hart feature and try to guess it based on presence of mcounteren, mcountinhibit, and menvcfg CSRs. Signed-off-by: Anup Patel <apatel@ventanamicro.com> Reviewed-by: Atish Patra <atishp@rivosinc.com>
86 lines
2.7 KiB
C
86 lines
2.7 KiB
C
/*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*
|
|
* Copyright (c) 2019 Western Digital Corporation or its affiliates.
|
|
*
|
|
* Authors:
|
|
* Anup Patel <anup.patel@wdc.com>
|
|
*/
|
|
|
|
#ifndef __SBI_HART_H__
|
|
#define __SBI_HART_H__
|
|
|
|
#include <sbi/sbi_types.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 feature flags of a hart */
|
|
enum sbi_hart_features {
|
|
/** Hart has S-mode counter enable */
|
|
SBI_HART_HAS_SCOUNTEREN = (1 << 0),
|
|
/** Hart has M-mode counter enable */
|
|
SBI_HART_HAS_MCOUNTEREN = (1 << 1),
|
|
/** Hart has counter inhibit CSR */
|
|
SBI_HART_HAS_MCOUNTINHIBIT = (1 << 2),
|
|
/** Hart has sscofpmf extension */
|
|
SBI_HART_HAS_SSCOFPMF = (1 << 3),
|
|
/** HART has timer csr implementation in hardware */
|
|
SBI_HART_HAS_TIME = (1 << 4),
|
|
/** HART has AIA local interrupt CSRs */
|
|
SBI_HART_HAS_AIA = (1 << 5),
|
|
/** HART has menvcfg CSR */
|
|
SBI_HART_HAS_MENVCFG = (1 << 6),
|
|
/** HART has mstateen CSR **/
|
|
SBI_HART_HAS_SMSTATEEN = (1 << 7),
|
|
/** HART has SSTC extension implemented in hardware */
|
|
SBI_HART_HAS_SSTC = (1 << 8),
|
|
|
|
/** Last index of Hart features*/
|
|
SBI_HART_HAS_LAST_FEATURE = SBI_HART_HAS_SSTC,
|
|
};
|
|
|
|
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);
|
|
static inline ulong sbi_hart_expected_trap_addr(void)
|
|
{
|
|
return (ulong)sbi_hart_expected_trap;
|
|
}
|
|
|
|
unsigned int sbi_hart_mhpm_count(struct sbi_scratch *scratch);
|
|
void sbi_hart_delegation_dump(struct sbi_scratch *scratch,
|
|
const char *prefix, const char *suffix);
|
|
unsigned int sbi_hart_pmp_count(struct sbi_scratch *scratch);
|
|
unsigned long sbi_hart_pmp_granularity(struct sbi_scratch *scratch);
|
|
unsigned int sbi_hart_pmp_addrbits(struct sbi_scratch *scratch);
|
|
unsigned int sbi_hart_mhpm_bits(struct sbi_scratch *scratch);
|
|
int sbi_hart_pmp_configure(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);
|
|
bool sbi_hart_has_feature(struct sbi_scratch *scratch, unsigned long feature);
|
|
void sbi_hart_get_features_str(struct sbi_scratch *scratch,
|
|
char *features_str, int nfstr);
|
|
|
|
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
|