summaryrefslogtreecommitdiffhomepage
path: root/dev/kernel/KernelKit/PCI/Device.h
blob: f2111e4043783ba4d115ba2a59dfdc4a3a22f29f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/* ========================================

  Copyright (C) 2024-2025, Amlal El Mahrouss, licensed under the Apache 2.0 license.

======================================== */
#pragma once

#include <NeKit/Defines.h>

namespace Kernel::PCI {
enum class PciConfigKind : UShort {
  ConfigAddress = 0xCF8,
  ConfigData    = 0xCFC,
  CommandReg    = 0x0004,
  Invalid       = 0xFFFF,
};

/// @brief Device interface class
class Device final {
 public:
  Device() = default;

 public:
  Device(UShort bus, UShort device, UShort function, UInt32 bar);

  Device& operator=(const Device&) = default;
  Device(const Device&)            = default;

  ~Device();

 public:
  UInt Read(UInt bar, Size szData);
  void Write(UInt bar, UIntPtr data, Size szData);

 public:
  operator bool();

 public:
  template <typename T>
  UInt Read(UInt bar) {
    static_assert(sizeof(T) <= sizeof(UInt32), "64-bit PCI addressing is unsupported");
    return Read(bar, sizeof(T));
  }

  template <typename T>
  void Write(UInt bar, UIntPtr data) {
    static_assert(sizeof(T) <= sizeof(UInt32), "64-bit PCI addressing is unsupported");
    Write(bar, data, sizeof(T));
  }

 public:
  UShort  DeviceId();
  UShort  VendorId();
  UShort  InterfaceId();
  UChar   Class();
  UChar   Subclass();
  UChar   ProgIf();
  UChar   HeaderType();
  UIntPtr Bar(UInt32 bar_in);

 public:
  void EnableMmio();
  void BecomeBusMaster();  // for PCI-DMA, PC-DMA does not need that.

  UShort Vendor();

 private:
  UShort fBus;
  UShort fDevice;
  UShort fFunction;
  UInt32 fBar;
};
}  // namespace Kernel::PCI