[PATCH 1/3] UBUNTU: SAUCE: update toshiba_acpi module to development snapshot 19a

Ben Collins ben.collins at canonical.com
Tue Nov 18 20:42:54 UTC 2008


On Tue, 2008-11-18 at 16:27 +0000, Andy Whitcroft wrote:
> OriginalLocation: http://memebeam.org/free-software/toshiba_acpi/toshiba_acpi-dev_toshiba_test5-linux_2.6.21.patch
> Bug: #269831
> 
> Update the toshiba_acpi module to the latest development snapshot from
> the URL above, plus local modifications required for our acpi tooling.
> This is a direct pull forward of the changes as applied to Hardy.
> 
> Signed-off-by: Andy Whitcroft <apw at canonical.com>

ACK

> ---
>  drivers/acpi/toshiba_acpi.c |  198 ++++++++++++++++++++++++++++++++++++++++++-
>  1 files changed, 197 insertions(+), 1 deletions(-)
> 
> diff --git a/drivers/acpi/toshiba_acpi.c b/drivers/acpi/toshiba_acpi.c
> index 0a43c8e..f320918 100644
> --- a/drivers/acpi/toshiba_acpi.c
> +++ b/drivers/acpi/toshiba_acpi.c
> @@ -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 <linux/backlight.h>
>  
>  #include <asm/uaccess.h>
> @@ -497,6 +514,179 @@ static char *read_version(char *p)
>  	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
>   */
>  
> @@ -555,6 +745,8 @@ static void toshiba_acpi_exit(void)
>  	if (toshiba_proc_dir)
>  		remove_proc_entry(PROC_TOSHIBA, acpi_root_dir);
>  
> +	old_driver_emulation_exit();
> +
>  	return;
>  }
>  
> @@ -562,6 +754,7 @@ static int __init toshiba_acpi_init(void)
>  {
>  	acpi_status status = AE_OK;
>  	u32 hci_result;
> +	int status2;
>  
>  	if (acpi_disabled)
>  		return -ENODEV;
> @@ -578,6 +771,9 @@ static int __init toshiba_acpi_init(void)
>  	       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;
>  
> -- 
> 1.6.0.4.911.gc990
> 
> 





More information about the kernel-team mailing list