History

drm: nova-drm: add initial driver skeleton

Add the initial nova-drm driver skeleton. nova-drm is connected to nova-core through the auxiliary bus and implements the DRM parts of the nova driver stack. For now, it implements the fundamental DRM abstractions, i.e. creates a DRM device and registers it, exposing a three sample IOCTLs. DRM_IOCTL_NOVA_GETPARAM - provides the PCI bar size from the bar that maps the GPUs VRAM from nova-core DRM_IOCTL_NOVA_GEM_CREATE - creates a new dummy DRM GEM object and returns a handle DRM_IOCTL_NOVA_GEM_INFO - provides metadata for the DRM GEM object behind a given handle I implemented a small userspace test suite [1] that utilizes this interface.

Danilo Krummrich committed 1 year ago

Commit cdeaeb91 parent e041d8112 files · +405 −0Browse files

Showing the changes to include/uapi (1 of 12 files). Show all

Unified · Split

include/uapi/drm/nova_drm.h+101−0
@@ -0,0 +1,101 @@
1+/* SPDX-License-Identifier: MIT */
2+
3+#ifndef __NOVA_DRM_H__
4+#define __NOVA_DRM_H__
5+
6+#include "drm.h"
7+
8+/* DISCLAIMER: Do not use, this is not a stable uAPI.
9+ *
10+ * This uAPI serves only testing purposes as long as this driver is still in
11+ * development. It is required to implement and test infrastructure which is
12+ * upstreamed in the context of this driver. See also [1].
13+ *
14+ * [1] https://lore.kernel.org/dri-devel/Zfsj0_tb-0-tNrJy@cassiopeiae/T/#u
15+ */
16+
17+#if defined(__cplusplus)
18+extern "C" {
19+#endif
20+
21+/*
22+ * NOVA_GETPARAM_VRAM_BAR_SIZE
23+ *
24+ * Query the VRAM BAR size in bytes.
25+ */
26+#define NOVA_GETPARAM_VRAM_BAR_SIZE 0x1
27+
28+/**
29+ * struct drm_nova_getparam - query GPU and driver metadata
30+ */
31+struct drm_nova_getparam {
32+ /**
33+ * @param: The identifier of the parameter to query.
34+ */
35+ __u64 param;
36+
37+ /**
38+ * @value: The value for the specified parameter.
39+ */
40+ __u64 value;
41+};
42+
43+/**
44+ * struct drm_nova_gem_create - create a new DRM GEM object
45+ */
46+struct drm_nova_gem_create {
47+ /**
48+ * @handle: The handle of the new DRM GEM object.
49+ */
50+ __u32 handle;
51+
52+ /**
53+ * @pad: 32 bit padding, should be 0.
54+ */
55+ __u32 pad;
56+
57+ /**
58+ * @size: The size of the new DRM GEM object.
59+ */
60+ __u64 size;
61+};
62+
63+/**
64+ * struct drm_nova_gem_info - query DRM GEM object metadata
65+ */
66+struct drm_nova_gem_info {
67+ /**
68+ * @handle: The handle of the DRM GEM object to query.
69+ */
70+ __u32 handle;
71+
72+ /**
73+ * @pad: 32 bit padding, should be 0.
74+ */
75+ __u32 pad;
76+
77+ /**
78+ * @size: The size of the DRM GEM obejct.
79+ */
80+ __u64 size;
81+};
82+
83+#define DRM_NOVA_GETPARAM 0x00
84+#define DRM_NOVA_GEM_CREATE 0x01
85+#define DRM_NOVA_GEM_INFO 0x02
86+
87+/* Note: this is an enum so that it can be resolved by Rust bindgen. */
88+enum {
89+ DRM_IOCTL_NOVA_GETPARAM = DRM_IOWR(DRM_COMMAND_BASE + DRM_NOVA_GETPARAM,
90+ struct drm_nova_getparam),
91+ DRM_IOCTL_NOVA_GEM_CREATE = DRM_IOWR(DRM_COMMAND_BASE + DRM_NOVA_GEM_CREATE,
92+ struct drm_nova_gem_create),
93+ DRM_IOCTL_NOVA_GEM_INFO = DRM_IOWR(DRM_COMMAND_BASE + DRM_NOVA_GEM_INFO,
94+ struct drm_nova_gem_info),
95+};
96+
97+#if defined(__cplusplus)
98+}
99+#endif
100+
101+#endif /* __NOVA_DRM_H__ */