Introduce memory interconnect for NVIDIA Tegra SoCs
Subsystems (10)
Dmitry Osipenko
maintainerv7 cover Introduce memory interconnect for NVIDIA Tegra SoCs
This series brings initial support for memory interconnect to Tegra20, Tegra30 and Tegra124 SoCs.
For the starter only display controllers and devfreq devices are getting interconnect API support, others could be supported later on. The display controllers have the biggest demand for interconnect API right now because dynamic memory frequency scaling can't be done safely without taking into account bandwidth requirement from the displays. In particular this series fixes distorted display output on T30 Ouya and T124 TK1 devices.
Changelog:
v7: - Corrected example in "dt-bindings: host1x: Document new interconnect
properties".
- Added "obj-$(CONFIG_ARCH_TEGRA_132_SOC) += clk-tegra124-emc.o" to "memory: tegra124-emc: Make driver modular" in order to fix ARM64 kernel compilation reported by kernel test robot.
- Fixed build error reported by kernel test robot which happened due to a missing stub for tegra_sku_info for COMPILE_TEST drivers. Added this new patch:
soc/tegra: fuse: Add stub for tegra_sku_info
- Fixed minor W=1 warning reported by kernel test robot for the "drm/tegra: dc: Support memory bandwidth management" patch.
- Changed TEGRA_MC_ICC_TAG type from a enum to bitmask in order to have tags more extensible in the future.
- Fixed dt_binding_check warning in "dt-bindings: memory: tegra124: mc:
Document new interconnect property", was reported by kernel bot.
- Added acks/r-b from Rob Herring, Thierry Reding and Krzysztof Kozlowski to the reviewed patches.
- The EMC "core-supply" property is now explicitly optional in the DT bindings. This change was suggested by Krzysztof Kozlowski.
- Removed unnecessary white-spaces in the device-tree example of the patch:
dt-bindings: memory: tegra20: emc: Document new interconnect property
This change was suggested by Krzysztof Kozlowski.
- Explicitly documented that core-supply is an optional property in patch:
dt-bindings: memory: tegra20: emc: Document new interconnect property
This change was suggested by Krzysztof Kozlowski.
- Replaced underscores with hyphens in the DT node names. Suggested by Krzysztof Kozlowski.
- Added operating-points-v2 to the required properties of the patch:
dt-bindings: memory: tegra124: emc: Document OPP table and voltage regulator
This was missed by accident in the v6.
- Renamed get_memory_controller() to memory_controller_get(). Suggested by Krzysztof Kozlowski.
- Changed internal ICC IDs like it was suggested by Thierry Reding in review comment to "memory: tegra-mc: Add interconnect framework".
- The MC's ICC xlate_extended() now is a per-SoC hook. Suggested by Thierry Reding.
- Corrected and improved the debugfs of the EMC drivers which transitioned to OPP table usage. The debug code now uses OPP API, which is must-have for voltage scaling, and min/max rate limits aren't changed using the clk API because OPP API should be used.
- The tegra20-devfeq driver is removed and replaced with the EMC_STAT driver, which is now a part of the T20 EMC driver. Suggested by Thierry Reding. Implemented in these patches:
memory: tegra20-emc: Add devfreq support
PM / devfreq: tegra20: Deprecate in a favor of emc-stat based driver
- Reordered patches, like it was suggested by Krzysztof Kozlowski by having patches which make smaller improvements before patches which add new features.
- The EMC drivers now query actual DRAM bus width from hardware instead of hardcoding the default-expected value.
- The EMC drivers now properly account clock rate requests from different internal sources (ICC, debugfs, etc) by selecting the fastest clock rate.
- There are lots of miscellaneous minor clean-ups and improvements. All patches were fully re-tested.
- Rebased patches on a recent linux-next. Fixed merge conflicts with the recent Tegra DRM driver changes.
- Improved tegra30-devfeq patches by implementing suggestions from Chanwoo Choi. Removed unnecessary EPROBE_DEFER handling, added clarifying comment for the KHz conversions, improved code that touches ARRAY_SIZE.
v6: - This series was massively reworked in comparison to v5, most of the
patches that previously got r-b need a new round of a review (!).
- Added missed clk-rounding to the set() callback of EMC ICC providers. Now clk_set_min_rate() doesn't error out on rate overflow.
- Now peak bandwidth is properly taken into account by the set() callback of EMC ICC providers.
- EMC runs at 2x of the DRAM bus only on Tegra20, this now taken in account properly by the EMC ICC set() callbacks.
- ICC drivers use new icc_sync_state() and xlate_extended().
- ICC drivers support new TEGRA_MC_ICC_TAG_ISO for ICC paths, which conveys to ICC driver that memory path uses isochronous transfers.
- Added support for memory latency scaling to Tegra30 ICC provider. It's required for fixing display FIFO underflows on T30.
- Added basic interconnect support to Tegra124 drivers.
- Tegra20/30/124 EMC drivers now support voltage scaling using generic OPP API.
- The display bandwidth management is reworked and improved. It now supports both bandwidth and latency allocations. The nv-display is now also taken into account properly, i.e. it's kept untouched. The extra bandwidth reservation required for ISO clients is moved from DC driver to the ICC drivers.
- Dropped patch that tuned T20 display controller memory client because turned out that it kills ~30% of memory bandwidth. It should be possible to support client tuning, but it's too complicated for now.
- Corrected display's cursor and winb-vfilter ICC clients. The winb-vfilter was erroneously used in place of cursor's client in device-trees.
- Added devm_tegra_get_memory_controller() and switched drivers to use it.
- Device-tree OPP tables are now supported by memory and devfreq drivers.
- Tegra20-devfeq driver is reworked and now uses EMC-stats instead of IMC-stats (which are nearly identical modules) because previously I failed to understand how EMC-stats work and succeeded this time, thinking that it simply doesn't work. This removes a bit icky dependency on using both EMC and MC drivers simultaneously by the devfreq driver.
- Tegra20-devfeq driver now is a sub-device of the EMC, it also now uses interconnect API for driving memory bandwidth.
- Tegra30-devfreq got interconnect support.
- Devfreq patches now use dev_err_probe(), which was suggested by Chanwoo Choi.
- Added acks from Chanwoo Choi and Rob Herring to the reviewed and unchanged patches.
- Added tested-by from Peter Geis and Nicolas Chauvet, who tested this series on Ouya and TK1 devices, reporting that it fixes display corruption on these devices which happened due to insufficient memory bandwidth.
- Added patches to fix T20 EMC registers size.
- Fixed missing LA entry for PTC in the Tegra MC drivers.
- New and updated patches in v6:
dt-bindings: memory: tegra20: emc: Correct registers range in example
dt-bindings: memory: tegra20: emc: Document nvidia,memory-controller property
dt-bindings: memory: tegra20: emc: Document OPP table and voltage regulator
dt-bindings: memory: tegra20: emc: Document mfd-simple compatible and statistics sub-device
dt-bindings: memory: tegra30: emc: Document OPP table and voltage regulator
dt-bindings: memory: tegra124: mc: Document new interconnect property
dt-bindings: memory: tegra124: emc: Document new interconnect property
dt-bindings: memory: tegra124: emc: Document OPP table and voltage regulator
dt-bindings: tegra30-actmon: Document OPP and interconnect properties
dt-bindings: memory: tegra124: Add memory client IDs
ARM: tegra: Correct EMC registers size in Tegra20 device-tree
ARM: tegra: Add interconnect properties to Tegra124 device-tree
ARM: tegra: Add nvidia,memory-controller phandle to Tegra20 EMC device-tree
ARM: tegra: Add DVFS properties to Tegra20 EMC device-tree node
ARM: tegra: Add DVFS properties to Tegra30 EMC and ACTMON device-tree nodes
ARM: tegra: Add DVFS properties to Tegra124 EMC and ACTMON device-tree nodes
memory: tegra: Add and use devm_tegra_get_memory_controller()
memory: tegra-mc: Add interconnect framework
memory: tegra20: Support interconnect framework
memory: tegra20-emc: Skip parsing of emc-stats DT sub-node
memory: tegra: Add missing latency allowness entry for Page Table Cache
memory: tegra: Add FIFO sizes to Tegra30 memory clients
memory: tegra30: Support interconnect framework
memory: tegra124-emc: Make driver modular
memory: tegra124: Support interconnect framework
memory: tegra: Remove superfluous error messages around platform_get_irq() drm/tegra: dc: Support memory bandwidth management
drm/tegra: dc: Extend debug stats with total number of events
PM / devfreq: tegra20: Convert to EMC_STAT driver, support interconnect and device-tree PM / devfreq: tegra30: Support interconnect and OPPs from device-tree
PM / devfreq: tegra30: Separate configurations per-SoC generation
opp: Put interconnect paths outside of opp_table_lock
v5: - The devfreq drivers now won't probe if memory timings aren't specified
in a device-tree, like was suggested by Chanwoo Choi in a review comment to v4. Initially I wanted to always probe the driver even with a single fixed memory freq, but after a closer look turned out it can't be done easily for Tegra20 driver.
- The "interconnect: Relax requirement in of_icc_get_from_provider()" patch was already applied, hence one less patch in comparison to v4.
- Renamed display interconnect paths in accordance to the names that were used by Thierry Reding in one of his recent patches that supposed to update the Host1x's DT binding.
- Added acks from Chanwoo Choi.
- Added clarifying comment to tegra_mc_icc_set() about why it's a dummy function, this is done in a response to the review comment made by Georgi Djakov to v4.
v4: - All drivers that use interconnect API now select it in the Kconfig in
order to properly express the build dependency.
- The IS_ENABLED(CONFIG_INTERCONNECT) is dropped now from all patches.
- Added MODULE_AUTHOR() to the modularized drivers, for completeness.
- Added missed TEGRA_MC Kconfig dependency for the Tegra20 EMC driver.
- Added more acks from Rob Herring that I accidentally missed to add in v3.
v3: - Added acks from Rob Herring that were given to some of the v2 patches.
- Specified name of the TRM documentation chapter in the patch "dt-bindings: host1x: Document new interconnect properties", which was suggested by Rob Herring in the review comment to v2.
- Added patches that allow EMC drivers to be compiled as a loadable kernel modules. This came up during of the v2 review when Georgi Djakov pointed out that interconnect-core could be compiled as a kernel module. Please note that the Tegra124 EMC driver is compile-tested only, I don't have Tegra124 HW.
- In the review comment to [1] Stephen Boyd suggested that it will be better not to make changes to clk API, which was needed in order to avoid clashing of the interconnect driver with the devfreq in regards to memory clk-rate rounding.
[1] https://patchwork.ozlabs.org/project/linux-tegra/patch/[email protected]/
Stephen Boyd suggested that instead we should provide OPP table via DT. I tried to investigate whether this could be done and turned out it's a bit complicated. Technically it should be doable, but:
1. For now we don't fully support voltage scaling of the CORE regulator and so OPP table in the DT isn't really needed today. We can generate table from the memory timings, which is what Tegra devfreq drivers already do.
2. The OPP table should be defined in the DT for the Memory Controller node and then its usage somehow should be shared by both interconnect and devfreq drivers. It's not obvious what's the best way to do it.
So, it will be much better to postpone the DT OPP table addition until these questions are resolved. We can infer OPPs from the memory timings and we could get the memory rates from the memory driver directly, avoiding the problems induced by the clk API usage. This idea is implemented in v3, see these patches:
PM / devfreq: tegra20: Use MC timings for building OPP table PM / devfreq: tegra30: Use MC timings for building OPP table
v2: - Instead of a single dma-mem interconnect path, the paths are now
defined per memory client.
- The EMC provider now uses #interconnect-cells=<0>.
- Dropped Tegra124 because there is no enough information about how to properly calculate required EMC clock rate for it and I don't have hardware for testing. Somebody else will have to work on it.
- Moved interconnect providers code into drivers/memory/tegra/*.
- Added "Create tegra20-devfreq device" patch because interconnect is not very usable without the devfreq memory auto-scaling since memory freq will be fixed to the display's requirement.
Dmitry Osipenko (47):
clk: tegra: Export Tegra20 EMC kernel symbols
soc/tegra: fuse: Export tegra_read_ram_code()
soc/tegra: fuse: Add stub for tegra_sku_info
dt-bindings: memory: tegra20: emc: Correct registers range in example
dt-bindings: memory: tegra20: emc: Document nvidia,memory-controller
property
dt-bindings: memory: tegra20: mc: Document new interconnect property
dt-bindings: memory: tegra20: emc: Document new interconnect property
dt-bindings: memory: tegra20: emc: Document OPP table and voltage
regulator
dt-bindings: memory: tegra30: mc: Document new interconnect property
dt-bindings: memory: tegra30: emc: Document new interconnect property
dt-bindings: memory: tegra30: emc: Document OPP table and voltage
regulator
dt-bindings: memory: tegra124: mc: Document new interconnect property
dt-bindings: memory: tegra124: emc: Document new interconnect property
dt-bindings: memory: tegra124: emc: Document OPP table and voltage
regulator
dt-bindings: tegra30-actmon: Document OPP and interconnect properties
dt-bindings: host1x: Document new interconnect properties
dt-bindings: memory: tegra20: Add memory client IDs
dt-bindings: memory: tegra30: Add memory client IDs
dt-bindings: memory: tegra124: Add memory client IDs
ARM: tegra: Correct EMC registers size in Tegra20 device-tree
ARM: tegra: Add interconnect properties to Tegra20 device-tree
ARM: tegra: Add interconnect properties to Tegra30 device-tree
ARM: tegra: Add interconnect properties to Tegra124 device-tree
ARM: tegra: Add nvidia,memory-controller phandle to Tegra20 EMC
device-tree
ARM: tegra: Add DVFS properties to Tegra20 EMC device-tree node
ARM: tegra: Add DVFS properties to Tegra30 EMC and ACTMON device-tree
nodes
ARM: tegra: Add DVFS properties to Tegra124 EMC and ACTMON device-tree
nodes
memory: tegra: Add and use devm_tegra_memory_controller_get()
memory: tegra: Use devm_platform_ioremap_resource()
memory: tegra: Remove superfluous error messages around
platform_get_irq()
memory: tegra: Add missing latency allowness entry for Page Table
Cache
memory: tegra-mc: Add interconnect framework
memory: tegra20-emc: Make driver modular
memory: tegra20-emc: Continue probing if timings are missing in
device-tree
memory: tegra20: Support interconnect framework
memory: tegra20-emc: Add devfreq support
memory: tegra30: Add FIFO sizes to memory clients
memory: tegra30-emc: Make driver modular
memory: tegra30-emc: Continue probing if timings are missing in
device-tree
memory: tegra30: Support interconnect framework
memory: tegra124-emc: Make driver modular
memory: tegra124: Support interconnect framework drm/tegra: dc: Support memory bandwidth management drm/tegra: dc: Extend debug stats with total number of events PM / devfreq: tegra30: Support interconnect and OPPs from device-tree PM / devfreq: tegra30: Separate configurations per-SoC generation PM / devfreq: tegra20: Deprecate in a favor of emc-stat based driver
.../arm/tegra/nvidia,tegra30-actmon.txt | 25 + .../display/tegra/nvidia,tegra20-host1x.txt | 68 +++ .../nvidia,tegra124-emc.yaml | 19 + .../nvidia,tegra124-mc.yaml | 5 + .../memory-controllers/nvidia,tegra20-emc.txt | 22 +- .../memory-controllers/nvidia,tegra20-mc.txt | 3 + .../nvidia,tegra30-emc.yaml | 18 + .../memory-controllers/nvidia,tegra30-mc.yaml | 5 + arch/arm/boot/dts/tegra124-apalis-emc.dtsi | 8 + .../arm/boot/dts/tegra124-jetson-tk1-emc.dtsi | 8 + arch/arm/boot/dts/tegra124-nyan-big-emc.dtsi | 10 + .../arm/boot/dts/tegra124-nyan-blaze-emc.dtsi | 10 + .../boot/dts/tegra124-peripherals-opp.dtsi | 419 ++++++++++++++++ arch/arm/boot/dts/tegra124.dtsi | 31 ++ .../boot/dts/tegra20-acer-a500-picasso.dts | 7 + arch/arm/boot/dts/tegra20-colibri.dtsi | 4 + arch/arm/boot/dts/tegra20-paz00.dts | 6 + .../arm/boot/dts/tegra20-peripherals-opp.dtsi | 92 ++++ arch/arm/boot/dts/tegra20.dtsi | 33 +- .../tegra30-asus-nexus7-grouper-common.dtsi | 4 + ...30-asus-nexus7-grouper-memory-timings.dtsi | 12 + .../arm/boot/dts/tegra30-peripherals-opp.dtsi | 383 +++++++++++++++ arch/arm/boot/dts/tegra30.dtsi | 33 +- drivers/clk/tegra/Makefile | 3 +- drivers/clk/tegra/clk-tegra124-emc.c | 41 +- drivers/clk/tegra/clk-tegra124.c | 27 +- drivers/clk/tegra/clk-tegra20-emc.c | 3 + drivers/clk/tegra/clk.h | 16 +- drivers/devfreq/Kconfig | 10 - drivers/devfreq/Makefile | 1 - drivers/devfreq/tegra20-devfreq.c | 210 -------- drivers/devfreq/tegra30-devfreq.c | 164 ++++--- drivers/gpu/drm/tegra/Kconfig | 1 + drivers/gpu/drm/tegra/dc.c | 359 ++++++++++++++ drivers/gpu/drm/tegra/dc.h | 19 + drivers/gpu/drm/tegra/drm.c | 14 + drivers/gpu/drm/tegra/hub.c | 3 + drivers/gpu/drm/tegra/plane.c | 121 +++++ drivers/gpu/drm/tegra/plane.h | 15 + drivers/memory/tegra/Kconfig | 14 +- drivers/memory/tegra/mc.c | 155 +++++- drivers/memory/tegra/mc.h | 22 + drivers/memory/tegra/tegra114.c | 6 + drivers/memory/tegra/tegra124-emc.c | 378 +++++++++++++-- drivers/memory/tegra/tegra124.c | 88 +++- drivers/memory/tegra/tegra20-emc.c | 458 ++++++++++++++++-- drivers/memory/tegra/tegra20.c | 77 +++ drivers/memory/tegra/tegra210-emc-core.c | 39 +- drivers/memory/tegra/tegra30-emc.c | 353 ++++++++++++-- drivers/memory/tegra/tegra30.c | 245 +++++++++- drivers/soc/tegra/fuse/tegra-apbmisc.c | 2 + include/dt-bindings/memory/tegra124-mc.h | 68 +++ include/dt-bindings/memory/tegra20-mc.h | 53 ++ include/dt-bindings/memory/tegra30-mc.h | 67 +++ include/linux/clk/tegra.h | 8 + include/soc/tegra/emc.h | 16 - include/soc/tegra/fuse.h | 4 + include/soc/tegra/mc.h | 27 ++ 58 files changed, 3852 insertions(+), 460 deletions(-) create mode 100644 arch/arm/boot/dts/tegra124-peripherals-opp.dtsi create mode 100644 arch/arm/boot/dts/tegra20-peripherals-opp.dtsi create mode 100644 arch/arm/boot/dts/tegra30-peripherals-opp.dtsi delete mode 100644 drivers/devfreq/tegra20-devfreq.c delete mode 100644 include/soc/tegra/emc.h
Signature · 1 line
2.27.0
Dmitry Osipenko
maintainerPATCH v7 1/47 clk: tegra: Export Tegra20 EMC kernel symbols
We're going to modularize Tegra EMC drivers and some of the EMC-clock driver symbols need to be exported, let's export them.
--- drivers/clk/tegra/clk-tegra20-emc.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/clk/tegra/clk-tegra20-emc.c +3 -0
@@ -13,6 +13,7 @@#include <linux/clk-provider.h> #include <linux/clk/tegra.h> #include <linux/err.h> +#include <linux/export.h> #include <linux/io.h> #include <linux/kernel.h> #include <linux/slab.h>
@@ -235,6 +236,7 @@ void tegra20_clk_set_emc_round_callback(tegra20_clk_emc_round_cb *round_cb, emc->cb_arg = cb_arg; } } +EXPORT_SYMBOL_GPL (tegra20_clk_set_emc_round_callback);bool tegra20_clk_emc_driver_available (struct clk_hw *emc_hw) {
@@ -291,3 +293,4 @@ int tegra20_clk_prepare_emc_mc_same_freq(struct clk *emc_clk, bool same)return 0 ; } +EXPORT_SYMBOL_GPL (tegra20_clk_prepare_emc_mc_same_freq);
Signature · 1 line
2.27.0
Re: [PATCH v7 01/47] clk: tegra: Export Tegra20 EMC kernel symbols
Quoted 8 lines · Dmitry Osipenko
We're going to modularize Tegra EMC drivers and some of the EMC-clock driver symbols need to be exported, let's export them.
Acked-by Thierry Reding <[email protected]>Signed-off-by Dmitry Osipenko <[email protected]>--- drivers/clk/tegra/clk-tegra20-emc.c | 3 +++ 1 file changed, 3 insertions(+)
Thanks, applied.
I'll keep all Tegra patches on separate branch and I can provide a stable tag for other tree. Just let me know.
Best regards,
Krzysztof
Dmitry Osipenko
maintainerPATCH v7 2/47 soc/tegra: fuse: Export tegra_read_ram_code()
In reply to Dmitry OsipenkoThe tegra_read_ram_code() is used by EMC drivers and we're going to make these driver modular, hence this function needs to be exported.
--- drivers/soc/tegra/fuse/tegra-apbmisc.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/soc/tegra/fuse/tegra-apbmisc.c +2 -0
@@ -3,6 +3,7 @@* Copyright (c) 2014, NVIDIA CORPORATION. All rights reserved. */ +#include <linux/export.h> #include <linux/kernel.h> #include <linux/of.h> #include <linux/of_address.h>
@@ -90,6 +91,7 @@ u32 tegra_read_ram_code(void)return straps >>PMC_STRAPPING_OPT_A_RAM_CODE_SHIFT ; } +EXPORT_SYMBOL_GPL (tegra_read_ram_code);static const struct of_device_id apbmisc_match[]__initconst = { { .compatible ="nvidia,tegra20-apbmisc" , },
Signature · 1 line
2.27.0
Re: [PATCH v7 02/47] soc/tegra: fuse: Export tegra_read_ram_code()
Quoted 7 lines · Dmitry Osipenko
The
tegra_read_ram_code()is used by EMC drivers and we're going to make these driver modular, hence this function needs to be exported.Acked-by Thierry Reding <[email protected]>Signed-off-by Dmitry Osipenko <[email protected]>--- drivers/soc/tegra/fuse/tegra-apbmisc.c | 2 ++
Thanks, applied.
Best regards,
Krzysztof
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
Dmitry Osipenko
maintainerPATCH v7 3/47 soc/tegra: fuse: Add stub for tegra_sku_info
In reply to Dmitry OsipenkoDrivers that use tegra_sku_info and have COMPILE_TEST are failing to be build due to the missing stub for tegra_sku_info, thus add the missing stub.
--- include/soc/tegra/fuse.h | 4 ++++ 1 file changed, 4 insertions(+)
include/soc/tegra/fuse.h +4 -0
@@ -56,7 +56,11 @@ 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 ; +#endif struct device *tegra_soc_device_register (void );
Signature · 1 line
2.27.0
Re: [PATCH v7 03/47] soc/tegra: fuse: Add stub for tegra_sku_info
Quoted 7 lines · Dmitry Osipenko
Drivers that use
tegra_sku_infoand haveCOMPILE_TESTare failing to be build due to the missing stub fortegra_sku_info, thus add the missing stub.Signed-off-by Dmitry Osipenko <[email protected]>--- include/soc/tegra/fuse.h | 4 ++++
Thanks, applied.
Best regards,
Krzysztof
Dmitry Osipenko
maintainerPATCH v7 4/47 dt-bindings: memory: tegra20: emc: Correct registers range in example
In reply to Dmitry OsipenkoThere is superfluous zero in the registers base address and registers size should be twice bigger.
--- .../bindings/memory-controllers/nvidia,tegra20-emc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
Documentation/devicetree/bindings/memory-controllers/nvidia,tegra20-emc.txt +1 -1
@@ -21,7 +21,7 @@ Example: #address-cells = < 1 >; #size-cells = < 0 >; compatible = "nvidia,tegra20-emc"; - reg = <0x7000f4000 0x200>; + reg = <0x7000f400 0x400>; interrupts = <0 78 0x04>; clocks = <&tegra_car TEGRA20_CLK_EMC>; }
Signature · 1 line
2.27.0
Re: [PATCH v7 04/47] dt-bindings: memory: tegra20: emc: Correct registers range in example
Quoted 8 lines · Dmitry Osipenko
There is superfluous zero in the registers base address and registers size should be twice bigger.
Acked-by Rob Herring <[email protected]>Acked-by Thierry Reding <[email protected]>Signed-off-by Dmitry Osipenko <[email protected]>--- .../bindings/memory-controllers/nvidia,tegra20-emc.txt | 2 +-
Thanks, applied.
Best regards,
Krzysztof
Dmitry Osipenko
maintainerPATCH v7 5/47 dt-bindings: memory: tegra20: emc: Document nvidia,memory-controller property
In reply to Dmitry OsipenkoTegra20 External Memory Controller talks to DRAM chips and it needs to be reprogrammed when memory frequency changes. Tegra Memory Controller sits behind EMC and these controllers are tightly coupled. This patch adds the new phandle property which allows to properly express connection of EMC and MC hardware in a device-tree, it also put the Tegra20 EMC binding on par with Tegra30+ EMC bindings, which is handy to have.
--- .../bindings/memory-controllers/nvidia,tegra20-emc.txt | 2 ++ 1 file changed, 2 insertions(+)
Documentation/devicetree/bindings/memory-controllers/nvidia,tegra20-emc.txt +2 -0
@@ -12,6 +12,7 @@ Properties: irrespective of ram-code configuration. - interrupts : Should contain EMC General interrupt. - clocks : Should contain EMC clock. +- nvidia,memory-controller : Phandle of the Memory Controller node. Child device nodes describe the memory settings for different configurations and clock rates.
@@ -24,6 +25,7 @@ Example: reg = <0x7000f400 0x400>; interrupts = <0 78 0x04>; clocks = <&tegra_car TEGRA20_CLK_EMC>; + nvidia,memory-controller = <&mc>; }
Signature · 1 line
2.27.0
Re: [PATCH v7 05/47] dt-bindings: memory: tegra20: emc: Document nvidia,memory-controller property
Quoted 11 lines · Dmitry Osipenko
Tegra20 External Memory Controller talks to DRAM chips and it needs to be reprogrammed when memory frequency changes. Tegra Memory Controller sits behind EMC and these controllers are tightly coupled. This patch adds the new phandle property which allows to properly express connection of EMC and MC hardware in a device-tree, it also put the Tegra20 EMC binding on par with Tegra30+ EMC bindings, which is handy to have.
Acked-by Rob Herring <[email protected]>Signed-off-by Dmitry Osipenko <[email protected]>--- .../bindings/memory-controllers/nvidia,tegra20-emc.txt | 2 ++
Thanks, applied.
Best regards,
Krzysztof
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
Dmitry Osipenko
maintainerPATCH v7 6/47 dt-bindings: memory: tegra20: mc: Document new interconnect property
In reply to Dmitry OsipenkoMemory controller is interconnected with memory clients and with the External Memory Controller. Document new interconnect property which turns memory controller into interconnect provider.
--- .../bindings/memory-controllers/nvidia,tegra20-mc.txt | 3 +++ 1 file changed, 3 insertions(+)
Documentation/devicetree/bindings/memory-controllers/nvidia,tegra20-mc.txt +3 -0
@@ -16,6 +16,8 @@ Required properties: IOMMU specifier needed to encode an address. GART supports only a single address space that is shared by all devices, therefore no additional information needed for the address encoding. +- #interconnect-cells : Should be 1. This cell represents memory client. + The assignments may be found in header file <dt-bindings/memory/tegra20-mc.h>. Example: mc: memory-controller@7000f000 {
@@ -27,6 +29,7 @@ Example: interrupts = <GIC_SPI 77 0x04>; #reset-cells = <1>; #iommu-cells = <0>; + #interconnect-cells = <1>; }; video-codec@6001a000 {
Signature · 1 line
2.27.0
Re: [PATCH v7 06/47] dt-bindings: memory: tegra20: mc: Document new interconnect property
Quoted 8 lines · Dmitry Osipenko
Memory controller is interconnected with memory clients and with the External Memory Controller. Document new interconnect property which turns memory controller into interconnect provider.
Acked-by Rob Herring <[email protected]>Signed-off-by Dmitry Osipenko <[email protected]>--- .../bindings/memory-controllers/nvidia,tegra20-mc.txt | 3 +++
Thanks, applied.
Best regards,
Krzysztof
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
Dmitry Osipenko
maintainerPATCH v7 7/47 dt-bindings: memory: tegra20: emc: Document new interconnect property
In reply to Dmitry OsipenkoExternal Memory Controller is interconnected with memory controller and with external memory. Document new interconnect property which turns EMC into interconnect provider.
--- .../bindings/memory-controllers/nvidia,tegra20-emc.txt | 2 ++ 1 file changed, 2 insertions(+)
Documentation/devicetree/bindings/memory-controllers/nvidia,tegra20-emc.txt +2 -0
@@ -13,6 +13,7 @@ Properties: - interrupts : Should contain EMC General interrupt. - clocks : Should contain EMC clock. - nvidia,memory-controller : Phandle of the Memory Controller node. +- #interconnect-cells : Should be 0. Child device nodes describe the memory settings for different configurations and clock rates.
@@ -21,6 +22,7 @@ Example: memory-controller@7000f400 { #address-cells = < 1 >; #size-cells = < 0 >; + #interconnect-cells = <0>; compatible = "nvidia,tegra20-emc"; reg = <0x7000f400 0x400>; interrupts = <0 78 0x04>;
Signature · 1 line
2.27.0
Re: [PATCH v7 07/47] dt-bindings: memory: tegra20: emc: Document new interconnect property
Quoted 8 lines · Dmitry Osipenko
External Memory Controller is interconnected with memory controller and with external memory. Document new interconnect property which turns EMC into interconnect provider.
Acked-by Rob Herring <[email protected]>Signed-off-by Dmitry Osipenko <[email protected]>--- .../bindings/memory-controllers/nvidia,tegra20-emc.txt | 2 ++
Thanks, applied.
Best regards,
Krzysztof
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
Dmitry Osipenko
maintainerPATCH v7 8/47 dt-bindings: memory: tegra20: emc: Document OPP table and voltage regulator
In reply to Dmitry OsipenkoThe SoC core voltage can't be changed without taking into account the clock rate of External Memory Controller. Document OPP table that will be used for dynamic voltage frequency scaling, taking into account EMC voltage requirement. Document optional core voltage regulator, which is optional because some boards may have a fixed core regulator and still frequency scaling may be desired to have.
--- .../memory-controllers/nvidia,tegra20-emc.txt | 16 ++++++++++++++++ 1 file changed, 16 insertions(+)
Documentation/devicetree/bindings/memory-controllers/nvidia,tegra20-emc.txt +16 -0
@@ -14,11 +14,25 @@ Properties: - clocks : Should contain EMC clock. - nvidia,memory-controller : Phandle of the Memory Controller node. - #interconnect-cells : Should be 0. +- operating-points-v2: See ../bindings/opp/opp.txt for details. + +Optional properties: +- core-supply: Phandle of voltage regulator of the SoC "core" power domain. Child device nodes describe the memory settings for different configurations and clock rates. Example: + opp_table: opp-table { + compatible = "operating-points-v2"; + + opp@36000000 { + opp-microvolt = <950000 950000 1300000>; + opp-hz = /bits/ 64 <36000000>; + }; + ... + }; + memory-controller@7000f400 { #address-cells = < 1 >; #size-cells = < 0 >;
@@ -28,6 +42,8 @@ Example: interrupts = <0 78 0x04>; clocks = <&tegra_car TEGRA20_CLK_EMC>; nvidia,memory-controller = <&mc>; + core-supply = <&core_vdd_reg>; + operating-points-v2 = <&opp_table>; }
Signature · 1 line
2.27.0
Re: [PATCH v7 08/47] dt-bindings: memory: tegra20: emc: Document OPP table and voltage regulator
Quoted 7 lines · Dmitry Osipenko
The SoC core voltage can't be changed without taking into account the clock rate of External Memory Controller. Document OPP table that will be used for dynamic voltage frequency scaling, taking into account EMC voltage requirement. Document optional core voltage regulator, which is optional because some boards may have a fixed core regulator and still frequency scaling may be desired to have.
Quoted 5 lines
Signed-off-by Dmitry Osipenko <[email protected]>--- .../memory-controllers/nvidia,tegra20-emc.txt | 16 ++++++++++++++++ 1 file changed, 16 insertions(+)
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
Re: [PATCH v7 08/47] dt-bindings: memory: tegra20: emc: Document OPP table and voltage regulator
In reply to Dmitry OsipenkoQuoted 10 lines · Dmitry Osipenko
The SoC core voltage can't be changed without taking into account the clock rate of External Memory Controller. Document OPP table that will be used for dynamic voltage frequency scaling, taking into account EMC voltage requirement. Document optional core voltage regulator, which is optional because some boards may have a fixed core regulator and still frequency scaling may be desired to have.
Signed-off-by Dmitry Osipenko <[email protected]>--- .../memory-controllers/nvidia,tegra20-emc.txt | 16 ++++++++++++++++
Thanks, applied.
Best regards,
Krzysztof
Dmitry Osipenko
maintainerPATCH v7 9/47 dt-bindings: memory: tegra30: mc: Document new interconnect property
In reply to Dmitry OsipenkoMemory controller is interconnected with memory clients and with the External Memory Controller. Document new interconnect property which turns memory controller into interconnect provider.
--- .../bindings/memory-controllers/nvidia,tegra30-mc.yaml | 5 +++++ 1 file changed, 5 insertions(+)
Documentation/devicetree/bindings/memory-controllers/nvidia,tegra30-mc.yaml +5 -0
@@ -57,6 +57,9 @@ properties: "#iommu-cells": const: 1 + "#interconnect-cells": + const: 1 + patternProperties: "^emc-timings-[0-9]+$": type: object
@@ -120,6 +123,7 @@ required: - clock-names - "#reset-cells" - "#iommu-cells" + - "#interconnect-cells" additionalProperties: false
@@ -135,6 +139,7 @@ examples: #iommu-cells = <1>; #reset-cells = <1>; + #interconnect-cells = <1>; emc-timings-1 { nvidia,ram-code = <1>;
Signature · 1 line
2.27.0
Re: [PATCH v7 09/47] dt-bindings: memory: tegra30: mc: Document new interconnect property
Quoted 9 lines · Dmitry Osipenko
Memory controller is interconnected with memory clients and with the External Memory Controller. Document new interconnect property which turns memory controller into interconnect provider.
Acked-by Rob Herring <[email protected]>Signed-off-by Dmitry Osipenko <[email protected]>--- .../bindings/memory-controllers/nvidia,tegra30-mc.yaml | 5 +++++ 1 file changed, 5 insertions(+)
Thanks, applied.
Best regards,
Krzysztof
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
Dmitry Osipenko
maintainerPATCH v7 10/47 dt-bindings: memory: tegra30: emc: Document new interconnect property
In reply to Dmitry OsipenkoExternal memory controller is interconnected with memory controller and with external memory. Document new interconnect property which turns External Memory Controller into interconnect provider.
--- .../bindings/memory-controllers/nvidia,tegra30-emc.yaml | 6 ++++++ 1 file changed, 6 insertions(+)
Documentation/devicetree/bindings/memory-controllers/nvidia,tegra30-emc.yaml +6 -0
@@ -31,6 +31,9 @@ properties: interrupts: maxItems: 1 + "#interconnect-cells": + const: 0 + nvidia,memory-controller: $ref: /schemas/types.yaml#/definitions/phandle description:
@@ -214,6 +217,7 @@ required: - interrupts - clocks - nvidia,memory-controller + - "#interconnect-cells" additionalProperties: false
@@ -227,6 +231,8 @@ examples: nvidia,memory-controller = <&mc>; + #interconnect-cells = <0>; + emc-timings-1 { nvidia,ram-code = <1>;
Signature · 1 line
2.27.0
Re: [PATCH v7 10/47] dt-bindings: memory: tegra30: emc: Document new interconnect property
Quoted 9 lines · Dmitry Osipenko
External memory controller is interconnected with memory controller and with external memory. Document new interconnect property which turns External Memory Controller into interconnect provider.
Acked-by Rob Herring <[email protected]>Signed-off-by Dmitry Osipenko <[email protected]>--- .../bindings/memory-controllers/nvidia,tegra30-emc.yaml | 6 ++++++ 1 file changed, 6 insertions(+)
Thanks, applied.
Best regards,
Krzysztof
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
Dmitry Osipenko
maintainerPATCH v7 11/47 dt-bindings: memory: tegra30: emc: Document OPP table and voltage regulator
In reply to Dmitry OsipenkoDocument new OPP table and voltage regulator properties which are needed for supporting dynamic voltage-frequency scaling of the memory controller. Some boards may have a fixed core voltage regulator, hence it's optional because frequency scaling still may be desired.
--- .../memory-controllers/nvidia,tegra30-emc.yaml | 12 ++++++++++++ 1 file changed, 12 insertions(+)
Documentation/devicetree/bindings/memory-controllers/nvidia,tegra30-emc.yaml +12 -0
@@ -39,6 +39,15 @@ properties: description: Phandle of the Memory Controller node. + core-supply: + description: + Phandle of voltage regulator of the SoC "core" power domain. + + operating-points-v2: + description: + Should contain freqs and voltages and opp-supported-hw property, which + is a bitfield indicating SoC speedo ID mask. + patternProperties: "^emc-timings-[0-9]+$": type: object
@@ -218,6 +227,7 @@ required: - clocks - nvidia,memory-controller - "#interconnect-cells" + - operating-points-v2 additionalProperties: false
@@ -230,6 +240,8 @@ examples: clocks = <&tegra_car 57>; nvidia,memory-controller = <&mc>; + operating-points-v2 = <&dvfs_opp_table>; + core-supply = <&vdd_core>; #interconnect-cells = <0>;
Signature · 1 line
2.27.0
Re: [PATCH v7 11/47] dt-bindings: memory: tegra30: emc: Document OPP table and voltage regulator
Quoted 10 lines · Dmitry Osipenko
Document new OPP table and voltage regulator properties which are needed for supporting dynamic voltage-frequency scaling of the memory controller. Some boards may have a fixed core voltage regulator, hence it's optional because frequency scaling still may be desired.
Reviewed-by Rob Herring <[email protected]>Signed-off-by Dmitry Osipenko <[email protected]>--- .../memory-controllers/nvidia,tegra30-emc.yaml | 12 ++++++++++++ 1 file changed, 12 insertions(+)
Thanks, applied.
Best regards,
Krzysztof
Dmitry Osipenko
maintainerPATCH v7 12/47 dt-bindings: memory: tegra124: mc: Document new interconnect property
In reply to Dmitry OsipenkoMemory controller is interconnected with memory clients and with the External Memory Controller. Document new interconnect property which turns memory controller into interconnect provider.
--- .../bindings/memory-controllers/nvidia,tegra124-emc.yaml | 1 + .../bindings/memory-controllers/nvidia,tegra124-mc.yaml | 5 +++++ 2 files changed, 6 insertions(+)
Documentation/devicetree/bindings/memory-controllers/nvidia,tegra124-emc.yaml +1 -0
@@ -345,6 +345,7 @@ examples: #iommu-cells = <1>; #reset-cells = <1>; + #interconnect-cells = <1>; }; external-memory-controller@7001b000 {
Documentation/devicetree/bindings/memory-controllers/nvidia,tegra124-mc.yaml +5 -0
@@ -40,6 +40,9 @@ properties: "#iommu-cells": const: 1 + "#interconnect-cells": + const: 1 + patternProperties: "^emc-timings-[0-9]+$": type: object
@@ -104,6 +107,7 @@ required: - clock-names - "#reset-cells" - "#iommu-cells" + - "#interconnect-cells" additionalProperties: false
@@ -119,6 +123,7 @@ examples: #iommu-cells = <1>; #reset-cells = <1>; + #interconnect-cells = <1>; emc-timings-3 { nvidia,ram-code = <3>;
Signature · 1 line
2.27.0
Re: [PATCH v7 12/47] dt-bindings: memory: tegra124: mc: Document new interconnect property
Quoted 10 lines · Dmitry Osipenko
Memory controller is interconnected with memory clients and with the External Memory Controller. Document new interconnect property which turns memory controller into interconnect provider.
Signed-off-by Dmitry Osipenko <[email protected]>--- .../bindings/memory-controllers/nvidia,tegra124-emc.yaml | 1 + .../bindings/memory-controllers/nvidia,tegra124-mc.yaml | 5 +++++ 2 files changed, 6 insertions(+)
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
Re: [PATCH v7 12/47] dt-bindings: memory: tegra124: mc: Document new interconnect property
In reply to Dmitry OsipenkoQuoted 9 lines · Dmitry Osipenko
Memory controller is interconnected with memory clients and with the External Memory Controller. Document new interconnect property which turns memory controller into interconnect provider.
Signed-off-by Dmitry Osipenko <[email protected]>--- .../bindings/memory-controllers/nvidia,tegra124-emc.yaml | 1 + .../bindings/memory-controllers/nvidia,tegra124-mc.yaml | 5 +++++ 2 files changed, 6 insertions(+)
Thanks, applied.
Best regards,
Krzysztof
Dmitry Osipenko
maintainerPATCH v7 13/47 dt-bindings: memory: tegra124: emc: Document new interconnect property
In reply to Dmitry OsipenkoExternal memory controller is interconnected with memory controller and with external memory. Document new interconnect property which turns External Memory Controller into interconnect provider.
--- .../bindings/memory-controllers/nvidia,tegra124-emc.yaml | 6 ++++++ 1 file changed, 6 insertions(+)
Documentation/devicetree/bindings/memory-controllers/nvidia,tegra124-emc.yaml +6 -0
@@ -29,6 +29,9 @@ properties: items: - const: emc + "#interconnect-cells": + const: 0 + nvidia,memory-controller: $ref: /schemas/types.yaml#/definitions/phandle description:
@@ -327,6 +330,7 @@ required: - clocks - clock-names - nvidia,memory-controller + - "#interconnect-cells" additionalProperties: false
@@ -356,6 +360,8 @@ examples: nvidia,memory-controller = <&mc>; + #interconnect-cells = <0>; + emc-timings-0 { nvidia,ram-code = <3>;
Signature · 1 line
2.27.0
Re: [PATCH v7 13/47] dt-bindings: memory: tegra124: emc: Document new interconnect property
Quoted 8 lines · Dmitry Osipenko
External memory controller is interconnected with memory controller and with external memory. Document new interconnect property which turns External Memory Controller into interconnect provider.
Reviewed-by Rob Herring <[email protected]>Signed-off-by Dmitry Osipenko <[email protected]>--- .../bindings/memory-controllers/nvidia,tegra124-emc.yaml | 6 ++++++
Thanks, applied.
Best regards,
Krzysztof
Dmitry Osipenko
maintainerPATCH v7 14/47 dt-bindings: memory: tegra124: emc: Document OPP table and voltage regulator
In reply to Dmitry OsipenkoDocument new OPP table and voltage regulator properties which are needed for supporting dynamic voltage-frequency scaling of the memory controller. Some boards may have a fixed core voltage regulator, hence it's optional because frequency scaling still may be desired.
--- .../memory-controllers/nvidia,tegra124-emc.yaml | 12 ++++++++++++ 1 file changed, 12 insertions(+)
Documentation/devicetree/bindings/memory-controllers/nvidia,tegra124-emc.yaml +12 -0
@@ -37,6 +37,15 @@ properties: description: phandle of the memory controller node + core-supply: + description: + Phandle of voltage regulator of the SoC "core" power domain. + + operating-points-v2: + description: + Should contain freqs and voltages and opp-supported-hw property, which + is a bitfield indicating SoC speedo ID mask. + patternProperties: "^emc-timings-[0-9]+$": type: object
@@ -331,6 +340,7 @@ required: - clock-names - nvidia,memory-controller - "#interconnect-cells" + - operating-points-v2 additionalProperties: false
@@ -359,6 +369,8 @@ examples: clock-names = "emc"; nvidia,memory-controller = <&mc>; + operating-points-v2 = <&dvfs_opp_table>; + core-supply = <&vdd_core>; #interconnect-cells = <0>;
Signature · 1 line
2.27.0
Re: [PATCH v7 14/47] dt-bindings: memory: tegra124: emc: Document OPP table and voltage regulator
Quoted 10 lines · Dmitry Osipenko
Document new OPP table and voltage regulator properties which are needed for supporting dynamic voltage-frequency scaling of the memory controller. Some boards may have a fixed core voltage regulator, hence it's optional because frequency scaling still may be desired.
Reviewed-by Rob Herring <[email protected]>Signed-off-by Dmitry Osipenko <[email protected]>--- .../memory-controllers/nvidia,tegra124-emc.yaml | 12 ++++++++++++ 1 file changed, 12 insertions(+)
Thanks, applied.
Best regards,
Krzysztof
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
Dmitry Osipenko
maintainerPATCH v7 15/47 dt-bindings: tegra30-actmon: Document OPP and interconnect properties
In reply to Dmitry OsipenkoDocument EMC DFS OPP table and interconnect paths that will be used for scaling of system's memory bandwidth based on memory utilization statistics. Previously ACTMON was supposed to drive EMC clock rate directly, but now it should do it using interconnect framework in order to support shared voltage scaling in addition to the frequency scaling.
--- .../arm/tegra/nvidia,tegra30-actmon.txt | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+)
Documentation/devicetree/bindings/arm/tegra/nvidia,tegra30-actmon.txt +25 -0
@@ -18,8 +18,30 @@ clock-names. See ../../clock/clock-bindings.txt for details. ../../reset/reset.txt for details. - reset-names: Must include the following entries: - actmon +- operating-points-v2: See ../bindings/opp/opp.txt for details. +- interconnects: Should contain entries for memory clients sitting on + MC->EMC memory interconnect path. +- interconnect-names: Should include name of the interconnect path for each + interconnect entry. Consult TRM documentation for + information about available memory clients, see MEMORY + CONTROLLER section. + +For each opp entry in 'operating-points-v2' table: +- opp-supported-hw: bitfield indicating SoC speedo ID mask +- opp-peak-kBps: peak bandwidth of the memory channel Example: + dfs_opp_table: opp-table { + compatible = "operating-points-v2"; + + opp@12750000 { + opp-hz = /bits/ 64 <12750000>; + opp-supported-hw = <0x000F>; + opp-peak-kBps = <51000>; + }; + ... + }; + actmon@6000c800 { compatible = "nvidia,tegra124-actmon"; reg = <0x0 0x6000c800 0x0 0x400>;
@@ -29,4 +51,7 @@ Example: clock-names = "actmon", "emc"; resets = <&tegra_car 119>; reset-names = "actmon"; + operating-points-v2 = <&dfs_opp_table>; + interconnects = <&mc TEGRA124_MC_MPCORER &emc>; + interconnect-names = "cpu"; };
Signature · 1 line
2.27.0
Re: [PATCH v7 15/47] dt-bindings: tegra30-actmon: Document OPP and interconnect properties
Quoted 11 lines · Dmitry Osipenko
Document EMC DFS OPP table and interconnect paths that will be used for scaling of system's memory bandwidth based on memory utilization statistics. Previously ACTMON was supposed to drive EMC clock rate directly, but now it should do it using interconnect framework in order to support shared voltage scaling in addition to the frequency scaling.
Reviewed-by Rob Herring <[email protected]>Signed-off-by Dmitry Osipenko <[email protected]>--- .../arm/tegra/nvidia,tegra30-actmon.txt | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+)
Thanks, applied.
Best regards,
Krzysztof
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
Dmitry Osipenko
maintainerPATCH v7 16/47 dt-bindings: host1x: Document new interconnect properties
In reply to Dmitry OsipenkoMost of Host1x devices have at least one memory client. These clients are directly connected to the memory controller. The new interconnect properties represent the memory client's connection to the memory controller.
--- .../display/tegra/nvidia,tegra20-host1x.txt | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+)
Documentation/devicetree/bindings/display/tegra/nvidia,tegra20-host1x.txt +68 -0
@@ -20,6 +20,10 @@ Required properties: - reset-names: Must include the following entries: - host1x +Each host1x client module having to perform DMA through the Memory Controller +should have the interconnect endpoints set to the Memory Client and External +Memory respectively. + The host1x top-level node defines a number of children, each representing one of the following host1x client modules:
@@ -36,6 +40,12 @@ of the following host1x client modules: - reset-names: Must include the following entries: - mpe + Optional properties: + - interconnects: Must contain entry for the MPE memory clients. + - interconnect-names: Must include name of the interconnect path for each + interconnect entry. Consult TRM documentation for information about + available memory clients, see MEMORY CONTROLLER section. + - vi: video input Required properties:
@@ -113,6 +123,12 @@ of the following host1x client modules: Required properties: - remote-endpoint: phandle to vi port 'endpoint' node. + Optional properties: + - interconnects: Must contain entry for the VI memory clients. + - interconnect-names: Must include name of the interconnect path for each + interconnect entry. Consult TRM documentation for information about + available memory clients, see MEMORY CONTROLLER section. + - epp: encoder pre-processor Required properties:
@@ -126,6 +142,12 @@ of the following host1x client modules: - reset-names: Must include the following entries: - epp + Optional properties: + - interconnects: Must contain entry for the EPP memory clients. + - interconnect-names: Must include name of the interconnect path for each + interconnect entry. Consult TRM documentation for information about + available memory clients, see MEMORY CONTROLLER section. + - isp: image signal processor Required properties:
@@ -139,6 +161,12 @@ of the following host1x client modules: - reset-names: Must include the following entries: - isp + Optional properties: + - interconnects: Must contain entry for the ISP memory clients. + - interconnect-names: Must include name of the interconnect path for each + interconnect entry. Consult TRM documentation for information about + available memory clients, see MEMORY CONTROLLER section. + - gr2d: 2D graphics engine Required properties:
@@ -152,6 +180,12 @@ of the following host1x client modules: - reset-names: Must include the following entries: - 2d + Optional properties: + - interconnects: Must contain entry for the GR2D memory clients. + - interconnect-names: Must include name of the interconnect path for each + interconnect entry. Consult TRM documentation for information about + available memory clients, see MEMORY CONTROLLER section. + - gr3d: 3D graphics engine Required properties:
@@ -170,6 +204,12 @@ of the following host1x client modules: - 3d - 3d2 (Only required on SoCs with two 3D clocks) + Optional properties: + - interconnects: Must contain entry for the GR3D memory clients. + - interconnect-names: Must include name of the interconnect path for each + interconnect entry. Consult TRM documentation for information about + available memory clients, see MEMORY CONTROLLER section. + - dc: display controller Required properties:
@@ -197,6 +237,10 @@ of the following host1x client modules: - nvidia,hpd-gpio: specifies a GPIO used for hotplug detection - nvidia,edid: supplies a binary EDID blob - nvidia,panel: phandle of a display panel + - interconnects: Must contain entry for the DC memory clients. + - interconnect-names: Must include name of the interconnect path for each + interconnect entry. Consult TRM documentation for information about + available memory clients, see MEMORY CONTROLLER section. - hdmi: High Definition Multimedia Interface
@@ -345,6 +389,12 @@ of the following host1x client modules: - reset-names: Must include the following entries: - vic + Optional properties: + - interconnects: Must contain entry for the VIC memory clients. + - interconnect-names: Must include name of the interconnect path for each + interconnect entry. Consult TRM documentation for information about + available memory clients, see MEMORY CONTROLLER section. + Example: / {
@@ -498,6 +548,15 @@ Example: resets = <&tegra_car 27>; reset-names = "dc"; + interconnects = <&mc TEGRA20_MC_DISPLAY0A &emc>, + <&mc TEGRA20_MC_DISPLAY0B &emc>, + <&mc TEGRA20_MC_DISPLAY0C &emc>, + <&mc TEGRA20_MC_DISPLAYHC &emc>; + interconnect-names = "wina", + "winb", + "winc", + "cursor"; + rgb { status = "disabled"; };
@@ -513,6 +572,15 @@ Example: resets = <&tegra_car 26>; reset-names = "dc"; + interconnects = <&mc TEGRA20_MC_DISPLAY0AB &emc>, + <&mc TEGRA20_MC_DISPLAY0BB &emc>, + <&mc TEGRA20_MC_DISPLAY0CB &emc>, + <&mc TEGRA20_MC_DISPLAYHCB &emc>; + interconnect-names = "wina", + "winb", + "winc", + "cursor"; + rgb { status = "disabled"; };
Signature · 1 line
2.27.0
Re: [PATCH v7 16/47] dt-bindings: host1x: Document new interconnect properties
Quoted 10 lines · Dmitry Osipenko
Most of Host1x devices have at least one memory client. These clients are directly connected to the memory controller. The new interconnect properties represent the memory client's connection to the memory controller.
Reviewed-by Rob Herring <[email protected]>Signed-off-by Dmitry Osipenko <[email protected]>--- .../display/tegra/nvidia,tegra20-host1x.txt | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+)
Does not look like patch for memory controller drivers but I guess better to keep it with others. Let me know if it should go via different tree.
Thanks, applied.
Best regards,
Krzysztof
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
Dmitry Osipenko
maintainerPATCH v7 17/47 dt-bindings: memory: tegra20: Add memory client IDs
In reply to Dmitry OsipenkoEach memory client has unique hardware ID, add these IDs.
--- include/dt-bindings/memory/tegra20-mc.h | 53 +++++++++++++++++++++++++ 1 file changed, 53 insertions(+)
include/dt-bindings/memory/tegra20-mc.h +53 -0
@@ -18,4 +18,57 @@#define TEGRA20_MC_RESET_VDE 13#define TEGRA20_MC_RESET_VI 14 +#define TEGRA20_MC_DISPLAY0A 0 +#define TEGRA20_MC_DISPLAY0AB 1 +#define TEGRA20_MC_DISPLAY0B 2 +#define TEGRA20_MC_DISPLAY0BB 3 +#define TEGRA20_MC_DISPLAY0C 4 +#define TEGRA20_MC_DISPLAY0CB 5 +#define TEGRA20_MC_DISPLAY1B 6 +#define TEGRA20_MC_DISPLAY1BB 7 +#define TEGRA20_MC_EPPUP 8 +#define TEGRA20_MC_G2PR 9 +#define TEGRA20_MC_G2SR 10 +#define TEGRA20_MC_MPEUNIFBR 11 +#define TEGRA20_MC_VIRUV 12 +#define TEGRA20_MC_AVPCARM7R 13 +#define TEGRA20_MC_DISPLAYHC 14 +#define TEGRA20_MC_DISPLAYHCB 15 +#define TEGRA20_MC_FDCDRD 16 +#define TEGRA20_MC_G2DR 17 +#define TEGRA20_MC_HOST1XDMAR 18 +#define TEGRA20_MC_HOST1XR 19 +#define TEGRA20_MC_IDXSRD 20 +#define TEGRA20_MC_MPCORER 21 +#define TEGRA20_MC_MPE_IPRED 22 +#define TEGRA20_MC_MPEAMEMRD 23 +#define TEGRA20_MC_MPECSRD 24 +#define TEGRA20_MC_PPCSAHBDMAR 25 +#define TEGRA20_MC_PPCSAHBSLVR 26 +#define TEGRA20_MC_TEXSRD 27 +#define TEGRA20_MC_VDEBSEVR 28 +#define TEGRA20_MC_VDEMBER 29 +#define TEGRA20_MC_VDEMCER 30 +#define TEGRA20_MC_VDETPER 31 +#define TEGRA20_MC_EPPU 32 +#define TEGRA20_MC_EPPV 33 +#define TEGRA20_MC_EPPY 34 +#define TEGRA20_MC_MPEUNIFBW 35 +#define TEGRA20_MC_VIWSB 36 +#define TEGRA20_MC_VIWU 37 +#define TEGRA20_MC_VIWV 38 +#define TEGRA20_MC_VIWY 39 +#define TEGRA20_MC_G2DW 40 +#define TEGRA20_MC_AVPCARM7W 41 +#define TEGRA20_MC_FDCDWR 42 +#define TEGRA20_MC_HOST1XW 43 +#define TEGRA20_MC_ISPW 44 +#define TEGRA20_MC_MPCOREW 45 +#define TEGRA20_MC_MPECSWR 46 +#define TEGRA20_MC_PPCSAHBDMAW 47 +#define TEGRA20_MC_PPCSAHBSLVW 48 +#define TEGRA20_MC_VDEBSEVW 49 +#define TEGRA20_MC_VDEMBEW 50 +#define TEGRA20_MC_VDETPMW 51 +#endif
Signature · 1 line
2.27.0
Re: [PATCH v7 17/47] dt-bindings: memory: tegra20: Add memory client IDs
Quoted 7 lines · Dmitry Osipenko
Each memory client has unique hardware ID, add these IDs.
Acked-by Rob Herring <[email protected]>Signed-off-by Dmitry Osipenko <[email protected]>--- include/dt-bindings/memory/tegra20-mc.h | 53 +++++++++++++++++++++++++ 1 file changed, 53 insertions(+)
Thanks, applied.
Best regards,
Krzysztof
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
Re: [PATCH v7 17/47] dt-bindings: memory: tegra20: Add memory client IDs
In reply to Dmitry OsipenkoQuoted 7 lines · Dmitry Osipenko
Each memory client has unique hardware ID, add these IDs.
Acked-by Rob Herring <[email protected]>Signed-off-by Dmitry Osipenko <[email protected]>--- include/dt-bindings/memory/tegra20-mc.h | 53 +++++++++++++++++++++++++ 1 file changed, 53 insertions(+)
Is there any chance you could drop these dt-bindings include patches (17, 18 and 19) so that I can pick them up into the Tegra tree? The device tree changes that I was going to pick up depend on this and fail to build if applied as-is.
I was looking at your linux-mem-ctrl tree and had initially thought I could just pull in one of the branches to get these dependencies, but it looks like the dt-bindings patches are on the for-v5.11/tegra-mc branch, which the ARM SoC maintainers wouldn't like to see me pull in for a dependency on device tree changes.
If this is all fixed at this point, I'll just have to push back the device tree changes to v5.12, or perhaps see if the ARM SoC maintainers are willing to take a late pull request that's based on v5.11-rc1.
Thierry
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
Krzysztof Kozlowski
maintainerRe: [PATCH v7 17/47] dt-bindings: memory: tegra20: Add memory client IDs
Quoted 14 lines · Thierry Reding
Quoted 7 lines · Dmitry Osipenko
Each memory client has unique hardware ID, add these IDs.
Acked-by Rob Herring <[email protected]>Signed-off-by Dmitry Osipenko <[email protected]>--- include/dt-bindings/memory/tegra20-mc.h | 53 +++++++++++++++++++++++++ 1 file changed, 53 insertions(+)Is there any chance you could drop these dt-bindings include patches (17, 18 and 19) so that I can pick them up into the Tegra tree? The device tree changes that I was going to pick up depend on this and fail to build if applied as-is.
Quoted 5 lines
I was looking at your linux-mem-ctrl tree and had initially thought I could just pull in one of the branches to get these dependencies, but it looks like the dt-bindings patches are on the for-v5.11/tegra-mc branch, which the ARM SoC maintainers wouldn't like to see me pull in for a dependency on device tree changes.
Partially you answered here. :) Since you should not pull my branch into a DT branch, you also should not put these include/dt-bindings patches there. SoC guys will complain about this as well.
These patches are also needed for the driver, so if you take them, I would need them back in a pull request. SoC folks could spot it as well and point that such merge should not happen.
Quoted 3 lines
If this is all fixed at this point, I'll just have to push back the device tree changes to v5.12, or perhaps see if the ARM SoC maintainers are willing to take a late pull request that's based on v5.11-rc1.
Yeah, that's a known problem. I asked about this Arnd and Olof in the past and got reply with two solutions:
1. Apply current version of patch without defines, just hard-coded numbers. After merging to Linus, replace the numbers with defines.
2. Wait with DTS till dependencies reach Linus.
Best regards,
Krzysztof
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
Krzysztof Kozlowski
maintainerRe: [PATCH v7 17/47] dt-bindings: memory: tegra20: Add memory client IDs
Quoted 22 lines · Krzysztof Kozlowski
Quoted 14 lines · Thierry Reding
Quoted 7 lines · Dmitry Osipenko
Each memory client has unique hardware ID, add these IDs.
Acked-by Rob Herring <[email protected]>Signed-off-by Dmitry Osipenko <[email protected]>--- include/dt-bindings/memory/tegra20-mc.h | 53 +++++++++++++++++++++++++ 1 file changed, 53 insertions(+)Is there any chance you could drop these dt-bindings include patches (17, 18 and 19) so that I can pick them up into the Tegra tree? The device tree changes that I was going to pick up depend on this and fail to build if applied as-is.
Quoted 5 lines
I was looking at your linux-mem-ctrl tree and had initially thought I could just pull in one of the branches to get these dependencies, but it looks like the dt-bindings patches are on the for-v5.11/tegra-mc branch, which the ARM SoC maintainers wouldn't like to see me pull in for a dependency on device tree changes.
Quoted 7 lines
Partially you answered here. :) Since you should not pull my branch into a DT branch, you also should not put these
include/dt-bindingspatches there. SoC guys will complain about this as well.These patches are also needed for the driver, so if you take them, I would need them back in a pull request. SoC folks could spot it as well and point that such merge should not happen.
It seems I was wrong - these patches are not needed for the driver code. Neither in applied parts nor in upcoming Dmitry's work. In such case I could rework my branches and send a new pull request. The patches would stay only in your tree.
Best regards,
Krzysztof
Re: [PATCH v7 17/47] dt-bindings: memory: tegra20: Add memory client IDs
Quoted 27 lines · Krzysztof Kozlowski
Quoted 26 lines · Krzysztof Kozlowski
Quoted 14 lines · Thierry Reding
Quoted 7 lines · Dmitry Osipenko
Each memory client has unique hardware ID, add these IDs.
Acked-by Rob Herring <[email protected]>Signed-off-by Dmitry Osipenko <[email protected]>--- include/dt-bindings/memory/tegra20-mc.h | 53 +++++++++++++++++++++++++ 1 file changed, 53 insertions(+)Is there any chance you could drop these dt-bindings include patches (17, 18 and 19) so that I can pick them up into the Tegra tree? The device tree changes that I was going to pick up depend on this and fail to build if applied as-is.
Quoted 5 lines
I was looking at your linux-mem-ctrl tree and had initially thought I could just pull in one of the branches to get these dependencies, but it looks like the dt-bindings patches are on the for-v5.11/tegra-mc branch, which the ARM SoC maintainers wouldn't like to see me pull in for a dependency on device tree changes.
Partially you answered here. :) Since you should not pull my branch into a DT branch, you also should not put these
include/dt-bindingspatches there. SoC guys will complain about this as well.
Quoted 8 lines
Quoted 3 lines
These patches are also needed for the driver, so if you take them, I would need them back in a pull request. SoC folks could spot it as well and point that such merge should not happen.
It seems I was wrong - these patches are not needed for the driver code. Neither in applied parts nor in upcoming Dmitry's work. In such case I could rework my branches and send a new pull request. The patches would stay only in your tree.
Best regards,
Krzysztof
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
Re: [PATCH v7 17/47] dt-bindings: memory: tegra20: Add memory client IDs
In reply to Krzysztof KozlowskiQuoted 27 lines · Krzysztof Kozlowski
Quoted 26 lines · Krzysztof Kozlowski
Quoted 14 lines · Thierry Reding
Quoted 7 lines · Dmitry Osipenko
Each memory client has unique hardware ID, add these IDs.
Acked-by Rob Herring <[email protected]>Signed-off-by Dmitry Osipenko <[email protected]>--- include/dt-bindings/memory/tegra20-mc.h | 53 +++++++++++++++++++++++++ 1 file changed, 53 insertions(+)Is there any chance you could drop these dt-bindings include patches (17, 18 and 19) so that I can pick them up into the Tegra tree? The device tree changes that I was going to pick up depend on this and fail to build if applied as-is.
Quoted 5 lines
I was looking at your linux-mem-ctrl tree and had initially thought I could just pull in one of the branches to get these dependencies, but it looks like the dt-bindings patches are on the for-v5.11/tegra-mc branch, which the ARM SoC maintainers wouldn't like to see me pull in for a dependency on device tree changes.
Partially you answered here. :) Since you should not pull my branch into a DT branch, you also should not put these
include/dt-bindingspatches there. SoC guys will complain about this as well.
Quoted 8 lines
Quoted 3 lines
These patches are also needed for the driver, so if you take them, I would need them back in a pull request. SoC folks could spot it as well and point that such merge should not happen.
It seems I was wrong - these patches are not needed for the driver code. Neither in applied parts nor in upcoming Dmitry's work. In such case I could rework my branches and send a new pull request. The patches would stay only in your tree.
Oh yeah, I forgot to mention that the driver doesn't actually need these. I'll take your Acked-bys and put these three patches into the Tegra tree, then.
Thanks,
Thierry
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
Re: [PATCH v7 17/47] dt-bindings: memory: tegra20: Add memory client IDs
In reply to Krzysztof KozlowskiQuoted 33 lines · Krzysztof Kozlowski
Quoted 14 lines · Thierry Reding
Quoted 7 lines · Dmitry Osipenko
Each memory client has unique hardware ID, add these IDs.
Acked-by Rob Herring <[email protected]>Signed-off-by Dmitry Osipenko <[email protected]>--- include/dt-bindings/memory/tegra20-mc.h | 53 +++++++++++++++++++++++++ 1 file changed, 53 insertions(+)Is there any chance you could drop these dt-bindings include patches (17, 18 and 19) so that I can pick them up into the Tegra tree? The device tree changes that I was going to pick up depend on this and fail to build if applied as-is.
Quoted 5 lines
I was looking at your linux-mem-ctrl tree and had initially thought I could just pull in one of the branches to get these dependencies, but it looks like the dt-bindings patches are on the for-v5.11/tegra-mc branch, which the ARM SoC maintainers wouldn't like to see me pull in for a dependency on device tree changes.
Partially you answered here. :) Since you should not pull my branch into a DT branch, you also should not put these
include/dt-bindingspatches there. SoC guys will complain about this as well.These patches are also needed for the driver, so if you take them, I would need them back in a pull request. SoC folks could spot it as well and point that such merge should not happen.
Quoted 3 lines
If this is all fixed at this point, I'll just have to push back the device tree changes to v5.12, or perhaps see if the ARM SoC maintainers are willing to take a late pull request that's based on v5.11-rc1.
Quoted 6 lines
Yeah, that's a known problem. I asked about this Arnd and Olof in the past and got reply with two solutions:
1. Apply current version of patch without defines, just hard-coded numbers. After merging to Linus, replace the numbers with defines.2. Wait with DTS till dependencies reach Linus.
What I've done occasionally in the past was to put these kinds of patches into a separate "dt-bindings" branch that I could use to resolve dependencies from device tree files. The ARM SoC maintainers never had any issues with that approach.
I guess this is a bit of a special case, because the DT includes are ultimately really a part of the device tree, so mixing them both isn't problematic.
Thierry
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
Krzysztof Kozlowski
maintainerRe: [PATCH v7 17/47] dt-bindings: memory: tegra20: Add memory client IDs
Quoted 41 lines · Thierry Reding
Quoted 33 lines · Krzysztof Kozlowski
Quoted 14 lines · Thierry Reding
Quoted 7 lines · Dmitry Osipenko
Each memory client has unique hardware ID, add these IDs.
Acked-by Rob Herring <[email protected]>Signed-off-by Dmitry Osipenko <[email protected]>--- include/dt-bindings/memory/tegra20-mc.h | 53 +++++++++++++++++++++++++ 1 file changed, 53 insertions(+)Is there any chance you could drop these dt-bindings include patches (17, 18 and 19) so that I can pick them up into the Tegra tree? The device tree changes that I was going to pick up depend on this and fail to build if applied as-is.
Quoted 5 lines
I was looking at your linux-mem-ctrl tree and had initially thought I could just pull in one of the branches to get these dependencies, but it looks like the dt-bindings patches are on the for-v5.11/tegra-mc branch, which the ARM SoC maintainers wouldn't like to see me pull in for a dependency on device tree changes.
Partially you answered here. :) Since you should not pull my branch into a DT branch, you also should not put these
include/dt-bindingspatches there. SoC guys will complain about this as well.These patches are also needed for the driver, so if you take them, I would need them back in a pull request. SoC folks could spot it as well and point that such merge should not happen.
Quoted 3 lines
If this is all fixed at this point, I'll just have to push back the device tree changes to v5.12, or perhaps see if the ARM SoC maintainers are willing to take a late pull request that's based on v5.11-rc1.
Quoted 6 lines
Yeah, that's a known problem. I asked about this Arnd and Olof in the past and got reply with two solutions:
1. Apply current version of patch without defines, just hard-coded numbers. After merging to Linus, replace the numbers with defines.2. Wait with DTS till dependencies reach Linus.
Quoted 8 lines
What I've done occasionally in the past was to put these kinds of patches into a separate "dt-bindings" branch that I could use to resolve dependencies from device tree files. The ARM SoC maintainers never had any issues with that approach.
I guess this is a bit of a special case, because the DT includes are ultimately really a part of the device tree, so mixing them both isn't problematic.
Indeed, that way could work... and no one would spot it. :) Many times these headers were for clock symbols so if they go via SoC/DT tree, merge back to clock tree could be accepted.
Best regards,
Krzysztof
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
Dmitry Osipenko
maintainerPATCH v7 18/47 dt-bindings: memory: tegra30: Add memory client IDs
In reply to Dmitry OsipenkoEach memory client has unique hardware ID, add these IDs.
--- include/dt-bindings/memory/tegra30-mc.h | 67 +++++++++++++++++++++++++ 1 file changed, 67 insertions(+)
include/dt-bindings/memory/tegra30-mc.h +67 -0
@@ -41,4 +41,71 @@#define TEGRA30_MC_RESET_VDE 16#define TEGRA30_MC_RESET_VI 17 +#define TEGRA30_MC_PTCR 0 +#define TEGRA30_MC_DISPLAY0A 1 +#define TEGRA30_MC_DISPLAY0AB 2 +#define TEGRA30_MC_DISPLAY0B 3 +#define TEGRA30_MC_DISPLAY0BB 4 +#define TEGRA30_MC_DISPLAY0C 5 +#define TEGRA30_MC_DISPLAY0CB 6 +#define TEGRA30_MC_DISPLAY1B 7 +#define TEGRA30_MC_DISPLAY1BB 8 +#define TEGRA30_MC_EPPUP 9 +#define TEGRA30_MC_G2PR 10 +#define TEGRA30_MC_G2SR 11 +#define TEGRA30_MC_MPEUNIFBR 12 +#define TEGRA30_MC_VIRUV 13 +#define TEGRA30_MC_AFIR 14 +#define TEGRA30_MC_AVPCARM7R 15 +#define TEGRA30_MC_DISPLAYHC 16 +#define TEGRA30_MC_DISPLAYHCB 17 +#define TEGRA30_MC_FDCDRD 18 +#define TEGRA30_MC_FDCDRD2 19 +#define TEGRA30_MC_G2DR 20 +#define TEGRA30_MC_HDAR 21 +#define TEGRA30_MC_HOST1XDMAR 22 +#define TEGRA30_MC_HOST1XR 23 +#define TEGRA30_MC_IDXSRD 24 +#define TEGRA30_MC_IDXSRD2 25 +#define TEGRA30_MC_MPE_IPRED 26 +#define TEGRA30_MC_MPEAMEMRD 27 +#define TEGRA30_MC_MPECSRD 28 +#define TEGRA30_MC_PPCSAHBDMAR 29 +#define TEGRA30_MC_PPCSAHBSLVR 30 +#define TEGRA30_MC_SATAR 31 +#define TEGRA30_MC_TEXSRD 32 +#define TEGRA30_MC_TEXSRD2 33 +#define TEGRA30_MC_VDEBSEVR 34 +#define TEGRA30_MC_VDEMBER 35 +#define TEGRA30_MC_VDEMCER 36 +#define TEGRA30_MC_VDETPER 37 +#define TEGRA30_MC_MPCORELPR 38 +#define TEGRA30_MC_MPCORER 39 +#define TEGRA30_MC_EPPU 40 +#define TEGRA30_MC_EPPV 41 +#define TEGRA30_MC_EPPY 42 +#define TEGRA30_MC_MPEUNIFBW 43 +#define TEGRA30_MC_VIWSB 44 +#define TEGRA30_MC_VIWU 45 +#define TEGRA30_MC_VIWV 46 +#define TEGRA30_MC_VIWY 47 +#define TEGRA30_MC_G2DW 48 +#define TEGRA30_MC_AFIW 49 +#define TEGRA30_MC_AVPCARM7W 50 +#define TEGRA30_MC_FDCDWR 51 +#define TEGRA30_MC_FDCDWR2 52 +#define TEGRA30_MC_HDAW 53 +#define TEGRA30_MC_HOST1XW 54 +#define TEGRA30_MC_ISPW 55 +#define TEGRA30_MC_MPCORELPW 56 +#define TEGRA30_MC_MPCOREW 57 +#define TEGRA30_MC_MPECSWR 58 +#define TEGRA30_MC_PPCSAHBDMAW 59 +#define TEGRA30_MC_PPCSAHBSLVW 60 +#define TEGRA30_MC_SATAW 61 +#define TEGRA30_MC_VDEBSEVW 62 +#define TEGRA30_MC_VDEDBGW 63 +#define TEGRA30_MC_VDEMBEW 64 +#define TEGRA30_MC_VDETPMW 65 +#endif
Signature · 1 line
2.27.0
Re: [PATCH v7 18/47] dt-bindings: memory: tegra30: Add memory client IDs
Quoted 7 lines · Dmitry Osipenko
Each memory client has unique hardware ID, add these IDs.
Acked-by Rob Herring <[email protected]>Signed-off-by Dmitry Osipenko <[email protected]>--- include/dt-bindings/memory/tegra30-mc.h | 67 +++++++++++++++++++++++++ 1 file changed, 67 insertions(+)
Thanks, applied.
Best regards,
Krzysztof
Re: [PATCH v7 18/47] dt-bindings: memory: tegra30: Add memory client IDs
In reply to Dmitry OsipenkoQuoted 8 lines · Dmitry Osipenko
Each memory client has unique hardware ID, add these IDs.
Acked-by Rob Herring <[email protected]>Signed-off-by Dmitry Osipenko <[email protected]>--- include/dt-bindings/memory/tegra30-mc.h | 67 +++++++++++++++++++++++++ 1 file changed, 67 insertions(+)
Best regards,
Krzysztof
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
Dmitry Osipenko
maintainerPATCH v7 19/47 dt-bindings: memory: tegra124: Add memory client IDs
In reply to Dmitry OsipenkoEach memory client has unique hardware ID, add these IDs.
--- include/dt-bindings/memory/tegra124-mc.h | 68 ++++++++++++++++++++++++ 1 file changed, 68 insertions(+)
include/dt-bindings/memory/tegra124-mc.h +68 -0
@@ -54,4 +54,72 @@#define TEGRA124_MC_RESET_ISP2B 22#define TEGRA124_MC_RESET_GPU 23 +#define TEGRA124_MC_PTCR 0 +#define TEGRA124_MC_DISPLAY0A 1 +#define TEGRA124_MC_DISPLAY0AB 2 +#define TEGRA124_MC_DISPLAY0B 3 +#define TEGRA124_MC_DISPLAY0BB 4 +#define TEGRA124_MC_DISPLAY0C 5 +#define TEGRA124_MC_DISPLAY0CB 6 +#define TEGRA124_MC_AFIR 14 +#define TEGRA124_MC_AVPCARM7R 15 +#define TEGRA124_MC_DISPLAYHC 16 +#define TEGRA124_MC_DISPLAYHCB 17 +#define TEGRA124_MC_HDAR 21 +#define TEGRA124_MC_HOST1XDMAR 22 +#define TEGRA124_MC_HOST1XR 23 +#define TEGRA124_MC_MSENCSRD 28 +#define TEGRA124_MC_PPCSAHBDMAR 29 +#define TEGRA124_MC_PPCSAHBSLVR 30 +#define TEGRA124_MC_SATAR 31 +#define TEGRA124_MC_VDEBSEVR 34 +#define TEGRA124_MC_VDEMBER 35 +#define TEGRA124_MC_VDEMCER 36 +#define TEGRA124_MC_VDETPER 37 +#define TEGRA124_MC_MPCORELPR 38 +#define TEGRA124_MC_MPCORER 39 +#define TEGRA124_MC_MSENCSWR 43 +#define TEGRA124_MC_AFIW 49 +#define TEGRA124_MC_AVPCARM7W 50 +#define TEGRA124_MC_HDAW 53 +#define TEGRA124_MC_HOST1XW 54 +#define TEGRA124_MC_MPCORELPW 56 +#define TEGRA124_MC_MPCOREW 57 +#define TEGRA124_MC_PPCSAHBDMAW 59 +#define TEGRA124_MC_PPCSAHBSLVW 60 +#define TEGRA124_MC_SATAW 61 +#define TEGRA124_MC_VDEBSEVW 62 +#define TEGRA124_MC_VDEDBGW 63 +#define TEGRA124_MC_VDEMBEW 64 +#define TEGRA124_MC_VDETPMW 65 +#define TEGRA124_MC_ISPRA 68 +#define TEGRA124_MC_ISPWA 70 +#define TEGRA124_MC_ISPWB 71 +#define TEGRA124_MC_XUSB_HOSTR 74 +#define TEGRA124_MC_XUSB_HOSTW 75 +#define TEGRA124_MC_XUSB_DEVR 76 +#define TEGRA124_MC_XUSB_DEVW 77 +#define TEGRA124_MC_ISPRAB 78 +#define TEGRA124_MC_ISPWAB 80 +#define TEGRA124_MC_ISPWBB 81 +#define TEGRA124_MC_TSECSRD 84 +#define TEGRA124_MC_TSECSWR 85 +#define TEGRA124_MC_A9AVPSCR 86 +#define TEGRA124_MC_A9AVPSCW 87 +#define TEGRA124_MC_GPUSRD 88 +#define TEGRA124_MC_GPUSWR 89 +#define TEGRA124_MC_DISPLAYT 90 +#define TEGRA124_MC_SDMMCRA 96 +#define TEGRA124_MC_SDMMCRAA 97 +#define TEGRA124_MC_SDMMCR 98 +#define TEGRA124_MC_SDMMCRAB 99 +#define TEGRA124_MC_SDMMCWA 100 +#define TEGRA124_MC_SDMMCWAA 101 +#define TEGRA124_MC_SDMMCW 102 +#define TEGRA124_MC_SDMMCWAB 103 +#define TEGRA124_MC_VICSRD 108 +#define TEGRA124_MC_VICSWR 109 +#define TEGRA124_MC_VIW 114 +#define TEGRA124_MC_DISPLAYD 115 +#endif
Signature · 1 line
2.27.0
Re: [PATCH v7 19/47] dt-bindings: memory: tegra124: Add memory client IDs
Quoted 7 lines · Dmitry Osipenko
Each memory client has unique hardware ID, add these IDs.
Reviewed-by Rob Herring <[email protected]>Signed-off-by Dmitry Osipenko <[email protected]>--- include/dt-bindings/memory/tegra124-mc.h | 68 ++++++++++++++++++++++++ 1 file changed, 68 insertions(+)
Thanks, applied.
Best regards,
Krzysztof
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
Re: [PATCH v7 19/47] dt-bindings: memory: tegra124: Add memory client IDs
In reply to Dmitry OsipenkoQuoted 8 lines · Dmitry Osipenko
Each memory client has unique hardware ID, add these IDs.
Reviewed-by Rob Herring <[email protected]>Signed-off-by Dmitry Osipenko <[email protected]>--- include/dt-bindings/memory/tegra124-mc.h | 68 ++++++++++++++++++++++++ 1 file changed, 68 insertions(+)
Best regards,
Krzysztof
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
Dmitry Osipenko
maintainerPATCH v7 20/47 ARM: tegra: Correct EMC registers size in Tegra20 device-tree
In reply to Dmitry OsipenkoFix the size of Tegra20 EMC registers, which should be twice bigger.
--- arch/arm/boot/dts/tegra20.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/boot/dts/tegra20.dtsi +1 -1
@@ -634,7 +634,7 @@ mc: memory-controller@7000f000 { memory-controller@7000f400 { compatible = "nvidia,tegra20-emc"; - reg = <0x7000f400 0x200>; + reg = <0x7000f400 0x400>; interrupts = <GIC_SPI 78 IRQ_TYPE_LEVEL_HIGH>; clocks = <&tegra_car TEGRA20_CLK_EMC>; #address-cells = <1>;
Signature · 1 line
2.27.0
Dmitry Osipenko
maintainerPATCH v7 21/47 ARM: tegra: Add interconnect properties to Tegra20 device-tree
In reply to Dmitry OsipenkoAdd interconnect properties to the Memory Controller, External Memory Controller and the Display Controller nodes in order to describe hardware interconnection.
--- arch/arm/boot/dts/tegra20.dtsi | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-)
arch/arm/boot/dts/tegra20.dtsi +25 -1
@@ -111,6 +111,17 @@ dc@54200000 { nvidia,head = <0>; + interconnects = <&mc TEGRA20_MC_DISPLAY0A &emc>, + <&mc TEGRA20_MC_DISPLAY0B &emc>, + <&mc TEGRA20_MC_DISPLAY1B &emc>, + <&mc TEGRA20_MC_DISPLAY0C &emc>, + <&mc TEGRA20_MC_DISPLAYHC &emc>; + interconnect-names = "wina", + "winb", + "winb-vfilter", + "winc", + "cursor"; + rgb { status = "disabled"; };
@@ -128,6 +139,17 @@ dc@54240000 { nvidia,head = <1>; + interconnects = <&mc TEGRA20_MC_DISPLAY0AB &emc>, + <&mc TEGRA20_MC_DISPLAY0BB &emc>, + <&mc TEGRA20_MC_DISPLAY1BB &emc>, + <&mc TEGRA20_MC_DISPLAY0CB &emc>, + <&mc TEGRA20_MC_DISPLAYHCB &emc>; + interconnect-names = "wina", + "winb", + "winb-vfilter", + "winc", + "cursor"; + rgb { status = "disabled"; };
@@ -630,15 +652,17 @@ mc: memory-controller@7000f000 { interrupts = <GIC_SPI 77 IRQ_TYPE_LEVEL_HIGH>; #reset-cells = <1>; #iommu-cells = <0>; + #interconnect-cells = <1>; }; - memory-controller@7000f400 { + emc: memory-controller@7000f400 { compatible = "nvidia,tegra20-emc"; reg = <0x7000f400 0x400>; interrupts = <GIC_SPI 78 IRQ_TYPE_LEVEL_HIGH>; clocks = <&tegra_car TEGRA20_CLK_EMC>; #address-cells = <1>; #size-cells = <0>; + #interconnect-cells = <0>; }; fuse@7000f800 {
Signature · 1 line
2.27.0
Dmitry Osipenko
maintainerPATCH v7 22/47 ARM: tegra: Add interconnect properties to Tegra30 device-tree
In reply to Dmitry OsipenkoAdd interconnect properties to the Memory Controller, External Memory Controller and the Display Controller nodes in order to describe hardware interconnection.
--- arch/arm/boot/dts/tegra30.dtsi | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-)
arch/arm/boot/dts/tegra30.dtsi +26 -1
@@ -210,6 +210,17 @@ dc@54200000 { nvidia,head = <0>; + interconnects = <&mc TEGRA30_MC_DISPLAY0A &emc>, + <&mc TEGRA30_MC_DISPLAY0B &emc>, + <&mc TEGRA30_MC_DISPLAY1B &emc>, + <&mc TEGRA30_MC_DISPLAY0C &emc>, + <&mc TEGRA30_MC_DISPLAYHC &emc>; + interconnect-names = "wina", + "winb", + "winb-vfilter", + "winc", + "cursor"; + rgb { status = "disabled"; };
@@ -229,6 +240,17 @@ dc@54240000 { nvidia,head = <1>; + interconnects = <&mc TEGRA30_MC_DISPLAY0AB &emc>, + <&mc TEGRA30_MC_DISPLAY0BB &emc>, + <&mc TEGRA30_MC_DISPLAY1BB &emc>, + <&mc TEGRA30_MC_DISPLAY0CB &emc>, + <&mc TEGRA30_MC_DISPLAYHCB &emc>; + interconnect-names = "wina", + "winb", + "winb-vfilter", + "winc", + "cursor"; + rgb { status = "disabled"; };
@@ -748,15 +770,18 @@ mc: memory-controller@7000f000 { #iommu-cells = <1>; #reset-cells = <1>; + #interconnect-cells = <1>; }; - memory-controller@7000f400 { + emc: memory-controller@7000f400 { compatible = "nvidia,tegra30-emc"; reg = <0x7000f400 0x400>; interrupts = <GIC_SPI 78 IRQ_TYPE_LEVEL_HIGH>; clocks = <&tegra_car TEGRA30_CLK_EMC>; nvidia,memory-controller = <&mc>; + + #interconnect-cells = <0>; }; fuse@7000f800 {
Signature · 1 line
2.27.0
Dmitry Osipenko
maintainerPATCH v7 23/47 ARM: tegra: Add interconnect properties to Tegra124 device-tree
In reply to Dmitry OsipenkoAdd interconnect properties to the Memory Controller, External Memory Controller and the Display Controller nodes in order to describe hardware interconnection.
--- arch/arm/boot/dts/tegra124.dtsi | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+)
arch/arm/boot/dts/tegra124.dtsi +25 -0
@@ -113,6 +113,19 @@ dc@54200000 { iommus = <&mc TEGRA_SWGROUP_DC>; nvidia,head = <0>; + + interconnects = <&mc TEGRA124_MC_DISPLAY0A &emc>, + <&mc TEGRA124_MC_DISPLAY0B &emc>, + <&mc TEGRA124_MC_DISPLAY0C &emc>, + <&mc TEGRA124_MC_DISPLAYHC &emc>, + <&mc TEGRA124_MC_DISPLAYD &emc>, + <&mc TEGRA124_MC_DISPLAYT &emc>; + interconnect-names = "wina", + "winb", + "winc", + "cursor", + "wind", + "wint"; }; dc@54240000 {
@@ -127,6 +140,15 @@ dc@54240000 { iommus = <&mc TEGRA_SWGROUP_DCB>; nvidia,head = <1>; + + interconnects = <&mc TEGRA124_MC_DISPLAY0AB &emc>, + <&mc TEGRA124_MC_DISPLAY0BB &emc>, + <&mc TEGRA124_MC_DISPLAY0CB &emc>, + <&mc TEGRA124_MC_DISPLAYHCB &emc>; + interconnect-names = "wina", + "winb", + "winc", + "cursor"; }; hdmi: hdmi@54280000 {
@@ -628,6 +650,7 @@ mc: memory-controller@70019000 { #iommu-cells = <1>; #reset-cells = <1>; + #interconnect-cells = <1>; }; emc: external-memory-controller@7001b000 {
@@ -637,6 +660,8 @@ emc: external-memory-controller@7001b000 { clock-names = "emc"; nvidia,memory-controller = <&mc>; + + #interconnect-cells = <0>; }; sata@70020000 {
Signature · 1 line
2.27.0
Dmitry Osipenko
maintainerPATCH v7 24/47 ARM: tegra: Add nvidia,memory-controller phandle to Tegra20 EMC device-tree
In reply to Dmitry OsipenkoAdd nvidia,memory-controller to the Tegra20 External Memory Controller node. This allows to perform a direct lookup of the Memory Controller instead of walking up the whole tree. This puts Tegra20 device-tree on par with Tegra30+.
--- arch/arm/boot/dts/tegra20.dtsi | 2 ++ 1 file changed, 2 insertions(+)
arch/arm/boot/dts/tegra20.dtsi +2 -0
@@ -663,6 +663,8 @@ emc: memory-controller@7000f400 { #address-cells = <1>; #size-cells = <0>; #interconnect-cells = <0>; + + nvidia,memory-controller = <&mc>; }; fuse@7000f800 {
Signature · 1 line
2.27.0
Dmitry Osipenko
maintainerPATCH v7 25/47 ARM: tegra: Add DVFS properties to Tegra20 EMC device-tree node
In reply to Dmitry OsipenkoAdd EMC OPP DVFS table that will be used for dynamic scaling of memory frequency/voltage. Update board device-trees with optional EMC core supply and remove unsupported OPPs.
--- .../boot/dts/tegra20-acer-a500-picasso.dts | 7 ++ arch/arm/boot/dts/tegra20-colibri.dtsi | 4 + arch/arm/boot/dts/tegra20-paz00.dts | 6 ++ .../arm/boot/dts/tegra20-peripherals-opp.dtsi | 92 +++++++++++++++++++ arch/arm/boot/dts/tegra20.dtsi | 3 + 5 files changed, 112 insertions(+) create mode 100644 arch/arm/boot/dts/tegra20-peripherals-opp.dtsi
arch/arm/boot/dts/tegra20-acer-a500-picasso.dts +7 -0
@@ -1061,6 +1061,8 @@ map0 { memory-controller@7000f400 { nvidia,use-ram-code; + core-supply = <&vdd_core>; + emc-tables@0 { nvidia,ram-code = <0>; /* elpida-8gb */
@@ -1450,3 +1452,8 @@ emc-table@300000 { }; }; }; + +&emc_icc_dvfs_opp_table { + /delete-node/ opp@666000000; + /delete-node/ opp@760000000; +};
arch/arm/boot/dts/tegra20-colibri.dtsi +4 -0
@@ -742,6 +742,10 @@ sound { }; }; +&emc_icc_dvfs_opp_table { + /delete-node/ opp@760000000; +}; + &gpio { lan-reset-n { gpio-hog;
arch/arm/boot/dts/tegra20-paz00.dts +6 -0
@@ -314,6 +314,8 @@ nvec@7000c500 { memory-controller@7000f400 { nvidia,use-ram-code; + core-supply = <&core_vdd_reg>; + emc-tables@0 { nvidia,ram-code = <0x0>; #address-cells = <1>;
@@ -662,3 +664,7 @@ cpu@1 { }; }; }; + +&emc_icc_dvfs_opp_table { + /delete-node/ opp@760000000; +};
arch/arm/boot/dts/tegra20-peripherals-opp.dtsi new file +92 -0
92 lines not on this page · raw message
arch/arm/boot/dts/tegra20.dtsi +3 -0
@@ -6,6 +6,8 @@ #include <dt-bindings/interrupt-controller/arm-gic.h> #include <dt-bindings/soc/tegra-pmc.h> +#include "tegra20-peripherals-opp.dtsi" + / { compatible = "nvidia,tegra20"; interrupt-parent = <&lic>;
@@ -664,6 +666,7 @@ emc: memory-controller@7000f400 { #size-cells = <0>; #interconnect-cells = <0>; + operating-points-v2 = <&emc_icc_dvfs_opp_table>; nvidia,memory-controller = <&mc>; };
Signature · 1 line
2.27.0
Dmitry Osipenko
maintainerPATCH v7 26/47 ARM: tegra: Add DVFS properties to Tegra30 EMC and ACTMON device-tree nodes
In reply to Dmitry OsipenkoAdd EMC OPP DVFS/DFS tables and interconnect paths that will be used for dynamic memory bandwidth scaling based on memory utilization statistics. Update board device-trees with optional EMC core supply and remove unsupported OPPs.
Note that ACTMON watches all memory interconnect paths, but we use a single CPU-READ interconnect path for driving memory bandwidth, for simplicity.
--- .../tegra30-asus-nexus7-grouper-common.dtsi | 4 + ...30-asus-nexus7-grouper-memory-timings.dtsi | 12 + .../arm/boot/dts/tegra30-peripherals-opp.dtsi | 383 ++++++++++++++++++ arch/arm/boot/dts/tegra30.dtsi | 6 + 4 files changed, 405 insertions(+) create mode 100644 arch/arm/boot/dts/tegra30-peripherals-opp.dtsi
arch/arm/boot/dts/tegra30-asus-nexus7-grouper-common.dtsi +4 -0
@@ -956,6 +956,10 @@ pmc@7000e400 { nvidia,sys-clock-req-active-high; }; + memory-controller@7000f400 { + core-supply = <&vdd_core>; + }; + ahub@70080000 { i2s@70080400 { status = "okay";
arch/arm/boot/dts/tegra30-asus-nexus7-grouper-memory-timings.dtsi +12 -0
@@ -1563,3 +1563,15 @@ timing-667000000 { }; }; }; + +&emc_icc_dvfs_opp_table { + /delete-node/ opp@750000000,1300; + /delete-node/ opp@800000000,1300; + /delete-node/ opp@900000000,1350; +}; + +&emc_bw_dfs_opp_table { + /delete-node/ opp@750000000; + /delete-node/ opp@800000000; + /delete-node/ opp@900000000; +};
arch/arm/boot/dts/tegra30-peripherals-opp.dtsi new file +383 -0
383 lines not on this page · raw message
arch/arm/boot/dts/tegra30.dtsi +6 -0
@@ -6,6 +6,8 @@ #include <dt-bindings/interrupt-controller/arm-gic.h> #include <dt-bindings/soc/tegra-pmc.h> +#include "tegra30-peripherals-opp.dtsi" + / { compatible = "nvidia,tegra30"; interrupt-parent = <&lic>;
@@ -417,6 +419,9 @@ actmon@6000c800 { clock-names = "actmon", "emc"; resets = <&tegra_car TEGRA30_CLK_ACTMON>; reset-names = "actmon"; + operating-points-v2 = <&emc_bw_dfs_opp_table>; + interconnects = <&mc TEGRA30_MC_MPCORER &emc>; + interconnect-names = "cpu-read"; }; gpio: gpio@6000d000 {
@@ -780,6 +785,7 @@ emc: memory-controller@7000f400 { clocks = <&tegra_car TEGRA30_CLK_EMC>; nvidia,memory-controller = <&mc>; + operating-points-v2 = <&emc_icc_dvfs_opp_table>; #interconnect-cells = <0>; };
Signature · 1 line
2.27.0
Dmitry Osipenko
maintainerPATCH v7 27/47 ARM: tegra: Add DVFS properties to Tegra124 EMC and ACTMON device-tree nodes
In reply to Dmitry OsipenkoAdd EMC OPP DVFS/DFS tables and interconnect paths that will be used for dynamic memory bandwidth scaling based on memory utilization statistics. Remove unsupported EMC OPPs from board device-trees.
Note that ACTMON watches all memory interconnect paths, but we use a single CPU-READ interconnect path for driving memory bandwidth, for simplicity.
--- arch/arm/boot/dts/tegra124-apalis-emc.dtsi | 8 + .../arm/boot/dts/tegra124-jetson-tk1-emc.dtsi | 8 + arch/arm/boot/dts/tegra124-nyan-big-emc.dtsi | 10 + .../arm/boot/dts/tegra124-nyan-blaze-emc.dtsi | 10 + .../boot/dts/tegra124-peripherals-opp.dtsi | 419 ++++++++++++++++++ arch/arm/boot/dts/tegra124.dtsi | 6 + 6 files changed, 461 insertions(+) create mode 100644 arch/arm/boot/dts/tegra124-peripherals-opp.dtsi
arch/arm/boot/dts/tegra124-apalis-emc.dtsi +8 -0
@@ -1465,3 +1465,11 @@ timing-924000000 { }; }; }; + +&emc_icc_dvfs_opp_table { + /delete-node/ opp@1200000000,1100; +}; + +&emc_bw_dfs_opp_table { + /delete-node/ opp@1200000000; +};
arch/arm/boot/dts/tegra124-jetson-tk1-emc.dtsi +8 -0
@@ -2420,3 +2420,11 @@ timing-924000000 { }; }; }; + +&emc_icc_dvfs_opp_table { + /delete-node/ opp@1200000000,1100; +}; + +&emc_bw_dfs_opp_table { + /delete-node/ opp@1200000000; +};
arch/arm/boot/dts/tegra124-nyan-big-emc.dtsi +10 -0
@@ -6649,3 +6649,13 @@ timing-792000000 { }; }; }; + +&emc_icc_dvfs_opp_table { + /delete-node/ opp@924000000,1100; + /delete-node/ opp@1200000000,1100; +}; + +&emc_bw_dfs_opp_table { + /delete-node/ opp@924000000; + /delete-node/ opp@1200000000; +};
arch/arm/boot/dts/tegra124-nyan-blaze-emc.dtsi +10 -0
@@ -2048,3 +2048,13 @@ timing-792000000 { }; }; }; + +&emc_icc_dvfs_opp_table { + /delete-node/ opp@924000000,1100; + /delete-node/ opp@1200000000,1100; +}; + +&emc_bw_dfs_opp_table { + /delete-node/ opp@924000000; + /delete-node/ opp@1200000000; +};
arch/arm/boot/dts/tegra124-peripherals-opp.dtsi new file +419 -0
419 lines not on this page · raw message
arch/arm/boot/dts/tegra124.dtsi +6 -0
@@ -8,6 +8,8 @@ #include <dt-bindings/thermal/tegra124-soctherm.h> #include <dt-bindings/soc/tegra-pmc.h> +#include "tegra124-peripherals-opp.dtsi" + / { compatible = "nvidia,tegra124"; interrupt-parent = <&lic>;
@@ -290,6 +292,9 @@ actmon@6000c800 { clock-names = "actmon", "emc"; resets = <&tegra_car 119>; reset-names = "actmon"; + operating-points-v2 = <&emc_bw_dfs_opp_table>; + interconnects = <&mc TEGRA124_MC_MPCORER &emc>; + interconnect-names = "cpu-read"; }; gpio: gpio@6000d000 {
@@ -660,6 +665,7 @@ emc: external-memory-controller@7001b000 { clock-names = "emc"; nvidia,memory-controller = <&mc>; + operating-points-v2 = <&emc_icc_dvfs_opp_table>; #interconnect-cells = <0>; };
Signature · 1 line
2.27.0
Dmitry Osipenko
maintainerPATCH v7 28/47 memory: tegra: Add and use devm_tegra_memory_controller_get()
In reply to Dmitry OsipenkoMultiple Tegra drivers need to retrieve Memory Controller and there is duplication of the retrieval code among the drivers.
Add new devm_tegra_memory_controller_get() helper to remove the code's duplication and to fix put_device() which was missed in the duplicated code. Make EMC drivers to use the new helper.
--- drivers/memory/tegra/mc.c | 48 ++++++++++++++++++++++++ drivers/memory/tegra/tegra124-emc.c | 18 ++------- drivers/memory/tegra/tegra210-emc-core.c | 39 +++++-------------- drivers/memory/tegra/tegra30-emc.c | 18 ++------- include/soc/tegra/mc.h | 10 +++++ 5 files changed, 74 insertions(+), 59 deletions(-)
drivers/memory/tegra/mc.c +48 -0
@@ -42,6 +42,54 @@ static const struct of_device_id tegra_mc_of_match[] = { };MODULE_DEVICE_TABLE (of, tegra_mc_of_match); +static void tegra_mc_devm_action_put_device (void *data) +{ +struct tegra_mc *mc = data; + +put_device (mc->dev); +} + +/** +* devm_tegra_memory_controller_get() - get Tegra Memory Controller handle +* @dev: device pointer for the consumer device +* +* This function will search for the Memory Controller node in a device-tree +* and retrieve the Memory Controller handle. +* +* Return: ERR_PTR() on error or a valid pointer to a struct tegra_mc. +*/ +struct tegra_mc *devm_tegra_memory_controller_get (struct device *dev) +{ +struct platform_device *pdev; +struct device_node *np; +struct tegra_mc *mc; +int err; + + np =of_parse_phandle (dev->of_node,"nvidia,memory-controller" ,0 ); +if (!np) +return ERR_PTR (-ENOENT ); + + pdev =of_find_device_by_node (np); +of_node_put (np); +if (!pdev) +return ERR_PTR (-ENODEV ); + + mc =platform_get_drvdata (pdev); +if (!mc) { +put_device (&pdev->dev); +return ERR_PTR (-EPROBE_DEFER ); + } + + err =devm_add_action (dev, tegra_mc_devm_action_put_device, mc); +if (err) { +put_device (mc->dev); +return ERR_PTR (err); + } + +return mc; +} +EXPORT_SYMBOL_GPL (devm_tegra_memory_controller_get); +static int tegra_mc_block_dma_common (struct tegra_mc *mc,const struct tegra_mc_reset *rst) {
drivers/memory/tegra/tegra124-emc.c +3 -15
@@ -1177,7 +1177,6 @@ static void emc_debugfs_init(struct device *dev, struct tegra_emc *emc)static int tegra_emc_probe (struct platform_device *pdev) { -struct platform_device *mc;struct device_node *np;struct tegra_emc *emc;struct resource *res;
@@ -1195,20 +1194,9 @@ static int tegra_emc_probe(struct platform_device *pdev)if (IS_ERR (emc->regs))return PTR_ERR (emc->regs); - np =of_parse_phandle (pdev->dev.of_node,"nvidia,memory-controller" ,0 ); -if (!np) { -dev_err (&pdev->dev,"could not get memory controller\n" ); -return -ENOENT ; - } - - mc =of_find_device_by_node (np); -of_node_put (np); -if (!mc) -return -ENOENT ; - - emc->mc =platform_get_drvdata (mc); -if (!emc->mc) -return -EPROBE_DEFER ; + emc->mc =devm_tegra_memory_controller_get (&pdev->dev); +if (IS_ERR (emc->mc)) +return PTR_ERR (emc->mc); ram_code =tegra_read_ram_code ();
drivers/memory/tegra/tegra210-emc-core.c +10 -29
@@ -1828,7 +1828,6 @@ static int tegra210_emc_probe(struct platform_device *pdev) {struct thermal_cooling_device *cd;unsigned long current_rate; -struct platform_device *mc;struct tegra210_emc *emc;struct device_node *np;unsigned int i;
@@ -1846,35 +1845,19 @@ static int tegra210_emc_probe(struct platform_device *pdev)spin_lock_init (&emc->lock); emc->dev = &pdev->dev; - np =of_parse_phandle (pdev->dev.of_node,"nvidia,memory-controller" ,0 ); -if (!np) { -dev_err (&pdev->dev,"could not get memory controller\n" ); -return -ENOENT ; - } - - mc =of_find_device_by_node (np); -of_node_put (np); -if (!mc) -return -ENOENT ; - - emc->mc =platform_get_drvdata (mc); -if (!emc->mc) { -put_device (&mc->dev); -return -EPROBE_DEFER ; - } + emc->mc =devm_tegra_memory_controller_get (&pdev->dev); +if (IS_ERR (emc->mc)) +return PTR_ERR (emc->mc); emc->regs =devm_platform_ioremap_resource (pdev,0 ); -if (IS_ERR (emc->regs)) { - err =PTR_ERR (emc->regs); - goto put_mc; - } +if (IS_ERR (emc->regs)) +return PTR_ERR (emc->regs);for (i =0 ; i <2 ; i++) { emc->channel[i] =devm_platform_ioremap_resource (pdev,1 + i); -if (IS_ERR (emc->channel[i])) { - err =PTR_ERR (emc->channel[i]); - goto put_mc; - } +if (IS_ERR (emc->channel[i])) +return PTR_ERR (emc->channel[i]); + }tegra210_emc_detect (emc);
@@ -1884,7 +1867,7 @@ static int tegra210_emc_probe(struct platform_device *pdev) err =of_reserved_mem_device_init_by_name (emc->dev, np,"nominal" );if (err <0 ) {dev_err (emc->dev,"failed to get nominal EMC table: %d\n" , err); - goto put_mc; +return err; } err =of_reserved_mem_device_init_by_name (emc->dev, np,"derated" );
@@ -2015,8 +1998,7 @@ static int tegra210_emc_probe(struct platform_device *pdev)tegra210_clk_emc_detach (emc->clk); release:of_reserved_mem_device_release (emc->dev); -put_mc: -put_device (emc->mc->dev); +return err; }
@@ -2027,7 +2009,6 @@ static int tegra210_emc_remove(struct platform_device *pdev)debugfs_remove_recursive (emc->debugfs.root);tegra210_clk_emc_detach (emc->clk);of_reserved_mem_device_release (emc->dev); -put_device (emc->mc->dev);return 0 ; }
drivers/memory/tegra/tegra30-emc.c +3 -15
@@ -1258,7 +1258,6 @@ static void tegra_emc_debugfs_init(struct tegra_emc *emc)static int tegra_emc_probe (struct platform_device *pdev) { -struct platform_device *mc;struct device_node *np;struct tegra_emc *emc;int err;
@@ -1269,17 +1268,6 @@ static int tegra_emc_probe(struct platform_device *pdev)return -ENODEV ; } - np =of_parse_phandle (pdev->dev.of_node,"nvidia,memory-controller" ,0 ); -if (!np) { -dev_err (&pdev->dev,"could not get memory controller node\n" ); -return -ENOENT ; - } - - mc =of_find_device_by_node (np); -of_node_put (np); -if (!mc) -return -ENOENT ; - np =emc_find_node_by_ram_code (&pdev->dev);if (!np)return -EINVAL ;
@@ -1290,9 +1278,9 @@ static int tegra_emc_probe(struct platform_device *pdev)return -ENOMEM ; } - emc->mc =platform_get_drvdata (mc); -if (!emc->mc) -return -EPROBE_DEFER ; + emc->mc =devm_tegra_memory_controller_get (&pdev->dev); +if (IS_ERR (emc->mc)) +return PTR_ERR (emc->mc); emc->clk_nb.notifier_call = emc_clk_change_notify; emc->dev = &pdev->dev;
include/soc/tegra/mc.h +10 -0
@@ -184,4 +184,14 @@ struct tegra_mc {int tegra_mc_write_emem_configuration (struct tegra_mc *mc,unsigned long rate);unsigned int tegra_mc_get_emem_device_count (struct tegra_mc *mc); +#ifdef CONFIG_TEGRA_MC +struct tegra_mc *devm_tegra_memory_controller_get (struct device *dev); +#else +static inline struct tegra_mc * +devm_tegra_memory_controller_get (struct device *dev) +{ +ERR_PTR (-ENODEV ); +} +#endif +#endif /* __SOC_TEGRA_MC_H__ */
Signature · 1 line
2.27.0
Re: [PATCH v7 28/47] memory: tegra: Add and use devm_tegra_memory_controller_get()
Quoted 9 lines · Dmitry Osipenko
Multiple Tegra drivers need to retrieve Memory Controller and there is duplication of the retrieval code among the drivers.
Add new
devm_tegra_memory_controller_get()helper to remove the code's duplication and to fixput_device()which was missed in the duplicated code. Make EMC drivers to use the new helper.Acked-by Thierry Reding <[email protected]>Signed-off-by Dmitry Osipenko <[email protected]>
Quoted 8 lines
--- drivers/memory/tegra/mc.c | 48 ++++++++++++++++++++++++ drivers/memory/tegra/tegra124-emc.c | 18 ++------- drivers/memory/tegra/tegra210-emc-core.c | 39 +++++-------------- drivers/memory/tegra/tegra30-emc.c | 18 ++------- include/soc/tegra/mc.h | 10 +++++ 5 files changed, 74 insertions(+), 59 deletions(-)
Thanks, applied.
Best regards,
Krzysztof
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
Dmitry Osipenko
maintainerPATCH v7 29/47 memory: tegra: Use devm_platform_ioremap_resource()
In reply to Dmitry OsipenkoUse devm_platform_ioremap_resource() helper which makes code a bit cleaner.
--- drivers/memory/tegra/tegra124-emc.c | 4 +--- drivers/memory/tegra/tegra20-emc.c | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-)
drivers/memory/tegra/tegra124-emc.c +1 -3
@@ -1179,7 +1179,6 @@ static int tegra_emc_probe(struct platform_device *pdev) {struct device_node *np;struct tegra_emc *emc; -struct resource *res;u32 ram_code;int err;
@@ -1189,8 +1188,7 @@ static int tegra_emc_probe(struct platform_device *pdev) emc->dev = &pdev->dev; - res =platform_get_resource (pdev,IORESOURCE_MEM ,0 ); - emc->regs =devm_ioremap_resource (&pdev->dev, res); + emc->regs =devm_platform_ioremap_resource (pdev,0 );if (IS_ERR (emc->regs))return PTR_ERR (emc->regs);
drivers/memory/tegra/tegra20-emc.c +1 -3
@@ -654,7 +654,6 @@ static int tegra_emc_probe(struct platform_device *pdev) {struct device_node *np;struct tegra_emc *emc; -struct resource *res;int irq, err;/* driver has nothing to do in a case of memory timing absence */
@@ -689,8 +688,7 @@ static int tegra_emc_probe(struct platform_device *pdev)if (err)return err; - res =platform_get_resource (pdev,IORESOURCE_MEM ,0 ); - emc->regs =devm_ioremap_resource (&pdev->dev, res); + emc->regs =devm_platform_ioremap_resource (pdev,0 );if (IS_ERR (emc->regs))return PTR_ERR (emc->regs);
Signature · 1 line
2.27.0
Re: [PATCH v7 29/47] memory: tegra: Use devm_platform_ioremap_resource()
Quoted 9 lines · Dmitry Osipenko
Use
devm_platform_ioremap_resource()helper which makes code a bit cleaner.Acked-by Thierry Reding <[email protected]>Signed-off-by Dmitry Osipenko <[email protected]>--- drivers/memory/tegra/tegra124-emc.c | 4 +--- drivers/memory/tegra/tegra20-emc.c | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-)
Thanks, applied.
Best regards,
Krzysztof
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
Dmitry Osipenko
maintainerPATCH v7 30/47 memory: tegra: Remove superfluous error messages around platform_get_irq()
In reply to Dmitry OsipenkoThe platform_get_irq() prints error message telling that interrupt is missing, hence there is no need to duplicated that message in the drivers.
--- drivers/memory/tegra/mc.c | 4 +--- drivers/memory/tegra/tegra20-emc.c | 1 - drivers/memory/tegra/tegra30-emc.c | 5 ++--- 3 files changed, 3 insertions(+), 7 deletions(-)
drivers/memory/tegra/mc.c +1 -3
@@ -707,10 +707,8 @@ static int tegra_mc_probe(struct platform_device *pdev) } mc->irq =platform_get_irq (pdev,0 ); -if (mc->irq <0 ) { -dev_err (&pdev->dev,"interrupt not specified\n" ); +if (mc->irq <0 )return mc->irq; - }WARN (!mc->soc->client_id_mask,"missing client ID mask for this SoC\n" );
drivers/memory/tegra/tegra20-emc.c +0 -1
@@ -665,7 +665,6 @@ static int tegra_emc_probe(struct platform_device *pdev) irq =platform_get_irq (pdev,0 );if (irq <0 ) { -dev_err (&pdev->dev,"interrupt not specified\n" );dev_err (&pdev->dev,"please update your device tree\n" );return irq; }
drivers/memory/tegra/tegra30-emc.c +2 -3
@@ -1299,10 +1299,9 @@ static int tegra_emc_probe(struct platform_device *pdev)return err; err =platform_get_irq (pdev,0 ); -if (err <0 ) { -dev_err (&pdev->dev,"interrupt not specified: %d\n" , err); +if (err <0 )return err; - } + emc->irq = err; err = devm_request_irq(&pdev->dev, emc->irq, tegra_emc_isr, 0,
Signature · 1 line
2.27.0
Re: [PATCH v7 30/47] memory: tegra: Remove superfluous error messages around platform_get_irq()
Quoted 8 lines · Dmitry Osipenko
The
platform_get_irq()prints error message telling that interrupt is missing, hence there is no need to duplicated that message in the drivers.Signed-off-by Dmitry Osipenko <[email protected]>--- drivers/memory/tegra/mc.c | 4 +--- drivers/memory/tegra/tegra20-emc.c | 1 - drivers/memory/tegra/tegra30-emc.c | 5 ++---
Thanks, applied.
Best regards,
Krzysztof
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
Dmitry Osipenko
maintainerPATCH v7 31/47 memory: tegra: Add missing latency allowness entry for Page Table Cache
In reply to Dmitry OsipenkoAdd missing PTC memory client latency allowness entry to the Tegra MC drivers.
This prevents erroneous clearing of MC_INTSTATUS 0x0 register during of the LA programming in tegra_mc_setup_latency_allowance() due to the missing entry. Note that this patch doesn't fix any known problems.
--- drivers/memory/tegra/tegra114.c | 6 ++++++ drivers/memory/tegra/tegra124.c | 6 ++++++ drivers/memory/tegra/tegra30.c | 6 ++++++ 3 files changed, 18 insertions(+)
drivers/memory/tegra/tegra114.c +6 -0
@@ -15,6 +15,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = { .id = 0x00, .name = "ptcr", .swgroup = TEGRA_SWGROUP_PTC, + .la = { + .reg = 0x34c, + .shift = 0, + .mask = 0xff, + .def = 0x0, + }, }, { .id = 0x01, .name = "display0a",
drivers/memory/tegra/tegra124.c +6 -0
@@ -15,6 +15,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = { .id = 0x00, .name = "ptcr", .swgroup = TEGRA_SWGROUP_PTC, + .la = { + .reg = 0x34c, + .shift = 0, + .mask = 0xff, + .def = 0x0, + }, }, { .id = 0x01, .name = "display0a",
drivers/memory/tegra/tegra30.c +6 -0
@@ -36,6 +36,12 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .id = 0x00, .name = "ptcr", .swgroup = TEGRA_SWGROUP_PTC, + .la = { + .reg = 0x34c, + .shift = 0, + .mask = 0xff, + .def = 0x0, + }, }, { .id = 0x01, .name = "display0a",
Signature · 1 line
2.27.0
Re: [PATCH v7 31/47] memory: tegra: Add missing latency allowness entry for Page Table Cache
Quoted 7 lines · Dmitry Osipenko
Add missing PTC memory client latency allowness entry to the Tegra MC drivers.
This prevents erroneous clearing of
MC_INTSTATUS0x0register during of the LA programming integra_mc_setup_latency_allowance()due to the missing entry. Note that this patch doesn't fix any known problems.
Quoted 6 lines
Signed-off-by Dmitry Osipenko <[email protected]>--- drivers/memory/tegra/tegra114.c | 6 ++++++ drivers/memory/tegra/tegra124.c | 6 ++++++ drivers/memory/tegra/tegra30.c | 6 ++++++ 3 files changed, 18 insertions(+)
Thanks, applied.
Best regards,
Krzysztof
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
Dmitry Osipenko
maintainerPATCH v7 32/47 memory: tegra-mc: Add interconnect framework
In reply to Dmitry OsipenkoAdd common SoC-agnostic ICC framework which turns Tegra Memory Controller into a memory interconnection provider. This allows us to use interconnect API for tuning of memory configurations.
--- drivers/memory/tegra/Kconfig | 1 + drivers/memory/tegra/mc.c | 100 +++++++++++++++++++++++++++++++++++ drivers/memory/tegra/mc.h | 22 ++++++++ include/soc/tegra/mc.h | 17 ++++++ 4 files changed, 140 insertions(+)
drivers/memory/tegra/Kconfig +1 -0
@@ -3,6 +3,7 @@ config TEGRA_MC bool "NVIDIA Tegra Memory Controller support" default y depends on ARCH_TEGRA + select INTERCONNECT help This driver supports the Memory Controller (MC) hardware found on NVIDIA Tegra SoCs.
drivers/memory/tegra/mc.c +100 -0
112 lines not on this page · raw message
drivers/memory/tegra/mc.h +22 -0
@@ -78,6 +78,20 @@#define MC_TIMING_UPDATE BIT(0) +static inline u32 tegra_mc_scale_percents (u64 val,unsigned int percents) +{ + val = val * percents; +do_div (val,100 ); + +return min_t (u64, val,U32_MAX ); +} + +static inline struct tegra_mc * +icc_provider_to_tegra_mc (struct icc_provider *provider) +{ + return container_of(provider, struct tegra_mc, provider); +} +static inline u32 mc_readl (struct tegra_mc *mc,unsigned long offset) {return readl_relaxed (mc->regs + offset);
@@ -115,4 +129,12 @@ extern const struct tegra_mc_soc tegra132_mc_soc;extern const struct tegra_mc_soc tegra210_mc_soc;#endif +/* +* These IDs are for internal use of Tegra ICC drivers. The ID numbers are +* chosen such that they don't conflict with the device-tree ICC node IDs. +*/ +#define TEGRA_ICC_MC 1000 +#define TEGRA_ICC_EMC 1001 +#define TEGRA_ICC_EMEM 1002 +#endif /* MEMORY_TEGRA_MC_H */
include/soc/tegra/mc.h +17 -0
@@ -6,7 +6,9 @@#ifndef __SOC_TEGRA_MC_H__#define __SOC_TEGRA_MC_H__ +#include <linux/bits.h> #include <linux/err.h> +#include <linux/interconnect-provider.h> #include <linux/reset-controller.h> #include <linux/types.h>
@@ -141,6 +143,17 @@ struct tegra_mc_reset_ops { const struct tegra_mc_reset *rst); }; +#define TEGRA_MC_ICC_TAG_DEFAULT 0 +#define TEGRA_MC_ICC_TAG_ISO BIT(0) + +struct tegra_mc_icc_ops { +int (*set)(struct icc_node *src,struct icc_node *dst); +int (*aggregate)(struct icc_node *node,u32 tag,u32 avg_bw, +u32 peak_bw,u32 *agg_avg,u32 *agg_peak); +struct icc_node_data *(*xlate_extended)(struct of_phandle_args *spec, +void *data); +}; +struct tegra_mc_soc {const struct tegra_mc_client *clients;unsigned int num_clients;
@@ -160,6 +173,8 @@ struct tegra_mc_soc {const struct tegra_mc_reset_ops *reset_ops;const struct tegra_mc_reset *resets;unsigned int num_resets; + +const struct tegra_mc_icc_ops *icc_ops; };struct tegra_mc {
@@ -178,6 +193,8 @@ struct tegra_mc {struct reset_controller_dev reset; +struct icc_provider provider; +spinlock_t lock; };
Signature · 1 line
2.27.0
Re: [PATCH v7 32/47] memory: tegra-mc: Add interconnect framework
Quoted 7 lines · Dmitry Osipenko
Add common SoC-agnostic ICC framework which turns Tegra Memory Controller into a memory interconnection provider. This allows us to use interconnect API for tuning of memory configurations.
Tested-by Peter Geis <[email protected]>Tested-by Nicolas Chauvet <[email protected]>Signed-off-by Dmitry Osipenko <[email protected]>
Quoted 6 lines
--- drivers/memory/tegra/Kconfig | 1 + drivers/memory/tegra/mc.c | 100 +++++++++++++++++++++++++++++++++++ drivers/memory/tegra/mc.h | 22 ++++++++ include/soc/tegra/mc.h | 17 ++++++ 4 files changed, 140 insertions(+)
Thanks, applied.
Best regards,
Krzysztof
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
Dmitry Osipenko
maintainerPATCH v7 33/47 memory: tegra20-emc: Make driver modular
In reply to Dmitry OsipenkoAdd modularization support to the Tegra20 EMC driver, which now can be compiled as a loadable kernel module.
--- drivers/memory/tegra/Kconfig | 2 +- drivers/memory/tegra/tegra20-emc.c | 17 ++++++++++++----- 2 files changed, 13 insertions(+), 6 deletions(-)
drivers/memory/tegra/Kconfig +1 -1
@@ -9,7 +9,7 @@ config TEGRA_MC NVIDIA Tegra SoCs. config TEGRA20_EMC - bool "NVIDIA Tegra20 External Memory Controller driver" + tristate "NVIDIA Tegra20 External Memory Controller driver" default y depends on ARCH_TEGRA_2x_SOC help
drivers/memory/tegra/tegra20-emc.c +12 -5
@@ -721,6 +721,13 @@ static int tegra_emc_probe(struct platform_device *pdev)platform_set_drvdata (pdev, emc);tegra_emc_debugfs_init (emc); +/* +* Don't allow the kernel module to be unloaded. Unloading adds some +* extra complexity which doesn't really worth the effort in a case of +* this driver. +*/ +try_module_get (THIS_MODULE ); +return 0 ; unset_cb:
@@ -733,6 +740,7 @@ static const struct of_device_id tegra_emc_of_match[] = { { .compatible = "nvidia,tegra20-emc", }, {}, }; +MODULE_DEVICE_TABLE (of, tegra_emc_of_match);static struct platform_driver tegra_emc_driver = { .probe = tegra_emc_probe,
@@ -742,9 +750,8 @@ static struct platform_driver tegra_emc_driver = { .suppress_bind_attrs = true, }, }; +module_platform_driver (tegra_emc_driver); -static int __init tegra_emc_init (void ) -{ -return platform_driver_register (&tegra_emc_driver); -} -subsys_initcall (tegra_emc_init); +MODULE_AUTHOR ("Dmitry Osipenko <[email protected]>" ); +MODULE_DESCRIPTION ("NVIDIA Tegra20 EMC driver" ); +MODULE_LICENSE ("GPL v2" );
Signature · 1 line
2.27.0
Re: [PATCH v7 33/47] memory: tegra20-emc: Make driver modular
Quoted 9 lines · Dmitry Osipenko
Add modularization support to the Tegra20 EMC driver, which now can be compiled as a loadable kernel module.
Acked-by Thierry Reding <[email protected]>Signed-off-by Dmitry Osipenko <[email protected]>--- drivers/memory/tegra/Kconfig | 2 +- drivers/memory/tegra/tegra20-emc.c | 17 ++++++++++++----- 2 files changed, 13 insertions(+), 6 deletions(-)
Thanks, applied.
Best regards,
Krzysztof
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
Dmitry Osipenko
maintainerPATCH v7 34/47 memory: tegra20-emc: Continue probing if timings are missing in device-tree
In reply to Dmitry OsipenkoEMC driver will become mandatory after turning it into interconnect provider because interconnect users, like display controller driver, will fail to probe using newer device-trees that have interconnect properties. Thus make EMC driver to probe even if timings are missing in device-tree.
--- drivers/memory/tegra/tegra20-emc.c | 34 ++++++++++++++---------------- 1 file changed, 16 insertions(+), 18 deletions(-)
drivers/memory/tegra/tegra20-emc.c +16 -18
@@ -383,6 +383,11 @@ tegra_emc_find_node_by_ram_code(struct device *dev)u32 value, ram_code;int err; +if (of_get_child_count (dev->of_node) ==0 ) { +dev_info (dev,"device-tree doesn't have memory timings\n" ); +return NULL ; + } +if (!of_property_read_bool (dev->of_node,"nvidia,use-ram-code" ))return of_node_get (dev->of_node);
@@ -451,6 +456,9 @@ static long emc_round_rate(unsigned long rate,struct tegra_emc *emc = arg;unsigned int i; +if (!emc->num_timings) +return clk_get_rate (emc->clk); + min_rate =min (min_rate, emc->timings[emc->num_timings -1 ].rate);for (i =0 ; i < emc->num_timings; i++) {
@@ -656,36 +664,26 @@ static int tegra_emc_probe(struct platform_device *pdev)struct tegra_emc *emc;int irq, err; -/* driver has nothing to do in a case of memory timing absence */ -if (of_get_child_count (pdev->dev.of_node) ==0 ) { -dev_info (&pdev->dev, -"EMC device tree node doesn't have memory timings\n" ); -return 0 ; - } - irq =platform_get_irq (pdev,0 );if (irq <0 ) {dev_err (&pdev->dev,"please update your device tree\n" );return irq; } - np =tegra_emc_find_node_by_ram_code (&pdev->dev); -if (!np) -return -EINVAL ; - emc =devm_kzalloc (&pdev->dev,sizeof (*emc),GFP_KERNEL ); -if (!emc) { -of_node_put (np); +if (!emc)return -ENOMEM ; - } emc->clk_nb.notifier_call = tegra_emc_clk_change_notify; emc->dev = &pdev->dev; - err =tegra_emc_load_timings_from_dt (emc, np); -of_node_put (np); -if (err) -return err; + np =tegra_emc_find_node_by_ram_code (&pdev->dev); +if (np) { + err =tegra_emc_load_timings_from_dt (emc, np); +of_node_put (np); +if (err) +return err; + } emc->regs =devm_platform_ioremap_resource (pdev,0 );if (IS_ERR (emc->regs))
Signature · 1 line
2.27.0
Re: [PATCH v7 34/47] memory: tegra20-emc: Continue probing if timings are missing in device-tree
Quoted 9 lines · Dmitry Osipenko
EMC driver will become mandatory after turning it into interconnect provider because interconnect users, like display controller driver, will fail to probe using newer device-trees that have interconnect properties. Thus make EMC driver to probe even if timings are missing in device-tree.
Signed-off-by Dmitry Osipenko <[email protected]>--- drivers/memory/tegra/tegra20-emc.c | 34 ++++++++++++++---------------- 1 file changed, 16 insertions(+), 18 deletions(-)
Thanks, applied.
Best regards,
Krzysztof
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
Dmitry Osipenko
maintainerPATCH v7 35/47 memory: tegra20: Support interconnect framework
In reply to Dmitry OsipenkoNow Internal and External Memory Controllers are memory interconnection providers. This allows us to use interconnect API for tuning of memory configuration. EMC driver now supports OPPs and DVFS.
--- drivers/memory/tegra/Kconfig | 3 +- drivers/memory/tegra/tegra20-emc.c | 310 ++++++++++++++++++++++++++++- drivers/memory/tegra/tegra20.c | 77 +++++++ 3 files changed, 386 insertions(+), 4 deletions(-)
drivers/memory/tegra/Kconfig +2 -1
@@ -11,7 +11,8 @@ config TEGRA_MC config TEGRA20_EMC tristate "NVIDIA Tegra20 External Memory Controller driver" default y - depends on ARCH_TEGRA_2x_SOC + depends on TEGRA_MC && ARCH_TEGRA_2x_SOC + select PM_OPP help This driver is for the External Memory Controller (EMC) found on Tegra20 chips. The EMC controls the external DRAM on the board.
drivers/memory/tegra/tegra20-emc.c +307 -3
419 lines not on this page · raw message
drivers/memory/tegra/tegra20.c +77 -0
93 lines not on this page · raw message
Signature · 1 line
2.27.0
Re: [PATCH v7 35/47] memory: tegra20: Support interconnect framework
Quoted 10 lines · Dmitry Osipenko
Now Internal and External Memory Controllers are memory interconnection providers. This allows us to use interconnect API for tuning of memory configuration. EMC driver now supports OPPs and DVFS.
Signed-off-by Dmitry Osipenko <[email protected]>--- drivers/memory/tegra/Kconfig | 3 +- drivers/memory/tegra/tegra20-emc.c | 310 ++++++++++++++++++++++++++++- drivers/memory/tegra/tegra20.c | 77 +++++++ 3 files changed, 386 insertions(+), 4 deletions(-)
Thanks, applied.
Best regards,
Krzysztof
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
Dmitry Osipenko
maintainerPATCH v7 36/47 memory: tegra20-emc: Add devfreq support
In reply to Dmitry OsipenkoAdd devfreq support to the Tegra20 EMC driver. Memory utilization statistics will be periodically polled from the memory controller and appropriate minimum clock rate will be selected by the devfreq governor.
--- drivers/memory/tegra/Kconfig | 2 + drivers/memory/tegra/tegra20-emc.c | 92 ++++++++++++++++++++++++++++++ 2 files changed, 94 insertions(+)
drivers/memory/tegra/Kconfig +2 -0
@@ -12,6 +12,8 @@ config TEGRA20_EMC tristate "NVIDIA Tegra20 External Memory Controller driver" default y depends on TEGRA_MC && ARCH_TEGRA_2x_SOC + select DEVFREQ_GOV_SIMPLE_ONDEMAND + select PM_DEVFREQ select PM_OPP help This driver is for the External Memory Controller (EMC) found on
drivers/memory/tegra/tegra20-emc.c +92 -0
128 lines not on this page · raw message
Signature · 1 line
2.27.0
Chanwoo Choi
maintainerRe: [PATCH v7 36/47] memory: tegra20-emc: Add devfreq support
Quoted 15 lines · Dmitry Osipenko
Add devfreq support to the Tegra20 EMC driver. Memory utilization statistics will be periodically polled from the memory controller and appropriate minimum clock rate will be selected by the devfreq governor.
Signed-off-by Dmitry Osipenko <[email protected]>--- drivers/memory/tegra/Kconfig | 2 + drivers/memory/tegra/tegra20-emc.c | 92 ++++++++++++++++++++++++++++++ 2 files changed, 94 insertions(+)drivers/memory/tegra/Kconfig +0
-0
drivers/memory/tegra/Kconfig config TEGRA20_EMC · line 17
Quoted 6 lines
drivers/memory/tegra/Kconfig +2
-0@@ -12,6 +12,8 @@ config TEGRA20_EMC tristate "NVIDIA Tegra20 External Memory Controller driver" default y depends on TEGRA_MC && ARCH_TEGRA_2x_SOC + select DEVFREQ_GOV_SIMPLE_ONDEMAND + select PM_DEVFREQ select PM_OPP
nitpick. If you select PM_DEVFREQ, don't need to select 'PM_OPP' bacause PM_DEVFREQ use OPP as mandatory with 'select PM_OPP' in Kconfig.
Quoted 110 lines
drivers/memory/tegra/Kconfig +0
-0help This driver is for the External Memory Controller (EMC) found ondrivers/memory/tegra/tegra20-emc.c +72
-0@@ -8,6 +8,7 @@#include <linux/clk.h> #include <linux/clk/tegra.h> #include <linux/debugfs.h> +#include <linux/devfreq.h> #include <linux/err.h> #include <linux/interconnect-provider.h> #include <linux/interrupt.h> @@ -102,6 +103,10 @@#define EMC_FBIO_CFG5_DRAM_WIDTH_X16 BIT(4) +#define EMC_PWR_GATHER_CLEAR (1 << 8) +#define EMC_PWR_GATHER_DISABLE (2 << 8) +#define EMC_PWR_GATHER_ENABLE (3 << 8) +static const u16 emc_timing_registers[] = {EMC_RC ,EMC_RFC ,@@ -157,6 +162,7 @@ struct emc_timing { };enum emc_rate_request_type { +EMC_RATE_DEVFREQ ,EMC_RATE_DEBUG ,EMC_RATE_ICC ,EMC_RATE_TYPE_MAX ,@@ -193,6 +199,9 @@ struct tegra_emc {/* protect shared rate-change code path */ struct mutex rate_lock; + +struct devfreq_simple_ondemand_data ondemand_data; +struct devfreq *devfreq; };static irqreturn_t tegra_emc_isr (int irq,void *data)@@ -952,6 +961,88 @@ static int tegra_emc_opp_table_init(struct tegra_emc *emc)return err; } +static int tegra_emc_devfreq_target (struct device *dev,unsigned long *freq, +u32 flags) +{ +struct tegra_emc *emc =dev_get_drvdata (dev); +struct dev_pm_opp *opp; +unsigned long rate; + + opp =devfreq_recommended_opp (dev, freq, flags); +if (IS_ERR (opp)) { +dev_err (dev,"failed to find opp for %lu Hz\n" , *freq); +return PTR_ERR (opp); + } + + rate =dev_pm_opp_get_freq (opp); +dev_pm_opp_put (opp); + +return emc_set_min_rate (emc, rate,EMC_RATE_DEVFREQ ); +} + +static int tegra_emc_devfreq_get_dev_status (struct device *dev, +struct devfreq_dev_status *stat) +{ +struct tegra_emc *emc =dev_get_drvdata (dev); + +/* freeze counters */ +writel_relaxed (EMC_PWR_GATHER_DISABLE , emc->regs +EMC_STAT_CONTROL ); + +/* +* busy_time: number of clocks EMC request was accepted +* total_time: number of clocks PWR_GATHER control was set to ENABLE +*/ + stat->busy_time =readl_relaxed (emc->regs +EMC_STAT_PWR_COUNT ); + stat->total_time =readl_relaxed (emc->regs +EMC_STAT_PWR_CLOCKS ); + stat->current_frequency =clk_get_rate (emc->clk); + +/* clear counters and restart */ +writel_relaxed (EMC_PWR_GATHER_CLEAR , emc->regs +EMC_STAT_CONTROL ); +writel_relaxed (EMC_PWR_GATHER_ENABLE , emc->regs +EMC_STAT_CONTROL ); + +return 0 ; +} + +static struct devfreq_dev_profile tegra_emc_devfreq_profile = { + .polling_ms =30 , + .target = tegra_emc_devfreq_target, + .get_dev_status = tegra_emc_devfreq_get_dev_status, +}; + +static int tegra_emc_devfreq_init (struct tegra_emc *emc) +{ +int err; + +/* +* PWR_COUNT is 1/2 of PWR_CLOCKS at max, and thus, the up-threshold +* should be less than 50. Secondly, multiple active memory clients +* may cause over 20% of lost clock cycles due to stalls caused by +* competing memory accesses. This means that threshold should be +* set to a less than 30 in order to have a properly working governor. +*/ + emc->ondemand_data.upthreshold =20 ; + +/* +* Reset statistic gathers state, select global bandwidth for the
drivers/memory/tegra/tegra20-emc.c static int tegra_emc_opp_table_init(struct tegra_emc *emc) · line 1036
Quoted 10 lines
drivers/memory/tegra/tegra20-emc.c +10
-0+* statistics collection mode and set clocks counter saturation +* limit to maximum. +*/ +writel_relaxed (0x00000000 , emc->regs +EMC_STAT_CONTROL ); +writel_relaxed (0x00000000 , emc->regs +EMC_STAT_LLMC_CONTROL ); +writel_relaxed (0xffffffff , emc->regs +EMC_STAT_PWR_CLOCK_LIMIT ); + + emc->devfreq =devfreq_add_device (emc->dev, &tegra_emc_devfreq_profile, +DEVFREQ_GOV_SIMPLE_ONDEMAND , + &emc->ondemand_data);
Do you want to use 'devfreq_add_device' instead of 'devm_devfreq_add_device()'? If you have to use 'devfreq_add_device' due to some reason, you need to call 'devfreq_remove_device' on exit.
Quoted 21 lines
drivers/memory/tegra/tegra20-emc.c +10
-0+if (IS_ERR (emc->devfreq)) { + err =PTR_ERR (emc->devfreq); +dev_err (emc->dev,"failed to initialize devfreq: %d" , err); +return err; + } + +return 0 ; +} +static int tegra_emc_probe (struct platform_device *pdev) {struct device_node *np;@@ -1019,6 +1110,7 @@ static int tegra_emc_probe(struct platform_device *pdev)tegra_emc_rate_requests_init (emc);tegra_emc_debugfs_init (emc);tegra_emc_interconnect_init (emc); +tegra_emc_devfreq_init (emc);/* * Don't allow the kernel module to be unloaded. Unloading adds some
Signature · 7 lines
Best Regards, Chanwoo Choi Samsung Electronics _______________________________________________ dri-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/dri-devel
Dmitry Osipenko
maintainerRe: [PATCH v7 36/47] memory: tegra20-emc: Add devfreq support
05.11.2020 05:30, Chanwoo Choi пишет:
Quoted 11 lines · Dmitry Osipenko
Quoted 10 lines
Add devfreq support to the Tegra20 EMC driver. Memory utilization statistics will be periodically polled from the memory controller and appropriate minimum clock rate will be selected by the devfreq governor.
Signed-off-by Dmitry Osipenko <[email protected]>--- drivers/memory/tegra/Kconfig | 2 + drivers/memory/tegra/tegra20-emc.c | 92 ++++++++++++++++++++++++++++++ 2 files changed, 94 insertions(+)
Quoted 14 lines
drivers/memory/tegra/Kconfig config TEGRA20_EMC · line 17
Quoted 11 lines
drivers/memory/tegra/Kconfig +2
-0@@ -12,6 +12,8 @@ config TEGRA20_EMC tristate "NVIDIA Tegra20 External Memory Controller driver" default y depends on TEGRA_MC && ARCH_TEGRA_2x_SOC + select DEVFREQ_GOV_SIMPLE_ONDEMAND + select PM_DEVFREQ select PM_OPPnitpick. If you select
PM_DEVFREQ, don't need to select 'PM_OPP' bacausePM_DEVFREQuse OPP as mandatory with 'selectPM_OPP' inKconfig.
Ok
...
Quoted 21 lines
Quoted 21 lines
drivers/memory/tegra/Kconfig +21
-0+static int tegra_emc_devfreq_init(struct tegra_emc *emc) +{ + int err; + + /* + * PWR_COUNT is 1/2 of PWR_CLOCKS at max, and thus, the up-threshold + * should be less than 50. Secondly, multiple active memory clients + * may cause over 20% of lost clock cycles due to stalls caused by + * competing memory accesses. This means that threshold should be + * set to a less than 30 in order to have a properly working governor. + */ + emc->ondemand_data.upthreshold = 20; + + /* + * Reset statistic gathers state, select global bandwidth for the + * statistics collection mode and set clocks counter saturation + * limit to maximum. + */ + writel_relaxed(0x00000000, emc->regs + EMC_STAT_CONTROL); + writel_relaxed(0x00000000, emc->regs + EMC_STAT_LLMC_CONTROL); + writel_relaxed(0xffffffff, emc->regs + EMC_STAT_PWR_CLOCK_LIMIT);
Quoted 8 lines
drivers/memory/tegra/Kconfig
Quoted 4 lines
drivers/memory/tegra/Kconfig +4
-0+ + emc->devfreq = devfreq_add_device(emc->dev, &tegra_emc_devfreq_profile, + DEVFREQ_GOV_SIMPLE_ONDEMAND, + &emc->ondemand_data);Do you want to use '
devfreq_add_device' instead of 'devm_devfreq_add_device()'? If you have to use 'devfreq_add_device' due to some reason, you need to call 'devfreq_remove_device' on exit.
The reason I didn't use the devm here is because the EMC-clk callback should be unregistered *after* devfreq is removed.
Thinking a bit more about it, I guess the best variant will be to add devm support to the clk callback registration and then it should be possible to use devm for the devfreq. I'll try to implement it in v8, thanks.
Krzysztof Kozlowski
maintainerRe: [PATCH v7 36/47] memory: tegra20-emc: Add devfreq support
In reply to Dmitry OsipenkoQuoted 10 lines · Dmitry Osipenko
Add devfreq support to the Tegra20 EMC driver. Memory utilization statistics will be periodically polled from the memory controller and appropriate minimum clock rate will be selected by the devfreq governor.
Signed-off-by Dmitry Osipenko <[email protected]>--- drivers/memory/tegra/Kconfig | 2 + drivers/memory/tegra/tegra20-emc.c | 92 ++++++++++++++++++++++++++++++ 2 files changed, 94 insertions(+)
I see this one still received comments. I skipped the DTS patches and applied everything till patch #35. I understand you will send v8, so in such case please skip the applied ones (you can rebase on my for-next or on Monday's linux-next).
Best regards,
Krzysztof
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
Dmitry Osipenko
maintainerRe: [PATCH v7 36/47] memory: tegra20-emc: Add devfreq support
06.11.2020 22:13, Krzysztof Kozlowski пишет:
Quoted 12 lines · Dmitry Osipenko
Quoted 10 lines
Add devfreq support to the Tegra20 EMC driver. Memory utilization statistics will be periodically polled from the memory controller and appropriate minimum clock rate will be selected by the devfreq governor.
Signed-off-by Dmitry Osipenko <[email protected]>--- drivers/memory/tegra/Kconfig | 2 + drivers/memory/tegra/tegra20-emc.c | 92 ++++++++++++++++++++++++++++++ 2 files changed, 94 insertions(+)
Quoted 4 lines
I see this one still received comments. I skipped the DTS patches and applied everything till patch #35. I understand you will send v8, so in such case please skip the applied ones (you can rebase on my for-next or on Monday's linux-next).
Thank you! I'll also need to wait for a reply from Viresh Kumar in other thread regarding dev_pm_opp_get_opp_table() usage and then will probably need to correct patch #35+ as well now, since turned out it may be wrong for drivers to use dev_pm_opp_get_opp_table().
Dmitry Osipenko
maintainerPATCH v7 37/47 memory: tegra30: Add FIFO sizes to memory clients
In reply to Dmitry OsipenkoThe latency allowness is calculated based on buffering capabilities of memory clients. Add FIFO sizes to the Tegra30 memory clients.
--- drivers/memory/tegra/tegra30.c | 66 ++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+)
drivers/memory/tegra/tegra30.c +66 -0
@@ -42,6 +42,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x0, }, + .fifo_size = 16 * 2, }, { .id = 0x01, .name = "display0a",
@@ -56,6 +57,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x4e, }, + .fifo_size = 16 * 128, }, { .id = 0x02, .name = "display0ab",
@@ -70,6 +72,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x4e, }, + .fifo_size = 16 * 128, }, { .id = 0x03, .name = "display0b",
@@ -84,6 +87,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x4e, }, + .fifo_size = 16 * 64, }, { .id = 0x04, .name = "display0bb",
@@ -98,6 +102,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x4e, }, + .fifo_size = 16 * 64, }, { .id = 0x05, .name = "display0c",
@@ -112,6 +117,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x4e, }, + .fifo_size = 16 * 128, }, { .id = 0x06, .name = "display0cb",
@@ -126,6 +132,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x4e, }, + .fifo_size = 16 * 128, }, { .id = 0x07, .name = "display1b",
@@ -140,6 +147,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x4e, }, + .fifo_size = 16 * 64, }, { .id = 0x08, .name = "display1bb",
@@ -154,6 +162,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x4e, }, + .fifo_size = 16 * 64, }, { .id = 0x09, .name = "eppup",
@@ -168,6 +177,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x17, }, + .fifo_size = 16 * 8, }, { .id = 0x0a, .name = "g2pr",
@@ -182,6 +192,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x09, }, + .fifo_size = 16 * 64, }, { .id = 0x0b, .name = "g2sr",
@@ -196,6 +207,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x09, }, + .fifo_size = 16 * 64, }, { .id = 0x0c, .name = "mpeunifbr",
@@ -210,6 +222,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x50, }, + .fifo_size = 16 * 8, }, { .id = 0x0d, .name = "viruv",
@@ -224,6 +237,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x2c, }, + .fifo_size = 16 * 8, }, { .id = 0x0e, .name = "afir",
@@ -238,6 +252,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x10, }, + .fifo_size = 16 * 32, }, { .id = 0x0f, .name = "avpcarm7r",
@@ -252,6 +267,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x04, }, + .fifo_size = 16 * 2, }, { .id = 0x10, .name = "displayhc",
@@ -266,6 +282,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0xff, }, + .fifo_size = 16 * 2, }, { .id = 0x11, .name = "displayhcb",
@@ -280,6 +297,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0xff, }, + .fifo_size = 16 * 2, }, { .id = 0x12, .name = "fdcdrd",
@@ -294,6 +312,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x0a, }, + .fifo_size = 16 * 48, }, { .id = 0x13, .name = "fdcdrd2",
@@ -308,6 +327,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x0a, }, + .fifo_size = 16 * 48, }, { .id = 0x14, .name = "g2dr",
@@ -322,6 +342,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x0a, }, + .fifo_size = 16 * 48, }, { .id = 0x15, .name = "hdar",
@@ -336,6 +357,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0xff, }, + .fifo_size = 16 * 16, }, { .id = 0x16, .name = "host1xdmar",
@@ -350,6 +372,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x05, }, + .fifo_size = 16 * 16, }, { .id = 0x17, .name = "host1xr",
@@ -364,6 +387,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x50, }, + .fifo_size = 16 * 8, }, { .id = 0x18, .name = "idxsrd",
@@ -378,6 +402,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x13, }, + .fifo_size = 16 * 64, }, { .id = 0x19, .name = "idxsrd2",
@@ -392,6 +417,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x13, }, + .fifo_size = 16 * 64, }, { .id = 0x1a, .name = "mpe_ipred",
@@ -406,6 +432,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x80, }, + .fifo_size = 16 * 2, }, { .id = 0x1b, .name = "mpeamemrd",
@@ -420,6 +447,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x42, }, + .fifo_size = 16 * 64, }, { .id = 0x1c, .name = "mpecsrd",
@@ -434,6 +462,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0xff, }, + .fifo_size = 16 * 8, }, { .id = 0x1d, .name = "ppcsahbdmar",
@@ -448,6 +477,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x10, }, + .fifo_size = 16 * 2, }, { .id = 0x1e, .name = "ppcsahbslvr",
@@ -462,6 +492,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x12, }, + .fifo_size = 16 * 8, }, { .id = 0x1f, .name = "satar",
@@ -476,6 +507,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x33, }, + .fifo_size = 16 * 32, }, { .id = 0x20, .name = "texsrd",
@@ -490,6 +522,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x13, }, + .fifo_size = 16 * 64, }, { .id = 0x21, .name = "texsrd2",
@@ -504,6 +537,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x13, }, + .fifo_size = 16 * 64, }, { .id = 0x22, .name = "vdebsevr",
@@ -518,6 +552,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0xff, }, + .fifo_size = 16 * 8, }, { .id = 0x23, .name = "vdember",
@@ -532,6 +567,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0xd0, }, + .fifo_size = 16 * 4, }, { .id = 0x24, .name = "vdemcer",
@@ -546,6 +582,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x2a, }, + .fifo_size = 16 * 16, }, { .id = 0x25, .name = "vdetper",
@@ -560,6 +597,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x74, }, + .fifo_size = 16 * 16, }, { .id = 0x26, .name = "mpcorelpr",
@@ -570,6 +608,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x04, }, + .fifo_size = 16 * 14, }, { .id = 0x27, .name = "mpcorer",
@@ -580,6 +619,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x04, }, + .fifo_size = 16 * 14, }, { .id = 0x28, .name = "eppu",
@@ -594,6 +634,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x6c, }, + .fifo_size = 16 * 64, }, { .id = 0x29, .name = "eppv",
@@ -608,6 +649,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x6c, }, + .fifo_size = 16 * 64, }, { .id = 0x2a, .name = "eppy",
@@ -622,6 +664,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x6c, }, + .fifo_size = 16 * 64, }, { .id = 0x2b, .name = "mpeunifbw",
@@ -636,6 +679,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x13, }, + .fifo_size = 16 * 8, }, { .id = 0x2c, .name = "viwsb",
@@ -650,6 +694,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x12, }, + .fifo_size = 16 * 64, }, { .id = 0x2d, .name = "viwu",
@@ -664,6 +709,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0xb2, }, + .fifo_size = 16 * 64, }, { .id = 0x2e, .name = "viwv",
@@ -678,6 +724,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0xb2, }, + .fifo_size = 16 * 64, }, { .id = 0x2f, .name = "viwy",
@@ -692,6 +739,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x12, }, + .fifo_size = 16 * 64, }, { .id = 0x30, .name = "g2dw",
@@ -706,6 +754,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x9, }, + .fifo_size = 16 * 128, }, { .id = 0x31, .name = "afiw",
@@ -720,6 +769,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x0c, }, + .fifo_size = 16 * 32, }, { .id = 0x32, .name = "avpcarm7w",
@@ -734,6 +784,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x0e, }, + .fifo_size = 16 * 2, }, { .id = 0x33, .name = "fdcdwr",
@@ -748,6 +799,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x0a, }, + .fifo_size = 16 * 48, }, { .id = 0x34, .name = "fdcdwr2",
@@ -762,6 +814,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x0a, }, + .fifo_size = 16 * 48, }, { .id = 0x35, .name = "hdaw",
@@ -776,6 +829,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0xff, }, + .fifo_size = 16 * 16, }, { .id = 0x36, .name = "host1xw",
@@ -790,6 +844,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x10, }, + .fifo_size = 16 * 32, }, { .id = 0x37, .name = "ispw",
@@ -804,6 +859,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0xff, }, + .fifo_size = 16 * 64, }, { .id = 0x38, .name = "mpcorelpw",
@@ -814,6 +870,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x0e, }, + .fifo_size = 16 * 24, }, { .id = 0x39, .name = "mpcorew",
@@ -824,6 +881,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x0e, }, + .fifo_size = 16 * 24, }, { .id = 0x3a, .name = "mpecswr",
@@ -838,6 +896,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0xff, }, + .fifo_size = 16 * 8, }, { .id = 0x3b, .name = "ppcsahbdmaw",
@@ -852,6 +911,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x10, }, + .fifo_size = 16 * 2, }, { .id = 0x3c, .name = "ppcsahbslvw",
@@ -866,6 +926,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x06, }, + .fifo_size = 16 * 4, }, { .id = 0x3d, .name = "sataw",
@@ -880,6 +941,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x33, }, + .fifo_size = 16 * 32, }, { .id = 0x3e, .name = "vdebsevw",
@@ -894,6 +956,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0xff, }, + .fifo_size = 16 * 4, }, { .id = 0x3f, .name = "vdedbgw",
@@ -908,6 +971,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0xff, }, + .fifo_size = 16 * 16, }, { .id = 0x40, .name = "vdembew",
@@ -922,6 +986,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x42, }, + .fifo_size = 16 * 2, }, { .id = 0x41, .name = "vdetpmw",
@@ -936,6 +1001,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = { .mask = 0xff, .def = 0x2a, }, + .fifo_size = 16 * 16, }, };
Signature · 1 line
2.27.0
Dmitry Osipenko
maintainerPATCH v7 38/47 memory: tegra30-emc: Make driver modular
In reply to Dmitry OsipenkoAdd modularization support to the Tegra30 EMC driver, which now can be compiled as a loadable kernel module.
--- drivers/memory/tegra/Kconfig | 2 +- drivers/memory/tegra/mc.c | 3 +++ drivers/memory/tegra/tegra30-emc.c | 17 ++++++++++++----- 3 files changed, 16 insertions(+), 6 deletions(-)
drivers/memory/tegra/Kconfig +1 -1
@@ -22,7 +22,7 @@ config TEGRA20_EMC external memory. config TEGRA30_EMC - bool "NVIDIA Tegra30 External Memory Controller driver" + tristate "NVIDIA Tegra30 External Memory Controller driver" default y depends on TEGRA_MC && ARCH_TEGRA_3x_SOC help
drivers/memory/tegra/mc.c +3 -0
@@ -6,6 +6,7 @@#include <linux/clk.h> #include <linux/delay.h> #include <linux/dma-mapping.h> +#include <linux/export.h> #include <linux/interrupt.h> #include <linux/kernel.h> #include <linux/module.h>
@@ -346,6 +347,7 @@ int tegra_mc_write_emem_configuration(struct tegra_mc *mc, unsigned long rate)return 0 ; } +EXPORT_SYMBOL_GPL (tegra_mc_write_emem_configuration);unsigned int tegra_mc_get_emem_device_count (struct tegra_mc *mc) {
@@ -357,6 +359,7 @@ unsigned int tegra_mc_get_emem_device_count(struct tegra_mc *mc)return dram_count; } +EXPORT_SYMBOL_GPL (tegra_mc_get_emem_device_count); static int load_one_timing(struct tegra_mc *mc, struct tegra_mc_timing *timing,
drivers/memory/tegra/tegra30-emc.c +12 -5
@@ -1330,6 +1330,13 @@ static int tegra_emc_probe(struct platform_device *pdev)platform_set_drvdata (pdev, emc);tegra_emc_debugfs_init (emc); +/* +* Don't allow the kernel module to be unloaded. Unloading adds some +* extra complexity which doesn't really worth the effort in a case of +* this driver. +*/ +try_module_get (THIS_MODULE ); +return 0 ; unset_cb:
@@ -1380,6 +1387,7 @@ static const struct of_device_id tegra_emc_of_match[] = { { .compatible = "nvidia,tegra30-emc", }, {}, }; +MODULE_DEVICE_TABLE (of, tegra_emc_of_match);static struct platform_driver tegra_emc_driver = { .probe = tegra_emc_probe,
@@ -1390,9 +1398,8 @@ static struct platform_driver tegra_emc_driver = { .suppress_bind_attrs = true, }, }; +module_platform_driver (tegra_emc_driver); -static int __init tegra_emc_init (void ) -{ -return platform_driver_register (&tegra_emc_driver); -} -subsys_initcall (tegra_emc_init); +MODULE_AUTHOR ("Dmitry Osipenko <[email protected]>" ); +MODULE_DESCRIPTION ("NVIDIA Tegra30 EMC driver" ); +MODULE_LICENSE ("GPL v2" );
Signature · 1 line
2.27.0
Dmitry Osipenko
maintainerPATCH v7 39/47 memory: tegra30-emc: Continue probing if timings are missing in device-tree
In reply to Dmitry OsipenkoEMC driver will become mandatory after turning it into interconnect provider because interconnect users, like display controller driver, will fail to probe using newer device-trees that have interconnect properties. Thus make EMC driver to probe even if timings are missing in device-tree.
--- drivers/memory/tegra/tegra30-emc.c | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-)
drivers/memory/tegra/tegra30-emc.c +15 -14
@@ -988,6 +988,11 @@ static struct device_node *emc_find_node_by_ram_code(struct device *dev)u32 value, ram_code;int err; +if (of_get_child_count (dev->of_node) ==0 ) { +dev_info (dev,"device-tree doesn't have memory timings\n" ); +return NULL ; + } + ram_code =tegra_read_ram_code ();for_each_child_of_node (dev->of_node, np) {
@@ -1057,6 +1062,9 @@ static long emc_round_rate(unsigned long rate,struct tegra_emc *emc = arg;unsigned int i; +if (!emc->num_timings) +return clk_get_rate (emc->clk); + min_rate =min (min_rate, emc->timings[emc->num_timings -1 ].rate);for (i =0 ; i < emc->num_timings; i++) {
@@ -1262,16 +1270,6 @@ static int tegra_emc_probe(struct platform_device *pdev)struct tegra_emc *emc;int err; -if (of_get_child_count (pdev->dev.of_node) ==0 ) { -dev_info (&pdev->dev, -"device-tree node doesn't have memory timings\n" ); -return -ENODEV ; - } - - np =emc_find_node_by_ram_code (&pdev->dev); -if (!np) -return -EINVAL ; - emc =devm_kzalloc (&pdev->dev,sizeof (*emc),GFP_KERNEL );if (!emc) {of_node_put (np);
@@ -1285,10 +1283,13 @@ static int tegra_emc_probe(struct platform_device *pdev) emc->clk_nb.notifier_call = emc_clk_change_notify; emc->dev = &pdev->dev; - err =emc_load_timings_from_dt (emc, np); -of_node_put (np); -if (err) -return err; + np =emc_find_node_by_ram_code (&pdev->dev); +if (np) { + err =emc_load_timings_from_dt (emc, np); +of_node_put (np); +if (err) +return err; + } emc->regs =devm_platform_ioremap_resource (pdev,0 );if (IS_ERR (emc->regs))
Signature · 1 line
2.27.0
Dmitry Osipenko
maintainerPATCH v7 40/47 memory: tegra30: Support interconnect framework
In reply to Dmitry OsipenkoNow Internal and External memory controllers are memory interconnection providers. This allows us to use interconnect API for tuning of memory configuration. EMC driver now supports OPPs and DVFS. MC driver now supports tuning of memory arbitration latency, which needs to be done for ISO memory clients, like a Display client for example.
--- drivers/memory/tegra/Kconfig | 1 + drivers/memory/tegra/tegra30-emc.c | 292 ++++++++++++++++++++++++++++- drivers/memory/tegra/tegra30.c | 173 ++++++++++++++++- 3 files changed, 463 insertions(+), 3 deletions(-)
drivers/memory/tegra/Kconfig +1 -0
@@ -25,6 +25,7 @@ config TEGRA30_EMC tristate "NVIDIA Tegra30 External Memory Controller driver" default y depends on TEGRA_MC && ARCH_TEGRA_3x_SOC + select PM_OPP help This driver is for the External Memory Controller (EMC) found on Tegra30 chips. The EMC controls the external DRAM on the board.
drivers/memory/tegra/tegra30-emc.c +290 -2
373 lines not on this page · raw message
drivers/memory/tegra/tegra30.c +172 -1
189 lines not on this page · raw message
Signature · 1 line
2.27.0
Dmitry Osipenko
maintainerPATCH v7 41/47 memory: tegra124-emc: Make driver modular
In reply to Dmitry OsipenkoAdd modularization support to the Tegra124 EMC driver, which now can be compiled as a loadable kernel module.
Note that EMC clock must be registered at clk-init time, otherwise PLLM will be disabled as unused clock at boot time if EMC driver is compiled as a module. Hence add a prepare/complete callbacks. similarly to what is done for the Tegra20/30 EMC drivers.
--- drivers/clk/tegra/Makefile | 3 +- drivers/clk/tegra/clk-tegra124-emc.c | 41 ++++++++++++++++++++++++---- drivers/clk/tegra/clk-tegra124.c | 27 ++++++++++++++++-- drivers/clk/tegra/clk.h | 16 +++-------- drivers/memory/tegra/Kconfig | 2 +- drivers/memory/tegra/tegra124-emc.c | 31 ++++++++++++++------- include/linux/clk/tegra.h | 8 ++++++ include/soc/tegra/emc.h | 16 ----------- 8 files changed, 96 insertions(+), 48 deletions(-) delete mode 100644 include/soc/tegra/emc.h
drivers/clk/tegra/Makefile +2 -1
@@ -22,7 +22,8 @@ obj-$(CONFIG_ARCH_TEGRA_3x_SOC) += clk-tegra20-emc.o obj-$(CONFIG_ARCH_TEGRA_114_SOC) += clk-tegra114.o obj-$(CONFIG_ARCH_TEGRA_124_SOC) += clk-tegra124.o obj-$(CONFIG_TEGRA_CLK_DFLL) += clk-tegra124-dfll-fcpu.o -obj-$(CONFIG_TEGRA124_EMC) += clk-tegra124-emc.o +obj-$(CONFIG_ARCH_TEGRA_124_SOC) += clk-tegra124-emc.o +obj-$(CONFIG_ARCH_TEGRA_132_SOC) += clk-tegra124-emc.o obj-$(CONFIG_ARCH_TEGRA_132_SOC) += clk-tegra124.o obj-y += cvb.o obj-$(CONFIG_ARCH_TEGRA_210_SOC) += clk-tegra210.o
drivers/clk/tegra/clk-tegra124-emc.c +36 -5
87 lines not on this page · raw message
drivers/clk/tegra/clk-tegra124.c +24 -3
@@ -929,6 +929,7 @@ static struct tegra_clk tegra124_clks[tegra_clk_max] __initdata = { [tegra_clk_audio4_mux] = { .dt_id = TEGRA124_CLK_AUDIO4_MUX, .present = true }, [tegra_clk_spdif_mux] = { .dt_id = TEGRA124_CLK_SPDIF_MUX, .present = true }, [tegra_clk_cec] = { .dt_id = TEGRA124_CLK_CEC, .present = true }, + [tegra_clk_emc] = { .dt_id = TEGRA124_CLK_EMC, .present = false }, };static struct tegra_devclk devclks[]__initdata = {
@@ -1500,6 +1501,26 @@ static void __init tegra124_132_clock_init_pre(struct device_node *np)writel (plld_base, clk_base +PLLD_BASE ); } +static struct clk *tegra124_clk_src_onecell_get (struct of_phandle_args *clkspec, +void *data) +{ +struct clk_hw *hw; +struct clk *clk; + + clk =of_clk_src_onecell_get (clkspec, data); +if (IS_ERR (clk)) +return clk; + + hw =__clk_get_hw (clk); + +if (clkspec->args[0 ] ==TEGRA124_CLK_EMC ) { +if (!tegra124_clk_emc_driver_available (hw)) +return ERR_PTR (-EPROBE_DEFER ); + } + +return clk; +} +/** * tegra124_132_clock_init_post - clock initialization postamble for T124/T132 * @np: struct device_node * of the DT node for the SoC CAR IP block
@@ -1516,10 +1537,10 @@ static void __init tegra124_132_clock_init_post(struct device_node *np) &pll_x_params);tegra_init_special_resets (1 , tegra124_reset_assert, tegra124_reset_deassert); -tegra_add_of_provider (np, of_clk_src_onecell_get); +tegra_add_of_provider (np, tegra124_clk_src_onecell_get); - clks[TEGRA124_CLK_EMC ] =tegra_clk_register_emc (clk_base, np, - &emc_lock); + clks[TEGRA124_CLK_EMC ] =tegra124_clk_register_emc (clk_base, np, + &emc_lock);tegra_register_devclks (devclks,ARRAY_SIZE (devclks));
drivers/clk/tegra/clk.h +4 -12
@@ -881,18 +881,6 @@ void tegra_super_clk_gen5_init(void __iomem *clk_base, void __iomem *pmc_base, struct tegra_clk *tegra_clks, struct tegra_clk_pll_params *pll_params); -#ifdef CONFIG_TEGRA124_EMC -struct clk *tegra_clk_register_emc (void __iomem *base,struct device_node *np, -spinlock_t *lock); -#else -static inline struct clk *tegra_clk_register_emc (void __iomem *base, -struct device_node *np, -spinlock_t *lock) -{ -return NULL ; -} -#endif -void tegra114_clock_tune_cpu_trimmers_high (void );void tegra114_clock_tune_cpu_trimmers_low (void );void tegra114_clock_tune_cpu_trimmers_init (void );
@@ -922,6 +910,10 @@ void tegra_clk_periph_resume(void);bool tegra20_clk_emc_driver_available (struct clk_hw *emc_hw);struct clk *tegra20_clk_register_emc (void __iomem *ioaddr,bool low_jitter); +struct clk *tegra124_clk_register_emc (void __iomem *base,struct device_node *np, +spinlock_t *lock); +bool tegra124_clk_emc_driver_available (struct clk_hw *emc_hw); +struct clk *tegra210_clk_register_emc (struct device_node *np,void __iomem *regs);
drivers/memory/tegra/Kconfig +1 -1
@@ -33,7 +33,7 @@ config TEGRA30_EMC external memory. config TEGRA124_EMC - bool "NVIDIA Tegra124 External Memory Controller driver" + tristate "NVIDIA Tegra124 External Memory Controller driver" default y depends on TEGRA_MC && ARCH_TEGRA_124_SOC help
drivers/memory/tegra/tegra124-emc.c +21 -10
@@ -9,16 +9,17 @@#include <linux/clk-provider.h> #include <linux/clk.h> #include <linux/clkdev.h> +#include <linux/clk/tegra.h> #include <linux/debugfs.h> #include <linux/delay.h> #include <linux/io.h> +#include <linux/module.h> #include <linux/of_address.h> #include <linux/of_platform.h> #include <linux/platform_device.h> #include <linux/sort.h> #include <linux/string.h> -#include <soc/tegra/emc.h> #include <soc/tegra/fuse.h> #include <soc/tegra/mc.h>
@@ -562,8 +563,8 @@ static struct emc_timing *tegra_emc_find_timing(struct tegra_emc *emc,return timing; } -int tegra_emc_prepare_timing_change (struct tegra_emc *emc, -unsigned long rate) +static int tegra_emc_prepare_timing_change (struct tegra_emc *emc, +unsigned long rate) {struct emc_timing *timing =tegra_emc_find_timing (emc, rate);struct emc_timing *last = &emc->last_timing;
@@ -790,8 +791,8 @@ int tegra_emc_prepare_timing_change(struct tegra_emc *emc,return 0 ; } -void tegra_emc_complete_timing_change (struct tegra_emc *emc, -unsigned long rate) +static void tegra_emc_complete_timing_change (struct tegra_emc *emc, +unsigned long rate) {struct emc_timing *timing =tegra_emc_find_timing (emc, rate);struct emc_timing *last = &emc->last_timing;
@@ -987,6 +988,7 @@ static const struct of_device_id tegra_emc_of_match[] = { { .compatible = "nvidia,tegra132-emc" }, {} }; +MODULE_DEVICE_TABLE (of, tegra_emc_of_match);static struct device_node *tegra_emc_find_node_by_ram_code (struct device_node *node,u32 ram_code)
@@ -1226,9 +1228,19 @@ static int tegra_emc_probe(struct platform_device *pdev)platform_set_drvdata (pdev, emc); +tegra124_clk_set_emc_callbacks (tegra_emc_prepare_timing_change, + tegra_emc_complete_timing_change); +if (IS_ENABLED (CONFIG_DEBUG_FS ))emc_debugfs_init (&pdev->dev, emc); +/* +* Don't allow the kernel module to be unloaded. Unloading adds some +* extra complexity which doesn't really worth the effort in a case of +* this driver. +*/ +try_module_get (THIS_MODULE ); +return 0 ; };
@@ -1240,9 +1252,8 @@ static struct platform_driver tegra_emc_driver = { .suppress_bind_attrs = true, }, }; +module_platform_driver (tegra_emc_driver); -static int tegra_emc_init (void ) -{ -return platform_driver_register (&tegra_emc_driver); -} -subsys_initcall (tegra_emc_init); +MODULE_AUTHOR ("Mikko Perttunen <[email protected]>" ); +MODULE_DESCRIPTION ("NVIDIA Tegra124 EMC driver" ); +MODULE_LICENSE ("GPL v2" );
include/linux/clk/tegra.h +8 -0
@@ -136,6 +136,7 @@ extern void tegra210_clk_emc_dll_update_setting(u32 emc_dll_src_value);extern void tegra210_clk_emc_update_setting (u32 emc_src_value);struct clk ; +struct tegra_emc ; typedef long (tegra20_clk_emc_round_cb)(unsigned long rate, unsigned long min_rate,
@@ -146,6 +147,13 @@ void tegra20_clk_set_emc_round_callback(tegra20_clk_emc_round_cb *round_cb, void *cb_arg);int tegra20_clk_prepare_emc_mc_same_freq (struct clk *emc_clk,bool same); +typedef int (tegra124_emc_prepare_timing_change_cb )(struct tegra_emc *emc, +unsigned long rate); +typedef void (tegra124_emc_complete_timing_change_cb )(struct tegra_emc *emc, +unsigned long rate); +void tegra124_clk_set_emc_callbacks (tegra124_emc_prepare_timing_change_cb *prep_cb, +tegra124_emc_complete_timing_change_cb *complete_cb); +struct tegra210_clk_emc_config {unsigned long rate;bool same_freq;
include/soc/tegra/emc.h deleted +0 -16
@@ -1,16 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* -* Copyright (c) 2014 NVIDIA Corporation. All rights reserved. -*/ - -#ifndef __SOC_TEGRA_EMC_H__ -#define __SOC_TEGRA_EMC_H__ - -struct tegra_emc ; - -int tegra_emc_prepare_timing_change (struct tegra_emc *emc, -unsigned long rate); -void tegra_emc_complete_timing_change (struct tegra_emc *emc, -unsigned long rate); - -#endif /* __SOC_TEGRA_EMC_H__ */
Signature · 1 line
2.27.0
Dmitry Osipenko
maintainerPATCH v7 42/47 memory: tegra124: Support interconnect framework
In reply to Dmitry OsipenkoNow Internal and External memory controllers are memory interconnection providers. This allows us to use interconnect API for tuning of memory configuration. EMC driver now supports OPPs and DVFS.
--- drivers/memory/tegra/Kconfig | 1 + drivers/memory/tegra/tegra124-emc.c | 325 +++++++++++++++++++++++++++- drivers/memory/tegra/tegra124.c | 82 ++++++- 3 files changed, 396 insertions(+), 12 deletions(-)
drivers/memory/tegra/Kconfig +1 -0
@@ -36,6 +36,7 @@ config TEGRA124_EMC tristate "NVIDIA Tegra124 External Memory Controller driver" default y depends on TEGRA_MC && ARCH_TEGRA_124_SOC + select PM_OPP help This driver is for the External Memory Controller (EMC) found on Tegra124 chips. The EMC controls the external DRAM on the board.
drivers/memory/tegra/tegra124-emc.c +314 -11
426 lines not on this page · raw message
drivers/memory/tegra/tegra124.c +81 -1
105 lines not on this page · raw message
Signature · 1 line
2.27.0
Dmitry Osipenko
maintainerPATCH v7 43/47 drm/tegra: dc: Support memory bandwidth management
In reply to Dmitry OsipenkoDisplay controller (DC) performs isochronous memory transfers, and thus, has a requirement for a minimum memory bandwidth that shall be fulfilled, otherwise framebuffer data can't be fetched fast enough and this results in a DC's data-FIFO underflow that follows by a visual corruption.
The Memory Controller drivers provide facility for memory bandwidth management via interconnect API. Let's wire up the interconnect API support to the DC driver in order to fix the distorted display output on T30 Ouya, T124 TK1 and other Tegra devices.
--- drivers/gpu/drm/tegra/Kconfig | 1 + drivers/gpu/drm/tegra/dc.c | 349 ++++++++++++++++++++++++++++++++++ drivers/gpu/drm/tegra/dc.h | 14 ++ drivers/gpu/drm/tegra/drm.c | 14 ++ drivers/gpu/drm/tegra/hub.c | 3 + drivers/gpu/drm/tegra/plane.c | 121 ++++++++++++ drivers/gpu/drm/tegra/plane.h | 15 ++ 7 files changed, 517 insertions(+)
drivers/gpu/drm/tegra/Kconfig +1 -0
@@ -9,6 +9,7 @@ config DRM_TEGRA select DRM_MIPI_DSI select DRM_PANEL select TEGRA_HOST1X + select INTERCONNECT select IOMMU_IOVA select CEC_CORE if CEC_NOTIFIER help
drivers/gpu/drm/tegra/dc.c +349 -0
466 lines not on this page · raw message
drivers/gpu/drm/tegra/dc.h +14 -0
@@ -15,6 +15,8 @@struct tegra_output ; +#define TEGRA_DC_LEGACY_PLANES_NUM 6 +struct tegra_dc_state {struct drm_crtc_state base;
@@ -23,6 +25,8 @@ struct tegra_dc_state {unsigned int div;u32 planes; + +unsigned long plane_peak_bw[TEGRA_DC_LEGACY_PLANES_NUM ]; };static inline struct tegra_dc_state *to_dc_state (struct drm_crtc_state *state)
@@ -33,6 +37,12 @@ static inline struct tegra_dc_state *to_dc_state(struct drm_crtc_state *state)return NULL ; } +static inline const struct tegra_dc_state * +to_const_dc_state (const struct drm_crtc_state *state) +{ +return to_dc_state ((struct drm_crtc_state *)state); +} +struct tegra_dc_stats {unsigned long frames;unsigned long vblank;
@@ -65,7 +75,9 @@ struct tegra_dc_soc_info {unsigned int num_overlay_formats;const u64 *modifiers;bool has_win_a_without_filters; +bool has_win_b_vfilter_mem_client;bool has_win_c_without_vert_filter; +unsigned int plane_tiled_memory_bandwidth_x2; };struct tegra_dc {
@@ -151,6 +163,8 @@ int tegra_dc_state_setup_clock(struct tegra_dc *dc,struct drm_crtc_state *crtc_state, struct clk *clk, unsigned long pclk, unsigned int div); +void tegra_crtc_atomic_post_commit (struct drm_crtc *crtc, +struct drm_atomic_state *state);/* from rgb.c */ int tegra_dc_rgb_probe (struct tegra_dc *dc);
drivers/gpu/drm/tegra/drm.c +14 -0
@@ -20,6 +20,7 @@#include <drm/drm_prime.h> #include <drm/drm_vblank.h> +#include "dc.h" #include "drm.h" #include "gem.h"
@@ -59,6 +60,17 @@ static const struct drm_mode_config_funcs tegra_drm_mode_config_funcs = { .atomic_commit = drm_atomic_helper_commit, }; +static void tegra_atomic_post_commit (struct drm_device *drm, +struct drm_atomic_state *old_state) +{ +struct drm_crtc_state *old_crtc_state; +struct drm_crtc *crtc; +unsigned int i; + +for_each_old_crtc_in_state (old_state, crtc, old_crtc_state, i) +tegra_crtc_atomic_post_commit (crtc, old_state); +} +static void tegra_atomic_commit_tail (struct drm_atomic_state *old_state) {struct drm_device *drm = old_state->dev;
@@ -75,6 +87,8 @@ static void tegra_atomic_commit_tail(struct drm_atomic_state *old_state) }else {drm_atomic_helper_commit_tail_rpm (old_state); } + +tegra_atomic_post_commit (drm, old_state); } static const struct drm_mode_config_helper_funcs
drivers/gpu/drm/tegra/hub.c +3 -0
@@ -344,6 +344,9 @@ static int tegra_shared_plane_atomic_check(struct drm_plane *plane,struct tegra_dc *dc =to_tegra_dc (state->crtc);int err; + plane_state->peak_memory_bandwidth =0 ; + plane_state->avg_memory_bandwidth =0 ; +/* no need for further checks if the plane is being disabled */ if (!state->crtc || !state->fb)return 0 ;
drivers/gpu/drm/tegra/plane.c +121 -0
148 lines not on this page · raw message
drivers/gpu/drm/tegra/plane.h +15 -0
@@ -8,6 +8,7 @@#include <drm/drm_plane.h> +struct icc_path ;struct tegra_bo ;struct tegra_dc ;
@@ -16,6 +17,9 @@ struct tegra_plane {struct tegra_dc *dc;unsigned int offset;unsigned int index; + +struct icc_path *icc_mem; +struct icc_path *icc_mem_vfilter; };struct tegra_cursor {
@@ -52,6 +56,10 @@ struct tegra_plane_state {/* used for legacy blending support only */ struct tegra_plane_legacy_blending_state blending[2 ];bool opaque; + +/* bandwidths are in ICC units, i.e. kbytes/sec */ +u32 peak_memory_bandwidth; +u32 avg_memory_bandwidth; }; static inline struct tegra_plane_state *
@@ -63,6 +71,12 @@ to_tegra_plane_state(struct drm_plane_state *state)return NULL ; } +static inline const struct tegra_plane_state * +to_const_tegra_plane_state (const struct drm_plane_state *state) +{ +return to_tegra_plane_state ((struct drm_plane_state *)state); +} +extern const struct drm_plane_funcs tegra_plane_funcs; int tegra_plane_prepare_fb(struct drm_plane *plane,
@@ -77,5 +91,6 @@ int tegra_plane_format(u32 fourcc, u32 *format, u32 *swap);bool tegra_plane_format_is_yuv (unsigned int format,bool *planar);int tegra_plane_setup_legacy_state (struct tegra_plane *tegra,struct tegra_plane_state *state); +int tegra_plane_interconnect_init (struct tegra_plane *plane);#endif /* TEGRA_PLANE_H */
Signature · 1 line
2.27.0
kernel test robot
build botRe: [PATCH v7 43/47] drm/tegra: dc: Support memory bandwidth management
I love your patch! Perhaps something to improve:
Hi Dmitry,
I love your patch! Perhaps something to improve:
[auto build test WARNING on next-20201104]
[also build test WARNING on v5.10-rc3]
[cannot apply to tegra/for-next robh/for-next tegra-drm/drm/tegra/for-next linus/master v5.10-rc2 v5.10-rc1 v5.9] [If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Dmitry-Osipenko/Introduce-memory-interconnect-for-NVIDIA-Tegra-SoCs/20201105-005537 base: cf7cd542d1b538f6e9e83490bc090dd773f4266d config: arm-defconfig (attached as .config) compiler: arm-linux-gnueabi-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross
# https://github.com/0day-ci/linux/commit/01d7363f5d564fbbdfd51321b86c6ca34a41bab1
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Dmitry-Osipenko/Introduce-memory-interconnect-for-NVIDIA-Tegra-SoCs/20201105-005537 git checkout 01d7363f5d564fbbdfd51321b86c6ca34a41bab1
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=arm
If you fix the issue, kindly add following tag as appropriate
All warnings (new ones prefixed by >>):
drivers/gpu/drm/tegra/drm.c: In function 'tegra_atomic_post_commit':
>> drivers/gpu/drm/tegra/drm.c:66:25: warning: variable 'old_crtc_state' set but not used [-Wunused-but-set-variable]
66 | struct drm_crtc_state *old_crtc_state;
| ^~~~~~~~~~~~~~vim +/old_crtc_state +66 drivers/gpu/drm/tegra/drm.c
62
63 static void tegra_atomic_post_commit(struct drm_device *drm,
64 struct drm_atomic_state *old_state)
65 {
> 66 struct drm_crtc_state *old_crtc_state;
67 struct drm_crtc *crtc;
68 unsigned int i;
69
70 for_each_old_crtc_in_state(old_state, crtc, old_crtc_state, i)
71 tegra_crtc_atomic_post_commit(crtc, old_state);
72 }
73 ---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
Dmitry Osipenko
maintainerPATCH v7 44/47 drm/tegra: dc: Extend debug stats with total number of events
In reply to Dmitry OsipenkoIt's useful to know the total number of underflow events and currently the debug stats are getting reset each time CRTC is being disabled. Let's account the overall number of events that doesn't get a reset.
--- drivers/gpu/drm/tegra/dc.c | 10 ++++++++++ drivers/gpu/drm/tegra/dc.h | 5 +++++ 2 files changed, 15 insertions(+)
drivers/gpu/drm/tegra/dc.c +10 -0
@@ -1539,6 +1539,11 @@ static int tegra_dc_show_stats(struct seq_file *s, void *data)seq_printf (s,"underflow: %lu\n" , dc->stats.underflow);seq_printf (s,"overflow: %lu\n" , dc->stats.overflow); +seq_printf (s,"frames total: %lu\n" , dc->stats.frames_total); +seq_printf (s,"vblank total: %lu\n" , dc->stats.vblank_total); +seq_printf (s,"underflow total: %lu\n" , dc->stats.underflow_total); +seq_printf (s,"overflow total: %lu\n" , dc->stats.overflow_total); +return 0 ; }
@@ -2308,6 +2313,7 @@ static irqreturn_t tegra_dc_irq(int irq, void *data)/* dev_dbg(dc->dev, "%s(): frame end\n", __func__); */ + dc->stats.frames_total++; dc->stats.frames++; }
@@ -2316,6 +2322,7 @@ static irqreturn_t tegra_dc_irq(int irq, void *data)dev_dbg(dc->dev, "%s(): vertical blank\n", __func__); */ drm_crtc_handle_vblank (&dc->base); + dc->stats.vblank_total++; dc->stats.vblank++; }
@@ -2323,6 +2330,7 @@ static irqreturn_t tegra_dc_irq(int irq, void *data)/* dev_dbg(dc->dev, "%s(): underflow\n", __func__); */ + dc->stats.underflow_total++; dc->stats.underflow++; }
@@ -2330,11 +2338,13 @@ static irqreturn_t tegra_dc_irq(int irq, void *data)/* dev_dbg(dc->dev, "%s(): overflow\n", __func__); */ + dc->stats.overflow_total++; dc->stats.overflow++; }if (status &HEAD_UF_INT ) {dev_dbg_ratelimited (dc->dev,"%s(): head underflow\n" , __func__); + dc->stats.underflow_total++; dc->stats.underflow++; }
drivers/gpu/drm/tegra/dc.h +5 -0
@@ -48,6 +48,11 @@ struct tegra_dc_stats {unsigned long vblank;unsigned long underflow;unsigned long overflow; + +unsigned long frames_total; +unsigned long vblank_total; +unsigned long underflow_total; +unsigned long overflow_total; };struct tegra_windowgroup_soc {
Signature · 1 line
2.27.0
Dmitry Osipenko
maintainerPATCH v7 45/47 PM / devfreq: tegra30: Support interconnect and OPPs from device-tree
In reply to Dmitry OsipenkoThis patch moves ACTMON driver away from generating OPP table by itself, transitioning it to use the table which comes from device-tree. This change breaks compatibility with older device-trees in order to bring support for the interconnect framework to the driver. This is a mandatory change which needs to be done in order to implement interconnect-based memory DVFS. Users of legacy device-trees will get a message telling that theirs DT needs to be upgraded. Now ACTMON issues memory bandwidth request using dev_pm_opp_set_bw(), instead of driving EMC clock rate directly.
--- drivers/devfreq/tegra30-devfreq.c | 96 +++++++++++++++++-------------- 1 file changed, 54 insertions(+), 42 deletions(-)
drivers/devfreq/tegra30-devfreq.c +54 -42
@@ -19,6 +19,8 @@#include <linux/reset.h> #include <linux/workqueue.h> +#include <soc/tegra/fuse.h> +#include "governor.h" #define ACTMON_GLB_STATUS 0x0
@@ -155,6 +157,7 @@ struct tegra_devfreq_device {struct tegra_devfreq {struct devfreq *devfreq; +struct opp_table *opp_table;struct reset_control *reset;struct clk *clock;
@@ -612,34 +615,19 @@ static void tegra_actmon_stop(struct tegra_devfreq *tegra)static int tegra_devfreq_target (struct device *dev,unsigned long *freq,u32 flags) { -struct tegra_devfreq *tegra =dev_get_drvdata (dev); -struct devfreq *devfreq = tegra->devfreq;struct dev_pm_opp *opp; -unsigned long rate; -int err; +int ret; opp =devfreq_recommended_opp (dev, freq, flags);if (IS_ERR (opp)) {dev_err (dev,"Failed to find opp for %lu Hz\n" , *freq);return PTR_ERR (opp); } - rate =dev_pm_opp_get_freq (opp); -dev_pm_opp_put (opp); - - err =clk_set_min_rate (tegra->emc_clock, rate *KHZ ); -if (err) -return err; - - err =clk_set_rate (tegra->emc_clock,0 ); -if (err) - goto restore_min_rate; - -return 0 ; -restore_min_rate: -clk_set_min_rate (tegra->emc_clock, devfreq->previous_freq); + ret =dev_pm_opp_set_bw (dev, opp); +dev_pm_opp_put (opp); -return err; +return ret; } static int tegra_devfreq_get_dev_status(struct device *dev,
@@ -655,7 +643,7 @@ static int tegra_devfreq_get_dev_status(struct device *dev, stat->private_data = tegra;/* The below are to be used by the other governors */ - stat->current_frequency = cur_freq; + stat->current_frequency = cur_freq *KHZ ; actmon_dev = &tegra->devices[MCALL ];
@@ -705,7 +693,12 @@ static int tegra_governor_get_target(struct devfreq *devfreq, target_freq =max (target_freq, dev->target_freq); } - *freq = target_freq; +/* +* tegra-devfreq driver operates with KHz units, while OPP table +* entries use Hz units. Hence we need to convert the units for the +* devfreq core. +*/ + *freq = target_freq *KHZ ;return 0 ; }
@@ -774,13 +767,22 @@ static struct devfreq_governor tegra_devfreq_governor = {static int tegra_devfreq_probe (struct platform_device *pdev) { +u32 hw_version =BIT (tegra_sku_info.soc_speedo_id);struct tegra_devfreq_device *dev;struct tegra_devfreq *tegra; +struct opp_table *opp_table;struct devfreq *devfreq;unsigned int i;long rate;int err; +/* legacy device-trees don't have OPP table and must be updated */ +if (!device_property_present (&pdev->dev,"operating-points-v2" )) { +dev_err (&pdev->dev, +"OPP table not found, please update your device tree\n" ); +return -ENODEV ; + } + tegra =devm_kzalloc (&pdev->dev,sizeof (*tegra),GFP_KERNEL );if (!tegra)return -ENOMEM ;
@@ -822,11 +824,31 @@ static int tegra_devfreq_probe(struct platform_device *pdev)return err; } + tegra->opp_table =dev_pm_opp_get_opp_table (&pdev->dev); + err =PTR_ERR_OR_ZERO (tegra->opp_table); +if (err) { +dev_err (&pdev->dev,"Failed to prepare OPP table: %d\n" , err); +return err; + } + + opp_table =dev_pm_opp_set_supported_hw (&pdev->dev, &hw_version,1 ); + err =PTR_ERR_OR_ZERO (opp_table); +if (err) { +dev_err (&pdev->dev,"Failed to set supported HW: %d\n" , err); + goto put_table; + } + + err =dev_pm_opp_of_add_table (&pdev->dev); +if (err) { +dev_err (&pdev->dev,"Failed to add OPP table: %d\n" , err); + goto put_hw; + } + err =clk_prepare_enable (tegra->clock);if (err) {dev_err (&pdev->dev,"Failed to prepare and enable ACTMON clock\n" ); -return err; + goto remove_table; } err =reset_control_reset (tegra->reset);
@@ -850,23 +872,6 @@ static int tegra_devfreq_probe(struct platform_device *pdev) dev->regs = tegra->regs + dev->config->offset; } -for (rate =0 ; rate <= tegra->max_freq *KHZ ; rate++) { - rate =clk_round_rate (tegra->emc_clock, rate); - -if (rate <0 ) { -dev_err (&pdev->dev, -"Failed to round clock rate: %ld\n" , rate); - err = rate; - goto remove_opps; - } - - err =dev_pm_opp_add (&pdev->dev, rate /KHZ ,0 ); -if (err) { -dev_err (&pdev->dev,"Failed to add OPP: %d\n" , err); - goto remove_opps; - } - } -platform_set_drvdata (pdev, tegra); tegra->clk_rate_change_nb.notifier_call = tegra_actmon_clk_notify_cb;
@@ -882,7 +887,6 @@ static int tegra_devfreq_probe(struct platform_device *pdev) } tegra_devfreq_profile.initial_freq =clk_get_rate (tegra->emc_clock); - tegra_devfreq_profile.initial_freq /=KHZ ; devfreq =devfreq_add_device (&pdev->dev, &tegra_devfreq_profile,"tegra_actmon" ,NULL );
@@ -902,6 +906,12 @@ static int tegra_devfreq_probe(struct platform_device *pdev)reset_control_reset (tegra->reset); disable_clk:clk_disable_unprepare (tegra->clock); +remove_table: +dev_pm_opp_of_remove_table (&pdev->dev); +put_hw: +dev_pm_opp_put_supported_hw (tegra->opp_table); +put_table: +dev_pm_opp_put_opp_table (tegra->opp_table);return err; }
@@ -913,11 +923,13 @@ static int tegra_devfreq_remove(struct platform_device *pdev)devfreq_remove_device (tegra->devfreq);devfreq_remove_governor (&tegra_devfreq_governor); -dev_pm_opp_remove_all_dynamic (&pdev->dev); -reset_control_reset (tegra->reset);clk_disable_unprepare (tegra->clock); +dev_pm_opp_of_remove_table (&pdev->dev); +dev_pm_opp_put_supported_hw (tegra->opp_table); +dev_pm_opp_put_opp_table (tegra->opp_table); +return 0 ; }
Signature · 1 line
2.27.0
Re: [PATCH v7 45/47] PM / devfreq: tegra30: Support interconnect and OPPs from device-tree
Hi Dmitry,
Quoted 207 lines · Dmitry Osipenko
This patch moves ACTMON driver away from generating OPP table by itself, transitioning it to use the table which comes from device-tree. This change breaks compatibility with older device-trees in order to bring support for the interconnect framework to the driver. This is a mandatory change which needs to be done in order to implement interconnect-based memory DVFS. Users of legacy device-trees will get a message telling that theirs DT needs to be upgraded. Now ACTMON issues memory bandwidth request using
dev_pm_opp_set_bw(), instead of driving EMC clock rate directly.Tested-by Peter Geis <[email protected]>Tested-by Nicolas Chauvet <[email protected]>Signed-off-by Dmitry Osipenko <[email protected]>--- drivers/devfreq/tegra30-devfreq.c | 96 +++++++++++++++++-------------- 1 file changed, 54 insertions(+), 42 deletions(-)drivers/devfreq/tegra30-devfreq.c +50
-42@@ -19,6 +19,8 @@#include <linux/reset.h> #include <linux/workqueue.h> +#include <soc/tegra/fuse.h> +#include "governor.h" #define ACTMON_GLB_STATUS 0x0@@ -155,6 +157,7 @@ struct tegra_devfreq_device {struct tegra_devfreq {struct devfreq *devfreq; +struct opp_table *opp_table;struct reset_control *reset;struct clk *clock;@@ -612,34 +615,19 @@ static void tegra_actmon_stop(struct tegra_devfreq *tegra)static int tegra_devfreq_target (struct device *dev,unsigned long *freq,u32 flags) { -struct tegra_devfreq *tegra =dev_get_drvdata (dev); -struct devfreq *devfreq = tegra->devfreq;struct dev_pm_opp *opp; -unsigned long rate; -int err; +int ret; opp =devfreq_recommended_opp (dev, freq, flags);if (IS_ERR (opp)) {dev_err (dev,"Failed to find opp for %lu Hz\n" , *freq);return PTR_ERR (opp); } - rate =dev_pm_opp_get_freq (opp); -dev_pm_opp_put (opp); - - err =clk_set_min_rate (tegra->emc_clock, rate *KHZ ); -if (err) -return err; - - err =clk_set_rate (tegra->emc_clock,0 ); -if (err) - goto restore_min_rate; - -return 0 ; -restore_min_rate: -clk_set_min_rate (tegra->emc_clock, devfreq->previous_freq); + ret =dev_pm_opp_set_bw (dev, opp); +dev_pm_opp_put (opp); -return err; +return ret; } static int tegra_devfreq_get_dev_status(struct device *dev,@@ -655,7 +643,7 @@ static int tegra_devfreq_get_dev_status(struct device *dev, stat->private_data = tegra;/* The below are to be used by the other governors */ - stat->current_frequency = cur_freq; + stat->current_frequency = cur_freq *KHZ ; actmon_dev = &tegra->devices[MCALL ];@@ -705,7 +693,12 @@ static int tegra_governor_get_target(struct devfreq *devfreq, target_freq =max (target_freq, dev->target_freq); } - *freq = target_freq; +/* +* tegra-devfreq driver operates with KHz units, while OPP table +* entries use Hz units. Hence we need to convert the units for the +* devfreq core. +*/ + *freq = target_freq *KHZ ;return 0 ; }@@ -774,13 +767,22 @@ static struct devfreq_governor tegra_devfreq_governor = {static int tegra_devfreq_probe (struct platform_device *pdev) { +u32 hw_version =BIT (tegra_sku_info.soc_speedo_id);struct tegra_devfreq_device *dev;struct tegra_devfreq *tegra; +struct opp_table *opp_table;struct devfreq *devfreq;unsigned int i;long rate;int err; +/* legacy device-trees don't have OPP table and must be updated */ +if (!device_property_present (&pdev->dev,"operating-points-v2" )) { +dev_err (&pdev->dev, +"OPP table not found, please update your device tree\n" ); +return -ENODEV ; + } + tegra =devm_kzalloc (&pdev->dev,sizeof (*tegra),GFP_KERNEL );if (!tegra)return -ENOMEM ;@@ -822,11 +824,31 @@ static int tegra_devfreq_probe(struct platform_device *pdev)return err; } + tegra->opp_table =dev_pm_opp_get_opp_table (&pdev->dev); + err =PTR_ERR_OR_ZERO (tegra->opp_table); +if (err) { +dev_err (&pdev->dev,"Failed to prepare OPP table: %d\n" , err); +return err; + } + + opp_table =dev_pm_opp_set_supported_hw (&pdev->dev, &hw_version,1 ); + err =PTR_ERR_OR_ZERO (opp_table); +if (err) { +dev_err (&pdev->dev,"Failed to set supported HW: %d\n" , err); + goto put_table; + } + + err =dev_pm_opp_of_add_table (&pdev->dev); +if (err) { +dev_err (&pdev->dev,"Failed to add OPP table: %d\n" , err); + goto put_hw; + } + err =clk_prepare_enable (tegra->clock);if (err) {dev_err (&pdev->dev,"Failed to prepare and enable ACTMON clock\n" ); -return err; + goto remove_table; } err =reset_control_reset (tegra->reset);@@ -850,23 +872,6 @@ static int tegra_devfreq_probe(struct platform_device *pdev) dev->regs = tegra->regs + dev->config->offset; } -for (rate =0 ; rate <= tegra->max_freq *KHZ ; rate++) { - rate =clk_round_rate (tegra->emc_clock, rate); - -if (rate <0 ) { -dev_err (&pdev->dev, -"Failed to round clock rate: %ld\n" , rate); - err = rate; - goto remove_opps; - } - - err =dev_pm_opp_add (&pdev->dev, rate /KHZ ,0 ); -if (err) { -dev_err (&pdev->dev,"Failed to add OPP: %d\n" , err); - goto remove_opps; - } - } -platform_set_drvdata (pdev, tegra); tegra->clk_rate_change_nb.notifier_call = tegra_actmon_clk_notify_cb;@@ -882,7 +887,6 @@ static int tegra_devfreq_probe(struct platform_device *pdev) } tegra_devfreq_profile.initial_freq =clk_get_rate (tegra->emc_clock); - tegra_devfreq_profile.initial_freq /=KHZ ; devfreq =devfreq_add_device (&pdev->dev, &tegra_devfreq_profile,"tegra_actmon" ,NULL );@@ -902,6 +906,12 @@ static int tegra_devfreq_probe(struct platform_device *pdev)reset_control_reset (tegra->reset); disable_clk:clk_disable_unprepare (tegra->clock); +remove_table: +dev_pm_opp_of_remove_table (&pdev->dev); +put_hw: +dev_pm_opp_put_supported_hw (tegra->opp_table); +put_table: +dev_pm_opp_put_opp_table (tegra->opp_table);return err; }@@ -913,11 +923,13 @@ static int tegra_devfreq_remove(struct platform_device *pdev)devfreq_remove_device (tegra->devfreq);devfreq_remove_governor (&tegra_devfreq_governor); -dev_pm_opp_remove_all_dynamic (&pdev->dev); -
drivers/devfreq/tegra30-devfreq.c static int tegra_devfreq_remove(struct platform_device *pdev) · line 935
Quoted 10 lines
drivers/devfreq/tegra30-devfreq.c +4
-0reset_control_reset (tegra->reset);clk_disable_unprepare (tegra->clock); +dev_pm_opp_of_remove_table (&pdev->dev); +dev_pm_opp_put_supported_hw (tegra->opp_table); +dev_pm_opp_put_opp_table (tegra->opp_table); +return 0 ; }
Signature · 7 lines
Best Regards, Chanwoo Choi Samsung Electronics _______________________________________________ dri-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/dri-devel
Dmitry Osipenko
maintainerPATCH v7 46/47 PM / devfreq: tegra30: Separate configurations per-SoC generation
In reply to Dmitry OsipenkoPreviously we were using count-weight of the T124 for T30 in order to get EMC clock rate that was reasonable for T30. In fact the count-weight should be x2 times smaller on T30, but then devfreq was producing a bit too low EMC clock rate for ISO memory clients, like display controller for example.
Now both Tegra ACTMON and Tegra DRM display drivers support interconnect framework and display driver tells to ICC what a minimum memory bandwidth is needed, preventing FIFO underflows. Thus, now we can use a proper count-weight value for Tegra30 and MC_ALL device config needs a bit more aggressive boosting.
Add a separate ACTMON driver configuration that is specific to Tegra30.
--- drivers/devfreq/tegra30-devfreq.c | 68 ++++++++++++++++++++++++------- 1 file changed, 54 insertions(+), 14 deletions(-)
drivers/devfreq/tegra30-devfreq.c +54 -14
@@ -57,13 +57,6 @@#define ACTMON_BELOW_WMARK_WINDOW 3#define ACTMON_BOOST_FREQ_STEP 16000 -/* -* Activity counter is incremented every 256 memory transactions, and each -* transaction takes 4 EMC clocks for Tegra124; So the COUNT_WEIGHT is -* 4 * 256 = 1024. -*/ -#define ACTMON_COUNT_WEIGHT 0x400 -/* * ACTMON_AVERAGE_WINDOW_LOG2: default value for @DEV_CTRL_K_VAL, which * translates to 2 ^ (K_VAL + 1). ex: 2 ^ (6 + 1) = 128
@@ -111,7 +104,7 @@ enum tegra_actmon_device { MCCPU, }; -static const struct tegra_devfreq_device_config actmon_device_configs[] = { +static const struct tegra_devfreq_device_config tegra124_device_configs[] = { {/* MCALL: All memory accesses (including from the CPUs) */ .offset =0x1c0 ,
@@ -133,6 +126,28 @@ static const struct tegra_devfreq_device_config actmon_device_configs[] = { }, }; +static const struct tegra_devfreq_device_config tegra30_device_configs[] = { + { +/* MCALL: All memory accesses (including from the CPUs) */ + .offset =0x1c0 , + .irq_mask =1 <<26 , + .boost_up_coeff =200 , + .boost_down_coeff =50 , + .boost_up_threshold =20 , + .boost_down_threshold =10 , + }, + { +/* MCCPU: memory accesses from the CPUs */ + .offset =0x200 , + .irq_mask =1 <<25 , + .boost_up_coeff =800 , + .boost_down_coeff =40 , + .boost_up_threshold =27 , + .boost_down_threshold =10 , + .avg_dependency_threshold =16000 ,/* 16MHz in kHz units */ + }, +}; +/** * struct tegra_devfreq_device - state specific to an ACTMON device *
@@ -155,6 +170,12 @@ struct tegra_devfreq_device {unsigned long target_freq; }; +struct tegra_devfreq_soc_data { +const struct tegra_devfreq_device_config *configs; +/* Weight value for count measurements */ +unsigned int count_weight; +}; +struct tegra_devfreq {struct devfreq *devfreq;struct opp_table *opp_table;
@@ -171,11 +192,13 @@ struct tegra_devfreq {struct delayed_work cpufreq_update_work;struct notifier_block cpu_rate_change_nb; -struct tegra_devfreq_device devices[ARRAY_SIZE (actmon_device_configs)]; +struct tegra_devfreq_device devices[2 ];unsigned int irq;bool started; + +const struct tegra_devfreq_soc_data *soc; };struct tegra_actmon_emc_ratio {
@@ -488,7 +511,7 @@ static void tegra_actmon_configure_device(struct tegra_devfreq *tegra,tegra_devfreq_update_avg_wmark (tegra, dev);tegra_devfreq_update_wmark (tegra, dev); -device_writel (dev,ACTMON_COUNT_WEIGHT ,ACTMON_DEV_COUNT_WEIGHT ); +device_writel (dev, tegra->soc->count_weight,ACTMON_DEV_COUNT_WEIGHT );device_writel (dev,ACTMON_INTR_STATUS_CLEAR ,ACTMON_DEV_INTR_STATUS ); val |=ACTMON_DEV_CTRL_ENB_PERIODIC ;
@@ -787,6 +810,8 @@ static int tegra_devfreq_probe(struct platform_device *pdev)if (!tegra)return -ENOMEM ; + tegra->soc =of_device_get_match_data (&pdev->dev); + tegra->regs =devm_platform_ioremap_resource (pdev,0 );if (IS_ERR (tegra->regs))return PTR_ERR (tegra->regs);
@@ -866,9 +891,9 @@ static int tegra_devfreq_probe(struct platform_device *pdev) tegra->max_freq = rate /KHZ ; -for (i =0 ; i <ARRAY_SIZE (actmon_device_configs); i++) { +for (i =0 ; i <ARRAY_SIZE (tegra->devices); i++) { dev = tegra->devices + i; - dev->config = actmon_device_configs + i; + dev->config = tegra->soc->configs + i; dev->regs = tegra->regs + dev->config->offset; }
@@ -933,9 +958,24 @@ static int tegra_devfreq_remove(struct platform_device *pdev)return 0 ; } +static const struct tegra_devfreq_soc_data tegra124_soc = { + .configs = tegra124_device_configs, + +/* +* Activity counter is incremented every 256 memory transactions, +* and each transaction takes 4 EMC clocks. +*/ + .count_weight =4 *256 , +}; + +static const struct tegra_devfreq_soc_data tegra30_soc = { + .configs = tegra30_device_configs, + .count_weight =2 *256 , +}; +static const struct of_device_id tegra_devfreq_of_match[] = { - { .compatible ="nvidia,tegra30-actmon" }, - { .compatible ="nvidia,tegra124-actmon" }, + { .compatible ="nvidia,tegra30-actmon" , .data = &tegra30_soc, }, + { .compatible ="nvidia,tegra124-actmon" , .data = &tegra124_soc, }, { }, };
Signature · 1 line
2.27.0
Re: [PATCH v7 46/47] PM / devfreq: tegra30: Separate configurations per-SoC generation
Hi Dmitry,
Quoted 153 lines · Dmitry Osipenko
Previously we were using count-weight of the T124 for T30 in order to get EMC clock rate that was reasonable for T30. In fact the count-weight should be x2 times smaller on T30, but then devfreq was producing a bit too low EMC clock rate for ISO memory clients, like display controller for example.
Now both Tegra ACTMON and Tegra DRM display drivers support interconnect framework and display driver tells to ICC what a minimum memory bandwidth is needed, preventing FIFO underflows. Thus, now we can use a proper count-weight value for Tegra30 and
MC_ALLdevice config needs a bit more aggressive boosting.Add a separate ACTMON driver configuration that is specific to Tegra30.
Tested-by Peter Geis <[email protected]>Tested-by Nicolas Chauvet <[email protected]>Signed-off-by Dmitry Osipenko <[email protected]>--- drivers/devfreq/tegra30-devfreq.c | 68 ++++++++++++++++++++++++------- 1 file changed, 54 insertions(+), 14 deletions(-)drivers/devfreq/tegra30-devfreq.c +50
-12@@ -57,13 +57,6 @@#define ACTMON_BELOW_WMARK_WINDOW 3#define ACTMON_BOOST_FREQ_STEP 16000 -/* -* Activity counter is incremented every 256 memory transactions, and each -* transaction takes 4 EMC clocks for Tegra124; So the COUNT_WEIGHT is -* 4 * 256 = 1024. -*/ -#define ACTMON_COUNT_WEIGHT 0x400 -/* * ACTMON_AVERAGE_WINDOW_LOG2: default value for @DEV_CTRL_K_VAL, which * translates to 2 ^ (K_VAL + 1). ex: 2 ^ (6 + 1) = 128 @@ -111,7 +104,7 @@ enum tegra_actmon_device { MCCPU, }; -static const struct tegra_devfreq_device_config actmon_device_configs[] = { +static const struct tegra_devfreq_device_config tegra124_device_configs[] = { {/* MCALL: All memory accesses (including from the CPUs) */ .offset =0x1c0 ,@@ -133,6 +126,28 @@ static const struct tegra_devfreq_device_config actmon_device_configs[] = { }, }; +static const struct tegra_devfreq_device_config tegra30_device_configs[] = { + { +/* MCALL: All memory accesses (including from the CPUs) */ + .offset =0x1c0 , + .irq_mask =1 <<26 , + .boost_up_coeff =200 , + .boost_down_coeff =50 , + .boost_up_threshold =20 , + .boost_down_threshold =10 , + }, + { +/* MCCPU: memory accesses from the CPUs */ + .offset =0x200 , + .irq_mask =1 <<25 , + .boost_up_coeff =800 , + .boost_down_coeff =40 , + .boost_up_threshold =27 , + .boost_down_threshold =10 , + .avg_dependency_threshold =16000 ,/* 16MHz in kHz units */ + }, +}; +/** * struct tegra_devfreq_device - state specific to an ACTMON device * @@ -155,6 +170,12 @@ struct tegra_devfreq_device {unsigned long target_freq; }; +struct tegra_devfreq_soc_data { +const struct tegra_devfreq_device_config *configs; +/* Weight value for count measurements */ +unsigned int count_weight; +}; +struct tegra_devfreq {struct devfreq *devfreq;struct opp_table *opp_table;@@ -171,11 +192,13 @@ struct tegra_devfreq {struct delayed_work cpufreq_update_work;struct notifier_block cpu_rate_change_nb; -struct tegra_devfreq_device devices[ARRAY_SIZE (actmon_device_configs)]; +struct tegra_devfreq_device devices[2 ];unsigned int irq;bool started; + +const struct tegra_devfreq_soc_data *soc; };struct tegra_actmon_emc_ratio {@@ -488,7 +511,7 @@ static void tegra_actmon_configure_device(struct tegra_devfreq *tegra,tegra_devfreq_update_avg_wmark (tegra, dev);tegra_devfreq_update_wmark (tegra, dev); -device_writel (dev,ACTMON_COUNT_WEIGHT ,ACTMON_DEV_COUNT_WEIGHT ); +device_writel (dev, tegra->soc->count_weight,ACTMON_DEV_COUNT_WEIGHT );device_writel (dev,ACTMON_INTR_STATUS_CLEAR ,ACTMON_DEV_INTR_STATUS ); val |=ACTMON_DEV_CTRL_ENB_PERIODIC ;@@ -787,6 +810,8 @@ static int tegra_devfreq_probe(struct platform_device *pdev)if (!tegra)return -ENOMEM ; + tegra->soc =of_device_get_match_data (&pdev->dev); + tegra->regs =devm_platform_ioremap_resource (pdev,0 );if (IS_ERR (tegra->regs))return PTR_ERR (tegra->regs);@@ -866,9 +891,9 @@ static int tegra_devfreq_probe(struct platform_device *pdev) tegra->max_freq = rate /KHZ ; -for (i =0 ; i <ARRAY_SIZE (actmon_device_configs); i++) { +for (i =0 ; i <ARRAY_SIZE (tegra->devices); i++) { dev = tegra->devices + i; - dev->config = actmon_device_configs + i; + dev->config = tegra->soc->configs + i; dev->regs = tegra->regs + dev->config->offset; }@@ -933,9 +958,24 @@ static int tegra_devfreq_remove(struct platform_device *pdev)return 0 ; } +static const struct tegra_devfreq_soc_data tegra124_soc = { + .configs = tegra124_device_configs, + +/* +* Activity counter is incremented every 256 memory transactions, +* and each transaction takes 4 EMC clocks. +*/ + .count_weight =4 *256 , +}; + +static const struct tegra_devfreq_soc_data tegra30_soc = { + .configs = tegra30_device_configs, + .count_weight =2 *256 ,
drivers/devfreq/tegra30-devfreq.c static int tegra_devfreq_remove(struct platform_device *pdev) · line 981
Quoted 10 lines
drivers/devfreq/tegra30-devfreq.c +4
-2+}; +static const struct of_device_id tegra_devfreq_of_match[] = { - { .compatible ="nvidia,tegra30-actmon" }, - { .compatible ="nvidia,tegra124-actmon" }, + { .compatible ="nvidia,tegra30-actmon" , .data = &tegra30_soc, }, + { .compatible ="nvidia,tegra124-actmon" , .data = &tegra124_soc, }, { }, };
Signature · 3 lines
Best Regards, Chanwoo Choi Samsung Electronics
Dmitry Osipenko
maintainerPATCH v7 47/47 PM / devfreq: tegra20: Deprecate in a favor of emc-stat based driver
In reply to Dmitry OsipenkoRemove tegra20-devfreq in order to replace it with a EMC_STAT based devfreq driver. Previously we were going to use MC_STAT based tegra20-devfreq driver because EMC_STAT wasn't working properly, but now that problem is resolved. This resolves complications imposed by the removed driver since it was depending on both EMC and MC drivers simultaneously.
--- drivers/devfreq/Kconfig | 10 -- drivers/devfreq/Makefile | 1 - drivers/devfreq/tegra20-devfreq.c | 210 ------------------------------ 3 files changed, 221 deletions(-) delete mode 100644 drivers/devfreq/tegra20-devfreq.c
drivers/devfreq/Kconfig +0 -10
@@ -121,16 +121,6 @@ config ARM_TEGRA_DEVFREQ It reads ACTMON counters of memory controllers and adjusts the operating frequencies and voltages with OPP support. -config ARM_TEGRA20_DEVFREQ - tristate "NVIDIA Tegra20 DEVFREQ Driver" - depends on ARCH_TEGRA_2x_SOC || COMPILE_TEST - depends on COMMON_CLK - select DEVFREQ_GOV_SIMPLE_ONDEMAND - help - This adds the DEVFREQ driver for the Tegra20 family of SoCs. - It reads Memory Controller counters and adjusts the operating - frequencies and voltages with OPP support. - config ARM_RK3399_DMC_DEVFREQ tristate "ARM RK3399 DMC DEVFREQ Driver" depends on (ARCH_ROCKCHIP && HAVE_ARM_SMCCC) || \
drivers/devfreq/Makefile +0 -1
@@ -13,7 +13,6 @@ obj-$(CONFIG_ARM_IMX_BUS_DEVFREQ) += imx-bus.o obj-$(CONFIG_ARM_IMX8M_DDRC_DEVFREQ) += imx8m-ddrc.o obj-$(CONFIG_ARM_RK3399_DMC_DEVFREQ) += rk3399_dmc.o obj-$(CONFIG_ARM_TEGRA_DEVFREQ) += tegra30-devfreq.o -obj-$(CONFIG_ARM_TEGRA20_DEVFREQ) += tegra20-devfreq.o # DEVFREQ Event Drivers obj-$(CONFIG_PM_DEVFREQ_EVENT) += event/
drivers/devfreq/tegra20-devfreq.c deleted +0 -210
210 lines not on this page · raw message
Signature · 1 line
2.27.0
Re: [PATCH v7 47/47] PM / devfreq: tegra20: Deprecate in a favor of emc-stat based driver
Hi Dmitry,
You need to update the MAINTAINERS file about tegra20-devfreq.c
11343 MEMORY FREQUENCY SCALING DRIVERS FOR NVIDIA TEGRA
11344 M: Dmitry Osipenko <[email protected]> 11345 L: [email protected] 11346 L: [email protected] 11347 T: git git://git.kernel.org/pub/scm/linux/kernel/git/chanwoo/linux.git 11348 S: Maintained 11349 F: drivers/devfreq/tegra20-devfreq.c 11350 F: drivers/devfreq/tegra30-devfreq.c
Except of missing the updating of MAINTAINERS,
Thanks,
Chanwoo Choi
Quoted 255 lines · Dmitry Osipenko
Remove tegra20-devfreq in order to replace it with a
EMC_STATbased devfreq driver. Previously we were going to useMC_STATbased tegra20-devfreq driver becauseEMC_STATwasn't working properly, but now that problem is resolved. This resolves complications imposed by the removed driver since it was depending on both EMC and MC drivers simultaneously.Signed-off-by Dmitry Osipenko <[email protected]>--- drivers/devfreq/Kconfig | 10 -- drivers/devfreq/Makefile | 1 - drivers/devfreq/tegra20-devfreq.c | 210 ------------------------------ 3 files changed, 221 deletions(-) delete mode 100644 drivers/devfreq/tegra20-devfreq.cdrivers/devfreq/Kconfig +0
-10@@ -121,16 +121,6 @@ config ARM_TEGRA_DEVFREQ It reads ACTMON counters of memory controllers and adjusts the operating frequencies and voltages with OPP support. -config ARM_TEGRA20_DEVFREQ - tristate "NVIDIA Tegra20 DEVFREQ Driver" - depends on ARCH_TEGRA_2x_SOC || COMPILE_TEST - depends on COMMON_CLK - select DEVFREQ_GOV_SIMPLE_ONDEMAND - help - This adds the DEVFREQ driver for the Tegra20 family of SoCs. - It reads Memory Controller counters and adjusts the operating - frequencies and voltages with OPP support. - config ARM_RK3399_DMC_DEVFREQ tristate "ARM RK3399 DMC DEVFREQ Driver" depends on (ARCH_ROCKCHIP && HAVE_ARM_SMCCC) || \drivers/devfreq/Makefile +0
-1@@ -13,7 +13,6 @@ obj-$(CONFIG_ARM_IMX_BUS_DEVFREQ) += imx-bus.o obj-$(CONFIG_ARM_IMX8M_DDRC_DEVFREQ) += imx8m-ddrc.o obj-$(CONFIG_ARM_RK3399_DMC_DEVFREQ) += rk3399_dmc.o obj-$(CONFIG_ARM_TEGRA_DEVFREQ) += tegra30-devfreq.o -obj-$(CONFIG_ARM_TEGRA20_DEVFREQ) += tegra20-devfreq.o # DEVFREQ Event Drivers obj-$(CONFIG_PM_DEVFREQ_EVENT) += event/drivers/devfreq/tegra20-devfreq.c deleted +0
-200@@ -1,210 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* -* NVIDIA Tegra20 devfreq driver -* -* Copyright (C) 2019 GRATE-DRIVER project -*/ - -#include <linux/clk.h> -#include <linux/devfreq.h> -#include <linux/io.h> -#include <linux/kernel.h> -#include <linux/module.h> -#include <linux/of_device.h> -#include <linux/platform_device.h> -#include <linux/pm_opp.h> -#include <linux/slab.h> - -#include <soc/tegra/mc.h> - -#include "governor.h" - -#define MC_STAT_CONTROL 0x90 -#define MC_STAT_EMC_CLOCK_LIMIT 0xa0 -#define MC_STAT_EMC_CLOCKS 0xa4 -#define MC_STAT_EMC_CONTROL 0xa8 -#define MC_STAT_EMC_COUNT 0xb8 - -#define EMC_GATHER_CLEAR (1 << 8) -#define EMC_GATHER_ENABLE (3 << 8) - -struct tegra_devfreq { -struct devfreq *devfreq; -struct clk *emc_clock; -void __iomem *regs; -}; - -static int tegra_devfreq_target (struct device *dev,unsigned long *freq, -u32 flags) -{ -struct tegra_devfreq *tegra =dev_get_drvdata (dev); -struct devfreq *devfreq = tegra->devfreq; -struct dev_pm_opp *opp; -unsigned long rate; -int err; - - opp =devfreq_recommended_opp (dev, freq, flags); -if (IS_ERR (opp)) -return PTR_ERR (opp); - - rate =dev_pm_opp_get_freq (opp); -dev_pm_opp_put (opp); - - err =clk_set_min_rate (tegra->emc_clock, rate); -if (err) -return err; - - err =clk_set_rate (tegra->emc_clock,0 ); -if (err) - goto restore_min_rate; - -return 0 ; - -restore_min_rate: -clk_set_min_rate (tegra->emc_clock, devfreq->previous_freq); - -return err; -} - -static int tegra_devfreq_get_dev_status (struct device *dev, -struct devfreq_dev_status *stat) -{ -struct tegra_devfreq *tegra =dev_get_drvdata (dev); - -/* -* EMC_COUNT returns number of memory events, that number is lower -* than the number of clocks. Conversion ratio of 1/8 results in a -* bit higher bandwidth than actually needed, it is good enough for -* the time being because drivers don't support requesting minimum -* needed memory bandwidth yet. -* -* TODO: adjust the ratio value once relevant drivers will support -* memory bandwidth management. -*/ - stat->busy_time =readl_relaxed (tegra->regs +MC_STAT_EMC_COUNT ); - stat->total_time =readl_relaxed (tegra->regs +MC_STAT_EMC_CLOCKS ) /8 ; - stat->current_frequency =clk_get_rate (tegra->emc_clock); - -writel_relaxed (EMC_GATHER_CLEAR , tegra->regs +MC_STAT_CONTROL ); -writel_relaxed (EMC_GATHER_ENABLE , tegra->regs +MC_STAT_CONTROL ); - -return 0 ; -} - -static struct devfreq_dev_profile tegra_devfreq_profile = { - .polling_ms =500 , - .target = tegra_devfreq_target, - .get_dev_status = tegra_devfreq_get_dev_status, -}; - -static struct tegra_mc *tegra_get_memory_controller (void ) -{ -struct platform_device *pdev; -struct device_node *np; -struct tegra_mc *mc; - - np =of_find_compatible_node (NULL ,NULL ,"nvidia,tegra20-mc-gart" ); -if (!np) -return ERR_PTR (-ENOENT ); - - pdev =of_find_device_by_node (np); -of_node_put (np); -if (!pdev) -return ERR_PTR (-ENODEV ); - - mc =platform_get_drvdata (pdev); -if (!mc) -return ERR_PTR (-EPROBE_DEFER ); - -return mc; -} - -static int tegra_devfreq_probe (struct platform_device *pdev) -{ -struct tegra_devfreq *tegra; -struct tegra_mc *mc; -unsigned long max_rate; -unsigned long rate; -int err; - - mc =tegra_get_memory_controller (); -if (IS_ERR (mc)) { - err =PTR_ERR (mc); -dev_err (&pdev->dev,"failed to get memory controller: %d\n" , - err); -return err; - } - - tegra =devm_kzalloc (&pdev->dev,sizeof (*tegra),GFP_KERNEL ); -if (!tegra) -return -ENOMEM ; - -/* EMC is a system-critical clock that is always enabled */ - tegra->emc_clock =devm_clk_get (&pdev->dev,"emc" ); -if (IS_ERR (tegra->emc_clock)) -return dev_err_probe (&pdev->dev,PTR_ERR (tegra->emc_clock), -"failed to get emc clock\n" ); - - tegra->regs = mc->regs; - - max_rate =clk_round_rate (tegra->emc_clock,ULONG_MAX ); - -for (rate =0 ; rate <= max_rate; rate++) { - rate =clk_round_rate (tegra->emc_clock, rate); - - err =dev_pm_opp_add (&pdev->dev, rate,0 ); -if (err) { -dev_err (&pdev->dev,"failed to add opp: %d\n" , err); - goto remove_opps; - } - } - -/* -* Reset statistic gathers state, select global bandwidth for the -* statistics collection mode and set clocks counter saturation -* limit to maximum. -*/ -writel_relaxed (0x00000000 , tegra->regs +MC_STAT_CONTROL ); -writel_relaxed (0x00000000 , tegra->regs +MC_STAT_EMC_CONTROL ); -writel_relaxed (0xffffffff , tegra->regs +MC_STAT_EMC_CLOCK_LIMIT ); - -platform_set_drvdata (pdev, tegra); - - tegra->devfreq =devfreq_add_device (&pdev->dev, &tegra_devfreq_profile, -DEVFREQ_GOV_SIMPLE_ONDEMAND ,NULL ); -if (IS_ERR (tegra->devfreq)) { - err =PTR_ERR (tegra->devfreq); - goto remove_opps; - } - -return 0 ; - -remove_opps: -dev_pm_opp_remove_all_dynamic (&pdev->dev); - -return err; -} - -static int tegra_devfreq_remove (struct platform_device *pdev) -{ -struct tegra_devfreq *tegra =platform_get_drvdata (pdev); - -devfreq_remove_device (tegra->devfreq); -dev_pm_opp_remove_all_dynamic (&pdev->dev); - -return 0 ; -} - -static struct platform_driver tegra_devfreq_driver = { - .probe = tegra_devfreq_probe, - .remove = tegra_devfreq_remove,
drivers/devfreq/tegra20-devfreq.c line 210
Quoted 10 lines
drivers/devfreq/tegra20-devfreq.c deleted +0
-10- .driver = { - .name = "tegra20-devfreq", - }, -}; -module_platform_driver (tegra_devfreq_driver); - -MODULE_ALIAS ("platform:tegra20-devfreq" ); -MODULE_AUTHOR ("Dmitry Osipenko <[email protected]>" ); -MODULE_DESCRIPTION ("NVIDIA Tegra20 devfreq driver" ); -MODULE_LICENSE ("GPL v2" );
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
Dmitry Osipenko
maintainerRe: [PATCH v7 47/47] PM / devfreq: tegra20: Deprecate in a favor of emc-stat based driver
05.11.2020 05:25, Chanwoo Choi пишет:
Quoted 13 lines
Hi Dmitry,
You need to update the
MAINTAINERSfile abouttegra20-devfreq.c11343 MEMORY FREQUENCY SCALING DRIVERS FOR NVIDIA TEGRA
11344 M: Dmitry Osipenko <[email protected]> 11345 L: [email protected] 11346 L: [email protected] 11347 T: git git://git.kernel.org/pub/scm/linux/kernel/git/chanwoo/linux.git 11348 S: Maintained 11349 F: drivers/devfreq/tegra20-devfreq.c 11350 F: drivers/devfreq/tegra30-devfreq.c
Quoted 2 lines
Except of missing the updating of
MAINTAINERS,Acked-by Chanwoo Choi <[email protected]>
Hello Chanwoo,
Good catch! Thank you!