diff --git a/kernel.spec b/kernel.spec index f4eabe43d..3873b6d34 100644 --- a/kernel.spec +++ b/kernel.spec @@ -688,7 +688,7 @@ Patch12017: prevent-runtime-conntrack-changes.patch Patch12018: neuter_intel_microcode_load.patch -Patch12030: ssb_check_for_sprom.patch +Patch12019: x86-cpu-fix-regression-in-amd-errata-checking-code.patch %endif @@ -1256,8 +1256,7 @@ ApplyPatch disable-i8042-check-on-apple-mac.patch ApplyPatch neuter_intel_microcode_load.patch -# rhbz#533746 -#ApplyPatch ssb_check_for_sprom.patch +ApplyPatch x86-cpu-fix-regression-in-amd-errata-checking-code.patch # END OF PATCH APPLICATIONS @@ -1855,8 +1854,8 @@ fi # and build. # ___________________________________________________________ -# / This branch is for Fedora 14. You probably want to commit \ -# \ to the F-13 branch instead, or in addition to this one. / +# / This branch is for Fedora 15. You probably want to commit \ +# \ to the F-14 branch instead, or in addition to this one. / # ----------------------------------------------------------- # \ ^__^ # \ (@@)\_______ @@ -1865,6 +1864,11 @@ fi # || || %changelog +* Wed Aug 18 2010 Chuck Ebbert - 2.6.36-0.3.rc1.git1 +- Fix hangs on boot with some AMD processors + (x86-cpu-fix-regression-in-amd-errata-checking-code.patch) +- Drop unused ssb_check_for_sprom.patch + * Wed Aug 18 2010 Dave Jones - systemd is dependant upon autofs, so build it in instead of modular. diff --git a/ssb_check_for_sprom.patch b/ssb_check_for_sprom.patch deleted file mode 100644 index 9415e1337..000000000 --- a/ssb_check_for_sprom.patch +++ /dev/null @@ -1,155 +0,0 @@ -From 4d9d1ff88f920e9fcdde155c0a1366b7e0462d14 Mon Sep 17 00:00:00 2001 -From: John W. Linville -Date: Fri, 19 Mar 2010 14:58:01 -0400 -Subject: [PATCH v4] ssb: do not read SPROM if it does not exist - -Attempting to read registers that don't exist on the SSB bus can cause -hangs on some boxes. At least some b43 devices are 'in the wild' that -don't have SPROMs at all. When the SSB bus support loads, it attempts -to read these (non-existant) SPROMs and causes hard hangs on the box -- -no console output, etc. - -This patch adds some intelligence to determine whether or not the SPROM -is present before attempting to read it. This avoids those hard hangs -on those devices with no SPROM attached to their SSB bus. The -SSB-attached devices (e.g. b43, et al.) won't work, but at least the box -will survive to test further patches. :-) - -Signed-off-by: John W. Linville -Cc: Larry Finger -Cc: Michael Buesch -Cc: stable@kernel.org ---- - drivers/ssb/driver_chipcommon.c | 3 +++ - drivers/ssb/pci.c | 3 +++ - drivers/ssb/sprom.c | 26 ++++++++++++++++++++++++++ - include/linux/ssb/ssb.h | 3 +++ - include/linux/ssb/ssb_driver_chipcommon.h | 15 +++++++++++++++ - 5 files changed, 50 insertions(+), 0 deletions(-) - -diff --git a/drivers/ssb/driver_chipcommon.c b/drivers/ssb/driver_chipcommon.c -index 9681536..6cf288d 100644 ---- a/drivers/ssb/driver_chipcommon.c -+++ b/drivers/ssb/driver_chipcommon.c -@@ -233,6 +233,9 @@ void ssb_chipcommon_init(struct ssb_chipcommon *cc) - { - if (!cc->dev) - return; /* We don't have a ChipCommon */ -+ if (cc->dev->id.revision >= 11) { -+ cc->status = chipco_read32(cc, SSB_CHIPCO_CHIPSTAT); -+ } - ssb_pmu_init(cc); - chipco_powercontrol_init(cc); - ssb_chipco_set_clockmode(cc, SSB_CLKMODE_FAST); -diff --git a/drivers/ssb/pci.c b/drivers/ssb/pci.c -index a8dbb06..89d7ab1 100644 ---- a/drivers/ssb/pci.c -+++ b/drivers/ssb/pci.c -@@ -621,6 +621,9 @@ static int ssb_pci_sprom_get(struct ssb_bus *bus, - int err = -ENOMEM; - u16 *buf; - -+ if (!ssb_is_sprom_available(bus)) -+ return -ENODEV; -+ - buf = kcalloc(SSB_SPROMSIZE_WORDS_R123, sizeof(u16), GFP_KERNEL); - if (!buf) - goto out; -diff --git a/drivers/ssb/sprom.c b/drivers/ssb/sprom.c -index f2f920f..c690f58 100644 ---- a/drivers/ssb/sprom.c -+++ b/drivers/ssb/sprom.c -@@ -176,3 +176,29 @@ const struct ssb_sprom *ssb_get_fallback_sprom(void) - { - return fallback_sprom; - } -+ -+bool ssb_is_sprom_available(struct ssb_bus *bus) -+{ -+ /* some older devices don't have chipcommon, but they have sprom */ -+ if (!bus->chipco.dev) -+ return true; -+ -+ /* status register only exists on chipcomon rev >= 11 */ -+ if (bus->chipco.dev->id.revision < 11) -+ return true; -+ -+ switch (bus->chip_id) { -+ case 0x4312: -+ return SSB_CHIPCO_CHST_4312_SPROM_PRESENT(bus->chipco.status); -+ case 0x4322: -+ return SSB_CHIPCO_CHST_4322_SPROM_PRESENT(bus->chipco.status); -+ case 0x4325: -+ return SSB_CHIPCO_CHST_4325_SPROM_PRESENT(bus->chipco.status); -+ default: -+ break; -+ } -+ if (bus->chipco.dev->id.revision >= 31) -+ return bus->chipco.capabilities & SSB_CHIPCO_CAP_SPROM; -+ -+ return true; -+} -diff --git a/include/linux/ssb/ssb.h b/include/linux/ssb/ssb.h -index 24f9885..3b4da23 100644 ---- a/include/linux/ssb/ssb.h -+++ b/include/linux/ssb/ssb.h -@@ -394,6 +394,9 @@ extern int ssb_bus_sdiobus_register(struct ssb_bus *bus, - - extern void ssb_bus_unregister(struct ssb_bus *bus); - -+/* Does the device have an SPROM? */ -+extern bool ssb_is_sprom_available(struct ssb_bus *bus); -+ - /* Set a fallback SPROM. - * See kdoc at the function definition for complete documentation. */ - extern int ssb_arch_set_fallback_sprom(const struct ssb_sprom *sprom); -diff --git a/include/linux/ssb/ssb_driver_chipcommon.h b/include/linux/ssb/ssb_driver_chipcommon.h -index 4e27acf..2cdf249 100644 ---- a/include/linux/ssb/ssb_driver_chipcommon.h -+++ b/include/linux/ssb/ssb_driver_chipcommon.h -@@ -53,6 +53,7 @@ - #define SSB_CHIPCO_CAP_64BIT 0x08000000 /* 64-bit Backplane */ - #define SSB_CHIPCO_CAP_PMU 0x10000000 /* PMU available (rev >= 20) */ - #define SSB_CHIPCO_CAP_ECI 0x20000000 /* ECI available (rev >= 20) */ -+#define SSB_CHIPCO_CAP_SPROM 0x40000000 /* SPROM present */ - #define SSB_CHIPCO_CORECTL 0x0008 - #define SSB_CHIPCO_CORECTL_UARTCLK0 0x00000001 /* Drive UART with internal clock */ - #define SSB_CHIPCO_CORECTL_SE 0x00000002 /* sync clk out enable (corerev >= 3) */ -@@ -385,6 +386,7 @@ - - - /** Chip specific Chip-Status register contents. */ -+#define SSB_CHIPCO_CHST_4322_SPROM_EXISTS 0x00000040 /* SPROM present */ - #define SSB_CHIPCO_CHST_4325_SPROM_OTP_SEL 0x00000003 - #define SSB_CHIPCO_CHST_4325_DEFCIS_SEL 0 /* OTP is powered up, use def. CIS, no SPROM */ - #define SSB_CHIPCO_CHST_4325_SPROM_SEL 1 /* OTP is powered up, SPROM is present */ -@@ -398,6 +400,18 @@ - #define SSB_CHIPCO_CHST_4325_RCAL_VALUE_SHIFT 4 - #define SSB_CHIPCO_CHST_4325_PMUTOP_2B 0x00000200 /* 1 for 2b, 0 for to 2a */ - -+/** Macros to determine SPROM presence based on Chip-Status register. */ -+#define SSB_CHIPCO_CHST_4312_SPROM_PRESENT(status) \ -+ ((status & SSB_CHIPCO_CHST_4325_SPROM_OTP_SEL) != \ -+ SSB_CHIPCO_CHST_4325_OTP_SEL) -+#define SSB_CHIPCO_CHST_4322_SPROM_PRESENT(status) \ -+ (status & SSB_CHIPCO_CHST_4322_SPROM_EXISTS) -+#define SSB_CHIPCO_CHST_4325_SPROM_PRESENT(status) \ -+ (((status & SSB_CHIPCO_CHST_4325_SPROM_OTP_SEL) != \ -+ SSB_CHIPCO_CHST_4325_DEFCIS_SEL) && \ -+ ((status & SSB_CHIPCO_CHST_4325_SPROM_OTP_SEL) != \ -+ SSB_CHIPCO_CHST_4325_OTP_SEL)) -+ - - - /** Clockcontrol masks and values **/ -@@ -564,6 +578,7 @@ struct ssb_chipcommon_pmu { - struct ssb_chipcommon { - struct ssb_device *dev; - u32 capabilities; -+ u32 status; - /* Fast Powerup Delay constant */ - u16 fast_pwrup_delay; - struct ssb_chipcommon_pmu pmu; --- -1.7.0.1 - diff --git a/x86-cpu-fix-regression-in-amd-errata-checking-code.patch b/x86-cpu-fix-regression-in-amd-errata-checking-code.patch new file mode 100644 index 000000000..dc1f391f3 --- /dev/null +++ b/x86-cpu-fix-regression-in-amd-errata-checking-code.patch @@ -0,0 +1,29 @@ +From: Hans Rosenfeld +Date: Wed, 18 Aug 2010 14:19:50 +0000 (+0200) +Subject: x86, cpu: Fix regression in AMD errata checking code +X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Fmingo%2Flinux-2.6-x86.git;a=commitdiff_plain;h=07a7795ca2e6e66d00b184efb46bd0e23d90d3fe + +x86, cpu: Fix regression in AMD errata checking code + +A bug in the family-model-stepping matching code caused the presence of +errata to go undetected when OSVW was not used. This causes hangs on +some K8 systems because the E400 workaround is not enabled. + +Signed-off-by: Hans Rosenfeld +LKML-Reference: <1282141190-930137-1-git-send-email-hans.rosenfeld@amd.com> +Signed-off-by: H. Peter Anvin +--- + +diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c +index 60a57b1..ba5f62f 100644 +--- a/arch/x86/kernel/cpu/amd.c ++++ b/arch/x86/kernel/cpu/amd.c +@@ -669,7 +669,7 @@ bool cpu_has_amd_erratum(const int *erratum) + } + + /* OSVW unavailable or ID unknown, match family-model-stepping range */ +- ms = (cpu->x86_model << 8) | cpu->x86_mask; ++ ms = (cpu->x86_model << 4) | cpu->x86_mask; + while ((range = *erratum++)) + if ((cpu->x86 == AMD_MODEL_RANGE_FAMILY(range)) && + (ms >= AMD_MODEL_RANGE_START(range)) &&