Kernel: PCI devices can now create region for BAR
This creates either MEM or IO region for read/write access to PCI device.
This commit is contained in:
@@ -13,7 +13,7 @@ namespace Kernel
|
||||
class E1000 final : public NetworkDriver
|
||||
{
|
||||
public:
|
||||
static BAN::ErrorOr<BAN::UniqPtr<E1000>> create(const PCIDevice&);
|
||||
static BAN::ErrorOr<BAN::UniqPtr<E1000>> create(PCI::Device&);
|
||||
~E1000();
|
||||
|
||||
virtual uint8_t* get_mac_address() override { return m_mac_address; }
|
||||
@@ -24,12 +24,12 @@ namespace Kernel
|
||||
|
||||
private:
|
||||
E1000() = default;
|
||||
BAN::ErrorOr<void> initialize(const PCIDevice&);
|
||||
BAN::ErrorOr<void> initialize(PCI::Device&);
|
||||
|
||||
static void interrupt_handler();
|
||||
|
||||
void write32(uint16_t reg, uint32_t value);
|
||||
uint32_t read32(uint16_t reg);
|
||||
void write32(uint16_t reg, uint32_t value);
|
||||
|
||||
void detect_eeprom();
|
||||
uint32_t eeprom_read(uint8_t addr);
|
||||
@@ -44,8 +44,7 @@ namespace Kernel
|
||||
void handle_receive();
|
||||
|
||||
private:
|
||||
PCIDevice::BarType m_bar_type {};
|
||||
uint64_t m_bar_addr {};
|
||||
BAN::UniqPtr<PCI::BarRegion> m_bar_region;
|
||||
bool m_has_eerprom { false };
|
||||
uint8_t m_mac_address[6] {};
|
||||
uint16_t m_rx_current {};
|
||||
|
||||
@@ -1,28 +1,63 @@
|
||||
#pragma once
|
||||
|
||||
#include <BAN/UniqPtr.h>
|
||||
#include <BAN/Vector.h>
|
||||
#include <kernel/Memory/Types.h>
|
||||
|
||||
namespace Kernel
|
||||
namespace Kernel::PCI
|
||||
{
|
||||
|
||||
class PCIDevice
|
||||
enum class BarType
|
||||
{
|
||||
public:
|
||||
enum class BarType
|
||||
{
|
||||
INVAL,
|
||||
MEM,
|
||||
IO,
|
||||
};
|
||||
INVALID,
|
||||
MEM,
|
||||
IO,
|
||||
};
|
||||
|
||||
class Device;
|
||||
|
||||
class BarRegion
|
||||
{
|
||||
BAN_NON_COPYABLE(BarRegion);
|
||||
|
||||
public:
|
||||
PCIDevice(uint8_t, uint8_t, uint8_t);
|
||||
static BAN::ErrorOr<BAN::UniqPtr<BarRegion>> create(PCI::Device&, uint8_t bar_num);
|
||||
~BarRegion();
|
||||
|
||||
BarType type() const { return m_type; }
|
||||
vaddr_t vaddr() const { return m_vaddr; }
|
||||
paddr_t paddr() const { return m_paddr; }
|
||||
size_t size() const { return m_size; }
|
||||
|
||||
void write8(off_t, uint8_t);
|
||||
void write16(off_t, uint16_t);
|
||||
void write32(off_t, uint32_t);
|
||||
|
||||
uint8_t read8(off_t);
|
||||
uint16_t read16(off_t);
|
||||
uint32_t read32(off_t);
|
||||
|
||||
private:
|
||||
BarRegion(BarType, paddr_t, size_t);
|
||||
BAN::ErrorOr<void> initialize();
|
||||
|
||||
private:
|
||||
const BarType m_type {};
|
||||
const paddr_t m_paddr {};
|
||||
const size_t m_size {};
|
||||
vaddr_t m_vaddr {};
|
||||
};
|
||||
|
||||
class Device
|
||||
{
|
||||
public:
|
||||
Device(uint8_t, uint8_t, uint8_t);
|
||||
|
||||
uint32_t read_dword(uint8_t) const;
|
||||
uint16_t read_word(uint8_t) const;
|
||||
uint8_t read_byte(uint8_t) const;
|
||||
|
||||
void write_dword(uint8_t, uint32_t) const;
|
||||
void write_dword(uint8_t, uint32_t);
|
||||
|
||||
uint8_t bus() const { return m_bus; }
|
||||
uint8_t dev() const { return m_dev; }
|
||||
@@ -32,17 +67,24 @@ namespace Kernel
|
||||
uint8_t subclass() const { return m_subclass; }
|
||||
uint8_t prog_if() const { return m_prog_if; }
|
||||
|
||||
BarType read_bar_type(uint8_t) const;
|
||||
uint64_t read_bar_address(uint8_t) const;
|
||||
uint8_t header_type() const { return m_header_type; }
|
||||
|
||||
void enable_bus_mastering() const;
|
||||
void disable_bus_mastering() const;
|
||||
BAN::ErrorOr<BAN::UniqPtr<BarRegion>> allocate_bar_region(uint8_t bar_num);
|
||||
|
||||
void enable_memory_space() const;
|
||||
void disable_memory_space() const;
|
||||
void enable_bus_mastering();
|
||||
void disable_bus_mastering();
|
||||
|
||||
void enable_pin_interrupts() const;
|
||||
void disable_pin_interrupts() const;
|
||||
void enable_memory_space();
|
||||
void disable_memory_space();
|
||||
|
||||
void enable_io_space();
|
||||
void disable_io_space();
|
||||
|
||||
void enable_pin_interrupts();
|
||||
void disable_pin_interrupts();
|
||||
|
||||
private:
|
||||
void enumerate_capabilites();
|
||||
|
||||
private:
|
||||
uint8_t m_bus;
|
||||
@@ -56,19 +98,19 @@ namespace Kernel
|
||||
uint8_t m_header_type;
|
||||
};
|
||||
|
||||
class PCI
|
||||
class PCIManager
|
||||
{
|
||||
BAN_NON_COPYABLE(PCI);
|
||||
BAN_NON_MOVABLE(PCI);
|
||||
BAN_NON_COPYABLE(PCIManager);
|
||||
BAN_NON_MOVABLE(PCIManager);
|
||||
|
||||
public:
|
||||
static void initialize();
|
||||
static PCI& get();
|
||||
static PCIManager& get();
|
||||
|
||||
const BAN::Vector<PCIDevice>& devices() const { return m_devices; }
|
||||
const BAN::Vector<PCI::Device>& devices() const { return m_devices; }
|
||||
|
||||
private:
|
||||
PCI() = default;
|
||||
PCIManager() = default;
|
||||
void check_function(uint8_t bus, uint8_t dev, uint8_t func);
|
||||
void check_device(uint8_t bus, uint8_t dev);
|
||||
void check_bus(uint8_t bus);
|
||||
@@ -76,7 +118,7 @@ namespace Kernel
|
||||
void initialize_devices();
|
||||
|
||||
private:
|
||||
BAN::Vector<PCIDevice> m_devices;
|
||||
BAN::Vector<PCI::Device> m_devices;
|
||||
};
|
||||
|
||||
}
|
||||
@@ -11,13 +11,13 @@ namespace Kernel
|
||||
class ATAController final : public StorageController
|
||||
{
|
||||
public:
|
||||
static BAN::ErrorOr<BAN::RefPtr<ATAController>> create(const PCIDevice&);
|
||||
static BAN::ErrorOr<BAN::RefPtr<ATAController>> create(const PCI::Device&);
|
||||
|
||||
virtual BAN::Vector<BAN::RefPtr<StorageDevice>> devices() override;
|
||||
|
||||
private:
|
||||
ATAController();
|
||||
BAN::ErrorOr<void> initialize(const PCIDevice& device);
|
||||
BAN::ErrorOr<void> initialize(const PCI::Device& device);
|
||||
|
||||
private:
|
||||
ATABus* m_buses[2] { nullptr, nullptr };
|
||||
|
||||
Reference in New Issue
Block a user