|
@@ -3308,7 +3308,7 @@ void drm_edid_to_eld(struct drm_connector *connector, struct edid *edid)
|
|
|
u8 *cea;
|
|
|
u8 *name;
|
|
|
u8 *db;
|
|
|
- int sad_count = 0;
|
|
|
+ int total_sad_count = 0;
|
|
|
int mnl;
|
|
|
int dbl;
|
|
|
|
|
@@ -3322,6 +3322,7 @@ void drm_edid_to_eld(struct drm_connector *connector, struct edid *edid)
|
|
|
|
|
|
name = NULL;
|
|
|
drm_for_each_detailed_block((u8 *)edid, monitor_name, &name);
|
|
|
+ /* max: 13 bytes EDID, 16 bytes ELD */
|
|
|
for (mnl = 0; name && mnl < 13; mnl++) {
|
|
|
if (name[mnl] == 0x0a)
|
|
|
break;
|
|
@@ -3350,11 +3351,15 @@ void drm_edid_to_eld(struct drm_connector *connector, struct edid *edid)
|
|
|
dbl = cea_db_payload_len(db);
|
|
|
|
|
|
switch (cea_db_tag(db)) {
|
|
|
+ int sad_count;
|
|
|
+
|
|
|
case AUDIO_BLOCK:
|
|
|
/* Audio Data Block, contains SADs */
|
|
|
- sad_count = dbl / 3;
|
|
|
- if (dbl >= 1)
|
|
|
- memcpy(eld + 20 + mnl, &db[1], dbl);
|
|
|
+ sad_count = min(dbl / 3, 15 - total_sad_count);
|
|
|
+ if (sad_count >= 1)
|
|
|
+ memcpy(eld + 20 + mnl + total_sad_count * 3,
|
|
|
+ &db[1], sad_count * 3);
|
|
|
+ total_sad_count += sad_count;
|
|
|
break;
|
|
|
case SPEAKER_BLOCK:
|
|
|
/* Speaker Allocation Data Block */
|
|
@@ -3371,13 +3376,13 @@ void drm_edid_to_eld(struct drm_connector *connector, struct edid *edid)
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- eld[5] |= sad_count << 4;
|
|
|
+ eld[5] |= total_sad_count << 4;
|
|
|
|
|
|
eld[DRM_ELD_BASELINE_ELD_LEN] =
|
|
|
DIV_ROUND_UP(drm_eld_calc_baseline_block_size(eld), 4);
|
|
|
|
|
|
DRM_DEBUG_KMS("ELD size %d, SAD count %d\n",
|
|
|
- drm_eld_size(eld), sad_count);
|
|
|
+ drm_eld_size(eld), total_sad_count);
|
|
|
}
|
|
|
EXPORT_SYMBOL(drm_edid_to_eld);
|
|
|
|