summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gp10b/gr_gp10b.c
diff options
context:
space:
mode:
authorAdeel Raza <araza@nvidia.com>2016-05-03 20:42:07 -0400
committerDeepak Nibade <dnibade@nvidia.com>2016-12-27 04:54:54 -0500
commit869b4dd2748263a4c88569973a17c787834427c2 (patch)
treeb9599bb4723faa6c1d3880d1b4a6a2eee43bbc35 /drivers/gpu/nvgpu/gp10b/gr_gp10b.c
parentc09f0baf5bce8f2533c6df10ede5c1a40bf6d4e7 (diff)
gpu: nvgpu: add code to handle DT fuse overrides
Add code for handling GP10B fuse overrides specified in the device tree. Also add specific handling for the ECC fuse override. Bug 1699676 Change-Id: Ifa07983054cd143f7f1745a6a6de36f4d4e08126 Signed-off-by: Adeel Raza <araza@nvidia.com> Reviewed-on: http://git-master/r/1140893 Reviewed-by: Automatic_Commit_Validation_User GVS: Gerrit_Virtual_Submit Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gp10b/gr_gp10b.c')
-rw-r--r--drivers/gpu/nvgpu/gp10b/gr_gp10b.c45
1 files changed, 45 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/gp10b/gr_gp10b.c b/drivers/gpu/nvgpu/gp10b/gr_gp10b.c
index 8ea9235d..b36eff8f 100644
--- a/drivers/gpu/nvgpu/gp10b/gr_gp10b.c
+++ b/drivers/gpu/nvgpu/gp10b/gr_gp10b.c
@@ -17,6 +17,8 @@
17#include <linux/delay.h> 17#include <linux/delay.h>
18#include <linux/tegra-fuse.h> 18#include <linux/tegra-fuse.h>
19 19
20#include <dt-bindings/soc/gp10b-fuse.h>
21
20#include "gk20a/gr_gk20a.h" 22#include "gk20a/gr_gk20a.h"
21#include "gk20a/semaphore_gk20a.h" 23#include "gk20a/semaphore_gk20a.h"
22#include "gk20a/dbg_gpu_gk20a.h" 24#include "gk20a/dbg_gpu_gk20a.h"
@@ -1390,6 +1392,12 @@ static int gr_gp10b_init_fs_state(struct gk20a *g)
1390 gr_gpcs_tpcs_sm_disp_ctrl_re_suppress_disable_f()); 1392 gr_gpcs_tpcs_sm_disp_ctrl_re_suppress_disable_f());
1391 gk20a_writel(g, gr_gpcs_tpcs_sm_disp_ctrl_r(), data); 1393 gk20a_writel(g, gr_gpcs_tpcs_sm_disp_ctrl_r(), data);
1392 1394
1395 if (g->gr.t18x.fecs_feature_override_ecc_val != 0) {
1396 gk20a_writel(g,
1397 gr_fecs_feature_override_ecc_r(),
1398 g->gr.t18x.fecs_feature_override_ecc_val);
1399 }
1400
1393 return gr_gm20b_ctx_state_floorsweep(g); 1401 return gr_gm20b_ctx_state_floorsweep(g);
1394} 1402}
1395 1403
@@ -1989,6 +1997,42 @@ static int gr_gp10b_get_preemption_mode_flags(struct gk20a *g,
1989 1997
1990 return 0; 1998 return 0;
1991} 1999}
2000static int gp10b_gr_fuse_override(struct gk20a *g)
2001{
2002 struct device_node *np = g->dev->of_node;
2003 u32 *fuses;
2004 int count, i;
2005
2006 if (!np) /* may be pcie device */
2007 return 0;
2008
2009 count = of_property_count_elems_of_size(np, "fuse-overrides", 8);
2010 if (count <= 0)
2011 return count;
2012
2013 fuses = kmalloc(sizeof(u32) * count * 2, GFP_KERNEL);
2014 if (!fuses)
2015 return -ENOMEM;
2016 of_property_read_u32_array(np, "fuse-overrides", fuses, count * 2);
2017 for (i = 0; i < count; i++) {
2018 u32 fuse, value;
2019
2020 fuse = fuses[2 * i];
2021 value = fuses[2 * i + 1];
2022 switch (fuse) {
2023 case GP10B_FUSE_OPT_ECC_EN:
2024 g->gr.t18x.fecs_feature_override_ecc_val = value;
2025 break;
2026 default:
2027 gk20a_err(dev_from_gk20a(g),
2028 "ignore unknown fuse override %08x", fuse);
2029 break;
2030 }
2031 }
2032
2033 kfree(fuses);
2034 return 0;
2035}
1992 2036
1993void gp10b_init_gr(struct gpu_ops *gops) 2037void gp10b_init_gr(struct gpu_ops *gops)
1994{ 2038{
@@ -2031,4 +2075,5 @@ void gp10b_init_gr(struct gpu_ops *gops)
2031 gops->gr.suspend_contexts = gr_gp10b_suspend_contexts; 2075 gops->gr.suspend_contexts = gr_gp10b_suspend_contexts;
2032 gops->gr.set_preemption_mode = gr_gp10b_set_preemption_mode; 2076 gops->gr.set_preemption_mode = gr_gp10b_set_preemption_mode;
2033 gops->gr.get_preemption_mode_flags = gr_gp10b_get_preemption_mode_flags; 2077 gops->gr.get_preemption_mode_flags = gr_gp10b_get_preemption_mode_flags;
2078 gops->gr.fuse_override = gp10b_gr_fuse_override;
2034} 2079}