* [igt-dev] [PATCH i-g-t v3] tests/kms_big_fb: Make sure huge fbs work correctly
@ 2019-05-08 16:29 Ville Syrjala
2019-05-08 17:01 ` [igt-dev] ✓ Fi.CI.BAT: success for tests/kms_big_fb: Make sure huge fbs work correctly (rev2) Patchwork
` (5 more replies)
0 siblings, 6 replies; 9+ messages in thread
From: Ville Syrjala @ 2019-05-08 16:29 UTC (permalink / raw)
To: igt-dev
From: Ville Syrjälä <ville.syrjala@linux.intel.com>
Add various tests to excercise huge framebuffers. First some basic
sanity checks that the kernel accepts/rejects good/bad addfb2 ioctls,
and finally actual scanout tests to make sure we scan out the correct
thing when panning around inside large framebuffers.
The implementation is i915 specific for now since I chose to use
rendercopy/blitter when generating the framebuffer contents. Using
the normal cairo stuff was just too slow when dealing with 1GiB+
framebuffers. It shouldn't be too hard to plug in some other mechanisms
if someone else wants to reuse this test.
v2: Add igt_require(format+mod) for the addfb/overflow tests
Unset plane fb after TEST_ONLY fail
Limit max fb to at most 1/2 RAM or GPU address space
Tweak coords to avoid fails with 64bpp linear with 4k screen
Make coords even for 90/270 rotated 16bpp
Store bpp as uint8_t instead of wasting an entire char*
v3: Add blitter path for gen3 (render engine is not capable of
handling big fbs).
Set fence tiling on gen2/3 in raw addfb tests.
Deal with weak max fence stride on gen3.
Don't try to use rotation when the prop isn't present.
Skip 90/270 test for gen4 (no atomic on those yet so we
can't neatly check what's supported).
Kernel restricts scanout to mappable portion of ggtt on
gmch platforms, so check its size as well
Use the correct fb for the legacy setcrtc
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
tests/Makefile.sources | 1 +
tests/kms_big_fb.c | 666 +++++++++++++++++++++++++++++++++++++++++
tests/meson.build | 1 +
3 files changed, 668 insertions(+)
create mode 100644 tests/kms_big_fb.c
diff --git a/tests/Makefile.sources b/tests/Makefile.sources
index 7f921f6c5988..2d5c929e32fc 100644
--- a/tests/Makefile.sources
+++ b/tests/Makefile.sources
@@ -27,6 +27,7 @@ TESTS_progs = \
kms_atomic_interruptible \
kms_atomic_transition \
kms_available_modes_crc \
+ kms_big_fb \
kms_busy \
kms_ccs \
kms_color \
diff --git a/tests/kms_big_fb.c b/tests/kms_big_fb.c
new file mode 100644
index 000000000000..5235954e2d8c
--- /dev/null
+++ b/tests/kms_big_fb.c
@@ -0,0 +1,666 @@
+/*
+ * Copyright © 2019 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+
+#include "igt.h"
+#include <errno.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <string.h>
+
+IGT_TEST_DESCRIPTION("Test big framebuffers");
+
+typedef struct {
+ int drm_fd;
+ uint32_t devid;
+ igt_display_t display;
+ enum pipe pipe;
+ igt_output_t *output;
+ igt_plane_t *plane;
+ igt_pipe_crc_t *pipe_crc;
+ struct igt_fb small_fb, big_fb;
+ uint32_t format;
+ uint64_t modifier;
+ int width, height;
+ igt_rotation_t rotation;
+ int max_fb_width, max_fb_height;
+ uint64_t ram_size, aper_size, mappable_size;
+ igt_render_copyfunc_t render_copy;
+ drm_intel_bufmgr *bufmgr;
+ struct intel_batchbuffer *batch;
+} data_t;
+
+static void init_buf(data_t *data,
+ struct igt_buf *buf,
+ const struct igt_fb *fb,
+ const char *name)
+{
+ igt_assert_eq(fb->offsets[0], 0);
+
+ buf->bo = gem_handle_to_libdrm_bo(data->bufmgr, data->drm_fd,
+ name, fb->gem_handle);
+ buf->tiling = igt_fb_mod_to_tiling(fb->modifier);
+ buf->stride = fb->strides[0];
+ buf->bpp = fb->plane_bpp[0];
+ buf->size = fb->size;
+}
+
+static void fini_buf(struct igt_buf *buf)
+{
+ drm_intel_bo_unreference(buf->bo);
+}
+
+static void copy_pattern(data_t *data,
+ struct igt_fb *dst_fb, int dx, int dy,
+ struct igt_fb *src_fb, int sx, int sy,
+ int w, int h)
+{
+ struct igt_buf src = {}, dst = {};
+
+ init_buf(data, &src, src_fb, "big fb src");
+ init_buf(data, &dst, dst_fb, "big fb dst");
+
+ gem_set_domain(data->drm_fd, dst_fb->gem_handle,
+ I915_GEM_DOMAIN_GTT, I915_GEM_DOMAIN_GTT);
+ gem_set_domain(data->drm_fd, src_fb->gem_handle,
+ I915_GEM_DOMAIN_GTT, 0);
+
+ if (data->render_copy) {
+ data->render_copy(data->batch, NULL, &src, sx, sy, w, h, &dst, dx, dy);
+ } else {
+ w = min(w, src_fb->width - sx);
+ w = min(w, dst_fb->width - dx);
+
+ h = min(h, src_fb->height - sy);
+ h = min(h, dst_fb->height - dy);
+
+ intel_blt_copy(data->batch, src.bo, sx, sy, src.stride,
+ dst.bo, dx, dy, dst.stride, w, h, dst.bpp);
+ }
+
+ fini_buf(&dst);
+ fini_buf(&src);
+}
+
+static void generate_pattern(data_t *data,
+ struct igt_fb *fb,
+ int w, int h)
+{
+ struct igt_fb pat_fb;
+
+ igt_create_pattern_fb(data->drm_fd, w, h,
+ data->format, data->modifier,
+ &pat_fb);
+
+ for (int y = 0; y < fb->height; y += h) {
+ for (int x = 0; x < fb->width; x += w) {
+ copy_pattern(data, fb, x, y,
+ &pat_fb, 0, 0,
+ pat_fb.width, pat_fb.height);
+ w++;
+ h++;
+ }
+ }
+
+ igt_remove_fb(data->drm_fd, &pat_fb);
+}
+
+static bool size_ok(data_t *data, uint64_t size)
+{
+ /*
+ * The kernel limits scanout to the
+ * mappable portion of ggtt on gmch platforms.
+ */
+ if ((intel_gen(data->devid) < 5 ||
+ IS_VALLEYVIEW(data->devid) ||
+ IS_CHERRYVIEW(data->devid)) &&
+ size > data->mappable_size / 2)
+ return false;
+
+ /*
+ * Limit the big fb size to at most half the RAM or half
+ * the aperture size. Could go a bit higher I suppose since
+ * we shouldn't need more than one big fb at a time.
+ */
+ if (size > data->ram_size / 2 || size > data->aper_size / 2)
+ return false;
+
+ return true;
+}
+
+
+static void max_fb_size(data_t *data, int *width, int *height,
+ uint32_t format, uint64_t modifier)
+{
+ unsigned int stride;
+ uint64_t size;
+ int i = 0;
+
+ *width = data->max_fb_width;
+ *height = data->max_fb_height;
+
+ /* max fence stride is only 8k bytes on gen3 */
+ if (intel_gen(data->devid) < 4 &&
+ format == DRM_FORMAT_XRGB8888)
+ *width = min(*width, 8192 / 4);
+
+ igt_calc_fb_size(data->drm_fd, *width, *height,
+ format, modifier, &size, &stride);
+
+ while (!size_ok(data, size)) {
+ if (i++ & 1)
+ *width >>= 1;
+ else
+ *height >>= 1;
+
+ igt_calc_fb_size(data->drm_fd, *width, *height,
+ format, modifier, &size, &stride);
+ }
+
+ igt_info("Max usable framebuffer size for format "IGT_FORMAT_FMT" / modifier 0x%"PRIx64": %dx%d\n",
+ IGT_FORMAT_ARGS(format), modifier,
+ *width, *height);
+}
+
+static bool test_plane(data_t *data)
+{
+ igt_plane_t *plane = data->plane;
+ struct igt_fb *small_fb = &data->small_fb;
+ struct igt_fb *big_fb = &data->big_fb;
+ int w = big_fb->width - small_fb->width;
+ int h = big_fb->height - small_fb->height;
+ struct {
+ int x, y;
+ } coords[] = {
+ /* bunch of coordinates pulled out of thin air */
+ { 0, 0, },
+ { w * 4 / 7, h / 5, },
+ { w * 3 / 7, h / 3, },
+ { w / 2, h / 2, },
+ { w / 3, h * 3 / 4, },
+ { w, h, },
+ };
+
+ if (!igt_plane_has_format_mod(plane, data->format, data->modifier))
+ return false;
+
+ if (data->rotation != IGT_ROTATION_0 &&
+ !igt_plane_has_prop(plane, IGT_PLANE_ROTATION))
+ return false;
+
+ /* FIXME need atomic on i965/g4x */
+ if (data->rotation != IGT_ROTATION_0 &&
+ data->rotation != IGT_ROTATION_180 &&
+ !data->display.is_atomic)
+ return false;
+
+ if (igt_plane_has_prop(plane, IGT_PLANE_ROTATION))
+ igt_plane_set_rotation(plane, data->rotation);
+ igt_plane_set_position(plane, 0, 0);
+
+ for (int i = 0; i < ARRAY_SIZE(coords); i++) {
+ igt_crc_t small_crc, big_crc;
+ int x = coords[i].x;
+ int y = coords[i].y;
+
+ /* Hardware limitation */
+ if (data->format == DRM_FORMAT_RGB565 &&
+ (data->rotation == IGT_ROTATION_90 ||
+ data->rotation == IGT_ROTATION_270)) {
+ x &= ~1;
+ y &= ~1;
+ }
+
+ /*
+ * Make a 1:1 copy of the desired part of the big fb
+ * rather than try to render the same pattern (translated
+ * accordinly) again via cairo. Something in cairo's
+ * rendering pipeline introduces slight differences into
+ * the result if we try that, and so the crc will not match.
+ */
+ copy_pattern(data, small_fb, 0, 0, big_fb, x, y,
+ small_fb->width, small_fb->height);
+
+ igt_plane_set_fb(plane, small_fb);
+ igt_plane_set_size(plane, data->width, data->height);
+
+ /*
+ * Try to check that the rotation+format+modifier
+ * combo is supported.
+ */
+ if (i == 0 && data->display.is_atomic &&
+ igt_display_try_commit_atomic(&data->display,
+ DRM_MODE_ATOMIC_TEST_ONLY,
+ NULL) != 0) {
+ if (igt_plane_has_prop(plane, IGT_PLANE_ROTATION))
+ igt_plane_set_rotation(plane, IGT_ROTATION_0);
+ igt_plane_set_fb(plane, NULL);
+ igt_skip("unsupported plane configuration\n");
+ }
+
+ igt_display_commit2(&data->display, data->display.is_atomic ?
+ COMMIT_ATOMIC : COMMIT_UNIVERSAL);
+
+
+ igt_pipe_crc_collect_crc(data->pipe_crc, &small_crc);
+
+ igt_plane_set_fb(plane, big_fb);
+ igt_fb_set_position(big_fb, plane, x, y);
+ igt_fb_set_size(big_fb, plane, small_fb->width, small_fb->height);
+ igt_plane_set_size(plane, data->width, data->height);
+ igt_display_commit2(&data->display, data->display.is_atomic ?
+ COMMIT_ATOMIC : COMMIT_UNIVERSAL);
+
+ igt_pipe_crc_collect_crc(data->pipe_crc, &big_crc);
+
+ igt_plane_set_fb(plane, NULL);
+
+ igt_assert_crc_equal(&big_crc, &small_crc);
+
+ }
+
+ return true;
+}
+
+static bool test_pipe(data_t *data)
+{
+ drmModeModeInfo *mode;
+ igt_plane_t *primary;
+ int width, height;
+ bool ret = false;
+
+ mode = igt_output_get_mode(data->output);
+
+ data->width = mode->hdisplay;
+ data->height = mode->vdisplay;
+
+ width = mode->hdisplay;
+ height = mode->vdisplay;
+ if (data->rotation == IGT_ROTATION_90 ||
+ data->rotation == IGT_ROTATION_270)
+ igt_swap(width, height);
+
+ igt_create_color_fb(data->drm_fd, width, height,
+ data->format, data->modifier,
+ 0, 1, 0, &data->small_fb);
+
+ igt_output_set_pipe(data->output, data->pipe);
+
+ primary = igt_output_get_plane_type(data->output, DRM_PLANE_TYPE_PRIMARY);
+ igt_plane_set_fb(primary, NULL);
+
+ if (!data->display.is_atomic) {
+ struct igt_fb fb;
+
+ igt_create_fb(data->drm_fd, mode->hdisplay, mode->vdisplay,
+ DRM_FORMAT_XRGB8888, DRM_FORMAT_MOD_LINEAR,
+ &fb);
+
+ /* legacy setcrtc needs an fb */
+ igt_plane_set_fb(primary, &fb);
+ igt_display_commit2(&data->display, COMMIT_LEGACY);
+
+ igt_plane_set_fb(primary, NULL);
+ igt_display_commit2(&data->display, COMMIT_UNIVERSAL);
+
+ igt_remove_fb(data->drm_fd, &fb);
+ }
+
+ igt_display_commit2(&data->display, data->display.is_atomic ?
+ COMMIT_ATOMIC : COMMIT_UNIVERSAL);
+
+ data->pipe_crc = igt_pipe_crc_new(data->drm_fd, data->pipe,
+ INTEL_PIPE_CRC_SOURCE_AUTO);
+
+ for_each_plane_on_pipe(&data->display, data->pipe, data->plane) {
+ ret = test_plane(data);
+ if (ret)
+ break;
+ }
+
+ igt_pipe_crc_free(data->pipe_crc);
+
+ igt_output_set_pipe(data->output, PIPE_ANY);
+ igt_display_commit2(&data->display, data->display.is_atomic ?
+ COMMIT_ATOMIC : COMMIT_UNIVERSAL);
+
+ igt_remove_fb(data->drm_fd, &data->small_fb);
+
+ return ret;
+}
+
+static void test_scanout(data_t *data)
+{
+ for_each_pipe_with_valid_output(&data->display, data->pipe, data->output) {
+ if (test_pipe(data))
+ return;
+ }
+
+ igt_skip("no valid crtc/connector combinations found\n");
+}
+
+static void prep_fb(data_t *data)
+{
+ int width, height;
+
+ if (data->big_fb.fb_id)
+ return;
+
+ max_fb_size(data, &width, &height,
+ data->format, data->modifier);
+
+ igt_create_fb(data->drm_fd, width, height,
+ data->format, data->modifier,
+ &data->big_fb);
+
+ generate_pattern(data, &data->big_fb, 640, 480);
+}
+
+static void cleanup_fb(data_t *data)
+{
+ igt_remove_fb(data->drm_fd, &data->big_fb);
+ data->big_fb.fb_id = 0;
+}
+
+static void
+test_size_overflow(data_t *data)
+{
+ uint32_t fb_id;
+ uint32_t bo;
+ uint32_t offsets[4] = {};
+ uint32_t strides[4] = { 256*1024, };
+ int ret;
+
+ igt_require(igt_display_has_format_mod(&data->display,
+ DRM_FORMAT_XRGB8888,
+ data->modifier));
+
+ /*
+ * Try to hit a specific integer overflow in i915 fb size
+ * calculations. 256k * 16k == 1<<32 which is checked
+ * against the bo size. The check should fail on account
+ * of the bo being smaller, but due to the overflow the
+ * computed fb size is 0 and thus the check never trips.
+ */
+ igt_require(data->max_fb_width >= 16383 &&
+ data->max_fb_height >= 16383);
+
+ bo = gem_create(data->drm_fd, (1ULL << 32) - 4096);
+ igt_require(bo);
+
+ ret = __kms_addfb(data->drm_fd, bo,
+ 16383, 16383,
+ DRM_FORMAT_XRGB8888,
+ data->modifier,
+ strides, offsets, 1,
+ DRM_MODE_FB_MODIFIERS, &fb_id);
+
+ igt_assert_neq(ret, 0);
+
+ gem_close(data->drm_fd, bo);
+}
+
+static void
+test_size_offset_overflow(data_t *data)
+{
+ uint32_t fb_id;
+ uint32_t bo;
+ uint32_t offsets[4] = {};
+ uint32_t strides[4] = { 8192, };
+ int ret;
+
+ igt_require(igt_display_has_format_mod(&data->display,
+ DRM_FORMAT_NV12,
+ data->modifier));
+
+ /*
+ * Try to a specific integer overflow in i915 fb size
+ * calculations. This time it's offsets[1] + the tile
+ * aligned chroma plane size that overflows and
+ * incorrectly passes the bo size check.
+ */
+ igt_require(igt_display_has_format_mod(&data->display,
+ DRM_FORMAT_NV12,
+ data->modifier));
+
+ bo = gem_create(data->drm_fd, (1ULL << 32) - 4096);
+ igt_require(bo);
+
+ offsets[0] = 0;
+ offsets[1] = (1ULL << 32) - 8192 * 4096;
+
+ ret = __kms_addfb(data->drm_fd, bo,
+ 8192, 8188,
+ DRM_FORMAT_NV12,
+ data->modifier,
+ strides, offsets, 1,
+ DRM_MODE_FB_MODIFIERS, &fb_id);
+ igt_assert_neq(ret, 0);
+
+ gem_close(data->drm_fd, bo);
+}
+
+static int rmfb(int fd, uint32_t id)
+{
+ int err;
+
+ err = 0;
+ if (igt_ioctl(fd, DRM_IOCTL_MODE_RMFB, &id))
+ err = -errno;
+
+ errno = 0;
+ return err;
+}
+
+static void
+test_addfb(data_t *data)
+{
+ uint64_t size;
+ uint32_t fb_id;
+ uint32_t bo;
+ uint32_t offsets[4] = {};
+ uint32_t strides[4] = {};
+ uint32_t format;
+ int ret;
+
+ /*
+ * gen3 max tiled stride is 8k bytes, but
+ * max fb size of 4k pixels, hence we can't test
+ * with 32bpp and must use 16bpp instead.
+ */
+ if (intel_gen(data->devid) == 3)
+ format = DRM_FORMAT_RGB565;
+ else
+ format = DRM_FORMAT_XRGB8888;
+
+ igt_require(igt_display_has_format_mod(&data->display,
+ format, data->modifier));
+
+ igt_calc_fb_size(data->drm_fd,
+ data->max_fb_width,
+ data->max_fb_height,
+ format, data->modifier,
+ &size, &strides[0]);
+
+ bo = gem_create(data->drm_fd, size);
+ igt_require(bo);
+
+ if (intel_gen(data->devid) < 4)
+ gem_set_tiling(data->drm_fd, bo,
+ igt_fb_mod_to_tiling(data->modifier), strides[0]);
+
+ ret = __kms_addfb(data->drm_fd, bo,
+ data->max_fb_width,
+ data->max_fb_height,
+ format, data->modifier,
+ strides, offsets, 1,
+ DRM_MODE_FB_MODIFIERS, &fb_id);
+ igt_assert_eq(ret, 0);
+
+ rmfb(data->drm_fd, fb_id);
+ gem_close(data->drm_fd, bo);
+}
+
+static data_t data;
+
+static const struct {
+ uint64_t modifier;
+ const char *name;
+} modifiers[] = {
+ { DRM_FORMAT_MOD_LINEAR, "linear", },
+ { I915_FORMAT_MOD_X_TILED, "x-tiled", },
+ { I915_FORMAT_MOD_Y_TILED, "y-tiled", },
+ { I915_FORMAT_MOD_Yf_TILED, "yf-tiled", },
+};
+
+static const struct {
+ uint32_t format;
+ uint8_t bpp;
+} formats[] = {
+ /* FIXME igt_fb doesn't support C8 currently */
+ { DRM_FORMAT_C8, 8, },
+ { DRM_FORMAT_RGB565, 16, },
+ { DRM_FORMAT_XRGB8888, 32, },
+ { DRM_FORMAT_XBGR16161616F, 64, },
+};
+
+static const struct {
+ igt_rotation_t rotation;
+ uint16_t angle;
+} rotations[] = {
+ { IGT_ROTATION_0, 0, },
+ { IGT_ROTATION_90, 90, },
+ { IGT_ROTATION_180, 180, },
+ { IGT_ROTATION_270, 270, },
+};
+
+igt_main
+{
+ igt_fixture {
+ drmModeResPtr res;
+
+ igt_skip_on_simulation();
+
+ data.drm_fd = drm_open_driver_master(DRIVER_INTEL);
+
+ igt_require(is_i915_device(data.drm_fd));
+
+ data.devid = intel_get_drm_devid(data.drm_fd);
+
+ kmstest_set_vt_graphics_mode();
+
+ igt_require_pipe_crc(data.drm_fd);
+ igt_display_require(&data.display, data.drm_fd);
+
+ res = drmModeGetResources(data.drm_fd);
+ igt_assert(res);
+
+ data.max_fb_width = res->max_width;
+ data.max_fb_height = res->max_height;
+
+ drmModeFreeResources(res);
+
+ igt_info("Max driver framebuffer size %dx%d\n",
+ data.max_fb_width, data.max_fb_height);
+
+ data.ram_size = intel_get_total_ram_mb() << 20;
+ data.aper_size = gem_aperture_size(data.drm_fd);
+ data.mappable_size = gem_mappable_aperture_size();
+
+ igt_info("RAM: %"PRIu64" MiB, GPU address space: %"PRId64" MiB, GGTT mappable size: %"PRId64" MiB\n",
+ data.ram_size >> 20, data.aper_size >> 20,
+ data.mappable_size >> 20);
+
+ /*
+ * Gen3 render engine is limited to 2kx2k, whereas
+ * the display engine can do 4kx4k. Use the blitter
+ * on gen3 to avoid exceeding the render engine limits.
+ * On gen2 we could use either, but let's go for the
+ * blitter there as well.
+ */
+ if (intel_gen(data.devid) >= 4)
+ data.render_copy = igt_get_render_copyfunc(data.devid);
+
+ data.bufmgr = drm_intel_bufmgr_gem_init(data.drm_fd, 4096);
+ data.batch = intel_batchbuffer_alloc(data.bufmgr, data.devid);
+ }
+
+ /*
+ * Skip linear as it doesn't hit the overflow we want
+ * on account of the tile height being effectively one,
+ * and thus the kenrnel rounding up to the next tile
+ * height won't do anything.
+ */
+ for (int i = 1; i < ARRAY_SIZE(modifiers); i++) {
+ igt_subtest_f("%s-addfb-size-overflow",
+ modifiers[i].name) {
+ data.modifier = modifiers[i].modifier;
+ test_size_overflow(&data);
+ }
+ }
+
+ for (int i = 1; i < ARRAY_SIZE(modifiers); i++) {
+ igt_subtest_f("%s-addfb-size-offset-overflow",
+ modifiers[i].name) {
+ data.modifier = modifiers[i].modifier;
+ test_size_offset_overflow(&data);
+ }
+ }
+
+ for (int i = 0; i < ARRAY_SIZE(modifiers); i++) {
+ igt_subtest_f("%s-addfb", modifiers[i].name) {
+ data.modifier = modifiers[i].modifier;
+
+ test_addfb(&data);
+ }
+ }
+
+ for (int i = 0; i < ARRAY_SIZE(modifiers); i++) {
+ data.modifier = modifiers[i].modifier;
+
+ for (int j = 0; j < ARRAY_SIZE(formats); j++) {
+ data.format = formats[j].format;
+
+ for (int k = 0; k < ARRAY_SIZE(rotations); k++) {
+ data.rotation = rotations[k].rotation;
+
+ igt_subtest_f("%s-%dbpp-rotate-%d", modifiers[i].name,
+ formats[j].bpp, rotations[k].angle) {
+ igt_require(igt_fb_supported_format(data.format));
+ igt_require(igt_display_has_format_mod(&data.display, data.format, data.modifier));
+ prep_fb(&data);
+ test_scanout(&data);
+ }
+ }
+
+ igt_fixture
+ cleanup_fb(&data);
+ }
+ }
+
+ igt_fixture {
+ igt_display_fini(&data.display);
+
+ intel_batchbuffer_free(data.batch);
+ drm_intel_bufmgr_destroy(data.bufmgr);
+ }
+}
diff --git a/tests/meson.build b/tests/meson.build
index 711979b4a1c2..ad8444875302 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -14,6 +14,7 @@ test_progs = [
'kms_atomic_interruptible',
'kms_atomic_transition',
'kms_available_modes_crc',
+ 'kms_big_fb',
'kms_busy',
'kms_ccs',
'kms_color',
--
2.21.0
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [igt-dev] ✓ Fi.CI.BAT: success for tests/kms_big_fb: Make sure huge fbs work correctly (rev2)
2019-05-08 16:29 [igt-dev] [PATCH i-g-t v3] tests/kms_big_fb: Make sure huge fbs work correctly Ville Syrjala
@ 2019-05-08 17:01 ` Patchwork
2019-05-08 20:07 ` [igt-dev] ✗ Fi.CI.IGT: failure " Patchwork
` (4 subsequent siblings)
5 siblings, 0 replies; 9+ messages in thread
From: Patchwork @ 2019-05-08 17:01 UTC (permalink / raw)
To: Ville Syrjala; +Cc: igt-dev
== Series Details ==
Series: tests/kms_big_fb: Make sure huge fbs work correctly (rev2)
URL : https://patchwork.freedesktop.org/series/49494/
State : success
== Summary ==
CI Bug Log - changes from CI_DRM_6065 -> IGTPW_2953
====================================================
Summary
-------
**SUCCESS**
No regressions found.
External URL: https://patchwork.freedesktop.org/api/1.0/series/49494/revisions/2/mbox/
Known issues
------------
Here are the changes found in IGTPW_2953 that come from known issues:
### IGT changes ###
#### Warnings ####
* igt@i915_selftest@live_hangcheck:
- fi-apl-guc: [INCOMPLETE][1] ([fdo#103927] / [fdo#110624]) -> [DMESG-FAIL][2] ([fdo#110620])
[1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6065/fi-apl-guc/igt@i915_selftest@live_hangcheck.html
[2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2953/fi-apl-guc/igt@i915_selftest@live_hangcheck.html
* igt@runner@aborted:
- fi-apl-guc: [FAIL][3] ([fdo#110624]) -> [FAIL][4] ([fdo#110622])
[3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6065/fi-apl-guc/igt@runner@aborted.html
[4]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2953/fi-apl-guc/igt@runner@aborted.html
[fdo#103927]: https://bugs.freedesktop.org/show_bug.cgi?id=103927
[fdo#110620]: https://bugs.freedesktop.org/show_bug.cgi?id=110620
[fdo#110622]: https://bugs.freedesktop.org/show_bug.cgi?id=110622
[fdo#110624]: https://bugs.freedesktop.org/show_bug.cgi?id=110624
Participating hosts (53 -> 43)
------------------------------
Missing (10): fi-kbl-soraka fi-ilk-m540 fi-hsw-4200u fi-byt-squawks fi-icl-u2 fi-bsw-cyan fi-ctg-p8600 fi-ivb-3770 fi-byt-clapper fi-bdw-samus
Build changes
-------------
* IGT: IGT_4973 -> IGTPW_2953
CI_DRM_6065: 4ce82224f3c40ee55f11a505b57247f8f540990a @ git://anongit.freedesktop.org/gfx-ci/linux
IGTPW_2953: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2953/
IGT_4973: 3e3ff0e48989abd25fce4916e85e8fef20a3c63a @ git://anongit.freedesktop.org/xorg/app/intel-gpu-tools
== Testlist changes ==
+igt@kms_big_fb@linear-8bpp-rotate-0
+igt@kms_big_fb@linear-8bpp-rotate-90
+igt@kms_big_fb@linear-8bpp-rotate-180
+igt@kms_big_fb@linear-8bpp-rotate-270
+igt@kms_big_fb@linear-16bpp-rotate-0
+igt@kms_big_fb@linear-16bpp-rotate-90
+igt@kms_big_fb@linear-16bpp-rotate-180
+igt@kms_big_fb@linear-16bpp-rotate-270
+igt@kms_big_fb@linear-32bpp-rotate-0
+igt@kms_big_fb@linear-32bpp-rotate-90
+igt@kms_big_fb@linear-32bpp-rotate-180
+igt@kms_big_fb@linear-32bpp-rotate-270
+igt@kms_big_fb@linear-64bpp-rotate-0
+igt@kms_big_fb@linear-64bpp-rotate-90
+igt@kms_big_fb@linear-64bpp-rotate-180
+igt@kms_big_fb@linear-64bpp-rotate-270
+igt@kms_big_fb@linear-addfb
+igt@kms_big_fb@x-tiled-8bpp-rotate-0
+igt@kms_big_fb@x-tiled-8bpp-rotate-90
+igt@kms_big_fb@x-tiled-8bpp-rotate-180
+igt@kms_big_fb@x-tiled-8bpp-rotate-270
+igt@kms_big_fb@x-tiled-16bpp-rotate-0
+igt@kms_big_fb@x-tiled-16bpp-rotate-90
+igt@kms_big_fb@x-tiled-16bpp-rotate-180
+igt@kms_big_fb@x-tiled-16bpp-rotate-270
+igt@kms_big_fb@x-tiled-32bpp-rotate-0
+igt@kms_big_fb@x-tiled-32bpp-rotate-90
+igt@kms_big_fb@x-tiled-32bpp-rotate-180
+igt@kms_big_fb@x-tiled-32bpp-rotate-270
+igt@kms_big_fb@x-tiled-64bpp-rotate-0
+igt@kms_big_fb@x-tiled-64bpp-rotate-90
+igt@kms_big_fb@x-tiled-64bpp-rotate-180
+igt@kms_big_fb@x-tiled-64bpp-rotate-270
+igt@kms_big_fb@x-tiled-addfb
+igt@kms_big_fb@x-tiled-addfb-size-offset-overflow
+igt@kms_big_fb@x-tiled-addfb-size-overflow
+igt@kms_big_fb@yf-tiled-8bpp-rotate-0
+igt@kms_big_fb@yf-tiled-8bpp-rotate-90
+igt@kms_big_fb@yf-tiled-8bpp-rotate-180
+igt@kms_big_fb@yf-tiled-8bpp-rotate-270
+igt@kms_big_fb@yf-tiled-16bpp-rotate-0
+igt@kms_big_fb@yf-tiled-16bpp-rotate-90
+igt@kms_big_fb@yf-tiled-16bpp-rotate-180
+igt@kms_big_fb@yf-tiled-16bpp-rotate-270
+igt@kms_big_fb@yf-tiled-32bpp-rotate-0
+igt@kms_big_fb@yf-tiled-32bpp-rotate-90
+igt@kms_big_fb@yf-tiled-32bpp-rotate-180
+igt@kms_big_fb@yf-tiled-32bpp-rotate-270
+igt@kms_big_fb@yf-tiled-64bpp-rotate-0
+igt@kms_big_fb@yf-tiled-64bpp-rotate-90
+igt@kms_big_fb@yf-tiled-64bpp-rotate-180
+igt@kms_big_fb@yf-tiled-64bpp-rotate-270
+igt@kms_big_fb@yf-tiled-addfb
+igt@kms_big_fb@yf-tiled-addfb-size-offset-overflow
+igt@kms_big_fb@yf-tiled-addfb-size-overflow
+igt@kms_big_fb@y-tiled-8bpp-rotate-0
+igt@kms_big_fb@y-tiled-8bpp-rotate-90
+igt@kms_big_fb@y-tiled-8bpp-rotate-180
+igt@kms_big_fb@y-tiled-8bpp-rotate-270
+igt@kms_big_fb@y-tiled-16bpp-rotate-0
+igt@kms_big_fb@y-tiled-16bpp-rotate-90
+igt@kms_big_fb@y-tiled-16bpp-rotate-180
+igt@kms_big_fb@y-tiled-16bpp-rotate-270
+igt@kms_big_fb@y-tiled-32bpp-rotate-0
+igt@kms_big_fb@y-tiled-32bpp-rotate-90
+igt@kms_big_fb@y-tiled-32bpp-rotate-180
+igt@kms_big_fb@y-tiled-32bpp-rotate-270
+igt@kms_big_fb@y-tiled-64bpp-rotate-0
+igt@kms_big_fb@y-tiled-64bpp-rotate-90
+igt@kms_big_fb@y-tiled-64bpp-rotate-180
+igt@kms_big_fb@y-tiled-64bpp-rotate-270
+igt@kms_big_fb@y-tiled-addfb
+igt@kms_big_fb@y-tiled-addfb-size-offset-overflow
+igt@kms_big_fb@y-tiled-addfb-size-overflow
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2953/
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 9+ messages in thread
* [igt-dev] ✗ Fi.CI.IGT: failure for tests/kms_big_fb: Make sure huge fbs work correctly (rev2)
2019-05-08 16:29 [igt-dev] [PATCH i-g-t v3] tests/kms_big_fb: Make sure huge fbs work correctly Ville Syrjala
2019-05-08 17:01 ` [igt-dev] ✓ Fi.CI.BAT: success for tests/kms_big_fb: Make sure huge fbs work correctly (rev2) Patchwork
@ 2019-05-08 20:07 ` Patchwork
2019-05-10 8:53 ` [igt-dev] [PATCH i-g-t v3] tests/kms_big_fb: Make sure huge fbs work correctly Daniel Vetter
` (3 subsequent siblings)
5 siblings, 0 replies; 9+ messages in thread
From: Patchwork @ 2019-05-08 20:07 UTC (permalink / raw)
To: Ville Syrjälä; +Cc: igt-dev
== Series Details ==
Series: tests/kms_big_fb: Make sure huge fbs work correctly (rev2)
URL : https://patchwork.freedesktop.org/series/49494/
State : failure
== Summary ==
CI Bug Log - changes from CI_DRM_6065_full -> IGTPW_2953_full
====================================================
Summary
-------
**FAILURE**
Serious unknown changes coming with IGTPW_2953_full absolutely need to be
verified manually.
If you think the reported changes have nothing to do with the changes
introduced in IGTPW_2953_full, please notify your bug team to allow them
to document this new failure mode, which will reduce false positives in CI.
External URL: https://patchwork.freedesktop.org/api/1.0/series/49494/revisions/2/mbox/
Possible new issues
-------------------
Here are the unknown changes that may have been introduced in IGTPW_2953_full:
### IGT changes ###
#### Possible regressions ####
* {igt@kms_big_fb@x-tiled-32bpp-rotate-90} (NEW):
- shard-iclb: NOTRUN -> [SKIP][1] +30 similar issues
[1]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2953/shard-iclb1/igt@kms_big_fb@x-tiled-32bpp-rotate-90.html
* {igt@kms_big_fb@y-tiled-64bpp-rotate-0} (NEW):
- shard-iclb: NOTRUN -> [FAIL][2] +11 similar issues
[2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2953/shard-iclb6/igt@kms_big_fb@y-tiled-64bpp-rotate-0.html
New tests
---------
New tests have been introduced between CI_DRM_6065_full and IGTPW_2953_full:
### New IGT tests (74) ###
* igt@kms_big_fb@linear-16bpp-rotate-0:
- Statuses : 6 pass(s)
- Exec time: [1.23, 1.83] s
* igt@kms_big_fb@linear-16bpp-rotate-180:
- Statuses : 6 pass(s)
- Exec time: [1.24, 1.86] s
* igt@kms_big_fb@linear-16bpp-rotate-270:
- Statuses : 6 skip(s)
- Exec time: [0.15, 0.54] s
* igt@kms_big_fb@linear-16bpp-rotate-90:
- Statuses : 6 skip(s)
- Exec time: [0.23, 1.21] s
* igt@kms_big_fb@linear-32bpp-rotate-0:
- Statuses : 6 pass(s)
- Exec time: [1.51, 2.10] s
* igt@kms_big_fb@linear-32bpp-rotate-180:
- Statuses : 6 pass(s)
- Exec time: [1.31, 2.01] s
* igt@kms_big_fb@linear-32bpp-rotate-270:
- Statuses : 6 skip(s)
- Exec time: [0.22, 0.70] s
* igt@kms_big_fb@linear-32bpp-rotate-90:
- Statuses : 6 skip(s)
- Exec time: [0.22, 0.70] s
* igt@kms_big_fb@linear-64bpp-rotate-0:
- Statuses : 1 fail(s) 5 skip(s)
- Exec time: [0.0, 0.13] s
* igt@kms_big_fb@linear-64bpp-rotate-180:
- Statuses : 1 fail(s) 5 skip(s)
- Exec time: [0.0, 0.10] s
* igt@kms_big_fb@linear-64bpp-rotate-270:
- Statuses : 1 fail(s) 5 skip(s)
- Exec time: [0.0, 0.10] s
* igt@kms_big_fb@linear-64bpp-rotate-90:
- Statuses : 1 fail(s) 5 skip(s)
- Exec time: [0.0, 0.14] s
* igt@kms_big_fb@linear-8bpp-rotate-0:
- Statuses : 6 skip(s)
- Exec time: [0.0] s
* igt@kms_big_fb@linear-8bpp-rotate-180:
- Statuses : 6 skip(s)
- Exec time: [0.0] s
* igt@kms_big_fb@linear-8bpp-rotate-270:
- Statuses : 6 skip(s)
- Exec time: [0.0] s
* igt@kms_big_fb@linear-8bpp-rotate-90:
- Statuses : 6 skip(s)
- Exec time: [0.0] s
* igt@kms_big_fb@linear-addfb:
- Statuses : 5 pass(s)
- Exec time: [0.0, 0.00] s
* igt@kms_big_fb@x-tiled-16bpp-rotate-0:
- Statuses : 6 pass(s)
- Exec time: [1.20, 1.79] s
* igt@kms_big_fb@x-tiled-16bpp-rotate-180:
- Statuses : 6 pass(s)
- Exec time: [1.40, 1.81] s
* igt@kms_big_fb@x-tiled-16bpp-rotate-270:
- Statuses : 6 skip(s)
- Exec time: [0.14, 0.46] s
* igt@kms_big_fb@x-tiled-16bpp-rotate-90:
- Statuses : 6 skip(s)
- Exec time: [0.21, 0.59] s
* igt@kms_big_fb@x-tiled-32bpp-rotate-0:
- Statuses : 6 pass(s)
- Exec time: [1.41, 1.90] s
* igt@kms_big_fb@x-tiled-32bpp-rotate-180:
- Statuses : 6 pass(s)
- Exec time: [1.30, 1.96] s
* igt@kms_big_fb@x-tiled-32bpp-rotate-270:
- Statuses : 6 skip(s)
- Exec time: [0.21, 0.68] s
* igt@kms_big_fb@x-tiled-32bpp-rotate-90:
- Statuses : 6 skip(s)
- Exec time: [0.21, 0.76] s
* igt@kms_big_fb@x-tiled-64bpp-rotate-0:
- Statuses : 1 fail(s) 5 skip(s)
- Exec time: [0.0, 0.16] s
* igt@kms_big_fb@x-tiled-64bpp-rotate-180:
- Statuses : 1 fail(s) 5 skip(s)
- Exec time: [0.0, 0.13] s
* igt@kms_big_fb@x-tiled-64bpp-rotate-270:
- Statuses : 1 fail(s) 5 skip(s)
- Exec time: [0.0, 0.01] s
* igt@kms_big_fb@x-tiled-64bpp-rotate-90:
- Statuses : 1 fail(s) 5 skip(s)
- Exec time: [0.0, 1.05] s
* igt@kms_big_fb@x-tiled-8bpp-rotate-0:
- Statuses : 6 skip(s)
- Exec time: [0.0] s
* igt@kms_big_fb@x-tiled-8bpp-rotate-180:
- Statuses : 6 skip(s)
- Exec time: [0.0] s
* igt@kms_big_fb@x-tiled-8bpp-rotate-270:
- Statuses : 6 skip(s)
- Exec time: [0.0, 0.00] s
* igt@kms_big_fb@x-tiled-8bpp-rotate-90:
- Statuses : 6 skip(s)
- Exec time: [0.0] s
* igt@kms_big_fb@x-tiled-addfb:
- Statuses : 6 pass(s)
- Exec time: [0.0] s
* igt@kms_big_fb@x-tiled-addfb-size-offset-overflow:
- Statuses : 3 pass(s) 3 skip(s)
- Exec time: [0.0] s
* igt@kms_big_fb@x-tiled-addfb-size-overflow:
- Statuses : 6 skip(s)
- Exec time: [0.0] s
* igt@kms_big_fb@y-tiled-16bpp-rotate-0:
- Statuses : 3 pass(s) 2 skip(s)
- Exec time: [0.0, 1.81] s
* igt@kms_big_fb@y-tiled-16bpp-rotate-180:
- Statuses : 4 pass(s) 2 skip(s)
- Exec time: [0.0, 1.82] s
* igt@kms_big_fb@y-tiled-16bpp-rotate-270:
- Statuses : 1 pass(s) 5 skip(s)
- Exec time: [0.0, 1.49] s
* igt@kms_big_fb@y-tiled-16bpp-rotate-90:
- Statuses : 1 pass(s) 5 skip(s)
- Exec time: [0.0, 1.68] s
* igt@kms_big_fb@y-tiled-32bpp-rotate-0:
- Statuses : 4 pass(s) 2 skip(s)
- Exec time: [0.0, 1.99] s
* igt@kms_big_fb@y-tiled-32bpp-rotate-180:
- Statuses : 4 pass(s) 2 skip(s)
- Exec time: [0.0, 2.00] s
* igt@kms_big_fb@y-tiled-32bpp-rotate-270:
- Statuses : 4 pass(s) 2 skip(s)
- Exec time: [0.0, 2.35] s
* igt@kms_big_fb@y-tiled-32bpp-rotate-90:
- Statuses : 4 pass(s) 2 skip(s)
- Exec time: [0.0, 2.04] s
* igt@kms_big_fb@y-tiled-64bpp-rotate-0:
- Statuses : 1 fail(s) 5 skip(s)
- Exec time: [0.0, 0.14] s
* igt@kms_big_fb@y-tiled-64bpp-rotate-180:
- Statuses : 1 fail(s) 5 skip(s)
- Exec time: [0.0, 0.17] s
* igt@kms_big_fb@y-tiled-64bpp-rotate-270:
- Statuses : 1 fail(s) 5 skip(s)
- Exec time: [0.0, 0.10] s
* igt@kms_big_fb@y-tiled-64bpp-rotate-90:
- Statuses : 1 fail(s) 5 skip(s)
- Exec time: [0.0, 0.01] s
* igt@kms_big_fb@y-tiled-8bpp-rotate-0:
- Statuses : 6 skip(s)
- Exec time: [0.0] s
* igt@kms_big_fb@y-tiled-8bpp-rotate-180:
- Statuses : 6 skip(s)
- Exec time: [0.0] s
* igt@kms_big_fb@y-tiled-8bpp-rotate-270:
- Statuses : 6 skip(s)
- Exec time: [0.0] s
* igt@kms_big_fb@y-tiled-8bpp-rotate-90:
- Statuses : 6 skip(s)
- Exec time: [0.0] s
* igt@kms_big_fb@y-tiled-addfb:
- Statuses : 4 pass(s) 1 skip(s)
- Exec time: [0.0] s
* igt@kms_big_fb@y-tiled-addfb-size-offset-overflow:
- Statuses : 3 pass(s) 3 skip(s)
- Exec time: [0.0] s
* igt@kms_big_fb@y-tiled-addfb-size-overflow:
- Statuses : 6 skip(s)
- Exec time: [0.0] s
* igt@kms_big_fb@yf-tiled-16bpp-rotate-0:
- Statuses : 4 pass(s) 2 skip(s)
- Exec time: [0.0, 1.81] s
* igt@kms_big_fb@yf-tiled-16bpp-rotate-180:
- Statuses : 4 pass(s) 2 skip(s)
- Exec time: [0.0, 1.79] s
* igt@kms_big_fb@yf-tiled-16bpp-rotate-270:
- Statuses : 1 pass(s) 4 skip(s)
- Exec time: [0.0, 1.59] s
* igt@kms_big_fb@yf-tiled-16bpp-rotate-90:
- Statuses : 1 pass(s) 5 skip(s)
- Exec time: [0.0, 1.65] s
* igt@kms_big_fb@yf-tiled-32bpp-rotate-0:
- Statuses : 4 pass(s) 2 skip(s)
- Exec time: [0.0, 2.00] s
* igt@kms_big_fb@yf-tiled-32bpp-rotate-180:
- Statuses : 4 pass(s) 2 skip(s)
- Exec time: [0.0, 3.46] s
* igt@kms_big_fb@yf-tiled-32bpp-rotate-270:
- Statuses : 4 pass(s) 2 skip(s)
- Exec time: [0.0, 2.05] s
* igt@kms_big_fb@yf-tiled-32bpp-rotate-90:
- Statuses : 4 pass(s) 2 skip(s)
- Exec time: [0.0, 2.04] s
* igt@kms_big_fb@yf-tiled-64bpp-rotate-0:
- Statuses : 6 skip(s)
- Exec time: [0.0] s
* igt@kms_big_fb@yf-tiled-64bpp-rotate-180:
- Statuses : 5 skip(s)
- Exec time: [0.0] s
* igt@kms_big_fb@yf-tiled-64bpp-rotate-270:
- Statuses : 6 skip(s)
- Exec time: [0.0] s
* igt@kms_big_fb@yf-tiled-64bpp-rotate-90:
- Statuses : 6 skip(s)
- Exec time: [0.0] s
* igt@kms_big_fb@yf-tiled-8bpp-rotate-0:
- Statuses : 6 skip(s)
- Exec time: [0.0] s
* igt@kms_big_fb@yf-tiled-8bpp-rotate-180:
- Statuses : 6 skip(s)
- Exec time: [0.0] s
* igt@kms_big_fb@yf-tiled-8bpp-rotate-270:
- Statuses : 6 skip(s)
- Exec time: [0.0] s
* igt@kms_big_fb@yf-tiled-8bpp-rotate-90:
- Statuses : 5 skip(s)
- Exec time: [0.0] s
* igt@kms_big_fb@yf-tiled-addfb:
- Statuses : 4 pass(s) 2 skip(s)
- Exec time: [0.0, 0.00] s
* igt@kms_big_fb@yf-tiled-addfb-size-offset-overflow:
- Statuses : 3 pass(s) 3 skip(s)
- Exec time: [0.0] s
* igt@kms_big_fb@yf-tiled-addfb-size-overflow:
- Statuses : 6 skip(s)
- Exec time: [0.0] s
Known issues
------------
Here are the changes found in IGTPW_2953_full that come from known issues:
### IGT changes ###
#### Issues hit ####
* igt@gem_tiled_swapping@non-threaded:
- shard-glk: [PASS][3] -> [DMESG-WARN][4] ([fdo#108686])
[3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6065/shard-glk5/igt@gem_tiled_swapping@non-threaded.html
[4]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2953/shard-glk8/igt@gem_tiled_swapping@non-threaded.html
* igt@kms_flip@2x-flip-vs-modeset-vs-hang-interruptible:
- shard-hsw: [PASS][5] -> [INCOMPLETE][6] ([fdo#103540])
[5]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6065/shard-hsw2/igt@kms_flip@2x-flip-vs-modeset-vs-hang-interruptible.html
[6]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2953/shard-hsw2/igt@kms_flip@2x-flip-vs-modeset-vs-hang-interruptible.html
* igt@kms_flip@flip-vs-expired-vblank-interruptible:
- shard-glk: [PASS][7] -> [FAIL][8] ([fdo#105363])
[7]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6065/shard-glk8/igt@kms_flip@flip-vs-expired-vblank-interruptible.html
[8]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2953/shard-glk7/igt@kms_flip@flip-vs-expired-vblank-interruptible.html
* igt@kms_frontbuffer_tracking@fbc-suspend:
- shard-apl: [PASS][9] -> [DMESG-WARN][10] ([fdo#108566]) +4 similar issues
[9]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6065/shard-apl4/igt@kms_frontbuffer_tracking@fbc-suspend.html
[10]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2953/shard-apl4/igt@kms_frontbuffer_tracking@fbc-suspend.html
* igt@kms_frontbuffer_tracking@fbcpsr-rgb565-draw-render:
- shard-iclb: [PASS][11] -> [FAIL][12] ([fdo#103167]) +1 similar issue
[11]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6065/shard-iclb6/igt@kms_frontbuffer_tracking@fbcpsr-rgb565-draw-render.html
[12]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2953/shard-iclb5/igt@kms_frontbuffer_tracking@fbcpsr-rgb565-draw-render.html
* igt@kms_plane_scaling@pipe-b-scaler-with-pixel-format:
- shard-glk: [PASS][13] -> [SKIP][14] ([fdo#109271] / [fdo#109278])
[13]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6065/shard-glk9/igt@kms_plane_scaling@pipe-b-scaler-with-pixel-format.html
[14]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2953/shard-glk6/igt@kms_plane_scaling@pipe-b-scaler-with-pixel-format.html
* igt@kms_psr@psr2_sprite_plane_onoff:
- shard-iclb: [PASS][15] -> [SKIP][16] ([fdo#109441]) +1 similar issue
[15]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6065/shard-iclb2/igt@kms_psr@psr2_sprite_plane_onoff.html
[16]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2953/shard-iclb6/igt@kms_psr@psr2_sprite_plane_onoff.html
#### Possible fixes ####
* igt@kms_cursor_crc@cursor-64x21-sliding:
- shard-apl: [FAIL][17] ([fdo#103232]) -> [PASS][18]
[17]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6065/shard-apl8/igt@kms_cursor_crc@cursor-64x21-sliding.html
[18]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2953/shard-apl6/igt@kms_cursor_crc@cursor-64x21-sliding.html
- shard-kbl: [FAIL][19] ([fdo#103232]) -> [PASS][20]
[19]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6065/shard-kbl4/igt@kms_cursor_crc@cursor-64x21-sliding.html
[20]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2953/shard-kbl2/igt@kms_cursor_crc@cursor-64x21-sliding.html
* igt@kms_cursor_crc@cursor-64x64-suspend:
- shard-kbl: [DMESG-WARN][21] ([fdo#108566]) -> [PASS][22]
[21]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6065/shard-kbl4/igt@kms_cursor_crc@cursor-64x64-suspend.html
[22]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2953/shard-kbl6/igt@kms_cursor_crc@cursor-64x64-suspend.html
* igt@kms_flip@flip-vs-suspend-interruptible:
- shard-hsw: [INCOMPLETE][23] ([fdo#103540]) -> [PASS][24]
[23]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6065/shard-hsw5/igt@kms_flip@flip-vs-suspend-interruptible.html
[24]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2953/shard-hsw4/igt@kms_flip@flip-vs-suspend-interruptible.html
* igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-pri-shrfb-draw-pwrite:
- shard-iclb: [FAIL][25] ([fdo#103167]) -> [PASS][26] +7 similar issues
[25]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6065/shard-iclb4/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-pri-shrfb-draw-pwrite.html
[26]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2953/shard-iclb7/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-pri-shrfb-draw-pwrite.html
* igt@kms_plane@pixel-format-pipe-b-planes-source-clamping:
- shard-glk: [SKIP][27] ([fdo#109271]) -> [PASS][28] +1 similar issue
[27]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6065/shard-glk5/igt@kms_plane@pixel-format-pipe-b-planes-source-clamping.html
[28]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2953/shard-glk9/igt@kms_plane@pixel-format-pipe-b-planes-source-clamping.html
* igt@kms_psr@psr2_cursor_mmap_cpu:
- shard-iclb: [SKIP][29] ([fdo#109441]) -> [PASS][30] +1 similar issue
[29]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6065/shard-iclb3/igt@kms_psr@psr2_cursor_mmap_cpu.html
[30]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2953/shard-iclb2/igt@kms_psr@psr2_cursor_mmap_cpu.html
* igt@kms_setmode@basic:
- shard-kbl: [FAIL][31] ([fdo#99912]) -> [PASS][32]
[31]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6065/shard-kbl4/igt@kms_setmode@basic.html
[32]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2953/shard-kbl3/igt@kms_setmode@basic.html
* igt@kms_vblank@pipe-c-ts-continuation-suspend:
- shard-apl: [DMESG-WARN][33] ([fdo#108566]) -> [PASS][34] +4 similar issues
[33]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6065/shard-apl2/igt@kms_vblank@pipe-c-ts-continuation-suspend.html
[34]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2953/shard-apl7/igt@kms_vblank@pipe-c-ts-continuation-suspend.html
{name}: This element is suppressed. This means it is ignored when computing
the status of the difference (SUCCESS, WARNING, or FAILURE).
[fdo#103167]: https://bugs.freedesktop.org/show_bug.cgi?id=103167
[fdo#103232]: https://bugs.freedesktop.org/show_bug.cgi?id=103232
[fdo#103540]: https://bugs.freedesktop.org/show_bug.cgi?id=103540
[fdo#105363]: https://bugs.freedesktop.org/show_bug.cgi?id=105363
[fdo#108566]: https://bugs.freedesktop.org/show_bug.cgi?id=108566
[fdo#108686]: https://bugs.freedesktop.org/show_bug.cgi?id=108686
[fdo#109271]: https://bugs.freedesktop.org/show_bug.cgi?id=109271
[fdo#109278]: https://bugs.freedesktop.org/show_bug.cgi?id=109278
[fdo#109441]: https://bugs.freedesktop.org/show_bug.cgi?id=109441
[fdo#99912]: https://bugs.freedesktop.org/show_bug.cgi?id=99912
Participating hosts (10 -> 6)
------------------------------
Missing (4): pig-skl-6260u shard-skl pig-hsw-4770r pig-glk-j5005
Build changes
-------------
* IGT: IGT_4973 -> IGTPW_2953
* Piglit: piglit_4509 -> None
CI_DRM_6065: 4ce82224f3c40ee55f11a505b57247f8f540990a @ git://anongit.freedesktop.org/gfx-ci/linux
IGTPW_2953: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2953/
IGT_4973: 3e3ff0e48989abd25fce4916e85e8fef20a3c63a @ git://anongit.freedesktop.org/xorg/app/intel-gpu-tools
piglit_4509: fdc5a4ca11124ab8413c7988896eec4c97336694 @ git://anongit.freedesktop.org/piglit
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2953/
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [igt-dev] [PATCH i-g-t v3] tests/kms_big_fb: Make sure huge fbs work correctly
2019-05-08 16:29 [igt-dev] [PATCH i-g-t v3] tests/kms_big_fb: Make sure huge fbs work correctly Ville Syrjala
2019-05-08 17:01 ` [igt-dev] ✓ Fi.CI.BAT: success for tests/kms_big_fb: Make sure huge fbs work correctly (rev2) Patchwork
2019-05-08 20:07 ` [igt-dev] ✗ Fi.CI.IGT: failure " Patchwork
@ 2019-05-10 8:53 ` Daniel Vetter
2019-05-10 8:55 ` Daniel Vetter
2019-05-10 12:31 ` Ville Syrjälä
2019-05-10 16:23 ` [igt-dev] [PATCH i-g-t v4] " Ville Syrjala
` (2 subsequent siblings)
5 siblings, 2 replies; 9+ messages in thread
From: Daniel Vetter @ 2019-05-10 8:53 UTC (permalink / raw)
To: Ville Syrjala; +Cc: igt-dev
On Wed, May 08, 2019 at 07:29:06PM +0300, Ville Syrjala wrote:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
>
> Add various tests to excercise huge framebuffers. First some basic
> sanity checks that the kernel accepts/rejects good/bad addfb2 ioctls,
> and finally actual scanout tests to make sure we scan out the correct
> thing when panning around inside large framebuffers.
>
> The implementation is i915 specific for now since I chose to use
> rendercopy/blitter when generating the framebuffer contents. Using
> the normal cairo stuff was just too slow when dealing with 1GiB+
> framebuffers. It shouldn't be too hard to plug in some other mechanisms
> if someone else wants to reuse this test.
>
> v2: Add igt_require(format+mod) for the addfb/overflow tests
> Unset plane fb after TEST_ONLY fail
> Limit max fb to at most 1/2 RAM or GPU address space
> Tweak coords to avoid fails with 64bpp linear with 4k screen
> Make coords even for 90/270 rotated 16bpp
> Store bpp as uint8_t instead of wasting an entire char*
> v3: Add blitter path for gen3 (render engine is not capable of
> handling big fbs).
> Set fence tiling on gen2/3 in raw addfb tests.
> Deal with weak max fence stride on gen3.
> Don't try to use rotation when the prop isn't present.
> Skip 90/270 test for gen4 (no atomic on those yet so we
> can't neatly check what's supported).
> Kernel restricts scanout to mappable portion of ggtt on
> gmch platforms, so check its size as well
> Use the correct fb for the legacy setcrtc
>
> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> ---
> tests/Makefile.sources | 1 +
> tests/kms_big_fb.c | 666 +++++++++++++++++++++++++++++++++++++++++
> tests/meson.build | 1 +
> 3 files changed, 668 insertions(+)
> create mode 100644 tests/kms_big_fb.c
>
> diff --git a/tests/Makefile.sources b/tests/Makefile.sources
> index 7f921f6c5988..2d5c929e32fc 100644
> --- a/tests/Makefile.sources
> +++ b/tests/Makefile.sources
> @@ -27,6 +27,7 @@ TESTS_progs = \
> kms_atomic_interruptible \
> kms_atomic_transition \
> kms_available_modes_crc \
> + kms_big_fb \
> kms_busy \
> kms_ccs \
> kms_color \
> diff --git a/tests/kms_big_fb.c b/tests/kms_big_fb.c
> new file mode 100644
> index 000000000000..5235954e2d8c
> --- /dev/null
> +++ b/tests/kms_big_fb.c
> @@ -0,0 +1,666 @@
> +/*
> + * Copyright © 2019 Intel Corporation
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the "Software"),
> + * to deal in the Software without restriction, including without limitation
> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice (including the next
> + * paragraph) shall be included in all copies or substantial portions of the
> + * Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
> + * IN THE SOFTWARE.
> + */
> +
> +#include "igt.h"
> +#include <errno.h>
> +#include <stdbool.h>
> +#include <stdio.h>
> +#include <string.h>
> +
> +IGT_TEST_DESCRIPTION("Test big framebuffers");
> +
> +typedef struct {
> + int drm_fd;
> + uint32_t devid;
> + igt_display_t display;
> + enum pipe pipe;
> + igt_output_t *output;
> + igt_plane_t *plane;
> + igt_pipe_crc_t *pipe_crc;
> + struct igt_fb small_fb, big_fb;
> + uint32_t format;
> + uint64_t modifier;
> + int width, height;
> + igt_rotation_t rotation;
> + int max_fb_width, max_fb_height;
> + uint64_t ram_size, aper_size, mappable_size;
> + igt_render_copyfunc_t render_copy;
> + drm_intel_bufmgr *bufmgr;
> + struct intel_batchbuffer *batch;
> +} data_t;
> +
> +static void init_buf(data_t *data,
> + struct igt_buf *buf,
> + const struct igt_fb *fb,
> + const char *name)
> +{
> + igt_assert_eq(fb->offsets[0], 0);
> +
> + buf->bo = gem_handle_to_libdrm_bo(data->bufmgr, data->drm_fd,
> + name, fb->gem_handle);
> + buf->tiling = igt_fb_mod_to_tiling(fb->modifier);
> + buf->stride = fb->strides[0];
> + buf->bpp = fb->plane_bpp[0];
> + buf->size = fb->size;
> +}
> +
> +static void fini_buf(struct igt_buf *buf)
> +{
> + drm_intel_bo_unreference(buf->bo);
> +}
> +
> +static void copy_pattern(data_t *data,
> + struct igt_fb *dst_fb, int dx, int dy,
> + struct igt_fb *src_fb, int sx, int sy,
> + int w, int h)
> +{
> + struct igt_buf src = {}, dst = {};
> +
> + init_buf(data, &src, src_fb, "big fb src");
> + init_buf(data, &dst, dst_fb, "big fb dst");
> +
> + gem_set_domain(data->drm_fd, dst_fb->gem_handle,
> + I915_GEM_DOMAIN_GTT, I915_GEM_DOMAIN_GTT);
> + gem_set_domain(data->drm_fd, src_fb->gem_handle,
> + I915_GEM_DOMAIN_GTT, 0);
> +
Maybe a comment here that we rely on the kernel not bumping the fb limits
past what we can render into?
> + if (data->render_copy) {
> + data->render_copy(data->batch, NULL, &src, sx, sy, w, h, &dst, dx, dy);
> + } else {
> + w = min(w, src_fb->width - sx);
> + w = min(w, dst_fb->width - dx);
> +
> + h = min(h, src_fb->height - sy);
> + h = min(h, dst_fb->height - dy);
> +
> + intel_blt_copy(data->batch, src.bo, sx, sy, src.stride,
> + dst.bo, dx, dy, dst.stride, w, h, dst.bpp);
> + }
> +
> + fini_buf(&dst);
> + fini_buf(&src);
> +}
> +
> +static void generate_pattern(data_t *data,
> + struct igt_fb *fb,
> + int w, int h)
> +{
> + struct igt_fb pat_fb;
> +
> + igt_create_pattern_fb(data->drm_fd, w, h,
> + data->format, data->modifier,
> + &pat_fb);
> +
> + for (int y = 0; y < fb->height; y += h) {
> + for (int x = 0; x < fb->width; x += w) {
> + copy_pattern(data, fb, x, y,
> + &pat_fb, 0, 0,
> + pat_fb.width, pat_fb.height);
> + w++;
> + h++;
> + }
> + }
> +
> + igt_remove_fb(data->drm_fd, &pat_fb);
> +}
> +
> +static bool size_ok(data_t *data, uint64_t size)
> +{
> + /*
> + * The kernel limits scanout to the
> + * mappable portion of ggtt on gmch platforms.
> + */
> + if ((intel_gen(data->devid) < 5 ||
> + IS_VALLEYVIEW(data->devid) ||
> + IS_CHERRYVIEW(data->devid)) &&
> + size > data->mappable_size / 2)
> + return false;
> +
> + /*
> + * Limit the big fb size to at most half the RAM or half
> + * the aperture size. Could go a bit higher I suppose since
> + * we shouldn't need more than one big fb at a time.
> + */
> + if (size > data->ram_size / 2 || size > data->aper_size / 2)
> + return false;
> +
> + return true;
> +}
> +
> +
> +static void max_fb_size(data_t *data, int *width, int *height,
> + uint32_t format, uint64_t modifier)
> +{
> + unsigned int stride;
> + uint64_t size;
> + int i = 0;
> +
> + *width = data->max_fb_width;
> + *height = data->max_fb_height;
> +
> + /* max fence stride is only 8k bytes on gen3 */
> + if (intel_gen(data->devid) < 4 &&
> + format == DRM_FORMAT_XRGB8888)
> + *width = min(*width, 8192 / 4);
> +
> + igt_calc_fb_size(data->drm_fd, *width, *height,
> + format, modifier, &size, &stride);
> +
> + while (!size_ok(data, size)) {
> + if (i++ & 1)
> + *width >>= 1;
> + else
> + *height >>= 1;
> +
> + igt_calc_fb_size(data->drm_fd, *width, *height,
> + format, modifier, &size, &stride);
> + }
> +
> + igt_info("Max usable framebuffer size for format "IGT_FORMAT_FMT" / modifier 0x%"PRIx64": %dx%d\n",
> + IGT_FORMAT_ARGS(format), modifier,
> + *width, *height);
> +}
> +
> +static bool test_plane(data_t *data)
> +{
> + igt_plane_t *plane = data->plane;
> + struct igt_fb *small_fb = &data->small_fb;
> + struct igt_fb *big_fb = &data->big_fb;
> + int w = big_fb->width - small_fb->width;
> + int h = big_fb->height - small_fb->height;
> + struct {
> + int x, y;
> + } coords[] = {
> + /* bunch of coordinates pulled out of thin air */
> + { 0, 0, },
> + { w * 4 / 7, h / 5, },
> + { w * 3 / 7, h / 3, },
> + { w / 2, h / 2, },
> + { w / 3, h * 3 / 4, },
> + { w, h, },
> + };
> +
> + if (!igt_plane_has_format_mod(plane, data->format, data->modifier))
> + return false;
> +
> + if (data->rotation != IGT_ROTATION_0 &&
> + !igt_plane_has_prop(plane, IGT_PLANE_ROTATION))
> + return false;
> +
> + /* FIXME need atomic on i965/g4x */
> + if (data->rotation != IGT_ROTATION_0 &&
> + data->rotation != IGT_ROTATION_180 &&
> + !data->display.is_atomic)
> + return false;
> +
> + if (igt_plane_has_prop(plane, IGT_PLANE_ROTATION))
> + igt_plane_set_rotation(plane, data->rotation);
> + igt_plane_set_position(plane, 0, 0);
> +
> + for (int i = 0; i < ARRAY_SIZE(coords); i++) {
> + igt_crc_t small_crc, big_crc;
> + int x = coords[i].x;
> + int y = coords[i].y;
> +
> + /* Hardware limitation */
> + if (data->format == DRM_FORMAT_RGB565 &&
> + (data->rotation == IGT_ROTATION_90 ||
> + data->rotation == IGT_ROTATION_270)) {
> + x &= ~1;
> + y &= ~1;
> + }
> +
> + /*
> + * Make a 1:1 copy of the desired part of the big fb
> + * rather than try to render the same pattern (translated
> + * accordinly) again via cairo. Something in cairo's
> + * rendering pipeline introduces slight differences into
> + * the result if we try that, and so the crc will not match.
> + */
> + copy_pattern(data, small_fb, 0, 0, big_fb, x, y,
> + small_fb->width, small_fb->height);
> +
> + igt_plane_set_fb(plane, small_fb);
> + igt_plane_set_size(plane, data->width, data->height);
> +
> + /*
> + * Try to check that the rotation+format+modifier
> + * combo is supported.
> + */
> + if (i == 0 && data->display.is_atomic &&
> + igt_display_try_commit_atomic(&data->display,
> + DRM_MODE_ATOMIC_TEST_ONLY,
> + NULL) != 0) {
> + if (igt_plane_has_prop(plane, IGT_PLANE_ROTATION))
> + igt_plane_set_rotation(plane, IGT_ROTATION_0);
> + igt_plane_set_fb(plane, NULL);
> + igt_skip("unsupported plane configuration\n");
This is kinda uncool if we have a plane later on that provokes a skip, but
we've already run some tests. It's a gap in igt infrastructure that I need
to fix eventually, but meanwhile you need to count how many skips you
have, and only skip at the very end of your subtest if you skipped all
possible combinations you might want to test.
I think a return false here and changing the higher level logic to
igt_skip if you didn't break out of the loop should do the trick.
> + }
> +
> + igt_display_commit2(&data->display, data->display.is_atomic ?
> + COMMIT_ATOMIC : COMMIT_UNIVERSAL);
> +
> +
> + igt_pipe_crc_collect_crc(data->pipe_crc, &small_crc);
> +
> + igt_plane_set_fb(plane, big_fb);
> + igt_fb_set_position(big_fb, plane, x, y);
> + igt_fb_set_size(big_fb, plane, small_fb->width, small_fb->height);
> + igt_plane_set_size(plane, data->width, data->height);
> + igt_display_commit2(&data->display, data->display.is_atomic ?
> + COMMIT_ATOMIC : COMMIT_UNIVERSAL);
> +
> + igt_pipe_crc_collect_crc(data->pipe_crc, &big_crc);
> +
> + igt_plane_set_fb(plane, NULL);
> +
> + igt_assert_crc_equal(&big_crc, &small_crc);
> +
> + }
> +
> + return true;
> +}
> +
> +static bool test_pipe(data_t *data)
> +{
> + drmModeModeInfo *mode;
> + igt_plane_t *primary;
> + int width, height;
> + bool ret = false;
> +
> + mode = igt_output_get_mode(data->output);
> +
> + data->width = mode->hdisplay;
> + data->height = mode->vdisplay;
> +
> + width = mode->hdisplay;
> + height = mode->vdisplay;
> + if (data->rotation == IGT_ROTATION_90 ||
> + data->rotation == IGT_ROTATION_270)
> + igt_swap(width, height);
> +
> + igt_create_color_fb(data->drm_fd, width, height,
> + data->format, data->modifier,
> + 0, 1, 0, &data->small_fb);
> +
> + igt_output_set_pipe(data->output, data->pipe);
> +
> + primary = igt_output_get_plane_type(data->output, DRM_PLANE_TYPE_PRIMARY);
> + igt_plane_set_fb(primary, NULL);
> +
> + if (!data->display.is_atomic) {
> + struct igt_fb fb;
> +
> + igt_create_fb(data->drm_fd, mode->hdisplay, mode->vdisplay,
> + DRM_FORMAT_XRGB8888, DRM_FORMAT_MOD_LINEAR,
> + &fb);
> +
> + /* legacy setcrtc needs an fb */
> + igt_plane_set_fb(primary, &fb);
> + igt_display_commit2(&data->display, COMMIT_LEGACY);
> +
> + igt_plane_set_fb(primary, NULL);
> + igt_display_commit2(&data->display, COMMIT_UNIVERSAL);
> +
> + igt_remove_fb(data->drm_fd, &fb);
> + }
> +
> + igt_display_commit2(&data->display, data->display.is_atomic ?
> + COMMIT_ATOMIC : COMMIT_UNIVERSAL);
> +
> + data->pipe_crc = igt_pipe_crc_new(data->drm_fd, data->pipe,
> + INTEL_PIPE_CRC_SOURCE_AUTO);
> +
> + for_each_plane_on_pipe(&data->display, data->pipe, data->plane) {
> + ret = test_plane(data);
> + if (ret)
> + break;
> + }
> +
> + igt_pipe_crc_free(data->pipe_crc);
> +
> + igt_output_set_pipe(data->output, PIPE_ANY);
> + igt_display_commit2(&data->display, data->display.is_atomic ?
> + COMMIT_ATOMIC : COMMIT_UNIVERSAL);
> +
> + igt_remove_fb(data->drm_fd, &data->small_fb);
> +
> + return ret;
> +}
> +
> +static void test_scanout(data_t *data)
> +{
> + for_each_pipe_with_valid_output(&data->display, data->pipe, data->output) {
> + if (test_pipe(data))
> + return;
> + }
> +
> + igt_skip("no valid crtc/connector combinations found\n");
> +}
> +
> +static void prep_fb(data_t *data)
> +{
> + int width, height;
> +
> + if (data->big_fb.fb_id)
> + return;
> +
> + max_fb_size(data, &width, &height,
> + data->format, data->modifier);
> +
> + igt_create_fb(data->drm_fd, width, height,
> + data->format, data->modifier,
> + &data->big_fb);
> +
> + generate_pattern(data, &data->big_fb, 640, 480);
> +}
> +
> +static void cleanup_fb(data_t *data)
> +{
> + igt_remove_fb(data->drm_fd, &data->big_fb);
> + data->big_fb.fb_id = 0;
> +}
> +
> +static void
> +test_size_overflow(data_t *data)
> +{
> + uint32_t fb_id;
> + uint32_t bo;
> + uint32_t offsets[4] = {};
> + uint32_t strides[4] = { 256*1024, };
> + int ret;
> +
> + igt_require(igt_display_has_format_mod(&data->display,
> + DRM_FORMAT_XRGB8888,
> + data->modifier));
> +
> + /*
> + * Try to hit a specific integer overflow in i915 fb size
> + * calculations. 256k * 16k == 1<<32 which is checked
> + * against the bo size. The check should fail on account
> + * of the bo being smaller, but due to the overflow the
> + * computed fb size is 0 and thus the check never trips.
> + */
> + igt_require(data->max_fb_width >= 16383 &&
> + data->max_fb_height >= 16383);
> +
> + bo = gem_create(data->drm_fd, (1ULL << 32) - 4096);
> + igt_require(bo);
> +
> + ret = __kms_addfb(data->drm_fd, bo,
> + 16383, 16383,
> + DRM_FORMAT_XRGB8888,
> + data->modifier,
> + strides, offsets, 1,
> + DRM_MODE_FB_MODIFIERS, &fb_id);
> +
> + igt_assert_neq(ret, 0);
> +
> + gem_close(data->drm_fd, bo);
> +}
> +
> +static void
> +test_size_offset_overflow(data_t *data)
> +{
> + uint32_t fb_id;
> + uint32_t bo;
> + uint32_t offsets[4] = {};
> + uint32_t strides[4] = { 8192, };
> + int ret;
> +
> + igt_require(igt_display_has_format_mod(&data->display,
> + DRM_FORMAT_NV12,
> + data->modifier));
> +
> + /*
> + * Try to a specific integer overflow in i915 fb size
> + * calculations. This time it's offsets[1] + the tile
> + * aligned chroma plane size that overflows and
> + * incorrectly passes the bo size check.
> + */
> + igt_require(igt_display_has_format_mod(&data->display,
> + DRM_FORMAT_NV12,
> + data->modifier));
> +
> + bo = gem_create(data->drm_fd, (1ULL << 32) - 4096);
> + igt_require(bo);
> +
> + offsets[0] = 0;
> + offsets[1] = (1ULL << 32) - 8192 * 4096;
> +
> + ret = __kms_addfb(data->drm_fd, bo,
> + 8192, 8188,
> + DRM_FORMAT_NV12,
> + data->modifier,
> + strides, offsets, 1,
> + DRM_MODE_FB_MODIFIERS, &fb_id);
> + igt_assert_neq(ret, 0);
> +
> + gem_close(data->drm_fd, bo);
> +}
> +
> +static int rmfb(int fd, uint32_t id)
> +{
> + int err;
> +
> + err = 0;
> + if (igt_ioctl(fd, DRM_IOCTL_MODE_RMFB, &id))
> + err = -errno;
> +
> + errno = 0;
> + return err;
> +}
> +
> +static void
> +test_addfb(data_t *data)
> +{
> + uint64_t size;
> + uint32_t fb_id;
> + uint32_t bo;
> + uint32_t offsets[4] = {};
> + uint32_t strides[4] = {};
> + uint32_t format;
> + int ret;
> +
> + /*
> + * gen3 max tiled stride is 8k bytes, but
> + * max fb size of 4k pixels, hence we can't test
> + * with 32bpp and must use 16bpp instead.
> + */
> + if (intel_gen(data->devid) == 3)
> + format = DRM_FORMAT_RGB565;
> + else
> + format = DRM_FORMAT_XRGB8888;
> +
> + igt_require(igt_display_has_format_mod(&data->display,
> + format, data->modifier));
> +
> + igt_calc_fb_size(data->drm_fd,
> + data->max_fb_width,
> + data->max_fb_height,
> + format, data->modifier,
> + &size, &strides[0]);
> +
> + bo = gem_create(data->drm_fd, size);
> + igt_require(bo);
> +
> + if (intel_gen(data->devid) < 4)
> + gem_set_tiling(data->drm_fd, bo,
> + igt_fb_mod_to_tiling(data->modifier), strides[0]);
> +
> + ret = __kms_addfb(data->drm_fd, bo,
> + data->max_fb_width,
> + data->max_fb_height,
> + format, data->modifier,
> + strides, offsets, 1,
> + DRM_MODE_FB_MODIFIERS, &fb_id);
> + igt_assert_eq(ret, 0);
> +
> + rmfb(data->drm_fd, fb_id);
> + gem_close(data->drm_fd, bo);
> +}
> +
> +static data_t data;
> +
> +static const struct {
> + uint64_t modifier;
> + const char *name;
> +} modifiers[] = {
> + { DRM_FORMAT_MOD_LINEAR, "linear", },
> + { I915_FORMAT_MOD_X_TILED, "x-tiled", },
> + { I915_FORMAT_MOD_Y_TILED, "y-tiled", },
> + { I915_FORMAT_MOD_Yf_TILED, "yf-tiled", },
> +};
> +
> +static const struct {
> + uint32_t format;
> + uint8_t bpp;
> +} formats[] = {
> + /* FIXME igt_fb doesn't support C8 currently */
> + { DRM_FORMAT_C8, 8, },
> + { DRM_FORMAT_RGB565, 16, },
> + { DRM_FORMAT_XRGB8888, 32, },
> + { DRM_FORMAT_XBGR16161616F, 64, },
> +};
> +
> +static const struct {
> + igt_rotation_t rotation;
> + uint16_t angle;
> +} rotations[] = {
> + { IGT_ROTATION_0, 0, },
> + { IGT_ROTATION_90, 90, },
> + { IGT_ROTATION_180, 180, },
> + { IGT_ROTATION_270, 270, },
> +};
> +
> +igt_main
> +{
> + igt_fixture {
> + drmModeResPtr res;
> +
> + igt_skip_on_simulation();
> +
> + data.drm_fd = drm_open_driver_master(DRIVER_INTEL);
> +
> + igt_require(is_i915_device(data.drm_fd));
> +
> + data.devid = intel_get_drm_devid(data.drm_fd);
> +
> + kmstest_set_vt_graphics_mode();
> +
> + igt_require_pipe_crc(data.drm_fd);
> + igt_display_require(&data.display, data.drm_fd);
> +
> + res = drmModeGetResources(data.drm_fd);
> + igt_assert(res);
> +
> + data.max_fb_width = res->max_width;
> + data.max_fb_height = res->max_height;
> +
> + drmModeFreeResources(res);
> +
> + igt_info("Max driver framebuffer size %dx%d\n",
> + data.max_fb_width, data.max_fb_height);
> +
> + data.ram_size = intel_get_total_ram_mb() << 20;
> + data.aper_size = gem_aperture_size(data.drm_fd);
> + data.mappable_size = gem_mappable_aperture_size();
> +
> + igt_info("RAM: %"PRIu64" MiB, GPU address space: %"PRId64" MiB, GGTT mappable size: %"PRId64" MiB\n",
> + data.ram_size >> 20, data.aper_size >> 20,
> + data.mappable_size >> 20);
> +
> + /*
> + * Gen3 render engine is limited to 2kx2k, whereas
> + * the display engine can do 4kx4k. Use the blitter
> + * on gen3 to avoid exceeding the render engine limits.
> + * On gen2 we could use either, but let's go for the
> + * blitter there as well.
> + */
> + if (intel_gen(data.devid) >= 4)
> + data.render_copy = igt_get_render_copyfunc(data.devid);
> +
> + data.bufmgr = drm_intel_bufmgr_gem_init(data.drm_fd, 4096);
> + data.batch = intel_batchbuffer_alloc(data.bufmgr, data.devid);
> + }
> +
> + /*
> + * Skip linear as it doesn't hit the overflow we want
> + * on account of the tile height being effectively one,
> + * and thus the kenrnel rounding up to the next tile
> + * height won't do anything.
> + */
> + for (int i = 1; i < ARRAY_SIZE(modifiers); i++) {
> + igt_subtest_f("%s-addfb-size-overflow",
> + modifiers[i].name) {
> + data.modifier = modifiers[i].modifier;
> + test_size_overflow(&data);
> + }
> + }
> +
> + for (int i = 1; i < ARRAY_SIZE(modifiers); i++) {
> + igt_subtest_f("%s-addfb-size-offset-overflow",
> + modifiers[i].name) {
> + data.modifier = modifiers[i].modifier;
> + test_size_offset_overflow(&data);
> + }
> + }
> +
> + for (int i = 0; i < ARRAY_SIZE(modifiers); i++) {
> + igt_subtest_f("%s-addfb", modifiers[i].name) {
> + data.modifier = modifiers[i].modifier;
> +
> + test_addfb(&data);
> + }
> + }
> +
> + for (int i = 0; i < ARRAY_SIZE(modifiers); i++) {
> + data.modifier = modifiers[i].modifier;
> +
> + for (int j = 0; j < ARRAY_SIZE(formats); j++) {
> + data.format = formats[j].format;
> +
> + for (int k = 0; k < ARRAY_SIZE(rotations); k++) {
> + data.rotation = rotations[k].rotation;
> +
> + igt_subtest_f("%s-%dbpp-rotate-%d", modifiers[i].name,
> + formats[j].bpp, rotations[k].angle) {
> + igt_require(igt_fb_supported_format(data.format));
> + igt_require(igt_display_has_format_mod(&data.display, data.format, data.modifier));
> + prep_fb(&data);
> + test_scanout(&data);
> + }
> + }
> +
> + igt_fixture
> + cleanup_fb(&data);
> + }
> + }
> +
> + igt_fixture {
> + igt_display_fini(&data.display);
> +
> + intel_batchbuffer_free(data.batch);
> + drm_intel_bufmgr_destroy(data.bufmgr);
> + }
> +}
lgtm
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
> diff --git a/tests/meson.build b/tests/meson.build
> index 711979b4a1c2..ad8444875302 100644
> --- a/tests/meson.build
> +++ b/tests/meson.build
> @@ -14,6 +14,7 @@ test_progs = [
> 'kms_atomic_interruptible',
> 'kms_atomic_transition',
> 'kms_available_modes_crc',
> + 'kms_big_fb',
> 'kms_busy',
> 'kms_ccs',
> 'kms_color',
> --
> 2.21.0
>
> _______________________________________________
> igt-dev mailing list
> igt-dev@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/igt-dev
--
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [igt-dev] [PATCH i-g-t v3] tests/kms_big_fb: Make sure huge fbs work correctly
2019-05-10 8:53 ` [igt-dev] [PATCH i-g-t v3] tests/kms_big_fb: Make sure huge fbs work correctly Daniel Vetter
@ 2019-05-10 8:55 ` Daniel Vetter
2019-05-10 12:31 ` Ville Syrjälä
1 sibling, 0 replies; 9+ messages in thread
From: Daniel Vetter @ 2019-05-10 8:55 UTC (permalink / raw)
To: Ville Syrjala; +Cc: igt-dev
On Fri, May 10, 2019 at 10:53:51AM +0200, Daniel Vetter wrote:
> On Wed, May 08, 2019 at 07:29:06PM +0300, Ville Syrjala wrote:
> > From: Ville Syrjälä <ville.syrjala@linux.intel.com>
> >
> > Add various tests to excercise huge framebuffers. First some basic
> > sanity checks that the kernel accepts/rejects good/bad addfb2 ioctls,
> > and finally actual scanout tests to make sure we scan out the correct
> > thing when panning around inside large framebuffers.
> >
> > The implementation is i915 specific for now since I chose to use
> > rendercopy/blitter when generating the framebuffer contents. Using
> > the normal cairo stuff was just too slow when dealing with 1GiB+
> > framebuffers. It shouldn't be too hard to plug in some other mechanisms
> > if someone else wants to reuse this test.
> >
> > v2: Add igt_require(format+mod) for the addfb/overflow tests
> > Unset plane fb after TEST_ONLY fail
> > Limit max fb to at most 1/2 RAM or GPU address space
> > Tweak coords to avoid fails with 64bpp linear with 4k screen
> > Make coords even for 90/270 rotated 16bpp
> > Store bpp as uint8_t instead of wasting an entire char*
> > v3: Add blitter path for gen3 (render engine is not capable of
> > handling big fbs).
> > Set fence tiling on gen2/3 in raw addfb tests.
> > Deal with weak max fence stride on gen3.
> > Don't try to use rotation when the prop isn't present.
> > Skip 90/270 test for gen4 (no atomic on those yet so we
> > can't neatly check what's supported).
> > Kernel restricts scanout to mappable portion of ggtt on
> > gmch platforms, so check its size as well
> > Use the correct fb for the legacy setcrtc
> >
> > Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> > ---
> > tests/Makefile.sources | 1 +
> > tests/kms_big_fb.c | 666 +++++++++++++++++++++++++++++++++++++++++
> > tests/meson.build | 1 +
> > 3 files changed, 668 insertions(+)
> > create mode 100644 tests/kms_big_fb.c
> >
> > diff --git a/tests/Makefile.sources b/tests/Makefile.sources
> > index 7f921f6c5988..2d5c929e32fc 100644
> > --- a/tests/Makefile.sources
> > +++ b/tests/Makefile.sources
> > @@ -27,6 +27,7 @@ TESTS_progs = \
> > kms_atomic_interruptible \
> > kms_atomic_transition \
> > kms_available_modes_crc \
> > + kms_big_fb \
> > kms_busy \
> > kms_ccs \
> > kms_color \
> > diff --git a/tests/kms_big_fb.c b/tests/kms_big_fb.c
> > new file mode 100644
> > index 000000000000..5235954e2d8c
> > --- /dev/null
> > +++ b/tests/kms_big_fb.c
> > @@ -0,0 +1,666 @@
> > +/*
> > + * Copyright © 2019 Intel Corporation
> > + *
> > + * Permission is hereby granted, free of charge, to any person obtaining a
> > + * copy of this software and associated documentation files (the "Software"),
> > + * to deal in the Software without restriction, including without limitation
> > + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> > + * and/or sell copies of the Software, and to permit persons to whom the
> > + * Software is furnished to do so, subject to the following conditions:
> > + *
> > + * The above copyright notice and this permission notice (including the next
> > + * paragraph) shall be included in all copies or substantial portions of the
> > + * Software.
> > + *
> > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> > + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
> > + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> > + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
> > + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
> > + * IN THE SOFTWARE.
> > + */
> > +
> > +#include "igt.h"
> > +#include <errno.h>
> > +#include <stdbool.h>
> > +#include <stdio.h>
> > +#include <string.h>
> > +
> > +IGT_TEST_DESCRIPTION("Test big framebuffers");
> > +
> > +typedef struct {
> > + int drm_fd;
> > + uint32_t devid;
> > + igt_display_t display;
> > + enum pipe pipe;
> > + igt_output_t *output;
> > + igt_plane_t *plane;
> > + igt_pipe_crc_t *pipe_crc;
> > + struct igt_fb small_fb, big_fb;
> > + uint32_t format;
> > + uint64_t modifier;
> > + int width, height;
> > + igt_rotation_t rotation;
> > + int max_fb_width, max_fb_height;
> > + uint64_t ram_size, aper_size, mappable_size;
> > + igt_render_copyfunc_t render_copy;
> > + drm_intel_bufmgr *bufmgr;
> > + struct intel_batchbuffer *batch;
> > +} data_t;
> > +
> > +static void init_buf(data_t *data,
> > + struct igt_buf *buf,
> > + const struct igt_fb *fb,
> > + const char *name)
> > +{
> > + igt_assert_eq(fb->offsets[0], 0);
> > +
> > + buf->bo = gem_handle_to_libdrm_bo(data->bufmgr, data->drm_fd,
> > + name, fb->gem_handle);
> > + buf->tiling = igt_fb_mod_to_tiling(fb->modifier);
> > + buf->stride = fb->strides[0];
> > + buf->bpp = fb->plane_bpp[0];
> > + buf->size = fb->size;
> > +}
> > +
> > +static void fini_buf(struct igt_buf *buf)
> > +{
> > + drm_intel_bo_unreference(buf->bo);
> > +}
> > +
> > +static void copy_pattern(data_t *data,
> > + struct igt_fb *dst_fb, int dx, int dy,
> > + struct igt_fb *src_fb, int sx, int sy,
> > + int w, int h)
> > +{
> > + struct igt_buf src = {}, dst = {};
> > +
> > + init_buf(data, &src, src_fb, "big fb src");
> > + init_buf(data, &dst, dst_fb, "big fb dst");
> > +
> > + gem_set_domain(data->drm_fd, dst_fb->gem_handle,
> > + I915_GEM_DOMAIN_GTT, I915_GEM_DOMAIN_GTT);
> > + gem_set_domain(data->drm_fd, src_fb->gem_handle,
> > + I915_GEM_DOMAIN_GTT, 0);
> > +
>
> Maybe a comment here that we rely on the kernel not bumping the fb limits
> past what we can render into?
>
> > + if (data->render_copy) {
> > + data->render_copy(data->batch, NULL, &src, sx, sy, w, h, &dst, dx, dy);
> > + } else {
> > + w = min(w, src_fb->width - sx);
> > + w = min(w, dst_fb->width - dx);
> > +
> > + h = min(h, src_fb->height - sy);
> > + h = min(h, dst_fb->height - dy);
> > +
> > + intel_blt_copy(data->batch, src.bo, sx, sy, src.stride,
> > + dst.bo, dx, dy, dst.stride, w, h, dst.bpp);
> > + }
> > +
> > + fini_buf(&dst);
> > + fini_buf(&src);
> > +}
> > +
> > +static void generate_pattern(data_t *data,
> > + struct igt_fb *fb,
> > + int w, int h)
> > +{
> > + struct igt_fb pat_fb;
> > +
> > + igt_create_pattern_fb(data->drm_fd, w, h,
> > + data->format, data->modifier,
> > + &pat_fb);
> > +
> > + for (int y = 0; y < fb->height; y += h) {
> > + for (int x = 0; x < fb->width; x += w) {
> > + copy_pattern(data, fb, x, y,
> > + &pat_fb, 0, 0,
> > + pat_fb.width, pat_fb.height);
> > + w++;
> > + h++;
> > + }
> > + }
> > +
> > + igt_remove_fb(data->drm_fd, &pat_fb);
> > +}
> > +
> > +static bool size_ok(data_t *data, uint64_t size)
> > +{
> > + /*
> > + * The kernel limits scanout to the
> > + * mappable portion of ggtt on gmch platforms.
> > + */
> > + if ((intel_gen(data->devid) < 5 ||
> > + IS_VALLEYVIEW(data->devid) ||
> > + IS_CHERRYVIEW(data->devid)) &&
> > + size > data->mappable_size / 2)
> > + return false;
> > +
> > + /*
> > + * Limit the big fb size to at most half the RAM or half
> > + * the aperture size. Could go a bit higher I suppose since
> > + * we shouldn't need more than one big fb at a time.
> > + */
> > + if (size > data->ram_size / 2 || size > data->aper_size / 2)
> > + return false;
> > +
> > + return true;
> > +}
> > +
> > +
> > +static void max_fb_size(data_t *data, int *width, int *height,
> > + uint32_t format, uint64_t modifier)
> > +{
> > + unsigned int stride;
> > + uint64_t size;
> > + int i = 0;
> > +
> > + *width = data->max_fb_width;
> > + *height = data->max_fb_height;
> > +
> > + /* max fence stride is only 8k bytes on gen3 */
> > + if (intel_gen(data->devid) < 4 &&
> > + format == DRM_FORMAT_XRGB8888)
> > + *width = min(*width, 8192 / 4);
> > +
> > + igt_calc_fb_size(data->drm_fd, *width, *height,
> > + format, modifier, &size, &stride);
> > +
> > + while (!size_ok(data, size)) {
> > + if (i++ & 1)
> > + *width >>= 1;
> > + else
> > + *height >>= 1;
> > +
> > + igt_calc_fb_size(data->drm_fd, *width, *height,
> > + format, modifier, &size, &stride);
> > + }
> > +
> > + igt_info("Max usable framebuffer size for format "IGT_FORMAT_FMT" / modifier 0x%"PRIx64": %dx%d\n",
> > + IGT_FORMAT_ARGS(format), modifier,
> > + *width, *height);
> > +}
> > +
> > +static bool test_plane(data_t *data)
> > +{
> > + igt_plane_t *plane = data->plane;
> > + struct igt_fb *small_fb = &data->small_fb;
> > + struct igt_fb *big_fb = &data->big_fb;
> > + int w = big_fb->width - small_fb->width;
> > + int h = big_fb->height - small_fb->height;
> > + struct {
> > + int x, y;
> > + } coords[] = {
> > + /* bunch of coordinates pulled out of thin air */
> > + { 0, 0, },
> > + { w * 4 / 7, h / 5, },
> > + { w * 3 / 7, h / 3, },
> > + { w / 2, h / 2, },
> > + { w / 3, h * 3 / 4, },
> > + { w, h, },
Aside: Not sure this is the smartest offset selection, but it has some
funny numbers and I hope our variation across different screen's sizes in
CI is good enough to hit all the corners we care about. Trying to be
smarter here probably no good really.
-Daniel
> > + };
> > +
> > + if (!igt_plane_has_format_mod(plane, data->format, data->modifier))
> > + return false;
> > +
> > + if (data->rotation != IGT_ROTATION_0 &&
> > + !igt_plane_has_prop(plane, IGT_PLANE_ROTATION))
> > + return false;
> > +
> > + /* FIXME need atomic on i965/g4x */
> > + if (data->rotation != IGT_ROTATION_0 &&
> > + data->rotation != IGT_ROTATION_180 &&
> > + !data->display.is_atomic)
> > + return false;
> > +
> > + if (igt_plane_has_prop(plane, IGT_PLANE_ROTATION))
> > + igt_plane_set_rotation(plane, data->rotation);
> > + igt_plane_set_position(plane, 0, 0);
> > +
> > + for (int i = 0; i < ARRAY_SIZE(coords); i++) {
> > + igt_crc_t small_crc, big_crc;
> > + int x = coords[i].x;
> > + int y = coords[i].y;
> > +
> > + /* Hardware limitation */
> > + if (data->format == DRM_FORMAT_RGB565 &&
> > + (data->rotation == IGT_ROTATION_90 ||
> > + data->rotation == IGT_ROTATION_270)) {
> > + x &= ~1;
> > + y &= ~1;
> > + }
> > +
> > + /*
> > + * Make a 1:1 copy of the desired part of the big fb
> > + * rather than try to render the same pattern (translated
> > + * accordinly) again via cairo. Something in cairo's
> > + * rendering pipeline introduces slight differences into
> > + * the result if we try that, and so the crc will not match.
> > + */
> > + copy_pattern(data, small_fb, 0, 0, big_fb, x, y,
> > + small_fb->width, small_fb->height);
> > +
> > + igt_plane_set_fb(plane, small_fb);
> > + igt_plane_set_size(plane, data->width, data->height);
> > +
> > + /*
> > + * Try to check that the rotation+format+modifier
> > + * combo is supported.
> > + */
> > + if (i == 0 && data->display.is_atomic &&
> > + igt_display_try_commit_atomic(&data->display,
> > + DRM_MODE_ATOMIC_TEST_ONLY,
> > + NULL) != 0) {
> > + if (igt_plane_has_prop(plane, IGT_PLANE_ROTATION))
> > + igt_plane_set_rotation(plane, IGT_ROTATION_0);
> > + igt_plane_set_fb(plane, NULL);
> > + igt_skip("unsupported plane configuration\n");
>
> This is kinda uncool if we have a plane later on that provokes a skip, but
> we've already run some tests. It's a gap in igt infrastructure that I need
> to fix eventually, but meanwhile you need to count how many skips you
> have, and only skip at the very end of your subtest if you skipped all
> possible combinations you might want to test.
>
> I think a return false here and changing the higher level logic to
> igt_skip if you didn't break out of the loop should do the trick.
>
> > + }
> > +
> > + igt_display_commit2(&data->display, data->display.is_atomic ?
> > + COMMIT_ATOMIC : COMMIT_UNIVERSAL);
> > +
> > +
> > + igt_pipe_crc_collect_crc(data->pipe_crc, &small_crc);
> > +
> > + igt_plane_set_fb(plane, big_fb);
> > + igt_fb_set_position(big_fb, plane, x, y);
> > + igt_fb_set_size(big_fb, plane, small_fb->width, small_fb->height);
> > + igt_plane_set_size(plane, data->width, data->height);
> > + igt_display_commit2(&data->display, data->display.is_atomic ?
> > + COMMIT_ATOMIC : COMMIT_UNIVERSAL);
> > +
> > + igt_pipe_crc_collect_crc(data->pipe_crc, &big_crc);
> > +
> > + igt_plane_set_fb(plane, NULL);
> > +
> > + igt_assert_crc_equal(&big_crc, &small_crc);
> > +
> > + }
> > +
> > + return true;
> > +}
> > +
> > +static bool test_pipe(data_t *data)
> > +{
> > + drmModeModeInfo *mode;
> > + igt_plane_t *primary;
> > + int width, height;
> > + bool ret = false;
> > +
> > + mode = igt_output_get_mode(data->output);
> > +
> > + data->width = mode->hdisplay;
> > + data->height = mode->vdisplay;
> > +
> > + width = mode->hdisplay;
> > + height = mode->vdisplay;
> > + if (data->rotation == IGT_ROTATION_90 ||
> > + data->rotation == IGT_ROTATION_270)
> > + igt_swap(width, height);
> > +
> > + igt_create_color_fb(data->drm_fd, width, height,
> > + data->format, data->modifier,
> > + 0, 1, 0, &data->small_fb);
> > +
> > + igt_output_set_pipe(data->output, data->pipe);
> > +
> > + primary = igt_output_get_plane_type(data->output, DRM_PLANE_TYPE_PRIMARY);
> > + igt_plane_set_fb(primary, NULL);
> > +
> > + if (!data->display.is_atomic) {
> > + struct igt_fb fb;
> > +
> > + igt_create_fb(data->drm_fd, mode->hdisplay, mode->vdisplay,
> > + DRM_FORMAT_XRGB8888, DRM_FORMAT_MOD_LINEAR,
> > + &fb);
> > +
> > + /* legacy setcrtc needs an fb */
> > + igt_plane_set_fb(primary, &fb);
> > + igt_display_commit2(&data->display, COMMIT_LEGACY);
> > +
> > + igt_plane_set_fb(primary, NULL);
> > + igt_display_commit2(&data->display, COMMIT_UNIVERSAL);
> > +
> > + igt_remove_fb(data->drm_fd, &fb);
> > + }
> > +
> > + igt_display_commit2(&data->display, data->display.is_atomic ?
> > + COMMIT_ATOMIC : COMMIT_UNIVERSAL);
> > +
> > + data->pipe_crc = igt_pipe_crc_new(data->drm_fd, data->pipe,
> > + INTEL_PIPE_CRC_SOURCE_AUTO);
> > +
> > + for_each_plane_on_pipe(&data->display, data->pipe, data->plane) {
> > + ret = test_plane(data);
> > + if (ret)
> > + break;
> > + }
> > +
> > + igt_pipe_crc_free(data->pipe_crc);
> > +
> > + igt_output_set_pipe(data->output, PIPE_ANY);
> > + igt_display_commit2(&data->display, data->display.is_atomic ?
> > + COMMIT_ATOMIC : COMMIT_UNIVERSAL);
> > +
> > + igt_remove_fb(data->drm_fd, &data->small_fb);
> > +
> > + return ret;
> > +}
> > +
> > +static void test_scanout(data_t *data)
> > +{
> > + for_each_pipe_with_valid_output(&data->display, data->pipe, data->output) {
> > + if (test_pipe(data))
> > + return;
> > + }
> > +
> > + igt_skip("no valid crtc/connector combinations found\n");
> > +}
> > +
> > +static void prep_fb(data_t *data)
> > +{
> > + int width, height;
> > +
> > + if (data->big_fb.fb_id)
> > + return;
> > +
> > + max_fb_size(data, &width, &height,
> > + data->format, data->modifier);
> > +
> > + igt_create_fb(data->drm_fd, width, height,
> > + data->format, data->modifier,
> > + &data->big_fb);
> > +
> > + generate_pattern(data, &data->big_fb, 640, 480);
> > +}
> > +
> > +static void cleanup_fb(data_t *data)
> > +{
> > + igt_remove_fb(data->drm_fd, &data->big_fb);
> > + data->big_fb.fb_id = 0;
> > +}
> > +
> > +static void
> > +test_size_overflow(data_t *data)
> > +{
> > + uint32_t fb_id;
> > + uint32_t bo;
> > + uint32_t offsets[4] = {};
> > + uint32_t strides[4] = { 256*1024, };
> > + int ret;
> > +
> > + igt_require(igt_display_has_format_mod(&data->display,
> > + DRM_FORMAT_XRGB8888,
> > + data->modifier));
> > +
> > + /*
> > + * Try to hit a specific integer overflow in i915 fb size
> > + * calculations. 256k * 16k == 1<<32 which is checked
> > + * against the bo size. The check should fail on account
> > + * of the bo being smaller, but due to the overflow the
> > + * computed fb size is 0 and thus the check never trips.
> > + */
> > + igt_require(data->max_fb_width >= 16383 &&
> > + data->max_fb_height >= 16383);
> > +
> > + bo = gem_create(data->drm_fd, (1ULL << 32) - 4096);
> > + igt_require(bo);
> > +
> > + ret = __kms_addfb(data->drm_fd, bo,
> > + 16383, 16383,
> > + DRM_FORMAT_XRGB8888,
> > + data->modifier,
> > + strides, offsets, 1,
> > + DRM_MODE_FB_MODIFIERS, &fb_id);
> > +
> > + igt_assert_neq(ret, 0);
> > +
> > + gem_close(data->drm_fd, bo);
> > +}
> > +
> > +static void
> > +test_size_offset_overflow(data_t *data)
> > +{
> > + uint32_t fb_id;
> > + uint32_t bo;
> > + uint32_t offsets[4] = {};
> > + uint32_t strides[4] = { 8192, };
> > + int ret;
> > +
> > + igt_require(igt_display_has_format_mod(&data->display,
> > + DRM_FORMAT_NV12,
> > + data->modifier));
> > +
> > + /*
> > + * Try to a specific integer overflow in i915 fb size
> > + * calculations. This time it's offsets[1] + the tile
> > + * aligned chroma plane size that overflows and
> > + * incorrectly passes the bo size check.
> > + */
> > + igt_require(igt_display_has_format_mod(&data->display,
> > + DRM_FORMAT_NV12,
> > + data->modifier));
> > +
> > + bo = gem_create(data->drm_fd, (1ULL << 32) - 4096);
> > + igt_require(bo);
> > +
> > + offsets[0] = 0;
> > + offsets[1] = (1ULL << 32) - 8192 * 4096;
> > +
> > + ret = __kms_addfb(data->drm_fd, bo,
> > + 8192, 8188,
> > + DRM_FORMAT_NV12,
> > + data->modifier,
> > + strides, offsets, 1,
> > + DRM_MODE_FB_MODIFIERS, &fb_id);
> > + igt_assert_neq(ret, 0);
> > +
> > + gem_close(data->drm_fd, bo);
> > +}
> > +
> > +static int rmfb(int fd, uint32_t id)
> > +{
> > + int err;
> > +
> > + err = 0;
> > + if (igt_ioctl(fd, DRM_IOCTL_MODE_RMFB, &id))
> > + err = -errno;
> > +
> > + errno = 0;
> > + return err;
> > +}
> > +
> > +static void
> > +test_addfb(data_t *data)
> > +{
> > + uint64_t size;
> > + uint32_t fb_id;
> > + uint32_t bo;
> > + uint32_t offsets[4] = {};
> > + uint32_t strides[4] = {};
> > + uint32_t format;
> > + int ret;
> > +
> > + /*
> > + * gen3 max tiled stride is 8k bytes, but
> > + * max fb size of 4k pixels, hence we can't test
> > + * with 32bpp and must use 16bpp instead.
> > + */
> > + if (intel_gen(data->devid) == 3)
> > + format = DRM_FORMAT_RGB565;
> > + else
> > + format = DRM_FORMAT_XRGB8888;
> > +
> > + igt_require(igt_display_has_format_mod(&data->display,
> > + format, data->modifier));
> > +
> > + igt_calc_fb_size(data->drm_fd,
> > + data->max_fb_width,
> > + data->max_fb_height,
> > + format, data->modifier,
> > + &size, &strides[0]);
> > +
> > + bo = gem_create(data->drm_fd, size);
> > + igt_require(bo);
> > +
> > + if (intel_gen(data->devid) < 4)
> > + gem_set_tiling(data->drm_fd, bo,
> > + igt_fb_mod_to_tiling(data->modifier), strides[0]);
> > +
> > + ret = __kms_addfb(data->drm_fd, bo,
> > + data->max_fb_width,
> > + data->max_fb_height,
> > + format, data->modifier,
> > + strides, offsets, 1,
> > + DRM_MODE_FB_MODIFIERS, &fb_id);
> > + igt_assert_eq(ret, 0);
> > +
> > + rmfb(data->drm_fd, fb_id);
> > + gem_close(data->drm_fd, bo);
> > +}
> > +
> > +static data_t data;
> > +
> > +static const struct {
> > + uint64_t modifier;
> > + const char *name;
> > +} modifiers[] = {
> > + { DRM_FORMAT_MOD_LINEAR, "linear", },
> > + { I915_FORMAT_MOD_X_TILED, "x-tiled", },
> > + { I915_FORMAT_MOD_Y_TILED, "y-tiled", },
> > + { I915_FORMAT_MOD_Yf_TILED, "yf-tiled", },
> > +};
> > +
> > +static const struct {
> > + uint32_t format;
> > + uint8_t bpp;
> > +} formats[] = {
> > + /* FIXME igt_fb doesn't support C8 currently */
> > + { DRM_FORMAT_C8, 8, },
> > + { DRM_FORMAT_RGB565, 16, },
> > + { DRM_FORMAT_XRGB8888, 32, },
> > + { DRM_FORMAT_XBGR16161616F, 64, },
> > +};
> > +
> > +static const struct {
> > + igt_rotation_t rotation;
> > + uint16_t angle;
> > +} rotations[] = {
> > + { IGT_ROTATION_0, 0, },
> > + { IGT_ROTATION_90, 90, },
> > + { IGT_ROTATION_180, 180, },
> > + { IGT_ROTATION_270, 270, },
> > +};
> > +
> > +igt_main
> > +{
> > + igt_fixture {
> > + drmModeResPtr res;
> > +
> > + igt_skip_on_simulation();
> > +
> > + data.drm_fd = drm_open_driver_master(DRIVER_INTEL);
> > +
> > + igt_require(is_i915_device(data.drm_fd));
> > +
> > + data.devid = intel_get_drm_devid(data.drm_fd);
> > +
> > + kmstest_set_vt_graphics_mode();
> > +
> > + igt_require_pipe_crc(data.drm_fd);
> > + igt_display_require(&data.display, data.drm_fd);
> > +
> > + res = drmModeGetResources(data.drm_fd);
> > + igt_assert(res);
> > +
> > + data.max_fb_width = res->max_width;
> > + data.max_fb_height = res->max_height;
> > +
> > + drmModeFreeResources(res);
> > +
> > + igt_info("Max driver framebuffer size %dx%d\n",
> > + data.max_fb_width, data.max_fb_height);
> > +
> > + data.ram_size = intel_get_total_ram_mb() << 20;
> > + data.aper_size = gem_aperture_size(data.drm_fd);
> > + data.mappable_size = gem_mappable_aperture_size();
> > +
> > + igt_info("RAM: %"PRIu64" MiB, GPU address space: %"PRId64" MiB, GGTT mappable size: %"PRId64" MiB\n",
> > + data.ram_size >> 20, data.aper_size >> 20,
> > + data.mappable_size >> 20);
> > +
> > + /*
> > + * Gen3 render engine is limited to 2kx2k, whereas
> > + * the display engine can do 4kx4k. Use the blitter
> > + * on gen3 to avoid exceeding the render engine limits.
> > + * On gen2 we could use either, but let's go for the
> > + * blitter there as well.
> > + */
> > + if (intel_gen(data.devid) >= 4)
> > + data.render_copy = igt_get_render_copyfunc(data.devid);
> > +
> > + data.bufmgr = drm_intel_bufmgr_gem_init(data.drm_fd, 4096);
> > + data.batch = intel_batchbuffer_alloc(data.bufmgr, data.devid);
> > + }
> > +
> > + /*
> > + * Skip linear as it doesn't hit the overflow we want
> > + * on account of the tile height being effectively one,
> > + * and thus the kenrnel rounding up to the next tile
> > + * height won't do anything.
> > + */
> > + for (int i = 1; i < ARRAY_SIZE(modifiers); i++) {
> > + igt_subtest_f("%s-addfb-size-overflow",
> > + modifiers[i].name) {
> > + data.modifier = modifiers[i].modifier;
> > + test_size_overflow(&data);
> > + }
> > + }
> > +
> > + for (int i = 1; i < ARRAY_SIZE(modifiers); i++) {
> > + igt_subtest_f("%s-addfb-size-offset-overflow",
> > + modifiers[i].name) {
> > + data.modifier = modifiers[i].modifier;
> > + test_size_offset_overflow(&data);
> > + }
> > + }
> > +
> > + for (int i = 0; i < ARRAY_SIZE(modifiers); i++) {
> > + igt_subtest_f("%s-addfb", modifiers[i].name) {
> > + data.modifier = modifiers[i].modifier;
> > +
> > + test_addfb(&data);
> > + }
> > + }
> > +
> > + for (int i = 0; i < ARRAY_SIZE(modifiers); i++) {
> > + data.modifier = modifiers[i].modifier;
> > +
> > + for (int j = 0; j < ARRAY_SIZE(formats); j++) {
> > + data.format = formats[j].format;
> > +
> > + for (int k = 0; k < ARRAY_SIZE(rotations); k++) {
> > + data.rotation = rotations[k].rotation;
> > +
> > + igt_subtest_f("%s-%dbpp-rotate-%d", modifiers[i].name,
> > + formats[j].bpp, rotations[k].angle) {
> > + igt_require(igt_fb_supported_format(data.format));
> > + igt_require(igt_display_has_format_mod(&data.display, data.format, data.modifier));
> > + prep_fb(&data);
> > + test_scanout(&data);
> > + }
> > + }
> > +
> > + igt_fixture
> > + cleanup_fb(&data);
> > + }
> > + }
> > +
> > + igt_fixture {
> > + igt_display_fini(&data.display);
> > +
> > + intel_batchbuffer_free(data.batch);
> > + drm_intel_bufmgr_destroy(data.bufmgr);
> > + }
> > +}
>
> lgtm
>
> Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
>
> > diff --git a/tests/meson.build b/tests/meson.build
> > index 711979b4a1c2..ad8444875302 100644
> > --- a/tests/meson.build
> > +++ b/tests/meson.build
> > @@ -14,6 +14,7 @@ test_progs = [
> > 'kms_atomic_interruptible',
> > 'kms_atomic_transition',
> > 'kms_available_modes_crc',
> > + 'kms_big_fb',
> > 'kms_busy',
> > 'kms_ccs',
> > 'kms_color',
> > --
> > 2.21.0
> >
> > _______________________________________________
> > igt-dev mailing list
> > igt-dev@lists.freedesktop.org
> > https://lists.freedesktop.org/mailman/listinfo/igt-dev
>
> --
> Daniel Vetter
> Software Engineer, Intel Corporation
> http://blog.ffwll.ch
--
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [igt-dev] [PATCH i-g-t v3] tests/kms_big_fb: Make sure huge fbs work correctly
2019-05-10 8:53 ` [igt-dev] [PATCH i-g-t v3] tests/kms_big_fb: Make sure huge fbs work correctly Daniel Vetter
2019-05-10 8:55 ` Daniel Vetter
@ 2019-05-10 12:31 ` Ville Syrjälä
1 sibling, 0 replies; 9+ messages in thread
From: Ville Syrjälä @ 2019-05-10 12:31 UTC (permalink / raw)
To: Daniel Vetter; +Cc: igt-dev
On Fri, May 10, 2019 at 10:53:51AM +0200, Daniel Vetter wrote:
> On Wed, May 08, 2019 at 07:29:06PM +0300, Ville Syrjala wrote:
> > From: Ville Syrjälä <ville.syrjala@linux.intel.com>
> >
> > Add various tests to excercise huge framebuffers. First some basic
> > sanity checks that the kernel accepts/rejects good/bad addfb2 ioctls,
> > and finally actual scanout tests to make sure we scan out the correct
> > thing when panning around inside large framebuffers.
> >
> > The implementation is i915 specific for now since I chose to use
> > rendercopy/blitter when generating the framebuffer contents. Using
> > the normal cairo stuff was just too slow when dealing with 1GiB+
> > framebuffers. It shouldn't be too hard to plug in some other mechanisms
> > if someone else wants to reuse this test.
> >
> > v2: Add igt_require(format+mod) for the addfb/overflow tests
> > Unset plane fb after TEST_ONLY fail
> > Limit max fb to at most 1/2 RAM or GPU address space
> > Tweak coords to avoid fails with 64bpp linear with 4k screen
> > Make coords even for 90/270 rotated 16bpp
> > Store bpp as uint8_t instead of wasting an entire char*
> > v3: Add blitter path for gen3 (render engine is not capable of
> > handling big fbs).
> > Set fence tiling on gen2/3 in raw addfb tests.
> > Deal with weak max fence stride on gen3.
> > Don't try to use rotation when the prop isn't present.
> > Skip 90/270 test for gen4 (no atomic on those yet so we
> > can't neatly check what's supported).
> > Kernel restricts scanout to mappable portion of ggtt on
> > gmch platforms, so check its size as well
> > Use the correct fb for the legacy setcrtc
> >
> > Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> > ---
> > tests/Makefile.sources | 1 +
> > tests/kms_big_fb.c | 666 +++++++++++++++++++++++++++++++++++++++++
> > tests/meson.build | 1 +
> > 3 files changed, 668 insertions(+)
> > create mode 100644 tests/kms_big_fb.c
> >
> > diff --git a/tests/Makefile.sources b/tests/Makefile.sources
> > index 7f921f6c5988..2d5c929e32fc 100644
> > --- a/tests/Makefile.sources
> > +++ b/tests/Makefile.sources
> > @@ -27,6 +27,7 @@ TESTS_progs = \
> > kms_atomic_interruptible \
> > kms_atomic_transition \
> > kms_available_modes_crc \
> > + kms_big_fb \
> > kms_busy \
> > kms_ccs \
> > kms_color \
> > diff --git a/tests/kms_big_fb.c b/tests/kms_big_fb.c
> > new file mode 100644
> > index 000000000000..5235954e2d8c
> > --- /dev/null
> > +++ b/tests/kms_big_fb.c
> > @@ -0,0 +1,666 @@
> > +/*
> > + * Copyright © 2019 Intel Corporation
> > + *
> > + * Permission is hereby granted, free of charge, to any person obtaining a
> > + * copy of this software and associated documentation files (the "Software"),
> > + * to deal in the Software without restriction, including without limitation
> > + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> > + * and/or sell copies of the Software, and to permit persons to whom the
> > + * Software is furnished to do so, subject to the following conditions:
> > + *
> > + * The above copyright notice and this permission notice (including the next
> > + * paragraph) shall be included in all copies or substantial portions of the
> > + * Software.
> > + *
> > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> > + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
> > + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> > + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
> > + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
> > + * IN THE SOFTWARE.
> > + */
> > +
> > +#include "igt.h"
> > +#include <errno.h>
> > +#include <stdbool.h>
> > +#include <stdio.h>
> > +#include <string.h>
> > +
> > +IGT_TEST_DESCRIPTION("Test big framebuffers");
> > +
> > +typedef struct {
> > + int drm_fd;
> > + uint32_t devid;
> > + igt_display_t display;
> > + enum pipe pipe;
> > + igt_output_t *output;
> > + igt_plane_t *plane;
> > + igt_pipe_crc_t *pipe_crc;
> > + struct igt_fb small_fb, big_fb;
> > + uint32_t format;
> > + uint64_t modifier;
> > + int width, height;
> > + igt_rotation_t rotation;
> > + int max_fb_width, max_fb_height;
> > + uint64_t ram_size, aper_size, mappable_size;
> > + igt_render_copyfunc_t render_copy;
> > + drm_intel_bufmgr *bufmgr;
> > + struct intel_batchbuffer *batch;
> > +} data_t;
> > +
> > +static void init_buf(data_t *data,
> > + struct igt_buf *buf,
> > + const struct igt_fb *fb,
> > + const char *name)
> > +{
> > + igt_assert_eq(fb->offsets[0], 0);
> > +
> > + buf->bo = gem_handle_to_libdrm_bo(data->bufmgr, data->drm_fd,
> > + name, fb->gem_handle);
> > + buf->tiling = igt_fb_mod_to_tiling(fb->modifier);
> > + buf->stride = fb->strides[0];
> > + buf->bpp = fb->plane_bpp[0];
> > + buf->size = fb->size;
> > +}
> > +
> > +static void fini_buf(struct igt_buf *buf)
> > +{
> > + drm_intel_bo_unreference(buf->bo);
> > +}
> > +
> > +static void copy_pattern(data_t *data,
> > + struct igt_fb *dst_fb, int dx, int dy,
> > + struct igt_fb *src_fb, int sx, int sy,
> > + int w, int h)
> > +{
> > + struct igt_buf src = {}, dst = {};
> > +
> > + init_buf(data, &src, src_fb, "big fb src");
> > + init_buf(data, &dst, dst_fb, "big fb dst");
> > +
> > + gem_set_domain(data->drm_fd, dst_fb->gem_handle,
> > + I915_GEM_DOMAIN_GTT, I915_GEM_DOMAIN_GTT);
> > + gem_set_domain(data->drm_fd, src_fb->gem_handle,
> > + I915_GEM_DOMAIN_GTT, 0);
> > +
>
> Maybe a comment here that we rely on the kernel not bumping the fb limits
> past what we can render into?
Sure.
>
> > + if (data->render_copy) {
> > + data->render_copy(data->batch, NULL, &src, sx, sy, w, h, &dst, dx, dy);
> > + } else {
> > + w = min(w, src_fb->width - sx);
> > + w = min(w, dst_fb->width - dx);
> > +
> > + h = min(h, src_fb->height - sy);
> > + h = min(h, dst_fb->height - dy);
> > +
> > + intel_blt_copy(data->batch, src.bo, sx, sy, src.stride,
> > + dst.bo, dx, dy, dst.stride, w, h, dst.bpp);
> > + }
> > +
> > + fini_buf(&dst);
> > + fini_buf(&src);
> > +}
> > +
> > +static void generate_pattern(data_t *data,
> > + struct igt_fb *fb,
> > + int w, int h)
> > +{
> > + struct igt_fb pat_fb;
> > +
> > + igt_create_pattern_fb(data->drm_fd, w, h,
> > + data->format, data->modifier,
> > + &pat_fb);
> > +
> > + for (int y = 0; y < fb->height; y += h) {
> > + for (int x = 0; x < fb->width; x += w) {
> > + copy_pattern(data, fb, x, y,
> > + &pat_fb, 0, 0,
> > + pat_fb.width, pat_fb.height);
> > + w++;
> > + h++;
> > + }
> > + }
> > +
> > + igt_remove_fb(data->drm_fd, &pat_fb);
> > +}
> > +
> > +static bool size_ok(data_t *data, uint64_t size)
> > +{
> > + /*
> > + * The kernel limits scanout to the
> > + * mappable portion of ggtt on gmch platforms.
> > + */
> > + if ((intel_gen(data->devid) < 5 ||
> > + IS_VALLEYVIEW(data->devid) ||
> > + IS_CHERRYVIEW(data->devid)) &&
> > + size > data->mappable_size / 2)
> > + return false;
> > +
> > + /*
> > + * Limit the big fb size to at most half the RAM or half
> > + * the aperture size. Could go a bit higher I suppose since
> > + * we shouldn't need more than one big fb at a time.
> > + */
> > + if (size > data->ram_size / 2 || size > data->aper_size / 2)
> > + return false;
> > +
> > + return true;
> > +}
> > +
> > +
> > +static void max_fb_size(data_t *data, int *width, int *height,
> > + uint32_t format, uint64_t modifier)
> > +{
> > + unsigned int stride;
> > + uint64_t size;
> > + int i = 0;
> > +
> > + *width = data->max_fb_width;
> > + *height = data->max_fb_height;
> > +
> > + /* max fence stride is only 8k bytes on gen3 */
> > + if (intel_gen(data->devid) < 4 &&
> > + format == DRM_FORMAT_XRGB8888)
> > + *width = min(*width, 8192 / 4);
> > +
> > + igt_calc_fb_size(data->drm_fd, *width, *height,
> > + format, modifier, &size, &stride);
> > +
> > + while (!size_ok(data, size)) {
> > + if (i++ & 1)
> > + *width >>= 1;
> > + else
> > + *height >>= 1;
> > +
> > + igt_calc_fb_size(data->drm_fd, *width, *height,
> > + format, modifier, &size, &stride);
> > + }
> > +
> > + igt_info("Max usable framebuffer size for format "IGT_FORMAT_FMT" / modifier 0x%"PRIx64": %dx%d\n",
> > + IGT_FORMAT_ARGS(format), modifier,
> > + *width, *height);
> > +}
> > +
> > +static bool test_plane(data_t *data)
> > +{
> > + igt_plane_t *plane = data->plane;
> > + struct igt_fb *small_fb = &data->small_fb;
> > + struct igt_fb *big_fb = &data->big_fb;
> > + int w = big_fb->width - small_fb->width;
> > + int h = big_fb->height - small_fb->height;
> > + struct {
> > + int x, y;
> > + } coords[] = {
> > + /* bunch of coordinates pulled out of thin air */
> > + { 0, 0, },
> > + { w * 4 / 7, h / 5, },
> > + { w * 3 / 7, h / 3, },
> > + { w / 2, h / 2, },
> > + { w / 3, h * 3 / 4, },
> > + { w, h, },
> > + };
> > +
> > + if (!igt_plane_has_format_mod(plane, data->format, data->modifier))
> > + return false;
> > +
> > + if (data->rotation != IGT_ROTATION_0 &&
> > + !igt_plane_has_prop(plane, IGT_PLANE_ROTATION))
> > + return false;
> > +
> > + /* FIXME need atomic on i965/g4x */
> > + if (data->rotation != IGT_ROTATION_0 &&
> > + data->rotation != IGT_ROTATION_180 &&
> > + !data->display.is_atomic)
> > + return false;
> > +
> > + if (igt_plane_has_prop(plane, IGT_PLANE_ROTATION))
> > + igt_plane_set_rotation(plane, data->rotation);
> > + igt_plane_set_position(plane, 0, 0);
> > +
> > + for (int i = 0; i < ARRAY_SIZE(coords); i++) {
> > + igt_crc_t small_crc, big_crc;
> > + int x = coords[i].x;
> > + int y = coords[i].y;
> > +
> > + /* Hardware limitation */
> > + if (data->format == DRM_FORMAT_RGB565 &&
> > + (data->rotation == IGT_ROTATION_90 ||
> > + data->rotation == IGT_ROTATION_270)) {
> > + x &= ~1;
> > + y &= ~1;
> > + }
> > +
> > + /*
> > + * Make a 1:1 copy of the desired part of the big fb
> > + * rather than try to render the same pattern (translated
> > + * accordinly) again via cairo. Something in cairo's
> > + * rendering pipeline introduces slight differences into
> > + * the result if we try that, and so the crc will not match.
> > + */
> > + copy_pattern(data, small_fb, 0, 0, big_fb, x, y,
> > + small_fb->width, small_fb->height);
> > +
> > + igt_plane_set_fb(plane, small_fb);
> > + igt_plane_set_size(plane, data->width, data->height);
> > +
> > + /*
> > + * Try to check that the rotation+format+modifier
> > + * combo is supported.
> > + */
> > + if (i == 0 && data->display.is_atomic &&
> > + igt_display_try_commit_atomic(&data->display,
> > + DRM_MODE_ATOMIC_TEST_ONLY,
> > + NULL) != 0) {
> > + if (igt_plane_has_prop(plane, IGT_PLANE_ROTATION))
> > + igt_plane_set_rotation(plane, IGT_ROTATION_0);
> > + igt_plane_set_fb(plane, NULL);
> > + igt_skip("unsupported plane configuration\n");
>
> This is kinda uncool if we have a plane later on that provokes a skip, but
> we've already run some tests. It's a gap in igt infrastructure that I need
> to fix eventually, but meanwhile you need to count how many skips you
> have, and only skip at the very end of your subtest if you skipped all
> possible combinations you might want to test.
The test only executes on a single plane. But this check does make
the assumption that if one plane can't do the format+mod+rotation
combo then none of them can do it. Which should be OK for i915, but
might make sense to remove that assumption in case someone else
wants to reuse this test.
Not sure there is much to gain from testing on more planes. Hmm. I
guess for the pre-skl there could in theory be some bug in the sprite
code that's not present in the primary plane code, or vice versa.
Although a lot of the code is shared between the plane types so it
probably wouldn't be a bug directly related to remapping. This again
is a somewhat i915 specific assumption though.
Anyways, I think your idea of doing the igt_skip higher up is a good
one.
>
> I think a return false here and changing the higher level logic to
> igt_skip if you didn't break out of the loop should do the trick.
Yeah, should be easy enough.
--
Ville Syrjälä
Intel
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 9+ messages in thread
* [igt-dev] [PATCH i-g-t v4] tests/kms_big_fb: Make sure huge fbs work correctly
2019-05-08 16:29 [igt-dev] [PATCH i-g-t v3] tests/kms_big_fb: Make sure huge fbs work correctly Ville Syrjala
` (2 preceding siblings ...)
2019-05-10 8:53 ` [igt-dev] [PATCH i-g-t v3] tests/kms_big_fb: Make sure huge fbs work correctly Daniel Vetter
@ 2019-05-10 16:23 ` Ville Syrjala
2019-05-10 17:11 ` [igt-dev] ✓ Fi.CI.BAT: success for tests/kms_big_fb: Make sure huge fbs work correctly (rev3) Patchwork
2019-05-10 20:40 ` [igt-dev] ✗ Fi.CI.IGT: failure " Patchwork
5 siblings, 0 replies; 9+ messages in thread
From: Ville Syrjala @ 2019-05-10 16:23 UTC (permalink / raw)
To: igt-dev
From: Ville Syrjälä <ville.syrjala@linux.intel.com>
Add various tests to excercise huge framebuffers. First some basic
sanity checks that the kernel accepts/rejects good/bad addfb2 ioctls,
and finally actual scanout tests to make sure we scan out the correct
thing when panning around inside large framebuffers.
The implementation is i915 specific for now since I chose to use
rendercopy/blitter when generating the framebuffer contents. Using
the normal cairo stuff was just too slow when dealing with 1GiB+
framebuffers. It shouldn't be too hard to plug in some other mechanisms
if someone else wants to reuse this test.
v2: Add igt_require(format+mod) for the addfb/overflow tests
Unset plane fb after TEST_ONLY fail
Limit max fb to at most 1/2 RAM or GPU address space
Tweak coords to avoid fails with 64bpp linear with 4k screen
Make coords even for 90/270 rotated 16bpp
Store bpp as uint8_t instead of wasting an entire char*
v3: Add blitter path for gen3 (render engine is not capable of
handling big fbs).
Set fence tiling on gen2/3 in raw addfb tests.
Deal with weak max fence stride on gen3.
Don't try to use rotation when the prop isn't present.
Skip 90/270 test for gen4 (no atomic on those yet so we
can't neatly check what's supported).
Kernel restricts scanout to mappable portion of ggtt on
gmch platforms, so check its size as well
Use the correct fb for the legacy setcrtc
v4: Don't igt_skip() inside test_plane() (Daniel)
Document that we expect the kernel to make
sure max fb size is still renderable (Daniel)
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
---
tests/Makefile.sources | 1 +
tests/kms_big_fb.c | 670 +++++++++++++++++++++++++++++++++++++++++
tests/meson.build | 1 +
3 files changed, 672 insertions(+)
create mode 100644 tests/kms_big_fb.c
diff --git a/tests/Makefile.sources b/tests/Makefile.sources
index 7f921f6c5988..2d5c929e32fc 100644
--- a/tests/Makefile.sources
+++ b/tests/Makefile.sources
@@ -27,6 +27,7 @@ TESTS_progs = \
kms_atomic_interruptible \
kms_atomic_transition \
kms_available_modes_crc \
+ kms_big_fb \
kms_busy \
kms_ccs \
kms_color \
diff --git a/tests/kms_big_fb.c b/tests/kms_big_fb.c
new file mode 100644
index 000000000000..2f898074ad54
--- /dev/null
+++ b/tests/kms_big_fb.c
@@ -0,0 +1,670 @@
+/*
+ * Copyright © 2019 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+
+#include "igt.h"
+#include <errno.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <string.h>
+
+IGT_TEST_DESCRIPTION("Test big framebuffers");
+
+typedef struct {
+ int drm_fd;
+ uint32_t devid;
+ igt_display_t display;
+ enum pipe pipe;
+ igt_output_t *output;
+ igt_plane_t *plane;
+ igt_pipe_crc_t *pipe_crc;
+ struct igt_fb small_fb, big_fb;
+ uint32_t format;
+ uint64_t modifier;
+ int width, height;
+ igt_rotation_t rotation;
+ int max_fb_width, max_fb_height;
+ uint64_t ram_size, aper_size, mappable_size;
+ igt_render_copyfunc_t render_copy;
+ drm_intel_bufmgr *bufmgr;
+ struct intel_batchbuffer *batch;
+} data_t;
+
+static void init_buf(data_t *data,
+ struct igt_buf *buf,
+ const struct igt_fb *fb,
+ const char *name)
+{
+ igt_assert_eq(fb->offsets[0], 0);
+
+ buf->bo = gem_handle_to_libdrm_bo(data->bufmgr, data->drm_fd,
+ name, fb->gem_handle);
+ buf->tiling = igt_fb_mod_to_tiling(fb->modifier);
+ buf->stride = fb->strides[0];
+ buf->bpp = fb->plane_bpp[0];
+ buf->size = fb->size;
+}
+
+static void fini_buf(struct igt_buf *buf)
+{
+ drm_intel_bo_unreference(buf->bo);
+}
+
+static void copy_pattern(data_t *data,
+ struct igt_fb *dst_fb, int dx, int dy,
+ struct igt_fb *src_fb, int sx, int sy,
+ int w, int h)
+{
+ struct igt_buf src = {}, dst = {};
+
+ init_buf(data, &src, src_fb, "big fb src");
+ init_buf(data, &dst, dst_fb, "big fb dst");
+
+ gem_set_domain(data->drm_fd, dst_fb->gem_handle,
+ I915_GEM_DOMAIN_GTT, I915_GEM_DOMAIN_GTT);
+ gem_set_domain(data->drm_fd, src_fb->gem_handle,
+ I915_GEM_DOMAIN_GTT, 0);
+
+ /*
+ * We expect the kernel to limit the max fb
+ * size/stride to something that can still
+ * rendered with the blitter/render engine.
+ */
+ if (data->render_copy) {
+ data->render_copy(data->batch, NULL, &src, sx, sy, w, h, &dst, dx, dy);
+ } else {
+ w = min(w, src_fb->width - sx);
+ w = min(w, dst_fb->width - dx);
+
+ h = min(h, src_fb->height - sy);
+ h = min(h, dst_fb->height - dy);
+
+ intel_blt_copy(data->batch, src.bo, sx, sy, src.stride,
+ dst.bo, dx, dy, dst.stride, w, h, dst.bpp);
+ }
+
+ fini_buf(&dst);
+ fini_buf(&src);
+}
+
+static void generate_pattern(data_t *data,
+ struct igt_fb *fb,
+ int w, int h)
+{
+ struct igt_fb pat_fb;
+
+ igt_create_pattern_fb(data->drm_fd, w, h,
+ data->format, data->modifier,
+ &pat_fb);
+
+ for (int y = 0; y < fb->height; y += h) {
+ for (int x = 0; x < fb->width; x += w) {
+ copy_pattern(data, fb, x, y,
+ &pat_fb, 0, 0,
+ pat_fb.width, pat_fb.height);
+ w++;
+ h++;
+ }
+ }
+
+ igt_remove_fb(data->drm_fd, &pat_fb);
+}
+
+static bool size_ok(data_t *data, uint64_t size)
+{
+ /*
+ * The kernel limits scanout to the
+ * mappable portion of ggtt on gmch platforms.
+ */
+ if ((intel_gen(data->devid) < 5 ||
+ IS_VALLEYVIEW(data->devid) ||
+ IS_CHERRYVIEW(data->devid)) &&
+ size > data->mappable_size / 2)
+ return false;
+
+ /*
+ * Limit the big fb size to at most half the RAM or half
+ * the aperture size. Could go a bit higher I suppose since
+ * we shouldn't need more than one big fb at a time.
+ */
+ if (size > data->ram_size / 2 || size > data->aper_size / 2)
+ return false;
+
+ return true;
+}
+
+
+static void max_fb_size(data_t *data, int *width, int *height,
+ uint32_t format, uint64_t modifier)
+{
+ unsigned int stride;
+ uint64_t size;
+ int i = 0;
+
+ *width = data->max_fb_width;
+ *height = data->max_fb_height;
+
+ /* max fence stride is only 8k bytes on gen3 */
+ if (intel_gen(data->devid) < 4 &&
+ format == DRM_FORMAT_XRGB8888)
+ *width = min(*width, 8192 / 4);
+
+ igt_calc_fb_size(data->drm_fd, *width, *height,
+ format, modifier, &size, &stride);
+
+ while (!size_ok(data, size)) {
+ if (i++ & 1)
+ *width >>= 1;
+ else
+ *height >>= 1;
+
+ igt_calc_fb_size(data->drm_fd, *width, *height,
+ format, modifier, &size, &stride);
+ }
+
+ igt_info("Max usable framebuffer size for format "IGT_FORMAT_FMT" / modifier 0x%"PRIx64": %dx%d\n",
+ IGT_FORMAT_ARGS(format), modifier,
+ *width, *height);
+}
+
+static bool test_plane(data_t *data)
+{
+ igt_plane_t *plane = data->plane;
+ struct igt_fb *small_fb = &data->small_fb;
+ struct igt_fb *big_fb = &data->big_fb;
+ int w = big_fb->width - small_fb->width;
+ int h = big_fb->height - small_fb->height;
+ struct {
+ int x, y;
+ } coords[] = {
+ /* bunch of coordinates pulled out of thin air */
+ { 0, 0, },
+ { w * 4 / 7, h / 5, },
+ { w * 3 / 7, h / 3, },
+ { w / 2, h / 2, },
+ { w / 3, h * 3 / 4, },
+ { w, h, },
+ };
+
+ if (!igt_plane_has_format_mod(plane, data->format, data->modifier))
+ return false;
+
+ if (data->rotation != IGT_ROTATION_0 &&
+ !igt_plane_has_prop(plane, IGT_PLANE_ROTATION))
+ return false;
+
+ /* FIXME need atomic on i965/g4x */
+ if (data->rotation != IGT_ROTATION_0 &&
+ data->rotation != IGT_ROTATION_180 &&
+ !data->display.is_atomic)
+ return false;
+
+ if (igt_plane_has_prop(plane, IGT_PLANE_ROTATION))
+ igt_plane_set_rotation(plane, data->rotation);
+ igt_plane_set_position(plane, 0, 0);
+
+ for (int i = 0; i < ARRAY_SIZE(coords); i++) {
+ igt_crc_t small_crc, big_crc;
+ int x = coords[i].x;
+ int y = coords[i].y;
+
+ /* Hardware limitation */
+ if (data->format == DRM_FORMAT_RGB565 &&
+ (data->rotation == IGT_ROTATION_90 ||
+ data->rotation == IGT_ROTATION_270)) {
+ x &= ~1;
+ y &= ~1;
+ }
+
+ /*
+ * Make a 1:1 copy of the desired part of the big fb
+ * rather than try to render the same pattern (translated
+ * accordinly) again via cairo. Something in cairo's
+ * rendering pipeline introduces slight differences into
+ * the result if we try that, and so the crc will not match.
+ */
+ copy_pattern(data, small_fb, 0, 0, big_fb, x, y,
+ small_fb->width, small_fb->height);
+
+ igt_plane_set_fb(plane, small_fb);
+ igt_plane_set_size(plane, data->width, data->height);
+
+ /*
+ * Try to check that the rotation+format+modifier
+ * combo is supported.
+ */
+ if (i == 0 && data->display.is_atomic &&
+ igt_display_try_commit_atomic(&data->display,
+ DRM_MODE_ATOMIC_TEST_ONLY,
+ NULL) != 0) {
+ if (igt_plane_has_prop(plane, IGT_PLANE_ROTATION))
+ igt_plane_set_rotation(plane, IGT_ROTATION_0);
+ igt_plane_set_fb(plane, NULL);
+ return false;
+ }
+
+ igt_display_commit2(&data->display, data->display.is_atomic ?
+ COMMIT_ATOMIC : COMMIT_UNIVERSAL);
+
+
+ igt_pipe_crc_collect_crc(data->pipe_crc, &small_crc);
+
+ igt_plane_set_fb(plane, big_fb);
+ igt_fb_set_position(big_fb, plane, x, y);
+ igt_fb_set_size(big_fb, plane, small_fb->width, small_fb->height);
+ igt_plane_set_size(plane, data->width, data->height);
+ igt_display_commit2(&data->display, data->display.is_atomic ?
+ COMMIT_ATOMIC : COMMIT_UNIVERSAL);
+
+ igt_pipe_crc_collect_crc(data->pipe_crc, &big_crc);
+
+ igt_plane_set_fb(plane, NULL);
+
+ igt_assert_crc_equal(&big_crc, &small_crc);
+ }
+
+ return true;
+}
+
+static bool test_pipe(data_t *data)
+{
+ drmModeModeInfo *mode;
+ igt_plane_t *primary;
+ int width, height;
+ bool ret = false;
+
+ mode = igt_output_get_mode(data->output);
+
+ data->width = mode->hdisplay;
+ data->height = mode->vdisplay;
+
+ width = mode->hdisplay;
+ height = mode->vdisplay;
+ if (data->rotation == IGT_ROTATION_90 ||
+ data->rotation == IGT_ROTATION_270)
+ igt_swap(width, height);
+
+ igt_create_color_fb(data->drm_fd, width, height,
+ data->format, data->modifier,
+ 0, 1, 0, &data->small_fb);
+
+ igt_output_set_pipe(data->output, data->pipe);
+
+ primary = igt_output_get_plane_type(data->output, DRM_PLANE_TYPE_PRIMARY);
+ igt_plane_set_fb(primary, NULL);
+
+ if (!data->display.is_atomic) {
+ struct igt_fb fb;
+
+ igt_create_fb(data->drm_fd, mode->hdisplay, mode->vdisplay,
+ DRM_FORMAT_XRGB8888, DRM_FORMAT_MOD_LINEAR,
+ &fb);
+
+ /* legacy setcrtc needs an fb */
+ igt_plane_set_fb(primary, &fb);
+ igt_display_commit2(&data->display, COMMIT_LEGACY);
+
+ igt_plane_set_fb(primary, NULL);
+ igt_display_commit2(&data->display, COMMIT_UNIVERSAL);
+
+ igt_remove_fb(data->drm_fd, &fb);
+ }
+
+ igt_display_commit2(&data->display, data->display.is_atomic ?
+ COMMIT_ATOMIC : COMMIT_UNIVERSAL);
+
+ data->pipe_crc = igt_pipe_crc_new(data->drm_fd, data->pipe,
+ INTEL_PIPE_CRC_SOURCE_AUTO);
+
+ for_each_plane_on_pipe(&data->display, data->pipe, data->plane) {
+ ret = test_plane(data);
+ if (ret)
+ break;
+ }
+
+ igt_pipe_crc_free(data->pipe_crc);
+
+ igt_output_set_pipe(data->output, PIPE_ANY);
+ igt_display_commit2(&data->display, data->display.is_atomic ?
+ COMMIT_ATOMIC : COMMIT_UNIVERSAL);
+
+ igt_remove_fb(data->drm_fd, &data->small_fb);
+
+ return ret;
+}
+
+static void test_scanout(data_t *data)
+{
+ for_each_pipe_with_valid_output(&data->display, data->pipe, data->output) {
+ if (test_pipe(data))
+ return;
+ }
+
+ igt_skip("unsupported configuration\n");
+}
+
+static void prep_fb(data_t *data)
+{
+ int width, height;
+
+ if (data->big_fb.fb_id)
+ return;
+
+ max_fb_size(data, &width, &height,
+ data->format, data->modifier);
+
+ igt_create_fb(data->drm_fd, width, height,
+ data->format, data->modifier,
+ &data->big_fb);
+
+ generate_pattern(data, &data->big_fb, 640, 480);
+}
+
+static void cleanup_fb(data_t *data)
+{
+ igt_remove_fb(data->drm_fd, &data->big_fb);
+ data->big_fb.fb_id = 0;
+}
+
+static void
+test_size_overflow(data_t *data)
+{
+ uint32_t fb_id;
+ uint32_t bo;
+ uint32_t offsets[4] = {};
+ uint32_t strides[4] = { 256*1024, };
+ int ret;
+
+ igt_require(igt_display_has_format_mod(&data->display,
+ DRM_FORMAT_XRGB8888,
+ data->modifier));
+
+ /*
+ * Try to hit a specific integer overflow in i915 fb size
+ * calculations. 256k * 16k == 1<<32 which is checked
+ * against the bo size. The check should fail on account
+ * of the bo being smaller, but due to the overflow the
+ * computed fb size is 0 and thus the check never trips.
+ */
+ igt_require(data->max_fb_width >= 16383 &&
+ data->max_fb_height >= 16383);
+
+ bo = gem_create(data->drm_fd, (1ULL << 32) - 4096);
+ igt_require(bo);
+
+ ret = __kms_addfb(data->drm_fd, bo,
+ 16383, 16383,
+ DRM_FORMAT_XRGB8888,
+ data->modifier,
+ strides, offsets, 1,
+ DRM_MODE_FB_MODIFIERS, &fb_id);
+
+ igt_assert_neq(ret, 0);
+
+ gem_close(data->drm_fd, bo);
+}
+
+static void
+test_size_offset_overflow(data_t *data)
+{
+ uint32_t fb_id;
+ uint32_t bo;
+ uint32_t offsets[4] = {};
+ uint32_t strides[4] = { 8192, };
+ int ret;
+
+ igt_require(igt_display_has_format_mod(&data->display,
+ DRM_FORMAT_NV12,
+ data->modifier));
+
+ /*
+ * Try to hit a specific integer overflow in i915 fb size
+ * calculations. This time it's offsets[1] + the tile
+ * aligned chroma plane size that overflows and
+ * incorrectly passes the bo size check.
+ */
+ igt_require(igt_display_has_format_mod(&data->display,
+ DRM_FORMAT_NV12,
+ data->modifier));
+
+ bo = gem_create(data->drm_fd, (1ULL << 32) - 4096);
+ igt_require(bo);
+
+ offsets[0] = 0;
+ offsets[1] = (1ULL << 32) - 8192 * 4096;
+
+ ret = __kms_addfb(data->drm_fd, bo,
+ 8192, 8188,
+ DRM_FORMAT_NV12,
+ data->modifier,
+ strides, offsets, 1,
+ DRM_MODE_FB_MODIFIERS, &fb_id);
+ igt_assert_neq(ret, 0);
+
+ gem_close(data->drm_fd, bo);
+}
+
+static int rmfb(int fd, uint32_t id)
+{
+ int err;
+
+ err = 0;
+ if (igt_ioctl(fd, DRM_IOCTL_MODE_RMFB, &id))
+ err = -errno;
+
+ errno = 0;
+ return err;
+}
+
+static void
+test_addfb(data_t *data)
+{
+ uint64_t size;
+ uint32_t fb_id;
+ uint32_t bo;
+ uint32_t offsets[4] = {};
+ uint32_t strides[4] = {};
+ uint32_t format;
+ int ret;
+
+ /*
+ * gen3 max tiled stride is 8k bytes, but
+ * max fb size of 4k pixels, hence we can't test
+ * with 32bpp and must use 16bpp instead.
+ */
+ if (intel_gen(data->devid) == 3)
+ format = DRM_FORMAT_RGB565;
+ else
+ format = DRM_FORMAT_XRGB8888;
+
+ igt_require(igt_display_has_format_mod(&data->display,
+ format, data->modifier));
+
+ igt_calc_fb_size(data->drm_fd,
+ data->max_fb_width,
+ data->max_fb_height,
+ format, data->modifier,
+ &size, &strides[0]);
+
+ bo = gem_create(data->drm_fd, size);
+ igt_require(bo);
+
+ if (intel_gen(data->devid) < 4)
+ gem_set_tiling(data->drm_fd, bo,
+ igt_fb_mod_to_tiling(data->modifier), strides[0]);
+
+ ret = __kms_addfb(data->drm_fd, bo,
+ data->max_fb_width,
+ data->max_fb_height,
+ format, data->modifier,
+ strides, offsets, 1,
+ DRM_MODE_FB_MODIFIERS, &fb_id);
+ igt_assert_eq(ret, 0);
+
+ rmfb(data->drm_fd, fb_id);
+ gem_close(data->drm_fd, bo);
+}
+
+static data_t data;
+
+static const struct {
+ uint64_t modifier;
+ const char *name;
+} modifiers[] = {
+ { DRM_FORMAT_MOD_LINEAR, "linear", },
+ { I915_FORMAT_MOD_X_TILED, "x-tiled", },
+ { I915_FORMAT_MOD_Y_TILED, "y-tiled", },
+ { I915_FORMAT_MOD_Yf_TILED, "yf-tiled", },
+};
+
+static const struct {
+ uint32_t format;
+ uint8_t bpp;
+} formats[] = {
+ /* FIXME igt_fb doesn't support C8 currently */
+ { DRM_FORMAT_C8, 8, },
+ { DRM_FORMAT_RGB565, 16, },
+ { DRM_FORMAT_XRGB8888, 32, },
+ { DRM_FORMAT_XBGR16161616F, 64, },
+};
+
+static const struct {
+ igt_rotation_t rotation;
+ uint16_t angle;
+} rotations[] = {
+ { IGT_ROTATION_0, 0, },
+ { IGT_ROTATION_90, 90, },
+ { IGT_ROTATION_180, 180, },
+ { IGT_ROTATION_270, 270, },
+};
+
+igt_main
+{
+ igt_fixture {
+ drmModeResPtr res;
+
+ igt_skip_on_simulation();
+
+ data.drm_fd = drm_open_driver_master(DRIVER_INTEL);
+
+ igt_require(is_i915_device(data.drm_fd));
+
+ data.devid = intel_get_drm_devid(data.drm_fd);
+
+ kmstest_set_vt_graphics_mode();
+
+ igt_require_pipe_crc(data.drm_fd);
+ igt_display_require(&data.display, data.drm_fd);
+
+ res = drmModeGetResources(data.drm_fd);
+ igt_assert(res);
+
+ data.max_fb_width = res->max_width;
+ data.max_fb_height = res->max_height;
+
+ drmModeFreeResources(res);
+
+ igt_info("Max driver framebuffer size %dx%d\n",
+ data.max_fb_width, data.max_fb_height);
+
+ data.ram_size = intel_get_total_ram_mb() << 20;
+ data.aper_size = gem_aperture_size(data.drm_fd);
+ data.mappable_size = gem_mappable_aperture_size();
+
+ igt_info("RAM: %"PRIu64" MiB, GPU address space: %"PRId64" MiB, GGTT mappable size: %"PRId64" MiB\n",
+ data.ram_size >> 20, data.aper_size >> 20,
+ data.mappable_size >> 20);
+
+ /*
+ * Gen3 render engine is limited to 2kx2k, whereas
+ * the display engine can do 4kx4k. Use the blitter
+ * on gen3 to avoid exceeding the render engine limits.
+ * On gen2 we could use either, but let's go for the
+ * blitter there as well.
+ */
+ if (intel_gen(data.devid) >= 4)
+ data.render_copy = igt_get_render_copyfunc(data.devid);
+
+ data.bufmgr = drm_intel_bufmgr_gem_init(data.drm_fd, 4096);
+ data.batch = intel_batchbuffer_alloc(data.bufmgr, data.devid);
+ }
+
+ /*
+ * Skip linear as it doesn't hit the overflow we want
+ * on account of the tile height being effectively one,
+ * and thus the kenrnel rounding up to the next tile
+ * height won't do anything.
+ */
+ for (int i = 1; i < ARRAY_SIZE(modifiers); i++) {
+ igt_subtest_f("%s-addfb-size-overflow",
+ modifiers[i].name) {
+ data.modifier = modifiers[i].modifier;
+ test_size_overflow(&data);
+ }
+ }
+
+ for (int i = 1; i < ARRAY_SIZE(modifiers); i++) {
+ igt_subtest_f("%s-addfb-size-offset-overflow",
+ modifiers[i].name) {
+ data.modifier = modifiers[i].modifier;
+ test_size_offset_overflow(&data);
+ }
+ }
+
+ for (int i = 0; i < ARRAY_SIZE(modifiers); i++) {
+ igt_subtest_f("%s-addfb", modifiers[i].name) {
+ data.modifier = modifiers[i].modifier;
+
+ test_addfb(&data);
+ }
+ }
+
+ for (int i = 0; i < ARRAY_SIZE(modifiers); i++) {
+ data.modifier = modifiers[i].modifier;
+
+ for (int j = 0; j < ARRAY_SIZE(formats); j++) {
+ data.format = formats[j].format;
+
+ for (int k = 0; k < ARRAY_SIZE(rotations); k++) {
+ data.rotation = rotations[k].rotation;
+
+ igt_subtest_f("%s-%dbpp-rotate-%d", modifiers[i].name,
+ formats[j].bpp, rotations[k].angle) {
+ igt_require(igt_fb_supported_format(data.format));
+ igt_require(igt_display_has_format_mod(&data.display, data.format, data.modifier));
+ prep_fb(&data);
+ test_scanout(&data);
+ }
+ }
+
+ igt_fixture
+ cleanup_fb(&data);
+ }
+ }
+
+ igt_fixture {
+ igt_display_fini(&data.display);
+
+ intel_batchbuffer_free(data.batch);
+ drm_intel_bufmgr_destroy(data.bufmgr);
+ }
+}
diff --git a/tests/meson.build b/tests/meson.build
index 711979b4a1c2..ad8444875302 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -14,6 +14,7 @@ test_progs = [
'kms_atomic_interruptible',
'kms_atomic_transition',
'kms_available_modes_crc',
+ 'kms_big_fb',
'kms_busy',
'kms_ccs',
'kms_color',
--
2.21.0
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [igt-dev] ✓ Fi.CI.BAT: success for tests/kms_big_fb: Make sure huge fbs work correctly (rev3)
2019-05-08 16:29 [igt-dev] [PATCH i-g-t v3] tests/kms_big_fb: Make sure huge fbs work correctly Ville Syrjala
` (3 preceding siblings ...)
2019-05-10 16:23 ` [igt-dev] [PATCH i-g-t v4] " Ville Syrjala
@ 2019-05-10 17:11 ` Patchwork
2019-05-10 20:40 ` [igt-dev] ✗ Fi.CI.IGT: failure " Patchwork
5 siblings, 0 replies; 9+ messages in thread
From: Patchwork @ 2019-05-10 17:11 UTC (permalink / raw)
To: Ville Syrjala; +Cc: igt-dev
== Series Details ==
Series: tests/kms_big_fb: Make sure huge fbs work correctly (rev3)
URL : https://patchwork.freedesktop.org/series/49494/
State : success
== Summary ==
CI Bug Log - changes from IGT_4981 -> IGTPW_2966
====================================================
Summary
-------
**SUCCESS**
No regressions found.
External URL: https://patchwork.freedesktop.org/api/1.0/series/49494/revisions/3/mbox/
Known issues
------------
Here are the changes found in IGTPW_2966 that come from known issues:
### IGT changes ###
#### Issues hit ####
* igt@gem_ctx_create@basic-files:
- fi-icl-u3: [PASS][1] -> [INCOMPLETE][2] ([fdo#107713] / [fdo#109100])
[1]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_4981/fi-icl-u3/igt@gem_ctx_create@basic-files.html
[2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2966/fi-icl-u3/igt@gem_ctx_create@basic-files.html
* igt@gem_exec_suspend@basic-s4-devices:
- fi-bsw-kefka: [PASS][3] -> [DMESG-WARN][4] ([fdo#108930])
[3]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_4981/fi-bsw-kefka/igt@gem_exec_suspend@basic-s4-devices.html
[4]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2966/fi-bsw-kefka/igt@gem_exec_suspend@basic-s4-devices.html
* igt@i915_pm_rpm@module-reload:
- fi-hsw-4770: [PASS][5] -> [INCOMPLETE][6] ([fdo#107807])
[5]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_4981/fi-hsw-4770/igt@i915_pm_rpm@module-reload.html
[6]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2966/fi-hsw-4770/igt@i915_pm_rpm@module-reload.html
* igt@i915_selftest@live_contexts:
- fi-skl-gvtdvm: [PASS][7] -> [DMESG-FAIL][8] ([fdo#110235])
[7]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_4981/fi-skl-gvtdvm/igt@i915_selftest@live_contexts.html
[8]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2966/fi-skl-gvtdvm/igt@i915_selftest@live_contexts.html
* igt@prime_vgem@basic-fence-flip:
- fi-ilk-650: [PASS][9] -> [DMESG-WARN][10] ([fdo#106387]) +1 similar issue
[9]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_4981/fi-ilk-650/igt@prime_vgem@basic-fence-flip.html
[10]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2966/fi-ilk-650/igt@prime_vgem@basic-fence-flip.html
[fdo#106387]: https://bugs.freedesktop.org/show_bug.cgi?id=106387
[fdo#107713]: https://bugs.freedesktop.org/show_bug.cgi?id=107713
[fdo#107807]: https://bugs.freedesktop.org/show_bug.cgi?id=107807
[fdo#108930]: https://bugs.freedesktop.org/show_bug.cgi?id=108930
[fdo#109100]: https://bugs.freedesktop.org/show_bug.cgi?id=109100
[fdo#110235]: https://bugs.freedesktop.org/show_bug.cgi?id=110235
Participating hosts (53 -> 44)
------------------------------
Missing (9): fi-kbl-soraka fi-ilk-m540 fi-hsw-4200u fi-byt-squawks fi-bsw-cyan fi-ctg-p8600 fi-pnv-d510 fi-byt-clapper fi-bdw-samus
Build changes
-------------
* IGT: IGT_4981 -> IGTPW_2966
CI_DRM_6073: c059ddabfe60a5072ace44a34a9de9b4202df6ec @ git://anongit.freedesktop.org/gfx-ci/linux
IGTPW_2966: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2966/
IGT_4981: 709bd6869e2aff01a67eef729f9dc330f404387e @ git://anongit.freedesktop.org/xorg/app/intel-gpu-tools
== Testlist changes ==
+igt@kms_big_fb@linear-8bpp-rotate-0
+igt@kms_big_fb@linear-8bpp-rotate-90
+igt@kms_big_fb@linear-8bpp-rotate-180
+igt@kms_big_fb@linear-8bpp-rotate-270
+igt@kms_big_fb@linear-16bpp-rotate-0
+igt@kms_big_fb@linear-16bpp-rotate-90
+igt@kms_big_fb@linear-16bpp-rotate-180
+igt@kms_big_fb@linear-16bpp-rotate-270
+igt@kms_big_fb@linear-32bpp-rotate-0
+igt@kms_big_fb@linear-32bpp-rotate-90
+igt@kms_big_fb@linear-32bpp-rotate-180
+igt@kms_big_fb@linear-32bpp-rotate-270
+igt@kms_big_fb@linear-64bpp-rotate-0
+igt@kms_big_fb@linear-64bpp-rotate-90
+igt@kms_big_fb@linear-64bpp-rotate-180
+igt@kms_big_fb@linear-64bpp-rotate-270
+igt@kms_big_fb@linear-addfb
+igt@kms_big_fb@x-tiled-8bpp-rotate-0
+igt@kms_big_fb@x-tiled-8bpp-rotate-90
+igt@kms_big_fb@x-tiled-8bpp-rotate-180
+igt@kms_big_fb@x-tiled-8bpp-rotate-270
+igt@kms_big_fb@x-tiled-16bpp-rotate-0
+igt@kms_big_fb@x-tiled-16bpp-rotate-90
+igt@kms_big_fb@x-tiled-16bpp-rotate-180
+igt@kms_big_fb@x-tiled-16bpp-rotate-270
+igt@kms_big_fb@x-tiled-32bpp-rotate-0
+igt@kms_big_fb@x-tiled-32bpp-rotate-90
+igt@kms_big_fb@x-tiled-32bpp-rotate-180
+igt@kms_big_fb@x-tiled-32bpp-rotate-270
+igt@kms_big_fb@x-tiled-64bpp-rotate-0
+igt@kms_big_fb@x-tiled-64bpp-rotate-90
+igt@kms_big_fb@x-tiled-64bpp-rotate-180
+igt@kms_big_fb@x-tiled-64bpp-rotate-270
+igt@kms_big_fb@x-tiled-addfb
+igt@kms_big_fb@x-tiled-addfb-size-offset-overflow
+igt@kms_big_fb@x-tiled-addfb-size-overflow
+igt@kms_big_fb@yf-tiled-8bpp-rotate-0
+igt@kms_big_fb@yf-tiled-8bpp-rotate-90
+igt@kms_big_fb@yf-tiled-8bpp-rotate-180
+igt@kms_big_fb@yf-tiled-8bpp-rotate-270
+igt@kms_big_fb@yf-tiled-16bpp-rotate-0
+igt@kms_big_fb@yf-tiled-16bpp-rotate-90
+igt@kms_big_fb@yf-tiled-16bpp-rotate-180
+igt@kms_big_fb@yf-tiled-16bpp-rotate-270
+igt@kms_big_fb@yf-tiled-32bpp-rotate-0
+igt@kms_big_fb@yf-tiled-32bpp-rotate-90
+igt@kms_big_fb@yf-tiled-32bpp-rotate-180
+igt@kms_big_fb@yf-tiled-32bpp-rotate-270
+igt@kms_big_fb@yf-tiled-64bpp-rotate-0
+igt@kms_big_fb@yf-tiled-64bpp-rotate-90
+igt@kms_big_fb@yf-tiled-64bpp-rotate-180
+igt@kms_big_fb@yf-tiled-64bpp-rotate-270
+igt@kms_big_fb@yf-tiled-addfb
+igt@kms_big_fb@yf-tiled-addfb-size-offset-overflow
+igt@kms_big_fb@yf-tiled-addfb-size-overflow
+igt@kms_big_fb@y-tiled-8bpp-rotate-0
+igt@kms_big_fb@y-tiled-8bpp-rotate-90
+igt@kms_big_fb@y-tiled-8bpp-rotate-180
+igt@kms_big_fb@y-tiled-8bpp-rotate-270
+igt@kms_big_fb@y-tiled-16bpp-rotate-0
+igt@kms_big_fb@y-tiled-16bpp-rotate-90
+igt@kms_big_fb@y-tiled-16bpp-rotate-180
+igt@kms_big_fb@y-tiled-16bpp-rotate-270
+igt@kms_big_fb@y-tiled-32bpp-rotate-0
+igt@kms_big_fb@y-tiled-32bpp-rotate-90
+igt@kms_big_fb@y-tiled-32bpp-rotate-180
+igt@kms_big_fb@y-tiled-32bpp-rotate-270
+igt@kms_big_fb@y-tiled-64bpp-rotate-0
+igt@kms_big_fb@y-tiled-64bpp-rotate-90
+igt@kms_big_fb@y-tiled-64bpp-rotate-180
+igt@kms_big_fb@y-tiled-64bpp-rotate-270
+igt@kms_big_fb@y-tiled-addfb
+igt@kms_big_fb@y-tiled-addfb-size-offset-overflow
+igt@kms_big_fb@y-tiled-addfb-size-overflow
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2966/
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 9+ messages in thread
* [igt-dev] ✗ Fi.CI.IGT: failure for tests/kms_big_fb: Make sure huge fbs work correctly (rev3)
2019-05-08 16:29 [igt-dev] [PATCH i-g-t v3] tests/kms_big_fb: Make sure huge fbs work correctly Ville Syrjala
` (4 preceding siblings ...)
2019-05-10 17:11 ` [igt-dev] ✓ Fi.CI.BAT: success for tests/kms_big_fb: Make sure huge fbs work correctly (rev3) Patchwork
@ 2019-05-10 20:40 ` Patchwork
5 siblings, 0 replies; 9+ messages in thread
From: Patchwork @ 2019-05-10 20:40 UTC (permalink / raw)
To: Ville Syrjala; +Cc: igt-dev
== Series Details ==
Series: tests/kms_big_fb: Make sure huge fbs work correctly (rev3)
URL : https://patchwork.freedesktop.org/series/49494/
State : failure
== Summary ==
CI Bug Log - changes from IGT_4981_full -> IGTPW_2966_full
====================================================
Summary
-------
**FAILURE**
Serious unknown changes coming with IGTPW_2966_full absolutely need to be
verified manually.
If you think the reported changes have nothing to do with the changes
introduced in IGTPW_2966_full, please notify your bug team to allow them
to document this new failure mode, which will reduce false positives in CI.
External URL: https://patchwork.freedesktop.org/api/1.0/series/49494/revisions/3/mbox/
Possible new issues
-------------------
Here are the unknown changes that may have been introduced in IGTPW_2966_full:
### IGT changes ###
#### Possible regressions ####
* {igt@kms_big_fb@x-tiled-32bpp-rotate-90} (NEW):
- shard-iclb: NOTRUN -> [SKIP][1] +30 similar issues
[1]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2966/shard-iclb5/igt@kms_big_fb@x-tiled-32bpp-rotate-90.html
* {igt@kms_big_fb@y-tiled-64bpp-rotate-0} (NEW):
- shard-iclb: NOTRUN -> [FAIL][2] +11 similar issues
[2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2966/shard-iclb1/igt@kms_big_fb@y-tiled-64bpp-rotate-0.html
New tests
---------
New tests have been introduced between IGT_4981_full and IGTPW_2966_full:
### New IGT tests (74) ###
* igt@kms_big_fb@linear-16bpp-rotate-0:
- Statuses : 6 pass(s)
- Exec time: [1.32, 1.85] s
* igt@kms_big_fb@linear-16bpp-rotate-180:
- Statuses : 6 pass(s)
- Exec time: [1.25, 3.73] s
* igt@kms_big_fb@linear-16bpp-rotate-270:
- Statuses : 6 skip(s)
- Exec time: [0.40, 2.81] s
* igt@kms_big_fb@linear-16bpp-rotate-90:
- Statuses : 6 skip(s)
- Exec time: [0.41, 2.84] s
* igt@kms_big_fb@linear-32bpp-rotate-0:
- Statuses : 6 pass(s)
- Exec time: [1.43, 2.02] s
* igt@kms_big_fb@linear-32bpp-rotate-180:
- Statuses : 6 pass(s)
- Exec time: [1.30, 2.0] s
* igt@kms_big_fb@linear-32bpp-rotate-270:
- Statuses : 6 skip(s)
- Exec time: [0.49, 2.91] s
* igt@kms_big_fb@linear-32bpp-rotate-90:
- Statuses : 6 skip(s)
- Exec time: [0.48, 2.88] s
* igt@kms_big_fb@linear-64bpp-rotate-0:
- Statuses : 1 fail(s) 3 skip(s)
- Exec time: [0.0, 0.01] s
* igt@kms_big_fb@linear-64bpp-rotate-180:
- Statuses : 1 fail(s) 5 skip(s)
- Exec time: [0.0, 0.11] s
* igt@kms_big_fb@linear-64bpp-rotate-270:
- Statuses : 1 fail(s) 5 skip(s)
- Exec time: [0.0, 0.17] s
* igt@kms_big_fb@linear-64bpp-rotate-90:
- Statuses : 1 fail(s) 5 skip(s)
- Exec time: [0.0, 0.11] s
* igt@kms_big_fb@linear-8bpp-rotate-0:
- Statuses : 6 skip(s)
- Exec time: [0.0] s
* igt@kms_big_fb@linear-8bpp-rotate-180:
- Statuses : 6 skip(s)
- Exec time: [0.0] s
* igt@kms_big_fb@linear-8bpp-rotate-270:
- Statuses : 6 skip(s)
- Exec time: [0.0] s
* igt@kms_big_fb@linear-8bpp-rotate-90:
- Statuses : 6 skip(s)
- Exec time: [0.0] s
* igt@kms_big_fb@linear-addfb:
- Statuses : 6 pass(s)
- Exec time: [0.0] s
* igt@kms_big_fb@x-tiled-16bpp-rotate-0:
- Statuses : 6 pass(s)
- Exec time: [1.33, 1.80] s
* igt@kms_big_fb@x-tiled-16bpp-rotate-180:
- Statuses : 6 pass(s)
- Exec time: [1.22, 3.28] s
* igt@kms_big_fb@x-tiled-16bpp-rotate-270:
- Statuses : 6 skip(s)
- Exec time: [0.34, 2.80] s
* igt@kms_big_fb@x-tiled-16bpp-rotate-90:
- Statuses : 6 skip(s)
- Exec time: [0.40, 2.80] s
* igt@kms_big_fb@x-tiled-32bpp-rotate-0:
- Statuses : 6 pass(s)
- Exec time: [1.29, 1.98] s
* igt@kms_big_fb@x-tiled-32bpp-rotate-180:
- Statuses : 5 pass(s)
- Exec time: [1.42, 1.95] s
* igt@kms_big_fb@x-tiled-32bpp-rotate-270:
- Statuses : 6 skip(s)
- Exec time: [0.42, 2.85] s
* igt@kms_big_fb@x-tiled-32bpp-rotate-90:
- Statuses : 6 skip(s)
- Exec time: [0.51, 2.96] s
* igt@kms_big_fb@x-tiled-64bpp-rotate-0:
- Statuses : 1 fail(s) 4 skip(s)
- Exec time: [0.0, 1.06] s
* igt@kms_big_fb@x-tiled-64bpp-rotate-180:
- Statuses : 1 fail(s) 5 skip(s)
- Exec time: [0.0, 0.16] s
* igt@kms_big_fb@x-tiled-64bpp-rotate-270:
- Statuses : 1 fail(s) 5 skip(s)
- Exec time: [0.0, 0.16] s
* igt@kms_big_fb@x-tiled-64bpp-rotate-90:
- Statuses : 1 fail(s) 5 skip(s)
- Exec time: [0.0, 1.07] s
* igt@kms_big_fb@x-tiled-8bpp-rotate-0:
- Statuses : 6 skip(s)
- Exec time: [0.0] s
* igt@kms_big_fb@x-tiled-8bpp-rotate-180:
- Statuses : 6 skip(s)
- Exec time: [0.0] s
* igt@kms_big_fb@x-tiled-8bpp-rotate-270:
- Statuses : 5 skip(s)
- Exec time: [0.0] s
* igt@kms_big_fb@x-tiled-8bpp-rotate-90:
- Statuses : 6 skip(s)
- Exec time: [0.0] s
* igt@kms_big_fb@x-tiled-addfb:
- Statuses : 6 pass(s)
- Exec time: [0.0] s
* igt@kms_big_fb@x-tiled-addfb-size-offset-overflow:
- Statuses : 3 pass(s) 3 skip(s)
- Exec time: [0.0] s
* igt@kms_big_fb@x-tiled-addfb-size-overflow:
- Statuses : 6 skip(s)
- Exec time: [0.0] s
* igt@kms_big_fb@y-tiled-16bpp-rotate-0:
- Statuses : 4 pass(s) 2 skip(s)
- Exec time: [0.0, 1.82] s
* igt@kms_big_fb@y-tiled-16bpp-rotate-180:
- Statuses : 4 pass(s) 2 skip(s)
- Exec time: [0.0, 3.41] s
* igt@kms_big_fb@y-tiled-16bpp-rotate-270:
- Statuses : 1 pass(s) 5 skip(s)
- Exec time: [0.0, 1.56] s
* igt@kms_big_fb@y-tiled-16bpp-rotate-90:
- Statuses : 1 pass(s) 5 skip(s)
- Exec time: [0.0, 1.66] s
* igt@kms_big_fb@y-tiled-32bpp-rotate-0:
- Statuses : 4 pass(s) 2 skip(s)
- Exec time: [0.0, 2.00] s
* igt@kms_big_fb@y-tiled-32bpp-rotate-180:
- Statuses : 4 pass(s) 2 skip(s)
- Exec time: [0.0, 2.00] s
* igt@kms_big_fb@y-tiled-32bpp-rotate-270:
- Statuses : 4 pass(s) 2 skip(s)
- Exec time: [0.0, 3.48] s
* igt@kms_big_fb@y-tiled-32bpp-rotate-90:
- Statuses : 4 pass(s) 2 skip(s)
- Exec time: [0.0, 2.06] s
* igt@kms_big_fb@y-tiled-64bpp-rotate-0:
- Statuses : 1 fail(s) 5 skip(s)
- Exec time: [0.0, 0.14] s
* igt@kms_big_fb@y-tiled-64bpp-rotate-180:
- Statuses : 1 fail(s) 4 skip(s)
- Exec time: [0.0, 0.90] s
* igt@kms_big_fb@y-tiled-64bpp-rotate-270:
- Statuses : 1 fail(s) 4 skip(s)
- Exec time: [0.0, 1.06] s
* igt@kms_big_fb@y-tiled-64bpp-rotate-90:
- Statuses : 1 fail(s) 5 skip(s)
- Exec time: [0.0, 0.16] s
* igt@kms_big_fb@y-tiled-8bpp-rotate-0:
- Statuses : 6 skip(s)
- Exec time: [0.0] s
* igt@kms_big_fb@y-tiled-8bpp-rotate-180:
- Statuses : 6 skip(s)
- Exec time: [0.0] s
* igt@kms_big_fb@y-tiled-8bpp-rotate-270:
- Statuses : 6 skip(s)
- Exec time: [0.0] s
* igt@kms_big_fb@y-tiled-8bpp-rotate-90:
- Statuses : 6 skip(s)
- Exec time: [0.0] s
* igt@kms_big_fb@y-tiled-addfb:
- Statuses : 4 pass(s) 1 skip(s)
- Exec time: [0.0, 0.00] s
* igt@kms_big_fb@y-tiled-addfb-size-offset-overflow:
- Statuses : 3 pass(s) 2 skip(s)
- Exec time: [0.0] s
* igt@kms_big_fb@y-tiled-addfb-size-overflow:
- Statuses : 6 skip(s)
- Exec time: [0.0] s
* igt@kms_big_fb@yf-tiled-16bpp-rotate-0:
- Statuses : 4 pass(s) 2 skip(s)
- Exec time: [0.0, 1.81] s
* igt@kms_big_fb@yf-tiled-16bpp-rotate-180:
- Statuses : 4 pass(s) 2 skip(s)
- Exec time: [0.0, 1.83] s
* igt@kms_big_fb@yf-tiled-16bpp-rotate-270:
- Statuses : 1 pass(s) 5 skip(s)
- Exec time: [0.0, 1.68] s
* igt@kms_big_fb@yf-tiled-16bpp-rotate-90:
- Statuses : 1 pass(s) 5 skip(s)
- Exec time: [0.0, 1.66] s
* igt@kms_big_fb@yf-tiled-32bpp-rotate-0:
- Statuses : 4 pass(s) 2 skip(s)
- Exec time: [0.0, 2.0] s
* igt@kms_big_fb@yf-tiled-32bpp-rotate-180:
- Statuses : 4 pass(s) 2 skip(s)
- Exec time: [0.0, 1.98] s
* igt@kms_big_fb@yf-tiled-32bpp-rotate-270:
- Statuses : 4 pass(s) 2 skip(s)
- Exec time: [0.0, 2.04] s
* igt@kms_big_fb@yf-tiled-32bpp-rotate-90:
- Statuses : 4 pass(s) 2 skip(s)
- Exec time: [0.0, 2.12] s
* igt@kms_big_fb@yf-tiled-64bpp-rotate-0:
- Statuses : 5 skip(s)
- Exec time: [0.0] s
* igt@kms_big_fb@yf-tiled-64bpp-rotate-180:
- Statuses : 6 skip(s)
- Exec time: [0.0] s
* igt@kms_big_fb@yf-tiled-64bpp-rotate-270:
- Statuses : 6 skip(s)
- Exec time: [0.0] s
* igt@kms_big_fb@yf-tiled-64bpp-rotate-90:
- Statuses : 6 skip(s)
- Exec time: [0.0] s
* igt@kms_big_fb@yf-tiled-8bpp-rotate-0:
- Statuses : 6 skip(s)
- Exec time: [0.0] s
* igt@kms_big_fb@yf-tiled-8bpp-rotate-180:
- Statuses : 6 skip(s)
- Exec time: [0.0] s
* igt@kms_big_fb@yf-tiled-8bpp-rotate-270:
- Statuses : 6 skip(s)
- Exec time: [0.0] s
* igt@kms_big_fb@yf-tiled-8bpp-rotate-90:
- Statuses : 6 skip(s)
- Exec time: [0.0] s
* igt@kms_big_fb@yf-tiled-addfb:
- Statuses : 4 pass(s) 2 skip(s)
- Exec time: [0.0] s
* igt@kms_big_fb@yf-tiled-addfb-size-offset-overflow:
- Statuses : 3 pass(s) 3 skip(s)
- Exec time: [0.0] s
* igt@kms_big_fb@yf-tiled-addfb-size-overflow:
- Statuses : 6 skip(s)
- Exec time: [0.0] s
Known issues
------------
Here are the changes found in IGTPW_2966_full that come from known issues:
### IGT changes ###
#### Issues hit ####
* igt@gem_pwrite@small-cpu-fbr:
- shard-glk: [PASS][3] -> [INCOMPLETE][4] ([fdo#103359] / [k.org#198133])
[3]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_4981/shard-glk7/igt@gem_pwrite@small-cpu-fbr.html
[4]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2966/shard-glk2/igt@gem_pwrite@small-cpu-fbr.html
* igt@gem_tiled_swapping@non-threaded:
- shard-hsw: [PASS][5] -> [FAIL][6] ([fdo#108686])
[5]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_4981/shard-hsw7/igt@gem_tiled_swapping@non-threaded.html
[6]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2966/shard-hsw1/igt@gem_tiled_swapping@non-threaded.html
* igt@kms_dp_dsc@basic-dsc-enable-edp:
- shard-iclb: [PASS][7] -> [SKIP][8] ([fdo#109349])
[7]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_4981/shard-iclb2/igt@kms_dp_dsc@basic-dsc-enable-edp.html
[8]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2966/shard-iclb8/igt@kms_dp_dsc@basic-dsc-enable-edp.html
* igt@kms_frontbuffer_tracking@fbc-1p-primscrn-cur-indfb-draw-mmap-wc:
- shard-kbl: [PASS][9] -> [FAIL][10] ([fdo#103167])
[9]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_4981/shard-kbl4/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-cur-indfb-draw-mmap-wc.html
[10]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2966/shard-kbl6/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-cur-indfb-draw-mmap-wc.html
- shard-apl: [PASS][11] -> [FAIL][12] ([fdo#103167])
[11]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_4981/shard-apl2/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-cur-indfb-draw-mmap-wc.html
[12]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2966/shard-apl8/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-cur-indfb-draw-mmap-wc.html
* igt@kms_frontbuffer_tracking@fbc-badstride:
- shard-iclb: [PASS][13] -> [FAIL][14] ([fdo#103167]) +1 similar issue
[13]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_4981/shard-iclb7/igt@kms_frontbuffer_tracking@fbc-badstride.html
[14]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2966/shard-iclb8/igt@kms_frontbuffer_tracking@fbc-badstride.html
* igt@kms_plane@plane-panning-bottom-right-suspend-pipe-c-planes:
- shard-kbl: [PASS][15] -> [INCOMPLETE][16] ([fdo#103665])
[15]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_4981/shard-kbl1/igt@kms_plane@plane-panning-bottom-right-suspend-pipe-c-planes.html
[16]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2966/shard-kbl4/igt@kms_plane@plane-panning-bottom-right-suspend-pipe-c-planes.html
* igt@kms_psr2_su@page_flip:
- shard-iclb: [PASS][17] -> [SKIP][18] ([fdo#109642])
[17]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_4981/shard-iclb2/igt@kms_psr2_su@page_flip.html
[18]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2966/shard-iclb5/igt@kms_psr2_su@page_flip.html
* igt@kms_sysfs_edid_timing:
- shard-iclb: [PASS][19] -> [FAIL][20] ([fdo#100047])
[19]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_4981/shard-iclb8/igt@kms_sysfs_edid_timing.html
[20]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2966/shard-iclb2/igt@kms_sysfs_edid_timing.html
* igt@kms_vblank@pipe-c-ts-continuation-suspend:
- shard-apl: [PASS][21] -> [DMESG-WARN][22] ([fdo#108566]) +8 similar issues
[21]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_4981/shard-apl3/igt@kms_vblank@pipe-c-ts-continuation-suspend.html
[22]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2966/shard-apl4/igt@kms_vblank@pipe-c-ts-continuation-suspend.html
* igt@tools_test@tools_test:
- shard-iclb: [PASS][23] -> [SKIP][24] ([fdo#109352])
[23]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_4981/shard-iclb8/igt@tools_test@tools_test.html
[24]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2966/shard-iclb3/igt@tools_test@tools_test.html
#### Possible fixes ####
* igt@i915_selftest@live_hangcheck:
- shard-iclb: [INCOMPLETE][25] ([fdo#107713] / [fdo#108569]) -> [PASS][26]
[25]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_4981/shard-iclb4/igt@i915_selftest@live_hangcheck.html
[26]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2966/shard-iclb6/igt@i915_selftest@live_hangcheck.html
* igt@kms_cursor_crc@cursor-256x85-sliding:
- shard-hsw: [INCOMPLETE][27] ([fdo#103540]) -> [PASS][28]
[27]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_4981/shard-hsw1/igt@kms_cursor_crc@cursor-256x85-sliding.html
[28]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2966/shard-hsw6/igt@kms_cursor_crc@cursor-256x85-sliding.html
* igt@kms_flip@flip-vs-expired-vblank:
- shard-glk: [FAIL][29] ([fdo#102887] / [fdo#105363]) -> [PASS][30]
[29]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_4981/shard-glk3/igt@kms_flip@flip-vs-expired-vblank.html
[30]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2966/shard-glk7/igt@kms_flip@flip-vs-expired-vblank.html
* igt@kms_flip@flip-vs-suspend-interruptible:
- shard-glk: [INCOMPLETE][31] ([fdo#103359] / [k.org#198133]) -> [PASS][32]
[31]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_4981/shard-glk8/igt@kms_flip@flip-vs-suspend-interruptible.html
[32]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2966/shard-glk1/igt@kms_flip@flip-vs-suspend-interruptible.html
* igt@kms_frontbuffer_tracking@fbc-2p-primscrn-cur-indfb-draw-pwrite:
- shard-glk: [FAIL][33] ([fdo#103167]) -> [PASS][34]
[33]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_4981/shard-glk5/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-cur-indfb-draw-pwrite.html
[34]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2966/shard-glk3/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-cur-indfb-draw-pwrite.html
* igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-pri-shrfb-draw-pwrite:
- shard-iclb: [FAIL][35] ([fdo#103167]) -> [PASS][36] +6 similar issues
[35]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_4981/shard-iclb4/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-pri-shrfb-draw-pwrite.html
[36]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2966/shard-iclb7/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-pri-shrfb-draw-pwrite.html
* igt@kms_psr@psr2_basic:
- shard-iclb: [SKIP][37] ([fdo#109441]) -> [PASS][38] +1 similar issue
[37]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_4981/shard-iclb1/igt@kms_psr@psr2_basic.html
[38]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2966/shard-iclb2/igt@kms_psr@psr2_basic.html
* igt@kms_setmode@basic:
- shard-apl: [FAIL][39] ([fdo#99912]) -> [PASS][40]
[39]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_4981/shard-apl5/igt@kms_setmode@basic.html
[40]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2966/shard-apl5/igt@kms_setmode@basic.html
- shard-kbl: [FAIL][41] ([fdo#99912]) -> [PASS][42]
[41]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_4981/shard-kbl6/igt@kms_setmode@basic.html
[42]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2966/shard-kbl3/igt@kms_setmode@basic.html
* igt@kms_vblank@pipe-a-ts-continuation-suspend:
- shard-apl: [DMESG-WARN][43] ([fdo#108566]) -> [PASS][44] +2 similar issues
[43]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_4981/shard-apl5/igt@kms_vblank@pipe-a-ts-continuation-suspend.html
[44]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2966/shard-apl8/igt@kms_vblank@pipe-a-ts-continuation-suspend.html
* igt@perf@short-reads:
- shard-kbl: [FAIL][45] ([fdo#103183]) -> [PASS][46]
[45]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_4981/shard-kbl3/igt@perf@short-reads.html
[46]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2966/shard-kbl1/igt@perf@short-reads.html
* igt@perf_pmu@rc6:
- shard-kbl: [SKIP][47] ([fdo#109271]) -> [PASS][48]
[47]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_4981/shard-kbl1/igt@perf_pmu@rc6.html
[48]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2966/shard-kbl1/igt@perf_pmu@rc6.html
{name}: This element is suppressed. This means it is ignored when computing
the status of the difference (SUCCESS, WARNING, or FAILURE).
[fdo#100047]: https://bugs.freedesktop.org/show_bug.cgi?id=100047
[fdo#102887]: https://bugs.freedesktop.org/show_bug.cgi?id=102887
[fdo#103167]: https://bugs.freedesktop.org/show_bug.cgi?id=103167
[fdo#103183]: https://bugs.freedesktop.org/show_bug.cgi?id=103183
[fdo#103359]: https://bugs.freedesktop.org/show_bug.cgi?id=103359
[fdo#103540]: https://bugs.freedesktop.org/show_bug.cgi?id=103540
[fdo#103665]: https://bugs.freedesktop.org/show_bug.cgi?id=103665
[fdo#105363]: https://bugs.freedesktop.org/show_bug.cgi?id=105363
[fdo#107713]: https://bugs.freedesktop.org/show_bug.cgi?id=107713
[fdo#108566]: https://bugs.freedesktop.org/show_bug.cgi?id=108566
[fdo#108569]: https://bugs.freedesktop.org/show_bug.cgi?id=108569
[fdo#108686]: https://bugs.freedesktop.org/show_bug.cgi?id=108686
[fdo#109271]: https://bugs.freedesktop.org/show_bug.cgi?id=109271
[fdo#109349]: https://bugs.freedesktop.org/show_bug.cgi?id=109349
[fdo#109352]: https://bugs.freedesktop.org/show_bug.cgi?id=109352
[fdo#109441]: https://bugs.freedesktop.org/show_bug.cgi?id=109441
[fdo#109642]: https://bugs.freedesktop.org/show_bug.cgi?id=109642
[fdo#99912]: https://bugs.freedesktop.org/show_bug.cgi?id=99912
[k.org#198133]: https://bugzilla.kernel.org/show_bug.cgi?id=198133
Participating hosts (7 -> 6)
------------------------------
Missing (1): shard-skl
Build changes
-------------
* IGT: IGT_4981 -> IGTPW_2966
CI_DRM_6073: c059ddabfe60a5072ace44a34a9de9b4202df6ec @ git://anongit.freedesktop.org/gfx-ci/linux
IGTPW_2966: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2966/
IGT_4981: 709bd6869e2aff01a67eef729f9dc330f404387e @ git://anongit.freedesktop.org/xorg/app/intel-gpu-tools
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2966/
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2019-05-10 20:40 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-05-08 16:29 [igt-dev] [PATCH i-g-t v3] tests/kms_big_fb: Make sure huge fbs work correctly Ville Syrjala
2019-05-08 17:01 ` [igt-dev] ✓ Fi.CI.BAT: success for tests/kms_big_fb: Make sure huge fbs work correctly (rev2) Patchwork
2019-05-08 20:07 ` [igt-dev] ✗ Fi.CI.IGT: failure " Patchwork
2019-05-10 8:53 ` [igt-dev] [PATCH i-g-t v3] tests/kms_big_fb: Make sure huge fbs work correctly Daniel Vetter
2019-05-10 8:55 ` Daniel Vetter
2019-05-10 12:31 ` Ville Syrjälä
2019-05-10 16:23 ` [igt-dev] [PATCH i-g-t v4] " Ville Syrjala
2019-05-10 17:11 ` [igt-dev] ✓ Fi.CI.BAT: success for tests/kms_big_fb: Make sure huge fbs work correctly (rev3) Patchwork
2019-05-10 20:40 ` [igt-dev] ✗ Fi.CI.IGT: failure " Patchwork
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox