diff --git a/drivers/gpu/nvgpu/Makefile b/drivers/gpu/nvgpu/Makefile index 1b7dbd268..bf02affe4 100644 --- a/drivers/gpu/nvgpu/Makefile +++ b/drivers/gpu/nvgpu/Makefile @@ -203,6 +203,7 @@ nvgpu-y += \ common/vbios/bios.o \ common/falcon/falcon.o \ common/falcon/falcon_queue.o \ + common/init/hal_init.o \ common/pmu/pmu.o \ common/pmu/pmu_ipc.o \ common/pmu/pmu_fw.o \ @@ -237,7 +238,6 @@ nvgpu-y += \ gk20a/fence_gk20a.o \ gk20a/gr_ctx_gk20a_sim.o \ gk20a/gr_ctx_gk20a.o \ - gk20a/hal.o \ gk20a/tsg_gk20a.o \ gk20a/fecs_trace_gk20a.o \ gm20b/hal_gm20b.o \ diff --git a/drivers/gpu/nvgpu/Makefile.sources b/drivers/gpu/nvgpu/Makefile.sources index 5c15ebd0d..4e67434d2 100644 --- a/drivers/gpu/nvgpu/Makefile.sources +++ b/drivers/gpu/nvgpu/Makefile.sources @@ -68,6 +68,7 @@ srcs := os/posix/nvgpu.c \ common/fb/fb_gp106.c \ common/fb/fb_gv100.c \ common/fb/fb_gv11b.c \ + common/init/hal_init.c \ common/xve/xve_gp106.c \ common/therm/therm.c \ common/therm/therm_gm20b.c \ @@ -157,7 +158,6 @@ srcs := os/posix/nvgpu.c \ gk20a/fence_gk20a.c \ gk20a/gr_ctx_gk20a_sim.c \ gk20a/gr_ctx_gk20a.c \ - gk20a/hal.c \ gk20a/tsg_gk20a.c \ gm20b/hal_gm20b.c \ gm20b/gr_gm20b.c \ diff --git a/drivers/gpu/nvgpu/gk20a/hal.c b/drivers/gpu/nvgpu/common/init/hal_init.c similarity index 65% rename from drivers/gpu/nvgpu/gk20a/hal.c rename to drivers/gpu/nvgpu/common/init/hal_init.c index f2f55d435..598790b6a 100644 --- a/drivers/gpu/nvgpu/gk20a/hal.c +++ b/drivers/gpu/nvgpu/common/init/hal_init.c @@ -22,8 +22,12 @@ * DEALINGS IN THE SOFTWARE. */ -#include "gk20a.h" -#include "hal.h" +#include +#include +#include +#include +#include + #include "gm20b/hal_gm20b.h" #include "gp10b/hal_gp10b.h" #include "gp106/hal_gp106.h" @@ -33,52 +37,86 @@ #include "nvgpu_gpuid_next.h" #endif -#include - -int gpu_init_hal(struct gk20a *g) +int nvgpu_init_hal(struct gk20a *g) { + int err = 0; u32 ver = g->params.gpu_arch + g->params.gpu_impl; + switch (ver) { case GK20A_GPUID_GM20B: + nvgpu_log_info(g, "gm20b detected"); + if (gm20b_init_hal(g) != 0) { + return -ENODEV; + } + break; case GK20A_GPUID_GM20B_B: nvgpu_log_info(g, "gm20b detected"); - if (gm20b_init_hal(g)) { + if (gm20b_init_hal(g) != 0) { return -ENODEV; } break; case NVGPU_GPUID_GP10B: - if (gp10b_init_hal(g)) { + if (gp10b_init_hal(g) != 0) { return -ENODEV; } break; case NVGPU_GPUID_GP104: + if (gp106_init_hal(g) != 0) { + return -ENODEV; + } + break; case NVGPU_GPUID_GP106: - if (gp106_init_hal(g)) { + if (gp106_init_hal(g) != 0) { return -ENODEV; } break; case NVGPU_GPUID_GV11B: - if (gv11b_init_hal(g)) { + if (gv11b_init_hal(g) != 0) { return -ENODEV; } break; case NVGPU_GPUID_GV100: - if (gv100_init_hal(g)) { + if (gv100_init_hal(g) != 0) { return -ENODEV; } break; #if defined(CONFIG_TEGRA_GPU_NEXT) case NVGPU_GPUID_NEXT: - if (NVGPU_NEXT_INIT_HAL(g)) { + if (NVGPU_NEXT_INIT_HAL(g) != 0) { return -ENODEV; } break; #endif - default: nvgpu_err(g, "no support for %x", ver); - return -ENODEV; + err = -ENODEV; + break; } - return 0; + return err; +} + + +int nvgpu_detect_chip(struct gk20a *g) +{ + struct nvgpu_gpu_params *p = &g->params; + + if (p->gpu_arch != 0U) { + return 0; + } + + nvgpu_mc_boot_0(g, &p->gpu_arch, &p->gpu_impl, &p->gpu_rev); + + if ((p->gpu_arch + p->gpu_impl) == (u32)NVGPU_GPUID_GV11B) { + /* overwrite gpu revison for A02 */ + if (!nvgpu_is_soc_t194_a01(g)) { + p->gpu_rev = 0xa2; + } + } + nvgpu_log_info(g, "arch: %x, impl: %x, rev: %x\n", + g->params.gpu_arch, + g->params.gpu_impl, + g->params.gpu_rev); + + return nvgpu_init_hal(g); } diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.c b/drivers/gpu/nvgpu/gk20a/gk20a.c index 1caa1dcf9..223c7727b 100644 --- a/drivers/gpu/nvgpu/gk20a/gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/gk20a.c @@ -45,7 +45,6 @@ #include "gk20a.h" #include "dbg_gpu_gk20a.h" -#include "hal.h" #include "pstate/pstate.h" void __nvgpu_check_gpu_state(struct gk20a *g) @@ -65,33 +64,6 @@ void __gk20a_warn_on_no_regs(void) WARN_ONCE(1, "Attempted access to GPU regs after unmapping!"); } -int gk20a_detect_chip(struct gk20a *g) -{ - struct nvgpu_gpu_params *p = &g->params; - - if (p->gpu_arch) { - return 0; - } - - nvgpu_mc_boot_0(g, &p->gpu_arch, &p->gpu_impl, &p->gpu_rev); - - if ((p->gpu_arch + p->gpu_impl) == NVGPU_GPUID_GV11B) { - - /* overwrite gpu revison for A02 */ - if (!nvgpu_is_soc_t194_a01(g)) { - p->gpu_rev = 0xa2; - } - - } - - nvgpu_log_info(g, "arch: %x, impl: %x, rev: %x\n", - g->params.gpu_arch, - g->params.gpu_impl, - g->params.gpu_rev); - - return gpu_init_hal(g); -} - static void gk20a_mask_interrupts(struct gk20a *g) { if (g->ops.mc.intr_mask != NULL) { diff --git a/drivers/gpu/nvgpu/include/nvgpu/gk20a.h b/drivers/gpu/nvgpu/include/nvgpu/gk20a.h index a653109ac..244b6ed2c 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/gk20a.h +++ b/drivers/gpu/nvgpu/include/nvgpu/gk20a.h @@ -1761,5 +1761,4 @@ static inline bool gk20a_platform_has_syncpoints(struct gk20a *g) #endif } -int gk20a_detect_chip(struct gk20a *g); #endif /* GK20A_H */ diff --git a/drivers/gpu/nvgpu/gk20a/hal.h b/drivers/gpu/nvgpu/include/nvgpu/hal_init.h similarity index 88% rename from drivers/gpu/nvgpu/gk20a/hal.h rename to drivers/gpu/nvgpu/include/nvgpu/hal_init.h index 0a6e70944..06e58e706 100644 --- a/drivers/gpu/nvgpu/gk20a/hal.h +++ b/drivers/gpu/nvgpu/include/nvgpu/hal_init.h @@ -22,11 +22,12 @@ * DEALINGS IN THE SOFTWARE. */ -#ifndef NVGPU_GK20A_HAL_H -#define NVGPU_GK20A_HAL_H +#ifndef NVGPU_HAL_INIT_H +#define NVGPU_HAL_INIT_H struct gk20a; -int gpu_init_hal(struct gk20a *g); +int nvgpu_init_hal(struct gk20a *g); +int nvgpu_detect_chip(struct gk20a *g); -#endif /* NVGPU_GK20A_HAL_H */ +#endif /* NVGPU_HAL_INIT_H */ diff --git a/drivers/gpu/nvgpu/os/linux/module.c b/drivers/gpu/nvgpu/os/linux/module.c index 9d84cc2f8..dbc97f956 100644 --- a/drivers/gpu/nvgpu/os/linux/module.c +++ b/drivers/gpu/nvgpu/os/linux/module.c @@ -33,6 +33,7 @@ #include +#include #include #include #include @@ -266,7 +267,7 @@ int gk20a_pm_finalize_poweron(struct device *dev) INIT_WORK(&l->nonstall_fn_work, nvgpu_intr_nonstall_cb); } - err = gk20a_detect_chip(g); + err = nvgpu_detect_chip(g); if (err) goto done;