All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sam Ravnborg <sam@ravnborg.org>
To: Thomas Zimmermann <tzimmermann@suse.de>
Cc: noralf@tronnes.org, daniel@ffwll.ch, airlied@linux.ie,
	mripard@kernel.org, maarten.lankhorst@linux.intel.com,
	airlied@redhat.com, javierm@redhat.com, drawat.floss@gmail.com,
	kraxel@redhat.com, david@lechnology.com,
	jose.exposito89@gmail.com, dri-devel@lists.freedesktop.org,
	linux-hyperv@vger.kernel.org,
	virtualization@lists.linux-foundation.org
Subject: Re: [PATCH 01/12] drm/format-helper: Provide drm_fb_blit()
Date: Thu, 4 Aug 2022 19:02:25 +0200	[thread overview]
Message-ID: <Yuv7oURk9RR4KOYV@ravnborg.org> (raw)
In-Reply-To: <20220727113312.22407-2-tzimmermann@suse.de>

Hi Thomas,

On Wed, Jul 27, 2022 at 01:33:01PM +0200, Thomas Zimmermann wrote:
> Provide drm_fb_blit() that works with struct iosys_map. Update all
> users of drm_fb_blit_toio(), which required a destination buffer in
> I/O memory. The new function's interface works with multi-plane
> color formats, although the implementation only supports a single
> plane for now.
> 
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> ---
>  drivers/gpu/drm/drm_format_helper.c | 39 ++++++++++++++++++-----------
>  drivers/gpu/drm/tiny/simpledrm.c    | 18 +++++++------
>  include/drm/drm_format_helper.h     |  7 +++---
>  3 files changed, 38 insertions(+), 26 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_format_helper.c b/drivers/gpu/drm/drm_format_helper.c
> index c6182b5de78b..4d74d46ab155 100644
> --- a/drivers/gpu/drm/drm_format_helper.c
> +++ b/drivers/gpu/drm/drm_format_helper.c
> @@ -8,9 +8,10 @@
>   * (at your option) any later version.
>   */
>  
> +#include <linux/io.h>
> +#include <linux/iosys-map.h>
>  #include <linux/module.h>
>  #include <linux/slab.h>
> -#include <linux/io.h>
>  
>  #include <drm/drm_device.h>
>  #include <drm/drm_format_helper.h>
> @@ -545,9 +546,9 @@ void drm_fb_xrgb8888_to_gray8(void *dst, unsigned int dst_pitch, const void *vad
>  EXPORT_SYMBOL(drm_fb_xrgb8888_to_gray8);
>  
>  /**
> - * drm_fb_blit_toio - Copy parts of a framebuffer to display memory
> - * @dst:	The display memory to copy to
> - * @dst_pitch:	Number of bytes between two consecutive scanlines within dst
> + * drm_fb_blit - Copy parts of a framebuffer to display memory
> + * @dst:	Array of display-memory addresses to copy to
> + * @dst_pitch:	Array of numbers of bytes between two consecutive scanlines within dst

The rename confused me since this function continue to operate only on
io memory, but I see that this is all fixed up in later patches.
It would be nice to have this mentioned in the changelog, just in case
someone else takes a deeper look at it.

With the changelog updated:
Reviewed-by: Sam Ravnborg <sam@ravnborg.org>

See also comments below.

>   * @dst_format:	FOURCC code of the display's color format
>   * @vmap:	The framebuffer memory to copy from
>   * @fb:		The framebuffer to copy from
> @@ -557,14 +558,18 @@ EXPORT_SYMBOL(drm_fb_xrgb8888_to_gray8);
>   * formats of the display and the framebuffer mismatch, the blit function
>   * will attempt to convert between them.
>   *
> + * The parameters @dst, @dst_pitch and @vmap refer to arrays. Each array must
> + * have at least as many entries as there are planes in @dst_format's format. Each
> + * entry stores the value for the format's respective color plane at the same index.
> + *
>   * Returns:
>   * 0 on success, or
>   * -EINVAL if the color-format conversion failed, or
>   * a negative error code otherwise.
>   */
> -int drm_fb_blit_toio(void __iomem *dst, unsigned int dst_pitch, uint32_t dst_format,
> -		     const void *vmap, const struct drm_framebuffer *fb,
> -		     const struct drm_rect *clip)
> +int drm_fb_blit(struct iosys_map *dst, const unsigned int *dst_pitch, uint32_t dst_format,
> +		const struct iosys_map *vmap, const struct drm_framebuffer *fb,
> +		const struct drm_rect *clip)
>  {
>  	uint32_t fb_format = fb->format->format;
>  
> @@ -579,30 +584,35 @@ int drm_fb_blit_toio(void __iomem *dst, unsigned int dst_pitch, uint32_t dst_for
>  		dst_format = DRM_FORMAT_XRGB2101010;
>  
>  	if (dst_format == fb_format) {
> -		drm_fb_memcpy_toio(dst, dst_pitch, vmap, fb, clip);
> +		drm_fb_memcpy_toio(dst[0].vaddr_iomem, dst_pitch[0], vmap[0].vaddr, fb, clip);
>  		return 0;
>  
>  	} else if (dst_format == DRM_FORMAT_RGB565) {
>  		if (fb_format == DRM_FORMAT_XRGB8888) {
> -			drm_fb_xrgb8888_to_rgb565_toio(dst, dst_pitch, vmap, fb, clip, false);
> +			drm_fb_xrgb8888_to_rgb565_toio(dst[0].vaddr_iomem, dst_pitch[0],
> +						       vmap[0].vaddr, fb, clip, false);
>  			return 0;
>  		}
>  	} else if (dst_format == DRM_FORMAT_RGB888) {
>  		if (fb_format == DRM_FORMAT_XRGB8888) {
> -			drm_fb_xrgb8888_to_rgb888_toio(dst, dst_pitch, vmap, fb, clip);
> +			drm_fb_xrgb8888_to_rgb888_toio(dst[0].vaddr_iomem, dst_pitch[0],
> +						       vmap[0].vaddr, fb, clip);
>  			return 0;
>  		}
>  	} else if (dst_format == DRM_FORMAT_XRGB8888) {
>  		if (fb_format == DRM_FORMAT_RGB888) {
> -			drm_fb_rgb888_to_xrgb8888_toio(dst, dst_pitch, vmap, fb, clip);
> +			drm_fb_rgb888_to_xrgb8888_toio(dst[0].vaddr_iomem, dst_pitch[0],
> +						       vmap[0].vaddr, fb, clip);
>  			return 0;
>  		} else if (fb_format == DRM_FORMAT_RGB565) {
> -			drm_fb_rgb565_to_xrgb8888_toio(dst, dst_pitch, vmap, fb, clip);
> +			drm_fb_rgb565_to_xrgb8888_toio(dst[0].vaddr_iomem, dst_pitch[0],
> +						       vmap[0].vaddr, fb, clip);
>  			return 0;
>  		}
>  	} else if (dst_format == DRM_FORMAT_XRGB2101010) {
>  		if (fb_format == DRM_FORMAT_XRGB8888) {
> -			drm_fb_xrgb8888_to_xrgb2101010_toio(dst, dst_pitch, vmap, fb, clip);
> +			drm_fb_xrgb8888_to_xrgb2101010_toio(dst[0].vaddr_iomem, dst_pitch[0],
> +							    vmap[0].vaddr, fb, clip);
>  			return 0;
>  		}
>  	}
> @@ -612,8 +622,7 @@ int drm_fb_blit_toio(void __iomem *dst, unsigned int dst_pitch, uint32_t dst_for
>  
>  	return -EINVAL;
>  }
> -EXPORT_SYMBOL(drm_fb_blit_toio);
> -
> +EXPORT_SYMBOL(drm_fb_blit);
>  
>  static void drm_fb_gray8_to_mono_line(void *dbuf, const void *sbuf, unsigned int pixels)
>  {
> diff --git a/drivers/gpu/drm/tiny/simpledrm.c b/drivers/gpu/drm/tiny/simpledrm.c
> index 5422363690e7..1ec73bec0513 100644
> --- a/drivers/gpu/drm/tiny/simpledrm.c
> +++ b/drivers/gpu/drm/tiny/simpledrm.c
> @@ -652,9 +652,8 @@ simpledrm_simple_display_pipe_enable(struct drm_simple_display_pipe *pipe,
>  	struct simpledrm_device *sdev = simpledrm_device_of_dev(pipe->crtc.dev);
>  	struct drm_shadow_plane_state *shadow_plane_state = to_drm_shadow_plane_state(plane_state);
>  	struct drm_framebuffer *fb = plane_state->fb;
> -	void *vmap = shadow_plane_state->data[0].vaddr; /* TODO: Use mapping abstraction */
>  	struct drm_device *dev = &sdev->dev;
> -	void __iomem *dst = sdev->screen_base;
> +	struct iosys_map dst;
Maybe
struct iosys_map dst = IOSYS_MAP_INIT_VADDR(sdev->screen_base);

>  	struct drm_rect src_clip, dst_clip;
>  	int idx;
>  
> @@ -670,8 +669,10 @@ simpledrm_simple_display_pipe_enable(struct drm_simple_display_pipe *pipe,
>  	if (!drm_dev_enter(dev, &idx))
>  		return;
>  
> -	dst += drm_fb_clip_offset(sdev->pitch, sdev->format, &dst_clip);
> -	drm_fb_blit_toio(dst, sdev->pitch, sdev->format->format, vmap, fb, &src_clip);
> +	iosys_map_set_vaddr_iomem(&dst, sdev->screen_base);
> +	iosys_map_incr(&dst, drm_fb_clip_offset(sdev->pitch, sdev->format, &dst_clip));
> +	drm_fb_blit(&dst, &sdev->pitch, sdev->format->format,
> +		    shadow_plane_state->data, fb, &src_clip);
>  
>  	drm_dev_exit(idx);
>  }
> @@ -699,10 +700,9 @@ simpledrm_simple_display_pipe_update(struct drm_simple_display_pipe *pipe,
>  	struct simpledrm_device *sdev = simpledrm_device_of_dev(pipe->crtc.dev);
>  	struct drm_plane_state *plane_state = pipe->plane.state;
>  	struct drm_shadow_plane_state *shadow_plane_state = to_drm_shadow_plane_state(plane_state);
> -	void *vmap = shadow_plane_state->data[0].vaddr; /* TODO: Use mapping abstraction */
>  	struct drm_framebuffer *fb = plane_state->fb;
>  	struct drm_device *dev = &sdev->dev;
> -	void __iomem *dst = sdev->screen_base;
> +	struct iosys_map dst;
Likewise:
struct iosys_map dst = IOSYS_MAP_INIT_VADDR(sdev->screen_base);

>  	struct drm_rect src_clip, dst_clip;
>  	int idx;
>  
> @@ -719,8 +719,10 @@ simpledrm_simple_display_pipe_update(struct drm_simple_display_pipe *pipe,
>  	if (!drm_dev_enter(dev, &idx))
>  		return;
>  
> -	dst += drm_fb_clip_offset(sdev->pitch, sdev->format, &dst_clip);
> -	drm_fb_blit_toio(dst, sdev->pitch, sdev->format->format, vmap, fb, &src_clip);
> +	iosys_map_set_vaddr_iomem(&dst, sdev->screen_base);
> +	iosys_map_incr(&dst, drm_fb_clip_offset(sdev->pitch, sdev->format, &dst_clip));
> +	drm_fb_blit(&dst, &sdev->pitch, sdev->format->format,
> +		    shadow_plane_state->data, fb, &src_clip);
>  
>  	drm_dev_exit(idx);
>  }
> diff --git a/include/drm/drm_format_helper.h b/include/drm/drm_format_helper.h
> index 55145eca0782..21daea7fda99 100644
> --- a/include/drm/drm_format_helper.h
> +++ b/include/drm/drm_format_helper.h
> @@ -6,6 +6,7 @@
>  #ifndef __LINUX_DRM_FORMAT_HELPER_H
>  #define __LINUX_DRM_FORMAT_HELPER_H
>  
> +struct iosys_map;
>  struct drm_format_info;
>  struct drm_framebuffer;
>  struct drm_rect;
> @@ -39,9 +40,9 @@ void drm_fb_xrgb8888_to_xrgb2101010_toio(void __iomem *dst, unsigned int dst_pit
>  void drm_fb_xrgb8888_to_gray8(void *dst, unsigned int dst_pitch, const void *vaddr,
>  			      const struct drm_framebuffer *fb, const struct drm_rect *clip);
>  
> -int drm_fb_blit_toio(void __iomem *dst, unsigned int dst_pitch, uint32_t dst_format,
> -		     const void *vmap, const struct drm_framebuffer *fb,
> -		     const struct drm_rect *rect);
> +int drm_fb_blit(struct iosys_map *dst, const unsigned int *dst_pitch, uint32_t dst_format,
> +		const struct iosys_map *vmap, const struct drm_framebuffer *fb,
> +		const struct drm_rect *rect);
>  
>  void drm_fb_xrgb8888_to_mono(void *dst, unsigned int dst_pitch, const void *src,
>  			     const struct drm_framebuffer *fb, const struct drm_rect *clip);
> -- 
> 2.37.1

WARNING: multiple messages have this Message-ID (diff)
From: Sam Ravnborg <sam@ravnborg.org>
To: Thomas Zimmermann <tzimmermann@suse.de>
Cc: linux-hyperv@vger.kernel.org, david@lechnology.com,
	airlied@linux.ie, dri-devel@lists.freedesktop.org,
	javierm@redhat.com, virtualization@lists.linux-foundation.org,
	drawat.floss@gmail.com, noralf@tronnes.org, kraxel@redhat.com,
	jose.exposito89@gmail.com, airlied@redhat.com
Subject: Re: [PATCH 01/12] drm/format-helper: Provide drm_fb_blit()
Date: Thu, 4 Aug 2022 19:02:25 +0200	[thread overview]
Message-ID: <Yuv7oURk9RR4KOYV@ravnborg.org> (raw)
In-Reply-To: <20220727113312.22407-2-tzimmermann@suse.de>

Hi Thomas,

On Wed, Jul 27, 2022 at 01:33:01PM +0200, Thomas Zimmermann wrote:
> Provide drm_fb_blit() that works with struct iosys_map. Update all
> users of drm_fb_blit_toio(), which required a destination buffer in
> I/O memory. The new function's interface works with multi-plane
> color formats, although the implementation only supports a single
> plane for now.
> 
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> ---
>  drivers/gpu/drm/drm_format_helper.c | 39 ++++++++++++++++++-----------
>  drivers/gpu/drm/tiny/simpledrm.c    | 18 +++++++------
>  include/drm/drm_format_helper.h     |  7 +++---
>  3 files changed, 38 insertions(+), 26 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_format_helper.c b/drivers/gpu/drm/drm_format_helper.c
> index c6182b5de78b..4d74d46ab155 100644
> --- a/drivers/gpu/drm/drm_format_helper.c
> +++ b/drivers/gpu/drm/drm_format_helper.c
> @@ -8,9 +8,10 @@
>   * (at your option) any later version.
>   */
>  
> +#include <linux/io.h>
> +#include <linux/iosys-map.h>
>  #include <linux/module.h>
>  #include <linux/slab.h>
> -#include <linux/io.h>
>  
>  #include <drm/drm_device.h>
>  #include <drm/drm_format_helper.h>
> @@ -545,9 +546,9 @@ void drm_fb_xrgb8888_to_gray8(void *dst, unsigned int dst_pitch, const void *vad
>  EXPORT_SYMBOL(drm_fb_xrgb8888_to_gray8);
>  
>  /**
> - * drm_fb_blit_toio - Copy parts of a framebuffer to display memory
> - * @dst:	The display memory to copy to
> - * @dst_pitch:	Number of bytes between two consecutive scanlines within dst
> + * drm_fb_blit - Copy parts of a framebuffer to display memory
> + * @dst:	Array of display-memory addresses to copy to
> + * @dst_pitch:	Array of numbers of bytes between two consecutive scanlines within dst

The rename confused me since this function continue to operate only on
io memory, but I see that this is all fixed up in later patches.
It would be nice to have this mentioned in the changelog, just in case
someone else takes a deeper look at it.

With the changelog updated:
Reviewed-by: Sam Ravnborg <sam@ravnborg.org>

See also comments below.

>   * @dst_format:	FOURCC code of the display's color format
>   * @vmap:	The framebuffer memory to copy from
>   * @fb:		The framebuffer to copy from
> @@ -557,14 +558,18 @@ EXPORT_SYMBOL(drm_fb_xrgb8888_to_gray8);
>   * formats of the display and the framebuffer mismatch, the blit function
>   * will attempt to convert between them.
>   *
> + * The parameters @dst, @dst_pitch and @vmap refer to arrays. Each array must
> + * have at least as many entries as there are planes in @dst_format's format. Each
> + * entry stores the value for the format's respective color plane at the same index.
> + *
>   * Returns:
>   * 0 on success, or
>   * -EINVAL if the color-format conversion failed, or
>   * a negative error code otherwise.
>   */
> -int drm_fb_blit_toio(void __iomem *dst, unsigned int dst_pitch, uint32_t dst_format,
> -		     const void *vmap, const struct drm_framebuffer *fb,
> -		     const struct drm_rect *clip)
> +int drm_fb_blit(struct iosys_map *dst, const unsigned int *dst_pitch, uint32_t dst_format,
> +		const struct iosys_map *vmap, const struct drm_framebuffer *fb,
> +		const struct drm_rect *clip)
>  {
>  	uint32_t fb_format = fb->format->format;
>  
> @@ -579,30 +584,35 @@ int drm_fb_blit_toio(void __iomem *dst, unsigned int dst_pitch, uint32_t dst_for
>  		dst_format = DRM_FORMAT_XRGB2101010;
>  
>  	if (dst_format == fb_format) {
> -		drm_fb_memcpy_toio(dst, dst_pitch, vmap, fb, clip);
> +		drm_fb_memcpy_toio(dst[0].vaddr_iomem, dst_pitch[0], vmap[0].vaddr, fb, clip);
>  		return 0;
>  
>  	} else if (dst_format == DRM_FORMAT_RGB565) {
>  		if (fb_format == DRM_FORMAT_XRGB8888) {
> -			drm_fb_xrgb8888_to_rgb565_toio(dst, dst_pitch, vmap, fb, clip, false);
> +			drm_fb_xrgb8888_to_rgb565_toio(dst[0].vaddr_iomem, dst_pitch[0],
> +						       vmap[0].vaddr, fb, clip, false);
>  			return 0;
>  		}
>  	} else if (dst_format == DRM_FORMAT_RGB888) {
>  		if (fb_format == DRM_FORMAT_XRGB8888) {
> -			drm_fb_xrgb8888_to_rgb888_toio(dst, dst_pitch, vmap, fb, clip);
> +			drm_fb_xrgb8888_to_rgb888_toio(dst[0].vaddr_iomem, dst_pitch[0],
> +						       vmap[0].vaddr, fb, clip);
>  			return 0;
>  		}
>  	} else if (dst_format == DRM_FORMAT_XRGB8888) {
>  		if (fb_format == DRM_FORMAT_RGB888) {
> -			drm_fb_rgb888_to_xrgb8888_toio(dst, dst_pitch, vmap, fb, clip);
> +			drm_fb_rgb888_to_xrgb8888_toio(dst[0].vaddr_iomem, dst_pitch[0],
> +						       vmap[0].vaddr, fb, clip);
>  			return 0;
>  		} else if (fb_format == DRM_FORMAT_RGB565) {
> -			drm_fb_rgb565_to_xrgb8888_toio(dst, dst_pitch, vmap, fb, clip);
> +			drm_fb_rgb565_to_xrgb8888_toio(dst[0].vaddr_iomem, dst_pitch[0],
> +						       vmap[0].vaddr, fb, clip);
>  			return 0;
>  		}
>  	} else if (dst_format == DRM_FORMAT_XRGB2101010) {
>  		if (fb_format == DRM_FORMAT_XRGB8888) {
> -			drm_fb_xrgb8888_to_xrgb2101010_toio(dst, dst_pitch, vmap, fb, clip);
> +			drm_fb_xrgb8888_to_xrgb2101010_toio(dst[0].vaddr_iomem, dst_pitch[0],
> +							    vmap[0].vaddr, fb, clip);
>  			return 0;
>  		}
>  	}
> @@ -612,8 +622,7 @@ int drm_fb_blit_toio(void __iomem *dst, unsigned int dst_pitch, uint32_t dst_for
>  
>  	return -EINVAL;
>  }
> -EXPORT_SYMBOL(drm_fb_blit_toio);
> -
> +EXPORT_SYMBOL(drm_fb_blit);
>  
>  static void drm_fb_gray8_to_mono_line(void *dbuf, const void *sbuf, unsigned int pixels)
>  {
> diff --git a/drivers/gpu/drm/tiny/simpledrm.c b/drivers/gpu/drm/tiny/simpledrm.c
> index 5422363690e7..1ec73bec0513 100644
> --- a/drivers/gpu/drm/tiny/simpledrm.c
> +++ b/drivers/gpu/drm/tiny/simpledrm.c
> @@ -652,9 +652,8 @@ simpledrm_simple_display_pipe_enable(struct drm_simple_display_pipe *pipe,
>  	struct simpledrm_device *sdev = simpledrm_device_of_dev(pipe->crtc.dev);
>  	struct drm_shadow_plane_state *shadow_plane_state = to_drm_shadow_plane_state(plane_state);
>  	struct drm_framebuffer *fb = plane_state->fb;
> -	void *vmap = shadow_plane_state->data[0].vaddr; /* TODO: Use mapping abstraction */
>  	struct drm_device *dev = &sdev->dev;
> -	void __iomem *dst = sdev->screen_base;
> +	struct iosys_map dst;
Maybe
struct iosys_map dst = IOSYS_MAP_INIT_VADDR(sdev->screen_base);

>  	struct drm_rect src_clip, dst_clip;
>  	int idx;
>  
> @@ -670,8 +669,10 @@ simpledrm_simple_display_pipe_enable(struct drm_simple_display_pipe *pipe,
>  	if (!drm_dev_enter(dev, &idx))
>  		return;
>  
> -	dst += drm_fb_clip_offset(sdev->pitch, sdev->format, &dst_clip);
> -	drm_fb_blit_toio(dst, sdev->pitch, sdev->format->format, vmap, fb, &src_clip);
> +	iosys_map_set_vaddr_iomem(&dst, sdev->screen_base);
> +	iosys_map_incr(&dst, drm_fb_clip_offset(sdev->pitch, sdev->format, &dst_clip));
> +	drm_fb_blit(&dst, &sdev->pitch, sdev->format->format,
> +		    shadow_plane_state->data, fb, &src_clip);
>  
>  	drm_dev_exit(idx);
>  }
> @@ -699,10 +700,9 @@ simpledrm_simple_display_pipe_update(struct drm_simple_display_pipe *pipe,
>  	struct simpledrm_device *sdev = simpledrm_device_of_dev(pipe->crtc.dev);
>  	struct drm_plane_state *plane_state = pipe->plane.state;
>  	struct drm_shadow_plane_state *shadow_plane_state = to_drm_shadow_plane_state(plane_state);
> -	void *vmap = shadow_plane_state->data[0].vaddr; /* TODO: Use mapping abstraction */
>  	struct drm_framebuffer *fb = plane_state->fb;
>  	struct drm_device *dev = &sdev->dev;
> -	void __iomem *dst = sdev->screen_base;
> +	struct iosys_map dst;
Likewise:
struct iosys_map dst = IOSYS_MAP_INIT_VADDR(sdev->screen_base);

>  	struct drm_rect src_clip, dst_clip;
>  	int idx;
>  
> @@ -719,8 +719,10 @@ simpledrm_simple_display_pipe_update(struct drm_simple_display_pipe *pipe,
>  	if (!drm_dev_enter(dev, &idx))
>  		return;
>  
> -	dst += drm_fb_clip_offset(sdev->pitch, sdev->format, &dst_clip);
> -	drm_fb_blit_toio(dst, sdev->pitch, sdev->format->format, vmap, fb, &src_clip);
> +	iosys_map_set_vaddr_iomem(&dst, sdev->screen_base);
> +	iosys_map_incr(&dst, drm_fb_clip_offset(sdev->pitch, sdev->format, &dst_clip));
> +	drm_fb_blit(&dst, &sdev->pitch, sdev->format->format,
> +		    shadow_plane_state->data, fb, &src_clip);
>  
>  	drm_dev_exit(idx);
>  }
> diff --git a/include/drm/drm_format_helper.h b/include/drm/drm_format_helper.h
> index 55145eca0782..21daea7fda99 100644
> --- a/include/drm/drm_format_helper.h
> +++ b/include/drm/drm_format_helper.h
> @@ -6,6 +6,7 @@
>  #ifndef __LINUX_DRM_FORMAT_HELPER_H
>  #define __LINUX_DRM_FORMAT_HELPER_H
>  
> +struct iosys_map;
>  struct drm_format_info;
>  struct drm_framebuffer;
>  struct drm_rect;
> @@ -39,9 +40,9 @@ void drm_fb_xrgb8888_to_xrgb2101010_toio(void __iomem *dst, unsigned int dst_pit
>  void drm_fb_xrgb8888_to_gray8(void *dst, unsigned int dst_pitch, const void *vaddr,
>  			      const struct drm_framebuffer *fb, const struct drm_rect *clip);
>  
> -int drm_fb_blit_toio(void __iomem *dst, unsigned int dst_pitch, uint32_t dst_format,
> -		     const void *vmap, const struct drm_framebuffer *fb,
> -		     const struct drm_rect *rect);
> +int drm_fb_blit(struct iosys_map *dst, const unsigned int *dst_pitch, uint32_t dst_format,
> +		const struct iosys_map *vmap, const struct drm_framebuffer *fb,
> +		const struct drm_rect *rect);
>  
>  void drm_fb_xrgb8888_to_mono(void *dst, unsigned int dst_pitch, const void *src,
>  			     const struct drm_framebuffer *fb, const struct drm_rect *clip);
> -- 
> 2.37.1

WARNING: multiple messages have this Message-ID (diff)
From: Sam Ravnborg <sam@ravnborg.org>
To: Thomas Zimmermann <tzimmermann@suse.de>
Cc: linux-hyperv@vger.kernel.org, david@lechnology.com,
	airlied@linux.ie, dri-devel@lists.freedesktop.org,
	maarten.lankhorst@linux.intel.com, javierm@redhat.com,
	mripard@kernel.org, virtualization@lists.linux-foundation.org,
	drawat.floss@gmail.com, noralf@tronnes.org, daniel@ffwll.ch,
	jose.exposito89@gmail.com, airlied@redhat.com
Subject: Re: [PATCH 01/12] drm/format-helper: Provide drm_fb_blit()
Date: Thu, 4 Aug 2022 19:02:25 +0200	[thread overview]
Message-ID: <Yuv7oURk9RR4KOYV@ravnborg.org> (raw)
In-Reply-To: <20220727113312.22407-2-tzimmermann@suse.de>

Hi Thomas,

On Wed, Jul 27, 2022 at 01:33:01PM +0200, Thomas Zimmermann wrote:
> Provide drm_fb_blit() that works with struct iosys_map. Update all
> users of drm_fb_blit_toio(), which required a destination buffer in
> I/O memory. The new function's interface works with multi-plane
> color formats, although the implementation only supports a single
> plane for now.
> 
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> ---
>  drivers/gpu/drm/drm_format_helper.c | 39 ++++++++++++++++++-----------
>  drivers/gpu/drm/tiny/simpledrm.c    | 18 +++++++------
>  include/drm/drm_format_helper.h     |  7 +++---
>  3 files changed, 38 insertions(+), 26 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_format_helper.c b/drivers/gpu/drm/drm_format_helper.c
> index c6182b5de78b..4d74d46ab155 100644
> --- a/drivers/gpu/drm/drm_format_helper.c
> +++ b/drivers/gpu/drm/drm_format_helper.c
> @@ -8,9 +8,10 @@
>   * (at your option) any later version.
>   */
>  
> +#include <linux/io.h>
> +#include <linux/iosys-map.h>
>  #include <linux/module.h>
>  #include <linux/slab.h>
> -#include <linux/io.h>
>  
>  #include <drm/drm_device.h>
>  #include <drm/drm_format_helper.h>
> @@ -545,9 +546,9 @@ void drm_fb_xrgb8888_to_gray8(void *dst, unsigned int dst_pitch, const void *vad
>  EXPORT_SYMBOL(drm_fb_xrgb8888_to_gray8);
>  
>  /**
> - * drm_fb_blit_toio - Copy parts of a framebuffer to display memory
> - * @dst:	The display memory to copy to
> - * @dst_pitch:	Number of bytes between two consecutive scanlines within dst
> + * drm_fb_blit - Copy parts of a framebuffer to display memory
> + * @dst:	Array of display-memory addresses to copy to
> + * @dst_pitch:	Array of numbers of bytes between two consecutive scanlines within dst

The rename confused me since this function continue to operate only on
io memory, but I see that this is all fixed up in later patches.
It would be nice to have this mentioned in the changelog, just in case
someone else takes a deeper look at it.

With the changelog updated:
Reviewed-by: Sam Ravnborg <sam@ravnborg.org>

See also comments below.

>   * @dst_format:	FOURCC code of the display's color format
>   * @vmap:	The framebuffer memory to copy from
>   * @fb:		The framebuffer to copy from
> @@ -557,14 +558,18 @@ EXPORT_SYMBOL(drm_fb_xrgb8888_to_gray8);
>   * formats of the display and the framebuffer mismatch, the blit function
>   * will attempt to convert between them.
>   *
> + * The parameters @dst, @dst_pitch and @vmap refer to arrays. Each array must
> + * have at least as many entries as there are planes in @dst_format's format. Each
> + * entry stores the value for the format's respective color plane at the same index.
> + *
>   * Returns:
>   * 0 on success, or
>   * -EINVAL if the color-format conversion failed, or
>   * a negative error code otherwise.
>   */
> -int drm_fb_blit_toio(void __iomem *dst, unsigned int dst_pitch, uint32_t dst_format,
> -		     const void *vmap, const struct drm_framebuffer *fb,
> -		     const struct drm_rect *clip)
> +int drm_fb_blit(struct iosys_map *dst, const unsigned int *dst_pitch, uint32_t dst_format,
> +		const struct iosys_map *vmap, const struct drm_framebuffer *fb,
> +		const struct drm_rect *clip)
>  {
>  	uint32_t fb_format = fb->format->format;
>  
> @@ -579,30 +584,35 @@ int drm_fb_blit_toio(void __iomem *dst, unsigned int dst_pitch, uint32_t dst_for
>  		dst_format = DRM_FORMAT_XRGB2101010;
>  
>  	if (dst_format == fb_format) {
> -		drm_fb_memcpy_toio(dst, dst_pitch, vmap, fb, clip);
> +		drm_fb_memcpy_toio(dst[0].vaddr_iomem, dst_pitch[0], vmap[0].vaddr, fb, clip);
>  		return 0;
>  
>  	} else if (dst_format == DRM_FORMAT_RGB565) {
>  		if (fb_format == DRM_FORMAT_XRGB8888) {
> -			drm_fb_xrgb8888_to_rgb565_toio(dst, dst_pitch, vmap, fb, clip, false);
> +			drm_fb_xrgb8888_to_rgb565_toio(dst[0].vaddr_iomem, dst_pitch[0],
> +						       vmap[0].vaddr, fb, clip, false);
>  			return 0;
>  		}
>  	} else if (dst_format == DRM_FORMAT_RGB888) {
>  		if (fb_format == DRM_FORMAT_XRGB8888) {
> -			drm_fb_xrgb8888_to_rgb888_toio(dst, dst_pitch, vmap, fb, clip);
> +			drm_fb_xrgb8888_to_rgb888_toio(dst[0].vaddr_iomem, dst_pitch[0],
> +						       vmap[0].vaddr, fb, clip);
>  			return 0;
>  		}
>  	} else if (dst_format == DRM_FORMAT_XRGB8888) {
>  		if (fb_format == DRM_FORMAT_RGB888) {
> -			drm_fb_rgb888_to_xrgb8888_toio(dst, dst_pitch, vmap, fb, clip);
> +			drm_fb_rgb888_to_xrgb8888_toio(dst[0].vaddr_iomem, dst_pitch[0],
> +						       vmap[0].vaddr, fb, clip);
>  			return 0;
>  		} else if (fb_format == DRM_FORMAT_RGB565) {
> -			drm_fb_rgb565_to_xrgb8888_toio(dst, dst_pitch, vmap, fb, clip);
> +			drm_fb_rgb565_to_xrgb8888_toio(dst[0].vaddr_iomem, dst_pitch[0],
> +						       vmap[0].vaddr, fb, clip);
>  			return 0;
>  		}
>  	} else if (dst_format == DRM_FORMAT_XRGB2101010) {
>  		if (fb_format == DRM_FORMAT_XRGB8888) {
> -			drm_fb_xrgb8888_to_xrgb2101010_toio(dst, dst_pitch, vmap, fb, clip);
> +			drm_fb_xrgb8888_to_xrgb2101010_toio(dst[0].vaddr_iomem, dst_pitch[0],
> +							    vmap[0].vaddr, fb, clip);
>  			return 0;
>  		}
>  	}
> @@ -612,8 +622,7 @@ int drm_fb_blit_toio(void __iomem *dst, unsigned int dst_pitch, uint32_t dst_for
>  
>  	return -EINVAL;
>  }
> -EXPORT_SYMBOL(drm_fb_blit_toio);
> -
> +EXPORT_SYMBOL(drm_fb_blit);
>  
>  static void drm_fb_gray8_to_mono_line(void *dbuf, const void *sbuf, unsigned int pixels)
>  {
> diff --git a/drivers/gpu/drm/tiny/simpledrm.c b/drivers/gpu/drm/tiny/simpledrm.c
> index 5422363690e7..1ec73bec0513 100644
> --- a/drivers/gpu/drm/tiny/simpledrm.c
> +++ b/drivers/gpu/drm/tiny/simpledrm.c
> @@ -652,9 +652,8 @@ simpledrm_simple_display_pipe_enable(struct drm_simple_display_pipe *pipe,
>  	struct simpledrm_device *sdev = simpledrm_device_of_dev(pipe->crtc.dev);
>  	struct drm_shadow_plane_state *shadow_plane_state = to_drm_shadow_plane_state(plane_state);
>  	struct drm_framebuffer *fb = plane_state->fb;
> -	void *vmap = shadow_plane_state->data[0].vaddr; /* TODO: Use mapping abstraction */
>  	struct drm_device *dev = &sdev->dev;
> -	void __iomem *dst = sdev->screen_base;
> +	struct iosys_map dst;
Maybe
struct iosys_map dst = IOSYS_MAP_INIT_VADDR(sdev->screen_base);

>  	struct drm_rect src_clip, dst_clip;
>  	int idx;
>  
> @@ -670,8 +669,10 @@ simpledrm_simple_display_pipe_enable(struct drm_simple_display_pipe *pipe,
>  	if (!drm_dev_enter(dev, &idx))
>  		return;
>  
> -	dst += drm_fb_clip_offset(sdev->pitch, sdev->format, &dst_clip);
> -	drm_fb_blit_toio(dst, sdev->pitch, sdev->format->format, vmap, fb, &src_clip);
> +	iosys_map_set_vaddr_iomem(&dst, sdev->screen_base);
> +	iosys_map_incr(&dst, drm_fb_clip_offset(sdev->pitch, sdev->format, &dst_clip));
> +	drm_fb_blit(&dst, &sdev->pitch, sdev->format->format,
> +		    shadow_plane_state->data, fb, &src_clip);
>  
>  	drm_dev_exit(idx);
>  }
> @@ -699,10 +700,9 @@ simpledrm_simple_display_pipe_update(struct drm_simple_display_pipe *pipe,
>  	struct simpledrm_device *sdev = simpledrm_device_of_dev(pipe->crtc.dev);
>  	struct drm_plane_state *plane_state = pipe->plane.state;
>  	struct drm_shadow_plane_state *shadow_plane_state = to_drm_shadow_plane_state(plane_state);
> -	void *vmap = shadow_plane_state->data[0].vaddr; /* TODO: Use mapping abstraction */
>  	struct drm_framebuffer *fb = plane_state->fb;
>  	struct drm_device *dev = &sdev->dev;
> -	void __iomem *dst = sdev->screen_base;
> +	struct iosys_map dst;
Likewise:
struct iosys_map dst = IOSYS_MAP_INIT_VADDR(sdev->screen_base);

>  	struct drm_rect src_clip, dst_clip;
>  	int idx;
>  
> @@ -719,8 +719,10 @@ simpledrm_simple_display_pipe_update(struct drm_simple_display_pipe *pipe,
>  	if (!drm_dev_enter(dev, &idx))
>  		return;
>  
> -	dst += drm_fb_clip_offset(sdev->pitch, sdev->format, &dst_clip);
> -	drm_fb_blit_toio(dst, sdev->pitch, sdev->format->format, vmap, fb, &src_clip);
> +	iosys_map_set_vaddr_iomem(&dst, sdev->screen_base);
> +	iosys_map_incr(&dst, drm_fb_clip_offset(sdev->pitch, sdev->format, &dst_clip));
> +	drm_fb_blit(&dst, &sdev->pitch, sdev->format->format,
> +		    shadow_plane_state->data, fb, &src_clip);
>  
>  	drm_dev_exit(idx);
>  }
> diff --git a/include/drm/drm_format_helper.h b/include/drm/drm_format_helper.h
> index 55145eca0782..21daea7fda99 100644
> --- a/include/drm/drm_format_helper.h
> +++ b/include/drm/drm_format_helper.h
> @@ -6,6 +6,7 @@
>  #ifndef __LINUX_DRM_FORMAT_HELPER_H
>  #define __LINUX_DRM_FORMAT_HELPER_H
>  
> +struct iosys_map;
>  struct drm_format_info;
>  struct drm_framebuffer;
>  struct drm_rect;
> @@ -39,9 +40,9 @@ void drm_fb_xrgb8888_to_xrgb2101010_toio(void __iomem *dst, unsigned int dst_pit
>  void drm_fb_xrgb8888_to_gray8(void *dst, unsigned int dst_pitch, const void *vaddr,
>  			      const struct drm_framebuffer *fb, const struct drm_rect *clip);
>  
> -int drm_fb_blit_toio(void __iomem *dst, unsigned int dst_pitch, uint32_t dst_format,
> -		     const void *vmap, const struct drm_framebuffer *fb,
> -		     const struct drm_rect *rect);
> +int drm_fb_blit(struct iosys_map *dst, const unsigned int *dst_pitch, uint32_t dst_format,
> +		const struct iosys_map *vmap, const struct drm_framebuffer *fb,
> +		const struct drm_rect *rect);
>  
>  void drm_fb_xrgb8888_to_mono(void *dst, unsigned int dst_pitch, const void *src,
>  			     const struct drm_framebuffer *fb, const struct drm_rect *clip);
> -- 
> 2.37.1
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

  reply	other threads:[~2022-08-04 17:02 UTC|newest]

Thread overview: 103+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-07-27 11:33 [PATCH 00/12] drm/format-helper: Move to struct iosys_map Thomas Zimmermann
2022-07-27 11:33 ` Thomas Zimmermann
2022-07-27 11:33 ` Thomas Zimmermann
2022-07-27 11:33 ` [PATCH 01/12] drm/format-helper: Provide drm_fb_blit() Thomas Zimmermann
2022-07-27 11:33   ` Thomas Zimmermann
2022-07-27 11:33   ` Thomas Zimmermann
2022-08-04 17:02   ` Sam Ravnborg [this message]
2022-08-04 17:02     ` Sam Ravnborg
2022-08-04 17:02     ` Sam Ravnborg
2022-07-27 11:33 ` [PATCH 02/12] drm/format-helper: Merge drm_fb_memcpy() and drm_fb_memcpy_toio() Thomas Zimmermann
2022-07-27 11:33   ` Thomas Zimmermann
2022-07-27 11:33   ` Thomas Zimmermann
2022-08-04 19:52   ` Sam Ravnborg
2022-08-04 19:52     ` Sam Ravnborg
2022-08-04 19:52     ` Sam Ravnborg
2022-08-08 12:07     ` Thomas Zimmermann
2022-08-08 12:07       ` Thomas Zimmermann
2022-08-08 12:07       ` Thomas Zimmermann
2022-07-27 11:33 ` [PATCH 03/12] drm/format-helper: Convert drm_fb_swab() to struct iosys_map Thomas Zimmermann
2022-07-27 11:33   ` Thomas Zimmermann
2022-07-27 11:33   ` Thomas Zimmermann
2022-08-04 20:08   ` Sam Ravnborg
2022-08-04 20:08     ` Sam Ravnborg
2022-08-04 20:08     ` Sam Ravnborg
2022-07-27 11:33 ` [PATCH 04/12] drm/format-helper: Rework XRGB8888-to-RGBG332 conversion Thomas Zimmermann
2022-07-27 11:33   ` Thomas Zimmermann
2022-07-27 11:33   ` Thomas Zimmermann
2022-07-28  7:13   ` José Expósito
2022-07-28  7:13     ` José Expósito
2022-07-28  7:27     ` Thomas Zimmermann
2022-07-28  7:27       ` Thomas Zimmermann
2022-07-28  7:27       ` Thomas Zimmermann
2022-07-28 17:47       ` José Expósito
2022-07-28 17:47         ` José Expósito
2022-08-04 20:10   ` Sam Ravnborg
2022-08-04 20:10     ` Sam Ravnborg
2022-08-04 20:10     ` Sam Ravnborg
2022-07-27 11:33 ` [PATCH 05/12] drm/format-helper: Rework XRGB8888-to-RGBG565 conversion Thomas Zimmermann
2022-07-27 11:33   ` Thomas Zimmermann
2022-07-27 11:33   ` Thomas Zimmermann
2022-07-30 12:27   ` José Expósito
2022-07-30 12:27     ` José Expósito
2022-08-04 20:12   ` Sam Ravnborg
2022-08-04 20:12     ` Sam Ravnborg
2022-08-04 20:12     ` Sam Ravnborg
2022-07-27 11:33 ` [PATCH 06/12] drm/format-helper: Rework XRGB8888-to-RGB888 conversion Thomas Zimmermann
2022-07-27 11:33   ` Thomas Zimmermann
2022-07-27 11:33   ` Thomas Zimmermann
2022-08-04 20:14   ` Sam Ravnborg
2022-08-04 20:14     ` Sam Ravnborg
2022-08-04 20:14     ` Sam Ravnborg
2022-07-27 11:33 ` [PATCH 07/12] drm/format-helper: Rework RGB565-to-XRGB8888 conversion Thomas Zimmermann
2022-07-27 11:33   ` Thomas Zimmermann
2022-07-27 11:33   ` Thomas Zimmermann
2022-08-04 20:15   ` Sam Ravnborg
2022-08-04 20:15     ` Sam Ravnborg
2022-08-04 20:15     ` Sam Ravnborg
2022-07-27 11:33 ` [PATCH 08/12] drm/format-helper: Rework RGB888-to-XRGB8888 conversion Thomas Zimmermann
2022-07-27 11:33   ` Thomas Zimmermann
2022-07-27 11:33   ` Thomas Zimmermann
2022-08-04 20:16   ` Sam Ravnborg
2022-08-04 20:16     ` Sam Ravnborg
2022-08-04 20:16     ` Sam Ravnborg
2022-07-27 11:33 ` [PATCH 09/12] drm/format-helper: Rework XRGB8888-to-XRGB2101010 conversion Thomas Zimmermann
2022-07-27 11:33   ` Thomas Zimmermann
2022-07-27 11:33   ` Thomas Zimmermann
2022-08-04 20:17   ` Sam Ravnborg
2022-08-04 20:17     ` Sam Ravnborg
2022-08-04 20:17     ` Sam Ravnborg
2022-07-27 11:33 ` [PATCH 10/12] drm/format-helper: Rework XRGB8888-to-GRAY8 conversion Thomas Zimmermann
2022-07-27 11:33   ` Thomas Zimmermann
2022-07-27 11:33   ` Thomas Zimmermann
2022-08-04 20:19   ` Sam Ravnborg
2022-08-04 20:19     ` Sam Ravnborg
2022-08-04 20:19     ` Sam Ravnborg
2022-07-27 11:33 ` [PATCH 11/12] drm/format-helper: Rework XRGB8888-to-MONO conversion Thomas Zimmermann
2022-07-27 11:33   ` Thomas Zimmermann
2022-07-27 11:33   ` Thomas Zimmermann
2022-08-04 20:21   ` Sam Ravnborg
2022-08-04 20:21     ` Sam Ravnborg
2022-08-04 20:21     ` Sam Ravnborg
2022-07-27 11:33 ` [PATCH 12/12] drm/format-helper: Move destination-buffer handling into internal helper Thomas Zimmermann
2022-07-27 11:33   ` Thomas Zimmermann
2022-07-27 11:33   ` Thomas Zimmermann
2022-07-28  7:26   ` José Expósito
2022-07-28  7:26     ` José Expósito
2022-07-28  7:45     ` Thomas Zimmermann
2022-07-28  7:45       ` Thomas Zimmermann
2022-07-28  7:45       ` Thomas Zimmermann
2022-07-28 18:23       ` José Expósito
2022-07-28 18:23         ` José Expósito
2022-08-05 17:52   ` Sam Ravnborg
2022-08-05 17:52     ` Sam Ravnborg
2022-08-05 17:52     ` Sam Ravnborg
2022-08-08 11:40     ` Thomas Zimmermann
2022-08-08 11:40       ` Thomas Zimmermann
2022-08-08 11:40       ` Thomas Zimmermann
2022-08-08 18:25       ` Sam Ravnborg
2022-08-08 18:25         ` Sam Ravnborg
2022-08-08 18:25         ` Sam Ravnborg
2022-08-05 17:59 ` [PATCH 00/12] drm/format-helper: Move to struct iosys_map Sam Ravnborg
2022-08-05 17:59   ` Sam Ravnborg
2022-08-05 17:59   ` Sam Ravnborg

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=Yuv7oURk9RR4KOYV@ravnborg.org \
    --to=sam@ravnborg.org \
    --cc=airlied@linux.ie \
    --cc=airlied@redhat.com \
    --cc=daniel@ffwll.ch \
    --cc=david@lechnology.com \
    --cc=drawat.floss@gmail.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=javierm@redhat.com \
    --cc=jose.exposito89@gmail.com \
    --cc=kraxel@redhat.com \
    --cc=linux-hyperv@vger.kernel.org \
    --cc=maarten.lankhorst@linux.intel.com \
    --cc=mripard@kernel.org \
    --cc=noralf@tronnes.org \
    --cc=tzimmermann@suse.de \
    --cc=virtualization@lists.linux-foundation.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.