summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVaikundanathan S <vaikuns@nvidia.com>2018-04-23 07:22:43 -0400
committermobile promotions <svcmobile_promotions@nvidia.com>2018-05-14 10:03:05 -0400
commit85f9729af4a05057b0d9f1e48542f6f9e3acecab (patch)
tree5bcda1f9213dfd1a6e5ec032e1a3098d5cd78281
parenta51eb9da021c2934e196c5d8be04551703e6bb5b (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.c89
-rw-r--r--drivers/gpu/nvgpu/clk/clk.h6
-rw-r--r--drivers/gpu/nvgpu/common/pmu/pmu_fw.c4
-rw-r--r--drivers/gpu/nvgpu/ctrl/ctrlclk.h13
-rw-r--r--drivers/gpu/nvgpu/gk20a/gk20a.h3
-rw-r--r--drivers/gpu/nvgpu/include/nvgpu/pmuif/gpmuifclk.h27
-rw-r--r--drivers/gpu/nvgpu/include/nvgpu/pmuif/gpmuifvolt.h2
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
222static u32 clk_pmu_vf_inject(struct gk20a *g, struct set_fll_clk *setfllclk) 222u32 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
264u32 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
297static 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(
127int clk_get_fll_clks(struct gk20a *g, struct set_fll_clk *fllclk); 127int clk_get_fll_clks(struct gk20a *g, struct set_fll_clk *fllclk);
128int clk_set_fll_clks(struct gk20a *g, struct set_fll_clk *fllclk); 128int clk_set_fll_clks(struct gk20a *g, struct set_fll_clk *fllclk);
129int clk_pmu_freq_controller_load(struct gk20a *g, bool bload, u8 bit_idx); 129int clk_pmu_freq_controller_load(struct gk20a *g, bool bload, u8 bit_idx);
130u32 nvgpu_clk_vf_change_inject_data_fill_gv10x(struct gk20a *g,
131 struct nv_pmu_clk_rpc *rpccall,
132 struct set_fll_clk *setfllclk);
133u32 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
179struct 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
186struct 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
339struct 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
339struct nv_pmu_clk_vf_change_inject { 345struct 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
351struct 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 {
400NV_PMU_BOARDOBJ_GRP_SET_MAKE_E32(clk, clk_freq_controller); 412NV_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
410struct nv_pmu_clk_cmd_rpc { 424struct 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
444struct nv_pmu_clk_msg_rpc { 459struct 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
346struct nv_pmu_volt_volt_rail_list_V1 { 346struct 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];