summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a
diff options
context:
space:
mode:
authorDeepak Nibade <dnibade@nvidia.com>2018-04-13 03:48:28 -0400
committermobile promotions <svcmobile_promotions@nvidia.com>2018-04-16 01:53:29 -0400
commita0dfb2b91112a766fb4b3e2aaafa99167151c3da (patch)
tree03c40e6c819227860204ccd8ec8b629727ac315c /drivers/gpu/nvgpu/gk20a
parentb64dfdcf9edfd50a8e10aed8a8c96f85c25d59d9 (diff)
gpu: nvgpu: gv100: consider floorswept FBPA for getting unicast list
In gr_gv11b/gk20a_create_priv_addr_table() we do not consider floorswept FBPAs and just calculate the unicast list assuming all FBPAs are present This generates incorrect list of unicast addresses Fix this introducing new HAL ops.gr.split_fbpa_broadcast_addr Set gr_gv100_get_active_fpba_mask() for GV100 Set gr_gk20a_split_fbpa_broadcast_addr() for rest of the chips gr_gv100_get_active_fpba_mask() will first get active FPBA mask and generate unicast list only for active FBPAs Bug 200398811 Jira NVGPU-556 Change-Id: Idd11d6e7ad7b6836525fe41509aeccf52038321f Signed-off-by: Deepak Nibade <dnibade@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/1694444 GVS: Gerrit_Virtual_Submit Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com> Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a')
-rw-r--r--drivers/gpu/nvgpu/gk20a/gk20a.h4
-rw-r--r--drivers/gpu/nvgpu/gk20a/gr_gk20a.c20
-rw-r--r--drivers/gpu/nvgpu/gk20a/gr_gk20a.h3
3 files changed, 21 insertions, 6 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.h b/drivers/gpu/nvgpu/gk20a/gk20a.h
index 2d1eb388..c55ba146 100644
--- a/drivers/gpu/nvgpu/gk20a/gk20a.h
+++ b/drivers/gpu/nvgpu/gk20a/gk20a.h
@@ -472,6 +472,10 @@ struct gpu_ops {
472 u32 *priv_addr_table, 472 u32 *priv_addr_table,
473 u32 *num_registers); 473 u32 *num_registers);
474 u32 (*get_pmm_per_chiplet_offset)(void); 474 u32 (*get_pmm_per_chiplet_offset)(void);
475 void (*split_fbpa_broadcast_addr)(struct gk20a *g, u32 addr,
476 u32 num_fbpas,
477 u32 *priv_addr_table,
478 u32 *priv_addr_table_index);
475 } gr; 479 } gr;
476 struct { 480 struct {
477 void (*init_hw)(struct gk20a *g); 481 void (*init_hw)(struct gk20a *g);
diff --git a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
index 96bc72af..121f264a 100644
--- a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
@@ -6323,6 +6323,17 @@ int gr_gk20a_decode_priv_addr(struct gk20a *g, u32 addr,
6323 return -EINVAL; 6323 return -EINVAL;
6324} 6324}
6325 6325
6326void gr_gk20a_split_fbpa_broadcast_addr(struct gk20a *g, u32 addr,
6327 u32 num_fbpas,
6328 u32 *priv_addr_table, u32 *t)
6329{
6330 u32 fbpa_id;
6331
6332 for (fbpa_id = 0; fbpa_id < num_fbpas; fbpa_id++)
6333 priv_addr_table[(*t)++] = pri_fbpa_addr(g,
6334 pri_fbpa_addr_mask(g, addr), fbpa_id);
6335}
6336
6326int gr_gk20a_split_ppc_broadcast_addr(struct gk20a *g, u32 addr, 6337int gr_gk20a_split_ppc_broadcast_addr(struct gk20a *g, u32 addr,
6327 u32 gpc_num, 6338 u32 gpc_num,
6328 u32 *priv_addr_table, u32 *t) 6339 u32 *priv_addr_table, u32 *t)
@@ -6356,7 +6367,6 @@ int gr_gk20a_create_priv_addr_table(struct gk20a *g,
6356 u32 broadcast_flags; 6367 u32 broadcast_flags;
6357 u32 t; 6368 u32 t;
6358 int err; 6369 int err;
6359 int fbpa_num;
6360 6370
6361 t = 0; 6371 t = 0;
6362 *num_registers = 0; 6372 *num_registers = 0;
@@ -6430,11 +6440,9 @@ int gr_gk20a_create_priv_addr_table(struct gk20a *g,
6430 g->ops.gr.split_ltc_broadcast_addr(g, addr, 6440 g->ops.gr.split_ltc_broadcast_addr(g, addr,
6431 priv_addr_table, &t); 6441 priv_addr_table, &t);
6432 } else if (broadcast_flags & PRI_BROADCAST_FLAGS_FBPA) { 6442 } else if (broadcast_flags & PRI_BROADCAST_FLAGS_FBPA) {
6433 for (fbpa_num = 0; 6443 g->ops.gr.split_fbpa_broadcast_addr(g, addr,
6434 fbpa_num < nvgpu_get_litter_value(g, GPU_LIT_NUM_FBPAS); 6444 nvgpu_get_litter_value(g, GPU_LIT_NUM_FBPAS),
6435 fbpa_num++) 6445 priv_addr_table, &t);
6436 priv_addr_table[t++] = pri_fbpa_addr(g,
6437 pri_fbpa_addr_mask(g, addr), fbpa_num);
6438 } else if (!(broadcast_flags & PRI_BROADCAST_FLAGS_GPC)) { 6446 } else if (!(broadcast_flags & PRI_BROADCAST_FLAGS_GPC)) {
6439 if (broadcast_flags & PRI_BROADCAST_FLAGS_TPC) 6447 if (broadcast_flags & PRI_BROADCAST_FLAGS_TPC)
6440 for (tpc_num = 0; 6448 for (tpc_num = 0;
diff --git a/drivers/gpu/nvgpu/gk20a/gr_gk20a.h b/drivers/gpu/nvgpu/gk20a/gr_gk20a.h
index cd58cfa3..02f5e534 100644
--- a/drivers/gpu/nvgpu/gk20a/gr_gk20a.h
+++ b/drivers/gpu/nvgpu/gk20a/gr_gk20a.h
@@ -832,4 +832,7 @@ int gr_gk20a_create_priv_addr_table(struct gk20a *g,
832 u32 addr, 832 u32 addr,
833 u32 *priv_addr_table, 833 u32 *priv_addr_table,
834 u32 *num_registers); 834 u32 *num_registers);
835void gr_gk20a_split_fbpa_broadcast_addr(struct gk20a *g, u32 addr,
836 u32 num_fbpas,
837 u32 *priv_addr_table, u32 *t);
835#endif /*__GR_GK20A_H__*/ 838#endif /*__GR_GK20A_H__*/