All of lore.kernel.org
 help / color / mirror / Atom feed
From: Boris Brezillon <boris.brezillon@free-electrons.com>
To: Andrzej Hajda <a.hajda@samsung.com>
Cc: Archit Taneja <architt@codeaurora.org>,
	Laurent Pinchart <Laurent.pinchart@ideasonboard.com>,
	Mark Rutland <mark.rutland@arm.com>,
	devicetree@vger.kernel.org,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	"dri-devel@lists.freedesktop.org"
	<dri-devel@lists.freedesktop.org>,
	Philippe Cornu <philippe.cornu@st.com>,
	Rob Herring <robh+dt@kernel.org>,
	Thierry Reding <thierry.reding@gmail.com>
Subject: Re: [PATCH 1/7] drm/bridge: Support hotplugging panel-bridge.
Date: Fri, 23 Jun 2017 09:32:55 +0200	[thread overview]
Message-ID: <20170623093255.06f22df0@bbrezillon> (raw)
In-Reply-To: <4a64ad72-1e3b-d9e9-4800-e543264fa8f7@samsung.com>

On Fri, 23 Jun 2017 09:22:15 +0200
Andrzej Hajda <a.hajda@samsung.com> wrote:

> On 22.06.2017 15:34, Boris Brezillon wrote:
> > On Thu, 22 Jun 2017 15:16:47 +0200
> > Andrzej Hajda <a.hajda@samsung.com> wrote:
> >  
> >> On 22.06.2017 14:41, Boris Brezillon wrote:  
> >>> On Thu, 22 Jun 2017 14:29:07 +0200
> >>> Andrzej Hajda <a.hajda@samsung.com> wrote:
> >>>    
> >>>> On 22.06.2017 11:23, Boris Brezillon wrote:    
> >>>>> On Thu, 22 Jun 2017 13:47:43 +0530
> >>>>> Archit Taneja <architt@codeaurora.org> wrote:
> >>>>>      
> >>>>>> On 06/22/2017 01:20 PM, Benjamin Gaignard wrote:      
> >>>>>>> 2017-06-20 19:31 GMT+02:00 Eric Anholt <eric@anholt.net>:        
> >>>>>>>> Archit Taneja <architt@codeaurora.org> writes:
> >>>>>>>>        
> >>>>>>>>> On 06/16/2017 08:13 PM, Eric Anholt wrote:        
> >>>>>>>>>> Archit Taneja <architt@codeaurora.org> 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.  
> > Shouldn't be hard to do since dsi_host->attach() is called each time a
> > sink is added (and ready to use). All you need to do is retrieve the
> > bridge pointer and put it in a list embedded in the DSI host priv
> > struct. Once you have all sinks added to this list (can be checked by
> > counting the number of endpoints and DSI devs at probe time), you can
> > register the DSI bridge and wait for someone to call ->attach() on it.
> >
> > In the ->attach() hook of the DSI bridge, you'll have to attach all
> > sinks stored in the list to the DSI bridge. Note that right now you have
> > a 1:1 relationship, which prevents you from having one DSI bridge that
> > can attach to different bridges available on the DSI bus (e.g. DSI ->
> > HDMI bridge on channel 0 and DSI -> LVDS bridge on channel 1).
> >  
> >> 2. After encoder finds directly connected bridge, it can attach it.  
> > I don't get that one.  
> 
> If you have pipeline:
> 
> crtc -> encoder -> bridge1 -> bridge2 -> panel
> 
> encoder knows only about bridge1, and must wait till it is registered,
> before attaching it,
> and assuming bridge must wait for its sinks before registration the
> whole pipeline construction will look like:
> 
> 0. encoder waits for bridge1, bridge1 waits for bridge2, bridge2 waits
> for panel, usually by deferring.
> 1. panel is registered.
> 2. bridge2 finds panel and is registered.
> 3. bridge1 finds bridge2 and is registered.
> 4. encoder finds bridge1 and attach it to encoder,
> 4a. bridge1->attach() attach bridge2 to encoder after bridge1
> 4b. bridge2->attach() attach panel to bridge2
> 
> This is why it seems for me quite complicated.

But that's already what happens in most drivers today (probably because
things were designed before connector hotplug was supported). I agree,
it's far from ideal, but until we get full-hotplug support, we'll have
to rely on such hacks.

WARNING: multiple messages have this Message-ID (diff)
From: Boris Brezillon <boris.brezillon@free-electrons.com>
To: Andrzej Hajda <a.hajda@samsung.com>
Cc: Mark Rutland <mark.rutland@arm.com>,
	devicetree@vger.kernel.org,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	"dri-devel@lists.freedesktop.org"
	<dri-devel@lists.freedesktop.org>,
	Philippe Cornu <philippe.cornu@st.com>,
	Rob Herring <robh+dt@kernel.org>,
	Thierry Reding <thierry.reding@gmail.com>,
	Laurent Pinchart <Laurent.pinchart@ideasonboard.com>
Subject: Re: [PATCH 1/7] drm/bridge: Support hotplugging panel-bridge.
Date: Fri, 23 Jun 2017 09:32:55 +0200	[thread overview]
Message-ID: <20170623093255.06f22df0@bbrezillon> (raw)
In-Reply-To: <4a64ad72-1e3b-d9e9-4800-e543264fa8f7@samsung.com>

On Fri, 23 Jun 2017 09:22:15 +0200
Andrzej Hajda <a.hajda@samsung.com> wrote:

> On 22.06.2017 15:34, Boris Brezillon wrote:
> > On Thu, 22 Jun 2017 15:16:47 +0200
> > Andrzej Hajda <a.hajda@samsung.com> wrote:
> >  
> >> On 22.06.2017 14:41, Boris Brezillon wrote:  
> >>> On Thu, 22 Jun 2017 14:29:07 +0200
> >>> Andrzej Hajda <a.hajda@samsung.com> wrote:
> >>>    
> >>>> On 22.06.2017 11:23, Boris Brezillon wrote:    
> >>>>> On Thu, 22 Jun 2017 13:47:43 +0530
> >>>>> Archit Taneja <architt@codeaurora.org> wrote:
> >>>>>      
> >>>>>> On 06/22/2017 01:20 PM, Benjamin Gaignard wrote:      
> >>>>>>> 2017-06-20 19:31 GMT+02:00 Eric Anholt <eric@anholt.net>:        
> >>>>>>>> Archit Taneja <architt@codeaurora.org> writes:
> >>>>>>>>        
> >>>>>>>>> On 06/16/2017 08:13 PM, Eric Anholt wrote:        
> >>>>>>>>>> Archit Taneja <architt@codeaurora.org> 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.  
> > Shouldn't be hard to do since dsi_host->attach() is called each time a
> > sink is added (and ready to use). All you need to do is retrieve the
> > bridge pointer and put it in a list embedded in the DSI host priv
> > struct. Once you have all sinks added to this list (can be checked by
> > counting the number of endpoints and DSI devs at probe time), you can
> > register the DSI bridge and wait for someone to call ->attach() on it.
> >
> > In the ->attach() hook of the DSI bridge, you'll have to attach all
> > sinks stored in the list to the DSI bridge. Note that right now you have
> > a 1:1 relationship, which prevents you from having one DSI bridge that
> > can attach to different bridges available on the DSI bus (e.g. DSI ->
> > HDMI bridge on channel 0 and DSI -> LVDS bridge on channel 1).
> >  
> >> 2. After encoder finds directly connected bridge, it can attach it.  
> > I don't get that one.  
> 
> If you have pipeline:
> 
> crtc -> encoder -> bridge1 -> bridge2 -> panel
> 
> encoder knows only about bridge1, and must wait till it is registered,
> before attaching it,
> and assuming bridge must wait for its sinks before registration the
> whole pipeline construction will look like:
> 
> 0. encoder waits for bridge1, bridge1 waits for bridge2, bridge2 waits
> for panel, usually by deferring.
> 1. panel is registered.
> 2. bridge2 finds panel and is registered.
> 3. bridge1 finds bridge2 and is registered.
> 4. encoder finds bridge1 and attach it to encoder,
> 4a. bridge1->attach() attach bridge2 to encoder after bridge1
> 4b. bridge2->attach() attach panel to bridge2
> 
> This is why it seems for me quite complicated.

But that's already what happens in most drivers today (probably because
things were designed before connector hotplug was supported). I agree,
it's far from ideal, but until we get full-hotplug support, we'll have
to rely on such hacks.

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

  reply	other threads:[~2017-06-23  7:32 UTC|newest]

Thread overview: 56+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-06-15 20:41 [PATCH 0/7] RPi touchscreen as a panel driver again Eric Anholt
2017-06-15 20:41 ` Eric Anholt
2017-06-15 20:41 ` [PATCH 1/7] drm/bridge: Support hotplugging panel-bridge Eric Anholt
2017-06-15 20:41   ` Eric Anholt
2017-06-16  5:43   ` Archit Taneja
2017-06-16  5:43     ` Archit Taneja
2017-06-16 14:43     ` Eric Anholt
2017-06-16 14:43       ` Eric Anholt
2017-06-20  3:48       ` Archit Taneja
2017-06-20  3:48         ` Archit Taneja
2017-06-20  7:31         ` Laurent Pinchart
2017-06-20  7:31           ` Laurent Pinchart
2017-06-20 17:31         ` Eric Anholt
2017-06-20 17:31           ` Eric Anholt
2017-06-22  7:50           ` Benjamin Gaignard
2017-06-22  7:50             ` Benjamin Gaignard
2017-06-22  8:17             ` Archit Taneja
2017-06-22  8:17               ` Archit Taneja
2017-06-22  9:23               ` Boris Brezillon
2017-06-22  9:23                 ` Boris Brezillon
2017-06-22 12:29                 ` Andrzej Hajda
2017-06-22 12:29                   ` Andrzej Hajda
2017-06-22 12:41                   ` Boris Brezillon
2017-06-22 12:41                     ` Boris Brezillon
2017-06-22 13:16                     ` Andrzej Hajda
2017-06-22 13:16                       ` Andrzej Hajda
2017-06-22 13:34                       ` Boris Brezillon
2017-06-22 13:34                         ` Boris Brezillon
2017-06-23  7:22                         ` Andrzej Hajda
2017-06-23  7:22                           ` Andrzej Hajda
2017-06-23  7:32                           ` Boris Brezillon [this message]
2017-06-23  7:32                             ` Boris Brezillon
2017-06-23 13:54                         ` Archit Taneja
2017-06-23 21:50                 ` Eric Anholt
2017-06-23 21:50                   ` Eric Anholt
2017-06-27  6:53                   ` Archit Taneja
2017-06-27  6:53                     ` Archit Taneja
2017-06-22  9:31               ` Philippe CORNU
2017-06-22  9:31                 ` Philippe CORNU
2017-06-23 21:36               ` Eric Anholt
2017-06-23 21:36                 ` Eric Anholt
2017-06-23  9:04   ` Daniel Vetter
2017-06-23  9:04     ` Daniel Vetter
2017-06-15 20:41 ` [PATCH 2/7] drm/vc4: Fix DSI T_INIT timing Eric Anholt
2017-06-15 20:41   ` Eric Anholt
2017-06-15 20:41 ` [PATCH 3/7] drm/vc4: Fix misleading name of the continuous flag Eric Anholt
2017-06-15 20:41   ` Eric Anholt
2017-06-15 20:41 ` [PATCH 4/7] drm/vc4: Use drm_mode_vrefresh() in DSI fixup, in case vrefresh is 0 Eric Anholt
2017-06-15 20:41   ` Eric Anholt
2017-06-15 20:41 ` [PATCH 5/7] dt-bindings: Document the Raspberry Pi Touchscreen nodes Eric Anholt
2017-06-23 18:44   ` Rob Herring
2017-06-23 18:44     ` Rob Herring
2017-06-15 20:41 ` [PATCH 6/7] drm/panel: Add support for the Raspberry Pi 7" Touchscreen Eric Anholt
2017-06-15 20:41   ` Eric Anholt
2017-06-15 20:41 ` [PATCH 7/7] ARM: dts: bcm2835: Enable the Raspberry Pi touchscreen panel Eric Anholt
2017-06-15 20:41   ` Eric Anholt

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170623093255.06f22df0@bbrezillon \
    --to=boris.brezillon@free-electrons.com \
    --cc=Laurent.pinchart@ideasonboard.com \
    --cc=a.hajda@samsung.com \
    --cc=architt@codeaurora.org \
    --cc=devicetree@vger.kernel.org \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=philippe.cornu@st.com \
    --cc=robh+dt@kernel.org \
    --cc=thierry.reding@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.