diff options
Diffstat (limited to 'drivers/gpu/nvgpu/vgpu/vgpu.c')
-rw-r--r-- | drivers/gpu/nvgpu/vgpu/vgpu.c | 31 |
1 files changed, 22 insertions, 9 deletions
diff --git a/drivers/gpu/nvgpu/vgpu/vgpu.c b/drivers/gpu/nvgpu/vgpu/vgpu.c index b16fe47c..b2c08d68 100644 --- a/drivers/gpu/nvgpu/vgpu/vgpu.c +++ b/drivers/gpu/nvgpu/vgpu/vgpu.c | |||
@@ -22,6 +22,8 @@ | |||
22 | #include "gk20a/hal_gk20a.h" | 22 | #include "gk20a/hal_gk20a.h" |
23 | #include "gk20a/hw_mc_gk20a.h" | 23 | #include "gk20a/hw_mc_gk20a.h" |
24 | 24 | ||
25 | #include "gm20b/hal_gm20b.h" | ||
26 | |||
25 | static inline int vgpu_comm_init(struct platform_device *pdev) | 27 | static inline int vgpu_comm_init(struct platform_device *pdev) |
26 | { | 28 | { |
27 | size_t queue_sizes[] = { TEGRA_VGPU_QUEUE_SIZES }; | 29 | size_t queue_sizes[] = { TEGRA_VGPU_QUEUE_SIZES }; |
@@ -243,27 +245,38 @@ static void vgpu_detect_chip(struct gk20a *g) | |||
243 | g->gpu_characteristics.rev); | 245 | g->gpu_characteristics.rev); |
244 | } | 246 | } |
245 | 247 | ||
248 | void vgpu_init_hal_common(struct gk20a *g) | ||
249 | { | ||
250 | struct gpu_ops *gops = &g->ops; | ||
251 | |||
252 | vgpu_init_fifo_ops(gops); | ||
253 | vgpu_init_gr_ops(gops); | ||
254 | vgpu_init_ltc_ops(gops); | ||
255 | vgpu_init_mm_ops(gops); | ||
256 | vgpu_init_debug_ops(gops); | ||
257 | } | ||
258 | |||
246 | static int vgpu_init_hal(struct gk20a *g) | 259 | static int vgpu_init_hal(struct gk20a *g) |
247 | { | 260 | { |
248 | u32 ver = g->gpu_characteristics.arch + g->gpu_characteristics.impl; | 261 | u32 ver = g->gpu_characteristics.arch + g->gpu_characteristics.impl; |
262 | int err; | ||
249 | 263 | ||
250 | switch (ver) { | 264 | switch (ver) { |
251 | case GK20A_GPUID_GK20A: | 265 | case GK20A_GPUID_GK20A: |
252 | gk20a_dbg_info("gk20a detected"); | 266 | gk20a_dbg_info("gk20a detected"); |
253 | /* init gk20a ops then override with virt extensions */ | 267 | err = vgpu_gk20a_init_hal(g); |
254 | gk20a_init_hal(g); | 268 | break; |
255 | vgpu_init_fifo_ops(&g->ops); | 269 | case GK20A_GPUID_GM20B: |
256 | vgpu_init_gr_ops(&g->ops); | 270 | gk20a_dbg_info("gm20b detected"); |
257 | vgpu_init_ltc_ops(&g->ops); | 271 | err = vgpu_gm20b_init_hal(g); |
258 | vgpu_init_mm_ops(&g->ops); | ||
259 | vgpu_init_debug_ops(&g->ops); | ||
260 | break; | 272 | break; |
261 | default: | 273 | default: |
262 | gk20a_err(&g->dev->dev, "no support for %x", ver); | 274 | gk20a_err(&g->dev->dev, "no support for %x", ver); |
263 | return -ENODEV; | 275 | err = -ENODEV; |
276 | break; | ||
264 | } | 277 | } |
265 | 278 | ||
266 | return 0; | 279 | return err; |
267 | } | 280 | } |
268 | 281 | ||
269 | int vgpu_pm_finalize_poweron(struct device *dev) | 282 | int vgpu_pm_finalize_poweron(struct device *dev) |