diff --git a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c index e06d190e9..ceb606e4e 100644 --- a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c @@ -6353,6 +6353,7 @@ static int gr_gk20a_create_priv_addr_table(struct gk20a *g, { int addr_type; /*enum ctxsw_addr_type */ u32 gpc_num, tpc_num, ppc_num, be_num; + u32 priv_addr, gpc_addr; u32 broadcast_flags; u32 t; int err; @@ -6404,10 +6405,18 @@ static int gr_gk20a_create_priv_addr_table(struct gk20a *g, priv_addr_table, &t); if (err) return err; - } else - priv_addr_table[t++] = - pri_gpc_addr(g, pri_gpccs_addr_mask(addr), - gpc_num); + } else { + priv_addr = pri_gpc_addr(g, + pri_gpccs_addr_mask(addr), + gpc_num); + + gpc_addr = pri_gpccs_addr_mask(priv_addr); + tpc_num = g->ops.gr.get_tpc_num(g, gpc_addr); + if (tpc_num >= g->gr.gpc_tpc_count[gpc_num]) + continue; + + priv_addr_table[t++] = priv_addr; + } } } else if (((addr_type == CTXSW_ADDR_TYPE_EGPC) || (addr_type == CTXSW_ADDR_TYPE_ETPC)) && diff --git a/drivers/gpu/nvgpu/gv11b/gr_gv11b.c b/drivers/gpu/nvgpu/gv11b/gr_gv11b.c index e0c60efbd..7f6d19067 100644 --- a/drivers/gpu/nvgpu/gv11b/gr_gv11b.c +++ b/drivers/gpu/nvgpu/gv11b/gr_gv11b.c @@ -3979,6 +3979,7 @@ void gv11b_gr_egpc_etpc_priv_addr_table(struct gk20a *g, u32 addr, u32 gpc, u32 broadcast_flags, u32 *priv_addr_table, u32 *t) { u32 gpc_num, tpc_num; + u32 priv_addr, gpc_addr; nvgpu_log_info(g, "addr=0x%x", addr); @@ -4017,10 +4018,16 @@ void gv11b_gr_egpc_etpc_priv_addr_table(struct gk20a *g, u32 addr, g, gpc_num, tpc_num, addr, priv_addr_table, t); } else { - priv_addr_table[*t] = - pri_egpc_addr(g, - pri_gpccs_addr_mask(addr), - gpc_num); + priv_addr = pri_egpc_addr(g, + pri_gpccs_addr_mask(addr), + gpc_num); + + gpc_addr = pri_gpccs_addr_mask(priv_addr); + tpc_num = g->ops.gr.get_tpc_num(g, gpc_addr); + if (tpc_num >= g->gr.gpc_tpc_count[gpc_num]) + continue; + + priv_addr_table[*t] = priv_addr; nvgpu_log_info(g, "priv_addr_table[%d]:%#08x", *t, priv_addr_table[*t]); (*t)++;