aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/drm_dp_helper.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/drm_dp_helper.c')
-rw-r--r--drivers/gpu/drm/drm_dp_helper.c90
1 files changed, 90 insertions, 0 deletions
diff --git a/drivers/gpu/drm/drm_dp_helper.c b/drivers/gpu/drm/drm_dp_helper.c
index 37c01b6076ec..6d483487f2b4 100644
--- a/drivers/gpu/drm/drm_dp_helper.c
+++ b/drivers/gpu/drm/drm_dp_helper.c
@@ -1352,3 +1352,93 @@ int drm_dp_read_desc(struct drm_dp_aux *aux, struct drm_dp_desc *desc,
1352 return 0; 1352 return 0;
1353} 1353}
1354EXPORT_SYMBOL(drm_dp_read_desc); 1354EXPORT_SYMBOL(drm_dp_read_desc);
1355
1356/**
1357 * DRM DP Helpers for DSC
1358 */
1359u8 drm_dp_dsc_sink_max_slice_count(const u8 dsc_dpcd[DP_DSC_RECEIVER_CAP_SIZE],
1360 bool is_edp)
1361{
1362 u8 slice_cap1 = dsc_dpcd[DP_DSC_SLICE_CAP_1 - DP_DSC_SUPPORT];
1363
1364 if (is_edp) {
1365 /* For eDP, register DSC_SLICE_CAPABILITIES_1 gives slice count */
1366 if (slice_cap1 & DP_DSC_4_PER_DP_DSC_SINK)
1367 return 4;
1368 if (slice_cap1 & DP_DSC_2_PER_DP_DSC_SINK)
1369 return 2;
1370 if (slice_cap1 & DP_DSC_1_PER_DP_DSC_SINK)
1371 return 1;
1372 } else {
1373 /* For DP, use values from DSC_SLICE_CAP_1 and DSC_SLICE_CAP2 */
1374 u8 slice_cap2 = dsc_dpcd[DP_DSC_SLICE_CAP_2 - DP_DSC_SUPPORT];
1375
1376 if (slice_cap2 & DP_DSC_24_PER_DP_DSC_SINK)
1377 return 24;
1378 if (slice_cap2 & DP_DSC_20_PER_DP_DSC_SINK)
1379 return 20;
1380 if (slice_cap2 & DP_DSC_16_PER_DP_DSC_SINK)
1381 return 16;
1382 if (slice_cap1 & DP_DSC_12_PER_DP_DSC_SINK)
1383 return 12;
1384 if (slice_cap1 & DP_DSC_10_PER_DP_DSC_SINK)
1385 return 10;
1386 if (slice_cap1 & DP_DSC_8_PER_DP_DSC_SINK)
1387 return 8;
1388 if (slice_cap1 & DP_DSC_6_PER_DP_DSC_SINK)
1389 return 6;
1390 if (slice_cap1 & DP_DSC_4_PER_DP_DSC_SINK)
1391 return 4;
1392 if (slice_cap1 & DP_DSC_2_PER_DP_DSC_SINK)
1393 return 2;
1394 if (slice_cap1 & DP_DSC_1_PER_DP_DSC_SINK)
1395 return 1;
1396 }
1397
1398 return 0;
1399}
1400EXPORT_SYMBOL(drm_dp_dsc_sink_max_slice_count);
1401
1402u8 drm_dp_dsc_sink_line_buf_depth(const u8 dsc_dpcd[DP_DSC_RECEIVER_CAP_SIZE])
1403{
1404 u8 line_buf_depth = dsc_dpcd[DP_DSC_LINE_BUF_BIT_DEPTH - DP_DSC_SUPPORT];
1405
1406 switch (line_buf_depth & DP_DSC_LINE_BUF_BIT_DEPTH_MASK) {
1407 case DP_DSC_LINE_BUF_BIT_DEPTH_9:
1408 return 9;
1409 case DP_DSC_LINE_BUF_BIT_DEPTH_10:
1410 return 10;
1411 case DP_DSC_LINE_BUF_BIT_DEPTH_11:
1412 return 11;
1413 case DP_DSC_LINE_BUF_BIT_DEPTH_12:
1414 return 12;
1415 case DP_DSC_LINE_BUF_BIT_DEPTH_13:
1416 return 13;
1417 case DP_DSC_LINE_BUF_BIT_DEPTH_14:
1418 return 14;
1419 case DP_DSC_LINE_BUF_BIT_DEPTH_15:
1420 return 15;
1421 case DP_DSC_LINE_BUF_BIT_DEPTH_16:
1422 return 16;
1423 case DP_DSC_LINE_BUF_BIT_DEPTH_8:
1424 return 8;
1425 }
1426
1427 return 0;
1428}
1429EXPORT_SYMBOL(drm_dp_dsc_sink_line_buf_depth);
1430
1431u8 drm_dp_dsc_sink_max_color_depth(const u8 dsc_dpcd[DP_DSC_RECEIVER_CAP_SIZE])
1432{
1433 u8 color_depth = dsc_dpcd[DP_DSC_DEC_COLOR_DEPTH_CAP - DP_DSC_SUPPORT];
1434
1435 if (color_depth & DP_DSC_12_BPC)
1436 return 12;
1437 if (color_depth & DP_DSC_10_BPC)
1438 return 10;
1439 if (color_depth & DP_DSC_8_BPC)
1440 return 8;
1441
1442 return 0;
1443}
1444EXPORT_SYMBOL(drm_dp_dsc_sink_max_color_depth);