Skip to content

Commit 0fcb70c

Browse files
committed
Merge tag 'drm-intel-fixes-2014-06-26' of git://anongit.freedesktop.org/drm-intel into drm-fixes
Fixes for 3.16-rc2; regressions, races, and warns; Broadwell PCI IDs. * tag 'drm-intel-fixes-2014-06-26' of git://anongit.freedesktop.org/drm-intel: drm/i915: vlv_prepare_pll is only needed in case of non DSI interfaces drm/i915: Hold the table lock whilst walking the file's idr and counting the objects in debugfs drm/i915: BDW: Adding Reserved PCI IDs. drm/i915: Only mark the ctx as initialised after a SET_CONTEXT operation drm/i915: default to having backlight if VBT not available drm/i915: cache hw power well enabled state
2 parents b5f4843 + 8525a23 commit 0fcb70c

File tree

8 files changed

+46
-38
lines changed

8 files changed

+46
-38
lines changed

drivers/gpu/drm/i915/i915_debugfs.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -446,7 +446,9 @@ static int i915_gem_object_info(struct seq_file *m, void* data)
446446

447447
memset(&stats, 0, sizeof(stats));
448448
stats.file_priv = file->driver_priv;
449+
spin_lock(&file->table_lock);
449450
idr_for_each(&file->object_idr, per_file_stats, &stats);
451+
spin_unlock(&file->table_lock);
450452
/*
451453
* Although we have a valid reference on file->pid, that does
452454
* not guarantee that the task_struct who called get_pid() is

drivers/gpu/drm/i915/i915_drv.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -977,6 +977,8 @@ struct i915_power_well {
977977
bool always_on;
978978
/* power well enable/disable usage count */
979979
int count;
980+
/* cached hw enabled state */
981+
bool hw_enabled;
980982
unsigned long domains;
981983
unsigned long data;
982984
const struct i915_power_well_ops *ops;

drivers/gpu/drm/i915/i915_gem_context.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -598,6 +598,7 @@ static int do_switch(struct intel_engine_cs *ring,
598598
struct intel_context *from = ring->last_context;
599599
struct i915_hw_ppgtt *ppgtt = ctx_to_ppgtt(to);
600600
u32 hw_flags = 0;
601+
bool uninitialized = false;
601602
int ret, i;
602603

603604
if (from != NULL && ring == &dev_priv->ring[RCS]) {
@@ -696,19 +697,20 @@ static int do_switch(struct intel_engine_cs *ring,
696697
i915_gem_context_unreference(from);
697698
}
698699

700+
uninitialized = !to->is_initialized && from == NULL;
701+
to->is_initialized = true;
702+
699703
done:
700704
i915_gem_context_reference(to);
701705
ring->last_context = to;
702706
to->last_ring = ring;
703707

704-
if (ring->id == RCS && !to->is_initialized && from == NULL) {
708+
if (uninitialized) {
705709
ret = i915_gem_render_state_init(ring);
706710
if (ret)
707711
DRM_ERROR("init render state: %d\n", ret);
708712
}
709713

710-
to->is_initialized = true;
711-
712714
return 0;
713715

714716
unpin_out:

drivers/gpu/drm/i915/intel_bios.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -315,9 +315,6 @@ parse_lfp_backlight(struct drm_i915_private *dev_priv, struct bdb_header *bdb)
315315
const struct bdb_lfp_backlight_data *backlight_data;
316316
const struct bdb_lfp_backlight_data_entry *entry;
317317

318-
/* Err to enabling backlight if no backlight block. */
319-
dev_priv->vbt.backlight.present = true;
320-
321318
backlight_data = find_section(bdb, BDB_LVDS_BACKLIGHT);
322319
if (!backlight_data)
323320
return;
@@ -1088,6 +1085,9 @@ init_vbt_defaults(struct drm_i915_private *dev_priv)
10881085

10891086
dev_priv->vbt.crt_ddc_pin = GMBUS_PORT_VGADDC;
10901087

1088+
/* Default to having backlight */
1089+
dev_priv->vbt.backlight.present = true;
1090+
10911091
/* LFP panel data */
10921092
dev_priv->vbt.lvds_dither = 1;
10931093
dev_priv->vbt.lvds_vbt = 0;

drivers/gpu/drm/i915/intel_display.c

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4564,7 +4564,10 @@ static void valleyview_crtc_enable(struct drm_crtc *crtc)
45644564
if (intel_crtc->active)
45654565
return;
45664566

4567-
vlv_prepare_pll(intel_crtc);
4567+
is_dsi = intel_pipe_has_type(crtc, INTEL_OUTPUT_DSI);
4568+
4569+
if (!is_dsi && !IS_CHERRYVIEW(dev))
4570+
vlv_prepare_pll(intel_crtc);
45684571

45694572
/* Set up the display plane register */
45704573
dspcntr = DISPPLANE_GAMMA_ENABLE;
@@ -4598,8 +4601,6 @@ static void valleyview_crtc_enable(struct drm_crtc *crtc)
45984601
if (encoder->pre_pll_enable)
45994602
encoder->pre_pll_enable(encoder);
46004603

4601-
is_dsi = intel_pipe_has_type(crtc, INTEL_OUTPUT_DSI);
4602-
46034604
if (!is_dsi) {
46044605
if (IS_CHERRYVIEW(dev))
46054606
chv_enable_pll(intel_crtc);
@@ -12411,8 +12412,8 @@ intel_display_capture_error_state(struct drm_device *dev)
1241112412

1241212413
for_each_pipe(i) {
1241312414
error->pipe[i].power_domain_on =
12414-
intel_display_power_enabled_sw(dev_priv,
12415-
POWER_DOMAIN_PIPE(i));
12415+
intel_display_power_enabled_unlocked(dev_priv,
12416+
POWER_DOMAIN_PIPE(i));
1241612417
if (!error->pipe[i].power_domain_on)
1241712418
continue;
1241812419

@@ -12447,7 +12448,7 @@ intel_display_capture_error_state(struct drm_device *dev)
1244712448
enum transcoder cpu_transcoder = transcoders[i];
1244812449

1244912450
error->transcoder[i].power_domain_on =
12450-
intel_display_power_enabled_sw(dev_priv,
12451+
intel_display_power_enabled_unlocked(dev_priv,
1245112452
POWER_DOMAIN_TRANSCODER(cpu_transcoder));
1245212453
if (!error->transcoder[i].power_domain_on)
1245312454
continue;

drivers/gpu/drm/i915/intel_drv.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -950,8 +950,8 @@ int intel_power_domains_init(struct drm_i915_private *);
950950
void intel_power_domains_remove(struct drm_i915_private *);
951951
bool intel_display_power_enabled(struct drm_i915_private *dev_priv,
952952
enum intel_display_power_domain domain);
953-
bool intel_display_power_enabled_sw(struct drm_i915_private *dev_priv,
954-
enum intel_display_power_domain domain);
953+
bool intel_display_power_enabled_unlocked(struct drm_i915_private *dev_priv,
954+
enum intel_display_power_domain domain);
955955
void intel_display_power_get(struct drm_i915_private *dev_priv,
956956
enum intel_display_power_domain domain);
957957
void intel_display_power_put(struct drm_i915_private *dev_priv,

drivers/gpu/drm/i915/intel_pm.c

Lines changed: 15 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5603,8 +5603,8 @@ static bool hsw_power_well_enabled(struct drm_i915_private *dev_priv,
56035603
(HSW_PWR_WELL_ENABLE_REQUEST | HSW_PWR_WELL_STATE_ENABLED);
56045604
}
56055605

5606-
bool intel_display_power_enabled_sw(struct drm_i915_private *dev_priv,
5607-
enum intel_display_power_domain domain)
5606+
bool intel_display_power_enabled_unlocked(struct drm_i915_private *dev_priv,
5607+
enum intel_display_power_domain domain)
56085608
{
56095609
struct i915_power_domains *power_domains;
56105610
struct i915_power_well *power_well;
@@ -5615,47 +5615,35 @@ bool intel_display_power_enabled_sw(struct drm_i915_private *dev_priv,
56155615
return false;
56165616

56175617
power_domains = &dev_priv->power_domains;
5618+
56185619
is_enabled = true;
5620+
56195621
for_each_power_well_rev(i, power_well, BIT(domain), power_domains) {
56205622
if (power_well->always_on)
56215623
continue;
56225624

5623-
if (!power_well->count) {
5625+
if (!power_well->hw_enabled) {
56245626
is_enabled = false;
56255627
break;
56265628
}
56275629
}
5630+
56285631
return is_enabled;
56295632
}
56305633

56315634
bool intel_display_power_enabled(struct drm_i915_private *dev_priv,
56325635
enum intel_display_power_domain domain)
56335636
{
56345637
struct i915_power_domains *power_domains;
5635-
struct i915_power_well *power_well;
5636-
bool is_enabled;
5637-
int i;
5638-
5639-
if (dev_priv->pm.suspended)
5640-
return false;
5638+
bool ret;
56415639

56425640
power_domains = &dev_priv->power_domains;
56435641

5644-
is_enabled = true;
5645-
56465642
mutex_lock(&power_domains->lock);
5647-
for_each_power_well_rev(i, power_well, BIT(domain), power_domains) {
5648-
if (power_well->always_on)
5649-
continue;
5650-
5651-
if (!power_well->ops->is_enabled(dev_priv, power_well)) {
5652-
is_enabled = false;
5653-
break;
5654-
}
5655-
}
5643+
ret = intel_display_power_enabled_unlocked(dev_priv, domain);
56565644
mutex_unlock(&power_domains->lock);
56575645

5658-
return is_enabled;
5646+
return ret;
56595647
}
56605648

56615649
/*
@@ -5976,6 +5964,7 @@ void intel_display_power_get(struct drm_i915_private *dev_priv,
59765964
if (!power_well->count++) {
59775965
DRM_DEBUG_KMS("enabling %s\n", power_well->name);
59785966
power_well->ops->enable(dev_priv, power_well);
5967+
power_well->hw_enabled = true;
59795968
}
59805969

59815970
check_power_well_state(dev_priv, power_well);
@@ -6005,6 +5994,7 @@ void intel_display_power_put(struct drm_i915_private *dev_priv,
60055994

60065995
if (!--power_well->count && i915.disable_power_well) {
60075996
DRM_DEBUG_KMS("disabling %s\n", power_well->name);
5997+
power_well->hw_enabled = false;
60085998
power_well->ops->disable(dev_priv, power_well);
60095999
}
60106000

@@ -6267,8 +6257,11 @@ static void intel_power_domains_resume(struct drm_i915_private *dev_priv)
62676257
int i;
62686258

62696259
mutex_lock(&power_domains->lock);
6270-
for_each_power_well(i, power_well, POWER_DOMAIN_MASK, power_domains)
6260+
for_each_power_well(i, power_well, POWER_DOMAIN_MASK, power_domains) {
62716261
power_well->ops->sync_hw(dev_priv, power_well);
6262+
power_well->hw_enabled = power_well->ops->is_enabled(dev_priv,
6263+
power_well);
6264+
}
62726265
mutex_unlock(&power_domains->lock);
62736266
}
62746267

include/drm/i915_pciids.h

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -237,13 +237,21 @@
237237
#define INTEL_BDW_GT3D_IDS(info) \
238238
_INTEL_BDW_D_IDS(3, info)
239239

240+
#define INTEL_BDW_RSVDM_IDS(info) \
241+
_INTEL_BDW_M_IDS(4, info)
242+
243+
#define INTEL_BDW_RSVDD_IDS(info) \
244+
_INTEL_BDW_D_IDS(4, info)
245+
240246
#define INTEL_BDW_M_IDS(info) \
241247
INTEL_BDW_GT12M_IDS(info), \
242-
INTEL_BDW_GT3M_IDS(info)
248+
INTEL_BDW_GT3M_IDS(info), \
249+
INTEL_BDW_RSVDM_IDS(info)
243250

244251
#define INTEL_BDW_D_IDS(info) \
245252
INTEL_BDW_GT12D_IDS(info), \
246-
INTEL_BDW_GT3D_IDS(info)
253+
INTEL_BDW_GT3D_IDS(info), \
254+
INTEL_BDW_RSVDD_IDS(info)
247255

248256
#define INTEL_CHV_IDS(info) \
249257
INTEL_VGA_DEVICE(0x22b0, info), \

0 commit comments

Comments
 (0)