Commit 7224adbbb80329d1a3ec5aa98213b50365fcd246

Authored by Neelesh Gupta
Committed by Benjamin Herrenschmidt
1 parent 4029cd6654

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);