From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-wm1-f42.google.com (mail-wm1-f42.google.com [209.85.128.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0079641A778 for ; Thu, 16 Jul 2026 11:31:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.42 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784201478; cv=none; b=CmuawaWvubEt8JwCC23k87bEHLFAas0k+jYjCEoUPlk4xlmjsxepO1WnrEO9fMaKv0/KUpkoUt+8VB22I9aMu0MGxvuHG6BG8NhVTVRIcwkCKMD+Fy0FZnz1TyvhxhfbFSsj+VNGeBK/O5twYkdlzhwBWxPoTJUGyhHULalcIyg= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784201478; c=relaxed/simple; bh=1eB4xT9LuZIo+znUS7Jx+V4LjNYZra24PeAvbRjJ3lk=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=iYUTIA3UEPFUdbYVmW22D+/JJR5Y+4GieJrk34vtRuz+qZxuuoQqQI/xzJ7FkggGsiL0U0a16rsrMQI8T49WsJf9lnWCn4nDHDerztbFlGR59V8QNfTdsVSxR4hgTcbFqL1413z3GeiucoYWG9udMXbNbqTZrRNdO3yO0lXSzEg= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=TNH84CI0; arc=none smtp.client-ip=209.85.128.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="TNH84CI0" Received: by mail-wm1-f42.google.com with SMTP id 5b1f17b1804b1-493bb481d51so4654175e9.1 for ; Thu, 16 Jul 2026 04:31:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784201473; x=1784806273; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to:content-type; bh=e5CmSTYkwSFknR5AGKkjqSMNuhrUCH0vfnwLK+Jw0JU=; b=TNH84CI0KtQ/9kJb7dzL7ctW7+4dBhKQ0nDznXLM6TwKJ41C4M4Qe5hTFlAPvzXjde bc+6trZf2bWXd4YSzFo5L7/fxSppGl09LVmmAinVtHB4X/EYzPtTmGUUVoMQKLAxuXha 5RwrD9G3hu9EJsR/+DMXDNshR42yYsXkxi0ZiziEhrLCNT/h447vA3Q6op6bi7Kz4xpH 5bgHabEAIg7YzrnmDliaa7GJRzsppjj9QH6eCtsv9/JnlCpwFRjMOfDdLWtTots1UHBV zayGdBsK2BBWG0ttBk/pSwqJqdMaoNsaT1ANokgGQNvewkkdADxnNeor0hySIeY/p+Y4 4ARA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784201473; x=1784806273; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=e5CmSTYkwSFknR5AGKkjqSMNuhrUCH0vfnwLK+Jw0JU=; b=FPfgHDPyDFs1j1Bp6YqVa1lnvqhNpcYrSWiUXJCD7J+z8Q9QItbtFECuSL4ynRPlHG 1JMIUDIZ+8OM1t4PMnuOSxP1f9g0S4k+MnlPHL+xZ3w8oCmBi9Y47kluIJAhmPkm01fK 7/3qMQKu9Q/Dd0aF6YlK627RiXm9YkbDokYuwUajsrPqEF4IlXVs2pUX0A8y1/8uQED+ XilPnkFe7gAVU9dfpcu5q43knJUzOwtvTYNuWbKjVni3bh87gglWtyy7f2Q14leXmyvL 5Ho+hG2Gk6BFvdY18+10HTFB2Uyi095WCbRzbBi4AzTIfjrilPTr4XamK5zIWyq1No5Y BGrw== X-Forwarded-Encrypted: i=1; AHgh+RqzI/wJe9oM7jc0zegW6k/w4dGoVmzoXtqjNULm/ThlpxCZ3XxE94Z2tdAgPuRymGj0b4000nbY6NoivL4=@vger.kernel.org X-Gm-Message-State: AOJu0Yz9xHN05H7UV5khtRJo7vBJsprtxdUdpOQuwWuxsubPYZaKdFIr 4p2Z29TlI55Z1MLV+6p8oMaD8DYbfaHtW+IKYB0bzJEYs+R+kvb9Wnn8YKSfWcvb X-Gm-Gg: AfdE7ckG21cM8qhJuhoRd29yuLEJkbCmmzhK+a4zCMyGIbzJBQYMD45eWyErk/GwVAQ cH91ItjML6VR0Lj7F2PBp0OAoJ6VuNM1+lQvqXUIqNm4s9UHWRYr6wtSvcKd8QTi8move8k6S9l 5DIQnueKpYSxZJOCbv/JJd6XuVYlWQp3EolVfJ/iEyBy3j2u+mttYhHPfT8QaBJi2qys0j8MXVj +FATgsj/MLkXmNrGswpMwHdzEvrKGxKMnUae8pZVnD/flfkRmTTBXQDo5HIwycWNuaPVsPC0DiS n9YMfdKrVguoXxGW20jxOR5fzPaYHk64giwsI7G3jNIjaM9q5aGCL/t+wenIPVWe4SDQxFdaqUY tVBHDRo2hCYNx2FtKxgzx6Ws1ZkBykHYpJyrD+936DroGNp9EU+8dyxPkRn2B8KpTa50eRWAoo6 lKIQcTXvsvf01c1RcDThk9nsnlwglqOh0mw7bv26PmwHu8WwFbUf/gi6sJcIdKd+ZR27h8Eqx6w d2SyHKQrNk= X-Received: by 2002:a05:6000:4285:b0:473:aed9:ef1c with SMTP id ffacd0b85a97d-47f2dce2d29mr13817474f8f.7.1784201472578; Thu, 16 Jul 2026 04:31:12 -0700 (PDT) Received: from OrangePi5-Plus.BB-HOME (20014C4E1B8DDB00EEA7E4D0825D1D4E.dsl.pool.telekom.hu. [2001:4c4e:1b8d:db00:eea7:e4d0:825d:1d4e]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-47f4634e0e4sm25222130f8f.4.2026.07.16.04.31.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 16 Jul 2026 04:31:12 -0700 (PDT) From: Igor Paunovic To: Sandy Huang , =?UTF-8?q?Heiko=20St=C3=BCbner?= , Andy Yan Cc: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Igor Paunovic Subject: [PATCH] drm/rockchip: vop2: add COLOR_ENCODING and COLOR_RANGE plane properties Date: Thu, 16 Jul 2026 13:30:24 +0200 Message-ID: <20260716113024.15357-1-royalnet026@gmail.com> X-Mailer: git-send-email 2.53.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit The VOP2 windows have a YCbCr to RGB conversion block whose coefficient matrix is selected by a per-window CSC mode field, with hardware support for BT.601, BT.709 (both limited range) and BT.2020, plus a BT.601 full range mode. So far the driver hardcodes this to BT.709 limited range for every YUV plane, so BT.601 (SD) and BT.2020 content is converted with the wrong matrix. Expose the standard COLOR_ENCODING and COLOR_RANGE plane properties and program the window CSC mode from them, so userspace can request the matrix matching the framebuffer. The default stays BT.709 limited range, which matches the previous behaviour. The hardware has no full range mode for the BT.709 and BT.2020 encodings, so that combination is rejected in the plane atomic check. Signed-off-by: Igor Paunovic --- drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 40 +++++++++++++++++++- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c index 4cce3e3..22e056b 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c @@ -667,6 +667,22 @@ static int vop2_convert_csc_mode(int csc_mode) } } +static int vop2_convert_color_encoding(enum drm_color_encoding color_encoding, + enum drm_color_range color_range) +{ + bool full_range = color_range == DRM_COLOR_YCBCR_FULL_RANGE; + + switch (color_encoding) { + case DRM_COLOR_YCBCR_BT601: + return full_range ? CSC_BT601F : CSC_BT601L; + case DRM_COLOR_YCBCR_BT2020: + return CSC_BT2020L; + case DRM_COLOR_YCBCR_BT709: + default: + return CSC_BT709L; + } +} + /* * colorspace path: * Input Win csc Output @@ -707,7 +723,6 @@ static void vop2_setup_csc_mode(struct vop2_video_port *vp, struct rockchip_crtc_state *vcstate = to_rockchip_crtc_state(vp->crtc.state); int is_input_yuv = pstate->fb->format->is_yuv; int is_output_yuv = is_yuv_output(vcstate->bus_format); - int input_csc = V4L2_COLORSPACE_DEFAULT; int output_csc = vcstate->color_space; bool r2y_en, y2r_en; int csc_mode; @@ -715,7 +730,8 @@ static void vop2_setup_csc_mode(struct vop2_video_port *vp, if (is_input_yuv && !is_output_yuv) { y2r_en = true; r2y_en = false; - csc_mode = vop2_convert_csc_mode(input_csc); + csc_mode = vop2_convert_color_encoding(pstate->color_encoding, + pstate->color_range); } else if (!is_input_yuv && is_output_yuv) { y2r_en = false; r2y_en = true; @@ -1109,6 +1125,18 @@ static int vop2_plane_atomic_check(struct drm_plane *plane, if (WARN_ON(format < 0)) return format; + /* + * The window CSC hardware has no full range mode for the BT.709 and + * BT.2020 encodings, so reject that combination. + */ + if (fb->format->is_yuv && + pstate->color_range == DRM_COLOR_YCBCR_FULL_RANGE && + pstate->color_encoding != DRM_COLOR_YCBCR_BT601) { + drm_dbg_kms(vop2->drm, + "Full range is only supported with BT.601 encoding\n"); + return -EINVAL; + } + /* Co-ordinates have now been clipped */ src_x = src->x1 >> 16; src_w = drm_rect_width(src) >> 16; @@ -2472,6 +2500,14 @@ static int vop2_plane_init(struct vop2 *vop2, struct vop2_win *win, drm_plane_create_blend_mode_property(&win->base, blend_caps); drm_plane_create_zpos_property(&win->base, win->win_id, 0, vop2->registered_num_wins - 1); + drm_plane_create_color_properties(&win->base, + BIT(DRM_COLOR_YCBCR_BT601) | + BIT(DRM_COLOR_YCBCR_BT709) | + BIT(DRM_COLOR_YCBCR_BT2020), + BIT(DRM_COLOR_YCBCR_LIMITED_RANGE) | + BIT(DRM_COLOR_YCBCR_FULL_RANGE), + DRM_COLOR_YCBCR_BT709, + DRM_COLOR_YCBCR_LIMITED_RANGE); return 0; } -- 2.53.0