Skip to content

Commit 4ff63e4

Browse files
committed
Merge branch 'drm-fixes' of git://people.freedesktop.org/~airlied/linux
Pull drm fixes from Dave Airlie: "Intel: edid fixes, power consumption fix, s/r fix, haswell fix Radeon: BIOS loading fixes for UEFI and Thunderbolt machines, better MSAA validation, lockup timeout fixes, modesetting fixes One udl dpms fix, one vmwgfx fix, a couple of trivial core changes. There is an export added to ACPI as part of the radeon bios fixes. I've also included the fbcon flashing cursor vs deinit race fix, that seems the simplest place to start" Trivial conflict in drivers/video/console/fbcon.c due to me having already applied the fbcon flashing cursor vs deinit race fix, and Dave had added a comment in there too. * 'drm-fixes' of git://people.freedesktop.org/~airlied/linux: (22 commits) fbcon: fix race condition between console lock and cursor timer (v1.1) drm: Add missing static storage class specifiers in drm_proc.c file drm/udl: dpms off the crtc when disabled. drm: Remove two unused fields from struct drm_display_mode drm: stop vmgfx driver explosion drm/radeon/ss: use num_crtc rather than hardcoded 6 Revert "drm/radeon: fix bo creation retry path" drm/i915: use hsw rps tuning values everywhere on gen6+ drm/radeon: split ATRM support out from the ATPX handler (v3) drm/radeon: convert radeon vfct code to use acpi_get_table_with_size ACPI: export symbol acpi_get_table_with_size drm/radeon: implement ACPI VFCT vbios fetch (v3) drm/radeon/kms: extend the Fujitsu D3003-S2 board connector quirk to cover later silicon stepping drm/radeon: fix checking of MSAA renderbuffers on r600-r700 drm/radeon: allow CMASK and FMASK in the CS checker on r600-r700 drm/radeon: init lockup timeout on ring init drm/radeon: avoid turning off spread spectrum for used pll drm/i915: fall back to bit-banging if GMBUS fails in CRT EDID reads drm/i915: extract connector update from intel_ddc_get_modes() for reuse drm/i915: fix hsw uncached pte ...
2 parents 0923699 + d8636a2 commit 4ff63e4

28 files changed

+419
-181
lines changed

drivers/acpi/acpica/tbxface.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,7 @@ acpi_get_table_with_size(char *signature,
387387

388388
return (AE_NOT_FOUND);
389389
}
390+
ACPI_EXPORT_SYMBOL(acpi_get_table_with_size)
390391

391392
acpi_status
392393
acpi_get_table(char *signature,

drivers/char/agp/intel-agp.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
#define I830_PTE_SYSTEM_CACHED 0x00000006
6565
/* GT PTE cache control fields */
6666
#define GEN6_PTE_UNCACHED 0x00000002
67+
#define HSW_PTE_UNCACHED 0x00000000
6768
#define GEN6_PTE_LLC 0x00000004
6869
#define GEN6_PTE_LLC_MLC 0x00000006
6970
#define GEN6_PTE_GFDT 0x00000008

drivers/char/agp/intel-gtt.c

Lines changed: 69 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1156,6 +1156,30 @@ static bool gen6_check_flags(unsigned int flags)
11561156
return true;
11571157
}
11581158

1159+
static void haswell_write_entry(dma_addr_t addr, unsigned int entry,
1160+
unsigned int flags)
1161+
{
1162+
unsigned int type_mask = flags & ~AGP_USER_CACHED_MEMORY_GFDT;
1163+
unsigned int gfdt = flags & AGP_USER_CACHED_MEMORY_GFDT;
1164+
u32 pte_flags;
1165+
1166+
if (type_mask == AGP_USER_MEMORY)
1167+
pte_flags = HSW_PTE_UNCACHED | I810_PTE_VALID;
1168+
else if (type_mask == AGP_USER_CACHED_MEMORY_LLC_MLC) {
1169+
pte_flags = GEN6_PTE_LLC_MLC | I810_PTE_VALID;
1170+
if (gfdt)
1171+
pte_flags |= GEN6_PTE_GFDT;
1172+
} else { /* set 'normal'/'cached' to LLC by default */
1173+
pte_flags = GEN6_PTE_LLC | I810_PTE_VALID;
1174+
if (gfdt)
1175+
pte_flags |= GEN6_PTE_GFDT;
1176+
}
1177+
1178+
/* gen6 has bit11-4 for physical addr bit39-32 */
1179+
addr |= (addr >> 28) & 0xff0;
1180+
writel(addr | pte_flags, intel_private.gtt + entry);
1181+
}
1182+
11591183
static void gen6_write_entry(dma_addr_t addr, unsigned int entry,
11601184
unsigned int flags)
11611185
{
@@ -1382,6 +1406,15 @@ static const struct intel_gtt_driver sandybridge_gtt_driver = {
13821406
.check_flags = gen6_check_flags,
13831407
.chipset_flush = i9xx_chipset_flush,
13841408
};
1409+
static const struct intel_gtt_driver haswell_gtt_driver = {
1410+
.gen = 6,
1411+
.setup = i9xx_setup,
1412+
.cleanup = gen6_cleanup,
1413+
.write_entry = haswell_write_entry,
1414+
.dma_mask_size = 40,
1415+
.check_flags = gen6_check_flags,
1416+
.chipset_flush = i9xx_chipset_flush,
1417+
};
13851418
static const struct intel_gtt_driver valleyview_gtt_driver = {
13861419
.gen = 7,
13871420
.setup = i9xx_setup,
@@ -1499,77 +1532,77 @@ static const struct intel_gtt_driver_description {
14991532
{ PCI_DEVICE_ID_INTEL_VALLEYVIEW_IG,
15001533
"ValleyView", &valleyview_gtt_driver },
15011534
{ PCI_DEVICE_ID_INTEL_HASWELL_D_GT1_IG,
1502-
"Haswell", &sandybridge_gtt_driver },
1535+
"Haswell", &haswell_gtt_driver },
15031536
{ PCI_DEVICE_ID_INTEL_HASWELL_D_GT2_IG,
1504-
"Haswell", &sandybridge_gtt_driver },
1537+
"Haswell", &haswell_gtt_driver },
15051538
{ PCI_DEVICE_ID_INTEL_HASWELL_D_GT2_PLUS_IG,
1506-
"Haswell", &sandybridge_gtt_driver },
1539+
"Haswell", &haswell_gtt_driver },
15071540
{ PCI_DEVICE_ID_INTEL_HASWELL_M_GT1_IG,
1508-
"Haswell", &sandybridge_gtt_driver },
1541+
"Haswell", &haswell_gtt_driver },
15091542
{ PCI_DEVICE_ID_INTEL_HASWELL_M_GT2_IG,
1510-
"Haswell", &sandybridge_gtt_driver },
1543+
"Haswell", &haswell_gtt_driver },
15111544
{ PCI_DEVICE_ID_INTEL_HASWELL_M_GT2_PLUS_IG,
1512-
"Haswell", &sandybridge_gtt_driver },
1545+
"Haswell", &haswell_gtt_driver },
15131546
{ PCI_DEVICE_ID_INTEL_HASWELL_S_GT1_IG,
1514-
"Haswell", &sandybridge_gtt_driver },
1547+
"Haswell", &haswell_gtt_driver },
15151548
{ PCI_DEVICE_ID_INTEL_HASWELL_S_GT2_IG,
1516-
"Haswell", &sandybridge_gtt_driver },
1549+
"Haswell", &haswell_gtt_driver },
15171550
{ PCI_DEVICE_ID_INTEL_HASWELL_S_GT2_PLUS_IG,
1518-
"Haswell", &sandybridge_gtt_driver },
1551+
"Haswell", &haswell_gtt_driver },
15191552
{ PCI_DEVICE_ID_INTEL_HASWELL_SDV_D_GT1_IG,
1520-
"Haswell", &sandybridge_gtt_driver },
1553+
"Haswell", &haswell_gtt_driver },
15211554
{ PCI_DEVICE_ID_INTEL_HASWELL_SDV_D_GT2_IG,
1522-
"Haswell", &sandybridge_gtt_driver },
1555+
"Haswell", &haswell_gtt_driver },
15231556
{ PCI_DEVICE_ID_INTEL_HASWELL_SDV_D_GT2_PLUS_IG,
1524-
"Haswell", &sandybridge_gtt_driver },
1557+
"Haswell", &haswell_gtt_driver },
15251558
{ PCI_DEVICE_ID_INTEL_HASWELL_SDV_M_GT1_IG,
1526-
"Haswell", &sandybridge_gtt_driver },
1559+
"Haswell", &haswell_gtt_driver },
15271560
{ PCI_DEVICE_ID_INTEL_HASWELL_SDV_M_GT2_IG,
1528-
"Haswell", &sandybridge_gtt_driver },
1561+
"Haswell", &haswell_gtt_driver },
15291562
{ PCI_DEVICE_ID_INTEL_HASWELL_SDV_M_GT2_PLUS_IG,
1530-
"Haswell", &sandybridge_gtt_driver },
1563+
"Haswell", &haswell_gtt_driver },
15311564
{ PCI_DEVICE_ID_INTEL_HASWELL_SDV_S_GT1_IG,
1532-
"Haswell", &sandybridge_gtt_driver },
1565+
"Haswell", &haswell_gtt_driver },
15331566
{ PCI_DEVICE_ID_INTEL_HASWELL_SDV_S_GT2_IG,
1534-
"Haswell", &sandybridge_gtt_driver },
1567+
"Haswell", &haswell_gtt_driver },
15351568
{ PCI_DEVICE_ID_INTEL_HASWELL_SDV_S_GT2_PLUS_IG,
1536-
"Haswell", &sandybridge_gtt_driver },
1569+
"Haswell", &haswell_gtt_driver },
15371570
{ PCI_DEVICE_ID_INTEL_HASWELL_ULT_D_GT1_IG,
1538-
"Haswell", &sandybridge_gtt_driver },
1571+
"Haswell", &haswell_gtt_driver },
15391572
{ PCI_DEVICE_ID_INTEL_HASWELL_ULT_D_GT2_IG,
1540-
"Haswell", &sandybridge_gtt_driver },
1573+
"Haswell", &haswell_gtt_driver },
15411574
{ PCI_DEVICE_ID_INTEL_HASWELL_ULT_D_GT2_PLUS_IG,
1542-
"Haswell", &sandybridge_gtt_driver },
1575+
"Haswell", &haswell_gtt_driver },
15431576
{ PCI_DEVICE_ID_INTEL_HASWELL_ULT_M_GT1_IG,
1544-
"Haswell", &sandybridge_gtt_driver },
1577+
"Haswell", &haswell_gtt_driver },
15451578
{ PCI_DEVICE_ID_INTEL_HASWELL_ULT_M_GT2_IG,
1546-
"Haswell", &sandybridge_gtt_driver },
1579+
"Haswell", &haswell_gtt_driver },
15471580
{ PCI_DEVICE_ID_INTEL_HASWELL_ULT_M_GT2_PLUS_IG,
1548-
"Haswell", &sandybridge_gtt_driver },
1581+
"Haswell", &haswell_gtt_driver },
15491582
{ PCI_DEVICE_ID_INTEL_HASWELL_ULT_S_GT1_IG,
1550-
"Haswell", &sandybridge_gtt_driver },
1583+
"Haswell", &haswell_gtt_driver },
15511584
{ PCI_DEVICE_ID_INTEL_HASWELL_ULT_S_GT2_IG,
1552-
"Haswell", &sandybridge_gtt_driver },
1585+
"Haswell", &haswell_gtt_driver },
15531586
{ PCI_DEVICE_ID_INTEL_HASWELL_ULT_S_GT2_PLUS_IG,
1554-
"Haswell", &sandybridge_gtt_driver },
1587+
"Haswell", &haswell_gtt_driver },
15551588
{ PCI_DEVICE_ID_INTEL_HASWELL_CRW_D_GT1_IG,
1556-
"Haswell", &sandybridge_gtt_driver },
1589+
"Haswell", &haswell_gtt_driver },
15571590
{ PCI_DEVICE_ID_INTEL_HASWELL_CRW_D_GT2_IG,
1558-
"Haswell", &sandybridge_gtt_driver },
1591+
"Haswell", &haswell_gtt_driver },
15591592
{ PCI_DEVICE_ID_INTEL_HASWELL_CRW_D_GT2_PLUS_IG,
1560-
"Haswell", &sandybridge_gtt_driver },
1593+
"Haswell", &haswell_gtt_driver },
15611594
{ PCI_DEVICE_ID_INTEL_HASWELL_CRW_M_GT1_IG,
1562-
"Haswell", &sandybridge_gtt_driver },
1595+
"Haswell", &haswell_gtt_driver },
15631596
{ PCI_DEVICE_ID_INTEL_HASWELL_CRW_M_GT2_IG,
1564-
"Haswell", &sandybridge_gtt_driver },
1597+
"Haswell", &haswell_gtt_driver },
15651598
{ PCI_DEVICE_ID_INTEL_HASWELL_CRW_M_GT2_PLUS_IG,
1566-
"Haswell", &sandybridge_gtt_driver },
1599+
"Haswell", &haswell_gtt_driver },
15671600
{ PCI_DEVICE_ID_INTEL_HASWELL_CRW_S_GT1_IG,
1568-
"Haswell", &sandybridge_gtt_driver },
1601+
"Haswell", &haswell_gtt_driver },
15691602
{ PCI_DEVICE_ID_INTEL_HASWELL_CRW_S_GT2_IG,
1570-
"Haswell", &sandybridge_gtt_driver },
1603+
"Haswell", &haswell_gtt_driver },
15711604
{ PCI_DEVICE_ID_INTEL_HASWELL_CRW_S_GT2_PLUS_IG,
1572-
"Haswell", &sandybridge_gtt_driver },
1605+
"Haswell", &haswell_gtt_driver },
15731606
{ 0, NULL, NULL }
15741607
};
15751608

drivers/gpu/drm/drm_modes.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -706,9 +706,6 @@ void drm_mode_set_crtcinfo(struct drm_display_mode *p, int adjust_flags)
706706
p->crtc_vblank_end = max(p->crtc_vsync_end, p->crtc_vtotal);
707707
p->crtc_hblank_start = min(p->crtc_hsync_start, p->crtc_hdisplay);
708708
p->crtc_hblank_end = max(p->crtc_hsync_end, p->crtc_htotal);
709-
710-
p->crtc_hadjusted = false;
711-
p->crtc_vadjusted = false;
712709
}
713710
EXPORT_SYMBOL(drm_mode_set_crtcinfo);
714711

drivers/gpu/drm/drm_proc.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ static const struct file_operations drm_proc_fops = {
8989
* Create a given set of proc files represented by an array of
9090
* gdm_proc_lists in the given root directory.
9191
*/
92-
int drm_proc_create_files(struct drm_info_list *files, int count,
92+
static int drm_proc_create_files(struct drm_info_list *files, int count,
9393
struct proc_dir_entry *root, struct drm_minor *minor)
9494
{
9595
struct drm_device *dev = minor->dev;
@@ -172,7 +172,7 @@ int drm_proc_init(struct drm_minor *minor, int minor_id,
172172
return 0;
173173
}
174174

175-
int drm_proc_remove_files(struct drm_info_list *files, int count,
175+
static int drm_proc_remove_files(struct drm_info_list *files, int count,
176176
struct drm_minor *minor)
177177
{
178178
struct list_head *pos, *q;

drivers/gpu/drm/i915/i915_gem.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2365,17 +2365,17 @@ int i915_gpu_idle(struct drm_device *dev)
23652365

23662366
/* Flush everything onto the inactive list. */
23672367
for_each_ring(ring, dev_priv, i) {
2368+
ret = i915_switch_context(ring, NULL, DEFAULT_CONTEXT_ID);
2369+
if (ret)
2370+
return ret;
2371+
23682372
ret = i915_ring_idle(ring);
23692373
if (ret)
23702374
return ret;
23712375

23722376
/* Is the device fubar? */
23732377
if (WARN_ON(!list_empty(&ring->gpu_write_list)))
23742378
return -EBUSY;
2375-
2376-
ret = i915_switch_context(ring, NULL, DEFAULT_CONTEXT_ID);
2377-
if (ret)
2378-
return ret;
23792379
}
23802380

23812381
return 0;

drivers/gpu/drm/i915/i915_gem_gtt.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,10 @@ void i915_ppgtt_bind_object(struct i915_hw_ppgtt *ppgtt,
261261
pte_flags |= GEN6_PTE_CACHE_LLC;
262262
break;
263263
case I915_CACHE_NONE:
264-
pte_flags |= GEN6_PTE_UNCACHED;
264+
if (IS_HASWELL(dev))
265+
pte_flags |= HSW_PTE_UNCACHED;
266+
else
267+
pte_flags |= GEN6_PTE_UNCACHED;
265268
break;
266269
default:
267270
BUG();

drivers/gpu/drm/i915/i915_reg.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@
115115

116116
#define GEN6_PTE_VALID (1 << 0)
117117
#define GEN6_PTE_UNCACHED (1 << 1)
118+
#define HSW_PTE_UNCACHED (0)
118119
#define GEN6_PTE_CACHE_LLC (2 << 1)
119120
#define GEN6_PTE_CACHE_LLC_MLC (3 << 1)
120121
#define GEN6_PTE_CACHE_BITS (3 << 1)

drivers/gpu/drm/i915/intel_crt.c

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,36 @@ static bool intel_crt_detect_hotplug(struct drm_connector *connector)
326326
return ret;
327327
}
328328

329+
static struct edid *intel_crt_get_edid(struct drm_connector *connector,
330+
struct i2c_adapter *i2c)
331+
{
332+
struct edid *edid;
333+
334+
edid = drm_get_edid(connector, i2c);
335+
336+
if (!edid && !intel_gmbus_is_forced_bit(i2c)) {
337+
DRM_DEBUG_KMS("CRT GMBUS EDID read failed, retry using GPIO bit-banging\n");
338+
intel_gmbus_force_bit(i2c, true);
339+
edid = drm_get_edid(connector, i2c);
340+
intel_gmbus_force_bit(i2c, false);
341+
}
342+
343+
return edid;
344+
}
345+
346+
/* local version of intel_ddc_get_modes() to use intel_crt_get_edid() */
347+
static int intel_crt_ddc_get_modes(struct drm_connector *connector,
348+
struct i2c_adapter *adapter)
349+
{
350+
struct edid *edid;
351+
352+
edid = intel_crt_get_edid(connector, adapter);
353+
if (!edid)
354+
return 0;
355+
356+
return intel_connector_update_modes(connector, edid);
357+
}
358+
329359
static bool intel_crt_detect_ddc(struct drm_connector *connector)
330360
{
331361
struct intel_crt *crt = intel_attached_crt(connector);
@@ -336,7 +366,7 @@ static bool intel_crt_detect_ddc(struct drm_connector *connector)
336366
BUG_ON(crt->base.type != INTEL_OUTPUT_ANALOG);
337367

338368
i2c = intel_gmbus_get_adapter(dev_priv, dev_priv->crt_ddc_pin);
339-
edid = drm_get_edid(connector, i2c);
369+
edid = intel_crt_get_edid(connector, i2c);
340370

341371
if (edid) {
342372
bool is_digital = edid->input & DRM_EDID_INPUT_DIGITAL;
@@ -544,13 +574,13 @@ static int intel_crt_get_modes(struct drm_connector *connector)
544574
struct i2c_adapter *i2c;
545575

546576
i2c = intel_gmbus_get_adapter(dev_priv, dev_priv->crt_ddc_pin);
547-
ret = intel_ddc_get_modes(connector, i2c);
577+
ret = intel_crt_ddc_get_modes(connector, i2c);
548578
if (ret || !IS_G4X(dev))
549579
return ret;
550580

551581
/* Try to probe digital port for output in DVI-I -> VGA mode. */
552582
i2c = intel_gmbus_get_adapter(dev_priv, GMBUS_PORT_DPB);
553-
return intel_ddc_get_modes(connector, i2c);
583+
return intel_crt_ddc_get_modes(connector, i2c);
554584
}
555585

556586
static int intel_crt_set_property(struct drm_connector *connector,

drivers/gpu/drm/i915/intel_drv.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,8 @@ struct intel_fbc_work {
342342
int interval;
343343
};
344344

345+
int intel_connector_update_modes(struct drm_connector *connector,
346+
struct edid *edid);
345347
int intel_ddc_get_modes(struct drm_connector *c, struct i2c_adapter *adapter);
346348

347349
extern void intel_attach_force_audio_property(struct drm_connector *connector);

drivers/gpu/drm/i915/intel_modes.c

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,25 @@
3232
#include "intel_drv.h"
3333
#include "i915_drv.h"
3434

35+
/**
36+
* intel_connector_update_modes - update connector from edid
37+
* @connector: DRM connector device to use
38+
* @edid: previously read EDID information
39+
*/
40+
int intel_connector_update_modes(struct drm_connector *connector,
41+
struct edid *edid)
42+
{
43+
int ret;
44+
45+
drm_mode_connector_update_edid_property(connector, edid);
46+
ret = drm_add_edid_modes(connector, edid);
47+
drm_edid_to_eld(connector, edid);
48+
connector->display_info.raw_edid = NULL;
49+
kfree(edid);
50+
51+
return ret;
52+
}
53+
3554
/**
3655
* intel_ddc_get_modes - get modelist from monitor
3756
* @connector: DRM connector device to use
@@ -43,18 +62,12 @@ int intel_ddc_get_modes(struct drm_connector *connector,
4362
struct i2c_adapter *adapter)
4463
{
4564
struct edid *edid;
46-
int ret = 0;
4765

4866
edid = drm_get_edid(connector, adapter);
49-
if (edid) {
50-
drm_mode_connector_update_edid_property(connector, edid);
51-
ret = drm_add_edid_modes(connector, edid);
52-
drm_edid_to_eld(connector, edid);
53-
connector->display_info.raw_edid = NULL;
54-
kfree(edid);
55-
}
67+
if (!edid)
68+
return 0;
5669

57-
return ret;
70+
return intel_connector_update_modes(connector, edid);
5871
}
5972

6073
static const struct drm_prop_enum_list force_audio_names[] = {

drivers/gpu/drm/i915/intel_pm.c

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2441,17 +2441,10 @@ static void gen6_enable_rps(struct drm_device *dev)
24412441
dev_priv->max_delay << 24 |
24422442
dev_priv->min_delay << 16);
24432443

2444-
if (IS_HASWELL(dev)) {
2445-
I915_WRITE(GEN6_RP_UP_THRESHOLD, 59400);
2446-
I915_WRITE(GEN6_RP_DOWN_THRESHOLD, 245000);
2447-
I915_WRITE(GEN6_RP_UP_EI, 66000);
2448-
I915_WRITE(GEN6_RP_DOWN_EI, 350000);
2449-
} else {
2450-
I915_WRITE(GEN6_RP_UP_THRESHOLD, 10000);
2451-
I915_WRITE(GEN6_RP_DOWN_THRESHOLD, 1000000);
2452-
I915_WRITE(GEN6_RP_UP_EI, 100000);
2453-
I915_WRITE(GEN6_RP_DOWN_EI, 5000000);
2454-
}
2444+
I915_WRITE(GEN6_RP_UP_THRESHOLD, 59400);
2445+
I915_WRITE(GEN6_RP_DOWN_THRESHOLD, 245000);
2446+
I915_WRITE(GEN6_RP_UP_EI, 66000);
2447+
I915_WRITE(GEN6_RP_DOWN_EI, 350000);
24552448

24562449
I915_WRITE(GEN6_RP_IDLE_HYSTERSIS, 10);
24572450
I915_WRITE(GEN6_RP_CONTROL,

drivers/gpu/drm/i915/intel_sdvo.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1692,6 +1692,7 @@ static bool intel_sdvo_detect_hdmi_audio(struct drm_connector *connector)
16921692
edid = intel_sdvo_get_edid(connector);
16931693
if (edid != NULL && edid->input & DRM_EDID_INPUT_DIGITAL)
16941694
has_audio = drm_detect_monitor_audio(edid);
1695+
kfree(edid);
16951696

16961697
return has_audio;
16971698
}

0 commit comments

Comments
 (0)