12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316 |
- From b4e57b1905d3d8457b09102c7e61ec1e379bec94 Mon Sep 17 00:00:00 2001
- From: Alexander Graf <agraf@csgraf.de>
- Date: Fri, 10 Jun 2022 00:59:15 +0200
- Subject: [PATCH 1/7] dm: video: Add damage tracking API
- We are going to introduce image damage tracking to fasten up screen
- refresh on large displays. This patch adds damage tracking for up to
- one rectangle of the screen which is typically enough to hold blt or
- text print updates. Callers into this API and a reduced dcache flush
- code path will follow in later patches.
- Link: https://lore.kernel.org/u-boot/20220609225921.62462-2-agraf@csgraf.de/
- Signed-off-by: Alexander Graf <agraf@csgraf.de>
- Reported-by: Da Xue <da@libre.computer>
- [Alper: Remove depends on CONFIG_DM_VIDEO, replaced by if VIDEO]
- Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com>
- ---
- drivers/video/Kconfig | 14 ++++++++++++
- drivers/video/video-uclass.c | 41 ++++++++++++++++++++++++++++++++++++
- include/video.h | 29 +++++++++++++++++++++++--
- 3 files changed, 82 insertions(+), 2 deletions(-)
- diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig
- index c841b99bb30d..4a27fac2466d 100644
- --- a/drivers/video/Kconfig
- +++ b/drivers/video/Kconfig
- @@ -62,6 +62,20 @@ config VIDEO_COPY
- To use this, your video driver must set @copy_base in
- struct video_uc_plat.
-
- +config VIDEO_DAMAGE
- + bool "Enable damage tracking of frame buffer regions"
- + default y if ARM && !SYS_DCACHE_OFF
- + help
- + On some machines (most ARM), the display frame buffer resides in
- + RAM. To make the display controller pick up screen updates, we
- + have to flush frame buffer contents from CPU caches into RAM which
- + can be a slow operation.
- +
- + This patch adds damage tracking to collect information about regions
- + that received updates. When we want to sync, we then only flush
- + regions of the frame buffer that were modified before, speeding up
- + screen refreshes significantly.
- +
- config BACKLIGHT_PWM
- bool "Generic PWM based Backlight Driver"
- depends on BACKLIGHT && DM_PWM
- diff --git a/drivers/video/video-uclass.c b/drivers/video/video-uclass.c
- index 0ce376ca3f14..48a053841e42 100644
- --- a/drivers/video/video-uclass.c
- +++ b/drivers/video/video-uclass.c
- @@ -21,6 +21,8 @@
- #include <dm/device_compat.h>
- #include <dm/device-internal.h>
- #include <dm/uclass-internal.h>
- +#include <linux/types.h>
- +#include <linux/bitmap.h>
- #ifdef CONFIG_SANDBOX
- #include <asm/sdl.h>
- #endif
- @@ -254,6 +256,45 @@ void video_set_default_colors(struct udevice *dev, bool invert)
- priv->colour_bg = video_index_to_colour(priv, back);
- }
-
- +/* Notify about changes in the frame buffer */
- +int video_damage(struct udevice *vid, int x, int y, int width, int height)
- +{
- + struct video_priv *priv = dev_get_uclass_priv(vid);
- + int endx = x + width;
- + int endy = y + height;
- +
- + if (!CONFIG_IS_ENABLED(VIDEO_DAMAGE))
- + return 0;
- +
- + if (x > priv->xsize)
- + return 0;
- +
- + if (y > priv->ysize)
- + return 0;
- +
- + if (endx > priv->xsize)
- + endx = priv->xsize;
- +
- + if (endy > priv->ysize)
- + endy = priv->ysize;
- +
- + if (priv->damage.endx && priv->damage.endy) {
- + /* Span a rectangle across all old and new damage */
- + priv->damage.x = min(x, priv->damage.x);
- + priv->damage.y = min(y, priv->damage.y);
- + priv->damage.endx = max(endx, priv->damage.endx);
- + priv->damage.endy = max(endy, priv->damage.endy);
- + } else {
- + /* First damage, setting the rectangle to span it */
- + priv->damage.x = x;
- + priv->damage.y = y;
- + priv->damage.endx = endx;
- + priv->damage.endy = endy;
- + }
- +
- + return 0;
- +}
- +
- /* Flush video activity to the caches */
- int video_sync(struct udevice *vid, bool force)
- {
- diff --git a/include/video.h b/include/video.h
- index 43f2e2c02f0f..4b35e97f79ef 100644
- --- a/include/video.h
- +++ b/include/video.h
- @@ -109,6 +109,12 @@ struct video_priv {
- void *fb;
- int fb_size;
- void *copy_fb;
- + struct {
- + int x;
- + int y;
- + int endx;
- + int endy;
- + } damage;
- int line_length;
- u32 colour_fg;
- u32 colour_bg;
- @@ -211,8 +217,9 @@ int video_fill(struct udevice *dev, u32 colour);
- * @return: 0 on success, error code otherwise
- *
- * Some frame buffers are cached or have a secondary frame buffer. This
- - * function syncs these up so that the current contents of the U-Boot frame
- - * buffer are displayed to the user.
- + * function syncs the damaged parts of them up so that the current contents
- + * of the U-Boot frame buffer are displayed to the user. It clears the damage
- + * buffer.
- */
- int video_sync(struct udevice *vid, bool force);
-
- @@ -332,6 +339,24 @@ static inline int video_sync_copy_all(struct udevice *dev)
-
- #endif
-
- +/**
- + * video_damage() - Notify the video subsystem about screen updates.
- + *
- + * @vid: Device to sync
- + * @x: Upper left X coordinate of the damaged rectangle
- + * @y: Upper left Y coordinate of the damaged rectangle
- + * @width: Width of the damaged rectangle
- + * @height: Height of the damaged rectangle
- + *
- + * @return: 0
- + *
- + * Some frame buffers are cached or have a secondary frame buffer. This
- + * function notifies the video subsystem about rectangles that were updated
- + * within the frame buffer. They may only get written to the screen on the
- + * next call to video_sync().
- + */
- +int video_damage(struct udevice *vid, int x, int y, int width, int height);
- +
- /**
- * video_is_active() - Test if one video device it active
- *
- --
- 2.39.1
- From 58484b3194d23f8b2f850aa598f007239a0e36bf Mon Sep 17 00:00:00 2001
- From: Alexander Graf <agraf@csgraf.de>
- Date: Fri, 10 Jun 2022 00:59:16 +0200
- Subject: [PATCH 2/7] dm: video: Add damage notification on display clear
- Let's report the video damage when we clear the screen. This
- way we can later lazily flush only relevant regions to hardware.
- Link: https://lore.kernel.org/u-boot/20220609225921.62462-3-agraf@csgraf.de/
- Signed-off-by: Alexander Graf <agraf@csgraf.de>
- Reported-by: Da Xue <da@libre.computer>
- ---
- drivers/video/video-uclass.c | 2 ++
- 1 file changed, 2 insertions(+)
- diff --git a/drivers/video/video-uclass.c b/drivers/video/video-uclass.c
- index 48a053841e42..f1fbeaadcbba 100644
- --- a/drivers/video/video-uclass.c
- +++ b/drivers/video/video-uclass.c
- @@ -160,6 +160,8 @@ int video_fill(struct udevice *dev, u32 colour)
- if (ret)
- return ret;
-
- + video_damage(dev, 0, 0, priv->xsize, priv->ysize);
- +
- return video_sync(dev, false);
- }
-
- --
- 2.39.1
- From 289e75fc23c203a7aead1a8cdf51c8d710d7242e Mon Sep 17 00:00:00 2001
- From: Alexander Graf <agraf@csgraf.de>
- Date: Fri, 10 Jun 2022 00:59:17 +0200
- Subject: [PATCH 3/7] vidconsole: Add damage notifications to all vidconsole
- drivers
- Now that we have a damage tracking API, let's populate damage done by
- vidconsole drivers. We try to declare as little memory as damaged as
- possible, with the exception of rotated screens that I couldn't get my
- head wrapped around. On those, we revert to the old behavior and mark
- the full screen as damaged on every update.
- Link: https://lore.kernel.org/u-boot/20220609225921.62462-4-agraf@csgraf.de/
- Signed-off-by: Alexander Graf <agraf@csgraf.de>
- Reported-by: Da Xue <da@libre.computer>
- [Alper: Fix priv->baseline to met->baseline]
- Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com>
- ---
- drivers/video/console_normal.c | 10 ++++++
- drivers/video/console_rotate.c | 54 ++++++++++++++++++++++++++++++++
- drivers/video/console_truetype.c | 15 +++++++++
- 3 files changed, 79 insertions(+)
- diff --git a/drivers/video/console_normal.c b/drivers/video/console_normal.c
- index 9f552d02b308..e32fb23e3f9f 100644
- --- a/drivers/video/console_normal.c
- +++ b/drivers/video/console_normal.c
- @@ -60,6 +60,9 @@ static int console_normal_set_row(struct udevice *dev, uint row, int clr)
- if (ret)
- return ret;
-
- + video_damage(dev->parent, 0, VIDEO_FONT_HEIGHT * row, vid_priv->xsize,
- + VIDEO_FONT_HEIGHT);
- +
- return 0;
- }
-
- @@ -79,6 +82,9 @@ static int console_normal_move_rows(struct udevice *dev, uint rowdst,
- if (ret)
- return ret;
-
- + video_damage(dev->parent, 0, VIDEO_FONT_HEIGHT * rowdst, vid_priv->xsize,
- + VIDEO_FONT_HEIGHT * count);
- +
- return 0;
- }
-
- @@ -158,6 +164,10 @@ static int console_normal_putc_xy(struct udevice *dev, uint x_frac, uint y,
- }
- line += vid_priv->line_length;
- }
- +
- + video_damage(dev->parent, VID_TO_PIXEL(x_frac), y, VIDEO_FONT_WIDTH,
- + VIDEO_FONT_HEIGHT);
- +
- ret = vidconsole_sync_copy(dev, start, line);
- if (ret)
- return ret;
- diff --git a/drivers/video/console_rotate.c b/drivers/video/console_rotate.c
- index 36c8d0609d87..56e20bb4f32e 100644
- --- a/drivers/video/console_rotate.c
- +++ b/drivers/video/console_rotate.c
- @@ -57,6 +57,12 @@ static int console_set_row_1(struct udevice *dev, uint row, int clr)
- if (ret)
- return ret;
-
- + video_damage(dev->parent,
- + vid_priv->xsize - ((row + 1) * VIDEO_FONT_HEIGHT),
- + 0,
- + VIDEO_FONT_HEIGHT,
- + vid_priv->ysize);
- +
- return 0;
- }
-
- @@ -83,6 +89,12 @@ static int console_move_rows_1(struct udevice *dev, uint rowdst, uint rowsrc,
- dst += vid_priv->line_length;
- }
-
- + video_damage(dev->parent,
- + vid_priv->xsize - ((rowdst + count) * VIDEO_FONT_HEIGHT),
- + 0,
- + count * VIDEO_FONT_HEIGHT,
- + vid_priv->ysize);
- +
- return 0;
- }
-
- @@ -150,6 +162,12 @@ static int console_putc_xy_1(struct udevice *dev, uint x_frac, uint y, char ch)
- if (ret)
- return ret;
-
- + video_damage(dev->parent,
- + vid_priv->xsize - y - VIDEO_FONT_HEIGHT - 1,
- + linenum - 1,
- + VIDEO_FONT_HEIGHT,
- + VIDEO_FONT_WIDTH);
- +
- return VID_TO_POS(VIDEO_FONT_WIDTH);
- }
-
- @@ -199,6 +217,12 @@ static int console_set_row_2(struct udevice *dev, uint row, int clr)
- if (ret)
- return ret;
-
- + video_damage(dev->parent,
- + 0,
- + vid_priv->ysize - (row + 1) * VIDEO_FONT_HEIGHT,
- + vid_priv->xsize,
- + VIDEO_FONT_HEIGHT);
- +
- return 0;
- }
-
- @@ -218,6 +242,12 @@ static int console_move_rows_2(struct udevice *dev, uint rowdst, uint rowsrc,
- vidconsole_memmove(dev, dst, src,
- VIDEO_FONT_HEIGHT * vid_priv->line_length * count);
-
- + video_damage(dev->parent,
- + 0,
- + vid_priv->ysize - (rowdst + count) * VIDEO_FONT_HEIGHT,
- + vid_priv->xsize,
- + count * VIDEO_FONT_HEIGHT);
- +
- return 0;
- }
-
- @@ -288,6 +318,12 @@ static int console_putc_xy_2(struct udevice *dev, uint x_frac, uint y, char ch)
- if (ret)
- return ret;
-
- + video_damage(dev->parent,
- + x - VIDEO_FONT_WIDTH,
- + linenum - VIDEO_FONT_HEIGHT + 1,
- + VIDEO_FONT_WIDTH,
- + VIDEO_FONT_HEIGHT);
- +
- return VID_TO_POS(VIDEO_FONT_WIDTH);
- }
-
- @@ -335,6 +371,12 @@ static int console_set_row_3(struct udevice *dev, uint row, int clr)
- if (ret)
- return ret;
-
- + video_damage(dev->parent,
- + row * VIDEO_FONT_HEIGHT,
- + 0,
- + VIDEO_FONT_HEIGHT,
- + vid_priv->ysize);
- +
- return 0;
- }
-
- @@ -359,6 +401,12 @@ static int console_move_rows_3(struct udevice *dev, uint rowdst, uint rowsrc,
- dst += vid_priv->line_length;
- }
-
- + video_damage(dev->parent,
- + rowdst * VIDEO_FONT_HEIGHT,
- + 0,
- + count * VIDEO_FONT_HEIGHT,
- + vid_priv->ysize);
- +
- return 0;
- }
-
- @@ -424,6 +472,12 @@ static int console_putc_xy_3(struct udevice *dev, uint x_frac, uint y, char ch)
- if (ret)
- return ret;
-
- + video_damage(dev->parent,
- + y,
- + x - VIDEO_FONT_WIDTH + 1,
- + VIDEO_FONT_HEIGHT,
- + VIDEO_FONT_WIDTH);
- +
- return VID_TO_POS(VIDEO_FONT_WIDTH);
- }
-
- diff --git a/drivers/video/console_truetype.c b/drivers/video/console_truetype.c
- index 6859c9fa1163..5b90a0f91415 100644
- --- a/drivers/video/console_truetype.c
- +++ b/drivers/video/console_truetype.c
- @@ -145,6 +145,7 @@ struct console_tt_priv {
- static int console_truetype_set_row(struct udevice *dev, uint row, int clr)
- {
- struct video_priv *vid_priv = dev_get_uclass_priv(dev->parent);
- + struct vidconsole_priv *vc_priv = dev_get_uclass_priv(dev);
- struct console_tt_priv *priv = dev_get_priv(dev);
- struct console_tt_metrics *met = priv->cur_met;
- void *end, *line;
- @@ -188,6 +189,9 @@ static int console_truetype_set_row(struct udevice *dev, uint row, int clr)
- if (ret)
- return ret;
-
- + video_damage(dev->parent, 0, vc_priv->y_charsize * row, vid_priv->xsize,
- + vc_priv->y_charsize);
- +
- return 0;
- }
-
- @@ -195,6 +199,7 @@ static int console_truetype_move_rows(struct udevice *dev, uint rowdst,
- uint rowsrc, uint count)
- {
- struct video_priv *vid_priv = dev_get_uclass_priv(dev->parent);
- + struct vidconsole_priv *vc_priv = dev_get_uclass_priv(dev);
- struct console_tt_priv *priv = dev_get_priv(dev);
- struct console_tt_metrics *met = priv->cur_met;
- void *dst;
- @@ -213,6 +218,9 @@ static int console_truetype_move_rows(struct udevice *dev, uint rowdst,
- for (i = 0; i < priv->pos_ptr; i++)
- priv->pos[i].ypos -= diff;
-
- + video_damage(dev->parent, 0, vc_priv->y_charsize * rowdst, vid_priv->xsize,
- + vc_priv->y_charsize * count);
- +
- return 0;
- }
-
- @@ -370,6 +378,10 @@ static int console_truetype_putc_xy(struct udevice *dev, uint x, uint y,
-
- line += vid_priv->line_length;
- }
- +
- + video_damage(dev->parent, VID_TO_PIXEL(x) + xoff,
- + y + met->baseline + yoff, width, height);
- +
- ret = vidconsole_sync_copy(dev, start, line);
- if (ret)
- return ret;
- @@ -437,6 +449,9 @@ static int console_truetype_erase(struct udevice *dev, int xstart, int ystart,
- }
- line += vid_priv->line_length;
- }
- +
- + video_damage(dev->parent, xstart, ystart, xend - xstart, yend - ystart);
- +
- ret = vidconsole_sync_copy(dev, start, line);
- if (ret)
- return ret;
- --
- 2.39.1
- From 2b0c183bd2440bf110c419cb161ce2d19d75db8a Mon Sep 17 00:00:00 2001
- From: Alexander Graf <agraf@csgraf.de>
- Date: Fri, 10 Jun 2022 00:59:18 +0200
- Subject: [PATCH 4/7] video: Add damage notification on bmp display
- Let's report the video damage when we draw a bitmap on the screen. This
- way we can later lazily flush only relevant regions to hardware.
- Link: https://lore.kernel.org/u-boot/20220609225921.62462-5-agraf@csgraf.de/
- Signed-off-by: Alexander Graf <agraf@csgraf.de>
- Reported-by: Da Xue <da@libre.computer>
- ---
- drivers/video/video_bmp.c | 2 ++
- 1 file changed, 2 insertions(+)
- diff --git a/drivers/video/video_bmp.c b/drivers/video/video_bmp.c
- index 6188a13e44e4..7dc5b011a8af 100644
- --- a/drivers/video/video_bmp.c
- +++ b/drivers/video/video_bmp.c
- @@ -424,6 +424,8 @@ int video_bmp_display(struct udevice *dev, ulong bmp_image, int x, int y,
- break;
- };
-
- + video_damage(dev, x, y, width, height);
- +
- /* Find the position of the top left of the image in the framebuffer */
- fb = (uchar *)(priv->fb + y * priv->line_length + x * bpix / 8);
- ret = video_sync_copy(dev, start, fb);
- --
- 2.39.1
- From 48fffb757ef690fc5072e1c05226178cfef1b69a Mon Sep 17 00:00:00 2001
- From: Alexander Graf <agraf@csgraf.de>
- Date: Fri, 10 Jun 2022 00:59:19 +0200
- Subject: [PATCH 5/7] efi_loader: GOP: Add damage notification on BLT
- Now that we have a damage tracking API, let's populate damage done by
- UEFI payloads when they BLT data onto the screen.
- Link: https://lore.kernel.org/u-boot/20220609225921.62462-6-agraf@csgraf.de/
- Signed-off-by: Alexander Graf <agraf@csgraf.de>
- Reported-by: Da Xue <da@libre.computer>
- [Alper: Remove #ifdef DM_VIDEO context, replace DM_VIDEO with VIDEO]
- Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com>
- ---
- lib/efi_loader/efi_gop.c | 7 ++++++-
- 1 file changed, 6 insertions(+), 1 deletion(-)
- diff --git a/lib/efi_loader/efi_gop.c b/lib/efi_loader/efi_gop.c
- index d1dc2f22d0f7..8e7f13bccfee 100644
- --- a/lib/efi_loader/efi_gop.c
- +++ b/lib/efi_loader/efi_gop.c
- @@ -32,6 +32,7 @@ struct efi_gop_obj {
- struct efi_gop ops;
- struct efi_gop_mode_info info;
- struct efi_gop_mode mode;
- + struct udevice *vdev;
- /* Fields we only have access to during init */
- u32 bpix;
- void *fb;
- @@ -243,6 +244,9 @@ static __always_inline efi_status_t gop_blt_int(struct efi_gop *this,
- dlineoff += dwidth;
- }
-
- + if (IS_ENABLED(CONFIG_VIDEO))
- + video_damage(gopobj->vdev, dx, dy, width, height);
- +
- return EFI_SUCCESS;
- }
-
- @@ -468,7 +472,7 @@ efi_status_t efi_gop_register(void)
- u64 fb_base, fb_size;
- void *fb;
- efi_status_t ret;
- - struct udevice *vdev;
- + struct udevice *vdev = NULL;
- struct video_priv *priv;
-
- /* We only support a single video output device for now */
- @@ -547,6 +551,7 @@ efi_status_t efi_gop_register(void)
- gopobj->info.pixels_per_scanline = col;
- gopobj->bpix = bpix;
- gopobj->fb = fb;
- + gopobj->vdev = vdev;
-
- return EFI_SUCCESS;
- }
- --
- 2.39.1
- From 28c2a50ea9f9402de67ce4830814e428f002e66b Mon Sep 17 00:00:00 2001
- From: Alexander Graf <agraf@csgraf.de>
- Date: Fri, 10 Jun 2022 00:59:20 +0200
- Subject: [PATCH 6/7] video: Only dcache flush damaged lines
- Now that we have a damage area tells us which parts of the frame buffer
- actually need updating, let's only dcache flush those on video_sync()
- calls. With this optimization in place, frame buffer updates - especially
- on large screen such as 4k displays - speed up significantly.
- Link: https://lore.kernel.org/u-boot/20220609225921.62462-7-agraf@csgraf.de/
- Signed-off-by: Alexander Graf <agraf@csgraf.de>
- Reported-by: Da Xue <da@libre.computer>
- ---
- drivers/video/video-uclass.c | 51 ++++++++++++++++++++++++++++++------
- 1 file changed, 43 insertions(+), 8 deletions(-)
- diff --git a/drivers/video/video-uclass.c b/drivers/video/video-uclass.c
- index f1fbeaadcbba..bf93f524c7a0 100644
- --- a/drivers/video/video-uclass.c
- +++ b/drivers/video/video-uclass.c
- @@ -297,9 +297,45 @@ int video_damage(struct udevice *vid, int x, int y, int width, int height)
- return 0;
- }
-
- +#if defined(CONFIG_ARM) && !CONFIG_IS_ENABLED(SYS_DCACHE_OFF)
- +static void video_flush_dcache(struct udevice *vid)
- +{
- + struct video_priv *priv = dev_get_uclass_priv(vid);
- +
- + if (!priv->flush_dcache)
- + return;
- +
- + if (!CONFIG_IS_ENABLED(VIDEO_DAMAGE)) {
- + flush_dcache_range((ulong)priv->fb,
- + ALIGN((ulong)priv->fb + priv->fb_size,
- + CONFIG_SYS_CACHELINE_SIZE));
- +
- + return;
- + }
- +
- + if (priv->damage.endx && priv->damage.endy) {
- + int lstart = priv->damage.x * VNBYTES(priv->bpix);
- + int lend = priv->damage.endx * VNBYTES(priv->bpix);
- + int y;
- +
- + for (y = priv->damage.y; y < priv->damage.endy; y++) {
- + ulong fb = (ulong)priv->fb;
- + ulong start = fb + (y * priv->line_length) + lstart;
- + ulong end = start + lend - lstart;
- +
- + start = ALIGN_DOWN(start, CONFIG_SYS_CACHELINE_SIZE);
- + end = ALIGN(end, CONFIG_SYS_CACHELINE_SIZE);
- +
- + flush_dcache_range(start, end);
- + }
- + }
- +}
- +#endif
- +
- /* Flush video activity to the caches */
- int video_sync(struct udevice *vid, bool force)
- {
- + struct video_priv *priv = dev_get_uclass_priv(vid);
- struct video_ops *ops = video_get_ops(vid);
- int ret;
-
- @@ -315,15 +351,8 @@ int video_sync(struct udevice *vid, bool force)
- * out whether it exists? For now, ARM is safe.
- */
- #if defined(CONFIG_ARM) && !CONFIG_IS_ENABLED(SYS_DCACHE_OFF)
- - struct video_priv *priv = dev_get_uclass_priv(vid);
- -
- - if (priv->flush_dcache) {
- - flush_dcache_range((ulong)priv->fb,
- - ALIGN((ulong)priv->fb + priv->fb_size,
- - CONFIG_SYS_CACHELINE_SIZE));
- - }
- + video_flush_dcache(vid);
- #elif defined(CONFIG_VIDEO_SANDBOX_SDL)
- - struct video_priv *priv = dev_get_uclass_priv(vid);
- static ulong last_sync;
-
- if (force || get_timer(last_sync) > 100) {
- @@ -331,6 +360,12 @@ int video_sync(struct udevice *vid, bool force)
- last_sync = get_timer(0);
- }
- #endif
- +
- + if (CONFIG_IS_ENABLED(VIDEO_DAMAGE)) {
- + priv->damage.endx = 0;
- + priv->damage.endy = 0;
- + }
- +
- return 0;
- }
-
- --
- 2.39.1
- From 2b45c07c47f3765e3a04016b4618aa7a986d6ec0 Mon Sep 17 00:00:00 2001
- From: Alexander Graf <agraf@csgraf.de>
- Date: Fri, 10 Jun 2022 00:59:21 +0200
- Subject: [PATCH 7/7] video: Use VIDEO_DAMAGE for VIDEO_COPY
- CONFIG_VIDEO_COPY implemented a range based copying mechanism: If we
- print a single character, it will always copy the full range of bytes
- from the top left corner of the character to the lower right onto the
- uncached frame buffer. This includes pretty much the full line contents
- of the printed character.
- Since we now have proper damage tracking, let's make use of that to reduce
- the amount of data we need to copy. With this patch applied, we will only
- copy the tiny rectangle surrounding characters when we print them,
- speeding up the video console.
- As a bonus, we remove a lot of code.
- Link: https://lore.kernel.org/u-boot/20220609225921.62462-8-agraf@csgraf.de/
- Signed-off-by: Alexander Graf <agraf@csgraf.de>
- [Alper: Fix DM_VIDEO, met->font_size, memmove(dev, video.h conflict]
- Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com>
- ---
- configs/chromebook_coral_defconfig | 1 +
- configs/chromebook_link_defconfig | 1 +
- configs/chromebook_samus_defconfig | 1 +
- configs/minnowmax_defconfig | 1 +
- configs/sandbox_defconfig | 1 +
- configs/xilinx_zynqmp_virt_defconfig | 1 +
- drivers/video/Kconfig | 7 ++-
- drivers/video/console_normal.c | 14 +----
- drivers/video/console_rotate.c | 37 ++---------
- drivers/video/console_truetype.c | 22 ++-----
- drivers/video/vidconsole-uclass.c | 16 -----
- drivers/video/video-uclass.c | 91 ++++++++--------------------
- drivers/video/video_bmp.c | 7 ---
- include/video.h | 37 -----------
- include/video_console.h | 49 ---------------
- 15 files changed, 46 insertions(+), 240 deletions(-)
- diff --git a/configs/chromebook_coral_defconfig b/configs/chromebook_coral_defconfig
- index 45905c6792b8..6a299196ba47 100644
- --- a/configs/chromebook_coral_defconfig
- +++ b/configs/chromebook_coral_defconfig
- @@ -117,6 +117,7 @@ CONFIG_USB_XHCI_HCD=y
- CONFIG_USB_STORAGE=y
- CONFIG_USB_KEYBOARD=y
- CONFIG_VIDEO_COPY=y
- +CONFIG_VIDEO_DAMAGE=y
- CONFIG_FS_CBFS=y
- CONFIG_SPL_FS_CBFS=y
- CONFIG_FAT_WRITE=y
- diff --git a/configs/chromebook_link_defconfig b/configs/chromebook_link_defconfig
- index 541b7fadead4..b6b1734566ac 100644
- --- a/configs/chromebook_link_defconfig
- +++ b/configs/chromebook_link_defconfig
- @@ -74,6 +74,7 @@ CONFIG_TPM_TIS_LPC=y
- CONFIG_USB_STORAGE=y
- CONFIG_USB_KEYBOARD=y
- CONFIG_VIDEO_COPY=y
- +CONFIG_VIDEO_DAMAGE=y
- CONFIG_FRAMEBUFFER_SET_VESA_MODE=y
- CONFIG_FRAMEBUFFER_VESA_MODE_11A=y
- CONFIG_VIDEO_IVYBRIDGE_IGD=y
- diff --git a/configs/chromebook_samus_defconfig b/configs/chromebook_samus_defconfig
- index 27bf046f991a..4a1c6d13decf 100644
- --- a/configs/chromebook_samus_defconfig
- +++ b/configs/chromebook_samus_defconfig
- @@ -78,6 +78,7 @@ CONFIG_TPM_TIS_LPC=y
- CONFIG_USB_STORAGE=y
- CONFIG_USB_KEYBOARD=y
- CONFIG_VIDEO_COPY=y
- +CONFIG_VIDEO_DAMAGE=y
- CONFIG_FRAMEBUFFER_SET_VESA_MODE=y
- CONFIG_FRAMEBUFFER_VESA_MODE_11A=y
- CONFIG_TPM=y
- diff --git a/configs/minnowmax_defconfig b/configs/minnowmax_defconfig
- index e501cc55fb23..75184b512de1 100644
- --- a/configs/minnowmax_defconfig
- +++ b/configs/minnowmax_defconfig
- @@ -69,6 +69,7 @@ CONFIG_SPI=y
- CONFIG_USB_STORAGE=y
- CONFIG_USB_KEYBOARD=y
- CONFIG_VIDEO_COPY=y
- +CONFIG_VIDEO_DAMAGE=y
- CONFIG_FRAMEBUFFER_SET_VESA_MODE=y
- CONFIG_GENERATE_ACPI_TABLE=y
- # CONFIG_GZIP is not set
- diff --git a/configs/sandbox_defconfig b/configs/sandbox_defconfig
- index be46cae7aad7..75ece781fa4d 100644
- --- a/configs/sandbox_defconfig
- +++ b/configs/sandbox_defconfig
- @@ -297,6 +297,7 @@ CONFIG_USB_ETHER=y
- CONFIG_USB_ETH_CDC=y
- CONFIG_VIDEO=y
- CONFIG_VIDEO_COPY=y
- +CONFIG_VIDEO_DAMAGE=y
- CONFIG_CONSOLE_ROTATION=y
- CONFIG_CONSOLE_TRUETYPE=y
- CONFIG_CONSOLE_TRUETYPE_MAX_METRICS=10
- diff --git a/configs/xilinx_zynqmp_virt_defconfig b/configs/xilinx_zynqmp_virt_defconfig
- index 4732c39bdbe1..f42c545d4628 100644
- --- a/configs/xilinx_zynqmp_virt_defconfig
- +++ b/configs/xilinx_zynqmp_virt_defconfig
- @@ -220,6 +220,7 @@ CONFIG_USB_ETHER=y
- CONFIG_USB_ETH_CDC=y
- CONFIG_VIDEO=y
- CONFIG_VIDEO_COPY=y
- +CONFIG_VIDEO_DAMAGE=y
- CONFIG_DISPLAY=y
- CONFIG_VIDEO_SEPS525=y
- CONFIG_SPLASH_SCREEN=y
- diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig
- index 4a27fac2466d..faebcbcbffd3 100644
- --- a/drivers/video/Kconfig
- +++ b/drivers/video/Kconfig
- @@ -53,11 +53,14 @@ config VIDEO_PCI_DEFAULT_FB_SIZE
-
- config VIDEO_COPY
- bool "Enable copying the frame buffer to a hardware copy"
- + depends on VIDEO_DAMAGE
- help
- On some machines (e.g. x86), reading from the frame buffer is very
- slow because it is uncached. To improve performance, this feature
- allows the frame buffer to be kept in cached memory (allocated by
- U-Boot) and then copied to the hardware frame-buffer as needed.
- + It uses the VIDEO_DAMAGE feature to keep track of regions to copy
- + and will only copy actually touched regions.
-
- To use this, your video driver must set @copy_base in
- struct video_uc_plat.
- @@ -71,11 +74,13 @@ config VIDEO_DAMAGE
- have to flush frame buffer contents from CPU caches into RAM which
- can be a slow operation.
-
- - This patch adds damage tracking to collect information about regions
- + This feature adds damage tracking to collect information about regions
- that received updates. When we want to sync, we then only flush
- regions of the frame buffer that were modified before, speeding up
- screen refreshes significantly.
-
- + It is also used by VIDEO_COPY to identify which regions changed.
- +
- config BACKLIGHT_PWM
- bool "Generic PWM based Backlight Driver"
- depends on BACKLIGHT && DM_PWM
- diff --git a/drivers/video/console_normal.c b/drivers/video/console_normal.c
- index e32fb23e3f9f..ebb7fdd69307 100644
- --- a/drivers/video/console_normal.c
- +++ b/drivers/video/console_normal.c
- @@ -21,7 +21,6 @@ static int console_normal_set_row(struct udevice *dev, uint row, int clr)
- struct video_priv *vid_priv = dev_get_uclass_priv(dev->parent);
- void *line, *end;
- int pixels = VIDEO_FONT_HEIGHT * vid_priv->xsize;
- - int ret;
- int i;
-
- line = vid_priv->fb + row * VIDEO_FONT_HEIGHT * vid_priv->line_length;
- @@ -56,9 +55,6 @@ static int console_normal_set_row(struct udevice *dev, uint row, int clr)
- default:
- return -ENOSYS;
- }
- - ret = vidconsole_sync_copy(dev, line, end);
- - if (ret)
- - return ret;
-
- video_damage(dev->parent, 0, VIDEO_FONT_HEIGHT * row, vid_priv->xsize,
- VIDEO_FONT_HEIGHT);
- @@ -73,14 +69,11 @@ static int console_normal_move_rows(struct udevice *dev, uint rowdst,
- void *dst;
- void *src;
- int size;
- - int ret;
-
- dst = vid_priv->fb + rowdst * VIDEO_FONT_HEIGHT * vid_priv->line_length;
- src = vid_priv->fb + rowsrc * VIDEO_FONT_HEIGHT * vid_priv->line_length;
- size = VIDEO_FONT_HEIGHT * vid_priv->line_length * count;
- - ret = vidconsole_memmove(dev, dst, src, size);
- - if (ret)
- - return ret;
- + memmove(dst, src, size);
-
- video_damage(dev->parent, 0, VIDEO_FONT_HEIGHT * rowdst, vid_priv->xsize,
- VIDEO_FONT_HEIGHT * count);
- @@ -97,7 +90,6 @@ static int console_normal_putc_xy(struct udevice *dev, uint x_frac, uint y,
- int i, row;
- void *start;
- void *line;
- - int ret;
-
- start = vid_priv->fb + y * vid_priv->line_length +
- VID_TO_PIXEL(x_frac) * VNBYTES(vid_priv->bpix);
- @@ -168,10 +160,6 @@ static int console_normal_putc_xy(struct udevice *dev, uint x_frac, uint y,
- video_damage(dev->parent, VID_TO_PIXEL(x_frac), y, VIDEO_FONT_WIDTH,
- VIDEO_FONT_HEIGHT);
-
- - ret = vidconsole_sync_copy(dev, start, line);
- - if (ret)
- - return ret;
- -
- return VID_TO_POS(VIDEO_FONT_WIDTH);
- }
-
- diff --git a/drivers/video/console_rotate.c b/drivers/video/console_rotate.c
- index 56e20bb4f32e..ae0cbe41bfe4 100644
- --- a/drivers/video/console_rotate.c
- +++ b/drivers/video/console_rotate.c
- @@ -53,9 +53,6 @@ static int console_set_row_1(struct udevice *dev, uint row, int clr)
- }
- line += vid_priv->line_length;
- }
- - ret = vidconsole_sync_copy(dev, start, line);
- - if (ret)
- - return ret;
-
- video_damage(dev->parent,
- vid_priv->xsize - ((row + 1) * VIDEO_FONT_HEIGHT),
- @@ -81,10 +78,7 @@ static int console_move_rows_1(struct udevice *dev, uint rowdst, uint rowsrc,
- (rowsrc + count) * VIDEO_FONT_HEIGHT * pbytes;
-
- for (j = 0; j < vid_priv->ysize; j++) {
- - ret = vidconsole_memmove(dev, dst, src,
- - VIDEO_FONT_HEIGHT * pbytes * count);
- - if (ret)
- - return ret;
- + memmove(dst, src, VIDEO_FONT_HEIGHT * pbytes * count);
- src += vid_priv->line_length;
- dst += vid_priv->line_length;
- }
- @@ -158,10 +152,6 @@ static int console_putc_xy_1(struct udevice *dev, uint x_frac, uint y, char ch)
- mask >>= 1;
- }
- /* We draw backwards from 'start, so account for the first line */
- - ret = vidconsole_sync_copy(dev, start - vid_priv->line_length, line);
- - if (ret)
- - return ret;
- -
- video_damage(dev->parent,
- vid_priv->xsize - y - VIDEO_FONT_HEIGHT - 1,
- linenum - 1,
- @@ -213,9 +203,6 @@ static int console_set_row_2(struct udevice *dev, uint row, int clr)
- default:
- return -ENOSYS;
- }
- - ret = vidconsole_sync_copy(dev, start, end);
- - if (ret)
- - return ret;
-
- video_damage(dev->parent,
- 0,
- @@ -239,8 +226,8 @@ static int console_move_rows_2(struct udevice *dev, uint rowdst, uint rowsrc,
- vid_priv->line_length;
- src = end - (rowsrc + count) * VIDEO_FONT_HEIGHT *
- vid_priv->line_length;
- - vidconsole_memmove(dev, dst, src,
- - VIDEO_FONT_HEIGHT * vid_priv->line_length * count);
- + memmove(dst, src, VIDEO_FONT_HEIGHT *
- + vid_priv->line_length * count);
-
- video_damage(dev->parent,
- 0,
- @@ -313,10 +300,6 @@ static int console_putc_xy_2(struct udevice *dev, uint x_frac, uint y, char ch)
- }
- line -= vid_priv->line_length;
- }
- - /* Add 4 bytes to allow for the first pixel writen */
- - ret = vidconsole_sync_copy(dev, start + 4, line);
- - if (ret)
- - return ret;
-
- video_damage(dev->parent,
- x - VIDEO_FONT_WIDTH,
- @@ -367,9 +350,6 @@ static int console_set_row_3(struct udevice *dev, uint row, int clr)
- }
- line += vid_priv->line_length;
- }
- - ret = vidconsole_sync_copy(dev, start, line);
- - if (ret)
- - return ret;
-
- video_damage(dev->parent,
- row * VIDEO_FONT_HEIGHT,
- @@ -387,16 +367,13 @@ static int console_move_rows_3(struct udevice *dev, uint rowdst, uint rowsrc,
- int pbytes = VNBYTES(vid_priv->bpix);
- void *dst;
- void *src;
- - int j, ret;
- + int j;
-
- dst = vid_priv->fb + rowdst * VIDEO_FONT_HEIGHT * pbytes;
- src = vid_priv->fb + rowsrc * VIDEO_FONT_HEIGHT * pbytes;
-
- for (j = 0; j < vid_priv->ysize; j++) {
- - ret = vidconsole_memmove(dev, dst, src,
- - VIDEO_FONT_HEIGHT * pbytes * count);
- - if (ret)
- - return ret;
- + memmove(dst, src, VIDEO_FONT_HEIGHT * pbytes * count);
- src += vid_priv->line_length;
- dst += vid_priv->line_length;
- }
- @@ -468,10 +445,6 @@ static int console_putc_xy_3(struct udevice *dev, uint x_frac, uint y, char ch)
- mask >>= 1;
- }
- /* Add a line to allow for the first pixels writen */
- - ret = vidconsole_sync_copy(dev, start + vid_priv->line_length, line);
- - if (ret)
- - return ret;
- -
- video_damage(dev->parent,
- y,
- x - VIDEO_FONT_WIDTH + 1,
- diff --git a/drivers/video/console_truetype.c b/drivers/video/console_truetype.c
- index 5b90a0f91415..552d34191b64 100644
- --- a/drivers/video/console_truetype.c
- +++ b/drivers/video/console_truetype.c
- @@ -149,7 +149,6 @@ static int console_truetype_set_row(struct udevice *dev, uint row, int clr)
- struct console_tt_priv *priv = dev_get_priv(dev);
- struct console_tt_metrics *met = priv->cur_met;
- void *end, *line;
- - int ret;
-
- line = vid_priv->fb + row * met->font_size * vid_priv->line_length;
- end = line + met->font_size * vid_priv->line_length;
- @@ -185,9 +184,6 @@ static int console_truetype_set_row(struct udevice *dev, uint row, int clr)
- default:
- return -ENOSYS;
- }
- - ret = vidconsole_sync_copy(dev, line, end);
- - if (ret)
- - return ret;
-
- video_damage(dev->parent, 0, vc_priv->y_charsize * row, vid_priv->xsize,
- vc_priv->y_charsize);
- @@ -204,14 +200,11 @@ static int console_truetype_move_rows(struct udevice *dev, uint rowdst,
- struct console_tt_metrics *met = priv->cur_met;
- void *dst;
- void *src;
- - int i, diff, ret;
- + int i, diff;
-
- dst = vid_priv->fb + rowdst * met->font_size * vid_priv->line_length;
- src = vid_priv->fb + rowsrc * met->font_size * vid_priv->line_length;
- - ret = vidconsole_memmove(dev, dst, src, met->font_size *
- - vid_priv->line_length * count);
- - if (ret)
- - return ret;
- + memmove(dst, src, met->font_size * vid_priv->line_length * count);
-
- /* Scroll up our position history */
- diff = (rowsrc - rowdst) * met->font_size;
- @@ -241,7 +234,7 @@ static int console_truetype_putc_xy(struct udevice *dev, uint x, uint y,
- u8 *bits, *data;
- int advance;
- void *start, *end, *line;
- - int row, ret;
- + int row;
-
- /* First get some basic metrics about this character */
- stbtt_GetCodepointHMetrics(font, ch, &advance, &lsb);
- @@ -382,9 +375,6 @@ static int console_truetype_putc_xy(struct udevice *dev, uint x, uint y,
- video_damage(dev->parent, VID_TO_PIXEL(x) + xoff,
- y + met->baseline + yoff, width, height);
-
- - ret = vidconsole_sync_copy(dev, start, line);
- - if (ret)
- - return ret;
- free(data);
-
- return width_frac;
- @@ -410,7 +400,7 @@ static int console_truetype_erase(struct udevice *dev, int xstart, int ystart,
- struct video_priv *vid_priv = dev_get_uclass_priv(dev->parent);
- void *start, *line;
- int pixels = xend - xstart;
- - int row, i, ret;
- + int row, i;
-
- start = vid_priv->fb + ystart * vid_priv->line_length;
- start += xstart * VNBYTES(vid_priv->bpix);
- @@ -452,10 +442,6 @@ static int console_truetype_erase(struct udevice *dev, int xstart, int ystart,
-
- video_damage(dev->parent, xstart, ystart, xend - xstart, yend - ystart);
-
- - ret = vidconsole_sync_copy(dev, start, line);
- - if (ret)
- - return ret;
- -
- return 0;
- }
-
- diff --git a/drivers/video/vidconsole-uclass.c b/drivers/video/vidconsole-uclass.c
- index f590ab39d5d6..8792b773b942 100644
- --- a/drivers/video/vidconsole-uclass.c
- +++ b/drivers/video/vidconsole-uclass.c
- @@ -647,22 +647,6 @@ UCLASS_DRIVER(vidconsole) = {
- .per_device_auto = sizeof(struct vidconsole_priv),
- };
-
- -#ifdef CONFIG_VIDEO_COPY
- -int vidconsole_sync_copy(struct udevice *dev, void *from, void *to)
- -{
- - struct udevice *vid = dev_get_parent(dev);
- -
- - return video_sync_copy(vid, from, to);
- -}
- -
- -int vidconsole_memmove(struct udevice *dev, void *dst, const void *src,
- - int size)
- -{
- - memmove(dst, src, size);
- - return vidconsole_sync_copy(dev, dst, dst + size);
- -}
- -#endif
- -
- void vidconsole_position_cursor(struct udevice *dev, unsigned col, unsigned row)
- {
- struct vidconsole_priv *priv = dev_get_uclass_priv(dev);
- diff --git a/drivers/video/video-uclass.c b/drivers/video/video-uclass.c
- index bf93f524c7a0..73601712ef92 100644
- --- a/drivers/video/video-uclass.c
- +++ b/drivers/video/video-uclass.c
- @@ -131,7 +131,6 @@ int video_reserve(ulong *addrp)
- int video_fill(struct udevice *dev, u32 colour)
- {
- struct video_priv *priv = dev_get_uclass_priv(dev);
- - int ret;
-
- switch (priv->bpix) {
- case VIDEO_BPP16:
- @@ -156,9 +155,6 @@ int video_fill(struct udevice *dev, u32 colour)
- memset(priv->fb, colour, priv->fb_size);
- break;
- }
- - ret = video_sync_copy(dev, priv->fb, priv->fb + priv->fb_size);
- - if (ret)
- - return ret;
-
- video_damage(dev, 0, 0, priv->xsize, priv->ysize);
-
- @@ -332,6 +328,27 @@ static void video_flush_dcache(struct udevice *vid)
- }
- #endif
-
- +static void video_flush_copy(struct udevice *vid)
- +{
- + struct video_priv *priv = dev_get_uclass_priv(vid);
- +
- + if (!priv->copy_fb)
- + return;
- +
- + if (priv->damage.endx && priv->damage.endy) {
- + int lstart = priv->damage.x * VNBYTES(priv->bpix);
- + int lend = priv->damage.endx * VNBYTES(priv->bpix);
- + int y;
- +
- + for (y = priv->damage.y; y < priv->damage.endy; y++) {
- + ulong offset = (y * priv->line_length) + lstart;
- + ulong len = lend - lstart;
- +
- + memcpy(priv->copy_fb + offset, priv->fb + offset, len);
- + }
- + }
- +}
- +
- /* Flush video activity to the caches */
- int video_sync(struct udevice *vid, bool force)
- {
- @@ -339,6 +356,9 @@ int video_sync(struct udevice *vid, bool force)
- struct video_ops *ops = video_get_ops(vid);
- int ret;
-
- + if (CONFIG_IS_ENABLED(VIDEO_COPY))
- + video_flush_copy(vid);
- +
- if (ops && ops->video_sync) {
- ret = ops->video_sync(vid);
- if (ret)
- @@ -413,69 +433,6 @@ int video_get_ysize(struct udevice *dev)
- return priv->ysize;
- }
-
- -#ifdef CONFIG_VIDEO_COPY
- -int video_sync_copy(struct udevice *dev, void *from, void *to)
- -{
- - struct video_priv *priv = dev_get_uclass_priv(dev);
- -
- - if (priv->copy_fb) {
- - long offset, size;
- -
- - /* Find the offset of the first byte to copy */
- - if ((ulong)to > (ulong)from) {
- - size = to - from;
- - offset = from - priv->fb;
- - } else {
- - size = from - to;
- - offset = to - priv->fb;
- - }
- -
- - /*
- - * Allow a bit of leeway for valid requests somewhere near the
- - * frame buffer
- - */
- - if (offset < -priv->fb_size || offset > 2 * priv->fb_size) {
- -#ifdef DEBUG
- - char str[120];
- -
- - snprintf(str, sizeof(str),
- - "[** FAULT sync_copy fb=%p, from=%p, to=%p, offset=%lx]",
- - priv->fb, from, to, offset);
- - console_puts_select_stderr(true, str);
- -#endif
- - return -EFAULT;
- - }
- -
- - /*
- - * Silently crop the memcpy. This allows callers to avoid doing
- - * this themselves. It is common for the end pointer to go a
- - * few lines after the end of the frame buffer, since most of
- - * the update algorithms terminate a line after their last write
- - */
- - if (offset + size > priv->fb_size) {
- - size = priv->fb_size - offset;
- - } else if (offset < 0) {
- - size += offset;
- - offset = 0;
- - }
- -
- - memcpy(priv->copy_fb + offset, priv->fb + offset, size);
- - }
- -
- - return 0;
- -}
- -
- -int video_sync_copy_all(struct udevice *dev)
- -{
- - struct video_priv *priv = dev_get_uclass_priv(dev);
- -
- - video_sync_copy(dev, priv->fb, priv->fb + priv->fb_size);
- -
- - return 0;
- -}
- -
- -#endif
- -
- #define SPLASH_DECL(_name) \
- extern u8 __splash_ ## _name ## _begin[]; \
- extern u8 __splash_ ## _name ## _end[]
- diff --git a/drivers/video/video_bmp.c b/drivers/video/video_bmp.c
- index 7dc5b011a8af..609dc9fef695 100644
- --- a/drivers/video/video_bmp.c
- +++ b/drivers/video/video_bmp.c
- @@ -254,7 +254,6 @@ int video_bmp_display(struct udevice *dev, ulong bmp_image, int x, int y,
- enum video_format eformat;
- struct bmp_color_table_entry *palette;
- int hdr_size;
- - int ret;
-
- if (!bmp || !(bmp->header.signature[0] == 'B' &&
- bmp->header.signature[1] == 'M')) {
- @@ -426,11 +425,5 @@ int video_bmp_display(struct udevice *dev, ulong bmp_image, int x, int y,
-
- video_damage(dev, x, y, width, height);
-
- - /* Find the position of the top left of the image in the framebuffer */
- - fb = (uchar *)(priv->fb + y * priv->line_length + x * bpix / 8);
- - ret = video_sync_copy(dev, start, fb);
- - if (ret)
- - return log_ret(ret);
- -
- return video_sync(dev, false);
- }
- diff --git a/include/video.h b/include/video.h
- index 4b35e97f79ef..e1162fc53311 100644
- --- a/include/video.h
- +++ b/include/video.h
- @@ -302,43 +302,6 @@ void video_set_default_colors(struct udevice *dev, bool invert);
- */
- int video_default_font_height(struct udevice *dev);
-
- -#ifdef CONFIG_VIDEO_COPY
- -/**
- - * vidconsole_sync_copy() - Sync back to the copy framebuffer
- - *
- - * This ensures that the copy framebuffer has the same data as the framebuffer
- - * for a particular region. It should be called after the framebuffer is updated
- - *
- - * @from and @to can be in either order. The region between them is synced.
- - *
- - * @dev: Vidconsole device being updated
- - * @from: Start/end address within the framebuffer (->fb)
- - * @to: Other address within the frame buffer
- - * Return: 0 if OK, -EFAULT if the start address is before the start of the
- - * frame buffer start
- - */
- -int video_sync_copy(struct udevice *dev, void *from, void *to);
- -
- -/**
- - * video_sync_copy_all() - Sync the entire framebuffer to the copy
- - *
- - * @dev: Vidconsole device being updated
- - * Return: 0 (always)
- - */
- -int video_sync_copy_all(struct udevice *dev);
- -#else
- -static inline int video_sync_copy(struct udevice *dev, void *from, void *to)
- -{
- - return 0;
- -}
- -
- -static inline int video_sync_copy_all(struct udevice *dev)
- -{
- - return 0;
- -}
- -
- -#endif
- -
- /**
- * video_damage() - Notify the video subsystem about screen updates.
- *
- diff --git a/include/video_console.h b/include/video_console.h
- index 1ef7b442fcca..d1e44c4530e2 100644
- --- a/include/video_console.h
- +++ b/include/video_console.h
- @@ -258,55 +258,6 @@ int vidconsole_select_font(struct udevice *dev, const char *name, uint size);
- */
- const char *vidconsole_get_font(struct udevice *dev, uint *sizep);
-
- -#ifdef CONFIG_VIDEO_COPY
- -/**
- - * vidconsole_sync_copy() - Sync back to the copy framebuffer
- - *
- - * This ensures that the copy framebuffer has the same data as the framebuffer
- - * for a particular region. It should be called after the framebuffer is updated
- - *
- - * @from and @to can be in either order. The region between them is synced.
- - *
- - * @dev: Vidconsole device being updated
- - * @from: Start/end address within the framebuffer (->fb)
- - * @to: Other address within the frame buffer
- - * Return: 0 if OK, -EFAULT if the start address is before the start of the
- - * frame buffer start
- - */
- -int vidconsole_sync_copy(struct udevice *dev, void *from, void *to);
- -
- -/**
- - * vidconsole_memmove() - Perform a memmove() within the frame buffer
- - *
- - * This handles a memmove(), e.g. for scrolling. It also updates the copy
- - * framebuffer.
- - *
- - * @dev: Vidconsole device being updated
- - * @dst: Destination address within the framebuffer (->fb)
- - * @src: Source address within the framebuffer (->fb)
- - * @size: Number of bytes to transfer
- - * Return: 0 if OK, -EFAULT if the start address is before the start of the
- - * frame buffer start
- - */
- -int vidconsole_memmove(struct udevice *dev, void *dst, const void *src,
- - int size);
- -#else
- -static inline int vidconsole_sync_copy(struct udevice *dev, void *from,
- - void *to)
- -{
- - return 0;
- -}
- -
- -static inline int vidconsole_memmove(struct udevice *dev, void *dst,
- - const void *src, int size)
- -{
- - memmove(dst, src, size);
- -
- - return 0;
- -}
- -
- -#endif
- -
- /*
- * Convert an UTF-8 byte into the corresponding character in the CP437
- * code page. Returns 0 if that character is part of a multi-byte sequence.
- --
- 2.39.1
|