summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a
diff options
context:
space:
mode:
authorDebarshi Dutta <ddutta@nvidia.com>2017-11-13 03:21:48 -0500
committermobile promotions <svcmobile_promotions@nvidia.com>2017-11-23 06:03:36 -0500
commit536ec21b565ab1368b53a26d6ec7ed05857f0775 (patch)
tree5f385385ae730dd2d98463502d249150262f8b9b /drivers/gpu/nvgpu/gk20a
parentba2e59dc41f593bb011e0ec58c969337a35f4cf1 (diff)
gpu: nvgpu: remove dependency on linux header for regops_gk20a*
This patch removes the dependency on the header file "uapi/linux/nvgpu.h" for regops_gk20a.c. The original structure and definitions in the uapi/linux/nvgpu.h is maintained for userspace libnvrm_gpu.h. The following changes are made in this patch. 1) Defined common versions of the NVGPU_DBG_GPU_REG_OP* definitions inside regops_gk20a.h. 2) Defined common version of struct nvgpu_dbg_gpu_reg_op inside regops_gk20a.h naming it struct nvgpu_dbg_reg_op. 3) Constructed APIs to convert the NVGPU_DBG_GPU_REG_OP* definitions from linux versions to common and vice versa. 4) Constructed APIs to convert from struct nvgpu_dbg_gpu_reg_op to struct nvgpu_dbg_reg_op and vice versa. 5) The ioctl handler nvgpu_ioctl_channel_reg_ops first copies from userspace into a local storage based on struct nvgpu_dbg_gpu_reg_op which is copied into the struct nvgpu_dbg_reg_op using the APIs above and after executing the regops handler passes the data back into userspace by copying back data from struct nvgpu_dbg_reg_op to struct nvgpu_dbg_gpu_reg_opi. JIRA NVGPU-417 Change-Id: I23bad48d2967a629a6308c7484f3741a89db6537 Signed-off-by: Debarshi Dutta <ddutta@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/1596972 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.c8
-rw-r--r--drivers/gpu/nvgpu/gk20a/gr_gk20a.h6
-rw-r--r--drivers/gpu/nvgpu/gk20a/regops_gk20a.c15
-rw-r--r--drivers/gpu/nvgpu/gk20a/regops_gk20a.h50
5 files changed, 63 insertions, 20 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.h b/drivers/gpu/nvgpu/gk20a/gk20a.h
index 11a99bff..33d40cd5 100644
--- a/drivers/gpu/nvgpu/gk20a/gk20a.h
+++ b/drivers/gpu/nvgpu/gk20a/gk20a.h
@@ -949,7 +949,7 @@ struct gpu_ops {
949 } debug; 949 } debug;
950 struct { 950 struct {
951 int (*exec_reg_ops)(struct dbg_session_gk20a *dbg_s, 951 int (*exec_reg_ops)(struct dbg_session_gk20a *dbg_s,
952 struct nvgpu_dbg_gpu_reg_op *ops, 952 struct nvgpu_dbg_reg_op *ops,
953 u64 num_ops); 953 u64 num_ops);
954 int (*dbg_set_powergate)(struct dbg_session_gk20a *dbg_s, 954 int (*dbg_set_powergate)(struct dbg_session_gk20a *dbg_s,
955 bool disable_powergate); 955 bool disable_powergate);
@@ -1206,7 +1206,7 @@ struct gk20a {
1206 int dbg_timeout_disabled_refcount; /*refcount for timeout disable */ 1206 int dbg_timeout_disabled_refcount; /*refcount for timeout disable */
1207 1207
1208 /* must have dbg_sessions_lock before use */ 1208 /* must have dbg_sessions_lock before use */
1209 struct nvgpu_dbg_gpu_reg_op *dbg_regops_tmp_buf; 1209 struct nvgpu_dbg_reg_op *dbg_regops_tmp_buf;
1210 u32 dbg_regops_tmp_buf_ops; 1210 u32 dbg_regops_tmp_buf_ops;
1211 1211
1212 /* For perfbuf mapping */ 1212 /* For perfbuf mapping */
diff --git a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
index 03e1d567..82695e44 100644
--- a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
@@ -7749,7 +7749,7 @@ bool gk20a_is_channel_ctx_resident(struct channel_gk20a *ch)
7749} 7749}
7750 7750
7751int __gr_gk20a_exec_ctx_ops(struct channel_gk20a *ch, 7751int __gr_gk20a_exec_ctx_ops(struct channel_gk20a *ch,
7752 struct nvgpu_dbg_gpu_reg_op *ctx_ops, u32 num_ops, 7752 struct nvgpu_dbg_reg_op *ctx_ops, u32 num_ops,
7753 u32 num_ctx_wr_ops, u32 num_ctx_rd_ops, 7753 u32 num_ctx_wr_ops, u32 num_ctx_rd_ops,
7754 bool ch_is_curr_ctx) 7754 bool ch_is_curr_ctx)
7755{ 7755{
@@ -7990,7 +7990,7 @@ int __gr_gk20a_exec_ctx_ops(struct channel_gk20a *ch,
7990} 7990}
7991 7991
7992int gr_gk20a_exec_ctx_ops(struct channel_gk20a *ch, 7992int gr_gk20a_exec_ctx_ops(struct channel_gk20a *ch,
7993 struct nvgpu_dbg_gpu_reg_op *ctx_ops, u32 num_ops, 7993 struct nvgpu_dbg_reg_op *ctx_ops, u32 num_ops,
7994 u32 num_ctx_wr_ops, u32 num_ctx_rd_ops) 7994 u32 num_ctx_wr_ops, u32 num_ctx_rd_ops)
7995{ 7995{
7996 struct gk20a *g = ch->g; 7996 struct gk20a *g = ch->g;
@@ -8279,7 +8279,7 @@ void gk20a_gr_resume_all_sms(struct gk20a *g)
8279int gr_gk20a_set_sm_debug_mode(struct gk20a *g, 8279int gr_gk20a_set_sm_debug_mode(struct gk20a *g,
8280 struct channel_gk20a *ch, u64 sms, bool enable) 8280 struct channel_gk20a *ch, u64 sms, bool enable)
8281{ 8281{
8282 struct nvgpu_dbg_gpu_reg_op *ops; 8282 struct nvgpu_dbg_reg_op *ops;
8283 unsigned int i = 0, sm_id; 8283 unsigned int i = 0, sm_id;
8284 int err; 8284 int err;
8285 u32 gpc_stride = nvgpu_get_litter_value(g, GPU_LIT_GPC_STRIDE); 8285 u32 gpc_stride = nvgpu_get_litter_value(g, GPU_LIT_GPC_STRIDE);
@@ -8453,7 +8453,7 @@ int gr_gk20a_inval_icache(struct gk20a *g, struct channel_gk20a *ch)
8453{ 8453{
8454 int err = 0; 8454 int err = 0;
8455 u32 cache_ctrl, regval; 8455 u32 cache_ctrl, regval;
8456 struct nvgpu_dbg_gpu_reg_op ops; 8456 struct nvgpu_dbg_reg_op ops;
8457 8457
8458 ops.op = REGOP(READ_32); 8458 ops.op = REGOP(READ_32);
8459 ops.type = REGOP(TYPE_GR_CTX); 8459 ops.type = REGOP(TYPE_GR_CTX);
diff --git a/drivers/gpu/nvgpu/gk20a/gr_gk20a.h b/drivers/gpu/nvgpu/gk20a/gr_gk20a.h
index 0df88988..5a5809fc 100644
--- a/drivers/gpu/nvgpu/gk20a/gr_gk20a.h
+++ b/drivers/gpu/nvgpu/gk20a/gr_gk20a.h
@@ -604,12 +604,12 @@ u32 gk20a_gr_get_sm_no_lock_down_hww_global_esr_mask(struct gk20a *g);
604 604
605int gk20a_gr_suspend(struct gk20a *g); 605int gk20a_gr_suspend(struct gk20a *g);
606 606
607struct nvgpu_dbg_gpu_reg_op; 607struct nvgpu_dbg_reg_op;
608int gr_gk20a_exec_ctx_ops(struct channel_gk20a *ch, 608int gr_gk20a_exec_ctx_ops(struct channel_gk20a *ch,
609 struct nvgpu_dbg_gpu_reg_op *ctx_ops, u32 num_ops, 609 struct nvgpu_dbg_reg_op *ctx_ops, u32 num_ops,
610 u32 num_ctx_wr_ops, u32 num_ctx_rd_ops); 610 u32 num_ctx_wr_ops, u32 num_ctx_rd_ops);
611int __gr_gk20a_exec_ctx_ops(struct channel_gk20a *ch, 611int __gr_gk20a_exec_ctx_ops(struct channel_gk20a *ch,
612 struct nvgpu_dbg_gpu_reg_op *ctx_ops, u32 num_ops, 612 struct nvgpu_dbg_reg_op *ctx_ops, u32 num_ops,
613 u32 num_ctx_wr_ops, u32 num_ctx_rd_ops, 613 u32 num_ctx_wr_ops, u32 num_ctx_rd_ops,
614 bool ch_is_curr_ctx); 614 bool ch_is_curr_ctx);
615int gr_gk20a_get_ctx_buffer_offsets(struct gk20a *g, 615int gr_gk20a_get_ctx_buffer_offsets(struct gk20a *g,
diff --git a/drivers/gpu/nvgpu/gk20a/regops_gk20a.c b/drivers/gpu/nvgpu/gk20a/regops_gk20a.c
index f0cf5205..06cd5051 100644
--- a/drivers/gpu/nvgpu/gk20a/regops_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/regops_gk20a.c
@@ -22,9 +22,6 @@
22 * DEALINGS IN THE SOFTWARE. 22 * DEALINGS IN THE SOFTWARE.
23 */ 23 */
24 24
25#include <linux/err.h>
26#include <uapi/linux/nvgpu.h>
27
28#include "gk20a.h" 25#include "gk20a.h"
29#include "gr_gk20a.h" 26#include "gr_gk20a.h"
30#include "dbg_gpu_gk20a.h" 27#include "dbg_gpu_gk20a.h"
@@ -377,12 +374,12 @@ static const u32 gk20a_qctl_whitelist_ranges_count =
377 374
378static bool validate_reg_ops(struct dbg_session_gk20a *dbg_s, 375static bool validate_reg_ops(struct dbg_session_gk20a *dbg_s,
379 u32 *ctx_rd_count, u32 *ctx_wr_count, 376 u32 *ctx_rd_count, u32 *ctx_wr_count,
380 struct nvgpu_dbg_gpu_reg_op *ops, 377 struct nvgpu_dbg_reg_op *ops,
381 u32 op_count); 378 u32 op_count);
382 379
383 380
384int exec_regops_gk20a(struct dbg_session_gk20a *dbg_s, 381int exec_regops_gk20a(struct dbg_session_gk20a *dbg_s,
385 struct nvgpu_dbg_gpu_reg_op *ops, 382 struct nvgpu_dbg_reg_op *ops,
386 u64 num_ops) 383 u64 num_ops)
387{ 384{
388 int err = 0; 385 int err = 0;
@@ -519,7 +516,7 @@ int exec_regops_gk20a(struct dbg_session_gk20a *dbg_s,
519 516
520 517
521static int validate_reg_op_info(struct dbg_session_gk20a *dbg_s, 518static int validate_reg_op_info(struct dbg_session_gk20a *dbg_s,
522 struct nvgpu_dbg_gpu_reg_op *op) 519 struct nvgpu_dbg_reg_op *op)
523{ 520{
524 int err = 0; 521 int err = 0;
525 522
@@ -559,7 +556,7 @@ static int validate_reg_op_info(struct dbg_session_gk20a *dbg_s,
559} 556}
560 557
561static bool check_whitelists(struct dbg_session_gk20a *dbg_s, 558static bool check_whitelists(struct dbg_session_gk20a *dbg_s,
562 struct nvgpu_dbg_gpu_reg_op *op, u32 offset) 559 struct nvgpu_dbg_reg_op *op, u32 offset)
563{ 560{
564 struct gk20a *g = dbg_s->g; 561 struct gk20a *g = dbg_s->g;
565 bool valid = false; 562 bool valid = false;
@@ -630,7 +627,7 @@ static bool check_whitelists(struct dbg_session_gk20a *dbg_s,
630 627
631/* note: the op here has already been through validate_reg_op_info */ 628/* note: the op here has already been through validate_reg_op_info */
632static int validate_reg_op_offset(struct dbg_session_gk20a *dbg_s, 629static int validate_reg_op_offset(struct dbg_session_gk20a *dbg_s,
633 struct nvgpu_dbg_gpu_reg_op *op) 630 struct nvgpu_dbg_reg_op *op)
634{ 631{
635 int err; 632 int err;
636 u32 buf_offset_lo, buf_offset_addr, num_offsets, offset; 633 u32 buf_offset_lo, buf_offset_addr, num_offsets, offset;
@@ -689,7 +686,7 @@ static int validate_reg_op_offset(struct dbg_session_gk20a *dbg_s,
689 686
690static bool validate_reg_ops(struct dbg_session_gk20a *dbg_s, 687static bool validate_reg_ops(struct dbg_session_gk20a *dbg_s,
691 u32 *ctx_rd_count, u32 *ctx_wr_count, 688 u32 *ctx_rd_count, u32 *ctx_wr_count,
692 struct nvgpu_dbg_gpu_reg_op *ops, 689 struct nvgpu_dbg_reg_op *ops,
693 u32 op_count) 690 u32 op_count)
694{ 691{
695 u32 i; 692 u32 i;
diff --git a/drivers/gpu/nvgpu/gk20a/regops_gk20a.h b/drivers/gpu/nvgpu/gk20a/regops_gk20a.h
index 4db79397..236fb52c 100644
--- a/drivers/gpu/nvgpu/gk20a/regops_gk20a.h
+++ b/drivers/gpu/nvgpu/gk20a/regops_gk20a.h
@@ -24,17 +24,63 @@
24#ifndef REGOPS_GK20A_H 24#ifndef REGOPS_GK20A_H
25#define REGOPS_GK20A_H 25#define REGOPS_GK20A_H
26 26
27/*
28 * Register operations
29 * All operations are targeted towards first channel
30 * attached to debug session
31 */
32/* valid op values */
33#define NVGPU_DBG_REG_OP_READ_32 (0x00000000)
34#define NVGPU_DBG_REG_OP_WRITE_32 (0x00000001)
35#define NVGPU_DBG_REG_OP_READ_64 (0x00000002)
36#define NVGPU_DBG_REG_OP_WRITE_64 (0x00000003)
37/* note: 8b ops are unsupported */
38#define NVGPU_DBG_REG_OP_READ_08 (0x00000004)
39#define NVGPU_DBG_REG_OP_WRITE_08 (0x00000005)
40
41/* valid type values */
42#define NVGPU_DBG_REG_OP_TYPE_GLOBAL (0x00000000)
43#define NVGPU_DBG_REG_OP_TYPE_GR_CTX (0x00000001)
44#define NVGPU_DBG_REG_OP_TYPE_GR_CTX_TPC (0x00000002)
45#define NVGPU_DBG_REG_OP_TYPE_GR_CTX_SM (0x00000004)
46#define NVGPU_DBG_REG_OP_TYPE_GR_CTX_CROP (0x00000008)
47#define NVGPU_DBG_REG_OP_TYPE_GR_CTX_ZROP (0x00000010)
48/*#define NVGPU_DBG_REG_OP_TYPE_FB (0x00000020)*/
49#define NVGPU_DBG_REG_OP_TYPE_GR_CTX_QUAD (0x00000040)
50
51/* valid status values */
52#define NVGPU_DBG_REG_OP_STATUS_SUCCESS (0x00000000)
53#define NVGPU_DBG_REG_OP_STATUS_INVALID_OP (0x00000001)
54#define NVGPU_DBG_REG_OP_STATUS_INVALID_TYPE (0x00000002)
55#define NVGPU_DBG_REG_OP_STATUS_INVALID_OFFSET (0x00000004)
56#define NVGPU_DBG_REG_OP_STATUS_UNSUPPORTED_OP (0x00000008)
57#define NVGPU_DBG_REG_OP_STATUS_INVALID_MASK (0x00000010)
58
59struct nvgpu_dbg_reg_op {
60 __u8 op;
61 __u8 type;
62 __u8 status;
63 __u8 quad;
64 __u32 group_mask;
65 __u32 sub_group_mask;
66 __u32 offset;
67 __u32 value_lo;
68 __u32 value_hi;
69 __u32 and_n_mask_lo;
70 __u32 and_n_mask_hi;
71};
72
27struct regop_offset_range { 73struct regop_offset_range {
28 u32 base:24; 74 u32 base:24;
29 u32 count:8; 75 u32 count:8;
30}; 76};
31 77
32int exec_regops_gk20a(struct dbg_session_gk20a *dbg_s, 78int exec_regops_gk20a(struct dbg_session_gk20a *dbg_s,
33 struct nvgpu_dbg_gpu_reg_op *ops, 79 struct nvgpu_dbg_reg_op *ops,
34 u64 num_ops); 80 u64 num_ops);
35 81
36/* turn seriously unwieldy names -> something shorter */ 82/* turn seriously unwieldy names -> something shorter */
37#define REGOP(x) NVGPU_DBG_GPU_REG_OP_##x 83#define REGOP(x) NVGPU_DBG_REG_OP_##x
38 84
39bool reg_op_is_gr_ctx(u8 type); 85bool reg_op_is_gr_ctx(u8 type);
40bool reg_op_is_read(u8 op); 86bool reg_op_is_read(u8 op);