diff options
author | Ian McFarlane <i.mcfarlane2002@gmail.com> | 2025-04-15 15:17:45 -0400 |
---|---|---|
committer | Freya Murphy <freya@freyacat.org> | 2025-04-20 23:44:38 -0400 |
commit | dfb622cdc613b70e03471a0a40b14d6dc28de489 (patch) | |
tree | b78ba923b54a878d36a7a28d5d9a0fa44b39f44e | |
parent | PIT (timer) (diff) | |
download | comus-dfb622cdc613b70e03471a0a40b14d6dc28de489.tar.gz comus-dfb622cdc613b70e03471a0a40b14d6dc28de489.tar.bz2 comus-dfb622cdc613b70e03471a0a40b14d6dc28de489.zip |
starting on ata
-rw-r--r-- | kernel/drivers/ata.c | 37 | ||||
-rw-r--r-- | kernel/include/comus/drivers/ata.h | 0 |
2 files changed, 37 insertions, 0 deletions
diff --git a/kernel/drivers/ata.c b/kernel/drivers/ata.c new file mode 100644 index 0000000..4c5896c --- /dev/null +++ b/kernel/drivers/ata.c @@ -0,0 +1,37 @@ +// taken from https://wiki.osdev.org/PCI#Class_Codes +#define CLASS_MASS_STORAGE_CONTROLLER 0x1 + +#define SUBCLASS_SCSI_BUS_CONTROLLER 0x0 +#define SUBCLASS_IDE_CONTROLLER 0x1 +#define SUBCLASS_FLOPPY_DISK_CONTROLLER 0x2 +#define SUBCLASS_IPI_BUS_CONTROLLER 0x3 +#define SUBCLASS_RAID_CONTROLLER 0x4 +#define SUBCLASS_ATA_CONTROLLER 0x5 +#define SUBCLASS_SERIAL_ATA_CONTROLLER 0x6 +#define SUBCLASS_SERIAL_ATTACHED_SCSI_CONTROLLER 0x7 +#define SUBCLASS_NON_VOLATILE_MEMORY_CONTROLLER 0x8 +#define SUBCLASS_OTHER 0x80 + +// from https://wiki.osdev.org/PCI_IDE_Controller#Detecting_a_PCI_IDE_Controller +#define IDE_PROG_IF_PRIMARY_CHANNEL_IS_PCI_NATIVE_FLAG 0x1 +#define IDE_PROG_IF_PRIMARY_CHANNEL_CAN_SWITCH_TO_AND_FROM_PCI_NATIVE_FLAG 0x2 +#define IDE_PROG_IF_SECONDARY_CHANNEL_IS_PCI_NATIVE_FLAG 0x3 +#define IDE_PROG_IF_SECONDARY_CHANNEL_CAN_SWITCH_TO_AND_FROM_PCI_NATIVE_FLAG 0x4 +#define IDE_PROG_IF_DMA_SUPPORT_FLAG 0x7 + +#include "comus/drivers/pci.h" +#include "comus/drivers/ata.h" + +bool ata_find_primary_drive(struct pci_device *out) +{ + if (!pci_findby_class(out, CLASS_MASS_STORAGE_CONTROLLER, + SUBCLASS_IDE_CONTROLLER, NULL)) { + return false; + } + + const uint8_t prog_if = pci_rcfg_b(*out, PCI_PROG_IF_B); + + return true; +} + + diff --git a/kernel/include/comus/drivers/ata.h b/kernel/include/comus/drivers/ata.h new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/kernel/include/comus/drivers/ata.h |