Received: by 2002:a05:6a10:6006:0:0:0:0 with SMTP id w6csp170676pxa; Wed, 26 Aug 2020 07:38:59 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyey3sjS1hRvvWPUj9bF+/tn4+qXrcbatu3Kx7Twu9vNQuP+nIH5oTiVsEBRxazFdLY0HAi X-Received: by 2002:a17:906:f0c1:: with SMTP id dk1mr11525669ejb.44.1598452739435; Wed, 26 Aug 2020 07:38:59 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1598452739; cv=none; d=google.com; s=arc-20160816; b=XaFbEc4bMNO5n4gT/JV5XoirMENaygAAiJ4b7wL18pyDibuezObKKS3kMtzUSZPF43 A0f1+chPhOxKE8CjsLyzjbAAqrxsAFUcBYYn0KmCYXPCigKY2yctUXyArAcgsruRUGBS AejHBe/3kI8eI/GJoDNVp4X0BKxxhUUj3rY4oV78f/x3+T44KwEylDeyUS1nCBJNfxEp 6R4OhjLvp01XH4qFx2SIYcg3CbxQzCZyEVVbr8M5MbGUa+xcejpL0pwQZJZolqsRbbhQ 7TmpCEVomWDoAQD1FZkxmbrtN+OGdBF0tmJn4XIW7omBKO5dTYlLn+ojOIBQRKIe3svA 5e1w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from; bh=18o8dYrLVpAV12XCMB+PXcVszAAiZk/8HwsBd0UkB0g=; b=WaEmLbOT7eKJQqRk8ahDJRUkroAlnsM3r5ROhBAUrBb0vv+rsfdGIsDeu8QbigfEga +Po3PEPd7oloBva/I7ewk9zSNh9YQg4rqab4sjSrOM7pqKmb/mI54Eq1qGafpfwgs4xz 7V2S5aNoQ6IkjlfirfofayisKZVOjVCOqCMqbPLqgkUwtxChdcii2jd5LPiNWU/dmApu 7WyFaodG2VP/ZHul+e/G5n8eN47bumhQY7RwyPv6m6ZZQ3Wvu/KfBHA1WAUMmrnIEe79 nS/otEVAKmhpRad2hmBQt2ylQENyhWuGQby5p0N+XZulK+20JjwaA55ClV82nD+kuiKf 79wQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id cd8si1570283ejb.656.2020.08.26.07.38.36; Wed, 26 Aug 2020 07:38:59 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728074AbgHZOYi (ORCPT + 99 others); Wed, 26 Aug 2020 10:24:38 -0400 Received: from lucky1.263xmail.com ([211.157.147.135]:58546 "EHLO lucky1.263xmail.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728381AbgHZOYd (ORCPT ); Wed, 26 Aug 2020 10:24:33 -0400 Received: from localhost (unknown [192.168.167.69]) by lucky1.263xmail.com (Postfix) with ESMTP id C5F30A22F5; Wed, 26 Aug 2020 22:24:22 +0800 (CST) X-MAIL-GRAY: 0 X-MAIL-DELIVERY: 1 X-ADDR-CHECKED: 0 X-ANTISPAM-LEVEL: 2 X-ABS-CHECKED: 0 Received: from localhost.localdomain (unknown [103.29.142.67]) by smtp.263.net (postfix) whith ESMTP id P32155T139859905738496S1598451859689366_; Wed, 26 Aug 2020 22:24:22 +0800 (CST) X-IP-DOMAINF: 1 X-UNIQUE-TAG: X-RL-SENDER: algea.cao@rock-chips.com X-SENDER: algea.cao@rock-chips.com X-LOGIN-NAME: algea.cao@rock-chips.com X-FST-TO: mripard@kernel.org X-SENDER-IP: 103.29.142.67 X-ATTACHMENT-NUM: 0 X-DNS-TYPE: 0 X-System-Flag: 0 From: Algea Cao To: mripard@kernel.org, tzimmermann@suse.de, linux-kernel@vger.kernel.org, airlied@linux.ie, dri-devel@lists.freedesktop.org, maarten.lankhorst@linux.intel.com, daniel@ffwll.ch, linux-rockchip@lists.infradead.org Cc: Algea Cao Subject: [PATCH] drm: Parse Colorimetry data block from EDID Date: Wed, 26 Aug 2020 22:23:28 +0800 Message-Id: <20200826142328.131144-1-algea.cao@rock-chips.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org CEA 861.3 spec adds colorimetry data block for HDMI. Parsing the block to get the colorimetry data from panel. Signed-off-by: Algea Cao --- drivers/gpu/drm/drm_edid.c | 45 +++++++++++++++++++++++++++++++++++++ include/drm/drm_connector.h | 3 +++ include/drm/drm_edid.h | 14 ++++++++++++ 3 files changed, 62 insertions(+) diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index 31496b6cfc56..67e607c04492 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c @@ -3223,6 +3223,7 @@ add_detailed_modes(struct drm_connector *connector, struct edid *edid, #define VIDEO_BLOCK 0x02 #define VENDOR_BLOCK 0x03 #define SPEAKER_BLOCK 0x04 +#define COLORIMETRY_DATA_BLOCK 0x5 #define HDR_STATIC_METADATA_BLOCK 0x6 #define USE_EXTENDED_TAG 0x07 #define EXT_VIDEO_CAPABILITY_BLOCK 0x00 @@ -4309,6 +4310,48 @@ static void fixup_detailed_cea_mode_clock(struct drm_display_mode *mode) mode->clock = clock; } +static bool cea_db_is_hdmi_colorimetry_data_block(const u8 *db) +{ + if (cea_db_tag(db) != USE_EXTENDED_TAG) + return false; + + if (db[1] != COLORIMETRY_DATA_BLOCK) + return false; + + if (cea_db_payload_len(db) < 2) + return false; + + return true; +} + +static void +drm_parse_colorimetry_data_block(struct drm_connector *connector, const u8 *db) +{ + struct drm_hdmi_info *info = &connector->display_info.hdmi; + + if (db[2] & DRM_EDID_CLRMETRY_xvYCC_601) + info->colorimetry |= DRM_EDID_CLRMETRY_xvYCC_601; + if (db[2] & DRM_EDID_CLRMETRY_xvYCC_709) + info->colorimetry |= DRM_EDID_CLRMETRY_xvYCC_709; + if (db[2] & DRM_EDID_CLRMETRY_sYCC_601) + info->colorimetry |= DRM_EDID_CLRMETRY_sYCC_601; + if (db[2] & DRM_EDID_CLRMETRY_ADBYCC_601) + info->colorimetry |= DRM_EDID_CLRMETRY_ADBYCC_601; + if (db[2] & DRM_EDID_CLRMETRY_ADB_RGB) + info->colorimetry |= DRM_EDID_CLRMETRY_ADB_RGB; + if (db[2] & DRM_EDID_CLRMETRY_BT2020_CYCC) + info->colorimetry |= DRM_EDID_CLRMETRY_BT2020_CYCC; + if (db[2] & DRM_EDID_CLRMETRY_BT2020_YCC) + info->colorimetry |= DRM_EDID_CLRMETRY_BT2020_YCC; + if (db[2] & DRM_EDID_CLRMETRY_BT2020_RGB) + info->colorimetry |= DRM_EDID_CLRMETRY_BT2020_RGB; + /* Byte 4 Bit 7: DCI-P3 */ + if (db[3] & BIT(7)) + info->colorimetry |= DRM_EDID_CLRMETRY_DCI_P3; + + DRM_DEBUG_KMS("Supported Colorimetry 0x%x\n", info->colorimetry); +} + static bool cea_db_is_hdmi_hdr_metadata_block(const u8 *db) { if (cea_db_tag(db) != USE_EXTENDED_TAG) @@ -4994,6 +5037,8 @@ static void drm_parse_cea_ext(struct drm_connector *connector, drm_parse_vcdb(connector, db); if (cea_db_is_hdmi_hdr_metadata_block(db)) drm_parse_hdr_metadata_block(connector, db); + if (cea_db_is_hdmi_colorimetry_data_block(db)) + drm_parse_colorimetry_data_block(connector, db); } } diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h index af145608b5ed..d599c3b9e881 100644 --- a/include/drm/drm_connector.h +++ b/include/drm/drm_connector.h @@ -207,6 +207,9 @@ struct drm_hdmi_info { /** @y420_dc_modes: bitmap of deep color support index */ u8 y420_dc_modes; + + /* @colorimetry: bitmap of supported colorimetry modes */ + u16 colorimetry; }; /** diff --git a/include/drm/drm_edid.h b/include/drm/drm_edid.h index cfa4f5af49af..98fa78c2f82d 100644 --- a/include/drm/drm_edid.h +++ b/include/drm/drm_edid.h @@ -229,6 +229,20 @@ struct detailed_timing { DRM_EDID_YCBCR420_DC_36 | \ DRM_EDID_YCBCR420_DC_30) +/* + * Supported Colorimetry from colorimetry data block + * as per CEA 861-G spec + */ +#define DRM_EDID_CLRMETRY_xvYCC_601 (1 << 0) +#define DRM_EDID_CLRMETRY_xvYCC_709 (1 << 1) +#define DRM_EDID_CLRMETRY_sYCC_601 (1 << 2) +#define DRM_EDID_CLRMETRY_ADBYCC_601 (1 << 3) +#define DRM_EDID_CLRMETRY_ADB_RGB (1 << 4) +#define DRM_EDID_CLRMETRY_BT2020_CYCC (1 << 5) +#define DRM_EDID_CLRMETRY_BT2020_YCC (1 << 6) +#define DRM_EDID_CLRMETRY_BT2020_RGB (1 << 7) +#define DRM_EDID_CLRMETRY_DCI_P3 (1 << 15) + /* ELD Header Block */ #define DRM_ELD_HEADER_BLOCK_SIZE 4 -- 2.25.1