NVIDIA Tegra memory and power management changes for 5.14
Subsystems (5)
v6 cover NVIDIA Tegra memory and power management changes for 5.14
This series:
1. Adds CPU/core voltage bump before system is rebooted.
2. Adds new devm_tegra_core_dev_init_opp_table() helper and switches Tegra memory drivers to use it.
3. Adds compile-testing support to the Tegra memory drivers.
4. Adds Tegra SoC core power domain support.
Changelog:
v6: - Fixed another compile-test trouble reported for v5. I double checked
the clk stubs this time and compiled them locally.
- Moved the Kconfig properties required for the core power domain to the PMC Kconfig entry. This was suggested by Thierry Reding.
v5: - Fixed compile-test warning reported for v3 which happened due to
copy-paste typo around new tegra210_clk_emc_attach() stub.
v4: - Fixed misplaced prototypes of tegra_pmc_core_domain_state_synced(),
which I noticed only after sending out v3. This fixes building with !CONFIG_PM_SLEEP.
v3: - Dropped "Detach coupled regulator before coupling count is dropped"
patch that was added in v2 since it missed regulator locking and it should be more reasonable to add a new generic hook for syncing before detaching. For now it's optional to sync Tegra SoC regulators before detaching since it's not something that happens in practice, hence it's more optimal to simply drop that feature.
- Added more stubs for T210 clk driver which should fix compile-testing problem reported for v2 by kernel robot.
- Added COMMON_CLK for COMPILE_TEST of memory drivers since for today the problem of compile-testing of legacy platforms that use HAVE_LEGACY_CLK isn't solved, we will be able to remove it after fixing the legacy platforms.
- Factored out new PMC driver state syncing feature into a separate patch "pmc: Add driver state syncing", which was requested by Ulf Hansson in a review comment to v2.
- Added r-b from Ulf Hansson to the PMC binding-update patch that he gave to v2.
v2: - Added more clk stubs that should fix build error reported by the
kernel bot to v1 for the T210 memory driver.
- Added r-b from Krzysztof Kozlowski to the memory patches.
- Added back voltage restore on detaching of coupled regulators to the T20 regulator coupler which previously got missed by accident.
- Added new patch:
regulator: core: Detach coupled regulator before coupling count is dropped
It fixes skipped voltage balancing on detaching of regulators which I happened to notice due to the recent regression of the MAX77620 driver that made driver to re-probe and detach coupled regulators.
v1: - Merged previous patches into this single series.
- Added ack from Rob Herring to the core domain DT binding patch.
- Implemented suggestions that were given by Krzysztof Kozlowski:
- Factored out soc_is_tegra() stub into standalone patch.
- Updated tags of the "Fix compilation warnings on 64bit platforms" patch, added reported-by from lkp robot and removed suggested-by from Nathan Chancellor.
- Switched to use use BIT() macro.
- Added r-b from Krzysztof Kozlowski to "Enable compile testing for all drivers" patch.
- Added r-b from Nathan Chancellor.
- Dropped voltage floor/ceiling from devm_tegra_core_dev_init_opp_table() since only memory drivers now need to initialize voltage vote and they don't need floor/ceil. This was suggested by Viresh Kumar.
Dmitry Osipenko (14):
regulator: core: Add regulator_sync_voltage_rdev() soc/tegra: regulators: Bump voltages on system reboot soc/tegra: Add stub for soc_is_tegra()
soc/tegra: Add devm_tegra_core_dev_init_opp_table() soc/tegra: fuse: Add stubs needed for compile-testing
clk: tegra: Add stubs needed for compile-testing
memory: tegra: Fix compilation warnings on 64bit platforms
memory: tegra: Enable compile testing for all drivers
memory: tegra20-emc: Use devm_tegra_core_dev_init_opp_table()
memory: tegra30-emc: Use devm_tegra_core_dev_init_opp_table()
dt-bindings: soc: tegra-pmc: Document core power domain soc/tegra: pmc: Add core power domain
soc/tegra: pmc: Add driver state syncing
soc/tegra: regulators: Support core domain state syncing
.../arm/tegra/nvidia,tegra20-pmc.yaml | 35 +++++ drivers/memory/tegra/Kconfig | 16 +- drivers/memory/tegra/tegra124-emc.c | 4 +- drivers/memory/tegra/tegra20-emc.c | 48 +----- drivers/memory/tegra/tegra30-emc.c | 52 +----- drivers/regulator/core.c | 23 +++ drivers/soc/tegra/Kconfig | 2 + drivers/soc/tegra/common.c | 97 ++++++++++++ drivers/soc/tegra/pmc.c | 148 +++++++++++++++++- drivers/soc/tegra/regulators-tegra20.c | 94 ++++++++++- drivers/soc/tegra/regulators-tegra30.c | 93 ++++++++++- include/linux/clk/tegra.h | 100 +++++++++--- include/linux/regulator/driver.h | 1 + include/soc/tegra/common.h | 31 ++++ include/soc/tegra/fuse.h | 20 ++- include/soc/tegra/pmc.h | 7 + 16 files changed, 640 insertions(+), 131 deletions(-)
Signature · 1 line
2.30.2
PATCH v6 1/14 regulator: core: Add regulator_sync_voltage_rdev()
Some NVIDIA Tegra devices use a CPU soft-reset method for the reboot and in this case we need to restore the coupled voltages to the state that is suitable for hardware during boot. Add new regulator_sync_voltage_rdev() helper which is needed by regulator drivers in order to sync voltage of a coupled regulators.
--- drivers/regulator/core.c | 23 +++++++++++++++++++++++ include/linux/regulator/driver.h | 1 + 2 files changed, 24 insertions(+)
drivers/regulator/core.c +23 -0
@@ -4111,6 +4111,29 @@ int regulator_set_voltage_time_sel(struct regulator_dev *rdev, }EXPORT_SYMBOL_GPL (regulator_set_voltage_time_sel); +int regulator_sync_voltage_rdev (struct regulator_dev *rdev) +{ +int ret; + +regulator_lock (rdev); + +if (!rdev->desc->ops->set_voltage && + !rdev->desc->ops->set_voltage_sel) { + ret = -EINVAL ; + goto out; + } + +/* balance only, if regulator is coupled */ +if (rdev->coupling_desc.n_coupled >1 ) + ret =regulator_balance_voltage (rdev,PM_SUSPEND_ON ); +else + ret = -EOPNOTSUPP ; + +out: +regulator_unlock (rdev); +return ret; +} +/** * regulator_sync_voltage - re-apply last regulator output voltage * @regulator: regulator source
include/linux/regulator/driver.h +1 -0
@@ -540,6 +540,7 @@ int regulator_set_current_limit_regmap(struct regulator_dev *rdev,int regulator_get_current_limit_regmap (struct regulator_dev *rdev);void *regulator_get_init_drvdata (struct regulator_init_data *reg_init_data);int regulator_set_ramp_delay_regmap (struct regulator_dev *rdev,int ramp_delay); +int regulator_sync_voltage_rdev (struct regulator_dev *rdev);/* * Helper functions intended to be used by regulator drivers prior registering
Signature · 1 line
2.30.2
PATCH v6 2/14 soc/tegra: regulators: Bump voltages on system reboot
In reply to Dmitry OsipenkoEnsure that SoC voltages are at a level suitable for a system reboot. This is important for some devices that use CPU reset method for the rebooting. SoC CPU and core voltages now are be restored to a level that is suitable for rebooting. This patch fixes hang on reboot on Asus Transformer TF101, it was also reported as fixing some of reboot issues on Toshiba AC100.
--- drivers/soc/tegra/regulators-tegra20.c | 75 +++++++++++++++++++++++++- drivers/soc/tegra/regulators-tegra30.c | 75 +++++++++++++++++++++++++- 2 files changed, 148 insertions(+), 2 deletions(-)
drivers/soc/tegra/regulators-tegra20.c +74 -1
@@ -12,6 +12,7 @@#include <linux/init.h> #include <linux/kernel.h> #include <linux/of.h> +#include <linux/reboot.h> #include <linux/regulator/coupler.h> #include <linux/regulator/driver.h> #include <linux/regulator/machine.h>
@@ -21,7 +22,10 @@ struct tegra_regulator_coupler {struct regulator_dev *core_rdev;struct regulator_dev *cpu_rdev;struct regulator_dev *rtc_rdev; -int core_min_uV; +struct notifier_block reboot_notifier; +int core_min_uV, cpu_min_uV; +bool sys_reboot_mode_req; +bool sys_reboot_mode; }; static inline struct tegra_regulator_coupler *
@@ -242,6 +246,10 @@ static int tegra20_cpu_voltage_update(struct tegra_regulator_coupler *tegra,if (cpu_uV <0 )return cpu_uV; +/* store boot voltage level */ +if (!tegra->cpu_min_uV) + tegra->cpu_min_uV = cpu_uV; +/* * CPU's regulator may not have any consumers, hence the voltage * must not be changed in that case because CPU simply won't
@@ -250,6 +258,10 @@ static int tegra20_cpu_voltage_update(struct tegra_regulator_coupler *tegra,if (!cpu_min_uV_consumers) cpu_min_uV = cpu_uV; +/* restore boot voltage level */ +if (tegra->sys_reboot_mode) + cpu_min_uV =max (cpu_min_uV, tegra->cpu_min_uV); +if (cpu_min_uV > cpu_uV) { err =tegra20_core_rtc_update (tegra, core_rdev, rtc_rdev, cpu_uV, cpu_min_uV);
@@ -290,6 +302,8 @@ static int tegra20_regulator_balance_voltage(struct regulator_coupler *coupler,return -EINVAL ; } + tegra->sys_reboot_mode =READ_ONCE (tegra->sys_reboot_mode_req); +if (rdev == cpu_rdev)return tegra20_cpu_voltage_update (tegra, cpu_rdev, core_rdev, rtc_rdev);
@@ -303,6 +317,51 @@ static int tegra20_regulator_balance_voltage(struct regulator_coupler *coupler,return -EPERM ; } +static int tegra20_regulator_prepare_reboot (struct tegra_regulator_coupler *tegra, +bool sys_reboot_mode) +{ +int err; + +if (!tegra->core_rdev || !tegra->rtc_rdev || !tegra->cpu_rdev) +return 0 ; + +WRITE_ONCE (tegra->sys_reboot_mode_req, true); + +/* +* Some devices use CPU soft-reboot method and in this case we +* should ensure that voltages are sane for the reboot by restoring +* the minimum boot levels. +*/ + err =regulator_sync_voltage_rdev (tegra->cpu_rdev); +if (err) +return err; + + err =regulator_sync_voltage_rdev (tegra->core_rdev); +if (err) +return err; + +WRITE_ONCE (tegra->sys_reboot_mode_req, sys_reboot_mode); + +return 0 ; +} + +static int tegra20_regulator_reboot (struct notifier_block *notifier, +unsigned long event,void *cmd) +{ +struct tegra_regulator_coupler *tegra; +int ret; + +if (event !=SYS_RESTART ) +return NOTIFY_DONE ; + + tegra = container_of(notifier, struct tegra_regulator_coupler, + reboot_notifier); + + ret =tegra20_regulator_prepare_reboot (tegra, true); + +return notifier_from_errno (ret); +} +static int tegra20_regulator_attach (struct regulator_coupler *coupler,struct regulator_dev *rdev) {
@@ -335,6 +394,14 @@ static int tegra20_regulator_detach(struct regulator_coupler *coupler, {struct tegra_regulator_coupler *tegra =to_tegra_coupler (coupler); +/* +* We don't expect regulators to be decoupled during reboot, +* this may race with the reboot handler and shouldn't ever +* happen in practice. +*/ +if (WARN_ON_ONCE (system_state >SYSTEM_RUNNING )) +return -EPERM ; +if (tegra->core_rdev == rdev) { tegra->core_rdev =NULL ;return 0 ;
@@ -359,13 +426,19 @@ static struct tegra_regulator_coupler tegra20_coupler = { .detach_regulator = tegra20_regulator_detach, .balance_voltage = tegra20_regulator_balance_voltage, }, + .reboot_notifier.notifier_call = tegra20_regulator_reboot, };static int __init tegra_regulator_coupler_init (void ) { +int err; +if (!of_machine_is_compatible ("nvidia,tegra20" ))return 0 ; + err =register_reboot_notifier (&tegra20_coupler.reboot_notifier); +WARN_ON (err); +return regulator_coupler_register (&tegra20_coupler.coupler); }arch_initcall (tegra_regulator_coupler_init);
drivers/soc/tegra/regulators-tegra30.c +74 -1
127 lines not on this page · raw message
Signature · 1 line
2.30.2
PATCH v6 3/14 soc/tegra: Add stub for soc_is_tegra()
In reply to Dmitry OsipenkoAdd stub required for compile-testing of drivers.
--- include/soc/tegra/common.h | 9 +++++++++ 1 file changed, 9 insertions(+)
include/soc/tegra/common.h +9 -0
@@ -6,6 +6,15 @@#ifndef __SOC_TEGRA_COMMON_H__#define __SOC_TEGRA_COMMON_H__ +#include <linux/types.h> + +#ifdef CONFIG_ARCH_TEGRA bool soc_is_tegra (void ); +#else +static inline bool soc_is_tegra (void ) +{ +return false; +} +#endif #endif /* __SOC_TEGRA_COMMON_H__ */
Signature · 1 line
2.30.2
PATCH v6 4/14 soc/tegra: Add devm_tegra_core_dev_init_opp_table()
In reply to Dmitry OsipenkoAdd common helper which initializes OPP table for Tegra SoC core devices.
--- drivers/soc/tegra/common.c | 97 ++++++++++++++++++++++++++++++++++++++ include/soc/tegra/common.h | 22 +++++++++ 2 files changed, 119 insertions(+)
drivers/soc/tegra/common.c +97 -0
@@ -3,9 +3,16 @@* Copyright (C) 2014 NVIDIA CORPORATION. All rights reserved. */ +#define dev_fmt (fmt) "tegra-soc: " fmt + +#include <linux/clk.h> +#include <linux/device.h> +#include <linux/export.h> #include <linux/of.h> +#include <linux/pm_opp.h> #include <soc/tegra/common.h> +#include <soc/tegra/fuse.h> static const struct of_device_id tegra_machine_match[] = { { .compatible ="nvidia,tegra20" , },
@@ -31,3 +38,93 @@ bool soc_is_tegra(void)return match !=NULL ; } + +static int tegra_core_dev_init_opp_state (struct device *dev) +{ +unsigned long rate; +struct clk *clk; +int err; + + clk =devm_clk_get (dev,NULL ); +if (IS_ERR (clk)) { +dev_err (dev,"failed to get clk: %pe\n" , clk); +return PTR_ERR (clk); + } + + rate =clk_get_rate (clk); +if (!rate) { +dev_err (dev,"failed to get clk rate\n" ); +return -EINVAL ; + } + +/* first dummy rate-setting initializes voltage vote */ + err =dev_pm_opp_set_rate (dev, rate); +if (err) { +dev_err (dev,"failed to initialize OPP clock: %d\n" , err); +return err; + } + +return 0 ; +} + +/** +* devm_tegra_core_dev_init_opp_table() - initialize OPP table +* @dev: device for which OPP table is initialized +* @params: pointer to the OPP table configuration +* +* This function will initialize OPP table and sync OPP state of a Tegra SoC +* core device. +* +* Return: 0 on success or errorno. +*/ +int devm_tegra_core_dev_init_opp_table (struct device *dev, +struct tegra_core_opp_params *params) +{ +u32 hw_version; +int err; + + err =devm_pm_opp_set_clkname (dev,NULL ); +if (err) { +dev_err (dev,"failed to set OPP clk: %d\n" , err); +return err; + } + +/* Tegra114+ doesn't support OPP yet */ +if (!of_machine_is_compatible ("nvidia,tegra20" ) && + !of_machine_is_compatible ("nvidia,tegra30" )) +return -ENODEV ; + +if (of_machine_is_compatible ("nvidia,tegra20" )) + hw_version =BIT (tegra_sku_info.soc_process_id); +else + hw_version =BIT (tegra_sku_info.soc_speedo_id); + + err =devm_pm_opp_set_supported_hw (dev, &hw_version,1 ); +if (err) { +dev_err (dev,"failed to set OPP supported HW: %d\n" , err); +return err; + } + +/* +* Older device-trees have an empty OPP table, we will get +* -ENODEV from devm_pm_opp_of_add_table() in this case. +*/ + err =devm_pm_opp_of_add_table (dev); +if (err) { +if (err == -ENODEV ) +dev_err_once (dev,"OPP table not found, please update device-tree\n" ); +else +dev_err (dev,"failed to add OPP table: %d\n" , err); + +return err; + } + +if (params->init_state) { + err =tegra_core_dev_init_opp_state (dev); +if (err) +return err; + } + +return 0 ; +} +EXPORT_SYMBOL_GPL (devm_tegra_core_dev_init_opp_table);
include/soc/tegra/common.h +22 -0
@@ -6,15 +6,37 @@#ifndef __SOC_TEGRA_COMMON_H__#define __SOC_TEGRA_COMMON_H__ +#include <linux/errno.h> #include <linux/types.h> +struct device ; + +/** +* Tegra SoC core device OPP table configuration +* +* @init_state: pre-initialize OPP state of a device +*/ +struct tegra_core_opp_params { +bool init_state; +}; +#ifdef CONFIG_ARCH_TEGRA bool soc_is_tegra (void ); + +int devm_tegra_core_dev_init_opp_table (struct device *dev, +struct tegra_core_opp_params *params);#else static inline bool soc_is_tegra (void ) {return false; } + +static inline int +devm_tegra_core_dev_init_opp_table (struct device *dev, +struct tegra_core_opp_params *params) +{ +return -ENODEV ; +}#endif #endif /* __SOC_TEGRA_COMMON_H__ */
Signature · 1 line
2.30.2
PATCH v6 5/14 soc/tegra: fuse: Add stubs needed for compile-testing
In reply to Dmitry OsipenkoAdd missing stubs that will allow Tegra memory driver to be compile-tested by kernel build bots.
--- include/soc/tegra/fuse.h | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-)
include/soc/tegra/fuse.h +17 -3
@@ -52,14 +52,28 @@ struct tegra_sku_info {enum tegra_revision revision; }; +#ifdef CONFIG_ARCH_TEGRA +extern struct tegra_sku_info tegra_sku_info;u32 tegra_read_straps (void );u32 tegra_read_ram_code (void );int tegra_fuse_readl (unsigned long offset,u32 *value); - -#ifdef CONFIG_ARCH_TEGRA -extern struct tegra_sku_info tegra_sku_info;#else static struct tegra_sku_info tegra_sku_info__maybe_unused ; + +static inline u32 tegra_read_straps (void ) +{ +return 0 ; +} + +static inline u32 tegra_read_ram_code (void ) +{ +return 0 ; +} + +static inline int tegra_fuse_readl (unsigned long offset,u32 *value) +{ +return -ENODEV ; +}#endif struct device *tegra_soc_device_register (void );
Signature · 1 line
2.30.2
PATCH v6 6/14 clk: tegra: Add stubs needed for compile-testing
In reply to Dmitry OsipenkoAdd stubs needed for compile-testing of Tegra memory drivers.
--- drivers/soc/tegra/pmc.c | 5 -- include/linux/clk/tegra.h | 100 ++++++++++++++++++++++++++++++-------- 2 files changed, 79 insertions(+), 26 deletions(-)
drivers/soc/tegra/pmc.c +0 -5
@@ -743,11 +743,6 @@ static int tegra_powergate_enable_clocks(struct tegra_powergate *pg)return err; } -int __weak tegra210_clk_handle_mbist_war (unsigned int id) -{ -return 0 ; -} -static int tegra_powergate_power_up (struct tegra_powergate *pg,bool disable_clocks) {
include/linux/clk/tegra.h +79 -21
124 lines not on this page · raw message
Signature · 1 line
2.30.2
PATCH v6 7/14 memory: tegra: Fix compilation warnings on 64bit platforms
In reply to Dmitry OsipenkoFix compilation warning on 64bit platforms caused by implicit promotion of 32bit signed integer to a 64bit unsigned value which happens after enabling compile-testing of the EMC drivers.
--- drivers/memory/tegra/tegra124-emc.c | 4 ++-- drivers/memory/tegra/tegra30-emc.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-)
drivers/memory/tegra/tegra124-emc.c +2 -2
@@ -272,8 +272,8 @@#define EMC_PUTERM_ADJ 0x574#define DRAM_DEV_SEL_ALL 0 -#define DRAM_DEV_SEL_0 (2 << 30) -#define DRAM_DEV_SEL_1 (1 << 30) +#define DRAM_DEV_SEL_0 BIT(31) +#define DRAM_DEV_SEL_1 BIT(30)#define EMC_CFG_POWER_FEATURES_MASK \ (EMC_CFG_DYN_SREF | EMC_CFG_DRAM_ACPD | EMC_CFG_DRAM_CLKSTOP_SR | \
drivers/memory/tegra/tegra30-emc.c +2 -2
@@ -150,8 +150,8 @@#define EMC_SELF_REF_CMD_ENABLED BIT(0)#define DRAM_DEV_SEL_ALL (0 << 30) -#define DRAM_DEV_SEL_0 (2 << 30) -#define DRAM_DEV_SEL_1 (1 << 30) +#define DRAM_DEV_SEL_0 BIT(31) +#define DRAM_DEV_SEL_1 BIT(30)#define DRAM_BROADCAST (num) \ ((num) > 1 ? DRAM_DEV_SEL_ALL : DRAM_DEV_SEL_0)
Signature · 1 line
2.30.2
PATCH v6 8/14 memory: tegra: Enable compile testing for all drivers
In reply to Dmitry OsipenkoEnable compile testing for all Tegra memory drivers.
--- drivers/memory/tegra/Kconfig | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-)
drivers/memory/tegra/Kconfig +10 -6
@@ -2,16 +2,18 @@ config TEGRA_MC bool "NVIDIA Tegra Memory Controller support" default y - depends on ARCH_TEGRA + depends on ARCH_TEGRA || (COMPILE_TEST && COMMON_CLK) select INTERCONNECT help This driver supports the Memory Controller (MC) hardware found on NVIDIA Tegra SoCs. +if TEGRA_MC + config TEGRA20_EMC tristate "NVIDIA Tegra20 External Memory Controller driver" default y - depends on TEGRA_MC && ARCH_TEGRA_2x_SOC + depends on ARCH_TEGRA_2x_SOC || COMPILE_TEST select DEVFREQ_GOV_SIMPLE_ONDEMAND select PM_DEVFREQ help
@@ -23,7 +25,7 @@ config TEGRA20_EMC config TEGRA30_EMC tristate "NVIDIA Tegra30 External Memory Controller driver" default y - depends on TEGRA_MC && ARCH_TEGRA_3x_SOC + depends on ARCH_TEGRA_3x_SOC || COMPILE_TEST select PM_OPP help This driver is for the External Memory Controller (EMC) found on
@@ -34,8 +36,8 @@ config TEGRA30_EMC config TEGRA124_EMC tristate "NVIDIA Tegra124 External Memory Controller driver" default y - depends on TEGRA_MC && ARCH_TEGRA_124_SOC - select TEGRA124_CLK_EMC + depends on ARCH_TEGRA_124_SOC || COMPILE_TEST + select TEGRA124_CLK_EMC if ARCH_TEGRA select PM_OPP help This driver is for the External Memory Controller (EMC) found on
@@ -49,10 +51,12 @@ config TEGRA210_EMC_TABLE config TEGRA210_EMC tristate "NVIDIA Tegra210 External Memory Controller driver" - depends on TEGRA_MC && ARCH_TEGRA_210_SOC + depends on ARCH_TEGRA_210_SOC || COMPILE_TEST select TEGRA210_EMC_TABLE help This driver is for the External Memory Controller (EMC) found on Tegra210 chips. The EMC controls the external DRAM on the board. This driver is required to change memory timings / clock rate for external memory. + +endif
Signature · 1 line
2.30.2
Re: [PATCH v6 08/14] memory: tegra: Enable compile testing for all drivers
Quoted 8 lines · Dmitry Osipenko
Enable compile testing for all Tegra memory drivers.
Reviewed-by Krzysztof Kozlowski <[email protected]>Signed-off-by Dmitry Osipenko <[email protected]>--- drivers/memory/tegra/Kconfig | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-)
Hi Dmitry,
This fails on x86_64 and i386:
https://krzk.eu/#/builders/38/builds/260
https://krzk.eu/#/builders/40/builds/261
/bin/ld: warning: orphan section __reservedmem_of_table' from drivers/memory/tegra/tegra210-emc-table.o' being placed in section __reservedmem_of_table' /bin/ld: drivers/memory/tegra/mc.o: in function tegra_mc_probe':
mc.c:(.text+0x87a): undefined reference to `reset_controller_register'
make[1]: *** [/home/buildbot/worker/builddir/build/Makefile:1191: vmlinux] Error 1
It's a defconfig with:scripts/config --file out/.config -e COMPILE_TEST -e OF -e SRAM -e MEMORY -e PM_DEVFREQ -e ARM_PL172_MPMC -e ATMEL_SDRAMC -e ATMEL_EBI -e BRCMSTB_DPFE -e BT1_L2_CTL -e TI_AEMIF -e TI_EMIF -e OMAP_GPMC -e TI_EMIF_SRAM -e MVEBU_DEVBUS -e FSL_CORENET_CF -e FSL_IFC -e JZ4780_NEMC -e MTK_SMI -e DA8XX_DDRCTL -e PL353_SMC -e RENESAS_RPCIF -e STM32_FMC2_EBI -e SAMSUNG_MC -e EXYNOS5422_DMC -e EXYNOS_SROM -e TEGRA_MC -e TEGRA20_EMC -e TEGRA30_EMC -e TEGRA124_EMC -e TEGRA210_EMC_TABLE -e TEGRA210_EMC
Best regards,
Krzysztof
Re: [PATCH v6 08/14] memory: tegra: Enable compile testing for all drivers
Quoted 21 lines · Krzysztof Kozlowski
Quoted 8 lines · Dmitry Osipenko
Enable compile testing for all Tegra memory drivers.
Reviewed-by Krzysztof Kozlowski <[email protected]>Signed-off-by Dmitry Osipenko <[email protected]>--- drivers/memory/tegra/Kconfig | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-)Hi Dmitry,
This fails on
x86_64and i386:
https://krzk.eu/#/builders/38/builds/260
https://krzk.eu/#/builders/40/builds/261
/bin/ld: warning: orphan section__reservedmem_of_table' fromdrivers/memory/tegra/tegra210-emc-table.o' being placed in section__reservedmem_of_table' /bin/ld: drivers/memory/tegra/mc.o: in functiontegra_mc_probe':
mc.c:(.text+0x87a): undefined reference to `reset_controller_register'
make[1]: *** [/home/buildbot/worker/builddir/build/Makefile:1191: vmlinux] Error 1
Quoted 9 lines
It's a defconfig with:
scripts/config--file out/.config -eCOMPILE_TEST-e OF -e SRAM -e MEMORY -ePM_DEVFREQ-eARM_PL172_MPMC-eATMEL_SDRAMC-eATMEL_EBI-eBRCMSTB_DPFE-eBT1_L2_CTL-eTI_AEMIF-eTI_EMIF-eOMAP_GPMC-eTI_EMIF_SRAM-eMVEBU_DEVBUS-eFSL_CORENET_CF-eFSL_IFC-eJZ4780_NEMC-eMTK_SMI-eDA8XX_DDRCTL-ePL353_SMC-eRENESAS_RPCIF-eSTM32_FMC2_EBI-eSAMSUNG_MC-eEXYNOS5422_DMC-eEXYNOS_SROM-eTEGRA_MC-eTEGRA20_EMC-eTEGRA30_EMC-eTEGRA124_EMC-eTEGRA210_EMC_TABLE-eTEGRA210_EMC
Ugh... that's exactly one of the reasons why I dislike COMPILE_TEST... though admittedly it does point out a missing dependency here. I think we need to add && RESET_CONTROLLER to that || branch of the depends on to fix that. ARCH_TEGRA selects RESET_CONTROLLER explicitly, so the COMPILE_TEST branch needs to mirror that.
Either that, or I suppose we could add the depends on RESET_CONTROLLER explicitly to TEGRA_MC, or perhaps even select it (although that could cause conflicts down the road, but should be fine right now because RESET_CONTROLLER doesn't have any other dependencies right now).
Not sure what to do about that orphaned __reservedmem_of_table section. Maybe all we need to do is to select OF_RESERVED_MEM from TEGRA210_EMC_TABLE?
Let me to a few test builds.
Thierry
Re: [PATCH v6 08/14] memory: tegra: Enable compile testing for all drivers
07.06.2021 16:36, Thierry Reding пишет:
Quoted 38 lines · Krzysztof Kozlowski
Quoted 21 lines · Dmitry Osipenko
Quoted 8 lines
Enable compile testing for all Tegra memory drivers.
Reviewed-by Krzysztof Kozlowski <[email protected]>Signed-off-by Dmitry Osipenko <[email protected]>--- drivers/memory/tegra/Kconfig | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-)Hi Dmitry,
This fails on
x86_64and i386:
https://krzk.eu/#/builders/38/builds/260
https://krzk.eu/#/builders/40/builds/261
/bin/ld: warning: orphan section__reservedmem_of_table' fromdrivers/memory/tegra/tegra210-emc-table.o' being placed in section__reservedmem_of_table' /bin/ld: drivers/memory/tegra/mc.o: in functiontegra_mc_probe':
mc.c:(.text+0x87a): undefined reference to `reset_controller_register'
make[1]: *** [/home/buildbot/worker/builddir/build/Makefile:1191: vmlinux] Error 1Quoted 9 lines
It's a defconfig with:
scripts/config--file out/.config -eCOMPILE_TEST-e OF -e SRAM -e MEMORY -ePM_DEVFREQ-eARM_PL172_MPMC-eATMEL_SDRAMC-eATMEL_EBI-eBRCMSTB_DPFE-eBT1_L2_CTL-eTI_AEMIF-eTI_EMIF-eOMAP_GPMC-eTI_EMIF_SRAM-eMVEBU_DEVBUS-eFSL_CORENET_CF-eFSL_IFC-eJZ4780_NEMC-eMTK_SMI-eDA8XX_DDRCTL-ePL353_SMC-eRENESAS_RPCIF-eSTM32_FMC2_EBI-eSAMSUNG_MC-eEXYNOS5422_DMC-eEXYNOS_SROM-eTEGRA_MC-eTEGRA20_EMC-eTEGRA30_EMC-eTEGRA124_EMC-eTEGRA210_EMC_TABLE-eTEGRA210_EMCUgh... that's exactly one of the reasons why I dislike
COMPILE_TEST... though admittedly it does point out a missing dependency here. I think we need to add &&RESET_CONTROLLERto that || branch of the depends on to fix that.ARCH_TEGRAselectsRESET_CONTROLLERexplicitly, so theCOMPILE_TESTbranch needs to mirror that.
Quoted 4 lines
Either that, or I suppose we could add the depends on
RESET_CONTROLLERexplicitly toTEGRA_MC, or perhaps even select it (although that could cause conflicts down the road, but should be fine right now becauseRESET_CONTROLLERdoesn't have any other dependencies right now).
The select will work.
The other option is to add stubs for the reset controller API.
Re: [PATCH v6 08/14] memory: tegra: Enable compile testing for all drivers
In reply to Thierry Reding07.06.2021 16:36, Thierry Reding пишет:
Quoted 4 lines
Quoted 4 lines
/bin/ld: warning: orphan section__reservedmem_of_table' fromdrivers/memory/tegra/tegra210-emc-table.o' being placed in section__reservedmem_of_table' /bin/ld: drivers/memory/tegra/mc.o: in functiontegra_mc_probe':
mc.c:(.text+0x87a): undefined reference to `reset_controller_register'
make[1]: *** [/home/buildbot/worker/builddir/build/Makefile:1191: vmlinux] Error 1
...
Quoted 3 lines
Not sure what to do about that orphaned
__reservedmem_of_tablesection. Maybe all we need to do is to selectOF_RESERVED_MEMfromTEGRA210_EMC_TABLE?
Select won't work easily, but the dependency for TEGRA210_EMC should.
Re: [PATCH v6 08/14] memory: tegra: Enable compile testing for all drivers
Quoted 5 lines · Dmitry Osipenko
07.06.2021 16:36, Thierry Reding пишет:
Quoted 4 lines
Quoted 4 lines
/bin/ld: warning: orphan section__reservedmem_of_table' fromdrivers/memory/tegra/tegra210-emc-table.o' being placed in section__reservedmem_of_table' /bin/ld: drivers/memory/tegra/mc.o: in functiontegra_mc_probe':
mc.c:(.text+0x87a): undefined reference to `reset_controller_register'
make[1]: *** [/home/buildbot/worker/builddir/build/Makefile:1191: vmlinux] Error 1
Quoted 7 lines
...
Quoted 3 lines
Not sure what to do about that orphaned
__reservedmem_of_tablesection. Maybe all we need to do is to selectOF_RESERVED_MEMfromTEGRA210_EMC_TABLE?Select won't work easily, but the dependency for
TEGRA210_EMCshould.
Select works if I also select OF_EARLY_FLATTREE. That's slightly odd because typically that's something that the platform would select, but there's precedent for doing this in drivers/clk/x86/Kconfig, so I think it'd be fine.
The attached patch resolves both of the above issues for me.
Krzysztof: do you want to squash that into the problematic patch or do you want me to send this as a follow-up patch for you to apply? I guess the latter since you've already sent out the PR for Will and ARM SoC?
Thierry
--- >8 ---
drivers/memory/tegra/Kconfig +3 -0
@@ -4,6 +4,7 @@ config TEGRA_MC default y depends on ARCH_TEGRA || (COMPILE_TEST && COMMON_CLK) select INTERCONNECT + select RESET_CONTROLLER help This driver supports the Memory Controller (MC) hardware found on NVIDIA Tegra SoCs.
@@ -48,6 +49,8 @@ config TEGRA124_EMC config TEGRA210_EMC_TABLE bool depends on ARCH_TEGRA_210_SOC || COMPILE_TEST + select OF_EARLY_FLATTREE + select OF_RESERVED_MEM config TEGRA210_EMC tristate "NVIDIA Tegra210 External Memory Controller driver"
--- >8 ---
Re: [PATCH v6 08/14] memory: tegra: Enable compile testing for all drivers
Quoted 19 lines · Thierry Reding
Quoted 5 lines · Dmitry Osipenko
07.06.2021 16:36, Thierry Reding пишет:
Quoted 4 lines
Quoted 4 lines
/bin/ld: warning: orphan section__reservedmem_of_table' fromdrivers/memory/tegra/tegra210-emc-table.o' being placed in section__reservedmem_of_table' /bin/ld: drivers/memory/tegra/mc.o: in functiontegra_mc_probe':
mc.c:(.text+0x87a): undefined reference to `reset_controller_register'
make[1]: *** [/home/buildbot/worker/builddir/build/Makefile:1191: vmlinux] Error 1Quoted 7 lines
...
Quoted 3 lines
Not sure what to do about that orphaned
__reservedmem_of_tablesection. Maybe all we need to do is to selectOF_RESERVED_MEMfromTEGRA210_EMC_TABLE?Select won't work easily, but the dependency for
TEGRA210_EMCshould.Select works if I also select
OF_EARLY_FLATTREE. That's slightly odd because typically that's something that the platform would select, but there's precedent for doing this indrivers/clk/x86/Kconfig, so I think it'd be fine.
Quoted 5 lines
The attached patch resolves both of the above issues for me.
Krzysztof: do you want to squash that into the problematic patch or do you want me to send this as a follow-up patch for you to apply? I guess the latter since you've already sent out the PR for Will and ARM SoC?
Follow up, please, but I am not sure about selecting reset controller. From the tegra/mc.c code I see it can be optional - if "reset_ops" is provided. Therefore I think:
1. Reset controller should provide proper stubs. This will fix building of mc.c when reset controller is not chosen (regardless of point #2 below).
2. Specific drivers should depend on it. Selecting user-visible symbols is rather discourage because might lead to circular dependencies.
Best regards,
Krzysztof
Re: [PATCH v6 08/14] memory: tegra: Enable compile testing for all drivers
07.06.2021 17:42, Krzysztof Kozlowski пишет:
Quoted 26 lines · Thierry Reding
Quoted 19 lines · Dmitry Osipenko
Quoted 5 lines
07.06.2021 16:36, Thierry Reding пишет:
Quoted 4 lines
Quoted 4 lines
/bin/ld: warning: orphan section__reservedmem_of_table' fromdrivers/memory/tegra/tegra210-emc-table.o' being placed in section__reservedmem_of_table' /bin/ld: drivers/memory/tegra/mc.o: in functiontegra_mc_probe':
mc.c:(.text+0x87a): undefined reference to `reset_controller_register'
make[1]: *** [/home/buildbot/worker/builddir/build/Makefile:1191: vmlinux] Error 1Quoted 7 lines
...
Quoted 3 lines
Not sure what to do about that orphaned
__reservedmem_of_tablesection. Maybe all we need to do is to selectOF_RESERVED_MEMfromTEGRA210_EMC_TABLE?Select won't work easily, but the dependency for
TEGRA210_EMCshould.Select works if I also select
OF_EARLY_FLATTREE. That's slightly odd because typically that's something that the platform would select, but there's precedent for doing this indrivers/clk/x86/Kconfig, so I think it'd be fine.Quoted 5 lines
The attached patch resolves both of the above issues for me.
Krzysztof: do you want to squash that into the problematic patch or do you want me to send this as a follow-up patch for you to apply? I guess the latter since you've already sent out the PR for Will and ARM SoC?
Quoted 8 lines
Follow up, please, but I am not sure about selecting reset controller. From the
tegra/mc.ccode I see it can be optional - if "reset_ops" is provided. Therefore I think:
1. Reset controller should provide proper stubs. This will fix building ofmc.cwhen reset controller is not chosen (regardless of point #2 below).2. Specific drivers should depend on it. Selecting user-visible symbols is rather discourage because might lead to circular dependencies.
Thierry, should I send the patches or you're willing to do it?
PATCH v6 9/14 memory: tegra20-emc: Use devm_tegra_core_dev_init_opp_table()
In reply to Dmitry OsipenkoUse common devm_tegra_core_dev_init_opp_table() helper for the OPP table initialization.
--- drivers/memory/tegra/tegra20-emc.c | 48 +++--------------------------- 1 file changed, 4 insertions(+), 44 deletions(-)
drivers/memory/tegra/tegra20-emc.c +4 -44
@@ -908,49 +908,6 @@ static int tegra_emc_interconnect_init(struct tegra_emc *emc)return err; } -static int tegra_emc_opp_table_init (struct tegra_emc *emc) -{ -u32 hw_version =BIT (tegra_sku_info.soc_process_id); -struct opp_table *hw_opp_table; -int err; - - hw_opp_table =dev_pm_opp_set_supported_hw (emc->dev, &hw_version,1 ); - err =PTR_ERR_OR_ZERO (hw_opp_table); -if (err) { -dev_err (emc->dev,"failed to set OPP supported HW: %d\n" , err); -return err; - } - - err =dev_pm_opp_of_add_table (emc->dev); -if (err) { -if (err == -ENODEV ) -dev_err (emc->dev,"OPP table not found, please update your device tree\n" ); -else -dev_err (emc->dev,"failed to add OPP table: %d\n" , err); - - goto put_hw_table; - } - -dev_info_once (emc->dev,"OPP HW ver. 0x%x, current clock rate %lu MHz\n" , - hw_version,clk_get_rate (emc->clk) /1000000 ); - -/* first dummy rate-set initializes voltage state */ - err =dev_pm_opp_set_rate (emc->dev,clk_get_rate (emc->clk)); -if (err) { -dev_err (emc->dev,"failed to initialize OPP clock: %d\n" , err); - goto remove_table; - } - -return 0 ; - -remove_table: -dev_pm_opp_of_remove_table (emc->dev); -put_hw_table: -dev_pm_opp_put_supported_hw (hw_opp_table); - -return err; -} -static void devm_tegra_emc_unset_callback (void *data) {tegra20_clk_set_emc_round_callback (NULL ,NULL );
@@ -1077,6 +1034,7 @@ static int tegra_emc_devfreq_init(struct tegra_emc *emc)static int tegra_emc_probe (struct platform_device *pdev) { +struct tegra_core_opp_params opp_params = {};struct device_node *np;struct tegra_emc *emc;int irq, err;
@@ -1122,7 +1080,9 @@ static int tegra_emc_probe(struct platform_device *pdev)if (err)return err; - err =tegra_emc_opp_table_init (emc); + opp_params.init_state = true; + + err =devm_tegra_core_dev_init_opp_table (&pdev->dev, &opp_params);if (err)return err;
Signature · 1 line
2.30.2
PATCH v6 10/14 memory: tegra30-emc: Use devm_tegra_core_dev_init_opp_table()
In reply to Dmitry OsipenkoUse common devm_tegra_core_dev_init_opp_table() helper for the OPP table initialization.
--- drivers/memory/tegra/tegra30-emc.c | 48 +++--------------------------- 1 file changed, 4 insertions(+), 44 deletions(-)
drivers/memory/tegra/tegra30-emc.c +4 -44
@@ -1480,49 +1480,6 @@ static int tegra_emc_interconnect_init(struct tegra_emc *emc)return err; } -static int tegra_emc_opp_table_init (struct tegra_emc *emc) -{ -u32 hw_version =BIT (tegra_sku_info.soc_speedo_id); -struct opp_table *hw_opp_table; -int err; - - hw_opp_table =dev_pm_opp_set_supported_hw (emc->dev, &hw_version,1 ); - err =PTR_ERR_OR_ZERO (hw_opp_table); -if (err) { -dev_err (emc->dev,"failed to set OPP supported HW: %d\n" , err); -return err; - } - - err =dev_pm_opp_of_add_table (emc->dev); -if (err) { -if (err == -ENODEV ) -dev_err (emc->dev,"OPP table not found, please update your device tree\n" ); -else -dev_err (emc->dev,"failed to add OPP table: %d\n" , err); - - goto put_hw_table; - } - -dev_info_once (emc->dev,"OPP HW ver. 0x%x, current clock rate %lu MHz\n" , - hw_version,clk_get_rate (emc->clk) /1000000 ); - -/* first dummy rate-set initializes voltage state */ - err =dev_pm_opp_set_rate (emc->dev,clk_get_rate (emc->clk)); -if (err) { -dev_err (emc->dev,"failed to initialize OPP clock: %d\n" , err); - goto remove_table; - } - -return 0 ; - -remove_table: -dev_pm_opp_of_remove_table (emc->dev); -put_hw_table: -dev_pm_opp_put_supported_hw (hw_opp_table); - -return err; -} -static void devm_tegra_emc_unset_callback (void *data) {tegra20_clk_set_emc_round_callback (NULL ,NULL );
@@ -1568,6 +1525,7 @@ static int tegra_emc_init_clk(struct tegra_emc *emc)static int tegra_emc_probe (struct platform_device *pdev) { +struct tegra_core_opp_params opp_params = {};struct device_node *np;struct tegra_emc *emc;int err;
@@ -1617,7 +1575,9 @@ static int tegra_emc_probe(struct platform_device *pdev)if (err)return err; - err =tegra_emc_opp_table_init (emc); + opp_params.init_state = true; + + err =devm_tegra_core_dev_init_opp_table (&pdev->dev, &opp_params);if (err)return err;
Signature · 1 line
2.30.2
PATCH v6 11/14 dt-bindings: soc: tegra-pmc: Document core power domain
In reply to Dmitry OsipenkoAll NVIDIA Tegra SoCs have a core power domain where majority of hardware blocks reside. Document the new core power domain properties.
--- .../arm/tegra/nvidia,tegra20-pmc.yaml | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+)
Documentation/devicetree/bindings/arm/tegra/nvidia,tegra20-pmc.yaml +35 -0
@@ -301,6 +301,33 @@ patternProperties: additionalProperties: false + core-domain: + type: object + description: | + The vast majority of hardware blocks of Tegra SoC belong to a + Core power domain, which has a dedicated voltage rail that powers + the blocks. + + properties: + operating-points-v2: + description: + Should contain level, voltages and opp-supported-hw property. + The supported-hw is a bitfield indicating SoC speedo or process + ID mask. + + "#power-domain-cells": + const: 0 + + required: + - operating-points-v2 + - "#power-domain-cells" + + additionalProperties: false + + core-supply: + description: + Phandle to voltage regulator connected to the SoC Core power rail. + required: - compatible - reg
@@ -325,6 +352,7 @@ examples: tegra_pmc: pmc@7000e400 { compatible = "nvidia,tegra210-pmc"; reg = <0x7000e400 0x400>; + core-supply = <®ulator>; clocks = <&tegra_car TEGRA210_CLK_PCLK>, <&clk32k_in>; clock-names = "pclk", "clk32k_in"; #clock-cells = <1>;
@@ -338,17 +366,24 @@ examples: nvidia,core-power-req-active-high; nvidia,sys-clock-req-active-high; + pd_core: core-domain { + operating-points-v2 = <&core_opp_table>; + #power-domain-cells = <0>; + }; + powergates { pd_audio: aud { clocks = <&tegra_car TEGRA210_CLK_APE>, <&tegra_car TEGRA210_CLK_APB2APE>; resets = <&tegra_car 198>; + power-domains = <&pd_core>; #power-domain-cells = <0>; }; pd_xusbss: xusba { clocks = <&tegra_car TEGRA210_CLK_XUSB_SS>; resets = <&tegra_car TEGRA210_CLK_XUSB_SS>; + power-domains = <&pd_core>; #power-domain-cells = <0>; }; };
Signature · 1 line
2.30.2
PATCH v6 12/14 soc/tegra: pmc: Add core power domain
In reply to Dmitry OsipenkoNVIDIA Tegra SoCs have multiple power domains, each domain corresponds to an external SoC power rail. Core power domain covers vast majority of hardware blocks within a Tegra SoC. The voltage of a power domain should be set to a level which satisfies all devices within the power domain. Add support for the core power domain which controls voltage state of the domain. This allows us to support system-wide DVFS on Tegra20-210 SoCs. The PMC powergate domains now are sub-domains of the core domain, this requires device-tree updating, older DTBs are unaffected and will continue to work as before.
--- drivers/soc/tegra/Kconfig | 2 + drivers/soc/tegra/pmc.c | 120 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 122 insertions(+)
drivers/soc/tegra/Kconfig +2 -0
@@ -144,6 +144,8 @@ config SOC_TEGRA_FLOWCTRL config SOC_TEGRA_PMC bool select GENERIC_PINCONF + select PM_OPP + select PM_GENERIC_DOMAINS config SOC_TEGRA_POWERGATE_BPMP def_bool y
drivers/soc/tegra/pmc.c +120 -0
150 lines not on this page · raw message
Signature · 1 line
2.30.2
PATCH v6 13/14 soc/tegra: pmc: Add driver state syncing
In reply to Dmitry OsipenkoAdd driver state syncing that is invoked once all PMC consumers are attached and ready. The consumers are the power domain clients. The synchronization callback is invoked once all client drivers are probed, the driver core handles this for us. This callback informs PMC driver that all voltage votes are initialized by each PD client and it's safe to begin voltage scaling of the core power domain.
--- drivers/soc/tegra/pmc.c | 23 +++++++++++++++++++++++ include/soc/tegra/pmc.h | 7 +++++++ 2 files changed, 30 insertions(+)
drivers/soc/tegra/pmc.c +23 -0
@@ -429,6 +429,8 @@ struct tegra_pmc {struct irq_chip irq;struct notifier_block clk_nb; + +bool core_domain_state_synced; };static struct tegra_pmc *pmc = &(struct tegra_pmc ) {
@@ -1298,6 +1300,11 @@ static int tegra_powergate_add(struct tegra_pmc *pmc, struct device_node *np)return err; } +bool tegra_pmc_core_domain_state_synced (void ) +{ +return pmc->core_domain_state_synced; +} +static int tegra_pmc_core_pd_set_performance_state (struct generic_pm_domain *genpd,unsigned int level)
@@ -3787,6 +3794,21 @@ static const struct of_device_id tegra_pmc_match[] = { { } }; +static void tegra_pmc_sync_state (struct device *dev) +{ +int err; + + pmc->core_domain_state_synced = true; + +/* this is a no-op if core regulator isn't used */ +mutex_lock (&pmc->powergates_lock); + err =dev_pm_opp_sync_regulators (dev); +mutex_unlock (&pmc->powergates_lock); + +if (err) +dev_err (dev,"failed to sync regulators: %d\n" , err); +} +static struct platform_driver tegra_pmc_driver = { .driver = { .name ="tegra-pmc" ,
@@ -3795,6 +3817,7 @@ static struct platform_driver tegra_pmc_driver = {#if defined(CONFIG_PM_SLEEP ) && defined(CONFIG_ARM ) .pm = &tegra_pmc_pm_ops, #endif + .sync_state = tegra_pmc_sync_state, }, .probe = tegra_pmc_probe, };
include/soc/tegra/pmc.h +7 -0
@@ -171,6 +171,8 @@ int tegra_io_rail_power_off(unsigned int id);void tegra_pmc_set_suspend_mode (enum tegra_suspend_mode mode);void tegra_pmc_enter_suspend_mode (enum tegra_suspend_mode mode); +bool tegra_pmc_core_domain_state_synced (void ); +#else static inline int tegra_powergate_power_on (unsigned int id) {
@@ -227,6 +229,11 @@ static inline void tegra_pmc_enter_suspend_mode(enum tegra_suspend_mode mode) { } +static inline bool tegra_pmc_core_domain_state_synced (void ) +{ +return false; +} +#endif /* CONFIG_SOC_TEGRA_PMC */ #if defined(CONFIG_SOC_TEGRA_PMC ) && defined(CONFIG_PM_SLEEP )
Signature · 1 line
2.30.2
PATCH v6 14/14 soc/tegra: regulators: Support core domain state syncing
In reply to Dmitry OsipenkoThe core voltage shall not drop until state of core domain is synced, i.e. all device drivers that use core domain are loaded and ready.
Support core domain state syncing. The core domain driver invokes the core-regulator voltage syncing once the state of domain is synced, at this point the core voltage is allowed to go lower than the level left after bootloader.
--- drivers/soc/tegra/regulators-tegra20.c | 19 ++++++++++++++++++- drivers/soc/tegra/regulators-tegra30.c | 18 +++++++++++++++++- 2 files changed, 35 insertions(+), 2 deletions(-)
drivers/soc/tegra/regulators-tegra20.c +18 -1
@@ -17,6 +17,8 @@#include <linux/regulator/driver.h> #include <linux/regulator/machine.h> +#include <soc/tegra/pmc.h> +struct tegra_regulator_coupler {struct regulator_coupler coupler;struct regulator_dev *core_rdev;
@@ -42,6 +44,21 @@ static int tegra20_core_limit(struct tegra_regulator_coupler *tegra,int core_cur_uV;int err; +/* +* Tegra20 SoC has critical DVFS-capable devices that are +* permanently-active or active at a boot time, like EMC +* (DRAM controller) or Display controller for example. +* +* The voltage of a CORE SoC power domain shall not be dropped below +* a minimum level, which is determined by device's clock rate. +* This means that we can't fully allow CORE voltage scaling until +* the state of all DVFS-critical CORE devices is synced. +*/ +if (tegra_pmc_core_domain_state_synced () && !tegra->sys_reboot_mode) { +pr_info_once ("voltage state synced\n" ); +return 0 ; + } +if (tegra->core_min_uV >0 )return tegra->core_min_uV;
@@ -62,7 +79,7 @@ static int tegra20_core_limit(struct tegra_regulator_coupler *tegra,*/ tegra->core_min_uV = core_max_uV; -pr_info ("core minimum voltage limited to %duV\n" , tegra->core_min_uV); +pr_info ("core voltage initialized to %duV\n" , tegra->core_min_uV);return tegra->core_min_uV; }
drivers/soc/tegra/regulators-tegra30.c +17 -1
@@ -18,6 +18,7 @@#include <linux/regulator/machine.h> #include <soc/tegra/fuse.h> +#include <soc/tegra/pmc.h> struct tegra_regulator_coupler {struct regulator_coupler coupler;
@@ -43,6 +44,21 @@ static int tegra30_core_limit(struct tegra_regulator_coupler *tegra,int core_cur_uV;int err; +/* +* Tegra30 SoC has critical DVFS-capable devices that are +* permanently-active or active at a boot time, like EMC +* (DRAM controller) or Display controller for example. +* +* The voltage of a CORE SoC power domain shall not be dropped below +* a minimum level, which is determined by device's clock rate. +* This means that we can't fully allow CORE voltage scaling until +* the state of all DVFS-critical CORE devices is synced. +*/ +if (tegra_pmc_core_domain_state_synced () && !tegra->sys_reboot_mode) { +pr_info_once ("voltage state synced\n" ); +return 0 ; + } +if (tegra->core_min_uV >0 )return tegra->core_min_uV;
@@ -63,7 +79,7 @@ static int tegra30_core_limit(struct tegra_regulator_coupler *tegra,*/ tegra->core_min_uV = core_max_uV; -pr_info ("core minimum voltage limited to %duV\n" , tegra->core_min_uV); +pr_info ("core voltage initialized to %duV\n" , tegra->core_min_uV);return tegra->core_min_uV; }
Signature · 1 line
2.30.2
Quoted 8 lines · Dmitry Osipenko
This series:
1. Adds CPU/core voltage bump before system is rebooted.
2. Adds newdevm_tegra_core_dev_init_opp_table()helper and switches Tegra memory drivers to use it.
3. Adds compile-testing support to the Tegra memory drivers.
4. Adds Tegra SoC core power domain support.
Quoted 4 lines
Changelog:
v6: - Fixed another compile-test trouble reported for v5. I double checked
the clk stubs this time and compiled them locally.
Heh... I just fixed those locally on top of your v5. Let me see if I can roll back the changes and apply this new set instead.
Thierry
01.06.2021 14:27, Thierry Reding пишет:
Quoted 9 lines · Dmitry Osipenko
Quoted 8 lines
This series:
1. Adds CPU/core voltage bump before system is rebooted.
2. Adds newdevm_tegra_core_dev_init_opp_table()helper and switches Tegra memory drivers to use it.
3. Adds compile-testing support to the Tegra memory drivers.
4. Adds Tegra SoC core power domain support.
Quoted 7 lines
Quoted 4 lines
Changelog:
v6: - Fixed another compile-test trouble reported for v5. I double checked
the clk stubs this time and compiled them locally.Heh... I just fixed those locally on top of your v5. Let me see if I can roll back the changes and apply this new set instead.
Thank you! You probably saw already that Ulf Hansson suggested to remove the lockdep annotation for now from the core PD, I'll make a v7 with this small change.
Quoted 15 lines · Dmitry Osipenko
01.06.2021 14:27, Thierry Reding пишет:
Quoted 14 lines · Dmitry Osipenko
Quoted 12 lines
This series:
1. Adds CPU/core voltage bump before system is rebooted.
2. Adds newdevm_tegra_core_dev_init_opp_table()helper and switches Tegra memory drivers to use it.
3. Adds compile-testing support to the Tegra memory drivers.
4. Adds Tegra SoC core power domain support.Changelog:
v6: - Fixed another compile-test trouble reported for v5. I double checked
the clk stubs this time and compiled them locally.
Quoted 6 lines
Quoted 2 lines
Heh... I just fixed those locally on top of your v5. Let me see if I can roll back the changes and apply this new set instead.
Thank you! You probably saw already that Ulf Hansson suggested to remove the lockdep annotation for now from the core PD, I'll make a v7 with this small change.
Can you perhaps post this change as a follow-up? That way I can just merge it into the corresponding branch, which may be easier than backing out all the changes spread over four branches and applying basically the same thing again.
Thierry
01.06.2021 20:10, Thierry Reding пишет:
Quoted 19 lines · Dmitry Osipenko
Quoted 18 lines
01.06.2021 14:27, Thierry Reding пишет:
Quoted 16 lines · Dmitry Osipenko
Quoted 8 lines
This series:
1. Adds CPU/core voltage bump before system is rebooted.
2. Adds newdevm_tegra_core_dev_init_opp_table()helper and switches Tegra memory drivers to use it.
3. Adds compile-testing support to the Tegra memory drivers.
4. Adds Tegra SoC core power domain support.Quoted 4 lines
Changelog:
v6: - Fixed another compile-test trouble reported for v5. I double checked
the clk stubs this time and compiled them locally.Heh... I just fixed those locally on top of your v5. Let me see if I can roll back the changes and apply this new set instead.
Quoted 8 lines
Quoted 3 lines
Thank you! You probably saw already that Ulf Hansson suggested to remove the lockdep annotation for now from the core PD, I'll make a v7 with this small change.
Can you perhaps post this change as a follow-up? That way I can just merge it into the corresponding branch, which may be easier than backing out all the changes spread over four branches and applying basically the same thing again.
Alright, I'll make a follow-up. Thank you.