[tlinux-users:08373] Re: omnibook and acpi
| Newsgroups | gmane.linux.hardware.toshiba |
|---|---|
| Message-ID | <[email protected]> |
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 WL <[email protected]> wrote: > well, omnibook does not support tecra m1. it says unknown model in > kernel logs. guess i'll have to live it. > I have reports that toshset works well on the Tecra M1. For it to work, however, you must patch toshiba_acpi with the ``experimental'' patch found here: http://memebeam.org/toys/ExperimentalToshibaAcpiDriver For recent kernels (e.g. works on 2.6..18, 2.6.19) you should instead use the attached patch. regards-- Charles -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.6 (GNU/Linux) Comment: Processed by Mailcrypt 3.5.8 <http://mailcrypt.sourceforge.net/> iD8DBQFFw6VMPK2zrJwS/lYRAuJrAJwOugYtc8N25s9/lYL46tlcCYo+YACeMNxL hBJBZWTXmGZhi4Vvt76PU0A= =cLBU -----END PGP SIGNATURE-----
toshiba_acpi.patch
(text/x-c, 6.6 KB)
*** toshiba_acpi.c.orig Sat Jul 8 10:50:20 2006
--- toshiba_acpi.c Tue Jul 25 16:15:29 2006
***************
*** 28,39 ****
* Yasushi Nagato - changes for linux kernel 2.4 -> 2.5
* Rob Miller - TV out and hotkeys help
*
*
* TODO
*
*/
! #define TOSHIBA_ACPI_VERSION "0.18"
#define PROC_INTERFACE_VERSION 1
#include <linux/kernel.h>
--- 28,53 ----
* 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 and
+ * Charles Schwieters.
+ *
+ * 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 "experimental-dev-toshiba-test-4"
#define PROC_INTERFACE_VERSION 1
#include <linux/kernel.h>
***************
*** 41,46 ****
--- 55,63 ----
#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>
***************
*** 49,54 ****
--- 66,74 ----
MODULE_DESCRIPTION("Toshiba Laptop ACPI Extras Driver");
MODULE_LICENSE("GPL");
+ #define tacpi_isa_readb(a) readb(__ISA_IO_base + (a))
+ #define tacpi_isa_readw(a) readw(__ISA_IO_base + (a))
+
#define MY_LOGPREFIX "toshiba_acpi: "
#define MY_ERR KERN_ERR MY_LOGPREFIX
#define MY_NOTICE KERN_NOTICE MY_LOGPREFIX
***************
*** 463,468 ****
--- 483,655 ----
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(®s, (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(®s);
+
+ if (copy_to_user((SMMRegisters*)arg, ®s, sizeof(SMMRegisters)))
+ return -EFAULT;
+
+ return err;
+ }
+
+ static int
+ tosh_get_machine_id(void)
+ {
+ int id;
+ unsigned short bx,cx;
+ unsigned long address;
+
+ id = (0x100*(int)tacpi_isa_readb(0xffffe))+((int)tacpi_isa_readb(0xffffa));
+
+ /* 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 = 0x000f0000+bx;
+ cx = tacpi_isa_readw(address);
+ address = 0x000f0009+bx+cx;
+ cx = tacpi_isa_readw(address);
+ address = 0x000f000a+cx;
+ cx = tacpi_isa_readw(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)
+ {
+ int major, minor;
+ int day, month, year;
+
+ tosh_id = tosh_get_machine_id();
+
+ /* get the BIOS version */
+ major = tacpi_isa_readb(0xfe009)-'0';
+ minor = ((tacpi_isa_readb(0xfe00b)-'0')*10)+(tacpi_isa_readb(0xfe00c)-'0');
+ tosh_bios = (major*0x100)+minor;
+
+ /* get the BIOS date */
+ day = ((tacpi_isa_readb(0xffff5)-'0')*10)+(tacpi_isa_readb(0xffff6)-'0');
+ month = ((tacpi_isa_readb(0xffff8)-'0')*10)+(tacpi_isa_readb(0xffff9)-'0');
+ year = ((tacpi_isa_readb(0xffffb)-'0')*10)+(tacpi_isa_readb(0xffffc)-'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;
+
+ 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();
+ create_proc_info_entry(OLD_PROC_TOSHIBA, 0, NULL, tosh_get_info);
+
+ 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,515 ****
--- 697,703 ----
{
acpi_status status = AE_OK;
u32 hci_result;
+ int status2;
if (acpi_disabled)
return -ENODEV;
***************
*** 530,535 ****
--- 718,726 ----
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,561 ****
--- 747,754 ----
if (toshiba_proc_dir)
remove_proc_entry(PROC_TOSHIBA, acpi_root_dir);
+ old_driver_emulation_exit();
+
return;
}