[tlinux-users:08373] Re: omnibook and acpi

[email protected]
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(&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)
+ {
+ 	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;
  }
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.