Edge server项目Bring up系列文章(二)

系列文章目录

第一章 Uefi Gpio配置原理
第二章 总结


文章目录

系列文章目录前言第一章 Uefi Gpio配置原理第二章、总结


前言

前面介绍了整体的Bring Up需要事项,本文中主要深入的介绍BU过程中GPIO合入配置。


第一章 Uefi Gpio配置原理

配置GPIO首先需要配置客户提供的gpio pin和function的对接。这里例举某项目的GPIO Table:


#GPIO
BE4	GPIO151/PM_GPIO0	1.8V	S0	Push-Pull	Pull Up		PMIC0_I2C_INT_L	input	Reserved,PMIC0 Interrupt event to alert SOC; Low active
BE5	GPIO152/PM_GPIO1	1.8V	S0	Push-Pull	Pull Up		PMIC1_I2C_INT_L	input	Reserved,PMIC1 Interrupt event to alert SOC; Low active
BF4	GPIO153/PM_GPIO2	1.8V	S0	Push-Pull	Pull Up		GPIO153/PM_GPIO2		
#SSD
T4	GPIO004	1.8V	S5	Push-Pull	Pull Down		M2_NVME_RST_L	output	To reset PCIe devices; SSD
#LAN
W8	GPIO005	1.8V	S5	Push-Pull	Pull Down		ETH_PWR_CTL	output	RTL8111HS Power Enable
T5	GPIO006	1.8V	S5	Push-Pull	Pull Down		LOM_RST_L	output	PCIE LAN“PERST#” signal, Low Active

在GPIO_CFG结构体中有5个参数,参数意义如下:

参数 描述
NUM GPIO的序号(1为最小GPIO 序号)
Direction GPIO配置输入、输出的选择
OutputVal 当GPIO配置成输出时,GPIO所输出的电平值
IntrEn GPIO中断的使能,1为使能
IntrType GPIO中断触发方式的选择

typedef struct _GPIO_CFG {

UINT32                     Num;

IO_DIRECTION_SEL           Direction;

IO_INOUT_VALUE_SEL         OutputVal;

IO_INTERRUPT_ENABLE_SEL    IntrEn;

IO_INTERRUPT_TYPE_SEL      IntrType;

} GPIO_CFG;

GpioCfgTable中所需要的配置值均封装为宏定义,也可在头文件中查看或引用。

GPIO_CFG结构体中的Num 为以1为最小定义的GPIO序号的立即数定义GPIO_CFG结构体中的Direction域对应头文件中IO_DIRECTION_SEL枚举定义GPIO_CFG结构体中的OutputVal域对应头文件中以IO_INOUT_VALUE_SEL枚举定义GPIO_CFG结构体中的IntrEn域对应头文件中IO_INTERRUPT_ENABLE_SEL枚举定义GPIO_CFG结构体中的IntrType域对应头文件中IO_INTERRUPT_TYPE_SEL枚举定义

本平台支持5个PCIE Port,配置如下表:

Item Port0 Port1 Port2 Port3 Port4
Highest Generation Gen4 Gen4 Gen4 Gen4 Gen4
Max Lane Number 8 4 2 1 1
Reference Type GPU NVMe WWAN WIFI Ethernet

每个PCIE Port的开关配置如下[TRUE: Enable, FALSE: Disable]每个PCIE Port的Lane Number配置如下[0x00:X1, 0x01:X2, 0x02:X4, 0x03:X8]每个PCIE Port的Link Speed配置如下[0x01: GEN1, 0x02: GEN2, 0x03: GEN3, 0x04: GEN4]每个PCIE Port的Max Speed配置如下[0x00: GEN1, 0x01: GEN2, 0x02: GEN3, 0x03: GEN4]每个PCIE Port的Max ASPM Capability配置如下[0x00: Disable, 0x01: L0s, 0x02: L1, 0x03 L0sL1]每个PCIE Port的ASPM配置如下[0x00: Disable, 0x01: L0s, 0x02: L1, 0x03 L0sL1]每个PCIE Port的Max Payload配置如下[0x00: 128bytes, 0x01: 256bytes, 0x02: 512bytes]每个PCIE Port对应Reset GPIO Pin配置如下[0x00: None, 0x01: GPIO01 0x02: GPIO02…]

针对次特性,Edge项目需要在Platform/CIX/Sky1/Edge/Edge.dsc中配置Pcie gpio
图片[1] - Edge server项目Bring up系列文章(二) - 宋马
这里配置了nvme和ethernet的gpio reset pin,配置的逻辑:
按照Lane Numer : x4 = port1
x1 = port 3/4

原理图里SSD GPIO004 = reset pin
LAN GPIO006 = reset pin
所以:
gpio port1是ssd的reset pin,应该是GPIO 4


gCixTokenSpaceGuid.PcdPcieRootPort1PeResetPin|4

gpio port4是lan的reset pin,应该是GPIO 6


gCixTokenSpaceGuid.PcdPcieRootPort4PeResetPin|5

对应的GPIO_CFG GpioCfgTable[] 所需要了解的内容如下:
在本参考平台上,GPIO初始化代码已经被包入了 GPIO 初始化配置结构体中,参考代码在edk2-platforms/Platform/CIX/Sky1/Merak/Library/GpioTableLib/GpioTableLib.c


GPIO_CFG  GpioCfgTable[] = {
  { 1,   INPUT,             INOUT_VALUE_DEFAULT, INTERRUPT_DISABLE,        EDGE_LOW               }, // EC_HID_INT_L
  { 2,   OUTPUT,            INOUT_LOW,           INTERRUPT_ENABLE_DEFAULT, INTERRUPT_TYPE_DEFAULT }, // SLT_X8_RST_L
  { 3,   OUTPUT,            INOUT_LOW,           INTERRUPT_ENABLE_DEFAULT, INTERRUPT_TYPE_DEFAULT }, // SLT_X4_RST_L/M2_WWAN_RST_L
  { 4,   OUTPUT,            INOUT_LOW,           INTERRUPT_ENABLE_DEFAULT, INTERRUPT_TYPE_DEFAULT }, // M2_NVME_RST_L
  { 5,   OUTPUT,            INOUT_LOW,           INTERRUPT_ENABLE_DEFAULT, INTERRUPT_TYPE_DEFAULT }, // M2_WLAN_RST_L
  { 6,   OUTPUT,            INOUT_LOW,           INTERRUPT_ENABLE_DEFAULT, INTERRUPT_TYPE_DEFAULT }, // LOM_RST_L
  { 7,   INPUT,             INOUT_VALUE_DEFAULT, INTERRUPT_DISABLE,        EDGE_LOW               }, // EC_ACPI_INT_L
  { 8,   INPUT,             INOUT_VALUE_DEFAULT, INTERRUPT_DISABLE,        LEVEL_LOW              }, // I2C_INT_CPU_PD1
  { 9,   INPUT,             INOUT_VALUE_DEFAULT, INTERRUPT_DISABLE,        LEVEL_LOW              }, // I2C_INT_CPU_PD2
  { 10,  INPUT,             INOUT_VALUE_DEFAULT, INTERRUPT_ENABLE_DEFAULT, LEVEL_LOW              }, // TPAD_INT_L
  { 11,  INPUT,             INOUT_VALUE_DEFAULT, INTERRUPT_ENABLE_DEFAULT, LEVEL_LOW              }, // RTC_ALARM_L
  { 12,  OUTPUT,            INOUT_HIGH,          INTERRUPT_ENABLE_DEFAULT, INTERRUPT_TYPE_DEFAULT }, // M2_SSD_PWREN
  { 13,  OUTPUT,            INOUT_HIGH,          INTERRUPT_ENABLE_DEFAULT, INTERRUPT_TYPE_DEFAULT }, // WLAN_PWREN
  { 14,  INPUT,             INOUT_VALUE_DEFAULT, INTERRUPT_ENABLE_DEFAULT, LEVEL_LOW              }, // HP_MIC_DET#/EP_X8_RST_L
  { 30,  INPUT,             INOUT_VALUE_DEFAULT, INTERRUPT_ENABLE_DEFAULT, INTERRUPT_TYPE_DEFAULT }, // LOM_PEWAKE_L
  { 31,  INPUT,             INOUT_VALUE_DEFAULT, INTERRUPT_ENABLE_DEFAULT, INTERRUPT_TYPE_DEFAULT }, // SLT_X8_PEWAKE_L
  { 32,  INPUT,             INOUT_VALUE_DEFAULT, INTERRUPT_ENABLE_DEFAULT, INTERRUPT_TYPE_DEFAULT }, // WLAN_WAKE_L
  { 33,  INPUT,             INOUT_VALUE_DEFAULT, INTERRUPT_ENABLE_DEFAULT, INTERRUPT_TYPE_DEFAULT }, // SLT_X4_PEWAKE_L
  { 40,  INPUT,             INOUT_VALUE_DEFAULT, INTERRUPT_ENABLE_DEFAULT, INTERRUPT_TYPE_DEFAULT }, // UART_WAKE#_M2_SOC
  { 43,  OUTPUT,            INOUT_HIGH,          INTERRUPT_ENABLE_DEFAULT, INTERRUPT_TYPE_DEFAULT }, // GMAC0_PHY_RESET_L
  { 44,  OUTPUT,            INOUT_HIGH,          INTERRUPT_ENABLE_DEFAULT, INTERRUPT_TYPE_DEFAULT }, // GMAC1_PHY_RESET_L
  { 45,  INPUT,             INOUT_VALUE_DEFAULT, INTERRUPT_ENABLE_DEFAULT, LEVEL_LOW              }, // GMAC0_INT_L
  { 46,  INPUT,             INOUT_VALUE_DEFAULT, INTERRUPT_ENABLE_DEFAULT, LEVEL_LOW              }, // GMAC1_INT_L
  { 81,  OUTPUT,            INOUT_HIGH,          INTERRUPT_ENABLE_DEFAULT, INTERRUPT_TYPE_DEFAULT }, // IR_EN
  { 82,  OUTPUT,            INOUT_HIGH,          INTERRUPT_ENABLE_DEFAULT, INTERRUPT_TYPE_DEFAULT }, // CAM2_PWDN
  { 83,  OUTPUT,            INOUT_LOW,           INTERRUPT_ENABLE_DEFAULT, INTERRUPT_TYPE_DEFAULT }, // CAM2_PWREN
  { 84,  INPUT,             INOUT_VALUE_DEFAULT, INTERRUPT_ENABLE_DEFAULT, LEVEL_LOW              }, // TPM_INT_L
  { 85,  OUTPUT,            INOUT_LOW,           INTERRUPT_ENABLE_DEFAULT, INTERRUPT_TYPE_DEFAULT }, // CAM2_RST_L
  { 86,  OUTPUT,            INOUT_LOW,           INTERRUPT_ENABLE_DEFAULT, INTERRUPT_TYPE_DEFAULT }, // CAM3_PWREN
  { 87,  OUTPUT,            INOUT_LOW,           INTERRUPT_ENABLE_DEFAULT, INTERRUPT_TYPE_DEFAULT }, // CAM0_RST_L
  { 88,  OUTPUT,            INOUT_LOW,           INTERRUPT_ENABLE_DEFAULT, INTERRUPT_TYPE_DEFAULT }, // CAM3_RST_L
  { 89,  OUTPUT,            INOUT_HIGH,          INTERRUPT_ENABLE_DEFAULT, INTERRUPT_TYPE_DEFAULT }, // CAM3_PWDN
  { 90,  OUTPUT,            INOUT_HIGH,          INTERRUPT_ENABLE_DEFAULT, INTERRUPT_TYPE_DEFAULT }, // CAM0_PWDN
  { 91,  OUTPUT,            INOUT_LOW,           INTERRUPT_ENABLE_DEFAULT, INTERRUPT_TYPE_DEFAULT }, // CAM0_PWREN
  { 92,  OUTPUT,            INOUT_LOW,           INTERRUPT_ENABLE_DEFAULT, INTERRUPT_TYPE_DEFAULT }, // CAM1_RST_L
  { 93,  OUTPUT,            INOUT_LOW,           INTERRUPT_ENABLE_DEFAULT, INTERRUPT_TYPE_DEFAULT }, // CAM1_PWREN
  { 94,  OUTPUT,            INOUT_HIGH,          INTERRUPT_ENABLE_DEFAULT, INTERRUPT_TYPE_DEFAULT }, // CAM1_PWDN

在文件“GpioTableLib.c”里结构体GpioCfgTable是GPIO 初始化配置表。
按照客户原理图中提供的信息:


GPIO006 Push-Pull	Pull Down		LOM_RST_L	output	PCIE LAN“PERST#” signal, Low Active

gpio6 是控制power的,需要配置 INOUT_HIGH

第二章、总结

到这里gpio config和客户的特性以及对齐,接下来的章节,会配置DDR相关的配置,编译Bios在runtime debug系统启动情况。

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容