diff options
Diffstat (limited to 'drivers/gpu/nvgpu/common/xve')
-rw-r--r-- | drivers/gpu/nvgpu/common/xve/xve_gp106.c | 56 |
1 files changed, 34 insertions, 22 deletions
diff --git a/drivers/gpu/nvgpu/common/xve/xve_gp106.c b/drivers/gpu/nvgpu/common/xve/xve_gp106.c index 3ed02f1b..29d97843 100644 --- a/drivers/gpu/nvgpu/common/xve/xve_gp106.c +++ b/drivers/gpu/nvgpu/common/xve/xve_gp106.c | |||
@@ -104,15 +104,19 @@ int xve_get_speed_gp106(struct gk20a *g, u32 *xve_link_speed) | |||
104 | * Can't use a switch statement becuase switch statements dont work with | 104 | * Can't use a switch statement becuase switch statements dont work with |
105 | * function calls. | 105 | * function calls. |
106 | */ | 106 | */ |
107 | if (link_speed == xve_link_control_status_link_speed_link_speed_2p5_v()) | 107 | if (link_speed == xve_link_control_status_link_speed_link_speed_2p5_v()) { |
108 | real_link_speed = GPU_XVE_SPEED_2P5; | 108 | real_link_speed = GPU_XVE_SPEED_2P5; |
109 | if (link_speed == xve_link_control_status_link_speed_link_speed_5p0_v()) | 109 | } |
110 | if (link_speed == xve_link_control_status_link_speed_link_speed_5p0_v()) { | ||
110 | real_link_speed = GPU_XVE_SPEED_5P0; | 111 | real_link_speed = GPU_XVE_SPEED_5P0; |
111 | if (link_speed == xve_link_control_status_link_speed_link_speed_8p0_v()) | 112 | } |
113 | if (link_speed == xve_link_control_status_link_speed_link_speed_8p0_v()) { | ||
112 | real_link_speed = GPU_XVE_SPEED_8P0; | 114 | real_link_speed = GPU_XVE_SPEED_8P0; |
115 | } | ||
113 | 116 | ||
114 | if (real_link_speed == 0U) | 117 | if (real_link_speed == 0U) { |
115 | return -ENODEV; | 118 | return -ENODEV; |
119 | } | ||
116 | 120 | ||
117 | *xve_link_speed = real_link_speed; | 121 | *xve_link_speed = real_link_speed; |
118 | return 0; | 122 | return 0; |
@@ -240,8 +244,9 @@ static int __do_xve_set_speed_gp106(struct gk20a *g, u32 next_link_speed) | |||
240 | if ((xp_pl_link_config_ltssm_status_f(pl_link_config) == | 244 | if ((xp_pl_link_config_ltssm_status_f(pl_link_config) == |
241 | xp_pl_link_config_ltssm_status_idle_v()) && | 245 | xp_pl_link_config_ltssm_status_idle_v()) && |
242 | (xp_pl_link_config_ltssm_directive_f(pl_link_config) == | 246 | (xp_pl_link_config_ltssm_directive_f(pl_link_config) == |
243 | xp_pl_link_config_ltssm_directive_normal_operations_v())) | 247 | xp_pl_link_config_ltssm_directive_normal_operations_v())) { |
244 | break; | 248 | break; |
249 | } | ||
245 | } while (nvgpu_timeout_expired(&timeout) == 0); | 250 | } while (nvgpu_timeout_expired(&timeout) == 0); |
246 | 251 | ||
247 | if (nvgpu_timeout_peek_expired(&timeout)) { | 252 | if (nvgpu_timeout_peek_expired(&timeout)) { |
@@ -283,23 +288,24 @@ static int __do_xve_set_speed_gp106(struct gk20a *g, u32 next_link_speed) | |||
283 | pl_link_config &= ~xp_pl_link_config_target_tx_width_m(); | 288 | pl_link_config &= ~xp_pl_link_config_target_tx_width_m(); |
284 | 289 | ||
285 | /* Can't use a switch due to oddities in register definitions. */ | 290 | /* Can't use a switch due to oddities in register definitions. */ |
286 | if (link_width == xve_link_control_status_link_width_x1_v()) | 291 | if (link_width == xve_link_control_status_link_width_x1_v()) { |
287 | pl_link_config |= xp_pl_link_config_target_tx_width_f( | 292 | pl_link_config |= xp_pl_link_config_target_tx_width_f( |
288 | xp_pl_link_config_target_tx_width_x1_v()); | 293 | xp_pl_link_config_target_tx_width_x1_v()); |
289 | else if (link_width == xve_link_control_status_link_width_x2_v()) | 294 | } else if (link_width == xve_link_control_status_link_width_x2_v()) { |
290 | pl_link_config |= xp_pl_link_config_target_tx_width_f( | 295 | pl_link_config |= xp_pl_link_config_target_tx_width_f( |
291 | xp_pl_link_config_target_tx_width_x2_v()); | 296 | xp_pl_link_config_target_tx_width_x2_v()); |
292 | else if (link_width == xve_link_control_status_link_width_x4_v()) | 297 | } else if (link_width == xve_link_control_status_link_width_x4_v()) { |
293 | pl_link_config |= xp_pl_link_config_target_tx_width_f( | 298 | pl_link_config |= xp_pl_link_config_target_tx_width_f( |
294 | xp_pl_link_config_target_tx_width_x4_v()); | 299 | xp_pl_link_config_target_tx_width_x4_v()); |
295 | else if (link_width == xve_link_control_status_link_width_x8_v()) | 300 | } else if (link_width == xve_link_control_status_link_width_x8_v()) { |
296 | pl_link_config |= xp_pl_link_config_target_tx_width_f( | 301 | pl_link_config |= xp_pl_link_config_target_tx_width_f( |
297 | xp_pl_link_config_target_tx_width_x8_v()); | 302 | xp_pl_link_config_target_tx_width_x8_v()); |
298 | else if (link_width == xve_link_control_status_link_width_x16_v()) | 303 | } else if (link_width == xve_link_control_status_link_width_x16_v()) { |
299 | pl_link_config |= xp_pl_link_config_target_tx_width_f( | 304 | pl_link_config |= xp_pl_link_config_target_tx_width_f( |
300 | xp_pl_link_config_target_tx_width_x16_v()); | 305 | xp_pl_link_config_target_tx_width_x16_v()); |
301 | else | 306 | } else { |
302 | BUG(); | 307 | BUG(); |
308 | } | ||
303 | 309 | ||
304 | xv_sc_dbg(g, LINK_SETTINGS, " pl_link_config = 0x%08x", pl_link_config); | 310 | xv_sc_dbg(g, LINK_SETTINGS, " pl_link_config = 0x%08x", pl_link_config); |
305 | xv_sc_dbg(g, LINK_SETTINGS, " Done"); | 311 | xv_sc_dbg(g, LINK_SETTINGS, " Done"); |
@@ -311,8 +317,9 @@ static int __do_xve_set_speed_gp106(struct gk20a *g, u32 next_link_speed) | |||
311 | do { | 317 | do { |
312 | gk20a_writel(g, xp_pl_link_config_r(0), pl_link_config); | 318 | gk20a_writel(g, xp_pl_link_config_r(0), pl_link_config); |
313 | if (pl_link_config == | 319 | if (pl_link_config == |
314 | gk20a_readl(g, xp_pl_link_config_r(0))) | 320 | gk20a_readl(g, xp_pl_link_config_r(0))) { |
315 | break; | 321 | break; |
322 | } | ||
316 | } while (nvgpu_timeout_expired(&timeout) == 0); | 323 | } while (nvgpu_timeout_expired(&timeout) == 0); |
317 | 324 | ||
318 | if (nvgpu_timeout_peek_expired(&timeout)) { | 325 | if (nvgpu_timeout_peek_expired(&timeout)) { |
@@ -346,8 +353,9 @@ static int __do_xve_set_speed_gp106(struct gk20a *g, u32 next_link_speed) | |||
346 | (xp_pl_link_config_ltssm_status_f(pl_link_config) == | 353 | (xp_pl_link_config_ltssm_status_f(pl_link_config) == |
347 | xp_pl_link_config_ltssm_status_idle_v()) && | 354 | xp_pl_link_config_ltssm_status_idle_v()) && |
348 | (xp_pl_link_config_ltssm_directive_f(pl_link_config) == | 355 | (xp_pl_link_config_ltssm_directive_f(pl_link_config) == |
349 | xp_pl_link_config_ltssm_directive_normal_operations_v())) | 356 | xp_pl_link_config_ltssm_directive_normal_operations_v())) { |
350 | break; | 357 | break; |
358 | } | ||
351 | } while (nvgpu_timeout_expired(&timeout) == 0); | 359 | } while (nvgpu_timeout_expired(&timeout) == 0); |
352 | 360 | ||
353 | if (nvgpu_timeout_peek_expired(&timeout)) { | 361 | if (nvgpu_timeout_peek_expired(&timeout)) { |
@@ -403,20 +411,21 @@ static int __do_xve_set_speed_gp106(struct gk20a *g, u32 next_link_speed) | |||
403 | 411 | ||
404 | link_config &= ~xp_pl_link_config_max_link_rate_m(); | 412 | link_config &= ~xp_pl_link_config_max_link_rate_m(); |
405 | if (new_link_speed == | 413 | if (new_link_speed == |
406 | xve_link_control_status_link_speed_link_speed_2p5_v()) | 414 | xve_link_control_status_link_speed_link_speed_2p5_v()) { |
407 | link_config |= xp_pl_link_config_max_link_rate_f( | 415 | link_config |= xp_pl_link_config_max_link_rate_f( |
408 | xp_pl_link_config_max_link_rate_2500_mtps_v()); | 416 | xp_pl_link_config_max_link_rate_2500_mtps_v()); |
409 | else if (new_link_speed == | 417 | } else if (new_link_speed == |
410 | xve_link_control_status_link_speed_link_speed_5p0_v()) | 418 | xve_link_control_status_link_speed_link_speed_5p0_v()) { |
411 | link_config |= xp_pl_link_config_max_link_rate_f( | 419 | link_config |= xp_pl_link_config_max_link_rate_f( |
412 | xp_pl_link_config_max_link_rate_5000_mtps_v()); | 420 | xp_pl_link_config_max_link_rate_5000_mtps_v()); |
413 | else if (new_link_speed == | 421 | } else if (new_link_speed == |
414 | xve_link_control_status_link_speed_link_speed_8p0_v()) | 422 | xve_link_control_status_link_speed_link_speed_8p0_v()) { |
415 | link_config |= xp_pl_link_config_max_link_rate_f( | 423 | link_config |= xp_pl_link_config_max_link_rate_f( |
416 | xp_pl_link_config_max_link_rate_8000_mtps_v()); | 424 | xp_pl_link_config_max_link_rate_8000_mtps_v()); |
417 | else | 425 | } else { |
418 | link_config |= xp_pl_link_config_max_link_rate_f( | 426 | link_config |= xp_pl_link_config_max_link_rate_f( |
419 | xp_pl_link_config_max_link_rate_2500_mtps_v()); | 427 | xp_pl_link_config_max_link_rate_2500_mtps_v()); |
428 | } | ||
420 | 429 | ||
421 | gk20a_writel(g, xp_pl_link_config_r(0), link_config); | 430 | gk20a_writel(g, xp_pl_link_config_r(0), link_config); |
422 | err_status = -ENODEV; | 431 | err_status = -ENODEV; |
@@ -452,16 +461,19 @@ int xve_set_speed_gp106(struct gk20a *g, u32 next_link_speed) | |||
452 | u32 current_link_speed; | 461 | u32 current_link_speed; |
453 | int err; | 462 | int err; |
454 | 463 | ||
455 | if ((next_link_speed & GPU_XVE_SPEED_MASK) == 0) | 464 | if ((next_link_speed & GPU_XVE_SPEED_MASK) == 0) { |
456 | return -EINVAL; | 465 | return -EINVAL; |
466 | } | ||
457 | 467 | ||
458 | err = g->ops.xve.get_speed(g, ¤t_link_speed); | 468 | err = g->ops.xve.get_speed(g, ¤t_link_speed); |
459 | if (err) | 469 | if (err) { |
460 | return err; | 470 | return err; |
471 | } | ||
461 | 472 | ||
462 | /* No-op. */ | 473 | /* No-op. */ |
463 | if (current_link_speed == next_link_speed) | 474 | if (current_link_speed == next_link_speed) { |
464 | return 0; | 475 | return 0; |
476 | } | ||
465 | 477 | ||
466 | return __do_xve_set_speed_gp106(g, next_link_speed); | 478 | return __do_xve_set_speed_gp106(g, next_link_speed); |
467 | } | 479 | } |