| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * Intel E3-1200 |
|---|
| 3 | 4 | * Copyright (C) 2014 Jason Baron <jbaron@akamai.com> |
|---|
| .. | .. |
|---|
| 8 | 9 | * Since the DRAM controller is on the cpu chip, we can use its PCI device |
|---|
| 9 | 10 | * id to identify these processors. |
|---|
| 10 | 11 | * |
|---|
| 11 | | - * PCI DRAM controller device ids (Taken from The PCI ID Repository - http://pci-ids.ucw.cz/) |
|---|
| 12 | + * PCI DRAM controller device ids (Taken from The PCI ID Repository - https://pci-ids.ucw.cz/) |
|---|
| 12 | 13 | * |
|---|
| 13 | 14 | * 0108: Xeon E3-1200 Processor Family DRAM Controller |
|---|
| 14 | 15 | * 010c: Xeon E3-1200/2nd Generation Core Processor Family DRAM Controller |
|---|
| .. | .. |
|---|
| 19 | 20 | * 0c08: Xeon E3-1200 v3 Processor DRAM Controller |
|---|
| 20 | 21 | * 1918: Xeon E3-1200 v5 Skylake Host Bridge/DRAM Registers |
|---|
| 21 | 22 | * 5918: Xeon E3-1200 Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers |
|---|
| 23 | + * 3e..: 8th/9th Gen Core Processor Host Bridge/DRAM Registers |
|---|
| 22 | 24 | * |
|---|
| 23 | 25 | * Based on Intel specification: |
|---|
| 24 | | - * http://www.intel.com/content/dam/www/public/us/en/documents/datasheets/xeon-e3-1200v3-vol-2-datasheet.pdf |
|---|
| 26 | + * https://www.intel.com/content/dam/www/public/us/en/documents/datasheets/xeon-e3-1200v3-vol-2-datasheet.pdf |
|---|
| 25 | 27 | * http://www.intel.com/content/www/us/en/processors/xeon/xeon-e3-1200-family-vol-2-datasheet.html |
|---|
| 26 | | - * http://www.intel.com/content/www/us/en/processors/core/7th-gen-core-family-mobile-h-processor-lines-datasheet-vol-2.html |
|---|
| 28 | + * https://www.intel.com/content/www/us/en/processors/core/7th-gen-core-family-mobile-h-processor-lines-datasheet-vol-2.html |
|---|
| 29 | + * https://www.intel.com/content/www/us/en/products/docs/processors/core/8th-gen-core-family-datasheet-vol-2.html |
|---|
| 27 | 30 | * |
|---|
| 28 | 31 | * According to the above datasheet (p.16): |
|---|
| 29 | 32 | * " |
|---|
| .. | .. |
|---|
| 59 | 62 | #define PCI_DEVICE_ID_INTEL_IE31200_HB_7 0x0c08 |
|---|
| 60 | 63 | #define PCI_DEVICE_ID_INTEL_IE31200_HB_8 0x1918 |
|---|
| 61 | 64 | #define PCI_DEVICE_ID_INTEL_IE31200_HB_9 0x5918 |
|---|
| 65 | + |
|---|
| 66 | +/* Coffee Lake-S */ |
|---|
| 67 | +#define PCI_DEVICE_ID_INTEL_IE31200_HB_CFL_MASK 0x3e00 |
|---|
| 68 | +#define PCI_DEVICE_ID_INTEL_IE31200_HB_CFL_1 0x3e0f |
|---|
| 69 | +#define PCI_DEVICE_ID_INTEL_IE31200_HB_CFL_2 0x3e18 |
|---|
| 70 | +#define PCI_DEVICE_ID_INTEL_IE31200_HB_CFL_3 0x3e1f |
|---|
| 71 | +#define PCI_DEVICE_ID_INTEL_IE31200_HB_CFL_4 0x3e30 |
|---|
| 72 | +#define PCI_DEVICE_ID_INTEL_IE31200_HB_CFL_5 0x3e31 |
|---|
| 73 | +#define PCI_DEVICE_ID_INTEL_IE31200_HB_CFL_6 0x3e32 |
|---|
| 74 | +#define PCI_DEVICE_ID_INTEL_IE31200_HB_CFL_7 0x3e33 |
|---|
| 75 | +#define PCI_DEVICE_ID_INTEL_IE31200_HB_CFL_8 0x3ec2 |
|---|
| 76 | +#define PCI_DEVICE_ID_INTEL_IE31200_HB_CFL_9 0x3ec6 |
|---|
| 77 | +#define PCI_DEVICE_ID_INTEL_IE31200_HB_CFL_10 0x3eca |
|---|
| 78 | + |
|---|
| 79 | +/* Test if HB is for Skylake or later. */ |
|---|
| 80 | +#define DEVICE_ID_SKYLAKE_OR_LATER(did) \ |
|---|
| 81 | + (((did) == PCI_DEVICE_ID_INTEL_IE31200_HB_8) || \ |
|---|
| 82 | + ((did) == PCI_DEVICE_ID_INTEL_IE31200_HB_9) || \ |
|---|
| 83 | + (((did) & PCI_DEVICE_ID_INTEL_IE31200_HB_CFL_MASK) == \ |
|---|
| 84 | + PCI_DEVICE_ID_INTEL_IE31200_HB_CFL_MASK)) |
|---|
| 62 | 85 | |
|---|
| 63 | 86 | #define IE31200_DIMMS 4 |
|---|
| 64 | 87 | #define IE31200_RANKS 8 |
|---|
| .. | .. |
|---|
| 336 | 359 | return NULL; |
|---|
| 337 | 360 | } |
|---|
| 338 | 361 | |
|---|
| 339 | | - window = ioremap_nocache(u.mchbar, IE31200_MMR_WINDOW_SIZE); |
|---|
| 362 | + window = ioremap(u.mchbar, IE31200_MMR_WINDOW_SIZE); |
|---|
| 340 | 363 | if (!window) |
|---|
| 341 | 364 | ie31200_printk(KERN_ERR, "Cannot map mmio space at 0x%llx\n", |
|---|
| 342 | 365 | (unsigned long long)u.mchbar); |
|---|
| .. | .. |
|---|
| 382 | 405 | u32 addr_decode, mad_offset; |
|---|
| 383 | 406 | |
|---|
| 384 | 407 | /* |
|---|
| 385 | | - * Kaby Lake seems to work like Skylake. Please re-visit this logic |
|---|
| 386 | | - * when adding new CPU support. |
|---|
| 408 | + * Kaby Lake, Coffee Lake seem to work like Skylake. Please re-visit |
|---|
| 409 | + * this logic when adding new CPU support. |
|---|
| 387 | 410 | */ |
|---|
| 388 | | - bool skl = (pdev->device >= PCI_DEVICE_ID_INTEL_IE31200_HB_8); |
|---|
| 411 | + bool skl = DEVICE_ID_SKYLAKE_OR_LATER(pdev->device); |
|---|
| 389 | 412 | |
|---|
| 390 | 413 | edac_dbg(0, "MC:\n"); |
|---|
| 391 | 414 | |
|---|
| .. | .. |
|---|
| 469 | 492 | |
|---|
| 470 | 493 | if (dimm_info[j][i].dual_rank) { |
|---|
| 471 | 494 | nr_pages = nr_pages / 2; |
|---|
| 472 | | - dimm = EDAC_DIMM_PTR(mci->layers, mci->dimms, |
|---|
| 473 | | - mci->n_layers, (i * 2) + 1, |
|---|
| 474 | | - j, 0); |
|---|
| 495 | + dimm = edac_get_dimm(mci, (i * 2) + 1, j, 0); |
|---|
| 475 | 496 | dimm->nr_pages = nr_pages; |
|---|
| 476 | 497 | edac_dbg(0, "set nr pages: 0x%lx\n", nr_pages); |
|---|
| 477 | 498 | dimm->grain = 8; /* just a guess */ |
|---|
| .. | .. |
|---|
| 482 | 503 | dimm->dtype = DEV_UNKNOWN; |
|---|
| 483 | 504 | dimm->edac_mode = EDAC_UNKNOWN; |
|---|
| 484 | 505 | } |
|---|
| 485 | | - dimm = EDAC_DIMM_PTR(mci->layers, mci->dimms, |
|---|
| 486 | | - mci->n_layers, i * 2, j, 0); |
|---|
| 506 | + dimm = edac_get_dimm(mci, i * 2, j, 0); |
|---|
| 487 | 507 | dimm->nr_pages = nr_pages; |
|---|
| 488 | 508 | edac_dbg(0, "set nr pages: 0x%lx\n", nr_pages); |
|---|
| 489 | 509 | dimm->grain = 8; /* same guess */ |
|---|
| .. | .. |
|---|
| 549 | 569 | } |
|---|
| 550 | 570 | |
|---|
| 551 | 571 | static const struct pci_device_id ie31200_pci_tbl[] = { |
|---|
| 552 | | - { |
|---|
| 553 | | - PCI_VEND_DEV(INTEL, IE31200_HB_1), PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
|---|
| 554 | | - IE31200}, |
|---|
| 555 | | - { |
|---|
| 556 | | - PCI_VEND_DEV(INTEL, IE31200_HB_2), PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
|---|
| 557 | | - IE31200}, |
|---|
| 558 | | - { |
|---|
| 559 | | - PCI_VEND_DEV(INTEL, IE31200_HB_3), PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
|---|
| 560 | | - IE31200}, |
|---|
| 561 | | - { |
|---|
| 562 | | - PCI_VEND_DEV(INTEL, IE31200_HB_4), PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
|---|
| 563 | | - IE31200}, |
|---|
| 564 | | - { |
|---|
| 565 | | - PCI_VEND_DEV(INTEL, IE31200_HB_5), PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
|---|
| 566 | | - IE31200}, |
|---|
| 567 | | - { |
|---|
| 568 | | - PCI_VEND_DEV(INTEL, IE31200_HB_6), PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
|---|
| 569 | | - IE31200}, |
|---|
| 570 | | - { |
|---|
| 571 | | - PCI_VEND_DEV(INTEL, IE31200_HB_7), PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
|---|
| 572 | | - IE31200}, |
|---|
| 573 | | - { |
|---|
| 574 | | - PCI_VEND_DEV(INTEL, IE31200_HB_8), PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
|---|
| 575 | | - IE31200}, |
|---|
| 576 | | - { |
|---|
| 577 | | - PCI_VEND_DEV(INTEL, IE31200_HB_9), PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
|---|
| 578 | | - IE31200}, |
|---|
| 579 | | - { |
|---|
| 580 | | - 0, |
|---|
| 581 | | - } /* 0 terminated list. */ |
|---|
| 572 | + { PCI_VEND_DEV(INTEL, IE31200_HB_1), PCI_ANY_ID, PCI_ANY_ID, 0, 0, IE31200 }, |
|---|
| 573 | + { PCI_VEND_DEV(INTEL, IE31200_HB_2), PCI_ANY_ID, PCI_ANY_ID, 0, 0, IE31200 }, |
|---|
| 574 | + { PCI_VEND_DEV(INTEL, IE31200_HB_3), PCI_ANY_ID, PCI_ANY_ID, 0, 0, IE31200 }, |
|---|
| 575 | + { PCI_VEND_DEV(INTEL, IE31200_HB_4), PCI_ANY_ID, PCI_ANY_ID, 0, 0, IE31200 }, |
|---|
| 576 | + { PCI_VEND_DEV(INTEL, IE31200_HB_5), PCI_ANY_ID, PCI_ANY_ID, 0, 0, IE31200 }, |
|---|
| 577 | + { PCI_VEND_DEV(INTEL, IE31200_HB_6), PCI_ANY_ID, PCI_ANY_ID, 0, 0, IE31200 }, |
|---|
| 578 | + { PCI_VEND_DEV(INTEL, IE31200_HB_7), PCI_ANY_ID, PCI_ANY_ID, 0, 0, IE31200 }, |
|---|
| 579 | + { PCI_VEND_DEV(INTEL, IE31200_HB_8), PCI_ANY_ID, PCI_ANY_ID, 0, 0, IE31200 }, |
|---|
| 580 | + { PCI_VEND_DEV(INTEL, IE31200_HB_9), PCI_ANY_ID, PCI_ANY_ID, 0, 0, IE31200 }, |
|---|
| 581 | + { PCI_VEND_DEV(INTEL, IE31200_HB_CFL_1), PCI_ANY_ID, PCI_ANY_ID, 0, 0, IE31200 }, |
|---|
| 582 | + { PCI_VEND_DEV(INTEL, IE31200_HB_CFL_2), PCI_ANY_ID, PCI_ANY_ID, 0, 0, IE31200 }, |
|---|
| 583 | + { PCI_VEND_DEV(INTEL, IE31200_HB_CFL_3), PCI_ANY_ID, PCI_ANY_ID, 0, 0, IE31200 }, |
|---|
| 584 | + { PCI_VEND_DEV(INTEL, IE31200_HB_CFL_4), PCI_ANY_ID, PCI_ANY_ID, 0, 0, IE31200 }, |
|---|
| 585 | + { PCI_VEND_DEV(INTEL, IE31200_HB_CFL_5), PCI_ANY_ID, PCI_ANY_ID, 0, 0, IE31200 }, |
|---|
| 586 | + { PCI_VEND_DEV(INTEL, IE31200_HB_CFL_6), PCI_ANY_ID, PCI_ANY_ID, 0, 0, IE31200 }, |
|---|
| 587 | + { PCI_VEND_DEV(INTEL, IE31200_HB_CFL_7), PCI_ANY_ID, PCI_ANY_ID, 0, 0, IE31200 }, |
|---|
| 588 | + { PCI_VEND_DEV(INTEL, IE31200_HB_CFL_8), PCI_ANY_ID, PCI_ANY_ID, 0, 0, IE31200 }, |
|---|
| 589 | + { PCI_VEND_DEV(INTEL, IE31200_HB_CFL_9), PCI_ANY_ID, PCI_ANY_ID, 0, 0, IE31200 }, |
|---|
| 590 | + { PCI_VEND_DEV(INTEL, IE31200_HB_CFL_10), PCI_ANY_ID, PCI_ANY_ID, 0, 0, IE31200 }, |
|---|
| 591 | + { 0, } /* 0 terminated list. */ |
|---|
| 582 | 592 | }; |
|---|
| 583 | 593 | MODULE_DEVICE_TABLE(pci, ie31200_pci_tbl); |
|---|
| 584 | 594 | |
|---|