From nobody Wed Dec 17 18:02:24 2025 Received: from m16.mail.163.com (m16.mail.163.com [117.135.210.3]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 8048C227B91; Mon, 9 Dec 2024 12:33:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=117.135.210.3 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1733747639; cv=none; b=bEooKn8g6QBSZuYMkESqZzPv8B8gkVcl8bWtgq0Rlu5s/O+5IC+pH50Bj2y3DqnKPiYJ8lQmtCZAt3J0uHJU/0Rf3NFTLQA6cDBPLaq+wKctZmmOmmSVQWH5GrBq6UzudpRXlPM9jlAVR7jCiuy1IYEIaSb7kBRPHSwSPF0WFjI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1733747639; c=relaxed/simple; bh=cwYED0ZS/Y535/CBHV7vzLodZjVwZLwKNq4Mr1aiSGk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=VsS/DKmddpL0fCn6M5hCRnxNmP4/FhNitbU4rziqmo3v8kLgWb9GGopP/3OmlZ+YrGNLogWHMqpZGaX1dZ0zZvf3uO2QG2YepYE3hhTr6NtzaV10Z9EoyDRL7xJlC+sHz2D/Uf7jhWpECtzIO6e46CGtsEV2itmn/+/S5ELkEEU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=163.com; spf=pass smtp.mailfrom=163.com; dkim=pass (1024-bit key) header.d=163.com header.i=@163.com header.b=ZMi6z3U6; arc=none smtp.client-ip=117.135.210.3 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=163.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=163.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=163.com header.i=@163.com header.b="ZMi6z3U6" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=163.com; s=s110527; h=From:Subject:Date:Message-ID:MIME-Version; bh=58Dm3 Eqh22L+JQTpTi4STstJ8qz0fGUCNuAiGro+EX0=; b=ZMi6z3U6th6UsW2WsV204 e+QeTso7VocRjfDFSrWvjcvLZlSa5tGg02AU7vi0WYztBvH70Xce6XXMINe/777Z Z0JI5WW9x/0IuXKQ1PdKzMoEAMA6kk+o8BwzXWvBdHwURPqrJC4w6WKFu6vwwEra O5yv1+pbNlusR2cE2WvTBs= Received: from ProDesk.. (unknown []) by gzsmtp2 (Coremail) with SMTP id PSgvCgC3KOOb41ZnxO+AAA--.35994S2; Mon, 09 Dec 2024 20:33:34 +0800 (CST) From: Andy Yan To: heiko@sntech.de Cc: hjc@rock-chips.com, krzk+dt@kernel.org, s.hauer@pengutronix.de, devicetree@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-rockchip@lists.infradead.org, derek.foreman@collabora.com, detlev.casanova@collabora.com, Andy Yan , Michael Riesch Subject: [PATCH v5 13/18] drm/rockchip: vop2: Introduce vop hardware version Date: Mon, 9 Dec 2024 20:33:29 +0800 Message-ID: <20241209123330.2781991-1-andyshrk@163.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20241209122943.2781431-1-andyshrk@163.com> References: <20241209122943.2781431-1-andyshrk@163.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: PSgvCgC3KOOb41ZnxO+AAA--.35994S2 X-Coremail-Antispam: 1Uf129KBjvJXoW3XryDWFW5Kw1xZw1UCw48WFg_yoWxKF4DpF W7Aay5WrWxGa1qgw4kJFW3ZF4aywn2yay7JanrGw13try3KryDGan0qF17AFZ0yr92kr4j yFn5A3yUWr47tr7anT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDUYxBIdaVFxhVjvjDU0xZFpf9x07jF-eOUUUUU= X-CM-SenderInfo: 5dqg52xkunqiywtou0bp/xtbB0gKwXmdW4xoX5wAAsG Content-Type: text/plain; charset="utf-8" From: Andy Yan There is a version number hardcoded in the VOP VERSION_INFO register, and the version number increments sequentially based on the production order of the SOC. So using this version number to distinguish different VOP features will simplify the code. Signed-off-by: Andy Yan Tested-by: Michael Riesch # on RK3568 Tested-by: Detlev Casanova --- (no changes since v3) Changes in v3: - Add comments for why we should treat rk3566 with special care. - Add hardware version check Changes in v2: - Introduce vop hardware version drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 25 ++++++++++++++------ drivers/gpu/drm/rockchip/rockchip_drm_vop2.h | 11 +++++++++ drivers/gpu/drm/rockchip/rockchip_vop2_reg.c | 3 +++ 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm= /rockchip/rockchip_drm_vop2.c index 1997a8deada8..4f56a7e91728 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c @@ -354,7 +354,7 @@ static bool vop2_output_uv_swap(u32 bus_format, u32 out= put_mode) =20 static bool vop2_output_rg_swap(struct vop2 *vop2, u32 bus_format) { - if (vop2->data->soc_id =3D=3D 3588) { + if (vop2->version =3D=3D VOP_VERSION_RK3588) { if (bus_format =3D=3D MEDIA_BUS_FMT_YUV8_1X24 || bus_format =3D=3D MEDIA_BUS_FMT_YUV10_1X30) return true; @@ -798,6 +798,7 @@ static void rk3588_vop2_power_domain_enable_all(struct = vop2 *vop2) static void vop2_enable(struct vop2 *vop2) { int ret; + u32 version; =20 ret =3D pm_runtime_resume_and_get(vop2->dev); if (ret < 0) { @@ -817,10 +818,19 @@ static void vop2_enable(struct vop2 *vop2) return; } =20 + version =3D vop2_readl(vop2, RK3568_VERSION_INFO); + if (version !=3D vop2->version) { + drm_err(vop2->drm, "Hardware version(0x%08x) mismatch\n", version); + return; + } + /* + * rk3566 share the same vop version with rk3568, so + * wen need to use soc_id for identification here. + */ if (vop2->data->soc_id =3D=3D 3566) vop2_writel(vop2, RK3568_OTP_WIN_EN, 1); =20 - if (vop2->data->soc_id =3D=3D 3588) + if (vop2->version =3D=3D VOP_VERSION_RK3588) rk3588_vop2_power_domain_enable_all(vop2); =20 vop2_writel(vop2, RK3568_REG_CFG_DONE, RK3568_REG_CFG_DONE__GLB_CFG_DONE_= EN); @@ -901,7 +911,7 @@ static void vop2_vp_dsp_lut_update_enable(struct vop2_v= ideo_port *vp) =20 static inline bool vop2_supports_seamless_gamma_lut_update(struct vop2 *vo= p2) { - return (vop2->data->soc_id !=3D 3566 && vop2->data->soc_id !=3D 3568); + return vop2->version !=3D VOP_VERSION_RK3568; } =20 static bool vop2_gamma_lut_in_use(struct vop2 *vop2, struct vop2_video_por= t *vp) @@ -1031,7 +1041,7 @@ static int vop2_plane_atomic_check(struct drm_plane *= plane, return -EINVAL; } =20 - if (vop2->data->soc_id =3D=3D 3568 || vop2->data->soc_id =3D=3D 3566) { + if (vop2->version =3D=3D VOP_VERSION_RK3568) { if (vop2_cluster_window(win)) { if (!rockchip_afbc(plane, fb->modifier)) { drm_err(vop2->drm, "Unsupported linear format for %s\n", win->data->na= me); @@ -1041,7 +1051,7 @@ static int vop2_plane_atomic_check(struct drm_plane *= plane, } =20 if (fb->format->format =3D=3D DRM_FORMAT_XRGB2101010 || fb->format->forma= t =3D=3D DRM_FORMAT_XBGR2101010) { - if (vop2->data->soc_id =3D=3D 3588) { + if (vop2->version =3D=3D VOP_VERSION_RK3588) { if (!rockchip_afbc(plane, fb->modifier)) { drm_err(vop2->drm, "Unsupported linear 32 bpp for %s\n", win->data->na= me); return -EINVAL; @@ -1260,7 +1270,7 @@ static void vop2_plane_atomic_update(struct drm_plane= *plane, &fb->format->format, afbc_en ? "AFBC" : "", &yrgb_mst); =20 - if (vop2->data->soc_id > 3568) { + if (vop2->version > VOP_VERSION_RK3568) { vop2_win_write(win, VOP2_WIN_AXI_BUS_ID, win->data->axi_bus_id); vop2_win_write(win, VOP2_WIN_AXI_YRGB_R_ID, win->data->axi_yrgb_r_id); vop2_win_write(win, VOP2_WIN_AXI_UV_R_ID, win->data->axi_uv_r_id); @@ -1320,7 +1330,7 @@ static void vop2_plane_atomic_update(struct drm_plane= *plane, * this bit is gating disable, we should write 1 to * disable gating when enable afbc. */ - if (vop2->data->soc_id =3D=3D 3566 || vop2->data->soc_id =3D=3D 3568) + if (vop2->version =3D=3D VOP_VERSION_RK3568) vop2_win_write(win, VOP2_WIN_AFBC_AUTO_GATING_EN, 0); else vop2_win_write(win, VOP2_WIN_AFBC_AUTO_GATING_EN, 1); @@ -2525,6 +2535,7 @@ static int vop2_bind(struct device *dev, struct devic= e *master, void *data) vop2->dev =3D dev; vop2->data =3D vop2_data; vop2->ops =3D vop2_data->ops; + vop2->version =3D vop2_data->version; vop2->drm =3D drm; =20 dev_set_drvdata(dev, vop2); diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.h b/drivers/gpu/drm= /rockchip/rockchip_drm_vop2.h index dcfa791be99d..5514ece7df4d 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.h +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.h @@ -13,6 +13,15 @@ #include "rockchip_drm_drv.h" #include "rockchip_drm_vop.h" =20 +#define VOP2_VERSION(major, minor, build) ((major) << 24 | (minor) << 16 |= (build)) + +/* The new SOC VOP version is bigger than the old */ +#define VOP_VERSION_RK3568 VOP2_VERSION(0x40, 0x15, 0x8023) +#define VOP_VERSION_RK3588 VOP2_VERSION(0x40, 0x17, 0x6786) +#define VOP_VERSION_RK3528 VOP2_VERSION(0x50, 0x17, 0x1263) +#define VOP_VERSION_RK3562 VOP2_VERSION(0x50, 0x17, 0x4350) +#define VOP_VERSION_RK3576 VOP2_VERSION(0x50, 0x19, 0x9765) + #define VOP2_VP_FEATURE_OUTPUT_10BIT BIT(0) =20 #define VOP2_FEATURE_HAS_SYS_GRF BIT(0) @@ -242,6 +251,7 @@ struct vop2_ops { struct vop2_data { u8 nr_vps; u64 feature; + u32 version; const struct vop2_ops *ops; const struct vop2_win_data *win; const struct vop2_video_port_data *vp; @@ -259,6 +269,7 @@ struct vop2_data { }; =20 struct vop2 { + u32 version; struct device *dev; struct drm_device *drm; struct vop2_video_port vps[ROCKCHIP_MAX_CRTC]; diff --git a/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c b/drivers/gpu/drm= /rockchip/rockchip_vop2_reg.c index 80f9debd7aa9..baf81e97062c 100644 --- a/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c +++ b/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c @@ -1627,6 +1627,7 @@ static const struct vop2_ops rk3588_vop_ops =3D { }; =20 static const struct vop2_data rk3566_vop =3D { + .version =3D VOP_VERSION_RK3568, .feature =3D VOP2_FEATURE_HAS_SYS_GRF, .nr_vps =3D 3, .max_input =3D { 4096, 2304 }, @@ -1645,6 +1646,7 @@ static const struct vop2_data rk3566_vop =3D { }; =20 static const struct vop2_data rk3568_vop =3D { + .version =3D VOP_VERSION_RK3568, .feature =3D VOP2_FEATURE_HAS_SYS_GRF, .nr_vps =3D 3, .max_input =3D { 4096, 2304 }, @@ -1663,6 +1665,7 @@ static const struct vop2_data rk3568_vop =3D { }; =20 static const struct vop2_data rk3588_vop =3D { + .version =3D VOP_VERSION_RK3588, .feature =3D VOP2_FEATURE_HAS_SYS_GRF | VOP2_FEATURE_HAS_VO1_GRF | VOP2_FEATURE_HAS_VOP_GRF | VOP2_FEATURE_HAS_SYS_PMU, .nr_vps =3D 4, --=20 2.34.1