Skip to content

Commit

Permalink
examples: use atomic_flag type, __sync functions
Browse files Browse the repository at this point in the history
Use atomic_flag type and the GCC __sync built-in functions for atomic
memory access. Initialize using ATOMIC_FLAG_INIT as a compound literal
or a cast if scalar type depending on which atomic.h is used.

The Linux client clears shared memory in ipi_shmem_echo().
Do not clear it again from the RPU in ipi_shmem_echod() to avoid a race.

Signed-off-by: Sergei Korneichuk <[email protected]>
  • Loading branch information
kernelchuk authored and arnopo committed Dec 13, 2022
1 parent cd4fb67 commit a48ec03
Show file tree
Hide file tree
Showing 17 changed files with 70 additions and 39 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2017, Xilinx Inc. and Contributors. All rights reserved.
* Copyright (C) 2022, Advanced Micro Devices, Inc.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
Expand Down Expand Up @@ -44,7 +45,7 @@ struct channel_s {
struct metal_io_region *shm_io; /* Shared memory metal i/o region */
struct metal_io_region *ttc_io; /* TTC metal i/o region */
uint32_t ipi_mask; /* RPU IPI mask */
atomic_int remote_nkicked; /* 0 - kicked from remote */
atomic_flag remote_nkicked; /* 0 - kicked from remote */
};

/**
Expand Down Expand Up @@ -200,7 +201,8 @@ int ipi_latency_demod()
metal_irq_register(ipi_irq, ipi_irq_handler, &ch);
metal_irq_enable(ipi_irq);
/* initialize remote_nkicked */
atomic_init(&ch.remote_nkicked, 1);
ch.remote_nkicked = (atomic_flag)ATOMIC_FLAG_INIT;
atomic_flag_test_and_set(&ch.remote_nkicked);
/* Enable IPI interrupt */
metal_io_write32(ch.ipi_io, IPI_IER_OFFSET, IPI_MASK);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2017, Xilinx Inc. and Contributors. All rights reserved.
* Copyright (C) 2022, Advanced Micro Devices, Inc.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
Expand Down Expand Up @@ -64,7 +65,7 @@ struct msg_hdr_s {
uint32_t len;
};

static atomic_int remote_nkicked; /* is remote kicked, 0 - kicked,
static atomic_flag remote_nkicked; /* is remote kicked, 0 - kicked,
1 - not-kicked */

static int ipi_irq_handler (int vect_id, void *priv)
Expand Down Expand Up @@ -118,8 +119,6 @@ static int ipi_shmem_echod(struct metal_io_region *ipi_io,
ret = -ENOMEM;
goto out;
}
/* Clear shared memory */
metal_io_block_set(shm_io, 0, 0, metal_io_region_size(shm_io));

/* Set tx/rx buffer address offset */
tx_avail_offset = SHM_DESC_OFFSET_TX + SHM_DESC_AVAIL_OFFSET;
Expand Down Expand Up @@ -264,7 +263,8 @@ int ipi_shmem_demod()
metal_irq_register(ipi_irq, ipi_irq_handler, ipi_io);
metal_irq_enable(ipi_irq);
/* initialize remote_nkicked */
atomic_init(&remote_nkicked, 1);
remote_nkicked = (atomic_flag)ATOMIC_FLAG_INIT;
atomic_flag_test_and_set(&remote_nkicked);
/* Enable IPI interrupt */
metal_io_write32(ipi_io, IPI_IER_OFFSET, IPI_MASK);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2017, Xilinx Inc. and Contributors. All rights reserved.
* Copyright (C) 2022, Advanced Micro Devices, Inc.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
Expand Down Expand Up @@ -27,7 +28,7 @@
#define ATOMIC_INT_OFFSET 0x0 /* shared memory offset for atomic operation */
#define ITERATIONS 5000

static atomic_int remote_nkicked; /* is remote kicked, 0 - kicked,
static atomic_flag remote_nkicked; /* is remote kicked, 0 - kicked,
1 - not-kicked */

static int ipi_irq_handler (int vect_id, void *priv)
Expand Down Expand Up @@ -132,7 +133,8 @@ int atomic_shmem_demod()
metal_irq_register(ipi_irq, ipi_irq_handler, ipi_io);
metal_irq_enable(ipi_irq);
/* initialize remote_nkicked */
atomic_init(&remote_nkicked, 1);
remote_nkicked = (atomic_flag)ATOMIC_FLAG_INIT;
atomic_flag_test_and_set(&remote_nkicked);
/* Enable IPI interrupt */
metal_io_write32(ipi_io, IPI_IER_OFFSET, IPI_MASK);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2017, Xilinx Inc. and Contributors. All rights reserved.
* Copyright (C) 2022, Advanced Micro Devices, Inc.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
Expand Down Expand Up @@ -50,7 +51,7 @@ struct channel_s {
struct metal_io_region *shm_io; /* Shared memory metal i/o region */
struct metal_io_region *ttc_io; /* TTC metal i/o region */
uint32_t ipi_mask; /* RPU IPI mask */
atomic_int remote_nkicked; /* 0 - kicked from remote */
atomic_flag remote_nkicked; /* 0 - kicked from remote */
};

struct msg_hdr_s {
Expand Down Expand Up @@ -247,7 +248,8 @@ int shmem_latency_demod()
metal_irq_register(ipi_irq, ipi_irq_handler, &ch);
metal_irq_enable(ipi_irq);
/* initialize remote_nkicked */
atomic_init(&ch.remote_nkicked, 1);
ch.remote_nkicked = (atomic_flag)ATOMIC_FLAG_INIT;
atomic_flag_test_and_set(&ch.remote_nkicked);
/* Enable IPI interrupt */
metal_io_write32(ch.ipi_io, IPI_IER_OFFSET, IPI_MASK);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2017, Xilinx Inc. and Contributors. All rights reserved.
* Copyright (C) 2022, Advanced Micro Devices, Inc.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
Expand Down Expand Up @@ -67,7 +68,7 @@ struct channel_s {
struct metal_io_region *shm_io; /* Shared memory metal i/o region */
struct metal_io_region *ttc_io; /* TTC metal i/o region */
uint32_t ipi_mask; /* RPU IPI mask */
atomic_int remote_nkicked; /* 0 - kicked from remote */
atomic_flag remote_nkicked; /* 0 - kicked from remote */
};

/**
Expand Down Expand Up @@ -229,7 +230,8 @@ static int measure_shmem_throughputd(struct channel_s *ch)
/* Stop RPU TTC counter */
stop_timer(ch->ttc_io, TTC_CNT_RPU_TO_APU);
/* Clear remote kicked flag -- 0 is kicked */
atomic_init(&ch->remote_nkicked, 1);
atomic_flag_clear(&ch->remote_nkicked);
atomic_flag_test_and_set(&ch->remote_nkicked);
/* Kick IPI to notify RPU TTC counter value is ready */
metal_io_write32(ch->ipi_io, IPI_TRIG_OFFSET, ch->ipi_mask);
}
Expand Down Expand Up @@ -337,7 +339,8 @@ int shmem_throughput_demod()
metal_irq_register(ipi_irq, ipi_irq_handler, &ch);
metal_irq_enable(ipi_irq);
/* initialize remote_nkicked */
atomic_init(&ch.remote_nkicked, 1);
ch.remote_nkicked = (atomic_flag)ATOMIC_FLAG_INIT;
atomic_flag_test_and_set(&ch.remote_nkicked);
/* Enable IPI interrupt */
metal_io_write32(ch.ipi_io, IPI_IER_OFFSET, IPI_MASK);

Expand Down
3 changes: 2 additions & 1 deletion examples/system/generic/zynqmp_r5/zynqmp_amp_demo/common.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2017, Xilinx Inc. and Contributors. All rights reserved.
* Copyright (C) 2022, Advanced Micro Devices, Inc.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
Expand Down Expand Up @@ -145,7 +146,7 @@ static inline void wait_for_interrupt()
*
* @param[in] notified - pointer to the notified variable
*/
static inline void wait_for_notified(atomic_int *notified)
static inline void wait_for_notified(atomic_flag *notified)
{
unsigned int flags;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2017, Xilinx Inc. and Contributors. All rights reserved.
* Copyright (C) 2022, Advanced Micro Devices, Inc.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
Expand Down Expand Up @@ -44,7 +45,7 @@ struct channel_s {
struct metal_io_region *shm_io; /* Shared memory metal i/o region */
struct metal_io_region *ttc_io; /* TTC metal i/o region */
uint32_t ipi_mask; /* RPU IPI mask */
atomic_int remote_nkicked; /* 0 - kicked from remote */
atomic_flag remote_nkicked; /* 0 - kicked from remote */
};

/**
Expand Down Expand Up @@ -200,7 +201,8 @@ int ipi_latency_demod()
metal_irq_register(ipi_irq, ipi_irq_handler, &ch);
metal_irq_enable(ipi_irq);
/* initialize remote_nkicked */
atomic_init(&ch.remote_nkicked, 1);
ch.remote_nkicked = (atomic_flag)ATOMIC_FLAG_INIT;
atomic_flag_test_and_set(&ch.remote_nkicked);
/* Enable IPI interrupt */
metal_io_write32(ch.ipi_io, IPI_IER_OFFSET, IPI_MASK);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2017, Xilinx Inc. and Contributors. All rights reserved.
* Copyright (C) 2022, Advanced Micro Devices, Inc.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
Expand Down Expand Up @@ -64,7 +65,7 @@ struct msg_hdr_s {
uint32_t len;
};

static atomic_int remote_nkicked; /* is remote kicked, 0 - kicked,
static atomic_flag remote_nkicked; /* is remote kicked, 0 - kicked,
1 - not-kicked */

static int ipi_irq_handler (int vect_id, void *priv)
Expand Down Expand Up @@ -118,8 +119,6 @@ static int ipi_shmem_echod(struct metal_io_region *ipi_io,
ret = -ENOMEM;
goto out;
}
/* Clear shared memory */
metal_io_block_set(shm_io, 0, 0, metal_io_region_size(shm_io));

/* Set tx/rx buffer address offset */
tx_avail_offset = SHM_DESC_OFFSET_TX + SHM_DESC_AVAIL_OFFSET;
Expand Down Expand Up @@ -264,7 +263,8 @@ int ipi_shmem_demod()
metal_irq_register(ipi_irq, ipi_irq_handler, ipi_io);
metal_irq_enable(ipi_irq);
/* initialize remote_nkicked */
atomic_init(&remote_nkicked, 1);
remote_nkicked = (atomic_flag)ATOMIC_FLAG_INIT;
atomic_flag_test_and_set(&remote_nkicked);
/* Enable IPI interrupt */
metal_io_write32(ipi_io, IPI_IER_OFFSET, IPI_MASK);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2017, Xilinx Inc. and Contributors. All rights reserved.
* Copyright (C) 2022, Advanced Micro Devices, Inc.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
Expand Down Expand Up @@ -27,7 +28,7 @@
#define ATOMIC_INT_OFFSET 0x0 /* shared memory offset for atomic operation */
#define ITERATIONS 5000

static atomic_int remote_nkicked; /* is remote kicked, 0 - kicked,
static atomic_flag remote_nkicked; /* is remote kicked, 0 - kicked,
1 - not-kicked */

static int ipi_irq_handler (int vect_id, void *priv)
Expand Down Expand Up @@ -132,7 +133,8 @@ int atomic_shmem_demod()
metal_irq_register(ipi_irq, ipi_irq_handler, ipi_io);
metal_irq_enable(ipi_irq);
/* initialize remote_nkicked */
atomic_init(&remote_nkicked, 1);
remote_nkicked = (atomic_flag)ATOMIC_FLAG_INIT;
atomic_flag_test_and_set(&remote_nkicked);
/* Enable IPI interrupt */
metal_io_write32(ipi_io, IPI_IER_OFFSET, IPI_MASK);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2017, Xilinx Inc. and Contributors. All rights reserved.
* Copyright (C) 2022, Advanced Micro Devices, Inc.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
Expand Down Expand Up @@ -50,7 +51,7 @@ struct channel_s {
struct metal_io_region *shm_io; /* Shared memory metal i/o region */
struct metal_io_region *ttc_io; /* TTC metal i/o region */
uint32_t ipi_mask; /* RPU IPI mask */
atomic_int remote_nkicked; /* 0 - kicked from remote */
atomic_flag remote_nkicked; /* 0 - kicked from remote */
};

struct msg_hdr_s {
Expand Down Expand Up @@ -247,7 +248,8 @@ int shmem_latency_demod()
metal_irq_register(ipi_irq, ipi_irq_handler, &ch);
metal_irq_enable(ipi_irq);
/* initialize remote_nkicked */
atomic_init(&ch.remote_nkicked, 1);
ch.remote_nkicked = (atomic_flag)ATOMIC_FLAG_INIT;
atomic_flag_test_and_set(&ch.remote_nkicked);
/* Enable IPI interrupt */
metal_io_write32(ch.ipi_io, IPI_IER_OFFSET, IPI_MASK);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2017, Xilinx Inc. and Contributors. All rights reserved.
* Copyright (C) 2022, Advanced Micro Devices, Inc.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
Expand Down Expand Up @@ -67,7 +68,7 @@ struct channel_s {
struct metal_io_region *shm_io; /* Shared memory metal i/o region */
struct metal_io_region *ttc_io; /* TTC metal i/o region */
uint32_t ipi_mask; /* RPU IPI mask */
atomic_int remote_nkicked; /* 0 - kicked from remote */
atomic_flag remote_nkicked; /* 0 - kicked from remote */
};

/**
Expand Down Expand Up @@ -229,7 +230,8 @@ static int measure_shmem_throughputd(struct channel_s *ch)
/* Stop RPU TTC counter */
stop_timer(ch->ttc_io, TTC_CNT_RPU_TO_APU);
/* Clear remote kicked flag -- 0 is kicked */
atomic_init(&ch->remote_nkicked, 1);
atomic_flag_clear(&ch->remote_nkicked);
atomic_flag_test_and_set(&ch->remote_nkicked);
/* Kick IPI to notify RPU TTC counter value is ready */
metal_io_write32(ch->ipi_io, IPI_TRIG_OFFSET, ch->ipi_mask);
}
Expand Down Expand Up @@ -337,7 +339,8 @@ int shmem_throughput_demod()
metal_irq_register(ipi_irq, ipi_irq_handler, &ch);
metal_irq_enable(ipi_irq);
/* initialize remote_nkicked */
atomic_init(&ch.remote_nkicked, 1);
ch.remote_nkicked = (atomic_flag)ATOMIC_FLAG_INIT;
atomic_flag_test_and_set(&ch.remote_nkicked);
/* Enable IPI interrupt */
metal_io_write32(ch.ipi_io, IPI_IER_OFFSET, IPI_MASK);

Expand Down
3 changes: 2 additions & 1 deletion examples/system/linux/zynqmp/zynqmp_amp_demo/common.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2017, Xilinx Inc. and Contributors. All rights reserved.
* Copyright (C) 2022, Advanced Micro Devices, Inc.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
Expand Down Expand Up @@ -150,7 +151,7 @@ int shmem_throughput_demo();
*
* @param[in] notified - pointer to the notified variable
*/
static inline void wait_for_notified(atomic_int *notified)
static inline void wait_for_notified(atomic_flag *notified)
{
unsigned int flags;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2017, Xilinx Inc. and Contributors. All rights reserved.
* Copyright (C) 2022, Advanced Micro Devices, Inc.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
Expand Down Expand Up @@ -57,7 +58,7 @@ struct channel_s {
struct metal_device *ttc_dev; /* TTC metal device */
struct metal_io_region *ttc_io; /* TTC metal i/o region */
uint32_t ipi_mask; /* RPU IPI mask */
atomic_int remote_nkicked; /* 0 - kicked from remote */
atomic_flag remote_nkicked; /* 0 - kicked from remote */
};

/**
Expand Down Expand Up @@ -267,7 +268,8 @@ int ipi_latency_demo()
/* clear old IPI interrupt */
metal_io_write32(ch.ipi_io, IPI_ISR_OFFSET, IPI_MASK);
/* initialize remote_nkicked */
atomic_init(&ch.remote_nkicked, 1);
ch.remote_nkicked = (atomic_flag)ATOMIC_FLAG_INIT;
atomic_flag_test_and_set(&ch.remote_nkicked);
ch.ipi_mask = IPI_MASK;
/* Register IPI irq handler */
metal_irq_register(ipi_irq, ipi_irq_handler, &ch);
Expand Down
6 changes: 4 additions & 2 deletions examples/system/linux/zynqmp/zynqmp_amp_demo/ipi_shmem_demo.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2017, Xilinx Inc. and Contributors. All rights reserved.
* Copyright (C) 2022, Advanced Micro Devices, Inc.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
Expand Down Expand Up @@ -67,7 +68,7 @@ struct msg_hdr_s {
uint32_t len;
};

static atomic_int remote_nkicked; /* is remote kicked, 0 - kicked,
static atomic_flag remote_nkicked; /* is remote kicked, 0 - kicked,
1 - not-kicked */

/**
Expand Down Expand Up @@ -369,7 +370,8 @@ int ipi_shmem_demo()
metal_irq_register(ipi_irq, ipi_irq_handler, ipi_io);
metal_irq_enable(ipi_irq);
/* initialize remote_nkicked */
atomic_init(&remote_nkicked, 1);
remote_nkicked = (atomic_flag)ATOMIC_FLAG_INIT;
atomic_flag_test_and_set(&remote_nkicked);
/* Enable IPI interrupt */
metal_io_write32(ipi_io, IPI_IER_OFFSET, IPI_MASK);

Expand Down
Loading

0 comments on commit a48ec03

Please sign in to comment.