Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5cdcb01e authored by Shilpasri G Bhat's avatar Shilpasri G Bhat Committed by Michael Ellerman
Browse files

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: default avatarShilpasri G Bhat <shilpa.bhat@linux.vnet.ibm.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent 00c946a0
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -204,6 +204,7 @@
#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
+2 −0
Original line number Diff line number Diff line
@@ -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);
+53 −0
Original line number Diff line number Diff line
@@ -72,6 +72,59 @@ int opal_get_sensor_data(u32 sensor_hndl, u32 *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)
{
	struct platform_device *pdev;
+1 −0
Original line number Diff line number Diff line
@@ -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);