mirror of
https://github.com/riscv-software-src/opensbi.git
synced 2025-12-17 04:21:39 +00:00
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 <apatel@ventanamicro.com> Link: https://lore.kernel.org/r/20251209135235.423391-3-apatel@ventanamicro.com Signed-off-by: Anup Patel <anup@brainfault.org>
This commit is contained in:
@@ -75,6 +75,7 @@ libsbi-objs-y += sbi_emulate_csr.o
|
||||
libsbi-objs-y += sbi_fifo.o
|
||||
libsbi-objs-y += sbi_fwft.o
|
||||
libsbi-objs-y += sbi_hart.o
|
||||
libsbi-objs-y += sbi_hart_protection.o
|
||||
libsbi-objs-y += sbi_heap.o
|
||||
libsbi-objs-y += sbi_math.o
|
||||
libsbi-objs-y += sbi_hfence.o
|
||||
|
||||
96
lib/sbi/sbi_hart_protection.c
Normal file
96
lib/sbi/sbi_hart_protection.c
Normal file
@@ -0,0 +1,96 @@
|
||||
/*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*
|
||||
* Copyright (c) 2025 Ventana Micro Systems Inc.
|
||||
*/
|
||||
|
||||
#include <sbi/sbi_error.h>
|
||||
#include <sbi/sbi_hart_protection.h>
|
||||
#include <sbi/sbi_scratch.h>
|
||||
|
||||
static SBI_LIST_HEAD(hart_protection_list);
|
||||
|
||||
struct sbi_hart_protection *sbi_hart_protection_best(void)
|
||||
{
|
||||
if (sbi_list_empty(&hart_protection_list))
|
||||
return NULL;
|
||||
|
||||
return sbi_list_first_entry(&hart_protection_list, struct sbi_hart_protection, head);
|
||||
}
|
||||
|
||||
int sbi_hart_protection_register(struct sbi_hart_protection *hprot)
|
||||
{
|
||||
struct sbi_hart_protection *pos = NULL;
|
||||
bool found_pos = false;
|
||||
|
||||
if (!hprot)
|
||||
return SBI_EINVAL;
|
||||
|
||||
sbi_list_for_each_entry(pos, &hart_protection_list, head) {
|
||||
if (hprot->rating > pos->rating) {
|
||||
found_pos = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (found_pos)
|
||||
sbi_list_add_tail(&hprot->head, &pos->head);
|
||||
else
|
||||
sbi_list_add_tail(&hprot->head, &hart_protection_list);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void sbi_hart_protection_unregister(struct sbi_hart_protection *hprot)
|
||||
{
|
||||
if (!hprot)
|
||||
return;
|
||||
|
||||
sbi_list_del(&hprot->head);
|
||||
}
|
||||
|
||||
int sbi_hart_protection_configure(struct sbi_scratch *scratch)
|
||||
{
|
||||
struct sbi_hart_protection *hprot = sbi_hart_protection_best();
|
||||
|
||||
if (!hprot)
|
||||
return SBI_EINVAL;
|
||||
if (!hprot->configure)
|
||||
return SBI_ENOSYS;
|
||||
|
||||
return hprot->configure(scratch);
|
||||
}
|
||||
|
||||
void sbi_hart_protection_unconfigure(struct sbi_scratch *scratch)
|
||||
{
|
||||
struct sbi_hart_protection *hprot = sbi_hart_protection_best();
|
||||
|
||||
if (!hprot || !hprot->unconfigure)
|
||||
return;
|
||||
|
||||
hprot->unconfigure(scratch);
|
||||
}
|
||||
|
||||
int sbi_hart_protection_map_range(unsigned long base, unsigned long size)
|
||||
{
|
||||
struct sbi_hart_protection *hprot = sbi_hart_protection_best();
|
||||
|
||||
if (!hprot)
|
||||
return SBI_EINVAL;
|
||||
if (!hprot->map_range)
|
||||
return 0;
|
||||
|
||||
return hprot->map_range(sbi_scratch_thishart_ptr(), base, size);
|
||||
}
|
||||
|
||||
int sbi_hart_protection_unmap_range(unsigned long base, unsigned long size)
|
||||
{
|
||||
struct sbi_hart_protection *hprot = sbi_hart_protection_best();
|
||||
|
||||
if (!hprot)
|
||||
return SBI_EINVAL;
|
||||
if (!hprot->unmap_range)
|
||||
return 0;
|
||||
|
||||
return hprot->unmap_range(sbi_scratch_thishart_ptr(), base, size);
|
||||
}
|
||||
@@ -18,6 +18,7 @@
|
||||
#include <sbi/sbi_fwft.h>
|
||||
#include <sbi/sbi_hart.h>
|
||||
#include <sbi/sbi_hartmask.h>
|
||||
#include <sbi/sbi_hart_protection.h>
|
||||
#include <sbi/sbi_heap.h>
|
||||
#include <sbi/sbi_hsm.h>
|
||||
#include <sbi/sbi_ipi.h>
|
||||
@@ -74,6 +75,7 @@ static void sbi_boot_print_general(struct sbi_scratch *scratch)
|
||||
const struct sbi_hsm_device *hdev;
|
||||
const struct sbi_ipi_device *idev;
|
||||
const struct sbi_timer_device *tdev;
|
||||
const struct sbi_hart_protection *hprot;
|
||||
const struct sbi_console_device *cdev;
|
||||
const struct sbi_system_reset_device *srdev;
|
||||
const struct sbi_system_suspend_device *susp_dev;
|
||||
@@ -90,6 +92,9 @@ static void sbi_boot_print_general(struct sbi_scratch *scratch)
|
||||
sbi_printf("Platform Features : %s\n", str);
|
||||
sbi_printf("Platform HART Count : %u\n",
|
||||
sbi_platform_hart_count(plat));
|
||||
hprot = sbi_hart_protection_best();
|
||||
sbi_printf("Platform HART Protection : %s\n",
|
||||
(hprot) ? hprot->name : "---");
|
||||
idev = sbi_ipi_get_device();
|
||||
sbi_printf("Platform IPI Device : %s\n",
|
||||
(idev) ? idev->name : "---");
|
||||
|
||||
Reference in New Issue
Block a user