fbcon: Move fbcon_bmove(_rec) functions
Avoids two forward declarations, and more importantly, matches what I've done in my fbcon scrolling restore patches - so I need this to avoid a bunch of conflicts in rebasing since we ended up merging Helge's series instead. Acked-by: Thomas Zimmermann <tzimmermann@suse.de> Reviewed-by: Javier Martinez Canillas <javierm@redhat.com> Signed-off-by: Daniel Vetter <daniel.vetter@intel.com> Cc: Helge Deller <deller@gmx.de> Cc: Daniel Vetter <daniel@ffwll.ch> Cc: Thomas Zimmermann <tzimmermann@suse.de> Cc: Du Cheng <ducheng2@gmail.com> Cc: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp> Cc: Claudio Suarez <cssk@net-c.es> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Link: https://patchwork.freedesktop.org/patch/msgid/20220405210335.3434130-3-daniel.vetter@ffwll.ch
This commit is contained in:
parent
9ad7acdad1
commit
6893331363
|
@ -164,15 +164,11 @@ static int fbcon_cursor_noblink;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void fbcon_clear_margins(struct vc_data *vc, int bottom_only);
|
static void fbcon_clear_margins(struct vc_data *vc, int bottom_only);
|
||||||
static void fbcon_bmove(struct vc_data *vc, int sy, int sx, int dy, int dx,
|
|
||||||
int height, int width);
|
|
||||||
static void fbcon_set_palette(struct vc_data *vc, const unsigned char *table);
|
static void fbcon_set_palette(struct vc_data *vc, const unsigned char *table);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Internal routines
|
* Internal routines
|
||||||
*/
|
*/
|
||||||
static void fbcon_bmove_rec(struct vc_data *vc, struct fbcon_display *p, int sy, int sx,
|
|
||||||
int dy, int dx, int height, int width, u_int y_break);
|
|
||||||
static void fbcon_set_disp(struct fb_info *info, struct fb_var_screeninfo *var,
|
static void fbcon_set_disp(struct fb_info *info, struct fb_var_screeninfo *var,
|
||||||
int unit);
|
int unit);
|
||||||
static void fbcon_redraw_move(struct vc_data *vc, struct fbcon_display *p,
|
static void fbcon_redraw_move(struct vc_data *vc, struct fbcon_display *p,
|
||||||
|
@ -1667,6 +1663,71 @@ static void fbcon_redraw(struct vc_data *vc, struct fbcon_display *p,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void fbcon_bmove_rec(struct vc_data *vc, struct fbcon_display *p, int sy, int sx,
|
||||||
|
int dy, int dx, int height, int width, u_int y_break)
|
||||||
|
{
|
||||||
|
struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];
|
||||||
|
struct fbcon_ops *ops = info->fbcon_par;
|
||||||
|
u_int b;
|
||||||
|
|
||||||
|
if (sy < y_break && sy + height > y_break) {
|
||||||
|
b = y_break - sy;
|
||||||
|
if (dy < sy) { /* Avoid trashing self */
|
||||||
|
fbcon_bmove_rec(vc, p, sy, sx, dy, dx, b, width,
|
||||||
|
y_break);
|
||||||
|
fbcon_bmove_rec(vc, p, sy + b, sx, dy + b, dx,
|
||||||
|
height - b, width, y_break);
|
||||||
|
} else {
|
||||||
|
fbcon_bmove_rec(vc, p, sy + b, sx, dy + b, dx,
|
||||||
|
height - b, width, y_break);
|
||||||
|
fbcon_bmove_rec(vc, p, sy, sx, dy, dx, b, width,
|
||||||
|
y_break);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dy < y_break && dy + height > y_break) {
|
||||||
|
b = y_break - dy;
|
||||||
|
if (dy < sy) { /* Avoid trashing self */
|
||||||
|
fbcon_bmove_rec(vc, p, sy, sx, dy, dx, b, width,
|
||||||
|
y_break);
|
||||||
|
fbcon_bmove_rec(vc, p, sy + b, sx, dy + b, dx,
|
||||||
|
height - b, width, y_break);
|
||||||
|
} else {
|
||||||
|
fbcon_bmove_rec(vc, p, sy + b, sx, dy + b, dx,
|
||||||
|
height - b, width, y_break);
|
||||||
|
fbcon_bmove_rec(vc, p, sy, sx, dy, dx, b, width,
|
||||||
|
y_break);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ops->bmove(vc, info, real_y(p, sy), sx, real_y(p, dy), dx,
|
||||||
|
height, width);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void fbcon_bmove(struct vc_data *vc, int sy, int sx, int dy, int dx,
|
||||||
|
int height, int width)
|
||||||
|
{
|
||||||
|
struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];
|
||||||
|
struct fbcon_display *p = &fb_display[vc->vc_num];
|
||||||
|
|
||||||
|
if (fbcon_is_inactive(vc, info))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!width || !height)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* Split blits that cross physical y_wrap case.
|
||||||
|
* Pathological case involves 4 blits, better to use recursive
|
||||||
|
* code rather than unrolled case
|
||||||
|
*
|
||||||
|
* Recursive invocations don't need to erase the cursor over and
|
||||||
|
* over again, so we use fbcon_bmove_rec()
|
||||||
|
*/
|
||||||
|
fbcon_bmove_rec(vc, p, sy, sx, dy, dx, height, width,
|
||||||
|
p->vrows - p->yscroll);
|
||||||
|
}
|
||||||
|
|
||||||
static bool fbcon_scroll(struct vc_data *vc, unsigned int t, unsigned int b,
|
static bool fbcon_scroll(struct vc_data *vc, unsigned int t, unsigned int b,
|
||||||
enum con_scroll dir, unsigned int count)
|
enum con_scroll dir, unsigned int count)
|
||||||
{
|
{
|
||||||
|
@ -1867,71 +1928,6 @@ static bool fbcon_scroll(struct vc_data *vc, unsigned int t, unsigned int b,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void fbcon_bmove(struct vc_data *vc, int sy, int sx, int dy, int dx,
|
|
||||||
int height, int width)
|
|
||||||
{
|
|
||||||
struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];
|
|
||||||
struct fbcon_display *p = &fb_display[vc->vc_num];
|
|
||||||
|
|
||||||
if (fbcon_is_inactive(vc, info))
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!width || !height)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* Split blits that cross physical y_wrap case.
|
|
||||||
* Pathological case involves 4 blits, better to use recursive
|
|
||||||
* code rather than unrolled case
|
|
||||||
*
|
|
||||||
* Recursive invocations don't need to erase the cursor over and
|
|
||||||
* over again, so we use fbcon_bmove_rec()
|
|
||||||
*/
|
|
||||||
fbcon_bmove_rec(vc, p, sy, sx, dy, dx, height, width,
|
|
||||||
p->vrows - p->yscroll);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void fbcon_bmove_rec(struct vc_data *vc, struct fbcon_display *p, int sy, int sx,
|
|
||||||
int dy, int dx, int height, int width, u_int y_break)
|
|
||||||
{
|
|
||||||
struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];
|
|
||||||
struct fbcon_ops *ops = info->fbcon_par;
|
|
||||||
u_int b;
|
|
||||||
|
|
||||||
if (sy < y_break && sy + height > y_break) {
|
|
||||||
b = y_break - sy;
|
|
||||||
if (dy < sy) { /* Avoid trashing self */
|
|
||||||
fbcon_bmove_rec(vc, p, sy, sx, dy, dx, b, width,
|
|
||||||
y_break);
|
|
||||||
fbcon_bmove_rec(vc, p, sy + b, sx, dy + b, dx,
|
|
||||||
height - b, width, y_break);
|
|
||||||
} else {
|
|
||||||
fbcon_bmove_rec(vc, p, sy + b, sx, dy + b, dx,
|
|
||||||
height - b, width, y_break);
|
|
||||||
fbcon_bmove_rec(vc, p, sy, sx, dy, dx, b, width,
|
|
||||||
y_break);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dy < y_break && dy + height > y_break) {
|
|
||||||
b = y_break - dy;
|
|
||||||
if (dy < sy) { /* Avoid trashing self */
|
|
||||||
fbcon_bmove_rec(vc, p, sy, sx, dy, dx, b, width,
|
|
||||||
y_break);
|
|
||||||
fbcon_bmove_rec(vc, p, sy + b, sx, dy + b, dx,
|
|
||||||
height - b, width, y_break);
|
|
||||||
} else {
|
|
||||||
fbcon_bmove_rec(vc, p, sy + b, sx, dy + b, dx,
|
|
||||||
height - b, width, y_break);
|
|
||||||
fbcon_bmove_rec(vc, p, sy, sx, dy, dx, b, width,
|
|
||||||
y_break);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
ops->bmove(vc, info, real_y(p, sy), sx, real_y(p, dy), dx,
|
|
||||||
height, width);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void updatescrollmode_accel(struct fbcon_display *p,
|
static void updatescrollmode_accel(struct fbcon_display *p,
|
||||||
struct fb_info *info,
|
struct fb_info *info,
|
||||||
struct vc_data *vc)
|
struct vc_data *vc)
|
||||||
|
|
Loading…
Reference in New Issue