Commit f06a4da3 authored by Dave Airlie's avatar Dave Airlie

Merge tag 'drm-misc-next-fixes-2022-12-08' of...

Merge tag 'drm-misc-next-fixes-2022-12-08' of git://anongit.freedesktop.org/drm/drm-misc into drm-next

Some deferred-io and damage worker reworks revert and make a fb function
static
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>

From: Maxime Ripard <maxime@cerno.tech>
Link: https://patchwork.freedesktop.org/patch/msgid/20221208084040.yw4zavsjd25qsltf@houat
parents b2268e26 b02897e5
...@@ -403,6 +403,13 @@ static void drm_fb_helper_fb_dirty(struct drm_fb_helper *helper) ...@@ -403,6 +403,13 @@ static void drm_fb_helper_fb_dirty(struct drm_fb_helper *helper)
spin_unlock_irqrestore(&helper->damage_lock, flags); spin_unlock_irqrestore(&helper->damage_lock, flags);
} }
static void drm_fb_helper_damage_work(struct work_struct *work)
{
struct drm_fb_helper *helper = container_of(work, struct drm_fb_helper, damage_work);
drm_fb_helper_fb_dirty(helper);
}
/** /**
* drm_fb_helper_prepare - setup a drm_fb_helper structure * drm_fb_helper_prepare - setup a drm_fb_helper structure
* @dev: DRM device * @dev: DRM device
...@@ -418,6 +425,7 @@ void drm_fb_helper_prepare(struct drm_device *dev, struct drm_fb_helper *helper, ...@@ -418,6 +425,7 @@ void drm_fb_helper_prepare(struct drm_device *dev, struct drm_fb_helper *helper,
INIT_LIST_HEAD(&helper->kernel_fb_list); INIT_LIST_HEAD(&helper->kernel_fb_list);
spin_lock_init(&helper->damage_lock); spin_lock_init(&helper->damage_lock);
INIT_WORK(&helper->resume_work, drm_fb_helper_resume_worker); INIT_WORK(&helper->resume_work, drm_fb_helper_resume_worker);
INIT_WORK(&helper->damage_work, drm_fb_helper_damage_work);
helper->damage_clip.x1 = helper->damage_clip.y1 = ~0; helper->damage_clip.x1 = helper->damage_clip.y1 = ~0;
mutex_init(&helper->lock); mutex_init(&helper->lock);
helper->funcs = funcs; helper->funcs = funcs;
...@@ -549,6 +557,7 @@ void drm_fb_helper_fini(struct drm_fb_helper *fb_helper) ...@@ -549,6 +557,7 @@ void drm_fb_helper_fini(struct drm_fb_helper *fb_helper)
return; return;
cancel_work_sync(&fb_helper->resume_work); cancel_work_sync(&fb_helper->resume_work);
cancel_work_sync(&fb_helper->damage_work);
info = fb_helper->info; info = fb_helper->info;
if (info) { if (info) {
...@@ -590,16 +599,9 @@ static void drm_fb_helper_add_damage_clip(struct drm_fb_helper *helper, u32 x, u ...@@ -590,16 +599,9 @@ static void drm_fb_helper_add_damage_clip(struct drm_fb_helper *helper, u32 x, u
static void drm_fb_helper_damage(struct drm_fb_helper *helper, u32 x, u32 y, static void drm_fb_helper_damage(struct drm_fb_helper *helper, u32 x, u32 y,
u32 width, u32 height) u32 width, u32 height)
{ {
struct fb_info *info = helper->info;
drm_fb_helper_add_damage_clip(helper, x, y, width, height); drm_fb_helper_add_damage_clip(helper, x, y, width, height);
/* schedule_work(&helper->damage_work);
* The current fbdev emulation only flushes buffers if a damage
* update is necessary. And we can assume that deferred I/O has
* been enabled as damage updates require deferred I/O for mmap.
*/
fb_deferred_io_schedule_flush(info);
} }
/* /*
...@@ -664,16 +666,10 @@ void drm_fb_helper_deferred_io(struct fb_info *info, struct list_head *pagerefli ...@@ -664,16 +666,10 @@ void drm_fb_helper_deferred_io(struct fb_info *info, struct list_head *pagerefli
if (min_off < max_off) { if (min_off < max_off) {
drm_fb_helper_memory_range_to_clip(info, min_off, max_off - min_off, &damage_area); drm_fb_helper_memory_range_to_clip(info, min_off, max_off - min_off, &damage_area);
drm_fb_helper_add_damage_clip(helper, damage_area.x1, damage_area.y1, drm_fb_helper_damage(helper, damage_area.x1, damage_area.y1,
drm_rect_width(&damage_area), drm_rect_width(&damage_area),
drm_rect_height(&damage_area)); drm_rect_height(&damage_area));
} }
/*
* Flushes all dirty pages from mmap's pageref list and the
* areas that have been written by struct fb_ops callbacks.
*/
drm_fb_helper_fb_dirty(helper);
} }
EXPORT_SYMBOL(drm_fb_helper_deferred_io); EXPORT_SYMBOL(drm_fb_helper_deferred_io);
......
...@@ -332,19 +332,3 @@ void fb_deferred_io_cleanup(struct fb_info *info) ...@@ -332,19 +332,3 @@ void fb_deferred_io_cleanup(struct fb_info *info)
mutex_destroy(&fbdefio->lock); mutex_destroy(&fbdefio->lock);
} }
EXPORT_SYMBOL_GPL(fb_deferred_io_cleanup); EXPORT_SYMBOL_GPL(fb_deferred_io_cleanup);
void fb_deferred_io_schedule_flush(struct fb_info *info)
{
struct fb_deferred_io *fbdefio = info->fbdefio;
if (WARN_ON_ONCE(!fbdefio))
return; /* bug in driver logic */
/*
* There's no requirement from callers to schedule the
* flush immediately. Rather schedule the worker with a
* delay and let a few more writes pile up.
*/
schedule_delayed_work(&info->deferred_work, fbdefio->delay);
}
EXPORT_SYMBOL_GPL(fb_deferred_io_schedule_flush);
...@@ -116,6 +116,7 @@ struct drm_fb_helper_funcs { ...@@ -116,6 +116,7 @@ struct drm_fb_helper_funcs {
* @damage_clip: clip rectangle used with deferred_io to accumulate damage to * @damage_clip: clip rectangle used with deferred_io to accumulate damage to
* the screen buffer * the screen buffer
* @damage_lock: spinlock protecting @damage_clip * @damage_lock: spinlock protecting @damage_clip
* @damage_work: worker used to flush the framebuffer
* @resume_work: worker used during resume if the console lock is already taken * @resume_work: worker used during resume if the console lock is already taken
* *
* This is the main structure used by the fbdev helpers. Drivers supporting * This is the main structure used by the fbdev helpers. Drivers supporting
...@@ -145,6 +146,7 @@ struct drm_fb_helper { ...@@ -145,6 +146,7 @@ struct drm_fb_helper {
u32 pseudo_palette[17]; u32 pseudo_palette[17];
struct drm_clip_rect damage_clip; struct drm_clip_rect damage_clip;
spinlock_t damage_lock; spinlock_t damage_lock;
struct work_struct damage_work;
struct work_struct resume_work; struct work_struct resume_work;
/** /**
......
...@@ -663,7 +663,6 @@ extern void fb_deferred_io_open(struct fb_info *info, ...@@ -663,7 +663,6 @@ extern void fb_deferred_io_open(struct fb_info *info,
struct inode *inode, struct inode *inode,
struct file *file); struct file *file);
extern void fb_deferred_io_cleanup(struct fb_info *info); extern void fb_deferred_io_cleanup(struct fb_info *info);
extern void fb_deferred_io_schedule_flush(struct fb_info *info);
extern int fb_deferred_io_fsync(struct file *file, loff_t start, extern int fb_deferred_io_fsync(struct file *file, loff_t start,
loff_t end, int datasync); loff_t end, int datasync);
...@@ -807,7 +806,7 @@ extern int fb_find_mode(struct fb_var_screeninfo *var, ...@@ -807,7 +806,7 @@ extern int fb_find_mode(struct fb_var_screeninfo *var,
#if defined(CONFIG_VIDEO_NOMODESET) #if defined(CONFIG_VIDEO_NOMODESET)
bool fb_modesetting_disabled(const char *drvname); bool fb_modesetting_disabled(const char *drvname);
#else #else
bool fb_modesetting_disabled(const char *drvname) static inline bool fb_modesetting_disabled(const char *drvname)
{ {
return false; return false;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment