diff --git a/drivers/gpu/nvgpu/common/nvlink/minion.c b/drivers/gpu/nvgpu/common/nvlink/minion.c index 82d3510db..7e3f25fae 100644 --- a/drivers/gpu/nvgpu/common/nvlink/minion.c +++ b/drivers/gpu/nvgpu/common/nvlink/minion.c @@ -59,8 +59,17 @@ int nvgpu_nvlink_minion_load(struct gk20a *g) return 0; } - /* get mem unlock ucode binary */ - nvgpu_minion_fw = nvgpu_request_firmware(g, "minion.bin", 0); + /* Get minion ucode binary */ + if (g->ops.nvlink.minion.is_debug_mode != NULL) { + if (g->ops.nvlink.minion.is_debug_mode(g)) { + nvgpu_minion_fw = nvgpu_request_firmware(g, + "dgpu_minion_debug.bin", 0); + } else { + nvgpu_minion_fw = nvgpu_request_firmware(g, + "dgpu_minion_prod.bin", 0); + } + } + if (nvgpu_minion_fw == NULL) { nvgpu_err(g, "minion ucode get fail"); err = -ENOENT; diff --git a/drivers/gpu/nvgpu/hal/init/hal_tu104.c b/drivers/gpu/nvgpu/hal/init/hal_tu104.c index bc1f3b393..ad756a927 100644 --- a/drivers/gpu/nvgpu/hal/init/hal_tu104.c +++ b/drivers/gpu/nvgpu/hal/init/hal_tu104.c @@ -1496,6 +1496,7 @@ static const struct gpu_ops tu104_ops = { .enable_link_intr = gv100_nvlink_minion_enable_link_intr, .falcon_isr = gv100_nvlink_minion_falcon_isr, .isr = gv100_nvlink_minion_isr, + .is_debug_mode = tu104_nvlink_minion_is_debug_mode, }, .intr = { .common_intr_enable = gv100_nvlink_common_intr_enable, diff --git a/drivers/gpu/nvgpu/hal/nvlink/minion_tu104.c b/drivers/gpu/nvgpu/hal/nvlink/minion_tu104.c index 61fe41b9a..5c4a8b36d 100644 --- a/drivers/gpu/nvgpu/hal/nvlink/minion_tu104.c +++ b/drivers/gpu/nvgpu/hal/nvlink/minion_tu104.c @@ -23,6 +23,7 @@ #ifdef CONFIG_NVGPU_NVLINK #include +#include #include "minion_gv100.h" #include "minion_tu104.h" @@ -60,4 +61,12 @@ u32 tu104_nvlink_minion_get_dlcmd_ordinal(struct gk20a *g, return dlcmd_ordinal; } +bool tu104_nvlink_minion_is_debug_mode(struct gk20a *g) +{ + u32 reg_val; + + reg_val = nvgpu_readl(g, minion_scp_ctl_stat_r()); + return (minion_scp_ctl_stat_debug_mode_v(reg_val) != 0U); +} + #endif /* CONFIG_NVGPU_NVLINK */ diff --git a/drivers/gpu/nvgpu/hal/nvlink/minion_tu104.h b/drivers/gpu/nvgpu/hal/nvlink/minion_tu104.h index c9ee0a3b3..218f7491f 100644 --- a/drivers/gpu/nvgpu/hal/nvlink/minion_tu104.h +++ b/drivers/gpu/nvgpu/hal/nvlink/minion_tu104.h @@ -30,4 +30,5 @@ struct gk20a; u32 tu104_nvlink_minion_get_dlcmd_ordinal(struct gk20a *g, enum nvgpu_nvlink_minion_dlcmd dlcmd); +bool tu104_nvlink_minion_is_debug_mode(struct gk20a *g); #endif /* MINION_TU104_H */ diff --git a/drivers/gpu/nvgpu/include/nvgpu/gk20a.h b/drivers/gpu/nvgpu/include/nvgpu/gk20a.h index f418b6a84..01ababd06 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/gk20a.h +++ b/drivers/gpu/nvgpu/include/nvgpu/gk20a.h @@ -566,6 +566,7 @@ struct gpu_ops { bool enable); void (*falcon_isr)(struct gk20a *g); void (*isr)(struct gk20a *g); + bool (*is_debug_mode)(struct gk20a *g); } minion; struct { void (*common_intr_enable)(struct gk20a *g,