[Intel-gfx] [PATCH v3 04/14] drm/edid: parse YCBCR 420 videomodes from EDID

Sharma, Shashank shashank.sharma at intel.com
Thu Jun 15 17:02:20 UTC 2017


> Yes, we should check for features, not for some standard version that
> implements some/all of those features. But not convinced we need any
> featur flags for the other things you listed. Aren't we already doing
> all those things anyway?

Yep, I realized you will come back with this point, while typing these 
examples :-).
Ok then, I will add a flag which sounds more like ycbcr_420_supported or 
so.

Regards
Shashank
On 6/15/2017 10:29 PM, Ville Syrjälä wrote:
> On Thu, Jun 15, 2017 at 10:18:40PM +0530, Sharma, Shashank wrote:
>> Regards
>>
>> Shashank
>>
>>
>> On 6/15/2017 9:42 PM, Ville Syrjälä wrote:
>>> On Thu, Jun 15, 2017 at 09:05:10PM +0530, Sharma, Shashank wrote:
>>>> Regards
>>>>
>>>> Shashank
>>>>
>>>>
>>>> On 6/15/2017 8:13 PM, Ville Syrjälä wrote:
>>>>> On Wed, Jun 14, 2017 at 11:17:35PM +0530, Shashank Sharma wrote:
>>>>>> HDMI 2.0 spec adds support for YCBCR420 sub-sampled output.
>>>>>> CEA-861-F adds two new blocks in EDID's CEA extension blocks,
>>>>>> to provide information about sink's YCBCR420 output capabilities.
>>>>>>
>>>>>> These blocks are:
>>>>>>
>>>>>> - YCBCR420vdb(YCBCR 420 video data block):
>>>>>> This block contains VICs of video modes, which can be sopported only
>>>>>> in YCBCR420 output mode (Not in RGB/YCBCR444/422. Its like a normal
>>>>>> SVD block, valid for YCBCR420 modes only.
>>>>>>
>>>>>> - YCBCR420cmdb(YCBCR 420 capability map data block):
>>>>>> This block gives information about video modes which can support
>>>>>> YCBCR420 output mode also (along with RGB,YCBCR444/422 etc) This
>>>>>> block contains a bitmap index of normal svd videomodes, which can
>>>>>> support YCBCR420 output too.
>>>>>> So if bit 0 from first vcb byte is set, first video mode in the svd
>>>>>> list can support YCBCR420 output too. Bit 1 means second video mode
>>>>>> from svd list can support YCBCR420 output too, and so on.
>>>>>>
>>>>>> This patch adds two bitmaps in display's hdmi_info structure, one each
>>>>>> for VCB and VDB modes. If the source is HDMI 2.0 capable, this patch
>>>>>> adds:
>>>>>> - VDB modes (YCBCR 420 only modes) in connector's mode list, also makes
>>>>>>      an entry in the vdb_bitmap per vic.
>>>>>> - VCB modes (YCBCR 420 also modes) only entry in the vcb_bitmap.
>>>>>>
>>>>>> Cc: Ville Syrjala <ville.syrjala at linux.intel.com>
>>>>>> Cc: Jose Abreu <joabreu at synopsys.com>
>>>>>> Cc: Emil Velikov <emil.l.velikov at gmail.com>
>>>>>>
>>>>>> V2: Addressed
>>>>>>        Review comments from Emil:
>>>>>>        - Use 1ULL<<i instead of 1<<i to make sure the output is 64bit.
>>>>>>        - Use the suggested method for updating dbmap.
>>>>>>        - Add documentation for YCBCR420_vcb_map to fix kbuild warning.
>>>>>>
>>>>>>        Review comments from Ville:
>>>>>>        - Do not expose the YCBCR420 flags in uabi layer, keep it internal.
>>>>>>        - Save a map of YCBCR420 modes for future reference.
>>>>>>        - Check db length before trying to parse extended tag.
>>>>>>        - Add a warning if there are > 64 modes in capability map block.
>>>>>>        - Use y420cmdb in function names and macros while dealing with vcb
>>>>>>          to be aligned with spec.
>>>>>>        - Move the display information parsing block ahead of mode parsing
>>>>>>          blocks.
>>>>>>
>>>>>> V3: Addressed design/review comments from Ville
>>>>>>        - Do not add flags in video modes, else we have to expose them to user
>>>>>>        - There should not be a UABI change, and kernel should detect the
>>>>>>          choice of the output based on type of mode, and the bitmaps.
>>>>>>        - Use standard bitops from kernel bitmap header, instead of calculating
>>>>>>          bit positions manually.
>>>>>>
>>>>>> Signed-off-by: Shashank Sharma <shashank.sharma at intel.com>
>>>>>> ---
>>>>>>     drivers/gpu/drm/drm_edid.c  | 193 ++++++++++++++++++++++++++++++++++++++++++--
>>>>>>     include/drm/drm_connector.h |  23 ++++++
>>>>>>     2 files changed, 211 insertions(+), 5 deletions(-)
>>>>>>
>>>>>> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
>>>>>> index 6fd8a98..4953f87 100644
>>>>>> --- a/drivers/gpu/drm/drm_edid.c
>>>>>> +++ b/drivers/gpu/drm/drm_edid.c
>>>>>> @@ -2781,7 +2781,9 @@ add_detailed_modes(struct drm_connector *connector, struct edid *edid,
>>>>>>     #define VIDEO_BLOCK     0x02
>>>>>>     #define VENDOR_BLOCK    0x03
>>>>>>     #define SPEAKER_BLOCK	0x04
>>>>>> -#define VIDEO_CAPABILITY_BLOCK	0x07
>>>>>> +#define VIDEO_CAPABILITY_BLOCK 0x07
>>>>>> +#define VIDEO_DATA_BLOCK_420	0x0E
>>>>>> +#define VIDEO_CAP_BLOCK_Y420CMDB 0x0F
>>>>>>     #define EDID_BASIC_AUDIO	(1 << 6)
>>>>>>     #define EDID_CEA_YCRCB444	(1 << 5)
>>>>>>     #define EDID_CEA_YCRCB422	(1 << 4)
>>>>>> @@ -3143,15 +3145,103 @@ drm_display_mode_from_vic_index(struct drm_connector *connector,
>>>>>>     	return newmode;
>>>>>>     }
>>>>>>     
>>>>>> +/*
>>>>>> + * do_ycbcr_420_vdb_modes - Parse YCBCR 420 only modes
>>>>>> + * @connector: connector corresponding to the HDMI sink
>>>>>> + * @svds: start of the data block of CEA YCBCR 420 VDB
>>>>>> + * @len: length of the CEA YCBCR 420 VDB
>>>>>> + *
>>>>>> + * CEA-861-F has added a new video block called YCBCR 420 Video
>>>>>> + * Data Block (ycbcr 420 vdb). This block contains modes which
>>>>>> + * support YCBCR 420 HDMI output (only YCBCR 420). This function
>>>>>> + * parses the block and adds these modes into connector's mode list.
>>>>> Seems a bit verbose. Maybe something like:
>>>>> "Parse the CEA-861-F YCbCr 4:2:0 Video Data Block (Y420VDB)
>>>>> which contains modes which only support YCbCr 4:2:0 output."
>>>> Got it.
>>>>>> + */
>>>>>> +static int do_ycbcr_420_vdb_modes(struct drm_connector *connector,
>>>>>> +				   const u8 *svds, u8 svds_len)
>>>>> Probably we could s/ycbcr_420_vdb/y420vdb/ all over to keep things
>>>>> shorter and match the terminology in the spec. Same for y420cmdb.
>>>> Got it.
>>>>>> +{
>>>>>> +	int modes = 0, i;
>>>>>> +	struct drm_device *dev = connector->dev;
>>>>>> +	struct drm_display_mode *newmode;
>>>>> This variable can be moved into the loop scope.
>>>> Ok.
>>>>>> +	struct drm_display_info *info = &connector->display_info;
>>>>>> +	struct drm_hdmi_info *hdmi = &info->hdmi;
>>>>>> +
>>>>>> +	for (i = 0; i < svds_len; i++) {
>>>>>> +		u8 vic = svds[i] & 0x7f;
>>>>> What's the 0x7f here? Native bit stuff? I'm thinkign we probably want
>>>>> some kind of svd_to_vic() function to make sure everyone deals with
>>>>> this stuff correctly.
>>>> Current VICs are 1 < VIC < 108, so seven bits required to show a VIC.
>>>> This is inspired from
>>>> drm_mode_from_cea_vic_index().
>>>>>> +
>>>>>> +		newmode = drm_mode_duplicate(dev, &edid_cea_modes[vic]);
>>>>>> +		if (!newmode)
>>>>>> +			break;
>>>>>> +		/*
>>>>>> +		 * ycbcr420_vdb_modes is a fix position 128 bit bitmap.
>>>>>> +		 * Every bit here represents a VIC, from CEA-861-F list.
>>>>>> +		 * So if bit[n] is set, it indicates vic[n+1] supports
>>>>>> +		 * YCBCR420 output. Bit 0 is dummy, as VICs start at 1.
>>>>>> +		 * ycbcr420_vcb_modes[0] = |VIC=64 |VIC=63 |.....|VIC=2 |VIC=1 |
>>>>>> +		 * ycbcr420_vcb_modes[1] = |VIC=128|VIC=127|.....|VIC=66|VIC=65|
>>>>>> +		 */
>>>>> I think people can figure out how the standard bitmaps work without
>>>>> having to explain it with such detail. If you want to elaborate on the
>>>>> contents of the bitmap, then I think the comment should be next to
>>>>> where the bitmap is defined.
>>>> There is already similar explanation :), I will probably remove this.
>>>>>> +		bitmap_set(hdmi->ycbcr420_vdb_modes, vic, 1);
>>>>> __set_bit()
>>>> Any harm on bitmap_set ? I guess this is specially for bitmaps ...
>>>>>> +		drm_mode_probed_add(connector, newmode);
>>>>>> +		modes++;
>>>>>> +	}
>>>>>> +
>>>>>> +	if (modes > 0)
>>>>>> +		info->color_formats |= DRM_COLOR_FORMAT_YCRCB420;
>>>>>> +	return modes;
>>>>>> +}
>>>>>> +
>>>>>> +/*
>>>>>> + * drm_add_vcb_modes - Add a YCBCR 420 mode into bitmap
>>>>>> + * @connector: connector corresponding to the HDMI sink
>>>>>> + * @vic: CEA vic for the video mode to be added in the map
>>>>>> + *
>>>>>> + * Makes an entry for a videomode in the YCBCR 420 bitmap
>>>>>> + */
>>>>>> +static void
>>>>>> +drm_add_vcb_modes(struct drm_connector *connector, u8 vic)
>>>>> The "vcb" term doesn't seem to be in the spec. Should be "cmdb" maybe?
>>>>>
>>>>> Or maybe we want ycbcr420_vdb_modes and ycbcr420_y420vdb_modes just to
>>>>> make it clear to which VDB they relate with.
>>>> cmdb seems appropriate, which is aligned to the spec too, will do the
>>>> change.
>>>>>> +{
>>>>>> +	struct drm_hdmi_info *hdmi = &connector->display_info.hdmi;
>>>>>> +
>>>>>> +	/* VICs are 1 to 127(107 defined till CEA-861-F) */
>>>>>> +	vic &= 127;
>>>>>> +
>>>>>> +	/*
>>>>>> +	 * ycbcr420_vcb_modes is a fix position 128 bit bitmap.
>>>>>> +	 * Every bit here represents a VIC, from CEA-861-F list.
>>>>>> +	 * So if bit[n] is set, it indicates vic[n+1] supports
>>>>>> +	 * YCBCR420 output. Bit 0 is dummy, as VICs start at 1.
>>>>>> +	 * ycbcr420_vcb_modes[0] = |VIC=64 |VIC=63 |.....|VIC=2 |VIC=1 |
>>>>>> +	 * ycbcr420_vcb_modes[1] = |VIC=128|VIC=127|.....|VIC=66|VIC=65|
>>>>>> +	 * Difference between a vcb_mode and vdb_mode is that a vcb_mode
>>>>>> +	 * can support other HDMI outputs like RGB/YCBCR444/422 also
>>>>>> +	 * along with YCBCR 240, whereas a vdb_mode can only support YCBCR
>>>>>> +	 * 420 HDMI output.
>>>>>> +	 */
>>>>>> +	bitmap_set(hdmi->ycbcr420_vcb_modes, vic, 1);
>>>>>> +}
>>>>>> +
>>>>>>     static int
>>>>>>     do_cea_modes(struct drm_connector *connector, const u8 *db, u8 len)
>>>>>>     {
>>>>>>     	int i, modes = 0;
>>>>>> +	struct drm_hdmi_info *hdmi = &connector->display_info.hdmi;
>>>>>>     
>>>>>>     	for (i = 0; i < len; i++) {
>>>>>>     		struct drm_display_mode *mode;
>>>>>>     		mode = drm_display_mode_from_vic_index(connector, db, len, i);
>>>>>>     		if (mode) {
>>>>>> +			/*
>>>>>> +			 * YCBCR420 capability block contains a bitmap which
>>>>>> +			 * gives the index of CEA modes from CEA VDB, which
>>>>>> +			 * can support YCBCR 420 sampling output also (apart
>>>>>> +			 * from RGB/YCBCR444 etc).
>>>>>> +			 * For example, if the bit 0 in bitmap is set,
>>>>>> +			 * first mode in VDB can support YCBCR420 output too.
>>>>>> +			 * Add YCBCR420 modes only if sink is HDMI 2.0 capable.
>>>>>> +			 */
>>>>>> +			if (connector->is_hdmi2_src &&
>>>>> Hmm. I wonder if need this here at all. I guess we do need something for
>>>>> the "420 only" modes, but not sure if it should be here or if we should
>>>>> reject them only during mode validation. The latter would be nice
>>>>> because it would then leave a message into the log that the mode was
>>>>> present but was rejected.
>>>> Seems like a good idea, the only benefit of doing this is, this is in
>>>> DRM layer, and will protect other drivers
>>>> from accidentally adding 420_vcb modes. Mode valid would be internal to
>>>> driver, and applicable in I915 layer.
>>> No, we should put into the probe helpers standard mode validation stuff.
>>> No driver specifics needed apart from setting the support_ycbcr420 or
>>> whatever flag.
>> Ok, got it.
>>>> So your wish is my command :)
>>>>> I'm thinking we should probably call this
>>>>> flag ycbcr420_allowed or something like that to match the other
>>>>> foo_allowed flags we have in the connector for mode validation.
>>>> I don't like that honestly. I am hoping that this flag would be used
>>>> further, to identify a HDMI 2.0 src over HDMI 1.4
>>> And what happens when when you have an otherwise HDMI 2.0 capable
>>> source that can't output YCbCr 4:2:0?
>> This makes equation difficult, but in this way, we might need flags for
>> all sub-features like
>> 4k at 60, scrambling, scdc, scdc_rr, ycbcr420. May be, I will add a comment
> Yes, we should check for features, not for some standard version that
> implements some/all of those features. But not convinced we need any
> featur flags for the other things you listed. Aren't we already doing
> all those things anyway?
>
>> that if you
>> enable this flag, this is going to happen or something ?
>>>> source, beyond YCBCR420 feature, and at that time, it might be more
>>>> suitable to have hdmi_2_src. Does it make sense ?
>>>>> So I think this could perhaps just be an uncoditional
>>>>> if (test_bit(i, ...))
>>>>> 	__set_bit(vic, ...);
>>>>>
>>>>>> +				test_bit(i, &hdmi->ycbcr420_vcb_map))
>>>>>> +				drm_add_vcb_modes(connector, db[i]);
>>>>>> +
>>>>>>     			drm_mode_probed_add(connector, mode);
>>>>>>     			modes++;
>>>>>>     		}
>>>>>> @@ -3427,6 +3517,12 @@ do_hdmi_vsdb_modes(struct drm_connector *connector, const u8 *db, u8 len,
>>>>>>     }
>>>>>>     
>>>>>>     static int
>>>>>> +cea_db_extended_tag(const u8 *db)
>>>>>> +{
>>>>>> +	return db[1];
>>>>>> +}
>>>>> Could you clean up the current extended tag usage as a separate
>>>>> prep patch? Would be nice to avoid the confusion of calling the
>>>>> "Use extended tag" tag VIDEO_CAPABILITY_BLOCK.
>>>> Sure, adding in my to-do list.
>>>>>> +
>>>>>> +static int
>>>>>>     cea_db_payload_len(const u8 *db)
>>>>>>     {
>>>>>>     	return db[0] & 0x1f;
>>>>>> @@ -3487,9 +3583,81 @@ static bool cea_db_is_hdmi_forum_vsdb(const u8 *db)
>>>>>>     	return oui == HDMI_FORUM_IEEE_OUI;
>>>>>>     }
>>>>>>     
>>>>>> +static bool cea_db_is_ycbcr_420_cmdb(const u8 *db)
>>>>>> +{
>>>>>> +	u8 len = cea_db_payload_len(db);
>>>>> 'len' seems like a fairly pointless variable since it's used exactly
>>>>> once.
>>>> Agree,
>>>>>> +
>>>>>> +	if (cea_db_tag(db) != VIDEO_CAPABILITY_BLOCK)
>>>>>> +		return false;
>>>>>> +
>>>>>> +	if (!len)
>>>>>> +		return false;
>>>>>> +
>>>>>> +	if (cea_db_extended_tag(db) != VIDEO_CAP_BLOCK_Y420CMDB)
>>>>>> +		return false;
>>>>>> +
>>>>>> +	return true;
>>>>>> +}
>>>>>> +
>>>>>> +static bool cea_db_is_ycbcr_420_vdb(const u8 *db)
>>>>>> +{
>>>>>> +	if (cea_db_tag(db) != VIDEO_CAPABILITY_BLOCK)
>>>>>> +		return false;
>>>>>> +
>>>>> Length check missing.
>>>> Oops, got it.
>>>>>> +	if (cea_db_extended_tag(db) != VIDEO_DATA_BLOCK_420)
>>>>>> +		return false;
>>>>>> +
>>>>>> +	return true;
>>>>>> +}
>>>>>> +
>>>>>>     #define for_each_cea_db(cea, i, start, end) \
>>>>>>     	for ((i) = (start); (i) < (end) && (i) + cea_db_payload_len(&(cea)[(i)]) < (end); (i) += cea_db_payload_len(&(cea)[(i)]) + 1)
>>>>>>     
>>>>>> +static void drm_parse_y420cmdb_bitmap(struct drm_connector *connector,
>>>>>> +				     const u8 *db)
>>>>>> +{
>>>>>> +	struct drm_display_info *info = &connector->display_info;
>>>>>> +	struct drm_hdmi_info *hdmi = &info->hdmi;
>>>>>> +	u8 map_len = cea_db_payload_len(db) - 1;
>>>>>> +	u8 count;
>>>>>> +	u64 map = 0;
>>>>>> +
>>>>>> +	if (!db)
>>>>>> +		return;
>>>>> Can't happen.
>>>> I assumed you were convince on my previous (lame) excuse of corrupt db :)
>>>> Will remove this check.
>>>>>> +
>>>>>> +	if (map_len == 0) {
>>>>>> +		/* All CEA modes support ycbcr420 sampling also.*/
>>>>>> +		hdmi->ycbcr420_vcb_map = U64_MAX;
>>>>>> +		info->color_formats |= DRM_COLOR_FORMAT_YCRCB420;
>>>>>> +		return;
>>>>>> +	}
>>>>>> +
>>>>>> +	/*
>>>>>> +	 * This map indicates which of the existing CEA block modes
>>>>>> +	 * from VDB can support YCBCR420 output too. So if bit=0 is
>>>>>> +	 * set, first mode from VDB can support YCBCR420 output too.
>>>>>> +	 * We will parse and keep this map, before parsing VDB itself
>>>>>> +	 * to avoid going through the same block again and again.
>>>>>> +	 *
>>>>>> +	 * Spec is not clear about max possible size of this block.
>>>>>> +	 * Clamping max bitmap block size at 8 bytes. Every byte can
>>>>>> +	 * address 8 CEA modes, in this way this map can address
>>>>>> +	 * 8*8 = first 64 SVDs.
>>>>>> +	 */
>>>>>> +	if (WARN_ON_ONCE(map_len > 8))
>>>>>> +		map_len = 8;
>>>>>> +
>>>>>> +	for (count = 0; count < map_len; count++)
>>>>>> +		map |= (u64)db[2 + count] << (8 * count);
>>>>>> +
>>>>>> +	if (map) {
>>>>>> +		DRM_DEBUG_KMS("Sink supports ycbcr 420\n");
>>>>> If we want to print something about the sinks color capabilities I think
>>>>> it should be in central place instead of being sprinkled all over the
>>>>> place.
>>>> Yes, seems like a good idea. I will remove this, and may be add a
>>>> separate patch to dump
>>>> sink capabilities.
>>>>>> +		info->color_formats |= DRM_COLOR_FORMAT_YCRCB420;
>>>>>> +	}
>>>>>> +
>>>>>> +	hdmi->ycbcr420_vcb_map = map;
>>>>>> +}
>>>>>> +
>>>>>>     static int
>>>>>>     add_cea_modes(struct drm_connector *connector, struct edid *edid)
>>>>>>     {
>>>>>> @@ -3512,10 +3680,17 @@ add_cea_modes(struct drm_connector *connector, struct edid *edid)
>>>>>>     				video = db + 1;
>>>>>>     				video_len = dbl;
>>>>>>     				modes += do_cea_modes(connector, video, dbl);
>>>>>> -			}
>>>>>> -			else if (cea_db_is_hdmi_vsdb(db)) {
>>>>>> +			} else if (cea_db_is_hdmi_vsdb(db)) {
>>>>>>     				hdmi = db;
>>>>>>     				hdmi_len = dbl;
>>>>>> +			} else if (cea_db_is_ycbcr_420_vdb(db) &&
>>>>>> +					connector->is_hdmi2_src) {
>>>>> Broken indentation in a bunch of places.
>>>> Damn, I thought I am improving :(
>>>>>> +				const u8 *vdb420 = &db[2];
>>>>>> +
>>>>>> +				/* Add 4:2:0(only) modes present in EDID */
>>>>>> +				modes += do_ycbcr_420_vdb_modes(connector,
>>>>>> +								vdb420,
>>>>>> +								dbl - 1);
>>>>>>     			}
>>>>>>     		}
>>>>>>     	}
>>>>>> @@ -4196,6 +4371,8 @@ static void drm_parse_cea_ext(struct drm_connector *connector,
>>>>>>     			drm_parse_hdmi_vsdb_video(connector, db);
>>>>>>     		if (cea_db_is_hdmi_forum_vsdb(db))
>>>>>>     			drm_parse_hdmi_forum_vsdb(connector, db);
>>>>>> +		if (cea_db_is_ycbcr_420_cmdb(db))
>>>>>> +			drm_parse_y420cmdb_bitmap(connector, db);
>>>>>>     	}
>>>>>>     }
>>>>>>     
>>>>>> @@ -4430,6 +4607,13 @@ int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid)
>>>>>>     	quirks = edid_get_quirks(edid);
>>>>>>     
>>>>>>     	/*
>>>>>> +	 * CEA-861-F adds ycbcr capability map block, for HDMI 2.0 sinks.
>>>>>> +	 * To avoid multiple parsing of same block, lets get the sink info
>>>>>> +	 * before parsing CEA modes.
>>>>>> +	 */
>>>>>> +	drm_add_display_info(connector, edid);
>>>>>> +
>>>>>> +	/*
>>>>>>     	 * EDID spec says modes should be preferred in this order:
>>>>>>     	 * - preferred detailed mode
>>>>>>     	 * - other detailed modes from base block
>>>>>> @@ -4450,14 +4634,13 @@ int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid)
>>>>>>     	num_modes += add_cea_modes(connector, edid);
>>>>>>     	num_modes += add_alternate_cea_modes(connector, edid);
>>>>>>     	num_modes += add_displayid_detailed_modes(connector, edid);
>>>>>> +
>>>>>>     	if (edid->features & DRM_EDID_FEATURE_DEFAULT_GTF)
>>>>>>     		num_modes += add_inferred_modes(connector, edid);
>>>>>>     
>>>>>>     	if (quirks & (EDID_QUIRK_PREFER_LARGE_60 | EDID_QUIRK_PREFER_LARGE_75))
>>>>>>     		edid_fixup_preferred(connector, quirks);
>>>>>>     
>>>>>> -	drm_add_display_info(connector, edid);
>>>>>> -
>>>>> I think this could be a separate patch, just in case it causes a
>>>>> regression.
>>>> Got it.
>>>>>>     	if (quirks & EDID_QUIRK_FORCE_6BPC)
>>>>>>     		connector->display_info.bpc = 6;
>>>>>>     
>>>>>> diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h
>>>>>> index 390319c..5a47c33 100644
>>>>>> --- a/include/drm/drm_connector.h
>>>>>> +++ b/include/drm/drm_connector.h
>>>>>> @@ -137,6 +137,28 @@ struct drm_scdc {
>>>>>>     struct drm_hdmi_info {
>>>>>>     	/** @scdc: sink's scdc support and capabilities */
>>>>>>     	struct drm_scdc scdc;
>>>>>> +
>>>>>> +	/**
>>>>>> +	 * @ycbcr420_vdb_modes: bitmap of modes which can support ycbcr420
>>>>>> +	 * output only (not normal RGB/YCBCR444/422 outputs). There are total
>>>>>> +	 * 107 VICs defined by CEA-861-F spec, so the size is 128 bits to map
>>>>>> +	 * upto 128 VICs;
>>>>>> +	 */
>>>>>> +	unsigned long ycbcr420_vdb_modes[BITS_TO_LONGS(128)];
>>>>>> +
>>>>>> +	/**
>>>>>> +	 * @ycbcr420_vcb_modes: bitmap of modes which can support ycbcr420
>>>>>> +	 * output also, along with normal HDMI outputs. There are total 107
>>>>>> +	 * VICs defined by CEA-861-F spec, so the size is 128 bits to map upto
>>>>>> +	 * 128 VICs;
>>>>>> +	 */
>>>>>> +	unsigned long ycbcr420_vcb_modes[BITS_TO_LONGS(128)];
>>>>>> +
>>>>>> +	/** @ycbcr420_vcb_map: bitmap of SVD index, to extraxt vcb modes */
>>>>>> +	unsigned long ycbcr420_vcb_map;
>>>>>> +
>>>>>> +	/** @ycbcr420_dc_modes: bitmap of deep color support index */
>>>>>> +	u8 ycbcr420_dc_modes;
>>>>> unused
>>>> Its used. We are parsing 420 deep color info and checking the it in
>>>> hdmi_12bpc_possible()
>>> Not in this patch.
>> Yes, actually that's in next patch (parse ycbcr_420_deep_color). I will
>> move it in next patch.
>>
>> - Shashank
>>>> Shashank
>>>>>>     };
>>>>>>     
>>>>>>     /**
>>>>>> @@ -200,6 +222,7 @@ struct drm_display_info {
>>>>>>     #define DRM_COLOR_FORMAT_RGB444		(1<<0)
>>>>>>     #define DRM_COLOR_FORMAT_YCRCB444	(1<<1)
>>>>>>     #define DRM_COLOR_FORMAT_YCRCB422	(1<<2)
>>>>>> +#define DRM_COLOR_FORMAT_YCRCB420	(1<<3)
>>>>>>     
>>>>>>     	/**
>>>>>>     	 * @color_formats: HDMI Color formats, selects between RGB and YCrCb
>>>>>> -- 
>>>>>> 2.7.4



More information about the Intel-gfx mailing list