Zephyr API Documentation 4.4.99
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
nxp_flexram.h
Go to the documentation of this file.
1/*
2 * Copyright 2023-2024 NXP
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7#ifndef ZEPHYR_INCLUDE_DRIVERS_MISC_FLEXRAM_NXP_FLEXRAM_H_
8#define ZEPHYR_INCLUDE_DRIVERS_MISC_FLEXRAM_NXP_FLEXRAM_H_
9
10#include <zephyr/devicetree.h>
11#include <soc.h>
12
13#define FLEXRAM_DT_NODE DT_INST(0, nxp_flexram)
14#define IOMUXC_GPR_DT_NODE DT_NODELABEL(iomuxcgpr)
15
16#if defined(CONFIG_NXP_FLEXRAM_MAGIC_ADDR_API) || \
17 defined(CONFIG_NXP_FLEXRAM_ERROR_INTERRUPT)
18#define FLEXRAM_INTERRUPTS_USED
19#endif
20
21#if DT_PROP_HAS_IDX(FLEXRAM_DT_NODE, flexram_bank_spec, 0)
22#define FLEXRAM_RUNTIME_BANKS_USED 1
23#endif
24
25#ifdef FLEXRAM_INTERRUPTS_USED
26enum flexram_interrupt_cause {
27#ifdef CONFIG_NXP_FLEXRAM_ERROR_INTERRUPT
28 flexram_ocram_access_error,
29 flexram_itcm_access_error,
30 flexram_dtcm_access_error,
31#endif
32#ifdef CONFIG_NXP_FLEXRAM_MAGIC_ADDR_API
33 flexram_ocram_magic_addr,
34 flexram_itcm_magic_addr,
35 flexram_dtcm_magic_addr,
36#endif /* CONFIG_NXP_FLEXRAM_MAGIC_ADDR_API */
37};
38
39typedef void (*flexram_callback_t)(enum flexram_interrupt_cause, void *user_data);
40
41void flexram_register_callback(flexram_callback_t callback, void *user_data);
42#endif /* FLEXRAM_INTERRUPTS_USED */
43
44#ifdef FLEXRAM_RUNTIME_BANKS_USED
45
46/*
47 * call from platform_init to set up flexram if using runtime map
48 * must be inlined because cannot use stack
49 */
50#define GPR_FLEXRAM_REG_FILL(node_id, prop, idx) \
51 (((uint32_t)DT_PROP_BY_IDX(node_id, prop, idx)) << (2 * idx))
52static inline void flexram_dt_partition(void)
53{
54 /* iomuxc_gpr must be const (in ROM region) because used in reconfiguring ram */
55 static IOMUXC_GPR_Type *const iomuxc_gpr =
56 (IOMUXC_GPR_Type *)DT_REG_ADDR(IOMUXC_GPR_DT_NODE);
57 /* do not create stack variables or use any data from ram in this function */
58#if defined(CONFIG_SOC_SERIES_IMXRT11XX)
59 iomuxc_gpr->GPR17 = (DT_FOREACH_PROP_ELEM_SEP(FLEXRAM_DT_NODE, flexram_bank_spec,
60 GPR_FLEXRAM_REG_FILL, (+))) & 0xFFFF;
61 iomuxc_gpr->GPR18 = (((DT_FOREACH_PROP_ELEM_SEP(FLEXRAM_DT_NODE, flexram_bank_spec,
62 GPR_FLEXRAM_REG_FILL, (+)))) >> 16) & 0xFFFF;
63#elif defined(CONFIG_SOC_SERIES_IMXRT10XX)
64 iomuxc_gpr->GPR17 = DT_FOREACH_PROP_ELEM_SEP(FLEXRAM_DT_NODE, flexram_bank_spec,
65 GPR_FLEXRAM_REG_FILL, (+));
66#endif
67 iomuxc_gpr->GPR16 |= IOMUXC_GPR_GPR16_FLEXRAM_BANK_CFG_SEL_MASK;
68}
69#endif /* FLEXRAM_RUNTIME_BANKS_USED */
70
71#ifdef CONFIG_NXP_FLEXRAM_MAGIC_ADDR_API
82int flexram_set_ocram_magic_addr(uint32_t ocram_addr);
83
94int flexram_set_itcm_magic_addr(uint32_t itcm_addr);
95
106int flexram_set_dtcm_magic_addr(uint32_t dtcm_addr);
107
108#endif /* CONFIG_NXP_FLEXRAM_MAGIC_ADDR_API */
109
110#endif /* ZEPHYR_INCLUDE_DRIVERS_MISC_FLEXRAM_NXP_FLEXRAM_H_ */
Devicetree main header.
#define DT_FOREACH_PROP_ELEM_SEP(node_id, prop, fn, sep)
Invokes fn for each element in the value of property prop with separator.
Definition devicetree.h:3663
#define DT_REG_ADDR(node_id)
Get a node's (only) register block address.
Definition devicetree.h:2584
#define FLEXRAM_DT_NODE
Definition nxp_flexram.h:13
#define IOMUXC_GPR_DT_NODE
Definition nxp_flexram.h:14
__UINT32_TYPE__ uint32_t
Definition stdint.h:90