blob: dd21499698af0646899bdbefacad9c921dc0f333 [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_sd_dll_reset() - Reset DLL logic.
178 * @nid: Node ID of the device.
179 * @type: Reset type.
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800180 *
181 * This function resets DLL logic for the SD device.
182 *
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530183 * Return: Returns status, either success or error+reason.
184 *
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800185 */
186static enum pm_ret_status pm_ioctl_sd_dll_reset(enum pm_node_id nid,
Venkatesh Yadav Abbarapue7c45382022-05-19 14:49:49 +0530187 uint32_t type)
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800188{
Venkatesh Yadav Abbarapue7c45382022-05-19 14:49:49 +0530189 uint32_t mask, val;
Jolly Shah69fb5bf2018-02-07 16:25:41 -0800190 enum pm_ret_status ret;
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800191
192 if (nid == NODE_SD_0) {
193 mask = ZYNQMP_SD0_DLL_RST_MASK;
194 val = ZYNQMP_SD0_DLL_RST;
195 } else if (nid == NODE_SD_1) {
196 mask = ZYNQMP_SD1_DLL_RST_MASK;
197 val = ZYNQMP_SD1_DLL_RST;
198 } else {
199 return PM_RET_ERROR_ARGS;
200 }
201
202 switch (type) {
203 case PM_DLL_RESET_ASSERT:
204 case PM_DLL_RESET_PULSE:
205 ret = pm_mmio_write(ZYNQMP_SD_DLL_CTRL, mask, val);
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530206 if (ret != PM_RET_SUCCESS) {
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800207 return ret;
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530208 }
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800209
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530210 if (type == PM_DLL_RESET_ASSERT) {
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800211 break;
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530212 }
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800213 mdelay(1);
Daniel Boulby8942a1b2018-06-22 14:16:03 +0100214 /* Fallthrough */
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800215 case PM_DLL_RESET_RELEASE:
216 ret = pm_mmio_write(ZYNQMP_SD_DLL_CTRL, mask, 0);
217 break;
218 default:
219 ret = PM_RET_ERROR_ARGS;
Jolly Shah69fb5bf2018-02-07 16:25:41 -0800220 break;
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800221 }
222
223 return ret;
224}
225
226/**
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530227 * pm_ioctl_sd_set_tapdelay() - Set tap delay for the SD device.
228 * @nid: Node ID of the device.
229 * @type: Type of tap delay to set (input/output).
230 * @value: Value to set fot the tap delay.
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800231 *
232 * This function sets input/output tap delay for the SD device.
233 *
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530234 * Return: Returns status, either success or error+reason.
235 *
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800236 */
237static enum pm_ret_status pm_ioctl_sd_set_tapdelay(enum pm_node_id nid,
238 enum tap_delay_type type,
Venkatesh Yadav Abbarapue7c45382022-05-19 14:49:49 +0530239 uint32_t value)
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800240{
Venkatesh Yadav Abbarapue7c45382022-05-19 14:49:49 +0530241 uint32_t shift;
Jolly Shah69fb5bf2018-02-07 16:25:41 -0800242 enum pm_ret_status ret;
Venkatesh Yadav Abbarapue7c45382022-05-19 14:49:49 +0530243 uint32_t val, mask;
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800244
Sai Krishna Potthuriad48c502020-10-20 07:00:06 -0600245 if (nid == NODE_SD_0) {
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800246 shift = 0;
Sai Krishna Potthuriad48c502020-10-20 07:00:06 -0600247 mask = ZYNQMP_SD0_DLL_RST_MASK;
248 } else if (nid == NODE_SD_1) {
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800249 shift = ZYNQMP_SD_TAP_OFFSET;
Sai Krishna Potthuriad48c502020-10-20 07:00:06 -0600250 mask = ZYNQMP_SD1_DLL_RST_MASK;
251 } else {
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800252 return PM_RET_ERROR_ARGS;
Sai Krishna Potthuriad48c502020-10-20 07:00:06 -0600253 }
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800254
Sai Krishna Potthuriad48c502020-10-20 07:00:06 -0600255 ret = pm_mmio_read(ZYNQMP_SD_DLL_CTRL, &val);
256 if (ret != PM_RET_SUCCESS) {
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800257 return ret;
Sai Krishna Potthuriad48c502020-10-20 07:00:06 -0600258 }
259
Venkatesh Yadav Abbarapua2ca35d2022-07-04 11:40:27 +0530260 if ((val & mask) == 0U) {
Sai Krishna Potthuriad48c502020-10-20 07:00:06 -0600261 ret = pm_ioctl_sd_dll_reset(nid, PM_DLL_RESET_ASSERT);
262 if (ret != PM_RET_SUCCESS) {
263 return ret;
264 }
265 }
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800266
267 if (type == PM_TAPDELAY_INPUT) {
268 ret = pm_mmio_write(ZYNQMP_SD_ITAP_DLY,
Jolly Shah69fb5bf2018-02-07 16:25:41 -0800269 (ZYNQMP_SD_ITAPCHGWIN_MASK << shift),
270 (ZYNQMP_SD_ITAPCHGWIN << shift));
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530271
272 if (ret != PM_RET_SUCCESS) {
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800273 goto reset_release;
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530274 }
275
Venkatesh Yadav Abbarapua2ca35d2022-07-04 11:40:27 +0530276 if (value == 0U) {
Sai Krishna Potthuri15da5822020-10-30 00:09:43 -0600277 ret = pm_mmio_write(ZYNQMP_SD_ITAP_DLY,
278 (ZYNQMP_SD_ITAPDLYENA_MASK <<
279 shift), 0);
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530280 } else {
Sai Krishna Potthuri15da5822020-10-30 00:09:43 -0600281 ret = pm_mmio_write(ZYNQMP_SD_ITAP_DLY,
282 (ZYNQMP_SD_ITAPDLYENA_MASK <<
283 shift), (ZYNQMP_SD_ITAPDLYENA <<
284 shift));
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530285 }
286
287 if (ret != PM_RET_SUCCESS) {
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800288 goto reset_release;
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530289 }
290
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800291 ret = pm_mmio_write(ZYNQMP_SD_ITAP_DLY,
Jolly Shah69fb5bf2018-02-07 16:25:41 -0800292 (ZYNQMP_SD_ITAPDLYSEL_MASK << shift),
293 (value << shift));
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530294
295 if (ret != PM_RET_SUCCESS) {
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800296 goto reset_release;
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530297 }
298
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800299 ret = pm_mmio_write(ZYNQMP_SD_ITAP_DLY,
Jolly Shah69fb5bf2018-02-07 16:25:41 -0800300 (ZYNQMP_SD_ITAPCHGWIN_MASK << shift), 0);
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800301 } else if (type == PM_TAPDELAY_OUTPUT) {
302 ret = pm_mmio_write(ZYNQMP_SD_OTAP_DLY,
Sai Krishna Potthuri15da5822020-10-30 00:09:43 -0600303 (ZYNQMP_SD_OTAPDLYENA_MASK << shift), 0);
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530304
305 if (ret != PM_RET_SUCCESS) {
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800306 goto reset_release;
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530307 }
308
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800309 ret = pm_mmio_write(ZYNQMP_SD_OTAP_DLY,
Jolly Shah69fb5bf2018-02-07 16:25:41 -0800310 (ZYNQMP_SD_OTAPDLYSEL_MASK << shift),
311 (value << shift));
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800312 } else {
313 ret = PM_RET_ERROR_ARGS;
314 }
315
316reset_release:
Sai Krishna Potthuriad48c502020-10-20 07:00:06 -0600317 if ((val & mask) == 0) {
318 (void)pm_ioctl_sd_dll_reset(nid, PM_DLL_RESET_RELEASE);
319 }
320
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800321 return ret;
322}
323
324/**
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530325 * pm_ioctl_set_pll_frac_mode() - Ioctl function for setting pll mode.
326 * @pll: PLL clock id.
327 * @mode: Mode fraction/integar.
328 *
329 * This function sets PLL mode.
Rajan Vaja35116132018-01-17 02:39:25 -0800330 *
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530331 * Return: Returns status, either success or error+reason.
Rajan Vaja35116132018-01-17 02:39:25 -0800332 *
Rajan Vaja35116132018-01-17 02:39:25 -0800333 */
334static enum pm_ret_status pm_ioctl_set_pll_frac_mode
Venkatesh Yadav Abbarapue7c45382022-05-19 14:49:49 +0530335 (uint32_t pll, uint32_t mode)
Rajan Vaja35116132018-01-17 02:39:25 -0800336{
Jolly Shahcb5bc752019-01-02 12:46:46 -0800337 return pm_clock_set_pll_mode(pll, mode);
Rajan Vaja35116132018-01-17 02:39:25 -0800338}
339
340/**
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530341 * pm_ioctl_get_pll_frac_mode() - Ioctl function for getting pll mode.
342 * @pll: PLL clock id.
343 * @mode: Mode fraction/integar.
Rajan Vaja35116132018-01-17 02:39:25 -0800344 *
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530345 * This function return current PLL mode.
Rajan Vaja35116132018-01-17 02:39:25 -0800346 *
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530347 * Return: Returns status, either success or error+reason.
348 *
Rajan Vaja35116132018-01-17 02:39:25 -0800349 */
350static enum pm_ret_status pm_ioctl_get_pll_frac_mode
Venkatesh Yadav Abbarapue7c45382022-05-19 14:49:49 +0530351 (uint32_t pll, uint32_t *mode)
Rajan Vaja35116132018-01-17 02:39:25 -0800352{
Jolly Shah77eb52f2019-01-02 12:49:21 -0800353 return pm_clock_get_pll_mode(pll, mode);
Rajan Vaja35116132018-01-17 02:39:25 -0800354}
355
356/**
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530357 * pm_ioctl_set_pll_frac_data() - Ioctl function for setting pll fraction data.
358 * @pll: PLL clock id.
359 * @data: fraction data.
Rajan Vaja35116132018-01-17 02:39:25 -0800360 *
361 * This function sets fraction data.
362 * It is valid for fraction mode only.
363 *
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530364 * Return: Returns status, either success or error+reason.
365 *
Rajan Vaja35116132018-01-17 02:39:25 -0800366 */
367static enum pm_ret_status pm_ioctl_set_pll_frac_data
Venkatesh Yadav Abbarapue7c45382022-05-19 14:49:49 +0530368 (uint32_t pll, uint32_t data)
Rajan Vaja35116132018-01-17 02:39:25 -0800369{
Jolly Shah68116ef2019-01-02 12:42:56 -0800370 enum pm_node_id pll_nid;
371 enum pm_ret_status status;
372
373 /* Get PLL node ID using PLL clock ID */
374 status = pm_clock_get_pll_node_id(pll, &pll_nid);
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530375 if (status != PM_RET_SUCCESS) {
Jolly Shah68116ef2019-01-02 12:42:56 -0800376 return status;
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530377 }
Jolly Shah68116ef2019-01-02 12:42:56 -0800378
379 return pm_pll_set_parameter(pll_nid, PM_PLL_PARAM_DATA, data);
Rajan Vaja35116132018-01-17 02:39:25 -0800380}
381
382/**
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530383 * pm_ioctl_get_pll_frac_data() - Ioctl function for getting pll fraction data.
384 * @pll: PLL clock id.
385 * @data: fraction data.
Rajan Vaja35116132018-01-17 02:39:25 -0800386 *
387 * This function returns fraction data value.
388 *
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530389 * Return: Returns status, either success or error+reason.
390 *
Rajan Vaja35116132018-01-17 02:39:25 -0800391 */
392static enum pm_ret_status pm_ioctl_get_pll_frac_data
Venkatesh Yadav Abbarapue7c45382022-05-19 14:49:49 +0530393 (uint32_t pll, uint32_t *data)
Rajan Vaja35116132018-01-17 02:39:25 -0800394{
Jolly Shahb4c99462019-01-02 12:40:17 -0800395 enum pm_node_id pll_nid;
396 enum pm_ret_status status;
397
398 /* Get PLL node ID using PLL clock ID */
399 status = pm_clock_get_pll_node_id(pll, &pll_nid);
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530400 if (status != PM_RET_SUCCESS) {
Jolly Shahb4c99462019-01-02 12:40:17 -0800401 return status;
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530402 }
Jolly Shahb4c99462019-01-02 12:40:17 -0800403
404 return pm_pll_get_parameter(pll_nid, PM_PLL_PARAM_DATA, data);
Rajan Vaja35116132018-01-17 02:39:25 -0800405}
406
407/**
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530408 * pm_ioctl_write_ggs() - Ioctl function for writing global general storage
409 * (ggs).
410 * @index: GGS register index.
411 * @value: Register value to be written.
Rajan Vaja393c0a22018-01-17 02:39:27 -0800412 *
413 * This function writes value to GGS register.
414 *
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530415 * Return: Returns status, either success or error+reason.
416 *
Rajan Vaja393c0a22018-01-17 02:39:27 -0800417 */
Venkatesh Yadav Abbarapue7c45382022-05-19 14:49:49 +0530418static enum pm_ret_status pm_ioctl_write_ggs(uint32_t index,
419 uint32_t value)
Rajan Vaja393c0a22018-01-17 02:39:27 -0800420{
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530421 if (index >= GGS_NUM_REGS) {
Rajan Vaja393c0a22018-01-17 02:39:27 -0800422 return PM_RET_ERROR_ARGS;
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530423 }
Rajan Vaja393c0a22018-01-17 02:39:27 -0800424
Jolly Shah69fb5bf2018-02-07 16:25:41 -0800425 return pm_mmio_write(GGS_BASEADDR + (index << 2),
426 0xFFFFFFFFU, value);
Rajan Vaja393c0a22018-01-17 02:39:27 -0800427}
428
429/**
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530430 * pm_ioctl_read_ggs() - Ioctl function for reading global general storage
431 * (ggs).
432 * @index: GGS register index.
433 * @value: Register value.
Rajan Vaja393c0a22018-01-17 02:39:27 -0800434 *
435 * This function returns GGS register value.
436 *
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530437 * Return: Returns status, either success or error+reason.
438 *
Rajan Vaja393c0a22018-01-17 02:39:27 -0800439 */
Venkatesh Yadav Abbarapue7c45382022-05-19 14:49:49 +0530440static enum pm_ret_status pm_ioctl_read_ggs(uint32_t index,
441 uint32_t *value)
Rajan Vaja393c0a22018-01-17 02:39:27 -0800442{
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530443 if (index >= GGS_NUM_REGS) {
Rajan Vaja393c0a22018-01-17 02:39:27 -0800444 return PM_RET_ERROR_ARGS;
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530445 }
Rajan Vaja393c0a22018-01-17 02:39:27 -0800446
447 return pm_mmio_read(GGS_BASEADDR + (index << 2), value);
448}
449
450/**
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530451 * pm_ioctl_write_pggs() - Ioctl function for writing persistent global general
452 * storage (pggs).
453 * @index: PGGS register index.
454 * @value: Register value to be written.
Rajan Vaja393c0a22018-01-17 02:39:27 -0800455 *
456 * This function writes value to PGGS register.
457 *
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530458 * Return: Returns status, either success or error+reason.
459 *
Rajan Vaja393c0a22018-01-17 02:39:27 -0800460 */
Venkatesh Yadav Abbarapue7c45382022-05-19 14:49:49 +0530461static enum pm_ret_status pm_ioctl_write_pggs(uint32_t index,
462 uint32_t value)
Rajan Vaja393c0a22018-01-17 02:39:27 -0800463{
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530464 if (index >= PGGS_NUM_REGS) {
Rajan Vaja393c0a22018-01-17 02:39:27 -0800465 return PM_RET_ERROR_ARGS;
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530466 }
Rajan Vaja393c0a22018-01-17 02:39:27 -0800467
Jolly Shah69fb5bf2018-02-07 16:25:41 -0800468 return pm_mmio_write(PGGS_BASEADDR + (index << 2),
469 0xFFFFFFFFU, value);
Rajan Vaja393c0a22018-01-17 02:39:27 -0800470}
471
472/**
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530473 * pm_ioctl_afi() - Ioctl function for writing afi values.
474 * @index: AFI register index.
475 * @value: Register value to be written.
Siva Durga Prasad Paladugua22b8852018-09-04 17:27:12 +0530476 *
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530477 * Return: Returns status, either success or error+reason.
Siva Durga Prasad Paladugua22b8852018-09-04 17:27:12 +0530478 *
Siva Durga Prasad Paladugua22b8852018-09-04 17:27:12 +0530479 */
Venkatesh Yadav Abbarapue7c45382022-05-19 14:49:49 +0530480static enum pm_ret_status pm_ioctl_afi(uint32_t index,
481 uint32_t value)
Siva Durga Prasad Paladugua22b8852018-09-04 17:27:12 +0530482{
Venkatesh Yadav Abbarapue7c45382022-05-19 14:49:49 +0530483 uint32_t mask;
484 uint32_t regarr[] = {0xFD360000U,
Venkatesh Yadav Abbarapued4f1e82022-04-29 09:58:30 +0530485 0xFD360014U,
486 0xFD370000U,
487 0xFD370014U,
488 0xFD380000U,
489 0xFD380014U,
490 0xFD390000U,
491 0xFD390014U,
492 0xFD3a0000U,
493 0xFD3a0014U,
494 0xFD3b0000U,
495 0xFD3b0014U,
496 0xFF9b0000U,
497 0xFF9b0014U,
498 0xFD615000U,
499 0xFF419000U,
Siva Durga Prasad Paladugua22b8852018-09-04 17:27:12 +0530500 };
501
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530502 if (index >= ARRAY_SIZE(regarr)) {
Siva Durga Prasad Paladugua22b8852018-09-04 17:27:12 +0530503 return PM_RET_ERROR_ARGS;
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530504 }
Siva Durga Prasad Paladugua22b8852018-09-04 17:27:12 +0530505
Akshay Belsareaf00b312022-08-23 11:39:35 +0530506 if (index <= AFIFM6_WRCTRL) {
Siva Durga Prasad Paladugua22b8852018-09-04 17:27:12 +0530507 mask = FABRIC_WIDTH;
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530508 } else {
Siva Durga Prasad Paladugua22b8852018-09-04 17:27:12 +0530509 mask = 0xf00;
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530510 }
Siva Durga Prasad Paladugua22b8852018-09-04 17:27:12 +0530511
512 return pm_mmio_write(regarr[index], mask, value);
513}
514
515/**
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530516 * pm_ioctl_read_pggs() - Ioctl function for reading persistent global general
517 * storage (pggs).
518 * @index: PGGS register index.
519 * @value: Register value.
Rajan Vaja393c0a22018-01-17 02:39:27 -0800520 *
521 * This function returns PGGS register value.
522 *
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530523 * Return: Returns status, either success or error+reason.
524 *
Rajan Vaja393c0a22018-01-17 02:39:27 -0800525 */
Venkatesh Yadav Abbarapue7c45382022-05-19 14:49:49 +0530526static enum pm_ret_status pm_ioctl_read_pggs(uint32_t index,
527 uint32_t *value)
Rajan Vaja393c0a22018-01-17 02:39:27 -0800528{
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530529 if (index >= PGGS_NUM_REGS) {
Rajan Vaja393c0a22018-01-17 02:39:27 -0800530 return PM_RET_ERROR_ARGS;
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530531 }
Rajan Vaja393c0a22018-01-17 02:39:27 -0800532
533 return pm_mmio_read(PGGS_BASEADDR + (index << 2), value);
534}
535
536/**
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530537 * pm_ioctl_ulpi_reset() - Ioctl function for performing ULPI reset.
538 *
539 * Return: Returns status, either success or error+reason.
Siva Durga Prasad Paladugued1d5cb2018-09-04 17:03:25 +0530540 *
541 * This function peerforms the ULPI reset sequence for resetting
542 * the ULPI transceiver.
Siva Durga Prasad Paladugued1d5cb2018-09-04 17:03:25 +0530543 */
544static enum pm_ret_status pm_ioctl_ulpi_reset(void)
545{
546 enum pm_ret_status ret;
547
548 ret = pm_mmio_write(CRL_APB_BOOT_PIN_CTRL, CRL_APB_BOOT_PIN_MASK,
549 ZYNQMP_ULPI_RESET_VAL_HIGH);
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530550 if (ret != PM_RET_SUCCESS) {
Siva Durga Prasad Paladugued1d5cb2018-09-04 17:03:25 +0530551 return ret;
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530552 }
Siva Durga Prasad Paladugued1d5cb2018-09-04 17:03:25 +0530553
554 /* Drive ULPI assert for atleast 1ms */
555 mdelay(1);
556
557 ret = pm_mmio_write(CRL_APB_BOOT_PIN_CTRL, CRL_APB_BOOT_PIN_MASK,
558 ZYNQMP_ULPI_RESET_VAL_LOW);
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530559 if (ret != PM_RET_SUCCESS) {
Siva Durga Prasad Paladugued1d5cb2018-09-04 17:03:25 +0530560 return ret;
Venkatesh Yadav Abbarapu987fad32022-04-29 13:52:00 +0530561 }
Siva Durga Prasad Paladugued1d5cb2018-09-04 17:03:25 +0530562
563 /* Drive ULPI de-assert for atleast 1ms */
564 mdelay(1);
565
566 ret = pm_mmio_write(CRL_APB_BOOT_PIN_CTRL, CRL_APB_BOOT_PIN_MASK,
567 ZYNQMP_ULPI_RESET_VAL_HIGH);
568
569 return ret;
570}
571
572/**
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530573 * pm_ioctl_set_boot_health_status() - Ioctl for setting healthy boot status.
574 * @value: Value to write.
Siva Durga Prasad Paladuguac8526f2018-09-04 17:12:51 +0530575 *
576 * This function sets healthy bit value to indicate boot health status
577 * to firmware.
578 *
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530579 * Return: Returns status, either success or error+reason.
580 *
Siva Durga Prasad Paladuguac8526f2018-09-04 17:12:51 +0530581 */
Venkatesh Yadav Abbarapue7c45382022-05-19 14:49:49 +0530582static enum pm_ret_status pm_ioctl_set_boot_health_status(uint32_t value)
Siva Durga Prasad Paladuguac8526f2018-09-04 17:12:51 +0530583{
Tejas Patel6552a552020-11-22 23:37:55 -0800584 return pm_mmio_write(PMU_GLOBAL_GEN_STORAGE4,
Siva Durga Prasad Paladuguac8526f2018-09-04 17:12:51 +0530585 PM_BOOT_HEALTH_STATUS_MASK, value);
586}
587
588/**
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530589 * pm_api_ioctl() - PM IOCTL API for device control and configs.
590 * @nid: Node ID of the device.
591 * @ioctl_id: ID of the requested IOCTL.
592 * @arg1: Argument 1 to requested IOCTL call.
593 * @arg2: Argument 2 to requested IOCTL call.
594 * @value: Returned output value.
Rajan Vaja5529a012018-01-17 02:39:23 -0800595 *
596 * This function calls IOCTL to firmware for device control and configuration.
597 *
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530598 * Return: Returns status, either success or error+reason.
599 *
Rajan Vaja5529a012018-01-17 02:39:23 -0800600 */
601enum pm_ret_status pm_api_ioctl(enum pm_node_id nid,
Venkatesh Yadav Abbarapue7c45382022-05-19 14:49:49 +0530602 uint32_t ioctl_id,
603 uint32_t arg1,
604 uint32_t arg2,
605 uint32_t *value)
Rajan Vaja5529a012018-01-17 02:39:23 -0800606{
Jolly Shah69fb5bf2018-02-07 16:25:41 -0800607 enum pm_ret_status ret;
Rajan Vaja0c0615a2021-10-12 03:30:09 -0700608 uint32_t payload[PAYLOAD_ARG_CNT];
Rajan Vaja5529a012018-01-17 02:39:23 -0800609
610 switch (ioctl_id) {
611 case IOCTL_GET_RPU_OPER_MODE:
612 ret = pm_ioctl_get_rpu_oper_mode(value);
613 break;
614 case IOCTL_SET_RPU_OPER_MODE:
615 ret = pm_ioctl_set_rpu_oper_mode(arg1);
616 break;
617 case IOCTL_RPU_BOOT_ADDR_CONFIG:
618 ret = pm_ioctl_config_boot_addr(nid, arg1);
619 break;
620 case IOCTL_TCM_COMB_CONFIG:
621 ret = pm_ioctl_config_tcm_comb(arg1);
622 break;
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800623 case IOCTL_SET_TAPDELAY_BYPASS:
624 ret = pm_ioctl_set_tapdelay_bypass(arg1, arg2);
625 break;
Rajan Vajaaea41bb2018-01-17 02:39:24 -0800626 case IOCTL_SD_DLL_RESET:
627 ret = pm_ioctl_sd_dll_reset(nid, arg1);
628 break;
629 case IOCTL_SET_SD_TAPDELAY:
630 ret = pm_ioctl_sd_set_tapdelay(nid, arg1, arg2);
631 break;
Rajan Vaja35116132018-01-17 02:39:25 -0800632 case IOCTL_SET_PLL_FRAC_MODE:
633 ret = pm_ioctl_set_pll_frac_mode(arg1, arg2);
634 break;
635 case IOCTL_GET_PLL_FRAC_MODE:
636 ret = pm_ioctl_get_pll_frac_mode(arg1, value);
637 break;
638 case IOCTL_SET_PLL_FRAC_DATA:
639 ret = pm_ioctl_set_pll_frac_data(arg1, arg2);
640 break;
641 case IOCTL_GET_PLL_FRAC_DATA:
642 ret = pm_ioctl_get_pll_frac_data(arg1, value);
643 break;
Rajan Vaja393c0a22018-01-17 02:39:27 -0800644 case IOCTL_WRITE_GGS:
645 ret = pm_ioctl_write_ggs(arg1, arg2);
646 break;
647 case IOCTL_READ_GGS:
648 ret = pm_ioctl_read_ggs(arg1, value);
649 break;
650 case IOCTL_WRITE_PGGS:
651 ret = pm_ioctl_write_pggs(arg1, arg2);
652 break;
653 case IOCTL_READ_PGGS:
654 ret = pm_ioctl_read_pggs(arg1, value);
655 break;
Siva Durga Prasad Paladugued1d5cb2018-09-04 17:03:25 +0530656 case IOCTL_ULPI_RESET:
657 ret = pm_ioctl_ulpi_reset();
658 break;
Siva Durga Prasad Paladuguac8526f2018-09-04 17:12:51 +0530659 case IOCTL_SET_BOOT_HEALTH_STATUS:
660 ret = pm_ioctl_set_boot_health_status(arg1);
661 break;
Siva Durga Prasad Paladugua22b8852018-09-04 17:27:12 +0530662 case IOCTL_AFI:
663 ret = pm_ioctl_afi(arg1, arg2);
664 break;
Rajan Vaja5529a012018-01-17 02:39:23 -0800665 default:
Rajan Vaja0c0615a2021-10-12 03:30:09 -0700666 /* Send request to the PMU */
667 PM_PACK_PAYLOAD5(payload, PM_IOCTL, nid, ioctl_id, arg1, arg2);
668
669 ret = pm_ipi_send_sync(primary_proc, payload, value, 1);
Jolly Shah69fb5bf2018-02-07 16:25:41 -0800670 break;
Rajan Vaja5529a012018-01-17 02:39:23 -0800671 }
672
673 return ret;
674}
Ronak Jain325bad12021-12-21 01:39:59 -0800675
676/**
Prasad Kummari7d0623a2023-06-09 14:32:00 +0530677 * tfa_ioctl_bitmask() - API to get supported IOCTL ID mask.
678 * @bit_mask: Returned bit mask of supported IOCTL IDs.
679 *
680 * Return: 0 success, negative value for errors.
681 *
Ronak Jain325bad12021-12-21 01:39:59 -0800682 */
Prasad Kummarie0783112023-04-26 11:02:07 +0530683enum pm_ret_status tfa_ioctl_bitmask(uint32_t *bit_mask)
Ronak Jain325bad12021-12-21 01:39:59 -0800684{
685 uint8_t supported_ids[] = {
686 IOCTL_GET_RPU_OPER_MODE,
687 IOCTL_SET_RPU_OPER_MODE,
688 IOCTL_RPU_BOOT_ADDR_CONFIG,
689 IOCTL_TCM_COMB_CONFIG,
690 IOCTL_SET_TAPDELAY_BYPASS,
Ronak Jain325bad12021-12-21 01:39:59 -0800691 IOCTL_SD_DLL_RESET,
692 IOCTL_SET_SD_TAPDELAY,
693 IOCTL_SET_PLL_FRAC_MODE,
694 IOCTL_GET_PLL_FRAC_MODE,
695 IOCTL_SET_PLL_FRAC_DATA,
696 IOCTL_GET_PLL_FRAC_DATA,
697 IOCTL_WRITE_GGS,
698 IOCTL_READ_GGS,
699 IOCTL_WRITE_PGGS,
700 IOCTL_READ_PGGS,
701 IOCTL_ULPI_RESET,
702 IOCTL_SET_BOOT_HEALTH_STATUS,
703 IOCTL_AFI,
704 };
705 uint8_t i, ioctl_id;
Venkatesh Yadav Abbarapue7c45382022-05-19 14:49:49 +0530706 int32_t ret;
Ronak Jain325bad12021-12-21 01:39:59 -0800707
708 for (i = 0U; i < ARRAY_SIZE(supported_ids); i++) {
709 ioctl_id = supported_ids[i];
710 if (ioctl_id >= 64U) {
711 return PM_RET_ERROR_NOTSUPPORTED;
712 }
713 ret = check_api_dependency(ioctl_id);
714 if (ret == PM_RET_SUCCESS) {
HariBabu Gattemb0c70f52022-09-29 23:59:11 -0700715 bit_mask[ioctl_id / 32U] |= BIT(ioctl_id % 32U);
Ronak Jain325bad12021-12-21 01:39:59 -0800716 }
717 }
718
719 return PM_RET_SUCCESS;
720}