Lines Matching refs:ctx

15 static int df2_get_intlv_mode(struct addr_ctx *ctx)  in df2_get_intlv_mode()  argument
17 ctx->map.intlv_mode = FIELD_GET(DF2_INTLV_NUM_CHAN, ctx->map.base); in df2_get_intlv_mode()
19 if (ctx->map.intlv_mode == 8) in df2_get_intlv_mode()
20 ctx->map.intlv_mode = DF2_2CHAN_HASH; in df2_get_intlv_mode()
22 if (ctx->map.intlv_mode != NONE && in df2_get_intlv_mode()
23 ctx->map.intlv_mode != NOHASH_2CHAN && in df2_get_intlv_mode()
24 ctx->map.intlv_mode != DF2_2CHAN_HASH) in df2_get_intlv_mode()
30 static int df3_get_intlv_mode(struct addr_ctx *ctx) in df3_get_intlv_mode() argument
32 ctx->map.intlv_mode = FIELD_GET(DF3_INTLV_NUM_CHAN, ctx->map.base); in df3_get_intlv_mode()
36 static int df3p5_get_intlv_mode(struct addr_ctx *ctx) in df3p5_get_intlv_mode() argument
38 ctx->map.intlv_mode = FIELD_GET(DF3p5_INTLV_NUM_CHAN, ctx->map.base); in df3p5_get_intlv_mode()
40 if (ctx->map.intlv_mode == DF3_6CHAN) in df3p5_get_intlv_mode()
46 static int df4_get_intlv_mode(struct addr_ctx *ctx) in df4_get_intlv_mode() argument
48 ctx->map.intlv_mode = FIELD_GET(DF4_INTLV_NUM_CHAN, ctx->map.intlv); in df4_get_intlv_mode()
50 if (ctx->map.intlv_mode == DF3_COD4_2CHAN_HASH || in df4_get_intlv_mode()
51 ctx->map.intlv_mode == DF3_COD2_4CHAN_HASH || in df4_get_intlv_mode()
52 ctx->map.intlv_mode == DF3_COD1_8CHAN_HASH || in df4_get_intlv_mode()
53 ctx->map.intlv_mode == DF3_6CHAN) in df4_get_intlv_mode()
59 static int df4p5_get_intlv_mode(struct addr_ctx *ctx) in df4p5_get_intlv_mode() argument
61 ctx->map.intlv_mode = FIELD_GET(DF4p5_INTLV_NUM_CHAN, ctx->map.intlv); in df4p5_get_intlv_mode()
63 if (ctx->map.intlv_mode <= NOHASH_32CHAN) in df4p5_get_intlv_mode()
66 if (ctx->map.intlv_mode >= MI3_HASH_8CHAN && in df4p5_get_intlv_mode()
67 ctx->map.intlv_mode <= MI3_HASH_32CHAN) in df4p5_get_intlv_mode()
75 ctx->map.intlv_mode += 0x20; in df4p5_get_intlv_mode()
80 static int get_intlv_mode(struct addr_ctx *ctx) in get_intlv_mode() argument
86 ret = df2_get_intlv_mode(ctx); in get_intlv_mode()
89 ret = df3_get_intlv_mode(ctx); in get_intlv_mode()
92 ret = df3p5_get_intlv_mode(ctx); in get_intlv_mode()
95 ret = df4_get_intlv_mode(ctx); in get_intlv_mode()
98 ret = df4p5_get_intlv_mode(ctx); in get_intlv_mode()
143 static int get_dram_offset(struct addr_ctx *ctx, u64 *norm_offset) in get_dram_offset() argument
149 if (!ctx->map.num) { in get_dram_offset()
150 atl_debug(ctx, "Trying to find DRAM offset for map 0"); in get_dram_offset()
159 map_num = ctx->map.num - 1; in get_dram_offset()
163 if (df_indirect_read_instance(ctx->node_id, 7, 0x140 + (4 * map_num), in get_dram_offset()
164 ctx->inst_id, &reg_dram_offset)) in get_dram_offset()
169 if (df_indirect_read_instance(ctx->node_id, 0, 0x1B4 + (4 * map_num), in get_dram_offset()
170 ctx->inst_id, &reg_dram_offset)) in get_dram_offset()
182 static int df3_6ch_get_dram_addr_map(struct addr_ctx *ctx) in df3_6ch_get_dram_addr_map() argument
184 u16 dst_fabric_id = FIELD_GET(DF3_DST_FABRIC_ID, ctx->map.limit); in df3_6ch_get_dram_addr_map()
194 if (df_indirect_read_broadcast(ctx->node_id, 0, offset, &reg)) in df3_6ch_get_dram_addr_map()
199 ctx->map.remap_array[i] = (reg >> (j * shift)) & mask; in df3_6ch_get_dram_addr_map()
208 ctx->map.np2_bits = FIELD_GET(DF_LOG2_ADDR_64K_SPACE0, reg); in df3_6ch_get_dram_addr_map()
212 static int df2_get_dram_addr_map(struct addr_ctx *ctx) in df2_get_dram_addr_map() argument
215 if (df_indirect_read_instance(ctx->node_id, 0, 0x110 + (8 * ctx->map.num), in df2_get_dram_addr_map()
216 ctx->inst_id, &ctx->map.base)) in df2_get_dram_addr_map()
220 if (df_indirect_read_instance(ctx->node_id, 0, 0x114 + (8 * ctx->map.num), in df2_get_dram_addr_map()
221 ctx->inst_id, &ctx->map.limit)) in df2_get_dram_addr_map()
227 static int df3_get_dram_addr_map(struct addr_ctx *ctx) in df3_get_dram_addr_map() argument
229 if (df2_get_dram_addr_map(ctx)) in df3_get_dram_addr_map()
233 if (df_indirect_read_instance(ctx->node_id, 0, 0x3F8, in df3_get_dram_addr_map()
234 ctx->inst_id, &ctx->map.ctl)) in df3_get_dram_addr_map()
240 static int df4_get_dram_addr_map(struct addr_ctx *ctx) in df4_get_dram_addr_map() argument
246 if (df_indirect_read_instance(ctx->node_id, 7, 0xE00 + (16 * ctx->map.num), in df4_get_dram_addr_map()
247 ctx->inst_id, &ctx->map.base)) in df4_get_dram_addr_map()
251 if (df_indirect_read_instance(ctx->node_id, 7, 0xE04 + (16 * ctx->map.num), in df4_get_dram_addr_map()
252 ctx->inst_id, &ctx->map.limit)) in df4_get_dram_addr_map()
256 if (df_indirect_read_instance(ctx->node_id, 7, 0xE08 + (16 * ctx->map.num), in df4_get_dram_addr_map()
257 ctx->inst_id, &ctx->map.ctl)) in df4_get_dram_addr_map()
261 if (df_indirect_read_instance(ctx->node_id, 7, 0xE0C + (16 * ctx->map.num), in df4_get_dram_addr_map()
262 ctx->inst_id, &ctx->map.intlv)) in df4_get_dram_addr_map()
266 if (!FIELD_GET(DF4_REMAP_EN, ctx->map.ctl)) in df4_get_dram_addr_map()
270 memset(&ctx->map.remap_array, 0xFF, sizeof(ctx->map.remap_array)); in df4_get_dram_addr_map()
273 remap_sel = FIELD_GET(DF4_REMAP_SEL, ctx->map.ctl); in df4_get_dram_addr_map()
276 if (df_indirect_read_instance(ctx->node_id, 7, 0x180 + (8 * remap_sel), in df4_get_dram_addr_map()
277 ctx->inst_id, &remap_reg)) in df4_get_dram_addr_map()
282 ctx->map.remap_array[i] = (remap_reg >> (j * shift)) & mask; in df4_get_dram_addr_map()
285 if (df_indirect_read_instance(ctx->node_id, 7, 0x184 + (8 * remap_sel), in df4_get_dram_addr_map()
286 ctx->inst_id, &remap_reg)) in df4_get_dram_addr_map()
291 ctx->map.remap_array[i] = (remap_reg >> (j * shift)) & mask; in df4_get_dram_addr_map()
296 static int df4p5_get_dram_addr_map(struct addr_ctx *ctx) in df4p5_get_dram_addr_map() argument
302 if (df_indirect_read_instance(ctx->node_id, 7, 0x200 + (16 * ctx->map.num), in df4p5_get_dram_addr_map()
303 ctx->inst_id, &ctx->map.base)) in df4p5_get_dram_addr_map()
307 if (df_indirect_read_instance(ctx->node_id, 7, 0x204 + (16 * ctx->map.num), in df4p5_get_dram_addr_map()
308 ctx->inst_id, &ctx->map.limit)) in df4p5_get_dram_addr_map()
312 if (df_indirect_read_instance(ctx->node_id, 7, 0x208 + (16 * ctx->map.num), in df4p5_get_dram_addr_map()
313 ctx->inst_id, &ctx->map.ctl)) in df4p5_get_dram_addr_map()
317 if (df_indirect_read_instance(ctx->node_id, 7, 0x20C + (16 * ctx->map.num), in df4p5_get_dram_addr_map()
318 ctx->inst_id, &ctx->map.intlv)) in df4p5_get_dram_addr_map()
322 if (!FIELD_GET(DF4_REMAP_EN, ctx->map.ctl)) in df4p5_get_dram_addr_map()
326 memset(&ctx->map.remap_array, 0xFF, sizeof(ctx->map.remap_array)); in df4p5_get_dram_addr_map()
329 remap_sel = FIELD_GET(DF4p5_REMAP_SEL, ctx->map.ctl); in df4p5_get_dram_addr_map()
332 if (df_indirect_read_instance(ctx->node_id, 7, 0x180 + (24 * remap_sel), in df4p5_get_dram_addr_map()
333 ctx->inst_id, &remap_reg)) in df4p5_get_dram_addr_map()
338 ctx->map.remap_array[i] = (remap_reg >> (j * shift)) & mask; in df4p5_get_dram_addr_map()
341 if (df_indirect_read_instance(ctx->node_id, 7, 0x184 + (24 * remap_sel), in df4p5_get_dram_addr_map()
342 ctx->inst_id, &remap_reg)) in df4p5_get_dram_addr_map()
347 ctx->map.remap_array[i] = (remap_reg >> (j * shift)) & mask; in df4p5_get_dram_addr_map()
350 if (df_indirect_read_instance(ctx->node_id, 7, 0x188 + (24 * remap_sel), in df4p5_get_dram_addr_map()
351 ctx->inst_id, &remap_reg)) in df4p5_get_dram_addr_map()
356 ctx->map.remap_array[i] = (remap_reg >> (j * shift)) & mask; in df4p5_get_dram_addr_map()
361 static int get_dram_addr_map(struct addr_ctx *ctx) in get_dram_addr_map() argument
364 case DF2: return df2_get_dram_addr_map(ctx); in get_dram_addr_map()
366 case DF3p5: return df3_get_dram_addr_map(ctx); in get_dram_addr_map()
367 case DF4: return df4_get_dram_addr_map(ctx); in get_dram_addr_map()
368 case DF4p5: return df4p5_get_dram_addr_map(ctx); in get_dram_addr_map()
375 static int get_coh_st_fabric_id(struct addr_ctx *ctx) in get_coh_st_fabric_id() argument
387 if (df_indirect_read_instance(ctx->node_id, 0, 0x50, ctx->inst_id, &reg)) in get_coh_st_fabric_id()
391 ctx->coh_st_fabric_id = FIELD_GET(DF2_COH_ST_FABRIC_ID, reg); in get_coh_st_fabric_id()
393 ctx->coh_st_fabric_id = FIELD_GET(DF4p5_COH_ST_FABRIC_ID, reg); in get_coh_st_fabric_id()
398 static int find_normalized_offset(struct addr_ctx *ctx, u64 *norm_offset) in find_normalized_offset() argument
403 for (ctx->map.num = 1; ctx->map.num < df_cfg.num_coh_st_maps; ctx->map.num++) { in find_normalized_offset()
404 ret = get_dram_offset(ctx, norm_offset); in find_normalized_offset()
414 atl_debug(ctx, "Enabled map %u offset is 0", ctx->map.num); in find_normalized_offset()
420 atl_debug(ctx, "Map %u offset (0x%016llx) <= previous (0x%016llx)", in find_normalized_offset()
421 ctx->map.num, *norm_offset, last_offset); in find_normalized_offset()
426 if (ctx->ret_addr >= *norm_offset) in find_normalized_offset()
436 if (ctx->map.num >= df_cfg.num_coh_st_maps) { in find_normalized_offset()
437 ctx->map.num = 0; in find_normalized_offset()
444 static bool valid_map(struct addr_ctx *ctx) in valid_map() argument
447 return FIELD_GET(DF_ADDR_RANGE_VAL, ctx->map.ctl); in valid_map()
449 return FIELD_GET(DF_ADDR_RANGE_VAL, ctx->map.base); in valid_map()
452 static int get_address_map_common(struct addr_ctx *ctx) in get_address_map_common() argument
456 if (get_coh_st_fabric_id(ctx)) in get_address_map_common()
459 if (find_normalized_offset(ctx, &norm_offset)) in get_address_map_common()
462 if (get_dram_addr_map(ctx)) in get_address_map_common()
465 if (!valid_map(ctx)) in get_address_map_common()
468 ctx->ret_addr -= norm_offset; in get_address_map_common()
473 static u8 get_num_intlv_chan(struct addr_ctx *ctx) in get_num_intlv_chan() argument
475 switch (ctx->map.intlv_mode) { in get_num_intlv_chan()
531 atl_debug_on_bad_intlv_mode(ctx); in get_num_intlv_chan()
536 static void calculate_intlv_bits(struct addr_ctx *ctx) in calculate_intlv_bits() argument
538 ctx->map.num_intlv_chan = get_num_intlv_chan(ctx); in calculate_intlv_bits()
540 ctx->map.total_intlv_chan = ctx->map.num_intlv_chan; in calculate_intlv_bits()
541 ctx->map.total_intlv_chan *= ctx->map.num_intlv_dies; in calculate_intlv_bits()
542 ctx->map.total_intlv_chan *= ctx->map.num_intlv_sockets; in calculate_intlv_bits()
548 ctx->map.total_intlv_bits = order_base_2(ctx->map.total_intlv_chan); in calculate_intlv_bits()
551 static u8 get_intlv_bit_pos(struct addr_ctx *ctx) in get_intlv_bit_pos() argument
557 addr_sel = FIELD_GET(DF2_INTLV_ADDR_SEL, ctx->map.base); in get_intlv_bit_pos()
561 addr_sel = FIELD_GET(DF3_INTLV_ADDR_SEL, ctx->map.base); in get_intlv_bit_pos()
565 addr_sel = FIELD_GET(DF4_INTLV_ADDR_SEL, ctx->map.intlv); in get_intlv_bit_pos()
576 static u8 get_num_intlv_dies(struct addr_ctx *ctx) in get_num_intlv_dies() argument
582 dies = FIELD_GET(DF2_INTLV_NUM_DIES, ctx->map.limit); in get_num_intlv_dies()
585 dies = FIELD_GET(DF3_INTLV_NUM_DIES, ctx->map.base); in get_num_intlv_dies()
588 dies = FIELD_GET(DF3p5_INTLV_NUM_DIES, ctx->map.base); in get_num_intlv_dies()
592 dies = FIELD_GET(DF4_INTLV_NUM_DIES, ctx->map.intlv); in get_num_intlv_dies()
603 static u8 get_num_intlv_sockets(struct addr_ctx *ctx) in get_num_intlv_sockets() argument
609 sockets = FIELD_GET(DF2_INTLV_NUM_SOCKETS, ctx->map.limit); in get_num_intlv_sockets()
613 sockets = FIELD_GET(DF2_INTLV_NUM_SOCKETS, ctx->map.base); in get_num_intlv_sockets()
617 sockets = FIELD_GET(DF4_INTLV_NUM_SOCKETS, ctx->map.intlv); in get_num_intlv_sockets()
628 static int get_global_map_data(struct addr_ctx *ctx) in get_global_map_data() argument
630 if (get_intlv_mode(ctx)) in get_global_map_data()
633 if (ctx->map.intlv_mode == DF3_6CHAN && in get_global_map_data()
634 df3_6ch_get_dram_addr_map(ctx)) in get_global_map_data()
637 ctx->map.intlv_bit_pos = get_intlv_bit_pos(ctx); in get_global_map_data()
638 ctx->map.num_intlv_dies = get_num_intlv_dies(ctx); in get_global_map_data()
639 ctx->map.num_intlv_sockets = get_num_intlv_sockets(ctx); in get_global_map_data()
640 calculate_intlv_bits(ctx); in get_global_map_data()
652 static inline bool map_bits_valid(struct addr_ctx *ctx, u8 bit1, u8 bit2, in map_bits_valid() argument
655 if (!(ctx->map.intlv_bit_pos == bit1 || ctx->map.intlv_bit_pos == bit2)) { in map_bits_valid()
656 pr_debug("Invalid interleave bit: %u", ctx->map.intlv_bit_pos); in map_bits_valid()
660 if (ctx->map.num_intlv_dies > num_intlv_dies) { in map_bits_valid()
661 pr_debug("Invalid number of interleave dies: %u", ctx->map.num_intlv_dies); in map_bits_valid()
665 if (ctx->map.num_intlv_sockets > num_intlv_sockets) { in map_bits_valid()
666 pr_debug("Invalid number of interleave sockets: %u", ctx->map.num_intlv_sockets); in map_bits_valid()
673 static int validate_address_map(struct addr_ctx *ctx) in validate_address_map() argument
675 switch (ctx->map.intlv_mode) { in validate_address_map()
680 if (!map_bits_valid(ctx, 8, 9, 1, 1)) in validate_address_map()
695 if (!map_bits_valid(ctx, 8, 8, 1, 2)) in validate_address_map()
709 if (ctx->map.num_intlv_sockets != 1 || !map_bits_valid(ctx, 8, 0, 1, 1)) in validate_address_map()
715 if (ctx->map.num_intlv_sockets < 2 || !map_bits_valid(ctx, 8, 0, 1, 2)) in validate_address_map()
722 if (!map_bits_valid(ctx, 8, 8, 4, 1)) in validate_address_map()
734 atl_debug(ctx, "Inconsistent address map"); in validate_address_map()
760 int get_address_map(struct addr_ctx *ctx) in get_address_map() argument
764 ret = get_address_map_common(ctx); in get_address_map()
768 ret = get_global_map_data(ctx); in get_address_map()
772 dump_address_map(&ctx->map); in get_address_map()
774 ret = validate_address_map(ctx); in get_address_map()