- Chanaged default x.org configuration to disable glamor - Reintroduce patch to use DRM cursor plane as overlay in rk322x-current and -dev - Updated wifi patches for kernel 5.8.10 - Bumped rk322x to u-boot v2020.07, removed reserved zones from device trees - Updated OPTEE to v3.10, using ddrbin v1.10 - Bumped rk322x-current to kernel 5.8.y - Imported new patches from knaerzche's LibreELEC fork for rk322x-dev (kernel 5.8.y) - Adjusted existing patches to match changes, updated rk322x-dev kernel config file - Add default modprobe conf file for esp8089 to force the crystal frequency to 40Mhz for rk322x targets - Removed ssv6051 firmware packages to move to armbian-firmware repository - Switching ssv6051-wifi.cfg to /lib/firmware for rk322x-legacy - Removed P2P interface for esp8089 driver for rk322x-legacy - Optimized ssv6051 performance: kernel module gains -Os flag, disabled p2p interface, enabled HW crypto for CCMP cipher - Enabled remote control interface, IR GPIO kernel module and HDMI CEC modules
3501 lines
132 KiB
Diff
3501 lines
132 KiB
Diff
From 761a6a88e4fc8d732b6d4319d0bf6f0206d280de Mon Sep 17 00:00:00 2001
|
|
From: Emil Velikov <emil.velikov@collabora.com>
|
|
Date: Tue, 5 May 2020 16:16:13 +0100
|
|
Subject: [PATCH] drm/rockchip: vop: call vop_cfg_done() under reg_lock
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
The function vop_cfg_done() is a simple VOP_REG_SET(). As such it should
|
|
be done under a reg_lock. A quick look through the driver shows that all
|
|
other instances (apart from driver init) have the lock. Do the same here
|
|
|
|
Cc: Sandy Huang <hjc@rock-chips.com>
|
|
Cc: Heiko Stübner <heiko@sntech.de>
|
|
Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
|
|
Reviewed-by: Sandy Huang <hjc@rock-chips.com>
|
|
Link: https://patchwork.freedesktop.org/patch/msgid/20200505151613.2932456-1-emil.l.velikov@gmail.com
|
|
(cherry picked from commit 5fa63f0773323b1d028f2da5c94b8f3e38619b69)
|
|
---
|
|
drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 4 ++--
|
|
1 file changed, 2 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
|
|
index 33463b79a37b..1d76455ca933 100644
|
|
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
|
|
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
|
|
@@ -645,10 +645,10 @@ static int vop_enable(struct drm_crtc *crtc, struct drm_crtc_state *old_state)
|
|
s->enable_afbc = false;
|
|
}
|
|
|
|
- spin_unlock(&vop->reg_lock);
|
|
-
|
|
vop_cfg_done(vop);
|
|
|
|
+ spin_unlock(&vop->reg_lock);
|
|
+
|
|
/*
|
|
* At here, vop clock & iommu is enable, R/W vop regs would be safe.
|
|
*/
|
|
|
|
From 7e1b1997341632ffac3e1ab8fdac8923929403c9 Mon Sep 17 00:00:00 2001
|
|
From: Bernard Zhao <bernard@vivo.com>
|
|
Date: Mon, 27 Apr 2020 01:05:23 -0700
|
|
Subject: [PATCH] drivers: video: hdmi: cleanup coding style in video a bit
|
|
|
|
Eliminate the magic numbers, add vendor infoframe size macro
|
|
like other hdmi modules.
|
|
|
|
Signed-off-by: Bernard Zhao <bernard@vivo.com>
|
|
Cc: Uma Shankar <uma.shankar@intel.com>
|
|
Cc: Ville Syrjala <ville.syrjala@linux.intel.com>
|
|
Cc: Shashank Sharma <shashank.sharma@intel.com>
|
|
Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
|
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
|
|
Cc: opensource.kernel@vivo.com
|
|
[b.zolnierkie: add "hdmi" to the patch summary]
|
|
[b.zolnierkie: fix "vender" -> vendor" typo in the patch description]
|
|
Signed-off-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
|
|
Link: https://patchwork.freedesktop.org/patch/msgid/20200427080530.3234-1-bernard@vivo.com
|
|
(cherry picked from commit d43be2554b58621a21cb5f54b32db2263b3008b6)
|
|
---
|
|
drivers/video/hdmi.c | 2 +-
|
|
include/linux/hdmi.h | 1 +
|
|
2 files changed, 2 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/drivers/video/hdmi.c b/drivers/video/hdmi.c
|
|
index e70792b3e367..b7a1d6fae90d 100644
|
|
--- a/drivers/video/hdmi.c
|
|
+++ b/drivers/video/hdmi.c
|
|
@@ -495,7 +495,7 @@ int hdmi_vendor_infoframe_init(struct hdmi_vendor_infoframe *frame)
|
|
* value
|
|
*/
|
|
frame->s3d_struct = HDMI_3D_STRUCTURE_INVALID;
|
|
- frame->length = 4;
|
|
+ frame->length = HDMI_VENDOR_INFOFRAME_SIZE;
|
|
|
|
return 0;
|
|
}
|
|
diff --git a/include/linux/hdmi.h b/include/linux/hdmi.h
|
|
index 50c31f1a0a2d..9850d59d6f1c 100644
|
|
--- a/include/linux/hdmi.h
|
|
+++ b/include/linux/hdmi.h
|
|
@@ -57,6 +57,7 @@ enum hdmi_infoframe_type {
|
|
#define HDMI_SPD_INFOFRAME_SIZE 25
|
|
#define HDMI_AUDIO_INFOFRAME_SIZE 10
|
|
#define HDMI_DRM_INFOFRAME_SIZE 26
|
|
+#define HDMI_VENDOR_INFOFRAME_SIZE 4
|
|
|
|
#define HDMI_INFOFRAME_SIZE(type) \
|
|
(HDMI_INFOFRAME_HEADER_SIZE + HDMI_ ## type ## _INFOFRAME_SIZE)
|
|
|
|
From 86ce9313bd2561a632b4f3a03bdb894b92b988bb Mon Sep 17 00:00:00 2001
|
|
From: Paul Kocialkowski <paul.kocialkowski@bootlin.com>
|
|
Date: Thu, 16 Apr 2020 16:05:26 +0200
|
|
Subject: [PATCH] drm/rockchip: Add per-pixel alpha support for the PX30 VOP
|
|
|
|
Compared to its predecessors, the PX30 VOP has a different register layout
|
|
for enabling per-pixel alpha. Instead of src_alpha_ctl and dst_alpha_ctl,
|
|
there is a single alpha control register. This register takes some fields
|
|
from src_alpha_ctl, but with a different layout.
|
|
|
|
Add support for the required fields to the PX30 VOP window descriptions,
|
|
which makes per-pixel-alpha formats behave correctly.
|
|
|
|
Signed-off-by: Paul Kocialkowski <paul.kocialkowski@bootlin.com>
|
|
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
|
|
Link: https://patchwork.freedesktop.org/patch/msgid/20200416140526.262533-1-paul.kocialkowski@bootlin.com
|
|
(cherry picked from commit 2aae8ed1f390a42ec752e4403ffca877fb3260e1)
|
|
---
|
|
drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 4 ++++
|
|
drivers/gpu/drm/rockchip/rockchip_drm_vop.h | 3 +++
|
|
drivers/gpu/drm/rockchip/rockchip_vop_reg.c | 9 +++++++++
|
|
3 files changed, 16 insertions(+)
|
|
|
|
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
|
|
index 1d76455ca933..c80f7d9fd13f 100644
|
|
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
|
|
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
|
|
@@ -1007,6 +1007,10 @@ static void vop_plane_atomic_update(struct drm_plane *plane,
|
|
SRC_ALPHA_CAL_M0(ALPHA_NO_SATURATION) |
|
|
SRC_FACTOR_M0(ALPHA_ONE);
|
|
VOP_WIN_SET(vop, win, src_alpha_ctl, val);
|
|
+
|
|
+ VOP_WIN_SET(vop, win, alpha_pre_mul, ALPHA_SRC_PRE_MUL);
|
|
+ VOP_WIN_SET(vop, win, alpha_mode, ALPHA_PER_PIX);
|
|
+ VOP_WIN_SET(vop, win, alpha_en, 1);
|
|
} else {
|
|
VOP_WIN_SET(vop, win, src_alpha_ctl, SRC_ALPHA_EN(0));
|
|
}
|
|
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
|
|
index d03bdb531ef2..4a2099cb582e 100644
|
|
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
|
|
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
|
|
@@ -167,6 +167,9 @@ struct vop_win_phy {
|
|
|
|
struct vop_reg dst_alpha_ctl;
|
|
struct vop_reg src_alpha_ctl;
|
|
+ struct vop_reg alpha_pre_mul;
|
|
+ struct vop_reg alpha_mode;
|
|
+ struct vop_reg alpha_en;
|
|
struct vop_reg channel;
|
|
};
|
|
|
|
diff --git a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c
|
|
index 2413deded22c..80053d91a301 100644
|
|
--- a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c
|
|
+++ b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c
|
|
@@ -264,6 +264,9 @@ static const struct vop_win_phy px30_win0_data = {
|
|
.uv_mst = VOP_REG(PX30_WIN0_CBR_MST0, 0xffffffff, 0),
|
|
.yrgb_vir = VOP_REG(PX30_WIN0_VIR, 0x1fff, 0),
|
|
.uv_vir = VOP_REG(PX30_WIN0_VIR, 0x1fff, 16),
|
|
+ .alpha_pre_mul = VOP_REG(PX30_WIN0_ALPHA_CTRL, 0x1, 2),
|
|
+ .alpha_mode = VOP_REG(PX30_WIN0_ALPHA_CTRL, 0x1, 1),
|
|
+ .alpha_en = VOP_REG(PX30_WIN0_ALPHA_CTRL, 0x1, 0),
|
|
};
|
|
|
|
static const struct vop_win_phy px30_win1_data = {
|
|
@@ -277,6 +280,9 @@ static const struct vop_win_phy px30_win1_data = {
|
|
.dsp_st = VOP_REG(PX30_WIN1_DSP_ST, 0xffffffff, 0),
|
|
.yrgb_mst = VOP_REG(PX30_WIN1_MST, 0xffffffff, 0),
|
|
.yrgb_vir = VOP_REG(PX30_WIN1_VIR, 0x1fff, 0),
|
|
+ .alpha_pre_mul = VOP_REG(PX30_WIN1_ALPHA_CTRL, 0x1, 2),
|
|
+ .alpha_mode = VOP_REG(PX30_WIN1_ALPHA_CTRL, 0x1, 1),
|
|
+ .alpha_en = VOP_REG(PX30_WIN1_ALPHA_CTRL, 0x1, 0),
|
|
};
|
|
|
|
static const struct vop_win_phy px30_win2_data = {
|
|
@@ -291,6 +297,9 @@ static const struct vop_win_phy px30_win2_data = {
|
|
.dsp_st = VOP_REG(PX30_WIN2_DSP_ST0, 0x1fff1fff, 0),
|
|
.yrgb_mst = VOP_REG(PX30_WIN2_MST0, 0xffffffff, 0),
|
|
.yrgb_vir = VOP_REG(PX30_WIN2_VIR0_1, 0x1fff, 0),
|
|
+ .alpha_pre_mul = VOP_REG(PX30_WIN2_ALPHA_CTRL, 0x1, 2),
|
|
+ .alpha_mode = VOP_REG(PX30_WIN2_ALPHA_CTRL, 0x1, 1),
|
|
+ .alpha_en = VOP_REG(PX30_WIN2_ALPHA_CTRL, 0x1, 0),
|
|
};
|
|
|
|
static const struct vop_win_data px30_vop_big_win_data[] = {
|
|
|
|
From 022f13fb762722cc81f51f2615131fd4b4cd72e6 Mon Sep 17 00:00:00 2001
|
|
From: Krzysztof Kozlowski <krzk@kernel.org>
|
|
Date: Wed, 27 May 2020 22:05:44 +0200
|
|
Subject: [PATCH] drm/panfrost: Reduce the amount of logs on deferred probe
|
|
|
|
There is no point to print deferred probe (and its failures to get
|
|
resources) as an error. Also there is no need to print regulator errors
|
|
twice.
|
|
|
|
In case of multiple probe tries this would pollute the dmesg.
|
|
|
|
Signed-off-by: Krzysztof Kozlowski <krzk@kernel.org>
|
|
Reviewed-by: Steven Price <steven.price@arm.com>
|
|
Signed-off-by: Steven Price <steven.price@arm.com>
|
|
Link: https://patchwork.freedesktop.org/patch/msgid/20200527200544.7849-1-krzk@kernel.org
|
|
(cherry picked from commit e63adeccc0bbba34a7b988b8898bebbd5bbb6461)
|
|
---
|
|
drivers/gpu/drm/panfrost/panfrost_device.c | 8 ++++----
|
|
1 file changed, 4 insertions(+), 4 deletions(-)
|
|
|
|
diff --git a/drivers/gpu/drm/panfrost/panfrost_device.c b/drivers/gpu/drm/panfrost/panfrost_device.c
|
|
index 8136babd3ba9..b172087eee6a 100644
|
|
--- a/drivers/gpu/drm/panfrost/panfrost_device.c
|
|
+++ b/drivers/gpu/drm/panfrost/panfrost_device.c
|
|
@@ -101,7 +101,9 @@ static int panfrost_regulator_init(struct panfrost_device *pfdev)
|
|
pfdev->comp->num_supplies,
|
|
pfdev->regulators);
|
|
if (ret < 0) {
|
|
- dev_err(pfdev->dev, "failed to get regulators: %d\n", ret);
|
|
+ if (ret != -EPROBE_DEFER)
|
|
+ dev_err(pfdev->dev, "failed to get regulators: %d\n",
|
|
+ ret);
|
|
return ret;
|
|
}
|
|
|
|
@@ -213,10 +215,8 @@ int panfrost_device_init(struct panfrost_device *pfdev)
|
|
}
|
|
|
|
err = panfrost_regulator_init(pfdev);
|
|
- if (err) {
|
|
- dev_err(pfdev->dev, "regulator init failed %d\n", err);
|
|
+ if (err)
|
|
goto err_out0;
|
|
- }
|
|
|
|
err = panfrost_reset_init(pfdev);
|
|
if (err) {
|
|
|
|
From 9bda1bca65f6067e191b056e6884ba7a9a0c4c09 Mon Sep 17 00:00:00 2001
|
|
From: Dinghao Liu <dinghao.liu@zju.edu.cn>
|
|
Date: Fri, 22 May 2020 21:41:09 +0800
|
|
Subject: [PATCH] drm/panfrost: Fix runtime PM imbalance on error
|
|
|
|
The caller expects panfrost_job_hw_submit() to increase
|
|
runtime PM usage counter. The refcount decrement on the
|
|
error branch of WARN_ON() will break the counter balance
|
|
and needs to be removed.
|
|
|
|
Signed-off-by: Dinghao Liu <dinghao.liu@zju.edu.cn>
|
|
Reviewed-by: Steven Price <steven.price@arm.com>
|
|
Signed-off-by: Steven Price <steven.price@arm.com>
|
|
Link: https://patchwork.freedesktop.org/patch/msgid/20200522134109.27204-1-dinghao.liu@zju.edu.cn
|
|
(cherry picked from commit 64092598c4566dc80a71ca57396dc36fdbf3da4b)
|
|
---
|
|
drivers/gpu/drm/panfrost/panfrost_job.c | 1 -
|
|
1 file changed, 1 deletion(-)
|
|
|
|
diff --git a/drivers/gpu/drm/panfrost/panfrost_job.c b/drivers/gpu/drm/panfrost/panfrost_job.c
|
|
index f9519afca29d..c6242fe34840 100644
|
|
--- a/drivers/gpu/drm/panfrost/panfrost_job.c
|
|
+++ b/drivers/gpu/drm/panfrost/panfrost_job.c
|
|
@@ -152,7 +152,6 @@ static void panfrost_job_hw_submit(struct panfrost_job *job, int js)
|
|
return;
|
|
|
|
if (WARN_ON(job_read(pfdev, JS_COMMAND_NEXT(js)))) {
|
|
- pm_runtime_put_sync_autosuspend(pfdev->dev);
|
|
return;
|
|
}
|
|
|
|
|
|
From 3c403361c554bd46a9ddb2b0d794785916327a83 Mon Sep 17 00:00:00 2001
|
|
From: Ben Davis <ben.davis@arm.com>
|
|
Date: Mon, 1 Jun 2020 17:28:17 +0100
|
|
Subject: [PATCH] drm: drm_fourcc: add NV15, Q410, Q401 YUV formats
|
|
|
|
DRM_FORMAT_NV15 is a 2 plane format suitable for linear and 16x16
|
|
block-linear memory layouts (DRM_FORMAT_MOD_SAMSUNG_16_16_TILE). The
|
|
format is similar to P010 with 4:2:0 sub-sampling but has no padding
|
|
between components. Instead, luminance and chrominance samples are
|
|
grouped into 4s so that each group is packed into an integer number
|
|
of bytes:
|
|
|
|
YYYY = UVUV = 4 * 10 bits = 40 bits = 5 bytes
|
|
|
|
The '15' suffix refers to the optimum effective bits per pixel which is
|
|
achieved when the total number of luminance samples is a multiple of 8.
|
|
|
|
Q410 and Q401 are both 3 plane non-subsampled formats with 16 bits per
|
|
component, but only 10 bits are used and 6 are padded. 'Q' is chosen
|
|
as the first letter to denote 3 plane YUV444, (and is the next letter
|
|
along from P which is usually 2 plane).
|
|
|
|
V2: Updated block_w of NV15 to {4, 2, 0}
|
|
V3: Updated commit message to include specific modifier name
|
|
|
|
NV15:
|
|
Tested-by: Jonas Karlman <jonas@kwiboo.se>
|
|
|
|
Reviewed-by: Brian Starkey <brian.starkey@arm.com>
|
|
Signed-off-by: Ben Davis <ben.davis@arm.com>
|
|
Signed-off-by: Liviu Dudau <Liviu.Dudau@arm.com>
|
|
Link: https://patchwork.freedesktop.org/patch/msgid/20200601162817.18230-1-ben.davis@arm.com
|
|
(cherry picked from commit 94b292b277343190175d39172c903c0c5fb814f1)
|
|
---
|
|
drivers/gpu/drm/drm_fourcc.c | 12 ++++++++++++
|
|
include/uapi/drm/drm_fourcc.h | 22 ++++++++++++++++++++++
|
|
2 files changed, 34 insertions(+)
|
|
|
|
diff --git a/drivers/gpu/drm/drm_fourcc.c b/drivers/gpu/drm/drm_fourcc.c
|
|
index b234bfaeda06..722c7ebe4e88 100644
|
|
--- a/drivers/gpu/drm/drm_fourcc.c
|
|
+++ b/drivers/gpu/drm/drm_fourcc.c
|
|
@@ -274,6 +274,18 @@ const struct drm_format_info *__drm_format_info(u32 format)
|
|
{ .format = DRM_FORMAT_YUV420_10BIT, .depth = 0,
|
|
.num_planes = 1, .cpp = { 0, 0, 0 }, .hsub = 2, .vsub = 2,
|
|
.is_yuv = true },
|
|
+ { .format = DRM_FORMAT_NV15, .depth = 0,
|
|
+ .num_planes = 2, .char_per_block = { 5, 5, 0 },
|
|
+ .block_w = { 4, 2, 0 }, .block_h = { 1, 1, 0 }, .hsub = 2,
|
|
+ .vsub = 2, .is_yuv = true },
|
|
+ { .format = DRM_FORMAT_Q410, .depth = 0,
|
|
+ .num_planes = 3, .char_per_block = { 2, 2, 2 },
|
|
+ .block_w = { 1, 1, 1 }, .block_h = { 1, 1, 1 }, .hsub = 0,
|
|
+ .vsub = 0, .is_yuv = true },
|
|
+ { .format = DRM_FORMAT_Q401, .depth = 0,
|
|
+ .num_planes = 3, .char_per_block = { 2, 2, 2 },
|
|
+ .block_w = { 1, 1, 1 }, .block_h = { 1, 1, 1 }, .hsub = 0,
|
|
+ .vsub = 0, .is_yuv = true },
|
|
};
|
|
|
|
unsigned int i;
|
|
diff --git a/include/uapi/drm/drm_fourcc.h b/include/uapi/drm/drm_fourcc.h
|
|
index 490143500a50..8ba2d9153a94 100644
|
|
--- a/include/uapi/drm/drm_fourcc.h
|
|
+++ b/include/uapi/drm/drm_fourcc.h
|
|
@@ -236,6 +236,12 @@ extern "C" {
|
|
#define DRM_FORMAT_NV61 fourcc_code('N', 'V', '6', '1') /* 2x1 subsampled Cb:Cr plane */
|
|
#define DRM_FORMAT_NV24 fourcc_code('N', 'V', '2', '4') /* non-subsampled Cr:Cb plane */
|
|
#define DRM_FORMAT_NV42 fourcc_code('N', 'V', '4', '2') /* non-subsampled Cb:Cr plane */
|
|
+/*
|
|
+ * 2 plane YCbCr
|
|
+ * index 0 = Y plane, [39:0] Y3:Y2:Y1:Y0 little endian
|
|
+ * index 1 = Cr:Cb plane, [39:0] Cr1:Cb1:Cr0:Cb0 little endian
|
|
+ */
|
|
+#define DRM_FORMAT_NV15 fourcc_code('N', 'V', '1', '5') /* 2x2 subsampled Cr:Cb plane */
|
|
|
|
/*
|
|
* 2 plane YCbCr MSB aligned
|
|
@@ -265,6 +271,22 @@ extern "C" {
|
|
*/
|
|
#define DRM_FORMAT_P016 fourcc_code('P', '0', '1', '6') /* 2x2 subsampled Cr:Cb plane 16 bits per channel */
|
|
|
|
+/* 3 plane non-subsampled (444) YCbCr
|
|
+ * 16 bits per component, but only 10 bits are used and 6 bits are padded
|
|
+ * index 0: Y plane, [15:0] Y:x [10:6] little endian
|
|
+ * index 1: Cb plane, [15:0] Cb:x [10:6] little endian
|
|
+ * index 2: Cr plane, [15:0] Cr:x [10:6] little endian
|
|
+ */
|
|
+#define DRM_FORMAT_Q410 fourcc_code('Q', '4', '1', '0')
|
|
+
|
|
+/* 3 plane non-subsampled (444) YCrCb
|
|
+ * 16 bits per component, but only 10 bits are used and 6 bits are padded
|
|
+ * index 0: Y plane, [15:0] Y:x [10:6] little endian
|
|
+ * index 1: Cr plane, [15:0] Cr:x [10:6] little endian
|
|
+ * index 2: Cb plane, [15:0] Cb:x [10:6] little endian
|
|
+ */
|
|
+#define DRM_FORMAT_Q401 fourcc_code('Q', '4', '0', '1')
|
|
+
|
|
/*
|
|
* 3 plane YCbCr
|
|
* index 0: Y plane, [7:0] Y
|
|
|
|
From 7e57394c63258ac63d5c74cbd2a700916c31d4f6 Mon Sep 17 00:00:00 2001
|
|
From: Ben Davis <ben.davis@arm.com>
|
|
Date: Thu, 30 Apr 2020 09:32:20 +0100
|
|
Subject: [PATCH] drm: drm_fourcc: Add uncompressed AFBC modifier
|
|
|
|
AFBC has a mode that guarantees use of AFBC with an uncompressed
|
|
payloads, we add a new modifier to support this mode.
|
|
|
|
V2: updated modifier comment
|
|
|
|
Signed-off-by: Ben Davis <ben.davis@arm.com>
|
|
Acked-by: Liviu Dudau <liviu.dudau@arm.com>
|
|
Signed-off-by: Liviu Dudau <Liviu.Dudau@arm.com>
|
|
Link: https://patchwork.freedesktop.org/patch/msgid/20200430083220.17347-1-ben.davis@arm.com
|
|
(cherry picked from commit 79ce058032c391b12af928b1e30abf92482a270f)
|
|
---
|
|
include/uapi/drm/drm_fourcc.h | 12 ++++++++++++
|
|
1 file changed, 12 insertions(+)
|
|
|
|
diff --git a/include/uapi/drm/drm_fourcc.h b/include/uapi/drm/drm_fourcc.h
|
|
index 8ba2d9153a94..993c1b342315 100644
|
|
--- a/include/uapi/drm/drm_fourcc.h
|
|
+++ b/include/uapi/drm/drm_fourcc.h
|
|
@@ -914,6 +914,18 @@ drm_fourcc_canonicalize_nvidia_format_mod(__u64 modifier)
|
|
*/
|
|
#define AFBC_FORMAT_MOD_BCH (1ULL << 11)
|
|
|
|
+/* AFBC uncompressed storage mode
|
|
+ *
|
|
+ * Indicates that the buffer is using AFBC uncompressed storage mode.
|
|
+ * In this mode all superblock payloads in the buffer use the uncompressed
|
|
+ * storage mode, which is usually only used for data which cannot be compressed.
|
|
+ * The buffer layout is the same as for AFBC buffers without USM set, this only
|
|
+ * affects the storage mode of the individual superblocks. Note that even a
|
|
+ * buffer without USM set may use uncompressed storage mode for some or all
|
|
+ * superblocks, USM just guarantees it for all.
|
|
+ */
|
|
+#define AFBC_FORMAT_MOD_USM (1ULL << 12)
|
|
+
|
|
/*
|
|
* Arm 16x16 Block U-Interleaved modifier
|
|
*
|
|
|
|
From 32b33df85c3c84ce2a145f2d68305116fbec91fd Mon Sep 17 00:00:00 2001
|
|
From: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
|
|
Date: Tue, 26 May 2020 04:14:47 +0300
|
|
Subject: [PATCH] drm: edid: Constify connector argument to infoframe functions
|
|
|
|
The drm_hdmi_avi_infoframe_from_display_mode(),
|
|
drm_hdmi_vendor_infoframe_from_display_mode() and
|
|
drm_hdmi_avi_infoframe_quant_range() functions take a drm_connector that
|
|
they don't modify. Mark it as const.
|
|
|
|
Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
|
|
Acked-by: Sam Ravnborg <sam@ravnborg.org>
|
|
Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
|
|
Link: https://patchwork.freedesktop.org/patch/msgid/20200526011505.31884-10-laurent.pinchart+renesas@ideasonboard.com
|
|
(cherry picked from commit 192a3aa0e4e20e1087baa29183c5d64d48716fa9)
|
|
---
|
|
drivers/gpu/drm/drm_edid.c | 12 ++++++------
|
|
include/drm/drm_edid.h | 6 +++---
|
|
2 files changed, 9 insertions(+), 9 deletions(-)
|
|
|
|
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
|
|
index fed653f13c26..b3f659759adb 100644
|
|
--- a/drivers/gpu/drm/drm_edid.c
|
|
+++ b/drivers/gpu/drm/drm_edid.c
|
|
@@ -5366,7 +5366,7 @@ void drm_set_preferred_mode(struct drm_connector *connector,
|
|
}
|
|
EXPORT_SYMBOL(drm_set_preferred_mode);
|
|
|
|
-static bool is_hdmi2_sink(struct drm_connector *connector)
|
|
+static bool is_hdmi2_sink(const struct drm_connector *connector)
|
|
{
|
|
/*
|
|
* FIXME: sil-sii8620 doesn't have a connector around when
|
|
@@ -5451,7 +5451,7 @@ drm_hdmi_infoframe_set_hdr_metadata(struct hdmi_drm_infoframe *frame,
|
|
}
|
|
EXPORT_SYMBOL(drm_hdmi_infoframe_set_hdr_metadata);
|
|
|
|
-static u8 drm_mode_hdmi_vic(struct drm_connector *connector,
|
|
+static u8 drm_mode_hdmi_vic(const struct drm_connector *connector,
|
|
const struct drm_display_mode *mode)
|
|
{
|
|
bool has_hdmi_infoframe = connector ?
|
|
@@ -5467,7 +5467,7 @@ static u8 drm_mode_hdmi_vic(struct drm_connector *connector,
|
|
return drm_match_hdmi_mode(mode);
|
|
}
|
|
|
|
-static u8 drm_mode_cea_vic(struct drm_connector *connector,
|
|
+static u8 drm_mode_cea_vic(const struct drm_connector *connector,
|
|
const struct drm_display_mode *mode)
|
|
{
|
|
u8 vic;
|
|
@@ -5505,7 +5505,7 @@ static u8 drm_mode_cea_vic(struct drm_connector *connector,
|
|
*/
|
|
int
|
|
drm_hdmi_avi_infoframe_from_display_mode(struct hdmi_avi_infoframe *frame,
|
|
- struct drm_connector *connector,
|
|
+ const struct drm_connector *connector,
|
|
const struct drm_display_mode *mode)
|
|
{
|
|
enum hdmi_picture_aspect picture_aspect;
|
|
@@ -5652,7 +5652,7 @@ EXPORT_SYMBOL(drm_hdmi_avi_infoframe_colorspace);
|
|
*/
|
|
void
|
|
drm_hdmi_avi_infoframe_quant_range(struct hdmi_avi_infoframe *frame,
|
|
- struct drm_connector *connector,
|
|
+ const struct drm_connector *connector,
|
|
const struct drm_display_mode *mode,
|
|
enum hdmi_quantization_range rgb_quant_range)
|
|
{
|
|
@@ -5756,7 +5756,7 @@ s3d_structure_from_display_mode(const struct drm_display_mode *mode)
|
|
*/
|
|
int
|
|
drm_hdmi_vendor_infoframe_from_display_mode(struct hdmi_vendor_infoframe *frame,
|
|
- struct drm_connector *connector,
|
|
+ const struct drm_connector *connector,
|
|
const struct drm_display_mode *mode)
|
|
{
|
|
/*
|
|
diff --git a/include/drm/drm_edid.h b/include/drm/drm_edid.h
|
|
index 34b15e3d070c..43254319ab19 100644
|
|
--- a/include/drm/drm_edid.h
|
|
+++ b/include/drm/drm_edid.h
|
|
@@ -361,11 +361,11 @@ drm_load_edid_firmware(struct drm_connector *connector)
|
|
|
|
int
|
|
drm_hdmi_avi_infoframe_from_display_mode(struct hdmi_avi_infoframe *frame,
|
|
- struct drm_connector *connector,
|
|
+ const struct drm_connector *connector,
|
|
const struct drm_display_mode *mode);
|
|
int
|
|
drm_hdmi_vendor_infoframe_from_display_mode(struct hdmi_vendor_infoframe *frame,
|
|
- struct drm_connector *connector,
|
|
+ const struct drm_connector *connector,
|
|
const struct drm_display_mode *mode);
|
|
|
|
void
|
|
@@ -378,7 +378,7 @@ drm_hdmi_avi_infoframe_bars(struct hdmi_avi_infoframe *frame,
|
|
|
|
void
|
|
drm_hdmi_avi_infoframe_quant_range(struct hdmi_avi_infoframe *frame,
|
|
- struct drm_connector *connector,
|
|
+ const struct drm_connector *connector,
|
|
const struct drm_display_mode *mode,
|
|
enum hdmi_quantization_range rgb_quant_range);
|
|
|
|
|
|
From 23fe85a8775eb3c926be0f3d2bc99b70a6d0bb07 Mon Sep 17 00:00:00 2001
|
|
From: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
|
|
Date: Tue, 26 May 2020 04:14:48 +0300
|
|
Subject: [PATCH] drm: bridge: Pass drm_display_info to drm_bridge_funcs
|
|
.mode_valid()
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
When validating a mode, bridges may need to do so in the context of a
|
|
display, as specified by drm_display_info. An example is the meson
|
|
dw-hdmi bridge that needs to consider the YUV 4:2:0 output format to
|
|
perform clock calculations.
|
|
|
|
Bridges that need the display info currently retrieve it from the
|
|
drm_connector created by the bridge. This gets in the way of moving
|
|
connector creation out of bridge drivers. To make this possible, pass
|
|
the drm_display_info to drm_bridge_funcs .mode_valid().
|
|
|
|
Changes to the bridge drivers have been performed with the following
|
|
coccinelle semantic patch and have been compile-tested.
|
|
|
|
@ rule1 @
|
|
identifier funcs;
|
|
identifier fn;
|
|
@@
|
|
struct drm_bridge_funcs funcs = {
|
|
...,
|
|
.mode_valid = fn
|
|
};
|
|
|
|
@ depends on rule1 @
|
|
identifier rule1.fn;
|
|
identifier bridge;
|
|
identifier mode;
|
|
@@
|
|
enum drm_mode_status fn(
|
|
struct drm_bridge *bridge,
|
|
+ const struct drm_display_info *info,
|
|
const struct drm_display_mode *mode
|
|
)
|
|
{
|
|
...
|
|
}
|
|
|
|
Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
|
|
Reviewed-by: Neil Armstrong <narmstrong@baylibre.com>
|
|
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
|
|
Reviewed-by: Guido Günther <agx@sigxcpu.org> # for the nwl-dsi part:
|
|
Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
|
|
Link: https://patchwork.freedesktop.org/patch/msgid/20200526011505.31884-11-laurent.pinchart+renesas@ideasonboard.com
|
|
(cherry picked from commit 12c683e12cd8e2dcf7b7143bebceae484d17727a)
|
|
---
|
|
drivers/gpu/drm/bridge/analogix/analogix-anx6345.c | 1 +
|
|
drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c | 1 +
|
|
drivers/gpu/drm/bridge/cdns-dsi.c | 1 +
|
|
drivers/gpu/drm/bridge/chrontel-ch7033.c | 1 +
|
|
drivers/gpu/drm/bridge/nwl-dsi.c | 1 +
|
|
drivers/gpu/drm/bridge/sii9234.c | 1 +
|
|
drivers/gpu/drm/bridge/sil-sii8620.c | 1 +
|
|
drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 1 +
|
|
drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c | 1 +
|
|
drivers/gpu/drm/bridge/tc358767.c | 1 +
|
|
drivers/gpu/drm/bridge/tc358768.c | 1 +
|
|
drivers/gpu/drm/bridge/thc63lvd1024.c | 1 +
|
|
drivers/gpu/drm/bridge/ti-tfp410.c | 1 +
|
|
drivers/gpu/drm/drm_atomic_helper.c | 3 ++-
|
|
drivers/gpu/drm/drm_bridge.c | 4 +++-
|
|
drivers/gpu/drm/drm_probe_helper.c | 4 +++-
|
|
drivers/gpu/drm/i2c/tda998x_drv.c | 1 +
|
|
drivers/gpu/drm/omapdrm/dss/dpi.c | 1 +
|
|
drivers/gpu/drm/omapdrm/dss/sdi.c | 1 +
|
|
drivers/gpu/drm/omapdrm/dss/venc.c | 1 +
|
|
include/drm/drm_bridge.h | 3 +++
|
|
21 files changed, 28 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c b/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c
|
|
index 9af39ec958db..f082b4ed4878 100644
|
|
--- a/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c
|
|
+++ b/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c
|
|
@@ -588,6 +588,7 @@ static int anx6345_bridge_attach(struct drm_bridge *bridge,
|
|
|
|
static enum drm_mode_status
|
|
anx6345_bridge_mode_valid(struct drm_bridge *bridge,
|
|
+ const struct drm_display_info *info,
|
|
const struct drm_display_mode *mode)
|
|
{
|
|
if (mode->flags & DRM_MODE_FLAG_INTERLACE)
|
|
diff --git a/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c b/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c
|
|
index 0d5a5ad0c9ee..81debd02c169 100644
|
|
--- a/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c
|
|
+++ b/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c
|
|
@@ -944,6 +944,7 @@ static int anx78xx_bridge_attach(struct drm_bridge *bridge,
|
|
|
|
static enum drm_mode_status
|
|
anx78xx_bridge_mode_valid(struct drm_bridge *bridge,
|
|
+ const struct drm_display_info *info,
|
|
const struct drm_display_mode *mode)
|
|
{
|
|
if (mode->flags & DRM_MODE_FLAG_INTERLACE)
|
|
diff --git a/drivers/gpu/drm/bridge/cdns-dsi.c b/drivers/gpu/drm/bridge/cdns-dsi.c
|
|
index 69c3892caee5..76373e31df92 100644
|
|
--- a/drivers/gpu/drm/bridge/cdns-dsi.c
|
|
+++ b/drivers/gpu/drm/bridge/cdns-dsi.c
|
|
@@ -663,6 +663,7 @@ static int cdns_dsi_bridge_attach(struct drm_bridge *bridge,
|
|
|
|
static enum drm_mode_status
|
|
cdns_dsi_bridge_mode_valid(struct drm_bridge *bridge,
|
|
+ const struct drm_display_info *info,
|
|
const struct drm_display_mode *mode)
|
|
{
|
|
struct cdns_dsi_input *input = bridge_to_cdns_dsi_input(bridge);
|
|
diff --git a/drivers/gpu/drm/bridge/chrontel-ch7033.c b/drivers/gpu/drm/bridge/chrontel-ch7033.c
|
|
index f8675d82974b..486f405c2e16 100644
|
|
--- a/drivers/gpu/drm/bridge/chrontel-ch7033.c
|
|
+++ b/drivers/gpu/drm/bridge/chrontel-ch7033.c
|
|
@@ -317,6 +317,7 @@ static void ch7033_bridge_detach(struct drm_bridge *bridge)
|
|
}
|
|
|
|
static enum drm_mode_status ch7033_bridge_mode_valid(struct drm_bridge *bridge,
|
|
+ const struct drm_display_info *info,
|
|
const struct drm_display_mode *mode)
|
|
{
|
|
if (mode->clock > 165000)
|
|
diff --git a/drivers/gpu/drm/bridge/nwl-dsi.c b/drivers/gpu/drm/bridge/nwl-dsi.c
|
|
index c7bc194bbce3..ce94f797d090 100644
|
|
--- a/drivers/gpu/drm/bridge/nwl-dsi.c
|
|
+++ b/drivers/gpu/drm/bridge/nwl-dsi.c
|
|
@@ -818,6 +818,7 @@ static bool nwl_dsi_bridge_mode_fixup(struct drm_bridge *bridge,
|
|
|
|
static enum drm_mode_status
|
|
nwl_dsi_bridge_mode_valid(struct drm_bridge *bridge,
|
|
+ const struct drm_display_info *info,
|
|
const struct drm_display_mode *mode)
|
|
{
|
|
struct nwl_dsi *dsi = bridge_to_dsi(bridge);
|
|
diff --git a/drivers/gpu/drm/bridge/sii9234.c b/drivers/gpu/drm/bridge/sii9234.c
|
|
index b1258f0ed205..15c98a7bd81c 100644
|
|
--- a/drivers/gpu/drm/bridge/sii9234.c
|
|
+++ b/drivers/gpu/drm/bridge/sii9234.c
|
|
@@ -873,6 +873,7 @@ static inline struct sii9234 *bridge_to_sii9234(struct drm_bridge *bridge)
|
|
}
|
|
|
|
static enum drm_mode_status sii9234_mode_valid(struct drm_bridge *bridge,
|
|
+ const struct drm_display_info *info,
|
|
const struct drm_display_mode *mode)
|
|
{
|
|
if (mode->clock > MHL1_MAX_CLK)
|
|
diff --git a/drivers/gpu/drm/bridge/sil-sii8620.c b/drivers/gpu/drm/bridge/sil-sii8620.c
|
|
index ca98133411aa..95f3d8cfe9ec 100644
|
|
--- a/drivers/gpu/drm/bridge/sil-sii8620.c
|
|
+++ b/drivers/gpu/drm/bridge/sil-sii8620.c
|
|
@@ -2244,6 +2244,7 @@ static int sii8620_is_packing_required(struct sii8620 *ctx,
|
|
}
|
|
|
|
static enum drm_mode_status sii8620_mode_valid(struct drm_bridge *bridge,
|
|
+ const struct drm_display_info *info,
|
|
const struct drm_display_mode *mode)
|
|
{
|
|
struct sii8620 *ctx = bridge_to_sii8620(bridge);
|
|
diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
|
index 30681398cfb0..b535354150db 100644
|
|
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
|
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
|
@@ -2767,6 +2767,7 @@ static void dw_hdmi_bridge_detach(struct drm_bridge *bridge)
|
|
|
|
static enum drm_mode_status
|
|
dw_hdmi_bridge_mode_valid(struct drm_bridge *bridge,
|
|
+ const struct drm_display_info *info,
|
|
const struct drm_display_mode *mode)
|
|
{
|
|
struct dw_hdmi *hdmi = bridge->driver_private;
|
|
diff --git a/drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c b/drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c
|
|
index 5ef0f154aa7b..c223fb9a04cb 100644
|
|
--- a/drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c
|
|
+++ b/drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c
|
|
@@ -924,6 +924,7 @@ static void dw_mipi_dsi_bridge_enable(struct drm_bridge *bridge)
|
|
|
|
static enum drm_mode_status
|
|
dw_mipi_dsi_bridge_mode_valid(struct drm_bridge *bridge,
|
|
+ const struct drm_display_info *info,
|
|
const struct drm_display_mode *mode)
|
|
{
|
|
struct dw_mipi_dsi *dsi = bridge_to_dsi(bridge);
|
|
diff --git a/drivers/gpu/drm/bridge/tc358767.c b/drivers/gpu/drm/bridge/tc358767.c
|
|
index e4c0ea03ae3a..c2777b226c75 100644
|
|
--- a/drivers/gpu/drm/bridge/tc358767.c
|
|
+++ b/drivers/gpu/drm/bridge/tc358767.c
|
|
@@ -1306,6 +1306,7 @@ static bool tc_bridge_mode_fixup(struct drm_bridge *bridge,
|
|
}
|
|
|
|
static enum drm_mode_status tc_mode_valid(struct drm_bridge *bridge,
|
|
+ const struct drm_display_info *info,
|
|
const struct drm_display_mode *mode)
|
|
{
|
|
struct tc_data *tc = bridge_to_tc(bridge);
|
|
diff --git a/drivers/gpu/drm/bridge/tc358768.c b/drivers/gpu/drm/bridge/tc358768.c
|
|
index 6650fe4cfc20..4a463fadf743 100644
|
|
--- a/drivers/gpu/drm/bridge/tc358768.c
|
|
+++ b/drivers/gpu/drm/bridge/tc358768.c
|
|
@@ -529,6 +529,7 @@ static int tc358768_bridge_attach(struct drm_bridge *bridge,
|
|
|
|
static enum drm_mode_status
|
|
tc358768_bridge_mode_valid(struct drm_bridge *bridge,
|
|
+ const struct drm_display_info *info,
|
|
const struct drm_display_mode *mode)
|
|
{
|
|
struct tc358768_priv *priv = bridge_to_tc358768(bridge);
|
|
diff --git a/drivers/gpu/drm/bridge/thc63lvd1024.c b/drivers/gpu/drm/bridge/thc63lvd1024.c
|
|
index 97d8129760e9..86b06975bfdd 100644
|
|
--- a/drivers/gpu/drm/bridge/thc63lvd1024.c
|
|
+++ b/drivers/gpu/drm/bridge/thc63lvd1024.c
|
|
@@ -51,6 +51,7 @@ static int thc63_attach(struct drm_bridge *bridge,
|
|
}
|
|
|
|
static enum drm_mode_status thc63_mode_valid(struct drm_bridge *bridge,
|
|
+ const struct drm_display_info *info,
|
|
const struct drm_display_mode *mode)
|
|
{
|
|
struct thc63_dev *thc63 = to_thc63(bridge);
|
|
diff --git a/drivers/gpu/drm/bridge/ti-tfp410.c b/drivers/gpu/drm/bridge/ti-tfp410.c
|
|
index e3eb6364c0f7..30230c552aeb 100644
|
|
--- a/drivers/gpu/drm/bridge/ti-tfp410.c
|
|
+++ b/drivers/gpu/drm/bridge/ti-tfp410.c
|
|
@@ -188,6 +188,7 @@ static void tfp410_disable(struct drm_bridge *bridge)
|
|
}
|
|
|
|
static enum drm_mode_status tfp410_mode_valid(struct drm_bridge *bridge,
|
|
+ const struct drm_display_info *info,
|
|
const struct drm_display_mode *mode)
|
|
{
|
|
if (mode->clock < 25000)
|
|
diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c
|
|
index b78e142a5620..ab9078eaa912 100644
|
|
--- a/drivers/gpu/drm/drm_atomic_helper.c
|
|
+++ b/drivers/gpu/drm/drm_atomic_helper.c
|
|
@@ -507,7 +507,8 @@ static enum drm_mode_status mode_valid_path(struct drm_connector *connector,
|
|
}
|
|
|
|
bridge = drm_bridge_chain_get_first_bridge(encoder);
|
|
- ret = drm_bridge_chain_mode_valid(bridge, mode);
|
|
+ ret = drm_bridge_chain_mode_valid(bridge, &connector->display_info,
|
|
+ mode);
|
|
if (ret != MODE_OK) {
|
|
DRM_DEBUG_ATOMIC("[BRIDGE] mode_valid() failed\n");
|
|
return ret;
|
|
diff --git a/drivers/gpu/drm/drm_bridge.c b/drivers/gpu/drm/drm_bridge.c
|
|
index afdec8e5fc68..8e31af64e8fe 100644
|
|
--- a/drivers/gpu/drm/drm_bridge.c
|
|
+++ b/drivers/gpu/drm/drm_bridge.c
|
|
@@ -377,6 +377,7 @@ EXPORT_SYMBOL(drm_bridge_chain_mode_fixup);
|
|
* drm_bridge_chain_mode_valid - validate the mode against all bridges in the
|
|
* encoder chain.
|
|
* @bridge: bridge control structure
|
|
+ * @info: display info against which the mode shall be validated
|
|
* @mode: desired mode to be validated
|
|
*
|
|
* Calls &drm_bridge_funcs.mode_valid for all the bridges in the encoder
|
|
@@ -390,6 +391,7 @@ EXPORT_SYMBOL(drm_bridge_chain_mode_fixup);
|
|
*/
|
|
enum drm_mode_status
|
|
drm_bridge_chain_mode_valid(struct drm_bridge *bridge,
|
|
+ const struct drm_display_info *info,
|
|
const struct drm_display_mode *mode)
|
|
{
|
|
struct drm_encoder *encoder;
|
|
@@ -404,7 +406,7 @@ drm_bridge_chain_mode_valid(struct drm_bridge *bridge,
|
|
if (!bridge->funcs->mode_valid)
|
|
continue;
|
|
|
|
- ret = bridge->funcs->mode_valid(bridge, mode);
|
|
+ ret = bridge->funcs->mode_valid(bridge, info, mode);
|
|
if (ret != MODE_OK)
|
|
return ret;
|
|
}
|
|
diff --git a/drivers/gpu/drm/drm_probe_helper.c b/drivers/gpu/drm/drm_probe_helper.c
|
|
index 576b4b7dcd89..f5d141e0400f 100644
|
|
--- a/drivers/gpu/drm/drm_probe_helper.c
|
|
+++ b/drivers/gpu/drm/drm_probe_helper.c
|
|
@@ -114,7 +114,9 @@ drm_mode_validate_pipeline(struct drm_display_mode *mode,
|
|
}
|
|
|
|
bridge = drm_bridge_chain_get_first_bridge(encoder);
|
|
- ret = drm_bridge_chain_mode_valid(bridge, mode);
|
|
+ ret = drm_bridge_chain_mode_valid(bridge,
|
|
+ &connector->display_info,
|
|
+ mode);
|
|
if (ret != MODE_OK) {
|
|
/* There is also no point in continuing for crtc check
|
|
* here. */
|
|
diff --git a/drivers/gpu/drm/i2c/tda998x_drv.c b/drivers/gpu/drm/i2c/tda998x_drv.c
|
|
index 9517f522dcb9..50fd119a5276 100644
|
|
--- a/drivers/gpu/drm/i2c/tda998x_drv.c
|
|
+++ b/drivers/gpu/drm/i2c/tda998x_drv.c
|
|
@@ -1379,6 +1379,7 @@ static void tda998x_bridge_detach(struct drm_bridge *bridge)
|
|
}
|
|
|
|
static enum drm_mode_status tda998x_bridge_mode_valid(struct drm_bridge *bridge,
|
|
+ const struct drm_display_info *info,
|
|
const struct drm_display_mode *mode)
|
|
{
|
|
/* TDA19988 dotclock can go up to 165MHz */
|
|
diff --git a/drivers/gpu/drm/omapdrm/dss/dpi.c b/drivers/gpu/drm/omapdrm/dss/dpi.c
|
|
index 5110acb0c6c1..1d2992daef40 100644
|
|
--- a/drivers/gpu/drm/omapdrm/dss/dpi.c
|
|
+++ b/drivers/gpu/drm/omapdrm/dss/dpi.c
|
|
@@ -434,6 +434,7 @@ static int dpi_bridge_attach(struct drm_bridge *bridge,
|
|
|
|
static enum drm_mode_status
|
|
dpi_bridge_mode_valid(struct drm_bridge *bridge,
|
|
+ const struct drm_display_info *info,
|
|
const struct drm_display_mode *mode)
|
|
{
|
|
struct dpi_data *dpi = drm_bridge_to_dpi(bridge);
|
|
diff --git a/drivers/gpu/drm/omapdrm/dss/sdi.c b/drivers/gpu/drm/omapdrm/dss/sdi.c
|
|
index 417a8740ad0a..033fd30074b0 100644
|
|
--- a/drivers/gpu/drm/omapdrm/dss/sdi.c
|
|
+++ b/drivers/gpu/drm/omapdrm/dss/sdi.c
|
|
@@ -140,6 +140,7 @@ static int sdi_bridge_attach(struct drm_bridge *bridge,
|
|
|
|
static enum drm_mode_status
|
|
sdi_bridge_mode_valid(struct drm_bridge *bridge,
|
|
+ const struct drm_display_info *info,
|
|
const struct drm_display_mode *mode)
|
|
{
|
|
struct sdi_device *sdi = drm_bridge_to_sdi(bridge);
|
|
diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
|
|
index 01ee6c50b663..e0817934ee16 100644
|
|
--- a/drivers/gpu/drm/omapdrm/dss/venc.c
|
|
+++ b/drivers/gpu/drm/omapdrm/dss/venc.c
|
|
@@ -548,6 +548,7 @@ static int venc_bridge_attach(struct drm_bridge *bridge,
|
|
|
|
static enum drm_mode_status
|
|
venc_bridge_mode_valid(struct drm_bridge *bridge,
|
|
+ const struct drm_display_info *info,
|
|
const struct drm_display_mode *mode)
|
|
{
|
|
switch (venc_get_videomode(mode)) {
|
|
diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h
|
|
index ea2aa5ebae34..e3d7f36d8c39 100644
|
|
--- a/include/drm/drm_bridge.h
|
|
+++ b/include/drm/drm_bridge.h
|
|
@@ -35,6 +35,7 @@
|
|
struct drm_bridge;
|
|
struct drm_bridge_timings;
|
|
struct drm_connector;
|
|
+struct drm_display_info;
|
|
struct drm_panel;
|
|
struct edid;
|
|
struct i2c_adapter;
|
|
@@ -112,6 +113,7 @@ struct drm_bridge_funcs {
|
|
* drm_mode_status Enum
|
|
*/
|
|
enum drm_mode_status (*mode_valid)(struct drm_bridge *bridge,
|
|
+ const struct drm_display_info *info,
|
|
const struct drm_display_mode *mode);
|
|
|
|
/**
|
|
@@ -836,6 +838,7 @@ bool drm_bridge_chain_mode_fixup(struct drm_bridge *bridge,
|
|
struct drm_display_mode *adjusted_mode);
|
|
enum drm_mode_status
|
|
drm_bridge_chain_mode_valid(struct drm_bridge *bridge,
|
|
+ const struct drm_display_info *info,
|
|
const struct drm_display_mode *mode);
|
|
void drm_bridge_chain_disable(struct drm_bridge *bridge);
|
|
void drm_bridge_chain_post_disable(struct drm_bridge *bridge);
|
|
|
|
From a9ae85591e16f342fc822ce27a514f2879ac4c06 Mon Sep 17 00:00:00 2001
|
|
From: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
|
|
Date: Tue, 26 May 2020 04:14:49 +0300
|
|
Subject: [PATCH] drm: bridge: dw-hdmi: Pass private data pointer to
|
|
.mode_valid()
|
|
|
|
Platform glue drivers for dw_hdmi may need to access device-specific
|
|
data from their .mode_valid() implementation. They currently have no
|
|
clean way to do so, and one driver hacks around it by accessing the
|
|
dev_private data of the drm_device retrieved from the connector.
|
|
|
|
Add a priv_data void pointer to the dw_hdmi_plat_data structure, and
|
|
pass it to the .mode_valid() function.
|
|
|
|
Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
|
|
Reviewed-by: Neil Armstrong <narmstrong@baylibre.com>
|
|
Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
|
|
Link: https://patchwork.freedesktop.org/patch/msgid/20200526011505.31884-12-laurent.pinchart+renesas@ideasonboard.com
|
|
(cherry picked from commit 96591a4b93fb8b335941783dd6e7ded9d6d49f09)
|
|
---
|
|
drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 6 ++++--
|
|
drivers/gpu/drm/imx/dw_hdmi-imx.c | 6 ++++--
|
|
drivers/gpu/drm/meson/meson_dw_hdmi.c | 3 ++-
|
|
drivers/gpu/drm/rcar-du/rcar_dw_hdmi.c | 3 ++-
|
|
drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c | 3 ++-
|
|
drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c | 6 ++++--
|
|
drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h | 3 ++-
|
|
include/drm/bridge/dw_hdmi.h | 14 ++++++++++++--
|
|
8 files changed, 32 insertions(+), 12 deletions(-)
|
|
|
|
diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
|
index b535354150db..2b3f203cf467 100644
|
|
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
|
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
|
@@ -2771,6 +2771,7 @@ dw_hdmi_bridge_mode_valid(struct drm_bridge *bridge,
|
|
const struct drm_display_mode *mode)
|
|
{
|
|
struct dw_hdmi *hdmi = bridge->driver_private;
|
|
+ const struct dw_hdmi_plat_data *pdata = hdmi->plat_data;
|
|
struct drm_connector *connector = &hdmi->connector;
|
|
enum drm_mode_status mode_status = MODE_OK;
|
|
|
|
@@ -2778,8 +2779,9 @@ dw_hdmi_bridge_mode_valid(struct drm_bridge *bridge,
|
|
if (mode->flags & DRM_MODE_FLAG_DBLCLK)
|
|
return MODE_BAD;
|
|
|
|
- if (hdmi->plat_data->mode_valid)
|
|
- mode_status = hdmi->plat_data->mode_valid(connector, mode);
|
|
+ if (pdata->mode_valid)
|
|
+ mode_status = pdata->mode_valid(hdmi, pdata->priv_data,
|
|
+ connector, mode);
|
|
|
|
return mode_status;
|
|
}
|
|
diff --git a/drivers/gpu/drm/imx/dw_hdmi-imx.c b/drivers/gpu/drm/imx/dw_hdmi-imx.c
|
|
index 87869b9997a6..ff4fde0eb5f6 100644
|
|
--- a/drivers/gpu/drm/imx/dw_hdmi-imx.c
|
|
+++ b/drivers/gpu/drm/imx/dw_hdmi-imx.c
|
|
@@ -145,7 +145,8 @@ static const struct drm_encoder_helper_funcs dw_hdmi_imx_encoder_helper_funcs =
|
|
};
|
|
|
|
static enum drm_mode_status
|
|
-imx6q_hdmi_mode_valid(struct drm_connector *con,
|
|
+imx6q_hdmi_mode_valid(struct dw_hdmi *hdmi, void *data,
|
|
+ struct drm_connector *con,
|
|
const struct drm_display_mode *mode)
|
|
{
|
|
if (mode->clock < 13500)
|
|
@@ -158,7 +159,8 @@ imx6q_hdmi_mode_valid(struct drm_connector *con,
|
|
}
|
|
|
|
static enum drm_mode_status
|
|
-imx6dl_hdmi_mode_valid(struct drm_connector *con,
|
|
+imx6dl_hdmi_mode_valid(struct dw_hdmi *hdmi, void *data,
|
|
+ struct drm_connector *con,
|
|
const struct drm_display_mode *mode)
|
|
{
|
|
if (mode->clock < 13500)
|
|
diff --git a/drivers/gpu/drm/meson/meson_dw_hdmi.c b/drivers/gpu/drm/meson/meson_dw_hdmi.c
|
|
index 24a12c453095..fc594213c0e0 100644
|
|
--- a/drivers/gpu/drm/meson/meson_dw_hdmi.c
|
|
+++ b/drivers/gpu/drm/meson/meson_dw_hdmi.c
|
|
@@ -630,7 +630,8 @@ static irqreturn_t dw_hdmi_top_thread_irq(int irq, void *dev_id)
|
|
}
|
|
|
|
static enum drm_mode_status
|
|
-dw_hdmi_mode_valid(struct drm_connector *connector,
|
|
+dw_hdmi_mode_valid(struct dw_hdmi *hdmi, void *data,
|
|
+ struct drm_connector *connector,
|
|
const struct drm_display_mode *mode)
|
|
{
|
|
struct meson_drm *priv = connector->dev->dev_private;
|
|
diff --git a/drivers/gpu/drm/rcar-du/rcar_dw_hdmi.c b/drivers/gpu/drm/rcar-du/rcar_dw_hdmi.c
|
|
index 452461dc96f2..4d837a4d302d 100644
|
|
--- a/drivers/gpu/drm/rcar-du/rcar_dw_hdmi.c
|
|
+++ b/drivers/gpu/drm/rcar-du/rcar_dw_hdmi.c
|
|
@@ -38,7 +38,8 @@ static const struct rcar_hdmi_phy_params rcar_hdmi_phy_params[] = {
|
|
};
|
|
|
|
static enum drm_mode_status
|
|
-rcar_hdmi_mode_valid(struct drm_connector *connector,
|
|
+rcar_hdmi_mode_valid(struct dw_hdmi *hdmi, void *data,
|
|
+ struct drm_connector *connector,
|
|
const struct drm_display_mode *mode)
|
|
{
|
|
/*
|
|
diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
|
|
index 121aa8a63a76..d08f86783a28 100644
|
|
--- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
|
|
+++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
|
|
@@ -220,7 +220,8 @@ static int rockchip_hdmi_parse_dt(struct rockchip_hdmi *hdmi)
|
|
}
|
|
|
|
static enum drm_mode_status
|
|
-dw_hdmi_rockchip_mode_valid(struct drm_connector *connector,
|
|
+dw_hdmi_rockchip_mode_valid(struct dw_hdmi *hdmi, void *data,
|
|
+ struct drm_connector *connector,
|
|
const struct drm_display_mode *mode)
|
|
{
|
|
const struct dw_hdmi_mpll_config *mpll_cfg = rockchip_mpll_cfg;
|
|
diff --git a/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c b/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c
|
|
index 972682bb8000..0a3637442ba6 100644
|
|
--- a/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c
|
|
+++ b/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c
|
|
@@ -31,7 +31,8 @@ sun8i_dw_hdmi_encoder_helper_funcs = {
|
|
};
|
|
|
|
static enum drm_mode_status
|
|
-sun8i_dw_hdmi_mode_valid_a83t(struct drm_connector *connector,
|
|
+sun8i_dw_hdmi_mode_valid_a83t(struct dw_hdmi *hdmi, void *data,
|
|
+ struct drm_connector *connector,
|
|
const struct drm_display_mode *mode)
|
|
{
|
|
if (mode->clock > 297000)
|
|
@@ -41,7 +42,8 @@ sun8i_dw_hdmi_mode_valid_a83t(struct drm_connector *connector,
|
|
}
|
|
|
|
static enum drm_mode_status
|
|
-sun8i_dw_hdmi_mode_valid_h6(struct drm_connector *connector,
|
|
+sun8i_dw_hdmi_mode_valid_h6(struct dw_hdmi *hdmi, void *data,
|
|
+ struct drm_connector *connector,
|
|
const struct drm_display_mode *mode)
|
|
{
|
|
/*
|
|
diff --git a/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h b/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h
|
|
index 8e64945167e9..8587b8d2590e 100644
|
|
--- a/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h
|
|
+++ b/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h
|
|
@@ -176,7 +176,8 @@ struct sun8i_hdmi_phy {
|
|
};
|
|
|
|
struct sun8i_dw_hdmi_quirks {
|
|
- enum drm_mode_status (*mode_valid)(struct drm_connector *connector,
|
|
+ enum drm_mode_status (*mode_valid)(struct dw_hdmi *hdmi, void *data,
|
|
+ struct drm_connector *connector,
|
|
const struct drm_display_mode *mode);
|
|
unsigned int set_rate : 1;
|
|
unsigned int use_drm_infoframe : 1;
|
|
diff --git a/include/drm/bridge/dw_hdmi.h b/include/drm/bridge/dw_hdmi.h
|
|
index 0b34a12c4a1c..66a811f75b91 100644
|
|
--- a/include/drm/bridge/dw_hdmi.h
|
|
+++ b/include/drm/bridge/dw_hdmi.h
|
|
@@ -124,13 +124,23 @@ struct dw_hdmi_phy_ops {
|
|
|
|
struct dw_hdmi_plat_data {
|
|
struct regmap *regm;
|
|
- enum drm_mode_status (*mode_valid)(struct drm_connector *connector,
|
|
- const struct drm_display_mode *mode);
|
|
+
|
|
unsigned long input_bus_format;
|
|
unsigned long input_bus_encoding;
|
|
bool use_drm_infoframe;
|
|
bool ycbcr_420_allowed;
|
|
|
|
+ /*
|
|
+ * Private data passed to all the .mode_valid() and .configure_phy()
|
|
+ * callback functions.
|
|
+ */
|
|
+ void *priv_data;
|
|
+
|
|
+ /* Platform-specific mode validation (optional). */
|
|
+ enum drm_mode_status (*mode_valid)(struct dw_hdmi *hdmi, void *data,
|
|
+ struct drm_connector *connector,
|
|
+ const struct drm_display_mode *mode);
|
|
+
|
|
/* Vendor PHY support */
|
|
const struct dw_hdmi_phy_ops *phy_ops;
|
|
const char *phy_name;
|
|
|
|
From 5a367989e0577a22f143fd9a0ae8bc3c5e187144 Mon Sep 17 00:00:00 2001
|
|
From: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
|
|
Date: Tue, 26 May 2020 04:14:50 +0300
|
|
Subject: [PATCH] drm: bridge: dw-hdmi: Pass private data pointer to
|
|
.configure_phy()
|
|
|
|
The .configure_phy() operation takes a dw_hdmi_plat_data pointer as a
|
|
context argument. This differs from .mode_valid() that takes a custom
|
|
private context pointer, causing possible confusion. Make the
|
|
dw_hdmi_plat_data operations more consistent by passing the private
|
|
context pointer to .configure_phy() as well.
|
|
|
|
Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
|
|
Reviewed-by: Neil Armstrong <narmstrong@baylibre.com>
|
|
Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
|
|
Link: https://patchwork.freedesktop.org/patch/msgid/20200526011505.31884-13-laurent.pinchart+renesas@ideasonboard.com
|
|
(cherry picked from commit 49da7e5d84e3b520355c0b6148d6dc9e5415a13e)
|
|
---
|
|
drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 2 +-
|
|
drivers/gpu/drm/rcar-du/rcar_dw_hdmi.c | 3 +--
|
|
include/drm/bridge/dw_hdmi.h | 3 +--
|
|
3 files changed, 3 insertions(+), 5 deletions(-)
|
|
|
|
diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
|
index 2b3f203cf467..6edb60e6c784 100644
|
|
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
|
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
|
@@ -1514,7 +1514,7 @@ static int hdmi_phy_configure(struct dw_hdmi *hdmi)
|
|
|
|
/* Write to the PHY as configured by the platform */
|
|
if (pdata->configure_phy)
|
|
- ret = pdata->configure_phy(hdmi, pdata, mpixelclock);
|
|
+ ret = pdata->configure_phy(hdmi, pdata->priv_data, mpixelclock);
|
|
else
|
|
ret = phy->configure(hdmi, pdata, mpixelclock);
|
|
if (ret) {
|
|
diff --git a/drivers/gpu/drm/rcar-du/rcar_dw_hdmi.c b/drivers/gpu/drm/rcar-du/rcar_dw_hdmi.c
|
|
index 4d837a4d302d..d0dffe55a7cb 100644
|
|
--- a/drivers/gpu/drm/rcar-du/rcar_dw_hdmi.c
|
|
+++ b/drivers/gpu/drm/rcar-du/rcar_dw_hdmi.c
|
|
@@ -52,8 +52,7 @@ rcar_hdmi_mode_valid(struct dw_hdmi *hdmi, void *data,
|
|
return MODE_OK;
|
|
}
|
|
|
|
-static int rcar_hdmi_phy_configure(struct dw_hdmi *hdmi,
|
|
- const struct dw_hdmi_plat_data *pdata,
|
|
+static int rcar_hdmi_phy_configure(struct dw_hdmi *hdmi, void *data,
|
|
unsigned long mpixelclock)
|
|
{
|
|
const struct rcar_hdmi_phy_params *params = rcar_hdmi_phy_params;
|
|
diff --git a/include/drm/bridge/dw_hdmi.h b/include/drm/bridge/dw_hdmi.h
|
|
index 66a811f75b91..09348c9cbd11 100644
|
|
--- a/include/drm/bridge/dw_hdmi.h
|
|
+++ b/include/drm/bridge/dw_hdmi.h
|
|
@@ -151,8 +151,7 @@ struct dw_hdmi_plat_data {
|
|
const struct dw_hdmi_mpll_config *mpll_cfg;
|
|
const struct dw_hdmi_curr_ctrl *cur_ctr;
|
|
const struct dw_hdmi_phy_config *phy_config;
|
|
- int (*configure_phy)(struct dw_hdmi *hdmi,
|
|
- const struct dw_hdmi_plat_data *pdata,
|
|
+ int (*configure_phy)(struct dw_hdmi *hdmi, void *data,
|
|
unsigned long mpixelclock);
|
|
};
|
|
|
|
|
|
From 93a10000d40b44c93674ca8b596019e0b3908541 Mon Sep 17 00:00:00 2001
|
|
From: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
|
|
Date: Tue, 26 May 2020 04:14:51 +0300
|
|
Subject: [PATCH] drm: bridge: dw-hdmi: Remove unused field from
|
|
dw_hdmi_plat_data
|
|
|
|
The input_bus_format field of struct dw_hdmi_plat_data is unused. Remove
|
|
it.
|
|
|
|
Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
|
|
Reviewed-by: Neil Armstrong <narmstrong@baylibre.com>
|
|
Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
|
|
Link: https://patchwork.freedesktop.org/patch/msgid/20200526011505.31884-14-laurent.pinchart+renesas@ideasonboard.com
|
|
(cherry picked from commit 29fc89719d396e81176974ce37e0cc81e23869d8)
|
|
---
|
|
drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 5 +----
|
|
include/drm/bridge/dw_hdmi.h | 1 -
|
|
2 files changed, 1 insertion(+), 5 deletions(-)
|
|
|
|
diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
|
index 6edb60e6c784..adc5a95a06e9 100644
|
|
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
|
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
|
@@ -2137,10 +2137,7 @@ static int dw_hdmi_setup(struct dw_hdmi *hdmi, struct drm_display_mode *mode)
|
|
hdmi->hdmi_data.video_mode.mpixelrepetitionoutput = 0;
|
|
hdmi->hdmi_data.video_mode.mpixelrepetitioninput = 0;
|
|
|
|
- if (hdmi->plat_data->input_bus_format)
|
|
- hdmi->hdmi_data.enc_in_bus_format =
|
|
- hdmi->plat_data->input_bus_format;
|
|
- else if (hdmi->hdmi_data.enc_in_bus_format == MEDIA_BUS_FMT_FIXED)
|
|
+ if (hdmi->hdmi_data.enc_in_bus_format == MEDIA_BUS_FMT_FIXED)
|
|
hdmi->hdmi_data.enc_in_bus_format = MEDIA_BUS_FMT_RGB888_1X24;
|
|
|
|
/* TOFIX: Get input encoding from plat data or fallback to none */
|
|
diff --git a/include/drm/bridge/dw_hdmi.h b/include/drm/bridge/dw_hdmi.h
|
|
index 09348c9cbd11..5dfa9d83e2d3 100644
|
|
--- a/include/drm/bridge/dw_hdmi.h
|
|
+++ b/include/drm/bridge/dw_hdmi.h
|
|
@@ -125,7 +125,6 @@ struct dw_hdmi_phy_ops {
|
|
struct dw_hdmi_plat_data {
|
|
struct regmap *regm;
|
|
|
|
- unsigned long input_bus_format;
|
|
unsigned long input_bus_encoding;
|
|
bool use_drm_infoframe;
|
|
bool ycbcr_420_allowed;
|
|
|
|
From 69d79aec4b09b3dce733fedcef1c5f129220e745 Mon Sep 17 00:00:00 2001
|
|
From: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
|
|
Date: Tue, 26 May 2020 04:14:52 +0300
|
|
Subject: [PATCH] drm: meson: dw-hdmi: Use dw_hdmi context to replace hack
|
|
|
|
The meson-dw-hdmi driver needs to access its own context from the
|
|
.mode_valid() operation. It currently gets it from the dev_private field
|
|
of the drm_device retrieved from the connector, which is a hack. Use the
|
|
private data passed to the .mode_valid() operation instead.
|
|
|
|
Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
|
|
Reviewed-by: Neil Armstrong <narmstrong@baylibre.com>
|
|
Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
|
|
Link: https://patchwork.freedesktop.org/patch/msgid/20200526011505.31884-15-laurent.pinchart+renesas@ideasonboard.com
|
|
(cherry picked from commit 9bc78d6dc818701e47c5ebd0879877a512f039f0)
|
|
---
|
|
drivers/gpu/drm/meson/meson_dw_hdmi.c | 6 ++++--
|
|
1 file changed, 4 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/drivers/gpu/drm/meson/meson_dw_hdmi.c b/drivers/gpu/drm/meson/meson_dw_hdmi.c
|
|
index fc594213c0e0..607bd9f495b1 100644
|
|
--- a/drivers/gpu/drm/meson/meson_dw_hdmi.c
|
|
+++ b/drivers/gpu/drm/meson/meson_dw_hdmi.c
|
|
@@ -634,7 +634,8 @@ dw_hdmi_mode_valid(struct dw_hdmi *hdmi, void *data,
|
|
struct drm_connector *connector,
|
|
const struct drm_display_mode *mode)
|
|
{
|
|
- struct meson_drm *priv = connector->dev->dev_private;
|
|
+ struct meson_dw_hdmi *dw_hdmi = data;
|
|
+ struct meson_drm *priv = dw_hdmi->priv;
|
|
bool is_hdmi2_sink = connector->display_info.hdmi.scdc.supported;
|
|
unsigned int phy_freq;
|
|
unsigned int vclk_freq;
|
|
@@ -693,7 +694,7 @@ dw_hdmi_mode_valid(struct dw_hdmi *hdmi, void *data,
|
|
if (mode->flags & DRM_MODE_FLAG_DBLCLK)
|
|
venc_freq /= 2;
|
|
|
|
- dev_dbg(connector->dev->dev, "%s: vclk:%d phy=%d venc=%d hdmi=%d\n",
|
|
+ dev_dbg(dw_hdmi->dev, "%s: vclk:%d phy=%d venc=%d hdmi=%d\n",
|
|
__func__, phy_freq, vclk_freq, venc_freq, hdmi_freq);
|
|
|
|
return meson_vclk_vic_supported_freq(priv, phy_freq, vclk_freq);
|
|
@@ -1066,6 +1067,7 @@ static int meson_dw_hdmi_bind(struct device *dev, struct device *master,
|
|
|
|
/* Bridge / Connector */
|
|
|
|
+ dw_plat_data->priv_data = meson_dw_hdmi;
|
|
dw_plat_data->mode_valid = dw_hdmi_mode_valid;
|
|
dw_plat_data->phy_ops = &meson_dw_hdmi_phy_ops;
|
|
dw_plat_data->phy_name = "meson_dw_hdmi_phy";
|
|
|
|
From 76b17d37e5f17f622d947792abcf4477a27b609e Mon Sep 17 00:00:00 2001
|
|
From: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
|
|
Date: Tue, 26 May 2020 04:14:53 +0300
|
|
Subject: [PATCH] drm: bridge: dw-hdmi: Pass drm_display_info to .mode_valid()
|
|
|
|
Replace the drm_connector pointer passed to the .mode_valid() function
|
|
with a const drm_display_info pointer, as that's all the function should
|
|
need. Use the display info passed to the bridge .mode_valid() operation
|
|
instead of retrieving it from the connector, to prepare for make
|
|
connector creation optional.
|
|
|
|
Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
|
|
Reviewed-by: Neil Armstrong <narmstrong@baylibre.com>
|
|
Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
|
|
Link: https://patchwork.freedesktop.org/patch/msgid/20200526011505.31884-16-laurent.pinchart+renesas@ideasonboard.com
|
|
(cherry picked from commit af05bba0fbe2c07fe500f697080d78d050be2fbf)
|
|
---
|
|
drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 5 ++---
|
|
drivers/gpu/drm/imx/dw_hdmi-imx.c | 4 ++--
|
|
drivers/gpu/drm/meson/meson_dw_hdmi.c | 20 ++++++++++----------
|
|
drivers/gpu/drm/rcar-du/rcar_dw_hdmi.c | 2 +-
|
|
drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c | 2 +-
|
|
drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c | 4 ++--
|
|
drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h | 2 +-
|
|
include/drm/bridge/dw_hdmi.h | 4 ++--
|
|
8 files changed, 21 insertions(+), 22 deletions(-)
|
|
|
|
diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
|
index adc5a95a06e9..23650e69604c 100644
|
|
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
|
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
|
@@ -2769,7 +2769,6 @@ dw_hdmi_bridge_mode_valid(struct drm_bridge *bridge,
|
|
{
|
|
struct dw_hdmi *hdmi = bridge->driver_private;
|
|
const struct dw_hdmi_plat_data *pdata = hdmi->plat_data;
|
|
- struct drm_connector *connector = &hdmi->connector;
|
|
enum drm_mode_status mode_status = MODE_OK;
|
|
|
|
/* We don't support double-clocked modes */
|
|
@@ -2777,8 +2776,8 @@ dw_hdmi_bridge_mode_valid(struct drm_bridge *bridge,
|
|
return MODE_BAD;
|
|
|
|
if (pdata->mode_valid)
|
|
- mode_status = pdata->mode_valid(hdmi, pdata->priv_data,
|
|
- connector, mode);
|
|
+ mode_status = pdata->mode_valid(hdmi, pdata->priv_data, info,
|
|
+ mode);
|
|
|
|
return mode_status;
|
|
}
|
|
diff --git a/drivers/gpu/drm/imx/dw_hdmi-imx.c b/drivers/gpu/drm/imx/dw_hdmi-imx.c
|
|
index ff4fde0eb5f6..71d84c7a5378 100644
|
|
--- a/drivers/gpu/drm/imx/dw_hdmi-imx.c
|
|
+++ b/drivers/gpu/drm/imx/dw_hdmi-imx.c
|
|
@@ -146,7 +146,7 @@ static const struct drm_encoder_helper_funcs dw_hdmi_imx_encoder_helper_funcs =
|
|
|
|
static enum drm_mode_status
|
|
imx6q_hdmi_mode_valid(struct dw_hdmi *hdmi, void *data,
|
|
- struct drm_connector *con,
|
|
+ const struct drm_display_info *info,
|
|
const struct drm_display_mode *mode)
|
|
{
|
|
if (mode->clock < 13500)
|
|
@@ -160,7 +160,7 @@ imx6q_hdmi_mode_valid(struct dw_hdmi *hdmi, void *data,
|
|
|
|
static enum drm_mode_status
|
|
imx6dl_hdmi_mode_valid(struct dw_hdmi *hdmi, void *data,
|
|
- struct drm_connector *con,
|
|
+ const struct drm_display_info *info,
|
|
const struct drm_display_mode *mode)
|
|
{
|
|
if (mode->clock < 13500)
|
|
diff --git a/drivers/gpu/drm/meson/meson_dw_hdmi.c b/drivers/gpu/drm/meson/meson_dw_hdmi.c
|
|
index 607bd9f495b1..50b950f5ca3c 100644
|
|
--- a/drivers/gpu/drm/meson/meson_dw_hdmi.c
|
|
+++ b/drivers/gpu/drm/meson/meson_dw_hdmi.c
|
|
@@ -631,12 +631,12 @@ static irqreturn_t dw_hdmi_top_thread_irq(int irq, void *dev_id)
|
|
|
|
static enum drm_mode_status
|
|
dw_hdmi_mode_valid(struct dw_hdmi *hdmi, void *data,
|
|
- struct drm_connector *connector,
|
|
+ const struct drm_display_info *display_info,
|
|
const struct drm_display_mode *mode)
|
|
{
|
|
struct meson_dw_hdmi *dw_hdmi = data;
|
|
struct meson_drm *priv = dw_hdmi->priv;
|
|
- bool is_hdmi2_sink = connector->display_info.hdmi.scdc.supported;
|
|
+ bool is_hdmi2_sink = display_info->hdmi.scdc.supported;
|
|
unsigned int phy_freq;
|
|
unsigned int vclk_freq;
|
|
unsigned int venc_freq;
|
|
@@ -647,10 +647,10 @@ dw_hdmi_mode_valid(struct dw_hdmi *hdmi, void *data,
|
|
DRM_DEBUG_DRIVER("Modeline " DRM_MODE_FMT "\n", DRM_MODE_ARG(mode));
|
|
|
|
/* If sink does not support 540MHz, reject the non-420 HDMI2 modes */
|
|
- if (connector->display_info.max_tmds_clock &&
|
|
- mode->clock > connector->display_info.max_tmds_clock &&
|
|
- !drm_mode_is_420_only(&connector->display_info, mode) &&
|
|
- !drm_mode_is_420_also(&connector->display_info, mode))
|
|
+ if (display_info->max_tmds_clock &&
|
|
+ mode->clock > display_info->max_tmds_clock &&
|
|
+ !drm_mode_is_420_only(display_info, mode) &&
|
|
+ !drm_mode_is_420_also(display_info, mode))
|
|
return MODE_BAD;
|
|
|
|
/* Check against non-VIC supported modes */
|
|
@@ -667,9 +667,9 @@ dw_hdmi_mode_valid(struct dw_hdmi *hdmi, void *data,
|
|
vclk_freq = mode->clock;
|
|
|
|
/* For 420, pixel clock is half unlike venc clock */
|
|
- if (drm_mode_is_420_only(&connector->display_info, mode) ||
|
|
+ if (drm_mode_is_420_only(display_info, mode) ||
|
|
(!is_hdmi2_sink &&
|
|
- drm_mode_is_420_also(&connector->display_info, mode)))
|
|
+ drm_mode_is_420_also(display_info, mode)))
|
|
vclk_freq /= 2;
|
|
|
|
/* TMDS clock is pixel_clock * 10 */
|
|
@@ -684,9 +684,9 @@ dw_hdmi_mode_valid(struct dw_hdmi *hdmi, void *data,
|
|
|
|
/* VENC double pixels for 1080i, 720p and YUV420 modes */
|
|
if (meson_venc_hdmi_venc_repeat(vic) ||
|
|
- drm_mode_is_420_only(&connector->display_info, mode) ||
|
|
+ drm_mode_is_420_only(display_info, mode) ||
|
|
(!is_hdmi2_sink &&
|
|
- drm_mode_is_420_also(&connector->display_info, mode)))
|
|
+ drm_mode_is_420_also(display_info, mode)))
|
|
venc_freq *= 2;
|
|
|
|
vclk_freq = max(venc_freq, hdmi_freq);
|
|
diff --git a/drivers/gpu/drm/rcar-du/rcar_dw_hdmi.c b/drivers/gpu/drm/rcar-du/rcar_dw_hdmi.c
|
|
index d0dffe55a7cb..7b8ec8310699 100644
|
|
--- a/drivers/gpu/drm/rcar-du/rcar_dw_hdmi.c
|
|
+++ b/drivers/gpu/drm/rcar-du/rcar_dw_hdmi.c
|
|
@@ -39,7 +39,7 @@ static const struct rcar_hdmi_phy_params rcar_hdmi_phy_params[] = {
|
|
|
|
static enum drm_mode_status
|
|
rcar_hdmi_mode_valid(struct dw_hdmi *hdmi, void *data,
|
|
- struct drm_connector *connector,
|
|
+ const struct drm_display_info *info,
|
|
const struct drm_display_mode *mode)
|
|
{
|
|
/*
|
|
diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
|
|
index d08f86783a28..d286751bb333 100644
|
|
--- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
|
|
+++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
|
|
@@ -221,7 +221,7 @@ static int rockchip_hdmi_parse_dt(struct rockchip_hdmi *hdmi)
|
|
|
|
static enum drm_mode_status
|
|
dw_hdmi_rockchip_mode_valid(struct dw_hdmi *hdmi, void *data,
|
|
- struct drm_connector *connector,
|
|
+ const struct drm_display_info *info,
|
|
const struct drm_display_mode *mode)
|
|
{
|
|
const struct dw_hdmi_mpll_config *mpll_cfg = rockchip_mpll_cfg;
|
|
diff --git a/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c b/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c
|
|
index 0a3637442ba6..d4c08043dd81 100644
|
|
--- a/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c
|
|
+++ b/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c
|
|
@@ -32,7 +32,7 @@ sun8i_dw_hdmi_encoder_helper_funcs = {
|
|
|
|
static enum drm_mode_status
|
|
sun8i_dw_hdmi_mode_valid_a83t(struct dw_hdmi *hdmi, void *data,
|
|
- struct drm_connector *connector,
|
|
+ const struct drm_display_info *info,
|
|
const struct drm_display_mode *mode)
|
|
{
|
|
if (mode->clock > 297000)
|
|
@@ -43,7 +43,7 @@ sun8i_dw_hdmi_mode_valid_a83t(struct dw_hdmi *hdmi, void *data,
|
|
|
|
static enum drm_mode_status
|
|
sun8i_dw_hdmi_mode_valid_h6(struct dw_hdmi *hdmi, void *data,
|
|
- struct drm_connector *connector,
|
|
+ const struct drm_display_info *info,
|
|
const struct drm_display_mode *mode)
|
|
{
|
|
/*
|
|
diff --git a/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h b/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h
|
|
index 8587b8d2590e..d983746fa194 100644
|
|
--- a/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h
|
|
+++ b/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h
|
|
@@ -177,7 +177,7 @@ struct sun8i_hdmi_phy {
|
|
|
|
struct sun8i_dw_hdmi_quirks {
|
|
enum drm_mode_status (*mode_valid)(struct dw_hdmi *hdmi, void *data,
|
|
- struct drm_connector *connector,
|
|
+ const struct drm_display_info *info,
|
|
const struct drm_display_mode *mode);
|
|
unsigned int set_rate : 1;
|
|
unsigned int use_drm_infoframe : 1;
|
|
diff --git a/include/drm/bridge/dw_hdmi.h b/include/drm/bridge/dw_hdmi.h
|
|
index 5dfa9d83e2d3..fec293b21c2e 100644
|
|
--- a/include/drm/bridge/dw_hdmi.h
|
|
+++ b/include/drm/bridge/dw_hdmi.h
|
|
@@ -8,7 +8,7 @@
|
|
|
|
#include <sound/hdmi-codec.h>
|
|
|
|
-struct drm_connector;
|
|
+struct drm_display_info;
|
|
struct drm_display_mode;
|
|
struct drm_encoder;
|
|
struct dw_hdmi;
|
|
@@ -137,7 +137,7 @@ struct dw_hdmi_plat_data {
|
|
|
|
/* Platform-specific mode validation (optional). */
|
|
enum drm_mode_status (*mode_valid)(struct dw_hdmi *hdmi, void *data,
|
|
- struct drm_connector *connector,
|
|
+ const struct drm_display_info *info,
|
|
const struct drm_display_mode *mode);
|
|
|
|
/* Vendor PHY support */
|
|
|
|
From 799196d6da0801a31a7129bbdae2aa760714b187 Mon Sep 17 00:00:00 2001
|
|
From: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
|
|
Date: Tue, 26 May 2020 04:14:54 +0300
|
|
Subject: [PATCH] drm: bridge: dw-hdmi: Constify mode argument to
|
|
dw_hdmi_phy_ops .init()
|
|
|
|
The PHY .init() must not modify the mode it receives. Make the pointer
|
|
const to enfore that.
|
|
|
|
Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
|
|
Reviewed-by: Neil Armstrong <narmstrong@baylibre.com>
|
|
Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
|
|
Link: https://patchwork.freedesktop.org/patch/msgid/20200526011505.31884-17-laurent.pinchart+renesas@ideasonboard.com
|
|
(cherry picked from commit 35a395f1134bbbd2984dcca28c04f09fbbb8b0a4)
|
|
---
|
|
drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 2 +-
|
|
drivers/gpu/drm/meson/meson_dw_hdmi.c | 4 ++--
|
|
drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c | 2 +-
|
|
drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c | 2 +-
|
|
include/drm/bridge/dw_hdmi.h | 2 +-
|
|
5 files changed, 6 insertions(+), 6 deletions(-)
|
|
|
|
diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
|
index 23650e69604c..6e6a3d95e68e 100644
|
|
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
|
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
|
@@ -1531,7 +1531,7 @@ static int hdmi_phy_configure(struct dw_hdmi *hdmi)
|
|
}
|
|
|
|
static int dw_hdmi_phy_init(struct dw_hdmi *hdmi, void *data,
|
|
- struct drm_display_mode *mode)
|
|
+ const struct drm_display_mode *mode)
|
|
{
|
|
int i, ret;
|
|
|
|
diff --git a/drivers/gpu/drm/meson/meson_dw_hdmi.c b/drivers/gpu/drm/meson/meson_dw_hdmi.c
|
|
index 50b950f5ca3c..a1217df5fe5a 100644
|
|
--- a/drivers/gpu/drm/meson/meson_dw_hdmi.c
|
|
+++ b/drivers/gpu/drm/meson/meson_dw_hdmi.c
|
|
@@ -297,7 +297,7 @@ static inline void dw_hdmi_dwc_write_bits(struct meson_dw_hdmi *dw_hdmi,
|
|
|
|
/* Setup PHY bandwidth modes */
|
|
static void meson_hdmi_phy_setup_mode(struct meson_dw_hdmi *dw_hdmi,
|
|
- struct drm_display_mode *mode)
|
|
+ const struct drm_display_mode *mode)
|
|
{
|
|
struct meson_drm *priv = dw_hdmi->priv;
|
|
unsigned int pixel_clock = mode->clock;
|
|
@@ -427,7 +427,7 @@ static void dw_hdmi_set_vclk(struct meson_dw_hdmi *dw_hdmi,
|
|
}
|
|
|
|
static int dw_hdmi_phy_init(struct dw_hdmi *hdmi, void *data,
|
|
- struct drm_display_mode *mode)
|
|
+ const struct drm_display_mode *mode)
|
|
{
|
|
struct meson_dw_hdmi *dw_hdmi = (struct meson_dw_hdmi *)data;
|
|
struct meson_drm *priv = dw_hdmi->priv;
|
|
diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
|
|
index d286751bb333..10e210f6455d 100644
|
|
--- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
|
|
+++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
|
|
@@ -312,7 +312,7 @@ static const struct drm_encoder_helper_funcs dw_hdmi_rockchip_encoder_helper_fun
|
|
};
|
|
|
|
static int dw_hdmi_rockchip_genphy_init(struct dw_hdmi *dw_hdmi, void *data,
|
|
- struct drm_display_mode *mode)
|
|
+ const struct drm_display_mode *mode)
|
|
{
|
|
struct rockchip_hdmi *hdmi = (struct rockchip_hdmi *)data;
|
|
|
|
diff --git a/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c b/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c
|
|
index 43643ad31730..8e078cacf063 100644
|
|
--- a/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c
|
|
+++ b/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c
|
|
@@ -341,7 +341,7 @@ static int sun8i_hdmi_phy_config_h3(struct dw_hdmi *hdmi,
|
|
}
|
|
|
|
static int sun8i_hdmi_phy_config(struct dw_hdmi *hdmi, void *data,
|
|
- struct drm_display_mode *mode)
|
|
+ const struct drm_display_mode *mode)
|
|
{
|
|
struct sun8i_hdmi_phy *phy = (struct sun8i_hdmi_phy *)data;
|
|
u32 val = 0;
|
|
diff --git a/include/drm/bridge/dw_hdmi.h b/include/drm/bridge/dw_hdmi.h
|
|
index fec293b21c2e..f930d218cc6b 100644
|
|
--- a/include/drm/bridge/dw_hdmi.h
|
|
+++ b/include/drm/bridge/dw_hdmi.h
|
|
@@ -114,7 +114,7 @@ struct dw_hdmi_phy_config {
|
|
|
|
struct dw_hdmi_phy_ops {
|
|
int (*init)(struct dw_hdmi *hdmi, void *data,
|
|
- struct drm_display_mode *mode);
|
|
+ const struct drm_display_mode *mode);
|
|
void (*disable)(struct dw_hdmi *hdmi, void *data);
|
|
enum drm_connector_status (*read_hpd)(struct dw_hdmi *hdmi, void *data);
|
|
void (*update_hpd)(struct dw_hdmi *hdmi, void *data,
|
|
|
|
From 39e51f084a6c1b5a94151803063f5d2ec44c2389 Mon Sep 17 00:00:00 2001
|
|
From: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
|
|
Date: Tue, 26 May 2020 04:14:55 +0300
|
|
Subject: [PATCH] drm: bridge: dw-hdmi: Constify mode argument to internal
|
|
functions
|
|
|
|
Several internal functions take a drm_display_mode argument to configure
|
|
the HDMI encoder or the HDMI PHY. They must not modify the mode, make
|
|
the pointer const to enforce that.
|
|
|
|
Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
|
|
Reviewed-by: Neil Armstrong <narmstrong@baylibre.com>
|
|
Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
|
|
Link: https://patchwork.freedesktop.org/patch/msgid/20200526011505.31884-18-laurent.pinchart+renesas@ideasonboard.com
|
|
(cherry picked from commit 9fbfa320b435e6f25499a63f7bb74b4fc5341b30)
|
|
---
|
|
drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 8 +++++---
|
|
1 file changed, 5 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
|
index 6e6a3d95e68e..5b5f07a23400 100644
|
|
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
|
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
|
@@ -1628,7 +1628,8 @@ static void hdmi_tx_hdcp_config(struct dw_hdmi *hdmi)
|
|
HDMI_A_HDCPCFG1_ENCRYPTIONDISABLE_MASK, HDMI_A_HDCPCFG1);
|
|
}
|
|
|
|
-static void hdmi_config_AVI(struct dw_hdmi *hdmi, struct drm_display_mode *mode)
|
|
+static void hdmi_config_AVI(struct dw_hdmi *hdmi,
|
|
+ const struct drm_display_mode *mode)
|
|
{
|
|
struct hdmi_avi_infoframe frame;
|
|
u8 val;
|
|
@@ -1756,7 +1757,7 @@ static void hdmi_config_AVI(struct dw_hdmi *hdmi, struct drm_display_mode *mode)
|
|
}
|
|
|
|
static void hdmi_config_vendor_specific_infoframe(struct dw_hdmi *hdmi,
|
|
- struct drm_display_mode *mode)
|
|
+ const struct drm_display_mode *mode)
|
|
{
|
|
struct hdmi_vendor_infoframe frame;
|
|
u8 buffer[10];
|
|
@@ -2112,7 +2113,8 @@ static void hdmi_disable_overflow_interrupts(struct dw_hdmi *hdmi)
|
|
HDMI_IH_MUTE_FC_STAT2);
|
|
}
|
|
|
|
-static int dw_hdmi_setup(struct dw_hdmi *hdmi, struct drm_display_mode *mode)
|
|
+static int dw_hdmi_setup(struct dw_hdmi *hdmi,
|
|
+ const struct drm_display_mode *mode)
|
|
{
|
|
int ret;
|
|
|
|
|
|
From 9dd65c0f564ebe5257c3d5322e40200ac254570b Mon Sep 17 00:00:00 2001
|
|
From: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
|
|
Date: Tue, 26 May 2020 04:14:56 +0300
|
|
Subject: [PATCH] drm: bridge: dw-hdmi: Pass drm_display_info to
|
|
dw_hdmi_support_scdc()
|
|
|
|
To prepare for making connector creation optional in the driver, pass
|
|
the drm_display_info explicitly to dw_hdmi_support_scdc(). The pointer
|
|
is passed to the callers where required, particularly to the
|
|
dw_hdmi_phy_ops .init() function.
|
|
|
|
Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
|
|
Reviewed-by: Neil Armstrong <narmstrong@baylibre.com>
|
|
Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
|
|
Link: https://patchwork.freedesktop.org/patch/msgid/20200526011505.31884-19-laurent.pinchart+renesas@ideasonboard.com
|
|
(cherry picked from commit 7be390d4c0a125266c558c30a3687d931c3b6101)
|
|
---
|
|
drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 32 ++++++++++++---------
|
|
drivers/gpu/drm/meson/meson_dw_hdmi.c | 3 +-
|
|
drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c | 1 +
|
|
drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c | 1 +
|
|
include/drm/bridge/dw_hdmi.h | 4 ++-
|
|
5 files changed, 26 insertions(+), 15 deletions(-)
|
|
|
|
diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
|
index 5b5f07a23400..a18794cce0d8 100644
|
|
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
|
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
|
@@ -1241,10 +1241,9 @@ void dw_hdmi_phy_i2c_write(struct dw_hdmi *hdmi, unsigned short data,
|
|
EXPORT_SYMBOL_GPL(dw_hdmi_phy_i2c_write);
|
|
|
|
/* Filter out invalid setups to avoid configuring SCDC and scrambling */
|
|
-static bool dw_hdmi_support_scdc(struct dw_hdmi *hdmi)
|
|
+static bool dw_hdmi_support_scdc(struct dw_hdmi *hdmi,
|
|
+ const struct drm_display_info *display)
|
|
{
|
|
- struct drm_display_info *display = &hdmi->connector.display_info;
|
|
-
|
|
/* Completely disable SCDC support for older controllers */
|
|
if (hdmi->version < 0x200a)
|
|
return false;
|
|
@@ -1282,12 +1281,13 @@ static bool dw_hdmi_support_scdc(struct dw_hdmi *hdmi)
|
|
* helper should called right before enabling the TMDS Clock and Data in
|
|
* the PHY configuration callback.
|
|
*/
|
|
-void dw_hdmi_set_high_tmds_clock_ratio(struct dw_hdmi *hdmi)
|
|
+void dw_hdmi_set_high_tmds_clock_ratio(struct dw_hdmi *hdmi,
|
|
+ const struct drm_display_info *display)
|
|
{
|
|
unsigned long mtmdsclock = hdmi->hdmi_data.video_mode.mtmdsclock;
|
|
|
|
/* Control for TMDS Bit Period/TMDS Clock-Period Ratio */
|
|
- if (dw_hdmi_support_scdc(hdmi)) {
|
|
+ if (dw_hdmi_support_scdc(hdmi, display)) {
|
|
if (mtmdsclock > HDMI14_MAX_TMDSCLK)
|
|
drm_scdc_set_high_tmds_clock_ratio(hdmi->ddc, 1);
|
|
else
|
|
@@ -1490,7 +1490,8 @@ static int hdmi_phy_configure_dwc_hdmi_3d_tx(struct dw_hdmi *hdmi,
|
|
return 0;
|
|
}
|
|
|
|
-static int hdmi_phy_configure(struct dw_hdmi *hdmi)
|
|
+static int hdmi_phy_configure(struct dw_hdmi *hdmi,
|
|
+ const struct drm_display_info *display)
|
|
{
|
|
const struct dw_hdmi_phy_data *phy = hdmi->phy.data;
|
|
const struct dw_hdmi_plat_data *pdata = hdmi->plat_data;
|
|
@@ -1500,7 +1501,7 @@ static int hdmi_phy_configure(struct dw_hdmi *hdmi)
|
|
|
|
dw_hdmi_phy_power_off(hdmi);
|
|
|
|
- dw_hdmi_set_high_tmds_clock_ratio(hdmi);
|
|
+ dw_hdmi_set_high_tmds_clock_ratio(hdmi, display);
|
|
|
|
/* Leave low power consumption mode by asserting SVSRET. */
|
|
if (phy->has_svsret)
|
|
@@ -1531,6 +1532,7 @@ static int hdmi_phy_configure(struct dw_hdmi *hdmi)
|
|
}
|
|
|
|
static int dw_hdmi_phy_init(struct dw_hdmi *hdmi, void *data,
|
|
+ const struct drm_display_info *display,
|
|
const struct drm_display_mode *mode)
|
|
{
|
|
int i, ret;
|
|
@@ -1540,7 +1542,7 @@ static int dw_hdmi_phy_init(struct dw_hdmi *hdmi, void *data,
|
|
dw_hdmi_phy_sel_data_en_pol(hdmi, 1);
|
|
dw_hdmi_phy_sel_interface_control(hdmi, 0);
|
|
|
|
- ret = hdmi_phy_configure(hdmi);
|
|
+ ret = hdmi_phy_configure(hdmi, display);
|
|
if (ret)
|
|
return ret;
|
|
}
|
|
@@ -1846,10 +1848,11 @@ static void hdmi_config_drm_infoframe(struct dw_hdmi *hdmi)
|
|
}
|
|
|
|
static void hdmi_av_composer(struct dw_hdmi *hdmi,
|
|
+ const struct drm_display_info *display,
|
|
const struct drm_display_mode *mode)
|
|
{
|
|
u8 inv_val, bytes;
|
|
- struct drm_hdmi_info *hdmi_info = &hdmi->connector.display_info.hdmi;
|
|
+ const struct drm_hdmi_info *hdmi_info = &display->hdmi;
|
|
struct hdmi_vmode *vmode = &hdmi->hdmi_data.video_mode;
|
|
int hblank, vblank, h_de_hs, v_de_vs, hsync_len, vsync_len;
|
|
unsigned int vdisplay, hdisplay;
|
|
@@ -1882,7 +1885,7 @@ static void hdmi_av_composer(struct dw_hdmi *hdmi,
|
|
|
|
/* Set up HDMI_FC_INVIDCONF */
|
|
inv_val = (hdmi->hdmi_data.hdcp_enable ||
|
|
- (dw_hdmi_support_scdc(hdmi) &&
|
|
+ (dw_hdmi_support_scdc(hdmi, display) &&
|
|
(vmode->mtmdsclock > HDMI14_MAX_TMDSCLK ||
|
|
hdmi_info->scdc.scrambling.low_rates)) ?
|
|
HDMI_FC_INVIDCONF_HDCP_KEEPOUT_ACTIVE :
|
|
@@ -1950,7 +1953,7 @@ static void hdmi_av_composer(struct dw_hdmi *hdmi,
|
|
}
|
|
|
|
/* Scrambling Control */
|
|
- if (dw_hdmi_support_scdc(hdmi)) {
|
|
+ if (dw_hdmi_support_scdc(hdmi, display)) {
|
|
if (vmode->mtmdsclock > HDMI14_MAX_TMDSCLK ||
|
|
hdmi_info->scdc.scrambling.low_rates) {
|
|
/*
|
|
@@ -2116,6 +2119,7 @@ static void hdmi_disable_overflow_interrupts(struct dw_hdmi *hdmi)
|
|
static int dw_hdmi_setup(struct dw_hdmi *hdmi,
|
|
const struct drm_display_mode *mode)
|
|
{
|
|
+ struct drm_connector *connector = &hdmi->connector;
|
|
int ret;
|
|
|
|
hdmi_disable_overflow_interrupts(hdmi);
|
|
@@ -2161,10 +2165,12 @@ static int dw_hdmi_setup(struct dw_hdmi *hdmi,
|
|
hdmi->hdmi_data.video_mode.mdataenablepolarity = true;
|
|
|
|
/* HDMI Initialization Step B.1 */
|
|
- hdmi_av_composer(hdmi, mode);
|
|
+ hdmi_av_composer(hdmi, &connector->display_info, mode);
|
|
|
|
/* HDMI Initializateion Step B.2 */
|
|
- ret = hdmi->phy.ops->init(hdmi, hdmi->phy.data, &hdmi->previous_mode);
|
|
+ ret = hdmi->phy.ops->init(hdmi, hdmi->phy.data,
|
|
+ &connector->display_info,
|
|
+ &hdmi->previous_mode);
|
|
if (ret)
|
|
return ret;
|
|
hdmi->phy.enabled = true;
|
|
diff --git a/drivers/gpu/drm/meson/meson_dw_hdmi.c b/drivers/gpu/drm/meson/meson_dw_hdmi.c
|
|
index a1217df5fe5a..29a8ff41595d 100644
|
|
--- a/drivers/gpu/drm/meson/meson_dw_hdmi.c
|
|
+++ b/drivers/gpu/drm/meson/meson_dw_hdmi.c
|
|
@@ -427,6 +427,7 @@ static void dw_hdmi_set_vclk(struct meson_dw_hdmi *dw_hdmi,
|
|
}
|
|
|
|
static int dw_hdmi_phy_init(struct dw_hdmi *hdmi, void *data,
|
|
+ const struct drm_display_info *display,
|
|
const struct drm_display_mode *mode)
|
|
{
|
|
struct meson_dw_hdmi *dw_hdmi = (struct meson_dw_hdmi *)data;
|
|
@@ -496,7 +497,7 @@ static int dw_hdmi_phy_init(struct dw_hdmi *hdmi, void *data,
|
|
/* Disable clock, fifo, fifo_wr */
|
|
regmap_update_bits(priv->hhi, HHI_HDMI_PHY_CNTL1, 0xf, 0);
|
|
|
|
- dw_hdmi_set_high_tmds_clock_ratio(hdmi);
|
|
+ dw_hdmi_set_high_tmds_clock_ratio(hdmi, display);
|
|
|
|
msleep(100);
|
|
|
|
diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
|
|
index 10e210f6455d..23de359a1dec 100644
|
|
--- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
|
|
+++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
|
|
@@ -312,6 +312,7 @@ static const struct drm_encoder_helper_funcs dw_hdmi_rockchip_encoder_helper_fun
|
|
};
|
|
|
|
static int dw_hdmi_rockchip_genphy_init(struct dw_hdmi *dw_hdmi, void *data,
|
|
+ const struct drm_display_info *display,
|
|
const struct drm_display_mode *mode)
|
|
{
|
|
struct rockchip_hdmi *hdmi = (struct rockchip_hdmi *)data;
|
|
diff --git a/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c b/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c
|
|
index 8e078cacf063..156d00e5165b 100644
|
|
--- a/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c
|
|
+++ b/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c
|
|
@@ -341,6 +341,7 @@ static int sun8i_hdmi_phy_config_h3(struct dw_hdmi *hdmi,
|
|
}
|
|
|
|
static int sun8i_hdmi_phy_config(struct dw_hdmi *hdmi, void *data,
|
|
+ const struct drm_display_info *display,
|
|
const struct drm_display_mode *mode)
|
|
{
|
|
struct sun8i_hdmi_phy *phy = (struct sun8i_hdmi_phy *)data;
|
|
diff --git a/include/drm/bridge/dw_hdmi.h b/include/drm/bridge/dw_hdmi.h
|
|
index f930d218cc6b..ea34ca146b82 100644
|
|
--- a/include/drm/bridge/dw_hdmi.h
|
|
+++ b/include/drm/bridge/dw_hdmi.h
|
|
@@ -114,6 +114,7 @@ struct dw_hdmi_phy_config {
|
|
|
|
struct dw_hdmi_phy_ops {
|
|
int (*init)(struct dw_hdmi *hdmi, void *data,
|
|
+ const struct drm_display_info *display,
|
|
const struct drm_display_mode *mode);
|
|
void (*disable)(struct dw_hdmi *hdmi, void *data);
|
|
enum drm_connector_status (*read_hpd)(struct dw_hdmi *hdmi, void *data);
|
|
@@ -174,7 +175,8 @@ void dw_hdmi_set_channel_status(struct dw_hdmi *hdmi, u8 *channel_status);
|
|
void dw_hdmi_set_channel_allocation(struct dw_hdmi *hdmi, unsigned int ca);
|
|
void dw_hdmi_audio_enable(struct dw_hdmi *hdmi);
|
|
void dw_hdmi_audio_disable(struct dw_hdmi *hdmi);
|
|
-void dw_hdmi_set_high_tmds_clock_ratio(struct dw_hdmi *hdmi);
|
|
+void dw_hdmi_set_high_tmds_clock_ratio(struct dw_hdmi *hdmi,
|
|
+ const struct drm_display_info *display);
|
|
|
|
/* PHY configuration */
|
|
void dw_hdmi_phy_i2c_set_addr(struct dw_hdmi *hdmi, u8 address);
|
|
|
|
From 57c01c57d5aff20753b3c418abb52b3b317c0166 Mon Sep 17 00:00:00 2001
|
|
From: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
|
|
Date: Tue, 26 May 2020 04:14:57 +0300
|
|
Subject: [PATCH] drm: bridge: dw-hdmi: Split connector creation to a separate
|
|
function
|
|
|
|
Isolate all the code related to connector creation to a new
|
|
dw_hdmi_connector_create() function, to prepare for making connector
|
|
creation optional.
|
|
|
|
Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
|
|
Reviewed-by: Neil Armstrong <narmstrong@baylibre.com>
|
|
Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
|
|
Link: https://patchwork.freedesktop.org/patch/msgid/20200526011505.31884-20-laurent.pinchart+renesas@ideasonboard.com
|
|
(cherry picked from commit 3f588fda4b80dbd7dafa08b0e16fd72a42676e3c)
|
|
---
|
|
drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 107 +++++++++++++---------
|
|
1 file changed, 62 insertions(+), 45 deletions(-)
|
|
|
|
diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
|
index a18794cce0d8..35d38b644912 100644
|
|
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
|
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
|
@@ -2317,6 +2317,10 @@ static void dw_hdmi_update_phy_mask(struct dw_hdmi *hdmi)
|
|
hdmi->rxsense);
|
|
}
|
|
|
|
+/* -----------------------------------------------------------------------------
|
|
+ * DRM Connector Operations
|
|
+ */
|
|
+
|
|
static enum drm_connector_status
|
|
dw_hdmi_connector_detect(struct drm_connector *connector, bool force)
|
|
{
|
|
@@ -2438,6 +2442,59 @@ static const struct drm_connector_helper_funcs dw_hdmi_connector_helper_funcs =
|
|
.atomic_check = dw_hdmi_connector_atomic_check,
|
|
};
|
|
|
|
+static int dw_hdmi_connector_create(struct dw_hdmi *hdmi)
|
|
+{
|
|
+ struct drm_connector *connector = &hdmi->connector;
|
|
+ struct cec_connector_info conn_info;
|
|
+ struct cec_notifier *notifier;
|
|
+
|
|
+ if (hdmi->version >= 0x200a)
|
|
+ connector->ycbcr_420_allowed =
|
|
+ hdmi->plat_data->ycbcr_420_allowed;
|
|
+ else
|
|
+ connector->ycbcr_420_allowed = false;
|
|
+
|
|
+ connector->interlace_allowed = 1;
|
|
+ connector->polled = DRM_CONNECTOR_POLL_HPD;
|
|
+
|
|
+ drm_connector_helper_add(connector, &dw_hdmi_connector_helper_funcs);
|
|
+
|
|
+ drm_connector_init_with_ddc(hdmi->bridge.dev, connector,
|
|
+ &dw_hdmi_connector_funcs,
|
|
+ DRM_MODE_CONNECTOR_HDMIA,
|
|
+ hdmi->ddc);
|
|
+
|
|
+ /*
|
|
+ * drm_connector_attach_max_bpc_property() requires the
|
|
+ * connector to have a state.
|
|
+ */
|
|
+ drm_atomic_helper_connector_reset(connector);
|
|
+
|
|
+ drm_connector_attach_max_bpc_property(connector, 8, 16);
|
|
+
|
|
+ if (hdmi->version >= 0x200a && hdmi->plat_data->use_drm_infoframe)
|
|
+ drm_object_attach_property(&connector->base,
|
|
+ connector->dev->mode_config.hdr_output_metadata_property, 0);
|
|
+
|
|
+ drm_connector_attach_encoder(connector, hdmi->bridge.encoder);
|
|
+
|
|
+ cec_fill_conn_info_from_drm(&conn_info, connector);
|
|
+
|
|
+ notifier = cec_notifier_conn_register(hdmi->dev, NULL, &conn_info);
|
|
+ if (!notifier)
|
|
+ return -ENOMEM;
|
|
+
|
|
+ mutex_lock(&hdmi->cec_notifier_mutex);
|
|
+ hdmi->cec_notifier = notifier;
|
|
+ mutex_unlock(&hdmi->cec_notifier_mutex);
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/* -----------------------------------------------------------------------------
|
|
+ * DRM Bridge Operations
|
|
+ */
|
|
+
|
|
/*
|
|
* Possible output formats :
|
|
* - MEDIA_BUS_FMT_UYYVYY16_0_5X48,
|
|
@@ -2713,51 +2770,13 @@ static int dw_hdmi_bridge_attach(struct drm_bridge *bridge,
|
|
enum drm_bridge_attach_flags flags)
|
|
{
|
|
struct dw_hdmi *hdmi = bridge->driver_private;
|
|
- struct drm_encoder *encoder = bridge->encoder;
|
|
- struct drm_connector *connector = &hdmi->connector;
|
|
- struct cec_connector_info conn_info;
|
|
- struct cec_notifier *notifier;
|
|
|
|
if (flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR) {
|
|
DRM_ERROR("Fix bridge driver to make connector optional!");
|
|
return -EINVAL;
|
|
}
|
|
|
|
- connector->interlace_allowed = 1;
|
|
- connector->polled = DRM_CONNECTOR_POLL_HPD;
|
|
-
|
|
- drm_connector_helper_add(connector, &dw_hdmi_connector_helper_funcs);
|
|
-
|
|
- drm_connector_init_with_ddc(bridge->dev, connector,
|
|
- &dw_hdmi_connector_funcs,
|
|
- DRM_MODE_CONNECTOR_HDMIA,
|
|
- hdmi->ddc);
|
|
-
|
|
- /*
|
|
- * drm_connector_attach_max_bpc_property() requires the
|
|
- * connector to have a state.
|
|
- */
|
|
- drm_atomic_helper_connector_reset(connector);
|
|
-
|
|
- drm_connector_attach_max_bpc_property(connector, 8, 16);
|
|
-
|
|
- if (hdmi->version >= 0x200a && hdmi->plat_data->use_drm_infoframe)
|
|
- drm_object_attach_property(&connector->base,
|
|
- connector->dev->mode_config.hdr_output_metadata_property, 0);
|
|
-
|
|
- drm_connector_attach_encoder(connector, encoder);
|
|
-
|
|
- cec_fill_conn_info_from_drm(&conn_info, connector);
|
|
-
|
|
- notifier = cec_notifier_conn_register(hdmi->dev, NULL, &conn_info);
|
|
- if (!notifier)
|
|
- return -ENOMEM;
|
|
-
|
|
- mutex_lock(&hdmi->cec_notifier_mutex);
|
|
- hdmi->cec_notifier = notifier;
|
|
- mutex_unlock(&hdmi->cec_notifier_mutex);
|
|
-
|
|
- return 0;
|
|
+ return dw_hdmi_connector_create(hdmi);
|
|
}
|
|
|
|
static void dw_hdmi_bridge_detach(struct drm_bridge *bridge)
|
|
@@ -2841,6 +2860,10 @@ static const struct drm_bridge_funcs dw_hdmi_bridge_funcs = {
|
|
.mode_valid = dw_hdmi_bridge_mode_valid,
|
|
};
|
|
|
|
+/* -----------------------------------------------------------------------------
|
|
+ * IRQ Handling
|
|
+ */
|
|
+
|
|
static irqreturn_t dw_hdmi_i2c_irq(struct dw_hdmi *hdmi)
|
|
{
|
|
struct dw_hdmi_i2c *i2c = hdmi->i2c;
|
|
@@ -3303,12 +3326,6 @@ __dw_hdmi_probe(struct platform_device *pdev,
|
|
hdmi->bridge.of_node = pdev->dev.of_node;
|
|
#endif
|
|
|
|
- if (hdmi->version >= 0x200a)
|
|
- hdmi->connector.ycbcr_420_allowed =
|
|
- hdmi->plat_data->ycbcr_420_allowed;
|
|
- else
|
|
- hdmi->connector.ycbcr_420_allowed = false;
|
|
-
|
|
memset(&pdevinfo, 0, sizeof(pdevinfo));
|
|
pdevinfo.parent = dev;
|
|
pdevinfo.id = PLATFORM_DEVID_AUTO;
|
|
|
|
From a3b8c4bc7907f025862b25aca04c9edc999a44e5 Mon Sep 17 00:00:00 2001
|
|
From: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
|
|
Date: Tue, 26 May 2020 04:14:58 +0300
|
|
Subject: [PATCH] drm: bridge: dw-hdmi: Store current connector in struct
|
|
dw_hdmi
|
|
|
|
Store the connector that the bridge is currently wired to in the dw_hdmi
|
|
structure. This is currently identical to the connector field, but will
|
|
differ once the driver supports disabling connector creation.
|
|
|
|
Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
|
|
Reviewed-by: Neil Armstrong <narmstrong@baylibre.com>
|
|
Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
|
|
Link: https://patchwork.freedesktop.org/patch/msgid/20200526011505.31884-21-laurent.pinchart+renesas@ideasonboard.com
|
|
(cherry picked from commit ca7b6b7176ffea4d07afbd98ede7a94fb0f68fa1)
|
|
---
|
|
drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 18 ++++++++++++++----
|
|
1 file changed, 14 insertions(+), 4 deletions(-)
|
|
|
|
diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
|
index 35d38b644912..16bffedb4715 100644
|
|
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
|
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
|
@@ -181,6 +181,7 @@ struct dw_hdmi {
|
|
|
|
struct mutex mutex; /* for state below and previous_mode */
|
|
enum drm_connector_force force; /* mutex-protected force state */
|
|
+ struct drm_connector *curr_conn;/* current connector (only valid when !disabled) */
|
|
bool disabled; /* DRM has disabled our bridge */
|
|
bool bridge_is_on; /* indicates the bridge is on */
|
|
bool rxsense; /* rxsense state */
|
|
@@ -2823,23 +2824,32 @@ static void dw_hdmi_bridge_mode_set(struct drm_bridge *bridge,
|
|
mutex_unlock(&hdmi->mutex);
|
|
}
|
|
|
|
-static void dw_hdmi_bridge_disable(struct drm_bridge *bridge)
|
|
+static void dw_hdmi_bridge_atomic_disable(struct drm_bridge *bridge,
|
|
+ struct drm_bridge_state *old_state)
|
|
{
|
|
struct dw_hdmi *hdmi = bridge->driver_private;
|
|
|
|
mutex_lock(&hdmi->mutex);
|
|
hdmi->disabled = true;
|
|
+ hdmi->curr_conn = NULL;
|
|
dw_hdmi_update_power(hdmi);
|
|
dw_hdmi_update_phy_mask(hdmi);
|
|
mutex_unlock(&hdmi->mutex);
|
|
}
|
|
|
|
-static void dw_hdmi_bridge_enable(struct drm_bridge *bridge)
|
|
+static void dw_hdmi_bridge_atomic_enable(struct drm_bridge *bridge,
|
|
+ struct drm_bridge_state *old_state)
|
|
{
|
|
struct dw_hdmi *hdmi = bridge->driver_private;
|
|
+ struct drm_atomic_state *state = old_state->base.state;
|
|
+ struct drm_connector *connector;
|
|
+
|
|
+ connector = drm_atomic_get_new_connector_for_encoder(state,
|
|
+ bridge->encoder);
|
|
|
|
mutex_lock(&hdmi->mutex);
|
|
hdmi->disabled = false;
|
|
+ hdmi->curr_conn = connector;
|
|
dw_hdmi_update_power(hdmi);
|
|
dw_hdmi_update_phy_mask(hdmi);
|
|
mutex_unlock(&hdmi->mutex);
|
|
@@ -2854,8 +2864,8 @@ static const struct drm_bridge_funcs dw_hdmi_bridge_funcs = {
|
|
.atomic_check = dw_hdmi_bridge_atomic_check,
|
|
.atomic_get_output_bus_fmts = dw_hdmi_bridge_atomic_get_output_bus_fmts,
|
|
.atomic_get_input_bus_fmts = dw_hdmi_bridge_atomic_get_input_bus_fmts,
|
|
- .enable = dw_hdmi_bridge_enable,
|
|
- .disable = dw_hdmi_bridge_disable,
|
|
+ .atomic_enable = dw_hdmi_bridge_atomic_enable,
|
|
+ .atomic_disable = dw_hdmi_bridge_atomic_disable,
|
|
.mode_set = dw_hdmi_bridge_mode_set,
|
|
.mode_valid = dw_hdmi_bridge_mode_valid,
|
|
};
|
|
|
|
From 30b1907401f2475b4b7e8341269a36ef3a45a6bb Mon Sep 17 00:00:00 2001
|
|
From: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
|
|
Date: Tue, 26 May 2020 04:14:59 +0300
|
|
Subject: [PATCH] drm: bridge: dw-hdmi: Pass drm_connector to internal
|
|
functions as needed
|
|
|
|
To prepare for making connector creation optional in the driver, pass
|
|
the drm_connector explicitly to the internal functions that require it.
|
|
The functions that still access the connector from the dw_hdmi structure
|
|
are dw_hdmi_connector_create() and __dw_hdmi_probe(). The former access
|
|
is expected, as that's where the internal connector is created. The
|
|
latter will be addressed separately.
|
|
|
|
Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
|
|
Reviewed-by: Neil Armstrong <narmstrong@baylibre.com>
|
|
Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
|
|
Link: https://patchwork.freedesktop.org/patch/msgid/20200526011505.31884-22-laurent.pinchart+renesas@ideasonboard.com
|
|
(cherry picked from commit 81980037fb275d9db1bbb0239682d707e8dd62a0)
|
|
---
|
|
drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 31 +++++++++++++----------
|
|
1 file changed, 18 insertions(+), 13 deletions(-)
|
|
|
|
diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
|
index 16bffedb4715..b69c14b9de62 100644
|
|
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
|
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
|
@@ -1632,18 +1632,17 @@ static void hdmi_tx_hdcp_config(struct dw_hdmi *hdmi)
|
|
}
|
|
|
|
static void hdmi_config_AVI(struct dw_hdmi *hdmi,
|
|
+ const struct drm_connector *connector,
|
|
const struct drm_display_mode *mode)
|
|
{
|
|
struct hdmi_avi_infoframe frame;
|
|
u8 val;
|
|
|
|
/* Initialise info frame from DRM mode */
|
|
- drm_hdmi_avi_infoframe_from_display_mode(&frame,
|
|
- &hdmi->connector, mode);
|
|
+ drm_hdmi_avi_infoframe_from_display_mode(&frame, connector, mode);
|
|
|
|
if (hdmi_bus_fmt_is_rgb(hdmi->hdmi_data.enc_out_bus_format)) {
|
|
- drm_hdmi_avi_infoframe_quant_range(&frame, &hdmi->connector,
|
|
- mode,
|
|
+ drm_hdmi_avi_infoframe_quant_range(&frame, connector, mode,
|
|
hdmi->hdmi_data.rgb_limited_range ?
|
|
HDMI_QUANTIZATION_RANGE_LIMITED :
|
|
HDMI_QUANTIZATION_RANGE_FULL);
|
|
@@ -1760,14 +1759,14 @@ static void hdmi_config_AVI(struct dw_hdmi *hdmi,
|
|
}
|
|
|
|
static void hdmi_config_vendor_specific_infoframe(struct dw_hdmi *hdmi,
|
|
+ const struct drm_connector *connector,
|
|
const struct drm_display_mode *mode)
|
|
{
|
|
struct hdmi_vendor_infoframe frame;
|
|
u8 buffer[10];
|
|
ssize_t err;
|
|
|
|
- err = drm_hdmi_vendor_infoframe_from_display_mode(&frame,
|
|
- &hdmi->connector,
|
|
+ err = drm_hdmi_vendor_infoframe_from_display_mode(&frame, connector,
|
|
mode);
|
|
if (err < 0)
|
|
/*
|
|
@@ -1813,9 +1812,10 @@ static void hdmi_config_vendor_specific_infoframe(struct dw_hdmi *hdmi,
|
|
HDMI_FC_DATAUTO0_VSD_MASK);
|
|
}
|
|
|
|
-static void hdmi_config_drm_infoframe(struct dw_hdmi *hdmi)
|
|
+static void hdmi_config_drm_infoframe(struct dw_hdmi *hdmi,
|
|
+ const struct drm_connector *connector)
|
|
{
|
|
- const struct drm_connector_state *conn_state = hdmi->connector.state;
|
|
+ const struct drm_connector_state *conn_state = connector->state;
|
|
struct hdmi_drm_infoframe frame;
|
|
u8 buffer[30];
|
|
ssize_t err;
|
|
@@ -2118,9 +2118,9 @@ static void hdmi_disable_overflow_interrupts(struct dw_hdmi *hdmi)
|
|
}
|
|
|
|
static int dw_hdmi_setup(struct dw_hdmi *hdmi,
|
|
+ const struct drm_connector *connector,
|
|
const struct drm_display_mode *mode)
|
|
{
|
|
- struct drm_connector *connector = &hdmi->connector;
|
|
int ret;
|
|
|
|
hdmi_disable_overflow_interrupts(hdmi);
|
|
@@ -2192,9 +2192,9 @@ static int dw_hdmi_setup(struct dw_hdmi *hdmi,
|
|
dev_dbg(hdmi->dev, "%s HDMI mode\n", __func__);
|
|
|
|
/* HDMI Initialization Step F - Configure AVI InfoFrame */
|
|
- hdmi_config_AVI(hdmi, mode);
|
|
- hdmi_config_vendor_specific_infoframe(hdmi, mode);
|
|
- hdmi_config_drm_infoframe(hdmi);
|
|
+ hdmi_config_AVI(hdmi, connector, mode);
|
|
+ hdmi_config_vendor_specific_infoframe(hdmi, connector, mode);
|
|
+ hdmi_config_drm_infoframe(hdmi, connector);
|
|
} else {
|
|
dev_dbg(hdmi->dev, "%s DVI mode\n", __func__);
|
|
}
|
|
@@ -2263,7 +2263,12 @@ static void initialize_hdmi_ih_mutes(struct dw_hdmi *hdmi)
|
|
static void dw_hdmi_poweron(struct dw_hdmi *hdmi)
|
|
{
|
|
hdmi->bridge_is_on = true;
|
|
- dw_hdmi_setup(hdmi, &hdmi->previous_mode);
|
|
+
|
|
+ /*
|
|
+ * The curr_conn field is guaranteed to be valid here, as this function
|
|
+ * is only be called when !hdmi->disabled.
|
|
+ */
|
|
+ dw_hdmi_setup(hdmi, hdmi->curr_conn, &hdmi->previous_mode);
|
|
}
|
|
|
|
static void dw_hdmi_poweroff(struct dw_hdmi *hdmi)
|
|
|
|
From 26ccb66a87e10784ccfc8366494769888f21ebf2 Mon Sep 17 00:00:00 2001
|
|
From: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
|
|
Date: Tue, 26 May 2020 04:15:00 +0300
|
|
Subject: [PATCH] drm: bridge: dw-hdmi: Make connector creation optional
|
|
|
|
Implement the drm_bridge_funcs .detect() and .get_edid() operations, and
|
|
call drm_bridge_hpd_notify() notify to report HPD. This provides the
|
|
necessary API to support disabling connector creation, do so by
|
|
accepting DRM_BRIDGE_ATTACH_NO_CONNECTOR in dw_hdmi_bridge_attach().
|
|
|
|
Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
|
|
Reviewed-by: Neil Armstrong <narmstrong@baylibre.com>
|
|
Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
|
|
Link: https://patchwork.freedesktop.org/patch/msgid/20200526011505.31884-23-laurent.pinchart+renesas@ideasonboard.com
|
|
(cherry picked from commit ec971aaa6775cff555b4f58777ceab1d9a8370e0)
|
|
---
|
|
drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 104 +++++++++++++++-------
|
|
1 file changed, 74 insertions(+), 30 deletions(-)
|
|
|
|
diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
|
index b69c14b9de62..6148a022569a 100644
|
|
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
|
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
|
@@ -2323,15 +2323,8 @@ static void dw_hdmi_update_phy_mask(struct dw_hdmi *hdmi)
|
|
hdmi->rxsense);
|
|
}
|
|
|
|
-/* -----------------------------------------------------------------------------
|
|
- * DRM Connector Operations
|
|
- */
|
|
-
|
|
-static enum drm_connector_status
|
|
-dw_hdmi_connector_detect(struct drm_connector *connector, bool force)
|
|
+static enum drm_connector_status dw_hdmi_detect(struct dw_hdmi *hdmi)
|
|
{
|
|
- struct dw_hdmi *hdmi = container_of(connector, struct dw_hdmi,
|
|
- connector);
|
|
enum drm_connector_status result;
|
|
|
|
mutex_lock(&hdmi->mutex);
|
|
@@ -2354,31 +2347,57 @@ dw_hdmi_connector_detect(struct drm_connector *connector, bool force)
|
|
return result;
|
|
}
|
|
|
|
-static int dw_hdmi_connector_get_modes(struct drm_connector *connector)
|
|
+static struct edid *dw_hdmi_get_edid(struct dw_hdmi *hdmi,
|
|
+ struct drm_connector *connector)
|
|
{
|
|
- struct dw_hdmi *hdmi = container_of(connector, struct dw_hdmi,
|
|
- connector);
|
|
struct edid *edid;
|
|
- int ret = 0;
|
|
|
|
if (!hdmi->ddc)
|
|
- return 0;
|
|
+ return NULL;
|
|
|
|
edid = drm_get_edid(connector, hdmi->ddc);
|
|
- if (edid) {
|
|
- dev_dbg(hdmi->dev, "got edid: width[%d] x height[%d]\n",
|
|
- edid->width_cm, edid->height_cm);
|
|
-
|
|
- hdmi->sink_is_hdmi = drm_detect_hdmi_monitor(edid);
|
|
- hdmi->sink_has_audio = drm_detect_monitor_audio(edid);
|
|
- drm_connector_update_edid_property(connector, edid);
|
|
- cec_notifier_set_phys_addr_from_edid(hdmi->cec_notifier, edid);
|
|
- ret = drm_add_edid_modes(connector, edid);
|
|
- kfree(edid);
|
|
- } else {
|
|
+ if (!edid) {
|
|
dev_dbg(hdmi->dev, "failed to get edid\n");
|
|
+ return NULL;
|
|
}
|
|
|
|
+ dev_dbg(hdmi->dev, "got edid: width[%d] x height[%d]\n",
|
|
+ edid->width_cm, edid->height_cm);
|
|
+
|
|
+ hdmi->sink_is_hdmi = drm_detect_hdmi_monitor(edid);
|
|
+ hdmi->sink_has_audio = drm_detect_monitor_audio(edid);
|
|
+
|
|
+ return edid;
|
|
+}
|
|
+
|
|
+/* -----------------------------------------------------------------------------
|
|
+ * DRM Connector Operations
|
|
+ */
|
|
+
|
|
+static enum drm_connector_status
|
|
+dw_hdmi_connector_detect(struct drm_connector *connector, bool force)
|
|
+{
|
|
+ struct dw_hdmi *hdmi = container_of(connector, struct dw_hdmi,
|
|
+ connector);
|
|
+ return dw_hdmi_detect(hdmi);
|
|
+}
|
|
+
|
|
+static int dw_hdmi_connector_get_modes(struct drm_connector *connector)
|
|
+{
|
|
+ struct dw_hdmi *hdmi = container_of(connector, struct dw_hdmi,
|
|
+ connector);
|
|
+ struct edid *edid;
|
|
+ int ret;
|
|
+
|
|
+ edid = dw_hdmi_get_edid(hdmi, connector);
|
|
+ if (!edid)
|
|
+ return 0;
|
|
+
|
|
+ drm_connector_update_edid_property(connector, edid);
|
|
+ cec_notifier_set_phys_addr_from_edid(hdmi->cec_notifier, edid);
|
|
+ ret = drm_add_edid_modes(connector, edid);
|
|
+ kfree(edid);
|
|
+
|
|
return ret;
|
|
}
|
|
|
|
@@ -2777,10 +2796,8 @@ static int dw_hdmi_bridge_attach(struct drm_bridge *bridge,
|
|
{
|
|
struct dw_hdmi *hdmi = bridge->driver_private;
|
|
|
|
- if (flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR) {
|
|
- DRM_ERROR("Fix bridge driver to make connector optional!");
|
|
- return -EINVAL;
|
|
- }
|
|
+ if (flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR)
|
|
+ return 0;
|
|
|
|
return dw_hdmi_connector_create(hdmi);
|
|
}
|
|
@@ -2860,6 +2877,21 @@ static void dw_hdmi_bridge_atomic_enable(struct drm_bridge *bridge,
|
|
mutex_unlock(&hdmi->mutex);
|
|
}
|
|
|
|
+static enum drm_connector_status dw_hdmi_bridge_detect(struct drm_bridge *bridge)
|
|
+{
|
|
+ struct dw_hdmi *hdmi = bridge->driver_private;
|
|
+
|
|
+ return dw_hdmi_detect(hdmi);
|
|
+}
|
|
+
|
|
+static struct edid *dw_hdmi_bridge_get_edid(struct drm_bridge *bridge,
|
|
+ struct drm_connector *connector)
|
|
+{
|
|
+ struct dw_hdmi *hdmi = bridge->driver_private;
|
|
+
|
|
+ return dw_hdmi_get_edid(hdmi, connector);
|
|
+}
|
|
+
|
|
static const struct drm_bridge_funcs dw_hdmi_bridge_funcs = {
|
|
.atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state,
|
|
.atomic_destroy_state = drm_atomic_helper_bridge_destroy_state,
|
|
@@ -2873,6 +2905,8 @@ static const struct drm_bridge_funcs dw_hdmi_bridge_funcs = {
|
|
.atomic_disable = dw_hdmi_bridge_atomic_disable,
|
|
.mode_set = dw_hdmi_bridge_mode_set,
|
|
.mode_valid = dw_hdmi_bridge_mode_valid,
|
|
+ .detect = dw_hdmi_bridge_detect,
|
|
+ .get_edid = dw_hdmi_bridge_get_edid,
|
|
};
|
|
|
|
/* -----------------------------------------------------------------------------
|
|
@@ -2988,10 +3022,18 @@ static irqreturn_t dw_hdmi_irq(int irq, void *dev_id)
|
|
}
|
|
|
|
if (intr_stat & HDMI_IH_PHY_STAT0_HPD) {
|
|
+ enum drm_connector_status status = phy_int_pol & HDMI_PHY_HPD
|
|
+ ? connector_status_connected
|
|
+ : connector_status_disconnected;
|
|
+
|
|
dev_dbg(hdmi->dev, "EVENT=%s\n",
|
|
- phy_int_pol & HDMI_PHY_HPD ? "plugin" : "plugout");
|
|
- if (hdmi->bridge.dev)
|
|
+ status == connector_status_connected ?
|
|
+ "plugin" : "plugout");
|
|
+
|
|
+ if (hdmi->bridge.dev) {
|
|
drm_helper_hpd_irq_event(hdmi->bridge.dev);
|
|
+ drm_bridge_hpd_notify(&hdmi->bridge, status);
|
|
+ }
|
|
}
|
|
|
|
hdmi_writeb(hdmi, intr_stat, HDMI_IH_PHY_STAT0);
|
|
@@ -3337,6 +3379,8 @@ __dw_hdmi_probe(struct platform_device *pdev,
|
|
|
|
hdmi->bridge.driver_private = hdmi;
|
|
hdmi->bridge.funcs = &dw_hdmi_bridge_funcs;
|
|
+ hdmi->bridge.ops = DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID
|
|
+ | DRM_BRIDGE_OP_HPD;
|
|
#ifdef CONFIG_OF
|
|
hdmi->bridge.of_node = pdev->dev.of_node;
|
|
#endif
|
|
|
|
From 5631b3347b2c688d45a5804cc706702553873c3f Mon Sep 17 00:00:00 2001
|
|
From: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
|
|
Date: Tue, 30 Jun 2020 05:56:58 +0530
|
|
Subject: [PATCH] drm: Add helper to compare edids.
|
|
|
|
Many drivers would benefit from using
|
|
drm helper to compare edid, rather
|
|
than bothering with own implementation.
|
|
|
|
v2: Added documentation for this function.
|
|
|
|
Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
|
|
Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
|
|
Link: https://patchwork.freedesktop.org/patch/msgid/20200630002700.5451-2-kunal1.joshi@intel.com
|
|
(cherry picked from commit 536faa450e17f32fddb1a2124e3df71a966122cd)
|
|
---
|
|
drivers/gpu/drm/drm_edid.c | 33 +++++++++++++++++++++++++++++++++
|
|
include/drm/drm_edid.h | 9 +++++++++
|
|
2 files changed, 42 insertions(+)
|
|
|
|
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
|
|
index b3f659759adb..aa0644d8272a 100644
|
|
--- a/drivers/gpu/drm/drm_edid.c
|
|
+++ b/drivers/gpu/drm/drm_edid.c
|
|
@@ -1615,6 +1615,39 @@ static bool drm_edid_is_zero(const u8 *in_edid, int length)
|
|
return true;
|
|
}
|
|
|
|
+/**
|
|
+ * drm_edid_are_equal - compare two edid blobs.
|
|
+ * @edid1: pointer to first blob
|
|
+ * @edid2: pointer to second blob
|
|
+ * This helper can be used during probing to determine if
|
|
+ * edid had changed.
|
|
+ */
|
|
+bool drm_edid_are_equal(const struct edid *edid1, const struct edid *edid2)
|
|
+{
|
|
+ int edid1_len, edid2_len;
|
|
+ bool edid1_present = edid1 != NULL;
|
|
+ bool edid2_present = edid2 != NULL;
|
|
+
|
|
+ if (edid1_present != edid2_present)
|
|
+ return false;
|
|
+
|
|
+ if (edid1) {
|
|
+
|
|
+ edid1_len = EDID_LENGTH * (1 + edid1->extensions);
|
|
+ edid2_len = EDID_LENGTH * (1 + edid2->extensions);
|
|
+
|
|
+ if (edid1_len != edid2_len)
|
|
+ return false;
|
|
+
|
|
+ if (memcmp(edid1, edid2, edid1_len))
|
|
+ return false;
|
|
+ }
|
|
+
|
|
+ return true;
|
|
+}
|
|
+EXPORT_SYMBOL(drm_edid_are_equal);
|
|
+
|
|
+
|
|
/**
|
|
* drm_edid_block_valid - Sanity check the EDID block (base or extension)
|
|
* @raw_edid: pointer to raw EDID block
|
|
diff --git a/include/drm/drm_edid.h b/include/drm/drm_edid.h
|
|
index 43254319ab19..cfa4f5af49af 100644
|
|
--- a/include/drm/drm_edid.h
|
|
+++ b/include/drm/drm_edid.h
|
|
@@ -359,6 +359,15 @@ drm_load_edid_firmware(struct drm_connector *connector)
|
|
}
|
|
#endif
|
|
|
|
+/**
|
|
+ * drm_edid_are_equal - compare two edid blobs.
|
|
+ * @edid1: pointer to first blob
|
|
+ * @edid2: pointer to second blob
|
|
+ * This helper can be used during probing to determine if
|
|
+ * edid had changed.
|
|
+ */
|
|
+bool drm_edid_are_equal(const struct edid *edid1, const struct edid *edid2);
|
|
+
|
|
int
|
|
drm_hdmi_avi_infoframe_from_display_mode(struct hdmi_avi_infoframe *frame,
|
|
const struct drm_connector *connector,
|
|
|
|
From 00fb1055155719f429be43ff1864959cea9a56e2 Mon Sep 17 00:00:00 2001
|
|
From: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
|
|
Date: Tue, 30 Jun 2020 05:56:59 +0530
|
|
Subject: [PATCH] drm: Introduce epoch counter to drm_connector
|
|
|
|
This counter will be used by drm_helper_probe_detect caller to determine
|
|
if anything had changed(including edid, connection status and etc).
|
|
Hardware specific driver detect hooks are responsible for updating this
|
|
counter when some change is detected to notify the drm part,
|
|
which can trigger for example hotplug event.
|
|
|
|
Also now call drm_connector_update_edid_property
|
|
right after we get edid always to make sure there is a
|
|
unified way to handle edid change, without having to
|
|
change tons of source code as currently
|
|
drm_connector_update_edid_property is called only in
|
|
certain cases like reprobing and not right after edid is
|
|
actually updated.
|
|
|
|
v2: Added documentation for the new counter. Rename change_counter to
|
|
epoch_counter.
|
|
|
|
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=105540
|
|
|
|
Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
|
|
Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
|
|
Link: https://patchwork.freedesktop.org/patch/msgid/20200630002700.5451-3-kunal1.joshi@intel.com
|
|
(cherry picked from commit 5186421cbfe250002308d4d759674214b385752f)
|
|
---
|
|
drivers/gpu/drm/drm_connector.c | 16 +++++++++++++
|
|
drivers/gpu/drm/drm_edid.c | 8 ++++---
|
|
drivers/gpu/drm/drm_probe_helper.c | 38 ++++++++++++++++++++++++++----
|
|
include/drm/drm_connector.h | 2 ++
|
|
4 files changed, 56 insertions(+), 8 deletions(-)
|
|
|
|
diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
|
|
index d877ddc6dc57..c6d7fc45aeac 100644
|
|
--- a/drivers/gpu/drm/drm_connector.c
|
|
+++ b/drivers/gpu/drm/drm_connector.c
|
|
@@ -269,6 +269,7 @@ int drm_connector_init(struct drm_device *dev,
|
|
INIT_LIST_HEAD(&connector->modes);
|
|
mutex_init(&connector->mutex);
|
|
connector->edid_blob_ptr = NULL;
|
|
+ connector->epoch_counter = 0;
|
|
connector->tile_blob_ptr = NULL;
|
|
connector->status = connector_status_unknown;
|
|
connector->display_info.panel_orientation =
|
|
@@ -1954,6 +1955,7 @@ int drm_connector_update_edid_property(struct drm_connector *connector,
|
|
struct drm_device *dev = connector->dev;
|
|
size_t size = 0;
|
|
int ret;
|
|
+ const struct edid *old_edid;
|
|
|
|
/* ignore requests to set edid when overridden */
|
|
if (connector->override_edid)
|
|
@@ -1977,6 +1979,20 @@ int drm_connector_update_edid_property(struct drm_connector *connector,
|
|
|
|
drm_update_tile_info(connector, edid);
|
|
|
|
+ if (connector->edid_blob_ptr) {
|
|
+ old_edid = (const struct edid *)connector->edid_blob_ptr->data;
|
|
+ if (old_edid) {
|
|
+ if (!drm_edid_are_equal(edid, old_edid)) {
|
|
+ DRM_DEBUG_KMS("[CONNECTOR:%d:%s] Edid was changed.\n",
|
|
+ connector->base.id, connector->name);
|
|
+
|
|
+ connector->epoch_counter += 1;
|
|
+ DRM_DEBUG_KMS("Updating change counter to %llu\n",
|
|
+ connector->epoch_counter);
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
drm_object_property_set_value(&connector->base,
|
|
dev->mode_config.non_desktop_property,
|
|
connector->display_info.non_desktop);
|
|
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
|
|
index aa0644d8272a..ddb9a093ad0d 100644
|
|
--- a/drivers/gpu/drm/drm_edid.c
|
|
+++ b/drivers/gpu/drm/drm_edid.c
|
|
@@ -1632,7 +1632,6 @@ bool drm_edid_are_equal(const struct edid *edid1, const struct edid *edid2)
|
|
return false;
|
|
|
|
if (edid1) {
|
|
-
|
|
edid1_len = EDID_LENGTH * (1 + edid1->extensions);
|
|
edid2_len = EDID_LENGTH * (1 + edid2->extensions);
|
|
|
|
@@ -1647,7 +1646,6 @@ bool drm_edid_are_equal(const struct edid *edid1, const struct edid *edid2)
|
|
}
|
|
EXPORT_SYMBOL(drm_edid_are_equal);
|
|
|
|
-
|
|
/**
|
|
* drm_edid_block_valid - Sanity check the EDID block (base or extension)
|
|
* @raw_edid: pointer to raw EDID block
|
|
@@ -2050,13 +2048,17 @@ EXPORT_SYMBOL(drm_probe_ddc);
|
|
struct edid *drm_get_edid(struct drm_connector *connector,
|
|
struct i2c_adapter *adapter)
|
|
{
|
|
+ struct edid *edid;
|
|
+
|
|
if (connector->force == DRM_FORCE_OFF)
|
|
return NULL;
|
|
|
|
if (connector->force == DRM_FORCE_UNSPECIFIED && !drm_probe_ddc(adapter))
|
|
return NULL;
|
|
|
|
- return drm_do_get_edid(connector, drm_do_probe_ddc_edid, adapter);
|
|
+ edid = drm_do_get_edid(connector, drm_do_probe_ddc_edid, adapter);
|
|
+ drm_connector_update_edid_property(connector, edid);
|
|
+ return edid;
|
|
}
|
|
EXPORT_SYMBOL(drm_get_edid);
|
|
|
|
diff --git a/drivers/gpu/drm/drm_probe_helper.c b/drivers/gpu/drm/drm_probe_helper.c
|
|
index f5d141e0400f..6d3a1dbfcba5 100644
|
|
--- a/drivers/gpu/drm/drm_probe_helper.c
|
|
+++ b/drivers/gpu/drm/drm_probe_helper.c
|
|
@@ -290,6 +290,9 @@ drm_helper_probe_detect_ctx(struct drm_connector *connector, bool force)
|
|
if (WARN_ON(ret < 0))
|
|
ret = connector_status_unknown;
|
|
|
|
+ if (ret != connector->status)
|
|
+ connector->epoch_counter += 1;
|
|
+
|
|
drm_modeset_drop_locks(&ctx);
|
|
drm_modeset_acquire_fini(&ctx);
|
|
|
|
@@ -323,11 +326,16 @@ drm_helper_probe_detect(struct drm_connector *connector,
|
|
return ret;
|
|
|
|
if (funcs->detect_ctx)
|
|
- return funcs->detect_ctx(connector, ctx, force);
|
|
+ ret = funcs->detect_ctx(connector, ctx, force);
|
|
else if (connector->funcs->detect)
|
|
- return connector->funcs->detect(connector, force);
|
|
+ ret = connector->funcs->detect(connector, force);
|
|
else
|
|
- return connector_status_connected;
|
|
+ ret = connector_status_connected;
|
|
+
|
|
+ if (ret != connector->status)
|
|
+ connector->epoch_counter += 1;
|
|
+
|
|
+ return ret;
|
|
}
|
|
EXPORT_SYMBOL(drm_helper_probe_detect);
|
|
|
|
@@ -780,6 +788,7 @@ bool drm_helper_hpd_irq_event(struct drm_device *dev)
|
|
struct drm_connector_list_iter conn_iter;
|
|
enum drm_connector_status old_status;
|
|
bool changed = false;
|
|
+ u64 old_epoch_counter;
|
|
|
|
if (!dev->mode_config.poll_enabled)
|
|
return false;
|
|
@@ -793,20 +802,39 @@ bool drm_helper_hpd_irq_event(struct drm_device *dev)
|
|
|
|
old_status = connector->status;
|
|
|
|
+ old_epoch_counter = connector->epoch_counter;
|
|
+
|
|
+ DRM_DEBUG_KMS("[CONNECTOR:%d:%s] Old epoch counter %llu\n", connector->base.id,
|
|
+ connector->name,
|
|
+ old_epoch_counter);
|
|
+
|
|
connector->status = drm_helper_probe_detect(connector, NULL, false);
|
|
DRM_DEBUG_KMS("[CONNECTOR:%d:%s] status updated from %s to %s\n",
|
|
connector->base.id,
|
|
connector->name,
|
|
drm_get_connector_status_name(old_status),
|
|
drm_get_connector_status_name(connector->status));
|
|
- if (old_status != connector->status)
|
|
+
|
|
+ DRM_DEBUG_KMS("[CONNECTOR:%d:%s] New epoch counter %llu\n",
|
|
+ connector->base.id,
|
|
+ connector->name,
|
|
+ connector->epoch_counter);
|
|
+
|
|
+ /*
|
|
+ * Check if epoch counter had changed, meaning that we need
|
|
+ * to send a uevent.
|
|
+ */
|
|
+ if (old_epoch_counter != connector->epoch_counter)
|
|
changed = true;
|
|
+
|
|
}
|
|
drm_connector_list_iter_end(&conn_iter);
|
|
mutex_unlock(&dev->mode_config.mutex);
|
|
|
|
- if (changed)
|
|
+ if (changed) {
|
|
drm_kms_helper_hotplug_event(dev);
|
|
+ DRM_DEBUG_KMS("Sent hotplug event\n");
|
|
+ }
|
|
|
|
return changed;
|
|
}
|
|
diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h
|
|
index fd543d1db9b2..6a451b86c454 100644
|
|
--- a/include/drm/drm_connector.h
|
|
+++ b/include/drm/drm_connector.h
|
|
@@ -1329,6 +1329,8 @@ struct drm_connector {
|
|
enum drm_connector_force force;
|
|
/** @override_edid: has the EDID been overwritten through debugfs for testing? */
|
|
bool override_edid;
|
|
+ /** @epoch_counter: used to detect any other changes in connector, besides status */
|
|
+ u64 epoch_counter;
|
|
|
|
/**
|
|
* @possible_encoders: Bit mask of encoders that can drive this
|
|
|
|
From 0402c6b6ec3351cdf475a0a7b4196cea5e213bd0 Mon Sep 17 00:00:00 2001
|
|
From: Neil Armstrong <narmstrong@baylibre.com>
|
|
Date: Fri, 3 Jul 2020 10:07:23 +0200
|
|
Subject: [PATCH] drm/fourcc: Add modifier definitions for describing Amlogic
|
|
Video Framebuffer Compression
|
|
|
|
Amlogic uses a proprietary lossless image compression protocol and format
|
|
for their hardware video codec accelerators, either video decoders or
|
|
video input encoders.
|
|
|
|
It considerably reduces memory bandwidth while writing and reading
|
|
frames in memory.
|
|
|
|
The underlying storage is considered to be 3 components, 8bit or 10-bit
|
|
per component, YCbCr 420, single plane :
|
|
- DRM_FORMAT_YUV420_8BIT
|
|
- DRM_FORMAT_YUV420_10BIT
|
|
|
|
This modifier will be notably added to DMA-BUF frames imported from the V4L2
|
|
Amlogic VDEC decoder.
|
|
|
|
This introduces the basic layout composed of:
|
|
- a body content organized in 64x32 superblocks with 4096 bytes per
|
|
superblock in default mode.
|
|
- a 32 bytes per 128x64 header block
|
|
|
|
This layout is tranferrable between Amlogic SoCs supporting this modifier.
|
|
|
|
The Memory Saving option exist changing the layout superblock size to save memory when
|
|
using 8bit components pixels size.
|
|
|
|
Finally is also adds the Scatter Memory layout, meaning the header contains IOMMU
|
|
references to the compressed frames content to optimize memory access
|
|
and layout.
|
|
|
|
In this mode, only the header memory address is needed, thus the content
|
|
memory organization is tied to the current producer execution and cannot
|
|
be saved/dumped neither transferrable between Amlogic SoCs supporting this
|
|
modifier.
|
|
|
|
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
|
|
Tested-by: Kevin Hilman <khilman@baylibre.com>
|
|
Reviewed-by: Kevin Hilman <khilman@baylibre.com>
|
|
Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch>
|
|
Link: https://patchwork.freedesktop.org/patch/msgid/20200703080728.25207-2-narmstrong@baylibre.com
|
|
(cherry picked from commit d6528ec883096e7ccdb08257bcc45670bc878519)
|
|
---
|
|
include/uapi/drm/drm_fourcc.h | 81 +++++++++++++++++++++++++++++++++++
|
|
1 file changed, 81 insertions(+)
|
|
|
|
diff --git a/include/uapi/drm/drm_fourcc.h b/include/uapi/drm/drm_fourcc.h
|
|
index 993c1b342315..cbf92fdf2712 100644
|
|
--- a/include/uapi/drm/drm_fourcc.h
|
|
+++ b/include/uapi/drm/drm_fourcc.h
|
|
@@ -331,6 +331,7 @@ extern "C" {
|
|
#define DRM_FORMAT_MOD_VENDOR_BROADCOM 0x07
|
|
#define DRM_FORMAT_MOD_VENDOR_ARM 0x08
|
|
#define DRM_FORMAT_MOD_VENDOR_ALLWINNER 0x09
|
|
+#define DRM_FORMAT_MOD_VENDOR_AMLOGIC 0x0a
|
|
|
|
/* add more to the end as needed */
|
|
|
|
@@ -950,6 +951,86 @@ drm_fourcc_canonicalize_nvidia_format_mod(__u64 modifier)
|
|
*/
|
|
#define DRM_FORMAT_MOD_ALLWINNER_TILED fourcc_mod_code(ALLWINNER, 1)
|
|
|
|
+/*
|
|
+ * Amlogic Video Framebuffer Compression modifiers
|
|
+ *
|
|
+ * Amlogic uses a proprietary lossless image compression protocol and format
|
|
+ * for their hardware video codec accelerators, either video decoders or
|
|
+ * video input encoders.
|
|
+ *
|
|
+ * It considerably reduces memory bandwidth while writing and reading
|
|
+ * frames in memory.
|
|
+ *
|
|
+ * The underlying storage is considered to be 3 components, 8bit or 10-bit
|
|
+ * per component YCbCr 420, single plane :
|
|
+ * - DRM_FORMAT_YUV420_8BIT
|
|
+ * - DRM_FORMAT_YUV420_10BIT
|
|
+ *
|
|
+ * The first 8 bits of the mode defines the layout, then the following 8 bits
|
|
+ * defines the options changing the layout.
|
|
+ *
|
|
+ * Not all combinations are valid, and different SoCs may support different
|
|
+ * combinations of layout and options.
|
|
+ */
|
|
+#define __fourcc_mod_amlogic_layout_mask 0xf
|
|
+#define __fourcc_mod_amlogic_options_shift 8
|
|
+#define __fourcc_mod_amlogic_options_mask 0xf
|
|
+
|
|
+#define DRM_FORMAT_MOD_AMLOGIC_FBC(__layout, __options) \
|
|
+ fourcc_mod_code(AMLOGIC, \
|
|
+ ((__layout) & __fourcc_mod_amlogic_layout_mask) | \
|
|
+ ((__options) & __fourcc_mod_amlogic_options_mask \
|
|
+ << __fourcc_mod_amlogic_options_shift))
|
|
+
|
|
+/* Amlogic FBC Layouts */
|
|
+
|
|
+/*
|
|
+ * Amlogic FBC Basic Layout
|
|
+ *
|
|
+ * The basic layout is composed of:
|
|
+ * - a body content organized in 64x32 superblocks with 4096 bytes per
|
|
+ * superblock in default mode.
|
|
+ * - a 32 bytes per 128x64 header block
|
|
+ *
|
|
+ * This layout is transferrable between Amlogic SoCs supporting this modifier.
|
|
+ */
|
|
+#define AMLOGIC_FBC_LAYOUT_BASIC (1ULL)
|
|
+
|
|
+/*
|
|
+ * Amlogic FBC Scatter Memory layout
|
|
+ *
|
|
+ * Indicates the header contains IOMMU references to the compressed
|
|
+ * frames content to optimize memory access and layout.
|
|
+ *
|
|
+ * In this mode, only the header memory address is needed, thus the
|
|
+ * content memory organization is tied to the current producer
|
|
+ * execution and cannot be saved/dumped neither transferrable between
|
|
+ * Amlogic SoCs supporting this modifier.
|
|
+ *
|
|
+ * Due to the nature of the layout, these buffers are not expected to
|
|
+ * be accessible by the user-space clients, but only accessible by the
|
|
+ * hardware producers and consumers.
|
|
+ *
|
|
+ * The user-space clients should expect a failure while trying to mmap
|
|
+ * the DMA-BUF handle returned by the producer.
|
|
+ */
|
|
+#define AMLOGIC_FBC_LAYOUT_SCATTER (2ULL)
|
|
+
|
|
+/* Amlogic FBC Layout Options Bit Mask */
|
|
+
|
|
+/*
|
|
+ * Amlogic FBC Memory Saving mode
|
|
+ *
|
|
+ * Indicates the storage is packed when pixel size is multiple of word
|
|
+ * boudaries, i.e. 8bit should be stored in this mode to save allocation
|
|
+ * memory.
|
|
+ *
|
|
+ * This mode reduces body layout to 3072 bytes per 64x32 superblock with
|
|
+ * the basic layout and 3200 bytes per 64x32 superblock combined with
|
|
+ * the scatter layout.
|
|
+ */
|
|
+#define AMLOGIC_FBC_OPTION_MEM_SAVING (1ULL << 0)
|
|
+
|
|
#if defined(__cplusplus)
|
|
}
|
|
#endif
|
|
|
|
From bca1f53e15b80ac4fa24a073f96e8f99d994ca8a Mon Sep 17 00:00:00 2001
|
|
From: Brian Starkey <brian.starkey@arm.com>
|
|
Date: Fri, 26 Jun 2020 17:48:00 +0100
|
|
Subject: [PATCH] drm: drm_fourcc: Add generic alias for 16_16_TILE modifier
|
|
|
|
In cases such as DRM_FORMAT_MOD_SAMSUNG_16_16_TILE, the modifier
|
|
describes a generic pixel re-ordering which can be applicable to
|
|
multiple vendors.
|
|
|
|
Define an alias: DRM_FORMAT_MOD_GENERIC_16_16_TILE, which can be
|
|
used to describe this layout in a vendor-neutral way, and add a
|
|
comment about the expected usage of such "generic" modifiers.
|
|
|
|
Changes in v2:
|
|
- Move note about future cases to comment (Daniel)
|
|
|
|
Signed-off-by: Brian Starkey <brian.starkey@arm.com>
|
|
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
|
|
Signed-off-by: Liviu Dudau <Liviu.Dudau@arm.com>
|
|
Link: https://patchwork.freedesktop.org/patch/msgid/20200626164800.11595-1-brian.starkey@arm.com
|
|
(cherry picked from commit 9ac2b63791ef63935c71e2a7f5444a1118c4d084)
|
|
---
|
|
include/uapi/drm/drm_fourcc.h | 25 +++++++++++++++++++++++++
|
|
1 file changed, 25 insertions(+)
|
|
|
|
diff --git a/include/uapi/drm/drm_fourcc.h b/include/uapi/drm/drm_fourcc.h
|
|
index cbf92fdf2712..4bee7de5f306 100644
|
|
--- a/include/uapi/drm/drm_fourcc.h
|
|
+++ b/include/uapi/drm/drm_fourcc.h
|
|
@@ -346,8 +346,33 @@ extern "C" {
|
|
* When adding a new token please document the layout with a code comment,
|
|
* similar to the fourcc codes above. drm_fourcc.h is considered the
|
|
* authoritative source for all of these.
|
|
+ *
|
|
+ * Generic modifier names:
|
|
+ *
|
|
+ * DRM_FORMAT_MOD_GENERIC_* definitions are used to provide vendor-neutral names
|
|
+ * for layouts which are common across multiple vendors. To preserve
|
|
+ * compatibility, in cases where a vendor-specific definition already exists and
|
|
+ * a generic name for it is desired, the common name is a purely symbolic alias
|
|
+ * and must use the same numerical value as the original definition.
|
|
+ *
|
|
+ * Note that generic names should only be used for modifiers which describe
|
|
+ * generic layouts (such as pixel re-ordering), which may have
|
|
+ * independently-developed support across multiple vendors.
|
|
+ *
|
|
+ * In future cases where a generic layout is identified before merging with a
|
|
+ * vendor-specific modifier, a new 'GENERIC' vendor or modifier using vendor
|
|
+ * 'NONE' could be considered. This should only be for obvious, exceptional
|
|
+ * cases to avoid polluting the 'GENERIC' namespace with modifiers which only
|
|
+ * apply to a single vendor.
|
|
+ *
|
|
+ * Generic names should not be used for cases where multiple hardware vendors
|
|
+ * have implementations of the same standardised compression scheme (such as
|
|
+ * AFBC). In those cases, all implementations should use the same format
|
|
+ * modifier(s), reflecting the vendor of the standard.
|
|
*/
|
|
|
|
+#define DRM_FORMAT_MOD_GENERIC_16_16_TILE DRM_FORMAT_MOD_SAMSUNG_16_16_TILE
|
|
+
|
|
/*
|
|
* Invalid Modifier
|
|
*
|
|
|
|
From 01f7cea4ef8c373df777713ceef5599a3efa88cb Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Ville=20Syrj=C3=A4l=C3=A4?= <ville.syrjala@linux.intel.com>
|
|
Date: Wed, 27 May 2020 16:03:08 +0300
|
|
Subject: [PATCH] drm/edid: Allow looking for ext blocks starting from a
|
|
specified index
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
Apparently EDIDs with multiple DispID ext blocks is a thing, so prepare
|
|
for iterating through multiple ext blocks of the same type by
|
|
passing the starting ext block index to drm_find_edid_extension(). Well
|
|
also have drm_find_edid_extension() update the index to point to the
|
|
next ext block on success. Thus we should be able to call
|
|
drm_find_edid_extension() in loop.
|
|
|
|
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
|
|
Link: https://patchwork.freedesktop.org/patch/msgid/20200527130310.27099-1-ville.syrjala@linux.intel.com
|
|
Reviewed-by: José Roberto de Souza <jose.souza@intel.com>
|
|
(cherry picked from commit 8873cfa384055d0348c03161420b1e9b6c1dc5d0)
|
|
---
|
|
drivers/gpu/drm/drm_edid.c | 30 +++++++++++++++++++++---------
|
|
1 file changed, 21 insertions(+), 9 deletions(-)
|
|
|
|
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
|
|
index ddb9a093ad0d..06cb75b9fc44 100644
|
|
--- a/drivers/gpu/drm/drm_edid.c
|
|
+++ b/drivers/gpu/drm/drm_edid.c
|
|
@@ -3226,7 +3226,8 @@ add_detailed_modes(struct drm_connector *connector, struct edid *edid,
|
|
/*
|
|
* Search EDID for CEA extension block.
|
|
*/
|
|
-static u8 *drm_find_edid_extension(const struct edid *edid, int ext_id)
|
|
+static u8 *drm_find_edid_extension(const struct edid *edid,
|
|
+ int ext_id, int *ext_index)
|
|
{
|
|
u8 *edid_ext = NULL;
|
|
int i;
|
|
@@ -3236,23 +3237,26 @@ static u8 *drm_find_edid_extension(const struct edid *edid, int ext_id)
|
|
return NULL;
|
|
|
|
/* Find CEA extension */
|
|
- for (i = 0; i < edid->extensions; i++) {
|
|
+ for (i = *ext_index; i < edid->extensions; i++) {
|
|
edid_ext = (u8 *)edid + EDID_LENGTH * (i + 1);
|
|
if (edid_ext[0] == ext_id)
|
|
break;
|
|
}
|
|
|
|
- if (i == edid->extensions)
|
|
+ if (i >= edid->extensions)
|
|
return NULL;
|
|
|
|
+ *ext_index = i + 1;
|
|
+
|
|
return edid_ext;
|
|
}
|
|
|
|
|
|
static u8 *drm_find_displayid_extension(const struct edid *edid,
|
|
- int *length, int *idx)
|
|
+ int *length, int *idx,
|
|
+ int *ext_index)
|
|
{
|
|
- u8 *displayid = drm_find_edid_extension(edid, DISPLAYID_EXT);
|
|
+ u8 *displayid = drm_find_edid_extension(edid, DISPLAYID_EXT, ext_index);
|
|
struct displayid_hdr *base;
|
|
int ret;
|
|
|
|
@@ -3279,14 +3283,18 @@ static u8 *drm_find_cea_extension(const struct edid *edid)
|
|
struct displayid_block *block;
|
|
u8 *cea;
|
|
u8 *displayid;
|
|
+ int ext_index;
|
|
|
|
/* Look for a top level CEA extension block */
|
|
- cea = drm_find_edid_extension(edid, CEA_EXT);
|
|
+ ext_index = 0;
|
|
+ cea = drm_find_edid_extension(edid, CEA_EXT, &ext_index);
|
|
if (cea)
|
|
return cea;
|
|
|
|
/* CEA blocks can also be found embedded in a DisplayID block */
|
|
- displayid = drm_find_displayid_extension(edid, &length, &idx);
|
|
+ ext_index = 0;
|
|
+ displayid = drm_find_displayid_extension(edid, &length, &idx,
|
|
+ &ext_index);
|
|
if (!displayid)
|
|
return NULL;
|
|
|
|
@@ -5236,8 +5244,10 @@ static int add_displayid_detailed_modes(struct drm_connector *connector,
|
|
int length, idx;
|
|
struct displayid_block *block;
|
|
int num_modes = 0;
|
|
+ int ext_index = 0;
|
|
|
|
- displayid = drm_find_displayid_extension(edid, &length, &idx);
|
|
+ displayid = drm_find_displayid_extension(edid, &length, &idx,
|
|
+ &ext_index);
|
|
if (!displayid)
|
|
return 0;
|
|
|
|
@@ -5911,11 +5921,13 @@ void drm_update_tile_info(struct drm_connector *connector,
|
|
const struct edid *edid)
|
|
{
|
|
const void *displayid = NULL;
|
|
+ int ext_index = 0;
|
|
int length, idx;
|
|
int ret;
|
|
|
|
connector->has_tile = false;
|
|
- displayid = drm_find_displayid_extension(edid, &length, &idx);
|
|
+ displayid = drm_find_displayid_extension(edid, &length, &idx,
|
|
+ &ext_index);
|
|
if (!displayid) {
|
|
/* drop reference to any tile group we had */
|
|
goto out_drop_ref;
|
|
|
|
From 181edc12e551c8194591969ee528ed6041e4ada4 Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Ville=20Syrj=C3=A4l=C3=A4?= <ville.syrjala@linux.intel.com>
|
|
Date: Wed, 27 May 2020 16:03:09 +0300
|
|
Subject: [PATCH] drm/edid: Iterate through all DispID ext blocks
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
Apparently there are EDIDs in the wild with multiple DispID extension
|
|
blocks. Iterate through them all.
|
|
|
|
In one particular case the tile information is specicied in the
|
|
second DispID ext block, and since the current parser only looks
|
|
at the first DispID ext block we don't notice that we're dealing
|
|
with a tiled display.
|
|
|
|
While at it change a few functions to return void since we have
|
|
no use for the errno.
|
|
|
|
References: https://gitlab.freedesktop.org/drm/intel/-/issues/27
|
|
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
|
|
Link: https://patchwork.freedesktop.org/patch/msgid/20200527130310.27099-2-ville.syrjala@linux.intel.com
|
|
Reviewed-by: José Roberto de Souza <jose.souza@intel.com>
|
|
(cherry picked from commit 7f261afdcfae363192e3eef52dd34855cc149c15)
|
|
---
|
|
drivers/gpu/drm/drm_edid.c | 84 +++++++++++++++++---------------------
|
|
1 file changed, 38 insertions(+), 46 deletions(-)
|
|
|
|
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
|
|
index 06cb75b9fc44..fcd739af570f 100644
|
|
--- a/drivers/gpu/drm/drm_edid.c
|
|
+++ b/drivers/gpu/drm/drm_edid.c
|
|
@@ -3286,6 +3286,7 @@ static u8 *drm_find_cea_extension(const struct edid *edid)
|
|
int ext_index;
|
|
|
|
/* Look for a top level CEA extension block */
|
|
+ /* FIXME: make callers iterate through multiple CEA ext blocks? */
|
|
ext_index = 0;
|
|
cea = drm_find_edid_extension(edid, CEA_EXT, &ext_index);
|
|
if (cea)
|
|
@@ -3293,20 +3294,20 @@ static u8 *drm_find_cea_extension(const struct edid *edid)
|
|
|
|
/* CEA blocks can also be found embedded in a DisplayID block */
|
|
ext_index = 0;
|
|
- displayid = drm_find_displayid_extension(edid, &length, &idx,
|
|
- &ext_index);
|
|
- if (!displayid)
|
|
- return NULL;
|
|
+ for (;;) {
|
|
+ displayid = drm_find_displayid_extension(edid, &length, &idx,
|
|
+ &ext_index);
|
|
+ if (!displayid)
|
|
+ return NULL;
|
|
|
|
- idx += sizeof(struct displayid_hdr);
|
|
- for_each_displayid_db(displayid, block, idx, length) {
|
|
- if (block->tag == DATA_BLOCK_CTA) {
|
|
- cea = (u8 *)block;
|
|
- break;
|
|
+ idx += sizeof(struct displayid_hdr);
|
|
+ for_each_displayid_db(displayid, block, idx, length) {
|
|
+ if (block->tag == DATA_BLOCK_CTA)
|
|
+ return (u8 *)block;
|
|
}
|
|
}
|
|
|
|
- return cea;
|
|
+ return NULL;
|
|
}
|
|
|
|
static __always_inline const struct drm_display_mode *cea_mode_for_vic(u8 vic)
|
|
@@ -5246,19 +5247,22 @@ static int add_displayid_detailed_modes(struct drm_connector *connector,
|
|
int num_modes = 0;
|
|
int ext_index = 0;
|
|
|
|
- displayid = drm_find_displayid_extension(edid, &length, &idx,
|
|
- &ext_index);
|
|
- if (!displayid)
|
|
- return 0;
|
|
-
|
|
- idx += sizeof(struct displayid_hdr);
|
|
- for_each_displayid_db(displayid, block, idx, length) {
|
|
- switch (block->tag) {
|
|
- case DATA_BLOCK_TYPE_1_DETAILED_TIMING:
|
|
- num_modes += add_displayid_detailed_1_modes(connector, block);
|
|
+ for (;;) {
|
|
+ displayid = drm_find_displayid_extension(edid, &length, &idx,
|
|
+ &ext_index);
|
|
+ if (!displayid)
|
|
break;
|
|
+
|
|
+ idx += sizeof(struct displayid_hdr);
|
|
+ for_each_displayid_db(displayid, block, idx, length) {
|
|
+ switch (block->tag) {
|
|
+ case DATA_BLOCK_TYPE_1_DETAILED_TIMING:
|
|
+ num_modes += add_displayid_detailed_1_modes(connector, block);
|
|
+ break;
|
|
+ }
|
|
}
|
|
}
|
|
+
|
|
return num_modes;
|
|
}
|
|
|
|
@@ -5838,8 +5842,8 @@ drm_hdmi_vendor_infoframe_from_display_mode(struct hdmi_vendor_infoframe *frame,
|
|
}
|
|
EXPORT_SYMBOL(drm_hdmi_vendor_infoframe_from_display_mode);
|
|
|
|
-static int drm_parse_tiled_block(struct drm_connector *connector,
|
|
- const struct displayid_block *block)
|
|
+static void drm_parse_tiled_block(struct drm_connector *connector,
|
|
+ const struct displayid_block *block)
|
|
{
|
|
const struct displayid_tiled_block *tile = (struct displayid_tiled_block *)block;
|
|
u16 w, h;
|
|
@@ -5877,7 +5881,7 @@ static int drm_parse_tiled_block(struct drm_connector *connector,
|
|
tg = drm_mode_create_tile_group(connector->dev, tile->topology_id);
|
|
}
|
|
if (!tg)
|
|
- return -ENOMEM;
|
|
+ return;
|
|
|
|
if (connector->tile_group != tg) {
|
|
/* if we haven't got a pointer,
|
|
@@ -5889,14 +5893,12 @@ static int drm_parse_tiled_block(struct drm_connector *connector,
|
|
} else
|
|
/* if same tile group, then release the ref we just took. */
|
|
drm_mode_put_tile_group(connector->dev, tg);
|
|
- return 0;
|
|
}
|
|
|
|
-static int drm_displayid_parse_tiled(struct drm_connector *connector,
|
|
- const u8 *displayid, int length, int idx)
|
|
+static void drm_displayid_parse_tiled(struct drm_connector *connector,
|
|
+ const u8 *displayid, int length, int idx)
|
|
{
|
|
const struct displayid_block *block;
|
|
- int ret;
|
|
|
|
idx += sizeof(struct displayid_hdr);
|
|
for_each_displayid_db(displayid, block, idx, length) {
|
|
@@ -5905,16 +5907,13 @@ static int drm_displayid_parse_tiled(struct drm_connector *connector,
|
|
|
|
switch (block->tag) {
|
|
case DATA_BLOCK_TILED_DISPLAY:
|
|
- ret = drm_parse_tiled_block(connector, block);
|
|
- if (ret)
|
|
- return ret;
|
|
+ drm_parse_tiled_block(connector, block);
|
|
break;
|
|
default:
|
|
DRM_DEBUG_KMS("found DisplayID tag 0x%x, unhandled\n", block->tag);
|
|
break;
|
|
}
|
|
}
|
|
- return 0;
|
|
}
|
|
|
|
void drm_update_tile_info(struct drm_connector *connector,
|
|
@@ -5923,26 +5922,19 @@ void drm_update_tile_info(struct drm_connector *connector,
|
|
const void *displayid = NULL;
|
|
int ext_index = 0;
|
|
int length, idx;
|
|
- int ret;
|
|
|
|
connector->has_tile = false;
|
|
- displayid = drm_find_displayid_extension(edid, &length, &idx,
|
|
- &ext_index);
|
|
- if (!displayid) {
|
|
- /* drop reference to any tile group we had */
|
|
- goto out_drop_ref;
|
|
+ for (;;) {
|
|
+ displayid = drm_find_displayid_extension(edid, &length, &idx,
|
|
+ &ext_index);
|
|
+ if (!displayid)
|
|
+ break;
|
|
+
|
|
+ drm_displayid_parse_tiled(connector, displayid, length, idx);
|
|
}
|
|
|
|
- ret = drm_displayid_parse_tiled(connector, displayid, length, idx);
|
|
- if (ret < 0)
|
|
- goto out_drop_ref;
|
|
- if (!connector->has_tile)
|
|
- goto out_drop_ref;
|
|
- return;
|
|
-out_drop_ref:
|
|
- if (connector->tile_group) {
|
|
+ if (!connector->has_tile && connector->tile_group) {
|
|
drm_mode_put_tile_group(connector->dev, connector->tile_group);
|
|
connector->tile_group = NULL;
|
|
}
|
|
- return;
|
|
}
|
|
|
|
From c4a01f31ea528f8a1057b720eed47d502b19a3fb Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Ville=20Syrj=C3=A4l=C3=A4?= <ville.syrjala@linux.intel.com>
|
|
Date: Wed, 27 May 2020 16:03:10 +0300
|
|
Subject: [PATCH] drm/edid: Clean up some curly braces
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
Drop some pointless curly braces, and add some across the
|
|
else when the if has them too.
|
|
|
|
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
|
|
Link: https://patchwork.freedesktop.org/patch/msgid/20200527130310.27099-3-ville.syrjala@linux.intel.com
|
|
Reviewed-by: José Roberto de Souza <jose.souza@intel.com>
|
|
(cherry picked from commit 392f9fcb159bf95ec3c7de340a880f4778167275)
|
|
---
|
|
drivers/gpu/drm/drm_edid.c | 9 ++++-----
|
|
1 file changed, 4 insertions(+), 5 deletions(-)
|
|
|
|
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
|
|
index fcd739af570f..c28e7678014d 100644
|
|
--- a/drivers/gpu/drm/drm_edid.c
|
|
+++ b/drivers/gpu/drm/drm_edid.c
|
|
@@ -5877,22 +5877,21 @@ static void drm_parse_tiled_block(struct drm_connector *connector,
|
|
DRM_DEBUG_KMS("vend %c%c%c\n", tile->topology_id[0], tile->topology_id[1], tile->topology_id[2]);
|
|
|
|
tg = drm_mode_get_tile_group(connector->dev, tile->topology_id);
|
|
- if (!tg) {
|
|
+ if (!tg)
|
|
tg = drm_mode_create_tile_group(connector->dev, tile->topology_id);
|
|
- }
|
|
if (!tg)
|
|
return;
|
|
|
|
if (connector->tile_group != tg) {
|
|
/* if we haven't got a pointer,
|
|
take the reference, drop ref to old tile group */
|
|
- if (connector->tile_group) {
|
|
+ if (connector->tile_group)
|
|
drm_mode_put_tile_group(connector->dev, connector->tile_group);
|
|
- }
|
|
connector->tile_group = tg;
|
|
- } else
|
|
+ } else {
|
|
/* if same tile group, then release the ref we just took. */
|
|
drm_mode_put_tile_group(connector->dev, tg);
|
|
+ }
|
|
}
|
|
|
|
static void drm_displayid_parse_tiled(struct drm_connector *connector,
|
|
|
|
From 7a5d301a5077083f45d826c49248882eacec778d Mon Sep 17 00:00:00 2001
|
|
From: Liu Ying <victor.liu@nxp.com>
|
|
Date: Thu, 9 Jul 2020 10:02:35 +0800
|
|
Subject: [PATCH] drm/bridge: dw-hdmi: Don't cleanup i2c adapter and ddc ptr in
|
|
__dw_hdmi_probe() bailout path
|
|
|
|
It's unnecessary to cleanup the i2c adapter and the ddc pointer in
|
|
the bailout path of __dw_hdmi_probe(), since the adapter is not
|
|
added and the ddc pointer is not set.
|
|
|
|
Fixes: a23d6265f033 ("drm: bridge: dw-hdmi: Extract PHY interrupt setup to a function")
|
|
Cc: Andrzej Hajda <a.hajda@samsung.com>
|
|
Cc: Neil Armstrong <narmstrong@baylibre.com>
|
|
Cc: Laurent Pinchart <Laurent.pinchart@ideasonboard.com>
|
|
Cc: Jonas Karlman <jonas@kwiboo.se>
|
|
Cc: Jernej Skrabec <jernej.skrabec@siol.net>
|
|
Cc: David Airlie <airlied@linux.ie>
|
|
Cc: Daniel Vetter <daniel@ffwll.ch>
|
|
Cc: Boris Brezillon <boris.brezillon@collabora.com>
|
|
Cc: Jerome Brunet <jbrunet@baylibre.com>
|
|
Cc: Cheng-Yi Chiang <cychiang@chromium.org>
|
|
Cc: Dariusz Marcinkiewicz <darekm@google.com>
|
|
Cc: Archit Taneja <architt@codeaurora.org>
|
|
Cc: Jose Abreu <joabreu@synopsys.com>
|
|
Cc: dri-devel@lists.freedesktop.org
|
|
Cc: NXP Linux Team <linux-imx@nxp.com>
|
|
Signed-off-by: Liu Ying <victor.liu@nxp.com>
|
|
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
|
Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
|
|
Link: https://patchwork.freedesktop.org/patch/msgid/1594260156-8316-1-git-send-email-victor.liu@nxp.com
|
|
(cherry picked from commit 2ae53e79f2dec41949d7b089c0b6d7edce292d10)
|
|
---
|
|
drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 5 -----
|
|
1 file changed, 5 deletions(-)
|
|
|
|
diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
|
index 6148a022569a..137b6ebfed19 100644
|
|
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
|
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
|
@@ -3441,11 +3441,6 @@ __dw_hdmi_probe(struct platform_device *pdev,
|
|
return hdmi;
|
|
|
|
err_iahb:
|
|
- if (hdmi->i2c) {
|
|
- i2c_del_adapter(&hdmi->i2c->adap);
|
|
- hdmi->ddc = NULL;
|
|
- }
|
|
-
|
|
clk_disable_unprepare(hdmi->iahb_clk);
|
|
if (hdmi->cec_clk)
|
|
clk_disable_unprepare(hdmi->cec_clk);
|
|
|
|
From fe98962cfe32f385bed8c1fea444aeb887b472e6 Mon Sep 17 00:00:00 2001
|
|
From: Liu Ying <victor.liu@nxp.com>
|
|
Date: Thu, 9 Jul 2020 10:02:36 +0800
|
|
Subject: [PATCH] drm/bridge: dw-hdmi: Always add the bridge in the global
|
|
bridge list
|
|
|
|
It doesn't hurt to add the bridge in the global bridge list also for
|
|
platform specific dw-hdmi drivers which are based on the component
|
|
framework. This can be achieved by moving the drm_bridge_add() function
|
|
call from dw_hdmi_probe() to __dw_hdmi_probe(). A counterpart movement
|
|
for drm_bridge_remove() is also needed then. Moreover, since drm_bridge_add()
|
|
initializes &bridge->hpd_mutex, this may help those platform specific
|
|
dw-hdmi drivers(based on the component framework) avoid accessing the
|
|
uninitialized mutex in drm_bridge_hpd_notify() which is called in
|
|
dw_hdmi_irq(). Putting drm_bridge_add() in __dw_hdmi_probe() just before
|
|
it returns successfully should bring no logic change for platforms based
|
|
on the DRM bridge API, which is a good choice from safety point of view.
|
|
Also, __dw_hdmi_probe() is renamed to dw_hdmi_probe() since dw_hdmi_probe()
|
|
does nothing else but calling __dw_hdmi_probe(). Similar renaming applies
|
|
to the __dw_hdmi_remove()/dw_hdmi_remove() pair.
|
|
|
|
Fixes: ec971aaa6775 ("drm: bridge: dw-hdmi: Make connector creation optional")
|
|
Cc: Andrzej Hajda <a.hajda@samsung.com>
|
|
Cc: Neil Armstrong <narmstrong@baylibre.com>
|
|
Cc: Laurent Pinchart <Laurent.pinchart@ideasonboard.com>
|
|
Cc: Jonas Karlman <jonas@kwiboo.se>
|
|
Cc: Jernej Skrabec <jernej.skrabec@siol.net>
|
|
Cc: David Airlie <airlied@linux.ie>
|
|
Cc: Daniel Vetter <daniel@ffwll.ch>
|
|
Cc: Boris Brezillon <boris.brezillon@collabora.com>
|
|
Cc: Jerome Brunet <jbrunet@baylibre.com>
|
|
Cc: Cheng-Yi Chiang <cychiang@chromium.org>
|
|
Cc: Dariusz Marcinkiewicz <darekm@google.com>
|
|
Cc: Archit Taneja <architt@codeaurora.org>
|
|
Cc: Jose Abreu <joabreu@synopsys.com>
|
|
Cc: Sam Ravnborg <sam@ravnborg.org>
|
|
Cc: dri-devel@lists.freedesktop.org
|
|
Cc: NXP Linux Team <linux-imx@nxp.com>
|
|
Signed-off-by: Liu Ying <victor.liu@nxp.com>
|
|
Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
|
|
Link: https://patchwork.freedesktop.org/patch/msgid/1594260156-8316-2-git-send-email-victor.liu@nxp.com
|
|
(cherry picked from commit 0bf4f5b5d3972df7014df302b95b58b8de1a1e94)
|
|
---
|
|
drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 44 +++++++----------------
|
|
1 file changed, 13 insertions(+), 31 deletions(-)
|
|
|
|
diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
|
index 137b6ebfed19..748df1cacd2b 100644
|
|
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
|
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
|
@@ -3179,9 +3179,11 @@ static void dw_hdmi_init_hw(struct dw_hdmi *hdmi)
|
|
hdmi->phy.ops->setup_hpd(hdmi, hdmi->phy.data);
|
|
}
|
|
|
|
-static struct dw_hdmi *
|
|
-__dw_hdmi_probe(struct platform_device *pdev,
|
|
- const struct dw_hdmi_plat_data *plat_data)
|
|
+/* -----------------------------------------------------------------------------
|
|
+ * Probe/remove API, used from platforms based on the DRM bridge API.
|
|
+ */
|
|
+struct dw_hdmi *dw_hdmi_probe(struct platform_device *pdev,
|
|
+ const struct dw_hdmi_plat_data *plat_data)
|
|
{
|
|
struct device *dev = &pdev->dev;
|
|
struct device_node *np = dev->of_node;
|
|
@@ -3438,6 +3440,8 @@ __dw_hdmi_probe(struct platform_device *pdev,
|
|
hdmi->cec = platform_device_register_full(&pdevinfo);
|
|
}
|
|
|
|
+ drm_bridge_add(&hdmi->bridge);
|
|
+
|
|
return hdmi;
|
|
|
|
err_iahb:
|
|
@@ -3451,9 +3455,12 @@ __dw_hdmi_probe(struct platform_device *pdev,
|
|
|
|
return ERR_PTR(ret);
|
|
}
|
|
+EXPORT_SYMBOL_GPL(dw_hdmi_probe);
|
|
|
|
-static void __dw_hdmi_remove(struct dw_hdmi *hdmi)
|
|
+void dw_hdmi_remove(struct dw_hdmi *hdmi)
|
|
{
|
|
+ drm_bridge_remove(&hdmi->bridge);
|
|
+
|
|
if (hdmi->audio && !IS_ERR(hdmi->audio))
|
|
platform_device_unregister(hdmi->audio);
|
|
if (!IS_ERR(hdmi->cec))
|
|
@@ -3472,31 +3479,6 @@ static void __dw_hdmi_remove(struct dw_hdmi *hdmi)
|
|
else
|
|
i2c_put_adapter(hdmi->ddc);
|
|
}
|
|
-
|
|
-/* -----------------------------------------------------------------------------
|
|
- * Probe/remove API, used from platforms based on the DRM bridge API.
|
|
- */
|
|
-struct dw_hdmi *dw_hdmi_probe(struct platform_device *pdev,
|
|
- const struct dw_hdmi_plat_data *plat_data)
|
|
-{
|
|
- struct dw_hdmi *hdmi;
|
|
-
|
|
- hdmi = __dw_hdmi_probe(pdev, plat_data);
|
|
- if (IS_ERR(hdmi))
|
|
- return hdmi;
|
|
-
|
|
- drm_bridge_add(&hdmi->bridge);
|
|
-
|
|
- return hdmi;
|
|
-}
|
|
-EXPORT_SYMBOL_GPL(dw_hdmi_probe);
|
|
-
|
|
-void dw_hdmi_remove(struct dw_hdmi *hdmi)
|
|
-{
|
|
- drm_bridge_remove(&hdmi->bridge);
|
|
-
|
|
- __dw_hdmi_remove(hdmi);
|
|
-}
|
|
EXPORT_SYMBOL_GPL(dw_hdmi_remove);
|
|
|
|
/* -----------------------------------------------------------------------------
|
|
@@ -3509,7 +3491,7 @@ struct dw_hdmi *dw_hdmi_bind(struct platform_device *pdev,
|
|
struct dw_hdmi *hdmi;
|
|
int ret;
|
|
|
|
- hdmi = __dw_hdmi_probe(pdev, plat_data);
|
|
+ hdmi = dw_hdmi_probe(pdev, plat_data);
|
|
if (IS_ERR(hdmi))
|
|
return hdmi;
|
|
|
|
@@ -3526,7 +3508,7 @@ EXPORT_SYMBOL_GPL(dw_hdmi_bind);
|
|
|
|
void dw_hdmi_unbind(struct dw_hdmi *hdmi)
|
|
{
|
|
- __dw_hdmi_remove(hdmi);
|
|
+ dw_hdmi_remove(hdmi);
|
|
}
|
|
EXPORT_SYMBOL_GPL(dw_hdmi_unbind);
|
|
|
|
|
|
From d046fd09e47e5ea681fa9a0ba441eb493a8b5b14 Mon Sep 17 00:00:00 2001
|
|
From: Andrey Lebedev <andrey@lebedev.lt>
|
|
Date: Fri, 19 Jun 2020 10:58:59 +0300
|
|
Subject: [PATCH] drm/lima: Expose job_hang_limit module parameter
|
|
|
|
Some pp or gp jobs can be successfully repeated even after they time outs.
|
|
Introduce lima module parameter to specify number of times a job can hang
|
|
before being dropped.
|
|
|
|
Signed-off-by: Andrey Lebedev <andrey@lebedev.lt>
|
|
Signed-off-by: Qiang Yu <yuq825@gmail.com>
|
|
Link: https://patchwork.freedesktop.org/patch/msgid/20200619075900.3030696-1-andrey.lebedev@gmail.com
|
|
(cherry picked from commit de48984486d942d4f23e2b29374639f21042bdaa)
|
|
---
|
|
drivers/gpu/drm/lima/lima_drv.c | 4 ++++
|
|
drivers/gpu/drm/lima/lima_drv.h | 1 +
|
|
drivers/gpu/drm/lima/lima_sched.c | 5 +++--
|
|
3 files changed, 8 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/drivers/gpu/drm/lima/lima_drv.c b/drivers/gpu/drm/lima/lima_drv.c
|
|
index a831565af813..ab460121fd52 100644
|
|
--- a/drivers/gpu/drm/lima/lima_drv.c
|
|
+++ b/drivers/gpu/drm/lima/lima_drv.c
|
|
@@ -19,6 +19,7 @@
|
|
int lima_sched_timeout_ms;
|
|
uint lima_heap_init_nr_pages = 8;
|
|
uint lima_max_error_tasks;
|
|
+uint lima_job_hang_limit;
|
|
|
|
MODULE_PARM_DESC(sched_timeout_ms, "task run timeout in ms");
|
|
module_param_named(sched_timeout_ms, lima_sched_timeout_ms, int, 0444);
|
|
@@ -29,6 +30,9 @@ module_param_named(heap_init_nr_pages, lima_heap_init_nr_pages, uint, 0444);
|
|
MODULE_PARM_DESC(max_error_tasks, "max number of error tasks to save");
|
|
module_param_named(max_error_tasks, lima_max_error_tasks, uint, 0644);
|
|
|
|
+MODULE_PARM_DESC(job_hang_limit, "number of times to allow a job to hang before dropping it (default 0)");
|
|
+module_param_named(job_hang_limit, lima_job_hang_limit, uint, 0444);
|
|
+
|
|
static int lima_ioctl_get_param(struct drm_device *dev, void *data, struct drm_file *file)
|
|
{
|
|
struct drm_lima_get_param *args = data;
|
|
diff --git a/drivers/gpu/drm/lima/lima_drv.h b/drivers/gpu/drm/lima/lima_drv.h
|
|
index fdbd4077c768..c738d288547b 100644
|
|
--- a/drivers/gpu/drm/lima/lima_drv.h
|
|
+++ b/drivers/gpu/drm/lima/lima_drv.h
|
|
@@ -11,6 +11,7 @@
|
|
extern int lima_sched_timeout_ms;
|
|
extern uint lima_heap_init_nr_pages;
|
|
extern uint lima_max_error_tasks;
|
|
+extern uint lima_job_hang_limit;
|
|
|
|
struct lima_vm;
|
|
struct lima_bo;
|
|
diff --git a/drivers/gpu/drm/lima/lima_sched.c b/drivers/gpu/drm/lima/lima_sched.c
|
|
index e6cefda00279..1602985dfa04 100644
|
|
--- a/drivers/gpu/drm/lima/lima_sched.c
|
|
+++ b/drivers/gpu/drm/lima/lima_sched.c
|
|
@@ -503,8 +503,9 @@ int lima_sched_pipe_init(struct lima_sched_pipe *pipe, const char *name)
|
|
|
|
INIT_WORK(&pipe->recover_work, lima_sched_recover_work);
|
|
|
|
- return drm_sched_init(&pipe->base, &lima_sched_ops, 1, 0,
|
|
- msecs_to_jiffies(timeout), name);
|
|
+ return drm_sched_init(&pipe->base, &lima_sched_ops, 1,
|
|
+ lima_job_hang_limit, msecs_to_jiffies(timeout),
|
|
+ name);
|
|
}
|
|
|
|
void lima_sched_pipe_fini(struct lima_sched_pipe *pipe)
|