From: Yong Wu <yong.wu@mediatek.com>
To: Stephen Boyd <swboyd@chromium.org>
Cc: youlin.pei@mediatek.com, Saravana Kannan <saravanak@google.com>,
Will Deacon <will@kernel.org>,
Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Joerg Roedel <joro@8bytes.org>,
"Rafael J. Wysocki" <rafael@kernel.org>,
Douglas Anderson <dianders@chromium.org>,
dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org,
Daniel Vetter <daniel.vetter@ffwll.ch>,
iommu@lists.linux-foundation.org,
linux-mediatek@lists.infradead.org,
linux-arm-msm@vger.kernel.org,
Russell King <rmk+kernel@arm.linux.org.uk>,
freedreno@lists.freedesktop.org
Subject: Re: [PATCH v5 25/32] iommu/mtk: Migrate to aggregate driver
Date: Sat, 15 Jan 2022 15:39:52 +0800 [thread overview]
Message-ID: <fc7207eb9958c487fec5679da73d8f3595cc7bb1.camel@mediatek.com> (raw)
In-Reply-To: <CAE-0n53ao52UX3sJ67UQ3dgj0-DZ0xTeo-NrmW5YVAuXfAnxZw@mail.gmail.com>
On Fri, 2022-01-14 at 15:30 -0600, Stephen Boyd wrote:
> Quoting Yong Wu (2022-01-14 01:06:31)
> > On Wed, 2022-01-12 at 20:25 -0800, Stephen Boyd wrote:
> > > >
> > > > [ 2.654526] ------------[ cut here ]------------
> > > > [ 2.655558] refcount_t: addition on 0; use-after-free.
> > > >
> > > > After this patch, the aggregate_driver flow looks ok. But our
> > > > driver
> > > > still aborts like this:
> > > >
> > > > [ 2.721316] Unable to handle kernel NULL pointer dereference
> > > > at
> > > > virtual address 0000000000000000
> > > > ...
> > > > [ 2.731658] pc :
> > > > mtk_smi_larb_config_port_gen2_general+0xa4/0x138
> > > > [ 2.732434] lr : mtk_smi_larb_resume+0x54/0x98
> > > > ...
> > > > [ 2.742457] Call trace:
> > > > [ 2.742768] mtk_smi_larb_config_port_gen2_general+0xa4/0x13
> > > > 8
> > > > [ 2.743496] pm_generic_runtime_resume+0x2c/0x48
> > > > [ 2.744090] __genpd_runtime_resume+0x30/0xa8
> > > > [ 2.744648] genpd_runtime_resume+0x94/0x2c8
> > > > [ 2.745191] __rpm_callback+0x44/0x150
> > > > [ 2.745669] rpm_callback+0x6c/0x78
> > > > [ 2.746114] rpm_resume+0x314/0x558
> > > > [ 2.746559] __pm_runtime_resume+0x3c/0x88
> > > > [ 2.747080] pm_runtime_get_suppliers+0x7c/0x110
> > > > [ 2.747668] __driver_probe_device+0x4c/0xe8
> > > > [ 2.748212] driver_probe_device+0x44/0x130
> > > > [ 2.748745] __device_attach_driver+0x98/0xd0
> > > > [ 2.749300] bus_for_each_drv+0x68/0xd0
> > > > [ 2.749787] __device_attach+0xec/0x148
> > > > [ 2.750277] device_attach+0x14/0x20
> > > > [ 2.750733] bus_rescan_devices_helper+0x50/0x90
> > > > [ 2.751319] bus_for_each_dev+0x7c/0xd8
> > > > [ 2.751806] bus_rescan_devices+0x20/0x30
> > > > [ 2.752315] __component_add+0x7c/0xa0
> > > > [ 2.752795] component_add+0x14/0x20
> > > > [ 2.753253] mtk_smi_larb_probe+0xe0/0x120
> > > >
> > > > This is because the device runtime_resume is called before the
> > > > bind
> > > > operation(In our case this detailed function is
> > > > mtk_smi_larb_bind).
> > > > The issue doesn't happen without this patchset. I'm not sure
> > > > the
> > > > right
> > > > sequence. If we should fix in mediatek driver, the patch could
> > > > be:
> > >
> > > Oh, the runtime PM is moved around with these patches. The
> > > aggregate
> > > device is runtime PM enabled before the probe is called,
> >
> > In our case, the component device may probe before the aggregate
> > device. thus the component device runtime PM has already been
> > enabled
> > when aggregate device probe.
>
> This is always the case. The component device always probes before
> the
> aggregate device because the component device registers with the
> component framework. But the component device can decide to enable
> runtime PM during driver probe or during component bind.
>
> >
> > > and there are
> > > supplier links made to each component, so each component is
> > > runtime
> > > resumed before the aggregate probe function is called.
> >
> > Yes. This is the current flow.
>
> Got it.
>
> >
> > > It means that all
> > > the component drivers need to have their resources ready to power
> > > on
> > > before their component_bind() callback is made.
> >
> > Sorry, I don't understand here well. In this case, The component
> > drivers prepare the resource for power on in the component_bind
> > since
> > the resource comes from the aggregate driver. Thus, we expect the
> > component_bind run before the runtime resume callback.
>
> What resource comes from the aggregate device that the component
> device manages in runtime PM?
Here the aggregate device is the iommu device. It knows who enabled the
iommu from the dtsi, then transfers this information to the
component(smi_larb) devices. smi_larb will configure the registers to
enable iommu for these masters in the runtime resume.
> >
> > Another solution is moving the component's pm_runtime_enable into
> > the
> > component_bind(It's mtk_smi_larb_bind here), then the runtime
> > callback
> > is called after component_bind in which the resource for power on
> > is
> > ready.
>
> This sounds more correct to me. I'm not an expert on runtime PM
> though
> as I always have to read the code to remember how it works. if the
> device isn't ready for runtime PM until the component bind function
> is
> called then runtime PM shouldn't be enabled on the component device.
Anyway, We should update the SMI driver for this case. I prepare a
patch into this patchset or I send it independently? which way is
better?
The patch could be:
diff --git a/drivers/memory/mtk-smi.c b/drivers/memory/mtk-smi.c
index b883dcc0bbfa..88854c2270a1 100644
--- a/drivers/memory/mtk-smi.c
+++ b/drivers/memory/mtk-smi.c
@@ -175,6 +175,8 @@ mtk_smi_larb_bind(struct device *dev, struct device
*master, void *data)
larb->larbid = i;
larb->mmu = &larb_mmu[i].mmu;
larb->bank = larb_mmu[i].bank;
+
+ pm_runtime_enable(dev);
return 0;
}
}
@@ -450,7 +452,6 @@ static int mtk_smi_larb_probe(struct
platform_device *pdev)
if (ret < 0)
return ret;
- pm_runtime_enable(dev);
platform_set_drvdata(pdev, larb);
ret = component_add(dev, &mtk_smi_larb_component_ops);
if (ret)
Thanks.
next prev parent reply other threads:[~2022-01-15 7:40 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-01-06 21:45 [PATCH v5 00/32] component: Make into an aggregate bus Stephen Boyd
2022-01-06 21:45 ` [PATCH v5 01/32] component: Replace most references to 'master' with 'aggregate device' Stephen Boyd
2022-01-06 21:45 ` [PATCH v5 02/32] component: Introduce the aggregate bus_type Stephen Boyd
2022-01-06 21:45 ` [PATCH v5 03/32] component: Move struct aggregate_device out to header file Stephen Boyd
2022-01-07 13:07 ` Jani Nikula
2022-01-07 20:12 ` Stephen Boyd
2022-01-10 11:23 ` Jani Nikula
2022-01-06 21:45 ` [PATCH v5 04/32] component: Add {bind, unbind}_component() ops that take aggregate device Stephen Boyd
2022-01-06 21:45 ` [PATCH v5 05/32] drm/of: Add a drm_of_aggregate_probe() API Stephen Boyd
2022-01-06 21:45 ` [PATCH v5 06/32] drm/msm: Migrate to aggregate driver Stephen Boyd
2022-01-06 21:45 ` [PATCH v5 07/32] drm/komeda: " Stephen Boyd
2022-01-06 21:45 ` [PATCH v5 08/32] drm/arm/hdlcd: " Stephen Boyd
2022-01-06 21:45 ` [PATCH v5 09/32] drm/malidp: " Stephen Boyd
2022-01-06 21:45 ` [PATCH v5 10/32] drm/armada: " Stephen Boyd
2022-01-06 21:45 ` [PATCH v5 11/32] drm/etnaviv: " Stephen Boyd
2022-01-06 21:45 ` [PATCH v5 12/32] drm/kirin: " Stephen Boyd
2022-01-06 21:45 ` [PATCH v5 13/32] drm/exynos: " Stephen Boyd
2022-01-06 21:45 ` [PATCH v5 14/32] drm/imx: " Stephen Boyd
2022-01-06 21:45 ` [PATCH v5 15/32] drm/ingenic: " Stephen Boyd
2022-01-06 21:45 ` [PATCH v5 16/32] drm/mcde: " Stephen Boyd
2022-01-06 21:45 ` [PATCH v5 17/32] drm/mediatek: " Stephen Boyd
2022-01-06 21:45 ` [PATCH v5 18/32] drm/meson: " Stephen Boyd
2022-01-06 21:45 ` [PATCH v5 19/32] drm/omap: " Stephen Boyd
2022-01-06 21:45 ` [PATCH v5 20/32] drm/rockchip: " Stephen Boyd
2022-01-06 21:45 ` [PATCH v5 21/32] drm/sti: " Stephen Boyd
2022-01-06 21:45 ` [PATCH v5 22/32] drm/sun4i: " Stephen Boyd
2022-01-06 21:45 ` [PATCH v5 23/32] drm/tilcdc: " Stephen Boyd
2022-01-06 21:45 ` [PATCH v5 24/32] drm/vc4: " Stephen Boyd
2022-01-06 21:45 ` [PATCH v5 25/32] iommu/mtk: " Stephen Boyd
2022-01-11 12:22 ` Yong Wu
2022-01-12 0:27 ` Stephen Boyd
2022-01-12 9:09 ` Yong Wu
2022-01-13 4:25 ` Stephen Boyd
2022-01-14 9:06 ` Yong Wu
2022-01-14 21:30 ` Stephen Boyd
2022-01-15 7:39 ` Yong Wu [this message]
2022-01-15 7:50 ` Stephen Boyd
2022-01-06 21:45 ` [PATCH v5 26/32] mei: " Stephen Boyd
2022-01-06 21:45 ` [PATCH v5 27/32] power: supply: ab8500: " Stephen Boyd
2022-01-06 21:45 ` [PATCH v5 28/32] fbdev: omap2: " Stephen Boyd
2022-01-06 21:45 ` [PATCH v5 29/32] sound: hdac: " Stephen Boyd
2022-01-06 21:45 ` [PATCH v5 30/32] ASoC: codecs: wcd938x: " Stephen Boyd
2022-01-06 21:45 ` [PATCH v5 31/32] component: Get rid of drm_of_component_probe() Stephen Boyd
2022-01-06 21:45 ` [PATCH v5 32/32] component: Remove component_master_ops and friends Stephen Boyd
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=fc7207eb9958c487fec5679da73d8f3595cc7bb1.camel@mediatek.com \
--to=yong.wu@mediatek.com \
--cc=daniel.vetter@ffwll.ch \
--cc=dianders@chromium.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=freedreno@lists.freedesktop.org \
--cc=gregkh@linuxfoundation.org \
--cc=iommu@lists.linux-foundation.org \
--cc=joro@8bytes.org \
--cc=krzysztof.kozlowski@canonical.com \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mediatek@lists.infradead.org \
--cc=rafael@kernel.org \
--cc=rmk+kernel@arm.linux.org.uk \
--cc=saravanak@google.com \
--cc=swboyd@chromium.org \
--cc=will@kernel.org \
--cc=youlin.pei@mediatek.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox