drm/edid: Add drm_edid_get_monitor_name()
In order to include monitor name information in debugfs output we needed to add a function that would extract the monitor name from the EDID, and that function needed to reside in the file where the rest of the EDID helper functions are implemented. v2: Refactor to have drm_edid_get_monitor_name() and drm_edid_to_eld() use a common helper function to extract the monitor name from the edid. [Jani] + rebase. v3: Minor changes suggested by Jani + rebase. v4: Few more minor changes suggested by Jani + rebase. cc: dri-devel@lists.freedesktop.org cc: Jani Nikula <jani.nikula@linux.intel.com> Reviewed-by: Jani Nikula <jani.nikula@intel.com> Signed-off-by: Jim Bride <jim.bride@linux.intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> Link: http://patchwork.freedesktop.org/patch/msgid/1460654317-31288-1-git-send-email-jim.bride@linux.intel.comhifive-unleashed-5.1
parent
346fea63a8
commit
59f7c0fa32
|
@ -3293,6 +3293,46 @@ monitor_name(struct detailed_timing *t, void *data)
|
|||
*(u8 **)data = t->data.other_data.data.str.str;
|
||||
}
|
||||
|
||||
static int get_monitor_name(struct edid *edid, char name[13])
|
||||
{
|
||||
char *edid_name = NULL;
|
||||
int mnl;
|
||||
|
||||
if (!edid || !name)
|
||||
return 0;
|
||||
|
||||
drm_for_each_detailed_block((u8 *)edid, monitor_name, &edid_name);
|
||||
for (mnl = 0; edid_name && mnl < 13; mnl++) {
|
||||
if (edid_name[mnl] == 0x0a)
|
||||
break;
|
||||
|
||||
name[mnl] = edid_name[mnl];
|
||||
}
|
||||
|
||||
return mnl;
|
||||
}
|
||||
|
||||
/**
|
||||
* drm_edid_get_monitor_name - fetch the monitor name from the edid
|
||||
* @edid: monitor EDID information
|
||||
* @name: pointer to a character array to hold the name of the monitor
|
||||
* @bufsize: The size of the name buffer (should be at least 14 chars.)
|
||||
*
|
||||
*/
|
||||
void drm_edid_get_monitor_name(struct edid *edid, char *name, int bufsize)
|
||||
{
|
||||
int name_length;
|
||||
char buf[13];
|
||||
|
||||
if (bufsize <= 0)
|
||||
return;
|
||||
|
||||
name_length = min(get_monitor_name(edid, buf), bufsize - 1);
|
||||
memcpy(name, buf, name_length);
|
||||
name[name_length] = '\0';
|
||||
}
|
||||
EXPORT_SYMBOL(drm_edid_get_monitor_name);
|
||||
|
||||
/**
|
||||
* drm_edid_to_eld - build ELD from EDID
|
||||
* @connector: connector corresponding to the HDMI/DP sink
|
||||
|
@ -3306,7 +3346,6 @@ void drm_edid_to_eld(struct drm_connector *connector, struct edid *edid)
|
|||
{
|
||||
uint8_t *eld = connector->eld;
|
||||
u8 *cea;
|
||||
u8 *name;
|
||||
u8 *db;
|
||||
int total_sad_count = 0;
|
||||
int mnl;
|
||||
|
@ -3320,14 +3359,8 @@ void drm_edid_to_eld(struct drm_connector *connector, struct edid *edid)
|
|||
return;
|
||||
}
|
||||
|
||||
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;
|
||||
eld[20 + mnl] = name[mnl];
|
||||
}
|
||||
mnl = get_monitor_name(edid, eld + 20);
|
||||
|
||||
eld[4] = (cea[1] << 5) | mnl;
|
||||
DRM_DEBUG_KMS("ELD monitor %s\n", eld + 20);
|
||||
|
||||
|
|
|
@ -2500,6 +2500,8 @@ extern int drm_edid_header_is_valid(const u8 *raw_edid);
|
|||
extern bool drm_edid_block_valid(u8 *raw_edid, int block, bool print_bad_edid,
|
||||
bool *edid_corrupt);
|
||||
extern bool drm_edid_is_valid(struct edid *edid);
|
||||
extern void drm_edid_get_monitor_name(struct edid *edid, char *name,
|
||||
int buflen);
|
||||
|
||||
extern struct drm_tile_group *drm_mode_create_tile_group(struct drm_device *dev,
|
||||
char topology[8]);
|
||||
|
|
Loading…
Reference in New Issue