Skip to content

Commit b2f3a93

Browse files
committed
feat: dsc fixes patch
Signed-off-by: Yaroslav Bolyukin <iam@lach.pw>
1 parent e66d294 commit b2f3a93

2 files changed

Lines changed: 170 additions & 0 deletions

File tree

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
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+
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
From 3c2b8455e359368d9c1b35235cdc5355bf0414ac Mon Sep 17 00:00:00 2001
2+
From: Yaroslav Bolyukin <iam@lach.pw>
3+
Date: Wed, 9 Feb 2022 22:31:34 +0300
4+
Subject: [PATCH 2/2] drm/amd: use fixed dsc bits-per-pixel from edid
5+
6+
Signed-off-by: Yaroslav Bolyukin <iam@lach.pw>
7+
---
8+
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c | 2 ++
9+
drivers/gpu/drm/amd/display/dc/core/dc_stream.c | 2 +-
10+
drivers/gpu/drm/amd/display/dc/dc_types.h | 3 +++
11+
3 files changed, 6 insertions(+), 1 deletion(-)
12+
13+
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
14+
index 29f07c26d..b34dd89ae 100644
15+
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
16+
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
17+
@@ -118,6 +118,8 @@ enum dc_edid_status dm_helpers_parse_edid_caps(
18+
19+
edid_caps->edid_hdmi = connector->display_info.is_hdmi;
20+
21+
+ edid_caps->dsc_fixed_bits_per_pixel_x16 = connector->display_info.dp_dsc_bpp;
22+
+
23+
sad_count = drm_edid_to_sad((struct edid *) edid->raw_edid, &sads);
24+
if (sad_count <= 0)
25+
return result;
26+
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_stream.c b/drivers/gpu/drm/amd/display/dc/core/dc_stream.c
27+
index 57cf4cb82..3b2de219d 100644
28+
--- a/drivers/gpu/drm/amd/display/dc/core/dc_stream.c
29+
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_stream.c
30+
@@ -105,6 +105,7 @@ static bool dc_stream_construct(struct dc_stream_state *stream,
31+
32+
/* EDID CAP translation for HDMI 2.0 */
33+
stream->timing.flags.LTE_340MCSC_SCRAMBLE = dc_sink_data->edid_caps.lte_340mcsc_scramble;
34+
+ stream->timing.dsc_fixed_bits_per_pixel_x16 = dc_sink_data->edid_caps.dsc_fixed_bits_per_pixel_x16;
35+
36+
memset(&stream->timing.dsc_cfg, 0, sizeof(stream->timing.dsc_cfg));
37+
stream->timing.dsc_cfg.num_slices_h = 0;
38+
@@ -738,4 +739,3 @@ void dc_stream_log(const struct dc *dc, const struct dc_stream_state *stream)
39+
"\tlink: %d\n",
40+
stream->link->link_index);
41+
}
42+
-
43+
diff --git a/drivers/gpu/drm/amd/display/dc/dc_types.h b/drivers/gpu/drm/amd/display/dc/dc_types.h
44+
index 0285a4b38..ce2e11d70 100644
45+
--- a/drivers/gpu/drm/amd/display/dc/dc_types.h
46+
+++ b/drivers/gpu/drm/amd/display/dc/dc_types.h
47+
@@ -227,6 +227,9 @@ struct dc_edid_caps {
48+
bool edid_hdmi;
49+
bool hdr_supported;
50+
51+
+ /* DisplayPort caps */
52+
+ uint32_t dsc_fixed_bits_per_pixel_x16;
53+
+
54+
struct dc_panel_patch panel_patch;
55+
};
56+
57+
--
58+
2.34.1
59+

0 commit comments

Comments
 (0)