lib: sbi: Introduce register_extensions extension callback
authorAndrew Jones <ajones@ventanamicro.com>
Mon, 15 May 2023 11:12:34 +0000 (13:12 +0200)
committerAnup Patel <anup@brainfault.org>
Sun, 21 May 2023 10:57:38 +0000 (16:27 +0530)
Rather than registering all extensions on their behalf in
sbi_ecall_init(), introduce another extension callback and
invoke that instead. For now, implement each callback by
simply registering the extension, which means this patch
has no intended functional change. In later patches, extension
callbacks will be modified to choose when to register and to
possibly narrow the extension ID range prior to registering.
When an extension range needs to remove IDs, leaving gaps, then
multiple invocations of sbi_ecall_register_extension() may be
used. In summary, later patches for current extensions and the
introductions of future extensions will use the new callback to
ensure that only valid extension IDs from the initial range,
which are also available, will be registered.

Signed-off-by: Andrew Jones <ajones@ventanamicro.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
14 files changed:
include/sbi/sbi_ecall.h
lib/sbi/sbi_ecall.c
lib/sbi/sbi_ecall_base.c
lib/sbi/sbi_ecall_cppc.c
lib/sbi/sbi_ecall_dbcn.c
lib/sbi/sbi_ecall_hsm.c
lib/sbi/sbi_ecall_ipi.c
lib/sbi/sbi_ecall_legacy.c
lib/sbi/sbi_ecall_pmu.c
lib/sbi/sbi_ecall_rfence.c
lib/sbi/sbi_ecall_srst.c
lib/sbi/sbi_ecall_susp.c
lib/sbi/sbi_ecall_time.c
lib/sbi/sbi_ecall_vendor.c

index ff9bf8e2b4351a6155ee4be9aa9be43c4d0ed214..fac26429cf5d46d5bb59bb26921b2e8e51105d8c 100644 (file)
@@ -24,6 +24,7 @@ struct sbi_ecall_extension {
        struct sbi_dlist head;
        unsigned long extid_start;
        unsigned long extid_end;
+       int (* register_extensions)(void);
        int (* probe)(unsigned long extid, unsigned long *out_val);
        int (* handle)(unsigned long extid, unsigned long funcid,
                       const struct sbi_trap_regs *regs,
index 76a1ae9ab73372957bc8ebb0905527767bd51b21..3eb4f0addb028cfb538cd58fcbf03cac7f22bc77 100644 (file)
@@ -154,7 +154,10 @@ int sbi_ecall_init(void)
 
        for (i = 0; i < sbi_ecall_exts_size; i++) {
                ext = sbi_ecall_exts[i];
-               ret = sbi_ecall_register_extension(ext);
+               ret = SBI_ENODEV;
+
+               if (ext->register_extensions)
+                       ret = ext->register_extensions();
                if (ret)
                        return ret;
        }
index 786d2ac679240d747e56acfc182e4de2b6e1d431..74f05eb26a35980e744e5758e743d8d6195fb864 100644 (file)
@@ -72,8 +72,16 @@ static int sbi_ecall_base_handler(unsigned long extid, unsigned long funcid,
        return ret;
 }
 
+struct sbi_ecall_extension ecall_base;
+
+static int sbi_ecall_base_register_extensions(void)
+{
+       return sbi_ecall_register_extension(&ecall_base);
+}
+
 struct sbi_ecall_extension ecall_base = {
-       .extid_start = SBI_EXT_BASE,
-       .extid_end = SBI_EXT_BASE,
-       .handle = sbi_ecall_base_handler,
+       .extid_start            = SBI_EXT_BASE,
+       .extid_end              = SBI_EXT_BASE,
+       .register_extensions    = sbi_ecall_base_register_extensions,
+       .handle                 = sbi_ecall_base_handler,
 };
index 91585f3b74e368abc76b2f32a8ef0ae3ce4d4c0b..42ec744c22baf6823488c1b21535af07267e61fa 100644 (file)
@@ -55,9 +55,17 @@ static int sbi_ecall_cppc_probe(unsigned long extid, unsigned long *out_val)
        return 0;
 }
 
+struct sbi_ecall_extension ecall_cppc;
+
+static int sbi_ecall_cppc_register_extensions(void)
+{
+       return sbi_ecall_register_extension(&ecall_cppc);
+}
+
 struct sbi_ecall_extension ecall_cppc = {
-       .extid_start    = SBI_EXT_CPPC,
-       .extid_end      = SBI_EXT_CPPC,
-       .handle         = sbi_ecall_cppc_handler,
-       .probe          = sbi_ecall_cppc_probe,
+       .extid_start            = SBI_EXT_CPPC,
+       .extid_end              = SBI_EXT_CPPC,
+       .register_extensions    = sbi_ecall_cppc_register_extensions,
+       .probe                  = sbi_ecall_cppc_probe,
+       .handle                 = sbi_ecall_cppc_handler,
 };
index fe7e175a64c1e7c64930bfcfcf8b97af7f257bcb..58b19e4468ef4158628aeb563d09d51e6f41c2be 100644 (file)
@@ -64,9 +64,17 @@ static int sbi_ecall_dbcn_probe(unsigned long extid, unsigned long *out_val)
        return 0;
 }
 
+struct sbi_ecall_extension ecall_dbcn;
+
+static int sbi_ecall_dbcn_register_extensions(void)
+{
+       return sbi_ecall_register_extension(&ecall_dbcn);
+}
+
 struct sbi_ecall_extension ecall_dbcn = {
-       .extid_start = SBI_EXT_DBCN,
-       .extid_end = SBI_EXT_DBCN,
-       .handle = sbi_ecall_dbcn_handler,
-       .probe = sbi_ecall_dbcn_probe,
+       .extid_start            = SBI_EXT_DBCN,
+       .extid_end              = SBI_EXT_DBCN,
+       .register_extensions    = sbi_ecall_dbcn_register_extensions,
+       .probe                  = sbi_ecall_dbcn_probe,
+       .handle                 = sbi_ecall_dbcn_handler,
 };
index f1b41d073b22b96fdf7f4d5801aad5273ed9d5da..20705c39513128d431d5a303f51d9ad5d969ce8f 100644 (file)
@@ -54,8 +54,16 @@ static int sbi_ecall_hsm_handler(unsigned long extid, unsigned long funcid,
        return ret;
 }
 
+struct sbi_ecall_extension ecall_hsm;
+
+static int sbi_ecall_hsm_register_extensions(void)
+{
+       return sbi_ecall_register_extension(&ecall_hsm);
+}
+
 struct sbi_ecall_extension ecall_hsm = {
-       .extid_start = SBI_EXT_HSM,
-       .extid_end = SBI_EXT_HSM,
-       .handle = sbi_ecall_hsm_handler,
+       .extid_start            = SBI_EXT_HSM,
+       .extid_end              = SBI_EXT_HSM,
+       .register_extensions    = sbi_ecall_hsm_register_extensions,
+       .handle                 = sbi_ecall_hsm_handler,
 };
index f4797e117a3487d95fd602f4aca137f405c90a46..a40d6b8cc8a801e276a1d0b7dc94d8e6b171f23d 100644 (file)
@@ -29,8 +29,16 @@ static int sbi_ecall_ipi_handler(unsigned long extid, unsigned long funcid,
        return ret;
 }
 
+struct sbi_ecall_extension ecall_ipi;
+
+static int sbi_ecall_ipi_register_extensions(void)
+{
+       return sbi_ecall_register_extension(&ecall_ipi);
+}
+
 struct sbi_ecall_extension ecall_ipi = {
-       .extid_start = SBI_EXT_IPI,
-       .extid_end = SBI_EXT_IPI,
-       .handle = sbi_ecall_ipi_handler,
+       .extid_start            = SBI_EXT_IPI,
+       .extid_end              = SBI_EXT_IPI,
+       .register_extensions    = sbi_ecall_ipi_register_extensions,
+       .handle                 = sbi_ecall_ipi_handler,
 };
index 8237498b538fb668d35b4fa062ed2b455c12ae37..99e862e0f19f719d1dcf5821c73e1fb84ac8eb76 100644 (file)
@@ -117,8 +117,16 @@ static int sbi_ecall_legacy_handler(unsigned long extid, unsigned long funcid,
        return ret;
 }
 
+struct sbi_ecall_extension ecall_legacy;
+
+static int sbi_ecall_legacy_register_extensions(void)
+{
+       return sbi_ecall_register_extension(&ecall_legacy);
+}
+
 struct sbi_ecall_extension ecall_legacy = {
-       .extid_start = SBI_EXT_0_1_SET_TIMER,
-       .extid_end = SBI_EXT_0_1_SHUTDOWN,
-       .handle = sbi_ecall_legacy_handler,
+       .extid_start            = SBI_EXT_0_1_SET_TIMER,
+       .extid_end              = SBI_EXT_0_1_SHUTDOWN,
+       .register_extensions    = sbi_ecall_legacy_register_extensions,
+       .handle                 = sbi_ecall_legacy_handler,
 };
index 367e92774261a13029a6940114269df690764384..b0589d0ecfa1e42ea429d0cbdb840210c5f7a9b2 100644 (file)
@@ -88,9 +88,17 @@ static int sbi_ecall_pmu_probe(unsigned long extid, unsigned long *out_val)
        return 0;
 }
 
+struct sbi_ecall_extension ecall_pmu;
+
+static int sbi_ecall_pmu_register_extensions(void)
+{
+       return sbi_ecall_register_extension(&ecall_pmu);
+}
+
 struct sbi_ecall_extension ecall_pmu = {
-       .extid_start = SBI_EXT_PMU,
-       .extid_end = SBI_EXT_PMU,
-       .handle = sbi_ecall_pmu_handler,
-       .probe = sbi_ecall_pmu_probe,
+       .extid_start            = SBI_EXT_PMU,
+       .extid_end              = SBI_EXT_PMU,
+       .register_extensions    = sbi_ecall_pmu_register_extensions,
+       .probe                  = sbi_ecall_pmu_probe,
+       .handle                 = sbi_ecall_pmu_handler,
 };
index 6334c001d45012cdc42301e571cfeb4c8723ea6f..22c6652278263c231bca09cdc43be74fdb318457 100644 (file)
@@ -79,8 +79,16 @@ static int sbi_ecall_rfence_handler(unsigned long extid, unsigned long funcid,
        return ret;
 }
 
+struct sbi_ecall_extension ecall_rfence;
+
+static int sbi_ecall_rfence_register_extensions(void)
+{
+       return sbi_ecall_register_extension(&ecall_rfence);
+}
+
 struct sbi_ecall_extension ecall_rfence = {
-       .extid_start = SBI_EXT_RFENCE,
-       .extid_end = SBI_EXT_RFENCE,
-       .handle = sbi_ecall_rfence_handler,
+       .extid_start            = SBI_EXT_RFENCE,
+       .extid_end              = SBI_EXT_RFENCE,
+       .register_extensions    = sbi_ecall_rfence_register_extensions,
+       .handle                 = sbi_ecall_rfence_handler,
 };
index 93b012ce024cb8aa7f923a18f2781387388bf777..ad31537604a3e14aac7d3bfaca6c4ea6e0183b1d 100644 (file)
@@ -67,9 +67,17 @@ static int sbi_ecall_srst_probe(unsigned long extid, unsigned long *out_val)
        return 0;
 }
 
+struct sbi_ecall_extension ecall_srst;
+
+static int sbi_ecall_srst_register_extensions(void)
+{
+       return sbi_ecall_register_extension(&ecall_srst);
+}
+
 struct sbi_ecall_extension ecall_srst = {
-       .extid_start = SBI_EXT_SRST,
-       .extid_end = SBI_EXT_SRST,
-       .handle = sbi_ecall_srst_handler,
-       .probe = sbi_ecall_srst_probe,
+       .extid_start            = SBI_EXT_SRST,
+       .extid_end              = SBI_EXT_SRST,
+       .register_extensions    = sbi_ecall_srst_register_extensions,
+       .probe                  = sbi_ecall_srst_probe,
+       .handle                 = sbi_ecall_srst_handler,
 };
index f20126c49a6076a6373cd1f2bc52c76402f2c337..bfbdbe6486251bc2bc837274819165b65dd9e200 100644 (file)
@@ -40,9 +40,17 @@ static int sbi_ecall_susp_probe(unsigned long extid, unsigned long *out_val)
        return 0;
 }
 
+struct sbi_ecall_extension ecall_susp;
+
+static int sbi_ecall_susp_register_extensions(void)
+{
+       return sbi_ecall_register_extension(&ecall_susp);
+}
+
 struct sbi_ecall_extension ecall_susp = {
-       .extid_start = SBI_EXT_SUSP,
-       .extid_end = SBI_EXT_SUSP,
-       .handle = sbi_ecall_susp_handler,
-       .probe = sbi_ecall_susp_probe,
+       .extid_start            = SBI_EXT_SUSP,
+       .extid_end              = SBI_EXT_SUSP,
+       .register_extensions    = sbi_ecall_susp_register_extensions,
+       .probe                  = sbi_ecall_susp_probe,
+       .handle                 = sbi_ecall_susp_handler,
 };
index 668cb17680c05bd85629726e186871ec29d4826b..e79196f77adc1260c259d69e1b9019d3083d5d2e 100644 (file)
@@ -33,8 +33,16 @@ static int sbi_ecall_time_handler(unsigned long extid, unsigned long funcid,
        return ret;
 }
 
+struct sbi_ecall_extension ecall_time;
+
+static int sbi_ecall_time_register_extensions(void)
+{
+       return sbi_ecall_register_extension(&ecall_time);
+}
+
 struct sbi_ecall_extension ecall_time = {
-       .extid_start = SBI_EXT_TIME,
-       .extid_end = SBI_EXT_TIME,
-       .handle = sbi_ecall_time_handler,
+       .extid_start            = SBI_EXT_TIME,
+       .extid_end              = SBI_EXT_TIME,
+       .register_extensions    = sbi_ecall_time_register_extensions,
+       .handle                 = sbi_ecall_time_handler,
 };
index 8b8dab00c92d6cd532a854b0207d4a6ecd22e458..126156f79a12603dee7253125ba62f07da38bc44 100644 (file)
@@ -47,9 +47,17 @@ static int sbi_ecall_vendor_handler(unsigned long extid, unsigned long funcid,
                                                out_val, out_trap);
 }
 
+struct sbi_ecall_extension ecall_vendor;
+
+static int sbi_ecall_vendor_register_extensions(void)
+{
+       return sbi_ecall_register_extension(&ecall_vendor);
+}
+
 struct sbi_ecall_extension ecall_vendor = {
-       .extid_start = SBI_EXT_VENDOR_START,
-       .extid_end = SBI_EXT_VENDOR_END,
-       .probe = sbi_ecall_vendor_probe,
-       .handle = sbi_ecall_vendor_handler,
+       .extid_start            = SBI_EXT_VENDOR_START,
+       .extid_end              = SBI_EXT_VENDOR_END,
+       .register_extensions    = sbi_ecall_vendor_register_extensions,
+       .probe                  = sbi_ecall_vendor_probe,
+       .handle                 = sbi_ecall_vendor_handler,
 };