platform: generic: Allow replacing platform operations

Currently the generic platform follows the middleware pattern: it
implements the sbi_platform hooks, while providing its own set of hooks
for further customization. This has a few disadvantages: each location
where customization is needed requires a separate platform_override
hook, including places where the generic function does nothing except
forward to a platform_override hook, and the extra layer of function
pointers adds runtime overhead.

Let's restructure the generic platform to follow the helper pattern.
Allow platform overrides to treat the generic platform as a template,
adding or replacing the sbi_platform_operations as needed. Export the
generic implementations, so they can be called as helpers from inside
the override functions. With this pattern, the platform_override
function pointers are replaced by direct calls, and the forwarding
functions can be removed.

The forwarding functions are not exported, since there is no reason for
an override to call them. generic_vendor_ext_check() must be rewritten,
since now there is a new way to override vendor_ext_provider.

Signed-off-by: Samuel Holland <samuel.holland@sifive.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
Link: https://lore.kernel.org/r/20250325234342.711447-6-samuel.holland@sifive.com
Signed-off-by: Anup Patel <anup@brainfault.org>
This commit is contained in:
Samuel Holland
2025-03-25 16:43:28 -07:00
committed by Anup Patel
parent e78a0ebdc4
commit 2489e1421d
2 changed files with 38 additions and 20 deletions

View File

@@ -12,6 +12,7 @@
#include <sbi/sbi_ecall.h>
#include <sbi/sbi_hart.h>
#include <sbi/sbi_platform.h>
#include <sbi/sbi_types.h>
#include <sbi/sbi_trap.h>
@@ -37,4 +38,18 @@ struct platform_override {
const struct fdt_match *match);
};
bool generic_cold_boot_allowed(u32 hartid);
int generic_nascent_init(void);
int generic_early_init(bool cold_boot);
int generic_final_init(bool cold_boot);
int generic_extensions_init(struct sbi_hart_features *hfeatures);
int generic_domains_init(void);
int generic_pmu_init(void);
uint64_t generic_pmu_xlate_to_mhpmevent(uint32_t event_idx, uint64_t data);
u64 generic_tlbr_flush_limit(void);
u32 generic_tlb_num_entries(void);
int generic_mpxy_init(void);
extern struct sbi_platform_operations generic_platform_ops;
#endif