ghes_edac.c 14.9 KB
Newer Older
1
// SPDX-License-Identifier: GPL-2.0-only
2 3 4
/*
 * GHES/EDAC Linux driver
 *
5
 * Copyright (c) 2013 by Mauro Carvalho Chehab
6 7 8 9
 *
 * Red Hat Inc. http://www.redhat.com
 */

10 11
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

12 13
#include <acpi/ghes.h>
#include <linux/edac.h>
14
#include <linux/dmi.h>
15
#include "edac_module.h"
16
#include <ras/ras_event.h>
17 18 19 20 21

struct ghes_edac_pvt {
	struct list_head list;
	struct ghes *ghes;
	struct mem_ctl_info *mci;
22 23

	/* Buffers for the error handling routine */
24
	char detail_location[240];
25 26
	char other_detail[160];
	char msg[80];
27 28
};

29 30 31 32 33 34 35
static refcount_t ghes_refcount = REFCOUNT_INIT(0);

/*
 * Access to ghes_pvt must be protected by ghes_lock. The spinlock
 * also provides the necessary (implicit) memory barrier for the SMP
 * case to make the pointer visible on another CPU.
 */
36
static struct ghes_edac_pvt *ghes_pvt;
37

38 39 40
/* GHES registration mutex */
static DEFINE_MUTEX(ghes_reg_mutex);

41 42 43 44 45 46
/*
 * Sync with other, potentially concurrent callers of
 * ghes_edac_report_mem_error(). We don't know what the
 * "inventive" firmware would do.
 */
static DEFINE_SPINLOCK(ghes_lock);
47

T
Toshi Kani 已提交
48 49 50 51
/* "ghes_edac.force_load=1" skips the platform check */
static bool __read_mostly force_load;
module_param(force_load, bool, 0);

52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
/* Memory Device - Type 17 of SMBIOS spec */
struct memdev_dmi_entry {
	u8 type;
	u8 length;
	u16 handle;
	u16 phys_mem_array_handle;
	u16 mem_err_info_handle;
	u16 total_width;
	u16 data_width;
	u16 size;
	u8 form_factor;
	u8 device_set;
	u8 device_locator;
	u8 bank_locator;
	u8 memory_type;
	u16 type_detail;
	u16 speed;
	u8 manufacturer;
	u8 serial_number;
	u8 asset_tag;
	u8 part_number;
	u8 attributes;
	u32 extended_size;
	u16 conf_mem_clk_speed;
} __attribute__((__packed__));

struct ghes_edac_dimm_fill {
	struct mem_ctl_info *mci;
80
	unsigned int count;
81 82 83 84 85 86 87 88 89 90
};

static void ghes_edac_count_dimms(const struct dmi_header *dh, void *arg)
{
	int *num_dimm = arg;

	if (dh->type == DMI_ENTRY_MEM_DEVICE)
		(*num_dimm)++;
}

91
static int get_dimm_smbios_index(struct mem_ctl_info *mci, u16 handle)
92 93 94 95 96 97 98 99 100 101
{
	int i;

	for (i = 0; i < mci->tot_dimms; i++) {
		if (mci->dimms[i]->smbios_handle == handle)
			return i;
	}
	return -1;
}

102 103 104 105 106 107 108
static void ghes_edac_dmidecode(const struct dmi_header *dh, void *arg)
{
	struct ghes_edac_dimm_fill *dimm_fill = arg;
	struct mem_ctl_info *mci = dimm_fill->mci;

	if (dh->type == DMI_ENTRY_MEM_DEVICE) {
		struct memdev_dmi_entry *entry = (struct memdev_dmi_entry *)dh;
109
		struct dimm_info *dimm = edac_get_dimm(mci, dimm_fill->count, 0, 0);
B
Borislav Petkov 已提交
110
		u16 rdr_mask = BIT(7) | BIT(13);
111 112

		if (entry->size == 0xffff) {
113 114
			pr_info("Can't get DIMM%i size\n",
				dimm_fill->count);
115 116 117 118
			dimm->nr_pages = MiB_TO_PAGES(32);/* Unknown */
		} else if (entry->size == 0x7fff) {
			dimm->nr_pages = MiB_TO_PAGES(entry->extended_size);
		} else {
B
Borislav Petkov 已提交
119 120
			if (entry->size & BIT(15))
				dimm->nr_pages = MiB_TO_PAGES((entry->size & 0x7fff) << 10);
121 122 123 124 125 126
			else
				dimm->nr_pages = MiB_TO_PAGES(entry->size);
		}

		switch (entry->memory_type) {
		case 0x12:
B
Borislav Petkov 已提交
127
			if (entry->type_detail & BIT(13))
128 129 130 131 132
				dimm->mtype = MEM_RDDR;
			else
				dimm->mtype = MEM_DDR;
			break;
		case 0x13:
B
Borislav Petkov 已提交
133
			if (entry->type_detail & BIT(13))
134 135 136 137 138 139 140 141
				dimm->mtype = MEM_RDDR2;
			else
				dimm->mtype = MEM_DDR2;
			break;
		case 0x14:
			dimm->mtype = MEM_FB_DDR2;
			break;
		case 0x18:
B
Borislav Petkov 已提交
142
			if (entry->type_detail & BIT(12))
143
				dimm->mtype = MEM_NVDIMM;
B
Borislav Petkov 已提交
144
			else if (entry->type_detail & BIT(13))
145 146 147 148
				dimm->mtype = MEM_RDDR3;
			else
				dimm->mtype = MEM_DDR3;
			break;
149
		case 0x1a:
B
Borislav Petkov 已提交
150
			if (entry->type_detail & BIT(12))
151
				dimm->mtype = MEM_NVDIMM;
B
Borislav Petkov 已提交
152
			else if (entry->type_detail & BIT(13))
153 154 155 156
				dimm->mtype = MEM_RDDR4;
			else
				dimm->mtype = MEM_DDR4;
			break;
157
		default:
B
Borislav Petkov 已提交
158
			if (entry->type_detail & BIT(6))
159
				dimm->mtype = MEM_RMBS;
B
Borislav Petkov 已提交
160
			else if ((entry->type_detail & rdr_mask) == rdr_mask)
161
				dimm->mtype = MEM_RDR;
B
Borislav Petkov 已提交
162
			else if (entry->type_detail & BIT(7))
163
				dimm->mtype = MEM_SDR;
B
Borislav Petkov 已提交
164
			else if (entry->type_detail & BIT(9))
165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186
				dimm->mtype = MEM_EDO;
			else
				dimm->mtype = MEM_UNKNOWN;
		}

		/*
		 * Actually, we can only detect if the memory has bits for
		 * checksum or not
		 */
		if (entry->total_width == entry->data_width)
			dimm->edac_mode = EDAC_NONE;
		else
			dimm->edac_mode = EDAC_SECDED;

		dimm->dtype = DEV_UNKNOWN;
		dimm->grain = 128;		/* Likely, worse case */

		/*
		 * FIXME: It shouldn't be hard to also fill the DIMM labels
		 */

		if (dimm->nr_pages) {
187
			edac_dbg(1, "DIMM%i: %s size = %d MB%s\n",
188
				dimm_fill->count, edac_mem_types[dimm->mtype],
189 190
				PAGES_TO_MiB(dimm->nr_pages),
				(dimm->edac_mode != EDAC_NONE) ? "(ECC)" : "");
191
			edac_dbg(2, "\ttype %d, detail 0x%02x, width %d(total %d)\n",
192 193 194 195
				entry->memory_type, entry->type_detail,
				entry->total_width, entry->data_width);
		}

196 197
		dimm->smbios_handle = entry->handle;

198 199 200 201
		dimm_fill->count++;
	}
}

202
void ghes_edac_report_mem_error(int sev, struct cper_sec_mem_err *mem_err)
203
{
204 205 206
	enum hw_event_mc_err_type type;
	struct edac_raw_error_desc *e;
	struct mem_ctl_info *mci;
207
	struct ghes_edac_pvt *pvt;
208
	unsigned long flags;
209
	char *p;
210
	u8 grain_bits;
211

212 213 214 215 216 217 218 219 220 221
	/*
	 * We can do the locking below because GHES defers error processing
	 * from NMI to IRQ context. Whenever that changes, we'd at least
	 * know.
	 */
	if (WARN_ON_ONCE(in_nmi()))
		return;

	spin_lock_irqsave(&ghes_lock, flags);

222 223 224 225
	pvt = ghes_pvt;
	if (!pvt)
		goto unlock;

226 227 228 229 230 231
	mci = pvt->mci;
	e = &mci->error_desc;

	/* Cleans the error report buffer */
	memset(e, 0, sizeof (*e));
	e->error_count = 1;
232 233 234 235 236 237 238 239
	strcpy(e->label, "unknown label");
	e->msg = pvt->msg;
	e->other_detail = pvt->other_detail;
	e->top_layer = -1;
	e->mid_layer = -1;
	e->low_layer = -1;
	*pvt->other_detail = '\0';
	*pvt->msg = '\0';
240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255

	switch (sev) {
	case GHES_SEV_CORRECTED:
		type = HW_EVENT_ERR_CORRECTED;
		break;
	case GHES_SEV_RECOVERABLE:
		type = HW_EVENT_ERR_UNCORRECTED;
		break;
	case GHES_SEV_PANIC:
		type = HW_EVENT_ERR_FATAL;
		break;
	default:
	case GHES_SEV_NO:
		type = HW_EVENT_ERR_INFO;
	}

256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319
	edac_dbg(1, "error validation_bits: 0x%08llx\n",
		 (long long)mem_err->validation_bits);

	/* Error type, mapped on e->msg */
	if (mem_err->validation_bits & CPER_MEM_VALID_ERROR_TYPE) {
		p = pvt->msg;
		switch (mem_err->error_type) {
		case 0:
			p += sprintf(p, "Unknown");
			break;
		case 1:
			p += sprintf(p, "No error");
			break;
		case 2:
			p += sprintf(p, "Single-bit ECC");
			break;
		case 3:
			p += sprintf(p, "Multi-bit ECC");
			break;
		case 4:
			p += sprintf(p, "Single-symbol ChipKill ECC");
			break;
		case 5:
			p += sprintf(p, "Multi-symbol ChipKill ECC");
			break;
		case 6:
			p += sprintf(p, "Master abort");
			break;
		case 7:
			p += sprintf(p, "Target abort");
			break;
		case 8:
			p += sprintf(p, "Parity Error");
			break;
		case 9:
			p += sprintf(p, "Watchdog timeout");
			break;
		case 10:
			p += sprintf(p, "Invalid address");
			break;
		case 11:
			p += sprintf(p, "Mirror Broken");
			break;
		case 12:
			p += sprintf(p, "Memory Sparing");
			break;
		case 13:
			p += sprintf(p, "Scrub corrected error");
			break;
		case 14:
			p += sprintf(p, "Scrub uncorrected error");
			break;
		case 15:
			p += sprintf(p, "Physical Memory Map-out event");
			break;
		default:
			p += sprintf(p, "reserved error (%d)",
				     mem_err->error_type);
		}
	} else {
		strcpy(pvt->msg, "unknown error");
	}

	/* Error address */
320
	if (mem_err->validation_bits & CPER_MEM_VALID_PA) {
321 322 323 324 325
		e->page_frame_number = mem_err->physical_addr >> PAGE_SHIFT;
		e->offset_in_page = mem_err->physical_addr & ~PAGE_MASK;
	}

	/* Error grain */
326
	if (mem_err->validation_bits & CPER_MEM_VALID_PA_MASK)
327 328 329 330 331 332 333 334 335 336
		e->grain = ~(mem_err->physical_addr_mask & ~PAGE_MASK);

	/* Memory error location, mapped on e->location */
	p = e->location;
	if (mem_err->validation_bits & CPER_MEM_VALID_NODE)
		p += sprintf(p, "node:%d ", mem_err->node);
	if (mem_err->validation_bits & CPER_MEM_VALID_CARD)
		p += sprintf(p, "card:%d ", mem_err->card);
	if (mem_err->validation_bits & CPER_MEM_VALID_MODULE)
		p += sprintf(p, "module:%d ", mem_err->module);
337 338
	if (mem_err->validation_bits & CPER_MEM_VALID_RANK_NUMBER)
		p += sprintf(p, "rank:%d ", mem_err->rank);
339 340 341 342 343 344 345 346
	if (mem_err->validation_bits & CPER_MEM_VALID_BANK)
		p += sprintf(p, "bank:%d ", mem_err->bank);
	if (mem_err->validation_bits & CPER_MEM_VALID_ROW)
		p += sprintf(p, "row:%d ", mem_err->row);
	if (mem_err->validation_bits & CPER_MEM_VALID_COLUMN)
		p += sprintf(p, "col:%d ", mem_err->column);
	if (mem_err->validation_bits & CPER_MEM_VALID_BIT_POSITION)
		p += sprintf(p, "bit_pos:%d ", mem_err->bit_pos);
347 348
	if (mem_err->validation_bits & CPER_MEM_VALID_MODULE_HANDLE) {
		const char *bank = NULL, *device = NULL;
349 350
		int index = -1;

351 352 353 354 355 356
		dmi_memdev_name(mem_err->mem_dev_handle, &bank, &device);
		if (bank != NULL && device != NULL)
			p += sprintf(p, "DIMM location:%s %s ", bank, device);
		else
			p += sprintf(p, "DIMM DMI handle: 0x%.4x ",
				     mem_err->mem_dev_handle);
357

358
		index = get_dimm_smbios_index(mci, mem_err->mem_dev_handle);
359 360 361 362 363
		if (index >= 0) {
			e->top_layer = index;
			e->enable_per_layer_report = true;
		}

364
	}
365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441
	if (p > e->location)
		*(p - 1) = '\0';

	/* All other fields are mapped on e->other_detail */
	p = pvt->other_detail;
	if (mem_err->validation_bits & CPER_MEM_VALID_ERROR_STATUS) {
		u64 status = mem_err->error_status;

		p += sprintf(p, "status(0x%016llx): ", (long long)status);
		switch ((status >> 8) & 0xff) {
		case 1:
			p += sprintf(p, "Error detected internal to the component ");
			break;
		case 16:
			p += sprintf(p, "Error detected in the bus ");
			break;
		case 4:
			p += sprintf(p, "Storage error in DRAM memory ");
			break;
		case 5:
			p += sprintf(p, "Storage error in TLB ");
			break;
		case 6:
			p += sprintf(p, "Storage error in cache ");
			break;
		case 7:
			p += sprintf(p, "Error in one or more functional units ");
			break;
		case 8:
			p += sprintf(p, "component failed self test ");
			break;
		case 9:
			p += sprintf(p, "Overflow or undervalue of internal queue ");
			break;
		case 17:
			p += sprintf(p, "Virtual address not found on IO-TLB or IO-PDIR ");
			break;
		case 18:
			p += sprintf(p, "Improper access error ");
			break;
		case 19:
			p += sprintf(p, "Access to a memory address which is not mapped to any component ");
			break;
		case 20:
			p += sprintf(p, "Loss of Lockstep ");
			break;
		case 21:
			p += sprintf(p, "Response not associated with a request ");
			break;
		case 22:
			p += sprintf(p, "Bus parity error - must also set the A, C, or D Bits ");
			break;
		case 23:
			p += sprintf(p, "Detection of a PATH_ERROR ");
			break;
		case 25:
			p += sprintf(p, "Bus operation timeout ");
			break;
		case 26:
			p += sprintf(p, "A read was issued to data that has been poisoned ");
			break;
		default:
			p += sprintf(p, "reserved ");
			break;
		}
	}
	if (mem_err->validation_bits & CPER_MEM_VALID_REQUESTOR_ID)
		p += sprintf(p, "requestorID: 0x%016llx ",
			     (long long)mem_err->requestor_id);
	if (mem_err->validation_bits & CPER_MEM_VALID_RESPONDER_ID)
		p += sprintf(p, "responderID: 0x%016llx ",
			     (long long)mem_err->responder_id);
	if (mem_err->validation_bits & CPER_MEM_VALID_TARGET_ID)
		p += sprintf(p, "targetID: 0x%016llx ",
			     (long long)mem_err->responder_id);
	if (p > pvt->other_detail)
		*(p - 1) = '\0';
442

443 444
	/* Generate the trace event */
	grain_bits = fls_long(e->grain);
445 446
	snprintf(pvt->detail_location, sizeof(pvt->detail_location),
		 "APEI location: %s %s", e->location, e->other_detail);
447 448
	trace_mc_event(type, e->msg, e->label, e->error_count,
		       mci->mc_idx, e->top_layer, e->mid_layer, e->low_layer,
T
Tan Xiaojun 已提交
449
		       (e->page_frame_number << PAGE_SHIFT) | e->offset_in_page,
450 451
		       grain_bits, e->syndrome, pvt->detail_location);

452
	edac_raw_mc_handle_error(type, mci, e);
453 454

unlock:
455
	spin_unlock_irqrestore(&ghes_lock, flags);
456 457
}

T
Toshi Kani 已提交
458 459 460 461 462 463 464 465
/*
 * Known systems that are safe to enable this module.
 */
static struct acpi_platform_list plat_list[] = {
	{"HPE   ", "Server  ", 0, ACPI_SIG_FADT, all_versions},
	{ } /* End */
};

466 467
int ghes_edac_register(struct ghes *ghes, struct device *dev)
{
468
	bool fake = false;
469
	int rc = 0, num_dimm = 0;
470
	struct mem_ctl_info *mci;
471
	struct ghes_edac_pvt *pvt;
472
	struct edac_mc_layer layers[1];
473
	struct ghes_edac_dimm_fill dimm_fill;
474
	unsigned long flags;
475
	int idx = -1;
T
Toshi Kani 已提交
476

477 478 479 480 481 482 483 484
	if (IS_ENABLED(CONFIG_X86)) {
		/* Check if safe to enable on this system */
		idx = acpi_match_platform_list(plat_list);
		if (!force_load && idx < 0)
			return -ENODEV;
	} else {
		idx = 0;
	}
485

486 487 488
	/* finish another registration/unregistration instance first */
	mutex_lock(&ghes_reg_mutex);

489 490 491
	/*
	 * We have only one logical memory controller to which all DIMMs belong.
	 */
492 493
	if (refcount_inc_not_zero(&ghes_refcount))
		goto unlock;
494

495 496 497 498 499 500 501 502
	/* Get the number of DIMMs */
	dmi_walk(ghes_edac_count_dimms, &num_dimm);

	/* Check if we've got a bogus BIOS */
	if (num_dimm == 0) {
		fake = true;
		num_dimm = 1;
	}
503 504

	layers[0].type = EDAC_MC_LAYER_ALL_MEM;
505
	layers[0].size = num_dimm;
506 507
	layers[0].is_virt_csrow = true;

508
	mci = edac_mc_alloc(0, ARRAY_SIZE(layers), layers, sizeof(struct ghes_edac_pvt));
509
	if (!mci) {
510
		pr_info("Can't allocate memory for EDAC data\n");
511 512
		rc = -ENOMEM;
		goto unlock;
513 514
	}

515 516 517
	pvt		= mci->pvt_info;
	pvt->ghes	= ghes;
	pvt->mci	= mci;
518

519
	mci->pdev = dev;
520 521 522 523 524 525 526
	mci->mtype_cap = MEM_FLAG_EMPTY;
	mci->edac_ctl_cap = EDAC_FLAG_NONE;
	mci->edac_cap = EDAC_FLAG_NONE;
	mci->mod_name = "ghes_edac.c";
	mci->ctl_name = "ghes_edac";
	mci->dev_name = "ghes";

T
Toshi Kani 已提交
527 528 529 530 531
	if (fake) {
		pr_info("This system has a very crappy BIOS: It doesn't even list the DIMMS.\n");
		pr_info("Its SMBIOS info is wrong. It is doubtful that the error report would\n");
		pr_info("work on such system. Use this driver with caution\n");
	} else if (idx < 0) {
532 533 534 535 536 537
		pr_info("This EDAC driver relies on BIOS to enumerate memory and get error reports.\n");
		pr_info("Unfortunately, not all BIOSes reflect the memory layout correctly.\n");
		pr_info("So, the end result of using this driver varies from vendor to vendor.\n");
		pr_info("If you find incorrect reports, please contact your hardware vendor\n");
		pr_info("to correct its BIOS.\n");
		pr_info("This system has %d DIMM sockets.\n", num_dimm);
538 539
	}

540
	if (!fake) {
541 542 543
		dimm_fill.count = 0;
		dimm_fill.mci = mci;
		dmi_walk(ghes_edac_dmidecode, &dimm_fill);
544
	} else {
545
		struct dimm_info *dimm = edac_get_dimm(mci, 0, 0, 0);
546

547
		dimm->nr_pages = 1;
548 549 550 551 552
		dimm->grain = 128;
		dimm->mtype = MEM_UNKNOWN;
		dimm->dtype = DEV_UNKNOWN;
		dimm->edac_mode = EDAC_SECDED;
	}
553 554 555

	rc = edac_mc_add_mc(mci);
	if (rc < 0) {
556
		pr_info("Can't register at EDAC core\n");
557
		edac_mc_free(mci);
558 559
		rc = -ENODEV;
		goto unlock;
560
	}
561 562 563 564 565 566 567 568 569 570 571 572

	spin_lock_irqsave(&ghes_lock, flags);
	ghes_pvt = pvt;
	spin_unlock_irqrestore(&ghes_lock, flags);

	/* only increment on success */
	refcount_inc(&ghes_refcount);

unlock:
	mutex_unlock(&ghes_reg_mutex);

	return rc;
573 574 575 576 577
}

void ghes_edac_unregister(struct ghes *ghes)
{
	struct mem_ctl_info *mci;
578
	unsigned long flags;
579

580
	mutex_lock(&ghes_reg_mutex);
581

582 583
	if (!refcount_dec_and_test(&ghes_refcount))
		goto unlock;
584

585 586 587 588 589
	/*
	 * Wait for the irq handler being finished.
	 */
	spin_lock_irqsave(&ghes_lock, flags);
	mci = ghes_pvt ? ghes_pvt->mci : NULL;
590
	ghes_pvt = NULL;
591 592 593 594 595 596 597 598 599 600 601
	spin_unlock_irqrestore(&ghes_lock, flags);

	if (!mci)
		goto unlock;

	mci = edac_mc_del_mc(mci->pdev);
	if (mci)
		edac_mc_free(mci);

unlock:
	mutex_unlock(&ghes_reg_mutex);
602
}