blob: cf81b907969cf31c676738db7dc2db973632f24b [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0+
Simon Glass90b6fef2016-01-18 19:52:26 -07002/*
3 * Copyright (c) 2014 Google, Inc
4 * Written by Simon Glass <sjg@chromium.org>
Simon Glass90b6fef2016-01-18 19:52:26 -07005 */
6
Simon Glass90b6fef2016-01-18 19:52:26 -07007#include <bzlib.h>
8#include <dm.h>
Simon Glass8bd7f602021-11-19 13:23:58 -07009#include <gzip.h>
Simon Glass0f2af882020-05-10 11:40:05 -060010#include <log.h>
Simon Glass9bc15642020-02-03 07:36:16 -070011#include <malloc.h>
Simon Glass90b6fef2016-01-18 19:52:26 -070012#include <mapmem.h>
13#include <os.h>
14#include <video.h>
15#include <video_console.h>
Simon Glassc3b5adf2021-11-19 13:23:50 -070016#include <asm/test.h>
Sergei Antonov5da2b462023-06-13 00:19:04 +030017#include <asm/sdl.h>
Simon Glass90b6fef2016-01-18 19:52:26 -070018#include <dm/test.h>
19#include <dm/uclass-internal.h>
Simon Glass75c4d412020-07-19 10:15:37 -060020#include <test/test.h>
Simon Glass90b6fef2016-01-18 19:52:26 -070021#include <test/ut.h>
22
23/*
24 * These tests use the standard sandbox frame buffer, the resolution of which
25 * is defined in the device tree. This only supports 16bpp so the tests only
26 * test that code path. It would be possible to adjust this fairly easily,
27 * by adjusting the bpix value in struct sandbox_sdl_plat. However the code
28 * in sandbox_sdl_sync() would also need to change to handle the different
29 * surface depth.
30 */
Simon Glass90b6fef2016-01-18 19:52:26 -070031/* Basic test of the video uclass */
32static int dm_test_video_base(struct unit_test_state *uts)
33{
34 struct video_priv *priv;
35 struct udevice *dev;
36
37 ut_assertok(uclass_get_device(UCLASS_VIDEO, 0, &dev));
38 ut_asserteq(1366, video_get_xsize(dev));
39 ut_asserteq(768, video_get_ysize(dev));
40 priv = dev_get_uclass_priv(dev);
41 ut_asserteq(priv->fb_size, 1366 * 768 * 2);
42
43 return 0;
44}
Simon Glass1a92f832024-08-22 07:57:48 -060045DM_TEST(dm_test_video_base, UTF_SCAN_PDATA | UTF_SCAN_FDT);
Simon Glass90b6fef2016-01-18 19:52:26 -070046
47/**
48 * compress_frame_buffer() - Compress the frame buffer and return its size
49 *
50 * We want to write tests which perform operations on the video console and
51 * check that the frame buffer ends up with the correct contents. But it is
52 * painful to store 'known good' images for comparison with the frame
53 * buffer. As an alternative, we can compress the frame buffer and check the
54 * size of the compressed data. This provides a pretty good level of
55 * certainty and the resulting tests need only check a single value.
56 *
Simon Glass2a0f8e32020-07-02 21:12:29 -060057 * @uts: Test state
Simon Glass90b6fef2016-01-18 19:52:26 -070058 * @dev: Video device
Alper Nebi Yasaka29b0f92023-08-20 17:46:46 +030059 * @use_copy: Use copy frame buffer if available
Heinrich Schuchardt47b4c022022-01-19 18:05:50 +010060 * Return: compressed size of the frame buffer, or -ve on error
Simon Glass90b6fef2016-01-18 19:52:26 -070061 */
Simon Glass2a0f8e32020-07-02 21:12:29 -060062static int compress_frame_buffer(struct unit_test_state *uts,
Alper Nebi Yasaka29b0f92023-08-20 17:46:46 +030063 struct udevice *dev,
64 bool use_copy)
Simon Glass90b6fef2016-01-18 19:52:26 -070065{
66 struct video_priv *priv = dev_get_uclass_priv(dev);
67 uint destlen;
68 void *dest;
69 int ret;
70
Alper Nebi Yasaka29b0f92023-08-20 17:46:46 +030071 if (!IS_ENABLED(CONFIG_VIDEO_COPY))
72 use_copy = false;
73
Simon Glass90b6fef2016-01-18 19:52:26 -070074 destlen = priv->fb_size;
75 dest = malloc(priv->fb_size);
76 if (!dest)
77 return -ENOMEM;
78 ret = BZ2_bzBuffToBuffCompress(dest, &destlen,
Alper Nebi Yasaka29b0f92023-08-20 17:46:46 +030079 use_copy ? priv->copy_fb : priv->fb,
80 priv->fb_size,
Simon Glass90b6fef2016-01-18 19:52:26 -070081 3, 0, 0);
82 free(dest);
83 if (ret)
84 return ret;
85
86 return destlen;
87}
88
Alper Nebi Yasake85a8d02023-08-18 13:31:36 +030089/**
90 * check_copy_frame_buffer() - Compare main frame buffer to copy
91 *
92 * If the copy frame buffer is enabled, this compares it to the main
93 * frame buffer. Normally they should have the same contents after a
94 * sync.
95 *
96 * @uts: Test state
97 * @dev: Video device
98 * Return: 0, or -ve on error
99 */
100static int check_copy_frame_buffer(struct unit_test_state *uts,
101 struct udevice *dev)
102{
103 struct video_priv *priv = dev_get_uclass_priv(dev);
104
105 if (!IS_ENABLED(CONFIG_VIDEO_COPY))
106 return 0;
107
108 ut_assertf(!memcmp(priv->fb, priv->copy_fb, priv->fb_size),
109 "Copy framebuffer does not match fb");
110
111 return 0;
112}
113
Simon Glass90b6fef2016-01-18 19:52:26 -0700114/*
115 * Call this function at any point to halt and show the current display. Be
116 * sure to run the test with the -l flag.
117 */
118static void __maybe_unused see_output(void)
119{
120 video_sync_all();
121 while (1);
122}
123
Simon Glassdaac9c72016-01-14 18:10:50 -0700124/* Select the video console driver to use for a video device */
125static int select_vidconsole(struct unit_test_state *uts, const char *drv_name)
126{
127 struct sandbox_sdl_plat *plat;
128 struct udevice *dev;
129
130 ut_assertok(uclass_find_device(UCLASS_VIDEO, 0, &dev));
131 ut_assert(!device_active(dev));
Simon Glassfa20e932020-12-03 16:55:20 -0700132 plat = dev_get_plat(dev);
Simon Glassdaac9c72016-01-14 18:10:50 -0700133 plat->vidconsole_drv_name = "vidconsole0";
134
135 return 0;
136}
137
Simon Glass87a3cd72021-11-19 13:24:03 -0700138/**
139 * video_get_nologo() - Disable the logo on the video device and return it
140 *
141 * @uts: Test state
142 * @devp: Returns video device
Heinrich Schuchardt47b4c022022-01-19 18:05:50 +0100143 * Return: 0 if OK, -ve on error
Simon Glass87a3cd72021-11-19 13:24:03 -0700144 */
145static int video_get_nologo(struct unit_test_state *uts, struct udevice **devp)
146{
147 struct video_uc_plat *uc_plat;
148 struct udevice *dev;
149
150 ut_assertok(uclass_find_first_device(UCLASS_VIDEO, &dev));
151 ut_assertnonnull(dev);
152 uc_plat = dev_get_uclass_plat(dev);
153 uc_plat->hide_logo = true;
154
155 /* now probe it */
156 ut_assertok(uclass_first_device_err(UCLASS_VIDEO, &dev));
157 ut_assertnonnull(dev);
158 *devp = dev;
159
160 return 0;
161}
162
Simon Glass90b6fef2016-01-18 19:52:26 -0700163/* Test text output works on the video console */
164static int dm_test_video_text(struct unit_test_state *uts)
165{
166 struct udevice *dev, *con;
167 int i;
168
169#define WHITE 0xffff
170#define SCROLL_LINES 100
171
Simon Glassdaac9c72016-01-14 18:10:50 -0700172 ut_assertok(select_vidconsole(uts, "vidconsole0"));
Simon Glass87a3cd72021-11-19 13:24:03 -0700173 ut_assertok(video_get_nologo(uts, &dev));
Dzmitry Sankouskifc785c52023-03-07 13:21:20 +0300174 ut_assertok(uclass_get_device(UCLASS_VIDEO_CONSOLE, 0, &con));
175 ut_assertok(vidconsole_select_font(con, "8x16", 0));
Alper Nebi Yasaka29b0f92023-08-20 17:46:46 +0300176 ut_asserteq(46, compress_frame_buffer(uts, dev, false));
Alper Nebi Yasake85a8d02023-08-18 13:31:36 +0300177 ut_assertok(check_copy_frame_buffer(uts, dev));
Simon Glass90b6fef2016-01-18 19:52:26 -0700178
179 ut_assertok(uclass_get_device(UCLASS_VIDEO_CONSOLE, 0, &con));
180 vidconsole_putc_xy(con, 0, 0, 'a');
Alper Nebi Yasaka29b0f92023-08-20 17:46:46 +0300181 ut_asserteq(79, compress_frame_buffer(uts, dev, false));
Alper Nebi Yasake85a8d02023-08-18 13:31:36 +0300182 ut_assertok(check_copy_frame_buffer(uts, dev));
Simon Glass90b6fef2016-01-18 19:52:26 -0700183
184 vidconsole_putc_xy(con, 0, 0, ' ');
Alper Nebi Yasaka29b0f92023-08-20 17:46:46 +0300185 ut_asserteq(46, compress_frame_buffer(uts, dev, false));
Alper Nebi Yasake85a8d02023-08-18 13:31:36 +0300186 ut_assertok(check_copy_frame_buffer(uts, dev));
Simon Glass90b6fef2016-01-18 19:52:26 -0700187
188 for (i = 0; i < 20; i++)
Simon Glass52c10c52016-01-14 18:10:37 -0700189 vidconsole_putc_xy(con, VID_TO_POS(i * 8), 0, ' ' + i);
Alper Nebi Yasaka29b0f92023-08-20 17:46:46 +0300190 ut_asserteq(273, compress_frame_buffer(uts, dev, false));
Alper Nebi Yasake85a8d02023-08-18 13:31:36 +0300191 ut_assertok(check_copy_frame_buffer(uts, dev));
Simon Glass90b6fef2016-01-18 19:52:26 -0700192
193 vidconsole_set_row(con, 0, WHITE);
Alper Nebi Yasaka29b0f92023-08-20 17:46:46 +0300194 ut_asserteq(46, compress_frame_buffer(uts, dev, false));
Alper Nebi Yasake85a8d02023-08-18 13:31:36 +0300195 ut_assertok(check_copy_frame_buffer(uts, dev));
Simon Glass90b6fef2016-01-18 19:52:26 -0700196
197 for (i = 0; i < 20; i++)
Simon Glass52c10c52016-01-14 18:10:37 -0700198 vidconsole_putc_xy(con, VID_TO_POS(i * 8), 0, ' ' + i);
Alper Nebi Yasaka29b0f92023-08-20 17:46:46 +0300199 ut_asserteq(273, compress_frame_buffer(uts, dev, false));
Alper Nebi Yasake85a8d02023-08-18 13:31:36 +0300200 ut_assertok(check_copy_frame_buffer(uts, dev));
Simon Glass90b6fef2016-01-18 19:52:26 -0700201
202 return 0;
203}
Simon Glass1a92f832024-08-22 07:57:48 -0600204DM_TEST(dm_test_video_text, UTF_SCAN_PDATA | UTF_SCAN_FDT);
Simon Glass90b6fef2016-01-18 19:52:26 -0700205
Dzmitry Sankouskifc785c52023-03-07 13:21:20 +0300206static int dm_test_video_text_12x22(struct unit_test_state *uts)
207{
208 struct udevice *dev, *con;
209 int i;
210
211#define WHITE 0xffff
212#define SCROLL_LINES 100
213
214 ut_assertok(select_vidconsole(uts, "vidconsole0"));
215 ut_assertok(video_get_nologo(uts, &dev));
216 ut_assertok(uclass_get_device(UCLASS_VIDEO_CONSOLE, 0, &con));
217 ut_assertok(vidconsole_select_font(con, "12x22", 0));
Alper Nebi Yasaka29b0f92023-08-20 17:46:46 +0300218 ut_asserteq(46, compress_frame_buffer(uts, dev, false));
Alper Nebi Yasake85a8d02023-08-18 13:31:36 +0300219 ut_assertok(check_copy_frame_buffer(uts, dev));
Dzmitry Sankouskifc785c52023-03-07 13:21:20 +0300220
221 ut_assertok(uclass_get_device(UCLASS_VIDEO_CONSOLE, 0, &con));
222 vidconsole_putc_xy(con, 0, 0, 'a');
Alper Nebi Yasaka29b0f92023-08-20 17:46:46 +0300223 ut_asserteq(89, compress_frame_buffer(uts, dev, false));
Alper Nebi Yasake85a8d02023-08-18 13:31:36 +0300224 ut_assertok(check_copy_frame_buffer(uts, dev));
Dzmitry Sankouskifc785c52023-03-07 13:21:20 +0300225
226 vidconsole_putc_xy(con, 0, 0, ' ');
Alper Nebi Yasaka29b0f92023-08-20 17:46:46 +0300227 ut_asserteq(46, compress_frame_buffer(uts, dev, false));
Alper Nebi Yasake85a8d02023-08-18 13:31:36 +0300228 ut_assertok(check_copy_frame_buffer(uts, dev));
Dzmitry Sankouskifc785c52023-03-07 13:21:20 +0300229
230 for (i = 0; i < 20; i++)
231 vidconsole_putc_xy(con, VID_TO_POS(i * 8), 0, ' ' + i);
Alper Nebi Yasaka29b0f92023-08-20 17:46:46 +0300232 ut_asserteq(363, compress_frame_buffer(uts, dev, false));
Alper Nebi Yasake85a8d02023-08-18 13:31:36 +0300233 ut_assertok(check_copy_frame_buffer(uts, dev));
Dzmitry Sankouskifc785c52023-03-07 13:21:20 +0300234
235 vidconsole_set_row(con, 0, WHITE);
Alper Nebi Yasaka29b0f92023-08-20 17:46:46 +0300236 ut_asserteq(46, compress_frame_buffer(uts, dev, false));
Alper Nebi Yasake85a8d02023-08-18 13:31:36 +0300237 ut_assertok(check_copy_frame_buffer(uts, dev));
Dzmitry Sankouskifc785c52023-03-07 13:21:20 +0300238
239 for (i = 0; i < 20; i++)
240 vidconsole_putc_xy(con, VID_TO_POS(i * 8), 0, ' ' + i);
Alper Nebi Yasaka29b0f92023-08-20 17:46:46 +0300241 ut_asserteq(363, compress_frame_buffer(uts, dev, false));
Alper Nebi Yasake85a8d02023-08-18 13:31:36 +0300242 ut_assertok(check_copy_frame_buffer(uts, dev));
Dzmitry Sankouskifc785c52023-03-07 13:21:20 +0300243
244 return 0;
245}
Simon Glass1a92f832024-08-22 07:57:48 -0600246DM_TEST(dm_test_video_text_12x22, UTF_SCAN_PDATA | UTF_SCAN_FDT);
Dzmitry Sankouskifc785c52023-03-07 13:21:20 +0300247
Simon Glass90b6fef2016-01-18 19:52:26 -0700248/* Test handling of special characters in the console */
249static int dm_test_video_chars(struct unit_test_state *uts)
250{
251 struct udevice *dev, *con;
Simon Glass37b80202016-01-14 18:10:38 -0700252 const char *test_string = "Well\b\b\b\bxhe is\r \n\ta very \amodest \bman\n\t\tand Has much to\b\bto be modest about.";
Simon Glass90b6fef2016-01-18 19:52:26 -0700253
Simon Glassdaac9c72016-01-14 18:10:50 -0700254 ut_assertok(select_vidconsole(uts, "vidconsole0"));
Simon Glass87a3cd72021-11-19 13:24:03 -0700255 ut_assertok(video_get_nologo(uts, &dev));
Simon Glass90b6fef2016-01-18 19:52:26 -0700256 ut_assertok(uclass_get_device(UCLASS_VIDEO_CONSOLE, 0, &con));
Dzmitry Sankouskifc785c52023-03-07 13:21:20 +0300257 ut_assertok(vidconsole_select_font(con, "8x16", 0));
Rob Clark985935b2017-09-25 15:45:08 -0400258 vidconsole_put_string(con, test_string);
Alper Nebi Yasaka29b0f92023-08-20 17:46:46 +0300259 ut_asserteq(466, compress_frame_buffer(uts, dev, false));
Alper Nebi Yasake85a8d02023-08-18 13:31:36 +0300260 ut_assertok(check_copy_frame_buffer(uts, dev));
Simon Glass90b6fef2016-01-18 19:52:26 -0700261
262 return 0;
263}
Simon Glass1a92f832024-08-22 07:57:48 -0600264DM_TEST(dm_test_video_chars, UTF_SCAN_PDATA | UTF_SCAN_FDT);
Simon Glass90b6fef2016-01-18 19:52:26 -0700265
Rob Clark09d64b32017-09-25 15:45:09 -0400266#ifdef CONFIG_VIDEO_ANSI
267#define ANSI_ESC "\x1b"
268/* Test handling of ANSI escape sequences */
269static int dm_test_video_ansi(struct unit_test_state *uts)
270{
271 struct udevice *dev, *con;
272
273 ut_assertok(select_vidconsole(uts, "vidconsole0"));
Simon Glass87a3cd72021-11-19 13:24:03 -0700274 ut_assertok(video_get_nologo(uts, &dev));
Rob Clark09d64b32017-09-25 15:45:09 -0400275 ut_assertok(uclass_get_device(UCLASS_VIDEO_CONSOLE, 0, &con));
Dzmitry Sankouskifc785c52023-03-07 13:21:20 +0300276 ut_assertok(vidconsole_select_font(con, "8x16", 0));
Rob Clark09d64b32017-09-25 15:45:09 -0400277
278 /* reference clear: */
279 video_clear(con->parent);
Simon Glass0806dcc2018-10-01 11:55:14 -0600280 video_sync(con->parent, false);
Alper Nebi Yasaka29b0f92023-08-20 17:46:46 +0300281 ut_asserteq(46, compress_frame_buffer(uts, dev, false));
Alper Nebi Yasake85a8d02023-08-18 13:31:36 +0300282 ut_assertok(check_copy_frame_buffer(uts, dev));
Rob Clark09d64b32017-09-25 15:45:09 -0400283
284 /* test clear escape sequence: [2J */
285 vidconsole_put_string(con, "A\tB\tC"ANSI_ESC"[2J");
Alper Nebi Yasaka29b0f92023-08-20 17:46:46 +0300286 ut_asserteq(46, compress_frame_buffer(uts, dev, false));
Alper Nebi Yasake85a8d02023-08-18 13:31:36 +0300287 ut_assertok(check_copy_frame_buffer(uts, dev));
Rob Clark09d64b32017-09-25 15:45:09 -0400288
289 /* test set-cursor: [%d;%df */
290 vidconsole_put_string(con, "abc"ANSI_ESC"[2;2fab"ANSI_ESC"[4;4fcd");
Alper Nebi Yasaka29b0f92023-08-20 17:46:46 +0300291 ut_asserteq(143, compress_frame_buffer(uts, dev, false));
Alper Nebi Yasake85a8d02023-08-18 13:31:36 +0300292 ut_assertok(check_copy_frame_buffer(uts, dev));
Rob Clark09d64b32017-09-25 15:45:09 -0400293
294 /* test colors (30-37 fg color, 40-47 bg color) */
295 vidconsole_put_string(con, ANSI_ESC"[30;41mfoo"); /* black on red */
296 vidconsole_put_string(con, ANSI_ESC"[33;44mbar"); /* yellow on blue */
Alper Nebi Yasaka29b0f92023-08-20 17:46:46 +0300297 ut_asserteq(272, compress_frame_buffer(uts, dev, false));
Alper Nebi Yasake85a8d02023-08-18 13:31:36 +0300298 ut_assertok(check_copy_frame_buffer(uts, dev));
Rob Clark09d64b32017-09-25 15:45:09 -0400299
300 return 0;
301}
Simon Glass1a92f832024-08-22 07:57:48 -0600302DM_TEST(dm_test_video_ansi, UTF_SCAN_PDATA | UTF_SCAN_FDT);
Rob Clark09d64b32017-09-25 15:45:09 -0400303#endif
304
Simon Glass90b6fef2016-01-18 19:52:26 -0700305/**
306 * check_vidconsole_output() - Run a text console test
307 *
308 * @uts: Test state
Simon Glass4425bf42020-07-02 21:12:28 -0600309 * @rot: Console rotation (0=normal orientation, 1=90 degrees clockwise,
310 * 2=upside down, 3=90 degree counterclockwise)
Simon Glass90b6fef2016-01-18 19:52:26 -0700311 * @wrap_size: Expected size of compressed frame buffer for the wrap test
312 * @scroll_size: Same for the scroll test
Heinrich Schuchardt47b4c022022-01-19 18:05:50 +0100313 * Return: 0 on success
Simon Glass90b6fef2016-01-18 19:52:26 -0700314 */
315static int check_vidconsole_output(struct unit_test_state *uts, int rot,
316 int wrap_size, int scroll_size)
317{
318 struct udevice *dev, *con;
319 struct sandbox_sdl_plat *plat;
320 int i;
321
322 ut_assertok(uclass_find_device(UCLASS_VIDEO, 0, &dev));
323 ut_assert(!device_active(dev));
Simon Glassfa20e932020-12-03 16:55:20 -0700324 plat = dev_get_plat(dev);
Simon Glass90b6fef2016-01-18 19:52:26 -0700325 plat->rot = rot;
326
Simon Glass87a3cd72021-11-19 13:24:03 -0700327 ut_assertok(video_get_nologo(uts, &dev));
Simon Glass90b6fef2016-01-18 19:52:26 -0700328 ut_assertok(uclass_get_device(UCLASS_VIDEO_CONSOLE, 0, &con));
Dzmitry Sankouskifc785c52023-03-07 13:21:20 +0300329 ut_assertok(vidconsole_select_font(con, "8x16", 0));
Alper Nebi Yasaka29b0f92023-08-20 17:46:46 +0300330 ut_asserteq(46, compress_frame_buffer(uts, dev, false));
Alper Nebi Yasake85a8d02023-08-18 13:31:36 +0300331 ut_assertok(check_copy_frame_buffer(uts, dev));
Simon Glass90b6fef2016-01-18 19:52:26 -0700332
333 /* Check display wrap */
334 for (i = 0; i < 120; i++)
335 vidconsole_put_char(con, 'A' + i % 50);
Alper Nebi Yasaka29b0f92023-08-20 17:46:46 +0300336 ut_asserteq(wrap_size, compress_frame_buffer(uts, dev, false));
Alper Nebi Yasake85a8d02023-08-18 13:31:36 +0300337 ut_assertok(check_copy_frame_buffer(uts, dev));
Simon Glass90b6fef2016-01-18 19:52:26 -0700338
339 /* Check display scrolling */
340 for (i = 0; i < SCROLL_LINES; i++) {
341 vidconsole_put_char(con, 'A' + i % 50);
342 vidconsole_put_char(con, '\n');
343 }
Alper Nebi Yasaka29b0f92023-08-20 17:46:46 +0300344 ut_asserteq(scroll_size, compress_frame_buffer(uts, dev, false));
Alper Nebi Yasake85a8d02023-08-18 13:31:36 +0300345 ut_assertok(check_copy_frame_buffer(uts, dev));
Simon Glass90b6fef2016-01-18 19:52:26 -0700346
347 /* If we scroll enough, the screen becomes blank again */
348 for (i = 0; i < SCROLL_LINES; i++)
349 vidconsole_put_char(con, '\n');
Alper Nebi Yasaka29b0f92023-08-20 17:46:46 +0300350 ut_asserteq(46, compress_frame_buffer(uts, dev, false));
Alper Nebi Yasake85a8d02023-08-18 13:31:36 +0300351 ut_assertok(check_copy_frame_buffer(uts, dev));
Simon Glass90b6fef2016-01-18 19:52:26 -0700352
353 return 0;
354}
355
356/* Test text output through the console uclass */
357static int dm_test_video_context(struct unit_test_state *uts)
358{
Simon Glassdaac9c72016-01-14 18:10:50 -0700359 ut_assertok(select_vidconsole(uts, "vidconsole0"));
360 ut_assertok(check_vidconsole_output(uts, 0, 788, 453));
361
362 return 0;
Simon Glass90b6fef2016-01-18 19:52:26 -0700363}
Simon Glass1a92f832024-08-22 07:57:48 -0600364DM_TEST(dm_test_video_context, UTF_SCAN_PDATA | UTF_SCAN_FDT);
Simon Glassa0f1efe2016-01-18 19:52:27 -0700365
366/* Test rotated text output through the console uclass */
367static int dm_test_video_rotation1(struct unit_test_state *uts)
368{
369 ut_assertok(check_vidconsole_output(uts, 1, 1112, 680));
370
371 return 0;
372}
Simon Glass1a92f832024-08-22 07:57:48 -0600373DM_TEST(dm_test_video_rotation1, UTF_SCAN_PDATA | UTF_SCAN_FDT);
Simon Glassa0f1efe2016-01-18 19:52:27 -0700374
375/* Test rotated text output through the console uclass */
376static int dm_test_video_rotation2(struct unit_test_state *uts)
377{
Simon Glassf50a6b92020-07-02 21:12:17 -0600378 ut_assertok(check_vidconsole_output(uts, 2, 783, 445));
Simon Glassa0f1efe2016-01-18 19:52:27 -0700379
380 return 0;
381}
Simon Glass1a92f832024-08-22 07:57:48 -0600382DM_TEST(dm_test_video_rotation2, UTF_SCAN_PDATA | UTF_SCAN_FDT);
Simon Glassa0f1efe2016-01-18 19:52:27 -0700383
384/* Test rotated text output through the console uclass */
385static int dm_test_video_rotation3(struct unit_test_state *uts)
386{
387 ut_assertok(check_vidconsole_output(uts, 3, 1134, 681));
388
389 return 0;
390}
Simon Glass1a92f832024-08-22 07:57:48 -0600391DM_TEST(dm_test_video_rotation3, UTF_SCAN_PDATA | UTF_SCAN_FDT);
Simon Glass7a1cb292016-01-18 19:52:28 -0700392
393/* Read a file into memory and return a pointer to it */
394static int read_file(struct unit_test_state *uts, const char *fname,
395 ulong *addrp)
396{
397 int buf_size = 100000;
398 ulong addr = 0;
399 int size, fd;
400 char *buf;
401
402 buf = map_sysmem(addr, 0);
403 ut_assert(buf != NULL);
404 fd = os_open(fname, OS_O_RDONLY);
405 ut_assert(fd >= 0);
406 size = os_read(fd, buf, buf_size);
Simon Glass9050c5f2016-01-30 15:45:17 -0700407 os_close(fd);
Simon Glass7a1cb292016-01-18 19:52:28 -0700408 ut_assert(size >= 0);
409 ut_assert(size < buf_size);
Simon Glass7a1cb292016-01-18 19:52:28 -0700410 *addrp = addr;
411
412 return 0;
413}
414
415/* Test drawing a bitmap file */
416static int dm_test_video_bmp(struct unit_test_state *uts)
417{
418 struct udevice *dev;
419 ulong addr;
420
Simon Glass87a3cd72021-11-19 13:24:03 -0700421 ut_assertok(video_get_nologo(uts, &dev));
Simon Glass7a1cb292016-01-18 19:52:28 -0700422 ut_assertok(read_file(uts, "tools/logos/denx.bmp", &addr));
423
424 ut_assertok(video_bmp_display(dev, addr, 0, 0, false));
Alper Nebi Yasaka29b0f92023-08-20 17:46:46 +0300425 ut_asserteq(1368, compress_frame_buffer(uts, dev, false));
Alper Nebi Yasake85a8d02023-08-18 13:31:36 +0300426 ut_assertok(check_copy_frame_buffer(uts, dev));
Simon Glass7a1cb292016-01-18 19:52:28 -0700427
428 return 0;
429}
Simon Glass1a92f832024-08-22 07:57:48 -0600430DM_TEST(dm_test_video_bmp, UTF_SCAN_PDATA | UTF_SCAN_FDT);
Simon Glass7a1cb292016-01-18 19:52:28 -0700431
Simon Glassc3b5adf2021-11-19 13:23:50 -0700432/* Test drawing a bitmap file on a 8bpp display */
433static int dm_test_video_bmp8(struct unit_test_state *uts)
434{
435 struct udevice *dev;
436 ulong addr;
437
438 ut_assertok(uclass_find_first_device(UCLASS_VIDEO, &dev));
439 ut_assertnonnull(dev);
440 ut_assertok(sandbox_sdl_set_bpp(dev, VIDEO_BPP8));
441
442 ut_assertok(read_file(uts, "tools/logos/denx.bmp", &addr));
443
444 ut_assertok(video_bmp_display(dev, addr, 0, 0, false));
Alper Nebi Yasaka29b0f92023-08-20 17:46:46 +0300445 ut_asserteq(1247, compress_frame_buffer(uts, dev, false));
Alper Nebi Yasake85a8d02023-08-18 13:31:36 +0300446 ut_assertok(check_copy_frame_buffer(uts, dev));
Simon Glassc3b5adf2021-11-19 13:23:50 -0700447
448 return 0;
449}
Simon Glass1a92f832024-08-22 07:57:48 -0600450DM_TEST(dm_test_video_bmp8, UTF_SCAN_PDATA | UTF_SCAN_FDT);
Simon Glassc3b5adf2021-11-19 13:23:50 -0700451
Simon Glass8bd7f602021-11-19 13:23:58 -0700452/* Test drawing a bitmap file on a 16bpp display */
453static int dm_test_video_bmp16(struct unit_test_state *uts)
454{
455 ulong src, src_len = ~0UL;
456 uint dst_len = ~0U;
457 struct udevice *dev;
458 ulong dst = 0x10000;
459
460 ut_assertok(uclass_find_first_device(UCLASS_VIDEO, &dev));
461 ut_assertnonnull(dev);
462 ut_assertok(sandbox_sdl_set_bpp(dev, VIDEO_BPP16));
463
464 ut_assertok(read_file(uts, "tools/logos/denx-16bpp.bmp.gz", &src));
465 ut_assertok(gunzip(map_sysmem(dst, 0), dst_len, map_sysmem(src, 0),
466 &src_len));
467
468 ut_assertok(video_bmp_display(dev, dst, 0, 0, false));
Alper Nebi Yasaka29b0f92023-08-20 17:46:46 +0300469 ut_asserteq(3700, compress_frame_buffer(uts, dev, false));
Alper Nebi Yasake85a8d02023-08-18 13:31:36 +0300470 ut_assertok(check_copy_frame_buffer(uts, dev));
Simon Glass8bd7f602021-11-19 13:23:58 -0700471
472 return 0;
473}
Simon Glass1a92f832024-08-22 07:57:48 -0600474DM_TEST(dm_test_video_bmp16, UTF_SCAN_PDATA | UTF_SCAN_FDT);
Simon Glass8bd7f602021-11-19 13:23:58 -0700475
Simon Glass6a92e882021-11-19 13:23:59 -0700476/* Test drawing a 24bpp bitmap file on a 16bpp display */
477static int dm_test_video_bmp24(struct unit_test_state *uts)
478{
479 ulong src, src_len = ~0UL;
480 uint dst_len = ~0U;
481 struct udevice *dev;
482 ulong dst = 0x10000;
483
484 ut_assertok(uclass_find_first_device(UCLASS_VIDEO, &dev));
485 ut_assertnonnull(dev);
486 ut_assertok(sandbox_sdl_set_bpp(dev, VIDEO_BPP16));
487
488 ut_assertok(read_file(uts, "tools/logos/denx-24bpp.bmp.gz", &src));
489 ut_assertok(gunzip(map_sysmem(dst, 0), dst_len, map_sysmem(src, 0),
490 &src_len));
491
492 ut_assertok(video_bmp_display(dev, dst, 0, 0, false));
Alper Nebi Yasaka29b0f92023-08-20 17:46:46 +0300493 ut_asserteq(3656, compress_frame_buffer(uts, dev, false));
Alper Nebi Yasake85a8d02023-08-18 13:31:36 +0300494 ut_assertok(check_copy_frame_buffer(uts, dev));
Simon Glass6a92e882021-11-19 13:23:59 -0700495
496 return 0;
497}
Simon Glass1a92f832024-08-22 07:57:48 -0600498DM_TEST(dm_test_video_bmp24, UTF_SCAN_PDATA | UTF_SCAN_FDT);
Simon Glass6a92e882021-11-19 13:23:59 -0700499
500/* Test drawing a 24bpp bitmap file on a 32bpp display */
501static int dm_test_video_bmp24_32(struct unit_test_state *uts)
502{
503 ulong src, src_len = ~0UL;
504 uint dst_len = ~0U;
505 struct udevice *dev;
506 ulong dst = 0x10000;
507
508 ut_assertok(uclass_find_first_device(UCLASS_VIDEO, &dev));
509 ut_assertnonnull(dev);
510 ut_assertok(sandbox_sdl_set_bpp(dev, VIDEO_BPP32));
511
512 ut_assertok(read_file(uts, "tools/logos/denx-24bpp.bmp.gz", &src));
513 ut_assertok(gunzip(map_sysmem(dst, 0), dst_len, map_sysmem(src, 0),
514 &src_len));
515
516 ut_assertok(video_bmp_display(dev, dst, 0, 0, false));
Alper Nebi Yasaka29b0f92023-08-20 17:46:46 +0300517 ut_asserteq(6827, compress_frame_buffer(uts, dev, false));
Alper Nebi Yasake85a8d02023-08-18 13:31:36 +0300518 ut_assertok(check_copy_frame_buffer(uts, dev));
Simon Glass6a92e882021-11-19 13:23:59 -0700519
520 return 0;
521}
Simon Glass1a92f832024-08-22 07:57:48 -0600522DM_TEST(dm_test_video_bmp24_32, UTF_SCAN_PDATA | UTF_SCAN_FDT);
Simon Glass6a92e882021-11-19 13:23:59 -0700523
Simon Glassc3b5adf2021-11-19 13:23:50 -0700524/* Test drawing a bitmap file on a 32bpp display */
525static int dm_test_video_bmp32(struct unit_test_state *uts)
526{
527 struct udevice *dev;
528 ulong addr;
529
530 ut_assertok(uclass_find_first_device(UCLASS_VIDEO, &dev));
531 ut_assertnonnull(dev);
532 ut_assertok(sandbox_sdl_set_bpp(dev, VIDEO_BPP32));
533 ut_assertok(read_file(uts, "tools/logos/denx.bmp", &addr));
534
535 ut_assertok(video_bmp_display(dev, addr, 0, 0, false));
Alper Nebi Yasaka29b0f92023-08-20 17:46:46 +0300536 ut_asserteq(2024, compress_frame_buffer(uts, dev, false));
Alper Nebi Yasake85a8d02023-08-18 13:31:36 +0300537 ut_assertok(check_copy_frame_buffer(uts, dev));
Simon Glassc3b5adf2021-11-19 13:23:50 -0700538
539 return 0;
540}
Simon Glass1a92f832024-08-22 07:57:48 -0600541DM_TEST(dm_test_video_bmp32, UTF_SCAN_PDATA | UTF_SCAN_FDT);
Simon Glassc3b5adf2021-11-19 13:23:50 -0700542
Simon Glass7a1cb292016-01-18 19:52:28 -0700543/* Test drawing a compressed bitmap file */
544static int dm_test_video_bmp_comp(struct unit_test_state *uts)
545{
546 struct udevice *dev;
547 ulong addr;
548
Simon Glass87a3cd72021-11-19 13:24:03 -0700549 ut_assertok(video_get_nologo(uts, &dev));
Simon Glass7a1cb292016-01-18 19:52:28 -0700550 ut_assertok(read_file(uts, "tools/logos/denx-comp.bmp", &addr));
551
552 ut_assertok(video_bmp_display(dev, addr, 0, 0, false));
Alper Nebi Yasaka29b0f92023-08-20 17:46:46 +0300553 ut_asserteq(1368, compress_frame_buffer(uts, dev, false));
Alper Nebi Yasake85a8d02023-08-18 13:31:36 +0300554 ut_assertok(check_copy_frame_buffer(uts, dev));
Simon Glass7a1cb292016-01-18 19:52:28 -0700555
556 return 0;
557}
Simon Glass1a92f832024-08-22 07:57:48 -0600558DM_TEST(dm_test_video_bmp_comp, UTF_SCAN_PDATA | UTF_SCAN_FDT);
Simon Glass32337982016-01-14 18:10:51 -0700559
Simon Glass490bb992021-11-19 13:23:55 -0700560/* Test drawing a bitmap file on a 32bpp display */
561static int dm_test_video_comp_bmp32(struct unit_test_state *uts)
562{
563 struct udevice *dev;
564 ulong addr;
565
566 ut_assertok(uclass_find_first_device(UCLASS_VIDEO, &dev));
567 ut_assertnonnull(dev);
568 ut_assertok(sandbox_sdl_set_bpp(dev, VIDEO_BPP32));
569
570 ut_assertok(read_file(uts, "tools/logos/denx.bmp", &addr));
571
572 ut_assertok(video_bmp_display(dev, addr, 0, 0, false));
Alper Nebi Yasaka29b0f92023-08-20 17:46:46 +0300573 ut_asserteq(2024, compress_frame_buffer(uts, dev, false));
Alper Nebi Yasake85a8d02023-08-18 13:31:36 +0300574 ut_assertok(check_copy_frame_buffer(uts, dev));
Simon Glass490bb992021-11-19 13:23:55 -0700575
576 return 0;
577}
Simon Glass1a92f832024-08-22 07:57:48 -0600578DM_TEST(dm_test_video_comp_bmp32, UTF_SCAN_PDATA | UTF_SCAN_FDT);
Simon Glass490bb992021-11-19 13:23:55 -0700579
580/* Test drawing a bitmap file on a 8bpp display */
581static int dm_test_video_comp_bmp8(struct unit_test_state *uts)
582{
583 struct udevice *dev;
584 ulong addr;
585
586 ut_assertok(uclass_find_first_device(UCLASS_VIDEO, &dev));
587 ut_assertnonnull(dev);
588 ut_assertok(sandbox_sdl_set_bpp(dev, VIDEO_BPP8));
589
590 ut_assertok(read_file(uts, "tools/logos/denx.bmp", &addr));
591
592 ut_assertok(video_bmp_display(dev, addr, 0, 0, false));
Alper Nebi Yasaka29b0f92023-08-20 17:46:46 +0300593 ut_asserteq(1247, compress_frame_buffer(uts, dev, false));
Alper Nebi Yasake85a8d02023-08-18 13:31:36 +0300594 ut_assertok(check_copy_frame_buffer(uts, dev));
Simon Glass490bb992021-11-19 13:23:55 -0700595
596 return 0;
597}
Simon Glass1a92f832024-08-22 07:57:48 -0600598DM_TEST(dm_test_video_comp_bmp8, UTF_SCAN_PDATA | UTF_SCAN_FDT);
Simon Glass490bb992021-11-19 13:23:55 -0700599
Simon Glass32337982016-01-14 18:10:51 -0700600/* Test TrueType console */
601static int dm_test_video_truetype(struct unit_test_state *uts)
602{
603 struct udevice *dev, *con;
604 const char *test_string = "Criticism may not be agreeable, but it is necessary. It fulfils the same function as pain in the human body. It calls attention to an unhealthy state of things. Some see private enterprise as a predatory target to be shot, others as a cow to be milked, but few are those who see it as a sturdy horse pulling the wagon. The \aprice OF\b\bof greatness\n\tis responsibility.\n\nBye";
Simon Glass32337982016-01-14 18:10:51 -0700605
Simon Glass87a3cd72021-11-19 13:24:03 -0700606 ut_assertok(video_get_nologo(uts, &dev));
Simon Glass32337982016-01-14 18:10:51 -0700607 ut_assertok(uclass_get_device(UCLASS_VIDEO_CONSOLE, 0, &con));
Rob Clark985935b2017-09-25 15:45:08 -0400608 vidconsole_put_string(con, test_string);
Alper Nebi Yasaka29b0f92023-08-20 17:46:46 +0300609 ut_asserteq(12174, compress_frame_buffer(uts, dev, false));
Alper Nebi Yasake85a8d02023-08-18 13:31:36 +0300610 ut_assertok(check_copy_frame_buffer(uts, dev));
Simon Glass32337982016-01-14 18:10:51 -0700611
612 return 0;
613}
Simon Glass1a92f832024-08-22 07:57:48 -0600614DM_TEST(dm_test_video_truetype, UTF_SCAN_PDATA | UTF_SCAN_FDT);
Simon Glass32337982016-01-14 18:10:51 -0700615
616/* Test scrolling TrueType console */
617static int dm_test_video_truetype_scroll(struct unit_test_state *uts)
618{
619 struct sandbox_sdl_plat *plat;
620 struct udevice *dev, *con;
621 const char *test_string = "Criticism may not be agreeable, but it is necessary. It fulfils the same function as pain in the human body. It calls attention to an unhealthy state of things. Some see private enterprise as a predatory target to be shot, others as a cow to be milked, but few are those who see it as a sturdy horse pulling the wagon. The \aprice OF\b\bof greatness\n\tis responsibility.\n\nBye";
Simon Glass32337982016-01-14 18:10:51 -0700622
623 ut_assertok(uclass_find_device(UCLASS_VIDEO, 0, &dev));
624 ut_assert(!device_active(dev));
Simon Glassfa20e932020-12-03 16:55:20 -0700625 plat = dev_get_plat(dev);
Simon Glass32337982016-01-14 18:10:51 -0700626 plat->font_size = 100;
627
Simon Glass87a3cd72021-11-19 13:24:03 -0700628 ut_assertok(video_get_nologo(uts, &dev));
Simon Glass32337982016-01-14 18:10:51 -0700629 ut_assertok(uclass_get_device(UCLASS_VIDEO_CONSOLE, 0, &con));
Rob Clark985935b2017-09-25 15:45:08 -0400630 vidconsole_put_string(con, test_string);
Alper Nebi Yasaka29b0f92023-08-20 17:46:46 +0300631 ut_asserteq(34287, compress_frame_buffer(uts, dev, false));
Alper Nebi Yasake85a8d02023-08-18 13:31:36 +0300632 ut_assertok(check_copy_frame_buffer(uts, dev));
Simon Glass32337982016-01-14 18:10:51 -0700633
634 return 0;
635}
Simon Glass1a92f832024-08-22 07:57:48 -0600636DM_TEST(dm_test_video_truetype_scroll, UTF_SCAN_PDATA | UTF_SCAN_FDT);
Simon Glass32337982016-01-14 18:10:51 -0700637
638/* Test TrueType backspace, within and across lines */
639static int dm_test_video_truetype_bs(struct unit_test_state *uts)
640{
641 struct sandbox_sdl_plat *plat;
642 struct udevice *dev, *con;
643 const char *test_string = "...Criticism may or may\b\b\b\b\b\bnot be agreeable, but seldom it is necessary\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\bit is necessary. It fulfils the same function as pain in the human body. It calls attention to an unhealthy state of things.";
Simon Glass32337982016-01-14 18:10:51 -0700644
645 ut_assertok(uclass_find_device(UCLASS_VIDEO, 0, &dev));
646 ut_assert(!device_active(dev));
Simon Glassfa20e932020-12-03 16:55:20 -0700647 plat = dev_get_plat(dev);
Simon Glass32337982016-01-14 18:10:51 -0700648 plat->font_size = 100;
649
Simon Glass87a3cd72021-11-19 13:24:03 -0700650 ut_assertok(video_get_nologo(uts, &dev));
Simon Glass32337982016-01-14 18:10:51 -0700651 ut_assertok(uclass_get_device(UCLASS_VIDEO_CONSOLE, 0, &con));
Rob Clark985935b2017-09-25 15:45:08 -0400652 vidconsole_put_string(con, test_string);
Alper Nebi Yasaka29b0f92023-08-20 17:46:46 +0300653 ut_asserteq(29471, compress_frame_buffer(uts, dev, false));
Alper Nebi Yasake85a8d02023-08-18 13:31:36 +0300654 ut_assertok(check_copy_frame_buffer(uts, dev));
Simon Glass32337982016-01-14 18:10:51 -0700655
656 return 0;
657}
Simon Glass1a92f832024-08-22 07:57:48 -0600658DM_TEST(dm_test_video_truetype_bs, UTF_SCAN_PDATA | UTF_SCAN_FDT);
Alper Nebi Yasak5e8253d2023-08-18 17:31:27 +0300659
660/* Test partial rendering onto hardware frame buffer */
661static int dm_test_video_copy(struct unit_test_state *uts)
662{
663 struct sandbox_sdl_plat *plat;
664 struct video_uc_plat *uc_plat;
665 struct udevice *dev, *con;
666 struct video_priv *priv;
667 const char *test_string = "\n\tCriticism may not be agreeable, but it is necessary.\t";
668 ulong addr;
669
670 if (!IS_ENABLED(CONFIG_VIDEO_COPY))
671 return -EAGAIN;
672
673 ut_assertok(uclass_find_first_device(UCLASS_VIDEO, &dev));
674 ut_assertnonnull(dev);
675 uc_plat = dev_get_uclass_plat(dev);
676 uc_plat->hide_logo = true;
677 plat = dev_get_plat(dev);
678 plat->font_size = 32;
679 ut_assert(!device_active(dev));
680 ut_assertok(uclass_first_device_err(UCLASS_VIDEO, &dev));
681 ut_assertnonnull(dev);
682 priv = dev_get_uclass_priv(dev);
683
684 ut_assertok(read_file(uts, "tools/logos/denx.bmp", &addr));
685 ut_assertok(video_bmp_display(dev, addr, 0, 0, false));
686
687 ut_assertok(uclass_get_device(UCLASS_VIDEO_CONSOLE, 0, &con));
688 vidconsole_put_string(con, "\n\n\n\n\n");
689 vidconsole_put_string(con, test_string);
690 vidconsole_put_string(con, test_string);
691
692 ut_asserteq(6678, compress_frame_buffer(uts, dev, false));
693 ut_assertok(check_copy_frame_buffer(uts, dev));
694
695 /*
696 * Secretly clear the hardware frame buffer, but in a different
697 * color (black) to see which parts will be overwritten.
698 */
699 memset(priv->copy_fb, 0, priv->fb_size);
700
701 /*
702 * We should have the full content on the main buffer, but only
703 * the new content should have been copied to the copy buffer.
704 */
705 vidconsole_put_string(con, test_string);
706 vidconsole_put_string(con, test_string);
707 ut_asserteq(7589, compress_frame_buffer(uts, dev, false));
708 ut_asserteq(5278, compress_frame_buffer(uts, dev, true));
709
710 return 0;
711}
712DM_TEST(dm_test_video_copy, UTF_SCAN_PDATA | UTF_SCAN_FDT);
Alper Nebi Yasakfc5740a2023-08-18 17:55:08 +0300713
714/* Test video damage tracking */
715static int dm_test_video_damage(struct unit_test_state *uts)
716{
717 struct sandbox_sdl_plat *plat;
718 struct udevice *dev, *con;
719 struct video_priv *priv;
720 const char *test_string_1 = "Criticism may not be agreeable, ";
721 const char *test_string_2 = "but it is necessary.";
722 const char *test_string_3 = "It fulfils the same function as pain in the human body.";
723
724 if (!IS_ENABLED(CONFIG_VIDEO_DAMAGE))
725 return -EAGAIN;
726
727 ut_assertok(uclass_find_device(UCLASS_VIDEO, 0, &dev));
728 ut_assert(!device_active(dev));
729 plat = dev_get_plat(dev);
730 plat->font_size = 32;
731
732 ut_assertok(video_get_nologo(uts, &dev));
733 ut_assertok(uclass_get_device(UCLASS_VIDEO_CONSOLE, 0, &con));
734 priv = dev_get_uclass_priv(dev);
735
736 vidconsole_position_cursor(con, 14, 10);
737 vidconsole_put_string(con, test_string_2);
738 ut_asserteq(449, priv->damage.xstart);
739 ut_asserteq(325, priv->damage.ystart);
740 ut_asserteq(661, priv->damage.xend);
741 ut_asserteq(350, priv->damage.yend);
742
743 vidconsole_position_cursor(con, 7, 5);
744 vidconsole_put_string(con, test_string_1);
745 ut_asserteq(225, priv->damage.xstart);
746 ut_asserteq(164, priv->damage.ystart);
747 ut_asserteq(661, priv->damage.xend);
748 ut_asserteq(350, priv->damage.yend);
749
750 vidconsole_position_cursor(con, 21, 15);
751 vidconsole_put_string(con, test_string_3);
752 ut_asserteq(225, priv->damage.xstart);
753 ut_asserteq(164, priv->damage.ystart);
754 ut_asserteq(1280, priv->damage.xend);
755 ut_asserteq(510, priv->damage.yend);
756
757 video_sync(dev, true);
758 ut_asserteq(priv->xsize, priv->damage.xstart);
759 ut_asserteq(priv->ysize, priv->damage.ystart);
760 ut_asserteq(0, priv->damage.xend);
761 ut_asserteq(0, priv->damage.yend);
762
763 ut_asserteq(7339, compress_frame_buffer(uts, dev, false));
764 ut_assertok(check_copy_frame_buffer(uts, dev));
765
766 return 0;
767}
768DM_TEST(dm_test_video_damage, UTF_SCAN_PDATA | UTF_SCAN_FDT);