Voxia OS v0.0.1
Hobby Project Operating System Targeting x86-64
Loading...
Searching...
No Matches
init.cpp
Go to the documentation of this file.
1#include "xhci/xhci.hpp"
2#include "ioforge/ioforge.h"
4#include <ioforge/ioforge.hpp>
5
7
9
12
16
19 if (!device) {
20 log(mod, "Device not found (0x%x:0x%x)", XHCI_VENDOR_ID,
22 // Try searching for any XHCI controller (Class 0C, Subclass 03, ProgIf 30)
23 // But findDevice only takes vendor/device ID in this framework?
24 // Let's assume the user wants me to handle the one I found.
25 return;
26 }
27 log(mod, "XHCI device found at %x:%x.%d", device->bus, device->device,
28 device->function);
29
30 uintptr_t bar = device->bar[0].address;
31 log(mod, "BAR0: 0x%x", bar);
32
33 cap_regs = (struct xhci_cap_regs*) bar;
34 op_regs = (struct xhci_op_regs*) (bar + cap_regs->caplength);
35 runtime_regs = (struct xhci_runtime_regs*) (bar + cap_regs->rtsoff);
36 doorbell_regs = (volatile uint32_t*) (bar + cap_regs->dboff);
37
38 log(mod, "HCI version: %x", cap_regs->hciversion);
39
42
43 // Enable interrupts if needed
44 if (device->interrupt_line) {
45 auto irq = IOUtils::irq_alloc_entry();
46 IOUtils::isr_map(device->interrupt_line, irq);
47 IOUtils::irq_register(irq, (void*) XHCIModule::fireHandler);
48 }
49
51
52 log(mod, "XHCI Loaded");
53}
54
55extern "C" void
57 size_t request_size, uint32_t response_phys,
58 size_t response_size) {
60 addr, endpoint, data_phys, request_size, response_phys,
61 response_size);
62}
63
64__attribute__((constructor)) static void xhci_constructor() {
65 struct ioforge_usb_controller_device* usb_controller =
66 (struct ioforge_usb_controller_device*) IOForge::IOUtils::alloc(
67 sizeof(struct ioforge_usb_controller_device));
68 usb_controller->base.type = IOFORGE_USB_CONTROLLER;
69
70 IOForge::IOUtils::strcopy((char*) usb_controller->base.name,
71 (char*) "XHCI");
72 usb_controller->ops.send = xhci_send_async_stub;
73
74 XHCIModule::getInstance()->set_controller(usb_controller);
75 ioforge_attach(ioforge_get_usb_ctrl_root(), &usb_controller->base);
76}
77
79 // Handle interrupts
80}
static void * alloc(size_t size)
Definition ioforge.hpp:39
static void strcopy(char *dst, char *src)
Definition ioforge.hpp:56
const char * mod
Definition ioforge.hpp:65
struct ioforge_pci_device * findDevice(uint16_t vendor_id, uint16_t device_id)
IOforgePCI(const char *mod)
XHCIModule()
Definition init.cpp:10
ioforge_pci_device * device
Definition xhci.hpp:153
void set_controller(ioforge_usb_controller_device *ctrl)
Definition xhci.hpp:132
static XHCIModule instance
Definition xhci.hpp:197
volatile uint32_t * doorbell_regs
Definition xhci.hpp:157
void send_async_with_response(uint8_t addr, uint8_t endpoint, uint32_t data_phys, size_t size, uint32_t response_phys, size_t response_size)
Definition xhci.cpp:222
void probe_ports()
Definition xhci.cpp:82
void reset_controller()
Definition xhci.cpp:6
struct xhci_op_regs * op_regs
Definition xhci.hpp:155
void load() override
Definition init.cpp:17
static XHCIModule * getInstance()
Definition init.cpp:13
struct xhci_cap_regs * cap_regs
Definition xhci.hpp:154
struct xhci_runtime_regs * runtime_regs
Definition xhci.hpp:156
void init_controller()
Definition xhci.cpp:24
static void fireHandler()
Definition init.cpp:78
volatile uint64_t addr
Definition e1000.hpp:0
typedef __attribute__
Definition msi.c:47
void ioforge_attach(struct ioforge_device *parent, struct ioforge_device *child)
@ IOFORGE_USB_CONTROLLER
Definition ioforge.h:17
#define log(mod, fmt,...)
Definition ioforge.hpp:12
#define IoForgeModuleConstructor(Class)
Definition ioforge.hpp:7
struct ioforge_device * ioforge_get_usb_ctrl_root()
unsigned int uint32_t
Definition type.h:19
unsigned long uintptr_t
Definition type.h:73
unsigned char uint8_t
Definition type.h:7
uint8_t bar
Definition virtio.h:4
void xhci_send_async_stub(uint32_t addr, uint8_t endpoint, uint32_t data_phys, size_t request_size, uint32_t response_phys, size_t response_size)
Definition init.cpp:56
#define XHCI_VENDOR_ID
Definition xhci.hpp:8
#define XHCI_DEVICE_ID
Definition xhci.hpp:9