144 lines
3.4 KiB
C
144 lines
3.4 KiB
C
#pragma once
|
|
|
|
#include <stdint.h>
|
|
|
|
// TODO: Move to shared lib for denali and voyageurs.
|
|
struct PciDeviceHeader {
|
|
uint16_t vendor_id;
|
|
uint16_t device_id;
|
|
uint16_t command_reg;
|
|
uint16_t status_reg;
|
|
uint8_t revision;
|
|
uint8_t prog_interface;
|
|
uint8_t subclass;
|
|
uint8_t class_code;
|
|
uint8_t cache_line_size;
|
|
uint8_t latency_timer;
|
|
uint8_t header_type;
|
|
uint8_t bist;
|
|
uint32_t bars[5];
|
|
uint32_t abar;
|
|
uint32_t reserved0;
|
|
uint32_t subsystem_id;
|
|
uint32_t expansion_rom;
|
|
uint8_t cap_ptr;
|
|
uint8_t reserved1[7];
|
|
uint8_t interrupt_line;
|
|
uint8_t interrupt_pin;
|
|
uint8_t min_grant;
|
|
uint8_t max_latency;
|
|
} __attribute__((packed));
|
|
|
|
struct XhciCapabilities {
|
|
// NOTE: In qemu access these addresses at anything other than a 32bit offset
|
|
// seems to give bogus values so we group the fields more than necessary.
|
|
uint32_t length_and_version;
|
|
uint32_t hcs_params_1;
|
|
uint32_t hcs_params_2;
|
|
uint32_t hcs_params_3;
|
|
uint16_t capabilites;
|
|
uint16_t ext_capabilities_pointer;
|
|
uint32_t doorbell_offset;
|
|
uint32_t runtime_offset;
|
|
uint32_t capabilities2;
|
|
} __attribute__((packed));
|
|
|
|
struct XhciPort {
|
|
uint32_t status_and_control;
|
|
uint32_t power_management;
|
|
uint32_t link_info;
|
|
uint32_t lpm_control;
|
|
} __attribute__((packed));
|
|
|
|
struct XhciOperational {
|
|
uint32_t usb_command;
|
|
uint32_t usb_status;
|
|
uint32_t page_size;
|
|
uint32_t reserved;
|
|
uint32_t reserved2;
|
|
uint32_t device_notification_control;
|
|
uint64_t command_ring_control;
|
|
uint64_t reserved3;
|
|
uint64_t reserved4;
|
|
uint64_t device_context_base;
|
|
uint32_t configure;
|
|
XhciPort ports[255];
|
|
} __attribute__((packed));
|
|
|
|
struct XhciInterrupter {
|
|
uint32_t management;
|
|
uint32_t moderation;
|
|
uint32_t event_ring_segment_table_size;
|
|
uint32_t reserved;
|
|
uint64_t event_ring_segment_table_base_address;
|
|
uint64_t event_ring_dequeue_pointer;
|
|
} __attribute__((packed));
|
|
|
|
struct XhciRuntime {
|
|
uint32_t microframe_index;
|
|
uint32_t reserved1;
|
|
uint64_t reserved2;
|
|
uint64_t reserved3;
|
|
uint64_t reserved4;
|
|
XhciInterrupter interrupters[1024];
|
|
} __attribute__((packed));
|
|
|
|
struct XhciDoorbells {
|
|
uint32_t doorbell[256];
|
|
} __attribute__((packed));
|
|
|
|
struct XhciSlotContext {
|
|
uint32_t route_speed_entries;
|
|
uint32_t latency_port_number;
|
|
uint32_t parent_and_interrupt;
|
|
uint32_t address_and_state;
|
|
uint64_t reserved1;
|
|
uint64_t reserved2;
|
|
} __attribute__((packed));
|
|
|
|
struct XhciEndpointContext {
|
|
uint32_t state;
|
|
uint32_t error_and_type;
|
|
uint64_t tr_dequeue_ptr;
|
|
uint32_t average_trb_length;
|
|
uint32_t reserved1;
|
|
uint64_t reserved2;
|
|
} __attribute__((packed));
|
|
|
|
struct XhciDeviceContext {
|
|
XhciSlotContext slot_context;
|
|
XhciEndpointContext endpoint_contexts[31];
|
|
} __attribute__((packed));
|
|
|
|
struct XhciInputControlContext {
|
|
uint32_t drop_contexts;
|
|
uint32_t add_contexts;
|
|
uint64_t reserved1;
|
|
uint64_t reserved2;
|
|
uint32_t reserved3;
|
|
uint8_t configuration_value;
|
|
uint8_t interface_number;
|
|
uint8_t alternate_setting;
|
|
uint8_t reserved4;
|
|
} __attribute__((packed));
|
|
|
|
struct XhciInputContext {
|
|
XhciInputControlContext input;
|
|
XhciSlotContext slot_context;
|
|
XhciEndpointContext endpoint_contexts[31];
|
|
} __attribute__((packed));
|
|
|
|
struct XhciTrb {
|
|
uint64_t parameter;
|
|
uint32_t status;
|
|
uint16_t type_and_cycle;
|
|
uint16_t control;
|
|
} __attribute__((packed));
|
|
|
|
struct XhciEventRingSegmentTableEntry {
|
|
uint64_t ring_segment_base;
|
|
uint16_t ring_segment_size;
|
|
uint16_t reserved1;
|
|
uint32_t reserved2;
|
|
} __attribute__((packed));
|