Serenity Operating System
at master 56 lines 2.2 kB view raw
1/* 2 * Copyright (c) 2022, Liav A. <liavalb@hotmail.co.il> 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#pragma once 8 9#include <AK/Bitmap.h> 10#include <AK/Vector.h> 11#include <Kernel/Bus/PCI/Definitions.h> 12#include <Kernel/Locking/Spinlock.h> 13 14namespace Kernel::PCI { 15 16AK_TYPEDEF_DISTINCT_ORDERED_ID(u8, BusNumber); 17AK_TYPEDEF_DISTINCT_ORDERED_ID(u8, DeviceNumber); 18AK_TYPEDEF_DISTINCT_ORDERED_ID(u8, FunctionNumber); 19 20class HostController { 21public: 22 virtual ~HostController() = default; 23 24 virtual void write8_field(BusNumber, DeviceNumber, FunctionNumber, u32 field, u8 value) = 0; 25 virtual void write16_field(BusNumber, DeviceNumber, FunctionNumber, u32 field, u16 value) = 0; 26 virtual void write32_field(BusNumber, DeviceNumber, FunctionNumber, u32 field, u32 value) = 0; 27 28 virtual u8 read8_field(BusNumber, DeviceNumber, FunctionNumber, u32 field) = 0; 29 virtual u16 read16_field(BusNumber, DeviceNumber, FunctionNumber, u32 field) = 0; 30 virtual u32 read32_field(BusNumber, DeviceNumber, FunctionNumber, u32 field) = 0; 31 32 u32 domain_number() const { return m_domain.domain_number(); } 33 34 void enumerate_attached_devices(Function<IterationDecision(EnumerableDeviceIdentifier)> callback); 35 36private: 37 void enumerate_bus(Function<IterationDecision(EnumerableDeviceIdentifier)> const& callback, BusNumber, bool recursive); 38 void enumerate_functions(Function<IterationDecision(EnumerableDeviceIdentifier)> const& callback, BusNumber, DeviceNumber, FunctionNumber, bool recursive); 39 void enumerate_device(Function<IterationDecision(EnumerableDeviceIdentifier)> const& callback, BusNumber bus, DeviceNumber device, bool recursive); 40 41 u8 read8_field(BusNumber, DeviceNumber, FunctionNumber, RegisterOffset field); 42 u16 read16_field(BusNumber, DeviceNumber, FunctionNumber, RegisterOffset field); 43 44 Optional<u8> get_capabilities_pointer_for_function(BusNumber, DeviceNumber, FunctionNumber); 45 Vector<Capability> get_capabilities_for_function(BusNumber, DeviceNumber, FunctionNumber); 46 47protected: 48 explicit HostController(PCI::Domain const& domain); 49 50 const PCI::Domain m_domain; 51 52private: 53 Bitmap m_enumerated_buses; 54}; 55 56}