* [PATCH 0/3] drm/ast: Various fixes
@ 2025-03-24 9:44 Thomas Zimmermann
2025-03-24 9:44 ` [PATCH 1/3] drm/ast: Fix comment on modeset lock Thomas Zimmermann
` (2 more replies)
0 siblings, 3 replies; 7+ messages in thread
From: Thomas Zimmermann @ 2025-03-24 9:44 UTC (permalink / raw)
To: jfalempe, airlied; +Cc: dri-devel, Thomas Zimmermann
Three small fixes for ast to resolve a few minor issues. Tested on
AST2600 hardware.
Thomas Zimmermann (3):
drm/ast: Fix comment on modeset lock
drm/ast: Remove vaddr field from struct ast_plane
drm/ast: Validate display modes against framebuffer and format limits
drivers/gpu/drm/ast/ast_cursor.c | 8 ++----
drivers/gpu/drm/ast/ast_drv.h | 4 +--
drivers/gpu/drm/ast/ast_mode.c | 49 +++++++++++++++++++-------------
3 files changed, 35 insertions(+), 26 deletions(-)
--
2.48.1
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 1/3] drm/ast: Fix comment on modeset lock
2025-03-24 9:44 [PATCH 0/3] drm/ast: Various fixes Thomas Zimmermann
@ 2025-03-24 9:44 ` Thomas Zimmermann
2025-03-25 9:01 ` Jocelyn Falempe
2025-03-24 9:44 ` [PATCH 2/3] drm/ast: Remove vaddr field from struct ast_plane Thomas Zimmermann
2025-03-24 9:44 ` [PATCH 3/3] drm/ast: Validate display modes against framebuffer and format limits Thomas Zimmermann
2 siblings, 1 reply; 7+ messages in thread
From: Thomas Zimmermann @ 2025-03-24 9:44 UTC (permalink / raw)
To: jfalempe, airlied; +Cc: dri-devel, Thomas Zimmermann, stable
The ast driver protects the commit tail against concurrent reads
of the display modes by acquiring a lock. The comment is misleading
as the lock is not released in atomic_flush, but at the end of the
commit-tail helper. Rewrite the comment.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Fixes: 1fe182154984 ("drm/ast: Acquire I/O-register lock in atomic_commit_tail function")
Cc: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Jocelyn Falempe <jfalempe@redhat.com>
Cc: Dave Airlie <airlied@redhat.com>
Cc: dri-devel@lists.freedesktop.org
Cc: <stable@vger.kernel.org> # v6.2+
---
drivers/gpu/drm/ast/ast_mode.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c
index 4cac5c7f4547..20fbea11b710 100644
--- a/drivers/gpu/drm/ast/ast_mode.c
+++ b/drivers/gpu/drm/ast/ast_mode.c
@@ -939,9 +939,9 @@ static void ast_mode_config_helper_atomic_commit_tail(struct drm_atomic_state *s
/*
* Concurrent operations could possibly trigger a call to
- * drm_connector_helper_funcs.get_modes by trying to read the
- * display modes. Protect access to I/O registers by acquiring
- * the I/O-register lock. Released in atomic_flush().
+ * drm_connector_helper_funcs.get_modes by reading the display
+ * modes. Protect access to registers by acquiring the modeset
+ * lock.
*/
mutex_lock(&ast->modeset_lock);
drm_atomic_helper_commit_tail(state);
--
2.48.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 2/3] drm/ast: Remove vaddr field from struct ast_plane
2025-03-24 9:44 [PATCH 0/3] drm/ast: Various fixes Thomas Zimmermann
2025-03-24 9:44 ` [PATCH 1/3] drm/ast: Fix comment on modeset lock Thomas Zimmermann
@ 2025-03-24 9:44 ` Thomas Zimmermann
2025-03-25 9:01 ` Jocelyn Falempe
2025-03-24 9:44 ` [PATCH 3/3] drm/ast: Validate display modes against framebuffer and format limits Thomas Zimmermann
2 siblings, 1 reply; 7+ messages in thread
From: Thomas Zimmermann @ 2025-03-24 9:44 UTC (permalink / raw)
To: jfalempe, airlied; +Cc: dri-devel, Thomas Zimmermann
The vaddr field in struct ast_plane serves no purpose. Its value
can be calculated easily from the VRAM base plus the plane offset.
Do so and remove the field.
In ast_primary_plane_helper_get_scanout_buffer(), remove the test
for vaddr being NULL. This cannot legally happen.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
---
drivers/gpu/drm/ast/ast_cursor.c | 8 +++-----
drivers/gpu/drm/ast/ast_drv.h | 4 ++--
drivers/gpu/drm/ast/ast_mode.c | 19 ++++++++++++-------
3 files changed, 17 insertions(+), 14 deletions(-)
diff --git a/drivers/gpu/drm/ast/ast_cursor.c b/drivers/gpu/drm/ast/ast_cursor.c
index 5ee724bfd682..2d3ad7610c2e 100644
--- a/drivers/gpu/drm/ast/ast_cursor.c
+++ b/drivers/gpu/drm/ast/ast_cursor.c
@@ -91,7 +91,7 @@ static u32 ast_cursor_calculate_checksum(const void *src, unsigned int width, un
static void ast_set_cursor_image(struct ast_device *ast, const u8 *src,
unsigned int width, unsigned int height)
{
- u8 __iomem *dst = ast->cursor_plane.base.vaddr;
+ u8 __iomem *dst = ast_plane_vaddr(&ast->cursor_plane.base);
u32 csum;
csum = ast_cursor_calculate_checksum(src, width, height);
@@ -193,7 +193,7 @@ static void ast_cursor_plane_helper_atomic_update(struct drm_plane *plane,
struct ast_device *ast = to_ast_device(plane->dev);
struct drm_rect damage;
u64 dst_off = ast_plane->offset;
- u8 __iomem *dst = ast_plane->vaddr; /* TODO: Use mapping abstraction properly */
+ u8 __iomem *dst = ast_plane_vaddr(ast_plane); /* TODO: Use mapping abstraction properly */
u8 __iomem *sig = dst + AST_HWC_SIZE; /* TODO: Use mapping abstraction properly */
unsigned int offset_x, offset_y;
u16 x, y;
@@ -291,7 +291,6 @@ int ast_cursor_plane_init(struct ast_device *ast)
struct ast_plane *ast_plane = &ast_cursor_plane->base;
struct drm_plane *cursor_plane = &ast_plane->base;
unsigned long size;
- void __iomem *vaddr;
long offset;
int ret;
@@ -299,9 +298,8 @@ int ast_cursor_plane_init(struct ast_device *ast)
offset = ast_cursor_vram_offset(ast);
if (offset < 0)
return offset;
- vaddr = ast->vram + offset;
- ret = ast_plane_init(dev, ast_plane, vaddr, offset, size,
+ ret = ast_plane_init(dev, ast_plane, offset, size,
0x01, &ast_cursor_plane_funcs,
ast_cursor_plane_formats, ARRAY_SIZE(ast_cursor_plane_formats),
NULL, DRM_PLANE_TYPE_CURSOR);
diff --git a/drivers/gpu/drm/ast/ast_drv.h b/drivers/gpu/drm/ast/ast_drv.h
index d9da2328d46b..2ee402096cd9 100644
--- a/drivers/gpu/drm/ast/ast_drv.h
+++ b/drivers/gpu/drm/ast/ast_drv.h
@@ -122,7 +122,6 @@ enum ast_config_mode {
struct ast_plane {
struct drm_plane base;
- void __iomem *vaddr;
u64 offset;
unsigned long size;
};
@@ -443,11 +442,12 @@ int ast_astdp_output_init(struct ast_device *ast);
/* ast_mode.c */
int ast_mode_config_init(struct ast_device *ast);
int ast_plane_init(struct drm_device *dev, struct ast_plane *ast_plane,
- void __iomem *vaddr, u64 offset, unsigned long size,
+ u64 offset, unsigned long size,
uint32_t possible_crtcs,
const struct drm_plane_funcs *funcs,
const uint32_t *formats, unsigned int format_count,
const uint64_t *format_modifiers,
enum drm_plane_type type);
+void __iomem *ast_plane_vaddr(struct ast_plane *ast);
#endif
diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c
index 20fbea11b710..d3ed27faefd1 100644
--- a/drivers/gpu/drm/ast/ast_mode.c
+++ b/drivers/gpu/drm/ast/ast_mode.c
@@ -457,7 +457,7 @@ static void ast_wait_for_vretrace(struct ast_device *ast)
*/
int ast_plane_init(struct drm_device *dev, struct ast_plane *ast_plane,
- void __iomem *vaddr, u64 offset, unsigned long size,
+ u64 offset, unsigned long size,
uint32_t possible_crtcs,
const struct drm_plane_funcs *funcs,
const uint32_t *formats, unsigned int format_count,
@@ -466,7 +466,6 @@ int ast_plane_init(struct drm_device *dev, struct ast_plane *ast_plane,
{
struct drm_plane *plane = &ast_plane->base;
- ast_plane->vaddr = vaddr;
ast_plane->offset = offset;
ast_plane->size = size;
@@ -475,6 +474,13 @@ int ast_plane_init(struct drm_device *dev, struct ast_plane *ast_plane,
type, NULL);
}
+void __iomem *ast_plane_vaddr(struct ast_plane *ast_plane)
+{
+ struct ast_device *ast = to_ast_device(ast_plane->base.dev);
+
+ return ast->vram + ast_plane->offset;
+}
+
/*
* Primary plane
*/
@@ -521,7 +527,7 @@ static void ast_handle_damage(struct ast_plane *ast_plane, struct iosys_map *src
struct drm_framebuffer *fb,
const struct drm_rect *clip)
{
- struct iosys_map dst = IOSYS_MAP_INIT_VADDR_IOMEM(ast_plane->vaddr);
+ struct iosys_map dst = IOSYS_MAP_INIT_VADDR_IOMEM(ast_plane_vaddr(ast_plane));
iosys_map_incr(&dst, drm_fb_clip_offset(fb->pitches[0], fb->format, clip));
drm_fb_memcpy(&dst, fb->pitches, src, fb, clip);
@@ -594,12 +600,12 @@ static int ast_primary_plane_helper_get_scanout_buffer(struct drm_plane *plane,
{
struct ast_plane *ast_plane = to_ast_plane(plane);
- if (plane->state && plane->state->fb && ast_plane->vaddr) {
+ if (plane->state && plane->state->fb) {
sb->format = plane->state->fb->format;
sb->width = plane->state->fb->width;
sb->height = plane->state->fb->height;
sb->pitch[0] = plane->state->fb->pitches[0];
- iosys_map_set_vaddr_iomem(&sb->map[0], ast_plane->vaddr);
+ iosys_map_set_vaddr_iomem(&sb->map[0], ast_plane_vaddr(ast_plane));
return 0;
}
return -ENODEV;
@@ -626,12 +632,11 @@ static int ast_primary_plane_init(struct ast_device *ast)
struct drm_device *dev = &ast->base;
struct ast_plane *ast_primary_plane = &ast->primary_plane;
struct drm_plane *primary_plane = &ast_primary_plane->base;
- void __iomem *vaddr = ast->vram;
u64 offset = ast_fb_vram_offset();
unsigned long size = ast_fb_vram_size(ast);
int ret;
- ret = ast_plane_init(dev, ast_primary_plane, vaddr, offset, size,
+ ret = ast_plane_init(dev, ast_primary_plane, offset, size,
0x01, &ast_primary_plane_funcs,
ast_primary_plane_formats, ARRAY_SIZE(ast_primary_plane_formats),
NULL, DRM_PLANE_TYPE_PRIMARY);
--
2.48.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 3/3] drm/ast: Validate display modes against framebuffer and format limits
2025-03-24 9:44 [PATCH 0/3] drm/ast: Various fixes Thomas Zimmermann
2025-03-24 9:44 ` [PATCH 1/3] drm/ast: Fix comment on modeset lock Thomas Zimmermann
2025-03-24 9:44 ` [PATCH 2/3] drm/ast: Remove vaddr field from struct ast_plane Thomas Zimmermann
@ 2025-03-24 9:44 ` Thomas Zimmermann
2025-03-25 9:01 ` Jocelyn Falempe
2 siblings, 1 reply; 7+ messages in thread
From: Thomas Zimmermann @ 2025-03-24 9:44 UTC (permalink / raw)
To: jfalempe, airlied; +Cc: dri-devel, Thomas Zimmermann
Reimplement ast_mode_config_mode_valid() with DRM format helpers and
ast's helpers for framebuffer size calculation. Replaces ast's open-
coded assumptions on bpp and page-alignments.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
---
drivers/gpu/drm/ast/ast_mode.c | 24 +++++++++++++++---------
1 file changed, 15 insertions(+), 9 deletions(-)
diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c
index d3ed27faefd1..a9a3252ff3c2 100644
--- a/drivers/gpu/drm/ast/ast_mode.c
+++ b/drivers/gpu/drm/ast/ast_mode.c
@@ -51,6 +51,8 @@
#define AST_LUT_SIZE 256
+#define AST_PRIMARY_PLANE_MAX_OFFSET (BIT(16) - 1)
+
static unsigned long ast_fb_vram_offset(void)
{
return 0; // with shmem, the primary plane is always at offset 0
@@ -960,16 +962,20 @@ static const struct drm_mode_config_helper_funcs ast_mode_config_helper_funcs =
static enum drm_mode_status ast_mode_config_mode_valid(struct drm_device *dev,
const struct drm_display_mode *mode)
{
- static const unsigned long max_bpp = 4; /* DRM_FORMAT_XRGB8888 */
+ const struct drm_format_info *info = drm_format_info(DRM_FORMAT_XRGB8888);
struct ast_device *ast = to_ast_device(dev);
- unsigned long fbsize, fbpages, max_fbpages;
-
- max_fbpages = ast_fb_vram_size(ast) >> PAGE_SHIFT;
-
- fbsize = mode->hdisplay * mode->vdisplay * max_bpp;
- fbpages = DIV_ROUND_UP(fbsize, PAGE_SIZE);
-
- if (fbpages > max_fbpages)
+ unsigned long max_fb_size = ast_fb_vram_size(ast);
+ u64 pitch;
+
+ if (drm_WARN_ON_ONCE(dev, !info))
+ return MODE_ERROR; /* driver bug */
+
+ pitch = drm_format_info_min_pitch(info, 0, mode->hdisplay);
+ if (!pitch)
+ return MODE_BAD_WIDTH;
+ if (pitch > AST_PRIMARY_PLANE_MAX_OFFSET)
+ return MODE_BAD_WIDTH; /* maximum programmable pitch */
+ if (pitch > max_fb_size / mode->vdisplay)
return MODE_MEM;
return MODE_OK;
--
2.48.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH 1/3] drm/ast: Fix comment on modeset lock
2025-03-24 9:44 ` [PATCH 1/3] drm/ast: Fix comment on modeset lock Thomas Zimmermann
@ 2025-03-25 9:01 ` Jocelyn Falempe
0 siblings, 0 replies; 7+ messages in thread
From: Jocelyn Falempe @ 2025-03-25 9:01 UTC (permalink / raw)
To: Thomas Zimmermann, airlied; +Cc: dri-devel, stable
On 24/03/2025 10:44, Thomas Zimmermann wrote:
> The ast driver protects the commit tail against concurrent reads
> of the display modes by acquiring a lock. The comment is misleading
> as the lock is not released in atomic_flush, but at the end of the
> commit-tail helper. Rewrite the comment.
Thanks, it looks good to me.
Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com>
>
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> Fixes: 1fe182154984 ("drm/ast: Acquire I/O-register lock in atomic_commit_tail function")
> Cc: Thomas Zimmermann <tzimmermann@suse.de>
> Cc: Jocelyn Falempe <jfalempe@redhat.com>
> Cc: Dave Airlie <airlied@redhat.com>
> Cc: dri-devel@lists.freedesktop.org
> Cc: <stable@vger.kernel.org> # v6.2+
> ---
> drivers/gpu/drm/ast/ast_mode.c | 6 +++---
> 1 file changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c
> index 4cac5c7f4547..20fbea11b710 100644
> --- a/drivers/gpu/drm/ast/ast_mode.c
> +++ b/drivers/gpu/drm/ast/ast_mode.c
> @@ -939,9 +939,9 @@ static void ast_mode_config_helper_atomic_commit_tail(struct drm_atomic_state *s
>
> /*
> * Concurrent operations could possibly trigger a call to
> - * drm_connector_helper_funcs.get_modes by trying to read the
> - * display modes. Protect access to I/O registers by acquiring
> - * the I/O-register lock. Released in atomic_flush().
> + * drm_connector_helper_funcs.get_modes by reading the display
> + * modes. Protect access to registers by acquiring the modeset
> + * lock.
> */
> mutex_lock(&ast->modeset_lock);
> drm_atomic_helper_commit_tail(state);
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 2/3] drm/ast: Remove vaddr field from struct ast_plane
2025-03-24 9:44 ` [PATCH 2/3] drm/ast: Remove vaddr field from struct ast_plane Thomas Zimmermann
@ 2025-03-25 9:01 ` Jocelyn Falempe
0 siblings, 0 replies; 7+ messages in thread
From: Jocelyn Falempe @ 2025-03-25 9:01 UTC (permalink / raw)
To: Thomas Zimmermann, airlied; +Cc: dri-devel
On 24/03/2025 10:44, Thomas Zimmermann wrote:
> The vaddr field in struct ast_plane serves no purpose. Its value
> can be calculated easily from the VRAM base plus the plane offset.
> Do so and remove the field.
>
> In ast_primary_plane_helper_get_scanout_buffer(), remove the test
> for vaddr being NULL. This cannot legally happen.
Thanks, it looks good to me.
Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com>
>
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> ---
> drivers/gpu/drm/ast/ast_cursor.c | 8 +++-----
> drivers/gpu/drm/ast/ast_drv.h | 4 ++--
> drivers/gpu/drm/ast/ast_mode.c | 19 ++++++++++++-------
> 3 files changed, 17 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/gpu/drm/ast/ast_cursor.c b/drivers/gpu/drm/ast/ast_cursor.c
> index 5ee724bfd682..2d3ad7610c2e 100644
> --- a/drivers/gpu/drm/ast/ast_cursor.c
> +++ b/drivers/gpu/drm/ast/ast_cursor.c
> @@ -91,7 +91,7 @@ static u32 ast_cursor_calculate_checksum(const void *src, unsigned int width, un
> static void ast_set_cursor_image(struct ast_device *ast, const u8 *src,
> unsigned int width, unsigned int height)
> {
> - u8 __iomem *dst = ast->cursor_plane.base.vaddr;
> + u8 __iomem *dst = ast_plane_vaddr(&ast->cursor_plane.base);
> u32 csum;
>
> csum = ast_cursor_calculate_checksum(src, width, height);
> @@ -193,7 +193,7 @@ static void ast_cursor_plane_helper_atomic_update(struct drm_plane *plane,
> struct ast_device *ast = to_ast_device(plane->dev);
> struct drm_rect damage;
> u64 dst_off = ast_plane->offset;
> - u8 __iomem *dst = ast_plane->vaddr; /* TODO: Use mapping abstraction properly */
> + u8 __iomem *dst = ast_plane_vaddr(ast_plane); /* TODO: Use mapping abstraction properly */
> u8 __iomem *sig = dst + AST_HWC_SIZE; /* TODO: Use mapping abstraction properly */
> unsigned int offset_x, offset_y;
> u16 x, y;
> @@ -291,7 +291,6 @@ int ast_cursor_plane_init(struct ast_device *ast)
> struct ast_plane *ast_plane = &ast_cursor_plane->base;
> struct drm_plane *cursor_plane = &ast_plane->base;
> unsigned long size;
> - void __iomem *vaddr;
> long offset;
> int ret;
>
> @@ -299,9 +298,8 @@ int ast_cursor_plane_init(struct ast_device *ast)
> offset = ast_cursor_vram_offset(ast);
> if (offset < 0)
> return offset;
> - vaddr = ast->vram + offset;
>
> - ret = ast_plane_init(dev, ast_plane, vaddr, offset, size,
> + ret = ast_plane_init(dev, ast_plane, offset, size,
> 0x01, &ast_cursor_plane_funcs,
> ast_cursor_plane_formats, ARRAY_SIZE(ast_cursor_plane_formats),
> NULL, DRM_PLANE_TYPE_CURSOR);
> diff --git a/drivers/gpu/drm/ast/ast_drv.h b/drivers/gpu/drm/ast/ast_drv.h
> index d9da2328d46b..2ee402096cd9 100644
> --- a/drivers/gpu/drm/ast/ast_drv.h
> +++ b/drivers/gpu/drm/ast/ast_drv.h
> @@ -122,7 +122,6 @@ enum ast_config_mode {
> struct ast_plane {
> struct drm_plane base;
>
> - void __iomem *vaddr;
> u64 offset;
> unsigned long size;
> };
> @@ -443,11 +442,12 @@ int ast_astdp_output_init(struct ast_device *ast);
> /* ast_mode.c */
> int ast_mode_config_init(struct ast_device *ast);
> int ast_plane_init(struct drm_device *dev, struct ast_plane *ast_plane,
> - void __iomem *vaddr, u64 offset, unsigned long size,
> + u64 offset, unsigned long size,
> uint32_t possible_crtcs,
> const struct drm_plane_funcs *funcs,
> const uint32_t *formats, unsigned int format_count,
> const uint64_t *format_modifiers,
> enum drm_plane_type type);
> +void __iomem *ast_plane_vaddr(struct ast_plane *ast);
>
> #endif
> diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c
> index 20fbea11b710..d3ed27faefd1 100644
> --- a/drivers/gpu/drm/ast/ast_mode.c
> +++ b/drivers/gpu/drm/ast/ast_mode.c
> @@ -457,7 +457,7 @@ static void ast_wait_for_vretrace(struct ast_device *ast)
> */
>
> int ast_plane_init(struct drm_device *dev, struct ast_plane *ast_plane,
> - void __iomem *vaddr, u64 offset, unsigned long size,
> + u64 offset, unsigned long size,
> uint32_t possible_crtcs,
> const struct drm_plane_funcs *funcs,
> const uint32_t *formats, unsigned int format_count,
> @@ -466,7 +466,6 @@ int ast_plane_init(struct drm_device *dev, struct ast_plane *ast_plane,
> {
> struct drm_plane *plane = &ast_plane->base;
>
> - ast_plane->vaddr = vaddr;
> ast_plane->offset = offset;
> ast_plane->size = size;
>
> @@ -475,6 +474,13 @@ int ast_plane_init(struct drm_device *dev, struct ast_plane *ast_plane,
> type, NULL);
> }
>
> +void __iomem *ast_plane_vaddr(struct ast_plane *ast_plane)
> +{
> + struct ast_device *ast = to_ast_device(ast_plane->base.dev);
> +
> + return ast->vram + ast_plane->offset;
> +}
> +
> /*
> * Primary plane
> */
> @@ -521,7 +527,7 @@ static void ast_handle_damage(struct ast_plane *ast_plane, struct iosys_map *src
> struct drm_framebuffer *fb,
> const struct drm_rect *clip)
> {
> - struct iosys_map dst = IOSYS_MAP_INIT_VADDR_IOMEM(ast_plane->vaddr);
> + struct iosys_map dst = IOSYS_MAP_INIT_VADDR_IOMEM(ast_plane_vaddr(ast_plane));
>
> iosys_map_incr(&dst, drm_fb_clip_offset(fb->pitches[0], fb->format, clip));
> drm_fb_memcpy(&dst, fb->pitches, src, fb, clip);
> @@ -594,12 +600,12 @@ static int ast_primary_plane_helper_get_scanout_buffer(struct drm_plane *plane,
> {
> struct ast_plane *ast_plane = to_ast_plane(plane);
>
> - if (plane->state && plane->state->fb && ast_plane->vaddr) {
> + if (plane->state && plane->state->fb) {
> sb->format = plane->state->fb->format;
> sb->width = plane->state->fb->width;
> sb->height = plane->state->fb->height;
> sb->pitch[0] = plane->state->fb->pitches[0];
> - iosys_map_set_vaddr_iomem(&sb->map[0], ast_plane->vaddr);
> + iosys_map_set_vaddr_iomem(&sb->map[0], ast_plane_vaddr(ast_plane));
> return 0;
> }
> return -ENODEV;
> @@ -626,12 +632,11 @@ static int ast_primary_plane_init(struct ast_device *ast)
> struct drm_device *dev = &ast->base;
> struct ast_plane *ast_primary_plane = &ast->primary_plane;
> struct drm_plane *primary_plane = &ast_primary_plane->base;
> - void __iomem *vaddr = ast->vram;
> u64 offset = ast_fb_vram_offset();
> unsigned long size = ast_fb_vram_size(ast);
> int ret;
>
> - ret = ast_plane_init(dev, ast_primary_plane, vaddr, offset, size,
> + ret = ast_plane_init(dev, ast_primary_plane, offset, size,
> 0x01, &ast_primary_plane_funcs,
> ast_primary_plane_formats, ARRAY_SIZE(ast_primary_plane_formats),
> NULL, DRM_PLANE_TYPE_PRIMARY);
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 3/3] drm/ast: Validate display modes against framebuffer and format limits
2025-03-24 9:44 ` [PATCH 3/3] drm/ast: Validate display modes against framebuffer and format limits Thomas Zimmermann
@ 2025-03-25 9:01 ` Jocelyn Falempe
0 siblings, 0 replies; 7+ messages in thread
From: Jocelyn Falempe @ 2025-03-25 9:01 UTC (permalink / raw)
To: Thomas Zimmermann, airlied; +Cc: dri-devel
On 24/03/2025 10:44, Thomas Zimmermann wrote:
> Reimplement ast_mode_config_mode_valid() with DRM format helpers and
> ast's helpers for framebuffer size calculation. Replaces ast's open-
> coded assumptions on bpp and page-alignments.
>
Thanks, it looks good to me.
Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com>
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> ---
> drivers/gpu/drm/ast/ast_mode.c | 24 +++++++++++++++---------
> 1 file changed, 15 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c
> index d3ed27faefd1..a9a3252ff3c2 100644
> --- a/drivers/gpu/drm/ast/ast_mode.c
> +++ b/drivers/gpu/drm/ast/ast_mode.c
> @@ -51,6 +51,8 @@
>
> #define AST_LUT_SIZE 256
>
> +#define AST_PRIMARY_PLANE_MAX_OFFSET (BIT(16) - 1)
> +
> static unsigned long ast_fb_vram_offset(void)
> {
> return 0; // with shmem, the primary plane is always at offset 0
> @@ -960,16 +962,20 @@ static const struct drm_mode_config_helper_funcs ast_mode_config_helper_funcs =
> static enum drm_mode_status ast_mode_config_mode_valid(struct drm_device *dev,
> const struct drm_display_mode *mode)
> {
> - static const unsigned long max_bpp = 4; /* DRM_FORMAT_XRGB8888 */
> + const struct drm_format_info *info = drm_format_info(DRM_FORMAT_XRGB8888);
> struct ast_device *ast = to_ast_device(dev);
> - unsigned long fbsize, fbpages, max_fbpages;
> -
> - max_fbpages = ast_fb_vram_size(ast) >> PAGE_SHIFT;
> -
> - fbsize = mode->hdisplay * mode->vdisplay * max_bpp;
> - fbpages = DIV_ROUND_UP(fbsize, PAGE_SIZE);
> -
> - if (fbpages > max_fbpages)
> + unsigned long max_fb_size = ast_fb_vram_size(ast);
> + u64 pitch;
> +
> + if (drm_WARN_ON_ONCE(dev, !info))
> + return MODE_ERROR; /* driver bug */
> +
> + pitch = drm_format_info_min_pitch(info, 0, mode->hdisplay);
> + if (!pitch)
> + return MODE_BAD_WIDTH;
> + if (pitch > AST_PRIMARY_PLANE_MAX_OFFSET)
> + return MODE_BAD_WIDTH; /* maximum programmable pitch */
> + if (pitch > max_fb_size / mode->vdisplay)
> return MODE_MEM;
>
> return MODE_OK;
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2025-03-25 9:02 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-03-24 9:44 [PATCH 0/3] drm/ast: Various fixes Thomas Zimmermann
2025-03-24 9:44 ` [PATCH 1/3] drm/ast: Fix comment on modeset lock Thomas Zimmermann
2025-03-25 9:01 ` Jocelyn Falempe
2025-03-24 9:44 ` [PATCH 2/3] drm/ast: Remove vaddr field from struct ast_plane Thomas Zimmermann
2025-03-25 9:01 ` Jocelyn Falempe
2025-03-24 9:44 ` [PATCH 3/3] drm/ast: Validate display modes against framebuffer and format limits Thomas Zimmermann
2025-03-25 9:01 ` Jocelyn Falempe
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).