|
Borislav Petkov |
455d3c |
From: Yazen Ghannam <yazen.ghannam@amd.com>
|
|
Borislav Petkov |
455d3c |
Date: Tue, 22 Oct 2019 20:35:11 +0000
|
|
Borislav Petkov |
455d3c |
Subject: EDAC/amd64: Save max number of controllers to family type
|
|
Borislav Petkov |
455d3c |
Git-commit: 5e4c55276ae8758f5789722b384bb2ab3de3a24f
|
|
Borislav Petkov |
455d3c |
Patch-mainline: v5.5-rc1
|
|
Borislav Petkov |
455d3c |
References: bsc#1180552
|
|
Borislav Petkov |
455d3c |
|
|
Borislav Petkov |
455d3c |
The maximum number of memory controllers is fixed within a family/model
|
|
Borislav Petkov |
455d3c |
group. In most cases, this has been fixed at 2, but some systems may
|
|
Borislav Petkov |
455d3c |
have up to 8.
|
|
Borislav Petkov |
455d3c |
|
|
Borislav Petkov |
455d3c |
The struct amd64_family_type already contains family/model-specific
|
|
Borislav Petkov |
455d3c |
information, and this can be used rather than adding model checks to
|
|
Borislav Petkov |
455d3c |
various functions.
|
|
Borislav Petkov |
455d3c |
|
|
Borislav Petkov |
455d3c |
Create a new field in struct amd64_family_type for max_mcs.
|
|
Borislav Petkov |
455d3c |
Set this when setting other family type information, and use this when
|
|
Borislav Petkov |
455d3c |
needing the maximum number of memory controllers possible for a system.
|
|
Borislav Petkov |
455d3c |
|
|
Borislav Petkov |
455d3c |
Signed-off-by: Yazen Ghannam <yazen.ghannam@amd.com>
|
|
Borislav Petkov |
455d3c |
Signed-off-by: Borislav Petkov <bp@suse.de>
|
|
Borislav Petkov |
455d3c |
Cc: "linux-edac@vger.kernel.org" <linux-edac@vger.kernel.org>
|
|
Borislav Petkov |
455d3c |
Cc: James Morse <james.morse@arm.com>
|
|
Borislav Petkov |
455d3c |
Cc: Mauro Carvalho Chehab <mchehab@kernel.org>
|
|
Borislav Petkov |
455d3c |
Cc: Robert Richter <rrichter@marvell.com>
|
|
Borislav Petkov |
455d3c |
Cc: Tony Luck <tony.luck@intel.com>
|
|
Borislav Petkov |
455d3c |
Link: https://lkml.kernel.org/r/20191106012448.243970-4-Yazen.Ghannam@amd.com
|
|
Borislav Petkov |
455d3c |
---
|
|
Borislav Petkov |
455d3c |
drivers/edac/amd64_edac.c | 43 +++++++++++++------------------------------
|
|
Borislav Petkov |
455d3c |
drivers/edac/amd64_edac.h | 2 ++
|
|
Borislav Petkov |
455d3c |
2 files changed, 15 insertions(+), 30 deletions(-)
|
|
Borislav Petkov |
455d3c |
|
|
Borislav Petkov |
455d3c |
--- a/drivers/edac/amd64_edac.c
|
|
Borislav Petkov |
455d3c |
+++ b/drivers/edac/amd64_edac.c
|
|
Borislav Petkov |
455d3c |
@@ -20,9 +20,6 @@ static struct amd64_family_type *fam_typ
|
|
Borislav Petkov |
455d3c |
/* Per-node stuff */
|
|
Borislav Petkov |
455d3c |
static struct ecc_settings **ecc_stngs;
|
|
Borislav Petkov |
455d3c |
|
|
Borislav Petkov |
455d3c |
-/* Number of Unified Memory Controllers */
|
|
Borislav Petkov |
455d3c |
-static u8 num_umcs;
|
|
Borislav Petkov |
455d3c |
-
|
|
Borislav Petkov |
455d3c |
/*
|
|
Borislav Petkov |
455d3c |
* Valid scrub rates for the K8 hardware memory scrubber. We map the scrubbing
|
|
Borislav Petkov |
455d3c |
* bandwidth to a valid bit pattern. The 'set' operation finds the 'matching-
|
|
Borislav Petkov |
455d3c |
@@ -455,7 +452,7 @@ static void get_cs_base_and_mask(struct
|
|
Borislav Petkov |
455d3c |
for (i = 0; i < pvt->csels[dct].m_cnt; i++)
|
|
Borislav Petkov |
455d3c |
|
|
Borislav Petkov |
455d3c |
#define for_each_umc(i) \
|
|
Borislav Petkov |
455d3c |
- for (i = 0; i < num_umcs; i++)
|
|
Borislav Petkov |
455d3c |
+ for (i = 0; i < fam_type->max_mcs; i++)
|
|
Borislav Petkov |
455d3c |
|
|
Borislav Petkov |
455d3c |
/*
|
|
Borislav Petkov |
455d3c |
* @input_addr is an InputAddr associated with the node given by mci. Return the
|
|
Borislav Petkov |
455d3c |
@@ -2225,6 +2222,7 @@ static struct amd64_family_type family_t
|
|
Borislav Petkov |
455d3c |
.ctl_name = "K8",
|
|
Borislav Petkov |
455d3c |
.f1_id = PCI_DEVICE_ID_AMD_K8_NB_ADDRMAP,
|
|
Borislav Petkov |
455d3c |
.f2_id = PCI_DEVICE_ID_AMD_K8_NB_MEMCTL,
|
|
Borislav Petkov |
455d3c |
+ .max_mcs = 2,
|
|
Borislav Petkov |
455d3c |
.ops = {
|
|
Borislav Petkov |
455d3c |
.early_channel_count = k8_early_channel_count,
|
|
Borislav Petkov |
455d3c |
.map_sysaddr_to_csrow = k8_map_sysaddr_to_csrow,
|
|
Borislav Petkov |
455d3c |
@@ -2235,6 +2233,7 @@ static struct amd64_family_type family_t
|
|
Borislav Petkov |
455d3c |
.ctl_name = "F10h",
|
|
Borislav Petkov |
455d3c |
.f1_id = PCI_DEVICE_ID_AMD_10H_NB_MAP,
|
|
Borislav Petkov |
455d3c |
.f2_id = PCI_DEVICE_ID_AMD_10H_NB_DRAM,
|
|
Borislav Petkov |
455d3c |
+ .max_mcs = 2,
|
|
Borislav Petkov |
455d3c |
.ops = {
|
|
Borislav Petkov |
455d3c |
.early_channel_count = f1x_early_channel_count,
|
|
Borislav Petkov |
455d3c |
.map_sysaddr_to_csrow = f1x_map_sysaddr_to_csrow,
|
|
Borislav Petkov |
455d3c |
@@ -2245,6 +2244,7 @@ static struct amd64_family_type family_t
|
|
Borislav Petkov |
455d3c |
.ctl_name = "F15h",
|
|
Borislav Petkov |
455d3c |
.f1_id = PCI_DEVICE_ID_AMD_15H_NB_F1,
|
|
Borislav Petkov |
455d3c |
.f2_id = PCI_DEVICE_ID_AMD_15H_NB_F2,
|
|
Borislav Petkov |
455d3c |
+ .max_mcs = 2,
|
|
Borislav Petkov |
455d3c |
.ops = {
|
|
Borislav Petkov |
455d3c |
.early_channel_count = f1x_early_channel_count,
|
|
Borislav Petkov |
455d3c |
.map_sysaddr_to_csrow = f1x_map_sysaddr_to_csrow,
|
|
Borislav Petkov |
455d3c |
@@ -2255,6 +2255,7 @@ static struct amd64_family_type family_t
|
|
Borislav Petkov |
455d3c |
.ctl_name = "F15h_M30h",
|
|
Borislav Petkov |
455d3c |
.f1_id = PCI_DEVICE_ID_AMD_15H_M30H_NB_F1,
|
|
Borislav Petkov |
455d3c |
.f2_id = PCI_DEVICE_ID_AMD_15H_M30H_NB_F2,
|
|
Borislav Petkov |
455d3c |
+ .max_mcs = 2,
|
|
Borislav Petkov |
455d3c |
.ops = {
|
|
Borislav Petkov |
455d3c |
.early_channel_count = f1x_early_channel_count,
|
|
Borislav Petkov |
455d3c |
.map_sysaddr_to_csrow = f1x_map_sysaddr_to_csrow,
|
|
Borislav Petkov |
455d3c |
@@ -2265,6 +2266,7 @@ static struct amd64_family_type family_t
|
|
Borislav Petkov |
455d3c |
.ctl_name = "F15h_M60h",
|
|
Borislav Petkov |
455d3c |
.f1_id = PCI_DEVICE_ID_AMD_15H_M60H_NB_F1,
|
|
Borislav Petkov |
455d3c |
.f2_id = PCI_DEVICE_ID_AMD_15H_M60H_NB_F2,
|
|
Borislav Petkov |
455d3c |
+ .max_mcs = 2,
|
|
Borislav Petkov |
455d3c |
.ops = {
|
|
Borislav Petkov |
455d3c |
.early_channel_count = f1x_early_channel_count,
|
|
Borislav Petkov |
455d3c |
.map_sysaddr_to_csrow = f1x_map_sysaddr_to_csrow,
|
|
Borislav Petkov |
455d3c |
@@ -2275,6 +2277,7 @@ static struct amd64_family_type family_t
|
|
Borislav Petkov |
455d3c |
.ctl_name = "F16h",
|
|
Borislav Petkov |
455d3c |
.f1_id = PCI_DEVICE_ID_AMD_16H_NB_F1,
|
|
Borislav Petkov |
455d3c |
.f2_id = PCI_DEVICE_ID_AMD_16H_NB_F2,
|
|
Borislav Petkov |
455d3c |
+ .max_mcs = 2,
|
|
Borislav Petkov |
455d3c |
.ops = {
|
|
Borislav Petkov |
455d3c |
.early_channel_count = f1x_early_channel_count,
|
|
Borislav Petkov |
455d3c |
.map_sysaddr_to_csrow = f1x_map_sysaddr_to_csrow,
|
|
Borislav Petkov |
455d3c |
@@ -2285,6 +2288,7 @@ static struct amd64_family_type family_t
|
|
Borislav Petkov |
455d3c |
.ctl_name = "F16h_M30h",
|
|
Borislav Petkov |
455d3c |
.f1_id = PCI_DEVICE_ID_AMD_16H_M30H_NB_F1,
|
|
Borislav Petkov |
455d3c |
.f2_id = PCI_DEVICE_ID_AMD_16H_M30H_NB_F2,
|
|
Borislav Petkov |
455d3c |
+ .max_mcs = 2,
|
|
Borislav Petkov |
455d3c |
.ops = {
|
|
Borislav Petkov |
455d3c |
.early_channel_count = f1x_early_channel_count,
|
|
Borislav Petkov |
455d3c |
.map_sysaddr_to_csrow = f1x_map_sysaddr_to_csrow,
|
|
Borislav Petkov |
455d3c |
@@ -2295,6 +2299,7 @@ static struct amd64_family_type family_t
|
|
Borislav Petkov |
455d3c |
.ctl_name = "F17h",
|
|
Borislav Petkov |
455d3c |
.f0_id = PCI_DEVICE_ID_AMD_17H_DF_F0,
|
|
Borislav Petkov |
455d3c |
.f6_id = PCI_DEVICE_ID_AMD_17H_DF_F6,
|
|
Borislav Petkov |
455d3c |
+ .max_mcs = 2,
|
|
Borislav Petkov |
455d3c |
.ops = {
|
|
Borislav Petkov |
455d3c |
.early_channel_count = f17_early_channel_count,
|
|
Borislav Petkov |
455d3c |
.dbam_to_cs = f17_addr_mask_to_cs_size,
|
|
Borislav Petkov |
455d3c |
@@ -2304,6 +2309,7 @@ static struct amd64_family_type family_t
|
|
Borislav Petkov |
455d3c |
.ctl_name = "F17h_M10h",
|
|
Borislav Petkov |
455d3c |
.f0_id = PCI_DEVICE_ID_AMD_17H_M10H_DF_F0,
|
|
Borislav Petkov |
455d3c |
.f6_id = PCI_DEVICE_ID_AMD_17H_M10H_DF_F6,
|
|
Borislav Petkov |
455d3c |
+ .max_mcs = 2,
|
|
Borislav Petkov |
455d3c |
.ops = {
|
|
Borislav Petkov |
455d3c |
.early_channel_count = f17_early_channel_count,
|
|
Borislav Petkov |
455d3c |
.dbam_to_cs = f17_addr_mask_to_cs_size,
|
|
Borislav Petkov |
455d3c |
@@ -2313,6 +2319,7 @@ static struct amd64_family_type family_t
|
|
Borislav Petkov |
455d3c |
.ctl_name = "F17h_M30h",
|
|
Borislav Petkov |
455d3c |
.f0_id = PCI_DEVICE_ID_AMD_17H_M30H_DF_F0,
|
|
Borislav Petkov |
455d3c |
.f6_id = PCI_DEVICE_ID_AMD_17H_M30H_DF_F6,
|
|
Borislav Petkov |
455d3c |
+ .max_mcs = 8,
|
|
Borislav Petkov |
455d3c |
.ops = {
|
|
Borislav Petkov |
455d3c |
.early_channel_count = f17_early_channel_count,
|
|
Borislav Petkov |
455d3c |
.dbam_to_cs = f17_addr_mask_to_cs_size,
|
|
Borislav Petkov |
455d3c |
@@ -3387,29 +3394,13 @@ static const struct attribute_group *amd
|
|
Borislav Petkov |
455d3c |
NULL
|
|
Borislav Petkov |
455d3c |
};
|
|
Borislav Petkov |
455d3c |
|
|
Borislav Petkov |
455d3c |
-/* Set the number of Unified Memory Controllers in the system. */
|
|
Borislav Petkov |
455d3c |
-static void compute_num_umcs(void)
|
|
Borislav Petkov |
455d3c |
-{
|
|
Borislav Petkov |
455d3c |
- u8 model = boot_cpu_data.x86_model;
|
|
Borislav Petkov |
455d3c |
-
|
|
Borislav Petkov |
455d3c |
- if (boot_cpu_data.x86 < 0x17)
|
|
Borislav Petkov |
455d3c |
- return;
|
|
Borislav Petkov |
455d3c |
-
|
|
Borislav Petkov |
455d3c |
- if (model >= 0x30 && model <= 0x3f)
|
|
Borislav Petkov |
455d3c |
- num_umcs = 8;
|
|
Borislav Petkov |
455d3c |
- else
|
|
Borislav Petkov |
455d3c |
- num_umcs = 2;
|
|
Borislav Petkov |
455d3c |
-
|
|
Borislav Petkov |
455d3c |
- edac_dbg(1, "Number of UMCs: %x", num_umcs);
|
|
Borislav Petkov |
455d3c |
-}
|
|
Borislav Petkov |
455d3c |
-
|
|
Borislav Petkov |
455d3c |
static int hw_info_get(struct amd64_pvt *pvt)
|
|
Borislav Petkov |
455d3c |
{
|
|
Borislav Petkov |
455d3c |
u16 pci_id1, pci_id2;
|
|
Borislav Petkov |
455d3c |
int ret = -EINVAL;
|
|
Borislav Petkov |
455d3c |
|
|
Borislav Petkov |
455d3c |
if (pvt->fam >= 0x17) {
|
|
Borislav Petkov |
455d3c |
- pvt->umc = kcalloc(num_umcs, sizeof(struct amd64_umc), GFP_KERNEL);
|
|
Borislav Petkov |
455d3c |
+ pvt->umc = kcalloc(fam_type->max_mcs, sizeof(struct amd64_umc), GFP_KERNEL);
|
|
Borislav Petkov |
455d3c |
if (!pvt->umc)
|
|
Borislav Petkov |
455d3c |
return -ENOMEM;
|
|
Borislav Petkov |
455d3c |
|
|
Borislav Petkov |
455d3c |
@@ -3462,14 +3453,8 @@ static int init_one_instance(struct amd6
|
|
Borislav Petkov |
455d3c |
* Always allocate two channels since we can have setups with DIMMs on
|
|
Borislav Petkov |
455d3c |
* only one channel. Also, this simplifies handling later for the price
|
|
Borislav Petkov |
455d3c |
* of a couple of KBs tops.
|
|
Borislav Petkov |
455d3c |
- *
|
|
Borislav Petkov |
455d3c |
- * On Fam17h+, the number of controllers may be greater than two. So set
|
|
Borislav Petkov |
455d3c |
- * the size equal to the maximum number of UMCs.
|
|
Borislav Petkov |
455d3c |
*/
|
|
Borislav Petkov |
455d3c |
- if (pvt->fam >= 0x17)
|
|
Borislav Petkov |
455d3c |
- layers[1].size = num_umcs;
|
|
Borislav Petkov |
455d3c |
- else
|
|
Borislav Petkov |
455d3c |
- layers[1].size = 2;
|
|
Borislav Petkov |
455d3c |
+ layers[1].size = fam_type->max_mcs;
|
|
Borislav Petkov |
455d3c |
layers[1].is_virt_csrow = false;
|
|
Borislav Petkov |
455d3c |
|
|
Borislav Petkov |
455d3c |
mci = edac_mc_alloc(pvt->mc_node_id, ARRAY_SIZE(layers), layers, 0);
|
|
Borislav Petkov |
455d3c |
@@ -3654,8 +3639,6 @@ static int __init amd64_edac_init(void)
|
|
Borislav Petkov |
455d3c |
if (!msrs)
|
|
Borislav Petkov |
455d3c |
goto err_free;
|
|
Borislav Petkov |
455d3c |
|
|
Borislav Petkov |
455d3c |
- compute_num_umcs();
|
|
Borislav Petkov |
455d3c |
-
|
|
Borislav Petkov |
455d3c |
for (i = 0; i < amd_nb_num(); i++) {
|
|
Borislav Petkov |
455d3c |
err = probe_one_instance(i);
|
|
Borislav Petkov |
455d3c |
if (err) {
|
|
Borislav Petkov |
455d3c |
--- a/drivers/edac/amd64_edac.h
|
|
Borislav Petkov |
455d3c |
+++ b/drivers/edac/amd64_edac.h
|
|
Borislav Petkov |
455d3c |
@@ -476,6 +476,8 @@ struct low_ops {
|
|
Borislav Petkov |
455d3c |
struct amd64_family_type {
|
|
Borislav Petkov |
455d3c |
const char *ctl_name;
|
|
Borislav Petkov |
455d3c |
u16 f0_id, f1_id, f2_id, f6_id;
|
|
Borislav Petkov |
455d3c |
+ /* Maximum number of memory controllers per die/node. */
|
|
Borislav Petkov |
455d3c |
+ u8 max_mcs;
|
|
Borislav Petkov |
455d3c |
struct low_ops ops;
|
|
Borislav Petkov |
455d3c |
};
|
|
Borislav Petkov |
455d3c |
|