From patchwork Tue Jan 25 19:12:09 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Helge Deller X-Patchwork-Id: 536645 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id A7E96C433EF for ; Tue, 25 Jan 2022 19:12:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229641AbiAYTMV (ORCPT ); Tue, 25 Jan 2022 14:12:21 -0500 Received: from mout.gmx.net ([212.227.17.22]:53697 "EHLO mout.gmx.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229626AbiAYTMR (ORCPT ); Tue, 25 Jan 2022 14:12:17 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1643137931; bh=iKlAQrkzi2Hi0Nb0738k8LVeYWb5SMaZI+WvY2hsrAw=; h=X-UI-Sender-Class:Date:From:To:Cc:Subject; b=Pi7FviEFbxilpIZrFE45qwmXBp0Xe+ivJ4KyMJQlxoqKhuA49BlcUI2eInSS0p32G PvLHGcBqpv2v6hKX/tsljgnJqQXJzhkfpSsq0NVWKqJEUjDcDbFPW26s7dgW6EHDXp qsJP1QLMPDIV6e041gcBl0whrWqrcFXdC5NF9Qmw= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from p100 ([92.116.165.229]) by mail.gmx.net (mrgmx105 [212.227.17.168]) with ESMTPSA (Nemesis) id 1M1ps8-1nEd5n2iYi-002EEE; Tue, 25 Jan 2022 20:12:11 +0100 Date: Tue, 25 Jan 2022 20:12:09 +0100 From: Helge Deller To: linux-fbdev@vger.kernel.org, dri-devel@lists.freedesktop.org Cc: Daniel Vetter Subject: [PATCH] [RFC] fbcon: Add option to enable legacy hardware acceleration Message-ID: MIME-Version: 1.0 Content-Disposition: inline X-Provags-ID: V03:K1:x0vnOcIlIf31efl4HnVd6aGOkd98gXd6LXjnteoPBppzlET4fr8 XkXaw2G/iv1vWBBgNicNPIVutwLmommGUn84xyTYYP6lD5BCPQ2NCmOSp8goEAKrFhHT4X2 lsqcGPNOe0VcS5vH4CCAiOHmhNYLaaLIpGyGJHo1e2hslJ3jJtxd8m376PtB1E1W3A9gCZ7 254uBRFau3Uz5dzLiMDpw== X-UI-Out-Filterresults: notjunk:1;V03:K0:zjykn0/sYI4=:/rR1QJQO/5V732tV5iLJfN Coe/suHHtjasdnCa2N6AgWGH3FAdkfhPRKIVr6KEWHjLcl+9F0EwY6IC242CoaP/mAggpt7Nq mcRNe99aop9fJUiGDSB9l5iccYebKkNjg5Q8UCX/NUkSqoP4WA81+SmtrnqmMgUePaQXgMlwz Bu8EzPfV2s28a0GPjRE485EGrX8PdSqdlufe4nGDl9CYFPpBIDhODUpOxQwMTnTEDO68dLM25 7KuQWDd9nnjisPdBavBzSIFag4+aM4ll+p/XQq7k9Fu2rZ62iSWCbob4AzrP/2zKpmd9L9Kt6 IdW5OofzdLmXZW3r6q0qStovCuGfFT47QxufeNxp1kRzHq3AqsH2XsGUqNqLZp4JTfkxZPH1C IkQ45Lx5s9LhX5PWg2W9r+lKcZ+uDZjm61k+Z5I2ODeM8KjPabgvpG70k6Oq5O4j4BchMVNYy 5sDD6rzwV3V1+QphNJkoCkC3rVdpA53esVONKoOygCdUSVGgFhMvZXy6Km1uIlaLB1t6uo6cf RDDFfmJlvvyMpyhcGObKu5Fh/Bj5g5P7EhR4S8N+WFeTs9BQV+7u3YStxQgoWLYkGrRAD3tRL kQ+FkGITQG8/7iPNe0OHGkTP/jwf5M2PB394Ajiia8u8XcwbZRa3RezPTA2ln6Fri2IqnpoIB F5rT5+e6wxfd30HnZ+N8UBp91m5Bl+1tMKlBrX9MRAZ+A4kMBtsLUki8MBDqEyo3TkQDgN9QQ 0BebhbElSwcggQoXoTljNXcW08KKWbuBnAGYlgZhvnZL0VphgPOVyv1rgMashrC+8QqwwoODI jEh8MUVWnk/soTB0WVuWVSXm5Koj6k83y5SjSYOx4R/m876gtkFH89LrOX3PAyuBR3GLCQiut yKMHFIU0ssZynTzA6TDFLVhnAi26GwDuiPM1yS1LgoSbVmL5XwW2qxvGO2rE0ckRR8cO7GoNy YiWmSQ1pEsR982zHjy3tVZskbf68Tg4oCCMb91YSa5rVXU4pf85Z31SQpLdYQgArpQkW7LPyy NXpxyTZNcdeeSDh3ypY0o/ZIOwS2qt4dCfxC+CsplYSHa6p0Vxj4cRAIXMd9CmHV+ZxT2h+wF aidCfYRLTQOr84= Precedence: bulk List-ID: X-Mailing-List: linux-fbdev@vger.kernel.org Add a config option CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION to enable bitblt and fillrect hardware acceleration in the framebuffer console. If disabled, such acceleration will not be used, even if it is supported by the graphics hardware driver. If you plan to use DRM as your main graphics output system, you should disable this option since it will prevent compiling in code which isn't used later on when DRM takes over. For all other configurations, e.g. if none of your graphic cards support DRM (yet), DRM isn't available for your architecture, or you can't be sure that the graphic card in the target system will support DRM, you most likely want to enable this option. This patch is the first RFC. Independed of this patch I did some timing experiments with a qemu virtual machine running a PA-RISC Debian Linux installation with a screen resolution of 2048x1024 with 8bpp. In that case qemu emulated the graphics hardware bitblt and fillrect acceleration by using the native (x86) CPU. It was a simple testcase which was to run "time dmesg", where the syslog had 284 lines. The results showed a huge speedup: a) time dmesg (without acceleration): -> 19.0 seconds b) time dmesg (with acceleration): -> 2.6 seconds Signed-off-by: Helge Deller diff --git a/drivers/video/console/Kconfig b/drivers/video/console/Kconfig index 840d9813b0bc..da84d1c21c21 100644 --- a/drivers/video/console/Kconfig +++ b/drivers/video/console/Kconfig @@ -78,6 +78,17 @@ config FRAMEBUFFER_CONSOLE help Low-level framebuffer-based console driver. +config FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION + bool "Framebuffer Console hardware acceleration support" + depends on FRAMEBUFFER_CONSOLE + default y if !DRM + default y if !(X86 || ARM) + help + If you use a system on which DRM is fully supported you usually want to say N, + otherwise you probably want to enable this option. + If enabled the framebuffer console will utilize the hardware acceleration + of your graphics card by using hardware bitblt and fillrect features. + config FRAMEBUFFER_CONSOLE_DETECT_PRIMARY bool "Map the console to the primary display device" depends on FRAMEBUFFER_CONSOLE diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c index b813985f1403..f7b7d35953e8 100644 --- a/drivers/video/fbdev/core/fbcon.c +++ b/drivers/video/fbdev/core/fbcon.c @@ -1136,11 +1136,13 @@ static void fbcon_init(struct vc_data *vc, int init) ops->graphics = 0; +#ifdef CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION if ((cap & FBINFO_HWACCEL_COPYAREA) && !(cap & FBINFO_HWACCEL_DISABLED)) p->scrollmode = SCROLL_MOVE; else /* default to something safe */ p->scrollmode = SCROLL_REDRAW; +#endif /* * ++guenther: console.c:vc_allocate() relies on initializing @@ -1705,7 +1707,7 @@ static bool fbcon_scroll(struct vc_data *vc, unsigned int t, unsigned int b, count = vc->vc_rows; if (logo_shown >= 0) goto redraw_up; - switch (p->scrollmode) { + switch (fb_scrollmode(p)) { case SCROLL_MOVE: fbcon_redraw_blit(vc, info, p, t, b - t - count, count); @@ -1795,7 +1797,7 @@ static bool fbcon_scroll(struct vc_data *vc, unsigned int t, unsigned int b, count = vc->vc_rows; if (logo_shown >= 0) goto redraw_down; - switch (p->scrollmode) { + switch (fb_scrollmode(p)) { case SCROLL_MOVE: fbcon_redraw_blit(vc, info, p, b - 1, b - t - count, -count); @@ -1946,12 +1948,12 @@ static void fbcon_bmove_rec(struct vc_data *vc, struct fbcon_display *p, int sy, height, width); } -static void updatescrollmode(struct fbcon_display *p, +static void updatescrollmode_accel(struct fbcon_display *p, struct fb_info *info, struct vc_data *vc) { +#ifdef CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION struct fbcon_ops *ops = info->fbcon_par; - int fh = vc->vc_font.height; int cap = info->flags; u16 t = 0; int ypan = FBCON_SWAP(ops->rotate, info->fix.ypanstep, @@ -1972,12 +1974,6 @@ static void updatescrollmode(struct fbcon_display *p, int fast_imageblit = (cap & FBINFO_HWACCEL_IMAGEBLIT) && !(cap & FBINFO_HWACCEL_DISABLED); - p->vrows = vyres/fh; - if (yres > (fh * (vc->vc_rows + 1))) - p->vrows -= (yres - (fh * vc->vc_rows)) / fh; - if ((yres % fh) && (vyres % fh < yres % fh)) - p->vrows--; - if (good_wrap || good_pan) { if (reading_fast || fast_copyarea) p->scrollmode = good_wrap ? @@ -1991,6 +1987,27 @@ static void updatescrollmode(struct fbcon_display *p, else p->scrollmode = SCROLL_REDRAW; } +#endif +} + +static void updatescrollmode(struct fbcon_display *p, + struct fb_info *info, + struct vc_data *vc) +{ + struct fbcon_ops *ops = info->fbcon_par; + int fh = vc->vc_font.height; + int yres = FBCON_SWAP(ops->rotate, info->var.yres, info->var.xres); + int vyres = FBCON_SWAP(ops->rotate, info->var.yres_virtual, + info->var.xres_virtual); + + p->vrows = vyres/fh; + if (yres > (fh * (vc->vc_rows + 1))) + p->vrows -= (yres - (fh * vc->vc_rows)) / fh; + if ((yres % fh) && (vyres % fh < yres % fh)) + p->vrows--; + + /* update scrollmode in case hardware acceleration is used */ + updatescrollmode_accel(p, info, vc); } #define PITCH(w) (((w) + 7) >> 3) @@ -2148,7 +2165,7 @@ static int fbcon_switch(struct vc_data *vc) updatescrollmode(p, info, vc); - switch (p->scrollmode) { + switch (fb_scrollmode(p)) { case SCROLL_WRAP_MOVE: scrollback_phys_max = p->vrows - vc->vc_rows; break; diff --git a/drivers/video/fbdev/core/fbcon.h b/drivers/video/fbdev/core/fbcon.h index 9315b360c898..c5c043f38162 100644 --- a/drivers/video/fbdev/core/fbcon.h +++ b/drivers/video/fbdev/core/fbcon.h @@ -29,7 +29,9 @@ struct fbcon_display { /* Filled in by the low-level console driver */ const u_char *fontdata; int userfont; /* != 0 if fontdata kmalloc()ed */ +#ifdef CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION u_short scrollmode; /* Scroll Method */ +#endif u_short inverse; /* != 0 text black on white as default */ short yscroll; /* Hardware scrolling */ int vrows; /* number of virtual rows */ @@ -208,6 +210,17 @@ static inline int attr_col_ec(int shift, struct vc_data *vc, #define SCROLL_REDRAW 0x004 #define SCROLL_PAN_REDRAW 0x005 +static inline u_short fb_scrollmode(struct fbcon_display *fb) +{ +#ifdef CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION + return fb->scrollmode; +#else + /* hardcoded to SCROLL_REDRAW if acceleration was disabled. */ + return SCROLL_REDRAW; +#endif +} + + #ifdef CONFIG_FB_TILEBLITTING extern void fbcon_set_tileops(struct vc_data *vc, struct fb_info *info); #endif