From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757498AbcIHHas (ORCPT ); Thu, 8 Sep 2016 03:30:48 -0400 Received: from mail-cys01nam02on0089.outbound.protection.outlook.com ([104.47.37.89]:64985 "EHLO NAM02-CY1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752676AbcIHHan (ORCPT ); Thu, 8 Sep 2016 03:30:43 -0400 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Christian.Koenig@amd.com; Subject: Re: [PATCH 001/001] drivers/gpu/radeon: NULL pointer deference workaround To: Mark Fortescue , David Airlie References: <702d22fa-c229-3cc2-e1b3-d26f78dc0f52@thurning-instruments.co.uk> CC: Alex Deucher , =?UTF-8?Q?Christian_K=c3=b6nig?= , , From: =?UTF-8?Q?Christian_K=c3=b6nig?= Message-ID: Date: Thu, 8 Sep 2016 09:14:23 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 MIME-Version: 1.0 In-Reply-To: <702d22fa-c229-3cc2-e1b3-d26f78dc0f52@thurning-instruments.co.uk> Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [2a02:908:1251:7981:647f:bf39:fee7:4279] X-ClientProxiedBy: AM4PR01CA0040.eurprd01.prod.exchangelabs.com (10.164.74.178) To MWHPR12MB1311.namprd12.prod.outlook.com (10.169.205.136) X-MS-Office365-Filtering-Correlation-Id: 49237208-ebb7-4b44-a258-08d3d7b7de7f X-Microsoft-Exchange-Diagnostics: 1;MWHPR12MB1311;2:7ZrMLFPC2eZoueP/QTRWdmijsjxHJSEox/HiApkQPzmBxerjXox6oSLPVaQv55oum8bc771ogn9PgXtYXgf/TeUpsIG+wRTpFAMBB8nv4vUeNWyoPbPSseVhoks2O0BNaG1pvAXEn0XlxGx3KWIHjbnc7DKUAPwKAUUfaYOAnQUlhI7ShMt6jZptZFE147e/;3:kkApOJmug0hGUXozYDucBFPWnTjxcgDEdcVF/xVXHtcmValOU7j+3Eny8P6Osjif+p2Vc/pZ7OpZMIA7L52uevxCUH3TDK8szrIJxprNeCOV+G4yhWjPO7GyQ4vO8m6+ X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:MWHPR12MB1311; X-Microsoft-Exchange-Diagnostics: 1;MWHPR12MB1311;25:9XPg4fvw637FScM1DQkg+jLrJxOBldsWT9bkRo5KAou4GcceBgMYVJhqJ6Smi52nOvh3VaYyNlAuiQTgd38YCSH8uMo3bvEjYtcPPvhKctEYtw7ndHw29Oq7cKWiCIiVo1zDwf3Ir1f1RIKL5//WVztCwdQR8vbw9mUItjFRJ88vx/5V7V+r1tuGNn5qpvEpaGpgdGIjwODO9uge5IsMBrpDnDLE9wxb8WEsGpLh60AUqOgU6csuBCiSwFN0xck/7jMHbNJhp6MXLl7DruIgs4/MUmYP4u9K+EHJ3cyy7BR2dgFWHSI2ATE2qjl9jdyoP1BHHKbrmaugYM1KfR2kfs0mdQHJDtVzmEyFgfRtN+zJibC3akXEwJrt2fnHZo+49zGoZibCb+D7UWFbyoG/b7sGGwJqMC4onAL5bETtP3ROsdqFWWn4X4i1J+ifEHurYROvFjMz4copkdrqP706/u5SiIYrskTAA+TkrAVQhU0zM+rWOxV9i+3lMdq4AUbF3BkVxIkbGIQANiQvhMIEa0h8p2fIYNgB6h9+nvrfDSwn2kqLEAb1TuhfXCVbJ5t2Q5qTATjrKbNSLu2gL2fcS7d8d8Kd1geZNb1H467Tnfa87TSATYUqwDj9SHEYvkgpFN7vMlMihJ9eeB6H+ZONR3r7w4VqvXd9xmKKOhc/XHJFH7H8WnF/PDewUukJsL8OQrD63A23mrECwmvZCQRIo4ci9T9oC83IU94/I34irAZZCk4QqaNCivxwna5De3hSg8BfUUGdn4MPfRim87V4f8nm1QeMpXR8cqd9GvsTRBW15MVklMQFUGs8RyrEb0lkZlnJwO8eUqqotzoIN7eIVnrLcymizk97p/fTW9LD0WnkmhlRYP2p46iAr8PND9Y0Wxm2VF2Wf2Ed4fr8agQfPg== X-Microsoft-Exchange-Diagnostics: 1;MWHPR12MB1311;31:RGmNjqO5uav+TGv4poPqbNl/erpXW9aIrrtB0yd/FjfPM10CHn4LIOwXnw3UxJ1xpIAdb/NHLcO72Ld65YrCNOFtSC9sD0ACbZTNSRvx0o+QAxWMaNKSCzTVajXxKkWe3dWUo4oV+fhcNaTftkdlw1b8jb8TrP8Lcn1AC1xgtJZ7fGrjhNXfLij7rMHwsO0YmKZvuWHfvjgrwelE7M/IOeXUC4T/tWLOT6U8alUv16A=;20:PThFrNPLjdidlHi041Cx8TRdjql0vLpUnJufVaXmV8wD4/iGArI4Vs0TfvIJB06XCFyKwM5sncESyZfJsYVUMGNskTUT6G3G6exdRnXZslg99CM7b+NR66ykjN/oGLuUR3isTAg1g1pOKSNiv/7Bjp2tZGbZxpp8Equ+JxiHc58nFO7BQOtNsPHQRkHWEgXK2Spjrc+rCfL9vNdGkmq55FG6DlbVndMVFkAh7Os5QPmxBl6I6WxfPAUavdTxNi5TwUu1By2EbJBO1IqyPjSJBpfy39iKQ6ctZ7x1DAV+WIvoI4FU75uMA8ZGgvlfVnROXwLFLsgbKF52t+09TnWGwwNCQDcQR4eeKjCiTjAlxzmz82SCfMO4NvtredSc4ihPyx9hGPV3UrMEriz5HEK1GGsv8jAelemZzaMDnnZEUHvo/+/hHyOkOdJrINjWRWydkN7nr1dJNkP1ltSc3HftOW5Q1qBJIYLOY/qje2byA5p3BkIehiluZx/cZz8AFxsS X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(211254476889703)(217544274631240)(24339691489775); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040176)(601004)(2401047)(8121501046)(5005006)(3002001)(10201501046)(6055026);SRVR:MWHPR12MB1311;BCL:0;PCL:0;RULEID:;SRVR:MWHPR12MB1311; X-Microsoft-Exchange-Diagnostics: 1;MWHPR12MB1311;4:BJUhpkviQOM86lt1dzeXYJRS/CqdAx0U+vj9aE9RD4/YVCKWi7mW6lTl2+W0H99SBjdUj/P2Dw+y6qhVFd6hVdDqIrWsZsCVdIxqs1dkfXUhcS4eUcSax4fejLyJwxwLcoSN4gp74y7Hkh8Smem76W+ouKRRtt5QFaXgpa5Q5bLM5hjHMiFagBD0OlQ8HTVJyEol/8ZTsQfLSJLUpE9CQXLJbWKdvmX1JsMbSuY2u9TIp3k29ApzRva6ROKhPMQGN93Xgz+3ADpDeOZ5HXM+fU0DjQ/d/5W2fp0L+rX/DNsogZ1Zn5tjgcUwNn1YVCaYEyAj3YYY+DzCBMLNaprpbBeK5Mc0TCalV9HUd82LqvYVMJBMqUSaL78ZWsOETyuFjwJCaxl4qw2jk+cZmaHDmh7g/90YQtIi3Ih4iO8///y6FW9QGPLy6jWFLDj7XIYWYGuKcNxapr0K6Qq9Pcc7t9nOn8+N20AY0yFbAuyVMV18zYrV4jDqUWOVj2cWwuVvI6+EAXVARTclQmo2AB9yiA== X-Forefront-PRVS: 00594E8DBA X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(4630300001)(6009001)(7916002)(189002)(199003)(50986999)(92566002)(65956001)(7846002)(97736004)(50466002)(42186005)(189998001)(81156014)(575784001)(106356001)(31686004)(19580405001)(4001350100001)(19580395003)(7736002)(54356999)(5660300001)(105586002)(76176999)(5890100001)(31696002)(81166006)(5001770100001)(65806001)(305945005)(83506001)(230700001)(68736007)(64126003)(4326007)(8676002)(77096005)(586003)(15975445007)(23676002)(6116002)(101416001)(65826007)(2906002)(47776003)(33646002)(36756003)(86362001)(2950100001)(1706002)(3826002);DIR:OUT;SFP:1101;SCL:1;SRVR:MWHPR12MB1311;H:[IPv6:2a02:908:1251:7981:647f:bf39:fee7:4279];FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtNV0hQUjEyTUIxMzExOzIzOnR2V0RoK3RRZTc1Rm5oQm0wU1FmUHNQZzhO?= =?utf-8?B?MkkyR2hRNlNjYmIxLzZzdEtPSy9IRG1kcTNndFBHTEIzdnNzZWpSbm5hcGxx?= =?utf-8?B?aUFWVzV5M3YzWWRHLyt6eE1OR3UrSkFzcDlEZ0NBVWhUTU1oZi8zVHlwVnpI?= =?utf-8?B?d3lOdHJGVXZ5YnR5WWZuWUpCc3RONVI2NzF1NUFvSng3OHk0MlQvOUFlWWNi?= =?utf-8?B?UGVpNjhLUHplYjlKeW5XYkF6cXhSWnVsOElDN20vMUJqWjN5UkNsbm1xQ2ZV?= =?utf-8?B?NkQyektKZnJ1MjBSeVdWcU9OUkRDL2pKenNKaEZYNk5VUnNsVzRwNi9lS1FP?= =?utf-8?B?QzZBU1phRzI2WDkzTFM5N2kzenFHYThFVC96SHhmbW1tMk15QUw1eDdEclpm?= =?utf-8?B?b0cvMUY0SjdzYTcwZFdiQWFTU1VuRk8rM3VLWlpwU2ZSZElYWkdvL1FoeTFi?= =?utf-8?B?dDMrYStmeldYZnA5Q1hSYmp2dXJlT1FpTCtVVExYZFZTUjFRU2JPY204OVU0?= =?utf-8?B?MWtVMk9YbnJYMnkrRnFMTStNa2gzZU1DSWw5SjlUTGxLQS9qdHo3RTQrVytt?= =?utf-8?B?WHdtMUo4WFRhU0p2UHJDV2dQVDUrQUNRRFRPUWFRa2pJQnZiaGFqOXRObXQr?= =?utf-8?B?ZmpOYVEvc2NLUjRqdFdQWGRuZlBOcjJWbURqem4rVVlELzVPTXlyVC9Wcm5Y?= =?utf-8?B?cjhpSDZMQzRxU0JtMUdTTks4eWwzYnpKV2xYSmhNL2pKTzhCS3QzQ3kvZXZW?= =?utf-8?B?UzZ3clVqTmF1akdSb0hrMktySGtNRmx2Vkk0VWtUZCtqYmhrVTU1bG9FYVo2?= =?utf-8?B?azZta3JzcFZ4UjNzeGMzM1Q3QXdwSVlZYjMzeG8vREczUjFuK1NITENIakZn?= =?utf-8?B?cjB2WnZ0alBUT1QyV2daZzRGWmlpbVFvQlRkRTByREV4ODIzMllGZWI2MVRC?= =?utf-8?B?ODllK2g2a2VHQXQ4ZW85UFRZbzlsajAvdWtXKzdrcjBkdldkU0pJMDRydDgx?= =?utf-8?B?ZDZKWUprWmk4dHdDL2psNWVkMy9yMmxjdnZBMmZ5eHVmRnphMDE0Q0UveFZD?= =?utf-8?B?RnovbUVmbitERW9DeUZVdDNOZ25weWZZZFM5cmx3QWY4VUNkazRLdjA1NFdF?= =?utf-8?B?ZkZyR1I5UCtmSFI1ZXdCRUpCS0tnbXIxajU1YUZ6YndLR2RSRHpVaTN5NEx4?= =?utf-8?B?QWZjaFQ1bzY2M0l2b1R1UW91ZFYveU5mejEvdzlraERWY2lBNXV6RkhpM2Z6?= =?utf-8?B?VEVRblNRZ01IaDNmaE9tL1lMWGtqZGlsS2J3dE0rcWZVR2VpeXJobUJDS09n?= =?utf-8?B?RUVZQ3dUanYvY2s2cUlLQWltTWcyQ1IxNU1wVkR5VVZkTWwySEc0TlNhOFVz?= =?utf-8?B?L0VFZTJLU1B4Q1ZlT3NNNm4zNjZFaXNWcXlhTHJ1R1A3UGhseDVpOVlGVUJX?= =?utf-8?B?VEZ4VTF1ZVdieUdRYlFjamw4RDdXN3ZESXJ5TFluaGoxazRtMW5LQ0Q3blZt?= =?utf-8?B?SmJWemZ1dDJWY0NPSlMvTFRHdm9QME1QTjZLdHJxZmoxNlR2a3JiVDcwYk11?= =?utf-8?B?aUdhK0x3dVM4elliV1ROcVpPYWRxNHNwQVVIRzkzcCtrR24xK0JsVkZ6d2ht?= =?utf-8?B?Zmg2S3I0eVRYRjlLQ2g2cmVzeU1aMVpxN21vR1FvL0Z1V2prL3libjE4NkdV?= =?utf-8?B?VEpFbzU1OFRFbjUwUnJ6MGllSmZCSVBlZFVOZkpZbklza2UyZ0NNRklibCtZ?= =?utf-8?Q?aQ/AG9WFUKt42VRVQ1hDWjcPpUtCyy3ps5tQo=3D?= X-Microsoft-Exchange-Diagnostics: 1;MWHPR12MB1311;6:b/bPckWfmy4rxMbrBEUQAsUgebhDjHW+9YoYrtN3Y/FLw5UgMZPvgd31Pfy0bZR3bCZXuRz9HNW2CKbewxmZsA7MgOE5gVslSZZ7DSBHQn8jpom4qQp8EWz8JhVuLNAha/MIkz1NdT37PeQvp2NNh/tt4QKLnl6Mekx+eFVnTOA/JOd77Cg6KtP1Bpa9Tc64mcgi/FYDJypgbhe0JiXUh/VZ9sPQ8ltSyMnZT/Z8S7DiB2rQXP2XSVsijXFMcAfrKEm05kptE83zYAt6U5GwzZS9NBhavhh5KZ34jKGyxN5BVeDwWlf8kOKR7kn4c1v0CoKbW8f6ncUQan8JMm/CpA==;5:+tq+xgvWbNgj1HP9UDvkDgXZvmvS2BS5mq9Xec6e2EoyQ5X3/nPwt8r5rXFVFNkkR1xIr6ROE0iHfoPPKAG5Iblj5rO9SchuLQFHDhceF2/4lD8zx9kOrFFO1+ZJ6GflkDkoyjmRytgFu1v1VIsMrA==;24:TicPZlIJmm7wV4B37MEWeJi+/f68f/2JxyCm8z/mvW0tkjzSvxN3x8IPcMmEyNq2f9BUBWVSAkfBcLnHg2L3grsXBl3DN7dHu6rzFmcOO/M=;7:STuEUQu1UdqhZfX/CXF3/RUXvzgTSIzDb8yyJ4sSjqlZYp1GebNB1YncwY+1roMIUAFoNF9Mqt1ABBS5OoBGlSVSly1ssEvO8rA2xalU1cikirzRbQOZysNooYJz39EeHuxn6hjPP4QP52fvKs4+6ylgCHFg9+VoVE+MzSZYvhJTKvm9WCXAITFnSQLixM15mBewDC1QERV3Czh7EtQYegQF0Xi1t7ehCK+GJX+bZsa1Lr8QeVJ9IPMd9I8DOpKV SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;MWHPR12MB1311;20:CLmhxMVA0FT31UIKmpOj7xe7hsDRnWTTDzVSI7kpzK8WeE3IS9O0Jt7mNy29jO0ZLJQEeCeLYSD/2aSdfZPgi3WFZlypg5gSzogt9KuvaomVuB6DXbbbfVcfKwChHSSSOBPVd3Gvgek+yobfofaGaRtmHaqIsTH/nxpig6mkUDhizrqkfk6iu0Ykg3mkZTktXTxLumdrBshSaTy6a2PrDQnhLGixxBNFXL0j7PLiV8UYlhlDCgtItH8UfUBFA2Jj X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 Sep 2016 07:15:08.3570 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR12MB1311 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Am 07.09.2016 um 19:38 schrieb Mark Fortescue: > > On an LV-683 (AMD Dual-core G-T56N) Mini-ITX board, I get a Kernel > Oops because Connector 0 (LCD Panel interface) does not have DDC. I'm not an expert on this, but that is really odd cause even LCD Panels should have a DDC interface. > > Ubuntu 16.04 LTS Kernel (4.4 series): > > ... > [ 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 Especially since the BIOS claims that this is a displayport connector and there is no physical way to have a DP without an DDC as far as I know. Please open a bug report on FDO and attach you BIOS image. Alex can probably take a look when he's back from vacation. Regards, Christian. > [ 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.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.409733] [] radeon_dp_getsinktype+0x1a/0x30 [radeon] > [ 8.416805] PGD 0 > [ 8.418841] Oops: 0000 [#1] SMP > ... > > This patch prevents Kernel failures due to a connector not having a > DDC interface by changing the code so that ddc_bus is always checked > before use. > The problem was first identified using the uBuntu MATE 14.04 LTS (3.16 > series kernels) but not dealt with at that time. On attempting to > install uBuntu MATE 16.04 LTS (4.4 series kernels), it became clear > that using various workarounds to allow the issue to be ignored were > not viable so more effort was put in to sorting the issue resulting in > this patch. See https://bugs.launchpad.net/bugs/1587885 for more details. > > Signed-off-by: Mark Fortescue > Tested-by: Mark Fortescue > > --- > > Looks like Thunderbird may have made a mess of the patch when pasting > the contents into the mail message - my alternate mail client (pine) > also has strict line length handling and trashes non-MIME encoded > patches. > > This may not be the correct approach to solving the issue but it is > clean in that it ensures that ddc_bus is never used when NULL > regardless of how the code ended up at the point of use. > > If it helps with back porting, I have patches for the uBuntu 14.04 LTS > [3.13 series], uBuntu MATE 14.04 LTS [3.16 series] and uBuntu 16.04 > LTS [4.4 series] kernels. > > Test Hardware: > Commell LV-683 Mini-ITX with onboard AMD Dual-core G-T56N > 4G Ram, 2x1TB Disk, HANNS-G HC194D 1280x1024 LCD (VGA). > 4.8.0-rc5 with patch boots without error. > > drivers/gpu/drm/radeon/atombios_dp.c | 60 ++++++++++++------- > drivers/gpu/drm/radeon/radeon_connectors.c | 46 +++++++------- > drivers/gpu/drm/radeon/radeon_dp_mst.c | 9 ++ > drivers/gpu/drm/radeon/radeon_i2c.c | 3 > 4 files changed, 73 insertions(+), 45 deletions(-) > > Patch: > diff --git a/drivers/gpu/drm/radeon/atombios_dp.c > b/drivers/gpu/drm/radeon/atombios_dp.c > index cead089a..98b3c0e 100644 > --- a/drivers/gpu/drm/radeon/atombios_dp.c > +++ b/drivers/gpu/drm/radeon/atombios_dp.c > @@ -232,6 +232,9 @@ void radeon_dp_aux_init(struct radeon_connector > *radeon_connector) > 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)) { > @@ -364,6 +367,9 @@ u8 radeon_dp_getsinktype(struct radeon_connector > *radeon_connector) > 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); > } > @@ -376,6 +382,9 @@ static void radeon_dp_probe_oui(struct > radeon_connector *radeon_connector) > 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]); > @@ -391,6 +400,9 @@ bool radeon_dp_getdpcd(struct radeon_connector > *radeon_connector) > 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); > @@ -428,24 +440,26 @@ int radeon_dp_get_panel_mode(struct drm_encoder > *encoder, > > 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; > + } > } > } > > @@ -511,6 +525,9 @@ bool radeon_dp_needs_link_train(struct > radeon_connector *radeon_connector) > 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; > @@ -531,7 +548,7 @@ void radeon_dp_set_rx_power_state(struct > drm_connector *connector, > 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); > @@ -834,7 +851,8 @@ void radeon_dp_link_train(struct drm_encoder > *encoder, > 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; > @@ -850,7 +868,7 @@ void radeon_dp_link_train(struct drm_encoder > *encoder, > 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 --git a/drivers/gpu/drm/radeon/radeon_connectors.c > b/drivers/gpu/drm/radeon/radeon_connectors.c > index b79f3b0..cec30c9 100644 > --- a/drivers/gpu/drm/radeon/radeon_connectors.c > +++ b/drivers/gpu/drm/radeon/radeon_connectors.c > @@ -328,31 +328,32 @@ static void radeon_connector_get_edid(struct > drm_connector *connector) > 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 if (vga_switcheroo_handler_flags() & > VGA_SWITCHEROO_CAN_SWITCH_DDC && > + connector->connector_type == DRM_MODE_CONNECTOR_LVDS) { > + radeon_connector->edid = > drm_get_edid_switcheroo(&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 (vga_switcheroo_handler_flags() & > VGA_SWITCHEROO_CAN_SWITCH_DDC && > - connector->connector_type == DRM_MODE_CONNECTOR_LVDS && > - radeon_connector->ddc_bus) { > - radeon_connector->edid = > drm_get_edid_switcheroo(&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) { > @@ -1312,6 +1313,7 @@ radeon_dvi_detect(struct drm_connector > *connector, bool force) > 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 --git a/drivers/gpu/drm/radeon/radeon_dp_mst.c > b/drivers/gpu/drm/radeon/radeon_dp_mst.c > index de504ea..89e91f3 100644 > --- a/drivers/gpu/drm/radeon/radeon_dp_mst.c > +++ b/drivers/gpu/drm/radeon/radeon_dp_mst.c > @@ -661,7 +661,7 @@ radeon_dp_mst_init(struct radeon_connector > *radeon_connector) > { > 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; > @@ -688,6 +688,9 @@ radeon_dp_mst_probe(struct radeon_connector > *radeon_connector) > if (dig_connector->dpcd[DP_DPCD_REV] < 0x12) > return 0; > > + if (!radeon_connector->ddc_bus || > !radeon_connector->ddc_bus->has_aux) > + return 0; > + > ret = drm_dp_dpcd_read(&radeon_connector->ddc_bus->aux, > DP_MSTM_CAP, msg, > 1); > if (ret) { > @@ -711,7 +714,9 @@ radeon_dp_mst_check_status(struct radeon_connector > *radeon_connector) > struct radeon_connector_atom_dig *dig_connector = > radeon_connector->con_priv; > int retry; > > - if (dig_connector->is_mst) { > + if (dig_connector->is_mst && > + radeon_connector->ddc_bus && > + radeon_connector->ddc_bus->has_aux) { > u8 esi[16] = { 0 }; > int dret; > int ret = 0; > diff --git a/drivers/gpu/drm/radeon/radeon_i2c.c > b/drivers/gpu/drm/radeon/radeon_i2c.c > index 9590bcd..c18f7ba 100644 > --- a/drivers/gpu/drm/radeon/radeon_i2c.c > +++ b/drivers/gpu/drm/radeon/radeon_i2c.c > @@ -63,6 +63,9 @@ bool radeon_ddc_probe(struct radeon_connector > *radeon_connector, bool use_aux) > 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 { > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel