Skip to content

Commit ca5a1b9

Browse files
committed
Merge tag 'drm-intel-next-2014-06-20' of git://anongit.freedesktop.org/drm-intel into drm-next
- Accurate frontbuffer tracking and frontbuffer rendering invalidate, flush and flip events. This is prep work for proper PSR support and should also be useful for DRRS&fbc. - Runtime suspend hardware on system suspend to support the new SOix sleep states, from Jesse. - PSR updates for broadwell (Rodrigo) - Universal plane support for cursors (Matt Roper), including core drm patches. - Prefault gtt mappings (Chris) - baytrail write-enable pte bit support (Akash Goel) - mmio based flips (Sourab Gupta) instead of blitter ring flips - interrupt handling race fixes (Oscar Mateo) And old, not yet merged features from the previous round: - rps/turbo support for chv (Deepak) - some other straggling chv patches (Ville) - proper universal plane conversion for the primary plane (Matt Roper) - ppgtt on vlv from Jesse - pile of cleanups, little fixes for insane corner cases and improved debug support all over * tag 'drm-intel-next-2014-06-20' of git://anongit.freedesktop.org/drm-intel: (99 commits) drm/i915: Update DRIVER_DATE to 20140620 drivers/i915: Fix unnoticed failure of init_ring_common() drm/i915: Track frontbuffer invalidation/flushing drm/i915: Use new frontbuffer bits to increase pll clock drm/i915: don't take runtime PM reference around freeze/thaw drm/i915: use runtime irq suspend/resume in freeze/thaw drm/i915: Properly track domain of the fbcon fb drm/i915: Print obj->frontbuffer_bits in debugfs output drm/i915: Introduce accurate frontbuffer tracking drm/i915: Drop schedule_back from psr_exit drm/i915: Ditch intel_edp_psr_update drm/i915: Drop unecessary complexity from psr_inactivate drm/i915: Remove ctx->last_ring drm/i915/chv: Ack interrupts before handling them (CHV) drm/i915/bdw: Ack interrupts before handling them (GEN8) drm/i915/vlv: Ack interrupts before handling them (VLV) drm/i915: Ack interrupts before handling them (GEN5 - GEN7) drm/i915: Don't BUG_ON in i915_gem_obj_offset drm/i915: Grab dev->struct_mutex in i915_gem_pageflip_info drm/i915: Add some L3 registers to the parser whitelist ... Conflicts: drivers/gpu/drm/i915/i915_drv.c
2 parents c7dbc6c + 3488229 commit ca5a1b9

35 files changed

+2575
-920
lines changed

drivers/gpu/drm/drm_crtc.c

Lines changed: 255 additions & 102 deletions
Large diffs are not rendered by default.

drivers/gpu/drm/i915/i915_cmd_parser.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -426,6 +426,9 @@ static const u32 gen7_render_regs[] = {
426426
GEN7_SO_WRITE_OFFSET(1),
427427
GEN7_SO_WRITE_OFFSET(2),
428428
GEN7_SO_WRITE_OFFSET(3),
429+
GEN7_L3SQCREG1,
430+
GEN7_L3CNTLREG2,
431+
GEN7_L3CNTLREG3,
429432
};
430433

431434
static const u32 gen7_blt_regs[] = {

drivers/gpu/drm/i915/i915_debugfs.c

Lines changed: 34 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,8 @@ describe_obj(struct seq_file *m, struct drm_i915_gem_object *obj)
170170
}
171171
if (obj->ring != NULL)
172172
seq_printf(m, " (%s)", obj->ring->name);
173+
if (obj->frontbuffer_bits)
174+
seq_printf(m, " (frontbuffer: 0x%03x)", obj->frontbuffer_bits);
173175
}
174176

175177
static void describe_ctx(struct seq_file *m, struct intel_context *ctx)
@@ -515,6 +517,11 @@ static int i915_gem_pageflip_info(struct seq_file *m, void *data)
515517
struct drm_device *dev = node->minor->dev;
516518
unsigned long flags;
517519
struct intel_crtc *crtc;
520+
int ret;
521+
522+
ret = mutex_lock_interruptible(&dev->struct_mutex);
523+
if (ret)
524+
return ret;
518525

519526
for_each_intel_crtc(dev, crtc) {
520527
const char pipe = pipe_name(crtc->pipe);
@@ -556,6 +563,8 @@ static int i915_gem_pageflip_info(struct seq_file *m, void *data)
556563
spin_unlock_irqrestore(&dev->event_lock, flags);
557564
}
558565

566+
mutex_unlock(&dev->struct_mutex);
567+
559568
return 0;
560569
}
561570

@@ -1029,7 +1038,8 @@ static int i915_frequency_info(struct seq_file *m, void *unused)
10291038
MEMSTAT_VID_SHIFT);
10301039
seq_printf(m, "Current P-state: %d\n",
10311040
(rgvstat & MEMSTAT_PSTATE_MASK) >> MEMSTAT_PSTATE_SHIFT);
1032-
} else if ((IS_GEN6(dev) || IS_GEN7(dev)) && !IS_VALLEYVIEW(dev)) {
1041+
} else if (IS_GEN6(dev) || (IS_GEN7(dev) && !IS_VALLEYVIEW(dev)) ||
1042+
IS_BROADWELL(dev)) {
10331043
u32 gt_perf_status = I915_READ(GEN6_GT_PERF_STATUS);
10341044
u32 rp_state_limits = I915_READ(GEN6_RP_STATE_LIMITS);
10351045
u32 rp_state_cap = I915_READ(GEN6_RP_STATE_CAP);
@@ -1048,7 +1058,7 @@ static int i915_frequency_info(struct seq_file *m, void *unused)
10481058

10491059
reqf = I915_READ(GEN6_RPNSWREQ);
10501060
reqf &= ~GEN6_TURBO_DISABLE;
1051-
if (IS_HASWELL(dev))
1061+
if (IS_HASWELL(dev) || IS_BROADWELL(dev))
10521062
reqf >>= 24;
10531063
else
10541064
reqf >>= 25;
@@ -1065,7 +1075,7 @@ static int i915_frequency_info(struct seq_file *m, void *unused)
10651075
rpdownei = I915_READ(GEN6_RP_CUR_DOWN_EI);
10661076
rpcurdown = I915_READ(GEN6_RP_CUR_DOWN);
10671077
rpprevdown = I915_READ(GEN6_RP_PREV_DOWN);
1068-
if (IS_HASWELL(dev))
1078+
if (IS_HASWELL(dev) || IS_BROADWELL(dev))
10691079
cagf = (rpstat & HSW_CAGF_MASK) >> HSW_CAGF_SHIFT;
10701080
else
10711081
cagf = (rpstat & GEN6_CAGF_MASK) >> GEN6_CAGF_SHIFT;
@@ -1677,9 +1687,6 @@ static int i915_gem_framebuffer_info(struct seq_file *m, void *data)
16771687

16781688
#ifdef CONFIG_DRM_I915_FBDEV
16791689
struct drm_i915_private *dev_priv = dev->dev_private;
1680-
int ret = mutex_lock_interruptible(&dev->mode_config.mutex);
1681-
if (ret)
1682-
return ret;
16831690

16841691
ifbdev = dev_priv->fbdev;
16851692
fb = to_intel_framebuffer(ifbdev->helper.fb);
@@ -1692,7 +1699,6 @@ static int i915_gem_framebuffer_info(struct seq_file *m, void *data)
16921699
atomic_read(&fb->base.refcount.refcount));
16931700
describe_obj(m, fb->obj);
16941701
seq_putc(m, '\n');
1695-
mutex_unlock(&dev->mode_config.mutex);
16961702
#endif
16971703

16981704
mutex_lock(&dev->mode_config.fb_lock);
@@ -1723,7 +1729,7 @@ static int i915_context_status(struct seq_file *m, void *unused)
17231729
struct intel_context *ctx;
17241730
int ret, i;
17251731

1726-
ret = mutex_lock_interruptible(&dev->mode_config.mutex);
1732+
ret = mutex_lock_interruptible(&dev->struct_mutex);
17271733
if (ret)
17281734
return ret;
17291735

@@ -1753,7 +1759,7 @@ static int i915_context_status(struct seq_file *m, void *unused)
17531759
seq_putc(m, '\n');
17541760
}
17551761

1756-
mutex_unlock(&dev->mode_config.mutex);
1762+
mutex_unlock(&dev->struct_mutex);
17571763

17581764
return 0;
17591765
}
@@ -1978,10 +1984,12 @@ static int i915_edp_psr_status(struct seq_file *m, void *data)
19781984

19791985
seq_printf(m, "Sink_Support: %s\n", yesno(dev_priv->psr.sink_support));
19801986
seq_printf(m, "Source_OK: %s\n", yesno(dev_priv->psr.source_ok));
1987+
seq_printf(m, "Enabled: %s\n", yesno(dev_priv->psr.enabled));
1988+
seq_printf(m, "Active: %s\n", yesno(dev_priv->psr.active));
19811989

19821990
enabled = HAS_PSR(dev) &&
19831991
I915_READ(EDP_PSR_CTL(dev)) & EDP_PSR_ENABLE;
1984-
seq_printf(m, "Enabled: %s\n", yesno(enabled));
1992+
seq_printf(m, "HW Enabled & Active bit: %s\n", yesno(enabled));
19851993

19861994
if (HAS_PSR(dev))
19871995
psrperf = I915_READ(EDP_PSR_PERF_CNT(dev)) &
@@ -2223,9 +2231,12 @@ static void intel_crtc_info(struct seq_file *m, struct intel_crtc *intel_crtc)
22232231
struct drm_crtc *crtc = &intel_crtc->base;
22242232
struct intel_encoder *intel_encoder;
22252233

2226-
seq_printf(m, "\tfb: %d, pos: %dx%d, size: %dx%d\n",
2227-
crtc->primary->fb->base.id, crtc->x, crtc->y,
2228-
crtc->primary->fb->width, crtc->primary->fb->height);
2234+
if (crtc->primary->fb)
2235+
seq_printf(m, "\tfb: %d, pos: %dx%d, size: %dx%d\n",
2236+
crtc->primary->fb->base.id, crtc->x, crtc->y,
2237+
crtc->primary->fb->width, crtc->primary->fb->height);
2238+
else
2239+
seq_puts(m, "\tprimary plane disabled\n");
22292240
for_each_encoder_on_crtc(dev, crtc, intel_encoder)
22302241
intel_encoder_info(m, intel_crtc, intel_encoder);
22312242
}
@@ -2929,11 +2940,16 @@ static int pipe_crc_set_source(struct drm_device *dev, enum pipe pipe,
29292940
/* real source -> none transition */
29302941
if (source == INTEL_PIPE_CRC_SOURCE_NONE) {
29312942
struct intel_pipe_crc_entry *entries;
2943+
struct intel_crtc *crtc =
2944+
to_intel_crtc(dev_priv->pipe_to_crtc_mapping[pipe]);
29322945

29332946
DRM_DEBUG_DRIVER("stopping CRCs for pipe %c\n",
29342947
pipe_name(pipe));
29352948

2936-
intel_wait_for_vblank(dev, pipe);
2949+
drm_modeset_lock(&crtc->base.mutex, NULL);
2950+
if (crtc->active)
2951+
intel_wait_for_vblank(dev, pipe);
2952+
drm_modeset_unlock(&crtc->base.mutex);
29372953

29382954
spin_lock_irq(&pipe_crc->lock);
29392955
entries = pipe_crc->entries;
@@ -3506,7 +3522,7 @@ i915_max_freq_get(void *data, u64 *val)
35063522
struct drm_i915_private *dev_priv = dev->dev_private;
35073523
int ret;
35083524

3509-
if (!(IS_GEN6(dev) || IS_GEN7(dev)))
3525+
if (INTEL_INFO(dev)->gen < 6)
35103526
return -ENODEV;
35113527

35123528
flush_delayed_work(&dev_priv->rps.delayed_resume_work);
@@ -3532,7 +3548,7 @@ i915_max_freq_set(void *data, u64 val)
35323548
u32 rp_state_cap, hw_max, hw_min;
35333549
int ret;
35343550

3535-
if (!(IS_GEN6(dev) || IS_GEN7(dev)))
3551+
if (INTEL_INFO(dev)->gen < 6)
35363552
return -ENODEV;
35373553

35383554
flush_delayed_work(&dev_priv->rps.delayed_resume_work);
@@ -3587,7 +3603,7 @@ i915_min_freq_get(void *data, u64 *val)
35873603
struct drm_i915_private *dev_priv = dev->dev_private;
35883604
int ret;
35893605

3590-
if (!(IS_GEN6(dev) || IS_GEN7(dev)))
3606+
if (INTEL_INFO(dev)->gen < 6)
35913607
return -ENODEV;
35923608

35933609
flush_delayed_work(&dev_priv->rps.delayed_resume_work);
@@ -3613,7 +3629,7 @@ i915_min_freq_set(void *data, u64 val)
36133629
u32 rp_state_cap, hw_max, hw_min;
36143630
int ret;
36153631

3616-
if (!(IS_GEN6(dev) || IS_GEN7(dev)))
3632+
if (INTEL_INFO(dev)->gen < 6)
36173633
return -ENODEV;
36183634

36193635
flush_delayed_work(&dev_priv->rps.delayed_resume_work);

drivers/gpu/drm/i915/i915_dma.c

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ static void i915_free_hws(struct drm_device *dev)
138138
I915_WRITE(HWS_PGA, 0x1ffff000);
139139
}
140140

141-
void i915_kernel_lost_context(struct drm_device * dev)
141+
void i915_kernel_lost_context(struct drm_device *dev)
142142
{
143143
struct drm_i915_private *dev_priv = dev->dev_private;
144144
struct drm_i915_master_private *master_priv;
@@ -166,7 +166,7 @@ void i915_kernel_lost_context(struct drm_device * dev)
166166
master_priv->sarea_priv->perf_boxes |= I915_BOX_RING_EMPTY;
167167
}
168168

169-
static int i915_dma_cleanup(struct drm_device * dev)
169+
static int i915_dma_cleanup(struct drm_device *dev)
170170
{
171171
struct drm_i915_private *dev_priv = dev->dev_private;
172172
int i;
@@ -190,7 +190,7 @@ static int i915_dma_cleanup(struct drm_device * dev)
190190
return 0;
191191
}
192192

193-
static int i915_initialize(struct drm_device * dev, drm_i915_init_t * init)
193+
static int i915_initialize(struct drm_device *dev, drm_i915_init_t *init)
194194
{
195195
struct drm_i915_private *dev_priv = dev->dev_private;
196196
struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv;
@@ -235,7 +235,7 @@ static int i915_initialize(struct drm_device * dev, drm_i915_init_t * init)
235235
return 0;
236236
}
237237

238-
static int i915_dma_resume(struct drm_device * dev)
238+
static int i915_dma_resume(struct drm_device *dev)
239239
{
240240
struct drm_i915_private *dev_priv = dev->dev_private;
241241
struct intel_engine_cs *ring = LP_RING(dev_priv);
@@ -359,7 +359,7 @@ static int validate_cmd(int cmd)
359359
return 0;
360360
}
361361

362-
static int i915_emit_cmds(struct drm_device * dev, int *buffer, int dwords)
362+
static int i915_emit_cmds(struct drm_device *dev, int *buffer, int dwords)
363363
{
364364
struct drm_i915_private *dev_priv = dev->dev_private;
365365
int i, ret;
@@ -369,6 +369,7 @@ static int i915_emit_cmds(struct drm_device * dev, int *buffer, int dwords)
369369

370370
for (i = 0; i < dwords;) {
371371
int sz = validate_cmd(buffer[i]);
372+
372373
if (sz == 0 || i + sz > dwords)
373374
return -EINVAL;
374375
i += sz;
@@ -453,7 +454,7 @@ static void i915_emit_breadcrumb(struct drm_device *dev)
453454
}
454455
}
455456

456-
static int i915_dispatch_cmdbuffer(struct drm_device * dev,
457+
static int i915_dispatch_cmdbuffer(struct drm_device *dev,
457458
drm_i915_cmdbuffer_t *cmd,
458459
struct drm_clip_rect *cliprects,
459460
void *cmdbuf)
@@ -487,8 +488,8 @@ static int i915_dispatch_cmdbuffer(struct drm_device * dev,
487488
return 0;
488489
}
489490

490-
static int i915_dispatch_batchbuffer(struct drm_device * dev,
491-
drm_i915_batchbuffer_t * batch,
491+
static int i915_dispatch_batchbuffer(struct drm_device *dev,
492+
drm_i915_batchbuffer_t *batch,
492493
struct drm_clip_rect *cliprects)
493494
{
494495
struct drm_i915_private *dev_priv = dev->dev_private;
@@ -549,7 +550,7 @@ static int i915_dispatch_batchbuffer(struct drm_device * dev,
549550
return 0;
550551
}
551552

552-
static int i915_dispatch_flip(struct drm_device * dev)
553+
static int i915_dispatch_flip(struct drm_device *dev)
553554
{
554555
struct drm_i915_private *dev_priv = dev->dev_private;
555556
struct drm_i915_master_private *master_priv =
@@ -755,7 +756,7 @@ static int i915_cmdbuffer(struct drm_device *dev, void *data,
755756
return ret;
756757
}
757758

758-
static int i915_emit_irq(struct drm_device * dev)
759+
static int i915_emit_irq(struct drm_device *dev)
759760
{
760761
struct drm_i915_private *dev_priv = dev->dev_private;
761762
struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv;
@@ -781,7 +782,7 @@ static int i915_emit_irq(struct drm_device * dev)
781782
return dev_priv->dri1.counter;
782783
}
783784

784-
static int i915_wait_irq(struct drm_device * dev, int irq_nr)
785+
static int i915_wait_irq(struct drm_device *dev, int irq_nr)
785786
{
786787
struct drm_i915_private *dev_priv = dev->dev_private;
787788
struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv;
@@ -1266,6 +1267,7 @@ static void i915_switcheroo_set_state(struct pci_dev *pdev, enum vga_switcheroo_
12661267
{
12671268
struct drm_device *dev = pci_get_drvdata(pdev);
12681269
pm_message_t pmm = { .event = PM_EVENT_SUSPEND };
1270+
12691271
if (state == VGA_SWITCHEROO_ON) {
12701272
pr_info("switched on\n");
12711273
dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
@@ -1488,10 +1490,11 @@ static void i915_dump_device_info(struct drm_i915_private *dev_priv)
14881490
#define SEP_EMPTY
14891491
#define PRINT_FLAG(name) info->name ? #name "," : ""
14901492
#define SEP_COMMA ,
1491-
DRM_DEBUG_DRIVER("i915 device info: gen=%i, pciid=0x%04x flags="
1493+
DRM_DEBUG_DRIVER("i915 device info: gen=%i, pciid=0x%04x rev=0x%02x flags="
14921494
DEV_INFO_FOR_EACH_FLAG(PRINT_S, SEP_EMPTY),
14931495
info->gen,
14941496
dev_priv->dev->pdev->device,
1497+
dev_priv->dev->pdev->revision,
14951498
DEV_INFO_FOR_EACH_FLAG(PRINT_FLAG, SEP_COMMA));
14961499
#undef PRINT_S
14971500
#undef SEP_EMPTY
@@ -1602,6 +1605,7 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
16021605
spin_lock_init(&dev_priv->backlight_lock);
16031606
spin_lock_init(&dev_priv->uncore.lock);
16041607
spin_lock_init(&dev_priv->mm.object_stat_lock);
1608+
spin_lock_init(&dev_priv->mmio_flip_lock);
16051609
mutex_init(&dev_priv->dpio_lock);
16061610
mutex_init(&dev_priv->modeset_restore_lock);
16071611

@@ -1929,7 +1933,7 @@ int i915_driver_open(struct drm_device *dev, struct drm_file *file)
19291933
* and DMA structures, since the kernel won't be using them, and clea
19301934
* up any GEM state.
19311935
*/
1932-
void i915_driver_lastclose(struct drm_device * dev)
1936+
void i915_driver_lastclose(struct drm_device *dev)
19331937
{
19341938
struct drm_i915_private *dev_priv = dev->dev_private;
19351939

@@ -1950,7 +1954,7 @@ void i915_driver_lastclose(struct drm_device * dev)
19501954
i915_dma_cleanup(dev);
19511955
}
19521956

1953-
void i915_driver_preclose(struct drm_device * dev, struct drm_file *file_priv)
1957+
void i915_driver_preclose(struct drm_device *dev, struct drm_file *file_priv)
19541958
{
19551959
mutex_lock(&dev->struct_mutex);
19561960
i915_gem_context_close(dev, file_priv);
@@ -2027,7 +2031,7 @@ int i915_max_ioctl = ARRAY_SIZE(i915_ioctls);
20272031
* manage the gtt, we need to claim that all intel devices are agp. For
20282032
* otherwise the drm core refuses to initialize the agp support code.
20292033
*/
2030-
int i915_driver_device_is_agp(struct drm_device * dev)
2034+
int i915_driver_device_is_agp(struct drm_device *dev)
20312035
{
20322036
return 1;
20332037
}

0 commit comments

Comments
 (0)