目录

  • 1. 前言
  • 2. UFS子系统软件架构
  • 3. UFS模块框图
  • 4. UFS领域模型
  • 参考文档

1. 前言

本专题我们开始学习SCSI子系统的相关内容。本专题主要参考了《存储技术原理分析》、ULA、ULK的相关内容。本专题主要以硬件UFS,控制器以高通UFS控制器为例,记录SCSI子系统的框架流程。本文是UFS子系统软件概述部分。

kernel版本:5.10
平台:arm64

注:
为方便阅读,正文标题采用分级结构标识,每一级用一个"-“表示,如:两级为”|- -", 三级为”|- - -“

2. UFS子系统软件架构


如上图所示,以UFS为例,UFS子系统实际就是SCSI子系统的低层,也就是UFS控制器的驱动。

  • UFS平台驱动
    主要获取跟平台相关的一些属性,如对于高通来讲,就会获取高通平台DTS中定义的UFS相关属性。此处的UFS平台驱动特指ufshcd-pltfrm。作为一个platform device,它的驱动在注册时触发了ufshcd_pltfrm_probe的执行,ufshcd_pltfrm_probe进而调用了ufshcd公共层的接口主要是ufshcd_alloc_host和ufshcd_init。同时通过of_find_device_by_node(ufs_variant_node)直接获取到最底层ufs host驱动也就是ufshcd-qcom的platform device,它里面保存了对ufs host的操作函数集,并传递给UFS公共层,这样UFS公共层就可以实现对底层ufs host的寄存器操作。

  • UFS公共层
    主要提供了ufs公共的一些行为,策略以及各种命令处理,错误恢复等的接口,其中ufshcd_alloc_host实现了scsi_host的分配,ufshcd_init实现对scsi控制器的初始化。ufshcd公用层将从UFS平台驱动拿到底层ufshcd-qcom的操作函数集实现对底层ufs控制器的操作。
    注:struct scsi_host_template类型变量ufshcd_driver_template是在本层定义,struct scsi_host_template代表了一个scsi host的基础定义模板,任何一个scsi控制器都需要定义此数据结构,而此处的scsi控制器就是ufs控制器

  • UFS HOST物理层
    实际的scsi控制器驱动层,实现了对特定平台的scsi host的寄存器操作,此处就是高通平台的UFS控制器

3. UFS模块框图

4. UFS领域模型


上图是整个UFS驱动的核心框图,它主要由UTRD, UCD, UTMD以及一些data buffer构成。UFS host驱动通过分配和使用UTRD描述符和UTMRD描述符来与host控制器硬件通信。host控制器系统内存可以同时接受多达32个UTRD描述符和8个UTMRD描述符,他们分别组成了UTRD LIST和UTMRD LIST。每个UTRD描述符指向一个UCD区域,UCD包括了command UPIU区域、response UPIU区域以及PRDT区域。其中command UPIU区域和response UPIU区域将来用于存放组装的UPIU;而PRDT区域指向了一些sg segments,PRDT表中的每一项用于管理一个sg segment,即一段数据buffer,存储需要传输的数据或要接受的数据。UTRD LIST的地址和UTMRD LIST的地址分别告知UFS HOST CONTROLLER的UTP Transfer Request和UTP Task Management Request寄存器,这样UFS控制器可以自动发送和接收UPIU。

上图也体现出了ufs驱动的核心数据结构之间的关系,所有的utp_transfer_req_desc(UTRD)组成一个UTRD LIST,一共可达32个,list中的每一项用于管理一个utp_transfer_cmd_desc(UCD),UCD也有32个,utp_transfer_req_desc(UTRD)的command_desc_base_addr指向了一个utp_transfer_cmd_desc(UCD),command_desc_base_addr是一个DMA地址。
utp_transfer_cmd_desc(UCD)由command upiu, response upiu和prd_table构成,ufshcd_lrb的ucd_req_ptr/ucd_req_dma_addr、
ucd_rsp_ptr/ucd_rsp_dma_addr、ucd_prdt_ptr/ucd_prdt_dma_addr就分别指向了这些区域,ufshcd_lrb同样有32个,因此utp_transfer_req_desc(UTRD)、utp_transfer_cmd_desc(UCD)、ufshcd_lrb是一一对应的关系。

  • ufs_hba
    每个ufs控制器的私有数据,对于高通的UFS控制器,它的 priv成员变量一般指向了struct ufs_qcom_host

  • Scsi_Host
    代表scsi子系统层级的的host,它struct scsi_host_template *hostt与struct scsi_host_template关联,它是在ufshcd_alloc_host时分配得到的

  • struct scsi_host_template
    是scsi_host在下一层级子系统(如UFS)的代表,如对于ufs子系统实现为ufshcd_driver_template。ufshcd_driver_template为scsi子系统定义的scsi_host操作函数集模板,ufs host作为scsi_host也要实现这套模板,主要定义在ufshcd.c中

  • ufs_qcom_host:
    表示一个ufs控制器,它通过成员变量*hba与struct ufs_hba关联,它在ufs_qcom_init时被创建

  • utp_transfer_req_desc
    UTRD描述符,数目为32个。UTP传输请求描述符结构体(UTRD),包含了头、UCD UPIU物理地址(来源于struct utp_transfer_cmd_desc分配DMA带出的物理地址)、Response 长度和偏移、PRDT长度和偏移。

  • struct utp_task_req_desc
    UTP任务管理请求描述符结构体(UTMRD),数目为8个,包含了头、请求UPIU、响应UPIU

  • utp_transfer_cmd_desc
    UCD描述符,数目为32个。包含了command upiu和response upiu空间,以及一个维护多个内存segment的prd_table。UCD包含CMD UPIU缓冲区, RESPONSE UPIU缓冲区, PRD TABLE缓冲区,也即是说UCD描述的就是三个缓冲区,这里命令缓冲区除了存放command CDB,也可以存放query request,同样响应UPIU缓冲区除了可以存放command响应UPIU,也可以存放query request的响应UPIU;

  • ufshcd_sg_entry
    用于描述每个内存segment的起始地址和长度

  • request_desc_header
    为utp_transfer_req_desc(UTRD)和utp_task_req_desc(UTMRD)的头

  • ufshcd_lrb
    local reference block,数目与utp_transfer_req_desc(UTRD)和utp_transfer_cmd_desc(UCD)的一致,它为执牛耳者,将命令描述符结构体UCD的command_upiu,response_upiu,prd_table的地址保存到自己的结构体中。ufshcd_lrb,utp_transfer_req_desc与utp_transfer_cmd_desc是一一对应的,ufshcd_lrb的ucd_req_ptr/ucd_req_dma_addr, ucd_rsp_ptr/ucd_rsp_dma_addr,, ucd_prdt_ptr/ucd_prdt_dma_addr分别保存了utp_transfer_cmd_desc的command_upiu地址,response_upiu地址,prd_table地址。


  • utp_upiu_cmd
    代表cmd upiu结构体,主要包含了 数据传输长度,CDB(command descriptor block),此结构体没有包含header,由utp_upiu_req将utp_upiu_header和utp_upiu_cmd进行组装

  • utp_cmd_rsp
    代表response upiu结构体,它与utp_upiu_cmd相对应
    注:utp_upiu_cmd和utp_cmd_rsp对应APP layer的UCS

  • utp_upiu_query
    代表query request upiu和query response upiu结构体,此结构体没有包含header,由utp_upiu_req将utp_upiu_header和utp_upiu_query进行组装
    注:utp_upiu_query对应APP layer的device manager

  • utp_upiu_req
    通用的UPIU REQUEST结构体,它代表了COMMAND UPIU或QUERY REQUEST UPIU,某一时刻只能用作一种。它是在封装UPIU之前的数据,如果是一个COMMAND UPIU,则会封装为一个CDB

  • utp_upiu_rsp
    通用的UPIU RESPONSE结构体,它代表了COMMAND RESPONSE UPIU或QUERY RESPONSE UPIU,某一时刻只能用作一种

  • utp_upiu_task_req
    代表task request upiu结构体

  • utp_upiu_task_rsp
    代表task response upiu结构体
    注:utp_upiu_task_req和utp_upiu_task_rsp对应APP layer的task manager

  • utp_upiu_header
    upiu的头

  • ufs_query_req
    代表查询请求query request,即QUERY REQUEST UPIU

  • ufs_query_res
    代表查询响应query response, 即QUERY RESPONSE UPIU
    注:ufs_query_req和ufs_query_res对应APP layer的device manager

参考文档

存储技术原理分析

SCSI子系统基础学习笔记 (之UFS子系统) - 1.2 概述(软件部分)相关推荐

  1. SCSI子系统基础学习笔记 (之UFS子系统) - 2.1UFS子系统初始化之ufs_qcom_probe

    目录 1. 前言 2.ufs_qcom_probe |- -ufshcd_alloc_host |- -ufshcd_init 参考文档 1. 前言 本专题我们开始学习SCSI子系统的相关内容.本专题 ...

  2. SCSI子系统基础学习笔记 (之UFS子系统) - 2.2 UFS子系统初始化之ufshcd_async_scan

    目录 1. 前言 2. ufshcd_async_scan |- -ufshcd_probe_hba |- -ufshcd_add_lus 3. 总结 参考文档 1. 前言 本专题我们开始学习SCSI ...

  3. SCSI子系统基础学习笔记 (之UFS子系统) - 3. UFS命令处理

    目录 1. 前言 2. scsi_queue_rq |- -ufshcd_queuecommand 3. ufshcd_intr 1. 前言 本专题我们开始学习SCSI子系统的相关内容.本专题主要参考 ...

  4. Android编译及编译脚本、Android构建基础学习笔记

    Android编译及编译脚本.Android构建基础学习笔记 Android编译及编译脚本 概述 Android.mk转换成Android.bp 例子(简单Android.mk文件转Android.b ...

  5. guido正式发布python年份_Python 基础学习笔记.docx

    Python 基础学习笔记 基于<Python语言程序设计基础(第2版)> 第一部分 初识Python语言 第1章 程序设计基本方法 1.1 计算机的概念 计算机是根据指令操作数据的设备, ...

  6. ASP.Net MVC开发基础学习笔记(5):区域、模板页与WebAPI初步

    http://blog.jobbole.com/85008/ ASP.Net MVC开发基础学习笔记(5):区域.模板页与WebAPI初步 2015/03/17 · IT技术 · .Net, Asp. ...

  7. Python3 基础学习笔记 C09【文件和异常】

    CSDN 课程推荐:<8小时Python零基础轻松入门>,讲师齐伟,苏州研途教育科技有限公司CTO,苏州大学应用统计专业硕士生指导委员会委员:已出版<跟老齐学Python:轻松入门& ...

  8. Python3 基础学习笔记 C08 【类】

    CSDN 课程推荐:<8小时Python零基础轻松入门>,讲师齐伟,苏州研途教育科技有限公司CTO,苏州大学应用统计专业硕士生指导委员会委员:已出版<跟老齐学Python:轻松入门& ...

  9. Python3 基础学习笔记 C07【函数】

    CSDN 课程推荐:<8小时Python零基础轻松入门>,讲师齐伟,苏州研途教育科技有限公司CTO,苏州大学应用统计专业硕士生指导委员会委员:已出版<跟老齐学Python:轻松入门& ...

最新文章

  1. java字符串去重复_Java 8新特性:字符串去重
  2. AI一分钟|腾讯AI绝艺让二子,仍战胜柯洁;Google与腾讯达成专利交叉授权许可协议
  3. 对象序列化与反序列化
  4. Bitcoin ABC近半数节点已经完成了版本更迭
  5. MySQL 5.7 并行复制参数优化
  6. wcf:rest_REST:管理多对多关系
  7. 好家伙,这才是最强的目标检测落地模型!
  8. API的过去,现在与未来
  9. eclipse运行maven项目,tomcat启动报错
  10. Git学习系列(三)版本回退和管理文件的修改及删除操作
  11. 社区活动 | Apache Flink 1.9 版本即将发布,新版本有哪些新特性?
  12. Python.Algorithms(2nd)pdf
  13. ipynb pycharm 运行_Mask RCNN代码之demo.ipynb运行与理解
  14. PE启动盘安装操作系统
  15. HCIA-RS(2019最新题库)
  16. 轮式联合收割机液压系统设计
  17. 使用命令修改注册表键值及权限
  18. 计算机组装所需硬件,电脑组装机配置清单
  19. SA上传吞吐率优化经验总结
  20. Visual C++黑白棋游戏项目开发一:需求分析、系统架构设计(附源码和资源 可用于大作业)

热门文章

  1. 二维灰度地形图山脊线自动提取方法整理(MST)
  2. Vue3 京东到家项目实战第一篇(首页及登录功能开发) 进阶式掌握vue3完整知识体系
  3. mysql订单迁移es_京东到家订单中心系统mysql到es的转化之路
  4. 有人说“星座对自己的运势预测和性格描述很准”。请谈读你的看法。 “星座热”的社会学解读
  5. 055.Javascript初探
  6. 小学计算机课教案表格,小学信息技术教学设计《插入表格》
  7. BLDC无刷直流电机之电机驱动的组成
  8. 2020年节假日JSON,全年日期对应的上班日、周末、节假日
  9. 火山PC(火山视窗)超级列表框使用案例教程
  10. 【docker】导入镜像报错磁盘空间不足的解决方法 【docker】修改默认的存储路径