mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 21:22:46 +00:00 
			
		
		
		
	 68c3f9aa5a
			
		
	
	
		68c3f9aa5a
		
	
	
	
	
		
			
			This class is part of the PCI code so let's move it to the PCI namespace like other handling code parts of the PCI bus.
		
			
				
	
	
		
			59 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			59 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  * Copyright (c) 2021-2022, Liav A. <liavalb@hotmail.co.il>
 | |
|  *
 | |
|  * SPDX-License-Identifier: BSD-2-Clause
 | |
|  */
 | |
| 
 | |
| #pragma once
 | |
| 
 | |
| #include <Kernel/Devices/Device.h>
 | |
| #include <Kernel/Devices/Storage/ATA/AHCI/Controller.h>
 | |
| #include <Kernel/Devices/Storage/ATA/AHCI/Port.h>
 | |
| #include <Kernel/Devices/Storage/StorageDevice.h>
 | |
| #include <Kernel/Interrupts/PCIIRQHandler.h>
 | |
| #include <Kernel/Library/LockRefPtr.h>
 | |
| #include <Kernel/Locking/Mutex.h>
 | |
| #include <Kernel/Memory/PhysicalAddress.h>
 | |
| #include <Kernel/Memory/PhysicalPage.h>
 | |
| #include <Kernel/Sections.h>
 | |
| #include <Kernel/Security/Random.h>
 | |
| #include <Kernel/Tasks/WaitQueue.h>
 | |
| 
 | |
| namespace Kernel {
 | |
| 
 | |
| class AsyncBlockDeviceRequest;
 | |
| 
 | |
| class AHCIController;
 | |
| class AHCIPort;
 | |
| class AHCIInterruptHandler final : public PCI::IRQHandler {
 | |
|     friend class AHCIController;
 | |
| 
 | |
| public:
 | |
|     static ErrorOr<NonnullOwnPtr<AHCIInterruptHandler>> create(AHCIController&, u8 irq, AHCI::MaskedBitField taken_ports);
 | |
|     virtual ~AHCIInterruptHandler() override;
 | |
| 
 | |
|     virtual StringView purpose() const override { return "SATA IRQ Handler"sv; }
 | |
| 
 | |
|     bool is_responsible_for_port_index(u32 port_index) const { return m_taken_ports.is_set_at(port_index); }
 | |
| 
 | |
| private:
 | |
|     AHCIInterruptHandler(AHCIController&, u8 irq, AHCI::MaskedBitField taken_ports);
 | |
| 
 | |
|     void allocate_resources_and_initialize_ports();
 | |
| 
 | |
|     //^ IRQHandler
 | |
|     virtual bool handle_irq(RegisterState const&) override;
 | |
| 
 | |
|     enum class Direction : u8 {
 | |
|         Read,
 | |
|         Write,
 | |
|     };
 | |
| 
 | |
|     AHCI::MaskedBitField create_pending_ports_interrupts_bitfield() const;
 | |
| 
 | |
|     // Data members
 | |
|     NonnullLockRefPtr<AHCIController> m_parent_controller;
 | |
|     AHCI::MaskedBitField m_taken_ports;
 | |
|     AHCI::MaskedBitField m_pending_ports_interrupts;
 | |
| };
 | |
| }
 |