firmware: stratix10-svc: add async HWMON read commands and register socfpga-hwmon device

Add asynchronous Stratix 10 service layer support for hardware monitor
temperature and voltage read commands in stratix10_svc_async_send() and
stratix10_svc_async_prepare_response().

Register a socfpga-hwmon platform device from the service layer driver
when hardware monitor support is enabled, similar to the RSU device.

Signed-off-by: Nazim Amirul <muhammad.nazim.amirul.nazle.asmade@altera.com>
Signed-off-by: Tze Yee Ng <tze.yee.ng@altera.com>
Signed-off-by: Dinh Nguyen <dinguyen@kernel.org>
This commit is contained in:
Tze Yee Ng 2026-07-22 23:02:06 -07:00 committed by Dinh Nguyen
parent ef7453e1f9
commit 728e9895bd
2 changed files with 81 additions and 3 deletions

View File

@ -46,6 +46,7 @@
/* stratix10 service layer clients */
#define STRATIX10_RSU "stratix10-rsu"
#define SOCFPGA_HWMON "socfpga-hwmon"
/* Maximum number of SDM client IDs. */
#define MAX_SDM_CLIENT_IDS 16
@ -105,9 +106,11 @@ struct stratix10_svc_chan;
/**
* struct stratix10_svc - svc private data
* @stratix10_svc_rsu: pointer to stratix10 RSU device
* @stratix10_svc_hwmon: pointer to stratix10 HWMON device
*/
struct stratix10_svc {
struct platform_device *stratix10_svc_rsu;
struct platform_device *stratix10_svc_hwmon;
};
/**
@ -1405,6 +1408,14 @@ int stratix10_svc_async_send(struct stratix10_svc_chan *chan, void *msg,
args.a0 = INTEL_SIP_SMC_ASYNC_RSU_NOTIFY;
args.a2 = p_msg->arg[0];
break;
case COMMAND_HWMON_READTEMP:
args.a0 = INTEL_SIP_SMC_ASYNC_HWMON_READTEMP;
args.a2 = p_msg->arg[0];
break;
case COMMAND_HWMON_READVOLT:
args.a0 = INTEL_SIP_SMC_ASYNC_HWMON_READVOLT;
args.a2 = p_msg->arg[0];
break;
default:
dev_err(ctrl->dev, "Invalid command ,%d\n", p_msg->command);
ret = -EINVAL;
@ -1498,6 +1509,10 @@ static int stratix10_svc_async_prepare_response(struct stratix10_svc_chan *chan,
*/
data->kaddr1 = (void *)&handle->res;
break;
case COMMAND_HWMON_READTEMP:
case COMMAND_HWMON_READVOLT:
data->kaddr1 = (void *)&handle->res.a2;
break;
default:
dev_alert(ctrl->dev, "Invalid command\n ,%d", p_msg->command);
@ -2089,16 +2104,38 @@ static int stratix10_svc_drv_probe(struct platform_device *pdev)
if (ret)
goto err_put_device;
if (IS_ENABLED(CONFIG_SENSORS_ALTERA_SOCFPGA_HWMON)) {
svc->stratix10_svc_hwmon =
platform_device_alloc(SOCFPGA_HWMON, 0);
if (!svc->stratix10_svc_hwmon) {
dev_err(dev, "failed to allocate %s device\n",
SOCFPGA_HWMON);
} else {
svc->stratix10_svc_hwmon->dev.parent = dev;
ret = platform_device_add(svc->stratix10_svc_hwmon);
if (ret) {
dev_err(dev, "failed to add %s device: %d\n",
SOCFPGA_HWMON, ret);
platform_device_put(svc->stratix10_svc_hwmon);
svc->stratix10_svc_hwmon = NULL;
}
}
}
ret = of_platform_default_populate(dev_of_node(dev), NULL, dev);
if (ret)
goto err_unregister_rsu_dev;
goto err_unregister_clients;
pr_info("Intel Service Layer Driver Initialized\n");
return 0;
err_unregister_rsu_dev:
platform_device_unregister(svc->stratix10_svc_rsu);
err_unregister_clients:
if (svc->stratix10_svc_hwmon)
platform_device_unregister(svc->stratix10_svc_hwmon);
if (svc->stratix10_svc_rsu)
platform_device_unregister(svc->stratix10_svc_rsu);
goto err_free_fifos;
err_put_device:
platform_device_put(svc->stratix10_svc_rsu);
@ -2122,6 +2159,9 @@ static void stratix10_svc_drv_remove(struct platform_device *pdev)
struct stratix10_svc_controller *ctrl = platform_get_drvdata(pdev);
struct stratix10_svc *svc = ctrl->svc;
if (svc->stratix10_svc_hwmon)
platform_device_unregister(svc->stratix10_svc_hwmon);
stratix10_svc_async_exit(ctrl);
of_platform_depopulate(ctrl->dev);

View File

@ -718,6 +718,44 @@ INTEL_SIP_SMC_FAST_CALL_VAL(INTEL_SIP_SMC_FUNCID_FPGA_CONFIG_COMPLETED_WRITE)
#define INTEL_SIP_SMC_ASYNC_POLL \
INTEL_SIP_SMC_ASYNC_VAL(INTEL_SIP_SMC_ASYNC_FUNC_ID_POLL)
/**
* Request INTEL_SIP_SMC_ASYNC_HWMON_READTEMP
* Async call to request temperature
*
* Call register usage:
* a0 INTEL_SIP_SMC_ASYNC_HWMON_READTEMP
* a1 transaction job id
* a2 Temperature Channel
* a3-a17 not used
*
* Return status
* a0 INTEL_SIP_SMC_STATUS_OK, INTEL_SIP_SMC_STATUS_REJECTED
* or INTEL_SIP_SMC_STATUS_BUSY
* a1-a17 not used
*/
#define INTEL_SIP_SMC_ASYNC_FUNC_ID_HWMON_READTEMP 0xE8
#define INTEL_SIP_SMC_ASYNC_HWMON_READTEMP \
INTEL_SIP_SMC_ASYNC_VAL(INTEL_SIP_SMC_ASYNC_FUNC_ID_HWMON_READTEMP)
/**
* Request INTEL_SIP_SMC_ASYNC_HWMON_READVOLT
* Async call to request voltage
*
* Call register usage:
* a0 INTEL_SIP_SMC_ASYNC_HWMON_READVOLT
* a1 transaction job id
* a2 Voltage Channel
* a3-a17 not used
*
* Return status
* a0 INTEL_SIP_SMC_STATUS_OK, INTEL_SIP_SMC_STATUS_REJECTED
* or INTEL_SIP_SMC_STATUS_BUSY
* a1-a17 not used
*/
#define INTEL_SIP_SMC_ASYNC_FUNC_ID_HWMON_READVOLT 0xE9
#define INTEL_SIP_SMC_ASYNC_HWMON_READVOLT \
INTEL_SIP_SMC_ASYNC_VAL(INTEL_SIP_SMC_ASYNC_FUNC_ID_HWMON_READVOLT)
/**
* Request INTEL_SIP_SMC_ASYNC_RSU_GET_SPT
* Async call to get RSU SPT from SDM.