mirror of https://gitee.com/openkylin/linux.git
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. -----BEGIN PGP SIGNATURE----- iQJEBAABCgAuFiEE3dJiKD0RGyM7briowTdm5oaLg9cFAmDHsjAQHGtyemtAa2Vy bmVsLm9yZwAKCRDBN2bmhouD14vID/9let7+Nk2rX8g3RcHbCCcTYaDnsfG1Jthw eq2BPBJstRB4IxL4AyoVGZmha7boDpOts95sJPLiETA5OMzYPFk2YhVm+yVnN6d0 Wo9j/XFRMH8RyfSDZdIJQZ4q3dUgVt+6dCDonuk+lSLEYpo39lPBMoKxZVGIoiGK /qd1nFBhxUWWqJsZDUaxuSK75mCK1dWzwxUqT4SQ7ww0HKy7zJXLskQj4vKT6fbt BS+wzlQqjt72VvYGcU0ARv4/7nF3rENLG/1va9khbvImgUHJ8FJMllBPdi/rj4Gk diwoPpbDBeAv2NsXGwqribVtcUNZiBXNh1GOIea26WdtYHpA2ZC10uZC+TK6vwi5 62sUu7MdFJ5Wrrbo+Pzl8iCrvUVXoXAA9fRorYDamfkTh+vuVNEN4/8Frkt2bWe6 ScLgqWWG7jEiwxOAcmLq4jhcMpVyTXOyQ6U0Gk9VHeGWA+WkubcyBoEripiEFLY3 25oMVXVw+xbGSEameDkosaxyVvbshKnxw8RnBEZ4IG18Xp3xJYBqG1w4iSIWowv3 pN4hUF57+KrDrBDBjWm7sWeXPhZ7ibW/EXVTvp0hqsigFriupRnaO8sPAyaTuTrL 4rMhCO+JoHvIWUtDzpLutLG6ZTXdr1PRcEZDooZGaUKuABbGIiPNtU0Phj96rcdf rD8dZEyjoQ== =qHnq -----END PGP SIGNATURE----- gpgsig -----BEGIN PGP SIGNATURE----- iQJDBAABCgAtFiEElf+HevZ4QCAJmMQ+jBrnPN6EHHcFAmDKmQ4PHG9sb2ZAbGl4 b20ubmV0AAoJEIwa5zzehBx3io8P/i/rcOnipS5JPscHsPsgnAW+P1VbCoHBKdp9 KZTPQXbtE47pUrYk7bYgiWJ5uWzY8toRUyYjgXZmwWWOzM8PpP/aadXSTSD8oEZ7 t9mva3NTtnfT8LX4sjYxmY9P4vIzPMM7KqsT8JkEiTMamVFDLbx+KAUSv0T+ykmY iSe4o6QKN/2ErHLK9PrIjVFTD9zPA8uAjKvnUxBAZHp+8FoX0W5mwT1D7GNhj792 Zsi7VodViw0xz+DuYNJQ7wQs7O3QrJnEQplXaLBJhxb08i8o7gEjLwX7WVXpW5wx y3P3XrELAZk3MxAgMFVNjpKdf4vVe4z4oFjr8a9hbUkJpTFIwiLqgu8tQaV83gjh xzfWuNf5BKaSic/VGuj+pYS9Y7TFjqNsVp7ziXmpS8KFGh3FzyjVWsUaewwD/H47 pVldVHRvhXp77p+H6R8Uo3Jr2oBQflynHP4r7LB9mAZ2gBuygW8XczgL+q7Z/WZt yZrtPAY+fYFQ6P+Xk8scb7tzFYYu1XXs/FFB0BCEAABhB8vde3aQ3nt2kLB26pfM /nzP9oAngZxnN3EdKutH5U9D/WRTOL2ujrPF+8gNekEo0phM852r1AoDJ899kX3L sngdqvnXbMI5LNaFq1F14RX8jGU6bxf2trVlvKg+siD4YBsLrxw03vni5a9k5n8H LfEUaejs =pB39 -----END PGP SIGNATURE----- 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>
This commit is contained in:
commit
1eb5f83ee9
|
@ -54,8 +54,14 @@ properties:
|
|||
- const: arm,mmu-500
|
||||
- description: NVIDIA SoCs that program two ARM MMU-500s identically
|
||||
items:
|
||||
- description: NVIDIA SoCs that require memory controller interaction
|
||||
and may program multiple ARM MMU-500s identically with the memory
|
||||
controller interleaving translations between multiple instances
|
||||
for improved performance.
|
||||
items:
|
||||
- enum:
|
||||
- nvidia,tegra194-smmu
|
||||
- const: nvidia,tegra194-smmu
|
||||
- const: nvidia,tegra186-smmu
|
||||
- const: nvidia,smmu-500
|
||||
- items:
|
||||
- const: arm,mmu-500
|
||||
|
@ -165,10 +171,11 @@ allOf:
|
|||
contains:
|
||||
enum:
|
||||
- nvidia,tegra194-smmu
|
||||
- nvidia,tegra186-smmu
|
||||
then:
|
||||
properties:
|
||||
reg:
|
||||
minItems: 2
|
||||
minItems: 1
|
||||
maxItems: 2
|
||||
else:
|
||||
properties:
|
||||
|
|
|
@ -48,36 +48,45 @@ static int clk_periph_is_enabled(struct clk_hw *hw)
|
|||
return state;
|
||||
}
|
||||
|
||||
static int clk_periph_enable(struct clk_hw *hw)
|
||||
static void clk_periph_enable_locked(struct clk_hw *hw)
|
||||
{
|
||||
struct tegra_clk_periph_gate *gate = to_clk_periph_gate(hw);
|
||||
unsigned long flags = 0;
|
||||
|
||||
spin_lock_irqsave(&periph_ref_lock, flags);
|
||||
|
||||
gate->enable_refcnt[gate->clk_num]++;
|
||||
if (gate->enable_refcnt[gate->clk_num] > 1) {
|
||||
spin_unlock_irqrestore(&periph_ref_lock, flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
write_enb_set(periph_clk_to_bit(gate), gate);
|
||||
udelay(2);
|
||||
|
||||
if (!(gate->flags & TEGRA_PERIPH_NO_RESET) &&
|
||||
!(gate->flags & TEGRA_PERIPH_MANUAL_RESET)) {
|
||||
if (read_rst(gate) & periph_clk_to_bit(gate)) {
|
||||
udelay(5); /* reset propogation delay */
|
||||
write_rst_clr(periph_clk_to_bit(gate), gate);
|
||||
}
|
||||
}
|
||||
|
||||
if (gate->flags & TEGRA_PERIPH_WAR_1005168) {
|
||||
writel_relaxed(0, gate->clk_base + LVL2_CLK_GATE_OVRE);
|
||||
writel_relaxed(BIT(22), gate->clk_base + LVL2_CLK_GATE_OVRE);
|
||||
udelay(1);
|
||||
writel_relaxed(0, gate->clk_base + LVL2_CLK_GATE_OVRE);
|
||||
}
|
||||
}
|
||||
|
||||
static void clk_periph_disable_locked(struct clk_hw *hw)
|
||||
{
|
||||
struct tegra_clk_periph_gate *gate = to_clk_periph_gate(hw);
|
||||
|
||||
/*
|
||||
* If peripheral is in the APB bus then read the APB bus to
|
||||
* flush the write operation in apb bus. This will avoid the
|
||||
* peripheral access after disabling clock
|
||||
*/
|
||||
if (gate->flags & TEGRA_PERIPH_ON_APB)
|
||||
tegra_read_chipid();
|
||||
|
||||
write_enb_clr(periph_clk_to_bit(gate), gate);
|
||||
}
|
||||
|
||||
static int clk_periph_enable(struct clk_hw *hw)
|
||||
{
|
||||
struct tegra_clk_periph_gate *gate = to_clk_periph_gate(hw);
|
||||
unsigned long flags = 0;
|
||||
|
||||
spin_lock_irqsave(&periph_ref_lock, flags);
|
||||
|
||||
if (!gate->enable_refcnt[gate->clk_num]++)
|
||||
clk_periph_enable_locked(hw);
|
||||
|
||||
spin_unlock_irqrestore(&periph_ref_lock, flags);
|
||||
|
||||
|
@ -91,21 +100,28 @@ static void clk_periph_disable(struct clk_hw *hw)
|
|||
|
||||
spin_lock_irqsave(&periph_ref_lock, flags);
|
||||
|
||||
gate->enable_refcnt[gate->clk_num]--;
|
||||
if (gate->enable_refcnt[gate->clk_num] > 0) {
|
||||
WARN_ON(!gate->enable_refcnt[gate->clk_num]);
|
||||
|
||||
if (--gate->enable_refcnt[gate->clk_num] == 0)
|
||||
clk_periph_disable_locked(hw);
|
||||
|
||||
spin_unlock_irqrestore(&periph_ref_lock, flags);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* If peripheral is in the APB bus then read the APB bus to
|
||||
* flush the write operation in apb bus. This will avoid the
|
||||
* peripheral access after disabling clock
|
||||
*/
|
||||
if (gate->flags & TEGRA_PERIPH_ON_APB)
|
||||
tegra_read_chipid();
|
||||
static void clk_periph_disable_unused(struct clk_hw *hw)
|
||||
{
|
||||
struct tegra_clk_periph_gate *gate = to_clk_periph_gate(hw);
|
||||
unsigned long flags = 0;
|
||||
|
||||
write_enb_clr(periph_clk_to_bit(gate), gate);
|
||||
spin_lock_irqsave(&periph_ref_lock, flags);
|
||||
|
||||
/*
|
||||
* Some clocks are duplicated and some of them are marked as critical,
|
||||
* like fuse and fuse_burn for example, thus the enable_refcnt will
|
||||
* be non-zero here if the "unused" duplicate is disabled by CCF.
|
||||
*/
|
||||
if (!gate->enable_refcnt[gate->clk_num])
|
||||
clk_periph_disable_locked(hw);
|
||||
|
||||
spin_unlock_irqrestore(&periph_ref_lock, flags);
|
||||
}
|
||||
|
@ -114,6 +130,7 @@ const struct clk_ops tegra_clk_periph_gate_ops = {
|
|||
.is_enabled = clk_periph_is_enabled,
|
||||
.enable = clk_periph_enable,
|
||||
.disable = clk_periph_disable,
|
||||
.disable_unused = clk_periph_disable_unused,
|
||||
};
|
||||
|
||||
struct clk *tegra_clk_register_periph_gate(const char *name,
|
||||
|
@ -148,9 +165,6 @@ struct clk *tegra_clk_register_periph_gate(const char *name,
|
|||
gate->enable_refcnt = enable_refcnt;
|
||||
gate->regs = pregs;
|
||||
|
||||
if (read_enb(gate) & periph_clk_to_bit(gate))
|
||||
enable_refcnt[clk_num]++;
|
||||
|
||||
/* Data in .init is copied by clk_register(), so stack variable OK */
|
||||
gate->hw.init = &init;
|
||||
|
||||
|
|
|
@ -100,6 +100,15 @@ static void clk_periph_disable(struct clk_hw *hw)
|
|||
gate_ops->disable(gate_hw);
|
||||
}
|
||||
|
||||
static void clk_periph_disable_unused(struct clk_hw *hw)
|
||||
{
|
||||
struct tegra_clk_periph *periph = to_clk_periph(hw);
|
||||
const struct clk_ops *gate_ops = periph->gate_ops;
|
||||
struct clk_hw *gate_hw = &periph->gate.hw;
|
||||
|
||||
gate_ops->disable_unused(gate_hw);
|
||||
}
|
||||
|
||||
static void clk_periph_restore_context(struct clk_hw *hw)
|
||||
{
|
||||
struct tegra_clk_periph *periph = to_clk_periph(hw);
|
||||
|
@ -126,6 +135,7 @@ const struct clk_ops tegra_clk_periph_ops = {
|
|||
.is_enabled = clk_periph_is_enabled,
|
||||
.enable = clk_periph_enable,
|
||||
.disable = clk_periph_disable,
|
||||
.disable_unused = clk_periph_disable_unused,
|
||||
.restore_context = clk_periph_restore_context,
|
||||
};
|
||||
|
||||
|
@ -135,6 +145,7 @@ static const struct clk_ops tegra_clk_periph_nodiv_ops = {
|
|||
.is_enabled = clk_periph_is_enabled,
|
||||
.enable = clk_periph_enable,
|
||||
.disable = clk_periph_disable,
|
||||
.disable_unused = clk_periph_disable_unused,
|
||||
.restore_context = clk_periph_restore_context,
|
||||
};
|
||||
|
||||
|
|
|
@ -558,6 +558,9 @@ static int _calc_rate(struct clk_hw *hw, struct tegra_clk_pll_freq_table *cfg,
|
|||
u32 p_div = 0;
|
||||
int ret;
|
||||
|
||||
if (!rate)
|
||||
return -EINVAL;
|
||||
|
||||
switch (parent_rate) {
|
||||
case 12000000:
|
||||
case 26000000:
|
||||
|
@ -1131,6 +1134,7 @@ static int clk_pllu_enable(struct clk_hw *hw)
|
|||
if (pll->lock)
|
||||
spin_lock_irqsave(pll->lock, flags);
|
||||
|
||||
if (!clk_pll_is_enabled(hw))
|
||||
_clk_pll_enable(hw);
|
||||
|
||||
ret = clk_pll_wait_for_lock(pll);
|
||||
|
@ -1748,14 +1752,12 @@ static int clk_pllu_tegra114_enable(struct clk_hw *hw)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (clk_pll_is_enabled(hw))
|
||||
return 0;
|
||||
|
||||
input_rate = clk_hw_get_rate(__clk_get_hw(osc));
|
||||
|
||||
if (pll->lock)
|
||||
spin_lock_irqsave(pll->lock, flags);
|
||||
|
||||
if (!clk_pll_is_enabled(hw))
|
||||
_clk_pll_enable(hw);
|
||||
|
||||
ret = clk_pll_wait_for_lock(pll);
|
||||
|
|
|
@ -712,9 +712,9 @@ static struct tegra_periph_init_data periph_clks[] = {
|
|||
MUX8("ndflash", mux_pllp_pllc2_c_c3_pllm_clkm, CLK_SOURCE_NDFLASH, 13, TEGRA_PERIPH_ON_APB, tegra_clk_ndflash_8),
|
||||
MUX8("ndspeed", mux_pllp_pllc2_c_c3_pllm_clkm, CLK_SOURCE_NDSPEED, 80, TEGRA_PERIPH_ON_APB, tegra_clk_ndspeed_8),
|
||||
MUX8("hdmi", mux_pllp_pllm_plld_plla_pllc_plld2_clkm, CLK_SOURCE_HDMI, 51, 0, tegra_clk_hdmi),
|
||||
MUX8("extern1", mux_plla_clk32_pllp_clkm_plle, CLK_SOURCE_EXTERN1, 120, 0, tegra_clk_extern1),
|
||||
MUX8("extern2", mux_plla_clk32_pllp_clkm_plle, CLK_SOURCE_EXTERN2, 121, 0, tegra_clk_extern2),
|
||||
MUX8("extern3", mux_plla_clk32_pllp_clkm_plle, CLK_SOURCE_EXTERN3, 122, 0, tegra_clk_extern3),
|
||||
MUX8("extern1", mux_plla_clk32_pllp_clkm_plle, CLK_SOURCE_EXTERN1, 120, TEGRA_PERIPH_NO_RESET, tegra_clk_extern1),
|
||||
MUX8("extern2", mux_plla_clk32_pllp_clkm_plle, CLK_SOURCE_EXTERN2, 121, TEGRA_PERIPH_NO_RESET, tegra_clk_extern2),
|
||||
MUX8("extern3", mux_plla_clk32_pllp_clkm_plle, CLK_SOURCE_EXTERN3, 122, TEGRA_PERIPH_NO_RESET, tegra_clk_extern3),
|
||||
MUX8("soc_therm", mux_pllm_pllc_pllp_plla, CLK_SOURCE_SOC_THERM, 78, TEGRA_PERIPH_ON_APB, tegra_clk_soc_therm),
|
||||
MUX8("soc_therm", mux_clkm_pllc_pllp_plla, CLK_SOURCE_SOC_THERM, 78, TEGRA_PERIPH_ON_APB, tegra_clk_soc_therm_8),
|
||||
MUX8("vi_sensor", mux_pllm_pllc2_c_c3_pllp_plla, CLK_SOURCE_VI_SENSOR, 164, TEGRA_PERIPH_NO_RESET, tegra_clk_vi_sensor_8),
|
||||
|
|
|
@ -25,6 +25,8 @@
|
|||
|
||||
#define SUPER_CDIV_ENB BIT(31)
|
||||
|
||||
#define TSENSOR_SLOWDOWN BIT(23)
|
||||
|
||||
static struct tegra_clk_super_mux *cclk_super;
|
||||
static bool cclk_on_pllx;
|
||||
|
||||
|
@ -47,10 +49,20 @@ static int cclk_super_set_rate(struct clk_hw *hw, unsigned long rate,
|
|||
static unsigned long cclk_super_recalc_rate(struct clk_hw *hw,
|
||||
unsigned long parent_rate)
|
||||
{
|
||||
if (cclk_super_get_parent(hw) == PLLX_INDEX)
|
||||
return parent_rate;
|
||||
struct tegra_clk_super_mux *super = to_clk_super_mux(hw);
|
||||
u32 val = readl_relaxed(super->reg);
|
||||
unsigned int div2;
|
||||
|
||||
return tegra_clk_super_ops.recalc_rate(hw, parent_rate);
|
||||
/* check whether thermal throttling is active */
|
||||
if (val & TSENSOR_SLOWDOWN)
|
||||
div2 = 1;
|
||||
else
|
||||
div2 = 0;
|
||||
|
||||
if (cclk_super_get_parent(hw) == PLLX_INDEX)
|
||||
return parent_rate >> div2;
|
||||
|
||||
return tegra_clk_super_ops.recalc_rate(hw, parent_rate) >> div2;
|
||||
}
|
||||
|
||||
static int cclk_super_determine_rate(struct clk_hw *hw,
|
||||
|
|
|
@ -1021,9 +1021,9 @@ static struct tegra_clk_init_table init_table[] __initdata = {
|
|||
{ TEGRA20_CLK_PLL_P_OUT3, TEGRA20_CLK_CLK_MAX, 72000000, 1 },
|
||||
{ TEGRA20_CLK_PLL_P_OUT4, TEGRA20_CLK_CLK_MAX, 24000000, 1 },
|
||||
{ TEGRA20_CLK_PLL_C, TEGRA20_CLK_CLK_MAX, 600000000, 0 },
|
||||
{ TEGRA20_CLK_PLL_C_OUT1, TEGRA20_CLK_CLK_MAX, 240000000, 0 },
|
||||
{ TEGRA20_CLK_SCLK, TEGRA20_CLK_PLL_C_OUT1, 240000000, 0 },
|
||||
{ TEGRA20_CLK_HCLK, TEGRA20_CLK_CLK_MAX, 240000000, 0 },
|
||||
{ TEGRA20_CLK_PLL_C_OUT1, TEGRA20_CLK_CLK_MAX, 120000000, 0 },
|
||||
{ TEGRA20_CLK_SCLK, TEGRA20_CLK_PLL_C_OUT1, 120000000, 0 },
|
||||
{ TEGRA20_CLK_HCLK, TEGRA20_CLK_CLK_MAX, 120000000, 0 },
|
||||
{ TEGRA20_CLK_PCLK, TEGRA20_CLK_CLK_MAX, 60000000, 0 },
|
||||
{ TEGRA20_CLK_CSITE, TEGRA20_CLK_CLK_MAX, 0, 1 },
|
||||
{ TEGRA20_CLK_CCLK, TEGRA20_CLK_CLK_MAX, 0, 1 },
|
||||
|
|
|
@ -930,7 +930,7 @@ static void __init tegra30_super_clk_init(void)
|
|||
/* CCLKG */
|
||||
clk = tegra_clk_register_super_cclk("cclk_g", cclk_g_parents,
|
||||
ARRAY_SIZE(cclk_g_parents),
|
||||
CLK_SET_RATE_PARENT,
|
||||
CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
|
||||
clk_base + CCLKG_BURST_POLICY,
|
||||
0, NULL);
|
||||
clks[TEGRA30_CLK_CCLK_G] = clk;
|
||||
|
@ -1006,7 +1006,7 @@ static struct tegra_periph_init_data tegra_periph_clk_list[] = {
|
|||
TEGRA_INIT_DATA_MUX("dam0", mux_pllacp_clkm, CLK_SOURCE_DAM0, 108, 0, TEGRA30_CLK_DAM0),
|
||||
TEGRA_INIT_DATA_MUX("dam1", mux_pllacp_clkm, CLK_SOURCE_DAM1, 109, 0, TEGRA30_CLK_DAM1),
|
||||
TEGRA_INIT_DATA_MUX("dam2", mux_pllacp_clkm, CLK_SOURCE_DAM2, 110, 0, TEGRA30_CLK_DAM2),
|
||||
TEGRA_INIT_DATA_INT("3d2", mux_pllmcpa, CLK_SOURCE_3D2, 98, TEGRA_PERIPH_MANUAL_RESET, TEGRA30_CLK_GR3D2),
|
||||
TEGRA_INIT_DATA_INT("3d2", mux_pllmcpa, CLK_SOURCE_3D2, 98, 0, TEGRA30_CLK_GR3D2),
|
||||
TEGRA_INIT_DATA_INT("se", mux_pllpcm_clkm, CLK_SOURCE_SE, 127, 0, TEGRA30_CLK_SE),
|
||||
TEGRA_INIT_DATA_MUX8("hdmi", mux_pllpmdacd2_clkm, CLK_SOURCE_HDMI, 51, 0, TEGRA30_CLK_HDMI),
|
||||
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,7 +1245,7 @@ static struct tegra_clk_init_table init_table[] __initdata = {
|
|||
{ TEGRA30_CLK_GR3D, TEGRA30_CLK_PLL_C, 300000000, 0 },
|
||||
{ TEGRA30_CLK_GR3D2, TEGRA30_CLK_PLL_C, 300000000, 0 },
|
||||
{ TEGRA30_CLK_PLL_U, TEGRA30_CLK_CLK_MAX, 480000000, 0 },
|
||||
{ TEGRA30_CLK_VDE, TEGRA30_CLK_PLL_C, 600000000, 0 },
|
||||
{ TEGRA30_CLK_VDE, TEGRA30_CLK_PLL_C, 300000000, 0 },
|
||||
{ TEGRA30_CLK_SPDIF_IN_SYNC, TEGRA30_CLK_CLK_MAX, 24000000, 0 },
|
||||
{ TEGRA30_CLK_I2S0_SYNC, TEGRA30_CLK_CLK_MAX, 24000000, 0 },
|
||||
{ TEGRA30_CLK_I2S1_SYNC, TEGRA30_CLK_CLK_MAX, 24000000, 0 },
|
||||
|
|
|
@ -553,9 +553,6 @@ struct tegra_clk_periph_regs {
|
|||
* Flags:
|
||||
* TEGRA_PERIPH_NO_RESET - This flag indicates that reset is not allowed
|
||||
* for this module.
|
||||
* TEGRA_PERIPH_MANUAL_RESET - This flag indicates not to reset module
|
||||
* after clock enable and driver for the module is responsible for
|
||||
* doing reset.
|
||||
* TEGRA_PERIPH_ON_APB - If peripheral is in the APB bus then read the
|
||||
* bus to flush the write operation in apb bus. This flag indicates
|
||||
* that this peripheral is in apb bus.
|
||||
|
@ -577,7 +574,6 @@ struct tegra_clk_periph_gate {
|
|||
#define TEGRA_CLK_PERIPH_GATE_MAGIC 0x17760309
|
||||
|
||||
#define TEGRA_PERIPH_NO_RESET BIT(0)
|
||||
#define TEGRA_PERIPH_MANUAL_RESET BIT(1)
|
||||
#define TEGRA_PERIPH_ON_APB BIT(2)
|
||||
#define TEGRA_PERIPH_WAR_1005168 BIT(3)
|
||||
#define TEGRA_PERIPH_NO_DIV BIT(4)
|
||||
|
|
|
@ -211,7 +211,8 @@ struct arm_smmu_device *arm_smmu_impl_init(struct arm_smmu_device *smmu)
|
|||
if (of_property_read_bool(np, "calxeda,smmu-secure-config-access"))
|
||||
smmu->impl = &calxeda_impl;
|
||||
|
||||
if (of_device_is_compatible(np, "nvidia,tegra194-smmu"))
|
||||
if (of_device_is_compatible(np, "nvidia,tegra194-smmu") ||
|
||||
of_device_is_compatible(np, "nvidia,tegra186-smmu"))
|
||||
return nvidia_smmu_impl_init(smmu);
|
||||
|
||||
smmu = qcom_smmu_impl_init(smmu);
|
||||
|
|
|
@ -7,6 +7,8 @@
|
|||
#include <linux/platform_device.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include <soc/tegra/mc.h>
|
||||
|
||||
#include "arm-smmu.h"
|
||||
|
||||
/*
|
||||
|
@ -15,18 +17,32 @@
|
|||
* interleaved IOVA accesses across them and translates accesses from
|
||||
* non-isochronous HW devices.
|
||||
* Third one is used for translating accesses from isochronous HW devices.
|
||||
*
|
||||
* In addition, the SMMU driver needs to coordinate with the memory controller
|
||||
* driver to ensure that the right SID override is programmed for any given
|
||||
* memory client. This is necessary to allow for use-case such as seamlessly
|
||||
* handing over the display controller configuration from the firmware to the
|
||||
* kernel.
|
||||
*
|
||||
* This implementation supports programming of the two instances that must
|
||||
* be programmed identically.
|
||||
* The third instance usage is through standard arm-smmu driver itself and
|
||||
* is out of scope of this implementation.
|
||||
* be programmed identically and takes care of invoking the memory controller
|
||||
* driver for SID override programming after devices have been attached to an
|
||||
* SMMU instance.
|
||||
*/
|
||||
#define NUM_SMMU_INSTANCES 2
|
||||
#define MAX_SMMU_INSTANCES 2
|
||||
|
||||
struct nvidia_smmu {
|
||||
struct arm_smmu_device smmu;
|
||||
void __iomem *bases[NUM_SMMU_INSTANCES];
|
||||
void __iomem *bases[MAX_SMMU_INSTANCES];
|
||||
unsigned int num_instances;
|
||||
struct tegra_mc *mc;
|
||||
};
|
||||
|
||||
static inline struct nvidia_smmu *to_nvidia_smmu(struct arm_smmu_device *smmu)
|
||||
{
|
||||
return container_of(smmu, struct nvidia_smmu, smmu);
|
||||
}
|
||||
|
||||
static inline void __iomem *nvidia_smmu_page(struct arm_smmu_device *smmu,
|
||||
unsigned int inst, int page)
|
||||
{
|
||||
|
@ -47,9 +63,10 @@ static u32 nvidia_smmu_read_reg(struct arm_smmu_device *smmu,
|
|||
static void nvidia_smmu_write_reg(struct arm_smmu_device *smmu,
|
||||
int page, int offset, u32 val)
|
||||
{
|
||||
struct nvidia_smmu *nvidia = to_nvidia_smmu(smmu);
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < NUM_SMMU_INSTANCES; i++) {
|
||||
for (i = 0; i < nvidia->num_instances; i++) {
|
||||
void __iomem *reg = nvidia_smmu_page(smmu, i, page) + offset;
|
||||
|
||||
writel_relaxed(val, reg);
|
||||
|
@ -67,9 +84,10 @@ static u64 nvidia_smmu_read_reg64(struct arm_smmu_device *smmu,
|
|||
static void nvidia_smmu_write_reg64(struct arm_smmu_device *smmu,
|
||||
int page, int offset, u64 val)
|
||||
{
|
||||
struct nvidia_smmu *nvidia = to_nvidia_smmu(smmu);
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < NUM_SMMU_INSTANCES; i++) {
|
||||
for (i = 0; i < nvidia->num_instances; i++) {
|
||||
void __iomem *reg = nvidia_smmu_page(smmu, i, page) + offset;
|
||||
|
||||
writeq_relaxed(val, reg);
|
||||
|
@ -79,6 +97,7 @@ static void nvidia_smmu_write_reg64(struct arm_smmu_device *smmu,
|
|||
static void nvidia_smmu_tlb_sync(struct arm_smmu_device *smmu, int page,
|
||||
int sync, int status)
|
||||
{
|
||||
struct nvidia_smmu *nvidia = to_nvidia_smmu(smmu);
|
||||
unsigned int delay;
|
||||
|
||||
arm_smmu_writel(smmu, page, sync, 0);
|
||||
|
@ -90,7 +109,7 @@ static void nvidia_smmu_tlb_sync(struct arm_smmu_device *smmu, int page,
|
|||
u32 val = 0;
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < NUM_SMMU_INSTANCES; i++) {
|
||||
for (i = 0; i < nvidia->num_instances; i++) {
|
||||
void __iomem *reg;
|
||||
|
||||
reg = nvidia_smmu_page(smmu, i, page) + status;
|
||||
|
@ -112,9 +131,10 @@ static void nvidia_smmu_tlb_sync(struct arm_smmu_device *smmu, int page,
|
|||
|
||||
static int nvidia_smmu_reset(struct arm_smmu_device *smmu)
|
||||
{
|
||||
struct nvidia_smmu *nvidia = to_nvidia_smmu(smmu);
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < NUM_SMMU_INSTANCES; i++) {
|
||||
for (i = 0; i < nvidia->num_instances; i++) {
|
||||
u32 val;
|
||||
void __iomem *reg = nvidia_smmu_page(smmu, i, ARM_SMMU_GR0) +
|
||||
ARM_SMMU_GR0_sGFSR;
|
||||
|
@ -157,8 +177,9 @@ static irqreturn_t nvidia_smmu_global_fault(int irq, void *dev)
|
|||
unsigned int inst;
|
||||
irqreturn_t ret = IRQ_NONE;
|
||||
struct arm_smmu_device *smmu = dev;
|
||||
struct nvidia_smmu *nvidia = to_nvidia_smmu(smmu);
|
||||
|
||||
for (inst = 0; inst < NUM_SMMU_INSTANCES; inst++) {
|
||||
for (inst = 0; inst < nvidia->num_instances; inst++) {
|
||||
irqreturn_t irq_ret;
|
||||
|
||||
irq_ret = nvidia_smmu_global_fault_inst(irq, smmu, inst);
|
||||
|
@ -202,11 +223,13 @@ static irqreturn_t nvidia_smmu_context_fault(int irq, void *dev)
|
|||
struct arm_smmu_device *smmu;
|
||||
struct iommu_domain *domain = dev;
|
||||
struct arm_smmu_domain *smmu_domain;
|
||||
struct nvidia_smmu *nvidia;
|
||||
|
||||
smmu_domain = container_of(domain, struct arm_smmu_domain, domain);
|
||||
smmu = smmu_domain->smmu;
|
||||
nvidia = to_nvidia_smmu(smmu);
|
||||
|
||||
for (inst = 0; inst < NUM_SMMU_INSTANCES; inst++) {
|
||||
for (inst = 0; inst < nvidia->num_instances; inst++) {
|
||||
irqreturn_t irq_ret;
|
||||
|
||||
/*
|
||||
|
@ -224,6 +247,17 @@ static irqreturn_t nvidia_smmu_context_fault(int irq, void *dev)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static void nvidia_smmu_probe_finalize(struct arm_smmu_device *smmu, struct device *dev)
|
||||
{
|
||||
struct nvidia_smmu *nvidia = to_nvidia_smmu(smmu);
|
||||
int err;
|
||||
|
||||
err = tegra_mc_probe_device(nvidia->mc, dev);
|
||||
if (err < 0)
|
||||
dev_err(smmu->dev, "memory controller probe failed for %s: %d\n",
|
||||
dev_name(dev), err);
|
||||
}
|
||||
|
||||
static const struct arm_smmu_impl nvidia_smmu_impl = {
|
||||
.read_reg = nvidia_smmu_read_reg,
|
||||
.write_reg = nvidia_smmu_write_reg,
|
||||
|
@ -233,6 +267,11 @@ static const struct arm_smmu_impl nvidia_smmu_impl = {
|
|||
.tlb_sync = nvidia_smmu_tlb_sync,
|
||||
.global_fault = nvidia_smmu_global_fault,
|
||||
.context_fault = nvidia_smmu_context_fault,
|
||||
.probe_finalize = nvidia_smmu_probe_finalize,
|
||||
};
|
||||
|
||||
static const struct arm_smmu_impl nvidia_smmu_single_impl = {
|
||||
.probe_finalize = nvidia_smmu_probe_finalize,
|
||||
};
|
||||
|
||||
struct arm_smmu_device *nvidia_smmu_impl_init(struct arm_smmu_device *smmu)
|
||||
|
@ -241,22 +280,35 @@ struct arm_smmu_device *nvidia_smmu_impl_init(struct arm_smmu_device *smmu)
|
|||
struct device *dev = smmu->dev;
|
||||
struct nvidia_smmu *nvidia_smmu;
|
||||
struct platform_device *pdev = to_platform_device(dev);
|
||||
unsigned int i;
|
||||
|
||||
nvidia_smmu = devm_krealloc(dev, smmu, sizeof(*nvidia_smmu), GFP_KERNEL);
|
||||
if (!nvidia_smmu)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
nvidia_smmu->mc = devm_tegra_memory_controller_get(dev);
|
||||
if (IS_ERR(nvidia_smmu->mc))
|
||||
return ERR_CAST(nvidia_smmu->mc);
|
||||
|
||||
/* Instance 0 is ioremapped by arm-smmu.c. */
|
||||
nvidia_smmu->bases[0] = smmu->base;
|
||||
nvidia_smmu->num_instances++;
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
|
||||
for (i = 1; i < MAX_SMMU_INSTANCES; i++) {
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, i);
|
||||
if (!res)
|
||||
return ERR_PTR(-ENODEV);
|
||||
break;
|
||||
|
||||
nvidia_smmu->bases[1] = devm_ioremap_resource(dev, res);
|
||||
if (IS_ERR(nvidia_smmu->bases[1]))
|
||||
return ERR_CAST(nvidia_smmu->bases[1]);
|
||||
nvidia_smmu->bases[i] = devm_ioremap_resource(dev, res);
|
||||
if (IS_ERR(nvidia_smmu->bases[i]))
|
||||
return ERR_CAST(nvidia_smmu->bases[i]);
|
||||
|
||||
nvidia_smmu->num_instances++;
|
||||
}
|
||||
|
||||
if (nvidia_smmu->num_instances == 1)
|
||||
nvidia_smmu->smmu.impl = &nvidia_smmu_single_impl;
|
||||
else
|
||||
nvidia_smmu->smmu.impl = &nvidia_smmu_impl;
|
||||
|
||||
return &nvidia_smmu->smmu;
|
||||
|
|
|
@ -1450,6 +1450,18 @@ static void arm_smmu_release_device(struct device *dev)
|
|||
iommu_fwspec_free(dev);
|
||||
}
|
||||
|
||||
static void arm_smmu_probe_finalize(struct device *dev)
|
||||
{
|
||||
struct arm_smmu_master_cfg *cfg;
|
||||
struct arm_smmu_device *smmu;
|
||||
|
||||
cfg = dev_iommu_priv_get(dev);
|
||||
smmu = cfg->smmu;
|
||||
|
||||
if (smmu->impl->probe_finalize)
|
||||
smmu->impl->probe_finalize(smmu, dev);
|
||||
}
|
||||
|
||||
static struct iommu_group *arm_smmu_device_group(struct device *dev)
|
||||
{
|
||||
struct arm_smmu_master_cfg *cfg = dev_iommu_priv_get(dev);
|
||||
|
@ -1569,6 +1581,7 @@ static struct iommu_ops arm_smmu_ops = {
|
|||
.iova_to_phys = arm_smmu_iova_to_phys,
|
||||
.probe_device = arm_smmu_probe_device,
|
||||
.release_device = arm_smmu_release_device,
|
||||
.probe_finalize = arm_smmu_probe_finalize,
|
||||
.device_group = arm_smmu_device_group,
|
||||
.enable_nesting = arm_smmu_enable_nesting,
|
||||
.set_pgtable_quirks = arm_smmu_set_pgtable_quirks,
|
||||
|
|
|
@ -439,6 +439,7 @@ struct arm_smmu_impl {
|
|||
struct device *dev, int start);
|
||||
void (*write_s2cr)(struct arm_smmu_device *smmu, int idx);
|
||||
void (*write_sctlr)(struct arm_smmu_device *smmu, int idx, u32 reg);
|
||||
void (*probe_finalize)(struct arm_smmu_device *smmu, struct device *dev);
|
||||
};
|
||||
|
||||
#define INVALID_SMENDX -1
|
||||
|
|
|
@ -376,9 +376,9 @@ static void tegra_smmu_enable(struct tegra_smmu *smmu, unsigned int swgroup,
|
|||
if (client->swgroup != swgroup)
|
||||
continue;
|
||||
|
||||
value = smmu_readl(smmu, client->smmu.reg);
|
||||
value |= BIT(client->smmu.bit);
|
||||
smmu_writel(smmu, value, client->smmu.reg);
|
||||
value = smmu_readl(smmu, client->regs.smmu.reg);
|
||||
value |= BIT(client->regs.smmu.bit);
|
||||
smmu_writel(smmu, value, client->regs.smmu.reg);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -404,9 +404,9 @@ static void tegra_smmu_disable(struct tegra_smmu *smmu, unsigned int swgroup,
|
|||
if (client->swgroup != swgroup)
|
||||
continue;
|
||||
|
||||
value = smmu_readl(smmu, client->smmu.reg);
|
||||
value &= ~BIT(client->smmu.bit);
|
||||
smmu_writel(smmu, value, client->smmu.reg);
|
||||
value = smmu_readl(smmu, client->regs.smmu.reg);
|
||||
value &= ~BIT(client->regs.smmu.bit);
|
||||
smmu_writel(smmu, value, client->regs.smmu.reg);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1042,9 +1042,9 @@ static int tegra_smmu_clients_show(struct seq_file *s, void *data)
|
|||
const struct tegra_mc_client *client = &smmu->soc->clients[i];
|
||||
const char *status;
|
||||
|
||||
value = smmu_readl(smmu, client->smmu.reg);
|
||||
value = smmu_readl(smmu, client->regs.smmu.reg);
|
||||
|
||||
if (value & BIT(client->smmu.bit))
|
||||
if (value & BIT(client->regs.smmu.bit))
|
||||
status = "yes";
|
||||
else
|
||||
status = "no";
|
||||
|
|
|
@ -2,16 +2,18 @@
|
|||
config TEGRA_MC
|
||||
bool "NVIDIA Tegra Memory Controller support"
|
||||
default y
|
||||
depends on ARCH_TEGRA
|
||||
depends on ARCH_TEGRA || (COMPILE_TEST && COMMON_CLK)
|
||||
select INTERCONNECT
|
||||
help
|
||||
This driver supports the Memory Controller (MC) hardware found on
|
||||
NVIDIA Tegra SoCs.
|
||||
|
||||
if TEGRA_MC
|
||||
|
||||
config TEGRA20_EMC
|
||||
tristate "NVIDIA Tegra20 External Memory Controller driver"
|
||||
default y
|
||||
depends on TEGRA_MC && ARCH_TEGRA_2x_SOC
|
||||
depends on ARCH_TEGRA_2x_SOC || COMPILE_TEST
|
||||
select DEVFREQ_GOV_SIMPLE_ONDEMAND
|
||||
select PM_DEVFREQ
|
||||
help
|
||||
|
@ -23,7 +25,7 @@ config TEGRA20_EMC
|
|||
config TEGRA30_EMC
|
||||
tristate "NVIDIA Tegra30 External Memory Controller driver"
|
||||
default y
|
||||
depends on TEGRA_MC && ARCH_TEGRA_3x_SOC
|
||||
depends on ARCH_TEGRA_3x_SOC || COMPILE_TEST
|
||||
select PM_OPP
|
||||
help
|
||||
This driver is for the External Memory Controller (EMC) found on
|
||||
|
@ -34,8 +36,8 @@ config TEGRA30_EMC
|
|||
config TEGRA124_EMC
|
||||
tristate "NVIDIA Tegra124 External Memory Controller driver"
|
||||
default y
|
||||
depends on TEGRA_MC && ARCH_TEGRA_124_SOC
|
||||
select TEGRA124_CLK_EMC
|
||||
depends on ARCH_TEGRA_124_SOC || COMPILE_TEST
|
||||
select TEGRA124_CLK_EMC if ARCH_TEGRA
|
||||
select PM_OPP
|
||||
help
|
||||
This driver is for the External Memory Controller (EMC) found on
|
||||
|
@ -45,14 +47,16 @@ config TEGRA124_EMC
|
|||
|
||||
config TEGRA210_EMC_TABLE
|
||||
bool
|
||||
depends on ARCH_TEGRA_210_SOC
|
||||
depends on ARCH_TEGRA_210_SOC || COMPILE_TEST
|
||||
|
||||
config TEGRA210_EMC
|
||||
tristate "NVIDIA Tegra210 External Memory Controller driver"
|
||||
depends on TEGRA_MC && ARCH_TEGRA_210_SOC
|
||||
depends on ARCH_TEGRA_210_SOC || COMPILE_TEST
|
||||
select TEGRA210_EMC_TABLE
|
||||
help
|
||||
This driver is for the External Memory Controller (EMC) found on
|
||||
Tegra210 chips. The EMC controls the external DRAM on the board.
|
||||
This driver is required to change memory timings / clock rate for
|
||||
external memory.
|
||||
|
||||
endif
|
||||
|
|
|
@ -7,6 +7,8 @@ tegra-mc-$(CONFIG_ARCH_TEGRA_114_SOC) += tegra114.o
|
|||
tegra-mc-$(CONFIG_ARCH_TEGRA_124_SOC) += tegra124.o
|
||||
tegra-mc-$(CONFIG_ARCH_TEGRA_132_SOC) += tegra124.o
|
||||
tegra-mc-$(CONFIG_ARCH_TEGRA_210_SOC) += tegra210.o
|
||||
tegra-mc-$(CONFIG_ARCH_TEGRA_186_SOC) += tegra186.o
|
||||
tegra-mc-$(CONFIG_ARCH_TEGRA_194_SOC) += tegra186.o tegra194.o
|
||||
|
||||
obj-$(CONFIG_TEGRA_MC) += tegra-mc.o
|
||||
|
||||
|
@ -15,7 +17,7 @@ obj-$(CONFIG_TEGRA30_EMC) += tegra30-emc.o
|
|||
obj-$(CONFIG_TEGRA124_EMC) += tegra124-emc.o
|
||||
obj-$(CONFIG_TEGRA210_EMC_TABLE) += tegra210-emc-table.o
|
||||
obj-$(CONFIG_TEGRA210_EMC) += tegra210-emc.o
|
||||
obj-$(CONFIG_ARCH_TEGRA_186_SOC) += tegra186.o tegra186-emc.o
|
||||
obj-$(CONFIG_ARCH_TEGRA_194_SOC) += tegra186.o tegra186-emc.o
|
||||
obj-$(CONFIG_ARCH_TEGRA_186_SOC) += tegra186-emc.o
|
||||
obj-$(CONFIG_ARCH_TEGRA_194_SOC) += tegra186-emc.o
|
||||
|
||||
tegra210-emc-y := tegra210-emc-core.o tegra210-emc-cc-r21021.o
|
||||
|
|
|
@ -39,7 +39,13 @@ static const struct of_device_id tegra_mc_of_match[] = {
|
|||
#ifdef CONFIG_ARCH_TEGRA_210_SOC
|
||||
{ .compatible = "nvidia,tegra210-mc", .data = &tegra210_mc_soc },
|
||||
#endif
|
||||
{ }
|
||||
#ifdef CONFIG_ARCH_TEGRA_186_SOC
|
||||
{ .compatible = "nvidia,tegra186-mc", .data = &tegra186_mc_soc },
|
||||
#endif
|
||||
#ifdef CONFIG_ARCH_TEGRA_194_SOC
|
||||
{ .compatible = "nvidia,tegra194-mc", .data = &tegra194_mc_soc },
|
||||
#endif
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, tegra_mc_of_match);
|
||||
|
||||
|
@ -91,6 +97,15 @@ struct tegra_mc *devm_tegra_memory_controller_get(struct device *dev)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(devm_tegra_memory_controller_get);
|
||||
|
||||
int tegra_mc_probe_device(struct tegra_mc *mc, struct device *dev)
|
||||
{
|
||||
if (mc->soc->ops && mc->soc->ops->probe_device)
|
||||
return mc->soc->ops->probe_device(mc, dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(tegra_mc_probe_device);
|
||||
|
||||
static int tegra_mc_block_dma_common(struct tegra_mc *mc,
|
||||
const struct tegra_mc_reset *rst)
|
||||
{
|
||||
|
@ -299,38 +314,6 @@ static int tegra_mc_reset_setup(struct tegra_mc *mc)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int tegra_mc_setup_latency_allowance(struct tegra_mc *mc)
|
||||
{
|
||||
unsigned long long tick;
|
||||
unsigned int i;
|
||||
u32 value;
|
||||
|
||||
/* compute the number of MC clock cycles per tick */
|
||||
tick = (unsigned long long)mc->tick * clk_get_rate(mc->clk);
|
||||
do_div(tick, NSEC_PER_SEC);
|
||||
|
||||
value = mc_readl(mc, MC_EMEM_ARB_CFG);
|
||||
value &= ~MC_EMEM_ARB_CFG_CYCLES_PER_UPDATE_MASK;
|
||||
value |= MC_EMEM_ARB_CFG_CYCLES_PER_UPDATE(tick);
|
||||
mc_writel(mc, value, MC_EMEM_ARB_CFG);
|
||||
|
||||
/* write latency allowance defaults */
|
||||
for (i = 0; i < mc->soc->num_clients; i++) {
|
||||
const struct tegra_mc_la *la = &mc->soc->clients[i].la;
|
||||
u32 value;
|
||||
|
||||
value = mc_readl(mc, la->reg);
|
||||
value &= ~(la->mask << la->shift);
|
||||
value |= (la->def & la->mask) << la->shift;
|
||||
mc_writel(mc, value, la->reg);
|
||||
}
|
||||
|
||||
/* latch new values */
|
||||
mc_writel(mc, MC_TIMING_UPDATE, MC_TIMING_CONTROL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int tegra_mc_write_emem_configuration(struct tegra_mc *mc, unsigned long rate)
|
||||
{
|
||||
unsigned int i;
|
||||
|
@ -368,6 +351,43 @@ unsigned int tegra_mc_get_emem_device_count(struct tegra_mc *mc)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(tegra_mc_get_emem_device_count);
|
||||
|
||||
#if defined(CONFIG_ARCH_TEGRA_3x_SOC) || \
|
||||
defined(CONFIG_ARCH_TEGRA_114_SOC) || \
|
||||
defined(CONFIG_ARCH_TEGRA_124_SOC) || \
|
||||
defined(CONFIG_ARCH_TEGRA_132_SOC) || \
|
||||
defined(CONFIG_ARCH_TEGRA_210_SOC)
|
||||
static int tegra_mc_setup_latency_allowance(struct tegra_mc *mc)
|
||||
{
|
||||
unsigned long long tick;
|
||||
unsigned int i;
|
||||
u32 value;
|
||||
|
||||
/* compute the number of MC clock cycles per tick */
|
||||
tick = (unsigned long long)mc->tick * clk_get_rate(mc->clk);
|
||||
do_div(tick, NSEC_PER_SEC);
|
||||
|
||||
value = mc_readl(mc, MC_EMEM_ARB_CFG);
|
||||
value &= ~MC_EMEM_ARB_CFG_CYCLES_PER_UPDATE_MASK;
|
||||
value |= MC_EMEM_ARB_CFG_CYCLES_PER_UPDATE(tick);
|
||||
mc_writel(mc, value, MC_EMEM_ARB_CFG);
|
||||
|
||||
/* write latency allowance defaults */
|
||||
for (i = 0; i < mc->soc->num_clients; i++) {
|
||||
const struct tegra_mc_client *client = &mc->soc->clients[i];
|
||||
u32 value;
|
||||
|
||||
value = mc_readl(mc, client->regs.la.reg);
|
||||
value &= ~(client->regs.la.mask << client->regs.la.shift);
|
||||
value |= (client->regs.la.def & client->regs.la.mask) << client->regs.la.shift;
|
||||
mc_writel(mc, value, client->regs.la.reg);
|
||||
}
|
||||
|
||||
/* latch new values */
|
||||
mc_writel(mc, MC_TIMING_UPDATE, MC_TIMING_CONTROL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int load_one_timing(struct tegra_mc *mc,
|
||||
struct tegra_mc_timing *timing,
|
||||
struct device_node *node)
|
||||
|
@ -459,27 +479,35 @@ static int tegra_mc_setup_timings(struct tegra_mc *mc)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static const char *const status_names[32] = {
|
||||
[ 1] = "External interrupt",
|
||||
[ 6] = "EMEM address decode error",
|
||||
[ 7] = "GART page fault",
|
||||
[ 8] = "Security violation",
|
||||
[ 9] = "EMEM arbitration error",
|
||||
[10] = "Page fault",
|
||||
[11] = "Invalid APB ASID update",
|
||||
[12] = "VPR violation",
|
||||
[13] = "Secure carveout violation",
|
||||
[16] = "MTS carveout violation",
|
||||
};
|
||||
int tegra30_mc_probe(struct tegra_mc *mc)
|
||||
{
|
||||
int err;
|
||||
|
||||
static const char *const error_names[8] = {
|
||||
[2] = "EMEM decode error",
|
||||
[3] = "TrustZone violation",
|
||||
[4] = "Carveout violation",
|
||||
[6] = "SMMU translation error",
|
||||
};
|
||||
mc->clk = devm_clk_get_optional(mc->dev, "mc");
|
||||
if (IS_ERR(mc->clk)) {
|
||||
dev_err(mc->dev, "failed to get MC clock: %ld\n", PTR_ERR(mc->clk));
|
||||
return PTR_ERR(mc->clk);
|
||||
}
|
||||
|
||||
static irqreturn_t tegra_mc_irq(int irq, void *data)
|
||||
/* ensure that debug features are disabled */
|
||||
mc_writel(mc, 0x00000000, MC_TIMING_CONTROL_DBG);
|
||||
|
||||
err = tegra_mc_setup_latency_allowance(mc);
|
||||
if (err < 0) {
|
||||
dev_err(mc->dev, "failed to setup latency allowance: %d\n", err);
|
||||
return err;
|
||||
}
|
||||
|
||||
err = tegra_mc_setup_timings(mc);
|
||||
if (err < 0) {
|
||||
dev_err(mc->dev, "failed to setup timings: %d\n", err);
|
||||
return err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static irqreturn_t tegra30_mc_handle_irq(int irq, void *data)
|
||||
{
|
||||
struct tegra_mc *mc = data;
|
||||
unsigned long status;
|
||||
|
@ -491,7 +519,7 @@ static irqreturn_t tegra_mc_irq(int irq, void *data)
|
|||
return IRQ_NONE;
|
||||
|
||||
for_each_set_bit(bit, &status, 32) {
|
||||
const char *error = status_names[bit] ?: "unknown";
|
||||
const char *error = tegra_mc_status_names[bit] ?: "unknown";
|
||||
const char *client = "unknown", *desc;
|
||||
const char *direction, *secure;
|
||||
phys_addr_t addr = 0;
|
||||
|
@ -531,7 +559,7 @@ static irqreturn_t tegra_mc_irq(int irq, void *data)
|
|||
|
||||
type = (value & MC_ERR_STATUS_TYPE_MASK) >>
|
||||
MC_ERR_STATUS_TYPE_SHIFT;
|
||||
desc = error_names[type];
|
||||
desc = tegra_mc_error_names[type];
|
||||
|
||||
switch (value & MC_ERR_STATUS_TYPE_MASK) {
|
||||
case MC_ERR_STATUS_TYPE_INVALID_SMMU_PAGE:
|
||||
|
@ -576,78 +604,31 @@ static irqreturn_t tegra_mc_irq(int irq, void *data)
|
|||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static __maybe_unused irqreturn_t tegra20_mc_irq(int irq, void *data)
|
||||
{
|
||||
struct tegra_mc *mc = data;
|
||||
unsigned long status;
|
||||
unsigned int bit;
|
||||
const struct tegra_mc_ops tegra30_mc_ops = {
|
||||
.probe = tegra30_mc_probe,
|
||||
.handle_irq = tegra30_mc_handle_irq,
|
||||
};
|
||||
#endif
|
||||
|
||||
/* mask all interrupts to avoid flooding */
|
||||
status = mc_readl(mc, MC_INTSTATUS) & mc->soc->intmask;
|
||||
if (!status)
|
||||
return IRQ_NONE;
|
||||
const char *const tegra_mc_status_names[32] = {
|
||||
[ 1] = "External interrupt",
|
||||
[ 6] = "EMEM address decode error",
|
||||
[ 7] = "GART page fault",
|
||||
[ 8] = "Security violation",
|
||||
[ 9] = "EMEM arbitration error",
|
||||
[10] = "Page fault",
|
||||
[11] = "Invalid APB ASID update",
|
||||
[12] = "VPR violation",
|
||||
[13] = "Secure carveout violation",
|
||||
[16] = "MTS carveout violation",
|
||||
};
|
||||
|
||||
for_each_set_bit(bit, &status, 32) {
|
||||
const char *direction = "read", *secure = "";
|
||||
const char *error = status_names[bit];
|
||||
const char *client, *desc;
|
||||
phys_addr_t addr;
|
||||
u32 value, reg;
|
||||
u8 id, type;
|
||||
|
||||
switch (BIT(bit)) {
|
||||
case MC_INT_DECERR_EMEM:
|
||||
reg = MC_DECERR_EMEM_OTHERS_STATUS;
|
||||
value = mc_readl(mc, reg);
|
||||
|
||||
id = value & mc->soc->client_id_mask;
|
||||
desc = error_names[2];
|
||||
|
||||
if (value & BIT(31))
|
||||
direction = "write";
|
||||
break;
|
||||
|
||||
case MC_INT_INVALID_GART_PAGE:
|
||||
reg = MC_GART_ERROR_REQ;
|
||||
value = mc_readl(mc, reg);
|
||||
|
||||
id = (value >> 1) & mc->soc->client_id_mask;
|
||||
desc = error_names[2];
|
||||
|
||||
if (value & BIT(0))
|
||||
direction = "write";
|
||||
break;
|
||||
|
||||
case MC_INT_SECURITY_VIOLATION:
|
||||
reg = MC_SECURITY_VIOLATION_STATUS;
|
||||
value = mc_readl(mc, reg);
|
||||
|
||||
id = value & mc->soc->client_id_mask;
|
||||
type = (value & BIT(30)) ? 4 : 3;
|
||||
desc = error_names[type];
|
||||
secure = "secure ";
|
||||
|
||||
if (value & BIT(31))
|
||||
direction = "write";
|
||||
break;
|
||||
|
||||
default:
|
||||
continue;
|
||||
}
|
||||
|
||||
client = mc->soc->clients[id].name;
|
||||
addr = mc_readl(mc, reg + sizeof(u32));
|
||||
|
||||
dev_err_ratelimited(mc->dev, "%s: %s%s @%pa: %s (%s)\n",
|
||||
client, secure, direction, &addr, error,
|
||||
desc);
|
||||
}
|
||||
|
||||
/* clear interrupts */
|
||||
mc_writel(mc, status, MC_INTSTATUS);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
const char *const tegra_mc_error_names[8] = {
|
||||
[2] = "EMEM decode error",
|
||||
[3] = "TrustZone violation",
|
||||
[4] = "Carveout violation",
|
||||
[6] = "SMMU translation error",
|
||||
};
|
||||
|
||||
/*
|
||||
* Memory Controller (MC) has few Memory Clients that are issuing memory
|
||||
|
@ -748,7 +729,6 @@ static int tegra_mc_probe(struct platform_device *pdev)
|
|||
{
|
||||
struct resource *res;
|
||||
struct tegra_mc *mc;
|
||||
void *isr;
|
||||
u64 mask;
|
||||
int err;
|
||||
|
||||
|
@ -777,40 +757,15 @@ static int tegra_mc_probe(struct platform_device *pdev)
|
|||
if (IS_ERR(mc->regs))
|
||||
return PTR_ERR(mc->regs);
|
||||
|
||||
mc->clk = devm_clk_get(&pdev->dev, "mc");
|
||||
if (IS_ERR(mc->clk)) {
|
||||
dev_err(&pdev->dev, "failed to get MC clock: %ld\n",
|
||||
PTR_ERR(mc->clk));
|
||||
return PTR_ERR(mc->clk);
|
||||
}
|
||||
mc->debugfs.root = debugfs_create_dir("mc", NULL);
|
||||
|
||||
#ifdef CONFIG_ARCH_TEGRA_2x_SOC
|
||||
if (mc->soc == &tegra20_mc_soc) {
|
||||
isr = tegra20_mc_irq;
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
/* ensure that debug features are disabled */
|
||||
mc_writel(mc, 0x00000000, MC_TIMING_CONTROL_DBG);
|
||||
|
||||
err = tegra_mc_setup_latency_allowance(mc);
|
||||
if (err < 0) {
|
||||
dev_err(&pdev->dev,
|
||||
"failed to setup latency allowance: %d\n",
|
||||
err);
|
||||
if (mc->soc->ops && mc->soc->ops->probe) {
|
||||
err = mc->soc->ops->probe(mc);
|
||||
if (err < 0)
|
||||
return err;
|
||||
}
|
||||
|
||||
isr = tegra_mc_irq;
|
||||
|
||||
err = tegra_mc_setup_timings(mc);
|
||||
if (err < 0) {
|
||||
dev_err(&pdev->dev, "failed to setup timings: %d\n",
|
||||
err);
|
||||
return err;
|
||||
}
|
||||
}
|
||||
|
||||
if (mc->soc->ops && mc->soc->ops->handle_irq) {
|
||||
mc->irq = platform_get_irq(pdev, 0);
|
||||
if (mc->irq < 0)
|
||||
return mc->irq;
|
||||
|
@ -819,27 +774,20 @@ static int tegra_mc_probe(struct platform_device *pdev)
|
|||
|
||||
mc_writel(mc, mc->soc->intmask, MC_INTMASK);
|
||||
|
||||
err = devm_request_irq(&pdev->dev, mc->irq, isr, 0,
|
||||
err = devm_request_irq(&pdev->dev, mc->irq, mc->soc->ops->handle_irq, 0,
|
||||
dev_name(&pdev->dev), mc);
|
||||
if (err < 0) {
|
||||
dev_err(&pdev->dev, "failed to request IRQ#%u: %d\n", mc->irq,
|
||||
err);
|
||||
return err;
|
||||
}
|
||||
|
||||
mc->debugfs.root = debugfs_create_dir("mc", NULL);
|
||||
|
||||
if (mc->soc->init) {
|
||||
err = mc->soc->init(mc);
|
||||
if (err < 0)
|
||||
dev_err(&pdev->dev, "failed to initialize SoC driver: %d\n",
|
||||
err);
|
||||
}
|
||||
|
||||
if (mc->soc->reset_ops) {
|
||||
err = tegra_mc_reset_setup(mc);
|
||||
if (err < 0)
|
||||
dev_err(&pdev->dev, "failed to register reset controller: %d\n",
|
||||
err);
|
||||
dev_err(&pdev->dev, "failed to register reset controller: %d\n", err);
|
||||
}
|
||||
|
||||
err = tegra_mc_interconnect_setup(mc);
|
||||
if (err < 0)
|
||||
|
@ -867,37 +815,28 @@ static int tegra_mc_probe(struct platform_device *pdev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int tegra_mc_suspend(struct device *dev)
|
||||
static int __maybe_unused tegra_mc_suspend(struct device *dev)
|
||||
{
|
||||
struct tegra_mc *mc = dev_get_drvdata(dev);
|
||||
int err;
|
||||
|
||||
if (IS_ENABLED(CONFIG_TEGRA_IOMMU_GART) && mc->gart) {
|
||||
err = tegra_gart_suspend(mc->gart);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
if (mc->soc->ops && mc->soc->ops->suspend)
|
||||
return mc->soc->ops->suspend(mc);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int tegra_mc_resume(struct device *dev)
|
||||
static int __maybe_unused tegra_mc_resume(struct device *dev)
|
||||
{
|
||||
struct tegra_mc *mc = dev_get_drvdata(dev);
|
||||
int err;
|
||||
|
||||
if (IS_ENABLED(CONFIG_TEGRA_IOMMU_GART) && mc->gart) {
|
||||
err = tegra_gart_resume(mc->gart);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
if (mc->soc->ops && mc->soc->ops->resume)
|
||||
return mc->soc->ops->resume(mc);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct dev_pm_ops tegra_mc_pm_ops = {
|
||||
.suspend = tegra_mc_suspend,
|
||||
.resume = tegra_mc_resume,
|
||||
SET_SYSTEM_SLEEP_PM_OPS(tegra_mc_suspend, tegra_mc_resume)
|
||||
};
|
||||
|
||||
static struct platform_driver tegra_mc_driver = {
|
||||
|
|
|
@ -129,6 +129,31 @@ extern const struct tegra_mc_soc tegra132_mc_soc;
|
|||
extern const struct tegra_mc_soc tegra210_mc_soc;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ARCH_TEGRA_186_SOC
|
||||
extern const struct tegra_mc_soc tegra186_mc_soc;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ARCH_TEGRA_194_SOC
|
||||
extern const struct tegra_mc_soc tegra194_mc_soc;
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_ARCH_TEGRA_3x_SOC) || \
|
||||
defined(CONFIG_ARCH_TEGRA_114_SOC) || \
|
||||
defined(CONFIG_ARCH_TEGRA_124_SOC) || \
|
||||
defined(CONFIG_ARCH_TEGRA_132_SOC) || \
|
||||
defined(CONFIG_ARCH_TEGRA_210_SOC)
|
||||
int tegra30_mc_probe(struct tegra_mc *mc);
|
||||
extern const struct tegra_mc_ops tegra30_mc_ops;
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_ARCH_TEGRA_186_SOC) || \
|
||||
defined(CONFIG_ARCH_TEGRA_194_SOC)
|
||||
extern const struct tegra_mc_ops tegra186_mc_ops;
|
||||
#endif
|
||||
|
||||
extern const char * const tegra_mc_status_names[32];
|
||||
extern const char * const tegra_mc_error_names[8];
|
||||
|
||||
/*
|
||||
* These IDs are for internal use of Tegra ICC drivers. The ID numbers are
|
||||
* chosen such that they don't conflict with the device-tree ICC node IDs.
|
||||
|
|
|
@ -15,16 +15,19 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.id = 0x00,
|
||||
.name = "ptcr",
|
||||
.swgroup = TEGRA_SWGROUP_PTC,
|
||||
.regs = {
|
||||
.la = {
|
||||
.reg = 0x34c,
|
||||
.shift = 0,
|
||||
.mask = 0xff,
|
||||
.def = 0x0,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x01,
|
||||
.name = "display0a",
|
||||
.swgroup = TEGRA_SWGROUP_DC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 1,
|
||||
|
@ -35,10 +38,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x4e,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x02,
|
||||
.name = "display0ab",
|
||||
.swgroup = TEGRA_SWGROUP_DCB,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 2,
|
||||
|
@ -49,10 +54,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x4e,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x03,
|
||||
.name = "display0b",
|
||||
.swgroup = TEGRA_SWGROUP_DC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 3,
|
||||
|
@ -63,10 +70,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x4e,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x04,
|
||||
.name = "display0bb",
|
||||
.swgroup = TEGRA_SWGROUP_DCB,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 4,
|
||||
|
@ -77,10 +86,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x4e,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x05,
|
||||
.name = "display0c",
|
||||
.swgroup = TEGRA_SWGROUP_DC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 5,
|
||||
|
@ -91,10 +102,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x4e,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x06,
|
||||
.name = "display0cb",
|
||||
.swgroup = TEGRA_SWGROUP_DCB,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 6,
|
||||
|
@ -105,10 +118,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x4e,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x09,
|
||||
.name = "eppup",
|
||||
.swgroup = TEGRA_SWGROUP_EPP,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 9,
|
||||
|
@ -119,10 +134,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x33,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x0a,
|
||||
.name = "g2pr",
|
||||
.swgroup = TEGRA_SWGROUP_G2,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 10,
|
||||
|
@ -133,10 +150,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x09,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x0b,
|
||||
.name = "g2sr",
|
||||
.swgroup = TEGRA_SWGROUP_G2,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 11,
|
||||
|
@ -147,10 +166,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x09,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x0f,
|
||||
.name = "avpcarm7r",
|
||||
.swgroup = TEGRA_SWGROUP_AVPC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 15,
|
||||
|
@ -161,10 +182,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x04,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x10,
|
||||
.name = "displayhc",
|
||||
.swgroup = TEGRA_SWGROUP_DC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 16,
|
||||
|
@ -175,10 +198,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x68,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x11,
|
||||
.name = "displayhcb",
|
||||
.swgroup = TEGRA_SWGROUP_DCB,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 17,
|
||||
|
@ -189,10 +214,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x68,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x12,
|
||||
.name = "fdcdrd",
|
||||
.swgroup = TEGRA_SWGROUP_NV,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 18,
|
||||
|
@ -203,10 +230,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x0c,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x13,
|
||||
.name = "fdcdrd2",
|
||||
.swgroup = TEGRA_SWGROUP_NV,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 19,
|
||||
|
@ -217,10 +246,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x0c,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x14,
|
||||
.name = "g2dr",
|
||||
.swgroup = TEGRA_SWGROUP_G2,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 20,
|
||||
|
@ -231,10 +262,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x0a,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x15,
|
||||
.name = "hdar",
|
||||
.swgroup = TEGRA_SWGROUP_HDA,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 21,
|
||||
|
@ -245,10 +278,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0xff,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x16,
|
||||
.name = "host1xdmar",
|
||||
.swgroup = TEGRA_SWGROUP_HC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 22,
|
||||
|
@ -259,10 +294,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x10,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x17,
|
||||
.name = "host1xr",
|
||||
.swgroup = TEGRA_SWGROUP_HC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 23,
|
||||
|
@ -273,10 +310,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0xa5,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x18,
|
||||
.name = "idxsrd",
|
||||
.swgroup = TEGRA_SWGROUP_NV,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 24,
|
||||
|
@ -287,10 +326,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x0b,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x1c,
|
||||
.name = "msencsrd",
|
||||
.swgroup = TEGRA_SWGROUP_MSENC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 28,
|
||||
|
@ -301,10 +342,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x1d,
|
||||
.name = "ppcsahbdmar",
|
||||
.swgroup = TEGRA_SWGROUP_PPCS,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 29,
|
||||
|
@ -315,10 +358,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x50,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x1e,
|
||||
.name = "ppcsahbslvr",
|
||||
.swgroup = TEGRA_SWGROUP_PPCS,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 30,
|
||||
|
@ -329,10 +374,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0xe8,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x20,
|
||||
.name = "texl2srd",
|
||||
.swgroup = TEGRA_SWGROUP_NV,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 0,
|
||||
|
@ -343,10 +390,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x0c,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x22,
|
||||
.name = "vdebsevr",
|
||||
.swgroup = TEGRA_SWGROUP_VDE,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 2,
|
||||
|
@ -357,10 +406,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0xff,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x23,
|
||||
.name = "vdember",
|
||||
.swgroup = TEGRA_SWGROUP_VDE,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 3,
|
||||
|
@ -371,10 +422,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0xff,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x24,
|
||||
.name = "vdemcer",
|
||||
.swgroup = TEGRA_SWGROUP_VDE,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 4,
|
||||
|
@ -385,10 +438,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0xb8,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x25,
|
||||
.name = "vdetper",
|
||||
.swgroup = TEGRA_SWGROUP_VDE,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 5,
|
||||
|
@ -399,30 +454,36 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0xee,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x26,
|
||||
.name = "mpcorelpr",
|
||||
.swgroup = TEGRA_SWGROUP_MPCORELP,
|
||||
.regs = {
|
||||
.la = {
|
||||
.reg = 0x324,
|
||||
.shift = 0,
|
||||
.mask = 0xff,
|
||||
.def = 0x04,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x27,
|
||||
.name = "mpcorer",
|
||||
.swgroup = TEGRA_SWGROUP_MPCORE,
|
||||
.regs = {
|
||||
.la = {
|
||||
.reg = 0x320,
|
||||
.shift = 0,
|
||||
.mask = 0xff,
|
||||
.def = 0x04,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x28,
|
||||
.name = "eppu",
|
||||
.swgroup = TEGRA_SWGROUP_EPP,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 8,
|
||||
|
@ -433,10 +494,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x33,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x29,
|
||||
.name = "eppv",
|
||||
.swgroup = TEGRA_SWGROUP_EPP,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 9,
|
||||
|
@ -447,10 +510,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x6c,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x2a,
|
||||
.name = "eppy",
|
||||
.swgroup = TEGRA_SWGROUP_EPP,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 10,
|
||||
|
@ -461,10 +526,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x6c,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x2b,
|
||||
.name = "msencswr",
|
||||
.swgroup = TEGRA_SWGROUP_MSENC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 11,
|
||||
|
@ -475,10 +542,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x2c,
|
||||
.name = "viwsb",
|
||||
.swgroup = TEGRA_SWGROUP_VI,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 12,
|
||||
|
@ -489,10 +558,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x47,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x2d,
|
||||
.name = "viwu",
|
||||
.swgroup = TEGRA_SWGROUP_VI,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 13,
|
||||
|
@ -503,10 +574,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0xff,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x2e,
|
||||
.name = "viwv",
|
||||
.swgroup = TEGRA_SWGROUP_VI,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 14,
|
||||
|
@ -517,10 +590,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0xff,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x2f,
|
||||
.name = "viwy",
|
||||
.swgroup = TEGRA_SWGROUP_VI,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 15,
|
||||
|
@ -531,10 +606,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x47,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x30,
|
||||
.name = "g2dw",
|
||||
.swgroup = TEGRA_SWGROUP_G2,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 16,
|
||||
|
@ -545,10 +622,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x9,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x32,
|
||||
.name = "avpcarm7w",
|
||||
.swgroup = TEGRA_SWGROUP_AVPC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 18,
|
||||
|
@ -559,10 +638,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x0e,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x33,
|
||||
.name = "fdcdwr",
|
||||
.swgroup = TEGRA_SWGROUP_NV,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 19,
|
||||
|
@ -573,10 +654,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x10,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x34,
|
||||
.name = "fdcdwr2",
|
||||
.swgroup = TEGRA_SWGROUP_NV,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 20,
|
||||
|
@ -587,10 +670,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x10,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x35,
|
||||
.name = "hdaw",
|
||||
.swgroup = TEGRA_SWGROUP_HDA,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 21,
|
||||
|
@ -601,10 +686,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0xff,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x36,
|
||||
.name = "host1xw",
|
||||
.swgroup = TEGRA_SWGROUP_HC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 22,
|
||||
|
@ -615,10 +702,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x25,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x37,
|
||||
.name = "ispw",
|
||||
.swgroup = TEGRA_SWGROUP_ISP,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 23,
|
||||
|
@ -629,30 +718,36 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0xff,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x38,
|
||||
.name = "mpcorelpw",
|
||||
.swgroup = TEGRA_SWGROUP_MPCORELP,
|
||||
.regs = {
|
||||
.la = {
|
||||
.reg = 0x324,
|
||||
.shift = 16,
|
||||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x39,
|
||||
.name = "mpcorew",
|
||||
.swgroup = TEGRA_SWGROUP_MPCORE,
|
||||
.regs = {
|
||||
.la = {
|
||||
.reg = 0x320,
|
||||
.shift = 16,
|
||||
.mask = 0xff,
|
||||
.def = 0x0e,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x3b,
|
||||
.name = "ppcsahbdmaw",
|
||||
.swgroup = TEGRA_SWGROUP_PPCS,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 27,
|
||||
|
@ -663,10 +758,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0xa5,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x3c,
|
||||
.name = "ppcsahbslvw",
|
||||
.swgroup = TEGRA_SWGROUP_PPCS,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 28,
|
||||
|
@ -677,10 +774,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0xe8,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x3e,
|
||||
.name = "vdebsevw",
|
||||
.swgroup = TEGRA_SWGROUP_VDE,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 30,
|
||||
|
@ -691,10 +790,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0xff,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x3f,
|
||||
.name = "vdedbgw",
|
||||
.swgroup = TEGRA_SWGROUP_VDE,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 31,
|
||||
|
@ -705,10 +806,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0xff,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x40,
|
||||
.name = "vdembew",
|
||||
.swgroup = TEGRA_SWGROUP_VDE,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x230,
|
||||
.bit = 0,
|
||||
|
@ -719,10 +822,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x89,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x41,
|
||||
.name = "vdetpmw",
|
||||
.swgroup = TEGRA_SWGROUP_VDE,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x230,
|
||||
.bit = 1,
|
||||
|
@ -733,10 +838,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x59,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x4a,
|
||||
.name = "xusb_hostr",
|
||||
.swgroup = TEGRA_SWGROUP_XUSB_HOST,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x230,
|
||||
.bit = 10,
|
||||
|
@ -747,10 +854,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0xa5,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x4b,
|
||||
.name = "xusb_hostw",
|
||||
.swgroup = TEGRA_SWGROUP_XUSB_HOST,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x230,
|
||||
.bit = 11,
|
||||
|
@ -761,10 +870,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0xa5,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x4c,
|
||||
.name = "xusb_devr",
|
||||
.swgroup = TEGRA_SWGROUP_XUSB_DEV,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x230,
|
||||
.bit = 12,
|
||||
|
@ -775,10 +886,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0xa5,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x4d,
|
||||
.name = "xusb_devw",
|
||||
.swgroup = TEGRA_SWGROUP_XUSB_DEV,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x230,
|
||||
.bit = 13,
|
||||
|
@ -789,10 +902,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0xa5,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x4e,
|
||||
.name = "fdcdwr3",
|
||||
.swgroup = TEGRA_SWGROUP_NV,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x230,
|
||||
.bit = 14,
|
||||
|
@ -803,10 +918,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x10,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x4f,
|
||||
.name = "fdcdrd3",
|
||||
.swgroup = TEGRA_SWGROUP_NV,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x230,
|
||||
.bit = 15,
|
||||
|
@ -817,10 +934,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x0c,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x50,
|
||||
.name = "fdcwr4",
|
||||
.swgroup = TEGRA_SWGROUP_NV,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x230,
|
||||
.bit = 16,
|
||||
|
@ -831,10 +950,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x10,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x51,
|
||||
.name = "fdcrd4",
|
||||
.swgroup = TEGRA_SWGROUP_NV,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x230,
|
||||
.bit = 17,
|
||||
|
@ -845,30 +966,36 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x0c,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x52,
|
||||
.name = "emucifr",
|
||||
.swgroup = TEGRA_SWGROUP_EMUCIF,
|
||||
.regs = {
|
||||
.la = {
|
||||
.reg = 0x38c,
|
||||
.shift = 0,
|
||||
.mask = 0xff,
|
||||
.def = 0x04,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x53,
|
||||
.name = "emucifw",
|
||||
.swgroup = TEGRA_SWGROUP_EMUCIF,
|
||||
.regs = {
|
||||
.la = {
|
||||
.reg = 0x38c,
|
||||
.shift = 16,
|
||||
.mask = 0xff,
|
||||
.def = 0x0e,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x54,
|
||||
.name = "tsecsrd",
|
||||
.swgroup = TEGRA_SWGROUP_TSEC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x230,
|
||||
.bit = 20,
|
||||
|
@ -879,10 +1006,12 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x50,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x55,
|
||||
.name = "tsecswr",
|
||||
.swgroup = TEGRA_SWGROUP_TSEC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x230,
|
||||
.bit = 21,
|
||||
|
@ -894,6 +1023,7 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
|||
.def = 0x50,
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static const struct tegra_smmu_swgroup tegra114_swgroups[] = {
|
||||
|
@ -983,4 +1113,5 @@ const struct tegra_mc_soc tegra114_mc_soc = {
|
|||
.reset_ops = &tegra_mc_reset_ops_common,
|
||||
.resets = tegra114_mc_resets,
|
||||
.num_resets = ARRAY_SIZE(tegra114_mc_resets),
|
||||
.ops = &tegra30_mc_ops,
|
||||
};
|
||||
|
|
|
@ -272,8 +272,8 @@
|
|||
#define EMC_PUTERM_ADJ 0x574
|
||||
|
||||
#define DRAM_DEV_SEL_ALL 0
|
||||
#define DRAM_DEV_SEL_0 (2 << 30)
|
||||
#define DRAM_DEV_SEL_1 (1 << 30)
|
||||
#define DRAM_DEV_SEL_0 BIT(31)
|
||||
#define DRAM_DEV_SEL_1 BIT(30)
|
||||
|
||||
#define EMC_CFG_POWER_FEATURES_MASK \
|
||||
(EMC_CFG_DYN_SREF | EMC_CFG_DRAM_ACPD | EMC_CFG_DRAM_CLKSTOP_SR | \
|
||||
|
@ -1269,10 +1269,6 @@ static void emc_debugfs_init(struct device *dev, struct tegra_emc *emc)
|
|||
}
|
||||
|
||||
emc->debugfs.root = debugfs_create_dir("emc", NULL);
|
||||
if (!emc->debugfs.root) {
|
||||
dev_err(dev, "failed to create debugfs directory\n");
|
||||
return;
|
||||
}
|
||||
|
||||
debugfs_create_file("available_rates", 0444, emc->debugfs.root, emc,
|
||||
&tegra_emc_debug_available_rates_fops);
|
||||
|
|
|
@ -16,16 +16,19 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.id = 0x00,
|
||||
.name = "ptcr",
|
||||
.swgroup = TEGRA_SWGROUP_PTC,
|
||||
.regs = {
|
||||
.la = {
|
||||
.reg = 0x34c,
|
||||
.shift = 0,
|
||||
.mask = 0xff,
|
||||
.def = 0x0,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x01,
|
||||
.name = "display0a",
|
||||
.swgroup = TEGRA_SWGROUP_DC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 1,
|
||||
|
@ -36,10 +39,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0xc2,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x02,
|
||||
.name = "display0ab",
|
||||
.swgroup = TEGRA_SWGROUP_DCB,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 2,
|
||||
|
@ -50,10 +55,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0xc6,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x03,
|
||||
.name = "display0b",
|
||||
.swgroup = TEGRA_SWGROUP_DC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 3,
|
||||
|
@ -64,10 +71,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x50,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x04,
|
||||
.name = "display0bb",
|
||||
.swgroup = TEGRA_SWGROUP_DCB,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 4,
|
||||
|
@ -78,10 +87,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x50,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x05,
|
||||
.name = "display0c",
|
||||
.swgroup = TEGRA_SWGROUP_DC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 5,
|
||||
|
@ -92,10 +103,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x50,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x06,
|
||||
.name = "display0cb",
|
||||
.swgroup = TEGRA_SWGROUP_DCB,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 6,
|
||||
|
@ -106,10 +119,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x50,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x0e,
|
||||
.name = "afir",
|
||||
.swgroup = TEGRA_SWGROUP_AFI,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 14,
|
||||
|
@ -120,10 +135,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x13,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x0f,
|
||||
.name = "avpcarm7r",
|
||||
.swgroup = TEGRA_SWGROUP_AVPC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 15,
|
||||
|
@ -134,10 +151,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x04,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x10,
|
||||
.name = "displayhc",
|
||||
.swgroup = TEGRA_SWGROUP_DC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 16,
|
||||
|
@ -148,10 +167,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x50,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x11,
|
||||
.name = "displayhcb",
|
||||
.swgroup = TEGRA_SWGROUP_DCB,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 17,
|
||||
|
@ -162,10 +183,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x50,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x15,
|
||||
.name = "hdar",
|
||||
.swgroup = TEGRA_SWGROUP_HDA,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 21,
|
||||
|
@ -176,10 +199,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x24,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x16,
|
||||
.name = "host1xdmar",
|
||||
.swgroup = TEGRA_SWGROUP_HC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 22,
|
||||
|
@ -190,10 +215,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x1e,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x17,
|
||||
.name = "host1xr",
|
||||
.swgroup = TEGRA_SWGROUP_HC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 23,
|
||||
|
@ -204,10 +231,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x50,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x1c,
|
||||
.name = "msencsrd",
|
||||
.swgroup = TEGRA_SWGROUP_MSENC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 28,
|
||||
|
@ -218,10 +247,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x23,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x1d,
|
||||
.name = "ppcsahbdmar",
|
||||
.swgroup = TEGRA_SWGROUP_PPCS,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 29,
|
||||
|
@ -232,10 +263,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x49,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x1e,
|
||||
.name = "ppcsahbslvr",
|
||||
.swgroup = TEGRA_SWGROUP_PPCS,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 30,
|
||||
|
@ -246,10 +279,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x1a,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x1f,
|
||||
.name = "satar",
|
||||
.swgroup = TEGRA_SWGROUP_SATA,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 31,
|
||||
|
@ -260,10 +295,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x65,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x22,
|
||||
.name = "vdebsevr",
|
||||
.swgroup = TEGRA_SWGROUP_VDE,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 2,
|
||||
|
@ -274,10 +311,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x4f,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x23,
|
||||
.name = "vdember",
|
||||
.swgroup = TEGRA_SWGROUP_VDE,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 3,
|
||||
|
@ -288,10 +327,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x3d,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x24,
|
||||
.name = "vdemcer",
|
||||
.swgroup = TEGRA_SWGROUP_VDE,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 4,
|
||||
|
@ -302,10 +343,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x66,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x25,
|
||||
.name = "vdetper",
|
||||
.swgroup = TEGRA_SWGROUP_VDE,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 5,
|
||||
|
@ -316,30 +359,36 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0xa5,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x26,
|
||||
.name = "mpcorelpr",
|
||||
.swgroup = TEGRA_SWGROUP_MPCORELP,
|
||||
.regs = {
|
||||
.la = {
|
||||
.reg = 0x324,
|
||||
.shift = 0,
|
||||
.mask = 0xff,
|
||||
.def = 0x04,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x27,
|
||||
.name = "mpcorer",
|
||||
.swgroup = TEGRA_SWGROUP_MPCORE,
|
||||
.regs = {
|
||||
.la = {
|
||||
.reg = 0x320,
|
||||
.shift = 0,
|
||||
.mask = 0xff,
|
||||
.def = 0x04,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x2b,
|
||||
.name = "msencswr",
|
||||
.swgroup = TEGRA_SWGROUP_MSENC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 11,
|
||||
|
@ -350,10 +399,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x31,
|
||||
.name = "afiw",
|
||||
.swgroup = TEGRA_SWGROUP_AFI,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 17,
|
||||
|
@ -364,10 +415,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x32,
|
||||
.name = "avpcarm7w",
|
||||
.swgroup = TEGRA_SWGROUP_AVPC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 18,
|
||||
|
@ -378,10 +431,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x35,
|
||||
.name = "hdaw",
|
||||
.swgroup = TEGRA_SWGROUP_HDA,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 21,
|
||||
|
@ -392,10 +447,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x36,
|
||||
.name = "host1xw",
|
||||
.swgroup = TEGRA_SWGROUP_HC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 22,
|
||||
|
@ -406,30 +463,36 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x38,
|
||||
.name = "mpcorelpw",
|
||||
.swgroup = TEGRA_SWGROUP_MPCORELP,
|
||||
.regs = {
|
||||
.la = {
|
||||
.reg = 0x324,
|
||||
.shift = 16,
|
||||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x39,
|
||||
.name = "mpcorew",
|
||||
.swgroup = TEGRA_SWGROUP_MPCORE,
|
||||
.regs = {
|
||||
.la = {
|
||||
.reg = 0x320,
|
||||
.shift = 16,
|
||||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x3b,
|
||||
.name = "ppcsahbdmaw",
|
||||
.swgroup = TEGRA_SWGROUP_PPCS,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 27,
|
||||
|
@ -440,10 +503,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x3c,
|
||||
.name = "ppcsahbslvw",
|
||||
.swgroup = TEGRA_SWGROUP_PPCS,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 28,
|
||||
|
@ -454,10 +519,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x3d,
|
||||
.name = "sataw",
|
||||
.swgroup = TEGRA_SWGROUP_SATA,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 29,
|
||||
|
@ -468,10 +535,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x65,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x3e,
|
||||
.name = "vdebsevw",
|
||||
.swgroup = TEGRA_SWGROUP_VDE,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 30,
|
||||
|
@ -482,10 +551,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x3f,
|
||||
.name = "vdedbgw",
|
||||
.swgroup = TEGRA_SWGROUP_VDE,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 31,
|
||||
|
@ -496,10 +567,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x40,
|
||||
.name = "vdembew",
|
||||
.swgroup = TEGRA_SWGROUP_VDE,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x230,
|
||||
.bit = 0,
|
||||
|
@ -510,10 +583,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x41,
|
||||
.name = "vdetpmw",
|
||||
.swgroup = TEGRA_SWGROUP_VDE,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x230,
|
||||
.bit = 1,
|
||||
|
@ -524,10 +599,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x44,
|
||||
.name = "ispra",
|
||||
.swgroup = TEGRA_SWGROUP_ISP2,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x230,
|
||||
.bit = 4,
|
||||
|
@ -538,10 +615,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x18,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x46,
|
||||
.name = "ispwa",
|
||||
.swgroup = TEGRA_SWGROUP_ISP2,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x230,
|
||||
.bit = 6,
|
||||
|
@ -552,10 +631,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x47,
|
||||
.name = "ispwb",
|
||||
.swgroup = TEGRA_SWGROUP_ISP2,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x230,
|
||||
.bit = 7,
|
||||
|
@ -566,10 +647,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x4a,
|
||||
.name = "xusb_hostr",
|
||||
.swgroup = TEGRA_SWGROUP_XUSB_HOST,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x230,
|
||||
.bit = 10,
|
||||
|
@ -580,10 +663,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x39,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x4b,
|
||||
.name = "xusb_hostw",
|
||||
.swgroup = TEGRA_SWGROUP_XUSB_HOST,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x230,
|
||||
.bit = 11,
|
||||
|
@ -594,10 +679,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x4c,
|
||||
.name = "xusb_devr",
|
||||
.swgroup = TEGRA_SWGROUP_XUSB_DEV,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x230,
|
||||
.bit = 12,
|
||||
|
@ -608,10 +695,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x39,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x4d,
|
||||
.name = "xusb_devw",
|
||||
.swgroup = TEGRA_SWGROUP_XUSB_DEV,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x230,
|
||||
.bit = 13,
|
||||
|
@ -622,10 +711,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x4e,
|
||||
.name = "isprab",
|
||||
.swgroup = TEGRA_SWGROUP_ISP2B,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x230,
|
||||
.bit = 14,
|
||||
|
@ -636,10 +727,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x18,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x50,
|
||||
.name = "ispwab",
|
||||
.swgroup = TEGRA_SWGROUP_ISP2B,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x230,
|
||||
.bit = 16,
|
||||
|
@ -650,10 +743,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x51,
|
||||
.name = "ispwbb",
|
||||
.swgroup = TEGRA_SWGROUP_ISP2B,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x230,
|
||||
.bit = 17,
|
||||
|
@ -664,10 +759,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x54,
|
||||
.name = "tsecsrd",
|
||||
.swgroup = TEGRA_SWGROUP_TSEC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x230,
|
||||
.bit = 20,
|
||||
|
@ -678,10 +775,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x9b,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x55,
|
||||
.name = "tsecswr",
|
||||
.swgroup = TEGRA_SWGROUP_TSEC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x230,
|
||||
.bit = 21,
|
||||
|
@ -692,10 +791,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x56,
|
||||
.name = "a9avpscr",
|
||||
.swgroup = TEGRA_SWGROUP_A9AVP,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x230,
|
||||
.bit = 22,
|
||||
|
@ -706,10 +807,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x04,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x57,
|
||||
.name = "a9avpscw",
|
||||
.swgroup = TEGRA_SWGROUP_A9AVP,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x230,
|
||||
.bit = 23,
|
||||
|
@ -720,10 +823,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x58,
|
||||
.name = "gpusrd",
|
||||
.swgroup = TEGRA_SWGROUP_GPU,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
/* read-only */
|
||||
.reg = 0x230,
|
||||
|
@ -735,10 +840,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x1a,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x59,
|
||||
.name = "gpuswr",
|
||||
.swgroup = TEGRA_SWGROUP_GPU,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
/* read-only */
|
||||
.reg = 0x230,
|
||||
|
@ -750,10 +857,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x5a,
|
||||
.name = "displayt",
|
||||
.swgroup = TEGRA_SWGROUP_DC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x230,
|
||||
.bit = 26,
|
||||
|
@ -764,10 +873,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x50,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x60,
|
||||
.name = "sdmmcra",
|
||||
.swgroup = TEGRA_SWGROUP_SDMMC1A,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x234,
|
||||
.bit = 0,
|
||||
|
@ -778,10 +889,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x49,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x61,
|
||||
.name = "sdmmcraa",
|
||||
.swgroup = TEGRA_SWGROUP_SDMMC2A,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x234,
|
||||
.bit = 1,
|
||||
|
@ -792,10 +905,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x49,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x62,
|
||||
.name = "sdmmcr",
|
||||
.swgroup = TEGRA_SWGROUP_SDMMC3A,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x234,
|
||||
.bit = 2,
|
||||
|
@ -806,10 +921,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x49,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x63,
|
||||
.swgroup = TEGRA_SWGROUP_SDMMC4A,
|
||||
.name = "sdmmcrab",
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x234,
|
||||
.bit = 3,
|
||||
|
@ -820,10 +937,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x49,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x64,
|
||||
.name = "sdmmcwa",
|
||||
.swgroup = TEGRA_SWGROUP_SDMMC1A,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x234,
|
||||
.bit = 4,
|
||||
|
@ -834,10 +953,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x65,
|
||||
.name = "sdmmcwaa",
|
||||
.swgroup = TEGRA_SWGROUP_SDMMC2A,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x234,
|
||||
.bit = 5,
|
||||
|
@ -848,10 +969,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x66,
|
||||
.name = "sdmmcw",
|
||||
.swgroup = TEGRA_SWGROUP_SDMMC3A,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x234,
|
||||
.bit = 6,
|
||||
|
@ -862,10 +985,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x67,
|
||||
.name = "sdmmcwab",
|
||||
.swgroup = TEGRA_SWGROUP_SDMMC4A,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x234,
|
||||
.bit = 7,
|
||||
|
@ -876,10 +1001,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x6c,
|
||||
.name = "vicsrd",
|
||||
.swgroup = TEGRA_SWGROUP_VIC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x234,
|
||||
.bit = 12,
|
||||
|
@ -890,10 +1017,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x1a,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x6d,
|
||||
.name = "vicswr",
|
||||
.swgroup = TEGRA_SWGROUP_VIC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x234,
|
||||
.bit = 13,
|
||||
|
@ -904,10 +1033,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x72,
|
||||
.name = "viw",
|
||||
.swgroup = TEGRA_SWGROUP_VI,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x234,
|
||||
.bit = 18,
|
||||
|
@ -918,10 +1049,12 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x73,
|
||||
.name = "displayd",
|
||||
.swgroup = TEGRA_SWGROUP_DC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x234,
|
||||
.bit = 19,
|
||||
|
@ -933,6 +1066,7 @@ static const struct tegra_mc_client tegra124_mc_clients[] = {
|
|||
.def = 0x50,
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static const struct tegra_smmu_swgroup tegra124_swgroups[] = {
|
||||
|
@ -1140,6 +1274,7 @@ const struct tegra_mc_soc tegra124_mc_soc = {
|
|||
.resets = tegra124_mc_resets,
|
||||
.num_resets = ARRAY_SIZE(tegra124_mc_resets),
|
||||
.icc_ops = &tegra124_mc_icc_ops,
|
||||
.ops = &tegra30_mc_ops,
|
||||
};
|
||||
#endif /* CONFIG_ARCH_TEGRA_124_SOC */
|
||||
|
||||
|
@ -1171,5 +1306,6 @@ const struct tegra_mc_soc tegra132_mc_soc = {
|
|||
.resets = tegra124_mc_resets,
|
||||
.num_resets = ARRAY_SIZE(tegra124_mc_resets),
|
||||
.icc_ops = &tegra124_mc_icc_ops,
|
||||
.ops = &tegra30_mc_ops,
|
||||
};
|
||||
#endif /* CONFIG_ARCH_TEGRA_132_SOC */
|
||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -776,10 +776,6 @@ static void tegra_emc_debugfs_init(struct tegra_emc *emc)
|
|||
}
|
||||
|
||||
emc->debugfs.root = debugfs_create_dir("emc", NULL);
|
||||
if (!emc->debugfs.root) {
|
||||
dev_err(emc->dev, "failed to create debugfs directory\n");
|
||||
return;
|
||||
}
|
||||
|
||||
debugfs_create_file("available_rates", 0444, emc->debugfs.root,
|
||||
emc, &tegra_emc_debug_available_rates_fops);
|
||||
|
@ -908,49 +904,6 @@ static int tegra_emc_interconnect_init(struct tegra_emc *emc)
|
|||
return err;
|
||||
}
|
||||
|
||||
static int tegra_emc_opp_table_init(struct tegra_emc *emc)
|
||||
{
|
||||
u32 hw_version = BIT(tegra_sku_info.soc_process_id);
|
||||
struct opp_table *hw_opp_table;
|
||||
int err;
|
||||
|
||||
hw_opp_table = dev_pm_opp_set_supported_hw(emc->dev, &hw_version, 1);
|
||||
err = PTR_ERR_OR_ZERO(hw_opp_table);
|
||||
if (err) {
|
||||
dev_err(emc->dev, "failed to set OPP supported HW: %d\n", err);
|
||||
return err;
|
||||
}
|
||||
|
||||
err = dev_pm_opp_of_add_table(emc->dev);
|
||||
if (err) {
|
||||
if (err == -ENODEV)
|
||||
dev_err(emc->dev, "OPP table not found, please update your device tree\n");
|
||||
else
|
||||
dev_err(emc->dev, "failed to add OPP table: %d\n", err);
|
||||
|
||||
goto put_hw_table;
|
||||
}
|
||||
|
||||
dev_info_once(emc->dev, "OPP HW ver. 0x%x, current clock rate %lu MHz\n",
|
||||
hw_version, clk_get_rate(emc->clk) / 1000000);
|
||||
|
||||
/* first dummy rate-set initializes voltage state */
|
||||
err = dev_pm_opp_set_rate(emc->dev, clk_get_rate(emc->clk));
|
||||
if (err) {
|
||||
dev_err(emc->dev, "failed to initialize OPP clock: %d\n", err);
|
||||
goto remove_table;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
remove_table:
|
||||
dev_pm_opp_of_remove_table(emc->dev);
|
||||
put_hw_table:
|
||||
dev_pm_opp_put_supported_hw(hw_opp_table);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static void devm_tegra_emc_unset_callback(void *data)
|
||||
{
|
||||
tegra20_clk_set_emc_round_callback(NULL, NULL);
|
||||
|
@ -1077,6 +1030,7 @@ static int tegra_emc_devfreq_init(struct tegra_emc *emc)
|
|||
|
||||
static int tegra_emc_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct tegra_core_opp_params opp_params = {};
|
||||
struct device_node *np;
|
||||
struct tegra_emc *emc;
|
||||
int irq, err;
|
||||
|
@ -1122,7 +1076,9 @@ static int tegra_emc_probe(struct platform_device *pdev)
|
|||
if (err)
|
||||
return err;
|
||||
|
||||
err = tegra_emc_opp_table_init(emc);
|
||||
opp_params.init_state = true;
|
||||
|
||||
err = devm_tegra_core_dev_init_opp_table(&pdev->dev, &opp_params);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
|
|
|
@ -679,7 +679,7 @@ static int tegra20_mc_stats_show(struct seq_file *s, void *unused)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int tegra20_mc_init(struct tegra_mc *mc)
|
||||
static int tegra20_mc_probe(struct tegra_mc *mc)
|
||||
{
|
||||
debugfs_create_devm_seqfile(mc->dev, "stats", mc->debugfs.root,
|
||||
tegra20_mc_stats_show);
|
||||
|
@ -687,6 +687,112 @@ static int tegra20_mc_init(struct tegra_mc *mc)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int tegra20_mc_suspend(struct tegra_mc *mc)
|
||||
{
|
||||
int err;
|
||||
|
||||
if (IS_ENABLED(CONFIG_TEGRA_IOMMU_GART) && mc->gart) {
|
||||
err = tegra_gart_suspend(mc->gart);
|
||||
if (err < 0)
|
||||
return err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int tegra20_mc_resume(struct tegra_mc *mc)
|
||||
{
|
||||
int err;
|
||||
|
||||
if (IS_ENABLED(CONFIG_TEGRA_IOMMU_GART) && mc->gart) {
|
||||
err = tegra_gart_resume(mc->gart);
|
||||
if (err < 0)
|
||||
return err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static irqreturn_t tegra20_mc_handle_irq(int irq, void *data)
|
||||
{
|
||||
struct tegra_mc *mc = data;
|
||||
unsigned long status;
|
||||
unsigned int bit;
|
||||
|
||||
/* mask all interrupts to avoid flooding */
|
||||
status = mc_readl(mc, MC_INTSTATUS) & mc->soc->intmask;
|
||||
if (!status)
|
||||
return IRQ_NONE;
|
||||
|
||||
for_each_set_bit(bit, &status, 32) {
|
||||
const char *error = tegra_mc_status_names[bit];
|
||||
const char *direction = "read", *secure = "";
|
||||
const char *client, *desc;
|
||||
phys_addr_t addr;
|
||||
u32 value, reg;
|
||||
u8 id, type;
|
||||
|
||||
switch (BIT(bit)) {
|
||||
case MC_INT_DECERR_EMEM:
|
||||
reg = MC_DECERR_EMEM_OTHERS_STATUS;
|
||||
value = mc_readl(mc, reg);
|
||||
|
||||
id = value & mc->soc->client_id_mask;
|
||||
desc = tegra_mc_error_names[2];
|
||||
|
||||
if (value & BIT(31))
|
||||
direction = "write";
|
||||
break;
|
||||
|
||||
case MC_INT_INVALID_GART_PAGE:
|
||||
reg = MC_GART_ERROR_REQ;
|
||||
value = mc_readl(mc, reg);
|
||||
|
||||
id = (value >> 1) & mc->soc->client_id_mask;
|
||||
desc = tegra_mc_error_names[2];
|
||||
|
||||
if (value & BIT(0))
|
||||
direction = "write";
|
||||
break;
|
||||
|
||||
case MC_INT_SECURITY_VIOLATION:
|
||||
reg = MC_SECURITY_VIOLATION_STATUS;
|
||||
value = mc_readl(mc, reg);
|
||||
|
||||
id = value & mc->soc->client_id_mask;
|
||||
type = (value & BIT(30)) ? 4 : 3;
|
||||
desc = tegra_mc_error_names[type];
|
||||
secure = "secure ";
|
||||
|
||||
if (value & BIT(31))
|
||||
direction = "write";
|
||||
break;
|
||||
|
||||
default:
|
||||
continue;
|
||||
}
|
||||
|
||||
client = mc->soc->clients[id].name;
|
||||
addr = mc_readl(mc, reg + sizeof(u32));
|
||||
|
||||
dev_err_ratelimited(mc->dev, "%s: %s%s @%pa: %s (%s)\n",
|
||||
client, secure, direction, &addr, error,
|
||||
desc);
|
||||
}
|
||||
|
||||
/* clear interrupts */
|
||||
mc_writel(mc, status, MC_INTSTATUS);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static const struct tegra_mc_ops tegra20_mc_ops = {
|
||||
.probe = tegra20_mc_probe,
|
||||
.suspend = tegra20_mc_suspend,
|
||||
.resume = tegra20_mc_resume,
|
||||
.handle_irq = tegra20_mc_handle_irq,
|
||||
};
|
||||
|
||||
const struct tegra_mc_soc tegra20_mc_soc = {
|
||||
.clients = tegra20_mc_clients,
|
||||
.num_clients = ARRAY_SIZE(tegra20_mc_clients),
|
||||
|
@ -698,5 +804,5 @@ const struct tegra_mc_soc tegra20_mc_soc = {
|
|||
.resets = tegra20_mc_resets,
|
||||
.num_resets = ARRAY_SIZE(tegra20_mc_resets),
|
||||
.icc_ops = &tegra20_mc_icc_ops,
|
||||
.init = tegra20_mc_init,
|
||||
.ops = &tegra20_mc_ops,
|
||||
};
|
||||
|
|
|
@ -1759,10 +1759,6 @@ static void tegra210_emc_debugfs_init(struct tegra210_emc *emc)
|
|||
}
|
||||
|
||||
emc->debugfs.root = debugfs_create_dir("emc", NULL);
|
||||
if (!emc->debugfs.root) {
|
||||
dev_err(dev, "failed to create debugfs directory\n");
|
||||
return;
|
||||
}
|
||||
|
||||
debugfs_create_file("available_rates", 0444, emc->debugfs.root, emc,
|
||||
&tegra210_emc_debug_available_rates_fops);
|
||||
|
|
|
@ -16,6 +16,7 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.id = 0x01,
|
||||
.name = "display0a",
|
||||
.swgroup = TEGRA_SWGROUP_DC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 1,
|
||||
|
@ -26,10 +27,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x1e,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x02,
|
||||
.name = "display0ab",
|
||||
.swgroup = TEGRA_SWGROUP_DCB,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 2,
|
||||
|
@ -40,10 +43,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x1e,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x03,
|
||||
.name = "display0b",
|
||||
.swgroup = TEGRA_SWGROUP_DC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 3,
|
||||
|
@ -54,10 +59,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x1e,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x04,
|
||||
.name = "display0bb",
|
||||
.swgroup = TEGRA_SWGROUP_DCB,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 4,
|
||||
|
@ -68,10 +75,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x1e,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x05,
|
||||
.name = "display0c",
|
||||
.swgroup = TEGRA_SWGROUP_DC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 5,
|
||||
|
@ -82,10 +91,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x1e,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x06,
|
||||
.name = "display0cb",
|
||||
.swgroup = TEGRA_SWGROUP_DCB,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 6,
|
||||
|
@ -96,10 +107,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x1e,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x0e,
|
||||
.name = "afir",
|
||||
.swgroup = TEGRA_SWGROUP_AFI,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 14,
|
||||
|
@ -110,10 +123,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x2e,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x0f,
|
||||
.name = "avpcarm7r",
|
||||
.swgroup = TEGRA_SWGROUP_AVPC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 15,
|
||||
|
@ -124,10 +139,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x04,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x10,
|
||||
.name = "displayhc",
|
||||
.swgroup = TEGRA_SWGROUP_DC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 16,
|
||||
|
@ -138,10 +155,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x1e,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x11,
|
||||
.name = "displayhcb",
|
||||
.swgroup = TEGRA_SWGROUP_DCB,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 17,
|
||||
|
@ -152,10 +171,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x1e,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x15,
|
||||
.name = "hdar",
|
||||
.swgroup = TEGRA_SWGROUP_HDA,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 21,
|
||||
|
@ -166,10 +187,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x24,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x16,
|
||||
.name = "host1xdmar",
|
||||
.swgroup = TEGRA_SWGROUP_HC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 22,
|
||||
|
@ -180,10 +203,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x1e,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x17,
|
||||
.name = "host1xr",
|
||||
.swgroup = TEGRA_SWGROUP_HC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 23,
|
||||
|
@ -194,10 +219,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x50,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x1c,
|
||||
.name = "nvencsrd",
|
||||
.swgroup = TEGRA_SWGROUP_NVENC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 28,
|
||||
|
@ -208,10 +235,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x23,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x1d,
|
||||
.name = "ppcsahbdmar",
|
||||
.swgroup = TEGRA_SWGROUP_PPCS,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 29,
|
||||
|
@ -222,10 +251,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x49,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x1e,
|
||||
.name = "ppcsahbslvr",
|
||||
.swgroup = TEGRA_SWGROUP_PPCS,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 30,
|
||||
|
@ -236,10 +267,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x1a,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x1f,
|
||||
.name = "satar",
|
||||
.swgroup = TEGRA_SWGROUP_SATA,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 31,
|
||||
|
@ -250,20 +283,24 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x65,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x27,
|
||||
.name = "mpcorer",
|
||||
.swgroup = TEGRA_SWGROUP_MPCORE,
|
||||
.regs = {
|
||||
.la = {
|
||||
.reg = 0x320,
|
||||
.shift = 0,
|
||||
.mask = 0xff,
|
||||
.def = 0x04,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x2b,
|
||||
.name = "nvencswr",
|
||||
.swgroup = TEGRA_SWGROUP_NVENC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 11,
|
||||
|
@ -274,10 +311,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x31,
|
||||
.name = "afiw",
|
||||
.swgroup = TEGRA_SWGROUP_AFI,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 17,
|
||||
|
@ -288,10 +327,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x32,
|
||||
.name = "avpcarm7w",
|
||||
.swgroup = TEGRA_SWGROUP_AVPC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 18,
|
||||
|
@ -302,10 +343,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x35,
|
||||
.name = "hdaw",
|
||||
.swgroup = TEGRA_SWGROUP_HDA,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 21,
|
||||
|
@ -316,10 +359,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x36,
|
||||
.name = "host1xw",
|
||||
.swgroup = TEGRA_SWGROUP_HC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 22,
|
||||
|
@ -330,20 +375,24 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x39,
|
||||
.name = "mpcorew",
|
||||
.swgroup = TEGRA_SWGROUP_MPCORE,
|
||||
.regs = {
|
||||
.la = {
|
||||
.reg = 0x320,
|
||||
.shift = 16,
|
||||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x3b,
|
||||
.name = "ppcsahbdmaw",
|
||||
.swgroup = TEGRA_SWGROUP_PPCS,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 27,
|
||||
|
@ -354,10 +403,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x3c,
|
||||
.name = "ppcsahbslvw",
|
||||
.swgroup = TEGRA_SWGROUP_PPCS,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 28,
|
||||
|
@ -368,10 +419,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x3d,
|
||||
.name = "sataw",
|
||||
.swgroup = TEGRA_SWGROUP_SATA,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 29,
|
||||
|
@ -382,10 +435,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x44,
|
||||
.name = "ispra",
|
||||
.swgroup = TEGRA_SWGROUP_ISP2,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x230,
|
||||
.bit = 4,
|
||||
|
@ -396,10 +451,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x18,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x46,
|
||||
.name = "ispwa",
|
||||
.swgroup = TEGRA_SWGROUP_ISP2,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x230,
|
||||
.bit = 6,
|
||||
|
@ -410,10 +467,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x47,
|
||||
.name = "ispwb",
|
||||
.swgroup = TEGRA_SWGROUP_ISP2,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x230,
|
||||
.bit = 7,
|
||||
|
@ -424,10 +483,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x4a,
|
||||
.name = "xusb_hostr",
|
||||
.swgroup = TEGRA_SWGROUP_XUSB_HOST,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x230,
|
||||
.bit = 10,
|
||||
|
@ -438,10 +499,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x7a,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x4b,
|
||||
.name = "xusb_hostw",
|
||||
.swgroup = TEGRA_SWGROUP_XUSB_HOST,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x230,
|
||||
.bit = 11,
|
||||
|
@ -452,10 +515,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x4c,
|
||||
.name = "xusb_devr",
|
||||
.swgroup = TEGRA_SWGROUP_XUSB_DEV,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x230,
|
||||
.bit = 12,
|
||||
|
@ -466,10 +531,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x39,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x4d,
|
||||
.name = "xusb_devw",
|
||||
.swgroup = TEGRA_SWGROUP_XUSB_DEV,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x230,
|
||||
.bit = 13,
|
||||
|
@ -480,10 +547,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x4e,
|
||||
.name = "isprab",
|
||||
.swgroup = TEGRA_SWGROUP_ISP2B,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x230,
|
||||
.bit = 14,
|
||||
|
@ -494,10 +563,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x18,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x50,
|
||||
.name = "ispwab",
|
||||
.swgroup = TEGRA_SWGROUP_ISP2B,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x230,
|
||||
.bit = 16,
|
||||
|
@ -508,10 +579,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x51,
|
||||
.name = "ispwbb",
|
||||
.swgroup = TEGRA_SWGROUP_ISP2B,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x230,
|
||||
.bit = 17,
|
||||
|
@ -522,10 +595,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x54,
|
||||
.name = "tsecsrd",
|
||||
.swgroup = TEGRA_SWGROUP_TSEC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x230,
|
||||
.bit = 20,
|
||||
|
@ -536,10 +611,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x9b,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x55,
|
||||
.name = "tsecswr",
|
||||
.swgroup = TEGRA_SWGROUP_TSEC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x230,
|
||||
.bit = 21,
|
||||
|
@ -550,10 +627,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x56,
|
||||
.name = "a9avpscr",
|
||||
.swgroup = TEGRA_SWGROUP_A9AVP,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x230,
|
||||
.bit = 22,
|
||||
|
@ -564,10 +643,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x04,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x57,
|
||||
.name = "a9avpscw",
|
||||
.swgroup = TEGRA_SWGROUP_A9AVP,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x230,
|
||||
.bit = 23,
|
||||
|
@ -578,10 +659,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x58,
|
||||
.name = "gpusrd",
|
||||
.swgroup = TEGRA_SWGROUP_GPU,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
/* read-only */
|
||||
.reg = 0x230,
|
||||
|
@ -593,10 +676,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x1a,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x59,
|
||||
.name = "gpuswr",
|
||||
.swgroup = TEGRA_SWGROUP_GPU,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
/* read-only */
|
||||
.reg = 0x230,
|
||||
|
@ -608,10 +693,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x5a,
|
||||
.name = "displayt",
|
||||
.swgroup = TEGRA_SWGROUP_DC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x230,
|
||||
.bit = 26,
|
||||
|
@ -622,10 +709,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x1e,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x60,
|
||||
.name = "sdmmcra",
|
||||
.swgroup = TEGRA_SWGROUP_SDMMC1A,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x234,
|
||||
.bit = 0,
|
||||
|
@ -636,10 +725,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x49,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x61,
|
||||
.name = "sdmmcraa",
|
||||
.swgroup = TEGRA_SWGROUP_SDMMC2A,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x234,
|
||||
.bit = 1,
|
||||
|
@ -650,10 +741,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x5a,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x62,
|
||||
.name = "sdmmcr",
|
||||
.swgroup = TEGRA_SWGROUP_SDMMC3A,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x234,
|
||||
.bit = 2,
|
||||
|
@ -664,10 +757,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x49,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x63,
|
||||
.swgroup = TEGRA_SWGROUP_SDMMC4A,
|
||||
.name = "sdmmcrab",
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x234,
|
||||
.bit = 3,
|
||||
|
@ -678,10 +773,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x5a,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x64,
|
||||
.name = "sdmmcwa",
|
||||
.swgroup = TEGRA_SWGROUP_SDMMC1A,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x234,
|
||||
.bit = 4,
|
||||
|
@ -692,10 +789,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x65,
|
||||
.name = "sdmmcwaa",
|
||||
.swgroup = TEGRA_SWGROUP_SDMMC2A,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x234,
|
||||
.bit = 5,
|
||||
|
@ -706,10 +805,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x66,
|
||||
.name = "sdmmcw",
|
||||
.swgroup = TEGRA_SWGROUP_SDMMC3A,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x234,
|
||||
.bit = 6,
|
||||
|
@ -720,10 +821,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x67,
|
||||
.name = "sdmmcwab",
|
||||
.swgroup = TEGRA_SWGROUP_SDMMC4A,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x234,
|
||||
.bit = 7,
|
||||
|
@ -734,10 +837,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x6c,
|
||||
.name = "vicsrd",
|
||||
.swgroup = TEGRA_SWGROUP_VIC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x234,
|
||||
.bit = 12,
|
||||
|
@ -748,10 +853,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x1a,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x6d,
|
||||
.name = "vicswr",
|
||||
.swgroup = TEGRA_SWGROUP_VIC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x234,
|
||||
.bit = 13,
|
||||
|
@ -762,10 +869,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x72,
|
||||
.name = "viw",
|
||||
.swgroup = TEGRA_SWGROUP_VI,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x234,
|
||||
.bit = 18,
|
||||
|
@ -776,10 +885,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x73,
|
||||
.name = "displayd",
|
||||
.swgroup = TEGRA_SWGROUP_DC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x234,
|
||||
.bit = 19,
|
||||
|
@ -790,10 +901,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x50,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x78,
|
||||
.name = "nvdecsrd",
|
||||
.swgroup = TEGRA_SWGROUP_NVDEC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x234,
|
||||
.bit = 24,
|
||||
|
@ -804,10 +917,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x23,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x79,
|
||||
.name = "nvdecswr",
|
||||
.swgroup = TEGRA_SWGROUP_NVDEC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x234,
|
||||
.bit = 25,
|
||||
|
@ -818,10 +933,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x7a,
|
||||
.name = "aper",
|
||||
.swgroup = TEGRA_SWGROUP_APE,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x234,
|
||||
.bit = 26,
|
||||
|
@ -832,10 +949,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0xff,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x7b,
|
||||
.name = "apew",
|
||||
.swgroup = TEGRA_SWGROUP_APE,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x234,
|
||||
.bit = 27,
|
||||
|
@ -846,10 +965,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x7e,
|
||||
.name = "nvjpgsrd",
|
||||
.swgroup = TEGRA_SWGROUP_NVJPG,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x234,
|
||||
.bit = 30,
|
||||
|
@ -860,10 +981,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x23,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x7f,
|
||||
.name = "nvjpgswr",
|
||||
.swgroup = TEGRA_SWGROUP_NVJPG,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x234,
|
||||
.bit = 31,
|
||||
|
@ -874,10 +997,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x80,
|
||||
.name = "sesrd",
|
||||
.swgroup = TEGRA_SWGROUP_SE,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0xb98,
|
||||
.bit = 0,
|
||||
|
@ -888,10 +1013,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x2e,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x81,
|
||||
.name = "seswr",
|
||||
.swgroup = TEGRA_SWGROUP_SE,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0xb98,
|
||||
.bit = 1,
|
||||
|
@ -902,10 +1029,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x82,
|
||||
.name = "axiapr",
|
||||
.swgroup = TEGRA_SWGROUP_AXIAP,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0xb98,
|
||||
.bit = 2,
|
||||
|
@ -916,10 +1045,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0xff,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x83,
|
||||
.name = "axiapw",
|
||||
.swgroup = TEGRA_SWGROUP_AXIAP,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0xb98,
|
||||
.bit = 3,
|
||||
|
@ -930,10 +1061,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x84,
|
||||
.name = "etrr",
|
||||
.swgroup = TEGRA_SWGROUP_ETR,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0xb98,
|
||||
.bit = 4,
|
||||
|
@ -944,10 +1077,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0xff,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x85,
|
||||
.name = "etrw",
|
||||
.swgroup = TEGRA_SWGROUP_ETR,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0xb98,
|
||||
.bit = 5,
|
||||
|
@ -958,10 +1093,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x86,
|
||||
.name = "tsecsrdb",
|
||||
.swgroup = TEGRA_SWGROUP_TSECB,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0xb98,
|
||||
.bit = 6,
|
||||
|
@ -972,10 +1109,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x9b,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x87,
|
||||
.name = "tsecswrb",
|
||||
.swgroup = TEGRA_SWGROUP_TSECB,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0xb98,
|
||||
.bit = 7,
|
||||
|
@ -986,10 +1125,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x88,
|
||||
.name = "gpusrd2",
|
||||
.swgroup = TEGRA_SWGROUP_GPU,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
/* read-only */
|
||||
.reg = 0xb98,
|
||||
|
@ -1001,10 +1142,12 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x1a,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
.id = 0x89,
|
||||
.name = "gpuswr2",
|
||||
.swgroup = TEGRA_SWGROUP_GPU,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
/* read-only */
|
||||
.reg = 0xb98,
|
||||
|
@ -1017,6 +1160,7 @@ static const struct tegra_mc_client tegra210_mc_clients[] = {
|
|||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static const struct tegra_smmu_swgroup tegra210_swgroups[] = {
|
||||
|
@ -1142,4 +1286,5 @@ const struct tegra_mc_soc tegra210_mc_soc = {
|
|||
.reset_ops = &tegra_mc_reset_ops_common,
|
||||
.resets = tegra210_mc_resets,
|
||||
.num_resets = ARRAY_SIZE(tegra210_mc_resets),
|
||||
.ops = &tegra30_mc_ops,
|
||||
};
|
||||
|
|
|
@ -150,8 +150,8 @@
|
|||
#define EMC_SELF_REF_CMD_ENABLED BIT(0)
|
||||
|
||||
#define DRAM_DEV_SEL_ALL (0 << 30)
|
||||
#define DRAM_DEV_SEL_0 (2 << 30)
|
||||
#define DRAM_DEV_SEL_1 (1 << 30)
|
||||
#define DRAM_DEV_SEL_0 BIT(31)
|
||||
#define DRAM_DEV_SEL_1 BIT(30)
|
||||
#define DRAM_BROADCAST(num) \
|
||||
((num) > 1 ? DRAM_DEV_SEL_ALL : DRAM_DEV_SEL_0)
|
||||
|
||||
|
@ -1354,10 +1354,6 @@ static void tegra_emc_debugfs_init(struct tegra_emc *emc)
|
|||
}
|
||||
|
||||
emc->debugfs.root = debugfs_create_dir("emc", NULL);
|
||||
if (!emc->debugfs.root) {
|
||||
dev_err(emc->dev, "failed to create debugfs directory\n");
|
||||
return;
|
||||
}
|
||||
|
||||
debugfs_create_file("available_rates", 0444, emc->debugfs.root,
|
||||
emc, &tegra_emc_debug_available_rates_fops);
|
||||
|
@ -1480,49 +1476,6 @@ static int tegra_emc_interconnect_init(struct tegra_emc *emc)
|
|||
return err;
|
||||
}
|
||||
|
||||
static int tegra_emc_opp_table_init(struct tegra_emc *emc)
|
||||
{
|
||||
u32 hw_version = BIT(tegra_sku_info.soc_speedo_id);
|
||||
struct opp_table *hw_opp_table;
|
||||
int err;
|
||||
|
||||
hw_opp_table = dev_pm_opp_set_supported_hw(emc->dev, &hw_version, 1);
|
||||
err = PTR_ERR_OR_ZERO(hw_opp_table);
|
||||
if (err) {
|
||||
dev_err(emc->dev, "failed to set OPP supported HW: %d\n", err);
|
||||
return err;
|
||||
}
|
||||
|
||||
err = dev_pm_opp_of_add_table(emc->dev);
|
||||
if (err) {
|
||||
if (err == -ENODEV)
|
||||
dev_err(emc->dev, "OPP table not found, please update your device tree\n");
|
||||
else
|
||||
dev_err(emc->dev, "failed to add OPP table: %d\n", err);
|
||||
|
||||
goto put_hw_table;
|
||||
}
|
||||
|
||||
dev_info_once(emc->dev, "OPP HW ver. 0x%x, current clock rate %lu MHz\n",
|
||||
hw_version, clk_get_rate(emc->clk) / 1000000);
|
||||
|
||||
/* first dummy rate-set initializes voltage state */
|
||||
err = dev_pm_opp_set_rate(emc->dev, clk_get_rate(emc->clk));
|
||||
if (err) {
|
||||
dev_err(emc->dev, "failed to initialize OPP clock: %d\n", err);
|
||||
goto remove_table;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
remove_table:
|
||||
dev_pm_opp_of_remove_table(emc->dev);
|
||||
put_hw_table:
|
||||
dev_pm_opp_put_supported_hw(hw_opp_table);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static void devm_tegra_emc_unset_callback(void *data)
|
||||
{
|
||||
tegra20_clk_set_emc_round_callback(NULL, NULL);
|
||||
|
@ -1568,6 +1521,7 @@ static int tegra_emc_init_clk(struct tegra_emc *emc)
|
|||
|
||||
static int tegra_emc_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct tegra_core_opp_params opp_params = {};
|
||||
struct device_node *np;
|
||||
struct tegra_emc *emc;
|
||||
int err;
|
||||
|
@ -1617,7 +1571,9 @@ static int tegra_emc_probe(struct platform_device *pdev)
|
|||
if (err)
|
||||
return err;
|
||||
|
||||
err = tegra_emc_opp_table_init(emc);
|
||||
opp_params.init_state = true;
|
||||
|
||||
err = devm_tegra_core_dev_init_opp_table(&pdev->dev, &opp_params);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
|
|
|
@ -37,17 +37,20 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.id = 0x00,
|
||||
.name = "ptcr",
|
||||
.swgroup = TEGRA_SWGROUP_PTC,
|
||||
.regs = {
|
||||
.la = {
|
||||
.reg = 0x34c,
|
||||
.shift = 0,
|
||||
.mask = 0xff,
|
||||
.def = 0x0,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 2,
|
||||
}, {
|
||||
.id = 0x01,
|
||||
.name = "display0a",
|
||||
.swgroup = TEGRA_SWGROUP_DC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 1,
|
||||
|
@ -58,11 +61,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x4e,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 128,
|
||||
}, {
|
||||
.id = 0x02,
|
||||
.name = "display0ab",
|
||||
.swgroup = TEGRA_SWGROUP_DCB,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 2,
|
||||
|
@ -73,11 +78,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x4e,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 128,
|
||||
}, {
|
||||
.id = 0x03,
|
||||
.name = "display0b",
|
||||
.swgroup = TEGRA_SWGROUP_DC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 3,
|
||||
|
@ -88,11 +95,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x4e,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 64,
|
||||
}, {
|
||||
.id = 0x04,
|
||||
.name = "display0bb",
|
||||
.swgroup = TEGRA_SWGROUP_DCB,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 4,
|
||||
|
@ -103,11 +112,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x4e,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 64,
|
||||
}, {
|
||||
.id = 0x05,
|
||||
.name = "display0c",
|
||||
.swgroup = TEGRA_SWGROUP_DC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 5,
|
||||
|
@ -118,11 +129,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x4e,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 128,
|
||||
}, {
|
||||
.id = 0x06,
|
||||
.name = "display0cb",
|
||||
.swgroup = TEGRA_SWGROUP_DCB,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 6,
|
||||
|
@ -133,11 +146,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x4e,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 128,
|
||||
}, {
|
||||
.id = 0x07,
|
||||
.name = "display1b",
|
||||
.swgroup = TEGRA_SWGROUP_DC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 7,
|
||||
|
@ -148,11 +163,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x4e,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 64,
|
||||
}, {
|
||||
.id = 0x08,
|
||||
.name = "display1bb",
|
||||
.swgroup = TEGRA_SWGROUP_DCB,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 8,
|
||||
|
@ -163,11 +180,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x4e,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 64,
|
||||
}, {
|
||||
.id = 0x09,
|
||||
.name = "eppup",
|
||||
.swgroup = TEGRA_SWGROUP_EPP,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 9,
|
||||
|
@ -178,11 +197,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x17,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 8,
|
||||
}, {
|
||||
.id = 0x0a,
|
||||
.name = "g2pr",
|
||||
.swgroup = TEGRA_SWGROUP_G2,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 10,
|
||||
|
@ -193,11 +214,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x09,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 64,
|
||||
}, {
|
||||
.id = 0x0b,
|
||||
.name = "g2sr",
|
||||
.swgroup = TEGRA_SWGROUP_G2,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 11,
|
||||
|
@ -208,11 +231,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x09,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 64,
|
||||
}, {
|
||||
.id = 0x0c,
|
||||
.name = "mpeunifbr",
|
||||
.swgroup = TEGRA_SWGROUP_MPE,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 12,
|
||||
|
@ -223,11 +248,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x50,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 8,
|
||||
}, {
|
||||
.id = 0x0d,
|
||||
.name = "viruv",
|
||||
.swgroup = TEGRA_SWGROUP_VI,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 13,
|
||||
|
@ -238,11 +265,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x2c,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 8,
|
||||
}, {
|
||||
.id = 0x0e,
|
||||
.name = "afir",
|
||||
.swgroup = TEGRA_SWGROUP_AFI,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 14,
|
||||
|
@ -253,11 +282,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x10,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 32,
|
||||
}, {
|
||||
.id = 0x0f,
|
||||
.name = "avpcarm7r",
|
||||
.swgroup = TEGRA_SWGROUP_AVPC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 15,
|
||||
|
@ -268,11 +299,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x04,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 2,
|
||||
}, {
|
||||
.id = 0x10,
|
||||
.name = "displayhc",
|
||||
.swgroup = TEGRA_SWGROUP_DC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 16,
|
||||
|
@ -283,11 +316,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0xff,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 2,
|
||||
}, {
|
||||
.id = 0x11,
|
||||
.name = "displayhcb",
|
||||
.swgroup = TEGRA_SWGROUP_DCB,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 17,
|
||||
|
@ -298,11 +333,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0xff,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 2,
|
||||
}, {
|
||||
.id = 0x12,
|
||||
.name = "fdcdrd",
|
||||
.swgroup = TEGRA_SWGROUP_NV,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 18,
|
||||
|
@ -313,11 +350,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x0a,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 48,
|
||||
}, {
|
||||
.id = 0x13,
|
||||
.name = "fdcdrd2",
|
||||
.swgroup = TEGRA_SWGROUP_NV2,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 19,
|
||||
|
@ -328,11 +367,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x0a,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 48,
|
||||
}, {
|
||||
.id = 0x14,
|
||||
.name = "g2dr",
|
||||
.swgroup = TEGRA_SWGROUP_G2,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 20,
|
||||
|
@ -343,11 +384,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x0a,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 48,
|
||||
}, {
|
||||
.id = 0x15,
|
||||
.name = "hdar",
|
||||
.swgroup = TEGRA_SWGROUP_HDA,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 21,
|
||||
|
@ -358,11 +401,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0xff,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 16,
|
||||
}, {
|
||||
.id = 0x16,
|
||||
.name = "host1xdmar",
|
||||
.swgroup = TEGRA_SWGROUP_HC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 22,
|
||||
|
@ -373,11 +418,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x05,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 16,
|
||||
}, {
|
||||
.id = 0x17,
|
||||
.name = "host1xr",
|
||||
.swgroup = TEGRA_SWGROUP_HC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 23,
|
||||
|
@ -388,11 +435,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x50,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 8,
|
||||
}, {
|
||||
.id = 0x18,
|
||||
.name = "idxsrd",
|
||||
.swgroup = TEGRA_SWGROUP_NV,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 24,
|
||||
|
@ -403,11 +452,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x13,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 64,
|
||||
}, {
|
||||
.id = 0x19,
|
||||
.name = "idxsrd2",
|
||||
.swgroup = TEGRA_SWGROUP_NV2,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 25,
|
||||
|
@ -418,11 +469,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x13,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 64,
|
||||
}, {
|
||||
.id = 0x1a,
|
||||
.name = "mpe_ipred",
|
||||
.swgroup = TEGRA_SWGROUP_MPE,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 26,
|
||||
|
@ -433,11 +486,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x80,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 2,
|
||||
}, {
|
||||
.id = 0x1b,
|
||||
.name = "mpeamemrd",
|
||||
.swgroup = TEGRA_SWGROUP_MPE,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 27,
|
||||
|
@ -448,11 +503,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x42,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 64,
|
||||
}, {
|
||||
.id = 0x1c,
|
||||
.name = "mpecsrd",
|
||||
.swgroup = TEGRA_SWGROUP_MPE,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 28,
|
||||
|
@ -463,11 +520,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0xff,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 8,
|
||||
}, {
|
||||
.id = 0x1d,
|
||||
.name = "ppcsahbdmar",
|
||||
.swgroup = TEGRA_SWGROUP_PPCS,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 29,
|
||||
|
@ -478,11 +537,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x10,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 2,
|
||||
}, {
|
||||
.id = 0x1e,
|
||||
.name = "ppcsahbslvr",
|
||||
.swgroup = TEGRA_SWGROUP_PPCS,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 30,
|
||||
|
@ -493,11 +554,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x12,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 8,
|
||||
}, {
|
||||
.id = 0x1f,
|
||||
.name = "satar",
|
||||
.swgroup = TEGRA_SWGROUP_SATA,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x228,
|
||||
.bit = 31,
|
||||
|
@ -508,11 +571,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x33,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 32,
|
||||
}, {
|
||||
.id = 0x20,
|
||||
.name = "texsrd",
|
||||
.swgroup = TEGRA_SWGROUP_NV,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 0,
|
||||
|
@ -523,11 +588,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x13,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 64,
|
||||
}, {
|
||||
.id = 0x21,
|
||||
.name = "texsrd2",
|
||||
.swgroup = TEGRA_SWGROUP_NV2,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 1,
|
||||
|
@ -538,11 +605,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x13,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 64,
|
||||
}, {
|
||||
.id = 0x22,
|
||||
.name = "vdebsevr",
|
||||
.swgroup = TEGRA_SWGROUP_VDE,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 2,
|
||||
|
@ -553,11 +622,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0xff,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 8,
|
||||
}, {
|
||||
.id = 0x23,
|
||||
.name = "vdember",
|
||||
.swgroup = TEGRA_SWGROUP_VDE,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 3,
|
||||
|
@ -568,11 +639,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0xd0,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 4,
|
||||
}, {
|
||||
.id = 0x24,
|
||||
.name = "vdemcer",
|
||||
.swgroup = TEGRA_SWGROUP_VDE,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 4,
|
||||
|
@ -583,11 +656,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x2a,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 16,
|
||||
}, {
|
||||
.id = 0x25,
|
||||
.name = "vdetper",
|
||||
.swgroup = TEGRA_SWGROUP_VDE,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 5,
|
||||
|
@ -598,33 +673,39 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x74,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 16,
|
||||
}, {
|
||||
.id = 0x26,
|
||||
.name = "mpcorelpr",
|
||||
.swgroup = TEGRA_SWGROUP_MPCORELP,
|
||||
.regs = {
|
||||
.la = {
|
||||
.reg = 0x324,
|
||||
.shift = 0,
|
||||
.mask = 0xff,
|
||||
.def = 0x04,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 14,
|
||||
}, {
|
||||
.id = 0x27,
|
||||
.name = "mpcorer",
|
||||
.swgroup = TEGRA_SWGROUP_MPCORE,
|
||||
.regs = {
|
||||
.la = {
|
||||
.reg = 0x320,
|
||||
.shift = 0,
|
||||
.mask = 0xff,
|
||||
.def = 0x04,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 14,
|
||||
}, {
|
||||
.id = 0x28,
|
||||
.name = "eppu",
|
||||
.swgroup = TEGRA_SWGROUP_EPP,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 8,
|
||||
|
@ -635,11 +716,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x6c,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 64,
|
||||
}, {
|
||||
.id = 0x29,
|
||||
.name = "eppv",
|
||||
.swgroup = TEGRA_SWGROUP_EPP,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 9,
|
||||
|
@ -650,11 +733,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x6c,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 64,
|
||||
}, {
|
||||
.id = 0x2a,
|
||||
.name = "eppy",
|
||||
.swgroup = TEGRA_SWGROUP_EPP,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 10,
|
||||
|
@ -665,11 +750,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x6c,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 64,
|
||||
}, {
|
||||
.id = 0x2b,
|
||||
.name = "mpeunifbw",
|
||||
.swgroup = TEGRA_SWGROUP_MPE,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 11,
|
||||
|
@ -680,11 +767,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x13,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 8,
|
||||
}, {
|
||||
.id = 0x2c,
|
||||
.name = "viwsb",
|
||||
.swgroup = TEGRA_SWGROUP_VI,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 12,
|
||||
|
@ -695,11 +784,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x12,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 64,
|
||||
}, {
|
||||
.id = 0x2d,
|
||||
.name = "viwu",
|
||||
.swgroup = TEGRA_SWGROUP_VI,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 13,
|
||||
|
@ -710,11 +801,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0xb2,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 64,
|
||||
}, {
|
||||
.id = 0x2e,
|
||||
.name = "viwv",
|
||||
.swgroup = TEGRA_SWGROUP_VI,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 14,
|
||||
|
@ -725,11 +818,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0xb2,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 64,
|
||||
}, {
|
||||
.id = 0x2f,
|
||||
.name = "viwy",
|
||||
.swgroup = TEGRA_SWGROUP_VI,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 15,
|
||||
|
@ -740,11 +835,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x12,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 64,
|
||||
}, {
|
||||
.id = 0x30,
|
||||
.name = "g2dw",
|
||||
.swgroup = TEGRA_SWGROUP_G2,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 16,
|
||||
|
@ -755,11 +852,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x9,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 128,
|
||||
}, {
|
||||
.id = 0x31,
|
||||
.name = "afiw",
|
||||
.swgroup = TEGRA_SWGROUP_AFI,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 17,
|
||||
|
@ -770,11 +869,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x0c,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 32,
|
||||
}, {
|
||||
.id = 0x32,
|
||||
.name = "avpcarm7w",
|
||||
.swgroup = TEGRA_SWGROUP_AVPC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 18,
|
||||
|
@ -785,11 +886,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x0e,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 2,
|
||||
}, {
|
||||
.id = 0x33,
|
||||
.name = "fdcdwr",
|
||||
.swgroup = TEGRA_SWGROUP_NV,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 19,
|
||||
|
@ -800,11 +903,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x0a,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 48,
|
||||
}, {
|
||||
.id = 0x34,
|
||||
.name = "fdcdwr2",
|
||||
.swgroup = TEGRA_SWGROUP_NV2,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 20,
|
||||
|
@ -815,11 +920,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x0a,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 48,
|
||||
}, {
|
||||
.id = 0x35,
|
||||
.name = "hdaw",
|
||||
.swgroup = TEGRA_SWGROUP_HDA,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 21,
|
||||
|
@ -830,11 +937,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0xff,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 16,
|
||||
}, {
|
||||
.id = 0x36,
|
||||
.name = "host1xw",
|
||||
.swgroup = TEGRA_SWGROUP_HC,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 22,
|
||||
|
@ -845,11 +954,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x10,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 32,
|
||||
}, {
|
||||
.id = 0x37,
|
||||
.name = "ispw",
|
||||
.swgroup = TEGRA_SWGROUP_ISP,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 23,
|
||||
|
@ -860,33 +971,39 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0xff,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 64,
|
||||
}, {
|
||||
.id = 0x38,
|
||||
.name = "mpcorelpw",
|
||||
.swgroup = TEGRA_SWGROUP_MPCORELP,
|
||||
.regs = {
|
||||
.la = {
|
||||
.reg = 0x324,
|
||||
.shift = 16,
|
||||
.mask = 0xff,
|
||||
.def = 0x0e,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 24,
|
||||
}, {
|
||||
.id = 0x39,
|
||||
.name = "mpcorew",
|
||||
.swgroup = TEGRA_SWGROUP_MPCORE,
|
||||
.regs = {
|
||||
.la = {
|
||||
.reg = 0x320,
|
||||
.shift = 16,
|
||||
.mask = 0xff,
|
||||
.def = 0x0e,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 24,
|
||||
}, {
|
||||
.id = 0x3a,
|
||||
.name = "mpecswr",
|
||||
.swgroup = TEGRA_SWGROUP_MPE,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 26,
|
||||
|
@ -897,11 +1014,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0xff,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 8,
|
||||
}, {
|
||||
.id = 0x3b,
|
||||
.name = "ppcsahbdmaw",
|
||||
.swgroup = TEGRA_SWGROUP_PPCS,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 27,
|
||||
|
@ -912,11 +1031,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x10,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 2,
|
||||
}, {
|
||||
.id = 0x3c,
|
||||
.name = "ppcsahbslvw",
|
||||
.swgroup = TEGRA_SWGROUP_PPCS,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 28,
|
||||
|
@ -927,11 +1048,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x06,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 4,
|
||||
}, {
|
||||
.id = 0x3d,
|
||||
.name = "sataw",
|
||||
.swgroup = TEGRA_SWGROUP_SATA,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 29,
|
||||
|
@ -942,11 +1065,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x33,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 32,
|
||||
}, {
|
||||
.id = 0x3e,
|
||||
.name = "vdebsevw",
|
||||
.swgroup = TEGRA_SWGROUP_VDE,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 30,
|
||||
|
@ -957,11 +1082,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0xff,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 4,
|
||||
}, {
|
||||
.id = 0x3f,
|
||||
.name = "vdedbgw",
|
||||
.swgroup = TEGRA_SWGROUP_VDE,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
.bit = 31,
|
||||
|
@ -972,11 +1099,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0xff,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 16,
|
||||
}, {
|
||||
.id = 0x40,
|
||||
.name = "vdembew",
|
||||
.swgroup = TEGRA_SWGROUP_VDE,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x230,
|
||||
.bit = 0,
|
||||
|
@ -987,11 +1116,13 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x42,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 2,
|
||||
}, {
|
||||
.id = 0x41,
|
||||
.name = "vdetpmw",
|
||||
.swgroup = TEGRA_SWGROUP_VDE,
|
||||
.regs = {
|
||||
.smmu = {
|
||||
.reg = 0x230,
|
||||
.bit = 1,
|
||||
|
@ -1002,6 +1133,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
|||
.mask = 0xff,
|
||||
.def = 0x2a,
|
||||
},
|
||||
},
|
||||
.fifo_size = 16 * 16,
|
||||
},
|
||||
};
|
||||
|
@ -1089,7 +1221,6 @@ static void tegra30_mc_tune_client_latency(struct tegra_mc *mc,
|
|||
unsigned int bandwidth_mbytes_sec)
|
||||
{
|
||||
u32 arb_tolerance_compensation_nsec, arb_tolerance_compensation_div;
|
||||
const struct tegra_mc_la *la = &client->la;
|
||||
unsigned int fifo_size = client->fifo_size;
|
||||
u32 arb_nsec, la_ticks, value;
|
||||
|
||||
|
@ -1149,12 +1280,12 @@ static void tegra30_mc_tune_client_latency(struct tegra_mc *mc,
|
|||
* request.
|
||||
*/
|
||||
la_ticks = arb_nsec / mc->tick;
|
||||
la_ticks = min(la_ticks, la->mask);
|
||||
la_ticks = min(la_ticks, client->regs.la.mask);
|
||||
|
||||
value = mc_readl(mc, la->reg);
|
||||
value &= ~(la->mask << la->shift);
|
||||
value |= la_ticks << la->shift;
|
||||
mc_writel(mc, value, la->reg);
|
||||
value = mc_readl(mc, client->regs.la.reg);
|
||||
value &= ~(client->regs.la.mask << client->regs.la.shift);
|
||||
value |= la_ticks << client->regs.la.shift;
|
||||
mc_writel(mc, value, client->regs.la.reg);
|
||||
}
|
||||
|
||||
static int tegra30_mc_icc_set(struct icc_node *src, struct icc_node *dst)
|
||||
|
@ -1268,4 +1399,5 @@ const struct tegra_mc_soc tegra30_mc_soc = {
|
|||
.resets = tegra30_mc_resets,
|
||||
.num_resets = ARRAY_SIZE(tegra30_mc_resets),
|
||||
.icc_ops = &tegra30_mc_icc_ops,
|
||||
.ops = &tegra30_mc_ops,
|
||||
};
|
||||
|
|
|
@ -4105,6 +4105,29 @@ int regulator_set_voltage_time_sel(struct regulator_dev *rdev,
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(regulator_set_voltage_time_sel);
|
||||
|
||||
int regulator_sync_voltage_rdev(struct regulator_dev *rdev)
|
||||
{
|
||||
int ret;
|
||||
|
||||
regulator_lock(rdev);
|
||||
|
||||
if (!rdev->desc->ops->set_voltage &&
|
||||
!rdev->desc->ops->set_voltage_sel) {
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* balance only, if regulator is coupled */
|
||||
if (rdev->coupling_desc.n_coupled > 1)
|
||||
ret = regulator_balance_voltage(rdev, PM_SUSPEND_ON);
|
||||
else
|
||||
ret = -EOPNOTSUPP;
|
||||
|
||||
out:
|
||||
regulator_unlock(rdev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* regulator_sync_voltage - re-apply last regulator output voltage
|
||||
* @regulator: regulator source
|
||||
|
|
|
@ -3,9 +3,16 @@
|
|||
* Copyright (C) 2014 NVIDIA CORPORATION. All rights reserved.
|
||||
*/
|
||||
|
||||
#define dev_fmt(fmt) "tegra-soc: " fmt
|
||||
|
||||
#include <linux/clk.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/pm_opp.h>
|
||||
|
||||
#include <soc/tegra/common.h>
|
||||
#include <soc/tegra/fuse.h>
|
||||
|
||||
static const struct of_device_id tegra_machine_match[] = {
|
||||
{ .compatible = "nvidia,tegra20", },
|
||||
|
@ -31,3 +38,93 @@ bool soc_is_tegra(void)
|
|||
|
||||
return match != NULL;
|
||||
}
|
||||
|
||||
static int tegra_core_dev_init_opp_state(struct device *dev)
|
||||
{
|
||||
unsigned long rate;
|
||||
struct clk *clk;
|
||||
int err;
|
||||
|
||||
clk = devm_clk_get(dev, NULL);
|
||||
if (IS_ERR(clk)) {
|
||||
dev_err(dev, "failed to get clk: %pe\n", clk);
|
||||
return PTR_ERR(clk);
|
||||
}
|
||||
|
||||
rate = clk_get_rate(clk);
|
||||
if (!rate) {
|
||||
dev_err(dev, "failed to get clk rate\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* first dummy rate-setting initializes voltage vote */
|
||||
err = dev_pm_opp_set_rate(dev, rate);
|
||||
if (err) {
|
||||
dev_err(dev, "failed to initialize OPP clock: %d\n", err);
|
||||
return err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* devm_tegra_core_dev_init_opp_table() - initialize OPP table
|
||||
* @dev: device for which OPP table is initialized
|
||||
* @params: pointer to the OPP table configuration
|
||||
*
|
||||
* This function will initialize OPP table and sync OPP state of a Tegra SoC
|
||||
* core device.
|
||||
*
|
||||
* Return: 0 on success or errorno.
|
||||
*/
|
||||
int devm_tegra_core_dev_init_opp_table(struct device *dev,
|
||||
struct tegra_core_opp_params *params)
|
||||
{
|
||||
u32 hw_version;
|
||||
int err;
|
||||
|
||||
err = devm_pm_opp_set_clkname(dev, NULL);
|
||||
if (err) {
|
||||
dev_err(dev, "failed to set OPP clk: %d\n", err);
|
||||
return err;
|
||||
}
|
||||
|
||||
/* Tegra114+ doesn't support OPP yet */
|
||||
if (!of_machine_is_compatible("nvidia,tegra20") &&
|
||||
!of_machine_is_compatible("nvidia,tegra30"))
|
||||
return -ENODEV;
|
||||
|
||||
if (of_machine_is_compatible("nvidia,tegra20"))
|
||||
hw_version = BIT(tegra_sku_info.soc_process_id);
|
||||
else
|
||||
hw_version = BIT(tegra_sku_info.soc_speedo_id);
|
||||
|
||||
err = devm_pm_opp_set_supported_hw(dev, &hw_version, 1);
|
||||
if (err) {
|
||||
dev_err(dev, "failed to set OPP supported HW: %d\n", err);
|
||||
return err;
|
||||
}
|
||||
|
||||
/*
|
||||
* Older device-trees have an empty OPP table, we will get
|
||||
* -ENODEV from devm_pm_opp_of_add_table() in this case.
|
||||
*/
|
||||
err = devm_pm_opp_of_add_table(dev);
|
||||
if (err) {
|
||||
if (err == -ENODEV)
|
||||
dev_err_once(dev, "OPP table not found, please update device-tree\n");
|
||||
else
|
||||
dev_err(dev, "failed to add OPP table: %d\n", err);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
if (params->init_state) {
|
||||
err = tegra_core_dev_init_opp_state(dev);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devm_tegra_core_dev_init_opp_table);
|
||||
|
|
|
@ -743,11 +743,6 @@ static int tegra_powergate_enable_clocks(struct tegra_powergate *pg)
|
|||
return err;
|
||||
}
|
||||
|
||||
int __weak tegra210_clk_handle_mbist_war(unsigned int id)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int tegra_powergate_power_up(struct tegra_powergate *pg,
|
||||
bool disable_clocks)
|
||||
{
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/reboot.h>
|
||||
#include <linux/regulator/coupler.h>
|
||||
#include <linux/regulator/driver.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
|
@ -21,7 +22,10 @@ struct tegra_regulator_coupler {
|
|||
struct regulator_dev *core_rdev;
|
||||
struct regulator_dev *cpu_rdev;
|
||||
struct regulator_dev *rtc_rdev;
|
||||
int core_min_uV;
|
||||
struct notifier_block reboot_notifier;
|
||||
int core_min_uV, cpu_min_uV;
|
||||
bool sys_reboot_mode_req;
|
||||
bool sys_reboot_mode;
|
||||
};
|
||||
|
||||
static inline struct tegra_regulator_coupler *
|
||||
|
@ -242,6 +246,10 @@ static int tegra20_cpu_voltage_update(struct tegra_regulator_coupler *tegra,
|
|||
if (cpu_uV < 0)
|
||||
return cpu_uV;
|
||||
|
||||
/* store boot voltage level */
|
||||
if (!tegra->cpu_min_uV)
|
||||
tegra->cpu_min_uV = cpu_uV;
|
||||
|
||||
/*
|
||||
* CPU's regulator may not have any consumers, hence the voltage
|
||||
* must not be changed in that case because CPU simply won't
|
||||
|
@ -250,6 +258,10 @@ static int tegra20_cpu_voltage_update(struct tegra_regulator_coupler *tegra,
|
|||
if (!cpu_min_uV_consumers)
|
||||
cpu_min_uV = cpu_uV;
|
||||
|
||||
/* restore boot voltage level */
|
||||
if (tegra->sys_reboot_mode)
|
||||
cpu_min_uV = max(cpu_min_uV, tegra->cpu_min_uV);
|
||||
|
||||
if (cpu_min_uV > cpu_uV) {
|
||||
err = tegra20_core_rtc_update(tegra, core_rdev, rtc_rdev,
|
||||
cpu_uV, cpu_min_uV);
|
||||
|
@ -290,6 +302,8 @@ static int tegra20_regulator_balance_voltage(struct regulator_coupler *coupler,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
tegra->sys_reboot_mode = READ_ONCE(tegra->sys_reboot_mode_req);
|
||||
|
||||
if (rdev == cpu_rdev)
|
||||
return tegra20_cpu_voltage_update(tegra, cpu_rdev,
|
||||
core_rdev, rtc_rdev);
|
||||
|
@ -303,6 +317,51 @@ static int tegra20_regulator_balance_voltage(struct regulator_coupler *coupler,
|
|||
return -EPERM;
|
||||
}
|
||||
|
||||
static int tegra20_regulator_prepare_reboot(struct tegra_regulator_coupler *tegra,
|
||||
bool sys_reboot_mode)
|
||||
{
|
||||
int err;
|
||||
|
||||
if (!tegra->core_rdev || !tegra->rtc_rdev || !tegra->cpu_rdev)
|
||||
return 0;
|
||||
|
||||
WRITE_ONCE(tegra->sys_reboot_mode_req, true);
|
||||
|
||||
/*
|
||||
* Some devices use CPU soft-reboot method and in this case we
|
||||
* should ensure that voltages are sane for the reboot by restoring
|
||||
* the minimum boot levels.
|
||||
*/
|
||||
err = regulator_sync_voltage_rdev(tegra->cpu_rdev);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = regulator_sync_voltage_rdev(tegra->core_rdev);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
WRITE_ONCE(tegra->sys_reboot_mode_req, sys_reboot_mode);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int tegra20_regulator_reboot(struct notifier_block *notifier,
|
||||
unsigned long event, void *cmd)
|
||||
{
|
||||
struct tegra_regulator_coupler *tegra;
|
||||
int ret;
|
||||
|
||||
if (event != SYS_RESTART)
|
||||
return NOTIFY_DONE;
|
||||
|
||||
tegra = container_of(notifier, struct tegra_regulator_coupler,
|
||||
reboot_notifier);
|
||||
|
||||
ret = tegra20_regulator_prepare_reboot(tegra, true);
|
||||
|
||||
return notifier_from_errno(ret);
|
||||
}
|
||||
|
||||
static int tegra20_regulator_attach(struct regulator_coupler *coupler,
|
||||
struct regulator_dev *rdev)
|
||||
{
|
||||
|
@ -335,6 +394,14 @@ static int tegra20_regulator_detach(struct regulator_coupler *coupler,
|
|||
{
|
||||
struct tegra_regulator_coupler *tegra = to_tegra_coupler(coupler);
|
||||
|
||||
/*
|
||||
* We don't expect regulators to be decoupled during reboot,
|
||||
* this may race with the reboot handler and shouldn't ever
|
||||
* happen in practice.
|
||||
*/
|
||||
if (WARN_ON_ONCE(system_state > SYSTEM_RUNNING))
|
||||
return -EPERM;
|
||||
|
||||
if (tegra->core_rdev == rdev) {
|
||||
tegra->core_rdev = NULL;
|
||||
return 0;
|
||||
|
@ -359,13 +426,19 @@ static struct tegra_regulator_coupler tegra20_coupler = {
|
|||
.detach_regulator = tegra20_regulator_detach,
|
||||
.balance_voltage = tegra20_regulator_balance_voltage,
|
||||
},
|
||||
.reboot_notifier.notifier_call = tegra20_regulator_reboot,
|
||||
};
|
||||
|
||||
static int __init tegra_regulator_coupler_init(void)
|
||||
{
|
||||
int err;
|
||||
|
||||
if (!of_machine_is_compatible("nvidia,tegra20"))
|
||||
return 0;
|
||||
|
||||
err = register_reboot_notifier(&tegra20_coupler.reboot_notifier);
|
||||
WARN_ON(err);
|
||||
|
||||
return regulator_coupler_register(&tegra20_coupler.coupler);
|
||||
}
|
||||
arch_initcall(tegra_regulator_coupler_init);
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/reboot.h>
|
||||
#include <linux/regulator/coupler.h>
|
||||
#include <linux/regulator/driver.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
|
@ -22,7 +23,10 @@ struct tegra_regulator_coupler {
|
|||
struct regulator_coupler coupler;
|
||||
struct regulator_dev *core_rdev;
|
||||
struct regulator_dev *cpu_rdev;
|
||||
int core_min_uV;
|
||||
struct notifier_block reboot_notifier;
|
||||
int core_min_uV, cpu_min_uV;
|
||||
bool sys_reboot_mode_req;
|
||||
bool sys_reboot_mode;
|
||||
};
|
||||
|
||||
static inline struct tegra_regulator_coupler *
|
||||
|
@ -172,6 +176,10 @@ static int tegra30_voltage_update(struct tegra_regulator_coupler *tegra,
|
|||
if (cpu_uV < 0)
|
||||
return cpu_uV;
|
||||
|
||||
/* store boot voltage level */
|
||||
if (!tegra->cpu_min_uV)
|
||||
tegra->cpu_min_uV = cpu_uV;
|
||||
|
||||
/*
|
||||
* CPU's regulator may not have any consumers, hence the voltage
|
||||
* must not be changed in that case because CPU simply won't
|
||||
|
@ -195,6 +203,10 @@ static int tegra30_voltage_update(struct tegra_regulator_coupler *tegra,
|
|||
if (err)
|
||||
return err;
|
||||
|
||||
/* restore boot voltage level */
|
||||
if (tegra->sys_reboot_mode)
|
||||
cpu_min_uV = max(cpu_min_uV, tegra->cpu_min_uV);
|
||||
|
||||
if (core_min_limited_uV > core_uV) {
|
||||
pr_err("core voltage constraint violated: %d %d %d\n",
|
||||
core_uV, core_min_limited_uV, cpu_uV);
|
||||
|
@ -263,9 +275,56 @@ static int tegra30_regulator_balance_voltage(struct regulator_coupler *coupler,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
tegra->sys_reboot_mode = READ_ONCE(tegra->sys_reboot_mode_req);
|
||||
|
||||
return tegra30_voltage_update(tegra, cpu_rdev, core_rdev);
|
||||
}
|
||||
|
||||
static int tegra30_regulator_prepare_reboot(struct tegra_regulator_coupler *tegra,
|
||||
bool sys_reboot_mode)
|
||||
{
|
||||
int err;
|
||||
|
||||
if (!tegra->core_rdev || !tegra->cpu_rdev)
|
||||
return 0;
|
||||
|
||||
WRITE_ONCE(tegra->sys_reboot_mode_req, true);
|
||||
|
||||
/*
|
||||
* Some devices use CPU soft-reboot method and in this case we
|
||||
* should ensure that voltages are sane for the reboot by restoring
|
||||
* the minimum boot levels.
|
||||
*/
|
||||
err = regulator_sync_voltage_rdev(tegra->cpu_rdev);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = regulator_sync_voltage_rdev(tegra->core_rdev);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
WRITE_ONCE(tegra->sys_reboot_mode_req, sys_reboot_mode);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int tegra30_regulator_reboot(struct notifier_block *notifier,
|
||||
unsigned long event, void *cmd)
|
||||
{
|
||||
struct tegra_regulator_coupler *tegra;
|
||||
int ret;
|
||||
|
||||
if (event != SYS_RESTART)
|
||||
return NOTIFY_DONE;
|
||||
|
||||
tegra = container_of(notifier, struct tegra_regulator_coupler,
|
||||
reboot_notifier);
|
||||
|
||||
ret = tegra30_regulator_prepare_reboot(tegra, true);
|
||||
|
||||
return notifier_from_errno(ret);
|
||||
}
|
||||
|
||||
static int tegra30_regulator_attach(struct regulator_coupler *coupler,
|
||||
struct regulator_dev *rdev)
|
||||
{
|
||||
|
@ -292,6 +351,14 @@ static int tegra30_regulator_detach(struct regulator_coupler *coupler,
|
|||
{
|
||||
struct tegra_regulator_coupler *tegra = to_tegra_coupler(coupler);
|
||||
|
||||
/*
|
||||
* We don't expect regulators to be decoupled during reboot,
|
||||
* this may race with the reboot handler and shouldn't ever
|
||||
* happen in practice.
|
||||
*/
|
||||
if (WARN_ON_ONCE(system_state > SYSTEM_RUNNING))
|
||||
return -EPERM;
|
||||
|
||||
if (tegra->core_rdev == rdev) {
|
||||
tegra->core_rdev = NULL;
|
||||
return 0;
|
||||
|
@ -311,13 +378,19 @@ static struct tegra_regulator_coupler tegra30_coupler = {
|
|||
.detach_regulator = tegra30_regulator_detach,
|
||||
.balance_voltage = tegra30_regulator_balance_voltage,
|
||||
},
|
||||
.reboot_notifier.notifier_call = tegra30_regulator_reboot,
|
||||
};
|
||||
|
||||
static int __init tegra_regulator_coupler_init(void)
|
||||
{
|
||||
int err;
|
||||
|
||||
if (!of_machine_is_compatible("nvidia,tegra30"))
|
||||
return 0;
|
||||
|
||||
err = register_reboot_notifier(&tegra30_coupler.reboot_notifier);
|
||||
WARN_ON(err);
|
||||
|
||||
return regulator_coupler_register(&tegra30_coupler.coupler);
|
||||
}
|
||||
arch_initcall(tegra_regulator_coupler_init);
|
||||
|
|
|
@ -123,20 +123,6 @@ static inline void tegra_cpu_clock_resume(void)
|
|||
}
|
||||
#endif
|
||||
|
||||
extern int tegra210_plle_hw_sequence_start(void);
|
||||
extern bool tegra210_plle_hw_sequence_is_enabled(void);
|
||||
extern void tegra210_xusb_pll_hw_control_enable(void);
|
||||
extern void tegra210_xusb_pll_hw_sequence_start(void);
|
||||
extern void tegra210_sata_pll_hw_control_enable(void);
|
||||
extern void tegra210_sata_pll_hw_sequence_start(void);
|
||||
extern void tegra210_set_sata_pll_seq_sw(bool state);
|
||||
extern void tegra210_put_utmipll_in_iddq(void);
|
||||
extern void tegra210_put_utmipll_out_iddq(void);
|
||||
extern int tegra210_clk_handle_mbist_war(unsigned int id);
|
||||
extern void tegra210_clk_emc_dll_enable(bool flag);
|
||||
extern void tegra210_clk_emc_dll_update_setting(u32 emc_dll_src_value);
|
||||
extern void tegra210_clk_emc_update_setting(u32 emc_src_value);
|
||||
|
||||
struct clk;
|
||||
struct tegra_emc;
|
||||
|
||||
|
@ -144,17 +130,10 @@ typedef long (tegra20_clk_emc_round_cb)(unsigned long rate,
|
|||
unsigned long min_rate,
|
||||
unsigned long max_rate,
|
||||
void *arg);
|
||||
|
||||
void tegra20_clk_set_emc_round_callback(tegra20_clk_emc_round_cb *round_cb,
|
||||
void *cb_arg);
|
||||
int tegra20_clk_prepare_emc_mc_same_freq(struct clk *emc_clk, bool same);
|
||||
|
||||
typedef int (tegra124_emc_prepare_timing_change_cb)(struct tegra_emc *emc,
|
||||
unsigned long rate);
|
||||
typedef void (tegra124_emc_complete_timing_change_cb)(struct tegra_emc *emc,
|
||||
unsigned long rate);
|
||||
void tegra124_clk_set_emc_callbacks(tegra124_emc_prepare_timing_change_cb *prep_cb,
|
||||
tegra124_emc_complete_timing_change_cb *complete_cb);
|
||||
|
||||
struct tegra210_clk_emc_config {
|
||||
unsigned long rate;
|
||||
|
@ -176,8 +155,87 @@ struct tegra210_clk_emc_provider {
|
|||
const struct tegra210_clk_emc_config *config);
|
||||
};
|
||||
|
||||
#if defined(CONFIG_ARCH_TEGRA_2x_SOC) || defined(CONFIG_ARCH_TEGRA_3x_SOC)
|
||||
void tegra20_clk_set_emc_round_callback(tegra20_clk_emc_round_cb *round_cb,
|
||||
void *cb_arg);
|
||||
int tegra20_clk_prepare_emc_mc_same_freq(struct clk *emc_clk, bool same);
|
||||
#else
|
||||
static inline void
|
||||
tegra20_clk_set_emc_round_callback(tegra20_clk_emc_round_cb *round_cb,
|
||||
void *cb_arg)
|
||||
{
|
||||
}
|
||||
|
||||
static inline int
|
||||
tegra20_clk_prepare_emc_mc_same_freq(struct clk *emc_clk, bool same)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_TEGRA124_CLK_EMC
|
||||
void tegra124_clk_set_emc_callbacks(tegra124_emc_prepare_timing_change_cb *prep_cb,
|
||||
tegra124_emc_complete_timing_change_cb *complete_cb);
|
||||
#else
|
||||
static inline void
|
||||
tegra124_clk_set_emc_callbacks(tegra124_emc_prepare_timing_change_cb *prep_cb,
|
||||
tegra124_emc_complete_timing_change_cb *complete_cb)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ARCH_TEGRA_210_SOC
|
||||
int tegra210_plle_hw_sequence_start(void);
|
||||
bool tegra210_plle_hw_sequence_is_enabled(void);
|
||||
void tegra210_xusb_pll_hw_control_enable(void);
|
||||
void tegra210_xusb_pll_hw_sequence_start(void);
|
||||
void tegra210_sata_pll_hw_control_enable(void);
|
||||
void tegra210_sata_pll_hw_sequence_start(void);
|
||||
void tegra210_set_sata_pll_seq_sw(bool state);
|
||||
void tegra210_put_utmipll_in_iddq(void);
|
||||
void tegra210_put_utmipll_out_iddq(void);
|
||||
int tegra210_clk_handle_mbist_war(unsigned int id);
|
||||
void tegra210_clk_emc_dll_enable(bool flag);
|
||||
void tegra210_clk_emc_dll_update_setting(u32 emc_dll_src_value);
|
||||
void tegra210_clk_emc_update_setting(u32 emc_src_value);
|
||||
|
||||
int tegra210_clk_emc_attach(struct clk *clk,
|
||||
struct tegra210_clk_emc_provider *provider);
|
||||
void tegra210_clk_emc_detach(struct clk *clk);
|
||||
#else
|
||||
static inline int tegra210_plle_hw_sequence_start(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline bool tegra210_plle_hw_sequence_is_enabled(void)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline int tegra210_clk_handle_mbist_war(unsigned int id)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
tegra210_clk_emc_attach(struct clk *clk,
|
||||
struct tegra210_clk_emc_provider *provider)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void tegra210_xusb_pll_hw_control_enable(void) {}
|
||||
static inline void tegra210_xusb_pll_hw_sequence_start(void) {}
|
||||
static inline void tegra210_sata_pll_hw_control_enable(void) {}
|
||||
static inline void tegra210_sata_pll_hw_sequence_start(void) {}
|
||||
static inline void tegra210_set_sata_pll_seq_sw(bool state) {}
|
||||
static inline void tegra210_put_utmipll_in_iddq(void) {}
|
||||
static inline void tegra210_put_utmipll_out_iddq(void) {}
|
||||
static inline void tegra210_clk_emc_dll_enable(bool flag) {}
|
||||
static inline void tegra210_clk_emc_dll_update_setting(u32 emc_dll_src_value) {}
|
||||
static inline void tegra210_clk_emc_update_setting(u32 emc_src_value) {}
|
||||
static inline void tegra210_clk_emc_detach(struct clk *clk) {}
|
||||
#endif
|
||||
|
||||
#endif /* __LINUX_CLK_TEGRA_H_ */
|
||||
|
|
|
@ -540,6 +540,7 @@ int regulator_set_current_limit_regmap(struct regulator_dev *rdev,
|
|||
int regulator_get_current_limit_regmap(struct regulator_dev *rdev);
|
||||
void *regulator_get_init_drvdata(struct regulator_init_data *reg_init_data);
|
||||
int regulator_set_ramp_delay_regmap(struct regulator_dev *rdev, int ramp_delay);
|
||||
int regulator_sync_voltage_rdev(struct regulator_dev *rdev);
|
||||
|
||||
/*
|
||||
* Helper functions intended to be used by regulator drivers prior registering
|
||||
|
|
|
@ -6,6 +6,37 @@
|
|||
#ifndef __SOC_TEGRA_COMMON_H__
|
||||
#define __SOC_TEGRA_COMMON_H__
|
||||
|
||||
#include <linux/errno.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
struct device;
|
||||
|
||||
/**
|
||||
* Tegra SoC core device OPP table configuration
|
||||
*
|
||||
* @init_state: pre-initialize OPP state of a device
|
||||
*/
|
||||
struct tegra_core_opp_params {
|
||||
bool init_state;
|
||||
};
|
||||
|
||||
#ifdef CONFIG_ARCH_TEGRA
|
||||
bool soc_is_tegra(void);
|
||||
|
||||
int devm_tegra_core_dev_init_opp_table(struct device *dev,
|
||||
struct tegra_core_opp_params *params);
|
||||
#else
|
||||
static inline bool soc_is_tegra(void)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline int
|
||||
devm_tegra_core_dev_init_opp_table(struct device *dev,
|
||||
struct tegra_core_opp_params *params)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __SOC_TEGRA_COMMON_H__ */
|
||||
|
|
|
@ -52,14 +52,28 @@ struct tegra_sku_info {
|
|||
enum tegra_revision revision;
|
||||
};
|
||||
|
||||
#ifdef CONFIG_ARCH_TEGRA
|
||||
extern struct tegra_sku_info tegra_sku_info;
|
||||
u32 tegra_read_straps(void);
|
||||
u32 tegra_read_ram_code(void);
|
||||
int tegra_fuse_readl(unsigned long offset, u32 *value);
|
||||
|
||||
#ifdef CONFIG_ARCH_TEGRA
|
||||
extern struct tegra_sku_info tegra_sku_info;
|
||||
#else
|
||||
static struct tegra_sku_info tegra_sku_info __maybe_unused;
|
||||
|
||||
static inline u32 tegra_read_straps(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline u32 tegra_read_ram_code(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int tegra_fuse_readl(unsigned long offset, u32 *value)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
#endif
|
||||
|
||||
struct device *tegra_soc_device_register(void);
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
#include <linux/debugfs.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/interconnect-provider.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/reset-controller.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
|
@ -17,34 +18,48 @@ struct clk;
|
|||
struct device;
|
||||
struct page;
|
||||
|
||||
struct tegra_smmu_enable {
|
||||
unsigned int reg;
|
||||
unsigned int bit;
|
||||
};
|
||||
|
||||
struct tegra_mc_timing {
|
||||
unsigned long rate;
|
||||
|
||||
u32 *emem_data;
|
||||
};
|
||||
|
||||
struct tegra_mc_client {
|
||||
unsigned int id;
|
||||
const char *name;
|
||||
/*
|
||||
* For Tegra210 and earlier, this is the SWGROUP ID used for IOVA translations in the
|
||||
* Tegra SMMU, whereas on Tegra186 and later this is the ID used to override the ARM SMMU
|
||||
* stream ID used for IOVA translations for the given memory client.
|
||||
*/
|
||||
union {
|
||||
unsigned int swgroup;
|
||||
unsigned int sid;
|
||||
};
|
||||
|
||||
unsigned int fifo_size;
|
||||
|
||||
struct {
|
||||
/* Tegra SMMU enable (Tegra210 and earlier) */
|
||||
struct {
|
||||
unsigned int reg;
|
||||
unsigned int bit;
|
||||
} smmu;
|
||||
|
||||
/* latency allowance */
|
||||
struct tegra_mc_la {
|
||||
struct {
|
||||
unsigned int reg;
|
||||
unsigned int shift;
|
||||
unsigned int mask;
|
||||
unsigned int def;
|
||||
};
|
||||
} la;
|
||||
|
||||
struct tegra_mc_client {
|
||||
unsigned int id;
|
||||
const char *name;
|
||||
unsigned int swgroup;
|
||||
|
||||
unsigned int fifo_size;
|
||||
|
||||
struct tegra_smmu_enable smmu;
|
||||
struct tegra_mc_la la;
|
||||
/* stream ID overrides (Tegra186 and later) */
|
||||
struct {
|
||||
unsigned int override;
|
||||
unsigned int security;
|
||||
} sid;
|
||||
} regs;
|
||||
};
|
||||
|
||||
struct tegra_smmu_swgroup {
|
||||
|
@ -155,6 +170,19 @@ struct tegra_mc_icc_ops {
|
|||
void *data);
|
||||
};
|
||||
|
||||
struct tegra_mc_ops {
|
||||
/*
|
||||
* @probe: Callback to set up SoC-specific bits of the memory controller. This is called
|
||||
* after basic, common set up that is done by the SoC-agnostic bits.
|
||||
*/
|
||||
int (*probe)(struct tegra_mc *mc);
|
||||
void (*remove)(struct tegra_mc *mc);
|
||||
int (*suspend)(struct tegra_mc *mc);
|
||||
int (*resume)(struct tegra_mc *mc);
|
||||
irqreturn_t (*handle_irq)(int irq, void *data);
|
||||
int (*probe_device)(struct tegra_mc *mc, struct device *dev);
|
||||
};
|
||||
|
||||
struct tegra_mc_soc {
|
||||
const struct tegra_mc_client *clients;
|
||||
unsigned int num_clients;
|
||||
|
@ -176,8 +204,7 @@ struct tegra_mc_soc {
|
|||
unsigned int num_resets;
|
||||
|
||||
const struct tegra_mc_icc_ops *icc_ops;
|
||||
|
||||
int (*init)(struct tegra_mc *mc);
|
||||
const struct tegra_mc_ops *ops;
|
||||
};
|
||||
|
||||
struct tegra_mc {
|
||||
|
@ -218,4 +245,6 @@ devm_tegra_memory_controller_get(struct device *dev)
|
|||
}
|
||||
#endif
|
||||
|
||||
int tegra_mc_probe_device(struct tegra_mc *mc, struct device *dev);
|
||||
|
||||
#endif /* __SOC_TEGRA_MC_H__ */
|
||||
|
|
Loading…
Reference in New Issue