UFS DMA介绍

一. Linux DMA简介

我们知道DMA是Direct Memory Access, 不需要CPU的参与,也可以直接访问内存中的数据。

CPU 虚拟地址:内核空间由于有MMU内存管理,正常使用的是虚拟地址

CPU物理地址:virtual memory system (TLB, page tables, etc) 会将CPU虚拟地址转换为物理地址。

总线地址: IO设备主要使用的是总线地址,如果一个设备在MMIO地址上有寄存器,或者如果它执行DMA来读取或写入系统存储器,那么该设备使用的地址就是总线地址。在一些系统中,总线地址与CPU物理地址相同,但通常情况下并非如此。IOMMU和主机桥可以在物理地址和总线地址之间产生任意映射。

在一些简单的系统中,设备可以直接对物理地址Y进行DMA。但在许多其他系统中,有IOMMU硬件可以将DMA地址转换为物理地址,例如,它将Z转换为Y。这是DMA API的部分原因:驱动程序可以向DMA_map_single()等接口提供虚拟地址X,它设置任何所需的IOMMU映射并返回DMA地址Z。然后驱动程序告诉设备进行DMA到Z,IOMMU将其映射到系统RAM中地址Y处的缓冲区。

为了让Linux能够使用动态DMA映射,它需要来自驱动程序的一些帮助,也就是说,它必须考虑到DMA地址应该只在实际使用时映射,并且在DMA传输后取消映射。

二. UFS DMA 概述

UFS作为块设备,读写操作进行时,数据传输的时候还是非常耗时的,如果一直需要靠CPU参与,势必会影响系统整体的调度,所有UFS子系统也会引入DMA机制,

(1)在数据准备阶段CPU参与,

(2)数据传输阶段CPU不参与,移交控制器交给DMA处理,

(3)数据传输处理完成后,DMA返还控制权给CPU。

 三. UFS DMA 详解

UFS作为块设备传输,非常占用CPU的时间,为了解放CPU,UFS数据传输采用DMA的方式。

1 . 设置DMA的寻址能力

目前现在都是ARM64架构,64位系统,所以将DMA寻址能力设置为64位寻址,能够最大化DMA的寻址能力

ufshcd_set_dma_mask 

/**
 * ufshcd_set_dma_mask - Set dma mask based on the controller
 *			 addressing capability
 * @hba: per adapter instance
 *
 * Returns 0 for success, non-zero for failure
 */
static int ufshcd_set_dma_mask(struct ufs_hba *hba)
{
	if (hba->capabilities & MASK_64_ADDRESSING_SUPPORT) {
		if (!dma_set_mask_and_coherent(hba->dev, DMA_BIT_MASK(64)))
			return 0;
	}
	return dma_set_mask_and_coherent(hba->dev, DMA_BIT_MASK(32));
}

2 .分配UFS Host 数据结构的DMA内存

主要是包括UCD(Command UPIU, Response UPIU, PRDT), UTP Transfer Request Descriptor(UTRDL), UTP Task Management Request Descriprtor(UTMRDL)

(1) UTP Command Descriptor Base Address: 128Byte内存对齐

 (2) UTP Transfer Request List Base Addr: 1KB内存对齐


                
### UFS协议简介 UFS(Universal Flash Storage)是一种基于MIPI M-PHY和Unipro技术的高速存储接口标准,广泛应用于移动设备和其他高性能嵌入式系统中。该协议由JEDEC固态技术协会制定,旨在提供更高的性能、更低的功耗以及更可靠的存储解决方案。 #### 协议版本演进 UFS的发展经历了多个重要阶段,其中一些关键版本及其特性如下: - **UFS 2.1**:于2016年由JEDEC发布,在此版本中引入了HS-G3通道作为必选项[^3]。这使得数据传输速率显著提升,并增强了整体系统的可靠性。 - **UFS 3.1**:这是目前较为先进的版本之一,它不仅继承和发展了前代产品的优点,还通过优化命令队列管理等功能进一步提高了效率与速度[^1]。 #### 工作原理概述 UTP(UFS Transport Protocol Layer Specification)层的设计具有以下几个突出特点: - 支持全双工通信模式,允许读取和写入操作同时进行; - 利用SCSI架构模型来定义逻辑单元号(LUN),从而实现多任务处理能力; - 提供多种机制保障信息安全,比如对于写保护功能而言,在EMMC上独立存在的概念被改变为依赖RPMB LU来进行安全管理[^2]; 此外,在驱动程序加载过程中会经历一系列必要的初始化步骤,包括但不限于完成数据结构设置、注册相应中断源、分配并配置控制器所需的DMA缓冲区资源等动作[^4]。 #### 技术优势分析 相比其他类型的非易失性存储介质如eMMC来说,UFS具备明显的技术领先之处,主要体现在以下几个方面: - 更高的吞吐量; - 出色的能量利用率表现; - 增强的数据完整性和安全性措施. ```python def initialize_ufs_controller(): """ Simulates the initialization process of a UFS controller as described. Returns: str: A message indicating successful initialization. """ data_structure_initialized = True interrupts_registered = True dma_memory_configured = True if all([data_structure_initialized,interrupts_registered,dma_memory_configured]): return "UFS Controller Initialized Successfully" else: return "Initialization Failed" print(initialize_ufs_controller()) ``` 上述代码片段模拟了一个简化版的UFS 控制器初始化流程函数 `initialize_ufs_controller` ,展示了如何验证不同组件的状态以确认整个过程顺利完成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值