diff options
author | Rakesh Bodla <rbodla@nvidia.com> | 2011-05-26 11:27:04 +0530 |
---|---|---|
committer | Rohan Somvanshi <rsomvanshi@nvidia.com> | 2011-05-27 19:51:15 -0700 |
commit | f982fa0f0878a8f4bc1739bf047313171d3cf38d (patch) | |
tree | ce5d6ebfd53c6631192ac7b7c76b8af6ab109e6c /arch | |
parent | bad5997f161043dea44b4aef356cc5b39f039b19 (diff) |
ARM: tegra: Enable AHB prefetch for USB
Enabling AHB prefetch on USB1, USB2, USB3 controllers,
to improve the USB transfer throughput.
Bug 820602
Change-Id: I4e9e9fa37624cc11f83effd268cdbf31c01f1df7
Reviewed-on: http://git-master/r/30475
Reviewed-by: Rakesh Bodla <rbodla@nvidia.com>
Tested-by: Rakesh Bodla <rbodla@nvidia.com>
Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com>
Reviewed-by: Suresh Mangipudi <smangipudi@nvidia.com>
Reviewed-by: Varun Wadekar <vwadekar@nvidia.com>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/arm/mach-tegra/common.c | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/arch/arm/mach-tegra/common.c b/arch/arm/mach-tegra/common.c index 84fc70387222..a85f484d4072 100644 --- a/arch/arm/mach-tegra/common.c +++ b/arch/arm/mach-tegra/common.c @@ -27,6 +27,7 @@ #include <linux/notifier.h> #include <linux/reboot.h> #include <linux/mqueue.h> +#include <linux/bitops.h> #include <asm/hardware/cache-l2x0.h> #include <asm/system.h> @@ -43,6 +44,33 @@ #define MC_SECURITY_CFG2 0x7c +#define AHB_ARBITRATION_PRIORITY_CTRL 0x4 +#define AHB_PRIORITY_WEIGHT(x) (((x) & 0x7) << 29) +#define PRIORITY_SELECT_USB BIT(6) +#define PRIORITY_SELECT_USB2 BIT(18) +#define PRIORITY_SELECT_USB3 BIT(17) + +#define AHB_GIZMO_AHB_MEM 0xc +#define ENB_FAST_REARBITRATE BIT(2) + +#define AHB_GIZMO_USB 0x1c +#define AHB_GIZMO_USB2 0x78 +#define AHB_GIZMO_USB3 0x7c +#define IMMEDIATE BIT(18) + +#define AHB_MEM_PREFETCH_CFG3 0xe0 +#define AHB_MEM_PREFETCH_CFG4 0xe4 +#define AHB_MEM_PREFETCH_CFG1 0xec +#define AHB_MEM_PREFETCH_CFG2 0xf0 +#define PREFETCH_ENB BIT(31) +#define MST_ID(x) (((x) & 0x1f) << 26) +#define AHBDMA_MST_ID MST_ID(5) +#define USB_MST_ID MST_ID(6) +#define USB2_MST_ID MST_ID(18) +#define USB3_MST_ID MST_ID(17) +#define ADDR_BNDRY(x) (((x) & 0xf) << 21) +#define INACTIVITY_TIMEOUT(x) (((x) & 0xffff) << 0) + unsigned long tegra_bootloader_fb_start; unsigned long tegra_bootloader_fb_size; unsigned long tegra_fb_start; @@ -129,6 +157,62 @@ static void __init tegra_init_power(void) tegra_powergate_power_off(TEGRA_POWERGATE_PCIE); } +static inline unsigned long gizmo_readl(unsigned long offset) +{ + return readl(IO_TO_VIRT(TEGRA_AHB_GIZMO_BASE + offset)); +} + +static inline void gizmo_writel(unsigned long value, unsigned long offset) +{ + writel(value, IO_TO_VIRT(TEGRA_AHB_GIZMO_BASE + offset)); +} + +static void __init tegra_init_ahb_gizmo_settings(void) +{ + unsigned long val; + + val = gizmo_readl(AHB_GIZMO_AHB_MEM); + val |= ENB_FAST_REARBITRATE; + gizmo_writel(val, AHB_GIZMO_AHB_MEM); + + val = gizmo_readl(AHB_GIZMO_USB); + val |= IMMEDIATE; + gizmo_writel(val, AHB_GIZMO_USB); + + val = gizmo_readl(AHB_GIZMO_USB2); + val |= IMMEDIATE; + gizmo_writel(val, AHB_GIZMO_USB2); + + val = gizmo_readl(AHB_GIZMO_USB3); + val |= IMMEDIATE; + gizmo_writel(val, AHB_GIZMO_USB3); + + val = gizmo_readl(AHB_ARBITRATION_PRIORITY_CTRL); + val |= PRIORITY_SELECT_USB | PRIORITY_SELECT_USB2 | PRIORITY_SELECT_USB3 + | AHB_PRIORITY_WEIGHT(7); + gizmo_writel(val, AHB_ARBITRATION_PRIORITY_CTRL); + + val = gizmo_readl(AHB_MEM_PREFETCH_CFG1); + val &= ~MST_ID(~0); + val |= PREFETCH_ENB | AHBDMA_MST_ID | ADDR_BNDRY(0xc) | INACTIVITY_TIMEOUT(0x1000); + gizmo_writel(val, AHB_MEM_PREFETCH_CFG1); + + val = gizmo_readl(AHB_MEM_PREFETCH_CFG2); + val &= ~MST_ID(~0); + val |= PREFETCH_ENB | USB_MST_ID | ADDR_BNDRY(0xc) | INACTIVITY_TIMEOUT(0x1000); + gizmo_writel(val, AHB_MEM_PREFETCH_CFG2); + + val = gizmo_readl(AHB_MEM_PREFETCH_CFG3); + val &= ~MST_ID(~0); + val |= PREFETCH_ENB | USB3_MST_ID | ADDR_BNDRY(0xc) | INACTIVITY_TIMEOUT(0x1000); + gizmo_writel(val, AHB_MEM_PREFETCH_CFG3); + + val = gizmo_readl(AHB_MEM_PREFETCH_CFG4); + val &= ~MST_ID(~0); + val |= PREFETCH_ENB | USB2_MST_ID | ADDR_BNDRY(0xc) | INACTIVITY_TIMEOUT(0x1000); + gizmo_writel(val, AHB_MEM_PREFETCH_CFG4); +} + static bool console_flushed; static int tegra_pm_flush_console(struct notifier_block *this, @@ -178,6 +262,7 @@ void __init tegra_common_init(void) tegra_init_cache(); tegra_dma_init(); tegra_init_apb_dma(); + tegra_init_ahb_gizmo_settings(); } static int __init tegra_bootloader_fb_arg(char *options) |