mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 23:47:45 +00:00
Kernel: Replace IRQHandler with the new InterruptHandler class
System components that need an IRQ handling are now inheriting the InterruptHandler class. In addition to that, the initialization process of PATAChannel was changed to fit the changes. PATAChannel, E1000NetworkAdapter and RTL8139NetworkAdapter are now inheriting from PCI::Device instead of InterruptHandler directly.
This commit is contained in:
parent
1ee37245cd
commit
6c72736b26
29 changed files with 193 additions and 169 deletions
|
@ -34,10 +34,9 @@ public:
|
|||
|
||||
size_t block_size() const { return m_block_size; }
|
||||
virtual bool is_seekable() const override { return true; }
|
||||
|
||||
protected:
|
||||
BlockDevice(unsigned major, unsigned minor, size_t block_size = PAGE_SIZE)
|
||||
: Device(major, minor)
|
||||
: Device(major, minor, (u8)DEVICE_TYPE::BLOCK_DEVICE)
|
||||
, m_block_size(block_size)
|
||||
{
|
||||
}
|
||||
|
|
|
@ -34,7 +34,7 @@ public:
|
|||
|
||||
protected:
|
||||
CharacterDevice(unsigned major, unsigned minor)
|
||||
: Device(major, minor)
|
||||
: Device(major, minor, (u8)DEVICE_TYPE::CHAR_DEVICE)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
@ -25,48 +25,32 @@
|
|||
*/
|
||||
|
||||
#include <Kernel/Devices/Device.h>
|
||||
#include <Kernel/FileSystem/InodeMetadata.h>
|
||||
#include <Kernel/Devices/HardwareEventsManager.h>
|
||||
#include <LibC/errno_numbers.h>
|
||||
|
||||
static HashMap<u32, Device*>* s_all_devices;
|
||||
|
||||
HashMap<u32, Device*>& Device::all_devices()
|
||||
{
|
||||
if (s_all_devices == nullptr)
|
||||
s_all_devices = new HashMap<u32, Device*>;
|
||||
return *s_all_devices;
|
||||
}
|
||||
|
||||
void Device::for_each(Function<void(Device&)> callback)
|
||||
{
|
||||
for (auto& entry : all_devices())
|
||||
callback(*entry.value);
|
||||
for (auto* entry : HardwareEventsManager::the().get_devices_list()) {
|
||||
ASSERT(entry != nullptr);
|
||||
callback(*entry);
|
||||
}
|
||||
}
|
||||
|
||||
Device* Device::get_device(unsigned major, unsigned minor)
|
||||
{
|
||||
auto it = all_devices().find(encoded_device(major, minor));
|
||||
if (it == all_devices().end())
|
||||
return nullptr;
|
||||
return it->value;
|
||||
return HardwareEventsManager::the().get_device(major, minor);
|
||||
}
|
||||
|
||||
Device::Device(unsigned major, unsigned minor)
|
||||
Device::Device(unsigned major, unsigned minor, u8 device_type)
|
||||
: m_major(major)
|
||||
, m_minor(minor)
|
||||
{
|
||||
u32 device_id = encoded_device(major, minor);
|
||||
auto it = all_devices().find(device_id);
|
||||
if (it != all_devices().end()) {
|
||||
dbg() << "Already registered " << major << "," << minor << ": " << it->value->class_name();
|
||||
}
|
||||
ASSERT(!all_devices().contains(device_id));
|
||||
all_devices().set(device_id, this);
|
||||
HardwareEventsManager::the().register_device(*this, device_type);
|
||||
}
|
||||
|
||||
Device::~Device()
|
||||
{
|
||||
all_devices().remove(encoded_device(m_major, m_minor));
|
||||
HardwareEventsManager::the().unregister_device(*this);
|
||||
}
|
||||
|
||||
String Device::absolute_path() const
|
||||
|
|
|
@ -39,6 +39,11 @@
|
|||
#include <Kernel/FileSystem/File.h>
|
||||
#include <Kernel/UnixTypes.h>
|
||||
|
||||
enum class DEVICE_TYPE {
|
||||
BLOCK_DEVICE = 1,
|
||||
CHAR_DEVICE = 2
|
||||
};
|
||||
|
||||
class Device : public File {
|
||||
public:
|
||||
virtual ~Device() override;
|
||||
|
@ -55,16 +60,17 @@ public:
|
|||
virtual bool is_device() const override { return true; }
|
||||
virtual bool is_disk_device() const { return false; }
|
||||
|
||||
virtual bool is_block_device() const override { return false; }
|
||||
virtual bool is_character_device() const override { return true; }
|
||||
|
||||
static void for_each(Function<void(Device&)>);
|
||||
static Device* get_device(unsigned major, unsigned minor);
|
||||
|
||||
protected:
|
||||
Device(unsigned major, unsigned minor);
|
||||
Device(unsigned major, unsigned minor, u8 device_type);
|
||||
void set_uid(uid_t uid) { m_uid = uid; }
|
||||
void set_gid(gid_t gid) { m_gid = gid; }
|
||||
|
||||
static HashMap<u32, Device*>& all_devices();
|
||||
|
||||
private:
|
||||
unsigned m_major { 0 };
|
||||
unsigned m_minor { 0 };
|
||||
|
|
|
@ -109,7 +109,7 @@ const char* FloppyDiskDevice::class_name() const
|
|||
}
|
||||
|
||||
FloppyDiskDevice::FloppyDiskDevice(FloppyDiskDevice::DriveType type)
|
||||
: IRQHandler(IRQ_FLOPPY_DRIVE)
|
||||
: InterruptHandler(IRQ_FLOPPY_DRIVE)
|
||||
, DiskDevice(89, (type == FloppyDiskDevice::DriveType::Master) ? 0 : 1, BYTES_PER_SECTOR)
|
||||
, m_io_base_addr((type == FloppyDiskDevice::DriveType::Master) ? 0x3F0 : 0x370)
|
||||
{
|
||||
|
@ -167,7 +167,7 @@ bool FloppyDiskDevice::read_sectors_with_dma(u16 lba, u16 count, u8* outbuf)
|
|||
//while(start < PIT::seconds_since_boot() + 1)
|
||||
// ;
|
||||
|
||||
disable_irq();
|
||||
disable_interrupts();
|
||||
|
||||
IO::out8(0xA, FLOPPY_DMA_CHANNEL | 0x4); // Channel 2 SEL, MASK_ON = 1
|
||||
IO::out8(0x0B, 0x56); // Begin DMA, Single Transfer, Increment, Auto, FDC -> RAM, Channel 2
|
||||
|
@ -195,7 +195,7 @@ bool FloppyDiskDevice::read_sectors_with_dma(u16 lba, u16 count, u8* outbuf)
|
|||
send_byte(0x1b); // GPL3 value. The Datasheet doesn't really specify the values for this properly...
|
||||
send_byte(0xff);
|
||||
|
||||
enable_irq();
|
||||
enable_interrupts();
|
||||
|
||||
wait_for_irq(); // TODO: See if there was a lockup here via some "timeout counter"
|
||||
m_interrupted = false;
|
||||
|
@ -269,7 +269,7 @@ bool FloppyDiskDevice::write_sectors_with_dma(u16 lba, u16 count, const u8* inbu
|
|||
//while(start < PIT::seconds_since_boot() + 1)
|
||||
// ;
|
||||
|
||||
disable_irq();
|
||||
disable_interrupts();
|
||||
|
||||
IO::out8(0xA, FLOPPY_DMA_CHANNEL | 0x4); // Channel 2 SEL, MASK_ON = 1
|
||||
IO::out8(0x0B, 0x5A); // Begin DMA, Single Transfer, Increment, Auto, RAM -> FDC, Channel 2
|
||||
|
@ -295,7 +295,7 @@ bool FloppyDiskDevice::write_sectors_with_dma(u16 lba, u16 count, const u8* inbu
|
|||
send_byte(0x1b); // GPL3 value. The Datasheet doesn't really specify the values for this properly...
|
||||
send_byte(0xff);
|
||||
|
||||
enable_irq();
|
||||
enable_interrupts();
|
||||
|
||||
wait_for_irq(); // TODO: See if there was a lockup here via some "timeout counter"
|
||||
m_interrupted = false;
|
||||
|
@ -358,7 +358,7 @@ bool FloppyDiskDevice::wait_for_irq()
|
|||
return true;
|
||||
}
|
||||
|
||||
void FloppyDiskDevice::handle_irq()
|
||||
void FloppyDiskDevice::handle_interrupt()
|
||||
{
|
||||
// The only thing we need to do is acknowledge the IRQ happened
|
||||
m_interrupted = true;
|
||||
|
@ -512,7 +512,7 @@ void FloppyDiskDevice::initialize()
|
|||
kprintf("fdc: m_io_base = 0x%x IRQn = %d\n", m_io_base_addr, IRQ_FLOPPY_DRIVE);
|
||||
#endif
|
||||
|
||||
enable_irq();
|
||||
enable_interrupts();
|
||||
|
||||
// Get the version of the Floppy Disk Controller
|
||||
send_byte(FloppyCommand::Version);
|
||||
|
|
|
@ -101,7 +101,7 @@
|
|||
|
||||
#include <AK/RefPtr.h>
|
||||
#include <Kernel/Devices/DiskDevice.h>
|
||||
#include <Kernel/IRQHandler.h>
|
||||
#include <Kernel/InterruptHandler.h>
|
||||
#include <Kernel/Lock.h>
|
||||
#include <Kernel/VM/PhysicalAddress.h>
|
||||
#include <Kernel/VM/PhysicalPage.h>
|
||||
|
@ -122,7 +122,7 @@ struct FloppyControllerCommand {
|
|||
// uses the Intel 82077A controller. More about this controller can
|
||||
// be found here: http://www.buchty.net/casio/files/82077.pdf
|
||||
//
|
||||
class FloppyDiskDevice final : public IRQHandler
|
||||
class FloppyDiskDevice final : public InterruptHandler
|
||||
, public DiskDevice {
|
||||
AK_MAKE_ETERNAL
|
||||
|
||||
|
@ -178,7 +178,7 @@ protected:
|
|||
|
||||
private:
|
||||
// ^IRQHandler
|
||||
void handle_irq();
|
||||
void handle_interrupt();
|
||||
|
||||
// ^DiskDevice
|
||||
virtual const char* class_name() const override;
|
||||
|
|
65
Kernel/Devices/HardwareEventsManager.cpp
Normal file
65
Kernel/Devices/HardwareEventsManager.cpp
Normal file
|
@ -0,0 +1,65 @@
|
|||
/*
|
||||
* Copyright (c) 2020, Liav A. <liavalb@hotmail.co.il>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <Kernel/Devices/HardwareEventsManager.h>
|
||||
|
||||
static HardwareEventsManager* s_hardware_events_manager;
|
||||
|
||||
HardwareEventsManager& HardwareEventsManager::the()
|
||||
{
|
||||
if (s_hardware_events_manager == nullptr) {
|
||||
s_hardware_events_manager = new HardwareEventsManager();
|
||||
}
|
||||
return *s_hardware_events_manager;
|
||||
}
|
||||
|
||||
HashTable<Device*>& HardwareEventsManager::get_devices_list()
|
||||
{
|
||||
return m_devices;
|
||||
}
|
||||
|
||||
void HardwareEventsManager::unregister_device(Device& device)
|
||||
{
|
||||
get_devices_list().remove(&device);
|
||||
}
|
||||
|
||||
HardwareEventsManager::HardwareEventsManager()
|
||||
{
|
||||
}
|
||||
|
||||
Device* HardwareEventsManager::get_device(unsigned major, unsigned minor)
|
||||
{
|
||||
for (auto* entry : HardwareEventsManager::get_devices_list()) {
|
||||
ASSERT(entry != nullptr);
|
||||
if (entry->major() == major && entry->minor() == minor)
|
||||
return entry;
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
void HardwareEventsManager::register_device(Device& device, u8)
|
||||
{
|
||||
get_devices_list().set(&device);
|
||||
}
|
44
Kernel/Devices/HardwareEventsManager.h
Normal file
44
Kernel/Devices/HardwareEventsManager.h
Normal file
|
@ -0,0 +1,44 @@
|
|||
/*
|
||||
* Copyright (c) 2020, Liav A. <liavalb@hotmail.co.il>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <AK/Types.h>
|
||||
#include <Kernel/Devices/Device.h>
|
||||
|
||||
class HardwareEventsManager {
|
||||
public:
|
||||
static HardwareEventsManager& the();
|
||||
void register_device(Device&, u8);
|
||||
void unregister_device(Device&);
|
||||
void register_device_event();
|
||||
Device* get_device(unsigned, unsigned);
|
||||
HashTable<Device*>& get_devices_list();
|
||||
|
||||
private:
|
||||
HashTable<Device*> m_devices;
|
||||
HardwareEventsManager();
|
||||
};
|
|
@ -483,7 +483,7 @@ void KeyboardDevice::key_state_changed(u8 raw, bool pressed)
|
|||
m_has_e0_prefix = false;
|
||||
}
|
||||
|
||||
void KeyboardDevice::handle_irq()
|
||||
void KeyboardDevice::handle_interrupt()
|
||||
{
|
||||
for (;;) {
|
||||
u8 status = IO::in8(I8042_STATUS);
|
||||
|
@ -551,7 +551,7 @@ KeyboardDevice& KeyboardDevice::the()
|
|||
}
|
||||
|
||||
KeyboardDevice::KeyboardDevice()
|
||||
: IRQHandler(IRQ_KEYBOARD)
|
||||
: InterruptHandler(IRQ_KEYBOARD)
|
||||
, CharacterDevice(85, 1)
|
||||
{
|
||||
s_the = this;
|
||||
|
@ -563,7 +563,7 @@ KeyboardDevice::KeyboardDevice()
|
|||
while (IO::in8(I8042_STATUS) & I8042_BUFFER_FULL)
|
||||
IO::in8(I8042_BUFFER);
|
||||
|
||||
enable_irq();
|
||||
enable_interrupts();
|
||||
}
|
||||
|
||||
KeyboardDevice::~KeyboardDevice()
|
||||
|
|
|
@ -26,16 +26,16 @@
|
|||
|
||||
#pragma once
|
||||
|
||||
#include "IRQHandler.h"
|
||||
#include "KeyCode.h"
|
||||
#include <AK/CircularQueue.h>
|
||||
#include <AK/DoublyLinkedList.h>
|
||||
#include <AK/Types.h>
|
||||
#include <Kernel/Devices/CharacterDevice.h>
|
||||
#include <Kernel/InterruptHandler.h>
|
||||
|
||||
class KeyboardClient;
|
||||
|
||||
class KeyboardDevice final : public IRQHandler
|
||||
class KeyboardDevice final : public InterruptHandler
|
||||
, public CharacterDevice {
|
||||
AK_MAKE_ETERNAL
|
||||
public:
|
||||
|
@ -57,7 +57,7 @@ public:
|
|||
|
||||
private:
|
||||
// ^IRQHandler
|
||||
virtual void handle_irq() override;
|
||||
virtual void handle_interrupt() override;
|
||||
|
||||
// ^CharacterDevice
|
||||
virtual const char* class_name() const override { return "KeyboardDevice"; }
|
||||
|
|
|
@ -112,18 +112,25 @@ static Lock& s_lock()
|
|||
return *lock;
|
||||
};
|
||||
|
||||
OwnPtr<PATAChannel> PATAChannel::create(ChannelType type, bool force_pio)
|
||||
OwnPtr<PATAChannel> PATAChannel::autodetect(ChannelType type, bool force_pio)
|
||||
{
|
||||
return make<PATAChannel>(type, force_pio);
|
||||
PCI::Address found_address;
|
||||
PCI::enumerate_all([&](const PCI::Address& address, PCI::ID id) {
|
||||
if (PCI::get_class(address) == PCI_Mass_Storage_Class && PCI::get_subclass(address) == PCI_IDE_Controller_Subclass) {
|
||||
found_address = address;
|
||||
kprintf("PATAChannel: PATA Controller found! id=%w:%w\n", id.vendor_id, id.device_id);
|
||||
}
|
||||
});
|
||||
return make<PATAChannel>(found_address, type, force_pio);
|
||||
}
|
||||
|
||||
PATAChannel::PATAChannel(ChannelType type, bool force_pio)
|
||||
: IRQHandler((type == ChannelType::Primary ? PATA_PRIMARY_IRQ : PATA_SECONDARY_IRQ))
|
||||
PATAChannel::PATAChannel(PCI::Address pci_address, ChannelType type, bool force_pio)
|
||||
: PCI::Device(pci_address, (type == ChannelType::Primary ? PATA_PRIMARY_IRQ : PATA_SECONDARY_IRQ))
|
||||
, m_channel_number((type == ChannelType::Primary ? 0 : 1))
|
||||
, m_io_base((type == ChannelType::Primary ? 0x1F0 : 0x170))
|
||||
, m_control_base((type == ChannelType::Primary ? 0x3f6 : 0x376))
|
||||
{
|
||||
disable_irq();
|
||||
disable_interrupts();
|
||||
|
||||
m_dma_enabled.resource() = true;
|
||||
ProcFS::add_sys_bool("ide_dma", m_dma_enabled);
|
||||
|
@ -140,14 +147,8 @@ PATAChannel::~PATAChannel()
|
|||
|
||||
void PATAChannel::initialize(bool force_pio)
|
||||
{
|
||||
PCI::enumerate_all([this](const PCI::Address& address, PCI::ID id) {
|
||||
if (PCI::get_class(address) == PCI_Mass_Storage_Class && PCI::get_subclass(address) == PCI_IDE_Controller_Subclass) {
|
||||
m_pci_address = address;
|
||||
kprintf("PATAChannel: PATA Controller found! id=%w:%w\n", id.vendor_id, id.device_id);
|
||||
}
|
||||
});
|
||||
|
||||
if (m_pci_address.is_null()) {
|
||||
if (get_pci_address().is_null()) {
|
||||
kprintf("PATAChannel: PCI address was null; can not set up DMA\n");
|
||||
return;
|
||||
}
|
||||
|
@ -158,9 +159,9 @@ void PATAChannel::initialize(bool force_pio)
|
|||
}
|
||||
|
||||
// Let's try to set up DMA transfers.
|
||||
PCI::enable_bus_mastering(m_pci_address);
|
||||
PCI::enable_bus_mastering(get_pci_address());
|
||||
prdt().end_of_table = 0x8000;
|
||||
m_bus_master_base = PCI::get_BAR4(m_pci_address) & 0xfffc;
|
||||
m_bus_master_base = PCI::get_BAR4(get_pci_address()) & 0xfffc;
|
||||
m_dma_buffer_page = MM.allocate_supervisor_physical_page();
|
||||
kprintf("PATAChannel: Bus master IDE: I/O @ %x\n", m_bus_master_base);
|
||||
}
|
||||
|
@ -181,12 +182,11 @@ static void print_ide_status(u8 status)
|
|||
void PATAChannel::wait_for_irq()
|
||||
{
|
||||
cli();
|
||||
enable_irq();
|
||||
InterruptHandler::Enabler enabler(*this);
|
||||
current->wait_on(m_irq_queue);
|
||||
disable_irq();
|
||||
}
|
||||
|
||||
void PATAChannel::handle_irq()
|
||||
void PATAChannel::handle_interrupt()
|
||||
{
|
||||
u8 status = IO::in8(m_io_base + ATA_REG_STATUS);
|
||||
if (status & ATA_SR_ERR) {
|
||||
|
|
|
@ -38,9 +38,10 @@
|
|||
|
||||
#include <AK/OwnPtr.h>
|
||||
#include <AK/RefPtr.h>
|
||||
#include <Kernel/IRQHandler.h>
|
||||
#include <Kernel/InterruptHandler.h>
|
||||
#include <Kernel/Lock.h>
|
||||
#include <Kernel/PCI/Access.h>
|
||||
#include <Kernel/PCI/Device.h>
|
||||
#include <Kernel/VM/PhysicalAddress.h>
|
||||
#include <Kernel/VM/PhysicalPage.h>
|
||||
#include <Kernel/WaitQueue.h>
|
||||
|
@ -52,7 +53,7 @@ struct PhysicalRegionDescriptor {
|
|||
};
|
||||
|
||||
class PATADiskDevice;
|
||||
class PATAChannel final : public IRQHandler {
|
||||
class PATAChannel final : public PCI::Device {
|
||||
friend class PATADiskDevice;
|
||||
AK_MAKE_ETERNAL
|
||||
public:
|
||||
|
@ -62,8 +63,8 @@ public:
|
|||
};
|
||||
|
||||
public:
|
||||
static OwnPtr<PATAChannel> create(ChannelType type, bool force_pio);
|
||||
PATAChannel(ChannelType type, bool force_pio);
|
||||
static OwnPtr<PATAChannel> autodetect(ChannelType type, bool force_pio);
|
||||
PATAChannel(PCI::Address pci_address, ChannelType type, bool force_pio);
|
||||
virtual ~PATAChannel() override;
|
||||
|
||||
RefPtr<PATADiskDevice> master_device() { return m_master; };
|
||||
|
@ -71,7 +72,7 @@ public:
|
|||
|
||||
private:
|
||||
//^ IRQHandler
|
||||
virtual void handle_irq() override;
|
||||
virtual void handle_interrupt() override;
|
||||
|
||||
void initialize(bool force_pio);
|
||||
void detect_disks();
|
||||
|
@ -90,7 +91,6 @@ private:
|
|||
|
||||
WaitQueue m_irq_queue;
|
||||
|
||||
PCI::Address m_pci_address;
|
||||
PhysicalRegionDescriptor& prdt() { return *reinterpret_cast<PhysicalRegionDescriptor*>(m_prdt_page->paddr().offset(0xc0000000).as_ptr()); }
|
||||
RefPtr<PhysicalPage> m_prdt_page;
|
||||
RefPtr<PhysicalPage> m_dma_buffer_page;
|
||||
|
|
|
@ -31,7 +31,7 @@
|
|||
#pragma once
|
||||
|
||||
#include <Kernel/Devices/DiskDevice.h>
|
||||
#include <Kernel/IRQHandler.h>
|
||||
#include <Kernel/InterruptHandler.h>
|
||||
#include <Kernel/Lock.h>
|
||||
|
||||
class PATAChannel;
|
||||
|
|
|
@ -54,7 +54,7 @@
|
|||
static PS2MouseDevice* s_the;
|
||||
|
||||
PS2MouseDevice::PS2MouseDevice()
|
||||
: IRQHandler(IRQ_MOUSE)
|
||||
: InterruptHandler(IRQ_MOUSE)
|
||||
, CharacterDevice(10, 1)
|
||||
{
|
||||
s_the = this;
|
||||
|
@ -70,7 +70,7 @@ PS2MouseDevice& PS2MouseDevice::the()
|
|||
return *s_the;
|
||||
}
|
||||
|
||||
void PS2MouseDevice::handle_irq()
|
||||
void PS2MouseDevice::handle_interrupt()
|
||||
{
|
||||
for (;;) {
|
||||
u8 status = IO::in8(I8042_STATUS);
|
||||
|
@ -242,7 +242,7 @@ void PS2MouseDevice::initialize_device()
|
|||
kprintf("PS2MouseDevice: No mouse wheel detected!\n");
|
||||
}
|
||||
|
||||
enable_irq();
|
||||
enable_interrupts();
|
||||
}
|
||||
|
||||
void PS2MouseDevice::expect_ack()
|
||||
|
|
|
@ -28,10 +28,10 @@
|
|||
|
||||
#include <AK/CircularQueue.h>
|
||||
#include <Kernel/Devices/CharacterDevice.h>
|
||||
#include <Kernel/IRQHandler.h>
|
||||
#include <Kernel/InterruptHandler.h>
|
||||
#include <Kernel/MousePacket.h>
|
||||
|
||||
class PS2MouseDevice final : public IRQHandler
|
||||
class PS2MouseDevice final : public InterruptHandler
|
||||
, public CharacterDevice {
|
||||
public:
|
||||
PS2MouseDevice();
|
||||
|
@ -47,7 +47,7 @@ public:
|
|||
|
||||
private:
|
||||
// ^IRQHandler
|
||||
virtual void handle_irq() override;
|
||||
virtual void handle_interrupt() override;
|
||||
|
||||
// ^CharacterDevice
|
||||
virtual const char* class_name() const override { return "PS2MouseDevice"; }
|
||||
|
|
|
@ -74,7 +74,7 @@ void SB16::set_sample_rate(uint16_t hz)
|
|||
static SB16* s_the;
|
||||
|
||||
SB16::SB16()
|
||||
: IRQHandler(5)
|
||||
: InterruptHandler(5)
|
||||
, CharacterDevice(42, 42) // ### ?
|
||||
{
|
||||
s_the = this;
|
||||
|
@ -92,7 +92,7 @@ SB16& SB16::the()
|
|||
|
||||
void SB16::initialize()
|
||||
{
|
||||
disable_irq();
|
||||
disable_interrupts();
|
||||
|
||||
IO::out8(0x226, 1);
|
||||
IO::delay();
|
||||
|
@ -153,7 +153,7 @@ void SB16::dma_start(uint32_t length)
|
|||
IO::out8(0xd4, (channel % 4));
|
||||
}
|
||||
|
||||
void SB16::handle_irq()
|
||||
void SB16::handle_interrupt()
|
||||
{
|
||||
// Stop sound output ready for the next block.
|
||||
dsp_write(0xd5);
|
||||
|
@ -168,9 +168,8 @@ void SB16::handle_irq()
|
|||
void SB16::wait_for_irq()
|
||||
{
|
||||
cli();
|
||||
enable_irq();
|
||||
InterruptHandler::Enabler enabler(*this);
|
||||
current->wait_on(m_irq_queue);
|
||||
disable_irq();
|
||||
}
|
||||
|
||||
ssize_t SB16::write(FileDescription&, const u8* data, ssize_t length)
|
||||
|
|
|
@ -28,14 +28,14 @@
|
|||
|
||||
#include <AK/CircularQueue.h>
|
||||
#include <Kernel/Devices/CharacterDevice.h>
|
||||
#include <Kernel/IRQHandler.h>
|
||||
#include <Kernel/InterruptHandler.h>
|
||||
#include <Kernel/VM/PhysicalAddress.h>
|
||||
#include <Kernel/VM/PhysicalPage.h>
|
||||
#include <Kernel/WaitQueue.h>
|
||||
|
||||
class SB16;
|
||||
|
||||
class SB16 final : public IRQHandler
|
||||
class SB16 final : public InterruptHandler
|
||||
, public CharacterDevice {
|
||||
public:
|
||||
SB16();
|
||||
|
@ -51,7 +51,7 @@ public:
|
|||
|
||||
private:
|
||||
// ^IRQHandler
|
||||
virtual void handle_irq() override;
|
||||
virtual void handle_interrupt() override;
|
||||
|
||||
// ^CharacterDevice
|
||||
virtual const char* class_name() const override { return "SB16"; }
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue