diff options
author | Debarshi Dutta <ddutta@nvidia.com> | 2017-11-13 03:21:48 -0500 |
---|---|---|
committer | mobile promotions <svcmobile_promotions@nvidia.com> | 2017-11-23 06:03:36 -0500 |
commit | 536ec21b565ab1368b53a26d6ec7ed05857f0775 (patch) | |
tree | 5f385385ae730dd2d98463502d249150262f8b9b /drivers/gpu/nvgpu/gk20a | |
parent | ba2e59dc41f593bb011e0ec58c969337a35f4cf1 (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.h | 4 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/gr_gk20a.c | 8 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/gr_gk20a.h | 6 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/regops_gk20a.c | 15 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/regops_gk20a.h | 50 |
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 | ||
7751 | int __gr_gk20a_exec_ctx_ops(struct channel_gk20a *ch, | 7751 | int __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 | ||
7992 | int gr_gk20a_exec_ctx_ops(struct channel_gk20a *ch, | 7992 | int 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) | |||
8279 | int gr_gk20a_set_sm_debug_mode(struct gk20a *g, | 8279 | int 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 | ||
605 | int gk20a_gr_suspend(struct gk20a *g); | 605 | int gk20a_gr_suspend(struct gk20a *g); |
606 | 606 | ||
607 | struct nvgpu_dbg_gpu_reg_op; | 607 | struct nvgpu_dbg_reg_op; |
608 | int gr_gk20a_exec_ctx_ops(struct channel_gk20a *ch, | 608 | int 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); |
611 | int __gr_gk20a_exec_ctx_ops(struct channel_gk20a *ch, | 611 | int __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); |
615 | int gr_gk20a_get_ctx_buffer_offsets(struct gk20a *g, | 615 | int 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 | ||
378 | static bool validate_reg_ops(struct dbg_session_gk20a *dbg_s, | 375 | static 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 | ||
384 | int exec_regops_gk20a(struct dbg_session_gk20a *dbg_s, | 381 | int 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 | ||
521 | static int validate_reg_op_info(struct dbg_session_gk20a *dbg_s, | 518 | static 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 | ||
561 | static bool check_whitelists(struct dbg_session_gk20a *dbg_s, | 558 | static 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 */ |
632 | static int validate_reg_op_offset(struct dbg_session_gk20a *dbg_s, | 629 | static 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 | ||
690 | static bool validate_reg_ops(struct dbg_session_gk20a *dbg_s, | 687 | static 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 | |||
59 | struct 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 | |||
27 | struct regop_offset_range { | 73 | struct regop_offset_range { |
28 | u32 base:24; | 74 | u32 base:24; |
29 | u32 count:8; | 75 | u32 count:8; |
30 | }; | 76 | }; |
31 | 77 | ||
32 | int exec_regops_gk20a(struct dbg_session_gk20a *dbg_s, | 78 | int 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 | ||
39 | bool reg_op_is_gr_ctx(u8 type); | 85 | bool reg_op_is_gr_ctx(u8 type); |
40 | bool reg_op_is_read(u8 op); | 86 | bool reg_op_is_read(u8 op); |