* [LTP] [PATCH v5 2/3] device-drivers: acpi: fixes
@ 2013-11-28 12:17 Alexey Kodanev
2013-11-28 12:17 ` [LTP] [PATCH 3/3] device-drivers: acpi: enable build and run Alexey Kodanev
0 siblings, 1 reply; 4+ messages in thread
From: Alexey Kodanev @ 2013-11-28 12:17 UTC (permalink / raw)
To: ltp-list; +Cc: vasily.isaenko, Alexey Kodanev
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 47056 bytes --]
Obsolete code updated to the actual kernel ACPI API.
Changed test-cases handling from ioctl to sysfs.
User-space program rewritten.
User-space program loads/unloads kernel module.
Added new test-cases: traverse ACPI devices and sysfs support
for device description.
Signed-off-by: Alexey Kodanev <alexey.kodanev@oracle.com>
---
testcases/kernel/device-drivers/acpi/.gitignore | 8 +
testcases/kernel/device-drivers/acpi/Makefile | 43 +-
testcases/kernel/device-drivers/acpi/ltp_acpi.c | 170 ++++
testcases/kernel/device-drivers/acpi/ltp_acpi.h | 123 +--
.../kernel/device-drivers/acpi/ltp_acpi_cmds.c | 1001 ++++++++++----------
5 files changed, 717 insertions(+), 628 deletions(-)
create mode 100644 testcases/kernel/device-drivers/acpi/.gitignore
create mode 100644 testcases/kernel/device-drivers/acpi/ltp_acpi.c
diff --git a/testcases/kernel/device-drivers/acpi/.gitignore b/testcases/kernel/device-drivers/acpi/.gitignore
new file mode 100644
index 0000000..6aa2c12
--- /dev/null
+++ b/testcases/kernel/device-drivers/acpi/.gitignore
@@ -0,0 +1,8 @@
+/ltp_acpi_cmds.ko
+/ltp_acpi
+/*.mod.c
+/modules.order
+/.tmp_versions
+/.*.ko
+/.*.cmd
+/Module.symvers
diff --git a/testcases/kernel/device-drivers/acpi/Makefile b/testcases/kernel/device-drivers/acpi/Makefile
index afec680..31bf26b 100644
--- a/testcases/kernel/device-drivers/acpi/Makefile
+++ b/testcases/kernel/device-drivers/acpi/Makefile
@@ -1,34 +1,33 @@
+# Copyright (c) 2013 Oracle and/or its affiliates. All Rights Reserved.
#
-# Makefile for GCOV profiling kernel module
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
#
-# 1 Mar 2009 M��rton N��meth <nm127@freemail.hu>
-# - Updated for Linux kernel 2.6.28
+# This program is distributed in the hope that it would be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
#
-
-#KERNELDIR := /usr/src/linux-2.5.64-gcov
-EXTRA_CFLAGS := -Wall -g -W -Wno-unused-parameter
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
ifneq ($(KERNELRELEASE),)
-obj-m := LtpAcpiCmds.o
-obj-p := Test
-else
-KDIR := /lib/modules/$(shell uname -r)/build
-PWD := $(shell pwd)
+obj-m := ltp_acpi_cmds.o
-modules:
- $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
- ${CC} $(CFLAGS) -o LtpAcpiMain LtpAcpiMain.c
+else
-clean:
- $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) clean
- rm -f modules.order
- rm -f LtpAcpiMain
+top_srcdir ?= ../../../..
+include $(top_srcdir)/include/mk/testcases.mk
-help:
- $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) help
+REQ_VERSION_MAJOR := 2
+REQ_VERSION_PATCH := 6
+MAKE_TARGETS := ltp_acpi ltp_acpi_cmds.ko
-modules_install:
- $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules_install
+include $(top_srcdir)/include/mk/module.mk
+include $(top_srcdir)/include/mk/generic_leaf_target.mk
endif
diff --git a/testcases/kernel/device-drivers/acpi/ltp_acpi.c b/testcases/kernel/device-drivers/acpi/ltp_acpi.c
new file mode 100644
index 0000000..2c797c1
--- /dev/null
+++ b/testcases/kernel/device-drivers/acpi/ltp_acpi.c
@@ -0,0 +1,170 @@
+/*
+ * Copyright (c) 2013 Oracle and/or its affiliates. All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it would be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Author: Alexey Kodanev <alexey.kodanev@oracle.com>
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "test.h"
+#include "usctest.h"
+#include "tst_module.h"
+#include "safe_macros.h"
+#include "safe_stdio.h"
+
+#include "ltp_acpi.h"
+
+char *TCID = "ltp_acpi";
+int TST_TOTAL = ACPI_TC_NUM;
+
+static const char dev_result[] = "/sys/devices/" ACPI_TEST_NAME "/result";
+static const char dev_path[] = "/sys/devices/" ACPI_TEST_NAME "/path";
+static const char dev_str[] = "/sys/devices/" ACPI_TEST_NAME "/str";
+static const char dev_tcase[] = "/sys/devices/" ACPI_TEST_NAME "/tcase";
+static const char module_name[] = "ltp_acpi_cmds.ko";
+static int module_loaded;
+
+static void cleanup(void)
+{
+ if (module_loaded)
+ tst_module_unload(NULL, module_name);
+
+ TEST_CLEANUP;
+}
+
+static int read_sysfs_file(const char *name, char *buf, int size)
+{
+ FILE *f = SAFE_FOPEN(cleanup, name, "r");
+ char *res = fgets(buf, size, f);
+ SAFE_FCLOSE(cleanup, f);
+ return (res) ? 0 : 1;
+}
+
+static int tc_acpi_str(void)
+{
+ int res, ret = 0;
+ char descr[4096], sysfs_path[4096];
+
+ int not_kver_3_7 = tst_kvercmp(3, 7, 0) < 0;
+
+ while (1) {
+
+ SAFE_FILE_PRINTF(cleanup, dev_tcase, "%d", ACPI_TRAVERSE);
+ SAFE_FILE_SCANF(cleanup, dev_result, "%d", &res);
+ if (res)
+ return TFAIL;
+ /*
+ * if device has _STR object, we should get
+ * a valid string from 'str' sysfs file and then can
+ * find it in sysfs.
+ */
+ if (read_sysfs_file(dev_str, descr, 4096)) {
+ /* None of left devices has _STR */
+ break;
+ }
+ tst_resm(TINFO, "read description %s", descr);
+
+ /* device's sysfs path */
+ strcpy(sysfs_path, "/sys");
+ if (read_sysfs_file(dev_path, sysfs_path + 4, 4092)) {
+ /*
+ * Device doesn't have sysfs entry
+ * continue, because others might have it
+ */
+ continue;
+ }
+
+ /*
+ * Find device description in sysfs.
+ *
+ * New sysfs interface to export device description
+ * implemented since Linux 3.7
+ */
+ if (not_kver_3_7) {
+ tst_resm(TINFO, "sysfs _STR check required Linux 3.7+");
+ ret = TCONF;
+ /* continue, we can still traverse ACPI devices */
+ continue;
+ }
+
+ strcat(sysfs_path, "/description");
+ if (access(sysfs_path, R_OK)) {
+ tst_resm(TINFO, "can't find description file '%s'",
+ sysfs_path);
+ return TFAIL;
+ }
+ tst_resm(TINFO, "found description file '%s'", sysfs_path);
+
+ char sysfs_descr[4096];
+ if (read_sysfs_file(sysfs_path, sysfs_descr, 4096))
+ return TFAIL;
+
+ /*
+ * Compare sysfs file and description from test driver
+ */
+ int res = strncmp(descr, sysfs_descr, strlen(descr));
+
+ ret |= res ? TFAIL : TPASS;
+ }
+
+ return ret;
+}
+
+static void test_run(void)
+{
+ int i, res;
+
+ for (i = 0; i < TST_TOTAL; ++i) {
+
+ if (i == ACPI_TRAVERSE) {
+ res = tc_acpi_str();
+ } else {
+ SAFE_FILE_PRINTF(cleanup, dev_tcase, "%d", i);
+ SAFE_FILE_SCANF(cleanup, dev_result, "%d", &res);
+ res = res ? TFAIL : TPASS;
+ }
+
+ tst_resm(res, "Test-case '%d'", i);
+ }
+}
+
+int main(int argc, char *argv[])
+{
+ char *msg;
+ msg = parse_opts(argc, argv, NULL, NULL);
+ if (msg != NULL)
+ tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg);
+
+ tst_require_root(NULL);
+
+ if (tst_kvercmp(2, 6, 0) < 0) {
+ tst_brkm(TCONF, NULL,
+ "Test must be run with kernel 2.6 or newer");
+ }
+
+ tst_sig(FORK, DEF_HANDLER, cleanup);
+
+ tst_module_load(NULL, module_name, NULL);
+ module_loaded = 1;
+
+ test_run();
+
+ cleanup();
+
+ tst_exit();
+}
diff --git a/testcases/kernel/device-drivers/acpi/ltp_acpi.h b/testcases/kernel/device-drivers/acpi/ltp_acpi.h
index 5c0c37b..a8e64d0 100644
--- a/testcases/kernel/device-drivers/acpi/ltp_acpi.h
+++ b/testcases/kernel/device-drivers/acpi/ltp_acpi.h
@@ -1,97 +1,38 @@
/*
+ * Copyright (c) 2013 Oracle and/or its affiliates. All Rights Reserved.
*
- * Copyright (c) International Business Machines Corp., 2001
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
- * the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-/*
- * FILE : LtpAcpi.h
- * DESCRIPTION :
- * HISTORY:
- * 06/09/2003 Initial creation mridge@us.ibm.com
- * -Ported
- * updated - 01/09/2005 Updates from Intel to add functionality
+ * This program is distributed in the hope that it would be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
*
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
-#define ACPI_LTP_TEST_COMPONENT 0x00020999
-#define ACPI_LTP_TEST_CLASS "ltp_test"
-#define ACPI_LTP_TEST_HID "ACPI0999"
-#define ACPI_LTP_TEST_DRIVER_NAME "ACPI LTP Test Driver"
-#define ACPI_LTP_TEST_DEVICE_NAME "LTP Test"
-#define ACPI_LTP_TEST_FILE_STATE "state"
-#define ACPI_LTP_TEST_NOTIFY_STATUS 0x80
-#define ACPI_LTP_TEST_STATUS_OFFLINE 0x00
-#define ACPI_LTP_TEST_STATUS_ONLINE 0x01
-#define ACPI_LTP_TEST_STATUS_UNKNOWN 0xFF
-#define _COMPONENT ACPI_LTP_TEST_COMPONENT
-#define ACPI_TLP_TEST_MODULE_NAME ("acpi_ltp_test")
-#define ACPI_NS_SYSTEM_BUS "_SB_"
-#define ACPI_BATTERY_FORMAT_BIF "NNNNNNNNNSSSS"
-#define ACPI_BATTERY_FORMAT_BST "NNNN"
-
-
-#define ACPI_TYPE_ANY 0x00
-#define ACPI_TYPE_INTEGER 0x01 /* Byte/Word/Dword/Zero/One/Ones */
-#define ACPI_TYPE_STRING 0x02
-#define ACPI_TYPE_BUFFER 0x03
-#define ACPI_TYPE_PACKAGE 0x04 /* byte_const, multiple data_term/Constant/super_name */
-#define ACPI_TYPE_FIELD_UNIT 0x05
-#define ACPI_TYPE_DEVICE 0x06 /* Name, multiple Node */
-#define ACPI_TYPE_EVENT 0x07
-#define ACPI_TYPE_METHOD 0x08 /* Name, byte_const, multiple Code */
-#define ACPI_TYPE_MUTEX 0x09
-#define ACPI_TYPE_REGION 0x0A
-#define ACPI_TYPE_POWER 0x0B /* Name,byte_const,word_const,multi Node */
-#define ACPI_TYPE_PROCESSOR 0x0C /* Name,byte_const,Dword_const,byte_const,multi nm_o */
-#define ACPI_TYPE_THERMAL 0x0D /* Name, multiple Node */
-#define ACPI_TYPE_BUFFER_FIELD 0x0E
-#define ACPI_TYPE_DDB_HANDLE 0x0F
-#define ACPI_TYPE_DEBUG_OBJECT 0x10
-
-#define ACPI_TYPE_EXTERNAL_MAX 0x10
-#define LTPMAJOR 252
-
-/* Use 'k' as magic number */
-#define LTPACPI_IOC_MAGIC 'k'
-#define TOMINOR(x) ((x & 3) | ((x & 4) << 5))
-
-
-#define DEV_PATH "/dev"
-#define LTP_ACPI_DIR_NAME ""
-#define LTP_ACPI_DEV_NAME "LTP"
-#define LTP_ACPI_DEV_NODE_PATH DEV_PATH "/"
-#define LTP_ACPI_DEVICE_NAME DEV_PATH "/" LTP_ACPI_DEV_NAME
-#define MINOR_SHIFT_BITS 3
-#define MAX_PARTITIONS 8 /* partition 0 + 7 more possible due to 3 bit partition number field */
-#define MAX_NUM_DISKS 3 /* number of real devices */
-
-#define MPDEV_FLAG_CLEAR 0
-#define MPDEV_FLAG_SET 1
-
-typedef struct _ltpdev_cmd {
- u_int32_t cmd; // input - 0==recover, 1==fail
- u_int32_t status; // ouput - 0==success
-} ltpdev_cmd_t;
-
-typedef enum ltpdev_ioctl_cmds_s {
- /* version commands */
- LTP_IOCTL_NUMBER = 0x5500
-} ltpdev_ioctl_cmds_t;
-
-// define the ioctl cmds
-#define LTPDEV_CMD _IOR( LTPMAJOR, LTP_IOCTL_NUMBER, ltpdev_cmd_t **)
-
+#define ACPI_TEST_NAME "ltp_acpi_test"
+
+enum ACPI_TEST_CASES {
+ ACPI_INIT = 0,
+
+ /*
+ * Test-case will stop traversing if it finds _STR.
+ * To continue, please trigger it again.
+ */
+ ACPI_TRAVERSE,
+ ACPI_NOTIFY_HANDLER,
+ ACPI_EVENT_HANDLER,
+ ACPI_GLOBAL_LOCK,
+ ACPI_TEST_BUS,
+ ACPI_TEST_RESOURCES,
+ ACPI_SLEEP_TEST,
+ ACPI_TEST_REGISTER,
+ ACPI_TEST_DEV_CALLBACK,
+ ACPI_TC_NUM
+};
diff --git a/testcases/kernel/device-drivers/acpi/ltp_acpi_cmds.c b/testcases/kernel/device-drivers/acpi/ltp_acpi_cmds.c
index 26fcc15..419eb6a 100644
--- a/testcases/kernel/device-drivers/acpi/ltp_acpi_cmds.c
+++ b/testcases/kernel/device-drivers/acpi/ltp_acpi_cmds.c
@@ -1,25 +1,23 @@
/*
+ * Copyright (c) International Business Machines Corp., 2001
+ * Copyright (c) 2013 Oracle and/or its affiliates. All Rights Reserved.
*
- * Copyright (c) International Business Machines Corp., 2001
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
+ * the GNU General Public License for more details.
*
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
- * the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
/*
- * FILE : LtpAcpiCmds.c
- * DESCRIPTION :
* HISTORY:
* 06/09/2003 Initial creation mridge@us.ibm.com
* -Ported
@@ -27,7 +25,6 @@
*
* 01/03/2009 M��rton N��meth <nm127@freemail.hu>
* - Updated for Linux kernel 2.6.28
- *
*/
#include <linux/kernel.h>
@@ -40,477 +37,438 @@
#include <linux/pm.h>
#include <linux/acpi.h>
#include <linux/genhd.h>
-#include <asm/uaccess.h>
-#include "LtpAcpi.h"
-
-#ifndef ACPI_EC_UDELAY_GLK
-#define ACPI_EC_UDELAY_GLK 1000 /* Wait 1ms max. to get global lock */
-#endif
-
-static int ltpdev_open(struct block_device *bdev, fmode_t mode);
-static int ltpdev_release(struct gendisk *disk, fmode_t mode);
-static int ltpdev_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd,
- unsigned long arg);
-
-static u32 ltp_test_sleep_button_ev_handler(void *context);
-static u32 ltp_test_power_button_ev_handler(void *context);
-static u32 acpi_ec_gpe_handler(void *context);
-
-static void acpi_bus_notify(acpi_handle handle, u32 type, void *data);
-static acpi_status ltp_get_dev_callback(acpi_handle obj, u32 depth,
- void *context, void **ret);
-static acpi_status acpi_ec_io_ports(struct acpi_resource *resource,
- void *context);
-#if 0
-static acpi_status acpi_ec_space_setup(acpi_handle region_handle,
- u32 function,
- void *handler_context,
- void **return_context);
-static acpi_status acpi_ec_space_handler(u32 function,
- acpi_physical_address address,
- u32 bit_width,
- acpi_integer * value,
- void *handler_context,
- void *region_context);
-#endif
+#include <linux/dmi.h>
+#include <linux/nls.h>
-static struct block_device_operations blkops = {
-open: ltpdev_open,
-release:ltpdev_release,
-ioctl: ltpdev_ioctl,
-};
-
-int ltp_acpi_major = LTPMAJOR;
-int test_iteration = 0;
-
-static char genhd_flags = 0;
-static struct gendisk *gd_ptr;
-
-struct acpi_ec {
- acpi_handle handle;
- unsigned long uid;
- unsigned long long gpe_bit;
- struct acpi_generic_address status_addr;
- struct acpi_generic_address command_addr;
- struct acpi_generic_address data_addr;
- unsigned long global_lock;
- spinlock_t lock;
-};
+#include "ltp_acpi.h"
MODULE_AUTHOR("Martin Ridgeway <mridge@us.ibm.com>");
-MODULE_DESCRIPTION(ACPI_LTP_TEST_DRIVER_NAME);
+MODULE_AUTHOR("Alexey Kodanev <alexey.kodanev@oracle.com>");
+MODULE_DESCRIPTION("ACPI LTP Test Driver");
MODULE_LICENSE("GPL");
+ACPI_MODULE_NAME("LTP_ACPI")
-/*
- * Device operations for the virtual ACPI devices
- */
-
-extern struct acpi_device *acpi_root;
+#define prk_err(fmt, ...) \
+ pr_err(ACPI_TEST_NAME ": " fmt "\n", ##__VA_ARGS__)
+#define prk_alert(fmt, ...) \
+ pr_alert(ACPI_TEST_NAME ": " fmt "\n", ##__VA_ARGS__)
+#define prk_info(fmt, ...) \
+ pr_info(ACPI_TEST_NAME ": " fmt "\n", ##__VA_ARGS__)
-static int ltpdev_open(struct block_device *dev, fmode_t mode)
+static int acpi_failure(acpi_status status, const char *name)
{
- printk(KERN_ALERT "ltpdev_open \n");
+ if (ACPI_FAILURE(status)) {
+ ACPI_EXCEPTION((AE_INFO, status, name));
+ return 1;
+ }
return 0;
}
-static int ltpdev_release(struct gendisk *disk, fmode_t mode)
-{
-
- printk(KERN_ALERT "ltpdev_release \n");
- return 0;
-}
+/* points to the string of the last found object _STR */
+static char *str_obj_result;
-static u32 ltp_test_power_button_ev_handler(void *context)
-{
- printk(KERN_ALERT "ltp_test_power_button_ev_handler \n");
- return 1;
-}
+/* sysfs device path of the last found device */
+static char *sysfs_path;
-static u32 ltp_test_sleep_button_ev_handler(void *context)
-{
- printk(KERN_ALERT "ltp_test_sleep_button_ev_handler \n");
- return 1;
-}
+/* first found device with _CRS */
+static acpi_handle res_handle;
-static int ltpdev_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd,
- unsigned long arg)
+static acpi_status get_str_object(acpi_handle handle)
{
+ int res;
acpi_status status;
-// acpi_handle sys_bus_handle;
- acpi_handle start_handle = 0;
- acpi_handle parent_handle;
- acpi_handle child_handle;
- acpi_handle next_child_handle;
- acpi_status level;
- struct acpi_ec *ec;
- struct acpi_device *device;
- struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
+ acpi_handle temp = 0;
+ union acpi_object *str_obj;
+ char *buf = NULL;
-#if 0
- acpi_handle tmp_handle;
- struct acpi_table_ecdt *ecdt_ptr;
- struct acpi_buffer dsdt = { ACPI_ALLOCATE_BUFFER, NULL };
- struct acpi_buffer batt_buffer = { ACPI_ALLOCATE_BUFFER, NULL };
- struct acpi_buffer format = { sizeof(ACPI_BATTERY_FORMAT_BIF),
- ACPI_BATTERY_FORMAT_BIF
- };
- struct acpi_buffer data = { 0, NULL };
- union acpi_object *package = NULL;
- u32 start_ticks, stop_ticks, total_ticks;
-#endif
+ struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL};
- u32 i, bm_status;
- u8 type_a, type_b;
- u32 global_lock = 0;
- int state = 0;
+ status = acpi_get_handle(handle, "_STR", &temp);
- /*****************************************************************************/
+ if (ACPI_SUCCESS(status) &&
+ !acpi_evaluate_object(handle, "_STR", NULL, &buffer)) {
- printk(KERN_ALERT "ltpdev_ioctl \n");
- switch (cmd) {
- case LTPDEV_CMD:
+ str_obj = buffer.pointer;
- parent_handle = start_handle;
- child_handle = 0;
- level = 1;
- test_iteration++;
+ buf = kmalloc(str_obj->buffer.length / 2, GFP_KERNEL);
+ if (!buf) {
+ kfree(str_obj);
+ return AE_NO_MEMORY;
+ }
- printk(KERN_ALERT
- "-- IOCTL called to start ACPI tests -- Iteration:%d\n",
- test_iteration);
+ res = utf16s_to_utf8s((wchar_t *)str_obj->buffer.pointer,
+ str_obj->buffer.length, UTF16_LITTLE_ENDIAN, buf,
+ str_obj->buffer.length / 2);
- printk(KERN_ALERT "TEST -- acpi_get_handle \n");
+ buf[res] = '\0';
- status = acpi_get_handle(0, ACPI_NS_SYSTEM_BUS, &parent_handle);
+ kfree(str_obj_result);
+ str_obj_result = buf;
+ kfree(str_obj);
+ }
- printk(KERN_ALERT "TEST -- acpi_get_object_info \n");
+ return status;
+}
- status = acpi_get_object_info(parent_handle, &buffer);
+static void get_crs_object(acpi_handle handle)
+{
+ acpi_status status;
+ acpi_handle temp;
+ if (!res_handle) {
+ status = acpi_get_handle(handle, METHOD_NAME__CRS, &temp);
+ if (ACPI_SUCCESS(status))
+ res_handle = handle;
+ }
+}
- printk(KERN_ALERT "TEST -- acpi_get_next_object \n");
+static void get_sysfs_path(acpi_handle handle)
+{
+ acpi_status status;
+ struct acpi_device *device;
- status = acpi_get_next_object(ACPI_TYPE_ANY, parent_handle,
- child_handle, &next_child_handle);
+ kfree(sysfs_path);
+ sysfs_path = NULL;
- printk(KERN_ALERT "TEST -- acpi_get_parent \n");
+ status = acpi_bus_get_device(handle, &device);
+ if (ACPI_SUCCESS(status))
+ sysfs_path = kobject_get_path(&device->dev.kobj, GFP_KERNEL);
+}
- status = acpi_get_parent(parent_handle, &parent_handle);
+/* acpi handle of the last visited device */
+static acpi_handle start_parent;
- printk(KERN_ALERT "TEST -- acpi_evaluate_object \n");
+static int acpi_traverse(acpi_handle parent, acpi_handle child)
+{
+ static char indent[64];
+ const char * const ind_end = indent + 63;
+ static const char *ind = ind_end;
+ acpi_status status;
+ struct acpi_device_info *dev_info;
+ acpi_handle new_child;
- status = acpi_evaluate_object(parent_handle, "_ON", NULL, NULL);
+ if (!indent[0])
+ memset(indent, 0x20, 63);
- printk(KERN_ALERT "TEST -- acpi_get_table \n");
+ while (parent) {
+ status = acpi_get_next_object(ACPI_TYPE_DEVICE,
+ parent, child, &new_child);
-// status = acpi_get_table(ACPI_TABLE_RSDP, 1, &dsdt);
-// status = acpi_get_table(ACPI_TABLE_DSDT, 1, &dsdt);
-// status = acpi_get_table(ACPI_TABLE_FADT, 1, &dsdt);
-// status = acpi_get_table(ACPI_TABLE_FACS, 1, &dsdt);
-// status = acpi_get_table(ACPI_TABLE_PSDT, 1, &dsdt);
-// status = acpi_get_table(ACPI_TABLE_SSDT, 1, &dsdt);
-// status = acpi_get_table(ACPI_TABLE_XSDT, 1, &dsdt);
+ if (ACPI_FAILURE(status)) {
+ ind += 4;
-#if 0
- printk(KERN_ALERT "TEST -- acpi_get_firmware_table \n");
+ child = parent;
+ status = acpi_get_parent(child, &parent);
- status =
- acpi_get_firmware_table("ECDT", 1, ACPI_LOGICAL_ADDRESSING,
- (struct acpi_table_header **)&dsdt);
-#endif
+ /* no more devices */
+ if (ACPI_FAILURE(status)) {
+ start_parent = 0;
+ kfree(str_obj_result);
+ str_obj_result = NULL;
+ return 0;
+ }
+ continue;
+ }
- printk(KERN_ALERT "TEST -- acpi_install_notify_handler \n");
-
- status =
- acpi_install_notify_handler(ACPI_ROOT_OBJECT,
- ACPI_SYSTEM_NOTIFY,
- &acpi_bus_notify, NULL);
-
- printk(KERN_ALERT "TEST -- acpi_remove_notify_handler \n");
-
- status =
- acpi_remove_notify_handler(ACPI_ROOT_OBJECT,
- ACPI_SYSTEM_NOTIFY,
- &acpi_bus_notify);
-
- printk(KERN_ALERT
- "TEST -- acpi_install_fixed_event_handler \n");
- status =
- acpi_install_fixed_event_handler(ACPI_EVENT_POWER_BUTTON,
- ltp_test_power_button_ev_handler,
- NULL);
- if (status)
- printk(KERN_ALERT
- "Failed installing fixed event handler \n");
-
- printk(KERN_ALERT "TEST -- acpi_remove_fixed_event_handler \n");
- status =
- acpi_remove_fixed_event_handler(ACPI_EVENT_POWER_BUTTON,
- ltp_test_power_button_ev_handler);
- if (status)
- printk(KERN_ALERT
- "Failed removing fixed event handler \n");
-
- printk(KERN_ALERT
- "TEST -- acpi_install_fixed_event_handler \n");
- status =
- acpi_install_fixed_event_handler(ACPI_EVENT_SLEEP_BUTTON,
- ltp_test_sleep_button_ev_handler,
- NULL);
- if (status)
- printk(KERN_ALERT
- "Failed installing fixed event handler \n");
-
- printk(KERN_ALERT "TEST -- acpi_remove_fixed_event_handler \n");
- status =
- acpi_remove_fixed_event_handler(ACPI_EVENT_SLEEP_BUTTON,
- ltp_test_sleep_button_ev_handler);
- if (status)
- printk(KERN_ALERT
- "Failed removing fixed event handler \n");
-
- printk(KERN_ALERT "TEST -- acpi_acquire_global_lock \n");
- status =
- acpi_acquire_global_lock(ACPI_EC_UDELAY_GLK, &global_lock);
-
- printk(KERN_ALERT "TEST -- acpi_release_global_lock \n");
- status = acpi_release_global_lock(global_lock);
-
- printk(KERN_ALERT "TEST -- acpi_bus_get_device \n");
-
- status = acpi_bus_get_device(next_child_handle, &device);
-
-#if 0
- printk(KERN_ALERT "TEST -- acpi_bus_find_driver \n");
- status = acpi_bus_find_driver(device);
-#endif
+ status = acpi_get_object_info(new_child, &dev_info);
+ if (acpi_failure(status, "acpi_object_info failed"))
+ return 1;
+
+ get_sysfs_path(new_child);
+
+ get_crs_object(new_child);
+
+ if (ind < indent)
+ ind = indent;
+ else if (ind > ind_end)
+ ind = ind_end;
+
+ /*
+ * if we find _STR object we will stop here
+ * and save last visited child
+ */
+ if (ACPI_SUCCESS(get_str_object(new_child))) {
+ prk_info("%s%4.4s: has '_STR' '%s' path '%s'",
+ ind, (char *)&dev_info->name, str_obj_result,
+ (sysfs_path) ? sysfs_path : "no path");
+ ind -= 4;
+ start_parent = new_child;
+ kfree(dev_info);
+ return 0;
+ }
+ prk_info("%s%4.4s: path '%s'", ind, (char *)&dev_info->name,
+ (sysfs_path) ? sysfs_path : "no path");
- printk(KERN_ALERT "TEST -- acpi_bus_get_power \n");
- status = acpi_bus_get_power(next_child_handle, &state);
- if (status)
- printk(KERN_ALERT "Error reading power state \n");
+ ind -= 4;
+ parent = new_child;
+ child = 0;
+ kfree(dev_info);
+ }
- printk(KERN_ALERT "TEST -- acpi_driver_data \n");
+ return 0;
+}
- ec = acpi_driver_data(device);
+static int acpi_traverse_from_root(void)
+{
+ acpi_status status;
+ struct acpi_device_info *dev_info;
+ acpi_handle parent = 0, child = 0;
+
+ if (!start_parent) {
+ status = acpi_get_handle(NULL, ACPI_NS_ROOT_PATH, &parent);
+ if (acpi_failure(status, "acpi_get_handle"))
+ return 1;
+ status = acpi_get_object_info(parent, &dev_info);
+ if (acpi_failure(status, "acpi_object_info failed"))
+ return 1;
+ prk_info("start from %4.4s", (char *)&dev_info->name);
+ } else {
+ /* continue with the last visited child */
+ parent = start_parent;
+ }
- if (!ec) {
- printk(KERN_ALERT "Failure getting device data \n");
- } else {
+ return acpi_traverse(parent, child);
+}
- printk(KERN_ALERT
- "TEST -- acpi_install_gpe_handler \n");
- ec->status_addr = ec->command_addr;
- status =
- acpi_install_gpe_handler(device, ec->gpe_bit,
- ACPI_GPE_EDGE_TRIGGERED,
- &acpi_ec_gpe_handler, ec);
-/*
- status = acpi_install_address_space_handler (ACPI_ROOT_OBJECT,
- ACPI_ADR_SPACE_EC, &acpi_ec_space_handler,
- &acpi_ec_space_setup, ec);
-
- if (status) {
- printk(KERN_ALERT "Failed installing address space handler \n");
- }
-
- acpi_remove_address_space_handler(ACPI_ROOT_OBJECT,
- ACPI_ADR_SPACE_EC, &acpi_ec_space_handler);
-*/
- printk(KERN_ALERT "TEST -- acpi_remove_gpe_handler \n");
- acpi_remove_gpe_handler(device, ec->gpe_bit,
- &acpi_ec_gpe_handler);
- }
+/* first found device with _STR */
+static acpi_handle dev_handle;
- printk(KERN_ALERT "TEST -- acpi_get_current_resources \n");
- status = acpi_get_current_resources(next_child_handle, &buffer);
+static int acpi_init(void)
+{
+ acpi_status status;
+ acpi_handle parent_handle;
- if (status) {
- printk(KERN_ALERT "Failed get_current_resources %d\n",
- status);
- }
-#ifdef ACPI_FUTURE_USAGE
- printk(KERN_ALERT "TEST -- acpi_get_possible_resources \n");
- status =
- acpi_get_possible_resources(next_child_handle, &buffer);
+ struct acpi_device_info *dev_info;
- if (status) {
- printk(KERN_ALERT "Failed get_possible_resources %d\n",
- status);
- }
-#endif
+ prk_alert("TEST -- acpi_get_handle ");
+ status = acpi_get_handle(NULL, "\\_SB", &parent_handle);
+ if (acpi_failure(status, "acpi_get_handle"))
+ return 1;
- printk(KERN_ALERT "TEST -- acpi_walk_resources \n");
- status = acpi_walk_resources(ec->handle, METHOD_NAME__CRS,
- acpi_ec_io_ports, ec);
+ /* get first device on SYS bus, it will be used in other tests */
+ while (acpi_get_next_object(ACPI_TYPE_DEVICE,
+ parent_handle, 0, &dev_handle) == 0) {
+ parent_handle = dev_handle;
+ }
- if (status) {
- printk(KERN_ALERT "Failed walk_resources %d\n", status);
- }
+ status = acpi_get_object_info(dev_handle, &dev_info);
+ if (acpi_failure(status, "acpi_object_info failed"))
+ return 1;
- printk(KERN_ALERT "TEST -- acpi_evaluate_integer \n");
- status =
- acpi_evaluate_integer(ec->handle, "_GPE", NULL,
- &ec->gpe_bit);
- if (status)
- printk(KERN_ALERT
- "Error obtaining GPE bit assignment\n");
-
-#if 0
- printk(KERN_ALERT "TEST -- acpi_get_timer \n");
- status = acpi_get_timer(&total_ticks);
-
- if (status) {
- printk(KERN_ALERT "Failed get_timer %d\n", status);
- } else {
- printk(KERN_ALERT "get_timer -- total_ticks %d\n",
- total_ticks);
- }
+ prk_alert("ACPI object name %4.4s, type %d", (char *)&dev_info->name,
+ dev_info->type);
+ kfree(dev_info);
- start_ticks = 20;
- stop_ticks = 30;
+ prk_alert("TEST -- acpi_get_parent ");
+ status = acpi_get_parent(dev_handle, &parent_handle);
+ return acpi_failure(status, "acpi_get_parent failed");
+}
- printk(KERN_ALERT "TEST -- acpi_get_timer_duration \n");
- status =
- acpi_get_timer_duration(start_ticks, stop_ticks,
- &total_ticks);
+/*
+ * acpi_bus_notify
+ * ---------------
+ * Callback for all 'system-level' device notifications (values 0x00-0x7F).
+ */
+static void acpi_bus_notify(acpi_handle handle, u32 type, void *data)
+{
+ prk_alert("Register ACPI Bus Notify callback function");
+}
- if (status) {
- printk(KERN_ALERT "Failed get_timer_duration %d\n",
- status);
- } else {
- printk(KERN_ALERT "get_timer_duration total_ticks %d\n",
- total_ticks);
- }
-#endif
+static int acpi_test_notify_handler(void)
+{
+ acpi_status status;
- for (i = 0; i < ACPI_S_STATE_COUNT; i++) {
- printk(KERN_ALERT
- "TEST -- acpi_get_sleep_type_data \n");
- status = acpi_get_sleep_type_data(i, &type_a, &type_b);
-
- if (status) {
- printk(KERN_ALERT
- "Failed get_sleep_type_data %d\n",
- status);
- } else {
- printk(KERN_ALERT
- "get_sleep_type_data [%d] type_a:%d type_b:%d\n",
- i, type_a, type_b);
- }
- }
+ prk_alert("TEST -- acpi_install_notify_handler");
- printk(KERN_ALERT "TEST -- acpi_get_register \n");
+ status = acpi_install_notify_handler(dev_handle,
+ ACPI_SYSTEM_NOTIFY, &acpi_bus_notify, NULL);
-/*
- * ACPICA: Remove obsolete Flags parameter.
- * http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=d8c71b6d3b21cf21ad775e1cf6da95bf87bd5ad4
- *
- */
- acpi_get_register(ACPI_BITREG_BUS_MASTER_STATUS, &bm_status);
+ if (ACPI_SUCCESS(status)) {
+ prk_alert("TEST -- acpi_remove_notify_handler");
+ status = acpi_remove_notify_handler(dev_handle,
+ ACPI_SYSTEM_NOTIFY, &acpi_bus_notify);
+ return acpi_failure(status, "acpi_remove_notify_handler");
+ } else if (status != AE_ALREADY_EXISTS) {
+ return acpi_failure(status, "acpi_install_notify_handler");
+ }
- if (!bm_status) {
- printk(KERN_ALERT "Failed get_register [%d]\n",
- bm_status);
- } else {
- printk(KERN_ALERT "get_register [%d] \n", bm_status);
- }
+ return 0;
+}
+
+static u32 ltp_test_power_button_ev_handler(void *context)
+{
+ prk_alert("ltp_test_power_button_ev_handler");
+ return 1;
+}
-// Puts system to sleep, permenately !!!
-// status = acpi_enter_sleep_state(ACPI_STATE_S1);
+static u32 ltp_test_sleep_button_ev_handler(void *context)
+{
+ prk_alert("ltp_test_sleep_button_ev_handler");
+ return 1;
+}
+
+static int acpi_test_event_handler(void)
+{
+ int err = 0;
+ acpi_status status;
-#if 0
- printk(KERN_ALERT "TEST -- acpi_get_system_info \n");
- status = acpi_get_system_info(&buffer);
+ prk_alert("TEST -- acpi_install_fixed_event_handler");
+ status = acpi_install_fixed_event_handler(ACPI_EVENT_POWER_BUTTON,
+ ltp_test_power_button_ev_handler, NULL);
+
+ if (ACPI_SUCCESS(status)) {
+ prk_alert("TEST -- acpi_remove_fixed_event_handler");
+ status = acpi_remove_fixed_event_handler(
+ ACPI_EVENT_POWER_BUTTON,
+ ltp_test_power_button_ev_handler);
+ err = acpi_failure(status, "remove fixed event handler");
+ } else if (status != AE_ALREADY_EXISTS) {
+ err = acpi_failure(status, "install fixed event handler");
+ }
- if (status) {
- printk(KERN_ALERT "Failed get_system_info %d\n",
- status);
- } else {
- printk(KERN_ALERT
- "get_system_info buffer.length:%d buffer.pointer:%p\n",
- buffer.length, buffer.pointer);
+ prk_alert("TEST -- acpi_install_fixed_event_handler");
+ status = acpi_install_fixed_event_handler(ACPI_EVENT_RTC,
+ ltp_test_sleep_button_ev_handler, NULL);
+
+ if (ACPI_SUCCESS(status)) {
+ prk_alert("TEST -- acpi_remove_fixed_event_handler");
+ status = acpi_remove_fixed_event_handler(
+ ACPI_EVENT_RTC,
+ ltp_test_sleep_button_ev_handler);
+ err |= acpi_failure(status, "remove fixed event handler");
+ } else if (status != AE_ALREADY_EXISTS) {
+ err |= acpi_failure(status, "install fixed event handler");
+ }
- acpi_os_printf("os_printf OK %d\n", status);
+ return err;
+}
- if (buffer.pointer) {
- acpi_os_free(buffer.pointer);
- }
- }
+#ifndef ACPI_EC_UDELAY_GLK
+#define ACPI_EC_UDELAY_GLK 1000 /* Wait 1ms max. to get global lock */
#endif
- printk(KERN_ALERT "TEST -- acpi_get_devices \n");
- status =
- acpi_get_devices(NULL, ltp_get_dev_callback, "LTP0001",
- NULL);
+static int acpi_global_lock(void)
+{
+ acpi_status status;
+ u32 global_lock = 0;
- if (status) {
- printk(KERN_ALERT "Failed get_devices %d\n", status);
- }
-// status = acpi_os_create_semaphore(1, 1, &tmp_handle);
+ prk_alert("TEST -- acpi_acquire_global_lock ");
+ status = acpi_acquire_global_lock(ACPI_EC_UDELAY_GLK, &global_lock);
+ if (acpi_failure(status, "acpi_acquire_global_lock"))
+ return 1;
- if (status) {
- printk(KERN_ALERT "Failed os_create_semaphore %d\n",
- status);
- } else {
- printk(KERN_ALERT
- "os_create_semaphore OK, no deleteing %d\n",
- status);
-// acpi_os_delete_semaphore(tmp_handle);
+ prk_alert("TEST -- acpi_release_global_lock ");
+ status = acpi_release_global_lock(global_lock);
+ return acpi_failure(status, "acpi_release_global_lock");
+}
- }
+static int acpi_test_bus(void)
+{
+ int state = 0;
+ acpi_status status;
+ acpi_handle bus_handle;
+ struct acpi_device *device;
-#if 0
- printk(KERN_ALERT "TEST -- acpi_get_system_info \n");
- status = acpi_get_system_info(&batt_buffer);
+ status = acpi_get_handle(NULL, "\\_SB", &bus_handle);
+ if (acpi_failure(status, "acpi_get_handle"))
+ return 1;
- if (status) {
- printk(KERN_ALERT "Failed get_system_info %d\n",
- status);
- } else {
- printk(KERN_ALERT
- "get_system_info buffer.length:%d buffer.pointer:%p\n",
- buffer.length, buffer.pointer);
+ prk_alert("TEST -- acpi_bus_get_device");
+ status = acpi_bus_get_device(bus_handle, &device);
+ if (acpi_failure(status, "acpi_bus_get_device"))
+ return 1;
- package = (union acpi_object *)batt_buffer.pointer;
+ prk_alert("TEST -- acpi_bus_update_power ");
+ status = acpi_bus_update_power(device->handle, &state);
+ if (acpi_failure(status, "error reading power state"))
+ return 1;
+
+ prk_info("acpi bus power state is %d", state);
+ return 0;
+}
+
+static acpi_status acpi_ec_io_ports(struct acpi_resource *resource,
+ void *context)
+{
+ return 0;
+}
- /* Extract Package Data */
+static int acpi_test_resources(void)
+{
+ int err = 0;
+ acpi_status status;
+ struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
- printk(KERN_ALERT "TEST -- acpi_extract_package \n");
- status = acpi_extract_package(package, &format, &data);
+ /* skip if we don't find device with _CRC */
+ if (res_handle == 0)
+ return 0;
- data.pointer = kmalloc(data.length, GFP_KERNEL);
+ prk_alert("TEST -- acpi_get_current_resources");
+ status = acpi_get_current_resources(res_handle, &buffer);
+ err = acpi_failure(status, "failed get_current_resources");
- if (!data.pointer) {
- printk(KERN_ALERT
- "Failed getting memory kalloc \n");
- } else {
- memset(data.pointer, 0, data.length);
+#ifdef ACPI_FUTURE_USAGE
+ prk_alert("TEST -- acpi_get_possible_resources");
+ status = acpi_get_possible_resources(res_handle, &buffer);
+ err |= acpi_failure(status, "get_possible_resources");
+#endif
- printk(KERN_ALERT
- "TEST -- acpi_extract_package \n");
- status =
- acpi_extract_package(package, &format,
- &data);
+ prk_alert("TEST -- acpi_walk_resources ");
+ status = acpi_walk_resources(res_handle, METHOD_NAME__CRS,
+ acpi_ec_io_ports, NULL);
+ err |= acpi_failure(status, "Failed walk_resources");
- kfree(data.pointer);
- }
+ return err;
+}
-// acpi_os_free(buffer.pointer);
+static int acpi_sleep_test(void)
+{
+ int err = 0;
+ acpi_status status;
+ u32 i;
+ u8 type_a, type_b;
+ prk_alert("TEST -- acpi_get_sleep_type_data ");
+
+ for (i = 0; i < ACPI_S_STATE_COUNT; ++i) {
+ status = acpi_get_sleep_type_data(i, &type_a, &type_b);
+ if (ACPI_SUCCESS(status)) {
+ prk_info("get_sleep_type_data S%d a:%d b:%d",
+ i, type_a, type_b);
+ } else if (status != AE_NOT_FOUND) {
+ err |= 1;
}
-#endif
+ }
- printk(KERN_ALERT
- "-- IOCTL ACPI tests Complete -- Iteration:%d\n",
- test_iteration);
+ return err;
+}
+
+static int acpi_test_register(void)
+{
+ int i, err = 0;
+ u32 val;
+ acpi_status status;
- break;
+ prk_alert("TEST -- acpi_read_bit_register");
+ /*
+ * ACPICA: Remove obsolete Flags parameter.
+ * http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;
+ * a=commitdiff;h=d8c71b6d3b21cf21ad775e1cf6da95bf87bd5ad4
+ *
+ * ACPICA: Rename ACPI bit register access functions
+ * http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/
+ * commit/?id=50ffba1bd3120b069617455545bc27bcf3cf7579
+ */
+ for (i = 0; i < ACPI_NUM_BITREG; ++i) {
+ status = acpi_read_bit_register(i, &val);
+ err |= acpi_failure(status, "acpi_read_bit_register");
+ if (ACPI_SUCCESS(status))
+ prk_alert("get register: %02x val: %04x", i, val);
}
- return 0;
+ return err;
}
static acpi_status ltp_get_dev_callback(acpi_handle obj, u32 depth,
- void *context, void **ret)
+ void *context, void **ret)
{
char *name = context;
char fullname[20];
@@ -521,154 +479,167 @@ static acpi_status ltp_get_dev_callback(acpi_handle obj, u32 depth,
* separately in PCI space.
*/
sprintf(fullname, "%s SBA", name);
- printk(KERN_ALERT "get_dev_callback SBA name %s \n", fullname);
+ prk_info("get_dev_callback SBA name %s", fullname);
sprintf(fullname, "%s IOC", name);
- printk(KERN_ALERT "get_dev_callback IOC name %s \n", fullname);
+ prk_info("get_dev_callback IOC name %s", fullname);
return 0;
}
-/**
- * acpi_bus_notify
- * ---------------
- * Callback for all 'system-level' device notifications (values 0x00-0x7F).
- */
-static void acpi_bus_notify(acpi_handle handle, u32 type, void *data)
+static int acpi_test_dev_callback(void)
{
+ acpi_status status;
+ prk_alert("TEST -- acpi_get_devices ");
+ status = acpi_get_devices(NULL, ltp_get_dev_callback, "LTP0001", NULL);
+ return acpi_failure(status, "acpi_get_devices");
+}
- printk(KERN_ALERT "Register ACPI Bus Notify callback function \n");
+static int current_test_case;
+static int test_result;
+static void device_release(struct device *dev)
+{
+ prk_info("device released");
}
-static u32 acpi_ec_gpe_handler(void *context)
+static struct device tdev = {
+ .init_name = ACPI_TEST_NAME,
+ .release = device_release,
+};
+
+/* print test result to sysfs file */
+static ssize_t sys_result(struct device *dev,
+ struct device_attribute *attr, char *buf)
{
- printk(KERN_ALERT "Register ACPI ec_gpe_handler callback function \n");
- return 1;
+ return scnprintf(buf, PAGE_SIZE, "%d\n", test_result);
}
+static DEVICE_ATTR(result, S_IRUSR, sys_result, NULL);
-static acpi_status acpi_ec_io_ports(struct acpi_resource *resource,
- void *context)
+/* print found device description */
+static ssize_t sys_str(struct device *dev,
+ struct device_attribute *attr, char *buf)
{
- return 0;
+ if (str_obj_result)
+ return scnprintf(buf, PAGE_SIZE, "%s", str_obj_result);
+ else
+ return 0;
}
+static DEVICE_ATTR(str, S_IRUSR, sys_str, NULL);
-#if 0
-static acpi_status acpi_ec_space_handler(u32 function,
- acpi_physical_address address,
- u32 bit_width,
- acpi_integer * value,
- void *handler_context,
- void *region_context)
+/* print found device's sysfs path */
+static ssize_t sys_path(struct device *dev,
+ struct device_attribute *attr, char *buf)
{
- int result = 0;
- struct acpi_ec *ec = NULL;
- u32 temp = 0;
-
- ACPI_FUNCTION_TRACE("acpi_ec_space_handler");
-
- if ((address > 0xFF) || (bit_width != 8) || !value || !handler_context)
- return_VALUE(AE_BAD_PARAMETER);
-
- ec = (struct acpi_ec *)handler_context;
-
- switch (function) {
- case ACPI_READ:
- result = 0;
- *value = (acpi_integer) temp;
- break;
- case ACPI_WRITE:
- result = 0;
- break;
- default:
- result = -EINVAL;
- break;
- }
-
- switch (result) {
- case -EINVAL:
- return_VALUE(AE_BAD_PARAMETER);
- break;
- case -ENODEV:
- return_VALUE(AE_NOT_FOUND);
- break;
- case -ETIME:
- return_VALUE(AE_TIME);
- break;
- default:
- return_VALUE(AE_OK);
- }
-
+ if (sysfs_path)
+ return scnprintf(buf, PAGE_SIZE, "%s", sysfs_path);
+ else
+ return 0;
}
+static DEVICE_ATTR(path, S_IRUSR, sys_path, NULL);
-static acpi_status acpi_ec_space_setup(acpi_handle region_handle,
- u32 function,
- void *handler_context,
- void **return_context)
+static ssize_t sys_tcase(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
{
- /*
- * The EC object is in the handler context and is needed
- * when calling the acpi_ec_space_handler.
- */
- *return_context = handler_context;
+ sscanf(buf, "%d", ¤t_test_case);
+ prk_info("test-case %d", current_test_case);
+
+ switch (current_test_case) {
+ case ACPI_INIT:
+ test_result = acpi_init();
+ break;
+ case ACPI_TRAVERSE:
+ test_result = acpi_traverse_from_root();
+ break;
+ case ACPI_NOTIFY_HANDLER:
+ test_result = acpi_test_notify_handler();
+ break;
+ case ACPI_EVENT_HANDLER:
+ test_result = acpi_test_event_handler();
+ break;
+ case ACPI_GLOBAL_LOCK:
+ test_result = acpi_global_lock();
+ break;
+ case ACPI_TEST_BUS:
+ test_result = acpi_test_bus();
+ break;
+ case ACPI_TEST_RESOURCES:
+ test_result = acpi_test_resources();
+ break;
+ case ACPI_SLEEP_TEST:
+ test_result = acpi_sleep_test();
+ break;
+ case ACPI_TEST_REGISTER:
+ test_result = acpi_test_register();
+ break;
+ case ACPI_TEST_DEV_CALLBACK:
+ test_result = acpi_test_dev_callback();
+ break;
+ }
- return AE_OK;
+ return count;
}
-#endif
+static DEVICE_ATTR(tcase, S_IWUSR, NULL, sys_tcase);
int init_module(void)
{
- int result;
-
- printk(KERN_ALERT "ltpdev_init_module \n");
-
- result = register_blkdev(ltp_acpi_major, LTP_ACPI_DEV_NAME);
-
- printk(KERN_ALERT "LTP ACPI: register_blkdev result=%d major %d\n",
- result, ltp_acpi_major);
+ int err = 0;
+ prk_info("Starting module");
- if (result < 0) {
- printk(KERN_ALERT "LTP ACPI: can't get major %d\n",
- ltp_acpi_major);
- return result;
+ err = device_register(&tdev);
+ if (err) {
+ prk_err("Unable to register device");
+ goto err0;
}
-// if (ltp_acpi_major == 0)
-// ltp_acpi_major = result; /* dynamic */
+ prk_info("device registered");
- gd_ptr = kmalloc(sizeof(struct gendisk *), GFP_KERNEL);
-
- if (!gd_ptr) {
- printk(KERN_ALERT "ERROR getting memory !!!\n");
- return 0;
+ err = device_create_file(&tdev, &dev_attr_result);
+ if (err) {
+ prk_err("Can't create sysfs file 'result'");
+ goto err1;
}
- gd_ptr = alloc_disk(1);
-
- printk(KERN_ALERT "gd_ptr after alloc = %p \n", gd_ptr);
-
- gd_ptr->major = ltp_acpi_major;
- gd_ptr->first_minor = 0;
- gd_ptr->fops = &blkops;
-// gd_ptr->minor_shift = MINOR_SHIFT_BITS;
- gd_ptr->driverfs_dev = NULL;
-// gd_ptr->disk_de = NULL;
- gd_ptr->flags = genhd_flags;
+ err = device_create_file(&tdev, &dev_attr_str);
+ if (err) {
+ prk_err("Can't create sysfs file 'str'");
+ goto err2;
+ }
- sprintf(gd_ptr->disk_name, LTP_ACPI_DEV_NAME);
+ err = device_create_file(&tdev, &dev_attr_tcase);
+ if (err) {
+ prk_err(": Can't create sysfs file 'tc'");
+ goto err3;
+ }
- add_disk(gd_ptr);
+ err = device_create_file(&tdev, &dev_attr_path);
+ if (err) {
+ prk_err(": Can't create sysfs file 'path'");
+ goto err4;
+ }
return 0;
+
+err4:
+ device_remove_file(&tdev, &dev_attr_tcase);
+err3:
+ device_remove_file(&tdev, &dev_attr_str);
+err2:
+ device_remove_file(&tdev, &dev_attr_result);
+err1:
+ device_unregister(&tdev);
+err0:
+ return err;
}
void cleanup_module(void)
{
+ prk_info("Unloading module\n");
- printk(KERN_ALERT "Exiting module and cleaning up \n");
-
- put_disk(gd_ptr);
-
- del_gendisk(gd_ptr);
-
- unregister_blkdev(ltp_acpi_major, LTP_ACPI_DEV_NAME);
+ kfree(str_obj_result);
+ kfree(sysfs_path);
+ device_remove_file(&tdev, &dev_attr_result);
+ device_remove_file(&tdev, &dev_attr_str);
+ device_remove_file(&tdev, &dev_attr_tcase);
+ device_remove_file(&tdev, &dev_attr_path);
+ device_unregister(&tdev);
}
--
1.7.1
[-- Attachment #2: Type: text/plain, Size: 455 bytes --]
------------------------------------------------------------------------------
Rapidly troubleshoot problems before they affect your business. Most IT
organizations don't have a clear picture of how application performance
affects their revenue. With AppDynamics, you get 100% visibility into your
Java,.NET, & PHP application. Start your 15-day FREE TRIAL of AppDynamics Pro!
http://pubads.g.doubleclick.net/gampad/clk?id=84349351&iu=/4140/ostg.clktrk
[-- Attachment #3: Type: text/plain, Size: 155 bytes --]
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [LTP] [PATCH 3/3] device-drivers: acpi: enable build and run
2013-11-28 12:17 [LTP] [PATCH v5 2/3] device-drivers: acpi: fixes Alexey Kodanev
@ 2013-11-28 12:17 ` Alexey Kodanev
2013-12-12 17:38 ` chrubis
0 siblings, 1 reply; 4+ messages in thread
From: Alexey Kodanev @ 2013-11-28 12:17 UTC (permalink / raw)
To: ltp-list; +Cc: vasily.isaenko, Alexey Kodanev
Signed-off-by: Alexey Kodanev <alexey.kodanev@oracle.com>
---
runtest/kernel_misc | 1 +
testcases/kernel/device-drivers/Makefile | 3 ++-
2 files changed, 3 insertions(+), 1 deletions(-)
diff --git a/runtest/kernel_misc b/runtest/kernel_misc
index 3e3d016..c421ea0 100644
--- a/runtest/kernel_misc
+++ b/runtest/kernel_misc
@@ -4,3 +4,4 @@ rtc01 rtc01
block_dev block_dev
tpci tpci
tbio tbio
+ltp_acpi ltp_acpi
diff --git a/testcases/kernel/device-drivers/Makefile b/testcases/kernel/device-drivers/Makefile
index 9f80094..15294cf 100644
--- a/testcases/kernel/device-drivers/Makefile
+++ b/testcases/kernel/device-drivers/Makefile
@@ -18,7 +18,8 @@ top_srcdir ?= ../../..
include $(top_srcdir)/include/mk/env_pre.mk
-SUBDIRS := block \
+SUBDIRS := acpi \
+ block \
pci \
rtc \
tbio \
--
1.7.1
------------------------------------------------------------------------------
Rapidly troubleshoot problems before they affect your business. Most IT
organizations don't have a clear picture of how application performance
affects their revenue. With AppDynamics, you get 100% visibility into your
Java,.NET, & PHP application. Start your 15-day FREE TRIAL of AppDynamics Pro!
http://pubads.g.doubleclick.net/gampad/clk?id=84349351&iu=/4140/ostg.clktrk
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [LTP] [PATCH 3/3] device-drivers: acpi: enable build and run
2013-11-28 12:17 ` [LTP] [PATCH 3/3] device-drivers: acpi: enable build and run Alexey Kodanev
@ 2013-12-12 17:38 ` chrubis
[not found] ` <52AADA53.6050503@oracle.com>
0 siblings, 1 reply; 4+ messages in thread
From: chrubis @ 2013-12-12 17:38 UTC (permalink / raw)
To: Alexey Kodanev; +Cc: vasily.isaenko, ltp-list
Hi!
Whole patchset pushed, thanks.
--
Cyril Hrubis
chrubis@suse.cz
------------------------------------------------------------------------------
Rapidly troubleshoot problems before they affect your business. Most IT
organizations don't have a clear picture of how application performance
affects their revenue. With AppDynamics, you get 100% visibility into your
Java,.NET, & PHP application. Start your 15-day FREE TRIAL of AppDynamics Pro!
http://pubads.g.doubleclick.net/gampad/clk?id=84349831&iu=/4140/ostg.clktrk
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [LTP] [PATCH 3/3] device-drivers: acpi: enable build and run
[not found] ` <52AADA53.6050503@oracle.com>
@ 2014-01-20 18:53 ` chrubis
0 siblings, 0 replies; 4+ messages in thread
From: chrubis @ 2014-01-20 18:53 UTC (permalink / raw)
To: alexey.kodanev; +Cc: vasily.isaenko, ltp-list
Hi!
> On 12/12/2013 09:38 PM, chrubis@suse.cz wrote:
> > Hi!
> > Whole patchset pushed, thanks.
> >
> Thank you!
>
> There's one more patch left: acpi-cpufreq test.
Pushed, thanks for reminder.
--
Cyril Hrubis
chrubis@suse.cz
------------------------------------------------------------------------------
CenturyLink Cloud: The Leader in Enterprise Cloud Services.
Learn Why More Businesses Are Choosing CenturyLink Cloud For
Critical Workloads, Development Environments & Everything In Between.
Get a Quote or Start a Free Trial Today.
http://pubads.g.doubleclick.net/gampad/clk?id=119420431&iu=/4140/ostg.clktrk
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2014-01-20 18:53 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-11-28 12:17 [LTP] [PATCH v5 2/3] device-drivers: acpi: fixes Alexey Kodanev
2013-11-28 12:17 ` [LTP] [PATCH 3/3] device-drivers: acpi: enable build and run Alexey Kodanev
2013-12-12 17:38 ` chrubis
[not found] ` <52AADA53.6050503@oracle.com>
2014-01-20 18:53 ` chrubis
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.