1f76918a8SRajan Vaja /*
2619bc13eSMichal Simek * Copyright (c) 2018-2022, Arm Limited and Contributors. All rights reserved.
38ce93ec9SRonak Jain * Copyright (c) 2022-2025, Advanced Micro Devices, Inc. All rights reserved.
4f76918a8SRajan Vaja *
5f76918a8SRajan Vaja * SPDX-License-Identifier: BSD-3-Clause
6f76918a8SRajan Vaja */
7f76918a8SRajan Vaja
8f76918a8SRajan Vaja /*
9f76918a8SRajan Vaja * ZynqMP system level PM-API functions for ioctl.
10f76918a8SRajan Vaja */
11f76918a8SRajan Vaja
12f76918a8SRajan Vaja #include <arch_helpers.h>
1309d40e0eSAntonio Nino Diaz #include <drivers/delay_timer.h>
1409d40e0eSAntonio Nino Diaz #include <lib/mmio.h>
1509d40e0eSAntonio Nino Diaz #include <plat/common/platform.h>
16*4fd510e0SRonak Jain #include <plat_pm_common.h>
1709d40e0eSAntonio Nino Diaz
18caae497dSRajan Vaja #include "pm_api_clock.h"
19f76918a8SRajan Vaja #include "pm_api_ioctl.h"
20f76918a8SRajan Vaja #include "pm_client.h"
21f76918a8SRajan Vaja #include "pm_common.h"
22f76918a8SRajan Vaja #include "pm_ipi.h"
2301a326abSPrasad Kummari #include <zynqmp_def.h>
24a92681d9SJay Buddhabhatti #include "zynqmp_pm_api_sys.h"
25f76918a8SRajan Vaja
26f76918a8SRajan Vaja /**
27de7ed953SPrasad Kummari * pm_ioctl_get_rpu_oper_mode () - Get current RPU operation mode.
28de7ed953SPrasad Kummari * @mode: Buffer to store value of oper mode(Split/Lock-step)
29f76918a8SRajan Vaja *
30f76918a8SRajan Vaja * This function provides current configured RPU operational mode.
31f76918a8SRajan Vaja *
32de7ed953SPrasad Kummari * Return: Returns status, either success or error+reason.
33de7ed953SPrasad Kummari *
34f76918a8SRajan Vaja */
pm_ioctl_get_rpu_oper_mode(uint32_t * mode)35ffa91031SVenkatesh Yadav Abbarapu static enum pm_ret_status pm_ioctl_get_rpu_oper_mode(uint32_t *mode)
36f76918a8SRajan Vaja {
37ffa91031SVenkatesh Yadav Abbarapu uint32_t val;
38f76918a8SRajan Vaja
39f76918a8SRajan Vaja val = mmio_read_32(ZYNQMP_RPU_GLBL_CNTL);
40f76918a8SRajan Vaja val &= ZYNQMP_SLSPLIT_MASK;
41bfd7c881SVenkatesh Yadav Abbarapu if (val == 0U) {
42f76918a8SRajan Vaja *mode = PM_RPU_MODE_LOCKSTEP;
43eb0d2b17SVenkatesh Yadav Abbarapu } else {
4437e1a68eSJolly Shah *mode = PM_RPU_MODE_SPLIT;
45eb0d2b17SVenkatesh Yadav Abbarapu }
46f76918a8SRajan Vaja
47f76918a8SRajan Vaja return PM_RET_SUCCESS;
48f76918a8SRajan Vaja }
49f76918a8SRajan Vaja
50f76918a8SRajan Vaja /**
51de7ed953SPrasad Kummari * pm_ioctl_set_rpu_oper_mode () - Configure RPU operation mode.
52de7ed953SPrasad Kummari * @mode: Value to set for oper mode(Split/Lock-step).
53f76918a8SRajan Vaja *
54f76918a8SRajan Vaja * This function configures RPU operational mode(Split/Lock-step).
55f76918a8SRajan Vaja * It also sets TCM combined mode in RPU lock-step and TCM non-combined
56f76918a8SRajan Vaja * mode for RPU split mode. In case of Lock step mode, RPU1's output is
57f76918a8SRajan Vaja * clamped.
58f76918a8SRajan Vaja *
59de7ed953SPrasad Kummari * Return: Returns status, either success or error+reason.
60de7ed953SPrasad Kummari *
61f76918a8SRajan Vaja */
pm_ioctl_set_rpu_oper_mode(uint32_t mode)62ffa91031SVenkatesh Yadav Abbarapu static enum pm_ret_status pm_ioctl_set_rpu_oper_mode(uint32_t mode)
63f76918a8SRajan Vaja {
64ffa91031SVenkatesh Yadav Abbarapu uint32_t val;
653f6d4794SMaheedhar Bollapalli enum pm_ret_status status = PM_RET_SUCCESS;
66f76918a8SRajan Vaja
67a42e6e44SMaheedhar Bollapalli if ((mmio_read_32(CRL_APB_RST_LPD_TOP) & CRL_APB_RPU_AMBA_RESET) != 0U) {
683f6d4794SMaheedhar Bollapalli status = PM_RET_ERROR_ACCESS;
693f6d4794SMaheedhar Bollapalli goto exit_label;
70eb0d2b17SVenkatesh Yadav Abbarapu }
71f76918a8SRajan Vaja
72f76918a8SRajan Vaja val = mmio_read_32(ZYNQMP_RPU_GLBL_CNTL);
73f76918a8SRajan Vaja
74f76918a8SRajan Vaja if (mode == PM_RPU_MODE_SPLIT) {
75f76918a8SRajan Vaja val |= ZYNQMP_SLSPLIT_MASK;
76f76918a8SRajan Vaja val &= ~ZYNQMP_TCM_COMB_MASK;
77f76918a8SRajan Vaja val &= ~ZYNQMP_SLCLAMP_MASK;
78f76918a8SRajan Vaja } else if (mode == PM_RPU_MODE_LOCKSTEP) {
79f76918a8SRajan Vaja val &= ~ZYNQMP_SLSPLIT_MASK;
80f76918a8SRajan Vaja val |= ZYNQMP_TCM_COMB_MASK;
81f76918a8SRajan Vaja val |= ZYNQMP_SLCLAMP_MASK;
82f76918a8SRajan Vaja } else {
833f6d4794SMaheedhar Bollapalli status = PM_RET_ERROR_ARGS;
843f6d4794SMaheedhar Bollapalli goto exit_label;
85f76918a8SRajan Vaja }
86f76918a8SRajan Vaja
87f76918a8SRajan Vaja mmio_write_32(ZYNQMP_RPU_GLBL_CNTL, val);
88f76918a8SRajan Vaja
893f6d4794SMaheedhar Bollapalli exit_label:
903f6d4794SMaheedhar Bollapalli return status;
91f76918a8SRajan Vaja }
92f76918a8SRajan Vaja
93f76918a8SRajan Vaja /**
94de7ed953SPrasad Kummari * pm_ioctl_config_boot_addr() - Configure RPU boot address.
95de7ed953SPrasad Kummari * @nid: Node ID of RPU.
96de7ed953SPrasad Kummari * @value: Value to set for boot address (TCM/OCM).
97f76918a8SRajan Vaja *
98f76918a8SRajan Vaja * This function configures RPU boot address(memory).
99f76918a8SRajan Vaja *
100de7ed953SPrasad Kummari * Return: Returns status, either success or error+reason.
101de7ed953SPrasad Kummari *
102f76918a8SRajan Vaja */
pm_ioctl_config_boot_addr(enum pm_node_id nid,uint32_t value)103f76918a8SRajan Vaja static enum pm_ret_status pm_ioctl_config_boot_addr(enum pm_node_id nid,
104ffa91031SVenkatesh Yadav Abbarapu uint32_t value)
105f76918a8SRajan Vaja {
106ffa91031SVenkatesh Yadav Abbarapu uint32_t rpu_cfg_addr, val;
107f76918a8SRajan Vaja
108eb0d2b17SVenkatesh Yadav Abbarapu if (nid == NODE_RPU_0) {
109f76918a8SRajan Vaja rpu_cfg_addr = ZYNQMP_RPU0_CFG;
110eb0d2b17SVenkatesh Yadav Abbarapu } else if (nid == NODE_RPU_1) {
111f76918a8SRajan Vaja rpu_cfg_addr = ZYNQMP_RPU1_CFG;
112eb0d2b17SVenkatesh Yadav Abbarapu } else {
113f76918a8SRajan Vaja return PM_RET_ERROR_ARGS;
114eb0d2b17SVenkatesh Yadav Abbarapu }
115f76918a8SRajan Vaja
116f76918a8SRajan Vaja val = mmio_read_32(rpu_cfg_addr);
117f76918a8SRajan Vaja
118eb0d2b17SVenkatesh Yadav Abbarapu if (value == PM_RPU_BOOTMEM_LOVEC) {
119f76918a8SRajan Vaja val &= ~ZYNQMP_VINITHI_MASK;
120eb0d2b17SVenkatesh Yadav Abbarapu } else if (value == PM_RPU_BOOTMEM_HIVEC) {
121f76918a8SRajan Vaja val |= ZYNQMP_VINITHI_MASK;
122eb0d2b17SVenkatesh Yadav Abbarapu } else {
123f76918a8SRajan Vaja return PM_RET_ERROR_ARGS;
124eb0d2b17SVenkatesh Yadav Abbarapu }
125f76918a8SRajan Vaja
126f76918a8SRajan Vaja mmio_write_32(rpu_cfg_addr, val);
127f76918a8SRajan Vaja
128f76918a8SRajan Vaja return PM_RET_SUCCESS;
129f76918a8SRajan Vaja }
130f76918a8SRajan Vaja
131f76918a8SRajan Vaja /**
132de7ed953SPrasad Kummari * pm_ioctl_config_tcm_comb() - Configure TCM combined mode.
133de7ed953SPrasad Kummari * @value: Value to set (Split/Combined).
134f76918a8SRajan Vaja *
135f76918a8SRajan Vaja * This function configures TCM to be in split mode or combined
136f76918a8SRajan Vaja * mode.
137f76918a8SRajan Vaja *
138de7ed953SPrasad Kummari * Return: Returns status, either success or error+reason.
139de7ed953SPrasad Kummari *
140f76918a8SRajan Vaja */
pm_ioctl_config_tcm_comb(uint32_t value)141ffa91031SVenkatesh Yadav Abbarapu static enum pm_ret_status pm_ioctl_config_tcm_comb(uint32_t value)
142f76918a8SRajan Vaja {
143ffa91031SVenkatesh Yadav Abbarapu uint32_t val;
1443f6d4794SMaheedhar Bollapalli enum pm_ret_status status = PM_RET_SUCCESS;
145f76918a8SRajan Vaja
146f76918a8SRajan Vaja val = mmio_read_32(ZYNQMP_RPU_GLBL_CNTL);
147f76918a8SRajan Vaja
148eb0d2b17SVenkatesh Yadav Abbarapu if (value == PM_RPU_TCM_SPLIT) {
149f76918a8SRajan Vaja val &= ~ZYNQMP_TCM_COMB_MASK;
150eb0d2b17SVenkatesh Yadav Abbarapu } else if (value == PM_RPU_TCM_COMB) {
151f76918a8SRajan Vaja val |= ZYNQMP_TCM_COMB_MASK;
152eb0d2b17SVenkatesh Yadav Abbarapu } else {
1533f6d4794SMaheedhar Bollapalli status = PM_RET_ERROR_ARGS;
1543f6d4794SMaheedhar Bollapalli goto exit_label;
155eb0d2b17SVenkatesh Yadav Abbarapu }
156f76918a8SRajan Vaja
157f76918a8SRajan Vaja mmio_write_32(ZYNQMP_RPU_GLBL_CNTL, val);
158f76918a8SRajan Vaja
1593f6d4794SMaheedhar Bollapalli exit_label:
1603f6d4794SMaheedhar Bollapalli return status;
161f76918a8SRajan Vaja }
162f76918a8SRajan Vaja
163f76918a8SRajan Vaja /**
164de7ed953SPrasad Kummari * pm_ioctl_set_tapdelay_bypass() - Enable/Disable tap delay bypass.
165de7ed953SPrasad Kummari * @type: Type of tap delay to enable/disable (e.g. QSPI).
166de7ed953SPrasad Kummari * @value: Enable/Disable.
1678ce93ec9SRonak Jain * @flag: 0 - Call from secure source.
1688ce93ec9SRonak Jain * 1 - Call from non-secure source.
1691818c029SRajan Vaja *
1701818c029SRajan Vaja * This function enable/disable tap delay bypass.
1711818c029SRajan Vaja *
172de7ed953SPrasad Kummari * Return: Returns status, either success or error+reason.
173de7ed953SPrasad Kummari *
1741818c029SRajan Vaja */
pm_ioctl_set_tapdelay_bypass(uint32_t type,uint32_t value,uint32_t flag)175ffa91031SVenkatesh Yadav Abbarapu static enum pm_ret_status pm_ioctl_set_tapdelay_bypass(uint32_t type,
1768ce93ec9SRonak Jain uint32_t value,
1778ce93ec9SRonak Jain uint32_t flag)
1781818c029SRajan Vaja {
1793f6d4794SMaheedhar Bollapalli enum pm_ret_status status = PM_RET_SUCCESS;
1803f6d4794SMaheedhar Bollapalli
1815b542313SMaheedhar Bollapalli if ((((value != PM_TAPDELAY_BYPASS_ENABLE) &&
1825b542313SMaheedhar Bollapalli (value != PM_TAPDELAY_BYPASS_DISABLE)) || (type >= PM_TAPDELAY_MAX))) {
1833f6d4794SMaheedhar Bollapalli status = PM_RET_ERROR_ARGS;
1843f6d4794SMaheedhar Bollapalli } else {
1858ce93ec9SRonak Jain status = pm_mmio_write(IOU_TAPDLY_BYPASS, TAP_DELAY_MASK,
1868ce93ec9SRonak Jain value << type, flag);
187eb0d2b17SVenkatesh Yadav Abbarapu }
1881818c029SRajan Vaja
1893f6d4794SMaheedhar Bollapalli return status;
1901818c029SRajan Vaja }
1911818c029SRajan Vaja
1921818c029SRajan Vaja /**
193de7ed953SPrasad Kummari * pm_ioctl_sd_dll_reset() - Reset DLL logic.
194de7ed953SPrasad Kummari * @nid: Node ID of the device.
195de7ed953SPrasad Kummari * @type: Reset type.
1968ce93ec9SRonak Jain * @flag: 0 - Call from secure source.
1978ce93ec9SRonak Jain * 1 - Call from non-secure source.
1981818c029SRajan Vaja *
1991818c029SRajan Vaja * This function resets DLL logic for the SD device.
2001818c029SRajan Vaja *
201de7ed953SPrasad Kummari * Return: Returns status, either success or error+reason.
202de7ed953SPrasad Kummari *
2031818c029SRajan Vaja */
pm_ioctl_sd_dll_reset(enum pm_node_id nid,uint32_t type,uint32_t flag)2041818c029SRajan Vaja static enum pm_ret_status pm_ioctl_sd_dll_reset(enum pm_node_id nid,
2058ce93ec9SRonak Jain uint32_t type,
2068ce93ec9SRonak Jain uint32_t flag)
2071818c029SRajan Vaja {
208ffa91031SVenkatesh Yadav Abbarapu uint32_t mask, val;
20937e1a68eSJolly Shah enum pm_ret_status ret;
2101818c029SRajan Vaja
2111818c029SRajan Vaja if (nid == NODE_SD_0) {
2121818c029SRajan Vaja mask = ZYNQMP_SD0_DLL_RST_MASK;
2131818c029SRajan Vaja val = ZYNQMP_SD0_DLL_RST;
2141818c029SRajan Vaja } else if (nid == NODE_SD_1) {
2151818c029SRajan Vaja mask = ZYNQMP_SD1_DLL_RST_MASK;
2161818c029SRajan Vaja val = ZYNQMP_SD1_DLL_RST;
2171818c029SRajan Vaja } else {
2181818c029SRajan Vaja return PM_RET_ERROR_ARGS;
2191818c029SRajan Vaja }
2201818c029SRajan Vaja
2211818c029SRajan Vaja switch (type) {
2221818c029SRajan Vaja case PM_DLL_RESET_ASSERT:
2231818c029SRajan Vaja case PM_DLL_RESET_PULSE:
2248ce93ec9SRonak Jain ret = pm_mmio_write(ZYNQMP_SD_DLL_CTRL, mask, val, flag);
225eb0d2b17SVenkatesh Yadav Abbarapu if (ret != PM_RET_SUCCESS) {
2261818c029SRajan Vaja return ret;
227eb0d2b17SVenkatesh Yadav Abbarapu }
2281818c029SRajan Vaja
229eb0d2b17SVenkatesh Yadav Abbarapu if (type == PM_DLL_RESET_ASSERT) {
2301818c029SRajan Vaja break;
231eb0d2b17SVenkatesh Yadav Abbarapu }
2321818c029SRajan Vaja mdelay(1);
233a08a2014SDaniel Boulby /* Fallthrough */
2341818c029SRajan Vaja case PM_DLL_RESET_RELEASE:
2358ce93ec9SRonak Jain ret = pm_mmio_write(ZYNQMP_SD_DLL_CTRL, mask, 0, flag);
2361818c029SRajan Vaja break;
2371818c029SRajan Vaja default:
2381818c029SRajan Vaja ret = PM_RET_ERROR_ARGS;
23937e1a68eSJolly Shah break;
2401818c029SRajan Vaja }
2411818c029SRajan Vaja
2421818c029SRajan Vaja return ret;
2431818c029SRajan Vaja }
2441818c029SRajan Vaja
2451818c029SRajan Vaja /**
246de7ed953SPrasad Kummari * pm_ioctl_sd_set_tapdelay() - Set tap delay for the SD device.
247de7ed953SPrasad Kummari * @nid: Node ID of the device.
248de7ed953SPrasad Kummari * @type: Type of tap delay to set (input/output).
249de7ed953SPrasad Kummari * @value: Value to set fot the tap delay.
2508ce93ec9SRonak Jain * @flag: 0 - Call from secure source.
2518ce93ec9SRonak Jain * 1 - Call from non-secure source.
2521818c029SRajan Vaja *
2531818c029SRajan Vaja * This function sets input/output tap delay for the SD device.
2541818c029SRajan Vaja *
255de7ed953SPrasad Kummari * Return: Returns status, either success or error+reason.
256de7ed953SPrasad Kummari *
2571818c029SRajan Vaja */
pm_ioctl_sd_set_tapdelay(enum pm_node_id nid,enum tap_delay_type type,uint32_t value,uint32_t flag)2581818c029SRajan Vaja static enum pm_ret_status pm_ioctl_sd_set_tapdelay(enum pm_node_id nid,
2591818c029SRajan Vaja enum tap_delay_type type,
2608ce93ec9SRonak Jain uint32_t value,
2618ce93ec9SRonak Jain uint32_t flag)
2621818c029SRajan Vaja {
263ffa91031SVenkatesh Yadav Abbarapu uint32_t shift;
26437e1a68eSJolly Shah enum pm_ret_status ret;
265ffa91031SVenkatesh Yadav Abbarapu uint32_t val, mask;
2661818c029SRajan Vaja
2672ab0ef8dSSai Krishna Potthuri if (nid == NODE_SD_0) {
2681818c029SRajan Vaja shift = 0;
2692ab0ef8dSSai Krishna Potthuri mask = ZYNQMP_SD0_DLL_RST_MASK;
2702ab0ef8dSSai Krishna Potthuri } else if (nid == NODE_SD_1) {
2711818c029SRajan Vaja shift = ZYNQMP_SD_TAP_OFFSET;
2722ab0ef8dSSai Krishna Potthuri mask = ZYNQMP_SD1_DLL_RST_MASK;
2732ab0ef8dSSai Krishna Potthuri } else {
2741818c029SRajan Vaja return PM_RET_ERROR_ARGS;
2752ab0ef8dSSai Krishna Potthuri }
2761818c029SRajan Vaja
2778ce93ec9SRonak Jain ret = pm_mmio_read(ZYNQMP_SD_DLL_CTRL, &val, flag);
2782ab0ef8dSSai Krishna Potthuri if (ret != PM_RET_SUCCESS) {
2791818c029SRajan Vaja return ret;
2802ab0ef8dSSai Krishna Potthuri }
2812ab0ef8dSSai Krishna Potthuri
282bfd7c881SVenkatesh Yadav Abbarapu if ((val & mask) == 0U) {
2838ce93ec9SRonak Jain ret = pm_ioctl_sd_dll_reset(nid, PM_DLL_RESET_ASSERT, flag);
2842ab0ef8dSSai Krishna Potthuri if (ret != PM_RET_SUCCESS) {
2852ab0ef8dSSai Krishna Potthuri return ret;
2862ab0ef8dSSai Krishna Potthuri }
2872ab0ef8dSSai Krishna Potthuri }
2881818c029SRajan Vaja
2891818c029SRajan Vaja if (type == PM_TAPDELAY_INPUT) {
2901818c029SRajan Vaja ret = pm_mmio_write(ZYNQMP_SD_ITAP_DLY,
291e2cc129bSMaheedhar Bollapalli (uint64_t)(ZYNQMP_SD_ITAPCHGWIN_MASK << shift),
2928ce93ec9SRonak Jain (ZYNQMP_SD_ITAPCHGWIN << shift),
2938ce93ec9SRonak Jain flag);
294eb0d2b17SVenkatesh Yadav Abbarapu
295eb0d2b17SVenkatesh Yadav Abbarapu if (ret != PM_RET_SUCCESS) {
2961818c029SRajan Vaja goto reset_release;
297eb0d2b17SVenkatesh Yadav Abbarapu }
298eb0d2b17SVenkatesh Yadav Abbarapu
299bfd7c881SVenkatesh Yadav Abbarapu if (value == 0U) {
3001818c029SRajan Vaja ret = pm_mmio_write(ZYNQMP_SD_ITAP_DLY,
301e2cc129bSMaheedhar Bollapalli (uint64_t)(ZYNQMP_SD_ITAPDLYENA_MASK <<
3028ce93ec9SRonak Jain shift), 0, flag);
303eb0d2b17SVenkatesh Yadav Abbarapu } else {
304fe1fa205SSai Krishna Potthuri ret = pm_mmio_write(ZYNQMP_SD_ITAP_DLY,
305e2cc129bSMaheedhar Bollapalli (uint64_t)(ZYNQMP_SD_ITAPDLYENA_MASK <<
306e2cc129bSMaheedhar Bollapalli shift), (uint64_t)(ZYNQMP_SD_ITAPDLYENA <<
3078ce93ec9SRonak Jain shift), flag);
308eb0d2b17SVenkatesh Yadav Abbarapu }
309eb0d2b17SVenkatesh Yadav Abbarapu
310eb0d2b17SVenkatesh Yadav Abbarapu if (ret != PM_RET_SUCCESS) {
3111818c029SRajan Vaja goto reset_release;
312eb0d2b17SVenkatesh Yadav Abbarapu }
313eb0d2b17SVenkatesh Yadav Abbarapu
3141818c029SRajan Vaja ret = pm_mmio_write(ZYNQMP_SD_ITAP_DLY,
315e2cc129bSMaheedhar Bollapalli (uint64_t)(ZYNQMP_SD_ITAPDLYSEL_MASK << shift),
3168ce93ec9SRonak Jain (value << shift),
3178ce93ec9SRonak Jain flag);
318eb0d2b17SVenkatesh Yadav Abbarapu
319eb0d2b17SVenkatesh Yadav Abbarapu if (ret != PM_RET_SUCCESS) {
3201818c029SRajan Vaja goto reset_release;
321eb0d2b17SVenkatesh Yadav Abbarapu }
322eb0d2b17SVenkatesh Yadav Abbarapu
3231818c029SRajan Vaja ret = pm_mmio_write(ZYNQMP_SD_ITAP_DLY,
3248ce93ec9SRonak Jain (uint64_t)(ZYNQMP_SD_ITAPCHGWIN_MASK << shift), 0,
3258ce93ec9SRonak Jain flag);
3261818c029SRajan Vaja } else if (type == PM_TAPDELAY_OUTPUT) {
3271818c029SRajan Vaja ret = pm_mmio_write(ZYNQMP_SD_OTAP_DLY,
3288ce93ec9SRonak Jain (uint64_t)(ZYNQMP_SD_OTAPDLYENA_MASK << shift), 0,
3298ce93ec9SRonak Jain flag);
330eb0d2b17SVenkatesh Yadav Abbarapu
331eb0d2b17SVenkatesh Yadav Abbarapu if (ret != PM_RET_SUCCESS) {
3321818c029SRajan Vaja goto reset_release;
333eb0d2b17SVenkatesh Yadav Abbarapu }
334eb0d2b17SVenkatesh Yadav Abbarapu
3351818c029SRajan Vaja ret = pm_mmio_write(ZYNQMP_SD_OTAP_DLY,
336e2cc129bSMaheedhar Bollapalli (uint64_t)(ZYNQMP_SD_OTAPDLYSEL_MASK << shift),
3378ce93ec9SRonak Jain (value << shift),
3388ce93ec9SRonak Jain flag);
3391818c029SRajan Vaja } else {
3401818c029SRajan Vaja ret = PM_RET_ERROR_ARGS;
3411818c029SRajan Vaja }
3421818c029SRajan Vaja
3431818c029SRajan Vaja reset_release:
3442ab0ef8dSSai Krishna Potthuri if ((val & mask) == 0) {
3458ce93ec9SRonak Jain (void)pm_ioctl_sd_dll_reset(nid, PM_DLL_RESET_RELEASE, flag);
3462ab0ef8dSSai Krishna Potthuri }
3472ab0ef8dSSai Krishna Potthuri
3481818c029SRajan Vaja return ret;
3491818c029SRajan Vaja }
3501818c029SRajan Vaja
3511818c029SRajan Vaja /**
352de7ed953SPrasad Kummari * pm_ioctl_set_pll_frac_mode() - Ioctl function for setting pll mode.
353de7ed953SPrasad Kummari * @pll: PLL clock id.
354de7ed953SPrasad Kummari * @mode: Mode fraction/integar.
355caae497dSRajan Vaja *
356de7ed953SPrasad Kummari * This function sets PLL mode.
357caae497dSRajan Vaja *
358de7ed953SPrasad Kummari * Return: Returns status, either success or error+reason.
359de7ed953SPrasad Kummari *
360caae497dSRajan Vaja */
pm_ioctl_set_pll_frac_mode(uint32_t pll,uint32_t mode)361caae497dSRajan Vaja static enum pm_ret_status pm_ioctl_set_pll_frac_mode
362ffa91031SVenkatesh Yadav Abbarapu (uint32_t pll, uint32_t mode)
363caae497dSRajan Vaja {
3648975f317SJolly Shah return pm_clock_set_pll_mode(pll, mode);
365caae497dSRajan Vaja }
366caae497dSRajan Vaja
367caae497dSRajan Vaja /**
368de7ed953SPrasad Kummari * pm_ioctl_get_pll_frac_mode() - Ioctl function for getting pll mode.
369de7ed953SPrasad Kummari * @pll: PLL clock id.
370de7ed953SPrasad Kummari * @mode: Mode fraction/integar.
371caae497dSRajan Vaja *
372de7ed953SPrasad Kummari * This function return current PLL mode.
373caae497dSRajan Vaja *
374de7ed953SPrasad Kummari * Return: Returns status, either success or error+reason.
375de7ed953SPrasad Kummari *
376caae497dSRajan Vaja */
pm_ioctl_get_pll_frac_mode(uint32_t pll,uint32_t * mode)377caae497dSRajan Vaja static enum pm_ret_status pm_ioctl_get_pll_frac_mode
378ffa91031SVenkatesh Yadav Abbarapu (uint32_t pll, uint32_t *mode)
379caae497dSRajan Vaja {
380a5ae5a72SJolly Shah return pm_clock_get_pll_mode(pll, mode);
381caae497dSRajan Vaja }
382caae497dSRajan Vaja
383caae497dSRajan Vaja /**
384de7ed953SPrasad Kummari * pm_ioctl_set_pll_frac_data() - Ioctl function for setting pll fraction data.
385de7ed953SPrasad Kummari * @pll: PLL clock id.
386de7ed953SPrasad Kummari * @data: fraction data.
3878ce93ec9SRonak Jain * @flag: 0 - Call from secure source.
3888ce93ec9SRonak Jain * 1 - Call from non-secure source.
389caae497dSRajan Vaja *
390caae497dSRajan Vaja * This function sets fraction data.
391caae497dSRajan Vaja * It is valid for fraction mode only.
392caae497dSRajan Vaja *
393de7ed953SPrasad Kummari * Return: Returns status, either success or error+reason.
394de7ed953SPrasad Kummari *
395caae497dSRajan Vaja */
pm_ioctl_set_pll_frac_data(uint32_t pll,uint32_t data,uint32_t flag)396caae497dSRajan Vaja static enum pm_ret_status pm_ioctl_set_pll_frac_data
3978ce93ec9SRonak Jain (uint32_t pll, uint32_t data, uint32_t flag)
398caae497dSRajan Vaja {
399cf1769b5SJolly Shah enum pm_node_id pll_nid;
400cf1769b5SJolly Shah enum pm_ret_status status;
401cf1769b5SJolly Shah
402cf1769b5SJolly Shah /* Get PLL node ID using PLL clock ID */
403cf1769b5SJolly Shah status = pm_clock_get_pll_node_id(pll, &pll_nid);
4043f6d4794SMaheedhar Bollapalli if (status == PM_RET_SUCCESS) {
4058ce93ec9SRonak Jain status = pm_pll_set_parameter(pll_nid, PM_PLL_PARAM_DATA,
4068ce93ec9SRonak Jain data, flag);
407eb0d2b17SVenkatesh Yadav Abbarapu }
408cf1769b5SJolly Shah
4093f6d4794SMaheedhar Bollapalli return status;
410caae497dSRajan Vaja }
411caae497dSRajan Vaja
412caae497dSRajan Vaja /**
413de7ed953SPrasad Kummari * pm_ioctl_get_pll_frac_data() - Ioctl function for getting pll fraction data.
414de7ed953SPrasad Kummari * @pll: PLL clock id.
415de7ed953SPrasad Kummari * @data: fraction data.
4168ce93ec9SRonak Jain * @flag: 0 - Call from secure source.
4178ce93ec9SRonak Jain * 1 - Call from non-secure source.
418caae497dSRajan Vaja *
419caae497dSRajan Vaja * This function returns fraction data value.
420caae497dSRajan Vaja *
421de7ed953SPrasad Kummari * Return: Returns status, either success or error+reason.
422de7ed953SPrasad Kummari *
423caae497dSRajan Vaja */
pm_ioctl_get_pll_frac_data(uint32_t pll,uint32_t * data,uint32_t flag)424caae497dSRajan Vaja static enum pm_ret_status pm_ioctl_get_pll_frac_data
4258ce93ec9SRonak Jain (uint32_t pll, uint32_t *data, uint32_t flag)
426caae497dSRajan Vaja {
4271e3fb352SJolly Shah enum pm_node_id pll_nid;
4281e3fb352SJolly Shah enum pm_ret_status status;
4291e3fb352SJolly Shah
4301e3fb352SJolly Shah /* Get PLL node ID using PLL clock ID */
4311e3fb352SJolly Shah status = pm_clock_get_pll_node_id(pll, &pll_nid);
4323f6d4794SMaheedhar Bollapalli if (status == PM_RET_SUCCESS) {
4338ce93ec9SRonak Jain status = pm_pll_get_parameter(pll_nid, PM_PLL_PARAM_DATA,
4348ce93ec9SRonak Jain data, flag);
435eb0d2b17SVenkatesh Yadav Abbarapu }
4361e3fb352SJolly Shah
4373f6d4794SMaheedhar Bollapalli return status;
438caae497dSRajan Vaja }
439caae497dSRajan Vaja
440caae497dSRajan Vaja /**
441de7ed953SPrasad Kummari * pm_ioctl_write_ggs() - Ioctl function for writing global general storage
442de7ed953SPrasad Kummari * (ggs).
443de7ed953SPrasad Kummari * @index: GGS register index.
444de7ed953SPrasad Kummari * @value: Register value to be written.
4458ce93ec9SRonak Jain * @flag: 0 - Call from secure source.
4468ce93ec9SRonak Jain * 1 - Call from non-secure source.
44763eb7a36SRajan Vaja *
44863eb7a36SRajan Vaja * This function writes value to GGS register.
44963eb7a36SRajan Vaja *
450de7ed953SPrasad Kummari * Return: Returns status, either success or error+reason.
451de7ed953SPrasad Kummari *
45263eb7a36SRajan Vaja */
pm_ioctl_write_ggs(uint32_t index,uint32_t value,uint32_t flag)453ffa91031SVenkatesh Yadav Abbarapu static enum pm_ret_status pm_ioctl_write_ggs(uint32_t index,
4548ce93ec9SRonak Jain uint32_t value,
4558ce93ec9SRonak Jain uint32_t flag)
45663eb7a36SRajan Vaja {
4573f6d4794SMaheedhar Bollapalli enum pm_ret_status ret_status = PM_RET_SUCCESS;
4583f6d4794SMaheedhar Bollapalli
459eb0d2b17SVenkatesh Yadav Abbarapu if (index >= GGS_NUM_REGS) {
4603f6d4794SMaheedhar Bollapalli ret_status = PM_RET_ERROR_ARGS;
4613f6d4794SMaheedhar Bollapalli } else {
4623f6d4794SMaheedhar Bollapalli ret_status = pm_mmio_write((uint64_t)GGS_BASEADDR + (index << 2),
4638ce93ec9SRonak Jain 0xFFFFFFFFU, value, flag);
464eb0d2b17SVenkatesh Yadav Abbarapu }
46563eb7a36SRajan Vaja
4663f6d4794SMaheedhar Bollapalli return ret_status;
46763eb7a36SRajan Vaja }
46863eb7a36SRajan Vaja
46963eb7a36SRajan Vaja /**
470de7ed953SPrasad Kummari * pm_ioctl_read_ggs() - Ioctl function for reading global general storage
471de7ed953SPrasad Kummari * (ggs).
472de7ed953SPrasad Kummari * @index: GGS register index.
473de7ed953SPrasad Kummari * @value: Register value.
4748ce93ec9SRonak Jain * @flag: 0 - Call from secure source.
4758ce93ec9SRonak Jain * 1 - Call from non-secure source.
47663eb7a36SRajan Vaja *
47763eb7a36SRajan Vaja * This function returns GGS register value.
47863eb7a36SRajan Vaja *
479de7ed953SPrasad Kummari * Return: Returns status, either success or error+reason.
480de7ed953SPrasad Kummari *
48163eb7a36SRajan Vaja */
pm_ioctl_read_ggs(uint32_t index,uint32_t * value,uint32_t flag)482ffa91031SVenkatesh Yadav Abbarapu static enum pm_ret_status pm_ioctl_read_ggs(uint32_t index,
4838ce93ec9SRonak Jain uint32_t *value,
4848ce93ec9SRonak Jain uint32_t flag)
48563eb7a36SRajan Vaja {
4863f6d4794SMaheedhar Bollapalli enum pm_ret_status ret_status = PM_RET_SUCCESS;
4873f6d4794SMaheedhar Bollapalli
488eb0d2b17SVenkatesh Yadav Abbarapu if (index >= GGS_NUM_REGS) {
4893f6d4794SMaheedhar Bollapalli ret_status = PM_RET_ERROR_ARGS;
4903f6d4794SMaheedhar Bollapalli } else {
4918ce93ec9SRonak Jain ret_status = pm_mmio_read((uint64_t)GGS_BASEADDR + (index << 2),
4928ce93ec9SRonak Jain value, flag);
493eb0d2b17SVenkatesh Yadav Abbarapu }
49463eb7a36SRajan Vaja
4953f6d4794SMaheedhar Bollapalli return ret_status;
49663eb7a36SRajan Vaja }
49763eb7a36SRajan Vaja
49863eb7a36SRajan Vaja /**
499de7ed953SPrasad Kummari * pm_ioctl_write_pggs() - Ioctl function for writing persistent global general
500de7ed953SPrasad Kummari * storage (pggs).
501de7ed953SPrasad Kummari * @index: PGGS register index.
502de7ed953SPrasad Kummari * @value: Register value to be written.
5038ce93ec9SRonak Jain * @flag: 0 - Call from secure source.
5048ce93ec9SRonak Jain * 1 - Call from non-secure source.
50563eb7a36SRajan Vaja *
50663eb7a36SRajan Vaja * This function writes value to PGGS register.
50763eb7a36SRajan Vaja *
508de7ed953SPrasad Kummari * Return: Returns status, either success or error+reason.
509de7ed953SPrasad Kummari *
51063eb7a36SRajan Vaja */
pm_ioctl_write_pggs(uint32_t index,uint32_t value,uint32_t flag)511ffa91031SVenkatesh Yadav Abbarapu static enum pm_ret_status pm_ioctl_write_pggs(uint32_t index,
5128ce93ec9SRonak Jain uint32_t value,
5138ce93ec9SRonak Jain uint32_t flag)
51463eb7a36SRajan Vaja {
5153f6d4794SMaheedhar Bollapalli enum pm_ret_status ret_status = PM_RET_SUCCESS;
5163f6d4794SMaheedhar Bollapalli
517eb0d2b17SVenkatesh Yadav Abbarapu if (index >= PGGS_NUM_REGS) {
5183f6d4794SMaheedhar Bollapalli ret_status = PM_RET_ERROR_ARGS;
5193f6d4794SMaheedhar Bollapalli } else {
5203f6d4794SMaheedhar Bollapalli ret_status = pm_mmio_write((uint64_t)PGGS_BASEADDR + (index << 2),
5218ce93ec9SRonak Jain 0xFFFFFFFFU, value, flag);
522eb0d2b17SVenkatesh Yadav Abbarapu }
52363eb7a36SRajan Vaja
5243f6d4794SMaheedhar Bollapalli return ret_status;
52563eb7a36SRajan Vaja }
52663eb7a36SRajan Vaja
52763eb7a36SRajan Vaja /**
528de7ed953SPrasad Kummari * pm_ioctl_afi() - Ioctl function for writing afi values.
529de7ed953SPrasad Kummari * @index: AFI register index.
530de7ed953SPrasad Kummari * @value: Register value to be written.
5318ce93ec9SRonak Jain * @flag: 0 - Call from secure source.
5328ce93ec9SRonak Jain * 1 - Call from non-secure source.
5336ad42b98SSiva Durga Prasad Paladugu *
534de7ed953SPrasad Kummari * Return: Returns status, either success or error+reason.
5356ad42b98SSiva Durga Prasad Paladugu *
5366ad42b98SSiva Durga Prasad Paladugu */
pm_ioctl_afi(uint32_t index,uint32_t value,uint32_t flag)537ffa91031SVenkatesh Yadav Abbarapu static enum pm_ret_status pm_ioctl_afi(uint32_t index,
5388ce93ec9SRonak Jain uint32_t value,
5398ce93ec9SRonak Jain uint32_t flag)
5406ad42b98SSiva Durga Prasad Paladugu {
541ffa91031SVenkatesh Yadav Abbarapu uint32_t mask;
5423f6d4794SMaheedhar Bollapalli enum pm_ret_status status = PM_RET_ERROR_ARGS;
543bb145c9dSMaheedhar Bollapalli const uint32_t regarr[] = {0xFD360000U,
5445bcbd2deSVenkatesh Yadav Abbarapu 0xFD360014U,
5455bcbd2deSVenkatesh Yadav Abbarapu 0xFD370000U,
5465bcbd2deSVenkatesh Yadav Abbarapu 0xFD370014U,
5475bcbd2deSVenkatesh Yadav Abbarapu 0xFD380000U,
5485bcbd2deSVenkatesh Yadav Abbarapu 0xFD380014U,
5495bcbd2deSVenkatesh Yadav Abbarapu 0xFD390000U,
5505bcbd2deSVenkatesh Yadav Abbarapu 0xFD390014U,
5515bcbd2deSVenkatesh Yadav Abbarapu 0xFD3a0000U,
5525bcbd2deSVenkatesh Yadav Abbarapu 0xFD3a0014U,
5535bcbd2deSVenkatesh Yadav Abbarapu 0xFD3b0000U,
5545bcbd2deSVenkatesh Yadav Abbarapu 0xFD3b0014U,
5555bcbd2deSVenkatesh Yadav Abbarapu 0xFF9b0000U,
5565bcbd2deSVenkatesh Yadav Abbarapu 0xFF9b0014U,
5575bcbd2deSVenkatesh Yadav Abbarapu 0xFD615000U,
5585bcbd2deSVenkatesh Yadav Abbarapu 0xFF419000U,
5596ad42b98SSiva Durga Prasad Paladugu };
5606ad42b98SSiva Durga Prasad Paladugu
5613f6d4794SMaheedhar Bollapalli if (index < ARRAY_SIZE(regarr)) {
5624264bd33SAkshay Belsare if (index <= AFIFM6_WRCTRL) {
5636ad42b98SSiva Durga Prasad Paladugu mask = FABRIC_WIDTH;
564eb0d2b17SVenkatesh Yadav Abbarapu } else {
5656ad42b98SSiva Durga Prasad Paladugu mask = 0xf00;
566eb0d2b17SVenkatesh Yadav Abbarapu }
5678ce93ec9SRonak Jain status = pm_mmio_write(regarr[index], mask, value, flag);
5683f6d4794SMaheedhar Bollapalli }
5696ad42b98SSiva Durga Prasad Paladugu
5703f6d4794SMaheedhar Bollapalli return status;
5716ad42b98SSiva Durga Prasad Paladugu }
5726ad42b98SSiva Durga Prasad Paladugu
5736ad42b98SSiva Durga Prasad Paladugu /**
574de7ed953SPrasad Kummari * pm_ioctl_read_pggs() - Ioctl function for reading persistent global general
575de7ed953SPrasad Kummari * storage (pggs).
576de7ed953SPrasad Kummari * @index: PGGS register index.
577de7ed953SPrasad Kummari * @value: Register value.
5788ce93ec9SRonak Jain * @flag: 0 - Call from secure source.
5798ce93ec9SRonak Jain * 1 - Call from non-secure source.
58063eb7a36SRajan Vaja *
58163eb7a36SRajan Vaja * This function returns PGGS register value.
58263eb7a36SRajan Vaja *
583de7ed953SPrasad Kummari * Return: Returns status, either success or error+reason.
584de7ed953SPrasad Kummari *
58563eb7a36SRajan Vaja */
pm_ioctl_read_pggs(uint32_t index,uint32_t * value,uint32_t flag)586ffa91031SVenkatesh Yadav Abbarapu static enum pm_ret_status pm_ioctl_read_pggs(uint32_t index,
5878ce93ec9SRonak Jain uint32_t *value,
5888ce93ec9SRonak Jain uint32_t flag)
58963eb7a36SRajan Vaja {
5903f6d4794SMaheedhar Bollapalli enum pm_ret_status status = 0;
5913f6d4794SMaheedhar Bollapalli
592eb0d2b17SVenkatesh Yadav Abbarapu if (index >= PGGS_NUM_REGS) {
5933f6d4794SMaheedhar Bollapalli status = PM_RET_ERROR_ARGS;
5943f6d4794SMaheedhar Bollapalli } else {
5958ce93ec9SRonak Jain status = pm_mmio_read((uint64_t)PGGS_BASEADDR + (index << 2),
5968ce93ec9SRonak Jain value, flag);
597eb0d2b17SVenkatesh Yadav Abbarapu }
59863eb7a36SRajan Vaja
5993f6d4794SMaheedhar Bollapalli return status;
60063eb7a36SRajan Vaja }
60163eb7a36SRajan Vaja
60263eb7a36SRajan Vaja /**
603de7ed953SPrasad Kummari * pm_ioctl_ulpi_reset() - Ioctl function for performing ULPI reset.
604de7ed953SPrasad Kummari *
6058ce93ec9SRonak Jain * @flag: 0 - Call from secure source.
6068ce93ec9SRonak Jain * 1 - Call from non-secure source.
6078ce93ec9SRonak Jain *
608de7ed953SPrasad Kummari * Return: Returns status, either success or error+reason.
6097c0b17e3SSiva Durga Prasad Paladugu *
6107c0b17e3SSiva Durga Prasad Paladugu * This function peerforms the ULPI reset sequence for resetting
6117c0b17e3SSiva Durga Prasad Paladugu * the ULPI transceiver.
6127c0b17e3SSiva Durga Prasad Paladugu */
pm_ioctl_ulpi_reset(uint32_t flag)6138ce93ec9SRonak Jain static enum pm_ret_status pm_ioctl_ulpi_reset(uint32_t flag)
6147c0b17e3SSiva Durga Prasad Paladugu {
6157c0b17e3SSiva Durga Prasad Paladugu enum pm_ret_status ret;
6167c0b17e3SSiva Durga Prasad Paladugu
6177c0b17e3SSiva Durga Prasad Paladugu ret = pm_mmio_write(CRL_APB_BOOT_PIN_CTRL, CRL_APB_BOOT_PIN_MASK,
6188ce93ec9SRonak Jain ZYNQMP_ULPI_RESET_VAL_HIGH, flag);
619eb0d2b17SVenkatesh Yadav Abbarapu if (ret != PM_RET_SUCCESS) {
6203f6d4794SMaheedhar Bollapalli goto exit_label;
621eb0d2b17SVenkatesh Yadav Abbarapu }
6227c0b17e3SSiva Durga Prasad Paladugu
6237c0b17e3SSiva Durga Prasad Paladugu /* Drive ULPI assert for atleast 1ms */
6247c0b17e3SSiva Durga Prasad Paladugu mdelay(1);
6257c0b17e3SSiva Durga Prasad Paladugu
6267c0b17e3SSiva Durga Prasad Paladugu ret = pm_mmio_write(CRL_APB_BOOT_PIN_CTRL, CRL_APB_BOOT_PIN_MASK,
6278ce93ec9SRonak Jain ZYNQMP_ULPI_RESET_VAL_LOW, flag);
628eb0d2b17SVenkatesh Yadav Abbarapu if (ret != PM_RET_SUCCESS) {
6293f6d4794SMaheedhar Bollapalli goto exit_label;
630eb0d2b17SVenkatesh Yadav Abbarapu }
6317c0b17e3SSiva Durga Prasad Paladugu
6327c0b17e3SSiva Durga Prasad Paladugu /* Drive ULPI de-assert for atleast 1ms */
6337c0b17e3SSiva Durga Prasad Paladugu mdelay(1);
6347c0b17e3SSiva Durga Prasad Paladugu
6357c0b17e3SSiva Durga Prasad Paladugu ret = pm_mmio_write(CRL_APB_BOOT_PIN_CTRL, CRL_APB_BOOT_PIN_MASK,
6368ce93ec9SRonak Jain ZYNQMP_ULPI_RESET_VAL_HIGH, flag);
6377c0b17e3SSiva Durga Prasad Paladugu
6383f6d4794SMaheedhar Bollapalli exit_label:
6397c0b17e3SSiva Durga Prasad Paladugu return ret;
6407c0b17e3SSiva Durga Prasad Paladugu }
6417c0b17e3SSiva Durga Prasad Paladugu
6427c0b17e3SSiva Durga Prasad Paladugu /**
643de7ed953SPrasad Kummari * pm_ioctl_set_boot_health_status() - Ioctl for setting healthy boot status.
644de7ed953SPrasad Kummari * @value: Value to write.
6458ce93ec9SRonak Jain * @flag: 0 - Call from secure source.
6468ce93ec9SRonak Jain * 1 - Call from non-secure source.
6479a2850e5SSiva Durga Prasad Paladugu *
6489a2850e5SSiva Durga Prasad Paladugu * This function sets healthy bit value to indicate boot health status
6499a2850e5SSiva Durga Prasad Paladugu * to firmware.
6509a2850e5SSiva Durga Prasad Paladugu *
651de7ed953SPrasad Kummari * Return: Returns status, either success or error+reason.
652de7ed953SPrasad Kummari *
6539a2850e5SSiva Durga Prasad Paladugu */
pm_ioctl_set_boot_health_status(uint32_t value,uint32_t flag)6548ce93ec9SRonak Jain static enum pm_ret_status pm_ioctl_set_boot_health_status(uint32_t value,
6558ce93ec9SRonak Jain uint32_t flag)
6569a2850e5SSiva Durga Prasad Paladugu {
657a7379a2aSTejas Patel return pm_mmio_write(PMU_GLOBAL_GEN_STORAGE4,
6588ce93ec9SRonak Jain PM_BOOT_HEALTH_STATUS_MASK, value, flag);
6599a2850e5SSiva Durga Prasad Paladugu }
6609a2850e5SSiva Durga Prasad Paladugu
6619a2850e5SSiva Durga Prasad Paladugu /**
662de7ed953SPrasad Kummari * pm_api_ioctl() - PM IOCTL API for device control and configs.
663de7ed953SPrasad Kummari * @nid: Node ID of the device.
664de7ed953SPrasad Kummari * @ioctl_id: ID of the requested IOCTL.
665de7ed953SPrasad Kummari * @arg1: Argument 1 to requested IOCTL call.
666de7ed953SPrasad Kummari * @arg2: Argument 2 to requested IOCTL call.
667de7ed953SPrasad Kummari * @value: Returned output value.
6688ce93ec9SRonak Jain * @flag: 0 - Call from secure source.
6698ce93ec9SRonak Jain * 1 - Call from non-secure source.
670f76918a8SRajan Vaja *
671f76918a8SRajan Vaja * This function calls IOCTL to firmware for device control and configuration.
672f76918a8SRajan Vaja *
673de7ed953SPrasad Kummari * Return: Returns status, either success or error+reason.
674de7ed953SPrasad Kummari *
675f76918a8SRajan Vaja */
pm_api_ioctl(enum pm_node_id nid,uint32_t ioctl_id,uint32_t arg1,uint32_t arg2,uint32_t * value,uint32_t flag)676f76918a8SRajan Vaja enum pm_ret_status pm_api_ioctl(enum pm_node_id nid,
677ffa91031SVenkatesh Yadav Abbarapu uint32_t ioctl_id,
678ffa91031SVenkatesh Yadav Abbarapu uint32_t arg1,
679ffa91031SVenkatesh Yadav Abbarapu uint32_t arg2,
6808ce93ec9SRonak Jain uint32_t *value,
6818ce93ec9SRonak Jain uint32_t flag)
682f76918a8SRajan Vaja {
68337e1a68eSJolly Shah enum pm_ret_status ret;
68476ff8c45SRajan Vaja uint32_t payload[PAYLOAD_ARG_CNT];
685f76918a8SRajan Vaja
686f76918a8SRajan Vaja switch (ioctl_id) {
687f76918a8SRajan Vaja case IOCTL_GET_RPU_OPER_MODE:
688f76918a8SRajan Vaja ret = pm_ioctl_get_rpu_oper_mode(value);
689f76918a8SRajan Vaja break;
690f76918a8SRajan Vaja case IOCTL_SET_RPU_OPER_MODE:
691f76918a8SRajan Vaja ret = pm_ioctl_set_rpu_oper_mode(arg1);
692f76918a8SRajan Vaja break;
693f76918a8SRajan Vaja case IOCTL_RPU_BOOT_ADDR_CONFIG:
694f76918a8SRajan Vaja ret = pm_ioctl_config_boot_addr(nid, arg1);
695f76918a8SRajan Vaja break;
696f76918a8SRajan Vaja case IOCTL_TCM_COMB_CONFIG:
697f76918a8SRajan Vaja ret = pm_ioctl_config_tcm_comb(arg1);
698f76918a8SRajan Vaja break;
6991818c029SRajan Vaja case IOCTL_SET_TAPDELAY_BYPASS:
7008ce93ec9SRonak Jain ret = pm_ioctl_set_tapdelay_bypass(arg1, arg2, flag);
7011818c029SRajan Vaja break;
7021818c029SRajan Vaja case IOCTL_SD_DLL_RESET:
7038ce93ec9SRonak Jain ret = pm_ioctl_sd_dll_reset(nid, arg1, flag);
7041818c029SRajan Vaja break;
7051818c029SRajan Vaja case IOCTL_SET_SD_TAPDELAY:
7068ce93ec9SRonak Jain ret = pm_ioctl_sd_set_tapdelay(nid, arg1, arg2, flag);
7071818c029SRajan Vaja break;
708caae497dSRajan Vaja case IOCTL_SET_PLL_FRAC_MODE:
709caae497dSRajan Vaja ret = pm_ioctl_set_pll_frac_mode(arg1, arg2);
710caae497dSRajan Vaja break;
711caae497dSRajan Vaja case IOCTL_GET_PLL_FRAC_MODE:
712caae497dSRajan Vaja ret = pm_ioctl_get_pll_frac_mode(arg1, value);
713caae497dSRajan Vaja break;
714caae497dSRajan Vaja case IOCTL_SET_PLL_FRAC_DATA:
7158ce93ec9SRonak Jain ret = pm_ioctl_set_pll_frac_data(arg1, arg2, flag);
716caae497dSRajan Vaja break;
717caae497dSRajan Vaja case IOCTL_GET_PLL_FRAC_DATA:
7188ce93ec9SRonak Jain ret = pm_ioctl_get_pll_frac_data(arg1, value, flag);
719caae497dSRajan Vaja break;
72063eb7a36SRajan Vaja case IOCTL_WRITE_GGS:
7218ce93ec9SRonak Jain ret = pm_ioctl_write_ggs(arg1, arg2, flag);
72263eb7a36SRajan Vaja break;
72363eb7a36SRajan Vaja case IOCTL_READ_GGS:
7248ce93ec9SRonak Jain ret = pm_ioctl_read_ggs(arg1, value, flag);
72563eb7a36SRajan Vaja break;
72663eb7a36SRajan Vaja case IOCTL_WRITE_PGGS:
7278ce93ec9SRonak Jain ret = pm_ioctl_write_pggs(arg1, arg2, flag);
72863eb7a36SRajan Vaja break;
72963eb7a36SRajan Vaja case IOCTL_READ_PGGS:
7308ce93ec9SRonak Jain ret = pm_ioctl_read_pggs(arg1, value, flag);
73163eb7a36SRajan Vaja break;
7327c0b17e3SSiva Durga Prasad Paladugu case IOCTL_ULPI_RESET:
7338ce93ec9SRonak Jain ret = pm_ioctl_ulpi_reset(flag);
7347c0b17e3SSiva Durga Prasad Paladugu break;
7359a2850e5SSiva Durga Prasad Paladugu case IOCTL_SET_BOOT_HEALTH_STATUS:
7368ce93ec9SRonak Jain ret = pm_ioctl_set_boot_health_status(arg1, flag);
7379a2850e5SSiva Durga Prasad Paladugu break;
7386ad42b98SSiva Durga Prasad Paladugu case IOCTL_AFI:
7398ce93ec9SRonak Jain ret = pm_ioctl_afi(arg1, arg2, flag);
7406ad42b98SSiva Durga Prasad Paladugu break;
741f76918a8SRajan Vaja default:
74276ff8c45SRajan Vaja /* Send request to the PMU */
7438ce93ec9SRonak Jain PM_PACK_PAYLOAD5(payload, flag, PM_IOCTL, nid, ioctl_id, arg1, arg2);
74476ff8c45SRajan Vaja
74576ff8c45SRajan Vaja ret = pm_ipi_send_sync(primary_proc, payload, value, 1);
74637e1a68eSJolly Shah break;
747f76918a8SRajan Vaja }
748f76918a8SRajan Vaja
749f76918a8SRajan Vaja return ret;
750f76918a8SRajan Vaja }
751223a6284SRonak Jain
752223a6284SRonak Jain /**
753de7ed953SPrasad Kummari * tfa_ioctl_bitmask() - API to get supported IOCTL ID mask.
754de7ed953SPrasad Kummari * @bit_mask: Returned bit mask of supported IOCTL IDs.
7558ce93ec9SRonak Jain * @flag: 0 - Call from secure source.
7568ce93ec9SRonak Jain * 1 - Call from non-secure source.
757de7ed953SPrasad Kummari *
758de7ed953SPrasad Kummari * Return: 0 success, negative value for errors.
759de7ed953SPrasad Kummari *
760223a6284SRonak Jain */
tfa_ioctl_bitmask(uint32_t * bit_mask,uint32_t flag)7618ce93ec9SRonak Jain enum pm_ret_status tfa_ioctl_bitmask(uint32_t *bit_mask, uint32_t flag)
762223a6284SRonak Jain {
763bb145c9dSMaheedhar Bollapalli const uint8_t supported_ids[] = {
764223a6284SRonak Jain IOCTL_GET_RPU_OPER_MODE,
765223a6284SRonak Jain IOCTL_SET_RPU_OPER_MODE,
766223a6284SRonak Jain IOCTL_RPU_BOOT_ADDR_CONFIG,
767223a6284SRonak Jain IOCTL_TCM_COMB_CONFIG,
768223a6284SRonak Jain IOCTL_SET_TAPDELAY_BYPASS,
769223a6284SRonak Jain IOCTL_SD_DLL_RESET,
770223a6284SRonak Jain IOCTL_SET_SD_TAPDELAY,
771223a6284SRonak Jain IOCTL_SET_PLL_FRAC_MODE,
772223a6284SRonak Jain IOCTL_GET_PLL_FRAC_MODE,
773223a6284SRonak Jain IOCTL_SET_PLL_FRAC_DATA,
774223a6284SRonak Jain IOCTL_GET_PLL_FRAC_DATA,
775223a6284SRonak Jain IOCTL_WRITE_GGS,
776223a6284SRonak Jain IOCTL_READ_GGS,
777223a6284SRonak Jain IOCTL_WRITE_PGGS,
778223a6284SRonak Jain IOCTL_READ_PGGS,
779223a6284SRonak Jain IOCTL_ULPI_RESET,
780223a6284SRonak Jain IOCTL_SET_BOOT_HEALTH_STATUS,
781223a6284SRonak Jain IOCTL_AFI,
782223a6284SRonak Jain };
783223a6284SRonak Jain uint8_t i, ioctl_id;
7843f6d4794SMaheedhar Bollapalli enum pm_ret_status ret = PM_RET_SUCCESS;
785223a6284SRonak Jain
786223a6284SRonak Jain for (i = 0U; i < ARRAY_SIZE(supported_ids); i++) {
787223a6284SRonak Jain ioctl_id = supported_ids[i];
788223a6284SRonak Jain if (ioctl_id >= 64U) {
7893f6d4794SMaheedhar Bollapalli ret = PM_RET_ERROR_NOTSUPPORTED;
7903f6d4794SMaheedhar Bollapalli break;
791223a6284SRonak Jain }
7928ce93ec9SRonak Jain ret = check_api_dependency(ioctl_id, flag);
793223a6284SRonak Jain if (ret == PM_RET_SUCCESS) {
794c8890883SHariBabu Gattem bit_mask[ioctl_id / 32U] |= BIT(ioctl_id % 32U);
795223a6284SRonak Jain }
796223a6284SRonak Jain }
797223a6284SRonak Jain
7983f6d4794SMaheedhar Bollapalli return ret;
799223a6284SRonak Jain }
800