@@ -302,77 +302,31 @@ static int convert_bpc_to_bpp(int bpc)
302
302
return bpc * 3 ;
303
303
}
304
304
305
- /* get the max pix clock supported by the link rate and lane num */
306
- static int dp_get_max_dp_pix_clock (int link_rate ,
307
- int lane_num ,
308
- int bpp )
309
- {
310
- return (link_rate * lane_num * 8 ) / bpp ;
311
- }
312
-
313
305
/***** radeon specific DP functions *****/
314
306
315
- int radeon_dp_get_max_link_rate (struct drm_connector * connector ,
316
- const u8 dpcd [DP_DPCD_SIZE ])
317
- {
318
- int max_link_rate ;
319
-
320
- if (radeon_connector_is_dp12_capable (connector ))
321
- max_link_rate = min (drm_dp_max_link_rate (dpcd ), 540000 );
322
- else
323
- max_link_rate = min (drm_dp_max_link_rate (dpcd ), 270000 );
324
-
325
- return max_link_rate ;
326
- }
327
-
328
- /* First get the min lane# when low rate is used according to pixel clock
329
- * (prefer low rate), second check max lane# supported by DP panel,
330
- * if the max lane# < low rate lane# then use max lane# instead.
331
- */
332
- static int radeon_dp_get_dp_lane_number (struct drm_connector * connector ,
333
- const u8 dpcd [DP_DPCD_SIZE ],
334
- int pix_clock )
335
- {
336
- int bpp = convert_bpc_to_bpp (radeon_get_monitor_bpc (connector ));
337
- int max_link_rate = radeon_dp_get_max_link_rate (connector , dpcd );
338
- int max_lane_num = drm_dp_max_lane_count (dpcd );
339
- int lane_num ;
340
- int max_dp_pix_clock ;
341
-
342
- for (lane_num = 1 ; lane_num < max_lane_num ; lane_num <<= 1 ) {
343
- max_dp_pix_clock = dp_get_max_dp_pix_clock (max_link_rate , lane_num , bpp );
344
- if (pix_clock <= max_dp_pix_clock )
345
- break ;
346
- }
347
-
348
- return lane_num ;
349
- }
350
-
351
- static int radeon_dp_get_dp_link_clock (struct drm_connector * connector ,
352
- const u8 dpcd [DP_DPCD_SIZE ],
353
- int pix_clock )
307
+ int radeon_dp_get_dp_link_config (struct drm_connector * connector ,
308
+ const u8 dpcd [DP_DPCD_SIZE ],
309
+ unsigned pix_clock ,
310
+ unsigned * dp_lanes , unsigned * dp_rate )
354
311
{
355
312
int bpp = convert_bpc_to_bpp (radeon_get_monitor_bpc (connector ));
356
- int lane_num , max_pix_clock ;
357
-
358
- if (radeon_connector_encoder_get_dp_bridge_encoder_id (connector ) ==
359
- ENCODER_OBJECT_ID_NUTMEG )
360
- return 270000 ;
361
-
362
- lane_num = radeon_dp_get_dp_lane_number (connector , dpcd , pix_clock );
363
- max_pix_clock = dp_get_max_dp_pix_clock (162000 , lane_num , bpp );
364
- if (pix_clock <= max_pix_clock )
365
- return 162000 ;
366
- max_pix_clock = dp_get_max_dp_pix_clock (270000 , lane_num , bpp );
367
- if (pix_clock <= max_pix_clock )
368
- return 270000 ;
369
- if (radeon_connector_is_dp12_capable (connector )) {
370
- max_pix_clock = dp_get_max_dp_pix_clock (540000 , lane_num , bpp );
371
- if (pix_clock <= max_pix_clock )
372
- return 540000 ;
313
+ static const unsigned link_rates [3 ] = { 162000 , 270000 , 540000 };
314
+ unsigned max_link_rate = drm_dp_max_link_rate (dpcd );
315
+ unsigned max_lane_num = drm_dp_max_lane_count (dpcd );
316
+ unsigned lane_num , i , max_pix_clock ;
317
+
318
+ for (lane_num = 1 ; lane_num <= max_lane_num ; lane_num <<= 1 ) {
319
+ for (i = 0 ; i < ARRAY_SIZE (link_rates ) && link_rates [i ] <= max_link_rate ; i ++ ) {
320
+ max_pix_clock = (lane_num * link_rates [i ] * 8 ) / bpp ;
321
+ if (max_pix_clock >= pix_clock ) {
322
+ * dp_lanes = lane_num ;
323
+ * dp_rate = link_rates [i ];
324
+ return 0 ;
325
+ }
326
+ }
373
327
}
374
328
375
- return radeon_dp_get_max_link_rate ( connector , dpcd ) ;
329
+ return - EINVAL ;
376
330
}
377
331
378
332
static u8 radeon_dp_encoder_service (struct radeon_device * rdev ,
@@ -491,17 +445,22 @@ void radeon_dp_set_link_config(struct drm_connector *connector,
491
445
{
492
446
struct radeon_connector * radeon_connector = to_radeon_connector (connector );
493
447
struct radeon_connector_atom_dig * dig_connector ;
448
+ int ret ;
494
449
495
450
if (!radeon_connector -> con_priv )
496
451
return ;
497
452
dig_connector = radeon_connector -> con_priv ;
498
453
499
454
if ((dig_connector -> dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT ) ||
500
455
(dig_connector -> dp_sink_type == CONNECTOR_OBJECT_ID_eDP )) {
501
- dig_connector -> dp_clock =
502
- radeon_dp_get_dp_link_clock (connector , dig_connector -> dpcd , mode -> clock );
503
- dig_connector -> dp_lane_count =
504
- radeon_dp_get_dp_lane_number (connector , dig_connector -> dpcd , mode -> clock );
456
+ ret = radeon_dp_get_dp_link_config (connector , dig_connector -> dpcd ,
457
+ mode -> clock ,
458
+ & dig_connector -> dp_lane_count ,
459
+ & dig_connector -> dp_clock );
460
+ if (ret ) {
461
+ dig_connector -> dp_clock = 0 ;
462
+ dig_connector -> dp_lane_count = 0 ;
463
+ }
505
464
}
506
465
}
507
466
@@ -510,7 +469,8 @@ int radeon_dp_mode_valid_helper(struct drm_connector *connector,
510
469
{
511
470
struct radeon_connector * radeon_connector = to_radeon_connector (connector );
512
471
struct radeon_connector_atom_dig * dig_connector ;
513
- int dp_clock ;
472
+ unsigned dp_clock , dp_lanes ;
473
+ int ret ;
514
474
515
475
if ((mode -> clock > 340000 ) &&
516
476
(!radeon_connector_is_dp12_capable (connector )))
@@ -520,8 +480,12 @@ int radeon_dp_mode_valid_helper(struct drm_connector *connector,
520
480
return MODE_CLOCK_HIGH ;
521
481
dig_connector = radeon_connector -> con_priv ;
522
482
523
- dp_clock =
524
- radeon_dp_get_dp_link_clock (connector , dig_connector -> dpcd , mode -> clock );
483
+ ret = radeon_dp_get_dp_link_config (connector , dig_connector -> dpcd ,
484
+ mode -> clock ,
485
+ & dp_lanes ,
486
+ & dp_clock );
487
+ if (ret )
488
+ return MODE_CLOCK_HIGH ;
525
489
526
490
if ((dp_clock == 540000 ) &&
527
491
(!radeon_connector_is_dp12_capable (connector )))
0 commit comments