From patchwork Thu Nov 4 16:50:42 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Yacoub X-Patchwork-Id: 12603511 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5E1A4C433FE for ; Thu, 4 Nov 2021 16:50:56 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 2C1EA61213 for ; Thu, 4 Nov 2021 16:50:56 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 2C1EA61213 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=chromium.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id E373D734F5; Thu, 4 Nov 2021 16:50:51 +0000 (UTC) Received: from mail-qt1-x82f.google.com (mail-qt1-x82f.google.com [IPv6:2607:f8b0:4864:20::82f]) by gabe.freedesktop.org (Postfix) with ESMTPS id ECDB7734F4 for ; Thu, 4 Nov 2021 16:50:50 +0000 (UTC) Received: by mail-qt1-x82f.google.com with SMTP id c12so62304qtd.5 for ; Thu, 04 Nov 2021 09:50:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=NjbAK412qb29GbpY1xd3R5b4kkmRp4MYsmfj5FXSWyg=; b=BMgpFhn6XZ8mAAx6s0bg5L5OjDnCK0h3BH3jKTmZp+xZ/lb34cHo6zUumqPDWQzDcf NlYlMCqFnvSsCHFCoJfZhQIzh2DOxxZSno/kuAzrP4oVZn3AR9Qo1g2V/CDWPg+VbMRK vN3H6p4x9uGt5O8J8immNQhLbYfQS1a7JBXNc= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=NjbAK412qb29GbpY1xd3R5b4kkmRp4MYsmfj5FXSWyg=; b=2aeFKAw+1pSQaKalGP88u4SnLOjiLkzAj8ipWfVt4zNv1H7yF0A16aMmV1WMDSywAZ lTUUw88hX1w5CTGmPdHXXeFE8Dkn2buO6GvIcdQViJqSWbIBlZhs3vjYUM5IdSOZY+AP h7ViHzmF8Y84dWb3OlL8FDFCeFLiIcHKExTbhclWrLb2tmXbsL2zilRTCS5BjyRKOdXX MkAeMdEMCGY4DFHZJ1FIlIAELf8zbRbkgJUpOBMJ4UqdWE93YigvXFV0RuUcYSSYkyOz HCcQMrN54HX0emqH25eD5FL2mPe2XKpKQz6Gfv8eYi/EzcyyMFF0+hFMD9snWwxJOsS8 oImQ== X-Gm-Message-State: AOAM533sjqJc5R7tyS1Ks/btcu9wepBSQBE659dzDkpBIkCakg+FQKQn QpVE5uVr+3aqnFLM0FVWSdGRHw== X-Google-Smtp-Source: ABdhPJxEQDvqP+WGecJk6DClZkqZhn8q4G2q2w0QffmXNErJE6tciFGEkTv7QqO11Th3igKkbbK7UQ== X-Received: by 2002:a05:622a:15d5:: with SMTP id d21mr42640437qty.300.1636044650079; Thu, 04 Nov 2021 09:50:50 -0700 (PDT) Received: from markyacoub.nyc.corp.google.com ([2620:0:1003:314:1118:14fe:72e3:f013]) by smtp.gmail.com with ESMTPSA id q20sm3976621qkl.53.2021.11.04.09.50.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 04 Nov 2021 09:50:49 -0700 (PDT) From: Mark Yacoub To: Subject: [PATCH v4 1/3] drm: Move drm_color_lut_check implementation internal to intel_color Date: Thu, 4 Nov 2021 12:50:42 -0400 Message-Id: <20211104165046.4115042-1-markyacoub@chromium.org> X-Mailer: git-send-email 2.34.0.rc0.344.g81b53c2807-goog MIME-Version: 1.0 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: pmenzel@molgen.mpg.de, David Airlie , Mark Yacoub , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, seanpaul@chromium.org, Thomas Zimmermann , Rodrigo Vivi , intel-gfx@lists.freedesktop.org, Mark Yacoub Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" From: Mark Yacoub [Why] The tests of LUT_EQUAL_CHANNELS and LUT_NON_DECREASING are currently unique to i915 driver. Freeing up the function name for the more generic LUT checks to folllow Tested on Eldrid ChromeOS (TGL). v1: Stuff the test function from DRM to intel driver. Signed-off-by: Mark Yacoub --- drivers/gpu/drm/drm_color_mgmt.c | 43 ---------------------- drivers/gpu/drm/i915/display/intel_color.c | 43 +++++++++++++++++++--- drivers/gpu/drm/i915/display/intel_color.h | 27 ++++++++++++++ drivers/gpu/drm/i915/i915_pci.c | 27 ++++++++------ include/drm/drm_color_mgmt.h | 27 -------------- 5 files changed, 81 insertions(+), 86 deletions(-) diff --git a/drivers/gpu/drm/drm_color_mgmt.c b/drivers/gpu/drm/drm_color_mgmt.c index bb14f488c8f6c..16a07f84948f3 100644 --- a/drivers/gpu/drm/drm_color_mgmt.c +++ b/drivers/gpu/drm/drm_color_mgmt.c @@ -583,46 +583,3 @@ int drm_plane_create_color_properties(struct drm_plane *plane, return 0; } EXPORT_SYMBOL(drm_plane_create_color_properties); - -/** - * drm_color_lut_check - check validity of lookup table - * @lut: property blob containing LUT to check - * @tests: bitmask of tests to run - * - * Helper to check whether a userspace-provided lookup table is valid and - * satisfies hardware requirements. Drivers pass a bitmask indicating which of - * the tests in &drm_color_lut_tests should be performed. - * - * Returns 0 on success, -EINVAL on failure. - */ -int drm_color_lut_check(const struct drm_property_blob *lut, u32 tests) -{ - const struct drm_color_lut *entry; - int i; - - if (!lut || !tests) - return 0; - - entry = lut->data; - for (i = 0; i < drm_color_lut_size(lut); i++) { - if (tests & DRM_COLOR_LUT_EQUAL_CHANNELS) { - if (entry[i].red != entry[i].blue || - entry[i].red != entry[i].green) { - DRM_DEBUG_KMS("All LUT entries must have equal r/g/b\n"); - return -EINVAL; - } - } - - if (i > 0 && tests & DRM_COLOR_LUT_NON_DECREASING) { - if (entry[i].red < entry[i - 1].red || - entry[i].green < entry[i - 1].green || - entry[i].blue < entry[i - 1].blue) { - DRM_DEBUG_KMS("LUT entries must never decrease.\n"); - return -EINVAL; - } - } - } - - return 0; -} -EXPORT_SYMBOL(drm_color_lut_check); diff --git a/drivers/gpu/drm/i915/display/intel_color.c b/drivers/gpu/drm/i915/display/intel_color.c index dab892d2251ba..bde98a155c9f3 100644 --- a/drivers/gpu/drm/i915/display/intel_color.c +++ b/drivers/gpu/drm/i915/display/intel_color.c @@ -1279,13 +1279,46 @@ static int check_lut_size(const struct drm_property_blob *lut, int expected) return 0; } +static int test_luts(const struct drm_property_blob *lut, u32 tests) +{ + const struct drm_color_lut *entry; + int i; + + if (!lut || !tests) + return 0; + + entry = lut->data; + for (i = 0; i < drm_color_lut_size(lut); i++) { + if (tests & LUT_EQUAL_CHANNELS) { + if (entry[i].red != entry[i].blue || + entry[i].red != entry[i].green) { + DRM_DEBUG_KMS( + "All LUT entries must have equal r/g/b\n"); + return -EINVAL; + } + } + + if (i > 0 && tests & LUT_NON_DECREASING) { + if (entry[i].red < entry[i - 1].red || + entry[i].green < entry[i - 1].green || + entry[i].blue < entry[i - 1].blue) { + DRM_DEBUG_KMS( + "LUT entries must never decrease.\n"); + return -EINVAL; + } + } + } + + return 0; +} + static int check_luts(const struct intel_crtc_state *crtc_state) { struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev); const struct drm_property_blob *gamma_lut = crtc_state->hw.gamma_lut; const struct drm_property_blob *degamma_lut = crtc_state->hw.degamma_lut; int gamma_length, degamma_length; - u32 gamma_tests, degamma_tests; + u32 gamma_channels_tests, degamma_channels_tests; /* Always allow legacy gamma LUT with no further checking. */ if (crtc_state_is_legacy_gamma(crtc_state)) @@ -1300,15 +1333,15 @@ static int check_luts(const struct intel_crtc_state *crtc_state) degamma_length = INTEL_INFO(dev_priv)->color.degamma_lut_size; gamma_length = INTEL_INFO(dev_priv)->color.gamma_lut_size; - degamma_tests = INTEL_INFO(dev_priv)->color.degamma_lut_tests; - gamma_tests = INTEL_INFO(dev_priv)->color.gamma_lut_tests; + degamma_channels_tests = INTEL_INFO(dev_priv)->color.degamma_lut_tests; + gamma_channels_tests = INTEL_INFO(dev_priv)->color.gamma_lut_tests; if (check_lut_size(degamma_lut, degamma_length) || check_lut_size(gamma_lut, gamma_length)) return -EINVAL; - if (drm_color_lut_check(degamma_lut, degamma_tests) || - drm_color_lut_check(gamma_lut, gamma_tests)) + if (test_luts(degamma_lut, degamma_channels_tests) || + test_luts(gamma_lut, gamma_channels_tests)) return -EINVAL; return 0; diff --git a/drivers/gpu/drm/i915/display/intel_color.h b/drivers/gpu/drm/i915/display/intel_color.h index 173727aaa24d2..621f8f2c95467 100644 --- a/drivers/gpu/drm/i915/display/intel_color.h +++ b/drivers/gpu/drm/i915/display/intel_color.h @@ -7,11 +7,38 @@ #define __INTEL_COLOR_H__ #include +#include struct intel_crtc_state; struct intel_crtc; struct drm_property_blob; +/** + * enum lut_channels_tests - hw-specific LUT tests to perform + * + * The test_luts() function takes a bitmask of the values here to + * determine which tests to apply to a userspace-provided LUT. + */ +enum lut_channels_tests { + /** + * @LUT_EQUAL_CHANNELS: + * + * Checks whether the entries of a LUT all have equal values for the + * red, green, and blue channels. Intended for hardware that only + * accepts a single value per LUT entry and assumes that value applies + * to all three color components. + */ + LUT_EQUAL_CHANNELS = BIT(0), + + /** + * @LUT_NON_DECREASING: + * + * Checks whether the entries of a LUT are always flat or increasing + * (never decreasing). + */ + LUT_NON_DECREASING = BIT(1), +}; + void intel_color_init(struct intel_crtc *crtc); int intel_color_check(struct intel_crtc_state *crtc_state); void intel_color_commit(const struct intel_crtc_state *crtc_state); diff --git a/drivers/gpu/drm/i915/i915_pci.c b/drivers/gpu/drm/i915/i915_pci.c index 5e8348f506b8d..17798cfc13eb4 100644 --- a/drivers/gpu/drm/i915/i915_pci.c +++ b/drivers/gpu/drm/i915/i915_pci.c @@ -29,6 +29,7 @@ #include #include "display/intel_fbdev.h" +#include "display/intel_color.h" #include "i915_drv.h" #include "i915_perf.h" @@ -132,23 +133,27 @@ #define I9XX_COLORS \ .color = { .gamma_lut_size = 256 } -#define I965_COLORS \ - .color = { .gamma_lut_size = 129, \ - .gamma_lut_tests = DRM_COLOR_LUT_NON_DECREASING, \ +#define I965_COLORS \ + .color = { \ + .gamma_lut_size = 129, \ + .gamma_lut_tests = LUT_NON_DECREASING, \ } #define ILK_COLORS \ .color = { .gamma_lut_size = 1024 } #define IVB_COLORS \ .color = { .degamma_lut_size = 1024, .gamma_lut_size = 1024 } -#define CHV_COLORS \ - .color = { .degamma_lut_size = 65, .gamma_lut_size = 257, \ - .degamma_lut_tests = DRM_COLOR_LUT_NON_DECREASING, \ - .gamma_lut_tests = DRM_COLOR_LUT_NON_DECREASING, \ +#define CHV_COLORS \ + .color = { \ + .degamma_lut_size = 65, \ + .gamma_lut_size = 257, \ + .degamma_lut_tests = LUT_NON_DECREASING, \ + .gamma_lut_tests = LUT_NON_DECREASING, \ } -#define GLK_COLORS \ - .color = { .degamma_lut_size = 33, .gamma_lut_size = 1024, \ - .degamma_lut_tests = DRM_COLOR_LUT_NON_DECREASING | \ - DRM_COLOR_LUT_EQUAL_CHANNELS, \ +#define GLK_COLORS \ + .color = { \ + .degamma_lut_size = 33, \ + .gamma_lut_size = 1024, \ + .degamma_lut_tests = LUT_NON_DECREASING | LUT_EQUAL_CHANNELS, \ } /* Keep in gen based order, and chronological order within a gen */ diff --git a/include/drm/drm_color_mgmt.h b/include/drm/drm_color_mgmt.h index 81c298488b0c8..3537f3eeb3872 100644 --- a/include/drm/drm_color_mgmt.h +++ b/include/drm/drm_color_mgmt.h @@ -93,31 +93,4 @@ int drm_plane_create_color_properties(struct drm_plane *plane, enum drm_color_encoding default_encoding, enum drm_color_range default_range); -/** - * enum drm_color_lut_tests - hw-specific LUT tests to perform - * - * The drm_color_lut_check() function takes a bitmask of the values here to - * determine which tests to apply to a userspace-provided LUT. - */ -enum drm_color_lut_tests { - /** - * @DRM_COLOR_LUT_EQUAL_CHANNELS: - * - * Checks whether the entries of a LUT all have equal values for the - * red, green, and blue channels. Intended for hardware that only - * accepts a single value per LUT entry and assumes that value applies - * to all three color components. - */ - DRM_COLOR_LUT_EQUAL_CHANNELS = BIT(0), - - /** - * @DRM_COLOR_LUT_NON_DECREASING: - * - * Checks whether the entries of a LUT are always flat or increasing - * (never decreasing). - */ - DRM_COLOR_LUT_NON_DECREASING = BIT(1), -}; - -int drm_color_lut_check(const struct drm_property_blob *lut, u32 tests); #endif From patchwork Thu Nov 4 16:50:43 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Yacoub X-Patchwork-Id: 12603513 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id C40D1C4332F for ; Thu, 4 Nov 2021 16:51:05 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 8EE1F60FED for ; Thu, 4 Nov 2021 16:51:05 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 8EE1F60FED Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=chromium.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id EE0AD7353A; Thu, 4 Nov 2021 16:50:56 +0000 (UTC) Received: from mail-qv1-xf2c.google.com (mail-qv1-xf2c.google.com [IPv6:2607:f8b0:4864:20::f2c]) by gabe.freedesktop.org (Postfix) with ESMTPS id 37B73734F9 for ; Thu, 4 Nov 2021 16:50:55 +0000 (UTC) Received: by mail-qv1-xf2c.google.com with SMTP id i13so5674958qvm.1 for ; Thu, 04 Nov 2021 09:50:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=tJV5LHe/PYJrAFHbVei0A0cJ1yLBRQhpQ+V+dfgHY4s=; b=AmUk428fawN6Z+LndElhj46Hh1aFqj4+Z1OQ/49PGNRzJTsl2ZUzWyTKFm3yBh8a36 h7ZZZbta9uT9tXZymebQVzmf1il6NveCieVP4FN7vcLqKXwU8l1kni9mbgA2GXestKCp GaNL1BUZi2dkR2iShtkVIfQ4kiPRnHaTsRQjs= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=tJV5LHe/PYJrAFHbVei0A0cJ1yLBRQhpQ+V+dfgHY4s=; b=iCmqsHpqL8EDY+qfDL3pxrLQP+PtVy8Ae70cy8AXlKoiBzjEj4bbJWhIrOZjzpJHQ/ ulQfcx7KOT+EKBNX7cK+dWzU+gUTawNBv3JbG2kwIe8+0A4eXjarQVmg/J6w5V7MYc9v uu3A2rcGecRrX1iDCoKpImsMBDRpu50zvzJrYThs0qJrXKdoW29UEoemaZz+X0lg3h4+ QY9WAaYysHe/4zcrGToJsGMwJEuItP7wC1Mu0WZd5jdbct/fI2iq56DMhZ/DfZWUCXdt kS4cjkIqP7noMg+zBPYBm3CFfOPCU/Vc7OG3pwvnb4PMA5IArCYaZFN2DPHWCH3Qa/oD 1RLA== X-Gm-Message-State: AOAM532m6OhjULF1yGLz7NQlcG8jJoz2me/2t5EJMPAnGkJ4C6mUIn0V LxX3ERsl+yqml2X74MsEh7+FXQ== X-Google-Smtp-Source: ABdhPJymQnU2zSFYQr9e5rSVEYH4/yR6xkj7v8JMoJ8QHFXe/9uA7HOQ7W+A3P9rgPsnbVqK6hAicQ== X-Received: by 2002:a05:6214:9a1:: with SMTP id du1mr51173907qvb.45.1636044654203; Thu, 04 Nov 2021 09:50:54 -0700 (PDT) Received: from markyacoub.nyc.corp.google.com ([2620:0:1003:314:1118:14fe:72e3:f013]) by smtp.gmail.com with ESMTPSA id q20sm3976621qkl.53.2021.11.04.09.50.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 04 Nov 2021 09:50:53 -0700 (PDT) From: Mark Yacoub To: Subject: [PATCH v4 2/3] drm: Add Gamma and Degamma LUT sizes props to drm_crtc to validate. Date: Thu, 4 Nov 2021 12:50:43 -0400 Message-Id: <20211104165046.4115042-2-markyacoub@chromium.org> X-Mailer: git-send-email 2.34.0.rc0.344.g81b53c2807-goog In-Reply-To: <20211104165046.4115042-1-markyacoub@chromium.org> References: <20211104165046.4115042-1-markyacoub@chromium.org> MIME-Version: 1.0 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: pmenzel@molgen.mpg.de, David Airlie , Mark Yacoub , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, seanpaul@chromium.org, Thomas Zimmermann , Rodrigo Vivi , Matthias Brugger , linux-mediatek@lists.infradead.org, intel-gfx@lists.freedesktop.org, linux-arm-kernel@lists.infradead.org, Mark Yacoub Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" From: Mark Yacoub [Why] 1. drm_atomic_helper_check doesn't check for the LUT sizes of either Gamma or Degamma props in the new CRTC state, allowing any invalid size to be passed on. 2. Each driver has its own LUT size, which could also be different for legacy users. [How] 1. Create |degamma_lut_size| and |gamma_lut_size| to save the LUT sizes assigned by the driver when it's initializing its color and CTM management. 2. Create drm_atomic_helper_check_crtc which is called by drm_atomic_helper_check to check the LUT sizes saved in drm_crtc that they match the sizes in the new CRTC state. 3. As the LUT size check now happens in drm_atomic_helper_check, remove the lut check in intel_color.c Resolves: igt@kms_color@pipe-A-invalid-gamma-lut-sizes on MTK Tested on Zork (amdgpu) and Jacuzzi (mediatek), volteer (TGL) v3: 1. Check for lut pointer inside drm_check_lut_size. v2: 1. Remove the rename to a parent commit. 2. Create a drm drm_check_lut_size instead of intel only function. v1: 1. Fix typos 2. Remove the LUT size check from intel driver 3. Rename old LUT check to indicate it's a channel change Signed-off-by: Mark Yacoub --- drivers/gpu/drm/drm_atomic_helper.c | 52 ++++++++++++++++++++++ drivers/gpu/drm/drm_color_mgmt.c | 19 ++++++++ drivers/gpu/drm/i915/display/intel_color.c | 32 ++++++------- include/drm/drm_atomic_helper.h | 1 + include/drm/drm_color_mgmt.h | 3 ++ include/drm/drm_crtc.h | 11 +++++ 6 files changed, 99 insertions(+), 19 deletions(-) diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c index bc3487964fb5e..548e5d8221fb4 100644 --- a/drivers/gpu/drm/drm_atomic_helper.c +++ b/drivers/gpu/drm/drm_atomic_helper.c @@ -929,6 +929,54 @@ drm_atomic_helper_check_planes(struct drm_device *dev, } EXPORT_SYMBOL(drm_atomic_helper_check_planes); +/** + * drm_atomic_helper_check_crtcs - validate state object for CRTC changes + * @state: the driver state object + * + * Check the CRTC state object such as the Gamma/Degamma LUT sizes if the new + * state holds them. + * + * RETURNS: + * Zero for success or -errno + */ +int drm_atomic_helper_check_crtcs(struct drm_atomic_state *state) +{ + struct drm_crtc *crtc; + struct drm_crtc_state *new_crtc_state; + int i; + + for_each_new_crtc_in_state (state, crtc, new_crtc_state, i) { + if (!new_crtc_state->color_mgmt_changed) + continue; + + if (drm_check_lut_size(new_crtc_state->gamma_lut, + crtc->gamma_lut_size) || + drm_check_lut_size(new_crtc_state->gamma_lut, + crtc->gamma_size)) { + drm_dbg_state( + state->dev, + "Invalid Gamma LUT size. Expected %u/%u, got %u.\n", + crtc->gamma_lut_size, crtc->gamma_size, + drm_color_lut_size(new_crtc_state->gamma_lut)); + return -EINVAL; + } + + if (drm_check_lut_size(new_crtc_state->degamma_lut, + crtc->degamma_lut_size)) { + drm_dbg_state( + state->dev, + "Invalid Degamma LUT size. Expected %u, got %u.\n", + crtc->degamma_lut_size, + drm_color_lut_size( + new_crtc_state->degamma_lut)); + return -EINVAL; + } + } + + return 0; +} +EXPORT_SYMBOL(drm_atomic_helper_check_crtcs); + /** * drm_atomic_helper_check - validate state object * @dev: DRM device @@ -974,6 +1022,10 @@ int drm_atomic_helper_check(struct drm_device *dev, if (ret) return ret; + ret = drm_atomic_helper_check_crtcs(state); + if (ret) + return ret; + if (state->legacy_cursor_update) state->async_update = !drm_atomic_helper_async_check(dev, state); diff --git a/drivers/gpu/drm/drm_color_mgmt.c b/drivers/gpu/drm/drm_color_mgmt.c index 16a07f84948f3..c85094223b535 100644 --- a/drivers/gpu/drm/drm_color_mgmt.c +++ b/drivers/gpu/drm/drm_color_mgmt.c @@ -166,6 +166,7 @@ void drm_crtc_enable_color_mgmt(struct drm_crtc *crtc, struct drm_mode_config *config = &dev->mode_config; if (degamma_lut_size) { + crtc->degamma_lut_size = degamma_lut_size; drm_object_attach_property(&crtc->base, config->degamma_lut_property, 0); drm_object_attach_property(&crtc->base, @@ -178,6 +179,7 @@ void drm_crtc_enable_color_mgmt(struct drm_crtc *crtc, config->ctm_property, 0); if (gamma_lut_size) { + crtc->gamma_lut_size = gamma_lut_size; drm_object_attach_property(&crtc->base, config->gamma_lut_property, 0); drm_object_attach_property(&crtc->base, @@ -506,6 +508,23 @@ const char *drm_get_color_range_name(enum drm_color_range range) return color_range_name[range]; } +/** + * drm_check_lut_size - Checks if LUT size matches the driver expected size. + * @lut: blob containing the LUT + * @expected_size: driver expected LUT size + * + * Returns -EINVAL on mismatch, 0 on match. + */ +int drm_check_lut_size(const struct drm_property_blob *lut, + uint32_t expected_size) +{ + if (!lut) + return 0; + + return drm_color_lut_size(lut) != expected_size ? -EINVAL : 0; +} +EXPORT_SYMBOL(drm_check_lut_size); + /** * drm_plane_create_color_properties - color encoding related plane properties * @plane: plane object diff --git a/drivers/gpu/drm/i915/display/intel_color.c b/drivers/gpu/drm/i915/display/intel_color.c index bde98a155c9f3..30c23294556b4 100644 --- a/drivers/gpu/drm/i915/display/intel_color.c +++ b/drivers/gpu/drm/i915/display/intel_color.c @@ -1262,23 +1262,6 @@ intel_color_add_affected_planes(struct intel_crtc_state *new_crtc_state) return 0; } -static int check_lut_size(const struct drm_property_blob *lut, int expected) -{ - int len; - - if (!lut) - return 0; - - len = drm_color_lut_size(lut); - if (len != expected) { - DRM_DEBUG_KMS("Invalid LUT size; got %d, expected %d\n", - len, expected); - return -EINVAL; - } - - return 0; -} - static int test_luts(const struct drm_property_blob *lut, u32 tests) { const struct drm_color_lut *entry; @@ -1336,9 +1319,20 @@ static int check_luts(const struct intel_crtc_state *crtc_state) degamma_channels_tests = INTEL_INFO(dev_priv)->color.degamma_lut_tests; gamma_channels_tests = INTEL_INFO(dev_priv)->color.gamma_lut_tests; - if (check_lut_size(degamma_lut, degamma_length) || - check_lut_size(gamma_lut, gamma_length)) + if (drm_check_lut_size(degamma_lut, degamma_length)) { + drm_dbg_state( + &dev_priv->drm, + "Invalid Degamma LUT size. Expected %u, got %u.\n", + degamma_length, drm_color_lut_size(degamma_lut)); return -EINVAL; + } + + if (drm_check_lut_size(gamma_lut, gamma_length)) { + drm_dbg_state(&dev_priv->drm, + "Invalid Gamma LUT size. Expected %u, got %u.\n", + degamma_length, drm_color_lut_size(gamma_lut)); + return -EINVAL; + } if (test_luts(degamma_lut, degamma_channels_tests) || test_luts(gamma_lut, gamma_channels_tests)) diff --git a/include/drm/drm_atomic_helper.h b/include/drm/drm_atomic_helper.h index 4045e2507e11c..a22d32a7a8719 100644 --- a/include/drm/drm_atomic_helper.h +++ b/include/drm/drm_atomic_helper.h @@ -38,6 +38,7 @@ struct drm_atomic_state; struct drm_private_obj; struct drm_private_state; +int drm_atomic_helper_check_crtcs(struct drm_atomic_state *state); int drm_atomic_helper_check_modeset(struct drm_device *dev, struct drm_atomic_state *state); int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state, diff --git a/include/drm/drm_color_mgmt.h b/include/drm/drm_color_mgmt.h index 3537f3eeb3872..cb2d74719f2d5 100644 --- a/include/drm/drm_color_mgmt.h +++ b/include/drm/drm_color_mgmt.h @@ -74,6 +74,9 @@ static inline int drm_color_lut_size(const struct drm_property_blob *blob) return blob->length / sizeof(struct drm_color_lut); } +int drm_check_lut_size(const struct drm_property_blob *lut, + uint32_t expected_size); + enum drm_color_encoding { DRM_COLOR_YCBCR_BT601, DRM_COLOR_YCBCR_BT709, diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h index 2deb15d7e1610..4fd1c9a4bbba8 100644 --- a/include/drm/drm_crtc.h +++ b/include/drm/drm_crtc.h @@ -1072,6 +1072,17 @@ struct drm_crtc { /** @funcs: CRTC control functions */ const struct drm_crtc_funcs *funcs; + /** + * @degamma_lut_size: Size of degamma LUT. + */ + size_t degamma_lut_size; + + /** + * @gamma_lut_size: Size of Gamma LUT. Not used by legacy userspace such as + * X, which doesn't support large lut sizes. + */ + size_t gamma_lut_size; + /** * @gamma_size: Size of legacy gamma ramp reported to userspace. Set up * by calling drm_mode_crtc_set_gamma_size(). From patchwork Thu Nov 4 16:50:44 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Yacoub X-Patchwork-Id: 12603515 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0F385C433F5 for ; Thu, 4 Nov 2021 16:51:10 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id D10F460FED for ; Thu, 4 Nov 2021 16:51:09 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org D10F460FED Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=chromium.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 2647F73560; Thu, 4 Nov 2021 16:51:01 +0000 (UTC) Received: from mail-qt1-x833.google.com (mail-qt1-x833.google.com [IPv6:2607:f8b0:4864:20::833]) by gabe.freedesktop.org (Postfix) with ESMTPS id 7F62C734F8 for ; Thu, 4 Nov 2021 16:50:58 +0000 (UTC) Received: by mail-qt1-x833.google.com with SMTP id h14so4709816qtb.3 for ; Thu, 04 Nov 2021 09:50:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=n6LDFw29hZsoKOLns/SZzto6jZDnxgAkgjGJO4dyrRY=; b=KDXVa/C3Mif4tYN39v3Qyyb2P2N91bdiro51TFqk/tzHL1JwG+yjARCgb9wH76RcBN 9Acq9BsmrWBzpwxBvHGLOJrN2U2wQgrc3/SnFXJ+Ba12dGSGeM0bffUlYfu4wcfWr9c1 vFixPsm7mXDGYFx4/IZGXfPzLM439+wu/Kbfg= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=n6LDFw29hZsoKOLns/SZzto6jZDnxgAkgjGJO4dyrRY=; b=40fr8JSUXknrsinfs26fqindrwTm43fz2gbEqlJjuqwp4MjNQyRXAwrku4+tWoosUZ nqhogSNew46ykMp0rCSZ3Q1HHGuxC6dTcgyiNK5jU7AF2Z1qOXmkLaAXgCG6Xf+KnxYz MclNDW6GOaQHg5EMzEO0Uhu/rM1B6UN0CwTS0qUOJKqRgS9WqtPIH7pHQXrbiTqxufRN bIMKYLSfSB/9rETO9jd4UXeQSH4cs317MLeGN0XWnotnwapHJgq1f8oquT7OdIYERkzJ NlARQY12/RPeQxVRuJjCdGXYPaVRcLiXKkqF8klh0wH3n9B/x90+QsJC24VY2S+avyES Ey0A== X-Gm-Message-State: AOAM533TzD86BsoXeryHCot4Xb69eltEleKe0WUsYyKfXLei2mojmY2X 5rQZqKginNwfS+bidLEziZtCQg== X-Google-Smtp-Source: ABdhPJyYmqLWTC+r4y2X+PQP7SZsT12s912X50jcuVOAyhYkqzPP6T59ggFcd6/EpmPxsl7h8W1sNg== X-Received: by 2002:a05:622a:612:: with SMTP id z18mr30987718qta.411.1636044657405; Thu, 04 Nov 2021 09:50:57 -0700 (PDT) Received: from markyacoub.nyc.corp.google.com ([2620:0:1003:314:1118:14fe:72e3:f013]) by smtp.gmail.com with ESMTPSA id q20sm3976621qkl.53.2021.11.04.09.50.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 04 Nov 2021 09:50:57 -0700 (PDT) From: Mark Yacoub To: Subject: [PATCH v4 3/3] amd/amdgpu_dm: Verify Gamma and Degamma LUT sizes using DRM Core check Date: Thu, 4 Nov 2021 12:50:44 -0400 Message-Id: <20211104165046.4115042-3-markyacoub@chromium.org> X-Mailer: git-send-email 2.34.0.rc0.344.g81b53c2807-goog In-Reply-To: <20211104165046.4115042-1-markyacoub@chromium.org> References: <20211104165046.4115042-1-markyacoub@chromium.org> MIME-Version: 1.0 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: pmenzel@molgen.mpg.de, Leo Li , Mark Yacoub , "Pan, Xinhui" , linux-kernel@vger.kernel.org, amd-gfx@lists.freedesktop.org, David Airlie , seanpaul@chromium.org, dri-devel@lists.freedesktop.org, Alex Deucher , =?utf-8?q?Christian_K=C3=B6nig?= , Mark Yacoub Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" From: Mark Yacoub [Why] drm_atomic_helper_check_crtc now verifies both legacy and non-legacy LUT sizes. There is no need to check it within amdgpu_dm_atomic_check. [How] Remove the local call to verify LUT sizes and use DRM Core function instead. Tested on ChromeOS Zork. v1: Remove amdgpu_dm_verify_lut_sizes everywhere. Signed-off-by: Mark Yacoub Reviewed-by: Sean Paul --- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 8 ++--- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h | 1 - .../amd/display/amdgpu_dm/amdgpu_dm_color.c | 35 ------------------- 3 files changed, 4 insertions(+), 40 deletions(-) diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c index f74663b6b046e..47f8de1cfc3a5 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -10244,6 +10244,10 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev, } } #endif + ret = drm_atomic_helper_check_crtcs(state); + if (ret) + return ret; + for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) { dm_old_crtc_state = to_dm_crtc_state(old_crtc_state); @@ -10253,10 +10257,6 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev, dm_old_crtc_state->dsc_force_changed == false) continue; - ret = amdgpu_dm_verify_lut_sizes(new_crtc_state); - if (ret) - goto fail; - if (!new_crtc_state->enable) continue; diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h index fcb9c4a629c32..22730e5542092 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h @@ -617,7 +617,6 @@ void amdgpu_dm_trigger_timing_sync(struct drm_device *dev); #define MAX_COLOR_LEGACY_LUT_ENTRIES 256 void amdgpu_dm_init_color_mod(void); -int amdgpu_dm_verify_lut_sizes(const struct drm_crtc_state *crtc_state); int amdgpu_dm_update_crtc_color_mgmt(struct dm_crtc_state *crtc); int amdgpu_dm_update_plane_color_mgmt(struct dm_crtc_state *crtc, struct dc_plane_state *dc_plane_state); diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c index a022e5bb30a5c..319f8a8a89835 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c @@ -284,37 +284,6 @@ static int __set_input_tf(struct dc_transfer_func *func, return res ? 0 : -ENOMEM; } -/** - * Verifies that the Degamma and Gamma LUTs attached to the |crtc_state| are of - * the expected size. - * Returns 0 on success. - */ -int amdgpu_dm_verify_lut_sizes(const struct drm_crtc_state *crtc_state) -{ - const struct drm_color_lut *lut = NULL; - uint32_t size = 0; - - lut = __extract_blob_lut(crtc_state->degamma_lut, &size); - if (lut && size != MAX_COLOR_LUT_ENTRIES) { - DRM_DEBUG_DRIVER( - "Invalid Degamma LUT size. Should be %u but got %u.\n", - MAX_COLOR_LUT_ENTRIES, size); - return -EINVAL; - } - - lut = __extract_blob_lut(crtc_state->gamma_lut, &size); - if (lut && size != MAX_COLOR_LUT_ENTRIES && - size != MAX_COLOR_LEGACY_LUT_ENTRIES) { - DRM_DEBUG_DRIVER( - "Invalid Gamma LUT size. Should be %u (or %u for legacy) but got %u.\n", - MAX_COLOR_LUT_ENTRIES, MAX_COLOR_LEGACY_LUT_ENTRIES, - size); - return -EINVAL; - } - - return 0; -} - /** * amdgpu_dm_update_crtc_color_mgmt: Maps DRM color management to DC stream. * @crtc: amdgpu_dm crtc state @@ -348,10 +317,6 @@ int amdgpu_dm_update_crtc_color_mgmt(struct dm_crtc_state *crtc) bool is_legacy; int r; - r = amdgpu_dm_verify_lut_sizes(&crtc->base); - if (r) - return r; - degamma_lut = __extract_blob_lut(crtc->base.degamma_lut, °amma_size); regamma_lut = __extract_blob_lut(crtc->base.gamma_lut, ®amma_size);