#ifndef KVM__PCI_H
#define KVM__PCI_H
-/* some known offsets and register names */
+/*
+ * PCI Configuration Mechanism #1 I/O ports. See Section 3.7.4.1.
+ * ("Configuration Mechanism #1") of the PCI Local Bus Specification 2.1 for
+ * details.
+ */
#define PCI_CONFIG_ADDRESS 0xcf8
#define PCI_CONFIG_DATA 0xcfc
+struct pci_config_address {
+ unsigned zeros : 2; /* 1 .. 0 */
+ unsigned register_number : 6; /* 7 .. 2 */
+ unsigned function_number : 3; /* 10 .. 8 */
+ unsigned device_number : 5; /* 15 .. 11 */
+ unsigned bus_number : 8; /* 23 .. 16 */
+ unsigned reserved : 7; /* 30 .. 24 */
+ unsigned enable_bit : 1; /* 31 */
+};
+
void pci__init(void);
#endif /* KVM__PCI_H */
#include <stdint.h>
-static uint32_t pci_config_address;
+static struct pci_config_address pci_config_address;
static bool pci_config_address_out(struct kvm *self, uint16_t port, void *data, int size, uint32_t count)
{
- uint32_t *addr = data;
+ struct pci_config_address *addr = data;
pci_config_address = *addr;
static bool pci_config_address_in(struct kvm *self, uint16_t port, void *data, int size, uint32_t count)
{
- uint32_t *addr = data;
+ struct pci_config_address *addr = data;
*addr = pci_config_address;