From: Greg KH <gregkh@suse.de>
To: linux-kernel@vger.kernel.org, stable@kernel.org
Cc: stable-review@kernel.org, torvalds@linux-foundation.org,
akpm@linux-foundation.org, alan@lxorguk.ukuu.org.uk,
Hans Rosenfeld <hans.rosenfeld@amd.com>,
"H. Peter Anvin" <hpa@linux.intel.com>
Subject: [11/28] x86, cpu: AMD errata checking framework
Date: Tue, 19 Apr 2011 13:30:49 -0700 [thread overview]
Message-ID: <20110419204117.882676010@clark.kroah.org> (raw)
In-Reply-To: <20110419204122.GA13268@kroah.com>
2.6.32-longterm review patch. If anyone has any objections, please let us know.
------------------
From: Hans Rosenfeld <hans.rosenfeld@amd.com>
commit d78d671db478eb8b14c78501c0cee1cc7baf6967 upstream.
Errata are defined using the AMD_LEGACY_ERRATUM() or AMD_OSVW_ERRATUM()
macros. The latter is intended for newer errata that have an OSVW id
assigned, which it takes as first argument. Both take a variable number
of family-specific model-stepping ranges created by AMD_MODEL_RANGE().
Iff an erratum has an OSVW id, OSVW is available on the CPU, and the
OSVW id is known to the hardware, it is used to determine whether an
erratum is present. Otherwise, the model-stepping ranges are matched
against the current CPU to find out whether the erratum applies.
For certain special errata, the code using this framework might have to
conduct further checks to make sure an erratum is really (not) present.
Signed-off-by: Hans Rosenfeld <hans.rosenfeld@amd.com>
LKML-Reference: <1280336972-865982-1-git-send-email-hans.rosenfeld@amd.com>
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
arch/x86/include/asm/processor.h | 18 +++++++++++
arch/x86/kernel/cpu/amd.c | 60 +++++++++++++++++++++++++++++++++++++++
2 files changed, 78 insertions(+)
--- a/arch/x86/include/asm/processor.h
+++ b/arch/x86/include/asm/processor.h
@@ -1029,4 +1029,22 @@ unsigned long calc_aperfmperf_ratio(stru
return ratio;
}
+/*
+ * AMD errata checking
+ */
+#ifdef CONFIG_CPU_SUP_AMD
+extern bool cpu_has_amd_erratum(const int *);
+
+#define AMD_LEGACY_ERRATUM(...) { -1, __VA_ARGS__, 0 }
+#define AMD_OSVW_ERRATUM(osvw_id, ...) { osvw_id, __VA_ARGS__, 0 }
+#define AMD_MODEL_RANGE(f, m_start, s_start, m_end, s_end) \
+ ((f << 24) | (m_start << 16) | (s_start << 12) | (m_end << 4) | (s_end))
+#define AMD_MODEL_RANGE_FAMILY(range) (((range) >> 24) & 0xff)
+#define AMD_MODEL_RANGE_START(range) (((range) >> 12) & 0xfff)
+#define AMD_MODEL_RANGE_END(range) ((range) & 0xfff)
+
+#else
+#define cpu_has_amd_erratum(x) (false)
+#endif /* CONFIG_CPU_SUP_AMD */
+
#endif /* _ASM_X86_PROCESSOR_H */
--- a/arch/x86/kernel/cpu/amd.c
+++ b/arch/x86/kernel/cpu/amd.c
@@ -610,3 +610,63 @@ static const struct cpu_dev __cpuinitcon
};
cpu_dev_register(amd_cpu_dev);
+
+/*
+ * AMD errata checking
+ *
+ * Errata are defined as arrays of ints using the AMD_LEGACY_ERRATUM() or
+ * AMD_OSVW_ERRATUM() macros. The latter is intended for newer errata that
+ * have an OSVW id assigned, which it takes as first argument. Both take a
+ * variable number of family-specific model-stepping ranges created by
+ * AMD_MODEL_RANGE(). Each erratum also has to be declared as extern const
+ * int[] in arch/x86/include/asm/processor.h.
+ *
+ * Example:
+ *
+ * const int amd_erratum_319[] =
+ * AMD_LEGACY_ERRATUM(AMD_MODEL_RANGE(0x10, 0x2, 0x1, 0x4, 0x2),
+ * AMD_MODEL_RANGE(0x10, 0x8, 0x0, 0x8, 0x0),
+ * AMD_MODEL_RANGE(0x10, 0x9, 0x0, 0x9, 0x0));
+ */
+
+bool cpu_has_amd_erratum(const int *erratum)
+{
+ struct cpuinfo_x86 *cpu = ¤t_cpu_data;
+ int osvw_id = *erratum++;
+ u32 range;
+ u32 ms;
+
+ /*
+ * If called early enough that current_cpu_data hasn't been initialized
+ * yet, fall back to boot_cpu_data.
+ */
+ if (cpu->x86 == 0)
+ cpu = &boot_cpu_data;
+
+ if (cpu->x86_vendor != X86_VENDOR_AMD)
+ return false;
+
+ if (osvw_id >= 0 && osvw_id < 65536 &&
+ cpu_has(cpu, X86_FEATURE_OSVW)) {
+ u64 osvw_len;
+
+ rdmsrl(MSR_AMD64_OSVW_ID_LENGTH, osvw_len);
+ if (osvw_id < osvw_len) {
+ u64 osvw_bits;
+
+ rdmsrl(MSR_AMD64_OSVW_STATUS + (osvw_id >> 6),
+ osvw_bits);
+ return osvw_bits & (1ULL << (osvw_id & 0x3f));
+ }
+ }
+
+ /* OSVW unavailable or ID unknown, match family-model-stepping range */
+ ms = (cpu->x86_model << 8) | cpu->x86_mask;
+ while ((range = *erratum++))
+ if ((cpu->x86 == AMD_MODEL_RANGE_FAMILY(range)) &&
+ (ms >= AMD_MODEL_RANGE_START(range)) &&
+ (ms <= AMD_MODEL_RANGE_END(range)))
+ return true;
+
+ return false;
+}
next prev parent reply other threads:[~2011-04-19 20:48 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-04-19 20:41 [00/28] 2.6.32.39-longterm review Greg KH
2011-04-19 20:30 ` [01/28] cifs: always do is_path_accessible check in cifs_mount Greg KH
2011-04-19 20:30 ` [02/28] [media] video: sn9c102: world-wirtable sysfs files Greg KH
2011-04-19 20:30 ` [03/28] UBIFS: restrict world-writable debugfs files Greg KH
2011-04-19 20:30 ` [04/28] NET: cdc-phonet, handle empty phonet header Greg KH
2011-04-19 20:30 ` [05/28] x86: Fix a bogus unwind annotation in lib/semaphore_32.S Greg KH
2011-04-19 20:30 ` [06/28] [IA64] tioca: Fix assignment from incompatible pointer warnings Greg KH
2011-04-19 20:30 ` [07/28] [IA64] mca.c: Fix cast from integer to pointer warning Greg KH
2011-04-19 20:30 ` [08/28] ramfs: fix memleak on no-mmu arch Greg KH
2011-04-19 20:30 ` [09/28] MAINTAINERS: update STABLE BRANCH info Greg KH
2011-04-19 20:30 ` [10/28] UBIFS: fix oops when R/O file-system is fsynced Greg KH
2011-04-19 20:30 ` Greg KH [this message]
2011-04-19 20:30 ` [12/28] x86, cpu: Clean up AMD erratum 400 workaround Greg KH
2011-04-20 1:40 ` [Stable-review] " Ben Hutchings
2011-04-20 2:01 ` Greg KH
2011-04-20 2:17 ` Ben Hutchings
2011-04-20 3:11 ` Greg KH
2011-04-20 4:48 ` Ben Hutchings
2011-04-20 5:06 ` Greg KH
2011-04-20 5:47 ` Willy Tarreau
2011-04-21 3:29 ` Ben Hutchings
2011-05-05 22:53 ` Greg KH
2011-05-06 7:41 ` Borislav Petkov
2011-05-10 12:58 ` Ben Hutchings
2011-05-10 14:02 ` Borislav Petkov
2011-05-10 15:13 ` Greg KH
2011-05-10 15:38 ` Borislav Petkov
2011-05-10 3:05 ` Ben Hutchings
2011-04-19 20:30 ` [13/28] x86, AMD: Set ARAT feature on AMD processors Greg KH
2011-04-19 20:30 ` [14/28] x86, amd: Disable GartTlbWlkErr when BIOS forgets it Greg KH
2011-04-19 20:30 ` [15/28] USB: ftdi_sio: Added IDs for CTI USB Serial Devices Greg KH
2011-04-19 20:30 ` [16/28] USB: ftdi_sio: add PID for OCT DK201 docking station Greg KH
2011-04-19 20:30 ` [17/28] USB: ftdi_sio: add ids for Hameg HO720 and HO730 Greg KH
2011-04-19 20:30 ` [18/28] USB: option: Add new ONDA vendor id and product id for ONDA MT825UP Greg KH
2011-04-19 20:30 ` [19/28] USB: option: Added support for Samsung GT-B3730/GT-B3710 LTE USB modem Greg KH
2011-04-19 20:30 ` [20/28] next_pidmap: fix overflow condition Greg KH
2011-04-19 20:30 ` [21/28] proc: do proper range check on readdir offset Greg KH
2011-04-19 20:31 ` [22/28] USB: EHCI: unlink unused QHs when the controller is stopped Greg KH
2011-04-19 20:31 ` [23/28] USB: fix formatting of SuperSpeed endpoints in /proc/bus/usb/devices Greg KH
2011-04-19 20:31 ` [24/28] USB: xhci - fix unsafe macro definitions Greg KH
2011-04-20 2:02 ` [Stable-review] " Ben Hutchings
2011-04-20 5:39 ` Willy Tarreau
2011-04-20 12:34 ` Ben Hutchings
2011-04-20 17:32 ` Sarah Sharp
2011-04-20 18:16 ` Dmitry Torokhov
2011-04-19 20:31 ` [25/28] USB: xhci - fix math in xhci_get_endpoint_interval() Greg KH
2011-04-19 20:31 ` [26/28] x86, cpu: Fix regression in AMD errata checking code Greg KH
2011-04-19 20:31 ` [27/28] net: ax25: fix information leak to userland harder Greg KH
2011-04-19 20:31 ` [28/28] net: fix rds_iovec page count overflow Greg KH
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=20110419204117.882676010@clark.kroah.org \
--to=gregkh@suse.de \
--cc=akpm@linux-foundation.org \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=hans.rosenfeld@amd.com \
--cc=hpa@linux.intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=stable-review@kernel.org \
--cc=stable@kernel.org \
--cc=torvalds@linux-foundation.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
all inboxes | Powered by JetHome®