staticint get_intlv_mode(struct addr_ctx *ctx)
{ int ret;
switch (df_cfg.rev) { case DF2:
ret = df2_get_intlv_mode(ctx); break; case DF3:
ret = df3_get_intlv_mode(ctx); break; case DF3p5:
ret = df3p5_get_intlv_mode(ctx); break; case DF4:
ret = df4_get_intlv_mode(ctx); break; case DF4p5:
ret = df4p5_get_intlv_mode(ctx); break; default:
ret = -EINVAL;
}
if (find_normalized_offset(ctx, &norm_offset)) return -EINVAL;
if (get_dram_addr_map(ctx)) return -EINVAL;
if (!valid_map(ctx)) return -EINVAL;
ctx->ret_addr -= norm_offset;
return0;
}
static u8 get_num_intlv_chan(struct addr_ctx *ctx)
{ switch (ctx->map.intlv_mode) { case NONE: return1; case NOHASH_2CHAN: case DF2_2CHAN_HASH: case DF3_COD4_2CHAN_HASH: case DF4_NPS4_2CHAN_HASH: case DF4p5_NPS4_2CHAN_1K_HASH: case DF4p5_NPS4_2CHAN_2K_HASH: return2; case DF4_NPS4_3CHAN_HASH: case DF4p5_NPS4_3CHAN_1K_HASH: case DF4p5_NPS4_3CHAN_2K_HASH: return3; case NOHASH_4CHAN: case DF3_COD2_4CHAN_HASH: case DF4_NPS2_4CHAN_HASH: case DF4p5_NPS2_4CHAN_1K_HASH: case DF4p5_NPS2_4CHAN_2K_HASH: return4; case DF4_NPS2_5CHAN_HASH: case DF4p5_NPS2_5CHAN_1K_HASH: case DF4p5_NPS2_5CHAN_2K_HASH: return5; case DF3_6CHAN: case DF4_NPS2_6CHAN_HASH: case DF4p5_NPS2_6CHAN_1K_HASH: case DF4p5_NPS2_6CHAN_2K_HASH: return6; case NOHASH_8CHAN: case DF3_COD1_8CHAN_HASH: case DF4_NPS1_8CHAN_HASH: case MI3_HASH_8CHAN: case DF4p5_NPS1_8CHAN_1K_HASH: case DF4p5_NPS1_8CHAN_2K_HASH: return8; case DF4_NPS1_10CHAN_HASH: case DF4p5_NPS1_10CHAN_1K_HASH: case DF4p5_NPS1_10CHAN_2K_HASH: return10; case DF4_NPS1_12CHAN_HASH: case DF4p5_NPS1_12CHAN_1K_HASH: case DF4p5_NPS1_12CHAN_2K_HASH: return12; case NOHASH_16CHAN: case MI3_HASH_16CHAN: case DF4p5_NPS1_16CHAN_1K_HASH: case DF4p5_NPS1_16CHAN_2K_HASH: return16; case DF4p5_NPS0_24CHAN_1K_HASH: case DF4p5_NPS0_24CHAN_2K_HASH: return24; case NOHASH_32CHAN: case MI3_HASH_32CHAN: return32; default:
atl_debug_on_bad_intlv_mode(ctx); return0;
}
}
switch (df_cfg.rev) { case DF2:
addr_sel = FIELD_GET(DF2_INTLV_ADDR_SEL, ctx->map.base); break; case DF3: case DF3p5:
addr_sel = FIELD_GET(DF3_INTLV_ADDR_SEL, ctx->map.base); break; case DF4: case DF4p5:
addr_sel = FIELD_GET(DF4_INTLV_ADDR_SEL, ctx->map.intlv); break; default:
atl_debug_on_bad_df_rev(); break;
}
/* Add '8' to get the 'interleave bit position'. */ return addr_sel + 8;
}
static u8 get_num_intlv_dies(struct addr_ctx *ctx)
{
u8 dies = 0;
switch (df_cfg.rev) { case DF2:
dies = FIELD_GET(DF2_INTLV_NUM_DIES, ctx->map.limit); break; case DF3:
dies = FIELD_GET(DF3_INTLV_NUM_DIES, ctx->map.base); break; case DF3p5:
dies = FIELD_GET(DF3p5_INTLV_NUM_DIES, ctx->map.base); break; case DF4: case DF4p5:
dies = FIELD_GET(DF4_INTLV_NUM_DIES, ctx->map.intlv); break; default:
atl_debug_on_bad_df_rev(); break;
}
/* Register value is log2, e.g. 0 -> 1 die, 1 -> 2 dies, etc. */ return1 << dies;
}
if (ctx->map.num_intlv_dies > num_intlv_dies) {
pr_debug("Invalid number of interleave dies: %u", ctx->map.num_intlv_dies); returnfalse;
}
if (ctx->map.num_intlv_sockets > num_intlv_sockets) {
pr_debug("Invalid number of interleave sockets: %u", ctx->map.num_intlv_sockets); returnfalse;
}
returntrue;
}
staticint validate_address_map(struct addr_ctx *ctx)
{ switch (ctx->map.intlv_mode) { case DF2_2CHAN_HASH: case DF3_COD4_2CHAN_HASH: case DF3_COD2_4CHAN_HASH: case DF3_COD1_8CHAN_HASH: if (!map_bits_valid(ctx, 8, 9, 1, 1)) goto err; break;
case DF4_NPS4_2CHAN_HASH: case DF4_NPS2_4CHAN_HASH: case DF4_NPS1_8CHAN_HASH: case DF4p5_NPS4_2CHAN_1K_HASH: case DF4p5_NPS4_2CHAN_2K_HASH: case DF4p5_NPS2_4CHAN_1K_HASH: case DF4p5_NPS2_4CHAN_2K_HASH: case DF4p5_NPS1_8CHAN_1K_HASH: case DF4p5_NPS1_8CHAN_2K_HASH: case DF4p5_NPS1_16CHAN_1K_HASH: case DF4p5_NPS1_16CHAN_2K_HASH: if (!map_bits_valid(ctx, 8, 8, 1, 2)) goto err; break;
case DF4p5_NPS4_3CHAN_1K_HASH: case DF4p5_NPS4_3CHAN_2K_HASH: case DF4p5_NPS2_5CHAN_1K_HASH: case DF4p5_NPS2_5CHAN_2K_HASH: case DF4p5_NPS2_6CHAN_1K_HASH: case DF4p5_NPS2_6CHAN_2K_HASH: case DF4p5_NPS1_10CHAN_1K_HASH: case DF4p5_NPS1_10CHAN_2K_HASH: case DF4p5_NPS1_12CHAN_1K_HASH: case DF4p5_NPS1_12CHAN_2K_HASH: if (ctx->map.num_intlv_sockets != 1 || !map_bits_valid(ctx, 8, 0, 1, 1)) goto err; break;
case DF4p5_NPS0_24CHAN_1K_HASH: case DF4p5_NPS0_24CHAN_2K_HASH: if (ctx->map.num_intlv_sockets < 2 || !map_bits_valid(ctx, 8, 0, 1, 2)) goto err; break;
case MI3_HASH_8CHAN: case MI3_HASH_16CHAN: case MI3_HASH_32CHAN: if (!map_bits_valid(ctx, 8, 8, 4, 1)) goto err; break;
/* Nothing to do for modes that don't need special validation checks. */ default: break;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.