Serenity Operating System
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}