Skip to content

Commit 23dccc8

Browse files
mintsuki48cf
andcommitted
Implement PCI relocation
Co-authored-by: iretq <[email protected]>
1 parent 9d986e1 commit 23dccc8

File tree

9 files changed

+1114
-27
lines changed

9 files changed

+1114
-27
lines changed

src/acpi.c

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include <efi.h>
22
#include <io.h>
3+
#include <pci.h>
34
#include <printf.h>
45
#include "csmwrap.h"
56

@@ -38,11 +39,16 @@ void uacpi_kernel_unmap(EFI_UNUSED void *ptr, EFI_UNUSED uacpi_size len) {
3839

3940
uacpi_status uacpi_kernel_pci_device_open(uacpi_pci_address address, uacpi_handle *out_handle) {
4041
void *handle;
41-
if (gBS->AllocatePool(EfiLoaderData, sizeof(uacpi_pci_address), &handle) != EFI_SUCCESS) {
42+
if (gBS->AllocatePool(EfiLoaderData, sizeof(struct pci_address), &handle) != EFI_SUCCESS) {
4243
return UACPI_STATUS_OUT_OF_MEMORY;
4344
}
4445

45-
memcpy(handle, &address, sizeof(uacpi_pci_address));
46+
struct pci_address *pci_address = (struct pci_address *)handle;
47+
pci_address->segment = address.segment;
48+
pci_address->bus = address.bus;
49+
pci_address->slot = address.device;
50+
pci_address->function = address.function;
51+
4652
*out_handle = handle;
4753
return UACPI_STATUS_OK;
4854
}
@@ -52,38 +58,32 @@ void uacpi_kernel_pci_device_close(uacpi_handle handle) {
5258
}
5359

5460
uacpi_status uacpi_kernel_pci_read8(uacpi_handle device, uacpi_size offset, uacpi_u8 *value) {
55-
uacpi_pci_address *address = (uacpi_pci_address *)device;
56-
*value = pciConfigReadByte(address->bus, address->device, address->function, offset);
61+
*value = pci_read8((struct pci_address *)device, offset);
5762
return UACPI_STATUS_OK;
5863
}
5964

6065
uacpi_status uacpi_kernel_pci_read16(uacpi_handle device, uacpi_size offset, uacpi_u16 *value) {
61-
uacpi_pci_address *address = (uacpi_pci_address *)device;
62-
*value = pciConfigReadWord(address->bus, address->device, address->function, offset);
66+
*value = pci_read16((struct pci_address *)device, offset);
6367
return UACPI_STATUS_OK;
6468
}
6569

6670
uacpi_status uacpi_kernel_pci_read32(uacpi_handle device, uacpi_size offset, uacpi_u32 *value) {
67-
uacpi_pci_address *address = (uacpi_pci_address *)device;
68-
*value = pciConfigReadDWord(address->bus, address->device, address->function, offset);
71+
*value = pci_read32((struct pci_address *)device, offset);
6972
return UACPI_STATUS_OK;
7073
}
7174

7275
uacpi_status uacpi_kernel_pci_write8(uacpi_handle device, uacpi_size offset, uacpi_u8 value) {
73-
uacpi_pci_address *address = (uacpi_pci_address *)device;
74-
pciConfigWriteByte(address->bus, address->device, address->function, offset, value);
76+
pci_write8((struct pci_address *)device, offset, value);
7577
return UACPI_STATUS_OK;
7678
}
7779

7880
uacpi_status uacpi_kernel_pci_write16(uacpi_handle device, uacpi_size offset, uacpi_u16 value) {
79-
uacpi_pci_address *address = (uacpi_pci_address *)device;
80-
pciConfigWriteWord(address->bus, address->device, address->function, offset, value);
81+
pci_write16((struct pci_address *)device, offset, value);
8182
return UACPI_STATUS_OK;
8283
}
8384

8485
uacpi_status uacpi_kernel_pci_write32(uacpi_handle device, uacpi_size offset, uacpi_u32 value) {
85-
uacpi_pci_address *address = (uacpi_pci_address *)device;
86-
pciConfigWriteDWord(address->bus, address->device, address->function, offset, value);
86+
pci_write32((struct pci_address *)device, offset, value);
8787
return UACPI_STATUS_OK;
8888
}
8989

src/csmwrap.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include <io.h>
55
#include <x86thunk.h>
66
#include <video.h>
7+
#include <pci.h>
78

89
// Generated by: xxd -i Csm16.bin >> Csm16.h
910
#include <bins/Csm16.h>
@@ -169,6 +170,7 @@ EFI_STATUS efi_main(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
169170
}
170171

171172
acpi_init(&priv);
173+
pci_early_initialize();
172174

173175
Status = csmwrap_video_init(&priv);
174176

@@ -200,8 +202,6 @@ EFI_STATUS efi_main(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
200202
priv.low_stub->vga_oprom_table.PciBus = priv.vga_pci_bus;
201203
priv.low_stub->vga_oprom_table.PciDeviceFunction = priv.vga_pci_devfn;
202204

203-
build_coreboot_table(&priv);
204-
205205
printf("CALL16 %x:%x\n", priv.csm_efi_table->Compatibility16CallSegment,
206206
priv.csm_efi_table->Compatibility16CallOffset);
207207

@@ -244,6 +244,10 @@ EFI_STATUS efi_main(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
244244
/* Disable external interrupts */
245245
asm volatile ("cli");
246246

247+
pci_late_initialize();
248+
249+
build_coreboot_table(&priv);
250+
247251
build_e820_map(&priv, efi_mmap, efi_mmap_size, efi_desc_size);
248252
uintptr_t e820_low = (uintptr_t)&priv.low_stub->e820_map;
249253
priv.csm_efi_table->E820Pointer = e820_low;

src/csmwrap.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ struct csmwrap_priv {
3939
struct cb_framebuffer cb_fb;
4040
};
4141

42+
extern struct csmwrap_priv priv;
43+
4244
extern int unlock_bios_region();
4345
extern int build_coreboot_table(struct csmwrap_priv *priv);
4446
bool acpi_init(struct csmwrap_priv *priv);

0 commit comments

Comments
 (0)