.ddr_mdev_bdf = {0, 12, 0},
.hbm_mdev_bdf = {0, 12, 1},
.sad_all_offset = 0x108,
- .reg_rrl_ddr = &icx_reg_rrl_ddr,
+ .reg_rrl_ddr[0] = &icx_reg_rrl_ddr,
};
static struct res_config i10nm_cfg1 = {
.ddr_mdev_bdf = {0, 12, 0},
.hbm_mdev_bdf = {0, 12, 1},
.sad_all_offset = 0x108,
- .reg_rrl_ddr = &icx_reg_rrl_ddr,
+ .reg_rrl_ddr[0] = &icx_reg_rrl_ddr,
};
static struct res_config spr_cfg = {
.ddr_mdev_bdf = {0, 12, 0},
.hbm_mdev_bdf = {0, 12, 1},
.sad_all_offset = 0x300,
- .reg_rrl_ddr = &spr_reg_rrl_ddr,
+ .reg_rrl_ddr[0] = &spr_reg_rrl_ddr,
.reg_rrl_hbm[0] = &spr_reg_rrl_hbm_pch0,
.reg_rrl_hbm[1] = &spr_reg_rrl_hbm_pch1,
};
.uracu_bdf = {0, 0, 1},
.ddr_mdev_bdf = {0, 5, 1},
.sad_all_offset = 0x300,
- .reg_rrl_ddr = &gnr_reg_rrl_ddr,
+ .reg_rrl_ddr[0] = &gnr_reg_rrl_ddr,
};
static const struct x86_cpu_id i10nm_cpuids[] = {
skx_setup_debug("i10nm_test");
res_cfg->rrl_ctrl_mode = retry_rd_err_log;
- if (retry_rd_err_log && res_cfg->reg_rrl_ddr) {
+ if (retry_rd_err_log && res_cfg->reg_rrl_ddr[0]) {
skx_set_show_rrl(skx_show_rrl);
if (retry_rd_err_log == RRL_CTRL_LINUX)
skx_enable_rrl(true);
skx_set_decode(NULL);
- if (retry_rd_err_log && res_cfg->reg_rrl_ddr) {
+ if (retry_rd_err_log && res_cfg->reg_rrl_ddr[0]) {
if (retry_rd_err_log == RRL_CTRL_LINUX)
skx_enable_rrl(false);
skx_set_show_rrl(NULL);
static void enable_rrls_ddr(struct skx_imc *imc, bool enable)
{
- struct reg_rrl *rrl_ddr = skx_res_cfg->reg_rrl_ddr;
+ struct reg_rrl **rrl_ddr = skx_res_cfg->reg_rrl_ddr;
int i, chan_num = skx_res_cfg->ddr_chan_num;
struct skx_channel *chan = imc->chan;
if (!imc->mbase)
return;
- for (i = 0; i < chan_num; i++)
- enable_rrls(imc, i, rrl_ddr, enable, chan[i].rrl_ctl[0]);
+ for (i = 0; i < chan_num; i++) {
+ enable_rrls(imc, i, rrl_ddr[0], enable, chan[i].rrl_ctl[0]);
+ if (rrl_ddr[1])
+ enable_rrls(imc, i, rrl_ddr[1], enable, chan[i].rrl_ctl[1]);
+ }
}
static void enable_rrls_hbm(struct skx_imc *imc, bool enable)
}
EXPORT_SYMBOL_GPL(skx_enable_rrl);
+static struct reg_rrl *get_rrl_reg(struct decoded_addr *res, struct res_config *cfg)
+{
+ struct skx_imc *imc = &res->dev->imc[res->imc];
+
+ /* HBM has two groups of RRL sets, one per pseudo-channel. */
+ if (imc->hbm_mc)
+ return cfg->reg_rrl_hbm[res->cs & 1];
+
+ /* One group of RRL sets per DDR channel. */
+ if (!cfg->reg_rrl_ddr[1])
+ return cfg->reg_rrl_ddr[0];
+
+ if (res->subch == -1) {
+ skx_printk(KERN_ERR, "Invalid sub-channel id (-1), possibly missing %s ADXL component.\n", component_names[INDEX_SUBCH]);
+ return NULL;
+ }
+
+ /* Two groups of RRL sets per DDR channel (e.g., DMR: one group per sub-channel). */
+ return cfg->reg_rrl_ddr[res->subch & 1];
+}
+
void skx_show_rrl(struct decoded_addr *res, char *msg, int len, bool scrub_err)
{
- int i, j, n, ch = res->channel, pch = res->cs & 1;
struct skx_imc *imc = &res->dev->imc[res->imc];
+ int i, j, n, ch = res->channel;
u64 log, corr, status_mask;
struct reg_rrl *rrl;
bool scrub;
if (!imc->mbase)
return;
- rrl = imc->hbm_mc ? skx_res_cfg->reg_rrl_hbm[pch] : skx_res_cfg->reg_rrl_ddr;
-
+ rrl = get_rrl_reg(res, skx_res_cfg);
if (!rrl)
return;