summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gv11b/gr_gv11b.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/nvgpu/gv11b/gr_gv11b.c')
-rw-r--r--drivers/gpu/nvgpu/gv11b/gr_gv11b.c111
1 files changed, 111 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/gv11b/gr_gv11b.c b/drivers/gpu/nvgpu/gv11b/gr_gv11b.c
index c43c6e83..61649d06 100644
--- a/drivers/gpu/nvgpu/gv11b/gr_gv11b.c
+++ b/drivers/gpu/nvgpu/gv11b/gr_gv11b.c
@@ -46,6 +46,7 @@
46#include "gv11b/mm_gv11b.h" 46#include "gv11b/mm_gv11b.h"
47#include "gv11b/subctx_gv11b.h" 47#include "gv11b/subctx_gv11b.h"
48#include "gv11b/gv11b.h" 48#include "gv11b/gv11b.h"
49#include "gv11b/gr_pri_gv11b.h"
49 50
50#include <nvgpu/hw/gv11b/hw_gr_gv11b.h> 51#include <nvgpu/hw/gv11b/hw_gr_gv11b.h>
51#include <nvgpu/hw/gv11b/hw_fifo_gv11b.h> 52#include <nvgpu/hw/gv11b/hw_fifo_gv11b.h>
@@ -4400,3 +4401,113 @@ int gr_gv11b_handle_ssync_hww(struct gk20a *g)
4400 gr_ssync_hww_esr_reset_active_f()); 4401 gr_ssync_hww_esr_reset_active_f());
4401 return -EFAULT; 4402 return -EFAULT;
4402} 4403}
4404
4405/*
4406 * This function will decode a priv address and return the partition
4407 * type and numbers
4408 */
4409int gr_gv11b_decode_priv_addr(struct gk20a *g, u32 addr,
4410 int *addr_type, /* enum ctxsw_addr_type */
4411 u32 *gpc_num, u32 *tpc_num, u32 *ppc_num, u32 *be_num,
4412 u32 *broadcast_flags)
4413{
4414 u32 gpc_addr;
4415
4416 gk20a_dbg(gpu_dbg_fn | gpu_dbg_gpu_dbg, "addr=0x%x", addr);
4417
4418 /* setup defaults */
4419 *addr_type = CTXSW_ADDR_TYPE_SYS;
4420 *broadcast_flags = PRI_BROADCAST_FLAGS_NONE;
4421 *gpc_num = 0;
4422 *tpc_num = 0;
4423 *ppc_num = 0;
4424 *be_num = 0;
4425
4426 if (pri_is_gpc_addr(g, addr)) {
4427 *addr_type = CTXSW_ADDR_TYPE_GPC;
4428 gpc_addr = pri_gpccs_addr_mask(addr);
4429 if (pri_is_gpc_addr_shared(g, addr)) {
4430 *addr_type = CTXSW_ADDR_TYPE_GPC;
4431 *broadcast_flags |= PRI_BROADCAST_FLAGS_GPC;
4432 } else
4433 *gpc_num = pri_get_gpc_num(g, addr);
4434
4435 if (pri_is_ppc_addr(g, gpc_addr)) {
4436 *addr_type = CTXSW_ADDR_TYPE_PPC;
4437 if (pri_is_ppc_addr_shared(g, gpc_addr)) {
4438 *broadcast_flags |= PRI_BROADCAST_FLAGS_PPC;
4439 return 0;
4440 }
4441 }
4442 if (g->ops.gr.is_tpc_addr(g, gpc_addr)) {
4443 *addr_type = CTXSW_ADDR_TYPE_TPC;
4444 if (pri_is_tpc_addr_shared(g, gpc_addr)) {
4445 *broadcast_flags |= PRI_BROADCAST_FLAGS_TPC;
4446 return 0;
4447 }
4448 *tpc_num = g->ops.gr.get_tpc_num(g, gpc_addr);
4449 }
4450 return 0;
4451 } else if (pri_is_be_addr(g, addr)) {
4452 *addr_type = CTXSW_ADDR_TYPE_BE;
4453 if (pri_is_be_addr_shared(g, addr)) {
4454 *broadcast_flags |= PRI_BROADCAST_FLAGS_BE;
4455 return 0;
4456 }
4457 *be_num = pri_get_be_num(g, addr);
4458 return 0;
4459 } else if (pri_is_ltc_addr(addr)) {
4460 *addr_type = CTXSW_ADDR_TYPE_LTCS;
4461 if (g->ops.gr.is_ltcs_ltss_addr(g, addr))
4462 *broadcast_flags |= PRI_BROADCAST_FLAGS_LTCS;
4463 else if (g->ops.gr.is_ltcn_ltss_addr(g, addr))
4464 *broadcast_flags |= PRI_BROADCAST_FLAGS_LTSS;
4465 return 0;
4466 } else if (pri_is_fbpa_addr(g, addr)) {
4467 *addr_type = CTXSW_ADDR_TYPE_FBPA;
4468 if (pri_is_fbpa_addr_shared(g, addr)) {
4469 *broadcast_flags |= PRI_BROADCAST_FLAGS_FBPA;
4470 return 0;
4471 }
4472 return 0;
4473 } else if (g->ops.gr.is_egpc_addr && g->ops.gr.is_egpc_addr(g, addr)) {
4474 return g->ops.gr.decode_egpc_addr(g,
4475 addr, addr_type, gpc_num,
4476 tpc_num, broadcast_flags);
4477 } else if (PRI_PMMGS_BASE_ADDR_MASK(addr) ==
4478 NV_PERF_PMMGPC_GPCGS_GPCTPCA) {
4479 *broadcast_flags |= (PRI_BROADCAST_FLAGS_PMM_GPCGS_GPCTPCA |
4480 PRI_BROADCAST_FLAGS_PMMGPC);
4481 *addr_type = CTXSW_ADDR_TYPE_GPC;
4482 return 0;
4483 } else if (PRI_PMMGS_BASE_ADDR_MASK(addr) ==
4484 NV_PERF_PMMGPC_GPCGS_GPCTPCB) {
4485 *broadcast_flags |= (PRI_BROADCAST_FLAGS_PMM_GPCGS_GPCTPCB |
4486 PRI_BROADCAST_FLAGS_PMMGPC);
4487 *addr_type = CTXSW_ADDR_TYPE_GPC;
4488 return 0;
4489 } else if (PRI_PMMGS_BASE_ADDR_MASK(addr) == NV_PERF_PMMFBP_FBPGS_LTC) {
4490 *broadcast_flags |= (PRI_BROADCAST_FLAGS_PMM_FBPGS_LTC |
4491 PRI_BROADCAST_FLAGS_PMMFBP);
4492 *addr_type = CTXSW_ADDR_TYPE_LTCS;
4493 return 0;
4494 } else if (PRI_PMMGS_BASE_ADDR_MASK(addr) == NV_PERF_PMMFBP_FBPGS_ROP) {
4495 *broadcast_flags |= (PRI_BROADCAST_FLAGS_PMM_FBPGS_ROP |
4496 PRI_BROADCAST_FLAGS_PMMFBP);
4497 *addr_type = CTXSW_ADDR_TYPE_ROP;
4498 return 0;
4499 } else if (PRI_PMMS_BASE_ADDR_MASK(addr) == NV_PERF_PMMGPC_GPCS) {
4500 *broadcast_flags |= (PRI_BROADCAST_FLAGS_PMM_GPCS |
4501 PRI_BROADCAST_FLAGS_PMMGPC);
4502 *addr_type = CTXSW_ADDR_TYPE_GPC;
4503 return 0;
4504 } else if (PRI_PMMS_BASE_ADDR_MASK(addr) == NV_PERF_PMMFBP_FBPS) {
4505 *broadcast_flags |= (PRI_BROADCAST_FLAGS_PMM_FBPS |
4506 PRI_BROADCAST_FLAGS_PMMFBP);
4507 *addr_type = CTXSW_ADDR_TYPE_FBP;
4508 return 0;
4509 }
4510
4511 *addr_type = CTXSW_ADDR_TYPE_SYS;
4512 return 0;
4513}