blob: 66ec3c5a27f6d2e0cd8a1c7c6c4d5454b2cbcfd3 [file] [log] [blame]
Kevin Scholz3bb3f262019-10-07 19:26:36 +05301/* SPDX-License-Identifier: BSD-3-Clause */
2/**********************************************************************
3 * Copyright (C) 2012-2019 Cadence Design Systems, Inc.
4 **********************************************************************
5 * WARNING: This file is auto-generated using api-generator utility.
6 * api-generator: 12.02.13bb8d5
7 * Do not edit it manually.
8 **********************************************************************
9 * Cadence Core Driver for LPDDR4.
10 **********************************************************************
11 */
12
13#ifndef LPDDR4_IF_H
14#define LPDDR4_IF_H
15
16#include <linux/types.h>
17
18/** @defgroup ConfigInfo Configuration and Hardware Operation Information
19 * The following definitions specify the driver operation environment that
20 * is defined by hardware configuration or client code. These defines are
21 * located in the header file of the core driver.
22 * @{
23 */
24
25/**********************************************************************
26* Defines
27**********************************************************************/
28/** Number of chip-selects */
29#define LPDDR4_MAX_CS (2U)
30
31/** Number of accessible registers for controller. */
32#define LPDDR4_CTL_REG_COUNT (459U)
33
34/** Number of accessible registers for PHY Independent Module. */
35#define LPDDR4_PHY_INDEP_REG_COUNT (300U)
36
37/** Number of accessible registers for PHY. */
38#define LPDDR4_PHY_REG_COUNT (1423U)
39
40/**
41 * @}
42 */
43
44/** @defgroup DataStructure Dynamic Data Structures
45 * This section defines the data structures used by the driver to provide
46 * hardware information, modification and dynamic operation of the driver.
47 * These data structures are defined in the header file of the core driver
48 * and utilized by the API.
49 * @{
50 */
51
52/**********************************************************************
53* Forward declarations
54**********************************************************************/
55typedef struct lpddr4_config_s lpddr4_config;
56typedef struct lpddr4_privatedata_s lpddr4_privatedata;
57typedef struct lpddr4_debuginfo_s lpddr4_debuginfo;
58typedef struct lpddr4_fspmoderegs_s lpddr4_fspmoderegs;
59typedef struct lpddr4_reginitdata_s lpddr4_reginitdata;
60
61/**********************************************************************
62* Enumerations
63**********************************************************************/
64/** This is used to indicate whether the Controller, PHY, or PHY Independent module is addressed. */
65typedef enum
66{
67 LPDDR4_CTL_REGS = 0U,
68 LPDDR4_PHY_REGS = 1U,
69 LPDDR4_PHY_INDEP_REGS = 2U
70} lpddr4_regblock;
71
72/** Controller status or error interrupts. */
73typedef enum
74{
75 LPDDR4_RESET_DONE = 0U,
76 LPDDR4_BUS_ACCESS_ERROR = 1U,
77 LPDDR4_MULTIPLE_BUS_ACCESS_ERROR = 2U,
78 LPDDR4_ECC_MULTIPLE_CORR_ERROR = 3U,
79 LPDDR4_ECC_MULTIPLE_UNCORR_ERROR = 4U,
80 LPDDR4_ECC_WRITEBACK_EXEC_ERROR = 5U,
81 LPDDR4_ECC_SCRUB_DONE = 6U,
82 LPDDR4_ECC_SCRUB_ERROR = 7U,
83 LPDDR4_PORT_COMMAND_ERROR = 8U,
84 LPDDR4_MC_INIT_DONE = 9U,
85 LPDDR4_LP_DONE = 10U,
86 LPDDR4_BIST_DONE = 11U,
87 LPDDR4_WRAP_ERROR = 12U,
88 LPDDR4_INVALID_BURST_ERROR = 13U,
89 LPDDR4_RDLVL_ERROR = 14U,
90 LPDDR4_RDLVL_GATE_ERROR = 15U,
91 LPDDR4_WRLVL_ERROR = 16U,
92 LPDDR4_CA_TRAINING_ERROR = 17U,
93 LPDDR4_DFI_UPDATE_ERROR = 18U,
94 LPDDR4_MRR_ERROR = 19U,
95 LPDDR4_PHY_MASTER_ERROR = 20U,
96 LPDDR4_WRLVL_REQ = 21U,
97 LPDDR4_RDLVL_REQ = 22U,
98 LPDDR4_RDLVL_GATE_REQ = 23U,
99 LPDDR4_CA_TRAINING_REQ = 24U,
100 LPDDR4_LEVELING_DONE = 25U,
101 LPDDR4_PHY_ERROR = 26U,
102 LPDDR4_MR_READ_DONE = 27U,
103 LPDDR4_TEMP_CHANGE = 28U,
104 LPDDR4_TEMP_ALERT = 29U,
105 LPDDR4_SW_DQS_COMPLETE = 30U,
106 LPDDR4_DQS_OSC_BV_UPDATED = 31U,
107 LPDDR4_DQS_OSC_OVERFLOW = 32U,
108 LPDDR4_DQS_OSC_VAR_OUT = 33U,
109 LPDDR4_MR_WRITE_DONE = 34U,
110 LPDDR4_INHIBIT_DRAM_DONE = 35U,
111 LPDDR4_DFI_INIT_STATE = 36U,
112 LPDDR4_DLL_RESYNC_DONE = 37U,
113 LPDDR4_TDFI_TO = 38U,
114 LPDDR4_DFS_DONE = 39U,
115 LPDDR4_DFS_STATUS = 40U,
116 LPDDR4_REFRESH_STATUS = 41U,
117 LPDDR4_ZQ_STATUS = 42U,
118 LPDDR4_SW_REQ_MODE = 43U,
119 LPDDR4_LOR_BITS = 44U
120} lpddr4_ctlinterrupt;
121
122/** PHY Independent Module status or error interrupts. */
123typedef enum
124{
125 LPDDR4_PHY_INDEP_INIT_DONE_BIT = 0U,
126 LPDDR4_PHY_INDEP_CONTROL_ERROR_BIT = 1U,
127 LPDDR4_PHY_INDEP_CA_PARITY_ERR_BIT = 2U,
128 LPDDR4_PHY_INDEP_RDLVL_ERROR_BIT = 3U,
129 LPDDR4_PHY_INDEP_RDLVL_GATE_ERROR_BIT = 4U,
130 LPDDR4_PHY_INDEP_WRLVL_ERROR_BIT = 5U,
131 LPDDR4_PHY_INDEP_CALVL_ERROR_BIT = 6U,
132 LPDDR4_PHY_INDEP_WDQLVL_ERROR_BIT = 7U,
133 LPDDR4_PHY_INDEP_UPDATE_ERROR_BIT = 8U,
134 LPDDR4_PHY_INDEP_RDLVL_REQ_BIT = 9U,
135 LPDDR4_PHY_INDEP_RDLVL_GATE_REQ_BIT = 10U,
136 LPDDR4_PHY_INDEP_WRLVL_REQ_BIT = 11U,
137 LPDDR4_PHY_INDEP_CALVL_REQ_BIT = 12U,
138 LPDDR4_PHY_INDEP_WDQLVL_REQ_BIT = 13U,
139 LPDDR4_PHY_INDEP_LVL_DONE_BIT = 14U,
140 LPDDR4_PHY_INDEP_BIST_DONE_BIT = 15U,
141 LPDDR4_PHY_INDEP_TDFI_INIT_TIME_OUT_BIT = 16U,
142 LPDDR4_PHY_INDEP_DLL_LOCK_STATE_CHANGE_BIT = 17U
143} lpddr4_phyindepinterrupt;
144
145/** List of informations and warnings from driver. */
146typedef enum
147{
148 LPDDR4_DRV_NONE = 0U,
149 LPDDR4_DRV_SOC_PLL_UPDATE = 1U
150} lpddr4_infotype;
151
152/** Low power interface wake up timing parameters */
153typedef enum
154{
155 LPDDR4_LPI_PD_WAKEUP_FN = 0U,
156 LPDDR4_LPI_SR_SHORT_WAKEUP_FN = 1U,
157 LPDDR4_LPI_SR_LONG_WAKEUP_FN = 2U,
158 LPDDR4_LPI_SR_LONG_MCCLK_GATE_WAKEUP_FN = 3U,
159 LPDDR4_LPI_SRPD_SHORT_WAKEUP_FN = 4U,
160 LPDDR4_LPI_SRPD_LONG_WAKEUP_FN = 5U,
161 LPDDR4_LPI_SRPD_LONG_MCCLK_GATE_WAKEUP_FN = 6U
162} lpddr4_lpiwakeupparam;
163
164/** Half Datapath mode setting */
165typedef enum
166{
167 LPDDR4_REDUC_ON = 0U,
168 LPDDR4_REDUC_OFF = 1U
169} lpddr4_reducmode;
170
171/** ECC Control parameter setting */
172typedef enum
173{
174 LPDDR4_ECC_DISABLED = 0U,
175 LPDDR4_ECC_ENABLED = 1U,
176 LPDDR4_ECC_ERR_DETECT = 2U,
177 LPDDR4_ECC_ERR_DETECT_CORRECT = 3U
178} lpddr4_eccenable;
179
180/** Data Byte Inversion mode setting */
181typedef enum
182{
183 LPDDR4_DBI_RD_ON = 0U,
184 LPDDR4_DBI_RD_OFF = 1U,
185 LPDDR4_DBI_WR_ON = 2U,
186 LPDDR4_DBI_WR_OFF = 3U
187} lpddr4_dbimode;
188
189/** Controller Frequency Set Point number */
190typedef enum
191{
192 LPDDR4_FSP_0 = 0U,
193 LPDDR4_FSP_1 = 1U,
194 LPDDR4_FSP_2 = 2U
195} lpddr4_ctlfspnum;
196
197/**********************************************************************
198* Callbacks
199**********************************************************************/
200/**
201 * Reports informations and warnings that need to be communicated.
202 * Params:
203 * pD - driver state info specific to this instance.
204 * infoType - Type of information.
205 */
206typedef void (*lpddr4_infocallback)(const lpddr4_privatedata* pd, lpddr4_infotype infotype);
207
208/**
209 * Reports interrupts received by the controller.
210 * Params:
211 * pD - driver state info specific to this instance.
212 * ctlInterrupt - Interrupt raised
213 * chipSelect - Chip for which interrupt raised
214 */
215typedef void (*lpddr4_ctlcallback)(const lpddr4_privatedata* pd, lpddr4_ctlinterrupt ctlinterrupt, uint8_t chipselect);
216
217/**
218 * Reports interrupts received by the PHY Independent Module.
219 * Params:
220 * privateData - driver state info specific to this instance.
221 * phyIndepInterrupt - Interrupt raised
222 * chipSelect - Chip for which interrupt raised
223 */
224typedef void (*lpddr4_phyindepcallback)(const lpddr4_privatedata* pd, lpddr4_phyindepinterrupt phyindepinterrupt, uint8_t chipselect);
225
226/**
227 * @}
228 */
229
230/** @defgroup DriverFunctionAPI Driver Function API
231 * Prototypes for the driver API functions. The user application can link statically to the
232 * necessary API functions and call them directly.
233 * @{
234 */
235
236/**********************************************************************
237* API methods
238**********************************************************************/
239
240/**
241 * Checks configuration object.
242 * @param[in] config Driver/hardware configuration required.
243 * @param[out] configSize Size of memory allocations required.
244 * @return CDN_EOK on success (requirements structure filled).
245 * @return ENOTSUP if configuration cannot be supported due to driver/hardware constraints.
246 */
247uint32_t lpddr4_probe(const lpddr4_config* config, uint16_t* configsize);
248
249/**
250 * Init function to be called after LPDDR4_probe() to set up the
251 * driver configuration. Memory should be allocated for drv_data
252 * (using the size determined using LPDDR4_probe) before calling this
253 * API. init_settings should be initialised with base addresses for
254 * PHY Indepenent Module, Controller and PHY before calling this
255 * function. If callbacks are required for interrupt handling, these
256 * should also be configured in init_settings.
257 * @param[in] pD Driver state info specific to this instance.
258 * @param[in] cfg Specifies driver/hardware configuration.
259 * @return CDN_EOK on success
260 * @return EINVAL if illegal/inconsistent values in cfg.
261 * @return ENOTSUP if hardware has an inconsistent configuration or doesn't support feature(s) required by 'config' parameters.
262 */
263uint32_t lpddr4_init(lpddr4_privatedata* pd, const lpddr4_config* cfg);
264
265/**
266 * Start the driver.
267 * @param[in] pD Driver state info specific to this instance.
268 */
269uint32_t lpddr4_start(const lpddr4_privatedata* pd);
270
271/**
272 * Read a register from the controller, PHY or PHY Independent Module
273 * @param[in] pD Driver state info specific to this instance.
274 * @param[in] cpp Indicates whether controller, PHY or PHY Independent Module register
275 * @param[in] regOffset Register offset
276 * @param[out] regValue Register value read
277 * @return CDN_EOK on success.
278 * @return EINVAL if regOffset if out of range or regValue is NULL
279 */
280uint32_t lpddr4_readreg(const lpddr4_privatedata* pd, lpddr4_regblock cpp, uint32_t regoffset, uint32_t* regvalue);
281
282/**
283 * Write a register in the controller, PHY or PHY Independent Module
284 * @param[in] pD Driver state info specific to this instance.
285 * @param[in] cpp Indicates whether controller, PHY or PHY Independent Module register
286 * @param[in] regOffset Register offset
287 * @param[in] regValue Register value to be written
288 * @return CDN_EOK on success.
289 * @return EINVAL if regOffset is out of range or regValue is NULL
290 */
291uint32_t lpddr4_writereg(const lpddr4_privatedata* pd, lpddr4_regblock cpp, uint32_t regoffset, uint32_t regvalue);
292
293/**
294 * Read a memory mode register from DRAM
295 * @param[in] pD Driver state info specific to this instance.
296 * @param[in] readModeRegVal Value to set in 'read_modereg' parameter.
297 * @param[out] mmrValue Value which is read from memory mode register(mmr) for all devices.
298 * @param[out] mmrStatus Status of mode register read(mrr) instruction.
299 * @return CDN_EOK on success.
300 * @return EINVAL if regNumber is out of range or regValue is NULL
301 */
302uint32_t lpddr4_getmmrregister(const lpddr4_privatedata* pd, uint32_t readmoderegval, uint64_t* mmrvalue, uint8_t* mmrstatus);
303
304/**
305 * Write a memory mode register in DRAM
306 * @param[in] pD Driver state info specific to this instance.
307 * @param[in] writeModeRegVal Value to set in 'write_modereg' parameter.
308 * @param[out] mrwStatus Status of mode register write(mrw) instruction.
309 * @return CDN_EOK on success.
310 * @return EINVAL if regNumber is out of range or regValue is NULL
311 */
312uint32_t lpddr4_setmmrregister(const lpddr4_privatedata* pd, uint32_t writemoderegval, uint8_t* mrwstatus);
313
314/**
315 * Write a set of initialisation values to the controller registers
316 * @param[in] pD Driver state info specific to this instance.
317 * @param[in] regValues Register values to be written
318 * @return CDN_EOK on success.
319 * @return EINVAL if regValues is NULL
320 */
321uint32_t lpddr4_writectlconfig(const lpddr4_privatedata* pd, const lpddr4_reginitdata* regvalues);
322
323/**
324 * Write a set of initialisation values to the PHY registers
325 * @param[in] pD Driver state info specific to this instance.
326 * @param[in] regValues Register values to be written
327 * @return CDN_EOK on success.
328 * @return EINVAL if regValues is NULL
329 */
330uint32_t lpddr4_writephyconfig(const lpddr4_privatedata* pd, const lpddr4_reginitdata* regvalues);
331
332/**
333 * Write a set of initialisation values to the PHY Independent Module
334 * registers
335 * @param[in] pD Driver state info specific to this instance.
336 * @param[in] regValues Register values to be written
337 * @return CDN_EOK on success.
338 * @return EINVAL if regValues is NULL
339 */
340uint32_t lpddr4_writephyindepconfig(const lpddr4_privatedata* pd, const lpddr4_reginitdata* regvalues);
341
342/**
343 * Read values of the controller registers in bulk (Set 'updateCtlReg'
344 * to read) and store in memory.
345 * @param[in] pD Driver state info specific to this instance.
346 * @param[out] regValues Register values which are read
347 * @return CDN_EOK on success.
348 * @return EINVAL if regValues is NULL
349 */
350uint32_t lpddr4_readctlconfig(const lpddr4_privatedata* pd, lpddr4_reginitdata* regvalues);
351
352/**
353 * Read the values of the PHY module registers in bulk (Set
354 * 'updatePhyReg' to read) and store in memory.
355 * @param[in] pD Driver state info specific to this instance.
356 * @param[out] regValues Register values which are read
357 * @return CDN_EOK on success.
358 * @return EINVAL if regValues is NULL
359 */
360uint32_t lpddr4_readphyconfig(const lpddr4_privatedata* pd, lpddr4_reginitdata* regvalues);
361
362/**
363 * Read the values of the PHY Independent module registers in bulk(Set
364 * 'updatePhyIndepReg' to read) and store in memory.
365 * @param[in] pD Driver state info specific to this instance.
366 * @param[out] regValues Register values which are read
367 * @return CDN_EOK on success.
368 * @return EINVAL if regValues is NULL
369 */
370uint32_t lpddr4_readphyindepconfig(const lpddr4_privatedata* pd, lpddr4_reginitdata* regvalues);
371
372/**
373 * Read the current interrupt mask for the controller
374 * @param[in] pD Driver state info specific to this instance.
375 * @param[out] mask Value of interrupt mask
376 * @return CDN_EOK on success.
377 * @return EINVAL if mask pointer is NULL
378 */
379uint32_t lpddr4_getctlinterruptmask(const lpddr4_privatedata* pd, uint64_t* mask);
380
381/**
382 * Sets the interrupt mask for the controller
383 * @param[in] pD Driver state info specific to this instance.
384 * @param[in] mask Value of interrupt mask to be written
385 * @return CDN_EOK on success.
386 * @return EINVAL if mask pointer is NULL
387 */
388uint32_t lpddr4_setctlinterruptmask(const lpddr4_privatedata* pd, const uint64_t* mask);
389
390/**
391 * Check whether a specific controller interrupt is active
392 * @param[in] pD Driver state info specific to this instance.
393 * @param[in] intr Interrupt to be checked
394 * @param[out] irqStatus Status of the interrupt, TRUE if active
395 * @return CDN_EOK on success.
396 * @return EINVAL if intr is not valid
397 */
398uint32_t lpddr4_checkctlinterrupt(const lpddr4_privatedata* pd, lpddr4_ctlinterrupt intr, bool* irqstatus);
399
400/**
401 * Acknowledge a specific controller interrupt
402 * @param[in] pD Driver state info specific to this instance.
403 * @param[in] intr Interrupt to be acknowledged
404 * @return CDN_EOK on success.
405 * @return EINVAL if intr is not valid
406 */
407uint32_t lpddr4_ackctlinterrupt(const lpddr4_privatedata* pd, lpddr4_ctlinterrupt intr);
408
409/**
410 * Read the current interrupt mask for the PHY Independent Module
411 * @param[in] pD Driver state info specific to this instance.
412 * @param[out] mask Value of interrupt mask
413 * @return CDN_EOK on success.
414 * @return EINVAL if mask pointer is NULL
415 */
416uint32_t lpddr4_getphyindepinterruptmask(const lpddr4_privatedata* pd, uint32_t* mask);
417
418/**
419 * Sets the interrupt mask for the PHY Independent Module
420 * @param[in] pD Driver state info specific to this instance.
421 * @param[in] mask Value of interrupt mask to be written
422 * @return CDN_EOK on success.
423 * @return EINVAL if mask pointer is NULL
424 */
425uint32_t lpddr4_setphyindepinterruptmask(const lpddr4_privatedata* pd, const uint32_t* mask);
426
427/**
428 * Check whether a specific PHY Independent Module interrupt is active
429 * @param[in] pD Driver state info specific to this instance.
430 * @param[in] intr Interrupt to be checked
431 * @param[out] irqStatus Status of the interrupt, TRUE if active
432 * @return CDN_EOK on success.
433 * @return EINVAL if intr is not valid
434 */
435uint32_t lpddr4_checkphyindepinterrupt(const lpddr4_privatedata* pd, lpddr4_phyindepinterrupt intr, bool* irqstatus);
436
437/**
438 * Acknowledge a specific PHY Independent Module interrupt
439 * @param[in] pD Driver state info specific to this instance.
440 * @param[in] intr Interrupt to be acknowledged
441 * @return CDN_EOK on success.
442 * @return EINVAL if intr is not valid
443 */
444uint32_t lpddr4_ackphyindepinterrupt(const lpddr4_privatedata* pd, lpddr4_phyindepinterrupt intr);
445
446/**
447 * Retrieve status information after a failed init. The
448 * DebugStructInfo will be filled in with error codes which can be
449 * referenced against the driver documentation for further details.
450 * @param[in] pD Driver state info specific to this instance.
451 * @param[out] debugInfo status
452 * @return CDN_EOK on success.
453 * @return EINVAL if debugInfo is NULL
454 */
455uint32_t lpddr4_getdebuginitinfo(const lpddr4_privatedata* pd, lpddr4_debuginfo* debuginfo);
456
457/**
458 * Get the current value of Low power Interface wake up time.
459 * @param[in] pD Driver state info specific to this instance.
460 * @param[in] lpiWakeUpParam LPI timing parameter
461 * @param[in] fspNum Frequency copy
462 * @param[out] cycles Timing value(in cycles)
463 * @return CDN_EOK on success.
464 * @return EINVAL if powerMode is NULL
465 */
466uint32_t lpddr4_getlpiwakeuptime(const lpddr4_privatedata* pd, const lpddr4_lpiwakeupparam* lpiwakeupparam, const lpddr4_ctlfspnum* fspnum, uint32_t* cycles);
467
468/**
469 * Set the current value of Low power Interface wake up time.
470 * @param[in] pD Driver state info specific to this instance.
471 * @param[in] lpiWakeUpParam LPI timing parameter
472 * @param[in] fspNum Frequency copy
473 * @param[in] cycles Timing value(in cycles)
474 * @return CDN_EOK on success.
475 * @return EINVAL if powerMode is NULL
476 */
477uint32_t lpddr4_setlpiwakeuptime(const lpddr4_privatedata* pd, const lpddr4_lpiwakeupparam* lpiwakeupparam, const lpddr4_ctlfspnum* fspnum, const uint32_t* cycles);
478
479/**
480 * Get the current value for ECC auto correction
481 * @param[in] pD Driver state info specific to this instance.
482 * @param[out] eccParam ECC parameter setting
483 * @return CDN_EOK on success.
484 * @return EINVAL if on_off is NULL
485 */
486uint32_t lpddr4_geteccenable(const lpddr4_privatedata* pd, lpddr4_eccenable* eccparam);
487
488/**
489 * Set the value for ECC auto correction. This API must be called
490 * before startup of memory.
491 * @param[in] pD Driver state info specific to this instance.
492 * @param[in] eccParam ECC control parameter setting
493 * @return CDN_EOK on success.
494 * @return EINVAL if on_off is NULL
495 */
496uint32_t lpddr4_seteccenable(const lpddr4_privatedata* pd, const lpddr4_eccenable* eccparam);
497
498/**
499 * Get the current value for the Half Datapath option
500 * @param[in] pD Driver state info specific to this instance.
501 * @param[out] mode Half Datapath setting
502 * @return CDN_EOK on success.
503 * @return EINVAL if mode is NULL
504 */
505uint32_t lpddr4_getreducmode(const lpddr4_privatedata* pd, lpddr4_reducmode* mode);
506
507/**
508 * Set the value for the Half Datapath option. This API must be
509 * called before startup of memory.
510 * @param[in] pD Driver state info specific to this instance.
511 * @param[in] mode Half Datapath setting
512 * @return CDN_EOK on success.
513 * @return EINVAL if mode is NULL
514 */
515uint32_t lpddr4_setreducmode(const lpddr4_privatedata* pd, const lpddr4_reducmode* mode);
516
517/**
518 * Get the current value for Data Bus Inversion setting. This will be
519 * compared with the current DRAM setting using the MR3 register.
520 * @param[in] pD Driver state info specific to this instance.
521 * @param[out] on_off DBI read value
522 * @return CDN_EOK on success.
523 * @return EINVAL if on_off is NULL
524 */
525uint32_t lpddr4_getdbireadmode(const lpddr4_privatedata* pd, bool* on_off);
526
527/**
528 * Get the current value for Data Bus Inversion setting. This will be
529 * compared with the current DRAM setting using the MR3 register.
530 * @param[in] pD Driver state info specific to this instance.
531 * @param[out] on_off DBI write value
532 * @return CDN_EOK on success.
533 * @return EINVAL if on_off is NULL
534 */
535uint32_t lpddr4_getdbiwritemode(const lpddr4_privatedata* pd, bool* on_off);
536
537/**
538 * Set the mode for Data Bus Inversion. This will also be set in DRAM
539 * using the MR3 controller register. This API must be called before
540 * startup of memory.
541 * @param[in] pD Driver state info specific to this instance.
542 * @param[in] mode status
543 * @return CDN_EOK on success.
544 * @return EINVAL if mode is NULL
545 */
546uint32_t lpddr4_setdbimode(const lpddr4_privatedata* pd, const lpddr4_dbimode* mode);
547
548/**
549 * Get the current value for the refresh rate (reading Refresh per
550 * command timing).
551 * @param[in] pD Driver state info specific to this instance.
552 * @param[in] fspNum Frequency set number
553 * @param[out] cycles Refresh rate (in cycles)
554 * @return CDN_EOK on success.
555 * @return EINVAL if rate is NULL
556 */
557uint32_t lpddr4_getrefreshrate(const lpddr4_privatedata* pd, const lpddr4_ctlfspnum* fspnum, uint32_t* cycles);
558
559/**
560 * Set the refresh rate (writing Refresh per command timing).
561 * @param[in] pD Driver state info specific to this instance.
562 * @param[in] fspNum Frequency set number
563 * @param[in] cycles Refresh rate (in cycles)
564 * @return CDN_EOK on success.
565 * @return EINVAL if rate is NULL
566 */
567uint32_t lpddr4_setrefreshrate(const lpddr4_privatedata* pd, const lpddr4_ctlfspnum* fspnum, const uint32_t* cycles);
568
569/**
570 * Handle Refreshing per chip select
571 * @param[in] pD Driver state info specific to this instance.
572 * @param[in] trefInterval status
573 * @return CDN_EOK on success.
574 * @return EINVAL if chipSelect is invalid
575 */
576uint32_t lpddr4_refreshperchipselect(const lpddr4_privatedata* pd, const uint32_t trefinterval);
577
578#endif /* LPDDR4_IF_H */