|
| 1 | +From 1a76a6ec03d7b8d821d2da36fa4366b487a4e51b Mon Sep 17 00:00:00 2001 |
| 2 | +From: Yaroslav Bolyukin <iam@lach.pw> |
| 3 | +Date: Wed, 9 Feb 2022 22:30:24 +0300 |
| 4 | +Subject: [PATCH 1/2] edid: parse DRM VESA dsc bpp target |
| 5 | + |
| 6 | +I can't find this field in spec, but `edid-decode` supports it: |
| 7 | +https://git.linuxtv.org/edid-decode.git/tree/parse-displayid-block.cpp#n1572 |
| 8 | +And it is also described in wikipedia: |
| 9 | +https://en.wikipedia.org/wiki/DisplayID#0x7E_Vendor-specific_data |
| 10 | + |
| 11 | +Signed-off-by: Yaroslav Bolyukin <iam@lach.pw> |
| 12 | +--- |
| 13 | + drivers/gpu/drm/drm_edid.c | 31 ++++++++++++++++++++----------- |
| 14 | + include/drm/drm_connector.h | 6 ++++++ |
| 15 | + include/drm/drm_displayid.h | 4 ++++ |
| 16 | + 3 files changed, 30 insertions(+), 11 deletions(-) |
| 17 | + |
| 18 | +diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c |
| 19 | +index 5f2ae5bfa..58f9657ae 100644 |
| 20 | +--- a/drivers/gpu/drm/drm_edid.c |
| 21 | ++++ b/drivers/gpu/drm/drm_edid.c |
| 22 | +@@ -5245,7 +5245,7 @@ static void drm_parse_vesa_mso_data(struct drm_connector *connector, |
| 23 | + if (oui(vesa->oui[0], vesa->oui[1], vesa->oui[2]) != VESA_IEEE_OUI) |
| 24 | + return; |
| 25 | + |
| 26 | +- if (sizeof(*vesa) != sizeof(*block) + block->num_bytes) { |
| 27 | ++ if (block->num_bytes < 5) { |
| 28 | + drm_dbg_kms(connector->dev, "Unexpected VESA vendor block size\n"); |
| 29 | + return; |
| 30 | + } |
| 31 | +@@ -5265,20 +5265,29 @@ static void drm_parse_vesa_mso_data(struct drm_connector *connector, |
| 32 | + break; |
| 33 | + } |
| 34 | + |
| 35 | +- if (!info->mso_stream_count) { |
| 36 | +- info->mso_pixel_overlap = 0; |
| 37 | +- return; |
| 38 | ++ info->mso_pixel_overlap = 0; |
| 39 | ++ |
| 40 | ++ if (info->mso_stream_count) { |
| 41 | ++ info->mso_pixel_overlap = FIELD_GET(DISPLAYID_VESA_MSO_OVERLAP, vesa->mso); |
| 42 | ++ if (info->mso_pixel_overlap > 8) { |
| 43 | ++ drm_dbg_kms(connector->dev, "Reserved MSO pixel overlap value %u\n", |
| 44 | ++ info->mso_pixel_overlap); |
| 45 | ++ info->mso_pixel_overlap = 8; |
| 46 | ++ } |
| 47 | ++ |
| 48 | ++ drm_dbg_kms(connector->dev, "MSO stream count %u, pixel overlap %u\n", |
| 49 | ++ info->mso_stream_count, info->mso_pixel_overlap); |
| 50 | + } |
| 51 | + |
| 52 | +- info->mso_pixel_overlap = FIELD_GET(DISPLAYID_VESA_MSO_OVERLAP, vesa->mso); |
| 53 | +- if (info->mso_pixel_overlap > 8) { |
| 54 | +- drm_dbg_kms(connector->dev, "Reserved MSO pixel overlap value %u\n", |
| 55 | +- info->mso_pixel_overlap); |
| 56 | +- info->mso_pixel_overlap = 8; |
| 57 | ++ if (block->num_bytes < 7) { |
| 58 | ++ /* DSC bpp is optional */ |
| 59 | ++ return; |
| 60 | + } |
| 61 | + |
| 62 | +- drm_dbg_kms(connector->dev, "MSO stream count %u, pixel overlap %u\n", |
| 63 | +- info->mso_stream_count, info->mso_pixel_overlap); |
| 64 | ++ info->dp_dsc_bpp = FIELD_GET(DISPLAYID_VESA_DSC_BPP_INT, vesa->dsc_bpp_int) * 16 + |
| 65 | ++ FIELD_GET(DISPLAYID_VESA_DSC_BPP_FRACT, vesa->dsc_bpp_fract); |
| 66 | ++ |
| 67 | ++ drm_dbg_kms(connector->dev, "DSC bits per pixel %u\n", info->dp_dsc_bpp); |
| 68 | + } |
| 69 | + |
| 70 | + static void drm_update_mso(struct drm_connector *connector, const struct edid *edid) |
| 71 | +diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h |
| 72 | +index b501d0bad..7185ec21f 100644 |
| 73 | +--- a/include/drm/drm_connector.h |
| 74 | ++++ b/include/drm/drm_connector.h |
| 75 | +@@ -628,6 +628,12 @@ struct drm_display_info { |
| 76 | + * @mso_pixel_overlap: eDP MSO segment pixel overlap, 0-8 pixels. |
| 77 | + */ |
| 78 | + u8 mso_pixel_overlap; |
| 79 | ++ |
| 80 | ++ /** |
| 81 | ++ * @dp_dsc_bpp: DP Display-Stream-Compression (DSC) timing's target |
| 82 | ++ * DST bits per pixel in 6.4 fixed point format. 0 means undefined |
| 83 | ++ */ |
| 84 | ++ u16 dp_dsc_bpp; |
| 85 | + }; |
| 86 | + |
| 87 | + int drm_display_info_set_bus_formats(struct drm_display_info *info, |
| 88 | +diff --git a/include/drm/drm_displayid.h b/include/drm/drm_displayid.h |
| 89 | +index 7ffbd9f7b..1be6deddc 100644 |
| 90 | +--- a/include/drm/drm_displayid.h |
| 91 | ++++ b/include/drm/drm_displayid.h |
| 92 | +@@ -131,12 +131,16 @@ struct displayid_detailed_timing_block { |
| 93 | + |
| 94 | + #define DISPLAYID_VESA_MSO_OVERLAP GENMASK(3, 0) |
| 95 | + #define DISPLAYID_VESA_MSO_MODE GENMASK(6, 5) |
| 96 | ++#define DISPLAYID_VESA_DSC_BPP_INT GENMASK(5, 0) |
| 97 | ++#define DISPLAYID_VESA_DSC_BPP_FRACT GENMASK(3, 0) |
| 98 | + |
| 99 | + struct displayid_vesa_vendor_specific_block { |
| 100 | + struct displayid_block base; |
| 101 | + u8 oui[3]; |
| 102 | + u8 data_structure_type; |
| 103 | + u8 mso; |
| 104 | ++ u8 dsc_bpp_int; |
| 105 | ++ u8 dsc_bpp_fract; |
| 106 | + } __packed; |
| 107 | + |
| 108 | + /* DisplayID iteration */ |
| 109 | +-- |
| 110 | +2.34.1 |
| 111 | + |
0 commit comments