@@ -11,6 +11,7 @@ LOG_MODULE_REGISTER(nxp_s32_qspi_memc, CONFIG_MEMC_LOG_LEVEL);
1111
1212#include <zephyr/drivers/pinctrl.h>
1313#include <zephyr/sys/util.h>
14+ #include <zephyr/dt-bindings/qspi/nxp-s32-qspi.h>
1415
1516#include <soc.h>
1617#include "memc_nxp_s32_qspi.h"
@@ -154,6 +155,81 @@ uint8_t memc_nxp_s32_qspi_get_instance(const struct device *dev)
154155 QSPI_PORT_SIZE(n, side_upper) \
155156 .readMode##side_upper = QSPI_READ_MODE(n, side, side_upper),
156157
158+ #if FEATURE_QSPI_HAS_SFP
159+
160+ #if QSPI_IP_SFP_ENABLE_MDAD
161+ #define SFP_MDAD_NODE (n ) DT_INST_CHILD(n, sfp_mdad)
162+
163+ #define QSPI_SECURE_ATTRIBUTE (node_id ) \
164+ (DT_PROP(node_id, secure_attribute) == NXP_S32_QSPI_NON_SECURE ? QSPI_IP_SFP_UNSECURE : \
165+ (DT_PROP(node_id, secure_attribute) == NXP_S32_QSPI_SECURE ? QSPI_IP_SFP_SECURE : \
166+ (DT_PROP(node_id, secure_attribute) == (NXP_S32_QSPI_NON_SECURE | NXP_S32_QSPI_SECURE) ?\
167+ QSPI_IP_SFP_BOTH : \
168+ QSPI_IP_SFP_RESERVED)))
169+
170+ #define _QSPI_SFP_MDAD_CFG (node_id , n ) \
171+ { \
172+ .SecureAttribute = QSPI_SECURE_ATTRIBUTE(node_id), \
173+ .MaskType = DT_ENUM_IDX(node_id, mask_type), \
174+ .Valid = true, \
175+ .Mask = DT_PROP(node_id, mask), \
176+ .DomainId = DT_PROP(node_id, domain_id), \
177+ },
178+
179+ #define QSPI_SFP_MDAD_CFG (n ) \
180+ .Tg = { \
181+ DT_FOREACH_CHILD_STATUS_OKAY_VARGS(SFP_MDAD_NODE(n), _QSPI_SFP_MDAD_CFG, n)\
182+ },
183+ #endif /* QSPI_IP_SFP_ENABLE_MDAD */
184+
185+ #if QSPI_IP_SFP_ENABLE_FRAD
186+ #define SFP_FRAD_NODE (n ) DT_INST_CHILD(n, sfp_frad)
187+
188+ #define QSPI_ACP_POLICY (node_id ) \
189+ (DT_PROP(node_id, master_domain_acp_policy) == NXP_S32_QSPI_SECURE ? \
190+ QSPI_IP_SFP_ACP_SECURE :\
191+ (DT_PROP(node_id, master_domain_acp_policy) == (NXP_S32_QSPI_NON_SECURE | \
192+ NXP_S32_QSPI_PRIVILEGE) ? QSPI_IP_SFP_ACP_PRIVILEGED : \
193+ (DT_PROP(node_id, master_domain_acp_policy) == (NXP_S32_QSPI_SECURE | \
194+ NXP_S32_QSPI_PRIVILEGE) ? QSPI_IP_SFP_ACP_SECURE_PRIVILEGED :\
195+ (DT_PROP(node_id, master_domain_acp_policy) == (NXP_S32_QSPI_NON_SECURE | \
196+ NXP_S32_QSPI_SECURE | NXP_S32_QSPI_PRIVILEGE) ? QSPI_IP_SFP_ACP_ALL : \
197+ QSPI_IP_SFP_ACP_NONE))))
198+
199+ #define QSPI_EXCLUSIVE_ACCESS_LOCK (node_id ) \
200+ (DT_ENUM_IDX(node_id, exclusive_access_lock) == 0 ? QSPI_IP_SFP_EAL_DISABLED : \
201+ (DT_ENUM_IDX(node_id, exclusive_access_lock) == 1 ? QSPI_IP_SFP_EAL_OWNER : \
202+ QSPI_IP_SFP_EAL_NONE))
203+
204+ #define _QSPI_SFP_FRAD_CFG (node_id , n ) \
205+ { \
206+ .StartAddress = DT_REG_ADDR(node_id), \
207+ .EndAddress = DT_REG_ADDR(node_id) + DT_REG_SIZE(node_id) - 1, \
208+ .Valid = true, \
209+ .Md0Acp = QSPI_ACP_POLICY(node_id), \
210+ .Md1Acp = QSPI_ACP_POLICY(node_id), \
211+ .ExclusiveAccessLock = QSPI_EXCLUSIVE_ACCESS_LOCK(node_id), \
212+ .ExclusiveAccessOwner = DT_PROP(node_id, exclusive_access_owner), \
213+ },
214+
215+ #define QSPI_SFP_FRAD_CFG (n ) \
216+ .Frad = { \
217+ DT_FOREACH_CHILD_STATUS_OKAY_VARGS(SFP_FRAD_NODE(n), _QSPI_SFP_FRAD_CFG, n)\
218+ },
219+ #endif /* QSPI_IP_SFP_ENABLE_FRAD */
220+
221+ #define QSPI_SFP_MASTER_TIMEOUT_CYCLES 0xffff
222+
223+ #define QSPI_SFP_CFG (n ) \
224+ IF_ENABLED(QSPI_IP_SFP_ENABLE_GLOBAL, \
225+ (.SfpCfg = { \
226+ .MasterTimeout = QSPI_SFP_MASTER_TIMEOUT_CYCLES, \
227+ IF_ENABLED(QSPI_IP_SFP_ENABLE_MDAD, (QSPI_SFP_MDAD_CFG(n))) \
228+ IF_ENABLED(QSPI_IP_SFP_ENABLE_FRAD, (QSPI_SFP_FRAD_CFG(n))) \
229+ },))
230+
231+ #endif /* FEATURE_QSPI_HAS_SFP */
232+
157233#define MEMC_NXP_S32_QSPI_CONTROLLER_CONFIG (n ) \
158234 BUILD_ASSERT(DT_INST_PROP_LEN(n, ahb_buffers_masters) == QSPI_IP_AHB_BUFFERS, \
159235 "ahb-buffers-masters must be of size QSPI_IP_AHB_BUFFERS"); \
@@ -174,6 +250,7 @@ uint8_t memc_nxp_s32_qspi_get_instance(const struct device *dev)
174250 QSPI_DATA_CFG(n) \
175251 QSPI_ADDR_CFG(n) \
176252 QSPI_BYTES_SWAP_ADDR(n) \
253+ IF_ENABLED(FEATURE_QSPI_HAS_SFP, (QSPI_SFP_CFG(n))) \
177254 }
178255
179256#define MEMC_NXP_S32_QSPI_INIT_DEVICE (n ) \
0 commit comments