Skip to content

feat(somehal): register x86 ACPI IOAPIC through rdrive#1155

Merged
ZR233 merged 1 commit into
devfrom
rfct/x86-intc
Jun 5, 2026
Merged

feat(somehal): register x86 ACPI IOAPIC through rdrive#1155
ZR233 merged 1 commit into
devfrom
rfct/x86-intc

Conversation

@ZR233

@ZR233 ZR233 commented Jun 5, 2026

Copy link
Copy Markdown
Member

背景

当前 x86 动态平台的 IOAPIC 初始化仍由 somehalpost_paging() 后手动调用,PCI ACPI _PRT 路由在进入设备侧时也只保留了 vector,trigger/polarity 等 ACPI 元数据会提前丢失。这使 x86 中断控制器路径和 aarch64 GIC 的 rdrive 动态注册模型不一致,也不利于后续扩展 ACPI PCI legacy INTx 配置。

修改内容

  • rdif-def / rdif-intc 中新增中立的 ACPI GSI route 类型和 setup_irq_by_acpi() 接口,避免让 rdif-intc 依赖 rdrive 的具体 ACPI 实现。
  • rdrive ACPI probe 中复用该 route 类型,让 PCI _PRT 解析返回完整的 GSI、vector、IOAPIC controller/input、trigger/polarity 信息。
  • somehal x86 平台中把 ACPI IOAPIC 注册为 rdif_intc::Intc rdrive driver,由 probe_pre_kernel() 初始化,并通过 setup_irq_by_acpi() 写入 IOAPIC redirection entry。
  • 移除 post_paging() 中手动 init_acpi_irq() 的旁路初始化,保留 LAPIC/PIC/timer/IPI/MSI/MSI-X 的既有路径。
  • ax-driver ACPI PCI helper 中把完整 route 交给 interrupt controller setup,再返回最终 IRQ/vector;同时用语义 cfg 简化 PCI ACPI/FDT INTx helper 的编译条件。

方案逻辑

第一版只覆盖 ACPI IOAPIC + PCI legacy INTx:PCI 设备仍然只拿 usize IrqId 注册中断,驱动侧不需要理解 IOAPIC;IOAPIC 细节集中在 x86 somehal 的 rdrive intc 实现中。setup_irq_by_acpi() 会先缓存完整 route,再配置并屏蔽对应 IOAPIC entry,后续 irq_set_enable(vector) 使用缓存 route 启停,避免重新从 vector 反推默认 route 时丢失 trigger/polarity。

验证

  • cargo fmt --check
  • cargo test --package rdrive acpi_ioapic_routes_map_gsi_to_stable_vector
  • cargo xtask clippy --package rdif-intc
  • cargo xtask clippy --package rdrive
  • cargo xtask clippy --package somehal
  • cargo xtask clippy --package ax-driver
  • cargo xtask starry test qemu --arch x86_64 -g normal -c test-sysinfo
  • git diff --check

@ZR233
ZR233 marked this pull request as ready for review June 5, 2026 09:46
@ZR233
ZR233 merged commit 4bb7e1a into dev Jun 5, 2026
98 checks passed
@ZR233
ZR233 deleted the rfct/x86-intc branch June 5, 2026 12:47
@github-actions github-actions Bot mentioned this pull request Jun 5, 2026

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

代码审查总结

PR 内容: 将 x86 ACPI IOAPIC 从 somehal 中的手动 post_paging() 初始化路径迁移到 rdrive 动态驱动注册模型,与 aarch64 GIC 的 rdrive 注册模式对齐。

实现逻辑:

  1. rdif-def/src/irq.rs 中新增中立的 AcpiGsiRouteAcpiIrqTriggerAcpiIrqPolarity 类型,将 ACPI 中断路由元数据从 rdrive 的内部定义提升到接口定义层。
  2. rdif-intcInterface trait 中新增 setup_irq_by_acpi() 方法,遵循 setup_irq_by_fdt() 已有模式。
  3. rdrive ACPI probe 复用新的 route 类型,AcpiPciIrqRoute 简化为持有 AcpiGsiRoute 而非内联展开的字段。
  4. somehal x86 平台用 module_driver! 宏注册 "ACPI IOAPIC" 为 rdrive driver,实现 rdif_intc::Interface,包含路由缓存和 resolve_vector 回退机制。
  5. 移除 post_paging() 中的 init_acpi_irq() 旁路调用。
  6. ax-driver 的 ACPI PCI helper 改为通过 setup_irq_by_acpi() 获取 IRQ,cfg 条件简化为 pci_dyn_intx_route / pci_dyn_acpi_intx_route 语义 cfg。

本地验证结果:

  • cargo fmt --check: ✅ 通过
  • cargo clippy (rdif-def, rdif-intc, rdrive, somehal): ✅ 通过
  • cargo clippy (ax-driver): ❌ fdt.rs:247 有 pre-existing 的 useless_borrows_in_formatting 警告,非本 PR 引入
  • cargo test (rdrive, 含 acpi_ioapic_routes_map_gsi_to_stable_vector): ✅ 通过 (4 tests passed)
  • cargo test (rdif-intc, rdif-def): ✅ 通过

CI 状态: 所有 GitHub Actions check runs 结论为 skipped,属于矩阵/路径过滤正常行为,无 PR 引致的 CI 失败。PR 已于 2026-06-05 合并。

重复/重叠分析: 搜索 open PR 中的 IOAPIC/intc/ACPI GSI 关键词,未发现冲突或重复的开放 PR。仅发现 release PR (#1156) 已包含本 PR 变更。PR #1155 与 aarch64 GIC 的 rdrive 注册路径形成架构一致性,无重复实现风险。

代码质量评估:

  • 架构方向正确:将 IOAPIC 初始化从静态旁路迁移到 rdrive probe 机制,与 aarch64 GIC 对齐
  • X86IoApicIntc 中的路由缓存 + resolve_vector 回退机制设计合理
  • set_ioapic_vector_enable 使用 rdrive::get_list::<Intc>() + downcast + try_lock 避免死锁
  • unsafe 块仅用于硬件寄存器操作,符合预期
  • cfg 条件大幅简化,用 build.rs 生成的语义 flag 替代重复的 feature 列表
  • 测试覆盖包括 route 映射和 intx flags 断言

结论: 无阻塞性问题,代码架构合理,本地验证通过。APPROVE

Powered by mimo-v2.5-pro

@github-actions github-actions Bot mentioned this pull request Jun 9, 2026
aptacc2421 pushed a commit to aptacc2421/tgoskits that referenced this pull request Jun 14, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant