diff --git a/linux-core/i810_dma.c b/linux-core/i810_dma.c index 56b99850..4d431a18 100644 --- a/linux-core/i810_dma.c +++ b/linux-core/i810_dma.c @@ -911,6 +911,20 @@ int i810_dma_vertex(struct inode *inode, struct file *filp, } +int i810_getage(struct inode *inode, struct file *filp, unsigned int cmd, + unsigned long arg) +{ + drm_file_t *priv = filp->private_data; + drm_device_t *dev = priv->dev; + drm_i810_private_t *dev_priv = (drm_i810_private_t *)dev->dev_private; + u32 *hw_status = (u32 *)dev_priv->hw_status_page; + drm_i810_sarea_t *sarea_priv = (drm_i810_sarea_t *) + dev_priv->sarea_priv; + + sarea_priv->last_dispatch = (int) hw_status[5]; + return 0; +} + int i810_dma(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg) { diff --git a/linux-core/i810_drv.c b/linux-core/i810_drv.c index 85a5b05e..d62c95be 100644 --- a/linux-core/i810_drv.c +++ b/linux-core/i810_drv.c @@ -111,6 +111,7 @@ static drm_ioctl_desc_t i810_ioctls[] = { [DRM_IOCTL_NR(DRM_IOCTL_I810_VERTEX)] = { i810_dma_vertex, 1, 0 }, [DRM_IOCTL_NR(DRM_IOCTL_I810_DMA)] = { i810_dma_general,1, 0 }, [DRM_IOCTL_NR(DRM_IOCTL_I810_FLUSH)] = { i810_flush_ioctl,1, 0 }, + [DRM_IOCTL_NR(DRM_IOCTL_I810_GETAGE)] = { i810_getage, 1, 0 }, }; #define I810_IOCTL_COUNT DRM_ARRAY_SIZE(i810_ioctls) diff --git a/linux-core/i810_drv.h b/linux-core/i810_drv.h index 36d477a4..44c61b84 100644 --- a/linux-core/i810_drv.h +++ b/linux-core/i810_drv.h @@ -85,6 +85,8 @@ extern int i810_dma_init(struct inode *inode, struct file *filp, extern int i810_flush_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg); extern void i810_reclaim_buffers(drm_device_t *dev, pid_t pid); +extern int i810_getage(struct inode *inode, struct file *filp, unsigned int cmd, + unsigned long arg); /* i810_bufs.c */ diff --git a/linux/i810_dma.c b/linux/i810_dma.c index 56b99850..4d431a18 100644 --- a/linux/i810_dma.c +++ b/linux/i810_dma.c @@ -911,6 +911,20 @@ int i810_dma_vertex(struct inode *inode, struct file *filp, } +int i810_getage(struct inode *inode, struct file *filp, unsigned int cmd, + unsigned long arg) +{ + drm_file_t *priv = filp->private_data; + drm_device_t *dev = priv->dev; + drm_i810_private_t *dev_priv = (drm_i810_private_t *)dev->dev_private; + u32 *hw_status = (u32 *)dev_priv->hw_status_page; + drm_i810_sarea_t *sarea_priv = (drm_i810_sarea_t *) + dev_priv->sarea_priv; + + sarea_priv->last_dispatch = (int) hw_status[5]; + return 0; +} + int i810_dma(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg) { diff --git a/linux/i810_drm_public.h b/linux/i810_drm_public.h index 9ed8bef6..2bc5afa0 100644 --- a/linux/i810_drm_public.h +++ b/linux/i810_drm_public.h @@ -134,4 +134,5 @@ typedef struct { #define DRM_IOCTL_I810_VERTEX DRM_IOW( 0x41, drm_i810_vertex_t) #define DRM_IOCTL_I810_DMA DRM_IOW( 0x42, drm_i810_general_t) #define DRM_IOCTL_I810_FLUSH DRM_IO ( 0x43) +#define DRM_IOCTL_I810_GETAGE DRM_IO ( 0x44) #endif /* _I810_DRM_H_ */ diff --git a/linux/i810_drv.c b/linux/i810_drv.c index 85a5b05e..d62c95be 100644 --- a/linux/i810_drv.c +++ b/linux/i810_drv.c @@ -111,6 +111,7 @@ static drm_ioctl_desc_t i810_ioctls[] = { [DRM_IOCTL_NR(DRM_IOCTL_I810_VERTEX)] = { i810_dma_vertex, 1, 0 }, [DRM_IOCTL_NR(DRM_IOCTL_I810_DMA)] = { i810_dma_general,1, 0 }, [DRM_IOCTL_NR(DRM_IOCTL_I810_FLUSH)] = { i810_flush_ioctl,1, 0 }, + [DRM_IOCTL_NR(DRM_IOCTL_I810_GETAGE)] = { i810_getage, 1, 0 }, }; #define I810_IOCTL_COUNT DRM_ARRAY_SIZE(i810_ioctls) diff --git a/linux/i810_drv.h b/linux/i810_drv.h index 36d477a4..44c61b84 100644 --- a/linux/i810_drv.h +++ b/linux/i810_drv.h @@ -85,6 +85,8 @@ extern int i810_dma_init(struct inode *inode, struct file *filp, extern int i810_flush_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg); extern void i810_reclaim_buffers(drm_device_t *dev, pid_t pid); +extern int i810_getage(struct inode *inode, struct file *filp, unsigned int cmd, + unsigned long arg); /* i810_bufs.c */