[igt-dev] [PATCH v4 04/14] drm-uapi/xe_drm: Remove MMIO ioctl and align with latest uapi
Rodrigo Vivi
rodrigo.vivi at intel.com
Thu Sep 28 14:36:15 UTC 2023
On Thu, Sep 28, 2023 at 11:05:06AM +0000, Francois Dugast wrote:
> Align with commit ("drm/xe/uapi: Remove MMIO ioctl")
it is probably worth mentioning that the tools/xe_reg that
this patch is removing is useless since tools/intel_reg also
works on Xe. And that the tile addition to tools/intel_reg
should happen regardless of Xe and in a follow-up work.
With this msg,
Reviewed-by: Rodrigo Vivi <rodrigo.vivi at intel.com>
>
> Signed-off-by: Francois Dugast <francois.dugast at intel.com>
> Signed-off-by: Rodrigo Vivi <rodrigo.vivi at intel.com>
> ---
> include/drm-uapi/xe_drm.h | 31 +-
> tests/intel-ci/xe-fast-feedback.testlist | 2 -
> tests/intel/xe_mmio.c | 91 ------
> tests/meson.build | 1 -
> tools/meson.build | 1 -
> tools/xe_reg.c | 366 -----------------------
> 6 files changed, 4 insertions(+), 488 deletions(-)
> delete mode 100644 tests/intel/xe_mmio.c
> delete mode 100644 tools/xe_reg.c
>
> diff --git a/include/drm-uapi/xe_drm.h b/include/drm-uapi/xe_drm.h
> index 807d8ac2c..143918b9e 100644
> --- a/include/drm-uapi/xe_drm.h
> +++ b/include/drm-uapi/xe_drm.h
> @@ -106,11 +106,10 @@ struct xe_user_extension {
> #define DRM_XE_EXEC_QUEUE_CREATE 0x06
> #define DRM_XE_EXEC_QUEUE_DESTROY 0x07
> #define DRM_XE_EXEC 0x08
> -#define DRM_XE_MMIO 0x09
> -#define DRM_XE_EXEC_QUEUE_SET_PROPERTY 0x0a
> -#define DRM_XE_WAIT_USER_FENCE 0x0b
> -#define DRM_XE_VM_MADVISE 0x0c
> -#define DRM_XE_EXEC_QUEUE_GET_PROPERTY 0x0d
> +#define DRM_XE_EXEC_QUEUE_SET_PROPERTY 0x09
> +#define DRM_XE_WAIT_USER_FENCE 0x0a
> +#define DRM_XE_VM_MADVISE 0x0b
> +#define DRM_XE_EXEC_QUEUE_GET_PROPERTY 0x0c
>
> /* Must be kept compact -- no holes */
> #define DRM_IOCTL_XE_DEVICE_QUERY DRM_IOWR(DRM_COMMAND_BASE + DRM_XE_DEVICE_QUERY, struct drm_xe_device_query)
> @@ -123,7 +122,6 @@ struct xe_user_extension {
> #define DRM_IOCTL_XE_EXEC_QUEUE_GET_PROPERTY DRM_IOWR(DRM_COMMAND_BASE + DRM_XE_EXEC_QUEUE_GET_PROPERTY, struct drm_xe_exec_queue_get_property)
> #define DRM_IOCTL_XE_EXEC_QUEUE_DESTROY DRM_IOW(DRM_COMMAND_BASE + DRM_XE_EXEC_QUEUE_DESTROY, struct drm_xe_exec_queue_destroy)
> #define DRM_IOCTL_XE_EXEC DRM_IOW(DRM_COMMAND_BASE + DRM_XE_EXEC, struct drm_xe_exec)
> -#define DRM_IOCTL_XE_MMIO DRM_IOWR(DRM_COMMAND_BASE + DRM_XE_MMIO, struct drm_xe_mmio)
> #define DRM_IOCTL_XE_EXEC_QUEUE_SET_PROPERTY DRM_IOW(DRM_COMMAND_BASE + DRM_XE_EXEC_QUEUE_SET_PROPERTY, struct drm_xe_exec_queue_set_property)
> #define DRM_IOCTL_XE_WAIT_USER_FENCE DRM_IOWR(DRM_COMMAND_BASE + DRM_XE_WAIT_USER_FENCE, struct drm_xe_wait_user_fence)
> #define DRM_IOCTL_XE_VM_MADVISE DRM_IOW(DRM_COMMAND_BASE + DRM_XE_VM_MADVISE, struct drm_xe_vm_madvise)
> @@ -936,27 +934,6 @@ struct drm_xe_exec {
> __u64 reserved[2];
> };
>
> -struct drm_xe_mmio {
> - /** @extensions: Pointer to the first extension struct, if any */
> - __u64 extensions;
> -
> - __u32 addr;
> -
> -#define DRM_XE_MMIO_8BIT 0x0
> -#define DRM_XE_MMIO_16BIT 0x1
> -#define DRM_XE_MMIO_32BIT 0x2
> -#define DRM_XE_MMIO_64BIT 0x3
> -#define DRM_XE_MMIO_BITS_MASK 0x3
> -#define DRM_XE_MMIO_READ 0x4
> -#define DRM_XE_MMIO_WRITE 0x8
> - __u32 flags;
> -
> - __u64 value;
> -
> - /** @reserved: Reserved */
> - __u64 reserved[2];
> -};
> -
> /**
> * struct drm_xe_wait_user_fence - wait user fence
> *
> diff --git a/tests/intel-ci/xe-fast-feedback.testlist b/tests/intel-ci/xe-fast-feedback.testlist
> index 610cc958c..a9fe43b08 100644
> --- a/tests/intel-ci/xe-fast-feedback.testlist
> +++ b/tests/intel-ci/xe-fast-feedback.testlist
> @@ -141,8 +141,6 @@ igt at xe_mmap@bad-object
> igt at xe_mmap@system
> igt at xe_mmap@vram
> igt at xe_mmap@vram-system
> -igt at xe_mmio@mmio-timestamp
> -igt at xe_mmio@mmio-invalid
> igt at xe_pm_residency@gt-c6-on-idle
> igt at xe_prime_self_import@basic-with_one_bo
> igt at xe_prime_self_import@basic-with_fd_dup
> diff --git a/tests/intel/xe_mmio.c b/tests/intel/xe_mmio.c
> deleted file mode 100644
> index 9ac544770..000000000
> --- a/tests/intel/xe_mmio.c
> +++ /dev/null
> @@ -1,91 +0,0 @@
> -// SPDX-License-Identifier: MIT
> -/*
> - * Copyright © 2023 Intel Corporation
> - */
> -
> -/**
> - * TEST: Test if mmio feature
> - * Category: Software building block
> - * Sub-category: mmio
> - * Functionality: mmap
> - */
> -
> -#include "igt.h"
> -
> -#include "xe_drm.h"
> -#include "xe/xe_ioctl.h"
> -#include "xe/xe_query.h"
> -
> -#include <string.h>
> -
> -#define RCS_TIMESTAMP 0x2358
> -
> -/**
> - * SUBTEST: mmio-timestamp
> - * Test category: functionality test
> - * Description:
> - * Try to run mmio ioctl with 32 and 64 bits and check it a timestamp
> - * matches
> - */
> -
> -static void test_xe_mmio_timestamp(int fd)
> -{
> - int ret;
> - struct drm_xe_mmio mmio = {
> - .addr = RCS_TIMESTAMP,
> - .flags = DRM_XE_MMIO_READ | DRM_XE_MMIO_64BIT,
> - };
> - ret = igt_ioctl(fd, DRM_IOCTL_XE_MMIO, &mmio);
> - if (!ret)
> - igt_debug("RCS_TIMESTAMP 64b = 0x%llx\n", mmio.value);
> - igt_assert(!ret);
> - mmio.flags = DRM_XE_MMIO_READ | DRM_XE_MMIO_32BIT;
> - mmio.value = 0;
> - ret = igt_ioctl(fd, DRM_IOCTL_XE_MMIO, &mmio);
> - if (!ret)
> - igt_debug("RCS_TIMESTAMP 32b = 0x%llx\n", mmio.value);
> - igt_assert(!ret);
> -}
> -
> -
> -/**
> - * SUBTEST: mmio-invalid
> - * Test category: negative test
> - * Description: Try to run mmio ioctl with 8, 16 and 32 and 64 bits mmio
> - */
> -
> -static void test_xe_mmio_invalid(int fd)
> -{
> - int ret;
> - struct drm_xe_mmio mmio = {
> - .addr = RCS_TIMESTAMP,
> - .flags = DRM_XE_MMIO_READ | DRM_XE_MMIO_8BIT,
> - };
> - ret = igt_ioctl(fd, DRM_IOCTL_XE_MMIO, &mmio);
> - igt_assert(ret);
> - mmio.flags = DRM_XE_MMIO_READ | DRM_XE_MMIO_16BIT;
> - mmio.value = 0;
> - ret = igt_ioctl(fd, DRM_IOCTL_XE_MMIO, &mmio);
> - igt_assert(ret);
> - mmio.addr = RCS_TIMESTAMP;
> - mmio.flags = DRM_XE_MMIO_READ | DRM_XE_MMIO_64BIT;
> - mmio.value = 0x1;
> - ret = igt_ioctl(fd, DRM_IOCTL_XE_MMIO, &mmio);
> - igt_assert(ret);
> -}
> -
> -igt_main
> -{
> - int fd;
> -
> - igt_fixture
> - fd = drm_open_driver(DRIVER_XE);
> -
> - igt_subtest("mmio-timestamp")
> - test_xe_mmio_timestamp(fd);
> - igt_subtest("mmio-invalid")
> - test_xe_mmio_invalid(fd);
> -
> - igt_fixture
> - drm_close_driver(fd);
> -}
> diff --git a/tests/meson.build b/tests/meson.build
> index 974cb433b..c3de337c8 100644
> --- a/tests/meson.build
> +++ b/tests/meson.build
> @@ -293,7 +293,6 @@ intel_xe_progs = [
> 'xe_live_ktest',
> 'xe_media_fill',
> 'xe_mmap',
> - 'xe_mmio',
> 'xe_module_load',
> 'xe_noexec_ping_pong',
> 'xe_pm',
> diff --git a/tools/meson.build b/tools/meson.build
> index 21e244c24..ac79d8b58 100644
> --- a/tools/meson.build
> +++ b/tools/meson.build
> @@ -42,7 +42,6 @@ tools_progs = [
> 'intel_gvtg_test',
> 'dpcd_reg',
> 'lsgpu',
> - 'xe_reg',
> ]
> tool_deps = igt_deps
> tool_deps += zlib
> diff --git a/tools/xe_reg.c b/tools/xe_reg.c
> deleted file mode 100644
> index 1f7b384d3..000000000
> --- a/tools/xe_reg.c
> +++ /dev/null
> @@ -1,366 +0,0 @@
> -// SPDX-License-Identifier: MIT
> -/*
> - * Copyright © 2021 Intel Corporation
> - */
> -
> -#include "igt.h"
> -#include "igt_device_scan.h"
> -
> -#include "xe_drm.h"
> -
> -#include <stdlib.h>
> -#include <stdio.h>
> -#include <string.h>
> -
> -#define DECL_XE_MMIO_READ_FN(bits) \
> -static inline uint##bits##_t \
> -xe_mmio_read##bits(int fd, uint32_t reg) \
> -{ \
> - struct drm_xe_mmio mmio = { \
> - .addr = reg, \
> - .flags = DRM_XE_MMIO_READ | DRM_XE_MMIO_##bits##BIT, \
> - }; \
> -\
> - igt_assert_eq(igt_ioctl(fd, DRM_IOCTL_XE_MMIO, &mmio), 0); \
> -\
> - return mmio.value;\
> -}\
> -static inline void \
> -xe_mmio_write##bits(int fd, uint32_t reg, uint##bits##_t value) \
> -{ \
> - struct drm_xe_mmio mmio = { \
> - .addr = reg, \
> - .flags = DRM_XE_MMIO_WRITE | DRM_XE_MMIO_##bits##BIT, \
> - .value = value, \
> - }; \
> -\
> - igt_assert_eq(igt_ioctl(fd, DRM_IOCTL_XE_MMIO, &mmio), 0); \
> -}
> -
> -DECL_XE_MMIO_READ_FN(8)
> -DECL_XE_MMIO_READ_FN(16)
> -DECL_XE_MMIO_READ_FN(32)
> -DECL_XE_MMIO_READ_FN(64)
> -
> -static void print_help(FILE *fp)
> -{
> - fprintf(fp, "usage: xe_reg read REG1 [REG2]...\n");
> - fprintf(fp, " xe_reg write REG VALUE\n");
> -}
> -
> -enum ring {
> - RING_UNKNOWN = -1,
> - RING_RCS0,
> - RING_BCS0,
> -};
> -
> -static const struct ring_info {
> - enum ring ring;
> - const char *name;
> - uint32_t mmio_base;
> -} ring_info[] = {
> - {RING_RCS0, "rcs0", 0x02000, },
> - {RING_BCS0, "bcs0", 0x22000, },
> -};
> -
> -static const struct ring_info *ring_info_for_name(const char *name)
> -{
> - int i;
> -
> - for (i = 0; i < ARRAY_SIZE(ring_info); i++)
> - if (strcmp(name, ring_info[i].name) == 0)
> - return &ring_info[i];
> -
> - return NULL;
> -}
> -
> -struct reg_info {
> - const char *name;
> - bool is_ring;
> - uint32_t addr_low;
> - uint32_t addr_high;
> -} reg_info[] = {
> -#define REG32(name, addr) { #name, false, addr }
> -#define REG64(name, low, high) { #name, false, low, high }
> -#define RING_REG32(name, addr) { #name, true, addr }
> -#define RING_REG64(name, low, high) { #name, true, low, high }
> -
> - RING_REG64(ACTHD, 0x74, 0x5c),
> - RING_REG32(BB_ADDR_DIFF, 0x154),
> - RING_REG64(BB_ADDR, 0x140, 0x168),
> - RING_REG32(BB_PER_CTX_PTR, 0x2c0),
> - RING_REG64(EXECLIST_STATUS, 0x234, 0x238),
> - RING_REG64(EXECLIST_SQ0, 0x510, 0x514),
> - RING_REG64(EXECLIST_SQ1, 0x518, 0x51c),
> - RING_REG32(HWS_PGA, 0x80),
> - RING_REG32(INDIRECT_CTX, 0x1C4),
> - RING_REG32(INDIRECT_CTX_OFFSET, 0x1C8),
> - RING_REG32(NOPID, 0x94),
> - RING_REG64(PML4E, 0x270, 0x274),
> - RING_REG32(RING_BUFFER_CTL, 0x3c),
> - RING_REG32(RING_BUFFER_HEAD, 0x34),
> - RING_REG32(RING_BUFFER_START, 0x38),
> - RING_REG32(RING_BUFFER_TAIL, 0x30),
> - RING_REG64(SBB_ADDR, 0x114, 0x11c),
> - RING_REG32(SBB_STATE, 0x118),
> -
> -#undef REG32
> -#undef REG64
> -#undef RING_REG32
> -#undef RING_REG64
> -};
> -
> -static const struct reg_info *reg_info_for_name(const char *name)
> -{
> - int i;
> -
> - for (i = 0; i < ARRAY_SIZE(reg_info); i++)
> - if (strcmp(name, reg_info[i].name) == 0)
> - return ®_info[i];
> -
> - return NULL;
> -}
> -
> -static int print_reg_for_info(int xe, FILE *fp, const struct reg_info *reg,
> - const struct ring_info *ring)
> -{
> - if (reg->is_ring) {
> - if (!ring) {
> - fprintf(stderr, "%s is a ring register but --ring "
> - "not set\n", reg->name);
> - return EXIT_FAILURE;
> - }
> -
> - if (reg->addr_high) {
> - uint32_t low = xe_mmio_read32(xe, reg->addr_low +
> - ring->mmio_base);
> - uint32_t high = xe_mmio_read32(xe, reg->addr_high +
> - ring->mmio_base);
> -
> - fprintf(fp, "%s[%s] = 0x%08x %08x\n", reg->name,
> - ring->name, high, low);
> - } else {
> - uint32_t value = xe_mmio_read32(xe, reg->addr_low +
> - ring->mmio_base);
> -
> - fprintf(fp, "%s[%s] = 0x%08x\n", reg->name,
> - ring->name, value);
> - }
> - } else {
> - if (reg->addr_high) {
> - uint32_t low = xe_mmio_read32(xe, reg->addr_low);
> - uint32_t high = xe_mmio_read32(xe, reg->addr_high);
> -
> - fprintf(fp, "%s = 0x%08x %08x\n", reg->name, high, low);
> - } else {
> - uint32_t value = xe_mmio_read32(xe, reg->addr_low);
> -
> - fprintf(fp, "%s = 0x%08x\n", reg->name, value);
> - }
> - }
> -
> - return 0;
> -}
> -
> -static void print_reg_for_addr(int xe, FILE *fp, uint32_t addr)
> -{
> - uint32_t value = xe_mmio_read32(xe, addr);
> -
> - fprintf(fp, "MMIO[0x%05x] = 0x%08x\n", addr, value);
> -}
> -
> -enum opt {
> - OPT_UNKNOWN = '?',
> - OPT_END = -1,
> - OPT_DEVICE,
> - OPT_RING,
> - OPT_ALL,
> -};
> -
> -static int read_reg(int argc, char *argv[])
> -{
> - int xe, i, err, index;
> - unsigned long reg_addr;
> - char *endp = NULL;
> - const struct ring_info *ring = NULL;
> - enum opt opt;
> - bool dump_all = false;
> -
> - static struct option options[] = {
> - { "device", required_argument, NULL, OPT_DEVICE },
> - { "ring", required_argument, NULL, OPT_RING },
> - { "all", no_argument, NULL, OPT_ALL },
> - };
> -
> - for (opt = 0; opt != OPT_END; ) {
> - opt = getopt_long(argc, argv, "", options, &index);
> -
> - switch (opt) {
> - case OPT_DEVICE:
> - igt_device_filter_add(optarg);
> - break;
> - case OPT_RING:
> - ring = ring_info_for_name(optarg);
> - if (!ring) {
> - fprintf(stderr, "invalid ring: %s\n", optarg);
> - return EXIT_FAILURE;
> - }
> - break;
> - case OPT_ALL:
> - dump_all = true;
> - break;
> - case OPT_END:
> - break;
> - case OPT_UNKNOWN:
> - return EXIT_FAILURE;
> - }
> - }
> -
> - argc -= optind;
> - argv += optind;
> -
> - xe = drm_open_driver(DRIVER_XE);
> - if (dump_all) {
> - for (i = 0; i < ARRAY_SIZE(reg_info); i++) {
> - if (reg_info[i].is_ring != !!ring)
> - continue;
> -
> - print_reg_for_info(xe, stdout, ®_info[i], ring);
> - }
> - } else {
> - for (i = 0; i < argc; i++) {
> - const struct reg_info *reg = reg_info_for_name(argv[i]);
> - if (reg) {
> - err = print_reg_for_info(xe, stdout, reg, ring);
> - if (err)
> - return err;
> - continue;
> - }
> - reg_addr = strtoul(argv[i], &endp, 16);
> - if (!reg_addr || reg_addr >= (4 << 20) || *endp) {
> - fprintf(stderr, "invalid reg address '%s'\n",
> - argv[i]);
> - return EXIT_FAILURE;
> - }
> - print_reg_for_addr(xe, stdout, reg_addr);
> - }
> - }
> -
> - return 0;
> -}
> -
> -static int write_reg_for_info(int xe, const struct reg_info *reg,
> - const struct ring_info *ring,
> - uint64_t value)
> -{
> - if (reg->is_ring) {
> - if (!ring) {
> - fprintf(stderr, "%s is a ring register but --ring "
> - "not set\n", reg->name);
> - return EXIT_FAILURE;
> - }
> -
> - xe_mmio_write32(xe, reg->addr_low + ring->mmio_base, value);
> - if (reg->addr_high) {
> - xe_mmio_write32(xe, reg->addr_high + ring->mmio_base,
> - value >> 32);
> - }
> - } else {
> - xe_mmio_write32(xe, reg->addr_low, value);
> - if (reg->addr_high)
> - xe_mmio_write32(xe, reg->addr_high, value >> 32);
> - }
> -
> - return 0;
> -}
> -
> -static void write_reg_for_addr(int xe, uint32_t addr, uint32_t value)
> -{
> - xe_mmio_write32(xe, addr, value);
> -}
> -
> -static int write_reg(int argc, char *argv[])
> -{
> - int xe, index;
> - unsigned long reg_addr;
> - char *endp = NULL;
> - const struct ring_info *ring = NULL;
> - enum opt opt;
> - const char *reg_name;
> - const struct reg_info *reg;
> - uint64_t value;
> -
> - static struct option options[] = {
> - { "device", required_argument, NULL, OPT_DEVICE },
> - { "ring", required_argument, NULL, OPT_RING },
> - };
> -
> - for (opt = 0; opt != OPT_END; ) {
> - opt = getopt_long(argc, argv, "", options, &index);
> -
> - switch (opt) {
> - case OPT_DEVICE:
> - igt_device_filter_add(optarg);
> - break;
> - case OPT_RING:
> - ring = ring_info_for_name(optarg);
> - if (!ring) {
> - fprintf(stderr, "invalid ring: %s\n", optarg);
> - return EXIT_FAILURE;
> - }
> - break;
> - case OPT_END:
> - break;
> - case OPT_UNKNOWN:
> - return EXIT_FAILURE;
> - default:
> - break;
> - }
> - }
> -
> - argc -= optind;
> - argv += optind;
> -
> - if (argc != 2) {
> - print_help(stderr);
> - return EXIT_FAILURE;
> - }
> -
> - reg_name = argv[0];
> - value = strtoull(argv[1], &endp, 0);
> - if (*endp) {
> - fprintf(stderr, "Invalid register value: %s\n", argv[1]);
> - return EXIT_FAILURE;
> - }
> -
> - xe = drm_open_driver(DRIVER_XE);
> -
> - reg = reg_info_for_name(reg_name);
> - if (reg)
> - return write_reg_for_info(xe, reg, ring, value);
> -
> - reg_addr = strtoul(reg_name, &endp, 16);
> - if (!reg_addr || reg_addr >= (4 << 20) || *endp) {
> - fprintf(stderr, "invalid reg address '%s'\n", reg_name);
> - return EXIT_FAILURE;
> - }
> - write_reg_for_addr(xe, reg_addr, value);
> -
> - return 0;
> -}
> -
> -int main(int argc, char *argv[])
> -{
> - if (argc < 2) {
> - print_help(stderr);
> - return EXIT_FAILURE;
> - }
> -
> - if (strcmp(argv[1], "read") == 0)
> - return read_reg(argc - 1, argv + 1);
> - else if (strcmp(argv[1], "write") == 0)
> - return write_reg(argc - 1, argv + 1);
> -
> - fprintf(stderr, "invalid sub-command: %s", argv[1]);
> - return EXIT_FAILURE;
> -}
> --
> 2.34.1
>
More information about the igt-dev
mailing list