龙芯平台切换设备状态方法

PCI & PCIE设备的电源管理

一.关于PCI和PCIE设备的电源管理,有兴趣的可以阅读:
		PCI Express 3.0.pdf
		PCI_Power_Management_12.pdf
		这两个文档讲述PCI电源管理的内容都比较详细,但是侧重点略有不同.
		
1. 在PCI_Power_Management_12里面首先讲解了ASPM系统:
	主动状态电源管理(ASPM)是一种基于硬件的自主主动状态机制,它定义了Link电源管理状态,
	该状态允许PCI Express物理Link进入,以响应软件驱动的d状态转换或主动状态Link电源管理活动。
	PCI Express Link状态对遗留总线驱动程序软件不直接可见,
	但它来自于驻留在这些Link上的组件的电源管理状态。
	自定义链路状态包括L0、L0、L1、L2和L3。当Link状态从L0过渡到L3时,节省的功耗会增加。
	也就是说ASMP 上面规定的从L0~L3这些链路状态的切换的机制对于软件来说是"透明的".

在这里插入图片描述
在这里插入图片描述

	在L0向L3切换的过程中,我们可以看到硬件上参与供电的辅助电源是越来越少的,
	这也会使得对应设备的状态由D0到D3进行切换.
	
	PCI_Power_Management 规范中规定了:
			处于D3热状态的函数可以通过软件(写入其PMCSR PowerState字段)转换为
			D0活动状态或D0未初始化状态。注意,在从D3热转换到D0期间或紧接着之后,
			函数不需要生成内部硬件重置(参见PMCSR中No_Soft_Reset位的使用)。
			当主电源被移除时,函数转换到D3冷状态。一个上电序列及其相关的冷重置将一个函数
			从D3冷状态转换为D0未初始化状态。此时,软件必须对Function执行完整的初始化,
			以便重新建立所有的功能上下文,完成Function恢复到D0活动状态。
			支持从D3冷唤醒功能的函数必须维护其PME上下文(在PMCSR中),
			以便在恢复过程中由PME服务例程软件检查。
			
			也就是说软件上是支持往PMCSR寄存器中写数据,来完成设备从D0到D3的状态切换的.
			
2.	具体的切换步骤:
		a. 看PCI 的配置空间是否是标准的PCI配置空间

在这里插入图片描述

		b.如上图,如果Status寄存器存在,且Status的bit4位设置成了1,
		  那么说明它有切换设备状态的能力
		c.找到Cap_ptr (偏移地址是0x34),它里面一般来说会存一个地址
		  以PCI to PCI桥为例,其偏移地址是 0x40
		d.根据偏移地址找到偏移为4的寄存器,它里面的bit0和bit1指示当前的设备的状态
		e. 往bit 0和bit 1 中写入相应的数据即可完成设备状态的切换
			内核中定义的各个状态的数值:
			#define PCI_D0    ((pci_power_t __force) 0)
			#define PCI_D1    ((pci_power_t __force) 1)
			#define PCI_D2    ((pci_power_t __force) 2)
			#define PCI_D3hot ((pci_power_t __force) 3)
			#define PCI_D3cold  ((pci_power_t __force) 4)
			#define PCI_UNKNOWN ((pci_power_t __force) 5)
			#define PCI_POWER_ERROR ((pci_power_t __force) -1)
		下面以一个具体的设备(pci to pci)来说明:
		cpu0 -d4 0x80000efdfe004800 0x20;cont 
		#d4 0x80000efdfe004800 0x20
		80000efdfe004800: 7a190014 00100007 06040002 00010000 ...z............
		80000efdfe004810: 252a6004 00000000 00010100 00004141 .`*%........AA..
		80000efdfe004820: 25002500 0001fff1 00000000 00000000 .%.%............
		80000efdfe004830: 00000000 00000040 00000000 00000160 ....@.......`...
		80000efdfe004840: dfc35001 00000000 00000000 00000000 .P..............
		80000efdfe004850: 00807005 00000000 00000000 00000000 .p..............
		80000efdfe004860: 00000000 00000000 00000000 00000000 ................
		80000efdfe004870: 00420010 00008001 00100010 00733c42 ..B.........B<s.
		#cont 
		 根据上面所述,可以看出PCI 配置空间中是有Status寄存器的,且其值为1,说明有电源管理的能力.
		 其次,偏移为0x34中记录的偏移地址是0x40(注意: 这里面也可能是一个数字,直接代表设备的状态,
		 不需要再往下找),也就是说cap_ptr的地址是0x80000efdfe004840.
		 而,cap_ptr的bit4为现在的数值是0,根据内核中规定的各状态的数值可知当前处于D0状态.
		 所以要将其切换为D3状态,如下操作即可:		 
		/*
  		Switch pci bridge 00:09.0 to D3
		*/
		m4 0x80000efdfe004844 0x03;cont

		依照上述方法可以将其他设备都切换成D3状态.
		/*
		  Switch pci bridge 00:0b.0 to D3
		*/
		m4 0x80000efdfe005844 0x03;cont


		/*
		  Switch pci bridge 00:0c.0 to D3
		*/
		m4 0x80000efdfe006044 0x03;cont
		/*
		  Switch pci bridge 00:0d.0 to D3
		*/
		m4 0x80000efdfe006844 0x03;cont

		/*
		  Switch USB Contorller to D3
		*/

		m4 0x80000efdff010054 0x0b;cont

		/*
		  Switch Ethernet Controller to D3
		*/
		m4 0x80000efdff020044 0x0b;cont

		/*
		  Switch Network Controller to D3
		*/
		m4 0x80000efdff0300cc 0x03;cont


		/*	
		  Switch Non-Volatile Memory Controller to D3
		*/
		m4 0x80000efdff040044 0x0b;cont

二. 龙芯平台下关闭HT0 PHY的方法:
		这里面需要注意的是不是关闭HT0 控制器(一般来说关控制器只需要关闭控制器的时钟即可),
		这里面说的关闭HT0的PHY
		/*
	  		Close the ht0 PHY
		*/
		m8 0x800000001fe00400 0x00f0a000400020f0;cont 
		m8 0x800000001fe00180 0x3d00ffbbb8003590;cont  

		m4 0x80000afdfb000044 0x91;cont 

		m8 0x800000001fe00400 0x00f0b000400020f0;cont 
		m8 0x800000001fe00180 0x3d00ffbbb0003590;cont 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘德华海淀分华

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值