diff --git a/drivers/gpu/nvgpu/common/linux/module.c b/drivers/gpu/nvgpu/common/linux/module.c index 2e90fbe42..6b27c9f1e 100644 --- a/drivers/gpu/nvgpu/common/linux/module.c +++ b/drivers/gpu/nvgpu/common/linux/module.c @@ -25,6 +25,8 @@ #include #include #include +#include +#include #include #include @@ -994,6 +996,48 @@ static inline void set_gk20a(struct platform_device *pdev, struct gk20a *gk20a) gk20a_get_platform(&pdev->dev)->g = gk20a; } +static int nvgpu_read_fuse_overrides(struct gk20a *g) +{ + struct device_node *np = dev_from_gk20a(g)->of_node; + u32 *fuses; + int count, i; + + if (!np) /* may be pcie device */ + return 0; + + count = of_property_count_elems_of_size(np, "fuse-overrides", 8); + if (count <= 0) + return count; + + fuses = nvgpu_kmalloc(g, sizeof(u32) * count * 2); + if (!fuses) + return -ENOMEM; + of_property_read_u32_array(np, "fuse-overrides", fuses, count * 2); + for (i = 0; i < count; i++) { + u32 fuse, value; + + fuse = fuses[2 * i]; + value = fuses[2 * i + 1]; + switch (fuse) { + case GM20B_FUSE_OPT_TPC_DISABLE: + g->tpc_fs_mask_user = ~value; + break; +#ifdef CONFIG_ARCH_TEGRA_18x_SOC + case GP10B_FUSE_OPT_ECC_EN: + g->gr.t18x.fecs_feature_override_ecc_val = value; + break; +#endif + default: + nvgpu_err(g, "ignore unknown fuse override %08x", fuse); + break; + } + } + + nvgpu_kfree(g, fuses); + + return 0; +} + static int gk20a_probe(struct platform_device *dev) { struct nvgpu_os_linux *l; @@ -1077,6 +1121,8 @@ static int gk20a_probe(struct platform_device *dev) if (err) return err; + err = nvgpu_read_fuse_overrides(gk20a); + #ifdef CONFIG_RESET_CONTROLLER platform->reset_control = devm_reset_control_get(&dev->dev, NULL); if (IS_ERR(platform->reset_control)) diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.h b/drivers/gpu/nvgpu/gk20a/gk20a.h index 4a3443877..92b839780 100644 --- a/drivers/gpu/nvgpu/gk20a/gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/gk20a.h @@ -385,7 +385,6 @@ struct gpu_ops { void (*update_boosted_ctx)(struct gk20a *g, struct nvgpu_mem *mem, struct gr_ctx_desc *gr_ctx); - int (*fuse_override)(struct gk20a *g); void (*init_sm_id_table)(struct gk20a *g); int (*load_smid_config)(struct gk20a *g); void (*program_sm_id_numbering)(struct gk20a *g, diff --git a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c index d4d6cd2d3..73cfa3bf6 100644 --- a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c @@ -4813,9 +4813,6 @@ static int gk20a_init_gr_setup_sw(struct gk20a *g) return 0; } - if (g->ops.gr.fuse_override) - g->ops.gr.fuse_override(g); - gr->g = g; #if defined(CONFIG_GK20A_CYCLE_STATS) diff --git a/drivers/gpu/nvgpu/gm20b/gr_gm20b.c b/drivers/gpu/nvgpu/gm20b/gr_gm20b.c index 7ec8e2cbe..afe60b98e 100644 --- a/drivers/gpu/nvgpu/gm20b/gr_gm20b.c +++ b/drivers/gpu/nvgpu/gm20b/gr_gm20b.c @@ -22,8 +22,6 @@ * DEALINGS IN THE SOFTWARE. */ -#include - #include #include #include @@ -1423,52 +1421,6 @@ int gr_gm20b_get_preemption_mode_flags(struct gk20a *g, return 0; } -int gm20b_gr_tpc_disable_override(struct gk20a *g, u32 mask) -{ - if (!mask) - return 0; - - g->tpc_fs_mask_user = ~mask; - - return 0; -} - -int gm20b_gr_fuse_override(struct gk20a *g) -{ - struct device_node *np = dev_from_gk20a(g)->of_node; - u32 *fuses; - int count, i; - - if (!np) /* may be pcie device */ - return 0; - - count = of_property_count_elems_of_size(np, "fuse-overrides", 8); - if (count <= 0) - return count; - - fuses = nvgpu_kmalloc(g, sizeof(u32) * count * 2); - if (!fuses) - return -ENOMEM; - of_property_read_u32_array(np, "fuse-overrides", fuses, count * 2); - for (i = 0; i < count; i++) { - u32 fuse, value; - - fuse = fuses[2 * i]; - value = fuses[2 * i + 1]; - switch (fuse) { - case GM20B_FUSE_OPT_TPC_DISABLE: - gm20b_gr_tpc_disable_override(g, value); - break; - default: - nvgpu_err(g, "ignore unknown fuse override %08x", fuse); - break; - } - } - - nvgpu_kfree(g, fuses); - return 0; -} - bool gr_gm20b_is_ltcs_ltss_addr(struct gk20a *g, u32 addr) { u32 ltc_shared_base = ltc_ltcs_ltss_v(); diff --git a/drivers/gpu/nvgpu/gm20b/gr_gm20b.h b/drivers/gpu/nvgpu/gm20b/gr_gm20b.h index 15deaa0d5..18e6b032d 100644 --- a/drivers/gpu/nvgpu/gm20b/gr_gm20b.h +++ b/drivers/gpu/nvgpu/gm20b/gr_gm20b.h @@ -124,7 +124,6 @@ int gm20b_gr_clear_sm_error_state(struct gk20a *g, struct channel_gk20a *ch, u32 sm_id); int gr_gm20b_get_preemption_mode_flags(struct gk20a *g, struct nvgpu_preemption_modes_rec *preemption_modes_rec); -int gm20b_gr_fuse_override(struct gk20a *g); bool gr_gm20b_is_ltcs_ltss_addr(struct gk20a *g, u32 addr); bool gr_gm20b_is_ltcn_ltss_addr(struct gk20a *g, u32 addr); void gr_gm20b_split_lts_broadcast_addr(struct gk20a *g, u32 addr, diff --git a/drivers/gpu/nvgpu/gm20b/hal_gm20b.c b/drivers/gpu/nvgpu/gm20b/hal_gm20b.c index 69afb9bc4..4e214cc45 100644 --- a/drivers/gpu/nvgpu/gm20b/hal_gm20b.c +++ b/drivers/gpu/nvgpu/gm20b/hal_gm20b.c @@ -254,7 +254,6 @@ static const struct gpu_ops gm20b_ops = { .suspend_contexts = gr_gk20a_suspend_contexts, .resume_contexts = gr_gk20a_resume_contexts, .get_preemption_mode_flags = gr_gm20b_get_preemption_mode_flags, - .fuse_override = gm20b_gr_fuse_override, .init_sm_id_table = gr_gk20a_init_sm_id_table, .load_smid_config = gr_gm20b_load_smid_config, .program_sm_id_numbering = gr_gm20b_program_sm_id_numbering, diff --git a/drivers/gpu/nvgpu/gp106/hal_gp106.c b/drivers/gpu/nvgpu/gp106/hal_gp106.c index 0c431385d..5771e6e49 100644 --- a/drivers/gpu/nvgpu/gp106/hal_gp106.c +++ b/drivers/gpu/nvgpu/gp106/hal_gp106.c @@ -300,7 +300,6 @@ static const struct gpu_ops gp106_ops = { .suspend_contexts = gr_gp10b_suspend_contexts, .resume_contexts = gr_gk20a_resume_contexts, .get_preemption_mode_flags = gr_gp10b_get_preemption_mode_flags, - .fuse_override = gp10b_gr_fuse_override, .init_sm_id_table = gr_gk20a_init_sm_id_table, .load_smid_config = gr_gp10b_load_smid_config, .program_sm_id_numbering = gr_gm20b_program_sm_id_numbering, diff --git a/drivers/gpu/nvgpu/gp10b/gr_gp10b.c b/drivers/gpu/nvgpu/gp10b/gr_gp10b.c index 66d48e6ab..2fd393bd7 100644 --- a/drivers/gpu/nvgpu/gp10b/gr_gp10b.c +++ b/drivers/gpu/nvgpu/gp10b/gr_gp10b.c @@ -2291,45 +2291,6 @@ int gr_gp10b_get_preemption_mode_flags(struct gk20a *g, return 0; } -int gp10b_gr_fuse_override(struct gk20a *g) -{ - struct device_node *np = dev_from_gk20a(g)->of_node; - u32 *fuses; - int count, i; - - if (!np) /* may be pcie device */ - return 0; - - count = of_property_count_elems_of_size(np, "fuse-overrides", 8); - if (count <= 0) - return count; - - fuses = nvgpu_kmalloc(g, sizeof(u32) * count * 2); - if (!fuses) - return -ENOMEM; - of_property_read_u32_array(np, "fuse-overrides", fuses, count * 2); - for (i = 0; i < count; i++) { - u32 fuse, value; - - fuse = fuses[2 * i]; - value = fuses[2 * i + 1]; - switch (fuse) { - case GM20B_FUSE_OPT_TPC_DISABLE: - gm20b_gr_tpc_disable_override(g, value); - break; - case GP10B_FUSE_OPT_ECC_EN: - g->gr.t18x.fecs_feature_override_ecc_val = value; - break; - default: - nvgpu_err(g, "ignore unknown fuse override %08x", fuse); - break; - } - } - - nvgpu_kfree(g, fuses); - - return 0; -} int gr_gp10b_init_preemption_state(struct gk20a *g) { diff --git a/drivers/gpu/nvgpu/gp10b/hal_gp10b.c b/drivers/gpu/nvgpu/gp10b/hal_gp10b.c index a54a3297b..757eae040 100644 --- a/drivers/gpu/nvgpu/gp10b/hal_gp10b.c +++ b/drivers/gpu/nvgpu/gp10b/hal_gp10b.c @@ -263,7 +263,6 @@ static const struct gpu_ops gp10b_ops = { .suspend_contexts = gr_gp10b_suspend_contexts, .resume_contexts = gr_gk20a_resume_contexts, .get_preemption_mode_flags = gr_gp10b_get_preemption_mode_flags, - .fuse_override = gp10b_gr_fuse_override, .init_sm_id_table = gr_gk20a_init_sm_id_table, .load_smid_config = gr_gp10b_load_smid_config, .program_sm_id_numbering = gr_gm20b_program_sm_id_numbering, diff --git a/drivers/gpu/nvgpu/vgpu/gm20b/vgpu_hal_gm20b.c b/drivers/gpu/nvgpu/vgpu/gm20b/vgpu_hal_gm20b.c index 05295fa00..fd89e23c9 100644 --- a/drivers/gpu/nvgpu/vgpu/gm20b/vgpu_hal_gm20b.c +++ b/drivers/gpu/nvgpu/vgpu/gm20b/vgpu_hal_gm20b.c @@ -150,7 +150,6 @@ static const struct gpu_ops vgpu_gm20b_ops = { .suspend_contexts = vgpu_gr_suspend_contexts, .resume_contexts = vgpu_gr_resume_contexts, .get_preemption_mode_flags = gr_gm20b_get_preemption_mode_flags, - .fuse_override = gm20b_gr_fuse_override, .init_sm_id_table = gr_gk20a_init_sm_id_table, .load_smid_config = gr_gm20b_load_smid_config, .program_sm_id_numbering = gr_gm20b_program_sm_id_numbering, diff --git a/drivers/gpu/nvgpu/vgpu/gp10b/vgpu_hal_gp10b.c b/drivers/gpu/nvgpu/vgpu/gp10b/vgpu_hal_gp10b.c index 04fb286a1..fcb05937f 100644 --- a/drivers/gpu/nvgpu/vgpu/gp10b/vgpu_hal_gp10b.c +++ b/drivers/gpu/nvgpu/vgpu/gp10b/vgpu_hal_gp10b.c @@ -163,7 +163,6 @@ static const struct gpu_ops vgpu_gp10b_ops = { .suspend_contexts = vgpu_gr_suspend_contexts, .resume_contexts = vgpu_gr_resume_contexts, .get_preemption_mode_flags = gr_gp10b_get_preemption_mode_flags, - .fuse_override = gp10b_gr_fuse_override, .init_sm_id_table = gr_gk20a_init_sm_id_table, .load_smid_config = gr_gp10b_load_smid_config, .program_sm_id_numbering = gr_gm20b_program_sm_id_numbering,