summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gv11b
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/nvgpu/gv11b')
-rw-r--r--drivers/gpu/nvgpu/gv11b/acr_gv11b.c87
-rw-r--r--drivers/gpu/nvgpu/gv11b/acr_gv11b.h5
-rw-r--r--drivers/gpu/nvgpu/gv11b/hal_gv11b.c5
3 files changed, 96 insertions, 1 deletions
diff --git a/drivers/gpu/nvgpu/gv11b/acr_gv11b.c b/drivers/gpu/nvgpu/gv11b/acr_gv11b.c
index f5ca144a..de2502ce 100644
--- a/drivers/gpu/nvgpu/gv11b/acr_gv11b.c
+++ b/drivers/gpu/nvgpu/gv11b/acr_gv11b.c
@@ -38,6 +38,7 @@
38#include "acr_gv11b.h" 38#include "acr_gv11b.h"
39#include "pmu_gv11b.h" 39#include "pmu_gv11b.h"
40#include "gm20b/mm_gm20b.h" 40#include "gm20b/mm_gm20b.h"
41#include "gm20b/pmu_gm20b.h"
41#include "gm20b/acr_gm20b.h" 42#include "gm20b/acr_gm20b.h"
42#include "gp106/acr_gp106.h" 43#include "gp106/acr_gp106.h"
43 44
@@ -68,6 +69,8 @@ void gv11b_setup_apertures(struct gk20a *g)
68 struct mm_gk20a *mm = &g->mm; 69 struct mm_gk20a *mm = &g->mm;
69 struct nvgpu_mem *inst_block = &mm->pmu.inst_block; 70 struct nvgpu_mem *inst_block = &mm->pmu.inst_block;
70 71
72 nvgpu_log_fn(g, " ");
73
71 /* setup apertures - virtual */ 74 /* setup apertures - virtual */
72 gk20a_writel(g, pwr_fbif_transcfg_r(GK20A_PMU_DMAIDX_UCODE), 75 gk20a_writel(g, pwr_fbif_transcfg_r(GK20A_PMU_DMAIDX_UCODE),
73 pwr_fbif_transcfg_mem_type_physical_f() | 76 pwr_fbif_transcfg_mem_type_physical_f() |
@@ -91,3 +94,87 @@ void gv11b_setup_apertures(struct gk20a *g)
91 pwr_fbif_transcfg_mem_type_physical_f() | 94 pwr_fbif_transcfg_mem_type_physical_f() |
92 pwr_fbif_transcfg_target_noncoherent_sysmem_f()); 95 pwr_fbif_transcfg_target_noncoherent_sysmem_f());
93} 96}
97
98int gv11b_acr_patch_wpr_info_to_ucode(struct gk20a *g, struct nvgpu_acr *acr,
99 struct hs_acr *acr_desc, bool is_recovery)
100{
101 struct nvgpu_firmware *acr_fw = acr_desc->acr_fw;
102 struct acr_fw_header *acr_fw_hdr = NULL;
103 struct bin_hdr *acr_fw_bin_hdr = NULL;
104 struct flcn_acr_desc_v1 *acr_dmem_desc;
105 u32 *acr_ucode_header = NULL;
106 u32 *acr_ucode_data = NULL;
107
108 nvgpu_log_fn(g, " ");
109
110 if (is_recovery) {
111 acr_desc->acr_dmem_desc_v1->nonwpr_ucode_blob_size = 0U;
112 } else {
113 acr_fw_bin_hdr = (struct bin_hdr *)acr_fw->data;
114 acr_fw_hdr = (struct acr_fw_header *)
115 (acr_fw->data + acr_fw_bin_hdr->header_offset);
116
117 acr_ucode_data = (u32 *)(acr_fw->data +
118 acr_fw_bin_hdr->data_offset);
119 acr_ucode_header = (u32 *)(acr_fw->data +
120 acr_fw_hdr->hdr_offset);
121
122 /* During recovery need to update blob size as 0x0*/
123 acr_desc->acr_dmem_desc_v1 = (struct flcn_acr_desc_v1 *)
124 ((u8 *)(acr_desc->acr_ucode.cpu_va) +
125 acr_ucode_header[2U]);
126
127 /* Patch WPR info to ucode */
128 acr_dmem_desc = (struct flcn_acr_desc_v1 *)
129 &(((u8 *)acr_ucode_data)[acr_ucode_header[2U]]);
130
131 acr_dmem_desc->nonwpr_ucode_blob_start =
132 nvgpu_mem_get_addr(g, &g->acr.ucode_blob);
133 acr_dmem_desc->nonwpr_ucode_blob_size =
134 g->acr.ucode_blob.size;
135 acr_dmem_desc->regions.no_regions = 1U;
136 acr_dmem_desc->wpr_offset = 0U;
137 }
138
139 return 0;
140}
141
142static void gv11b_acr_default_sw_init(struct gk20a *g, struct hs_acr *hs_acr)
143{
144 struct hs_flcn_bl *hs_bl = &hs_acr->acr_hs_bl;
145
146 nvgpu_log_fn(g, " ");
147
148 hs_bl->bl_fw_name = HSBIN_ACR_BL_UCODE_IMAGE;
149
150 hs_acr->acr_type = ACR_DEFAULT;
151 hs_acr->acr_fw_name = HSBIN_ACR_UCODE_IMAGE;
152
153 hs_acr->ptr_bl_dmem_desc = &hs_acr->bl_dmem_desc_v1;
154 hs_acr->bl_dmem_desc_size = sizeof(struct flcn_bl_dmem_desc_v1);
155
156 hs_acr->acr_flcn = &g->pmu_flcn;
157 hs_acr->acr_flcn_setup_hw_and_bl_bootstrap =
158 gm20b_pmu_setup_hw_and_bl_bootstrap;
159}
160
161void nvgpu_gv11b_acr_sw_init(struct gk20a *g, struct nvgpu_acr *acr)
162{
163 nvgpu_log_fn(g, " ");
164
165 acr->g = g;
166
167 acr->bootstrap_owner = LSF_FALCON_ID_PMU;
168 acr->max_supported_lsfm = MAX_SUPPORTED_LSFM;
169
170 gv11b_acr_default_sw_init(g, &acr->acr);
171
172 acr->get_wpr_info = gm20b_wpr_info;
173 acr->alloc_blob_space = gv11b_alloc_blob_space;
174 acr->bootstrap_hs_acr = gm20b_bootstrap_hs_acr;
175 acr->patch_wpr_info_to_ucode = gv11b_acr_patch_wpr_info_to_ucode;
176 acr->acr_fill_bl_dmem_desc =
177 gp106_acr_fill_bl_dmem_desc;
178
179 acr->remove_support = gm20b_remove_acr_support;
180}
diff --git a/drivers/gpu/nvgpu/gv11b/acr_gv11b.h b/drivers/gpu/nvgpu/gv11b/acr_gv11b.h
index 8529e821..99fe3ea3 100644
--- a/drivers/gpu/nvgpu/gv11b/acr_gv11b.h
+++ b/drivers/gpu/nvgpu/gv11b/acr_gv11b.h
@@ -30,4 +30,9 @@ int gv11b_init_pmu_setup_hw1(struct gk20a *g,
30void gv11b_setup_apertures(struct gk20a *g); 30void gv11b_setup_apertures(struct gk20a *g);
31int gv11b_alloc_blob_space(struct gk20a *g, size_t size, 31int gv11b_alloc_blob_space(struct gk20a *g, size_t size,
32 struct nvgpu_mem *mem); 32 struct nvgpu_mem *mem);
33
34void nvgpu_gv11b_acr_sw_init(struct gk20a *g, struct nvgpu_acr *acr);
35int gv11b_acr_patch_wpr_info_to_ucode(struct gk20a *g, struct nvgpu_acr *acr,
36 struct hs_acr *acr_desc, bool is_recovery);
33#endif /* NVGPU_ACR_GV11B_H */ 37#endif /* NVGPU_ACR_GV11B_H */
38
diff --git a/drivers/gpu/nvgpu/gv11b/hal_gv11b.c b/drivers/gpu/nvgpu/gv11b/hal_gv11b.c
index 0d9f65bf..18b00ea4 100644
--- a/drivers/gpu/nvgpu/gv11b/hal_gv11b.c
+++ b/drivers/gpu/nvgpu/gv11b/hal_gv11b.c
@@ -823,6 +823,9 @@ static const struct gpu_ops gv11b_ops = {
823 .read_vin_cal_slope_intercept_fuse = NULL, 823 .read_vin_cal_slope_intercept_fuse = NULL,
824 .read_vin_cal_gain_offset_fuse = NULL, 824 .read_vin_cal_gain_offset_fuse = NULL,
825 }, 825 },
826 .acr = {
827 .acr_sw_init = nvgpu_gv11b_acr_sw_init,
828 },
826 .chip_init_gpu_characteristics = gv11b_init_gpu_characteristics, 829 .chip_init_gpu_characteristics = gv11b_init_gpu_characteristics,
827 .get_litter_value = gv11b_get_litter_value, 830 .get_litter_value = gv11b_get_litter_value,
828}; 831};
@@ -858,6 +861,7 @@ int gv11b_init_hal(struct gk20a *g)
858 gops->priv_ring = gv11b_ops.priv_ring; 861 gops->priv_ring = gv11b_ops.priv_ring;
859 gops->fuse = gv11b_ops.fuse; 862 gops->fuse = gv11b_ops.fuse;
860 gops->clk_arb = gv11b_ops.clk_arb; 863 gops->clk_arb = gv11b_ops.clk_arb;
864 gops->acr = gv11b_ops.acr;
861 865
862 /* Lone functions */ 866 /* Lone functions */
863 gops->chip_init_gpu_characteristics = 867 gops->chip_init_gpu_characteristics =
@@ -903,7 +907,6 @@ int gv11b_init_hal(struct gk20a *g)
903 907
904 __nvgpu_set_enabled(g, NVGPU_PMU_FECS_BOOTSTRAP_DONE, false); 908 __nvgpu_set_enabled(g, NVGPU_PMU_FECS_BOOTSTRAP_DONE, false);
905 __nvgpu_set_enabled(g, NVGPU_FECS_TRACE_VA, true); 909 __nvgpu_set_enabled(g, NVGPU_FECS_TRACE_VA, true);
906 g->bootstrap_owner = LSF_BOOTSTRAP_OWNER_DEFAULT;
907 910
908 __nvgpu_set_enabled(g, NVGPU_SUPPORT_MULTIPLE_WPR, false); 911 __nvgpu_set_enabled(g, NVGPU_SUPPORT_MULTIPLE_WPR, false);
909 912