drm: update to i915 1.3.0

Add support for vblank ioctls to i915 driver

From: Dave Airlie <airlied@linux.ie>
Signed-off-by: Dave Airlie <airlied@linux.ie>

authored by Dave Airlie and committed by Dave Airlie 0d6aa60b f0c408b5

+78 -39
+7 -5
drivers/char/drm/i915_dma.c
··· 1 1 /* i915_dma.c -- DMA support for the I915 -*- linux-c -*- 2 2 */ 3 - /************************************************************************** 4 - * 3 + /* 5 4 * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas. 6 5 * All Rights Reserved. 7 6 * ··· 24 25 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 25 26 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 26 27 * 27 - **************************************************************************/ 28 + */ 28 29 29 30 #include "drmP.h" 30 31 #include "drm.h" ··· 195 196 return 0; 196 197 } 197 198 198 - static int i915_resume(drm_device_t * dev) 199 + static int i915_dma_resume(drm_device_t * dev) 199 200 { 200 201 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 201 202 ··· 252 253 retcode = i915_dma_cleanup(dev); 253 254 break; 254 255 case I915_RESUME_DMA: 255 - retcode = i915_resume(dev); 256 + retcode = i915_dma_resume(dev); 256 257 break; 257 258 default: 258 259 retcode = -EINVAL; ··· 652 653 break; 653 654 case I915_PARAM_ALLOW_BATCHBUFFER: 654 655 value = dev_priv->allow_batchbuffer ? 1 : 0; 656 + break; 657 + case I915_PARAM_LAST_DISPATCH: 658 + value = READ_BREADCRUMB(dev_priv); 655 659 break; 656 660 default: 657 661 DRM_ERROR("Unkown parameter %d\n", param.param);
+3 -3
drivers/char/drm/i915_drm.h
··· 1 - /************************************************************************** 2 - * 1 + /* 3 2 * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas. 4 3 * All Rights Reserved. 5 4 * ··· 22 23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 23 24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24 25 * 25 - **************************************************************************/ 26 + */ 26 27 27 28 #ifndef _I915_DRM_H_ 28 29 #define _I915_DRM_H_ ··· 151 152 */ 152 153 #define I915_PARAM_IRQ_ACTIVE 1 153 154 #define I915_PARAM_ALLOW_BATCHBUFFER 2 155 + #define I915_PARAM_LAST_DISPATCH 3 154 156 155 157 typedef struct drm_i915_getparam { 156 158 int param;
+4 -3
drivers/char/drm/i915_drv.c
··· 1 1 /* i915_drv.c -- i830,i845,i855,i865,i915 driver -*- linux-c -*- 2 2 */ 3 - /************************************************************************** 3 + /* 4 4 * 5 5 * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas. 6 6 * All Rights Reserved. ··· 25 25 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 26 26 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 27 27 * 28 - **************************************************************************/ 28 + */ 29 29 30 30 #include "drmP.h" 31 31 #include "drm.h" ··· 44 44 */ 45 45 .driver_features = 46 46 DRIVER_USE_AGP | DRIVER_REQUIRE_AGP | /* DRIVER_USE_MTRR |*/ 47 - DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED, 47 + DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED | DRIVER_IRQ_VBL, 48 48 .load = i915_driver_load, 49 49 .lastclose = i915_driver_lastclose, 50 50 .preclose = i915_driver_preclose, 51 51 .device_is_agp = i915_driver_device_is_agp, 52 + .vblank_wait = i915_driver_vblank_wait, 52 53 .irq_preinstall = i915_driver_irq_preinstall, 53 54 .irq_postinstall = i915_driver_irq_postinstall, 54 55 .irq_uninstall = i915_driver_irq_uninstall,
+23 -16
drivers/char/drm/i915_drv.h
··· 1 1 /* i915_drv.h -- Private header for the I915 driver -*- linux-c -*- 2 2 */ 3 - /************************************************************************** 3 + /* 4 4 * 5 5 * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas. 6 6 * All Rights Reserved. ··· 25 25 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 26 26 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 27 27 * 28 - **************************************************************************/ 28 + */ 29 29 30 30 #ifndef _I915_DRV_H_ 31 31 #define _I915_DRV_H_ ··· 37 37 38 38 #define DRIVER_NAME "i915" 39 39 #define DRIVER_DESC "Intel Graphics" 40 - #define DRIVER_DATE "20040405" 40 + #define DRIVER_DATE "20051209" 41 41 42 42 /* Interface history: 43 43 * 44 44 * 1.1: Original. 45 + * 1.2: Add Power Management 46 + * 1.3: Add vblank support 45 47 */ 46 48 #define DRIVER_MAJOR 1 47 - #define DRIVER_MINOR 1 49 + #define DRIVER_MINOR 3 48 50 #define DRIVER_PATCHLEVEL 0 49 - 50 - /* We use our own dma mechanisms, not the drm template code. However, 51 - * the shared IRQ code is useful to us: 52 - */ 53 - #define __HAVE_PM 1 54 51 55 52 typedef struct _drm_i915_ring_buffer { 56 53 int tail_mask; ··· 94 97 int tex_lru_log_granularity; 95 98 int allow_batchbuffer; 96 99 struct mem_block *agp_heap; 100 + unsigned int sr01, adpa, ppcr, dvob, dvoc, lvds; 97 101 } drm_i915_private_t; 98 102 99 103 extern drm_ioctl_desc_t i915_ioctls[]; ··· 106 108 extern void i915_driver_lastclose(drm_device_t * dev); 107 109 extern void i915_driver_preclose(drm_device_t * dev, DRMFILE filp); 108 110 extern int i915_driver_device_is_agp(drm_device_t * dev); 111 + extern long i915_compat_ioctl(struct file *filp, unsigned int cmd, 112 + unsigned long arg); 109 113 110 114 /* i915_irq.c */ 111 115 extern int i915_irq_emit(DRM_IOCTL_ARGS); 112 116 extern int i915_irq_wait(DRM_IOCTL_ARGS); 113 117 118 + extern int i915_driver_vblank_wait(drm_device_t *dev, unsigned int *sequence); 114 119 extern irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS); 115 120 extern void i915_driver_irq_preinstall(drm_device_t * dev); 116 121 extern void i915_driver_irq_postinstall(drm_device_t * dev); ··· 127 126 extern void i915_mem_release(drm_device_t * dev, 128 127 DRMFILE filp, struct mem_block *heap); 129 128 130 - extern long i915_compat_ioctl(struct file *filp, unsigned int cmd, 131 - unsigned long arg); 132 - 133 - #define I915_READ(reg) DRM_READ32(dev_priv->mmio_map, reg) 134 - #define I915_WRITE(reg,val) DRM_WRITE32(dev_priv->mmio_map, reg, val) 135 - #define I915_READ16(reg) DRM_READ16(dev_priv->mmio_map, reg) 136 - #define I915_WRITE16(reg,val) DRM_WRITE16(dev_priv->mmio_map, reg, val) 129 + #define I915_READ(reg) DRM_READ32(dev_priv->mmio_map, (reg)) 130 + #define I915_WRITE(reg,val) DRM_WRITE32(dev_priv->mmio_map, (reg), (val)) 131 + #define I915_READ16(reg) DRM_READ16(dev_priv->mmio_map, (reg)) 132 + #define I915_WRITE16(reg,val) DRM_WRITE16(dev_priv->mmio_map, (reg), (val)) 137 133 138 134 #define I915_VERBOSE 0 139 135 ··· 194 196 #define PPCR 0x61204 195 197 #define PPCR_ON (1<<0) 196 198 199 + #define DVOB 0x61140 200 + #define DVOB_ON (1<<31) 201 + #define DVOC 0x61160 202 + #define DVOC_ON (1<<31) 203 + #define LVDS 0x61180 204 + #define LVDS_ON (1<<31) 205 + 197 206 #define ADPA 0x61100 198 207 #define ADPA_DPMS_MASK (~(3<<10)) 199 208 #define ADPA_DPMS_ON (0<<10) ··· 263 258 #define ASYNC_FLIP (1<<22) 264 259 265 260 #define CMD_OP_DESTBUFFER_INFO ((0x3<<29)|(0x1d<<24)|(0x8e<<16)|1) 261 + 262 + #define READ_BREADCRUMB(dev_priv) (((u32 *)(dev_priv->hw_status_page))[5]) 266 263 267 264 #endif
+39 -9
drivers/char/drm/i915_irq.c
··· 1 - /* i915_dma.c -- DMA support for the I915 -*- linux-c -*- 1 + /* i915_irq.c -- IRQ support for the I915 -*- linux-c -*- 2 2 */ 3 - /************************************************************************** 4 - * 3 + /* 5 4 * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas. 6 5 * All Rights Reserved. 7 6 * ··· 24 25 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 25 26 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 26 27 * 27 - **************************************************************************/ 28 + */ 28 29 29 30 #include "drmP.h" 30 31 #include "drm.h" 31 32 #include "i915_drm.h" 32 33 #include "i915_drv.h" 33 34 34 - #define USER_INT_FLAG 0x2 35 + #define USER_INT_FLAG (1<<1) 36 + #define VSYNC_PIPEB_FLAG (1<<5) 37 + #define VSYNC_PIPEA_FLAG (1<<7) 38 + 35 39 #define MAX_NOPID ((u32)~0) 36 - #define READ_BREADCRUMB(dev_priv) (((u32*)(dev_priv->hw_status_page))[5]) 37 40 38 41 irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS) 39 42 { ··· 44 43 u16 temp; 45 44 46 45 temp = I915_READ16(I915REG_INT_IDENTITY_R); 47 - temp &= USER_INT_FLAG; 46 + temp &= (USER_INT_FLAG | VSYNC_PIPEA_FLAG); 48 47 49 48 DRM_DEBUG("%s flag=%08x\n", __FUNCTION__, temp); 50 49 ··· 52 51 return IRQ_NONE; 53 52 54 53 I915_WRITE16(I915REG_INT_IDENTITY_R, temp); 55 - DRM_WAKEUP(&dev_priv->irq_queue); 54 + 55 + if (temp & USER_INT_FLAG) 56 + DRM_WAKEUP(&dev_priv->irq_queue); 57 + 58 + if (temp & VSYNC_PIPEA_FLAG) { 59 + atomic_inc(&dev->vbl_received); 60 + DRM_WAKEUP(&dev->vbl_queue); 61 + drm_vbl_send_signals(dev); 62 + } 56 63 57 64 return IRQ_HANDLED; 58 65 } ··· 110 101 dev_priv->sarea_priv->last_dispatch = READ_BREADCRUMB(dev_priv); 111 102 return ret; 112 103 } 104 + 105 + int i915_driver_vblank_wait(drm_device_t *dev, unsigned int *sequence) 106 + { 107 + drm_i915_private_t *dev_priv = dev->dev_private; 108 + unsigned int cur_vblank; 109 + int ret = 0; 110 + 111 + if (!dev_priv) { 112 + DRM_ERROR("%s called with no initialization\n", __FUNCTION__); 113 + return DRM_ERR(EINVAL); 114 + } 115 + 116 + DRM_WAIT_ON(ret, dev->vbl_queue, 3 * DRM_HZ, 117 + (((cur_vblank = atomic_read(&dev->vbl_received)) 118 + - *sequence) <= (1<<23))); 119 + 120 + *sequence = cur_vblank; 121 + 122 + return ret; 123 + } 124 + 113 125 114 126 /* Needs the lock as it touches the ring. 115 127 */ ··· 195 165 { 196 166 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 197 167 198 - I915_WRITE16(I915REG_INT_ENABLE_R, USER_INT_FLAG); 168 + I915_WRITE16(I915REG_INT_ENABLE_R, USER_INT_FLAG | VSYNC_PIPEA_FLAG); 199 169 DRM_INIT_WAITQUEUE(&dev_priv->irq_queue); 200 170 } 201 171
+2 -3
drivers/char/drm/i915_mem.c
··· 1 1 /* i915_mem.c -- Simple agp/fb memory manager for i915 -*- linux-c -*- 2 2 */ 3 - /************************************************************************** 4 - * 3 + /* 5 4 * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas. 6 5 * All Rights Reserved. 7 6 * ··· 24 25 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 25 26 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 26 27 * 27 - **************************************************************************/ 28 + */ 28 29 29 30 #include "drmP.h" 30 31 #include "drm.h"