Lines Matching refs:imc
157 struct igen6_imc imc[NUM_IMC]; member
344 struct igen6_imc *imc = &igen6_pvt->imc[mc]; in adl_err_addr_to_imc_addr() local
351 mc_hash = readl(imc->window + MAD_MC_HASH_OFFSET); in adl_err_addr_to_imc_addr()
513 struct igen6_imc *imc = &igen6_pvt->imc[res->mc]; in igen6_decode() local
524 hash = readl(imc->window + CHANNEL_HASH_OFFSET); in igen6_decode()
525 s_size = imc->ch_s_size; in igen6_decode()
526 l_map = imc->ch_l_map; in igen6_decode()
532 hash = readl(imc->window + CHANNEL_EHASH_OFFSET); in igen6_decode()
533 s_size = imc->dimm_s_size[idx]; in igen6_decode()
534 l_map = imc->dimm_l_map[idx]; in igen6_decode()
595 static u64 ecclog_read_and_clear(struct igen6_imc *imc) in ecclog_read_and_clear() argument
597 u64 ecclog = readq(imc->window + ECC_ERROR_LOG_OFFSET); in ecclog_read_and_clear()
601 writeq(ecclog, imc->window + ECC_ERROR_LOG_OFFSET); in ecclog_read_and_clear()
608 static void errsts_clear(struct igen6_imc *imc) in errsts_clear() argument
612 if (pci_read_config_word(imc->pdev, ERRSTS_OFFSET, &errsts)) { in errsts_clear()
619 pci_write_config_word(imc->pdev, ERRSTS_OFFSET, errsts); in errsts_clear()
624 struct igen6_imc *imc = &igen6_pvt->imc[0]; in errcmd_enable_error_reporting() local
628 rc = pci_read_config_word(imc->pdev, ERRCMD_OFFSET, &errcmd); in errcmd_enable_error_reporting()
637 rc = pci_write_config_word(imc->pdev, ERRCMD_OFFSET, errcmd); in errcmd_enable_error_reporting()
646 struct igen6_imc *imc; in ecclog_handler() local
651 imc = &igen6_pvt->imc[i]; in ecclog_handler()
655 ecclog = ecclog_read_and_clear(imc); in ecclog_handler()
688 mci = igen6_pvt->imc[res.mc].mci; in ecclog_work_cb()
706 errsts_clear(&igen6_pvt->imc[i]); in ecclog_irq_work_cb()
786 static bool igen6_check_ecc(struct igen6_imc *imc) in igen6_check_ecc() argument
788 u32 activate = readl(imc->window + IBECC_ACTIVATE_OFFSET); in igen6_check_ecc()
795 struct igen6_imc *imc = mci->pvt_info; in igen6_get_dimm_config() local
797 int i, j, ndimms, mc = imc->mc; in igen6_get_dimm_config()
806 mad_inter = readl(imc->window + MAD_INTER_CHANNEL_OFFSET); in igen6_get_dimm_config()
808 ecc = igen6_check_ecc(imc); in igen6_get_dimm_config()
809 imc->ch_s_size = MAD_INTER_CHANNEL_CH_S_SIZE(mad_inter); in igen6_get_dimm_config()
810 imc->ch_l_map = MAD_INTER_CHANNEL_CH_L_MAP(mad_inter); in igen6_get_dimm_config()
813 mad_intra = readl(imc->window + MAD_INTRA_CH0_OFFSET + i * 4); in igen6_get_dimm_config()
814 mad_dimm = readl(imc->window + MAD_DIMM_CH0_OFFSET + i * 4); in igen6_get_dimm_config()
816 imc->dimm_l_size[i] = MAD_DIMM_CH_DIMM_L_SIZE(mad_dimm); in igen6_get_dimm_config()
817 imc->dimm_s_size[i] = MAD_DIMM_CH_DIMM_S_SIZE(mad_dimm); in igen6_get_dimm_config()
818 imc->dimm_l_map[i] = MAD_INTRA_CH_DIMM_L_MAP(mad_intra); in igen6_get_dimm_config()
819 imc->size += imc->dimm_s_size[i]; in igen6_get_dimm_config()
820 imc->size += imc->dimm_l_size[i]; in igen6_get_dimm_config()
826 if (j ^ imc->dimm_l_map[i]) { in igen6_get_dimm_config()
828 dsize = imc->dimm_s_size[i]; in igen6_get_dimm_config()
831 dsize = imc->dimm_l_size[i]; in igen6_get_dimm_config()
856 edac_dbg(0, "MC %d, total size %llu MiB\n", mc, imc->size >> 20); in igen6_get_dimm_config()
866 static void igen6_reg_dump(struct igen6_imc *imc) in igen6_reg_dump() argument
871 readl(imc->window + CHANNEL_HASH_OFFSET)); in igen6_reg_dump()
873 readl(imc->window + CHANNEL_EHASH_OFFSET)); in igen6_reg_dump()
875 readl(imc->window + MAD_INTER_CHANNEL_OFFSET)); in igen6_reg_dump()
877 readq(imc->window + ECC_ERROR_LOG_OFFSET)); in igen6_reg_dump()
881 readl(imc->window + MAD_INTRA_CH0_OFFSET + i * 4)); in igen6_reg_dump()
883 readl(imc->window + MAD_DIMM_CH0_OFFSET + i * 4)); in igen6_reg_dump()
931 static void igen6_reg_dump(struct igen6_imc *imc) {} in igen6_reg_dump() argument
1007 struct igen6_imc *imc; in igen6_register_mci() local
1044 mci->pvt_info = &igen6_pvt->imc[mc]; in igen6_register_mci()
1046 imc = mci->pvt_info; in igen6_register_mci()
1047 device_initialize(&imc->dev); in igen6_register_mci()
1058 mci->pdev = mc ? &imc->dev : &pdev->dev; in igen6_register_mci()
1059 imc->mc = mc; in igen6_register_mci()
1060 imc->pdev = pdev; in igen6_register_mci()
1061 imc->window = window; in igen6_register_mci()
1063 igen6_reg_dump(imc); in igen6_register_mci()
1075 imc->mci = mci; in igen6_register_mci()
1089 struct igen6_imc *imc; in igen6_unregister_mcis() local
1095 imc = &igen6_pvt->imc[i]; in igen6_unregister_mcis()
1096 mci = imc->mci; in igen6_unregister_mcis()
1103 iounmap(imc->window); in igen6_unregister_mcis()
1109 struct igen6_imc *imc = &igen6_pvt->imc[0]; in igen6_mem_slice_setup() local
1119 if (imc[0].size < imc[1].size) { in igen6_mem_slice_setup()
1120 ms_s_size = imc[0].size; in igen6_mem_slice_setup()
1123 ms_s_size = imc[1].size; in igen6_mem_slice_setup()