// // Created by rick on 14-5-22. // #include #include #include uint8_t att_used virtio_pci_block_validate(const pci_device *pci_device) { uint32_t capacity_l = pci_config_read_double_word(pci_device->bus, pci_device->slot, pci_device->func, 0x14); uint32_t capacity_h = pci_config_read_double_word(pci_device->bus, pci_device->slot, pci_device->func, 0x18); uint32_t segment_size_max = pci_config_read_double_word(pci_device->bus, pci_device->slot, pci_device->func, 0x1c); uint32_t segment_count_max = pci_config_read_double_word(pci_device->bus, pci_device->slot, pci_device->func, 0x20); uint16_t cylinder_count = pci_config_read_word(pci_device->bus, pci_device->slot, pci_device->func, 0x24); uint8_t head_count = pci_config_read_byte(pci_device->bus, pci_device->slot, pci_device->func, 0x26); uint8_t sector_count = pci_config_read_byte(pci_device->bus, pci_device->slot, pci_device->func, 0x27); uint32_t block_length = pci_config_read_double_word(pci_device->bus, pci_device->slot, pci_device->func, 0x28); capacity_l = leu32_to_native(capacity_l); capacity_h = leu32_to_native(capacity_h); uint64_t capacity = ((uint64_t) capacity_h) >> 32 | capacity_l; return PCI_VALIDATE_FAIL; } uint8_t att_used virtio_pci_block_initialize(pci_device *pci_device) { return PCI_INIT_FAIL; } PCI_DRIVER(900) = { .name = "pci-virtio-block", .description = "Para-virtualized Block Device", .validatable = true, .initialisable = true, .match.class = PCI_CLASS_MASS_STORAGE, .match.subclass = PCI_SUB_CLASS_MASS_SCSI, .match.vendor = PCI_VENDOR_VIRTIO, .match.device = PCI_DEVICE_VIRTIO_BLOCK, .mask.class = true, .mask.subclass = true, .mask.vendor = true, .mask.device = true, .validate = virtio_pci_block_validate, .initialize = virtio_pci_block_initialize, };