diff options
author | Jolly Shah <jollys@xilinx.com> | 2019-01-09 12:37:57 -0800 |
---|---|---|
committer | Jolly Shah <jollys@xilinx.com> | 2019-01-09 12:38:00 -0800 |
commit | 65c80d60a2c4f22765cee0988c3b4a7af3fc02ba (patch) | |
tree | 218383379664982523e04f9b2f85d4ff6821f060 /plat/xilinx | |
parent | 5bd029bcfe97b7119536e396aa45279f33e6d738 (diff) |
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 <tejas.patel@xilinx.com>
Reviewed-by: Siva Durga Prasad Paladugu <siva.durga.paladugu@xilinx.com>
Signed-off-by: Jolly Shah <jollys@xilinx.com>
Diffstat (limited to 'plat/xilinx')
-rw-r--r-- | plat/xilinx/common/include/pm_common.h (renamed from plat/xilinx/zynqmp/pm_service/pm_common.h) | 18 | ||||
-rw-r--r-- | plat/xilinx/common/include/pm_ipi.h (renamed from plat/xilinx/zynqmp/pm_service/pm_ipi.h) | 7 | ||||
-rw-r--r-- | plat/xilinx/common/pm_service/pm_ipi.c (renamed from plat/xilinx/zynqmp/pm_service/pm_ipi.c) | 39 | ||||
-rw-r--r-- | plat/xilinx/zynqmp/include/plat_ipi.h | 19 | ||||
-rw-r--r-- | plat/xilinx/zynqmp/include/plat_pm_common.h | 26 | ||||
-rw-r--r-- | plat/xilinx/zynqmp/platform.mk | 2 | ||||
-rw-r--r-- | plat/xilinx/zynqmp/pm_service/pm_client.c | 7 | ||||
-rw-r--r-- | plat/xilinx/zynqmp/pm_service/pm_client.h | 1 |
8 files changed, 77 insertions, 42 deletions
diff --git a/plat/xilinx/zynqmp/pm_service/pm_common.h b/plat/xilinx/common/include/pm_common.h index 10899b88..c0a51f02 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 <stdint.h> - -#include <common/debug.h> - -#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 <plat_pm_common.h> /** * 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 index 650de522..16db5c54 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 <plat_ipi.h> #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 index c73c92fc..034cd5bc 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 <arch_helpers.h> + #include <lib/bakery_lock.h> #include <lib/mmio.h> @@ -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 c6da2418..bccd2f19 100644 --- a/plat/xilinx/zynqmp/include/plat_ipi.h +++ b/plat/xilinx/zynqmp/include/plat_ipi.h @@ -28,6 +28,25 @@ #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 00000000..1b371cc3 --- /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 <stdint.h> +#include <common/debug.h> +#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 f0c75992..d147916f 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 997c3305..163e8916 100644 --- a/plat/xilinx/zynqmp/pm_service/pm_client.c +++ b/plat/xilinx/zynqmp/pm_service/pm_client.c @@ -19,6 +19,7 @@ #include <lib/mmio.h> #include <lib/utils.h> +#include <plat_ipi.h> #include <zynqmp_def.h> #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 0a34a075..adbb76f9 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; |