···11/* i915_dma.c -- DMA support for the I915 -*- linux-c -*-22 */33-/**************************************************************************44- *33+/*54 * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.65 * All Rights Reserved.76 *···2425 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE2526 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.2627 *2727- **************************************************************************/2828+ */28292930#include "drmP.h"3031#include "drm.h"···195196 return 0;196197}197198198198-static int i915_resume(drm_device_t * dev)199199+static int i915_dma_resume(drm_device_t * dev)199200{200201 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;201202···252253 retcode = i915_dma_cleanup(dev);253254 break;254255 case I915_RESUME_DMA:255255- retcode = i915_resume(dev);256256+ retcode = i915_dma_resume(dev);256257 break;257258 default:258259 retcode = -EINVAL;···652653 break;653654 case I915_PARAM_ALLOW_BATCHBUFFER:654655 value = dev_priv->allow_batchbuffer ? 1 : 0;656656+ break;657657+ case I915_PARAM_LAST_DISPATCH:658658+ value = READ_BREADCRUMB(dev_priv);655659 break;656660 default:657661 DRM_ERROR("Unkown parameter %d\n", param.param);
+3-3
drivers/char/drm/i915_drm.h
···11-/**************************************************************************22- *11+/*32 * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.43 * All Rights Reserved.54 *···2223 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE2324 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.2425 *2525- **************************************************************************/2626+ */26272728#ifndef _I915_DRM_H_2829#define _I915_DRM_H_···151152 */152153#define I915_PARAM_IRQ_ACTIVE 1153154#define I915_PARAM_ALLOW_BATCHBUFFER 2155155+#define I915_PARAM_LAST_DISPATCH 3154156155157typedef struct drm_i915_getparam {156158 int param;
+4-3
drivers/char/drm/i915_drv.c
···11/* i915_drv.c -- i830,i845,i855,i865,i915 driver -*- linux-c -*-22 */33-/**************************************************************************33+/*44 *55 * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.66 * All Rights Reserved.···2525 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE2626 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.2727 *2828- **************************************************************************/2828+ */29293030#include "drmP.h"3131#include "drm.h"···4444 */4545 .driver_features =4646 DRIVER_USE_AGP | DRIVER_REQUIRE_AGP | /* DRIVER_USE_MTRR |*/4747- DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED,4747+ DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED | DRIVER_IRQ_VBL,4848 .load = i915_driver_load,4949 .lastclose = i915_driver_lastclose,5050 .preclose = i915_driver_preclose,5151 .device_is_agp = i915_driver_device_is_agp,5252+ .vblank_wait = i915_driver_vblank_wait,5253 .irq_preinstall = i915_driver_irq_preinstall,5354 .irq_postinstall = i915_driver_irq_postinstall,5455 .irq_uninstall = i915_driver_irq_uninstall,
+23-16
drivers/char/drm/i915_drv.h
···11/* i915_drv.h -- Private header for the I915 driver -*- linux-c -*-22 */33-/**************************************************************************33+/*44 *55 * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.66 * All Rights Reserved.···2525 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE2626 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.2727 *2828- **************************************************************************/2828+ */29293030#ifndef _I915_DRV_H_3131#define _I915_DRV_H_···37373838#define DRIVER_NAME "i915"3939#define DRIVER_DESC "Intel Graphics"4040-#define DRIVER_DATE "20040405"4040+#define DRIVER_DATE "20051209"41414242/* Interface history:4343 *4444 * 1.1: Original.4545+ * 1.2: Add Power Management4646+ * 1.3: Add vblank support4547 */4648#define DRIVER_MAJOR 14747-#define DRIVER_MINOR 14949+#define DRIVER_MINOR 34850#define DRIVER_PATCHLEVEL 04949-5050-/* We use our own dma mechanisms, not the drm template code. However,5151- * the shared IRQ code is useful to us:5252- */5353-#define __HAVE_PM 154515552typedef struct _drm_i915_ring_buffer {5653 int tail_mask;···9497 int tex_lru_log_granularity;9598 int allow_batchbuffer;9699 struct mem_block *agp_heap;100100+ unsigned int sr01, adpa, ppcr, dvob, dvoc, lvds;97101} drm_i915_private_t;9810299103extern drm_ioctl_desc_t i915_ioctls[];···106108extern void i915_driver_lastclose(drm_device_t * dev);107109extern void i915_driver_preclose(drm_device_t * dev, DRMFILE filp);108110extern int i915_driver_device_is_agp(drm_device_t * dev);111111+extern long i915_compat_ioctl(struct file *filp, unsigned int cmd,112112+ unsigned long arg);109113110114/* i915_irq.c */111115extern int i915_irq_emit(DRM_IOCTL_ARGS);112116extern int i915_irq_wait(DRM_IOCTL_ARGS);113117118118+extern int i915_driver_vblank_wait(drm_device_t *dev, unsigned int *sequence);114119extern irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS);115120extern void i915_driver_irq_preinstall(drm_device_t * dev);116121extern void i915_driver_irq_postinstall(drm_device_t * dev);···127126extern void i915_mem_release(drm_device_t * dev,128127 DRMFILE filp, struct mem_block *heap);129128130130-extern long i915_compat_ioctl(struct file *filp, unsigned int cmd,131131- unsigned long arg);132132-133133-#define I915_READ(reg) DRM_READ32(dev_priv->mmio_map, reg)134134-#define I915_WRITE(reg,val) DRM_WRITE32(dev_priv->mmio_map, reg, val)135135-#define I915_READ16(reg) DRM_READ16(dev_priv->mmio_map, reg)136136-#define I915_WRITE16(reg,val) DRM_WRITE16(dev_priv->mmio_map, reg, val)129129+#define I915_READ(reg) DRM_READ32(dev_priv->mmio_map, (reg))130130+#define I915_WRITE(reg,val) DRM_WRITE32(dev_priv->mmio_map, (reg), (val))131131+#define I915_READ16(reg) DRM_READ16(dev_priv->mmio_map, (reg))132132+#define I915_WRITE16(reg,val) DRM_WRITE16(dev_priv->mmio_map, (reg), (val))137133138134#define I915_VERBOSE 0139135···194196#define PPCR 0x61204195197#define PPCR_ON (1<<0)196198199199+#define DVOB 0x61140200200+#define DVOB_ON (1<<31)201201+#define DVOC 0x61160202202+#define DVOC_ON (1<<31)203203+#define LVDS 0x61180204204+#define LVDS_ON (1<<31)205205+197206#define ADPA 0x61100198207#define ADPA_DPMS_MASK (~(3<<10))199208#define ADPA_DPMS_ON (0<<10)···263258#define ASYNC_FLIP (1<<22)264259265260#define CMD_OP_DESTBUFFER_INFO ((0x3<<29)|(0x1d<<24)|(0x8e<<16)|1)261261+262262+#define READ_BREADCRUMB(dev_priv) (((u32 *)(dev_priv->hw_status_page))[5])266263267264#endif
+39-9
drivers/char/drm/i915_irq.c
···11-/* i915_dma.c -- DMA support for the I915 -*- linux-c -*-11+/* i915_irq.c -- IRQ support for the I915 -*- linux-c -*-22 */33-/**************************************************************************44- *33+/*54 * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.65 * All Rights Reserved.76 *···2425 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE2526 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.2627 *2727- **************************************************************************/2828+ */28292930#include "drmP.h"3031#include "drm.h"3132#include "i915_drm.h"3233#include "i915_drv.h"33343434-#define USER_INT_FLAG 0x23535+#define USER_INT_FLAG (1<<1)3636+#define VSYNC_PIPEB_FLAG (1<<5)3737+#define VSYNC_PIPEA_FLAG (1<<7)3838+3539#define MAX_NOPID ((u32)~0)3636-#define READ_BREADCRUMB(dev_priv) (((u32*)(dev_priv->hw_status_page))[5])37403841irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS)3942{···4443 u16 temp;45444645 temp = I915_READ16(I915REG_INT_IDENTITY_R);4747- temp &= USER_INT_FLAG;4646+ temp &= (USER_INT_FLAG | VSYNC_PIPEA_FLAG);48474948 DRM_DEBUG("%s flag=%08x\n", __FUNCTION__, temp);5049···5251 return IRQ_NONE;53525453 I915_WRITE16(I915REG_INT_IDENTITY_R, temp);5555- DRM_WAKEUP(&dev_priv->irq_queue);5454+5555+ if (temp & USER_INT_FLAG)5656+ DRM_WAKEUP(&dev_priv->irq_queue);5757+5858+ if (temp & VSYNC_PIPEA_FLAG) {5959+ atomic_inc(&dev->vbl_received);6060+ DRM_WAKEUP(&dev->vbl_queue);6161+ drm_vbl_send_signals(dev);6262+ }56635764 return IRQ_HANDLED;5865}···110101 dev_priv->sarea_priv->last_dispatch = READ_BREADCRUMB(dev_priv);111102 return ret;112103}104104+105105+int i915_driver_vblank_wait(drm_device_t *dev, unsigned int *sequence)106106+{107107+ drm_i915_private_t *dev_priv = dev->dev_private;108108+ unsigned int cur_vblank;109109+ int ret = 0;110110+111111+ if (!dev_priv) {112112+ DRM_ERROR("%s called with no initialization\n", __FUNCTION__);113113+ return DRM_ERR(EINVAL);114114+ }115115+116116+ DRM_WAIT_ON(ret, dev->vbl_queue, 3 * DRM_HZ,117117+ (((cur_vblank = atomic_read(&dev->vbl_received))118118+ - *sequence) <= (1<<23)));119119+120120+ *sequence = cur_vblank;121121+122122+ return ret;123123+}124124+113125114126/* Needs the lock as it touches the ring.115127 */···195165{196166 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;197167198198- I915_WRITE16(I915REG_INT_ENABLE_R, USER_INT_FLAG);168168+ I915_WRITE16(I915REG_INT_ENABLE_R, USER_INT_FLAG | VSYNC_PIPEA_FLAG);199169 DRM_INIT_WAITQUEUE(&dev_priv->irq_queue);200170}201171
+2-3
drivers/char/drm/i915_mem.c
···11/* i915_mem.c -- Simple agp/fb memory manager for i915 -*- linux-c -*-22 */33-/**************************************************************************44- *33+/*54 * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.65 * All Rights Reserved.76 *···2425 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE2526 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.2627 *2727- **************************************************************************/2828+ */28292930#include "drmP.h"3031#include "drm.h"