drm/i915: force mode set at lid open time
[safe/jmp/linux-2.6] / drivers / gpu / drm / i915 / i915_drv.h
index 76914ae..f2b8d27 100644 (file)
@@ -85,7 +85,6 @@ struct drm_i915_gem_phys_object {
 };
 
 typedef struct _drm_i915_ring_buffer {
-       int tail_mask;
        unsigned long Size;
        u8 *virtual_start;
        int head;
@@ -156,6 +155,7 @@ typedef struct drm_i915_private {
 
        void __iomem *regs;
 
+       struct pci_dev *bridge_dev;
        drm_i915_ring_buffer_t ring;
 
        drm_dma_handle_t *status_page_dmah;
@@ -222,6 +222,8 @@ typedef struct drm_i915_private {
        unsigned int edp_support:1;
        int lvds_ssc_freq;
 
+       struct notifier_block lid_notifier;
+
        int crt_ddc_bus; /* -1 = unknown, else GPIO to use for CRT DDC */
        struct drm_i915_fence_reg fence_regs[16]; /* assume 965 */
        int fence_reg_start; /* 4 if userland hasn't ioctl'd us yet */
@@ -790,33 +792,32 @@ extern void intel_modeset_cleanup(struct drm_device *dev);
 
 #define I915_VERBOSE 0
 
-#define RING_LOCALS    unsigned int outring, ringmask, outcount; \
-                        volatile char *virt;
-
-#define BEGIN_LP_RING(n) do {                          \
-       if (I915_VERBOSE)                               \
-               DRM_DEBUG("BEGIN_LP_RING(%d)\n", (n));  \
-       if (dev_priv->ring.space < (n)*4)               \
-               i915_wait_ring(dev, (n)*4, __func__);           \
-       outcount = 0;                                   \
-       outring = dev_priv->ring.tail;                  \
-       ringmask = dev_priv->ring.tail_mask;            \
-       virt = dev_priv->ring.virtual_start;            \
+#define RING_LOCALS    volatile unsigned int *ring_virt__;
+
+#define BEGIN_LP_RING(n) do {                                          \
+       int bytes__ = 4*(n);                                            \
+       if (I915_VERBOSE) DRM_DEBUG("BEGIN_LP_RING(%d)\n", (n));        \
+       /* a wrap must occur between instructions so pad beforehand */  \
+       if (unlikely (dev_priv->ring.tail + bytes__ > dev_priv->ring.Size)) \
+               i915_wrap_ring(dev);                                    \
+       if (unlikely (dev_priv->ring.space < bytes__))                  \
+               i915_wait_ring(dev, bytes__, __func__);                 \
+       ring_virt__ = (unsigned int *)                                  \
+               (dev_priv->ring.virtual_start + dev_priv->ring.tail);   \
+       dev_priv->ring.tail += bytes__;                                 \
+       dev_priv->ring.tail &= dev_priv->ring.Size - 1;                 \
+       dev_priv->ring.space -= bytes__;                                \
 } while (0)
 
-#define OUT_RING(n) do {                                       \
+#define OUT_RING(n) do {                                               \
        if (I915_VERBOSE) DRM_DEBUG("   OUT_RING %x\n", (int)(n));      \
-       *(volatile unsigned int *)(virt + outring) = (n);       \
-        outcount++;                                            \
-       outring += 4;                                           \
-       outring &= ringmask;                                    \
+       *ring_virt__++ = (n);                                           \
 } while (0)
 
 #define ADVANCE_LP_RING() do {                                         \
-       if (I915_VERBOSE) DRM_DEBUG("ADVANCE_LP_RING %x\n", outring);   \
-       dev_priv->ring.tail = outring;                                  \
-       dev_priv->ring.space -= outcount * 4;                           \
-       I915_WRITE(PRB0_TAIL, outring);                 \
+       if (I915_VERBOSE)                                               \
+               DRM_DEBUG("ADVANCE_LP_RING %x\n", dev_priv->ring.tail); \
+       I915_WRITE(PRB0_TAIL, dev_priv->ring.tail);                     \
 } while(0)
 
 /**
@@ -839,6 +840,7 @@ extern void intel_modeset_cleanup(struct drm_device *dev);
 #define I915_GEM_HWS_INDEX             0x20
 #define I915_BREADCRUMB_INDEX          0x21
 
+extern int i915_wrap_ring(struct drm_device * dev);
 extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);
 
 #define IS_I830(dev) ((dev)->pci_device == 0x3577)
@@ -863,6 +865,7 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);
                       (dev)->pci_device == 0x2E12 || \
                       (dev)->pci_device == 0x2E22 || \
                       (dev)->pci_device == 0x2E32 || \
+                      (dev)->pci_device == 0x2E42 || \
                       (dev)->pci_device == 0x0042 || \
                       (dev)->pci_device == 0x0046)
 
@@ -875,6 +878,7 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);
                     (dev)->pci_device == 0x2E12 || \
                     (dev)->pci_device == 0x2E22 || \
                     (dev)->pci_device == 0x2E32 || \
+                    (dev)->pci_device == 0x2E42 || \
                     IS_GM45(dev))
 
 #define IS_IGDG(dev) ((dev)->pci_device == 0xa001)
@@ -908,7 +912,7 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);
 #define SUPPORTS_INTEGRATED_HDMI(dev)  (IS_G4X(dev) || IS_IGDNG(dev))
 #define SUPPORTS_INTEGRATED_DP(dev)    (IS_G4X(dev) || IS_IGDNG(dev))
 #define SUPPORTS_EDP(dev)              (IS_IGDNG_M(dev))
-#define I915_HAS_HOTPLUG(dev) (IS_I945G(dev) || IS_I945GM(dev) || IS_I965G(dev))
+#define I915_HAS_HOTPLUG(dev) (IS_I945G(dev) || IS_I945GM(dev) || IS_G33(dev) || IS_I965G(dev))
 /* dsparb controlled by hw only */
 #define DSPARB_HWCONTROL(dev) (IS_G4X(dev) || IS_IGDNG(dev))