2012-05-15 16:45:25

by Alan

[permalink] [raw]
Subject: [PATCH] x86: Fix boot on Twinhead H12Y

From: Alan Cox <[email protected]>

Despite lots of investigation into why this is needed we don't know or have
an elegant cure. The only answer found on this laptop is to mark a problem
region as used so that Linux doesn't put anything there.

Currently all the users add reserve= command lines and anyone not knowing this
needs to find the magic page that documents it. Automate it instead.

Signed-off-by: Alan Cox <[email protected]>
Tested-and-bugfixed-by: Arne Fitzenreiter <[email protected]>
Resolves-bug: https://bugzilla.kernel.org/show_bug.cgi?id=10231
---

arch/x86/pci/fixup.c | 19 +++++++++++++++++++
1 files changed, 19 insertions(+), 0 deletions(-)

diff --git a/arch/x86/pci/fixup.c b/arch/x86/pci/fixup.c
index d0e6e40..40b3eb8 100644
--- a/arch/x86/pci/fixup.c
+++ b/arch/x86/pci/fixup.c
@@ -519,3 +519,22 @@ static void sb600_disable_hpet_bar(struct pci_dev *dev)
}
}
DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_ATI, 0x4385, sb600_disable_hpet_bar);
+
+/*
+ * Twinhead H12Y needs us to block out a region otherwise we map devices
+ * there and any access kills the box.
+ * See: https://bugzilla.kernel.org/show_bug.cgi?id=10231
+ *
+ * Match off the LPC and svid/sdid (older kernels lose the bridge subvendor)
+ */
+
+static void __devinit twinhead_reserve_killing_zone(struct pci_dev *dev)
+{
+ if (dev->subsystem_vendor == 0x14FF && dev->subsystem_device ==
+ 0xA003) {
+ pr_info("Reserving memory on Twinhead H12Y\n");
+ request_mem_region(0xFFB00000, 0x100000, "twinhead");
+ }
+}
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x27B9,
+ twinhead_reserve_killing_zone);


2012-05-15 16:52:11

by Joe Perches

[permalink] [raw]
Subject: Re: [PATCH] x86: Fix boot on Twinhead H12Y

On Tue, 2012-05-15 at 18:44 +0100, Alan Cox wrote:
> Despite lots of investigation into why this is needed we don't know or have
> an elegant cure. The only answer found on this laptop is to mark a problem
> region as used so that Linux doesn't put anything there.

trivia:

> diff --git a/arch/x86/pci/fixup.c b/arch/x86/pci/fixup.c
[]
> @@ -519,3 +519,22 @@ static void sb600_disable_hpet_bar(struct pci_dev *dev)
[]
> +static void __devinit twinhead_reserve_killing_zone(struct pci_dev *dev)
> +{
> + if (dev->subsystem_vendor == 0x14FF && dev->subsystem_device ==
> + 0xA003) {

Doesn't this look ugly to you?
Doesn't

if (dev->subsystem_vendor == 0x14FF &&
dev->subsystem_device == 0xA003) {

at least read more easily?

2012-05-15 17:07:51

by Alan

[permalink] [raw]
Subject: Re: [PATCH] x86: Fix boot on Twinhead H12Y

On Tue, 15 May 2012 09:52:07 -0700
Joe Perches <[email protected]> wrote:

> On Tue, 2012-05-15 at 18:44 +0100, Alan Cox wrote:
> > Despite lots of investigation into why this is needed we don't know or have
> > an elegant cure. The only answer found on this laptop is to mark a problem
> > region as used so that Linux doesn't put anything there.
>
> trivia:
>
> > diff --git a/arch/x86/pci/fixup.c b/arch/x86/pci/fixup.c
> []
> > @@ -519,3 +519,22 @@ static void sb600_disable_hpet_bar(struct pci_dev *dev)
> []
> > +static void __devinit twinhead_reserve_killing_zone(struct pci_dev *dev)
> > +{
> > + if (dev->subsystem_vendor == 0x14FF && dev->subsystem_device ==
> > + 0xA003) {
>
> Doesn't this look ugly to you?
> Doesn't
>
> if (dev->subsystem_vendor == 0x14FF &&
> dev->subsystem_device == 0xA003) {
>
> at least read more easily?

Well I'd further indent the second half so your eyes drop across reading
left to right, but to be honest I'd have put it on one line but for the
80columnists.

If thats the only problem anyone has with it then I'm fine in adding a
tab or two.

2012-05-17 18:22:57

by Alan

[permalink] [raw]
Subject: [tip:x86/urgent] x86: Fix boot on Twinhead H12Y

Commit-ID: 80b3e557371205566a71e569fbfcce5b11f92dbe
Gitweb: http://git.kernel.org/tip/80b3e557371205566a71e569fbfcce5b11f92dbe
Author: Alan Cox <[email protected]>
AuthorDate: Tue, 15 May 2012 18:44:15 +0100
Committer: Ingo Molnar <[email protected]>
CommitDate: Thu, 17 May 2012 20:04:00 +0200

x86: Fix boot on Twinhead H12Y

Despite lots of investigation into why this is needed we don't
know or have an elegant cure. The only answer found on this
laptop is to mark a problem region as used so that Linux doesn't
put anything there.

Currently all the users add reserve= command lines and anyone
not knowing this needs to find the magic page that documents it.
Automate it instead.

Signed-off-by: Alan Cox <[email protected]>
Tested-and-bugfixed-by: Arne Fitzenreiter <[email protected]>
Resolves-bug: https://bugzilla.kernel.org/show_bug.cgi?id=10231
Link: http://lkml.kernel.org/r/20120515174347.5109.94551.stgit@bluebook
Signed-off-by: Ingo Molnar <[email protected]>
---
arch/x86/pci/fixup.c | 17 +++++++++++++++++
1 files changed, 17 insertions(+), 0 deletions(-)

diff --git a/arch/x86/pci/fixup.c b/arch/x86/pci/fixup.c
index d0e6e40..5dd467b 100644
--- a/arch/x86/pci/fixup.c
+++ b/arch/x86/pci/fixup.c
@@ -519,3 +519,20 @@ static void sb600_disable_hpet_bar(struct pci_dev *dev)
}
}
DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_ATI, 0x4385, sb600_disable_hpet_bar);
+
+/*
+ * Twinhead H12Y needs us to block out a region otherwise we map devices
+ * there and any access kills the box.
+ *
+ * See: https://bugzilla.kernel.org/show_bug.cgi?id=10231
+ *
+ * Match off the LPC and svid/sdid (older kernels lose the bridge subvendor)
+ */
+static void __devinit twinhead_reserve_killing_zone(struct pci_dev *dev)
+{
+ if (dev->subsystem_vendor == 0x14FF && dev->subsystem_device == 0xA003) {
+ pr_info("Reserving memory on Twinhead H12Y\n");
+ request_mem_region(0xFFB00000, 0x100000, "twinhead");
+ }
+}
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x27B9, twinhead_reserve_killing_zone);

2012-05-17 18:29:48

by H. Peter Anvin

[permalink] [raw]
Subject: Re: [tip:x86/urgent] x86: Fix boot on Twinhead H12Y

On 05/17/2012 11:22 AM, tip-bot for Alan Cox wrote:
> Commit-ID: 80b3e557371205566a71e569fbfcce5b11f92dbe
> Gitweb: http://git.kernel.org/tip/80b3e557371205566a71e569fbfcce5b11f92dbe
> Author: Alan Cox <[email protected]>
> AuthorDate: Tue, 15 May 2012 18:44:15 +0100
> Committer: Ingo Molnar <[email protected]>
> CommitDate: Thu, 17 May 2012 20:04:00 +0200
>
> x86: Fix boot on Twinhead H12Y
>
> Despite lots of investigation into why this is needed we don't
> know or have an elegant cure. The only answer found on this
> laptop is to mark a problem region as used so that Linux doesn't
> put anything there.
>
> Currently all the users add reserve= command lines and anyone
> not knowing this needs to find the magic page that documents it.
> Automate it instead.
>
> Signed-off-by: Alan Cox <[email protected]>
> Tested-and-bugfixed-by: Arne Fitzenreiter <[email protected]>
> Resolves-bug: https://bugzilla.kernel.org/show_bug.cgi?id=10231
> Link: http://lkml.kernel.org/r/20120515174347.5109.94551.stgit@bluebook
> Signed-off-by: Ingo Molnar <[email protected]>
> ---
> arch/x86/pci/fixup.c | 17 +++++++++++++++++
> 1 files changed, 17 insertions(+), 0 deletions(-)
>
> diff --git a/arch/x86/pci/fixup.c b/arch/x86/pci/fixup.c
> index d0e6e40..5dd467b 100644
> --- a/arch/x86/pci/fixup.c
> +++ b/arch/x86/pci/fixup.c
> @@ -519,3 +519,20 @@ static void sb600_disable_hpet_bar(struct pci_dev *dev)
> }
> }
> DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_ATI, 0x4385, sb600_disable_hpet_bar);
> +
> +/*
> + * Twinhead H12Y needs us to block out a region otherwise we map devices
> + * there and any access kills the box.
> + *
> + * See: https://bugzilla.kernel.org/show_bug.cgi?id=10231
> + *
> + * Match off the LPC and svid/sdid (older kernels lose the bridge subvendor)
> + */
> +static void __devinit twinhead_reserve_killing_zone(struct pci_dev *dev)
> +{
> + if (dev->subsystem_vendor == 0x14FF && dev->subsystem_device == 0xA003) {
> + pr_info("Reserving memory on Twinhead H12Y\n");
> + request_mem_region(0xFFB00000, 0x100000, "twinhead");
> + }
> +}
> +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x27B9, twinhead_reserve_killing_zone);

It seems to me that a DMI match might be more appropriate, since it
pretty much sounds like the BIOS fails to reserve a region it is using?

-hpa

2012-05-17 19:54:23

by Alan

[permalink] [raw]
Subject: Re: [tip:x86/urgent] x86: Fix boot on Twinhead H12Y

> +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x27B9, twinhead_reserve_killing_zone);
>
> It seems to me that a DMI match might be more appropriate, since it
> pretty much sounds like the BIOS fails to reserve a region it is using?

The PCI idents are unique to the system as well ?