Add block device management to device manager

This commit is contained in:
Justin C. Miller
2018-05-12 20:27:46 -07:00
parent 0684fcf7e9
commit 716109bab5
7 changed files with 34 additions and 35 deletions

View File

@@ -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;
}

View File

@@ -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<ahci::hba> m_devices;
};

View File

@@ -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<hba_data *>(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()
{

View File

@@ -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;

View File

@@ -320,3 +320,9 @@ device_manager::allocate_msi(const char *name, pci_device &device, irq_callback
static_cast<uint16_t>(vector));
return true;
}
void
device_manager::register_block_device(block_device *blockdev)
{
m_blockdevs.append(blockdev);
}

View File

@@ -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<irq_allocation> m_irqs;
kutil::vector<block_device *> m_blockdevs;
static device_manager s_instance;
device_manager() = delete;

View File

@@ -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();