Linux-ARM-Kernel Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Liu Ying <victor.liu@nxp.com>
To: Piyush Patle <piyushpatle228@gmail.com>
Cc: dri-devel@lists.freedesktop.org, imx@lists.linux.dev,
	linux-arm-kernel@lists.infradead.org, marex@nabladev.com,
	daniel.baluta@nxp.com, Frank.Li@nxp.com, shawnguo@kernel.org,
	tzimmermann@suse.de, maarten.lankhorst@linux.intel.com,
	mripard@kernel.org, airlied@gmail.com, simona@ffwll.ch
Subject: Re: [RFC] drm/imx: upstream direction for i.MX95 display support
Date: Tue, 7 Jul 2026 10:26:09 +0800	[thread overview]
Message-ID: <akxjwULa-p6c6IvR@raspi> (raw)
In-Reply-To: <CAMB+xka8Fame7aFZSiWEtVcozSTXX8g9MKJu+cycU2vtiSDHmQ@mail.gmail.com>

On Mon, Jul 06, 2026 at 08:31:42PM +0530, Piyush Patle wrote:
> On Mon, Jul 6, 2026 at 4:00 PM Liu Ying <victor.liu@nxp.com> wrote:
> >
> > On Mon, Jul 06, 2026 at 03:15:24PM +0530, Piyush Patle wrote:
> > > On Mon, Jul 6, 2026 at 8:07 AM Liu Ying <victor.liu@nxp.com> wrote:
> > > >
> > > > On Sun, Jul 05, 2026 at 03:33:51AM +0530, Piyush Patle wrote:
> > > > > On Fri, Jun 26, 2026 at 3:22 PM Liu Ying <victor.liu@nxp.com> wrote:
> > > > > >
> > > > > > On Wed, Jun 24, 2026 at 03:33:18PM +0530, Piyush Patle wrote:
> > > > > >
> > > > > > [...]
> > > > > >
> > > > > > > The current dc/ implementation is a multi-device component driver
> > > with one
> > > > > > > platform_driver per block bound via the component framework. The
> > > downstream
> > > > > > > i.MX95 driver is a single monolithic platform_driver mapping all
> > > blocks from
> > > > > > > one register base. Unifying appears to require reconciling two bind
> > > models,
> > > > > > > rather than only adding match_data.
> > > > > >
> > > > > > I think that upstream i.MX95 display controller driver would also be
> > > based
> > > > > > on the component helper.  That's something for sure.
> > > > > >
> > > > > > [...]
> > > > > >
> > > > > > > There is also anticipated divergence which is not yet upstream
> > > (i.MX8QXP
> > > > > > > prefetch/PRG, LTS and tiling modifiers, and the downstream i.MX95
> > > blit
> > > > > > > engine), although mainline dc/ is KMS-only today.
> > > > > >
> > > > > > Just want to point out that I sent out v5 patch set[2] to add i.MX8QXP
> > > > > > prefetch engine(DPRC + PRG) support for KMS.  That changes the
> > > driver's
> > > > > > mode setting code a lot.
> > > > > >
> > > > > > [2]
> > > https://lore.kernel.org/all/20251027-imx8-dc-prefetch-v5-0-4ecb6c6d4941@nxp.com/
> > > > > >
> > > > > > [...]
> > > > > >
> > > > > > > One question for Liu Ying is whether the separate-driver plus shared
> > > > > > > helper-library approach is still the preferred direction, and where
> > > the
> > > > > > > helper boundary would be drawn (which blocks/ops are shared versus
> > > > > > > implemented per driver).
> > > > > >
> > > > > > Yes, separate DRM drivers + a helper library approach is still the
> > > direction
> > > > > > I want.  I think that the drivers and library would sit in the same
> > > > > > directory drivers/gpu/drm/imx/dc/.
> > > > > >
> > > > > > The purpose to add a library is to share code to reduce overall code
> > > lines.
> > > > > > I'd assume that shared blocks or common part of slightly different
> > > blocks
> > > > > > should be covered by the library.
> > > > > >
> > > > > > [...]
> > > > > >
> > > > > > > how the component and monolithic driver models
> > > > > > > would be reconciled given the differences described above.
> > > > > >
> > > > > > Like I said above, I don't think upstream driver would be monolithic.
> > > > > >
> > > > > > --
> > > > > > Regards,
> > > > > > Liu Ying
> > > > >
> > > > > Hi Liu,
> > > >
> > > > Hi Piyush,
> > > >
> > > > >
> > > > > A quick follow-up with some progress.
> > > > > I went ahead with the refactoring we discussed and now have it working
> > > on the
> > > > > i.MX95 15x15 FRDM, following the component-based model.
> > > > > The common implementations for ConstFrame, ExtDst, LayerBlend, FrameGen
> > > and
> > > > > the FetchUnit base have been moved into shared dc-lib-* helpers, with
> > > >
> > > > Can you please share the code in a public place, like github?
> > > >
> > >
> > > Sure. I've pushed the current work-in-progress branch here:
> > > https://github.com/PiyushPatle26/linux-mecha-im95-wip/tree/imx95-dc-preview
> >
> > I gave this branch a quick look.  The major problem is that you are using
> > the same 'struct drm_driver dc_drm_driver' for i.MX95 and i.MX8QXP display
> > controllers instead of using separate DRM drivers.  From userspace's POV,
> > they should see different driver names(drm_driver.name).  From drivers'
> > POVs, they should implement different mode setting callbacks.
> 
> I've reworked it based on your feedback and updated version to the same branch
> I've split them into separate DRM drivers.
> The shared dc_drm_driver and dc-drv-common.c are gone. i.MX8QXP and i.MX95
> now each have their own struct drm_driver, component bind path, probe logic and
> mode-setting callbacks. Userspace now also sees different driver names
> for the two SoCs.

It seems that there are common stuff that can be shared between dc-drv-imx95.c
and dc-drv-imx8qxp.c.

Please don't rename driver name from "imx8-dc" to "imx8qxp-dc".  Diver name
is supposed to be stable ABI.  "imx8-dc" implies that the driver would support
both i.MX8QXP display controller and i.MX8QM display controller which have
some H/W differences but still fit into a same driver.

I'm not sure why you mention 'DC8000' in your code.  We don't have this term
internally to describe the display controllers.

Those i.MX95 clocks used by dc-drv-imx95.c are not correct.  I'd assume only
cfg/axi/ocram clocks are needed.

> 
> The mode_valid, atomic_check, atomic_begin and atomic_flush callbacks
> were already
> identical in the previous version, so I've left them as a small shared
> helper to avoid
> duplicating the same code. If they diverge later, I'll split them into
> separate implementations.

It seems that mode-setting callbacks in dc-plane.c are still shared, which
seems to be worth splitting.

> 
> >
> > It looks like it's not worth extracting common code into those dc-lib-* files.
> > Each dc-[block].c is a library itself, though I could be wrong - after all,
> > I haven't find a time slice to add i.MX95 blocks to them and see how they
> > will be.
> >
> 
> Agreed. I removed the dc-lib-* split. The shared register code is now placed
> directly inside each dc-[block].c file, so every block stays
> self-contained while
> still being reused by both drivers where needed.

Didn't look into dc-[block].c files in detail.  Maybe, things need to be
improved there too.

> 
> > The idea is to share some code between the two DRM drivers *naturally*.
> >
> > >
> > > The files you asked about are:
> > > drivers/gpu/drm/imx/dc/dc-drv-common.c
> > > drivers/gpu/drm/imx/dc/dc-lib-*.c
> > > One thing I'd like to point out is that the pixel interleaver, display pixel
> > > link, LDB and LVDS PHY drivers are ports of the existing NXP downstream
> > > drivers. The new work in this branch is mainly the DC refactoring into the
> > > component model and the shared helper library.
> > > > > SoC-specific register layouts and tables supplied as data. The per-SoC
> > > glue is
> > > > > split into dc-drv-common.c, dc-drv-imx8qxp.c and dc-drv-imx95.c, while
> > > >
> > > > Same here, just want to see how dc-drv-common.c and dc-lib-* would look
> > > like.
> > > >
> > > The files you mentioned are available under:
> > > drivers/gpu/drm/imx/dc/dc-drv-common.c
> > > drivers/gpu/drm/imx/dc/dc-lib-*.c
> > > The helper library currently contains the common implementations for
> > > ConstFrame, ExtDst, LayerBlend, FrameGen and the FetchUnit base.
> > >
> > > > > i.MX95-specific blocks such as DomainBlend, Dither, FetchEco, FetchYUV,
> > > > > HScaler and VScaler remain separate component drivers.
> > > >
> > > > i.MX8QXP display controller also has Dither, FetchEco, HScaler and
> > > Vscaler,
> > > > so they are not i.MX95-specific blocks.  To add minimal feautures at
> > > first,
> > > > we don't need to support them as of now.  i.MX95-specific FetchYUV is
> > > similar
> > > > to i.MX8QXP-specific FetchDecode, so maybe FetchYUV won't be a separate
> > > > component driver at the end of the day.  To start up small, I think the
> > > > must-have DomainBlend and Dither(for Data-Enable, HSync and VSync polarity
> > > > controls) and two FetchLayers can be enabled to support two display
> > > pipelines.
> > > >
> > >
> > > Okay, I've reduced the implementation accordingly. The current branch
> > > only keeps DomainBlend, Dither and two FetchLayers. FetchEco, FetchYUV,
> > > HScaler and VScaler have been dropped for now.
> > > > BTW, do you have the i.MX95 TRM?  If no, then it would be difficult for
> > > you
> > > > to add DT bindings for *all* blocks.  Note that the DT bindings are
> > > supposed
> > > > to be complete at the first place.
> > > >
> > >
> > > Yes, I do.
> > >
> > > > >
> > > > > The implementation is functional on the FRDM over the pipeline
> > > > > DPU -> pixel-interleaver -> pixel-link -> LDB -> LVDS PHY -> IT6263 ->
> > > HDMI
> > > >
> > > > As I said before in separate mail thread, pixel link is not used in the
> > > LVDS
> > > > display pipeline, but instead it's only used in the MIPI DSI display
> > > pipeline.
> > > >
> > >
> > > Thanks for pointing that out. After checking the TRM, I updated the DT graph
> > > so the LVDS pipeline is now:
> > >
> > > DC -> Pixel-interleaver -> LDB -> LVDS PHY -> IT6263 -> HDMI
> >
> > Yes, this pipeline is correct.
> >
> > >
> > > Removing display_pixel_link from the LVDS path also required moving the
> > > bridge
> > > format translation into the pixel interleaver driver.
> > > > >
> > > > > EDID is read successfully, the initial modeset works for all tested
> > > modes
> > > > > (1920x1080@60, 1280x720@60, 720x480 and 640x480), and Weston and sway
> > > both run.
> > > > >
> > > > > There are still two known limitations. The initial modeset works, but
> > > > > subsequent mode changes currently wedge the ExtDst content shadow load,
> > > which
> > > > > appears related to the lack of a reset path for the i.MX95 FrameGen.
> > > >
> > > > Not sure what's the cause of the issue, but FrameGen needs to be disabled
> > > and
> > > > then re-enabled if you want to do a full modeset.  I'd say that's not a
> > > reset
> > > > path.  This critical issue needs to be fixed before posting formal
> > > patches.
> > > >
> > >
> > > Understood. I'll continue investigating the modeset issue before posting the
> > > formal patch series.
> > >
> > > > > In
> > > > > addition, the DSI path is implemented on the DC side but remains
> > > unvalidated.
> > > >
> > > > It's fine to support the LVDS display pipeline first as long as it doesn't
> > > > do harm to the MIPI DSI display pipeline support.  So, maybe drop the
> > > latter
> > > > first.
> > >
> > > I've done that in the current branch. It now focuses only on the validated
> > > LVDS pipeline.
> > >
> > > >
> > > > >
> > > > > The implementation is currently based on v7.2-rc1 together with your
> > > prefetch
> > > > > v5 series.
> > > > >
> > > > > The work is now ready to be posted as patch series: Adding LVDS/DSI
> > > > > i.MX95 support.
> > > > >
> > > > >
> > > > > Regards,
> > > > > Piyush Patle
> > > >
> > > > --
> > > > Regards,
> > > > Liu Ying
> > >
> > > Thanks again for taking the time to review this.
> > >
> > > Regards,
> > > Piyush Patle
> >
> > --
> > Regards,
> > Liu Ying
> 
> framegen re-tune issue is still unresolved.
> I'll fix that before posting the formal patch series.

I need to point out that i.MX95 display controller also has 2 display engines
and 1 pixel engine, which is something missing in your code.  This makes me
think that you have no enough i.MX95 display controller documents.

Generally speaking, I'd say there is a lot to be improved before posting the
formal patch series.  Gut feeling is that maybe it's a bit too difficult
for you to get the drivers right.  As I said earlier, my original plan is to
add i.MX8QXP prefetch engine support first with the posted patch series and
then to add i.MX95 display controller support, but maybe I can try to add the
latter first - just need to find a time slot.  However, adding prefetch engine
support first would directly show a reason to people why two DRM drivers are
warranted when adding i.MX95 display controller support.

> 
> Regards,
> Piyush Patle

-- 
Regards,
Liu Ying


      reply	other threads:[~2026-07-07  2:24 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-06-24 10:03 [RFC] drm/imx: upstream direction for i.MX95 display support Piyush Patle
2026-06-26  9:53 ` Liu Ying
2026-06-26 19:53   ` Piyush Patle
2026-07-04 22:03   ` Piyush Patle
2026-07-06  2:38     ` Liu Ying
     [not found]       ` <CAMB+xkY2rut-sEUMyFnXqYCNmyseP4nAGj4BfreORTTM=SN8_g@mail.gmail.com>
2026-07-06 10:32         ` Liu Ying
2026-07-06 15:01           ` Piyush Patle
2026-07-07  2:26             ` Liu Ying [this message]

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=akxjwULa-p6c6IvR@raspi \
    --to=victor.liu@nxp.com \
    --cc=Frank.Li@nxp.com \
    --cc=airlied@gmail.com \
    --cc=daniel.baluta@nxp.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=imx@lists.linux.dev \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=maarten.lankhorst@linux.intel.com \
    --cc=marex@nabladev.com \
    --cc=mripard@kernel.org \
    --cc=piyushpatle228@gmail.com \
    --cc=shawnguo@kernel.org \
    --cc=simona@ffwll.ch \
    --cc=tzimmermann@suse.de \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox