diff --git a/plat/xilinx/common/include/pm_common.h b/plat/xilinx/common/include/pm_common.h new file mode 100644 index 0000000..c0a51f0 --- /dev/null +++ b/plat/xilinx/common/include/pm_common.h @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2013-2018, ARM Limited and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * Contains definitions of commonly used macros and data types needed + * for PU Power Management. This file should be common for all PU's. + */ + +#ifndef PM_COMMON_H +#define PM_COMMON_H + +#include +#include + +/** + * pm_ipi - struct for capturing IPI-channel specific info + * @local_ipi_id Local IPI agent ID + * @remote_ipi_id Remote IPI Agent ID + * @buffer_base base address for payload buffer + */ +struct pm_ipi { + const uint32_t local_ipi_id; + const uint32_t remote_ipi_id; + const uintptr_t buffer_base; +}; + +/** + * pm_proc - struct for capturing processor related info + * @node_id node-ID of the processor + * @pwrdn_mask cpu-specific mask to be used for power control register + * @ipi pointer to IPI channel structure + * (in APU all processors share one IPI channel) + */ +struct pm_proc { + 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); + +#endif /* PM_COMMON_H */ diff --git a/plat/xilinx/common/include/pm_ipi.h b/plat/xilinx/common/include/pm_ipi.h new file mode 100644 index 0000000..16db5c5 --- /dev/null +++ b/plat/xilinx/common/include/pm_ipi.h @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2013-2018, ARM Limited and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#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, + uint32_t payload[PAYLOAD_ARG_CNT]); +enum pm_ret_status pm_ipi_send_non_blocking(const struct pm_proc *proc, + uint32_t payload[PAYLOAD_ARG_CNT]); +enum pm_ret_status pm_ipi_send_sync(const struct pm_proc *proc, + uint32_t payload[PAYLOAD_ARG_CNT], + unsigned int *value, size_t count); +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/common/pm_service/pm_ipi.c b/plat/xilinx/common/pm_service/pm_ipi.c new file mode 100644 index 0000000..034cd5b --- /dev/null +++ b/plat/xilinx/common/pm_service/pm_ipi.c @@ -0,0 +1,230 @@ +/* + * Copyright (c) 2013-2018, ARM Limited and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + + +#include + +#include +#include + +#include +#include +#include +#include + +#include "pm_ipi.h" + + +DEFINE_BAKERY_LOCK(pm_secure_lock); + +/** + * pm_ipi_init() - Initialize IPI peripheral for communication with + * remote processor + * + * @proc Pointer to the processor who is initiating request + * @return On success, the initialization function must return 0. + * Any other return value will cause the framework to ignore + * the service + * + * Called from pm_setup initialization function + */ +int pm_ipi_init(const struct pm_proc *proc) +{ + bakery_lock_init(&pm_secure_lock); + ipi_mb_open(proc->ipi->local_ipi_id, proc->ipi->remote_ipi_id); + + return 0; +} + +/** + * pm_ipi_send_common() - Sends IPI request to the remote processor + * @proc Pointer to the processor who is initiating request + * @payload API id and call arguments to be written in IPI buffer + * + * Send an IPI request to the power controller. Caller needs to hold + * the 'pm_secure_lock' lock. + * + * @return Returns status, either success or error+reason + */ +static enum pm_ret_status pm_ipi_send_common(const struct pm_proc *proc, + uint32_t payload[PAYLOAD_ARG_CNT], + uint32_t is_blocking) +{ + unsigned int offset = 0; + uintptr_t buffer_base = proc->ipi->buffer_base + + IPI_BUFFER_TARGET_REMOTE_OFFSET + + IPI_BUFFER_REQ_OFFSET; + + /* Write payload into IPI buffer */ + for (size_t i = 0; i < PAYLOAD_ARG_CNT; i++) { + mmio_write_32(buffer_base + offset, payload[i]); + offset += PAYLOAD_ARG_SIZE; + } + + /* Generate IPI to remote processor */ + ipi_mb_notify(proc->ipi->local_ipi_id, proc->ipi->remote_ipi_id, + is_blocking); + + return PM_RET_SUCCESS; +} + +/** + * pm_ipi_send_non_blocking() - Sends IPI request to the remote processor + * without blocking notification + * @proc Pointer to the processor who is initiating request + * @payload API id and call arguments to be written in IPI buffer + * + * Send an IPI request to the power controller. + * + * @return Returns status, either success or error+reason + */ +enum pm_ret_status pm_ipi_send_non_blocking(const struct pm_proc *proc, + uint32_t payload[PAYLOAD_ARG_CNT]) +{ + enum pm_ret_status ret; + + bakery_lock_get(&pm_secure_lock); + + ret = pm_ipi_send_common(proc, payload, IPI_NON_BLOCKING); + + bakery_lock_release(&pm_secure_lock); + + return ret; +} + +/** + * pm_ipi_send() - Sends IPI request to the remote processor + * @proc Pointer to the processor who is initiating request + * @payload API id and call arguments to be written in IPI buffer + * + * Send an IPI request to the power controller. + * + * @return Returns status, either success or error+reason + */ +enum pm_ret_status pm_ipi_send(const struct pm_proc *proc, + uint32_t payload[PAYLOAD_ARG_CNT]) +{ + enum pm_ret_status ret; + + bakery_lock_get(&pm_secure_lock); + + ret = pm_ipi_send_common(proc, payload, IPI_BLOCKING); + + bakery_lock_release(&pm_secure_lock); + + return ret; +} + + +/** + * pm_ipi_buff_read() - Reads IPI response after remote processor has handled + * interrupt + * @proc Pointer to the processor who is waiting and reading response + * @value Used to return value from IPI buffer element (optional) + * @count Number of values to return in @value + * + * @return Returns status, either success or error+reason + */ +static enum pm_ret_status pm_ipi_buff_read(const struct pm_proc *proc, + unsigned int *value, size_t count) +{ + size_t i; + uintptr_t buffer_base = proc->ipi->buffer_base + + IPI_BUFFER_TARGET_REMOTE_OFFSET + + IPI_BUFFER_RESP_OFFSET; + + /* + * Read response from IPI buffer + * buf-0: success or error+reason + * buf-1: value + * buf-2: unused + * buf-3: unused + */ + for (i = 1; i <= count; i++) { + *value = mmio_read_32(buffer_base + (i * PAYLOAD_ARG_SIZE)); + value++; + } + + return mmio_read_32(buffer_base); +} + +/** + * pm_ipi_buff_read_callb() - Reads IPI response after remote processor has + * handled interrupt + * @value Used to return value from IPI buffer element (optional) + * @count Number of values to return in @value + * + * @return Returns status, either success or error+reason + */ +void pm_ipi_buff_read_callb(unsigned int *value, size_t count) +{ + size_t i; + uintptr_t buffer_base = IPI_BUFFER_REMOTE_BASE + + IPI_BUFFER_TARGET_LOCAL_OFFSET + + IPI_BUFFER_REQ_OFFSET; + + if (count > IPI_BUFFER_MAX_WORDS) + count = IPI_BUFFER_MAX_WORDS; + + for (i = 0; i <= count; i++) { + *value = mmio_read_32(buffer_base + (i * PAYLOAD_ARG_SIZE)); + value++; + } +} + +/** + * pm_ipi_send_sync() - Sends IPI request to the remote processor + * @proc Pointer to the processor who is initiating request + * @payload API id and call arguments to be written in IPI buffer + * @value Used to return value from IPI buffer element (optional) + * @count Number of values to return in @value + * + * Send an IPI request to the power controller and wait for it to be handled. + * + * @return Returns status, either success or error+reason and, optionally, + * @value + */ +enum pm_ret_status pm_ipi_send_sync(const struct pm_proc *proc, + uint32_t payload[PAYLOAD_ARG_CNT], + unsigned int *value, size_t count) +{ + enum pm_ret_status ret; + + bakery_lock_get(&pm_secure_lock); + + ret = pm_ipi_send_common(proc, payload, IPI_BLOCKING); + if (ret != PM_RET_SUCCESS) + goto unlock; + + ret = pm_ipi_buff_read(proc, value, count); + +unlock: + bakery_lock_release(&pm_secure_lock); + + return ret; +} + +void pm_ipi_irq_enable(const struct pm_proc *proc) +{ + ipi_mb_enable_irq(proc->ipi->local_ipi_id, proc->ipi->remote_ipi_id); +} + +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 c6da241..bccd2f1 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 0000000..1b371cc --- /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 f0c7599..d147916 100644 --- a/plat/xilinx/zynqmp/platform.mk +++ b/plat/xilinx/zynqmp/platform.mk @@ -73,6 +73,7 @@ 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 @@ 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 997c330..163e891 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 @@ 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 0a34a07..adbb76f 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_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; diff --git a/plat/xilinx/zynqmp/pm_service/pm_common.h b/plat/xilinx/zynqmp/pm_service/pm_common.h deleted file mode 100644 index 10899b8..0000000 --- a/plat/xilinx/zynqmp/pm_service/pm_common.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (c) 2013-2015, ARM Limited and Contributors. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -/* - * Contains definitions of commonly used macros and data types needed - * for PU Power Management. This file should be common for all PU's. - */ - -#ifndef PM_COMMON_H -#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) - -/** - * pm_ipi - struct for capturing IPI-channel specific info - * @local_ipi_id Local IPI agent ID - * @remote_ipi_id Remote IPI Agent ID - * @buffer_base base address for payload buffer - */ -struct pm_ipi { - const uint32_t local_ipi_id; - const uint32_t remote_ipi_id; - const uintptr_t buffer_base; -}; - -/** - * pm_proc - struct for capturing processor related info - * @node_id node-ID of the processor - * @pwrdn_mask cpu-specific mask to be used for power control register - * @ipi pointer to IPI channel structure - * (in APU all processors share one IPI channel) - */ -struct pm_proc { - const enum pm_node_id 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.c b/plat/xilinx/zynqmp/pm_service/pm_ipi.c deleted file mode 100644 index c73c92f..0000000 --- a/plat/xilinx/zynqmp/pm_service/pm_ipi.c +++ /dev/null @@ -1,241 +0,0 @@ -/* - * Copyright (c) 2013-2018, ARM Limited and Contributors. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include -#include -#include - -#include -#include -#include -#include - -#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 - * - * @proc Pointer to the processor who is initiating request - * @return On success, the initialization function must return 0. - * Any other return value will cause the framework to ignore - * the service - * - * Called from pm_setup initialization function - */ -int pm_ipi_init(const struct pm_proc *proc) -{ - bakery_lock_init(&pm_secure_lock); - ipi_mb_open(proc->ipi->local_ipi_id, proc->ipi->remote_ipi_id); - - return 0; -} - -/** - * pm_ipi_send_common() - Sends IPI request to the remote processor - * @proc Pointer to the processor who is initiating request - * @payload API id and call arguments to be written in IPI buffer - * - * Send an IPI request to the power controller. Caller needs to hold - * the 'pm_secure_lock' lock. - * - * @return Returns status, either success or error+reason - */ -static enum pm_ret_status pm_ipi_send_common(const struct pm_proc *proc, - uint32_t payload[PAYLOAD_ARG_CNT], - uint32_t is_blocking) -{ - unsigned int offset = 0; - uintptr_t buffer_base = proc->ipi->buffer_base + - IPI_BUFFER_TARGET_REMOTE_OFFSET + - IPI_BUFFER_REQ_OFFSET; - - /* Write payload into IPI buffer */ - for (size_t i = 0; i < PAYLOAD_ARG_CNT; i++) { - mmio_write_32(buffer_base + offset, payload[i]); - offset += PAYLOAD_ARG_SIZE; - } - - /* Generate IPI to remote processor */ - ipi_mb_notify(proc->ipi->local_ipi_id, proc->ipi->remote_ipi_id, - is_blocking); - - return PM_RET_SUCCESS; -} - -/** - * pm_ipi_send_non_blocking() - Sends IPI request to the remote processor - * without blocking notification - * @proc Pointer to the processor who is initiating request - * @payload API id and call arguments to be written in IPI buffer - * - * Send an IPI request to the power controller. - * - * @return Returns status, either success or error+reason - */ -enum pm_ret_status pm_ipi_send_non_blocking(const struct pm_proc *proc, - uint32_t payload[PAYLOAD_ARG_CNT]) -{ - enum pm_ret_status ret; - - bakery_lock_get(&pm_secure_lock); - - ret = pm_ipi_send_common(proc, payload, IPI_NON_BLOCKING); - - bakery_lock_release(&pm_secure_lock); - - return ret; -} - -/** - * pm_ipi_send() - Sends IPI request to the remote processor - * @proc Pointer to the processor who is initiating request - * @payload API id and call arguments to be written in IPI buffer - * - * Send an IPI request to the power controller. - * - * @return Returns status, either success or error+reason - */ -enum pm_ret_status pm_ipi_send(const struct pm_proc *proc, - uint32_t payload[PAYLOAD_ARG_CNT]) -{ - enum pm_ret_status ret; - - bakery_lock_get(&pm_secure_lock); - - ret = pm_ipi_send_common(proc, payload, IPI_BLOCKING); - - bakery_lock_release(&pm_secure_lock); - - return ret; -} - - -/** - * pm_ipi_buff_read() - Reads IPI response after remote processor has handled - * interrupt - * @proc Pointer to the processor who is waiting and reading response - * @value Used to return value from IPI buffer element (optional) - * @count Number of values to return in @value - * - * @return Returns status, either success or error+reason - */ -static enum pm_ret_status pm_ipi_buff_read(const struct pm_proc *proc, - unsigned int *value, size_t count) -{ - size_t i; - uintptr_t buffer_base = proc->ipi->buffer_base + - IPI_BUFFER_TARGET_REMOTE_OFFSET + - IPI_BUFFER_RESP_OFFSET; - - /* - * Read response from IPI buffer - * buf-0: success or error+reason - * buf-1: value - * buf-2: unused - * buf-3: unused - */ - for (i = 1; i <= count; i++) { - *value = mmio_read_32(buffer_base + (i * PAYLOAD_ARG_SIZE)); - value++; - } - - return mmio_read_32(buffer_base); -} - -/** - * pm_ipi_buff_read_callb() - Reads IPI response after remote processor has - * handled interrupt - * @value Used to return value from IPI buffer element (optional) - * @count Number of values to return in @value - * - * @return Returns status, either success or error+reason - */ -void pm_ipi_buff_read_callb(unsigned int *value, size_t count) -{ - size_t i; - uintptr_t buffer_base = IPI_BUFFER_REMOTE_BASE + - IPI_BUFFER_TARGET_LOCAL_OFFSET + - IPI_BUFFER_REQ_OFFSET; - - if (count > IPI_BUFFER_MAX_WORDS) - count = IPI_BUFFER_MAX_WORDS; - - for (i = 0; i <= count; i++) { - *value = mmio_read_32(buffer_base + (i * PAYLOAD_ARG_SIZE)); - value++; - } -} - -/** - * pm_ipi_send_sync() - Sends IPI request to the remote processor - * @proc Pointer to the processor who is initiating request - * @payload API id and call arguments to be written in IPI buffer - * @value Used to return value from IPI buffer element (optional) - * @count Number of values to return in @value - * - * Send an IPI request to the power controller and wait for it to be handled. - * - * @return Returns status, either success or error+reason and, optionally, - * @value - */ -enum pm_ret_status pm_ipi_send_sync(const struct pm_proc *proc, - uint32_t payload[PAYLOAD_ARG_CNT], - unsigned int *value, size_t count) -{ - enum pm_ret_status ret; - - bakery_lock_get(&pm_secure_lock); - - ret = pm_ipi_send_common(proc, payload, IPI_BLOCKING); - if (ret != PM_RET_SUCCESS) - goto unlock; - - ret = pm_ipi_buff_read(proc, value, count); - -unlock: - bakery_lock_release(&pm_secure_lock); - - return ret; -} - -void pm_ipi_irq_enable(const struct pm_proc *proc) -{ - ipi_mb_enable_irq(proc->ipi->local_ipi_id, proc->ipi->remote_ipi_id); -} - -void pm_ipi_irq_clear(const struct pm_proc *proc) -{ - ipi_mb_ack(proc->ipi->local_ipi_id, proc->ipi->remote_ipi_id); -} diff --git a/plat/xilinx/zynqmp/pm_service/pm_ipi.h b/plat/xilinx/zynqmp/pm_service/pm_ipi.h deleted file mode 100644 index 650de52..0000000 --- a/plat/xilinx/zynqmp/pm_service/pm_ipi.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2013-2017, ARM Limited and Contributors. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef PM_IPI_H -#define PM_IPI_H - -#include "pm_common.h" - -int pm_ipi_init(const struct pm_proc *proc); - -enum pm_ret_status pm_ipi_send(const struct pm_proc *proc, - uint32_t payload[PAYLOAD_ARG_CNT]); -enum pm_ret_status pm_ipi_send_non_blocking(const struct pm_proc *proc, - uint32_t payload[PAYLOAD_ARG_CNT]); -enum pm_ret_status pm_ipi_send_sync(const struct pm_proc *proc, - uint32_t payload[PAYLOAD_ARG_CNT], - unsigned int *value, size_t count); -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); - -#endif /* PM_IPI_H */