in synopsys_edac.c [1146:1250]
static void setup_column_address_map(struct synps_edac_priv *priv, u32 *addrmap)
{
u32 width, memtype;
int index;
memtype = readl(priv->baseaddr + CTRL_OFST);
width = (memtype & ECC_CTRL_BUSWIDTH_MASK) >> ECC_CTRL_BUSWIDTH_SHIFT;
priv->col_shift[0] = 0;
priv->col_shift[1] = 1;
priv->col_shift[2] = (addrmap[2] & COL_MAX_VAL_MASK) + COL_B2_BASE;
priv->col_shift[3] = ((addrmap[2] >> 8) &
COL_MAX_VAL_MASK) + COL_B3_BASE;
priv->col_shift[4] = (((addrmap[2] >> 16) & COL_MAX_VAL_MASK) ==
COL_MAX_VAL_MASK) ? 0 : (((addrmap[2] >> 16) &
COL_MAX_VAL_MASK) + COL_B4_BASE);
priv->col_shift[5] = (((addrmap[2] >> 24) & COL_MAX_VAL_MASK) ==
COL_MAX_VAL_MASK) ? 0 : (((addrmap[2] >> 24) &
COL_MAX_VAL_MASK) + COL_B5_BASE);
priv->col_shift[6] = ((addrmap[3] & COL_MAX_VAL_MASK) ==
COL_MAX_VAL_MASK) ? 0 : ((addrmap[3] &
COL_MAX_VAL_MASK) + COL_B6_BASE);
priv->col_shift[7] = (((addrmap[3] >> 8) & COL_MAX_VAL_MASK) ==
COL_MAX_VAL_MASK) ? 0 : (((addrmap[3] >> 8) &
COL_MAX_VAL_MASK) + COL_B7_BASE);
priv->col_shift[8] = (((addrmap[3] >> 16) & COL_MAX_VAL_MASK) ==
COL_MAX_VAL_MASK) ? 0 : (((addrmap[3] >> 16) &
COL_MAX_VAL_MASK) + COL_B8_BASE);
priv->col_shift[9] = (((addrmap[3] >> 24) & COL_MAX_VAL_MASK) ==
COL_MAX_VAL_MASK) ? 0 : (((addrmap[3] >> 24) &
COL_MAX_VAL_MASK) + COL_B9_BASE);
if (width == DDRCTL_EWDTH_64) {
if (memtype & MEM_TYPE_LPDDR3) {
priv->col_shift[10] = ((addrmap[4] &
COL_MAX_VAL_MASK) == COL_MAX_VAL_MASK) ? 0 :
((addrmap[4] & COL_MAX_VAL_MASK) +
COL_B10_BASE);
priv->col_shift[11] = (((addrmap[4] >> 8) &
COL_MAX_VAL_MASK) == COL_MAX_VAL_MASK) ? 0 :
(((addrmap[4] >> 8) & COL_MAX_VAL_MASK) +
COL_B11_BASE);
} else {
priv->col_shift[11] = ((addrmap[4] &
COL_MAX_VAL_MASK) == COL_MAX_VAL_MASK) ? 0 :
((addrmap[4] & COL_MAX_VAL_MASK) +
COL_B10_BASE);
priv->col_shift[13] = (((addrmap[4] >> 8) &
COL_MAX_VAL_MASK) == COL_MAX_VAL_MASK) ? 0 :
(((addrmap[4] >> 8) & COL_MAX_VAL_MASK) +
COL_B11_BASE);
}
} else if (width == DDRCTL_EWDTH_32) {
if (memtype & MEM_TYPE_LPDDR3) {
priv->col_shift[10] = (((addrmap[3] >> 24) &
COL_MAX_VAL_MASK) == COL_MAX_VAL_MASK) ? 0 :
(((addrmap[3] >> 24) & COL_MAX_VAL_MASK) +
COL_B9_BASE);
priv->col_shift[11] = ((addrmap[4] &
COL_MAX_VAL_MASK) == COL_MAX_VAL_MASK) ? 0 :
((addrmap[4] & COL_MAX_VAL_MASK) +
COL_B10_BASE);
} else {
priv->col_shift[11] = (((addrmap[3] >> 24) &
COL_MAX_VAL_MASK) == COL_MAX_VAL_MASK) ? 0 :
(((addrmap[3] >> 24) & COL_MAX_VAL_MASK) +
COL_B9_BASE);
priv->col_shift[13] = ((addrmap[4] &
COL_MAX_VAL_MASK) == COL_MAX_VAL_MASK) ? 0 :
((addrmap[4] & COL_MAX_VAL_MASK) +
COL_B10_BASE);
}
} else {
if (memtype & MEM_TYPE_LPDDR3) {
priv->col_shift[10] = (((addrmap[3] >> 16) &
COL_MAX_VAL_MASK) == COL_MAX_VAL_MASK) ? 0 :
(((addrmap[3] >> 16) & COL_MAX_VAL_MASK) +
COL_B8_BASE);
priv->col_shift[11] = (((addrmap[3] >> 24) &
COL_MAX_VAL_MASK) == COL_MAX_VAL_MASK) ? 0 :
(((addrmap[3] >> 24) & COL_MAX_VAL_MASK) +
COL_B9_BASE);
priv->col_shift[13] = ((addrmap[4] &
COL_MAX_VAL_MASK) == COL_MAX_VAL_MASK) ? 0 :
((addrmap[4] & COL_MAX_VAL_MASK) +
COL_B10_BASE);
} else {
priv->col_shift[11] = (((addrmap[3] >> 16) &
COL_MAX_VAL_MASK) == COL_MAX_VAL_MASK) ? 0 :
(((addrmap[3] >> 16) & COL_MAX_VAL_MASK) +
COL_B8_BASE);
priv->col_shift[13] = (((addrmap[3] >> 24) &
COL_MAX_VAL_MASK) == COL_MAX_VAL_MASK) ? 0 :
(((addrmap[3] >> 24) & COL_MAX_VAL_MASK) +
COL_B9_BASE);
}
}
if (width) {
for (index = 9; index > width; index--) {
priv->col_shift[index] = priv->col_shift[index - width];
priv->col_shift[index - width] = 0;
}
}
}