On Mon, May 18, 2015 at 1:48 PM, Julian Margetson <runaway@xxxxxxxx> wrote: > On 5/18/2015 12:08 PM, Alex Deucher wrote: >> >> On Sun, May 17, 2015 at 7:20 PM, Julian Margetson <runaway@xxxxxxxx> >> wrote: >>> >>> Kernels 4.03 and 4.04 oops with HDMI connection on Acube Sam460ex amcc >>> 460ex powerpc board. >>> >>> 016a255b7835ee7e49a3eba3c14ba0bc0221a4f8 is the first bad commit >>> >>> commit 016a255b7835ee7e49a3eba3c14ba0bc0221a4f8 >>> Author: Alex Deucher <alexander.deucher@xxxxxxx> >>> Date: Tue Apr 7 09:52:42 2015 -0400 >>> >>> drm/radeon: only mark audio as connected if the monitor supports it >>> (v3) >>> >>> commit 0f55db36d49d45b80eff0c0a2a498766016f458b upstream. >>> >>> Otherwise the driver may try and send audio which may confuse the >>> monitor. >>> >>> v2: set pin to NULL if no audio >>> v3: avoid crash with analog encoders >>> >>> Signed-off-by: Alex Deucher <alexander.deucher@xxxxxxx> >>> Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> >>> >>> :040000 040000 de0366a6790f5c91d175bcb89cb34956bbe72b26 >>> bbdb5734961f824558152c7c34a840c78bc3a9a9 M drivers >>> >> The attached patch should fix it up. >> >> Alex >> >> >>> >>> [ 2.587570] Linux agpgart interface v0.103 >>> [ 2.591997] [drm] Initialized drm 1.1.0 20060810 >>> [ 2.596892] [drm] radeon kernel modesetting enabled. >>> [ 2.602989] [drm] initializing kernel modesetting (VERDE 0x1002:0x683F >>> 0x1545:0x7750). >>> [ 2.611161] [drm] register mmio base: 0xe90000000 >>> [ 2.615935] [drm] register mmio size: 262144 >>> [ 2.952043] ATOM BIOS: C44501 >>> [ 2.955323] radeon 0001:81:00.0: VRAM: 1024M 0x0000000000000000 - >>> 0x000000003FFFFFFF (1024M used) >>> [ 2.964253] radeon 0001:81:00.0: GTT: 1024M 0x0000000040000000 - >>> 0x000000007FFFFFFF >>> [ 2.971938] [drm] Detected VRAM RAM=1024M, BAR=256M >>> [ 2.976840] [drm] RAM width 128bits DDR >>> [ 2.980898] [TTM] Zone kernel: Available graphics memory: 379358 kiB >>> [ 2.987383] [TTM] Zone highmem: Available graphics memory: 1034718 kiB >>> [ 2.993934] [TTM] Initializing pool allocator >>> [ 2.998331] [TTM] Initializing DMA pool allocator >>> [ 3.003153] [drm] radeon: 1024M of VRAM memory ready >>> [ 3.008162] [drm] radeon: 1024M of GTT memory ready. >>> [ 3.013203] [drm] Loading verde Microcode >>> [ 3.017266] [drm] Internal thermal controller with fan control >>> [ 3.023437] [drm] probing gen 2 caps for device aaa1:bed1 = 18cc41/0 >>> [ 3.077284] [drm] radeon: dpm initialized >>> [ 3.081503] [drm] GART: num cpu pages 262144, num gpu pages 262144 >>> [ 3.093142] [drm] probing gen 2 caps for device aaa1:bed1 = 18cc41/0 >>> [ 3.125984] [drm] PCIE GART of 1024M enabled (table at >>> 0x0000000000277000). >>> [ 3.133327] radeon 0001:81:00.0: WB enabled >>> [ 3.137565] radeon 0001:81:00.0: fence driver on ring 0 use gpu addr >>> 0x0000000040000c00 and cpu addr 0xffc01c00 >>> [ 3.147697] radeon 0001:81:00.0: fence driver on ring 1 use gpu addr >>> 0x0000000040000c04 and cpu addr 0xffc01c04 >>> [ 3.157827] radeon 0001:81:00.0: fence driver on ring 2 use gpu addr >>> 0x0000000040000c08 and cpu addr 0xffc01c08 >>> [ 3.167957] radeon 0001:81:00.0: fence driver on ring 3 use gpu addr >>> 0x0000000040000c0c and cpu addr 0xffc01c0c >>> [ 3.178078] radeon 0001:81:00.0: fence driver on ring 4 use gpu addr >>> 0x0000000040000c10 and cpu addr 0xffc01c10 >>> [ 3.209673] radeon 0001:81:00.0: fence driver on ring 5 use gpu addr >>> 0x0000000000075a18 and cpu addr 0xf90b5a18 >>> [ 3.219822] [drm] Supports vblank timestamp caching Rev 2 >>> (21.10.2013). >>> [ 3.226457] [drm] Driver supports precise vblank timestamp query. >>> [ 3.232584] radeon 0001:81:00.0: radeon: MSI limited to 32-bit >>> [ 3.238466] ppc4xx_setup_msi_irqs: fail allocating msi interrupt >>> [ 3.244586] [drm] radeon: irq initialized. >>> [ 4.006339] [drm:r600_ring_test] *ERROR* radeon: ring 0 test failed >>> (scratch(0x850C)=0xCAFEDEAD) >>> [ 4.015198] radeon 0001:81:00.0: disabling GPU acceleration >>> [ 4.220071] [drm] Radeon Display Connectors >>> [ 4.224651] [drm] Connector 0: >>> [ 4.227787] [drm] HDMI-A-1 >>> [ 4.230754] [drm] HPD4 >>> [ 4.233328] [drm] DDC: 0x6570 0x6570 0x6574 0x6574 0x6578 0x6578 >>> 0x657c >>> 0x657c >>> [ 4.240806] [drm] Encoders: >>> [ 4.243815] [drm] DFP1: INTERNAL_UNIPHY2 >>> [ 4.248131] [drm] Connector 1: >>> [ 4.251227] [drm] DVI-I-1 >>> [ 4.254051] [drm] HPD2 >>> [ 4.256608] [drm] DDC: 0x6560 0x6560 0x6564 0x6564 0x6568 0x6568 >>> 0x656c >>> 0x656c >>> [ 4.264034] [drm] Encoders: >>> [ 4.267021] [drm] DFP2: INTERNAL_UNIPHY >>> [ 4.271223] [drm] CRT1: INTERNAL_KLDSCP_DAC1 >>> [ 4.390562] [drm] fb mappable at 0x80478000 >>> [ 4.394789] [drm] vram apper at 0x80000000 >>> [ 4.398905] [drm] size 8294400 >>> [ 4.401978] [drm] fb depth is 24 >>> [ 4.405225] [drm] pitch is 7680 >>> [ 4.700581] Console: switching to colour frame buffer device 240x67 >>> [ 4.779669] radeon 0001:81:00.0: fb0: radeondrmfb frame buffer device >>> [ 4.786489] radeon 0001:81:00.0: registered panic notifier >>> [ 4.796803] [drm] Initialized radeon 2.41.0 20080528 for 0001:81:00.0 >>> on >>> minor 0 >>> >>> [ 31.191562] Unable to handle kernel paging request for data at address >>> 0x00000008 >>> [ 31.258832] Faulting instruction address: 0xc04a51bc >>> [ 34.049506] Oops: Kernel access of bad area, sig: 11 [#1] >>> [ 34.055246] PREEMPT Canyonlands >>> [ 34.058586] Modules linked in: >>> [ 34.061830] CPU: 0 PID: 1998 Comm: Xorg Not tainted 4.0.3-Sam460ex #2 >>> [ 34.068633] task: edee4c60 ti: ede8a000 task.ti: ede8a000 >>> [ 34.074334] NIP: c04a51bc LR: c04a546c CTR: c03e5050 >>> [ 34.079578] REGS: ede8bc30 TRAP: 0300 Not tainted (4.0.3-Sam460ex) >>> [ 34.086381] MSR: 00029000 <CE,EE,ME> CR: 20004422 XER: 00000000 >>> [ 34.092944] DEAR: 00000008 ESR: 00000000 >>> GPR00: c04a5438 ede8bce0 edee4c60 eea84000 00000000 00000000 c0710000 >>> 00000000 >>> GPR08: 00000000 00000000 eeac0400 ede8bce0 20004444 b7a55afc b80efab0 >>> b80ee530 >>> GPR16: 00000000 ffffffff 6f23c730 ede8be18 c03add44 eeac0578 00000001 >>> 00004000 >>> GPR24: 00004000 c0719b98 fffffff2 00000001 eeb61200 eea84000 eea8df00 >>> 00000000 >>> [ 34.127485] NIP [c04a51bc] radeon_audio_enable+0x4/0x18 >>> [ 34.133000] LR [c04a546c] radeon_audio_detect+0xd4/0x104 >>> [ 34.138604] Call Trace: >>> [ 34.141185] [ede8bce0] [c04a5438] radeon_audio_detect+0xa0/0x104 >>> (unreliable) >>> [ 34.148771] [ede8bd00] [c03e6958] radeon_dvi_detect+0x390/0x3b4 >>> [ 34.155046] [ede8bd30] [c0391cec] >>> drm_helper_probe_single_connector_modes_merge_bits+0xf4/0x448 >>> [ 34.164253] [ede8bd70] [c03ade28] drm_mode_getconnector+0xe4/0x334 >>> [ 34.170796] [ede8be10] [c03a0be8] drm_ioctl+0x348/0x464 >>> [ 34.176343] [ede8bed0] [c00ce2e8] do_vfs_ioctl+0x52c/0x6e8 >>> [ 34.182158] [ede8bf20] [c00ce4e4] SyS_ioctl+0x40/0x68 >>> [ 34.187515] [ede8bf40] [c000ab1c] ret_from_syscall+0x0/0x3c >>> [ 34.193417] --- interrupt: c01 at 0x6fb001dc >>> [ 34.193417] LR = 0x6fb00100 >>> [ 34.201216] Instruction dump: >>> [ 34.204368] 8129012c 806a0018 2f890000 419e0018 81290004 2f890000 >>> 419e000c 7d2903a6 >>> [ 34.212674] 4e800420 38600000 4e800020 81231cd8 <81290008> 2f890000 >>> 4d9e0020 7d2903a6 >>> [ 34.376219] ---[ end trace 803e15e46b991816 ]--- >>> [ 34.380843] >>> * Starting Mount filesystems on boot[ OK ] >>> * >>> >>> >>> > applied patch and oops still with Kernel 4.04 and 4.1.0-rc3. > I'm not readily seeing where it's failing. Please apply the attached patches and send me the output. Alex > [ 28.780273] Unable to handle kernel paging request for data at address > 0x00000008 > [ 28.846502] Faulting instruction address: 0xc04a520c > [ 34.670171] Oops: Kernel access of bad area, sig: 11 [#1] > [ 34.675912] PREEMPT Canyonlands > [ 34.679252] Modules linked in: > [ 34.682496] CPU: 0 PID: 1895 Comm: Xorg Not tainted 4.0.4-Sam460ex #3 > [ 34.689299] task: ede4e3e0 ti: edd10000 task.ti: edd10000 > [ 34.694999] NIP: c04a520c LR: c04a54ec CTR: c03e5094 > [ 34.700243] REGS: edd11c30 TRAP: 0300 Not tainted (4.0.4-Sam460ex) > [ 34.707047] MSR: 00029000 <CE,EE,ME> CR: 28004222 XER: 00000000 > [ 34.713601] DEAR: 00000008 ESR: 00000000 > GPR00: c04a54b8 edd11ce0 ede4e3e0 eea38000 00000000 00000000 c0710000 > 00000000 > GPR08: 00000000 00000000 eeb34400 edd11ce0 28004244 b78d7afc b7b6bab0 > b7b6a530 > GPR16: 00000000 ffffffff 6f23c730 edd11e18 c03add64 eeb34578 00000001 > 00004000 > GPR24: 00004000 c0719b98 fffffff2 eeb62200 eeb63e00 eea3ef00 eea38000 > 00000000 > [ 34.748139] NIP [c04a520c] radeon_audio_enable+0x4/0x18 > [ 34.753657] LR [c04a54ec] radeon_audio_detect+0x104/0x134 > [ 34.759355] Call Trace: > [ 34.761938] [edd11ce0] [c04a54b8] radeon_audio_detect+0xd0/0x134 > (unreliable) > [ 34.769523] [edd11d00] [c03e69a8] radeon_dvi_detect+0x39c/0x3c0 > [ 34.775800] [edd11d30] [c0391cf8] > drm_helper_probe_single_connector_modes_merge_bits+0xf4/0x448 > [ 34.785005] [edd11d70] [c03ade48] drm_mode_getconnector+0xe4/0x334 > [ 34.791548] [edd11e10] [c03a0bf4] drm_ioctl+0x348/0x464 > [ 34.797095] [edd11ed0] [c00ce2e4] do_vfs_ioctl+0x52c/0x6e8 > [ 34.802910] [edd11f20] [c00ce4e0] SyS_ioctl+0x40/0x68 > [ 34.808260] [edd11f40] [c000ab1c] ret_from_syscall+0x0/0x3c > [ 34.814160] --- interrupt: c01 at 0x6fb001dc > [ 34.814160] LR = 0x6fb00100 > [ 34.821960] Instruction dump: > [ 34.825112] 8129012c 806a0018 2f890000 419e0018 81290004 2f890000 > 419e000c 7d2903a6 > [ 34.833418] 4e800420 38600000 4e800020 81231cd8 <81290008> 2f890000 > 4d9e0020 7d2903a6 > [ 34.996734] ---[ end trace c29f79df28960722 ]--- > [ 35.001353] > > * Starting Mount filesystems on boot >
diff --git a/drivers/gpu/drm/radeon/radeon_audio.c b/drivers/gpu/drm/radeon/radeon_audio.c index a07561d..5c261da 100644 --- a/drivers/gpu/drm/radeon/radeon_audio.c +++ b/drivers/gpu/drm/radeon/radeon_audio.c @@ -473,12 +473,16 @@ void radeon_audio_detect(struct drm_connector *connector, radeon_encoder = to_radeon_encoder(encoder); dig = radeon_encoder->enc_priv; + DRM_INFO("encoder id: 0x%x\n", radeon_encoder->encoder_id); + if (!dig->afmt) return; if (status == connector_status_connected) { struct radeon_connector *radeon_connector = to_radeon_connector(connector); + DRM_INFO("connector_status_connected\n"); + if (connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort && radeon_dp_getsinktype(radeon_connector) == CONNECTOR_OBJECT_ID_DISPLAYPORT) @@ -486,14 +490,21 @@ void radeon_audio_detect(struct drm_connector *connector, else radeon_encoder->audio = rdev->audio.hdmi_funcs; + DRM_INFO("audio: 0x%p\n", radeon_encoder->audio); + dig->afmt->pin = radeon_audio_get_pin(encoder); if (drm_detect_monitor_audio(radeon_connector_edid(connector))) { + DRM_INFO("enabling audio\n"); radeon_audio_enable(rdev, dig->afmt->pin, 0xf); } else { + DRM_INFO("disabling audio\n"); radeon_audio_enable(rdev, dig->afmt->pin, 0); dig->afmt->pin = NULL; } + DRM_INFO("pin: 0x%p\n", dig->afmt->pin); } else { + DRM_INFO("connector_status_disconnected\n"); + DRM_INFO("pin: 0x%p\n", dig->afmt->pin); radeon_audio_enable(rdev, dig->afmt->pin, 0); dig->afmt->pin = NULL; }
From dc95bc6efa5b731bd43617243ca70b8d1ac0a567 Mon Sep 17 00:00:00 2001 From: Alex Deucher <alexander.deucher@xxxxxxx> Date: Mon, 18 May 2015 12:04:02 -0400 Subject: [PATCH] drm/radeon: properly select encoder in radeon_audio_detect (v2) Need to handle DVI where we way end up with an analog encoder in some cases. v2: rework checks. always set use_digital for DVI-D, HDMI-A Reported-by: Julian Margetson <runaway@xxxxxxxx> Signed-off-by: Alex Deucher <alexander.deucher@xxxxxxx> Cc: stable@xxxxxxxxxxxxxxx --- drivers/gpu/drm/radeon/radeon_audio.c | 20 +++++++++++--------- drivers/gpu/drm/radeon/radeon_connectors.c | 6 ++++-- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/drivers/gpu/drm/radeon/radeon_audio.c b/drivers/gpu/drm/radeon/radeon_audio.c index dcb7796..ace2b4b 100644 --- a/drivers/gpu/drm/radeon/radeon_audio.c +++ b/drivers/gpu/drm/radeon/radeon_audio.c @@ -453,22 +453,24 @@ void radeon_audio_enable(struct radeon_device *rdev, void radeon_audio_detect(struct drm_connector *connector, enum drm_connector_status status) { - struct radeon_device *rdev; - struct radeon_encoder *radeon_encoder; + struct drm_device *dev = connector->dev; + struct radeon_device *rdev = dev->dev_private; struct radeon_encoder_atom_dig *dig; + const struct drm_connector_helper_funcs *connector_funcs = + connector->helper_private; + struct drm_encoder *encoder = connector_funcs->best_encoder(connector); + struct radeon_encoder *radeon_encoder; - if (!connector || !connector->encoder) + if (!radeon_audio_chipset_supported(rdev)) return; - if (!radeon_encoder_is_digital(connector->encoder)) + if (!encoder) return; - rdev = connector->encoder->dev->dev_private; - - if (!radeon_audio_chipset_supported(rdev)) + if (!radeon_encoder_is_digital(encoder)) return; - radeon_encoder = to_radeon_encoder(connector->encoder); + radeon_encoder = to_radeon_encoder(encoder); dig = radeon_encoder->enc_priv; if (!dig->afmt) @@ -484,7 +486,7 @@ void radeon_audio_detect(struct drm_connector *connector, else radeon_encoder->audio = rdev->audio.hdmi_funcs; - dig->afmt->pin = radeon_audio_get_pin(connector->encoder); + dig->afmt->pin = radeon_audio_get_pin(encoder); if (drm_detect_monitor_audio(radeon_connector_edid(connector))) { radeon_audio_enable(rdev, dig->afmt->pin, 0xf); } else { diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c index d17d251..8052759 100644 --- a/drivers/gpu/drm/radeon/radeon_connectors.c +++ b/drivers/gpu/drm/radeon/radeon_connectors.c @@ -1303,8 +1303,10 @@ radeon_dvi_detect(struct drm_connector *connector, bool force) /* DVI-D and HDMI-A are digital only */ if ((connector->connector_type == DRM_MODE_CONNECTOR_DVID) || - (connector->connector_type == DRM_MODE_CONNECTOR_HDMIA)) + (connector->connector_type == DRM_MODE_CONNECTOR_HDMIA)) { + radeon_connector->use_digital = true; goto out; + } /* if we aren't forcing don't do destructive polling */ if (!force) { @@ -1379,7 +1381,7 @@ out: /* updated in get modes as well since we need to know if it's analog or digital */ radeon_connector_update_scratch_regs(connector, ret); - if (radeon_audio != 0) { + if ((radeon_audio != 0) && (radeon_connector->use_digital)) { radeon_connector_get_edid(connector); radeon_audio_detect(connector, ret); } -- 1.8.3.1
_______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel