cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

test-drm_rect.c (6839B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * Test cases for the drm_rect functions
      4 */
      5
      6#define pr_fmt(fmt) "drm_rect: " fmt
      7
      8#include <linux/limits.h>
      9
     10#include <drm/drm_rect.h>
     11
     12#include "test-drm_modeset_common.h"
     13
     14int igt_drm_rect_clip_scaled_div_by_zero(void *ignored)
     15{
     16	struct drm_rect src, dst, clip;
     17	bool visible;
     18
     19	/*
     20	 * Make sure we don't divide by zero when dst
     21	 * width/height is zero and dst and clip do not intersect.
     22	 */
     23	drm_rect_init(&src, 0, 0, 0, 0);
     24	drm_rect_init(&dst, 0, 0, 0, 0);
     25	drm_rect_init(&clip, 1, 1, 1, 1);
     26	visible = drm_rect_clip_scaled(&src, &dst, &clip);
     27	FAIL(visible, "Destination not be visible\n");
     28	FAIL(drm_rect_visible(&src), "Source should not be visible\n");
     29
     30	drm_rect_init(&src, 0, 0, 0, 0);
     31	drm_rect_init(&dst, 3, 3, 0, 0);
     32	drm_rect_init(&clip, 1, 1, 1, 1);
     33	visible = drm_rect_clip_scaled(&src, &dst, &clip);
     34	FAIL(visible, "Destination not be visible\n");
     35	FAIL(drm_rect_visible(&src), "Source should not be visible\n");
     36
     37	return 0;
     38}
     39
     40int igt_drm_rect_clip_scaled_not_clipped(void *ignored)
     41{
     42	struct drm_rect src, dst, clip;
     43	bool visible;
     44
     45	/* 1:1 scaling */
     46	drm_rect_init(&src, 0, 0, 1 << 16, 1 << 16);
     47	drm_rect_init(&dst, 0, 0, 1, 1);
     48	drm_rect_init(&clip, 0, 0, 1, 1);
     49
     50	visible = drm_rect_clip_scaled(&src, &dst, &clip);
     51
     52	FAIL(src.x1 != 0 || src.x2 != 1 << 16 ||
     53	     src.y1 != 0 || src.y2 != 1 << 16,
     54	     "Source badly clipped\n");
     55	FAIL(dst.x1 != 0 || dst.x2 != 1 ||
     56	     dst.y1 != 0 || dst.y2 != 1,
     57	     "Destination badly clipped\n");
     58	FAIL(!visible, "Destination should be visible\n");
     59	FAIL(!drm_rect_visible(&src), "Source should be visible\n");
     60
     61	/* 2:1 scaling */
     62	drm_rect_init(&src, 0, 0, 2 << 16, 2 << 16);
     63	drm_rect_init(&dst, 0, 0, 1, 1);
     64	drm_rect_init(&clip, 0, 0, 1, 1);
     65
     66	visible = drm_rect_clip_scaled(&src, &dst, &clip);
     67
     68	FAIL(src.x1 != 0 || src.x2 != 2 << 16 ||
     69	     src.y1 != 0 || src.y2 != 2 << 16,
     70	     "Source badly clipped\n");
     71	FAIL(dst.x1 != 0 || dst.x2 != 1 ||
     72	     dst.y1 != 0 || dst.y2 != 1,
     73	     "Destination badly clipped\n");
     74	FAIL(!visible, "Destination should be visible\n");
     75	FAIL(!drm_rect_visible(&src), "Source should be visible\n");
     76
     77	/* 1:2 scaling */
     78	drm_rect_init(&src, 0, 0, 1 << 16, 1 << 16);
     79	drm_rect_init(&dst, 0, 0, 2, 2);
     80	drm_rect_init(&clip, 0, 0, 2, 2);
     81
     82	visible = drm_rect_clip_scaled(&src, &dst, &clip);
     83
     84	FAIL(src.x1 != 0 || src.x2 != 1 << 16 ||
     85	     src.y1 != 0 || src.y2 != 1 << 16,
     86	     "Source badly clipped\n");
     87	FAIL(dst.x1 != 0 || dst.x2 != 2 ||
     88	     dst.y1 != 0 || dst.y2 != 2,
     89	     "Destination badly clipped\n");
     90	FAIL(!visible, "Destination should be visible\n");
     91	FAIL(!drm_rect_visible(&src), "Source should be visible\n");
     92
     93	return 0;
     94}
     95
     96int igt_drm_rect_clip_scaled_clipped(void *ignored)
     97{
     98	struct drm_rect src, dst, clip;
     99	bool visible;
    100
    101	/* 1:1 scaling top/left clip */
    102	drm_rect_init(&src, 0, 0, 2 << 16, 2 << 16);
    103	drm_rect_init(&dst, 0, 0, 2, 2);
    104	drm_rect_init(&clip, 0, 0, 1, 1);
    105
    106	visible = drm_rect_clip_scaled(&src, &dst, &clip);
    107
    108	FAIL(src.x1 != 0 || src.x2 != 1 << 16 ||
    109	     src.y1 != 0 || src.y2 != 1 << 16,
    110	     "Source badly clipped\n");
    111	FAIL(dst.x1 != 0 || dst.x2 != 1 ||
    112	     dst.y1 != 0 || dst.y2 != 1,
    113	     "Destination badly clipped\n");
    114	FAIL(!visible, "Destination should be visible\n");
    115	FAIL(!drm_rect_visible(&src), "Source should be visible\n");
    116
    117	/* 1:1 scaling bottom/right clip */
    118	drm_rect_init(&src, 0, 0, 2 << 16, 2 << 16);
    119	drm_rect_init(&dst, 0, 0, 2, 2);
    120	drm_rect_init(&clip, 1, 1, 1, 1);
    121
    122	visible = drm_rect_clip_scaled(&src, &dst, &clip);
    123
    124	FAIL(src.x1 != 1 << 16 || src.x2 != 2 << 16 ||
    125	     src.y1 != 1 << 16 || src.y2 != 2 << 16,
    126	     "Source badly clipped\n");
    127	FAIL(dst.x1 != 1 || dst.x2 != 2 ||
    128	     dst.y1 != 1 || dst.y2 != 2,
    129	     "Destination badly clipped\n");
    130	FAIL(!visible, "Destination should be visible\n");
    131	FAIL(!drm_rect_visible(&src), "Source should be visible\n");
    132
    133	/* 2:1 scaling top/left clip */
    134	drm_rect_init(&src, 0, 0, 4 << 16, 4 << 16);
    135	drm_rect_init(&dst, 0, 0, 2, 2);
    136	drm_rect_init(&clip, 0, 0, 1, 1);
    137
    138	visible = drm_rect_clip_scaled(&src, &dst, &clip);
    139
    140	FAIL(src.x1 != 0 || src.x2 != 2 << 16 ||
    141	     src.y1 != 0 || src.y2 != 2 << 16,
    142	     "Source badly clipped\n");
    143	FAIL(dst.x1 != 0 || dst.x2 != 1 ||
    144	     dst.y1 != 0 || dst.y2 != 1,
    145	     "Destination badly clipped\n");
    146	FAIL(!visible, "Destination should be visible\n");
    147	FAIL(!drm_rect_visible(&src), "Source should be visible\n");
    148
    149	/* 2:1 scaling bottom/right clip */
    150	drm_rect_init(&src, 0, 0, 4 << 16, 4 << 16);
    151	drm_rect_init(&dst, 0, 0, 2, 2);
    152	drm_rect_init(&clip, 1, 1, 1, 1);
    153
    154	visible = drm_rect_clip_scaled(&src, &dst, &clip);
    155
    156	FAIL(src.x1 != 2 << 16 || src.x2 != 4 << 16 ||
    157	     src.y1 != 2 << 16 || src.y2 != 4 << 16,
    158	     "Source badly clipped\n");
    159	FAIL(dst.x1 != 1 || dst.x2 != 2 ||
    160	     dst.y1 != 1 || dst.y2 != 2,
    161	     "Destination badly clipped\n");
    162	FAIL(!visible, "Destination should be visible\n");
    163	FAIL(!drm_rect_visible(&src), "Source should be visible\n");
    164
    165	/* 1:2 scaling top/left clip */
    166	drm_rect_init(&src, 0, 0, 2 << 16, 2 << 16);
    167	drm_rect_init(&dst, 0, 0, 4, 4);
    168	drm_rect_init(&clip, 0, 0, 2, 2);
    169
    170	visible = drm_rect_clip_scaled(&src, &dst, &clip);
    171
    172	FAIL(src.x1 != 0 || src.x2 != 1 << 16 ||
    173	     src.y1 != 0 || src.y2 != 1 << 16,
    174	     "Source badly clipped\n");
    175	FAIL(dst.x1 != 0 || dst.x2 != 2 ||
    176	     dst.y1 != 0 || dst.y2 != 2,
    177	     "Destination badly clipped\n");
    178	FAIL(!visible, "Destination should be visible\n");
    179	FAIL(!drm_rect_visible(&src), "Source should be visible\n");
    180
    181	/* 1:2 scaling bottom/right clip */
    182	drm_rect_init(&src, 0, 0, 2 << 16, 2 << 16);
    183	drm_rect_init(&dst, 0, 0, 4, 4);
    184	drm_rect_init(&clip, 2, 2, 2, 2);
    185
    186	visible = drm_rect_clip_scaled(&src, &dst, &clip);
    187
    188	FAIL(src.x1 != 1 << 16 || src.x2 != 2 << 16 ||
    189	     src.y1 != 1 << 16 || src.y2 != 2 << 16,
    190	     "Source badly clipped\n");
    191	FAIL(dst.x1 != 2 || dst.x2 != 4 ||
    192	     dst.y1 != 2 || dst.y2 != 4,
    193	     "Destination badly clipped\n");
    194	FAIL(!visible, "Destination should be visible\n");
    195	FAIL(!drm_rect_visible(&src), "Source should be visible\n");
    196
    197	return 0;
    198}
    199
    200int igt_drm_rect_clip_scaled_signed_vs_unsigned(void *ignored)
    201{
    202	struct drm_rect src, dst, clip;
    203	bool visible;
    204
    205	/*
    206	 * 'clip.x2 - dst.x1 >= dst width' could result a negative
    207	 * src rectangle width which is no longer expected by the
    208	 * code as it's using unsigned types. This could lead to
    209	 * the clipped source rectangle appering visible when it
    210	 * should have been fully clipped. Make sure both rectangles
    211	 * end up invisible.
    212	 */
    213	drm_rect_init(&src, 0, 0, INT_MAX, INT_MAX);
    214	drm_rect_init(&dst, 0, 0, 2, 2);
    215	drm_rect_init(&clip, 3, 3, 1, 1);
    216
    217	visible = drm_rect_clip_scaled(&src, &dst, &clip);
    218
    219	FAIL(visible, "Destination should not be visible\n");
    220	FAIL(drm_rect_visible(&src), "Source should not be visible\n");
    221
    222	return 0;
    223}