mirror of
https://github.com/torvalds/linux.git
synced 2024-11-15 08:31:55 +00:00
memory: tegra: Changes for v5.2-rc1
These are a set of fixes for various issues related to the Tegra memory controller. -----BEGIN PGP SIGNATURE----- iQJHBAABCAAxFiEEiOrDCAFJzPfAjcif3SOs138+s6EFAly4jYoTHHRyZWRpbmdA bnZpZGlhLmNvbQAKCRDdI6zXfz6zoY47EACwjSLcEnX9tITvctAtZlXoWNhgPA4l hrBUCylLD4zzgY/9tWmmdgu0/bCWKRtr/mox4LRna3etUEQZVs/R010yx+3rNS5z qSKfdMfMWWjd8FFQknIKkrpQuoctyGdsE5IhKr4g5aHc9/alPFW6StJw90Llygrw li2/2yx4X7Lj4ywRBY6P480BOpCmwClKmeQhM85HQaISgYdYiDcO5EdqTtZNvhz6 CzyV9Iv2fOgxIeBkrqI5J2Xyc3c3bxzkgzB8JJ8rTelUFGeTFyobwiXEDqjPc4cc K+7hUll+en1DppkOJvuzJFzDRmbA1Nuov23bbD/WhGm9InjcI99JHjdJVeGizT1d 0HWTxorQ0/LzXJo8//W7qCGTKI9Jmdyi+0l1SJlOP7uUOYuPRfHIZCz9ZgCzLEKq zttp6xYmVIaAM2Bm7a+92tLV5tgxEG4tcWWnI6lsaKd5giNJet6+luEV10Ey6Hg6 +rqI3TG6RbqoaBWtDxGWo5Yk4QKm8q/poIXWyo1fi566+WlVVJIZrXptZPxYF62h AjSKASrkw3jKFmnPKv30G/zb/I7NVbUe2VyDcch3arw+Eml4O07DziAbvfXddkkp 5zjX+r0/ZnLBftBJLgSjmn68kU45+G0Do9PBfDnuKtkzeQJBmBg6dVpHsUfGs0VH KbbBLCu7DftNDQ== =C+Vy -----END PGP SIGNATURE----- Merge tag 'tegra-for-5.2-memory' of git://git.kernel.org/pub/scm/linux/kernel/git/tegra/linux into arm/drivers memory: tegra: Changes for v5.2-rc1 These are a set of fixes for various issues related to the Tegra memory controller. * tag 'tegra-for-5.2-memory' of git://git.kernel.org/pub/scm/linux/kernel/git/tegra/linux: memory: tegra: Fix a typos for "fdcdwr2" mc client Revert "ARM: tegra: Restore memory arbitration on resume from LP1 on Tegra30+" memory: tegra: Replace readl-writel with mc_readl-mc_writel memory: tegra: Fix integer overflow on tick value calculation memory: tegra: Fix missed registers values latching memory: tegra: Properly spell "tegra" memory: tegra: Make terga20_mc_reset_ops static Signed-off-by: Olof Johansson <olof@lixom.net>
This commit is contained in:
commit
2195471254
@ -79,24 +79,15 @@
|
||||
#define TEGRA_PMC_BASE 0x7000E400
|
||||
#define TEGRA_PMC_SIZE SZ_256
|
||||
|
||||
#define TEGRA_MC_BASE 0x7000F000
|
||||
#define TEGRA_MC_SIZE SZ_1K
|
||||
|
||||
#define TEGRA_EMC_BASE 0x7000F400
|
||||
#define TEGRA_EMC_SIZE SZ_1K
|
||||
|
||||
#define TEGRA114_MC_BASE 0x70019000
|
||||
#define TEGRA114_MC_SIZE SZ_4K
|
||||
|
||||
#define TEGRA_EMC0_BASE 0x7001A000
|
||||
#define TEGRA_EMC0_SIZE SZ_2K
|
||||
|
||||
#define TEGRA_EMC1_BASE 0x7001A800
|
||||
#define TEGRA_EMC1_SIZE SZ_2K
|
||||
|
||||
#define TEGRA124_MC_BASE 0x70019000
|
||||
#define TEGRA124_MC_SIZE SZ_4K
|
||||
|
||||
#define TEGRA124_EMC_BASE 0x7001B000
|
||||
#define TEGRA124_EMC_SIZE SZ_2K
|
||||
|
||||
|
@ -44,8 +44,6 @@
|
||||
#define EMC_XM2VTTGENPADCTRL 0x310
|
||||
#define EMC_XM2VTTGENPADCTRL2 0x314
|
||||
|
||||
#define MC_EMEM_ARB_CFG 0x90
|
||||
|
||||
#define PMC_CTRL 0x0
|
||||
#define PMC_CTRL_SIDE_EFFECT_LP0 (1 << 14) /* enter LP0 when CPU pwr gated */
|
||||
|
||||
@ -420,22 +418,6 @@ _pll_m_c_x_done:
|
||||
movweq r0, #:lower16:TEGRA124_EMC_BASE
|
||||
movteq r0, #:upper16:TEGRA124_EMC_BASE
|
||||
|
||||
cmp r10, #TEGRA30
|
||||
moveq r2, #0x20
|
||||
movweq r4, #:lower16:TEGRA_MC_BASE
|
||||
movteq r4, #:upper16:TEGRA_MC_BASE
|
||||
cmp r10, #TEGRA114
|
||||
moveq r2, #0x34
|
||||
movweq r4, #:lower16:TEGRA114_MC_BASE
|
||||
movteq r4, #:upper16:TEGRA114_MC_BASE
|
||||
cmp r10, #TEGRA124
|
||||
moveq r2, #0x20
|
||||
movweq r4, #:lower16:TEGRA124_MC_BASE
|
||||
movteq r4, #:upper16:TEGRA124_MC_BASE
|
||||
|
||||
ldr r1, [r5, r2] @ restore MC_EMEM_ARB_CFG
|
||||
str r1, [r4, #MC_EMEM_ARB_CFG]
|
||||
|
||||
exit_self_refresh:
|
||||
ldr r1, [r5, #0xC] @ restore EMC_XM2VTTGENPADCTRL
|
||||
str r1, [r0, #EMC_XM2VTTGENPADCTRL]
|
||||
@ -564,7 +546,6 @@ tegra30_sdram_pad_address:
|
||||
.word TEGRA_PMC_BASE + PMC_IO_DPD_STATUS @0x14
|
||||
.word TEGRA_CLK_RESET_BASE + CLK_RESET_CLK_SOURCE_MSELECT @0x18
|
||||
.word TEGRA_CLK_RESET_BASE + CLK_RESET_SCLK_BURST @0x1c
|
||||
.word TEGRA_MC_BASE + MC_EMEM_ARB_CFG @0x20
|
||||
tegra30_sdram_pad_address_end:
|
||||
|
||||
tegra114_sdram_pad_address:
|
||||
@ -581,7 +562,6 @@ tegra114_sdram_pad_address:
|
||||
.word TEGRA_EMC1_BASE + EMC_AUTO_CAL_INTERVAL @0x28
|
||||
.word TEGRA_EMC1_BASE + EMC_XM2VTTGENPADCTRL @0x2c
|
||||
.word TEGRA_EMC1_BASE + EMC_XM2VTTGENPADCTRL2 @0x30
|
||||
.word TEGRA114_MC_BASE + MC_EMEM_ARB_CFG @0x34
|
||||
tegra114_sdram_pad_adress_end:
|
||||
|
||||
tegra124_sdram_pad_address:
|
||||
@ -593,7 +573,6 @@ tegra124_sdram_pad_address:
|
||||
.word TEGRA_PMC_BASE + PMC_IO_DPD_STATUS @0x14
|
||||
.word TEGRA_CLK_RESET_BASE + CLK_RESET_CLK_SOURCE_MSELECT @0x18
|
||||
.word TEGRA_CLK_RESET_BASE + CLK_RESET_SCLK_BURST @0x1c
|
||||
.word TEGRA124_MC_BASE + MC_EMEM_ARB_CFG @0x20
|
||||
tegra124_sdram_pad_address_end:
|
||||
|
||||
tegra30_sdram_pad_size:
|
||||
|
@ -51,6 +51,9 @@
|
||||
#define MC_EMEM_ADR_CFG 0x54
|
||||
#define MC_EMEM_ADR_CFG_EMEM_NUMDEV BIT(0)
|
||||
|
||||
#define MC_TIMING_CONTROL 0xfc
|
||||
#define MC_TIMING_UPDATE BIT(0)
|
||||
|
||||
static const struct of_device_id tegra_mc_of_match[] = {
|
||||
#ifdef CONFIG_ARCH_TEGRA_2x_SOC
|
||||
{ .compatible = "nvidia,tegra20-mc-gart", .data = &tegra20_mc_soc },
|
||||
@ -74,7 +77,7 @@ static const struct of_device_id tegra_mc_of_match[] = {
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, tegra_mc_of_match);
|
||||
|
||||
static int terga_mc_block_dma_common(struct tegra_mc *mc,
|
||||
static int tegra_mc_block_dma_common(struct tegra_mc *mc,
|
||||
const struct tegra_mc_reset *rst)
|
||||
{
|
||||
unsigned long flags;
|
||||
@ -90,13 +93,13 @@ static int terga_mc_block_dma_common(struct tegra_mc *mc,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool terga_mc_dma_idling_common(struct tegra_mc *mc,
|
||||
static bool tegra_mc_dma_idling_common(struct tegra_mc *mc,
|
||||
const struct tegra_mc_reset *rst)
|
||||
{
|
||||
return (mc_readl(mc, rst->status) & BIT(rst->bit)) != 0;
|
||||
}
|
||||
|
||||
static int terga_mc_unblock_dma_common(struct tegra_mc *mc,
|
||||
static int tegra_mc_unblock_dma_common(struct tegra_mc *mc,
|
||||
const struct tegra_mc_reset *rst)
|
||||
{
|
||||
unsigned long flags;
|
||||
@ -112,17 +115,17 @@ static int terga_mc_unblock_dma_common(struct tegra_mc *mc,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int terga_mc_reset_status_common(struct tegra_mc *mc,
|
||||
static int tegra_mc_reset_status_common(struct tegra_mc *mc,
|
||||
const struct tegra_mc_reset *rst)
|
||||
{
|
||||
return (mc_readl(mc, rst->control) & BIT(rst->bit)) != 0;
|
||||
}
|
||||
|
||||
const struct tegra_mc_reset_ops terga_mc_reset_ops_common = {
|
||||
.block_dma = terga_mc_block_dma_common,
|
||||
.dma_idling = terga_mc_dma_idling_common,
|
||||
.unblock_dma = terga_mc_unblock_dma_common,
|
||||
.reset_status = terga_mc_reset_status_common,
|
||||
const struct tegra_mc_reset_ops tegra_mc_reset_ops_common = {
|
||||
.block_dma = tegra_mc_block_dma_common,
|
||||
.dma_idling = tegra_mc_dma_idling_common,
|
||||
.unblock_dma = tegra_mc_unblock_dma_common,
|
||||
.reset_status = tegra_mc_reset_status_common,
|
||||
};
|
||||
|
||||
static inline struct tegra_mc *reset_to_mc(struct reset_controller_dev *rcdev)
|
||||
@ -282,25 +285,28 @@ static int tegra_mc_setup_latency_allowance(struct tegra_mc *mc)
|
||||
u32 value;
|
||||
|
||||
/* compute the number of MC clock cycles per tick */
|
||||
tick = mc->tick * clk_get_rate(mc->clk);
|
||||
tick = (unsigned long long)mc->tick * clk_get_rate(mc->clk);
|
||||
do_div(tick, NSEC_PER_SEC);
|
||||
|
||||
value = readl(mc->regs + MC_EMEM_ARB_CFG);
|
||||
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);
|
||||
writel(value, mc->regs + MC_EMEM_ARB_CFG);
|
||||
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 = readl(mc->regs + la->reg);
|
||||
value = mc_readl(mc, la->reg);
|
||||
value &= ~(la->mask << la->shift);
|
||||
value |= (la->def & la->mask) << la->shift;
|
||||
writel(value, mc->regs + la->reg);
|
||||
mc_writel(mc, value, la->reg);
|
||||
}
|
||||
|
||||
/* latch new values */
|
||||
mc_writel(mc, MC_TIMING_UPDATE, MC_TIMING_CONTROL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -35,7 +35,7 @@ static inline void mc_writel(struct tegra_mc *mc, u32 value,
|
||||
writel_relaxed(value, mc->regs + offset);
|
||||
}
|
||||
|
||||
extern const struct tegra_mc_reset_ops terga_mc_reset_ops_common;
|
||||
extern const struct tegra_mc_reset_ops tegra_mc_reset_ops_common;
|
||||
|
||||
#ifdef CONFIG_ARCH_TEGRA_2x_SOC
|
||||
extern const struct tegra_mc_soc tegra20_mc_soc;
|
||||
|
@ -572,7 +572,7 @@ static const struct tegra_mc_client tegra114_mc_clients[] = {
|
||||
},
|
||||
}, {
|
||||
.id = 0x34,
|
||||
.name = "fdcwr2",
|
||||
.name = "fdcdwr2",
|
||||
.swgroup = TEGRA_SWGROUP_NV,
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
@ -975,7 +975,7 @@ const struct tegra_mc_soc tegra114_mc_soc = {
|
||||
.smmu = &tegra114_smmu_soc,
|
||||
.intmask = MC_INT_INVALID_SMMU_PAGE | MC_INT_SECURITY_VIOLATION |
|
||||
MC_INT_DECERR_EMEM,
|
||||
.reset_ops = &terga_mc_reset_ops_common,
|
||||
.reset_ops = &tegra_mc_reset_ops_common,
|
||||
.resets = tegra114_mc_resets,
|
||||
.num_resets = ARRAY_SIZE(tegra114_mc_resets),
|
||||
};
|
||||
|
@ -1074,7 +1074,7 @@ const struct tegra_mc_soc tegra124_mc_soc = {
|
||||
.intmask = MC_INT_DECERR_MTS | MC_INT_SECERR_SEC | MC_INT_DECERR_VPR |
|
||||
MC_INT_INVALID_APB_ASID_UPDATE | MC_INT_INVALID_SMMU_PAGE |
|
||||
MC_INT_SECURITY_VIOLATION | MC_INT_DECERR_EMEM,
|
||||
.reset_ops = &terga_mc_reset_ops_common,
|
||||
.reset_ops = &tegra_mc_reset_ops_common,
|
||||
.resets = tegra124_mc_resets,
|
||||
.num_resets = ARRAY_SIZE(tegra124_mc_resets),
|
||||
};
|
||||
@ -1104,7 +1104,7 @@ const struct tegra_mc_soc tegra132_mc_soc = {
|
||||
.intmask = MC_INT_DECERR_MTS | MC_INT_SECERR_SEC | MC_INT_DECERR_VPR |
|
||||
MC_INT_INVALID_APB_ASID_UPDATE | MC_INT_INVALID_SMMU_PAGE |
|
||||
MC_INT_SECURITY_VIOLATION | MC_INT_DECERR_EMEM,
|
||||
.reset_ops = &terga_mc_reset_ops_common,
|
||||
.reset_ops = &tegra_mc_reset_ops_common,
|
||||
.resets = tegra124_mc_resets,
|
||||
.num_resets = ARRAY_SIZE(tegra124_mc_resets),
|
||||
};
|
||||
|
@ -198,7 +198,7 @@ static const struct tegra_mc_reset tegra20_mc_resets[] = {
|
||||
TEGRA20_MC_RESET(VI, 0x100, 0x178, 0x104, 14),
|
||||
};
|
||||
|
||||
static int terga20_mc_hotreset_assert(struct tegra_mc *mc,
|
||||
static int tegra20_mc_hotreset_assert(struct tegra_mc *mc,
|
||||
const struct tegra_mc_reset *rst)
|
||||
{
|
||||
unsigned long flags;
|
||||
@ -214,7 +214,7 @@ static int terga20_mc_hotreset_assert(struct tegra_mc *mc,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int terga20_mc_hotreset_deassert(struct tegra_mc *mc,
|
||||
static int tegra20_mc_hotreset_deassert(struct tegra_mc *mc,
|
||||
const struct tegra_mc_reset *rst)
|
||||
{
|
||||
unsigned long flags;
|
||||
@ -230,7 +230,7 @@ static int terga20_mc_hotreset_deassert(struct tegra_mc *mc,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int terga20_mc_block_dma(struct tegra_mc *mc,
|
||||
static int tegra20_mc_block_dma(struct tegra_mc *mc,
|
||||
const struct tegra_mc_reset *rst)
|
||||
{
|
||||
unsigned long flags;
|
||||
@ -246,19 +246,19 @@ static int terga20_mc_block_dma(struct tegra_mc *mc,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool terga20_mc_dma_idling(struct tegra_mc *mc,
|
||||
static bool tegra20_mc_dma_idling(struct tegra_mc *mc,
|
||||
const struct tegra_mc_reset *rst)
|
||||
{
|
||||
return mc_readl(mc, rst->status) == 0;
|
||||
}
|
||||
|
||||
static int terga20_mc_reset_status(struct tegra_mc *mc,
|
||||
static int tegra20_mc_reset_status(struct tegra_mc *mc,
|
||||
const struct tegra_mc_reset *rst)
|
||||
{
|
||||
return (mc_readl(mc, rst->reset) & BIT(rst->bit)) == 0;
|
||||
}
|
||||
|
||||
static int terga20_mc_unblock_dma(struct tegra_mc *mc,
|
||||
static int tegra20_mc_unblock_dma(struct tegra_mc *mc,
|
||||
const struct tegra_mc_reset *rst)
|
||||
{
|
||||
unsigned long flags;
|
||||
@ -274,13 +274,13 @@ static int terga20_mc_unblock_dma(struct tegra_mc *mc,
|
||||
return 0;
|
||||
}
|
||||
|
||||
const struct tegra_mc_reset_ops terga20_mc_reset_ops = {
|
||||
.hotreset_assert = terga20_mc_hotreset_assert,
|
||||
.hotreset_deassert = terga20_mc_hotreset_deassert,
|
||||
.block_dma = terga20_mc_block_dma,
|
||||
.dma_idling = terga20_mc_dma_idling,
|
||||
.unblock_dma = terga20_mc_unblock_dma,
|
||||
.reset_status = terga20_mc_reset_status,
|
||||
static const struct tegra_mc_reset_ops tegra20_mc_reset_ops = {
|
||||
.hotreset_assert = tegra20_mc_hotreset_assert,
|
||||
.hotreset_deassert = tegra20_mc_hotreset_deassert,
|
||||
.block_dma = tegra20_mc_block_dma,
|
||||
.dma_idling = tegra20_mc_dma_idling,
|
||||
.unblock_dma = tegra20_mc_unblock_dma,
|
||||
.reset_status = tegra20_mc_reset_status,
|
||||
};
|
||||
|
||||
const struct tegra_mc_soc tegra20_mc_soc = {
|
||||
@ -290,7 +290,7 @@ const struct tegra_mc_soc tegra20_mc_soc = {
|
||||
.client_id_mask = 0x3f,
|
||||
.intmask = MC_INT_SECURITY_VIOLATION | MC_INT_INVALID_GART_PAGE |
|
||||
MC_INT_DECERR_EMEM,
|
||||
.reset_ops = &terga20_mc_reset_ops,
|
||||
.reset_ops = &tegra20_mc_reset_ops,
|
||||
.resets = tegra20_mc_resets,
|
||||
.num_resets = ARRAY_SIZE(tegra20_mc_resets),
|
||||
};
|
||||
|
@ -1132,7 +1132,7 @@ const struct tegra_mc_soc tegra210_mc_soc = {
|
||||
.intmask = MC_INT_DECERR_MTS | MC_INT_SECERR_SEC | MC_INT_DECERR_VPR |
|
||||
MC_INT_INVALID_APB_ASID_UPDATE | MC_INT_INVALID_SMMU_PAGE |
|
||||
MC_INT_SECURITY_VIOLATION | MC_INT_DECERR_EMEM,
|
||||
.reset_ops = &terga_mc_reset_ops_common,
|
||||
.reset_ops = &tegra_mc_reset_ops_common,
|
||||
.resets = tegra210_mc_resets,
|
||||
.num_resets = ARRAY_SIZE(tegra210_mc_resets),
|
||||
};
|
||||
|
@ -726,7 +726,7 @@ static const struct tegra_mc_client tegra30_mc_clients[] = {
|
||||
},
|
||||
}, {
|
||||
.id = 0x34,
|
||||
.name = "fdcwr2",
|
||||
.name = "fdcdwr2",
|
||||
.swgroup = TEGRA_SWGROUP_NV2,
|
||||
.smmu = {
|
||||
.reg = 0x22c,
|
||||
@ -999,7 +999,7 @@ const struct tegra_mc_soc tegra30_mc_soc = {
|
||||
.smmu = &tegra30_smmu_soc,
|
||||
.intmask = MC_INT_INVALID_SMMU_PAGE | MC_INT_SECURITY_VIOLATION |
|
||||
MC_INT_DECERR_EMEM,
|
||||
.reset_ops = &terga_mc_reset_ops_common,
|
||||
.reset_ops = &tegra_mc_reset_ops_common,
|
||||
.resets = tegra30_mc_resets,
|
||||
.num_resets = ARRAY_SIZE(tegra30_mc_resets),
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user