Path: blob/master/drivers/firmware/xilinx/zynqmp-ufs.c
122918 views
// SPDX-License-Identifier: GPL-2.01/*2* Firmware Layer for UFS APIs3*4* Copyright (C) 2025 Advanced Micro Devices, Inc.5*/67#include <linux/firmware/xlnx-zynqmp.h>8#include <linux/module.h>910/* Register Node IDs */11#define PM_REGNODE_PMC_IOU_SLCR 0x30000002 /* PMC IOU SLCR */12#define PM_REGNODE_EFUSE_CACHE 0x30000003 /* EFUSE Cache */1314/* Register Offsets for PMC IOU SLCR */15#define SRAM_CSR_OFFSET 0x104C /* SRAM Control and Status */16#define TXRX_CFGRDY_OFFSET 0x1054 /* M-PHY TX-RX Config ready */1718/* Masks for SRAM Control and Status Register */19#define SRAM_CSR_INIT_DONE_MASK BIT(0) /* SRAM initialization done */20#define SRAM_CSR_EXT_LD_DONE_MASK BIT(1) /* SRAM External load done */21#define SRAM_CSR_BYPASS_MASK BIT(2) /* Bypass SRAM interface */2223/* Mask to check M-PHY TX-RX configuration readiness */24#define TX_RX_CFG_RDY_MASK GENMASK(3, 0)2526/* Register Offsets for EFUSE Cache */27#define UFS_CAL_1_OFFSET 0xBE8 /* UFS Calibration Value */2829/**30* zynqmp_pm_is_mphy_tx_rx_config_ready - check M-PHY TX-RX config readiness31* @is_ready: Store output status (true/false)32*33* Return: Returns 0 on success or error value on failure.34*/35int zynqmp_pm_is_mphy_tx_rx_config_ready(bool *is_ready)36{37u32 regval;38int ret;3940if (!is_ready)41return -EINVAL;4243ret = zynqmp_pm_sec_read_reg(PM_REGNODE_PMC_IOU_SLCR, TXRX_CFGRDY_OFFSET, ®val);44if (ret)45return ret;4647regval &= TX_RX_CFG_RDY_MASK;48if (regval)49*is_ready = true;50else51*is_ready = false;5253return ret;54}55EXPORT_SYMBOL_GPL(zynqmp_pm_is_mphy_tx_rx_config_ready);5657/**58* zynqmp_pm_is_sram_init_done - check SRAM initialization59* @is_done: Store output status (true/false)60*61* Return: Returns 0 on success or error value on failure.62*/63int zynqmp_pm_is_sram_init_done(bool *is_done)64{65u32 regval;66int ret;6768if (!is_done)69return -EINVAL;7071ret = zynqmp_pm_sec_read_reg(PM_REGNODE_PMC_IOU_SLCR, SRAM_CSR_OFFSET, ®val);72if (ret)73return ret;7475regval &= SRAM_CSR_INIT_DONE_MASK;76if (regval)77*is_done = true;78else79*is_done = false;8081return ret;82}83EXPORT_SYMBOL_GPL(zynqmp_pm_is_sram_init_done);8485/**86* zynqmp_pm_set_sram_bypass - Set SRAM bypass Control87*88* Return: Returns 0 on success or error value on failure.89*/90int zynqmp_pm_set_sram_bypass(void)91{92u32 sram_csr;93int ret;9495ret = zynqmp_pm_sec_read_reg(PM_REGNODE_PMC_IOU_SLCR, SRAM_CSR_OFFSET, &sram_csr);96if (ret)97return ret;9899sram_csr &= ~SRAM_CSR_EXT_LD_DONE_MASK;100sram_csr |= SRAM_CSR_BYPASS_MASK;101102return zynqmp_pm_sec_mask_write_reg(PM_REGNODE_PMC_IOU_SLCR, SRAM_CSR_OFFSET,103GENMASK(2, 1), sram_csr);104}105EXPORT_SYMBOL_GPL(zynqmp_pm_set_sram_bypass);106107/**108* zynqmp_pm_get_ufs_calibration_values - Read UFS calibration values109* @val: Store the calibration value110*111* Return: Returns 0 on success or error value on failure.112*/113int zynqmp_pm_get_ufs_calibration_values(u32 *val)114{115return zynqmp_pm_sec_read_reg(PM_REGNODE_EFUSE_CACHE, UFS_CAL_1_OFFSET, val);116}117EXPORT_SYMBOL_GPL(zynqmp_pm_get_ufs_calibration_values);118119120