diff options
author | Vaikundanathan S <vaikuns@nvidia.com> | 2018-04-23 07:22:43 -0400 |
---|---|---|
committer | mobile promotions <svcmobile_promotions@nvidia.com> | 2018-05-14 10:03:05 -0400 |
commit | 85f9729af4a05057b0d9f1e48542f6f9e3acecab (patch) | |
tree | 5bcda1f9213dfd1a6e5ec032e1a3098d5cd78281 | |
parent | a51eb9da021c2934e196c5d8be04551703e6bb5b (diff) |
gpu: nvgpu: vf inject changes
- Added vf change inject support for gv10x
- Updated clk_pmu_vf_inject() to fill required data
for pascal or volta vf change inject support
- Added new ctrl clk interface for gv10x clk domain list
- Added pmu interface for gv10x clk domain list &
vf change inject request
- Modified clk cmd, msg & RPC id's to match
with chips_a_23609936 branch
Bug 200399373
Change-Id: Ib9dc10073386f63bdfd92110c7ec3e09b1c484ce
Signed-off-by: Vaikundanathan S <vaikuns@nvidia.com>
Signed-off-by: Mahantesh Kumbar <mkumbar@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/1700746
Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com>
Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
-rw-r--r-- | drivers/gpu/nvgpu/clk/clk.c | 89 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/clk/clk.h | 6 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/common/pmu/pmu_fw.c | 4 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/ctrl/ctrlclk.h | 13 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/gk20a.h | 3 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/include/nvgpu/pmuif/gpmuifclk.h | 27 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/include/nvgpu/pmuif/gpmuifvolt.h | 2 |
7 files changed, 115 insertions, 29 deletions
diff --git a/drivers/gpu/nvgpu/clk/clk.c b/drivers/gpu/nvgpu/clk/clk.c index a8d99bbb..28f08cb6 100644 --- a/drivers/gpu/nvgpu/clk/clk.c +++ b/drivers/gpu/nvgpu/clk/clk.c | |||
@@ -219,31 +219,13 @@ done: | |||
219 | return status; | 219 | return status; |
220 | } | 220 | } |
221 | 221 | ||
222 | static u32 clk_pmu_vf_inject(struct gk20a *g, struct set_fll_clk *setfllclk) | 222 | u32 nvgpu_clk_vf_change_inject_data_fill_gp10x(struct gk20a *g, |
223 | struct nv_pmu_clk_rpc *rpccall, | ||
224 | struct set_fll_clk *setfllclk) | ||
223 | { | 225 | { |
224 | struct pmu_cmd cmd; | ||
225 | struct pmu_payload payload; | ||
226 | u32 status; | ||
227 | u32 seqdesc; | ||
228 | struct nv_pmu_clk_rpc rpccall; | ||
229 | struct clkrpc_pmucmdhandler_params handler; | ||
230 | struct nv_pmu_clk_vf_change_inject *vfchange; | 226 | struct nv_pmu_clk_vf_change_inject *vfchange; |
231 | 227 | ||
232 | memset(&payload, 0, sizeof(struct pmu_payload)); | 228 | vfchange = &rpccall->params.clk_vf_change_inject; |
233 | memset(&rpccall, 0, sizeof(struct nv_pmu_clk_rpc)); | ||
234 | memset(&handler, 0, sizeof(struct clkrpc_pmucmdhandler_params)); | ||
235 | |||
236 | if ((setfllclk->gpc2clkmhz == 0) || (setfllclk->xbar2clkmhz == 0) || | ||
237 | (setfllclk->sys2clkmhz == 0) || (setfllclk->voltuv == 0)) | ||
238 | return -EINVAL; | ||
239 | |||
240 | if ((setfllclk->target_regime_id_gpc > CTRL_CLK_FLL_REGIME_ID_FR) || | ||
241 | (setfllclk->target_regime_id_sys > CTRL_CLK_FLL_REGIME_ID_FR) || | ||
242 | (setfllclk->target_regime_id_xbar > CTRL_CLK_FLL_REGIME_ID_FR)) | ||
243 | return -EINVAL; | ||
244 | |||
245 | rpccall.function = NV_PMU_CLK_RPC_ID_CLK_VF_CHANGE_INJECT; | ||
246 | vfchange = &rpccall.params.clk_vf_change_inject; | ||
247 | vfchange->flags = 0; | 229 | vfchange->flags = 0; |
248 | vfchange->clk_list.num_domains = 3; | 230 | vfchange->clk_list.num_domains = 3; |
249 | vfchange->clk_list.clk_domains[0].clk_domain = CTRL_CLK_DOMAIN_GPC2CLK; | 231 | vfchange->clk_list.clk_domains[0].clk_domain = CTRL_CLK_DOMAIN_GPC2CLK; |
@@ -276,6 +258,69 @@ static u32 clk_pmu_vf_inject(struct gk20a *g, struct set_fll_clk *setfllclk) | |||
276 | vfchange->volt_list.rails[0].voltage_min_noise_unaware_uv = | 258 | vfchange->volt_list.rails[0].voltage_min_noise_unaware_uv = |
277 | setfllclk->voltuv; | 259 | setfllclk->voltuv; |
278 | 260 | ||
261 | return 0; | ||
262 | } | ||
263 | |||
264 | u32 nvgpu_clk_vf_change_inject_data_fill_gv10x(struct gk20a *g, | ||
265 | struct nv_pmu_clk_rpc *rpccall, | ||
266 | struct set_fll_clk *setfllclk) | ||
267 | { | ||
268 | struct nv_pmu_clk_vf_change_inject_v1 *vfchange; | ||
269 | |||
270 | vfchange = &rpccall->params.clk_vf_change_inject_v1; | ||
271 | vfchange->flags = 0; | ||
272 | vfchange->clk_list.num_domains = 4; | ||
273 | vfchange->clk_list.clk_domains[0].clk_domain = CTRL_CLK_DOMAIN_GPCCLK; | ||
274 | vfchange->clk_list.clk_domains[0].clk_freq_khz = | ||
275 | setfllclk->gpc2clkmhz * 1000; | ||
276 | |||
277 | vfchange->clk_list.clk_domains[1].clk_domain = CTRL_CLK_DOMAIN_XBARCLK; | ||
278 | vfchange->clk_list.clk_domains[1].clk_freq_khz = | ||
279 | setfllclk->xbar2clkmhz * 1000; | ||
280 | |||
281 | vfchange->clk_list.clk_domains[2].clk_domain = CTRL_CLK_DOMAIN_SYSCLK; | ||
282 | vfchange->clk_list.clk_domains[2].clk_freq_khz = | ||
283 | setfllclk->sys2clkmhz * 1000; | ||
284 | |||
285 | vfchange->clk_list.clk_domains[3].clk_domain = CTRL_CLK_DOMAIN_NVDCLK; | ||
286 | vfchange->clk_list.clk_domains[3].clk_freq_khz = 855 * 1000; | ||
287 | |||
288 | vfchange->volt_list.num_rails = 1; | ||
289 | vfchange->volt_list.rails[0].rail_idx = 0; | ||
290 | vfchange->volt_list.rails[0].voltage_uv = setfllclk->voltuv; | ||
291 | vfchange->volt_list.rails[0].voltage_min_noise_unaware_uv = | ||
292 | setfllclk->voltuv; | ||
293 | |||
294 | return 0; | ||
295 | } | ||
296 | |||
297 | static u32 clk_pmu_vf_inject(struct gk20a *g, struct set_fll_clk *setfllclk) | ||
298 | { | ||
299 | struct pmu_cmd cmd; | ||
300 | struct pmu_payload payload; | ||
301 | u32 status; | ||
302 | u32 seqdesc; | ||
303 | struct nv_pmu_clk_rpc rpccall; | ||
304 | struct clkrpc_pmucmdhandler_params handler; | ||
305 | |||
306 | memset(&payload, 0, sizeof(struct pmu_payload)); | ||
307 | memset(&rpccall, 0, sizeof(struct nv_pmu_clk_rpc)); | ||
308 | memset(&handler, 0, sizeof(struct clkrpc_pmucmdhandler_params)); | ||
309 | |||
310 | if ((setfllclk->gpc2clkmhz == 0) || (setfllclk->xbar2clkmhz == 0) || | ||
311 | (setfllclk->sys2clkmhz == 0) || (setfllclk->voltuv == 0)) | ||
312 | return -EINVAL; | ||
313 | |||
314 | if ((setfllclk->target_regime_id_gpc > CTRL_CLK_FLL_REGIME_ID_FR) || | ||
315 | (setfllclk->target_regime_id_sys > CTRL_CLK_FLL_REGIME_ID_FR) || | ||
316 | (setfllclk->target_regime_id_xbar > CTRL_CLK_FLL_REGIME_ID_FR)) | ||
317 | return -EINVAL; | ||
318 | |||
319 | rpccall.function = NV_PMU_CLK_RPC_ID_CLK_VF_CHANGE_INJECT; | ||
320 | |||
321 | g->ops.pmu_ver.clk.clk_vf_change_inject_data_fill(g, | ||
322 | &rpccall, setfllclk); | ||
323 | |||
279 | cmd.hdr.unit_id = PMU_UNIT_CLK; | 324 | cmd.hdr.unit_id = PMU_UNIT_CLK; |
280 | cmd.hdr.size = (u32)sizeof(struct nv_pmu_clk_cmd) + | 325 | cmd.hdr.size = (u32)sizeof(struct nv_pmu_clk_cmd) + |
281 | (u32)sizeof(struct pmu_hdr); | 326 | (u32)sizeof(struct pmu_hdr); |
diff --git a/drivers/gpu/nvgpu/clk/clk.h b/drivers/gpu/nvgpu/clk/clk.h index a19e2e77..019a1c11 100644 --- a/drivers/gpu/nvgpu/clk/clk.h +++ b/drivers/gpu/nvgpu/clk/clk.h | |||
@@ -127,4 +127,10 @@ u32 clk_domain_get_f_points( | |||
127 | int clk_get_fll_clks(struct gk20a *g, struct set_fll_clk *fllclk); | 127 | int clk_get_fll_clks(struct gk20a *g, struct set_fll_clk *fllclk); |
128 | int clk_set_fll_clks(struct gk20a *g, struct set_fll_clk *fllclk); | 128 | int clk_set_fll_clks(struct gk20a *g, struct set_fll_clk *fllclk); |
129 | int clk_pmu_freq_controller_load(struct gk20a *g, bool bload, u8 bit_idx); | 129 | int clk_pmu_freq_controller_load(struct gk20a *g, bool bload, u8 bit_idx); |
130 | u32 nvgpu_clk_vf_change_inject_data_fill_gv10x(struct gk20a *g, | ||
131 | struct nv_pmu_clk_rpc *rpccall, | ||
132 | struct set_fll_clk *setfllclk); | ||
133 | u32 nvgpu_clk_vf_change_inject_data_fill_gp10x(struct gk20a *g, | ||
134 | struct nv_pmu_clk_rpc *rpccall, | ||
135 | struct set_fll_clk *setfllclk); | ||
130 | #endif | 136 | #endif |
diff --git a/drivers/gpu/nvgpu/common/pmu/pmu_fw.c b/drivers/gpu/nvgpu/common/pmu/pmu_fw.c index c610c391..2dc2dba1 100644 --- a/drivers/gpu/nvgpu/common/pmu/pmu_fw.c +++ b/drivers/gpu/nvgpu/common/pmu/pmu_fw.c | |||
@@ -1309,6 +1309,8 @@ static int nvgpu_init_pmu_fw_ver_ops(struct nvgpu_pmu *pmu) | |||
1309 | nvgpu_clk_get_vbios_clk_domain_gv10x; | 1309 | nvgpu_clk_get_vbios_clk_domain_gv10x; |
1310 | g->ops.pmu_ver.clk.clk_avfs_get_vin_cal_data = | 1310 | g->ops.pmu_ver.clk.clk_avfs_get_vin_cal_data = |
1311 | clk_avfs_get_vin_cal_fuse_v20; | 1311 | clk_avfs_get_vin_cal_fuse_v20; |
1312 | g->ops.pmu_ver.clk.clk_vf_change_inject_data_fill = | ||
1313 | nvgpu_clk_vf_change_inject_data_fill_gv10x; | ||
1312 | } else { | 1314 | } else { |
1313 | g->ops.pmu_ver.get_pmu_init_msg_pmu_queue_params = | 1315 | g->ops.pmu_ver.get_pmu_init_msg_pmu_queue_params = |
1314 | get_pmu_init_msg_pmu_queue_params_v4; | 1316 | get_pmu_init_msg_pmu_queue_params_v4; |
@@ -1478,6 +1480,8 @@ static int nvgpu_init_pmu_fw_ver_ops(struct nvgpu_pmu *pmu) | |||
1478 | nvgpu_clk_get_vbios_clk_domain_gp10x; | 1480 | nvgpu_clk_get_vbios_clk_domain_gp10x; |
1479 | g->ops.pmu_ver.clk.clk_avfs_get_vin_cal_data = | 1481 | g->ops.pmu_ver.clk.clk_avfs_get_vin_cal_data = |
1480 | clk_avfs_get_vin_cal_fuse_v10; | 1482 | clk_avfs_get_vin_cal_fuse_v10; |
1483 | g->ops.pmu_ver.clk.clk_vf_change_inject_data_fill = | ||
1484 | nvgpu_clk_vf_change_inject_data_fill_gp10x; | ||
1481 | break; | 1485 | break; |
1482 | case APP_VERSION_GM20B: | 1486 | case APP_VERSION_GM20B: |
1483 | g->ops.pmu_ver.pg_cmd_eng_buf_load_size = | 1487 | g->ops.pmu_ver.pg_cmd_eng_buf_load_size = |
diff --git a/drivers/gpu/nvgpu/ctrl/ctrlclk.h b/drivers/gpu/nvgpu/ctrl/ctrlclk.h index 3d50f413..537ae0ef 100644 --- a/drivers/gpu/nvgpu/ctrl/ctrlclk.h +++ b/drivers/gpu/nvgpu/ctrl/ctrlclk.h | |||
@@ -176,6 +176,19 @@ struct ctrl_clk_clk_domain_list_item { | |||
176 | u8 target_regime_id; | 176 | u8 target_regime_id; |
177 | }; | 177 | }; |
178 | 178 | ||
179 | struct ctrl_clk_clk_domain_list_item_v1 { | ||
180 | u32 clk_domain; | ||
181 | u32 clk_freq_khz; | ||
182 | u8 regime_id; | ||
183 | u8 source; | ||
184 | }; | ||
185 | |||
186 | struct ctrl_clk_clk_domain_list { | ||
187 | u8 num_domains; | ||
188 | struct ctrl_clk_clk_domain_list_item_v1 | ||
189 | clk_domains[CTRL_BOARDOBJ_MAX_BOARD_OBJECTS]; | ||
190 | }; | ||
191 | |||
179 | #define CTRL_CLK_VF_PAIR_FREQ_MHZ_GET(pvfpair) \ | 192 | #define CTRL_CLK_VF_PAIR_FREQ_MHZ_GET(pvfpair) \ |
180 | ((pvfpair)->freq_mhz) | 193 | ((pvfpair)->freq_mhz) |
181 | 194 | ||
diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.h b/drivers/gpu/nvgpu/gk20a/gk20a.h index c05bc046..23e85ee9 100644 --- a/drivers/gpu/nvgpu/gk20a/gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/gk20a.h | |||
@@ -804,6 +804,9 @@ struct gpu_ops { | |||
804 | u32 (*clk_avfs_get_vin_cal_data)(struct gk20a *g, | 804 | u32 (*clk_avfs_get_vin_cal_data)(struct gk20a *g, |
805 | struct avfsvinobjs *pvinobjs, | 805 | struct avfsvinobjs *pvinobjs, |
806 | struct vin_device_v20 *pvindev); | 806 | struct vin_device_v20 *pvindev); |
807 | u32 (*clk_vf_change_inject_data_fill)(struct gk20a *g, | ||
808 | struct nv_pmu_clk_rpc *rpccall, | ||
809 | struct set_fll_clk *setfllclk); | ||
807 | }clk; | 810 | }clk; |
808 | } pmu_ver; | 811 | } pmu_ver; |
809 | struct { | 812 | struct { |
diff --git a/drivers/gpu/nvgpu/include/nvgpu/pmuif/gpmuifclk.h b/drivers/gpu/nvgpu/include/nvgpu/pmuif/gpmuifclk.h index e0a3313b..dde85435 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/pmuif/gpmuifclk.h +++ b/drivers/gpu/nvgpu/include/nvgpu/pmuif/gpmuifclk.h | |||
@@ -336,12 +336,24 @@ struct nv_pmu_clk_clk_domain_list { | |||
336 | NV_PMU_VF_INJECT_MAX_CLOCK_DOMAINS]; | 336 | NV_PMU_VF_INJECT_MAX_CLOCK_DOMAINS]; |
337 | }; | 337 | }; |
338 | 338 | ||
339 | struct nv_pmu_clk_clk_domain_list_v1 { | ||
340 | u8 num_domains; | ||
341 | struct ctrl_clk_clk_domain_list_item_v1 clk_domains[ | ||
342 | NV_PMU_VF_INJECT_MAX_CLOCK_DOMAINS]; | ||
343 | }; | ||
344 | |||
339 | struct nv_pmu_clk_vf_change_inject { | 345 | struct nv_pmu_clk_vf_change_inject { |
340 | u8 flags; | 346 | u8 flags; |
341 | struct nv_pmu_clk_clk_domain_list clk_list; | 347 | struct nv_pmu_clk_clk_domain_list clk_list; |
342 | struct nv_pmu_volt_volt_rail_list volt_list; | 348 | struct nv_pmu_volt_volt_rail_list volt_list; |
343 | }; | 349 | }; |
344 | 350 | ||
351 | struct nv_pmu_clk_vf_change_inject_v1 { | ||
352 | u8 flags; | ||
353 | struct nv_pmu_clk_clk_domain_list_v1 clk_list; | ||
354 | struct nv_pmu_volt_volt_rail_list_v1 volt_list; | ||
355 | }; | ||
356 | |||
345 | #define NV_NV_PMU_CLK_LOAD_FEATURE_VIN (0x00000002) | 357 | #define NV_NV_PMU_CLK_LOAD_FEATURE_VIN (0x00000002) |
346 | #define NV_NV_PMU_CLK_LOAD_ACTION_MASK_VIN_HW_CAL_PROGRAM_YES (0x00000001) | 358 | #define NV_NV_PMU_CLK_LOAD_ACTION_MASK_VIN_HW_CAL_PROGRAM_YES (0x00000001) |
347 | 359 | ||
@@ -400,12 +412,14 @@ union nv_pmu_clk_clk_freq_controller_boardobj_set_union { | |||
400 | NV_PMU_BOARDOBJ_GRP_SET_MAKE_E32(clk, clk_freq_controller); | 412 | NV_PMU_BOARDOBJ_GRP_SET_MAKE_E32(clk, clk_freq_controller); |
401 | 413 | ||
402 | /* CLK CMD ID definitions. */ | 414 | /* CLK CMD ID definitions. */ |
403 | #define NV_PMU_CLK_CMD_ID_BOARDOBJ_GRP_SET (0x00000000) | 415 | #define NV_PMU_CLK_CMD_ID_BOARDOBJ_GRP_SET (0x00000001) |
404 | #define NV_PMU_CLK_CMD_ID_RPC (0x00000001) | 416 | #define NV_PMU_CLK_CMD_ID_RPC (0x00000000) |
405 | #define NV_PMU_CLK_CMD_ID_BOARDOBJ_GRP_GET_STATUS (0x00000002) | 417 | #define NV_PMU_CLK_CMD_ID_BOARDOBJ_GRP_GET_STATUS (0x00000002) |
406 | 418 | ||
407 | #define NV_PMU_CLK_RPC_ID_LOAD (0x00000002) | 419 | #define NV_PMU_CLK_RPC_ID_LOAD (0x00000001) |
408 | #define NV_PMU_CLK_RPC_ID_CLK_VF_CHANGE_INJECT (0x00000001) | 420 | #define NV_PMU_CLK_RPC_ID_CLK_VF_CHANGE_INJECT (0x00000000) |
421 | #define NV_PMU_CLK_RPC_ID_CLK_FREQ_EFF_AVG (0x00000002) | ||
422 | |||
409 | 423 | ||
410 | struct nv_pmu_clk_cmd_rpc { | 424 | struct nv_pmu_clk_cmd_rpc { |
411 | u8 cmd_type; | 425 | u8 cmd_type; |
@@ -432,13 +446,14 @@ struct nv_pmu_clk_rpc { | |||
432 | flcn_status flcn_status; | 446 | flcn_status flcn_status; |
433 | union { | 447 | union { |
434 | struct nv_pmu_clk_vf_change_inject clk_vf_change_inject; | 448 | struct nv_pmu_clk_vf_change_inject clk_vf_change_inject; |
449 | struct nv_pmu_clk_vf_change_inject_v1 clk_vf_change_inject_v1; | ||
435 | struct nv_pmu_clk_load clk_load; | 450 | struct nv_pmu_clk_load clk_load; |
436 | } params; | 451 | } params; |
437 | }; | 452 | }; |
438 | 453 | ||
439 | /* CLK MSG ID definitions */ | 454 | /* CLK MSG ID definitions */ |
440 | #define NV_PMU_CLK_MSG_ID_BOARDOBJ_GRP_SET (0x00000000) | 455 | #define NV_PMU_CLK_MSG_ID_BOARDOBJ_GRP_SET (0x00000001) |
441 | #define NV_PMU_CLK_MSG_ID_RPC (0x00000001) | 456 | #define NV_PMU_CLK_MSG_ID_RPC (0x00000000) |
442 | #define NV_PMU_CLK_MSG_ID_BOARDOBJ_GRP_GET_STATUS (0x00000002) | 457 | #define NV_PMU_CLK_MSG_ID_BOARDOBJ_GRP_GET_STATUS (0x00000002) |
443 | 458 | ||
444 | struct nv_pmu_clk_msg_rpc { | 459 | struct nv_pmu_clk_msg_rpc { |
diff --git a/drivers/gpu/nvgpu/include/nvgpu/pmuif/gpmuifvolt.h b/drivers/gpu/nvgpu/include/nvgpu/pmuif/gpmuifvolt.h index 313a3b2a..b763c487 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/pmuif/gpmuifvolt.h +++ b/drivers/gpu/nvgpu/include/nvgpu/pmuif/gpmuifvolt.h | |||
@@ -343,7 +343,7 @@ struct nv_pmu_volt_volt_rail_list { | |||
343 | rails[NV_PMU_VF_INJECT_MAX_VOLT_RAILS]; | 343 | rails[NV_PMU_VF_INJECT_MAX_VOLT_RAILS]; |
344 | }; | 344 | }; |
345 | 345 | ||
346 | struct nv_pmu_volt_volt_rail_list_V1 { | 346 | struct nv_pmu_volt_volt_rail_list_v1 { |
347 | u8 num_rails; | 347 | u8 num_rails; |
348 | struct ctrl_volt_volt_rail_list_item_v1 | 348 | struct ctrl_volt_volt_rail_list_item_v1 |
349 | rails[NV_PMU_VF_INJECT_MAX_VOLT_RAILS]; | 349 | rails[NV_PMU_VF_INJECT_MAX_VOLT_RAILS]; |