summaryrefslogtreecommitdiff
path: root/stage3/pci.c
blob: d764171287c64ae1f00c424684942a2db2d99fa2 (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
#include "pci.h"
#include "def.h"
#include "io.h"
#include "font.h"

#define PCI_CONFIG_ADDRESS 0xCF8
#define PCI_CONFIG_DATA 0xCFC

void pci_enumerate()
{
	typedef struct __attribute__((packed)) {
		u8 offset;
		unsigned int func : 3;
		unsigned int dev : 5;
		u8 bus;
		unsigned int reserved : 7;
		bool enable : 1;
	} pci_config_addr;

	for (int bus = 0; bus < 256; bus++)
	for (int dev = 0; dev < 32; dev++) {
		pci_config_addr addr = {
			.offset = 0,
			.func = 0,
			.dev = dev,
			.bus = bus,
			.enable = true,
		};

		outl(PCI_CONFIG_ADDRESS, BITCAST(addr, pci_config_addr, u32));
		u32 x = inl(PCI_CONFIG_DATA);
		if (x != 0xFFFFFFFF) {
			print(S("bus: ")); print_num_pad(bus, 16, 2, ' ');
			print(S(" dev: ")); print_num_pad(dev, 16, 1, ' ');
			print(S(" vendor: ")); print_num_pad(x & 0xFFFF, 16, 4, ' ');
			print(S(" id: ")); print_num_pad((x >> 16) & 0xFFFF, 16, 4, ' ');
			print(S("\n"));
		}
	}
}