[PATCH 6/6] lib: sbi_hsm: Introduce hart_secondary_boot() callback
Yu Chien Peter Lin
peterlin at andestech.com
Tue Jan 3 22:29:27 PST 2023
When platform supports hotplug, i.e. both hart_start() and hart_stop()
callbacks are provided, the former doesn't need to be performed at
the boot-time. Thus, add a callback for the case of secondary boot.
Signed-off-by: Yu Chien Peter Lin <peterlin at andestech.com>
---
include/sbi/sbi_hsm.h | 7 +++++++
lib/sbi/sbi_hsm.c | 22 +++++++++++++---------
2 files changed, 20 insertions(+), 9 deletions(-)
diff --git a/include/sbi/sbi_hsm.h b/include/sbi/sbi_hsm.h
index 1e23884..94b3bbb 100644
--- a/include/sbi/sbi_hsm.h
+++ b/include/sbi/sbi_hsm.h
@@ -49,6 +49,13 @@ struct sbi_hsm_device {
* non-retentive suspend.
*/
void (*hart_resume)(void);
+
+ /**
+ * Perform platform-specific actions on non-boot harts at boot-time
+ *
+ * For successful secondary boot, the call will return 0.
+ */
+ int (*hart_secondary_boot)(u32 hartid, ulong saddr);
};
struct sbi_domain;
diff --git a/lib/sbi/sbi_hsm.c b/lib/sbi/sbi_hsm.c
index b89253b..c9ab6a3 100644
--- a/lib/sbi/sbi_hsm.c
+++ b/lib/sbi/sbi_hsm.c
@@ -152,11 +152,18 @@ static bool hsm_device_has_hart_hotplug(void)
static bool hsm_device_has_hart_secondary_boot(void)
{
- if (hsm_dev && hsm_dev->hart_start && !hsm_dev->hart_stop)
+ if (hsm_dev && hsm_dev->hart_secondary_boot)
return true;
return false;
}
+static int hsm_device_hart_secondary_boot(u32 hartid, ulong saddr)
+{
+ if (hsm_dev && hsm_dev->hart_secondary_boot)
+ return hsm_dev->hart_secondary_boot(hartid, saddr);
+ return SBI_ENOTSUPP;
+}
+
static int hsm_device_hart_start(u32 hartid, ulong saddr)
{
if (hsm_dev && hsm_dev->hart_start)
@@ -284,16 +291,13 @@ int sbi_hsm_hart_start(struct sbi_scratch *scratch,
rscratch->next_addr = saddr;
rscratch->next_mode = smode;
- if (hsm_device_has_hart_hotplug() ||
- (hsm_device_has_hart_secondary_boot() && !init_count)) {
+ if (hsm_device_has_hart_secondary_boot() && !init_count)
+ return hsm_device_hart_secondary_boot(hartid, scratch->warmboot_addr);
+
+ if (hsm_device_has_hart_hotplug() && init_count)
return hsm_device_hart_start(hartid, scratch->warmboot_addr);
- } else {
- int rc = sbi_ipi_raw_send(hartid);
- if (rc)
- return rc;
- }
- return 0;
+ return sbi_ipi_raw_send(hartid);
}
int sbi_hsm_hart_stop(struct sbi_scratch *scratch, bool exitnow)
--
2.34.1
More information about the opensbi
mailing list