Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753123AbdFVNQz (ORCPT ); Thu, 22 Jun 2017 09:16:55 -0400 Received: from mailout2.w1.samsung.com ([210.118.77.12]:27962 "EHLO mailout2.w1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750932AbdFVNQw (ORCPT ); Thu, 22 Jun 2017 09:16:52 -0400 X-AuditID: cbfec7ef-f796a6d00000373c-5e-594bc3439cb4 Subject: Re: [PATCH 1/7] drm/bridge: Support hotplugging panel-bridge. To: Boris Brezillon Cc: Archit Taneja , Laurent Pinchart , Mark Rutland , devicetree@vger.kernel.org, Linux Kernel Mailing List , "dri-devel@lists.freedesktop.org" , Philippe Cornu , Rob Herring , Thierry Reding From: Andrzej Hajda Message-id: <004fe335-3f36-38e6-7a3e-0ad0623b29cf@samsung.com> Date: Thu, 22 Jun 2017 15:16:47 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.1.1 MIME-version: 1.0 In-reply-to: <20170622144150.1663f649@bbrezillon> Content-type: text/plain; charset=utf-8 Content-transfer-encoding: 7bit Content-language: en-US X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrHKsWRmVeSWpSXmKPExsWy7djPc7rOh70jDaZ3als0dbxltTjwYiGL xfwj51gtrnx9z2bROXEJu8XlXXPYLJZev8hk8aDlBatF694j7BY/d81jceDyWDNvDaPH5b5e Jo8nmy4yeuycdZfdY3bHTFaPTas62Tzudx9n8nj6Yy+zx+dNcgGcUVw2Kak5mWWpRfp2CVwZ 3yeeYy+YpF3xZ8pMlgbGJuUuRk4OCQETia/XOpkhbDGJC/fWs3UxcnEICSxjlOid84UFwvnM KPH2w2NmmI5pf5czwlXt+DEbquUZo8TNn6fZQKqEBdwkztyawwJiiwhYSHQ8PApWxCwwn1ni 0tSH7CAJNgFNib+bb4I18ArYSTz8MAPMZhFQlTgw4ToTiC0qECGxaNJEdogaQYkfk++BDeUU MJQ4fLYXrIYZaM6LL5NYIGx5ic1r3jJD2OISza03wX6QEHjLLnFoxU6gBg4gR1Zi0wGod1wk OjZvY4SwhSVeHd/CDmHLSHR2HGSC6O1mlPjUf4IdwpnCKPHvwwyobmuJw8cvskJs45OYtG06 M8QCXomONiGIEg+Jm+teMEKEHSUeb66GhNZHFokl76YzTmBUmIXkt1lI/pmF5J9ZSP5ZwMiy ilEktbQ4Nz212FCvODG3uDQvXS85P3cTIzCVnf53/P0OxqfNIYcYBTgYlXh4JzR4RQqxJpYV V+YeYpTgYFYS4f220ztSiDclsbIqtSg/vqg0J7X4EKM0B4uSOC/vqWsRQgLpiSWp2ampBalF MFkmDk6pBkamq0c5pLZpSTvt4nyX5S19psn46D21m/GH4k33P7sRre2V/MYz0PxzIufyR88a fnjwWT7kyf4w6cLtHUZP/S+/O2pr9D19/8rLpxpyU19sYMvf48CwIyXvSOPTx/VTHnhezYz8 YCG6NGXWFbWNpX/jfqxbq/byMMPU8i+p807zZHELBbz42VuqxFKckWioxVxUnAgAxhIlLGED AAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrDIsWRmVeSWpSXmKPExsVy+t/xq7oOh70jDSYdULZo6njLanHgxUIW i/lHzrFaXPn6ns2ic+ISdovLu+awWSy9fpHJ4kHLC1aL1r1H2C1+7prH4sDlsWbeGkaPy329 TB5PNl1k9Ng56y67x+yOmawem1Z1snnc7z7O5PH0x15mj8+b5AI4o9xsMlITU1KLFFLzkvNT MvPSbZVCQ9x0LZQU8hJzU22VInR9Q4KUFMoSc0qBPCMDNODgHOAerKRvl+CW8X3iOfaCSdoV f6bMZGlgbFLuYuTkkBAwkZj2dzkjhC0mceHeerYuRi4OIYEljBINL1eyQzjPGCU6ls5kAqkS FnCTOHNrDguILSJgIdHx8ChYB7PAQmaJ/zuuQ3V8ZJHYu3QFO0gVm4CmxN/NN9lAbF4BO4mH H2aA2SwCqhIHJlwHmyoqECGx6/oBVogaQYkfk++BbeAUMJQ4fLYXqIYDaIO6xJQpuSBhZgF5 ic1r3jJD2OISza03WSYwCs5C0j0LoWMWko5ZSDoWMLKsYhRJLS3OTc8tNtQrTswtLs1L10vO z93ECIzpbcd+bt7BeGlj8CFGAQ5GJR7eCQ1ekUKsiWXFlbmHGCU4mJVEeL/t9I4U4k1JrKxK LcqPLyrNSS0+xGgK9NpEZinR5HxguskriTc0MTS3NDQytrAwNzJSEuct+XAlXEggPbEkNTs1 tSC1CKaPiYNTqoGxYP/XP0u2fHJS/LA1gkdM2ypY0lffyW8Dh5JVWsyelq2bshmnCx7pEyxc lPlZMveNxr15/QLtJxSsbodMM5rx5Myeu5VLFIvMlKMX2O8PdMu2lS1/3hGhdPnjxOn2O/13 vhbTmHZURn13SMC8AGNp/o9z9046vGJHluEMZuGHh61Sy4/K+m9SYinOSDTUYi4qTgQAjAwr qf8CAAA= X-MTR: 20000000000000000@CPGS X-CMS-MailID: 20170622131648eucas1p1f1614e8f79324658a5e11b9897d736d9 X-Msg-Generator: CA X-Sender-IP: 182.198.249.179 X-Local-Sender: =?UTF-8?B?QW5kcnplaiBIYWpkYRtTUlBPTC1LZXJuZWwgKFRQKRvsgrw=?= =?UTF-8?B?7ISx7KCE7J6QG1NlbmlvciBTb2Z0d2FyZSBFbmdpbmVlcg==?= X-Global-Sender: =?UTF-8?B?QW5kcnplaiBIYWpkYRtTUlBPTC1LZXJuZWwgKFRQKRtTYW1z?= =?UTF-8?B?dW5nIEVsZWN0cm9uaWNzG1NlbmlvciBTb2Z0d2FyZSBFbmdpbmVlcg==?= X-Sender-Code: =?UTF-8?B?QzEwG0VIURtDMTBDRDAyQ0QwMjczOTI=?= CMS-TYPE: 201P X-HopCount: 7 X-CMS-RootMailID: 20170622092354epcas1p2eb523cbfb64a4da2dc0b188df760d493 X-RootMTR: 20170622092354epcas1p2eb523cbfb64a4da2dc0b188df760d493 References: <20170615204130.19255-1-eric@anholt.net> <20170615204130.19255-2-eric@anholt.net> <777ee1b1-e5ce-ea29-8a48-f792354a22d1@codeaurora.org> <871sqkouvr.fsf@eliezer.anholt.net> <8e148170-b626-b426-3c94-b93d2746f4ce@codeaurora.org> <871sqe7ei0.fsf@eliezer.anholt.net> <20170622112332.7ec7b65c@bbrezillon> <7ce4f741-309a-2eaa-381c-8033f089651a@samsung.com> <20170622144150.1663f649@bbrezillon> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 5414 Lines: 106 On 22.06.2017 14:41, Boris Brezillon wrote: > On Thu, 22 Jun 2017 14:29:07 +0200 > Andrzej Hajda wrote: > >> On 22.06.2017 11:23, Boris Brezillon wrote: >>> On Thu, 22 Jun 2017 13:47:43 +0530 >>> Archit Taneja wrote: >>> >>>> On 06/22/2017 01:20 PM, Benjamin Gaignard wrote: >>>>> 2017-06-20 19:31 GMT+02:00 Eric Anholt : >>>>>> Archit Taneja writes: >>>>>> >>>>>>> On 06/16/2017 08:13 PM, Eric Anholt wrote: >>>>>>>> Archit Taneja writes: >>>>>>>> >>>>>>>>> On 06/16/2017 02:11 AM, Eric Anholt wrote: >>>>>>>>>> If the panel-bridge is being set up after the drm_mode_config_reset(), >>>>>>>>>> then the connector's state would never get initialized, and we'd >>>>>>>>>> dereference the NULL in the hotplug path. We also need to register >>>>>>>>>> the connector, so that userspace can get at it. >>>>>>>>>> >>>>>>>>> Shouldn't the KMS driver make sure the panel-bridge is set up before >>>>>>>>> drm_mode_config_reset? Is it the case when we're inserting the >>>>>>>>> panel-bridge driver as a module? >>>>>>>>> >>>>>>>>> >>>>>>>>> All the connectors that have been added are registered automatically >>>>>>>>> when drm_dev_register() is called by the KMS driver. Registering a >>>>>>>>> connector in the middle of setting up our driver is prone to race >>>>>>>>> conditions if the userspace decides to use them immediately. >>>>>>>> Yeah, this is fixing initializing panel_bridge at DSI host_attach time, >>>>>>>> which in the case of a panel module that creates the DSI device >>>>>>>> (adv7533-style, like you said I should use as a reference) will be after >>>>>>>> drm_mode_config_reset() and drm_dev_register(). >>>>>>> Okay. In the case of the msm kms driver, we defer probe until the >>>>>>> adv7533 module is inserted, only then we proceed to drm_mode_config_reset() >>>>>>> and drm_dev_register(). I assumed this was the general practice followed by >>>>>>> most kms drivers. I.,e the kms driver defers probe until all connector >>>>>>> related modules are inserted, and only then proceed to create a drm device. >>>>>> The problem, though, is the panel driver needs the MIPI DSI host to >>>>>> exist to call mipi_dsi_device_register_full() during the probe process. >>>>>> The adv7533 driver gets around this by registering the DSI device in the >>>>>> bridge attach step, but drm_panel doesn't have an attach step. >>>> I'm not sure how we can get around this. We had discussion about this on irc >>>> recently, but couldn't come up with a good conclusion. We could come up with a >>>> panel_attach() callback to make it similar to bridges, but that's just us avoiding >>>> the real issue. >>> How about making DSI dev registration fully asynchronous, that is, DSI >>> devs declared in the DT under the DSI host node will be >>> registered/attached at probe time, and devs using another control bus >>> (like the adv7533 controller over i2c) will be registered afterwards. >>> >>> That implies moving the drm_brige registration logic outside of the DSI >>> host ->probe() path. The idea would be to check if all devs connected >>> to the DSI bus are ready at dsi_host->attach() time. If they are, we >>> can finally register the XXX -> DSI bridge. If they're not (because >>> some devs connected to the DSI bus have not been probed yet), then we >>> do not register the drm_bridge and wait for the next dsi_host->attach() >>> event. >> I guess you assumes that dsi-host knows all devs connected to it, thanks to: >> - subnodes of the host - ie. devices controlled via dsi bus, >> - graph links from host ports/endpoints - ie. devices controlled by >> other buses, for example adv7533. > Yep, but I think that's already a requirement when populating devices > with the OF graph method (if one of the DSI output endpoint does not > have a drm_bridge/panel attached to it, the DSI host driver returns > -EPROBE_DEFER). > >> I would separate both abstractions to make it more clear: >> 1. MIPI bus should be registered early - to allow create/bind devices on it, > Exactly. > >> 2. drm_bridge should be registered only if all required sinks >> (bridges/panels) are registered. > That's true, until we find a solution to support add DRM bridge hotplug. > >> First point seems OK, I am not sure about the 2nd one - if used >> consistently, it would require building pipeline from sink to source. > Yes. Since drm_bridge_attach requires encoder to be not null pipeline creation would be painful: 1. Every driver must call drm_of_find_panel_or_bridge on sink(s) before registering bridge and cache the result for later use. 2. After encoder finds directly connected bridge, it can attach it. 3. attach callback of every bridge should attach subsequent bridge. Quite complicated, maybe bridges should be chained w/o available encoder, and later attached to encoder with other helper, for example drm_bridge_chain_attach. Regards Andrzej > >> By the way is there any pipeline with two consecutive external bridges >> in the mainline? > I don't know if it exists in mainline, but I had to do that on my FPGA > platform when developing/testing Cadence DSI host driver. I had the > following chain and it worked just fine: > > CRTC -> DPI encoder -> DPI to DSI bridge -> DSI to DPI bridge -> DPI to HDMI bridge (adv7511) -> HDMI connector > > > >