ATF bl1 ufshc_dme_get/set处理流程分析

这篇具有很好参考价值的文章主要介绍了ATF bl1 ufshc_dme_get/set处理流程分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

以海思hikey960为例来介绍,简单介绍在ATF BL1阶段的初始化处理。

UFS术语缩略词

UTP:UFS Transport Protocol
DME:Device Management Entity
UCS:UFS Command Set
UIC:UFS Interconnect
UTRD:UTP Transfer Request Descriptor
UPIU:UFS Protocol Information Unit

1 ATF的下载链接

https://github.com/ARM-software/arm-trusted-firmware

可以通过下面的命令来下载ATF的代码,或者通过打包下载的方式也可以。

git clone git@github.com:ARM-software/arm-trusted-firmware.git

2 ATF BL1 ufshc_dme_get/set流程

  • 设置ufs dme get/set的cmd参数
  • ufshc_send_uic_cmd函数中首先等到UIC READY,然后配置UFS CMD ARG寄存器以及UIC CMD寄存器。

ATF bl1 ufshc_dme_get/set处理流程分析,UFS专栏,ATF bl1 ufshc,dme_get处理流程分析,dme_set处理流程分析

3 ufs总体架构图

3.1 UFS Top Level Architecture

ATF bl1 ufshc_dme_get/set处理流程分析,UFS专栏,ATF bl1 ufshc,dme_get处理流程分析,dme_set处理流程分析

3.2 UFS System Model

ATF bl1 ufshc_dme_get/set处理流程分析,UFS专栏,ATF bl1 ufshc,dme_get处理流程分析,dme_set处理流程分析

4 ufshc_dme_get/set函数接口详细分析

4.1 ufshc_dme_get

  • cmd.op = DME_GET;
  • ufshc_send_uic_cmd(base, &cmd);
int ufshc_dme_get(unsigned int attr, unsigned int idx, unsigned int *val)
{
        uintptr_t base;
        int result, retries;
        uic_cmd_t cmd;

        assert(ufs_params.reg_base != 0);

        if (val == NULL)
                return -EINVAL;

        base = ufs_params.reg_base;
        cmd.arg1 = (attr << 16) | GEN_SELECTOR_IDX(idx);
        cmd.arg2 = 0;
        cmd.arg3 = 0;
        cmd.op = DME_GET;

        for (retries = 0; retries < UFS_UIC_COMMAND_RETRIES; ++retries) {
                result = ufshc_send_uic_cmd(base, &cmd);
                if (result == 0)
                        break;
                /* -EIO requires UFS re-init */
                if (result == -EIO) {
                        return result;
                }
        }
        if (retries >= UFS_UIC_COMMAND_RETRIES)
                return -EIO;

        *val = mmio_read_32(base + UCMDARG3);
        return 0;
}

4.2 ufshc_dme_set

  • cmd.op = DME_SET;
  • ufshc_send_uic_cmd(base, &cmd);
int ufshc_dme_set(unsigned int attr, unsigned int idx, unsigned int val)
{
        uintptr_t base;
        int result, retries;
        uic_cmd_t cmd;

        assert((ufs_params.reg_base != 0));

        base = ufs_params.reg_base;
        cmd.arg1 = (attr << 16) | GEN_SELECTOR_IDX(idx);
        cmd.arg2 = 0;
        cmd.arg3 = val;
        cmd.op = DME_SET;

        for (retries = 0; retries < UFS_UIC_COMMAND_RETRIES; ++retries) {
                result = ufshc_send_uic_cmd(base, &cmd);
                if (result == 0)
                        break;
                /* -EIO requires UFS re-init */
                if (result == -EIO) {
                        return result;
                }                                                                                                                                                                                          
        }
        if (retries >= UFS_UIC_COMMAND_RETRIES)
                return -EIO;

        return 0;
}

4.3 ufshc_send_uic_cmd

  • data = mmio_read_32(base + HCS);读取Host Controller Status寄存器的值,仅当UCRDY置位时才继续执行对应的ufs cmd。该位被置位表示当前ufs 主控制器已经准备好处理UIC命令。
    ATF bl1 ufshc_dme_get/set处理流程分析,UFS专栏,ATF bl1 ufshc,dme_get处理流程分析,dme_set处理流程分析
  • mmio_write_32(base + IS, ~0);使能IAGES,CQES,SQES,CEFES,SBFES,HCFES,UTPES,DFES,UCCS,UTMRCS,ULSS,ULLS,UHES,UHXS,UPMS,UTMS,UE,UDEPRI,UTRCS
  • mmio_write_32(base + UCMDARG1, cmd->arg1);将arg1参数值写入UCMDARG1寄存器中。
    MIBattribute: Indicates the ID of the attribute of the requested. See MIPI UniPro Specification for the details of the MIBattribute parameter.
    MIBattribute: 表示请求的属性 ID。有关 MIBattribute 参数的详细信息,请参见 MIPI UniPro Specification。
    GenSelectorIndex: Indicates the targeted M-PHY data lane or CPort or Test Feature when relevant. See MIPI UniPro Specification for the details of the GenSelectorIndex parameter.
    GenSelectorIndex: 表示目标 M-PHY 数据通道、CPort 或测试功能(如相关)。有关 GenSelectorIndex 参数的详细信息,请参阅 MIPI UniPro 规范。
    ATF bl1 ufshc_dme_get/set处理流程分析,UFS专栏,ATF bl1 ufshc,dme_get处理流程分析,dme_set处理流程分析
    ResetMode: Indicates the link startup mode. See MIPI UniPro Specification for the details of the ResetMode parameter.
    重置模式: 表示链路启动模式。有关 ResetMode 参数的详细信息,请参阅 MIPI UniPro 规范。
    ATF bl1 ufshc_dme_get/set处理流程分析,UFS专栏,ATF bl1 ufshc,dme_get处理流程分析,dme_set处理流程分析
    ResetLevel: Indicates the reset type. See MIPI UniPro Specification for the details of the ResetLevel parameter.
    重置级别: 表示复位类型。有关 ResetLevel 参数的详细信息,请参见 MIPI UniPro Specification。
    ATF bl1 ufshc_dme_get/set处理流程分析,UFS专栏,ATF bl1 ufshc,dme_get处理流程分析,dme_set处理流程分析

ATF bl1 ufshc_dme_get/set处理流程分析,UFS专栏,ATF bl1 ufshc,dme_get处理流程分析,dme_set处理流程分析

  • mmio_write_32(base + UCMDARG2, cmd->arg2);将arg2参数值写入UCMDARG2寄存器中。
    ATF bl1 ufshc_dme_get/set处理流程分析,UFS专栏,ATF bl1 ufshc,dme_get处理流程分析,dme_set处理流程分析
    AttrSetType: Indicates whether the attribute value (AttrSet = NORMAL) or the attribute non-volatile reset value (STATIC) setting is requested. See MIPI UniPro Specification for the details of the AttrSetType parameter.
    AttrSetType: 表示请求设置属性值(AttrSet = NORMAL)还是属性非易失性重置值(STATIC)。有关 AttrSetType 参数的详细信息,请参阅 MIPI UniPro 规范。
    ConfigResultCode: Indicates the result of the UIC configuration command request. It is valid after host controller has set the IS.UCCS bit to ’1’. See MIPI UniPro Specification for the details of the ConfigResultCode parameter.
    ConfigResultCode: 表示 UIC 配置命令请求的结果。它在主机控制器将 IS.UCCS 位设置为 "1 "后有效。有关 ConfigResultCode 参数的详细信息,请参见 MIPI UniPro Specification。
    ATF bl1 ufshc_dme_get/set处理流程分析,UFS专栏,ATF bl1 ufshc,dme_get处理流程分析,dme_set处理流程分析
    GenericErrorCode: Indicates the result of the UIC control command request. It is valid after host controller has set the IS.UCCS bit to ’1’. See MIPI UniPro Specification for the details of the GenericErrorCode parameter.
    通用错误代码: 表示 UIC 控制命令请求的结果。它在主机控制器将 IS.UCCS 位设置为 "1 "后有效。有关 GenericErrorCode 参数的详细信息,请参见 MIPI UniPro Specification。
    ATF bl1 ufshc_dme_get/set处理流程分析,UFS专栏,ATF bl1 ufshc,dme_get处理流程分析,dme_set处理流程分析

  • mmio_write_32(base + UCMDARG3, cmd->arg3);将arg3参数值写入UCMDARG3寄存器中。
    ATF bl1 ufshc_dme_get/set处理流程分析,UFS专栏,ATF bl1 ufshc,dme_get处理流程分析,dme_set处理流程分析
    MIBvalue_R: Indicates the value of the attribute as returned by the UIC command returned. It is valid after host controller has set the IS.UCCS bit to ’1’. See MIPI UniPro Specification for the details of the MIBvalue parameter.
    MIBvalue_R: 表示 UIC 命令返回的属性值。它在主机控制器将 IS.UCCS 位设置为 "1 "后有效。有关 MIBvalue 参数的详细信息,请参阅 MIPI UniPro 规范。
    MIBvalue_W: Indicates the value of the attribute to be set. See MIPI UniPro Specification for details of the MIBvalue parameter.
    MIBvalue_W: 表示要设置的属性值。有关 MIBvalue 参数的详细信息,请参见 MIPI UniPro Specification。

  • mmio_write_32(base + UICCMD, cmd->op);将cmd-ops写入UICCMD寄存器中,使cmd开始处理。
    ATF bl1 ufshc_dme_get/set处理流程分析,UFS专栏,ATF bl1 ufshc,dme_get处理流程分析,dme_set处理流程分析

  • ufs_wait_for_int_status(UFS_INT_UCCS, UIC_CMD_TIMEOUT_MS, cmd->op == DME_SET); 等待期待的中断状态文章来源地址https://www.toymoban.com/news/detail-654014.html

int ufshc_send_uic_cmd(uintptr_t base, uic_cmd_t *cmd)
{
        unsigned int data;
        int result, retries;
                
        if (base == 0 || cmd == NULL)
                return -EINVAL;

        for (retries = 0; retries < 100; retries++) {
                data = mmio_read_32(base + HCS);
                if ((data & HCS_UCRDY) != 0) {
                        break;
                }
                mdelay(1);
        }
        if (retries >= 100) {                                                                                                                                                                              
                return -EBUSY;
        }

        mmio_write_32(base + IS, ~0);
        mmio_write_32(base + UCMDARG1, cmd->arg1);
        mmio_write_32(base + UCMDARG2, cmd->arg2);
        mmio_write_32(base + UCMDARG3, cmd->arg3);
        mmio_write_32(base + UICCMD, cmd->op);

        result = ufs_wait_for_int_status(UFS_INT_UCCS, UIC_CMD_TIMEOUT_MS,
                                         cmd->op == DME_SET);
        if (result != 0) {
                return result;
        }

        return mmio_read_32(base + UCMDARG2) & CONFIG_RESULT_CODE_MASK;
}

4.4 ufs_wait_for_int_status

  • interrupts_enabled = mmio_read_32(ufs_params.reg_base + IE);读取中断使能寄存器的值,该寄存器可启用或禁用向主机软件报告相应的中断。当某位被设置(‘1’)且相应的中断条件处于活动状态时,就会产生中断。被禁用(‘0’)的中断源仍会在 IS 寄存器中显示。该寄存器与 IS 寄存器对称。
  • interrupt_status = mmio_read_32(ufs_params.reg_base + IS) & interrupts_enabled;读取中断状态寄存器的值与中断使能寄存器的值与获取当前中断的状态值。
/*              
 * ufs_wait_for_int_status - wait for expected interrupt status
 * @expected: expected interrupt status bit
 * @timeout_ms: timeout in milliseconds to poll for
 * @ignore_linereset: set to ignore PA_LAYER_GEN_ERR (UIC error)
 *
 * Returns
 * 0 - received expected interrupt and cleared it
 * -EIO - fatal error, needs re-init
 * -EAGAIN - non-fatal error, caller can retry
 * -ETIMEDOUT - timed out waiting for interrupt status
 */
static int ufs_wait_for_int_status(const uint32_t expected_status,
                                   unsigned int timeout_ms,
                                   bool ignore_linereset)
{               
        uint32_t interrupt_status, interrupts_enabled;
        int result = 0;
        
        interrupts_enabled = mmio_read_32(ufs_params.reg_base + IE);
        do {
                interrupt_status = mmio_read_32(ufs_params.reg_base + IS) & interrupts_enabled;                                                                                                            
                if (interrupt_status & UFS_INT_ERR) {
                        mmio_write_32(ufs_params.reg_base + IS, interrupt_status & UFS_INT_ERR);
                        result = ufs_error_handler(interrupt_status, ignore_linereset);
                        if (result != 0) {
                                return result;
                        }
                }
        
                if (interrupt_status & expected_status) {
                        break;
                }
                mdelay(1);
        } while (timeout_ms-- > 0);
        
        if (!(interrupt_status & expected_status)) {
                return -ETIMEDOUT;
        }

        mmio_write_32(ufs_params.reg_base + IS, expected_status);

        return result;
}

到了这里,关于ATF bl1 ufshc_dme_get/set处理流程分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Lua 通过元方法简单实现属性Get/Set访问

    通过元方法__index、__newindex、rawset,我们可以实现属性的Get/Set访问,类似于C#: __index 可视为该table中所有属性的Get方法,通过参数Key区分不同的属性; __newindex 可视为该table中所有属性的Set方法,通过参数Key区分不同的属性; 该方法的局限性在于,子表不得绕过元方法对属性

    2024年04月10日
    浏览(28)
  • Idea自动生成get()和set()方法的快捷操作

       下面是生成后的结果  下面为结果

    2024年02月05日
    浏览(32)
  • Mac Intellij Idea get/set方法快捷键

    Control + Retrun(回车键) Command + n 参考: Mac Intellij Idea get/set方法快捷键-CSDN博客

    2024年02月07日
    浏览(34)
  • 今天又get到一个小技能,collect_set函数

    collect_set函数 今天又get到一个小技能,掌握了hive一个关于列转行专用函数 collect_set函数。 在这里做个学习笔记。 collect_set是Hive内置的一个聚合函数, 结果返回一个消除了重复元素的对象集合, 其返回值类型是 array 。 和collect_set相似的还有另一个函数collect_list,这个我们后面

    2023年04月17日
    浏览(30)
  • eclipse如何自动生成私有属性变量的get和set方法

    在创建一个类时,如果创建了多个私有属性,就需要一个一个生成对应的 set 与 get 方法。 通过eclipse自带的功能可以快速生成,提高敲代码速度。 目录 1.批量生成get和set方法 2.逐个生成get和set方法 1.创建好private属性的变量后,把鼠标焦点对准某个private属性变量,接着快捷键

    2024年02月11日
    浏览(34)
  • 提高代码封装性的好习惯:Java中的get和set方法

    在Java中,get和set方法是用于访问对象的私有属性的一种常见方法。通常情况下,属性被声明为私有的,以防止其他类直接访问该属性,而是通过get和set方法来访问。本篇博客将介绍Java中的get和set方法,它们的作用以及如何使用它们。 get方法用于获取对象的私有属性值,并返

    2024年02月03日
    浏览(31)
  • vue的双向绑定Object.definedProperty(obj,key,{set,get})

    vue的代码方式

    2024年02月06日
    浏览(27)
  • idea一键自动生成对象所有get、set方法。idea插件:GenerateAllSetter

    idea中有一款插件能够一键自动生成对象所有的get、set方法,有助于我们开发者提升开发效率的插件,非常简单实用。 插件名: GenerateAllSetter 。 该插件作用是可以快速针对已有的model实体对象的属性生产get、set代码,免去开发者在开发过程中get、set属性值时还需要去实体对象

    2024年02月11日
    浏览(38)
  • 【杂谈】“CommunityToolkit.Mvvm无法自动生成Get/Set属性对”的解决方案

    最近在实践MVVM,发现这玩意儿挺有意思的,有点WPF的最佳搭档的感觉。UI自动跟随VM变化,极大程度上简化各类逻辑。UI元素的各种属性也会实时反馈到VM上,直接在VM处理事务逻辑即可。 但是MVVM在WPF上应用,最烦的就是要自己写一大堆Get/Set,以及匹配 INotifyPropertyChanged 的调

    2024年02月08日
    浏览(32)
  • IDEA使用lombok实体类加上@Data注解后无法找到get和set方法

    IDEA没有安装lombok插件 重启完成后测试是否能正常调用get和set方法,如果不行如下图启用注释处理

    2024年02月16日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包