[PATCH v2 12/26] drm/exynos: Split manager/display/subdrv

Stéphane Marchesin stephane.marchesin at gmail.com
Wed Oct 23 06:03:43 CEST 2013


On Tue, Oct 22, 2013 at 8:38 PM, Inki Dae <inki.dae at samsung.com> wrote:

> 2013/10/23 Stéphane Marchesin <stephane.marchesin at gmail.com>:
> >
> >
> >
> > On Tue, Oct 22, 2013 at 7:28 PM, Inki Dae <inki.dae at samsung.com> wrote:
> >>
> >> 2013/10/22 Sean Paul <seanpaul at chromium.org>:
> >> > On Tue, Oct 22, 2013 at 1:30 AM, Inki Dae <inki.dae at samsung.com>
> wrote:
> >> >>
> >> >>
> >> >>> -----Original Message-----
> >> >>> From: Sean Paul [mailto:seanpaul at chromium.org]
> >> >>> Sent: Tuesday, October 22, 2013 6:18 AM
> >> >>> To: Inki Dae
> >> >>> Cc: dri-devel; Dave Airlie; Tomasz Figa; Stéphane Marchesin
> >> >>> Subject: Re: [PATCH v2 12/26] drm/exynos: Split
> manager/display/subdrv
> >> >>>
> >> >>> On Mon, Oct 21, 2013 at 10:46 AM, Sean Paul <seanpaul at chromium.org>
> >> >>> wrote:
> >> >>> > On Thu, Oct 17, 2013 at 10:31 PM, Inki Dae <inki.dae at samsung.com>
> >> >>> > wrote:
> >> >>> >>
> >> >>> >>
> >> >>> >>> -----Original Message-----
> >> >>> >>> From: Sean Paul [mailto:seanpaul at chromium.org]
> >> >>> >>> Sent: Thursday, October 17, 2013 11:37 PM
> >> >>> >>> To: Inki Dae
> >> >>> >>> Cc: dri-devel; Dave Airlie; Tomasz Figa; Stéphane Marchesin
> >> >>> >>> Subject: Re: [PATCH v2 12/26] drm/exynos: Split
> >> >>> >>> manager/display/subdrv
> >> >>> >>>
> >> >>> >>> On Thu, Oct 17, 2013 at 4:21 AM, Inki Dae <inki.dae at samsung.com
> >
> >> >> wrote:
> >> >>> >>> >
> >> >>> >>> >
> >> >>> >>> >> -----Original Message-----
> >> >>> >>> >> From: Sean Paul [mailto:seanpaul at chromium.org]
> >> >>> >>> >> Sent: Thursday, October 17, 2013 4:27 AM
> >> >>> >>> >> To: dri-devel at lists.freedesktop.org; inki.dae at samsung.com
> >> >>> >>> >> Cc: airlied at linux.ie; tomasz.figa at gmail.com;
> >> >>> >>> >> marcheu at chromium.org;
> >> >>> Sean
> >> >>> >>> >> Paul
> >> >>> >>> >> Subject: [PATCH v2 12/26] drm/exynos: Split
> >> >>> >>> >> manager/display/subdrv
> >> >>> >>> >>
> >> >>> >>> >> This patch splits display and manager from subdrv. The result
> >> >>> >>> >> is
> >> >>> that
> >> >>> >>> >> crtc functions can directly call into manager callbacks and
> >> >>> >>> >> encoder
> >> >>> >>> >> functions can directly call into display callbacks. This will
> >> >>> >>> >> allow
> >> >>> >>> >> us to remove the exynos_drm_hdmi shim and support mixer/hdmi
> &
> >> >>> fimd/dp
> >> >>> >>> >> with common code.
> >> >>> >>> >>
> >> >>> >>> >> Signed-off-by: Sean Paul <seanpaul at chromium.org>
> >> >>> >>> >> ---
> >> >>> >>> >>
> >> >>> >>> >> Changes in v2:
> >> >>> >>> >>       - Pass display into display_ops instead of context
> >> >>> >>> >
> >> >>> >>> > Sorry but it seems like more reasonable to pass device object
> >> >>> >>> > into
> >> >>> >>> > display_ops and manager_ops.
> >> >>> >>> >
> >> >>> >>>
> >> >>> >>>
> >> >>> >>> So you've changed your mind from when you said the following?
> >> >>> >>>
> >> >>> >>> >>> manager->ops->xxx(manager, ...);
> >> >>> >>> >>> display->ops->xxx(display, ...);
> >> >>> >>> >>>
> >> >>> >>> >>> Agree.
> >> >>> >>>
> >> >>> >>
> >> >>> >>
> >> >>> >> True. Before that, My comment was to pass device object into
> >> >>> display_ops and
> >> >>> >> manager_ops, and then you said the good solution is to pass
> manager
> >> >>> >> and
> >> >>> >> display to each driver. At that time, I thought no matter how the
> >> >>> callback
> >> >>> >> is called if the framework doesn't call callbacks of each driver
> >> >>> >> with
> >> >>> ctx.
> >> >>> >> So I agreed.
> >> >>> >>
> >> >>> >>
> >> >>> >>> It would have been nice if you had changed your mind *before* I
> >> >>> >>> reworked everything. At any rate, I think it's still the right
> >> >>> >>> thing
> >> >>> >>> to do.
> >> >>> >>
> >> >>> >> Really sorry about that. And I will add new patch for it so you
> >> >>> >> don't
> >> >>> need
> >> >>> >> to concern about that.
> >> >>> >>
> >> >>> >>>
> >> >>> >>>
> >> >>> >>> > I'm not sure but display_ops could be implemented in other
> >> >>> >>> > framework
> >> >>> >>> based
> >> >>> >>> > driver such as CDF based lcd panel driver. So if you pass
> >> >>> >>> > display -
> >> >>> it's
> >> >>> >>> > specific to exynos drm framework - into display_ops, the other
> >> >>> framework
> >> >>> >>> > based driver should include specific exynos drm header.
> >> >>> >>> >
> >> >>> >>>
> >> >>> >>> AFAIK, CDF will not land in its current separate-from-drm form,
> we
> >> >>> >>> don't need to worry about this. Furthermore, these ops should
> just
> >> >>> >>> go
> >> >>> >>> away and become drm_crtc/drm_encoder/drm_connector funcs
> anyways.
> >> >>> >>>
> >> >>> >>
> >> >>> >> Can you assure the display_ops never implemented in other
> framework
> >> >>> based
> >> >>> >> driver, not CDF? At any rate, I think all possibilities should be
> >> >>> opened.
> >> >>> >>
> >> >>> >
> >> >>> > I don't think we should let an RFC framework make the code more
> >> >>> > complicated for unclear benefit. By removing manager/display
> >> >>> > entirely,
> >> >>> > we can get rid of a *lot* of other code that is basically just
> >> >>> > plumbing drm hooks (exynos_drm_connector is a good example).
> >> >>> >
> >> >>>
> >> >>> I hacked this up today to prove it out. Check out the top 5 commits
> in
> >> >>>
> >> >>>
> https://github.com/crseanpaul/exynos-drm-next/commits/linux-next-exynos-
> >> >>> staging.
> >> >>> It removes exynos_drm_connector in favor of just implementing
> >> >>> drm_connector directly. This same treatment should be done for
> >> >>> exynos_drm_encoder and exynos_drm_crtc, but I didn't get around to
> >> >>> doing this.
> >> >>>
> >> >>> As you can see, it cuts out a lot of code and removes an entire
> >> >>> abstraction layer. Much nicer :)
> >> >>>
> >> >>
> >> >> It seems that you implements connector in each device driver. Can't
> >> >> they be
> >> >> combined as common spot, exynos_connector, again to avoid codes from
> >> >> duplicated? :)
> >> >
> >> > There's nothing of substance being duplicated.
> >>
> >> Not true. xxx_create_connector is duplicated.
> >>
> >> > In fact, by getting rid
> >> > of the exynos_drm_connector layer, we deleted 150 lines. If you really
> >> > take a look at exynos_drm_connector, it's not doing anything useful.
> >>
> >> No, That is for each driver has no any dependency of drm framework.
> >>
> >> > All it does is translate the drm callbacks into display callbacks, so
> >> > I think it's much better to just implement the drm callbacks directly.
> >> >
> >>
> >> No, It has strongly dependency of drm framework. Assume that we
> >> implemented the drm callbacks directly, and then some features are
> >> added to drm framework, drm_connector side. At this time, we will have
> >> to take care of each device driver according to the change. That is
> >> really not good. Why device drivers should have dependency of drm
> >> framework? Just to reduce line counts?
> >
> >
> >
> > You seem to miss the point here and elsewhere in the discussion.
> > drm/exynos is a drm driver, and as such it should use the drm
> > framework,
>
> Hm.. you seem to miss something. Exynos drm based drivers are based on
> exynos drm framework, not drm framework directly. So I mean that
> Exynos drm framework based drivers should include only Exynos drm
> headers, _not drm header_ directly.
>

Well, I think everyone sees that exynos is different. But my point still
remains: why is the exynos driver in drm/ if it wants to use a different
framework? Right now it is blocking work on a proper drm driver...



>
> > especially if this reduces the line count and the code
> > complexity (as is the case for this patch series). If you don't want
> > to maintain a drm driver, it simply should be moved away from drm/,
> > and it should be replaced by a real drm driver in my opinion.
>
> So those drivers should be in drm/exynos. Isn't that you really mean
> those drivers should be driver/gpu/drm?


I don't understand this sentence, sorry.

Stéphane



> If so, That would really be
> horrible. :(
>
>


> Please, know that only Exynos drm framework, _not device drivers_, has
> all dependencies of drm framework, and also I know that other ARM
> based drm drivers are using same way.
>
> Thanks,
> Inki Dae
>
> >
> > Stéphane
> >
> >>
> >>
> >> > There are a bunch of real bugs that we've found as a result of having
> >> > these abstraction layers. Take, for example, dpms. Before this
> >> > patchset, dpms for fimd was being tracked separately in fimd driver,
> >> > exynos_drm_encoder, exynos_drm_crtc, and exynos_drm_connector.
> >> > Furthermore, during suspend, only fimd driver's dpms state was
> >> > updated, so the others were incorrect. There was also this weird
> >> > gymnastics that had to happen when dpms was changed in the encoder
> >> > since it had to walk up to the connector level to change its dpms
> >> > state. If fimd just directly implemented
> >> > drm_crtc/drm_encoder/drm_connector (before dp was moved in), this
> >> > problem wouldn't exist. The same goes for HDMI/mixer.
> >> >
> >>
> >> That is a issue we should take care of by using the independent layer.
> >> Then, aren't you take care of that well with the re-factoring patch
> >> set? :)  It seems that you are outside real point.
> >>
> >> > Take a look at exynos_drm_encoder.c  in my tree
> >> >
> >> > (
> https://github.com/crseanpaul/exynos-drm-next/blob/linux-next-exynos-staging/drivers/gpu/drm/exynos/exynos_drm_encoder.c
> ),
> >> > what does it do that's useful to abstract? All that it does is just
> >> > call display ops, it's completely useless. The same is true for
> >> > exynos_drm_connector, it's just dead weight. There is some useful
> >> > stuff in exynos_drm_crtc for page flipping, that would be better
> >> > served as a helper library, though.
> >> >
> >> >> The abstraction layer you mentioned also means a common spot.
> >> >> Another one, you patch also makes each sub driver have strongly
> >> >> dependency
> >> >> of drm framework. So how we can support existing backlight and lcd
> >> >> class
> >> >> based lcd panel drivers if the connector is implemented in each
> device
> >> >> driver later?  the drm header files should be included in
> >> >> drivers/video/backlight/xxx_lcd.c?
> >> >>
> >> >
> >> > drm_bridge or drm_panel seem like good candidates for this.
> >> >
> >>
> >> Yes, exynos_drm_display could be replaced with drm_panel later if the
> >> drm_panel can be merged to mainline.
> >>
> >> >
> >> >> And, I will introduce a new framework to support existing lcd panel
> >> >> drivers
> >> >> and display bus drivers soon; as of now for Exynos drm, and the
> >> >> framework is
> >> >> being tested internally. With this framework, encoder and connector
> >> >> will be
> >> >> created when lcd panel or display bus driver such as eDP is probed:
> it
> >> >> doesn’t really need to create encoder and connector in advance if lcd
> >> >> panel
> >> >> or display bus driver isn't probed yet. Regardless of crtc, and
> encoder
> >> >> and
> >> >> connector creation order, when last one is created, crtc and
> connector
> >> >> will
> >> >> be connected each other. And exynos_drm_display could be implemented
> in
> >> >> other frameworks if we have common structure for display device
> driver.
> >> >> And
> >> >> also the framework will support lvds driver according to Linux device
> >> >> driver
> >> >> model.
> >> >>
> >> >
> >> > I don't really follow what you're trying to do here, but I think we
> >> > should be moving in the direction of fewer abstractions in the exynos
> >> > driver, not more :)
> >> >
> >>
> >> Not abstraction layer, just a bridge for connecting crtc and its
> >> corresponding encoder/connector, and lvds regardless of creation
> >> order, and for connecting drm connector and other framework based
> >> display ops such as drm_panel later.
> >>
> >> > Sean
> >> >
> >> >
> >> >
> >> >> Thanks,
> >> >> Inki Dae
> >> >>
> >> >>> Sean
> >> >>>
> >> >>> >>>
> >> >>> >>> > And another one, the patch 6 passes manager object to
> >> >>> >>> > manager_ops,
> >> >>> and
> >> >>> >>> for
> >> >>> >>> > this, you made the manager object to be set to driver data;
> >> >>> >>> > platform_set_drvdata(pdev, &manager). That isn't reasonable.
> >> >>> Generally,
> >> >>> >>> > driver_data would point to device driver's context object.
> >> >>> >>> >
> >> >>> >>>
> >> >>> >>> I'm not sure why this isn't reasonable, but it's a moot point.
> The
> >> >>> >>> driver data is only used up until we get rid of the pm ops, it
> >> >>> >>> needn't
> >> >>> >>> be set at all once things go through dpms.
> >> >>> >>>
> >> >>> >>
> >> >>> >> Generally, device drivers can call its own internal functions,
> and
> >> >>> >> they
> >> >>> will
> >> >>> >> call that functions with ctx. However, if you set manager to
> >> >>> driver_data
> >> >>> >> then that functions should be called with manager object and also
> >> >>> internally
> >> >>> >> that functions should get ctx from the manager object. What is
> the
> >> >>> purpose
> >> >>> >> of manager? Do you think it's reasonable?
> >> >>> >>
> >> >>> >
> >> >>> > So, to avoid setting the manager as the drvdata, we could
> implement
> >> >>> > something like fimd_dpms_ctx(ctx, mode) that takes ctx and the
> >> >>> > manager
> >> >>> > callback calls it fimd_dpms(mgr, mode) { ctx = mgr->ctx;
> >> >>> > fimd_dpms_ctx(ctx, mode); }. Alternatively, you can save a pointer
> >> >>> > to
> >> >>> > mgr in ctx, but that creates a circular link between the two. IMO,
> >> >>> > both of those solutions suck :)
> >> >>> >
> >> >>> > I'd much rather just set drvdata to the manager and call the hook
> >> >>> > directly. Like I said earlier, this is just a temporary step since
> >> >>> > we
> >> >>> > remove these pm ops later in the patch series.
> >> >>> >
> >> >>> > Sean
> >> >>> >
> >> >>> >
> >> >>> >> Anyway, I'd like to say really sorry about inconvenient again.
> So I
> >> >>> will fix
> >> >>> >> it.
> >> >>> >>
> >> >>> >> Thanks,
> >> >>> >> Inki Dae
> >> >>> >>
> >> >>> >>> Sean
> >> >>> >>>
> >> >>> >>>
> >> >>> >>> > Thanks,
> >> >>> >>> > Inki Dae
> >> >>> >>> >
> >> >>> >>
> >> >>
> >> > _______________________________________________
> >> > dri-devel mailing list
> >> > dri-devel at lists.freedesktop.org
> >> > http://lists.freedesktop.org/mailman/listinfo/dri-devel
> >> _______________________________________________
> >> dri-devel mailing list
> >> dri-devel at lists.freedesktop.org
> >> http://lists.freedesktop.org/mailman/listinfo/dri-devel
> >
> >
> >
> > _______________________________________________
> > dri-devel mailing list
> > dri-devel at lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/dri-devel
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/dri-devel/attachments/20131022/722b4c30/attachment-0001.html>


More information about the dri-devel mailing list