summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gv11b/hal_gv11b.c
diff options
context:
space:
mode:
authorSunny He <suhe@nvidia.com>2017-08-01 20:12:03 -0400
committermobile promotions <svcmobile_promotions@nvidia.com>2017-08-21 16:06:07 -0400
commitcce0a55d2106865be14b3b39c083a0f55881f2a5 (patch)
treedadeb0bfae70b105a749d4a3378485ceaf2b0f8d /drivers/gpu/nvgpu/gv11b/hal_gv11b.c
parent6ff92bfb6e1ed68e29cef279f3275ac75ceaa4db (diff)
gpu: nvgpu: gv11b: Reorg pmu HAL init
Reorganize HAL initialization to remove inheritance and construct the gpu_ops struct at compile time. This patch only covers the pmu sub-module of the gpu_ops struct. Perform HAL function assignments in hal_gxxxx.c through the population of a chip-specific copy of gpu_ops. Jira NVGPU-74 Change-Id: I3f8a763a7bebf201c2242eecde7ff998aad07d0a Signed-off-by: Sunny He <suhe@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/1530983 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: svccoveritychecker <svccoveritychecker@nvidia.com> Reviewed-by: svc-mobile-coverity <svc-mobile-coverity@nvidia.com> GVS: Gerrit_Virtual_Submit Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gv11b/hal_gv11b.c')
-rw-r--r--drivers/gpu/nvgpu/gv11b/hal_gv11b.c67
1 files changed, 65 insertions, 2 deletions
diff --git a/drivers/gpu/nvgpu/gv11b/hal_gv11b.c b/drivers/gpu/nvgpu/gv11b/hal_gv11b.c
index f572084d..521cafa3 100644
--- a/drivers/gpu/nvgpu/gv11b/hal_gv11b.c
+++ b/drivers/gpu/nvgpu/gv11b/hal_gv11b.c
@@ -31,12 +31,15 @@
31#include "gk20a/flcn_gk20a.h" 31#include "gk20a/flcn_gk20a.h"
32#include "gk20a/regops_gk20a.h" 32#include "gk20a/regops_gk20a.h"
33#include "gk20a/fb_gk20a.h" 33#include "gk20a/fb_gk20a.h"
34#include "gk20a/pmu_gk20a.h"
34 35
35#include "gm20b/ltc_gm20b.h" 36#include "gm20b/ltc_gm20b.h"
36#include "gm20b/gr_gm20b.h" 37#include "gm20b/gr_gm20b.h"
37#include "gm20b/fb_gm20b.h" 38#include "gm20b/fb_gm20b.h"
38#include "gm20b/fifo_gm20b.h" 39#include "gm20b/fifo_gm20b.h"
39#include "gm20b/mm_gm20b.h" 40#include "gm20b/mm_gm20b.h"
41#include "gm20b/acr_gm20b.h"
42#include "gm20b/pmu_gm20b.h"
40 43
41#include "gp10b/ltc_gp10b.h" 44#include "gp10b/ltc_gp10b.h"
42#include "gp10b/therm_gp10b.h" 45#include "gp10b/therm_gp10b.h"
@@ -47,6 +50,9 @@
47#include "gp10b/fecs_trace_gp10b.h" 50#include "gp10b/fecs_trace_gp10b.h"
48#include "gp10b/fb_gp10b.h" 51#include "gp10b/fb_gp10b.h"
49#include "gp10b/mm_gp10b.h" 52#include "gp10b/mm_gp10b.h"
53#include "gp10b/pmu_gp10b.h"
54
55#include "gp106/pmu_gp106.h"
50 56
51#include "hal_gv11b.h" 57#include "hal_gv11b.h"
52#include "gr_gv11b.h" 58#include "gr_gv11b.h"
@@ -70,6 +76,7 @@
70#include <nvgpu/hw/gv11b/hw_fifo_gv11b.h> 76#include <nvgpu/hw/gv11b/hw_fifo_gv11b.h>
71#include <nvgpu/hw/gv11b/hw_ram_gv11b.h> 77#include <nvgpu/hw/gv11b/hw_ram_gv11b.h>
72#include <nvgpu/hw/gv11b/hw_top_gv11b.h> 78#include <nvgpu/hw/gv11b/hw_top_gv11b.h>
79#include <nvgpu/hw/gv11b/hw_pwr_gv11b.h>
73 80
74static int gv11b_get_litter_value(struct gk20a *g, int value) 81static int gv11b_get_litter_value(struct gk20a *g, int value)
75{ 82{
@@ -368,6 +375,30 @@ static const struct gpu_ops gv11b_ops = {
368 .init_therm_setup_hw = gp10b_init_therm_setup_hw, 375 .init_therm_setup_hw = gp10b_init_therm_setup_hw,
369 .elcg_init_idle_filters = gp10b_elcg_init_idle_filters, 376 .elcg_init_idle_filters = gp10b_elcg_init_idle_filters,
370 }, 377 },
378 .pmu = {
379 .pmu_setup_elpg = gp10b_pmu_setup_elpg,
380 .pmu_get_queue_head = pwr_pmu_queue_head_r,
381 .pmu_get_queue_head_size = pwr_pmu_queue_head__size_1_v,
382 .pmu_get_queue_tail = pwr_pmu_queue_tail_r,
383 .pmu_get_queue_tail_size = pwr_pmu_queue_tail__size_1_v,
384 .pmu_queue_head = gk20a_pmu_queue_head,
385 .pmu_queue_tail = gk20a_pmu_queue_tail,
386 .pmu_msgq_tail = gk20a_pmu_msgq_tail,
387 .pmu_mutex_size = pwr_pmu_mutex__size_1_v,
388 .pmu_mutex_acquire = gk20a_pmu_mutex_acquire,
389 .pmu_mutex_release = gk20a_pmu_mutex_release,
390 .write_dmatrfbase = gp10b_write_dmatrfbase,
391 .pmu_elpg_statistics = gp106_pmu_elpg_statistics,
392 .pmu_pg_init_param = gv11b_pg_gr_init,
393 .pmu_pg_supported_engines_list = gk20a_pmu_pg_engines_list,
394 .pmu_pg_engines_feature_list = gk20a_pmu_pg_feature_list,
395 .dump_secure_fuses = pmu_dump_security_fuses_gp10b,
396 .reset_engine = gp106_pmu_engine_reset,
397 .is_engine_in_reset = gp106_pmu_is_engine_in_reset,
398 .pmu_nsbootstrap = gv11b_pmu_bootstrap,
399 .pmu_pg_set_sub_feature_mask = gv11b_pg_set_subfeature_mask,
400 .is_pmu_supported = gv11b_is_pmu_supported,
401 },
371 .regops = { 402 .regops = {
372 .get_global_whitelist_ranges = 403 .get_global_whitelist_ranges =
373 gv11b_get_global_whitelist_ranges, 404 gv11b_get_global_whitelist_ranges,
@@ -463,6 +494,7 @@ int gv11b_init_hal(struct gk20a *g)
463 gops->mm = gv11b_ops.mm; 494 gops->mm = gv11b_ops.mm;
464 gops->fecs_trace = gv11b_ops.fecs_trace; 495 gops->fecs_trace = gv11b_ops.fecs_trace;
465 gops->therm = gv11b_ops.therm; 496 gops->therm = gv11b_ops.therm;
497 gops->pmu = gv11b_ops.pmu;
466 gops->regops = gv11b_ops.regops; 498 gops->regops = gv11b_ops.regops;
467 gops->mc = gv11b_ops.mc; 499 gops->mc = gv11b_ops.mc;
468 gops->debug = gv11b_ops.debug; 500 gops->debug = gv11b_ops.debug;
@@ -479,13 +511,44 @@ int gv11b_init_hal(struct gk20a *g)
479 gv11b_ops.chip_init_gpu_characteristics; 511 gv11b_ops.chip_init_gpu_characteristics;
480 gops->get_litter_value = gv11b_ops.get_litter_value; 512 gops->get_litter_value = gv11b_ops.get_litter_value;
481 513
482 /* boot in non-secure modes for time beeing */ 514 /* boot in non-secure modes for time being */
483 __nvgpu_set_enabled(g, NVGPU_GR_USE_DMA_FOR_FW_BOOTSTRAP, false); 515 __nvgpu_set_enabled(g, NVGPU_GR_USE_DMA_FOR_FW_BOOTSTRAP, false);
484 __nvgpu_set_enabled(g, NVGPU_SEC_PRIVSECURITY, false); 516 __nvgpu_set_enabled(g, NVGPU_SEC_PRIVSECURITY, false);
485 __nvgpu_set_enabled(g, NVGPU_SEC_SECUREGPCCS, false); 517 __nvgpu_set_enabled(g, NVGPU_SEC_SECUREGPCCS, false);
486 518
519 /* priv security dependent ops */
520 if (nvgpu_is_enabled(g, NVGPU_SEC_PRIVSECURITY)) {
521 /* Add in ops from gm20b acr */
522 gops->pmu.prepare_ucode = prepare_ucode_blob,
523 gops->pmu.pmu_setup_hw_and_bootstrap = gm20b_bootstrap_hs_flcn,
524 gops->pmu.is_lazy_bootstrap = gm20b_is_lazy_bootstrap,
525 gops->pmu.is_priv_load = gm20b_is_priv_load,
526 gops->pmu.get_wpr = gm20b_wpr_info,
527 gops->pmu.alloc_blob_space = gm20b_alloc_blob_space,
528 gops->pmu.pmu_populate_loader_cfg =
529 gm20b_pmu_populate_loader_cfg,
530 gops->pmu.flcn_populate_bl_dmem_desc =
531 gm20b_flcn_populate_bl_dmem_desc,
532 gops->pmu.falcon_wait_for_halt = pmu_wait_for_halt,
533 gops->pmu.falcon_clear_halt_interrupt_status =
534 clear_halt_interrupt_status,
535 gops->pmu.init_falcon_setup_hw = gm20b_init_pmu_setup_hw1,
536
537 gops->pmu.init_wpr_region = gm20b_pmu_init_acr;
538 gops->pmu.load_lsfalcon_ucode = gp10b_load_falcon_ucode;
539 gops->pmu.is_lazy_bootstrap = gp10b_is_lazy_bootstrap;
540 gops->pmu.is_priv_load = gp10b_is_priv_load;
541 } else {
542 /* Inherit from gk20a */
543 gops->pmu.prepare_ucode = nvgpu_pmu_prepare_ns_ucode_blob,
544 gops->pmu.pmu_setup_hw_and_bootstrap = gk20a_init_pmu_setup_hw1,
545
546 gops->pmu.load_lsfalcon_ucode = NULL;
547 gops->pmu.init_wpr_region = NULL;
548 gops->pmu.pmu_setup_hw_and_bootstrap = gp10b_init_pmu_setup_hw1;
549 }
550
487 gv11b_init_gr(g); 551 gv11b_init_gr(g);
488 gv11b_init_pmu_ops(g);
489 552
490 gv11b_init_uncompressed_kind_map(); 553 gv11b_init_uncompressed_kind_map();
491 gv11b_init_kind_attr(); 554 gv11b_init_kind_attr();