summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/common/xve/xve_gp106.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/nvgpu/common/xve/xve_gp106.c')
-rw-r--r--drivers/gpu/nvgpu/common/xve/xve_gp106.c56
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, &current_link_speed); 468 err = g->ops.xve.get_speed(g, &current_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}