From 235d8deee5d4d216ee53ad516d6bcd04b8ac81ac Mon Sep 17 00:00:00 2001 From: acevest Date: Wed, 31 Dec 2025 20:34:15 +0800 Subject: [PATCH] =?utf8?q?=E5=88=9D=E6=AD=A5=E6=B7=BB=E5=8A=A0=E6=89=AB?= =?utf8?q?=E6=8F=8FAHCI=E7=9A=84SATA=E8=AE=BE=E5=A4=87=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- drivers/ide.c | 4 ++-- drivers/sata.c | 39 +++++++++++++++++++++++++++++++++++++++ kernel/setup.c | 3 +++ 3 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 drivers/sata.c diff --git a/drivers/ide.c b/drivers/ide.c index f96715b..2ab964f 100644 --- a/drivers/ide.c +++ b/drivers/ide.c @@ -177,7 +177,7 @@ void ide_pci_init(pci_device_t *pci) { pci->vendor, pci->classcode); for (int i = 0; i < 6; i++) { - printd("ide pci BAR%u value 0x%08X\n", i, pci->bars[i]); + printd(" ide pci BAR%u value 0x%08X\n", i, pci->bars[i]); if (pci->bars[i] != 0) { assert((pci->bars[i] & 0x1) == 0x1); } @@ -202,7 +202,7 @@ void ide_pci_init(pci_device_t *pci) { atomic_set(&ide_pci_controller[i].consumed_cnt, 0); iobase += i * 8; // secondary channel 需要加8 - printd("ide pci Base IO Address Register %08x\n", iobase); + printd(" ide pci Base IO Address Register %08x\n", iobase); ide_pci_controller[i].bus_iobase = iobase; ide_pci_controller[i].bus_cmd = iobase + PCI_IDE_CMD; ide_pci_controller[i].bus_status = iobase + PCI_IDE_STATUS; diff --git a/drivers/sata.c b/drivers/sata.c new file mode 100644 index 0000000..f3d6d3f --- /dev/null +++ b/drivers/sata.c @@ -0,0 +1,39 @@ +/* + * ------------------------------------------------------------------------ + * File Name: sata.c + * Author: Zhao Yanbai + * 2025-12-31 20:29:10 Wednesday CST + * Description: none + * ------------------------------------------------------------------------ + */ + +#include +#include + + +void init_sata() { + pci_device_t *pci = pci_find_device_by_classcode(0x0106); + if (pci == NULL) { + printk("can not find pci classcode: %08x", 0x0106); + panic("can not find sata controller"); + } + // progif + // 0x01 AHCI + // + // 另外读取 BAR5 的 CAP 寄存器,如果 CAP 寄存器的 31 位为 1,则表示支持 AHCI 模式。 + + if (pci->progif == 0x01) { + printk("AHCI mode supported\n"); + } else { + printk("AHCI mode not supported\n"); + } + + printk("found sata pci progif %02x %03d:%02d.%d #%02d %04X:%04X\n", pci->progif, pci->bus, pci->dev, pci->devfn, pci->intr_line, pci->vendor, pci->device); + for (int i = 0; i < 6; i++) { + printk(" sata pci BAR%u value 0x%08X\n", i, pci->bars[i]); + // if (pci->bars[i] != 0) { + // assert((pci->bars[i] & 0x1) == 0x1); + // } + } + +} diff --git a/kernel/setup.c b/kernel/setup.c index c75f301..f224520 100644 --- a/kernel/setup.c +++ b/kernel/setup.c @@ -140,4 +140,7 @@ void setup_kernel() { void ide_init(); ide_init(); + + void init_sata(); + init_sata(); } -- 2.47.0