Upcoming hardware will not have the various display pipe register
ranges evenly spaced in memory. Change register address calculations
into array lookups.

Tested on SandyBridge.

I left the UMS cruft untouched.

Signed-off-by: Antti Koskipaa <antti.koski...@linux.intel.com>
---
 drivers/gpu/drm/i915/dvo_ns2501.c |  6 ++--
 drivers/gpu/drm/i915/i915_dma.c   | 16 +++++++++++
 drivers/gpu/drm/i915/i915_drv.h   | 10 ++++++-
 drivers/gpu/drm/i915/i915_reg.h   | 59 +++++++++++++++++++++++++++------------
 4 files changed, 69 insertions(+), 22 deletions(-)

diff --git a/drivers/gpu/drm/i915/dvo_ns2501.c 
b/drivers/gpu/drm/i915/dvo_ns2501.c
index c4a255b..ce6a11b 100644
--- a/drivers/gpu/drm/i915/dvo_ns2501.c
+++ b/drivers/gpu/drm/i915/dvo_ns2501.c
@@ -99,12 +99,12 @@ static void enable_dvo(struct intel_dvo_device *dvo)
        DRM_DEBUG_KMS("%s: Trying to re-enable the DVO\n", __FUNCTION__);
 
        ns->dvoc = I915_READ(DVO_C);
-       ns->pll_a = I915_READ(_DPLL_A);
+       ns->pll_a = I915_READ(DPLL(0));
        ns->srcdim = I915_READ(DVOC_SRCDIM);
        ns->fw_blc = I915_READ(FW_BLC);
 
        I915_WRITE(DVOC, 0x10004084);
-       I915_WRITE(_DPLL_A, 0xd0820000);
+       I915_WRITE(DPLL(0), 0xd0820000);
        I915_WRITE(DVOC_SRCDIM, 0x400300);      // 1024x768
        I915_WRITE(FW_BLC, 0x1080304);
 
@@ -125,7 +125,7 @@ static void restore_dvo(struct intel_dvo_device *dvo)
        struct ns2501_priv *ns = (struct ns2501_priv *)(dvo->dev_priv);
 
        I915_WRITE(DVOC, ns->dvoc);
-       I915_WRITE(_DPLL_A, ns->pll_a);
+       I915_WRITE(DPLL(0), ns->pll_a);
        I915_WRITE(DVOC_SRCDIM, ns->srcdim);
        I915_WRITE(FW_BLC, ns->fw_blc);
 }
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
index 0cab2d0..64fbfbb1 100644
--- a/drivers/gpu/drm/i915/i915_dma.c
+++ b/drivers/gpu/drm/i915/i915_dma.c
@@ -1465,6 +1465,7 @@ int i915_driver_load(struct drm_device *dev, unsigned 
long flags)
        struct drm_i915_private *dev_priv;
        struct intel_device_info *info;
        int ret = 0, mmio_bar, mmio_size;
+       u32 mmio;
        uint32_t aperture_size;
 
        info = (struct intel_device_info *) flags;
@@ -1484,6 +1485,21 @@ int i915_driver_load(struct drm_device *dev, unsigned 
long flags)
        dev_priv->dev = dev;
        dev_priv->info = info;
 
+       /* Set addresses for various pipe registers */
+       mmio = dev_priv->info->display_mmio_offset;
+       dev_priv->pipe_offsets[0] = mmio + PIPE_A_OFFSET;
+       dev_priv->pipe_offsets[1] = mmio + PIPE_B_OFFSET;
+       dev_priv->trans_offsets[0] = mmio + TRANSCODER_A_OFFSET;
+       dev_priv->trans_offsets[1] = mmio + TRANSCODER_B_OFFSET;
+       dev_priv->trans_offsets[2] = mmio + TRANSCODER_C_OFFSET;
+       dev_priv->trans_offsets[3] = mmio + TRANSCODER_EDP_OFFSET;
+       dev_priv->dpll_offsets[0] = mmio + DPLL_A_OFFSET;
+       dev_priv->dpll_offsets[1] = mmio + DPLL_B_OFFSET;
+       dev_priv->dpll_md_offsets[0] = mmio + DPLL_A_MD_OFFSET;
+       dev_priv->dpll_md_offsets[1] = mmio + DPLL_B_MD_OFFSET;
+       dev_priv->palette_offsets[0] = mmio + PALETTE_A_OFFSET;
+       dev_priv->palette_offsets[1] = mmio + PALETTE_B_OFFSET;
+
        spin_lock_init(&dev_priv->irq_lock);
        spin_lock_init(&dev_priv->gpu_error.lock);
        spin_lock_init(&dev_priv->backlight.lock);
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 2c1921d..7ea469a 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -65,7 +65,8 @@ enum transcoder {
        TRANSCODER_A = 0,
        TRANSCODER_B,
        TRANSCODER_C,
-       TRANSCODER_EDP = 0xF,
+       TRANSCODER_EDP,
+       I915_MAX_TRANSCODERS
 };
 #define transcoder_name(t) ((t) + 'A')
 
@@ -1473,6 +1474,13 @@ typedef struct drm_i915_private {
 
        struct i915_package_c8 pc8;
 
+       /* Register offsets for the various display pipes */
+       int pipe_offsets[I915_MAX_PIPES];
+       int trans_offsets[I915_MAX_TRANSCODERS];
+       int dpll_offsets[I915_MAX_PIPES];
+       int dpll_md_offsets[I915_MAX_PIPES];
+       int palette_offsets[I915_MAX_PIPES];
+
        /* Old dri1 support infrastructure, beware the dragons ya fools entering
         * here! */
        struct i915_dri1_state dri1;
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 4d2db59..0afc9fa 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -1187,6 +1187,10 @@
  * Clock control & power management
  */
 
+#define DPLL_A_OFFSET 0x6014
+#define DPLL_B_OFFSET 0x6018
+#define DPLL(pipe) (dev_priv->dpll_offsets[pipe])
+
 #define VGA0   0x6000
 #define VGA1   0x6004
 #define VGA_PD 0x6010
@@ -1200,7 +1204,6 @@
 #define   VGA1_PD_P1_MASK      (0x1f << 8)
 #define _DPLL_A        (dev_priv->info->display_mmio_offset + 0x6014)
 #define _DPLL_B        (dev_priv->info->display_mmio_offset + 0x6018)
-#define DPLL(pipe) _PIPE(pipe, _DPLL_A, _DPLL_B)
 #define   DPLL_VCO_ENABLE              (1 << 31)
 #define   DPLL_SDVO_HIGH_SPEED         (1 << 30)
 #define   DPLL_DVO_2X_MODE             (1 << 30)
@@ -1263,6 +1266,11 @@
 #define   SDVO_MULTIPLIER_SHIFT_HIRES          4
 #define   SDVO_MULTIPLIER_SHIFT_VGA            0
 #define _DPLL_A_MD (dev_priv->info->display_mmio_offset + 0x601c) /* 965+ only 
*/
+
+#define DPLL_A_MD_OFFSET 0x601c /* 965+ only */
+#define DPLL_B_MD_OFFSET 0x6020 /* 965+ only */
+#define DPLL_MD(pipe) (dev_priv->dpll_md_offsets[pipe])
+
 /*
  * UDI pixel divider, controlling how many pixels are stuffed into a packet.
  *
@@ -1300,7 +1308,6 @@
 #define   DPLL_MD_VGA_UDI_MULTIPLIER_MASK      0x0000003f
 #define   DPLL_MD_VGA_UDI_MULTIPLIER_SHIFT     0
 #define _DPLL_B_MD (dev_priv->info->display_mmio_offset + 0x6020) /* 965+ only 
*/
-#define DPLL_MD(pipe) _PIPE(pipe, _DPLL_A_MD, _DPLL_B_MD)
 
 #define _FPA0  0x06040
 #define _FPA1  0x06044
@@ -1457,9 +1464,13 @@
  * Palette regs
  */
 
+#define PALETTE_A_OFFSET 0xa000
+#define PALETTE_B_OFFSET 0xa800
+
 #define _PALETTE_A             (dev_priv->info->display_mmio_offset + 0xa000)
 #define _PALETTE_B             (dev_priv->info->display_mmio_offset + 0xa800)
-#define PALETTE(pipe) _PIPE(pipe, _PALETTE_A, _PALETTE_B)
+
+#define PALETTE(pipe) (dev_priv->palette_offsets[pipe])
 
 /* MCH MMIO space */
 
@@ -1919,6 +1930,23 @@
 #define PIPE_CRC_RES_RES2_G4X(pipe) \
        _PIPE_INC(pipe, _PIPE_CRC_RES_RES2_A_G4X, 0x01000)
 
+#define TRANSCODER_A_OFFSET 0x60000
+#define TRANSCODER_B_OFFSET 0x61000
+#define TRANSCODER_C_OFFSET 0x62000
+#define TRANSCODER_EDP_OFFSET 0x6f000
+
+/* Pipe timing regs */
+#define HTOTAL(trans) (dev_priv->trans_offsets[trans])
+#define HBLANK(trans) (dev_priv->trans_offsets[trans] + 0x04)
+#define HSYNC(trans) (dev_priv->trans_offsets[trans] + 0x08)
+#define VTOTAL(trans) (dev_priv->trans_offsets[trans] + 0x0c)
+#define VBLANK(trans) (dev_priv->trans_offsets[trans] + 0x10)
+#define VSYNC(trans) (dev_priv->trans_offsets[trans] + 0x14)
+#define BCLRPAT(trans) (dev_priv->trans_offsets[trans] + 0x20)
+#define VSYNCSHIFT(trans) (dev_priv->trans_offsets[trans] + 0x28)
+#define PIPESRC(pipe) (dev_priv->trans_offsets[pipe] + 0x1c)
+
+
 /* Pipe A timing regs */
 #define _HTOTAL_A      (dev_priv->info->display_mmio_offset + 0x60000)
 #define _HBLANK_A      (dev_priv->info->display_mmio_offset + 0x60004)
@@ -1941,15 +1969,6 @@
 #define _BCLRPAT_B     (dev_priv->info->display_mmio_offset + 0x61020)
 #define _VSYNCSHIFT_B  (dev_priv->info->display_mmio_offset + 0x61028)
 
-#define HTOTAL(trans) _TRANSCODER(trans, _HTOTAL_A, _HTOTAL_B)
-#define HBLANK(trans) _TRANSCODER(trans, _HBLANK_A, _HBLANK_B)
-#define HSYNC(trans) _TRANSCODER(trans, _HSYNC_A, _HSYNC_B)
-#define VTOTAL(trans) _TRANSCODER(trans, _VTOTAL_A, _VTOTAL_B)
-#define VBLANK(trans) _TRANSCODER(trans, _VBLANK_A, _VBLANK_B)
-#define VSYNC(trans) _TRANSCODER(trans, _VSYNC_A, _VSYNC_B)
-#define BCLRPAT(pipe) _PIPE(pipe, _BCLRPAT_A, _BCLRPAT_B)
-#define VSYNCSHIFT(trans) _TRANSCODER(trans, _VSYNCSHIFT_A, _VSYNCSHIFT_B)
-
 /* HSW eDP PSR registers */
 #define EDP_PSR_BASE(dev)                      0x64800
 #define EDP_PSR_CTL(dev)                       (EDP_PSR_BASE(dev) + 0)
@@ -3211,12 +3230,16 @@
 #define   PIPE_VBLANK_INTERRUPT_STATUS         (1UL<<1)
 #define   PIPE_OVERLAY_UPDATED_STATUS          (1UL<<0)
 
-#define PIPESRC(pipe) _PIPE(pipe, _PIPEASRC, _PIPEBSRC)
-#define PIPECONF(tran) _TRANSCODER(tran, _PIPEACONF, _PIPEBCONF)
-#define PIPEDSL(pipe)  _PIPE(pipe, _PIPEADSL, _PIPEBDSL)
-#define PIPEFRAME(pipe) _PIPE(pipe, _PIPEAFRAMEHIGH, _PIPEBFRAMEHIGH)
-#define PIPEFRAMEPIXEL(pipe)  _PIPE(pipe, _PIPEAFRAMEPIXEL, _PIPEBFRAMEPIXEL)
-#define PIPESTAT(pipe) _PIPE(pipe, _PIPEASTAT, _PIPEBSTAT)
+#define PIPE_A_OFFSET  0x70000
+#define PIPE_B_OFFSET  0x71000
+#define PIPE_EDP_OFFSET        0x7f000
+
+#define PIPEDSL(pipe) (dev_priv->pipe_offsets[pipe])
+#define PIPECONF(tran) ((int)(tran) == TRANSCODER_EDP ? PIPE_EDP_OFFSET : \
+                       dev_priv->pipe_offsets[tran] + 0x08)
+#define PIPESTAT(pipe) (dev_priv->pipe_offsets[pipe] + 0x24)
+#define PIPEFRAME(pipe) (dev_priv->pipe_offsets[pipe] + 0x40)
+#define PIPEFRAMEPIXEL(pipe) (dev_priv->pipe_offsets[pipe] + 0x44)
 
 #define VLV_DPFLIPSTAT                         (VLV_DISPLAY_BASE + 0x70028)
 #define   PIPEB_LINE_COMPARE_INT_EN            (1<<29)
-- 
1.8.1.5

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to