From 41c874a2d903bc1d808cc36f20ccefcec50ad703 Mon Sep 17 00:00:00 2001 From: Tejal Kudav Date: Tue, 11 Oct 2022 16:09:15 +0000 Subject: [PATCH] gpu: nvgpu: Fix error injection HAL init Currently, the registeration with error injection utility is done only for GA10b using HAL. But HALs are not initialized during the probe stage when we try to register the error injection utility. So, the callback registration does not happen HAL is set to NULL. Move the callback registration from probe to poweron stage when HAL is initialized. Update the nvgpu_cic_mon_init_lut() API name as it is no longer doing only LUT initialization. Bug 3828050 Change-Id: Ide718029e9317124749b4a51c423ae70dc8227c8 Signed-off-by: Tejal Kudav Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvgpu/+/2790269 Reviewed-by: svc-mobile-coverity Reviewed-by: Vaibhav Kachore GVS: Gerrit_Virtual_Submit --- drivers/gpu/nvgpu/common/cic/mon/mon_init.c | 60 +++++++++---------- drivers/gpu/nvgpu/common/init/nvgpu_init.c | 4 +- drivers/gpu/nvgpu/include/nvgpu/cic_mon.h | 2 +- .../gpu/nvgpu/include/nvgpu/gops/cic_mon.h | 2 + libs/dgpu/libnvgpu-drv-dgpu_safe.export | 2 +- libs/igpu/libnvgpu-drv-igpu_safe.export | 2 +- userspace/units/acr/nvgpu-acr.c | 4 +- userspace/units/bus/nvgpu-bus.c | 4 +- userspace/units/ce/nvgpu-ce.c | 4 +- userspace/units/fb/fb_gv11b_fusa.c | 4 +- userspace/units/fifo/nvgpu-fifo-common.c | 6 +- userspace/units/gr/nvgpu-gr.c | 4 +- userspace/units/ltc/nvgpu-ltc.c | 4 +- .../gv11b_fusa/mmu-fault-gv11b-fusa.c | 4 +- userspace/units/priv_ring/nvgpu-priv_ring.c | 4 +- userspace/units/ptimer/nvgpu-ptimer.c | 4 +- 16 files changed, 58 insertions(+), 56 deletions(-) diff --git a/drivers/gpu/nvgpu/common/cic/mon/mon_init.c b/drivers/gpu/nvgpu/common/cic/mon/mon_init.c index a3560871f..af5ac3ae9 100644 --- a/drivers/gpu/nvgpu/common/cic/mon/mon_init.c +++ b/drivers/gpu/nvgpu/common/cic/mon/mon_init.c @@ -45,6 +45,21 @@ int nvgpu_cic_mon_setup(struct gk20a *g) g->cic_mon = cic_mon; + cic_dbg(g, "CIC_MON unit initialization done."); + return err; +} + +int nvgpu_cic_mon_init(struct gk20a *g) +{ + struct nvgpu_cic_mon *cic_mon; + int err = 0; + + cic_mon = g->cic_mon; + if (cic_mon == NULL) { + nvgpu_err(g, "CIC_MON setup pending"); + return -EINVAL; + } + #ifdef CONFIG_NVGPU_FSI_ERR_INJECTION if (g->ops.cic_mon.reg_errinj_cb != NULL) { err = g->ops.cic_mon.reg_errinj_cb(g); @@ -61,21 +76,6 @@ int nvgpu_cic_mon_setup(struct gk20a *g) } #endif - cic_dbg(g, "CIC_MON unit initialization done."); - return err; -} - -int nvgpu_cic_mon_init_lut(struct gk20a *g) -{ - struct nvgpu_cic_mon *cic_mon; - int err = 0; - - cic_mon = g->cic_mon; - if (cic_mon == NULL) { - nvgpu_err(g, "CIC_MON setup pending"); - return -EINVAL; - } - if (g->ops.cic_mon.init != NULL) { err = g->ops.cic_mon.init(g, cic_mon); if (err != 0) { @@ -101,21 +101,6 @@ int nvgpu_cic_mon_remove(struct gk20a *g) { struct nvgpu_cic_mon *cic_mon; -#ifdef CONFIG_NVGPU_FSI_ERR_INJECTION - if (g->ops.cic_mon.dereg_errinj_cb != NULL) { - int err = g->ops.cic_mon.dereg_errinj_cb(); - if (err != 0) { - nvgpu_err(g, - "Err inj callback de-registration failed: %d", - err); - /* Continue CIC remove despite err inj utility - * de-registration failure, as the err inj support - * is meant only for debug purposes. - */ - } - } -#endif - cic_mon = g->cic_mon; if (cic_mon == NULL) { @@ -148,6 +133,21 @@ int nvgpu_cic_mon_deinit_lut(struct gk20a *g) int nvgpu_cic_mon_deinit(struct gk20a *g) { +#ifdef CONFIG_NVGPU_FSI_ERR_INJECTION + if (g->ops.cic_mon.dereg_errinj_cb != NULL) { + int err = g->ops.cic_mon.dereg_errinj_cb(); + if (err != 0) { + nvgpu_err(g, + "Err inj callback de-registration failed: %d", + err); + /* Continue CIC mon deinit despite err inj utility + * de-registration failure, as the err inj support + * is meant only for debug purposes. + */ + } + } +#endif + /** More deinit calls might get added here as CIC grows. */ return nvgpu_cic_mon_deinit_lut(g); } diff --git a/drivers/gpu/nvgpu/common/init/nvgpu_init.c b/drivers/gpu/nvgpu/common/init/nvgpu_init.c index ba8fbb22f..37201e0b0 100644 --- a/drivers/gpu/nvgpu/common/init/nvgpu_init.c +++ b/drivers/gpu/nvgpu/common/init/nvgpu_init.c @@ -849,9 +849,9 @@ int nvgpu_early_poweron(struct gk20a *g) /* Initialize CIC early on before the interrupts are * enabled. */ - err = nvgpu_cic_mon_init_lut(g); + err = nvgpu_cic_mon_init(g); if (err != 0) { - nvgpu_err(g, "CIC LUT Initialization failed[%d]", err); + nvgpu_err(g, "CIC Mon Initialization failed[%d]", err); goto done; } done: diff --git a/drivers/gpu/nvgpu/include/nvgpu/cic_mon.h b/drivers/gpu/nvgpu/include/nvgpu/cic_mon.h index 6993681d2..e2e79a18d 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/cic_mon.h +++ b/drivers/gpu/nvgpu/include/nvgpu/cic_mon.h @@ -274,7 +274,7 @@ struct nvgpu_err_desc; */ int nvgpu_cic_mon_setup(struct gk20a *g); -int nvgpu_cic_mon_init_lut(struct gk20a *g); +int nvgpu_cic_mon_init(struct gk20a *g); /** * @brief De-initialize the CIC unit's data structures diff --git a/drivers/gpu/nvgpu/include/nvgpu/gops/cic_mon.h b/drivers/gpu/nvgpu/include/nvgpu/gops/cic_mon.h index 71154a41d..86c2dacc7 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/gops/cic_mon.h +++ b/drivers/gpu/nvgpu/include/nvgpu/gops/cic_mon.h @@ -59,6 +59,7 @@ struct gops_cic_mon { */ int (*report_err)(struct gk20a *g, u32 err_id); +#ifdef CONFIG_NVGPU_FSI_ERR_INJECTION /** * @brief Register error injection callback with error * injection utility. @@ -76,6 +77,7 @@ struct gops_cic_mon { * @return 0 in case of success, < 0 in case of failure. */ int (*dereg_errinj_cb)(void); +#endif }; #endif/*NVGPU_GOPS_CIC_MON_H*/ diff --git a/libs/dgpu/libnvgpu-drv-dgpu_safe.export b/libs/dgpu/libnvgpu-drv-dgpu_safe.export index 3b38c32e7..759df8f69 100644 --- a/libs/dgpu/libnvgpu-drv-dgpu_safe.export +++ b/libs/dgpu/libnvgpu-drv-dgpu_safe.export @@ -796,7 +796,7 @@ gk20a_bus_set_bar0_window nvgpu_pramin_ops_init nvgpu_dma_alloc_vid_at nvgpu_cic_mon_setup -nvgpu_cic_mon_init_lut +nvgpu_cic_mon_init nvgpu_cic_mon_deinit nvgpu_cic_mon_bound_check_hw_unit_id nvgpu_cic_mon_bound_check_err_id diff --git a/libs/igpu/libnvgpu-drv-igpu_safe.export b/libs/igpu/libnvgpu-drv-igpu_safe.export index 9198d9773..a13dedf5e 100644 --- a/libs/igpu/libnvgpu-drv-igpu_safe.export +++ b/libs/igpu/libnvgpu-drv-igpu_safe.export @@ -823,7 +823,7 @@ nvgpu_rc_ce_fault gp10b_priv_ring_isr_handle_0 gp10b_priv_ring_isr_handle_1 nvgpu_cic_mon_setup -nvgpu_cic_mon_init_lut +nvgpu_cic_mon_init nvgpu_cic_mon_deinit nvgpu_cic_mon_bound_check_hw_unit_id nvgpu_cic_mon_bound_check_err_id diff --git a/userspace/units/acr/nvgpu-acr.c b/userspace/units/acr/nvgpu-acr.c index 8532f9748..e2980931a 100644 --- a/userspace/units/acr/nvgpu-acr.c +++ b/userspace/units/acr/nvgpu-acr.c @@ -224,9 +224,9 @@ static int init_acr_falcon_test_env(struct unit_module *m, struct gk20a *g) unit_return_fail(m, "CIC init failed\n"); } - err = nvgpu_cic_mon_init_lut(g); + err = nvgpu_cic_mon_init(g); if (err != 0) { - unit_return_fail(m, "CIC LUT init failed\n"); + unit_return_fail(m, "CIC Mon init failed\n"); } /* diff --git a/userspace/units/bus/nvgpu-bus.c b/userspace/units/bus/nvgpu-bus.c index b448e3cb1..d188597d0 100644 --- a/userspace/units/bus/nvgpu-bus.c +++ b/userspace/units/bus/nvgpu-bus.c @@ -163,8 +163,8 @@ int test_bus_setup(struct unit_module *m, struct gk20a *g, void *args) return UNIT_FAIL; } - if (nvgpu_cic_mon_init_lut(g) != 0) { - unit_err(m, "%s: Failed to initialize CIC LUT\n", + if (nvgpu_cic_mon_init(g) != 0) { + unit_err(m, "%s: Failed to initialize CIC Mon\n", __func__); return UNIT_FAIL; } diff --git a/userspace/units/ce/nvgpu-ce.c b/userspace/units/ce/nvgpu-ce.c index 6732989b5..36ae375e1 100644 --- a/userspace/units/ce/nvgpu-ce.c +++ b/userspace/units/ce/nvgpu-ce.c @@ -137,8 +137,8 @@ int test_ce_setup_env(struct unit_module *m, return UNIT_FAIL; } - if (nvgpu_cic_mon_init_lut(g) != 0) { - unit_err(m, "%s: failed to initialize CIC LUT\n", + if (nvgpu_cic_mon_init(g) != 0) { + unit_err(m, "%s: failed to initialize CIC Mon\n", __func__); return UNIT_FAIL; } diff --git a/userspace/units/fb/fb_gv11b_fusa.c b/userspace/units/fb/fb_gv11b_fusa.c index 78e02fb74..909da72ee 100644 --- a/userspace/units/fb/fb_gv11b_fusa.c +++ b/userspace/units/fb/fb_gv11b_fusa.c @@ -81,8 +81,8 @@ int fb_gv11b_init_test(struct unit_module *m, struct gk20a *g, void *args) unit_return_fail(m, "CIC init failed\n"); } - if (nvgpu_cic_mon_init_lut(g) != 0) { - unit_return_fail(m, "CIC LUT init failed\n"); + if (nvgpu_cic_mon_init(g) != 0) { + unit_return_fail(m, "CIC Mon init failed\n"); } g->ops.ecc.ecc_init_support(g); diff --git a/userspace/units/fifo/nvgpu-fifo-common.c b/userspace/units/fifo/nvgpu-fifo-common.c index 306e6b973..bb50bd328 100644 --- a/userspace/units/fifo/nvgpu-fifo-common.c +++ b/userspace/units/fifo/nvgpu-fifo-common.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2021, NVIDIA CORPORATION. All rights reserved. + * Copyright (c) 2019-2022, NVIDIA CORPORATION. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -195,9 +195,9 @@ int test_fifo_init_support(struct unit_module *m, struct gk20a *g, void *args) return UNIT_FAIL; } - err = nvgpu_cic_mon_init_lut(g); + err = nvgpu_cic_mon_init(g); if (err != 0) { - unit_return_fail(m, "CIC LUT init failed\n"); + unit_return_fail(m, "CIC mon init failed\n"); } err = nvgpu_cic_rm_setup(g); diff --git a/userspace/units/gr/nvgpu-gr.c b/userspace/units/gr/nvgpu-gr.c index bafb12c35..12130f9f6 100644 --- a/userspace/units/gr/nvgpu-gr.c +++ b/userspace/units/gr/nvgpu-gr.c @@ -175,9 +175,9 @@ int test_gr_init_setup_ready(struct unit_module *m, unit_return_fail(m, "CIC init failed\n"); } - err = nvgpu_cic_mon_init_lut(g); + err = nvgpu_cic_mon_init(g); if (err != 0) { - unit_return_fail(m, "CIC LUT init failed\n"); + unit_return_fail(m, "CIC Mon init failed\n"); } err = nvgpu_cic_rm_setup(g); diff --git a/userspace/units/ltc/nvgpu-ltc.c b/userspace/units/ltc/nvgpu-ltc.c index 931c69002..af04cf6d4 100644 --- a/userspace/units/ltc/nvgpu-ltc.c +++ b/userspace/units/ltc/nvgpu-ltc.c @@ -142,9 +142,9 @@ int test_ltc_init_support(struct unit_module *m, unit_return_fail(m, "CIC init failed\n"); } - err = nvgpu_cic_mon_init_lut(g); + err = nvgpu_cic_mon_init(g); if (err != 0) { - unit_return_fail(m, "CIC LUT init failed\n"); + unit_return_fail(m, "CIC Mon init failed\n"); } /* diff --git a/userspace/units/mm/hal/mmu_fault/gv11b_fusa/mmu-fault-gv11b-fusa.c b/userspace/units/mm/hal/mmu_fault/gv11b_fusa/mmu-fault-gv11b-fusa.c index 0676bf41c..91abdd427 100644 --- a/userspace/units/mm/hal/mmu_fault/gv11b_fusa/mmu-fault-gv11b-fusa.c +++ b/userspace/units/mm/hal/mmu_fault/gv11b_fusa/mmu-fault-gv11b-fusa.c @@ -228,8 +228,8 @@ int test_env_init_mm_mmu_fault_gv11b_fusa(struct unit_module *m, unit_return_fail(m, "Failed to initialize CIC\n"); } - if (nvgpu_cic_mon_init_lut(g) != 0) { - unit_return_fail(m, "Failed to initialize CIC LUT\n"); + if (nvgpu_cic_mon_init(g) != 0) { + unit_return_fail(m, "Failed to initialize CIC Mon\n"); } return UNIT_SUCCESS; diff --git a/userspace/units/priv_ring/nvgpu-priv_ring.c b/userspace/units/priv_ring/nvgpu-priv_ring.c index 8805c0295..3f4caa9cc 100644 --- a/userspace/units/priv_ring/nvgpu-priv_ring.c +++ b/userspace/units/priv_ring/nvgpu-priv_ring.c @@ -166,8 +166,8 @@ int test_priv_ring_setup(struct unit_module *m, struct gk20a *g, void *args) return UNIT_FAIL; } - if (nvgpu_cic_mon_init_lut(g) != 0) { - unit_err(m, "%s: Failed to initialize CIC LUT\n", + if (nvgpu_cic_mon_init(g) != 0) { + unit_err(m, "%s: Failed to initialize CIC Mon\n", __func__); return UNIT_FAIL; } diff --git a/userspace/units/ptimer/nvgpu-ptimer.c b/userspace/units/ptimer/nvgpu-ptimer.c index 6c48595be..32628209a 100644 --- a/userspace/units/ptimer/nvgpu-ptimer.c +++ b/userspace/units/ptimer/nvgpu-ptimer.c @@ -106,8 +106,8 @@ int ptimer_test_setup_env(struct unit_module *m, return UNIT_FAIL; } - if (nvgpu_cic_mon_init_lut(g) != 0) { - unit_err(m, "%s: failed to initialize CIC LUT\n", + if (nvgpu_cic_mon_init(g) != 0) { + unit_err(m, "%s: failed to initialize CIC Mon\n", __func__); return UNIT_FAIL; }