/* * Copyright (c) 2024 Nordic Semiconductor ASA * * SPDX-License-Identifier: BSD-3-Clause */ /** * @brief File containing SoC specific definitions for the * HAL Layer of the Wi-Fi driver. */ #include "common/pal.h" bool pal_check_rpu_mcu_regions(enum RPU_PROC_TYPE proc, unsigned int addr_val) { const struct rpu_addr_map *map = &RPU_ADDR_MAP_MCU[proc]; enum RPU_MCU_ADDR_REGIONS region_type; if (proc >= RPU_PROC_TYPE_MAX) { return false; } for (region_type = 0; region_type < RPU_MCU_ADDR_REGION_MAX; region_type++) { const struct rpu_addr_region *region = &map->regions[region_type]; if ((addr_val >= region->start) && (addr_val <= region->end)) { return true; } } return false; } enum nrf_wifi_status pal_rpu_addr_offset_get(unsigned int rpu_addr, unsigned long *addr, enum RPU_PROC_TYPE proc) { enum nrf_wifi_status status = NRF_WIFI_STATUS_FAIL; unsigned int addr_base = (rpu_addr & RPU_ADDR_MASK_BASE); unsigned long region_offset = 0; if (addr_base == RPU_ADDR_SBUS_START) { region_offset = SOC_MMAP_ADDR_OFFSET_SYSBUS; } else if ((rpu_addr >= RPU_ADDR_GRAM_START) && (rpu_addr <= RPU_ADDR_GRAM_END)) { region_offset = SOC_MMAP_ADDR_OFFSET_GRAM_PKD; } else if (addr_base == RPU_ADDR_PBUS_START) { region_offset = SOC_MMAP_ADDR_OFFSET_PBUS; } else if (addr_base == RPU_ADDR_PKTRAM_START) { region_offset = SOC_MMAP_ADDR_OFFSET_PKTRAM_HOST_VIEW; } else if (pal_check_rpu_mcu_regions(proc, rpu_addr)) { region_offset = SOC_MMAP_ADDR_OFFSETS_MCU[proc]; } else { nrf_wifi_osal_log_err("%s: Invalid rpu_addr 0x%X", __func__, rpu_addr); goto out; } *addr = region_offset + (rpu_addr & RPU_ADDR_MASK_OFFSET); status = NRF_WIFI_STATUS_SUCCESS; out: return status; } #ifdef NRF_WIFI_LOW_POWER unsigned long pal_rpu_ps_ctrl_reg_addr_get(void) { return SOC_MMAP_ADDR_RPU_PS_CTRL; } #endif /* NRF_WIFI_LOW_POWER */ char *pal_ops_get_fw_loc(enum nrf_wifi_fw_type fw_type, enum nrf_wifi_fw_subtype fw_subtype) { char *fw_loc = NULL; switch (fw_type) { case NRF_WIFI_FW_TYPE_LMAC_PATCH: if (fw_subtype == NRF_WIFI_FW_SUBTYPE_PRI) { fw_loc = NRF_WIFI_FW_LMAC_PATCH_LOC_PRI; } else if (fw_subtype == NRF_WIFI_FW_SUBTYPE_SEC) { fw_loc = NRF_WIFI_FW_LMAC_PATCH_LOC_SEC; } else { nrf_wifi_osal_log_err("%s: Invalid LMAC FW sub-type = %d", __func__, fw_subtype); goto out; } break; case NRF_WIFI_FW_TYPE_UMAC_PATCH: if (fw_subtype == NRF_WIFI_FW_SUBTYPE_PRI) { fw_loc = NRF_WIFI_FW_UMAC_PATCH_LOC_PRI; } else if (fw_subtype == NRF_WIFI_FW_SUBTYPE_SEC) { fw_loc = NRF_WIFI_FW_UMAC_PATCH_LOC_SEC; } else { nrf_wifi_osal_log_err("%s: Invalid UMAC FW sub-type = %d", __func__, fw_subtype); goto out; } break; default: nrf_wifi_osal_log_err("%s: Invalid FW type = %d", __func__, fw_type); goto out; } out: return fw_loc; }