firmware: stratix10-svc: extend SVC driver to get the firmware version
authorRichard Gong <richard.gong@intel.com>
Wed, 23 Feb 2022 14:49:08 +0000 (08:49 -0600)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 25 Feb 2022 10:54:25 +0000 (11:54 +0100)
Extend Intel service layer driver to get the firmware version running at
FPGA device. Therefore FPGA manager driver, one of Intel service layer
driver's client, can decide whether to handle the newly added bitstream
authentication function based on the retrieved firmware version.

Link: https://lore.kernel.org/lkml/1617114785-22211-2-git-send-email-richard.gong@linux.intel.com
Acked-by: Moritz Fischr <mdf@kernel.org>
Signed-off-by: Richard Gong <richard.gong@intel.com>
Signed-off-by: Dinh Nguyen <dinguyen@kernel.org>
Link: https://lore.kernel.org/r/20220223144908.399522-2-dinguyen@kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/firmware/stratix10-svc.c
include/linux/firmware/intel/stratix10-smc.h
include/linux/firmware/intel/stratix10-svc-client.h

index 29c0a616b317744bcce9771078e1d76abfa206e5..4bd57a908efef761f7fc8a21c2423761330e5f8a 100644 (file)
@@ -306,6 +306,7 @@ static void svc_thread_recv_status_ok(struct stratix10_svc_data *p_data,
                break;
        case COMMAND_RSU_RETRY:
        case COMMAND_RSU_MAX_RETRY:
+       case COMMAND_FIRMWARE_VERSION:
                cb_data->status = BIT(SVC_STATUS_OK);
                cb_data->kaddr1 = &res.a1;
                break;
@@ -422,6 +423,11 @@ static int svc_normal_to_secure_thread(void *data)
                        a1 = 0;
                        a2 = 0;
                        break;
+               case COMMAND_FIRMWARE_VERSION:
+                       a0 = INTEL_SIP_SMC_FIRMWARE_VERSION;
+                       a1 = 0;
+                       a2 = 0;
+                       break;
                default:
                        pr_warn("it shouldn't happen\n");
                        break;
@@ -491,7 +497,8 @@ static int svc_normal_to_secure_thread(void *data)
                         */
                        if ((pdata->command == COMMAND_RSU_RETRY) ||
                            (pdata->command == COMMAND_RSU_MAX_RETRY) ||
-                               (pdata->command == COMMAND_RSU_NOTIFY)) {
+                           (pdata->command == COMMAND_RSU_NOTIFY) ||
+                           (pdata->command == COMMAND_FIRMWARE_VERSION)) {
                                cbdata->status =
                                        BIT(SVC_STATUS_NO_SUPPORT);
                                cbdata->kaddr1 = NULL;
index c3e5ab014caff90438ffa97beda29f566520361c..aad497a9ad8bb0bf7185e12d5828adff394b9fd5 100644 (file)
@@ -321,8 +321,6 @@ INTEL_SIP_SMC_FAST_CALL_VAL(INTEL_SIP_SMC_FUNCID_FPGA_CONFIG_COMPLETED_WRITE)
 #define INTEL_SIP_SMC_ECC_DBE \
        INTEL_SIP_SMC_FAST_CALL_VAL(INTEL_SIP_SMC_FUNCID_ECC_DBE)
 
-#endif
-
 /**
  * Request INTEL_SIP_SMC_RSU_NOTIFY
  *
@@ -404,3 +402,22 @@ INTEL_SIP_SMC_FAST_CALL_VAL(INTEL_SIP_SMC_FUNCID_FPGA_CONFIG_COMPLETED_WRITE)
 #define INTEL_SIP_SMC_FUNCID_RSU_MAX_RETRY 18
 #define INTEL_SIP_SMC_RSU_MAX_RETRY \
        INTEL_SIP_SMC_FAST_CALL_VAL(INTEL_SIP_SMC_FUNCID_RSU_MAX_RETRY)
+
+/**
+ * Request INTEL_SIP_SMC_FIRMWARE_VERSION
+ *
+ * Sync call used to query the version of running firmware
+ *
+ * Call register usage:
+ * a0 INTEL_SIP_SMC_FIRMWARE_VERSION
+ * a1-a7 not used
+ *
+ * Return status:
+ * a0 INTEL_SIP_SMC_STATUS_OK or INTEL_SIP_SMC_STATUS_ERROR
+ * a1 running firmware version
+ */
+#define INTEL_SIP_SMC_FUNCID_FIRMWARE_VERSION 31
+#define INTEL_SIP_SMC_FIRMWARE_VERSION \
+        INTEL_SIP_SMC_FAST_CALL_VAL(INTEL_SIP_SMC_FUNCID_FIRMWARE_VERSION)
+
+#endif
index 19781b0f642933d71c887c20745c9b1da2dd0d2e..18c1841fdb1fdd23c5398d8bd9ae7ef69e8fe445 100644 (file)
@@ -104,6 +104,9 @@ struct stratix10_svc_chan;
  *
  * @COMMAND_RSU_DCMF_VERSION: query firmware for the DCMF version, return status
  * is SVC_STATUS_OK or SVC_STATUS_ERROR
+ *
+ * @COMMAND_FIRMWARE_VERSION: query running firmware version, return status
+ * is SVC_STATUS_OK or SVC_STATUS_ERROR
  */
 enum stratix10_svc_command_code {
        COMMAND_NOOP = 0,
@@ -117,6 +120,7 @@ enum stratix10_svc_command_code {
        COMMAND_RSU_RETRY,
        COMMAND_RSU_MAX_RETRY,
        COMMAND_RSU_DCMF_VERSION,
+       COMMAND_FIRMWARE_VERSION,
 };
 
 /**