[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <e1e1a4c9-231d-a14e-17d9-094771b1c262@suse.de>
Date: Wed, 13 Oct 2021 16:08:02 +0200
From: Thomas Zimmermann <tzimmermann@...e.de>
To: Claudio Suarez <cssk@...-c.es>
Cc: Daniel Vetter <daniel@...ll.ch>, linux-fbdev@...r.kernel.org,
dri-devel@...ts.freedesktop.org, linux-kernel@...r.kernel.org
Subject: Re: [PATCH] fbdev: Garbage collect fbdev scrolling acceleration, part
1 (from TODO list)
Hi
Am 01.10.21 um 14:48 schrieb Claudio Suarez:
> On Fri, Oct 01, 2021 at 10:21:44AM +0200, Thomas Zimmermann wrote:
>> Hi
>>
>> Am 30.09.21 um 17:10 schrieb Claudio:
>>> Scroll acceleration is disabled in fbcon by hard-wiring
>>> p->scrollmode = SCROLL_REDRAW. Remove the obsolete code in fbcon.c
>>> and fbdev/core/
>>>
>>> Signed-off-by: Claudio Suarez <cssk@...-c.es>
>>> ---
>>>
>>> - This is a task in the TODO list Documentation/gpu/todo.rst
>>> - The contact in the task is Daniel Vetter. He is/you are in copy.
>>> - To ease the things and saving time, I did a patch. It is included in this
>>> message. I can redo it if there is something wrong.
>>> - I tested it in some configurations.
>>>
>>> My plan for new patches in this task:
>>> - A buch of patches to remove code from drivers: fb_copyarea and related.
>>> - Simplify the code around fbcon_ops as much as possible to remove the hooks
>>> as the TODO suggests.
>>> - Remove fb_copyarea in headers and exported symbols: cfb_copyarea, etc. This
>>> must be done when all the drivers are changed.
>>>
>>> I think that the correct list to ask questions about this
>>> is linux-fbdev@...r.kernel.org . Is it correct ?
>>> My question: I can develop the new changes. I can test in two computers/two
>>> drivers. Is there a way to test the rest of the patches ? I have not hardware
>>> to test them. Is anyone helping with this? Only regression tests are needed.
>>> I can test other patches in return.
>>>
>>> Thank you.
>>> Claudio Suarez.
>>>
>>> Patch follows:
>>>
>>> Documentation/gpu/todo.rst | 13 +-
>>> drivers/video/fbdev/core/bitblit.c | 16 -
>>> drivers/video/fbdev/core/fbcon.c | 509 ++------------------------------
>>> drivers/video/fbdev/core/fbcon.h | 59 ----
>>> drivers/video/fbdev/core/fbcon_ccw.c | 28 +-
>>> drivers/video/fbdev/core/fbcon_cw.c | 28 +-
>>> drivers/video/fbdev/core/fbcon_rotate.h | 9 -
>>> drivers/video/fbdev/core/fbcon_ud.c | 37 +--
>>> drivers/video/fbdev/core/tileblit.c | 16 -
>>> drivers/video/fbdev/skeletonfb.c | 12 +-
>>> include/linux/fb.h | 2 +-
>>> 11 files changed, 51 insertions(+), 678 deletions(-)
>>
>> Nice stats :)
>>
>> I looked through it and it looks good. Maybe double-check that everything
>> still builds.
>>
>> Acked-by: Thomas Zimmermann <tzimmermann@...e.de>
>>
>
> Yes, it still builds :)
> I had built with some different .config options, including
> allyesconfig, allno, some randoms and debian default config. I tested
> some .config options related to fbdev. I spent time running some kernels
> with different parameters and everything was ok.
> Today, I've just applied the patch to source from two gits: Linus
> rc and drm. Both have built ok.
> I think that I did enough tests to ensure it works fine. This code is going
> to run in many computers, mine included!
> Of course, if you or anyone is worried about something specific, please,
> tell me and I can check and re-check it. I don't want to miss something
> important.
>
> Thank you!
I added the patch to drm-misc-next.
Best regards
Thomas
>
> Best regards
> Claudio Suarez
>
>> Best regards
>> Thomas
>>
>>>
>>> diff --git a/Documentation/gpu/todo.rst b/Documentation/gpu/todo.rst
>>> index 12e61869939e..bb1e04bbf4fb 100644
>>> --- a/Documentation/gpu/todo.rst
>>> +++ b/Documentation/gpu/todo.rst
>>> @@ -314,16 +314,19 @@ Level: Advanced
>>> Garbage collect fbdev scrolling acceleration
>>> --------------------------------------------
>>> -Scroll acceleration is disabled in fbcon by hard-wiring p->scrollmode =
>>> -SCROLL_REDRAW. There's a ton of code this will allow us to remove:
>>> +Scroll acceleration has been disabled in fbcon. Now it works as the old
>>> +SCROLL_REDRAW mode. A ton of code was removed in fbcon.c and the hook bmove was
>>> +removed from fbcon_ops.
>>> +Remaining tasks:
>>> -- lots of code in fbcon.c
>>> -
>>> -- a bunch of the hooks in fbcon_ops, maybe the remaining hooks could be called
>>> +- a bunch of the hooks in fbcon_ops could be removed or simplified by calling
>>> directly instead of the function table (with a switch on p->rotate)
>>> - fb_copyarea is unused after this, and can be deleted from all drivers
>>> +- after that, fb_copyarea can be deleted from fb_ops in include/linux/fb.h as
>>> + well as cfb_copyarea
>>> +
>>> Note that not all acceleration code can be deleted, since clearing and cursor
>>> support is still accelerated, which might be good candidates for further
>>> deletion projects.
>>> diff --git a/drivers/video/fbdev/core/bitblit.c b/drivers/video/fbdev/core/bitblit.c
>>> index f98e8f298bc1..01fae2c96965 100644
>>> --- a/drivers/video/fbdev/core/bitblit.c
>>> +++ b/drivers/video/fbdev/core/bitblit.c
>>> @@ -43,21 +43,6 @@ static void update_attr(u8 *dst, u8 *src, int attribute,
>>> }
>>> }
>>> -static void bit_bmove(struct vc_data *vc, struct fb_info *info, int sy,
>>> - int sx, int dy, int dx, int height, int width)
>>> -{
>>> - struct fb_copyarea area;
>>> -
>>> - area.sx = sx * vc->vc_font.width;
>>> - area.sy = sy * vc->vc_font.height;
>>> - area.dx = dx * vc->vc_font.width;
>>> - area.dy = dy * vc->vc_font.height;
>>> - area.height = height * vc->vc_font.height;
>>> - area.width = width * vc->vc_font.width;
>>> -
>>> - info->fbops->fb_copyarea(info, &area);
>>> -}
>>> -
>>> static void bit_clear(struct vc_data *vc, struct fb_info *info, int sy,
>>> int sx, int height, int width)
>>> {
>>> @@ -393,7 +378,6 @@ static int bit_update_start(struct fb_info *info)
>>> void fbcon_set_bitops(struct fbcon_ops *ops)
>>> {
>>> - ops->bmove = bit_bmove;
>>> ops->clear = bit_clear;
>>> ops->putcs = bit_putcs;
>>> ops->clear_margins = bit_clear_margins;
>>> diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c
>>> index 22bb3892f6bd..99ecd9a6d844 100644
>>> --- a/drivers/video/fbdev/core/fbcon.c
>>> +++ b/drivers/video/fbdev/core/fbcon.c
>>> @@ -173,8 +173,6 @@ static void fbcon_putcs(struct vc_data *vc, const unsigned short *s,
>>> int count, int ypos, int xpos);
>>> static void fbcon_clear_margins(struct vc_data *vc, int bottom_only);
>>> static void fbcon_cursor(struct vc_data *vc, int mode);
>>> -static void fbcon_bmove(struct vc_data *vc, int sy, int sx, int dy, int dx,
>>> - int height, int width);
>>> static int fbcon_switch(struct vc_data *vc);
>>> static int fbcon_blank(struct vc_data *vc, int blank, int mode_switch);
>>> static void fbcon_set_palette(struct vc_data *vc, const unsigned char *table);
>>> @@ -182,16 +180,8 @@ static void fbcon_set_palette(struct vc_data *vc, const unsigned char *table);
>>> /*
>>> * Internal routines
>>> */
>>> -static __inline__ void ywrap_up(struct vc_data *vc, int count);
>>> -static __inline__ void ywrap_down(struct vc_data *vc, int count);
>>> -static __inline__ void ypan_up(struct vc_data *vc, int count);
>>> -static __inline__ void ypan_down(struct vc_data *vc, int count);
>>> -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,
>>> int unit);
>>> -static void fbcon_redraw_move(struct vc_data *vc, struct fbcon_display *p,
>>> - int line, int count, int dy);
>>> static void fbcon_modechanged(struct fb_info *info);
>>> static void fbcon_set_all_vcs(struct fb_info *info);
>>> static void fbcon_start(void);
>>> @@ -1135,14 +1125,6 @@ static void fbcon_init(struct vc_data *vc, int init)
>>> ops->graphics = 0;
>>> - /*
>>> - * No more hw acceleration for fbcon.
>>> - *
>>> - * FIXME: Garbage collect all the now dead code after sufficient time
>>> - * has passed.
>>> - */
>>> - p->scrollmode = SCROLL_REDRAW;
>>> -
>>> /*
>>> * ++guenther: console.c:vc_allocate() relies on initializing
>>> * vc_{cols,rows}, but we must not set those if we are only
>>> @@ -1229,14 +1211,13 @@ static void fbcon_deinit(struct vc_data *vc)
>>> * This system is now divided into two levels because of complications
>>> * caused by hardware scrolling. Top level functions:
>>> *
>>> - * fbcon_bmove(), fbcon_clear(), fbcon_putc(), fbcon_clear_margins()
>>> + * fbcon_clear(), fbcon_putc(), fbcon_clear_margins()
>>> *
>>> * handles y values in range [0, scr_height-1] that correspond to real
>>> * screen positions. y_wrap shift means that first line of bitmap may be
>>> * anywhere on this display. These functions convert lineoffsets to
>>> * bitmap offsets and deal with the wrap-around case by splitting blits.
>>> *
>>> - * fbcon_bmove_physical_8() -- These functions fast implementations
>>> * fbcon_clear_physical_8() -- of original fbcon_XXX fns.
>>> * fbcon_putc_physical_8() -- (font width != 8) may be added later
>>> *
>>> @@ -1409,224 +1390,6 @@ static void fbcon_set_disp(struct fb_info *info, struct fb_var_screeninfo *var,
>>> }
>>> }
>>> -static __inline__ void ywrap_up(struct vc_data *vc, int count)
>>> -{
>>> - struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];
>>> - struct fbcon_ops *ops = info->fbcon_par;
>>> - struct fbcon_display *p = &fb_display[vc->vc_num];
>>> -
>>> - p->yscroll += count;
>>> - if (p->yscroll >= p->vrows) /* Deal with wrap */
>>> - p->yscroll -= p->vrows;
>>> - ops->var.xoffset = 0;
>>> - ops->var.yoffset = p->yscroll * vc->vc_font.height;
>>> - ops->var.vmode |= FB_VMODE_YWRAP;
>>> - ops->update_start(info);
>>> - scrollback_max += count;
>>> - if (scrollback_max > scrollback_phys_max)
>>> - scrollback_max = scrollback_phys_max;
>>> - scrollback_current = 0;
>>> -}
>>> -
>>> -static __inline__ void ywrap_down(struct vc_data *vc, int count)
>>> -{
>>> - struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];
>>> - struct fbcon_ops *ops = info->fbcon_par;
>>> - struct fbcon_display *p = &fb_display[vc->vc_num];
>>> -
>>> - p->yscroll -= count;
>>> - if (p->yscroll < 0) /* Deal with wrap */
>>> - p->yscroll += p->vrows;
>>> - ops->var.xoffset = 0;
>>> - ops->var.yoffset = p->yscroll * vc->vc_font.height;
>>> - ops->var.vmode |= FB_VMODE_YWRAP;
>>> - ops->update_start(info);
>>> - scrollback_max -= count;
>>> - if (scrollback_max < 0)
>>> - scrollback_max = 0;
>>> - scrollback_current = 0;
>>> -}
>>> -
>>> -static __inline__ void ypan_up(struct vc_data *vc, int count)
>>> -{
>>> - struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];
>>> - struct fbcon_display *p = &fb_display[vc->vc_num];
>>> - struct fbcon_ops *ops = info->fbcon_par;
>>> -
>>> - p->yscroll += count;
>>> - if (p->yscroll > p->vrows - vc->vc_rows) {
>>> - ops->bmove(vc, info, p->vrows - vc->vc_rows,
>>> - 0, 0, 0, vc->vc_rows, vc->vc_cols);
>>> - p->yscroll -= p->vrows - vc->vc_rows;
>>> - }
>>> -
>>> - ops->var.xoffset = 0;
>>> - ops->var.yoffset = p->yscroll * vc->vc_font.height;
>>> - ops->var.vmode &= ~FB_VMODE_YWRAP;
>>> - ops->update_start(info);
>>> - fbcon_clear_margins(vc, 1);
>>> - scrollback_max += count;
>>> - if (scrollback_max > scrollback_phys_max)
>>> - scrollback_max = scrollback_phys_max;
>>> - scrollback_current = 0;
>>> -}
>>> -
>>> -static __inline__ void ypan_up_redraw(struct vc_data *vc, int t, int count)
>>> -{
>>> - struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];
>>> - struct fbcon_ops *ops = info->fbcon_par;
>>> - struct fbcon_display *p = &fb_display[vc->vc_num];
>>> -
>>> - p->yscroll += count;
>>> -
>>> - if (p->yscroll > p->vrows - vc->vc_rows) {
>>> - p->yscroll -= p->vrows - vc->vc_rows;
>>> - fbcon_redraw_move(vc, p, t + count, vc->vc_rows - count, t);
>>> - }
>>> -
>>> - ops->var.xoffset = 0;
>>> - ops->var.yoffset = p->yscroll * vc->vc_font.height;
>>> - ops->var.vmode &= ~FB_VMODE_YWRAP;
>>> - ops->update_start(info);
>>> - fbcon_clear_margins(vc, 1);
>>> - scrollback_max += count;
>>> - if (scrollback_max > scrollback_phys_max)
>>> - scrollback_max = scrollback_phys_max;
>>> - scrollback_current = 0;
>>> -}
>>> -
>>> -static __inline__ void ypan_down(struct vc_data *vc, int count)
>>> -{
>>> - struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];
>>> - struct fbcon_display *p = &fb_display[vc->vc_num];
>>> - struct fbcon_ops *ops = info->fbcon_par;
>>> -
>>> - p->yscroll -= count;
>>> - if (p->yscroll < 0) {
>>> - ops->bmove(vc, info, 0, 0, p->vrows - vc->vc_rows,
>>> - 0, vc->vc_rows, vc->vc_cols);
>>> - p->yscroll += p->vrows - vc->vc_rows;
>>> - }
>>> -
>>> - ops->var.xoffset = 0;
>>> - ops->var.yoffset = p->yscroll * vc->vc_font.height;
>>> - ops->var.vmode &= ~FB_VMODE_YWRAP;
>>> - ops->update_start(info);
>>> - fbcon_clear_margins(vc, 1);
>>> - scrollback_max -= count;
>>> - if (scrollback_max < 0)
>>> - scrollback_max = 0;
>>> - scrollback_current = 0;
>>> -}
>>> -
>>> -static __inline__ void ypan_down_redraw(struct vc_data *vc, int t, int count)
>>> -{
>>> - struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];
>>> - struct fbcon_ops *ops = info->fbcon_par;
>>> - struct fbcon_display *p = &fb_display[vc->vc_num];
>>> -
>>> - p->yscroll -= count;
>>> -
>>> - if (p->yscroll < 0) {
>>> - p->yscroll += p->vrows - vc->vc_rows;
>>> - fbcon_redraw_move(vc, p, t, vc->vc_rows - count, t + count);
>>> - }
>>> -
>>> - ops->var.xoffset = 0;
>>> - ops->var.yoffset = p->yscroll * vc->vc_font.height;
>>> - ops->var.vmode &= ~FB_VMODE_YWRAP;
>>> - ops->update_start(info);
>>> - fbcon_clear_margins(vc, 1);
>>> - scrollback_max -= count;
>>> - if (scrollback_max < 0)
>>> - scrollback_max = 0;
>>> - scrollback_current = 0;
>>> -}
>>> -
>>> -static void fbcon_redraw_move(struct vc_data *vc, struct fbcon_display *p,
>>> - int line, int count, int dy)
>>> -{
>>> - unsigned short *s = (unsigned short *)
>>> - (vc->vc_origin + vc->vc_size_row * line);
>>> -
>>> - while (count--) {
>>> - unsigned short *start = s;
>>> - unsigned short *le = advance_row(s, 1);
>>> - unsigned short c;
>>> - int x = 0;
>>> - unsigned short attr = 1;
>>> -
>>> - do {
>>> - c = scr_readw(s);
>>> - if (attr != (c & 0xff00)) {
>>> - attr = c & 0xff00;
>>> - if (s > start) {
>>> - fbcon_putcs(vc, start, s - start,
>>> - dy, x);
>>> - x += s - start;
>>> - start = s;
>>> - }
>>> - }
>>> - console_conditional_schedule();
>>> - s++;
>>> - } while (s < le);
>>> - if (s > start)
>>> - fbcon_putcs(vc, start, s - start, dy, x);
>>> - console_conditional_schedule();
>>> - dy++;
>>> - }
>>> -}
>>> -
>>> -static void fbcon_redraw_blit(struct vc_data *vc, struct fb_info *info,
>>> - struct fbcon_display *p, int line, int count, int ycount)
>>> -{
>>> - int offset = ycount * vc->vc_cols;
>>> - unsigned short *d = (unsigned short *)
>>> - (vc->vc_origin + vc->vc_size_row * line);
>>> - unsigned short *s = d + offset;
>>> - struct fbcon_ops *ops = info->fbcon_par;
>>> -
>>> - while (count--) {
>>> - unsigned short *start = s;
>>> - unsigned short *le = advance_row(s, 1);
>>> - unsigned short c;
>>> - int x = 0;
>>> -
>>> - do {
>>> - c = scr_readw(s);
>>> -
>>> - if (c == scr_readw(d)) {
>>> - if (s > start) {
>>> - ops->bmove(vc, info, line + ycount, x,
>>> - line, x, 1, s-start);
>>> - x += s - start + 1;
>>> - start = s + 1;
>>> - } else {
>>> - x++;
>>> - start++;
>>> - }
>>> - }
>>> -
>>> - scr_writew(c, d);
>>> - console_conditional_schedule();
>>> - s++;
>>> - d++;
>>> - } while (s < le);
>>> - if (s > start)
>>> - ops->bmove(vc, info, line + ycount, x, line, x, 1,
>>> - s-start);
>>> - console_conditional_schedule();
>>> - if (ycount > 0)
>>> - line++;
>>> - else {
>>> - line--;
>>> - /* NOTE: We subtract two lines from these pointers */
>>> - s -= vc->vc_size_row;
>>> - d -= vc->vc_size_row;
>>> - }
>>> - }
>>> -}
>>> -
>>> static void fbcon_redraw(struct vc_data *vc, struct fbcon_display *p,
>>> int line, int count, int offset)
>>> {
>>> @@ -1687,7 +1450,6 @@ static bool fbcon_scroll(struct vc_data *vc, unsigned int t, unsigned int b,
>>> {
>>> struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];
>>> struct fbcon_display *p = &fb_display[vc->vc_num];
>>> - int scroll_partial = info->flags & FBINFO_PARTIAL_PAN_OK;
>>> if (fbcon_is_inactive(vc, info))
>>> return true;
>>> @@ -1704,249 +1466,32 @@ static bool fbcon_scroll(struct vc_data *vc, unsigned int t, unsigned int b,
>>> case SM_UP:
>>> if (count > vc->vc_rows) /* Maximum realistic size */
>>> count = vc->vc_rows;
>>> - if (logo_shown >= 0)
>>> - goto redraw_up;
>>> - switch (p->scrollmode) {
>>> - case SCROLL_MOVE:
>>> - fbcon_redraw_blit(vc, info, p, t, b - t - count,
>>> - count);
>>> - fbcon_clear(vc, b - count, 0, count, vc->vc_cols);
>>> - scr_memsetw((unsigned short *) (vc->vc_origin +
>>> - vc->vc_size_row *
>>> - (b - count)),
>>> - vc->vc_video_erase_char,
>>> - vc->vc_size_row * count);
>>> - return true;
>>> -
>>> - case SCROLL_WRAP_MOVE:
>>> - if (b - t - count > 3 * vc->vc_rows >> 2) {
>>> - if (t > 0)
>>> - fbcon_bmove(vc, 0, 0, count, 0, t,
>>> - vc->vc_cols);
>>> - ywrap_up(vc, count);
>>> - if (vc->vc_rows - b > 0)
>>> - fbcon_bmove(vc, b - count, 0, b, 0,
>>> - vc->vc_rows - b,
>>> - vc->vc_cols);
>>> - } else if (info->flags & FBINFO_READS_FAST)
>>> - fbcon_bmove(vc, t + count, 0, t, 0,
>>> - b - t - count, vc->vc_cols);
>>> - else
>>> - goto redraw_up;
>>> - fbcon_clear(vc, b - count, 0, count, vc->vc_cols);
>>> - break;
>>> -
>>> - case SCROLL_PAN_REDRAW:
>>> - if ((p->yscroll + count <=
>>> - 2 * (p->vrows - vc->vc_rows))
>>> - && ((!scroll_partial && (b - t == vc->vc_rows))
>>> - || (scroll_partial
>>> - && (b - t - count >
>>> - 3 * vc->vc_rows >> 2)))) {
>>> - if (t > 0)
>>> - fbcon_redraw_move(vc, p, 0, t, count);
>>> - ypan_up_redraw(vc, t, count);
>>> - if (vc->vc_rows - b > 0)
>>> - fbcon_redraw_move(vc, p, b,
>>> - vc->vc_rows - b, b);
>>> - } else
>>> - fbcon_redraw_move(vc, p, t + count, b - t - count, t);
>>> - fbcon_clear(vc, b - count, 0, count, vc->vc_cols);
>>> - break;
>>> -
>>> - case SCROLL_PAN_MOVE:
>>> - if ((p->yscroll + count <=
>>> - 2 * (p->vrows - vc->vc_rows))
>>> - && ((!scroll_partial && (b - t == vc->vc_rows))
>>> - || (scroll_partial
>>> - && (b - t - count >
>>> - 3 * vc->vc_rows >> 2)))) {
>>> - if (t > 0)
>>> - fbcon_bmove(vc, 0, 0, count, 0, t,
>>> - vc->vc_cols);
>>> - ypan_up(vc, count);
>>> - if (vc->vc_rows - b > 0)
>>> - fbcon_bmove(vc, b - count, 0, b, 0,
>>> - vc->vc_rows - b,
>>> - vc->vc_cols);
>>> - } else if (info->flags & FBINFO_READS_FAST)
>>> - fbcon_bmove(vc, t + count, 0, t, 0,
>>> - b - t - count, vc->vc_cols);
>>> - else
>>> - goto redraw_up;
>>> - fbcon_clear(vc, b - count, 0, count, vc->vc_cols);
>>> - break;
>>> -
>>> - case SCROLL_REDRAW:
>>> - redraw_up:
>>> - fbcon_redraw(vc, p, t, b - t - count,
>>> - count * vc->vc_cols);
>>> - fbcon_clear(vc, b - count, 0, count, vc->vc_cols);
>>> - scr_memsetw((unsigned short *) (vc->vc_origin +
>>> - vc->vc_size_row *
>>> - (b - count)),
>>> - vc->vc_video_erase_char,
>>> - vc->vc_size_row * count);
>>> - return true;
>>> - }
>>> - break;
>>> + fbcon_redraw(vc, p, t, b - t - count,
>>> + count * vc->vc_cols);
>>> + fbcon_clear(vc, b - count, 0, count, vc->vc_cols);
>>> + scr_memsetw((unsigned short *) (vc->vc_origin +
>>> + vc->vc_size_row *
>>> + (b - count)),
>>> + vc->vc_video_erase_char,
>>> + vc->vc_size_row * count);
>>> + return true;
>>> case SM_DOWN:
>>> if (count > vc->vc_rows) /* Maximum realistic size */
>>> count = vc->vc_rows;
>>> - if (logo_shown >= 0)
>>> - goto redraw_down;
>>> - switch (p->scrollmode) {
>>> - case SCROLL_MOVE:
>>> - fbcon_redraw_blit(vc, info, p, b - 1, b - t - count,
>>> - -count);
>>> - fbcon_clear(vc, t, 0, count, vc->vc_cols);
>>> - scr_memsetw((unsigned short *) (vc->vc_origin +
>>> - vc->vc_size_row *
>>> - t),
>>> - vc->vc_video_erase_char,
>>> - vc->vc_size_row * count);
>>> - return true;
>>> -
>>> - case SCROLL_WRAP_MOVE:
>>> - if (b - t - count > 3 * vc->vc_rows >> 2) {
>>> - if (vc->vc_rows - b > 0)
>>> - fbcon_bmove(vc, b, 0, b - count, 0,
>>> - vc->vc_rows - b,
>>> - vc->vc_cols);
>>> - ywrap_down(vc, count);
>>> - if (t > 0)
>>> - fbcon_bmove(vc, count, 0, 0, 0, t,
>>> - vc->vc_cols);
>>> - } else if (info->flags & FBINFO_READS_FAST)
>>> - fbcon_bmove(vc, t, 0, t + count, 0,
>>> - b - t - count, vc->vc_cols);
>>> - else
>>> - goto redraw_down;
>>> - fbcon_clear(vc, t, 0, count, vc->vc_cols);
>>> - break;
>>> -
>>> - case SCROLL_PAN_MOVE:
>>> - if ((count - p->yscroll <= p->vrows - vc->vc_rows)
>>> - && ((!scroll_partial && (b - t == vc->vc_rows))
>>> - || (scroll_partial
>>> - && (b - t - count >
>>> - 3 * vc->vc_rows >> 2)))) {
>>> - if (vc->vc_rows - b > 0)
>>> - fbcon_bmove(vc, b, 0, b - count, 0,
>>> - vc->vc_rows - b,
>>> - vc->vc_cols);
>>> - ypan_down(vc, count);
>>> - if (t > 0)
>>> - fbcon_bmove(vc, count, 0, 0, 0, t,
>>> - vc->vc_cols);
>>> - } else if (info->flags & FBINFO_READS_FAST)
>>> - fbcon_bmove(vc, t, 0, t + count, 0,
>>> - b - t - count, vc->vc_cols);
>>> - else
>>> - goto redraw_down;
>>> - fbcon_clear(vc, t, 0, count, vc->vc_cols);
>>> - break;
>>> -
>>> - case SCROLL_PAN_REDRAW:
>>> - if ((count - p->yscroll <= p->vrows - vc->vc_rows)
>>> - && ((!scroll_partial && (b - t == vc->vc_rows))
>>> - || (scroll_partial
>>> - && (b - t - count >
>>> - 3 * vc->vc_rows >> 2)))) {
>>> - if (vc->vc_rows - b > 0)
>>> - fbcon_redraw_move(vc, p, b, vc->vc_rows - b,
>>> - b - count);
>>> - ypan_down_redraw(vc, t, count);
>>> - if (t > 0)
>>> - fbcon_redraw_move(vc, p, count, t, 0);
>>> - } else
>>> - fbcon_redraw_move(vc, p, t, b - t - count, t + count);
>>> - fbcon_clear(vc, t, 0, count, vc->vc_cols);
>>> - break;
>>> -
>>> - case SCROLL_REDRAW:
>>> - redraw_down:
>>> - fbcon_redraw(vc, p, b - 1, b - t - count,
>>> - -count * vc->vc_cols);
>>> - fbcon_clear(vc, t, 0, count, vc->vc_cols);
>>> - scr_memsetw((unsigned short *) (vc->vc_origin +
>>> - vc->vc_size_row *
>>> - t),
>>> - vc->vc_video_erase_char,
>>> - vc->vc_size_row * count);
>>> - return true;
>>> - }
>>> + fbcon_redraw(vc, p, b - 1, b - t - count,
>>> + -count * vc->vc_cols);
>>> + fbcon_clear(vc, t, 0, count, vc->vc_cols);
>>> + scr_memsetw((unsigned short *) (vc->vc_origin +
>>> + vc->vc_size_row *
>>> + t),
>>> + vc->vc_video_erase_char,
>>> + vc->vc_size_row * count);
>>> + return true;
>>> }
>>> return false;
>>> }
>>> -
>>> -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(struct fbcon_display *p,
>>> struct fb_info *info,
>>> struct vc_data *vc)
>>> @@ -2119,21 +1664,7 @@ static int fbcon_switch(struct vc_data *vc)
>>> updatescrollmode(p, info, vc);
>>> - switch (p->scrollmode) {
>>> - case SCROLL_WRAP_MOVE:
>>> - scrollback_phys_max = p->vrows - vc->vc_rows;
>>> - break;
>>> - case SCROLL_PAN_MOVE:
>>> - case SCROLL_PAN_REDRAW:
>>> - scrollback_phys_max = p->vrows - 2 * vc->vc_rows;
>>> - if (scrollback_phys_max < 0)
>>> - scrollback_phys_max = 0;
>>> - break;
>>> - default:
>>> - scrollback_phys_max = 0;
>>> - break;
>>> - }
>>> -
>>> + scrollback_phys_max = 0;
>>> scrollback_max = 0;
>>> scrollback_current = 0;
>>> diff --git a/drivers/video/fbdev/core/fbcon.h b/drivers/video/fbdev/core/fbcon.h
>>> index 9315b360c898..a00603b4451a 100644
>>> --- a/drivers/video/fbdev/core/fbcon.h
>>> +++ b/drivers/video/fbdev/core/fbcon.h
>>> @@ -29,7 +29,6 @@ struct fbcon_display {
>>> /* Filled in by the low-level console driver */
>>> const u_char *fontdata;
>>> int userfont; /* != 0 if fontdata kmalloc()ed */
>>> - u_short scrollmode; /* Scroll Method */
>>> u_short inverse; /* != 0 text black on white as default */
>>> short yscroll; /* Hardware scrolling */
>>> int vrows; /* number of virtual rows */
>>> @@ -52,8 +51,6 @@ struct fbcon_display {
>>> };
>>> struct fbcon_ops {
>>> - void (*bmove)(struct vc_data *vc, struct fb_info *info, int sy,
>>> - int sx, int dy, int dx, int height, int width);
>>> void (*clear)(struct vc_data *vc, struct fb_info *info, int sy,
>>> int sx, int height, int width);
>>> void (*putcs)(struct vc_data *vc, struct fb_info *info,
>>> @@ -152,62 +149,6 @@ static inline int attr_col_ec(int shift, struct vc_data *vc,
>>> #define attr_bgcol_ec(bgshift, vc, info) attr_col_ec(bgshift, vc, info, 0)
>>> #define attr_fgcol_ec(fgshift, vc, info) attr_col_ec(fgshift, vc, info, 1)
>>> - /*
>>> - * Scroll Method
>>> - */
>>> -
>>> -/* There are several methods fbcon can use to move text around the screen:
>>> - *
>>> - * Operation Pan Wrap
>>> - *---------------------------------------------
>>> - * SCROLL_MOVE copyarea No No
>>> - * SCROLL_PAN_MOVE copyarea Yes No
>>> - * SCROLL_WRAP_MOVE copyarea No Yes
>>> - * SCROLL_REDRAW imageblit No No
>>> - * SCROLL_PAN_REDRAW imageblit Yes No
>>> - * SCROLL_WRAP_REDRAW imageblit No Yes
>>> - *
>>> - * (SCROLL_WRAP_REDRAW is not implemented yet)
>>> - *
>>> - * In general, fbcon will choose the best scrolling
>>> - * method based on the rule below:
>>> - *
>>> - * Pan/Wrap > accel imageblit > accel copyarea >
>>> - * soft imageblit > (soft copyarea)
>>> - *
>>> - * Exception to the rule: Pan + accel copyarea is
>>> - * preferred over Pan + accel imageblit.
>>> - *
>>> - * The above is typical for PCI/AGP cards. Unless
>>> - * overridden, fbcon will never use soft copyarea.
>>> - *
>>> - * If you need to override the above rule, set the
>>> - * appropriate flags in fb_info->flags. For example,
>>> - * to prefer copyarea over imageblit, set
>>> - * FBINFO_READS_FAST.
>>> - *
>>> - * Other notes:
>>> - * + use the hardware engine to move the text
>>> - * (hw-accelerated copyarea() and fillrect())
>>> - * + use hardware-supported panning on a large virtual screen
>>> - * + amifb can not only pan, but also wrap the display by N lines
>>> - * (i.e. visible line i = physical line (i+N) % yres).
>>> - * + read what's already rendered on the screen and
>>> - * write it in a different place (this is cfb_copyarea())
>>> - * + re-render the text to the screen
>>> - *
>>> - * Whether to use wrapping or panning can only be figured out at
>>> - * runtime (when we know whether our font height is a multiple
>>> - * of the pan/wrap step)
>>> - *
>>> - */
>>> -
>>> -#define SCROLL_MOVE 0x001
>>> -#define SCROLL_PAN_MOVE 0x002
>>> -#define SCROLL_WRAP_MOVE 0x003
>>> -#define SCROLL_REDRAW 0x004
>>> -#define SCROLL_PAN_REDRAW 0x005
>>> -
>>> #ifdef CONFIG_FB_TILEBLITTING
>>> extern void fbcon_set_tileops(struct vc_data *vc, struct fb_info *info);
>>> #endif
>>> diff --git a/drivers/video/fbdev/core/fbcon_ccw.c b/drivers/video/fbdev/core/fbcon_ccw.c
>>> index 9cd2c4b05c32..ffa78936eaab 100644
>>> --- a/drivers/video/fbdev/core/fbcon_ccw.c
>>> +++ b/drivers/video/fbdev/core/fbcon_ccw.c
>>> @@ -59,31 +59,12 @@ static void ccw_update_attr(u8 *dst, u8 *src, int attribute,
>>> }
>>> }
>>> -
>>> -static void ccw_bmove(struct vc_data *vc, struct fb_info *info, int sy,
>>> - int sx, int dy, int dx, int height, int width)
>>> -{
>>> - struct fbcon_ops *ops = info->fbcon_par;
>>> - struct fb_copyarea area;
>>> - u32 vyres = GETVYRES(ops->p->scrollmode, info);
>>> -
>>> - area.sx = sy * vc->vc_font.height;
>>> - area.sy = vyres - ((sx + width) * vc->vc_font.width);
>>> - area.dx = dy * vc->vc_font.height;
>>> - area.dy = vyres - ((dx + width) * vc->vc_font.width);
>>> - area.width = height * vc->vc_font.height;
>>> - area.height = width * vc->vc_font.width;
>>> -
>>> - info->fbops->fb_copyarea(info, &area);
>>> -}
>>> -
>>> static void ccw_clear(struct vc_data *vc, struct fb_info *info, int sy,
>>> int sx, int height, int width)
>>> {
>>> - struct fbcon_ops *ops = info->fbcon_par;
>>> struct fb_fillrect region;
>>> int bgshift = (vc->vc_hi_font_mask) ? 13 : 12;
>>> - u32 vyres = GETVYRES(ops->p->scrollmode, info);
>>> + u32 vyres = info->var.yres;
>>> region.color = attr_bgcol_ec(bgshift,vc,info);
>>> region.dx = sy * vc->vc_font.height;
>>> @@ -140,7 +121,7 @@ static void ccw_putcs(struct vc_data *vc, struct fb_info *info,
>>> u32 cnt, pitch, size;
>>> u32 attribute = get_attribute(info, scr_readw(s));
>>> u8 *dst, *buf = NULL;
>>> - u32 vyres = GETVYRES(ops->p->scrollmode, info);
>>> + u32 vyres = info->var.yres;
>>> if (!ops->fontbuffer)
>>> return;
>>> @@ -229,7 +210,7 @@ static void ccw_cursor(struct vc_data *vc, struct fb_info *info, int mode,
>>> int attribute, use_sw = vc->vc_cursor_type & CUR_SW;
>>> int err = 1, dx, dy;
>>> char *src;
>>> - u32 vyres = GETVYRES(ops->p->scrollmode, info);
>>> + u32 vyres = info->var.yres;
>>> if (!ops->fontbuffer)
>>> return;
>>> @@ -387,7 +368,7 @@ static int ccw_update_start(struct fb_info *info)
>>> {
>>> struct fbcon_ops *ops = info->fbcon_par;
>>> u32 yoffset;
>>> - u32 vyres = GETVYRES(ops->p->scrollmode, info);
>>> + u32 vyres = info->var.yres;
>>> int err;
>>> yoffset = (vyres - info->var.yres) - ops->var.xoffset;
>>> @@ -402,7 +383,6 @@ static int ccw_update_start(struct fb_info *info)
>>> void fbcon_rotate_ccw(struct fbcon_ops *ops)
>>> {
>>> - ops->bmove = ccw_bmove;
>>> ops->clear = ccw_clear;
>>> ops->putcs = ccw_putcs;
>>> ops->clear_margins = ccw_clear_margins;
>>> diff --git a/drivers/video/fbdev/core/fbcon_cw.c b/drivers/video/fbdev/core/fbcon_cw.c
>>> index 88d89fad3f05..92e5b7fb51ee 100644
>>> --- a/drivers/video/fbdev/core/fbcon_cw.c
>>> +++ b/drivers/video/fbdev/core/fbcon_cw.c
>>> @@ -44,31 +44,12 @@ static void cw_update_attr(u8 *dst, u8 *src, int attribute,
>>> }
>>> }
>>> -
>>> -static void cw_bmove(struct vc_data *vc, struct fb_info *info, int sy,
>>> - int sx, int dy, int dx, int height, int width)
>>> -{
>>> - struct fbcon_ops *ops = info->fbcon_par;
>>> - struct fb_copyarea area;
>>> - u32 vxres = GETVXRES(ops->p->scrollmode, info);
>>> -
>>> - area.sx = vxres - ((sy + height) * vc->vc_font.height);
>>> - area.sy = sx * vc->vc_font.width;
>>> - area.dx = vxres - ((dy + height) * vc->vc_font.height);
>>> - area.dy = dx * vc->vc_font.width;
>>> - area.width = height * vc->vc_font.height;
>>> - area.height = width * vc->vc_font.width;
>>> -
>>> - info->fbops->fb_copyarea(info, &area);
>>> -}
>>> -
>>> static void cw_clear(struct vc_data *vc, struct fb_info *info, int sy,
>>> int sx, int height, int width)
>>> {
>>> - struct fbcon_ops *ops = info->fbcon_par;
>>> struct fb_fillrect region;
>>> int bgshift = (vc->vc_hi_font_mask) ? 13 : 12;
>>> - u32 vxres = GETVXRES(ops->p->scrollmode, info);
>>> + u32 vxres = info->var.xres;
>>> region.color = attr_bgcol_ec(bgshift,vc,info);
>>> region.dx = vxres - ((sy + height) * vc->vc_font.height);
>>> @@ -125,7 +106,7 @@ static void cw_putcs(struct vc_data *vc, struct fb_info *info,
>>> u32 cnt, pitch, size;
>>> u32 attribute = get_attribute(info, scr_readw(s));
>>> u8 *dst, *buf = NULL;
>>> - u32 vxres = GETVXRES(ops->p->scrollmode, info);
>>> + u32 vxres = info->var.xres;
>>> if (!ops->fontbuffer)
>>> return;
>>> @@ -212,7 +193,7 @@ static void cw_cursor(struct vc_data *vc, struct fb_info *info, int mode,
>>> int attribute, use_sw = vc->vc_cursor_type & CUR_SW;
>>> int err = 1, dx, dy;
>>> char *src;
>>> - u32 vxres = GETVXRES(ops->p->scrollmode, info);
>>> + u32 vxres = info->var.xres;
>>> if (!ops->fontbuffer)
>>> return;
>>> @@ -369,7 +350,7 @@ static void cw_cursor(struct vc_data *vc, struct fb_info *info, int mode,
>>> static int cw_update_start(struct fb_info *info)
>>> {
>>> struct fbcon_ops *ops = info->fbcon_par;
>>> - u32 vxres = GETVXRES(ops->p->scrollmode, info);
>>> + u32 vxres = info->var.xres;
>>> u32 xoffset;
>>> int err;
>>> @@ -385,7 +366,6 @@ static int cw_update_start(struct fb_info *info)
>>> void fbcon_rotate_cw(struct fbcon_ops *ops)
>>> {
>>> - ops->bmove = cw_bmove;
>>> ops->clear = cw_clear;
>>> ops->putcs = cw_putcs;
>>> ops->clear_margins = cw_clear_margins;
>>> diff --git a/drivers/video/fbdev/core/fbcon_rotate.h b/drivers/video/fbdev/core/fbcon_rotate.h
>>> index e233444cda66..b528b2e54283 100644
>>> --- a/drivers/video/fbdev/core/fbcon_rotate.h
>>> +++ b/drivers/video/fbdev/core/fbcon_rotate.h
>>> @@ -11,15 +11,6 @@
>>> #ifndef _FBCON_ROTATE_H
>>> #define _FBCON_ROTATE_H
>>> -#define GETVYRES(s,i) ({ \
>>> - (s == SCROLL_REDRAW || s == SCROLL_MOVE) ? \
>>> - (i)->var.yres : (i)->var.yres_virtual; })
>>> -
>>> -#define GETVXRES(s,i) ({ \
>>> - (s == SCROLL_REDRAW || s == SCROLL_MOVE || !(i)->fix.xpanstep) ? \
>>> - (i)->var.xres : (i)->var.xres_virtual; })
>>> -
>>> -
>>> static inline int pattern_test_bit(u32 x, u32 y, u32 pitch, const char *pat)
>>> {
>>> u32 tmp = (y * pitch) + x, index = tmp / 8, bit = tmp % 8;
>>> diff --git a/drivers/video/fbdev/core/fbcon_ud.c b/drivers/video/fbdev/core/fbcon_ud.c
>>> index 8d5e66b1bdfb..09619bd8e021 100644
>>> --- a/drivers/video/fbdev/core/fbcon_ud.c
>>> +++ b/drivers/video/fbdev/core/fbcon_ud.c
>>> @@ -44,33 +44,13 @@ static void ud_update_attr(u8 *dst, u8 *src, int attribute,
>>> }
>>> }
>>> -
>>> -static void ud_bmove(struct vc_data *vc, struct fb_info *info, int sy,
>>> - int sx, int dy, int dx, int height, int width)
>>> -{
>>> - struct fbcon_ops *ops = info->fbcon_par;
>>> - struct fb_copyarea area;
>>> - u32 vyres = GETVYRES(ops->p->scrollmode, info);
>>> - u32 vxres = GETVXRES(ops->p->scrollmode, info);
>>> -
>>> - area.sy = vyres - ((sy + height) * vc->vc_font.height);
>>> - area.sx = vxres - ((sx + width) * vc->vc_font.width);
>>> - area.dy = vyres - ((dy + height) * vc->vc_font.height);
>>> - area.dx = vxres - ((dx + width) * vc->vc_font.width);
>>> - area.height = height * vc->vc_font.height;
>>> - area.width = width * vc->vc_font.width;
>>> -
>>> - info->fbops->fb_copyarea(info, &area);
>>> -}
>>> -
>>> static void ud_clear(struct vc_data *vc, struct fb_info *info, int sy,
>>> int sx, int height, int width)
>>> {
>>> - struct fbcon_ops *ops = info->fbcon_par;
>>> struct fb_fillrect region;
>>> int bgshift = (vc->vc_hi_font_mask) ? 13 : 12;
>>> - u32 vyres = GETVYRES(ops->p->scrollmode, info);
>>> - u32 vxres = GETVXRES(ops->p->scrollmode, info);
>>> + u32 vyres = info->var.yres;
>>> + u32 vxres = info->var.xres;
>>> region.color = attr_bgcol_ec(bgshift,vc,info);
>>> region.dy = vyres - ((sy + height) * vc->vc_font.height);
>>> @@ -162,8 +142,8 @@ static void ud_putcs(struct vc_data *vc, struct fb_info *info,
>>> u32 mod = vc->vc_font.width % 8, cnt, pitch, size;
>>> u32 attribute = get_attribute(info, scr_readw(s));
>>> u8 *dst, *buf = NULL;
>>> - u32 vyres = GETVYRES(ops->p->scrollmode, info);
>>> - u32 vxres = GETVXRES(ops->p->scrollmode, info);
>>> + u32 vyres = info->var.yres;
>>> + u32 vxres = info->var.xres;
>>> if (!ops->fontbuffer)
>>> return;
>>> @@ -259,8 +239,8 @@ static void ud_cursor(struct vc_data *vc, struct fb_info *info, int mode,
>>> int attribute, use_sw = vc->vc_cursor_type & CUR_SW;
>>> int err = 1, dx, dy;
>>> char *src;
>>> - u32 vyres = GETVYRES(ops->p->scrollmode, info);
>>> - u32 vxres = GETVXRES(ops->p->scrollmode, info);
>>> + u32 vyres = info->var.yres;
>>> + u32 vxres = info->var.xres;
>>> if (!ops->fontbuffer)
>>> return;
>>> @@ -410,8 +390,8 @@ static int ud_update_start(struct fb_info *info)
>>> {
>>> struct fbcon_ops *ops = info->fbcon_par;
>>> int xoffset, yoffset;
>>> - u32 vyres = GETVYRES(ops->p->scrollmode, info);
>>> - u32 vxres = GETVXRES(ops->p->scrollmode, info);
>>> + u32 vyres = info->var.yres;
>>> + u32 vxres = info->var.xres;
>>> int err;
>>> xoffset = vxres - info->var.xres - ops->var.xoffset;
>>> @@ -429,7 +409,6 @@ static int ud_update_start(struct fb_info *info)
>>> void fbcon_rotate_ud(struct fbcon_ops *ops)
>>> {
>>> - ops->bmove = ud_bmove;
>>> ops->clear = ud_clear;
>>> ops->putcs = ud_putcs;
>>> ops->clear_margins = ud_clear_margins;
>>> diff --git a/drivers/video/fbdev/core/tileblit.c b/drivers/video/fbdev/core/tileblit.c
>>> index 2768eff247ba..72af95053bcb 100644
>>> --- a/drivers/video/fbdev/core/tileblit.c
>>> +++ b/drivers/video/fbdev/core/tileblit.c
>>> @@ -16,21 +16,6 @@
>>> #include <asm/types.h>
>>> #include "fbcon.h"
>>> -static void tile_bmove(struct vc_data *vc, struct fb_info *info, int sy,
>>> - int sx, int dy, int dx, int height, int width)
>>> -{
>>> - struct fb_tilearea area;
>>> -
>>> - area.sx = sx;
>>> - area.sy = sy;
>>> - area.dx = dx;
>>> - area.dy = dy;
>>> - area.height = height;
>>> - area.width = width;
>>> -
>>> - info->tileops->fb_tilecopy(info, &area);
>>> -}
>>> -
>>> static void tile_clear(struct vc_data *vc, struct fb_info *info, int sy,
>>> int sx, int height, int width)
>>> {
>>> @@ -133,7 +118,6 @@ void fbcon_set_tileops(struct vc_data *vc, struct fb_info *info)
>>> struct fb_tilemap map;
>>> struct fbcon_ops *ops = info->fbcon_par;
>>> - ops->bmove = tile_bmove;
>>> ops->clear = tile_clear;
>>> ops->putcs = tile_putcs;
>>> ops->clear_margins = tile_clear_margins;
>>> diff --git a/drivers/video/fbdev/skeletonfb.c b/drivers/video/fbdev/skeletonfb.c
>>> index bcacfb6934fa..0fe922f726e9 100644
>>> --- a/drivers/video/fbdev/skeletonfb.c
>>> +++ b/drivers/video/fbdev/skeletonfb.c
>>> @@ -505,15 +505,15 @@ void xxxfb_fillrect(struct fb_info *p, const struct fb_fillrect *region)
>>> }
>>> /**
>>> - * xxxfb_copyarea - REQUIRED function. Can use generic routines if
>>> - * non acclerated hardware and packed pixel based.
>>> + * xxxfb_copyarea - OBSOLETE function.
>>> * Copies one area of the screen to another area.
>>> + * Will be deleted in a future version
>>> *
>>> * @info: frame buffer structure that represents a single frame buffer
>>> * @area: Structure providing the data to copy the framebuffer contents
>>> * from one region to another.
>>> *
>>> - * This drawing operation copies a rectangular area from one area of the
>>> + * This drawing operation copied a rectangular area from one area of the
>>> * screen to another area.
>>> */
>>> void xxxfb_copyarea(struct fb_info *p, const struct fb_copyarea *area)
>>> @@ -645,9 +645,9 @@ static const struct fb_ops xxxfb_ops = {
>>> .fb_setcolreg = xxxfb_setcolreg,
>>> .fb_blank = xxxfb_blank,
>>> .fb_pan_display = xxxfb_pan_display,
>>> - .fb_fillrect = xxxfb_fillrect, /* Needed !!! */
>>> - .fb_copyarea = xxxfb_copyarea, /* Needed !!! */
>>> - .fb_imageblit = xxxfb_imageblit, /* Needed !!! */
>>> + .fb_fillrect = xxxfb_fillrect, /* Needed !!! */
>>> + .fb_copyarea = xxxfb_copyarea, /* Obsolete */
>>> + .fb_imageblit = xxxfb_imageblit, /* Needed !!! */
>>> .fb_cursor = xxxfb_cursor, /* Optional !!! */
>>> .fb_sync = xxxfb_sync,
>>> .fb_ioctl = xxxfb_ioctl,
>>> diff --git a/include/linux/fb.h b/include/linux/fb.h
>>> index 5950f8f5dc74..6f3db99ab990 100644
>>> --- a/include/linux/fb.h
>>> +++ b/include/linux/fb.h
>>> @@ -262,7 +262,7 @@ struct fb_ops {
>>> /* Draws a rectangle */
>>> void (*fb_fillrect) (struct fb_info *info, const struct fb_fillrect *rect);
>>> - /* Copy data from area to another */
>>> + /* Copy data from area to another. Obsolete. */
>>> void (*fb_copyarea) (struct fb_info *info, const struct fb_copyarea *region);
>>> /* Draws a image to the display */
>>> void (*fb_imageblit) (struct fb_info *info, const struct fb_image *image);
>>>
>>>
>>>
>>
>> --
>> Thomas Zimmermann
>> Graphics Driver Developer
>> SUSE Software Solutions Germany GmbH
>> Maxfeldstr. 5, 90409 Nürnberg, Germany
>> (HRB 36809, AG Nürnberg)
>> Geschäftsführer: Felix Imendörffer
>
>
>
>
>
>
--
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Maxfeldstr. 5, 90409 Nürnberg, Germany
(HRB 36809, AG Nürnberg)
Geschäftsführer: Felix Imendörffer
Download attachment "OpenPGP_signature" of type "application/pgp-signature" (841 bytes)
Powered by blists - more mailing lists