OSDN Git Service

drm/amd/display: fix link bw calculation for 422 and 420 encoding
authorEric Yang <Eric.Yang2@amd.com>
Fri, 23 Mar 2018 17:56:16 +0000 (13:56 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 11 Apr 2018 18:08:08 +0000 (13:08 -0500)
Link bw required is reduced when we have chroma subsampling.

Signed-off-by: Eric Yang <Eric.Yang2@amd.com>
Reviewed-by: Charlene Liu <Charlene.Liu@amd.com>
Acked-by: Harry Wentland <harry.wentland@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c

index b86325b..07cc438 100644 (file)
@@ -1378,37 +1378,48 @@ static uint32_t bandwidth_in_kbps_from_timing(
 {
        uint32_t bits_per_channel = 0;
        uint32_t kbps;
-       switch (timing->display_color_depth) {
 
-       case COLOR_DEPTH_666:
-               bits_per_channel = 6;
-               break;
-       case COLOR_DEPTH_888:
-               bits_per_channel = 8;
-               break;
-       case COLOR_DEPTH_101010:
-               bits_per_channel = 10;
-               break;
-       case COLOR_DEPTH_121212:
+       if (timing->pixel_encoding == PIXEL_ENCODING_YCBCR422)
                bits_per_channel = 12;
-               break;
-       case COLOR_DEPTH_141414:
-               bits_per_channel = 14;
-               break;
-       case COLOR_DEPTH_161616:
-               bits_per_channel = 16;
-               break;
-       default:
-               break;
+       else{
+
+               switch (timing->display_color_depth) {
+
+               case COLOR_DEPTH_666:
+                       bits_per_channel = 6;
+                       break;
+               case COLOR_DEPTH_888:
+                       bits_per_channel = 8;
+                       break;
+               case COLOR_DEPTH_101010:
+                       bits_per_channel = 10;
+                       break;
+               case COLOR_DEPTH_121212:
+                       bits_per_channel = 12;
+                       break;
+               case COLOR_DEPTH_141414:
+                       bits_per_channel = 14;
+                       break;
+               case COLOR_DEPTH_161616:
+                       bits_per_channel = 16;
+                       break;
+               default:
+                       break;
+               }
        }
        ASSERT(bits_per_channel != 0);
 
        kbps = timing->pix_clk_khz;
        kbps *= bits_per_channel;
 
-       if (timing->flags.Y_ONLY != 1)
+       if (timing->flags.Y_ONLY != 1) {
                /*Only YOnly make reduce bandwidth by 1/3 compares to RGB*/
                kbps *= 3;
+               if (timing->pixel_encoding == PIXEL_ENCODING_YCBCR420)
+                       kbps /= 2;
+               else if (timing->pixel_encoding == PIXEL_ENCODING_YCBCR422)
+                       kbps = kbps * 2 / 3;
+       }
 
        return kbps;