1 /* SPDX-License-Identifier: GPL-2.0 */
3 * Xilinx Zynq MPSoC Firmware layer
5 * Copyright (C) 2014-2018 Xilinx
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>
13 #ifndef __FIRMWARE_ZYNQMP_H__
14 #define __FIRMWARE_ZYNQMP_H__
16 #include <linux/device.h>
18 #define ZYNQMP_PM_VERSION_MAJOR 1
19 #define ZYNQMP_PM_VERSION_MINOR 0
21 #define ZYNQMP_PM_VERSION ((ZYNQMP_PM_VERSION_MAJOR << 16) | \
22 ZYNQMP_PM_VERSION_MINOR)
24 #define ZYNQMP_TZ_VERSION_MAJOR 1
25 #define ZYNQMP_TZ_VERSION_MINOR 0
27 #define ZYNQMP_TZ_VERSION ((ZYNQMP_TZ_VERSION_MAJOR << 16) | \
28 ZYNQMP_TZ_VERSION_MINOR)
30 /* SMC SIP service Call Function Identifier Prefix */
31 #define PM_SIP_SVC 0xC2000000
32 #define PM_GET_TRUSTZONE_VERSION 0xa03
33 #define PM_SET_SUSPEND_MODE 0xa02
34 #define GET_CALLBACK_DATA 0xa01
36 /* Number of 32bits values in payload */
37 #define PAYLOAD_ARG_CNT 4U
39 /* Number of arguments for a callback */
42 /* Payload size (consists of callback API ID + arguments) */
43 #define CB_PAYLOAD_SIZE (CB_ARG_CNT + 1)
45 #define ZYNQMP_PM_MAX_LATENCY (~0U)
46 #define ZYNQMP_PM_MAX_QOS 100U
48 /* Usage status, returned by PmGetNodeStatus */
49 #define PM_USAGE_NO_MASTER 0x0U
50 #define PM_USAGE_CURRENT_MASTER 0x1U
51 #define PM_USAGE_OTHER_MASTER 0x2U
52 #define PM_USAGE_BOTH_MASTERS (PM_USAGE_CURRENT_MASTER | \
53 PM_USAGE_OTHER_MASTER)
55 #define GSS_NUM_REGS (4)
57 /* Node capabilities */
58 #define ZYNQMP_PM_CAPABILITY_ACCESS 0x1U
59 #define ZYNQMP_PM_CAPABILITY_CONTEXT 0x2U
60 #define ZYNQMP_PM_CAPABILITY_WAKEUP 0x4U
61 #define ZYNQMP_PM_CAPABILITY_POWER 0x8U
63 /* Feature check status */
64 #define PM_FEATURE_INVALID -1
65 #define PM_FEATURE_UNCHECKED 0
68 PM_GET_API_VERSION = 1,
71 PM_GET_OPERATING_CHARACTERISTIC,
73 /* API for suspending of PUs: */
81 /* API for managing PM slaves: */
86 /* Direct control API functions: */
95 /* ID 25 is been used by U-boot to process secure boot images */
96 /* Secure library generic API functions */
99 /* Pin control API functions */
102 PM_PINCTRL_GET_FUNCTION,
103 PM_PINCTRL_SET_FUNCTION,
104 PM_PINCTRL_CONFIG_PARAM_GET,
105 PM_PINCTRL_CONFIG_PARAM_SET,
108 /* API to query information from firmware */
110 /* Clock control API functions */
123 /* PM_REGISTER_ACCESS API */
124 PM_REGISTER_ACCESS = 52,
126 PM_FEATURE_CHECK = 63,
130 /* PMU-FW return status codes */
133 XST_PM_NO_FEATURE = 19,
134 XST_PM_INTERNAL = 2000,
139 XST_PM_ABORT_SUSPEND,
143 IOCTL_GET_RPU_OPER_MODE,
144 IOCTL_SET_RPU_OPER_MODE,
145 IOCTL_RPU_BOOT_ADDR_CONFIG,
146 IOCTL_TCM_COMB_CONFIG,
147 IOCTL_SET_TAPDELAY_BYPASS,
148 IOCTL_SET_SGMII_MODE,
150 IOCTL_SET_SD_TAPDELAY,
151 /* Ioctl for clock driver */
152 IOCTL_SET_PLL_FRAC_MODE,
153 IOCTL_GET_PLL_FRAC_MODE,
154 IOCTL_SET_PLL_FRAC_DATA,
155 IOCTL_GET_PLL_FRAC_DATA,
160 /* IOCTL for ULPI reset */
162 /* Set healthy bit value*/
163 IOCTL_SET_BOOT_HEALTH_STATUS,
169 PM_QID_CLOCK_GET_NAME,
170 PM_QID_CLOCK_GET_TOPOLOGY,
171 PM_QID_CLOCK_GET_FIXEDFACTOR_PARAMS,
172 PM_QID_CLOCK_GET_PARENTS,
173 PM_QID_CLOCK_GET_ATTRIBUTES,
174 PM_QID_PINCTRL_GET_NUM_PINS,
175 PM_QID_PINCTRL_GET_NUM_FUNCTIONS,
176 PM_QID_PINCTRL_GET_NUM_FUNCTION_GROUPS,
177 PM_QID_PINCTRL_GET_FUNCTION_NAME,
178 PM_QID_PINCTRL_GET_FUNCTION_GROUPS,
179 PM_QID_PINCTRL_GET_PIN_GROUPS,
180 PM_QID_CLOCK_GET_NUM_CLOCKS,
183 enum zynqmp_pm_reset_action {
184 PM_RESET_ACTION_RELEASE,
185 PM_RESET_ACTION_ASSERT,
186 PM_RESET_ACTION_PULSE,
189 enum zynqmp_pm_reset {
190 ZYNQMP_PM_RESET_START = 1000,
191 ZYNQMP_PM_RESET_PCIE_CFG = ZYNQMP_PM_RESET_START,
192 ZYNQMP_PM_RESET_PCIE_BRIDGE,
193 ZYNQMP_PM_RESET_PCIE_CTRL,
195 ZYNQMP_PM_RESET_SWDT_CRF,
196 ZYNQMP_PM_RESET_AFI_FM5,
197 ZYNQMP_PM_RESET_AFI_FM4,
198 ZYNQMP_PM_RESET_AFI_FM3,
199 ZYNQMP_PM_RESET_AFI_FM2,
200 ZYNQMP_PM_RESET_AFI_FM1,
201 ZYNQMP_PM_RESET_AFI_FM0,
202 ZYNQMP_PM_RESET_GDMA,
203 ZYNQMP_PM_RESET_GPU_PP1,
204 ZYNQMP_PM_RESET_GPU_PP0,
207 ZYNQMP_PM_RESET_SATA,
208 ZYNQMP_PM_RESET_ACPU3_PWRON,
209 ZYNQMP_PM_RESET_ACPU2_PWRON,
210 ZYNQMP_PM_RESET_ACPU1_PWRON,
211 ZYNQMP_PM_RESET_ACPU0_PWRON,
212 ZYNQMP_PM_RESET_APU_L2,
213 ZYNQMP_PM_RESET_ACPU3,
214 ZYNQMP_PM_RESET_ACPU2,
215 ZYNQMP_PM_RESET_ACPU1,
216 ZYNQMP_PM_RESET_ACPU0,
218 ZYNQMP_PM_RESET_APM_FPD,
219 ZYNQMP_PM_RESET_SOFT,
220 ZYNQMP_PM_RESET_GEM0,
221 ZYNQMP_PM_RESET_GEM1,
222 ZYNQMP_PM_RESET_GEM2,
223 ZYNQMP_PM_RESET_GEM3,
224 ZYNQMP_PM_RESET_QSPI,
225 ZYNQMP_PM_RESET_UART0,
226 ZYNQMP_PM_RESET_UART1,
227 ZYNQMP_PM_RESET_SPI0,
228 ZYNQMP_PM_RESET_SPI1,
229 ZYNQMP_PM_RESET_SDIO0,
230 ZYNQMP_PM_RESET_SDIO1,
231 ZYNQMP_PM_RESET_CAN0,
232 ZYNQMP_PM_RESET_CAN1,
233 ZYNQMP_PM_RESET_I2C0,
234 ZYNQMP_PM_RESET_I2C1,
235 ZYNQMP_PM_RESET_TTC0,
236 ZYNQMP_PM_RESET_TTC1,
237 ZYNQMP_PM_RESET_TTC2,
238 ZYNQMP_PM_RESET_TTC3,
239 ZYNQMP_PM_RESET_SWDT_CRL,
240 ZYNQMP_PM_RESET_NAND,
241 ZYNQMP_PM_RESET_ADMA,
242 ZYNQMP_PM_RESET_GPIO,
243 ZYNQMP_PM_RESET_IOU_CC,
244 ZYNQMP_PM_RESET_TIMESTAMP,
245 ZYNQMP_PM_RESET_RPU_R50,
246 ZYNQMP_PM_RESET_RPU_R51,
247 ZYNQMP_PM_RESET_RPU_AMBA,
249 ZYNQMP_PM_RESET_RPU_PGE,
250 ZYNQMP_PM_RESET_USB0_CORERESET,
251 ZYNQMP_PM_RESET_USB1_CORERESET,
252 ZYNQMP_PM_RESET_USB0_HIBERRESET,
253 ZYNQMP_PM_RESET_USB1_HIBERRESET,
254 ZYNQMP_PM_RESET_USB0_APB,
255 ZYNQMP_PM_RESET_USB1_APB,
257 ZYNQMP_PM_RESET_APM_LPD,
259 ZYNQMP_PM_RESET_SYSMON,
260 ZYNQMP_PM_RESET_AFI_FM6,
261 ZYNQMP_PM_RESET_LPD_SWDT,
263 ZYNQMP_PM_RESET_RPU_DBG1,
264 ZYNQMP_PM_RESET_RPU_DBG0,
265 ZYNQMP_PM_RESET_DBG_LPD,
266 ZYNQMP_PM_RESET_DBG_FPD,
267 ZYNQMP_PM_RESET_APLL,
268 ZYNQMP_PM_RESET_DPLL,
269 ZYNQMP_PM_RESET_VPLL,
270 ZYNQMP_PM_RESET_IOPLL,
271 ZYNQMP_PM_RESET_RPLL,
272 ZYNQMP_PM_RESET_GPO3_PL_0,
273 ZYNQMP_PM_RESET_GPO3_PL_1,
274 ZYNQMP_PM_RESET_GPO3_PL_2,
275 ZYNQMP_PM_RESET_GPO3_PL_3,
276 ZYNQMP_PM_RESET_GPO3_PL_4,
277 ZYNQMP_PM_RESET_GPO3_PL_5,
278 ZYNQMP_PM_RESET_GPO3_PL_6,
279 ZYNQMP_PM_RESET_GPO3_PL_7,
280 ZYNQMP_PM_RESET_GPO3_PL_8,
281 ZYNQMP_PM_RESET_GPO3_PL_9,
282 ZYNQMP_PM_RESET_GPO3_PL_10,
283 ZYNQMP_PM_RESET_GPO3_PL_11,
284 ZYNQMP_PM_RESET_GPO3_PL_12,
285 ZYNQMP_PM_RESET_GPO3_PL_13,
286 ZYNQMP_PM_RESET_GPO3_PL_14,
287 ZYNQMP_PM_RESET_GPO3_PL_15,
288 ZYNQMP_PM_RESET_GPO3_PL_16,
289 ZYNQMP_PM_RESET_GPO3_PL_17,
290 ZYNQMP_PM_RESET_GPO3_PL_18,
291 ZYNQMP_PM_RESET_GPO3_PL_19,
292 ZYNQMP_PM_RESET_GPO3_PL_20,
293 ZYNQMP_PM_RESET_GPO3_PL_21,
294 ZYNQMP_PM_RESET_GPO3_PL_22,
295 ZYNQMP_PM_RESET_GPO3_PL_23,
296 ZYNQMP_PM_RESET_GPO3_PL_24,
297 ZYNQMP_PM_RESET_GPO3_PL_25,
298 ZYNQMP_PM_RESET_GPO3_PL_26,
299 ZYNQMP_PM_RESET_GPO3_PL_27,
300 ZYNQMP_PM_RESET_GPO3_PL_28,
301 ZYNQMP_PM_RESET_GPO3_PL_29,
302 ZYNQMP_PM_RESET_GPO3_PL_30,
303 ZYNQMP_PM_RESET_GPO3_PL_31,
304 ZYNQMP_PM_RESET_RPU_LS,
305 ZYNQMP_PM_RESET_PS_ONLY,
307 ZYNQMP_PM_RESET_PS_PL0,
308 ZYNQMP_PM_RESET_PS_PL1,
309 ZYNQMP_PM_RESET_PS_PL2,
310 ZYNQMP_PM_RESET_PS_PL3,
311 ZYNQMP_PM_RESET_END = ZYNQMP_PM_RESET_PS_PL3
314 enum zynqmp_pm_abort_reason {
315 ZYNQMP_PM_ABORT_REASON_WAKEUP_EVENT = 100,
316 ZYNQMP_PM_ABORT_REASON_POWER_UNIT_BUSY,
317 ZYNQMP_PM_ABORT_REASON_NO_POWERDOWN,
318 ZYNQMP_PM_ABORT_REASON_UNKNOWN,
321 enum zynqmp_pm_suspend_reason {
322 SUSPEND_POWER_REQUEST = 201,
324 SUSPEND_SYSTEM_SHUTDOWN,
327 enum zynqmp_pm_request_ack {
328 ZYNQMP_PM_REQUEST_ACK_NO = 1,
329 ZYNQMP_PM_REQUEST_ACK_BLOCKING,
330 ZYNQMP_PM_REQUEST_ACK_NON_BLOCKING,
333 enum zynqmp_pm_opchar_type {
334 ZYNQMP_PM_OPERATING_CHARACTERISTIC_POWER = 1,
335 ZYNQMP_PM_OPERATING_CHARACTERISTIC_ENERGY,
336 ZYNQMP_PM_OPERATING_CHARACTERISTIC_TEMPERATURE,
339 enum zynqmp_pm_shutdown_type {
340 ZYNQMP_PM_SHUTDOWN_TYPE_SHUTDOWN,
341 ZYNQMP_PM_SHUTDOWN_TYPE_RESET,
342 ZYNQMP_PM_SHUTDOWN_TYPE_SETSCOPE_ONLY,
345 enum zynqmp_pm_shutdown_subtype {
346 ZYNQMP_PM_SHUTDOWN_SUBTYPE_SUBSYSTEM,
347 ZYNQMP_PM_SHUTDOWN_SUBTYPE_PS_ONLY,
348 ZYNQMP_PM_SHUTDOWN_SUBTYPE_SYSTEM,
433 enum pm_pinctrl_config_param {
434 PM_PINCTRL_CONFIG_SLEW_RATE,
435 PM_PINCTRL_CONFIG_BIAS_STATUS,
436 PM_PINCTRL_CONFIG_PULL_CTRL,
437 PM_PINCTRL_CONFIG_SCHMITT_CMOS,
438 PM_PINCTRL_CONFIG_DRIVE_STRENGTH,
439 PM_PINCTRL_CONFIG_VOLTAGE_STATUS,
440 PM_PINCTRL_CONFIG_MAX,
443 enum pm_pinctrl_slew_rate {
444 PM_PINCTRL_SLEW_RATE_FAST,
445 PM_PINCTRL_SLEW_RATE_SLOW,
448 enum pm_pinctrl_bias_status {
449 PM_PINCTRL_BIAS_DISABLE,
450 PM_PINCTRL_BIAS_ENABLE,
453 enum pm_pinctrl_pull_ctrl {
454 PM_PINCTRL_BIAS_PULL_DOWN,
455 PM_PINCTRL_BIAS_PULL_UP,
458 enum pm_pinctrl_schmitt_cmos {
459 PM_PINCTRL_INPUT_TYPE_CMOS,
460 PM_PINCTRL_INPUT_TYPE_SCHMITT,
463 enum pm_pinctrl_drive_strength {
464 PM_PINCTRL_DRIVE_STRENGTH_2MA,
465 PM_PINCTRL_DRIVE_STRENGTH_4MA,
466 PM_PINCTRL_DRIVE_STRENGTH_8MA,
467 PM_PINCTRL_DRIVE_STRENGTH_12MA,
471 PM_RPU_MODE_LOCKSTEP,
476 PM_RPU_BOOTMEM_LOVEC,
477 PM_RPU_BOOTMEM_HIVEC,
485 enum tap_delay_signal_type {
486 PM_TAPDELAY_NAND_DQS_IN,
487 PM_TAPDELAY_NAND_DQS_OUT,
492 enum tap_delay_bypass_ctrl {
493 PM_TAPDELAY_BYPASS_DISABLE,
494 PM_TAPDELAY_BYPASS_ENABLE,
502 enum tap_delay_type {
507 enum dll_reset_type {
509 PM_DLL_RESET_RELEASE,
513 enum pm_register_access_id {
519 * struct zynqmp_pm_query_data - PM query data
521 * @arg1: Argument 1 of query data
522 * @arg2: Argument 2 of query data
523 * @arg3: Argument 3 of query data
525 struct zynqmp_pm_query_data {
532 struct zynqmp_eemi_ops {
533 int (*get_api_version)(u32 *version);
534 int (*get_chipid)(u32 *idcode, u32 *version);
535 int (*query_data)(struct zynqmp_pm_query_data qdata, u32 *out);
536 int (*clock_enable)(u32 clock_id);
537 int (*clock_disable)(u32 clock_id);
538 int (*clock_getstate)(u32 clock_id, u32 *state);
539 int (*clock_setdivider)(u32 clock_id, u32 divider);
540 int (*clock_getdivider)(u32 clock_id, u32 *divider);
541 int (*clock_setrate)(u32 clock_id, u64 rate);
542 int (*clock_getrate)(u32 clock_id, u64 *rate);
543 int (*clock_setparent)(u32 clock_id, u32 parent_id);
544 int (*clock_getparent)(u32 clock_id, u32 *parent_id);
545 int (*ioctl)(u32 node_id, u32 ioctl_id, u32 arg1, u32 arg2, u32 *out);
546 int (*reset_assert)(const enum zynqmp_pm_reset reset,
547 const enum zynqmp_pm_reset_action assert_flag);
548 int (*reset_get_status)(const enum zynqmp_pm_reset reset, u32 *status);
549 int (*init_finalize)(void);
550 int (*set_suspend_mode)(u32 mode);
551 int (*request_node)(const u32 node,
552 const u32 capabilities,
554 const enum zynqmp_pm_request_ack ack);
555 int (*release_node)(const u32 node);
556 int (*set_requirement)(const u32 node,
557 const u32 capabilities,
559 const enum zynqmp_pm_request_ack ack);
560 int (*fpga_load)(const u64 address, const u32 size, const u32 flags);
561 int (*fpga_get_status)(u32 *value);
562 int (*fpga_read)(const u32 reg_numframes, const u64 phys_address,
563 u32 readback_type, u32 *value);
564 int (*sha_hash)(const u64 address, const u32 size, const u32 flags);
565 int (*rsa)(const u64 address, const u32 size, const u32 flags);
566 int (*request_suspend)(const u32 node,
567 const enum zynqmp_pm_request_ack ack,
570 int (*force_powerdown)(const u32 target,
571 const enum zynqmp_pm_request_ack ack);
572 int (*request_wakeup)(const u32 node,
575 const enum zynqmp_pm_request_ack ack);
576 int (*set_wakeup_source)(const u32 target,
577 const u32 wakeup_node,
579 int (*system_shutdown)(const u32 type, const u32 subtype);
580 int (*set_max_latency)(const u32 node, const u32 latency);
581 int (*set_configuration)(const u32 physical_addr);
582 int (*get_node_status)(const u32 node, u32 *const status,
583 u32 *const requirements, u32 *const usage);
584 int (*get_operating_characteristic)(const u32 node,
585 const enum zynqmp_pm_opchar_type
586 type, u32 *const result);
587 int (*pinctrl_request)(const u32 pin);
588 int (*pinctrl_release)(const u32 pin);
589 int (*pinctrl_get_function)(const u32 pin, u32 *id);
590 int (*pinctrl_set_function)(const u32 pin, const u32 id);
591 int (*pinctrl_get_config)(const u32 pin, const u32 param, u32 *value);
592 int (*pinctrl_set_config)(const u32 pin, const u32 param, u32 value);
593 int (*register_access)(u32 register_access_id, u32 address,
594 u32 mask, u32 value, u32 *out);
595 int (*aes)(const u64 address, u32 *out);
596 int (*efuse_access)(const u64 address, u32 *out);
597 int (*secure_image)(const u64 src_addr, u64 key_addr, u64 *dst);
600 int zynqmp_pm_invoke_fn(u32 pm_api_id, u32 arg0, u32 arg1,
601 u32 arg2, u32 arg3, u32 *ret_payload);
603 int zynqmp_pm_ggs_init(struct kobject *parent_kobj);
605 #if IS_REACHABLE(CONFIG_ARCH_ZYNQMP)
606 const struct zynqmp_eemi_ops *zynqmp_pm_get_eemi_ops(void);
608 static inline struct zynqmp_eemi_ops *zynqmp_pm_get_eemi_ops(void)
610 return ERR_PTR(-ENODEV);
614 #endif /* __FIRMWARE_ZYNQMP_H__ */