Skip to content

Commit efa27f9

Browse files
committed
Merge tag 'drm-intel-next-2013-08-23' of git://people.freedesktop.org/~danvet/drm-intel into drm-next
Need to get my stuff out the door ;-) Highlights: - pc8+ support from Paulo - more vma patches from Ben. - Kconfig option to enable preliminary support by default (Josh Triplett) - Optimized cpu cache flush handling and support for write-through caching of display planes on Iris (Chris) - rc6 tuning from Stéphane Marchesin for more stability - VECS seqno wrap/semaphores fix (Ben) - a pile of smaller cleanups and improvements all over Note that I've ditched Ben's execbuf vma conversion for 3.12 since not yet ready. But there's still other vma conversion stuff in here. * tag 'drm-intel-next-2013-08-23' of git://people.freedesktop.org/~danvet/drm-intel: (62 commits) drm/i915: Print seqnos as unsigned in debugfs drm/i915: Fix context size calculation on SNB/IVB/VLV drm/i915: Use POSTING_READ in lcpll code drm/i915: enable Package C8+ by default drm/i915: add i915.pc8_timeout function drm/i915: add i915_pc8_status debugfs file drm/i915: allow package C8+ states on Haswell (disabled) drm/i915: fix SDEIMR assertion when disabling LCPLL drm/i915: grab force_wake when restoring LCPLL drm/i915: drop WaMbcDriverBootEnable workaround drm/i915: Cleaning up the relocate entry function drm/i915: merge HSW and SNB PM irq handlers drm/i915: fix how we mask PMIMR when adding work to the queue drm/i915: don't queue PM events we won't process drm/i915: don't disable/reenable IVB error interrupts when not needed drm/i915: add dev_priv->pm_irq_mask drm/i915: don't update GEN6_PMIMR when it's not needed drm/i915: wrap GEN6_PMIMR changes drm/i915: wrap GTIMR changes drm/i915: add the FCLK case to intel_ddi_get_cdclk_freq ...
2 parents 62f2104 + fb1ae91 commit efa27f9

26 files changed

+1060
-385
lines changed

drivers/gpu/drm/Kconfig

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,17 @@ config DRM_I915_KMS
168168
the driver to bind to PCI devices, which precludes loading things
169169
like intelfb.
170170

171+
config DRM_I915_PRELIMINARY_HW_SUPPORT
172+
bool "Enable preliminary support for prerelease Intel hardware by default"
173+
depends on DRM_I915
174+
help
175+
Choose this option if you have prerelease Intel hardware and want the
176+
i915 driver to support it by default. You can enable such support at
177+
runtime with the module option i915.preliminary_hw_support=1; this
178+
option changes the default for that module option.
179+
180+
If in doubt, say "N".
181+
171182
config DRM_MGA
172183
tristate "Matrox g200/g400"
173184
depends on DRM && PCI

drivers/gpu/drm/drm_mm.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,9 @@ void drm_mm_remove_node(struct drm_mm_node *node)
254254
struct drm_mm *mm = node->mm;
255255
struct drm_mm_node *prev_node;
256256

257+
if (WARN_ON(!node->allocated))
258+
return;
259+
257260
BUG_ON(node->scanned_block || node->scanned_prev_free
258261
|| node->scanned_next_free);
259262

drivers/gpu/drm/i915/i915_debugfs.c

Lines changed: 58 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
#include <linux/slab.h>
3232
#include <linux/export.h>
3333
#include <linux/list_sort.h>
34+
#include <asm/msr-index.h>
3435
#include <drm/drmP.h>
3536
#include "intel_drv.h"
3637
#include "intel_ringbuffer.h"
@@ -99,7 +100,7 @@ static void
99100
describe_obj(struct seq_file *m, struct drm_i915_gem_object *obj)
100101
{
101102
struct i915_vma *vma;
102-
seq_printf(m, "%pK: %s%s%s %8zdKiB %02x %02x %d %d %d%s%s%s",
103+
seq_printf(m, "%pK: %s%s%s %8zdKiB %02x %02x %u %u %u%s%s%s",
103104
&obj->base,
104105
get_pin_flag(obj),
105106
get_tiling_flag(obj),
@@ -117,6 +118,8 @@ describe_obj(struct seq_file *m, struct drm_i915_gem_object *obj)
117118
seq_printf(m, " (name: %d)", obj->base.name);
118119
if (obj->pin_count)
119120
seq_printf(m, " (pinned x %d)", obj->pin_count);
121+
if (obj->pin_display)
122+
seq_printf(m, " (display)");
120123
if (obj->fence_reg != I915_FENCE_REG_NONE)
121124
seq_printf(m, " (fence: %d)", obj->fence_reg);
122125
list_for_each_entry(vma, &obj->vma_list, vma_link) {
@@ -193,9 +196,9 @@ static int obj_rank_by_stolen(void *priv,
193196
struct list_head *A, struct list_head *B)
194197
{
195198
struct drm_i915_gem_object *a =
196-
container_of(A, struct drm_i915_gem_object, exec_list);
199+
container_of(A, struct drm_i915_gem_object, obj_exec_link);
197200
struct drm_i915_gem_object *b =
198-
container_of(B, struct drm_i915_gem_object, exec_list);
201+
container_of(B, struct drm_i915_gem_object, obj_exec_link);
199202

200203
return a->stolen->start - b->stolen->start;
201204
}
@@ -219,7 +222,7 @@ static int i915_gem_stolen_list_info(struct seq_file *m, void *data)
219222
if (obj->stolen == NULL)
220223
continue;
221224

222-
list_add(&obj->exec_list, &stolen);
225+
list_add(&obj->obj_exec_link, &stolen);
223226

224227
total_obj_size += obj->base.size;
225228
total_gtt_size += i915_gem_obj_ggtt_size(obj);
@@ -229,19 +232,19 @@ static int i915_gem_stolen_list_info(struct seq_file *m, void *data)
229232
if (obj->stolen == NULL)
230233
continue;
231234

232-
list_add(&obj->exec_list, &stolen);
235+
list_add(&obj->obj_exec_link, &stolen);
233236

234237
total_obj_size += obj->base.size;
235238
count++;
236239
}
237240
list_sort(NULL, &stolen, obj_rank_by_stolen);
238241
seq_puts(m, "Stolen:\n");
239242
while (!list_empty(&stolen)) {
240-
obj = list_first_entry(&stolen, typeof(*obj), exec_list);
243+
obj = list_first_entry(&stolen, typeof(*obj), obj_exec_link);
241244
seq_puts(m, " ");
242245
describe_obj(m, obj);
243246
seq_putc(m, '\n');
244-
list_del_init(&obj->exec_list);
247+
list_del_init(&obj->obj_exec_link);
245248
}
246249
mutex_unlock(&dev->struct_mutex);
247250

@@ -1767,6 +1770,52 @@ static int i915_edp_psr_status(struct seq_file *m, void *data)
17671770
return 0;
17681771
}
17691772

1773+
static int i915_energy_uJ(struct seq_file *m, void *data)
1774+
{
1775+
struct drm_info_node *node = m->private;
1776+
struct drm_device *dev = node->minor->dev;
1777+
struct drm_i915_private *dev_priv = dev->dev_private;
1778+
u64 power;
1779+
u32 units;
1780+
1781+
if (INTEL_INFO(dev)->gen < 6)
1782+
return -ENODEV;
1783+
1784+
rdmsrl(MSR_RAPL_POWER_UNIT, power);
1785+
power = (power & 0x1f00) >> 8;
1786+
units = 1000000 / (1 << power); /* convert to uJ */
1787+
power = I915_READ(MCH_SECP_NRG_STTS);
1788+
power *= units;
1789+
1790+
seq_printf(m, "%llu", (long long unsigned)power);
1791+
1792+
return 0;
1793+
}
1794+
1795+
static int i915_pc8_status(struct seq_file *m, void *unused)
1796+
{
1797+
struct drm_info_node *node = (struct drm_info_node *) m->private;
1798+
struct drm_device *dev = node->minor->dev;
1799+
struct drm_i915_private *dev_priv = dev->dev_private;
1800+
1801+
if (!IS_HASWELL(dev)) {
1802+
seq_puts(m, "not supported\n");
1803+
return 0;
1804+
}
1805+
1806+
mutex_lock(&dev_priv->pc8.lock);
1807+
seq_printf(m, "Requirements met: %s\n",
1808+
yesno(dev_priv->pc8.requirements_met));
1809+
seq_printf(m, "GPU idle: %s\n", yesno(dev_priv->pc8.gpu_idle));
1810+
seq_printf(m, "Disable count: %d\n", dev_priv->pc8.disable_count);
1811+
seq_printf(m, "IRQs disabled: %s\n",
1812+
yesno(dev_priv->pc8.irqs_disabled));
1813+
seq_printf(m, "Enabled: %s\n", yesno(dev_priv->pc8.enabled));
1814+
mutex_unlock(&dev_priv->pc8.lock);
1815+
1816+
return 0;
1817+
}
1818+
17701819
static int
17711820
i915_wedged_get(void *data, u64 *val)
17721821
{
@@ -2206,6 +2255,8 @@ static struct drm_info_list i915_debugfs_list[] = {
22062255
{"i915_dpio", i915_dpio_info, 0},
22072256
{"i915_llc", i915_llc, 0},
22082257
{"i915_edp_psr_status", i915_edp_psr_status, 0},
2258+
{"i915_energy_uJ", i915_energy_uJ, 0},
2259+
{"i915_pc8_status", i915_pc8_status, 0},
22092260
};
22102261
#define I915_DEBUGFS_ENTRIES ARRAY_SIZE(i915_debugfs_list)
22112262

drivers/gpu/drm/i915/i915_dma.c

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -976,6 +976,9 @@ static int i915_getparam(struct drm_device *dev, void *data,
976976
case I915_PARAM_HAS_LLC:
977977
value = HAS_LLC(dev);
978978
break;
979+
case I915_PARAM_HAS_WT:
980+
value = HAS_WT(dev);
981+
break;
979982
case I915_PARAM_HAS_ALIASING_PPGTT:
980983
value = dev_priv->mm.aliasing_ppgtt ? 1 : 0;
981984
break;
@@ -1483,8 +1486,24 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
14831486
mutex_init(&dev_priv->rps.hw_lock);
14841487
mutex_init(&dev_priv->modeset_restore_lock);
14851488

1489+
mutex_init(&dev_priv->pc8.lock);
1490+
dev_priv->pc8.requirements_met = false;
1491+
dev_priv->pc8.gpu_idle = false;
1492+
dev_priv->pc8.irqs_disabled = false;
1493+
dev_priv->pc8.enabled = false;
1494+
dev_priv->pc8.disable_count = 2; /* requirements_met + gpu_idle */
1495+
INIT_DELAYED_WORK(&dev_priv->pc8.enable_work, hsw_enable_pc8_work);
1496+
14861497
i915_dump_device_info(dev_priv);
14871498

1499+
/* Not all pre-production machines fall into this category, only the
1500+
* very first ones. Almost everything should work, except for maybe
1501+
* suspend/resume. And we don't implement workarounds that affect only
1502+
* pre-production machines. */
1503+
if (IS_HSW_EARLY_SDV(dev))
1504+
DRM_INFO("This is an early pre-production Haswell machine. "
1505+
"It may not be fully functional.\n");
1506+
14881507
if (i915_get_bridge_dev(dev)) {
14891508
ret = -EIO;
14901509
goto free_priv;
@@ -1677,8 +1696,13 @@ int i915_driver_unload(struct drm_device *dev)
16771696

16781697
intel_gpu_ips_teardown();
16791698

1680-
if (HAS_POWER_WELL(dev))
1699+
if (HAS_POWER_WELL(dev)) {
1700+
/* The i915.ko module is still not prepared to be loaded when
1701+
* the power well is not enabled, so just enable it in case
1702+
* we're going to unload/reload. */
1703+
intel_set_power_well(dev, true);
16811704
i915_remove_power_well(dev);
1705+
}
16821706

16831707
i915_teardown_sysfs(dev);
16841708

@@ -1724,6 +1748,8 @@ int i915_driver_unload(struct drm_device *dev)
17241748
cancel_work_sync(&dev_priv->gpu_error.work);
17251749
i915_destroy_error_state(dev);
17261750

1751+
cancel_delayed_work_sync(&dev_priv->pc8.enable_work);
1752+
17271753
if (dev->pdev->msi_enabled)
17281754
pci_disable_msi(dev->pdev);
17291755

drivers/gpu/drm/i915/i915_drv.c

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,10 +122,10 @@ int i915_enable_psr __read_mostly = 0;
122122
module_param_named(enable_psr, i915_enable_psr, int, 0600);
123123
MODULE_PARM_DESC(enable_psr, "Enable PSR (default: false)");
124124

125-
unsigned int i915_preliminary_hw_support __read_mostly = 0;
125+
unsigned int i915_preliminary_hw_support __read_mostly = IS_ENABLED(CONFIG_DRM_I915_PRELIMINARY_HW_SUPPORT);
126126
module_param_named(preliminary_hw_support, i915_preliminary_hw_support, int, 0600);
127127
MODULE_PARM_DESC(preliminary_hw_support,
128-
"Enable preliminary hardware support. (default: false)");
128+
"Enable preliminary hardware support.");
129129

130130
int i915_disable_power_well __read_mostly = 1;
131131
module_param_named(disable_power_well, i915_disable_power_well, int, 0600);
@@ -141,6 +141,14 @@ module_param_named(fastboot, i915_fastboot, bool, 0600);
141141
MODULE_PARM_DESC(fastboot, "Try to skip unnecessary mode sets at boot time "
142142
"(default: false)");
143143

144+
int i915_enable_pc8 __read_mostly = 1;
145+
module_param_named(enable_pc8, i915_enable_pc8, int, 0600);
146+
MODULE_PARM_DESC(enable_pc8, "Enable support for low power package C states (PC8+) (default: true)");
147+
148+
int i915_pc8_timeout __read_mostly = 5000;
149+
module_param_named(pc8_timeout, i915_pc8_timeout, int, 0600);
150+
MODULE_PARM_DESC(pc8_timeout, "Number of msecs of idleness required to enter PC8+ (default: 5000)");
151+
144152
bool i915_prefault_disable __read_mostly;
145153
module_param_named(prefault_disable, i915_prefault_disable, bool, 0600);
146154
MODULE_PARM_DESC(prefault_disable,
@@ -557,6 +565,9 @@ static int i915_drm_freeze(struct drm_device *dev)
557565
dev_priv->modeset_restore = MODESET_SUSPENDED;
558566
mutex_unlock(&dev_priv->modeset_restore_lock);
559567

568+
/* We do a lot of poking in a lot of registers, make sure they work
569+
* properly. */
570+
hsw_disable_package_c8(dev_priv);
560571
intel_set_power_well(dev, true);
561572

562573
drm_kms_helper_poll_disable(dev);
@@ -713,6 +724,10 @@ static int __i915_drm_thaw(struct drm_device *dev)
713724
schedule_work(&dev_priv->console_resume_work);
714725
}
715726

727+
/* Undo what we did at i915_drm_freeze so the refcount goes back to the
728+
* expected level. */
729+
hsw_enable_package_c8(dev_priv);
730+
716731
mutex_lock(&dev_priv->modeset_restore_lock);
717732
dev_priv->modeset_restore = MODESET_DONE;
718733
mutex_unlock(&dev_priv->modeset_restore_lock);

0 commit comments

Comments
 (0)