From 65c80d60a2c4f22765cee0988c3b4a7af3fc02ba Mon Sep 17 00:00:00 2001 From: Jolly Shah Date: Wed, 9 Jan 2019 12:37:57 -0800 Subject: [PATCH] xilinx: Move IPI functions to common file pm_service ipi functions can be used by other xilinx platforms. So move it to common directory. Also change node_id member type in pm_proc structure so it can be used for versal where device IDs are used instead of node IDs. To accommodate this change header files are re-organized. Signed-off-by: Tejas Patel Reviewed-by: Siva Durga Prasad Paladugu Signed-off-by: Jolly Shah --- .../pm_service => common/include}/pm_common.h | 18 ++------- .../pm_service => common/include}/pm_ipi.h | 7 +++- .../{zynqmp => common}/pm_service/pm_ipi.c | 39 +++++++------------ plat/xilinx/zynqmp/include/plat_ipi.h | 19 +++++++++ plat/xilinx/zynqmp/include/plat_pm_common.h | 26 +++++++++++++ plat/xilinx/zynqmp/platform.mk | 2 +- plat/xilinx/zynqmp/pm_service/pm_client.c | 7 ++++ plat/xilinx/zynqmp/pm_service/pm_client.h | 1 + 8 files changed, 77 insertions(+), 42 deletions(-) rename plat/xilinx/{zynqmp/pm_service => common/include}/pm_common.h (68%) rename plat/xilinx/{zynqmp/pm_service => common/include}/pm_ipi.h (79%) rename plat/xilinx/{zynqmp => common}/pm_service/pm_ipi.c (89%) create mode 100644 plat/xilinx/zynqmp/include/plat_pm_common.h diff --git a/plat/xilinx/zynqmp/pm_service/pm_common.h b/plat/xilinx/common/include/pm_common.h similarity index 68% rename from plat/xilinx/zynqmp/pm_service/pm_common.h rename to plat/xilinx/common/include/pm_common.h index 10899b885..c0a51f029 100644 --- a/plat/xilinx/zynqmp/pm_service/pm_common.h +++ b/plat/xilinx/common/include/pm_common.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2015, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2013-2018, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -13,18 +13,7 @@ #define PM_COMMON_H #include - -#include - -#include "pm_defs.h" - -#define PAYLOAD_ARG_CNT 6U -#define PAYLOAD_ARG_SIZE 4U /* size in bytes */ - -#define ZYNQMP_TZ_VERSION_MAJOR 1 -#define ZYNQMP_TZ_VERSION_MINOR 0 -#define ZYNQMP_TZ_VERSION ((ZYNQMP_TZ_VERSION_MAJOR << 16) | \ - ZYNQMP_TZ_VERSION_MINOR) +#include /** * pm_ipi - struct for capturing IPI-channel specific info @@ -46,12 +35,11 @@ struct pm_ipi { * (in APU all processors share one IPI channel) */ struct pm_proc { - const enum pm_node_id node_id; + const uint32_t node_id; const unsigned int pwrdn_mask; const struct pm_ipi *ipi; }; const struct pm_proc *pm_get_proc(unsigned int cpuid); -const struct pm_proc *pm_get_proc_by_node(enum pm_node_id nid); #endif /* PM_COMMON_H */ diff --git a/plat/xilinx/zynqmp/pm_service/pm_ipi.h b/plat/xilinx/common/include/pm_ipi.h similarity index 79% rename from plat/xilinx/zynqmp/pm_service/pm_ipi.h rename to plat/xilinx/common/include/pm_ipi.h index 650de5220..16db5c548 100644 --- a/plat/xilinx/zynqmp/pm_service/pm_ipi.h +++ b/plat/xilinx/common/include/pm_ipi.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2017, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2013-2018, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -7,8 +7,12 @@ #ifndef PM_IPI_H #define PM_IPI_H +#include #include "pm_common.h" +#define IPI_BLOCKING 1 +#define IPI_NON_BLOCKING 0 + int pm_ipi_init(const struct pm_proc *proc); enum pm_ret_status pm_ipi_send(const struct pm_proc *proc, @@ -21,5 +25,6 @@ enum pm_ret_status pm_ipi_send_sync(const struct pm_proc *proc, void pm_ipi_buff_read_callb(unsigned int *value, size_t count); void pm_ipi_irq_enable(const struct pm_proc *proc); void pm_ipi_irq_clear(const struct pm_proc *proc); +uint32_t pm_ipi_irq_status(const struct pm_proc *proc); #endif /* PM_IPI_H */ diff --git a/plat/xilinx/zynqmp/pm_service/pm_ipi.c b/plat/xilinx/common/pm_service/pm_ipi.c similarity index 89% rename from plat/xilinx/zynqmp/pm_service/pm_ipi.c rename to plat/xilinx/common/pm_service/pm_ipi.c index c73c92fc9..034cd5bc8 100644 --- a/plat/xilinx/zynqmp/pm_service/pm_ipi.c +++ b/plat/xilinx/common/pm_service/pm_ipi.c @@ -4,7 +4,9 @@ * SPDX-License-Identifier: BSD-3-Clause */ + #include + #include #include @@ -15,34 +17,9 @@ #include "pm_ipi.h" -/* IPI message buffers */ -#define IPI_BUFFER_BASEADDR 0xFF990000U - -#define IPI_BUFFER_APU_BASE (IPI_BUFFER_BASEADDR + 0x400U) -#define IPI_BUFFER_PMU_BASE (IPI_BUFFER_BASEADDR + 0xE00U) - -#define IPI_BUFFER_LOCAL_BASE IPI_BUFFER_APU_BASE -#define IPI_BUFFER_REMOTE_BASE IPI_BUFFER_PMU_BASE - -#define IPI_BUFFER_TARGET_LOCAL_OFFSET 0x80U -#define IPI_BUFFER_TARGET_REMOTE_OFFSET 0x1C0U - -#define IPI_BUFFER_MAX_WORDS 8 - -#define IPI_BUFFER_REQ_OFFSET 0x0U -#define IPI_BUFFER_RESP_OFFSET 0x20U - -#define IPI_BLOCKING 1 -#define IPI_NON_BLOCKING 0 DEFINE_BAKERY_LOCK(pm_secure_lock); -const struct pm_ipi apu_ipi = { - .local_ipi_id = IPI_ID_APU, - .remote_ipi_id = IPI_ID_PMU0, - .buffer_base = IPI_BUFFER_APU_BASE, -}; - /** * pm_ipi_init() - Initialize IPI peripheral for communication with * remote processor @@ -239,3 +216,15 @@ void pm_ipi_irq_clear(const struct pm_proc *proc) { ipi_mb_ack(proc->ipi->local_ipi_id, proc->ipi->remote_ipi_id); } + +uint32_t pm_ipi_irq_status(const struct pm_proc *proc) +{ + int ret; + + ret = ipi_mb_enquire_status(proc->ipi->local_ipi_id, + proc->ipi->remote_ipi_id); + if (ret & IPI_MB_STATUS_RECV_PENDING) + return 1; + else + return 0; +} diff --git a/plat/xilinx/zynqmp/include/plat_ipi.h b/plat/xilinx/zynqmp/include/plat_ipi.h index c6da2418f..bccd2f194 100644 --- a/plat/xilinx/zynqmp/include/plat_ipi.h +++ b/plat/xilinx/zynqmp/include/plat_ipi.h @@ -27,6 +27,25 @@ #define IPI_ID_PL2 9U #define IPI_ID_PL3 10U +/********************************************************************* + * IPI message buffers + ********************************************************************/ +#define IPI_BUFFER_BASEADDR 0xFF990000U + +#define IPI_BUFFER_APU_BASE (IPI_BUFFER_BASEADDR + 0x400U) +#define IPI_BUFFER_PMU_BASE (IPI_BUFFER_BASEADDR + 0xE00U) + +#define IPI_BUFFER_LOCAL_BASE IPI_BUFFER_APU_BASE +#define IPI_BUFFER_REMOTE_BASE IPI_BUFFER_PMU_BASE + +#define IPI_BUFFER_TARGET_LOCAL_OFFSET 0x80U +#define IPI_BUFFER_TARGET_REMOTE_OFFSET 0x1C0U + +#define IPI_BUFFER_MAX_WORDS 8 + +#define IPI_BUFFER_REQ_OFFSET 0x0U +#define IPI_BUFFER_RESP_OFFSET 0x20U + /********************************************************************* * Platform specific IPI API declarations ********************************************************************/ diff --git a/plat/xilinx/zynqmp/include/plat_pm_common.h b/plat/xilinx/zynqmp/include/plat_pm_common.h new file mode 100644 index 000000000..1b371cc36 --- /dev/null +++ b/plat/xilinx/zynqmp/include/plat_pm_common.h @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2013-2018, ARM Limited and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * Contains platform specific definitions of commonly used macros data types + * for PU Power Management. This file should be common for all PU's. + */ + +#ifndef PLAT_PM_COMMON_H +#define PLAT_PM_COMMON_H + +#include +#include +#include "pm_defs.h" + +#define PAYLOAD_ARG_CNT 6U +#define PAYLOAD_ARG_SIZE 4U /* size in bytes */ + +#define ZYNQMP_TZ_VERSION_MAJOR 1 +#define ZYNQMP_TZ_VERSION_MINOR 0 +#define ZYNQMP_TZ_VERSION ((ZYNQMP_TZ_VERSION_MAJOR << 16) | \ + ZYNQMP_TZ_VERSION_MINOR) +#endif /* _PLAT_PM_COMMON_H_ */ diff --git a/plat/xilinx/zynqmp/platform.mk b/plat/xilinx/zynqmp/platform.mk index f0c759925..d147916f7 100644 --- a/plat/xilinx/zynqmp/platform.mk +++ b/plat/xilinx/zynqmp/platform.mk @@ -73,6 +73,7 @@ BL31_SOURCES += drivers/arm/cci/cci.c \ lib/cpus/aarch64/aem_generic.S \ lib/cpus/aarch64/cortex_a53.S \ plat/common/plat_psci_common.c \ + plat/xilinx/common/pm_service/pm_ipi.c \ plat/xilinx/zynqmp/bl31_zynqmp_setup.c \ plat/xilinx/zynqmp/plat_psci.c \ plat/xilinx/zynqmp/plat_zynqmp.c \ @@ -85,6 +86,5 @@ BL31_SOURCES += drivers/arm/cci/cci.c \ plat/xilinx/zynqmp/pm_service/pm_api_pinctrl.c \ plat/xilinx/zynqmp/pm_service/pm_api_ioctl.c \ plat/xilinx/zynqmp/pm_service/pm_api_clock.c \ - plat/xilinx/zynqmp/pm_service/pm_ipi.c \ plat/xilinx/zynqmp/pm_service/pm_client.c \ plat/xilinx/zynqmp/ipi_mailbox_service/ipi_mailbox_svc.c diff --git a/plat/xilinx/zynqmp/pm_service/pm_client.c b/plat/xilinx/zynqmp/pm_service/pm_client.c index 997c33053..163e8916f 100644 --- a/plat/xilinx/zynqmp/pm_service/pm_client.c +++ b/plat/xilinx/zynqmp/pm_service/pm_client.c @@ -19,6 +19,7 @@ #include #include +#include #include #include "pm_api_sys.h" #include "pm_client.h" @@ -35,6 +36,12 @@ DEFINE_BAKERY_LOCK(pm_client_secure_lock); extern const struct pm_ipi apu_ipi; +const struct pm_ipi apu_ipi = { + .local_ipi_id = IPI_ID_APU, + .remote_ipi_id = IPI_ID_PMU0, + .buffer_base = IPI_BUFFER_APU_BASE, +}; + static uint32_t suspend_mode = PM_SUSPEND_MODE_STD; /* Order in pm_procs_all array must match cpu ids */ diff --git a/plat/xilinx/zynqmp/pm_service/pm_client.h b/plat/xilinx/zynqmp/pm_service/pm_client.h index 0a34a0757..adbb76f9b 100644 --- a/plat/xilinx/zynqmp/pm_service/pm_client.h +++ b/plat/xilinx/zynqmp/pm_service/pm_client.h @@ -21,6 +21,7 @@ void pm_client_abort_suspend(void); void pm_client_wakeup(const struct pm_proc *proc); enum pm_ret_status set_ocm_retention(void); enum pm_ret_status pm_set_suspend_mode(uint32_t mode); +const struct pm_proc *pm_get_proc_by_node(enum pm_node_id nid); /* Global variables to be set in pm_client.c */ extern const struct pm_proc *primary_proc; -- GitLab