@@ -29,11 +29,13 @@
#include <i915_drm.h>
#include "igt_core.h"
+#include "drmtest.h"
#include "igt_dummyload.h"
#include "igt_gt.h"
#include "intel_chipset.h"
#include "intel_reg.h"
#include "ioctl_wrappers.h"
+#include "igt_vgem.h"
/**
* SECTION:igt_dummyload
@@ -300,3 +302,59 @@ void igt_terminate_spin_batches(void)
igt_list_for_each(iter, &spin_list, link)
igt_spin_batch_end(iter);
}
+
+/**
+ * igt_cork_plug:
+ * @fd: open drm file descriptor
+ * @cork: structure that will be filled with the state of the cork bo
+ *
+ * Imports a vgem bo with a fence attached to it. This bo can be used as a
+ * dependency during submission to stall execution until the fence is signaled.
+ * The parameters required to unblock the execution and to cleanup are stored in
+ * the provided cork structure.
+ *
+ * Returns:
+ * Handle of the imported BO.
+ */
+uint32_t igt_cork_plug(int fd, struct igt_cork *cork)
+{
+ struct vgem_bo bo;
+ int dmabuf;
+ uint32_t handle;
+
+ igt_assert(cork);
+
+ cork->device = drm_open_driver(DRIVER_VGEM);
+
+ igt_require(vgem_has_fences(cork->device));
+
+ bo.width = bo.height = 1;
+ bo.bpp = 4;
+ vgem_create(cork->device, &bo);
+ cork->fence = vgem_fence_attach(cork->device, &bo, VGEM_FENCE_WRITE);
+
+ dmabuf = prime_handle_to_fd(cork->device, bo.handle);
+ handle = prime_fd_to_handle(fd, dmabuf);
+ close(dmabuf);
+
+ return handle;
+}
+
+/**
+ * igt_cork_unplug:
+ * @cork: cork state from igt_cork_plug()
+ *
+ * This function unblocks the execution by signaling the fence attached to the
+ * imported bo and does the necessary post-processing.
+ * NOTE: the imported bo handle returned by igt_cork_plug is not closed during
+ * this phase.
+ */
+void igt_cork_unplug(struct igt_cork *cork)
+{
+ if (!cork || !cork->device)
+ return;
+
+ vgem_fence_signal(cork->device, cork->fence);
+ close(cork->device);
+ cork->device = 0;
+}
@@ -51,4 +51,12 @@ void igt_spin_batch_free(int fd, igt_spin_t *spin);
void igt_terminate_spin_batches(void);
+struct igt_cork {
+ int device;
+ uint32_t fence;
+};
+
+uint32_t igt_cork_plug(int fd, struct igt_cork *cork);
+void igt_cork_unplug(struct igt_cork *cork);
+
#endif /* __IGT_DUMMYLOAD_H__ */
The "cork" bo (imported bo with attached fence) is used in several tests to stall execution. Moving it to a common place makes the codebase cleaner. Note that the actual test updates is done in follow up patches as it is simpler to do in one go after one more common function is added in the next patch. v2: don't use new/free naming, don't use dynamic alloc (Chris) Signed-off-by: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com> Cc: Chris Wilson <chris@chris-wilson.co.uk> --- lib/igt_dummyload.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++ lib/igt_dummyload.h | 8 ++++++++ 2 files changed, 66 insertions(+)