20#ifndef MACHINE_DEVICE_H
21#define MACHINE_DEVICE_H
22#include "pedigree/kernel/compiler.h"
23#include "pedigree/kernel/processor/types.h"
24#include "pedigree/kernel/utilities/String.h"
25#include "pedigree/kernel/utilities/Vector.h"
29#include "pedigree/kernel/LockGuard.h"
30#include "pedigree/kernel/process/Mutex.h"
32#include "pedigree/kernel/machine/Pci.h"
33#include "pedigree/kernel/utilities/utility.h"
68 static bool treeLockHeldByCurrentThread();
98 Address(
const String& n, uintptr_t a,
size_t s,
bool io,
size_t pad = 1);
101 void map(
size_t forcedSize = 0,
bool bUser =
false,
bool bWriteCombine =
false,
102 bool bWriteThrough =
false);
158 static void foreach (Callback callback,
Device* root = 0);
159 template <
class F,
class... Args>
160 static void foreach (pedigree_std::Callable<F>& callback,
Device * root, Args... args);
163 static void addToRoot(
Device* device);
175 virtual void getName(
String& str);
184 return m_SpecificType;
188 m_SpecificType = pedigree_std::move(str);
194 m_PciDevicePos = device;
195 m_PciFunctionNum = func;
200 uint16_t deviceId, uint8_t progIf) {
201 m_ClassCode = classCode;
202 m_SubclassCode = subclassCode;
203 m_VendorId = vendorId;
204 m_DeviceId = deviceId;
205 m_ProgInterface = progIf;
209 m_ConfigHeader = space;
213 return m_ConfigHeader;
221 return m_SubclassCode;
233 return m_ProgInterface;
241 return m_PciDevicePos;
245 return m_PciFunctionNum;
248 Device* getPhysicalFunction()
const {
249 return m_PhysicalFunction;
251 size_t getVirtualFunctionIndex()
const {
252 return m_VirtualFunctionIndex;
256 m_PhysicalFunction = physicalFunction;
257 m_VirtualFunctionIndex = index;
262 str.assign(
"Abstract Device", 16);
272 return m_InterruptNumber;
277 m_InterruptNumber = n;
282 void addChild(
Device* pDevice);
286 Device* getChild(
size_t n);
289 size_t getNumChildren();
293 void removeChild(
size_t n);
296 void removeChild(
Device* d);
305 static void searchByVendorId(uint16_t vendorId,
void (*callback)(
Device*),
Device* root = 0);
306 static void searchByVendorIdAndDeviceId(uint16_t vendorId, uint16_t deviceId,
308 static void searchByClass(uint16_t classCode,
void (*callback)(
Device*),
Device* root = 0);
309 static void searchByClassAndSubclass(uint16_t classCode, uint16_t subclassCode,
311 static void searchByClassSubclassAndProgInterface(uint16_t classCode, uint16_t subclassCode,
312 uint8_t progInterface,
318 template <
class F,
class... Args>
319 static void foreachInternal(pedigree_std::Callable<F>& callback,
Device* root, Args... args);
321 static void searchByVendorIdInternal(uint16_t vendorId,
void (*callback)(
Device*),
Device* root);
322 static void searchByVendorIdAndDeviceIdInternal(uint16_t vendorId, uint16_t deviceId,
324 static void searchByClassInternal(uint16_t classCode,
void (*callback)(
Device*),
Device* root);
325 static void searchByClassAndSubclassInternal(uint16_t classCode, uint16_t subclassCode,
327 static void searchByClassSubclassAndProgInterfaceInternal(uint16_t classCode,
328 uint16_t subclassCode,
329 uint8_t progInterface,
330 void (*callback)(
Device*),
335 void removeIoMappings();
338 NOT_COPYABLE_OR_ASSIGNABLE(
Device);
354 Device* m_PhysicalFunction;
355 size_t m_VirtualFunctionIndex;
387template <
class F,
class... Args>
400template <
class F,
class... Args>
405 Device* result = callback(child, args...);
411 }
else if (result != child) {
uint16_t getPciDeviceId()
Device * getChild(size_t n)
uint16_t getPciVendorId()
uint32_t getPciFunctionNumber()
uint32_t getPciDevicePosition()
static void foreach(Callback callback, Device *root=0)
void setPciConfigHeader(const PciBus::ConfigSpace &space)
virtual Vector< Address * > & addresses()
void setPciIdentifiers(uint8_t classCode, uint8_t subclassCode, uint16_t vendorId, uint16_t deviceId, uint8_t progIf)
static void foreachInternal(Callback callback, Device *root)
virtual void dump(String &str)
@ Generic
The device type is not covered by any other value.
@ Sound
A device that can play sounds.
@ Console
A keyboard-like human interface device.
@ Root
The device is the root of the device tree.
@ Network
A communication device.
@ UsbController
Same as Controller, but exposes USB devices.
@ Disk
A disk device - a block device in UNIX terms.
@ UsbGeneric
Same as Generic, but for USB devices.
virtual void setInterruptNumber(uintptr_t n)
uint8_t getPciClassCode()
virtual void setSpecificType(String str)
virtual const String & getSpecificType()
Vector< Address * > m_Addresses
PciBus::ConfigSpace getPciConfigHeader() const
uint8_t getPciSubclassCode()
uintptr_t m_InterruptNumber
PciBus::ConfigSpace m_ConfigHeader
uint8_t getPciProgInterface()
Vector< Device * > m_Children
void setVirtualFunction(Device *physicalFunction, size_t index)
Device * getParent() const
virtual uintptr_t getInterruptNumber()
uint32_t getPciBusPosition()
void setParent(Device *p)
void removeChild(size_t n)
void replaceChild(Device *src, Device *dest)
void setPciPosition(uint32_t bus, uint32_t device, uint32_t func)
uint32_t m_PciFunctionNum
Abstrace base class for hardware I/O capabilities.
bool acquire(size_t n=1, size_t timeoutSecs=0, size_t timeoutUsecs=0)
A vector / dynamic array.