Skip to content

Commit fdb3457

Browse files
ajarmouni-stnashif
authored andcommitted
tests: drivers: uart: async_api: support DCache with nocache memory
Add support for running tests with DCache enabled & put DMA buffers in a nocache memory region to avoid coherency issues. Signed-off-by: Abderrahmane Jarmouni <abderrahmane.jarmouni-ext@st.com>
1 parent e783aaf commit fdb3457

File tree

2 files changed

+93
-3
lines changed

2 files changed

+93
-3
lines changed
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# Copyright (c) 2024 STMicroelectronics
2+
#
3+
# SPDX-License-Identifier: Apache-2.0
4+
5+
mainmenu "UART Async Test"
6+
7+
source "Kconfig.zephyr"
8+
9+
if DCACHE
10+
11+
config DT_DEFINED_NOCACHE
12+
bool "Enable this if a nocache region is defined in devicetree"
13+
14+
if DT_DEFINED_NOCACHE
15+
16+
config DT_DEFINED_NOCACHE_NAME
17+
string "Name of the nocache region defined in devicetree (uppercase)"
18+
19+
endif # DT_DEFINED_NOCACHE
20+
21+
endif # DCACHE

tests/drivers/uart/uart_async_api/src/test_uart_async.c

Lines changed: 72 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,22 @@
11
/*
2-
* Copyright (c) 2019 Nordic Semiconductor ASA
2+
* Copyright (c) 2019 Nordic Semiconductor ASA
3+
* Copyright (c) 2024 STMicroelectronics
34
*
45
* SPDX-License-Identifier: Apache-2.0
56
*/
67

78
#include "test_uart.h"
89

10+
#if defined(CONFIG_DCACHE) && defined(CONFIG_DT_DEFINED_NOCACHE)
11+
#define __NOCACHE __attribute__ ((__section__(CONFIG_DT_DEFINED_NOCACHE_NAME)))
12+
#define NOCACHE_MEM 1
13+
#elif defined(CONFIG_DCACHE) && defined(CONFIG_NOCACHE_MEMORY)
14+
#define __NOCACHE __nocache
15+
#define NOCACHE_MEM 1
16+
#else
17+
#define NOCACHE_MEM 0
18+
#endif /* CONFIG_NOCACHE_MEMORY */
19+
920
K_SEM_DEFINE(tx_done, 0, 1);
1021
K_SEM_DEFINE(tx_aborted, 0, 1);
1122
K_SEM_DEFINE(rx_rdy, 0, 1);
@@ -79,14 +90,18 @@ static void uart_async_test_init(void)
7990

8091
struct test_data {
8192
volatile uint32_t tx_aborted_count;
82-
uint8_t rx_first_buffer[10];
93+
__aligned(32) uint8_t rx_first_buffer[10];
8394
uint32_t recv_bytes_first_buffer;
84-
uint8_t rx_second_buffer[5];
95+
__aligned(32) uint8_t rx_second_buffer[5];
8596
uint32_t recv_bytes_second_buffer;
8697
bool supply_second_buffer;
8798
};
8899

100+
#if NOCACHE_MEM
101+
static struct test_data tdata __used __NOCACHE;
102+
#else
89103
ZTEST_BMEM struct test_data tdata;
104+
#endif /* NOCACHE_MEM */
90105

91106
static void test_single_read_callback(const struct device *dev,
92107
struct uart_event *evt, void *user_data)
@@ -308,8 +323,13 @@ ZTEST_USER(uart_async_multi_rx, test_multiple_rx_enable)
308323
tdata_check_recv_buffers(tx_buf, sizeof(tx_buf));
309324
}
310325

326+
#if NOCACHE_MEM
327+
static __aligned(32) uint8_t chained_read_buf[2][8] __used __NOCACHE;
328+
static __aligned(32) uint8_t chained_cpy_buf[10] __used __NOCACHE;
329+
#else
311330
ZTEST_BMEM uint8_t chained_read_buf[2][8];
312331
ZTEST_BMEM uint8_t chained_cpy_buf[10];
332+
#endif /* NOCACHE_MEM */
313333
ZTEST_BMEM volatile uint8_t rx_data_idx;
314334
ZTEST_BMEM uint8_t rx_buf_idx;
315335

@@ -358,7 +378,11 @@ static void *chained_read_setup(void)
358378

359379
ZTEST_USER(uart_async_chain_read, test_chained_read)
360380
{
381+
#if NOCACHE_MEM
382+
static __aligned(32) uint8_t tx_buf[10] __used __NOCACHE;
383+
#else
361384
uint8_t tx_buf[10];
385+
#endif /* NOCACHE_MEM */
362386
int iter = 6;
363387
uint32_t rx_timeout_ms = 50;
364388
int err;
@@ -390,7 +414,11 @@ ZTEST_USER(uart_async_chain_read, test_chained_read)
390414
"RX_DISABLED timeout");
391415
}
392416

417+
#if NOCACHE_MEM
418+
static __aligned(32) uint8_t double_buffer[2][12] __used __NOCACHE;
419+
#else
393420
ZTEST_BMEM uint8_t double_buffer[2][12];
421+
#endif /* NOCACHE_MEM */
394422
ZTEST_DMEM uint8_t *next_buf = double_buffer[1];
395423

396424
static void test_double_buffer_callback(const struct device *dev,
@@ -431,7 +459,11 @@ static void *double_buffer_setup(void)
431459

432460
ZTEST_USER(uart_async_double_buf, test_double_buffer)
433461
{
462+
#if NOCACHE_MEM
463+
static __aligned(32) uint8_t tx_buf[4] __used __NOCACHE;
464+
#else
434465
uint8_t tx_buf[4];
466+
#endif /* NOCACHE_MEM */
435467

436468
zassert_equal(uart_rx_enable(uart_dev,
437469
double_buffer[0],
@@ -456,8 +488,13 @@ ZTEST_USER(uart_async_double_buf, test_double_buffer)
456488
"RX_DISABLED timeout");
457489
}
458490

491+
#if NOCACHE_MEM
492+
static __aligned(32) uint8_t test_read_abort_rx_buf[2][100] __used __NOCACHE;
493+
static __aligned(32) uint8_t test_read_abort_read_buf[100] __used __NOCACHE;
494+
#else
459495
ZTEST_BMEM uint8_t test_read_abort_rx_buf[2][100];
460496
ZTEST_BMEM uint8_t test_read_abort_read_buf[100];
497+
#endif /* NOCACHE_MEM */
461498
ZTEST_BMEM int test_read_abort_rx_cnt;
462499

463500
static void test_read_abort_callback(const struct device *dev,
@@ -526,8 +563,13 @@ static void *read_abort_setup(void)
526563

527564
ZTEST_USER(uart_async_read_abort, test_read_abort)
528565
{
566+
#if NOCACHE_MEM
567+
static __aligned(32) uint8_t rx_buf[100] __used __NOCACHE;
568+
static __aligned(32) uint8_t tx_buf[100] __used __NOCACHE;
569+
#else
529570
uint8_t rx_buf[100];
530571
uint8_t tx_buf[100];
572+
#endif /* NOCACHE_MEM */
531573

532574
memset(rx_buf, 0, sizeof(rx_buf));
533575
memset(tx_buf, 1, sizeof(tx_buf));
@@ -568,7 +610,11 @@ ZTEST_USER(uart_async_read_abort, test_read_abort)
568610

569611
ZTEST_BMEM volatile size_t sent;
570612
ZTEST_BMEM volatile size_t received;
613+
#if NOCACHE_MEM
614+
static __aligned(32) uint8_t test_rx_buf[2][100] __used __NOCACHE;
615+
#else
571616
ZTEST_BMEM uint8_t test_rx_buf[2][100];
617+
#endif /* NOCACHE_MEM */
572618

573619
static void test_write_abort_callback(const struct device *dev,
574620
struct uart_event *evt, void *user_data)
@@ -612,7 +658,11 @@ static void *write_abort_setup(void)
612658

613659
ZTEST_USER(uart_async_write_abort, test_write_abort)
614660
{
661+
#if NOCACHE_MEM
662+
static __aligned(32) uint8_t tx_buf[100] __used __NOCACHE;
663+
#else
615664
uint8_t tx_buf[100];
665+
#endif /* NOCACHE_MEM */
616666

617667
memset(test_rx_buf, 0, sizeof(test_rx_buf));
618668
memset(tx_buf, 1, sizeof(tx_buf));
@@ -681,8 +731,13 @@ static void *forever_timeout_setup(void)
681731

682732
ZTEST_USER(uart_async_timeout, test_forever_timeout)
683733
{
734+
#if NOCACHE_MEM
735+
static __aligned(32) uint8_t rx_buf[100] __used __NOCACHE;
736+
static __aligned(32) uint8_t tx_buf[100] __used __NOCACHE;
737+
#else
684738
uint8_t rx_buf[100];
685739
uint8_t tx_buf[100];
740+
#endif /* NOCACHE_MEM */
686741

687742
memset(rx_buf, 0, sizeof(rx_buf));
688743
memset(tx_buf, 1, sizeof(tx_buf));
@@ -715,7 +770,11 @@ ZTEST_USER(uart_async_timeout, test_forever_timeout)
715770
}
716771

717772

773+
#if NOCACHE_MEM
774+
const uint8_t chained_write_tx_bufs[2][10] = {"Message 1", "Message 2"};
775+
#else
718776
ZTEST_DMEM uint8_t chained_write_tx_bufs[2][10] = {"Message 1", "Message 2"};
777+
#endif /* NOCACHE_MEM */
719778
ZTEST_DMEM bool chained_write_next_buf = true;
720779
ZTEST_BMEM volatile uint8_t tx_sent;
721780

@@ -761,7 +820,11 @@ static void *chained_write_setup(void)
761820

762821
ZTEST_USER(uart_async_chain_write, test_chained_write)
763822
{
823+
#if NOCACHE_MEM
824+
static __aligned(32) uint8_t rx_buf[20] __used __NOCACHE;
825+
#else
764826
uint8_t rx_buf[20];
827+
#endif /* NOCACHE_MEM */
765828

766829
memset(rx_buf, 0, sizeof(rx_buf));
767830

@@ -787,9 +850,15 @@ ZTEST_USER(uart_async_chain_write, test_chained_write)
787850
"RX_DISABLED timeout");
788851
}
789852

853+
#if NOCACHE_MEM
854+
static __aligned(32) uint8_t long_rx_buf[1024] __used __NOCACHE;
855+
static __aligned(32) uint8_t long_rx_buf2[1024] __used __NOCACHE;
856+
static __aligned(32) uint8_t long_tx_buf[1000] __used __NOCACHE;
857+
#else
790858
ZTEST_BMEM uint8_t long_rx_buf[1024];
791859
ZTEST_BMEM uint8_t long_rx_buf2[1024];
792860
ZTEST_BMEM uint8_t long_tx_buf[1000];
861+
#endif /* NOCACHE_MEM */
793862
ZTEST_BMEM volatile uint8_t evt_num;
794863
ZTEST_BMEM size_t long_received[2];
795864

0 commit comments

Comments
 (0)