aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAnup Patel <anup.patel@wdc.com>2021-04-22 14:14:02 +0530
committerAnup Patel <anup@brainfault.org>2021-04-28 17:31:07 +0530
commita84a1ddbbabb2389b5af91473250d0aff90e40d7 (patch)
tree23d28621efd4573e17ded43bbb474600084e5b32 /lib
parent043d088e3964ec64b091f739e2282f53f7d264fb (diff)
downloadopensbi-a84a1ddbbabb2389b5af91473250d0aff90e40d7.zip
opensbi-a84a1ddbbabb2389b5af91473250d0aff90e40d7.tar.gz
opensbi-a84a1ddbbabb2389b5af91473250d0aff90e40d7.tar.bz2
lib: sbi: Simplify HSM platform operations
Instead of having hsm_start(), hsm_stop() and hsm_suspend() callbacks in platform operations, it will be much simpler for HSM driver to directly register these operations as a device to the sbi_hsm implementation. Signed-off-by: Anup Patel <anup.patel@wdc.com> Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Diffstat (limited to 'lib')
-rw-r--r--lib/sbi/sbi_hsm.c68
-rw-r--r--lib/sbi/sbi_platform.c6
2 files changed, 56 insertions, 18 deletions
diff --git a/lib/sbi/sbi_hsm.c b/lib/sbi/sbi_hsm.c
index 64d299b..4662150 100644
--- a/lib/sbi/sbi_hsm.c
+++ b/lib/sbi/sbi_hsm.c
@@ -21,11 +21,12 @@
#include <sbi/sbi_hsm.h>
#include <sbi/sbi_init.h>
#include <sbi/sbi_ipi.h>
-#include <sbi/sbi_platform.h>
+#include <sbi/sbi_scratch.h>
#include <sbi/sbi_system.h>
#include <sbi/sbi_timer.h>
#include <sbi/sbi_console.h>
+static const struct sbi_hsm_device *hsm_dev = NULL;
static unsigned long hart_data_offset;
/** Per hart specific data to manage state transition **/
@@ -129,6 +130,54 @@ static void sbi_hsm_hart_wait(struct sbi_scratch *scratch, u32 hartid)
*/
}
+const struct sbi_hsm_device *sbi_hsm_get_device(void)
+{
+ return hsm_dev;
+}
+
+void sbi_hsm_set_device(const struct sbi_hsm_device *dev)
+{
+ if (!dev || hsm_dev)
+ return;
+
+ hsm_dev = dev;
+}
+
+static bool hsm_device_has_hart_hotplug(void)
+{
+ if (hsm_dev && hsm_dev->hart_start && hsm_dev->hart_stop)
+ return true;
+ return false;
+}
+
+static bool hsm_device_has_hart_secondary_boot(void)
+{
+ if (hsm_dev && hsm_dev->hart_start && !hsm_dev->hart_stop)
+ return true;
+ return false;
+}
+
+static int hsm_device_hart_start(u32 hartid, ulong saddr)
+{
+ if (hsm_dev && hsm_dev->hart_start)
+ return hsm_dev->hart_start(hartid, saddr);
+ return SBI_ENOTSUPP;
+}
+
+static int hsm_device_hart_stop(void)
+{
+ if (hsm_dev && hsm_dev->hart_stop)
+ return hsm_dev->hart_stop();
+ return SBI_ENOTSUPP;
+}
+
+static int hsm_device_hart_suspend(u32 suspend_type, ulong raddr)
+{
+ if (hsm_dev && hsm_dev->hart_suspend)
+ return hsm_dev->hart_suspend(suspend_type, raddr);
+ return SBI_ENOTSUPP;
+}
+
int sbi_hsm_init(struct sbi_scratch *scratch, u32 hartid, bool cold_boot)
{
u32 i;
@@ -164,7 +213,6 @@ int sbi_hsm_init(struct sbi_scratch *scratch, u32 hartid, bool cold_boot)
void __noreturn sbi_hsm_exit(struct sbi_scratch *scratch)
{
u32 hstate;
- const struct sbi_platform *plat = sbi_platform_ptr(scratch);
struct sbi_hsm_data *hdata = sbi_scratch_offset_ptr(scratch,
hart_data_offset);
void (*jump_warmboot)(void) = (void (*)(void))scratch->warmboot_addr;
@@ -174,8 +222,8 @@ void __noreturn sbi_hsm_exit(struct sbi_scratch *scratch)
if (hstate != SBI_HSM_STATE_STOP_PENDING)
goto fail_exit;
- if (sbi_platform_has_hart_hotplug(plat)) {
- sbi_platform_hart_stop(plat);
+ if (hsm_device_has_hart_hotplug()) {
+ hsm_device_hart_stop();
/* It should never reach here */
goto fail_exit;
}
@@ -201,7 +249,6 @@ int sbi_hsm_hart_start(struct sbi_scratch *scratch,
unsigned int hstate;
struct sbi_scratch *rscratch;
struct sbi_hsm_data *hdata;
- const struct sbi_platform *plat = sbi_platform_ptr(scratch);
/* For now, we only allow start mode to be S-mode or U-mode. */
if (smode != PRV_S && smode != PRV_U)
@@ -233,10 +280,9 @@ int sbi_hsm_hart_start(struct sbi_scratch *scratch,
rscratch->next_addr = saddr;
rscratch->next_mode = smode;
- if (sbi_platform_has_hart_hotplug(plat) ||
- (sbi_platform_has_hart_secondary_boot(plat) && !init_count)) {
- return sbi_platform_hart_start(plat, hartid,
- scratch->warmboot_addr);
+ if (hsm_device_has_hart_hotplug() ||
+ (hsm_device_has_hart_secondary_boot() && !init_count)) {
+ return hsm_device_hart_start(hartid, scratch->warmboot_addr);
} else {
sbi_ipi_raw_send(hartid);
}
@@ -374,7 +420,6 @@ int sbi_hsm_hart_suspend(struct sbi_scratch *scratch, u32 suspend_type,
{
int oldstate, ret;
const struct sbi_domain *dom = sbi_domain_thishart_ptr();
- const struct sbi_platform *plat = sbi_platform_ptr(scratch);
struct sbi_hsm_data *hdata = sbi_scratch_offset_ptr(scratch,
hart_data_offset);
@@ -420,8 +465,7 @@ int sbi_hsm_hart_suspend(struct sbi_scratch *scratch, u32 suspend_type,
hdata->suspend_type = suspend_type;
/* Try platform specific suspend */
- ret = sbi_platform_hart_suspend(plat, suspend_type,
- scratch->warmboot_addr);
+ ret = hsm_device_hart_suspend(suspend_type, scratch->warmboot_addr);
if (ret == SBI_ENOTSUPP) {
/* Try generic implementation of default suspend types */
if (suspend_type == SBI_HSM_SUSPEND_RET_DEFAULT) {
diff --git a/lib/sbi/sbi_platform.c b/lib/sbi/sbi_platform.c
index e78119a..e8b94a3 100644
--- a/lib/sbi/sbi_platform.c
+++ b/lib/sbi/sbi_platform.c
@@ -19,15 +19,9 @@ static inline char *sbi_platform_feature_id2string(unsigned long feature)
return NULL;
switch (feature) {
- case SBI_PLATFORM_HAS_HART_HOTPLUG:
- fstr = "hotplug";
- break;
case SBI_PLATFORM_HAS_MFAULTS_DELEGATION:
fstr = "mfdeleg";
break;
- case SBI_PLATFORM_HAS_HART_SECONDARY_BOOT:
- fstr = "sec_boot";
- break;
default:
break;
}