diff options
author | Dave Airlie <airlied@redhat.com> | 2010-03-12 09:02:31 +1000 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2010-03-12 09:02:38 +1000 |
commit | bdf925966f02952f82133d5764cb2b2fae1ce7d7 (patch) | |
tree | a3e3a99e7f08510c486ca41925507e21900640b9 | |
parent | 04fd3872ee8bd8d5e2c27740508c67c2d51dbc11 (diff) |
prime add supportprime-test
-rw-r--r-- | include/drm/drm.h | 14 | ||||
-rw-r--r-- | include/drm/drm_mode.h | 40 | ||||
-rw-r--r-- | include/drm/vmwgfx_drm.h | 43 | ||||
-rw-r--r-- | intel/intel_bufmgr.h | 2 | ||||
-rw-r--r-- | intel/intel_bufmgr_gem.c | 19 | ||||
-rw-r--r-- | radeon/radeon_bo.h | 2 | ||||
-rw-r--r-- | radeon/radeon_bo_gem.c | 10 | ||||
-rw-r--r-- | xf86drm.c | 29 | ||||
-rw-r--r-- | xf86drm.h | 3 |
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)); @@ -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; +} + @@ -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 |