From d859c5f4a03b975dc493f72a35016e83adad279a Mon Sep 17 00:00:00 2001 From: Vinod G Date: Tue, 10 Jul 2018 16:13:03 -0700 Subject: nvgpu: gv11b: Rearrange gr function Moved gv11b_detect_ecc_enabled_units function from gv11b.c to gr_gv11b.c, as this is being used only in gr_gv11b file. In order to avoid GR code touching fuse registers, as it need to include fuse HW headers in GR code, introduced two fuse HALs which are being called from GR code. is_opt_ecc_enable for checking whether ecc enable bit is set in fuse register and is_opt_feature_overide_disable for checking whether feature override disable bit is set in fuse register. Initialized fuse HAL functions for chips that make use of those HAL functions. JIRA NVGPU-615 Change-Id: Iafe5a3940bb19cb3da51e270403450b63c2f67a3 Signed-off-by: Vinod G Reviewed-on: https://git-master.nvidia.com/r/1775564 Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/gpu/nvgpu/gv11b/gr_gv11b.c | 116 +++++++++++++++++++++++++++++++++- drivers/gpu/nvgpu/gv11b/gv11b.c | 121 ------------------------------------ drivers/gpu/nvgpu/gv11b/gv11b.h | 1 - drivers/gpu/nvgpu/gv11b/hal_gv11b.c | 3 + 4 files changed, 118 insertions(+), 123 deletions(-) (limited to 'drivers/gpu/nvgpu/gv11b') diff --git a/drivers/gpu/nvgpu/gv11b/gr_gv11b.c b/drivers/gpu/nvgpu/gv11b/gr_gv11b.c index 6ceaa47a..d3fe5f65 100644 --- a/drivers/gpu/nvgpu/gv11b/gr_gv11b.c +++ b/drivers/gpu/nvgpu/gv11b/gr_gv11b.c @@ -4488,11 +4488,125 @@ static int gr_gv11b_ecc_scrub_sm_icahe(struct gk20a *g) scrub_mask, scrub_done); } +static void gr_gv11b_detect_ecc_enabled_units(struct gk20a *g) +{ + bool opt_ecc_en = g->ops.fuse.is_opt_ecc_enable(g); + bool opt_feature_fuses_override_disable = + g->ops.fuse.is_opt_feature_override_disable(g); + u32 fecs_feature_override_ecc = + gk20a_readl(g, + gr_fecs_feature_override_ecc_r()); + + if (opt_feature_fuses_override_disable) { + if (opt_ecc_en) { + __nvgpu_set_enabled(g, + NVGPU_ECC_ENABLED_SM_LRF, true); + __nvgpu_set_enabled(g, + NVGPU_ECC_ENABLED_SM_L1_DATA, true); + __nvgpu_set_enabled(g, + NVGPU_ECC_ENABLED_SM_L1_TAG, true); + __nvgpu_set_enabled(g, + NVGPU_ECC_ENABLED_SM_ICACHE, true); + __nvgpu_set_enabled(g, NVGPU_ECC_ENABLED_LTC, true); + __nvgpu_set_enabled(g, NVGPU_ECC_ENABLED_SM_CBU, true); + } + } else { + /* SM LRF */ + if (gr_fecs_feature_override_ecc_sm_lrf_override_v( + fecs_feature_override_ecc) == 1U) { + if (gr_fecs_feature_override_ecc_sm_lrf_v( + fecs_feature_override_ecc) == 1U) { + __nvgpu_set_enabled(g, + NVGPU_ECC_ENABLED_SM_LRF, true); + } + } else { + if (opt_ecc_en) { + __nvgpu_set_enabled(g, + NVGPU_ECC_ENABLED_SM_LRF, true); + } + } + /* SM L1 DATA*/ + if (gr_fecs_feature_override_ecc_sm_l1_data_override_v( + fecs_feature_override_ecc) == 1U) { + if (gr_fecs_feature_override_ecc_sm_l1_data_v( + fecs_feature_override_ecc) == 1U) { + __nvgpu_set_enabled(g, + NVGPU_ECC_ENABLED_SM_L1_DATA, true); + } + } else { + if (opt_ecc_en) { + __nvgpu_set_enabled(g, + NVGPU_ECC_ENABLED_SM_L1_DATA, true); + } + } + /* SM L1 TAG*/ + if (gr_fecs_feature_override_ecc_sm_l1_tag_override_v( + fecs_feature_override_ecc) == 1U) { + if (gr_fecs_feature_override_ecc_sm_l1_tag_v( + fecs_feature_override_ecc) == 1U) { + __nvgpu_set_enabled(g, + NVGPU_ECC_ENABLED_SM_L1_TAG, true); + } + } else { + if (opt_ecc_en) { + __nvgpu_set_enabled(g, + NVGPU_ECC_ENABLED_SM_L1_TAG, true); + } + } + /* SM ICACHE*/ + if ((gr_fecs_feature_override_ecc_1_sm_l0_icache_override_v( + fecs_feature_override_ecc) == 1U) && + (gr_fecs_feature_override_ecc_1_sm_l1_icache_override_v( + fecs_feature_override_ecc) == 1U)) { + if ((gr_fecs_feature_override_ecc_1_sm_l0_icache_v( + fecs_feature_override_ecc) == 1U) && + (gr_fecs_feature_override_ecc_1_sm_l1_icache_v( + fecs_feature_override_ecc) == 1U)) { + __nvgpu_set_enabled(g, + NVGPU_ECC_ENABLED_SM_ICACHE, true); + } + } else { + if (opt_ecc_en) { + __nvgpu_set_enabled(g, + NVGPU_ECC_ENABLED_SM_ICACHE, true); + } + } + /* LTC */ + if (gr_fecs_feature_override_ecc_ltc_override_v( + fecs_feature_override_ecc) == 1U) { + if (gr_fecs_feature_override_ecc_ltc_v( + fecs_feature_override_ecc) == 1U) { + __nvgpu_set_enabled(g, + NVGPU_ECC_ENABLED_LTC, true); + } + } else { + if (opt_ecc_en) { + __nvgpu_set_enabled(g, + NVGPU_ECC_ENABLED_LTC, true); + } + } + /* SM CBU */ + if (gr_fecs_feature_override_ecc_sm_cbu_override_v( + fecs_feature_override_ecc) == 1U) { + if (gr_fecs_feature_override_ecc_sm_cbu_v( + fecs_feature_override_ecc) == 1U) { + __nvgpu_set_enabled(g, + NVGPU_ECC_ENABLED_SM_CBU, true); + } + } else { + if (opt_ecc_en) { + __nvgpu_set_enabled(g, + NVGPU_ECC_ENABLED_SM_CBU, true); + } + } + } +} + void gr_gv11b_ecc_init_scrub_reg(struct gk20a *g) { nvgpu_log_fn(g, "ecc srub start "); - gv11b_detect_ecc_enabled_units(g); + gr_gv11b_detect_ecc_enabled_units(g); if (gr_gv11b_ecc_scrub_sm_lrf(g)) nvgpu_warn(g, "ECC SCRUB SM LRF Failed"); diff --git a/drivers/gpu/nvgpu/gv11b/gv11b.c b/drivers/gpu/nvgpu/gv11b/gv11b.c index 44120498..5d2bfbd7 100644 --- a/drivers/gpu/nvgpu/gv11b/gv11b.c +++ b/drivers/gpu/nvgpu/gv11b/gv11b.c @@ -25,128 +25,7 @@ #include #include "gk20a/gk20a.h" -#include "gp10b/gp10b.h" - #include "gv11b/gv11b.h" -#include -#include - -void gv11b_detect_ecc_enabled_units(struct gk20a *g) -{ - u32 opt_ecc_en = gk20a_readl(g, fuse_opt_ecc_en_r()); - u32 opt_feature_fuses_override_disable = - gk20a_readl(g, - fuse_opt_feature_fuses_override_disable_r()); - u32 fecs_feature_override_ecc = - gk20a_readl(g, - gr_fecs_feature_override_ecc_r()); - - if (opt_feature_fuses_override_disable) { - if (opt_ecc_en) { - __nvgpu_set_enabled(g, - NVGPU_ECC_ENABLED_SM_LRF, true); - __nvgpu_set_enabled(g, - NVGPU_ECC_ENABLED_SM_L1_DATA, true); - __nvgpu_set_enabled(g, - NVGPU_ECC_ENABLED_SM_L1_TAG, true); - __nvgpu_set_enabled(g, - NVGPU_ECC_ENABLED_SM_ICACHE, true); - __nvgpu_set_enabled(g, NVGPU_ECC_ENABLED_LTC, true); - __nvgpu_set_enabled(g, NVGPU_ECC_ENABLED_SM_CBU, true); - } - } else { - /* SM LRF */ - if (gr_fecs_feature_override_ecc_sm_lrf_override_v( - fecs_feature_override_ecc)) { - if (gr_fecs_feature_override_ecc_sm_lrf_v( - fecs_feature_override_ecc)) { - __nvgpu_set_enabled(g, - NVGPU_ECC_ENABLED_SM_LRF, true); - } - } else { - if (opt_ecc_en) { - __nvgpu_set_enabled(g, - NVGPU_ECC_ENABLED_SM_LRF, true); - } - } - /* SM L1 DATA*/ - if (gr_fecs_feature_override_ecc_sm_l1_data_override_v( - fecs_feature_override_ecc)) { - if (gr_fecs_feature_override_ecc_sm_l1_data_v( - fecs_feature_override_ecc)) { - __nvgpu_set_enabled(g, - NVGPU_ECC_ENABLED_SM_L1_DATA, true); - } - } else { - if (opt_ecc_en) { - __nvgpu_set_enabled(g, - NVGPU_ECC_ENABLED_SM_L1_DATA, true); - } - } - /* SM L1 TAG*/ - if (gr_fecs_feature_override_ecc_sm_l1_tag_override_v( - fecs_feature_override_ecc)) { - if (gr_fecs_feature_override_ecc_sm_l1_tag_v( - fecs_feature_override_ecc)) { - __nvgpu_set_enabled(g, - NVGPU_ECC_ENABLED_SM_L1_TAG, true); - } - } else { - if (opt_ecc_en) { - __nvgpu_set_enabled(g, - NVGPU_ECC_ENABLED_SM_L1_TAG, true); - } - } - /* SM ICACHE*/ - if (gr_fecs_feature_override_ecc_1_sm_l0_icache_override_v( - fecs_feature_override_ecc) && - gr_fecs_feature_override_ecc_1_sm_l1_icache_override_v( - fecs_feature_override_ecc)) { - if (gr_fecs_feature_override_ecc_1_sm_l0_icache_v( - fecs_feature_override_ecc) && - gr_fecs_feature_override_ecc_1_sm_l1_icache_v( - fecs_feature_override_ecc)) { - __nvgpu_set_enabled(g, - NVGPU_ECC_ENABLED_SM_ICACHE, true); - } - } else { - if (opt_ecc_en) { - __nvgpu_set_enabled(g, - NVGPU_ECC_ENABLED_SM_ICACHE, true); - } - } - /* LTC */ - if (gr_fecs_feature_override_ecc_ltc_override_v( - fecs_feature_override_ecc)) { - if (gr_fecs_feature_override_ecc_ltc_v( - fecs_feature_override_ecc)) { - __nvgpu_set_enabled(g, - NVGPU_ECC_ENABLED_LTC, true); - } - } else { - if (opt_ecc_en) { - __nvgpu_set_enabled(g, - NVGPU_ECC_ENABLED_LTC, true); - } - } - /* SM CBU */ - if (gr_fecs_feature_override_ecc_sm_cbu_override_v( - fecs_feature_override_ecc)) { - if (gr_fecs_feature_override_ecc_sm_cbu_v( - fecs_feature_override_ecc)) { - __nvgpu_set_enabled(g, - NVGPU_ECC_ENABLED_SM_CBU, true); - } - } else { - if (opt_ecc_en) { - __nvgpu_set_enabled(g, - NVGPU_ECC_ENABLED_SM_CBU, true); - } - } - } -} - - int gv11b_init_gpu_characteristics(struct gk20a *g) { diff --git a/drivers/gpu/nvgpu/gv11b/gv11b.h b/drivers/gpu/nvgpu/gv11b/gv11b.h index 17dfa7aa..3d5490e6 100644 --- a/drivers/gpu/nvgpu/gv11b/gv11b.h +++ b/drivers/gpu/nvgpu/gv11b/gv11b.h @@ -27,7 +27,6 @@ #include "gk20a/gk20a.h" -void gv11b_detect_ecc_enabled_units(struct gk20a *g); int gv11b_init_gpu_characteristics(struct gk20a *g); #endif /* GV11B_H */ diff --git a/drivers/gpu/nvgpu/gv11b/hal_gv11b.c b/drivers/gpu/nvgpu/gv11b/hal_gv11b.c index 325285a6..00367e5b 100644 --- a/drivers/gpu/nvgpu/gv11b/hal_gv11b.c +++ b/drivers/gpu/nvgpu/gv11b/hal_gv11b.c @@ -790,6 +790,9 @@ static const struct gpu_ops gv11b_ops = { }, .fuse = { .check_priv_security = gp10b_fuse_check_priv_security, + .is_opt_ecc_enable = gp10b_fuse_is_opt_ecc_enable, + .is_opt_feature_override_disable = + gp10b_fuse_is_opt_feature_override_disable, }, .chip_init_gpu_characteristics = gv11b_init_gpu_characteristics, .get_litter_value = gv11b_get_litter_value, -- cgit v1.2.2