lkml.org 
[lkml]   [2023]   [May]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCHv2 2/6] firmware: stratix10-svc: add method for reading voltage and temperature
    Date
    From: Dinh Nguyen <dinh.nguyen@linux.intel.com>

    Add support for the hardware monitor driver to use the service driver
    the ability to read voltage and temperature from the SDM.

    Signed-off-by: Dinh Nguyen <dinh.nguyen@linux.intel.com>
    ---
    drivers/firmware/stratix10-svc.c | 18 +++++++++-
    include/linux/firmware/intel/stratix10-smc.h | 34 +++++++++++++++++++
    .../firmware/intel/stratix10-svc-client.h | 6 ++++
    3 files changed, 57 insertions(+), 1 deletion(-)

    diff --git a/drivers/firmware/stratix10-svc.c b/drivers/firmware/stratix10-svc.c
    index bde1f543f529..cc1b8b441c37 100644
    --- a/drivers/firmware/stratix10-svc.c
    +++ b/drivers/firmware/stratix10-svc.c
    @@ -340,6 +340,8 @@ static void svc_thread_recv_status_ok(struct stratix10_svc_data *p_data,
    case COMMAND_RSU_MAX_RETRY:
    case COMMAND_RSU_DCMF_STATUS:
    case COMMAND_FIRMWARE_VERSION:
    + case COMMAND_HWMON_READTEMP:
    + case COMMAND_HWMON_READVOLT:
    cb_data->status = BIT(SVC_STATUS_OK);
    cb_data->kaddr1 = &res.a1;
    break;
    @@ -517,7 +519,17 @@ static int svc_normal_to_secure_thread(void *data)
    a1 = (unsigned long)pdata->paddr;
    a2 = 0;
    break;
    -
    + /* for HWMON */
    + case COMMAND_HWMON_READTEMP:
    + a0 = INTEL_SIP_SMC_HWMON_READTEMP;
    + a1 = pdata->arg[0];
    + a2 = 0;
    + break;
    + case COMMAND_HWMON_READVOLT:
    + a0 = INTEL_SIP_SMC_HWMON_READVOLT;
    + a1 = pdata->arg[0];
    + a2 = 0;
    + break;
    /* for polling */
    case COMMAND_POLL_SERVICE_STATUS:
    a0 = INTEL_SIP_SMC_SERVICE_COMPLETED;
    @@ -1182,6 +1194,10 @@ static int stratix10_svc_drv_probe(struct platform_device *pdev)
    chans[2].name = SVC_CLIENT_FCS;
    spin_lock_init(&chans[2].lock);

    + chans[3].ctrl = controller;
    + chans[3].name = SVC_CLIENT_HWMON;
    + spin_lock_init(&chans[3].lock);
    +
    list_add_tail(&controller->node, &svc_ctrl);
    platform_set_drvdata(pdev, controller);

    diff --git a/include/linux/firmware/intel/stratix10-smc.h b/include/linux/firmware/intel/stratix10-smc.h
    index a718f853d457..b944ec4b2b2f 100644
    --- a/include/linux/firmware/intel/stratix10-smc.h
    +++ b/include/linux/firmware/intel/stratix10-smc.h
    @@ -595,4 +595,38 @@ INTEL_SIP_SMC_FAST_CALL_VAL(INTEL_SIP_SMC_FUNCID_FPGA_CONFIG_COMPLETED_WRITE)
    #define INTEL_SIP_SMC_FCS_GET_PROVISION_DATA \
    INTEL_SIP_SMC_FAST_CALL_VAL(INTEL_SIP_SMC_FUNCID_FCS_GET_PROVISION_DATA)

    +/**
    + * Request INTEL_SIP_SMC_HWMON_READTEMP
    + * Sync call to request temperature
    + *
    + * Call register usage:
    + * a0 Temperature Channel
    + * a1-a7 not used
    + *
    + * Return status
    + * a0 INTEL_SIP_SMC_STATUS_OK
    + * a1 Temperature Value
    + * a2-a3 not used
    + */
    +#define INTEL_SIP_SMC_FUNCID_HWMON_READTEMP 32
    +#define INTEL_SIP_SMC_HWMON_READTEMP \
    + INTEL_SIP_SMC_FAST_CALL_VAL(INTEL_SIP_SMC_FUNCID_HWMON_READTEMP)
    +
    +/**
    + * Request INTEL_SIP_SMC_HWMON_READVOLT
    + * Sync call to request voltage
    + *
    + * Call register usage:
    + * a0 Voltage Channel
    + * a1-a7 not used
    + *
    + * Return status
    + * a0 INTEL_SIP_SMC_STATUS_OK
    + * a1 Voltage Value
    + * a2-a3 not used
    + */
    +#define INTEL_SIP_SMC_FUNCID_HWMON_READVOLT 33
    +#define INTEL_SIP_SMC_HWMON_READVOLT \
    + INTEL_SIP_SMC_FAST_CALL_VAL(INTEL_SIP_SMC_FUNCID_HWMON_READVOLT)
    +
    #endif
    diff --git a/include/linux/firmware/intel/stratix10-svc-client.h b/include/linux/firmware/intel/stratix10-svc-client.h
    index 0c16037fd08d..343970dcc2d2 100644
    --- a/include/linux/firmware/intel/stratix10-svc-client.h
    +++ b/include/linux/firmware/intel/stratix10-svc-client.h
    @@ -11,10 +11,12 @@
    *
    * fpga: for FPGA configuration
    * rsu: for remote status update
    + * hwmon: for hardware monitoring (voltage and temperature)
    */
    #define SVC_CLIENT_FPGA "fpga"
    #define SVC_CLIENT_RSU "rsu"
    #define SVC_CLIENT_FCS "fcs"
    +#define SVC_CLIENT_HWMON "hwmon"

    /*
    * Status of the sent command, in bit number
    @@ -70,6 +72,7 @@
    #define SVC_RSU_REQUEST_TIMEOUT_MS 300
    #define SVC_FCS_REQUEST_TIMEOUT_MS 2000
    #define SVC_COMPLETED_TIMEOUT_MS 30000
    +#define SVC_HWMON_REQUEST_TIMEOUT_MS 300

    struct stratix10_svc_chan;

    @@ -164,6 +167,9 @@ enum stratix10_svc_command_code {
    COMMAND_FCS_RANDOM_NUMBER_GEN,
    /* for general status poll */
    COMMAND_POLL_SERVICE_STATUS = 40,
    + /* for HWMON */
    + COMMAND_HWMON_READTEMP,
    + COMMAND_HWMON_READVOLT,
    /* Non-mailbox SMC Call */
    COMMAND_SMC_SVC_VERSION = 200,
    };
    --
    2.40.0
    \
     
     \ /
      Last update: 2023-05-08 23:40    [W:3.066 / U:0.032 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site