NULL pointer dereference in radeon drm code

Bug #1587885 reported by Mark Fortescue
10
This bug affects 1 person
Affects Status Importance Assigned to Milestone
linux (Ubuntu)
Confirmed
High
Unassigned

Bug Description

On one of my systems I use, display connector 0 does not have DDC. This results in the DRM code trying to use radeon_connector->ddc_bus when it is not set. This is known to have been an issue since the 3.2 series kernels.

Known Problem Kernels: uBuntu 12.04 LTS (linux-3.2.55), uBuntu-MATE 14.04 LTS (linux-3.16.7) and uBuntu-MATE 16.04 LTS (linux-4.4.8) and linux-4.6.0 (git:/
/git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux).

Trying to use the uBuntu-MATE 16.04 LTS LiveCD ubuntu-mate-16.04-desktop-amd64.iso (from uBuntu-MATE website) showed the problem.

Using a serial console I extracted the following information when trying to boot from a uBuntu-MATE 16.04 LTS LiveCD USB Stick (it had been upgraded from 4.4.0-21-generic in an attempt to get something usable):

<snipped>
[ 0.000000] Linux version 4.4.0-22-generic (buildd@lgw01-41) (gcc version 5.3.1 20160413 (Ubuntu 5.3.1-14ubuntu2) ) #40-Ubuntu SMP Thu May 12 22:03:46 UTC 2
016 (Ubuntu 4.4.0-22.40-generic 4.4.8)
[ 0.000000] Command line: BOOT_IMAGE=/casper/vmlinuz.efi file=/cdrom/preseed/ubuntu-mate.seed boot=casper locale=en_GB console-setup/layoutcode=gb console=u
art,io,0x3f8,115200n8 earlyprintk=ttyS0,115200n8 debug ---
[ 0.000000] KERNEL supported cpus:
[ 0.000000] Intel GenuineIntel
[ 0.000000] AMD AuthenticAMD
[ 0.000000] Centaur CentaurHauls
<snipped>
[ 0.000000] efi: EFI v2.00 by Phoenix Technologies Ltd.
[ 0.000000] efi: EFI v2.00 by Phoenix Technologies Ltd.
[ 0.000000] efi: [ 0.000000] efi: ACPI=0x973c7000 ACPI=0x973c7000 ACPI 2.0=0x973c7014 ACPI 2.0=0x973c7014 SMBIOS=0x9726b000 SMBIOS=0x9726b000

[ 0.000000] SMBIOS 2.6 present.
[ 0.000000] SMBIOS 2.6 present.
[ 0.000000] DMI: AMD Corporation EBrazos Platform/Persimmon, BIOS LV-683 Version: 1.1 02/14/2012
[ 0.000000] DMI: AMD Corporation EBrazos Platform/Persimmon, BIOS LV-683 Version: 1.1 02/14/2012
<snipped>
[ 8.262990] [drm] ib test on ring 5 succeeded
[ 8.288897] [drm] Radeon Display Connectors
[ 8.293175] [drm] Connector 0:
[ 8.296252] [drm] DP-1
[ 8.298791] [drm] Encoders:
[ 8.301770] [drm] DFP1: INTERNAL_UNIPHY
[ 8.305973] [drm] Connector 1:
[ 8.309043] [drm] DP-2
[ 8.311598] [drm] HPD2
[ 8.314169] [drm] DDC: 0x6440 0x6440 0x6444 0x6444 0x6448 0x6448 0x644c 0x644c
[ 8.321609] [drm] Encoders:
[ 8.324589] [drm] DFP2: INTERNAL_UNIPHY
[ 8.328793] [drm] Connector 2:
[ 8.331856] [drm] VGA-1
[ 8.332316] scsi 0:0:0:0: Direct-Access SMI USB DISK 1100 PQ: 0 ANSI: 0 CCS
[ 8.342947] [drm] DDC: 0x64d8 0x64d8 0x64dc 0x64dc 0x64e0 0x64e0 0x64e4 0x64e4
[ 8.350341] [drm] Encoders:
[ 8.353310] [drm] CRT1: INTERNAL_KLDSCP_DAC1
[ 8.358195] BUG: unable to handle kernel NULL pointer dereference at 0000000000000409
[ 8.366104] IP:[ 8.367176] sd 0:0:0:0: Attached scsi generic sg1 type 0
[ 8.368538] sd 0:0:0:0: [sdb] 7831552 512-byte logical blocks: (4.01 GB/3.73 GiB)
[ 8.369421] sd 0:0:0:0: [sdb] Write Protect is off
[ 8.369427] sd 0:0:0:0: [sdb] Mode Sense: 43 00 00 00
[ 8.370288] sd 0:0:0:0: [sdb] No Caching mode page found
[ 8.370292] sd 0:0:0:0: [sdb] Assuming drive cache: write through
[ 8.374944] sdb: sdb1
[ 8.378398] sd 0:0:0:0: [sdb] Attached SCSI removable disk

[ 8.409733] [<ffffffffc02024da>] radeon_dp_getsinktype+0x1a/0x30 [radeon]
[ 8.416805] PGD 0
[ 8.418841] Oops: 0000 [#1] SMP
[ 8.422104] Modules linked in: hid_generic e1000e psmouse amdkfd usbhid uas amd_iommu_v2 ptp radeon(+) pps_core e1000(+) hid i2c_algo_bit ttm drm_kms_helper
 usb_storage syscopyarea sysfillrect sysimgblt ahci fb_sys_fops libahci drm video fjes
[ 8.444029] CPU: 0 PID: 131 Comm: systemd-udevd Not tainted 4.4.0-22-generic #40-Ubuntu
[ 8.452036] Hardware name: AMD Corporation EBrazos Platform/Persimmon, BIOS LV-683 Version: 1.1 02/14/2012
[ 8.461708] task: ffff88014780be80 ti: ffff880147888000 task.ti: ffff880147888000
[ 8.469194] RIP: 0010:[<ffffffffc02024da>] [<ffffffffc02024da>] radeon_dp_getsinktype+0x1a/0x30 [radeon]
[ 8.478850] RSP: 0018:ffff88014788b850 EFLAGS: 00010246
[ 8.484179] RAX: 0000000000000000 RBX: ffff88003485f000 RCX: 0000000000000000
[ 8.491321] RDX: 0000000000000000 RSI: 0000000000000001 RDI: ffff88003485f000
[ 8.498469] RBP: ffff88014788b850 R08: 0000000000000000 R09: ffffffffc004aff6
[ 8.505602] R10: ffffea0000d5e540 R11: 0000000000000000 R12: 0000000000000001
[ 8.506137] e1000 0000:05:0b.0 eth1: (PCI:33MHz:32-bit) 00:03:1d:09:3b:61
[ 8.506142] e1000 0000:05:0b.0 eth1: Intel(R) PRO/1000 Network Connection
[ 8.526299] R13: ffff8800351f4080 R14: ffff880035120000 R15: ffff8801478e7000
[ 8.533441] FS: 00007f4ed97678c0(0000) GS:ffff88014ec00000(0000) knlGS:0000000000000000
[ 8.541525] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[ 8.547263] CR2: 0000000000000409 CR3: 0000000149f2d000 CR4: 00000000000006f0
[ 8.554396] Stack:
[ 8.556412] ffff88014788b888 ffffffffc01c27a6 ffff88003485f050 ffff88003485f000
[ 8.563867] 0000000000000003 ffff88003574e000 0000000000000001 ffff88014788b8e8
[ 8.571329] ffffffffc00ccd95 ffff88014788b920 ffffffffc01a9319 ffff8801478e6200
[ 8.578789] Call Trace:
[ 8.581289] [<ffffffffc01c27a6>] radeon_dp_detect+0x206/0x2b0 [radeon]
[ 8.587918] [<ffffffffc00ccd95>] drm_helper_probe_single_connector_modes_merge_bits+0x235/0x4d0 [drm_kms_helper]
[ 8.598217] [<ffffffffc01a9319>] ? atombios_crtc_disable+0x39/0x350 [radeon]
[ 8.605356] [<ffffffffc00cd043>] drm_helper_probe_single_connector_modes+0x13/0x20 [drm_kms_helper]
[ 8.614508] [<ffffffffc00d990e>] drm_fb_helper_initial_config+0xae/0x420 [drm_kms_helper]
[ 8.622816] [<ffffffffc01cd16e>] radeon_fbdev_init+0xee/0x110 [radeon]
[ 8.629471] [<ffffffffc01c726f>] radeon_modeset_init+0x43f/0xa10 [radeon]
[ 8.636391] [<ffffffffc019f513>] radeon_driver_load_kms+0x123/0x220 [radeon]
[ 8.643565] [<ffffffffc0035397>] drm_dev_register+0xa7/0xb0 [drm]
[ 8.649765] [<ffffffffc00379cd>] drm_get_pci_dev+0x8d/0x1e0 [drm]
[ 8.655985] [<ffffffffc019b3e0>] radeon_pci_probe+0xa0/0xb0 [radeon]
[ 8.662438] [<ffffffff81439dc5>] local_pci_probe+0x45/0xa0
[ 8.668006] [<ffffffff8143b203>] pci_device_probe+0x103/0x150
[ 8.673841] [<ffffffff8154c6e2>] driver_probe_device+0x222/0x4a0
[ 8.679939] [<ffffffff8154c9e4>] __driver_attach+0x84/0x90
[ 8.685519] [<ffffffff8154c960>] ? driver_probe_device+0x4a0/0x4a0
[ 8.691787] [<ffffffff8154a30c>] bus_for_each_dev+0x6c/0xc0
[ 8.697445] [<ffffffff8154be9e>] driver_attach+0x1e/0x20
[ 8.702845] [<ffffffff8154b9db>] bus_add_driver+0x1eb/0x280
[ 8.708504] [<ffffffff8154d2f0>] driver_register+0x60/0xe0
[ 8.714077] [<ffffffff814396ec>] __pci_register_driver+0x4c/0x50
[ 8.720191] [<ffffffffc0037c00>] drm_pci_init+0xe0/0x110 [drm]
[ 8.726104] [<ffffffffc030d000>] ? 0xffffffffc030d000
[ 8.731288] [<ffffffffc030d09d>] radeon_init+0x9d/0xb2 [radeon]
[ 8.737297] [<ffffffff81002123>] do_one_initcall+0xb3/0x200
[ 8.742955] [<ffffffff811cee51>] ? __vunmap+0x91/0xe0
[ 8.748093] [<ffffffff811eaf83>] ? kmem_cache_alloc_trace+0x183/0x1f0
[ 8.754622] [<ffffffff8118c233>] do_init_module+0x5f/0x1cf
[ 8.760193] [<ffffffff81109e67>] load_module+0x1667/0x1c00
[ 8.765764] [<ffffffff81106410>] ? __symbol_put+0x60/0x60
[ 8.771252] [<ffffffff81212820>] ? kernel_read+0x50/0x80
[ 8.776651] [<ffffffff8110a644>] SYSC_finit_module+0xb4/0xe0
[ 8.782395] [<ffffffff8110a68e>] SyS_finit_module+0xe/0x10
[ 8.787970] [<ffffffff818252f2>] entry_SYSCALL_64_fastpath+0x16/0x71
[ 8.794404] Code: 41 5d 41 5e 41 5f 5d c3 66 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 55 48 8b 87 a0 03 00 00 45 31 c0 31 d2 be 01 00 00 00 48 89 e5 <0f> b6 8
8 09 04 00 00 48 8b 07 48 8b 78 28 e8 23 f6 ff ff 5d c3
[ 8.814354] RIP [<ffffffffc02024da>] radeon_dp_getsinktype+0x1a/0x30 [radeon]
[ 8.821645] RSP <ffff88014788b850>
[ 8.825135] CR2: 0000000000000409
[ 8.828551] ---[ end trace 9fce5ace7679b4a0 ]---

Looking at the code, there are a number of places that assume that radeon_connector->ddc_bus is not a NULL pointer.

The following workaround fixes the issue by ensuring that ddc_bus is always validated before use:

diff -rupd linux-source-4.4.0.orig/drivers/gpu/drm/radeon/atombios_dp.c linux-source-4.4.0/drivers/gpu/drm/radeon/atombios_dp.c
--- linux-source-4.4.0.orig/drivers/gpu/drm/radeon/atombios_dp.c 2016-05-12 23:03:23.000000000 +0100
+++ linux-source-4.4.0/drivers/gpu/drm/radeon/atombios_dp.c 2016-06-01 13:16:43.000000000 +0100
@@ -232,6 +232,9 @@ void radeon_dp_aux_init(struct radeon_co
        struct radeon_device *rdev = dev->dev_private;
        int ret;

+ if (!radeon_connector->ddc_bus)
+ return;
+
        radeon_connector->ddc_bus->rec.hpd = radeon_connector->hpd.hpd;
        radeon_connector->ddc_bus->aux.dev = radeon_connector->base.kdev;
        if (ASIC_IS_DCE5(rdev)) {
@@ -352,6 +355,9 @@ u8 radeon_dp_getsinktype(struct radeon_c
        struct drm_device *dev = radeon_connector->base.dev;
        struct radeon_device *rdev = dev->dev_private;

+ if (!radeon_connector->ddc_bus)
+ return 0;
+
        return radeon_dp_encoder_service(rdev, ATOM_DP_ACTION_GET_SINK_TYPE, 0,
                                         radeon_connector->ddc_bus->rec.i2c_id, 0);
 }
@@ -364,6 +370,9 @@ static void radeon_dp_probe_oui(struct r
        if (!(dig_connector->dpcd[DP_DOWN_STREAM_PORT_COUNT] & DP_OUI_SUPPORT))
                return;

+ if (!radeon_connector->ddc_bus)
+ return;
+
        if (drm_dp_dpcd_read(&radeon_connector->ddc_bus->aux, DP_SINK_OUI, buf, 3) == 3)
                DRM_DEBUG_KMS("Sink OUI: %02hx%02hx%02hx\n",
                              buf[0], buf[1], buf[2]);
@@ -379,6 +388,9 @@ bool radeon_dp_getdpcd(struct radeon_con
        u8 msg[DP_DPCD_SIZE];
        int ret, i;

+ if (!radeon_connector->ddc_bus)
+ return false;
+
        for (i = 0; i < 7; i++) {
                ret = drm_dp_dpcd_read(&radeon_connector->ddc_bus->aux, DP_DPCD_REV, msg,
                                       DP_DPCD_SIZE);
@@ -416,24 +428,26 @@ int radeon_dp_get_panel_mode(struct drm_

        dig_connector = radeon_connector->con_priv;

- if (dp_bridge != ENCODER_OBJECT_ID_NONE) {
- /* DP bridge chips */
- if (drm_dp_dpcd_readb(&radeon_connector->ddc_bus->aux,
- DP_EDP_CONFIGURATION_CAP, &tmp) == 1) {
- if (tmp & 1)
- panel_mode = DP_PANEL_MODE_INTERNAL_DP2_MODE;
- else if ((dp_bridge == ENCODER_OBJECT_ID_NUTMEG) ||
- (dp_bridge == ENCODER_OBJECT_ID_TRAVIS))
- panel_mode = DP_PANEL_MODE_INTERNAL_DP1_MODE;
- else
- panel_mode = DP_PANEL_MODE_EXTERNAL_DP_MODE;
- }
- } else if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) {
- /* eDP */
- if (drm_dp_dpcd_readb(&radeon_connector->ddc_bus->aux,
- DP_EDP_CONFIGURATION_CAP, &tmp) == 1) {
- if (tmp & 1)
- panel_mode = DP_PANEL_MODE_INTERNAL_DP2_MODE;
+ if (radeon_connector->ddc_bus) {
+ if (dp_bridge != ENCODER_OBJECT_ID_NONE) {
+ /* DP bridge chips */
+ if (drm_dp_dpcd_readb(&radeon_connector->ddc_bus->aux,
+ DP_EDP_CONFIGURATION_CAP, &tmp) == 1) {
+ if (tmp & 1)
+ panel_mode = DP_PANEL_MODE_INTERNAL_DP2_MODE;
+ else if ((dp_bridge == ENCODER_OBJECT_ID_NUTMEG) ||
+ (dp_bridge == ENCODER_OBJECT_ID_TRAVIS))
+ panel_mode = DP_PANEL_MODE_INTERNAL_DP1_MODE;
+ else
+ panel_mode = DP_PANEL_MODE_EXTERNAL_DP_MODE;
+ }
+ } else if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) {
+ /* eDP */
+ if (drm_dp_dpcd_readb(&radeon_connector->ddc_bus->aux,
+ DP_EDP_CONFIGURATION_CAP, &tmp) == 1) {
+ if (tmp & 1)
+ panel_mode = DP_PANEL_MODE_INTERNAL_DP2_MODE;
+ }
                }
        }

@@ -499,6 +513,9 @@ bool radeon_dp_needs_link_train(struct r
        u8 link_status[DP_LINK_STATUS_SIZE];
        struct radeon_connector_atom_dig *dig = radeon_connector->con_priv;

+ if (!radeon_connector->ddc_bus)
+ return false;
+
        if (drm_dp_dpcd_read_link_status(&radeon_connector->ddc_bus->aux, link_status)
            <= 0)
                return false;
@@ -519,7 +536,7 @@ void radeon_dp_set_rx_power_state(struct
        dig_connector = radeon_connector->con_priv;

        /* power up/down the sink */
- if (dig_connector->dpcd[0] >= 0x11) {
+ if (radeon_connector->ddc_bus && dig_connector->dpcd[0] >= 0x11) {
                drm_dp_dpcd_writeb(&radeon_connector->ddc_bus->aux,
                                   DP_SET_POWER, power_state);
                usleep_range(1000, 2000);
@@ -822,7 +839,8 @@ void radeon_dp_link_train(struct drm_enc
        else
                dp_info.enc_id |= ATOM_DP_CONFIG_LINK_A;

- if (drm_dp_dpcd_readb(&radeon_connector->ddc_bus->aux, DP_MAX_LANE_COUNT, &tmp)
+ if (radeon_connector->ddc_bus &&
+ drm_dp_dpcd_readb(&radeon_connector->ddc_bus->aux, DP_MAX_LANE_COUNT, &tmp)
            == 1) {
                if (ASIC_IS_DCE5(rdev) && (tmp & DP_TPS3_SUPPORTED))
                        dp_info.tp3_supported = true;
@@ -838,7 +856,7 @@ void radeon_dp_link_train(struct drm_enc
        dp_info.connector = connector;
        dp_info.dp_lane_count = dig_connector->dp_lane_count;
        dp_info.dp_clock = dig_connector->dp_clock;
- dp_info.aux = &radeon_connector->ddc_bus->aux;
+ dp_info.aux = radeon_connector->ddc_bus ? &radeon_connector->ddc_bus->aux : 0;

        if (radeon_dp_link_train_init(&dp_info))
                goto done;
diff -rupd linux-source-4.4.0.orig/drivers/gpu/drm/radeon/radeon_connectors.c linux-source-4.4.0/drivers/gpu/drm/radeon/radeon_connectors.c
--- linux-source-4.4.0.orig/drivers/gpu/drm/radeon/radeon_connectors.c 2016-01-10 23:01:32.000000000 +0000
+++ linux-source-4.4.0/drivers/gpu/drm/radeon/radeon_connectors.c 2016-06-01 13:21:24.000000000 +0100
@@ -327,26 +327,27 @@ static void radeon_connector_get_edid(st
        if (radeon_connector->router.ddc_valid)
                radeon_router_select_ddc_port(radeon_connector);

- if ((radeon_connector_encoder_get_dp_bridge_encoder_id(connector) !=
- ENCODER_OBJECT_ID_NONE) &&
- radeon_connector->ddc_bus->has_aux) {
- radeon_connector->edid = drm_get_edid(connector,
- &radeon_connector->ddc_bus->aux.ddc);
- } else if ((connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort) ||
- (connector->connector_type == DRM_MODE_CONNECTOR_eDP)) {
- struct radeon_connector_atom_dig *dig = radeon_connector->con_priv;
-
- if ((dig->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT ||
- dig->dp_sink_type == CONNECTOR_OBJECT_ID_eDP) &&
- radeon_connector->ddc_bus->has_aux)
- radeon_connector->edid = drm_get_edid(&radeon_connector->base,
+ if (radeon_connector->ddc_bus) {
+ if ((radeon_connector_encoder_get_dp_bridge_encoder_id(connector) !=
+ ENCODER_OBJECT_ID_NONE) &&
+ radeon_connector->ddc_bus->has_aux) {
+ radeon_connector->edid = drm_get_edid(connector,
                                                              &radeon_connector->ddc_bus->aux.ddc);
- else if (radeon_connector->ddc_bus)
+ } else if ((connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort) ||
+ (connector->connector_type == DRM_MODE_CONNECTOR_eDP)) {
+ struct radeon_connector_atom_dig *dig = radeon_connector->con_priv;
+
+ if ((dig->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT ||
+ dig->dp_sink_type == CONNECTOR_OBJECT_ID_eDP) &&
+ radeon_connector->ddc_bus->has_aux)
+ radeon_connector->edid = drm_get_edid(&radeon_connector->base,
+ &radeon_connector->ddc_bus->aux.ddc);
+ else
+ radeon_connector->edid = drm_get_edid(&radeon_connector->base,
+ &radeon_connector->ddc_bus->adapter);
+ } else
                        radeon_connector->edid = drm_get_edid(&radeon_connector->base,
                                                              &radeon_connector->ddc_bus->adapter);
- } else if (radeon_connector->ddc_bus) {
- radeon_connector->edid = drm_get_edid(&radeon_connector->base,
- &radeon_connector->ddc_bus->adapter);
        }

        if (!radeon_connector->edid) {
@@ -1306,6 +1307,7 @@ radeon_dvi_detect(struct drm_connector *
                                                continue;
                                        list_radeon_connector = to_radeon_connector(list_connector);
                                        if (list_radeon_connector->shared_ddc &&
+ radeon_connector->ddc_bus &&
                                            (list_radeon_connector->ddc_bus->rec.i2c_id ==
                                             radeon_connector->ddc_bus->rec.i2c_id)) {
                                                /* cases where both connectors are digital */
diff -rupd linux-source-4.4.0.orig/drivers/gpu/drm/radeon/radeon_dp_mst.c linux-source-4.4.0/drivers/gpu/drm/radeon/radeon_dp_mst.c
--- linux-source-4.4.0.orig/drivers/gpu/drm/radeon/radeon_dp_mst.c 2016-05-12 23:03:23.000000000 +0100
+++ linux-source-4.4.0/drivers/gpu/drm/radeon/radeon_dp_mst.c 2016-06-01 13:16:43.000000000 +0100
@@ -662,7 +662,7 @@ radeon_dp_mst_init(struct radeon_connect
 {
        struct drm_device *dev = radeon_connector->base.dev;

- if (!radeon_connector->ddc_bus->has_aux)
+ if (!radeon_connector->ddc_bus || !radeon_connector->ddc_bus->has_aux)
                return 0;

        radeon_connector->mst_mgr.cbs = &mst_cbs;
@@ -689,6 +689,9 @@ radeon_dp_mst_probe(struct radeon_connec
        if (dig_connector->dpcd[DP_DPCD_REV] < 0x12)
                return 0;

+ if (!radeon_connector->ddc_bus)
+ return 0;
+
        ret = drm_dp_dpcd_read(&radeon_connector->ddc_bus->aux, DP_MSTM_CAP, msg,
                               1);
        if (ret) {
@@ -718,6 +721,9 @@ radeon_dp_mst_check_status(struct radeon
                int ret = 0;
                bool handled;

+ if (!radeon_connector->ddc_bus)
+ return -EINVAL;
+
                dret = drm_dp_dpcd_read(&radeon_connector->ddc_bus->aux,
                                       DP_SINK_COUNT_ESI, esi, 8);
 go_again:
diff -rupd linux-source-4.4.0.orig/drivers/gpu/drm/radeon/radeon_i2c.c linux-source-4.4.0/drivers/gpu/drm/radeon/radeon_i2c.c
--- linux-source-4.4.0.orig/drivers/gpu/drm/radeon/radeon_i2c.c 2016-01-10 23:01:32.000000000 +0000
+++ linux-source-4.4.0/drivers/gpu/drm/radeon/radeon_i2c.c 2016-06-01 13:16:43.000000000 +0100
@@ -63,6 +63,9 @@ bool radeon_ddc_probe(struct radeon_conn
        if (radeon_connector->router.ddc_valid)
                radeon_router_select_ddc_port(radeon_connector);

+ if (!radeon_connector->ddc_bus)
+ return false;
+
        if (use_aux) {
                ret = i2c_transfer(&radeon_connector->ddc_bus->aux.ddc, msgs, 2);
        } else {

I think the changes to these four files should be pushed back to the main line kernel and it is probably also desirable to back port these changes to earlier kernels.
---
ApportVersion: 2.20.1-0ubuntu2.1
Architecture: amd64
AudioDevicesInUse: Error: command ['fuser', '-v', '/dev/snd/seq', '/dev/snd/timer'] failed with exit code 1:
CasperVersion: 1.376
CurrentDesktop: MATE
DistroRelease: Ubuntu 16.04
LiveMediaBuild: Ubuntu-MATE 16.04 LTS "Xenial Xerus" - Release amd64 (20160420.1)
MachineType: AMD Corporation EBrazos Platform
Package: linux (not installed)
ProcEnviron:
 TERM=xterm
 PATH=(custom, no user)
 XDG_RUNTIME_DIR=<set>
 LANG=en_GB.UTF-8
 SHELL=/bin/bash
ProcFB: 0 radeondrmfb
ProcKernelCmdLine: BOOT_IMAGE=/casper/vmlinuz.efi file=/cdrom/preseed/username.seed boot=casper locale=en_GB console-setup/layoutcode=gb radeon.pcie_gen2=0 radeon.audio=0 ---
ProcVersionSignature: Ubuntu 4.4.0-22.40-generic 4.4.8
RelatedPackageVersions:
 linux-restricted-modules-4.4.0-22-generic N/A
 linux-backports-modules-4.4.0-22-generic N/A
 linux-firmware 1.157
RfKill:

Tags: xenial
Uname: Linux 4.4.0-22-generic x86_64
UpgradeStatus: No upgrade log present (probably fresh install)
UserGroups: adm cdrom dip lpadmin plugdev sambashare sudo
_MarkForUpload: True
dmi.bios.date: 02/14/2012
dmi.bios.vendor: Phoenix Technologies Ltd.
dmi.bios.version: LV-683 Version: 1.1
dmi.board.asset.tag: Base Board Asset Tag Unknown
dmi.board.name: Persimmon
dmi.board.vendor: AMD Corp.
dmi.board.version: A11
dmi.chassis.asset.tag: Asset Tag
dmi.chassis.type: 9
dmi.chassis.vendor: AMD Corporation
dmi.chassis.version: 0.1
dmi.modalias: dmi:bvnPhoenixTechnologiesLtd.:bvrLV-683Version1.1:bd02/14/2012:svnAMDCorporation:pnEBrazosPlatform:pvr0.1:rvnAMDCorp.:rnPersimmon:rvrA11:cvnAMDCorporation:ct9:cvr0.1:
dmi.product.name: EBrazos Platform
dmi.product.version: 0.1
dmi.sys.vendor: AMD Corporation

Revision history for this message
Mark Fortescue (mark-mtfhpc) wrote :

The patch in raw form so it can be used directly.

Revision history for this message
Brad Figg (brad-figg) wrote : Missing required logs.

This bug is missing log files that will aid in diagnosing the problem. From a terminal window please run:

apport-collect 1587885

and then change the status of the bug to 'Confirmed'.

If, due to the nature of the issue you have encountered, you are unable to run this command, please add a comment stating that fact and change the bug status to 'Confirmed'.

This change has been made by an automated script, maintained by the Ubuntu Kernel Team.

Changed in linux (Ubuntu):
status: New → Incomplete
Revision history for this message
Mark Fortescue (mark-mtfhpc) wrote : AlsaInfo.txt

apport information

tags: added: apport-collected xenial
description: updated
Revision history for this message
Mark Fortescue (mark-mtfhpc) wrote : CRDA.txt

apport information

Revision history for this message
Mark Fortescue (mark-mtfhpc) wrote : CurrentDmesg.txt

apport information

Revision history for this message
Mark Fortescue (mark-mtfhpc) wrote : IwConfig.txt

apport information

Revision history for this message
Mark Fortescue (mark-mtfhpc) wrote : JournalErrors.txt

apport information

Revision history for this message
Mark Fortescue (mark-mtfhpc) wrote : Lspci.txt

apport information

Revision history for this message
Mark Fortescue (mark-mtfhpc) wrote : Lsusb.txt

apport information

Revision history for this message
Mark Fortescue (mark-mtfhpc) wrote : ProcCpuinfo.txt

apport information

Revision history for this message
Mark Fortescue (mark-mtfhpc) wrote : ProcInterrupts.txt

apport information

Revision history for this message
Mark Fortescue (mark-mtfhpc) wrote : ProcModules.txt

apport information

Revision history for this message
Mark Fortescue (mark-mtfhpc) wrote : PulseList.txt

apport information

Revision history for this message
Mark Fortescue (mark-mtfhpc) wrote : UdevDb.txt

apport information

Revision history for this message
Mark Fortescue (mark-mtfhpc) wrote : WifiSyslog.txt

apport information

Revision history for this message
Mark Fortescue (mark-mtfhpc) wrote :

The appport information was extracted after booting with a modified kernel as unmodified kernels crash.

Changed in linux (Ubuntu):
status: Incomplete → Confirmed
tags: added: patch
Changed in linux (Ubuntu):
importance: Undecided → High
penalvch (penalvch)
tags: added: precise trusty
Revision history for this message
Joseph Salisbury (jsalisbury) wrote :

Would it be possible for you to test the latest upstream kernel? Refer to https://wiki.ubuntu.com/KernelMainlineBuilds . Please test the latest v4.7-rc1 kernel[0].

If this bug is fixed in the mainline kernel, please add the following tag 'kernel-fixed-upstream'.

If the mainline kernel does not fix this bug, please add the tag: 'kernel-bug-exists-upstream'.

Once testing of the upstream kernel is complete, please mark this bug as "Confirmed".

Thanks in advance.

[0] http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.7-rc1-yakkety/

tags: added: kernel-da-key
Revision history for this message
Mark Fortescue (mark-mtfhpc) wrote :

http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.7-rc1-yakkety/ does not get to boot. It can't find root filing system on SATA SSD.

http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.7-rc2-yakkety/ boots and has the issue. See attached serial console log.

tags: added: kernel-bug-exists-upstream
Revision history for this message
Mark Fortescue (mark-mtfhpc) wrote :

Any chance that something is going to happen on this one. Having to patch every kernel update is going to be a real pain if the provided patch or something better does not get into the kernel.

Revision history for this message
Joseph Salisbury (jsalisbury) wrote :

Can you provide some information on the status of the patch with regards to getting it merged upstream? Has it been sent upstream, what sort of feedback has it received, is it getting applied to a subsystem maintainer's tree, etc?

People affected by this bug are probably wondering why the kernel team doesn't just apply the patch and fix it. The reason is that the kernel team is reluctant (not opposed) to apply any patch to a stable kernel that is not from upstream. Applying patches that don't come from upstream add greatly to the support of the kernel as other upstream patches may touch the same area as the non-upstream patch and may prevent them from applying cleanly.

To submit your patch, send your patch with the detailed description/changelog and your Signoff (ending with Signed-off-by: your name <email>), to the emails listed from ./scripts/get_maintainer.pl drivers/SUBSYSTEM-DETAILS (the get_maintainer.pl is from the kernel sources). Once you have sent the patch upstream and it's accepted, please drop a note here so that we can cherry-pick/include the patch into Ubuntu kernel.

Norbert (nrbrtx)
tags: removed: precise trusty
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.