mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-16 17:44:19 +00:00

There exist inter-processor interrupts on Versal-Net that do not have corresponding message buffers. These bufferless IPI's on Versal NET SOC are added to static IPI Tables. In hardware description there exists two IPI's called 'IPI6' without buffers that have respective system interrupt values 95 and 101. For these append the string '_95' or '_101' to denote the difference for each. Change-Id: I22bf1a68cb0ed68913eb868f1c197856fc7d82d5 Signed-off-by: Ben Levinsky <ben.levinsky@amd.com>
133 lines
2.8 KiB
C
133 lines
2.8 KiB
C
/*
|
|
* Copyright (c) 2022, Xilinx, Inc. All rights reserved.
|
|
* Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved.
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
|
|
/*
|
|
* Versal NET IPI agent registers access management
|
|
*/
|
|
|
|
#include <lib/utils_def.h>
|
|
#include <ipi.h>
|
|
#include <plat_ipi.h>
|
|
|
|
/* versal_net ipi configuration table */
|
|
static const struct ipi_config versal_net_ipi_table[IPI_ID_MAX] = {
|
|
/* A72 IPI */
|
|
[IPI_ID_APU] = {
|
|
.ipi_bit_mask = IPI0_TRIG_BIT,
|
|
.ipi_reg_base = IPI0_REG_BASE,
|
|
.secure_only = 0,
|
|
},
|
|
|
|
/* PMC IPI */
|
|
[IPI_ID_PMC] = {
|
|
.ipi_bit_mask = PMC_IPI_TRIG_BIT,
|
|
.ipi_reg_base = IPI0_REG_BASE,
|
|
.secure_only = IPI_SECURE_MASK,
|
|
},
|
|
|
|
/* RPU0 IPI */
|
|
[IPI_ID_RPU0] = {
|
|
.ipi_bit_mask = IPI1_TRIG_BIT,
|
|
.ipi_reg_base = IPI1_REG_BASE,
|
|
.secure_only = 0,
|
|
},
|
|
|
|
/* RPU1 IPI */
|
|
[IPI_ID_RPU1] = {
|
|
.ipi_bit_mask = IPI2_TRIG_BIT,
|
|
.ipi_reg_base = IPI2_REG_BASE,
|
|
.secure_only = 0,
|
|
},
|
|
|
|
/* IPI3 IPI */
|
|
[IPI_ID_3] = {
|
|
.ipi_bit_mask = IPI3_TRIG_BIT,
|
|
.ipi_reg_base = IPI3_REG_BASE,
|
|
.secure_only = 0,
|
|
},
|
|
|
|
/* IPI4 IPI */
|
|
[IPI_ID_4] = {
|
|
.ipi_bit_mask = IPI4_TRIG_BIT,
|
|
.ipi_reg_base = IPI4_REG_BASE,
|
|
.secure_only = 0,
|
|
},
|
|
|
|
/* IPI5 IPI */
|
|
[IPI_ID_5] = {
|
|
.ipi_bit_mask = IPI5_TRIG_BIT,
|
|
.ipi_reg_base = IPI5_REG_BASE,
|
|
.secure_only = 0,
|
|
},
|
|
|
|
/* PMC_NOBUF IPI */
|
|
[IPI_ID_PMC_NOBUF] = {
|
|
.ipi_bit_mask = PMC_NOBUF_TRIG_BIT,
|
|
.ipi_reg_base = PMC_NOBUF_REG_BASE,
|
|
.secure_only = IPI_SECURE_MASK,
|
|
},
|
|
|
|
/* IPI6 IPI */
|
|
[IPI_ID_6_NOBUF_95] = {
|
|
.ipi_bit_mask = IPI6_NOBUF_95_TRIG_BIT,
|
|
.ipi_reg_base = IPI6_NOBUF_95_REG_BASE,
|
|
.secure_only = 0,
|
|
},
|
|
|
|
/* IPI1 NO BUF IPI */
|
|
[IPI_ID_1_NOBUF] = {
|
|
.ipi_bit_mask = IPI1_NOBUF_TRIG_BIT,
|
|
.ipi_reg_base = IPI1_NOBUF_REG_BASE,
|
|
.secure_only = 0,
|
|
},
|
|
|
|
/* IPI2 NO BUF IPI */
|
|
[IPI_ID_2_NOBUF] = {
|
|
.ipi_bit_mask = IPI2_NOBUF_TRIG_BIT,
|
|
.ipi_reg_base = IPI2_NOBUF_REG_BASE,
|
|
.secure_only = 0,
|
|
},
|
|
|
|
/* IPI3 NO BUF IPI */
|
|
[IPI_ID_3_NOBUF] = {
|
|
.ipi_bit_mask = IPI3_NOBUF_TRIG_BIT,
|
|
.ipi_reg_base = IPI3_NOBUF_REG_BASE,
|
|
.secure_only = 0,
|
|
},
|
|
|
|
/* IPI4 NO BUF IPI */
|
|
[IPI_ID_4_NOBUF] = {
|
|
.ipi_bit_mask = IPI4_NOBUF_TRIG_BIT,
|
|
.ipi_reg_base = IPI4_NOBUF_REG_BASE,
|
|
.secure_only = 0,
|
|
},
|
|
|
|
/* IPI5 NO BUF IPI */
|
|
[IPI_ID_5_NOBUF] = {
|
|
.ipi_bit_mask = IPI5_NOBUF_TRIG_BIT,
|
|
.ipi_reg_base = IPI5_NOBUF_REG_BASE,
|
|
.secure_only = 0,
|
|
},
|
|
|
|
/* IPI6 NO BUF IPI */
|
|
[IPI_ID_6_NOBUF_101] = {
|
|
.ipi_bit_mask = IPI6_NOBUF_101_TRIG_BIT,
|
|
.ipi_reg_base = IPI6_NOBUF_101_REG_BASE,
|
|
.secure_only = 0,
|
|
},
|
|
};
|
|
|
|
/* versal_net_ipi_config_table_init() - Initialize versal_net IPI configuration
|
|
* data.
|
|
* @ipi_config_table: IPI configuration table.
|
|
* @ipi_total: Total number of IPI available.
|
|
*
|
|
*/
|
|
void versal_net_ipi_config_table_init(void)
|
|
{
|
|
ipi_config_table_init(versal_net_ipi_table, ARRAY_SIZE(versal_net_ipi_table));
|
|
}
|