Lines Matching refs:lmc
292 #define LMC_DEBUGFS_ENT(_field) DEBUGFS_FIELD_ATTR(lmc, _field)
307 struct thunderx_lmc *lmc = file->private_data;
315 writeq(val, lmc->regs + LMC_INT_W1S);
326 struct thunderx_lmc *lmc = file->private_data;
328 u64 lmc_int = readq(lmc->regs + LMC_INT);
338 struct thunderx_lmc *lmc = arg;
344 addr = (uintptr_t)page_address(lmc->mem);
345 phys = (uintptr_t)page_to_phys(lmc->mem);
348 lmc->parity_test &= ~(7ULL << 8);
349 lmc->parity_test |= (cl_idx << 8);
351 writeq(lmc->mask0, lmc->regs + LMC_CHAR_MASK0);
352 writeq(lmc->mask2, lmc->regs + LMC_CHAR_MASK2);
353 writeq(lmc->parity_test, lmc->regs + LMC_ECC_PARITY_TEST);
355 readq(lmc->regs + LMC_CHAR_MASK0);
356 readq(lmc->regs + LMC_CHAR_MASK2);
357 readq(lmc->regs + LMC_ECC_PARITY_TEST);
410 struct thunderx_lmc *lmc = file->private_data;
416 atomic_set(&lmc->ecc_int, 0);
418 lmc->mem = alloc_pages_node(lmc->node, GFP_KERNEL, 0);
419 if (!lmc->mem)
424 __free_pages(lmc->mem, 0);
428 addr = page_address(lmc->mem);
430 while (!atomic_read(&lmc->ecc_int) && timeout--) {
431 stop_machine(inject_ecc_fn, lmc, NULL);
444 __free_pages(lmc->mem, 0);
491 static phys_addr_t thunderx_faddr_to_phys(u64 faddr, struct thunderx_lmc *lmc)
496 addr |= lmc->node << 40;
497 addr |= LMC_FADR_FDIMM(faddr) << lmc->dimm_lsb;
498 addr |= LMC_FADR_FBUNK(faddr) << lmc->rank_lsb;
499 addr |= LMC_FADR_FROW(faddr) << lmc->row_lsb;
500 addr |= (LMC_FADR_FCOL(faddr) >> 4) << lmc->col_hi_lsb;
502 bank = LMC_FADR_FBANK(faddr) << lmc->bank_lsb;
504 if (lmc->xor_bank)
505 bank ^= get_bits(addr, 12 + lmc->xbits, lmc->bank_width);
507 addr |= bank << lmc->bank_lsb;
509 xbits = PCI_FUNC(lmc->pdev->devfn);
511 if (lmc->l2c_alias)
512 xbits ^= get_bits(addr, 20, lmc->xbits) ^
513 get_bits(addr, 12, lmc->xbits);
548 struct thunderx_lmc *lmc = mci->pvt_info;
550 unsigned long head = ring_pos(lmc->ring_head, ARRAY_SIZE(lmc->err_ctx));
551 struct lmc_err_ctx *ctx = &lmc->err_ctx[head];
553 writeq(0, lmc->regs + LMC_CHAR_MASK0);
554 writeq(0, lmc->regs + LMC_CHAR_MASK2);
555 writeq(0x2, lmc->regs + LMC_ECC_PARITY_TEST);
557 ctx->reg_int = readq(lmc->regs + LMC_INT);
558 ctx->reg_fadr = readq(lmc->regs + LMC_FADR);
559 ctx->reg_nxm_fadr = readq(lmc->regs + LMC_NXM_FADR);
560 ctx->reg_scram_fadr = readq(lmc->regs + LMC_SCRAM_FADR);
561 ctx->reg_ecc_synd = readq(lmc->regs + LMC_ECC_SYND);
563 lmc->ring_head++;
565 atomic_set(&lmc->ecc_int, 1);
568 writeq(ctx->reg_int, lmc->regs + LMC_INT);
576 struct thunderx_lmc *lmc = mci->pvt_info;
593 while (CIRC_CNT(lmc->ring_head, lmc->ring_tail,
594 ARRAY_SIZE(lmc->err_ctx))) {
595 tail = ring_pos(lmc->ring_tail, ARRAY_SIZE(lmc->err_ctx));
597 ctx = &lmc->err_ctx[tail];
599 dev_dbg(&lmc->pdev->dev, "LMC_INT: %016llx\n",
601 dev_dbg(&lmc->pdev->dev, "LMC_FADR: %016llx\n",
603 dev_dbg(&lmc->pdev->dev, "LMC_NXM_FADR: %016llx\n",
605 dev_dbg(&lmc->pdev->dev, "LMC_SCRAM_FADR: %016llx\n",
607 dev_dbg(&lmc->pdev->dev, "LMC_ECC_SYND: %016llx\n",
621 phys_addr = thunderx_faddr_to_phys(ctx->reg_fadr, lmc);
634 lmc->ring_tail++;
664 struct thunderx_lmc *lmc;
694 lmc = mci->pvt_info;
698 lmc->regs = pcim_iomap_table(pdev)[0];
700 lmc_control = readq(lmc->regs + LMC_CONTROL);
701 lmc_ddr_pll_ctl = readq(lmc->regs + LMC_DDR_PLL_CTL);
702 lmc_config = readq(lmc->regs + LMC_CONFIG);
717 mci->mod_name = "thunderx-lmc";
718 mci->ctl_name = "thunderx-lmc";
722 lmc->pdev = pdev;
723 lmc->msix_ent.entry = 0;
725 lmc->ring_head = 0;
726 lmc->ring_tail = 0;
728 ret = pci_enable_msix_exact(pdev, &lmc->msix_ent, 1);
734 ret = devm_request_threaded_irq(&pdev->dev, lmc->msix_ent.vector,
743 lmc->node = FIELD_GET(THUNDERX_NODE, pci_resource_start(pdev, 0));
745 lmc->xbits = thunderx_get_num_lmcs(lmc->node) >> 1;
746 lmc->bank_width = (FIELD_GET(LMC_DDR_PLL_CTL_DDR4, lmc_ddr_pll_ctl) &&
749 lmc->pbank_lsb = (lmc_config >> 5) & 0xf;
750 lmc->dimm_lsb = 28 + lmc->pbank_lsb + lmc->xbits;
751 lmc->rank_lsb = lmc->dimm_lsb;
752 lmc->rank_lsb -= FIELD_GET(LMC_CONFIG_RANK_ENA, lmc_config) ? 1 : 0;
753 lmc->bank_lsb = 7 + lmc->xbits;
754 lmc->row_lsb = 14 + LMC_CONFIG_ROW_LSB(lmc_config) + lmc->xbits;
756 lmc->col_hi_lsb = lmc->bank_lsb + lmc->bank_width;
758 lmc->xor_bank = lmc_control & LMC_CONTROL_XOR_BANK;
760 l2c_ioaddr = ioremap(L2C_CTL | FIELD_PREP(THUNDERX_NODE, lmc->node), PAGE_SIZE);
767 lmc->l2c_alias = !(readq(l2c_ioaddr) & L2C_CTL_DISIDXALIAS);
777 lmc_int = readq(lmc->regs + LMC_INT);
778 writeq(lmc_int, lmc->regs + LMC_INT);
780 writeq(LMC_INT_ENA_ALL, lmc->regs + LMC_INT_ENA_W1S);
785 lmc,
806 struct thunderx_lmc *lmc = mci->pvt_info;
808 writeq(LMC_INT_ENA_ALL, lmc->regs + LMC_INT_ENA_W1C);