* [PATCH v4 1/4] drm/rockchip: vop: limit maximium resolution to hardware capabilities
@ 2023-02-07 8:44 ` Sascha Hauer
0 siblings, 0 replies; 24+ messages in thread
From: Sascha Hauer @ 2023-02-07 8:44 UTC (permalink / raw)
To: dri-devel
Cc: Dan Johansen, Sascha Hauer, Sandy Huang, linux-rockchip,
FUKAUMI Naoki, Michael Riesch, kernel, Robin Murphy
The different VOP variants support different maximum resolutions. Reject
resolutions that are not supported by a specific variant.
This hasn't been a problem in the upstream driver so far as 1920x1080
has been the maximum resolution supported by the HDMI driver and that
resolution is supported by all VOP variants. Now with higher resolutions
supported in the HDMI driver we have to limit the resolutions to the
ones supported by the VOP.
The actual maximum resolutions are taken from the Rockchip downstream
Kernel.
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
Notes:
Changes since v3:
- new patch
drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 15 ++++++++++
drivers/gpu/drm/rockchip/rockchip_drm_vop.h | 2 ++
drivers/gpu/drm/rockchip/rockchip_vop_reg.c | 31 +++++++++++++++++++++
3 files changed, 48 insertions(+)
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
index fa1f4ee6d1950..96b6bd8d17803 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
@@ -1174,6 +1174,20 @@ static void vop_crtc_disable_vblank(struct drm_crtc *crtc)
spin_unlock_irqrestore(&vop->irq_lock, flags);
}
+static enum drm_mode_status vop_crtc_mode_valid(struct drm_crtc *crtc,
+ const struct drm_display_mode *mode)
+{
+ struct vop *vop = to_vop(crtc);
+
+ if (vop->data->max_xres && mode->hdisplay > vop->data->max_xres)
+ return MODE_BAD_HVALUE;
+
+ if (vop->data->max_yres && mode->vdisplay > vop->data->max_yres)
+ return MODE_BAD_VVALUE;
+
+ return MODE_OK;
+}
+
static bool vop_crtc_mode_fixup(struct drm_crtc *crtc,
const struct drm_display_mode *mode,
struct drm_display_mode *adjusted_mode)
@@ -1585,6 +1599,7 @@ static void vop_crtc_atomic_flush(struct drm_crtc *crtc,
}
static const struct drm_crtc_helper_funcs vop_crtc_helper_funcs = {
+ .mode_valid = vop_crtc_mode_valid,
.mode_fixup = vop_crtc_mode_fixup,
.atomic_check = vop_crtc_atomic_check,
.atomic_begin = vop_crtc_atomic_begin,
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
index 8502849833d93..5c4875ca3f270 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
@@ -225,6 +225,8 @@ struct vop_data {
const struct vop_win_data *win;
unsigned int win_size;
unsigned int lut_size;
+ unsigned int max_xres;
+ unsigned int max_yres;
#define VOP_FEATURE_OUTPUT_RGB10 BIT(0)
#define VOP_FEATURE_INTERNAL_RGB BIT(1)
diff --git a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c
index 014f99e8928e3..dc1a703d9d1a8 100644
--- a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c
+++ b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c
@@ -181,6 +181,8 @@ static const struct vop_data rk3036_vop = {
.output = &rk3036_output,
.win = rk3036_vop_win_data,
.win_size = ARRAY_SIZE(rk3036_vop_win_data),
+ .max_xres = 1920,
+ .max_yres = 1080,
};
static const struct vop_win_phy rk3126_win1_data = {
@@ -213,6 +215,8 @@ static const struct vop_data rk3126_vop = {
.output = &rk3036_output,
.win = rk3126_vop_win_data,
.win_size = ARRAY_SIZE(rk3126_vop_win_data),
+ .max_xres = 1920,
+ .max_yres = 1080,
};
static const int px30_vop_intrs[] = {
@@ -340,6 +344,8 @@ static const struct vop_data px30_vop_big = {
.output = &px30_output,
.win = px30_vop_big_win_data,
.win_size = ARRAY_SIZE(px30_vop_big_win_data),
+ .max_xres = 1920,
+ .max_yres = 1080,
};
static const struct vop_win_data px30_vop_lit_win_data[] = {
@@ -356,6 +362,8 @@ static const struct vop_data px30_vop_lit = {
.output = &px30_output,
.win = px30_vop_lit_win_data,
.win_size = ARRAY_SIZE(px30_vop_lit_win_data),
+ .max_xres = 1920,
+ .max_yres = 1080,
};
static const struct vop_scl_regs rk3066_win_scl = {
@@ -479,6 +487,8 @@ static const struct vop_data rk3066_vop = {
.output = &rk3066_output,
.win = rk3066_vop_win_data,
.win_size = ARRAY_SIZE(rk3066_vop_win_data),
+ .max_xres = 1920,
+ .max_yres = 1080,
};
static const struct vop_scl_regs rk3188_win_scl = {
@@ -585,6 +595,8 @@ static const struct vop_data rk3188_vop = {
.win = rk3188_vop_win_data,
.win_size = ARRAY_SIZE(rk3188_vop_win_data),
.feature = VOP_FEATURE_INTERNAL_RGB,
+ .max_xres = 2048,
+ .max_yres = 1536,
};
static const struct vop_scl_extension rk3288_win_full_scl_ext = {
@@ -732,6 +744,13 @@ static const struct vop_data rk3288_vop = {
.win = rk3288_vop_win_data,
.win_size = ARRAY_SIZE(rk3288_vop_win_data),
.lut_size = 1024,
+ /*
+ * This is the maximum resolution for the VOPB, the VOPL can only do
+ * 2560x1600, but we can't distinguish them as they have the same
+ * compatible.
+ */
+ .max_xres = 3840,
+ .max_yres = 2160,
};
static const int rk3368_vop_intrs[] = {
@@ -833,6 +852,8 @@ static const struct vop_data rk3368_vop = {
.misc = &rk3368_misc,
.win = rk3368_vop_win_data,
.win_size = ARRAY_SIZE(rk3368_vop_win_data),
+ .max_xres = 4096,
+ .max_yres = 2160,
};
static const struct vop_intr rk3366_vop_intr = {
@@ -854,6 +875,8 @@ static const struct vop_data rk3366_vop = {
.misc = &rk3368_misc,
.win = rk3368_vop_win_data,
.win_size = ARRAY_SIZE(rk3368_vop_win_data),
+ .max_xres = 4096,
+ .max_yres = 2160,
};
static const struct vop_output rk3399_output = {
@@ -984,6 +1007,8 @@ static const struct vop_data rk3399_vop_big = {
.win_size = ARRAY_SIZE(rk3399_vop_win_data),
.win_yuv2yuv = rk3399_vop_big_win_yuv2yuv_data,
.lut_size = 1024,
+ .max_xres = 4096,
+ .max_yres = 2160,
};
static const struct vop_win_data rk3399_vop_lit_win_data[] = {
@@ -1010,6 +1035,8 @@ static const struct vop_data rk3399_vop_lit = {
.win_size = ARRAY_SIZE(rk3399_vop_lit_win_data),
.win_yuv2yuv = rk3399_vop_lit_win_yuv2yuv_data,
.lut_size = 256,
+ .max_xres = 2560,
+ .max_yres = 1600,
};
static const struct vop_win_data rk3228_vop_win_data[] = {
@@ -1029,6 +1056,8 @@ static const struct vop_data rk3228_vop = {
.misc = &rk3368_misc,
.win = rk3228_vop_win_data,
.win_size = ARRAY_SIZE(rk3228_vop_win_data),
+ .max_xres = 4096,
+ .max_yres = 2160,
};
static const struct vop_modeset rk3328_modeset = {
@@ -1100,6 +1129,8 @@ static const struct vop_data rk3328_vop = {
.misc = &rk3328_misc,
.win = rk3328_vop_win_data,
.win_size = ARRAY_SIZE(rk3328_vop_win_data),
+ .max_xres = 4096,
+ .max_yres = 2160,
};
static const struct of_device_id vop_driver_dt_match[] = {
--
2.30.2
^ permalink raw reply related [flat|nested] 24+ messages in thread
* Re: [PATCH v4 1/4] drm/rockchip: vop: limit maximium resolution to hardware capabilities
2023-02-07 8:44 ` Sascha Hauer
@ 2023-02-07 9:16 ` Dan Johansen
-1 siblings, 0 replies; 24+ messages in thread
From: Dan Johansen @ 2023-02-07 9:16 UTC (permalink / raw)
To: Sascha Hauer, dri-devel
Cc: Sandy Huang, linux-rockchip, Michael Riesch, kernel,
Robin Murphy, FUKAUMI Naoki
Den 07.02.2023 kl. 09.44 skrev Sascha Hauer:
> The different VOP variants support different maximum resolutions. Reject
> resolutions that are not supported by a specific variant.
>
> This hasn't been a problem in the upstream driver so far as 1920x1080
> has been the maximum resolution supported by the HDMI driver and that
> resolution is supported by all VOP variants. Now with higher resolutions
> supported in the HDMI driver we have to limit the resolutions to the
> ones supported by the VOP.
>
> The actual maximum resolutions are taken from the Rockchip downstream
> Kernel.
So just so I understand it, this will allow only up to 1080p on rk3399
or will it change something that allows higher resolutions, but with
lower clock/pixel rates?
Thank you.
>
> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
> ---
>
> Notes:
> Changes since v3:
> - new patch
>
> drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 15 ++++++++++
> drivers/gpu/drm/rockchip/rockchip_drm_vop.h | 2 ++
> drivers/gpu/drm/rockchip/rockchip_vop_reg.c | 31 +++++++++++++++++++++
> 3 files changed, 48 insertions(+)
>
> diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
> index fa1f4ee6d1950..96b6bd8d17803 100644
> --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
> +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
> @@ -1174,6 +1174,20 @@ static void vop_crtc_disable_vblank(struct drm_crtc *crtc)
> spin_unlock_irqrestore(&vop->irq_lock, flags);
> }
>
> +static enum drm_mode_status vop_crtc_mode_valid(struct drm_crtc *crtc,
> + const struct drm_display_mode *mode)
> +{
> + struct vop *vop = to_vop(crtc);
> +
> + if (vop->data->max_xres && mode->hdisplay > vop->data->max_xres)
> + return MODE_BAD_HVALUE;
> +
> + if (vop->data->max_yres && mode->vdisplay > vop->data->max_yres)
> + return MODE_BAD_VVALUE;
> +
> + return MODE_OK;
> +}
> +
> static bool vop_crtc_mode_fixup(struct drm_crtc *crtc,
> const struct drm_display_mode *mode,
> struct drm_display_mode *adjusted_mode)
> @@ -1585,6 +1599,7 @@ static void vop_crtc_atomic_flush(struct drm_crtc *crtc,
> }
>
> static const struct drm_crtc_helper_funcs vop_crtc_helper_funcs = {
> + .mode_valid = vop_crtc_mode_valid,
> .mode_fixup = vop_crtc_mode_fixup,
> .atomic_check = vop_crtc_atomic_check,
> .atomic_begin = vop_crtc_atomic_begin,
> diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
> index 8502849833d93..5c4875ca3f270 100644
> --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
> +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
> @@ -225,6 +225,8 @@ struct vop_data {
> const struct vop_win_data *win;
> unsigned int win_size;
> unsigned int lut_size;
> + unsigned int max_xres;
> + unsigned int max_yres;
>
> #define VOP_FEATURE_OUTPUT_RGB10 BIT(0)
> #define VOP_FEATURE_INTERNAL_RGB BIT(1)
> diff --git a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c
> index 014f99e8928e3..dc1a703d9d1a8 100644
> --- a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c
> +++ b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c
> @@ -181,6 +181,8 @@ static const struct vop_data rk3036_vop = {
> .output = &rk3036_output,
> .win = rk3036_vop_win_data,
> .win_size = ARRAY_SIZE(rk3036_vop_win_data),
> + .max_xres = 1920,
> + .max_yres = 1080,
> };
>
> static const struct vop_win_phy rk3126_win1_data = {
> @@ -213,6 +215,8 @@ static const struct vop_data rk3126_vop = {
> .output = &rk3036_output,
> .win = rk3126_vop_win_data,
> .win_size = ARRAY_SIZE(rk3126_vop_win_data),
> + .max_xres = 1920,
> + .max_yres = 1080,
> };
>
> static const int px30_vop_intrs[] = {
> @@ -340,6 +344,8 @@ static const struct vop_data px30_vop_big = {
> .output = &px30_output,
> .win = px30_vop_big_win_data,
> .win_size = ARRAY_SIZE(px30_vop_big_win_data),
> + .max_xres = 1920,
> + .max_yres = 1080,
> };
>
> static const struct vop_win_data px30_vop_lit_win_data[] = {
> @@ -356,6 +362,8 @@ static const struct vop_data px30_vop_lit = {
> .output = &px30_output,
> .win = px30_vop_lit_win_data,
> .win_size = ARRAY_SIZE(px30_vop_lit_win_data),
> + .max_xres = 1920,
> + .max_yres = 1080,
> };
>
> static const struct vop_scl_regs rk3066_win_scl = {
> @@ -479,6 +487,8 @@ static const struct vop_data rk3066_vop = {
> .output = &rk3066_output,
> .win = rk3066_vop_win_data,
> .win_size = ARRAY_SIZE(rk3066_vop_win_data),
> + .max_xres = 1920,
> + .max_yres = 1080,
> };
>
> static const struct vop_scl_regs rk3188_win_scl = {
> @@ -585,6 +595,8 @@ static const struct vop_data rk3188_vop = {
> .win = rk3188_vop_win_data,
> .win_size = ARRAY_SIZE(rk3188_vop_win_data),
> .feature = VOP_FEATURE_INTERNAL_RGB,
> + .max_xres = 2048,
> + .max_yres = 1536,
> };
>
> static const struct vop_scl_extension rk3288_win_full_scl_ext = {
> @@ -732,6 +744,13 @@ static const struct vop_data rk3288_vop = {
> .win = rk3288_vop_win_data,
> .win_size = ARRAY_SIZE(rk3288_vop_win_data),
> .lut_size = 1024,
> + /*
> + * This is the maximum resolution for the VOPB, the VOPL can only do
> + * 2560x1600, but we can't distinguish them as they have the same
> + * compatible.
> + */
> + .max_xres = 3840,
> + .max_yres = 2160,
> };
>
> static const int rk3368_vop_intrs[] = {
> @@ -833,6 +852,8 @@ static const struct vop_data rk3368_vop = {
> .misc = &rk3368_misc,
> .win = rk3368_vop_win_data,
> .win_size = ARRAY_SIZE(rk3368_vop_win_data),
> + .max_xres = 4096,
> + .max_yres = 2160,
> };
>
> static const struct vop_intr rk3366_vop_intr = {
> @@ -854,6 +875,8 @@ static const struct vop_data rk3366_vop = {
> .misc = &rk3368_misc,
> .win = rk3368_vop_win_data,
> .win_size = ARRAY_SIZE(rk3368_vop_win_data),
> + .max_xres = 4096,
> + .max_yres = 2160,
> };
>
> static const struct vop_output rk3399_output = {
> @@ -984,6 +1007,8 @@ static const struct vop_data rk3399_vop_big = {
> .win_size = ARRAY_SIZE(rk3399_vop_win_data),
> .win_yuv2yuv = rk3399_vop_big_win_yuv2yuv_data,
> .lut_size = 1024,
> + .max_xres = 4096,
> + .max_yres = 2160,
> };
>
> static const struct vop_win_data rk3399_vop_lit_win_data[] = {
> @@ -1010,6 +1035,8 @@ static const struct vop_data rk3399_vop_lit = {
> .win_size = ARRAY_SIZE(rk3399_vop_lit_win_data),
> .win_yuv2yuv = rk3399_vop_lit_win_yuv2yuv_data,
> .lut_size = 256,
> + .max_xres = 2560,
> + .max_yres = 1600,
> };
>
> static const struct vop_win_data rk3228_vop_win_data[] = {
> @@ -1029,6 +1056,8 @@ static const struct vop_data rk3228_vop = {
> .misc = &rk3368_misc,
> .win = rk3228_vop_win_data,
> .win_size = ARRAY_SIZE(rk3228_vop_win_data),
> + .max_xres = 4096,
> + .max_yres = 2160,
> };
>
> static const struct vop_modeset rk3328_modeset = {
> @@ -1100,6 +1129,8 @@ static const struct vop_data rk3328_vop = {
> .misc = &rk3328_misc,
> .win = rk3328_vop_win_data,
> .win_size = ARRAY_SIZE(rk3328_vop_win_data),
> + .max_xres = 4096,
> + .max_yres = 2160,
> };
>
> static const struct of_device_id vop_driver_dt_match[] = {
--
Kind regards
*Dan Johansen*
Project lead of the *Manjaro ARM* project
Manjaro-ARM <https://manjaro.org>
_______________________________________________
Linux-rockchip mailing list
Linux-rockchip@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-rockchip
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH v4 1/4] drm/rockchip: vop: limit maximium resolution to hardware capabilities
@ 2023-02-07 9:16 ` Dan Johansen
0 siblings, 0 replies; 24+ messages in thread
From: Dan Johansen @ 2023-02-07 9:16 UTC (permalink / raw)
To: Sascha Hauer, dri-devel
Cc: Sandy Huang, linux-rockchip, FUKAUMI Naoki, Michael Riesch,
kernel, Robin Murphy
Den 07.02.2023 kl. 09.44 skrev Sascha Hauer:
> The different VOP variants support different maximum resolutions. Reject
> resolutions that are not supported by a specific variant.
>
> This hasn't been a problem in the upstream driver so far as 1920x1080
> has been the maximum resolution supported by the HDMI driver and that
> resolution is supported by all VOP variants. Now with higher resolutions
> supported in the HDMI driver we have to limit the resolutions to the
> ones supported by the VOP.
>
> The actual maximum resolutions are taken from the Rockchip downstream
> Kernel.
So just so I understand it, this will allow only up to 1080p on rk3399
or will it change something that allows higher resolutions, but with
lower clock/pixel rates?
Thank you.
>
> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
> ---
>
> Notes:
> Changes since v3:
> - new patch
>
> drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 15 ++++++++++
> drivers/gpu/drm/rockchip/rockchip_drm_vop.h | 2 ++
> drivers/gpu/drm/rockchip/rockchip_vop_reg.c | 31 +++++++++++++++++++++
> 3 files changed, 48 insertions(+)
>
> diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
> index fa1f4ee6d1950..96b6bd8d17803 100644
> --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
> +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
> @@ -1174,6 +1174,20 @@ static void vop_crtc_disable_vblank(struct drm_crtc *crtc)
> spin_unlock_irqrestore(&vop->irq_lock, flags);
> }
>
> +static enum drm_mode_status vop_crtc_mode_valid(struct drm_crtc *crtc,
> + const struct drm_display_mode *mode)
> +{
> + struct vop *vop = to_vop(crtc);
> +
> + if (vop->data->max_xres && mode->hdisplay > vop->data->max_xres)
> + return MODE_BAD_HVALUE;
> +
> + if (vop->data->max_yres && mode->vdisplay > vop->data->max_yres)
> + return MODE_BAD_VVALUE;
> +
> + return MODE_OK;
> +}
> +
> static bool vop_crtc_mode_fixup(struct drm_crtc *crtc,
> const struct drm_display_mode *mode,
> struct drm_display_mode *adjusted_mode)
> @@ -1585,6 +1599,7 @@ static void vop_crtc_atomic_flush(struct drm_crtc *crtc,
> }
>
> static const struct drm_crtc_helper_funcs vop_crtc_helper_funcs = {
> + .mode_valid = vop_crtc_mode_valid,
> .mode_fixup = vop_crtc_mode_fixup,
> .atomic_check = vop_crtc_atomic_check,
> .atomic_begin = vop_crtc_atomic_begin,
> diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
> index 8502849833d93..5c4875ca3f270 100644
> --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
> +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
> @@ -225,6 +225,8 @@ struct vop_data {
> const struct vop_win_data *win;
> unsigned int win_size;
> unsigned int lut_size;
> + unsigned int max_xres;
> + unsigned int max_yres;
>
> #define VOP_FEATURE_OUTPUT_RGB10 BIT(0)
> #define VOP_FEATURE_INTERNAL_RGB BIT(1)
> diff --git a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c
> index 014f99e8928e3..dc1a703d9d1a8 100644
> --- a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c
> +++ b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c
> @@ -181,6 +181,8 @@ static const struct vop_data rk3036_vop = {
> .output = &rk3036_output,
> .win = rk3036_vop_win_data,
> .win_size = ARRAY_SIZE(rk3036_vop_win_data),
> + .max_xres = 1920,
> + .max_yres = 1080,
> };
>
> static const struct vop_win_phy rk3126_win1_data = {
> @@ -213,6 +215,8 @@ static const struct vop_data rk3126_vop = {
> .output = &rk3036_output,
> .win = rk3126_vop_win_data,
> .win_size = ARRAY_SIZE(rk3126_vop_win_data),
> + .max_xres = 1920,
> + .max_yres = 1080,
> };
>
> static const int px30_vop_intrs[] = {
> @@ -340,6 +344,8 @@ static const struct vop_data px30_vop_big = {
> .output = &px30_output,
> .win = px30_vop_big_win_data,
> .win_size = ARRAY_SIZE(px30_vop_big_win_data),
> + .max_xres = 1920,
> + .max_yres = 1080,
> };
>
> static const struct vop_win_data px30_vop_lit_win_data[] = {
> @@ -356,6 +362,8 @@ static const struct vop_data px30_vop_lit = {
> .output = &px30_output,
> .win = px30_vop_lit_win_data,
> .win_size = ARRAY_SIZE(px30_vop_lit_win_data),
> + .max_xres = 1920,
> + .max_yres = 1080,
> };
>
> static const struct vop_scl_regs rk3066_win_scl = {
> @@ -479,6 +487,8 @@ static const struct vop_data rk3066_vop = {
> .output = &rk3066_output,
> .win = rk3066_vop_win_data,
> .win_size = ARRAY_SIZE(rk3066_vop_win_data),
> + .max_xres = 1920,
> + .max_yres = 1080,
> };
>
> static const struct vop_scl_regs rk3188_win_scl = {
> @@ -585,6 +595,8 @@ static const struct vop_data rk3188_vop = {
> .win = rk3188_vop_win_data,
> .win_size = ARRAY_SIZE(rk3188_vop_win_data),
> .feature = VOP_FEATURE_INTERNAL_RGB,
> + .max_xres = 2048,
> + .max_yres = 1536,
> };
>
> static const struct vop_scl_extension rk3288_win_full_scl_ext = {
> @@ -732,6 +744,13 @@ static const struct vop_data rk3288_vop = {
> .win = rk3288_vop_win_data,
> .win_size = ARRAY_SIZE(rk3288_vop_win_data),
> .lut_size = 1024,
> + /*
> + * This is the maximum resolution for the VOPB, the VOPL can only do
> + * 2560x1600, but we can't distinguish them as they have the same
> + * compatible.
> + */
> + .max_xres = 3840,
> + .max_yres = 2160,
> };
>
> static const int rk3368_vop_intrs[] = {
> @@ -833,6 +852,8 @@ static const struct vop_data rk3368_vop = {
> .misc = &rk3368_misc,
> .win = rk3368_vop_win_data,
> .win_size = ARRAY_SIZE(rk3368_vop_win_data),
> + .max_xres = 4096,
> + .max_yres = 2160,
> };
>
> static const struct vop_intr rk3366_vop_intr = {
> @@ -854,6 +875,8 @@ static const struct vop_data rk3366_vop = {
> .misc = &rk3368_misc,
> .win = rk3368_vop_win_data,
> .win_size = ARRAY_SIZE(rk3368_vop_win_data),
> + .max_xres = 4096,
> + .max_yres = 2160,
> };
>
> static const struct vop_output rk3399_output = {
> @@ -984,6 +1007,8 @@ static const struct vop_data rk3399_vop_big = {
> .win_size = ARRAY_SIZE(rk3399_vop_win_data),
> .win_yuv2yuv = rk3399_vop_big_win_yuv2yuv_data,
> .lut_size = 1024,
> + .max_xres = 4096,
> + .max_yres = 2160,
> };
>
> static const struct vop_win_data rk3399_vop_lit_win_data[] = {
> @@ -1010,6 +1035,8 @@ static const struct vop_data rk3399_vop_lit = {
> .win_size = ARRAY_SIZE(rk3399_vop_lit_win_data),
> .win_yuv2yuv = rk3399_vop_lit_win_yuv2yuv_data,
> .lut_size = 256,
> + .max_xres = 2560,
> + .max_yres = 1600,
> };
>
> static const struct vop_win_data rk3228_vop_win_data[] = {
> @@ -1029,6 +1056,8 @@ static const struct vop_data rk3228_vop = {
> .misc = &rk3368_misc,
> .win = rk3228_vop_win_data,
> .win_size = ARRAY_SIZE(rk3228_vop_win_data),
> + .max_xres = 4096,
> + .max_yres = 2160,
> };
>
> static const struct vop_modeset rk3328_modeset = {
> @@ -1100,6 +1129,8 @@ static const struct vop_data rk3328_vop = {
> .misc = &rk3328_misc,
> .win = rk3328_vop_win_data,
> .win_size = ARRAY_SIZE(rk3328_vop_win_data),
> + .max_xres = 4096,
> + .max_yres = 2160,
> };
>
> static const struct of_device_id vop_driver_dt_match[] = {
--
Kind regards
*Dan Johansen*
Project lead of the *Manjaro ARM* project
Manjaro-ARM <https://manjaro.org>
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH v4 1/4] drm/rockchip: vop: limit maximium resolution to hardware capabilities
2023-02-07 9:16 ` Dan Johansen
@ 2023-02-07 9:40 ` Sascha Hauer
-1 siblings, 0 replies; 24+ messages in thread
From: Sascha Hauer @ 2023-02-07 9:40 UTC (permalink / raw)
To: Dan Johansen
Cc: dri-devel, Sandy Huang, linux-rockchip, Michael Riesch, kernel,
Robin Murphy, FUKAUMI Naoki
On Tue, Feb 07, 2023 at 10:16:57AM +0100, Dan Johansen wrote:
>
> Den 07.02.2023 kl. 09.44 skrev Sascha Hauer:
> > The different VOP variants support different maximum resolutions. Reject
> > resolutions that are not supported by a specific variant.
> >
> > This hasn't been a problem in the upstream driver so far as 1920x1080
> > has been the maximum resolution supported by the HDMI driver and that
> > resolution is supported by all VOP variants. Now with higher resolutions
> > supported in the HDMI driver we have to limit the resolutions to the
> > ones supported by the VOP.
> >
> > The actual maximum resolutions are taken from the Rockchip downstream
> > Kernel.
>
> So just so I understand it, this will allow only up to 1080p on rk3399 or
> will it change something that allows higher resolutions, but with lower
> clock/pixel rates?
This patch is not about bandwidth limitations, only limitations in the
maximum resolution.
The RK3399 has two VOPs, VOPB and VOPL. The latter can only do 1080p
whereas the former can do up to 4k@30. This patch limits the allowed
resolutions to what the VOP can do. So when your application chooses
VOPB you should see 4k@30 as long as your monitor supports it.
In my testing weston has chosen VOPB and thus shows 4k@30, but I can't
tell if it does so because weston is smart enough, or just happens to
default to the VOPB.
Sascha
--
Pengutronix e.K. | |
Steuerwalder Str. 21 | http://www.pengutronix.de/ |
31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
_______________________________________________
Linux-rockchip mailing list
Linux-rockchip@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-rockchip
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH v4 1/4] drm/rockchip: vop: limit maximium resolution to hardware capabilities
@ 2023-02-07 9:40 ` Sascha Hauer
0 siblings, 0 replies; 24+ messages in thread
From: Sascha Hauer @ 2023-02-07 9:40 UTC (permalink / raw)
To: Dan Johansen
Cc: Sandy Huang, dri-devel, linux-rockchip, FUKAUMI Naoki,
Michael Riesch, kernel, Robin Murphy
On Tue, Feb 07, 2023 at 10:16:57AM +0100, Dan Johansen wrote:
>
> Den 07.02.2023 kl. 09.44 skrev Sascha Hauer:
> > The different VOP variants support different maximum resolutions. Reject
> > resolutions that are not supported by a specific variant.
> >
> > This hasn't been a problem in the upstream driver so far as 1920x1080
> > has been the maximum resolution supported by the HDMI driver and that
> > resolution is supported by all VOP variants. Now with higher resolutions
> > supported in the HDMI driver we have to limit the resolutions to the
> > ones supported by the VOP.
> >
> > The actual maximum resolutions are taken from the Rockchip downstream
> > Kernel.
>
> So just so I understand it, this will allow only up to 1080p on rk3399 or
> will it change something that allows higher resolutions, but with lower
> clock/pixel rates?
This patch is not about bandwidth limitations, only limitations in the
maximum resolution.
The RK3399 has two VOPs, VOPB and VOPL. The latter can only do 1080p
whereas the former can do up to 4k@30. This patch limits the allowed
resolutions to what the VOP can do. So when your application chooses
VOPB you should see 4k@30 as long as your monitor supports it.
In my testing weston has chosen VOPB and thus shows 4k@30, but I can't
tell if it does so because weston is smart enough, or just happens to
default to the VOPB.
Sascha
--
Pengutronix e.K. | |
Steuerwalder Str. 21 | http://www.pengutronix.de/ |
31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH v4 1/4] drm/rockchip: vop: limit maximium resolution to hardware capabilities
2023-02-07 8:44 ` Sascha Hauer
@ 2023-02-07 10:46 ` Jonas Karlman
-1 siblings, 0 replies; 24+ messages in thread
From: Jonas Karlman @ 2023-02-07 10:46 UTC (permalink / raw)
To: Sascha Hauer, dri-devel
Cc: Dan Johansen, Sandy Huang, linux-rockchip, FUKAUMI Naoki,
Michael Riesch, kernel, Robin Murphy
Hi Sascha,
On 2023-02-07 09:44, Sascha Hauer wrote:
> The different VOP variants support different maximum resolutions. Reject
> resolutions that are not supported by a specific variant.
>
> This hasn't been a problem in the upstream driver so far as 1920x1080
> has been the maximum resolution supported by the HDMI driver and that
> resolution is supported by all VOP variants. Now with higher resolutions
> supported in the HDMI driver we have to limit the resolutions to the
> ones supported by the VOP.
>
> The actual maximum resolutions are taken from the Rockchip downstream
> Kernel.
>
> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
> ---
>
> Notes:
> Changes since v3:
> - new patch
>
> drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 15 ++++++++++
> drivers/gpu/drm/rockchip/rockchip_drm_vop.h | 2 ++
> drivers/gpu/drm/rockchip/rockchip_vop_reg.c | 31 +++++++++++++++++++++
> 3 files changed, 48 insertions(+)
>
> diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
> index fa1f4ee6d1950..96b6bd8d17803 100644
> --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
> +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
> @@ -1174,6 +1174,20 @@ static void vop_crtc_disable_vblank(struct drm_crtc *crtc)
> spin_unlock_irqrestore(&vop->irq_lock, flags);
> }
>
> +static enum drm_mode_status vop_crtc_mode_valid(struct drm_crtc *crtc,
> + const struct drm_display_mode *mode)
> +{
> + struct vop *vop = to_vop(crtc);
> +
> + if (vop->data->max_xres && mode->hdisplay > vop->data->max_xres)
> + return MODE_BAD_HVALUE;
> +
> + if (vop->data->max_yres && mode->vdisplay > vop->data->max_yres)
> + return MODE_BAD_VVALUE;
> +
> + return MODE_OK;
> +}
> +
> static bool vop_crtc_mode_fixup(struct drm_crtc *crtc,
> const struct drm_display_mode *mode,
> struct drm_display_mode *adjusted_mode)
> @@ -1585,6 +1599,7 @@ static void vop_crtc_atomic_flush(struct drm_crtc *crtc,
> }
>
> static const struct drm_crtc_helper_funcs vop_crtc_helper_funcs = {
> + .mode_valid = vop_crtc_mode_valid,
> .mode_fixup = vop_crtc_mode_fixup,
> .atomic_check = vop_crtc_atomic_check,
> .atomic_begin = vop_crtc_atomic_begin,
> diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
> index 8502849833d93..5c4875ca3f270 100644
> --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
> +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
> @@ -225,6 +225,8 @@ struct vop_data {
> const struct vop_win_data *win;
> unsigned int win_size;
> unsigned int lut_size;
> + unsigned int max_xres;
> + unsigned int max_yres;
I would suggest using the same struct vop_rect max_input/output as the
vop2 driver instead of handling this differently between the two.
Regards,
Jonas
>
> #define VOP_FEATURE_OUTPUT_RGB10 BIT(0)
> #define VOP_FEATURE_INTERNAL_RGB BIT(1)
> diff --git a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c
> index 014f99e8928e3..dc1a703d9d1a8 100644
> --- a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c
> +++ b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c
> @@ -181,6 +181,8 @@ static const struct vop_data rk3036_vop = {
> .output = &rk3036_output,
> .win = rk3036_vop_win_data,
> .win_size = ARRAY_SIZE(rk3036_vop_win_data),
> + .max_xres = 1920,
> + .max_yres = 1080,
> };
>
> static const struct vop_win_phy rk3126_win1_data = {
> @@ -213,6 +215,8 @@ static const struct vop_data rk3126_vop = {
> .output = &rk3036_output,
> .win = rk3126_vop_win_data,
> .win_size = ARRAY_SIZE(rk3126_vop_win_data),
> + .max_xres = 1920,
> + .max_yres = 1080,
> };
>
> static const int px30_vop_intrs[] = {
> @@ -340,6 +344,8 @@ static const struct vop_data px30_vop_big = {
> .output = &px30_output,
> .win = px30_vop_big_win_data,
> .win_size = ARRAY_SIZE(px30_vop_big_win_data),
> + .max_xres = 1920,
> + .max_yres = 1080,
> };
>
> static const struct vop_win_data px30_vop_lit_win_data[] = {
> @@ -356,6 +362,8 @@ static const struct vop_data px30_vop_lit = {
> .output = &px30_output,
> .win = px30_vop_lit_win_data,
> .win_size = ARRAY_SIZE(px30_vop_lit_win_data),
> + .max_xres = 1920,
> + .max_yres = 1080,
> };
>
> static const struct vop_scl_regs rk3066_win_scl = {
> @@ -479,6 +487,8 @@ static const struct vop_data rk3066_vop = {
> .output = &rk3066_output,
> .win = rk3066_vop_win_data,
> .win_size = ARRAY_SIZE(rk3066_vop_win_data),
> + .max_xres = 1920,
> + .max_yres = 1080,
> };
>
> static const struct vop_scl_regs rk3188_win_scl = {
> @@ -585,6 +595,8 @@ static const struct vop_data rk3188_vop = {
> .win = rk3188_vop_win_data,
> .win_size = ARRAY_SIZE(rk3188_vop_win_data),
> .feature = VOP_FEATURE_INTERNAL_RGB,
> + .max_xres = 2048,
> + .max_yres = 1536,
> };
>
> static const struct vop_scl_extension rk3288_win_full_scl_ext = {
> @@ -732,6 +744,13 @@ static const struct vop_data rk3288_vop = {
> .win = rk3288_vop_win_data,
> .win_size = ARRAY_SIZE(rk3288_vop_win_data),
> .lut_size = 1024,
> + /*
> + * This is the maximum resolution for the VOPB, the VOPL can only do
> + * 2560x1600, but we can't distinguish them as they have the same
> + * compatible.
> + */
> + .max_xres = 3840,
> + .max_yres = 2160,
> };
>
> static const int rk3368_vop_intrs[] = {
> @@ -833,6 +852,8 @@ static const struct vop_data rk3368_vop = {
> .misc = &rk3368_misc,
> .win = rk3368_vop_win_data,
> .win_size = ARRAY_SIZE(rk3368_vop_win_data),
> + .max_xres = 4096,
> + .max_yres = 2160,
> };
>
> static const struct vop_intr rk3366_vop_intr = {
> @@ -854,6 +875,8 @@ static const struct vop_data rk3366_vop = {
> .misc = &rk3368_misc,
> .win = rk3368_vop_win_data,
> .win_size = ARRAY_SIZE(rk3368_vop_win_data),
> + .max_xres = 4096,
> + .max_yres = 2160,
> };
>
> static const struct vop_output rk3399_output = {
> @@ -984,6 +1007,8 @@ static const struct vop_data rk3399_vop_big = {
> .win_size = ARRAY_SIZE(rk3399_vop_win_data),
> .win_yuv2yuv = rk3399_vop_big_win_yuv2yuv_data,
> .lut_size = 1024,
> + .max_xres = 4096,
> + .max_yres = 2160,
> };
>
> static const struct vop_win_data rk3399_vop_lit_win_data[] = {
> @@ -1010,6 +1035,8 @@ static const struct vop_data rk3399_vop_lit = {
> .win_size = ARRAY_SIZE(rk3399_vop_lit_win_data),
> .win_yuv2yuv = rk3399_vop_lit_win_yuv2yuv_data,
> .lut_size = 256,
> + .max_xres = 2560,
> + .max_yres = 1600,
> };
>
> static const struct vop_win_data rk3228_vop_win_data[] = {
> @@ -1029,6 +1056,8 @@ static const struct vop_data rk3228_vop = {
> .misc = &rk3368_misc,
> .win = rk3228_vop_win_data,
> .win_size = ARRAY_SIZE(rk3228_vop_win_data),
> + .max_xres = 4096,
> + .max_yres = 2160,
> };
>
> static const struct vop_modeset rk3328_modeset = {
> @@ -1100,6 +1129,8 @@ static const struct vop_data rk3328_vop = {
> .misc = &rk3328_misc,
> .win = rk3328_vop_win_data,
> .win_size = ARRAY_SIZE(rk3328_vop_win_data),
> + .max_xres = 4096,
> + .max_yres = 2160,
> };
>
> static const struct of_device_id vop_driver_dt_match[] = {
_______________________________________________
Linux-rockchip mailing list
Linux-rockchip@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-rockchip
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH v4 1/4] drm/rockchip: vop: limit maximium resolution to hardware capabilities
@ 2023-02-07 10:46 ` Jonas Karlman
0 siblings, 0 replies; 24+ messages in thread
From: Jonas Karlman @ 2023-02-07 10:46 UTC (permalink / raw)
To: Sascha Hauer, dri-devel
Cc: Dan Johansen, Sandy Huang, linux-rockchip, FUKAUMI Naoki,
Michael Riesch, kernel, Robin Murphy
Hi Sascha,
On 2023-02-07 09:44, Sascha Hauer wrote:
> The different VOP variants support different maximum resolutions. Reject
> resolutions that are not supported by a specific variant.
>
> This hasn't been a problem in the upstream driver so far as 1920x1080
> has been the maximum resolution supported by the HDMI driver and that
> resolution is supported by all VOP variants. Now with higher resolutions
> supported in the HDMI driver we have to limit the resolutions to the
> ones supported by the VOP.
>
> The actual maximum resolutions are taken from the Rockchip downstream
> Kernel.
>
> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
> ---
>
> Notes:
> Changes since v3:
> - new patch
>
> drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 15 ++++++++++
> drivers/gpu/drm/rockchip/rockchip_drm_vop.h | 2 ++
> drivers/gpu/drm/rockchip/rockchip_vop_reg.c | 31 +++++++++++++++++++++
> 3 files changed, 48 insertions(+)
>
> diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
> index fa1f4ee6d1950..96b6bd8d17803 100644
> --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
> +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
> @@ -1174,6 +1174,20 @@ static void vop_crtc_disable_vblank(struct drm_crtc *crtc)
> spin_unlock_irqrestore(&vop->irq_lock, flags);
> }
>
> +static enum drm_mode_status vop_crtc_mode_valid(struct drm_crtc *crtc,
> + const struct drm_display_mode *mode)
> +{
> + struct vop *vop = to_vop(crtc);
> +
> + if (vop->data->max_xres && mode->hdisplay > vop->data->max_xres)
> + return MODE_BAD_HVALUE;
> +
> + if (vop->data->max_yres && mode->vdisplay > vop->data->max_yres)
> + return MODE_BAD_VVALUE;
> +
> + return MODE_OK;
> +}
> +
> static bool vop_crtc_mode_fixup(struct drm_crtc *crtc,
> const struct drm_display_mode *mode,
> struct drm_display_mode *adjusted_mode)
> @@ -1585,6 +1599,7 @@ static void vop_crtc_atomic_flush(struct drm_crtc *crtc,
> }
>
> static const struct drm_crtc_helper_funcs vop_crtc_helper_funcs = {
> + .mode_valid = vop_crtc_mode_valid,
> .mode_fixup = vop_crtc_mode_fixup,
> .atomic_check = vop_crtc_atomic_check,
> .atomic_begin = vop_crtc_atomic_begin,
> diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
> index 8502849833d93..5c4875ca3f270 100644
> --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
> +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
> @@ -225,6 +225,8 @@ struct vop_data {
> const struct vop_win_data *win;
> unsigned int win_size;
> unsigned int lut_size;
> + unsigned int max_xres;
> + unsigned int max_yres;
I would suggest using the same struct vop_rect max_input/output as the
vop2 driver instead of handling this differently between the two.
Regards,
Jonas
>
> #define VOP_FEATURE_OUTPUT_RGB10 BIT(0)
> #define VOP_FEATURE_INTERNAL_RGB BIT(1)
> diff --git a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c
> index 014f99e8928e3..dc1a703d9d1a8 100644
> --- a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c
> +++ b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c
> @@ -181,6 +181,8 @@ static const struct vop_data rk3036_vop = {
> .output = &rk3036_output,
> .win = rk3036_vop_win_data,
> .win_size = ARRAY_SIZE(rk3036_vop_win_data),
> + .max_xres = 1920,
> + .max_yres = 1080,
> };
>
> static const struct vop_win_phy rk3126_win1_data = {
> @@ -213,6 +215,8 @@ static const struct vop_data rk3126_vop = {
> .output = &rk3036_output,
> .win = rk3126_vop_win_data,
> .win_size = ARRAY_SIZE(rk3126_vop_win_data),
> + .max_xres = 1920,
> + .max_yres = 1080,
> };
>
> static const int px30_vop_intrs[] = {
> @@ -340,6 +344,8 @@ static const struct vop_data px30_vop_big = {
> .output = &px30_output,
> .win = px30_vop_big_win_data,
> .win_size = ARRAY_SIZE(px30_vop_big_win_data),
> + .max_xres = 1920,
> + .max_yres = 1080,
> };
>
> static const struct vop_win_data px30_vop_lit_win_data[] = {
> @@ -356,6 +362,8 @@ static const struct vop_data px30_vop_lit = {
> .output = &px30_output,
> .win = px30_vop_lit_win_data,
> .win_size = ARRAY_SIZE(px30_vop_lit_win_data),
> + .max_xres = 1920,
> + .max_yres = 1080,
> };
>
> static const struct vop_scl_regs rk3066_win_scl = {
> @@ -479,6 +487,8 @@ static const struct vop_data rk3066_vop = {
> .output = &rk3066_output,
> .win = rk3066_vop_win_data,
> .win_size = ARRAY_SIZE(rk3066_vop_win_data),
> + .max_xres = 1920,
> + .max_yres = 1080,
> };
>
> static const struct vop_scl_regs rk3188_win_scl = {
> @@ -585,6 +595,8 @@ static const struct vop_data rk3188_vop = {
> .win = rk3188_vop_win_data,
> .win_size = ARRAY_SIZE(rk3188_vop_win_data),
> .feature = VOP_FEATURE_INTERNAL_RGB,
> + .max_xres = 2048,
> + .max_yres = 1536,
> };
>
> static const struct vop_scl_extension rk3288_win_full_scl_ext = {
> @@ -732,6 +744,13 @@ static const struct vop_data rk3288_vop = {
> .win = rk3288_vop_win_data,
> .win_size = ARRAY_SIZE(rk3288_vop_win_data),
> .lut_size = 1024,
> + /*
> + * This is the maximum resolution for the VOPB, the VOPL can only do
> + * 2560x1600, but we can't distinguish them as they have the same
> + * compatible.
> + */
> + .max_xres = 3840,
> + .max_yres = 2160,
> };
>
> static const int rk3368_vop_intrs[] = {
> @@ -833,6 +852,8 @@ static const struct vop_data rk3368_vop = {
> .misc = &rk3368_misc,
> .win = rk3368_vop_win_data,
> .win_size = ARRAY_SIZE(rk3368_vop_win_data),
> + .max_xres = 4096,
> + .max_yres = 2160,
> };
>
> static const struct vop_intr rk3366_vop_intr = {
> @@ -854,6 +875,8 @@ static const struct vop_data rk3366_vop = {
> .misc = &rk3368_misc,
> .win = rk3368_vop_win_data,
> .win_size = ARRAY_SIZE(rk3368_vop_win_data),
> + .max_xres = 4096,
> + .max_yres = 2160,
> };
>
> static const struct vop_output rk3399_output = {
> @@ -984,6 +1007,8 @@ static const struct vop_data rk3399_vop_big = {
> .win_size = ARRAY_SIZE(rk3399_vop_win_data),
> .win_yuv2yuv = rk3399_vop_big_win_yuv2yuv_data,
> .lut_size = 1024,
> + .max_xres = 4096,
> + .max_yres = 2160,
> };
>
> static const struct vop_win_data rk3399_vop_lit_win_data[] = {
> @@ -1010,6 +1035,8 @@ static const struct vop_data rk3399_vop_lit = {
> .win_size = ARRAY_SIZE(rk3399_vop_lit_win_data),
> .win_yuv2yuv = rk3399_vop_lit_win_yuv2yuv_data,
> .lut_size = 256,
> + .max_xres = 2560,
> + .max_yres = 1600,
> };
>
> static const struct vop_win_data rk3228_vop_win_data[] = {
> @@ -1029,6 +1056,8 @@ static const struct vop_data rk3228_vop = {
> .misc = &rk3368_misc,
> .win = rk3228_vop_win_data,
> .win_size = ARRAY_SIZE(rk3228_vop_win_data),
> + .max_xres = 4096,
> + .max_yres = 2160,
> };
>
> static const struct vop_modeset rk3328_modeset = {
> @@ -1100,6 +1129,8 @@ static const struct vop_data rk3328_vop = {
> .misc = &rk3328_misc,
> .win = rk3328_vop_win_data,
> .win_size = ARRAY_SIZE(rk3328_vop_win_data),
> + .max_xres = 4096,
> + .max_yres = 2160,
> };
>
> static const struct of_device_id vop_driver_dt_match[] = {
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH v4 1/4] drm/rockchip: vop: limit maximium resolution to hardware capabilities
2023-02-07 10:46 ` Jonas Karlman
@ 2023-02-07 12:34 ` Sascha Hauer
-1 siblings, 0 replies; 24+ messages in thread
From: Sascha Hauer @ 2023-02-07 12:34 UTC (permalink / raw)
To: Jonas Karlman
Cc: Dan Johansen, Sandy Huang, dri-devel, linux-rockchip,
FUKAUMI Naoki, Michael Riesch, kernel, Robin Murphy
On Tue, Feb 07, 2023 at 10:46:49AM +0000, Jonas Karlman wrote:
> Hi Sascha,
> On 2023-02-07 09:44, Sascha Hauer wrote:
> > The different VOP variants support different maximum resolutions. Reject
> > resolutions that are not supported by a specific variant.
> >
> > This hasn't been a problem in the upstream driver so far as 1920x1080
> > has been the maximum resolution supported by the HDMI driver and that
> > resolution is supported by all VOP variants. Now with higher resolutions
> > supported in the HDMI driver we have to limit the resolutions to the
> > ones supported by the VOP.
> >
> > The actual maximum resolutions are taken from the Rockchip downstream
> > Kernel.
> >
> > Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
> > ---
> >
> > Notes:
> > Changes since v3:
> > - new patch
> >
> > drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 15 ++++++++++
> > drivers/gpu/drm/rockchip/rockchip_drm_vop.h | 2 ++
> > drivers/gpu/drm/rockchip/rockchip_vop_reg.c | 31 +++++++++++++++++++++
> > 3 files changed, 48 insertions(+)
> >
> > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
> > index fa1f4ee6d1950..96b6bd8d17803 100644
> > --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
> > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
> > @@ -1174,6 +1174,20 @@ static void vop_crtc_disable_vblank(struct drm_crtc *crtc)
> > spin_unlock_irqrestore(&vop->irq_lock, flags);
> > }
> >
> > +static enum drm_mode_status vop_crtc_mode_valid(struct drm_crtc *crtc,
> > + const struct drm_display_mode *mode)
> > +{
> > + struct vop *vop = to_vop(crtc);
> > +
> > + if (vop->data->max_xres && mode->hdisplay > vop->data->max_xres)
> > + return MODE_BAD_HVALUE;
> > +
> > + if (vop->data->max_yres && mode->vdisplay > vop->data->max_yres)
> > + return MODE_BAD_VVALUE;
> > +
> > + return MODE_OK;
> > +}
> > +
> > static bool vop_crtc_mode_fixup(struct drm_crtc *crtc,
> > const struct drm_display_mode *mode,
> > struct drm_display_mode *adjusted_mode)
> > @@ -1585,6 +1599,7 @@ static void vop_crtc_atomic_flush(struct drm_crtc *crtc,
> > }
> >
> > static const struct drm_crtc_helper_funcs vop_crtc_helper_funcs = {
> > + .mode_valid = vop_crtc_mode_valid,
> > .mode_fixup = vop_crtc_mode_fixup,
> > .atomic_check = vop_crtc_atomic_check,
> > .atomic_begin = vop_crtc_atomic_begin,
> > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
> > index 8502849833d93..5c4875ca3f270 100644
> > --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
> > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
> > @@ -225,6 +225,8 @@ struct vop_data {
> > const struct vop_win_data *win;
> > unsigned int win_size;
> > unsigned int lut_size;
> > + unsigned int max_xres;
> > + unsigned int max_yres;
>
> I would suggest using the same struct vop_rect max_input/output as the
> vop2 driver instead of handling this differently between the two.
As it was me who introduced struct vop_rect in the vop2 driver I
probably have to agree ;)
Sascha
--
Pengutronix e.K. | |
Steuerwalder Str. 21 | http://www.pengutronix.de/ |
31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH v4 1/4] drm/rockchip: vop: limit maximium resolution to hardware capabilities
@ 2023-02-07 12:34 ` Sascha Hauer
0 siblings, 0 replies; 24+ messages in thread
From: Sascha Hauer @ 2023-02-07 12:34 UTC (permalink / raw)
To: Jonas Karlman
Cc: dri-devel, Dan Johansen, Sandy Huang, linux-rockchip,
FUKAUMI Naoki, Michael Riesch, kernel, Robin Murphy
On Tue, Feb 07, 2023 at 10:46:49AM +0000, Jonas Karlman wrote:
> Hi Sascha,
> On 2023-02-07 09:44, Sascha Hauer wrote:
> > The different VOP variants support different maximum resolutions. Reject
> > resolutions that are not supported by a specific variant.
> >
> > This hasn't been a problem in the upstream driver so far as 1920x1080
> > has been the maximum resolution supported by the HDMI driver and that
> > resolution is supported by all VOP variants. Now with higher resolutions
> > supported in the HDMI driver we have to limit the resolutions to the
> > ones supported by the VOP.
> >
> > The actual maximum resolutions are taken from the Rockchip downstream
> > Kernel.
> >
> > Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
> > ---
> >
> > Notes:
> > Changes since v3:
> > - new patch
> >
> > drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 15 ++++++++++
> > drivers/gpu/drm/rockchip/rockchip_drm_vop.h | 2 ++
> > drivers/gpu/drm/rockchip/rockchip_vop_reg.c | 31 +++++++++++++++++++++
> > 3 files changed, 48 insertions(+)
> >
> > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
> > index fa1f4ee6d1950..96b6bd8d17803 100644
> > --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
> > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
> > @@ -1174,6 +1174,20 @@ static void vop_crtc_disable_vblank(struct drm_crtc *crtc)
> > spin_unlock_irqrestore(&vop->irq_lock, flags);
> > }
> >
> > +static enum drm_mode_status vop_crtc_mode_valid(struct drm_crtc *crtc,
> > + const struct drm_display_mode *mode)
> > +{
> > + struct vop *vop = to_vop(crtc);
> > +
> > + if (vop->data->max_xres && mode->hdisplay > vop->data->max_xres)
> > + return MODE_BAD_HVALUE;
> > +
> > + if (vop->data->max_yres && mode->vdisplay > vop->data->max_yres)
> > + return MODE_BAD_VVALUE;
> > +
> > + return MODE_OK;
> > +}
> > +
> > static bool vop_crtc_mode_fixup(struct drm_crtc *crtc,
> > const struct drm_display_mode *mode,
> > struct drm_display_mode *adjusted_mode)
> > @@ -1585,6 +1599,7 @@ static void vop_crtc_atomic_flush(struct drm_crtc *crtc,
> > }
> >
> > static const struct drm_crtc_helper_funcs vop_crtc_helper_funcs = {
> > + .mode_valid = vop_crtc_mode_valid,
> > .mode_fixup = vop_crtc_mode_fixup,
> > .atomic_check = vop_crtc_atomic_check,
> > .atomic_begin = vop_crtc_atomic_begin,
> > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
> > index 8502849833d93..5c4875ca3f270 100644
> > --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
> > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
> > @@ -225,6 +225,8 @@ struct vop_data {
> > const struct vop_win_data *win;
> > unsigned int win_size;
> > unsigned int lut_size;
> > + unsigned int max_xres;
> > + unsigned int max_yres;
>
> I would suggest using the same struct vop_rect max_input/output as the
> vop2 driver instead of handling this differently between the two.
As it was me who introduced struct vop_rect in the vop2 driver I
probably have to agree ;)
Sascha
--
Pengutronix e.K. | |
Steuerwalder Str. 21 | http://www.pengutronix.de/ |
31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
_______________________________________________
Linux-rockchip mailing list
Linux-rockchip@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-rockchip
^ permalink raw reply [flat|nested] 24+ messages in thread