* [PATCH v3 0/7] Fix RK3588 GPU domain
@ 2024-10-22 15:41 Sebastian Reichel
2024-10-22 15:41 ` [PATCH v3 1/7] regulator: Add (devm_)of_regulator_get() Sebastian Reichel
` (8 more replies)
0 siblings, 9 replies; 17+ messages in thread
From: Sebastian Reichel @ 2024-10-22 15:41 UTC (permalink / raw)
To: Rob Herring, Krzysztof Kozlowski, Conor Dooley, Heiko Stuebner,
Ulf Hansson, Mark Brown
Cc: Liam Girdwood, Elaine Zhang, Adrián Martínez Larumbe,
Boris Brezillon, Chen-Yu Tsai, devicetree, linux-rockchip,
linux-kernel, linux-pm, Sebastian Reichel, kernel
Hi,
I got a report, that the Linux kernel crashes on Rock 5B when the panthor
driver is loaded late after booting. The crash starts with the following
shortened error print:
rockchip-pm-domain fd8d8000.power-management:power-controller: failed to set domain 'gpu', val=0
rockchip-pm-domain fd8d8000.power-management:power-controller: failed to get ack on domain 'gpu', val=0xa9fff
SError Interrupt on CPU4, code 0x00000000be000411 -- SError
This series first does some cleanups in the Rockchip power domain
driver and changes the driver, so that it no longer tries to continue
when it fails to enable a domain. This gets rid of the SError interrupt
and long backtraces. But the kernel still hangs when it fails to enable
a power domain. I have not done further analysis to check if that can
be avoided.
Last but not least this provides a fix for the GPU power domain failing
to get enabled - after some testing from my side it seems to require the
GPU voltage supply to be enabled.
This series is now based on the pull request from Mark Brown:
https://lore.kernel.org/linux-pm/ZvsVfQ1fuSVZpF6A@finisterre.sirena.org.uk/
I added one more patch, which adds devm_of_regulator_get without the
_optional suffix, since that is more sensible for the Rockchip usecase.
Longer explanation can be seen in patch 6, which adds the handling to
the Rockchip driver. My merge suggestion would be that Mark adds the
regulator patch on top of the immutable branch and creates a new pull
request.
The last patch, which updates the RK3588 board files only covers the
boards from 6.12-rc1. Any board missing the update will behave as before,
so it is perfectly fine not to update all DT files at once.
Changes since PATCHv2:
* https://lore.kernel.org/linux-rockchip/20240919091834.83572-1-sebastian.reichel@collabora.com/
* Rebase to 6.12-rc1 + devm_of_regulator_get_optional branch (Ulf Hansson, Chen-Yu Tsai)
- Introduce devm_of_regulator_get()
- Add code to only request regulators for domains needing them
* Mention other platforms in the DT binding patch (Rob Murphy)
* Update more RK3588 DT files (Jonas Karlman)
Changes since PATCHv1:
* https://lore.kernel.org/all/20240910180530.47194-1-sebastian.reichel@collabora.com/
* Collect Reviewed-by/Acked-by/Tested-by
* swap first and second patch to avoid introducing and directly removing a mutex_unlock
* fix spelling of indentation
* fix double empty line after rockchip_pd_regulator_disable()
Greetings,
-- Sebastian
Sebastian Reichel (7):
regulator: Add (devm_)of_regulator_get()
pmdomain: rockchip: cleanup mutex handling in rockchip_pd_power
pmdomain: rockchip: forward rockchip_do_pmu_set_power_domain errors
pmdomain: rockchip: reduce indentation in rockchip_pd_power
dt-bindings: power: rockchip: add regulator support
pmdomain: rockchip: add regulator support
arm64: dts: rockchip: Add GPU power domain regulator dependency for
RK3588
.../power/rockchip,power-controller.yaml | 3 +
.../boot/dts/rockchip/rk3588-armsom-sige7.dts | 4 +
arch/arm64/boot/dts/rockchip/rk3588-base.dtsi | 2 +-
.../boot/dts/rockchip/rk3588-coolpi-cm5.dtsi | 4 +
.../rockchip/rk3588-edgeble-neu6a-common.dtsi | 4 +
.../boot/dts/rockchip/rk3588-evb1-v10.dts | 4 +
.../boot/dts/rockchip/rk3588-fet3588-c.dtsi | 4 +
.../rockchip/rk3588-friendlyelec-cm3588.dtsi | 4 +
.../arm64/boot/dts/rockchip/rk3588-jaguar.dts | 4 +
.../boot/dts/rockchip/rk3588-nanopc-t6.dtsi | 4 +
.../boot/dts/rockchip/rk3588-ok3588-c.dts | 4 +
.../dts/rockchip/rk3588-orangepi-5-plus.dts | 4 +
.../boot/dts/rockchip/rk3588-quartzpro64.dts | 4 +
.../boot/dts/rockchip/rk3588-rock-5-itx.dts | 4 +
.../boot/dts/rockchip/rk3588-rock-5b.dts | 4 +
.../arm64/boot/dts/rockchip/rk3588-tiger.dtsi | 4 +
.../boot/dts/rockchip/rk3588-toybrick-x0.dts | 4 +
.../boot/dts/rockchip/rk3588-turing-rk1.dtsi | 4 +
.../boot/dts/rockchip/rk3588s-coolpi-4b.dts | 4 +
.../dts/rockchip/rk3588s-gameforce-ace.dts | 4 +
.../dts/rockchip/rk3588s-indiedroid-nova.dts | 4 +
.../dts/rockchip/rk3588s-khadas-edge2.dts | 4 +
.../boot/dts/rockchip/rk3588s-nanopi-r6s.dts | 4 +
.../boot/dts/rockchip/rk3588s-odroid-m2.dts | 4 +
.../boot/dts/rockchip/rk3588s-orangepi-5.dts | 4 +
.../boot/dts/rockchip/rk3588s-rock-5a.dts | 4 +
drivers/pmdomain/rockchip/pm-domains.c | 190 +++++++++++-------
drivers/regulator/devres.c | 17 ++
drivers/regulator/of_regulator.c | 21 ++
include/linux/regulator/consumer.h | 6 +
30 files changed, 266 insertions(+), 69 deletions(-)
--
2.45.2
^ permalink raw reply [flat|nested] 17+ messages in thread* [PATCH v3 1/7] regulator: Add (devm_)of_regulator_get() 2024-10-22 15:41 [PATCH v3 0/7] Fix RK3588 GPU domain Sebastian Reichel @ 2024-10-22 15:41 ` Sebastian Reichel 2024-10-22 15:41 ` [PATCH v3 2/7] pmdomain: rockchip: cleanup mutex handling in rockchip_pd_power Sebastian Reichel ` (7 subsequent siblings) 8 siblings, 0 replies; 17+ messages in thread From: Sebastian Reichel @ 2024-10-22 15:41 UTC (permalink / raw) To: Rob Herring, Krzysztof Kozlowski, Conor Dooley, Heiko Stuebner, Ulf Hansson, Mark Brown Cc: Liam Girdwood, Elaine Zhang, Adrián Martínez Larumbe, Boris Brezillon, Chen-Yu Tsai, devicetree, linux-rockchip, linux-kernel, linux-pm, Sebastian Reichel, kernel The Rockchip power-domain controller also plans to make use of per-domain regulators similar to the MediaTek power-domain controller. Since existing DTs are missing the regulator information, the kernel should fallback to the automatically created dummy regulator if necessary. Thus the version without the _optional suffix is needed. The Rockchip driver plans to use the managed version, but to be consistent with existing code the unmanaged version is added at the same time. Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com> --- drivers/regulator/devres.c | 17 +++++++++++++++++ drivers/regulator/of_regulator.c | 21 +++++++++++++++++++++ include/linux/regulator/consumer.h | 6 ++++++ 3 files changed, 44 insertions(+) diff --git a/drivers/regulator/devres.c b/drivers/regulator/devres.c index 36164aec30e8..a3a3ccc711fc 100644 --- a/drivers/regulator/devres.c +++ b/drivers/regulator/devres.c @@ -771,6 +771,23 @@ static struct regulator *_devm_of_regulator_get(struct device *dev, struct devic return regulator; } +/** + * devm_of_regulator_get - Resource managed of_regulator_get() + * @dev: device used for dev_printk() messages and resource lifetime management + * @node: device node for regulator "consumer" + * @id: supply name or regulator ID. + * + * Managed of_regulator_get(). Regulators returned from this + * function are automatically regulator_put() on driver detach. See + * of_regulator_get() for more information. + */ +struct regulator *devm_of_regulator_get(struct device *dev, struct device_node *node, + const char *id) +{ + return _devm_of_regulator_get(dev, node, id, NORMAL_GET); +} +EXPORT_SYMBOL_GPL(devm_of_regulator_get); + /** * devm_of_regulator_get_optional - Resource managed of_regulator_get_optional() * @dev: device used for dev_printk() messages and resource lifetime management diff --git a/drivers/regulator/of_regulator.c b/drivers/regulator/of_regulator.c index 3d85762beda6..31a5bacd99b4 100644 --- a/drivers/regulator/of_regulator.c +++ b/drivers/regulator/of_regulator.c @@ -682,6 +682,27 @@ struct regulator *_of_regulator_get(struct device *dev, struct device_node *node return _regulator_get_common(r, dev, id, get_type); } +/** + * of_regulator_get - get regulator via device tree lookup + * @dev: device used for dev_printk() messages + * @node: device node for regulator "consumer" + * @id: Supply name + * + * Return: pointer to struct regulator corresponding to the regulator producer, + * or PTR_ERR() encoded error number. + * + * This is intended for use by consumers that want to get a regulator + * supply directly from a device node. This will _not_ consider supply + * aliases. See regulator_dev_lookup(). + */ +struct regulator *of_regulator_get(struct device *dev, + struct device_node *node, + const char *id) +{ + return _of_regulator_get(dev, node, id, NORMAL_GET); +} +EXPORT_SYMBOL_GPL(of_regulator_get); + /** * of_regulator_get_optional - get optional regulator via device tree lookup * @dev: device used for dev_printk() messages diff --git a/include/linux/regulator/consumer.h b/include/linux/regulator/consumer.h index 8c3c372ad735..5903ae7444ae 100644 --- a/include/linux/regulator/consumer.h +++ b/include/linux/regulator/consumer.h @@ -169,6 +169,12 @@ void regulator_put(struct regulator *regulator); void devm_regulator_put(struct regulator *regulator); #if IS_ENABLED(CONFIG_OF) +struct regulator *__must_check of_regulator_get(struct device *dev, + struct device_node *node, + const char *id); +struct regulator *__must_check devm_of_regulator_get(struct device *dev, + struct device_node *node, + const char *id); struct regulator *__must_check of_regulator_get_optional(struct device *dev, struct device_node *node, const char *id); -- 2.45.2 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v3 2/7] pmdomain: rockchip: cleanup mutex handling in rockchip_pd_power 2024-10-22 15:41 [PATCH v3 0/7] Fix RK3588 GPU domain Sebastian Reichel 2024-10-22 15:41 ` [PATCH v3 1/7] regulator: Add (devm_)of_regulator_get() Sebastian Reichel @ 2024-10-22 15:41 ` Sebastian Reichel 2024-10-22 15:41 ` [PATCH v3 3/7] pmdomain: rockchip: forward rockchip_do_pmu_set_power_domain errors Sebastian Reichel ` (6 subsequent siblings) 8 siblings, 0 replies; 17+ messages in thread From: Sebastian Reichel @ 2024-10-22 15:41 UTC (permalink / raw) To: Rob Herring, Krzysztof Kozlowski, Conor Dooley, Heiko Stuebner, Ulf Hansson, Mark Brown Cc: Liam Girdwood, Elaine Zhang, Adrián Martínez Larumbe, Boris Brezillon, Chen-Yu Tsai, devicetree, linux-rockchip, linux-kernel, linux-pm, Sebastian Reichel, kernel Use the cleanup infrastructure to handle the mutex, which slightly improve code readability for this function. Reviewed-by: Heiko Stuebner <heiko@sntech.de> Tested-by: Adrian Larumbe <adrian.larumbe@collabora.com> # On Rock 5B Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com> --- drivers/pmdomain/rockchip/pm-domains.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/drivers/pmdomain/rockchip/pm-domains.c b/drivers/pmdomain/rockchip/pm-domains.c index cb0f93800138..a161ee13c633 100644 --- a/drivers/pmdomain/rockchip/pm-domains.c +++ b/drivers/pmdomain/rockchip/pm-domains.c @@ -574,13 +574,12 @@ static int rockchip_pd_power(struct rockchip_pm_domain *pd, bool power_on) struct rockchip_pmu *pmu = pd->pmu; int ret; - mutex_lock(&pmu->mutex); + guard(mutex)(&pmu->mutex); if (rockchip_pmu_domain_is_on(pd) != power_on) { ret = clk_bulk_enable(pd->num_clks, pd->clks); if (ret < 0) { dev_err(pmu->dev, "failed to enable clocks\n"); - mutex_unlock(&pmu->mutex); return ret; } @@ -606,7 +605,6 @@ static int rockchip_pd_power(struct rockchip_pm_domain *pd, bool power_on) clk_bulk_disable(pd->num_clks, pd->clks); } - mutex_unlock(&pmu->mutex); return 0; } -- 2.45.2 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v3 3/7] pmdomain: rockchip: forward rockchip_do_pmu_set_power_domain errors 2024-10-22 15:41 [PATCH v3 0/7] Fix RK3588 GPU domain Sebastian Reichel 2024-10-22 15:41 ` [PATCH v3 1/7] regulator: Add (devm_)of_regulator_get() Sebastian Reichel 2024-10-22 15:41 ` [PATCH v3 2/7] pmdomain: rockchip: cleanup mutex handling in rockchip_pd_power Sebastian Reichel @ 2024-10-22 15:41 ` Sebastian Reichel 2024-10-22 15:41 ` [PATCH v3 4/7] pmdomain: rockchip: reduce indentation in rockchip_pd_power Sebastian Reichel ` (5 subsequent siblings) 8 siblings, 0 replies; 17+ messages in thread From: Sebastian Reichel @ 2024-10-22 15:41 UTC (permalink / raw) To: Rob Herring, Krzysztof Kozlowski, Conor Dooley, Heiko Stuebner, Ulf Hansson, Mark Brown Cc: Liam Girdwood, Elaine Zhang, Adrián Martínez Larumbe, Boris Brezillon, Chen-Yu Tsai, devicetree, linux-rockchip, linux-kernel, linux-pm, Sebastian Reichel, kernel Currently rockchip_do_pmu_set_power_domain prints a warning if there have been errors turning on the power domain, but it does not return any errors and rockchip_pd_power() tries to continue setting up the QOS registers. This usually results in accessing unpowered registers, which triggers an SError and a full system hang. This improves the error handling by forwarding the error to avoid kernel panics. Reviewed-by: Heiko Stuebner <heiko@sntech.de> Tested-by: Adrian Larumbe <adrian.larumbe@collabora.com> # On Rock 5B Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com> --- drivers/pmdomain/rockchip/pm-domains.c | 34 +++++++++++++++++--------- 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/drivers/pmdomain/rockchip/pm-domains.c b/drivers/pmdomain/rockchip/pm-domains.c index a161ee13c633..8f440f2883db 100644 --- a/drivers/pmdomain/rockchip/pm-domains.c +++ b/drivers/pmdomain/rockchip/pm-domains.c @@ -533,16 +533,17 @@ static int rockchip_pmu_domain_mem_reset(struct rockchip_pm_domain *pd) return ret; } -static void rockchip_do_pmu_set_power_domain(struct rockchip_pm_domain *pd, - bool on) +static int rockchip_do_pmu_set_power_domain(struct rockchip_pm_domain *pd, + bool on) { struct rockchip_pmu *pmu = pd->pmu; struct generic_pm_domain *genpd = &pd->genpd; u32 pd_pwr_offset = pd->info->pwr_offset; bool is_on, is_mem_on = false; + int ret; if (pd->info->pwr_mask == 0) - return; + return 0; if (on && pd->info->mem_status_mask) is_mem_on = rockchip_pmu_domain_is_mem_on(pd); @@ -557,16 +558,21 @@ static void rockchip_do_pmu_set_power_domain(struct rockchip_pm_domain *pd, wmb(); - if (is_mem_on && rockchip_pmu_domain_mem_reset(pd)) - return; + if (is_mem_on) { + ret = rockchip_pmu_domain_mem_reset(pd); + if (ret) + return ret; + } - if (readx_poll_timeout_atomic(rockchip_pmu_domain_is_on, pd, is_on, - is_on == on, 0, 10000)) { - dev_err(pmu->dev, - "failed to set domain '%s', val=%d\n", - genpd->name, is_on); - return; + ret = readx_poll_timeout_atomic(rockchip_pmu_domain_is_on, pd, is_on, + is_on == on, 0, 10000); + if (ret) { + dev_err(pmu->dev, "failed to set domain '%s' %s, val=%d\n", + genpd->name, on ? "on" : "off", is_on); + return ret; } + + return 0; } static int rockchip_pd_power(struct rockchip_pm_domain *pd, bool power_on) @@ -592,7 +598,11 @@ static int rockchip_pd_power(struct rockchip_pm_domain *pd, bool power_on) rockchip_pmu_set_idle_request(pd, true); } - rockchip_do_pmu_set_power_domain(pd, power_on); + ret = rockchip_do_pmu_set_power_domain(pd, power_on); + if (ret < 0) { + clk_bulk_disable(pd->num_clks, pd->clks); + return ret; + } if (power_on) { /* if powering up, leave idle mode */ -- 2.45.2 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v3 4/7] pmdomain: rockchip: reduce indentation in rockchip_pd_power 2024-10-22 15:41 [PATCH v3 0/7] Fix RK3588 GPU domain Sebastian Reichel ` (2 preceding siblings ...) 2024-10-22 15:41 ` [PATCH v3 3/7] pmdomain: rockchip: forward rockchip_do_pmu_set_power_domain errors Sebastian Reichel @ 2024-10-22 15:41 ` Sebastian Reichel 2024-10-22 15:41 ` [PATCH v3 5/7] dt-bindings: power: rockchip: add regulator support Sebastian Reichel ` (4 subsequent siblings) 8 siblings, 0 replies; 17+ messages in thread From: Sebastian Reichel @ 2024-10-22 15:41 UTC (permalink / raw) To: Rob Herring, Krzysztof Kozlowski, Conor Dooley, Heiko Stuebner, Ulf Hansson, Mark Brown Cc: Liam Girdwood, Elaine Zhang, Adrián Martínez Larumbe, Boris Brezillon, Chen-Yu Tsai, devicetree, linux-rockchip, linux-kernel, linux-pm, Sebastian Reichel, kernel Rework the logic, so that the function exits early when the power domain state is already correct to reduce code indentation. No functional change intended. Reviewed-by: Heiko Stuebner <heiko@sntech.de> Tested-by: Adrian Larumbe <adrian.larumbe@collabora.com> # On Rock 5B Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com> --- drivers/pmdomain/rockchip/pm-domains.c | 49 +++++++++++++------------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/drivers/pmdomain/rockchip/pm-domains.c b/drivers/pmdomain/rockchip/pm-domains.c index 8f440f2883db..f4e555dac20a 100644 --- a/drivers/pmdomain/rockchip/pm-domains.c +++ b/drivers/pmdomain/rockchip/pm-domains.c @@ -582,39 +582,40 @@ static int rockchip_pd_power(struct rockchip_pm_domain *pd, bool power_on) guard(mutex)(&pmu->mutex); - if (rockchip_pmu_domain_is_on(pd) != power_on) { - ret = clk_bulk_enable(pd->num_clks, pd->clks); - if (ret < 0) { - dev_err(pmu->dev, "failed to enable clocks\n"); - return ret; - } + if (rockchip_pmu_domain_is_on(pd) == power_on) + return 0; - rockchip_pmu_ungate_clk(pd, true); + ret = clk_bulk_enable(pd->num_clks, pd->clks); + if (ret < 0) { + dev_err(pmu->dev, "failed to enable clocks\n"); + return ret; + } - if (!power_on) { - rockchip_pmu_save_qos(pd); + rockchip_pmu_ungate_clk(pd, true); - /* if powering down, idle request to NIU first */ - rockchip_pmu_set_idle_request(pd, true); - } + if (!power_on) { + rockchip_pmu_save_qos(pd); - ret = rockchip_do_pmu_set_power_domain(pd, power_on); - if (ret < 0) { - clk_bulk_disable(pd->num_clks, pd->clks); - return ret; - } + /* if powering down, idle request to NIU first */ + rockchip_pmu_set_idle_request(pd, true); + } - if (power_on) { - /* if powering up, leave idle mode */ - rockchip_pmu_set_idle_request(pd, false); + ret = rockchip_do_pmu_set_power_domain(pd, power_on); + if (ret < 0) { + clk_bulk_disable(pd->num_clks, pd->clks); + return ret; + } - rockchip_pmu_restore_qos(pd); - } + if (power_on) { + /* if powering up, leave idle mode */ + rockchip_pmu_set_idle_request(pd, false); - rockchip_pmu_ungate_clk(pd, false); - clk_bulk_disable(pd->num_clks, pd->clks); + rockchip_pmu_restore_qos(pd); } + rockchip_pmu_ungate_clk(pd, false); + clk_bulk_disable(pd->num_clks, pd->clks); + return 0; } -- 2.45.2 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v3 5/7] dt-bindings: power: rockchip: add regulator support 2024-10-22 15:41 [PATCH v3 0/7] Fix RK3588 GPU domain Sebastian Reichel ` (3 preceding siblings ...) 2024-10-22 15:41 ` [PATCH v3 4/7] pmdomain: rockchip: reduce indentation in rockchip_pd_power Sebastian Reichel @ 2024-10-22 15:41 ` Sebastian Reichel 2024-10-22 15:41 ` [PATCH v3 6/7] pmdomain: " Sebastian Reichel ` (3 subsequent siblings) 8 siblings, 0 replies; 17+ messages in thread From: Sebastian Reichel @ 2024-10-22 15:41 UTC (permalink / raw) To: Rob Herring, Krzysztof Kozlowski, Conor Dooley, Heiko Stuebner, Ulf Hansson, Mark Brown Cc: Liam Girdwood, Elaine Zhang, Adrián Martínez Larumbe, Boris Brezillon, Chen-Yu Tsai, devicetree, linux-rockchip, linux-kernel, linux-pm, Sebastian Reichel, kernel Add optional support for a voltage supply required to enable a power domain. The binding follows the way it is handled by the Mediatek binding to keep things consistent. This will initially be used by the RK3588 GPU power domain, which fails to be enabled when the GPU regulator is not enabled. It is not limited to that platform, since older generations have similar requirements. They worked around this by marking the regulators as always-on instead of describing the dependency. Reviewed-by: Heiko Stuebner <heiko@sntech.de> Acked-by: Rob Herring (Arm) <robh@kernel.org> Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com> --- .../devicetree/bindings/power/rockchip,power-controller.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Documentation/devicetree/bindings/power/rockchip,power-controller.yaml b/Documentation/devicetree/bindings/power/rockchip,power-controller.yaml index 650dc0aae6f5..ebab98987e49 100644 --- a/Documentation/devicetree/bindings/power/rockchip,power-controller.yaml +++ b/Documentation/devicetree/bindings/power/rockchip,power-controller.yaml @@ -132,6 +132,9 @@ $defs: A number of phandles to clocks that need to be enabled while power domain switches state. + domain-supply: + description: domain regulator supply. + pm_qos: $ref: /schemas/types.yaml#/definitions/phandle-array items: -- 2.45.2 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v3 6/7] pmdomain: rockchip: add regulator support 2024-10-22 15:41 [PATCH v3 0/7] Fix RK3588 GPU domain Sebastian Reichel ` (4 preceding siblings ...) 2024-10-22 15:41 ` [PATCH v3 5/7] dt-bindings: power: rockchip: add regulator support Sebastian Reichel @ 2024-10-22 15:41 ` Sebastian Reichel 2024-10-22 15:41 ` [PATCH v3 7/7] arm64: dts: rockchip: Add GPU power domain regulator dependency for RK3588 Sebastian Reichel ` (2 subsequent siblings) 8 siblings, 0 replies; 17+ messages in thread From: Sebastian Reichel @ 2024-10-22 15:41 UTC (permalink / raw) To: Rob Herring, Krzysztof Kozlowski, Conor Dooley, Heiko Stuebner, Ulf Hansson, Mark Brown Cc: Liam Girdwood, Elaine Zhang, Adrián Martínez Larumbe, Boris Brezillon, Chen-Yu Tsai, devicetree, linux-rockchip, linux-kernel, linux-pm, Sebastian Reichel, kernel Some power domains require extra voltages to be applied. For example trying to enable the GPU power domain on RK3588 fails when the SoC does not have VDD GPU enabled. The same is expected to happen for the NPU, which also has a dedicated supply line. We get the regulator using devm_of_regulator_get(), so a missing dependency in the devicetree is handled gracefully by printing a warning and creating a dummy regulator. This is necessary, since existing DTs do not have the regulator described. They might still work if the regulator is marked as always-on. It is also working if the regulator is enabled at boot time and the GPU driver is probed before the kernel disables unused regulators. The regulator itself is not acquired at driver probe time, since that creates an unsolvable circular dependency. The power domain driver must be probed early, since SoC peripherals need it. Regulators on the other hand depend on SoC peripherals like SPI, I2C or GPIO. MediaTek does not run into this, since they have two power domain drivers. Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com> --- drivers/pmdomain/rockchip/pm-domains.c | 113 +++++++++++++++++-------- 1 file changed, 79 insertions(+), 34 deletions(-) diff --git a/drivers/pmdomain/rockchip/pm-domains.c b/drivers/pmdomain/rockchip/pm-domains.c index f4e555dac20a..31c71b6fddf1 100644 --- a/drivers/pmdomain/rockchip/pm-domains.c +++ b/drivers/pmdomain/rockchip/pm-domains.c @@ -18,6 +18,7 @@ #include <linux/of_clk.h> #include <linux/clk.h> #include <linux/regmap.h> +#include <linux/regulator/consumer.h> #include <linux/mfd/syscon.h> #include <soc/rockchip/pm_domains.h> #include <dt-bindings/power/px30-power.h> @@ -44,6 +45,7 @@ struct rockchip_domain_info { int idle_mask; int ack_mask; bool active_wakeup; + bool need_regulator; int pwr_w_mask; int req_w_mask; int clk_ungate_mask; @@ -92,6 +94,8 @@ struct rockchip_pm_domain { u32 *qos_save_regs[MAX_QOS_REGS_NUM]; int num_clks; struct clk_bulk_data *clks; + struct device_node *node; + struct regulator *supply; }; struct rockchip_pmu { @@ -129,7 +133,7 @@ struct rockchip_pmu { .active_wakeup = wakeup, \ } -#define DOMAIN_M_O_R(_name, p_offset, pwr, status, m_offset, m_status, r_status, r_offset, req, idle, ack, wakeup) \ +#define DOMAIN_M_O_R(_name, p_offset, pwr, status, m_offset, m_status, r_status, r_offset, req, idle, ack, wakeup, regulator) \ { \ .name = _name, \ .pwr_offset = p_offset, \ @@ -145,6 +149,7 @@ struct rockchip_pmu { .idle_mask = (idle), \ .ack_mask = (ack), \ .active_wakeup = wakeup, \ + .need_regulator = regulator, \ } #define DOMAIN_M_O_R_G(_name, p_offset, pwr, status, m_offset, m_status, r_status, r_offset, req, idle, ack, g_mask, wakeup) \ @@ -303,8 +308,8 @@ void rockchip_pmu_unblock(void) } EXPORT_SYMBOL_GPL(rockchip_pmu_unblock); -#define DOMAIN_RK3588(name, p_offset, pwr, status, m_offset, m_status, r_status, r_offset, req, idle, wakeup) \ - DOMAIN_M_O_R(name, p_offset, pwr, status, m_offset, m_status, r_status, r_offset, req, idle, idle, wakeup) +#define DOMAIN_RK3588(name, p_offset, pwr, status, m_offset, m_status, r_status, r_offset, req, idle, wakeup, regulator) \ + DOMAIN_M_O_R(name, p_offset, pwr, status, m_offset, m_status, r_status, r_offset, req, idle, idle, wakeup, regulator) static bool rockchip_pmu_domain_is_idle(struct rockchip_pm_domain *pd) { @@ -619,18 +624,57 @@ static int rockchip_pd_power(struct rockchip_pm_domain *pd, bool power_on) return 0; } +static int rockchip_pd_regulator_disable(struct rockchip_pm_domain *pd) +{ + return IS_ERR_OR_NULL(pd->supply) ? 0 : regulator_disable(pd->supply); +} + +static int rockchip_pd_regulator_enable(struct rockchip_pm_domain *pd) +{ + struct rockchip_pmu *pmu = pd->pmu; + + if (!pd->info->need_regulator) + return 0; + + if (IS_ERR_OR_NULL(pd->supply)) { + pd->supply = devm_of_regulator_get(pmu->dev, pd->node, "domain"); + + if (IS_ERR(pd->supply)) + return PTR_ERR(pd->supply); + } + + return regulator_enable(pd->supply); +} + static int rockchip_pd_power_on(struct generic_pm_domain *domain) { struct rockchip_pm_domain *pd = to_rockchip_pd(domain); + int ret; + + ret = rockchip_pd_regulator_enable(pd); + if (ret) { + dev_err(pd->pmu->dev, "Failed to enable supply: %d\n", ret); + return ret; + } - return rockchip_pd_power(pd, true); + ret = rockchip_pd_power(pd, true); + if (ret) + rockchip_pd_regulator_disable(pd); + + return ret; } static int rockchip_pd_power_off(struct generic_pm_domain *domain) { struct rockchip_pm_domain *pd = to_rockchip_pd(domain); + int ret; - return rockchip_pd_power(pd, false); + ret = rockchip_pd_power(pd, false); + if (ret) + return ret; + + rockchip_pd_regulator_disable(pd); + return ret; } static int rockchip_pd_attach_dev(struct generic_pm_domain *genpd, @@ -711,6 +755,7 @@ static int rockchip_pm_add_one_domain(struct rockchip_pmu *pmu, pd->info = pd_info; pd->pmu = pmu; + pd->node = node; pd->num_clks = of_clk_get_parent_count(node); if (pd->num_clks > 0) { @@ -1174,35 +1219,35 @@ static const struct rockchip_domain_info rk3576_pm_domains[] = { }; static const struct rockchip_domain_info rk3588_pm_domains[] = { - [RK3588_PD_GPU] = DOMAIN_RK3588("gpu", 0x0, BIT(0), 0, 0x0, 0, BIT(1), 0x0, BIT(0), BIT(0), false), - [RK3588_PD_NPU] = DOMAIN_RK3588("npu", 0x0, BIT(1), BIT(1), 0x0, 0, 0, 0x0, 0, 0, false), - [RK3588_PD_VCODEC] = DOMAIN_RK3588("vcodec", 0x0, BIT(2), BIT(2), 0x0, 0, 0, 0x0, 0, 0, false), - [RK3588_PD_NPUTOP] = DOMAIN_RK3588("nputop", 0x0, BIT(3), 0, 0x0, BIT(11), BIT(2), 0x0, BIT(1), BIT(1), false), - [RK3588_PD_NPU1] = DOMAIN_RK3588("npu1", 0x0, BIT(4), 0, 0x0, BIT(12), BIT(3), 0x0, BIT(2), BIT(2), false), - [RK3588_PD_NPU2] = DOMAIN_RK3588("npu2", 0x0, BIT(5), 0, 0x0, BIT(13), BIT(4), 0x0, BIT(3), BIT(3), false), - [RK3588_PD_VENC0] = DOMAIN_RK3588("venc0", 0x0, BIT(6), 0, 0x0, BIT(14), BIT(5), 0x0, BIT(4), BIT(4), false), - [RK3588_PD_VENC1] = DOMAIN_RK3588("venc1", 0x0, BIT(7), 0, 0x0, BIT(15), BIT(6), 0x0, BIT(5), BIT(5), false), - [RK3588_PD_RKVDEC0] = DOMAIN_RK3588("rkvdec0", 0x0, BIT(8), 0, 0x0, BIT(16), BIT(7), 0x0, BIT(6), BIT(6), false), - [RK3588_PD_RKVDEC1] = DOMAIN_RK3588("rkvdec1", 0x0, BIT(9), 0, 0x0, BIT(17), BIT(8), 0x0, BIT(7), BIT(7), false), - [RK3588_PD_VDPU] = DOMAIN_RK3588("vdpu", 0x0, BIT(10), 0, 0x0, BIT(18), BIT(9), 0x0, BIT(8), BIT(8), false), - [RK3588_PD_RGA30] = DOMAIN_RK3588("rga30", 0x0, BIT(11), 0, 0x0, BIT(19), BIT(10), 0x0, 0, 0, false), - [RK3588_PD_AV1] = DOMAIN_RK3588("av1", 0x0, BIT(12), 0, 0x0, BIT(20), BIT(11), 0x0, BIT(9), BIT(9), false), - [RK3588_PD_VI] = DOMAIN_RK3588("vi", 0x0, BIT(13), 0, 0x0, BIT(21), BIT(12), 0x0, BIT(10), BIT(10), false), - [RK3588_PD_FEC] = DOMAIN_RK3588("fec", 0x0, BIT(14), 0, 0x0, BIT(22), BIT(13), 0x0, 0, 0, false), - [RK3588_PD_ISP1] = DOMAIN_RK3588("isp1", 0x0, BIT(15), 0, 0x0, BIT(23), BIT(14), 0x0, BIT(11), BIT(11), false), - [RK3588_PD_RGA31] = DOMAIN_RK3588("rga31", 0x4, BIT(0), 0, 0x0, BIT(24), BIT(15), 0x0, BIT(12), BIT(12), false), - [RK3588_PD_VOP] = DOMAIN_RK3588("vop", 0x4, BIT(1), 0, 0x0, BIT(25), BIT(16), 0x0, BIT(13) | BIT(14), BIT(13) | BIT(14), false), - [RK3588_PD_VO0] = DOMAIN_RK3588("vo0", 0x4, BIT(2), 0, 0x0, BIT(26), BIT(17), 0x0, BIT(15), BIT(15), false), - [RK3588_PD_VO1] = DOMAIN_RK3588("vo1", 0x4, BIT(3), 0, 0x0, BIT(27), BIT(18), 0x4, BIT(0), BIT(16), false), - [RK3588_PD_AUDIO] = DOMAIN_RK3588("audio", 0x4, BIT(4), 0, 0x0, BIT(28), BIT(19), 0x4, BIT(1), BIT(17), false), - [RK3588_PD_PHP] = DOMAIN_RK3588("php", 0x4, BIT(5), 0, 0x0, BIT(29), BIT(20), 0x4, BIT(5), BIT(21), false), - [RK3588_PD_GMAC] = DOMAIN_RK3588("gmac", 0x4, BIT(6), 0, 0x0, BIT(30), BIT(21), 0x0, 0, 0, false), - [RK3588_PD_PCIE] = DOMAIN_RK3588("pcie", 0x4, BIT(7), 0, 0x0, BIT(31), BIT(22), 0x0, 0, 0, true), - [RK3588_PD_NVM] = DOMAIN_RK3588("nvm", 0x4, BIT(8), BIT(24), 0x4, 0, 0, 0x4, BIT(2), BIT(18), false), - [RK3588_PD_NVM0] = DOMAIN_RK3588("nvm0", 0x4, BIT(9), 0, 0x4, BIT(1), BIT(23), 0x0, 0, 0, false), - [RK3588_PD_SDIO] = DOMAIN_RK3588("sdio", 0x4, BIT(10), 0, 0x4, BIT(2), BIT(24), 0x4, BIT(3), BIT(19), false), - [RK3588_PD_USB] = DOMAIN_RK3588("usb", 0x4, BIT(11), 0, 0x4, BIT(3), BIT(25), 0x4, BIT(4), BIT(20), true), - [RK3588_PD_SDMMC] = DOMAIN_RK3588("sdmmc", 0x4, BIT(13), 0, 0x4, BIT(5), BIT(26), 0x0, 0, 0, false), + [RK3588_PD_GPU] = DOMAIN_RK3588("gpu", 0x0, BIT(0), 0, 0x0, 0, BIT(1), 0x0, BIT(0), BIT(0), false, true), + [RK3588_PD_NPU] = DOMAIN_RK3588("npu", 0x0, BIT(1), BIT(1), 0x0, 0, 0, 0x0, 0, 0, false, true), + [RK3588_PD_VCODEC] = DOMAIN_RK3588("vcodec", 0x0, BIT(2), BIT(2), 0x0, 0, 0, 0x0, 0, 0, false, false), + [RK3588_PD_NPUTOP] = DOMAIN_RK3588("nputop", 0x0, BIT(3), 0, 0x0, BIT(11), BIT(2), 0x0, BIT(1), BIT(1), false, false), + [RK3588_PD_NPU1] = DOMAIN_RK3588("npu1", 0x0, BIT(4), 0, 0x0, BIT(12), BIT(3), 0x0, BIT(2), BIT(2), false, false), + [RK3588_PD_NPU2] = DOMAIN_RK3588("npu2", 0x0, BIT(5), 0, 0x0, BIT(13), BIT(4), 0x0, BIT(3), BIT(3), false, false), + [RK3588_PD_VENC0] = DOMAIN_RK3588("venc0", 0x0, BIT(6), 0, 0x0, BIT(14), BIT(5), 0x0, BIT(4), BIT(4), false, false), + [RK3588_PD_VENC1] = DOMAIN_RK3588("venc1", 0x0, BIT(7), 0, 0x0, BIT(15), BIT(6), 0x0, BIT(5), BIT(5), false, false), + [RK3588_PD_RKVDEC0] = DOMAIN_RK3588("rkvdec0", 0x0, BIT(8), 0, 0x0, BIT(16), BIT(7), 0x0, BIT(6), BIT(6), false, false), + [RK3588_PD_RKVDEC1] = DOMAIN_RK3588("rkvdec1", 0x0, BIT(9), 0, 0x0, BIT(17), BIT(8), 0x0, BIT(7), BIT(7), false, false), + [RK3588_PD_VDPU] = DOMAIN_RK3588("vdpu", 0x0, BIT(10), 0, 0x0, BIT(18), BIT(9), 0x0, BIT(8), BIT(8), false, false), + [RK3588_PD_RGA30] = DOMAIN_RK3588("rga30", 0x0, BIT(11), 0, 0x0, BIT(19), BIT(10), 0x0, 0, 0, false, false), + [RK3588_PD_AV1] = DOMAIN_RK3588("av1", 0x0, BIT(12), 0, 0x0, BIT(20), BIT(11), 0x0, BIT(9), BIT(9), false, false), + [RK3588_PD_VI] = DOMAIN_RK3588("vi", 0x0, BIT(13), 0, 0x0, BIT(21), BIT(12), 0x0, BIT(10), BIT(10), false, false), + [RK3588_PD_FEC] = DOMAIN_RK3588("fec", 0x0, BIT(14), 0, 0x0, BIT(22), BIT(13), 0x0, 0, 0, false, false), + [RK3588_PD_ISP1] = DOMAIN_RK3588("isp1", 0x0, BIT(15), 0, 0x0, BIT(23), BIT(14), 0x0, BIT(11), BIT(11), false, false), + [RK3588_PD_RGA31] = DOMAIN_RK3588("rga31", 0x4, BIT(0), 0, 0x0, BIT(24), BIT(15), 0x0, BIT(12), BIT(12), false, false), + [RK3588_PD_VOP] = DOMAIN_RK3588("vop", 0x4, BIT(1), 0, 0x0, BIT(25), BIT(16), 0x0, BIT(13) | BIT(14), BIT(13) | BIT(14), false, false), + [RK3588_PD_VO0] = DOMAIN_RK3588("vo0", 0x4, BIT(2), 0, 0x0, BIT(26), BIT(17), 0x0, BIT(15), BIT(15), false, false), + [RK3588_PD_VO1] = DOMAIN_RK3588("vo1", 0x4, BIT(3), 0, 0x0, BIT(27), BIT(18), 0x4, BIT(0), BIT(16), false, false), + [RK3588_PD_AUDIO] = DOMAIN_RK3588("audio", 0x4, BIT(4), 0, 0x0, BIT(28), BIT(19), 0x4, BIT(1), BIT(17), false, false), + [RK3588_PD_PHP] = DOMAIN_RK3588("php", 0x4, BIT(5), 0, 0x0, BIT(29), BIT(20), 0x4, BIT(5), BIT(21), false, false), + [RK3588_PD_GMAC] = DOMAIN_RK3588("gmac", 0x4, BIT(6), 0, 0x0, BIT(30), BIT(21), 0x0, 0, 0, false, false), + [RK3588_PD_PCIE] = DOMAIN_RK3588("pcie", 0x4, BIT(7), 0, 0x0, BIT(31), BIT(22), 0x0, 0, 0, true, false), + [RK3588_PD_NVM] = DOMAIN_RK3588("nvm", 0x4, BIT(8), BIT(24), 0x4, 0, 0, 0x4, BIT(2), BIT(18), false, false), + [RK3588_PD_NVM0] = DOMAIN_RK3588("nvm0", 0x4, BIT(9), 0, 0x4, BIT(1), BIT(23), 0x0, 0, 0, false, false), + [RK3588_PD_SDIO] = DOMAIN_RK3588("sdio", 0x4, BIT(10), 0, 0x4, BIT(2), BIT(24), 0x4, BIT(3), BIT(19), false, false), + [RK3588_PD_USB] = DOMAIN_RK3588("usb", 0x4, BIT(11), 0, 0x4, BIT(3), BIT(25), 0x4, BIT(4), BIT(20), true, false), + [RK3588_PD_SDMMC] = DOMAIN_RK3588("sdmmc", 0x4, BIT(13), 0, 0x4, BIT(5), BIT(26), 0x0, 0, 0, false, false), }; static const struct rockchip_pmu_info px30_pmu = { -- 2.45.2 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v3 7/7] arm64: dts: rockchip: Add GPU power domain regulator dependency for RK3588 2024-10-22 15:41 [PATCH v3 0/7] Fix RK3588 GPU domain Sebastian Reichel ` (5 preceding siblings ...) 2024-10-22 15:41 ` [PATCH v3 6/7] pmdomain: " Sebastian Reichel @ 2024-10-22 15:41 ` Sebastian Reichel 2024-10-25 8:49 ` Heiko Stübner 2024-10-23 10:05 ` [PATCH v3 0/7] Fix RK3588 GPU domain Ulf Hansson 2024-10-25 9:19 ` Heiko Stübner 8 siblings, 1 reply; 17+ messages in thread From: Sebastian Reichel @ 2024-10-22 15:41 UTC (permalink / raw) To: Rob Herring, Krzysztof Kozlowski, Conor Dooley, Heiko Stuebner, Ulf Hansson, Mark Brown Cc: Liam Girdwood, Elaine Zhang, Adrián Martínez Larumbe, Boris Brezillon, Chen-Yu Tsai, devicetree, linux-rockchip, linux-kernel, linux-pm, Sebastian Reichel, kernel Enabling the GPU power domain requires that the GPU regulator is enabled. The regulator is enabled at boot time, but automatically gets disabled when there are no users. If the GPU driver is not probed at boot time or rebound while the system is running the system will try to enable the power domain before the regulator is enabled resulting in a failure hanging the whole system. Avoid this by adding an explicit dependency. Reported-by: Adrián Martínez Larumbe <adrian.larumbe@collabora.com> Tested-by: Adrian Larumbe <adrian.larumbe@collabora.com> # On Rock 5B Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com> --- arch/arm64/boot/dts/rockchip/rk3588-armsom-sige7.dts | 4 ++++ arch/arm64/boot/dts/rockchip/rk3588-base.dtsi | 2 +- arch/arm64/boot/dts/rockchip/rk3588-coolpi-cm5.dtsi | 4 ++++ arch/arm64/boot/dts/rockchip/rk3588-edgeble-neu6a-common.dtsi | 4 ++++ arch/arm64/boot/dts/rockchip/rk3588-evb1-v10.dts | 4 ++++ arch/arm64/boot/dts/rockchip/rk3588-fet3588-c.dtsi | 4 ++++ arch/arm64/boot/dts/rockchip/rk3588-friendlyelec-cm3588.dtsi | 4 ++++ arch/arm64/boot/dts/rockchip/rk3588-jaguar.dts | 4 ++++ arch/arm64/boot/dts/rockchip/rk3588-nanopc-t6.dtsi | 4 ++++ arch/arm64/boot/dts/rockchip/rk3588-ok3588-c.dts | 4 ++++ arch/arm64/boot/dts/rockchip/rk3588-orangepi-5-plus.dts | 4 ++++ arch/arm64/boot/dts/rockchip/rk3588-quartzpro64.dts | 4 ++++ arch/arm64/boot/dts/rockchip/rk3588-rock-5-itx.dts | 4 ++++ arch/arm64/boot/dts/rockchip/rk3588-rock-5b.dts | 4 ++++ arch/arm64/boot/dts/rockchip/rk3588-tiger.dtsi | 4 ++++ arch/arm64/boot/dts/rockchip/rk3588-toybrick-x0.dts | 4 ++++ arch/arm64/boot/dts/rockchip/rk3588-turing-rk1.dtsi | 4 ++++ arch/arm64/boot/dts/rockchip/rk3588s-coolpi-4b.dts | 4 ++++ arch/arm64/boot/dts/rockchip/rk3588s-gameforce-ace.dts | 4 ++++ arch/arm64/boot/dts/rockchip/rk3588s-indiedroid-nova.dts | 4 ++++ arch/arm64/boot/dts/rockchip/rk3588s-khadas-edge2.dts | 4 ++++ arch/arm64/boot/dts/rockchip/rk3588s-nanopi-r6s.dts | 4 ++++ arch/arm64/boot/dts/rockchip/rk3588s-odroid-m2.dts | 4 ++++ arch/arm64/boot/dts/rockchip/rk3588s-orangepi-5.dts | 4 ++++ arch/arm64/boot/dts/rockchip/rk3588s-rock-5a.dts | 4 ++++ 25 files changed, 97 insertions(+), 1 deletion(-) diff --git a/arch/arm64/boot/dts/rockchip/rk3588-armsom-sige7.dts b/arch/arm64/boot/dts/rockchip/rk3588-armsom-sige7.dts index c667704ba985..00a1cd96781d 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588-armsom-sige7.dts +++ b/arch/arm64/boot/dts/rockchip/rk3588-armsom-sige7.dts @@ -286,6 +286,10 @@ &pcie3x4 { status = "okay"; }; +&pd_gpu { + domain-supply = <&vdd_gpu_s0>; +}; + &pinctrl { hym8563 { hym8563_int: hym8563-int { diff --git a/arch/arm64/boot/dts/rockchip/rk3588-base.dtsi b/arch/arm64/boot/dts/rockchip/rk3588-base.dtsi index 811b15064851..a6b2855cda94 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588-base.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3588-base.dtsi @@ -861,7 +861,7 @@ power-domain@RK3588_PD_NPU2 { }; }; /* These power domains are grouped by VD_GPU */ - power-domain@RK3588_PD_GPU { + pd_gpu: power-domain@RK3588_PD_GPU { reg = <RK3588_PD_GPU>; clocks = <&cru CLK_GPU>, <&cru CLK_GPU_COREGROUP>, diff --git a/arch/arm64/boot/dts/rockchip/rk3588-coolpi-cm5.dtsi b/arch/arm64/boot/dts/rockchip/rk3588-coolpi-cm5.dtsi index fde8b228f2c7..cf9d75159ba6 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588-coolpi-cm5.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3588-coolpi-cm5.dtsi @@ -277,6 +277,10 @@ &pcie2x1l2 { status = "okay"; }; +&pd_gpu { + domain-supply = <&vdd_gpu_s0>; +}; + &pinctrl { hym8563 { hym8563_int: hym8563-int { diff --git a/arch/arm64/boot/dts/rockchip/rk3588-edgeble-neu6a-common.dtsi b/arch/arm64/boot/dts/rockchip/rk3588-edgeble-neu6a-common.dtsi index 03fd193be253..381242c8d6db 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588-edgeble-neu6a-common.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3588-edgeble-neu6a-common.dtsi @@ -126,6 +126,10 @@ regulator-state-mem { }; }; +&pd_gpu { + domain-supply = <&vdd_gpu_s0>; +}; + &pinctrl { leds { led_user_en: led_user_en { diff --git a/arch/arm64/boot/dts/rockchip/rk3588-evb1-v10.dts b/arch/arm64/boot/dts/rockchip/rk3588-evb1-v10.dts index 7dc3ee6e7eb4..142e685ae513 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588-evb1-v10.dts +++ b/arch/arm64/boot/dts/rockchip/rk3588-evb1-v10.dts @@ -485,6 +485,10 @@ &pcie3x4 { status = "okay"; }; +&pd_gpu { + domain-supply = <&vdd_gpu_s0>; +}; + &pinctrl { audio { hp_detect: headphone-detect { diff --git a/arch/arm64/boot/dts/rockchip/rk3588-fet3588-c.dtsi b/arch/arm64/boot/dts/rockchip/rk3588-fet3588-c.dtsi index 47e64d547ea9..799a71da7157 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588-fet3588-c.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3588-fet3588-c.dtsi @@ -205,6 +205,10 @@ regulator-state-mem { }; }; +&pd_gpu { + domain-supply = <&vdd_gpu_s0>; +}; + &pinctrl { leds { led_rgb_b: led-rgb-b { diff --git a/arch/arm64/boot/dts/rockchip/rk3588-friendlyelec-cm3588.dtsi b/arch/arm64/boot/dts/rockchip/rk3588-friendlyelec-cm3588.dtsi index e3a9598b99fc..1af0a30866f6 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588-friendlyelec-cm3588.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3588-friendlyelec-cm3588.dtsi @@ -256,6 +256,10 @@ &pcie2x1l2 { status = "okay"; }; +&pd_gpu { + domain-supply = <&vdd_gpu_s0>; +}; + &pinctrl { gpio-leds { led_sys_pin: led-sys-pin { diff --git a/arch/arm64/boot/dts/rockchip/rk3588-jaguar.dts b/arch/arm64/boot/dts/rockchip/rk3588-jaguar.dts index 31d2f8994f85..3cefaf830229 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588-jaguar.dts +++ b/arch/arm64/boot/dts/rockchip/rk3588-jaguar.dts @@ -403,6 +403,10 @@ &pcie3x4 { status = "okay"; }; +&pd_gpu { + domain-supply = <&vdd_gpu_s0>; +}; + &pinctrl { emmc { emmc_reset: emmc-reset { diff --git a/arch/arm64/boot/dts/rockchip/rk3588-nanopc-t6.dtsi b/arch/arm64/boot/dts/rockchip/rk3588-nanopc-t6.dtsi index fc131789b4c3..30a5e4e9e844 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588-nanopc-t6.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3588-nanopc-t6.dtsi @@ -519,6 +519,10 @@ &pcie3x4 { status = "okay"; }; +&pd_gpu { + domain-supply = <&vdd_gpu_s0>; +}; + &pinctrl { gpio-leds { sys_led_pin: sys-led-pin { diff --git a/arch/arm64/boot/dts/rockchip/rk3588-ok3588-c.dts b/arch/arm64/boot/dts/rockchip/rk3588-ok3588-c.dts index c2a08bdf09e8..a9c1fed929fd 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588-ok3588-c.dts +++ b/arch/arm64/boot/dts/rockchip/rk3588-ok3588-c.dts @@ -312,6 +312,10 @@ &pcie3x4 { status = "okay"; }; +&pd_gpu { + domain-supply = <&vdd_gpu_s0>; +}; + &pinctrl { pcie2 { pcie2_0_rst: pcie2-0-rst { diff --git a/arch/arm64/boot/dts/rockchip/rk3588-orangepi-5-plus.dts b/arch/arm64/boot/dts/rockchip/rk3588-orangepi-5-plus.dts index c3a6812cc93a..62863b6b1c88 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588-orangepi-5-plus.dts +++ b/arch/arm64/boot/dts/rockchip/rk3588-orangepi-5-plus.dts @@ -389,6 +389,10 @@ &pcie3x4 { status = "okay"; }; +&pd_gpu { + domain-supply = <&vdd_gpu_s0>; +}; + &pinctrl { hym8563 { hym8563_int: hym8563-int { diff --git a/arch/arm64/boot/dts/rockchip/rk3588-quartzpro64.dts b/arch/arm64/boot/dts/rockchip/rk3588-quartzpro64.dts index e4a20cda65ed..c8efe60e93ca 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588-quartzpro64.dts +++ b/arch/arm64/boot/dts/rockchip/rk3588-quartzpro64.dts @@ -348,6 +348,10 @@ rgmii_phy: ethernet-phy@1 { }; }; +&pd_gpu { + domain-supply = <&vdd_gpu_s0>; +}; + &pinctrl { hym8563 { hym8563_int: hym8563-int { diff --git a/arch/arm64/boot/dts/rockchip/rk3588-rock-5-itx.dts b/arch/arm64/boot/dts/rockchip/rk3588-rock-5-itx.dts index d0b922b8d67e..0eadf4fb4ba4 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588-rock-5-itx.dts +++ b/arch/arm64/boot/dts/rockchip/rk3588-rock-5-itx.dts @@ -530,6 +530,10 @@ &pcie3x4 { status = "okay"; }; +&pd_gpu { + domain-supply = <&vdd_gpu_s0>; +}; + &pinctrl { hym8563 { rtc_int: rtc-int { diff --git a/arch/arm64/boot/dts/rockchip/rk3588-rock-5b.dts b/arch/arm64/boot/dts/rockchip/rk3588-rock-5b.dts index 8f7a59918db7..717504383d46 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588-rock-5b.dts +++ b/arch/arm64/boot/dts/rockchip/rk3588-rock-5b.dts @@ -465,6 +465,10 @@ &pcie3x4 { status = "okay"; }; +&pd_gpu { + domain-supply = <&vdd_gpu_s0>; +}; + &pinctrl { hdmirx { hdmirx_hpd: hdmirx-5v-detection { diff --git a/arch/arm64/boot/dts/rockchip/rk3588-tiger.dtsi b/arch/arm64/boot/dts/rockchip/rk3588-tiger.dtsi index 615094bb8ba3..1b5c4a7fd5c6 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588-tiger.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3588-tiger.dtsi @@ -317,6 +317,10 @@ &pcie3x4 { reset-gpios = <&gpio3 RK_PB6 GPIO_ACTIVE_HIGH>; }; +&pd_gpu { + domain-supply = <&vdd_gpu_s0>; +}; + &pinctrl { emmc { emmc_reset: emmc-reset { diff --git a/arch/arm64/boot/dts/rockchip/rk3588-toybrick-x0.dts b/arch/arm64/boot/dts/rockchip/rk3588-toybrick-x0.dts index d0021524e7f9..69aadc6c8b74 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588-toybrick-x0.dts +++ b/arch/arm64/boot/dts/rockchip/rk3588-toybrick-x0.dts @@ -289,6 +289,10 @@ rgmii_phy: ethernet-phy@1 { }; }; +&pd_gpu { + domain-supply = <&vdd_gpu_s0>; +}; + &pinctrl { rtl8211f { rtl8211f_rst: rtl8211f-rst { diff --git a/arch/arm64/boot/dts/rockchip/rk3588-turing-rk1.dtsi b/arch/arm64/boot/dts/rockchip/rk3588-turing-rk1.dtsi index dbaa94ca69f4..83fc7ff55157 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588-turing-rk1.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3588-turing-rk1.dtsi @@ -229,6 +229,10 @@ &pcie3x4 { status = "okay"; }; +&pd_gpu { + domain-supply = <&vdd_gpu_s0>; +}; + &pinctrl { fan { fan_int: fan-int { diff --git a/arch/arm64/boot/dts/rockchip/rk3588s-coolpi-4b.dts b/arch/arm64/boot/dts/rockchip/rk3588s-coolpi-4b.dts index 074c316a9a69..d938db0e2239 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588s-coolpi-4b.dts +++ b/arch/arm64/boot/dts/rockchip/rk3588s-coolpi-4b.dts @@ -329,6 +329,10 @@ &pcie2x1l2 { status = "okay"; }; +&pd_gpu { + domain-supply = <&vdd_gpu_s0>; +}; + &pinctrl { hym8563 { hym8563_int: hym8563-int { diff --git a/arch/arm64/boot/dts/rockchip/rk3588s-gameforce-ace.dts b/arch/arm64/boot/dts/rockchip/rk3588s-gameforce-ace.dts index 467f69594089..9b02cea96cdb 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588s-gameforce-ace.dts +++ b/arch/arm64/boot/dts/rockchip/rk3588s-gameforce-ace.dts @@ -675,6 +675,10 @@ &pcie2x1l1 { status = "okay"; }; +&pd_gpu { + domain-supply = <&vdd_gpu_s0>; +}; + &pinctrl { audio-amplifier { headphone_amplifier_en: headphone-amplifier-en { diff --git a/arch/arm64/boot/dts/rockchip/rk3588s-indiedroid-nova.dts b/arch/arm64/boot/dts/rockchip/rk3588s-indiedroid-nova.dts index d8c50fdcca3b..1126fb442516 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588s-indiedroid-nova.dts +++ b/arch/arm64/boot/dts/rockchip/rk3588s-indiedroid-nova.dts @@ -416,6 +416,10 @@ &pcie2x1l2 { status = "okay"; }; +&pd_gpu { + domain-supply = <&vdd_gpu_s0>; +}; + &pinctrl { bluetooth-pins { bt_reset: bt-reset { diff --git a/arch/arm64/boot/dts/rockchip/rk3588s-khadas-edge2.dts b/arch/arm64/boot/dts/rockchip/rk3588s-khadas-edge2.dts index dbddfc3bb464..d29d404417ee 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588s-khadas-edge2.dts +++ b/arch/arm64/boot/dts/rockchip/rk3588s-khadas-edge2.dts @@ -233,6 +233,10 @@ hym8563: rtc@51 { }; }; +&pd_gpu { + domain-supply = <&vdd_gpu_s0>; +}; + &pinctrl { vdd_sd { vdd_sd_en: vdd-sd-en { diff --git a/arch/arm64/boot/dts/rockchip/rk3588s-nanopi-r6s.dts b/arch/arm64/boot/dts/rockchip/rk3588s-nanopi-r6s.dts index 4fa644ae510c..3dd8372b2578 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588s-nanopi-r6s.dts +++ b/arch/arm64/boot/dts/rockchip/rk3588s-nanopi-r6s.dts @@ -326,6 +326,10 @@ &pcie2x1l2 { status = "okay"; }; +&pd_gpu { + domain-supply = <&vdd_gpu_s0>; +}; + &pinctrl { gpio-key { key1_pin: key1-pin { diff --git a/arch/arm64/boot/dts/rockchip/rk3588s-odroid-m2.dts b/arch/arm64/boot/dts/rockchip/rk3588s-odroid-m2.dts index 63d91236ba9f..5f32a339f5c9 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588s-odroid-m2.dts +++ b/arch/arm64/boot/dts/rockchip/rk3588s-odroid-m2.dts @@ -401,6 +401,10 @@ &pcie2x1l2 { status = "okay"; }; +&pd_gpu { + domain-supply = <&vdd_gpu_s0>; +}; + &pinctrl { lcd { lcd_pwren: lcd-pwren { diff --git a/arch/arm64/boot/dts/rockchip/rk3588s-orangepi-5.dts b/arch/arm64/boot/dts/rockchip/rk3588s-orangepi-5.dts index feea6b20a6bf..ef3a721d1fc7 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588s-orangepi-5.dts +++ b/arch/arm64/boot/dts/rockchip/rk3588s-orangepi-5.dts @@ -297,6 +297,10 @@ &pcie2x1l2 { status = "okay"; }; +&pd_gpu { + domain-supply = <&vdd_gpu_s0>; +}; + &pinctrl { gpio-func { leds_gpio: leds-gpio { diff --git a/arch/arm64/boot/dts/rockchip/rk3588s-rock-5a.dts b/arch/arm64/boot/dts/rockchip/rk3588s-rock-5a.dts index 294b99dd50da..a61864482f1f 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588s-rock-5a.dts +++ b/arch/arm64/boot/dts/rockchip/rk3588s-rock-5a.dts @@ -317,6 +317,10 @@ &pcie2x1l2 { status = "okay"; }; +&pd_gpu { + domain-supply = <&vdd_gpu_s0>; +}; + &pinctrl { leds { io_led: io-led { -- 2.45.2 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH v3 7/7] arm64: dts: rockchip: Add GPU power domain regulator dependency for RK3588 2024-10-22 15:41 ` [PATCH v3 7/7] arm64: dts: rockchip: Add GPU power domain regulator dependency for RK3588 Sebastian Reichel @ 2024-10-25 8:49 ` Heiko Stübner 0 siblings, 0 replies; 17+ messages in thread From: Heiko Stübner @ 2024-10-25 8:49 UTC (permalink / raw) To: Rob Herring, Krzysztof Kozlowski, Conor Dooley, Ulf Hansson, Mark Brown, Sebastian Reichel Cc: Liam Girdwood, Elaine Zhang, Adrián Martínez Larumbe, Boris Brezillon, Chen-Yu Tsai, devicetree, linux-rockchip, linux-kernel, linux-pm, Sebastian Reichel, kernel Am Dienstag, 22. Oktober 2024, 17:41:52 CEST schrieb Sebastian Reichel: > Enabling the GPU power domain requires that the GPU regulator is > enabled. The regulator is enabled at boot time, but automatically > gets disabled when there are no users. > > If the GPU driver is not probed at boot time or rebound while > the system is running the system will try to enable the power > domain before the regulator is enabled resulting in a failure > hanging the whole system. Avoid this by adding an explicit > dependency. > > Reported-by: Adrián Martínez Larumbe <adrian.larumbe@collabora.com> > Tested-by: Adrian Larumbe <adrian.larumbe@collabora.com> # On Rock 5B > Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com> > diff --git a/arch/arm64/boot/dts/rockchip/rk3588-rock-5b.dts b/arch/arm64/boot/dts/rockchip/rk3588-rock-5b.dts > index 8f7a59918db7..717504383d46 100644 > --- a/arch/arm64/boot/dts/rockchip/rk3588-rock-5b.dts > +++ b/arch/arm64/boot/dts/rockchip/rk3588-rock-5b.dts > @@ -465,6 +465,10 @@ &pcie3x4 { > status = "okay"; > }; > > +&pd_gpu { > + domain-supply = <&vdd_gpu_s0>; > +}; > + > &pinctrl { > hdmirx { > hdmirx_hpd: hdmirx-5v-detection { nit: this seems to have seen some spillover from the not-yet-merged hdmi-rx Heiko ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v3 0/7] Fix RK3588 GPU domain 2024-10-22 15:41 [PATCH v3 0/7] Fix RK3588 GPU domain Sebastian Reichel ` (6 preceding siblings ...) 2024-10-22 15:41 ` [PATCH v3 7/7] arm64: dts: rockchip: Add GPU power domain regulator dependency for RK3588 Sebastian Reichel @ 2024-10-23 10:05 ` Ulf Hansson 2024-11-01 11:56 ` Ulf Hansson 2024-10-25 9:19 ` Heiko Stübner 8 siblings, 1 reply; 17+ messages in thread From: Ulf Hansson @ 2024-10-23 10:05 UTC (permalink / raw) To: Mark Brown, Sebastian Reichel Cc: Rob Herring, Krzysztof Kozlowski, Conor Dooley, Heiko Stuebner, Liam Girdwood, Elaine Zhang, Adrián Martínez Larumbe, Boris Brezillon, Chen-Yu Tsai, devicetree, linux-rockchip, linux-kernel, linux-pm, kernel On Tue, 22 Oct 2024 at 17:45, Sebastian Reichel <sebastian.reichel@collabora.com> wrote: > > Hi, > > I got a report, that the Linux kernel crashes on Rock 5B when the panthor > driver is loaded late after booting. The crash starts with the following > shortened error print: > > rockchip-pm-domain fd8d8000.power-management:power-controller: failed to set domain 'gpu', val=0 > rockchip-pm-domain fd8d8000.power-management:power-controller: failed to get ack on domain 'gpu', val=0xa9fff > SError Interrupt on CPU4, code 0x00000000be000411 -- SError > > This series first does some cleanups in the Rockchip power domain > driver and changes the driver, so that it no longer tries to continue > when it fails to enable a domain. This gets rid of the SError interrupt > and long backtraces. But the kernel still hangs when it fails to enable > a power domain. I have not done further analysis to check if that can > be avoided. > > Last but not least this provides a fix for the GPU power domain failing > to get enabled - after some testing from my side it seems to require the > GPU voltage supply to be enabled. > > This series is now based on the pull request from Mark Brown: > https://lore.kernel.org/linux-pm/ZvsVfQ1fuSVZpF6A@finisterre.sirena.org.uk/ > > I added one more patch, which adds devm_of_regulator_get without the > _optional suffix, since that is more sensible for the Rockchip usecase. > Longer explanation can be seen in patch 6, which adds the handling to > the Rockchip driver. My merge suggestion would be that Mark adds the > regulator patch on top of the immutable branch and creates a new pull > request. The merge strategy seems reasonable to me. But I am fine with that whatever works for Mark. [...] Kind regards Uffe ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v3 0/7] Fix RK3588 GPU domain 2024-10-23 10:05 ` [PATCH v3 0/7] Fix RK3588 GPU domain Ulf Hansson @ 2024-11-01 11:56 ` Ulf Hansson 2024-11-01 14:36 ` Mark Brown 0 siblings, 1 reply; 17+ messages in thread From: Ulf Hansson @ 2024-11-01 11:56 UTC (permalink / raw) To: Mark Brown Cc: Rob Herring, Sebastian Reichel, Krzysztof Kozlowski, Conor Dooley, Heiko Stuebner, Liam Girdwood, Elaine Zhang, Adrián Martínez Larumbe, Boris Brezillon, Chen-Yu Tsai, devicetree, linux-rockchip, linux-kernel, linux-pm, kernel On Wed, 23 Oct 2024 at 12:05, Ulf Hansson <ulf.hansson@linaro.org> wrote: > > On Tue, 22 Oct 2024 at 17:45, Sebastian Reichel > <sebastian.reichel@collabora.com> wrote: > > > > Hi, > > > > I got a report, that the Linux kernel crashes on Rock 5B when the panthor > > driver is loaded late after booting. The crash starts with the following > > shortened error print: > > > > rockchip-pm-domain fd8d8000.power-management:power-controller: failed to set domain 'gpu', val=0 > > rockchip-pm-domain fd8d8000.power-management:power-controller: failed to get ack on domain 'gpu', val=0xa9fff > > SError Interrupt on CPU4, code 0x00000000be000411 -- SError > > > > This series first does some cleanups in the Rockchip power domain > > driver and changes the driver, so that it no longer tries to continue > > when it fails to enable a domain. This gets rid of the SError interrupt > > and long backtraces. But the kernel still hangs when it fails to enable > > a power domain. I have not done further analysis to check if that can > > be avoided. > > > > Last but not least this provides a fix for the GPU power domain failing > > to get enabled - after some testing from my side it seems to require the > > GPU voltage supply to be enabled. > > > > This series is now based on the pull request from Mark Brown: > > https://lore.kernel.org/linux-pm/ZvsVfQ1fuSVZpF6A@finisterre.sirena.org.uk/ > > > > I added one more patch, which adds devm_of_regulator_get without the > > _optional suffix, since that is more sensible for the Rockchip usecase. > > Longer explanation can be seen in patch 6, which adds the handling to > > the Rockchip driver. My merge suggestion would be that Mark adds the > > regulator patch on top of the immutable branch and creates a new pull > > request. > > The merge strategy seems reasonable to me. But I am fine with that > whatever works for Mark. Mark, any update on this? If easier, you could also just ack the regulator patch (patch1), and can just take it all via my tree. Kind regards Uffe ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v3 0/7] Fix RK3588 GPU domain 2024-11-01 11:56 ` Ulf Hansson @ 2024-11-01 14:36 ` Mark Brown 2024-11-01 14:41 ` Chen-Yu Tsai 0 siblings, 1 reply; 17+ messages in thread From: Mark Brown @ 2024-11-01 14:36 UTC (permalink / raw) To: Ulf Hansson Cc: Rob Herring, Sebastian Reichel, Krzysztof Kozlowski, Conor Dooley, Heiko Stuebner, Liam Girdwood, Elaine Zhang, Adrián Martínez Larumbe, Boris Brezillon, Chen-Yu Tsai, devicetree, linux-rockchip, linux-kernel, linux-pm, kernel [-- Attachment #1: Type: text/plain, Size: 596 bytes --] On Fri, Nov 01, 2024 at 12:56:16PM +0100, Ulf Hansson wrote: > On Wed, 23 Oct 2024 at 12:05, Ulf Hansson <ulf.hansson@linaro.org> wrote: > > The merge strategy seems reasonable to me. But I am fine with that > > whatever works for Mark. > Mark, any update on this? > If easier, you could also just ack the regulator patch (patch1), and > can just take it all via my tree. I'm still deciding what I think about the regulator patch, I can see why it's wanted in this situation but it's also an invitation to misuse by drivers just blindly requesting all supplies and not caring if things work. [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 488 bytes --] ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v3 0/7] Fix RK3588 GPU domain 2024-11-01 14:36 ` Mark Brown @ 2024-11-01 14:41 ` Chen-Yu Tsai 2024-11-01 19:04 ` Sebastian Reichel 0 siblings, 1 reply; 17+ messages in thread From: Chen-Yu Tsai @ 2024-11-01 14:41 UTC (permalink / raw) To: Mark Brown, Sebastian Reichel Cc: Ulf Hansson, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Heiko Stuebner, Liam Girdwood, Elaine Zhang, Adrián Martínez Larumbe, Boris Brezillon, devicetree, linux-rockchip, linux-kernel, linux-pm, kernel On Fri, Nov 1, 2024 at 10:36 PM Mark Brown <broonie@kernel.org> wrote: > > On Fri, Nov 01, 2024 at 12:56:16PM +0100, Ulf Hansson wrote: > > On Wed, 23 Oct 2024 at 12:05, Ulf Hansson <ulf.hansson@linaro.org> wrote: > > > > The merge strategy seems reasonable to me. But I am fine with that > > > whatever works for Mark. > > > Mark, any update on this? > > > If easier, you could also just ack the regulator patch (patch1), and > > can just take it all via my tree. > > I'm still deciding what I think about the regulator patch, I can see why > it's wanted in this situation but it's also an invitation to misuse by > drivers just blindly requesting all supplies and not caring if things > work. I suppose an alternative is to flag which power domains actually need a regulator supply. The MediaTek power domain driver does this. There's still the issue of backwards compatibility with older device trees that are missing said supply though. ChenYu ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v3 0/7] Fix RK3588 GPU domain 2024-11-01 14:41 ` Chen-Yu Tsai @ 2024-11-01 19:04 ` Sebastian Reichel 2024-11-01 19:22 ` Mark Brown 0 siblings, 1 reply; 17+ messages in thread From: Sebastian Reichel @ 2024-11-01 19:04 UTC (permalink / raw) To: Chen-Yu Tsai Cc: Mark Brown, Ulf Hansson, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Heiko Stuebner, Liam Girdwood, Elaine Zhang, Adrián Martínez Larumbe, Boris Brezillon, devicetree, linux-rockchip, linux-kernel, linux-pm, kernel [-- Attachment #1: Type: text/plain, Size: 1394 bytes --] Hi, On Fri, Nov 01, 2024 at 10:41:14PM +0800, Chen-Yu Tsai wrote: > On Fri, Nov 1, 2024 at 10:36 PM Mark Brown <broonie@kernel.org> wrote: > > On Fri, Nov 01, 2024 at 12:56:16PM +0100, Ulf Hansson wrote: > > > On Wed, 23 Oct 2024 at 12:05, Ulf Hansson <ulf.hansson@linaro.org> wrote: > > > > > > The merge strategy seems reasonable to me. But I am fine with that > > > > whatever works for Mark. > > > > > Mark, any update on this? > > > > > If easier, you could also just ack the regulator patch (patch1), and > > > can just take it all via my tree. > > > > I'm still deciding what I think about the regulator patch, I can see why > > it's wanted in this situation but it's also an invitation to misuse by > > drivers just blindly requesting all supplies and not caring if things > > work. > > I suppose an alternative is to flag which power domains actually need > a regulator supply. The MediaTek power domain driver does this. If you look at patch 6/7, which actually makes use of devm_of_regulator_get() you will notice that I did actually flag which power domains have/need a regulator. > There's still the issue of backwards compatibility with older device > trees that are missing said supply though. Exactly :) As far as I can see the same misuse potential also exists for the plain devm_regulator_get() version. Greetings, -- Sebastian [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 833 bytes --] ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v3 0/7] Fix RK3588 GPU domain 2024-11-01 19:04 ` Sebastian Reichel @ 2024-11-01 19:22 ` Mark Brown 2024-11-01 21:35 ` Sebastian Reichel 0 siblings, 1 reply; 17+ messages in thread From: Mark Brown @ 2024-11-01 19:22 UTC (permalink / raw) To: Sebastian Reichel Cc: Chen-Yu Tsai, Ulf Hansson, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Heiko Stuebner, Liam Girdwood, Elaine Zhang, Adrián Martínez Larumbe, Boris Brezillon, devicetree, linux-rockchip, linux-kernel, linux-pm, kernel [-- Attachment #1: Type: text/plain, Size: 437 bytes --] On Fri, Nov 01, 2024 at 08:04:52PM +0100, Sebastian Reichel wrote: > On Fri, Nov 01, 2024 at 10:41:14PM +0800, Chen-Yu Tsai wrote: > > There's still the issue of backwards compatibility with older device > > trees that are missing said supply though. > Exactly :) > As far as I can see the same misuse potential also exists for the > plain devm_regulator_get() version. You'll get warnings but I'm not sure that's such a huge issue? [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 488 bytes --] ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v3 0/7] Fix RK3588 GPU domain 2024-11-01 19:22 ` Mark Brown @ 2024-11-01 21:35 ` Sebastian Reichel 0 siblings, 0 replies; 17+ messages in thread From: Sebastian Reichel @ 2024-11-01 21:35 UTC (permalink / raw) To: Mark Brown Cc: Chen-Yu Tsai, Ulf Hansson, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Heiko Stuebner, Liam Girdwood, Elaine Zhang, Adrián Martínez Larumbe, Boris Brezillon, devicetree, linux-rockchip, linux-kernel, linux-pm, kernel [-- Attachment #1: Type: text/plain, Size: 1156 bytes --] Hi, On Fri, Nov 01, 2024 at 07:22:28PM +0000, Mark Brown wrote: > On Fri, Nov 01, 2024 at 08:04:52PM +0100, Sebastian Reichel wrote: > > On Fri, Nov 01, 2024 at 10:41:14PM +0800, Chen-Yu Tsai wrote: > > > > There's still the issue of backwards compatibility with older device > > > trees that are missing said supply though. > > > Exactly :) > > > As far as I can see the same misuse potential also exists for the > > plain devm_regulator_get() version. > > You'll get warnings but I'm not sure that's such a huge issue? I see that as a feature and not as an issue. Obviously the dependency should be properly described in DT. When we upstreamed GPU support for RK3588 we did not mark the GPU regulator as always-on [*] and that has been copied to all other upstreamed RK3588 board DTs. This means all of them are buggy now. Getting a warning might help people to understand what is going on. In any case I fixed up every in-tree user as part of this series. [*] Older Rockchip platforms (which are not touched by this series) and downstream RK3588 have the GPU regulator marked as always-on. Greetings, -- Sebastian [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 833 bytes --] ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v3 0/7] Fix RK3588 GPU domain 2024-10-22 15:41 [PATCH v3 0/7] Fix RK3588 GPU domain Sebastian Reichel ` (7 preceding siblings ...) 2024-10-23 10:05 ` [PATCH v3 0/7] Fix RK3588 GPU domain Ulf Hansson @ 2024-10-25 9:19 ` Heiko Stübner 8 siblings, 0 replies; 17+ messages in thread From: Heiko Stübner @ 2024-10-25 9:19 UTC (permalink / raw) To: Rob Herring, Krzysztof Kozlowski, Conor Dooley, Ulf Hansson, Mark Brown, Sebastian Reichel Cc: Liam Girdwood, Elaine Zhang, Adrián Martínez Larumbe, Boris Brezillon, Chen-Yu Tsai, devicetree, linux-rockchip, linux-kernel, linux-pm, Sebastian Reichel, kernel Am Dienstag, 22. Oktober 2024, 17:41:45 CEST schrieb Sebastian Reichel: > Hi, > > I got a report, that the Linux kernel crashes on Rock 5B when the panthor > driver is loaded late after booting. The crash starts with the following > shortened error print: > > rockchip-pm-domain fd8d8000.power-management:power-controller: failed to set domain 'gpu', val=0 > rockchip-pm-domain fd8d8000.power-management:power-controller: failed to get ack on domain 'gpu', val=0xa9fff > SError Interrupt on CPU4, code 0x00000000be000411 -- SError > > This series first does some cleanups in the Rockchip power domain > driver and changes the driver, so that it no longer tries to continue > when it fails to enable a domain. This gets rid of the SError interrupt > and long backtraces. But the kernel still hangs when it fails to enable > a power domain. I have not done further analysis to check if that can > be avoided. > > Last but not least this provides a fix for the GPU power domain failing > to get enabled - after some testing from my side it seems to require the > GPU voltage supply to be enabled. > > This series is now based on the pull request from Mark Brown: > https://lore.kernel.org/linux-pm/ZvsVfQ1fuSVZpF6A@finisterre.sirena.org.uk/ > > I added one more patch, which adds devm_of_regulator_get without the > _optional suffix, since that is more sensible for the Rockchip usecase. > Longer explanation can be seen in patch 6, which adds the handling to > the Rockchip driver. My merge suggestion would be that Mark adds the > regulator patch on top of the immutable branch and creates a new pull > request. > > The last patch, which updates the RK3588 board files only covers the > boards from 6.12-rc1. Any board missing the update will behave as before, > so it is perfectly fine not to update all DT files at once. My rk3588 jaguar somehow developed some delay when dhcp'ing for its nfs root and with that actually started running into that gpu-regulator-issue. With this series applied, that issue goes away: Tested-by: Heiko Stuebner <heiko@sntech.de> ^ permalink raw reply [flat|nested] 17+ messages in thread
end of thread, other threads:[~2024-11-01 21:36 UTC | newest] Thread overview: 17+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2024-10-22 15:41 [PATCH v3 0/7] Fix RK3588 GPU domain Sebastian Reichel 2024-10-22 15:41 ` [PATCH v3 1/7] regulator: Add (devm_)of_regulator_get() Sebastian Reichel 2024-10-22 15:41 ` [PATCH v3 2/7] pmdomain: rockchip: cleanup mutex handling in rockchip_pd_power Sebastian Reichel 2024-10-22 15:41 ` [PATCH v3 3/7] pmdomain: rockchip: forward rockchip_do_pmu_set_power_domain errors Sebastian Reichel 2024-10-22 15:41 ` [PATCH v3 4/7] pmdomain: rockchip: reduce indentation in rockchip_pd_power Sebastian Reichel 2024-10-22 15:41 ` [PATCH v3 5/7] dt-bindings: power: rockchip: add regulator support Sebastian Reichel 2024-10-22 15:41 ` [PATCH v3 6/7] pmdomain: " Sebastian Reichel 2024-10-22 15:41 ` [PATCH v3 7/7] arm64: dts: rockchip: Add GPU power domain regulator dependency for RK3588 Sebastian Reichel 2024-10-25 8:49 ` Heiko Stübner 2024-10-23 10:05 ` [PATCH v3 0/7] Fix RK3588 GPU domain Ulf Hansson 2024-11-01 11:56 ` Ulf Hansson 2024-11-01 14:36 ` Mark Brown 2024-11-01 14:41 ` Chen-Yu Tsai 2024-11-01 19:04 ` Sebastian Reichel 2024-11-01 19:22 ` Mark Brown 2024-11-01 21:35 ` Sebastian Reichel 2024-10-25 9:19 ` Heiko Stübner
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).