summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2010-03-12 09:02:31 +1000
committerDave Airlie <airlied@redhat.com>2010-03-12 09:02:38 +1000
commitbdf925966f02952f82133d5764cb2b2fae1ce7d7 (patch)
treea3e3a99e7f08510c486ca41925507e21900640b9
parent04fd3872ee8bd8d5e2c27740508c67c2d51dbc11 (diff)
prime add supportprime-test
-rw-r--r--include/drm/drm.h14
-rw-r--r--include/drm/drm_mode.h40
-rw-r--r--include/drm/vmwgfx_drm.h43
-rw-r--r--intel/intel_bufmgr.h2
-rw-r--r--intel/intel_bufmgr_gem.c19
-rw-r--r--radeon/radeon_bo.h2
-rw-r--r--radeon/radeon_bo_gem.c10
-rw-r--r--xf86drm.c29
-rw-r--r--xf86drm.h3
9 files changed, 152 insertions, 10 deletions
diff --git a/include/drm/drm.h b/include/drm/drm.h
index 48221599..cf150ffc 100644
--- a/include/drm/drm.h
+++ b/include/drm/drm.h
@@ -608,6 +608,15 @@ struct drm_gem_open {
__u64 size;
};
+struct drm_prime_handle {
+ /** Handle for object */
+ __u32 handle;
+
+ /* prime name */
+ __u32 name;
+};
+
+
#include "drm_mode.h"
#define DRM_IOCTL_BASE 'd'
@@ -663,6 +672,9 @@ struct drm_gem_open {
#define DRM_IOCTL_UNLOCK DRM_IOW( 0x2b, struct drm_lock)
#define DRM_IOCTL_FINISH DRM_IOW( 0x2c, struct drm_lock)
+#define DRM_IOCTL_PRIME_SET DRM_IOWR(0x2d, struct drm_prime_handle)
+#define DRM_IOCTL_PRIME_GET DRM_IOWR(0x2e, struct drm_prime_handle)
+
#define DRM_IOCTL_AGP_ACQUIRE DRM_IO( 0x30)
#define DRM_IOCTL_AGP_RELEASE DRM_IO( 0x31)
#define DRM_IOCTL_AGP_ENABLE DRM_IOW( 0x32, struct drm_agp_mode)
@@ -699,8 +711,6 @@ struct drm_gem_open {
#define DRM_IOCTL_MODE_PAGE_FLIP DRM_IOWR(0xB0, struct drm_mode_crtc_page_flip)
#define DRM_IOCTL_MODE_DIRTYFB DRM_IOWR(0xB1, struct drm_mode_fb_dirty_cmd)
-/*@}*/
-
/**
* Device specific ioctls should only be in their respective headers
* The device specific ioctl range is from 0x40 to 0x99.
diff --git a/include/drm/drm_mode.h b/include/drm/drm_mode.h
index dfc390ea..c5ba1636 100644
--- a/include/drm/drm_mode.h
+++ b/include/drm/drm_mode.h
@@ -75,12 +75,17 @@
#define DRM_MODE_DITHERING_OFF 0
#define DRM_MODE_DITHERING_ON 1
+/* Dirty info options */
+#define DRM_MODE_DIRTY_OFF 0
+#define DRM_MODE_DIRTY_ON 1
+#define DRM_MODE_DIRTY_ANNOTATE 2
+
struct drm_mode_modeinfo {
__u32 clock;
__u16 hdisplay, hsync_start, hsync_end, htotal, hskew;
__u16 vdisplay, vsync_start, vsync_end, vtotal, vscan;
- __u32 vrefresh; /* vertical refresh * 1000 */
+ __u32 vrefresh;
__u32 flags;
__u32 type;
@@ -155,6 +160,7 @@ struct drm_mode_get_encoder {
#define DRM_MODE_CONNECTOR_HDMIA 11
#define DRM_MODE_CONNECTOR_HDMIB 12
#define DRM_MODE_CONNECTOR_TV 13
+#define DRM_MODE_CONNECTOR_eDP 14
struct drm_mode_get_connector {
@@ -307,12 +313,34 @@ struct drm_mode_crtc_lut {
#define DRM_MODE_PAGE_FLIP_EVENT 0x01
#define DRM_MODE_PAGE_FLIP_FLAGS DRM_MODE_PAGE_FLIP_EVENT
+/*
+ * Request a page flip on the specified crtc.
+ *
+ * This ioctl will ask KMS to schedule a page flip for the specified
+ * crtc. Once any pending rendering targeting the specified fb (as of
+ * ioctl time) has completed, the crtc will be reprogrammed to display
+ * that fb after the next vertical refresh. The ioctl returns
+ * immediately, but subsequent rendering to the current fb will block
+ * in the execbuffer ioctl until the page flip happens. If a page
+ * flip is already pending as the ioctl is called, EBUSY will be
+ * returned.
+ *
+ * The ioctl supports one flag, DRM_MODE_PAGE_FLIP_EVENT, which will
+ * request that drm sends back a vblank event (see drm.h: struct
+ * drm_event_vblank) when the page flip is done. The user_data field
+ * passed in with this ioctl will be returned as the user_data field
+ * in the vblank event struct.
+ *
+ * The reserved field must be zero until we figure out something
+ * clever to use it for.
+ */
+
struct drm_mode_crtc_page_flip {
- uint32_t crtc_id;
- uint32_t fb_id;
- uint32_t flags;
- uint32_t reserved;
- uint64_t user_data;
+ __u32 crtc_id;
+ __u32 fb_id;
+ __u32 flags;
+ __u32 reserved;
+ __u64 user_data;
};
#endif
diff --git a/include/drm/vmwgfx_drm.h b/include/drm/vmwgfx_drm.h
index 47914bdb..c7645f48 100644
--- a/include/drm/vmwgfx_drm.h
+++ b/include/drm/vmwgfx_drm.h
@@ -88,6 +88,49 @@ struct drm_vmw_getparam_arg {
/*************************************************************************/
/**
+ * DRM_VMW_EXTENSION - Query device extensions.
+ */
+
+/**
+ * struct drm_vmw_extension_rep
+ *
+ * @exists: The queried extension exists.
+ * @driver_ioctl_offset: Ioctl number of the first ioctl in the extension.
+ * @driver_sarea_offset: Offset to any space in the DRI SAREA
+ * used by the extension.
+ * @major: Major version number of the extension.
+ * @minor: Minor version number of the extension.
+ * @pl: Patch level version number of the extension.
+ *
+ * Output argument to the DRM_VMW_EXTENSION Ioctl.
+ */
+
+struct drm_vmw_extension_rep {
+ int32_t exists;
+ uint32_t driver_ioctl_offset;
+ uint32_t driver_sarea_offset;
+ uint32_t major;
+ uint32_t minor;
+ uint32_t pl;
+ uint32_t pad64;
+};
+
+/**
+ * union drm_vmw_extension_arg
+ *
+ * @extension - Ascii name of the extension to be queried. //In
+ * @rep - Reply as defined above. //Out
+ *
+ * Argument to the DRM_VMW_EXTENSION Ioctl.
+ */
+
+union drm_vmw_extension_arg {
+ char extension[DRM_VMW_EXT_NAME_LEN];
+ struct drm_vmw_extension_rep rep;
+};
+
+/*************************************************************************/
+/**
* DRM_VMW_CREATE_CONTEXT - Create a host context.
*
* Allocates a device unique context id, and queues a create context command
diff --git a/intel/intel_bufmgr.h b/intel/intel_bufmgr.h
index 0984ab08..6fa82491 100644
--- a/intel/intel_bufmgr.h
+++ b/intel/intel_bufmgr.h
@@ -213,6 +213,8 @@ void drm_intel_bufmgr_fake_evict_all(drm_intel_bufmgr *bufmgr);
#define intel_bufmgr_fake_contended_lock_take drm_intel_bufmgr_fake_contended_lock_take
#define intel_bufmgr_fake_evict_all drm_intel_bufmgr_fake_evict_all
+void
+drm_intel_bufmgr_gem_set_bo_prime(drm_intel_bo *bo, uint32_t *name);
/** @{ */
#endif /* INTEL_BUFMGR_H */
diff --git a/intel/intel_bufmgr_gem.c b/intel/intel_bufmgr_gem.c
index 88385363..d6d095c7 100644
--- a/intel/intel_bufmgr_gem.c
+++ b/intel/intel_bufmgr_gem.c
@@ -188,6 +188,8 @@ struct _drm_intel_bo_gem {
* relocations.
*/
int reloc_tree_fences;
+
+ unsigned int prime_name;
};
static unsigned int
@@ -1679,6 +1681,22 @@ drm_intel_gem_bo_get_tiling(drm_intel_bo *bo, uint32_t * tiling_mode,
return 0;
}
+void
+drm_intel_bufmgr_gem_set_bo_prime(drm_intel_bo *bo, uint32_t *name)
+{
+ drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
+ drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
+ int ret;
+
+ if (!bo_gem->prime_name) {
+ ret = drmPrimeBufferSet(bufmgr_gem->fd, bo_gem->gem_handle, &bo_gem->prime_name);
+ if (ret) {
+ fprintf(stderr,"drm PBS failed\n");
+ }
+ }
+ *name = bo_gem->prime_name;
+}
+
static int
drm_intel_gem_bo_flink(drm_intel_bo *bo, uint32_t * name)
{
@@ -1947,6 +1965,7 @@ drm_intel_gem_bo_references(drm_intel_bo *bo, drm_intel_bo *target_bo)
return 0;
}
+
/**
* Initializes the GEM buffer manager, which uses the kernel to allocate, map,
* and manage map buffer objections.
diff --git a/radeon/radeon_bo.h b/radeon/radeon_bo.h
index 37478a0d..7d93ed1b 100644
--- a/radeon/radeon_bo.h
+++ b/radeon/radeon_bo.h
@@ -38,6 +38,8 @@
#define RADEON_BO_FLAGS_MICRO_TILE 2
#define RADEON_BO_FLAGS_MICRO_TILE_SQUARE 0x20
+#define RADEON_BO_FLAGS_SLAVE 0x80
+
struct radeon_bo_manager;
struct radeon_cs;
diff --git a/radeon/radeon_bo_gem.c b/radeon/radeon_bo_gem.c
index bc8058d8..fbd3318b 100644
--- a/radeon/radeon_bo_gem.c
+++ b/radeon/radeon_bo_gem.c
@@ -81,7 +81,15 @@ static struct radeon_bo *bo_open(struct radeon_bo_manager *bom,
bo->base.flags = flags;
bo->base.ptr = NULL;
bo->map_count = 0;
- if (handle) {
+ if (flags & RADEON_BO_FLAGS_SLAVE) {
+ r = drmPrimeBufferGet(bom->fd, handle, &bo->base.handle);
+ if (r != 0) {
+ fprintf(stderr,"failed to get prime slave buffer %d\n", handle);
+ free(bo);
+ return NULL;
+ }
+ }
+ else if (handle) {
struct drm_gem_open open_arg;
memset(&open_arg, 0, sizeof(open_arg));
diff --git a/xf86drm.c b/xf86drm.c
index 220aaa16..3f2dd6ac 100644
--- a/xf86drm.c
+++ b/xf86drm.c
@@ -2525,3 +2525,32 @@ char *drmGetDeviceNameFromFd(int fd)
return drmStrdup(name);
}
+
+int drmPrimeBufferSet(int fd, uint32_t handle, uint32_t *name)
+{
+ struct drm_prime_handle args;
+ int ret;
+
+ args.handle = handle;
+ ret = drmIoctl(fd, DRM_IOCTL_PRIME_SET, &args);
+ if (ret)
+ return ret;
+
+ *name = args.name;
+ return 0;
+}
+
+int drmPrimeBufferGet(int fd, uint32_t name, uint32_t *handle)
+{
+ struct drm_prime_handle args;
+ int ret;
+
+ args.name = name;
+ ret = drmIoctl(fd, DRM_IOCTL_PRIME_GET, &args);
+ if (ret)
+ return ret;
+
+ *handle = args.handle;
+ return 0;
+}
+
diff --git a/xf86drm.h b/xf86drm.h
index 9b89f562..dc8d12c6 100644
--- a/xf86drm.h
+++ b/xf86drm.h
@@ -718,5 +718,6 @@ typedef struct _drmEventContext {
extern int drmHandleEvent(int fd, drmEventContextPtr evctx);
extern char *drmGetDeviceNameFromFd(int fd);
-
+extern int drmPrimeBufferSet(int fd, uint32_t handle, uint32_t *name);
+extern int drmPrimeBufferGet(int fd, uint32_t name, uint32_t *handle);
#endif