diff options
author | Neelesh Gupta <neelegup@linux.vnet.ibm.com> | 2014-03-07 00:33:27 -0500 |
---|---|---|
committer | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2014-03-23 18:48:21 -0400 |
commit | 7224adbbb80329d1a3ec5aa98213b50365fcd246 (patch) | |
tree | 0872fcc25c32930ba7d8427a58486ee5f2588ce6 | |
parent | 4029cd66545f0a45258eda5313b7559bfeaaaae4 (diff) |
powerpc/powernv: Enable fetching of platform sensor data
This patch enables fetching of various platform sensor data through
OPAL and expects a sensor handle from the driver to pass to OPAL.
Signed-off-by: Neelesh Gupta <neelegup@linux.vnet.ibm.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
-rw-r--r-- | arch/powerpc/include/asm/opal.h | 4 | ||||
-rw-r--r-- | arch/powerpc/platforms/powernv/Makefile | 2 | ||||
-rw-r--r-- | arch/powerpc/platforms/powernv/opal-sensor.c | 64 | ||||
-rw-r--r-- | arch/powerpc/platforms/powernv/opal-wrappers.S | 1 |
4 files changed, 70 insertions, 1 deletions
diff --git a/arch/powerpc/include/asm/opal.h b/arch/powerpc/include/asm/opal.h index d239223279aa..ffafab037ba8 100644 --- a/arch/powerpc/include/asm/opal.h +++ b/arch/powerpc/include/asm/opal.h | |||
@@ -168,6 +168,7 @@ extern int opal_enter_rtas(struct rtas_args *args, | |||
168 | #define OPAL_GET_MSG 85 | 168 | #define OPAL_GET_MSG 85 |
169 | #define OPAL_CHECK_ASYNC_COMPLETION 86 | 169 | #define OPAL_CHECK_ASYNC_COMPLETION 86 |
170 | #define OPAL_SYNC_HOST_REBOOT 87 | 170 | #define OPAL_SYNC_HOST_REBOOT 87 |
171 | #define OPAL_SENSOR_READ 88 | ||
171 | #define OPAL_GET_PARAM 89 | 172 | #define OPAL_GET_PARAM 89 |
172 | #define OPAL_SET_PARAM 90 | 173 | #define OPAL_SET_PARAM 90 |
173 | #define OPAL_DUMP_RESEND 91 | 174 | #define OPAL_DUMP_RESEND 91 |
@@ -872,6 +873,8 @@ int64_t opal_get_param(uint64_t token, uint32_t param_id, uint64_t buffer, | |||
872 | size_t length); | 873 | size_t length); |
873 | int64_t opal_set_param(uint64_t token, uint32_t param_id, uint64_t buffer, | 874 | int64_t opal_set_param(uint64_t token, uint32_t param_id, uint64_t buffer, |
874 | size_t length); | 875 | size_t length); |
876 | int64_t opal_sensor_read(uint32_t sensor_hndl, int token, | ||
877 | uint32_t *sensor_data); | ||
875 | 878 | ||
876 | /* Internal functions */ | 879 | /* Internal functions */ |
877 | extern int early_init_dt_scan_opal(unsigned long node, const char *uname, int depth, void *data); | 880 | extern int early_init_dt_scan_opal(unsigned long node, const char *uname, int depth, void *data); |
@@ -902,6 +905,7 @@ extern int opal_async_get_token_interruptible(void); | |||
902 | extern int __opal_async_release_token(int token); | 905 | extern int __opal_async_release_token(int token); |
903 | extern int opal_async_release_token(int token); | 906 | extern int opal_async_release_token(int token); |
904 | extern int opal_async_wait_response(uint64_t token, struct opal_msg *msg); | 907 | extern int opal_async_wait_response(uint64_t token, struct opal_msg *msg); |
908 | extern int opal_get_sensor_data(u32 sensor_hndl, u32 *sensor_data); | ||
905 | 909 | ||
906 | extern void hvc_opal_init_early(void); | 910 | extern void hvc_opal_init_early(void); |
907 | 911 | ||
diff --git a/arch/powerpc/platforms/powernv/Makefile b/arch/powerpc/platforms/powernv/Makefile index 760b49948f76..f324ea099503 100644 --- a/arch/powerpc/platforms/powernv/Makefile +++ b/arch/powerpc/platforms/powernv/Makefile | |||
@@ -1,6 +1,6 @@ | |||
1 | obj-y += setup.o opal-takeover.o opal-wrappers.o opal.o opal-async.o | 1 | obj-y += setup.o opal-takeover.o opal-wrappers.o opal.o opal-async.o |
2 | obj-y += opal-rtc.o opal-nvram.o opal-lpc.o opal-flash.o | 2 | obj-y += opal-rtc.o opal-nvram.o opal-lpc.o opal-flash.o |
3 | obj-y += rng.o opal-elog.o opal-dump.o opal-sysparam.o | 3 | obj-y += rng.o opal-elog.o opal-dump.o opal-sysparam.o opal-sensor.o |
4 | 4 | ||
5 | obj-$(CONFIG_SMP) += smp.o | 5 | obj-$(CONFIG_SMP) += smp.o |
6 | obj-$(CONFIG_PCI) += pci.o pci-p5ioc2.o pci-ioda.o | 6 | obj-$(CONFIG_PCI) += pci.o pci-p5ioc2.o pci-ioda.o |
diff --git a/arch/powerpc/platforms/powernv/opal-sensor.c b/arch/powerpc/platforms/powernv/opal-sensor.c new file mode 100644 index 000000000000..663cc9c65613 --- /dev/null +++ b/arch/powerpc/platforms/powernv/opal-sensor.c | |||
@@ -0,0 +1,64 @@ | |||
1 | /* | ||
2 | * PowerNV sensor code | ||
3 | * | ||
4 | * Copyright (C) 2013 IBM | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
19 | */ | ||
20 | |||
21 | #include <linux/delay.h> | ||
22 | #include <linux/mutex.h> | ||
23 | #include <asm/opal.h> | ||
24 | |||
25 | static DEFINE_MUTEX(opal_sensor_mutex); | ||
26 | |||
27 | /* | ||
28 | * This will return sensor information to driver based on the requested sensor | ||
29 | * handle. A handle is an opaque id for the powernv, read by the driver from the | ||
30 | * device tree.. | ||
31 | */ | ||
32 | int opal_get_sensor_data(u32 sensor_hndl, u32 *sensor_data) | ||
33 | { | ||
34 | int ret, token; | ||
35 | struct opal_msg msg; | ||
36 | |||
37 | token = opal_async_get_token_interruptible(); | ||
38 | if (token < 0) { | ||
39 | pr_err("%s: Couldn't get the token, returning\n", __func__); | ||
40 | ret = token; | ||
41 | goto out; | ||
42 | } | ||
43 | |||
44 | mutex_lock(&opal_sensor_mutex); | ||
45 | ret = opal_sensor_read(sensor_hndl, token, sensor_data); | ||
46 | if (ret != OPAL_ASYNC_COMPLETION) | ||
47 | goto out_token; | ||
48 | |||
49 | ret = opal_async_wait_response(token, &msg); | ||
50 | if (ret) { | ||
51 | pr_err("%s: Failed to wait for the async response, %d\n", | ||
52 | __func__, ret); | ||
53 | goto out_token; | ||
54 | } | ||
55 | |||
56 | ret = msg.params[1]; | ||
57 | |||
58 | out_token: | ||
59 | mutex_unlock(&opal_sensor_mutex); | ||
60 | opal_async_release_token(token); | ||
61 | out: | ||
62 | return ret; | ||
63 | } | ||
64 | EXPORT_SYMBOL_GPL(opal_get_sensor_data); | ||
diff --git a/arch/powerpc/platforms/powernv/opal-wrappers.S b/arch/powerpc/platforms/powernv/opal-wrappers.S index b17f2d8c4073..75c89df8d71e 100644 --- a/arch/powerpc/platforms/powernv/opal-wrappers.S +++ b/arch/powerpc/platforms/powernv/opal-wrappers.S | |||
@@ -140,5 +140,6 @@ OPAL_CALL(opal_get_msg, OPAL_GET_MSG); | |||
140 | OPAL_CALL(opal_check_completion, OPAL_CHECK_ASYNC_COMPLETION); | 140 | OPAL_CALL(opal_check_completion, OPAL_CHECK_ASYNC_COMPLETION); |
141 | OPAL_CALL(opal_dump_resend_notification, OPAL_DUMP_RESEND); | 141 | OPAL_CALL(opal_dump_resend_notification, OPAL_DUMP_RESEND); |
142 | OPAL_CALL(opal_sync_host_reboot, OPAL_SYNC_HOST_REBOOT); | 142 | OPAL_CALL(opal_sync_host_reboot, OPAL_SYNC_HOST_REBOOT); |
143 | OPAL_CALL(opal_sensor_read, OPAL_SENSOR_READ); | ||
143 | OPAL_CALL(opal_get_param, OPAL_GET_PARAM); | 144 | OPAL_CALL(opal_get_param, OPAL_GET_PARAM); |
144 | OPAL_CALL(opal_set_param, OPAL_SET_PARAM); | 145 | OPAL_CALL(opal_set_param, OPAL_SET_PARAM); |