video: Add helpers for vidconsole for the copy framebuffer

Add a convenience function to call video_sync_copy() for a vidconsole.
Also add a memmove() helper, which does the memmove() as well as the sync.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Anatolij Gustschin <agust@denx.de>
Tested-by: Bin Meng <bmeng.cn@gmail.com>
This commit is contained in:
Simon Glass 2020-07-02 21:12:23 -06:00 committed by Bin Meng
parent 138dfea86f
commit 8c0b5d268d
2 changed files with 65 additions and 0 deletions

View file

@ -629,6 +629,22 @@ UCLASS_DRIVER(vidconsole) = {
.per_device_auto_alloc_size = sizeof(struct vidconsole_priv),
};
#ifdef CONFIG_VIDEO_COPY
int vidconsole_sync_copy(struct udevice *dev, void *from, void *to)
{
struct udevice *vid = dev_get_parent(dev);
return video_sync_copy(vid, from, to);
}
int vidconsole_memmove(struct udevice *dev, void *dst, const void *src,
int size)
{
memmove(dst, src, size);
return vidconsole_sync_copy(dev, dst, dst + size);
}
#endif
#if CONFIG_IS_ENABLED(CMD_VIDCONSOLE)
void vidconsole_position_cursor(struct udevice *dev, unsigned col, unsigned row)
{

View file

@ -256,4 +256,53 @@ void vidconsole_position_cursor(struct udevice *dev, unsigned col,
*/
u32 vid_console_color(struct video_priv *priv, unsigned int idx);
#ifdef CONFIG_VIDEO_COPY
/**
* vidconsole_sync_copy() - Sync back to the copy framebuffer
*
* This ensures that the copy framebuffer has the same data as the framebuffer
* for a particular region. It should be called after the framebuffer is updated
*
* @from and @to can be in either order. The region between them is synced.
*
* @dev: Vidconsole device being updated
* @from: Start/end address within the framebuffer (->fb)
* @to: Other address within the frame buffer
* @return 0 if OK, -EFAULT if the start address is before the start of the
* frame buffer start
*/
int vidconsole_sync_copy(struct udevice *dev, void *from, void *to);
/**
* vidconsole_memmove() - Perform a memmove() within the frame buffer
*
* This handles a memmove(), e.g. for scrolling. It also updates the copy
* framebuffer.
*
* @dev: Vidconsole device being updated
* @dst: Destination address within the framebuffer (->fb)
* @src: Source address within the framebuffer (->fb)
* @size: Number of bytes to transfer
* @return 0 if OK, -EFAULT if the start address is before the start of the
* frame buffer start
*/
int vidconsole_memmove(struct udevice *dev, void *dst, const void *src,
int size);
#else
static inline int vidconsole_sync_copy(struct udevice *dev, void *from,
void *to)
{
return 0;
}
static inline int vidconsole_memmove(struct udevice *dev, void *dst,
const void *src, int size)
{
memmove(dst, src, size);
return 0;
}
#endif
#endif