aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/firmware
diff options
context:
space:
mode:
authorArnd Bergmann <arnd@arndb.de>2018-09-26 11:18:42 -0400
committerArnd Bergmann <arnd@arndb.de>2018-09-26 11:18:53 -0400
commitba61ab1a232d75a8bf92bbfedc10162a6e7e95c7 (patch)
treeb0dc602d23a3925bcbcd1826436501a676d53140 /include/linux/firmware
parent1e25ee6d8083bb78e164d497989dc3cafda70fb8 (diff)
parente60f02ddb4d2e29b0eb30dbe55475822c4bf3818 (diff)
Merge tag 'zynqmp-soc-for-v4.20-v2' of https://github.com/Xilinx/linux-xlnx into next/drivers
arm64: zynqmp: SoC changes for v4.20 - Adding firmware API for SoC with debugfs interface Firmware driver communicates to Platform Management Unit (PMU) by using SMC instructions routed to Arm Trusted Firmware (ATF). Initial version adds support for base firmware driver with query and clock APIs. EEMI spec is available here: https://www.xilinx.com/support/documentation/user_guides/ug1200-eemi-api.pdf * tag 'zynqmp-soc-for-v4.20-v2' of https://github.com/Xilinx/linux-xlnx: firmware: xilinx: Add debugfs for query data API firmware: xilinx: Add debugfs interface firmware: xilinx: Add clock APIs firmware: xilinx: Add query data API firmware: xilinx: Add Zynqmp firmware driver dt-bindings: firmware: Add bindings for ZynqMP firmware Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Diffstat (limited to 'include/linux/firmware')
-rw-r--r--include/linux/firmware/xlnx-zynqmp.h113
1 files changed, 113 insertions, 0 deletions
diff --git a/include/linux/firmware/xlnx-zynqmp.h b/include/linux/firmware/xlnx-zynqmp.h
new file mode 100644
index 000000000000..015e130431e6
--- /dev/null
+++ b/include/linux/firmware/xlnx-zynqmp.h
@@ -0,0 +1,113 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * Xilinx Zynq MPSoC Firmware layer
4 *
5 * Copyright (C) 2014-2018 Xilinx
6 *
7 * Michal Simek <michal.simek@xilinx.com>
8 * Davorin Mista <davorin.mista@aggios.com>
9 * Jolly Shah <jollys@xilinx.com>
10 * Rajan Vaja <rajanv@xilinx.com>
11 */
12
13#ifndef __FIRMWARE_ZYNQMP_H__
14#define __FIRMWARE_ZYNQMP_H__
15
16#define ZYNQMP_PM_VERSION_MAJOR 1
17#define ZYNQMP_PM_VERSION_MINOR 0
18
19#define ZYNQMP_PM_VERSION ((ZYNQMP_PM_VERSION_MAJOR << 16) | \
20 ZYNQMP_PM_VERSION_MINOR)
21
22#define ZYNQMP_TZ_VERSION_MAJOR 1
23#define ZYNQMP_TZ_VERSION_MINOR 0
24
25#define ZYNQMP_TZ_VERSION ((ZYNQMP_TZ_VERSION_MAJOR << 16) | \
26 ZYNQMP_TZ_VERSION_MINOR)
27
28/* SMC SIP service Call Function Identifier Prefix */
29#define PM_SIP_SVC 0xC2000000
30#define PM_GET_TRUSTZONE_VERSION 0xa03
31
32/* Number of 32bits values in payload */
33#define PAYLOAD_ARG_CNT 4U
34
35enum pm_api_id {
36 PM_GET_API_VERSION = 1,
37 PM_QUERY_DATA = 35,
38 PM_CLOCK_ENABLE,
39 PM_CLOCK_DISABLE,
40 PM_CLOCK_GETSTATE,
41 PM_CLOCK_SETDIVIDER,
42 PM_CLOCK_GETDIVIDER,
43 PM_CLOCK_SETRATE,
44 PM_CLOCK_GETRATE,
45 PM_CLOCK_SETPARENT,
46 PM_CLOCK_GETPARENT,
47};
48
49/* PMU-FW return status codes */
50enum pm_ret_status {
51 XST_PM_SUCCESS = 0,
52 XST_PM_INTERNAL = 2000,
53 XST_PM_CONFLICT,
54 XST_PM_NO_ACCESS,
55 XST_PM_INVALID_NODE,
56 XST_PM_DOUBLE_REQ,
57 XST_PM_ABORT_SUSPEND,
58};
59
60enum pm_ioctl_id {
61 IOCTL_SET_PLL_FRAC_MODE = 8,
62 IOCTL_GET_PLL_FRAC_MODE,
63 IOCTL_SET_PLL_FRAC_DATA,
64 IOCTL_GET_PLL_FRAC_DATA,
65};
66
67enum pm_query_id {
68 PM_QID_INVALID,
69 PM_QID_CLOCK_GET_NAME,
70 PM_QID_CLOCK_GET_TOPOLOGY,
71 PM_QID_CLOCK_GET_FIXEDFACTOR_PARAMS,
72 PM_QID_CLOCK_GET_PARENTS,
73 PM_QID_CLOCK_GET_ATTRIBUTES,
74};
75
76/**
77 * struct zynqmp_pm_query_data - PM query data
78 * @qid: query ID
79 * @arg1: Argument 1 of query data
80 * @arg2: Argument 2 of query data
81 * @arg3: Argument 3 of query data
82 */
83struct zynqmp_pm_query_data {
84 u32 qid;
85 u32 arg1;
86 u32 arg2;
87 u32 arg3;
88};
89
90struct zynqmp_eemi_ops {
91 int (*get_api_version)(u32 *version);
92 int (*query_data)(struct zynqmp_pm_query_data qdata, u32 *out);
93 int (*clock_enable)(u32 clock_id);
94 int (*clock_disable)(u32 clock_id);
95 int (*clock_getstate)(u32 clock_id, u32 *state);
96 int (*clock_setdivider)(u32 clock_id, u32 divider);
97 int (*clock_getdivider)(u32 clock_id, u32 *divider);
98 int (*clock_setrate)(u32 clock_id, u64 rate);
99 int (*clock_getrate)(u32 clock_id, u64 *rate);
100 int (*clock_setparent)(u32 clock_id, u32 parent_id);
101 int (*clock_getparent)(u32 clock_id, u32 *parent_id);
102};
103
104#if IS_REACHABLE(CONFIG_ARCH_ZYNQMP)
105const struct zynqmp_eemi_ops *zynqmp_pm_get_eemi_ops(void);
106#else
107static inline struct zynqmp_eemi_ops *zynqmp_pm_get_eemi_ops(void)
108{
109 return NULL;
110}
111#endif
112
113#endif /* __FIRMWARE_ZYNQMP_H__ */