mirror of
https://github.com/riscv-software-src/opensbi.git
synced 2025-08-25 15:51:41 +01:00
sbi: sbi_pmu: Improve sbi_pmu_init() error handling
This patch makes the following changes: - As sbi_platform_pmu_init() returns a negative error code on failure, let sbi_pmu_init() print out the error code with sbi_dprintf(). - In order to distinguish the SBI_EFAIL error returned by sbi_pmu_add_*_counter_map(), return SBI_ENOENT to indicate that fdt_pmu_setup() failed to locate "riscv,pmu" node, and generic_pmu_init() ignores such case. Signed-off-by: Yu Chien Peter Lin <peterlin@andestech.com> Reviewed-by: Anup Patel <anup@brainfault.org> Reviewed-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com> Reviewed-by: Atish Patra <atishp@rivosinc.com>
This commit is contained in:

committed by
Anup Patel

parent
bd74931d79
commit
291403f6f2
@@ -957,6 +957,7 @@ int sbi_pmu_init(struct sbi_scratch *scratch, bool cold_boot)
|
|||||||
int hpm_count = sbi_fls(sbi_hart_mhpm_mask(scratch));
|
int hpm_count = sbi_fls(sbi_hart_mhpm_mask(scratch));
|
||||||
struct sbi_pmu_hart_state *phs;
|
struct sbi_pmu_hart_state *phs;
|
||||||
const struct sbi_platform *plat;
|
const struct sbi_platform *plat;
|
||||||
|
int rc;
|
||||||
|
|
||||||
if (cold_boot) {
|
if (cold_boot) {
|
||||||
hw_event_map = sbi_calloc(sizeof(*hw_event_map),
|
hw_event_map = sbi_calloc(sizeof(*hw_event_map),
|
||||||
@@ -972,7 +973,10 @@ int sbi_pmu_init(struct sbi_scratch *scratch, bool cold_boot)
|
|||||||
|
|
||||||
plat = sbi_platform_ptr(scratch);
|
plat = sbi_platform_ptr(scratch);
|
||||||
/* Initialize hw pmu events */
|
/* Initialize hw pmu events */
|
||||||
sbi_platform_pmu_init(plat);
|
rc = sbi_platform_pmu_init(plat);
|
||||||
|
if (rc)
|
||||||
|
sbi_dprintf("%s: platform pmu init failed "
|
||||||
|
"(error %d)\n", __func__, rc);
|
||||||
|
|
||||||
/* mcycle & minstret is available always */
|
/* mcycle & minstret is available always */
|
||||||
if (!hpm_count)
|
if (!hpm_count)
|
||||||
|
@@ -74,7 +74,7 @@ int fdt_pmu_setup(void *fdt)
|
|||||||
|
|
||||||
pmu_offset = fdt_node_offset_by_compatible(fdt, -1, "riscv,pmu");
|
pmu_offset = fdt_node_offset_by_compatible(fdt, -1, "riscv,pmu");
|
||||||
if (pmu_offset < 0)
|
if (pmu_offset < 0)
|
||||||
return SBI_EFAIL;
|
return SBI_ENOENT;
|
||||||
|
|
||||||
event_ctr_map = fdt_getprop(fdt, pmu_offset,
|
event_ctr_map = fdt_getprop(fdt, pmu_offset,
|
||||||
"riscv,event-to-mhpmcounters", &len);
|
"riscv,event-to-mhpmcounters", &len);
|
||||||
|
@@ -265,7 +265,13 @@ static u32 generic_tlb_num_entries(void)
|
|||||||
|
|
||||||
static int generic_pmu_init(void)
|
static int generic_pmu_init(void)
|
||||||
{
|
{
|
||||||
return fdt_pmu_setup(fdt_get_address());
|
int rc;
|
||||||
|
|
||||||
|
rc = fdt_pmu_setup(fdt_get_address());
|
||||||
|
if (rc && rc != SBI_ENOENT)
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint64_t generic_pmu_xlate_to_mhpmevent(uint32_t event_idx,
|
static uint64_t generic_pmu_xlate_to_mhpmevent(uint32_t event_idx,
|
||||||
|
Reference in New Issue
Block a user