Resource Descriptors for ACPI

时间:2024-04-06 17:06:45

综述

在ACPI中,描述设备的时候需要知道它需求的资源,这个时候就需要使用到Resource Descriptor这样一种结构。

在ASL语言中,有一大类的操作符就是用来创建Resource Descriptor的,如下图所示(来自《ACPI Spec》, 下同):

Resource Descriptors for ACPI

关于这些Resource Descriptor,大致可以分为两类,它们是根据Resource Descriptor结构体占据的大小作区分的,分别是Small Resource Data Type和Large Resource Data Type 。


Small Resource Data Type

这种类型的Resource Descriptor总大小一般是2到8个字节,具体各个字节的描述如下图所示:

Resource Descriptors for ACPI

第一个字节表示了Resource Descriptor的类型(包括是Small还是Large以及具体是那种设备或者功能类型)、长度(3个BIT,所以最长是8个字节,包括第一个字节)以及类型(BIT3-6共4个字节,所以最多有16个类型)

之后的字节对于不同类型的Resource Descriptor有不同的表示。

Small Resource Data Type有如下的几种类型:
Resource Descriptors for ACPI

下面具体说明每一种类型以及对应的ASL操作符。


IRQ Descriptor

这种类型的Resource Descriptor表示了设备支持的中断号及其它相关信息。

这个Descriptor只能处理IRQ个数为15的情况(两个8259控制器级联,可以参考BIOS/UEFI基础——x86架构中断基础介绍,它包含16位共两个字节来表示IRQ个数。

另外描述中断信息还需要一个字节。因此最多四个字节,如下所示:

Resource Descriptors for ACPI

Resource Descriptors for ACPI

需要注意的是Byte 3是可选的,如果没有就使用默认的配置。

IRQ Descriptor对应的ASL操作符是IRQ和IRQNoFlags,其中IRQNoFlags就对应Byte 3不存在的情况。这两个操作符的用法如下所示:

Resource Descriptors for ACPI


DMA Descriptor

这种类型的Resource Descriptor描述了设备使用的DMA资源,包括DMA Channel和相关的属性,如下图所示:

Resource Descriptors for ACPI

Resource Descriptors for ACPI

DMA Descriptor对应的ASL操作符是DMA,具体的用法和举例如下所示:

Resource Descriptors for ACPI


Start Dependent Functions Descriptor和End Dependent Functions Descriptor 

这两个Descriptor是用来描述逻辑设备的资源的,它描述的是系统在为逻辑设备分配资源时需要处理的依赖关系(这些资源要被同时生成和释放)。

至于逻辑设备是怎么样的,目前不是很清楚,至于所谓的依赖关系是什么,也不是很清楚......

Start Dependent Functions Descriptor的结构如下所示:

Resource Descriptors for ACPI

Resource Descriptors for ACPI

其中Byte 1是可选的,如果没有则是默认的Acceptable。

Start Dependent Functions Descriptor对应的ASL操作符是StartDependentFn和StartDependentFnNoPri。后者就是没有Byte 1的情况。

具体的使用方法如下:

Resource Descriptors for ACPI

End dependent Functions Descriptor的结构如下所示:

Resource Descriptors for ACPI

它没有额外的字节表示。

对应的ASL操作符是EndDependentFn,其使用方式如下所示:

Resource Descriptors for ACPI


I/O Port Descriptor

用来描述设备的IO资源,包括IO地址的最小值、最大值(都是16位的),对齐值和长度,以及16BIT还是10BIT解析(即IO地址中的这16位是全用还是只用其中10位)。

这是其中的一种形式,后面还会讲到另外一种。这是最全面的一种,甚至已经覆盖了后一种。它的结构如下:

Resource Descriptors for ACPI

对应的ASL操作符是IO,使用方式如下所示:

Resource Descriptors for ACPI


Fixed Location I/O Port Descriptor

这个就是前面说的另一种表示设备IO资源的描述符。它主要用于老的ISA卡那种使用固定的IO地址且10位Decode的设备。

它的结构体如下所示:

Resource Descriptors for ACPI

对应的ASL操作符是FixedIO,它的使用方式如下所示:

Resource Descriptors for ACPI


Fixed DMA Descriptor

Fixed DMA descriptor使系统可以给跟共享DMA控制器连接的设备分配静态的DMA Request Line和Channel。

相比DMA Descriptor,它支持更多的Line和Channel。

下面是Fixed DMA descriptor结构体的表示:

Resource Descriptors for ACPI

它对应的ASL操作符是FixedDMA,其使用方式如下:

Resource Descriptors for ACPI


Vendor-Defined Descriptor

这个是给OEM使用的结构体,大致是下面的样子:

Resource Descriptors for ACPI

它也有对应的ASL操作符VendorShort,使用方式如下:

Resource Descriptors for ACPI


End Tag

这个是ASL编译器自动生成的,结构如下:

Resource Descriptors for ACPI

因为是自动生成的,所以没有对应的ASL操作符。


Large Resource Data Type

这里Resource Descriptor与Small Resource Data Type相比也就占据的字节数更多一点而已。它有16BIT表示长度,因此最大占据64K字节。

它的结构大致如下所示:

Resource Descriptors for ACPI

它的种类有以下一些:

Resource Descriptors for ACPI

Resource Descriptors for ACPI

下面具体说明每一种类型以及对应的ASL操作符。


24-Bit Memory Range Descriptor 

用于描述设备需要的24位Memory空间。具体的结构如下所示:

Resource Descriptors for ACPI

Resource Descriptors for ACPI

它对应的ASL操作符是Memory24,具体的使用方式如下所示:

Resource Descriptors for ACPI

新版本已经不再使用这个操作符,所以不需要特别关注。


Vendor-Defined Descriptor

它也Small Resource Data Type里面的Vendor-Defined Descriptor没有本质的区别,只是变得更大了,下面是结构描述:

Resource Descriptors for ACPI

它对应的ASL操作符是VendorLong,使用方式如下所示:

Resource Descriptors for ACPI


32-Bit Memory Range Descriptor

描述了设备需要的Memory资源,使用32位地址空间。其结构如下所示:

Resource Descriptors for ACPI

Resource Descriptors for ACPI

它描述的内容包括以下的几个部分,Memory地址最小值、最大值、对齐、长度和是否可写。内容并不多,只是因为地址有32位,所以导致结构变大。

它对应的ASL操作符是Memory32,具体的使用方式如下:

Resource Descriptors for ACPI


32-Bit Fixed Memory Range Descriptor

它也是描述设备需要的Memory资源,也是32位地址空间。

不同之处是它里面描述的地址是固定的。其结构如下所示:

Resource Descriptors for ACPI

它对应的ASL操作符是Memory32Fixed,其使用方式如下所示:

Resource Descriptors for ACPI


Address Space Resource Descriptors

这类Descriptor下面还包含不同类型的Descriptor,分别是QWORD, DWORD, WORD, 和Extended Address Space Descriptor。

它们属于通用的地址资源描述符,可以用来表示Memory资源和IO资源。

具体的结构不再这里描述了,太多了,也太大了,可以参考《ACPI Spec》。

它们对应的ASL操作符很多,有如下的一些:

QWordIO 、QWordMemory 、QWordSpace、DWordIO 、DWordMemory 、DWordSpace WordIO 、WordBusNumber 、WordSpace和ExtendedSpace 。

这里也不一一介绍了。

需要注意的是没有WordMemory,而有一个WordBusNumber。


Extended Interrupt Descriptor

之前有一个IRQ Descriptor,它只能有15个中断,但是对于多于15个中断的情况,就需要使用到这里的Extended Interrupt Descriptor。

它的结构如下所示:

Resource Descriptors for ACPI

Resource Descriptors for ACPI

上述的结构中描述的中断的属性,并定义了所有的中断号。

可以看出它也可以用于8258构成的只有15个中断的系统,此时如果定义了多于15个的中断,那么多出来的部分会被忽略。

它对应的ASL操作符是Interrupt,它的使用方式如下:

Resource Descriptors for ACPI


Generic Register Descriptor

描述在ACPI定义的地址空间中的固定地址的某段寄存器空间。

ACPI定义的地址空间有如下的几种:System Memory、System IO、PCI Configuration Space、Embedded Controller、SMBus、PCC、Functional Fixed Hardware。

下面是具体的结构定义:

Resource Descriptors for ACPI

Resource Descriptors for ACPI

对应的ASL操作符是Register,其使用方式如下:

Resource Descriptors for ACPI


Connection Descriptors

这类Descriptor也包含多个,有GPIO Connection Descriptor和Serial Bus Connection Descriptors,后者又分为I2C Serial Bus Connection Resource Descriptor 、SPI Serial Bus Connection Resource Descriptor和UART Serial Bus Connection Descriptor 。

它们对应的ASL操作符有GpioInt、GpioIO、I2CSerialBusV2、SPISerialBusV2和UARTSerialBusV2。

涉及的内容太多,这里也不一一介绍了,具体参考《ACPI Spec》