SOURCES: linux-2.6-toshiba_acpi_0.18-dev_toshiba_test4.patch (NEW)...

wolvverine wolvverine at pld-linux.org
Wed Sep 27 00:05:55 CEST 2006


Author: wolvverine                   Date: Tue Sep 26 22:05:55 2006 GMT
Module: SOURCES                       Tag: HEAD
---- Log message:
- for toshiba laptops

---- Files affected:
SOURCES:
   linux-2.6-toshiba_acpi_0.18-dev_toshiba_test4.patch (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: SOURCES/linux-2.6-toshiba_acpi_0.18-dev_toshiba_test4.patch
diff -u /dev/null SOURCES/linux-2.6-toshiba_acpi_0.18-dev_toshiba_test4.patch:1.1
--- /dev/null	Wed Sep 27 00:05:55 2006
+++ SOURCES/linux-2.6-toshiba_acpi_0.18-dev_toshiba_test4.patch	Wed Sep 27 00:05:50 2006
@@ -0,0 +1,247 @@
+--- toshiba_acpi.c.orig	2006-06-22 21:39:40.000000000 -0400
++++ toshiba_acpi.c	2006-06-22 21:48:07.000000000 -0400
+@@ -28,12 +28,26 @@
+  *	Yasushi Nagato - changes for linux kernel 2.4 -> 2.5
+  *	Rob Miller - TV out and hotkeys help
+  *
++ *  PLEASE NOTE
++ *
++ *  This is an experimental version of toshiba_acpi which includes emulation
++ *  of the original toshiba driver's /proc/toshiba and /dev/toshiba,
++ *  allowing Toshiba userspace utilities to work.  The relevant code was
++ *  based on toshiba.c (copyright 1996-2001 Jonathan A. Buzzard) and
++ *  incorporated into this driver with help from Gintautas Miliauskas,
++ *  Charles Schwieters, and Christoph Burger-Scheidlin.
++ *
++ *  Caveats:
++ *      * hotkey status in /proc/toshiba is not implemented
++ *      * to make accesses to /dev/toshiba load this driver instead of
++ *          the original driver, you will have to modify your module
++ *          auto-loading configuration
+  *
+  *  TODO
+  *
+  */
+ 
+-#define TOSHIBA_ACPI_VERSION	"0.18"
++#define TOSHIBA_ACPI_VERSION	"experimental-dev-toshiba-test-5"
+ #define PROC_INTERFACE_VERSION	1
+ 
+ #include <linux/kernel.h>
+@@ -41,6 +55,9 @@
+ #include <linux/init.h>
+ #include <linux/types.h>
+ #include <linux/proc_fs.h>
++#include <linux/miscdevice.h>
++#include <linux/toshiba.h>
++#include <asm/io.h>
+ #include <asm/uaccess.h>
+ 
+ #include <acpi/acpi_drivers.h>
+@@ -463,6 +480,179 @@
+ 	return p;
+ }
+ 
++/* /dev/toshiba and /proc/toshiba handlers {{{
++ *
++ * ISSUE: lots of magic numbers and mysterious code
++ */
++
++#define TOSH_MINOR_DEV		181
++#define OLD_PROC_TOSHIBA	"toshiba"
++
++static int
++tosh_acpi_bridge(SMMRegisters* regs)
++{
++	acpi_status status;
++
++	/* assert(sizeof(SMMRegisters) == sizeof(u32)*HCI_WORDS); */
++	status = hci_raw((u32*)regs, (u32*)regs);
++	if (status == AE_OK && (regs->eax & 0xff00) == HCI_SUCCESS)
++		return 0;
++
++	return -EINVAL;
++}
++
++static int
++tosh_ioctl(struct inode* ip, struct file* fp, unsigned int cmd,
++	unsigned long arg)
++{
++	SMMRegisters regs;
++	unsigned short ax,bx;
++	int err;
++
++	if ((!arg) || (cmd != TOSH_SMM))
++		return -EINVAL;
++
++	if (copy_from_user(&regs, (SMMRegisters*)arg, sizeof(SMMRegisters)))
++		return -EFAULT;
++
++	ax = regs.eax & 0xff00;
++	bx = regs.ebx & 0xffff;
++
++	/* block HCI calls to read/write memory & PCI devices */
++	if (((ax==HCI_SET) || (ax==HCI_GET)) && (bx>0x0069))
++		return -EINVAL;
++
++	err = tosh_acpi_bridge(&regs);
++
++	if (copy_to_user((SMMRegisters*)arg, &regs, sizeof(SMMRegisters)))
++		return -EFAULT;
++
++	return err;
++}
++
++static int
++tosh_get_machine_id(void __iomem *bios)
++{
++	int id;
++	unsigned short bx,cx;
++	unsigned long address;
++
++	id = (0x100*(int) readb(bios+0xfffe))+((int) readb(bios+0xfffa));
++
++	/* do we have a SCTTable machine identication number on our hands */
++	if (id==0xfc2f) {
++		bx = 0xe6f5; /* cheat */
++		/* now twiddle with our pointer a bit */
++		address = 0x00000000 + bx;
++		cx = readw(bios + address);
++		address = 0x00000009 + bx + cx;
++		cx = readw(bios + address);
++		address = 0x0000000a + cx;
++		cx = readw(bios + address);
++		/* now construct our machine identification number */
++		id = ((cx & 0xff)<<8)+((cx & 0xff00)>>8);
++	}
++
++	return id;
++}
++
++static int tosh_id;
++static int tosh_bios;
++static int tosh_date;
++static int tosh_sci;
++
++static struct file_operations tosh_fops = {
++	.owner = THIS_MODULE,
++	.ioctl = tosh_ioctl
++};
++
++static struct miscdevice tosh_device = {
++	TOSH_MINOR_DEV,
++	"toshiba",
++	&tosh_fops
++};
++
++static void
++setup_tosh_info(void __iomem *bios)
++{
++	int major, minor;
++	int day, month, year;
++
++	tosh_id = tosh_get_machine_id(bios);
++
++	/* get the BIOS version */
++	major = readb(bios + 0xe009)-'0';
++	minor = ((readb(bios + 0xe00b)-'0')*10)+(readb(bios + 0xe00c)-'0');
++	tosh_bios = (major*0x100)+minor;
++
++	/* get the BIOS date */
++	day = ((readb(bios + 0xfff5)-'0')*10)+(readb(bios + 0xfff6)-'0');
++	month = ((readb(bios + 0xfff8)-'0')*10)+(readb(bios + 0xfff9)-'0');
++	year = ((readb(bios + 0xfffb)-'0')*10)+(readb(bios + 0xfffc)-'0');
++	tosh_date = (((year-90) & 0x1f)<<10) | ((month & 0xf)<<6)
++		| ((day & 0x1f)<<1);
++}
++
++/* /proc/toshiba read handler */
++static int
++tosh_get_info(char* buffer, char** start, off_t fpos, int length)
++{
++	char* temp = buffer;
++	/* TODO: tosh_fn_status() */
++	int key = 0;
++
++	/* Format:
++	 *    0) Linux driver version (this will change if format changes)
++	 *    1) Machine ID
++	 *    2) SCI version
++	 *    3) BIOS version (major, minor)
++	 *    4) BIOS date (in SCI date format)
++	 *    5) Fn Key status
++	 */
++
++	temp += sprintf(temp, "1.1 0x%04x %d.%d %d.%d 0x%04x 0x%02x\n",
++		tosh_id,
++		(tosh_sci & 0xff00)>>8,
++		tosh_sci & 0xff,
++		(tosh_bios & 0xff00)>>8,
++		tosh_bios & 0xff,
++		tosh_date,
++		key);
++
++	return temp-buffer;
++}
++
++static int __init
++old_driver_emulation_init(void)
++{
++	int status;
++	void __iomem *bios = ioremap(0xf0000, 0x10000);
++	if (!bios)
++		return -ENOMEM;
++
++	if ((status = misc_register(&tosh_device))) {
++		printk(MY_ERR "failed to register misc device %d (\"%s\")\n",
++			tosh_device.minor, tosh_device.name);
++		return status;
++	}
++
++	setup_tosh_info(bios);
++	create_proc_info_entry(OLD_PROC_TOSHIBA, 0, NULL, tosh_get_info);
++
++	iounmap(bios);
++
++	return 0;
++}
++
++static void __exit
++old_driver_emulation_exit(void)
++{
++	remove_proc_entry(OLD_PROC_TOSHIBA, NULL);
++	misc_deregister(&tosh_device);
++}
++
++/* }}} end of /dev/toshiba and /proc/toshiba handlers */
++
+ /* proc and module init
+  */
+ 
+@@ -510,6 +700,7 @@
+ {
+ 	acpi_status status = AE_OK;
+ 	u32 hci_result;
++	int status2;
+ 
+ 	if (acpi_disabled)
+ 		return -ENODEV;
+@@ -530,6 +721,9 @@
+ 	       TOSHIBA_ACPI_VERSION);
+ 	printk(MY_INFO "    HCI method: %s\n", method_hci);
+ 
++	if ((status2 = old_driver_emulation_init()))
++		return status2;
++
+ 	force_fan = 0;
+ 	key_event_valid = 0;
+ 
+@@ -556,6 +750,8 @@
+ 	if (toshiba_proc_dir)
+ 		remove_proc_entry(PROC_TOSHIBA, acpi_root_dir);
+ 
++	old_driver_emulation_exit();
++
+ 	return;
+ }
+ 
================================================================


More information about the pld-cvs-commit mailing list