drm/i915: cleanup per-pipe reg usage
We had some conversions over to the _PIPE macros, but didn't get everything. So hide the per-pipe regs with an _ (still used in a few places for legacy) and add a few _PIPE based macros, then make sure everyone uses them. [update: remove usage of non-existent no-op macro] [update 2: keep modesetting suspend/resume code, update to new reg names] Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org> [ickle: stylistic cleanups for checkpatch and taste] Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
Родитель
8d7e3de1e0
Коммит
9db4a9c7b2
|
@ -326,21 +326,21 @@ static int i915_gem_pageflip_info(struct seq_file *m, void *data)
|
||||||
struct intel_crtc *crtc;
|
struct intel_crtc *crtc;
|
||||||
|
|
||||||
list_for_each_entry(crtc, &dev->mode_config.crtc_list, base.head) {
|
list_for_each_entry(crtc, &dev->mode_config.crtc_list, base.head) {
|
||||||
const char *pipe = crtc->pipe ? "B" : "A";
|
const char pipe = pipe_name(crtc->pipe);
|
||||||
const char *plane = crtc->plane ? "B" : "A";
|
const char plane = plane_name(crtc->plane);
|
||||||
struct intel_unpin_work *work;
|
struct intel_unpin_work *work;
|
||||||
|
|
||||||
spin_lock_irqsave(&dev->event_lock, flags);
|
spin_lock_irqsave(&dev->event_lock, flags);
|
||||||
work = crtc->unpin_work;
|
work = crtc->unpin_work;
|
||||||
if (work == NULL) {
|
if (work == NULL) {
|
||||||
seq_printf(m, "No flip due on pipe %s (plane %s)\n",
|
seq_printf(m, "No flip due on pipe %c (plane %c)\n",
|
||||||
pipe, plane);
|
pipe, plane);
|
||||||
} else {
|
} else {
|
||||||
if (!work->pending) {
|
if (!work->pending) {
|
||||||
seq_printf(m, "Flip queued on pipe %s (plane %s)\n",
|
seq_printf(m, "Flip queued on pipe %c (plane %c)\n",
|
||||||
pipe, plane);
|
pipe, plane);
|
||||||
} else {
|
} else {
|
||||||
seq_printf(m, "Flip pending (waiting for vsync) on pipe %s (plane %s)\n",
|
seq_printf(m, "Flip pending (waiting for vsync) on pipe %c (plane %c)\n",
|
||||||
pipe, plane);
|
pipe, plane);
|
||||||
}
|
}
|
||||||
if (work->enable_stall_check)
|
if (work->enable_stall_check)
|
||||||
|
@ -458,7 +458,7 @@ static int i915_interrupt_info(struct seq_file *m, void *data)
|
||||||
struct drm_info_node *node = (struct drm_info_node *) m->private;
|
struct drm_info_node *node = (struct drm_info_node *) m->private;
|
||||||
struct drm_device *dev = node->minor->dev;
|
struct drm_device *dev = node->minor->dev;
|
||||||
drm_i915_private_t *dev_priv = dev->dev_private;
|
drm_i915_private_t *dev_priv = dev->dev_private;
|
||||||
int ret, i;
|
int ret, i, pipe;
|
||||||
|
|
||||||
ret = mutex_lock_interruptible(&dev->struct_mutex);
|
ret = mutex_lock_interruptible(&dev->struct_mutex);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
@ -471,10 +471,10 @@ static int i915_interrupt_info(struct seq_file *m, void *data)
|
||||||
I915_READ(IIR));
|
I915_READ(IIR));
|
||||||
seq_printf(m, "Interrupt mask: %08x\n",
|
seq_printf(m, "Interrupt mask: %08x\n",
|
||||||
I915_READ(IMR));
|
I915_READ(IMR));
|
||||||
seq_printf(m, "Pipe A stat: %08x\n",
|
for_each_pipe(pipe)
|
||||||
I915_READ(PIPEASTAT));
|
seq_printf(m, "Pipe %c stat: %08x\n",
|
||||||
seq_printf(m, "Pipe B stat: %08x\n",
|
pipe_name(pipe),
|
||||||
I915_READ(PIPEBSTAT));
|
I915_READ(PIPESTAT(pipe)));
|
||||||
} else {
|
} else {
|
||||||
seq_printf(m, "North Display Interrupt enable: %08x\n",
|
seq_printf(m, "North Display Interrupt enable: %08x\n",
|
||||||
I915_READ(DEIER));
|
I915_READ(DEIER));
|
||||||
|
|
|
@ -2005,7 +2005,12 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
|
||||||
spin_lock_init(&dev_priv->irq_lock);
|
spin_lock_init(&dev_priv->irq_lock);
|
||||||
spin_lock_init(&dev_priv->error_lock);
|
spin_lock_init(&dev_priv->error_lock);
|
||||||
|
|
||||||
ret = drm_vblank_init(dev, I915_NUM_PIPE);
|
if (IS_MOBILE(dev) || !IS_GEN2(dev))
|
||||||
|
dev_priv->num_pipe = 2;
|
||||||
|
else
|
||||||
|
dev_priv->num_pipe = 1;
|
||||||
|
|
||||||
|
ret = drm_vblank_init(dev, dev_priv->num_pipe);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto out_gem_unload;
|
goto out_gem_unload;
|
||||||
|
|
||||||
|
|
|
@ -50,17 +50,22 @@
|
||||||
enum pipe {
|
enum pipe {
|
||||||
PIPE_A = 0,
|
PIPE_A = 0,
|
||||||
PIPE_B,
|
PIPE_B,
|
||||||
|
PIPE_C,
|
||||||
|
I915_MAX_PIPES
|
||||||
};
|
};
|
||||||
|
#define pipe_name(p) ((p) + 'A')
|
||||||
|
|
||||||
enum plane {
|
enum plane {
|
||||||
PLANE_A = 0,
|
PLANE_A = 0,
|
||||||
PLANE_B,
|
PLANE_B,
|
||||||
|
PLANE_C,
|
||||||
};
|
};
|
||||||
|
#define plane_name(p) ((p) + 'A')
|
||||||
#define I915_NUM_PIPE 2
|
|
||||||
|
|
||||||
#define I915_GEM_GPU_DOMAINS (~(I915_GEM_DOMAIN_CPU | I915_GEM_DOMAIN_GTT))
|
#define I915_GEM_GPU_DOMAINS (~(I915_GEM_DOMAIN_CPU | I915_GEM_DOMAIN_GTT))
|
||||||
|
|
||||||
|
#define for_each_pipe(p) for ((p) = 0; (p) < dev_priv->num_pipe; (p)++)
|
||||||
|
|
||||||
/* Interface history:
|
/* Interface history:
|
||||||
*
|
*
|
||||||
* 1.1: Original.
|
* 1.1: Original.
|
||||||
|
@ -143,8 +148,7 @@ struct intel_display_error_state;
|
||||||
struct drm_i915_error_state {
|
struct drm_i915_error_state {
|
||||||
u32 eir;
|
u32 eir;
|
||||||
u32 pgtbl_er;
|
u32 pgtbl_er;
|
||||||
u32 pipeastat;
|
u32 pipestat[I915_MAX_PIPES];
|
||||||
u32 pipebstat;
|
|
||||||
u32 ipeir;
|
u32 ipeir;
|
||||||
u32 ipehr;
|
u32 ipehr;
|
||||||
u32 instdone;
|
u32 instdone;
|
||||||
|
|
|
@ -85,21 +85,11 @@ ironlake_disable_display_irq(drm_i915_private_t *dev_priv, u32 mask)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline u32
|
|
||||||
i915_pipestat(int pipe)
|
|
||||||
{
|
|
||||||
if (pipe == 0)
|
|
||||||
return PIPEASTAT;
|
|
||||||
if (pipe == 1)
|
|
||||||
return PIPEBSTAT;
|
|
||||||
BUG();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
i915_enable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask)
|
i915_enable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask)
|
||||||
{
|
{
|
||||||
if ((dev_priv->pipestat[pipe] & mask) != mask) {
|
if ((dev_priv->pipestat[pipe] & mask) != mask) {
|
||||||
u32 reg = i915_pipestat(pipe);
|
u32 reg = PIPESTAT(pipe);
|
||||||
|
|
||||||
dev_priv->pipestat[pipe] |= mask;
|
dev_priv->pipestat[pipe] |= mask;
|
||||||
/* Enable the interrupt, clear any pending status */
|
/* Enable the interrupt, clear any pending status */
|
||||||
|
@ -112,7 +102,7 @@ void
|
||||||
i915_disable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask)
|
i915_disable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask)
|
||||||
{
|
{
|
||||||
if ((dev_priv->pipestat[pipe] & mask) != 0) {
|
if ((dev_priv->pipestat[pipe] & mask) != 0) {
|
||||||
u32 reg = i915_pipestat(pipe);
|
u32 reg = PIPESTAT(pipe);
|
||||||
|
|
||||||
dev_priv->pipestat[pipe] &= ~mask;
|
dev_priv->pipestat[pipe] &= ~mask;
|
||||||
I915_WRITE(reg, dev_priv->pipestat[pipe]);
|
I915_WRITE(reg, dev_priv->pipestat[pipe]);
|
||||||
|
@ -171,12 +161,12 @@ u32 i915_get_vblank_counter(struct drm_device *dev, int pipe)
|
||||||
|
|
||||||
if (!i915_pipe_enabled(dev, pipe)) {
|
if (!i915_pipe_enabled(dev, pipe)) {
|
||||||
DRM_DEBUG_DRIVER("trying to get vblank count for disabled "
|
DRM_DEBUG_DRIVER("trying to get vblank count for disabled "
|
||||||
"pipe %d\n", pipe);
|
"pipe %c\n", pipe_name(pipe));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
high_frame = pipe ? PIPEBFRAMEHIGH : PIPEAFRAMEHIGH;
|
high_frame = PIPEFRAME(pipe);
|
||||||
low_frame = pipe ? PIPEBFRAMEPIXEL : PIPEAFRAMEPIXEL;
|
low_frame = PIPEFRAMEPIXEL(pipe);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* High & low register fields aren't synchronized, so make sure
|
* High & low register fields aren't synchronized, so make sure
|
||||||
|
@ -197,11 +187,11 @@ u32 i915_get_vblank_counter(struct drm_device *dev, int pipe)
|
||||||
u32 gm45_get_vblank_counter(struct drm_device *dev, int pipe)
|
u32 gm45_get_vblank_counter(struct drm_device *dev, int pipe)
|
||||||
{
|
{
|
||||||
drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
|
drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
|
||||||
int reg = pipe ? PIPEB_FRMCOUNT_GM45 : PIPEA_FRMCOUNT_GM45;
|
int reg = PIPE_FRMCOUNT_GM45(pipe);
|
||||||
|
|
||||||
if (!i915_pipe_enabled(dev, pipe)) {
|
if (!i915_pipe_enabled(dev, pipe)) {
|
||||||
DRM_DEBUG_DRIVER("trying to get vblank count for disabled "
|
DRM_DEBUG_DRIVER("trying to get vblank count for disabled "
|
||||||
"pipe %d\n", pipe);
|
"pipe %c\n", pipe_name(pipe));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -219,7 +209,7 @@ int i915_get_crtc_scanoutpos(struct drm_device *dev, int pipe,
|
||||||
|
|
||||||
if (!i915_pipe_enabled(dev, pipe)) {
|
if (!i915_pipe_enabled(dev, pipe)) {
|
||||||
DRM_DEBUG_DRIVER("trying to get scanoutpos for disabled "
|
DRM_DEBUG_DRIVER("trying to get scanoutpos for disabled "
|
||||||
"pipe %d\n", pipe);
|
"pipe %c\n", pipe_name(pipe));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -417,6 +407,7 @@ static void pch_irq_handler(struct drm_device *dev)
|
||||||
{
|
{
|
||||||
drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
|
drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
|
||||||
u32 pch_iir;
|
u32 pch_iir;
|
||||||
|
int pipe;
|
||||||
|
|
||||||
pch_iir = I915_READ(SDEIIR);
|
pch_iir = I915_READ(SDEIIR);
|
||||||
|
|
||||||
|
@ -437,13 +428,11 @@ static void pch_irq_handler(struct drm_device *dev)
|
||||||
if (pch_iir & SDE_POISON)
|
if (pch_iir & SDE_POISON)
|
||||||
DRM_ERROR("PCH poison interrupt\n");
|
DRM_ERROR("PCH poison interrupt\n");
|
||||||
|
|
||||||
if (pch_iir & SDE_FDI_MASK) {
|
if (pch_iir & SDE_FDI_MASK)
|
||||||
u32 fdia, fdib;
|
for_each_pipe(pipe)
|
||||||
|
DRM_DEBUG_DRIVER(" pipe %c FDI IIR: 0x%08x\n",
|
||||||
fdia = I915_READ(FDI_RXA_IIR);
|
pipe_name(pipe),
|
||||||
fdib = I915_READ(FDI_RXB_IIR);
|
I915_READ(FDI_RX_IIR(pipe)));
|
||||||
DRM_DEBUG_DRIVER("PCH FDI RX interrupt; FDI RXA IIR: 0x%08x, FDI RXB IIR: 0x%08x\n", fdia, fdib);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pch_iir & (SDE_TRANSB_CRC_DONE | SDE_TRANSA_CRC_DONE))
|
if (pch_iir & (SDE_TRANSB_CRC_DONE | SDE_TRANSA_CRC_DONE))
|
||||||
DRM_DEBUG_DRIVER("PCH transcoder CRC done interrupt\n");
|
DRM_DEBUG_DRIVER("PCH transcoder CRC done interrupt\n");
|
||||||
|
@ -770,7 +759,7 @@ static void i915_capture_error_state(struct drm_device *dev)
|
||||||
struct drm_i915_gem_object *obj;
|
struct drm_i915_gem_object *obj;
|
||||||
struct drm_i915_error_state *error;
|
struct drm_i915_error_state *error;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
int i;
|
int i, pipe;
|
||||||
|
|
||||||
spin_lock_irqsave(&dev_priv->error_lock, flags);
|
spin_lock_irqsave(&dev_priv->error_lock, flags);
|
||||||
error = dev_priv->first_error;
|
error = dev_priv->first_error;
|
||||||
|
@ -778,6 +767,7 @@ static void i915_capture_error_state(struct drm_device *dev)
|
||||||
if (error)
|
if (error)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
/* Account for pipe specific data like PIPE*STAT */
|
||||||
error = kmalloc(sizeof(*error), GFP_ATOMIC);
|
error = kmalloc(sizeof(*error), GFP_ATOMIC);
|
||||||
if (!error) {
|
if (!error) {
|
||||||
DRM_DEBUG_DRIVER("out of memory, not capturing error state\n");
|
DRM_DEBUG_DRIVER("out of memory, not capturing error state\n");
|
||||||
|
@ -790,8 +780,8 @@ static void i915_capture_error_state(struct drm_device *dev)
|
||||||
error->seqno = dev_priv->ring[RCS].get_seqno(&dev_priv->ring[RCS]);
|
error->seqno = dev_priv->ring[RCS].get_seqno(&dev_priv->ring[RCS]);
|
||||||
error->eir = I915_READ(EIR);
|
error->eir = I915_READ(EIR);
|
||||||
error->pgtbl_er = I915_READ(PGTBL_ER);
|
error->pgtbl_er = I915_READ(PGTBL_ER);
|
||||||
error->pipeastat = I915_READ(PIPEASTAT);
|
for_each_pipe(pipe)
|
||||||
error->pipebstat = I915_READ(PIPEBSTAT);
|
error->pipestat[pipe] = I915_READ(PIPESTAT(pipe));
|
||||||
error->instpm = I915_READ(INSTPM);
|
error->instpm = I915_READ(INSTPM);
|
||||||
error->error = 0;
|
error->error = 0;
|
||||||
if (INTEL_INFO(dev)->gen >= 6) {
|
if (INTEL_INFO(dev)->gen >= 6) {
|
||||||
|
@ -912,6 +902,7 @@ static void i915_report_and_clear_eir(struct drm_device *dev)
|
||||||
{
|
{
|
||||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||||
u32 eir = I915_READ(EIR);
|
u32 eir = I915_READ(EIR);
|
||||||
|
int pipe;
|
||||||
|
|
||||||
if (!eir)
|
if (!eir)
|
||||||
return;
|
return;
|
||||||
|
@ -960,14 +951,10 @@ static void i915_report_and_clear_eir(struct drm_device *dev)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (eir & I915_ERROR_MEMORY_REFRESH) {
|
if (eir & I915_ERROR_MEMORY_REFRESH) {
|
||||||
u32 pipea_stats = I915_READ(PIPEASTAT);
|
printk(KERN_ERR "memory refresh error:\n");
|
||||||
u32 pipeb_stats = I915_READ(PIPEBSTAT);
|
for_each_pipe(pipe)
|
||||||
|
printk(KERN_ERR "pipe %c stat: 0x%08x\n",
|
||||||
printk(KERN_ERR "memory refresh error\n");
|
pipe_name(pipe), I915_READ(PIPESTAT(pipe)));
|
||||||
printk(KERN_ERR "PIPEASTAT: 0x%08x\n",
|
|
||||||
pipea_stats);
|
|
||||||
printk(KERN_ERR "PIPEBSTAT: 0x%08x\n",
|
|
||||||
pipeb_stats);
|
|
||||||
/* pipestat has already been acked */
|
/* pipestat has already been acked */
|
||||||
}
|
}
|
||||||
if (eir & I915_ERROR_INSTRUCTION) {
|
if (eir & I915_ERROR_INSTRUCTION) {
|
||||||
|
@ -1081,10 +1068,10 @@ static void i915_pageflip_stall_check(struct drm_device *dev, int pipe)
|
||||||
/* Potential stall - if we see that the flip has happened, assume a missed interrupt */
|
/* Potential stall - if we see that the flip has happened, assume a missed interrupt */
|
||||||
obj = work->pending_flip_obj;
|
obj = work->pending_flip_obj;
|
||||||
if (INTEL_INFO(dev)->gen >= 4) {
|
if (INTEL_INFO(dev)->gen >= 4) {
|
||||||
int dspsurf = intel_crtc->plane == 0 ? DSPASURF : DSPBSURF;
|
int dspsurf = DSPSURF(intel_crtc->plane);
|
||||||
stall_detected = I915_READ(dspsurf) == obj->gtt_offset;
|
stall_detected = I915_READ(dspsurf) == obj->gtt_offset;
|
||||||
} else {
|
} else {
|
||||||
int dspaddr = intel_crtc->plane == 0 ? DSPAADDR : DSPBADDR;
|
int dspaddr = DSPADDR(intel_crtc->plane);
|
||||||
stall_detected = I915_READ(dspaddr) == (obj->gtt_offset +
|
stall_detected = I915_READ(dspaddr) == (obj->gtt_offset +
|
||||||
crtc->y * crtc->fb->pitch +
|
crtc->y * crtc->fb->pitch +
|
||||||
crtc->x * crtc->fb->bits_per_pixel/8);
|
crtc->x * crtc->fb->bits_per_pixel/8);
|
||||||
|
@ -1104,12 +1091,13 @@ irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS)
|
||||||
drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
|
drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
|
||||||
struct drm_i915_master_private *master_priv;
|
struct drm_i915_master_private *master_priv;
|
||||||
u32 iir, new_iir;
|
u32 iir, new_iir;
|
||||||
u32 pipea_stats, pipeb_stats;
|
u32 pipe_stats[I915_MAX_PIPES];
|
||||||
u32 vblank_status;
|
u32 vblank_status;
|
||||||
int vblank = 0;
|
int vblank = 0;
|
||||||
unsigned long irqflags;
|
unsigned long irqflags;
|
||||||
int irq_received;
|
int irq_received;
|
||||||
int ret = IRQ_NONE;
|
int ret = IRQ_NONE, pipe;
|
||||||
|
bool blc_event = false;
|
||||||
|
|
||||||
atomic_inc(&dev_priv->irq_received);
|
atomic_inc(&dev_priv->irq_received);
|
||||||
|
|
||||||
|
@ -1132,27 +1120,23 @@ irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS)
|
||||||
* interrupts (for non-MSI).
|
* interrupts (for non-MSI).
|
||||||
*/
|
*/
|
||||||
spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
|
spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
|
||||||
pipea_stats = I915_READ(PIPEASTAT);
|
|
||||||
pipeb_stats = I915_READ(PIPEBSTAT);
|
|
||||||
|
|
||||||
if (iir & I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT)
|
if (iir & I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT)
|
||||||
i915_handle_error(dev, false);
|
i915_handle_error(dev, false);
|
||||||
|
|
||||||
/*
|
for_each_pipe(pipe) {
|
||||||
* Clear the PIPE(A|B)STAT regs before the IIR
|
int reg = PIPESTAT(pipe);
|
||||||
*/
|
pipe_stats[pipe] = I915_READ(reg);
|
||||||
if (pipea_stats & 0x8000ffff) {
|
|
||||||
if (pipea_stats & PIPE_FIFO_UNDERRUN_STATUS)
|
|
||||||
DRM_DEBUG_DRIVER("pipe a underrun\n");
|
|
||||||
I915_WRITE(PIPEASTAT, pipea_stats);
|
|
||||||
irq_received = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pipeb_stats & 0x8000ffff) {
|
/*
|
||||||
if (pipeb_stats & PIPE_FIFO_UNDERRUN_STATUS)
|
* Clear the PIPE*STAT regs before the IIR
|
||||||
DRM_DEBUG_DRIVER("pipe b underrun\n");
|
*/
|
||||||
I915_WRITE(PIPEBSTAT, pipeb_stats);
|
if (pipe_stats[pipe] & 0x8000ffff) {
|
||||||
irq_received = 1;
|
if (pipe_stats[pipe] & PIPE_FIFO_UNDERRUN_STATUS)
|
||||||
|
DRM_DEBUG_DRIVER("pipe %c underrun\n",
|
||||||
|
pipe_name(pipe));
|
||||||
|
I915_WRITE(reg, pipe_stats[pipe]);
|
||||||
|
irq_received = 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
|
spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
|
||||||
|
|
||||||
|
@ -1203,27 +1187,22 @@ irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS)
|
||||||
intel_finish_page_flip_plane(dev, 1);
|
intel_finish_page_flip_plane(dev, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pipea_stats & vblank_status &&
|
for_each_pipe(pipe) {
|
||||||
drm_handle_vblank(dev, 0)) {
|
if (pipe_stats[pipe] & vblank_status &&
|
||||||
vblank++;
|
drm_handle_vblank(dev, pipe)) {
|
||||||
if (!dev_priv->flip_pending_is_done) {
|
vblank++;
|
||||||
i915_pageflip_stall_check(dev, 0);
|
if (!dev_priv->flip_pending_is_done) {
|
||||||
intel_finish_page_flip(dev, 0);
|
i915_pageflip_stall_check(dev, pipe);
|
||||||
|
intel_finish_page_flip(dev, pipe);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pipe_stats[pipe] & PIPE_LEGACY_BLC_EVENT_STATUS)
|
||||||
|
blc_event = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pipeb_stats & vblank_status &&
|
|
||||||
drm_handle_vblank(dev, 1)) {
|
|
||||||
vblank++;
|
|
||||||
if (!dev_priv->flip_pending_is_done) {
|
|
||||||
i915_pageflip_stall_check(dev, 1);
|
|
||||||
intel_finish_page_flip(dev, 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((pipea_stats & PIPE_LEGACY_BLC_EVENT_STATUS) ||
|
if (blc_event || (iir & I915_ASLE_INTERRUPT))
|
||||||
(pipeb_stats & PIPE_LEGACY_BLC_EVENT_STATUS) ||
|
|
||||||
(iir & I915_ASLE_INTERRUPT))
|
|
||||||
intel_opregion_asle_intr(dev);
|
intel_opregion_asle_intr(dev);
|
||||||
|
|
||||||
/* With MSI, interrupts are only generated when iir
|
/* With MSI, interrupts are only generated when iir
|
||||||
|
@ -1634,6 +1613,7 @@ static int ironlake_irq_postinstall(struct drm_device *dev)
|
||||||
DE_PLANEA_FLIP_DONE | DE_PLANEB_FLIP_DONE;
|
DE_PLANEA_FLIP_DONE | DE_PLANEB_FLIP_DONE;
|
||||||
u32 render_irqs;
|
u32 render_irqs;
|
||||||
u32 hotplug_mask;
|
u32 hotplug_mask;
|
||||||
|
int pipe;
|
||||||
|
|
||||||
dev_priv->irq_mask = ~display_mask;
|
dev_priv->irq_mask = ~display_mask;
|
||||||
|
|
||||||
|
@ -1668,8 +1648,8 @@ static int ironlake_irq_postinstall(struct drm_device *dev)
|
||||||
hotplug_mask = SDE_CRT_HOTPLUG | SDE_PORTB_HOTPLUG |
|
hotplug_mask = SDE_CRT_HOTPLUG | SDE_PORTB_HOTPLUG |
|
||||||
SDE_PORTC_HOTPLUG | SDE_PORTD_HOTPLUG;
|
SDE_PORTC_HOTPLUG | SDE_PORTD_HOTPLUG;
|
||||||
hotplug_mask |= SDE_AUX_MASK | SDE_FDI_MASK | SDE_TRANS_MASK;
|
hotplug_mask |= SDE_AUX_MASK | SDE_FDI_MASK | SDE_TRANS_MASK;
|
||||||
I915_WRITE(FDI_RXA_IMR, 0);
|
for_each_pipe(pipe)
|
||||||
I915_WRITE(FDI_RXB_IMR, 0);
|
I915_WRITE(FDI_RX_IMR(pipe), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
dev_priv->pch_irq_mask = ~hotplug_mask;
|
dev_priv->pch_irq_mask = ~hotplug_mask;
|
||||||
|
@ -1692,6 +1672,7 @@ static int ironlake_irq_postinstall(struct drm_device *dev)
|
||||||
void i915_driver_irq_preinstall(struct drm_device * dev)
|
void i915_driver_irq_preinstall(struct drm_device * dev)
|
||||||
{
|
{
|
||||||
drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
|
drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
|
||||||
|
int pipe;
|
||||||
|
|
||||||
atomic_set(&dev_priv->irq_received, 0);
|
atomic_set(&dev_priv->irq_received, 0);
|
||||||
atomic_set(&dev_priv->vblank_enabled, 0);
|
atomic_set(&dev_priv->vblank_enabled, 0);
|
||||||
|
@ -1711,8 +1692,8 @@ void i915_driver_irq_preinstall(struct drm_device * dev)
|
||||||
}
|
}
|
||||||
|
|
||||||
I915_WRITE(HWSTAM, 0xeffe);
|
I915_WRITE(HWSTAM, 0xeffe);
|
||||||
I915_WRITE(PIPEASTAT, 0);
|
for_each_pipe(pipe)
|
||||||
I915_WRITE(PIPEBSTAT, 0);
|
I915_WRITE(PIPESTAT(pipe), 0);
|
||||||
I915_WRITE(IMR, 0xffffffff);
|
I915_WRITE(IMR, 0xffffffff);
|
||||||
I915_WRITE(IER, 0x0);
|
I915_WRITE(IER, 0x0);
|
||||||
POSTING_READ(IER);
|
POSTING_READ(IER);
|
||||||
|
@ -1824,6 +1805,7 @@ static void ironlake_irq_uninstall(struct drm_device *dev)
|
||||||
void i915_driver_irq_uninstall(struct drm_device * dev)
|
void i915_driver_irq_uninstall(struct drm_device * dev)
|
||||||
{
|
{
|
||||||
drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
|
drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
|
||||||
|
int pipe;
|
||||||
|
|
||||||
if (!dev_priv)
|
if (!dev_priv)
|
||||||
return;
|
return;
|
||||||
|
@ -1841,12 +1823,13 @@ void i915_driver_irq_uninstall(struct drm_device * dev)
|
||||||
}
|
}
|
||||||
|
|
||||||
I915_WRITE(HWSTAM, 0xffffffff);
|
I915_WRITE(HWSTAM, 0xffffffff);
|
||||||
I915_WRITE(PIPEASTAT, 0);
|
for_each_pipe(pipe)
|
||||||
I915_WRITE(PIPEBSTAT, 0);
|
I915_WRITE(PIPESTAT(pipe), 0);
|
||||||
I915_WRITE(IMR, 0xffffffff);
|
I915_WRITE(IMR, 0xffffffff);
|
||||||
I915_WRITE(IER, 0x0);
|
I915_WRITE(IER, 0x0);
|
||||||
|
|
||||||
I915_WRITE(PIPEASTAT, I915_READ(PIPEASTAT) & 0x8000ffff);
|
for_each_pipe(pipe)
|
||||||
I915_WRITE(PIPEBSTAT, I915_READ(PIPEBSTAT) & 0x8000ffff);
|
I915_WRITE(PIPESTAT(pipe),
|
||||||
|
I915_READ(PIPESTAT(pipe)) & 0x8000ffff);
|
||||||
I915_WRITE(IIR, I915_READ(IIR));
|
I915_WRITE(IIR, I915_READ(IIR));
|
||||||
}
|
}
|
||||||
|
|
|
@ -704,9 +704,9 @@
|
||||||
#define VGA1_PD_P1_DIV_2 (1 << 13)
|
#define VGA1_PD_P1_DIV_2 (1 << 13)
|
||||||
#define VGA1_PD_P1_SHIFT 8
|
#define VGA1_PD_P1_SHIFT 8
|
||||||
#define VGA1_PD_P1_MASK (0x1f << 8)
|
#define VGA1_PD_P1_MASK (0x1f << 8)
|
||||||
#define DPLL_A 0x06014
|
#define _DPLL_A 0x06014
|
||||||
#define DPLL_B 0x06018
|
#define _DPLL_B 0x06018
|
||||||
#define DPLL(pipe) _PIPE(pipe, DPLL_A, DPLL_B)
|
#define DPLL(pipe) _PIPE(pipe, _DPLL_A, _DPLL_B)
|
||||||
#define DPLL_VCO_ENABLE (1 << 31)
|
#define DPLL_VCO_ENABLE (1 << 31)
|
||||||
#define DPLL_DVO_HIGH_SPEED (1 << 30)
|
#define DPLL_DVO_HIGH_SPEED (1 << 30)
|
||||||
#define DPLL_SYNCLOCK_ENABLE (1 << 29)
|
#define DPLL_SYNCLOCK_ENABLE (1 << 29)
|
||||||
|
@ -777,7 +777,7 @@
|
||||||
#define SDVO_MULTIPLIER_MASK 0x000000ff
|
#define SDVO_MULTIPLIER_MASK 0x000000ff
|
||||||
#define SDVO_MULTIPLIER_SHIFT_HIRES 4
|
#define SDVO_MULTIPLIER_SHIFT_HIRES 4
|
||||||
#define SDVO_MULTIPLIER_SHIFT_VGA 0
|
#define SDVO_MULTIPLIER_SHIFT_VGA 0
|
||||||
#define DPLL_A_MD 0x0601c /* 965+ only */
|
#define _DPLL_A_MD 0x0601c /* 965+ only */
|
||||||
/*
|
/*
|
||||||
* UDI pixel divider, controlling how many pixels are stuffed into a packet.
|
* UDI pixel divider, controlling how many pixels are stuffed into a packet.
|
||||||
*
|
*
|
||||||
|
@ -814,14 +814,14 @@
|
||||||
*/
|
*/
|
||||||
#define DPLL_MD_VGA_UDI_MULTIPLIER_MASK 0x0000003f
|
#define DPLL_MD_VGA_UDI_MULTIPLIER_MASK 0x0000003f
|
||||||
#define DPLL_MD_VGA_UDI_MULTIPLIER_SHIFT 0
|
#define DPLL_MD_VGA_UDI_MULTIPLIER_SHIFT 0
|
||||||
#define DPLL_B_MD 0x06020 /* 965+ only */
|
#define _DPLL_B_MD 0x06020 /* 965+ only */
|
||||||
#define DPLL_MD(pipe) _PIPE(pipe, DPLL_A_MD, DPLL_B_MD)
|
#define DPLL_MD(pipe) _PIPE(pipe, _DPLL_A_MD, _DPLL_B_MD)
|
||||||
#define FPA0 0x06040
|
#define _FPA0 0x06040
|
||||||
#define FPA1 0x06044
|
#define _FPA1 0x06044
|
||||||
#define FPB0 0x06048
|
#define _FPB0 0x06048
|
||||||
#define FPB1 0x0604c
|
#define _FPB1 0x0604c
|
||||||
#define FP0(pipe) _PIPE(pipe, FPA0, FPB0)
|
#define FP0(pipe) _PIPE(pipe, _FPA0, _FPB0)
|
||||||
#define FP1(pipe) _PIPE(pipe, FPA1, FPB1)
|
#define FP1(pipe) _PIPE(pipe, _FPA1, _FPB1)
|
||||||
#define FP_N_DIV_MASK 0x003f0000
|
#define FP_N_DIV_MASK 0x003f0000
|
||||||
#define FP_N_PINEVIEW_DIV_MASK 0x00ff0000
|
#define FP_N_PINEVIEW_DIV_MASK 0x00ff0000
|
||||||
#define FP_N_DIV_SHIFT 16
|
#define FP_N_DIV_SHIFT 16
|
||||||
|
@ -960,8 +960,9 @@
|
||||||
* Palette regs
|
* Palette regs
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define PALETTE_A 0x0a000
|
#define _PALETTE_A 0x0a000
|
||||||
#define PALETTE_B 0x0a800
|
#define _PALETTE_B 0x0a800
|
||||||
|
#define PALETTE(pipe) _PIPE(pipe, _PALETTE_A, _PALETTE_B)
|
||||||
|
|
||||||
/* MCH MMIO space */
|
/* MCH MMIO space */
|
||||||
|
|
||||||
|
@ -1265,32 +1266,32 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Pipe A timing regs */
|
/* Pipe A timing regs */
|
||||||
#define HTOTAL_A 0x60000
|
#define _HTOTAL_A 0x60000
|
||||||
#define HBLANK_A 0x60004
|
#define _HBLANK_A 0x60004
|
||||||
#define HSYNC_A 0x60008
|
#define _HSYNC_A 0x60008
|
||||||
#define VTOTAL_A 0x6000c
|
#define _VTOTAL_A 0x6000c
|
||||||
#define VBLANK_A 0x60010
|
#define _VBLANK_A 0x60010
|
||||||
#define VSYNC_A 0x60014
|
#define _VSYNC_A 0x60014
|
||||||
#define PIPEASRC 0x6001c
|
#define _PIPEASRC 0x6001c
|
||||||
#define BCLRPAT_A 0x60020
|
#define _BCLRPAT_A 0x60020
|
||||||
|
|
||||||
/* Pipe B timing regs */
|
/* Pipe B timing regs */
|
||||||
#define HTOTAL_B 0x61000
|
#define _HTOTAL_B 0x61000
|
||||||
#define HBLANK_B 0x61004
|
#define _HBLANK_B 0x61004
|
||||||
#define HSYNC_B 0x61008
|
#define _HSYNC_B 0x61008
|
||||||
#define VTOTAL_B 0x6100c
|
#define _VTOTAL_B 0x6100c
|
||||||
#define VBLANK_B 0x61010
|
#define _VBLANK_B 0x61010
|
||||||
#define VSYNC_B 0x61014
|
#define _VSYNC_B 0x61014
|
||||||
#define PIPEBSRC 0x6101c
|
#define _PIPEBSRC 0x6101c
|
||||||
#define BCLRPAT_B 0x61020
|
#define _BCLRPAT_B 0x61020
|
||||||
|
|
||||||
#define HTOTAL(pipe) _PIPE(pipe, HTOTAL_A, HTOTAL_B)
|
#define HTOTAL(pipe) _PIPE(pipe, _HTOTAL_A, _HTOTAL_B)
|
||||||
#define HBLANK(pipe) _PIPE(pipe, HBLANK_A, HBLANK_B)
|
#define HBLANK(pipe) _PIPE(pipe, _HBLANK_A, _HBLANK_B)
|
||||||
#define HSYNC(pipe) _PIPE(pipe, HSYNC_A, HSYNC_B)
|
#define HSYNC(pipe) _PIPE(pipe, _HSYNC_A, _HSYNC_B)
|
||||||
#define VTOTAL(pipe) _PIPE(pipe, VTOTAL_A, VTOTAL_B)
|
#define VTOTAL(pipe) _PIPE(pipe, _VTOTAL_A, _VTOTAL_B)
|
||||||
#define VBLANK(pipe) _PIPE(pipe, VBLANK_A, VBLANK_B)
|
#define VBLANK(pipe) _PIPE(pipe, _VBLANK_A, _VBLANK_B)
|
||||||
#define VSYNC(pipe) _PIPE(pipe, VSYNC_A, VSYNC_B)
|
#define VSYNC(pipe) _PIPE(pipe, _VSYNC_A, _VSYNC_B)
|
||||||
#define BCLRPAT(pipe) _PIPE(pipe, BCLRPAT_A, BCLRPAT_B)
|
#define BCLRPAT(pipe) _PIPE(pipe, _BCLRPAT_A, _BCLRPAT_B)
|
||||||
|
|
||||||
/* VGA port control */
|
/* VGA port control */
|
||||||
#define ADPA 0x61100
|
#define ADPA 0x61100
|
||||||
|
@ -2208,8 +2209,8 @@
|
||||||
* which is after the LUTs, so we want the bytes for our color format.
|
* which is after the LUTs, so we want the bytes for our color format.
|
||||||
* For our current usage, this is always 3, one byte for R, G and B.
|
* For our current usage, this is always 3, one byte for R, G and B.
|
||||||
*/
|
*/
|
||||||
#define PIPEA_GMCH_DATA_M 0x70050
|
#define _PIPEA_GMCH_DATA_M 0x70050
|
||||||
#define PIPEB_GMCH_DATA_M 0x71050
|
#define _PIPEB_GMCH_DATA_M 0x71050
|
||||||
|
|
||||||
/* Transfer unit size for display port - 1, default is 0x3f (for TU size 64) */
|
/* Transfer unit size for display port - 1, default is 0x3f (for TU size 64) */
|
||||||
#define PIPE_GMCH_DATA_M_TU_SIZE_MASK (0x3f << 25)
|
#define PIPE_GMCH_DATA_M_TU_SIZE_MASK (0x3f << 25)
|
||||||
|
@ -2217,8 +2218,8 @@
|
||||||
|
|
||||||
#define PIPE_GMCH_DATA_M_MASK (0xffffff)
|
#define PIPE_GMCH_DATA_M_MASK (0xffffff)
|
||||||
|
|
||||||
#define PIPEA_GMCH_DATA_N 0x70054
|
#define _PIPEA_GMCH_DATA_N 0x70054
|
||||||
#define PIPEB_GMCH_DATA_N 0x71054
|
#define _PIPEB_GMCH_DATA_N 0x71054
|
||||||
#define PIPE_GMCH_DATA_N_MASK (0xffffff)
|
#define PIPE_GMCH_DATA_N_MASK (0xffffff)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -2232,20 +2233,25 @@
|
||||||
* Attributes and VB-ID.
|
* Attributes and VB-ID.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define PIPEA_DP_LINK_M 0x70060
|
#define _PIPEA_DP_LINK_M 0x70060
|
||||||
#define PIPEB_DP_LINK_M 0x71060
|
#define _PIPEB_DP_LINK_M 0x71060
|
||||||
#define PIPEA_DP_LINK_M_MASK (0xffffff)
|
#define PIPEA_DP_LINK_M_MASK (0xffffff)
|
||||||
|
|
||||||
#define PIPEA_DP_LINK_N 0x70064
|
#define _PIPEA_DP_LINK_N 0x70064
|
||||||
#define PIPEB_DP_LINK_N 0x71064
|
#define _PIPEB_DP_LINK_N 0x71064
|
||||||
#define PIPEA_DP_LINK_N_MASK (0xffffff)
|
#define PIPEA_DP_LINK_N_MASK (0xffffff)
|
||||||
|
|
||||||
|
#define PIPE_GMCH_DATA_M(pipe) _PIPE(pipe, _PIPEA_GMCH_DATA_M, _PIPEB_GMCH_DATA_M)
|
||||||
|
#define PIPE_GMCH_DATA_N(pipe) _PIPE(pipe, _PIPEA_GMCH_DATA_N, _PIPEB_GMCH_DATA_N)
|
||||||
|
#define PIPE_DP_LINK_M(pipe) _PIPE(pipe, _PIPEA_DP_LINK_M, _PIPEB_DP_LINK_M)
|
||||||
|
#define PIPE_DP_LINK_N(pipe) _PIPE(pipe, _PIPEA_DP_LINK_N, _PIPEB_DP_LINK_N)
|
||||||
|
|
||||||
/* Display & cursor control */
|
/* Display & cursor control */
|
||||||
|
|
||||||
/* Pipe A */
|
/* Pipe A */
|
||||||
#define PIPEADSL 0x70000
|
#define _PIPEADSL 0x70000
|
||||||
#define DSL_LINEMASK 0x00000fff
|
#define DSL_LINEMASK 0x00000fff
|
||||||
#define PIPEACONF 0x70008
|
#define _PIPEACONF 0x70008
|
||||||
#define PIPECONF_ENABLE (1<<31)
|
#define PIPECONF_ENABLE (1<<31)
|
||||||
#define PIPECONF_DISABLE 0
|
#define PIPECONF_DISABLE 0
|
||||||
#define PIPECONF_DOUBLE_WIDE (1<<30)
|
#define PIPECONF_DOUBLE_WIDE (1<<30)
|
||||||
|
@ -2271,7 +2277,7 @@
|
||||||
#define PIPECONF_DITHER_TYPE_ST1 (1<<2)
|
#define PIPECONF_DITHER_TYPE_ST1 (1<<2)
|
||||||
#define PIPECONF_DITHER_TYPE_ST2 (2<<2)
|
#define PIPECONF_DITHER_TYPE_ST2 (2<<2)
|
||||||
#define PIPECONF_DITHER_TYPE_TEMP (3<<2)
|
#define PIPECONF_DITHER_TYPE_TEMP (3<<2)
|
||||||
#define PIPEASTAT 0x70024
|
#define _PIPEASTAT 0x70024
|
||||||
#define PIPE_FIFO_UNDERRUN_STATUS (1UL<<31)
|
#define PIPE_FIFO_UNDERRUN_STATUS (1UL<<31)
|
||||||
#define PIPE_CRC_ERROR_ENABLE (1UL<<29)
|
#define PIPE_CRC_ERROR_ENABLE (1UL<<29)
|
||||||
#define PIPE_CRC_DONE_ENABLE (1UL<<28)
|
#define PIPE_CRC_DONE_ENABLE (1UL<<28)
|
||||||
|
@ -2307,10 +2313,12 @@
|
||||||
#define PIPE_6BPC (2 << 5)
|
#define PIPE_6BPC (2 << 5)
|
||||||
#define PIPE_12BPC (3 << 5)
|
#define PIPE_12BPC (3 << 5)
|
||||||
|
|
||||||
#define PIPESRC(pipe) _PIPE(pipe, PIPEASRC, PIPEBSRC)
|
#define PIPESRC(pipe) _PIPE(pipe, _PIPEASRC, _PIPEBSRC)
|
||||||
#define PIPECONF(pipe) _PIPE(pipe, PIPEACONF, PIPEBCONF)
|
#define PIPECONF(pipe) _PIPE(pipe, _PIPEACONF, _PIPEBCONF)
|
||||||
#define PIPEDSL(pipe) _PIPE(pipe, PIPEADSL, PIPEBDSL)
|
#define PIPEDSL(pipe) _PIPE(pipe, _PIPEADSL, _PIPEBDSL)
|
||||||
#define PIPEFRAMEPIXEL(pipe) _PIPE(pipe, PIPEAFRAMEPIXEL, PIPEBFRAMEPIXEL)
|
#define PIPEFRAME(pipe) _PIPE(pipe, _PIPEAFRAMEHIGH, _PIPEBFRAMEHIGH)
|
||||||
|
#define PIPEFRAMEPIXEL(pipe) _PIPE(pipe, _PIPEAFRAMEPIXEL, _PIPEBFRAMEPIXEL)
|
||||||
|
#define PIPESTAT(pipe) _PIPE(pipe, _PIPEASTAT, _PIPEBSTAT)
|
||||||
|
|
||||||
#define DSPARB 0x70030
|
#define DSPARB 0x70030
|
||||||
#define DSPARB_CSTART_MASK (0x7f << 7)
|
#define DSPARB_CSTART_MASK (0x7f << 7)
|
||||||
|
@ -2472,20 +2480,21 @@
|
||||||
* } while (high1 != high2);
|
* } while (high1 != high2);
|
||||||
* frame = (high1 << 8) | low1;
|
* frame = (high1 << 8) | low1;
|
||||||
*/
|
*/
|
||||||
#define PIPEAFRAMEHIGH 0x70040
|
#define _PIPEAFRAMEHIGH 0x70040
|
||||||
#define PIPE_FRAME_HIGH_MASK 0x0000ffff
|
#define PIPE_FRAME_HIGH_MASK 0x0000ffff
|
||||||
#define PIPE_FRAME_HIGH_SHIFT 0
|
#define PIPE_FRAME_HIGH_SHIFT 0
|
||||||
#define PIPEAFRAMEPIXEL 0x70044
|
#define _PIPEAFRAMEPIXEL 0x70044
|
||||||
#define PIPE_FRAME_LOW_MASK 0xff000000
|
#define PIPE_FRAME_LOW_MASK 0xff000000
|
||||||
#define PIPE_FRAME_LOW_SHIFT 24
|
#define PIPE_FRAME_LOW_SHIFT 24
|
||||||
#define PIPE_PIXEL_MASK 0x00ffffff
|
#define PIPE_PIXEL_MASK 0x00ffffff
|
||||||
#define PIPE_PIXEL_SHIFT 0
|
#define PIPE_PIXEL_SHIFT 0
|
||||||
/* GM45+ just has to be different */
|
/* GM45+ just has to be different */
|
||||||
#define PIPEA_FRMCOUNT_GM45 0x70040
|
#define _PIPEA_FRMCOUNT_GM45 0x70040
|
||||||
#define PIPEA_FLIPCOUNT_GM45 0x70044
|
#define _PIPEA_FLIPCOUNT_GM45 0x70044
|
||||||
|
#define PIPE_FRMCOUNT_GM45(pipe) _PIPE(pipe, _PIPEA_FRMCOUNT_GM45, _PIPEB_FRMCOUNT_GM45)
|
||||||
|
|
||||||
/* Cursor A & B regs */
|
/* Cursor A & B regs */
|
||||||
#define CURACNTR 0x70080
|
#define _CURACNTR 0x70080
|
||||||
/* Old style CUR*CNTR flags (desktop 8xx) */
|
/* Old style CUR*CNTR flags (desktop 8xx) */
|
||||||
#define CURSOR_ENABLE 0x80000000
|
#define CURSOR_ENABLE 0x80000000
|
||||||
#define CURSOR_GAMMA_ENABLE 0x40000000
|
#define CURSOR_GAMMA_ENABLE 0x40000000
|
||||||
|
@ -2506,23 +2515,23 @@
|
||||||
#define MCURSOR_PIPE_A 0x00
|
#define MCURSOR_PIPE_A 0x00
|
||||||
#define MCURSOR_PIPE_B (1 << 28)
|
#define MCURSOR_PIPE_B (1 << 28)
|
||||||
#define MCURSOR_GAMMA_ENABLE (1 << 26)
|
#define MCURSOR_GAMMA_ENABLE (1 << 26)
|
||||||
#define CURABASE 0x70084
|
#define _CURABASE 0x70084
|
||||||
#define CURAPOS 0x70088
|
#define _CURAPOS 0x70088
|
||||||
#define CURSOR_POS_MASK 0x007FF
|
#define CURSOR_POS_MASK 0x007FF
|
||||||
#define CURSOR_POS_SIGN 0x8000
|
#define CURSOR_POS_SIGN 0x8000
|
||||||
#define CURSOR_X_SHIFT 0
|
#define CURSOR_X_SHIFT 0
|
||||||
#define CURSOR_Y_SHIFT 16
|
#define CURSOR_Y_SHIFT 16
|
||||||
#define CURSIZE 0x700a0
|
#define CURSIZE 0x700a0
|
||||||
#define CURBCNTR 0x700c0
|
#define _CURBCNTR 0x700c0
|
||||||
#define CURBBASE 0x700c4
|
#define _CURBBASE 0x700c4
|
||||||
#define CURBPOS 0x700c8
|
#define _CURBPOS 0x700c8
|
||||||
|
|
||||||
#define CURCNTR(pipe) _PIPE(pipe, CURACNTR, CURBCNTR)
|
#define CURCNTR(pipe) _PIPE(pipe, _CURACNTR, _CURBCNTR)
|
||||||
#define CURBASE(pipe) _PIPE(pipe, CURABASE, CURBBASE)
|
#define CURBASE(pipe) _PIPE(pipe, _CURABASE, _CURBBASE)
|
||||||
#define CURPOS(pipe) _PIPE(pipe, CURAPOS, CURBPOS)
|
#define CURPOS(pipe) _PIPE(pipe, _CURAPOS, _CURBPOS)
|
||||||
|
|
||||||
/* Display A control */
|
/* Display A control */
|
||||||
#define DSPACNTR 0x70180
|
#define _DSPACNTR 0x70180
|
||||||
#define DISPLAY_PLANE_ENABLE (1<<31)
|
#define DISPLAY_PLANE_ENABLE (1<<31)
|
||||||
#define DISPLAY_PLANE_DISABLE 0
|
#define DISPLAY_PLANE_DISABLE 0
|
||||||
#define DISPPLANE_GAMMA_ENABLE (1<<30)
|
#define DISPPLANE_GAMMA_ENABLE (1<<30)
|
||||||
|
@ -2548,20 +2557,20 @@
|
||||||
#define DISPPLANE_STEREO_POLARITY_SECOND (1<<18)
|
#define DISPPLANE_STEREO_POLARITY_SECOND (1<<18)
|
||||||
#define DISPPLANE_TRICKLE_FEED_DISABLE (1<<14) /* Ironlake */
|
#define DISPPLANE_TRICKLE_FEED_DISABLE (1<<14) /* Ironlake */
|
||||||
#define DISPPLANE_TILED (1<<10)
|
#define DISPPLANE_TILED (1<<10)
|
||||||
#define DSPAADDR 0x70184
|
#define _DSPAADDR 0x70184
|
||||||
#define DSPASTRIDE 0x70188
|
#define _DSPASTRIDE 0x70188
|
||||||
#define DSPAPOS 0x7018C /* reserved */
|
#define _DSPAPOS 0x7018C /* reserved */
|
||||||
#define DSPASIZE 0x70190
|
#define _DSPASIZE 0x70190
|
||||||
#define DSPASURF 0x7019C /* 965+ only */
|
#define _DSPASURF 0x7019C /* 965+ only */
|
||||||
#define DSPATILEOFF 0x701A4 /* 965+ only */
|
#define _DSPATILEOFF 0x701A4 /* 965+ only */
|
||||||
|
|
||||||
#define DSPCNTR(plane) _PIPE(plane, DSPACNTR, DSPBCNTR)
|
#define DSPCNTR(plane) _PIPE(plane, _DSPACNTR, _DSPBCNTR)
|
||||||
#define DSPADDR(plane) _PIPE(plane, DSPAADDR, DSPBADDR)
|
#define DSPADDR(plane) _PIPE(plane, _DSPAADDR, _DSPBADDR)
|
||||||
#define DSPSTRIDE(plane) _PIPE(plane, DSPASTRIDE, DSPBSTRIDE)
|
#define DSPSTRIDE(plane) _PIPE(plane, _DSPASTRIDE, _DSPBSTRIDE)
|
||||||
#define DSPPOS(plane) _PIPE(plane, DSPAPOS, DSPBPOS)
|
#define DSPPOS(plane) _PIPE(plane, _DSPAPOS, _DSPBPOS)
|
||||||
#define DSPSIZE(plane) _PIPE(plane, DSPASIZE, DSPBSIZE)
|
#define DSPSIZE(plane) _PIPE(plane, _DSPASIZE, _DSPBSIZE)
|
||||||
#define DSPSURF(plane) _PIPE(plane, DSPASURF, DSPBSURF)
|
#define DSPSURF(plane) _PIPE(plane, _DSPASURF, _DSPBSURF)
|
||||||
#define DSPTILEOFF(plane) _PIPE(plane, DSPATILEOFF, DSPBTILEOFF)
|
#define DSPTILEOFF(plane) _PIPE(plane, _DSPATILEOFF, _DSPBTILEOFF)
|
||||||
|
|
||||||
/* VBIOS flags */
|
/* VBIOS flags */
|
||||||
#define SWF00 0x71410
|
#define SWF00 0x71410
|
||||||
|
@ -2579,27 +2588,27 @@
|
||||||
#define SWF32 0x7241c
|
#define SWF32 0x7241c
|
||||||
|
|
||||||
/* Pipe B */
|
/* Pipe B */
|
||||||
#define PIPEBDSL 0x71000
|
#define _PIPEBDSL 0x71000
|
||||||
#define PIPEBCONF 0x71008
|
#define _PIPEBCONF 0x71008
|
||||||
#define PIPEBSTAT 0x71024
|
#define _PIPEBSTAT 0x71024
|
||||||
#define PIPEBFRAMEHIGH 0x71040
|
#define _PIPEBFRAMEHIGH 0x71040
|
||||||
#define PIPEBFRAMEPIXEL 0x71044
|
#define _PIPEBFRAMEPIXEL 0x71044
|
||||||
#define PIPEB_FRMCOUNT_GM45 0x71040
|
#define _PIPEB_FRMCOUNT_GM45 0x71040
|
||||||
#define PIPEB_FLIPCOUNT_GM45 0x71044
|
#define _PIPEB_FLIPCOUNT_GM45 0x71044
|
||||||
|
|
||||||
|
|
||||||
/* Display B control */
|
/* Display B control */
|
||||||
#define DSPBCNTR 0x71180
|
#define _DSPBCNTR 0x71180
|
||||||
#define DISPPLANE_ALPHA_TRANS_ENABLE (1<<15)
|
#define DISPPLANE_ALPHA_TRANS_ENABLE (1<<15)
|
||||||
#define DISPPLANE_ALPHA_TRANS_DISABLE 0
|
#define DISPPLANE_ALPHA_TRANS_DISABLE 0
|
||||||
#define DISPPLANE_SPRITE_ABOVE_DISPLAY 0
|
#define DISPPLANE_SPRITE_ABOVE_DISPLAY 0
|
||||||
#define DISPPLANE_SPRITE_ABOVE_OVERLAY (1)
|
#define DISPPLANE_SPRITE_ABOVE_OVERLAY (1)
|
||||||
#define DSPBADDR 0x71184
|
#define _DSPBADDR 0x71184
|
||||||
#define DSPBSTRIDE 0x71188
|
#define _DSPBSTRIDE 0x71188
|
||||||
#define DSPBPOS 0x7118C
|
#define _DSPBPOS 0x7118C
|
||||||
#define DSPBSIZE 0x71190
|
#define _DSPBSIZE 0x71190
|
||||||
#define DSPBSURF 0x7119C
|
#define _DSPBSURF 0x7119C
|
||||||
#define DSPBTILEOFF 0x711A4
|
#define _DSPBTILEOFF 0x711A4
|
||||||
|
|
||||||
/* VBIOS regs */
|
/* VBIOS regs */
|
||||||
#define VGACNTRL 0x71400
|
#define VGACNTRL 0x71400
|
||||||
|
@ -2653,68 +2662,80 @@
|
||||||
#define FDI_PLL_FREQ_DISABLE_COUNT_LIMIT_MASK 0xff
|
#define FDI_PLL_FREQ_DISABLE_COUNT_LIMIT_MASK 0xff
|
||||||
|
|
||||||
|
|
||||||
#define PIPEA_DATA_M1 0x60030
|
#define _PIPEA_DATA_M1 0x60030
|
||||||
#define TU_SIZE(x) (((x)-1) << 25) /* default size 64 */
|
#define TU_SIZE(x) (((x)-1) << 25) /* default size 64 */
|
||||||
#define TU_SIZE_MASK 0x7e000000
|
#define TU_SIZE_MASK 0x7e000000
|
||||||
#define PIPE_DATA_M1_OFFSET 0
|
#define PIPE_DATA_M1_OFFSET 0
|
||||||
#define PIPEA_DATA_N1 0x60034
|
#define _PIPEA_DATA_N1 0x60034
|
||||||
#define PIPE_DATA_N1_OFFSET 0
|
#define PIPE_DATA_N1_OFFSET 0
|
||||||
|
|
||||||
#define PIPEA_DATA_M2 0x60038
|
#define _PIPEA_DATA_M2 0x60038
|
||||||
#define PIPE_DATA_M2_OFFSET 0
|
#define PIPE_DATA_M2_OFFSET 0
|
||||||
#define PIPEA_DATA_N2 0x6003c
|
#define _PIPEA_DATA_N2 0x6003c
|
||||||
#define PIPE_DATA_N2_OFFSET 0
|
#define PIPE_DATA_N2_OFFSET 0
|
||||||
|
|
||||||
#define PIPEA_LINK_M1 0x60040
|
#define _PIPEA_LINK_M1 0x60040
|
||||||
#define PIPE_LINK_M1_OFFSET 0
|
#define PIPE_LINK_M1_OFFSET 0
|
||||||
#define PIPEA_LINK_N1 0x60044
|
#define _PIPEA_LINK_N1 0x60044
|
||||||
#define PIPE_LINK_N1_OFFSET 0
|
#define PIPE_LINK_N1_OFFSET 0
|
||||||
|
|
||||||
#define PIPEA_LINK_M2 0x60048
|
#define _PIPEA_LINK_M2 0x60048
|
||||||
#define PIPE_LINK_M2_OFFSET 0
|
#define PIPE_LINK_M2_OFFSET 0
|
||||||
#define PIPEA_LINK_N2 0x6004c
|
#define _PIPEA_LINK_N2 0x6004c
|
||||||
#define PIPE_LINK_N2_OFFSET 0
|
#define PIPE_LINK_N2_OFFSET 0
|
||||||
|
|
||||||
/* PIPEB timing regs are same start from 0x61000 */
|
/* PIPEB timing regs are same start from 0x61000 */
|
||||||
|
|
||||||
#define PIPEB_DATA_M1 0x61030
|
#define _PIPEB_DATA_M1 0x61030
|
||||||
#define PIPEB_DATA_N1 0x61034
|
#define _PIPEB_DATA_N1 0x61034
|
||||||
|
|
||||||
#define PIPEB_DATA_M2 0x61038
|
#define _PIPEB_DATA_M2 0x61038
|
||||||
#define PIPEB_DATA_N2 0x6103c
|
#define _PIPEB_DATA_N2 0x6103c
|
||||||
|
|
||||||
#define PIPEB_LINK_M1 0x61040
|
#define _PIPEB_LINK_M1 0x61040
|
||||||
#define PIPEB_LINK_N1 0x61044
|
#define _PIPEB_LINK_N1 0x61044
|
||||||
|
|
||||||
#define PIPEB_LINK_M2 0x61048
|
#define _PIPEB_LINK_M2 0x61048
|
||||||
#define PIPEB_LINK_N2 0x6104c
|
#define _PIPEB_LINK_N2 0x6104c
|
||||||
|
|
||||||
#define PIPE_DATA_M1(pipe) _PIPE(pipe, PIPEA_DATA_M1, PIPEB_DATA_M1)
|
#define PIPE_DATA_M1(pipe) _PIPE(pipe, _PIPEA_DATA_M1, _PIPEB_DATA_M1)
|
||||||
#define PIPE_DATA_N1(pipe) _PIPE(pipe, PIPEA_DATA_N1, PIPEB_DATA_N1)
|
#define PIPE_DATA_N1(pipe) _PIPE(pipe, _PIPEA_DATA_N1, _PIPEB_DATA_N1)
|
||||||
#define PIPE_DATA_M2(pipe) _PIPE(pipe, PIPEA_DATA_M2, PIPEB_DATA_M2)
|
#define PIPE_DATA_M2(pipe) _PIPE(pipe, _PIPEA_DATA_M2, _PIPEB_DATA_M2)
|
||||||
#define PIPE_DATA_N2(pipe) _PIPE(pipe, PIPEA_DATA_N2, PIPEB_DATA_N2)
|
#define PIPE_DATA_N2(pipe) _PIPE(pipe, _PIPEA_DATA_N2, _PIPEB_DATA_N2)
|
||||||
#define PIPE_LINK_M1(pipe) _PIPE(pipe, PIPEA_LINK_M1, PIPEB_LINK_M1)
|
#define PIPE_LINK_M1(pipe) _PIPE(pipe, _PIPEA_LINK_M1, _PIPEB_LINK_M1)
|
||||||
#define PIPE_LINK_N1(pipe) _PIPE(pipe, PIPEA_LINK_N1, PIPEB_LINK_N1)
|
#define PIPE_LINK_N1(pipe) _PIPE(pipe, _PIPEA_LINK_N1, _PIPEB_LINK_N1)
|
||||||
#define PIPE_LINK_M2(pipe) _PIPE(pipe, PIPEA_LINK_M2, PIPEB_LINK_M2)
|
#define PIPE_LINK_M2(pipe) _PIPE(pipe, _PIPEA_LINK_M2, _PIPEB_LINK_M2)
|
||||||
#define PIPE_LINK_N2(pipe) _PIPE(pipe, PIPEA_LINK_N2, PIPEB_LINK_N2)
|
#define PIPE_LINK_N2(pipe) _PIPE(pipe, _PIPEA_LINK_N2, _PIPEB_LINK_N2)
|
||||||
|
|
||||||
/* CPU panel fitter */
|
/* CPU panel fitter */
|
||||||
#define PFA_CTL_1 0x68080
|
/* IVB+ has 3 fitters, 0 is 7x5 capable, the other two only 3x3 */
|
||||||
#define PFB_CTL_1 0x68880
|
#define _PFA_CTL_1 0x68080
|
||||||
|
#define _PFB_CTL_1 0x68880
|
||||||
#define PF_ENABLE (1<<31)
|
#define PF_ENABLE (1<<31)
|
||||||
#define PF_FILTER_MASK (3<<23)
|
#define PF_FILTER_MASK (3<<23)
|
||||||
#define PF_FILTER_PROGRAMMED (0<<23)
|
#define PF_FILTER_PROGRAMMED (0<<23)
|
||||||
#define PF_FILTER_MED_3x3 (1<<23)
|
#define PF_FILTER_MED_3x3 (1<<23)
|
||||||
#define PF_FILTER_EDGE_ENHANCE (2<<23)
|
#define PF_FILTER_EDGE_ENHANCE (2<<23)
|
||||||
#define PF_FILTER_EDGE_SOFTEN (3<<23)
|
#define PF_FILTER_EDGE_SOFTEN (3<<23)
|
||||||
#define PFA_WIN_SZ 0x68074
|
#define _PFA_WIN_SZ 0x68074
|
||||||
#define PFB_WIN_SZ 0x68874
|
#define _PFB_WIN_SZ 0x68874
|
||||||
#define PFA_WIN_POS 0x68070
|
#define _PFA_WIN_POS 0x68070
|
||||||
#define PFB_WIN_POS 0x68870
|
#define _PFB_WIN_POS 0x68870
|
||||||
|
#define _PFA_VSCALE 0x68084
|
||||||
|
#define _PFB_VSCALE 0x68884
|
||||||
|
#define _PFA_HSCALE 0x68090
|
||||||
|
#define _PFB_HSCALE 0x68890
|
||||||
|
|
||||||
|
#define PF_CTL(pipe) _PIPE(pipe, _PFA_CTL_1, _PFB_CTL_1)
|
||||||
|
#define PF_WIN_SZ(pipe) _PIPE(pipe, _PFA_WIN_SZ, _PFB_WIN_SZ)
|
||||||
|
#define PF_WIN_POS(pipe) _PIPE(pipe, _PFA_WIN_POS, _PFB_WIN_POS)
|
||||||
|
#define PF_VSCALE(pipe) _PIPE(pipe, _PFA_VSCALE, _PFB_VSCALE)
|
||||||
|
#define PF_HSCALE(pipe) _PIPE(pipe, _PFA_HSCALE, _PFB_HSCALE)
|
||||||
|
|
||||||
/* legacy palette */
|
/* legacy palette */
|
||||||
#define LGC_PALETTE_A 0x4a000
|
#define _LGC_PALETTE_A 0x4a000
|
||||||
#define LGC_PALETTE_B 0x4a800
|
#define _LGC_PALETTE_B 0x4a800
|
||||||
|
#define LGC_PALETTE(pipe) _PIPE(pipe, _LGC_PALETTE_A, _LGC_PALETTE_B)
|
||||||
|
|
||||||
/* interrupts */
|
/* interrupts */
|
||||||
#define DE_MASTER_IRQ_CONTROL (1 << 31)
|
#define DE_MASTER_IRQ_CONTROL (1 << 31)
|
||||||
|
@ -2880,17 +2901,17 @@
|
||||||
#define PCH_GMBUS4 0xc5110
|
#define PCH_GMBUS4 0xc5110
|
||||||
#define PCH_GMBUS5 0xc5120
|
#define PCH_GMBUS5 0xc5120
|
||||||
|
|
||||||
#define PCH_DPLL_A 0xc6014
|
#define _PCH_DPLL_A 0xc6014
|
||||||
#define PCH_DPLL_B 0xc6018
|
#define _PCH_DPLL_B 0xc6018
|
||||||
#define PCH_DPLL(pipe) _PIPE(pipe, PCH_DPLL_A, PCH_DPLL_B)
|
#define PCH_DPLL(pipe) _PIPE(pipe, _PCH_DPLL_A, _PCH_DPLL_B)
|
||||||
|
|
||||||
#define PCH_FPA0 0xc6040
|
#define _PCH_FPA0 0xc6040
|
||||||
#define FP_CB_TUNE (0x3<<22)
|
#define FP_CB_TUNE (0x3<<22)
|
||||||
#define PCH_FPA1 0xc6044
|
#define _PCH_FPA1 0xc6044
|
||||||
#define PCH_FPB0 0xc6048
|
#define _PCH_FPB0 0xc6048
|
||||||
#define PCH_FPB1 0xc604c
|
#define _PCH_FPB1 0xc604c
|
||||||
#define PCH_FP0(pipe) _PIPE(pipe, PCH_FPA0, PCH_FPB0)
|
#define PCH_FP0(pipe) _PIPE(pipe, _PCH_FPA0, _PCH_FPB0)
|
||||||
#define PCH_FP1(pipe) _PIPE(pipe, PCH_FPA1, PCH_FPB1)
|
#define PCH_FP1(pipe) _PIPE(pipe, _PCH_FPA1, _PCH_FPB1)
|
||||||
|
|
||||||
#define PCH_DPLL_TEST 0xc606c
|
#define PCH_DPLL_TEST 0xc606c
|
||||||
|
|
||||||
|
@ -2942,60 +2963,69 @@
|
||||||
|
|
||||||
/* transcoder */
|
/* transcoder */
|
||||||
|
|
||||||
#define TRANS_HTOTAL_A 0xe0000
|
#define _TRANS_HTOTAL_A 0xe0000
|
||||||
#define TRANS_HTOTAL_SHIFT 16
|
#define TRANS_HTOTAL_SHIFT 16
|
||||||
#define TRANS_HACTIVE_SHIFT 0
|
#define TRANS_HACTIVE_SHIFT 0
|
||||||
#define TRANS_HBLANK_A 0xe0004
|
#define _TRANS_HBLANK_A 0xe0004
|
||||||
#define TRANS_HBLANK_END_SHIFT 16
|
#define TRANS_HBLANK_END_SHIFT 16
|
||||||
#define TRANS_HBLANK_START_SHIFT 0
|
#define TRANS_HBLANK_START_SHIFT 0
|
||||||
#define TRANS_HSYNC_A 0xe0008
|
#define _TRANS_HSYNC_A 0xe0008
|
||||||
#define TRANS_HSYNC_END_SHIFT 16
|
#define TRANS_HSYNC_END_SHIFT 16
|
||||||
#define TRANS_HSYNC_START_SHIFT 0
|
#define TRANS_HSYNC_START_SHIFT 0
|
||||||
#define TRANS_VTOTAL_A 0xe000c
|
#define _TRANS_VTOTAL_A 0xe000c
|
||||||
#define TRANS_VTOTAL_SHIFT 16
|
#define TRANS_VTOTAL_SHIFT 16
|
||||||
#define TRANS_VACTIVE_SHIFT 0
|
#define TRANS_VACTIVE_SHIFT 0
|
||||||
#define TRANS_VBLANK_A 0xe0010
|
#define _TRANS_VBLANK_A 0xe0010
|
||||||
#define TRANS_VBLANK_END_SHIFT 16
|
#define TRANS_VBLANK_END_SHIFT 16
|
||||||
#define TRANS_VBLANK_START_SHIFT 0
|
#define TRANS_VBLANK_START_SHIFT 0
|
||||||
#define TRANS_VSYNC_A 0xe0014
|
#define _TRANS_VSYNC_A 0xe0014
|
||||||
#define TRANS_VSYNC_END_SHIFT 16
|
#define TRANS_VSYNC_END_SHIFT 16
|
||||||
#define TRANS_VSYNC_START_SHIFT 0
|
#define TRANS_VSYNC_START_SHIFT 0
|
||||||
|
|
||||||
#define TRANSA_DATA_M1 0xe0030
|
#define _TRANSA_DATA_M1 0xe0030
|
||||||
#define TRANSA_DATA_N1 0xe0034
|
#define _TRANSA_DATA_N1 0xe0034
|
||||||
#define TRANSA_DATA_M2 0xe0038
|
#define _TRANSA_DATA_M2 0xe0038
|
||||||
#define TRANSA_DATA_N2 0xe003c
|
#define _TRANSA_DATA_N2 0xe003c
|
||||||
#define TRANSA_DP_LINK_M1 0xe0040
|
#define _TRANSA_DP_LINK_M1 0xe0040
|
||||||
#define TRANSA_DP_LINK_N1 0xe0044
|
#define _TRANSA_DP_LINK_N1 0xe0044
|
||||||
#define TRANSA_DP_LINK_M2 0xe0048
|
#define _TRANSA_DP_LINK_M2 0xe0048
|
||||||
#define TRANSA_DP_LINK_N2 0xe004c
|
#define _TRANSA_DP_LINK_N2 0xe004c
|
||||||
|
|
||||||
#define TRANS_HTOTAL_B 0xe1000
|
#define _TRANS_HTOTAL_B 0xe1000
|
||||||
#define TRANS_HBLANK_B 0xe1004
|
#define _TRANS_HBLANK_B 0xe1004
|
||||||
#define TRANS_HSYNC_B 0xe1008
|
#define _TRANS_HSYNC_B 0xe1008
|
||||||
#define TRANS_VTOTAL_B 0xe100c
|
#define _TRANS_VTOTAL_B 0xe100c
|
||||||
#define TRANS_VBLANK_B 0xe1010
|
#define _TRANS_VBLANK_B 0xe1010
|
||||||
#define TRANS_VSYNC_B 0xe1014
|
#define _TRANS_VSYNC_B 0xe1014
|
||||||
|
|
||||||
#define TRANS_HTOTAL(pipe) _PIPE(pipe, TRANS_HTOTAL_A, TRANS_HTOTAL_B)
|
#define TRANS_HTOTAL(pipe) _PIPE(pipe, _TRANS_HTOTAL_A, _TRANS_HTOTAL_B)
|
||||||
#define TRANS_HBLANK(pipe) _PIPE(pipe, TRANS_HBLANK_A, TRANS_HBLANK_B)
|
#define TRANS_HBLANK(pipe) _PIPE(pipe, _TRANS_HBLANK_A, _TRANS_HBLANK_B)
|
||||||
#define TRANS_HSYNC(pipe) _PIPE(pipe, TRANS_HSYNC_A, TRANS_HSYNC_B)
|
#define TRANS_HSYNC(pipe) _PIPE(pipe, _TRANS_HSYNC_A, _TRANS_HSYNC_B)
|
||||||
#define TRANS_VTOTAL(pipe) _PIPE(pipe, TRANS_VTOTAL_A, TRANS_VTOTAL_B)
|
#define TRANS_VTOTAL(pipe) _PIPE(pipe, _TRANS_VTOTAL_A, _TRANS_VTOTAL_B)
|
||||||
#define TRANS_VBLANK(pipe) _PIPE(pipe, TRANS_VBLANK_A, TRANS_VBLANK_B)
|
#define TRANS_VBLANK(pipe) _PIPE(pipe, _TRANS_VBLANK_A, _TRANS_VBLANK_B)
|
||||||
#define TRANS_VSYNC(pipe) _PIPE(pipe, TRANS_VSYNC_A, TRANS_VSYNC_B)
|
#define TRANS_VSYNC(pipe) _PIPE(pipe, _TRANS_VSYNC_A, _TRANS_VSYNC_B)
|
||||||
|
|
||||||
#define TRANSB_DATA_M1 0xe1030
|
#define _TRANSB_DATA_M1 0xe1030
|
||||||
#define TRANSB_DATA_N1 0xe1034
|
#define _TRANSB_DATA_N1 0xe1034
|
||||||
#define TRANSB_DATA_M2 0xe1038
|
#define _TRANSB_DATA_M2 0xe1038
|
||||||
#define TRANSB_DATA_N2 0xe103c
|
#define _TRANSB_DATA_N2 0xe103c
|
||||||
#define TRANSB_DP_LINK_M1 0xe1040
|
#define _TRANSB_DP_LINK_M1 0xe1040
|
||||||
#define TRANSB_DP_LINK_N1 0xe1044
|
#define _TRANSB_DP_LINK_N1 0xe1044
|
||||||
#define TRANSB_DP_LINK_M2 0xe1048
|
#define _TRANSB_DP_LINK_M2 0xe1048
|
||||||
#define TRANSB_DP_LINK_N2 0xe104c
|
#define _TRANSB_DP_LINK_N2 0xe104c
|
||||||
|
|
||||||
#define TRANSACONF 0xf0008
|
#define TRANSDATA_M1(pipe) _PIPE(pipe, _TRANSA_DATA_M1, _TRANSB_DATA_M1)
|
||||||
#define TRANSBCONF 0xf1008
|
#define TRANSDATA_N1(pipe) _PIPE(pipe, _TRANSA_DATA_N1, _TRANSB_DATA_N1)
|
||||||
#define TRANSCONF(plane) _PIPE(plane, TRANSACONF, TRANSBCONF)
|
#define TRANSDATA_M2(pipe) _PIPE(pipe, _TRANSA_DATA_M2, _TRANSB_DATA_M2)
|
||||||
|
#define TRANSDATA_N2(pipe) _PIPE(pipe, _TRANSA_DATA_N2, _TRANSB_DATA_N2)
|
||||||
|
#define TRANSDPLINK_M1(pipe) _PIPE(pipe, _TRANSA_DP_LINK_M1, _TRANSB_DP_LINK_M1)
|
||||||
|
#define TRANSDPLINK_N1(pipe) _PIPE(pipe, _TRANSA_DP_LINK_N1, _TRANSB_DP_LINK_N1)
|
||||||
|
#define TRANSDPLINK_M2(pipe) _PIPE(pipe, _TRANSA_DP_LINK_M2, _TRANSB_DP_LINK_M2)
|
||||||
|
#define TRANSDPLINK_N2(pipe) _PIPE(pipe, _TRANSA_DP_LINK_N2, _TRANSB_DP_LINK_N2)
|
||||||
|
|
||||||
|
#define _TRANSACONF 0xf0008
|
||||||
|
#define _TRANSBCONF 0xf1008
|
||||||
|
#define TRANSCONF(plane) _PIPE(plane, _TRANSACONF, _TRANSBCONF)
|
||||||
#define TRANS_DISABLE (0<<31)
|
#define TRANS_DISABLE (0<<31)
|
||||||
#define TRANS_ENABLE (1<<31)
|
#define TRANS_ENABLE (1<<31)
|
||||||
#define TRANS_STATE_MASK (1<<30)
|
#define TRANS_STATE_MASK (1<<30)
|
||||||
|
@ -3013,19 +3043,19 @@
|
||||||
#define TRANS_6BPC (2<<5)
|
#define TRANS_6BPC (2<<5)
|
||||||
#define TRANS_12BPC (3<<5)
|
#define TRANS_12BPC (3<<5)
|
||||||
|
|
||||||
#define FDI_RXA_CHICKEN 0xc200c
|
#define _FDI_RXA_CHICKEN 0xc200c
|
||||||
#define FDI_RXB_CHICKEN 0xc2010
|
#define _FDI_RXB_CHICKEN 0xc2010
|
||||||
#define FDI_RX_PHASE_SYNC_POINTER_OVR (1<<1)
|
#define FDI_RX_PHASE_SYNC_POINTER_OVR (1<<1)
|
||||||
#define FDI_RX_PHASE_SYNC_POINTER_EN (1<<0)
|
#define FDI_RX_PHASE_SYNC_POINTER_EN (1<<0)
|
||||||
#define FDI_RX_CHICKEN(pipe) _PIPE(pipe, FDI_RXA_CHICKEN, FDI_RXB_CHICKEN)
|
#define FDI_RX_CHICKEN(pipe) _PIPE(pipe, _FDI_RXA_CHICKEN, _FDI_RXB_CHICKEN)
|
||||||
|
|
||||||
#define SOUTH_DSPCLK_GATE_D 0xc2020
|
#define SOUTH_DSPCLK_GATE_D 0xc2020
|
||||||
#define PCH_DPLSUNIT_CLOCK_GATE_DISABLE (1<<29)
|
#define PCH_DPLSUNIT_CLOCK_GATE_DISABLE (1<<29)
|
||||||
|
|
||||||
/* CPU: FDI_TX */
|
/* CPU: FDI_TX */
|
||||||
#define FDI_TXA_CTL 0x60100
|
#define _FDI_TXA_CTL 0x60100
|
||||||
#define FDI_TXB_CTL 0x61100
|
#define _FDI_TXB_CTL 0x61100
|
||||||
#define FDI_TX_CTL(pipe) _PIPE(pipe, FDI_TXA_CTL, FDI_TXB_CTL)
|
#define FDI_TX_CTL(pipe) _PIPE(pipe, _FDI_TXA_CTL, _FDI_TXB_CTL)
|
||||||
#define FDI_TX_DISABLE (0<<31)
|
#define FDI_TX_DISABLE (0<<31)
|
||||||
#define FDI_TX_ENABLE (1<<31)
|
#define FDI_TX_ENABLE (1<<31)
|
||||||
#define FDI_LINK_TRAIN_PATTERN_1 (0<<28)
|
#define FDI_LINK_TRAIN_PATTERN_1 (0<<28)
|
||||||
|
@ -3065,9 +3095,9 @@
|
||||||
#define FDI_SCRAMBLING_DISABLE (1<<7)
|
#define FDI_SCRAMBLING_DISABLE (1<<7)
|
||||||
|
|
||||||
/* FDI_RX, FDI_X is hard-wired to Transcoder_X */
|
/* FDI_RX, FDI_X is hard-wired to Transcoder_X */
|
||||||
#define FDI_RXA_CTL 0xf000c
|
#define _FDI_RXA_CTL 0xf000c
|
||||||
#define FDI_RXB_CTL 0xf100c
|
#define _FDI_RXB_CTL 0xf100c
|
||||||
#define FDI_RX_CTL(pipe) _PIPE(pipe, FDI_RXA_CTL, FDI_RXB_CTL)
|
#define FDI_RX_CTL(pipe) _PIPE(pipe, _FDI_RXA_CTL, _FDI_RXB_CTL)
|
||||||
#define FDI_RX_ENABLE (1<<31)
|
#define FDI_RX_ENABLE (1<<31)
|
||||||
/* train, dp width same as FDI_TX */
|
/* train, dp width same as FDI_TX */
|
||||||
#define FDI_DP_PORT_WIDTH_X8 (7<<19)
|
#define FDI_DP_PORT_WIDTH_X8 (7<<19)
|
||||||
|
@ -3092,15 +3122,15 @@
|
||||||
#define FDI_LINK_TRAIN_NORMAL_CPT (3<<8)
|
#define FDI_LINK_TRAIN_NORMAL_CPT (3<<8)
|
||||||
#define FDI_LINK_TRAIN_PATTERN_MASK_CPT (3<<8)
|
#define FDI_LINK_TRAIN_PATTERN_MASK_CPT (3<<8)
|
||||||
|
|
||||||
#define FDI_RXA_MISC 0xf0010
|
#define _FDI_RXA_MISC 0xf0010
|
||||||
#define FDI_RXB_MISC 0xf1010
|
#define _FDI_RXB_MISC 0xf1010
|
||||||
#define FDI_RXA_TUSIZE1 0xf0030
|
#define _FDI_RXA_TUSIZE1 0xf0030
|
||||||
#define FDI_RXA_TUSIZE2 0xf0038
|
#define _FDI_RXA_TUSIZE2 0xf0038
|
||||||
#define FDI_RXB_TUSIZE1 0xf1030
|
#define _FDI_RXB_TUSIZE1 0xf1030
|
||||||
#define FDI_RXB_TUSIZE2 0xf1038
|
#define _FDI_RXB_TUSIZE2 0xf1038
|
||||||
#define FDI_RX_MISC(pipe) _PIPE(pipe, FDI_RXA_MISC, FDI_RXB_MISC)
|
#define FDI_RX_MISC(pipe) _PIPE(pipe, _FDI_RXA_MISC, _FDI_RXB_MISC)
|
||||||
#define FDI_RX_TUSIZE1(pipe) _PIPE(pipe, FDI_RXA_TUSIZE1, FDI_RXB_TUSIZE1)
|
#define FDI_RX_TUSIZE1(pipe) _PIPE(pipe, _FDI_RXA_TUSIZE1, _FDI_RXB_TUSIZE1)
|
||||||
#define FDI_RX_TUSIZE2(pipe) _PIPE(pipe, FDI_RXA_TUSIZE2, FDI_RXB_TUSIZE2)
|
#define FDI_RX_TUSIZE2(pipe) _PIPE(pipe, _FDI_RXA_TUSIZE2, _FDI_RXB_TUSIZE2)
|
||||||
|
|
||||||
/* FDI_RX interrupt register format */
|
/* FDI_RX interrupt register format */
|
||||||
#define FDI_RX_INTER_LANE_ALIGN (1<<10)
|
#define FDI_RX_INTER_LANE_ALIGN (1<<10)
|
||||||
|
@ -3115,12 +3145,12 @@
|
||||||
#define FDI_RX_CROSS_CLOCK_OVERFLOW (1<<1)
|
#define FDI_RX_CROSS_CLOCK_OVERFLOW (1<<1)
|
||||||
#define FDI_RX_SYMBOL_QUEUE_OVERFLOW (1<<0)
|
#define FDI_RX_SYMBOL_QUEUE_OVERFLOW (1<<0)
|
||||||
|
|
||||||
#define FDI_RXA_IIR 0xf0014
|
#define _FDI_RXA_IIR 0xf0014
|
||||||
#define FDI_RXA_IMR 0xf0018
|
#define _FDI_RXA_IMR 0xf0018
|
||||||
#define FDI_RXB_IIR 0xf1014
|
#define _FDI_RXB_IIR 0xf1014
|
||||||
#define FDI_RXB_IMR 0xf1018
|
#define _FDI_RXB_IMR 0xf1018
|
||||||
#define FDI_RX_IIR(pipe) _PIPE(pipe, FDI_RXA_IIR, FDI_RXB_IIR)
|
#define FDI_RX_IIR(pipe) _PIPE(pipe, _FDI_RXA_IIR, _FDI_RXB_IIR)
|
||||||
#define FDI_RX_IMR(pipe) _PIPE(pipe, FDI_RXA_IMR, FDI_RXB_IMR)
|
#define FDI_RX_IMR(pipe) _PIPE(pipe, _FDI_RXA_IMR, _FDI_RXB_IMR)
|
||||||
|
|
||||||
#define FDI_PLL_CTL_1 0xfe000
|
#define FDI_PLL_CTL_1 0xfe000
|
||||||
#define FDI_PLL_CTL_2 0xfe004
|
#define FDI_PLL_CTL_2 0xfe004
|
||||||
|
|
|
@ -34,11 +34,10 @@ static bool i915_pipe_enabled(struct drm_device *dev, enum pipe pipe)
|
||||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||||
u32 dpll_reg;
|
u32 dpll_reg;
|
||||||
|
|
||||||
if (HAS_PCH_SPLIT(dev)) {
|
if (HAS_PCH_SPLIT(dev))
|
||||||
dpll_reg = (pipe == PIPE_A) ? PCH_DPLL_A: PCH_DPLL_B;
|
dpll_reg = (pipe == PIPE_A) ? _PCH_DPLL_A : _PCH_DPLL_B;
|
||||||
} else {
|
else
|
||||||
dpll_reg = (pipe == PIPE_A) ? DPLL_A: DPLL_B;
|
dpll_reg = (pipe == PIPE_A) ? _DPLL_A : _DPLL_B;
|
||||||
}
|
|
||||||
|
|
||||||
return (I915_READ(dpll_reg) & DPLL_VCO_ENABLE);
|
return (I915_READ(dpll_reg) & DPLL_VCO_ENABLE);
|
||||||
}
|
}
|
||||||
|
@ -46,7 +45,7 @@ static bool i915_pipe_enabled(struct drm_device *dev, enum pipe pipe)
|
||||||
static void i915_save_palette(struct drm_device *dev, enum pipe pipe)
|
static void i915_save_palette(struct drm_device *dev, enum pipe pipe)
|
||||||
{
|
{
|
||||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||||
unsigned long reg = (pipe == PIPE_A ? PALETTE_A : PALETTE_B);
|
unsigned long reg = (pipe == PIPE_A ? _PALETTE_A : _PALETTE_B);
|
||||||
u32 *array;
|
u32 *array;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
@ -54,7 +53,7 @@ static void i915_save_palette(struct drm_device *dev, enum pipe pipe)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (HAS_PCH_SPLIT(dev))
|
if (HAS_PCH_SPLIT(dev))
|
||||||
reg = (pipe == PIPE_A) ? LGC_PALETTE_A : LGC_PALETTE_B;
|
reg = (pipe == PIPE_A) ? _LGC_PALETTE_A : _LGC_PALETTE_B;
|
||||||
|
|
||||||
if (pipe == PIPE_A)
|
if (pipe == PIPE_A)
|
||||||
array = dev_priv->save_palette_a;
|
array = dev_priv->save_palette_a;
|
||||||
|
@ -68,7 +67,7 @@ static void i915_save_palette(struct drm_device *dev, enum pipe pipe)
|
||||||
static void i915_restore_palette(struct drm_device *dev, enum pipe pipe)
|
static void i915_restore_palette(struct drm_device *dev, enum pipe pipe)
|
||||||
{
|
{
|
||||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||||
unsigned long reg = (pipe == PIPE_A ? PALETTE_A : PALETTE_B);
|
unsigned long reg = (pipe == PIPE_A ? _PALETTE_A : _PALETTE_B);
|
||||||
u32 *array;
|
u32 *array;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
@ -76,7 +75,7 @@ static void i915_restore_palette(struct drm_device *dev, enum pipe pipe)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (HAS_PCH_SPLIT(dev))
|
if (HAS_PCH_SPLIT(dev))
|
||||||
reg = (pipe == PIPE_A) ? LGC_PALETTE_A : LGC_PALETTE_B;
|
reg = (pipe == PIPE_A) ? _LGC_PALETTE_A : _LGC_PALETTE_B;
|
||||||
|
|
||||||
if (pipe == PIPE_A)
|
if (pipe == PIPE_A)
|
||||||
array = dev_priv->save_palette_a;
|
array = dev_priv->save_palette_a;
|
||||||
|
@ -241,12 +240,12 @@ static void i915_save_modeset_reg(struct drm_device *dev)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* Cursor state */
|
/* Cursor state */
|
||||||
dev_priv->saveCURACNTR = I915_READ(CURACNTR);
|
dev_priv->saveCURACNTR = I915_READ(_CURACNTR);
|
||||||
dev_priv->saveCURAPOS = I915_READ(CURAPOS);
|
dev_priv->saveCURAPOS = I915_READ(_CURAPOS);
|
||||||
dev_priv->saveCURABASE = I915_READ(CURABASE);
|
dev_priv->saveCURABASE = I915_READ(_CURABASE);
|
||||||
dev_priv->saveCURBCNTR = I915_READ(CURBCNTR);
|
dev_priv->saveCURBCNTR = I915_READ(_CURBCNTR);
|
||||||
dev_priv->saveCURBPOS = I915_READ(CURBPOS);
|
dev_priv->saveCURBPOS = I915_READ(_CURBPOS);
|
||||||
dev_priv->saveCURBBASE = I915_READ(CURBBASE);
|
dev_priv->saveCURBBASE = I915_READ(_CURBBASE);
|
||||||
if (IS_GEN2(dev))
|
if (IS_GEN2(dev))
|
||||||
dev_priv->saveCURSIZE = I915_READ(CURSIZE);
|
dev_priv->saveCURSIZE = I915_READ(CURSIZE);
|
||||||
|
|
||||||
|
@ -256,118 +255,118 @@ static void i915_save_modeset_reg(struct drm_device *dev)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Pipe & plane A info */
|
/* Pipe & plane A info */
|
||||||
dev_priv->savePIPEACONF = I915_READ(PIPEACONF);
|
dev_priv->savePIPEACONF = I915_READ(_PIPEACONF);
|
||||||
dev_priv->savePIPEASRC = I915_READ(PIPEASRC);
|
dev_priv->savePIPEASRC = I915_READ(_PIPEASRC);
|
||||||
if (HAS_PCH_SPLIT(dev)) {
|
if (HAS_PCH_SPLIT(dev)) {
|
||||||
dev_priv->saveFPA0 = I915_READ(PCH_FPA0);
|
dev_priv->saveFPA0 = I915_READ(_PCH_FPA0);
|
||||||
dev_priv->saveFPA1 = I915_READ(PCH_FPA1);
|
dev_priv->saveFPA1 = I915_READ(_PCH_FPA1);
|
||||||
dev_priv->saveDPLL_A = I915_READ(PCH_DPLL_A);
|
dev_priv->saveDPLL_A = I915_READ(_PCH_DPLL_A);
|
||||||
} else {
|
} else {
|
||||||
dev_priv->saveFPA0 = I915_READ(FPA0);
|
dev_priv->saveFPA0 = I915_READ(_FPA0);
|
||||||
dev_priv->saveFPA1 = I915_READ(FPA1);
|
dev_priv->saveFPA1 = I915_READ(_FPA1);
|
||||||
dev_priv->saveDPLL_A = I915_READ(DPLL_A);
|
dev_priv->saveDPLL_A = I915_READ(_DPLL_A);
|
||||||
}
|
}
|
||||||
if (INTEL_INFO(dev)->gen >= 4 && !HAS_PCH_SPLIT(dev))
|
if (INTEL_INFO(dev)->gen >= 4 && !HAS_PCH_SPLIT(dev))
|
||||||
dev_priv->saveDPLL_A_MD = I915_READ(DPLL_A_MD);
|
dev_priv->saveDPLL_A_MD = I915_READ(_DPLL_A_MD);
|
||||||
dev_priv->saveHTOTAL_A = I915_READ(HTOTAL_A);
|
dev_priv->saveHTOTAL_A = I915_READ(_HTOTAL_A);
|
||||||
dev_priv->saveHBLANK_A = I915_READ(HBLANK_A);
|
dev_priv->saveHBLANK_A = I915_READ(_HBLANK_A);
|
||||||
dev_priv->saveHSYNC_A = I915_READ(HSYNC_A);
|
dev_priv->saveHSYNC_A = I915_READ(_HSYNC_A);
|
||||||
dev_priv->saveVTOTAL_A = I915_READ(VTOTAL_A);
|
dev_priv->saveVTOTAL_A = I915_READ(_VTOTAL_A);
|
||||||
dev_priv->saveVBLANK_A = I915_READ(VBLANK_A);
|
dev_priv->saveVBLANK_A = I915_READ(_VBLANK_A);
|
||||||
dev_priv->saveVSYNC_A = I915_READ(VSYNC_A);
|
dev_priv->saveVSYNC_A = I915_READ(_VSYNC_A);
|
||||||
if (!HAS_PCH_SPLIT(dev))
|
if (!HAS_PCH_SPLIT(dev))
|
||||||
dev_priv->saveBCLRPAT_A = I915_READ(BCLRPAT_A);
|
dev_priv->saveBCLRPAT_A = I915_READ(_BCLRPAT_A);
|
||||||
|
|
||||||
if (HAS_PCH_SPLIT(dev)) {
|
if (HAS_PCH_SPLIT(dev)) {
|
||||||
dev_priv->savePIPEA_DATA_M1 = I915_READ(PIPEA_DATA_M1);
|
dev_priv->savePIPEA_DATA_M1 = I915_READ(_PIPEA_DATA_M1);
|
||||||
dev_priv->savePIPEA_DATA_N1 = I915_READ(PIPEA_DATA_N1);
|
dev_priv->savePIPEA_DATA_N1 = I915_READ(_PIPEA_DATA_N1);
|
||||||
dev_priv->savePIPEA_LINK_M1 = I915_READ(PIPEA_LINK_M1);
|
dev_priv->savePIPEA_LINK_M1 = I915_READ(_PIPEA_LINK_M1);
|
||||||
dev_priv->savePIPEA_LINK_N1 = I915_READ(PIPEA_LINK_N1);
|
dev_priv->savePIPEA_LINK_N1 = I915_READ(_PIPEA_LINK_N1);
|
||||||
|
|
||||||
dev_priv->saveFDI_TXA_CTL = I915_READ(FDI_TXA_CTL);
|
dev_priv->saveFDI_TXA_CTL = I915_READ(_FDI_TXA_CTL);
|
||||||
dev_priv->saveFDI_RXA_CTL = I915_READ(FDI_RXA_CTL);
|
dev_priv->saveFDI_RXA_CTL = I915_READ(_FDI_RXA_CTL);
|
||||||
|
|
||||||
dev_priv->savePFA_CTL_1 = I915_READ(PFA_CTL_1);
|
dev_priv->savePFA_CTL_1 = I915_READ(_PFA_CTL_1);
|
||||||
dev_priv->savePFA_WIN_SZ = I915_READ(PFA_WIN_SZ);
|
dev_priv->savePFA_WIN_SZ = I915_READ(_PFA_WIN_SZ);
|
||||||
dev_priv->savePFA_WIN_POS = I915_READ(PFA_WIN_POS);
|
dev_priv->savePFA_WIN_POS = I915_READ(_PFA_WIN_POS);
|
||||||
|
|
||||||
dev_priv->saveTRANSACONF = I915_READ(TRANSACONF);
|
dev_priv->saveTRANSACONF = I915_READ(_TRANSACONF);
|
||||||
dev_priv->saveTRANS_HTOTAL_A = I915_READ(TRANS_HTOTAL_A);
|
dev_priv->saveTRANS_HTOTAL_A = I915_READ(_TRANS_HTOTAL_A);
|
||||||
dev_priv->saveTRANS_HBLANK_A = I915_READ(TRANS_HBLANK_A);
|
dev_priv->saveTRANS_HBLANK_A = I915_READ(_TRANS_HBLANK_A);
|
||||||
dev_priv->saveTRANS_HSYNC_A = I915_READ(TRANS_HSYNC_A);
|
dev_priv->saveTRANS_HSYNC_A = I915_READ(_TRANS_HSYNC_A);
|
||||||
dev_priv->saveTRANS_VTOTAL_A = I915_READ(TRANS_VTOTAL_A);
|
dev_priv->saveTRANS_VTOTAL_A = I915_READ(_TRANS_VTOTAL_A);
|
||||||
dev_priv->saveTRANS_VBLANK_A = I915_READ(TRANS_VBLANK_A);
|
dev_priv->saveTRANS_VBLANK_A = I915_READ(_TRANS_VBLANK_A);
|
||||||
dev_priv->saveTRANS_VSYNC_A = I915_READ(TRANS_VSYNC_A);
|
dev_priv->saveTRANS_VSYNC_A = I915_READ(_TRANS_VSYNC_A);
|
||||||
}
|
}
|
||||||
|
|
||||||
dev_priv->saveDSPACNTR = I915_READ(DSPACNTR);
|
dev_priv->saveDSPACNTR = I915_READ(_DSPACNTR);
|
||||||
dev_priv->saveDSPASTRIDE = I915_READ(DSPASTRIDE);
|
dev_priv->saveDSPASTRIDE = I915_READ(_DSPASTRIDE);
|
||||||
dev_priv->saveDSPASIZE = I915_READ(DSPASIZE);
|
dev_priv->saveDSPASIZE = I915_READ(_DSPASIZE);
|
||||||
dev_priv->saveDSPAPOS = I915_READ(DSPAPOS);
|
dev_priv->saveDSPAPOS = I915_READ(_DSPAPOS);
|
||||||
dev_priv->saveDSPAADDR = I915_READ(DSPAADDR);
|
dev_priv->saveDSPAADDR = I915_READ(_DSPAADDR);
|
||||||
if (INTEL_INFO(dev)->gen >= 4) {
|
if (INTEL_INFO(dev)->gen >= 4) {
|
||||||
dev_priv->saveDSPASURF = I915_READ(DSPASURF);
|
dev_priv->saveDSPASURF = I915_READ(_DSPASURF);
|
||||||
dev_priv->saveDSPATILEOFF = I915_READ(DSPATILEOFF);
|
dev_priv->saveDSPATILEOFF = I915_READ(_DSPATILEOFF);
|
||||||
}
|
}
|
||||||
i915_save_palette(dev, PIPE_A);
|
i915_save_palette(dev, PIPE_A);
|
||||||
dev_priv->savePIPEASTAT = I915_READ(PIPEASTAT);
|
dev_priv->savePIPEASTAT = I915_READ(_PIPEASTAT);
|
||||||
|
|
||||||
/* Pipe & plane B info */
|
/* Pipe & plane B info */
|
||||||
dev_priv->savePIPEBCONF = I915_READ(PIPEBCONF);
|
dev_priv->savePIPEBCONF = I915_READ(_PIPEBCONF);
|
||||||
dev_priv->savePIPEBSRC = I915_READ(PIPEBSRC);
|
dev_priv->savePIPEBSRC = I915_READ(_PIPEBSRC);
|
||||||
if (HAS_PCH_SPLIT(dev)) {
|
if (HAS_PCH_SPLIT(dev)) {
|
||||||
dev_priv->saveFPB0 = I915_READ(PCH_FPB0);
|
dev_priv->saveFPB0 = I915_READ(_PCH_FPB0);
|
||||||
dev_priv->saveFPB1 = I915_READ(PCH_FPB1);
|
dev_priv->saveFPB1 = I915_READ(_PCH_FPB1);
|
||||||
dev_priv->saveDPLL_B = I915_READ(PCH_DPLL_B);
|
dev_priv->saveDPLL_B = I915_READ(_PCH_DPLL_B);
|
||||||
} else {
|
} else {
|
||||||
dev_priv->saveFPB0 = I915_READ(FPB0);
|
dev_priv->saveFPB0 = I915_READ(_FPB0);
|
||||||
dev_priv->saveFPB1 = I915_READ(FPB1);
|
dev_priv->saveFPB1 = I915_READ(_FPB1);
|
||||||
dev_priv->saveDPLL_B = I915_READ(DPLL_B);
|
dev_priv->saveDPLL_B = I915_READ(_DPLL_B);
|
||||||
}
|
}
|
||||||
if (INTEL_INFO(dev)->gen >= 4 && !HAS_PCH_SPLIT(dev))
|
if (INTEL_INFO(dev)->gen >= 4 && !HAS_PCH_SPLIT(dev))
|
||||||
dev_priv->saveDPLL_B_MD = I915_READ(DPLL_B_MD);
|
dev_priv->saveDPLL_B_MD = I915_READ(_DPLL_B_MD);
|
||||||
dev_priv->saveHTOTAL_B = I915_READ(HTOTAL_B);
|
dev_priv->saveHTOTAL_B = I915_READ(_HTOTAL_B);
|
||||||
dev_priv->saveHBLANK_B = I915_READ(HBLANK_B);
|
dev_priv->saveHBLANK_B = I915_READ(_HBLANK_B);
|
||||||
dev_priv->saveHSYNC_B = I915_READ(HSYNC_B);
|
dev_priv->saveHSYNC_B = I915_READ(_HSYNC_B);
|
||||||
dev_priv->saveVTOTAL_B = I915_READ(VTOTAL_B);
|
dev_priv->saveVTOTAL_B = I915_READ(_VTOTAL_B);
|
||||||
dev_priv->saveVBLANK_B = I915_READ(VBLANK_B);
|
dev_priv->saveVBLANK_B = I915_READ(_VBLANK_B);
|
||||||
dev_priv->saveVSYNC_B = I915_READ(VSYNC_B);
|
dev_priv->saveVSYNC_B = I915_READ(_VSYNC_B);
|
||||||
if (!HAS_PCH_SPLIT(dev))
|
if (!HAS_PCH_SPLIT(dev))
|
||||||
dev_priv->saveBCLRPAT_B = I915_READ(BCLRPAT_B);
|
dev_priv->saveBCLRPAT_B = I915_READ(_BCLRPAT_B);
|
||||||
|
|
||||||
if (HAS_PCH_SPLIT(dev)) {
|
if (HAS_PCH_SPLIT(dev)) {
|
||||||
dev_priv->savePIPEB_DATA_M1 = I915_READ(PIPEB_DATA_M1);
|
dev_priv->savePIPEB_DATA_M1 = I915_READ(_PIPEB_DATA_M1);
|
||||||
dev_priv->savePIPEB_DATA_N1 = I915_READ(PIPEB_DATA_N1);
|
dev_priv->savePIPEB_DATA_N1 = I915_READ(_PIPEB_DATA_N1);
|
||||||
dev_priv->savePIPEB_LINK_M1 = I915_READ(PIPEB_LINK_M1);
|
dev_priv->savePIPEB_LINK_M1 = I915_READ(_PIPEB_LINK_M1);
|
||||||
dev_priv->savePIPEB_LINK_N1 = I915_READ(PIPEB_LINK_N1);
|
dev_priv->savePIPEB_LINK_N1 = I915_READ(_PIPEB_LINK_N1);
|
||||||
|
|
||||||
dev_priv->saveFDI_TXB_CTL = I915_READ(FDI_TXB_CTL);
|
dev_priv->saveFDI_TXB_CTL = I915_READ(_FDI_TXB_CTL);
|
||||||
dev_priv->saveFDI_RXB_CTL = I915_READ(FDI_RXB_CTL);
|
dev_priv->saveFDI_RXB_CTL = I915_READ(_FDI_RXB_CTL);
|
||||||
|
|
||||||
dev_priv->savePFB_CTL_1 = I915_READ(PFB_CTL_1);
|
dev_priv->savePFB_CTL_1 = I915_READ(_PFB_CTL_1);
|
||||||
dev_priv->savePFB_WIN_SZ = I915_READ(PFB_WIN_SZ);
|
dev_priv->savePFB_WIN_SZ = I915_READ(_PFB_WIN_SZ);
|
||||||
dev_priv->savePFB_WIN_POS = I915_READ(PFB_WIN_POS);
|
dev_priv->savePFB_WIN_POS = I915_READ(_PFB_WIN_POS);
|
||||||
|
|
||||||
dev_priv->saveTRANSBCONF = I915_READ(TRANSBCONF);
|
dev_priv->saveTRANSBCONF = I915_READ(_TRANSBCONF);
|
||||||
dev_priv->saveTRANS_HTOTAL_B = I915_READ(TRANS_HTOTAL_B);
|
dev_priv->saveTRANS_HTOTAL_B = I915_READ(_TRANS_HTOTAL_B);
|
||||||
dev_priv->saveTRANS_HBLANK_B = I915_READ(TRANS_HBLANK_B);
|
dev_priv->saveTRANS_HBLANK_B = I915_READ(_TRANS_HBLANK_B);
|
||||||
dev_priv->saveTRANS_HSYNC_B = I915_READ(TRANS_HSYNC_B);
|
dev_priv->saveTRANS_HSYNC_B = I915_READ(_TRANS_HSYNC_B);
|
||||||
dev_priv->saveTRANS_VTOTAL_B = I915_READ(TRANS_VTOTAL_B);
|
dev_priv->saveTRANS_VTOTAL_B = I915_READ(_TRANS_VTOTAL_B);
|
||||||
dev_priv->saveTRANS_VBLANK_B = I915_READ(TRANS_VBLANK_B);
|
dev_priv->saveTRANS_VBLANK_B = I915_READ(_TRANS_VBLANK_B);
|
||||||
dev_priv->saveTRANS_VSYNC_B = I915_READ(TRANS_VSYNC_B);
|
dev_priv->saveTRANS_VSYNC_B = I915_READ(_TRANS_VSYNC_B);
|
||||||
}
|
}
|
||||||
|
|
||||||
dev_priv->saveDSPBCNTR = I915_READ(DSPBCNTR);
|
dev_priv->saveDSPBCNTR = I915_READ(_DSPBCNTR);
|
||||||
dev_priv->saveDSPBSTRIDE = I915_READ(DSPBSTRIDE);
|
dev_priv->saveDSPBSTRIDE = I915_READ(_DSPBSTRIDE);
|
||||||
dev_priv->saveDSPBSIZE = I915_READ(DSPBSIZE);
|
dev_priv->saveDSPBSIZE = I915_READ(_DSPBSIZE);
|
||||||
dev_priv->saveDSPBPOS = I915_READ(DSPBPOS);
|
dev_priv->saveDSPBPOS = I915_READ(_DSPBPOS);
|
||||||
dev_priv->saveDSPBADDR = I915_READ(DSPBADDR);
|
dev_priv->saveDSPBADDR = I915_READ(_DSPBADDR);
|
||||||
if (INTEL_INFO(dev)->gen >= 4) {
|
if (INTEL_INFO(dev)->gen >= 4) {
|
||||||
dev_priv->saveDSPBSURF = I915_READ(DSPBSURF);
|
dev_priv->saveDSPBSURF = I915_READ(_DSPBSURF);
|
||||||
dev_priv->saveDSPBTILEOFF = I915_READ(DSPBTILEOFF);
|
dev_priv->saveDSPBTILEOFF = I915_READ(_DSPBTILEOFF);
|
||||||
}
|
}
|
||||||
i915_save_palette(dev, PIPE_B);
|
i915_save_palette(dev, PIPE_B);
|
||||||
dev_priv->savePIPEBSTAT = I915_READ(PIPEBSTAT);
|
dev_priv->savePIPEBSTAT = I915_READ(_PIPEBSTAT);
|
||||||
|
|
||||||
/* Fences */
|
/* Fences */
|
||||||
switch (INTEL_INFO(dev)->gen) {
|
switch (INTEL_INFO(dev)->gen) {
|
||||||
|
@ -426,19 +425,19 @@ static void i915_restore_modeset_reg(struct drm_device *dev)
|
||||||
|
|
||||||
|
|
||||||
if (HAS_PCH_SPLIT(dev)) {
|
if (HAS_PCH_SPLIT(dev)) {
|
||||||
dpll_a_reg = PCH_DPLL_A;
|
dpll_a_reg = _PCH_DPLL_A;
|
||||||
dpll_b_reg = PCH_DPLL_B;
|
dpll_b_reg = _PCH_DPLL_B;
|
||||||
fpa0_reg = PCH_FPA0;
|
fpa0_reg = _PCH_FPA0;
|
||||||
fpb0_reg = PCH_FPB0;
|
fpb0_reg = _PCH_FPB0;
|
||||||
fpa1_reg = PCH_FPA1;
|
fpa1_reg = _PCH_FPA1;
|
||||||
fpb1_reg = PCH_FPB1;
|
fpb1_reg = _PCH_FPB1;
|
||||||
} else {
|
} else {
|
||||||
dpll_a_reg = DPLL_A;
|
dpll_a_reg = _DPLL_A;
|
||||||
dpll_b_reg = DPLL_B;
|
dpll_b_reg = _DPLL_B;
|
||||||
fpa0_reg = FPA0;
|
fpa0_reg = _FPA0;
|
||||||
fpb0_reg = FPB0;
|
fpb0_reg = _FPB0;
|
||||||
fpa1_reg = FPA1;
|
fpa1_reg = _FPA1;
|
||||||
fpb1_reg = FPB1;
|
fpb1_reg = _FPB1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (HAS_PCH_SPLIT(dev)) {
|
if (HAS_PCH_SPLIT(dev)) {
|
||||||
|
@ -461,60 +460,60 @@ static void i915_restore_modeset_reg(struct drm_device *dev)
|
||||||
POSTING_READ(dpll_a_reg);
|
POSTING_READ(dpll_a_reg);
|
||||||
udelay(150);
|
udelay(150);
|
||||||
if (INTEL_INFO(dev)->gen >= 4 && !HAS_PCH_SPLIT(dev)) {
|
if (INTEL_INFO(dev)->gen >= 4 && !HAS_PCH_SPLIT(dev)) {
|
||||||
I915_WRITE(DPLL_A_MD, dev_priv->saveDPLL_A_MD);
|
I915_WRITE(_DPLL_A_MD, dev_priv->saveDPLL_A_MD);
|
||||||
POSTING_READ(DPLL_A_MD);
|
POSTING_READ(_DPLL_A_MD);
|
||||||
}
|
}
|
||||||
udelay(150);
|
udelay(150);
|
||||||
|
|
||||||
/* Restore mode */
|
/* Restore mode */
|
||||||
I915_WRITE(HTOTAL_A, dev_priv->saveHTOTAL_A);
|
I915_WRITE(_HTOTAL_A, dev_priv->saveHTOTAL_A);
|
||||||
I915_WRITE(HBLANK_A, dev_priv->saveHBLANK_A);
|
I915_WRITE(_HBLANK_A, dev_priv->saveHBLANK_A);
|
||||||
I915_WRITE(HSYNC_A, dev_priv->saveHSYNC_A);
|
I915_WRITE(_HSYNC_A, dev_priv->saveHSYNC_A);
|
||||||
I915_WRITE(VTOTAL_A, dev_priv->saveVTOTAL_A);
|
I915_WRITE(_VTOTAL_A, dev_priv->saveVTOTAL_A);
|
||||||
I915_WRITE(VBLANK_A, dev_priv->saveVBLANK_A);
|
I915_WRITE(_VBLANK_A, dev_priv->saveVBLANK_A);
|
||||||
I915_WRITE(VSYNC_A, dev_priv->saveVSYNC_A);
|
I915_WRITE(_VSYNC_A, dev_priv->saveVSYNC_A);
|
||||||
if (!HAS_PCH_SPLIT(dev))
|
if (!HAS_PCH_SPLIT(dev))
|
||||||
I915_WRITE(BCLRPAT_A, dev_priv->saveBCLRPAT_A);
|
I915_WRITE(_BCLRPAT_A, dev_priv->saveBCLRPAT_A);
|
||||||
|
|
||||||
if (HAS_PCH_SPLIT(dev)) {
|
if (HAS_PCH_SPLIT(dev)) {
|
||||||
I915_WRITE(PIPEA_DATA_M1, dev_priv->savePIPEA_DATA_M1);
|
I915_WRITE(_PIPEA_DATA_M1, dev_priv->savePIPEA_DATA_M1);
|
||||||
I915_WRITE(PIPEA_DATA_N1, dev_priv->savePIPEA_DATA_N1);
|
I915_WRITE(_PIPEA_DATA_N1, dev_priv->savePIPEA_DATA_N1);
|
||||||
I915_WRITE(PIPEA_LINK_M1, dev_priv->savePIPEA_LINK_M1);
|
I915_WRITE(_PIPEA_LINK_M1, dev_priv->savePIPEA_LINK_M1);
|
||||||
I915_WRITE(PIPEA_LINK_N1, dev_priv->savePIPEA_LINK_N1);
|
I915_WRITE(_PIPEA_LINK_N1, dev_priv->savePIPEA_LINK_N1);
|
||||||
|
|
||||||
I915_WRITE(FDI_RXA_CTL, dev_priv->saveFDI_RXA_CTL);
|
I915_WRITE(_FDI_RXA_CTL, dev_priv->saveFDI_RXA_CTL);
|
||||||
I915_WRITE(FDI_TXA_CTL, dev_priv->saveFDI_TXA_CTL);
|
I915_WRITE(_FDI_TXA_CTL, dev_priv->saveFDI_TXA_CTL);
|
||||||
|
|
||||||
I915_WRITE(PFA_CTL_1, dev_priv->savePFA_CTL_1);
|
I915_WRITE(_PFA_CTL_1, dev_priv->savePFA_CTL_1);
|
||||||
I915_WRITE(PFA_WIN_SZ, dev_priv->savePFA_WIN_SZ);
|
I915_WRITE(_PFA_WIN_SZ, dev_priv->savePFA_WIN_SZ);
|
||||||
I915_WRITE(PFA_WIN_POS, dev_priv->savePFA_WIN_POS);
|
I915_WRITE(_PFA_WIN_POS, dev_priv->savePFA_WIN_POS);
|
||||||
|
|
||||||
I915_WRITE(TRANSACONF, dev_priv->saveTRANSACONF);
|
I915_WRITE(_TRANSACONF, dev_priv->saveTRANSACONF);
|
||||||
I915_WRITE(TRANS_HTOTAL_A, dev_priv->saveTRANS_HTOTAL_A);
|
I915_WRITE(_TRANS_HTOTAL_A, dev_priv->saveTRANS_HTOTAL_A);
|
||||||
I915_WRITE(TRANS_HBLANK_A, dev_priv->saveTRANS_HBLANK_A);
|
I915_WRITE(_TRANS_HBLANK_A, dev_priv->saveTRANS_HBLANK_A);
|
||||||
I915_WRITE(TRANS_HSYNC_A, dev_priv->saveTRANS_HSYNC_A);
|
I915_WRITE(_TRANS_HSYNC_A, dev_priv->saveTRANS_HSYNC_A);
|
||||||
I915_WRITE(TRANS_VTOTAL_A, dev_priv->saveTRANS_VTOTAL_A);
|
I915_WRITE(_TRANS_VTOTAL_A, dev_priv->saveTRANS_VTOTAL_A);
|
||||||
I915_WRITE(TRANS_VBLANK_A, dev_priv->saveTRANS_VBLANK_A);
|
I915_WRITE(_TRANS_VBLANK_A, dev_priv->saveTRANS_VBLANK_A);
|
||||||
I915_WRITE(TRANS_VSYNC_A, dev_priv->saveTRANS_VSYNC_A);
|
I915_WRITE(_TRANS_VSYNC_A, dev_priv->saveTRANS_VSYNC_A);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Restore plane info */
|
/* Restore plane info */
|
||||||
I915_WRITE(DSPASIZE, dev_priv->saveDSPASIZE);
|
I915_WRITE(_DSPASIZE, dev_priv->saveDSPASIZE);
|
||||||
I915_WRITE(DSPAPOS, dev_priv->saveDSPAPOS);
|
I915_WRITE(_DSPAPOS, dev_priv->saveDSPAPOS);
|
||||||
I915_WRITE(PIPEASRC, dev_priv->savePIPEASRC);
|
I915_WRITE(_PIPEASRC, dev_priv->savePIPEASRC);
|
||||||
I915_WRITE(DSPAADDR, dev_priv->saveDSPAADDR);
|
I915_WRITE(_DSPAADDR, dev_priv->saveDSPAADDR);
|
||||||
I915_WRITE(DSPASTRIDE, dev_priv->saveDSPASTRIDE);
|
I915_WRITE(_DSPASTRIDE, dev_priv->saveDSPASTRIDE);
|
||||||
if (INTEL_INFO(dev)->gen >= 4) {
|
if (INTEL_INFO(dev)->gen >= 4) {
|
||||||
I915_WRITE(DSPASURF, dev_priv->saveDSPASURF);
|
I915_WRITE(_DSPASURF, dev_priv->saveDSPASURF);
|
||||||
I915_WRITE(DSPATILEOFF, dev_priv->saveDSPATILEOFF);
|
I915_WRITE(_DSPATILEOFF, dev_priv->saveDSPATILEOFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
I915_WRITE(PIPEACONF, dev_priv->savePIPEACONF);
|
I915_WRITE(_PIPEACONF, dev_priv->savePIPEACONF);
|
||||||
|
|
||||||
i915_restore_palette(dev, PIPE_A);
|
i915_restore_palette(dev, PIPE_A);
|
||||||
/* Enable the plane */
|
/* Enable the plane */
|
||||||
I915_WRITE(DSPACNTR, dev_priv->saveDSPACNTR);
|
I915_WRITE(_DSPACNTR, dev_priv->saveDSPACNTR);
|
||||||
I915_WRITE(DSPAADDR, I915_READ(DSPAADDR));
|
I915_WRITE(_DSPAADDR, I915_READ(_DSPAADDR));
|
||||||
|
|
||||||
/* Pipe & plane B info */
|
/* Pipe & plane B info */
|
||||||
if (dev_priv->saveDPLL_B & DPLL_VCO_ENABLE) {
|
if (dev_priv->saveDPLL_B & DPLL_VCO_ENABLE) {
|
||||||
|
@ -530,68 +529,68 @@ static void i915_restore_modeset_reg(struct drm_device *dev)
|
||||||
POSTING_READ(dpll_b_reg);
|
POSTING_READ(dpll_b_reg);
|
||||||
udelay(150);
|
udelay(150);
|
||||||
if (INTEL_INFO(dev)->gen >= 4 && !HAS_PCH_SPLIT(dev)) {
|
if (INTEL_INFO(dev)->gen >= 4 && !HAS_PCH_SPLIT(dev)) {
|
||||||
I915_WRITE(DPLL_B_MD, dev_priv->saveDPLL_B_MD);
|
I915_WRITE(_DPLL_B_MD, dev_priv->saveDPLL_B_MD);
|
||||||
POSTING_READ(DPLL_B_MD);
|
POSTING_READ(_DPLL_B_MD);
|
||||||
}
|
}
|
||||||
udelay(150);
|
udelay(150);
|
||||||
|
|
||||||
/* Restore mode */
|
/* Restore mode */
|
||||||
I915_WRITE(HTOTAL_B, dev_priv->saveHTOTAL_B);
|
I915_WRITE(_HTOTAL_B, dev_priv->saveHTOTAL_B);
|
||||||
I915_WRITE(HBLANK_B, dev_priv->saveHBLANK_B);
|
I915_WRITE(_HBLANK_B, dev_priv->saveHBLANK_B);
|
||||||
I915_WRITE(HSYNC_B, dev_priv->saveHSYNC_B);
|
I915_WRITE(_HSYNC_B, dev_priv->saveHSYNC_B);
|
||||||
I915_WRITE(VTOTAL_B, dev_priv->saveVTOTAL_B);
|
I915_WRITE(_VTOTAL_B, dev_priv->saveVTOTAL_B);
|
||||||
I915_WRITE(VBLANK_B, dev_priv->saveVBLANK_B);
|
I915_WRITE(_VBLANK_B, dev_priv->saveVBLANK_B);
|
||||||
I915_WRITE(VSYNC_B, dev_priv->saveVSYNC_B);
|
I915_WRITE(_VSYNC_B, dev_priv->saveVSYNC_B);
|
||||||
if (!HAS_PCH_SPLIT(dev))
|
if (!HAS_PCH_SPLIT(dev))
|
||||||
I915_WRITE(BCLRPAT_B, dev_priv->saveBCLRPAT_B);
|
I915_WRITE(_BCLRPAT_B, dev_priv->saveBCLRPAT_B);
|
||||||
|
|
||||||
if (HAS_PCH_SPLIT(dev)) {
|
if (HAS_PCH_SPLIT(dev)) {
|
||||||
I915_WRITE(PIPEB_DATA_M1, dev_priv->savePIPEB_DATA_M1);
|
I915_WRITE(_PIPEB_DATA_M1, dev_priv->savePIPEB_DATA_M1);
|
||||||
I915_WRITE(PIPEB_DATA_N1, dev_priv->savePIPEB_DATA_N1);
|
I915_WRITE(_PIPEB_DATA_N1, dev_priv->savePIPEB_DATA_N1);
|
||||||
I915_WRITE(PIPEB_LINK_M1, dev_priv->savePIPEB_LINK_M1);
|
I915_WRITE(_PIPEB_LINK_M1, dev_priv->savePIPEB_LINK_M1);
|
||||||
I915_WRITE(PIPEB_LINK_N1, dev_priv->savePIPEB_LINK_N1);
|
I915_WRITE(_PIPEB_LINK_N1, dev_priv->savePIPEB_LINK_N1);
|
||||||
|
|
||||||
I915_WRITE(FDI_RXB_CTL, dev_priv->saveFDI_RXB_CTL);
|
I915_WRITE(_FDI_RXB_CTL, dev_priv->saveFDI_RXB_CTL);
|
||||||
I915_WRITE(FDI_TXB_CTL, dev_priv->saveFDI_TXB_CTL);
|
I915_WRITE(_FDI_TXB_CTL, dev_priv->saveFDI_TXB_CTL);
|
||||||
|
|
||||||
I915_WRITE(PFB_CTL_1, dev_priv->savePFB_CTL_1);
|
I915_WRITE(_PFB_CTL_1, dev_priv->savePFB_CTL_1);
|
||||||
I915_WRITE(PFB_WIN_SZ, dev_priv->savePFB_WIN_SZ);
|
I915_WRITE(_PFB_WIN_SZ, dev_priv->savePFB_WIN_SZ);
|
||||||
I915_WRITE(PFB_WIN_POS, dev_priv->savePFB_WIN_POS);
|
I915_WRITE(_PFB_WIN_POS, dev_priv->savePFB_WIN_POS);
|
||||||
|
|
||||||
I915_WRITE(TRANSBCONF, dev_priv->saveTRANSBCONF);
|
I915_WRITE(_TRANSBCONF, dev_priv->saveTRANSBCONF);
|
||||||
I915_WRITE(TRANS_HTOTAL_B, dev_priv->saveTRANS_HTOTAL_B);
|
I915_WRITE(_TRANS_HTOTAL_B, dev_priv->saveTRANS_HTOTAL_B);
|
||||||
I915_WRITE(TRANS_HBLANK_B, dev_priv->saveTRANS_HBLANK_B);
|
I915_WRITE(_TRANS_HBLANK_B, dev_priv->saveTRANS_HBLANK_B);
|
||||||
I915_WRITE(TRANS_HSYNC_B, dev_priv->saveTRANS_HSYNC_B);
|
I915_WRITE(_TRANS_HSYNC_B, dev_priv->saveTRANS_HSYNC_B);
|
||||||
I915_WRITE(TRANS_VTOTAL_B, dev_priv->saveTRANS_VTOTAL_B);
|
I915_WRITE(_TRANS_VTOTAL_B, dev_priv->saveTRANS_VTOTAL_B);
|
||||||
I915_WRITE(TRANS_VBLANK_B, dev_priv->saveTRANS_VBLANK_B);
|
I915_WRITE(_TRANS_VBLANK_B, dev_priv->saveTRANS_VBLANK_B);
|
||||||
I915_WRITE(TRANS_VSYNC_B, dev_priv->saveTRANS_VSYNC_B);
|
I915_WRITE(_TRANS_VSYNC_B, dev_priv->saveTRANS_VSYNC_B);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Restore plane info */
|
/* Restore plane info */
|
||||||
I915_WRITE(DSPBSIZE, dev_priv->saveDSPBSIZE);
|
I915_WRITE(_DSPBSIZE, dev_priv->saveDSPBSIZE);
|
||||||
I915_WRITE(DSPBPOS, dev_priv->saveDSPBPOS);
|
I915_WRITE(_DSPBPOS, dev_priv->saveDSPBPOS);
|
||||||
I915_WRITE(PIPEBSRC, dev_priv->savePIPEBSRC);
|
I915_WRITE(_PIPEBSRC, dev_priv->savePIPEBSRC);
|
||||||
I915_WRITE(DSPBADDR, dev_priv->saveDSPBADDR);
|
I915_WRITE(_DSPBADDR, dev_priv->saveDSPBADDR);
|
||||||
I915_WRITE(DSPBSTRIDE, dev_priv->saveDSPBSTRIDE);
|
I915_WRITE(_DSPBSTRIDE, dev_priv->saveDSPBSTRIDE);
|
||||||
if (INTEL_INFO(dev)->gen >= 4) {
|
if (INTEL_INFO(dev)->gen >= 4) {
|
||||||
I915_WRITE(DSPBSURF, dev_priv->saveDSPBSURF);
|
I915_WRITE(_DSPBSURF, dev_priv->saveDSPBSURF);
|
||||||
I915_WRITE(DSPBTILEOFF, dev_priv->saveDSPBTILEOFF);
|
I915_WRITE(_DSPBTILEOFF, dev_priv->saveDSPBTILEOFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
I915_WRITE(PIPEBCONF, dev_priv->savePIPEBCONF);
|
I915_WRITE(_PIPEBCONF, dev_priv->savePIPEBCONF);
|
||||||
|
|
||||||
i915_restore_palette(dev, PIPE_B);
|
i915_restore_palette(dev, PIPE_B);
|
||||||
/* Enable the plane */
|
/* Enable the plane */
|
||||||
I915_WRITE(DSPBCNTR, dev_priv->saveDSPBCNTR);
|
I915_WRITE(_DSPBCNTR, dev_priv->saveDSPBCNTR);
|
||||||
I915_WRITE(DSPBADDR, I915_READ(DSPBADDR));
|
I915_WRITE(_DSPBADDR, I915_READ(_DSPBADDR));
|
||||||
|
|
||||||
/* Cursor state */
|
/* Cursor state */
|
||||||
I915_WRITE(CURAPOS, dev_priv->saveCURAPOS);
|
I915_WRITE(_CURAPOS, dev_priv->saveCURAPOS);
|
||||||
I915_WRITE(CURACNTR, dev_priv->saveCURACNTR);
|
I915_WRITE(_CURACNTR, dev_priv->saveCURACNTR);
|
||||||
I915_WRITE(CURABASE, dev_priv->saveCURABASE);
|
I915_WRITE(_CURABASE, dev_priv->saveCURABASE);
|
||||||
I915_WRITE(CURBPOS, dev_priv->saveCURBPOS);
|
I915_WRITE(_CURBPOS, dev_priv->saveCURBPOS);
|
||||||
I915_WRITE(CURBCNTR, dev_priv->saveCURBCNTR);
|
I915_WRITE(_CURBCNTR, dev_priv->saveCURBCNTR);
|
||||||
I915_WRITE(CURBBASE, dev_priv->saveCURBBASE);
|
I915_WRITE(_CURBBASE, dev_priv->saveCURBBASE);
|
||||||
if (IS_GEN2(dev))
|
if (IS_GEN2(dev))
|
||||||
I915_WRITE(CURSIZE, dev_priv->saveCURSIZE);
|
I915_WRITE(CURSIZE, dev_priv->saveCURSIZE);
|
||||||
|
|
||||||
|
@ -653,14 +652,14 @@ void i915_save_display(struct drm_device *dev)
|
||||||
dev_priv->saveDP_B = I915_READ(DP_B);
|
dev_priv->saveDP_B = I915_READ(DP_B);
|
||||||
dev_priv->saveDP_C = I915_READ(DP_C);
|
dev_priv->saveDP_C = I915_READ(DP_C);
|
||||||
dev_priv->saveDP_D = I915_READ(DP_D);
|
dev_priv->saveDP_D = I915_READ(DP_D);
|
||||||
dev_priv->savePIPEA_GMCH_DATA_M = I915_READ(PIPEA_GMCH_DATA_M);
|
dev_priv->savePIPEA_GMCH_DATA_M = I915_READ(_PIPEA_GMCH_DATA_M);
|
||||||
dev_priv->savePIPEB_GMCH_DATA_M = I915_READ(PIPEB_GMCH_DATA_M);
|
dev_priv->savePIPEB_GMCH_DATA_M = I915_READ(_PIPEB_GMCH_DATA_M);
|
||||||
dev_priv->savePIPEA_GMCH_DATA_N = I915_READ(PIPEA_GMCH_DATA_N);
|
dev_priv->savePIPEA_GMCH_DATA_N = I915_READ(_PIPEA_GMCH_DATA_N);
|
||||||
dev_priv->savePIPEB_GMCH_DATA_N = I915_READ(PIPEB_GMCH_DATA_N);
|
dev_priv->savePIPEB_GMCH_DATA_N = I915_READ(_PIPEB_GMCH_DATA_N);
|
||||||
dev_priv->savePIPEA_DP_LINK_M = I915_READ(PIPEA_DP_LINK_M);
|
dev_priv->savePIPEA_DP_LINK_M = I915_READ(_PIPEA_DP_LINK_M);
|
||||||
dev_priv->savePIPEB_DP_LINK_M = I915_READ(PIPEB_DP_LINK_M);
|
dev_priv->savePIPEB_DP_LINK_M = I915_READ(_PIPEB_DP_LINK_M);
|
||||||
dev_priv->savePIPEA_DP_LINK_N = I915_READ(PIPEA_DP_LINK_N);
|
dev_priv->savePIPEA_DP_LINK_N = I915_READ(_PIPEA_DP_LINK_N);
|
||||||
dev_priv->savePIPEB_DP_LINK_N = I915_READ(PIPEB_DP_LINK_N);
|
dev_priv->savePIPEB_DP_LINK_N = I915_READ(_PIPEB_DP_LINK_N);
|
||||||
}
|
}
|
||||||
/* FIXME: save TV & SDVO state */
|
/* FIXME: save TV & SDVO state */
|
||||||
|
|
||||||
|
@ -699,14 +698,14 @@ void i915_restore_display(struct drm_device *dev)
|
||||||
|
|
||||||
/* Display port ratios (must be done before clock is set) */
|
/* Display port ratios (must be done before clock is set) */
|
||||||
if (SUPPORTS_INTEGRATED_DP(dev)) {
|
if (SUPPORTS_INTEGRATED_DP(dev)) {
|
||||||
I915_WRITE(PIPEA_GMCH_DATA_M, dev_priv->savePIPEA_GMCH_DATA_M);
|
I915_WRITE(_PIPEA_GMCH_DATA_M, dev_priv->savePIPEA_GMCH_DATA_M);
|
||||||
I915_WRITE(PIPEB_GMCH_DATA_M, dev_priv->savePIPEB_GMCH_DATA_M);
|
I915_WRITE(_PIPEB_GMCH_DATA_M, dev_priv->savePIPEB_GMCH_DATA_M);
|
||||||
I915_WRITE(PIPEA_GMCH_DATA_N, dev_priv->savePIPEA_GMCH_DATA_N);
|
I915_WRITE(_PIPEA_GMCH_DATA_N, dev_priv->savePIPEA_GMCH_DATA_N);
|
||||||
I915_WRITE(PIPEB_GMCH_DATA_N, dev_priv->savePIPEB_GMCH_DATA_N);
|
I915_WRITE(_PIPEB_GMCH_DATA_N, dev_priv->savePIPEB_GMCH_DATA_N);
|
||||||
I915_WRITE(PIPEA_DP_LINK_M, dev_priv->savePIPEA_DP_LINK_M);
|
I915_WRITE(_PIPEA_DP_LINK_M, dev_priv->savePIPEA_DP_LINK_M);
|
||||||
I915_WRITE(PIPEB_DP_LINK_M, dev_priv->savePIPEB_DP_LINK_M);
|
I915_WRITE(_PIPEB_DP_LINK_M, dev_priv->savePIPEB_DP_LINK_M);
|
||||||
I915_WRITE(PIPEA_DP_LINK_N, dev_priv->savePIPEA_DP_LINK_N);
|
I915_WRITE(_PIPEA_DP_LINK_N, dev_priv->savePIPEA_DP_LINK_N);
|
||||||
I915_WRITE(PIPEB_DP_LINK_N, dev_priv->savePIPEB_DP_LINK_N);
|
I915_WRITE(_PIPEB_DP_LINK_N, dev_priv->savePIPEB_DP_LINK_N);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This is only meaningful in non-KMS mode */
|
/* This is only meaningful in non-KMS mode */
|
||||||
|
@ -808,8 +807,8 @@ int i915_save_state(struct drm_device *dev)
|
||||||
dev_priv->saveDEIMR = I915_READ(DEIMR);
|
dev_priv->saveDEIMR = I915_READ(DEIMR);
|
||||||
dev_priv->saveGTIER = I915_READ(GTIER);
|
dev_priv->saveGTIER = I915_READ(GTIER);
|
||||||
dev_priv->saveGTIMR = I915_READ(GTIMR);
|
dev_priv->saveGTIMR = I915_READ(GTIMR);
|
||||||
dev_priv->saveFDI_RXA_IMR = I915_READ(FDI_RXA_IMR);
|
dev_priv->saveFDI_RXA_IMR = I915_READ(_FDI_RXA_IMR);
|
||||||
dev_priv->saveFDI_RXB_IMR = I915_READ(FDI_RXB_IMR);
|
dev_priv->saveFDI_RXB_IMR = I915_READ(_FDI_RXB_IMR);
|
||||||
dev_priv->saveMCHBAR_RENDER_STANDBY =
|
dev_priv->saveMCHBAR_RENDER_STANDBY =
|
||||||
I915_READ(RSTDBYCTL);
|
I915_READ(RSTDBYCTL);
|
||||||
} else {
|
} else {
|
||||||
|
@ -857,11 +856,11 @@ int i915_restore_state(struct drm_device *dev)
|
||||||
I915_WRITE(DEIMR, dev_priv->saveDEIMR);
|
I915_WRITE(DEIMR, dev_priv->saveDEIMR);
|
||||||
I915_WRITE(GTIER, dev_priv->saveGTIER);
|
I915_WRITE(GTIER, dev_priv->saveGTIER);
|
||||||
I915_WRITE(GTIMR, dev_priv->saveGTIMR);
|
I915_WRITE(GTIMR, dev_priv->saveGTIMR);
|
||||||
I915_WRITE(FDI_RXA_IMR, dev_priv->saveFDI_RXA_IMR);
|
I915_WRITE(_FDI_RXA_IMR, dev_priv->saveFDI_RXA_IMR);
|
||||||
I915_WRITE(FDI_RXB_IMR, dev_priv->saveFDI_RXB_IMR);
|
I915_WRITE(_FDI_RXB_IMR, dev_priv->saveFDI_RXB_IMR);
|
||||||
} else {
|
} else {
|
||||||
I915_WRITE (IER, dev_priv->saveIER);
|
I915_WRITE(IER, dev_priv->saveIER);
|
||||||
I915_WRITE (IMR, dev_priv->saveIMR);
|
I915_WRITE(IMR, dev_priv->saveIMR);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Clock gating state */
|
/* Clock gating state */
|
||||||
|
|
|
@ -129,10 +129,7 @@ static void intel_crt_mode_set(struct drm_encoder *encoder,
|
||||||
u32 adpa, dpll_md;
|
u32 adpa, dpll_md;
|
||||||
u32 adpa_reg;
|
u32 adpa_reg;
|
||||||
|
|
||||||
if (intel_crtc->pipe == 0)
|
dpll_md_reg = DPLL_MD(intel_crtc->pipe);
|
||||||
dpll_md_reg = DPLL_A_MD;
|
|
||||||
else
|
|
||||||
dpll_md_reg = DPLL_B_MD;
|
|
||||||
|
|
||||||
if (HAS_PCH_SPLIT(dev))
|
if (HAS_PCH_SPLIT(dev))
|
||||||
adpa_reg = PCH_ADPA;
|
adpa_reg = PCH_ADPA;
|
||||||
|
@ -160,17 +157,16 @@ static void intel_crt_mode_set(struct drm_encoder *encoder,
|
||||||
adpa |= PORT_TRANS_A_SEL_CPT;
|
adpa |= PORT_TRANS_A_SEL_CPT;
|
||||||
else
|
else
|
||||||
adpa |= ADPA_PIPE_A_SELECT;
|
adpa |= ADPA_PIPE_A_SELECT;
|
||||||
if (!HAS_PCH_SPLIT(dev))
|
|
||||||
I915_WRITE(BCLRPAT_A, 0);
|
|
||||||
} else {
|
} else {
|
||||||
if (HAS_PCH_CPT(dev))
|
if (HAS_PCH_CPT(dev))
|
||||||
adpa |= PORT_TRANS_B_SEL_CPT;
|
adpa |= PORT_TRANS_B_SEL_CPT;
|
||||||
else
|
else
|
||||||
adpa |= ADPA_PIPE_B_SELECT;
|
adpa |= ADPA_PIPE_B_SELECT;
|
||||||
if (!HAS_PCH_SPLIT(dev))
|
|
||||||
I915_WRITE(BCLRPAT_B, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!HAS_PCH_SPLIT(dev))
|
||||||
|
I915_WRITE(BCLRPAT(intel_crtc->pipe), 0);
|
||||||
|
|
||||||
I915_WRITE(adpa_reg, adpa);
|
I915_WRITE(adpa_reg, adpa);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -353,21 +349,12 @@ intel_crt_load_detect(struct drm_crtc *crtc, struct intel_crt *crt)
|
||||||
|
|
||||||
DRM_DEBUG_KMS("starting load-detect on CRT\n");
|
DRM_DEBUG_KMS("starting load-detect on CRT\n");
|
||||||
|
|
||||||
if (pipe == 0) {
|
bclrpat_reg = BCLRPAT(pipe);
|
||||||
bclrpat_reg = BCLRPAT_A;
|
vtotal_reg = VTOTAL(pipe);
|
||||||
vtotal_reg = VTOTAL_A;
|
vblank_reg = VBLANK(pipe);
|
||||||
vblank_reg = VBLANK_A;
|
vsync_reg = VSYNC(pipe);
|
||||||
vsync_reg = VSYNC_A;
|
pipeconf_reg = PIPECONF(pipe);
|
||||||
pipeconf_reg = PIPEACONF;
|
pipe_dsl_reg = PIPEDSL(pipe);
|
||||||
pipe_dsl_reg = PIPEADSL;
|
|
||||||
} else {
|
|
||||||
bclrpat_reg = BCLRPAT_B;
|
|
||||||
vtotal_reg = VTOTAL_B;
|
|
||||||
vblank_reg = VBLANK_B;
|
|
||||||
vsync_reg = VSYNC_B;
|
|
||||||
pipeconf_reg = PIPEBCONF;
|
|
||||||
pipe_dsl_reg = PIPEBDSL;
|
|
||||||
}
|
|
||||||
|
|
||||||
save_bclrpat = I915_READ(bclrpat_reg);
|
save_bclrpat = I915_READ(bclrpat_reg);
|
||||||
save_vtotal = I915_READ(vtotal_reg);
|
save_vtotal = I915_READ(vtotal_reg);
|
||||||
|
|
|
@ -989,7 +989,7 @@ intel_find_pll_g4x_dp(const intel_limit_t *limit, struct drm_crtc *crtc,
|
||||||
void intel_wait_for_vblank(struct drm_device *dev, int pipe)
|
void intel_wait_for_vblank(struct drm_device *dev, int pipe)
|
||||||
{
|
{
|
||||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||||
int pipestat_reg = (pipe == 0 ? PIPEASTAT : PIPEBSTAT);
|
int pipestat_reg = PIPESTAT(pipe);
|
||||||
|
|
||||||
/* Clear existing vblank status. Note this will clear any other
|
/* Clear existing vblank status. Note this will clear any other
|
||||||
* sticky status fields as well.
|
* sticky status fields as well.
|
||||||
|
@ -1185,7 +1185,7 @@ static void assert_panel_unlocked(struct drm_i915_private *dev_priv,
|
||||||
|
|
||||||
WARN(panel_pipe == pipe && locked,
|
WARN(panel_pipe == pipe && locked,
|
||||||
"panel assertion failure, pipe %c regs locked\n",
|
"panel assertion failure, pipe %c regs locked\n",
|
||||||
pipe ? 'B' : 'A');
|
pipe_name(pipe));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void assert_pipe(struct drm_i915_private *dev_priv,
|
static void assert_pipe(struct drm_i915_private *dev_priv,
|
||||||
|
@ -1200,7 +1200,7 @@ static void assert_pipe(struct drm_i915_private *dev_priv,
|
||||||
cur_state = !!(val & PIPECONF_ENABLE);
|
cur_state = !!(val & PIPECONF_ENABLE);
|
||||||
WARN(cur_state != state,
|
WARN(cur_state != state,
|
||||||
"pipe %c assertion failure (expected %s, current %s)\n",
|
"pipe %c assertion failure (expected %s, current %s)\n",
|
||||||
pipe ? 'B' : 'A', state_string(state), state_string(cur_state));
|
pipe_name(pipe), state_string(state), state_string(cur_state));
|
||||||
}
|
}
|
||||||
#define assert_pipe_enabled(d, p) assert_pipe(d, p, true)
|
#define assert_pipe_enabled(d, p) assert_pipe(d, p, true)
|
||||||
#define assert_pipe_disabled(d, p) assert_pipe(d, p, false)
|
#define assert_pipe_disabled(d, p) assert_pipe(d, p, false)
|
||||||
|
@ -1215,7 +1215,7 @@ static void assert_plane_enabled(struct drm_i915_private *dev_priv,
|
||||||
val = I915_READ(reg);
|
val = I915_READ(reg);
|
||||||
WARN(!(val & DISPLAY_PLANE_ENABLE),
|
WARN(!(val & DISPLAY_PLANE_ENABLE),
|
||||||
"plane %c assertion failure, should be active but is disabled\n",
|
"plane %c assertion failure, should be active but is disabled\n",
|
||||||
plane ? 'B' : 'A');
|
plane_name(plane));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void assert_planes_disabled(struct drm_i915_private *dev_priv,
|
static void assert_planes_disabled(struct drm_i915_private *dev_priv,
|
||||||
|
@ -1236,8 +1236,8 @@ static void assert_planes_disabled(struct drm_i915_private *dev_priv,
|
||||||
cur_pipe = (val & DISPPLANE_SEL_PIPE_MASK) >>
|
cur_pipe = (val & DISPPLANE_SEL_PIPE_MASK) >>
|
||||||
DISPPLANE_SEL_PIPE_SHIFT;
|
DISPPLANE_SEL_PIPE_SHIFT;
|
||||||
WARN((val & DISPLAY_PLANE_ENABLE) && pipe == cur_pipe,
|
WARN((val & DISPLAY_PLANE_ENABLE) && pipe == cur_pipe,
|
||||||
"plane %d assertion failure, should be off on pipe %c but is still active\n",
|
"plane %c assertion failure, should be off on pipe %c but is still active\n",
|
||||||
i, pipe ? 'B' : 'A');
|
plane_name(i), pipe_name(pipe));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1262,7 +1262,9 @@ static void assert_transcoder_disabled(struct drm_i915_private *dev_priv,
|
||||||
reg = TRANSCONF(pipe);
|
reg = TRANSCONF(pipe);
|
||||||
val = I915_READ(reg);
|
val = I915_READ(reg);
|
||||||
enabled = !!(val & TRANS_ENABLE);
|
enabled = !!(val & TRANS_ENABLE);
|
||||||
WARN(enabled, "transcoder assertion failed, should be off on pipe %c but is still active\n", pipe ? 'B' :'A');
|
WARN(enabled,
|
||||||
|
"transcoder assertion failed, should be off on pipe %c but is still active\n",
|
||||||
|
pipe_name(pipe));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void assert_pch_dp_disabled(struct drm_i915_private *dev_priv,
|
static void assert_pch_dp_disabled(struct drm_i915_private *dev_priv,
|
||||||
|
@ -1275,7 +1277,7 @@ static void assert_pch_dp_disabled(struct drm_i915_private *dev_priv,
|
||||||
sel_pipe = (val & DP_PIPEB_SELECT) >> 30;
|
sel_pipe = (val & DP_PIPEB_SELECT) >> 30;
|
||||||
WARN((val & DP_PORT_EN) && sel_pipe == pipe,
|
WARN((val & DP_PORT_EN) && sel_pipe == pipe,
|
||||||
"PCH DP (0x%08x) enabled on transcoder %c, should be disabled\n",
|
"PCH DP (0x%08x) enabled on transcoder %c, should be disabled\n",
|
||||||
reg, pipe ? 'B' : 'A');
|
reg, pipe_name(pipe));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void assert_pch_hdmi_disabled(struct drm_i915_private *dev_priv,
|
static void assert_pch_hdmi_disabled(struct drm_i915_private *dev_priv,
|
||||||
|
@ -1288,7 +1290,7 @@ static void assert_pch_hdmi_disabled(struct drm_i915_private *dev_priv,
|
||||||
sel_pipe = (val & TRANSCODER_B) >> 30;
|
sel_pipe = (val & TRANSCODER_B) >> 30;
|
||||||
WARN((val & PORT_ENABLE) && sel_pipe == pipe,
|
WARN((val & PORT_ENABLE) && sel_pipe == pipe,
|
||||||
"PCH DP (0x%08x) enabled on transcoder %c, should be disabled\n",
|
"PCH DP (0x%08x) enabled on transcoder %c, should be disabled\n",
|
||||||
reg, pipe ? 'B' : 'A');
|
reg, pipe_name(pipe));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void assert_pch_ports_disabled(struct drm_i915_private *dev_priv,
|
static void assert_pch_ports_disabled(struct drm_i915_private *dev_priv,
|
||||||
|
@ -1307,14 +1309,14 @@ static void assert_pch_ports_disabled(struct drm_i915_private *dev_priv,
|
||||||
sel_pipe = (val & ADPA_TRANS_B_SELECT) >> 30;
|
sel_pipe = (val & ADPA_TRANS_B_SELECT) >> 30;
|
||||||
WARN(sel_pipe == pipe && (val & ADPA_DAC_ENABLE),
|
WARN(sel_pipe == pipe && (val & ADPA_DAC_ENABLE),
|
||||||
"PCH VGA enabled on transcoder %c, should be disabled\n",
|
"PCH VGA enabled on transcoder %c, should be disabled\n",
|
||||||
pipe ? 'B' : 'A');
|
pipe_name(pipe));
|
||||||
|
|
||||||
reg = PCH_LVDS;
|
reg = PCH_LVDS;
|
||||||
val = I915_READ(reg);
|
val = I915_READ(reg);
|
||||||
sel_pipe = (val & LVDS_PIPEB_SELECT) >> 30;
|
sel_pipe = (val & LVDS_PIPEB_SELECT) >> 30;
|
||||||
WARN(sel_pipe == pipe && (val & LVDS_PORT_EN),
|
WARN(sel_pipe == pipe && (val & LVDS_PORT_EN),
|
||||||
"PCH LVDS enabled on transcoder %c, should be disabled\n",
|
"PCH LVDS enabled on transcoder %c, should be disabled\n",
|
||||||
pipe ? 'B' : 'A');
|
pipe_name(pipe));
|
||||||
|
|
||||||
assert_pch_hdmi_disabled(dev_priv, pipe, HDMIB);
|
assert_pch_hdmi_disabled(dev_priv, pipe, HDMIB);
|
||||||
assert_pch_hdmi_disabled(dev_priv, pipe, HDMIC);
|
assert_pch_hdmi_disabled(dev_priv, pipe, HDMIC);
|
||||||
|
@ -2816,12 +2818,9 @@ static void ironlake_crtc_enable(struct drm_crtc *crtc)
|
||||||
* as some pre-programmed values are broken,
|
* as some pre-programmed values are broken,
|
||||||
* e.g. x201.
|
* e.g. x201.
|
||||||
*/
|
*/
|
||||||
I915_WRITE(pipe ? PFB_CTL_1 : PFA_CTL_1,
|
I915_WRITE(PF_CTL(pipe), PF_ENABLE | PF_FILTER_MED_3x3);
|
||||||
PF_ENABLE | PF_FILTER_MED_3x3);
|
I915_WRITE(PF_WIN_POS(pipe), dev_priv->pch_pf_pos);
|
||||||
I915_WRITE(pipe ? PFB_WIN_POS : PFA_WIN_POS,
|
I915_WRITE(PF_WIN_SZ(pipe), dev_priv->pch_pf_size);
|
||||||
dev_priv->pch_pf_pos);
|
|
||||||
I915_WRITE(pipe ? PFB_WIN_SZ : PFA_WIN_SZ,
|
|
||||||
dev_priv->pch_pf_size);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
intel_enable_pipe(dev_priv, pipe, is_pch_port);
|
intel_enable_pipe(dev_priv, pipe, is_pch_port);
|
||||||
|
@ -2860,8 +2859,8 @@ static void ironlake_crtc_disable(struct drm_crtc *crtc)
|
||||||
intel_disable_pipe(dev_priv, pipe);
|
intel_disable_pipe(dev_priv, pipe);
|
||||||
|
|
||||||
/* Disable PF */
|
/* Disable PF */
|
||||||
I915_WRITE(pipe ? PFB_CTL_1 : PFA_CTL_1, 0);
|
I915_WRITE(PF_CTL(pipe), 0);
|
||||||
I915_WRITE(pipe ? PFB_WIN_SZ : PFA_WIN_SZ, 0);
|
I915_WRITE(PF_WIN_SZ(pipe), 0);
|
||||||
|
|
||||||
ironlake_fdi_disable(crtc);
|
ironlake_fdi_disable(crtc);
|
||||||
|
|
||||||
|
@ -2886,10 +2885,20 @@ static void ironlake_crtc_disable(struct drm_crtc *crtc)
|
||||||
|
|
||||||
/* disable DPLL_SEL */
|
/* disable DPLL_SEL */
|
||||||
temp = I915_READ(PCH_DPLL_SEL);
|
temp = I915_READ(PCH_DPLL_SEL);
|
||||||
if (pipe == 0)
|
switch (pipe) {
|
||||||
temp &= ~(TRANSA_DPLL_ENABLE | TRANSA_DPLLB_SEL);
|
case 0:
|
||||||
else
|
temp &= ~(TRANSA_DPLL_ENABLE | TRANSA_DPLLA_SEL);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
temp &= ~(TRANSB_DPLL_ENABLE | TRANSB_DPLLB_SEL);
|
temp &= ~(TRANSB_DPLL_ENABLE | TRANSB_DPLLB_SEL);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
/* FIXME: manage transcoder PLLs? */
|
||||||
|
temp &= ~(TRANSC_DPLL_ENABLE | TRANSC_DPLLB_SEL);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
BUG(); /* wtf */
|
||||||
|
}
|
||||||
I915_WRITE(PCH_DPLL_SEL, temp);
|
I915_WRITE(PCH_DPLL_SEL, temp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3074,7 +3083,7 @@ static void intel_crtc_dpms(struct drm_crtc *crtc, int mode)
|
||||||
master_priv->sarea_priv->pipeB_h = enabled ? crtc->mode.vdisplay : 0;
|
master_priv->sarea_priv->pipeB_h = enabled ? crtc->mode.vdisplay : 0;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
DRM_ERROR("Can't update pipe %d in SAREA\n", pipe);
|
DRM_ERROR("Can't update pipe %c in SAREA\n", pipe_name(pipe));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4923,10 +4932,20 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc,
|
||||||
/* enable transcoder DPLL */
|
/* enable transcoder DPLL */
|
||||||
if (HAS_PCH_CPT(dev)) {
|
if (HAS_PCH_CPT(dev)) {
|
||||||
temp = I915_READ(PCH_DPLL_SEL);
|
temp = I915_READ(PCH_DPLL_SEL);
|
||||||
if (pipe == 0)
|
switch (pipe) {
|
||||||
|
case 0:
|
||||||
temp |= TRANSA_DPLL_ENABLE | TRANSA_DPLLA_SEL;
|
temp |= TRANSA_DPLL_ENABLE | TRANSA_DPLLA_SEL;
|
||||||
else
|
break;
|
||||||
|
case 1:
|
||||||
temp |= TRANSB_DPLL_ENABLE | TRANSB_DPLLB_SEL;
|
temp |= TRANSB_DPLL_ENABLE | TRANSB_DPLLB_SEL;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
/* FIXME: manage transcoder PLLs? */
|
||||||
|
temp |= TRANSC_DPLL_ENABLE | TRANSC_DPLLB_SEL;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
BUG();
|
||||||
|
}
|
||||||
I915_WRITE(PCH_DPLL_SEL, temp);
|
I915_WRITE(PCH_DPLL_SEL, temp);
|
||||||
|
|
||||||
POSTING_READ(PCH_DPLL_SEL);
|
POSTING_READ(PCH_DPLL_SEL);
|
||||||
|
@ -5009,17 +5028,10 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc,
|
||||||
intel_dp_set_m_n(crtc, mode, adjusted_mode);
|
intel_dp_set_m_n(crtc, mode, adjusted_mode);
|
||||||
} else if (HAS_PCH_SPLIT(dev)) {
|
} else if (HAS_PCH_SPLIT(dev)) {
|
||||||
/* For non-DP output, clear any trans DP clock recovery setting.*/
|
/* For non-DP output, clear any trans DP clock recovery setting.*/
|
||||||
if (pipe == 0) {
|
I915_WRITE(TRANSDATA_M1(pipe), 0);
|
||||||
I915_WRITE(TRANSA_DATA_M1, 0);
|
I915_WRITE(TRANSDATA_N1(pipe), 0);
|
||||||
I915_WRITE(TRANSA_DATA_N1, 0);
|
I915_WRITE(TRANSDPLINK_M1(pipe), 0);
|
||||||
I915_WRITE(TRANSA_DP_LINK_M1, 0);
|
I915_WRITE(TRANSDPLINK_N1(pipe), 0);
|
||||||
I915_WRITE(TRANSA_DP_LINK_N1, 0);
|
|
||||||
} else {
|
|
||||||
I915_WRITE(TRANSB_DATA_M1, 0);
|
|
||||||
I915_WRITE(TRANSB_DATA_N1, 0);
|
|
||||||
I915_WRITE(TRANSB_DP_LINK_M1, 0);
|
|
||||||
I915_WRITE(TRANSB_DP_LINK_N1, 0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!has_edp_encoder || intel_encoder_is_pch_edp(&has_edp_encoder->base)) {
|
if (!has_edp_encoder || intel_encoder_is_pch_edp(&has_edp_encoder->base)) {
|
||||||
|
@ -5153,7 +5165,7 @@ void intel_crtc_load_lut(struct drm_crtc *crtc)
|
||||||
struct drm_device *dev = crtc->dev;
|
struct drm_device *dev = crtc->dev;
|
||||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||||
struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
|
struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
|
||||||
int palreg = (intel_crtc->pipe == 0) ? PALETTE_A : PALETTE_B;
|
int palreg = PALETTE(intel_crtc->pipe);
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* The clocks have to be on to load the palette. */
|
/* The clocks have to be on to load the palette. */
|
||||||
|
@ -5162,8 +5174,7 @@ void intel_crtc_load_lut(struct drm_crtc *crtc)
|
||||||
|
|
||||||
/* use legacy palette for Ironlake */
|
/* use legacy palette for Ironlake */
|
||||||
if (HAS_PCH_SPLIT(dev))
|
if (HAS_PCH_SPLIT(dev))
|
||||||
palreg = (intel_crtc->pipe == 0) ? LGC_PALETTE_A :
|
palreg = LGC_PALETTE(intel_crtc->pipe);
|
||||||
LGC_PALETTE_B;
|
|
||||||
|
|
||||||
for (i = 0; i < 256; i++) {
|
for (i = 0; i < 256; i++) {
|
||||||
I915_WRITE(palreg + 4 * i,
|
I915_WRITE(palreg + 4 * i,
|
||||||
|
@ -5184,12 +5195,12 @@ static void i845_update_cursor(struct drm_crtc *crtc, u32 base)
|
||||||
if (intel_crtc->cursor_visible == visible)
|
if (intel_crtc->cursor_visible == visible)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
cntl = I915_READ(CURACNTR);
|
cntl = I915_READ(_CURACNTR);
|
||||||
if (visible) {
|
if (visible) {
|
||||||
/* On these chipsets we can only modify the base whilst
|
/* On these chipsets we can only modify the base whilst
|
||||||
* the cursor is disabled.
|
* the cursor is disabled.
|
||||||
*/
|
*/
|
||||||
I915_WRITE(CURABASE, base);
|
I915_WRITE(_CURABASE, base);
|
||||||
|
|
||||||
cntl &= ~(CURSOR_FORMAT_MASK);
|
cntl &= ~(CURSOR_FORMAT_MASK);
|
||||||
/* XXX width must be 64, stride 256 => 0x00 << 28 */
|
/* XXX width must be 64, stride 256 => 0x00 << 28 */
|
||||||
|
@ -5198,7 +5209,7 @@ static void i845_update_cursor(struct drm_crtc *crtc, u32 base)
|
||||||
CURSOR_FORMAT_ARGB;
|
CURSOR_FORMAT_ARGB;
|
||||||
} else
|
} else
|
||||||
cntl &= ~(CURSOR_ENABLE | CURSOR_GAMMA_ENABLE);
|
cntl &= ~(CURSOR_ENABLE | CURSOR_GAMMA_ENABLE);
|
||||||
I915_WRITE(CURACNTR, cntl);
|
I915_WRITE(_CURACNTR, cntl);
|
||||||
|
|
||||||
intel_crtc->cursor_visible = visible;
|
intel_crtc->cursor_visible = visible;
|
||||||
}
|
}
|
||||||
|
@ -5212,7 +5223,7 @@ static void i9xx_update_cursor(struct drm_crtc *crtc, u32 base)
|
||||||
bool visible = base != 0;
|
bool visible = base != 0;
|
||||||
|
|
||||||
if (intel_crtc->cursor_visible != visible) {
|
if (intel_crtc->cursor_visible != visible) {
|
||||||
uint32_t cntl = I915_READ(pipe == 0 ? CURACNTR : CURBCNTR);
|
uint32_t cntl = CURCNTR(pipe);
|
||||||
if (base) {
|
if (base) {
|
||||||
cntl &= ~(CURSOR_MODE | MCURSOR_PIPE_SELECT);
|
cntl &= ~(CURSOR_MODE | MCURSOR_PIPE_SELECT);
|
||||||
cntl |= CURSOR_MODE_64_ARGB_AX | MCURSOR_GAMMA_ENABLE;
|
cntl |= CURSOR_MODE_64_ARGB_AX | MCURSOR_GAMMA_ENABLE;
|
||||||
|
@ -5221,12 +5232,12 @@ static void i9xx_update_cursor(struct drm_crtc *crtc, u32 base)
|
||||||
cntl &= ~(CURSOR_MODE | MCURSOR_GAMMA_ENABLE);
|
cntl &= ~(CURSOR_MODE | MCURSOR_GAMMA_ENABLE);
|
||||||
cntl |= CURSOR_MODE_DISABLE;
|
cntl |= CURSOR_MODE_DISABLE;
|
||||||
}
|
}
|
||||||
I915_WRITE(pipe == 0 ? CURACNTR : CURBCNTR, cntl);
|
I915_WRITE(CURCNTR(pipe), cntl);
|
||||||
|
|
||||||
intel_crtc->cursor_visible = visible;
|
intel_crtc->cursor_visible = visible;
|
||||||
}
|
}
|
||||||
/* and commit changes on next vblank */
|
/* and commit changes on next vblank */
|
||||||
I915_WRITE(pipe == 0 ? CURABASE : CURBBASE, base);
|
I915_WRITE(CURBASE(pipe), base);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If no-part of the cursor is visible on the framebuffer, then the GPU may hang... */
|
/* If no-part of the cursor is visible on the framebuffer, then the GPU may hang... */
|
||||||
|
@ -5276,7 +5287,7 @@ static void intel_crtc_update_cursor(struct drm_crtc *crtc,
|
||||||
if (!visible && !intel_crtc->cursor_visible)
|
if (!visible && !intel_crtc->cursor_visible)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
I915_WRITE(pipe == 0 ? CURAPOS : CURBPOS, pos);
|
I915_WRITE(CURPOS(pipe), pos);
|
||||||
if (IS_845G(dev) || IS_I865G(dev))
|
if (IS_845G(dev) || IS_I865G(dev))
|
||||||
i845_update_cursor(crtc, base);
|
i845_update_cursor(crtc, base);
|
||||||
else
|
else
|
||||||
|
@ -5582,14 +5593,14 @@ static int intel_crtc_clock_get(struct drm_device *dev, struct drm_crtc *crtc)
|
||||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||||
struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
|
struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
|
||||||
int pipe = intel_crtc->pipe;
|
int pipe = intel_crtc->pipe;
|
||||||
u32 dpll = I915_READ((pipe == 0) ? DPLL_A : DPLL_B);
|
u32 dpll = DPLL(pipe);
|
||||||
u32 fp;
|
u32 fp;
|
||||||
intel_clock_t clock;
|
intel_clock_t clock;
|
||||||
|
|
||||||
if ((dpll & DISPLAY_RATE_SELECT_FPA1) == 0)
|
if ((dpll & DISPLAY_RATE_SELECT_FPA1) == 0)
|
||||||
fp = I915_READ((pipe == 0) ? FPA0 : FPB0);
|
fp = FP0(pipe);
|
||||||
else
|
else
|
||||||
fp = I915_READ((pipe == 0) ? FPA1 : FPB1);
|
fp = FP1(pipe);
|
||||||
|
|
||||||
clock.m1 = (fp & FP_M1_DIV_MASK) >> FP_M1_DIV_SHIFT;
|
clock.m1 = (fp & FP_M1_DIV_MASK) >> FP_M1_DIV_SHIFT;
|
||||||
if (IS_PINEVIEW(dev)) {
|
if (IS_PINEVIEW(dev)) {
|
||||||
|
@ -5667,14 +5678,13 @@ static int intel_crtc_clock_get(struct drm_device *dev, struct drm_crtc *crtc)
|
||||||
struct drm_display_mode *intel_crtc_mode_get(struct drm_device *dev,
|
struct drm_display_mode *intel_crtc_mode_get(struct drm_device *dev,
|
||||||
struct drm_crtc *crtc)
|
struct drm_crtc *crtc)
|
||||||
{
|
{
|
||||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
|
||||||
struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
|
struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
|
||||||
int pipe = intel_crtc->pipe;
|
int pipe = intel_crtc->pipe;
|
||||||
struct drm_display_mode *mode;
|
struct drm_display_mode *mode;
|
||||||
int htot = I915_READ((pipe == 0) ? HTOTAL_A : HTOTAL_B);
|
int htot = HTOTAL(pipe);
|
||||||
int hsync = I915_READ((pipe == 0) ? HSYNC_A : HSYNC_B);
|
int hsync = HSYNC(pipe);
|
||||||
int vtot = I915_READ((pipe == 0) ? VTOTAL_A : VTOTAL_B);
|
int vtot = VTOTAL(pipe);
|
||||||
int vsync = I915_READ((pipe == 0) ? VSYNC_A : VSYNC_B);
|
int vsync = VSYNC(pipe);
|
||||||
|
|
||||||
mode = kzalloc(sizeof(*mode), GFP_KERNEL);
|
mode = kzalloc(sizeof(*mode), GFP_KERNEL);
|
||||||
if (!mode)
|
if (!mode)
|
||||||
|
@ -5783,7 +5793,7 @@ static void intel_decrease_pllclock(struct drm_crtc *crtc)
|
||||||
drm_i915_private_t *dev_priv = dev->dev_private;
|
drm_i915_private_t *dev_priv = dev->dev_private;
|
||||||
struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
|
struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
|
||||||
int pipe = intel_crtc->pipe;
|
int pipe = intel_crtc->pipe;
|
||||||
int dpll_reg = (pipe == 0) ? DPLL_A : DPLL_B;
|
int dpll_reg = DPLL(pipe);
|
||||||
int dpll = I915_READ(dpll_reg);
|
int dpll = I915_READ(dpll_reg);
|
||||||
|
|
||||||
if (HAS_PCH_SPLIT(dev))
|
if (HAS_PCH_SPLIT(dev))
|
||||||
|
@ -6164,7 +6174,7 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
|
||||||
* pf = I915_READ(pipe == 0 ? PFA_CTL_1 : PFB_CTL_1) & PF_ENABLE;
|
* pf = I915_READ(pipe == 0 ? PFA_CTL_1 : PFB_CTL_1) & PF_ENABLE;
|
||||||
*/
|
*/
|
||||||
pf = 0;
|
pf = 0;
|
||||||
pipesrc = I915_READ(pipe == 0 ? PIPEASRC : PIPEBSRC) & 0x0fff0fff;
|
pipesrc = I915_READ(PIPESRC(pipe)) & 0x0fff0fff;
|
||||||
OUT_RING(pf | pipesrc);
|
OUT_RING(pf | pipesrc);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -6174,8 +6184,8 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
|
||||||
OUT_RING(fb->pitch | obj->tiling_mode);
|
OUT_RING(fb->pitch | obj->tiling_mode);
|
||||||
OUT_RING(obj->gtt_offset);
|
OUT_RING(obj->gtt_offset);
|
||||||
|
|
||||||
pf = I915_READ(pipe == 0 ? PFA_CTL_1 : PFB_CTL_1) & PF_ENABLE;
|
pf = I915_READ(PF_CTL(pipe)) & PF_ENABLE;
|
||||||
pipesrc = I915_READ(pipe == 0 ? PIPEASRC : PIPEBSRC) & 0x0fff0fff;
|
pipesrc = I915_READ(PIPESRC(pipe)) & 0x0fff0fff;
|
||||||
OUT_RING(pf | pipesrc);
|
OUT_RING(pf | pipesrc);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -6945,6 +6955,7 @@ void gen6_enable_rps(struct drm_i915_private *dev_priv)
|
||||||
void intel_enable_clock_gating(struct drm_device *dev)
|
void intel_enable_clock_gating(struct drm_device *dev)
|
||||||
{
|
{
|
||||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||||
|
int pipe;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Disable clock gating reported to work incorrectly according to the
|
* Disable clock gating reported to work incorrectly according to the
|
||||||
|
@ -7054,12 +7065,10 @@ void intel_enable_clock_gating(struct drm_device *dev)
|
||||||
ILK_DPARB_CLK_GATE |
|
ILK_DPARB_CLK_GATE |
|
||||||
ILK_DPFD_CLK_GATE);
|
ILK_DPFD_CLK_GATE);
|
||||||
|
|
||||||
I915_WRITE(DSPACNTR,
|
for_each_pipe(pipe)
|
||||||
I915_READ(DSPACNTR) |
|
I915_WRITE(DSPCNTR(pipe),
|
||||||
DISPPLANE_TRICKLE_FEED_DISABLE);
|
I915_READ(DSPCNTR(pipe)) |
|
||||||
I915_WRITE(DSPBCNTR,
|
DISPPLANE_TRICKLE_FEED_DISABLE);
|
||||||
I915_READ(DSPBCNTR) |
|
|
||||||
DISPPLANE_TRICKLE_FEED_DISABLE);
|
|
||||||
}
|
}
|
||||||
} else if (IS_G4X(dev)) {
|
} else if (IS_G4X(dev)) {
|
||||||
uint32_t dspclk_gate;
|
uint32_t dspclk_gate;
|
||||||
|
@ -7394,10 +7403,6 @@ void intel_modeset_init(struct drm_device *dev)
|
||||||
}
|
}
|
||||||
dev->mode_config.fb_base = dev->agp->base;
|
dev->mode_config.fb_base = dev->agp->base;
|
||||||
|
|
||||||
if (IS_MOBILE(dev) || !IS_GEN2(dev))
|
|
||||||
dev_priv->num_pipe = 2;
|
|
||||||
else
|
|
||||||
dev_priv->num_pipe = 1;
|
|
||||||
DRM_DEBUG_KMS("%d display pipe%s available.\n",
|
DRM_DEBUG_KMS("%d display pipe%s available.\n",
|
||||||
dev_priv->num_pipe, dev_priv->num_pipe > 1 ? "s" : "");
|
dev_priv->num_pipe, dev_priv->num_pipe > 1 ? "s" : "");
|
||||||
|
|
||||||
|
|
|
@ -685,6 +685,7 @@ intel_dp_set_m_n(struct drm_crtc *crtc, struct drm_display_mode *mode,
|
||||||
struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
|
struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
|
||||||
int lane_count = 4, bpp = 24;
|
int lane_count = 4, bpp = 24;
|
||||||
struct intel_dp_m_n m_n;
|
struct intel_dp_m_n m_n;
|
||||||
|
int pipe = intel_crtc->pipe;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Find the lane count in the intel_encoder private
|
* Find the lane count in the intel_encoder private
|
||||||
|
@ -715,39 +716,19 @@ intel_dp_set_m_n(struct drm_crtc *crtc, struct drm_display_mode *mode,
|
||||||
mode->clock, adjusted_mode->clock, &m_n);
|
mode->clock, adjusted_mode->clock, &m_n);
|
||||||
|
|
||||||
if (HAS_PCH_SPLIT(dev)) {
|
if (HAS_PCH_SPLIT(dev)) {
|
||||||
if (intel_crtc->pipe == 0) {
|
I915_WRITE(TRANSDATA_M1(pipe),
|
||||||
I915_WRITE(TRANSA_DATA_M1,
|
((m_n.tu - 1) << PIPE_GMCH_DATA_M_TU_SIZE_SHIFT) |
|
||||||
((m_n.tu - 1) << PIPE_GMCH_DATA_M_TU_SIZE_SHIFT) |
|
m_n.gmch_m);
|
||||||
m_n.gmch_m);
|
I915_WRITE(TRANSDATA_N1(pipe), m_n.gmch_n);
|
||||||
I915_WRITE(TRANSA_DATA_N1, m_n.gmch_n);
|
I915_WRITE(TRANSDPLINK_M1(pipe), m_n.link_m);
|
||||||
I915_WRITE(TRANSA_DP_LINK_M1, m_n.link_m);
|
I915_WRITE(TRANSDPLINK_N1(pipe), m_n.link_n);
|
||||||
I915_WRITE(TRANSA_DP_LINK_N1, m_n.link_n);
|
|
||||||
} else {
|
|
||||||
I915_WRITE(TRANSB_DATA_M1,
|
|
||||||
((m_n.tu - 1) << PIPE_GMCH_DATA_M_TU_SIZE_SHIFT) |
|
|
||||||
m_n.gmch_m);
|
|
||||||
I915_WRITE(TRANSB_DATA_N1, m_n.gmch_n);
|
|
||||||
I915_WRITE(TRANSB_DP_LINK_M1, m_n.link_m);
|
|
||||||
I915_WRITE(TRANSB_DP_LINK_N1, m_n.link_n);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
if (intel_crtc->pipe == 0) {
|
I915_WRITE(PIPE_GMCH_DATA_M(pipe),
|
||||||
I915_WRITE(PIPEA_GMCH_DATA_M,
|
((m_n.tu - 1) << PIPE_GMCH_DATA_M_TU_SIZE_SHIFT) |
|
||||||
((m_n.tu - 1) << PIPE_GMCH_DATA_M_TU_SIZE_SHIFT) |
|
m_n.gmch_m);
|
||||||
m_n.gmch_m);
|
I915_WRITE(PIPE_GMCH_DATA_N(pipe), m_n.gmch_n);
|
||||||
I915_WRITE(PIPEA_GMCH_DATA_N,
|
I915_WRITE(PIPE_DP_LINK_M(pipe), m_n.link_m);
|
||||||
m_n.gmch_n);
|
I915_WRITE(PIPE_DP_LINK_N(pipe), m_n.link_n);
|
||||||
I915_WRITE(PIPEA_DP_LINK_M, m_n.link_m);
|
|
||||||
I915_WRITE(PIPEA_DP_LINK_N, m_n.link_n);
|
|
||||||
} else {
|
|
||||||
I915_WRITE(PIPEB_GMCH_DATA_M,
|
|
||||||
((m_n.tu - 1) << PIPE_GMCH_DATA_M_TU_SIZE_SHIFT) |
|
|
||||||
m_n.gmch_m);
|
|
||||||
I915_WRITE(PIPEB_GMCH_DATA_N,
|
|
||||||
m_n.gmch_n);
|
|
||||||
I915_WRITE(PIPEB_DP_LINK_M, m_n.link_m);
|
|
||||||
I915_WRITE(PIPEB_DP_LINK_N, m_n.link_n);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -178,7 +178,7 @@ static void intel_dvo_mode_set(struct drm_encoder *encoder,
|
||||||
int pipe = intel_crtc->pipe;
|
int pipe = intel_crtc->pipe;
|
||||||
u32 dvo_val;
|
u32 dvo_val;
|
||||||
u32 dvo_reg = intel_dvo->dev.dvo_reg, dvo_srcdim_reg;
|
u32 dvo_reg = intel_dvo->dev.dvo_reg, dvo_srcdim_reg;
|
||||||
int dpll_reg = (pipe == 0) ? DPLL_A : DPLL_B;
|
int dpll_reg = DPLL(pipe);
|
||||||
|
|
||||||
switch (dvo_reg) {
|
switch (dvo_reg) {
|
||||||
case DVOA:
|
case DVOA:
|
||||||
|
|
|
@ -231,6 +231,7 @@ static bool intel_lvds_mode_fixup(struct drm_encoder *encoder,
|
||||||
struct intel_lvds *intel_lvds = to_intel_lvds(encoder);
|
struct intel_lvds *intel_lvds = to_intel_lvds(encoder);
|
||||||
struct drm_encoder *tmp_encoder;
|
struct drm_encoder *tmp_encoder;
|
||||||
u32 pfit_control = 0, pfit_pgm_ratios = 0, border = 0;
|
u32 pfit_control = 0, pfit_pgm_ratios = 0, border = 0;
|
||||||
|
int pipe;
|
||||||
|
|
||||||
/* Should never happen!! */
|
/* Should never happen!! */
|
||||||
if (INTEL_INFO(dev)->gen < 4 && intel_crtc->pipe == 0) {
|
if (INTEL_INFO(dev)->gen < 4 && intel_crtc->pipe == 0) {
|
||||||
|
@ -283,8 +284,8 @@ static bool intel_lvds_mode_fixup(struct drm_encoder *encoder,
|
||||||
* to register description and PRM.
|
* to register description and PRM.
|
||||||
* Change the value here to see the borders for debugging
|
* Change the value here to see the borders for debugging
|
||||||
*/
|
*/
|
||||||
I915_WRITE(BCLRPAT_A, 0);
|
for_each_pipe(pipe)
|
||||||
I915_WRITE(BCLRPAT_B, 0);
|
I915_WRITE(BCLRPAT(pipe), 0);
|
||||||
|
|
||||||
switch (intel_lvds->fitting_mode) {
|
switch (intel_lvds->fitting_mode) {
|
||||||
case DRM_MODE_SCALE_CENTER:
|
case DRM_MODE_SCALE_CENTER:
|
||||||
|
|
|
@ -255,7 +255,7 @@ i830_activate_pipe_a(struct drm_device *dev)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* most i8xx have pipe a forced on, so don't trust dpms mode */
|
/* most i8xx have pipe a forced on, so don't trust dpms mode */
|
||||||
if (I915_READ(PIPEACONF) & PIPECONF_ENABLE)
|
if (I915_READ(_PIPEACONF) & PIPECONF_ENABLE)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
crtc_funcs = crtc->base.helper_private;
|
crtc_funcs = crtc->base.helper_private;
|
||||||
|
|
|
@ -1006,6 +1006,7 @@ intel_tv_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode,
|
||||||
const struct video_levels *video_levels;
|
const struct video_levels *video_levels;
|
||||||
const struct color_conversion *color_conversion;
|
const struct color_conversion *color_conversion;
|
||||||
bool burst_ena;
|
bool burst_ena;
|
||||||
|
int pipe = intel_crtc->pipe;
|
||||||
|
|
||||||
if (!tv_mode)
|
if (!tv_mode)
|
||||||
return; /* can't happen (mode_prepare prevents this) */
|
return; /* can't happen (mode_prepare prevents this) */
|
||||||
|
@ -1149,14 +1150,11 @@ intel_tv_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode,
|
||||||
((video_levels->black << TV_BLACK_LEVEL_SHIFT) |
|
((video_levels->black << TV_BLACK_LEVEL_SHIFT) |
|
||||||
(video_levels->blank << TV_BLANK_LEVEL_SHIFT)));
|
(video_levels->blank << TV_BLANK_LEVEL_SHIFT)));
|
||||||
{
|
{
|
||||||
int pipeconf_reg = (intel_crtc->pipe == 0) ?
|
int pipeconf_reg = PIPECONF(pipe);
|
||||||
PIPEACONF : PIPEBCONF;
|
int dspcntr_reg = DSPCNTR(pipe);
|
||||||
int dspcntr_reg = (intel_crtc->plane == 0) ?
|
|
||||||
DSPACNTR : DSPBCNTR;
|
|
||||||
int pipeconf = I915_READ(pipeconf_reg);
|
int pipeconf = I915_READ(pipeconf_reg);
|
||||||
int dspcntr = I915_READ(dspcntr_reg);
|
int dspcntr = I915_READ(dspcntr_reg);
|
||||||
int dspbase_reg = (intel_crtc->plane == 0) ?
|
int dspbase_reg = DSPADDR(pipe);
|
||||||
DSPAADDR : DSPBADDR;
|
|
||||||
int xpos = 0x0, ypos = 0x0;
|
int xpos = 0x0, ypos = 0x0;
|
||||||
unsigned int xsize, ysize;
|
unsigned int xsize, ysize;
|
||||||
/* Pipe must be off here */
|
/* Pipe must be off here */
|
||||||
|
|
Загрузка…
Ссылка в новой задаче