summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVinod G <vinodg@nvidia.com>2018-07-10 19:13:03 -0400
committermobile promotions <svcmobile_promotions@nvidia.com>2018-07-19 03:06:43 -0400
commitd859c5f4a03b975dc493f72a35016e83adad279a (patch)
treee7a1242a1d130a726456cf3a928a34941aad98f4
parent74e1a11d840b3d7411b380c2e4e4c99126ea32a5 (diff)
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 <vinodg@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/1775564 Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
-rw-r--r--drivers/gpu/nvgpu/gk20a/gk20a.h2
-rw-r--r--drivers/gpu/nvgpu/gp106/hal_gp106.c4
-rw-r--r--drivers/gpu/nvgpu/gp10b/fuse_gp10b.c13
-rw-r--r--drivers/gpu/nvgpu/gp10b/fuse_gp10b.h4
-rw-r--r--drivers/gpu/nvgpu/gp10b/gp10b.c26
-rw-r--r--drivers/gpu/nvgpu/gp10b/gr_gp10b.c12
-rw-r--r--drivers/gpu/nvgpu/gp10b/hal_gp10b.c3
-rw-r--r--drivers/gpu/nvgpu/gv100/hal_gv100.c6
-rw-r--r--drivers/gpu/nvgpu/gv11b/gr_gv11b.c116
-rw-r--r--drivers/gpu/nvgpu/gv11b/gv11b.c121
-rw-r--r--drivers/gpu/nvgpu/gv11b/gv11b.h1
-rw-r--r--drivers/gpu/nvgpu/gv11b/hal_gv11b.c3
-rw-r--r--drivers/gpu/nvgpu/vgpu/gp10b/vgpu_hal_gp10b.c4
-rw-r--r--drivers/gpu/nvgpu/vgpu/gv11b/vgpu_hal_gv11b.c6
14 files changed, 177 insertions, 144 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.h b/drivers/gpu/nvgpu/gk20a/gk20a.h
index 4ff85ee3..d6e0342b 100644
--- a/drivers/gpu/nvgpu/gk20a/gk20a.h
+++ b/drivers/gpu/nvgpu/gk20a/gk20a.h
@@ -1246,6 +1246,8 @@ struct gpu_ops {
1246 } priv_ring; 1246 } priv_ring;
1247 struct { 1247 struct {
1248 int (*check_priv_security)(struct gk20a *g); 1248 int (*check_priv_security)(struct gk20a *g);
1249 bool (*is_opt_ecc_enable)(struct gk20a *g);
1250 bool (*is_opt_feature_override_disable)(struct gk20a *g);
1249 } fuse; 1251 } fuse;
1250 struct { 1252 struct {
1251 int (*init)(struct gk20a *g); 1253 int (*init)(struct gk20a *g);
diff --git a/drivers/gpu/nvgpu/gp106/hal_gp106.c b/drivers/gpu/nvgpu/gp106/hal_gp106.c
index 63e6206a..9490ec10 100644
--- a/drivers/gpu/nvgpu/gp106/hal_gp106.c
+++ b/drivers/gpu/nvgpu/gp106/hal_gp106.c
@@ -56,6 +56,7 @@
56#include "gp10b/pmu_gp10b.h" 56#include "gp10b/pmu_gp10b.h"
57#include "gp10b/gr_gp10b.h" 57#include "gp10b/gr_gp10b.h"
58#include "gp10b/priv_ring_gp10b.h" 58#include "gp10b/priv_ring_gp10b.h"
59#include "gp10b/fuse_gp10b.h"
59 60
60#include "gp106/fifo_gp106.h" 61#include "gp106/fifo_gp106.h"
61#include "gp106/regops_gp106.h" 62#include "gp106/regops_gp106.h"
@@ -781,6 +782,9 @@ static const struct gpu_ops gp106_ops = {
781 }, 782 },
782 .fuse = { 783 .fuse = {
783 .check_priv_security = gp106_fuse_check_priv_security, 784 .check_priv_security = gp106_fuse_check_priv_security,
785 .is_opt_ecc_enable = gp10b_fuse_is_opt_ecc_enable,
786 .is_opt_feature_override_disable =
787 gp10b_fuse_is_opt_feature_override_disable,
784 }, 788 },
785 .get_litter_value = gp106_get_litter_value, 789 .get_litter_value = gp106_get_litter_value,
786 .chip_init_gpu_characteristics = gp106_init_gpu_characteristics, 790 .chip_init_gpu_characteristics = gp106_init_gpu_characteristics,
diff --git a/drivers/gpu/nvgpu/gp10b/fuse_gp10b.c b/drivers/gpu/nvgpu/gp10b/fuse_gp10b.c
index c1fc6be7..52087676 100644
--- a/drivers/gpu/nvgpu/gp10b/fuse_gp10b.c
+++ b/drivers/gpu/nvgpu/gp10b/fuse_gp10b.c
@@ -1,7 +1,7 @@
1/* 1/*
2 * GP10B FUSE 2 * GP10B FUSE
3 * 3 *
4 * Copyright (c) 2017, NVIDIA CORPORATION. All rights reserved. 4 * Copyright (c) 2017-2018, NVIDIA CORPORATION. All rights reserved.
5 * 5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a 6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"), 7 * copy of this software and associated documentation files (the "Software"),
@@ -91,3 +91,14 @@ int gp10b_fuse_check_priv_security(struct gk20a *g)
91 91
92 return 0; 92 return 0;
93} 93}
94
95bool gp10b_fuse_is_opt_ecc_enable(struct gk20a *g)
96{
97 return gk20a_readl(g, fuse_opt_ecc_en_r()) != 0U;
98}
99
100bool gp10b_fuse_is_opt_feature_override_disable(struct gk20a *g)
101{
102 return gk20a_readl(g,
103 fuse_opt_feature_fuses_override_disable_r()) != 0U;
104}
diff --git a/drivers/gpu/nvgpu/gp10b/fuse_gp10b.h b/drivers/gpu/nvgpu/gp10b/fuse_gp10b.h
index 1acb45d1..d9037e22 100644
--- a/drivers/gpu/nvgpu/gp10b/fuse_gp10b.h
+++ b/drivers/gpu/nvgpu/gp10b/fuse_gp10b.h
@@ -1,7 +1,7 @@
1/* 1/*
2 * GP10B FUSE 2 * GP10B FUSE
3 * 3 *
4 * Copyright (c) 2017, NVIDIA CORPORATION. All rights reserved. 4 * Copyright (c) 2017-2018, NVIDIA CORPORATION. All rights reserved.
5 * 5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a 6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"), 7 * copy of this software and associated documentation files (the "Software"),
@@ -28,5 +28,7 @@
28struct gk20a; 28struct gk20a;
29 29
30int gp10b_fuse_check_priv_security(struct gk20a *g); 30int gp10b_fuse_check_priv_security(struct gk20a *g);
31bool gp10b_fuse_is_opt_ecc_enable(struct gk20a *g);
32bool gp10b_fuse_is_opt_feature_override_disable(struct gk20a *g);
31 33
32#endif 34#endif
diff --git a/drivers/gpu/nvgpu/gp10b/gp10b.c b/drivers/gpu/nvgpu/gp10b/gp10b.c
index 51dc4301..7991944c 100644
--- a/drivers/gpu/nvgpu/gp10b/gp10b.c
+++ b/drivers/gpu/nvgpu/gp10b/gp10b.c
@@ -1,7 +1,7 @@
1/* 1/*
2 * GP10B Graphics 2 * GP10B Graphics
3 * 3 *
4 * Copyright (c) 2016-2017, NVIDIA CORPORATION. All rights reserved. 4 * Copyright (c) 2016-2018, NVIDIA CORPORATION. All rights reserved.
5 * 5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a 6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"), 7 * copy of this software and associated documentation files (the "Software"),
@@ -28,15 +28,13 @@
28 28
29#include "gp10b.h" 29#include "gp10b.h"
30 30
31#include <nvgpu/hw/gp10b/hw_fuse_gp10b.h>
32#include <nvgpu/hw/gp10b/hw_gr_gp10b.h> 31#include <nvgpu/hw/gp10b/hw_gr_gp10b.h>
33 32
34static void gp10b_detect_ecc_enabled_units(struct gk20a *g) 33static void gp10b_detect_ecc_enabled_units(struct gk20a *g)
35{ 34{
36 u32 opt_ecc_en = gk20a_readl(g, fuse_opt_ecc_en_r()); 35 bool opt_ecc_en = g->ops.fuse.is_opt_ecc_enable(g);
37 u32 opt_feature_fuses_override_disable = 36 bool opt_feature_fuses_override_disable =
38 gk20a_readl(g, 37 g->ops.fuse.is_opt_feature_override_disable(g);
39 fuse_opt_feature_fuses_override_disable_r());
40 u32 fecs_feature_override_ecc = 38 u32 fecs_feature_override_ecc =
41 gk20a_readl(g, 39 gk20a_readl(g,
42 gr_fecs_feature_override_ecc_r()); 40 gr_fecs_feature_override_ecc_r());
@@ -51,9 +49,9 @@ static void gp10b_detect_ecc_enabled_units(struct gk20a *g)
51 } else { 49 } else {
52 /* SM LRF */ 50 /* SM LRF */
53 if (gr_fecs_feature_override_ecc_sm_lrf_override_v( 51 if (gr_fecs_feature_override_ecc_sm_lrf_override_v(
54 fecs_feature_override_ecc)) { 52 fecs_feature_override_ecc) == 1U) {
55 if (gr_fecs_feature_override_ecc_sm_lrf_v( 53 if (gr_fecs_feature_override_ecc_sm_lrf_v(
56 fecs_feature_override_ecc)) { 54 fecs_feature_override_ecc) == 1U) {
57 __nvgpu_set_enabled(g, 55 __nvgpu_set_enabled(g,
58 NVGPU_ECC_ENABLED_SM_LRF, true); 56 NVGPU_ECC_ENABLED_SM_LRF, true);
59 } 57 }
@@ -66,9 +64,9 @@ static void gp10b_detect_ecc_enabled_units(struct gk20a *g)
66 64
67 /* SM SHM */ 65 /* SM SHM */
68 if (gr_fecs_feature_override_ecc_sm_shm_override_v( 66 if (gr_fecs_feature_override_ecc_sm_shm_override_v(
69 fecs_feature_override_ecc)) { 67 fecs_feature_override_ecc) == 1U) {
70 if (gr_fecs_feature_override_ecc_sm_shm_v( 68 if (gr_fecs_feature_override_ecc_sm_shm_v(
71 fecs_feature_override_ecc)) { 69 fecs_feature_override_ecc) == 1U) {
72 __nvgpu_set_enabled(g, 70 __nvgpu_set_enabled(g,
73 NVGPU_ECC_ENABLED_SM_SHM, true); 71 NVGPU_ECC_ENABLED_SM_SHM, true);
74 } 72 }
@@ -81,9 +79,9 @@ static void gp10b_detect_ecc_enabled_units(struct gk20a *g)
81 79
82 /* TEX */ 80 /* TEX */
83 if (gr_fecs_feature_override_ecc_tex_override_v( 81 if (gr_fecs_feature_override_ecc_tex_override_v(
84 fecs_feature_override_ecc)) { 82 fecs_feature_override_ecc) == 1U) {
85 if (gr_fecs_feature_override_ecc_tex_v( 83 if (gr_fecs_feature_override_ecc_tex_v(
86 fecs_feature_override_ecc)) { 84 fecs_feature_override_ecc) == 1U) {
87 __nvgpu_set_enabled(g, 85 __nvgpu_set_enabled(g,
88 NVGPU_ECC_ENABLED_TEX, true); 86 NVGPU_ECC_ENABLED_TEX, true);
89 } 87 }
@@ -96,9 +94,9 @@ static void gp10b_detect_ecc_enabled_units(struct gk20a *g)
96 94
97 /* LTC */ 95 /* LTC */
98 if (gr_fecs_feature_override_ecc_ltc_override_v( 96 if (gr_fecs_feature_override_ecc_ltc_override_v(
99 fecs_feature_override_ecc)) { 97 fecs_feature_override_ecc) == 1U) {
100 if (gr_fecs_feature_override_ecc_ltc_v( 98 if (gr_fecs_feature_override_ecc_ltc_v(
101 fecs_feature_override_ecc)) { 99 fecs_feature_override_ecc) == 1U) {
102 __nvgpu_set_enabled(g, 100 __nvgpu_set_enabled(g,
103 NVGPU_ECC_ENABLED_LTC, true); 101 NVGPU_ECC_ENABLED_LTC, true);
104 } 102 }
diff --git a/drivers/gpu/nvgpu/gp10b/gr_gp10b.c b/drivers/gpu/nvgpu/gp10b/gr_gp10b.c
index 424c8490..16eddeca 100644
--- a/drivers/gpu/nvgpu/gp10b/gr_gp10b.c
+++ b/drivers/gpu/nvgpu/gp10b/gr_gp10b.c
@@ -43,7 +43,6 @@
43#include <nvgpu/hw/gp10b/hw_fifo_gp10b.h> 43#include <nvgpu/hw/gp10b/hw_fifo_gp10b.h>
44#include <nvgpu/hw/gp10b/hw_ctxsw_prog_gp10b.h> 44#include <nvgpu/hw/gp10b/hw_ctxsw_prog_gp10b.h>
45#include <nvgpu/hw/gp10b/hw_mc_gp10b.h> 45#include <nvgpu/hw/gp10b/hw_mc_gp10b.h>
46#include <nvgpu/hw/gp10b/hw_fuse_gp10b.h>
47 46
48#define GFXP_WFI_TIMEOUT_COUNT_DEFAULT 100000 47#define GFXP_WFI_TIMEOUT_COUNT_DEFAULT 100000
49 48
@@ -2022,11 +2021,14 @@ u32 gp10b_gr_get_sm_hww_warp_esr(struct gk20a *g,
2022 2021
2023u32 get_ecc_override_val(struct gk20a *g) 2022u32 get_ecc_override_val(struct gk20a *g)
2024{ 2023{
2025 u32 val; 2024 bool en = false;
2026 2025
2027 val = gk20a_readl(g, fuse_opt_ecc_en_r()); 2026 if (g->ops.fuse.is_opt_ecc_enable) {
2028 if (val) 2027 en = g->ops.fuse.is_opt_ecc_enable(g);
2029 return gk20a_readl(g, gr_fecs_feature_override_ecc_r()); 2028 if (en) {
2029 return gk20a_readl(g, gr_fecs_feature_override_ecc_r());
2030 }
2031 }
2030 2032
2031 return 0; 2033 return 0;
2032} 2034}
diff --git a/drivers/gpu/nvgpu/gp10b/hal_gp10b.c b/drivers/gpu/nvgpu/gp10b/hal_gp10b.c
index bbfce287..94adf727 100644
--- a/drivers/gpu/nvgpu/gp10b/hal_gp10b.c
+++ b/drivers/gpu/nvgpu/gp10b/hal_gp10b.c
@@ -694,6 +694,9 @@ static const struct gpu_ops gp10b_ops = {
694 }, 694 },
695 .fuse = { 695 .fuse = {
696 .check_priv_security = gp10b_fuse_check_priv_security, 696 .check_priv_security = gp10b_fuse_check_priv_security,
697 .is_opt_ecc_enable = gp10b_fuse_is_opt_ecc_enable,
698 .is_opt_feature_override_disable =
699 gp10b_fuse_is_opt_feature_override_disable,
697 }, 700 },
698 .chip_init_gpu_characteristics = gp10b_init_gpu_characteristics, 701 .chip_init_gpu_characteristics = gp10b_init_gpu_characteristics,
699 .get_litter_value = gp10b_get_litter_value, 702 .get_litter_value = gp10b_get_litter_value,
diff --git a/drivers/gpu/nvgpu/gv100/hal_gv100.c b/drivers/gpu/nvgpu/gv100/hal_gv100.c
index 6f340e6a..ebcab011 100644
--- a/drivers/gpu/nvgpu/gv100/hal_gv100.c
+++ b/drivers/gpu/nvgpu/gv100/hal_gv100.c
@@ -73,6 +73,7 @@
73#include "gp10b/fecs_trace_gp10b.h" 73#include "gp10b/fecs_trace_gp10b.h"
74#include "gp10b/mm_gp10b.h" 74#include "gp10b/mm_gp10b.h"
75#include "gp10b/pmu_gp10b.h" 75#include "gp10b/pmu_gp10b.h"
76#include "gp10b/fuse_gp10b.h"
76 77
77#include "gv11b/css_gr_gv11b.h" 78#include "gv11b/css_gr_gv11b.h"
78#include "gv11b/dbg_gpu_gv11b.h" 79#include "gv11b/dbg_gpu_gv11b.h"
@@ -872,6 +873,11 @@ static const struct gpu_ops gv100_ops = {
872 .set_ppriv_timeout_settings = 873 .set_ppriv_timeout_settings =
873 gk20a_priv_set_timeout_settings, 874 gk20a_priv_set_timeout_settings,
874 }, 875 },
876 .fuse = {
877 .is_opt_ecc_enable = gp10b_fuse_is_opt_ecc_enable,
878 .is_opt_feature_override_disable =
879 gp10b_fuse_is_opt_feature_override_disable,
880 },
875#if defined(CONFIG_TEGRA_NVLINK) 881#if defined(CONFIG_TEGRA_NVLINK)
876 .nvlink = { 882 .nvlink = {
877 .discover_ioctrl = gv100_nvlink_discover_ioctrl, 883 .discover_ioctrl = gv100_nvlink_discover_ioctrl,
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)
4488 scrub_mask, scrub_done); 4488 scrub_mask, scrub_done);
4489} 4489}
4490 4490
4491static void gr_gv11b_detect_ecc_enabled_units(struct gk20a *g)
4492{
4493 bool opt_ecc_en = g->ops.fuse.is_opt_ecc_enable(g);
4494 bool opt_feature_fuses_override_disable =
4495 g->ops.fuse.is_opt_feature_override_disable(g);
4496 u32 fecs_feature_override_ecc =
4497 gk20a_readl(g,
4498 gr_fecs_feature_override_ecc_r());
4499
4500 if (opt_feature_fuses_override_disable) {
4501 if (opt_ecc_en) {
4502 __nvgpu_set_enabled(g,
4503 NVGPU_ECC_ENABLED_SM_LRF, true);
4504 __nvgpu_set_enabled(g,
4505 NVGPU_ECC_ENABLED_SM_L1_DATA, true);
4506 __nvgpu_set_enabled(g,
4507 NVGPU_ECC_ENABLED_SM_L1_TAG, true);
4508 __nvgpu_set_enabled(g,
4509 NVGPU_ECC_ENABLED_SM_ICACHE, true);
4510 __nvgpu_set_enabled(g, NVGPU_ECC_ENABLED_LTC, true);
4511 __nvgpu_set_enabled(g, NVGPU_ECC_ENABLED_SM_CBU, true);
4512 }
4513 } else {
4514 /* SM LRF */
4515 if (gr_fecs_feature_override_ecc_sm_lrf_override_v(
4516 fecs_feature_override_ecc) == 1U) {
4517 if (gr_fecs_feature_override_ecc_sm_lrf_v(
4518 fecs_feature_override_ecc) == 1U) {
4519 __nvgpu_set_enabled(g,
4520 NVGPU_ECC_ENABLED_SM_LRF, true);
4521 }
4522 } else {
4523 if (opt_ecc_en) {
4524 __nvgpu_set_enabled(g,
4525 NVGPU_ECC_ENABLED_SM_LRF, true);
4526 }
4527 }
4528 /* SM L1 DATA*/
4529 if (gr_fecs_feature_override_ecc_sm_l1_data_override_v(
4530 fecs_feature_override_ecc) == 1U) {
4531 if (gr_fecs_feature_override_ecc_sm_l1_data_v(
4532 fecs_feature_override_ecc) == 1U) {
4533 __nvgpu_set_enabled(g,
4534 NVGPU_ECC_ENABLED_SM_L1_DATA, true);
4535 }
4536 } else {
4537 if (opt_ecc_en) {
4538 __nvgpu_set_enabled(g,
4539 NVGPU_ECC_ENABLED_SM_L1_DATA, true);
4540 }
4541 }
4542 /* SM L1 TAG*/
4543 if (gr_fecs_feature_override_ecc_sm_l1_tag_override_v(
4544 fecs_feature_override_ecc) == 1U) {
4545 if (gr_fecs_feature_override_ecc_sm_l1_tag_v(
4546 fecs_feature_override_ecc) == 1U) {
4547 __nvgpu_set_enabled(g,
4548 NVGPU_ECC_ENABLED_SM_L1_TAG, true);
4549 }
4550 } else {
4551 if (opt_ecc_en) {
4552 __nvgpu_set_enabled(g,
4553 NVGPU_ECC_ENABLED_SM_L1_TAG, true);
4554 }
4555 }
4556 /* SM ICACHE*/
4557 if ((gr_fecs_feature_override_ecc_1_sm_l0_icache_override_v(
4558 fecs_feature_override_ecc) == 1U) &&
4559 (gr_fecs_feature_override_ecc_1_sm_l1_icache_override_v(
4560 fecs_feature_override_ecc) == 1U)) {
4561 if ((gr_fecs_feature_override_ecc_1_sm_l0_icache_v(
4562 fecs_feature_override_ecc) == 1U) &&
4563 (gr_fecs_feature_override_ecc_1_sm_l1_icache_v(
4564 fecs_feature_override_ecc) == 1U)) {
4565 __nvgpu_set_enabled(g,
4566 NVGPU_ECC_ENABLED_SM_ICACHE, true);
4567 }
4568 } else {
4569 if (opt_ecc_en) {
4570 __nvgpu_set_enabled(g,
4571 NVGPU_ECC_ENABLED_SM_ICACHE, true);
4572 }
4573 }
4574 /* LTC */
4575 if (gr_fecs_feature_override_ecc_ltc_override_v(
4576 fecs_feature_override_ecc) == 1U) {
4577 if (gr_fecs_feature_override_ecc_ltc_v(
4578 fecs_feature_override_ecc) == 1U) {
4579 __nvgpu_set_enabled(g,
4580 NVGPU_ECC_ENABLED_LTC, true);
4581 }
4582 } else {
4583 if (opt_ecc_en) {
4584 __nvgpu_set_enabled(g,
4585 NVGPU_ECC_ENABLED_LTC, true);
4586 }
4587 }
4588 /* SM CBU */
4589 if (gr_fecs_feature_override_ecc_sm_cbu_override_v(
4590 fecs_feature_override_ecc) == 1U) {
4591 if (gr_fecs_feature_override_ecc_sm_cbu_v(
4592 fecs_feature_override_ecc) == 1U) {
4593 __nvgpu_set_enabled(g,
4594 NVGPU_ECC_ENABLED_SM_CBU, true);
4595 }
4596 } else {
4597 if (opt_ecc_en) {
4598 __nvgpu_set_enabled(g,
4599 NVGPU_ECC_ENABLED_SM_CBU, true);
4600 }
4601 }
4602 }
4603}
4604
4491void gr_gv11b_ecc_init_scrub_reg(struct gk20a *g) 4605void gr_gv11b_ecc_init_scrub_reg(struct gk20a *g)
4492{ 4606{
4493 nvgpu_log_fn(g, "ecc srub start "); 4607 nvgpu_log_fn(g, "ecc srub start ");
4494 4608
4495 gv11b_detect_ecc_enabled_units(g); 4609 gr_gv11b_detect_ecc_enabled_units(g);
4496 4610
4497 if (gr_gv11b_ecc_scrub_sm_lrf(g)) 4611 if (gr_gv11b_ecc_scrub_sm_lrf(g))
4498 nvgpu_warn(g, "ECC SCRUB SM LRF Failed"); 4612 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 @@
25#include <nvgpu/enabled.h> 25#include <nvgpu/enabled.h>
26 26
27#include "gk20a/gk20a.h" 27#include "gk20a/gk20a.h"
28#include "gp10b/gp10b.h"
29
30#include "gv11b/gv11b.h" 28#include "gv11b/gv11b.h"
31#include <nvgpu/hw/gv11b/hw_fuse_gv11b.h>
32#include <nvgpu/hw/gv11b/hw_gr_gv11b.h>
33
34void gv11b_detect_ecc_enabled_units(struct gk20a *g)
35{
36 u32 opt_ecc_en = gk20a_readl(g, fuse_opt_ecc_en_r());
37 u32 opt_feature_fuses_override_disable =
38 gk20a_readl(g,
39 fuse_opt_feature_fuses_override_disable_r());
40 u32 fecs_feature_override_ecc =
41 gk20a_readl(g,
42 gr_fecs_feature_override_ecc_r());
43
44 if (opt_feature_fuses_override_disable) {
45 if (opt_ecc_en) {
46 __nvgpu_set_enabled(g,
47 NVGPU_ECC_ENABLED_SM_LRF, true);
48 __nvgpu_set_enabled(g,
49 NVGPU_ECC_ENABLED_SM_L1_DATA, true);
50 __nvgpu_set_enabled(g,
51 NVGPU_ECC_ENABLED_SM_L1_TAG, true);
52 __nvgpu_set_enabled(g,
53 NVGPU_ECC_ENABLED_SM_ICACHE, true);
54 __nvgpu_set_enabled(g, NVGPU_ECC_ENABLED_LTC, true);
55 __nvgpu_set_enabled(g, NVGPU_ECC_ENABLED_SM_CBU, true);
56 }
57 } else {
58 /* SM LRF */
59 if (gr_fecs_feature_override_ecc_sm_lrf_override_v(
60 fecs_feature_override_ecc)) {
61 if (gr_fecs_feature_override_ecc_sm_lrf_v(
62 fecs_feature_override_ecc)) {
63 __nvgpu_set_enabled(g,
64 NVGPU_ECC_ENABLED_SM_LRF, true);
65 }
66 } else {
67 if (opt_ecc_en) {
68 __nvgpu_set_enabled(g,
69 NVGPU_ECC_ENABLED_SM_LRF, true);
70 }
71 }
72 /* SM L1 DATA*/
73 if (gr_fecs_feature_override_ecc_sm_l1_data_override_v(
74 fecs_feature_override_ecc)) {
75 if (gr_fecs_feature_override_ecc_sm_l1_data_v(
76 fecs_feature_override_ecc)) {
77 __nvgpu_set_enabled(g,
78 NVGPU_ECC_ENABLED_SM_L1_DATA, true);
79 }
80 } else {
81 if (opt_ecc_en) {
82 __nvgpu_set_enabled(g,
83 NVGPU_ECC_ENABLED_SM_L1_DATA, true);
84 }
85 }
86 /* SM L1 TAG*/
87 if (gr_fecs_feature_override_ecc_sm_l1_tag_override_v(
88 fecs_feature_override_ecc)) {
89 if (gr_fecs_feature_override_ecc_sm_l1_tag_v(
90 fecs_feature_override_ecc)) {
91 __nvgpu_set_enabled(g,
92 NVGPU_ECC_ENABLED_SM_L1_TAG, true);
93 }
94 } else {
95 if (opt_ecc_en) {
96 __nvgpu_set_enabled(g,
97 NVGPU_ECC_ENABLED_SM_L1_TAG, true);
98 }
99 }
100 /* SM ICACHE*/
101 if (gr_fecs_feature_override_ecc_1_sm_l0_icache_override_v(
102 fecs_feature_override_ecc) &&
103 gr_fecs_feature_override_ecc_1_sm_l1_icache_override_v(
104 fecs_feature_override_ecc)) {
105 if (gr_fecs_feature_override_ecc_1_sm_l0_icache_v(
106 fecs_feature_override_ecc) &&
107 gr_fecs_feature_override_ecc_1_sm_l1_icache_v(
108 fecs_feature_override_ecc)) {
109 __nvgpu_set_enabled(g,
110 NVGPU_ECC_ENABLED_SM_ICACHE, true);
111 }
112 } else {
113 if (opt_ecc_en) {
114 __nvgpu_set_enabled(g,
115 NVGPU_ECC_ENABLED_SM_ICACHE, true);
116 }
117 }
118 /* LTC */
119 if (gr_fecs_feature_override_ecc_ltc_override_v(
120 fecs_feature_override_ecc)) {
121 if (gr_fecs_feature_override_ecc_ltc_v(
122 fecs_feature_override_ecc)) {
123 __nvgpu_set_enabled(g,
124 NVGPU_ECC_ENABLED_LTC, true);
125 }
126 } else {
127 if (opt_ecc_en) {
128 __nvgpu_set_enabled(g,
129 NVGPU_ECC_ENABLED_LTC, true);
130 }
131 }
132 /* SM CBU */
133 if (gr_fecs_feature_override_ecc_sm_cbu_override_v(
134 fecs_feature_override_ecc)) {
135 if (gr_fecs_feature_override_ecc_sm_cbu_v(
136 fecs_feature_override_ecc)) {
137 __nvgpu_set_enabled(g,
138 NVGPU_ECC_ENABLED_SM_CBU, true);
139 }
140 } else {
141 if (opt_ecc_en) {
142 __nvgpu_set_enabled(g,
143 NVGPU_ECC_ENABLED_SM_CBU, true);
144 }
145 }
146 }
147}
148
149
150 29
151int gv11b_init_gpu_characteristics(struct gk20a *g) 30int gv11b_init_gpu_characteristics(struct gk20a *g)
152{ 31{
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 @@
27 27
28#include "gk20a/gk20a.h" 28#include "gk20a/gk20a.h"
29 29
30void gv11b_detect_ecc_enabled_units(struct gk20a *g);
31int gv11b_init_gpu_characteristics(struct gk20a *g); 30int gv11b_init_gpu_characteristics(struct gk20a *g);
32 31
33#endif /* GV11B_H */ 32#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 = {
790 }, 790 },
791 .fuse = { 791 .fuse = {
792 .check_priv_security = gp10b_fuse_check_priv_security, 792 .check_priv_security = gp10b_fuse_check_priv_security,
793 .is_opt_ecc_enable = gp10b_fuse_is_opt_ecc_enable,
794 .is_opt_feature_override_disable =
795 gp10b_fuse_is_opt_feature_override_disable,
793 }, 796 },
794 .chip_init_gpu_characteristics = gv11b_init_gpu_characteristics, 797 .chip_init_gpu_characteristics = gv11b_init_gpu_characteristics,
795 .get_litter_value = gv11b_get_litter_value, 798 .get_litter_value = gv11b_get_litter_value,
diff --git a/drivers/gpu/nvgpu/vgpu/gp10b/vgpu_hal_gp10b.c b/drivers/gpu/nvgpu/vgpu/gp10b/vgpu_hal_gp10b.c
index 421f3692..090ac7b4 100644
--- a/drivers/gpu/nvgpu/vgpu/gp10b/vgpu_hal_gp10b.c
+++ b/drivers/gpu/nvgpu/vgpu/gp10b/vgpu_hal_gp10b.c
@@ -56,6 +56,7 @@
56#include "gp10b/regops_gp10b.h" 56#include "gp10b/regops_gp10b.h"
57#include "gp10b/therm_gp10b.h" 57#include "gp10b/therm_gp10b.h"
58#include "gp10b/priv_ring_gp10b.h" 58#include "gp10b/priv_ring_gp10b.h"
59#include "gp10b/fuse_gp10b.h"
59 60
60#include "gm20b/ltc_gm20b.h" 61#include "gm20b/ltc_gm20b.h"
61#include "gm20b/gr_gm20b.h" 62#include "gm20b/gr_gm20b.h"
@@ -559,6 +560,9 @@ static const struct gpu_ops vgpu_gp10b_ops = {
559 }, 560 },
560 .fuse = { 561 .fuse = {
561 .check_priv_security = vgpu_gp10b_fuse_check_priv_security, 562 .check_priv_security = vgpu_gp10b_fuse_check_priv_security,
563 .is_opt_ecc_enable = gp10b_fuse_is_opt_ecc_enable,
564 .is_opt_feature_override_disable =
565 gp10b_fuse_is_opt_feature_override_disable,
562 }, 566 },
563 .chip_init_gpu_characteristics = vgpu_init_gpu_characteristics, 567 .chip_init_gpu_characteristics = vgpu_init_gpu_characteristics,
564 .get_litter_value = gp10b_get_litter_value, 568 .get_litter_value = gp10b_get_litter_value,
diff --git a/drivers/gpu/nvgpu/vgpu/gv11b/vgpu_hal_gv11b.c b/drivers/gpu/nvgpu/vgpu/gv11b/vgpu_hal_gv11b.c
index 38f9a184..386389b7 100644
--- a/drivers/gpu/nvgpu/vgpu/gv11b/vgpu_hal_gv11b.c
+++ b/drivers/gpu/nvgpu/vgpu/gv11b/vgpu_hal_gv11b.c
@@ -64,6 +64,7 @@
64#include <gp10b/therm_gp10b.h> 64#include <gp10b/therm_gp10b.h>
65#include <gp10b/priv_ring_gp10b.h> 65#include <gp10b/priv_ring_gp10b.h>
66#include <gp10b/ltc_gp10b.h> 66#include <gp10b/ltc_gp10b.h>
67#include <gp10b/fuse_gp10b.h>
67 68
68#include <gp106/pmu_gp106.h> 69#include <gp106/pmu_gp106.h>
69#include <gp106/acr_gp106.h> 70#include <gp106/acr_gp106.h>
@@ -628,6 +629,11 @@ static const struct gpu_ops vgpu_gv11b_ops = {
628 .set_ppriv_timeout_settings = 629 .set_ppriv_timeout_settings =
629 gk20a_priv_set_timeout_settings, 630 gk20a_priv_set_timeout_settings,
630 }, 631 },
632 .fuse = {
633 .is_opt_ecc_enable = gp10b_fuse_is_opt_ecc_enable,
634 .is_opt_feature_override_disable =
635 gp10b_fuse_is_opt_feature_override_disable,
636 },
631 .chip_init_gpu_characteristics = vgpu_gv11b_init_gpu_characteristics, 637 .chip_init_gpu_characteristics = vgpu_gv11b_init_gpu_characteristics,
632 .get_litter_value = gv11b_get_litter_value, 638 .get_litter_value = gv11b_get_litter_value,
633}; 639};