Skip to content

Commit

Permalink
drm: base prime support
Browse files Browse the repository at this point in the history
  • Loading branch information
airlied authored and Rob Clark committed Dec 17, 2011
1 parent b1b4846 commit d67e903
Show file tree
Hide file tree
Showing 5 changed files with 51 additions and 2 deletions.
2 changes: 1 addition & 1 deletion drivers/gpu/drm/Makefile
Expand Up @@ -12,7 +12,7 @@ drm-y := drm_auth.o drm_buffer.o drm_bufs.o drm_cache.o \
drm_platform.o drm_sysfs.o drm_hashtab.o drm_sman.o drm_mm.o \
drm_crtc.o drm_modes.o drm_edid.o \
drm_info.o drm_debugfs.o drm_encoder_slave.o \
drm_trace_points.o drm_global.o drm_usb.o
drm_trace_points.o drm_global.o drm_usb.o drm_prime.o

drm-$(CONFIG_COMPAT) += drm_ioc32.o

Expand Down
3 changes: 3 additions & 0 deletions drivers/gpu/drm/drm_drv.c
Expand Up @@ -135,6 +135,9 @@ static struct drm_ioctl_desc drm_ioctls[] = {
DRM_IOCTL_DEF(DRM_IOCTL_GEM_FLINK, drm_gem_flink_ioctl, DRM_AUTH|DRM_UNLOCKED),
DRM_IOCTL_DEF(DRM_IOCTL_GEM_OPEN, drm_gem_open_ioctl, DRM_AUTH|DRM_UNLOCKED),

DRM_IOCTL_DEF(DRM_IOCTL_PRIME_SET, drm_prime_set_ioctl, DRM_AUTH|DRM_UNLOCKED),
DRM_IOCTL_DEF(DRM_IOCTL_PRIME_GET, drm_prime_get_ioctl, DRM_AUTH|DRM_UNLOCKED),

DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETRESOURCES, drm_mode_getresources, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPLANERESOURCES, drm_mode_getplane_res, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETCRTC, drm_mode_getcrtc, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
Expand Down
26 changes: 26 additions & 0 deletions drivers/gpu/drm/drm_prime.c
@@ -0,0 +1,26 @@

#include "drmP.h"

int drm_prime_set_ioctl(struct drm_device *dev, void *data,
struct drm_file *file_priv)
{
struct drm_prime_handle *args = data;

if (!drm_core_check_feature(dev, DRIVER_PRIME))
return -EINVAL;

dev->driver->prime_set(dev, file_priv, args->handle, &args->fd);
return 0;
}

int drm_prime_get_ioctl(struct drm_device *dev, void *data,
struct drm_file *file_priv)
{
struct drm_prime_handle *args = data;

if (!drm_core_check_feature(dev, DRIVER_PRIME))
return -EINVAL;

dev->driver->prime_get(dev, file_priv, args->fd, &args->handle);
return 0;
}
10 changes: 9 additions & 1 deletion include/drm/drm.h
Expand Up @@ -617,6 +617,13 @@ struct drm_get_cap {
__u64 value;
};

struct drm_prime_handle {
__u32 handle;

/* returned fd for prime */
int fd;
};

#include "drm_mode.h"

#define DRM_IOCTL_BASE 'd'
Expand Down Expand Up @@ -673,7 +680,8 @@ struct drm_get_cap {
#define DRM_IOCTL_UNLOCK DRM_IOW( 0x2b, struct drm_lock)
#define DRM_IOCTL_FINISH DRM_IOW( 0x2c, struct drm_lock)

#define DRM_IOCTL_GEM_PRIME_OPEN DRM_IOWR(0x2e, struct drm_gem_open)
#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)
Expand Down
12 changes: 12 additions & 0 deletions include/drm/drmP.h
Expand Up @@ -150,6 +150,7 @@ int drm_err(const char *func, const char *format, ...);
#define DRIVER_IRQ_VBL2 0x800
#define DRIVER_GEM 0x1000
#define DRIVER_MODESET 0x2000
#define DRIVER_PRIME 0x4000

#define DRIVER_BUS_PCI 0x1
#define DRIVER_BUS_PLATFORM 0x2
Expand Down Expand Up @@ -890,6 +891,13 @@ struct drm_driver {
int (*gem_open_object) (struct drm_gem_object *, struct drm_file *);
void (*gem_close_object) (struct drm_gem_object *, struct drm_file *);

/* prime */
int (*prime_set)(struct drm_device *dev, struct drm_file *file_priv,
uint32_t handle, int *prime_fd);

int (*prime_get)(struct drm_device *dev, struct drm_file *file_priv,
int prime_fd, uint32_t *handle);

/* vga arb irq handler */
void (*vgaarb_irq)(struct drm_device *dev, bool state);

Expand Down Expand Up @@ -1501,6 +1509,10 @@ extern int drm_vblank_info(struct seq_file *m, void *data);
extern int drm_clients_info(struct seq_file *m, void* data);
extern int drm_gem_name_info(struct seq_file *m, void *data);

extern int drm_prime_get_ioctl(struct drm_device *dev, void *data,
struct drm_file *file_priv);
extern int drm_prime_set_ioctl(struct drm_device *dev, void *data,
struct drm_file *file_priv);
#if DRM_DEBUG_CODE
extern int drm_vma_info(struct seq_file *m, void *data);
#endif
Expand Down

0 comments on commit d67e903

Please sign in to comment.