summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gp10b/gr_gp10b.c
diff options
context:
space:
mode:
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}