[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [RFC v1 5/6] xen/arm: zynqmp: Forward plaform specific firmware calls
From: "Edgar E. Iglesias" <edgar.iglesias@xxxxxxxxxx> Forward platform specific firmware calls from the hardware domain to firmware. Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xxxxxxxxxx> --- xen/arch/arm/platforms/xilinx-zynqmp.c | 63 ++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/xen/arch/arm/platforms/xilinx-zynqmp.c b/xen/arch/arm/platforms/xilinx-zynqmp.c index 2adee91..bde7f52 100644 --- a/xen/arch/arm/platforms/xilinx-zynqmp.c +++ b/xen/arch/arm/platforms/xilinx-zynqmp.c @@ -19,6 +19,46 @@ #include <asm/platform.h> +/* Service calls. */ +#define SVC_MASK 0x3F000000 +#define SVC_SIP 0x02000000 /* SoC Implementation Specific. */ + +/* SMC function IDs for SiP Service queries */ +#define ZYNQMP_SIP_SVC_CALL_COUNT 0xff00 +#define ZYNQMP_SIP_SVC_UID 0xff01 +#define ZYNQMP_SIP_SVC_VERSION 0xff03 + +enum pm_api_id { + /* Miscellaneous API functions: */ + GET_API_VERSION = 1, + SET_CONFIGURATION, + GET_NODE_STATUS, + GET_OPERATING_CHARACTERISTIC, + REGISTER_NOTIFIER, + /* API for suspending of PUs: */ + REQUEST_SUSPEND, + SELF_SUSPEND, + FORCE_POWERDOWN, + ABORT_SUSPEND, + REQUEST_WAKEUP, + SET_WAKEUP_SOURCE, + SYSTEM_SHUTDOWN, + /* API for managing PM slaves: */ + REQUEST_NODE, + RELEASE_NODE, + SET_REQUIREMENT, + SET_MAX_LATENCY, + /* Direct control API functions: */ + RESET_ASSERT, + RESET_GET_STATUS, + MMIO_WRITE, + MMIO_READ, + PM_INIT, + FPGA_LOAD, + FPGA_GET_STATUS, + GET_CHIPID, +}; + static const char * const zynqmp_dt_compat[] __initconst = { "xlnx,zynqmp", @@ -32,8 +72,31 @@ static const struct dt_device_match zynqmp_blacklist_dev[] __initconst = { /* sentinel */ }, }; +bool zynqmp_hvc(struct cpu_user_regs *regs) +{ + uint32_t fid = regs->x0; + uint32_t svc = fid & SVC_MASK; + register_t ret[4]; + + /* We only forward SiP service calls from the hw domain to firmware. */ + if ( svc != SVC_SIP || !is_hardware_domain(current->domain) ) + return false; + + /* Forward the call. */ + call_smcc64(regs->x0, regs->x1, regs->x2, regs->x3, + regs->x4, regs->x5, regs->x6, ret); + + /* Transfer return values into guest registers. */ + regs->x0 = ret[0]; + regs->x1 = ret[1]; + regs->x2 = ret[2]; + regs->x3 = ret[3]; + return true; +} + PLATFORM_START(xgene_storm, "Xilinx ZynqMP") .compatible = zynqmp_dt_compat, + .hvc = zynqmp_hvc, .blacklist_dev = zynqmp_blacklist_dev, PLATFORM_END -- 2.7.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |