From 716109bab534c5c5dfce75bbe716b70072b58ae0 Mon Sep 17 00:00:00 2001 From: "Justin C. Miller" Date: Sat, 12 May 2018 20:27:46 -0700 Subject: [PATCH] Add block device management to device manager --- src/kernel/ahci/driver.cpp | 10 ---------- src/kernel/ahci/driver.h | 3 --- src/kernel/ahci/hba.cpp | 16 ++++------------ src/kernel/ahci/hba.h | 3 --- src/kernel/device_manager.cpp | 6 ++++++ src/kernel/device_manager.h | 20 ++++++++++++++++++++ src/kernel/main.cpp | 11 ++++------- 7 files changed, 34 insertions(+), 35 deletions(-) diff --git a/src/kernel/ahci/driver.cpp b/src/kernel/ahci/driver.cpp index ba8d0ce..621135e 100644 --- a/src/kernel/ahci/driver.cpp +++ b/src/kernel/ahci/driver.cpp @@ -16,13 +16,3 @@ ahci_driver::register_device(pci_device *device) ahci::hba &hba = m_devices.emplace(device); } - -ahci::port * -ahci_driver::find_disk() -{ - for (auto &hba : m_devices) { - ahci::port *d = hba.find_disk(); - if (d) return d; - } - return nullptr; -} diff --git a/src/kernel/ahci/driver.h b/src/kernel/ahci/driver.h index c19b4b8..1099f39 100644 --- a/src/kernel/ahci/driver.h +++ b/src/kernel/ahci/driver.h @@ -22,9 +22,6 @@ public: /// \arg device The PCI device to remove void unregister_device(pci_device *device); - /// Debug: find the first disk - ahci::port * find_disk(); - private: kutil::vector m_devices; }; diff --git a/src/kernel/ahci/hba.cpp b/src/kernel/ahci/hba.cpp index ea42258..8d725b9 100644 --- a/src/kernel/ahci/hba.cpp +++ b/src/kernel/ahci/hba.cpp @@ -57,6 +57,7 @@ void irq_cb(void *data) hba::hba(pci_device *device) { page_manager *pm = page_manager::get(); + device_manager &dm = device_manager::get(); uint32_t bar5 = device->get_bar(5); m_data = reinterpret_cast(bar5 & ~0xfffull); @@ -83,6 +84,9 @@ hba::hba(pci_device *device) port &p = m_ports.emplace(i, kutil::offset_pointer(pd, 0x80 * i), impl); if (p.get_state() == port::state::active) needs_interrupt = true; + + if (p.get_type() == sata_signature::sata_drive) + dm.register_block_device(&p); } if (needs_interrupt) { @@ -91,18 +95,6 @@ hba::hba(pci_device *device) } } -port * -hba::find_disk() -{ - for (auto &port : m_ports) { - if (port.get_state() == port::state::active && - port.get_type() == sata_signature::sata_drive) - return &port; - } - - return nullptr; -} - void hba::handle_interrupt() { diff --git a/src/kernel/ahci/hba.h b/src/kernel/ahci/hba.h index 44f3248..6bdbe02 100644 --- a/src/kernel/ahci/hba.h +++ b/src/kernel/ahci/hba.h @@ -25,9 +25,6 @@ public: /// Interrupt handler. void handle_interrupt(); - /// Debug: find the first disk - port * find_disk(); - private: pci_device *m_device; hba_data *m_data; diff --git a/src/kernel/device_manager.cpp b/src/kernel/device_manager.cpp index 7de8921..1a64e90 100644 --- a/src/kernel/device_manager.cpp +++ b/src/kernel/device_manager.cpp @@ -320,3 +320,9 @@ device_manager::allocate_msi(const char *name, pci_device &device, irq_callback static_cast(vector)); return true; } + +void +device_manager::register_block_device(block_device *blockdev) +{ + m_blockdevs.append(blockdev); +} diff --git a/src/kernel/device_manager.h b/src/kernel/device_manager.h index cefea07..205ba68 100644 --- a/src/kernel/device_manager.h +++ b/src/kernel/device_manager.h @@ -7,6 +7,7 @@ struct acpi_xsdt; struct acpi_apic; struct acpi_mcfg; +class block_device; class lapic; class ioapic; @@ -65,6 +66,23 @@ public: return false; } + /// Register the existance of a block device. + /// \arg blockdev Pointer to the block device + void register_block_device(block_device *blockdev); + + /// Get the number of block devices in the system + /// \returns A count of devices + inline unsigned get_num_block_devices() const { return m_blockdevs.count(); } + + /// Get a block device + /// \arg i Index of the device to get + /// \returns A pointer to the requested device, or nullptr + inline block_device * get_block_device(unsigned i) + { + return i < m_blockdevs.count() ? + m_blockdevs[i] : nullptr; + } + private: /// Parse the ACPI XSDT and load relevant sub-tables. /// \arg xsdt Pointer to the XSDT from the firmware @@ -100,6 +118,8 @@ private: }; kutil::vector m_irqs; + kutil::vector m_blockdevs; + static device_manager s_instance; device_manager() = delete; diff --git a/src/kernel/main.cpp b/src/kernel/main.cpp index 6df8c0d..9419ce9 100644 --- a/src/kernel/main.cpp +++ b/src/kernel/main.cpp @@ -3,10 +3,7 @@ #include "kutil/assert.h" #include "kutil/memory.h" - -#include "ahci/driver.h" -#include "ahci/port.h" - +#include "block_device.h" #include "console.h" #include "cpu.h" #include "device_manager.h" @@ -27,8 +24,6 @@ extern "C" { void *__bss_start, *__bss_end; } -extern ahci_driver ahcid; - extern void __kernel_assert(const char *, unsigned, const char *); void @@ -98,7 +93,7 @@ kernel_main(popcorn_data *header) devices->init_drivers(); - ahci::port *disk = ahcid.find_disk(); + block_device *disk = devices->get_block_device(0); if (disk) { uint8_t buf[512]; kutil::memset(buf, 0, 512); @@ -113,6 +108,8 @@ kernel_main(popcorn_data *header) } cons->putc('\n'); } + } else { + log::warn(logs::boot, "No block devices present."); } // do_error_1();