Received: by 2002:a05:6a10:f3d0:0:0:0:0 with SMTP id a16csp4572275pxv; Tue, 6 Jul 2021 04:21:50 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwotcgDKTW46kOG+o99bhziOJCO70WTZk9KCFBynJfNO1dETrr8tLwhssLtfrlVMzW4fvbT X-Received: by 2002:a05:6402:b07:: with SMTP id bm7mr15632388edb.345.1625570510404; Tue, 06 Jul 2021 04:21:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625570510; cv=none; d=google.com; s=arc-20160816; b=bQr9XGoKXCjO1t5oB5DLX8ogf3EAd3ya5TKXDPxoklFjiRWuT67trpiz2CoRTt5LTN tQqJnRSyJuqt7QAJAHxITOKybF8AVVEC8mHd3PuH6cXpw63l1NLWX8zbrt8fPYQtre8e HawzBsIlKC03wbvbPbA+jEDMj4BDBU0xgAB4iujaU/8VEZfBWn242R0VDfhhAzdkVnRb LXOLcL9H/ODO2lSmhmVoRd2rNFiUzCGfK7odevNw2HZNY+5stBLEy5F+eM98BofrrJEe 7pfJk3z+KJG6G0DtTc6LNSHnrn3K9MhM5YgVVqIkIdQGWd2DDuoLz/ESXNKKnyXrZYq6 AjyA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=ULlbGbB2jbpMztdXWiu4dO8Z47P26f6PqLCvwGbWb50=; b=0fFDGOF763/ALR14aabBI8b4buO+T/OCaTTtKBCbSxPJ5Gjw4ze/Gc8gppp5DUSiAb K+M4JI8tabziLlCCIL4sgRcKo4DIWK1aqY7fuMEVWw3atqzRJotZp17HBPqtR1BcjvE3 +lvSatR6d1/yr1NG2T960tzPb9wcZvhDwU7tkl0dQGwK532cY3G/pCn8a8NCKRZGDWd9 UDTvjFCqVtFqYcvB710/ww4PwTmnFvOkUwwF5dp44OWOzLHq2XJZ495GxrCN9aifN2+X iu5rpCYG1j1NK5wZqmhuC9Zoj/qan+k8i//iBnVElvIGQvIdVvpyImeNBgDSW5/hZHiW Hhnw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=JJlSm4tp; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id s2si13800478edd.65.2021.07.06.04.21.25; Tue, 06 Jul 2021 04:21:50 -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; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=JJlSm4tp; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233907AbhGFLXG (ORCPT + 99 others); Tue, 6 Jul 2021 07:23:06 -0400 Received: from mail.kernel.org ([198.145.29.99]:55126 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232778AbhGFLTH (ORCPT ); Tue, 6 Jul 2021 07:19:07 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id AA31E61C54; Tue, 6 Jul 2021 11:16:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1625570188; bh=c2TR/t6c1Kx03JU2TNxri+QNyb8NOaYS6wh0pEeHiDQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=JJlSm4tp4UY1AcAVB0V1wuazEQbuJvHC1tWwPpU5YAlkJyoPGDEcNnyHA7flzAmf5 hLdSPkvm0HXjgGac+pNuPN0/xnHR0joQKmGU0F7bXfZBzRfqhn6xeIp+SaMD6UOg84 0dyhhf6+nA05xXNA0FPlp6LV0nyV9SE9OEYR/R1MOAwggy+I/DCYNbG2N3D3T0sU68 wXLEws4XUVZoc/UwCFIZ53DXYADumpN5YTJ1QGmlRbDBLPC6OOlO2oA9h7nYACZTKP kou/UUG/V/b24k78qEAgcLT2zA9AxmKUlvIN5t0biz3eRq/FjYp2W5ElZduiR9HxUz fq5QsS9Z+hS5Q== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Mark Yacoub , Harry Wentland , Alex Deucher , Sasha Levin , amd-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org Subject: [PATCH AUTOSEL 5.13 103/189] drm/amd/display: Verify Gamma & Degamma LUT sizes in amdgpu_dm_atomic_check Date: Tue, 6 Jul 2021 07:12:43 -0400 Message-Id: <20210706111409.2058071-103-sashal@kernel.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210706111409.2058071-1-sashal@kernel.org> References: <20210706111409.2058071-1-sashal@kernel.org> MIME-Version: 1.0 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Mark Yacoub [ Upstream commit 03fc4cf45d30533d54f0f4ebc02aacfa12f52ce2 ] For each CRTC state, check the size of Gamma and Degamma LUTs so unexpected and larger sizes wouldn't slip through. TEST: IGT:kms_color::pipe-invalid-gamma-lut-sizes v2: fix assignments in if clauses, Mark's email. Reviewed-by: Harry Wentland Signed-off-by: Mark Yacoub Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 4 ++ .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h | 1 + .../amd/display/amdgpu_dm/amdgpu_dm_color.c | 41 ++++++++++++++++--- 3 files changed, 40 insertions(+), 6 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 58577f7a57c1..35def321bae4 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -10040,6 +10040,10 @@ 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 b2f2ccfc20bb..c8e5bbbb8bce 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h @@ -591,6 +591,7 @@ 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 157fe4efbb59..a022e5bb30a5 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,6 +284,37 @@ 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 @@ -317,14 +348,12 @@ int amdgpu_dm_update_crtc_color_mgmt(struct dm_crtc_state *crtc) bool is_legacy; int r; - degamma_lut = __extract_blob_lut(crtc->base.degamma_lut, °amma_size); - if (degamma_lut && degamma_size != MAX_COLOR_LUT_ENTRIES) - return -EINVAL; + 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); - if (regamma_lut && regamma_size != MAX_COLOR_LUT_ENTRIES && - regamma_size != MAX_COLOR_LEGACY_LUT_ENTRIES) - return -EINVAL; has_degamma = degamma_lut && !__is_lut_linear(degamma_lut, degamma_size); -- 2.30.2