Voxia OS v0.0.1
Hobby Project Operating System Targeting x86-64
Loading...
Searching...
No Matches
pcie.c
Go to the documentation of this file.
1#include "hal/acpi/acpi.h"
2#include "hal/cpu/paging.h"
3#include "hal/pci/pci.h"
4#include "libk/serial.h"
5#include <type.h>
6#include "memory/vm_manager.h"
7#include <hal/pci/pcie.h>
8
10 uint8_t func, uint16_t offset) {
11 uintptr_t addr = base + ((uintptr_t) bus << 20)
12 + ((uintptr_t) dev << 15) + ((uintptr_t) func << 12)
13 + offset;
14 return *(volatile uint32_t*) addr;
15}
16
17static void ecam_write32(uintptr_t base, uint8_t bus, uint8_t dev, uint8_t func,
19 uintptr_t addr = base + ((uintptr_t) bus << 20)
20 + ((uintptr_t) dev << 15) + ((uintptr_t) func << 12)
21 + offset;
22 *(volatile uint32_t*) addr = val;
23}
24
26 .read32 = ecam_read32,
27 .write32 = ecam_write32,
28};
29
30extern void
31register_segment(uint16_t seg_id, uint8_t start, uint8_t end, uintptr_t vbase,
33
35
37 LOG2_INFO("PCIE", "found mcfg on 0x%x", addr);
38
39 MCFG_t* mcfg = (MCFG_t*) addr;
40 struct SDT* sdt = (struct SDT*) &mcfg->sdt;
41
42 LOG_INFO("PCIE", "MCFG Length : %d", sdt->Length);
43 LOG_INFO("PCIE", "MCFG Signature : %s", sdt->Signature);
44
45 size_t header_size = sizeof(struct SDT) + sizeof(uint64_t);
46 size_t device_count = (sdt->Length - header_size)
48 LOG_INFO("PCIE", "device count : %d", device_count);
49
50 has_ecam = device_count > 0;
51
52 for (size_t i = 0; i < device_count; i++) {
53 MCFG_configuration_space_t* cs = &mcfg->conf[i];
54
55 uint8_t start = cs->start_pci_bus;
56 uint8_t end = cs->end_pci_bus;
57 LOG_INFO("PCIE CONF", "start : %d end : %d", start, end);
58
59 size_t mapping_size = (size_t) (end - start + 1) * 1024 * 1024;
60 size_t mapping_pages =
61 (mapping_size + PAGE_SIZE - 1) / PAGE_SIZE;
62
63 uintptr_t vaddr =
65 if (!vaddr) {
66 LOG_INFO("pcie", "vaddr is 0");
67 }
68 LOG_INFO("PCIE CONF", "found vaddr : 0x%lx (%d KB)", vaddr,
69 mapping_pages * 4);
70
72 cs->base_addr, mapping_pages, 0b10011);
74
75 LOG_INFO("PCIE CONF", "base addr : 0x%lx -> 0x%lx",
76 cs->base_addr, vaddr);
77
78 uintptr_t adjusted_base = vaddr - ((uintptr_t) start << 20);
79
81 cs->end_pci_bus, adjusted_base, &ecam_ops,
83
84 // TODO:integrasikan dengan pci yang sudah ada
85 // for (uint16_t bus = start; bus <= end; bus++) {
86 // for (uint8_t dev = 0; dev < 32; dev++) {
87
88 // /* Check function 0 first; bail early on absent
89 // * device */
90 // uint32_t id0 =
91 // pcie_read32(vaddr, bus, dev, 0, 0x00);
92 // uint16_t vendor = id0 & 0xFFFF;
93 // if (vendor == 0xFFFF)
94 // continue;
95
96 // uint8_t header =
97 // (pcie_read32(vaddr, bus, dev, 0, 0x0C) >>
98 // 16) &
99 // 0xFF;
100 // uint8_t func_count = (header & 0x80) ? 8 : 1;
101
102 // for (uint8_t func = 0; func < func_count;
103 // func++) {
104
105 // /* Reuse id0 for func 0; read fresh for
106 // * the rest */
107 // uint32_t id =
108 // (func == 0)
109 // ? id0
110 // : pcie_read32(vaddr, bus, dev,
111 // func, 0x00);
112 // if ((id & 0xFFFF) == 0xFFFF)
113 // continue;
114
115 // uint32_t reg08 = pcie_read32(
116 // vaddr, bus, dev, func, 0x08);
117 // uint8_t class_c = (reg08 >> 24) & 0xFF;
118 // uint8_t subcls = (reg08 >> 16) & 0xFF;
119
120 // auto vendor_id =
121 // (uint16_t)(id & 0xFFFF);
122 // auto device_id =
123 // (uint16_t)((id >> 16) & 0xFFFF);
124
125 // LOG_INFO("PCIE Device",
126 // "[%d:%d:%d] class=0x%x "
127 // "sub=0x02%x",
128 // bus, dev, func, class_c,
129 // (uint8_t)subcls);
130 // LOG_INFO(
131 // "PCIE Device",
132 // "vendor id : 0x%x device id : 0x%x",
133 // vendor_id, device_id);
134 // }
135 // }
136 // }
137 }
138}
void * ops
Definition dev.h:2
volatile uint64_t addr
Definition e1000.hpp:0
elf_section_map uintptr_t base
Definition elf.h:296
void paging_reload(page_t p)
Definition paging.c:457
page_t paging_get_highest_page_map(void)
Definition paging.c:463
void vxMultipleMmap(page_t page_dir, uint64_t virt, uint64_t phys, uint64_t size, uint64_t flags)
Definition paging.c:340
#define PAGE_SIZE
Definition paging.h:6
struct pci_access_ops pci_access_ops_t
PCI_SEGMENT_TYPE
Definition pci.h:17
@ PCI_SEGMENT_PCIE
Definition pci.h:19
boolean_t has_ecam
Definition pcie.c:34
void mcfg_parse(uintptr_t addr)
Definition pcie.c:36
static pci_access_ops_t ecam_ops
Definition pcie.c:25
static uint32_t ecam_read32(uintptr_t base, uint8_t bus, uint8_t dev, uint8_t func, uint16_t offset)
Definition pcie.c:9
static void ecam_write32(uintptr_t base, uint8_t bus, uint8_t dev, uint8_t func, uint16_t offset, uint32_t val)
Definition pcie.c:17
void register_segment(uint16_t seg_id, uint8_t start, uint8_t end, uintptr_t vbase, pci_access_ops_t *ops, PCI_SEGMENT_TYPE type)
Definition scan.c:26
#define LOG_INFO(mod, fmt,...)
Definition serial.h:20
#define LOG2_INFO(mod, fmt,...)
Definition serial.h:33
uint16_t pci_segment_group
Definition pcie.h:9
Definition acpi.h:14
char Signature[4]
Definition acpi.h:15
uint32_t Length
Definition acpi.h:16
unsigned short uint16_t
Definition type.h:13
unsigned int uint32_t
Definition type.h:19
uint8_t boolean_t
Definition type.h:89
unsigned long uintptr_t
Definition type.h:73
unsigned long uint64_t
Definition type.h:25
unsigned char uint8_t
Definition type.h:7
unsigned long size_t
Definition type.h:55
uint32_t offset
Definition virtio.h:6
uintptr_t vma_lookup_free_vaddr(struct virtual_memory_page *page, mem_vma_region region, size_t size)
Definition vm_manager.c:156
struct virtual_memory_page * get_kernel_vmm_page()
@ VMA_REGION_C
Definition vm_manager.h:15
uint8_t type
Definition vnode.h:2