From 6b11f9d8433b471fdd3ebed232b43a4b723be6ff Mon Sep 17 00:00:00 2001 From: Mikulas Patocka Date: Mon, 1 Apr 2019 17:46:56 +0200 Subject: udlfb: fix sleeping inside spinlock If a framebuffer device is used as a console, the rendering calls (copyarea, fillrect, imageblit) may be done with the console spinlock held. On udlfb, these function call dlfb_handle_damage that takes a blocking semaphore before acquiring an URB. In order to fix the bug, this patch changes the calls copyarea, fillrect and imageblit to offload USB work to a workqueue. A side effect of this patch is 3x improvement in console scrolling speed because the device doesn't have to be updated after each copyarea call. Signed-off-by: Mikulas Patocka Cc: Bernie Thompson Cc: Ladislav Michl Cc: Signed-off-by: Bartlomiej Zolnierkiewicz --- include/video/udlfb.h | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'include') diff --git a/include/video/udlfb.h b/include/video/udlfb.h index 7d09e54ae54e..a3724f1fca1c 100644 --- a/include/video/udlfb.h +++ b/include/video/udlfb.h @@ -48,6 +48,12 @@ struct dlfb_data { int base8; u32 pseudo_palette[256]; int blank_mode; /*one of FB_BLANK_ */ + int damage_x; + int damage_y; + int damage_x2; + int damage_y2; + spinlock_t damage_lock; + struct work_struct damage_work; struct fb_ops ops; /* blit-only rendering path metrics, exposed through sysfs */ atomic_t bytes_rendered; /* raw pixel-bytes driver asked to render */ -- cgit v1.2.3 From babc250e278eac7b0e671bdaedf833759b43bb78 Mon Sep 17 00:00:00 2001 From: Mikulas Patocka Date: Mon, 1 Apr 2019 17:46:57 +0200 Subject: udlfb: introduce a rendering mutex Rendering calls may be done simultaneously from the workqueue, dlfb_ops_write, dlfb_ops_ioctl, dlfb_ops_set_par and dlfb_dpy_deferred_io. The code is robust enough so that it won't crash on concurrent rendering. However, concurrent rendering may cause display corruption if the same pixel is simultaneously being rendered. In order to avoid this corruption, this patch adds a mutex around the rendering calls. Signed-off-by: Mikulas Patocka Cc: Bernie Thompson Cc: Ladislav Michl Cc: [b.zolnierkie: replace "dlfb:" with "uldfb:" in the patch summary] Signed-off-by: Bartlomiej Zolnierkiewicz --- include/video/udlfb.h | 1 + 1 file changed, 1 insertion(+) (limited to 'include') diff --git a/include/video/udlfb.h b/include/video/udlfb.h index a3724f1fca1c..58fb5732831a 100644 --- a/include/video/udlfb.h +++ b/include/video/udlfb.h @@ -48,6 +48,7 @@ struct dlfb_data { int base8; u32 pseudo_palette[256]; int blank_mode; /*one of FB_BLANK_ */ + struct mutex render_mutex; int damage_x; int damage_y; int damage_x2; -- cgit v1.2.3 From a6fdbd551573d9e303823c93075c0f0edff8d98e Mon Sep 17 00:00:00 2001 From: Linus Walleij Date: Thu, 11 Apr 2019 19:25:12 +0200 Subject: video: amba-clcd: Decomission Versatile and Nomadik These board families are now handled in the DRM subsystem where we can have reusable panel drivers and some other stuff. The PL111 there is now the driver used in the defconfig for Versatile and Nomadik so no need to keep this code around. There are a few minor machines in arch/arm/ such as mach-netx still using the old driver, so we need to keep the core fbdev driver around for some time. Signed-off-by: Linus Walleij Cc: Russell King Signed-off-by: Bartlomiej Zolnierkiewicz --- include/linux/amba/clcd.h | 31 ------------------------------- 1 file changed, 31 deletions(-) (limited to 'include') diff --git a/include/linux/amba/clcd.h b/include/linux/amba/clcd.h index d0c3be77c18e..b6e0cbeaf533 100644 --- a/include/linux/amba/clcd.h +++ b/include/linux/amba/clcd.h @@ -124,38 +124,11 @@ struct clcd_board { struct amba_device; struct clk; -/** - * struct clcd_vendor_data - holds hardware (IP-block) vendor-specific - * variant information - * - * @clock_timregs: the CLCD needs to be clocked when accessing the - * timer registers, or the hardware will hang. - * @packed_24_bit_pixels: this variant supports 24bit packed pixel data, - * so that RGB accesses 3 bytes at a time, not just on even 32bit - * boundaries, packing the pixel data in memory. ST Microelectronics - * have this. - * @st_bitmux_control: ST Microelectronics have implemented output - * bit line multiplexing into the CLCD control register. This indicates - * that we need to use this. - * @init_board: custom board init function for this variant - * @init_panel: custom panel init function for this variant - */ -struct clcd_vendor_data { - bool clock_timregs; - bool packed_24_bit_pixels; - bool st_bitmux_control; - int (*init_board)(struct amba_device *adev, - struct clcd_board *board); - int (*init_panel)(struct clcd_fb *fb, - struct device_node *panel); -}; - /* this data structure describes each frame buffer device we find */ struct clcd_fb { struct fb_info fb; struct amba_device *dev; struct clk *clk; - struct clcd_vendor_data *vendor; struct clcd_panel *panel; struct clcd_board *board; void *board_data; @@ -257,10 +230,6 @@ static inline void clcdfb_decode(struct clcd_fb *fb, struct clcd_regs *regs) else val |= CNTL_LCDBPP16_444; break; - case 24: - /* Modified variant supporting 24 bit packed pixels */ - val |= CNTL_ST_LCDBPP24_PACKED; - break; case 32: val |= CNTL_LCDBPP24; break; -- cgit v1.2.3