linux-dey-5.15: add RT functionality to CCMP1

This commit adds RT functionality to CCMP1. The patches
have been extracted from STM RT expansion package and
includes the maineline RT patches and the STM RT driver
patches and RT Kernel defconfig changes.

https://onedigi.atlassian.net/browse/DEL-8880

Signed-off-by: Mike Engel <Mike.Engel@digi.com>
This commit is contained in:
Mike Engel 2024-02-28 16:10:59 +01:00
parent 932c186225
commit cc8c038401
9 changed files with 11355 additions and 0 deletions

View File

@ -71,6 +71,20 @@ do_configure:append() {
if [ -n "${@' '.join(find_cfgs(d))}" ]; then
${S}/scripts/kconfig/merge_config.sh -m -O ${B} ${B}/.config ${@" ".join(find_cfgs(d))}
fi
# Apply ST-specific config fragments (ending in .config and stored in a different folder)
if [ ! -z "${KERNEL_CONFIG_FRAGMENTS}" ]; then
for f in ${KERNEL_CONFIG_FRAGMENTS}
do
# Check if the config fragment was copied into the WORKDIR from
# the OE meta data
if [ ! -e "$f" ]; then
bb_warn "Could not find kernel config fragment $f"
exit 1
fi
done
# Now that all the fragments are located merge them.
(${S}/scripts/kconfig/merge_config.sh -m -r -O ${B} ${B}/.config ${KERNEL_CONFIG_FRAGMENTS} 1>&2 )
fi
}
# Don't create custom folder for kernel artifacts

View File

@ -0,0 +1,26 @@
From 63e709173a20b85b473bbf4832f4e909692fd361 Mon Sep 17 00:00:00 2001
From: Lionel VITTE <lionel.vitte@st.com>
Date: Wed, 8 Feb 2023 09:54:24 +0100
Subject: [PATCH 23/28] 5.15-stm32mp-rt-49-r1 CLOCK
Signed-off-by: Lionel VITTE <lionel.vitte@st.com>
---
drivers/clk/stm32/clk-stm32mp13.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/clk/stm32/clk-stm32mp13.c b/drivers/clk/stm32/clk-stm32mp13.c
index 15ee05df8..2f7a823bf 100644
--- a/drivers/clk/stm32/clk-stm32mp13.c
+++ b/drivers/clk/stm32/clk-stm32mp13.c
@@ -840,7 +840,7 @@ static CLK_STM32_GATE(sai1, "pclk2", 0, GATE_SAI1);
static CLK_STM32_GATE(sai2, "pclk2", 0, GATE_SAI2);
static CLK_STM32_GATE(spi1, "pclk2", 0, GATE_SPI1);
-static CLK_STM32_GATE(syscfg, "pclk3", 0, GATE_SYSCFG);
+static CLK_STM32_GATE(syscfg, "pclk3", CLK_IS_CRITICAL, GATE_SYSCFG);
static CLK_STM32_GATE(vref, "pclk3", 0, GATE_VREF);
static CLK_STM32_GATE(dts, "pclk3", 0, GATE_DTS);
static CLK_STM32_GATE(pmbctrl, "pclk3", 0, GATE_PMBCTRL);
--
2.34.1

View File

@ -0,0 +1,131 @@
From 5a55de398d12848f13f7df59fb2f1853b7dd9ee8 Mon Sep 17 00:00:00 2001
From: Lionel VITTE <lionel.vitte@st.com>
Date: Wed, 8 Feb 2023 09:56:07 +0100
Subject: [PATCH 24/28] 5.15-stm32mp-rt-49-r1 DMA
Signed-off-by: Lionel VITTE <lionel.vitte@st.com>
---
drivers/dma/stm32-dma.c | 35 +++++++++++++++++++++++++----------
drivers/dma/stm32-mdma.c | 4 ++++
2 files changed, 29 insertions(+), 10 deletions(-)
diff --git a/drivers/dma/stm32-dma.c b/drivers/dma/stm32-dma.c
index 7c6078c6c..128edfb4f 100644
--- a/drivers/dma/stm32-dma.c
+++ b/drivers/dma/stm32-dma.c
@@ -238,6 +238,7 @@ struct stm32_dma_chan {
u32 residue_after_drain;
struct workqueue_struct *mdma_wq;
struct work_struct mdma_work;
+ struct completion mdma_drain_completion;
};
struct stm32_dma_device {
@@ -570,8 +571,9 @@ static u32 stm32_dma_get_remaining_bytes(struct stm32_dma_chan *chan)
return ndtr << width;
}
-static int stm32_dma_mdma_drain(struct stm32_dma_chan *chan)
+static void stm32_dma_mdma_drain_worker(struct work_struct *work)
{
+ struct stm32_dma_chan *chan = container_of(work, struct stm32_dma_chan, mdma_work);
struct stm32_dma_mdma *mchan = &chan->mchan;
struct stm32_dma_sg_req *sg_req;
struct dma_device *ddev = mchan->chan->device;
@@ -583,14 +585,12 @@ static int stm32_dma_mdma_drain(struct stm32_dma_chan *chan)
int ret;
unsigned long flags;
- flush_workqueue(chan->mdma_wq);
-
/* DMA/MDMA chain: drain remaining data in SRAM */
/* Get the residue on MDMA side */
status = dmaengine_tx_status(mchan->chan, mchan->chan->cookie, &state);
if (status == DMA_COMPLETE)
- return status;
+ goto mdma_complete;
mdma_residue = state.residue;
sg_req = &chan->desc->sg_req[chan->next_sg - 1];
@@ -623,24 +623,25 @@ static int stm32_dma_mdma_drain(struct stm32_dma_chan *chan)
desc = ddev->device_prep_dma_memcpy(mchan->chan, dst_buf, src_buf, dma_to_write,
DMA_PREP_INTERRUPT);
if (!desc)
- return -EINVAL;
+ return;
ret = dma_submit_error(dmaengine_submit(desc));
if (ret < 0)
- return ret;
+ return;
status = dma_wait_for_async_tx(desc);
if (status != DMA_COMPLETE) {
dev_err(chan2dev(chan), "%s dma_wait_for_async_tx error\n", __func__);
dmaengine_terminate_async(mchan->chan);
- return -EBUSY;
+ return;
}
/* We need to store residue for tx_status() */
chan->residue_after_drain = len - (mdma_wrote + dma_to_write);
}
- return 0;
+mdma_complete:
+ complete(&chan->mdma_drain_completion);
}
static void stm32_dma_synchronize(struct dma_chan *c)
@@ -648,9 +649,22 @@ static void stm32_dma_synchronize(struct dma_chan *c)
struct stm32_dma_chan *chan = to_stm32_dma_chan(c);
struct stm32_dma_mdma *mchan = &chan->mchan;
- if (chan->desc && chan->use_mdma && mchan->dir == DMA_DEV_TO_MEM)
- if (stm32_dma_mdma_drain(chan))
+ if (chan->desc && chan->use_mdma && mchan->dir == DMA_DEV_TO_MEM) {
+ unsigned long ms = 5000 + 100; /* dma_sync_wait_timeout + extra 100ms */
+
+ reinit_completion(&chan->mdma_drain_completion);
+
+ flush_workqueue(chan->mdma_wq);
+ INIT_WORK(&chan->mdma_work, stm32_dma_mdma_drain_worker);
+
+ if (!queue_work(chan->mdma_wq, &chan->mdma_work))
+ dev_warn(chan2dev(chan), "Work already queued\n");
+
+ ms = wait_for_completion_timeout(&chan->mdma_drain_completion,
+ msecs_to_jiffies(ms));
+ if (ms == 0)
dev_err(chan2dev(chan), "%s: can't drain DMA\n", __func__);
+ }
if (chan->use_mdma)
dmaengine_synchronize(mchan->chan);
@@ -2338,6 +2352,7 @@ static int stm32_dma_probe(struct platform_device *pdev)
dev_warn(&pdev->dev,
"can't alloc MDMA workqueue for %s\n", name);
}
+ init_completion(&chan->mdma_drain_completion);
}
}
}
diff --git a/drivers/dma/stm32-mdma.c b/drivers/dma/stm32-mdma.c
index 133534663..a08c94638 100644
--- a/drivers/dma/stm32-mdma.c
+++ b/drivers/dma/stm32-mdma.c
@@ -1270,6 +1270,10 @@ static int stm32_mdma_resume(struct dma_chan *c)
unsigned long flags;
u32 status, reg;
+ /* Transfer can be terminated */
+ if (!chan->desc || (stm32_mdma_read(dmadev, STM32_MDMA_CCR(chan->id)) & STM32_MDMA_CCR_EN))
+ return -EPERM;
+
hwdesc = chan->desc->node[chan->curr_hwdesc].hwdesc;
spin_lock_irqsave(&chan->vchan.lock, flags);
--
2.34.1

View File

@ -0,0 +1,27 @@
From be5ec688053e6d136bc8ea54ed1e93d523b24580 Mon Sep 17 00:00:00 2001
From: Lionel VITTE <lionel.vitte@st.com>
Date: Wed, 8 Feb 2023 09:56:45 +0100
Subject: [PATCH 25/28] 5.15-stm32mp-rt-49-r1 MFD
Signed-off-by: Lionel VITTE <lionel.vitte@st.com>
---
drivers/mfd/syscon.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/drivers/mfd/syscon.c b/drivers/mfd/syscon.c
index 191fdb87c..24530dfe5 100644
--- a/drivers/mfd/syscon.c
+++ b/drivers/mfd/syscon.c
@@ -38,6 +38,9 @@ static const struct regmap_config syscon_regmap_config = {
.reg_bits = 32,
.val_bits = 32,
.reg_stride = 4,
+#ifdef CONFIG_PREEMPT_RT
+ .use_raw_spinlock = true,
+#endif
};
static struct syscon *of_syscon_register(struct device_node *np, bool check_clk)
--
2.34.1

View File

@ -0,0 +1,64 @@
From 1f4b70cda804c4f3771902254a2614d87a1d366c Mon Sep 17 00:00:00 2001
From: Lionel VITTE <lionel.vitte@st.com>
Date: Wed, 8 Feb 2023 09:57:06 +0100
Subject: [PATCH 26/28] 5.15-stm32mp-rt-49-r1 NET-TTY
Signed-off-by: Lionel VITTE <lionel.vitte@st.com>
---
drivers/tty/serial/stm32-usart.c | 32 +++++++++++---------------------
1 file changed, 11 insertions(+), 21 deletions(-)
diff --git a/drivers/tty/serial/stm32-usart.c b/drivers/tty/serial/stm32-usart.c
index 4d7a31664..0cd8e9672 100644
--- a/drivers/tty/serial/stm32-usart.c
+++ b/drivers/tty/serial/stm32-usart.c
@@ -772,26 +772,16 @@ static irqreturn_t stm32_usart_interrupt(int irq, void *ptr)
}
if ((sr & USART_SR_RTOF) && !(stm32_port->throttled) &&
- stm32_usart_rx_dma_started(stm32_port))
- return IRQ_WAKE_THREAD;
- else
- return IRQ_HANDLED;
-}
-
-static irqreturn_t stm32_usart_threaded_interrupt(int irq, void *ptr)
-{
- struct uart_port *port = ptr;
- struct tty_port *tport = &port->state->port;
- unsigned int size;
- unsigned long flags;
-
- /* Receiver timeout irq for DMA RX */
- spin_lock_irqsave(&port->lock, flags);
- size = stm32_usart_receive_chars(port, false);
- uart_unlock_and_check_sysrq_irqrestore(port, flags);
- if (size)
- tty_flip_buffer_push(tport);
+ stm32_usart_rx_dma_started(stm32_port)) {
+ unsigned long flags;
+ spin_lock_irqsave(&port->lock, flags);
+ /* Receiver timeout irq for DMA RX */
+ size = stm32_usart_receive_chars(port, false);
+ uart_unlock_and_check_sysrq_irqrestore(port, flags);
+ if (size)
+ tty_flip_buffer_push(tport);
+ }
return IRQ_HANDLED;
}
@@ -980,8 +970,8 @@ static int stm32_usart_startup(struct uart_port *port)
u32 val;
int ret;
- ret = request_threaded_irq(port->irq, stm32_usart_interrupt,
- stm32_usart_threaded_interrupt,
+ ret = request_threaded_irq(port->irq, NULL,
+ stm32_usart_interrupt,
IRQF_ONESHOT | IRQF_NO_SUSPEND,
name, port);
if (ret)
--
2.34.1

View File

@ -0,0 +1,25 @@
From e1bd8bc5502e661be4feaadfca1889da1d48cd73 Mon Sep 17 00:00:00 2001
From: Lionel VITTE <lionel.vitte@st.com>
Date: Wed, 8 Feb 2023 09:57:43 +0100
Subject: [PATCH 27/28] 5.15-stm32mp-rt-49-r1 DEVICETREE
Signed-off-by: Lionel VITTE <lionel.vitte@st.com>
---
arch/arm/boot/dts/stm32mp131.dtsi | 1 -
1 file changed, 1 deletion(-)
diff --git a/arch/arm/boot/dts/stm32mp131.dtsi b/arch/arm/boot/dts/stm32mp131.dtsi
index 8121ddc97..3fc06961a 100644
--- a/arch/arm/boot/dts/stm32mp131.dtsi
+++ b/arch/arm/boot/dts/stm32mp131.dtsi
@@ -1241,7 +1241,6 @@ exti-interrupt-map {
syscfg: syscon@50020000 {
compatible = "st,stm32mp157-syscfg", "syscon";
reg = <0x50020000 0x400>;
- clocks = <&rcc SYSCFG>;
};
lptimer2: timer@50021000 {
--
2.34.1

View File

@ -0,0 +1,82 @@
From 05ea3c26ccad3359d94dbe3c7ba758c2ba2f7dd9 Mon Sep 17 00:00:00 2001
From: Lionel VITTE <lionel.vitte@st.com>
Date: Wed, 8 Feb 2023 09:59:08 +0100
Subject: [PATCH 28/28] 5.15-stm32mp-rt-49-r1 CONFIG
Signed-off-by: Lionel VITTE <lionel.vitte@st.com>
---
.../configs/fragment-07-rt-sysvinit.config | 12 +++++++
arch/arm/configs/fragment-07-rt.config | 32 +++++++++++++++++++
arch/arm/configs/fragment-08-rt-mp13.config | 2 ++
3 files changed, 46 insertions(+)
create mode 100644 arch/arm/configs/fragment-07-rt-sysvinit.config
create mode 100644 arch/arm/configs/fragment-07-rt.config
create mode 100644 arch/arm/configs/fragment-08-rt-mp13.config
diff --git a/arch/arm/configs/fragment-07-rt-sysvinit.config b/arch/arm/configs/fragment-07-rt-sysvinit.config
new file mode 100644
index 000000000..49a4baf60
--- /dev/null
+++ b/arch/arm/configs/fragment-07-rt-sysvinit.config
@@ -0,0 +1,12 @@
+CONFIG_CGROUPS=y
+# CONFIG_CGROUP_SCHED is not set
+# CONFIG_CGROUP_PIDS is not set
+# CONFIG_CGROUP_RDMA is not set
+# CONFIG_CGROUP_FREEZER is not set
+# CONFIG_CGROUP_DEVICE is not set
+# CONFIG_CGROUP_CPUACCT is not set
+# CONFIG_CGROUP_PERF is not set
+# CONFIG_CGROUP_DEBUG is not set
+# CONFIG_CGROUP_NET_PRIO is not set
+# CONFIG_CGROUP_NET_CLASSID is not set
+
diff --git a/arch/arm/configs/fragment-07-rt.config b/arch/arm/configs/fragment-07-rt.config
new file mode 100644
index 000000000..98bb8735f
--- /dev/null
+++ b/arch/arm/configs/fragment-07-rt.config
@@ -0,0 +1,32 @@
+CONFIG_PREEMPT_RT=y
+
+# disable SCHED_MC
+# CONFIG_MCPM is not set
+
+# Disable CPUFREQ and CPUIDLE
+# CONFIG_CPU_FREQ is not set
+# CONFIG_CPU_IDLE is not set
+
+# Force to have HIGH_RES_TIMERS
+CONFIG_HIGH_RES_TIMERS=y
+
+# force do not go to sleep
+# For multiple core, you should set the specific boot options
+# for isolate the core and render it tickless: "isolcpus=2,3 nohz_full=2,3"
+# Warning: to active only if SMP are present
+# CONFIG_HZ_PERIODIC=y
+
+# to Enable ftrace, you need to enable the following configuraiton:
+# CONFIG_FTRACE=y
+# CONFIG_IRQSOFF_TRACER=y
+# CONFIG_PREEMPT_TRACER=y
+# CONFIG_SCHED_TRACER=y
+# CONFIG_FUNCTION_TRACER=y
+# By default, the ftrace for RT kernel are disabled
+# CONFIG_FTRACE is not set
+# CONFIG_IRQSOFF_TRACER is not set
+# CONFIG_PREEMPT_TRACER is not set
+# CONFIG_SCHED_TRACER is not set
+# CONFIG_FUNCTION_TRACER is not set
+
+
diff --git a/arch/arm/configs/fragment-08-rt-mp13.config b/arch/arm/configs/fragment-08-rt-mp13.config
new file mode 100644
index 000000000..c70d7adc6
--- /dev/null
+++ b/arch/arm/configs/fragment-08-rt-mp13.config
@@ -0,0 +1,2 @@
+# Disable SMP on MP13
+# CONFIG_SMP is not set
--
2.34.1

File diff suppressed because it is too large Load Diff

View File

@ -7,6 +7,24 @@ SRCBRANCH:stm32mpcommon = "v5.15.118/stm/master"
SRCREV = "${AUTOREV}"
SRCREV:stm32mpcommon = "${AUTOREV}"
STM_RT_PATCHES = " \
file://patch-5.15.119-rt65.patch \
file://0023-5.15-stm32mp-rt-49-r1-CLOCK.patch \
file://0024-5.15-stm32mp-rt-49-r1-DMA.patch \
file://0025-5.15-stm32mp-rt-49-r1-MFD.patch \
file://0026-5.15-stm32mp-rt-49-r1-NET-TTY.patch \
file://0027-5.15-stm32mp-rt-49-r1-DEVICETREE.patch \
file://0028-5.15-stm32mp-rt-49-r1-CONFIG.patch \
"
SRC_URI:append:stm32mpcommon = " \
${@bb.utils.contains('DISTRO_FEATURES', 'rt', '${STM_RT_PATCHES}', '', d)} \
"
KERNEL_CONFIG_FRAGMENTS:append:stm32mpcommon = " ${@bb.utils.contains('DISTRO_FEATURES', 'rt', '${S}/arch/arm/configs/fragment-07-rt.config', '', d)}"
KERNEL_CONFIG_FRAGMENTS:append:stm32mpcommon = " ${@bb.utils.contains('DISTRO_FEATURES', 'rt', '${S}/arch/arm/configs/fragment-07-rt-sysvinit.config', '', d)}"
KERNEL_CONFIG_FRAGMENTS:append:ccmp13 = " ${@bb.utils.contains('DISTRO_FEATURES', 'rt', '${S}/arch/arm/configs/fragment-08-rt-mp13.config', '', d)}"
do_assemble_fitimage:append:ccmp1() {
#
# Step 9: Add public keys to the different U-Boot dtb files