tools headers UAPI: Update tools's copy of drm.h headers to pick DRM_IOCTL_MODE_CLOSEFB

Picking the changes from:

  8570c279 ("drm/syncobj: Add deadline support for syncobj waits")
  9724ed6c ("drm: Introduce DRM_CLIENT_CAP_CURSOR_PLANE_HOTSPOT")
  e4d983ac ("drm: introduce DRM_CAP_ATOMIC_ASYNC_PAGE_FLIP")
  d208d875 ("drm: introduce CLOSEFB IOCTL")
  afa5cf31 ("drm/i915/uapi: fix typos/spellos and punctuation")

Addressing these perf build warnings:

  Warning: Kernel ABI header differences:

Now 'perf trace' and other code that might use the
tools/perf/trace/beauty autogenerated tables will be able to translate
this new ioctl command into a string:

  $ tools/perf/trace/beauty/drm_ioctl.sh > before
  $ cp include/uapi/drm/drm.h tools/include/uapi/drm/drm.h
  $ tools/perf/trace/beauty/drm_ioctl.sh > after
  $ diff -u before after
  --- before	2024-01-26 10:54:23.486381862 -0300
  +++ after	2024-01-26 10:54:35.767902442 -0300
  @@ -109,6 +109,7 @@
   	[0xCD] = "SYNCOBJ_TIMELINE_SIGNAL",
   	[0xCE] = "MODE_GETFB2",
   	[0xCF] = "SYNCOBJ_EVENTFD",
  +	[0xD0] = "MODE_CLOSEFB",
   	[DRM_COMMAND_BASE + 0x00] = "I915_INIT",
   	[DRM_COMMAND_BASE + 0x01] = "I915_FLUSH",
   	[DRM_COMMAND_BASE + 0x02] = "I915_FLIP",
  $

Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Cc: Ian Rogers <irogers@google.com>
Cc: Javier Martinez Canillas <javierm@redhat.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Randy Dunlap <rdunlap@infradead.org>
Cc: Rob Clark <robdclark@chromium.org>
Cc: Simon Ser <contact@emersion.fr>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: Zack Rusin <zack.rusin@broadcom.com>
Link: https://lore.kernel.org/lkml/ZbPIN9Dcc5AM0uxo@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 9a8dd2f2
...@@ -713,7 +713,8 @@ struct drm_gem_open { ...@@ -713,7 +713,8 @@ struct drm_gem_open {
/** /**
* DRM_CAP_ASYNC_PAGE_FLIP * DRM_CAP_ASYNC_PAGE_FLIP
* *
* If set to 1, the driver supports &DRM_MODE_PAGE_FLIP_ASYNC. * If set to 1, the driver supports &DRM_MODE_PAGE_FLIP_ASYNC for legacy
* page-flips.
*/ */
#define DRM_CAP_ASYNC_PAGE_FLIP 0x7 #define DRM_CAP_ASYNC_PAGE_FLIP 0x7
/** /**
...@@ -773,6 +774,13 @@ struct drm_gem_open { ...@@ -773,6 +774,13 @@ struct drm_gem_open {
* :ref:`drm_sync_objects`. * :ref:`drm_sync_objects`.
*/ */
#define DRM_CAP_SYNCOBJ_TIMELINE 0x14 #define DRM_CAP_SYNCOBJ_TIMELINE 0x14
/**
* DRM_CAP_ATOMIC_ASYNC_PAGE_FLIP
*
* If set to 1, the driver supports &DRM_MODE_PAGE_FLIP_ASYNC for atomic
* commits.
*/
#define DRM_CAP_ATOMIC_ASYNC_PAGE_FLIP 0x15
/* DRM_IOCTL_GET_CAP ioctl argument type */ /* DRM_IOCTL_GET_CAP ioctl argument type */
struct drm_get_cap { struct drm_get_cap {
...@@ -842,6 +850,31 @@ struct drm_get_cap { ...@@ -842,6 +850,31 @@ struct drm_get_cap {
*/ */
#define DRM_CLIENT_CAP_WRITEBACK_CONNECTORS 5 #define DRM_CLIENT_CAP_WRITEBACK_CONNECTORS 5
/**
* DRM_CLIENT_CAP_CURSOR_PLANE_HOTSPOT
*
* Drivers for para-virtualized hardware (e.g. vmwgfx, qxl, virtio and
* virtualbox) have additional restrictions for cursor planes (thus
* making cursor planes on those drivers not truly universal,) e.g.
* they need cursor planes to act like one would expect from a mouse
* cursor and have correctly set hotspot properties.
* If this client cap is not set the DRM core will hide cursor plane on
* those virtualized drivers because not setting it implies that the
* client is not capable of dealing with those extra restictions.
* Clients which do set cursor hotspot and treat the cursor plane
* like a mouse cursor should set this property.
* The client must enable &DRM_CLIENT_CAP_ATOMIC first.
*
* Setting this property on drivers which do not special case
* cursor planes (i.e. non-virtualized drivers) will return
* EOPNOTSUPP, which can be used by userspace to gauge
* requirements of the hardware/drivers they're running on.
*
* This capability is always supported for atomic-capable virtualized
* drivers starting from kernel version 6.6.
*/
#define DRM_CLIENT_CAP_CURSOR_PLANE_HOTSPOT 6
/* DRM_IOCTL_SET_CLIENT_CAP ioctl argument type */ /* DRM_IOCTL_SET_CLIENT_CAP ioctl argument type */
struct drm_set_client_cap { struct drm_set_client_cap {
__u64 capability; __u64 capability;
...@@ -893,6 +926,7 @@ struct drm_syncobj_transfer { ...@@ -893,6 +926,7 @@ struct drm_syncobj_transfer {
#define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_ALL (1 << 0) #define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_ALL (1 << 0)
#define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT (1 << 1) #define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT (1 << 1)
#define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE (1 << 2) /* wait for time point to become available */ #define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE (1 << 2) /* wait for time point to become available */
#define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_DEADLINE (1 << 3) /* set fence deadline to deadline_nsec */
struct drm_syncobj_wait { struct drm_syncobj_wait {
__u64 handles; __u64 handles;
/* absolute timeout */ /* absolute timeout */
...@@ -901,6 +935,14 @@ struct drm_syncobj_wait { ...@@ -901,6 +935,14 @@ struct drm_syncobj_wait {
__u32 flags; __u32 flags;
__u32 first_signaled; /* only valid when not waiting all */ __u32 first_signaled; /* only valid when not waiting all */
__u32 pad; __u32 pad;
/**
* @deadline_nsec - fence deadline hint
*
* Deadline hint, in absolute CLOCK_MONOTONIC, to set on backing
* fence(s) if the DRM_SYNCOBJ_WAIT_FLAGS_WAIT_DEADLINE flag is
* set.
*/
__u64 deadline_nsec;
}; };
struct drm_syncobj_timeline_wait { struct drm_syncobj_timeline_wait {
...@@ -913,6 +955,14 @@ struct drm_syncobj_timeline_wait { ...@@ -913,6 +955,14 @@ struct drm_syncobj_timeline_wait {
__u32 flags; __u32 flags;
__u32 first_signaled; /* only valid when not waiting all */ __u32 first_signaled; /* only valid when not waiting all */
__u32 pad; __u32 pad;
/**
* @deadline_nsec - fence deadline hint
*
* Deadline hint, in absolute CLOCK_MONOTONIC, to set on backing
* fence(s) if the DRM_SYNCOBJ_WAIT_FLAGS_WAIT_DEADLINE flag is
* set.
*/
__u64 deadline_nsec;
}; };
/** /**
...@@ -1218,6 +1268,26 @@ extern "C" { ...@@ -1218,6 +1268,26 @@ extern "C" {
#define DRM_IOCTL_SYNCOBJ_EVENTFD DRM_IOWR(0xCF, struct drm_syncobj_eventfd) #define DRM_IOCTL_SYNCOBJ_EVENTFD DRM_IOWR(0xCF, struct drm_syncobj_eventfd)
/**
* DRM_IOCTL_MODE_CLOSEFB - Close a framebuffer.
*
* This closes a framebuffer previously added via ADDFB/ADDFB2. The IOCTL
* argument is a framebuffer object ID.
*
* This IOCTL is similar to &DRM_IOCTL_MODE_RMFB, except it doesn't disable
* planes and CRTCs. As long as the framebuffer is used by a plane, it's kept
* alive. When the plane no longer uses the framebuffer (because the
* framebuffer is replaced with another one, or the plane is disabled), the
* framebuffer is cleaned up.
*
* This is useful to implement flicker-free transitions between two processes.
*
* Depending on the threat model, user-space may want to ensure that the
* framebuffer doesn't expose any sensitive user information: closed
* framebuffers attached to a plane can be read back by the next DRM master.
*/
#define DRM_IOCTL_MODE_CLOSEFB DRM_IOWR(0xD0, struct drm_mode_closefb)
/* /*
* Device specific ioctls should only be in their respective headers * Device specific ioctls should only be in their respective headers
* The device specific ioctl range is from 0x40 to 0x9f. * The device specific ioctl range is from 0x40 to 0x9f.
......
...@@ -693,7 +693,7 @@ typedef struct drm_i915_irq_wait { ...@@ -693,7 +693,7 @@ typedef struct drm_i915_irq_wait {
#define I915_PARAM_HAS_EXEC_FENCE 44 #define I915_PARAM_HAS_EXEC_FENCE 44
/* Query whether DRM_I915_GEM_EXECBUFFER2 supports the ability to capture /* Query whether DRM_I915_GEM_EXECBUFFER2 supports the ability to capture
* user specified bufffers for post-mortem debugging of GPU hangs. See * user-specified buffers for post-mortem debugging of GPU hangs. See
* EXEC_OBJECT_CAPTURE. * EXEC_OBJECT_CAPTURE.
*/ */
#define I915_PARAM_HAS_EXEC_CAPTURE 45 #define I915_PARAM_HAS_EXEC_CAPTURE 45
...@@ -1606,7 +1606,7 @@ struct drm_i915_gem_busy { ...@@ -1606,7 +1606,7 @@ struct drm_i915_gem_busy {
* is accurate. * is accurate.
* *
* The returned dword is split into two fields to indicate both * The returned dword is split into two fields to indicate both
* the engine classess on which the object is being read, and the * the engine classes on which the object is being read, and the
* engine class on which it is currently being written (if any). * engine class on which it is currently being written (if any).
* *
* The low word (bits 0:15) indicate if the object is being written * The low word (bits 0:15) indicate if the object is being written
...@@ -1815,7 +1815,7 @@ struct drm_i915_gem_madvise { ...@@ -1815,7 +1815,7 @@ struct drm_i915_gem_madvise {
__u32 handle; __u32 handle;
/* Advice: either the buffer will be needed again in the near future, /* Advice: either the buffer will be needed again in the near future,
* or wont be and could be discarded under memory pressure. * or won't be and could be discarded under memory pressure.
*/ */
__u32 madv; __u32 madv;
...@@ -3246,7 +3246,7 @@ struct drm_i915_query_topology_info { ...@@ -3246,7 +3246,7 @@ struct drm_i915_query_topology_info {
* // enough to hold our array of engines. The kernel will fill out the * // enough to hold our array of engines. The kernel will fill out the
* // item.length for us, which is the number of bytes we need. * // item.length for us, which is the number of bytes we need.
* // * //
* // Alternatively a large buffer can be allocated straight away enabling * // Alternatively a large buffer can be allocated straightaway enabling
* // querying in one pass, in which case item.length should contain the * // querying in one pass, in which case item.length should contain the
* // length of the provided buffer. * // length of the provided buffer.
* err = ioctl(fd, DRM_IOCTL_I915_QUERY, &query); * err = ioctl(fd, DRM_IOCTL_I915_QUERY, &query);
...@@ -3256,7 +3256,7 @@ struct drm_i915_query_topology_info { ...@@ -3256,7 +3256,7 @@ struct drm_i915_query_topology_info {
* // Now that we allocated the required number of bytes, we call the ioctl * // Now that we allocated the required number of bytes, we call the ioctl
* // again, this time with the data_ptr pointing to our newly allocated * // again, this time with the data_ptr pointing to our newly allocated
* // blob, which the kernel can then populate with info on all engines. * // blob, which the kernel can then populate with info on all engines.
* item.data_ptr = (uintptr_t)&info, * item.data_ptr = (uintptr_t)&info;
* *
* err = ioctl(fd, DRM_IOCTL_I915_QUERY, &query); * err = ioctl(fd, DRM_IOCTL_I915_QUERY, &query);
* if (err) ... * if (err) ...
...@@ -3286,7 +3286,7 @@ struct drm_i915_query_topology_info { ...@@ -3286,7 +3286,7 @@ struct drm_i915_query_topology_info {
/** /**
* struct drm_i915_engine_info * struct drm_i915_engine_info
* *
* Describes one engine and it's capabilities as known to the driver. * Describes one engine and its capabilities as known to the driver.
*/ */
struct drm_i915_engine_info { struct drm_i915_engine_info {
/** @engine: Engine class and instance. */ /** @engine: Engine class and instance. */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment