All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Georg C. F. Greve" <greve-mXXj517/zsQ@public.gmane.org>
To: Nathan Bryant <nbryant-p32f3XyCuykqcZcGjlUOXw@public.gmane.org>
Cc: acpi-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org,
	shaohua.li-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org
Subject: Re: acpi-20040715: functional regression on ASUS M2N
Date: Wed, 04 Aug 2004 02:23:31 +0200	[thread overview]
Message-ID: <m3smb3wy2k.fsf@reason.gnu-hamburg> (raw)
In-Reply-To: <410E6F9C.2040904-p32f3XyCuykqcZcGjlUOXw@public.gmane.org> (Nathan Bryant's message of "Mon, 02 Aug 2004 12:45:16 -0400")


[-- Attachment #1.1: Type: text/plain, Size: 697 bytes --]

 || On Mon, 02 Aug 2004 12:45:16 -0400
 || Nathan Bryant <nbryant-p32f3XyCuykqcZcGjlUOXw@public.gmane.org> wrote: 

 >> I added your suggested patch to arch/i386/kernel/i8259.c and
 >> recompiled. Problem persists, no difference I could tell.

 nb> I don't know why the patch masks out the reserved
 nb> interrupts. None of the other code that sets ELCR is masking out
 nb> those bits, and it all works fine. Possibly some chipsets use
 nb> different edge/level behavior for these, and the save code is
 nb> forcing them back to edge.  Does the problem persist if you go
 nb> into arch/i386/kernel/i8259.c and change: [...]

Yup. Problem persists.

Just took a working, patched 2.6.7 and applied


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1.2: fix-acpi-after-s3.patch --]
[-- Type: text/x-patch, Size: 2410 bytes --]

===== arch/i386/kernel/i8259.c 1.30 vs edited =====
--- 1.30/arch/i386/kernel/i8259.c	Thu Apr 22 19:15:40 2004
+++ edited/arch/i386/kernel/i8259.c	Tue Jun 29 15:35:28 2004
@@ -238,14 +238,39 @@
 	}
 }
 
+static char irq_trigger[2];
+/**
+ * ELCR registers (0x4d0, 0x4d1) control edge/level of IRQ
+ */
+static void restore_ELCR(char *trigger)
+{
+	outb(trigger[0], 0x4d0);
+	outb(trigger[1], 0x4d1);
+}
+
+static void save_ELCR(char *trigger)
+{
+	/* IRQ 0,1,2,8,13 are marked as reserved */
+	trigger[0] = inb(0x4d0) & 0xF8;
+	trigger[1] = inb(0x4d1) & 0xDE;
+}
+
 static int i8259A_resume(struct sys_device *dev)
 {
 	init_8259A(0);
+	restore_ELCR(irq_trigger);
+	return 0;
+}
+
+static int i8259A_suspend(struct sys_device *dev, u32 state)
+{
+	save_ELCR(irq_trigger);
 	return 0;
 }
 
 static struct sysdev_class i8259_sysdev_class = {
 	set_kset_name("i8259"),
+	.suspend = i8259A_suspend,
 	.resume = i8259A_resume,
 };
 
===== arch/x86_64/kernel/i8259.c 1.12 vs edited =====
--- 1.12/arch/x86_64/kernel/i8259.c	Wed Apr 21 08:55:12 2004
+++ edited/arch/x86_64/kernel/i8259.c	Tue Jun 29 15:36:08 2004
@@ -318,7 +318,7 @@
 	}
 }
 
-void __init init_8259A(int auto_eoi)
+void init_8259A(int auto_eoi)
 {
 	unsigned long flags;
 
@@ -360,6 +360,57 @@
 
 	spin_unlock_irqrestore(&i8259A_lock, flags);
 }
+
+static char irq_trigger[2];
+/**
+ * ELCR registers (0x4d0, 0x4d1) control edge/level of IRQ
+ */
+static void restore_ELCR(char *trigger)
+{
+	outb(trigger[0], 0x4d0);
+	outb(trigger[1], 0x4d1);
+}
+
+static void save_ELCR(char *trigger)
+{
+	/* IRQ 0,1,2,8,13 are marked as reserved */
+	trigger[0] = inb(0x4d0) & 0xF8;
+	trigger[1] = inb(0x4d1) & 0xDE;
+}
+
+static int i8259A_resume(struct sys_device *dev)
+{
+	init_8259A(0);
+	restore_ELCR(irq_trigger);
+	return 0;
+}
+
+static int i8259A_suspend(struct sys_device *dev, u32 state)
+{
+	save_ELCR(irq_trigger);
+	return 0;
+}
+
+static struct sysdev_class i8259_sysdev_class = {
+	set_kset_name("i8259"),
+	.suspend = i8259A_suspend,
+	.resume = i8259A_resume,
+};
+
+static struct sys_device device_i8259A = {
+	.id	= 0,
+	.cls	= &i8259_sysdev_class,
+};
+
+static int __init i8259A_init_sysfs(void)
+{
+	int error = sysdev_class_register(&i8259_sysdev_class);
+	if (!error)
+		error = sysdev_register(&device_i8259A);
+	return error;
+}
+
+device_initcall(i8259A_init_sysfs);
 
 /*
  * IRQ2 is cascade interrupt to second interrupt controller

[-- Attachment #1.3: Type: text/plain, Size: 40 bytes --]


which is causing the problem and also


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1.4: S3-fix.patch --]
[-- Type: text/x-patch, Size: 660 bytes --]

--- arch/i386/kernel/i8259.c.orig	2004-08-04 01:44:05.000000000 +0200
+++ arch/i386/kernel/i8259.c	2004-08-04 01:45:43.000000000 +0200
@@ -251,14 +251,18 @@ static void restore_ELCR(char *trigger)
 static void save_ELCR(char *trigger)
 {
 	/* IRQ 0,1,2,8,13 are marked as reserved */
-	trigger[0] = inb(0x4d0) & 0xF8;
-	trigger[1] = inb(0x4d1) & 0xDE;
+	trigger[0] = inb(0x4d0);
+	trigger[1] = inb(0x4d1);
 }
 
 static int i8259A_resume(struct sys_device *dev)
 {
-	init_8259A(0);
+	unsigned long flags;
+ 	init_8259A(0);
+ 
+	spin_lock_irqsave(&i8259A_lock, flags);
 	restore_ELCR(irq_trigger);
+	spin_unlock_irqrestore(&i8259A_lock, flags);
 	return 0;
 }
 

[-- Attachment #1.5: Type: text/plain, Size: 659 bytes --]


which we hoped to be fixing the problem.

The machine goes into S3 and upon wake up shows same behaviour as
without "hopefully fixing patch": Crashes with "inu" in yellow on the
left in upper row visible. After poweroff, only "needle-pushed reset"
will bring it back to life.

So current ACPI is still showing functional regression on ASUS M2N.

Anyone other ideas? Anyone ready to solve the puzzle?

Regards,
Georg

-- 
Georg C. F. Greve                                       <greve-mXXj517/zsQ@public.gmane.org>
Free Software Foundation Europe	                 (http://fsfeurope.org)
Brave GNU World	                           (http://brave-gnu-world.org)

[-- Attachment #2: Type: application/pgp-signature, Size: 188 bytes --]

  parent reply	other threads:[~2004-08-04  0:23 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-08-02 16:45 acpi-20040715: functional regression on ASUS M2N Nathan Bryant
     [not found] ` <410E6F9C.2040904-p32f3XyCuykqcZcGjlUOXw@public.gmane.org>
2004-08-04  0:23   ` Georg C. F. Greve [this message]
  -- strict thread matches above, loose matches on Subject: below --
2004-08-31  8:45 Li, Shaohua
     [not found] ` <B44D37711ED29844BEA67908EAF36F03AC6ACF-4yWAQGcml65pB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2004-08-31 13:38   ` Georg C. F. Greve
     [not found]     ` <m3zn4bbf6x.fsf-eMhNhoSsuh6q92djB/mqZw@public.gmane.org>
2004-09-01 15:16       ` Georg C. F. Greve
2004-08-09  8:10 Li, Shaohua
2004-08-05 18:49 Nathan Bryant
     [not found] ` <4112814C.2070808-p32f3XyCuykqcZcGjlUOXw@public.gmane.org>
2004-08-06 11:21   ` Georg C. F. Greve
     [not found]     ` <m37jsc3424.fsf-glUV91rXKAHWIjgkaejU9x2eb7JE58TQ@public.gmane.org>
2004-08-06 13:36       ` Nathan Bryant
     [not found]         ` <41138944.3060309-p32f3XyCuykqcZcGjlUOXw@public.gmane.org>
2004-08-06 16:54           ` Georg C. F. Greve
     [not found]             ` <m3u0vgurzy.fsf-glUV91rXKAHWIjgkaejU9x2eb7JE58TQ@public.gmane.org>
2004-08-06 17:07               ` Nathan Bryant
     [not found]                 ` <4113BAD5.1030909-p32f3XyCuykqcZcGjlUOXw@public.gmane.org>
2004-08-06 20:50                   ` Georg C. F. Greve
2004-08-31  8:15                     ` Georg C. F. Greve
2004-08-06 15:23   ` Matthew Garrett
2004-08-06 15:50     ` Nathan Bryant
2004-08-06 16:38     ` Nate Lawson
2004-08-06 19:32     ` Nathan Bryant
2004-07-27 12:24 Li, Shaohua
     [not found] ` <B44D37711ED29844BEA67908EAF36F036BCD7C-4yWAQGcml65pB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2004-07-27 13:42   ` Georg C. F. Greve
2004-07-19 23:31 Georg C. F. Greve
     [not found] ` <m3d62rzi9a.fsf-eMhNhoSsuh6q92djB/mqZw@public.gmane.org>
2004-07-20 19:03   ` Matthew Garrett
     [not found]     ` <1090350197.4828.5.camel-myFlNLNQP+Q@public.gmane.org>
2004-07-21  8:17       ` Georg C. F. Greve
     [not found]         ` <m3acxthizw.fsf-eMhNhoSsuh6q92djB/mqZw@public.gmane.org>
2004-07-27 11:14           ` Georg C. F. Greve
     [not found]             ` <m3oem1u2gg.fsf-glUV91rXKAHWIjgkaejU9x2eb7JE58TQ@public.gmane.org>
2004-07-27 11:24               ` Matthew Garrett
     [not found]                 ` <1090927462.4412.26.camel-myFlNLNQP+Q@public.gmane.org>
2004-07-27 13:40                   ` Georg C. F. Greve

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=m3smb3wy2k.fsf@reason.gnu-hamburg \
    --to=greve-mxxj517/zsq@public.gmane.org \
    --cc=acpi-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org \
    --cc=nbryant-p32f3XyCuykqcZcGjlUOXw@public.gmane.org \
    --cc=shaohua.li-ral2JQCrhuEAvxtiuMwx3w@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.