diff --git a/drivers/gpu/nvgpu/gk20a/fecs_trace_gk20a.c b/drivers/gpu/nvgpu/gk20a/fecs_trace_gk20a.c index e775c10b0..453d5b2f4 100644 --- a/drivers/gpu/nvgpu/gk20a/fecs_trace_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/fecs_trace_gk20a.c @@ -23,7 +23,6 @@ #ifdef CONFIG_DEBUG_FS #include #endif -#include #include #include @@ -738,14 +737,14 @@ int gk20a_fecs_trace_deinit(struct gk20a *g) } int gk20a_gr_max_entries(struct gk20a *g, - struct nvgpu_ctxsw_trace_filter *filter) + struct nvgpu_gpu_ctxsw_trace_filter *filter) { int n; int tag; /* Compute number of entries per record, with given filter */ for (n = 0, tag = 0; tag < gk20a_fecs_trace_num_ts(); tag++) - n += (NVGPU_CTXSW_FILTER_ISSET(tag, filter) != 0); + n += (NVGPU_GPU_CTXSW_FILTER_ISSET(tag, filter) != 0); /* Return max number of entries generated for the whole ring */ return n * GK20A_FECS_TRACE_NUM_RECORDS; diff --git a/drivers/gpu/nvgpu/gk20a/fecs_trace_gk20a.h b/drivers/gpu/nvgpu/gk20a/fecs_trace_gk20a.h index acac14c62..8e7231076 100644 --- a/drivers/gpu/nvgpu/gk20a/fecs_trace_gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/fecs_trace_gk20a.h @@ -25,7 +25,7 @@ struct gk20a; struct channel_gk20a; -struct nvgpu_ctxsw_trace_filter; +struct nvgpu_gpu_ctxsw_trace_filter; int gk20a_fecs_trace_poll(struct gk20a *g); int gk20a_fecs_trace_init(struct gk20a *g); @@ -35,7 +35,7 @@ int gk20a_fecs_trace_unbind_channel(struct gk20a *g, struct channel_gk20a *ch); int gk20a_fecs_trace_reset(struct gk20a *g); int gk20a_fecs_trace_deinit(struct gk20a *g); int gk20a_gr_max_entries(struct gk20a *g, - struct nvgpu_ctxsw_trace_filter *filter); + struct nvgpu_gpu_ctxsw_trace_filter *filter); int gk20a_fecs_trace_enable(struct gk20a *g); int gk20a_fecs_trace_disable(struct gk20a *g); bool gk20a_fecs_trace_is_enabled(struct gk20a *g); diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.h b/drivers/gpu/nvgpu/gk20a/gk20a.h index 8fc886776..93a5bb23a 100644 --- a/drivers/gpu/nvgpu/gk20a/gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/gk20a.h @@ -43,7 +43,7 @@ struct nvgpu_mem_sgt; struct nvgpu_warpstate; struct nvgpu_clk_arb; #ifdef CONFIG_GK20A_CTXSW_TRACE -struct nvgpu_ctxsw_trace_filter; +struct nvgpu_gpu_ctxsw_trace_filter; #endif struct priv_cmd_entry; @@ -894,7 +894,7 @@ struct gpu_ops { struct { int (*init)(struct gk20a *g); int (*max_entries)(struct gk20a *, - struct nvgpu_ctxsw_trace_filter *filter); + struct nvgpu_gpu_ctxsw_trace_filter *filter); int (*flush)(struct gk20a *g); int (*poll)(struct gk20a *g); int (*enable)(struct gk20a *g); @@ -911,7 +911,7 @@ struct gpu_ops { int (*mmap_user_buffer)(struct gk20a *g, struct vm_area_struct *vma); int (*set_filter)(struct gk20a *g, - struct nvgpu_ctxsw_trace_filter *filter); + struct nvgpu_gpu_ctxsw_trace_filter *filter); } fecs_trace; #endif struct { diff --git a/drivers/gpu/nvgpu/include/nvgpu/ctxsw_trace.h b/drivers/gpu/nvgpu/include/nvgpu/ctxsw_trace.h index 9dd6833f0..4eaf9bf0c 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/ctxsw_trace.h +++ b/drivers/gpu/nvgpu/include/nvgpu/ctxsw_trace.h @@ -44,6 +44,15 @@ struct channel_gk20a; #define NVGPU_GPU_CTXSW_TAG_LAST \ NVGPU_GPU_CTXSW_TAG_INVALID_TIMESTAMP +#define NVGPU_GPU_CTXSW_FILTER_ISSET(n, p) \ + ((p)->tag_bits[(n) / 64] & (1 << ((n) & 63))) + +#define NVGPU_GPU_CTXSW_FILTER_SIZE (NVGPU_GPU_CTXSW_TAG_LAST + 1) + +struct nvgpu_gpu_ctxsw_trace_filter { + u64 tag_bits[(NVGPU_GPU_CTXSW_FILTER_SIZE + 63) / 64]; +}; + /* * The binary format of 'struct nvgpu_gpu_ctxsw_trace_entry' introduced here * should match that of 'struct nvgpu_ctxsw_trace_entry' defined in uapi diff --git a/drivers/gpu/nvgpu/os/linux/ctxsw_trace.c b/drivers/gpu/nvgpu/os/linux/ctxsw_trace.c index 4983061bb..16b040da4 100644 --- a/drivers/gpu/nvgpu/os/linux/ctxsw_trace.c +++ b/drivers/gpu/nvgpu/os/linux/ctxsw_trace.c @@ -46,7 +46,7 @@ struct gk20a_ctxsw_dev { struct nvgpu_ctxsw_ring_header *hdr; struct nvgpu_gpu_ctxsw_trace_entry *ents; - struct nvgpu_ctxsw_trace_filter filter; + struct nvgpu_gpu_ctxsw_trace_filter filter; bool write_enabled; struct nvgpu_cond readout_wq; size_t size; @@ -244,13 +244,25 @@ static int gk20a_ctxsw_dev_ioctl_ring_setup(struct gk20a_ctxsw_dev *dev, return ret; } +static void nvgpu_set_ctxsw_trace_filter_args(struct nvgpu_gpu_ctxsw_trace_filter *filter_dst, + struct nvgpu_ctxsw_trace_filter *filter_src) +{ + memcpy(filter_dst->tag_bits, filter_src->tag_bits, (NVGPU_CTXSW_FILTER_SIZE + 63) / 64); +} + +static void nvgpu_get_ctxsw_trace_filter_args(struct nvgpu_ctxsw_trace_filter *filter_dst, + struct nvgpu_gpu_ctxsw_trace_filter *filter_src) +{ + memcpy(filter_dst->tag_bits, filter_src->tag_bits, (NVGPU_CTXSW_FILTER_SIZE + 63) / 64); +} + static int gk20a_ctxsw_dev_ioctl_set_filter(struct gk20a_ctxsw_dev *dev, struct nvgpu_ctxsw_trace_filter_args *args) { struct gk20a *g = dev->g; nvgpu_mutex_acquire(&dev->write_lock); - dev->filter = args->filter; + nvgpu_set_ctxsw_trace_filter_args(&dev->filter, &args->filter); nvgpu_mutex_release(&dev->write_lock); if (g->ops.fecs_trace.set_filter) @@ -262,7 +274,7 @@ static int gk20a_ctxsw_dev_ioctl_get_filter(struct gk20a_ctxsw_dev *dev, struct nvgpu_ctxsw_trace_filter_args *args) { nvgpu_mutex_acquire(&dev->write_lock); - args->filter = dev->filter; + nvgpu_get_ctxsw_trace_filter_args(&args->filter, &dev->filter); nvgpu_mutex_release(&dev->write_lock); return 0; @@ -650,7 +662,7 @@ int gk20a_ctxsw_trace_write(struct gk20a *g, goto drop; } - if (!NVGPU_CTXSW_FILTER_ISSET(entry->tag, &dev->filter)) { + if (!NVGPU_GPU_CTXSW_FILTER_ISSET(entry->tag, &dev->filter)) { reason = "filtered out"; goto filter; } diff --git a/drivers/gpu/nvgpu/os/linux/vgpu/fecs_trace_vgpu.c b/drivers/gpu/nvgpu/os/linux/vgpu/fecs_trace_vgpu.c index 255ee2bd6..c878316a8 100644 --- a/drivers/gpu/nvgpu/os/linux/vgpu/fecs_trace_vgpu.c +++ b/drivers/gpu/nvgpu/os/linux/vgpu/fecs_trace_vgpu.c @@ -190,7 +190,7 @@ int vgpu_mmap_user_buffer(struct gk20a *g, struct vm_area_struct *vma) #ifdef CONFIG_GK20A_CTXSW_TRACE int vgpu_fecs_trace_max_entries(struct gk20a *g, - struct nvgpu_ctxsw_trace_filter *filter) + struct nvgpu_gpu_ctxsw_trace_filter *filter) { struct vgpu_fecs_trace *vcst = (struct vgpu_fecs_trace *)g->fecs_trace; @@ -202,7 +202,7 @@ int vgpu_fecs_trace_max_entries(struct gk20a *g, #endif int vgpu_fecs_trace_set_filter(struct gk20a *g, - struct nvgpu_ctxsw_trace_filter *filter) + struct nvgpu_gpu_ctxsw_trace_filter *filter) { struct tegra_vgpu_cmd_msg msg = { .cmd = TEGRA_VGPU_CMD_FECS_TRACE_SET_FILTER, diff --git a/drivers/gpu/nvgpu/vgpu/fecs_trace_vgpu.h b/drivers/gpu/nvgpu/vgpu/fecs_trace_vgpu.h index b957a363f..496e18927 100644 --- a/drivers/gpu/nvgpu/vgpu/fecs_trace_vgpu.h +++ b/drivers/gpu/nvgpu/vgpu/fecs_trace_vgpu.h @@ -27,7 +27,7 @@ struct gk20a; struct vm_area_struct; -struct nvgpu_ctxsw_trace_filter; +struct nvgpu_gpu_ctxsw_trace_filter; void vgpu_fecs_trace_data_update(struct gk20a *g); int vgpu_fecs_trace_init(struct gk20a *g); @@ -40,8 +40,8 @@ int vgpu_alloc_user_buffer(struct gk20a *g, void **buf, size_t *size); int vgpu_free_user_buffer(struct gk20a *g); int vgpu_mmap_user_buffer(struct gk20a *g, struct vm_area_struct *vma); int vgpu_fecs_trace_max_entries(struct gk20a *g, - struct nvgpu_ctxsw_trace_filter *filter); + struct nvgpu_gpu_ctxsw_trace_filter *filter); int vgpu_fecs_trace_set_filter(struct gk20a *g, - struct nvgpu_ctxsw_trace_filter *filter); + struct nvgpu_gpu_ctxsw_trace_filter *filter); #endif /* __FECS_TRACE_VGPU_H */