From 809df05c35ae20d6b68676c24640f92fa0e2666c Mon Sep 17 00:00:00 2001 From: Anup Patel Date: Tue, 9 Dec 2025 19:22:32 +0530 Subject: lib: sbi: Introduce hart protection abstraction Currently, PMP and ePMP are the only hart protection mechanisms available in OpenSBI but new protection mechanisms (such as Smmpt) will be added in the near future. To allow multiple hart protection mechanisms, introduce hart protection abstraction and related APIs. Signed-off-by: Anup Patel Link: https://lore.kernel.org/r/20251209135235.423391-3-apatel@ventanamicro.com Signed-off-by: Anup Patel --- include/sbi/sbi_hart_protection.h | 100 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 include/sbi/sbi_hart_protection.h (limited to 'include') diff --git a/include/sbi/sbi_hart_protection.h b/include/sbi/sbi_hart_protection.h new file mode 100644 index 00000000..d65f32ca --- /dev/null +++ b/include/sbi/sbi_hart_protection.h @@ -0,0 +1,100 @@ +/* + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2025 Ventana Micro Systems Inc. + */ + +#ifndef __SBI_HART_PROTECTION_H__ +#define __SBI_HART_PROTECTION_H__ + +#include +#include + +struct sbi_scratch; + +/** Representation of hart protection mechanism */ +struct sbi_hart_protection { + /** List head */ + struct sbi_dlist head; + + /** Name of the hart protection mechanism */ + char name[32]; + + /** Ratings of the hart protection mechanism (higher is better) */ + unsigned long rating; + + /** Configure protection for current HART (Mandatory) */ + int (*configure)(struct sbi_scratch *scratch); + + /** Unconfigure protection for current HART (Mandatory) */ + void (*unconfigure)(struct sbi_scratch *scratch); + + /** Create temporary mapping to access address range on current HART (Optional) */ + int (*map_range)(struct sbi_scratch *scratch, + unsigned long base, unsigned long size); + + /** Destroy temporary mapping on current HART (Optional) */ + int (*unmap_range)(struct sbi_scratch *scratch, + unsigned long base, unsigned long size); +}; + +/** + * Get the best hart protection mechanism + * + * @return pointer to best hart protection mechanism + */ +struct sbi_hart_protection *sbi_hart_protection_best(void); + +/** + * Register a hart protection mechanism + * + * @param hprot pointer to hart protection mechanism + * + * @return 0 on success and negative error code on failure + */ +int sbi_hart_protection_register(struct sbi_hart_protection *hprot); + +/** + * Unregister a hart protection mechanism + * + * @param hprot pointer to hart protection mechanism + */ +void sbi_hart_protection_unregister(struct sbi_hart_protection *hprot); + +/** + * Configure protection for current HART + * + * @param scratch pointer to scratch space of current HART + * + * @return 0 on success and negative error code on failure + */ +int sbi_hart_protection_configure(struct sbi_scratch *scratch); + +/** + * Unconfigure protection for current HART + * + * @param scratch pointer to scratch space of current HART + */ +void sbi_hart_protection_unconfigure(struct sbi_scratch *scratch); + +/** + * Create temporary mapping to access address range on current HART + * + * @param base base address of the temporary mapping + * @param size size of the temporary mapping + * + * @return 0 on success and negative error code on failure + */ +int sbi_hart_protection_map_range(unsigned long base, unsigned long size); + +/** + * Destroy temporary mapping to access address range on current HART + * + * @param base base address of the temporary mapping + * @param size size of the temporary mapping + * + * @return 0 on success and negative error code on failure + */ +int sbi_hart_protection_unmap_range(unsigned long base, unsigned long size); + +#endif /* __SBI_HART_PROTECTION_H__ */ -- cgit v1.3.1