[igt-dev] [PATCH i-g-t 3/3] test/kms_prime: Use drm_open_driver_another
Arkadiusz Hiler
arkadiusz.hiler at intel.com
Mon May 4 07:37:07 UTC 2020
The test now uses dumb buffers explicitly instead of the vgem helpers.
By default the first two devices that are matching provided chipset requirements
are used (ANY + VGEM). This is sensitive to enumeration order, but as long as
there are only two devices it's fine - PRIME will get tested both directions.
IGT-Version: 1.25-g0b58fd8c (x86_64) (Linux: 5.7.0-rc2-CI-CI_DRM_8370+ x86_64)
Starting subtest: basic-crc
Starting dynamic subtest: first-to-second
Test requirement not met in function igt_require_pipe_crc, file ../lib/igt_debugfs.c:522:
Test requirement: fstatat(dir, "crtc-0/crc/control", &stat, 0) == 0
CRCs not supported on this platform
Last errno: 2, No such file or directory
Dynamic subtest first-to-second: SKIP (0,000s)
Starting dynamic subtest: second-to-first
Dynamic subtest second-to-first: SUCCESS (1,779s)
Subtest basic-crc: SUCCESS (2,024s)
In case there are more than two devices you can specify which ones should be
used or force ordering, e.g.:
sys:/sys/devices/pci0000:00/0000:00:02.0
subsystem : pci
drm card : /dev/dri/card0
drm render : /dev/dri/renderD128
vendor : 8086
device : 9A49
sys:/sys/devices/platform/vgem
subsystem : platform
drm card : /dev/dri/card1
drm render : /dev/dri/renderD129
IGT-Version: 1.25-g0b58fd8c (x86_64) (Linux: 5.7.0-rc2-CI-CI_DRM_8370+ x86_64)
Starting subtest: basic-crc
Looking for devices to open using filter 0: sys:/sys/devices/platform/vgem
Filter matched /dev/dri/card1 | /dev/dri/renderD129
Looking for devices to open using filter 1: pci:vendor=Intel
Filter matched /dev/dri/card0 | /dev/dri/renderD128
Starting dynamic subtest: first-to-second
Dynamic subtest first-to-second: SUCCESS (1,978s)
Starting dynamic subtest: second-to-first
Test requirement not met in function igt_require_pipe_crc, file ../lib/igt_debugfs.c:522:
Test requirement: fstatat(dir, "crtc-0/crc/control", &stat, 0) == 0
CRCs not supported on this platform
Last errno: 2, No such file or directory
Dynamic subtest second-to-first: SKIP (0,000s)
Subtest basic-crc: SUCCESS (2,944s)
Cc: Petri Latvala <petri.latvala at intel.com>
Signed-off-by: Arkadiusz Hiler <arkadiusz.hiler at intel.com>
---
tests/kms_prime.c | 107 +++++++++++++++++++++++++++++-----------------
1 file changed, 67 insertions(+), 40 deletions(-)
diff --git a/tests/kms_prime.c b/tests/kms_prime.c
index 3241c514..8cb2ca2a 100644
--- a/tests/kms_prime.c
+++ b/tests/kms_prime.c
@@ -22,12 +22,19 @@
*/
#include "igt.h"
-#include "igt_vgem.h"
+#include "igt_device.h"
#include <sys/ioctl.h>
#include <sys/poll.h>
#include <time.h>
+struct dumb_bo {
+ uint32_t handle;
+ uint32_t width, height;
+ uint32_t bpp, pitch;
+ uint64_t size;
+};
+
struct crc_info {
igt_crc_t crc;
char *str;
@@ -67,23 +74,24 @@ static bool has_prime_export(int fd)
}
static igt_output_t *setup_display(int importer_fd, igt_display_t *display,
- enum pipe pipe)
+ enum pipe *pipe)
{
igt_output_t *output;
+ bool found = false;
- igt_display_require(display, importer_fd);
- igt_skip_on(pipe >= display->n_pipes);
- output = igt_get_single_output_for_pipe(display, pipe);
+ for_each_pipe_with_valid_output(display, *pipe, output) {
+ found = true;
+ break;
+ }
- igt_require_f(output, "No connector found for pipe %s\n",
- kmstest_pipe_name(pipe));
+ igt_require_f(found, "No valid connector/pipe found\n");
igt_display_reset(display);
- igt_output_set_pipe(output, pipe);
+ igt_output_set_pipe(output, *pipe);
return output;
}
-static void prepare_scratch(int exporter_fd, struct vgem_bo *scratch,
+static void prepare_scratch(int exporter_fd, struct dumb_bo *scratch,
drmModeModeInfo *mode, uint32_t color)
{
uint32_t *ptr;
@@ -91,16 +99,27 @@ static void prepare_scratch(int exporter_fd, struct vgem_bo *scratch,
scratch->width = mode->hdisplay;
scratch->height = mode->vdisplay;
scratch->bpp = 32;
- vgem_create(exporter_fd, scratch);
- ptr = vgem_mmap(exporter_fd, scratch, PROT_WRITE);
+ scratch->handle = kmstest_dumb_create(exporter_fd,
+ scratch->width,
+ scratch->height,
+ scratch->bpp,
+ &scratch->pitch,
+ &scratch->size);
+
+
+ ptr = kmstest_dumb_map_buffer(exporter_fd,
+ scratch->handle,
+ scratch->size,
+ PROT_WRITE);
+
for (size_t idx = 0; idx < scratch->size / sizeof(*ptr); ++idx)
ptr[idx] = color;
munmap(ptr, scratch->size);
}
-static void prepare_fb(int importer_fd, struct vgem_bo *scratch, struct igt_fb *fb)
+static void prepare_fb(int importer_fd, struct dumb_bo *scratch, struct igt_fb *fb)
{
enum igt_color_encoding color_encoding = IGT_COLOR_YCBCR_BT709;
enum igt_color_range color_range = IGT_COLOR_YCBCR_LIMITED_RANGE;
@@ -126,6 +145,7 @@ static void import_fb(int importer_fd, struct igt_fb *fb,
DRM_FORMAT_XRGB8888,
handles, pitches, offsets,
&fb->fb_id, 0);
+
igt_assert(ret == 0);
}
@@ -162,19 +182,19 @@ static void test_crc(int exporter_fd, int importer_fd)
igt_display_t display;
igt_output_t *output;
igt_pipe_crc_t *pipe_crc;
- enum pipe pipe = PIPE_A;
+ enum pipe pipe;
struct igt_fb fb;
int dmabuf_fd;
- struct vgem_bo scratch = {}; /* despite the name, it suits for any
- * gem-compatible device
- * TODO: rename
- */
+ struct dumb_bo scratch = {};
+ bool crc_equal;
int i, j;
drmModeModeInfo *mode;
- bool crc_equal = false;
+ igt_device_set_master(importer_fd);
+ igt_require_pipe_crc(importer_fd);
+ igt_display_require(&display, importer_fd);
- output = setup_display(importer_fd, &display, pipe);
+ output = setup_display(importer_fd, &display, &pipe);
mode = igt_output_get_mode(output);
pipe_crc = igt_pipe_crc_new(importer_fd, pipe, INTEL_PIPE_CRC_SOURCE_AUTO);
@@ -188,6 +208,7 @@ static void test_crc(int exporter_fd, int importer_fd)
import_fb(importer_fd, &fb, dmabuf_fd, scratch.pitch);
close(dmabuf_fd);
+
colors[i].prime_crc.name = "prime";
collect_crc_for_fb(importer_fd, &fb, &display, output,
pipe_crc, colors[i].color, &colors[i].prime_crc);
@@ -228,29 +249,35 @@ static void test_crc(int exporter_fd, int importer_fd)
igt_display_fini(&display);
}
-static void run_test_crc(int export_chipset, int import_chipset)
-{
- int importer_fd = -1;
- int exporter_fd = -1;
-
- exporter_fd = drm_open_driver(export_chipset);
- importer_fd = drm_open_driver_master(import_chipset);
-
- igt_require(has_prime_export(exporter_fd));
- igt_require(has_prime_import(importer_fd));
- igt_require_pipe_crc(importer_fd);
-
- test_crc(exporter_fd, importer_fd);
- close(importer_fd);
- close(exporter_fd);
-}
-
igt_main
{
- igt_fixture {
+ igt_fixture
kmstest_set_vt_graphics_mode();
+
+ igt_describe("Make a dumb color buffer, export to another device and"
+ " compare the CRCs with a buffer native to that device");
+ igt_subtest_with_dynamic("basic-crc") {
+ int first_fd = -1;
+ int second_fd = -1;
+
+ /* ANY = anything that is not VGEM */
+ first_fd = __drm_open_driver_another(0, DRIVER_ANY | DRIVER_VGEM);
+ igt_require(first_fd >= 0);
+
+ second_fd = __drm_open_driver_another(1, DRIVER_ANY | DRIVER_VGEM);
+ igt_require(second_fd >= 0);
+
+ if (has_prime_export(first_fd) &&
+ has_prime_import(second_fd))
+ igt_dynamic("first-to-second")
+ test_crc(first_fd, second_fd);
+
+ if (has_prime_import(first_fd) &&
+ has_prime_export(second_fd))
+ igt_dynamic("second-to-first")
+ test_crc(second_fd, first_fd);
+
+ close(first_fd);
+ close(second_fd);
}
- igt_describe("Make a dumb buffer inside vgem, fill it, export to another device and compare the CRC");
- igt_subtest("basic-crc")
- run_test_crc(DRIVER_VGEM, DRIVER_ANY);
}
--
2.25.2
More information about the igt-dev
mailing list