Lines Matching +full:mc +full:- +full:bus
1 // SPDX-License-Identifier: GPL-2.0
10 * when linked once into a module and into a built-in object, at the
12 * file is being linked into a built-in object.
61 return -ENODEV; in skx_adxl_get()
82 skx_printk(KERN_NOTICE, "Not enough ADXL components for 2-level memory.\n"); in skx_adxl_get()
95 return -ENOMEM; in skx_adxl_get()
102 return -ENOMEM; in skx_adxl_get()
113 return -ENODEV; in skx_adxl_get()
133 d->mc_mapping[i] = i; in skx_init_mc_mapping()
138 edac_dbg(0, "Set the mapping of mc phy idx to logical idx: %02d -> %02d\n", in skx_set_mc_mapping()
141 d->mc_mapping[pmc] = lmc; in skx_set_mc_mapping()
147 edac_dbg(0, "Get the mapping of mc phy idx to logical idx: %02d -> %02d\n", in skx_get_mc_mapping()
148 pmc, d->mc_mapping[pmc]); in skx_get_mc_mapping()
150 return d->mc_mapping[pmc]; in skx_get_mc_mapping()
158 if (res->addr >= skx_tohm || (res->addr >= skx_tolm && in skx_adxl_decode()
159 res->addr < BIT_ULL(32))) { in skx_adxl_decode()
160 edac_dbg(0, "Address 0x%llx out of range\n", res->addr); in skx_adxl_decode()
164 if (adxl_decode(res->addr, adxl_values)) { in skx_adxl_decode()
165 edac_dbg(0, "Failed to decode 0x%llx\n", res->addr); in skx_adxl_decode()
171 * a near-memory error(DDR5) as a far-memory error(CXL), resulting in skx_adxl_decode()
173 * To address this, prefetch the decoded far-memory controller ID in skx_adxl_decode()
174 * and adjust the error source to near-memory if the far-memory in skx_adxl_decode()
177 if (skx_res_cfg && skx_res_cfg->type == GNR && err_src == ERR_SRC_2LM_FM) { in skx_adxl_decode()
178 res->imc = (int)adxl_values[component_indices[INDEX_MEMCTRL]]; in skx_adxl_decode()
179 if (res->imc == -1) { in skx_adxl_decode()
181 edac_dbg(0, "Adjust the error source to near-memory.\n"); in skx_adxl_decode()
185 res->socket = (int)adxl_values[component_indices[INDEX_SOCKET]]; in skx_adxl_decode()
187 res->imc = (adxl_nm_bitmap & BIT_NM_MEMCTRL) ? in skx_adxl_decode()
188 (int)adxl_values[component_indices[INDEX_NM_MEMCTRL]] : -1; in skx_adxl_decode()
189 res->channel = (adxl_nm_bitmap & BIT_NM_CHANNEL) ? in skx_adxl_decode()
190 (int)adxl_values[component_indices[INDEX_NM_CHANNEL]] : -1; in skx_adxl_decode()
191 res->dimm = (adxl_nm_bitmap & BIT_NM_DIMM) ? in skx_adxl_decode()
192 (int)adxl_values[component_indices[INDEX_NM_DIMM]] : -1; in skx_adxl_decode()
193 res->cs = (adxl_nm_bitmap & BIT_NM_CS) ? in skx_adxl_decode()
194 (int)adxl_values[component_indices[INDEX_NM_CS]] : -1; in skx_adxl_decode()
196 res->imc = (int)adxl_values[component_indices[INDEX_MEMCTRL]]; in skx_adxl_decode()
197 res->channel = (int)adxl_values[component_indices[INDEX_CHANNEL]]; in skx_adxl_decode()
198 res->dimm = (int)adxl_values[component_indices[INDEX_DIMM]]; in skx_adxl_decode()
199 res->cs = (int)adxl_values[component_indices[INDEX_CS]]; in skx_adxl_decode()
202 if (res->imc > NUM_IMC - 1 || res->imc < 0) { in skx_adxl_decode()
203 skx_printk(KERN_ERR, "Bad imc %d\n", res->imc); in skx_adxl_decode()
208 if (d->imc[0].src_id == res->socket) { in skx_adxl_decode()
209 res->dev = d; in skx_adxl_decode()
214 if (!res->dev) { in skx_adxl_decode()
216 res->socket, res->imc); in skx_adxl_decode()
220 res->imc = skx_get_mc_mapping(d, res->imc); in skx_adxl_decode()
226 len += snprintf(adxl_msg + len, MSG_SIZE - len, " %s:0x%llx", in skx_adxl_decode()
228 if (MSG_SIZE - len <= 0) in skx_adxl_decode()
232 res->decoded_by_adxl = true; in skx_adxl_decode()
261 node = pcibus_to_node(d->util_all->bus); in skx_get_pkg_id()
263 for_each_cpu(cpu, cpumask_of_pcibus(d->util_all->bus)) { in skx_get_pkg_id()
266 if (c->initialized && cpu_to_node(cpu) == node) { in skx_get_pkg_id()
267 *id = c->topo.pkg_id; in skx_get_pkg_id()
274 return -ENODEV; in skx_get_pkg_id()
282 * The 3-bit source IDs in PCI configuration space registers are limited in skx_get_src_id()
292 if (pci_read_config_dword(d->util_all, off, ®)) { in skx_get_src_id()
294 return -ENODEV; in skx_get_src_id()
316 * We use the per-socket device @cfg->did to count how many sockets are present,
329 pdev = pci_get_device(PCI_VENDOR_ID_INTEL, cfg->decs_did, prev); in skx_get_all_bus_mappings()
336 return -ENOMEM; in skx_get_all_bus_mappings()
339 if (pci_read_config_dword(pdev, cfg->busno_cfg_offset, ®)) { in skx_get_all_bus_mappings()
342 skx_printk(KERN_ERR, "Failed to read bus idx\n"); in skx_get_all_bus_mappings()
343 return -ENODEV; in skx_get_all_bus_mappings()
346 d->bus[0] = GET_BITFIELD(reg, 0, 7); in skx_get_all_bus_mappings()
347 d->bus[1] = GET_BITFIELD(reg, 8, 15); in skx_get_all_bus_mappings()
348 if (cfg->type == SKX) { in skx_get_all_bus_mappings()
349 d->seg = pci_domain_nr(pdev->bus); in skx_get_all_bus_mappings()
350 d->bus[2] = GET_BITFIELD(reg, 16, 23); in skx_get_all_bus_mappings()
351 d->bus[3] = GET_BITFIELD(reg, 24, 31); in skx_get_all_bus_mappings()
353 d->seg = GET_BITFIELD(reg, 16, 23); in skx_get_all_bus_mappings()
357 d->bus[0], d->bus[1], d->bus[2], d->bus[3]); in skx_get_all_bus_mappings()
358 list_add_tail(&d->list, &dev_edac_list); in skx_get_all_bus_mappings()
378 return -ENODEV; in skx_get_hi_lo()
406 return -ENODEV; in skx_get_hi_lo()
417 return -EINVAL; in skx_get_dimm_attr()
436 cols = imc->hbm_mc ? 6 : numcol(mtr); in skx_get_dimm_info()
438 if (imc->hbm_mc) { in skx_get_dimm_info()
441 } else if (cfg->support_ddr5) { in skx_get_dimm_info()
450 * Compute size in 8-byte (2^3) words, then shift to MiB (2^20) in skx_get_dimm_info()
452 size = ((1ull << (rows + cols + ranks)) * banks) >> (20 - 3); in skx_get_dimm_info()
455 …edac_dbg(0, "mc#%d: channel %d, dimm %d, %lld MiB (%d pages) bank: %d, rank: %d, row: 0x%x, col: 0… in skx_get_dimm_info()
456 imc->mc, chan, dimmno, size, npages, in skx_get_dimm_info()
459 imc->chan[chan].dimms[dimmno].close_pg = GET_BITFIELD(mcmtr, 0, 0); in skx_get_dimm_info()
460 imc->chan[chan].dimms[dimmno].bank_xor_enable = GET_BITFIELD(mcmtr, 9, 9); in skx_get_dimm_info()
461 imc->chan[chan].dimms[dimmno].fine_grain_bank = GET_BITFIELD(amap, 0, 0); in skx_get_dimm_info()
462 imc->chan[chan].dimms[dimmno].rowbits = rows; in skx_get_dimm_info()
463 imc->chan[chan].dimms[dimmno].colbits = cols; in skx_get_dimm_info()
465 dimm->nr_pages = npages; in skx_get_dimm_info()
466 dimm->grain = 32; in skx_get_dimm_info()
467 dimm->dtype = get_width(mtr); in skx_get_dimm_info()
468 dimm->mtype = mtype; in skx_get_dimm_info()
469 dimm->edac_mode = EDAC_SECDED; /* likely better than this */ in skx_get_dimm_info()
471 if (imc->hbm_mc) in skx_get_dimm_info()
472 snprintf(dimm->label, sizeof(dimm->label), "CPU_SrcID#%u_HBMC#%u_Chan#%u", in skx_get_dimm_info()
473 imc->src_id, imc->lmc, chan); in skx_get_dimm_info()
475 snprintf(dimm->label, sizeof(dimm->label), "CPU_SrcID#%u_MC#%u_Chan#%u_DIMM#%u", in skx_get_dimm_info()
476 imc->src_id, imc->lmc, chan, dimmno); in skx_get_dimm_info()
490 dev_handle = ACPI_NFIT_BUILD_DEVICE_HANDLE(dimmno, chan, imc->lmc, in skx_get_nvdimm_info()
491 imc->src_id, 0); in skx_get_nvdimm_info()
494 if (smbios_handle == -EOPNOTSUPP) { in skx_get_nvdimm_info()
515 dimm->nr_pages = size >> PAGE_SHIFT; in skx_get_nvdimm_info()
516 dimm->grain = 32; in skx_get_nvdimm_info()
517 dimm->dtype = DEV_UNKNOWN; in skx_get_nvdimm_info()
518 dimm->mtype = MEM_NVDIMM; in skx_get_nvdimm_info()
519 dimm->edac_mode = EDAC_SECDED; /* likely better than this */ in skx_get_nvdimm_info()
521 edac_dbg(0, "mc#%d: channel %d, dimm %d, %llu MiB (%u pages)\n", in skx_get_nvdimm_info()
522 imc->mc, chan, dimmno, size >> 20, dimm->nr_pages); in skx_get_nvdimm_info()
524 snprintf(dimm->label, sizeof(dimm->label), "CPU_SrcID#%u_MC#%u_Chan#%u_DIMM#%u", in skx_get_nvdimm_info()
525 imc->src_id, imc->lmc, chan, dimmno); in skx_get_nvdimm_info()
541 /* Allocate a new MC control structure */ in skx_register_mci()
548 mci = edac_mc_alloc(imc->mc, ARRAY_SIZE(layers), layers, in skx_register_mci()
552 return -ENOMEM; in skx_register_mci()
554 edac_dbg(0, "MC#%d: mci = %p\n", imc->mc, mci); in skx_register_mci()
557 imc->mci = mci; in skx_register_mci()
558 pvt = mci->pvt_info; in skx_register_mci()
559 pvt->imc = imc; in skx_register_mci()
561 mci->ctl_name = kasprintf(GFP_KERNEL, "%s#%d IMC#%d", ctl_name, in skx_register_mci()
562 imc->src_id, imc->lmc); in skx_register_mci()
563 if (!mci->ctl_name) { in skx_register_mci()
564 rc = -ENOMEM; in skx_register_mci()
568 mci->mtype_cap = MEM_FLAG_DDR4 | MEM_FLAG_NVDIMM; in skx_register_mci()
569 if (cfg->support_ddr5) in skx_register_mci()
570 mci->mtype_cap |= MEM_FLAG_DDR5; in skx_register_mci()
571 mci->edac_ctl_cap = EDAC_FLAG_NONE; in skx_register_mci()
572 mci->edac_cap = EDAC_FLAG_NONE; in skx_register_mci()
573 mci->mod_name = mod_str; in skx_register_mci()
574 mci->dev_name = pci_name(pdev); in skx_register_mci()
575 mci->ctl_page_to_phys = NULL; in skx_register_mci()
582 mci->pdev = &pdev->dev; in skx_register_mci()
584 /* Add this new MC control structure to EDAC's list of MCs */ in skx_register_mci()
586 edac_dbg(0, "MC: failed edac_mc_add_mc()\n"); in skx_register_mci()
587 rc = -EINVAL; in skx_register_mci()
594 kfree(mci->ctl_name); in skx_register_mci()
597 imc->mci = NULL; in skx_register_mci()
604 struct mem_ctl_info *mci = imc->mci; in skx_unregister_mci()
609 edac_dbg(0, "MC%d: mci = %p\n", imc->mc, mci); in skx_unregister_mci()
611 /* Remove MC sysfs nodes */ in skx_unregister_mci()
612 edac_mc_del_mc(mci->pdev); in skx_unregister_mci()
614 edac_dbg(1, "%s: free mci struct\n", mci->ctl_name); in skx_unregister_mci()
615 kfree(mci->ctl_name); in skx_unregister_mci()
625 bool ripv = GET_BITFIELD(m->mcgstatus, 0, 0); in skx_mce_output_error()
626 bool overflow = GET_BITFIELD(m->status, 62, 62); in skx_mce_output_error()
627 bool uncorrected_error = GET_BITFIELD(m->status, 61, 61); in skx_mce_output_error()
631 u32 core_err_cnt = GET_BITFIELD(m->status, 38, 52); in skx_mce_output_error()
632 u32 mscod = GET_BITFIELD(m->status, 16, 31); in skx_mce_output_error()
633 u32 errcode = GET_BITFIELD(m->status, 0, 15); in skx_mce_output_error()
634 u32 optypenum = GET_BITFIELD(m->status, 4, 6); in skx_mce_output_error()
636 recoverable = GET_BITFIELD(m->status, 56, 56); in skx_mce_output_error()
671 if (res->decoded_by_adxl) { in skx_mce_output_error()
682 res->socket, res->imc, res->rank, in skx_mce_output_error()
683 res->row, res->column, res->bank_address, res->bank_group); in skx_mce_output_error()
687 skx_show_retry_rd_err_log(res, skx_msg + len, MSG_SIZE - len, scrub_err); in skx_mce_output_error()
693 m->addr >> PAGE_SHIFT, m->addr & ~PAGE_MASK, 0, in skx_mce_output_error()
694 res->channel, res->dimm, -1, in skx_mce_output_error()
700 u32 errcode = GET_BITFIELD(m->status, 0, 15) & MCACOD_MEM_ERR_MASK; in skx_error_source()
723 if (mce->kflags & MCE_HANDLED_CEC) in skx_mce_check_error()
729 if (err_src == ERR_SRC_NOT_MEMORY || !(mce->status & MCI_STATUS_ADDRV)) in skx_mce_check_error()
734 res.addr = mce->addr & MCI_ADDR_PHYSADDR; in skx_mce_check_error()
736 pr_err("Invalid address 0x%llx in IA32_MC%d_ADDR\n", mce->addr, mce->bank); in skx_mce_check_error()
747 mci = res.dev->imc[res.imc].mci; in skx_mce_check_error()
752 if (mce->mcgstatus & MCG_STATUS_MCIP) in skx_mce_check_error()
760 "Bank %d: 0x%llx\n", mce->extcpu, type, in skx_mce_check_error()
761 mce->mcgstatus, mce->bank, mce->status); in skx_mce_check_error()
762 skx_mc_printk(mci, KERN_DEBUG, "TSC 0x%llx ", mce->tsc); in skx_mce_check_error()
763 skx_mc_printk(mci, KERN_DEBUG, "ADDR 0x%llx ", mce->addr); in skx_mce_check_error()
764 skx_mc_printk(mci, KERN_DEBUG, "MISC 0x%llx ", mce->misc); in skx_mce_check_error()
767 "%u APIC 0x%x\n", mce->cpuvendor, mce->cpuid, in skx_mce_check_error()
768 mce->time, mce->socketid, mce->apicid); in skx_mce_check_error()
772 mce->kflags |= MCE_HANDLED_EDAC; in skx_mce_check_error()
785 list_del(&d->list); in skx_remove()
787 if (d->imc[i].mci) in skx_remove()
788 skx_unregister_mci(&d->imc[i]); in skx_remove()
790 if (d->imc[i].mdev) in skx_remove()
791 pci_dev_put(d->imc[i].mdev); in skx_remove()
793 if (d->imc[i].mbase) in skx_remove()
794 iounmap(d->imc[i].mbase); in skx_remove()
797 if (d->imc[i].chan[j].cdev) in skx_remove()
798 pci_dev_put(d->imc[i].chan[j].cdev); in skx_remove()
801 if (d->util_all) in skx_remove()
802 pci_dev_put(d->util_all); in skx_remove()
803 if (d->pcu_cr3) in skx_remove()
804 pci_dev_put(d->pcu_cr3); in skx_remove()
805 if (d->sad_all) in skx_remove()
806 pci_dev_put(d->sad_all); in skx_remove()
807 if (d->uracu) in skx_remove()
808 pci_dev_put(d->uracu); in skx_remove()
864 MODULE_DESCRIPTION("MC Driver for Intel server processors");