mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-11 16:29:05 +00:00
powernv: opal-sensor: Add support to read 64bit sensor values
This patch adds support to read 64-bit sensor values. This method is used to read energy sensors and counters which are of type u64. Signed-off-by: Shilpasri G Bhat <shilpa.bhat@linux.vnet.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
This commit is contained in:
parent
00c946a06e
commit
5cdcb01e0a
@ -204,6 +204,7 @@
|
|||||||
#define OPAL_NPU_SPA_SETUP 159
|
#define OPAL_NPU_SPA_SETUP 159
|
||||||
#define OPAL_NPU_SPA_CLEAR_CACHE 160
|
#define OPAL_NPU_SPA_CLEAR_CACHE 160
|
||||||
#define OPAL_NPU_TL_SET 161
|
#define OPAL_NPU_TL_SET 161
|
||||||
|
#define OPAL_SENSOR_READ_U64 162
|
||||||
#define OPAL_PCI_GET_PBCQ_TUNNEL_BAR 164
|
#define OPAL_PCI_GET_PBCQ_TUNNEL_BAR 164
|
||||||
#define OPAL_PCI_SET_PBCQ_TUNNEL_BAR 165
|
#define OPAL_PCI_SET_PBCQ_TUNNEL_BAR 165
|
||||||
#define OPAL_LAST 165
|
#define OPAL_LAST 165
|
||||||
|
@ -201,6 +201,7 @@ int64_t opal_get_param(uint64_t token, uint32_t param_id, uint64_t buffer,
|
|||||||
int64_t opal_set_param(uint64_t token, uint32_t param_id, uint64_t buffer,
|
int64_t opal_set_param(uint64_t token, uint32_t param_id, uint64_t buffer,
|
||||||
uint64_t length);
|
uint64_t length);
|
||||||
int64_t opal_sensor_read(uint32_t sensor_hndl, int token, __be32 *sensor_data);
|
int64_t opal_sensor_read(uint32_t sensor_hndl, int token, __be32 *sensor_data);
|
||||||
|
int64_t opal_sensor_read_u64(u32 sensor_hndl, int token, __be64 *sensor_data);
|
||||||
int64_t opal_handle_hmi(void);
|
int64_t opal_handle_hmi(void);
|
||||||
int64_t opal_register_dump_region(uint32_t id, uint64_t start, uint64_t end);
|
int64_t opal_register_dump_region(uint32_t id, uint64_t start, uint64_t end);
|
||||||
int64_t opal_unregister_dump_region(uint32_t id);
|
int64_t opal_unregister_dump_region(uint32_t id);
|
||||||
@ -323,6 +324,7 @@ extern int opal_async_wait_response(uint64_t token, struct opal_msg *msg);
|
|||||||
extern int opal_async_wait_response_interruptible(uint64_t token,
|
extern int opal_async_wait_response_interruptible(uint64_t token,
|
||||||
struct opal_msg *msg);
|
struct opal_msg *msg);
|
||||||
extern int opal_get_sensor_data(u32 sensor_hndl, u32 *sensor_data);
|
extern int opal_get_sensor_data(u32 sensor_hndl, u32 *sensor_data);
|
||||||
|
extern int opal_get_sensor_data_u64(u32 sensor_hndl, u64 *sensor_data);
|
||||||
|
|
||||||
struct rtc_time;
|
struct rtc_time;
|
||||||
extern unsigned long opal_get_boot_time(void);
|
extern unsigned long opal_get_boot_time(void);
|
||||||
|
@ -72,6 +72,59 @@ out:
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(opal_get_sensor_data);
|
EXPORT_SYMBOL_GPL(opal_get_sensor_data);
|
||||||
|
|
||||||
|
int opal_get_sensor_data_u64(u32 sensor_hndl, u64 *sensor_data)
|
||||||
|
{
|
||||||
|
int ret, token;
|
||||||
|
struct opal_msg msg;
|
||||||
|
__be64 data;
|
||||||
|
|
||||||
|
if (!opal_check_token(OPAL_SENSOR_READ_U64)) {
|
||||||
|
u32 sdata;
|
||||||
|
|
||||||
|
ret = opal_get_sensor_data(sensor_hndl, &sdata);
|
||||||
|
if (!ret)
|
||||||
|
*sensor_data = sdata;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
token = opal_async_get_token_interruptible();
|
||||||
|
if (token < 0)
|
||||||
|
return token;
|
||||||
|
|
||||||
|
ret = opal_sensor_read_u64(sensor_hndl, token, &data);
|
||||||
|
switch (ret) {
|
||||||
|
case OPAL_ASYNC_COMPLETION:
|
||||||
|
ret = opal_async_wait_response(token, &msg);
|
||||||
|
if (ret) {
|
||||||
|
pr_err("%s: Failed to wait for the async response, %d\n",
|
||||||
|
__func__, ret);
|
||||||
|
goto out_token;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = opal_error_code(opal_get_async_rc(msg));
|
||||||
|
*sensor_data = be64_to_cpu(data);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OPAL_SUCCESS:
|
||||||
|
ret = 0;
|
||||||
|
*sensor_data = be64_to_cpu(data);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OPAL_WRONG_STATE:
|
||||||
|
ret = -EIO;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
ret = opal_error_code(ret);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
out_token:
|
||||||
|
opal_async_release_token(token);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(opal_get_sensor_data_u64);
|
||||||
|
|
||||||
int __init opal_sensor_init(void)
|
int __init opal_sensor_init(void)
|
||||||
{
|
{
|
||||||
struct platform_device *pdev;
|
struct platform_device *pdev;
|
||||||
|
@ -325,3 +325,4 @@ OPAL_CALL(opal_npu_spa_clear_cache, OPAL_NPU_SPA_CLEAR_CACHE);
|
|||||||
OPAL_CALL(opal_npu_tl_set, OPAL_NPU_TL_SET);
|
OPAL_CALL(opal_npu_tl_set, OPAL_NPU_TL_SET);
|
||||||
OPAL_CALL(opal_pci_get_pbcq_tunnel_bar, OPAL_PCI_GET_PBCQ_TUNNEL_BAR);
|
OPAL_CALL(opal_pci_get_pbcq_tunnel_bar, OPAL_PCI_GET_PBCQ_TUNNEL_BAR);
|
||||||
OPAL_CALL(opal_pci_set_pbcq_tunnel_bar, OPAL_PCI_SET_PBCQ_TUNNEL_BAR);
|
OPAL_CALL(opal_pci_set_pbcq_tunnel_bar, OPAL_PCI_SET_PBCQ_TUNNEL_BAR);
|
||||||
|
OPAL_CALL(opal_sensor_read_u64, OPAL_SENSOR_READ_U64);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user