OSDN Git Service

powernv: opal-sensor: Add support to read 64bit sensor values
authorShilpasri G Bhat <shilpa.bhat@linux.vnet.ibm.com>
Mon, 7 May 2018 10:25:36 +0000 (15:55 +0530)
committerMichael Ellerman <mpe@ellerman.id.au>
Mon, 21 May 2018 04:48:02 +0000 (14:48 +1000)
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>
arch/powerpc/include/asm/opal-api.h
arch/powerpc/include/asm/opal.h
arch/powerpc/platforms/powernv/opal-sensor.c
arch/powerpc/platforms/powernv/opal-wrappers.S

index d886a5b..f34d173 100644 (file)
 #define OPAL_NPU_SPA_SETUP                     159
 #define OPAL_NPU_SPA_CLEAR_CACHE               160
 #define OPAL_NPU_TL_SET                                161
+#define OPAL_SENSOR_READ_U64                   162
 #define OPAL_PCI_GET_PBCQ_TUNNEL_BAR           164
 #define OPAL_PCI_SET_PBCQ_TUNNEL_BAR           165
 #define OPAL_LAST                              165
index 03e1a92..3960def 100644 (file)
@@ -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,
                uint64_t length);
 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_register_dump_region(uint32_t id, uint64_t start, uint64_t end);
 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,
                struct opal_msg *msg);
 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;
 extern unsigned long opal_get_boot_time(void);
index 0a7074b..35a5f4b 100644 (file)
@@ -72,6 +72,59 @@ out:
 }
 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)
 {
        struct platform_device *pdev;
index 3da30c2..8482df2 100644 (file)
@@ -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_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_sensor_read_u64,                        OPAL_SENSOR_READ_U64);