FreeBSD 中文社区 2025 第二季度问卷调查
FreeBSD 中文社区(CFC)
VitePress 镜像站QQ 群 787969044视频教程Ⅰ视频教程Ⅱ
  • FreeBSD 从入门到追忆
  • 中文期刊
  • 状态报告
  • 发行说明
  • 手册
  • 网络文章集锦
  • 笔记本支持报告
  • Port 开发者手册
  • 架构手册
  • 开发者手册
  • 中文 man 手册
  • 文章
  • 书籍
  • FreeBSD 中文期刊
  • 编辑日志
  • 2025-123 下游项目
    • FreeBSD 发布工程:新主管上任
    • GhostBSD:从易用到挣扎与重生
    • BSD Now 与将来
    • 字符设备驱动教程(第三部分)
    • 学会走路——连接 GPIO 系统
    • FreeBSD 中对 SYN 段的处理
    • FreeBSD 2024 年秋季峰会
  • 2024-1112 虚拟化
    • 字符设备驱动程序教程(第二部分)
    • 面向 Linux 和 Windows 用户的 bhyve
    • Xen 与 FreeBSD
    • Wifibox:一种嵌入式虚拟化无线路由器
    • 嵌入式 FreeBSD:Fabric——起步阶段
    • DGP:一种新的数据包控制方法
    • 会议报告:我在都柏林的 EuroBSDCon 体验
  • 2024-0910 内核开发
    • 字符设备驱动程序教程
    • VPP 移植到了 FreeBSD:基础用法
    • 利用 Kyua 的 Jail 功能提升 FreeBSD 测试套件的并行效率
    • FreeBSD 上的 Valgrind
    • 嵌入式 FreeBSD:探索 bhyve
    • TCP/IP 历险记:FreeBSD TCP 协议栈中的 Pacing
    • 实用软件:实现无纸化(Paperless)
  • 2024-0708 存储与文件系统
    • FreeBSD 中的 NVMe-oF
    • FreeBSD iSCSI 入门
    • 使用 ZFS 原生加密保护数据
    • 嵌入式 FreeBSD:打造自己的镜像
    • TCP LRO 简介
    • 基于 Samba 的时间机器备份
  • 2024-0506 配置管理对决
    • 基本系统中的 mfsBSD
    • rdist
    • Hashicorp Vault
    • 在 GitHub 上向 FreeBSD 提交 PR
    • 悼念 Mike Karels
    • 2024 年 5-6 月来信
    • 嵌入式 FreeBSD 面包板
    • TCP/IP 历险记:TCP BBLog
    • 实用软件:开发定制 Ansible 模块
  • 2024-0304 开发工作流与集成
    • FreeBSD 内核开发工作流程
    • FreeBSD 与 KDE 持续集成(CI)
    • 更现代的内核调试工具
    • 从零开始的 ZFS 镜像及 makefs -t zfs
    • 提升 Git 使用体验
  • 2024-0102 网络(十周年)
    • FreeBSD 中的 RACK 栈和替代 TCP 栈
    • FreeBSD 14 中有关 TCP 的更新
    • if_ovpn 还是 OpenVPN
    • SR-IOV 已成为 FreeBSD 的重要功能
    • FreeBSD 接口 API(IfAPI)
    • BATMAN:更优的可移动热点网络方式
    • 配置自己的 VPN——基于 FreeBSD、Wireguard、IPv6 和广告拦截
    • 实用软件:使用 Zabbix 监控主机
  • 2023-1112 FreeBSD 14.0
    • LinuxBoot:从 Linux 启动 FreeBSD
    • FreeBSD 容器镜像
    • 现在用 Webhook 触发我
    • 新的 Ports 提交者:oel Bodenmann (jbo@freebsd.org)
  • 2023-0910 Port 与软件包
    • 回忆录:与 Warner Losh(@imp)的访谈
    • 在你自己的仓库中定制 Poudriere 源
    • Wazuh 和 MITRE Caldera 在 FreeBSD Jail 中的使用
    • PEP 517
    • CCCamp 2023 旅行报告
  • 2023-0708 容器与云
    • 在 Firecracker 上的 FreeBSD
    • 使用 pot 和 nomad 管理 Jail
    • 会议报告:C 与 BSD 正如拉丁语与我们——一位神学家的旅程
    • 抒怀之旅:与 Doug Rabson 的访谈
    • 基于 Jail 的广告拦截教程
    • 我们收到的来信
  • 2023-0506 FreeBSD 三十周年纪念特刊
    • CheriBSD 近十多年的历程
    • AArch64:成为 FreeBSD 新的一级架构
    • 岁月如梭:我个人的时间线
    • 安装 FreeBSD 1.0:回顾 30 年前
    • ZFS 是如何进入 FreeBSD 的呢?
    • 我不是来自约克郡的,我保证!
    • 回忆录:采访 David Greenman Lawrence
    • FreeBSD 和早期的 Unix 社区
    • 早期的 FreeBSD 移植
    • FreeBSD 30 周年:成功的秘诀
    • FreeBSD 在日本:回忆之旅与今日之实
  • 2023-0304 嵌入式
    • CheriBSD port 和软件包
    • 让我们来试试 ChatGPT
    • GPU 直通
  • 2023-0102 构建 FreEBSD Web 服务器
    • ZFS 的原子 I/O 与 PostgreSQL
    • 虚拟实验室——BSD 编程研讨会
    • ZFS 简介
    • 会议报告:落基山庆祝女性计算机科学家
    • 进行中的工作/征求反馈:数据包批处理
    • 基金会与 FreeBSD 桌面
  • 2022-1112 可观测性和衡量标准
    • 在 FreeBSD 的 DDB 内核调试器中编写自定义命令
    • DTrace:老式跟踪系统的新扩展
    • 基于证书的 Icinga 监控
    • 活动监控脚本(activitymonitor.sh)
    • 实用 IPv6(第四部分)
    • EuroBSDCon 会议报道
    • 实用 Port:Prometheus 的安装与配置
    • 书评:《用火解决问题:管理老化的计算机系统(并为现代系统保驾护航)》Kill It with Fire: Manage Aging Computer Systems (and Future Proof Modern Ones)
  • 2022-0910 安全性
    • CARP 简介
    • 重构内核加密服务框架
    • PAM 小窍门
    • SSH 小窍门
    • 实用 IPv6(第三部分)
    • 书评:Understanding Software Dynamics(深入理解软件性能——一种动态视角)—— Richard L. Sites 著
    • 访谈:保障 FreeBSD 安全性
    • MCH 2022 会议报告
  • 2022-0708 科研、系统与 FreeBSD
    • 在 FreeBSD 上构建 Loom 框架
    • 教授本科生 Unix 课程
    • FreeBSD 入门研讨会
    • 实用 IPv6(第二部分)
    • 在 2022 年及以后推广 FreeBSD
    • 进行中的工作/征求反馈:Socket 缓冲区
    • FreeBSD 开发者峰会报告
    • 支持 Electromagnetic Field 2022
  • 2022-0506 灾难恢复
    • 使用 FreeBSD 构建高弹性的私有云
    • LLDB 14 —— FreeBSD 新调试器
    • 实用 IPv6(第一部分)
    • 利用 netdump(4) 进行事后内核调试
    • 进行中的工作/征求反馈:FreeBSD 启动性能
    • 实用 Port:在 OpenZFS 上设置 NFSv4 文件服务器
  • 2022-0304 ARM64 是一级架构
    • FreeBSD/ARM64 上的数据科学
    • Pinebook Pro 上的 FreeBSD
    • 嵌入式控制器的 ACPI 支持
    • 进行中的工作/征求反馈:Lumina 桌面征集开发人员
    • 实用 Port:如何设置 Apple 时间机器
  • 2022-0102 软件与系统管理
    • 为 FreeBSD Ports 做贡献
    • 使用 Git 贡献到 FreeBSD Ports
    • CBSD:第一部分——生产环境
    • 将 OpenBSD 的 pf syncookie 代码移植到 FreeBSD 的 pf
    • 进行中的工作/征求反馈:mkjail
    • 《编程智慧:编程鬼才的经验和思考》(The Kollected Kode Vicious)书评
    • 会议报告:EuroBSDCon 2021 我的第一次 EuroBSDCon:一位新组织者的视角
  • 2021-1112 存储
    • 开放通道 SSD
    • 构建 FreeBSD 社区
    • 与完美操作系统同行 27 年
    • 进行中的工作/征求反馈:OccamBSD
    • 通过 iSCSI 导入 ZFS ZIL——不要在工作中这样做——就像我做的那样
  • 2021-0910 FreeBSD 开发
    • FreeBSD 代码审查与 git-arc
    • 如何为 FreeBSD 实现简单的 USB 驱动程序
    • 内核开发技巧
    • 程序员编程杂谈
  • 2021-0708 桌面/无线网
    • 通往 FreeBSD 桌面的直线路径
    • FreeBSD 13 中的人机接口设备 (HID) 支持
    • Panfrost 驱动程序
    • 用 Git 更新 FreeBSD
    • FreeBSD 的新面孔
    • 想给你的桌面加点佐料?
  • 2021-0506 安全
    • 七种提升新安装 FreeBSD 安全性的方法
    • copyinout 框架
    • 使用 TLS 改善 NFS 安全性
    • Capsicum 案例研究:Got
    • 对 Jail 进行安全扫描
  • 2021-0304 FreeBSD 13.0
    • 展望未来
    • FreeBSD 13.0 工具链
    • FreeBSD 13.0 中有新加载器吗?
    • TCP Cubic 准备起飞
    • OpenZFS 中的 Zstandard 压缩
    • 会议报告:FreeBSD 供应商峰会
    • Git 不够吗?
  • 2021-0102 案例研究
    • Tarsnap 的 FreeBSD 集群
    • BALLY WULFF
    • Netflix Open Connect
    • FreeBSD 的新面孔
    • 写作学者的 FreeBSD
    • 在世界之巅
  • 2020-1112 工作流/持续集成(CI)
    • FreeBSD Git 快速入门
    • 使用 syzkaller 进行内核 Fuzzing
    • Mastering Vim Quickly 书评
    • 线上会议实用技巧
    • 在控制台上进行网络监控
  • 2020-0910 贡献与入门
    • 采访:Warner Losh,第 2 部分
    • 代码审查
    • 撰写良好的提交消息
    • 如何在不是程序员的情况下做出贡献——成为 FreeBSD 译者
    • 如何成为文档提交者
    • 谷歌编程之夏
    • 为 FreeBSD 期刊撰写文章
    • 你为什么使用 FreeBSD
    • FreeBSD 的新面孔
  • 2020-0708 基准测试/调优
    • FreeBSD Friday
    • 采访:Warner Losh,第 1 部分
    • 构建和运行开源社区
    • 在 FreeBSD 上轻松搭建我的世界(Minecraft)服务器
    • FreeBSD 的新面孔
  • 2020-0506 网络性能
    • 内核中的 TLS 卸载
    • 访谈:Michael W Lucas
    • FreeBSD 桌面发行版
    • 使用 Poudriere 进行 Port 批量管理
    • FreeBSD 的新面孔
由 GitBook 提供支持
LogoLogo

FreeBSD 中文社区(CFC) 2025

在本页
  • 处理遗留问题
  • 什么是 ACPI?
  • ARM64 的 ACPI 基础部分
  • 处理嵌入式控制器
  • 自定义 ACPI 描述
  • 结论
在GitHub上编辑
导出为 PDF
  1. 2022-0304 ARM64 是一级架构

嵌入式控制器的 ACPI 支持

上一页Pinebook Pro 上的 FreeBSD下一页进行中的工作/征求反馈:Lumina 桌面征集开发人员

最后更新于1个月前

  • 原文链接:

  • 作者:MARCIN WOJTAS

ARM64 是一种被广泛应用于各种产品的单一架构——它既可用于最小型的嵌入式设备,也可用于移动设备、企业级产品,甚至是服务器级解决方案。对服务器级设备的支持要求遵循一定的标准,例如启动方式、与固件的交互以及平台描述等。而事实证明,这种模式同样适用于非服务器设备。本文将探讨 FreeBSD 对这些设备的支持情况,重点关注 ACPI 体系下的嵌入式控制器处理方式。

处理遗留问题

近十年前,64 位 ARM 架构问世时,直接继承了其 32 位前身的生态系统,而 32 位 ARM 在嵌入式市场中长期占据主导地位。然而,为每个平台维护一个完全定制化的板级支持包(BSP)成为新架构发展的沉重负担。

在一定程度上,设备树(DT)的引入提高了可移植性,并使得可以使用单一内核镜像运行多个设备,但这并未彻底解决问题。设备树的描述方式十分灵活,不幸的是,这种灵活性经常被厂商滥用,导致设备树绑定在时间推移中变得不一致。哪怕在今天,U-Boot 使用的设备树 blob 仍然可能与操作系统引导时使用的设备树不同(尽管它们描述的是同一块硬件!),而且通常缺乏向后兼容性。在这样的限制下,想要实现广泛的软件生态系统和多操作系统支持将变得十分困难。

不过,早已有成熟的解决方案存在。x86 体系所使用的接口被引入并扩展到了 ARM64,包括启动过程、EFI、SMBIOS 和 ACPI。在符合这些标准并使用合适固件的服务器级设备上,现在可以直接使用安装镜像来安装 FreeBSD、其他操作系统或虚拟机管理程序(hypervisor)。

那么,小型嵌入式平台呢?幸运的是,它们同样可以以类似的方式利用这一成熟生态系统。当然,这需要一定的前提——硬件不能过于偏离标准,并且固件需要满足严格的要求。这些规范被归纳在一系列标准中,即 (ARM 基本系统架构)和 (ARM 基础启动要求)。最终的结果是,现在已经有一些 ARM64 平台可以通过单一固件镜像和 ACPI 描述成功引导 FreeBSD、Windows 和多个 Linux 发行版。

这些设备有何特殊之处?与传统服务器(通常拥有大量 CPU、DRAM 和 PCIe 根复合体)相比,嵌入式领域的 SoC 还支持连接到其内部总线的各种控制器。因此,这些控制器不会在 PCIe 枚举过程中被自动发现,而是需要采用不同的处理方式。硬件描述必须明确引用这些接口,并包含能够被操作系统解析和解释的平台数据。最近,FreeBSD 内核的能力得到了扩展,新增了一些特性,使其能够从 ACPI 表中获取这些信息。

什么是 ACPI?

在深入讨论细节之前,值得简要介绍一下 ACPI(高级配置与电源管理接口)。ACPI 是固件与操作系统之间的接口,主要用于描述和配置硬件。该已经发展了近 30 年,并涵盖了多个关键,例如电源管理、温度/电池管理、硬件配置以及嵌入式控制器的描述。ACPI 还定义了一种 ACPI 源语言(ASL),它能创建低级硬件配置例程,并被编译为 ACPI 机器语言(),由内核解释并执行。

平台信息存储在所谓的“表”(table)中,这些表本质上是系统内存地址空间中的一组层次化结构。ACPI 的起点是根系统描述指针(RSDP),它由固件配置,并指向扩展系统描述表(XSDT),后者进一步链接到次级表。首个次级表始终是固定 ACPI 描述表(FADT),其中包含描述硬件固定 ACPI 特性的各种固定长度条目。

图 1. 根系统描述指针 (RSDP) 和表

  • 通用定时器描述表 (GTDT)

  • 多 APIC 描述表 (MADT)

  • 处理器属性拓扑表 (PPTT)

  • 串口控制台重定向表 (SPCR)

  • PCI Express 内存映射配置空间基地址描述表 (MCFG)

  • 差异化系统描述表 (DSDT)

上述表格中的最后一项——DSDT,尤为关键。DSDT 始终由 FADT 引用,并包含 CPU 列表、电源管理特性、PCIe 根复杂 (root complex) 以及所有嵌入式控制器的描述。通常,它会配有 SSDT (次级系统描述表),可能有一个或多个实例。这种结构允许程序员在平台描述代码中逻辑地拆分各种功能。

上述表格的定义已扩展,以涵盖 ARM64 特定的值和类型(例如中断控制器)——所有这些都被汇总到 ACPICA (ACPI 组件架构) 中。ACPICA 是一个开源参考代码库,供各操作系统使用和补充。FreeBSD 始终与其最新版本保持同步。现在,让我们看看这些表格在 FreeBSD ARM64 端口中的处理方式。

ARM64 的 ACPI 基础部分

处理嵌入式控制器

连接到 SoC 内部总线的嵌入式控制器在 ACPI 表中可以通过两种方式进行处理:

  1. 使用标准对象 (Standard Objects) 描述—— 对于 ACPI 规范未明确定义的设备或子系统,可利用 ACPI 提供的标准对象,让操作系统解析并获取驱动程序所需的所有硬件资源。

第二种方式是 ACPI 支持非服务器级 ARM64 SoC 的关键,并且已在 FreeBSD 内核中得到实现。

图 2. ACPI 和设备树世界中 FreeBSD 总线层次结构示例的高层比较。

从高层来看,FreeBSD 中嵌入式控制器的总线层级在 ACPI 和 DT (Device Tree) 体系下是相似的(参见 图 2)。这对于设计设备驱动程序非常有帮助,因为在内核初始化过程中,平台数据结构可以在两种情况下以相同方式填充。随后,已探测到的驱动程序可以通过 ACPI 的 _HID 字段值进行匹配,该字段可以视为 Device Tree 中 compatible 字符串的等效项。此外,其他标准类型的资源也以类似方式进行处理。

Device(AHC0) {
    Name(_HID, "LNRO001E") // _HID: 硬件 ID
    Name(_UID, 0x00) // _UID: 唯一标识 ID
    Name(_CCA, 0x01) // _CCA: 缓存一致性属性
    Method(_STA) // _STA: 设备状态
    {
        Return(0xF)
    }
    Name(_CLS, Package(0x03) // _CLS: 类别代码
    {
        0x01,
        0x06,
        0x01
    }) Name(_CRS, ResourceTemplate() // _CRS: 目前的资源设置
    {
        Memory32Fixed(ReadWrite, 0xF2540000, // 基地址 (MMIO)
                      0x00030000, // 地址长度
                     ) Interrupt(ResourceConsumer, Level, ActiveHigh, Exclusive,,, ) {
            CP_GIC_SPI_CP0_SATA_H0
        }
    })
}

FreeBSD 的 XHCI 和 AHCI 驱动程序需要在 DSDT/SSDT 中使用完全标准化的描述。列表 1 展示了 XHCI 控制器的一个示例,它包含引用 唯一 ID 的对象,以及 缓存一致性信息 和 内存/中断资源。所有 非标准 配置(例如 寄存器映射、时钟管理 或 电源管理 处理)都必须由 固件 预先配置并实现。

自定义 ACPI 描述

如果某个控制器需要由其专用驱动程序处理的自定义绑定,该如何实现?

  • device_has_property

该方案的一个典型应用是 SD/MMC 子系统,其中包括:

  • 适用于 Marvell Xenon 控制器的驱动

其中,Marvell Xenon 驱动被拆分为三个文件:

除了 DRIVER_MODULE/DEFINE_CLASS_1 宏 的不同使用方式,simplebus 适配代码还额外解析了电源管理 (regulators) 和卡检测 GPIO 引脚 (card detect GPIO pins),而 ACPI 方式下这些信息则由固件预先设定。

&ap_sdhci0 {
    compatible = "marvell,armada-cp110-sdhci";
    reg = <0x780000 0x300>;
    interrupts = <27 IRQ_TYPE_LEVEL_HIGH>;
    clock-names = "core", "axi";
    clocks = <&CP11X_LABEL(clk) 1 4>, <&CP11X_LABEL(clk) 1 18>;
    dma-coherent;
    bus-width = <8>;
    /*
     * 在 HS 模式下不稳定 —— PHY 需要“进一步校准”,因此添加“slow-mode”,并禁用 SDR104、SDR50 和 DDR50 模式。
    */
    marvell,xenon-phy-slow-mode;
    no-1-8-v;
    no-sd;
    no-sdio;
    non-removable;
    status = "okay";
    vqmmc-supply = <&v_vddo_h>;
};

清单 2. 设备树中的 Marvell Xenon SD/MMC 控制器

Device (MMC0)
{
    Name (_HID, "MRVL0002") // _HID: 硬件 ID
    Name (_UID, 0x00) // _UID: 唯一标识 ID
    Name (_CCA, 0x01) // _CCA: 缓存一致性属性
    Method (_STA) // _STA: 设备状态
    {
        Return (0xF)
    }
    Name (_CRS, ResourceTemplate () // _CRS: 当前资源设置
    {
        Memory32Fixed (ReadWrite,
                       0xF06E0000, // 基地址 (MMIO)
                       0x00000300, // 地址长度
                      )
        Interrupt (ResourceConsumer, Level, ActiveHigh, Exclusive,,, )
        {
            48
        }
    })
    Name (_DSD, Package () {
        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
        Package () {
            Package () { "clock-frequency", 400000000 },
            Package () { "bus-width", 8 },
            Package () { "marvell,xenon-phy-slow-mode", 0x1 },
            Package () { "no-1-8-v", 0x1 },
            Package () { "no-sd", 0x1 },
            Package () { "no-sdio", 0x1 },
            Package () { "non-removable", 0x1 },
        }
    })
}

清单 3. ACPI 中的 Marvell Xenon SD/MMC 控制器

代码示例 2 和 3 展示了同一控制器实例的 DT(设备树)和 ACPI 节点,以说明这两种描述方式的相似性。借助 FreeBSD 内核的新方法,该控制器可以在所有固件配置下正常运行。

结论

随着 FreeBSD 内核的最新改进,嵌入式产品中使用的 ARM64 SoC 现在可以同时通过 ACPI 和设备树(DT)以类似的方式获得支持。对于 ACPI 而言,自定义控制器的分层表示也被证明足够灵活,能够适用于大多数类型的设备和子系统。例如,一些复杂的网络控制器和通用 MDIO 层的实现都已经验证了这一点。

FreeBSD 现在可以无限制地继续沿着这条路径发展,尤其是其总线架构允许以干净且优雅的方式进行扩展,就像 SD/MMC 控制器 示例所展示的那样。


MARCIN WOJTAS 是 Semihalf 工程主管,同时也是 FreeBSD src 提交者(mw@)。他对嵌入式软件和硬件充满热情,并为多个开源项目作出贡献,包括 Linux 内核、Tianocore EDK2 和 TF-A。

来源:

ACPI 规范定义了多种,但在嵌入式设备的上下文中,有几种表格尤为重要,例如:

ARM64 SoC 依照标准由 ACPI 表格描述。例如,GTDT 列出了定时器和看门狗,MADT 则包含中断控制器(目前仅支持 GICv2 和 GICv3)。进一步来看嵌入式控制器,控制台由 SPCR(可选 DBG2 表)描述——推荐使用 ARM SBSA UART (PL011) 或兼容 16550 的 UART,不过近年来 ARM 生态中的更多 UART 类型也已被纳入支持。

PCIe 控制器的描述更为复杂,必须包含在 MCFG 和 DSDT/SSDT 表中。对于 ARM64,唯一允许的类型是完全兼容标准 ECAM (Enhanced Configuration Access Mechanism) 的通用 PCIe 控制器,该类型受 驱动程序支持。建议新设计在芯片中保留未经修改的标准 ECAM 实现,但对于现有产品,往往无法满足这一要求。因此,在 FreeBSD 的 pci_host_generic_acpi 驱动中,已允许通过 来处理对标准的偏离。另一种解决方案是通过 SMCCC (Secure Monitor Call Calling Convention) 接口,支持从固件执行低级例程。目前,该机制已在 上可用,但 FreeBSD 仍未实现该选项。

使用“方法” (methods) 编译为 AML—— 这样 OS 可以直接解析并执行相应指令。例如, (thermal management)、 或 就采用这种方式。

FreeBSD 目前支持的 ACPI 方式管理的 ARM64 嵌入式控制器主要有 和 。其中,SATA 的匹配方式较为特殊,并非通过 _HID 进行匹配,而是通过 设备类值 (device class value) 进行匹配,即 ACPI _CLS 对象(参见 列表 1)。

清单 1. 中的 AHCI 控制器描述示例

在 FreeBSD 中,过去只能在 DT (Device Tree) 体系下实现自定义绑定,方法是使用节点属性。但 ACPI 规范实际上定义了一个可选对象 _DSD (),它可以包含相同的信息。

借助 FreeBSD 的总线层级体系(参见 图 2),开发者一种新的通用方案,支持在不依赖具体描述方式的情况下获取控制器特定的数据。此外,还引入了以下辅助函数:

这些函数允许子设备驱动以相同方式访问父总线提供的设备特定数据,无论系统是以 ACPI 还是 DT 启动,都能执行相同的代码路径。该方案后来,以涵盖 ACPI 和 DT 体系下的多种属性类型。

适配代码

适配代码(适用于 Device Tree)

UEFI ACPI 6.4 规范
专用表
列表
pci_host_generic_acpi
配置空间访问 quirks
树莓派 4
热管理
SMBUS
GPIO
USB
SATA
ACPI 表
Device Specific Data
设计并实现了
device_get_property
进一步扩展
通用代码
通用部分
ACPI
simplebus
ACPI Support for Embedded Controllers
BSA
BBR
标准
概念
AML