UFS Hibernate介绍--代码部分

一 . UFS Hibernate简介
摘要由CSDN通过智能技术生成

目录

一 . UFS Hibernate简介

二 . UFS Hibernate系统上的行为

1.Auto-Hibernation

2. Clk-gate with hibernate

3.suspend with hibernate


一 . UFS Hibernate简介

1. 系统 Soc上的UFS Host  Controller 模块处理完成命令和数据后,就会进入UFS Idle状态,也就是空闲状态, 也会调用UFS相关的PM Runtime的回调接口,执行对应的操作,进入UFS Idle之后,又会通过发送DME_HIBERNATE_ENTER命令让Link进入Hibernate状态,受影响的是本地和对等 UniPort(UniPro L1.5-L4 和 M-PHY)。

2. 当系统Soc上的UFS Host  Controller收到命令和数据请求后,又会会进入UFS Active状态,进入UFS Active状态之后,通过发送 DME_HIBERNATE_EXIT命令让Link出Hibernate状态。

Note: Link(链路)指的是也是本地端和远程端的数据通道,也可以理解为M-PHY层的M-TX和M-RX。
5.6.1 UniPro Link Management
869 An available Lane is a Lane that is implemented in the PHY. A Lane can
be either connected or unconnected, depending of the interconnection between
the local PHY and the remote PHY. The connection state is automatically
discovered during the Link Startup Sequence. An active Lane is used for 
data transfers while an inactive or unused Lane is not. The number of active
Lanes is set by PA_ActiveTxDataLanes and PA_ActiveRxDataLanes

二 . UFS Hibernate系统上的行为

UFS Hibernate在系统上有3种行为,分别为 Auto-Hibernate, Clk-gate with hibernate, suspend with hibernate(其中suspend分为runtime suspend和runtime suspend).

1. Auto-Hibernate

Auto-Hibernation是UFS Host Controller的一个功能,可以通过UFS Host Controller Register Offset 00h: CAP - Controller Capabilities Bit[23]的值来判断释放支持该功能,Bit[23] Vaue为1,说明支持 Auto-Hibernate功能,为0说明不支持 Auto-Hibernate.

 

 Auto-Hibernate功能完全是通过硬件去实现的,

主要过程:当UFS Host Controller处理完成命令和数据后,会间隔AHIT时间通过硬件层面给UFS Device发送DME_HIBERNATE_ENTER命令,全程系统软件无感知,所以通过Event Trace也抓不到对应的Event事件,想要验证这个过程,可以通过PA协议分析仪去做实验,分析Unipro协议包会有Hibernate的整个流程。

上文的AHIT指的是UFS Host Controller处理完成命令和数据后,会间隔一段时间,才发送DME_HIBERNATE_ENTER命令,这个间隔的时间指的就是AHIT

(1)这个AHIT可以通过系统软件去配置,

(2)这个AHIT值可以通过Sys节点去查询(不同的系统软件节点位置可能有差异)

# cat /sys/device/platform/soc/1d84000.ufshc/auto_hibern8
1000

UFS Hibernate实现相关:

ufshcd_init:初始化UFS Hibernate相关信息,设置Auto Hibernate的时间位1ms,即当UFS Host控制器空闲后,间隔1ms就会通过硬件下发DME_HIBERNATE_ENTER命令给UFS Device让Link处于Hibernate状态。

static void ufshcd_init_hibern8(struct ufs_hba *hba)
{
	struct ufs_hibern8_on_idle *h8 = &hba->hibern8_on_idle;

	/* initialize the state variable here */
	h8->state = HIBERN8_EXITED;

	if (!ufshcd_is_hibern8_on_idle_allowed(hba) &&
	    !ufshcd_is_auto_hibern8_supported(hba))
		return;

	if (ufshcd_is_auto_hibern8_supported(hba)) {
		/* Set the default auto-hiberate idle timer value to 1 ms */
		hba->ahit = FIELD_PREP(UFSHCI_AHIBERN8_TIMER_MASK, 1) |
			    FIELD_PREP(UFSHCI_AHIBERN8_SCALE_MASK, 3);
		h8->state = AUTO_HIBERN8;
		/*
		 * Disable SW hibern8 enter on idle in case
		 * auto hibern8 is supported
		 */
		hba->caps &= ~UFSHCD_CAP_HIBERN8_ENTER_ON_IDLE;
	} else {
		h8->delay_ms = 10;
		INIT_DELAYED_WORK(&hba->hibern8_on_idle.enter_work,
				  ufshcd_hibern8_enter_work);
		INIT_WORK(&hba->hibern8_on_idle.exit_work,
			  ufshcd_hibern8_exit_work);
		h8->is_enabled = true;

		h8->delay_attr.show = ufshcd_hibern8_on_idle_delay_show;
		h8->delay_attr.store = ufshcd_hibern8_on_idle_delay_store;
		sysfs_attr_init(&h8->delay_attr.attr);
		h8->delay_attr.attr.name = "hibern8_on_idle_delay_ms";
		h8->delay_attr.attr.mode = 0644;
		if (device_create_file(hba->dev, &h8->delay_attr))
			dev_err(hba->dev, "Failed to create sysfs for hibern8_on_idle_delay\n");

		h8->enable_attr.show = ufshcd_hibern8_on_idle_enable_sho
  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值