public inbox for linux-acpi@vger.kernel.org
 help / color / mirror / Atom feed
From: Ducrot Bruno <ducrot-kk6yZipjEM5g9hUCZPvPmw@public.gmane.org>
To: Dominik Bartenstein <dom-K271P2BsTd0@public.gmane.org>
Cc: Ducrot Bruno <ducrot-kk6yZipjEM5g9hUCZPvPmw@public.gmane.org>,
	acpi-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
Subject: Re: IBM Thinkpad A31 | News
Date: Sat, 18 Jan 2003 17:45:25 +0100	[thread overview]
Message-ID: <20030118164525.GD12516@poup.poupinou.org> (raw)
In-Reply-To: <200301172204.52963.dom-K271P2BsTd0@public.gmane.org>

[-- Attachment #1: Type: text/plain, Size: 1326 bytes --]

Hi Dom,

me wrote:

> >
> > I will try to make a workaround for tomorrow, if you want to test
> >
> > Cheers,
> 

Here is then.

This patch is against acpi-20030109.  It override the
ECDT table with a generate one that (hopefully) will work
better.  There is one field only of the table that is buggy (the others
are OK, at least as they are consitant with the definition of
the embedded controller in the DSDT portion).

It replace the original ECDT table when the 3 first letter of the OEM_ID part
is 'IBM    ' and when the EC_ID begin as '\S...' only.  Other fields are not
checked.

You need though to define CONFIG_ACPI_IBM_ECDT_WORKAROUND for it to work.
For that, you want to modifie drivers/acpi/osl.c and check for
/* CONFIG_ACPI_IBM_ECDT_WORKAROUND */

Making it as a part of drivers/acpi/Config.in (2.4) or drivers/acpi/Kconfig (2.5)
is left as an exercise.. :) (there is no file dep, so no Makefile to modifie).

Please note also that I have only tested it generate a table is OK (by
feeding the functions with a hand made program that I can send you if
you want), and also that the kernel compile.
Eer, I don't have any thinkpad to test with, you know..

A final note: I don't recommand this patch for mainstream.

Cheers,

-- 
Ducrot Bruno

--  Which is worse:  ignorance or apathy?
--  Don't know.  Don't care.

[-- Attachment #2: 00_thinkpad_workaround.diff --]
[-- Type: text/plain, Size: 2673 bytes --]

--- linux-2.4.20/drivers/acpi/osl.c	2003/01/14 16:22:32	1.1
+++ linux-2.4.20/drivers/acpi/osl.c	2003/01/18 15:46:57
@@ -25,6 +25,9 @@
  *
  */
 
+/* Define this if you are a Thinkpad owner. */
+/* #define CONFIG_ACPI_IBM_ECDT_WORKAROUND */
+
 #include <linux/config.h>
 #include <linux/kernel.h>
 #include <linux/slab.h>
@@ -201,6 +204,92 @@
 	return AE_OK;
 }
 
+#ifdef CONFIG_ACPI_IBM_ECDT_WORKAROUND
+static          u8
+compute_checksum(struct acpi_table_header * h)
+{
+	int             i;
+	u8             *p;
+	u8              cs;
+
+	p = (u8 *) h;
+	cs = 0;
+	for (i = 0; i < h->length; i++)
+		cs += *p++;
+	return cs;
+}
+
+static          acpi_status
+try_to_replace_ibm_ecdt(struct acpi_table_ecdt * old,
+			struct acpi_table_ecdt ** new)
+{
+	u32             len;
+	u8             *p;
+	struct acpi_table_ecdt *ecdt;
+
+	*new = NULL;
+
+	len = old->header.length;
+	ecdt = kmalloc(len + 1, GFP_KERNEL);
+	if (!ecdt)
+		return AE_NO_MEMORY;
+
+	memcpy(ecdt, old, len);
+
+	ecdt->header.length = len + 1;
+
+	for (p = (u8 *) ecdt + ecdt->header.length - 1;
+	     p != (u8 *) & ecdt->ec_id;
+	     --p) {
+		*p = *(p - 1);
+	}
+	ecdt->ec_id[1] = '_';
+
+	ecdt->header.checksum = 0;
+	ecdt->header.checksum = -compute_checksum((struct acpi_table_header *) ecdt);
+
+	*new = ecdt;
+
+	printk(KERN_WARNING "acpi: IBM's ECDT TABLE sucessfully replaced by a corrected one.\n");
+
+	return AE_OK;
+}
+
+
+static          acpi_status
+verify_ibm_ecdt(struct acpi_table_ecdt * existing_table,
+		struct acpi_table_ecdt ** new_table)
+{
+	const char     *const ec_id =
+	((struct acpi_table_ecdt *) existing_table)->ec_id;
+
+	if (ec_id[0] == '\\' && ec_id[1] == 'S') {
+		printk(KERN_WARNING "acpi: Found bad ACPI ECDT table from IBM in the firmware\n");
+		return (try_to_replace_ibm_ecdt(existing_table, new_table));
+	}
+	return AE_OK;
+}
+
+
+
+acpi_status
+acpi_os_table_override(struct acpi_table_header * existing_table,
+		       struct acpi_table_header ** new_table)
+{
+	if (!existing_table || !new_table)
+		return AE_BAD_PARAMETER;
+
+	if (!memcmp(existing_table->signature, "ECDT", 4)) {
+		struct acpi_table_ecdt *old = (struct acpi_table_ecdt *) existing_table;
+		struct acpi_table_ecdt **new = (struct acpi_table_ecdt **) new_table;
+
+		if (!memcmp(old->header.oem_id, "IBM", 3))
+			return (verify_ibm_ecdt(old, new));
+	}
+	return AE_OK;
+}
+
+#else	/* CONFIG_ACPI_IBM_ECDT_WORKAROUND */
 acpi_status
 acpi_os_table_override (struct acpi_table_header *existing_table,
 			struct acpi_table_header **new_table)
@@ -211,6 +300,7 @@
 	*new_table = NULL;
 	return AE_OK;
 }
+#endif
 
 static void
 acpi_irq(int irq, void *dev_id, struct pt_regs *regs)

  parent reply	other threads:[~2003-01-18 16:45 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-01-17 18:47 IBM Thinkpad A31 | News Dominik Bartenstein
     [not found] ` <200301172111.15037.dom@wahuu.at>
     [not found]   ` <20030117210321.GC12516@poup.poupinou.org>
     [not found]     ` <200301172204.52963.dom@wahuu.at>
     [not found]       ` <200301172204.52963.dom-K271P2BsTd0@public.gmane.org>
2003-01-18 16:45         ` Ducrot Bruno [this message]
     [not found]           ` <20030118164525.GD12516-j6u/t2rXLliUoIHC/UFpr9i2O/JbrIOy@public.gmane.org>
2003-01-18 17:08             ` WARN: please read if you applyied 00_thinkpad_workaround.diff (Re: IBM Thinkpad A31 | News) Ducrot Bruno
     [not found]               ` <20030118170844.GE12516-j6u/t2rXLliUoIHC/UFpr9i2O/JbrIOy@public.gmane.org>
2003-01-20 13:42                 ` x545
     [not found]                   ` <200301201442.27358.x545-hi6Y0CQ0nG0@public.gmane.org>
2003-01-20 14:09                     ` thinkpad workaround v2 Ducrot Bruno
     [not found]                       ` <20030120140926.GA11487-j6u/t2rXLliUoIHC/UFpr9i2O/JbrIOy@public.gmane.org>
2003-01-20 14:30                         ` Dominik Bartenstein
     [not found]                           ` <20030120144413.GD11487@poup.poupinou.org>
     [not found]                             ` <200301201554.13984.dom@wahuu.at>
     [not found]                               ` <200301201554.13984.dom-K271P2BsTd0@public.gmane.org>
2003-01-20 15:40                                 ` Ducrot Bruno
     [not found]                                   ` <20030120154043.GI11487-j6u/t2rXLliUoIHC/UFpr9i2O/JbrIOy@public.gmane.org>
2003-01-20 17:15                                     ` apologizes (was Re: Re: thinkpad workaround v2.) Ducrot Bruno
2003-01-20 15:17                         ` thinkpad workaround v2 x545
     [not found] ` <200301171947.54174.dom-K271P2BsTd0@public.gmane.org>
2003-01-21  7:25   ` IBM Thinkpad A31 | News Christian Zoz
  -- strict thread matches above, loose matches on Subject: below --
2003-01-21 22:24 Grover, Andrew

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20030118164525.GD12516@poup.poupinou.org \
    --to=ducrot-kk6yzipjem5g9huczpvpmw@public.gmane.org \
    --cc=acpi-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org \
    --cc=dom-K271P2BsTd0@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox