blob: e812ad69dff72a34d15d35706fa8c8eff06726fb [file] [log] [blame]
Rajan Vaja5529a012018-01-17 02:39:23 -08001/*
Michal Simek2a47faa2023-04-14 08:43:51 +02002 * Copyright (c) 2018-2022, Arm Limited and Contributors. All rights reserved.
Jay Buddhabhatti26e138a2022-12-21 23:03:35 -08003 * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved.
Rajan Vaja5529a012018-01-17 02:39:23 -08004 *
5 * SPDX-License-Identifier: BSD-3-Clause
6 */
7
8/*
9 * ZynqMP system level PM-API functions for ioctl.
10 */
11
12#include <arch_helpers.h>
Antonio Nino Diaze0f90632018-12-14 00:18:21 +000013#include <drivers/delay_timer.h>
14#include <lib/mmio.h>
15#include <plat/common/platform.h>
16
Rajan Vaja35116132018-01-17 02:39:25 -080017#include "pm_api_clock.h"
Rajan Vaja5529a012018-01-17 02:39:23 -080018#include "pm_api_ioctl.h"
Rajan Vaja5529a012018-01-17 02:39:23 -080019#include "pm_client.h"
20#include "pm_common.h"
21#include "pm_ipi.h"
Prasad Kummari536e1102023-06-22 10:50:02 +053022#include <zynqmp_def.h>
Jay Buddhabhatti26e138a2022-12-21 23:03:35 -080023#include "zynqmp_pm_api_sys.h"
Rajan Vaja5529a012018-01-17 02:39:23 -080024
25/**
Prasad Kummari7d0623a2023-06-09 14:32:00 +053026 * pm_ioctl_get_rpu_oper_mode () - Get current RPU operation mode.
27 * @mode: Buffer to store value of oper mode(Split/Lock-step)
Rajan Vaja5529a012018-01-17 02:39:23 -080028 *
29 * This function provides current configured RPU operational mode.
30 *
Prasad Kummari7d0623a2023-06-09 14:32:00 +053031 * Return: Returns status, either success or error+reason.
32 *
Rajan Vaja5529a012018-01-17 02:39:23 -080033 */
Venkatesh Yadav Abbarapue7c45382022-05-19 14:49:49 +053034static enum pm_ret_status pm_ioctl_get_rpu_oper_mode(uint32_t *mode)
Rajan Vaja5529a012018-01-17 02:39:23 -080035{
Venkatesh Yadav Abbarapue7c45382022-05-19 14:49:49 +053036 uint32_t val;
Rajan Vaja5529a012018-01-17 02:39:23 -080037
38 val = mmio_read_32(ZYNQMP_RPU_GLBL_CNTL);
39 val &= ZYNQMP_SLSPLIT_MASK;
Venkatesh Yadav Abbarapua2ca35d2022-07-04 11:40:27 +053040 if (val == 0U) {
Rajan Vaja5529a012018-01-17 02:39:23 -080041 *mode = PM_RPU_MODE_LOCKSTEP;
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +053042 } else {
Jolly Shah69fb5bf2018-02-07 16:25:41 -080043 *mode = PM_RPU_MODE_SPLIT;
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +053044 }
Rajan Vaja5529a012018-01-17 02:39:23 -080045
46 return PM_RET_SUCCESS;
47}
48
49/**
Prasad Kummari7d0623a2023-06-09 14:32:00 +053050 * pm_ioctl_set_rpu_oper_mode () - Configure RPU operation mode.
51 * @mode: Value to set for oper mode(Split/Lock-step).
Rajan Vaja5529a012018-01-17 02:39:23 -080052 *
53 * This function configures RPU operational mode(Split/Lock-step).
54 * It also sets TCM combined mode in RPU lock-step and TCM non-combined
55 * mode for RPU split mode. In case of Lock step mode, RPU1's output is
56 * clamped.
57 *
Prasad Kummari7d0623a2023-06-09 14:32:00 +053058 * Return: Returns status, either success or error+reason.
59 *
Rajan Vaja5529a012018-01-17 02:39:23 -080060 */
Venkatesh Yadav Abbarapue7c45382022-05-19 14:49:49 +053061static enum pm_ret_status pm_ioctl_set_rpu_oper_mode(uint32_t mode)
Rajan Vaja5529a012018-01-17 02:39:23 -080062{
Venkatesh Yadav Abbarapue7c45382022-05-19 14:49:49 +053063 uint32_t val;
Rajan Vaja5529a012018-01-17 02:39:23 -080064
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +053065 if (mmio_read_32(CRL_APB_RST_LPD_TOP) & CRL_APB_RPU_AMBA_RESET) {
Rajan Vaja5529a012018-01-17 02:39:23 -080066 return PM_RET_ERROR_ACCESS;
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +053067 }
Rajan Vaja5529a012018-01-17 02:39:23 -080068
69 val = mmio_read_32(ZYNQMP_RPU_GLBL_CNTL);
70
71 if (mode == PM_RPU_MODE_SPLIT) {
72 val |= ZYNQMP_SLSPLIT_MASK;
73 val &= ~ZYNQMP_TCM_COMB_MASK;
74 val &= ~ZYNQMP_SLCLAMP_MASK;
75 } else if (mode == PM_RPU_MODE_LOCKSTEP) {
76 val &= ~ZYNQMP_SLSPLIT_MASK;
77 val |= ZYNQMP_TCM_COMB_MASK;
78 val |= ZYNQMP_SLCLAMP_MASK;
79 } else {
80 return PM_RET_ERROR_ARGS;
81 }
82
83 mmio_write_32(ZYNQMP_RPU_GLBL_CNTL, val);
84
85 return PM_RET_SUCCESS;
86}
87
88/**
Prasad Kummari7d0623a2023-06-09 14:32:00 +053089 * pm_ioctl_config_boot_addr() - Configure RPU boot address.
90 * @nid: Node ID of RPU.
91 * @value: Value to set for boot address (TCM/OCM).
Rajan Vaja5529a012018-01-17 02:39:23 -080092 *
93 * This function configures RPU boot address(memory).
94 *
Prasad Kummari7d0623a2023-06-09 14:32:00 +053095 * Return: Returns status, either success or error+reason.
96 *
Rajan Vaja5529a012018-01-17 02:39:23 -080097 */
98static enum pm_ret_status pm_ioctl_config_boot_addr(enum pm_node_id nid,
Venkatesh Yadav Abbarapue7c45382022-05-19 14:49:49 +053099 uint32_t value)
Rajan Vaja5529a012018-01-17 02:39:23 -0800100{
Venkatesh Yadav Abbarapue7c45382022-05-19 14:49:49 +0530101 uint32_t rpu_cfg_addr, val;
Rajan Vaja5529a012018-01-17 02:39:23 -0800102
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530103 if (nid == NODE_RPU_0) {
Rajan Vaja5529a012018-01-17 02:39:23 -0800104 rpu_cfg_addr = ZYNQMP_RPU0_CFG;
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530105 } else if (nid == NODE_RPU_1) {
Rajan Vaja5529a012018-01-17 02:39:23 -0800106 rpu_cfg_addr = ZYNQMP_RPU1_CFG;
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530107 } else {
Rajan Vaja5529a012018-01-17 02:39:23 -0800108 return PM_RET_ERROR_ARGS;
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530109 }
Rajan Vaja5529a012018-01-17 02:39:23 -0800110
111 val = mmio_read_32(rpu_cfg_addr);
112
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530113 if (value == PM_RPU_BOOTMEM_LOVEC) {
Rajan Vaja5529a012018-01-17 02:39:23 -0800114 val &= ~ZYNQMP_VINITHI_MASK;
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530115 } else if (value == PM_RPU_BOOTMEM_HIVEC) {
Rajan Vaja5529a012018-01-17 02:39:23 -0800116 val |= ZYNQMP_VINITHI_MASK;
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530117 } else {
Rajan Vaja5529a012018-01-17 02:39:23 -0800118 return PM_RET_ERROR_ARGS;
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530119 }
Rajan Vaja5529a012018-01-17 02:39:23 -0800120
121 mmio_write_32(rpu_cfg_addr, val);
122
123 return PM_RET_SUCCESS;
124}
125
126/**
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530127 * pm_ioctl_config_tcm_comb() - Configure TCM combined mode.
128 * @value: Value to set (Split/Combined).
Rajan Vaja5529a012018-01-17 02:39:23 -0800129 *
130 * This function configures TCM to be in split mode or combined
131 * mode.
132 *
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530133 * Return: Returns status, either success or error+reason.
134 *
Rajan Vaja5529a012018-01-17 02:39:23 -0800135 */
Venkatesh Yadav Abbarapue7c45382022-05-19 14:49:49 +0530136static enum pm_ret_status pm_ioctl_config_tcm_comb(uint32_t value)
Rajan Vaja5529a012018-01-17 02:39:23 -0800137{
Venkatesh Yadav Abbarapue7c45382022-05-19 14:49:49 +0530138 uint32_t val;
Rajan Vaja5529a012018-01-17 02:39:23 -0800139
140 val = mmio_read_32(ZYNQMP_RPU_GLBL_CNTL);
141
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530142 if (value == PM_RPU_TCM_SPLIT) {
Rajan Vaja5529a012018-01-17 02:39:23 -0800143 val &= ~ZYNQMP_TCM_COMB_MASK;
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530144 } else if (value == PM_RPU_TCM_COMB) {
Rajan Vaja5529a012018-01-17 02:39:23 -0800145 val |= ZYNQMP_TCM_COMB_MASK;
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530146 } else {
Rajan Vaja5529a012018-01-17 02:39:23 -0800147 return PM_RET_ERROR_ARGS;
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530148 }
Rajan Vaja5529a012018-01-17 02:39:23 -0800149
150 mmio_write_32(ZYNQMP_RPU_GLBL_CNTL, val);
151
152 return PM_RET_SUCCESS;
153}
154
155/**
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530156 * pm_ioctl_set_tapdelay_bypass() - Enable/Disable tap delay bypass.
157 * @type: Type of tap delay to enable/disable (e.g. QSPI).
158 * @value: Enable/Disable.
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800159 *
160 * This function enable/disable tap delay bypass.
161 *
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530162 * Return: Returns status, either success or error+reason.
163 *
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800164 */
Venkatesh Yadav Abbarapue7c45382022-05-19 14:49:49 +0530165static enum pm_ret_status pm_ioctl_set_tapdelay_bypass(uint32_t type,
166 uint32_t value)
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800167{
168 if ((value != PM_TAPDELAY_BYPASS_ENABLE &&
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530169 value != PM_TAPDELAY_BYPASS_DISABLE) || type >= PM_TAPDELAY_MAX) {
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800170 return PM_RET_ERROR_ARGS;
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530171 }
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800172
173 return pm_mmio_write(IOU_TAPDLY_BYPASS, TAP_DELAY_MASK, value << type);
174}
175
176/**
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530177 * pm_ioctl_set_sgmii_mode() - Set SGMII mode for the GEM device.
178 * @nid: Node ID of the device.
179 * @value: Enable/Disable.
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800180 *
181 * This function enable/disable SGMII mode for the GEM device.
182 * While enabling SGMII mode, it also ties the GEM PCS Signal
183 * Detect to 1 and selects EMIO for RX clock generation.
184 *
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530185 * Return: Returns status, either success or error+reason.
186 *
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800187 */
188static enum pm_ret_status pm_ioctl_set_sgmii_mode(enum pm_node_id nid,
Venkatesh Yadav Abbarapue7c45382022-05-19 14:49:49 +0530189 uint32_t value)
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800190{
Venkatesh Yadav Abbarapue7c45382022-05-19 14:49:49 +0530191 uint32_t val, mask, shift;
Jolly Shah69fb5bf2018-02-07 16:25:41 -0800192 enum pm_ret_status ret;
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800193
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530194 if (value != PM_SGMII_DISABLE && value != PM_SGMII_ENABLE) {
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800195 return PM_RET_ERROR_ARGS;
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530196 }
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800197
198 switch (nid) {
199 case NODE_ETH_0:
200 shift = 0;
201 break;
202 case NODE_ETH_1:
203 shift = 1;
204 break;
205 case NODE_ETH_2:
206 shift = 2;
207 break;
208 case NODE_ETH_3:
209 shift = 3;
210 break;
211 default:
212 return PM_RET_ERROR_ARGS;
213 }
214
215 if (value == PM_SGMII_DISABLE) {
216 mask = GEM_SGMII_MASK << GEM_CLK_CTRL_OFFSET * shift;
Jolly Shah69fb5bf2018-02-07 16:25:41 -0800217 ret = pm_mmio_write(IOU_GEM_CLK_CTRL, mask, 0U);
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800218 } else {
219 /* Tie the GEM PCS Signal Detect to 1 */
220 mask = SGMII_SD_MASK << SGMII_SD_OFFSET * shift;
221 val = SGMII_PCS_SD_1 << SGMII_SD_OFFSET * shift;
222 ret = pm_mmio_write(IOU_GEM_CTRL, mask, val);
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530223 if (ret != PM_RET_SUCCESS) {
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800224 return ret;
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530225 }
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800226
227 /* Set the GEM to SGMII mode */
228 mask = GEM_CLK_CTRL_MASK << GEM_CLK_CTRL_OFFSET * shift;
229 val = GEM_RX_SRC_SEL_GTR | GEM_SGMII_MODE;
230 val <<= GEM_CLK_CTRL_OFFSET * shift;
231 ret = pm_mmio_write(IOU_GEM_CLK_CTRL, mask, val);
232 }
233
234 return ret;
235}
236
237/**
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530238 * pm_ioctl_sd_dll_reset() - Reset DLL logic.
239 * @nid: Node ID of the device.
240 * @type: Reset type.
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800241 *
242 * This function resets DLL logic for the SD device.
243 *
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530244 * Return: Returns status, either success or error+reason.
245 *
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800246 */
247static enum pm_ret_status pm_ioctl_sd_dll_reset(enum pm_node_id nid,
Venkatesh Yadav Abbarapue7c45382022-05-19 14:49:49 +0530248 uint32_t type)
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800249{
Venkatesh Yadav Abbarapue7c45382022-05-19 14:49:49 +0530250 uint32_t mask, val;
Jolly Shah69fb5bf2018-02-07 16:25:41 -0800251 enum pm_ret_status ret;
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800252
253 if (nid == NODE_SD_0) {
254 mask = ZYNQMP_SD0_DLL_RST_MASK;
255 val = ZYNQMP_SD0_DLL_RST;
256 } else if (nid == NODE_SD_1) {
257 mask = ZYNQMP_SD1_DLL_RST_MASK;
258 val = ZYNQMP_SD1_DLL_RST;
259 } else {
260 return PM_RET_ERROR_ARGS;
261 }
262
263 switch (type) {
264 case PM_DLL_RESET_ASSERT:
265 case PM_DLL_RESET_PULSE:
266 ret = pm_mmio_write(ZYNQMP_SD_DLL_CTRL, mask, val);
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530267 if (ret != PM_RET_SUCCESS) {
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800268 return ret;
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530269 }
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800270
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530271 if (type == PM_DLL_RESET_ASSERT) {
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800272 break;
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530273 }
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800274 mdelay(1);
Daniel Boulby8942a1b2018-06-22 14:16:03 +0100275 /* Fallthrough */
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800276 case PM_DLL_RESET_RELEASE:
277 ret = pm_mmio_write(ZYNQMP_SD_DLL_CTRL, mask, 0);
278 break;
279 default:
280 ret = PM_RET_ERROR_ARGS;
Jolly Shah69fb5bf2018-02-07 16:25:41 -0800281 break;
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800282 }
283
284 return ret;
285}
286
287/**
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530288 * pm_ioctl_sd_set_tapdelay() - Set tap delay for the SD device.
289 * @nid: Node ID of the device.
290 * @type: Type of tap delay to set (input/output).
291 * @value: Value to set fot the tap delay.
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800292 *
293 * This function sets input/output tap delay for the SD device.
294 *
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530295 * Return: Returns status, either success or error+reason.
296 *
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800297 */
298static enum pm_ret_status pm_ioctl_sd_set_tapdelay(enum pm_node_id nid,
299 enum tap_delay_type type,
Venkatesh Yadav Abbarapue7c45382022-05-19 14:49:49 +0530300 uint32_t value)
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800301{
Venkatesh Yadav Abbarapue7c45382022-05-19 14:49:49 +0530302 uint32_t shift;
Jolly Shah69fb5bf2018-02-07 16:25:41 -0800303 enum pm_ret_status ret;
Venkatesh Yadav Abbarapue7c45382022-05-19 14:49:49 +0530304 uint32_t val, mask;
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800305
Sai Krishna Potthuriad48c502020-10-20 07:00:06 -0600306 if (nid == NODE_SD_0) {
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800307 shift = 0;
Sai Krishna Potthuriad48c502020-10-20 07:00:06 -0600308 mask = ZYNQMP_SD0_DLL_RST_MASK;
309 } else if (nid == NODE_SD_1) {
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800310 shift = ZYNQMP_SD_TAP_OFFSET;
Sai Krishna Potthuriad48c502020-10-20 07:00:06 -0600311 mask = ZYNQMP_SD1_DLL_RST_MASK;
312 } else {
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800313 return PM_RET_ERROR_ARGS;
Sai Krishna Potthuriad48c502020-10-20 07:00:06 -0600314 }
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800315
Sai Krishna Potthuriad48c502020-10-20 07:00:06 -0600316 ret = pm_mmio_read(ZYNQMP_SD_DLL_CTRL, &val);
317 if (ret != PM_RET_SUCCESS) {
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800318 return ret;
Sai Krishna Potthuriad48c502020-10-20 07:00:06 -0600319 }
320
Venkatesh Yadav Abbarapua2ca35d2022-07-04 11:40:27 +0530321 if ((val & mask) == 0U) {
Sai Krishna Potthuriad48c502020-10-20 07:00:06 -0600322 ret = pm_ioctl_sd_dll_reset(nid, PM_DLL_RESET_ASSERT);
323 if (ret != PM_RET_SUCCESS) {
324 return ret;
325 }
326 }
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800327
328 if (type == PM_TAPDELAY_INPUT) {
329 ret = pm_mmio_write(ZYNQMP_SD_ITAP_DLY,
Jolly Shah69fb5bf2018-02-07 16:25:41 -0800330 (ZYNQMP_SD_ITAPCHGWIN_MASK << shift),
331 (ZYNQMP_SD_ITAPCHGWIN << shift));
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530332
333 if (ret != PM_RET_SUCCESS) {
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800334 goto reset_release;
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530335 }
336
Venkatesh Yadav Abbarapua2ca35d2022-07-04 11:40:27 +0530337 if (value == 0U) {
Sai Krishna Potthuri15da5822020-10-30 00:09:43 -0600338 ret = pm_mmio_write(ZYNQMP_SD_ITAP_DLY,
339 (ZYNQMP_SD_ITAPDLYENA_MASK <<
340 shift), 0);
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530341 } else {
Sai Krishna Potthuri15da5822020-10-30 00:09:43 -0600342 ret = pm_mmio_write(ZYNQMP_SD_ITAP_DLY,
343 (ZYNQMP_SD_ITAPDLYENA_MASK <<
344 shift), (ZYNQMP_SD_ITAPDLYENA <<
345 shift));
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530346 }
347
348 if (ret != PM_RET_SUCCESS) {
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800349 goto reset_release;
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530350 }
351
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800352 ret = pm_mmio_write(ZYNQMP_SD_ITAP_DLY,
Jolly Shah69fb5bf2018-02-07 16:25:41 -0800353 (ZYNQMP_SD_ITAPDLYSEL_MASK << shift),
354 (value << shift));
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530355
356 if (ret != PM_RET_SUCCESS) {
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800357 goto reset_release;
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530358 }
359
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800360 ret = pm_mmio_write(ZYNQMP_SD_ITAP_DLY,
Jolly Shah69fb5bf2018-02-07 16:25:41 -0800361 (ZYNQMP_SD_ITAPCHGWIN_MASK << shift), 0);
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800362 } else if (type == PM_TAPDELAY_OUTPUT) {
363 ret = pm_mmio_write(ZYNQMP_SD_OTAP_DLY,
Sai Krishna Potthuri15da5822020-10-30 00:09:43 -0600364 (ZYNQMP_SD_OTAPDLYENA_MASK << shift), 0);
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530365
366 if (ret != PM_RET_SUCCESS) {
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800367 goto reset_release;
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530368 }
369
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800370 ret = pm_mmio_write(ZYNQMP_SD_OTAP_DLY,
Jolly Shah69fb5bf2018-02-07 16:25:41 -0800371 (ZYNQMP_SD_OTAPDLYSEL_MASK << shift),
372 (value << shift));
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800373 } else {
374 ret = PM_RET_ERROR_ARGS;
375 }
376
377reset_release:
Sai Krishna Potthuriad48c502020-10-20 07:00:06 -0600378 if ((val & mask) == 0) {
379 (void)pm_ioctl_sd_dll_reset(nid, PM_DLL_RESET_RELEASE);
380 }
381
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800382 return ret;
383}
384
385/**
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530386 * pm_ioctl_set_pll_frac_mode() - Ioctl function for setting pll mode.
387 * @pll: PLL clock id.
388 * @mode: Mode fraction/integar.
389 *
390 * This function sets PLL mode.
Rajan Vaja35116132018-01-17 02:39:25 -0800391 *
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530392 * Return: Returns status, either success or error+reason.
Rajan Vaja35116132018-01-17 02:39:25 -0800393 *
Rajan Vaja35116132018-01-17 02:39:25 -0800394 */
395static enum pm_ret_status pm_ioctl_set_pll_frac_mode
Venkatesh Yadav Abbarapue7c45382022-05-19 14:49:49 +0530396 (uint32_t pll, uint32_t mode)
Rajan Vaja35116132018-01-17 02:39:25 -0800397{
Jolly Shahcb5bc752019-01-02 12:46:46 -0800398 return pm_clock_set_pll_mode(pll, mode);
Rajan Vaja35116132018-01-17 02:39:25 -0800399}
400
401/**
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530402 * pm_ioctl_get_pll_frac_mode() - Ioctl function for getting pll mode.
403 * @pll: PLL clock id.
404 * @mode: Mode fraction/integar.
Rajan Vaja35116132018-01-17 02:39:25 -0800405 *
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530406 * This function return current PLL mode.
Rajan Vaja35116132018-01-17 02:39:25 -0800407 *
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530408 * Return: Returns status, either success or error+reason.
409 *
Rajan Vaja35116132018-01-17 02:39:25 -0800410 */
411static enum pm_ret_status pm_ioctl_get_pll_frac_mode
Venkatesh Yadav Abbarapue7c45382022-05-19 14:49:49 +0530412 (uint32_t pll, uint32_t *mode)
Rajan Vaja35116132018-01-17 02:39:25 -0800413{
Jolly Shah77eb52f2019-01-02 12:49:21 -0800414 return pm_clock_get_pll_mode(pll, mode);
Rajan Vaja35116132018-01-17 02:39:25 -0800415}
416
417/**
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530418 * pm_ioctl_set_pll_frac_data() - Ioctl function for setting pll fraction data.
419 * @pll: PLL clock id.
420 * @data: fraction data.
Rajan Vaja35116132018-01-17 02:39:25 -0800421 *
422 * This function sets fraction data.
423 * It is valid for fraction mode only.
424 *
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530425 * Return: Returns status, either success or error+reason.
426 *
Rajan Vaja35116132018-01-17 02:39:25 -0800427 */
428static enum pm_ret_status pm_ioctl_set_pll_frac_data
Venkatesh Yadav Abbarapue7c45382022-05-19 14:49:49 +0530429 (uint32_t pll, uint32_t data)
Rajan Vaja35116132018-01-17 02:39:25 -0800430{
Jolly Shah68116ef2019-01-02 12:42:56 -0800431 enum pm_node_id pll_nid;
432 enum pm_ret_status status;
433
434 /* Get PLL node ID using PLL clock ID */
435 status = pm_clock_get_pll_node_id(pll, &pll_nid);
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530436 if (status != PM_RET_SUCCESS) {
Jolly Shah68116ef2019-01-02 12:42:56 -0800437 return status;
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530438 }
Jolly Shah68116ef2019-01-02 12:42:56 -0800439
440 return pm_pll_set_parameter(pll_nid, PM_PLL_PARAM_DATA, data);
Rajan Vaja35116132018-01-17 02:39:25 -0800441}
442
443/**
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530444 * pm_ioctl_get_pll_frac_data() - Ioctl function for getting pll fraction data.
445 * @pll: PLL clock id.
446 * @data: fraction data.
Rajan Vaja35116132018-01-17 02:39:25 -0800447 *
448 * This function returns fraction data value.
449 *
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530450 * Return: Returns status, either success or error+reason.
451 *
Rajan Vaja35116132018-01-17 02:39:25 -0800452 */
453static enum pm_ret_status pm_ioctl_get_pll_frac_data
Venkatesh Yadav Abbarapue7c45382022-05-19 14:49:49 +0530454 (uint32_t pll, uint32_t *data)
Rajan Vaja35116132018-01-17 02:39:25 -0800455{
Jolly Shahb4c99462019-01-02 12:40:17 -0800456 enum pm_node_id pll_nid;
457 enum pm_ret_status status;
458
459 /* Get PLL node ID using PLL clock ID */
460 status = pm_clock_get_pll_node_id(pll, &pll_nid);
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530461 if (status != PM_RET_SUCCESS) {
Jolly Shahb4c99462019-01-02 12:40:17 -0800462 return status;
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530463 }
Jolly Shahb4c99462019-01-02 12:40:17 -0800464
465 return pm_pll_get_parameter(pll_nid, PM_PLL_PARAM_DATA, data);
Rajan Vaja35116132018-01-17 02:39:25 -0800466}
467
468/**
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530469 * pm_ioctl_write_ggs() - Ioctl function for writing global general storage
470 * (ggs).
471 * @index: GGS register index.
472 * @value: Register value to be written.
Rajan Vaja393c0a22018-01-17 02:39:27 -0800473 *
474 * This function writes value to GGS register.
475 *
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530476 * Return: Returns status, either success or error+reason.
477 *
Rajan Vaja393c0a22018-01-17 02:39:27 -0800478 */
Venkatesh Yadav Abbarapue7c45382022-05-19 14:49:49 +0530479static enum pm_ret_status pm_ioctl_write_ggs(uint32_t index,
480 uint32_t value)
Rajan Vaja393c0a22018-01-17 02:39:27 -0800481{
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530482 if (index >= GGS_NUM_REGS) {
Rajan Vaja393c0a22018-01-17 02:39:27 -0800483 return PM_RET_ERROR_ARGS;
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530484 }
Rajan Vaja393c0a22018-01-17 02:39:27 -0800485
Jolly Shah69fb5bf2018-02-07 16:25:41 -0800486 return pm_mmio_write(GGS_BASEADDR + (index << 2),
487 0xFFFFFFFFU, value);
Rajan Vaja393c0a22018-01-17 02:39:27 -0800488}
489
490/**
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530491 * pm_ioctl_read_ggs() - Ioctl function for reading global general storage
492 * (ggs).
493 * @index: GGS register index.
494 * @value: Register value.
Rajan Vaja393c0a22018-01-17 02:39:27 -0800495 *
496 * This function returns GGS register value.
497 *
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530498 * Return: Returns status, either success or error+reason.
499 *
Rajan Vaja393c0a22018-01-17 02:39:27 -0800500 */
Venkatesh Yadav Abbarapue7c45382022-05-19 14:49:49 +0530501static enum pm_ret_status pm_ioctl_read_ggs(uint32_t index,
502 uint32_t *value)
Rajan Vaja393c0a22018-01-17 02:39:27 -0800503{
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530504 if (index >= GGS_NUM_REGS) {
Rajan Vaja393c0a22018-01-17 02:39:27 -0800505 return PM_RET_ERROR_ARGS;
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530506 }
Rajan Vaja393c0a22018-01-17 02:39:27 -0800507
508 return pm_mmio_read(GGS_BASEADDR + (index << 2), value);
509}
510
511/**
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530512 * pm_ioctl_write_pggs() - Ioctl function for writing persistent global general
513 * storage (pggs).
514 * @index: PGGS register index.
515 * @value: Register value to be written.
Rajan Vaja393c0a22018-01-17 02:39:27 -0800516 *
517 * This function writes value to PGGS register.
518 *
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530519 * Return: Returns status, either success or error+reason.
520 *
Rajan Vaja393c0a22018-01-17 02:39:27 -0800521 */
Venkatesh Yadav Abbarapue7c45382022-05-19 14:49:49 +0530522static enum pm_ret_status pm_ioctl_write_pggs(uint32_t index,
523 uint32_t value)
Rajan Vaja393c0a22018-01-17 02:39:27 -0800524{
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530525 if (index >= PGGS_NUM_REGS) {
Rajan Vaja393c0a22018-01-17 02:39:27 -0800526 return PM_RET_ERROR_ARGS;
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530527 }
Rajan Vaja393c0a22018-01-17 02:39:27 -0800528
Jolly Shah69fb5bf2018-02-07 16:25:41 -0800529 return pm_mmio_write(PGGS_BASEADDR + (index << 2),
530 0xFFFFFFFFU, value);
Rajan Vaja393c0a22018-01-17 02:39:27 -0800531}
532
533/**
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530534 * pm_ioctl_afi() - Ioctl function for writing afi values.
535 * @index: AFI register index.
536 * @value: Register value to be written.
Siva Durga Prasad Paladugua22b8852018-09-04 17:27:12 +0530537 *
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530538 * Return: Returns status, either success or error+reason.
Siva Durga Prasad Paladugua22b8852018-09-04 17:27:12 +0530539 *
Siva Durga Prasad Paladugua22b8852018-09-04 17:27:12 +0530540 */
Venkatesh Yadav Abbarapue7c45382022-05-19 14:49:49 +0530541static enum pm_ret_status pm_ioctl_afi(uint32_t index,
542 uint32_t value)
Siva Durga Prasad Paladugua22b8852018-09-04 17:27:12 +0530543{
Venkatesh Yadav Abbarapue7c45382022-05-19 14:49:49 +0530544 uint32_t mask;
545 uint32_t regarr[] = {0xFD360000U,
Venkatesh Yadav Abbarapued4f1e82022-04-29 09:58:30 +0530546 0xFD360014U,
547 0xFD370000U,
548 0xFD370014U,
549 0xFD380000U,
550 0xFD380014U,
551 0xFD390000U,
552 0xFD390014U,
553 0xFD3a0000U,
554 0xFD3a0014U,
555 0xFD3b0000U,
556 0xFD3b0014U,
557 0xFF9b0000U,
558 0xFF9b0014U,
559 0xFD615000U,
560 0xFF419000U,
Siva Durga Prasad Paladugua22b8852018-09-04 17:27:12 +0530561 };
562
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530563 if (index >= ARRAY_SIZE(regarr)) {
Siva Durga Prasad Paladugua22b8852018-09-04 17:27:12 +0530564 return PM_RET_ERROR_ARGS;
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530565 }
Siva Durga Prasad Paladugua22b8852018-09-04 17:27:12 +0530566
Akshay Belsareaf00b312022-08-23 11:39:35 +0530567 if (index <= AFIFM6_WRCTRL) {
Siva Durga Prasad Paladugua22b8852018-09-04 17:27:12 +0530568 mask = FABRIC_WIDTH;
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530569 } else {
Siva Durga Prasad Paladugua22b8852018-09-04 17:27:12 +0530570 mask = 0xf00;
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530571 }
Siva Durga Prasad Paladugua22b8852018-09-04 17:27:12 +0530572
573 return pm_mmio_write(regarr[index], mask, value);
574}
575
576/**
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530577 * pm_ioctl_read_pggs() - Ioctl function for reading persistent global general
578 * storage (pggs).
579 * @index: PGGS register index.
580 * @value: Register value.
Rajan Vaja393c0a22018-01-17 02:39:27 -0800581 *
582 * This function returns PGGS register value.
583 *
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530584 * Return: Returns status, either success or error+reason.
585 *
Rajan Vaja393c0a22018-01-17 02:39:27 -0800586 */
Venkatesh Yadav Abbarapue7c45382022-05-19 14:49:49 +0530587static enum pm_ret_status pm_ioctl_read_pggs(uint32_t index,
588 uint32_t *value)
Rajan Vaja393c0a22018-01-17 02:39:27 -0800589{
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530590 if (index >= PGGS_NUM_REGS) {
Rajan Vaja393c0a22018-01-17 02:39:27 -0800591 return PM_RET_ERROR_ARGS;
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530592 }
Rajan Vaja393c0a22018-01-17 02:39:27 -0800593
594 return pm_mmio_read(PGGS_BASEADDR + (index << 2), value);
595}
596
597/**
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530598 * pm_ioctl_ulpi_reset() - Ioctl function for performing ULPI reset.
599 *
600 * Return: Returns status, either success or error+reason.
Siva Durga Prasad Paladugued1d5cb2018-09-04 17:03:25 +0530601 *
602 * This function peerforms the ULPI reset sequence for resetting
603 * the ULPI transceiver.
Siva Durga Prasad Paladugued1d5cb2018-09-04 17:03:25 +0530604 */
605static enum pm_ret_status pm_ioctl_ulpi_reset(void)
606{
607 enum pm_ret_status ret;
608
609 ret = pm_mmio_write(CRL_APB_BOOT_PIN_CTRL, CRL_APB_BOOT_PIN_MASK,
610 ZYNQMP_ULPI_RESET_VAL_HIGH);
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530611 if (ret != PM_RET_SUCCESS) {
Siva Durga Prasad Paladugued1d5cb2018-09-04 17:03:25 +0530612 return ret;
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530613 }
Siva Durga Prasad Paladugued1d5cb2018-09-04 17:03:25 +0530614
615 /* Drive ULPI assert for atleast 1ms */
616 mdelay(1);
617
618 ret = pm_mmio_write(CRL_APB_BOOT_PIN_CTRL, CRL_APB_BOOT_PIN_MASK,
619 ZYNQMP_ULPI_RESET_VAL_LOW);
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530620 if (ret != PM_RET_SUCCESS) {
Siva Durga Prasad Paladugued1d5cb2018-09-04 17:03:25 +0530621 return ret;
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530622 }
Siva Durga Prasad Paladugued1d5cb2018-09-04 17:03:25 +0530623
624 /* Drive ULPI de-assert for atleast 1ms */
625 mdelay(1);
626
627 ret = pm_mmio_write(CRL_APB_BOOT_PIN_CTRL, CRL_APB_BOOT_PIN_MASK,
628 ZYNQMP_ULPI_RESET_VAL_HIGH);
629
630 return ret;
631}
632
633/**
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530634 * pm_ioctl_set_boot_health_status() - Ioctl for setting healthy boot status.
635 * @value: Value to write.
Siva Durga Prasad Paladuguac8526f2018-09-04 17:12:51 +0530636 *
637 * This function sets healthy bit value to indicate boot health status
638 * to firmware.
639 *
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530640 * Return: Returns status, either success or error+reason.
641 *
Siva Durga Prasad Paladuguac8526f2018-09-04 17:12:51 +0530642 */
Venkatesh Yadav Abbarapue7c45382022-05-19 14:49:49 +0530643static enum pm_ret_status pm_ioctl_set_boot_health_status(uint32_t value)
Siva Durga Prasad Paladuguac8526f2018-09-04 17:12:51 +0530644{
Tejas Patel6552a552020-11-22 23:37:55 -0800645 return pm_mmio_write(PMU_GLOBAL_GEN_STORAGE4,
Siva Durga Prasad Paladuguac8526f2018-09-04 17:12:51 +0530646 PM_BOOT_HEALTH_STATUS_MASK, value);
647}
648
649/**
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530650 * pm_api_ioctl() - PM IOCTL API for device control and configs.
651 * @nid: Node ID of the device.
652 * @ioctl_id: ID of the requested IOCTL.
653 * @arg1: Argument 1 to requested IOCTL call.
654 * @arg2: Argument 2 to requested IOCTL call.
655 * @value: Returned output value.
Rajan Vaja5529a012018-01-17 02:39:23 -0800656 *
657 * This function calls IOCTL to firmware for device control and configuration.
658 *
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530659 * Return: Returns status, either success or error+reason.
660 *
Rajan Vaja5529a012018-01-17 02:39:23 -0800661 */
662enum pm_ret_status pm_api_ioctl(enum pm_node_id nid,
Venkatesh Yadav Abbarapue7c45382022-05-19 14:49:49 +0530663 uint32_t ioctl_id,
664 uint32_t arg1,
665 uint32_t arg2,
666 uint32_t *value)
Rajan Vaja5529a012018-01-17 02:39:23 -0800667{
Jolly Shah69fb5bf2018-02-07 16:25:41 -0800668 enum pm_ret_status ret;
Rajan Vaja0c0615a2021-10-12 03:30:09 -0700669 uint32_t payload[PAYLOAD_ARG_CNT];
Rajan Vaja5529a012018-01-17 02:39:23 -0800670
671 switch (ioctl_id) {
672 case IOCTL_GET_RPU_OPER_MODE:
673 ret = pm_ioctl_get_rpu_oper_mode(value);
674 break;
675 case IOCTL_SET_RPU_OPER_MODE:
676 ret = pm_ioctl_set_rpu_oper_mode(arg1);
677 break;
678 case IOCTL_RPU_BOOT_ADDR_CONFIG:
679 ret = pm_ioctl_config_boot_addr(nid, arg1);
680 break;
681 case IOCTL_TCM_COMB_CONFIG:
682 ret = pm_ioctl_config_tcm_comb(arg1);
683 break;
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800684 case IOCTL_SET_TAPDELAY_BYPASS:
685 ret = pm_ioctl_set_tapdelay_bypass(arg1, arg2);
686 break;
687 case IOCTL_SET_SGMII_MODE:
688 ret = pm_ioctl_set_sgmii_mode(nid, arg1);
689 break;
690 case IOCTL_SD_DLL_RESET:
691 ret = pm_ioctl_sd_dll_reset(nid, arg1);
692 break;
693 case IOCTL_SET_SD_TAPDELAY:
694 ret = pm_ioctl_sd_set_tapdelay(nid, arg1, arg2);
695 break;
Rajan Vaja35116132018-01-17 02:39:25 -0800696 case IOCTL_SET_PLL_FRAC_MODE:
697 ret = pm_ioctl_set_pll_frac_mode(arg1, arg2);
698 break;
699 case IOCTL_GET_PLL_FRAC_MODE:
700 ret = pm_ioctl_get_pll_frac_mode(arg1, value);
701 break;
702 case IOCTL_SET_PLL_FRAC_DATA:
703 ret = pm_ioctl_set_pll_frac_data(arg1, arg2);
704 break;
705 case IOCTL_GET_PLL_FRAC_DATA:
706 ret = pm_ioctl_get_pll_frac_data(arg1, value);
707 break;
Rajan Vaja393c0a22018-01-17 02:39:27 -0800708 case IOCTL_WRITE_GGS:
709 ret = pm_ioctl_write_ggs(arg1, arg2);
710 break;
711 case IOCTL_READ_GGS:
712 ret = pm_ioctl_read_ggs(arg1, value);
713 break;
714 case IOCTL_WRITE_PGGS:
715 ret = pm_ioctl_write_pggs(arg1, arg2);
716 break;
717 case IOCTL_READ_PGGS:
718 ret = pm_ioctl_read_pggs(arg1, value);
719 break;
Siva Durga Prasad Paladugued1d5cb2018-09-04 17:03:25 +0530720 case IOCTL_ULPI_RESET:
721 ret = pm_ioctl_ulpi_reset();
722 break;
Siva Durga Prasad Paladuguac8526f2018-09-04 17:12:51 +0530723 case IOCTL_SET_BOOT_HEALTH_STATUS:
724 ret = pm_ioctl_set_boot_health_status(arg1);
725 break;
Siva Durga Prasad Paladugua22b8852018-09-04 17:27:12 +0530726 case IOCTL_AFI:
727 ret = pm_ioctl_afi(arg1, arg2);
728 break;
Rajan Vaja5529a012018-01-17 02:39:23 -0800729 default:
Rajan Vaja0c0615a2021-10-12 03:30:09 -0700730 /* Send request to the PMU */
731 PM_PACK_PAYLOAD5(payload, PM_IOCTL, nid, ioctl_id, arg1, arg2);
732
733 ret = pm_ipi_send_sync(primary_proc, payload, value, 1);
Jolly Shah69fb5bf2018-02-07 16:25:41 -0800734 break;
Rajan Vaja5529a012018-01-17 02:39:23 -0800735 }
736
737 return ret;
738}
Ronak Jain325bad12021-12-21 01:39:59 -0800739
740/**
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530741 * tfa_ioctl_bitmask() - API to get supported IOCTL ID mask.
742 * @bit_mask: Returned bit mask of supported IOCTL IDs.
743 *
744 * Return: 0 success, negative value for errors.
745 *
Ronak Jain325bad12021-12-21 01:39:59 -0800746 */
Prasad Kummarie0783112023-04-26 11:02:07 +0530747enum pm_ret_status tfa_ioctl_bitmask(uint32_t *bit_mask)
Ronak Jain325bad12021-12-21 01:39:59 -0800748{
749 uint8_t supported_ids[] = {
750 IOCTL_GET_RPU_OPER_MODE,
751 IOCTL_SET_RPU_OPER_MODE,
752 IOCTL_RPU_BOOT_ADDR_CONFIG,
753 IOCTL_TCM_COMB_CONFIG,
754 IOCTL_SET_TAPDELAY_BYPASS,
755 IOCTL_SET_SGMII_MODE,
756 IOCTL_SD_DLL_RESET,
757 IOCTL_SET_SD_TAPDELAY,
758 IOCTL_SET_PLL_FRAC_MODE,
759 IOCTL_GET_PLL_FRAC_MODE,
760 IOCTL_SET_PLL_FRAC_DATA,
761 IOCTL_GET_PLL_FRAC_DATA,
762 IOCTL_WRITE_GGS,
763 IOCTL_READ_GGS,
764 IOCTL_WRITE_PGGS,
765 IOCTL_READ_PGGS,
766 IOCTL_ULPI_RESET,
767 IOCTL_SET_BOOT_HEALTH_STATUS,
768 IOCTL_AFI,
769 };
770 uint8_t i, ioctl_id;
Venkatesh Yadav Abbarapue7c45382022-05-19 14:49:49 +0530771 int32_t ret;
Ronak Jain325bad12021-12-21 01:39:59 -0800772
773 for (i = 0U; i < ARRAY_SIZE(supported_ids); i++) {
774 ioctl_id = supported_ids[i];
775 if (ioctl_id >= 64U) {
776 return PM_RET_ERROR_NOTSUPPORTED;
777 }
778 ret = check_api_dependency(ioctl_id);
779 if (ret == PM_RET_SUCCESS) {
HariBabu Gattemb0c70f52022-09-29 23:59:11 -0700780 bit_mask[ioctl_id / 32U] |= BIT(ioctl_id % 32U);
Ronak Jain325bad12021-12-21 01:39:59 -0800781 }
782 }
783
784 return PM_RET_SUCCESS;
785}