diff --git a/drivers/gpu/nvgpu/Makefile.nvgpu b/drivers/gpu/nvgpu/Makefile.nvgpu index 02fb8529d..3f3978f99 100644 --- a/drivers/gpu/nvgpu/Makefile.nvgpu +++ b/drivers/gpu/nvgpu/Makefile.nvgpu @@ -48,6 +48,8 @@ nvgpu-y := \ common/linux/cde.o \ common/linux/io.o \ common/linux/rwsem.o \ + common/linux/cde_gm20b.o \ + common/linux/cde_gp10b.o \ common/mm/nvgpu_allocator.o \ common/mm/bitmap_allocator.o \ common/mm/buddy_allocator.o \ @@ -115,7 +117,6 @@ nvgpu-y := \ gm20b/pmu_gm20b.o \ gm20b/mm_gm20b.o \ gm20b/regops_gm20b.o \ - gm20b/cde_gm20b.o \ gm20b/therm_gm20b.o \ boardobj/boardobj.o \ boardobj/boardobjgrp.o \ @@ -192,7 +193,6 @@ nvgpu-y += \ gp10b/rpfb_gp10b.o \ gp10b/gp10b_gating_reglist.o \ gp10b/regops_gp10b.o \ - gp10b/cde_gp10b.o \ gp10b/therm_gp10b.o \ gp10b/fecs_trace_gp10b.o \ gp10b/priv_ring_gp10b.o \ diff --git a/drivers/gpu/nvgpu/common/linux/cde.c b/drivers/gpu/nvgpu/common/linux/cde.c index 2832408d2..c3a9b7702 100644 --- a/drivers/gpu/nvgpu/common/linux/cde.c +++ b/drivers/gpu/nvgpu/common/linux/cde.c @@ -1068,8 +1068,8 @@ __releases(&l->cde_app->mutex) } if (scatterbuffer_byte_offset && - g->ops.cde.need_scatter_buffer && - g->ops.cde.need_scatter_buffer(g)) { + l->ops.cde.need_scatter_buffer && + l->ops.cde.need_scatter_buffer(g)) { struct sg_table *sgt; void *scatter_buffer; @@ -1092,7 +1092,7 @@ __releases(&l->cde_app->mutex) err = -EINVAL; goto exit_unmap_surface; } else { - err = g->ops.cde.populate_scatter_buffer(g, sgt, + err = l->ops.cde.populate_scatter_buffer(g, sgt, compbits_byte_offset, scatter_buffer, scatterbuffer_size); WARN_ON(err); @@ -1463,8 +1463,8 @@ static int gk20a_buffer_convert_gpu_to_cde_v1( int hprog = -1; int vprog = -1; - if (g->ops.cde.get_program_numbers) - g->ops.cde.get_program_numbers(g, block_height_log2, + if (l->ops.cde.get_program_numbers) + l->ops.cde.get_program_numbers(g, block_height_log2, l->cde_app.shader_parameter, &hprog, &vprog); else { diff --git a/drivers/gpu/nvgpu/gm20b/cde_gm20b.c b/drivers/gpu/nvgpu/common/linux/cde_gm20b.c similarity index 91% rename from drivers/gpu/nvgpu/gm20b/cde_gm20b.c rename to drivers/gpu/nvgpu/common/linux/cde_gm20b.c index f22e5126b..1cd15c54e 100644 --- a/drivers/gpu/nvgpu/gm20b/cde_gm20b.c +++ b/drivers/gpu/nvgpu/common/linux/cde_gm20b.c @@ -35,7 +35,7 @@ enum programs { PROG_PASSTHROUGH = 6, }; -void gm20b_cde_get_program_numbers(struct gk20a *g, +static void gm20b_cde_get_program_numbers(struct gk20a *g, u32 block_height_log2, u32 shader_parameter, int *hprog_out, int *vprog_out) @@ -56,3 +56,9 @@ void gm20b_cde_get_program_numbers(struct gk20a *g, *hprog_out = hprog; *vprog_out = vprog; } + +struct nvgpu_os_linux_ops gm20b_cde_ops = { + .cde = { + .get_program_numbers = gm20b_cde_get_program_numbers, + }, +}; diff --git a/drivers/gpu/nvgpu/gm20b/cde_gm20b.h b/drivers/gpu/nvgpu/common/linux/cde_gm20b.h similarity index 88% rename from drivers/gpu/nvgpu/gm20b/cde_gm20b.h rename to drivers/gpu/nvgpu/common/linux/cde_gm20b.h index dfd67d626..640d6ab67 100644 --- a/drivers/gpu/nvgpu/gm20b/cde_gm20b.h +++ b/drivers/gpu/nvgpu/common/linux/cde_gm20b.h @@ -25,11 +25,8 @@ #ifndef _NVHOST_GM20B_CDE #define _NVHOST_GM20B_CDE -struct gk20a; +#include "os_linux.h" -void gm20b_cde_get_program_numbers(struct gk20a *g, - u32 block_height_log2, - u32 shader_parameter, - int *hprog_out, int *vprog_out); +extern struct nvgpu_os_linux_ops gm20b_cde_ops; #endif diff --git a/drivers/gpu/nvgpu/gp10b/cde_gp10b.c b/drivers/gpu/nvgpu/common/linux/cde_gp10b.c similarity index 94% rename from drivers/gpu/nvgpu/gp10b/cde_gp10b.c rename to drivers/gpu/nvgpu/common/linux/cde_gp10b.c index ed8cb8ef3..ffae6e34f 100644 --- a/drivers/gpu/nvgpu/gp10b/cde_gp10b.c +++ b/drivers/gpu/nvgpu/common/linux/cde_gp10b.c @@ -150,3 +150,11 @@ int gp10b_populate_scatter_buffer(struct gk20a *g, return 0; } + +struct nvgpu_os_linux_ops gp10b_cde_ops = { + .cde = { + .get_program_numbers = gp10b_cde_get_program_numbers, + .need_scatter_buffer = gp10b_need_scatter_buffer, + .populate_scatter_buffer = gp10b_populate_scatter_buffer, + }, +}; diff --git a/drivers/gpu/nvgpu/gp10b/cde_gp10b.h b/drivers/gpu/nvgpu/common/linux/cde_gp10b.h similarity index 75% rename from drivers/gpu/nvgpu/gp10b/cde_gp10b.h rename to drivers/gpu/nvgpu/common/linux/cde_gp10b.h index a03e8078a..52e9f2928 100644 --- a/drivers/gpu/nvgpu/gp10b/cde_gp10b.h +++ b/drivers/gpu/nvgpu/common/linux/cde_gp10b.h @@ -25,18 +25,8 @@ #ifndef _NVHOST_GP10B_CDE #define _NVHOST_GP10B_CDE -struct gk20a; -struct sg_table; +#include "os_linux.h" -void gp10b_cde_get_program_numbers(struct gk20a *g, - u32 block_height_log2, - u32 shader_parameter, - int *hprog_out, int *vprog_out); -bool gp10b_need_scatter_buffer(struct gk20a *g); -int gp10b_populate_scatter_buffer(struct gk20a *g, - struct sg_table *sgt, - size_t surface_size, - void *scatter_buffer_ptr, - size_t scatter_buffer_size); +extern struct nvgpu_os_linux_ops gp10b_cde_ops; #endif diff --git a/drivers/gpu/nvgpu/common/linux/module.c b/drivers/gpu/nvgpu/common/linux/module.c index fe3e4e6fa..b7d13f050 100644 --- a/drivers/gpu/nvgpu/common/linux/module.c +++ b/drivers/gpu/nvgpu/common/linux/module.c @@ -49,6 +49,8 @@ #endif #endif #include "os_linux.h" +#include "cde_gm20b.h" +#include "cde_gp10b.h" #define CLASS_NAME "nvidia-gpu" /* TODO: Change to e.g. "nvidia-gpu%s" once we have symlinks in place. */ @@ -154,6 +156,26 @@ static int gk20a_restore_registers(struct gk20a *g) return 0; } +static int nvgpu_init_os_linux_ops(struct nvgpu_os_linux *l) { + struct gk20a *g = &l->g; + u32 ver = g->gpu_characteristics.arch + g->gpu_characteristics.impl; + + switch (ver) { + case GK20A_GPUID_GM20B: + case GK20A_GPUID_GM20B_B: + l->ops.cde = gm20b_cde_ops.cde; + break; + case NVGPU_GPUID_GP10B: + l->ops.cde = gp10b_cde_ops.cde; + break; + default: + /* CDE is optional, so today ignoring unknown chip is fine */ + break; + } + + return 0; +} + int gk20a_pm_finalize_poweron(struct device *dev) { struct gk20a *g = get_gk20a(dev); @@ -198,6 +220,10 @@ int gk20a_pm_finalize_poweron(struct device *dev) trace_gk20a_finalize_poweron_done(dev_name(dev)); + err = nvgpu_init_os_linux_ops(l); + if (err) + goto done; + enable_irq(g->irq_stall); if (g->irq_stall != g->irq_nonstall) enable_irq(g->irq_nonstall); diff --git a/drivers/gpu/nvgpu/common/linux/os_linux.h b/drivers/gpu/nvgpu/common/linux/os_linux.h index c67cbbcc6..27433e32f 100644 --- a/drivers/gpu/nvgpu/common/linux/os_linux.h +++ b/drivers/gpu/nvgpu/common/linux/os_linux.h @@ -24,6 +24,21 @@ #include "gk20a/gk20a.h" #include "cde.h" +struct nvgpu_os_linux_ops { + struct { + void (*get_program_numbers)(struct gk20a *g, + u32 block_height_log2, + u32 shader_parameter, + int *hprog, int *vprog); + bool (*need_scatter_buffer)(struct gk20a *g); + int (*populate_scatter_buffer)(struct gk20a *g, + struct sg_table *sgt, + size_t surface_size, + void *scatter_buffer_ptr, + size_t scatter_buffer_size); + } cde; +}; + struct nvgpu_os_linux { struct gk20a g; struct device *dev; @@ -99,6 +114,9 @@ struct nvgpu_os_linux { #ifdef CONFIG_TEGRA_19x_GPU struct nvgpu_os_linux_t19x t19x; #endif + + struct nvgpu_os_linux_ops ops; + #ifdef CONFIG_DEBUG_FS struct dentry *debugfs; struct dentry *debugfs_alias; diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.h b/drivers/gpu/nvgpu/gk20a/gk20a.h index ead1f69ec..9d2726461 100644 --- a/drivers/gpu/nvgpu/gk20a/gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/gk20a.h @@ -943,18 +943,6 @@ struct gpu_ops { int (*perfbuffer_enable)(struct gk20a *g, u64 offset, u32 size); int (*perfbuffer_disable)(struct gk20a *g); } dbg_session_ops; - struct { - void (*get_program_numbers)(struct gk20a *g, - u32 block_height_log2, - u32 shader_parameter, - int *hprog, int *vprog); - bool (*need_scatter_buffer)(struct gk20a *g); - int (*populate_scatter_buffer)(struct gk20a *g, - struct sg_table *sgt, - size_t surface_size, - void *scatter_buffer_ptr, - size_t scatter_buffer_size); - } cde; int (*get_litter_value)(struct gk20a *g, int value); int (*chip_init_gpu_characteristics)(struct gk20a *g); diff --git a/drivers/gpu/nvgpu/gm20b/hal_gm20b.c b/drivers/gpu/nvgpu/gm20b/hal_gm20b.c index 39d05978c..50cc759ab 100644 --- a/drivers/gpu/nvgpu/gm20b/hal_gm20b.c +++ b/drivers/gpu/nvgpu/gm20b/hal_gm20b.c @@ -50,7 +50,6 @@ #include "pmu_gm20b.h" #include "clk_gm20b.h" #include "regops_gm20b.h" -#include "cde_gm20b.h" #include "therm_gm20b.h" #include "bus_gm20b.h" #include "hal_gm20b.h" @@ -539,9 +538,6 @@ static const struct gpu_ops gm20b_ops = { .perfbuffer_enable = gk20a_perfbuf_enable_locked, .perfbuffer_disable = gk20a_perfbuf_disable_locked, }, - .cde = { - .get_program_numbers = gm20b_cde_get_program_numbers, - }, .bus = { .init_hw = gk20a_bus_init_hw, .isr = gk20a_bus_isr, @@ -601,7 +597,6 @@ int gm20b_init_hal(struct gk20a *g) gops->mc = gm20b_ops.mc; gops->dbg_session_ops = gm20b_ops.dbg_session_ops; gops->debug = gm20b_ops.debug; - gops->cde = gm20b_ops.cde; gops->bus = gm20b_ops.bus; #if defined(CONFIG_GK20A_CYCLE_STATS) gops->css = gm20b_ops.css; diff --git a/drivers/gpu/nvgpu/gp106/hal_gp106.c b/drivers/gpu/nvgpu/gp106/hal_gp106.c index 8523e7d17..204c376bf 100644 --- a/drivers/gpu/nvgpu/gp106/hal_gp106.c +++ b/drivers/gpu/nvgpu/gp106/hal_gp106.c @@ -45,7 +45,6 @@ #include "gp10b/mm_gp10b.h" #include "gp10b/ce_gp10b.h" #include "gp10b/regops_gp10b.h" -#include "gp10b/cde_gp10b.h" #include "gp10b/priv_ring_gp10b.h" #include "gp10b/fifo_gp10b.h" #include "gp10b/fb_gp10b.h" @@ -654,11 +653,6 @@ static const struct gpu_ops gp106_ops = { .perfbuffer_enable = gk20a_perfbuf_enable_locked, .perfbuffer_disable = gk20a_perfbuf_disable_locked, }, - .cde = { - .get_program_numbers = gp10b_cde_get_program_numbers, - .need_scatter_buffer = gp10b_need_scatter_buffer, - .populate_scatter_buffer = gp10b_populate_scatter_buffer, - }, .bus = { .init_hw = gk20a_bus_init_hw, .isr = gk20a_bus_isr, @@ -738,7 +732,6 @@ int gp106_init_hal(struct gk20a *g) gops->mc = gp106_ops.mc; gops->debug = gp106_ops.debug; gops->dbg_session_ops = gp106_ops.dbg_session_ops; - gops->cde = gp106_ops.cde; gops->bus = gp106_ops.bus; #if defined(CONFIG_GK20A_CYCLE_STATS) gops->css = gp106_ops.css; diff --git a/drivers/gpu/nvgpu/gp10b/hal_gp10b.c b/drivers/gpu/nvgpu/gp10b/hal_gp10b.c index 61284225a..90e8137b8 100644 --- a/drivers/gpu/nvgpu/gp10b/hal_gp10b.c +++ b/drivers/gpu/nvgpu/gp10b/hal_gp10b.c @@ -51,7 +51,6 @@ #include "gp10b/fifo_gp10b.h" #include "gp10b/gp10b_gating_reglist.h" #include "gp10b/regops_gp10b.h" -#include "gp10b/cde_gp10b.h" #include "gp10b/therm_gp10b.h" #include "gp10b/priv_ring_gp10b.h" @@ -574,11 +573,6 @@ static const struct gpu_ops gp10b_ops = { .perfbuffer_enable = gk20a_perfbuf_enable_locked, .perfbuffer_disable = gk20a_perfbuf_disable_locked, }, - .cde = { - .get_program_numbers = gp10b_cde_get_program_numbers, - .need_scatter_buffer = gp10b_need_scatter_buffer, - .populate_scatter_buffer = gp10b_populate_scatter_buffer, - }, .bus = { .init_hw = gk20a_bus_init_hw, .isr = gk20a_bus_isr, @@ -628,7 +622,6 @@ int gp10b_init_hal(struct gk20a *g) gops->mc = gp10b_ops.mc; gops->debug = gp10b_ops.debug; gops->dbg_session_ops = gp10b_ops.dbg_session_ops; - gops->cde = gp10b_ops.cde; gops->bus = gp10b_ops.bus; #if defined(CONFIG_GK20A_CYCLE_STATS) gops->css = gp10b_ops.css; diff --git a/drivers/gpu/nvgpu/vgpu/gm20b/vgpu_hal_gm20b.c b/drivers/gpu/nvgpu/vgpu/gm20b/vgpu_hal_gm20b.c index 618c80f85..fc9b0e839 100644 --- a/drivers/gpu/nvgpu/vgpu/gm20b/vgpu_hal_gm20b.c +++ b/drivers/gpu/nvgpu/vgpu/gm20b/vgpu_hal_gm20b.c @@ -42,7 +42,6 @@ #include "gm20b/pmu_gm20b.h" #include "gm20b/fb_gm20b.h" #include "gm20b/bus_gm20b.h" -#include "gm20b/cde_gm20b.h" #include "gm20b/regops_gm20b.h" #include "gm20b/clk_gm20b.h" #include "gm20b/therm_gm20b.h" @@ -438,9 +437,6 @@ static const struct gpu_ops vgpu_gm20b_ops = { .perfbuffer_enable = vgpu_perfbuffer_enable, .perfbuffer_disable = vgpu_perfbuffer_disable, }, - .cde = { - .get_program_numbers = gm20b_cde_get_program_numbers, - }, .bus = { .init_hw = gk20a_bus_init_hw, .isr = gk20a_bus_isr, @@ -501,7 +497,6 @@ int vgpu_gm20b_init_hal(struct gk20a *g) gops->mc = vgpu_gm20b_ops.mc; gops->dbg_session_ops = vgpu_gm20b_ops.dbg_session_ops; gops->debug = vgpu_gm20b_ops.debug; - gops->cde = vgpu_gm20b_ops.cde; gops->bus = vgpu_gm20b_ops.bus; #if defined(CONFIG_GK20A_CYCLE_STATS) gops->css = vgpu_gm20b_ops.css; diff --git a/drivers/gpu/nvgpu/vgpu/gp10b/vgpu_hal_gp10b.c b/drivers/gpu/nvgpu/vgpu/gp10b/vgpu_hal_gp10b.c index aae74e3fa..2c59d847c 100644 --- a/drivers/gpu/nvgpu/vgpu/gp10b/vgpu_hal_gp10b.c +++ b/drivers/gpu/nvgpu/vgpu/gp10b/vgpu_hal_gp10b.c @@ -50,7 +50,6 @@ #include "gp10b/fifo_gp10b.h" #include "gp10b/gp10b_gating_reglist.h" #include "gp10b/regops_gp10b.h" -#include "gp10b/cde_gp10b.h" #include "gp10b/therm_gp10b.h" #include "gp10b/priv_ring_gp10b.h" @@ -478,11 +477,6 @@ static const struct gpu_ops vgpu_gp10b_ops = { .perfbuffer_enable = vgpu_perfbuffer_enable, .perfbuffer_disable = vgpu_perfbuffer_disable, }, - .cde = { - .get_program_numbers = gp10b_cde_get_program_numbers, - .need_scatter_buffer = gp10b_need_scatter_buffer, - .populate_scatter_buffer = gp10b_populate_scatter_buffer, - }, .bus = { .init_hw = gk20a_bus_init_hw, .isr = gk20a_bus_isr, @@ -533,7 +527,6 @@ int vgpu_gp10b_init_hal(struct gk20a *g) gops->mc = vgpu_gp10b_ops.mc; gops->debug = vgpu_gp10b_ops.debug; gops->dbg_session_ops = vgpu_gp10b_ops.dbg_session_ops; - gops->cde = vgpu_gp10b_ops.cde; gops->bus = vgpu_gp10b_ops.bus; #if defined(CONFIG_GK20A_CYCLE_STATS) gops->css = vgpu_gp10b_ops.css;