Commit 7224adbbb80329d1a3ec5aa98213b50365fcd246
Committed by
Benjamin Herrenschmidt
1 parent
4029cd6654
Exists in
master
and in
13 other branches
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>
Showing 4 changed files with 70 additions and 1 deletions Side-by-side Diff
arch/powerpc/include/asm/opal.h
... | ... | @@ -168,6 +168,7 @@ |
168 | 168 | #define OPAL_GET_MSG 85 |
169 | 169 | #define OPAL_CHECK_ASYNC_COMPLETION 86 |
170 | 170 | #define OPAL_SYNC_HOST_REBOOT 87 |
171 | +#define OPAL_SENSOR_READ 88 | |
171 | 172 | #define OPAL_GET_PARAM 89 |
172 | 173 | #define OPAL_SET_PARAM 90 |
173 | 174 | #define OPAL_DUMP_RESEND 91 |
... | ... | @@ -872,6 +873,8 @@ |
872 | 873 | size_t length); |
873 | 874 | int64_t opal_set_param(uint64_t token, uint32_t param_id, uint64_t buffer, |
874 | 875 | size_t length); |
876 | +int64_t opal_sensor_read(uint32_t sensor_hndl, int token, | |
877 | + uint32_t *sensor_data); | |
875 | 878 | |
876 | 879 | /* Internal functions */ |
877 | 880 | extern int early_init_dt_scan_opal(unsigned long node, const char *uname, int depth, void *data); |
... | ... | @@ -902,6 +905,7 @@ |
902 | 905 | extern int __opal_async_release_token(int token); |
903 | 906 | extern int opal_async_release_token(int token); |
904 | 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 | 910 | extern void hvc_opal_init_early(void); |
907 | 911 |
arch/powerpc/platforms/powernv/Makefile
1 | 1 | obj-y += setup.o opal-takeover.o opal-wrappers.o opal.o opal-async.o |
2 | 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 | 5 | obj-$(CONFIG_SMP) += smp.o |
6 | 6 | obj-$(CONFIG_PCI) += pci.o pci-p5ioc2.o pci-ioda.o |
arch/powerpc/platforms/powernv/opal-sensor.c
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); |
arch/powerpc/platforms/powernv/opal-wrappers.S
... | ... | @@ -140,6 +140,7 @@ |
140 | 140 | OPAL_CALL(opal_check_completion, OPAL_CHECK_ASYNC_COMPLETION); |
141 | 141 | OPAL_CALL(opal_dump_resend_notification, OPAL_DUMP_RESEND); |
142 | 142 | OPAL_CALL(opal_sync_host_reboot, OPAL_SYNC_HOST_REBOOT); |
143 | +OPAL_CALL(opal_sensor_read, OPAL_SENSOR_READ); | |
143 | 144 | OPAL_CALL(opal_get_param, OPAL_GET_PARAM); |
144 | 145 | OPAL_CALL(opal_set_param, OPAL_SET_PARAM); |