1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Test cases for the drm_format functions 4 * 5 * Copyright (c) 2022 Maíra Canal <mairacanal@riseup.net> 6 */ 7 8 #include <kunit/test.h> 9 10 #include <drm/drm_fourcc.h> 11 12 static void igt_check_drm_format_block_width(struct kunit *test) 13 { 14 const struct drm_format_info *info = NULL; 15 16 /* Test invalid arguments */ 17 KUNIT_EXPECT_FALSE(test, drm_format_info_block_width(info, 0)); 18 KUNIT_EXPECT_FALSE(test, drm_format_info_block_width(info, -1)); 19 KUNIT_EXPECT_FALSE(test, drm_format_info_block_width(info, 1)); 20 21 /* Test 1 plane format */ 22 info = drm_format_info(DRM_FORMAT_XRGB4444); 23 KUNIT_EXPECT_TRUE(test, info); 24 KUNIT_EXPECT_TRUE(test, drm_format_info_block_width(info, 0)); 25 KUNIT_EXPECT_FALSE(test, drm_format_info_block_width(info, 1)); 26 KUNIT_EXPECT_FALSE(test, drm_format_info_block_width(info, -1)); 27 28 /* Test 2 planes format */ 29 info = drm_format_info(DRM_FORMAT_NV12); 30 KUNIT_EXPECT_TRUE(test, info); 31 KUNIT_EXPECT_TRUE(test, drm_format_info_block_width(info, 0)); 32 KUNIT_EXPECT_TRUE(test, drm_format_info_block_width(info, 1)); 33 KUNIT_EXPECT_FALSE(test, drm_format_info_block_width(info, 2)); 34 KUNIT_EXPECT_FALSE(test, drm_format_info_block_width(info, -1)); 35 36 /* Test 3 planes format */ 37 info = drm_format_info(DRM_FORMAT_YUV422); 38 KUNIT_EXPECT_TRUE(test, info); 39 KUNIT_EXPECT_TRUE(test, drm_format_info_block_width(info, 0)); 40 KUNIT_EXPECT_TRUE(test, drm_format_info_block_width(info, 1)); 41 KUNIT_EXPECT_TRUE(test, drm_format_info_block_width(info, 2)); 42 KUNIT_EXPECT_FALSE(test, drm_format_info_block_width(info, 3)); 43 KUNIT_EXPECT_FALSE(test, drm_format_info_block_width(info, -1)); 44 45 /* Test a tiled format */ 46 info = drm_format_info(DRM_FORMAT_X0L0); 47 KUNIT_EXPECT_TRUE(test, info); 48 KUNIT_EXPECT_EQ(test, drm_format_info_block_width(info, 0), 2); 49 KUNIT_EXPECT_FALSE(test, drm_format_info_block_width(info, 1)); 50 KUNIT_EXPECT_FALSE(test, drm_format_info_block_width(info, -1)); 51 } 52 53 static void igt_check_drm_format_block_height(struct kunit *test) 54 { 55 const struct drm_format_info *info = NULL; 56 57 /* Test invalid arguments */ 58 KUNIT_EXPECT_FALSE(test, drm_format_info_block_height(info, 0)); 59 KUNIT_EXPECT_FALSE(test, drm_format_info_block_height(info, -1)); 60 KUNIT_EXPECT_FALSE(test, drm_format_info_block_height(info, 1)); 61 62 /* Test 1 plane format */ 63 info = drm_format_info(DRM_FORMAT_XRGB4444); 64 KUNIT_EXPECT_TRUE(test, info); 65 KUNIT_EXPECT_TRUE(test, drm_format_info_block_height(info, 0)); 66 KUNIT_EXPECT_FALSE(test, drm_format_info_block_height(info, -1)); 67 KUNIT_EXPECT_FALSE(test, drm_format_info_block_height(info, 1)); 68 69 /* Test 2 planes format */ 70 info = drm_format_info(DRM_FORMAT_NV12); 71 KUNIT_EXPECT_TRUE(test, info); 72 KUNIT_EXPECT_TRUE(test, drm_format_info_block_height(info, 0)); 73 KUNIT_EXPECT_TRUE(test, drm_format_info_block_height(info, 1)); 74 KUNIT_EXPECT_FALSE(test, drm_format_info_block_height(info, 2)); 75 KUNIT_EXPECT_FALSE(test, drm_format_info_block_height(info, -1)); 76 77 /* Test 3 planes format */ 78 info = drm_format_info(DRM_FORMAT_YUV422); 79 KUNIT_EXPECT_TRUE(test, info); 80 KUNIT_EXPECT_TRUE(test, drm_format_info_block_height(info, 0)); 81 KUNIT_EXPECT_TRUE(test, drm_format_info_block_height(info, 1)); 82 KUNIT_EXPECT_TRUE(test, drm_format_info_block_height(info, 2)); 83 KUNIT_EXPECT_FALSE(test, drm_format_info_block_height(info, 3)); 84 KUNIT_EXPECT_FALSE(test, drm_format_info_block_height(info, -1)); 85 86 /* Test a tiled format */ 87 info = drm_format_info(DRM_FORMAT_X0L0); 88 KUNIT_EXPECT_TRUE(test, info); 89 KUNIT_EXPECT_EQ(test, drm_format_info_block_height(info, 0), 2); 90 KUNIT_EXPECT_FALSE(test, drm_format_info_block_height(info, 1)); 91 KUNIT_EXPECT_FALSE(test, drm_format_info_block_height(info, -1)); 92 } 93 94 static void igt_check_drm_format_min_pitch_for_single_plane(struct kunit *test) 95 { 96 const struct drm_format_info *info = NULL; 97 98 /* Test invalid arguments */ 99 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, 0, 0)); 100 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, -1, 0)); 101 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, 1, 0)); 102 103 /* Test 1 plane 8 bits per pixel format */ 104 info = drm_format_info(DRM_FORMAT_RGB332); 105 KUNIT_EXPECT_TRUE(test, info); 106 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, 0, 0)); 107 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, -1, 0)); 108 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, 1, 0)); 109 110 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 1), 1); 111 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 2), 2); 112 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 640), 640); 113 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 1024), 1024); 114 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 1920), 1920); 115 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 4096), 4096); 116 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 671), 671); 117 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, UINT_MAX), 118 (uint64_t)UINT_MAX); 119 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, (UINT_MAX - 1)), 120 (uint64_t)(UINT_MAX - 1)); 121 122 /* Test 1 plane 16 bits per pixel format */ 123 info = drm_format_info(DRM_FORMAT_XRGB4444); 124 KUNIT_EXPECT_TRUE(test, info); 125 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, 0, 0)); 126 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, -1, 0)); 127 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, 1, 0)); 128 129 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 1), 2); 130 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 2), 4); 131 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 640), 1280); 132 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 1024), 2048); 133 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 1920), 3840); 134 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 4096), 8192); 135 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 671), 1342); 136 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, UINT_MAX), 137 (uint64_t)UINT_MAX * 2); 138 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, (UINT_MAX - 1)), 139 (uint64_t)(UINT_MAX - 1) * 2); 140 141 /* Test 1 plane 24 bits per pixel format */ 142 info = drm_format_info(DRM_FORMAT_RGB888); 143 KUNIT_EXPECT_TRUE(test, info); 144 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, 0, 0)); 145 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, -1, 0)); 146 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, 1, 0)); 147 148 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 1), 3); 149 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 2), 6); 150 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 640), 1920); 151 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 1024), 3072); 152 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 1920), 5760); 153 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 4096), 12288); 154 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 671), 2013); 155 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, UINT_MAX), 156 (uint64_t)UINT_MAX * 3); 157 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, (UINT_MAX - 1)), 158 (uint64_t)(UINT_MAX - 1) * 3); 159 160 /* Test 1 plane 32 bits per pixel format */ 161 info = drm_format_info(DRM_FORMAT_ABGR8888); 162 KUNIT_EXPECT_TRUE(test, info); 163 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, 0, 0)); 164 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, -1, 0)); 165 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, 1, 0)); 166 167 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 1), 4); 168 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 2), 8); 169 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 640), 2560); 170 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 1024), 4096); 171 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 1920), 7680); 172 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 4096), 16384); 173 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 671), 2684); 174 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, UINT_MAX), 175 (uint64_t)UINT_MAX * 4); 176 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, (UINT_MAX - 1)), 177 (uint64_t)(UINT_MAX - 1) * 4); 178 } 179 180 static void igt_check_drm_format_min_pitch_for_multi_planar(struct kunit *test) 181 { 182 const struct drm_format_info *info = NULL; 183 184 /* Test 2 planes format */ 185 info = drm_format_info(DRM_FORMAT_NV12); 186 KUNIT_EXPECT_TRUE(test, info); 187 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, 0, 0)); 188 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, 1, 0)); 189 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, -1, 0)); 190 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, 2, 0)); 191 192 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 1), 1); 193 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 1, 1), 2); 194 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 2), 2); 195 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 1, 1), 2); 196 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 640), 640); 197 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 1, 320), 640); 198 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 1024), 1024); 199 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 1, 512), 1024); 200 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 1920), 1920); 201 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 1, 960), 1920); 202 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 4096), 4096); 203 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 1, 2048), 4096); 204 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 671), 671); 205 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 1, 336), 672); 206 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, UINT_MAX), 207 (uint64_t)UINT_MAX); 208 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 1, UINT_MAX / 2 + 1), 209 (uint64_t)UINT_MAX + 1); 210 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, (UINT_MAX - 1)), 211 (uint64_t)(UINT_MAX - 1)); 212 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 1, (UINT_MAX - 1) / 2), 213 (uint64_t)(UINT_MAX - 1)); 214 215 /* Test 3 planes 8 bits per pixel format */ 216 info = drm_format_info(DRM_FORMAT_YUV422); 217 KUNIT_EXPECT_TRUE(test, info); 218 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, 0, 0)); 219 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, 1, 0)); 220 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, 2, 0)); 221 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, -1, 0)); 222 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, 3, 0)); 223 224 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 1), 1); 225 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 1, 1), 1); 226 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 2, 1), 1); 227 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 2), 2); 228 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 1, 2), 2); 229 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 2, 2), 2); 230 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 640), 640); 231 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 1, 320), 320); 232 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 2, 320), 320); 233 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 1024), 1024); 234 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 1, 512), 512); 235 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 2, 512), 512); 236 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 1920), 1920); 237 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 1, 960), 960); 238 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 2, 960), 960); 239 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 4096), 4096); 240 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 1, 2048), 2048); 241 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 2, 2048), 2048); 242 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 671), 671); 243 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 1, 336), 336); 244 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 2, 336), 336); 245 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, UINT_MAX), 246 (uint64_t)UINT_MAX); 247 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 1, UINT_MAX / 2 + 1), 248 (uint64_t)UINT_MAX / 2 + 1); 249 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 2, UINT_MAX / 2 + 1), 250 (uint64_t)UINT_MAX / 2 + 1); 251 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, (UINT_MAX - 1) / 2), 252 (uint64_t)(UINT_MAX - 1) / 2); 253 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 1, (UINT_MAX - 1) / 2), 254 (uint64_t)(UINT_MAX - 1) / 2); 255 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 2, (UINT_MAX - 1) / 2), 256 (uint64_t)(UINT_MAX - 1) / 2); 257 } 258 259 static void igt_check_drm_format_min_pitch_for_tiled_format(struct kunit *test) 260 { 261 const struct drm_format_info *info = NULL; 262 263 /* Test tiled format */ 264 info = drm_format_info(DRM_FORMAT_X0L2); 265 KUNIT_EXPECT_TRUE(test, info); 266 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, 0, 0)); 267 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, -1, 0)); 268 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, 1, 0)); 269 270 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 1), 2); 271 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 2), 4); 272 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 640), 1280); 273 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 1024), 2048); 274 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 1920), 3840); 275 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 4096), 8192); 276 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 671), 1342); 277 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, UINT_MAX), 278 (uint64_t)UINT_MAX * 2); 279 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, UINT_MAX - 1), 280 (uint64_t)(UINT_MAX - 1) * 2); 281 } 282 283 static struct kunit_case drm_format_tests[] = { 284 KUNIT_CASE(igt_check_drm_format_block_width), 285 KUNIT_CASE(igt_check_drm_format_block_height), 286 KUNIT_CASE(igt_check_drm_format_min_pitch_for_single_plane), 287 KUNIT_CASE(igt_check_drm_format_min_pitch_for_multi_planar), 288 KUNIT_CASE(igt_check_drm_format_min_pitch_for_tiled_format), 289 { } 290 }; 291 292 static struct kunit_suite drm_format_test_suite = { 293 .name = "drm_format", 294 .test_cases = drm_format_tests, 295 }; 296 297 kunit_test_suite(drm_format_test_suite); 298 299 MODULE_LICENSE("GPL"); 300