Skip to content

Commit 09b27a4

Browse files
Paloma Arellanolumag
authored andcommitted
drm/msm/dp: move parity calculation to dp_utils
Parity calculation is necessary for VSC SDP implementation. Therefore create new files dp_utils.c and dp_utils.h and move the parity calculating functions here. This ensures that they are usable by SDP programming in both dp_catalog.c and dp_audio.c Changes in v3: - Change ordering of the header byte macros Changes in v2: - Create new files dp_utils.c and dp_utils.h - Move the parity calculation to these new files instead of having them in dp_catalog.c and dp_catalog.h Signed-off-by: Paloma Arellano <quic_parellan@quicinc.com> Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> Patchwork: https://patchwork.freedesktop.org/patch/579617/ Link: https://lore.kernel.org/r/20240222194025.25329-13-quic_parellan@quicinc.com Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
1 parent 6db6e56 commit 09b27a4

4 files changed

Lines changed: 112 additions & 87 deletions

File tree

drivers/gpu/drm/msm/Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,8 @@ msm-$(CONFIG_DRM_MSM_DP)+= dp/dp_aux.o \
127127
dp/dp_drm.o \
128128
dp/dp_link.o \
129129
dp/dp_panel.o \
130-
dp/dp_audio.o
130+
dp/dp_audio.o \
131+
dp/dp_utils.o
131132

132133
msm-$(CONFIG_DRM_FBDEV_EMULATION) += msm_fbdev.o
133134

drivers/gpu/drm/msm/dp/dp_audio.c

Lines changed: 15 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,7 @@
1515
#include "dp_audio.h"
1616
#include "dp_panel.h"
1717
#include "dp_display.h"
18-
19-
#define HEADER_BYTE_2_BIT 0
20-
#define PARITY_BYTE_2_BIT 8
21-
#define HEADER_BYTE_1_BIT 16
22-
#define PARITY_BYTE_1_BIT 24
23-
#define HEADER_BYTE_3_BIT 16
24-
#define PARITY_BYTE_3_BIT 24
18+
#include "dp_utils.h"
2519

2620
struct dp_audio_private {
2721
struct platform_device *audio_pdev;
@@ -36,71 +30,6 @@ struct dp_audio_private {
3630
struct dp_audio dp_audio;
3731
};
3832

39-
static u8 dp_audio_get_g0_value(u8 data)
40-
{
41-
u8 c[4];
42-
u8 g[4];
43-
u8 ret_data = 0;
44-
u8 i;
45-
46-
for (i = 0; i < 4; i++)
47-
c[i] = (data >> i) & 0x01;
48-
49-
g[0] = c[3];
50-
g[1] = c[0] ^ c[3];
51-
g[2] = c[1];
52-
g[3] = c[2];
53-
54-
for (i = 0; i < 4; i++)
55-
ret_data = ((g[i] & 0x01) << i) | ret_data;
56-
57-
return ret_data;
58-
}
59-
60-
static u8 dp_audio_get_g1_value(u8 data)
61-
{
62-
u8 c[4];
63-
u8 g[4];
64-
u8 ret_data = 0;
65-
u8 i;
66-
67-
for (i = 0; i < 4; i++)
68-
c[i] = (data >> i) & 0x01;
69-
70-
g[0] = c[0] ^ c[3];
71-
g[1] = c[0] ^ c[1] ^ c[3];
72-
g[2] = c[1] ^ c[2];
73-
g[3] = c[2] ^ c[3];
74-
75-
for (i = 0; i < 4; i++)
76-
ret_data = ((g[i] & 0x01) << i) | ret_data;
77-
78-
return ret_data;
79-
}
80-
81-
static u8 dp_audio_calculate_parity(u32 data)
82-
{
83-
u8 x0 = 0;
84-
u8 x1 = 0;
85-
u8 ci = 0;
86-
u8 iData = 0;
87-
u8 i = 0;
88-
u8 parity_byte;
89-
u8 num_byte = (data & 0xFF00) > 0 ? 8 : 2;
90-
91-
for (i = 0; i < num_byte; i++) {
92-
iData = (data >> i*4) & 0xF;
93-
94-
ci = iData ^ x1;
95-
x1 = x0 ^ dp_audio_get_g1_value(ci);
96-
x0 = dp_audio_get_g0_value(ci);
97-
}
98-
99-
parity_byte = x1 | (x0 << 4);
100-
101-
return parity_byte;
102-
}
103-
10433
static u32 dp_audio_get_header(struct dp_catalog *catalog,
10534
enum dp_catalog_audio_sdp_type sdp,
10635
enum dp_catalog_audio_header_type header)
@@ -134,7 +63,7 @@ static void dp_audio_stream_sdp(struct dp_audio_private *audio)
13463
DP_AUDIO_SDP_STREAM, DP_AUDIO_SDP_HEADER_1);
13564

13665
new_value = 0x02;
137-
parity_byte = dp_audio_calculate_parity(new_value);
66+
parity_byte = dp_utils_calculate_parity(new_value);
13867
value |= ((new_value << HEADER_BYTE_1_BIT)
13968
| (parity_byte << PARITY_BYTE_1_BIT));
14069
drm_dbg_dp(audio->drm_dev,
@@ -147,7 +76,7 @@ static void dp_audio_stream_sdp(struct dp_audio_private *audio)
14776
value = dp_audio_get_header(catalog,
14877
DP_AUDIO_SDP_STREAM, DP_AUDIO_SDP_HEADER_2);
14978
new_value = value;
150-
parity_byte = dp_audio_calculate_parity(new_value);
79+
parity_byte = dp_utils_calculate_parity(new_value);
15180
value |= ((new_value << HEADER_BYTE_2_BIT)
15281
| (parity_byte << PARITY_BYTE_2_BIT));
15382
drm_dbg_dp(audio->drm_dev,
@@ -162,7 +91,7 @@ static void dp_audio_stream_sdp(struct dp_audio_private *audio)
16291
DP_AUDIO_SDP_STREAM, DP_AUDIO_SDP_HEADER_3);
16392

16493
new_value = audio->channels - 1;
165-
parity_byte = dp_audio_calculate_parity(new_value);
94+
parity_byte = dp_utils_calculate_parity(new_value);
16695
value |= ((new_value << HEADER_BYTE_3_BIT)
16796
| (parity_byte << PARITY_BYTE_3_BIT));
16897
drm_dbg_dp(audio->drm_dev,
@@ -184,7 +113,7 @@ static void dp_audio_timestamp_sdp(struct dp_audio_private *audio)
184113
DP_AUDIO_SDP_TIMESTAMP, DP_AUDIO_SDP_HEADER_1);
185114

186115
new_value = 0x1;
187-
parity_byte = dp_audio_calculate_parity(new_value);
116+
parity_byte = dp_utils_calculate_parity(new_value);
188117
value |= ((new_value << HEADER_BYTE_1_BIT)
189118
| (parity_byte << PARITY_BYTE_1_BIT));
190119
drm_dbg_dp(audio->drm_dev,
@@ -198,7 +127,7 @@ static void dp_audio_timestamp_sdp(struct dp_audio_private *audio)
198127
DP_AUDIO_SDP_TIMESTAMP, DP_AUDIO_SDP_HEADER_2);
199128

200129
new_value = 0x17;
201-
parity_byte = dp_audio_calculate_parity(new_value);
130+
parity_byte = dp_utils_calculate_parity(new_value);
202131
value |= ((new_value << HEADER_BYTE_2_BIT)
203132
| (parity_byte << PARITY_BYTE_2_BIT));
204133
drm_dbg_dp(audio->drm_dev,
@@ -212,7 +141,7 @@ static void dp_audio_timestamp_sdp(struct dp_audio_private *audio)
212141
DP_AUDIO_SDP_TIMESTAMP, DP_AUDIO_SDP_HEADER_3);
213142

214143
new_value = (0x0 | (0x11 << 2));
215-
parity_byte = dp_audio_calculate_parity(new_value);
144+
parity_byte = dp_utils_calculate_parity(new_value);
216145
value |= ((new_value << HEADER_BYTE_3_BIT)
217146
| (parity_byte << PARITY_BYTE_3_BIT));
218147
drm_dbg_dp(audio->drm_dev,
@@ -233,7 +162,7 @@ static void dp_audio_infoframe_sdp(struct dp_audio_private *audio)
233162
DP_AUDIO_SDP_INFOFRAME, DP_AUDIO_SDP_HEADER_1);
234163

235164
new_value = 0x84;
236-
parity_byte = dp_audio_calculate_parity(new_value);
165+
parity_byte = dp_utils_calculate_parity(new_value);
237166
value |= ((new_value << HEADER_BYTE_1_BIT)
238167
| (parity_byte << PARITY_BYTE_1_BIT));
239168
drm_dbg_dp(audio->drm_dev,
@@ -247,7 +176,7 @@ static void dp_audio_infoframe_sdp(struct dp_audio_private *audio)
247176
DP_AUDIO_SDP_INFOFRAME, DP_AUDIO_SDP_HEADER_2);
248177

249178
new_value = 0x1b;
250-
parity_byte = dp_audio_calculate_parity(new_value);
179+
parity_byte = dp_utils_calculate_parity(new_value);
251180
value |= ((new_value << HEADER_BYTE_2_BIT)
252181
| (parity_byte << PARITY_BYTE_2_BIT));
253182
drm_dbg_dp(audio->drm_dev,
@@ -261,7 +190,7 @@ static void dp_audio_infoframe_sdp(struct dp_audio_private *audio)
261190
DP_AUDIO_SDP_INFOFRAME, DP_AUDIO_SDP_HEADER_3);
262191

263192
new_value = (0x0 | (0x11 << 2));
264-
parity_byte = dp_audio_calculate_parity(new_value);
193+
parity_byte = dp_utils_calculate_parity(new_value);
265194
value |= ((new_value << HEADER_BYTE_3_BIT)
266195
| (parity_byte << PARITY_BYTE_3_BIT));
267196
drm_dbg_dp(audio->drm_dev,
@@ -282,7 +211,7 @@ static void dp_audio_copy_management_sdp(struct dp_audio_private *audio)
282211
DP_AUDIO_SDP_COPYMANAGEMENT, DP_AUDIO_SDP_HEADER_1);
283212

284213
new_value = 0x05;
285-
parity_byte = dp_audio_calculate_parity(new_value);
214+
parity_byte = dp_utils_calculate_parity(new_value);
286215
value |= ((new_value << HEADER_BYTE_1_BIT)
287216
| (parity_byte << PARITY_BYTE_1_BIT));
288217
drm_dbg_dp(audio->drm_dev,
@@ -296,7 +225,7 @@ static void dp_audio_copy_management_sdp(struct dp_audio_private *audio)
296225
DP_AUDIO_SDP_COPYMANAGEMENT, DP_AUDIO_SDP_HEADER_2);
297226

298227
new_value = 0x0F;
299-
parity_byte = dp_audio_calculate_parity(new_value);
228+
parity_byte = dp_utils_calculate_parity(new_value);
300229
value |= ((new_value << HEADER_BYTE_2_BIT)
301230
| (parity_byte << PARITY_BYTE_2_BIT));
302231
drm_dbg_dp(audio->drm_dev,
@@ -310,7 +239,7 @@ static void dp_audio_copy_management_sdp(struct dp_audio_private *audio)
310239
DP_AUDIO_SDP_COPYMANAGEMENT, DP_AUDIO_SDP_HEADER_3);
311240

312241
new_value = 0x0;
313-
parity_byte = dp_audio_calculate_parity(new_value);
242+
parity_byte = dp_utils_calculate_parity(new_value);
314243
value |= ((new_value << HEADER_BYTE_3_BIT)
315244
| (parity_byte << PARITY_BYTE_3_BIT));
316245
drm_dbg_dp(audio->drm_dev,
@@ -331,7 +260,7 @@ static void dp_audio_isrc_sdp(struct dp_audio_private *audio)
331260
DP_AUDIO_SDP_ISRC, DP_AUDIO_SDP_HEADER_1);
332261

333262
new_value = 0x06;
334-
parity_byte = dp_audio_calculate_parity(new_value);
263+
parity_byte = dp_utils_calculate_parity(new_value);
335264
value |= ((new_value << HEADER_BYTE_1_BIT)
336265
| (parity_byte << PARITY_BYTE_1_BIT));
337266
drm_dbg_dp(audio->drm_dev,
@@ -345,7 +274,7 @@ static void dp_audio_isrc_sdp(struct dp_audio_private *audio)
345274
DP_AUDIO_SDP_ISRC, DP_AUDIO_SDP_HEADER_2);
346275

347276
new_value = 0x0F;
348-
parity_byte = dp_audio_calculate_parity(new_value);
277+
parity_byte = dp_utils_calculate_parity(new_value);
349278
value |= ((new_value << HEADER_BYTE_2_BIT)
350279
| (parity_byte << PARITY_BYTE_2_BIT));
351280
drm_dbg_dp(audio->drm_dev,

drivers/gpu/drm/msm/dp/dp_utils.c

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
/* SPDX-License-Identifier: GPL-2.0-only */
2+
/*
3+
* Copyright (c) 2024, The Linux Foundation. All rights reserved.
4+
*/
5+
6+
#include <linux/types.h>
7+
8+
#include "dp_utils.h"
9+
10+
u8 dp_utils_get_g0_value(u8 data)
11+
{
12+
u8 c[4];
13+
u8 g[4];
14+
u8 ret_data = 0;
15+
u8 i;
16+
17+
for (i = 0; i < 4; i++)
18+
c[i] = (data >> i) & 0x01;
19+
20+
g[0] = c[3];
21+
g[1] = c[0] ^ c[3];
22+
g[2] = c[1];
23+
g[3] = c[2];
24+
25+
for (i = 0; i < 4; i++)
26+
ret_data = ((g[i] & 0x01) << i) | ret_data;
27+
28+
return ret_data;
29+
}
30+
31+
u8 dp_utils_get_g1_value(u8 data)
32+
{
33+
u8 c[4];
34+
u8 g[4];
35+
u8 ret_data = 0;
36+
u8 i;
37+
38+
for (i = 0; i < 4; i++)
39+
c[i] = (data >> i) & 0x01;
40+
41+
g[0] = c[0] ^ c[3];
42+
g[1] = c[0] ^ c[1] ^ c[3];
43+
g[2] = c[1] ^ c[2];
44+
g[3] = c[2] ^ c[3];
45+
46+
for (i = 0; i < 4; i++)
47+
ret_data = ((g[i] & 0x01) << i) | ret_data;
48+
49+
return ret_data;
50+
}
51+
52+
u8 dp_utils_calculate_parity(u32 data)
53+
{
54+
u8 x0 = 0;
55+
u8 x1 = 0;
56+
u8 ci = 0;
57+
u8 iData = 0;
58+
u8 i = 0;
59+
u8 parity_byte;
60+
u8 num_byte = (data & 0xFF00) > 0 ? 8 : 2;
61+
62+
for (i = 0; i < num_byte; i++) {
63+
iData = (data >> i * 4) & 0xF;
64+
65+
ci = iData ^ x1;
66+
x1 = x0 ^ dp_utils_get_g1_value(ci);
67+
x0 = dp_utils_get_g0_value(ci);
68+
}
69+
70+
parity_byte = x1 | (x0 << 4);
71+
72+
return parity_byte;
73+
}

drivers/gpu/drm/msm/dp/dp_utils.h

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/* SPDX-License-Identifier: GPL-2.0-only */
2+
/*
3+
* Copyright (c) 2024, The Linux Foundation. All rights reserved.
4+
*/
5+
6+
#ifndef _DP_UTILS_H_
7+
#define _DP_UTILS_H_
8+
9+
#define HEADER_BYTE_0_BIT 0
10+
#define PARITY_BYTE_0_BIT 8
11+
#define HEADER_BYTE_1_BIT 16
12+
#define PARITY_BYTE_1_BIT 24
13+
#define HEADER_BYTE_2_BIT 0
14+
#define PARITY_BYTE_2_BIT 8
15+
#define HEADER_BYTE_3_BIT 16
16+
#define PARITY_BYTE_3_BIT 24
17+
18+
u8 dp_utils_get_g0_value(u8 data);
19+
u8 dp_utils_get_g1_value(u8 data);
20+
u8 dp_utils_calculate_parity(u32 data);
21+
22+
#endif /* _DP_UTILS_H_ */

0 commit comments

Comments
 (0)