diff options
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/flcn_gk20a.c | 23 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/pmu_gk20a.c | 7 |
2 files changed, 24 insertions, 6 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/flcn_gk20a.c b/drivers/gpu/nvgpu/gk20a/flcn_gk20a.c index 158f4d8b..0ef10a56 100644 --- a/drivers/gpu/nvgpu/gk20a/flcn_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/flcn_gk20a.c | |||
@@ -324,6 +324,26 @@ static int gk20a_flcn_copy_to_imem(struct nvgpu_falcon *flcn, u32 dst, | |||
324 | return 0; | 324 | return 0; |
325 | } | 325 | } |
326 | 326 | ||
327 | static int gk20a_falcon_bootstrap(struct nvgpu_falcon *flcn, | ||
328 | u32 boot_vector) | ||
329 | { | ||
330 | struct gk20a *g = flcn->g; | ||
331 | u32 base_addr = flcn->flcn_base; | ||
332 | |||
333 | nvgpu_log_info(g, "boot vec 0x%x", boot_vector); | ||
334 | |||
335 | gk20a_writel(g, base_addr + falcon_falcon_dmactl_r(), | ||
336 | falcon_falcon_dmactl_require_ctx_f(0)); | ||
337 | |||
338 | gk20a_writel(g, base_addr + falcon_falcon_bootvec_r(), | ||
339 | falcon_falcon_bootvec_vec_f(boot_vector)); | ||
340 | |||
341 | gk20a_writel(g, base_addr + falcon_falcon_cpuctl_r(), | ||
342 | falcon_falcon_cpuctl_startcpu_f(1)); | ||
343 | |||
344 | return 0; | ||
345 | } | ||
346 | |||
327 | static void gk20a_falcon_engine_dependency_ops(struct nvgpu_falcon *flcn) | 347 | static void gk20a_falcon_engine_dependency_ops(struct nvgpu_falcon *flcn) |
328 | { | 348 | { |
329 | struct nvgpu_falcon_engine_dependency_ops *flcn_eng_dep_ops = | 349 | struct nvgpu_falcon_engine_dependency_ops *flcn_eng_dep_ops = |
@@ -357,6 +377,7 @@ void gk20a_falcon_ops(struct nvgpu_falcon *flcn) | |||
357 | flcn_ops->copy_from_dmem = gk20a_flcn_copy_from_dmem; | 377 | flcn_ops->copy_from_dmem = gk20a_flcn_copy_from_dmem; |
358 | flcn_ops->copy_to_dmem = gk20a_flcn_copy_to_dmem; | 378 | flcn_ops->copy_to_dmem = gk20a_flcn_copy_to_dmem; |
359 | flcn_ops->copy_to_imem = gk20a_flcn_copy_to_imem; | 379 | flcn_ops->copy_to_imem = gk20a_flcn_copy_to_imem; |
380 | flcn_ops->bootstrap = gk20a_falcon_bootstrap; | ||
360 | 381 | ||
361 | gk20a_falcon_engine_dependency_ops(flcn); | 382 | gk20a_falcon_engine_dependency_ops(flcn); |
362 | } | 383 | } |
@@ -396,7 +417,7 @@ static void gk20a_falcon_hal_sw_init(struct nvgpu_falcon *flcn) | |||
396 | nvgpu_mutex_init(&flcn->copy_lock); | 417 | nvgpu_mutex_init(&flcn->copy_lock); |
397 | gk20a_falcon_ops(flcn); | 418 | gk20a_falcon_ops(flcn); |
398 | } else | 419 | } else |
399 | nvgpu_info(g, "falcon 0x%x not supported on %s", | 420 | nvgpu_log_info(g, "falcon 0x%x not supported on %s", |
400 | flcn->flcn_id, g->name); | 421 | flcn->flcn_id, g->name); |
401 | } | 422 | } |
402 | 423 | ||
diff --git a/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c b/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c index b3cacb86..7cf8c475 100644 --- a/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c | |||
@@ -23,6 +23,7 @@ | |||
23 | #include <nvgpu/log.h> | 23 | #include <nvgpu/log.h> |
24 | #include <nvgpu/bug.h> | 24 | #include <nvgpu/bug.h> |
25 | #include <nvgpu/firmware.h> | 25 | #include <nvgpu/firmware.h> |
26 | #include <nvgpu/falcon.h> | ||
26 | 27 | ||
27 | #include "gk20a.h" | 28 | #include "gk20a.h" |
28 | #include "gr_gk20a.h" | 29 | #include "gr_gk20a.h" |
@@ -239,11 +240,7 @@ int pmu_bootstrap(struct nvgpu_pmu *pmu) | |||
239 | pwr_falcon_dmatrfcmd_ctxdma_f(GK20A_PMU_DMAIDX_UCODE)); | 240 | pwr_falcon_dmatrfcmd_ctxdma_f(GK20A_PMU_DMAIDX_UCODE)); |
240 | } | 241 | } |
241 | 242 | ||
242 | gk20a_writel(g, pwr_falcon_bootvec_r(), | 243 | nvgpu_flcn_bootstrap(g->pmu.flcn, desc->bootloader_entry_point); |
243 | pwr_falcon_bootvec_vec_f(desc->bootloader_entry_point)); | ||
244 | |||
245 | gk20a_writel(g, pwr_falcon_cpuctl_r(), | ||
246 | pwr_falcon_cpuctl_startcpu_f(1)); | ||
247 | 244 | ||
248 | gk20a_writel(g, pwr_falcon_os_r(), desc->app_version); | 245 | gk20a_writel(g, pwr_falcon_os_r(), desc->app_version); |
249 | 246 | ||