mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-17 18:36:00 +00:00
drm/fbdev-generic: Implement dedicated fbdev I/O helpers
Implement dedicated fbdev helpers for framebuffer I/O instead of using DRM's helpers. Use an fbdev generator macro for deferred I/O to create the callbacks. Fbdev-generic was the only caller of the DRM helpers, so remove them from the helper module. v4: * generate deferred-I/O helpers * use initializer macros for fb_ops v2: * use FB_SYS_HELPERS_DEFERRED option Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> Tested-by: Sui Jingfeng <suijingfeng@loongson.cn> Reviewed-by: Sui Jingfeng <suijingfeng@loongson.cn> Link: https://patchwork.freedesktop.org/patch/msgid/20230530151228.22979-13-tzimmermann@suse.de
This commit is contained in:
parent
4a2262c121
commit
c6baad68d4
@ -95,6 +95,7 @@ config DRM_KUNIT_TEST
|
|||||||
config DRM_KMS_HELPER
|
config DRM_KMS_HELPER
|
||||||
tristate
|
tristate
|
||||||
depends on DRM
|
depends on DRM
|
||||||
|
select FB_SYS_HELPERS_DEFERRED if DRM_FBDEV_EMULATION
|
||||||
help
|
help
|
||||||
CRTC helpers for KMS drivers.
|
CRTC helpers for KMS drivers.
|
||||||
|
|
||||||
@ -135,11 +136,6 @@ config DRM_FBDEV_EMULATION
|
|||||||
select FB_CFB_FILLRECT
|
select FB_CFB_FILLRECT
|
||||||
select FB_CFB_COPYAREA
|
select FB_CFB_COPYAREA
|
||||||
select FB_CFB_IMAGEBLIT
|
select FB_CFB_IMAGEBLIT
|
||||||
select FB_DEFERRED_IO
|
|
||||||
select FB_SYS_FOPS
|
|
||||||
select FB_SYS_FILLRECT
|
|
||||||
select FB_SYS_COPYAREA
|
|
||||||
select FB_SYS_IMAGEBLIT
|
|
||||||
select FRAMEBUFFER_CONSOLE if !EXPERT
|
select FRAMEBUFFER_CONSOLE if !EXPERT
|
||||||
select FRAMEBUFFER_CONSOLE_DETECT_PRIMARY if FRAMEBUFFER_CONSOLE
|
select FRAMEBUFFER_CONSOLE_DETECT_PRIMARY if FRAMEBUFFER_CONSOLE
|
||||||
default y
|
default y
|
||||||
|
@ -736,113 +736,6 @@ void drm_fb_helper_deferred_io(struct fb_info *info, struct list_head *pagerefli
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(drm_fb_helper_deferred_io);
|
EXPORT_SYMBOL(drm_fb_helper_deferred_io);
|
||||||
|
|
||||||
/**
|
|
||||||
* drm_fb_helper_sys_read - Implements struct &fb_ops.fb_read for system memory
|
|
||||||
* @info: fb_info struct pointer
|
|
||||||
* @buf: userspace buffer to read from framebuffer memory
|
|
||||||
* @count: number of bytes to read from framebuffer memory
|
|
||||||
* @ppos: read offset within framebuffer memory
|
|
||||||
*
|
|
||||||
* Returns:
|
|
||||||
* The number of bytes read on success, or an error code otherwise.
|
|
||||||
*/
|
|
||||||
ssize_t drm_fb_helper_sys_read(struct fb_info *info, char __user *buf,
|
|
||||||
size_t count, loff_t *ppos)
|
|
||||||
{
|
|
||||||
return fb_sys_read(info, buf, count, ppos);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(drm_fb_helper_sys_read);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* drm_fb_helper_sys_write - Implements struct &fb_ops.fb_write for system memory
|
|
||||||
* @info: fb_info struct pointer
|
|
||||||
* @buf: userspace buffer to write to framebuffer memory
|
|
||||||
* @count: number of bytes to write to framebuffer memory
|
|
||||||
* @ppos: write offset within framebuffer memory
|
|
||||||
*
|
|
||||||
* Returns:
|
|
||||||
* The number of bytes written on success, or an error code otherwise.
|
|
||||||
*/
|
|
||||||
ssize_t drm_fb_helper_sys_write(struct fb_info *info, const char __user *buf,
|
|
||||||
size_t count, loff_t *ppos)
|
|
||||||
{
|
|
||||||
struct drm_fb_helper *helper = info->par;
|
|
||||||
loff_t pos = *ppos;
|
|
||||||
ssize_t ret;
|
|
||||||
struct drm_rect damage_area;
|
|
||||||
|
|
||||||
ret = fb_sys_write(info, buf, count, ppos);
|
|
||||||
if (ret <= 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
if (helper->funcs->fb_dirty) {
|
|
||||||
drm_fb_helper_memory_range_to_clip(info, pos, ret, &damage_area);
|
|
||||||
drm_fb_helper_damage(helper, damage_area.x1, damage_area.y1,
|
|
||||||
drm_rect_width(&damage_area),
|
|
||||||
drm_rect_height(&damage_area));
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(drm_fb_helper_sys_write);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* drm_fb_helper_sys_fillrect - wrapper around sys_fillrect
|
|
||||||
* @info: fbdev registered by the helper
|
|
||||||
* @rect: info about rectangle to fill
|
|
||||||
*
|
|
||||||
* A wrapper around sys_fillrect implemented by fbdev core
|
|
||||||
*/
|
|
||||||
void drm_fb_helper_sys_fillrect(struct fb_info *info,
|
|
||||||
const struct fb_fillrect *rect)
|
|
||||||
{
|
|
||||||
struct drm_fb_helper *helper = info->par;
|
|
||||||
|
|
||||||
sys_fillrect(info, rect);
|
|
||||||
|
|
||||||
if (helper->funcs->fb_dirty)
|
|
||||||
drm_fb_helper_damage(helper, rect->dx, rect->dy, rect->width, rect->height);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(drm_fb_helper_sys_fillrect);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* drm_fb_helper_sys_copyarea - wrapper around sys_copyarea
|
|
||||||
* @info: fbdev registered by the helper
|
|
||||||
* @area: info about area to copy
|
|
||||||
*
|
|
||||||
* A wrapper around sys_copyarea implemented by fbdev core
|
|
||||||
*/
|
|
||||||
void drm_fb_helper_sys_copyarea(struct fb_info *info,
|
|
||||||
const struct fb_copyarea *area)
|
|
||||||
{
|
|
||||||
struct drm_fb_helper *helper = info->par;
|
|
||||||
|
|
||||||
sys_copyarea(info, area);
|
|
||||||
|
|
||||||
if (helper->funcs->fb_dirty)
|
|
||||||
drm_fb_helper_damage(helper, area->dx, area->dy, area->width, area->height);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(drm_fb_helper_sys_copyarea);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* drm_fb_helper_sys_imageblit - wrapper around sys_imageblit
|
|
||||||
* @info: fbdev registered by the helper
|
|
||||||
* @image: info about image to blit
|
|
||||||
*
|
|
||||||
* A wrapper around sys_imageblit implemented by fbdev core
|
|
||||||
*/
|
|
||||||
void drm_fb_helper_sys_imageblit(struct fb_info *info,
|
|
||||||
const struct fb_image *image)
|
|
||||||
{
|
|
||||||
struct drm_fb_helper *helper = info->par;
|
|
||||||
|
|
||||||
sys_imageblit(info, image);
|
|
||||||
|
|
||||||
if (helper->funcs->fb_dirty)
|
|
||||||
drm_fb_helper_damage(helper, image->dx, image->dy, image->width, image->height);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(drm_fb_helper_sys_imageblit);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* drm_fb_helper_cfb_read - Implements struct &fb_ops.fb_read for I/O memory
|
* drm_fb_helper_cfb_read - Implements struct &fb_ops.fb_read for I/O memory
|
||||||
* @info: fb_info struct pointer
|
* @info: fb_info struct pointer
|
||||||
|
@ -34,6 +34,10 @@ static int drm_fbdev_generic_fb_release(struct fb_info *info, int user)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FB_GEN_DEFAULT_DEFERRED_SYS_OPS(drm_fbdev_generic,
|
||||||
|
drm_fb_helper_damage_range,
|
||||||
|
drm_fb_helper_damage_area);
|
||||||
|
|
||||||
static void drm_fbdev_generic_fb_destroy(struct fb_info *info)
|
static void drm_fbdev_generic_fb_destroy(struct fb_info *info)
|
||||||
{
|
{
|
||||||
struct drm_fb_helper *fb_helper = info->par;
|
struct drm_fb_helper *fb_helper = info->par;
|
||||||
@ -56,13 +60,8 @@ static const struct fb_ops drm_fbdev_generic_fb_ops = {
|
|||||||
.owner = THIS_MODULE,
|
.owner = THIS_MODULE,
|
||||||
.fb_open = drm_fbdev_generic_fb_open,
|
.fb_open = drm_fbdev_generic_fb_open,
|
||||||
.fb_release = drm_fbdev_generic_fb_release,
|
.fb_release = drm_fbdev_generic_fb_release,
|
||||||
.fb_read = drm_fb_helper_sys_read,
|
FB_DEFAULT_DEFERRED_OPS(drm_fbdev_generic),
|
||||||
.fb_write = drm_fb_helper_sys_write,
|
|
||||||
DRM_FB_HELPER_DEFAULT_OPS,
|
DRM_FB_HELPER_DEFAULT_OPS,
|
||||||
.fb_fillrect = drm_fb_helper_sys_fillrect,
|
|
||||||
.fb_copyarea = drm_fb_helper_sys_copyarea,
|
|
||||||
.fb_imageblit = drm_fb_helper_sys_imageblit,
|
|
||||||
.fb_mmap = fb_deferred_io_mmap,
|
|
||||||
.fb_destroy = drm_fbdev_generic_fb_destroy,
|
.fb_destroy = drm_fbdev_generic_fb_destroy,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -258,18 +258,6 @@ void drm_fb_helper_damage_area(struct fb_info *info, u32 x, u32 y, u32 width, u3
|
|||||||
|
|
||||||
void drm_fb_helper_deferred_io(struct fb_info *info, struct list_head *pagereflist);
|
void drm_fb_helper_deferred_io(struct fb_info *info, struct list_head *pagereflist);
|
||||||
|
|
||||||
ssize_t drm_fb_helper_sys_read(struct fb_info *info, char __user *buf,
|
|
||||||
size_t count, loff_t *ppos);
|
|
||||||
ssize_t drm_fb_helper_sys_write(struct fb_info *info, const char __user *buf,
|
|
||||||
size_t count, loff_t *ppos);
|
|
||||||
|
|
||||||
void drm_fb_helper_sys_fillrect(struct fb_info *info,
|
|
||||||
const struct fb_fillrect *rect);
|
|
||||||
void drm_fb_helper_sys_copyarea(struct fb_info *info,
|
|
||||||
const struct fb_copyarea *area);
|
|
||||||
void drm_fb_helper_sys_imageblit(struct fb_info *info,
|
|
||||||
const struct fb_image *image);
|
|
||||||
|
|
||||||
ssize_t drm_fb_helper_cfb_read(struct fb_info *info, char __user *buf,
|
ssize_t drm_fb_helper_cfb_read(struct fb_info *info, char __user *buf,
|
||||||
size_t count, loff_t *ppos);
|
size_t count, loff_t *ppos);
|
||||||
ssize_t drm_fb_helper_cfb_write(struct fb_info *info, const char __user *buf,
|
ssize_t drm_fb_helper_cfb_write(struct fb_info *info, const char __user *buf,
|
||||||
@ -397,35 +385,6 @@ static inline int drm_fb_helper_defio_init(struct drm_fb_helper *fb_helper)
|
|||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline ssize_t drm_fb_helper_sys_read(struct fb_info *info,
|
|
||||||
char __user *buf, size_t count,
|
|
||||||
loff_t *ppos)
|
|
||||||
{
|
|
||||||
return -ENODEV;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline ssize_t drm_fb_helper_sys_write(struct fb_info *info,
|
|
||||||
const char __user *buf,
|
|
||||||
size_t count, loff_t *ppos)
|
|
||||||
{
|
|
||||||
return -ENODEV;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void drm_fb_helper_sys_fillrect(struct fb_info *info,
|
|
||||||
const struct fb_fillrect *rect)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void drm_fb_helper_sys_copyarea(struct fb_info *info,
|
|
||||||
const struct fb_copyarea *area)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void drm_fb_helper_sys_imageblit(struct fb_info *info,
|
|
||||||
const struct fb_image *image)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline ssize_t drm_fb_helper_cfb_read(struct fb_info *info, char __user *buf,
|
static inline ssize_t drm_fb_helper_cfb_read(struct fb_info *info, char __user *buf,
|
||||||
size_t count, loff_t *ppos)
|
size_t count, loff_t *ppos)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user