Commit 65c80d60 authored by Jolly Shah's avatar Jolly Shah
Browse files

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: default avatarTejas Patel <tejas.patel@xilinx.com>
Reviewed-by: default avatarSiva Durga Prasad Paladugu <siva.durga.paladugu@xilinx.com>
Signed-off-by: default avatarJolly Shah <jollys@xilinx.com>
parent 5bd029bc
/* /*
* 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 * SPDX-License-Identifier: BSD-3-Clause
*/ */
...@@ -13,18 +13,7 @@ ...@@ -13,18 +13,7 @@
#define PM_COMMON_H #define PM_COMMON_H
#include <stdint.h> #include <stdint.h>
#include <plat_pm_common.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)
/** /**
* pm_ipi - struct for capturing IPI-channel specific info * pm_ipi - struct for capturing IPI-channel specific info
...@@ -46,12 +35,11 @@ struct pm_ipi { ...@@ -46,12 +35,11 @@ struct pm_ipi {
* (in APU all processors share one IPI channel) * (in APU all processors share one IPI channel)
*/ */
struct pm_proc { struct pm_proc {
const enum pm_node_id node_id; const uint32_t node_id;
const unsigned int pwrdn_mask; const unsigned int pwrdn_mask;
const struct pm_ipi *ipi; const struct pm_ipi *ipi;
}; };
const struct pm_proc *pm_get_proc(unsigned int cpuid); 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 */ #endif /* PM_COMMON_H */
/* /*
* 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 * SPDX-License-Identifier: BSD-3-Clause
*/ */
...@@ -7,8 +7,12 @@ ...@@ -7,8 +7,12 @@
#ifndef PM_IPI_H #ifndef PM_IPI_H
#define PM_IPI_H #define PM_IPI_H
#include <plat_ipi.h>
#include "pm_common.h" #include "pm_common.h"
#define IPI_BLOCKING 1
#define IPI_NON_BLOCKING 0
int pm_ipi_init(const struct pm_proc *proc); int pm_ipi_init(const struct pm_proc *proc);
enum pm_ret_status pm_ipi_send(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, ...@@ -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_buff_read_callb(unsigned int *value, size_t count);
void pm_ipi_irq_enable(const struct pm_proc *proc); void pm_ipi_irq_enable(const struct pm_proc *proc);
void pm_ipi_irq_clear(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 */ #endif /* PM_IPI_H */
...@@ -4,7 +4,9 @@ ...@@ -4,7 +4,9 @@
* SPDX-License-Identifier: BSD-3-Clause * SPDX-License-Identifier: BSD-3-Clause
*/ */
#include <arch_helpers.h> #include <arch_helpers.h>
#include <lib/bakery_lock.h> #include <lib/bakery_lock.h>
#include <lib/mmio.h> #include <lib/mmio.h>
...@@ -15,34 +17,9 @@ ...@@ -15,34 +17,9 @@
#include "pm_ipi.h" #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); 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 * pm_ipi_init() - Initialize IPI peripheral for communication with
* remote processor * remote processor
...@@ -239,3 +216,15 @@ void pm_ipi_irq_clear(const struct pm_proc *proc) ...@@ -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); 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;
}
...@@ -27,6 +27,25 @@ ...@@ -27,6 +27,25 @@
#define IPI_ID_PL2 9U #define IPI_ID_PL2 9U
#define IPI_ID_PL3 10U #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 * Platform specific IPI API declarations
********************************************************************/ ********************************************************************/
......
/*
* 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_ */
...@@ -73,6 +73,7 @@ BL31_SOURCES += drivers/arm/cci/cci.c \ ...@@ -73,6 +73,7 @@ BL31_SOURCES += drivers/arm/cci/cci.c \
lib/cpus/aarch64/aem_generic.S \ lib/cpus/aarch64/aem_generic.S \
lib/cpus/aarch64/cortex_a53.S \ lib/cpus/aarch64/cortex_a53.S \
plat/common/plat_psci_common.c \ plat/common/plat_psci_common.c \
plat/xilinx/common/pm_service/pm_ipi.c \
plat/xilinx/zynqmp/bl31_zynqmp_setup.c \ plat/xilinx/zynqmp/bl31_zynqmp_setup.c \
plat/xilinx/zynqmp/plat_psci.c \ plat/xilinx/zynqmp/plat_psci.c \
plat/xilinx/zynqmp/plat_zynqmp.c \ plat/xilinx/zynqmp/plat_zynqmp.c \
...@@ -85,6 +86,5 @@ BL31_SOURCES += drivers/arm/cci/cci.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_pinctrl.c \
plat/xilinx/zynqmp/pm_service/pm_api_ioctl.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_api_clock.c \
plat/xilinx/zynqmp/pm_service/pm_ipi.c \
plat/xilinx/zynqmp/pm_service/pm_client.c \ plat/xilinx/zynqmp/pm_service/pm_client.c \
plat/xilinx/zynqmp/ipi_mailbox_service/ipi_mailbox_svc.c plat/xilinx/zynqmp/ipi_mailbox_service/ipi_mailbox_svc.c
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include <lib/mmio.h> #include <lib/mmio.h>
#include <lib/utils.h> #include <lib/utils.h>
#include <plat_ipi.h>
#include <zynqmp_def.h> #include <zynqmp_def.h>
#include "pm_api_sys.h" #include "pm_api_sys.h"
#include "pm_client.h" #include "pm_client.h"
...@@ -35,6 +36,12 @@ DEFINE_BAKERY_LOCK(pm_client_secure_lock); ...@@ -35,6 +36,12 @@ DEFINE_BAKERY_LOCK(pm_client_secure_lock);
extern const struct pm_ipi apu_ipi; 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; static uint32_t suspend_mode = PM_SUSPEND_MODE_STD;
/* Order in pm_procs_all array must match cpu ids */ /* Order in pm_procs_all array must match cpu ids */
......
...@@ -21,6 +21,7 @@ void pm_client_abort_suspend(void); ...@@ -21,6 +21,7 @@ void pm_client_abort_suspend(void);
void pm_client_wakeup(const struct pm_proc *proc); void pm_client_wakeup(const struct pm_proc *proc);
enum pm_ret_status set_ocm_retention(void); enum pm_ret_status set_ocm_retention(void);
enum pm_ret_status pm_set_suspend_mode(uint32_t mode); 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 */ /* Global variables to be set in pm_client.c */
extern const struct pm_proc *primary_proc; extern const struct pm_proc *primary_proc;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment