Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'memory-controller-drv-tegra-5.14-2' of https://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux-mem-ctrl into arm/drivers

Memory controller drivers for v5.14 - Tegra SoC, part two

Second set of changes for Tegra SoC memory controller drivers,
containing patchset from Thierry Reding:

"The goal here is to avoid early identity mappings altogether and instead
postpone the need for the identity mappings to when devices are attached
to the SMMU. This works by making the SMMU driver coordinate with the
memory controller driver on when to start enforcing SMMU translations.
This makes Tegra behave in a more standard way and pushes the code to
deal with the Tegra-specific programming into the NVIDIA SMMU
implementation."

This pulls a dependency from Will Deacon (ARM SMMU driver) and contains
further ARM SMMU driver patches to resolve complex dependencies between
different patchsets. The pull from Will contains only one patch
("Implement ->probe_finalize()"). Further work in Will's tree might
depend on this patch, therefore patch was applied there.

On the other hand, this ("Implement ->probe_finalize()") patch is also a
dependency for ARM SMMU driver changes for Tegra. These changes,
bringing seamless transition from the firmware framebuffer to the OS
framebuffer, depend on earlier Tegra memory controller driver patches.

* tag 'memory-controller-drv-tegra-5.14-2' of https://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux-mem-ctrl: (37 commits)
iommu/arm-smmu: Use Tegra implementation on Tegra186
iommu/arm-smmu: tegra: Implement SID override programming
iommu/arm-smmu: tegra: Detect number of instances at runtime
dt-bindings: arm-smmu: Add Tegra186 compatible string
memory: tegra: Delete dead debugfs checking code
iommu/arm-smmu: Implement ->probe_finalize()
memory: tegra: Implement SID override programming
memory: tegra: Split Tegra194 data into separate file
memory: tegra: Add memory client IDs to tables
memory: tegra: Unify drivers
memory: tegra: Only initialize reset controller if available
memory: tegra: Make IRQ support opitonal
memory: tegra: Parameterize interrupt handler
memory: tegra: Extract setup code into callback
memory: tegra: Make per-SoC setup more generic
memory: tegra: Push suspend/resume into SoC drivers
memory: tegra: Introduce struct tegra_mc_ops
memory: tegra: Unify struct tegra_mc across SoC generations
memory: tegra: Consolidate register fields
memory: tegra30-emc: Use devm_tegra_core_dev_init_opp_table()
...

Link: https://lore.kernel.org/r/20210614195200.21657-1-krzysztof.kozlowski@canonical.com
Signed-off-by: Olof Johansson <olof@lixom.net>

+6013 -4362
+9 -2
Documentation/devicetree/bindings/iommu/arm,smmu.yaml
··· 54 54 - const: arm,mmu-500 55 55 - description: NVIDIA SoCs that program two ARM MMU-500s identically 56 56 items: 57 + - description: NVIDIA SoCs that require memory controller interaction 58 + and may program multiple ARM MMU-500s identically with the memory 59 + controller interleaving translations between multiple instances 60 + for improved performance. 61 + items: 57 62 - enum: 58 - - nvidia,tegra194-smmu 63 + - const: nvidia,tegra194-smmu 64 + - const: nvidia,tegra186-smmu 59 65 - const: nvidia,smmu-500 60 66 - items: 61 67 - const: arm,mmu-500 ··· 171 165 contains: 172 166 enum: 173 167 - nvidia,tegra194-smmu 168 + - nvidia,tegra186-smmu 174 169 then: 175 170 properties: 176 171 reg: 177 - minItems: 2 172 + minItems: 1 178 173 maxItems: 2 179 174 else: 180 175 properties:
+47 -33
drivers/clk/tegra/clk-periph-gate.c
··· 48 48 return state; 49 49 } 50 50 51 - static int clk_periph_enable(struct clk_hw *hw) 51 + static void clk_periph_enable_locked(struct clk_hw *hw) 52 52 { 53 53 struct tegra_clk_periph_gate *gate = to_clk_periph_gate(hw); 54 - unsigned long flags = 0; 55 - 56 - spin_lock_irqsave(&periph_ref_lock, flags); 57 - 58 - gate->enable_refcnt[gate->clk_num]++; 59 - if (gate->enable_refcnt[gate->clk_num] > 1) { 60 - spin_unlock_irqrestore(&periph_ref_lock, flags); 61 - return 0; 62 - } 63 54 64 55 write_enb_set(periph_clk_to_bit(gate), gate); 65 56 udelay(2); 66 - 67 - if (!(gate->flags & TEGRA_PERIPH_NO_RESET) && 68 - !(gate->flags & TEGRA_PERIPH_MANUAL_RESET)) { 69 - if (read_rst(gate) & periph_clk_to_bit(gate)) { 70 - udelay(5); /* reset propogation delay */ 71 - write_rst_clr(periph_clk_to_bit(gate), gate); 72 - } 73 - } 74 57 75 58 if (gate->flags & TEGRA_PERIPH_WAR_1005168) { 76 59 writel_relaxed(0, gate->clk_base + LVL2_CLK_GATE_OVRE); ··· 61 78 udelay(1); 62 79 writel_relaxed(0, gate->clk_base + LVL2_CLK_GATE_OVRE); 63 80 } 81 + } 82 + 83 + static void clk_periph_disable_locked(struct clk_hw *hw) 84 + { 85 + struct tegra_clk_periph_gate *gate = to_clk_periph_gate(hw); 86 + 87 + /* 88 + * If peripheral is in the APB bus then read the APB bus to 89 + * flush the write operation in apb bus. This will avoid the 90 + * peripheral access after disabling clock 91 + */ 92 + if (gate->flags & TEGRA_PERIPH_ON_APB) 93 + tegra_read_chipid(); 94 + 95 + write_enb_clr(periph_clk_to_bit(gate), gate); 96 + } 97 + 98 + static int clk_periph_enable(struct clk_hw *hw) 99 + { 100 + struct tegra_clk_periph_gate *gate = to_clk_periph_gate(hw); 101 + unsigned long flags = 0; 102 + 103 + spin_lock_irqsave(&periph_ref_lock, flags); 104 + 105 + if (!gate->enable_refcnt[gate->clk_num]++) 106 + clk_periph_enable_locked(hw); 64 107 65 108 spin_unlock_irqrestore(&periph_ref_lock, flags); 66 109 ··· 100 91 101 92 spin_lock_irqsave(&periph_ref_lock, flags); 102 93 103 - gate->enable_refcnt[gate->clk_num]--; 104 - if (gate->enable_refcnt[gate->clk_num] > 0) { 105 - spin_unlock_irqrestore(&periph_ref_lock, flags); 106 - return; 107 - } 94 + WARN_ON(!gate->enable_refcnt[gate->clk_num]); 95 + 96 + if (--gate->enable_refcnt[gate->clk_num] == 0) 97 + clk_periph_disable_locked(hw); 98 + 99 + spin_unlock_irqrestore(&periph_ref_lock, flags); 100 + } 101 + 102 + static void clk_periph_disable_unused(struct clk_hw *hw) 103 + { 104 + struct tegra_clk_periph_gate *gate = to_clk_periph_gate(hw); 105 + unsigned long flags = 0; 106 + 107 + spin_lock_irqsave(&periph_ref_lock, flags); 108 108 109 109 /* 110 - * If peripheral is in the APB bus then read the APB bus to 111 - * flush the write operation in apb bus. This will avoid the 112 - * peripheral access after disabling clock 110 + * Some clocks are duplicated and some of them are marked as critical, 111 + * like fuse and fuse_burn for example, thus the enable_refcnt will 112 + * be non-zero here if the "unused" duplicate is disabled by CCF. 113 113 */ 114 - if (gate->flags & TEGRA_PERIPH_ON_APB) 115 - tegra_read_chipid(); 116 - 117 - write_enb_clr(periph_clk_to_bit(gate), gate); 114 + if (!gate->enable_refcnt[gate->clk_num]) 115 + clk_periph_disable_locked(hw); 118 116 119 117 spin_unlock_irqrestore(&periph_ref_lock, flags); 120 118 } ··· 130 114 .is_enabled = clk_periph_is_enabled, 131 115 .enable = clk_periph_enable, 132 116 .disable = clk_periph_disable, 117 + .disable_unused = clk_periph_disable_unused, 133 118 }; 134 119 135 120 struct clk *tegra_clk_register_periph_gate(const char *name, ··· 164 147 gate->flags = gate_flags; 165 148 gate->enable_refcnt = enable_refcnt; 166 149 gate->regs = pregs; 167 - 168 - if (read_enb(gate) & periph_clk_to_bit(gate)) 169 - enable_refcnt[clk_num]++; 170 150 171 151 /* Data in .init is copied by clk_register(), so stack variable OK */ 172 152 gate->hw.init = &init;
+11
drivers/clk/tegra/clk-periph.c
··· 100 100 gate_ops->disable(gate_hw); 101 101 } 102 102 103 + static void clk_periph_disable_unused(struct clk_hw *hw) 104 + { 105 + struct tegra_clk_periph *periph = to_clk_periph(hw); 106 + const struct clk_ops *gate_ops = periph->gate_ops; 107 + struct clk_hw *gate_hw = &periph->gate.hw; 108 + 109 + gate_ops->disable_unused(gate_hw); 110 + } 111 + 103 112 static void clk_periph_restore_context(struct clk_hw *hw) 104 113 { 105 114 struct tegra_clk_periph *periph = to_clk_periph(hw); ··· 135 126 .is_enabled = clk_periph_is_enabled, 136 127 .enable = clk_periph_enable, 137 128 .disable = clk_periph_disable, 129 + .disable_unused = clk_periph_disable_unused, 138 130 .restore_context = clk_periph_restore_context, 139 131 }; 140 132 ··· 145 135 .is_enabled = clk_periph_is_enabled, 146 136 .enable = clk_periph_enable, 147 137 .disable = clk_periph_disable, 138 + .disable_unused = clk_periph_disable_unused, 148 139 .restore_context = clk_periph_restore_context, 149 140 }; 150 141
+7 -5
drivers/clk/tegra/clk-pll.c
··· 558 558 u32 p_div = 0; 559 559 int ret; 560 560 561 + if (!rate) 562 + return -EINVAL; 563 + 561 564 switch (parent_rate) { 562 565 case 12000000: 563 566 case 26000000: ··· 1134 1131 if (pll->lock) 1135 1132 spin_lock_irqsave(pll->lock, flags); 1136 1133 1137 - _clk_pll_enable(hw); 1134 + if (!clk_pll_is_enabled(hw)) 1135 + _clk_pll_enable(hw); 1138 1136 1139 1137 ret = clk_pll_wait_for_lock(pll); 1140 1138 if (ret < 0) ··· 1752 1748 return -EINVAL; 1753 1749 } 1754 1750 1755 - if (clk_pll_is_enabled(hw)) 1756 - return 0; 1757 - 1758 1751 input_rate = clk_hw_get_rate(__clk_get_hw(osc)); 1759 1752 1760 1753 if (pll->lock) 1761 1754 spin_lock_irqsave(pll->lock, flags); 1762 1755 1763 - _clk_pll_enable(hw); 1756 + if (!clk_pll_is_enabled(hw)) 1757 + _clk_pll_enable(hw); 1764 1758 1765 1759 ret = clk_pll_wait_for_lock(pll); 1766 1760 if (ret < 0)
+3 -3
drivers/clk/tegra/clk-tegra-periph.c
··· 712 712 MUX8("ndflash", mux_pllp_pllc2_c_c3_pllm_clkm, CLK_SOURCE_NDFLASH, 13, TEGRA_PERIPH_ON_APB, tegra_clk_ndflash_8), 713 713 MUX8("ndspeed", mux_pllp_pllc2_c_c3_pllm_clkm, CLK_SOURCE_NDSPEED, 80, TEGRA_PERIPH_ON_APB, tegra_clk_ndspeed_8), 714 714 MUX8("hdmi", mux_pllp_pllm_plld_plla_pllc_plld2_clkm, CLK_SOURCE_HDMI, 51, 0, tegra_clk_hdmi), 715 - MUX8("extern1", mux_plla_clk32_pllp_clkm_plle, CLK_SOURCE_EXTERN1, 120, 0, tegra_clk_extern1), 716 - MUX8("extern2", mux_plla_clk32_pllp_clkm_plle, CLK_SOURCE_EXTERN2, 121, 0, tegra_clk_extern2), 717 - MUX8("extern3", mux_plla_clk32_pllp_clkm_plle, CLK_SOURCE_EXTERN3, 122, 0, tegra_clk_extern3), 715 + MUX8("extern1", mux_plla_clk32_pllp_clkm_plle, CLK_SOURCE_EXTERN1, 120, TEGRA_PERIPH_NO_RESET, tegra_clk_extern1), 716 + MUX8("extern2", mux_plla_clk32_pllp_clkm_plle, CLK_SOURCE_EXTERN2, 121, TEGRA_PERIPH_NO_RESET, tegra_clk_extern2), 717 + MUX8("extern3", mux_plla_clk32_pllp_clkm_plle, CLK_SOURCE_EXTERN3, 122, TEGRA_PERIPH_NO_RESET, tegra_clk_extern3), 718 718 MUX8("soc_therm", mux_pllm_pllc_pllp_plla, CLK_SOURCE_SOC_THERM, 78, TEGRA_PERIPH_ON_APB, tegra_clk_soc_therm), 719 719 MUX8("soc_therm", mux_clkm_pllc_pllp_plla, CLK_SOURCE_SOC_THERM, 78, TEGRA_PERIPH_ON_APB, tegra_clk_soc_therm_8), 720 720 MUX8("vi_sensor", mux_pllm_pllc2_c_c3_pllp_plla, CLK_SOURCE_VI_SENSOR, 164, TEGRA_PERIPH_NO_RESET, tegra_clk_vi_sensor_8),
+15 -3
drivers/clk/tegra/clk-tegra-super-cclk.c
··· 25 25 26 26 #define SUPER_CDIV_ENB BIT(31) 27 27 28 + #define TSENSOR_SLOWDOWN BIT(23) 29 + 28 30 static struct tegra_clk_super_mux *cclk_super; 29 31 static bool cclk_on_pllx; 30 32 ··· 49 47 static unsigned long cclk_super_recalc_rate(struct clk_hw *hw, 50 48 unsigned long parent_rate) 51 49 { 52 - if (cclk_super_get_parent(hw) == PLLX_INDEX) 53 - return parent_rate; 50 + struct tegra_clk_super_mux *super = to_clk_super_mux(hw); 51 + u32 val = readl_relaxed(super->reg); 52 + unsigned int div2; 54 53 55 - return tegra_clk_super_ops.recalc_rate(hw, parent_rate); 54 + /* check whether thermal throttling is active */ 55 + if (val & TSENSOR_SLOWDOWN) 56 + div2 = 1; 57 + else 58 + div2 = 0; 59 + 60 + if (cclk_super_get_parent(hw) == PLLX_INDEX) 61 + return parent_rate >> div2; 62 + 63 + return tegra_clk_super_ops.recalc_rate(hw, parent_rate) >> div2; 56 64 } 57 65 58 66 static int cclk_super_determine_rate(struct clk_hw *hw,
+3 -3
drivers/clk/tegra/clk-tegra20.c
··· 1021 1021 { TEGRA20_CLK_PLL_P_OUT3, TEGRA20_CLK_CLK_MAX, 72000000, 1 }, 1022 1022 { TEGRA20_CLK_PLL_P_OUT4, TEGRA20_CLK_CLK_MAX, 24000000, 1 }, 1023 1023 { TEGRA20_CLK_PLL_C, TEGRA20_CLK_CLK_MAX, 600000000, 0 }, 1024 - { TEGRA20_CLK_PLL_C_OUT1, TEGRA20_CLK_CLK_MAX, 240000000, 0 }, 1025 - { TEGRA20_CLK_SCLK, TEGRA20_CLK_PLL_C_OUT1, 240000000, 0 }, 1026 - { TEGRA20_CLK_HCLK, TEGRA20_CLK_CLK_MAX, 240000000, 0 }, 1024 + { TEGRA20_CLK_PLL_C_OUT1, TEGRA20_CLK_CLK_MAX, 120000000, 0 }, 1025 + { TEGRA20_CLK_SCLK, TEGRA20_CLK_PLL_C_OUT1, 120000000, 0 }, 1026 + { TEGRA20_CLK_HCLK, TEGRA20_CLK_CLK_MAX, 120000000, 0 }, 1027 1027 { TEGRA20_CLK_PCLK, TEGRA20_CLK_CLK_MAX, 60000000, 0 }, 1028 1028 { TEGRA20_CLK_CSITE, TEGRA20_CLK_CLK_MAX, 0, 1 }, 1029 1029 { TEGRA20_CLK_CCLK, TEGRA20_CLK_CLK_MAX, 0, 1 },
+3 -3
drivers/clk/tegra/clk-tegra30.c
··· 930 930 /* CCLKG */ 931 931 clk = tegra_clk_register_super_cclk("cclk_g", cclk_g_parents, 932 932 ARRAY_SIZE(cclk_g_parents), 933 - CLK_SET_RATE_PARENT, 933 + CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE, 934 934 clk_base + CCLKG_BURST_POLICY, 935 935 0, NULL); 936 936 clks[TEGRA30_CLK_CCLK_G] = clk; ··· 1006 1006 TEGRA_INIT_DATA_MUX("dam0", mux_pllacp_clkm, CLK_SOURCE_DAM0, 108, 0, TEGRA30_CLK_DAM0), 1007 1007 TEGRA_INIT_DATA_MUX("dam1", mux_pllacp_clkm, CLK_SOURCE_DAM1, 109, 0, TEGRA30_CLK_DAM1), 1008 1008 TEGRA_INIT_DATA_MUX("dam2", mux_pllacp_clkm, CLK_SOURCE_DAM2, 110, 0, TEGRA30_CLK_DAM2), 1009 - TEGRA_INIT_DATA_INT("3d2", mux_pllmcpa, CLK_SOURCE_3D2, 98, TEGRA_PERIPH_MANUAL_RESET, TEGRA30_CLK_GR3D2), 1009 + TEGRA_INIT_DATA_INT("3d2", mux_pllmcpa, CLK_SOURCE_3D2, 98, 0, TEGRA30_CLK_GR3D2), 1010 1010 TEGRA_INIT_DATA_INT("se", mux_pllpcm_clkm, CLK_SOURCE_SE, 127, 0, TEGRA30_CLK_SE), 1011 1011 TEGRA_INIT_DATA_MUX8("hdmi", mux_pllpmdacd2_clkm, CLK_SOURCE_HDMI, 51, 0, TEGRA30_CLK_HDMI), 1012 1012 TEGRA_INIT_DATA("pwm", NULL, NULL, pwm_parents, CLK_SOURCE_PWM, 28, 2, 0, 0, 8, 1, 0, 17, TEGRA_PERIPH_ON_APB, TEGRA30_CLK_PWM), ··· 1245 1245 { TEGRA30_CLK_GR3D, TEGRA30_CLK_PLL_C, 300000000, 0 }, 1246 1246 { TEGRA30_CLK_GR3D2, TEGRA30_CLK_PLL_C, 300000000, 0 }, 1247 1247 { TEGRA30_CLK_PLL_U, TEGRA30_CLK_CLK_MAX, 480000000, 0 }, 1248 - { TEGRA30_CLK_VDE, TEGRA30_CLK_PLL_C, 600000000, 0 }, 1248 + { TEGRA30_CLK_VDE, TEGRA30_CLK_PLL_C, 300000000, 0 }, 1249 1249 { TEGRA30_CLK_SPDIF_IN_SYNC, TEGRA30_CLK_CLK_MAX, 24000000, 0 }, 1250 1250 { TEGRA30_CLK_I2S0_SYNC, TEGRA30_CLK_CLK_MAX, 24000000, 0 }, 1251 1251 { TEGRA30_CLK_I2S1_SYNC, TEGRA30_CLK_CLK_MAX, 24000000, 0 },
-4
drivers/clk/tegra/clk.h
··· 553 553 * Flags: 554 554 * TEGRA_PERIPH_NO_RESET - This flag indicates that reset is not allowed 555 555 * for this module. 556 - * TEGRA_PERIPH_MANUAL_RESET - This flag indicates not to reset module 557 - * after clock enable and driver for the module is responsible for 558 - * doing reset. 559 556 * TEGRA_PERIPH_ON_APB - If peripheral is in the APB bus then read the 560 557 * bus to flush the write operation in apb bus. This flag indicates 561 558 * that this peripheral is in apb bus. ··· 574 577 #define TEGRA_CLK_PERIPH_GATE_MAGIC 0x17760309 575 578 576 579 #define TEGRA_PERIPH_NO_RESET BIT(0) 577 - #define TEGRA_PERIPH_MANUAL_RESET BIT(1) 578 580 #define TEGRA_PERIPH_ON_APB BIT(2) 579 581 #define TEGRA_PERIPH_WAR_1005168 BIT(3) 580 582 #define TEGRA_PERIPH_NO_DIV BIT(4)
+2 -1
drivers/iommu/arm/arm-smmu/arm-smmu-impl.c
··· 211 211 if (of_property_read_bool(np, "calxeda,smmu-secure-config-access")) 212 212 smmu->impl = &calxeda_impl; 213 213 214 - if (of_device_is_compatible(np, "nvidia,tegra194-smmu")) 214 + if (of_device_is_compatible(np, "nvidia,tegra194-smmu") || 215 + of_device_is_compatible(np, "nvidia,tegra186-smmu")) 215 216 return nvidia_smmu_impl_init(smmu); 216 217 217 218 smmu = qcom_smmu_impl_init(smmu);
+71 -19
drivers/iommu/arm/arm-smmu/arm-smmu-nvidia.c
··· 7 7 #include <linux/platform_device.h> 8 8 #include <linux/slab.h> 9 9 10 + #include <soc/tegra/mc.h> 11 + 10 12 #include "arm-smmu.h" 11 13 12 14 /* ··· 17 15 * interleaved IOVA accesses across them and translates accesses from 18 16 * non-isochronous HW devices. 19 17 * Third one is used for translating accesses from isochronous HW devices. 18 + * 19 + * In addition, the SMMU driver needs to coordinate with the memory controller 20 + * driver to ensure that the right SID override is programmed for any given 21 + * memory client. This is necessary to allow for use-case such as seamlessly 22 + * handing over the display controller configuration from the firmware to the 23 + * kernel. 24 + * 20 25 * This implementation supports programming of the two instances that must 21 - * be programmed identically. 22 - * The third instance usage is through standard arm-smmu driver itself and 23 - * is out of scope of this implementation. 26 + * be programmed identically and takes care of invoking the memory controller 27 + * driver for SID override programming after devices have been attached to an 28 + * SMMU instance. 24 29 */ 25 - #define NUM_SMMU_INSTANCES 2 30 + #define MAX_SMMU_INSTANCES 2 26 31 27 32 struct nvidia_smmu { 28 - struct arm_smmu_device smmu; 29 - void __iomem *bases[NUM_SMMU_INSTANCES]; 33 + struct arm_smmu_device smmu; 34 + void __iomem *bases[MAX_SMMU_INSTANCES]; 35 + unsigned int num_instances; 36 + struct tegra_mc *mc; 30 37 }; 38 + 39 + static inline struct nvidia_smmu *to_nvidia_smmu(struct arm_smmu_device *smmu) 40 + { 41 + return container_of(smmu, struct nvidia_smmu, smmu); 42 + } 31 43 32 44 static inline void __iomem *nvidia_smmu_page(struct arm_smmu_device *smmu, 33 45 unsigned int inst, int page) ··· 63 47 static void nvidia_smmu_write_reg(struct arm_smmu_device *smmu, 64 48 int page, int offset, u32 val) 65 49 { 50 + struct nvidia_smmu *nvidia = to_nvidia_smmu(smmu); 66 51 unsigned int i; 67 52 68 - for (i = 0; i < NUM_SMMU_INSTANCES; i++) { 53 + for (i = 0; i < nvidia->num_instances; i++) { 69 54 void __iomem *reg = nvidia_smmu_page(smmu, i, page) + offset; 70 55 71 56 writel_relaxed(val, reg); ··· 84 67 static void nvidia_smmu_write_reg64(struct arm_smmu_device *smmu, 85 68 int page, int offset, u64 val) 86 69 { 70 + struct nvidia_smmu *nvidia = to_nvidia_smmu(smmu); 87 71 unsigned int i; 88 72 89 - for (i = 0; i < NUM_SMMU_INSTANCES; i++) { 73 + for (i = 0; i < nvidia->num_instances; i++) { 90 74 void __iomem *reg = nvidia_smmu_page(smmu, i, page) + offset; 91 75 92 76 writeq_relaxed(val, reg); ··· 97 79 static void nvidia_smmu_tlb_sync(struct arm_smmu_device *smmu, int page, 98 80 int sync, int status) 99 81 { 82 + struct nvidia_smmu *nvidia = to_nvidia_smmu(smmu); 100 83 unsigned int delay; 101 84 102 85 arm_smmu_writel(smmu, page, sync, 0); ··· 109 90 u32 val = 0; 110 91 unsigned int i; 111 92 112 - for (i = 0; i < NUM_SMMU_INSTANCES; i++) { 93 + for (i = 0; i < nvidia->num_instances; i++) { 113 94 void __iomem *reg; 114 95 115 96 reg = nvidia_smmu_page(smmu, i, page) + status; ··· 131 112 132 113 static int nvidia_smmu_reset(struct arm_smmu_device *smmu) 133 114 { 115 + struct nvidia_smmu *nvidia = to_nvidia_smmu(smmu); 134 116 unsigned int i; 135 117 136 - for (i = 0; i < NUM_SMMU_INSTANCES; i++) { 118 + for (i = 0; i < nvidia->num_instances; i++) { 137 119 u32 val; 138 120 void __iomem *reg = nvidia_smmu_page(smmu, i, ARM_SMMU_GR0) + 139 121 ARM_SMMU_GR0_sGFSR; ··· 177 157 unsigned int inst; 178 158 irqreturn_t ret = IRQ_NONE; 179 159 struct arm_smmu_device *smmu = dev; 160 + struct nvidia_smmu *nvidia = to_nvidia_smmu(smmu); 180 161 181 - for (inst = 0; inst < NUM_SMMU_INSTANCES; inst++) { 162 + for (inst = 0; inst < nvidia->num_instances; inst++) { 182 163 irqreturn_t irq_ret; 183 164 184 165 irq_ret = nvidia_smmu_global_fault_inst(irq, smmu, inst); ··· 223 202 struct arm_smmu_device *smmu; 224 203 struct iommu_domain *domain = dev; 225 204 struct arm_smmu_domain *smmu_domain; 205 + struct nvidia_smmu *nvidia; 226 206 227 207 smmu_domain = container_of(domain, struct arm_smmu_domain, domain); 228 208 smmu = smmu_domain->smmu; 209 + nvidia = to_nvidia_smmu(smmu); 229 210 230 - for (inst = 0; inst < NUM_SMMU_INSTANCES; inst++) { 211 + for (inst = 0; inst < nvidia->num_instances; inst++) { 231 212 irqreturn_t irq_ret; 232 213 233 214 /* ··· 247 224 return ret; 248 225 } 249 226 227 + static void nvidia_smmu_probe_finalize(struct arm_smmu_device *smmu, struct device *dev) 228 + { 229 + struct nvidia_smmu *nvidia = to_nvidia_smmu(smmu); 230 + int err; 231 + 232 + err = tegra_mc_probe_device(nvidia->mc, dev); 233 + if (err < 0) 234 + dev_err(smmu->dev, "memory controller probe failed for %s: %d\n", 235 + dev_name(dev), err); 236 + } 237 + 250 238 static const struct arm_smmu_impl nvidia_smmu_impl = { 251 239 .read_reg = nvidia_smmu_read_reg, 252 240 .write_reg = nvidia_smmu_write_reg, ··· 267 233 .tlb_sync = nvidia_smmu_tlb_sync, 268 234 .global_fault = nvidia_smmu_global_fault, 269 235 .context_fault = nvidia_smmu_context_fault, 236 + .probe_finalize = nvidia_smmu_probe_finalize, 237 + }; 238 + 239 + static const struct arm_smmu_impl nvidia_smmu_single_impl = { 240 + .probe_finalize = nvidia_smmu_probe_finalize, 270 241 }; 271 242 272 243 struct arm_smmu_device *nvidia_smmu_impl_init(struct arm_smmu_device *smmu) ··· 280 241 struct device *dev = smmu->dev; 281 242 struct nvidia_smmu *nvidia_smmu; 282 243 struct platform_device *pdev = to_platform_device(dev); 244 + unsigned int i; 283 245 284 246 nvidia_smmu = devm_krealloc(dev, smmu, sizeof(*nvidia_smmu), GFP_KERNEL); 285 247 if (!nvidia_smmu) 286 248 return ERR_PTR(-ENOMEM); 287 249 250 + nvidia_smmu->mc = devm_tegra_memory_controller_get(dev); 251 + if (IS_ERR(nvidia_smmu->mc)) 252 + return ERR_CAST(nvidia_smmu->mc); 253 + 288 254 /* Instance 0 is ioremapped by arm-smmu.c. */ 289 255 nvidia_smmu->bases[0] = smmu->base; 256 + nvidia_smmu->num_instances++; 290 257 291 - res = platform_get_resource(pdev, IORESOURCE_MEM, 1); 292 - if (!res) 293 - return ERR_PTR(-ENODEV); 258 + for (i = 1; i < MAX_SMMU_INSTANCES; i++) { 259 + res = platform_get_resource(pdev, IORESOURCE_MEM, i); 260 + if (!res) 261 + break; 294 262 295 - nvidia_smmu->bases[1] = devm_ioremap_resource(dev, res); 296 - if (IS_ERR(nvidia_smmu->bases[1])) 297 - return ERR_CAST(nvidia_smmu->bases[1]); 263 + nvidia_smmu->bases[i] = devm_ioremap_resource(dev, res); 264 + if (IS_ERR(nvidia_smmu->bases[i])) 265 + return ERR_CAST(nvidia_smmu->bases[i]); 298 266 299 - nvidia_smmu->smmu.impl = &nvidia_smmu_impl; 267 + nvidia_smmu->num_instances++; 268 + } 269 + 270 + if (nvidia_smmu->num_instances == 1) 271 + nvidia_smmu->smmu.impl = &nvidia_smmu_single_impl; 272 + else 273 + nvidia_smmu->smmu.impl = &nvidia_smmu_impl; 300 274 301 275 return &nvidia_smmu->smmu; 302 276 }
+13
drivers/iommu/arm/arm-smmu/arm-smmu.c
··· 1450 1450 iommu_fwspec_free(dev); 1451 1451 } 1452 1452 1453 + static void arm_smmu_probe_finalize(struct device *dev) 1454 + { 1455 + struct arm_smmu_master_cfg *cfg; 1456 + struct arm_smmu_device *smmu; 1457 + 1458 + cfg = dev_iommu_priv_get(dev); 1459 + smmu = cfg->smmu; 1460 + 1461 + if (smmu->impl->probe_finalize) 1462 + smmu->impl->probe_finalize(smmu, dev); 1463 + } 1464 + 1453 1465 static struct iommu_group *arm_smmu_device_group(struct device *dev) 1454 1466 { 1455 1467 struct arm_smmu_master_cfg *cfg = dev_iommu_priv_get(dev); ··· 1581 1569 .iova_to_phys = arm_smmu_iova_to_phys, 1582 1570 .probe_device = arm_smmu_probe_device, 1583 1571 .release_device = arm_smmu_release_device, 1572 + .probe_finalize = arm_smmu_probe_finalize, 1584 1573 .device_group = arm_smmu_device_group, 1585 1574 .enable_nesting = arm_smmu_enable_nesting, 1586 1575 .set_pgtable_quirks = arm_smmu_set_pgtable_quirks,
+1
drivers/iommu/arm/arm-smmu/arm-smmu.h
··· 439 439 struct device *dev, int start); 440 440 void (*write_s2cr)(struct arm_smmu_device *smmu, int idx); 441 441 void (*write_sctlr)(struct arm_smmu_device *smmu, int idx, u32 reg); 442 + void (*probe_finalize)(struct arm_smmu_device *smmu, struct device *dev); 442 443 }; 443 444 444 445 #define INVALID_SMENDX -1
+8 -8
drivers/iommu/tegra-smmu.c
··· 376 376 if (client->swgroup != swgroup) 377 377 continue; 378 378 379 - value = smmu_readl(smmu, client->smmu.reg); 380 - value |= BIT(client->smmu.bit); 381 - smmu_writel(smmu, value, client->smmu.reg); 379 + value = smmu_readl(smmu, client->regs.smmu.reg); 380 + value |= BIT(client->regs.smmu.bit); 381 + smmu_writel(smmu, value, client->regs.smmu.reg); 382 382 } 383 383 } 384 384 ··· 404 404 if (client->swgroup != swgroup) 405 405 continue; 406 406 407 - value = smmu_readl(smmu, client->smmu.reg); 408 - value &= ~BIT(client->smmu.bit); 409 - smmu_writel(smmu, value, client->smmu.reg); 407 + value = smmu_readl(smmu, client->regs.smmu.reg); 408 + value &= ~BIT(client->regs.smmu.bit); 409 + smmu_writel(smmu, value, client->regs.smmu.reg); 410 410 } 411 411 } 412 412 ··· 1042 1042 const struct tegra_mc_client *client = &smmu->soc->clients[i]; 1043 1043 const char *status; 1044 1044 1045 - value = smmu_readl(smmu, client->smmu.reg); 1045 + value = smmu_readl(smmu, client->regs.smmu.reg); 1046 1046 1047 - if (value & BIT(client->smmu.bit)) 1047 + if (value & BIT(client->regs.smmu.bit)) 1048 1048 status = "yes"; 1049 1049 else 1050 1050 status = "no";
+11 -7
drivers/memory/tegra/Kconfig
··· 2 2 config TEGRA_MC 3 3 bool "NVIDIA Tegra Memory Controller support" 4 4 default y 5 - depends on ARCH_TEGRA 5 + depends on ARCH_TEGRA || (COMPILE_TEST && COMMON_CLK) 6 6 select INTERCONNECT 7 7 help 8 8 This driver supports the Memory Controller (MC) hardware found on 9 9 NVIDIA Tegra SoCs. 10 10 11 + if TEGRA_MC 12 + 11 13 config TEGRA20_EMC 12 14 tristate "NVIDIA Tegra20 External Memory Controller driver" 13 15 default y 14 - depends on TEGRA_MC && ARCH_TEGRA_2x_SOC 16 + depends on ARCH_TEGRA_2x_SOC || COMPILE_TEST 15 17 select DEVFREQ_GOV_SIMPLE_ONDEMAND 16 18 select PM_DEVFREQ 17 19 help ··· 25 23 config TEGRA30_EMC 26 24 tristate "NVIDIA Tegra30 External Memory Controller driver" 27 25 default y 28 - depends on TEGRA_MC && ARCH_TEGRA_3x_SOC 26 + depends on ARCH_TEGRA_3x_SOC || COMPILE_TEST 29 27 select PM_OPP 30 28 help 31 29 This driver is for the External Memory Controller (EMC) found on ··· 36 34 config TEGRA124_EMC 37 35 tristate "NVIDIA Tegra124 External Memory Controller driver" 38 36 default y 39 - depends on TEGRA_MC && ARCH_TEGRA_124_SOC 40 - select TEGRA124_CLK_EMC 37 + depends on ARCH_TEGRA_124_SOC || COMPILE_TEST 38 + select TEGRA124_CLK_EMC if ARCH_TEGRA 41 39 select PM_OPP 42 40 help 43 41 This driver is for the External Memory Controller (EMC) found on ··· 47 45 48 46 config TEGRA210_EMC_TABLE 49 47 bool 50 - depends on ARCH_TEGRA_210_SOC 48 + depends on ARCH_TEGRA_210_SOC || COMPILE_TEST 51 49 52 50 config TEGRA210_EMC 53 51 tristate "NVIDIA Tegra210 External Memory Controller driver" 54 - depends on TEGRA_MC && ARCH_TEGRA_210_SOC 52 + depends on ARCH_TEGRA_210_SOC || COMPILE_TEST 55 53 select TEGRA210_EMC_TABLE 56 54 help 57 55 This driver is for the External Memory Controller (EMC) found on 58 56 Tegra210 chips. The EMC controls the external DRAM on the board. 59 57 This driver is required to change memory timings / clock rate for 60 58 external memory. 59 + 60 + endif
+4 -2
drivers/memory/tegra/Makefile
··· 7 7 tegra-mc-$(CONFIG_ARCH_TEGRA_124_SOC) += tegra124.o 8 8 tegra-mc-$(CONFIG_ARCH_TEGRA_132_SOC) += tegra124.o 9 9 tegra-mc-$(CONFIG_ARCH_TEGRA_210_SOC) += tegra210.o 10 + tegra-mc-$(CONFIG_ARCH_TEGRA_186_SOC) += tegra186.o 11 + tegra-mc-$(CONFIG_ARCH_TEGRA_194_SOC) += tegra186.o tegra194.o 10 12 11 13 obj-$(CONFIG_TEGRA_MC) += tegra-mc.o 12 14 ··· 17 15 obj-$(CONFIG_TEGRA124_EMC) += tegra124-emc.o 18 16 obj-$(CONFIG_TEGRA210_EMC_TABLE) += tegra210-emc-table.o 19 17 obj-$(CONFIG_TEGRA210_EMC) += tegra210-emc.o 20 - obj-$(CONFIG_ARCH_TEGRA_186_SOC) += tegra186.o tegra186-emc.o 21 - obj-$(CONFIG_ARCH_TEGRA_194_SOC) += tegra186.o tegra186-emc.o 18 + obj-$(CONFIG_ARCH_TEGRA_186_SOC) += tegra186-emc.o 19 + obj-$(CONFIG_ARCH_TEGRA_194_SOC) += tegra186-emc.o 22 20 23 21 tegra210-emc-y := tegra210-emc-core.o tegra210-emc-cc-r21021.o
+138 -199
drivers/memory/tegra/mc.c
··· 39 39 #ifdef CONFIG_ARCH_TEGRA_210_SOC 40 40 { .compatible = "nvidia,tegra210-mc", .data = &tegra210_mc_soc }, 41 41 #endif 42 - { } 42 + #ifdef CONFIG_ARCH_TEGRA_186_SOC 43 + { .compatible = "nvidia,tegra186-mc", .data = &tegra186_mc_soc }, 44 + #endif 45 + #ifdef CONFIG_ARCH_TEGRA_194_SOC 46 + { .compatible = "nvidia,tegra194-mc", .data = &tegra194_mc_soc }, 47 + #endif 48 + { /* sentinel */ } 43 49 }; 44 50 MODULE_DEVICE_TABLE(of, tegra_mc_of_match); 45 51 ··· 96 90 return mc; 97 91 } 98 92 EXPORT_SYMBOL_GPL(devm_tegra_memory_controller_get); 93 + 94 + int tegra_mc_probe_device(struct tegra_mc *mc, struct device *dev) 95 + { 96 + if (mc->soc->ops && mc->soc->ops->probe_device) 97 + return mc->soc->ops->probe_device(mc, dev); 98 + 99 + return 0; 100 + } 101 + EXPORT_SYMBOL_GPL(tegra_mc_probe_device); 99 102 100 103 static int tegra_mc_block_dma_common(struct tegra_mc *mc, 101 104 const struct tegra_mc_reset *rst) ··· 314 299 return 0; 315 300 } 316 301 317 - static int tegra_mc_setup_latency_allowance(struct tegra_mc *mc) 318 - { 319 - unsigned long long tick; 320 - unsigned int i; 321 - u32 value; 322 - 323 - /* compute the number of MC clock cycles per tick */ 324 - tick = (unsigned long long)mc->tick * clk_get_rate(mc->clk); 325 - do_div(tick, NSEC_PER_SEC); 326 - 327 - value = mc_readl(mc, MC_EMEM_ARB_CFG); 328 - value &= ~MC_EMEM_ARB_CFG_CYCLES_PER_UPDATE_MASK; 329 - value |= MC_EMEM_ARB_CFG_CYCLES_PER_UPDATE(tick); 330 - mc_writel(mc, value, MC_EMEM_ARB_CFG); 331 - 332 - /* write latency allowance defaults */ 333 - for (i = 0; i < mc->soc->num_clients; i++) { 334 - const struct tegra_mc_la *la = &mc->soc->clients[i].la; 335 - u32 value; 336 - 337 - value = mc_readl(mc, la->reg); 338 - value &= ~(la->mask << la->shift); 339 - value |= (la->def & la->mask) << la->shift; 340 - mc_writel(mc, value, la->reg); 341 - } 342 - 343 - /* latch new values */ 344 - mc_writel(mc, MC_TIMING_UPDATE, MC_TIMING_CONTROL); 345 - 346 - return 0; 347 - } 348 - 349 302 int tegra_mc_write_emem_configuration(struct tegra_mc *mc, unsigned long rate) 350 303 { 351 304 unsigned int i; ··· 350 367 return dram_count; 351 368 } 352 369 EXPORT_SYMBOL_GPL(tegra_mc_get_emem_device_count); 370 + 371 + #if defined(CONFIG_ARCH_TEGRA_3x_SOC) || \ 372 + defined(CONFIG_ARCH_TEGRA_114_SOC) || \ 373 + defined(CONFIG_ARCH_TEGRA_124_SOC) || \ 374 + defined(CONFIG_ARCH_TEGRA_132_SOC) || \ 375 + defined(CONFIG_ARCH_TEGRA_210_SOC) 376 + static int tegra_mc_setup_latency_allowance(struct tegra_mc *mc) 377 + { 378 + unsigned long long tick; 379 + unsigned int i; 380 + u32 value; 381 + 382 + /* compute the number of MC clock cycles per tick */ 383 + tick = (unsigned long long)mc->tick * clk_get_rate(mc->clk); 384 + do_div(tick, NSEC_PER_SEC); 385 + 386 + value = mc_readl(mc, MC_EMEM_ARB_CFG); 387 + value &= ~MC_EMEM_ARB_CFG_CYCLES_PER_UPDATE_MASK; 388 + value |= MC_EMEM_ARB_CFG_CYCLES_PER_UPDATE(tick); 389 + mc_writel(mc, value, MC_EMEM_ARB_CFG); 390 + 391 + /* write latency allowance defaults */ 392 + for (i = 0; i < mc->soc->num_clients; i++) { 393 + const struct tegra_mc_client *client = &mc->soc->clients[i]; 394 + u32 value; 395 + 396 + value = mc_readl(mc, client->regs.la.reg); 397 + value &= ~(client->regs.la.mask << client->regs.la.shift); 398 + value |= (client->regs.la.def & client->regs.la.mask) << client->regs.la.shift; 399 + mc_writel(mc, value, client->regs.la.reg); 400 + } 401 + 402 + /* latch new values */ 403 + mc_writel(mc, MC_TIMING_UPDATE, MC_TIMING_CONTROL); 404 + 405 + return 0; 406 + } 353 407 354 408 static int load_one_timing(struct tegra_mc *mc, 355 409 struct tegra_mc_timing *timing, ··· 479 459 return 0; 480 460 } 481 461 482 - static const char *const status_names[32] = { 483 - [ 1] = "External interrupt", 484 - [ 6] = "EMEM address decode error", 485 - [ 7] = "GART page fault", 486 - [ 8] = "Security violation", 487 - [ 9] = "EMEM arbitration error", 488 - [10] = "Page fault", 489 - [11] = "Invalid APB ASID update", 490 - [12] = "VPR violation", 491 - [13] = "Secure carveout violation", 492 - [16] = "MTS carveout violation", 493 - }; 462 + int tegra30_mc_probe(struct tegra_mc *mc) 463 + { 464 + int err; 494 465 495 - static const char *const error_names[8] = { 496 - [2] = "EMEM decode error", 497 - [3] = "TrustZone violation", 498 - [4] = "Carveout violation", 499 - [6] = "SMMU translation error", 500 - }; 466 + mc->clk = devm_clk_get_optional(mc->dev, "mc"); 467 + if (IS_ERR(mc->clk)) { 468 + dev_err(mc->dev, "failed to get MC clock: %ld\n", PTR_ERR(mc->clk)); 469 + return PTR_ERR(mc->clk); 470 + } 501 471 502 - static irqreturn_t tegra_mc_irq(int irq, void *data) 472 + /* ensure that debug features are disabled */ 473 + mc_writel(mc, 0x00000000, MC_TIMING_CONTROL_DBG); 474 + 475 + err = tegra_mc_setup_latency_allowance(mc); 476 + if (err < 0) { 477 + dev_err(mc->dev, "failed to setup latency allowance: %d\n", err); 478 + return err; 479 + } 480 + 481 + err = tegra_mc_setup_timings(mc); 482 + if (err < 0) { 483 + dev_err(mc->dev, "failed to setup timings: %d\n", err); 484 + return err; 485 + } 486 + 487 + return 0; 488 + } 489 + 490 + static irqreturn_t tegra30_mc_handle_irq(int irq, void *data) 503 491 { 504 492 struct tegra_mc *mc = data; 505 493 unsigned long status; ··· 519 491 return IRQ_NONE; 520 492 521 493 for_each_set_bit(bit, &status, 32) { 522 - const char *error = status_names[bit] ?: "unknown"; 494 + const char *error = tegra_mc_status_names[bit] ?: "unknown"; 523 495 const char *client = "unknown", *desc; 524 496 const char *direction, *secure; 525 497 phys_addr_t addr = 0; ··· 559 531 560 532 type = (value & MC_ERR_STATUS_TYPE_MASK) >> 561 533 MC_ERR_STATUS_TYPE_SHIFT; 562 - desc = error_names[type]; 534 + desc = tegra_mc_error_names[type]; 563 535 564 536 switch (value & MC_ERR_STATUS_TYPE_MASK) { 565 537 case MC_ERR_STATUS_TYPE_INVALID_SMMU_PAGE: ··· 604 576 return IRQ_HANDLED; 605 577 } 606 578 607 - static __maybe_unused irqreturn_t tegra20_mc_irq(int irq, void *data) 608 - { 609 - struct tegra_mc *mc = data; 610 - unsigned long status; 611 - unsigned int bit; 579 + const struct tegra_mc_ops tegra30_mc_ops = { 580 + .probe = tegra30_mc_probe, 581 + .handle_irq = tegra30_mc_handle_irq, 582 + }; 583 + #endif 612 584 613 - /* mask all interrupts to avoid flooding */ 614 - status = mc_readl(mc, MC_INTSTATUS) & mc->soc->intmask; 615 - if (!status) 616 - return IRQ_NONE; 585 + const char *const tegra_mc_status_names[32] = { 586 + [ 1] = "External interrupt", 587 + [ 6] = "EMEM address decode error", 588 + [ 7] = "GART page fault", 589 + [ 8] = "Security violation", 590 + [ 9] = "EMEM arbitration error", 591 + [10] = "Page fault", 592 + [11] = "Invalid APB ASID update", 593 + [12] = "VPR violation", 594 + [13] = "Secure carveout violation", 595 + [16] = "MTS carveout violation", 596 + }; 617 597 618 - for_each_set_bit(bit, &status, 32) { 619 - const char *direction = "read", *secure = ""; 620 - const char *error = status_names[bit]; 621 - const char *client, *desc; 622 - phys_addr_t addr; 623 - u32 value, reg; 624 - u8 id, type; 625 - 626 - switch (BIT(bit)) { 627 - case MC_INT_DECERR_EMEM: 628 - reg = MC_DECERR_EMEM_OTHERS_STATUS; 629 - value = mc_readl(mc, reg); 630 - 631 - id = value & mc->soc->client_id_mask; 632 - desc = error_names[2]; 633 - 634 - if (value & BIT(31)) 635 - direction = "write"; 636 - break; 637 - 638 - case MC_INT_INVALID_GART_PAGE: 639 - reg = MC_GART_ERROR_REQ; 640 - value = mc_readl(mc, reg); 641 - 642 - id = (value >> 1) & mc->soc->client_id_mask; 643 - desc = error_names[2]; 644 - 645 - if (value & BIT(0)) 646 - direction = "write"; 647 - break; 648 - 649 - case MC_INT_SECURITY_VIOLATION: 650 - reg = MC_SECURITY_VIOLATION_STATUS; 651 - value = mc_readl(mc, reg); 652 - 653 - id = value & mc->soc->client_id_mask; 654 - type = (value & BIT(30)) ? 4 : 3; 655 - desc = error_names[type]; 656 - secure = "secure "; 657 - 658 - if (value & BIT(31)) 659 - direction = "write"; 660 - break; 661 - 662 - default: 663 - continue; 664 - } 665 - 666 - client = mc->soc->clients[id].name; 667 - addr = mc_readl(mc, reg + sizeof(u32)); 668 - 669 - dev_err_ratelimited(mc->dev, "%s: %s%s @%pa: %s (%s)\n", 670 - client, secure, direction, &addr, error, 671 - desc); 672 - } 673 - 674 - /* clear interrupts */ 675 - mc_writel(mc, status, MC_INTSTATUS); 676 - 677 - return IRQ_HANDLED; 678 - } 598 + const char *const tegra_mc_error_names[8] = { 599 + [2] = "EMEM decode error", 600 + [3] = "TrustZone violation", 601 + [4] = "Carveout violation", 602 + [6] = "SMMU translation error", 603 + }; 679 604 680 605 /* 681 606 * Memory Controller (MC) has few Memory Clients that are issuing memory ··· 729 748 { 730 749 struct resource *res; 731 750 struct tegra_mc *mc; 732 - void *isr; 733 751 u64 mask; 734 752 int err; 735 753 ··· 757 777 if (IS_ERR(mc->regs)) 758 778 return PTR_ERR(mc->regs); 759 779 760 - mc->clk = devm_clk_get(&pdev->dev, "mc"); 761 - if (IS_ERR(mc->clk)) { 762 - dev_err(&pdev->dev, "failed to get MC clock: %ld\n", 763 - PTR_ERR(mc->clk)); 764 - return PTR_ERR(mc->clk); 765 - } 766 - 767 - #ifdef CONFIG_ARCH_TEGRA_2x_SOC 768 - if (mc->soc == &tegra20_mc_soc) { 769 - isr = tegra20_mc_irq; 770 - } else 771 - #endif 772 - { 773 - /* ensure that debug features are disabled */ 774 - mc_writel(mc, 0x00000000, MC_TIMING_CONTROL_DBG); 775 - 776 - err = tegra_mc_setup_latency_allowance(mc); 777 - if (err < 0) { 778 - dev_err(&pdev->dev, 779 - "failed to setup latency allowance: %d\n", 780 - err); 781 - return err; 782 - } 783 - 784 - isr = tegra_mc_irq; 785 - 786 - err = tegra_mc_setup_timings(mc); 787 - if (err < 0) { 788 - dev_err(&pdev->dev, "failed to setup timings: %d\n", 789 - err); 790 - return err; 791 - } 792 - } 793 - 794 - mc->irq = platform_get_irq(pdev, 0); 795 - if (mc->irq < 0) 796 - return mc->irq; 797 - 798 - WARN(!mc->soc->client_id_mask, "missing client ID mask for this SoC\n"); 799 - 800 - mc_writel(mc, mc->soc->intmask, MC_INTMASK); 801 - 802 - err = devm_request_irq(&pdev->dev, mc->irq, isr, 0, 803 - dev_name(&pdev->dev), mc); 804 - if (err < 0) { 805 - dev_err(&pdev->dev, "failed to request IRQ#%u: %d\n", mc->irq, 806 - err); 807 - return err; 808 - } 809 - 810 780 mc->debugfs.root = debugfs_create_dir("mc", NULL); 811 781 812 - if (mc->soc->init) { 813 - err = mc->soc->init(mc); 782 + if (mc->soc->ops && mc->soc->ops->probe) { 783 + err = mc->soc->ops->probe(mc); 814 784 if (err < 0) 815 - dev_err(&pdev->dev, "failed to initialize SoC driver: %d\n", 816 - err); 785 + return err; 817 786 } 818 787 819 - err = tegra_mc_reset_setup(mc); 820 - if (err < 0) 821 - dev_err(&pdev->dev, "failed to register reset controller: %d\n", 822 - err); 788 + if (mc->soc->ops && mc->soc->ops->handle_irq) { 789 + mc->irq = platform_get_irq(pdev, 0); 790 + if (mc->irq < 0) 791 + return mc->irq; 792 + 793 + WARN(!mc->soc->client_id_mask, "missing client ID mask for this SoC\n"); 794 + 795 + mc_writel(mc, mc->soc->intmask, MC_INTMASK); 796 + 797 + err = devm_request_irq(&pdev->dev, mc->irq, mc->soc->ops->handle_irq, 0, 798 + dev_name(&pdev->dev), mc); 799 + if (err < 0) { 800 + dev_err(&pdev->dev, "failed to request IRQ#%u: %d\n", mc->irq, 801 + err); 802 + return err; 803 + } 804 + } 805 + 806 + if (mc->soc->reset_ops) { 807 + err = tegra_mc_reset_setup(mc); 808 + if (err < 0) 809 + dev_err(&pdev->dev, "failed to register reset controller: %d\n", err); 810 + } 823 811 824 812 err = tegra_mc_interconnect_setup(mc); 825 813 if (err < 0) ··· 815 867 return 0; 816 868 } 817 869 818 - static int tegra_mc_suspend(struct device *dev) 870 + static int __maybe_unused tegra_mc_suspend(struct device *dev) 819 871 { 820 872 struct tegra_mc *mc = dev_get_drvdata(dev); 821 - int err; 822 873 823 - if (IS_ENABLED(CONFIG_TEGRA_IOMMU_GART) && mc->gart) { 824 - err = tegra_gart_suspend(mc->gart); 825 - if (err) 826 - return err; 827 - } 874 + if (mc->soc->ops && mc->soc->ops->suspend) 875 + return mc->soc->ops->suspend(mc); 828 876 829 877 return 0; 830 878 } 831 879 832 - static int tegra_mc_resume(struct device *dev) 880 + static int __maybe_unused tegra_mc_resume(struct device *dev) 833 881 { 834 882 struct tegra_mc *mc = dev_get_drvdata(dev); 835 - int err; 836 883 837 - if (IS_ENABLED(CONFIG_TEGRA_IOMMU_GART) && mc->gart) { 838 - err = tegra_gart_resume(mc->gart); 839 - if (err) 840 - return err; 841 - } 884 + if (mc->soc->ops && mc->soc->ops->resume) 885 + return mc->soc->ops->resume(mc); 842 886 843 887 return 0; 844 888 } 845 889 846 890 static const struct dev_pm_ops tegra_mc_pm_ops = { 847 - .suspend = tegra_mc_suspend, 848 - .resume = tegra_mc_resume, 891 + SET_SYSTEM_SLEEP_PM_OPS(tegra_mc_suspend, tegra_mc_resume) 849 892 }; 850 893 851 894 static struct platform_driver tegra_mc_driver = {
+25
drivers/memory/tegra/mc.h
··· 129 129 extern const struct tegra_mc_soc tegra210_mc_soc; 130 130 #endif 131 131 132 + #ifdef CONFIG_ARCH_TEGRA_186_SOC 133 + extern const struct tegra_mc_soc tegra186_mc_soc; 134 + #endif 135 + 136 + #ifdef CONFIG_ARCH_TEGRA_194_SOC 137 + extern const struct tegra_mc_soc tegra194_mc_soc; 138 + #endif 139 + 140 + #if defined(CONFIG_ARCH_TEGRA_3x_SOC) || \ 141 + defined(CONFIG_ARCH_TEGRA_114_SOC) || \ 142 + defined(CONFIG_ARCH_TEGRA_124_SOC) || \ 143 + defined(CONFIG_ARCH_TEGRA_132_SOC) || \ 144 + defined(CONFIG_ARCH_TEGRA_210_SOC) 145 + int tegra30_mc_probe(struct tegra_mc *mc); 146 + extern const struct tegra_mc_ops tegra30_mc_ops; 147 + #endif 148 + 149 + #if defined(CONFIG_ARCH_TEGRA_186_SOC) || \ 150 + defined(CONFIG_ARCH_TEGRA_194_SOC) 151 + extern const struct tegra_mc_ops tegra186_mc_ops; 152 + #endif 153 + 154 + extern const char * const tegra_mc_status_names[32]; 155 + extern const char * const tegra_mc_error_names[8]; 156 + 132 157 /* 133 158 * These IDs are for internal use of Tegra ICC drivers. The ID numbers are 134 159 * chosen such that they don't conflict with the device-tree ICC node IDs.
+688 -557
drivers/memory/tegra/tegra114.c
··· 15 15 .id = 0x00, 16 16 .name = "ptcr", 17 17 .swgroup = TEGRA_SWGROUP_PTC, 18 - .la = { 19 - .reg = 0x34c, 20 - .shift = 0, 21 - .mask = 0xff, 22 - .def = 0x0, 18 + .regs = { 19 + .la = { 20 + .reg = 0x34c, 21 + .shift = 0, 22 + .mask = 0xff, 23 + .def = 0x0, 24 + }, 23 25 }, 24 26 }, { 25 27 .id = 0x01, 26 28 .name = "display0a", 27 29 .swgroup = TEGRA_SWGROUP_DC, 28 - .smmu = { 29 - .reg = 0x228, 30 - .bit = 1, 31 - }, 32 - .la = { 33 - .reg = 0x2e8, 34 - .shift = 0, 35 - .mask = 0xff, 36 - .def = 0x4e, 30 + .regs = { 31 + .smmu = { 32 + .reg = 0x228, 33 + .bit = 1, 34 + }, 35 + .la = { 36 + .reg = 0x2e8, 37 + .shift = 0, 38 + .mask = 0xff, 39 + .def = 0x4e, 40 + }, 37 41 }, 38 42 }, { 39 43 .id = 0x02, 40 44 .name = "display0ab", 41 45 .swgroup = TEGRA_SWGROUP_DCB, 42 - .smmu = { 43 - .reg = 0x228, 44 - .bit = 2, 45 - }, 46 - .la = { 47 - .reg = 0x2f4, 48 - .shift = 0, 49 - .mask = 0xff, 50 - .def = 0x4e, 46 + .regs = { 47 + .smmu = { 48 + .reg = 0x228, 49 + .bit = 2, 50 + }, 51 + .la = { 52 + .reg = 0x2f4, 53 + .shift = 0, 54 + .mask = 0xff, 55 + .def = 0x4e, 56 + }, 51 57 }, 52 58 }, { 53 59 .id = 0x03, 54 60 .name = "display0b", 55 61 .swgroup = TEGRA_SWGROUP_DC, 56 - .smmu = { 57 - .reg = 0x228, 58 - .bit = 3, 59 - }, 60 - .la = { 61 - .reg = 0x2e8, 62 - .shift = 16, 63 - .mask = 0xff, 64 - .def = 0x4e, 62 + .regs = { 63 + .smmu = { 64 + .reg = 0x228, 65 + .bit = 3, 66 + }, 67 + .la = { 68 + .reg = 0x2e8, 69 + .shift = 16, 70 + .mask = 0xff, 71 + .def = 0x4e, 72 + }, 65 73 }, 66 74 }, { 67 75 .id = 0x04, 68 76 .name = "display0bb", 69 77 .swgroup = TEGRA_SWGROUP_DCB, 70 - .smmu = { 71 - .reg = 0x228, 72 - .bit = 4, 73 - }, 74 - .la = { 75 - .reg = 0x2f4, 76 - .shift = 16, 77 - .mask = 0xff, 78 - .def = 0x4e, 78 + .regs = { 79 + .smmu = { 80 + .reg = 0x228, 81 + .bit = 4, 82 + }, 83 + .la = { 84 + .reg = 0x2f4, 85 + .shift = 16, 86 + .mask = 0xff, 87 + .def = 0x4e, 88 + }, 79 89 }, 80 90 }, { 81 91 .id = 0x05, 82 92 .name = "display0c", 83 93 .swgroup = TEGRA_SWGROUP_DC, 84 - .smmu = { 85 - .reg = 0x228, 86 - .bit = 5, 87 - }, 88 - .la = { 89 - .reg = 0x2ec, 90 - .shift = 0, 91 - .mask = 0xff, 92 - .def = 0x4e, 94 + .regs = { 95 + .smmu = { 96 + .reg = 0x228, 97 + .bit = 5, 98 + }, 99 + .la = { 100 + .reg = 0x2ec, 101 + .shift = 0, 102 + .mask = 0xff, 103 + .def = 0x4e, 104 + }, 93 105 }, 94 106 }, { 95 107 .id = 0x06, 96 108 .name = "display0cb", 97 109 .swgroup = TEGRA_SWGROUP_DCB, 98 - .smmu = { 99 - .reg = 0x228, 100 - .bit = 6, 101 - }, 102 - .la = { 103 - .reg = 0x2f8, 104 - .shift = 0, 105 - .mask = 0xff, 106 - .def = 0x4e, 110 + .regs = { 111 + .smmu = { 112 + .reg = 0x228, 113 + .bit = 6, 114 + }, 115 + .la = { 116 + .reg = 0x2f8, 117 + .shift = 0, 118 + .mask = 0xff, 119 + .def = 0x4e, 120 + }, 107 121 }, 108 122 }, { 109 123 .id = 0x09, 110 124 .name = "eppup", 111 125 .swgroup = TEGRA_SWGROUP_EPP, 112 - .smmu = { 113 - .reg = 0x228, 114 - .bit = 9, 115 - }, 116 - .la = { 117 - .reg = 0x300, 118 - .shift = 0, 119 - .mask = 0xff, 120 - .def = 0x33, 126 + .regs = { 127 + .smmu = { 128 + .reg = 0x228, 129 + .bit = 9, 130 + }, 131 + .la = { 132 + .reg = 0x300, 133 + .shift = 0, 134 + .mask = 0xff, 135 + .def = 0x33, 136 + }, 121 137 }, 122 138 }, { 123 139 .id = 0x0a, 124 140 .name = "g2pr", 125 141 .swgroup = TEGRA_SWGROUP_G2, 126 - .smmu = { 127 - .reg = 0x228, 128 - .bit = 10, 129 - }, 130 - .la = { 131 - .reg = 0x308, 132 - .shift = 0, 133 - .mask = 0xff, 134 - .def = 0x09, 142 + .regs = { 143 + .smmu = { 144 + .reg = 0x228, 145 + .bit = 10, 146 + }, 147 + .la = { 148 + .reg = 0x308, 149 + .shift = 0, 150 + .mask = 0xff, 151 + .def = 0x09, 152 + }, 135 153 }, 136 154 }, { 137 155 .id = 0x0b, 138 156 .name = "g2sr", 139 157 .swgroup = TEGRA_SWGROUP_G2, 140 - .smmu = { 141 - .reg = 0x228, 142 - .bit = 11, 143 - }, 144 - .la = { 145 - .reg = 0x308, 146 - .shift = 16, 147 - .mask = 0xff, 148 - .def = 0x09, 158 + .regs = { 159 + .smmu = { 160 + .reg = 0x228, 161 + .bit = 11, 162 + }, 163 + .la = { 164 + .reg = 0x308, 165 + .shift = 16, 166 + .mask = 0xff, 167 + .def = 0x09, 168 + }, 149 169 }, 150 170 }, { 151 171 .id = 0x0f, 152 172 .name = "avpcarm7r", 153 173 .swgroup = TEGRA_SWGROUP_AVPC, 154 - .smmu = { 155 - .reg = 0x228, 156 - .bit = 15, 157 - }, 158 - .la = { 159 - .reg = 0x2e4, 160 - .shift = 0, 161 - .mask = 0xff, 162 - .def = 0x04, 174 + .regs = { 175 + .smmu = { 176 + .reg = 0x228, 177 + .bit = 15, 178 + }, 179 + .la = { 180 + .reg = 0x2e4, 181 + .shift = 0, 182 + .mask = 0xff, 183 + .def = 0x04, 184 + }, 163 185 }, 164 186 }, { 165 187 .id = 0x10, 166 188 .name = "displayhc", 167 189 .swgroup = TEGRA_SWGROUP_DC, 168 - .smmu = { 169 - .reg = 0x228, 170 - .bit = 16, 171 - }, 172 - .la = { 173 - .reg = 0x2f0, 174 - .shift = 0, 175 - .mask = 0xff, 176 - .def = 0x68, 190 + .regs = { 191 + .smmu = { 192 + .reg = 0x228, 193 + .bit = 16, 194 + }, 195 + .la = { 196 + .reg = 0x2f0, 197 + .shift = 0, 198 + .mask = 0xff, 199 + .def = 0x68, 200 + }, 177 201 }, 178 202 }, { 179 203 .id = 0x11, 180 204 .name = "displayhcb", 181 205 .swgroup = TEGRA_SWGROUP_DCB, 182 - .smmu = { 183 - .reg = 0x228, 184 - .bit = 17, 185 - }, 186 - .la = { 187 - .reg = 0x2fc, 188 - .shift = 0, 189 - .mask = 0xff, 190 - .def = 0x68, 206 + .regs = { 207 + .smmu = { 208 + .reg = 0x228, 209 + .bit = 17, 210 + }, 211 + .la = { 212 + .reg = 0x2fc, 213 + .shift = 0, 214 + .mask = 0xff, 215 + .def = 0x68, 216 + }, 191 217 }, 192 218 }, { 193 219 .id = 0x12, 194 220 .name = "fdcdrd", 195 221 .swgroup = TEGRA_SWGROUP_NV, 196 - .smmu = { 197 - .reg = 0x228, 198 - .bit = 18, 199 - }, 200 - .la = { 201 - .reg = 0x334, 202 - .shift = 0, 203 - .mask = 0xff, 204 - .def = 0x0c, 222 + .regs = { 223 + .smmu = { 224 + .reg = 0x228, 225 + .bit = 18, 226 + }, 227 + .la = { 228 + .reg = 0x334, 229 + .shift = 0, 230 + .mask = 0xff, 231 + .def = 0x0c, 232 + }, 205 233 }, 206 234 }, { 207 235 .id = 0x13, 208 236 .name = "fdcdrd2", 209 237 .swgroup = TEGRA_SWGROUP_NV, 210 - .smmu = { 211 - .reg = 0x228, 212 - .bit = 19, 213 - }, 214 - .la = { 215 - .reg = 0x33c, 216 - .shift = 0, 217 - .mask = 0xff, 218 - .def = 0x0c, 238 + .regs = { 239 + .smmu = { 240 + .reg = 0x228, 241 + .bit = 19, 242 + }, 243 + .la = { 244 + .reg = 0x33c, 245 + .shift = 0, 246 + .mask = 0xff, 247 + .def = 0x0c, 248 + }, 219 249 }, 220 250 }, { 221 251 .id = 0x14, 222 252 .name = "g2dr", 223 253 .swgroup = TEGRA_SWGROUP_G2, 224 - .smmu = { 225 - .reg = 0x228, 226 - .bit = 20, 227 - }, 228 - .la = { 229 - .reg = 0x30c, 230 - .shift = 0, 231 - .mask = 0xff, 232 - .def = 0x0a, 254 + .regs = { 255 + .smmu = { 256 + .reg = 0x228, 257 + .bit = 20, 258 + }, 259 + .la = { 260 + .reg = 0x30c, 261 + .shift = 0, 262 + .mask = 0xff, 263 + .def = 0x0a, 264 + }, 233 265 }, 234 266 }, { 235 267 .id = 0x15, 236 268 .name = "hdar", 237 269 .swgroup = TEGRA_SWGROUP_HDA, 238 - .smmu = { 239 - .reg = 0x228, 240 - .bit = 21, 241 - }, 242 - .la = { 243 - .reg = 0x318, 244 - .shift = 0, 245 - .mask = 0xff, 246 - .def = 0xff, 270 + .regs = { 271 + .smmu = { 272 + .reg = 0x228, 273 + .bit = 21, 274 + }, 275 + .la = { 276 + .reg = 0x318, 277 + .shift = 0, 278 + .mask = 0xff, 279 + .def = 0xff, 280 + }, 247 281 }, 248 282 }, { 249 283 .id = 0x16, 250 284 .name = "host1xdmar", 251 285 .swgroup = TEGRA_SWGROUP_HC, 252 - .smmu = { 253 - .reg = 0x228, 254 - .bit = 22, 255 - }, 256 - .la = { 257 - .reg = 0x310, 258 - .shift = 0, 259 - .mask = 0xff, 260 - .def = 0x10, 286 + .regs = { 287 + .smmu = { 288 + .reg = 0x228, 289 + .bit = 22, 290 + }, 291 + .la = { 292 + .reg = 0x310, 293 + .shift = 0, 294 + .mask = 0xff, 295 + .def = 0x10, 296 + }, 261 297 }, 262 298 }, { 263 299 .id = 0x17, 264 300 .name = "host1xr", 265 301 .swgroup = TEGRA_SWGROUP_HC, 266 - .smmu = { 267 - .reg = 0x228, 268 - .bit = 23, 269 - }, 270 - .la = { 271 - .reg = 0x310, 272 - .shift = 16, 273 - .mask = 0xff, 274 - .def = 0xa5, 302 + .regs = { 303 + .smmu = { 304 + .reg = 0x228, 305 + .bit = 23, 306 + }, 307 + .la = { 308 + .reg = 0x310, 309 + .shift = 16, 310 + .mask = 0xff, 311 + .def = 0xa5, 312 + }, 275 313 }, 276 314 }, { 277 315 .id = 0x18, 278 316 .name = "idxsrd", 279 317 .swgroup = TEGRA_SWGROUP_NV, 280 - .smmu = { 281 - .reg = 0x228, 282 - .bit = 24, 283 - }, 284 - .la = { 285 - .reg = 0x334, 286 - .shift = 16, 287 - .mask = 0xff, 288 - .def = 0x0b, 318 + .regs = { 319 + .smmu = { 320 + .reg = 0x228, 321 + .bit = 24, 322 + }, 323 + .la = { 324 + .reg = 0x334, 325 + .shift = 16, 326 + .mask = 0xff, 327 + .def = 0x0b, 328 + }, 289 329 }, 290 330 }, { 291 331 .id = 0x1c, 292 332 .name = "msencsrd", 293 333 .swgroup = TEGRA_SWGROUP_MSENC, 294 - .smmu = { 295 - .reg = 0x228, 296 - .bit = 28, 297 - }, 298 - .la = { 299 - .reg = 0x328, 300 - .shift = 0, 301 - .mask = 0xff, 302 - .def = 0x80, 334 + .regs = { 335 + .smmu = { 336 + .reg = 0x228, 337 + .bit = 28, 338 + }, 339 + .la = { 340 + .reg = 0x328, 341 + .shift = 0, 342 + .mask = 0xff, 343 + .def = 0x80, 344 + }, 303 345 }, 304 346 }, { 305 347 .id = 0x1d, 306 348 .name = "ppcsahbdmar", 307 349 .swgroup = TEGRA_SWGROUP_PPCS, 308 - .smmu = { 309 - .reg = 0x228, 310 - .bit = 29, 311 - }, 312 - .la = { 313 - .reg = 0x344, 314 - .shift = 0, 315 - .mask = 0xff, 316 - .def = 0x50, 350 + .regs = { 351 + .smmu = { 352 + .reg = 0x228, 353 + .bit = 29, 354 + }, 355 + .la = { 356 + .reg = 0x344, 357 + .shift = 0, 358 + .mask = 0xff, 359 + .def = 0x50, 360 + }, 317 361 }, 318 362 }, { 319 363 .id = 0x1e, 320 364 .name = "ppcsahbslvr", 321 365 .swgroup = TEGRA_SWGROUP_PPCS, 322 - .smmu = { 323 - .reg = 0x228, 324 - .bit = 30, 325 - }, 326 - .la = { 327 - .reg = 0x344, 328 - .shift = 16, 329 - .mask = 0xff, 330 - .def = 0xe8, 366 + .regs = { 367 + .smmu = { 368 + .reg = 0x228, 369 + .bit = 30, 370 + }, 371 + .la = { 372 + .reg = 0x344, 373 + .shift = 16, 374 + .mask = 0xff, 375 + .def = 0xe8, 376 + }, 331 377 }, 332 378 }, { 333 379 .id = 0x20, 334 380 .name = "texl2srd", 335 381 .swgroup = TEGRA_SWGROUP_NV, 336 - .smmu = { 337 - .reg = 0x22c, 338 - .bit = 0, 339 - }, 340 - .la = { 341 - .reg = 0x338, 342 - .shift = 0, 343 - .mask = 0xff, 344 - .def = 0x0c, 382 + .regs = { 383 + .smmu = { 384 + .reg = 0x22c, 385 + .bit = 0, 386 + }, 387 + .la = { 388 + .reg = 0x338, 389 + .shift = 0, 390 + .mask = 0xff, 391 + .def = 0x0c, 392 + }, 345 393 }, 346 394 }, { 347 395 .id = 0x22, 348 396 .name = "vdebsevr", 349 397 .swgroup = TEGRA_SWGROUP_VDE, 350 - .smmu = { 351 - .reg = 0x22c, 352 - .bit = 2, 353 - }, 354 - .la = { 355 - .reg = 0x354, 356 - .shift = 0, 357 - .mask = 0xff, 358 - .def = 0xff, 398 + .regs = { 399 + .smmu = { 400 + .reg = 0x22c, 401 + .bit = 2, 402 + }, 403 + .la = { 404 + .reg = 0x354, 405 + .shift = 0, 406 + .mask = 0xff, 407 + .def = 0xff, 408 + }, 359 409 }, 360 410 }, { 361 411 .id = 0x23, 362 412 .name = "vdember", 363 413 .swgroup = TEGRA_SWGROUP_VDE, 364 - .smmu = { 365 - .reg = 0x22c, 366 - .bit = 3, 367 - }, 368 - .la = { 369 - .reg = 0x354, 370 - .shift = 16, 371 - .mask = 0xff, 372 - .def = 0xff, 414 + .regs = { 415 + .smmu = { 416 + .reg = 0x22c, 417 + .bit = 3, 418 + }, 419 + .la = { 420 + .reg = 0x354, 421 + .shift = 16, 422 + .mask = 0xff, 423 + .def = 0xff, 424 + }, 373 425 }, 374 426 }, { 375 427 .id = 0x24, 376 428 .name = "vdemcer", 377 429 .swgroup = TEGRA_SWGROUP_VDE, 378 - .smmu = { 379 - .reg = 0x22c, 380 - .bit = 4, 381 - }, 382 - .la = { 383 - .reg = 0x358, 384 - .shift = 0, 385 - .mask = 0xff, 386 - .def = 0xb8, 430 + .regs = { 431 + .smmu = { 432 + .reg = 0x22c, 433 + .bit = 4, 434 + }, 435 + .la = { 436 + .reg = 0x358, 437 + .shift = 0, 438 + .mask = 0xff, 439 + .def = 0xb8, 440 + }, 387 441 }, 388 442 }, { 389 443 .id = 0x25, 390 444 .name = "vdetper", 391 445 .swgroup = TEGRA_SWGROUP_VDE, 392 - .smmu = { 393 - .reg = 0x22c, 394 - .bit = 5, 395 - }, 396 - .la = { 397 - .reg = 0x358, 398 - .shift = 16, 399 - .mask = 0xff, 400 - .def = 0xee, 446 + .regs = { 447 + .smmu = { 448 + .reg = 0x22c, 449 + .bit = 5, 450 + }, 451 + .la = { 452 + .reg = 0x358, 453 + .shift = 16, 454 + .mask = 0xff, 455 + .def = 0xee, 456 + }, 401 457 }, 402 458 }, { 403 459 .id = 0x26, 404 460 .name = "mpcorelpr", 405 461 .swgroup = TEGRA_SWGROUP_MPCORELP, 406 - .la = { 407 - .reg = 0x324, 408 - .shift = 0, 409 - .mask = 0xff, 410 - .def = 0x04, 462 + .regs = { 463 + .la = { 464 + .reg = 0x324, 465 + .shift = 0, 466 + .mask = 0xff, 467 + .def = 0x04, 468 + }, 411 469 }, 412 470 }, { 413 471 .id = 0x27, 414 472 .name = "mpcorer", 415 473 .swgroup = TEGRA_SWGROUP_MPCORE, 416 - .la = { 417 - .reg = 0x320, 418 - .shift = 0, 419 - .mask = 0xff, 420 - .def = 0x04, 474 + .regs = { 475 + .la = { 476 + .reg = 0x320, 477 + .shift = 0, 478 + .mask = 0xff, 479 + .def = 0x04, 480 + }, 421 481 }, 422 482 }, { 423 483 .id = 0x28, 424 484 .name = "eppu", 425 485 .swgroup = TEGRA_SWGROUP_EPP, 426 - .smmu = { 427 - .reg = 0x22c, 428 - .bit = 8, 429 - }, 430 - .la = { 431 - .reg = 0x300, 432 - .shift = 16, 433 - .mask = 0xff, 434 - .def = 0x33, 486 + .regs = { 487 + .smmu = { 488 + .reg = 0x22c, 489 + .bit = 8, 490 + }, 491 + .la = { 492 + .reg = 0x300, 493 + .shift = 16, 494 + .mask = 0xff, 495 + .def = 0x33, 496 + }, 435 497 }, 436 498 }, { 437 499 .id = 0x29, 438 500 .name = "eppv", 439 501 .swgroup = TEGRA_SWGROUP_EPP, 440 - .smmu = { 441 - .reg = 0x22c, 442 - .bit = 9, 443 - }, 444 - .la = { 445 - .reg = 0x304, 446 - .shift = 0, 447 - .mask = 0xff, 448 - .def = 0x6c, 502 + .regs = { 503 + .smmu = { 504 + .reg = 0x22c, 505 + .bit = 9, 506 + }, 507 + .la = { 508 + .reg = 0x304, 509 + .shift = 0, 510 + .mask = 0xff, 511 + .def = 0x6c, 512 + }, 449 513 }, 450 514 }, { 451 515 .id = 0x2a, 452 516 .name = "eppy", 453 517 .swgroup = TEGRA_SWGROUP_EPP, 454 - .smmu = { 455 - .reg = 0x22c, 456 - .bit = 10, 457 - }, 458 - .la = { 459 - .reg = 0x304, 460 - .shift = 16, 461 - .mask = 0xff, 462 - .def = 0x6c, 518 + .regs = { 519 + .smmu = { 520 + .reg = 0x22c, 521 + .bit = 10, 522 + }, 523 + .la = { 524 + .reg = 0x304, 525 + .shift = 16, 526 + .mask = 0xff, 527 + .def = 0x6c, 528 + }, 463 529 }, 464 530 }, { 465 531 .id = 0x2b, 466 532 .name = "msencswr", 467 533 .swgroup = TEGRA_SWGROUP_MSENC, 468 - .smmu = { 469 - .reg = 0x22c, 470 - .bit = 11, 471 - }, 472 - .la = { 473 - .reg = 0x328, 474 - .shift = 16, 475 - .mask = 0xff, 476 - .def = 0x80, 534 + .regs = { 535 + .smmu = { 536 + .reg = 0x22c, 537 + .bit = 11, 538 + }, 539 + .la = { 540 + .reg = 0x328, 541 + .shift = 16, 542 + .mask = 0xff, 543 + .def = 0x80, 544 + }, 477 545 }, 478 546 }, { 479 547 .id = 0x2c, 480 548 .name = "viwsb", 481 549 .swgroup = TEGRA_SWGROUP_VI, 482 - .smmu = { 483 - .reg = 0x22c, 484 - .bit = 12, 485 - }, 486 - .la = { 487 - .reg = 0x364, 488 - .shift = 0, 489 - .mask = 0xff, 490 - .def = 0x47, 550 + .regs = { 551 + .smmu = { 552 + .reg = 0x22c, 553 + .bit = 12, 554 + }, 555 + .la = { 556 + .reg = 0x364, 557 + .shift = 0, 558 + .mask = 0xff, 559 + .def = 0x47, 560 + }, 491 561 }, 492 562 }, { 493 563 .id = 0x2d, 494 564 .name = "viwu", 495 565 .swgroup = TEGRA_SWGROUP_VI, 496 - .smmu = { 497 - .reg = 0x22c, 498 - .bit = 13, 499 - }, 500 - .la = { 501 - .reg = 0x368, 502 - .shift = 0, 503 - .mask = 0xff, 504 - .def = 0xff, 566 + .regs = { 567 + .smmu = { 568 + .reg = 0x22c, 569 + .bit = 13, 570 + }, 571 + .la = { 572 + .reg = 0x368, 573 + .shift = 0, 574 + .mask = 0xff, 575 + .def = 0xff, 576 + }, 505 577 }, 506 578 }, { 507 579 .id = 0x2e, 508 580 .name = "viwv", 509 581 .swgroup = TEGRA_SWGROUP_VI, 510 - .smmu = { 511 - .reg = 0x22c, 512 - .bit = 14, 513 - }, 514 - .la = { 515 - .reg = 0x368, 516 - .shift = 16, 517 - .mask = 0xff, 518 - .def = 0xff, 582 + .regs = { 583 + .smmu = { 584 + .reg = 0x22c, 585 + .bit = 14, 586 + }, 587 + .la = { 588 + .reg = 0x368, 589 + .shift = 16, 590 + .mask = 0xff, 591 + .def = 0xff, 592 + }, 519 593 }, 520 594 }, { 521 595 .id = 0x2f, 522 596 .name = "viwy", 523 597 .swgroup = TEGRA_SWGROUP_VI, 524 - .smmu = { 525 - .reg = 0x22c, 526 - .bit = 15, 527 - }, 528 - .la = { 529 - .reg = 0x36c, 530 - .shift = 0, 531 - .mask = 0xff, 532 - .def = 0x47, 598 + .regs = { 599 + .smmu = { 600 + .reg = 0x22c, 601 + .bit = 15, 602 + }, 603 + .la = { 604 + .reg = 0x36c, 605 + .shift = 0, 606 + .mask = 0xff, 607 + .def = 0x47, 608 + }, 533 609 }, 534 610 }, { 535 611 .id = 0x30, 536 612 .name = "g2dw", 537 613 .swgroup = TEGRA_SWGROUP_G2, 538 - .smmu = { 539 - .reg = 0x22c, 540 - .bit = 16, 541 - }, 542 - .la = { 543 - .reg = 0x30c, 544 - .shift = 16, 545 - .mask = 0xff, 546 - .def = 0x9, 614 + .regs = { 615 + .smmu = { 616 + .reg = 0x22c, 617 + .bit = 16, 618 + }, 619 + .la = { 620 + .reg = 0x30c, 621 + .shift = 16, 622 + .mask = 0xff, 623 + .def = 0x9, 624 + }, 547 625 }, 548 626 }, { 549 627 .id = 0x32, 550 628 .name = "avpcarm7w", 551 629 .swgroup = TEGRA_SWGROUP_AVPC, 552 - .smmu = { 553 - .reg = 0x22c, 554 - .bit = 18, 555 - }, 556 - .la = { 557 - .reg = 0x2e4, 558 - .shift = 16, 559 - .mask = 0xff, 560 - .def = 0x0e, 630 + .regs = { 631 + .smmu = { 632 + .reg = 0x22c, 633 + .bit = 18, 634 + }, 635 + .la = { 636 + .reg = 0x2e4, 637 + .shift = 16, 638 + .mask = 0xff, 639 + .def = 0x0e, 640 + }, 561 641 }, 562 642 }, { 563 643 .id = 0x33, 564 644 .name = "fdcdwr", 565 645 .swgroup = TEGRA_SWGROUP_NV, 566 - .smmu = { 567 - .reg = 0x22c, 568 - .bit = 19, 569 - }, 570 - .la = { 571 - .reg = 0x338, 572 - .shift = 16, 573 - .mask = 0xff, 574 - .def = 0x10, 646 + .regs = { 647 + .smmu = { 648 + .reg = 0x22c, 649 + .bit = 19, 650 + }, 651 + .la = { 652 + .reg = 0x338, 653 + .shift = 16, 654 + .mask = 0xff, 655 + .def = 0x10, 656 + }, 575 657 }, 576 658 }, { 577 659 .id = 0x34, 578 660 .name = "fdcdwr2", 579 661 .swgroup = TEGRA_SWGROUP_NV, 580 - .smmu = { 581 - .reg = 0x22c, 582 - .bit = 20, 583 - }, 584 - .la = { 585 - .reg = 0x340, 586 - .shift = 0, 587 - .mask = 0xff, 588 - .def = 0x10, 662 + .regs = { 663 + .smmu = { 664 + .reg = 0x22c, 665 + .bit = 20, 666 + }, 667 + .la = { 668 + .reg = 0x340, 669 + .shift = 0, 670 + .mask = 0xff, 671 + .def = 0x10, 672 + }, 589 673 }, 590 674 }, { 591 675 .id = 0x35, 592 676 .name = "hdaw", 593 677 .swgroup = TEGRA_SWGROUP_HDA, 594 - .smmu = { 595 - .reg = 0x22c, 596 - .bit = 21, 597 - }, 598 - .la = { 599 - .reg = 0x318, 600 - .shift = 16, 601 - .mask = 0xff, 602 - .def = 0xff, 678 + .regs = { 679 + .smmu = { 680 + .reg = 0x22c, 681 + .bit = 21, 682 + }, 683 + .la = { 684 + .reg = 0x318, 685 + .shift = 16, 686 + .mask = 0xff, 687 + .def = 0xff, 688 + }, 603 689 }, 604 690 }, { 605 691 .id = 0x36, 606 692 .name = "host1xw", 607 693 .swgroup = TEGRA_SWGROUP_HC, 608 - .smmu = { 609 - .reg = 0x22c, 610 - .bit = 22, 611 - }, 612 - .la = { 613 - .reg = 0x314, 614 - .shift = 0, 615 - .mask = 0xff, 616 - .def = 0x25, 694 + .regs = { 695 + .smmu = { 696 + .reg = 0x22c, 697 + .bit = 22, 698 + }, 699 + .la = { 700 + .reg = 0x314, 701 + .shift = 0, 702 + .mask = 0xff, 703 + .def = 0x25, 704 + }, 617 705 }, 618 706 }, { 619 707 .id = 0x37, 620 708 .name = "ispw", 621 709 .swgroup = TEGRA_SWGROUP_ISP, 622 - .smmu = { 623 - .reg = 0x22c, 624 - .bit = 23, 625 - }, 626 - .la = { 627 - .reg = 0x31c, 628 - .shift = 0, 629 - .mask = 0xff, 630 - .def = 0xff, 710 + .regs = { 711 + .smmu = { 712 + .reg = 0x22c, 713 + .bit = 23, 714 + }, 715 + .la = { 716 + .reg = 0x31c, 717 + .shift = 0, 718 + .mask = 0xff, 719 + .def = 0xff, 720 + }, 631 721 }, 632 722 }, { 633 723 .id = 0x38, 634 724 .name = "mpcorelpw", 635 725 .swgroup = TEGRA_SWGROUP_MPCORELP, 636 - .la = { 637 - .reg = 0x324, 638 - .shift = 16, 639 - .mask = 0xff, 640 - .def = 0x80, 726 + .regs = { 727 + .la = { 728 + .reg = 0x324, 729 + .shift = 16, 730 + .mask = 0xff, 731 + .def = 0x80, 732 + }, 641 733 }, 642 734 }, { 643 735 .id = 0x39, 644 736 .name = "mpcorew", 645 737 .swgroup = TEGRA_SWGROUP_MPCORE, 646 - .la = { 647 - .reg = 0x320, 648 - .shift = 16, 649 - .mask = 0xff, 650 - .def = 0x0e, 738 + .regs = { 739 + .la = { 740 + .reg = 0x320, 741 + .shift = 16, 742 + .mask = 0xff, 743 + .def = 0x0e, 744 + }, 651 745 }, 652 746 }, { 653 747 .id = 0x3b, 654 748 .name = "ppcsahbdmaw", 655 749 .swgroup = TEGRA_SWGROUP_PPCS, 656 - .smmu = { 657 - .reg = 0x22c, 658 - .bit = 27, 659 - }, 660 - .la = { 661 - .reg = 0x348, 662 - .shift = 0, 663 - .mask = 0xff, 664 - .def = 0xa5, 750 + .regs = { 751 + .smmu = { 752 + .reg = 0x22c, 753 + .bit = 27, 754 + }, 755 + .la = { 756 + .reg = 0x348, 757 + .shift = 0, 758 + .mask = 0xff, 759 + .def = 0xa5, 760 + }, 665 761 }, 666 762 }, { 667 763 .id = 0x3c, 668 764 .name = "ppcsahbslvw", 669 765 .swgroup = TEGRA_SWGROUP_PPCS, 670 - .smmu = { 671 - .reg = 0x22c, 672 - .bit = 28, 673 - }, 674 - .la = { 675 - .reg = 0x348, 676 - .shift = 16, 677 - .mask = 0xff, 678 - .def = 0xe8, 766 + .regs = { 767 + .smmu = { 768 + .reg = 0x22c, 769 + .bit = 28, 770 + }, 771 + .la = { 772 + .reg = 0x348, 773 + .shift = 16, 774 + .mask = 0xff, 775 + .def = 0xe8, 776 + }, 679 777 }, 680 778 }, { 681 779 .id = 0x3e, 682 780 .name = "vdebsevw", 683 781 .swgroup = TEGRA_SWGROUP_VDE, 684 - .smmu = { 685 - .reg = 0x22c, 686 - .bit = 30, 687 - }, 688 - .la = { 689 - .reg = 0x35c, 690 - .shift = 0, 691 - .mask = 0xff, 692 - .def = 0xff, 782 + .regs = { 783 + .smmu = { 784 + .reg = 0x22c, 785 + .bit = 30, 786 + }, 787 + .la = { 788 + .reg = 0x35c, 789 + .shift = 0, 790 + .mask = 0xff, 791 + .def = 0xff, 792 + }, 693 793 }, 694 794 }, { 695 795 .id = 0x3f, 696 796 .name = "vdedbgw", 697 797 .swgroup = TEGRA_SWGROUP_VDE, 698 - .smmu = { 699 - .reg = 0x22c, 700 - .bit = 31, 701 - }, 702 - .la = { 703 - .reg = 0x35c, 704 - .shift = 16, 705 - .mask = 0xff, 706 - .def = 0xff, 798 + .regs = { 799 + .smmu = { 800 + .reg = 0x22c, 801 + .bit = 31, 802 + }, 803 + .la = { 804 + .reg = 0x35c, 805 + .shift = 16, 806 + .mask = 0xff, 807 + .def = 0xff, 808 + }, 707 809 }, 708 810 }, { 709 811 .id = 0x40, 710 812 .name = "vdembew", 711 813 .swgroup = TEGRA_SWGROUP_VDE, 712 - .smmu = { 713 - .reg = 0x230, 714 - .bit = 0, 715 - }, 716 - .la = { 717 - .reg = 0x360, 718 - .shift = 0, 719 - .mask = 0xff, 720 - .def = 0x89, 814 + .regs = { 815 + .smmu = { 816 + .reg = 0x230, 817 + .bit = 0, 818 + }, 819 + .la = { 820 + .reg = 0x360, 821 + .shift = 0, 822 + .mask = 0xff, 823 + .def = 0x89, 824 + }, 721 825 }, 722 826 }, { 723 827 .id = 0x41, 724 828 .name = "vdetpmw", 725 829 .swgroup = TEGRA_SWGROUP_VDE, 726 - .smmu = { 727 - .reg = 0x230, 728 - .bit = 1, 729 - }, 730 - .la = { 731 - .reg = 0x360, 732 - .shift = 16, 733 - .mask = 0xff, 734 - .def = 0x59, 830 + .regs = { 831 + .smmu = { 832 + .reg = 0x230, 833 + .bit = 1, 834 + }, 835 + .la = { 836 + .reg = 0x360, 837 + .shift = 16, 838 + .mask = 0xff, 839 + .def = 0x59, 840 + }, 735 841 }, 736 842 }, { 737 843 .id = 0x4a, 738 844 .name = "xusb_hostr", 739 845 .swgroup = TEGRA_SWGROUP_XUSB_HOST, 740 - .smmu = { 741 - .reg = 0x230, 742 - .bit = 10, 743 - }, 744 - .la = { 745 - .reg = 0x37c, 746 - .shift = 0, 747 - .mask = 0xff, 748 - .def = 0xa5, 846 + .regs = { 847 + .smmu = { 848 + .reg = 0x230, 849 + .bit = 10, 850 + }, 851 + .la = { 852 + .reg = 0x37c, 853 + .shift = 0, 854 + .mask = 0xff, 855 + .def = 0xa5, 856 + }, 749 857 }, 750 858 }, { 751 859 .id = 0x4b, 752 860 .name = "xusb_hostw", 753 861 .swgroup = TEGRA_SWGROUP_XUSB_HOST, 754 - .smmu = { 755 - .reg = 0x230, 756 - .bit = 11, 757 - }, 758 - .la = { 759 - .reg = 0x37c, 760 - .shift = 16, 761 - .mask = 0xff, 762 - .def = 0xa5, 862 + .regs = { 863 + .smmu = { 864 + .reg = 0x230, 865 + .bit = 11, 866 + }, 867 + .la = { 868 + .reg = 0x37c, 869 + .shift = 16, 870 + .mask = 0xff, 871 + .def = 0xa5, 872 + }, 763 873 }, 764 874 }, { 765 875 .id = 0x4c, 766 876 .name = "xusb_devr", 767 877 .swgroup = TEGRA_SWGROUP_XUSB_DEV, 768 - .smmu = { 769 - .reg = 0x230, 770 - .bit = 12, 771 - }, 772 - .la = { 773 - .reg = 0x380, 774 - .shift = 0, 775 - .mask = 0xff, 776 - .def = 0xa5, 878 + .regs = { 879 + .smmu = { 880 + .reg = 0x230, 881 + .bit = 12, 882 + }, 883 + .la = { 884 + .reg = 0x380, 885 + .shift = 0, 886 + .mask = 0xff, 887 + .def = 0xa5, 888 + }, 777 889 }, 778 890 }, { 779 891 .id = 0x4d, 780 892 .name = "xusb_devw", 781 893 .swgroup = TEGRA_SWGROUP_XUSB_DEV, 782 - .smmu = { 783 - .reg = 0x230, 784 - .bit = 13, 785 - }, 786 - .la = { 787 - .reg = 0x380, 788 - .shift = 16, 789 - .mask = 0xff, 790 - .def = 0xa5, 894 + .regs = { 895 + .smmu = { 896 + .reg = 0x230, 897 + .bit = 13, 898 + }, 899 + .la = { 900 + .reg = 0x380, 901 + .shift = 16, 902 + .mask = 0xff, 903 + .def = 0xa5, 904 + }, 791 905 }, 792 906 }, { 793 907 .id = 0x4e, 794 908 .name = "fdcdwr3", 795 909 .swgroup = TEGRA_SWGROUP_NV, 796 - .smmu = { 797 - .reg = 0x230, 798 - .bit = 14, 799 - }, 800 - .la = { 801 - .reg = 0x388, 802 - .shift = 0, 803 - .mask = 0xff, 804 - .def = 0x10, 910 + .regs = { 911 + .smmu = { 912 + .reg = 0x230, 913 + .bit = 14, 914 + }, 915 + .la = { 916 + .reg = 0x388, 917 + .shift = 0, 918 + .mask = 0xff, 919 + .def = 0x10, 920 + }, 805 921 }, 806 922 }, { 807 923 .id = 0x4f, 808 924 .name = "fdcdrd3", 809 925 .swgroup = TEGRA_SWGROUP_NV, 810 - .smmu = { 811 - .reg = 0x230, 812 - .bit = 15, 813 - }, 814 - .la = { 815 - .reg = 0x384, 816 - .shift = 0, 817 - .mask = 0xff, 818 - .def = 0x0c, 926 + .regs = { 927 + .smmu = { 928 + .reg = 0x230, 929 + .bit = 15, 930 + }, 931 + .la = { 932 + .reg = 0x384, 933 + .shift = 0, 934 + .mask = 0xff, 935 + .def = 0x0c, 936 + }, 819 937 }, 820 938 }, { 821 939 .id = 0x50, 822 940 .name = "fdcwr4", 823 941 .swgroup = TEGRA_SWGROUP_NV, 824 - .smmu = { 825 - .reg = 0x230, 826 - .bit = 16, 827 - }, 828 - .la = { 829 - .reg = 0x388, 830 - .shift = 16, 831 - .mask = 0xff, 832 - .def = 0x10, 942 + .regs = { 943 + .smmu = { 944 + .reg = 0x230, 945 + .bit = 16, 946 + }, 947 + .la = { 948 + .reg = 0x388, 949 + .shift = 16, 950 + .mask = 0xff, 951 + .def = 0x10, 952 + }, 833 953 }, 834 954 }, { 835 955 .id = 0x51, 836 956 .name = "fdcrd4", 837 957 .swgroup = TEGRA_SWGROUP_NV, 838 - .smmu = { 839 - .reg = 0x230, 840 - .bit = 17, 841 - }, 842 - .la = { 843 - .reg = 0x384, 844 - .shift = 16, 845 - .mask = 0xff, 846 - .def = 0x0c, 958 + .regs = { 959 + .smmu = { 960 + .reg = 0x230, 961 + .bit = 17, 962 + }, 963 + .la = { 964 + .reg = 0x384, 965 + .shift = 16, 966 + .mask = 0xff, 967 + .def = 0x0c, 968 + }, 847 969 }, 848 970 }, { 849 971 .id = 0x52, 850 972 .name = "emucifr", 851 973 .swgroup = TEGRA_SWGROUP_EMUCIF, 852 - .la = { 853 - .reg = 0x38c, 854 - .shift = 0, 855 - .mask = 0xff, 856 - .def = 0x04, 974 + .regs = { 975 + .la = { 976 + .reg = 0x38c, 977 + .shift = 0, 978 + .mask = 0xff, 979 + .def = 0x04, 980 + }, 857 981 }, 858 982 }, { 859 983 .id = 0x53, 860 984 .name = "emucifw", 861 985 .swgroup = TEGRA_SWGROUP_EMUCIF, 862 - .la = { 863 - .reg = 0x38c, 864 - .shift = 16, 865 - .mask = 0xff, 866 - .def = 0x0e, 986 + .regs = { 987 + .la = { 988 + .reg = 0x38c, 989 + .shift = 16, 990 + .mask = 0xff, 991 + .def = 0x0e, 992 + }, 867 993 }, 868 994 }, { 869 995 .id = 0x54, 870 996 .name = "tsecsrd", 871 997 .swgroup = TEGRA_SWGROUP_TSEC, 872 - .smmu = { 873 - .reg = 0x230, 874 - .bit = 20, 875 - }, 876 - .la = { 877 - .reg = 0x390, 878 - .shift = 0, 879 - .mask = 0xff, 880 - .def = 0x50, 998 + .regs = { 999 + .smmu = { 1000 + .reg = 0x230, 1001 + .bit = 20, 1002 + }, 1003 + .la = { 1004 + .reg = 0x390, 1005 + .shift = 0, 1006 + .mask = 0xff, 1007 + .def = 0x50, 1008 + }, 881 1009 }, 882 1010 }, { 883 1011 .id = 0x55, 884 1012 .name = "tsecswr", 885 1013 .swgroup = TEGRA_SWGROUP_TSEC, 886 - .smmu = { 887 - .reg = 0x230, 888 - .bit = 21, 889 - }, 890 - .la = { 891 - .reg = 0x390, 892 - .shift = 16, 893 - .mask = 0xff, 894 - .def = 0x50, 1014 + .regs = { 1015 + .smmu = { 1016 + .reg = 0x230, 1017 + .bit = 21, 1018 + }, 1019 + .la = { 1020 + .reg = 0x390, 1021 + .shift = 16, 1022 + .mask = 0xff, 1023 + .def = 0x50, 1024 + }, 895 1025 }, 896 1026 }, 897 1027 }; ··· 1113 983 .reset_ops = &tegra_mc_reset_ops_common, 1114 984 .resets = tegra114_mc_resets, 1115 985 .num_resets = ARRAY_SIZE(tegra114_mc_resets), 986 + .ops = &tegra30_mc_ops, 1116 987 };
+2 -6
drivers/memory/tegra/tegra124-emc.c
··· 272 272 #define EMC_PUTERM_ADJ 0x574 273 273 274 274 #define DRAM_DEV_SEL_ALL 0 275 - #define DRAM_DEV_SEL_0 (2 << 30) 276 - #define DRAM_DEV_SEL_1 (1 << 30) 275 + #define DRAM_DEV_SEL_0 BIT(31) 276 + #define DRAM_DEV_SEL_1 BIT(30) 277 277 278 278 #define EMC_CFG_POWER_FEATURES_MASK \ 279 279 (EMC_CFG_DYN_SREF | EMC_CFG_DRAM_ACPD | EMC_CFG_DRAM_CLKSTOP_SR | \ ··· 1269 1269 } 1270 1270 1271 1271 emc->debugfs.root = debugfs_create_dir("emc", NULL); 1272 - if (!emc->debugfs.root) { 1273 - dev_err(dev, "failed to create debugfs directory\n"); 1274 - return; 1275 - } 1276 1272 1277 1273 debugfs_create_file("available_rates", 0444, emc->debugfs.root, emc, 1278 1274 &tegra_emc_debug_available_rates_fops);
+721 -585
drivers/memory/tegra/tegra124.c
··· 16 16 .id = 0x00, 17 17 .name = "ptcr", 18 18 .swgroup = TEGRA_SWGROUP_PTC, 19 - .la = { 20 - .reg = 0x34c, 21 - .shift = 0, 22 - .mask = 0xff, 23 - .def = 0x0, 19 + .regs = { 20 + .la = { 21 + .reg = 0x34c, 22 + .shift = 0, 23 + .mask = 0xff, 24 + .def = 0x0, 25 + }, 24 26 }, 25 27 }, { 26 28 .id = 0x01, 27 29 .name = "display0a", 28 30 .swgroup = TEGRA_SWGROUP_DC, 29 - .smmu = { 30 - .reg = 0x228, 31 - .bit = 1, 32 - }, 33 - .la = { 34 - .reg = 0x2e8, 35 - .shift = 0, 36 - .mask = 0xff, 37 - .def = 0xc2, 31 + .regs = { 32 + .smmu = { 33 + .reg = 0x228, 34 + .bit = 1, 35 + }, 36 + .la = { 37 + .reg = 0x2e8, 38 + .shift = 0, 39 + .mask = 0xff, 40 + .def = 0xc2, 41 + }, 38 42 }, 39 43 }, { 40 44 .id = 0x02, 41 45 .name = "display0ab", 42 46 .swgroup = TEGRA_SWGROUP_DCB, 43 - .smmu = { 44 - .reg = 0x228, 45 - .bit = 2, 46 - }, 47 - .la = { 48 - .reg = 0x2f4, 49 - .shift = 0, 50 - .mask = 0xff, 51 - .def = 0xc6, 47 + .regs = { 48 + .smmu = { 49 + .reg = 0x228, 50 + .bit = 2, 51 + }, 52 + .la = { 53 + .reg = 0x2f4, 54 + .shift = 0, 55 + .mask = 0xff, 56 + .def = 0xc6, 57 + }, 52 58 }, 53 59 }, { 54 60 .id = 0x03, 55 61 .name = "display0b", 56 62 .swgroup = TEGRA_SWGROUP_DC, 57 - .smmu = { 58 - .reg = 0x228, 59 - .bit = 3, 60 - }, 61 - .la = { 62 - .reg = 0x2e8, 63 - .shift = 16, 64 - .mask = 0xff, 65 - .def = 0x50, 63 + .regs = { 64 + .smmu = { 65 + .reg = 0x228, 66 + .bit = 3, 67 + }, 68 + .la = { 69 + .reg = 0x2e8, 70 + .shift = 16, 71 + .mask = 0xff, 72 + .def = 0x50, 73 + }, 66 74 }, 67 75 }, { 68 76 .id = 0x04, 69 77 .name = "display0bb", 70 78 .swgroup = TEGRA_SWGROUP_DCB, 71 - .smmu = { 72 - .reg = 0x228, 73 - .bit = 4, 74 - }, 75 - .la = { 76 - .reg = 0x2f4, 77 - .shift = 16, 78 - .mask = 0xff, 79 - .def = 0x50, 79 + .regs = { 80 + .smmu = { 81 + .reg = 0x228, 82 + .bit = 4, 83 + }, 84 + .la = { 85 + .reg = 0x2f4, 86 + .shift = 16, 87 + .mask = 0xff, 88 + .def = 0x50, 89 + }, 80 90 }, 81 91 }, { 82 92 .id = 0x05, 83 93 .name = "display0c", 84 94 .swgroup = TEGRA_SWGROUP_DC, 85 - .smmu = { 86 - .reg = 0x228, 87 - .bit = 5, 88 - }, 89 - .la = { 90 - .reg = 0x2ec, 91 - .shift = 0, 92 - .mask = 0xff, 93 - .def = 0x50, 95 + .regs = { 96 + .smmu = { 97 + .reg = 0x228, 98 + .bit = 5, 99 + }, 100 + .la = { 101 + .reg = 0x2ec, 102 + .shift = 0, 103 + .mask = 0xff, 104 + .def = 0x50, 105 + }, 94 106 }, 95 107 }, { 96 108 .id = 0x06, 97 109 .name = "display0cb", 98 110 .swgroup = TEGRA_SWGROUP_DCB, 99 - .smmu = { 100 - .reg = 0x228, 101 - .bit = 6, 102 - }, 103 - .la = { 104 - .reg = 0x2f8, 105 - .shift = 0, 106 - .mask = 0xff, 107 - .def = 0x50, 111 + .regs = { 112 + .smmu = { 113 + .reg = 0x228, 114 + .bit = 6, 115 + }, 116 + .la = { 117 + .reg = 0x2f8, 118 + .shift = 0, 119 + .mask = 0xff, 120 + .def = 0x50, 121 + }, 108 122 }, 109 123 }, { 110 124 .id = 0x0e, 111 125 .name = "afir", 112 126 .swgroup = TEGRA_SWGROUP_AFI, 113 - .smmu = { 114 - .reg = 0x228, 115 - .bit = 14, 116 - }, 117 - .la = { 118 - .reg = 0x2e0, 119 - .shift = 0, 120 - .mask = 0xff, 121 - .def = 0x13, 127 + .regs = { 128 + .smmu = { 129 + .reg = 0x228, 130 + .bit = 14, 131 + }, 132 + .la = { 133 + .reg = 0x2e0, 134 + .shift = 0, 135 + .mask = 0xff, 136 + .def = 0x13, 137 + }, 122 138 }, 123 139 }, { 124 140 .id = 0x0f, 125 141 .name = "avpcarm7r", 126 142 .swgroup = TEGRA_SWGROUP_AVPC, 127 - .smmu = { 128 - .reg = 0x228, 129 - .bit = 15, 130 - }, 131 - .la = { 132 - .reg = 0x2e4, 133 - .shift = 0, 134 - .mask = 0xff, 135 - .def = 0x04, 143 + .regs = { 144 + .smmu = { 145 + .reg = 0x228, 146 + .bit = 15, 147 + }, 148 + .la = { 149 + .reg = 0x2e4, 150 + .shift = 0, 151 + .mask = 0xff, 152 + .def = 0x04, 153 + }, 136 154 }, 137 155 }, { 138 156 .id = 0x10, 139 157 .name = "displayhc", 140 158 .swgroup = TEGRA_SWGROUP_DC, 141 - .smmu = { 142 - .reg = 0x228, 143 - .bit = 16, 144 - }, 145 - .la = { 146 - .reg = 0x2f0, 147 - .shift = 0, 148 - .mask = 0xff, 149 - .def = 0x50, 159 + .regs = { 160 + .smmu = { 161 + .reg = 0x228, 162 + .bit = 16, 163 + }, 164 + .la = { 165 + .reg = 0x2f0, 166 + .shift = 0, 167 + .mask = 0xff, 168 + .def = 0x50, 169 + }, 150 170 }, 151 171 }, { 152 172 .id = 0x11, 153 173 .name = "displayhcb", 154 174 .swgroup = TEGRA_SWGROUP_DCB, 155 - .smmu = { 156 - .reg = 0x228, 157 - .bit = 17, 158 - }, 159 - .la = { 160 - .reg = 0x2fc, 161 - .shift = 0, 162 - .mask = 0xff, 163 - .def = 0x50, 175 + .regs = { 176 + .smmu = { 177 + .reg = 0x228, 178 + .bit = 17, 179 + }, 180 + .la = { 181 + .reg = 0x2fc, 182 + .shift = 0, 183 + .mask = 0xff, 184 + .def = 0x50, 185 + }, 164 186 }, 165 187 }, { 166 188 .id = 0x15, 167 189 .name = "hdar", 168 190 .swgroup = TEGRA_SWGROUP_HDA, 169 - .smmu = { 170 - .reg = 0x228, 171 - .bit = 21, 172 - }, 173 - .la = { 174 - .reg = 0x318, 175 - .shift = 0, 176 - .mask = 0xff, 177 - .def = 0x24, 191 + .regs = { 192 + .smmu = { 193 + .reg = 0x228, 194 + .bit = 21, 195 + }, 196 + .la = { 197 + .reg = 0x318, 198 + .shift = 0, 199 + .mask = 0xff, 200 + .def = 0x24, 201 + }, 178 202 }, 179 203 }, { 180 204 .id = 0x16, 181 205 .name = "host1xdmar", 182 206 .swgroup = TEGRA_SWGROUP_HC, 183 - .smmu = { 184 - .reg = 0x228, 185 - .bit = 22, 186 - }, 187 - .la = { 188 - .reg = 0x310, 189 - .shift = 0, 190 - .mask = 0xff, 191 - .def = 0x1e, 207 + .regs = { 208 + .smmu = { 209 + .reg = 0x228, 210 + .bit = 22, 211 + }, 212 + .la = { 213 + .reg = 0x310, 214 + .shift = 0, 215 + .mask = 0xff, 216 + .def = 0x1e, 217 + }, 192 218 }, 193 219 }, { 194 220 .id = 0x17, 195 221 .name = "host1xr", 196 222 .swgroup = TEGRA_SWGROUP_HC, 197 - .smmu = { 198 - .reg = 0x228, 199 - .bit = 23, 200 - }, 201 - .la = { 202 - .reg = 0x310, 203 - .shift = 16, 204 - .mask = 0xff, 205 - .def = 0x50, 223 + .regs = { 224 + .smmu = { 225 + .reg = 0x228, 226 + .bit = 23, 227 + }, 228 + .la = { 229 + .reg = 0x310, 230 + .shift = 16, 231 + .mask = 0xff, 232 + .def = 0x50, 233 + }, 206 234 }, 207 235 }, { 208 236 .id = 0x1c, 209 237 .name = "msencsrd", 210 238 .swgroup = TEGRA_SWGROUP_MSENC, 211 - .smmu = { 212 - .reg = 0x228, 213 - .bit = 28, 214 - }, 215 - .la = { 216 - .reg = 0x328, 217 - .shift = 0, 218 - .mask = 0xff, 219 - .def = 0x23, 239 + .regs = { 240 + .smmu = { 241 + .reg = 0x228, 242 + .bit = 28, 243 + }, 244 + .la = { 245 + .reg = 0x328, 246 + .shift = 0, 247 + .mask = 0xff, 248 + .def = 0x23, 249 + }, 220 250 }, 221 251 }, { 222 252 .id = 0x1d, 223 253 .name = "ppcsahbdmar", 224 254 .swgroup = TEGRA_SWGROUP_PPCS, 225 - .smmu = { 226 - .reg = 0x228, 227 - .bit = 29, 228 - }, 229 - .la = { 230 - .reg = 0x344, 231 - .shift = 0, 232 - .mask = 0xff, 233 - .def = 0x49, 255 + .regs = { 256 + .smmu = { 257 + .reg = 0x228, 258 + .bit = 29, 259 + }, 260 + .la = { 261 + .reg = 0x344, 262 + .shift = 0, 263 + .mask = 0xff, 264 + .def = 0x49, 265 + }, 234 266 }, 235 267 }, { 236 268 .id = 0x1e, 237 269 .name = "ppcsahbslvr", 238 270 .swgroup = TEGRA_SWGROUP_PPCS, 239 - .smmu = { 240 - .reg = 0x228, 241 - .bit = 30, 242 - }, 243 - .la = { 244 - .reg = 0x344, 245 - .shift = 16, 246 - .mask = 0xff, 247 - .def = 0x1a, 271 + .regs = { 272 + .smmu = { 273 + .reg = 0x228, 274 + .bit = 30, 275 + }, 276 + .la = { 277 + .reg = 0x344, 278 + .shift = 16, 279 + .mask = 0xff, 280 + .def = 0x1a, 281 + }, 248 282 }, 249 283 }, { 250 284 .id = 0x1f, 251 285 .name = "satar", 252 286 .swgroup = TEGRA_SWGROUP_SATA, 253 - .smmu = { 254 - .reg = 0x228, 255 - .bit = 31, 256 - }, 257 - .la = { 258 - .reg = 0x350, 259 - .shift = 0, 260 - .mask = 0xff, 261 - .def = 0x65, 287 + .regs = { 288 + .smmu = { 289 + .reg = 0x228, 290 + .bit = 31, 291 + }, 292 + .la = { 293 + .reg = 0x350, 294 + .shift = 0, 295 + .mask = 0xff, 296 + .def = 0x65, 297 + }, 262 298 }, 263 299 }, { 264 300 .id = 0x22, 265 301 .name = "vdebsevr", 266 302 .swgroup = TEGRA_SWGROUP_VDE, 267 - .smmu = { 268 - .reg = 0x22c, 269 - .bit = 2, 270 - }, 271 - .la = { 272 - .reg = 0x354, 273 - .shift = 0, 274 - .mask = 0xff, 275 - .def = 0x4f, 303 + .regs = { 304 + .smmu = { 305 + .reg = 0x22c, 306 + .bit = 2, 307 + }, 308 + .la = { 309 + .reg = 0x354, 310 + .shift = 0, 311 + .mask = 0xff, 312 + .def = 0x4f, 313 + }, 276 314 }, 277 315 }, { 278 316 .id = 0x23, 279 317 .name = "vdember", 280 318 .swgroup = TEGRA_SWGROUP_VDE, 281 - .smmu = { 282 - .reg = 0x22c, 283 - .bit = 3, 284 - }, 285 - .la = { 286 - .reg = 0x354, 287 - .shift = 16, 288 - .mask = 0xff, 289 - .def = 0x3d, 319 + .regs = { 320 + .smmu = { 321 + .reg = 0x22c, 322 + .bit = 3, 323 + }, 324 + .la = { 325 + .reg = 0x354, 326 + .shift = 16, 327 + .mask = 0xff, 328 + .def = 0x3d, 329 + }, 290 330 }, 291 331 }, { 292 332 .id = 0x24, 293 333 .name = "vdemcer", 294 334 .swgroup = TEGRA_SWGROUP_VDE, 295 - .smmu = { 296 - .reg = 0x22c, 297 - .bit = 4, 298 - }, 299 - .la = { 300 - .reg = 0x358, 301 - .shift = 0, 302 - .mask = 0xff, 303 - .def = 0x66, 335 + .regs = { 336 + .smmu = { 337 + .reg = 0x22c, 338 + .bit = 4, 339 + }, 340 + .la = { 341 + .reg = 0x358, 342 + .shift = 0, 343 + .mask = 0xff, 344 + .def = 0x66, 345 + }, 304 346 }, 305 347 }, { 306 348 .id = 0x25, 307 349 .name = "vdetper", 308 350 .swgroup = TEGRA_SWGROUP_VDE, 309 - .smmu = { 310 - .reg = 0x22c, 311 - .bit = 5, 312 - }, 313 - .la = { 314 - .reg = 0x358, 315 - .shift = 16, 316 - .mask = 0xff, 317 - .def = 0xa5, 351 + .regs = { 352 + .smmu = { 353 + .reg = 0x22c, 354 + .bit = 5, 355 + }, 356 + .la = { 357 + .reg = 0x358, 358 + .shift = 16, 359 + .mask = 0xff, 360 + .def = 0xa5, 361 + }, 318 362 }, 319 363 }, { 320 364 .id = 0x26, 321 365 .name = "mpcorelpr", 322 366 .swgroup = TEGRA_SWGROUP_MPCORELP, 323 - .la = { 324 - .reg = 0x324, 325 - .shift = 0, 326 - .mask = 0xff, 327 - .def = 0x04, 367 + .regs = { 368 + .la = { 369 + .reg = 0x324, 370 + .shift = 0, 371 + .mask = 0xff, 372 + .def = 0x04, 373 + }, 328 374 }, 329 375 }, { 330 376 .id = 0x27, 331 377 .name = "mpcorer", 332 378 .swgroup = TEGRA_SWGROUP_MPCORE, 333 - .la = { 334 - .reg = 0x320, 335 - .shift = 0, 336 - .mask = 0xff, 337 - .def = 0x04, 379 + .regs = { 380 + .la = { 381 + .reg = 0x320, 382 + .shift = 0, 383 + .mask = 0xff, 384 + .def = 0x04, 385 + }, 338 386 }, 339 387 }, { 340 388 .id = 0x2b, 341 389 .name = "msencswr", 342 390 .swgroup = TEGRA_SWGROUP_MSENC, 343 - .smmu = { 344 - .reg = 0x22c, 345 - .bit = 11, 346 - }, 347 - .la = { 348 - .reg = 0x328, 349 - .shift = 16, 350 - .mask = 0xff, 351 - .def = 0x80, 391 + .regs = { 392 + .smmu = { 393 + .reg = 0x22c, 394 + .bit = 11, 395 + }, 396 + .la = { 397 + .reg = 0x328, 398 + .shift = 16, 399 + .mask = 0xff, 400 + .def = 0x80, 401 + }, 352 402 }, 353 403 }, { 354 404 .id = 0x31, 355 405 .name = "afiw", 356 406 .swgroup = TEGRA_SWGROUP_AFI, 357 - .smmu = { 358 - .reg = 0x22c, 359 - .bit = 17, 360 - }, 361 - .la = { 362 - .reg = 0x2e0, 363 - .shift = 16, 364 - .mask = 0xff, 365 - .def = 0x80, 407 + .regs = { 408 + .smmu = { 409 + .reg = 0x22c, 410 + .bit = 17, 411 + }, 412 + .la = { 413 + .reg = 0x2e0, 414 + .shift = 16, 415 + .mask = 0xff, 416 + .def = 0x80, 417 + }, 366 418 }, 367 419 }, { 368 420 .id = 0x32, 369 421 .name = "avpcarm7w", 370 422 .swgroup = TEGRA_SWGROUP_AVPC, 371 - .smmu = { 372 - .reg = 0x22c, 373 - .bit = 18, 374 - }, 375 - .la = { 376 - .reg = 0x2e4, 377 - .shift = 16, 378 - .mask = 0xff, 379 - .def = 0x80, 423 + .regs = { 424 + .smmu = { 425 + .reg = 0x22c, 426 + .bit = 18, 427 + }, 428 + .la = { 429 + .reg = 0x2e4, 430 + .shift = 16, 431 + .mask = 0xff, 432 + .def = 0x80, 433 + }, 380 434 }, 381 435 }, { 382 436 .id = 0x35, 383 437 .name = "hdaw", 384 438 .swgroup = TEGRA_SWGROUP_HDA, 385 - .smmu = { 386 - .reg = 0x22c, 387 - .bit = 21, 388 - }, 389 - .la = { 390 - .reg = 0x318, 391 - .shift = 16, 392 - .mask = 0xff, 393 - .def = 0x80, 439 + .regs = { 440 + .smmu = { 441 + .reg = 0x22c, 442 + .bit = 21, 443 + }, 444 + .la = { 445 + .reg = 0x318, 446 + .shift = 16, 447 + .mask = 0xff, 448 + .def = 0x80, 449 + }, 394 450 }, 395 451 }, { 396 452 .id = 0x36, 397 453 .name = "host1xw", 398 454 .swgroup = TEGRA_SWGROUP_HC, 399 - .smmu = { 400 - .reg = 0x22c, 401 - .bit = 22, 402 - }, 403 - .la = { 404 - .reg = 0x314, 405 - .shift = 0, 406 - .mask = 0xff, 407 - .def = 0x80, 455 + .regs = { 456 + .smmu = { 457 + .reg = 0x22c, 458 + .bit = 22, 459 + }, 460 + .la = { 461 + .reg = 0x314, 462 + .shift = 0, 463 + .mask = 0xff, 464 + .def = 0x80, 465 + }, 408 466 }, 409 467 }, { 410 468 .id = 0x38, 411 469 .name = "mpcorelpw", 412 470 .swgroup = TEGRA_SWGROUP_MPCORELP, 413 - .la = { 414 - .reg = 0x324, 415 - .shift = 16, 416 - .mask = 0xff, 417 - .def = 0x80, 471 + .regs = { 472 + .la = { 473 + .reg = 0x324, 474 + .shift = 16, 475 + .mask = 0xff, 476 + .def = 0x80, 477 + }, 418 478 }, 419 479 }, { 420 480 .id = 0x39, 421 481 .name = "mpcorew", 422 482 .swgroup = TEGRA_SWGROUP_MPCORE, 423 - .la = { 424 - .reg = 0x320, 425 - .shift = 16, 426 - .mask = 0xff, 427 - .def = 0x80, 483 + .regs = { 484 + .la = { 485 + .reg = 0x320, 486 + .shift = 16, 487 + .mask = 0xff, 488 + .def = 0x80, 489 + }, 428 490 }, 429 491 }, { 430 492 .id = 0x3b, 431 493 .name = "ppcsahbdmaw", 432 494 .swgroup = TEGRA_SWGROUP_PPCS, 433 - .smmu = { 434 - .reg = 0x22c, 435 - .bit = 27, 436 - }, 437 - .la = { 438 - .reg = 0x348, 439 - .shift = 0, 440 - .mask = 0xff, 441 - .def = 0x80, 495 + .regs = { 496 + .smmu = { 497 + .reg = 0x22c, 498 + .bit = 27, 499 + }, 500 + .la = { 501 + .reg = 0x348, 502 + .shift = 0, 503 + .mask = 0xff, 504 + .def = 0x80, 505 + }, 442 506 }, 443 507 }, { 444 508 .id = 0x3c, 445 509 .name = "ppcsahbslvw", 446 510 .swgroup = TEGRA_SWGROUP_PPCS, 447 - .smmu = { 448 - .reg = 0x22c, 449 - .bit = 28, 450 - }, 451 - .la = { 452 - .reg = 0x348, 453 - .shift = 16, 454 - .mask = 0xff, 455 - .def = 0x80, 511 + .regs = { 512 + .smmu = { 513 + .reg = 0x22c, 514 + .bit = 28, 515 + }, 516 + .la = { 517 + .reg = 0x348, 518 + .shift = 16, 519 + .mask = 0xff, 520 + .def = 0x80, 521 + }, 456 522 }, 457 523 }, { 458 524 .id = 0x3d, 459 525 .name = "sataw", 460 526 .swgroup = TEGRA_SWGROUP_SATA, 461 - .smmu = { 462 - .reg = 0x22c, 463 - .bit = 29, 464 - }, 465 - .la = { 466 - .reg = 0x350, 467 - .shift = 16, 468 - .mask = 0xff, 469 - .def = 0x65, 527 + .regs = { 528 + .smmu = { 529 + .reg = 0x22c, 530 + .bit = 29, 531 + }, 532 + .la = { 533 + .reg = 0x350, 534 + .shift = 16, 535 + .mask = 0xff, 536 + .def = 0x65, 537 + }, 470 538 }, 471 539 }, { 472 540 .id = 0x3e, 473 541 .name = "vdebsevw", 474 542 .swgroup = TEGRA_SWGROUP_VDE, 475 - .smmu = { 476 - .reg = 0x22c, 477 - .bit = 30, 478 - }, 479 - .la = { 480 - .reg = 0x35c, 481 - .shift = 0, 482 - .mask = 0xff, 483 - .def = 0x80, 543 + .regs = { 544 + .smmu = { 545 + .reg = 0x22c, 546 + .bit = 30, 547 + }, 548 + .la = { 549 + .reg = 0x35c, 550 + .shift = 0, 551 + .mask = 0xff, 552 + .def = 0x80, 553 + }, 484 554 }, 485 555 }, { 486 556 .id = 0x3f, 487 557 .name = "vdedbgw", 488 558 .swgroup = TEGRA_SWGROUP_VDE, 489 - .smmu = { 490 - .reg = 0x22c, 491 - .bit = 31, 492 - }, 493 - .la = { 494 - .reg = 0x35c, 495 - .shift = 16, 496 - .mask = 0xff, 497 - .def = 0x80, 559 + .regs = { 560 + .smmu = { 561 + .reg = 0x22c, 562 + .bit = 31, 563 + }, 564 + .la = { 565 + .reg = 0x35c, 566 + .shift = 16, 567 + .mask = 0xff, 568 + .def = 0x80, 569 + }, 498 570 }, 499 571 }, { 500 572 .id = 0x40, 501 573 .name = "vdembew", 502 574 .swgroup = TEGRA_SWGROUP_VDE, 503 - .smmu = { 504 - .reg = 0x230, 505 - .bit = 0, 506 - }, 507 - .la = { 508 - .reg = 0x360, 509 - .shift = 0, 510 - .mask = 0xff, 511 - .def = 0x80, 575 + .regs = { 576 + .smmu = { 577 + .reg = 0x230, 578 + .bit = 0, 579 + }, 580 + .la = { 581 + .reg = 0x360, 582 + .shift = 0, 583 + .mask = 0xff, 584 + .def = 0x80, 585 + }, 512 586 }, 513 587 }, { 514 588 .id = 0x41, 515 589 .name = "vdetpmw", 516 590 .swgroup = TEGRA_SWGROUP_VDE, 517 - .smmu = { 518 - .reg = 0x230, 519 - .bit = 1, 520 - }, 521 - .la = { 522 - .reg = 0x360, 523 - .shift = 16, 524 - .mask = 0xff, 525 - .def = 0x80, 591 + .regs = { 592 + .smmu = { 593 + .reg = 0x230, 594 + .bit = 1, 595 + }, 596 + .la = { 597 + .reg = 0x360, 598 + .shift = 16, 599 + .mask = 0xff, 600 + .def = 0x80, 601 + }, 526 602 }, 527 603 }, { 528 604 .id = 0x44, 529 605 .name = "ispra", 530 606 .swgroup = TEGRA_SWGROUP_ISP2, 531 - .smmu = { 532 - .reg = 0x230, 533 - .bit = 4, 534 - }, 535 - .la = { 536 - .reg = 0x370, 537 - .shift = 0, 538 - .mask = 0xff, 539 - .def = 0x18, 607 + .regs = { 608 + .smmu = { 609 + .reg = 0x230, 610 + .bit = 4, 611 + }, 612 + .la = { 613 + .reg = 0x370, 614 + .shift = 0, 615 + .mask = 0xff, 616 + .def = 0x18, 617 + }, 540 618 }, 541 619 }, { 542 620 .id = 0x46, 543 621 .name = "ispwa", 544 622 .swgroup = TEGRA_SWGROUP_ISP2, 545 - .smmu = { 546 - .reg = 0x230, 547 - .bit = 6, 548 - }, 549 - .la = { 550 - .reg = 0x374, 551 - .shift = 0, 552 - .mask = 0xff, 553 - .def = 0x80, 623 + .regs = { 624 + .smmu = { 625 + .reg = 0x230, 626 + .bit = 6, 627 + }, 628 + .la = { 629 + .reg = 0x374, 630 + .shift = 0, 631 + .mask = 0xff, 632 + .def = 0x80, 633 + }, 554 634 }, 555 635 }, { 556 636 .id = 0x47, 557 637 .name = "ispwb", 558 638 .swgroup = TEGRA_SWGROUP_ISP2, 559 - .smmu = { 560 - .reg = 0x230, 561 - .bit = 7, 562 - }, 563 - .la = { 564 - .reg = 0x374, 565 - .shift = 16, 566 - .mask = 0xff, 567 - .def = 0x80, 639 + .regs = { 640 + .smmu = { 641 + .reg = 0x230, 642 + .bit = 7, 643 + }, 644 + .la = { 645 + .reg = 0x374, 646 + .shift = 16, 647 + .mask = 0xff, 648 + .def = 0x80, 649 + }, 568 650 }, 569 651 }, { 570 652 .id = 0x4a, 571 653 .name = "xusb_hostr", 572 654 .swgroup = TEGRA_SWGROUP_XUSB_HOST, 573 - .smmu = { 574 - .reg = 0x230, 575 - .bit = 10, 576 - }, 577 - .la = { 578 - .reg = 0x37c, 579 - .shift = 0, 580 - .mask = 0xff, 581 - .def = 0x39, 655 + .regs = { 656 + .smmu = { 657 + .reg = 0x230, 658 + .bit = 10, 659 + }, 660 + .la = { 661 + .reg = 0x37c, 662 + .shift = 0, 663 + .mask = 0xff, 664 + .def = 0x39, 665 + }, 582 666 }, 583 667 }, { 584 668 .id = 0x4b, 585 669 .name = "xusb_hostw", 586 670 .swgroup = TEGRA_SWGROUP_XUSB_HOST, 587 - .smmu = { 588 - .reg = 0x230, 589 - .bit = 11, 590 - }, 591 - .la = { 592 - .reg = 0x37c, 593 - .shift = 16, 594 - .mask = 0xff, 595 - .def = 0x80, 671 + .regs = { 672 + .smmu = { 673 + .reg = 0x230, 674 + .bit = 11, 675 + }, 676 + .la = { 677 + .reg = 0x37c, 678 + .shift = 16, 679 + .mask = 0xff, 680 + .def = 0x80, 681 + }, 596 682 }, 597 683 }, { 598 684 .id = 0x4c, 599 685 .name = "xusb_devr", 600 686 .swgroup = TEGRA_SWGROUP_XUSB_DEV, 601 - .smmu = { 602 - .reg = 0x230, 603 - .bit = 12, 604 - }, 605 - .la = { 606 - .reg = 0x380, 607 - .shift = 0, 608 - .mask = 0xff, 609 - .def = 0x39, 687 + .regs = { 688 + .smmu = { 689 + .reg = 0x230, 690 + .bit = 12, 691 + }, 692 + .la = { 693 + .reg = 0x380, 694 + .shift = 0, 695 + .mask = 0xff, 696 + .def = 0x39, 697 + }, 610 698 }, 611 699 }, { 612 700 .id = 0x4d, 613 701 .name = "xusb_devw", 614 702 .swgroup = TEGRA_SWGROUP_XUSB_DEV, 615 - .smmu = { 616 - .reg = 0x230, 617 - .bit = 13, 618 - }, 619 - .la = { 620 - .reg = 0x380, 621 - .shift = 16, 622 - .mask = 0xff, 623 - .def = 0x80, 703 + .regs = { 704 + .smmu = { 705 + .reg = 0x230, 706 + .bit = 13, 707 + }, 708 + .la = { 709 + .reg = 0x380, 710 + .shift = 16, 711 + .mask = 0xff, 712 + .def = 0x80, 713 + }, 624 714 }, 625 715 }, { 626 716 .id = 0x4e, 627 717 .name = "isprab", 628 718 .swgroup = TEGRA_SWGROUP_ISP2B, 629 - .smmu = { 630 - .reg = 0x230, 631 - .bit = 14, 632 - }, 633 - .la = { 634 - .reg = 0x384, 635 - .shift = 0, 636 - .mask = 0xff, 637 - .def = 0x18, 719 + .regs = { 720 + .smmu = { 721 + .reg = 0x230, 722 + .bit = 14, 723 + }, 724 + .la = { 725 + .reg = 0x384, 726 + .shift = 0, 727 + .mask = 0xff, 728 + .def = 0x18, 729 + }, 638 730 }, 639 731 }, { 640 732 .id = 0x50, 641 733 .name = "ispwab", 642 734 .swgroup = TEGRA_SWGROUP_ISP2B, 643 - .smmu = { 644 - .reg = 0x230, 645 - .bit = 16, 646 - }, 647 - .la = { 648 - .reg = 0x388, 649 - .shift = 0, 650 - .mask = 0xff, 651 - .def = 0x80, 735 + .regs = { 736 + .smmu = { 737 + .reg = 0x230, 738 + .bit = 16, 739 + }, 740 + .la = { 741 + .reg = 0x388, 742 + .shift = 0, 743 + .mask = 0xff, 744 + .def = 0x80, 745 + }, 652 746 }, 653 747 }, { 654 748 .id = 0x51, 655 749 .name = "ispwbb", 656 750 .swgroup = TEGRA_SWGROUP_ISP2B, 657 - .smmu = { 658 - .reg = 0x230, 659 - .bit = 17, 660 - }, 661 - .la = { 662 - .reg = 0x388, 663 - .shift = 16, 664 - .mask = 0xff, 665 - .def = 0x80, 751 + .regs = { 752 + .smmu = { 753 + .reg = 0x230, 754 + .bit = 17, 755 + }, 756 + .la = { 757 + .reg = 0x388, 758 + .shift = 16, 759 + .mask = 0xff, 760 + .def = 0x80, 761 + }, 666 762 }, 667 763 }, { 668 764 .id = 0x54, 669 765 .name = "tsecsrd", 670 766 .swgroup = TEGRA_SWGROUP_TSEC, 671 - .smmu = { 672 - .reg = 0x230, 673 - .bit = 20, 674 - }, 675 - .la = { 676 - .reg = 0x390, 677 - .shift = 0, 678 - .mask = 0xff, 679 - .def = 0x9b, 767 + .regs = { 768 + .smmu = { 769 + .reg = 0x230, 770 + .bit = 20, 771 + }, 772 + .la = { 773 + .reg = 0x390, 774 + .shift = 0, 775 + .mask = 0xff, 776 + .def = 0x9b, 777 + }, 680 778 }, 681 779 }, { 682 780 .id = 0x55, 683 781 .name = "tsecswr", 684 782 .swgroup = TEGRA_SWGROUP_TSEC, 685 - .smmu = { 686 - .reg = 0x230, 687 - .bit = 21, 688 - }, 689 - .la = { 690 - .reg = 0x390, 691 - .shift = 16, 692 - .mask = 0xff, 693 - .def = 0x80, 783 + .regs = { 784 + .smmu = { 785 + .reg = 0x230, 786 + .bit = 21, 787 + }, 788 + .la = { 789 + .reg = 0x390, 790 + .shift = 16, 791 + .mask = 0xff, 792 + .def = 0x80, 793 + }, 694 794 }, 695 795 }, { 696 796 .id = 0x56, 697 797 .name = "a9avpscr", 698 798 .swgroup = TEGRA_SWGROUP_A9AVP, 699 - .smmu = { 700 - .reg = 0x230, 701 - .bit = 22, 702 - }, 703 - .la = { 704 - .reg = 0x3a4, 705 - .shift = 0, 706 - .mask = 0xff, 707 - .def = 0x04, 799 + .regs = { 800 + .smmu = { 801 + .reg = 0x230, 802 + .bit = 22, 803 + }, 804 + .la = { 805 + .reg = 0x3a4, 806 + .shift = 0, 807 + .mask = 0xff, 808 + .def = 0x04, 809 + }, 708 810 }, 709 811 }, { 710 812 .id = 0x57, 711 813 .name = "a9avpscw", 712 814 .swgroup = TEGRA_SWGROUP_A9AVP, 713 - .smmu = { 714 - .reg = 0x230, 715 - .bit = 23, 716 - }, 717 - .la = { 718 - .reg = 0x3a4, 719 - .shift = 16, 720 - .mask = 0xff, 721 - .def = 0x80, 815 + .regs = { 816 + .smmu = { 817 + .reg = 0x230, 818 + .bit = 23, 819 + }, 820 + .la = { 821 + .reg = 0x3a4, 822 + .shift = 16, 823 + .mask = 0xff, 824 + .def = 0x80, 825 + }, 722 826 }, 723 827 }, { 724 828 .id = 0x58, 725 829 .name = "gpusrd", 726 830 .swgroup = TEGRA_SWGROUP_GPU, 727 - .smmu = { 728 - /* read-only */ 729 - .reg = 0x230, 730 - .bit = 24, 731 - }, 732 - .la = { 733 - .reg = 0x3c8, 734 - .shift = 0, 735 - .mask = 0xff, 736 - .def = 0x1a, 831 + .regs = { 832 + .smmu = { 833 + /* read-only */ 834 + .reg = 0x230, 835 + .bit = 24, 836 + }, 837 + .la = { 838 + .reg = 0x3c8, 839 + .shift = 0, 840 + .mask = 0xff, 841 + .def = 0x1a, 842 + }, 737 843 }, 738 844 }, { 739 845 .id = 0x59, 740 846 .name = "gpuswr", 741 847 .swgroup = TEGRA_SWGROUP_GPU, 742 - .smmu = { 743 - /* read-only */ 744 - .reg = 0x230, 745 - .bit = 25, 746 - }, 747 - .la = { 748 - .reg = 0x3c8, 749 - .shift = 16, 750 - .mask = 0xff, 751 - .def = 0x80, 848 + .regs = { 849 + .smmu = { 850 + /* read-only */ 851 + .reg = 0x230, 852 + .bit = 25, 853 + }, 854 + .la = { 855 + .reg = 0x3c8, 856 + .shift = 16, 857 + .mask = 0xff, 858 + .def = 0x80, 859 + }, 752 860 }, 753 861 }, { 754 862 .id = 0x5a, 755 863 .name = "displayt", 756 864 .swgroup = TEGRA_SWGROUP_DC, 757 - .smmu = { 758 - .reg = 0x230, 759 - .bit = 26, 760 - }, 761 - .la = { 762 - .reg = 0x2f0, 763 - .shift = 16, 764 - .mask = 0xff, 765 - .def = 0x50, 865 + .regs = { 866 + .smmu = { 867 + .reg = 0x230, 868 + .bit = 26, 869 + }, 870 + .la = { 871 + .reg = 0x2f0, 872 + .shift = 16, 873 + .mask = 0xff, 874 + .def = 0x50, 875 + }, 766 876 }, 767 877 }, { 768 878 .id = 0x60, 769 879 .name = "sdmmcra", 770 880 .swgroup = TEGRA_SWGROUP_SDMMC1A, 771 - .smmu = { 772 - .reg = 0x234, 773 - .bit = 0, 774 - }, 775 - .la = { 776 - .reg = 0x3b8, 777 - .shift = 0, 778 - .mask = 0xff, 779 - .def = 0x49, 881 + .regs = { 882 + .smmu = { 883 + .reg = 0x234, 884 + .bit = 0, 885 + }, 886 + .la = { 887 + .reg = 0x3b8, 888 + .shift = 0, 889 + .mask = 0xff, 890 + .def = 0x49, 891 + }, 780 892 }, 781 893 }, { 782 894 .id = 0x61, 783 895 .name = "sdmmcraa", 784 896 .swgroup = TEGRA_SWGROUP_SDMMC2A, 785 - .smmu = { 786 - .reg = 0x234, 787 - .bit = 1, 788 - }, 789 - .la = { 790 - .reg = 0x3bc, 791 - .shift = 0, 792 - .mask = 0xff, 793 - .def = 0x49, 897 + .regs = { 898 + .smmu = { 899 + .reg = 0x234, 900 + .bit = 1, 901 + }, 902 + .la = { 903 + .reg = 0x3bc, 904 + .shift = 0, 905 + .mask = 0xff, 906 + .def = 0x49, 907 + }, 794 908 }, 795 909 }, { 796 910 .id = 0x62, 797 911 .name = "sdmmcr", 798 912 .swgroup = TEGRA_SWGROUP_SDMMC3A, 799 - .smmu = { 800 - .reg = 0x234, 801 - .bit = 2, 802 - }, 803 - .la = { 804 - .reg = 0x3c0, 805 - .shift = 0, 806 - .mask = 0xff, 807 - .def = 0x49, 913 + .regs = { 914 + .smmu = { 915 + .reg = 0x234, 916 + .bit = 2, 917 + }, 918 + .la = { 919 + .reg = 0x3c0, 920 + .shift = 0, 921 + .mask = 0xff, 922 + .def = 0x49, 923 + }, 808 924 }, 809 925 }, { 810 926 .id = 0x63, 811 927 .swgroup = TEGRA_SWGROUP_SDMMC4A, 812 928 .name = "sdmmcrab", 813 - .smmu = { 814 - .reg = 0x234, 815 - .bit = 3, 816 - }, 817 - .la = { 818 - .reg = 0x3c4, 819 - .shift = 0, 820 - .mask = 0xff, 821 - .def = 0x49, 929 + .regs = { 930 + .smmu = { 931 + .reg = 0x234, 932 + .bit = 3, 933 + }, 934 + .la = { 935 + .reg = 0x3c4, 936 + .shift = 0, 937 + .mask = 0xff, 938 + .def = 0x49, 939 + }, 822 940 }, 823 941 }, { 824 942 .id = 0x64, 825 943 .name = "sdmmcwa", 826 944 .swgroup = TEGRA_SWGROUP_SDMMC1A, 827 - .smmu = { 828 - .reg = 0x234, 829 - .bit = 4, 830 - }, 831 - .la = { 832 - .reg = 0x3b8, 833 - .shift = 16, 834 - .mask = 0xff, 835 - .def = 0x80, 945 + .regs = { 946 + .smmu = { 947 + .reg = 0x234, 948 + .bit = 4, 949 + }, 950 + .la = { 951 + .reg = 0x3b8, 952 + .shift = 16, 953 + .mask = 0xff, 954 + .def = 0x80, 955 + }, 836 956 }, 837 957 }, { 838 958 .id = 0x65, 839 959 .name = "sdmmcwaa", 840 960 .swgroup = TEGRA_SWGROUP_SDMMC2A, 841 - .smmu = { 842 - .reg = 0x234, 843 - .bit = 5, 844 - }, 845 - .la = { 846 - .reg = 0x3bc, 847 - .shift = 16, 848 - .mask = 0xff, 849 - .def = 0x80, 961 + .regs = { 962 + .smmu = { 963 + .reg = 0x234, 964 + .bit = 5, 965 + }, 966 + .la = { 967 + .reg = 0x3bc, 968 + .shift = 16, 969 + .mask = 0xff, 970 + .def = 0x80, 971 + }, 850 972 }, 851 973 }, { 852 974 .id = 0x66, 853 975 .name = "sdmmcw", 854 976 .swgroup = TEGRA_SWGROUP_SDMMC3A, 855 - .smmu = { 856 - .reg = 0x234, 857 - .bit = 6, 858 - }, 859 - .la = { 860 - .reg = 0x3c0, 861 - .shift = 16, 862 - .mask = 0xff, 863 - .def = 0x80, 977 + .regs = { 978 + .smmu = { 979 + .reg = 0x234, 980 + .bit = 6, 981 + }, 982 + .la = { 983 + .reg = 0x3c0, 984 + .shift = 16, 985 + .mask = 0xff, 986 + .def = 0x80, 987 + }, 864 988 }, 865 989 }, { 866 990 .id = 0x67, 867 991 .name = "sdmmcwab", 868 992 .swgroup = TEGRA_SWGROUP_SDMMC4A, 869 - .smmu = { 870 - .reg = 0x234, 871 - .bit = 7, 872 - }, 873 - .la = { 874 - .reg = 0x3c4, 875 - .shift = 16, 876 - .mask = 0xff, 877 - .def = 0x80, 993 + .regs = { 994 + .smmu = { 995 + .reg = 0x234, 996 + .bit = 7, 997 + }, 998 + .la = { 999 + .reg = 0x3c4, 1000 + .shift = 16, 1001 + .mask = 0xff, 1002 + .def = 0x80, 1003 + }, 878 1004 }, 879 1005 }, { 880 1006 .id = 0x6c, 881 1007 .name = "vicsrd", 882 1008 .swgroup = TEGRA_SWGROUP_VIC, 883 - .smmu = { 884 - .reg = 0x234, 885 - .bit = 12, 886 - }, 887 - .la = { 888 - .reg = 0x394, 889 - .shift = 0, 890 - .mask = 0xff, 891 - .def = 0x1a, 1009 + .regs = { 1010 + .smmu = { 1011 + .reg = 0x234, 1012 + .bit = 12, 1013 + }, 1014 + .la = { 1015 + .reg = 0x394, 1016 + .shift = 0, 1017 + .mask = 0xff, 1018 + .def = 0x1a, 1019 + }, 892 1020 }, 893 1021 }, { 894 1022 .id = 0x6d, 895 1023 .name = "vicswr", 896 1024 .swgroup = TEGRA_SWGROUP_VIC, 897 - .smmu = { 898 - .reg = 0x234, 899 - .bit = 13, 900 - }, 901 - .la = { 902 - .reg = 0x394, 903 - .shift = 16, 904 - .mask = 0xff, 905 - .def = 0x80, 1025 + .regs = { 1026 + .smmu = { 1027 + .reg = 0x234, 1028 + .bit = 13, 1029 + }, 1030 + .la = { 1031 + .reg = 0x394, 1032 + .shift = 16, 1033 + .mask = 0xff, 1034 + .def = 0x80, 1035 + }, 906 1036 }, 907 1037 }, { 908 1038 .id = 0x72, 909 1039 .name = "viw", 910 1040 .swgroup = TEGRA_SWGROUP_VI, 911 - .smmu = { 912 - .reg = 0x234, 913 - .bit = 18, 914 - }, 915 - .la = { 916 - .reg = 0x398, 917 - .shift = 0, 918 - .mask = 0xff, 919 - .def = 0x80, 1041 + .regs = { 1042 + .smmu = { 1043 + .reg = 0x234, 1044 + .bit = 18, 1045 + }, 1046 + .la = { 1047 + .reg = 0x398, 1048 + .shift = 0, 1049 + .mask = 0xff, 1050 + .def = 0x80, 1051 + }, 920 1052 }, 921 1053 }, { 922 1054 .id = 0x73, 923 1055 .name = "displayd", 924 1056 .swgroup = TEGRA_SWGROUP_DC, 925 - .smmu = { 926 - .reg = 0x234, 927 - .bit = 19, 928 - }, 929 - .la = { 930 - .reg = 0x3c8, 931 - .shift = 0, 932 - .mask = 0xff, 933 - .def = 0x50, 1057 + .regs = { 1058 + .smmu = { 1059 + .reg = 0x234, 1060 + .bit = 19, 1061 + }, 1062 + .la = { 1063 + .reg = 0x3c8, 1064 + .shift = 0, 1065 + .mask = 0xff, 1066 + .def = 0x50, 1067 + }, 934 1068 }, 935 1069 }, 936 1070 }; ··· 1274 1140 .resets = tegra124_mc_resets, 1275 1141 .num_resets = ARRAY_SIZE(tegra124_mc_resets), 1276 1142 .icc_ops = &tegra124_mc_icc_ops, 1143 + .ops = &tegra30_mc_ops, 1277 1144 }; 1278 1145 #endif /* CONFIG_ARCH_TEGRA_124_SOC */ 1279 1146 ··· 1306 1171 .resets = tegra124_mc_resets, 1307 1172 .num_resets = ARRAY_SIZE(tegra124_mc_resets), 1308 1173 .icc_ops = &tegra124_mc_icc_ops, 1174 + .ops = &tegra30_mc_ops, 1309 1175 }; 1310 1176 #endif /* CONFIG_ARCH_TEGRA_132_SOC */
+818 -1545
drivers/memory/tegra/tegra186.c
··· 1 1 // SPDX-License-Identifier: GPL-2.0-only 2 2 /* 3 - * Copyright (C) 2017 NVIDIA CORPORATION. All rights reserved. 3 + * Copyright (C) 2017-2021 NVIDIA CORPORATION. All rights reserved. 4 4 */ 5 5 6 6 #include <linux/io.h> 7 + #include <linux/iommu.h> 7 8 #include <linux/module.h> 8 9 #include <linux/mod_devicetable.h> 9 10 #include <linux/of_device.h> 10 11 #include <linux/platform_device.h> 11 12 13 + #include <soc/tegra/mc.h> 14 + 12 15 #if defined(CONFIG_ARCH_TEGRA_186_SOC) 13 16 #include <dt-bindings/memory/tegra186-mc.h> 14 17 #endif 15 18 16 - #if defined(CONFIG_ARCH_TEGRA_194_SOC) 17 - #include <dt-bindings/memory/tegra194-mc.h> 18 - #endif 19 + #define MC_SID_STREAMID_OVERRIDE_MASK GENMASK(7, 0) 20 + #define MC_SID_STREAMID_SECURITY_WRITE_ACCESS_DISABLED BIT(16) 21 + #define MC_SID_STREAMID_SECURITY_OVERRIDE BIT(8) 19 22 20 - struct tegra186_mc_client { 21 - const char *name; 22 - unsigned int sid; 23 - struct { 24 - unsigned int override; 25 - unsigned int security; 26 - } regs; 27 - }; 28 - 29 - struct tegra186_mc_soc { 30 - const struct tegra186_mc_client *clients; 31 - unsigned int num_clients; 32 - }; 33 - 34 - struct tegra186_mc { 35 - struct device *dev; 36 - void __iomem *regs; 37 - 38 - const struct tegra186_mc_soc *soc; 39 - }; 40 - 41 - static void tegra186_mc_program_sid(struct tegra186_mc *mc) 23 + static void tegra186_mc_program_sid(struct tegra_mc *mc) 42 24 { 43 25 unsigned int i; 44 26 45 27 for (i = 0; i < mc->soc->num_clients; i++) { 46 - const struct tegra186_mc_client *client = &mc->soc->clients[i]; 28 + const struct tegra_mc_client *client = &mc->soc->clients[i]; 47 29 u32 override, security; 48 30 49 - override = readl(mc->regs + client->regs.override); 50 - security = readl(mc->regs + client->regs.security); 31 + override = readl(mc->regs + client->regs.sid.override); 32 + security = readl(mc->regs + client->regs.sid.security); 51 33 52 34 dev_dbg(mc->dev, "client %s: override: %x security: %x\n", 53 35 client->name, override, security); 54 36 55 37 dev_dbg(mc->dev, "setting SID %u for %s\n", client->sid, 56 38 client->name); 57 - writel(client->sid, mc->regs + client->regs.override); 39 + writel(client->sid, mc->regs + client->regs.sid.override); 58 40 59 - override = readl(mc->regs + client->regs.override); 60 - security = readl(mc->regs + client->regs.security); 41 + override = readl(mc->regs + client->regs.sid.override); 42 + security = readl(mc->regs + client->regs.sid.security); 61 43 62 44 dev_dbg(mc->dev, "client %s: override: %x security: %x\n", 63 45 client->name, override, security); 64 46 } 65 47 } 66 48 67 - #if defined(CONFIG_ARCH_TEGRA_186_SOC) 68 - static const struct tegra186_mc_client tegra186_mc_clients[] = { 69 - { 70 - .name = "ptcr", 71 - .sid = TEGRA186_SID_PASSTHROUGH, 72 - .regs = { 73 - .override = 0x000, 74 - .security = 0x004, 75 - }, 76 - }, { 77 - .name = "afir", 78 - .sid = TEGRA186_SID_AFI, 79 - .regs = { 80 - .override = 0x070, 81 - .security = 0x074, 82 - }, 83 - }, { 84 - .name = "hdar", 85 - .sid = TEGRA186_SID_HDA, 86 - .regs = { 87 - .override = 0x0a8, 88 - .security = 0x0ac, 89 - }, 90 - }, { 91 - .name = "host1xdmar", 92 - .sid = TEGRA186_SID_HOST1X, 93 - .regs = { 94 - .override = 0x0b0, 95 - .security = 0x0b4, 96 - }, 97 - }, { 98 - .name = "nvencsrd", 99 - .sid = TEGRA186_SID_NVENC, 100 - .regs = { 101 - .override = 0x0e0, 102 - .security = 0x0e4, 103 - }, 104 - }, { 105 - .name = "satar", 106 - .sid = TEGRA186_SID_SATA, 107 - .regs = { 108 - .override = 0x0f8, 109 - .security = 0x0fc, 110 - }, 111 - }, { 112 - .name = "mpcorer", 113 - .sid = TEGRA186_SID_PASSTHROUGH, 114 - .regs = { 115 - .override = 0x138, 116 - .security = 0x13c, 117 - }, 118 - }, { 119 - .name = "nvencswr", 120 - .sid = TEGRA186_SID_NVENC, 121 - .regs = { 122 - .override = 0x158, 123 - .security = 0x15c, 124 - }, 125 - }, { 126 - .name = "afiw", 127 - .sid = TEGRA186_SID_AFI, 128 - .regs = { 129 - .override = 0x188, 130 - .security = 0x18c, 131 - }, 132 - }, { 133 - .name = "hdaw", 134 - .sid = TEGRA186_SID_HDA, 135 - .regs = { 136 - .override = 0x1a8, 137 - .security = 0x1ac, 138 - }, 139 - }, { 140 - .name = "mpcorew", 141 - .sid = TEGRA186_SID_PASSTHROUGH, 142 - .regs = { 143 - .override = 0x1c8, 144 - .security = 0x1cc, 145 - }, 146 - }, { 147 - .name = "sataw", 148 - .sid = TEGRA186_SID_SATA, 149 - .regs = { 150 - .override = 0x1e8, 151 - .security = 0x1ec, 152 - }, 153 - }, { 154 - .name = "ispra", 155 - .sid = TEGRA186_SID_ISP, 156 - .regs = { 157 - .override = 0x220, 158 - .security = 0x224, 159 - }, 160 - }, { 161 - .name = "ispwa", 162 - .sid = TEGRA186_SID_ISP, 163 - .regs = { 164 - .override = 0x230, 165 - .security = 0x234, 166 - }, 167 - }, { 168 - .name = "ispwb", 169 - .sid = TEGRA186_SID_ISP, 170 - .regs = { 171 - .override = 0x238, 172 - .security = 0x23c, 173 - }, 174 - }, { 175 - .name = "xusb_hostr", 176 - .sid = TEGRA186_SID_XUSB_HOST, 177 - .regs = { 178 - .override = 0x250, 179 - .security = 0x254, 180 - }, 181 - }, { 182 - .name = "xusb_hostw", 183 - .sid = TEGRA186_SID_XUSB_HOST, 184 - .regs = { 185 - .override = 0x258, 186 - .security = 0x25c, 187 - }, 188 - }, { 189 - .name = "xusb_devr", 190 - .sid = TEGRA186_SID_XUSB_DEV, 191 - .regs = { 192 - .override = 0x260, 193 - .security = 0x264, 194 - }, 195 - }, { 196 - .name = "xusb_devw", 197 - .sid = TEGRA186_SID_XUSB_DEV, 198 - .regs = { 199 - .override = 0x268, 200 - .security = 0x26c, 201 - }, 202 - }, { 203 - .name = "tsecsrd", 204 - .sid = TEGRA186_SID_TSEC, 205 - .regs = { 206 - .override = 0x2a0, 207 - .security = 0x2a4, 208 - }, 209 - }, { 210 - .name = "tsecswr", 211 - .sid = TEGRA186_SID_TSEC, 212 - .regs = { 213 - .override = 0x2a8, 214 - .security = 0x2ac, 215 - }, 216 - }, { 217 - .name = "gpusrd", 218 - .sid = TEGRA186_SID_GPU, 219 - .regs = { 220 - .override = 0x2c0, 221 - .security = 0x2c4, 222 - }, 223 - }, { 224 - .name = "gpuswr", 225 - .sid = TEGRA186_SID_GPU, 226 - .regs = { 227 - .override = 0x2c8, 228 - .security = 0x2cc, 229 - }, 230 - }, { 231 - .name = "sdmmcra", 232 - .sid = TEGRA186_SID_SDMMC1, 233 - .regs = { 234 - .override = 0x300, 235 - .security = 0x304, 236 - }, 237 - }, { 238 - .name = "sdmmcraa", 239 - .sid = TEGRA186_SID_SDMMC2, 240 - .regs = { 241 - .override = 0x308, 242 - .security = 0x30c, 243 - }, 244 - }, { 245 - .name = "sdmmcr", 246 - .sid = TEGRA186_SID_SDMMC3, 247 - .regs = { 248 - .override = 0x310, 249 - .security = 0x314, 250 - }, 251 - }, { 252 - .name = "sdmmcrab", 253 - .sid = TEGRA186_SID_SDMMC4, 254 - .regs = { 255 - .override = 0x318, 256 - .security = 0x31c, 257 - }, 258 - }, { 259 - .name = "sdmmcwa", 260 - .sid = TEGRA186_SID_SDMMC1, 261 - .regs = { 262 - .override = 0x320, 263 - .security = 0x324, 264 - }, 265 - }, { 266 - .name = "sdmmcwaa", 267 - .sid = TEGRA186_SID_SDMMC2, 268 - .regs = { 269 - .override = 0x328, 270 - .security = 0x32c, 271 - }, 272 - }, { 273 - .name = "sdmmcw", 274 - .sid = TEGRA186_SID_SDMMC3, 275 - .regs = { 276 - .override = 0x330, 277 - .security = 0x334, 278 - }, 279 - }, { 280 - .name = "sdmmcwab", 281 - .sid = TEGRA186_SID_SDMMC4, 282 - .regs = { 283 - .override = 0x338, 284 - .security = 0x33c, 285 - }, 286 - }, { 287 - .name = "vicsrd", 288 - .sid = TEGRA186_SID_VIC, 289 - .regs = { 290 - .override = 0x360, 291 - .security = 0x364, 292 - }, 293 - }, { 294 - .name = "vicswr", 295 - .sid = TEGRA186_SID_VIC, 296 - .regs = { 297 - .override = 0x368, 298 - .security = 0x36c, 299 - }, 300 - }, { 301 - .name = "viw", 302 - .sid = TEGRA186_SID_VI, 303 - .regs = { 304 - .override = 0x390, 305 - .security = 0x394, 306 - }, 307 - }, { 308 - .name = "nvdecsrd", 309 - .sid = TEGRA186_SID_NVDEC, 310 - .regs = { 311 - .override = 0x3c0, 312 - .security = 0x3c4, 313 - }, 314 - }, { 315 - .name = "nvdecswr", 316 - .sid = TEGRA186_SID_NVDEC, 317 - .regs = { 318 - .override = 0x3c8, 319 - .security = 0x3cc, 320 - }, 321 - }, { 322 - .name = "aper", 323 - .sid = TEGRA186_SID_APE, 324 - .regs = { 325 - .override = 0x3d0, 326 - .security = 0x3d4, 327 - }, 328 - }, { 329 - .name = "apew", 330 - .sid = TEGRA186_SID_APE, 331 - .regs = { 332 - .override = 0x3d8, 333 - .security = 0x3dc, 334 - }, 335 - }, { 336 - .name = "nvjpgsrd", 337 - .sid = TEGRA186_SID_NVJPG, 338 - .regs = { 339 - .override = 0x3f0, 340 - .security = 0x3f4, 341 - }, 342 - }, { 343 - .name = "nvjpgswr", 344 - .sid = TEGRA186_SID_NVJPG, 345 - .regs = { 346 - .override = 0x3f8, 347 - .security = 0x3fc, 348 - }, 349 - }, { 350 - .name = "sesrd", 351 - .sid = TEGRA186_SID_SE, 352 - .regs = { 353 - .override = 0x400, 354 - .security = 0x404, 355 - }, 356 - }, { 357 - .name = "seswr", 358 - .sid = TEGRA186_SID_SE, 359 - .regs = { 360 - .override = 0x408, 361 - .security = 0x40c, 362 - }, 363 - }, { 364 - .name = "etrr", 365 - .sid = TEGRA186_SID_ETR, 366 - .regs = { 367 - .override = 0x420, 368 - .security = 0x424, 369 - }, 370 - }, { 371 - .name = "etrw", 372 - .sid = TEGRA186_SID_ETR, 373 - .regs = { 374 - .override = 0x428, 375 - .security = 0x42c, 376 - }, 377 - }, { 378 - .name = "tsecsrdb", 379 - .sid = TEGRA186_SID_TSECB, 380 - .regs = { 381 - .override = 0x430, 382 - .security = 0x434, 383 - }, 384 - }, { 385 - .name = "tsecswrb", 386 - .sid = TEGRA186_SID_TSECB, 387 - .regs = { 388 - .override = 0x438, 389 - .security = 0x43c, 390 - }, 391 - }, { 392 - .name = "gpusrd2", 393 - .sid = TEGRA186_SID_GPU, 394 - .regs = { 395 - .override = 0x440, 396 - .security = 0x444, 397 - }, 398 - }, { 399 - .name = "gpuswr2", 400 - .sid = TEGRA186_SID_GPU, 401 - .regs = { 402 - .override = 0x448, 403 - .security = 0x44c, 404 - }, 405 - }, { 406 - .name = "axisr", 407 - .sid = TEGRA186_SID_GPCDMA_0, 408 - .regs = { 409 - .override = 0x460, 410 - .security = 0x464, 411 - }, 412 - }, { 413 - .name = "axisw", 414 - .sid = TEGRA186_SID_GPCDMA_0, 415 - .regs = { 416 - .override = 0x468, 417 - .security = 0x46c, 418 - }, 419 - }, { 420 - .name = "eqosr", 421 - .sid = TEGRA186_SID_EQOS, 422 - .regs = { 423 - .override = 0x470, 424 - .security = 0x474, 425 - }, 426 - }, { 427 - .name = "eqosw", 428 - .sid = TEGRA186_SID_EQOS, 429 - .regs = { 430 - .override = 0x478, 431 - .security = 0x47c, 432 - }, 433 - }, { 434 - .name = "ufshcr", 435 - .sid = TEGRA186_SID_UFSHC, 436 - .regs = { 437 - .override = 0x480, 438 - .security = 0x484, 439 - }, 440 - }, { 441 - .name = "ufshcw", 442 - .sid = TEGRA186_SID_UFSHC, 443 - .regs = { 444 - .override = 0x488, 445 - .security = 0x48c, 446 - }, 447 - }, { 448 - .name = "nvdisplayr", 449 - .sid = TEGRA186_SID_NVDISPLAY, 450 - .regs = { 451 - .override = 0x490, 452 - .security = 0x494, 453 - }, 454 - }, { 455 - .name = "bpmpr", 456 - .sid = TEGRA186_SID_BPMP, 457 - .regs = { 458 - .override = 0x498, 459 - .security = 0x49c, 460 - }, 461 - }, { 462 - .name = "bpmpw", 463 - .sid = TEGRA186_SID_BPMP, 464 - .regs = { 465 - .override = 0x4a0, 466 - .security = 0x4a4, 467 - }, 468 - }, { 469 - .name = "bpmpdmar", 470 - .sid = TEGRA186_SID_BPMP, 471 - .regs = { 472 - .override = 0x4a8, 473 - .security = 0x4ac, 474 - }, 475 - }, { 476 - .name = "bpmpdmaw", 477 - .sid = TEGRA186_SID_BPMP, 478 - .regs = { 479 - .override = 0x4b0, 480 - .security = 0x4b4, 481 - }, 482 - }, { 483 - .name = "aonr", 484 - .sid = TEGRA186_SID_AON, 485 - .regs = { 486 - .override = 0x4b8, 487 - .security = 0x4bc, 488 - }, 489 - }, { 490 - .name = "aonw", 491 - .sid = TEGRA186_SID_AON, 492 - .regs = { 493 - .override = 0x4c0, 494 - .security = 0x4c4, 495 - }, 496 - }, { 497 - .name = "aondmar", 498 - .sid = TEGRA186_SID_AON, 499 - .regs = { 500 - .override = 0x4c8, 501 - .security = 0x4cc, 502 - }, 503 - }, { 504 - .name = "aondmaw", 505 - .sid = TEGRA186_SID_AON, 506 - .regs = { 507 - .override = 0x4d0, 508 - .security = 0x4d4, 509 - }, 510 - }, { 511 - .name = "scer", 512 - .sid = TEGRA186_SID_SCE, 513 - .regs = { 514 - .override = 0x4d8, 515 - .security = 0x4dc, 516 - }, 517 - }, { 518 - .name = "scew", 519 - .sid = TEGRA186_SID_SCE, 520 - .regs = { 521 - .override = 0x4e0, 522 - .security = 0x4e4, 523 - }, 524 - }, { 525 - .name = "scedmar", 526 - .sid = TEGRA186_SID_SCE, 527 - .regs = { 528 - .override = 0x4e8, 529 - .security = 0x4ec, 530 - }, 531 - }, { 532 - .name = "scedmaw", 533 - .sid = TEGRA186_SID_SCE, 534 - .regs = { 535 - .override = 0x4f0, 536 - .security = 0x4f4, 537 - }, 538 - }, { 539 - .name = "apedmar", 540 - .sid = TEGRA186_SID_APE, 541 - .regs = { 542 - .override = 0x4f8, 543 - .security = 0x4fc, 544 - }, 545 - }, { 546 - .name = "apedmaw", 547 - .sid = TEGRA186_SID_APE, 548 - .regs = { 549 - .override = 0x500, 550 - .security = 0x504, 551 - }, 552 - }, { 553 - .name = "nvdisplayr1", 554 - .sid = TEGRA186_SID_NVDISPLAY, 555 - .regs = { 556 - .override = 0x508, 557 - .security = 0x50c, 558 - }, 559 - }, { 560 - .name = "vicsrd1", 561 - .sid = TEGRA186_SID_VIC, 562 - .regs = { 563 - .override = 0x510, 564 - .security = 0x514, 565 - }, 566 - }, { 567 - .name = "nvdecsrd1", 568 - .sid = TEGRA186_SID_NVDEC, 569 - .regs = { 570 - .override = 0x518, 571 - .security = 0x51c, 572 - }, 573 - }, 574 - }; 575 - 576 - static const struct tegra186_mc_soc tegra186_mc_soc = { 577 - .num_clients = ARRAY_SIZE(tegra186_mc_clients), 578 - .clients = tegra186_mc_clients, 579 - }; 580 - #endif 581 - 582 - #if defined(CONFIG_ARCH_TEGRA_194_SOC) 583 - static const struct tegra186_mc_client tegra194_mc_clients[] = { 584 - { 585 - .name = "ptcr", 586 - .sid = TEGRA194_SID_PASSTHROUGH, 587 - .regs = { 588 - .override = 0x000, 589 - .security = 0x004, 590 - }, 591 - }, { 592 - .name = "miu7r", 593 - .sid = TEGRA194_SID_MIU, 594 - .regs = { 595 - .override = 0x008, 596 - .security = 0x00c, 597 - }, 598 - }, { 599 - .name = "miu7w", 600 - .sid = TEGRA194_SID_MIU, 601 - .regs = { 602 - .override = 0x010, 603 - .security = 0x014, 604 - }, 605 - }, { 606 - .name = "hdar", 607 - .sid = TEGRA194_SID_HDA, 608 - .regs = { 609 - .override = 0x0a8, 610 - .security = 0x0ac, 611 - }, 612 - }, { 613 - .name = "host1xdmar", 614 - .sid = TEGRA194_SID_HOST1X, 615 - .regs = { 616 - .override = 0x0b0, 617 - .security = 0x0b4, 618 - }, 619 - }, { 620 - .name = "nvencsrd", 621 - .sid = TEGRA194_SID_NVENC, 622 - .regs = { 623 - .override = 0x0e0, 624 - .security = 0x0e4, 625 - }, 626 - }, { 627 - .name = "satar", 628 - .sid = TEGRA194_SID_SATA, 629 - .regs = { 630 - .override = 0x0f8, 631 - .security = 0x0fc, 632 - }, 633 - }, { 634 - .name = "mpcorer", 635 - .sid = TEGRA194_SID_PASSTHROUGH, 636 - .regs = { 637 - .override = 0x138, 638 - .security = 0x13c, 639 - }, 640 - }, { 641 - .name = "nvencswr", 642 - .sid = TEGRA194_SID_NVENC, 643 - .regs = { 644 - .override = 0x158, 645 - .security = 0x15c, 646 - }, 647 - }, { 648 - .name = "hdaw", 649 - .sid = TEGRA194_SID_HDA, 650 - .regs = { 651 - .override = 0x1a8, 652 - .security = 0x1ac, 653 - }, 654 - }, { 655 - .name = "mpcorew", 656 - .sid = TEGRA194_SID_PASSTHROUGH, 657 - .regs = { 658 - .override = 0x1c8, 659 - .security = 0x1cc, 660 - }, 661 - }, { 662 - .name = "sataw", 663 - .sid = TEGRA194_SID_SATA, 664 - .regs = { 665 - .override = 0x1e8, 666 - .security = 0x1ec, 667 - }, 668 - }, { 669 - .name = "ispra", 670 - .sid = TEGRA194_SID_ISP, 671 - .regs = { 672 - .override = 0x220, 673 - .security = 0x224, 674 - }, 675 - }, { 676 - .name = "ispfalr", 677 - .sid = TEGRA194_SID_ISP_FALCON, 678 - .regs = { 679 - .override = 0x228, 680 - .security = 0x22c, 681 - }, 682 - }, { 683 - .name = "ispwa", 684 - .sid = TEGRA194_SID_ISP, 685 - .regs = { 686 - .override = 0x230, 687 - .security = 0x234, 688 - }, 689 - }, { 690 - .name = "ispwb", 691 - .sid = TEGRA194_SID_ISP, 692 - .regs = { 693 - .override = 0x238, 694 - .security = 0x23c, 695 - }, 696 - }, { 697 - .name = "xusb_hostr", 698 - .sid = TEGRA194_SID_XUSB_HOST, 699 - .regs = { 700 - .override = 0x250, 701 - .security = 0x254, 702 - }, 703 - }, { 704 - .name = "xusb_hostw", 705 - .sid = TEGRA194_SID_XUSB_HOST, 706 - .regs = { 707 - .override = 0x258, 708 - .security = 0x25c, 709 - }, 710 - }, { 711 - .name = "xusb_devr", 712 - .sid = TEGRA194_SID_XUSB_DEV, 713 - .regs = { 714 - .override = 0x260, 715 - .security = 0x264, 716 - }, 717 - }, { 718 - .name = "xusb_devw", 719 - .sid = TEGRA194_SID_XUSB_DEV, 720 - .regs = { 721 - .override = 0x268, 722 - .security = 0x26c, 723 - }, 724 - }, { 725 - .name = "sdmmcra", 726 - .sid = TEGRA194_SID_SDMMC1, 727 - .regs = { 728 - .override = 0x300, 729 - .security = 0x304, 730 - }, 731 - }, { 732 - .name = "sdmmcr", 733 - .sid = TEGRA194_SID_SDMMC3, 734 - .regs = { 735 - .override = 0x310, 736 - .security = 0x314, 737 - }, 738 - }, { 739 - .name = "sdmmcrab", 740 - .sid = TEGRA194_SID_SDMMC4, 741 - .regs = { 742 - .override = 0x318, 743 - .security = 0x31c, 744 - }, 745 - }, { 746 - .name = "sdmmcwa", 747 - .sid = TEGRA194_SID_SDMMC1, 748 - .regs = { 749 - .override = 0x320, 750 - .security = 0x324, 751 - }, 752 - }, { 753 - .name = "sdmmcw", 754 - .sid = TEGRA194_SID_SDMMC3, 755 - .regs = { 756 - .override = 0x330, 757 - .security = 0x334, 758 - }, 759 - }, { 760 - .name = "sdmmcwab", 761 - .sid = TEGRA194_SID_SDMMC4, 762 - .regs = { 763 - .override = 0x338, 764 - .security = 0x33c, 765 - }, 766 - }, { 767 - .name = "vicsrd", 768 - .sid = TEGRA194_SID_VIC, 769 - .regs = { 770 - .override = 0x360, 771 - .security = 0x364, 772 - }, 773 - }, { 774 - .name = "vicswr", 775 - .sid = TEGRA194_SID_VIC, 776 - .regs = { 777 - .override = 0x368, 778 - .security = 0x36c, 779 - }, 780 - }, { 781 - .name = "viw", 782 - .sid = TEGRA194_SID_VI, 783 - .regs = { 784 - .override = 0x390, 785 - .security = 0x394, 786 - }, 787 - }, { 788 - .name = "nvdecsrd", 789 - .sid = TEGRA194_SID_NVDEC, 790 - .regs = { 791 - .override = 0x3c0, 792 - .security = 0x3c4, 793 - }, 794 - }, { 795 - .name = "nvdecswr", 796 - .sid = TEGRA194_SID_NVDEC, 797 - .regs = { 798 - .override = 0x3c8, 799 - .security = 0x3cc, 800 - }, 801 - }, { 802 - .name = "aper", 803 - .sid = TEGRA194_SID_APE, 804 - .regs = { 805 - .override = 0x3c0, 806 - .security = 0x3c4, 807 - }, 808 - }, { 809 - .name = "apew", 810 - .sid = TEGRA194_SID_APE, 811 - .regs = { 812 - .override = 0x3d0, 813 - .security = 0x3d4, 814 - }, 815 - }, { 816 - .name = "nvjpgsrd", 817 - .sid = TEGRA194_SID_NVJPG, 818 - .regs = { 819 - .override = 0x3f0, 820 - .security = 0x3f4, 821 - }, 822 - }, { 823 - .name = "nvjpgswr", 824 - .sid = TEGRA194_SID_NVJPG, 825 - .regs = { 826 - .override = 0x3f0, 827 - .security = 0x3f4, 828 - }, 829 - }, { 830 - .name = "axiapr", 831 - .sid = TEGRA194_SID_PASSTHROUGH, 832 - .regs = { 833 - .override = 0x410, 834 - .security = 0x414, 835 - }, 836 - }, { 837 - .name = "axiapw", 838 - .sid = TEGRA194_SID_PASSTHROUGH, 839 - .regs = { 840 - .override = 0x418, 841 - .security = 0x41c, 842 - }, 843 - }, { 844 - .name = "etrr", 845 - .sid = TEGRA194_SID_ETR, 846 - .regs = { 847 - .override = 0x420, 848 - .security = 0x424, 849 - }, 850 - }, { 851 - .name = "etrw", 852 - .sid = TEGRA194_SID_ETR, 853 - .regs = { 854 - .override = 0x428, 855 - .security = 0x42c, 856 - }, 857 - }, { 858 - .name = "axisr", 859 - .sid = TEGRA194_SID_PASSTHROUGH, 860 - .regs = { 861 - .override = 0x460, 862 - .security = 0x464, 863 - }, 864 - }, { 865 - .name = "axisw", 866 - .sid = TEGRA194_SID_PASSTHROUGH, 867 - .regs = { 868 - .override = 0x468, 869 - .security = 0x46c, 870 - }, 871 - }, { 872 - .name = "eqosr", 873 - .sid = TEGRA194_SID_EQOS, 874 - .regs = { 875 - .override = 0x470, 876 - .security = 0x474, 877 - }, 878 - }, { 879 - .name = "eqosw", 880 - .sid = TEGRA194_SID_EQOS, 881 - .regs = { 882 - .override = 0x478, 883 - .security = 0x47c, 884 - }, 885 - }, { 886 - .name = "ufshcr", 887 - .sid = TEGRA194_SID_UFSHC, 888 - .regs = { 889 - .override = 0x480, 890 - .security = 0x484, 891 - }, 892 - }, { 893 - .name = "ufshcw", 894 - .sid = TEGRA194_SID_UFSHC, 895 - .regs = { 896 - .override = 0x488, 897 - .security = 0x48c, 898 - }, 899 - }, { 900 - .name = "nvdisplayr", 901 - .sid = TEGRA194_SID_NVDISPLAY, 902 - .regs = { 903 - .override = 0x490, 904 - .security = 0x494, 905 - }, 906 - }, { 907 - .name = "bpmpr", 908 - .sid = TEGRA194_SID_BPMP, 909 - .regs = { 910 - .override = 0x498, 911 - .security = 0x49c, 912 - }, 913 - }, { 914 - .name = "bpmpw", 915 - .sid = TEGRA194_SID_BPMP, 916 - .regs = { 917 - .override = 0x4a0, 918 - .security = 0x4a4, 919 - }, 920 - }, { 921 - .name = "bpmpdmar", 922 - .sid = TEGRA194_SID_BPMP, 923 - .regs = { 924 - .override = 0x4a8, 925 - .security = 0x4ac, 926 - }, 927 - }, { 928 - .name = "bpmpdmaw", 929 - .sid = TEGRA194_SID_BPMP, 930 - .regs = { 931 - .override = 0x4b0, 932 - .security = 0x4b4, 933 - }, 934 - }, { 935 - .name = "aonr", 936 - .sid = TEGRA194_SID_AON, 937 - .regs = { 938 - .override = 0x4b8, 939 - .security = 0x4bc, 940 - }, 941 - }, { 942 - .name = "aonw", 943 - .sid = TEGRA194_SID_AON, 944 - .regs = { 945 - .override = 0x4c0, 946 - .security = 0x4c4, 947 - }, 948 - }, { 949 - .name = "aondmar", 950 - .sid = TEGRA194_SID_AON, 951 - .regs = { 952 - .override = 0x4c8, 953 - .security = 0x4cc, 954 - }, 955 - }, { 956 - .name = "aondmaw", 957 - .sid = TEGRA194_SID_AON, 958 - .regs = { 959 - .override = 0x4d0, 960 - .security = 0x4d4, 961 - }, 962 - }, { 963 - .name = "scer", 964 - .sid = TEGRA194_SID_SCE, 965 - .regs = { 966 - .override = 0x4d8, 967 - .security = 0x4dc, 968 - }, 969 - }, { 970 - .name = "scew", 971 - .sid = TEGRA194_SID_SCE, 972 - .regs = { 973 - .override = 0x4e0, 974 - .security = 0x4e4, 975 - }, 976 - }, { 977 - .name = "scedmar", 978 - .sid = TEGRA194_SID_SCE, 979 - .regs = { 980 - .override = 0x4e8, 981 - .security = 0x4ec, 982 - }, 983 - }, { 984 - .name = "scedmaw", 985 - .sid = TEGRA194_SID_SCE, 986 - .regs = { 987 - .override = 0x4f0, 988 - .security = 0x4f4, 989 - }, 990 - }, { 991 - .name = "apedmar", 992 - .sid = TEGRA194_SID_APE, 993 - .regs = { 994 - .override = 0x4f8, 995 - .security = 0x4fc, 996 - }, 997 - }, { 998 - .name = "apedmaw", 999 - .sid = TEGRA194_SID_APE, 1000 - .regs = { 1001 - .override = 0x500, 1002 - .security = 0x504, 1003 - }, 1004 - }, { 1005 - .name = "nvdisplayr1", 1006 - .sid = TEGRA194_SID_NVDISPLAY, 1007 - .regs = { 1008 - .override = 0x508, 1009 - .security = 0x50c, 1010 - }, 1011 - }, { 1012 - .name = "vicsrd1", 1013 - .sid = TEGRA194_SID_VIC, 1014 - .regs = { 1015 - .override = 0x510, 1016 - .security = 0x514, 1017 - }, 1018 - }, { 1019 - .name = "nvdecsrd1", 1020 - .sid = TEGRA194_SID_NVDEC, 1021 - .regs = { 1022 - .override = 0x518, 1023 - .security = 0x51c, 1024 - }, 1025 - }, { 1026 - .name = "miu0r", 1027 - .sid = TEGRA194_SID_MIU, 1028 - .regs = { 1029 - .override = 0x530, 1030 - .security = 0x534, 1031 - }, 1032 - }, { 1033 - .name = "miu0w", 1034 - .sid = TEGRA194_SID_MIU, 1035 - .regs = { 1036 - .override = 0x538, 1037 - .security = 0x53c, 1038 - }, 1039 - }, { 1040 - .name = "miu1r", 1041 - .sid = TEGRA194_SID_MIU, 1042 - .regs = { 1043 - .override = 0x540, 1044 - .security = 0x544, 1045 - }, 1046 - }, { 1047 - .name = "miu1w", 1048 - .sid = TEGRA194_SID_MIU, 1049 - .regs = { 1050 - .override = 0x548, 1051 - .security = 0x54c, 1052 - }, 1053 - }, { 1054 - .name = "miu2r", 1055 - .sid = TEGRA194_SID_MIU, 1056 - .regs = { 1057 - .override = 0x570, 1058 - .security = 0x574, 1059 - }, 1060 - }, { 1061 - .name = "miu2w", 1062 - .sid = TEGRA194_SID_MIU, 1063 - .regs = { 1064 - .override = 0x578, 1065 - .security = 0x57c, 1066 - }, 1067 - }, { 1068 - .name = "miu3r", 1069 - .sid = TEGRA194_SID_MIU, 1070 - .regs = { 1071 - .override = 0x580, 1072 - .security = 0x584, 1073 - }, 1074 - }, { 1075 - .name = "miu3w", 1076 - .sid = TEGRA194_SID_MIU, 1077 - .regs = { 1078 - .override = 0x588, 1079 - .security = 0x58c, 1080 - }, 1081 - }, { 1082 - .name = "miu4r", 1083 - .sid = TEGRA194_SID_MIU, 1084 - .regs = { 1085 - .override = 0x590, 1086 - .security = 0x594, 1087 - }, 1088 - }, { 1089 - .name = "miu4w", 1090 - .sid = TEGRA194_SID_MIU, 1091 - .regs = { 1092 - .override = 0x598, 1093 - .security = 0x59c, 1094 - }, 1095 - }, { 1096 - .name = "dpmur", 1097 - .sid = TEGRA194_SID_PASSTHROUGH, 1098 - .regs = { 1099 - .override = 0x598, 1100 - .security = 0x59c, 1101 - }, 1102 - }, { 1103 - .name = "vifalr", 1104 - .sid = TEGRA194_SID_VI_FALCON, 1105 - .regs = { 1106 - .override = 0x5e0, 1107 - .security = 0x5e4, 1108 - }, 1109 - }, { 1110 - .name = "vifalw", 1111 - .sid = TEGRA194_SID_VI_FALCON, 1112 - .regs = { 1113 - .override = 0x5e8, 1114 - .security = 0x5ec, 1115 - }, 1116 - }, { 1117 - .name = "dla0rda", 1118 - .sid = TEGRA194_SID_NVDLA0, 1119 - .regs = { 1120 - .override = 0x5f0, 1121 - .security = 0x5f4, 1122 - }, 1123 - }, { 1124 - .name = "dla0falrdb", 1125 - .sid = TEGRA194_SID_NVDLA0, 1126 - .regs = { 1127 - .override = 0x5f8, 1128 - .security = 0x5fc, 1129 - }, 1130 - }, { 1131 - .name = "dla0wra", 1132 - .sid = TEGRA194_SID_NVDLA0, 1133 - .regs = { 1134 - .override = 0x600, 1135 - .security = 0x604, 1136 - }, 1137 - }, { 1138 - .name = "dla0falwrb", 1139 - .sid = TEGRA194_SID_NVDLA0, 1140 - .regs = { 1141 - .override = 0x608, 1142 - .security = 0x60c, 1143 - }, 1144 - }, { 1145 - .name = "dla1rda", 1146 - .sid = TEGRA194_SID_NVDLA1, 1147 - .regs = { 1148 - .override = 0x610, 1149 - .security = 0x614, 1150 - }, 1151 - }, { 1152 - .name = "dla1falrdb", 1153 - .sid = TEGRA194_SID_NVDLA1, 1154 - .regs = { 1155 - .override = 0x618, 1156 - .security = 0x61c, 1157 - }, 1158 - }, { 1159 - .name = "dla1wra", 1160 - .sid = TEGRA194_SID_NVDLA1, 1161 - .regs = { 1162 - .override = 0x620, 1163 - .security = 0x624, 1164 - }, 1165 - }, { 1166 - .name = "dla1falwrb", 1167 - .sid = TEGRA194_SID_NVDLA1, 1168 - .regs = { 1169 - .override = 0x628, 1170 - .security = 0x62c, 1171 - }, 1172 - }, { 1173 - .name = "pva0rda", 1174 - .sid = TEGRA194_SID_PVA0, 1175 - .regs = { 1176 - .override = 0x630, 1177 - .security = 0x634, 1178 - }, 1179 - }, { 1180 - .name = "pva0rdb", 1181 - .sid = TEGRA194_SID_PVA0, 1182 - .regs = { 1183 - .override = 0x638, 1184 - .security = 0x63c, 1185 - }, 1186 - }, { 1187 - .name = "pva0rdc", 1188 - .sid = TEGRA194_SID_PVA0, 1189 - .regs = { 1190 - .override = 0x640, 1191 - .security = 0x644, 1192 - }, 1193 - }, { 1194 - .name = "pva0wra", 1195 - .sid = TEGRA194_SID_PVA0, 1196 - .regs = { 1197 - .override = 0x648, 1198 - .security = 0x64c, 1199 - }, 1200 - }, { 1201 - .name = "pva0wrb", 1202 - .sid = TEGRA194_SID_PVA0, 1203 - .regs = { 1204 - .override = 0x650, 1205 - .security = 0x654, 1206 - }, 1207 - }, { 1208 - .name = "pva0wrc", 1209 - .sid = TEGRA194_SID_PVA0, 1210 - .regs = { 1211 - .override = 0x658, 1212 - .security = 0x65c, 1213 - }, 1214 - }, { 1215 - .name = "pva1rda", 1216 - .sid = TEGRA194_SID_PVA1, 1217 - .regs = { 1218 - .override = 0x660, 1219 - .security = 0x664, 1220 - }, 1221 - }, { 1222 - .name = "pva1rdb", 1223 - .sid = TEGRA194_SID_PVA1, 1224 - .regs = { 1225 - .override = 0x668, 1226 - .security = 0x66c, 1227 - }, 1228 - }, { 1229 - .name = "pva1rdc", 1230 - .sid = TEGRA194_SID_PVA1, 1231 - .regs = { 1232 - .override = 0x670, 1233 - .security = 0x674, 1234 - }, 1235 - }, { 1236 - .name = "pva1wra", 1237 - .sid = TEGRA194_SID_PVA1, 1238 - .regs = { 1239 - .override = 0x678, 1240 - .security = 0x67c, 1241 - }, 1242 - }, { 1243 - .name = "pva1wrb", 1244 - .sid = TEGRA194_SID_PVA1, 1245 - .regs = { 1246 - .override = 0x680, 1247 - .security = 0x684, 1248 - }, 1249 - }, { 1250 - .name = "pva1wrc", 1251 - .sid = TEGRA194_SID_PVA1, 1252 - .regs = { 1253 - .override = 0x688, 1254 - .security = 0x68c, 1255 - }, 1256 - }, { 1257 - .name = "rcer", 1258 - .sid = TEGRA194_SID_RCE, 1259 - .regs = { 1260 - .override = 0x690, 1261 - .security = 0x694, 1262 - }, 1263 - }, { 1264 - .name = "rcew", 1265 - .sid = TEGRA194_SID_RCE, 1266 - .regs = { 1267 - .override = 0x698, 1268 - .security = 0x69c, 1269 - }, 1270 - }, { 1271 - .name = "rcedmar", 1272 - .sid = TEGRA194_SID_RCE, 1273 - .regs = { 1274 - .override = 0x6a0, 1275 - .security = 0x6a4, 1276 - }, 1277 - }, { 1278 - .name = "rcedmaw", 1279 - .sid = TEGRA194_SID_RCE, 1280 - .regs = { 1281 - .override = 0x6a8, 1282 - .security = 0x6ac, 1283 - }, 1284 - }, { 1285 - .name = "nvenc1srd", 1286 - .sid = TEGRA194_SID_NVENC1, 1287 - .regs = { 1288 - .override = 0x6b0, 1289 - .security = 0x6b4, 1290 - }, 1291 - }, { 1292 - .name = "nvenc1swr", 1293 - .sid = TEGRA194_SID_NVENC1, 1294 - .regs = { 1295 - .override = 0x6b8, 1296 - .security = 0x6bc, 1297 - }, 1298 - }, { 1299 - .name = "pcie0r", 1300 - .sid = TEGRA194_SID_PCIE0, 1301 - .regs = { 1302 - .override = 0x6c0, 1303 - .security = 0x6c4, 1304 - }, 1305 - }, { 1306 - .name = "pcie0w", 1307 - .sid = TEGRA194_SID_PCIE0, 1308 - .regs = { 1309 - .override = 0x6c8, 1310 - .security = 0x6cc, 1311 - }, 1312 - }, { 1313 - .name = "pcie1r", 1314 - .sid = TEGRA194_SID_PCIE1, 1315 - .regs = { 1316 - .override = 0x6d0, 1317 - .security = 0x6d4, 1318 - }, 1319 - }, { 1320 - .name = "pcie1w", 1321 - .sid = TEGRA194_SID_PCIE1, 1322 - .regs = { 1323 - .override = 0x6d8, 1324 - .security = 0x6dc, 1325 - }, 1326 - }, { 1327 - .name = "pcie2ar", 1328 - .sid = TEGRA194_SID_PCIE2, 1329 - .regs = { 1330 - .override = 0x6e0, 1331 - .security = 0x6e4, 1332 - }, 1333 - }, { 1334 - .name = "pcie2aw", 1335 - .sid = TEGRA194_SID_PCIE2, 1336 - .regs = { 1337 - .override = 0x6e8, 1338 - .security = 0x6ec, 1339 - }, 1340 - }, { 1341 - .name = "pcie3r", 1342 - .sid = TEGRA194_SID_PCIE3, 1343 - .regs = { 1344 - .override = 0x6f0, 1345 - .security = 0x6f4, 1346 - }, 1347 - }, { 1348 - .name = "pcie3w", 1349 - .sid = TEGRA194_SID_PCIE3, 1350 - .regs = { 1351 - .override = 0x6f8, 1352 - .security = 0x6fc, 1353 - }, 1354 - }, { 1355 - .name = "pcie4r", 1356 - .sid = TEGRA194_SID_PCIE4, 1357 - .regs = { 1358 - .override = 0x700, 1359 - .security = 0x704, 1360 - }, 1361 - }, { 1362 - .name = "pcie4w", 1363 - .sid = TEGRA194_SID_PCIE4, 1364 - .regs = { 1365 - .override = 0x708, 1366 - .security = 0x70c, 1367 - }, 1368 - }, { 1369 - .name = "pcie5r", 1370 - .sid = TEGRA194_SID_PCIE5, 1371 - .regs = { 1372 - .override = 0x710, 1373 - .security = 0x714, 1374 - }, 1375 - }, { 1376 - .name = "pcie5w", 1377 - .sid = TEGRA194_SID_PCIE5, 1378 - .regs = { 1379 - .override = 0x718, 1380 - .security = 0x71c, 1381 - }, 1382 - }, { 1383 - .name = "ispfalw", 1384 - .sid = TEGRA194_SID_ISP_FALCON, 1385 - .regs = { 1386 - .override = 0x720, 1387 - .security = 0x724, 1388 - }, 1389 - }, { 1390 - .name = "dla0rda1", 1391 - .sid = TEGRA194_SID_NVDLA0, 1392 - .regs = { 1393 - .override = 0x748, 1394 - .security = 0x74c, 1395 - }, 1396 - }, { 1397 - .name = "dla1rda1", 1398 - .sid = TEGRA194_SID_NVDLA1, 1399 - .regs = { 1400 - .override = 0x750, 1401 - .security = 0x754, 1402 - }, 1403 - }, { 1404 - .name = "pva0rda1", 1405 - .sid = TEGRA194_SID_PVA0, 1406 - .regs = { 1407 - .override = 0x758, 1408 - .security = 0x75c, 1409 - }, 1410 - }, { 1411 - .name = "pva0rdb1", 1412 - .sid = TEGRA194_SID_PVA0, 1413 - .regs = { 1414 - .override = 0x760, 1415 - .security = 0x764, 1416 - }, 1417 - }, { 1418 - .name = "pva1rda1", 1419 - .sid = TEGRA194_SID_PVA1, 1420 - .regs = { 1421 - .override = 0x768, 1422 - .security = 0x76c, 1423 - }, 1424 - }, { 1425 - .name = "pva1rdb1", 1426 - .sid = TEGRA194_SID_PVA1, 1427 - .regs = { 1428 - .override = 0x770, 1429 - .security = 0x774, 1430 - }, 1431 - }, { 1432 - .name = "pcie5r1", 1433 - .sid = TEGRA194_SID_PCIE5, 1434 - .regs = { 1435 - .override = 0x778, 1436 - .security = 0x77c, 1437 - }, 1438 - }, { 1439 - .name = "nvencsrd1", 1440 - .sid = TEGRA194_SID_NVENC, 1441 - .regs = { 1442 - .override = 0x780, 1443 - .security = 0x784, 1444 - }, 1445 - }, { 1446 - .name = "nvenc1srd1", 1447 - .sid = TEGRA194_SID_NVENC1, 1448 - .regs = { 1449 - .override = 0x788, 1450 - .security = 0x78c, 1451 - }, 1452 - }, { 1453 - .name = "ispra1", 1454 - .sid = TEGRA194_SID_ISP, 1455 - .regs = { 1456 - .override = 0x790, 1457 - .security = 0x794, 1458 - }, 1459 - }, { 1460 - .name = "pcie0r1", 1461 - .sid = TEGRA194_SID_PCIE0, 1462 - .regs = { 1463 - .override = 0x798, 1464 - .security = 0x79c, 1465 - }, 1466 - }, { 1467 - .name = "nvdec1srd", 1468 - .sid = TEGRA194_SID_NVDEC1, 1469 - .regs = { 1470 - .override = 0x7c8, 1471 - .security = 0x7cc, 1472 - }, 1473 - }, { 1474 - .name = "nvdec1srd1", 1475 - .sid = TEGRA194_SID_NVDEC1, 1476 - .regs = { 1477 - .override = 0x7d0, 1478 - .security = 0x7d4, 1479 - }, 1480 - }, { 1481 - .name = "nvdec1swr", 1482 - .sid = TEGRA194_SID_NVDEC1, 1483 - .regs = { 1484 - .override = 0x7d8, 1485 - .security = 0x7dc, 1486 - }, 1487 - }, { 1488 - .name = "miu5r", 1489 - .sid = TEGRA194_SID_MIU, 1490 - .regs = { 1491 - .override = 0x7e0, 1492 - .security = 0x7e4, 1493 - }, 1494 - }, { 1495 - .name = "miu5w", 1496 - .sid = TEGRA194_SID_MIU, 1497 - .regs = { 1498 - .override = 0x7e8, 1499 - .security = 0x7ec, 1500 - }, 1501 - }, { 1502 - .name = "miu6r", 1503 - .sid = TEGRA194_SID_MIU, 1504 - .regs = { 1505 - .override = 0x7f0, 1506 - .security = 0x7f4, 1507 - }, 1508 - }, { 1509 - .name = "miu6w", 1510 - .sid = TEGRA194_SID_MIU, 1511 - .regs = { 1512 - .override = 0x7f8, 1513 - .security = 0x7fc, 1514 - }, 1515 - }, 1516 - }; 1517 - 1518 - static const struct tegra186_mc_soc tegra194_mc_soc = { 1519 - .num_clients = ARRAY_SIZE(tegra194_mc_clients), 1520 - .clients = tegra194_mc_clients, 1521 - }; 1522 - #endif 1523 - 1524 - static int tegra186_mc_probe(struct platform_device *pdev) 49 + static int tegra186_mc_probe(struct tegra_mc *mc) 1525 50 { 1526 - struct tegra186_mc *mc; 1527 - struct resource *res; 1528 51 int err; 1529 52 1530 - mc = devm_kzalloc(&pdev->dev, sizeof(*mc), GFP_KERNEL); 1531 - if (!mc) 1532 - return -ENOMEM; 1533 - 1534 - mc->soc = of_device_get_match_data(&pdev->dev); 1535 - 1536 - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 1537 - mc->regs = devm_ioremap_resource(&pdev->dev, res); 1538 - if (IS_ERR(mc->regs)) 1539 - return PTR_ERR(mc->regs); 1540 - 1541 - mc->dev = &pdev->dev; 1542 - 1543 - err = of_platform_populate(pdev->dev.of_node, NULL, NULL, &pdev->dev); 53 + err = of_platform_populate(mc->dev->of_node, NULL, NULL, mc->dev); 1544 54 if (err < 0) 1545 55 return err; 1546 56 1547 - platform_set_drvdata(pdev, mc); 1548 57 tegra186_mc_program_sid(mc); 1549 58 1550 59 return 0; 1551 60 } 1552 61 1553 - static int tegra186_mc_remove(struct platform_device *pdev) 62 + static void tegra186_mc_remove(struct tegra_mc *mc) 1554 63 { 1555 - struct tegra186_mc *mc = platform_get_drvdata(pdev); 1556 - 1557 64 of_platform_depopulate(mc->dev); 1558 - 1559 - return 0; 1560 65 } 1561 66 1562 - static const struct of_device_id tegra186_mc_of_match[] = { 1563 - #if defined(CONFIG_ARCH_TEGRA_186_SOC) 1564 - { .compatible = "nvidia,tegra186-mc", .data = &tegra186_mc_soc }, 1565 - #endif 1566 - #if defined(CONFIG_ARCH_TEGRA_194_SOC) 1567 - { .compatible = "nvidia,tegra194-mc", .data = &tegra194_mc_soc }, 1568 - #endif 1569 - { /* sentinel */ } 1570 - }; 1571 - MODULE_DEVICE_TABLE(of, tegra186_mc_of_match); 1572 - 1573 - static int __maybe_unused tegra186_mc_suspend(struct device *dev) 67 + static int tegra186_mc_resume(struct tegra_mc *mc) 1574 68 { 1575 - return 0; 1576 - } 1577 - 1578 - static int __maybe_unused tegra186_mc_resume(struct device *dev) 1579 - { 1580 - struct tegra186_mc *mc = dev_get_drvdata(dev); 1581 - 1582 69 tegra186_mc_program_sid(mc); 1583 70 1584 71 return 0; 1585 72 } 1586 73 1587 - static const struct dev_pm_ops tegra186_mc_pm_ops = { 1588 - SET_SYSTEM_SLEEP_PM_OPS(tegra186_mc_suspend, tegra186_mc_resume) 1589 - }; 74 + static void tegra186_mc_client_sid_override(struct tegra_mc *mc, 75 + const struct tegra_mc_client *client, 76 + unsigned int sid) 77 + { 78 + u32 value, old; 1590 79 1591 - static struct platform_driver tegra186_mc_driver = { 1592 - .driver = { 1593 - .name = "tegra186-mc", 1594 - .of_match_table = tegra186_mc_of_match, 1595 - .pm = &tegra186_mc_pm_ops, 1596 - .suppress_bind_attrs = true, 1597 - }, 80 + value = readl(mc->regs + client->regs.sid.security); 81 + if ((value & MC_SID_STREAMID_SECURITY_OVERRIDE) == 0) { 82 + /* 83 + * If the secure firmware has locked this down the override 84 + * for this memory client, there's nothing we can do here. 85 + */ 86 + if (value & MC_SID_STREAMID_SECURITY_WRITE_ACCESS_DISABLED) 87 + return; 88 + 89 + /* 90 + * Otherwise, try to set the override itself. Typically the 91 + * secure firmware will never have set this configuration. 92 + * Instead, it will either have disabled write access to 93 + * this field, or it will already have set an explicit 94 + * override itself. 95 + */ 96 + WARN_ON((value & MC_SID_STREAMID_SECURITY_OVERRIDE) == 0); 97 + 98 + value |= MC_SID_STREAMID_SECURITY_OVERRIDE; 99 + writel(value, mc->regs + client->regs.sid.security); 100 + } 101 + 102 + value = readl(mc->regs + client->regs.sid.override); 103 + old = value & MC_SID_STREAMID_OVERRIDE_MASK; 104 + 105 + if (old != sid) { 106 + dev_dbg(mc->dev, "overriding SID %x for %s with %x\n", old, 107 + client->name, sid); 108 + writel(sid, mc->regs + client->regs.sid.override); 109 + } 110 + } 111 + 112 + static int tegra186_mc_probe_device(struct tegra_mc *mc, struct device *dev) 113 + { 114 + #if IS_ENABLED(CONFIG_IOMMU_API) 115 + struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev); 116 + struct of_phandle_args args; 117 + unsigned int i, index = 0; 118 + 119 + while (!of_parse_phandle_with_args(dev->of_node, "interconnects", "#interconnect-cells", 120 + index, &args)) { 121 + if (args.np == mc->dev->of_node && args.args_count != 0) { 122 + for (i = 0; i < mc->soc->num_clients; i++) { 123 + const struct tegra_mc_client *client = &mc->soc->clients[i]; 124 + 125 + if (client->id == args.args[0]) { 126 + u32 sid = fwspec->ids[0] & MC_SID_STREAMID_OVERRIDE_MASK; 127 + 128 + tegra186_mc_client_sid_override(mc, client, sid); 129 + } 130 + } 131 + } 132 + 133 + index++; 134 + } 135 + #endif 136 + 137 + return 0; 138 + } 139 + 140 + const struct tegra_mc_ops tegra186_mc_ops = { 1598 141 .probe = tegra186_mc_probe, 1599 142 .remove = tegra186_mc_remove, 143 + .resume = tegra186_mc_resume, 144 + .probe_device = tegra186_mc_probe_device, 1600 145 }; 1601 - module_platform_driver(tegra186_mc_driver); 1602 146 1603 - MODULE_AUTHOR("Thierry Reding <treding@nvidia.com>"); 1604 - MODULE_DESCRIPTION("NVIDIA Tegra186 Memory Controller driver"); 1605 - MODULE_LICENSE("GPL v2"); 147 + #if defined(CONFIG_ARCH_TEGRA_186_SOC) 148 + static const struct tegra_mc_client tegra186_mc_clients[] = { 149 + { 150 + .id = TEGRA186_MEMORY_CLIENT_PTCR, 151 + .name = "ptcr", 152 + .sid = TEGRA186_SID_PASSTHROUGH, 153 + .regs = { 154 + .sid = { 155 + .override = 0x000, 156 + .security = 0x004, 157 + }, 158 + }, 159 + }, { 160 + .id = TEGRA186_MEMORY_CLIENT_AFIR, 161 + .name = "afir", 162 + .sid = TEGRA186_SID_AFI, 163 + .regs = { 164 + .sid = { 165 + .override = 0x070, 166 + .security = 0x074, 167 + }, 168 + }, 169 + }, { 170 + .id = TEGRA186_MEMORY_CLIENT_HDAR, 171 + .name = "hdar", 172 + .sid = TEGRA186_SID_HDA, 173 + .regs = { 174 + .sid = { 175 + .override = 0x0a8, 176 + .security = 0x0ac, 177 + }, 178 + }, 179 + }, { 180 + .id = TEGRA186_MEMORY_CLIENT_HOST1XDMAR, 181 + .name = "host1xdmar", 182 + .sid = TEGRA186_SID_HOST1X, 183 + .regs = { 184 + .sid = { 185 + .override = 0x0b0, 186 + .security = 0x0b4, 187 + }, 188 + }, 189 + }, { 190 + .id = TEGRA186_MEMORY_CLIENT_NVENCSRD, 191 + .name = "nvencsrd", 192 + .sid = TEGRA186_SID_NVENC, 193 + .regs = { 194 + .sid = { 195 + .override = 0x0e0, 196 + .security = 0x0e4, 197 + }, 198 + }, 199 + }, { 200 + .id = TEGRA186_MEMORY_CLIENT_SATAR, 201 + .name = "satar", 202 + .sid = TEGRA186_SID_SATA, 203 + .regs = { 204 + .sid = { 205 + .override = 0x0f8, 206 + .security = 0x0fc, 207 + }, 208 + }, 209 + }, { 210 + .id = TEGRA186_MEMORY_CLIENT_MPCORER, 211 + .name = "mpcorer", 212 + .sid = TEGRA186_SID_PASSTHROUGH, 213 + .regs = { 214 + .sid = { 215 + .override = 0x138, 216 + .security = 0x13c, 217 + }, 218 + }, 219 + }, { 220 + .id = TEGRA186_MEMORY_CLIENT_NVENCSWR, 221 + .name = "nvencswr", 222 + .sid = TEGRA186_SID_NVENC, 223 + .regs = { 224 + .sid = { 225 + .override = 0x158, 226 + .security = 0x15c, 227 + }, 228 + }, 229 + }, { 230 + .id = TEGRA186_MEMORY_CLIENT_AFIW, 231 + .name = "afiw", 232 + .sid = TEGRA186_SID_AFI, 233 + .regs = { 234 + .sid = { 235 + .override = 0x188, 236 + .security = 0x18c, 237 + }, 238 + }, 239 + }, { 240 + .id = TEGRA186_MEMORY_CLIENT_HDAW, 241 + .name = "hdaw", 242 + .sid = TEGRA186_SID_HDA, 243 + .regs = { 244 + .sid = { 245 + .override = 0x1a8, 246 + .security = 0x1ac, 247 + }, 248 + }, 249 + }, { 250 + .id = TEGRA186_MEMORY_CLIENT_MPCOREW, 251 + .name = "mpcorew", 252 + .sid = TEGRA186_SID_PASSTHROUGH, 253 + .regs = { 254 + .sid = { 255 + .override = 0x1c8, 256 + .security = 0x1cc, 257 + }, 258 + }, 259 + }, { 260 + .id = TEGRA186_MEMORY_CLIENT_SATAW, 261 + .name = "sataw", 262 + .sid = TEGRA186_SID_SATA, 263 + .regs = { 264 + .sid = { 265 + .override = 0x1e8, 266 + .security = 0x1ec, 267 + }, 268 + }, 269 + }, { 270 + .id = TEGRA186_MEMORY_CLIENT_ISPRA, 271 + .name = "ispra", 272 + .sid = TEGRA186_SID_ISP, 273 + .regs = { 274 + .sid = { 275 + .override = 0x220, 276 + .security = 0x224, 277 + }, 278 + }, 279 + }, { 280 + .id = TEGRA186_MEMORY_CLIENT_ISPWA, 281 + .name = "ispwa", 282 + .sid = TEGRA186_SID_ISP, 283 + .regs = { 284 + .sid = { 285 + .override = 0x230, 286 + .security = 0x234, 287 + }, 288 + }, 289 + }, { 290 + .id = TEGRA186_MEMORY_CLIENT_ISPWB, 291 + .name = "ispwb", 292 + .sid = TEGRA186_SID_ISP, 293 + .regs = { 294 + .sid = { 295 + .override = 0x238, 296 + .security = 0x23c, 297 + }, 298 + }, 299 + }, { 300 + .id = TEGRA186_MEMORY_CLIENT_XUSB_HOSTR, 301 + .name = "xusb_hostr", 302 + .sid = TEGRA186_SID_XUSB_HOST, 303 + .regs = { 304 + .sid = { 305 + .override = 0x250, 306 + .security = 0x254, 307 + }, 308 + }, 309 + }, { 310 + .id = TEGRA186_MEMORY_CLIENT_XUSB_HOSTW, 311 + .name = "xusb_hostw", 312 + .sid = TEGRA186_SID_XUSB_HOST, 313 + .regs = { 314 + .sid = { 315 + .override = 0x258, 316 + .security = 0x25c, 317 + }, 318 + }, 319 + }, { 320 + .id = TEGRA186_MEMORY_CLIENT_XUSB_DEVR, 321 + .name = "xusb_devr", 322 + .sid = TEGRA186_SID_XUSB_DEV, 323 + .regs = { 324 + .sid = { 325 + .override = 0x260, 326 + .security = 0x264, 327 + }, 328 + }, 329 + }, { 330 + .id = TEGRA186_MEMORY_CLIENT_XUSB_DEVW, 331 + .name = "xusb_devw", 332 + .sid = TEGRA186_SID_XUSB_DEV, 333 + .regs = { 334 + .sid = { 335 + .override = 0x268, 336 + .security = 0x26c, 337 + }, 338 + }, 339 + }, { 340 + .id = TEGRA186_MEMORY_CLIENT_TSECSRD, 341 + .name = "tsecsrd", 342 + .sid = TEGRA186_SID_TSEC, 343 + .regs = { 344 + .sid = { 345 + .override = 0x2a0, 346 + .security = 0x2a4, 347 + }, 348 + }, 349 + }, { 350 + .id = TEGRA186_MEMORY_CLIENT_TSECSWR, 351 + .name = "tsecswr", 352 + .sid = TEGRA186_SID_TSEC, 353 + .regs = { 354 + .sid = { 355 + .override = 0x2a8, 356 + .security = 0x2ac, 357 + }, 358 + }, 359 + }, { 360 + .id = TEGRA186_MEMORY_CLIENT_GPUSRD, 361 + .name = "gpusrd", 362 + .sid = TEGRA186_SID_GPU, 363 + .regs = { 364 + .sid = { 365 + .override = 0x2c0, 366 + .security = 0x2c4, 367 + }, 368 + }, 369 + }, { 370 + .id = TEGRA186_MEMORY_CLIENT_GPUSWR, 371 + .name = "gpuswr", 372 + .sid = TEGRA186_SID_GPU, 373 + .regs = { 374 + .sid = { 375 + .override = 0x2c8, 376 + .security = 0x2cc, 377 + }, 378 + }, 379 + }, { 380 + .id = TEGRA186_MEMORY_CLIENT_SDMMCRA, 381 + .name = "sdmmcra", 382 + .sid = TEGRA186_SID_SDMMC1, 383 + .regs = { 384 + .sid = { 385 + .override = 0x300, 386 + .security = 0x304, 387 + }, 388 + }, 389 + }, { 390 + .id = TEGRA186_MEMORY_CLIENT_SDMMCRAA, 391 + .name = "sdmmcraa", 392 + .sid = TEGRA186_SID_SDMMC2, 393 + .regs = { 394 + .sid = { 395 + .override = 0x308, 396 + .security = 0x30c, 397 + }, 398 + }, 399 + }, { 400 + .id = TEGRA186_MEMORY_CLIENT_SDMMCR, 401 + .name = "sdmmcr", 402 + .sid = TEGRA186_SID_SDMMC3, 403 + .regs = { 404 + .sid = { 405 + .override = 0x310, 406 + .security = 0x314, 407 + }, 408 + }, 409 + }, { 410 + .id = TEGRA186_MEMORY_CLIENT_SDMMCRAB, 411 + .name = "sdmmcrab", 412 + .sid = TEGRA186_SID_SDMMC4, 413 + .regs = { 414 + .sid = { 415 + .override = 0x318, 416 + .security = 0x31c, 417 + }, 418 + }, 419 + }, { 420 + .id = TEGRA186_MEMORY_CLIENT_SDMMCWA, 421 + .name = "sdmmcwa", 422 + .sid = TEGRA186_SID_SDMMC1, 423 + .regs = { 424 + .sid = { 425 + .override = 0x320, 426 + .security = 0x324, 427 + }, 428 + }, 429 + }, { 430 + .id = TEGRA186_MEMORY_CLIENT_SDMMCWAA, 431 + .name = "sdmmcwaa", 432 + .sid = TEGRA186_SID_SDMMC2, 433 + .regs = { 434 + .sid = { 435 + .override = 0x328, 436 + .security = 0x32c, 437 + }, 438 + }, 439 + }, { 440 + .id = TEGRA186_MEMORY_CLIENT_SDMMCW, 441 + .name = "sdmmcw", 442 + .sid = TEGRA186_SID_SDMMC3, 443 + .regs = { 444 + .sid = { 445 + .override = 0x330, 446 + .security = 0x334, 447 + }, 448 + }, 449 + }, { 450 + .id = TEGRA186_MEMORY_CLIENT_SDMMCWAB, 451 + .name = "sdmmcwab", 452 + .sid = TEGRA186_SID_SDMMC4, 453 + .regs = { 454 + .sid = { 455 + .override = 0x338, 456 + .security = 0x33c, 457 + }, 458 + }, 459 + }, { 460 + .id = TEGRA186_MEMORY_CLIENT_VICSRD, 461 + .name = "vicsrd", 462 + .sid = TEGRA186_SID_VIC, 463 + .regs = { 464 + .sid = { 465 + .override = 0x360, 466 + .security = 0x364, 467 + }, 468 + }, 469 + }, { 470 + .id = TEGRA186_MEMORY_CLIENT_VICSWR, 471 + .name = "vicswr", 472 + .sid = TEGRA186_SID_VIC, 473 + .regs = { 474 + .sid = { 475 + .override = 0x368, 476 + .security = 0x36c, 477 + }, 478 + }, 479 + }, { 480 + .id = TEGRA186_MEMORY_CLIENT_VIW, 481 + .name = "viw", 482 + .sid = TEGRA186_SID_VI, 483 + .regs = { 484 + .sid = { 485 + .override = 0x390, 486 + .security = 0x394, 487 + }, 488 + }, 489 + }, { 490 + .id = TEGRA186_MEMORY_CLIENT_NVDECSRD, 491 + .name = "nvdecsrd", 492 + .sid = TEGRA186_SID_NVDEC, 493 + .regs = { 494 + .sid = { 495 + .override = 0x3c0, 496 + .security = 0x3c4, 497 + }, 498 + }, 499 + }, { 500 + .id = TEGRA186_MEMORY_CLIENT_NVDECSWR, 501 + .name = "nvdecswr", 502 + .sid = TEGRA186_SID_NVDEC, 503 + .regs = { 504 + .sid = { 505 + .override = 0x3c8, 506 + .security = 0x3cc, 507 + }, 508 + }, 509 + }, { 510 + .id = TEGRA186_MEMORY_CLIENT_APER, 511 + .name = "aper", 512 + .sid = TEGRA186_SID_APE, 513 + .regs = { 514 + .sid = { 515 + .override = 0x3d0, 516 + .security = 0x3d4, 517 + }, 518 + }, 519 + }, { 520 + .id = TEGRA186_MEMORY_CLIENT_APEW, 521 + .name = "apew", 522 + .sid = TEGRA186_SID_APE, 523 + .regs = { 524 + .sid = { 525 + .override = 0x3d8, 526 + .security = 0x3dc, 527 + }, 528 + }, 529 + }, { 530 + .id = TEGRA186_MEMORY_CLIENT_NVJPGSRD, 531 + .name = "nvjpgsrd", 532 + .sid = TEGRA186_SID_NVJPG, 533 + .regs = { 534 + .sid = { 535 + .override = 0x3f0, 536 + .security = 0x3f4, 537 + }, 538 + }, 539 + }, { 540 + .id = TEGRA186_MEMORY_CLIENT_NVJPGSWR, 541 + .name = "nvjpgswr", 542 + .sid = TEGRA186_SID_NVJPG, 543 + .regs = { 544 + .sid = { 545 + .override = 0x3f8, 546 + .security = 0x3fc, 547 + }, 548 + }, 549 + }, { 550 + .id = TEGRA186_MEMORY_CLIENT_SESRD, 551 + .name = "sesrd", 552 + .sid = TEGRA186_SID_SE, 553 + .regs = { 554 + .sid = { 555 + .override = 0x400, 556 + .security = 0x404, 557 + }, 558 + }, 559 + }, { 560 + .id = TEGRA186_MEMORY_CLIENT_SESWR, 561 + .name = "seswr", 562 + .sid = TEGRA186_SID_SE, 563 + .regs = { 564 + .sid = { 565 + .override = 0x408, 566 + .security = 0x40c, 567 + }, 568 + }, 569 + }, { 570 + .id = TEGRA186_MEMORY_CLIENT_ETRR, 571 + .name = "etrr", 572 + .sid = TEGRA186_SID_ETR, 573 + .regs = { 574 + .sid = { 575 + .override = 0x420, 576 + .security = 0x424, 577 + }, 578 + }, 579 + }, { 580 + .id = TEGRA186_MEMORY_CLIENT_ETRW, 581 + .name = "etrw", 582 + .sid = TEGRA186_SID_ETR, 583 + .regs = { 584 + .sid = { 585 + .override = 0x428, 586 + .security = 0x42c, 587 + }, 588 + }, 589 + }, { 590 + .id = TEGRA186_MEMORY_CLIENT_TSECSRDB, 591 + .name = "tsecsrdb", 592 + .sid = TEGRA186_SID_TSECB, 593 + .regs = { 594 + .sid = { 595 + .override = 0x430, 596 + .security = 0x434, 597 + }, 598 + }, 599 + }, { 600 + .id = TEGRA186_MEMORY_CLIENT_TSECSWRB, 601 + .name = "tsecswrb", 602 + .sid = TEGRA186_SID_TSECB, 603 + .regs = { 604 + .sid = { 605 + .override = 0x438, 606 + .security = 0x43c, 607 + }, 608 + }, 609 + }, { 610 + .id = TEGRA186_MEMORY_CLIENT_GPUSRD2, 611 + .name = "gpusrd2", 612 + .sid = TEGRA186_SID_GPU, 613 + .regs = { 614 + .sid = { 615 + .override = 0x440, 616 + .security = 0x444, 617 + }, 618 + }, 619 + }, { 620 + .id = TEGRA186_MEMORY_CLIENT_GPUSWR2, 621 + .name = "gpuswr2", 622 + .sid = TEGRA186_SID_GPU, 623 + .regs = { 624 + .sid = { 625 + .override = 0x448, 626 + .security = 0x44c, 627 + }, 628 + }, 629 + }, { 630 + .id = TEGRA186_MEMORY_CLIENT_AXISR, 631 + .name = "axisr", 632 + .sid = TEGRA186_SID_GPCDMA_0, 633 + .regs = { 634 + .sid = { 635 + .override = 0x460, 636 + .security = 0x464, 637 + }, 638 + }, 639 + }, { 640 + .id = TEGRA186_MEMORY_CLIENT_AXISW, 641 + .name = "axisw", 642 + .sid = TEGRA186_SID_GPCDMA_0, 643 + .regs = { 644 + .sid = { 645 + .override = 0x468, 646 + .security = 0x46c, 647 + }, 648 + }, 649 + }, { 650 + .id = TEGRA186_MEMORY_CLIENT_EQOSR, 651 + .name = "eqosr", 652 + .sid = TEGRA186_SID_EQOS, 653 + .regs = { 654 + .sid = { 655 + .override = 0x470, 656 + .security = 0x474, 657 + }, 658 + }, 659 + }, { 660 + .id = TEGRA186_MEMORY_CLIENT_EQOSW, 661 + .name = "eqosw", 662 + .sid = TEGRA186_SID_EQOS, 663 + .regs = { 664 + .sid = { 665 + .override = 0x478, 666 + .security = 0x47c, 667 + }, 668 + }, 669 + }, { 670 + .id = TEGRA186_MEMORY_CLIENT_UFSHCR, 671 + .name = "ufshcr", 672 + .sid = TEGRA186_SID_UFSHC, 673 + .regs = { 674 + .sid = { 675 + .override = 0x480, 676 + .security = 0x484, 677 + }, 678 + }, 679 + }, { 680 + .id = TEGRA186_MEMORY_CLIENT_UFSHCW, 681 + .name = "ufshcw", 682 + .sid = TEGRA186_SID_UFSHC, 683 + .regs = { 684 + .sid = { 685 + .override = 0x488, 686 + .security = 0x48c, 687 + }, 688 + }, 689 + }, { 690 + .id = TEGRA186_MEMORY_CLIENT_NVDISPLAYR, 691 + .name = "nvdisplayr", 692 + .sid = TEGRA186_SID_NVDISPLAY, 693 + .regs = { 694 + .sid = { 695 + .override = 0x490, 696 + .security = 0x494, 697 + }, 698 + }, 699 + }, { 700 + .id = TEGRA186_MEMORY_CLIENT_BPMPR, 701 + .name = "bpmpr", 702 + .sid = TEGRA186_SID_BPMP, 703 + .regs = { 704 + .sid = { 705 + .override = 0x498, 706 + .security = 0x49c, 707 + }, 708 + }, 709 + }, { 710 + .id = TEGRA186_MEMORY_CLIENT_BPMPW, 711 + .name = "bpmpw", 712 + .sid = TEGRA186_SID_BPMP, 713 + .regs = { 714 + .sid = { 715 + .override = 0x4a0, 716 + .security = 0x4a4, 717 + }, 718 + }, 719 + }, { 720 + .id = TEGRA186_MEMORY_CLIENT_BPMPDMAR, 721 + .name = "bpmpdmar", 722 + .sid = TEGRA186_SID_BPMP, 723 + .regs = { 724 + .sid = { 725 + .override = 0x4a8, 726 + .security = 0x4ac, 727 + }, 728 + }, 729 + }, { 730 + .id = TEGRA186_MEMORY_CLIENT_BPMPDMAW, 731 + .name = "bpmpdmaw", 732 + .sid = TEGRA186_SID_BPMP, 733 + .regs = { 734 + .sid = { 735 + .override = 0x4b0, 736 + .security = 0x4b4, 737 + }, 738 + }, 739 + }, { 740 + .id = TEGRA186_MEMORY_CLIENT_AONR, 741 + .name = "aonr", 742 + .sid = TEGRA186_SID_AON, 743 + .regs = { 744 + .sid = { 745 + .override = 0x4b8, 746 + .security = 0x4bc, 747 + }, 748 + }, 749 + }, { 750 + .id = TEGRA186_MEMORY_CLIENT_AONW, 751 + .name = "aonw", 752 + .sid = TEGRA186_SID_AON, 753 + .regs = { 754 + .sid = { 755 + .override = 0x4c0, 756 + .security = 0x4c4, 757 + }, 758 + }, 759 + }, { 760 + .id = TEGRA186_MEMORY_CLIENT_AONDMAR, 761 + .name = "aondmar", 762 + .sid = TEGRA186_SID_AON, 763 + .regs = { 764 + .sid = { 765 + .override = 0x4c8, 766 + .security = 0x4cc, 767 + }, 768 + }, 769 + }, { 770 + .id = TEGRA186_MEMORY_CLIENT_AONDMAW, 771 + .name = "aondmaw", 772 + .sid = TEGRA186_SID_AON, 773 + .regs = { 774 + .sid = { 775 + .override = 0x4d0, 776 + .security = 0x4d4, 777 + }, 778 + }, 779 + }, { 780 + .id = TEGRA186_MEMORY_CLIENT_SCER, 781 + .name = "scer", 782 + .sid = TEGRA186_SID_SCE, 783 + .regs = { 784 + .sid = { 785 + .override = 0x4d8, 786 + .security = 0x4dc, 787 + }, 788 + }, 789 + }, { 790 + .id = TEGRA186_MEMORY_CLIENT_SCEW, 791 + .name = "scew", 792 + .sid = TEGRA186_SID_SCE, 793 + .regs = { 794 + .sid = { 795 + .override = 0x4e0, 796 + .security = 0x4e4, 797 + }, 798 + }, 799 + }, { 800 + .id = TEGRA186_MEMORY_CLIENT_SCEDMAR, 801 + .name = "scedmar", 802 + .sid = TEGRA186_SID_SCE, 803 + .regs = { 804 + .sid = { 805 + .override = 0x4e8, 806 + .security = 0x4ec, 807 + }, 808 + }, 809 + }, { 810 + .id = TEGRA186_MEMORY_CLIENT_SCEDMAW, 811 + .name = "scedmaw", 812 + .sid = TEGRA186_SID_SCE, 813 + .regs = { 814 + .sid = { 815 + .override = 0x4f0, 816 + .security = 0x4f4, 817 + }, 818 + }, 819 + }, { 820 + .id = TEGRA186_MEMORY_CLIENT_APEDMAR, 821 + .name = "apedmar", 822 + .sid = TEGRA186_SID_APE, 823 + .regs = { 824 + .sid = { 825 + .override = 0x4f8, 826 + .security = 0x4fc, 827 + }, 828 + }, 829 + }, { 830 + .id = TEGRA186_MEMORY_CLIENT_APEDMAW, 831 + .name = "apedmaw", 832 + .sid = TEGRA186_SID_APE, 833 + .regs = { 834 + .sid = { 835 + .override = 0x500, 836 + .security = 0x504, 837 + }, 838 + }, 839 + }, { 840 + .id = TEGRA186_MEMORY_CLIENT_NVDISPLAYR1, 841 + .name = "nvdisplayr1", 842 + .sid = TEGRA186_SID_NVDISPLAY, 843 + .regs = { 844 + .sid = { 845 + .override = 0x508, 846 + .security = 0x50c, 847 + }, 848 + }, 849 + }, { 850 + .id = TEGRA186_MEMORY_CLIENT_VICSRD1, 851 + .name = "vicsrd1", 852 + .sid = TEGRA186_SID_VIC, 853 + .regs = { 854 + .sid = { 855 + .override = 0x510, 856 + .security = 0x514, 857 + }, 858 + }, 859 + }, { 860 + .id = TEGRA186_MEMORY_CLIENT_NVDECSRD1, 861 + .name = "nvdecsrd1", 862 + .sid = TEGRA186_SID_NVDEC, 863 + .regs = { 864 + .sid = { 865 + .override = 0x518, 866 + .security = 0x51c, 867 + }, 868 + }, 869 + }, 870 + }; 871 + 872 + const struct tegra_mc_soc tegra186_mc_soc = { 873 + .num_clients = ARRAY_SIZE(tegra186_mc_clients), 874 + .clients = tegra186_mc_clients, 875 + .num_address_bits = 40, 876 + .ops = &tegra186_mc_ops, 877 + }; 878 + #endif
+1351
drivers/memory/tegra/tegra194.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-only 2 + /* 3 + * Copyright (C) 2017-2021 NVIDIA CORPORATION. All rights reserved. 4 + */ 5 + 6 + #include <soc/tegra/mc.h> 7 + 8 + #include <dt-bindings/memory/tegra194-mc.h> 9 + 10 + #include "mc.h" 11 + 12 + static const struct tegra_mc_client tegra194_mc_clients[] = { 13 + { 14 + .id = TEGRA194_MEMORY_CLIENT_PTCR, 15 + .name = "ptcr", 16 + .sid = TEGRA194_SID_PASSTHROUGH, 17 + .regs = { 18 + .sid = { 19 + .override = 0x000, 20 + .security = 0x004, 21 + }, 22 + }, 23 + }, { 24 + .id = TEGRA194_MEMORY_CLIENT_MIU7R, 25 + .name = "miu7r", 26 + .sid = TEGRA194_SID_MIU, 27 + .regs = { 28 + .sid = { 29 + .override = 0x008, 30 + .security = 0x00c, 31 + }, 32 + }, 33 + }, { 34 + .id = TEGRA194_MEMORY_CLIENT_MIU7W, 35 + .name = "miu7w", 36 + .sid = TEGRA194_SID_MIU, 37 + .regs = { 38 + .sid = { 39 + .override = 0x010, 40 + .security = 0x014, 41 + }, 42 + }, 43 + }, { 44 + .id = TEGRA194_MEMORY_CLIENT_HDAR, 45 + .name = "hdar", 46 + .sid = TEGRA194_SID_HDA, 47 + .regs = { 48 + .sid = { 49 + .override = 0x0a8, 50 + .security = 0x0ac, 51 + }, 52 + }, 53 + }, { 54 + .id = TEGRA194_MEMORY_CLIENT_HOST1XDMAR, 55 + .name = "host1xdmar", 56 + .sid = TEGRA194_SID_HOST1X, 57 + .regs = { 58 + .sid = { 59 + .override = 0x0b0, 60 + .security = 0x0b4, 61 + }, 62 + }, 63 + }, { 64 + .id = TEGRA194_MEMORY_CLIENT_NVENCSRD, 65 + .name = "nvencsrd", 66 + .sid = TEGRA194_SID_NVENC, 67 + .regs = { 68 + .sid = { 69 + .override = 0x0e0, 70 + .security = 0x0e4, 71 + }, 72 + }, 73 + }, { 74 + .id = TEGRA194_MEMORY_CLIENT_SATAR, 75 + .name = "satar", 76 + .sid = TEGRA194_SID_SATA, 77 + .regs = { 78 + .sid = { 79 + .override = 0x0f8, 80 + .security = 0x0fc, 81 + }, 82 + }, 83 + }, { 84 + .id = TEGRA194_MEMORY_CLIENT_MPCORER, 85 + .name = "mpcorer", 86 + .sid = TEGRA194_SID_PASSTHROUGH, 87 + .regs = { 88 + .sid = { 89 + .override = 0x138, 90 + .security = 0x13c, 91 + }, 92 + }, 93 + }, { 94 + .id = TEGRA194_MEMORY_CLIENT_NVENCSWR, 95 + .name = "nvencswr", 96 + .sid = TEGRA194_SID_NVENC, 97 + .regs = { 98 + .sid = { 99 + .override = 0x158, 100 + .security = 0x15c, 101 + }, 102 + }, 103 + }, { 104 + .id = TEGRA194_MEMORY_CLIENT_HDAW, 105 + .name = "hdaw", 106 + .sid = TEGRA194_SID_HDA, 107 + .regs = { 108 + .sid = { 109 + .override = 0x1a8, 110 + .security = 0x1ac, 111 + }, 112 + }, 113 + }, { 114 + .id = TEGRA194_MEMORY_CLIENT_MPCOREW, 115 + .name = "mpcorew", 116 + .sid = TEGRA194_SID_PASSTHROUGH, 117 + .regs = { 118 + .sid = { 119 + .override = 0x1c8, 120 + .security = 0x1cc, 121 + }, 122 + }, 123 + }, { 124 + .id = TEGRA194_MEMORY_CLIENT_SATAW, 125 + .name = "sataw", 126 + .sid = TEGRA194_SID_SATA, 127 + .regs = { 128 + .sid = { 129 + .override = 0x1e8, 130 + .security = 0x1ec, 131 + }, 132 + }, 133 + }, { 134 + .id = TEGRA194_MEMORY_CLIENT_ISPRA, 135 + .name = "ispra", 136 + .sid = TEGRA194_SID_ISP, 137 + .regs = { 138 + .sid = { 139 + .override = 0x220, 140 + .security = 0x224, 141 + }, 142 + }, 143 + }, { 144 + .id = TEGRA194_MEMORY_CLIENT_ISPFALR, 145 + .name = "ispfalr", 146 + .sid = TEGRA194_SID_ISP_FALCON, 147 + .regs = { 148 + .sid = { 149 + .override = 0x228, 150 + .security = 0x22c, 151 + }, 152 + }, 153 + }, { 154 + .id = TEGRA194_MEMORY_CLIENT_ISPWA, 155 + .name = "ispwa", 156 + .sid = TEGRA194_SID_ISP, 157 + .regs = { 158 + .sid = { 159 + .override = 0x230, 160 + .security = 0x234, 161 + }, 162 + }, 163 + }, { 164 + .id = TEGRA194_MEMORY_CLIENT_ISPWB, 165 + .name = "ispwb", 166 + .sid = TEGRA194_SID_ISP, 167 + .regs = { 168 + .sid = { 169 + .override = 0x238, 170 + .security = 0x23c, 171 + }, 172 + }, 173 + }, { 174 + .id = TEGRA194_MEMORY_CLIENT_XUSB_HOSTR, 175 + .name = "xusb_hostr", 176 + .sid = TEGRA194_SID_XUSB_HOST, 177 + .regs = { 178 + .sid = { 179 + .override = 0x250, 180 + .security = 0x254, 181 + }, 182 + }, 183 + }, { 184 + .id = TEGRA194_MEMORY_CLIENT_XUSB_HOSTW, 185 + .name = "xusb_hostw", 186 + .sid = TEGRA194_SID_XUSB_HOST, 187 + .regs = { 188 + .sid = { 189 + .override = 0x258, 190 + .security = 0x25c, 191 + }, 192 + }, 193 + }, { 194 + .id = TEGRA194_MEMORY_CLIENT_XUSB_DEVR, 195 + .name = "xusb_devr", 196 + .sid = TEGRA194_SID_XUSB_DEV, 197 + .regs = { 198 + .sid = { 199 + .override = 0x260, 200 + .security = 0x264, 201 + }, 202 + }, 203 + }, { 204 + .id = TEGRA194_MEMORY_CLIENT_XUSB_DEVW, 205 + .name = "xusb_devw", 206 + .sid = TEGRA194_SID_XUSB_DEV, 207 + .regs = { 208 + .sid = { 209 + .override = 0x268, 210 + .security = 0x26c, 211 + }, 212 + }, 213 + }, { 214 + .id = TEGRA194_MEMORY_CLIENT_SDMMCRA, 215 + .name = "sdmmcra", 216 + .sid = TEGRA194_SID_SDMMC1, 217 + .regs = { 218 + .sid = { 219 + .override = 0x300, 220 + .security = 0x304, 221 + }, 222 + }, 223 + }, { 224 + .id = TEGRA194_MEMORY_CLIENT_SDMMCR, 225 + .name = "sdmmcr", 226 + .sid = TEGRA194_SID_SDMMC3, 227 + .regs = { 228 + .sid = { 229 + .override = 0x310, 230 + .security = 0x314, 231 + }, 232 + }, 233 + }, { 234 + .id = TEGRA194_MEMORY_CLIENT_SDMMCRAB, 235 + .name = "sdmmcrab", 236 + .sid = TEGRA194_SID_SDMMC4, 237 + .regs = { 238 + .sid = { 239 + .override = 0x318, 240 + .security = 0x31c, 241 + }, 242 + }, 243 + }, { 244 + .id = TEGRA194_MEMORY_CLIENT_SDMMCWA, 245 + .name = "sdmmcwa", 246 + .sid = TEGRA194_SID_SDMMC1, 247 + .regs = { 248 + .sid = { 249 + .override = 0x320, 250 + .security = 0x324, 251 + }, 252 + }, 253 + }, { 254 + .id = TEGRA194_MEMORY_CLIENT_SDMMCW, 255 + .name = "sdmmcw", 256 + .sid = TEGRA194_SID_SDMMC3, 257 + .regs = { 258 + .sid = { 259 + .override = 0x330, 260 + .security = 0x334, 261 + }, 262 + }, 263 + }, { 264 + .id = TEGRA194_MEMORY_CLIENT_SDMMCWAB, 265 + .name = "sdmmcwab", 266 + .sid = TEGRA194_SID_SDMMC4, 267 + .regs = { 268 + .sid = { 269 + .override = 0x338, 270 + .security = 0x33c, 271 + }, 272 + }, 273 + }, { 274 + .id = TEGRA194_MEMORY_CLIENT_VICSRD, 275 + .name = "vicsrd", 276 + .sid = TEGRA194_SID_VIC, 277 + .regs = { 278 + .sid = { 279 + .override = 0x360, 280 + .security = 0x364, 281 + }, 282 + }, 283 + }, { 284 + .id = TEGRA194_MEMORY_CLIENT_VICSWR, 285 + .name = "vicswr", 286 + .sid = TEGRA194_SID_VIC, 287 + .regs = { 288 + .sid = { 289 + .override = 0x368, 290 + .security = 0x36c, 291 + }, 292 + }, 293 + }, { 294 + .id = TEGRA194_MEMORY_CLIENT_VIW, 295 + .name = "viw", 296 + .sid = TEGRA194_SID_VI, 297 + .regs = { 298 + .sid = { 299 + .override = 0x390, 300 + .security = 0x394, 301 + }, 302 + }, 303 + }, { 304 + .id = TEGRA194_MEMORY_CLIENT_NVDECSRD, 305 + .name = "nvdecsrd", 306 + .sid = TEGRA194_SID_NVDEC, 307 + .regs = { 308 + .sid = { 309 + .override = 0x3c0, 310 + .security = 0x3c4, 311 + }, 312 + }, 313 + }, { 314 + .id = TEGRA194_MEMORY_CLIENT_NVDECSWR, 315 + .name = "nvdecswr", 316 + .sid = TEGRA194_SID_NVDEC, 317 + .regs = { 318 + .sid = { 319 + .override = 0x3c8, 320 + .security = 0x3cc, 321 + }, 322 + }, 323 + }, { 324 + .id = TEGRA194_MEMORY_CLIENT_APER, 325 + .name = "aper", 326 + .sid = TEGRA194_SID_APE, 327 + .regs = { 328 + .sid = { 329 + .override = 0x3c0, 330 + .security = 0x3c4, 331 + }, 332 + }, 333 + }, { 334 + .id = TEGRA194_MEMORY_CLIENT_APEW, 335 + .name = "apew", 336 + .sid = TEGRA194_SID_APE, 337 + .regs = { 338 + .sid = { 339 + .override = 0x3d0, 340 + .security = 0x3d4, 341 + }, 342 + }, 343 + }, { 344 + .id = TEGRA194_MEMORY_CLIENT_NVJPGSRD, 345 + .name = "nvjpgsrd", 346 + .sid = TEGRA194_SID_NVJPG, 347 + .regs = { 348 + .sid = { 349 + .override = 0x3f0, 350 + .security = 0x3f4, 351 + }, 352 + }, 353 + }, { 354 + .id = TEGRA194_MEMORY_CLIENT_NVJPGSWR, 355 + .name = "nvjpgswr", 356 + .sid = TEGRA194_SID_NVJPG, 357 + .regs = { 358 + .sid = { 359 + .override = 0x3f0, 360 + .security = 0x3f4, 361 + }, 362 + }, 363 + }, { 364 + .name = "axiapr", 365 + .id = TEGRA194_MEMORY_CLIENT_AXIAPR, 366 + .sid = TEGRA194_SID_PASSTHROUGH, 367 + .regs = { 368 + .sid = { 369 + .override = 0x410, 370 + .security = 0x414, 371 + }, 372 + }, 373 + }, { 374 + .id = TEGRA194_MEMORY_CLIENT_AXIAPW, 375 + .name = "axiapw", 376 + .sid = TEGRA194_SID_PASSTHROUGH, 377 + .regs = { 378 + .sid = { 379 + .override = 0x418, 380 + .security = 0x41c, 381 + }, 382 + }, 383 + }, { 384 + .id = TEGRA194_MEMORY_CLIENT_ETRR, 385 + .name = "etrr", 386 + .sid = TEGRA194_SID_ETR, 387 + .regs = { 388 + .sid = { 389 + .override = 0x420, 390 + .security = 0x424, 391 + }, 392 + }, 393 + }, { 394 + .id = TEGRA194_MEMORY_CLIENT_ETRW, 395 + .name = "etrw", 396 + .sid = TEGRA194_SID_ETR, 397 + .regs = { 398 + .sid = { 399 + .override = 0x428, 400 + .security = 0x42c, 401 + }, 402 + }, 403 + }, { 404 + .id = TEGRA194_MEMORY_CLIENT_AXISR, 405 + .name = "axisr", 406 + .sid = TEGRA194_SID_PASSTHROUGH, 407 + .regs = { 408 + .sid = { 409 + .override = 0x460, 410 + .security = 0x464, 411 + }, 412 + }, 413 + }, { 414 + .id = TEGRA194_MEMORY_CLIENT_AXISW, 415 + .name = "axisw", 416 + .sid = TEGRA194_SID_PASSTHROUGH, 417 + .regs = { 418 + .sid = { 419 + .override = 0x468, 420 + .security = 0x46c, 421 + }, 422 + }, 423 + }, { 424 + .id = TEGRA194_MEMORY_CLIENT_EQOSR, 425 + .name = "eqosr", 426 + .sid = TEGRA194_SID_EQOS, 427 + .regs = { 428 + .sid = { 429 + .override = 0x470, 430 + .security = 0x474, 431 + }, 432 + }, 433 + }, { 434 + .name = "eqosw", 435 + .id = TEGRA194_MEMORY_CLIENT_EQOSW, 436 + .sid = TEGRA194_SID_EQOS, 437 + .regs = { 438 + .sid = { 439 + .override = 0x478, 440 + .security = 0x47c, 441 + }, 442 + }, 443 + }, { 444 + .id = TEGRA194_MEMORY_CLIENT_UFSHCR, 445 + .name = "ufshcr", 446 + .sid = TEGRA194_SID_UFSHC, 447 + .regs = { 448 + .sid = { 449 + .override = 0x480, 450 + .security = 0x484, 451 + }, 452 + }, 453 + }, { 454 + .id = TEGRA194_MEMORY_CLIENT_UFSHCW, 455 + .name = "ufshcw", 456 + .sid = TEGRA194_SID_UFSHC, 457 + .regs = { 458 + .sid = { 459 + .override = 0x488, 460 + .security = 0x48c, 461 + }, 462 + }, 463 + }, { 464 + .id = TEGRA194_MEMORY_CLIENT_NVDISPLAYR, 465 + .name = "nvdisplayr", 466 + .sid = TEGRA194_SID_NVDISPLAY, 467 + .regs = { 468 + .sid = { 469 + .override = 0x490, 470 + .security = 0x494, 471 + }, 472 + }, 473 + }, { 474 + .id = TEGRA194_MEMORY_CLIENT_BPMPR, 475 + .name = "bpmpr", 476 + .sid = TEGRA194_SID_BPMP, 477 + .regs = { 478 + .sid = { 479 + .override = 0x498, 480 + .security = 0x49c, 481 + }, 482 + }, 483 + }, { 484 + .id = TEGRA194_MEMORY_CLIENT_BPMPW, 485 + .name = "bpmpw", 486 + .sid = TEGRA194_SID_BPMP, 487 + .regs = { 488 + .sid = { 489 + .override = 0x4a0, 490 + .security = 0x4a4, 491 + }, 492 + }, 493 + }, { 494 + .id = TEGRA194_MEMORY_CLIENT_BPMPDMAR, 495 + .name = "bpmpdmar", 496 + .sid = TEGRA194_SID_BPMP, 497 + .regs = { 498 + .sid = { 499 + .override = 0x4a8, 500 + .security = 0x4ac, 501 + }, 502 + }, 503 + }, { 504 + .id = TEGRA194_MEMORY_CLIENT_BPMPDMAW, 505 + .name = "bpmpdmaw", 506 + .sid = TEGRA194_SID_BPMP, 507 + .regs = { 508 + .sid = { 509 + .override = 0x4b0, 510 + .security = 0x4b4, 511 + }, 512 + }, 513 + }, { 514 + .id = TEGRA194_MEMORY_CLIENT_AONR, 515 + .name = "aonr", 516 + .sid = TEGRA194_SID_AON, 517 + .regs = { 518 + .sid = { 519 + .override = 0x4b8, 520 + .security = 0x4bc, 521 + }, 522 + }, 523 + }, { 524 + .id = TEGRA194_MEMORY_CLIENT_AONW, 525 + .name = "aonw", 526 + .sid = TEGRA194_SID_AON, 527 + .regs = { 528 + .sid = { 529 + .override = 0x4c0, 530 + .security = 0x4c4, 531 + }, 532 + }, 533 + }, { 534 + .id = TEGRA194_MEMORY_CLIENT_AONDMAR, 535 + .name = "aondmar", 536 + .sid = TEGRA194_SID_AON, 537 + .regs = { 538 + .sid = { 539 + .override = 0x4c8, 540 + .security = 0x4cc, 541 + }, 542 + }, 543 + }, { 544 + .id = TEGRA194_MEMORY_CLIENT_AONDMAW, 545 + .name = "aondmaw", 546 + .sid = TEGRA194_SID_AON, 547 + .regs = { 548 + .sid = { 549 + .override = 0x4d0, 550 + .security = 0x4d4, 551 + }, 552 + }, 553 + }, { 554 + .id = TEGRA194_MEMORY_CLIENT_SCER, 555 + .name = "scer", 556 + .sid = TEGRA194_SID_SCE, 557 + .regs = { 558 + .sid = { 559 + .override = 0x4d8, 560 + .security = 0x4dc, 561 + }, 562 + }, 563 + }, { 564 + .id = TEGRA194_MEMORY_CLIENT_SCEW, 565 + .name = "scew", 566 + .sid = TEGRA194_SID_SCE, 567 + .regs = { 568 + .sid = { 569 + .override = 0x4e0, 570 + .security = 0x4e4, 571 + }, 572 + }, 573 + }, { 574 + .id = TEGRA194_MEMORY_CLIENT_SCEDMAR, 575 + .name = "scedmar", 576 + .sid = TEGRA194_SID_SCE, 577 + .regs = { 578 + .sid = { 579 + .override = 0x4e8, 580 + .security = 0x4ec, 581 + }, 582 + }, 583 + }, { 584 + .id = TEGRA194_MEMORY_CLIENT_SCEDMAW, 585 + .name = "scedmaw", 586 + .sid = TEGRA194_SID_SCE, 587 + .regs = { 588 + .sid = { 589 + .override = 0x4f0, 590 + .security = 0x4f4, 591 + }, 592 + }, 593 + }, { 594 + .id = TEGRA194_MEMORY_CLIENT_APEDMAR, 595 + .name = "apedmar", 596 + .sid = TEGRA194_SID_APE, 597 + .regs = { 598 + .sid = { 599 + .override = 0x4f8, 600 + .security = 0x4fc, 601 + }, 602 + }, 603 + }, { 604 + .id = TEGRA194_MEMORY_CLIENT_APEDMAW, 605 + .name = "apedmaw", 606 + .sid = TEGRA194_SID_APE, 607 + .regs = { 608 + .sid = { 609 + .override = 0x500, 610 + .security = 0x504, 611 + }, 612 + }, 613 + }, { 614 + .id = TEGRA194_MEMORY_CLIENT_NVDISPLAYR1, 615 + .name = "nvdisplayr1", 616 + .sid = TEGRA194_SID_NVDISPLAY, 617 + .regs = { 618 + .sid = { 619 + .override = 0x508, 620 + .security = 0x50c, 621 + }, 622 + }, 623 + }, { 624 + .id = TEGRA194_MEMORY_CLIENT_VICSRD1, 625 + .name = "vicsrd1", 626 + .sid = TEGRA194_SID_VIC, 627 + .regs = { 628 + .sid = { 629 + .override = 0x510, 630 + .security = 0x514, 631 + }, 632 + }, 633 + }, { 634 + .id = TEGRA194_MEMORY_CLIENT_NVDECSRD1, 635 + .name = "nvdecsrd1", 636 + .sid = TEGRA194_SID_NVDEC, 637 + .regs = { 638 + .sid = { 639 + .override = 0x518, 640 + .security = 0x51c, 641 + }, 642 + }, 643 + }, { 644 + .id = TEGRA194_MEMORY_CLIENT_MIU0R, 645 + .name = "miu0r", 646 + .sid = TEGRA194_SID_MIU, 647 + .regs = { 648 + .sid = { 649 + .override = 0x530, 650 + .security = 0x534, 651 + }, 652 + }, 653 + }, { 654 + .name = "miu0w", 655 + .id = TEGRA194_MEMORY_CLIENT_MIU0W, 656 + .sid = TEGRA194_SID_MIU, 657 + .regs = { 658 + .sid = { 659 + .override = 0x538, 660 + .security = 0x53c, 661 + }, 662 + }, 663 + }, { 664 + .id = TEGRA194_MEMORY_CLIENT_MIU1R, 665 + .name = "miu1r", 666 + .sid = TEGRA194_SID_MIU, 667 + .regs = { 668 + .sid = { 669 + .override = 0x540, 670 + .security = 0x544, 671 + }, 672 + }, 673 + }, { 674 + .id = TEGRA194_MEMORY_CLIENT_MIU1W, 675 + .name = "miu1w", 676 + .sid = TEGRA194_SID_MIU, 677 + .regs = { 678 + .sid = { 679 + .override = 0x548, 680 + .security = 0x54c, 681 + }, 682 + }, 683 + }, { 684 + .id = TEGRA194_MEMORY_CLIENT_MIU2R, 685 + .name = "miu2r", 686 + .sid = TEGRA194_SID_MIU, 687 + .regs = { 688 + .sid = { 689 + .override = 0x570, 690 + .security = 0x574, 691 + }, 692 + }, 693 + }, { 694 + .id = TEGRA194_MEMORY_CLIENT_MIU2W, 695 + .name = "miu2w", 696 + .sid = TEGRA194_SID_MIU, 697 + .regs = { 698 + .sid = { 699 + .override = 0x578, 700 + .security = 0x57c, 701 + }, 702 + }, 703 + }, { 704 + .id = TEGRA194_MEMORY_CLIENT_MIU3R, 705 + .name = "miu3r", 706 + .sid = TEGRA194_SID_MIU, 707 + .regs = { 708 + .sid = { 709 + .override = 0x580, 710 + .security = 0x584, 711 + }, 712 + }, 713 + }, { 714 + .id = TEGRA194_MEMORY_CLIENT_MIU3W, 715 + .name = "miu3w", 716 + .sid = TEGRA194_SID_MIU, 717 + .regs = { 718 + .sid = { 719 + .override = 0x588, 720 + .security = 0x58c, 721 + }, 722 + }, 723 + }, { 724 + .id = TEGRA194_MEMORY_CLIENT_MIU4R, 725 + .name = "miu4r", 726 + .sid = TEGRA194_SID_MIU, 727 + .regs = { 728 + .sid = { 729 + .override = 0x590, 730 + .security = 0x594, 731 + }, 732 + }, 733 + }, { 734 + .id = TEGRA194_MEMORY_CLIENT_MIU4W, 735 + .name = "miu4w", 736 + .sid = TEGRA194_SID_MIU, 737 + .regs = { 738 + .sid = { 739 + .override = 0x598, 740 + .security = 0x59c, 741 + }, 742 + }, 743 + }, { 744 + .id = TEGRA194_MEMORY_CLIENT_DPMUR, 745 + .name = "dpmur", 746 + .sid = TEGRA194_SID_PASSTHROUGH, 747 + .regs = { 748 + .sid = { 749 + .override = 0x598, 750 + .security = 0x59c, 751 + }, 752 + }, 753 + }, { 754 + .id = TEGRA194_MEMORY_CLIENT_VIFALR, 755 + .name = "vifalr", 756 + .sid = TEGRA194_SID_VI_FALCON, 757 + .regs = { 758 + .sid = { 759 + .override = 0x5e0, 760 + .security = 0x5e4, 761 + }, 762 + }, 763 + }, { 764 + .id = TEGRA194_MEMORY_CLIENT_VIFALW, 765 + .name = "vifalw", 766 + .sid = TEGRA194_SID_VI_FALCON, 767 + .regs = { 768 + .sid = { 769 + .override = 0x5e8, 770 + .security = 0x5ec, 771 + }, 772 + }, 773 + }, { 774 + .id = TEGRA194_MEMORY_CLIENT_DLA0RDA, 775 + .name = "dla0rda", 776 + .sid = TEGRA194_SID_NVDLA0, 777 + .regs = { 778 + .sid = { 779 + .override = 0x5f0, 780 + .security = 0x5f4, 781 + }, 782 + }, 783 + }, { 784 + .id = TEGRA194_MEMORY_CLIENT_DLA0FALRDB, 785 + .name = "dla0falrdb", 786 + .sid = TEGRA194_SID_NVDLA0, 787 + .regs = { 788 + .sid = { 789 + .override = 0x5f8, 790 + .security = 0x5fc, 791 + }, 792 + }, 793 + }, { 794 + .id = TEGRA194_MEMORY_CLIENT_DLA0WRA, 795 + .name = "dla0wra", 796 + .sid = TEGRA194_SID_NVDLA0, 797 + .regs = { 798 + .sid = { 799 + .override = 0x600, 800 + .security = 0x604, 801 + }, 802 + }, 803 + }, { 804 + .id = TEGRA194_MEMORY_CLIENT_DLA0FALWRB, 805 + .name = "dla0falwrb", 806 + .sid = TEGRA194_SID_NVDLA0, 807 + .regs = { 808 + .sid = { 809 + .override = 0x608, 810 + .security = 0x60c, 811 + }, 812 + }, 813 + }, { 814 + .id = TEGRA194_MEMORY_CLIENT_DLA1RDA, 815 + .name = "dla1rda", 816 + .sid = TEGRA194_SID_NVDLA1, 817 + .regs = { 818 + .sid = { 819 + .override = 0x610, 820 + .security = 0x614, 821 + }, 822 + }, 823 + }, { 824 + .id = TEGRA194_MEMORY_CLIENT_DLA1FALRDB, 825 + .name = "dla1falrdb", 826 + .sid = TEGRA194_SID_NVDLA1, 827 + .regs = { 828 + .sid = { 829 + .override = 0x618, 830 + .security = 0x61c, 831 + }, 832 + }, 833 + }, { 834 + .id = TEGRA194_MEMORY_CLIENT_DLA1WRA, 835 + .name = "dla1wra", 836 + .sid = TEGRA194_SID_NVDLA1, 837 + .regs = { 838 + .sid = { 839 + .override = 0x620, 840 + .security = 0x624, 841 + }, 842 + }, 843 + }, { 844 + .id = TEGRA194_MEMORY_CLIENT_DLA1FALWRB, 845 + .name = "dla1falwrb", 846 + .sid = TEGRA194_SID_NVDLA1, 847 + .regs = { 848 + .sid = { 849 + .override = 0x628, 850 + .security = 0x62c, 851 + }, 852 + }, 853 + }, { 854 + .id = TEGRA194_MEMORY_CLIENT_PVA0RDA, 855 + .name = "pva0rda", 856 + .sid = TEGRA194_SID_PVA0, 857 + .regs = { 858 + .sid = { 859 + .override = 0x630, 860 + .security = 0x634, 861 + }, 862 + }, 863 + }, { 864 + .id = TEGRA194_MEMORY_CLIENT_PVA0RDB, 865 + .name = "pva0rdb", 866 + .sid = TEGRA194_SID_PVA0, 867 + .regs = { 868 + .sid = { 869 + .override = 0x638, 870 + .security = 0x63c, 871 + }, 872 + }, 873 + }, { 874 + .id = TEGRA194_MEMORY_CLIENT_PVA0RDC, 875 + .name = "pva0rdc", 876 + .sid = TEGRA194_SID_PVA0, 877 + .regs = { 878 + .sid = { 879 + .override = 0x640, 880 + .security = 0x644, 881 + }, 882 + }, 883 + }, { 884 + .id = TEGRA194_MEMORY_CLIENT_PVA0WRA, 885 + .name = "pva0wra", 886 + .sid = TEGRA194_SID_PVA0, 887 + .regs = { 888 + .sid = { 889 + .override = 0x648, 890 + .security = 0x64c, 891 + }, 892 + }, 893 + }, { 894 + .id = TEGRA194_MEMORY_CLIENT_PVA0WRB, 895 + .name = "pva0wrb", 896 + .sid = TEGRA194_SID_PVA0, 897 + .regs = { 898 + .sid = { 899 + .override = 0x650, 900 + .security = 0x654, 901 + }, 902 + }, 903 + }, { 904 + .id = TEGRA194_MEMORY_CLIENT_PVA0WRC, 905 + .name = "pva0wrc", 906 + .sid = TEGRA194_SID_PVA0, 907 + .regs = { 908 + .sid = { 909 + .override = 0x658, 910 + .security = 0x65c, 911 + }, 912 + }, 913 + }, { 914 + .id = TEGRA194_MEMORY_CLIENT_PVA1RDA, 915 + .name = "pva1rda", 916 + .sid = TEGRA194_SID_PVA1, 917 + .regs = { 918 + .sid = { 919 + .override = 0x660, 920 + .security = 0x664, 921 + }, 922 + }, 923 + }, { 924 + .id = TEGRA194_MEMORY_CLIENT_PVA1RDB, 925 + .name = "pva1rdb", 926 + .sid = TEGRA194_SID_PVA1, 927 + .regs = { 928 + .sid = { 929 + .override = 0x668, 930 + .security = 0x66c, 931 + }, 932 + }, 933 + }, { 934 + .id = TEGRA194_MEMORY_CLIENT_PVA1RDC, 935 + .name = "pva1rdc", 936 + .sid = TEGRA194_SID_PVA1, 937 + .regs = { 938 + .sid = { 939 + .override = 0x670, 940 + .security = 0x674, 941 + }, 942 + }, 943 + }, { 944 + .id = TEGRA194_MEMORY_CLIENT_PVA1WRA, 945 + .name = "pva1wra", 946 + .sid = TEGRA194_SID_PVA1, 947 + .regs = { 948 + .sid = { 949 + .override = 0x678, 950 + .security = 0x67c, 951 + }, 952 + }, 953 + }, { 954 + .id = TEGRA194_MEMORY_CLIENT_PVA1WRB, 955 + .name = "pva1wrb", 956 + .sid = TEGRA194_SID_PVA1, 957 + .regs = { 958 + .sid = { 959 + .override = 0x680, 960 + .security = 0x684, 961 + }, 962 + }, 963 + }, { 964 + .id = TEGRA194_MEMORY_CLIENT_PVA1WRC, 965 + .name = "pva1wrc", 966 + .sid = TEGRA194_SID_PVA1, 967 + .regs = { 968 + .sid = { 969 + .override = 0x688, 970 + .security = 0x68c, 971 + }, 972 + }, 973 + }, { 974 + .id = TEGRA194_MEMORY_CLIENT_RCER, 975 + .name = "rcer", 976 + .sid = TEGRA194_SID_RCE, 977 + .regs = { 978 + .sid = { 979 + .override = 0x690, 980 + .security = 0x694, 981 + }, 982 + }, 983 + }, { 984 + .id = TEGRA194_MEMORY_CLIENT_RCEW, 985 + .name = "rcew", 986 + .sid = TEGRA194_SID_RCE, 987 + .regs = { 988 + .sid = { 989 + .override = 0x698, 990 + .security = 0x69c, 991 + }, 992 + }, 993 + }, { 994 + .id = TEGRA194_MEMORY_CLIENT_RCEDMAR, 995 + .name = "rcedmar", 996 + .sid = TEGRA194_SID_RCE, 997 + .regs = { 998 + .sid = { 999 + .override = 0x6a0, 1000 + .security = 0x6a4, 1001 + }, 1002 + }, 1003 + }, { 1004 + .id = TEGRA194_MEMORY_CLIENT_RCEDMAW, 1005 + .name = "rcedmaw", 1006 + .sid = TEGRA194_SID_RCE, 1007 + .regs = { 1008 + .sid = { 1009 + .override = 0x6a8, 1010 + .security = 0x6ac, 1011 + }, 1012 + }, 1013 + }, { 1014 + .id = TEGRA194_MEMORY_CLIENT_NVENC1SRD, 1015 + .name = "nvenc1srd", 1016 + .sid = TEGRA194_SID_NVENC1, 1017 + .regs = { 1018 + .sid = { 1019 + .override = 0x6b0, 1020 + .security = 0x6b4, 1021 + }, 1022 + }, 1023 + }, { 1024 + .id = TEGRA194_MEMORY_CLIENT_NVENC1SWR, 1025 + .name = "nvenc1swr", 1026 + .sid = TEGRA194_SID_NVENC1, 1027 + .regs = { 1028 + .sid = { 1029 + .override = 0x6b8, 1030 + .security = 0x6bc, 1031 + }, 1032 + }, 1033 + }, { 1034 + .id = TEGRA194_MEMORY_CLIENT_PCIE0R, 1035 + .name = "pcie0r", 1036 + .sid = TEGRA194_SID_PCIE0, 1037 + .regs = { 1038 + .sid = { 1039 + .override = 0x6c0, 1040 + .security = 0x6c4, 1041 + }, 1042 + }, 1043 + }, { 1044 + .id = TEGRA194_MEMORY_CLIENT_PCIE0W, 1045 + .name = "pcie0w", 1046 + .sid = TEGRA194_SID_PCIE0, 1047 + .regs = { 1048 + .sid = { 1049 + .override = 0x6c8, 1050 + .security = 0x6cc, 1051 + }, 1052 + }, 1053 + }, { 1054 + .id = TEGRA194_MEMORY_CLIENT_PCIE1R, 1055 + .name = "pcie1r", 1056 + .sid = TEGRA194_SID_PCIE1, 1057 + .regs = { 1058 + .sid = { 1059 + .override = 0x6d0, 1060 + .security = 0x6d4, 1061 + }, 1062 + }, 1063 + }, { 1064 + .id = TEGRA194_MEMORY_CLIENT_PCIE1W, 1065 + .name = "pcie1w", 1066 + .sid = TEGRA194_SID_PCIE1, 1067 + .regs = { 1068 + .sid = { 1069 + .override = 0x6d8, 1070 + .security = 0x6dc, 1071 + }, 1072 + }, 1073 + }, { 1074 + .id = TEGRA194_MEMORY_CLIENT_PCIE2AR, 1075 + .name = "pcie2ar", 1076 + .sid = TEGRA194_SID_PCIE2, 1077 + .regs = { 1078 + .sid = { 1079 + .override = 0x6e0, 1080 + .security = 0x6e4, 1081 + }, 1082 + }, 1083 + }, { 1084 + .id = TEGRA194_MEMORY_CLIENT_PCIE2AW, 1085 + .name = "pcie2aw", 1086 + .sid = TEGRA194_SID_PCIE2, 1087 + .regs = { 1088 + .sid = { 1089 + .override = 0x6e8, 1090 + .security = 0x6ec, 1091 + }, 1092 + }, 1093 + }, { 1094 + .id = TEGRA194_MEMORY_CLIENT_PCIE3R, 1095 + .name = "pcie3r", 1096 + .sid = TEGRA194_SID_PCIE3, 1097 + .regs = { 1098 + .sid = { 1099 + .override = 0x6f0, 1100 + .security = 0x6f4, 1101 + }, 1102 + }, 1103 + }, { 1104 + .id = TEGRA194_MEMORY_CLIENT_PCIE3W, 1105 + .name = "pcie3w", 1106 + .sid = TEGRA194_SID_PCIE3, 1107 + .regs = { 1108 + .sid = { 1109 + .override = 0x6f8, 1110 + .security = 0x6fc, 1111 + }, 1112 + }, 1113 + }, { 1114 + .id = TEGRA194_MEMORY_CLIENT_PCIE4R, 1115 + .name = "pcie4r", 1116 + .sid = TEGRA194_SID_PCIE4, 1117 + .regs = { 1118 + .sid = { 1119 + .override = 0x700, 1120 + .security = 0x704, 1121 + }, 1122 + }, 1123 + }, { 1124 + .id = TEGRA194_MEMORY_CLIENT_PCIE4W, 1125 + .name = "pcie4w", 1126 + .sid = TEGRA194_SID_PCIE4, 1127 + .regs = { 1128 + .sid = { 1129 + .override = 0x708, 1130 + .security = 0x70c, 1131 + }, 1132 + }, 1133 + }, { 1134 + .id = TEGRA194_MEMORY_CLIENT_PCIE5R, 1135 + .name = "pcie5r", 1136 + .sid = TEGRA194_SID_PCIE5, 1137 + .regs = { 1138 + .sid = { 1139 + .override = 0x710, 1140 + .security = 0x714, 1141 + }, 1142 + }, 1143 + }, { 1144 + .id = TEGRA194_MEMORY_CLIENT_PCIE5W, 1145 + .name = "pcie5w", 1146 + .sid = TEGRA194_SID_PCIE5, 1147 + .regs = { 1148 + .sid = { 1149 + .override = 0x718, 1150 + .security = 0x71c, 1151 + }, 1152 + }, 1153 + }, { 1154 + .id = TEGRA194_MEMORY_CLIENT_ISPFALW, 1155 + .name = "ispfalw", 1156 + .sid = TEGRA194_SID_ISP_FALCON, 1157 + .regs = { 1158 + .sid = { 1159 + .override = 0x720, 1160 + .security = 0x724, 1161 + }, 1162 + }, 1163 + }, { 1164 + .id = TEGRA194_MEMORY_CLIENT_DLA0RDA1, 1165 + .name = "dla0rda1", 1166 + .sid = TEGRA194_SID_NVDLA0, 1167 + .regs = { 1168 + .sid = { 1169 + .override = 0x748, 1170 + .security = 0x74c, 1171 + }, 1172 + }, 1173 + }, { 1174 + .id = TEGRA194_MEMORY_CLIENT_DLA1RDA1, 1175 + .name = "dla1rda1", 1176 + .sid = TEGRA194_SID_NVDLA1, 1177 + .regs = { 1178 + .sid = { 1179 + .override = 0x750, 1180 + .security = 0x754, 1181 + }, 1182 + }, 1183 + }, { 1184 + .id = TEGRA194_MEMORY_CLIENT_PVA0RDA1, 1185 + .name = "pva0rda1", 1186 + .sid = TEGRA194_SID_PVA0, 1187 + .regs = { 1188 + .sid = { 1189 + .override = 0x758, 1190 + .security = 0x75c, 1191 + }, 1192 + }, 1193 + }, { 1194 + .id = TEGRA194_MEMORY_CLIENT_PVA0RDB1, 1195 + .name = "pva0rdb1", 1196 + .sid = TEGRA194_SID_PVA0, 1197 + .regs = { 1198 + .sid = { 1199 + .override = 0x760, 1200 + .security = 0x764, 1201 + }, 1202 + }, 1203 + }, { 1204 + .id = TEGRA194_MEMORY_CLIENT_PVA1RDA1, 1205 + .name = "pva1rda1", 1206 + .sid = TEGRA194_SID_PVA1, 1207 + .regs = { 1208 + .sid = { 1209 + .override = 0x768, 1210 + .security = 0x76c, 1211 + }, 1212 + }, 1213 + }, { 1214 + .id = TEGRA194_MEMORY_CLIENT_PVA1RDB1, 1215 + .name = "pva1rdb1", 1216 + .sid = TEGRA194_SID_PVA1, 1217 + .regs = { 1218 + .sid = { 1219 + .override = 0x770, 1220 + .security = 0x774, 1221 + }, 1222 + }, 1223 + }, { 1224 + .id = TEGRA194_MEMORY_CLIENT_PCIE5R1, 1225 + .name = "pcie5r1", 1226 + .sid = TEGRA194_SID_PCIE5, 1227 + .regs = { 1228 + .sid = { 1229 + .override = 0x778, 1230 + .security = 0x77c, 1231 + }, 1232 + }, 1233 + }, { 1234 + .id = TEGRA194_MEMORY_CLIENT_NVENCSRD1, 1235 + .name = "nvencsrd1", 1236 + .sid = TEGRA194_SID_NVENC, 1237 + .regs = { 1238 + .sid = { 1239 + .override = 0x780, 1240 + .security = 0x784, 1241 + }, 1242 + }, 1243 + }, { 1244 + .id = TEGRA194_MEMORY_CLIENT_NVENC1SRD1, 1245 + .name = "nvenc1srd1", 1246 + .sid = TEGRA194_SID_NVENC1, 1247 + .regs = { 1248 + .sid = { 1249 + .override = 0x788, 1250 + .security = 0x78c, 1251 + }, 1252 + }, 1253 + }, { 1254 + .id = TEGRA194_MEMORY_CLIENT_ISPRA1, 1255 + .name = "ispra1", 1256 + .sid = TEGRA194_SID_ISP, 1257 + .regs = { 1258 + .sid = { 1259 + .override = 0x790, 1260 + .security = 0x794, 1261 + }, 1262 + }, 1263 + }, { 1264 + .id = TEGRA194_MEMORY_CLIENT_PCIE0R1, 1265 + .name = "pcie0r1", 1266 + .sid = TEGRA194_SID_PCIE0, 1267 + .regs = { 1268 + .sid = { 1269 + .override = 0x798, 1270 + .security = 0x79c, 1271 + }, 1272 + }, 1273 + }, { 1274 + .id = TEGRA194_MEMORY_CLIENT_NVDEC1SRD, 1275 + .name = "nvdec1srd", 1276 + .sid = TEGRA194_SID_NVDEC1, 1277 + .regs = { 1278 + .sid = { 1279 + .override = 0x7c8, 1280 + .security = 0x7cc, 1281 + }, 1282 + }, 1283 + }, { 1284 + .id = TEGRA194_MEMORY_CLIENT_NVDEC1SRD1, 1285 + .name = "nvdec1srd1", 1286 + .sid = TEGRA194_SID_NVDEC1, 1287 + .regs = { 1288 + .sid = { 1289 + .override = 0x7d0, 1290 + .security = 0x7d4, 1291 + }, 1292 + }, 1293 + }, { 1294 + .id = TEGRA194_MEMORY_CLIENT_NVDEC1SWR, 1295 + .name = "nvdec1swr", 1296 + .sid = TEGRA194_SID_NVDEC1, 1297 + .regs = { 1298 + .sid = { 1299 + .override = 0x7d8, 1300 + .security = 0x7dc, 1301 + }, 1302 + }, 1303 + }, { 1304 + .id = TEGRA194_MEMORY_CLIENT_MIU5R, 1305 + .name = "miu5r", 1306 + .sid = TEGRA194_SID_MIU, 1307 + .regs = { 1308 + .sid = { 1309 + .override = 0x7e0, 1310 + .security = 0x7e4, 1311 + }, 1312 + }, 1313 + }, { 1314 + .id = TEGRA194_MEMORY_CLIENT_MIU5W, 1315 + .name = "miu5w", 1316 + .sid = TEGRA194_SID_MIU, 1317 + .regs = { 1318 + .sid = { 1319 + .override = 0x7e8, 1320 + .security = 0x7ec, 1321 + }, 1322 + }, 1323 + }, { 1324 + .id = TEGRA194_MEMORY_CLIENT_MIU6R, 1325 + .name = "miu6r", 1326 + .sid = TEGRA194_SID_MIU, 1327 + .regs = { 1328 + .sid = { 1329 + .override = 0x7f0, 1330 + .security = 0x7f4, 1331 + }, 1332 + }, 1333 + }, { 1334 + .id = TEGRA194_MEMORY_CLIENT_MIU6W, 1335 + .name = "miu6w", 1336 + .sid = TEGRA194_SID_MIU, 1337 + .regs = { 1338 + .sid = { 1339 + .override = 0x7f8, 1340 + .security = 0x7fc, 1341 + }, 1342 + }, 1343 + }, 1344 + }; 1345 + 1346 + const struct tegra_mc_soc tegra194_mc_soc = { 1347 + .num_clients = ARRAY_SIZE(tegra194_mc_clients), 1348 + .clients = tegra194_mc_clients, 1349 + .num_address_bits = 40, 1350 + .ops = &tegra186_mc_ops, 1351 + };
+4 -48
drivers/memory/tegra/tegra20-emc.c
··· 776 776 } 777 777 778 778 emc->debugfs.root = debugfs_create_dir("emc", NULL); 779 - if (!emc->debugfs.root) { 780 - dev_err(emc->dev, "failed to create debugfs directory\n"); 781 - return; 782 - } 783 779 784 780 debugfs_create_file("available_rates", 0444, emc->debugfs.root, 785 781 emc, &tegra_emc_debug_available_rates_fops); ··· 900 904 icc_provider_del(&emc->provider); 901 905 err_msg: 902 906 dev_err(emc->dev, "failed to initialize ICC: %d\n", err); 903 - 904 - return err; 905 - } 906 - 907 - static int tegra_emc_opp_table_init(struct tegra_emc *emc) 908 - { 909 - u32 hw_version = BIT(tegra_sku_info.soc_process_id); 910 - struct opp_table *hw_opp_table; 911 - int err; 912 - 913 - hw_opp_table = dev_pm_opp_set_supported_hw(emc->dev, &hw_version, 1); 914 - err = PTR_ERR_OR_ZERO(hw_opp_table); 915 - if (err) { 916 - dev_err(emc->dev, "failed to set OPP supported HW: %d\n", err); 917 - return err; 918 - } 919 - 920 - err = dev_pm_opp_of_add_table(emc->dev); 921 - if (err) { 922 - if (err == -ENODEV) 923 - dev_err(emc->dev, "OPP table not found, please update your device tree\n"); 924 - else 925 - dev_err(emc->dev, "failed to add OPP table: %d\n", err); 926 - 927 - goto put_hw_table; 928 - } 929 - 930 - dev_info_once(emc->dev, "OPP HW ver. 0x%x, current clock rate %lu MHz\n", 931 - hw_version, clk_get_rate(emc->clk) / 1000000); 932 - 933 - /* first dummy rate-set initializes voltage state */ 934 - err = dev_pm_opp_set_rate(emc->dev, clk_get_rate(emc->clk)); 935 - if (err) { 936 - dev_err(emc->dev, "failed to initialize OPP clock: %d\n", err); 937 - goto remove_table; 938 - } 939 - 940 - return 0; 941 - 942 - remove_table: 943 - dev_pm_opp_of_remove_table(emc->dev); 944 - put_hw_table: 945 - dev_pm_opp_put_supported_hw(hw_opp_table); 946 907 947 908 return err; 948 909 } ··· 1030 1077 1031 1078 static int tegra_emc_probe(struct platform_device *pdev) 1032 1079 { 1080 + struct tegra_core_opp_params opp_params = {}; 1033 1081 struct device_node *np; 1034 1082 struct tegra_emc *emc; 1035 1083 int irq, err; ··· 1076 1122 if (err) 1077 1123 return err; 1078 1124 1079 - err = tegra_emc_opp_table_init(emc); 1125 + opp_params.init_state = true; 1126 + 1127 + err = devm_tegra_core_dev_init_opp_table(&pdev->dev, &opp_params); 1080 1128 if (err) 1081 1129 return err; 1082 1130
+108 -2
drivers/memory/tegra/tegra20.c
··· 679 679 return 0; 680 680 } 681 681 682 - static int tegra20_mc_init(struct tegra_mc *mc) 682 + static int tegra20_mc_probe(struct tegra_mc *mc) 683 683 { 684 684 debugfs_create_devm_seqfile(mc->dev, "stats", mc->debugfs.root, 685 685 tegra20_mc_stats_show); 686 686 687 687 return 0; 688 688 } 689 + 690 + static int tegra20_mc_suspend(struct tegra_mc *mc) 691 + { 692 + int err; 693 + 694 + if (IS_ENABLED(CONFIG_TEGRA_IOMMU_GART) && mc->gart) { 695 + err = tegra_gart_suspend(mc->gart); 696 + if (err < 0) 697 + return err; 698 + } 699 + 700 + return 0; 701 + } 702 + 703 + static int tegra20_mc_resume(struct tegra_mc *mc) 704 + { 705 + int err; 706 + 707 + if (IS_ENABLED(CONFIG_TEGRA_IOMMU_GART) && mc->gart) { 708 + err = tegra_gart_resume(mc->gart); 709 + if (err < 0) 710 + return err; 711 + } 712 + 713 + return 0; 714 + } 715 + 716 + static irqreturn_t tegra20_mc_handle_irq(int irq, void *data) 717 + { 718 + struct tegra_mc *mc = data; 719 + unsigned long status; 720 + unsigned int bit; 721 + 722 + /* mask all interrupts to avoid flooding */ 723 + status = mc_readl(mc, MC_INTSTATUS) & mc->soc->intmask; 724 + if (!status) 725 + return IRQ_NONE; 726 + 727 + for_each_set_bit(bit, &status, 32) { 728 + const char *error = tegra_mc_status_names[bit]; 729 + const char *direction = "read", *secure = ""; 730 + const char *client, *desc; 731 + phys_addr_t addr; 732 + u32 value, reg; 733 + u8 id, type; 734 + 735 + switch (BIT(bit)) { 736 + case MC_INT_DECERR_EMEM: 737 + reg = MC_DECERR_EMEM_OTHERS_STATUS; 738 + value = mc_readl(mc, reg); 739 + 740 + id = value & mc->soc->client_id_mask; 741 + desc = tegra_mc_error_names[2]; 742 + 743 + if (value & BIT(31)) 744 + direction = "write"; 745 + break; 746 + 747 + case MC_INT_INVALID_GART_PAGE: 748 + reg = MC_GART_ERROR_REQ; 749 + value = mc_readl(mc, reg); 750 + 751 + id = (value >> 1) & mc->soc->client_id_mask; 752 + desc = tegra_mc_error_names[2]; 753 + 754 + if (value & BIT(0)) 755 + direction = "write"; 756 + break; 757 + 758 + case MC_INT_SECURITY_VIOLATION: 759 + reg = MC_SECURITY_VIOLATION_STATUS; 760 + value = mc_readl(mc, reg); 761 + 762 + id = value & mc->soc->client_id_mask; 763 + type = (value & BIT(30)) ? 4 : 3; 764 + desc = tegra_mc_error_names[type]; 765 + secure = "secure "; 766 + 767 + if (value & BIT(31)) 768 + direction = "write"; 769 + break; 770 + 771 + default: 772 + continue; 773 + } 774 + 775 + client = mc->soc->clients[id].name; 776 + addr = mc_readl(mc, reg + sizeof(u32)); 777 + 778 + dev_err_ratelimited(mc->dev, "%s: %s%s @%pa: %s (%s)\n", 779 + client, secure, direction, &addr, error, 780 + desc); 781 + } 782 + 783 + /* clear interrupts */ 784 + mc_writel(mc, status, MC_INTSTATUS); 785 + 786 + return IRQ_HANDLED; 787 + } 788 + 789 + static const struct tegra_mc_ops tegra20_mc_ops = { 790 + .probe = tegra20_mc_probe, 791 + .suspend = tegra20_mc_suspend, 792 + .resume = tegra20_mc_resume, 793 + .handle_irq = tegra20_mc_handle_irq, 794 + }; 689 795 690 796 const struct tegra_mc_soc tegra20_mc_soc = { 691 797 .clients = tegra20_mc_clients, ··· 804 698 .resets = tegra20_mc_resets, 805 699 .num_resets = ARRAY_SIZE(tegra20_mc_resets), 806 700 .icc_ops = &tegra20_mc_icc_ops, 807 - .init = tegra20_mc_init, 701 + .ops = &tegra20_mc_ops, 808 702 };
-4
drivers/memory/tegra/tegra210-emc-core.c
··· 1759 1759 } 1760 1760 1761 1761 emc->debugfs.root = debugfs_create_dir("emc", NULL); 1762 - if (!emc->debugfs.root) { 1763 - dev_err(dev, "failed to create debugfs directory\n"); 1764 - return; 1765 - } 1766 1762 1767 1763 debugfs_create_file("available_rates", 0444, emc->debugfs.root, emc, 1768 1764 &tegra210_emc_debug_available_rates_fops);
+789 -644
drivers/memory/tegra/tegra210.c
··· 16 16 .id = 0x01, 17 17 .name = "display0a", 18 18 .swgroup = TEGRA_SWGROUP_DC, 19 - .smmu = { 20 - .reg = 0x228, 21 - .bit = 1, 22 - }, 23 - .la = { 24 - .reg = 0x2e8, 25 - .shift = 0, 26 - .mask = 0xff, 27 - .def = 0x1e, 19 + .regs = { 20 + .smmu = { 21 + .reg = 0x228, 22 + .bit = 1, 23 + }, 24 + .la = { 25 + .reg = 0x2e8, 26 + .shift = 0, 27 + .mask = 0xff, 28 + .def = 0x1e, 29 + }, 28 30 }, 29 31 }, { 30 32 .id = 0x02, 31 33 .name = "display0ab", 32 34 .swgroup = TEGRA_SWGROUP_DCB, 33 - .smmu = { 34 - .reg = 0x228, 35 - .bit = 2, 36 - }, 37 - .la = { 38 - .reg = 0x2f4, 39 - .shift = 0, 40 - .mask = 0xff, 41 - .def = 0x1e, 35 + .regs = { 36 + .smmu = { 37 + .reg = 0x228, 38 + .bit = 2, 39 + }, 40 + .la = { 41 + .reg = 0x2f4, 42 + .shift = 0, 43 + .mask = 0xff, 44 + .def = 0x1e, 45 + }, 42 46 }, 43 47 }, { 44 48 .id = 0x03, 45 49 .name = "display0b", 46 50 .swgroup = TEGRA_SWGROUP_DC, 47 - .smmu = { 48 - .reg = 0x228, 49 - .bit = 3, 50 - }, 51 - .la = { 52 - .reg = 0x2e8, 53 - .shift = 16, 54 - .mask = 0xff, 55 - .def = 0x1e, 51 + .regs = { 52 + .smmu = { 53 + .reg = 0x228, 54 + .bit = 3, 55 + }, 56 + .la = { 57 + .reg = 0x2e8, 58 + .shift = 16, 59 + .mask = 0xff, 60 + .def = 0x1e, 61 + }, 56 62 }, 57 63 }, { 58 64 .id = 0x04, 59 65 .name = "display0bb", 60 66 .swgroup = TEGRA_SWGROUP_DCB, 61 - .smmu = { 62 - .reg = 0x228, 63 - .bit = 4, 64 - }, 65 - .la = { 66 - .reg = 0x2f4, 67 - .shift = 16, 68 - .mask = 0xff, 69 - .def = 0x1e, 67 + .regs = { 68 + .smmu = { 69 + .reg = 0x228, 70 + .bit = 4, 71 + }, 72 + .la = { 73 + .reg = 0x2f4, 74 + .shift = 16, 75 + .mask = 0xff, 76 + .def = 0x1e, 77 + }, 70 78 }, 71 79 }, { 72 80 .id = 0x05, 73 81 .name = "display0c", 74 82 .swgroup = TEGRA_SWGROUP_DC, 75 - .smmu = { 76 - .reg = 0x228, 77 - .bit = 5, 78 - }, 79 - .la = { 80 - .reg = 0x2ec, 81 - .shift = 0, 82 - .mask = 0xff, 83 - .def = 0x1e, 83 + .regs = { 84 + .smmu = { 85 + .reg = 0x228, 86 + .bit = 5, 87 + }, 88 + .la = { 89 + .reg = 0x2ec, 90 + .shift = 0, 91 + .mask = 0xff, 92 + .def = 0x1e, 93 + }, 84 94 }, 85 95 }, { 86 96 .id = 0x06, 87 97 .name = "display0cb", 88 98 .swgroup = TEGRA_SWGROUP_DCB, 89 - .smmu = { 90 - .reg = 0x228, 91 - .bit = 6, 92 - }, 93 - .la = { 94 - .reg = 0x2f8, 95 - .shift = 0, 96 - .mask = 0xff, 97 - .def = 0x1e, 99 + .regs = { 100 + .smmu = { 101 + .reg = 0x228, 102 + .bit = 6, 103 + }, 104 + .la = { 105 + .reg = 0x2f8, 106 + .shift = 0, 107 + .mask = 0xff, 108 + .def = 0x1e, 109 + }, 98 110 }, 99 111 }, { 100 112 .id = 0x0e, 101 113 .name = "afir", 102 114 .swgroup = TEGRA_SWGROUP_AFI, 103 - .smmu = { 104 - .reg = 0x228, 105 - .bit = 14, 106 - }, 107 - .la = { 108 - .reg = 0x2e0, 109 - .shift = 0, 110 - .mask = 0xff, 111 - .def = 0x2e, 115 + .regs = { 116 + .smmu = { 117 + .reg = 0x228, 118 + .bit = 14, 119 + }, 120 + .la = { 121 + .reg = 0x2e0, 122 + .shift = 0, 123 + .mask = 0xff, 124 + .def = 0x2e, 125 + }, 112 126 }, 113 127 }, { 114 128 .id = 0x0f, 115 129 .name = "avpcarm7r", 116 130 .swgroup = TEGRA_SWGROUP_AVPC, 117 - .smmu = { 118 - .reg = 0x228, 119 - .bit = 15, 120 - }, 121 - .la = { 122 - .reg = 0x2e4, 123 - .shift = 0, 124 - .mask = 0xff, 125 - .def = 0x04, 131 + .regs = { 132 + .smmu = { 133 + .reg = 0x228, 134 + .bit = 15, 135 + }, 136 + .la = { 137 + .reg = 0x2e4, 138 + .shift = 0, 139 + .mask = 0xff, 140 + .def = 0x04, 141 + }, 126 142 }, 127 143 }, { 128 144 .id = 0x10, 129 145 .name = "displayhc", 130 146 .swgroup = TEGRA_SWGROUP_DC, 131 - .smmu = { 132 - .reg = 0x228, 133 - .bit = 16, 134 - }, 135 - .la = { 136 - .reg = 0x2f0, 137 - .shift = 0, 138 - .mask = 0xff, 139 - .def = 0x1e, 147 + .regs = { 148 + .smmu = { 149 + .reg = 0x228, 150 + .bit = 16, 151 + }, 152 + .la = { 153 + .reg = 0x2f0, 154 + .shift = 0, 155 + .mask = 0xff, 156 + .def = 0x1e, 157 + }, 140 158 }, 141 159 }, { 142 160 .id = 0x11, 143 161 .name = "displayhcb", 144 162 .swgroup = TEGRA_SWGROUP_DCB, 145 - .smmu = { 146 - .reg = 0x228, 147 - .bit = 17, 148 - }, 149 - .la = { 150 - .reg = 0x2fc, 151 - .shift = 0, 152 - .mask = 0xff, 153 - .def = 0x1e, 163 + .regs = { 164 + .smmu = { 165 + .reg = 0x228, 166 + .bit = 17, 167 + }, 168 + .la = { 169 + .reg = 0x2fc, 170 + .shift = 0, 171 + .mask = 0xff, 172 + .def = 0x1e, 173 + }, 154 174 }, 155 175 }, { 156 176 .id = 0x15, 157 177 .name = "hdar", 158 178 .swgroup = TEGRA_SWGROUP_HDA, 159 - .smmu = { 160 - .reg = 0x228, 161 - .bit = 21, 162 - }, 163 - .la = { 164 - .reg = 0x318, 165 - .shift = 0, 166 - .mask = 0xff, 167 - .def = 0x24, 179 + .regs = { 180 + .smmu = { 181 + .reg = 0x228, 182 + .bit = 21, 183 + }, 184 + .la = { 185 + .reg = 0x318, 186 + .shift = 0, 187 + .mask = 0xff, 188 + .def = 0x24, 189 + }, 168 190 }, 169 191 }, { 170 192 .id = 0x16, 171 193 .name = "host1xdmar", 172 194 .swgroup = TEGRA_SWGROUP_HC, 173 - .smmu = { 174 - .reg = 0x228, 175 - .bit = 22, 176 - }, 177 - .la = { 178 - .reg = 0x310, 179 - .shift = 0, 180 - .mask = 0xff, 181 - .def = 0x1e, 195 + .regs = { 196 + .smmu = { 197 + .reg = 0x228, 198 + .bit = 22, 199 + }, 200 + .la = { 201 + .reg = 0x310, 202 + .shift = 0, 203 + .mask = 0xff, 204 + .def = 0x1e, 205 + }, 182 206 }, 183 207 }, { 184 208 .id = 0x17, 185 209 .name = "host1xr", 186 210 .swgroup = TEGRA_SWGROUP_HC, 187 - .smmu = { 188 - .reg = 0x228, 189 - .bit = 23, 190 - }, 191 - .la = { 192 - .reg = 0x310, 193 - .shift = 16, 194 - .mask = 0xff, 195 - .def = 0x50, 211 + .regs = { 212 + .smmu = { 213 + .reg = 0x228, 214 + .bit = 23, 215 + }, 216 + .la = { 217 + .reg = 0x310, 218 + .shift = 16, 219 + .mask = 0xff, 220 + .def = 0x50, 221 + }, 196 222 }, 197 223 }, { 198 224 .id = 0x1c, 199 225 .name = "nvencsrd", 200 226 .swgroup = TEGRA_SWGROUP_NVENC, 201 - .smmu = { 202 - .reg = 0x228, 203 - .bit = 28, 204 - }, 205 - .la = { 206 - .reg = 0x328, 207 - .shift = 0, 208 - .mask = 0xff, 209 - .def = 0x23, 227 + .regs = { 228 + .smmu = { 229 + .reg = 0x228, 230 + .bit = 28, 231 + }, 232 + .la = { 233 + .reg = 0x328, 234 + .shift = 0, 235 + .mask = 0xff, 236 + .def = 0x23, 237 + }, 210 238 }, 211 239 }, { 212 240 .id = 0x1d, 213 241 .name = "ppcsahbdmar", 214 242 .swgroup = TEGRA_SWGROUP_PPCS, 215 - .smmu = { 216 - .reg = 0x228, 217 - .bit = 29, 218 - }, 219 - .la = { 220 - .reg = 0x344, 221 - .shift = 0, 222 - .mask = 0xff, 223 - .def = 0x49, 243 + .regs = { 244 + .smmu = { 245 + .reg = 0x228, 246 + .bit = 29, 247 + }, 248 + .la = { 249 + .reg = 0x344, 250 + .shift = 0, 251 + .mask = 0xff, 252 + .def = 0x49, 253 + }, 224 254 }, 225 255 }, { 226 256 .id = 0x1e, 227 257 .name = "ppcsahbslvr", 228 258 .swgroup = TEGRA_SWGROUP_PPCS, 229 - .smmu = { 230 - .reg = 0x228, 231 - .bit = 30, 232 - }, 233 - .la = { 234 - .reg = 0x344, 235 - .shift = 16, 236 - .mask = 0xff, 237 - .def = 0x1a, 259 + .regs = { 260 + .smmu = { 261 + .reg = 0x228, 262 + .bit = 30, 263 + }, 264 + .la = { 265 + .reg = 0x344, 266 + .shift = 16, 267 + .mask = 0xff, 268 + .def = 0x1a, 269 + }, 238 270 }, 239 271 }, { 240 272 .id = 0x1f, 241 273 .name = "satar", 242 274 .swgroup = TEGRA_SWGROUP_SATA, 243 - .smmu = { 244 - .reg = 0x228, 245 - .bit = 31, 246 - }, 247 - .la = { 248 - .reg = 0x350, 249 - .shift = 0, 250 - .mask = 0xff, 251 - .def = 0x65, 275 + .regs = { 276 + .smmu = { 277 + .reg = 0x228, 278 + .bit = 31, 279 + }, 280 + .la = { 281 + .reg = 0x350, 282 + .shift = 0, 283 + .mask = 0xff, 284 + .def = 0x65, 285 + }, 252 286 }, 253 287 }, { 254 288 .id = 0x27, 255 289 .name = "mpcorer", 256 290 .swgroup = TEGRA_SWGROUP_MPCORE, 257 - .la = { 258 - .reg = 0x320, 259 - .shift = 0, 260 - .mask = 0xff, 261 - .def = 0x04, 291 + .regs = { 292 + .la = { 293 + .reg = 0x320, 294 + .shift = 0, 295 + .mask = 0xff, 296 + .def = 0x04, 297 + }, 262 298 }, 263 299 }, { 264 300 .id = 0x2b, 265 301 .name = "nvencswr", 266 302 .swgroup = TEGRA_SWGROUP_NVENC, 267 - .smmu = { 268 - .reg = 0x22c, 269 - .bit = 11, 270 - }, 271 - .la = { 272 - .reg = 0x328, 273 - .shift = 16, 274 - .mask = 0xff, 275 - .def = 0x80, 303 + .regs = { 304 + .smmu = { 305 + .reg = 0x22c, 306 + .bit = 11, 307 + }, 308 + .la = { 309 + .reg = 0x328, 310 + .shift = 16, 311 + .mask = 0xff, 312 + .def = 0x80, 313 + }, 276 314 }, 277 315 }, { 278 316 .id = 0x31, 279 317 .name = "afiw", 280 318 .swgroup = TEGRA_SWGROUP_AFI, 281 - .smmu = { 282 - .reg = 0x22c, 283 - .bit = 17, 284 - }, 285 - .la = { 286 - .reg = 0x2e0, 287 - .shift = 16, 288 - .mask = 0xff, 289 - .def = 0x80, 319 + .regs = { 320 + .smmu = { 321 + .reg = 0x22c, 322 + .bit = 17, 323 + }, 324 + .la = { 325 + .reg = 0x2e0, 326 + .shift = 16, 327 + .mask = 0xff, 328 + .def = 0x80, 329 + }, 290 330 }, 291 331 }, { 292 332 .id = 0x32, 293 333 .name = "avpcarm7w", 294 334 .swgroup = TEGRA_SWGROUP_AVPC, 295 - .smmu = { 296 - .reg = 0x22c, 297 - .bit = 18, 298 - }, 299 - .la = { 300 - .reg = 0x2e4, 301 - .shift = 16, 302 - .mask = 0xff, 303 - .def = 0x80, 335 + .regs = { 336 + .smmu = { 337 + .reg = 0x22c, 338 + .bit = 18, 339 + }, 340 + .la = { 341 + .reg = 0x2e4, 342 + .shift = 16, 343 + .mask = 0xff, 344 + .def = 0x80, 345 + }, 304 346 }, 305 347 }, { 306 348 .id = 0x35, 307 349 .name = "hdaw", 308 350 .swgroup = TEGRA_SWGROUP_HDA, 309 - .smmu = { 310 - .reg = 0x22c, 311 - .bit = 21, 312 - }, 313 - .la = { 314 - .reg = 0x318, 315 - .shift = 16, 316 - .mask = 0xff, 317 - .def = 0x80, 351 + .regs = { 352 + .smmu = { 353 + .reg = 0x22c, 354 + .bit = 21, 355 + }, 356 + .la = { 357 + .reg = 0x318, 358 + .shift = 16, 359 + .mask = 0xff, 360 + .def = 0x80, 361 + }, 318 362 }, 319 363 }, { 320 364 .id = 0x36, 321 365 .name = "host1xw", 322 366 .swgroup = TEGRA_SWGROUP_HC, 323 - .smmu = { 324 - .reg = 0x22c, 325 - .bit = 22, 326 - }, 327 - .la = { 328 - .reg = 0x314, 329 - .shift = 0, 330 - .mask = 0xff, 331 - .def = 0x80, 367 + .regs = { 368 + .smmu = { 369 + .reg = 0x22c, 370 + .bit = 22, 371 + }, 372 + .la = { 373 + .reg = 0x314, 374 + .shift = 0, 375 + .mask = 0xff, 376 + .def = 0x80, 377 + }, 332 378 }, 333 379 }, { 334 380 .id = 0x39, 335 381 .name = "mpcorew", 336 382 .swgroup = TEGRA_SWGROUP_MPCORE, 337 - .la = { 338 - .reg = 0x320, 339 - .shift = 16, 340 - .mask = 0xff, 341 - .def = 0x80, 383 + .regs = { 384 + .la = { 385 + .reg = 0x320, 386 + .shift = 16, 387 + .mask = 0xff, 388 + .def = 0x80, 389 + }, 342 390 }, 343 391 }, { 344 392 .id = 0x3b, 345 393 .name = "ppcsahbdmaw", 346 394 .swgroup = TEGRA_SWGROUP_PPCS, 347 - .smmu = { 348 - .reg = 0x22c, 349 - .bit = 27, 350 - }, 351 - .la = { 352 - .reg = 0x348, 353 - .shift = 0, 354 - .mask = 0xff, 355 - .def = 0x80, 395 + .regs = { 396 + .smmu = { 397 + .reg = 0x22c, 398 + .bit = 27, 399 + }, 400 + .la = { 401 + .reg = 0x348, 402 + .shift = 0, 403 + .mask = 0xff, 404 + .def = 0x80, 405 + }, 356 406 }, 357 407 }, { 358 408 .id = 0x3c, 359 409 .name = "ppcsahbslvw", 360 410 .swgroup = TEGRA_SWGROUP_PPCS, 361 - .smmu = { 362 - .reg = 0x22c, 363 - .bit = 28, 364 - }, 365 - .la = { 366 - .reg = 0x348, 367 - .shift = 16, 368 - .mask = 0xff, 369 - .def = 0x80, 411 + .regs = { 412 + .smmu = { 413 + .reg = 0x22c, 414 + .bit = 28, 415 + }, 416 + .la = { 417 + .reg = 0x348, 418 + .shift = 16, 419 + .mask = 0xff, 420 + .def = 0x80, 421 + }, 370 422 }, 371 423 }, { 372 424 .id = 0x3d, 373 425 .name = "sataw", 374 426 .swgroup = TEGRA_SWGROUP_SATA, 375 - .smmu = { 376 - .reg = 0x22c, 377 - .bit = 29, 378 - }, 379 - .la = { 380 - .reg = 0x350, 381 - .shift = 16, 382 - .mask = 0xff, 383 - .def = 0x80, 427 + .regs = { 428 + .smmu = { 429 + .reg = 0x22c, 430 + .bit = 29, 431 + }, 432 + .la = { 433 + .reg = 0x350, 434 + .shift = 16, 435 + .mask = 0xff, 436 + .def = 0x80, 437 + }, 384 438 }, 385 439 }, { 386 440 .id = 0x44, 387 441 .name = "ispra", 388 442 .swgroup = TEGRA_SWGROUP_ISP2, 389 - .smmu = { 390 - .reg = 0x230, 391 - .bit = 4, 392 - }, 393 - .la = { 394 - .reg = 0x370, 395 - .shift = 0, 396 - .mask = 0xff, 397 - .def = 0x18, 443 + .regs = { 444 + .smmu = { 445 + .reg = 0x230, 446 + .bit = 4, 447 + }, 448 + .la = { 449 + .reg = 0x370, 450 + .shift = 0, 451 + .mask = 0xff, 452 + .def = 0x18, 453 + }, 398 454 }, 399 455 }, { 400 456 .id = 0x46, 401 457 .name = "ispwa", 402 458 .swgroup = TEGRA_SWGROUP_ISP2, 403 - .smmu = { 404 - .reg = 0x230, 405 - .bit = 6, 406 - }, 407 - .la = { 408 - .reg = 0x374, 409 - .shift = 0, 410 - .mask = 0xff, 411 - .def = 0x80, 459 + .regs = { 460 + .smmu = { 461 + .reg = 0x230, 462 + .bit = 6, 463 + }, 464 + .la = { 465 + .reg = 0x374, 466 + .shift = 0, 467 + .mask = 0xff, 468 + .def = 0x80, 469 + }, 412 470 }, 413 471 }, { 414 472 .id = 0x47, 415 473 .name = "ispwb", 416 474 .swgroup = TEGRA_SWGROUP_ISP2, 417 - .smmu = { 418 - .reg = 0x230, 419 - .bit = 7, 420 - }, 421 - .la = { 422 - .reg = 0x374, 423 - .shift = 16, 424 - .mask = 0xff, 425 - .def = 0x80, 475 + .regs = { 476 + .smmu = { 477 + .reg = 0x230, 478 + .bit = 7, 479 + }, 480 + .la = { 481 + .reg = 0x374, 482 + .shift = 16, 483 + .mask = 0xff, 484 + .def = 0x80, 485 + }, 426 486 }, 427 487 }, { 428 488 .id = 0x4a, 429 489 .name = "xusb_hostr", 430 490 .swgroup = TEGRA_SWGROUP_XUSB_HOST, 431 - .smmu = { 432 - .reg = 0x230, 433 - .bit = 10, 434 - }, 435 - .la = { 436 - .reg = 0x37c, 437 - .shift = 0, 438 - .mask = 0xff, 439 - .def = 0x7a, 491 + .regs = { 492 + .smmu = { 493 + .reg = 0x230, 494 + .bit = 10, 495 + }, 496 + .la = { 497 + .reg = 0x37c, 498 + .shift = 0, 499 + .mask = 0xff, 500 + .def = 0x7a, 501 + }, 440 502 }, 441 503 }, { 442 504 .id = 0x4b, 443 505 .name = "xusb_hostw", 444 506 .swgroup = TEGRA_SWGROUP_XUSB_HOST, 445 - .smmu = { 446 - .reg = 0x230, 447 - .bit = 11, 448 - }, 449 - .la = { 450 - .reg = 0x37c, 451 - .shift = 16, 452 - .mask = 0xff, 453 - .def = 0x80, 507 + .regs = { 508 + .smmu = { 509 + .reg = 0x230, 510 + .bit = 11, 511 + }, 512 + .la = { 513 + .reg = 0x37c, 514 + .shift = 16, 515 + .mask = 0xff, 516 + .def = 0x80, 517 + }, 454 518 }, 455 519 }, { 456 520 .id = 0x4c, 457 521 .name = "xusb_devr", 458 522 .swgroup = TEGRA_SWGROUP_XUSB_DEV, 459 - .smmu = { 460 - .reg = 0x230, 461 - .bit = 12, 462 - }, 463 - .la = { 464 - .reg = 0x380, 465 - .shift = 0, 466 - .mask = 0xff, 467 - .def = 0x39, 523 + .regs = { 524 + .smmu = { 525 + .reg = 0x230, 526 + .bit = 12, 527 + }, 528 + .la = { 529 + .reg = 0x380, 530 + .shift = 0, 531 + .mask = 0xff, 532 + .def = 0x39, 533 + }, 468 534 }, 469 535 }, { 470 536 .id = 0x4d, 471 537 .name = "xusb_devw", 472 538 .swgroup = TEGRA_SWGROUP_XUSB_DEV, 473 - .smmu = { 474 - .reg = 0x230, 475 - .bit = 13, 476 - }, 477 - .la = { 478 - .reg = 0x380, 479 - .shift = 16, 480 - .mask = 0xff, 481 - .def = 0x80, 539 + .regs = { 540 + .smmu = { 541 + .reg = 0x230, 542 + .bit = 13, 543 + }, 544 + .la = { 545 + .reg = 0x380, 546 + .shift = 16, 547 + .mask = 0xff, 548 + .def = 0x80, 549 + }, 482 550 }, 483 551 }, { 484 552 .id = 0x4e, 485 553 .name = "isprab", 486 554 .swgroup = TEGRA_SWGROUP_ISP2B, 487 - .smmu = { 488 - .reg = 0x230, 489 - .bit = 14, 490 - }, 491 - .la = { 492 - .reg = 0x384, 493 - .shift = 0, 494 - .mask = 0xff, 495 - .def = 0x18, 555 + .regs = { 556 + .smmu = { 557 + .reg = 0x230, 558 + .bit = 14, 559 + }, 560 + .la = { 561 + .reg = 0x384, 562 + .shift = 0, 563 + .mask = 0xff, 564 + .def = 0x18, 565 + }, 496 566 }, 497 567 }, { 498 568 .id = 0x50, 499 569 .name = "ispwab", 500 570 .swgroup = TEGRA_SWGROUP_ISP2B, 501 - .smmu = { 502 - .reg = 0x230, 503 - .bit = 16, 504 - }, 505 - .la = { 506 - .reg = 0x388, 507 - .shift = 0, 508 - .mask = 0xff, 509 - .def = 0x80, 571 + .regs = { 572 + .smmu = { 573 + .reg = 0x230, 574 + .bit = 16, 575 + }, 576 + .la = { 577 + .reg = 0x388, 578 + .shift = 0, 579 + .mask = 0xff, 580 + .def = 0x80, 581 + }, 510 582 }, 511 583 }, { 512 584 .id = 0x51, 513 585 .name = "ispwbb", 514 586 .swgroup = TEGRA_SWGROUP_ISP2B, 515 - .smmu = { 516 - .reg = 0x230, 517 - .bit = 17, 518 - }, 519 - .la = { 520 - .reg = 0x388, 521 - .shift = 16, 522 - .mask = 0xff, 523 - .def = 0x80, 587 + .regs = { 588 + .smmu = { 589 + .reg = 0x230, 590 + .bit = 17, 591 + }, 592 + .la = { 593 + .reg = 0x388, 594 + .shift = 16, 595 + .mask = 0xff, 596 + .def = 0x80, 597 + }, 524 598 }, 525 599 }, { 526 600 .id = 0x54, 527 601 .name = "tsecsrd", 528 602 .swgroup = TEGRA_SWGROUP_TSEC, 529 - .smmu = { 530 - .reg = 0x230, 531 - .bit = 20, 532 - }, 533 - .la = { 534 - .reg = 0x390, 535 - .shift = 0, 536 - .mask = 0xff, 537 - .def = 0x9b, 603 + .regs = { 604 + .smmu = { 605 + .reg = 0x230, 606 + .bit = 20, 607 + }, 608 + .la = { 609 + .reg = 0x390, 610 + .shift = 0, 611 + .mask = 0xff, 612 + .def = 0x9b, 613 + }, 538 614 }, 539 615 }, { 540 616 .id = 0x55, 541 617 .name = "tsecswr", 542 618 .swgroup = TEGRA_SWGROUP_TSEC, 543 - .smmu = { 544 - .reg = 0x230, 545 - .bit = 21, 546 - }, 547 - .la = { 548 - .reg = 0x390, 549 - .shift = 16, 550 - .mask = 0xff, 551 - .def = 0x80, 619 + .regs = { 620 + .smmu = { 621 + .reg = 0x230, 622 + .bit = 21, 623 + }, 624 + .la = { 625 + .reg = 0x390, 626 + .shift = 16, 627 + .mask = 0xff, 628 + .def = 0x80, 629 + }, 552 630 }, 553 631 }, { 554 632 .id = 0x56, 555 633 .name = "a9avpscr", 556 634 .swgroup = TEGRA_SWGROUP_A9AVP, 557 - .smmu = { 558 - .reg = 0x230, 559 - .bit = 22, 560 - }, 561 - .la = { 562 - .reg = 0x3a4, 563 - .shift = 0, 564 - .mask = 0xff, 565 - .def = 0x04, 635 + .regs = { 636 + .smmu = { 637 + .reg = 0x230, 638 + .bit = 22, 639 + }, 640 + .la = { 641 + .reg = 0x3a4, 642 + .shift = 0, 643 + .mask = 0xff, 644 + .def = 0x04, 645 + }, 566 646 }, 567 647 }, { 568 648 .id = 0x57, 569 649 .name = "a9avpscw", 570 650 .swgroup = TEGRA_SWGROUP_A9AVP, 571 - .smmu = { 572 - .reg = 0x230, 573 - .bit = 23, 574 - }, 575 - .la = { 576 - .reg = 0x3a4, 577 - .shift = 16, 578 - .mask = 0xff, 579 - .def = 0x80, 651 + .regs = { 652 + .smmu = { 653 + .reg = 0x230, 654 + .bit = 23, 655 + }, 656 + .la = { 657 + .reg = 0x3a4, 658 + .shift = 16, 659 + .mask = 0xff, 660 + .def = 0x80, 661 + }, 580 662 }, 581 663 }, { 582 664 .id = 0x58, 583 665 .name = "gpusrd", 584 666 .swgroup = TEGRA_SWGROUP_GPU, 585 - .smmu = { 586 - /* read-only */ 587 - .reg = 0x230, 588 - .bit = 24, 589 - }, 590 - .la = { 591 - .reg = 0x3c8, 592 - .shift = 0, 593 - .mask = 0xff, 594 - .def = 0x1a, 667 + .regs = { 668 + .smmu = { 669 + /* read-only */ 670 + .reg = 0x230, 671 + .bit = 24, 672 + }, 673 + .la = { 674 + .reg = 0x3c8, 675 + .shift = 0, 676 + .mask = 0xff, 677 + .def = 0x1a, 678 + }, 595 679 }, 596 680 }, { 597 681 .id = 0x59, 598 682 .name = "gpuswr", 599 683 .swgroup = TEGRA_SWGROUP_GPU, 600 - .smmu = { 601 - /* read-only */ 602 - .reg = 0x230, 603 - .bit = 25, 604 - }, 605 - .la = { 606 - .reg = 0x3c8, 607 - .shift = 16, 608 - .mask = 0xff, 609 - .def = 0x80, 684 + .regs = { 685 + .smmu = { 686 + /* read-only */ 687 + .reg = 0x230, 688 + .bit = 25, 689 + }, 690 + .la = { 691 + .reg = 0x3c8, 692 + .shift = 16, 693 + .mask = 0xff, 694 + .def = 0x80, 695 + }, 610 696 }, 611 697 }, { 612 698 .id = 0x5a, 613 699 .name = "displayt", 614 700 .swgroup = TEGRA_SWGROUP_DC, 615 - .smmu = { 616 - .reg = 0x230, 617 - .bit = 26, 618 - }, 619 - .la = { 620 - .reg = 0x2f0, 621 - .shift = 16, 622 - .mask = 0xff, 623 - .def = 0x1e, 701 + .regs = { 702 + .smmu = { 703 + .reg = 0x230, 704 + .bit = 26, 705 + }, 706 + .la = { 707 + .reg = 0x2f0, 708 + .shift = 16, 709 + .mask = 0xff, 710 + .def = 0x1e, 711 + }, 624 712 }, 625 713 }, { 626 714 .id = 0x60, 627 715 .name = "sdmmcra", 628 716 .swgroup = TEGRA_SWGROUP_SDMMC1A, 629 - .smmu = { 630 - .reg = 0x234, 631 - .bit = 0, 632 - }, 633 - .la = { 634 - .reg = 0x3b8, 635 - .shift = 0, 636 - .mask = 0xff, 637 - .def = 0x49, 717 + .regs = { 718 + .smmu = { 719 + .reg = 0x234, 720 + .bit = 0, 721 + }, 722 + .la = { 723 + .reg = 0x3b8, 724 + .shift = 0, 725 + .mask = 0xff, 726 + .def = 0x49, 727 + }, 638 728 }, 639 729 }, { 640 730 .id = 0x61, 641 731 .name = "sdmmcraa", 642 732 .swgroup = TEGRA_SWGROUP_SDMMC2A, 643 - .smmu = { 644 - .reg = 0x234, 645 - .bit = 1, 646 - }, 647 - .la = { 648 - .reg = 0x3bc, 649 - .shift = 0, 650 - .mask = 0xff, 651 - .def = 0x5a, 733 + .regs = { 734 + .smmu = { 735 + .reg = 0x234, 736 + .bit = 1, 737 + }, 738 + .la = { 739 + .reg = 0x3bc, 740 + .shift = 0, 741 + .mask = 0xff, 742 + .def = 0x5a, 743 + }, 652 744 }, 653 745 }, { 654 746 .id = 0x62, 655 747 .name = "sdmmcr", 656 748 .swgroup = TEGRA_SWGROUP_SDMMC3A, 657 - .smmu = { 658 - .reg = 0x234, 659 - .bit = 2, 660 - }, 661 - .la = { 662 - .reg = 0x3c0, 663 - .shift = 0, 664 - .mask = 0xff, 665 - .def = 0x49, 749 + .regs = { 750 + .smmu = { 751 + .reg = 0x234, 752 + .bit = 2, 753 + }, 754 + .la = { 755 + .reg = 0x3c0, 756 + .shift = 0, 757 + .mask = 0xff, 758 + .def = 0x49, 759 + }, 666 760 }, 667 761 }, { 668 762 .id = 0x63, 669 763 .swgroup = TEGRA_SWGROUP_SDMMC4A, 670 764 .name = "sdmmcrab", 671 - .smmu = { 672 - .reg = 0x234, 673 - .bit = 3, 674 - }, 675 - .la = { 676 - .reg = 0x3c4, 677 - .shift = 0, 678 - .mask = 0xff, 679 - .def = 0x5a, 765 + .regs = { 766 + .smmu = { 767 + .reg = 0x234, 768 + .bit = 3, 769 + }, 770 + .la = { 771 + .reg = 0x3c4, 772 + .shift = 0, 773 + .mask = 0xff, 774 + .def = 0x5a, 775 + }, 680 776 }, 681 777 }, { 682 778 .id = 0x64, 683 779 .name = "sdmmcwa", 684 780 .swgroup = TEGRA_SWGROUP_SDMMC1A, 685 - .smmu = { 686 - .reg = 0x234, 687 - .bit = 4, 688 - }, 689 - .la = { 690 - .reg = 0x3b8, 691 - .shift = 16, 692 - .mask = 0xff, 693 - .def = 0x80, 781 + .regs = { 782 + .smmu = { 783 + .reg = 0x234, 784 + .bit = 4, 785 + }, 786 + .la = { 787 + .reg = 0x3b8, 788 + .shift = 16, 789 + .mask = 0xff, 790 + .def = 0x80, 791 + }, 694 792 }, 695 793 }, { 696 794 .id = 0x65, 697 795 .name = "sdmmcwaa", 698 796 .swgroup = TEGRA_SWGROUP_SDMMC2A, 699 - .smmu = { 700 - .reg = 0x234, 701 - .bit = 5, 702 - }, 703 - .la = { 704 - .reg = 0x3bc, 705 - .shift = 16, 706 - .mask = 0xff, 707 - .def = 0x80, 797 + .regs = { 798 + .smmu = { 799 + .reg = 0x234, 800 + .bit = 5, 801 + }, 802 + .la = { 803 + .reg = 0x3bc, 804 + .shift = 16, 805 + .mask = 0xff, 806 + .def = 0x80, 807 + }, 708 808 }, 709 809 }, { 710 810 .id = 0x66, 711 811 .name = "sdmmcw", 712 812 .swgroup = TEGRA_SWGROUP_SDMMC3A, 713 - .smmu = { 714 - .reg = 0x234, 715 - .bit = 6, 716 - }, 717 - .la = { 718 - .reg = 0x3c0, 719 - .shift = 16, 720 - .mask = 0xff, 721 - .def = 0x80, 813 + .regs = { 814 + .smmu = { 815 + .reg = 0x234, 816 + .bit = 6, 817 + }, 818 + .la = { 819 + .reg = 0x3c0, 820 + .shift = 16, 821 + .mask = 0xff, 822 + .def = 0x80, 823 + }, 722 824 }, 723 825 }, { 724 826 .id = 0x67, 725 827 .name = "sdmmcwab", 726 828 .swgroup = TEGRA_SWGROUP_SDMMC4A, 727 - .smmu = { 728 - .reg = 0x234, 729 - .bit = 7, 730 - }, 731 - .la = { 732 - .reg = 0x3c4, 733 - .shift = 16, 734 - .mask = 0xff, 735 - .def = 0x80, 829 + .regs = { 830 + .smmu = { 831 + .reg = 0x234, 832 + .bit = 7, 833 + }, 834 + .la = { 835 + .reg = 0x3c4, 836 + .shift = 16, 837 + .mask = 0xff, 838 + .def = 0x80, 839 + }, 736 840 }, 737 841 }, { 738 842 .id = 0x6c, 739 843 .name = "vicsrd", 740 844 .swgroup = TEGRA_SWGROUP_VIC, 741 - .smmu = { 742 - .reg = 0x234, 743 - .bit = 12, 744 - }, 745 - .la = { 746 - .reg = 0x394, 747 - .shift = 0, 748 - .mask = 0xff, 749 - .def = 0x1a, 845 + .regs = { 846 + .smmu = { 847 + .reg = 0x234, 848 + .bit = 12, 849 + }, 850 + .la = { 851 + .reg = 0x394, 852 + .shift = 0, 853 + .mask = 0xff, 854 + .def = 0x1a, 855 + }, 750 856 }, 751 857 }, { 752 858 .id = 0x6d, 753 859 .name = "vicswr", 754 860 .swgroup = TEGRA_SWGROUP_VIC, 755 - .smmu = { 756 - .reg = 0x234, 757 - .bit = 13, 758 - }, 759 - .la = { 760 - .reg = 0x394, 761 - .shift = 16, 762 - .mask = 0xff, 763 - .def = 0x80, 861 + .regs = { 862 + .smmu = { 863 + .reg = 0x234, 864 + .bit = 13, 865 + }, 866 + .la = { 867 + .reg = 0x394, 868 + .shift = 16, 869 + .mask = 0xff, 870 + .def = 0x80, 871 + }, 764 872 }, 765 873 }, { 766 874 .id = 0x72, 767 875 .name = "viw", 768 876 .swgroup = TEGRA_SWGROUP_VI, 769 - .smmu = { 770 - .reg = 0x234, 771 - .bit = 18, 772 - }, 773 - .la = { 774 - .reg = 0x398, 775 - .shift = 0, 776 - .mask = 0xff, 777 - .def = 0x80, 877 + .regs = { 878 + .smmu = { 879 + .reg = 0x234, 880 + .bit = 18, 881 + }, 882 + .la = { 883 + .reg = 0x398, 884 + .shift = 0, 885 + .mask = 0xff, 886 + .def = 0x80, 887 + }, 778 888 }, 779 889 }, { 780 890 .id = 0x73, 781 891 .name = "displayd", 782 892 .swgroup = TEGRA_SWGROUP_DC, 783 - .smmu = { 784 - .reg = 0x234, 785 - .bit = 19, 786 - }, 787 - .la = { 788 - .reg = 0x3c8, 789 - .shift = 0, 790 - .mask = 0xff, 791 - .def = 0x50, 893 + .regs = { 894 + .smmu = { 895 + .reg = 0x234, 896 + .bit = 19, 897 + }, 898 + .la = { 899 + .reg = 0x3c8, 900 + .shift = 0, 901 + .mask = 0xff, 902 + .def = 0x50, 903 + }, 792 904 }, 793 905 }, { 794 906 .id = 0x78, 795 907 .name = "nvdecsrd", 796 908 .swgroup = TEGRA_SWGROUP_NVDEC, 797 - .smmu = { 798 - .reg = 0x234, 799 - .bit = 24, 800 - }, 801 - .la = { 802 - .reg = 0x3d8, 803 - .shift = 0, 804 - .mask = 0xff, 805 - .def = 0x23, 909 + .regs = { 910 + .smmu = { 911 + .reg = 0x234, 912 + .bit = 24, 913 + }, 914 + .la = { 915 + .reg = 0x3d8, 916 + .shift = 0, 917 + .mask = 0xff, 918 + .def = 0x23, 919 + }, 806 920 }, 807 921 }, { 808 922 .id = 0x79, 809 923 .name = "nvdecswr", 810 924 .swgroup = TEGRA_SWGROUP_NVDEC, 811 - .smmu = { 812 - .reg = 0x234, 813 - .bit = 25, 814 - }, 815 - .la = { 816 - .reg = 0x3d8, 817 - .shift = 16, 818 - .mask = 0xff, 819 - .def = 0x80, 925 + .regs = { 926 + .smmu = { 927 + .reg = 0x234, 928 + .bit = 25, 929 + }, 930 + .la = { 931 + .reg = 0x3d8, 932 + .shift = 16, 933 + .mask = 0xff, 934 + .def = 0x80, 935 + }, 820 936 }, 821 937 }, { 822 938 .id = 0x7a, 823 939 .name = "aper", 824 940 .swgroup = TEGRA_SWGROUP_APE, 825 - .smmu = { 826 - .reg = 0x234, 827 - .bit = 26, 828 - }, 829 - .la = { 830 - .reg = 0x3dc, 831 - .shift = 0, 832 - .mask = 0xff, 833 - .def = 0xff, 941 + .regs = { 942 + .smmu = { 943 + .reg = 0x234, 944 + .bit = 26, 945 + }, 946 + .la = { 947 + .reg = 0x3dc, 948 + .shift = 0, 949 + .mask = 0xff, 950 + .def = 0xff, 951 + }, 834 952 }, 835 953 }, { 836 954 .id = 0x7b, 837 955 .name = "apew", 838 956 .swgroup = TEGRA_SWGROUP_APE, 839 - .smmu = { 840 - .reg = 0x234, 841 - .bit = 27, 842 - }, 843 - .la = { 844 - .reg = 0x3dc, 845 - .shift = 16, 846 - .mask = 0xff, 847 - .def = 0x80, 957 + .regs = { 958 + .smmu = { 959 + .reg = 0x234, 960 + .bit = 27, 961 + }, 962 + .la = { 963 + .reg = 0x3dc, 964 + .shift = 16, 965 + .mask = 0xff, 966 + .def = 0x80, 967 + }, 848 968 }, 849 969 }, { 850 970 .id = 0x7e, 851 971 .name = "nvjpgsrd", 852 972 .swgroup = TEGRA_SWGROUP_NVJPG, 853 - .smmu = { 854 - .reg = 0x234, 855 - .bit = 30, 856 - }, 857 - .la = { 858 - .reg = 0x3e4, 859 - .shift = 0, 860 - .mask = 0xff, 861 - .def = 0x23, 973 + .regs = { 974 + .smmu = { 975 + .reg = 0x234, 976 + .bit = 30, 977 + }, 978 + .la = { 979 + .reg = 0x3e4, 980 + .shift = 0, 981 + .mask = 0xff, 982 + .def = 0x23, 983 + }, 862 984 }, 863 985 }, { 864 986 .id = 0x7f, 865 987 .name = "nvjpgswr", 866 988 .swgroup = TEGRA_SWGROUP_NVJPG, 867 - .smmu = { 868 - .reg = 0x234, 869 - .bit = 31, 870 - }, 871 - .la = { 872 - .reg = 0x3e4, 873 - .shift = 16, 874 - .mask = 0xff, 875 - .def = 0x80, 989 + .regs = { 990 + .smmu = { 991 + .reg = 0x234, 992 + .bit = 31, 993 + }, 994 + .la = { 995 + .reg = 0x3e4, 996 + .shift = 16, 997 + .mask = 0xff, 998 + .def = 0x80, 999 + }, 876 1000 }, 877 1001 }, { 878 1002 .id = 0x80, 879 1003 .name = "sesrd", 880 1004 .swgroup = TEGRA_SWGROUP_SE, 881 - .smmu = { 882 - .reg = 0xb98, 883 - .bit = 0, 884 - }, 885 - .la = { 886 - .reg = 0x3e0, 887 - .shift = 0, 888 - .mask = 0xff, 889 - .def = 0x2e, 1005 + .regs = { 1006 + .smmu = { 1007 + .reg = 0xb98, 1008 + .bit = 0, 1009 + }, 1010 + .la = { 1011 + .reg = 0x3e0, 1012 + .shift = 0, 1013 + .mask = 0xff, 1014 + .def = 0x2e, 1015 + }, 890 1016 }, 891 1017 }, { 892 1018 .id = 0x81, 893 1019 .name = "seswr", 894 1020 .swgroup = TEGRA_SWGROUP_SE, 895 - .smmu = { 896 - .reg = 0xb98, 897 - .bit = 1, 898 - }, 899 - .la = { 900 - .reg = 0x3e0, 901 - .shift = 16, 902 - .mask = 0xff, 903 - .def = 0x80, 1021 + .regs = { 1022 + .smmu = { 1023 + .reg = 0xb98, 1024 + .bit = 1, 1025 + }, 1026 + .la = { 1027 + .reg = 0x3e0, 1028 + .shift = 16, 1029 + .mask = 0xff, 1030 + .def = 0x80, 1031 + }, 904 1032 }, 905 1033 }, { 906 1034 .id = 0x82, 907 1035 .name = "axiapr", 908 1036 .swgroup = TEGRA_SWGROUP_AXIAP, 909 - .smmu = { 910 - .reg = 0xb98, 911 - .bit = 2, 912 - }, 913 - .la = { 914 - .reg = 0x3a0, 915 - .shift = 0, 916 - .mask = 0xff, 917 - .def = 0xff, 1037 + .regs = { 1038 + .smmu = { 1039 + .reg = 0xb98, 1040 + .bit = 2, 1041 + }, 1042 + .la = { 1043 + .reg = 0x3a0, 1044 + .shift = 0, 1045 + .mask = 0xff, 1046 + .def = 0xff, 1047 + }, 918 1048 }, 919 1049 }, { 920 1050 .id = 0x83, 921 1051 .name = "axiapw", 922 1052 .swgroup = TEGRA_SWGROUP_AXIAP, 923 - .smmu = { 924 - .reg = 0xb98, 925 - .bit = 3, 926 - }, 927 - .la = { 928 - .reg = 0x3a0, 929 - .shift = 16, 930 - .mask = 0xff, 931 - .def = 0x80, 1053 + .regs = { 1054 + .smmu = { 1055 + .reg = 0xb98, 1056 + .bit = 3, 1057 + }, 1058 + .la = { 1059 + .reg = 0x3a0, 1060 + .shift = 16, 1061 + .mask = 0xff, 1062 + .def = 0x80, 1063 + }, 932 1064 }, 933 1065 }, { 934 1066 .id = 0x84, 935 1067 .name = "etrr", 936 1068 .swgroup = TEGRA_SWGROUP_ETR, 937 - .smmu = { 938 - .reg = 0xb98, 939 - .bit = 4, 940 - }, 941 - .la = { 942 - .reg = 0x3ec, 943 - .shift = 0, 944 - .mask = 0xff, 945 - .def = 0xff, 1069 + .regs = { 1070 + .smmu = { 1071 + .reg = 0xb98, 1072 + .bit = 4, 1073 + }, 1074 + .la = { 1075 + .reg = 0x3ec, 1076 + .shift = 0, 1077 + .mask = 0xff, 1078 + .def = 0xff, 1079 + }, 946 1080 }, 947 1081 }, { 948 1082 .id = 0x85, 949 1083 .name = "etrw", 950 1084 .swgroup = TEGRA_SWGROUP_ETR, 951 - .smmu = { 952 - .reg = 0xb98, 953 - .bit = 5, 954 - }, 955 - .la = { 956 - .reg = 0x3ec, 957 - .shift = 16, 958 - .mask = 0xff, 959 - .def = 0x80, 1085 + .regs = { 1086 + .smmu = { 1087 + .reg = 0xb98, 1088 + .bit = 5, 1089 + }, 1090 + .la = { 1091 + .reg = 0x3ec, 1092 + .shift = 16, 1093 + .mask = 0xff, 1094 + .def = 0x80, 1095 + }, 960 1096 }, 961 1097 }, { 962 1098 .id = 0x86, 963 1099 .name = "tsecsrdb", 964 1100 .swgroup = TEGRA_SWGROUP_TSECB, 965 - .smmu = { 966 - .reg = 0xb98, 967 - .bit = 6, 968 - }, 969 - .la = { 970 - .reg = 0x3f0, 971 - .shift = 0, 972 - .mask = 0xff, 973 - .def = 0x9b, 1101 + .regs = { 1102 + .smmu = { 1103 + .reg = 0xb98, 1104 + .bit = 6, 1105 + }, 1106 + .la = { 1107 + .reg = 0x3f0, 1108 + .shift = 0, 1109 + .mask = 0xff, 1110 + .def = 0x9b, 1111 + }, 974 1112 }, 975 1113 }, { 976 1114 .id = 0x87, 977 1115 .name = "tsecswrb", 978 1116 .swgroup = TEGRA_SWGROUP_TSECB, 979 - .smmu = { 980 - .reg = 0xb98, 981 - .bit = 7, 982 - }, 983 - .la = { 984 - .reg = 0x3f0, 985 - .shift = 16, 986 - .mask = 0xff, 987 - .def = 0x80, 1117 + .regs = { 1118 + .smmu = { 1119 + .reg = 0xb98, 1120 + .bit = 7, 1121 + }, 1122 + .la = { 1123 + .reg = 0x3f0, 1124 + .shift = 16, 1125 + .mask = 0xff, 1126 + .def = 0x80, 1127 + }, 988 1128 }, 989 1129 }, { 990 1130 .id = 0x88, 991 1131 .name = "gpusrd2", 992 1132 .swgroup = TEGRA_SWGROUP_GPU, 993 - .smmu = { 994 - /* read-only */ 995 - .reg = 0xb98, 996 - .bit = 8, 997 - }, 998 - .la = { 999 - .reg = 0x3e8, 1000 - .shift = 0, 1001 - .mask = 0xff, 1002 - .def = 0x1a, 1133 + .regs = { 1134 + .smmu = { 1135 + /* read-only */ 1136 + .reg = 0xb98, 1137 + .bit = 8, 1138 + }, 1139 + .la = { 1140 + .reg = 0x3e8, 1141 + .shift = 0, 1142 + .mask = 0xff, 1143 + .def = 0x1a, 1144 + }, 1003 1145 }, 1004 1146 }, { 1005 1147 .id = 0x89, 1006 1148 .name = "gpuswr2", 1007 1149 .swgroup = TEGRA_SWGROUP_GPU, 1008 - .smmu = { 1009 - /* read-only */ 1010 - .reg = 0xb98, 1011 - .bit = 9, 1012 - }, 1013 - .la = { 1014 - .reg = 0x3e8, 1015 - .shift = 16, 1016 - .mask = 0xff, 1017 - .def = 0x80, 1150 + .regs = { 1151 + .smmu = { 1152 + /* read-only */ 1153 + .reg = 0xb98, 1154 + .bit = 9, 1155 + }, 1156 + .la = { 1157 + .reg = 0x3e8, 1158 + .shift = 16, 1159 + .mask = 0xff, 1160 + .def = 0x80, 1161 + }, 1018 1162 }, 1019 1163 }, 1020 1164 }; ··· 1286 1142 .reset_ops = &tegra_mc_reset_ops_common, 1287 1143 .resets = tegra210_mc_resets, 1288 1144 .num_resets = ARRAY_SIZE(tegra210_mc_resets), 1145 + .ops = &tegra30_mc_ops, 1289 1146 };
+6 -50
drivers/memory/tegra/tegra30-emc.c
··· 150 150 #define EMC_SELF_REF_CMD_ENABLED BIT(0) 151 151 152 152 #define DRAM_DEV_SEL_ALL (0 << 30) 153 - #define DRAM_DEV_SEL_0 (2 << 30) 154 - #define DRAM_DEV_SEL_1 (1 << 30) 153 + #define DRAM_DEV_SEL_0 BIT(31) 154 + #define DRAM_DEV_SEL_1 BIT(30) 155 155 #define DRAM_BROADCAST(num) \ 156 156 ((num) > 1 ? DRAM_DEV_SEL_ALL : DRAM_DEV_SEL_0) 157 157 ··· 1354 1354 } 1355 1355 1356 1356 emc->debugfs.root = debugfs_create_dir("emc", NULL); 1357 - if (!emc->debugfs.root) { 1358 - dev_err(emc->dev, "failed to create debugfs directory\n"); 1359 - return; 1360 - } 1361 1357 1362 1358 debugfs_create_file("available_rates", 0444, emc->debugfs.root, 1363 1359 emc, &tegra_emc_debug_available_rates_fops); ··· 1476 1480 return err; 1477 1481 } 1478 1482 1479 - static int tegra_emc_opp_table_init(struct tegra_emc *emc) 1480 - { 1481 - u32 hw_version = BIT(tegra_sku_info.soc_speedo_id); 1482 - struct opp_table *hw_opp_table; 1483 - int err; 1484 - 1485 - hw_opp_table = dev_pm_opp_set_supported_hw(emc->dev, &hw_version, 1); 1486 - err = PTR_ERR_OR_ZERO(hw_opp_table); 1487 - if (err) { 1488 - dev_err(emc->dev, "failed to set OPP supported HW: %d\n", err); 1489 - return err; 1490 - } 1491 - 1492 - err = dev_pm_opp_of_add_table(emc->dev); 1493 - if (err) { 1494 - if (err == -ENODEV) 1495 - dev_err(emc->dev, "OPP table not found, please update your device tree\n"); 1496 - else 1497 - dev_err(emc->dev, "failed to add OPP table: %d\n", err); 1498 - 1499 - goto put_hw_table; 1500 - } 1501 - 1502 - dev_info_once(emc->dev, "OPP HW ver. 0x%x, current clock rate %lu MHz\n", 1503 - hw_version, clk_get_rate(emc->clk) / 1000000); 1504 - 1505 - /* first dummy rate-set initializes voltage state */ 1506 - err = dev_pm_opp_set_rate(emc->dev, clk_get_rate(emc->clk)); 1507 - if (err) { 1508 - dev_err(emc->dev, "failed to initialize OPP clock: %d\n", err); 1509 - goto remove_table; 1510 - } 1511 - 1512 - return 0; 1513 - 1514 - remove_table: 1515 - dev_pm_opp_of_remove_table(emc->dev); 1516 - put_hw_table: 1517 - dev_pm_opp_put_supported_hw(hw_opp_table); 1518 - 1519 - return err; 1520 - } 1521 - 1522 1483 static void devm_tegra_emc_unset_callback(void *data) 1523 1484 { 1524 1485 tegra20_clk_set_emc_round_callback(NULL, NULL); ··· 1521 1568 1522 1569 static int tegra_emc_probe(struct platform_device *pdev) 1523 1570 { 1571 + struct tegra_core_opp_params opp_params = {}; 1524 1572 struct device_node *np; 1525 1573 struct tegra_emc *emc; 1526 1574 int err; ··· 1571 1617 if (err) 1572 1618 return err; 1573 1619 1574 - err = tegra_emc_opp_table_init(emc); 1620 + opp_params.init_state = true; 1621 + 1622 + err = devm_tegra_core_dev_init_opp_table(&pdev->dev, &opp_params); 1575 1623 if (err) 1576 1624 return err; 1577 1625
+712 -580
drivers/memory/tegra/tegra30.c
··· 37 37 .id = 0x00, 38 38 .name = "ptcr", 39 39 .swgroup = TEGRA_SWGROUP_PTC, 40 - .la = { 41 - .reg = 0x34c, 42 - .shift = 0, 43 - .mask = 0xff, 44 - .def = 0x0, 40 + .regs = { 41 + .la = { 42 + .reg = 0x34c, 43 + .shift = 0, 44 + .mask = 0xff, 45 + .def = 0x0, 46 + }, 45 47 }, 46 48 .fifo_size = 16 * 2, 47 49 }, { 48 50 .id = 0x01, 49 51 .name = "display0a", 50 52 .swgroup = TEGRA_SWGROUP_DC, 51 - .smmu = { 52 - .reg = 0x228, 53 - .bit = 1, 54 - }, 55 - .la = { 56 - .reg = 0x2e8, 57 - .shift = 0, 58 - .mask = 0xff, 59 - .def = 0x4e, 53 + .regs = { 54 + .smmu = { 55 + .reg = 0x228, 56 + .bit = 1, 57 + }, 58 + .la = { 59 + .reg = 0x2e8, 60 + .shift = 0, 61 + .mask = 0xff, 62 + .def = 0x4e, 63 + }, 60 64 }, 61 65 .fifo_size = 16 * 128, 62 66 }, { 63 67 .id = 0x02, 64 68 .name = "display0ab", 65 69 .swgroup = TEGRA_SWGROUP_DCB, 66 - .smmu = { 67 - .reg = 0x228, 68 - .bit = 2, 69 - }, 70 - .la = { 71 - .reg = 0x2f4, 72 - .shift = 0, 73 - .mask = 0xff, 74 - .def = 0x4e, 70 + .regs = { 71 + .smmu = { 72 + .reg = 0x228, 73 + .bit = 2, 74 + }, 75 + .la = { 76 + .reg = 0x2f4, 77 + .shift = 0, 78 + .mask = 0xff, 79 + .def = 0x4e, 80 + }, 75 81 }, 76 82 .fifo_size = 16 * 128, 77 83 }, { 78 84 .id = 0x03, 79 85 .name = "display0b", 80 86 .swgroup = TEGRA_SWGROUP_DC, 81 - .smmu = { 82 - .reg = 0x228, 83 - .bit = 3, 84 - }, 85 - .la = { 86 - .reg = 0x2e8, 87 - .shift = 16, 88 - .mask = 0xff, 89 - .def = 0x4e, 87 + .regs = { 88 + .smmu = { 89 + .reg = 0x228, 90 + .bit = 3, 91 + }, 92 + .la = { 93 + .reg = 0x2e8, 94 + .shift = 16, 95 + .mask = 0xff, 96 + .def = 0x4e, 97 + }, 90 98 }, 91 99 .fifo_size = 16 * 64, 92 100 }, { 93 101 .id = 0x04, 94 102 .name = "display0bb", 95 103 .swgroup = TEGRA_SWGROUP_DCB, 96 - .smmu = { 97 - .reg = 0x228, 98 - .bit = 4, 99 - }, 100 - .la = { 101 - .reg = 0x2f4, 102 - .shift = 16, 103 - .mask = 0xff, 104 - .def = 0x4e, 104 + .regs = { 105 + .smmu = { 106 + .reg = 0x228, 107 + .bit = 4, 108 + }, 109 + .la = { 110 + .reg = 0x2f4, 111 + .shift = 16, 112 + .mask = 0xff, 113 + .def = 0x4e, 114 + }, 105 115 }, 106 116 .fifo_size = 16 * 64, 107 117 }, { 108 118 .id = 0x05, 109 119 .name = "display0c", 110 120 .swgroup = TEGRA_SWGROUP_DC, 111 - .smmu = { 112 - .reg = 0x228, 113 - .bit = 5, 114 - }, 115 - .la = { 116 - .reg = 0x2ec, 117 - .shift = 0, 118 - .mask = 0xff, 119 - .def = 0x4e, 121 + .regs = { 122 + .smmu = { 123 + .reg = 0x228, 124 + .bit = 5, 125 + }, 126 + .la = { 127 + .reg = 0x2ec, 128 + .shift = 0, 129 + .mask = 0xff, 130 + .def = 0x4e, 131 + }, 120 132 }, 121 133 .fifo_size = 16 * 128, 122 134 }, { 123 135 .id = 0x06, 124 136 .name = "display0cb", 125 137 .swgroup = TEGRA_SWGROUP_DCB, 126 - .smmu = { 127 - .reg = 0x228, 128 - .bit = 6, 129 - }, 130 - .la = { 131 - .reg = 0x2f8, 132 - .shift = 0, 133 - .mask = 0xff, 134 - .def = 0x4e, 138 + .regs = { 139 + .smmu = { 140 + .reg = 0x228, 141 + .bit = 6, 142 + }, 143 + .la = { 144 + .reg = 0x2f8, 145 + .shift = 0, 146 + .mask = 0xff, 147 + .def = 0x4e, 148 + }, 135 149 }, 136 150 .fifo_size = 16 * 128, 137 151 }, { 138 152 .id = 0x07, 139 153 .name = "display1b", 140 154 .swgroup = TEGRA_SWGROUP_DC, 141 - .smmu = { 142 - .reg = 0x228, 143 - .bit = 7, 144 - }, 145 - .la = { 146 - .reg = 0x2ec, 147 - .shift = 16, 148 - .mask = 0xff, 149 - .def = 0x4e, 155 + .regs = { 156 + .smmu = { 157 + .reg = 0x228, 158 + .bit = 7, 159 + }, 160 + .la = { 161 + .reg = 0x2ec, 162 + .shift = 16, 163 + .mask = 0xff, 164 + .def = 0x4e, 165 + }, 150 166 }, 151 167 .fifo_size = 16 * 64, 152 168 }, { 153 169 .id = 0x08, 154 170 .name = "display1bb", 155 171 .swgroup = TEGRA_SWGROUP_DCB, 156 - .smmu = { 157 - .reg = 0x228, 158 - .bit = 8, 159 - }, 160 - .la = { 161 - .reg = 0x2f8, 162 - .shift = 16, 163 - .mask = 0xff, 164 - .def = 0x4e, 172 + .regs = { 173 + .smmu = { 174 + .reg = 0x228, 175 + .bit = 8, 176 + }, 177 + .la = { 178 + .reg = 0x2f8, 179 + .shift = 16, 180 + .mask = 0xff, 181 + .def = 0x4e, 182 + }, 165 183 }, 166 184 .fifo_size = 16 * 64, 167 185 }, { 168 186 .id = 0x09, 169 187 .name = "eppup", 170 188 .swgroup = TEGRA_SWGROUP_EPP, 171 - .smmu = { 172 - .reg = 0x228, 173 - .bit = 9, 174 - }, 175 - .la = { 176 - .reg = 0x300, 177 - .shift = 0, 178 - .mask = 0xff, 179 - .def = 0x17, 189 + .regs = { 190 + .smmu = { 191 + .reg = 0x228, 192 + .bit = 9, 193 + }, 194 + .la = { 195 + .reg = 0x300, 196 + .shift = 0, 197 + .mask = 0xff, 198 + .def = 0x17, 199 + }, 180 200 }, 181 201 .fifo_size = 16 * 8, 182 202 }, { 183 203 .id = 0x0a, 184 204 .name = "g2pr", 185 205 .swgroup = TEGRA_SWGROUP_G2, 186 - .smmu = { 187 - .reg = 0x228, 188 - .bit = 10, 189 - }, 190 - .la = { 191 - .reg = 0x308, 192 - .shift = 0, 193 - .mask = 0xff, 194 - .def = 0x09, 206 + .regs = { 207 + .smmu = { 208 + .reg = 0x228, 209 + .bit = 10, 210 + }, 211 + .la = { 212 + .reg = 0x308, 213 + .shift = 0, 214 + .mask = 0xff, 215 + .def = 0x09, 216 + }, 195 217 }, 196 218 .fifo_size = 16 * 64, 197 219 }, { 198 220 .id = 0x0b, 199 221 .name = "g2sr", 200 222 .swgroup = TEGRA_SWGROUP_G2, 201 - .smmu = { 202 - .reg = 0x228, 203 - .bit = 11, 204 - }, 205 - .la = { 206 - .reg = 0x308, 207 - .shift = 16, 208 - .mask = 0xff, 209 - .def = 0x09, 223 + .regs = { 224 + .smmu = { 225 + .reg = 0x228, 226 + .bit = 11, 227 + }, 228 + .la = { 229 + .reg = 0x308, 230 + .shift = 16, 231 + .mask = 0xff, 232 + .def = 0x09, 233 + }, 210 234 }, 211 235 .fifo_size = 16 * 64, 212 236 }, { 213 237 .id = 0x0c, 214 238 .name = "mpeunifbr", 215 239 .swgroup = TEGRA_SWGROUP_MPE, 216 - .smmu = { 217 - .reg = 0x228, 218 - .bit = 12, 219 - }, 220 - .la = { 221 - .reg = 0x328, 222 - .shift = 0, 223 - .mask = 0xff, 224 - .def = 0x50, 240 + .regs = { 241 + .smmu = { 242 + .reg = 0x228, 243 + .bit = 12, 244 + }, 245 + .la = { 246 + .reg = 0x328, 247 + .shift = 0, 248 + .mask = 0xff, 249 + .def = 0x50, 250 + }, 225 251 }, 226 252 .fifo_size = 16 * 8, 227 253 }, { 228 254 .id = 0x0d, 229 255 .name = "viruv", 230 256 .swgroup = TEGRA_SWGROUP_VI, 231 - .smmu = { 232 - .reg = 0x228, 233 - .bit = 13, 234 - }, 235 - .la = { 236 - .reg = 0x364, 237 - .shift = 0, 238 - .mask = 0xff, 239 - .def = 0x2c, 257 + .regs = { 258 + .smmu = { 259 + .reg = 0x228, 260 + .bit = 13, 261 + }, 262 + .la = { 263 + .reg = 0x364, 264 + .shift = 0, 265 + .mask = 0xff, 266 + .def = 0x2c, 267 + }, 240 268 }, 241 269 .fifo_size = 16 * 8, 242 270 }, { 243 271 .id = 0x0e, 244 272 .name = "afir", 245 273 .swgroup = TEGRA_SWGROUP_AFI, 246 - .smmu = { 247 - .reg = 0x228, 248 - .bit = 14, 249 - }, 250 - .la = { 251 - .reg = 0x2e0, 252 - .shift = 0, 253 - .mask = 0xff, 254 - .def = 0x10, 274 + .regs = { 275 + .smmu = { 276 + .reg = 0x228, 277 + .bit = 14, 278 + }, 279 + .la = { 280 + .reg = 0x2e0, 281 + .shift = 0, 282 + .mask = 0xff, 283 + .def = 0x10, 284 + }, 255 285 }, 256 286 .fifo_size = 16 * 32, 257 287 }, { 258 288 .id = 0x0f, 259 289 .name = "avpcarm7r", 260 290 .swgroup = TEGRA_SWGROUP_AVPC, 261 - .smmu = { 262 - .reg = 0x228, 263 - .bit = 15, 264 - }, 265 - .la = { 266 - .reg = 0x2e4, 267 - .shift = 0, 268 - .mask = 0xff, 269 - .def = 0x04, 291 + .regs = { 292 + .smmu = { 293 + .reg = 0x228, 294 + .bit = 15, 295 + }, 296 + .la = { 297 + .reg = 0x2e4, 298 + .shift = 0, 299 + .mask = 0xff, 300 + .def = 0x04, 301 + }, 270 302 }, 271 303 .fifo_size = 16 * 2, 272 304 }, { 273 305 .id = 0x10, 274 306 .name = "displayhc", 275 307 .swgroup = TEGRA_SWGROUP_DC, 276 - .smmu = { 277 - .reg = 0x228, 278 - .bit = 16, 279 - }, 280 - .la = { 281 - .reg = 0x2f0, 282 - .shift = 0, 283 - .mask = 0xff, 284 - .def = 0xff, 308 + .regs = { 309 + .smmu = { 310 + .reg = 0x228, 311 + .bit = 16, 312 + }, 313 + .la = { 314 + .reg = 0x2f0, 315 + .shift = 0, 316 + .mask = 0xff, 317 + .def = 0xff, 318 + }, 285 319 }, 286 320 .fifo_size = 16 * 2, 287 321 }, { 288 322 .id = 0x11, 289 323 .name = "displayhcb", 290 324 .swgroup = TEGRA_SWGROUP_DCB, 291 - .smmu = { 292 - .reg = 0x228, 293 - .bit = 17, 294 - }, 295 - .la = { 296 - .reg = 0x2fc, 297 - .shift = 0, 298 - .mask = 0xff, 299 - .def = 0xff, 325 + .regs = { 326 + .smmu = { 327 + .reg = 0x228, 328 + .bit = 17, 329 + }, 330 + .la = { 331 + .reg = 0x2fc, 332 + .shift = 0, 333 + .mask = 0xff, 334 + .def = 0xff, 335 + }, 300 336 }, 301 337 .fifo_size = 16 * 2, 302 338 }, { 303 339 .id = 0x12, 304 340 .name = "fdcdrd", 305 341 .swgroup = TEGRA_SWGROUP_NV, 306 - .smmu = { 307 - .reg = 0x228, 308 - .bit = 18, 309 - }, 310 - .la = { 311 - .reg = 0x334, 312 - .shift = 0, 313 - .mask = 0xff, 314 - .def = 0x0a, 342 + .regs = { 343 + .smmu = { 344 + .reg = 0x228, 345 + .bit = 18, 346 + }, 347 + .la = { 348 + .reg = 0x334, 349 + .shift = 0, 350 + .mask = 0xff, 351 + .def = 0x0a, 352 + }, 315 353 }, 316 354 .fifo_size = 16 * 48, 317 355 }, { 318 356 .id = 0x13, 319 357 .name = "fdcdrd2", 320 358 .swgroup = TEGRA_SWGROUP_NV2, 321 - .smmu = { 322 - .reg = 0x228, 323 - .bit = 19, 324 - }, 325 - .la = { 326 - .reg = 0x33c, 327 - .shift = 0, 328 - .mask = 0xff, 329 - .def = 0x0a, 359 + .regs = { 360 + .smmu = { 361 + .reg = 0x228, 362 + .bit = 19, 363 + }, 364 + .la = { 365 + .reg = 0x33c, 366 + .shift = 0, 367 + .mask = 0xff, 368 + .def = 0x0a, 369 + }, 330 370 }, 331 371 .fifo_size = 16 * 48, 332 372 }, { 333 373 .id = 0x14, 334 374 .name = "g2dr", 335 375 .swgroup = TEGRA_SWGROUP_G2, 336 - .smmu = { 337 - .reg = 0x228, 338 - .bit = 20, 339 - }, 340 - .la = { 341 - .reg = 0x30c, 342 - .shift = 0, 343 - .mask = 0xff, 344 - .def = 0x0a, 376 + .regs = { 377 + .smmu = { 378 + .reg = 0x228, 379 + .bit = 20, 380 + }, 381 + .la = { 382 + .reg = 0x30c, 383 + .shift = 0, 384 + .mask = 0xff, 385 + .def = 0x0a, 386 + }, 345 387 }, 346 388 .fifo_size = 16 * 48, 347 389 }, { 348 390 .id = 0x15, 349 391 .name = "hdar", 350 392 .swgroup = TEGRA_SWGROUP_HDA, 351 - .smmu = { 352 - .reg = 0x228, 353 - .bit = 21, 354 - }, 355 - .la = { 356 - .reg = 0x318, 357 - .shift = 0, 358 - .mask = 0xff, 359 - .def = 0xff, 393 + .regs = { 394 + .smmu = { 395 + .reg = 0x228, 396 + .bit = 21, 397 + }, 398 + .la = { 399 + .reg = 0x318, 400 + .shift = 0, 401 + .mask = 0xff, 402 + .def = 0xff, 403 + }, 360 404 }, 361 405 .fifo_size = 16 * 16, 362 406 }, { 363 407 .id = 0x16, 364 408 .name = "host1xdmar", 365 409 .swgroup = TEGRA_SWGROUP_HC, 366 - .smmu = { 367 - .reg = 0x228, 368 - .bit = 22, 369 - }, 370 - .la = { 371 - .reg = 0x310, 372 - .shift = 0, 373 - .mask = 0xff, 374 - .def = 0x05, 410 + .regs = { 411 + .smmu = { 412 + .reg = 0x228, 413 + .bit = 22, 414 + }, 415 + .la = { 416 + .reg = 0x310, 417 + .shift = 0, 418 + .mask = 0xff, 419 + .def = 0x05, 420 + }, 375 421 }, 376 422 .fifo_size = 16 * 16, 377 423 }, { 378 424 .id = 0x17, 379 425 .name = "host1xr", 380 426 .swgroup = TEGRA_SWGROUP_HC, 381 - .smmu = { 382 - .reg = 0x228, 383 - .bit = 23, 384 - }, 385 - .la = { 386 - .reg = 0x310, 387 - .shift = 16, 388 - .mask = 0xff, 389 - .def = 0x50, 427 + .regs = { 428 + .smmu = { 429 + .reg = 0x228, 430 + .bit = 23, 431 + }, 432 + .la = { 433 + .reg = 0x310, 434 + .shift = 16, 435 + .mask = 0xff, 436 + .def = 0x50, 437 + }, 390 438 }, 391 439 .fifo_size = 16 * 8, 392 440 }, { 393 441 .id = 0x18, 394 442 .name = "idxsrd", 395 443 .swgroup = TEGRA_SWGROUP_NV, 396 - .smmu = { 397 - .reg = 0x228, 398 - .bit = 24, 399 - }, 400 - .la = { 401 - .reg = 0x334, 402 - .shift = 16, 403 - .mask = 0xff, 404 - .def = 0x13, 444 + .regs = { 445 + .smmu = { 446 + .reg = 0x228, 447 + .bit = 24, 448 + }, 449 + .la = { 450 + .reg = 0x334, 451 + .shift = 16, 452 + .mask = 0xff, 453 + .def = 0x13, 454 + }, 405 455 }, 406 456 .fifo_size = 16 * 64, 407 457 }, { 408 458 .id = 0x19, 409 459 .name = "idxsrd2", 410 460 .swgroup = TEGRA_SWGROUP_NV2, 411 - .smmu = { 412 - .reg = 0x228, 413 - .bit = 25, 414 - }, 415 - .la = { 416 - .reg = 0x33c, 417 - .shift = 16, 418 - .mask = 0xff, 419 - .def = 0x13, 461 + .regs = { 462 + .smmu = { 463 + .reg = 0x228, 464 + .bit = 25, 465 + }, 466 + .la = { 467 + .reg = 0x33c, 468 + .shift = 16, 469 + .mask = 0xff, 470 + .def = 0x13, 471 + }, 420 472 }, 421 473 .fifo_size = 16 * 64, 422 474 }, { 423 475 .id = 0x1a, 424 476 .name = "mpe_ipred", 425 477 .swgroup = TEGRA_SWGROUP_MPE, 426 - .smmu = { 427 - .reg = 0x228, 428 - .bit = 26, 429 - }, 430 - .la = { 431 - .reg = 0x328, 432 - .shift = 16, 433 - .mask = 0xff, 434 - .def = 0x80, 478 + .regs = { 479 + .smmu = { 480 + .reg = 0x228, 481 + .bit = 26, 482 + }, 483 + .la = { 484 + .reg = 0x328, 485 + .shift = 16, 486 + .mask = 0xff, 487 + .def = 0x80, 488 + }, 435 489 }, 436 490 .fifo_size = 16 * 2, 437 491 }, { 438 492 .id = 0x1b, 439 493 .name = "mpeamemrd", 440 494 .swgroup = TEGRA_SWGROUP_MPE, 441 - .smmu = { 442 - .reg = 0x228, 443 - .bit = 27, 444 - }, 445 - .la = { 446 - .reg = 0x32c, 447 - .shift = 0, 448 - .mask = 0xff, 449 - .def = 0x42, 495 + .regs = { 496 + .smmu = { 497 + .reg = 0x228, 498 + .bit = 27, 499 + }, 500 + .la = { 501 + .reg = 0x32c, 502 + .shift = 0, 503 + .mask = 0xff, 504 + .def = 0x42, 505 + }, 450 506 }, 451 507 .fifo_size = 16 * 64, 452 508 }, { 453 509 .id = 0x1c, 454 510 .name = "mpecsrd", 455 511 .swgroup = TEGRA_SWGROUP_MPE, 456 - .smmu = { 457 - .reg = 0x228, 458 - .bit = 28, 459 - }, 460 - .la = { 461 - .reg = 0x32c, 462 - .shift = 16, 463 - .mask = 0xff, 464 - .def = 0xff, 512 + .regs = { 513 + .smmu = { 514 + .reg = 0x228, 515 + .bit = 28, 516 + }, 517 + .la = { 518 + .reg = 0x32c, 519 + .shift = 16, 520 + .mask = 0xff, 521 + .def = 0xff, 522 + }, 465 523 }, 466 524 .fifo_size = 16 * 8, 467 525 }, { 468 526 .id = 0x1d, 469 527 .name = "ppcsahbdmar", 470 528 .swgroup = TEGRA_SWGROUP_PPCS, 471 - .smmu = { 472 - .reg = 0x228, 473 - .bit = 29, 474 - }, 475 - .la = { 476 - .reg = 0x344, 477 - .shift = 0, 478 - .mask = 0xff, 479 - .def = 0x10, 529 + .regs = { 530 + .smmu = { 531 + .reg = 0x228, 532 + .bit = 29, 533 + }, 534 + .la = { 535 + .reg = 0x344, 536 + .shift = 0, 537 + .mask = 0xff, 538 + .def = 0x10, 539 + }, 480 540 }, 481 541 .fifo_size = 16 * 2, 482 542 }, { 483 543 .id = 0x1e, 484 544 .name = "ppcsahbslvr", 485 545 .swgroup = TEGRA_SWGROUP_PPCS, 486 - .smmu = { 487 - .reg = 0x228, 488 - .bit = 30, 489 - }, 490 - .la = { 491 - .reg = 0x344, 492 - .shift = 16, 493 - .mask = 0xff, 494 - .def = 0x12, 546 + .regs = { 547 + .smmu = { 548 + .reg = 0x228, 549 + .bit = 30, 550 + }, 551 + .la = { 552 + .reg = 0x344, 553 + .shift = 16, 554 + .mask = 0xff, 555 + .def = 0x12, 556 + }, 495 557 }, 496 558 .fifo_size = 16 * 8, 497 559 }, { 498 560 .id = 0x1f, 499 561 .name = "satar", 500 562 .swgroup = TEGRA_SWGROUP_SATA, 501 - .smmu = { 502 - .reg = 0x228, 503 - .bit = 31, 504 - }, 505 - .la = { 506 - .reg = 0x350, 507 - .shift = 0, 508 - .mask = 0xff, 509 - .def = 0x33, 563 + .regs = { 564 + .smmu = { 565 + .reg = 0x228, 566 + .bit = 31, 567 + }, 568 + .la = { 569 + .reg = 0x350, 570 + .shift = 0, 571 + .mask = 0xff, 572 + .def = 0x33, 573 + }, 510 574 }, 511 575 .fifo_size = 16 * 32, 512 576 }, { 513 577 .id = 0x20, 514 578 .name = "texsrd", 515 579 .swgroup = TEGRA_SWGROUP_NV, 516 - .smmu = { 517 - .reg = 0x22c, 518 - .bit = 0, 519 - }, 520 - .la = { 521 - .reg = 0x338, 522 - .shift = 0, 523 - .mask = 0xff, 524 - .def = 0x13, 580 + .regs = { 581 + .smmu = { 582 + .reg = 0x22c, 583 + .bit = 0, 584 + }, 585 + .la = { 586 + .reg = 0x338, 587 + .shift = 0, 588 + .mask = 0xff, 589 + .def = 0x13, 590 + }, 525 591 }, 526 592 .fifo_size = 16 * 64, 527 593 }, { 528 594 .id = 0x21, 529 595 .name = "texsrd2", 530 596 .swgroup = TEGRA_SWGROUP_NV2, 531 - .smmu = { 532 - .reg = 0x22c, 533 - .bit = 1, 534 - }, 535 - .la = { 536 - .reg = 0x340, 537 - .shift = 0, 538 - .mask = 0xff, 539 - .def = 0x13, 597 + .regs = { 598 + .smmu = { 599 + .reg = 0x22c, 600 + .bit = 1, 601 + }, 602 + .la = { 603 + .reg = 0x340, 604 + .shift = 0, 605 + .mask = 0xff, 606 + .def = 0x13, 607 + }, 540 608 }, 541 609 .fifo_size = 16 * 64, 542 610 }, { 543 611 .id = 0x22, 544 612 .name = "vdebsevr", 545 613 .swgroup = TEGRA_SWGROUP_VDE, 546 - .smmu = { 547 - .reg = 0x22c, 548 - .bit = 2, 549 - }, 550 - .la = { 551 - .reg = 0x354, 552 - .shift = 0, 553 - .mask = 0xff, 554 - .def = 0xff, 614 + .regs = { 615 + .smmu = { 616 + .reg = 0x22c, 617 + .bit = 2, 618 + }, 619 + .la = { 620 + .reg = 0x354, 621 + .shift = 0, 622 + .mask = 0xff, 623 + .def = 0xff, 624 + }, 555 625 }, 556 626 .fifo_size = 16 * 8, 557 627 }, { 558 628 .id = 0x23, 559 629 .name = "vdember", 560 630 .swgroup = TEGRA_SWGROUP_VDE, 561 - .smmu = { 562 - .reg = 0x22c, 563 - .bit = 3, 564 - }, 565 - .la = { 566 - .reg = 0x354, 567 - .shift = 16, 568 - .mask = 0xff, 569 - .def = 0xd0, 631 + .regs = { 632 + .smmu = { 633 + .reg = 0x22c, 634 + .bit = 3, 635 + }, 636 + .la = { 637 + .reg = 0x354, 638 + .shift = 16, 639 + .mask = 0xff, 640 + .def = 0xd0, 641 + }, 570 642 }, 571 643 .fifo_size = 16 * 4, 572 644 }, { 573 645 .id = 0x24, 574 646 .name = "vdemcer", 575 647 .swgroup = TEGRA_SWGROUP_VDE, 576 - .smmu = { 577 - .reg = 0x22c, 578 - .bit = 4, 579 - }, 580 - .la = { 581 - .reg = 0x358, 582 - .shift = 0, 583 - .mask = 0xff, 584 - .def = 0x2a, 648 + .regs = { 649 + .smmu = { 650 + .reg = 0x22c, 651 + .bit = 4, 652 + }, 653 + .la = { 654 + .reg = 0x358, 655 + .shift = 0, 656 + .mask = 0xff, 657 + .def = 0x2a, 658 + }, 585 659 }, 586 660 .fifo_size = 16 * 16, 587 661 }, { 588 662 .id = 0x25, 589 663 .name = "vdetper", 590 664 .swgroup = TEGRA_SWGROUP_VDE, 591 - .smmu = { 592 - .reg = 0x22c, 593 - .bit = 5, 594 - }, 595 - .la = { 596 - .reg = 0x358, 597 - .shift = 16, 598 - .mask = 0xff, 599 - .def = 0x74, 665 + .regs = { 666 + .smmu = { 667 + .reg = 0x22c, 668 + .bit = 5, 669 + }, 670 + .la = { 671 + .reg = 0x358, 672 + .shift = 16, 673 + .mask = 0xff, 674 + .def = 0x74, 675 + }, 600 676 }, 601 677 .fifo_size = 16 * 16, 602 678 }, { 603 679 .id = 0x26, 604 680 .name = "mpcorelpr", 605 681 .swgroup = TEGRA_SWGROUP_MPCORELP, 606 - .la = { 607 - .reg = 0x324, 608 - .shift = 0, 609 - .mask = 0xff, 610 - .def = 0x04, 682 + .regs = { 683 + .la = { 684 + .reg = 0x324, 685 + .shift = 0, 686 + .mask = 0xff, 687 + .def = 0x04, 688 + }, 611 689 }, 612 690 .fifo_size = 16 * 14, 613 691 }, { 614 692 .id = 0x27, 615 693 .name = "mpcorer", 616 694 .swgroup = TEGRA_SWGROUP_MPCORE, 617 - .la = { 618 - .reg = 0x320, 619 - .shift = 0, 620 - .mask = 0xff, 621 - .def = 0x04, 695 + .regs = { 696 + .la = { 697 + .reg = 0x320, 698 + .shift = 0, 699 + .mask = 0xff, 700 + .def = 0x04, 701 + }, 622 702 }, 623 703 .fifo_size = 16 * 14, 624 704 }, { 625 705 .id = 0x28, 626 706 .name = "eppu", 627 707 .swgroup = TEGRA_SWGROUP_EPP, 628 - .smmu = { 629 - .reg = 0x22c, 630 - .bit = 8, 631 - }, 632 - .la = { 633 - .reg = 0x300, 634 - .shift = 16, 635 - .mask = 0xff, 636 - .def = 0x6c, 708 + .regs = { 709 + .smmu = { 710 + .reg = 0x22c, 711 + .bit = 8, 712 + }, 713 + .la = { 714 + .reg = 0x300, 715 + .shift = 16, 716 + .mask = 0xff, 717 + .def = 0x6c, 718 + }, 637 719 }, 638 720 .fifo_size = 16 * 64, 639 721 }, { 640 722 .id = 0x29, 641 723 .name = "eppv", 642 724 .swgroup = TEGRA_SWGROUP_EPP, 643 - .smmu = { 644 - .reg = 0x22c, 645 - .bit = 9, 646 - }, 647 - .la = { 648 - .reg = 0x304, 649 - .shift = 0, 650 - .mask = 0xff, 651 - .def = 0x6c, 725 + .regs = { 726 + .smmu = { 727 + .reg = 0x22c, 728 + .bit = 9, 729 + }, 730 + .la = { 731 + .reg = 0x304, 732 + .shift = 0, 733 + .mask = 0xff, 734 + .def = 0x6c, 735 + }, 652 736 }, 653 737 .fifo_size = 16 * 64, 654 738 }, { 655 739 .id = 0x2a, 656 740 .name = "eppy", 657 741 .swgroup = TEGRA_SWGROUP_EPP, 658 - .smmu = { 659 - .reg = 0x22c, 660 - .bit = 10, 661 - }, 662 - .la = { 663 - .reg = 0x304, 664 - .shift = 16, 665 - .mask = 0xff, 666 - .def = 0x6c, 742 + .regs = { 743 + .smmu = { 744 + .reg = 0x22c, 745 + .bit = 10, 746 + }, 747 + .la = { 748 + .reg = 0x304, 749 + .shift = 16, 750 + .mask = 0xff, 751 + .def = 0x6c, 752 + }, 667 753 }, 668 754 .fifo_size = 16 * 64, 669 755 }, { 670 756 .id = 0x2b, 671 757 .name = "mpeunifbw", 672 758 .swgroup = TEGRA_SWGROUP_MPE, 673 - .smmu = { 674 - .reg = 0x22c, 675 - .bit = 11, 676 - }, 677 - .la = { 678 - .reg = 0x330, 679 - .shift = 0, 680 - .mask = 0xff, 681 - .def = 0x13, 759 + .regs = { 760 + .smmu = { 761 + .reg = 0x22c, 762 + .bit = 11, 763 + }, 764 + .la = { 765 + .reg = 0x330, 766 + .shift = 0, 767 + .mask = 0xff, 768 + .def = 0x13, 769 + }, 682 770 }, 683 771 .fifo_size = 16 * 8, 684 772 }, { 685 773 .id = 0x2c, 686 774 .name = "viwsb", 687 775 .swgroup = TEGRA_SWGROUP_VI, 688 - .smmu = { 689 - .reg = 0x22c, 690 - .bit = 12, 691 - }, 692 - .la = { 693 - .reg = 0x364, 694 - .shift = 16, 695 - .mask = 0xff, 696 - .def = 0x12, 776 + .regs = { 777 + .smmu = { 778 + .reg = 0x22c, 779 + .bit = 12, 780 + }, 781 + .la = { 782 + .reg = 0x364, 783 + .shift = 16, 784 + .mask = 0xff, 785 + .def = 0x12, 786 + }, 697 787 }, 698 788 .fifo_size = 16 * 64, 699 789 }, { 700 790 .id = 0x2d, 701 791 .name = "viwu", 702 792 .swgroup = TEGRA_SWGROUP_VI, 703 - .smmu = { 704 - .reg = 0x22c, 705 - .bit = 13, 706 - }, 707 - .la = { 708 - .reg = 0x368, 709 - .shift = 0, 710 - .mask = 0xff, 711 - .def = 0xb2, 793 + .regs = { 794 + .smmu = { 795 + .reg = 0x22c, 796 + .bit = 13, 797 + }, 798 + .la = { 799 + .reg = 0x368, 800 + .shift = 0, 801 + .mask = 0xff, 802 + .def = 0xb2, 803 + }, 712 804 }, 713 805 .fifo_size = 16 * 64, 714 806 }, { 715 807 .id = 0x2e, 716 808 .name = "viwv", 717 809 .swgroup = TEGRA_SWGROUP_VI, 718 - .smmu = { 719 - .reg = 0x22c, 720 - .bit = 14, 721 - }, 722 - .la = { 723 - .reg = 0x368, 724 - .shift = 16, 725 - .mask = 0xff, 726 - .def = 0xb2, 810 + .regs = { 811 + .smmu = { 812 + .reg = 0x22c, 813 + .bit = 14, 814 + }, 815 + .la = { 816 + .reg = 0x368, 817 + .shift = 16, 818 + .mask = 0xff, 819 + .def = 0xb2, 820 + }, 727 821 }, 728 822 .fifo_size = 16 * 64, 729 823 }, { 730 824 .id = 0x2f, 731 825 .name = "viwy", 732 826 .swgroup = TEGRA_SWGROUP_VI, 733 - .smmu = { 734 - .reg = 0x22c, 735 - .bit = 15, 736 - }, 737 - .la = { 738 - .reg = 0x36c, 739 - .shift = 0, 740 - .mask = 0xff, 741 - .def = 0x12, 827 + .regs = { 828 + .smmu = { 829 + .reg = 0x22c, 830 + .bit = 15, 831 + }, 832 + .la = { 833 + .reg = 0x36c, 834 + .shift = 0, 835 + .mask = 0xff, 836 + .def = 0x12, 837 + }, 742 838 }, 743 839 .fifo_size = 16 * 64, 744 840 }, { 745 841 .id = 0x30, 746 842 .name = "g2dw", 747 843 .swgroup = TEGRA_SWGROUP_G2, 748 - .smmu = { 749 - .reg = 0x22c, 750 - .bit = 16, 751 - }, 752 - .la = { 753 - .reg = 0x30c, 754 - .shift = 16, 755 - .mask = 0xff, 756 - .def = 0x9, 844 + .regs = { 845 + .smmu = { 846 + .reg = 0x22c, 847 + .bit = 16, 848 + }, 849 + .la = { 850 + .reg = 0x30c, 851 + .shift = 16, 852 + .mask = 0xff, 853 + .def = 0x9, 854 + }, 757 855 }, 758 856 .fifo_size = 16 * 128, 759 857 }, { 760 858 .id = 0x31, 761 859 .name = "afiw", 762 860 .swgroup = TEGRA_SWGROUP_AFI, 763 - .smmu = { 764 - .reg = 0x22c, 765 - .bit = 17, 766 - }, 767 - .la = { 768 - .reg = 0x2e0, 769 - .shift = 16, 770 - .mask = 0xff, 771 - .def = 0x0c, 861 + .regs = { 862 + .smmu = { 863 + .reg = 0x22c, 864 + .bit = 17, 865 + }, 866 + .la = { 867 + .reg = 0x2e0, 868 + .shift = 16, 869 + .mask = 0xff, 870 + .def = 0x0c, 871 + }, 772 872 }, 773 873 .fifo_size = 16 * 32, 774 874 }, { 775 875 .id = 0x32, 776 876 .name = "avpcarm7w", 777 877 .swgroup = TEGRA_SWGROUP_AVPC, 778 - .smmu = { 779 - .reg = 0x22c, 780 - .bit = 18, 781 - }, 782 - .la = { 783 - .reg = 0x2e4, 784 - .shift = 16, 785 - .mask = 0xff, 786 - .def = 0x0e, 878 + .regs = { 879 + .smmu = { 880 + .reg = 0x22c, 881 + .bit = 18, 882 + }, 883 + .la = { 884 + .reg = 0x2e4, 885 + .shift = 16, 886 + .mask = 0xff, 887 + .def = 0x0e, 888 + }, 787 889 }, 788 890 .fifo_size = 16 * 2, 789 891 }, { 790 892 .id = 0x33, 791 893 .name = "fdcdwr", 792 894 .swgroup = TEGRA_SWGROUP_NV, 793 - .smmu = { 794 - .reg = 0x22c, 795 - .bit = 19, 796 - }, 797 - .la = { 798 - .reg = 0x338, 799 - .shift = 16, 800 - .mask = 0xff, 801 - .def = 0x0a, 895 + .regs = { 896 + .smmu = { 897 + .reg = 0x22c, 898 + .bit = 19, 899 + }, 900 + .la = { 901 + .reg = 0x338, 902 + .shift = 16, 903 + .mask = 0xff, 904 + .def = 0x0a, 905 + }, 802 906 }, 803 907 .fifo_size = 16 * 48, 804 908 }, { 805 909 .id = 0x34, 806 910 .name = "fdcdwr2", 807 911 .swgroup = TEGRA_SWGROUP_NV2, 808 - .smmu = { 809 - .reg = 0x22c, 810 - .bit = 20, 811 - }, 812 - .la = { 813 - .reg = 0x340, 814 - .shift = 16, 815 - .mask = 0xff, 816 - .def = 0x0a, 912 + .regs = { 913 + .smmu = { 914 + .reg = 0x22c, 915 + .bit = 20, 916 + }, 917 + .la = { 918 + .reg = 0x340, 919 + .shift = 16, 920 + .mask = 0xff, 921 + .def = 0x0a, 922 + }, 817 923 }, 818 924 .fifo_size = 16 * 48, 819 925 }, { 820 926 .id = 0x35, 821 927 .name = "hdaw", 822 928 .swgroup = TEGRA_SWGROUP_HDA, 823 - .smmu = { 824 - .reg = 0x22c, 825 - .bit = 21, 826 - }, 827 - .la = { 828 - .reg = 0x318, 829 - .shift = 16, 830 - .mask = 0xff, 831 - .def = 0xff, 929 + .regs = { 930 + .smmu = { 931 + .reg = 0x22c, 932 + .bit = 21, 933 + }, 934 + .la = { 935 + .reg = 0x318, 936 + .shift = 16, 937 + .mask = 0xff, 938 + .def = 0xff, 939 + }, 832 940 }, 833 941 .fifo_size = 16 * 16, 834 942 }, { 835 943 .id = 0x36, 836 944 .name = "host1xw", 837 945 .swgroup = TEGRA_SWGROUP_HC, 838 - .smmu = { 839 - .reg = 0x22c, 840 - .bit = 22, 841 - }, 842 - .la = { 843 - .reg = 0x314, 844 - .shift = 0, 845 - .mask = 0xff, 846 - .def = 0x10, 946 + .regs = { 947 + .smmu = { 948 + .reg = 0x22c, 949 + .bit = 22, 950 + }, 951 + .la = { 952 + .reg = 0x314, 953 + .shift = 0, 954 + .mask = 0xff, 955 + .def = 0x10, 956 + }, 847 957 }, 848 958 .fifo_size = 16 * 32, 849 959 }, { 850 960 .id = 0x37, 851 961 .name = "ispw", 852 962 .swgroup = TEGRA_SWGROUP_ISP, 853 - .smmu = { 854 - .reg = 0x22c, 855 - .bit = 23, 856 - }, 857 - .la = { 858 - .reg = 0x31c, 859 - .shift = 0, 860 - .mask = 0xff, 861 - .def = 0xff, 963 + .regs = { 964 + .smmu = { 965 + .reg = 0x22c, 966 + .bit = 23, 967 + }, 968 + .la = { 969 + .reg = 0x31c, 970 + .shift = 0, 971 + .mask = 0xff, 972 + .def = 0xff, 973 + }, 862 974 }, 863 975 .fifo_size = 16 * 64, 864 976 }, { 865 977 .id = 0x38, 866 978 .name = "mpcorelpw", 867 979 .swgroup = TEGRA_SWGROUP_MPCORELP, 868 - .la = { 869 - .reg = 0x324, 870 - .shift = 16, 871 - .mask = 0xff, 872 - .def = 0x0e, 980 + .regs = { 981 + .la = { 982 + .reg = 0x324, 983 + .shift = 16, 984 + .mask = 0xff, 985 + .def = 0x0e, 986 + }, 873 987 }, 874 988 .fifo_size = 16 * 24, 875 989 }, { 876 990 .id = 0x39, 877 991 .name = "mpcorew", 878 992 .swgroup = TEGRA_SWGROUP_MPCORE, 879 - .la = { 880 - .reg = 0x320, 881 - .shift = 16, 882 - .mask = 0xff, 883 - .def = 0x0e, 993 + .regs = { 994 + .la = { 995 + .reg = 0x320, 996 + .shift = 16, 997 + .mask = 0xff, 998 + .def = 0x0e, 999 + }, 884 1000 }, 885 1001 .fifo_size = 16 * 24, 886 1002 }, { 887 1003 .id = 0x3a, 888 1004 .name = "mpecswr", 889 1005 .swgroup = TEGRA_SWGROUP_MPE, 890 - .smmu = { 891 - .reg = 0x22c, 892 - .bit = 26, 893 - }, 894 - .la = { 895 - .reg = 0x330, 896 - .shift = 16, 897 - .mask = 0xff, 898 - .def = 0xff, 1006 + .regs = { 1007 + .smmu = { 1008 + .reg = 0x22c, 1009 + .bit = 26, 1010 + }, 1011 + .la = { 1012 + .reg = 0x330, 1013 + .shift = 16, 1014 + .mask = 0xff, 1015 + .def = 0xff, 1016 + }, 899 1017 }, 900 1018 .fifo_size = 16 * 8, 901 1019 }, { 902 1020 .id = 0x3b, 903 1021 .name = "ppcsahbdmaw", 904 1022 .swgroup = TEGRA_SWGROUP_PPCS, 905 - .smmu = { 906 - .reg = 0x22c, 907 - .bit = 27, 908 - }, 909 - .la = { 910 - .reg = 0x348, 911 - .shift = 0, 912 - .mask = 0xff, 913 - .def = 0x10, 1023 + .regs = { 1024 + .smmu = { 1025 + .reg = 0x22c, 1026 + .bit = 27, 1027 + }, 1028 + .la = { 1029 + .reg = 0x348, 1030 + .shift = 0, 1031 + .mask = 0xff, 1032 + .def = 0x10, 1033 + }, 914 1034 }, 915 1035 .fifo_size = 16 * 2, 916 1036 }, { 917 1037 .id = 0x3c, 918 1038 .name = "ppcsahbslvw", 919 1039 .swgroup = TEGRA_SWGROUP_PPCS, 920 - .smmu = { 921 - .reg = 0x22c, 922 - .bit = 28, 923 - }, 924 - .la = { 925 - .reg = 0x348, 926 - .shift = 16, 927 - .mask = 0xff, 928 - .def = 0x06, 1040 + .regs = { 1041 + .smmu = { 1042 + .reg = 0x22c, 1043 + .bit = 28, 1044 + }, 1045 + .la = { 1046 + .reg = 0x348, 1047 + .shift = 16, 1048 + .mask = 0xff, 1049 + .def = 0x06, 1050 + }, 929 1051 }, 930 1052 .fifo_size = 16 * 4, 931 1053 }, { 932 1054 .id = 0x3d, 933 1055 .name = "sataw", 934 1056 .swgroup = TEGRA_SWGROUP_SATA, 935 - .smmu = { 936 - .reg = 0x22c, 937 - .bit = 29, 938 - }, 939 - .la = { 940 - .reg = 0x350, 941 - .shift = 16, 942 - .mask = 0xff, 943 - .def = 0x33, 1057 + .regs = { 1058 + .smmu = { 1059 + .reg = 0x22c, 1060 + .bit = 29, 1061 + }, 1062 + .la = { 1063 + .reg = 0x350, 1064 + .shift = 16, 1065 + .mask = 0xff, 1066 + .def = 0x33, 1067 + }, 944 1068 }, 945 1069 .fifo_size = 16 * 32, 946 1070 }, { 947 1071 .id = 0x3e, 948 1072 .name = "vdebsevw", 949 1073 .swgroup = TEGRA_SWGROUP_VDE, 950 - .smmu = { 951 - .reg = 0x22c, 952 - .bit = 30, 953 - }, 954 - .la = { 955 - .reg = 0x35c, 956 - .shift = 0, 957 - .mask = 0xff, 958 - .def = 0xff, 1074 + .regs = { 1075 + .smmu = { 1076 + .reg = 0x22c, 1077 + .bit = 30, 1078 + }, 1079 + .la = { 1080 + .reg = 0x35c, 1081 + .shift = 0, 1082 + .mask = 0xff, 1083 + .def = 0xff, 1084 + }, 959 1085 }, 960 1086 .fifo_size = 16 * 4, 961 1087 }, { 962 1088 .id = 0x3f, 963 1089 .name = "vdedbgw", 964 1090 .swgroup = TEGRA_SWGROUP_VDE, 965 - .smmu = { 966 - .reg = 0x22c, 967 - .bit = 31, 968 - }, 969 - .la = { 970 - .reg = 0x35c, 971 - .shift = 16, 972 - .mask = 0xff, 973 - .def = 0xff, 1091 + .regs = { 1092 + .smmu = { 1093 + .reg = 0x22c, 1094 + .bit = 31, 1095 + }, 1096 + .la = { 1097 + .reg = 0x35c, 1098 + .shift = 16, 1099 + .mask = 0xff, 1100 + .def = 0xff, 1101 + }, 974 1102 }, 975 1103 .fifo_size = 16 * 16, 976 1104 }, { 977 1105 .id = 0x40, 978 1106 .name = "vdembew", 979 1107 .swgroup = TEGRA_SWGROUP_VDE, 980 - .smmu = { 981 - .reg = 0x230, 982 - .bit = 0, 983 - }, 984 - .la = { 985 - .reg = 0x360, 986 - .shift = 0, 987 - .mask = 0xff, 988 - .def = 0x42, 1108 + .regs = { 1109 + .smmu = { 1110 + .reg = 0x230, 1111 + .bit = 0, 1112 + }, 1113 + .la = { 1114 + .reg = 0x360, 1115 + .shift = 0, 1116 + .mask = 0xff, 1117 + .def = 0x42, 1118 + }, 989 1119 }, 990 1120 .fifo_size = 16 * 2, 991 1121 }, { 992 1122 .id = 0x41, 993 1123 .name = "vdetpmw", 994 1124 .swgroup = TEGRA_SWGROUP_VDE, 995 - .smmu = { 996 - .reg = 0x230, 997 - .bit = 1, 998 - }, 999 - .la = { 1000 - .reg = 0x360, 1001 - .shift = 16, 1002 - .mask = 0xff, 1003 - .def = 0x2a, 1125 + .regs = { 1126 + .smmu = { 1127 + .reg = 0x230, 1128 + .bit = 1, 1129 + }, 1130 + .la = { 1131 + .reg = 0x360, 1132 + .shift = 16, 1133 + .mask = 0xff, 1134 + .def = 0x2a, 1135 + }, 1004 1136 }, 1005 1137 .fifo_size = 16 * 16, 1006 1138 }, ··· 1221 1089 unsigned int bandwidth_mbytes_sec) 1222 1090 { 1223 1091 u32 arb_tolerance_compensation_nsec, arb_tolerance_compensation_div; 1224 - const struct tegra_mc_la *la = &client->la; 1225 1092 unsigned int fifo_size = client->fifo_size; 1226 1093 u32 arb_nsec, la_ticks, value; 1227 1094 ··· 1280 1149 * request. 1281 1150 */ 1282 1151 la_ticks = arb_nsec / mc->tick; 1283 - la_ticks = min(la_ticks, la->mask); 1152 + la_ticks = min(la_ticks, client->regs.la.mask); 1284 1153 1285 - value = mc_readl(mc, la->reg); 1286 - value &= ~(la->mask << la->shift); 1287 - value |= la_ticks << la->shift; 1288 - mc_writel(mc, value, la->reg); 1154 + value = mc_readl(mc, client->regs.la.reg); 1155 + value &= ~(client->regs.la.mask << client->regs.la.shift); 1156 + value |= la_ticks << client->regs.la.shift; 1157 + mc_writel(mc, value, client->regs.la.reg); 1289 1158 } 1290 1159 1291 1160 static int tegra30_mc_icc_set(struct icc_node *src, struct icc_node *dst) ··· 1399 1268 .resets = tegra30_mc_resets, 1400 1269 .num_resets = ARRAY_SIZE(tegra30_mc_resets), 1401 1270 .icc_ops = &tegra30_mc_icc_ops, 1271 + .ops = &tegra30_mc_ops, 1402 1272 };
+23
drivers/regulator/core.c
··· 4105 4105 } 4106 4106 EXPORT_SYMBOL_GPL(regulator_set_voltage_time_sel); 4107 4107 4108 + int regulator_sync_voltage_rdev(struct regulator_dev *rdev) 4109 + { 4110 + int ret; 4111 + 4112 + regulator_lock(rdev); 4113 + 4114 + if (!rdev->desc->ops->set_voltage && 4115 + !rdev->desc->ops->set_voltage_sel) { 4116 + ret = -EINVAL; 4117 + goto out; 4118 + } 4119 + 4120 + /* balance only, if regulator is coupled */ 4121 + if (rdev->coupling_desc.n_coupled > 1) 4122 + ret = regulator_balance_voltage(rdev, PM_SUSPEND_ON); 4123 + else 4124 + ret = -EOPNOTSUPP; 4125 + 4126 + out: 4127 + regulator_unlock(rdev); 4128 + return ret; 4129 + } 4130 + 4108 4131 /** 4109 4132 * regulator_sync_voltage - re-apply last regulator output voltage 4110 4133 * @regulator: regulator source
+97
drivers/soc/tegra/common.c
··· 3 3 * Copyright (C) 2014 NVIDIA CORPORATION. All rights reserved. 4 4 */ 5 5 6 + #define dev_fmt(fmt) "tegra-soc: " fmt 7 + 8 + #include <linux/clk.h> 9 + #include <linux/device.h> 10 + #include <linux/export.h> 6 11 #include <linux/of.h> 12 + #include <linux/pm_opp.h> 7 13 8 14 #include <soc/tegra/common.h> 15 + #include <soc/tegra/fuse.h> 9 16 10 17 static const struct of_device_id tegra_machine_match[] = { 11 18 { .compatible = "nvidia,tegra20", }, ··· 38 31 39 32 return match != NULL; 40 33 } 34 + 35 + static int tegra_core_dev_init_opp_state(struct device *dev) 36 + { 37 + unsigned long rate; 38 + struct clk *clk; 39 + int err; 40 + 41 + clk = devm_clk_get(dev, NULL); 42 + if (IS_ERR(clk)) { 43 + dev_err(dev, "failed to get clk: %pe\n", clk); 44 + return PTR_ERR(clk); 45 + } 46 + 47 + rate = clk_get_rate(clk); 48 + if (!rate) { 49 + dev_err(dev, "failed to get clk rate\n"); 50 + return -EINVAL; 51 + } 52 + 53 + /* first dummy rate-setting initializes voltage vote */ 54 + err = dev_pm_opp_set_rate(dev, rate); 55 + if (err) { 56 + dev_err(dev, "failed to initialize OPP clock: %d\n", err); 57 + return err; 58 + } 59 + 60 + return 0; 61 + } 62 + 63 + /** 64 + * devm_tegra_core_dev_init_opp_table() - initialize OPP table 65 + * @dev: device for which OPP table is initialized 66 + * @params: pointer to the OPP table configuration 67 + * 68 + * This function will initialize OPP table and sync OPP state of a Tegra SoC 69 + * core device. 70 + * 71 + * Return: 0 on success or errorno. 72 + */ 73 + int devm_tegra_core_dev_init_opp_table(struct device *dev, 74 + struct tegra_core_opp_params *params) 75 + { 76 + u32 hw_version; 77 + int err; 78 + 79 + err = devm_pm_opp_set_clkname(dev, NULL); 80 + if (err) { 81 + dev_err(dev, "failed to set OPP clk: %d\n", err); 82 + return err; 83 + } 84 + 85 + /* Tegra114+ doesn't support OPP yet */ 86 + if (!of_machine_is_compatible("nvidia,tegra20") && 87 + !of_machine_is_compatible("nvidia,tegra30")) 88 + return -ENODEV; 89 + 90 + if (of_machine_is_compatible("nvidia,tegra20")) 91 + hw_version = BIT(tegra_sku_info.soc_process_id); 92 + else 93 + hw_version = BIT(tegra_sku_info.soc_speedo_id); 94 + 95 + err = devm_pm_opp_set_supported_hw(dev, &hw_version, 1); 96 + if (err) { 97 + dev_err(dev, "failed to set OPP supported HW: %d\n", err); 98 + return err; 99 + } 100 + 101 + /* 102 + * Older device-trees have an empty OPP table, we will get 103 + * -ENODEV from devm_pm_opp_of_add_table() in this case. 104 + */ 105 + err = devm_pm_opp_of_add_table(dev); 106 + if (err) { 107 + if (err == -ENODEV) 108 + dev_err_once(dev, "OPP table not found, please update device-tree\n"); 109 + else 110 + dev_err(dev, "failed to add OPP table: %d\n", err); 111 + 112 + return err; 113 + } 114 + 115 + if (params->init_state) { 116 + err = tegra_core_dev_init_opp_state(dev); 117 + if (err) 118 + return err; 119 + } 120 + 121 + return 0; 122 + } 123 + EXPORT_SYMBOL_GPL(devm_tegra_core_dev_init_opp_table);
-5
drivers/soc/tegra/pmc.c
··· 743 743 return err; 744 744 } 745 745 746 - int __weak tegra210_clk_handle_mbist_war(unsigned int id) 747 - { 748 - return 0; 749 - } 750 - 751 746 static int tegra_powergate_power_up(struct tegra_powergate *pg, 752 747 bool disable_clocks) 753 748 {
+74 -1
drivers/soc/tegra/regulators-tegra20.c
··· 12 12 #include <linux/init.h> 13 13 #include <linux/kernel.h> 14 14 #include <linux/of.h> 15 + #include <linux/reboot.h> 15 16 #include <linux/regulator/coupler.h> 16 17 #include <linux/regulator/driver.h> 17 18 #include <linux/regulator/machine.h> ··· 22 21 struct regulator_dev *core_rdev; 23 22 struct regulator_dev *cpu_rdev; 24 23 struct regulator_dev *rtc_rdev; 25 - int core_min_uV; 24 + struct notifier_block reboot_notifier; 25 + int core_min_uV, cpu_min_uV; 26 + bool sys_reboot_mode_req; 27 + bool sys_reboot_mode; 26 28 }; 27 29 28 30 static inline struct tegra_regulator_coupler * ··· 246 242 if (cpu_uV < 0) 247 243 return cpu_uV; 248 244 245 + /* store boot voltage level */ 246 + if (!tegra->cpu_min_uV) 247 + tegra->cpu_min_uV = cpu_uV; 248 + 249 249 /* 250 250 * CPU's regulator may not have any consumers, hence the voltage 251 251 * must not be changed in that case because CPU simply won't ··· 257 249 */ 258 250 if (!cpu_min_uV_consumers) 259 251 cpu_min_uV = cpu_uV; 252 + 253 + /* restore boot voltage level */ 254 + if (tegra->sys_reboot_mode) 255 + cpu_min_uV = max(cpu_min_uV, tegra->cpu_min_uV); 260 256 261 257 if (cpu_min_uV > cpu_uV) { 262 258 err = tegra20_core_rtc_update(tegra, core_rdev, rtc_rdev, ··· 302 290 return -EINVAL; 303 291 } 304 292 293 + tegra->sys_reboot_mode = READ_ONCE(tegra->sys_reboot_mode_req); 294 + 305 295 if (rdev == cpu_rdev) 306 296 return tegra20_cpu_voltage_update(tegra, cpu_rdev, 307 297 core_rdev, rtc_rdev); ··· 315 301 pr_err("changing %s voltage not permitted\n", rdev_get_name(rtc_rdev)); 316 302 317 303 return -EPERM; 304 + } 305 + 306 + static int tegra20_regulator_prepare_reboot(struct tegra_regulator_coupler *tegra, 307 + bool sys_reboot_mode) 308 + { 309 + int err; 310 + 311 + if (!tegra->core_rdev || !tegra->rtc_rdev || !tegra->cpu_rdev) 312 + return 0; 313 + 314 + WRITE_ONCE(tegra->sys_reboot_mode_req, true); 315 + 316 + /* 317 + * Some devices use CPU soft-reboot method and in this case we 318 + * should ensure that voltages are sane for the reboot by restoring 319 + * the minimum boot levels. 320 + */ 321 + err = regulator_sync_voltage_rdev(tegra->cpu_rdev); 322 + if (err) 323 + return err; 324 + 325 + err = regulator_sync_voltage_rdev(tegra->core_rdev); 326 + if (err) 327 + return err; 328 + 329 + WRITE_ONCE(tegra->sys_reboot_mode_req, sys_reboot_mode); 330 + 331 + return 0; 332 + } 333 + 334 + static int tegra20_regulator_reboot(struct notifier_block *notifier, 335 + unsigned long event, void *cmd) 336 + { 337 + struct tegra_regulator_coupler *tegra; 338 + int ret; 339 + 340 + if (event != SYS_RESTART) 341 + return NOTIFY_DONE; 342 + 343 + tegra = container_of(notifier, struct tegra_regulator_coupler, 344 + reboot_notifier); 345 + 346 + ret = tegra20_regulator_prepare_reboot(tegra, true); 347 + 348 + return notifier_from_errno(ret); 318 349 } 319 350 320 351 static int tegra20_regulator_attach(struct regulator_coupler *coupler, ··· 394 335 { 395 336 struct tegra_regulator_coupler *tegra = to_tegra_coupler(coupler); 396 337 338 + /* 339 + * We don't expect regulators to be decoupled during reboot, 340 + * this may race with the reboot handler and shouldn't ever 341 + * happen in practice. 342 + */ 343 + if (WARN_ON_ONCE(system_state > SYSTEM_RUNNING)) 344 + return -EPERM; 345 + 397 346 if (tegra->core_rdev == rdev) { 398 347 tegra->core_rdev = NULL; 399 348 return 0; ··· 426 359 .detach_regulator = tegra20_regulator_detach, 427 360 .balance_voltage = tegra20_regulator_balance_voltage, 428 361 }, 362 + .reboot_notifier.notifier_call = tegra20_regulator_reboot, 429 363 }; 430 364 431 365 static int __init tegra_regulator_coupler_init(void) 432 366 { 367 + int err; 368 + 433 369 if (!of_machine_is_compatible("nvidia,tegra20")) 434 370 return 0; 371 + 372 + err = register_reboot_notifier(&tegra20_coupler.reboot_notifier); 373 + WARN_ON(err); 435 374 436 375 return regulator_coupler_register(&tegra20_coupler.coupler); 437 376 }
+74 -1
drivers/soc/tegra/regulators-tegra30.c
··· 12 12 #include <linux/init.h> 13 13 #include <linux/kernel.h> 14 14 #include <linux/of.h> 15 + #include <linux/reboot.h> 15 16 #include <linux/regulator/coupler.h> 16 17 #include <linux/regulator/driver.h> 17 18 #include <linux/regulator/machine.h> ··· 23 22 struct regulator_coupler coupler; 24 23 struct regulator_dev *core_rdev; 25 24 struct regulator_dev *cpu_rdev; 26 - int core_min_uV; 25 + struct notifier_block reboot_notifier; 26 + int core_min_uV, cpu_min_uV; 27 + bool sys_reboot_mode_req; 28 + bool sys_reboot_mode; 27 29 }; 28 30 29 31 static inline struct tegra_regulator_coupler * ··· 176 172 if (cpu_uV < 0) 177 173 return cpu_uV; 178 174 175 + /* store boot voltage level */ 176 + if (!tegra->cpu_min_uV) 177 + tegra->cpu_min_uV = cpu_uV; 178 + 179 179 /* 180 180 * CPU's regulator may not have any consumers, hence the voltage 181 181 * must not be changed in that case because CPU simply won't ··· 202 194 err = regulator_check_voltage(core_rdev, &core_min_uV, &core_max_uV); 203 195 if (err) 204 196 return err; 197 + 198 + /* restore boot voltage level */ 199 + if (tegra->sys_reboot_mode) 200 + cpu_min_uV = max(cpu_min_uV, tegra->cpu_min_uV); 205 201 206 202 if (core_min_limited_uV > core_uV) { 207 203 pr_err("core voltage constraint violated: %d %d %d\n", ··· 275 263 return -EINVAL; 276 264 } 277 265 266 + tegra->sys_reboot_mode = READ_ONCE(tegra->sys_reboot_mode_req); 267 + 278 268 return tegra30_voltage_update(tegra, cpu_rdev, core_rdev); 269 + } 270 + 271 + static int tegra30_regulator_prepare_reboot(struct tegra_regulator_coupler *tegra, 272 + bool sys_reboot_mode) 273 + { 274 + int err; 275 + 276 + if (!tegra->core_rdev || !tegra->cpu_rdev) 277 + return 0; 278 + 279 + WRITE_ONCE(tegra->sys_reboot_mode_req, true); 280 + 281 + /* 282 + * Some devices use CPU soft-reboot method and in this case we 283 + * should ensure that voltages are sane for the reboot by restoring 284 + * the minimum boot levels. 285 + */ 286 + err = regulator_sync_voltage_rdev(tegra->cpu_rdev); 287 + if (err) 288 + return err; 289 + 290 + err = regulator_sync_voltage_rdev(tegra->core_rdev); 291 + if (err) 292 + return err; 293 + 294 + WRITE_ONCE(tegra->sys_reboot_mode_req, sys_reboot_mode); 295 + 296 + return 0; 297 + } 298 + 299 + static int tegra30_regulator_reboot(struct notifier_block *notifier, 300 + unsigned long event, void *cmd) 301 + { 302 + struct tegra_regulator_coupler *tegra; 303 + int ret; 304 + 305 + if (event != SYS_RESTART) 306 + return NOTIFY_DONE; 307 + 308 + tegra = container_of(notifier, struct tegra_regulator_coupler, 309 + reboot_notifier); 310 + 311 + ret = tegra30_regulator_prepare_reboot(tegra, true); 312 + 313 + return notifier_from_errno(ret); 279 314 } 280 315 281 316 static int tegra30_regulator_attach(struct regulator_coupler *coupler, ··· 351 292 { 352 293 struct tegra_regulator_coupler *tegra = to_tegra_coupler(coupler); 353 294 295 + /* 296 + * We don't expect regulators to be decoupled during reboot, 297 + * this may race with the reboot handler and shouldn't ever 298 + * happen in practice. 299 + */ 300 + if (WARN_ON_ONCE(system_state > SYSTEM_RUNNING)) 301 + return -EPERM; 302 + 354 303 if (tegra->core_rdev == rdev) { 355 304 tegra->core_rdev = NULL; 356 305 return 0; ··· 378 311 .detach_regulator = tegra30_regulator_detach, 379 312 .balance_voltage = tegra30_regulator_balance_voltage, 380 313 }, 314 + .reboot_notifier.notifier_call = tegra30_regulator_reboot, 381 315 }; 382 316 383 317 static int __init tegra_regulator_coupler_init(void) 384 318 { 319 + int err; 320 + 385 321 if (!of_machine_is_compatible("nvidia,tegra30")) 386 322 return 0; 323 + 324 + err = register_reboot_notifier(&tegra30_coupler.reboot_notifier); 325 + WARN_ON(err); 387 326 388 327 return regulator_coupler_register(&tegra30_coupler.coupler); 389 328 }
+79 -21
include/linux/clk/tegra.h
··· 123 123 } 124 124 #endif 125 125 126 - extern int tegra210_plle_hw_sequence_start(void); 127 - extern bool tegra210_plle_hw_sequence_is_enabled(void); 128 - extern void tegra210_xusb_pll_hw_control_enable(void); 129 - extern void tegra210_xusb_pll_hw_sequence_start(void); 130 - extern void tegra210_sata_pll_hw_control_enable(void); 131 - extern void tegra210_sata_pll_hw_sequence_start(void); 132 - extern void tegra210_set_sata_pll_seq_sw(bool state); 133 - extern void tegra210_put_utmipll_in_iddq(void); 134 - extern void tegra210_put_utmipll_out_iddq(void); 135 - extern int tegra210_clk_handle_mbist_war(unsigned int id); 136 - extern void tegra210_clk_emc_dll_enable(bool flag); 137 - extern void tegra210_clk_emc_dll_update_setting(u32 emc_dll_src_value); 138 - extern void tegra210_clk_emc_update_setting(u32 emc_src_value); 139 - 140 126 struct clk; 141 127 struct tegra_emc; 142 128 ··· 130 144 unsigned long min_rate, 131 145 unsigned long max_rate, 132 146 void *arg); 133 - 134 - void tegra20_clk_set_emc_round_callback(tegra20_clk_emc_round_cb *round_cb, 135 - void *cb_arg); 136 - int tegra20_clk_prepare_emc_mc_same_freq(struct clk *emc_clk, bool same); 137 - 138 147 typedef int (tegra124_emc_prepare_timing_change_cb)(struct tegra_emc *emc, 139 148 unsigned long rate); 140 149 typedef void (tegra124_emc_complete_timing_change_cb)(struct tegra_emc *emc, 141 150 unsigned long rate); 142 - void tegra124_clk_set_emc_callbacks(tegra124_emc_prepare_timing_change_cb *prep_cb, 143 - tegra124_emc_complete_timing_change_cb *complete_cb); 144 151 145 152 struct tegra210_clk_emc_config { 146 153 unsigned long rate; ··· 155 176 const struct tegra210_clk_emc_config *config); 156 177 }; 157 178 179 + #if defined(CONFIG_ARCH_TEGRA_2x_SOC) || defined(CONFIG_ARCH_TEGRA_3x_SOC) 180 + void tegra20_clk_set_emc_round_callback(tegra20_clk_emc_round_cb *round_cb, 181 + void *cb_arg); 182 + int tegra20_clk_prepare_emc_mc_same_freq(struct clk *emc_clk, bool same); 183 + #else 184 + static inline void 185 + tegra20_clk_set_emc_round_callback(tegra20_clk_emc_round_cb *round_cb, 186 + void *cb_arg) 187 + { 188 + } 189 + 190 + static inline int 191 + tegra20_clk_prepare_emc_mc_same_freq(struct clk *emc_clk, bool same) 192 + { 193 + return 0; 194 + } 195 + #endif 196 + 197 + #ifdef CONFIG_TEGRA124_CLK_EMC 198 + void tegra124_clk_set_emc_callbacks(tegra124_emc_prepare_timing_change_cb *prep_cb, 199 + tegra124_emc_complete_timing_change_cb *complete_cb); 200 + #else 201 + static inline void 202 + tegra124_clk_set_emc_callbacks(tegra124_emc_prepare_timing_change_cb *prep_cb, 203 + tegra124_emc_complete_timing_change_cb *complete_cb) 204 + { 205 + } 206 + #endif 207 + 208 + #ifdef CONFIG_ARCH_TEGRA_210_SOC 209 + int tegra210_plle_hw_sequence_start(void); 210 + bool tegra210_plle_hw_sequence_is_enabled(void); 211 + void tegra210_xusb_pll_hw_control_enable(void); 212 + void tegra210_xusb_pll_hw_sequence_start(void); 213 + void tegra210_sata_pll_hw_control_enable(void); 214 + void tegra210_sata_pll_hw_sequence_start(void); 215 + void tegra210_set_sata_pll_seq_sw(bool state); 216 + void tegra210_put_utmipll_in_iddq(void); 217 + void tegra210_put_utmipll_out_iddq(void); 218 + int tegra210_clk_handle_mbist_war(unsigned int id); 219 + void tegra210_clk_emc_dll_enable(bool flag); 220 + void tegra210_clk_emc_dll_update_setting(u32 emc_dll_src_value); 221 + void tegra210_clk_emc_update_setting(u32 emc_src_value); 222 + 158 223 int tegra210_clk_emc_attach(struct clk *clk, 159 224 struct tegra210_clk_emc_provider *provider); 160 225 void tegra210_clk_emc_detach(struct clk *clk); 226 + #else 227 + static inline int tegra210_plle_hw_sequence_start(void) 228 + { 229 + return 0; 230 + } 231 + 232 + static inline bool tegra210_plle_hw_sequence_is_enabled(void) 233 + { 234 + return false; 235 + } 236 + 237 + static inline int tegra210_clk_handle_mbist_war(unsigned int id) 238 + { 239 + return 0; 240 + } 241 + 242 + static inline int 243 + tegra210_clk_emc_attach(struct clk *clk, 244 + struct tegra210_clk_emc_provider *provider) 245 + { 246 + return 0; 247 + } 248 + 249 + static inline void tegra210_xusb_pll_hw_control_enable(void) {} 250 + static inline void tegra210_xusb_pll_hw_sequence_start(void) {} 251 + static inline void tegra210_sata_pll_hw_control_enable(void) {} 252 + static inline void tegra210_sata_pll_hw_sequence_start(void) {} 253 + static inline void tegra210_set_sata_pll_seq_sw(bool state) {} 254 + static inline void tegra210_put_utmipll_in_iddq(void) {} 255 + static inline void tegra210_put_utmipll_out_iddq(void) {} 256 + static inline void tegra210_clk_emc_dll_enable(bool flag) {} 257 + static inline void tegra210_clk_emc_dll_update_setting(u32 emc_dll_src_value) {} 258 + static inline void tegra210_clk_emc_update_setting(u32 emc_src_value) {} 259 + static inline void tegra210_clk_emc_detach(struct clk *clk) {} 260 + #endif 161 261 162 262 #endif /* __LINUX_CLK_TEGRA_H_ */
+1
include/linux/regulator/driver.h
··· 540 540 int regulator_get_current_limit_regmap(struct regulator_dev *rdev); 541 541 void *regulator_get_init_drvdata(struct regulator_init_data *reg_init_data); 542 542 int regulator_set_ramp_delay_regmap(struct regulator_dev *rdev, int ramp_delay); 543 + int regulator_sync_voltage_rdev(struct regulator_dev *rdev); 543 544 544 545 /* 545 546 * Helper functions intended to be used by regulator drivers prior registering
+31
include/soc/tegra/common.h
··· 6 6 #ifndef __SOC_TEGRA_COMMON_H__ 7 7 #define __SOC_TEGRA_COMMON_H__ 8 8 9 + #include <linux/errno.h> 10 + #include <linux/types.h> 11 + 12 + struct device; 13 + 14 + /** 15 + * Tegra SoC core device OPP table configuration 16 + * 17 + * @init_state: pre-initialize OPP state of a device 18 + */ 19 + struct tegra_core_opp_params { 20 + bool init_state; 21 + }; 22 + 23 + #ifdef CONFIG_ARCH_TEGRA 9 24 bool soc_is_tegra(void); 25 + 26 + int devm_tegra_core_dev_init_opp_table(struct device *dev, 27 + struct tegra_core_opp_params *params); 28 + #else 29 + static inline bool soc_is_tegra(void) 30 + { 31 + return false; 32 + } 33 + 34 + static inline int 35 + devm_tegra_core_dev_init_opp_table(struct device *dev, 36 + struct tegra_core_opp_params *params) 37 + { 38 + return -ENODEV; 39 + } 40 + #endif 10 41 11 42 #endif /* __SOC_TEGRA_COMMON_H__ */
+17 -3
include/soc/tegra/fuse.h
··· 52 52 enum tegra_revision revision; 53 53 }; 54 54 55 + #ifdef CONFIG_ARCH_TEGRA 56 + extern struct tegra_sku_info tegra_sku_info; 55 57 u32 tegra_read_straps(void); 56 58 u32 tegra_read_ram_code(void); 57 59 int tegra_fuse_readl(unsigned long offset, u32 *value); 58 - 59 - #ifdef CONFIG_ARCH_TEGRA 60 - extern struct tegra_sku_info tegra_sku_info; 61 60 #else 62 61 static struct tegra_sku_info tegra_sku_info __maybe_unused; 62 + 63 + static inline u32 tegra_read_straps(void) 64 + { 65 + return 0; 66 + } 67 + 68 + static inline u32 tegra_read_ram_code(void) 69 + { 70 + return 0; 71 + } 72 + 73 + static inline int tegra_fuse_readl(unsigned long offset, u32 *value) 74 + { 75 + return -ENODEV; 76 + } 63 77 #endif 64 78 65 79 struct device *tegra_soc_device_register(void);
+47 -18
include/soc/tegra/mc.h
··· 10 10 #include <linux/debugfs.h> 11 11 #include <linux/err.h> 12 12 #include <linux/interconnect-provider.h> 13 + #include <linux/irq.h> 13 14 #include <linux/reset-controller.h> 14 15 #include <linux/types.h> 15 16 ··· 18 17 struct device; 19 18 struct page; 20 19 21 - struct tegra_smmu_enable { 22 - unsigned int reg; 23 - unsigned int bit; 24 - }; 25 - 26 20 struct tegra_mc_timing { 27 21 unsigned long rate; 28 22 29 23 u32 *emem_data; 30 24 }; 31 25 32 - /* latency allowance */ 33 - struct tegra_mc_la { 34 - unsigned int reg; 35 - unsigned int shift; 36 - unsigned int mask; 37 - unsigned int def; 38 - }; 39 - 40 26 struct tegra_mc_client { 41 27 unsigned int id; 42 28 const char *name; 43 - unsigned int swgroup; 29 + /* 30 + * For Tegra210 and earlier, this is the SWGROUP ID used for IOVA translations in the 31 + * Tegra SMMU, whereas on Tegra186 and later this is the ID used to override the ARM SMMU 32 + * stream ID used for IOVA translations for the given memory client. 33 + */ 34 + union { 35 + unsigned int swgroup; 36 + unsigned int sid; 37 + }; 44 38 45 39 unsigned int fifo_size; 46 40 47 - struct tegra_smmu_enable smmu; 48 - struct tegra_mc_la la; 41 + struct { 42 + /* Tegra SMMU enable (Tegra210 and earlier) */ 43 + struct { 44 + unsigned int reg; 45 + unsigned int bit; 46 + } smmu; 47 + 48 + /* latency allowance */ 49 + struct { 50 + unsigned int reg; 51 + unsigned int shift; 52 + unsigned int mask; 53 + unsigned int def; 54 + } la; 55 + 56 + /* stream ID overrides (Tegra186 and later) */ 57 + struct { 58 + unsigned int override; 59 + unsigned int security; 60 + } sid; 61 + } regs; 49 62 }; 50 63 51 64 struct tegra_smmu_swgroup { ··· 170 155 void *data); 171 156 }; 172 157 158 + struct tegra_mc_ops { 159 + /* 160 + * @probe: Callback to set up SoC-specific bits of the memory controller. This is called 161 + * after basic, common set up that is done by the SoC-agnostic bits. 162 + */ 163 + int (*probe)(struct tegra_mc *mc); 164 + void (*remove)(struct tegra_mc *mc); 165 + int (*suspend)(struct tegra_mc *mc); 166 + int (*resume)(struct tegra_mc *mc); 167 + irqreturn_t (*handle_irq)(int irq, void *data); 168 + int (*probe_device)(struct tegra_mc *mc, struct device *dev); 169 + }; 170 + 173 171 struct tegra_mc_soc { 174 172 const struct tegra_mc_client *clients; 175 173 unsigned int num_clients; ··· 204 176 unsigned int num_resets; 205 177 206 178 const struct tegra_mc_icc_ops *icc_ops; 207 - 208 - int (*init)(struct tegra_mc *mc); 179 + const struct tegra_mc_ops *ops; 209 180 }; 210 181 211 182 struct tegra_mc { ··· 244 217 return ERR_PTR(-ENODEV); 245 218 } 246 219 #endif 220 + 221 + int tegra_mc_probe_device(struct tegra_mc *mc, struct device *dev); 247 222 248 223 #endif /* __SOC_TEGRA_MC_H__ */