diff options
Diffstat (limited to 'drivers/gpu/nvgpu/gv11b')
-rw-r--r-- | drivers/gpu/nvgpu/gv11b/gr_gv11b.c | 111 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gv11b/gr_gv11b.h | 4 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gv11b/gr_pri_gv11b.h | 50 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gv11b/hal_gv11b.c | 1 |
4 files changed, 166 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 | */ | ||
4409 | int 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 | } | ||
diff --git a/drivers/gpu/nvgpu/gv11b/gr_gv11b.h b/drivers/gpu/nvgpu/gv11b/gr_gv11b.h index 018938f6..7d286535 100644 --- a/drivers/gpu/nvgpu/gv11b/gr_gv11b.h +++ b/drivers/gpu/nvgpu/gv11b/gr_gv11b.h | |||
@@ -234,4 +234,8 @@ void gr_gv11b_update_ctxsw_preemption_mode(struct gk20a *g, | |||
234 | int gr_gv11b_handle_ssync_hww(struct gk20a *g); | 234 | int gr_gv11b_handle_ssync_hww(struct gk20a *g); |
235 | u32 gv11b_gr_sm_offset(struct gk20a *g, u32 sm); | 235 | u32 gv11b_gr_sm_offset(struct gk20a *g, u32 sm); |
236 | 236 | ||
237 | int gr_gv11b_decode_priv_addr(struct gk20a *g, u32 addr, | ||
238 | int *addr_type, | ||
239 | u32 *gpc_num, u32 *tpc_num, u32 *ppc_num, u32 *be_num, | ||
240 | u32 *broadcast_flags); | ||
237 | #endif | 241 | #endif |
diff --git a/drivers/gpu/nvgpu/gv11b/gr_pri_gv11b.h b/drivers/gpu/nvgpu/gv11b/gr_pri_gv11b.h new file mode 100644 index 00000000..c71f4c9c --- /dev/null +++ b/drivers/gpu/nvgpu/gv11b/gr_pri_gv11b.h | |||
@@ -0,0 +1,50 @@ | |||
1 | /* | ||
2 | * GV11B/GV100 Graphics Context Pri Register Addressing | ||
3 | * | ||
4 | * Copyright (c) 2018, NVIDIA CORPORATION. All rights reserved. | ||
5 | * | ||
6 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
7 | * copy of this software and associated documentation files (the "Software"), | ||
8 | * to deal in the Software without restriction, including without limitation | ||
9 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||
10 | * and/or sell copies of the Software, and to permit persons to whom the | ||
11 | * Software is furnished to do so, subject to the following conditions: | ||
12 | * | ||
13 | * The above copyright notice and this permission notice shall be included in | ||
14 | * all copies or substantial portions of the Software. | ||
15 | * | ||
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
19 | * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | ||
21 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | ||
22 | * DEALINGS IN THE SOFTWARE. | ||
23 | */ | ||
24 | #ifndef GR_PRI_GV11B_H | ||
25 | #define GR_PRI_GV11B_H | ||
26 | |||
27 | /* | ||
28 | * These convenience macros are generally for use in the management/modificaiton | ||
29 | * of the context state store for gr/compute contexts. | ||
30 | */ | ||
31 | |||
32 | /* Broadcast PMM defines */ | ||
33 | #define NV_PERF_PMMFBP_FBPGS_LTC 0x00250800 | ||
34 | #define NV_PERF_PMMFBP_FBPGS_ROP 0x00250A00 | ||
35 | #define NV_PERF_PMMGPC_GPCGS_GPCTPCA 0x00250000 | ||
36 | #define NV_PERF_PMMGPC_GPCGS_GPCTPCB 0x00250200 | ||
37 | #define NV_PERF_PMMGPC_GPCS 0x00278000 | ||
38 | #define NV_PERF_PMMFBP_FBPS 0x0027C000 | ||
39 | |||
40 | #define PRI_PMMGS_ADDR_WIDTH 9 | ||
41 | #define PRI_PMMS_ADDR_WIDTH 14 | ||
42 | |||
43 | /* Get the offset to be added to the chiplet base addr to get the unicast address */ | ||
44 | #define PRI_PMMGS_OFFSET_MASK(addr) ((addr) & ((1 << PRI_PMMGS_ADDR_WIDTH) - 1)) | ||
45 | #define PRI_PMMGS_BASE_ADDR_MASK(addr) ((addr) & (~((1 << PRI_PMMGS_ADDR_WIDTH) - 1))) | ||
46 | |||
47 | #define PRI_PMMS_ADDR_MASK(addr) ((addr) & ((1 << PRI_PMMS_ADDR_WIDTH) - 1)) | ||
48 | #define PRI_PMMS_BASE_ADDR_MASK(addr) ((addr) & (~((1 << PRI_PMMS_ADDR_WIDTH) - 1))) | ||
49 | |||
50 | #endif /* GR_PRI_GV11B_H */ | ||
diff --git a/drivers/gpu/nvgpu/gv11b/hal_gv11b.c b/drivers/gpu/nvgpu/gv11b/hal_gv11b.c index 9fccce0b..c33844dc 100644 --- a/drivers/gpu/nvgpu/gv11b/hal_gv11b.c +++ b/drivers/gpu/nvgpu/gv11b/hal_gv11b.c | |||
@@ -403,6 +403,7 @@ static const struct gpu_ops gv11b_ops = { | |||
403 | .handle_semaphore_pending = gk20a_gr_handle_semaphore_pending, | 403 | .handle_semaphore_pending = gk20a_gr_handle_semaphore_pending, |
404 | .add_ctxsw_reg_pm_fbpa = gr_gk20a_add_ctxsw_reg_pm_fbpa, | 404 | .add_ctxsw_reg_pm_fbpa = gr_gk20a_add_ctxsw_reg_pm_fbpa, |
405 | .add_ctxsw_reg_perf_pma = gr_gk20a_add_ctxsw_reg_perf_pma, | 405 | .add_ctxsw_reg_perf_pma = gr_gk20a_add_ctxsw_reg_perf_pma, |
406 | .decode_priv_addr = gr_gv11b_decode_priv_addr, | ||
406 | }, | 407 | }, |
407 | .fb = { | 408 | .fb = { |
408 | .reset = gv11b_fb_reset, | 409 | .reset = gv11b_fb_reset, |