mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 12:44:03 +02:00
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:
parent
ef7453e1f9
commit
728e9895bd
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user