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 10899b885cbf7f11d5eae5d5d6356a5cf4a1f495..c0a51f0294adf3461f79eef4fb2e979b0292be79 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 650de5220535a04f32908714937754fa0eef3504..16db5c548217bfe5c1d70e6379a919b811ab103a 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 c73c92fc9540cc7ab4160ef62600a256f9982200..034cd5bc8ce46a0e98ced735fb140d6a188177cd 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 c6da2418f440f31c6d42a112fe72870c2c6f4aa2..bccd2f1944868a4e2cfd2933a0eb573b6fd11d99 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 0000000000000000000000000000000000000000..1b371cc367a903cc968d35ef8983c1188e63899e --- /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 f0c759925dc93037897db41822f8e53340ed4174..d147916f7cf43c7147c3eacee5961fc549ab43e0 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 997c330535645b440326b20d1e93a8a8ebff74b0..163e8916f2fa30019a56c137a61de48856f25653 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 0a34a07578500b9303593e379bb6f735274d9675..adbb76f9b19fd42ce23722a0602f56fd15c01ece 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;