All of lore.kernel.org
 help / color / mirror / Atom feed
From: Boris Brezillon <boris.brezillon@collabora.com>
To: Rob Herring <robh+dt@kernel.org>,
	Tomeu Vizoso <tomeu.vizoso@collabora.com>,
	Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>,
	Steven Price <steven.price@arm.com>,
	Robin Murphy <robin.murphy@arm.com>
Cc: igt-dev@lists.freedesktop.org, Petri Latvala <petri.latvala@intel.com>
Subject: [igt-dev] [PATCH v2 3/8] lib/panfrost: Add a helper to create a job loop
Date: Tue, 22 Jun 2021 11:02:16 +0200	[thread overview]
Message-ID: <20210622090221.1741111-4-boris.brezillon@collabora.com> (raw)
In-Reply-To: <20210622090221.1741111-1-boris.brezillon@collabora.com>

Useful to trigger job timeouts and test the kernel driver timeout
handling logic.

v2:
* Add comments explaining how the job loop is formed
* Add a helper to retrieve job headers

Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
---
 lib/igt_panfrost.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++
 lib/igt_panfrost.h |  4 +++
 2 files changed, 81 insertions(+)

diff --git a/lib/igt_panfrost.c b/lib/igt_panfrost.c
index 4bbb5ddf4076..5b65537b7ced 100644
--- a/lib/igt_panfrost.c
+++ b/lib/igt_panfrost.c
@@ -130,6 +130,83 @@ void igt_panfrost_bo_mmap(int fd, struct panfrost_bo *bo)
         igt_assert(bo->map);
 }
 
+struct mali_job_descriptor_header *
+igt_panfrost_job_loop_get_job_header(struct panfrost_submit *submit,
+                                     unsigned job_idx)
+{
+        unsigned job_offset = ALIGN(sizeof(struct mali_job_descriptor_header) +
+                                    sizeof(struct mali_payload_set_value),
+                                    64) *
+                              job_idx;
+
+        igt_assert(job_idx <= 1);
+
+        return submit->submit_bo->map + job_offset;
+}
+
+struct panfrost_submit *igt_panfrost_job_loop(int fd)
+{
+        /* We create 2 WRITE_VALUE jobs pointing to each other to form a loop.
+         * Each WRITE_VALUE job resets the ->exception_status field of the
+         * other job to allow re-execution (if we don't do that we end up with
+         * an INVALID_DATA fault on the second execution).
+         */
+        struct panfrost_submit *submit;
+        struct mali_job_descriptor_header header = {
+                .job_type = JOB_TYPE_SET_VALUE,
+                .job_barrier = 1,
+                .unknown_flags = 5,
+                .job_index = 1,
+                .job_descriptor_size = 1,
+        };
+
+        /* .unknow = 3 means write 0 at the address specified in .out */
+        struct mali_payload_set_value payload = {
+                .unknown = 3,
+        };
+        uint32_t *bos;
+        unsigned job1_offset = ALIGN(sizeof(header) + sizeof(payload), 64);
+        unsigned job0_offset = 0;
+
+        submit = malloc(sizeof(*submit));
+	memset(submit, 0, sizeof(*submit));
+
+        submit->submit_bo = igt_panfrost_gem_new(fd, ALIGN(sizeof(header) + sizeof(payload), 64) * 2);
+        igt_panfrost_bo_mmap(fd, submit->submit_bo);
+
+        /* Job 0 points to job 1 and has its WRITE_VALUE pointer pointing to
+         * job 1 execption_status field.
+         */
+        header.next_job_64 = submit->submit_bo->offset + job1_offset;
+        payload.out = submit->submit_bo->offset + job1_offset +
+                      offsetof(struct mali_job_descriptor_header, exception_status);
+        memcpy(submit->submit_bo->map + job0_offset, &header, sizeof(header));
+        memcpy(submit->submit_bo->map + job0_offset + sizeof(header), &payload, sizeof(payload));
+
+        /* Job 1 points to job 0 and has its WRITE_VALUE pointer pointing to
+         * job 0 execption_status field.
+         */
+        header.next_job_64 = submit->submit_bo->offset + job0_offset;
+        payload.out = submit->submit_bo->offset + job0_offset +
+                      offsetof(struct mali_job_descriptor_header, exception_status);
+        memcpy(submit->submit_bo->map + job1_offset, &header, sizeof(header));
+        memcpy(submit->submit_bo->map + job1_offset + sizeof(header), &payload, sizeof(payload));
+
+        submit->args = malloc(sizeof(*submit->args));
+        memset(submit->args, 0, sizeof(*submit->args));
+        submit->args->jc = submit->submit_bo->offset;
+
+        bos = malloc(sizeof(*bos) * 1);
+        bos[0] = submit->submit_bo->handle;
+
+        submit->args->bo_handles = to_user_pointer(bos);
+        submit->args->bo_handle_count = 1;
+
+        igt_assert_eq(drmSyncobjCreate(fd, DRM_SYNCOBJ_CREATE_SIGNALED, &submit->args->out_sync), 0);
+
+        return submit;
+}
+
 struct panfrost_submit *igt_panfrost_trivial_job(int fd, bool do_crash, int width, int height, uint32_t color)
 {
         struct panfrost_submit *submit;
diff --git a/lib/igt_panfrost.h b/lib/igt_panfrost.h
index cc7998dcb4bf..3ab4baf892f3 100644
--- a/lib/igt_panfrost.h
+++ b/lib/igt_panfrost.h
@@ -47,7 +47,11 @@ struct panfrost_submit {
 struct panfrost_bo *igt_panfrost_gem_new(int fd, size_t size);
 void igt_panfrost_free_bo(int fd, struct panfrost_bo *bo);
 
+struct mali_job_descriptor_header *
+igt_panfrost_job_loop_get_job_header(struct panfrost_submit *submit,
+                                     unsigned job_idx);
 struct panfrost_submit *igt_panfrost_trivial_job(int fd, bool do_crash, int width, int height, uint32_t color);
+struct panfrost_submit *igt_panfrost_job_loop(int fd);
 void igt_panfrost_free_job(int fd, struct panfrost_submit *submit);
 
 /* IOCTL wrappers */
-- 
2.31.1

_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev

  parent reply	other threads:[~2021-06-22  9:02 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-06-22  9:02 [igt-dev] [PATCH v2 0/8] tests/panfrost: Misc fixes/improvements Boris Brezillon
2021-06-22  9:02 ` [igt-dev] [PATCH v2 1/8] tests/panfrost: Make sure we open a DUMB capable node for prime tests Boris Brezillon
2021-06-22  9:42   ` Petri Latvala
2021-06-24 14:29     ` Boris Brezillon
2021-06-28  8:00       ` Petri Latvala
2021-06-22  9:02 ` [igt-dev] [PATCH v2 2/8] lib/panfrost: Handle the NULL case in igt_panfrost_free_bo() Boris Brezillon
2021-06-22  9:02 ` Boris Brezillon [this message]
2021-06-22  9:02 ` [igt-dev] [PATCH v2 4/8] lib/panfrost: Add a helper to create a NULL job Boris Brezillon
2021-06-22  9:02 ` [igt-dev] [PATCH v2 5/8] tests/panfrost: Simplify submit tests Boris Brezillon
2021-06-22  9:02 ` [igt-dev] [PATCH v2 6/8] tests/panfrost: Extend the pan-reset test Boris Brezillon
2021-06-22  9:02 ` [igt-dev] [PATCH v2 7/8] lib/panfrost: Get rid of igt_panfrost_trivial_job() Boris Brezillon
2021-06-22  9:02 ` [igt-dev] [PATCH v2 8/8] tests/panfrost: Test FD-close while jobs are still in-flight Boris Brezillon
2021-06-22 13:56 ` [igt-dev] [PATCH v2 0/8] tests/panfrost: Misc fixes/improvements Alyssa Rosenzweig

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210622090221.1741111-4-boris.brezillon@collabora.com \
    --to=boris.brezillon@collabora.com \
    --cc=alyssa.rosenzweig@collabora.com \
    --cc=igt-dev@lists.freedesktop.org \
    --cc=petri.latvala@intel.com \
    --cc=robh+dt@kernel.org \
    --cc=robin.murphy@arm.com \
    --cc=steven.price@arm.com \
    --cc=tomeu.vizoso@collabora.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.