From d717c69d2b1992688589ae389380fedf0b06c720 Mon Sep 17 00:00:00 2001 From: Sunny He Date: Fri, 30 Jun 2017 14:40:33 -0700 Subject: gpu: nvgpu: Reorg css HAL initialization Reorganize HAL initialization to remove inheritance and construct the gpu_ops struct at compile time. This patch only covers the css sub-module of the gpu_ops struct. Perform HAL function assignments in hal_gxxxx.c through the population of a chip-specific copy of gpu_ops. Jira NVGPU-74 Change-Id: I3bf696e13d359982c964c7bc470500a30555c034 Signed-off-by: Sunny He Reviewed-on: https://git-master.nvidia.com/r/1514205 Reviewed-by: Automatic_Commit_Validation_User GVS: Gerrit_Virtual_Submit Reviewed-by: Alex Waterman Reviewed-by: Vijayakumar Subbu --- drivers/gpu/nvgpu/gk20a/css_gr_gk20a.c | 22 ++++++---------------- drivers/gpu/nvgpu/gk20a/css_gr_gk20a.h | 14 ++++++++++++-- drivers/gpu/nvgpu/gm20b/hal_gm20b.c | 16 +++++++++++++--- drivers/gpu/nvgpu/gp106/hal_gp106.c | 16 +++++++++++++--- drivers/gpu/nvgpu/gp10b/hal_gp10b.c | 17 ++++++++++++++--- 5 files changed, 58 insertions(+), 27 deletions(-) diff --git a/drivers/gpu/nvgpu/gk20a/css_gr_gk20a.c b/drivers/gpu/nvgpu/gk20a/css_gr_gk20a.c index 452bcd11..8f655b26 100644 --- a/drivers/gpu/nvgpu/gk20a/css_gr_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/css_gr_gk20a.c @@ -72,7 +72,7 @@ static inline u32 css_hw_get_pending_snapshots(struct gk20a *g) } /* informs hw how many snapshots have been processed (frees up fifo space) */ -static inline void css_hw_set_handled_snapshots(struct gk20a *g, u32 done) +inline void css_hw_set_handled_snapshots(struct gk20a *g, u32 done) { if (done > 0) { gk20a_writel(g, perf_pmasys_mem_bump_r(), @@ -127,7 +127,7 @@ static int css_gr_create_shared_data(struct gr_gk20a *gr) return 0; } -static int css_hw_enable_snapshot(struct channel_gk20a *ch, +int css_hw_enable_snapshot(struct channel_gk20a *ch, struct gk20a_cs_snapshot_client *cs_client) { struct gk20a *g = ch->g; @@ -203,7 +203,7 @@ failed_allocation: return ret; } -static void css_hw_disable_snapshot(struct gr_gk20a *gr) +void css_hw_disable_snapshot(struct gr_gk20a *gr) { struct gk20a *g = gr->g; struct gk20a_cs_snapshot *data = gr->cs_data; @@ -399,7 +399,7 @@ next_hw_fifo_entry: return 0; } -static u32 css_gr_allocate_perfmon_ids(struct gk20a_cs_snapshot *data, +u32 css_gr_allocate_perfmon_ids(struct gk20a_cs_snapshot *data, u32 count) { unsigned long *pids = data->perfmon_ids; @@ -415,7 +415,7 @@ static u32 css_gr_allocate_perfmon_ids(struct gk20a_cs_snapshot *data, return f; } -static u32 css_gr_release_perfmon_ids(struct gk20a_cs_snapshot *data, +u32 css_gr_release_perfmon_ids(struct gk20a_cs_snapshot *data, u32 start, u32 count) { @@ -653,7 +653,7 @@ void gr_gk20a_free_cyclestats_snapshot_data(struct gk20a *g) nvgpu_mutex_destroy(&gr->cs_lock); } -static int css_hw_check_data_available(struct channel_gk20a *ch, u32 *pending, +int css_hw_check_data_available(struct channel_gk20a *ch, u32 *pending, bool *hw_overflow) { struct gk20a *g = ch->g; @@ -670,13 +670,3 @@ static int css_hw_check_data_available(struct channel_gk20a *ch, u32 *pending, *hw_overflow = css_hw_get_overflow_status(g); return 0; } - -void gk20a_init_css_ops(struct gpu_ops *gops) -{ - gops->css.enable_snapshot = css_hw_enable_snapshot; - gops->css.disable_snapshot = css_hw_disable_snapshot; - gops->css.check_data_available = css_hw_check_data_available; - gops->css.set_handled_snapshots = css_hw_set_handled_snapshots; - gops->css.allocate_perfmon_ids = css_gr_allocate_perfmon_ids; - gops->css.release_perfmon_ids = css_gr_release_perfmon_ids; -} diff --git a/drivers/gpu/nvgpu/gk20a/css_gr_gk20a.h b/drivers/gpu/nvgpu/gk20a/css_gr_gk20a.h index a95eaeae..804308bc 100644 --- a/drivers/gpu/nvgpu/gk20a/css_gr_gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/css_gr_gk20a.h @@ -1,7 +1,7 @@ /* * GK20A Cycle stats snapshots support (subsystem for gr_gk20a). * - * Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved. + * Copyright (c) 2016-2017, NVIDIA CORPORATION. All rights reserved. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, @@ -121,6 +121,16 @@ struct gk20a_cs_snapshot { struct gk20a_cs_snapshot_fifo_entry *hw_get; }; -void gk20a_init_css_ops(struct gpu_ops *gops); +inline void css_hw_set_handled_snapshots(struct gk20a *g, u32 done); +int css_hw_enable_snapshot(struct channel_gk20a *ch, + struct gk20a_cs_snapshot_client *cs_client); +void css_hw_disable_snapshot(struct gr_gk20a *gr); +u32 css_gr_allocate_perfmon_ids(struct gk20a_cs_snapshot *data, + u32 count); +u32 css_gr_release_perfmon_ids(struct gk20a_cs_snapshot *data, + u32 start, + u32 count); +int css_hw_check_data_available(struct channel_gk20a *ch, u32 *pending, + bool *hw_overflow); #endif /* CSS_GR_GK20A_H */ diff --git a/drivers/gpu/nvgpu/gm20b/hal_gm20b.c b/drivers/gpu/nvgpu/gm20b/hal_gm20b.c index 2d8ed9ec..300f0872 100644 --- a/drivers/gpu/nvgpu/gm20b/hal_gm20b.c +++ b/drivers/gpu/nvgpu/gm20b/hal_gm20b.c @@ -234,6 +234,16 @@ static const struct gpu_ops gm20b_ops = { .cde = { .get_program_numbers = gm20b_cde_get_program_numbers, }, +#if defined(CONFIG_GK20A_CYCLE_STATS) + .css = { + .enable_snapshot = css_hw_enable_snapshot, + .disable_snapshot = css_hw_disable_snapshot, + .check_data_available = css_hw_check_data_available, + .set_handled_snapshots = css_hw_set_handled_snapshots, + .allocate_perfmon_ids = css_gr_allocate_perfmon_ids, + .release_perfmon_ids = css_gr_release_perfmon_ids, + }, +#endif .falcon = { .falcon_hal_sw_init = gk20a_falcon_hal_sw_init, }, @@ -253,6 +263,9 @@ int gm20b_init_hal(struct gk20a *g) gops->dbg_session_ops = gm20b_ops.dbg_session_ops; gops->debug = gm20b_ops.debug; gops->cde = gm20b_ops.cde; +#if defined(CONFIG_GK20A_CYCLE_STATS) + gops->css = gm20b_ops.css; +#endif gops->falcon = gm20b_ops.falcon; /* Lone functions */ @@ -303,9 +316,6 @@ int gm20b_init_hal(struct gk20a *g) gm20b_init_regops(gops); gm20b_init_therm_ops(gops); gk20a_init_tsg_ops(gops); -#if defined(CONFIG_GK20A_CYCLE_STATS) - gk20a_init_css_ops(gops); -#endif g->name = "gm20b"; c->twod_class = FERMI_TWOD_A; diff --git a/drivers/gpu/nvgpu/gp106/hal_gp106.c b/drivers/gpu/nvgpu/gp106/hal_gp106.c index 2ebf93e2..c54232aa 100644 --- a/drivers/gpu/nvgpu/gp106/hal_gp106.c +++ b/drivers/gpu/nvgpu/gp106/hal_gp106.c @@ -278,6 +278,16 @@ static const struct gpu_ops gp106_ops = { .need_scatter_buffer = gp10b_need_scatter_buffer, .populate_scatter_buffer = gp10b_populate_scatter_buffer, }, +#if defined(CONFIG_GK20A_CYCLE_STATS) + .css = { + .enable_snapshot = css_hw_enable_snapshot, + .disable_snapshot = css_hw_disable_snapshot, + .check_data_available = css_hw_check_data_available, + .set_handled_snapshots = css_hw_set_handled_snapshots, + .allocate_perfmon_ids = css_gr_allocate_perfmon_ids, + .release_perfmon_ids = css_gr_release_perfmon_ids, + }, +#endif .xve = { .sw_init = xve_sw_init_gp106, .get_speed = xve_get_speed_gp106, @@ -314,6 +324,9 @@ int gp106_init_hal(struct gk20a *g) gops->debug = gp106_ops.debug; gops->dbg_session_ops = gp106_ops.dbg_session_ops; gops->cde = gp106_ops.cde; +#if defined(CONFIG_GK20A_CYCLE_STATS) + gops->css = gp106_ops.css; +#endif gops->xve = gp106_ops.xve; gops->falcon = gp106_ops.falcon; @@ -342,9 +355,6 @@ int gp106_init_hal(struct gk20a *g) gp106_init_regops(gops); gk20a_init_tsg_ops(gops); gk20a_init_pramin_ops(gops); -#if defined(CONFIG_GK20A_CYCLE_STATS) - gk20a_init_css_ops(gops); -#endif gp106_init_therm_ops(gops); g->name = "gp10x"; diff --git a/drivers/gpu/nvgpu/gp10b/hal_gp10b.c b/drivers/gpu/nvgpu/gp10b/hal_gp10b.c index 796d26dd..e526af4c 100644 --- a/drivers/gpu/nvgpu/gp10b/hal_gp10b.c +++ b/drivers/gpu/nvgpu/gp10b/hal_gp10b.c @@ -245,6 +245,16 @@ static const struct gpu_ops gp10b_ops = { .need_scatter_buffer = gp10b_need_scatter_buffer, .populate_scatter_buffer = gp10b_populate_scatter_buffer, }, +#if defined(CONFIG_GK20A_CYCLE_STATS) + .css = { + .enable_snapshot = css_hw_enable_snapshot, + .disable_snapshot = css_hw_disable_snapshot, + .check_data_available = css_hw_check_data_available, + .set_handled_snapshots = css_hw_set_handled_snapshots, + .allocate_perfmon_ids = css_gr_allocate_perfmon_ids, + .release_perfmon_ids = css_gr_release_perfmon_ids, + }, +#endif .falcon = { .falcon_hal_sw_init = gk20a_falcon_hal_sw_init, }, @@ -264,6 +274,9 @@ int gp10b_init_hal(struct gk20a *g) gops->debug = gp10b_ops.debug; gops->dbg_session_ops = gp10b_ops.dbg_session_ops; gops->cde = gp10b_ops.cde; +#if defined(CONFIG_GK20A_CYCLE_STATS) + gops->css = gp10b_ops.css; +#endif gops->falcon = gp10b_ops.falcon; /* Lone Functions */ @@ -323,9 +336,7 @@ int gp10b_init_hal(struct gk20a *g) gp10b_init_therm_ops(gops); gk20a_init_tsg_ops(gops); gk20a_init_pramin_ops(gops); -#if defined(CONFIG_GK20A_CYCLE_STATS) - gk20a_init_css_ops(gops); -#endif + g->name = "gp10b"; c->twod_class = FERMI_TWOD_A; -- cgit v1.2.2