1
0
mirror of https://git.yoctoproject.org/meta-ti synced 2026-06-06 02:42:34 +00:00

linux-ti-staging: add latest critical fixes locally for now

Signed-off-by: Denys Dmytriyenko <denys@ti.com>
This commit is contained in:
Denys Dmytriyenko
2014-02-21 11:06:35 -05:00
parent a5616a99d2
commit 29de82b1b5
5 changed files with 297 additions and 1 deletions
@@ -0,0 +1,158 @@
From f576e148cd15f10224e4ce13b6773717682f9a5a Mon Sep 17 00:00:00 2001
From: Chase Maupin <Chase.Maupin@ti.com>
Date: Fri, 21 Feb 2014 09:05:48 -0600
Subject: [PATCH 1/4] Revert "usb: musb: musb_cppi41: Revert the Advisory 1.0.13 workaround"
This reverts commit c424ef3e2beb89488e7e597446b4c6bc8f1852c5.
---
drivers/usb/musb/musb_cppi41.c | 96 +++++++++++++++++++++++++++++++++-------
1 files changed, 79 insertions(+), 17 deletions(-)
diff --git a/drivers/usb/musb/musb_cppi41.c b/drivers/usb/musb/musb_cppi41.c
index d02facc..01df8f9 100644
--- a/drivers/usb/musb/musb_cppi41.c
+++ b/drivers/usb/musb/musb_cppi41.c
@@ -31,6 +31,7 @@ struct cppi41_dma_channel {
u8 port_num;
u8 is_tx;
u8 is_allocated;
+ u8 usb_toggle;
dma_addr_t buf_addr;
u32 total_len;
@@ -55,6 +56,50 @@ struct cppi41_dma_controller {
u32 auto_req;
};
+static void save_rx_toggle(struct cppi41_dma_channel *cppi41_channel)
+{
+ u16 csr;
+ u8 toggle;
+
+ if (cppi41_channel->is_tx)
+ return;
+ if (!is_host_active(cppi41_channel->controller->musb))
+ return;
+
+ csr = musb_readw(cppi41_channel->hw_ep->regs, MUSB_RXCSR);
+ toggle = csr & MUSB_RXCSR_H_DATATOGGLE ? 1 : 0;
+
+ cppi41_channel->usb_toggle = toggle;
+}
+
+static void update_rx_toggle(struct cppi41_dma_channel *cppi41_channel)
+{
+ u16 csr;
+ u8 toggle;
+
+ if (cppi41_channel->is_tx)
+ return;
+ if (!is_host_active(cppi41_channel->controller->musb))
+ return;
+
+ csr = musb_readw(cppi41_channel->hw_ep->regs, MUSB_RXCSR);
+ toggle = csr & MUSB_RXCSR_H_DATATOGGLE ? 1 : 0;
+
+ /*
+ * AM335x Advisory 1.0.13: Due to internal synchronisation error the
+ * data toggle may reset from DATA1 to DATA0 during receiving data from
+ * more than one endpoint.
+ */
+ if (!toggle && toggle == cppi41_channel->usb_toggle) {
+ csr |= MUSB_RXCSR_H_DATATOGGLE | MUSB_RXCSR_H_WR_DATATOGGLE;
+ musb_writew(cppi41_channel->hw_ep->regs, MUSB_RXCSR, csr);
+ dev_dbg(cppi41_channel->controller->musb->controller,
+ "Restoring DATA1 toggle.\n");
+ }
+
+ cppi41_channel->usb_toggle = toggle;
+}
+
static bool musb_is_tx_fifo_empty(struct musb_hw_ep *hw_ep)
{
u8 epnum = hw_ep->epnum;
@@ -217,6 +262,8 @@ static void cppi41_dma_callback(void *private_data)
hw_ep->epnum, cppi41_channel->transferred,
cppi41_channel->total_len);
+ update_rx_toggle(cppi41_channel);
+
if (cppi41_channel->transferred == cppi41_channel->total_len ||
transferred < cppi41_channel->packet_sz)
cppi41_channel->prog_len = 0;
@@ -347,6 +394,7 @@ static bool cppi41_configure_channel(struct dma_channel *channel,
struct dma_async_tx_descriptor *dma_desc;
enum dma_transfer_direction direction;
struct musb *musb = cppi41_channel->controller->musb;
+ unsigned use_gen_rndis = 0;
dev_dbg(musb->controller,
"configure ep%d/%x packet_sz=%d, mode=%d, dma_addr=0x%llx, len=%d is_tx=%d\n",
@@ -359,26 +407,39 @@ static bool cppi41_configure_channel(struct dma_channel *channel,
cppi41_channel->transferred = 0;
cppi41_channel->packet_sz = packet_sz;
- /* RNDIS mode */
- if (len > packet_sz) {
- musb_writel(musb->ctrl_base,
- RNDIS_REG(cppi41_channel->port_num), len);
- /* gen rndis */
- cppi41_set_dma_mode(cppi41_channel,
- EP_MODE_DMA_GEN_RNDIS);
-
- /* auto req */
- cppi41_set_autoreq_mode(cppi41_channel,
+ /*
+ * Due to AM335x' Advisory 1.0.13 we are not allowed to transfer more
+ * than max packet size at a time.
+ */
+ if (cppi41_channel->is_tx)
+ use_gen_rndis = 1;
+
+ if (use_gen_rndis) {
+ /* RNDIS mode */
+ if (len > packet_sz) {
+ musb_writel(musb->ctrl_base,
+ RNDIS_REG(cppi41_channel->port_num), len);
+ /* gen rndis */
+ cppi41_set_dma_mode(cppi41_channel,
+ EP_MODE_DMA_GEN_RNDIS);
+
+ /* auto req */
+ cppi41_set_autoreq_mode(cppi41_channel,
EP_MODE_AUTOREG_ALL_NEOP);
- } else {
- musb_writel(musb->ctrl_base,
- RNDIS_REG(cppi41_channel->port_num), 0);
- cppi41_set_dma_mode(cppi41_channel,
- EP_MODE_DMA_TRANSPARENT);
- cppi41_set_autoreq_mode(cppi41_channel,
+ } else {
+ musb_writel(musb->ctrl_base,
+ RNDIS_REG(cppi41_channel->port_num), 0);
+ cppi41_set_dma_mode(cppi41_channel,
+ EP_MODE_DMA_TRANSPARENT);
+ cppi41_set_autoreq_mode(cppi41_channel,
EP_MODE_AUTOREG_NONE);
+ }
+ } else {
+ /* fallback mode */
+ cppi41_set_dma_mode(cppi41_channel, EP_MODE_DMA_TRANSPARENT);
+ cppi41_set_autoreq_mode(cppi41_channel, EP_MODE_AUTOREG_NONE);
+ len = min_t(u32, packet_sz, len);
}
-
cppi41_channel->prog_len = len;
direction = cppi41_channel->is_tx ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM;
dma_desc = dmaengine_prep_slave_single(dc, dma_addr, len, direction,
@@ -390,6 +451,7 @@ static bool cppi41_configure_channel(struct dma_channel *channel,
dma_desc->callback_param = channel;
cppi41_channel->cookie = dma_desc->tx_submit(dma_desc);
+ save_rx_toggle(cppi41_channel);
dma_async_issue_pending(dc);
return true;
}
--
1.7.0.4
@@ -0,0 +1,37 @@
From 5b2aa64ccdeef659a9688730753199ba5b8e60b1 Mon Sep 17 00:00:00 2001
From: Dave Gerlach <d-gerlach@ti.com>
Date: Fri, 21 Feb 2014 10:25:33 +0000
Subject: [PATCH 2/4] ARM: config: Add HAVE_ARM_SCU for AM43XX
CONFIG_HAVE_ARM_SCU only gets selected if CONFIG_SMP is selected in an OMAP
system however AM43XX needs this option regardless of CONFIG_SMP as it is
important for controlling power in the SoC. Without this suspend will
not work as scu_power_mode becomes an empty function.
AM43XX requires SCU CPU Power Status bits for A9 core to be set to off mode
in order for the MSTANDBY signal to be asserted from the MPU during WFI.
This signal is used by the PRCM to determine when it is appropriate to
clock gate the MPU clock domain and also trigger M3_IRQ2 to tell the wkup_m3
firmware to put the part into the desired sleep more.
Signed-off-by: Dave Gerlach <d-gerlach@ti.com>
Tested-by: Sekhar Nori <nsekhar@ti.com>
---
arch/arm/mach-omap2/Kconfig | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig
index 959f6fc..373d576 100644
--- a/arch/arm/mach-omap2/Kconfig
+++ b/arch/arm/mach-omap2/Kconfig
@@ -85,6 +85,7 @@ config SOC_AM43XX
depends on ARCH_MULTI_V7
select CPU_V7
select ARCH_OMAP2PLUS
+ select HAVE_ARM_SCU
select MULTI_IRQ_HANDLER
select ARM_GIC
select COMMON_CLK
--
1.7.0.4
@@ -0,0 +1,49 @@
From 9b76ff20919fa939eed3fdffe05af8bcf1ec1ac5 Mon Sep 17 00:00:00 2001
From: Santosh Shilimkar <santosh.shilimkar@ti.com>
Date: Wed, 12 Feb 2014 16:42:39 -0500
Subject: [PATCH 3/4] ARM: OMAP: Kill warning in CPUIDLE code with !CONFIG_SMP
for non SMP build, NR_CPUS is 1 and hence the code complains with below
warnings.
arch/arm/mach-omap2/cpuidle44xx.c:207:8: warning: array subscript is above array bounds [-Warray-bounds]
arch/arm/mach-omap2/cpuidle44xx.c:212:11: warning: array subscript is above array bounds [-Warray-bounds]
Kill it by making array size fixed.
Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
---
arch/arm/mach-omap2/cpuidle44xx.c | 8 +++++---
1 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/arch/arm/mach-omap2/cpuidle44xx.c b/arch/arm/mach-omap2/cpuidle44xx.c
index 4c8982a..5e85f1e 100644
--- a/arch/arm/mach-omap2/cpuidle44xx.c
+++ b/arch/arm/mach-omap2/cpuidle44xx.c
@@ -23,6 +23,8 @@
#include "prm.h"
#include "clockdomain.h"
+#define MAX_CPUS 2
+
/* Machine specific information */
struct idle_statedata {
u32 cpu_state;
@@ -48,11 +50,11 @@ static struct idle_statedata omap4_idle_data[] = {
},
};
-static struct powerdomain *mpu_pd, *cpu_pd[NR_CPUS];
-static struct clockdomain *cpu_clkdm[NR_CPUS];
+static struct powerdomain *mpu_pd, *cpu_pd[MAX_CPUS];
+static struct clockdomain *cpu_clkdm[MAX_CPUS];
static atomic_t abort_barrier;
-static bool cpu_done[NR_CPUS];
+static bool cpu_done[MAX_CPUS];
static struct idle_statedata *state_ptr = &omap4_idle_data[0];
/* Private functions */
--
1.7.0.4
@@ -0,0 +1,43 @@
From 89783143b64210e8f159fd875b23aa9af1fd51b0 Mon Sep 17 00:00:00 2001
From: Santosh Shilimkar <santosh.shilimkar@ti.com>
Date: Thu, 13 Feb 2014 08:52:41 -0500
Subject: [PATCH 4/4] Not-for-merge: ARM: config: omap: Disable SMP for AM335x build
SMP and SMP_ON_UP introduces some extra barriers and code many fast paths
including kernel lock functions.
Performance sensitive usecases like networking gets impacted because of this.
In typical production kernel which is targeted for single core device
like AM335x family, you don't want to take this hit.
Ideally one should just create a device specific config feed as done by all
typical distro's. Other option is to apply this specifically during build
time using recipe.
Whichever option, one definitely don't want this overhead for performance
critical usecases.
Disabling SMP in the build introduces one warining in cpuidle44xx.c driver
and fix is included in the series
Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
---
arch/arm/configs/omap2plus_defconfig | 2 --
1 files changed, 0 insertions(+), 2 deletions(-)
diff --git a/arch/arm/configs/omap2plus_defconfig b/arch/arm/configs/omap2plus_defconfig
index 3975b08..cfbc2d0 100644
--- a/arch/arm/configs/omap2plus_defconfig
+++ b/arch/arm/configs/omap2plus_defconfig
@@ -36,8 +36,6 @@ CONFIG_OMAP4_ERRATA_I688=y
CONFIG_ARM_THUMBEE=y
CONFIG_ARM_ERRATA_411920=y
CONFIG_PCIE_DRA7XX=y
-CONFIG_SMP=y
-CONFIG_NR_CPUS=2
CONFIG_PREEMPT=y
CONFIG_CMA=y
CONFIG_ZBOOT_ROM_TEXT=0x0
--
1.7.0.4
+10 -1
View File
@@ -40,9 +40,18 @@ SRCREV = "d5e4bfd196e114c885c5c42cf0a7b3edc7e54829"
PV = "3.12.10"
# Append to the MACHINE_KERNEL_PR so that a new SRCREV will cause a rebuild
MACHINE_KERNEL_PR_append = "g+gitr${SRCPV}"
MACHINE_KERNEL_PR_append = "h+gitr${SRCPV}"
PR = "${MACHINE_KERNEL_PR}"
SRC_URI = "git://git.ti.com/ti-linux-kernel/ti-linux-kernel.git;protocol=git;branch=${BRANCH} \
file://defconfig \
"
# Latest critical fixes
SRC_URI += "file://0001-Revert-usb-musb-musb_cppi41-Revert-the-Advisory-1.0..patch \
file://0002-ARM-config-Add-HAVE_ARM_SCU-for-AM43XX.patch \
file://0003-ARM-OMAP-Kill-warning-in-CPUIDLE-code-with-CONFIG_SM.patch \
"
SRC_URI_append_ti33x = "file://0004-Not-for-merge-ARM-config-omap-Disable-SMP-for-AM335x.patch"
SRC_URI_append_ti43x = "file://0004-Not-for-merge-ARM-config-omap-Disable-SMP-for-AM335x.patch"