Skip to content
This repository was archived by the owner on Nov 22, 2022. It is now read-only.
2 changes: 1 addition & 1 deletion opensbi
4 changes: 0 additions & 4 deletions plat/generic/include/platform_override.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,6 @@ struct platform_override {
int (*final_init)(bool cold_boot, const struct fdt_match *match);
void (*early_exit)(const struct fdt_match *match);
void (*final_exit)(const struct fdt_match *match);
int (*system_reset_check)(u32 reset_type, u32 reset_reason,
const struct fdt_match *match);
void (*system_reset)(u32 reset_type, u32 reset_reason,
const struct fdt_match *match);
int (*fdt_fixup)(void *fdt, const struct fdt_match *match);
};

Expand Down
10 changes: 10 additions & 0 deletions plat/generic/objects.mk
Original file line number Diff line number Diff line change
@@ -1,3 +1,12 @@
#
# SPDX-License-Identifier: BSD-2-Clause
#
# Copyright (c) 2020 Western Digital Corporation or its affiliates.
#
# Authors:
# Anup Patel <[email protected]>
#

ifdef PLATFORM
platform-genflags-y += "-DTARGET_PLATFORM_HEADER=\"platform/$(PLATFORM)/platform.h\""
else
Expand Down Expand Up @@ -35,3 +44,4 @@ platform-objs-y += ../../src/plugins/plugins.o

platform-objs-y += platform.o
platform-objs-y += sifive_fu540.o
platform-objs-y += sifive_fu740.o
68 changes: 33 additions & 35 deletions plat/generic/platform.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
#include <sbi_utils/fdt/fdt_domain.h>
#include <sbi_utils/fdt/fdt_fixup.h>
#include <sbi_utils/fdt/fdt_helper.h>
#include <sbi_utils/fdt/fdt_pmu.h>
#include <sbi_utils/irqchip/fdt_irqchip.h>
#include <sbi_utils/serial/fdt_serial.h>
#include <sbi_utils/timer/fdt_timer.h>
Expand All @@ -24,9 +25,11 @@
#include "sm.h"

extern const struct platform_override sifive_fu540;
extern const struct platform_override sifive_fu740;

static const struct platform_override *special_platforms[] = {
&sifive_fu540,
&sifive_fu740,
};

static const struct platform_override *generic_plat = NULL;
Expand Down Expand Up @@ -86,7 +89,7 @@ unsigned long fw_platform_init(unsigned long arg0, unsigned long arg1,

model = fdt_getprop(fdt, root_offset, "model", &len);
if (model)
sbi_strncpy(platform.name, model, sizeof(platform.name));
sbi_strncpy(platform.name, model, sizeof(platform.name) - 1);

if (generic_plat && generic_plat->features)
platform.features = generic_plat->features(generic_plat_match);
Expand Down Expand Up @@ -118,37 +121,32 @@ unsigned long fw_platform_init(unsigned long arg0, unsigned long arg1,

static int generic_early_init(bool cold_boot)
{
int rc;

if (generic_plat && generic_plat->early_init) {
rc = generic_plat->early_init(cold_boot, generic_plat_match);
if (rc)
return rc;
}

if (!cold_boot)
if (!generic_plat || !generic_plat->early_init)
return 0;

return fdt_reset_init();
return generic_plat->early_init(cold_boot, generic_plat_match);
}

static int generic_final_init(bool cold_boot)
{
void *fdt;
int rc;

if (cold_boot)
fdt_reset_init();

if (generic_plat && generic_plat->final_init) {
rc = generic_plat->final_init(cold_boot, generic_plat_match);
if (rc)
return rc;
}

sm_init(cold_boot);
sm_init(cold_boot);

if (!cold_boot)
return 0;

fdt = sbi_scratch_thishart_arg1_ptr();
fdt = fdt_get_address();

fdt_cpu_fixup(fdt);
fdt_fixups(fdt);
Expand Down Expand Up @@ -177,7 +175,7 @@ static void generic_final_exit(void)

static int generic_domains_init(void)
{
return fdt_domains_populate(sbi_scratch_thishart_arg1_ptr());
return fdt_domains_populate(fdt_get_address());
}

static u64 generic_tlbr_flush_limit(void)
Expand All @@ -187,24 +185,31 @@ static u64 generic_tlbr_flush_limit(void)
return SBI_PLATFORM_TLB_RANGE_FLUSH_LIMIT_DEFAULT;
}

static int generic_system_reset_check(u32 reset_type, u32 reset_reason)
static int generic_pmu_init(void)
{
if (generic_plat && generic_plat->system_reset_check)
return generic_plat->system_reset_check(reset_type,
reset_reason,
generic_plat_match);
return fdt_system_reset_check(reset_type, reset_reason);
return fdt_pmu_setup(fdt_get_address());
}

static void generic_system_reset(u32 reset_type, u32 reset_reason)
static uint64_t generic_pmu_xlate_to_mhpmevent(uint32_t event_idx,
uint64_t data)
{
if (generic_plat && generic_plat->system_reset) {
generic_plat->system_reset(reset_type, reset_reason,
generic_plat_match);
return;
uint64_t evt_val = 0;

/* data is valid only for raw events and is equal to event selector */
if (event_idx == SBI_PMU_EVENT_RAW_IDX)
evt_val = data;
else {
/**
* Generic platform follows the SBI specification recommendation
* i.e. zero extended event_idx is used as mhpmevent value for
* hardware general/cache events if platform does't define one.
*/
evt_val = fdt_pmu_get_select_value(event_idx);
if (!evt_val)
evt_val = (uint64_t)event_idx;
}

fdt_system_reset(reset_type, reset_reason);
return evt_val;
}

const struct sbi_platform_operations platform_ops = {
Expand All @@ -213,23 +218,16 @@ const struct sbi_platform_operations platform_ops = {
.early_exit = generic_early_exit,
.final_exit = generic_final_exit,
.domains_init = generic_domains_init,
.console_putc = fdt_serial_putc,
.console_getc = fdt_serial_getc,
.console_init = fdt_serial_init,
.irqchip_init = fdt_irqchip_init,
.irqchip_exit = fdt_irqchip_exit,
.ipi_send = fdt_ipi_send,
.ipi_clear = fdt_ipi_clear,
.ipi_init = fdt_ipi_init,
.ipi_exit = fdt_ipi_exit,
.pmu_init = generic_pmu_init,
.pmu_xlate_to_mhpmevent = generic_pmu_xlate_to_mhpmevent,
.get_tlbr_flush_limit = generic_tlbr_flush_limit,
.timer_value = fdt_timer_value,
.timer_event_stop = fdt_timer_event_stop,
.timer_event_start = fdt_timer_event_start,
.timer_init = fdt_timer_init,
.timer_exit = fdt_timer_exit,
.system_reset_check = generic_system_reset_check,
.system_reset = generic_system_reset,
};

struct sbi_platform platform = {
Expand Down
Loading