#ifndef EHCI_HARDWARE_H
#define EHCI_HARDWARE_H
#define EHCI_CAPLENGTH 0x00
#define EHCI_HCIVERSION 0x02
#define EHCI_HCSPARAMS 0x04
#define EHCI_HCCPARAMS 0x08
#define EHCI_HCSP_PORTROUTE 0x0c
#define EHCI_USBCMD 0x00
#define EHCI_USBSTS 0x04
#define EHCI_USBINTR 0x08
#define EHCI_FRINDEX 0x0c
#define EHCI_CTRDSSEGMENT 0x10
#define EHCI_PERIODICLISTBASE 0x14
#define EHCI_ASYNCLISTADDR 0x18
#define EHCI_CONFIGFLAG 0x40
#define EHCI_PORTSC 0x44
#define EHCI_USBCMD_ITC_SHIFT 16
#define EHCI_USBCMD_ITC_MASK 0xff
#define EHCI_USBCMD_PPCEE (1 << 15)
#define EHCI_USBCMD_FSP (1 << 14)
#define EHCI_USBCMD_ASPE (1 << 13)
#define EHCI_USBCMD_PSPE (1 << 12)
#define EHCI_USBCMD_ASPME (1 << 11)
#define EHCI_USBCMD_ASPMC_SHIFT 8
#define EHCI_USBCMD_ASPMC_MASK 0x03
#define EHCI_USBCMD_LHCRESET (1 << 7)
#define EHCI_USBCMD_INTONAAD (1 << 6)
#define EHCI_USBCMD_ASENABLE (1 << 5)
#define EHCI_USBCMD_PSENABLE (1 << 4)
#define EHCI_USBCMD_FLS_SHIFT 2
#define EHCI_USBCMD_FLS_MASK 0x03
#define EHCI_USBCMD_HCRESET (1 << 1)
#define EHCI_USBCMD_RUNSTOP (1 << 0)
#define EHCI_USBSTS_ASSTATUS (1 << 15)
#define EHCI_USBSTS_PSSTATUS (1 << 14)
#define EHCI_USBSTS_RECLAMATION (1 << 13)
#define EHCI_USBSTS_HCHALTED (1 << 12)
#define EHCI_USBSTS_INTONAA (1 << 5)
#define EHCI_USBSTS_HOSTSYSERR (1 << 4)
#define EHCI_USBSTS_FLROLLOVER (1 << 3)
#define EHCI_USBSTS_PORTCHANGE (1 << 2)
#define EHCI_USBSTS_USBERRINT (1 << 1)
#define EHCI_USBSTS_USBINT (1 << 0)
#define EHCI_USBSTS_INTMASK 0x3f
#define EHCI_USBINTR_INTONAA (1 << 5)
#define EHCI_USBINTR_HOSTSYSERR (1 << 4)
#define EHCI_USBINTR_FLROLLOVER (1 << 3)
#define EHCI_USBINTR_PORTCHANGE (1 << 2)
#define EHCI_USBINTR_USBERRINT (1 << 1)
#define EHCI_USBINTR_USBINT (1 << 0)
#define EHCI_CONFIGFLAG_FLAG (1 << 0)
#define EHCI_PORTSC_WAKEOVERCUR (1 << 22)
#define EHCI_PORTSC_WAKEDISCON (1 << 21)
#define EHCI_PORTSC_WAKECONNECT (1 << 20)
#define EHCI_PORTSC_PTC_SHIFT 16
#define EHCI_PORTSC_PTC_MASK 0x07
#define EHCI_PORTSC_PIC_SHIFT 14
#define EHCI_PORTSC_PIC_MASK 0x03
#define EHCI_PORTSC_PORTOWNER (1 << 13)
#define EHCI_PORTSC_PORTPOWER (1 << 12)
#define EHCI_PORTSC_DPLUS (1 << 11)
#define EHCI_PORTSC_DMINUS (1 << 10)
#define EHCI_PORTSC_PORTRESET (1 << 8)
#define EHCI_PORTSC_SUSPEND (1 << 7)
#define EHCI_PORTSC_FORCERESUME (1 << 6)
#define EHCI_PORTSC_OCCHANGE (1 << 5)
#define EHCI_PORTSC_OCACTIVE (1 << 4)
#define EHCI_PORTSC_ENABLECHANGE (1 << 3)
#define EHCI_PORTSC_ENABLE (1 << 2)
#define EHCI_PORTSC_CONNCHANGE (1 << 1)
#define EHCI_PORTSC_CONNSTATUS (1 << 0)
#define EHCI_PORTSC_DATAMASK 0xffffffd5
#define EHCI_ECP_SHIFT 8
#define EHCI_ECP_MASK 0xff
#define EHCI_LEGSUP_CAPID_MASK 0xff
#define EHCI_LEGSUP_CAPID 0x01
#define EHCI_LEGSUP_OSOWNED (1 << 24)
#define EHCI_LEGSUP_BIOSOWNED (1 << 16)
#define EHCI_HCCPARAMS_FPLC (1 << 19)
#define EHCI_HCCPARAMS_PPCEC (1 << 18)
#define EHCI_HCCPARAMS_LPM (1 << 17)
#define EHCI_HCCPARAMS_HP (1 << 16)
#define EHCI_HCCPARAMS_FRAME_CACHE(x) ((x >> 7) & 0x1)
#define EHCI_HCCPARAMS_IPT(x) ((x >> 4) & 0x7)
#define EHCI_ITEM_TYPE_ITD (0 << 1)
#define EHCI_ITEM_TYPE_QH (1 << 1)
#define EHCI_ITEM_TYPE_SITD (2 << 1)
#define EHCI_ITEM_TYPE_FSTN (3 << 1)
#define EHCI_ITEM_TERMINATE (1 << 0)
typedef struct ehci_itd {
uint32 next_phy;
uint32 token[8];
uint32 buffer_phy[7];
uint32 ext_buffer_phy[7];
uint32 this_phy;
struct ehci_itd *next;
struct ehci_itd *prev;
uint32 last_token;
} ehci_itd;
#define EHCI_ITD_TOFFSET_SHIFT 0
#define EHCI_ITD_TOFFSET_MASK 0x0fff
#define EHCI_ITD_IOC (1 << 15)
#define EHCI_ITD_PG_SHIFT 12
#define EHCI_ITD_PG_MASK 0x07
#define EHCI_ITD_TLENGTH_SHIFT 16
#define EHCI_ITD_TLENGTH_MASK 0x0fff
#define EHCI_ITD_STATUS_SHIFT 28
#define EHCI_ITD_STATUS_MASK 0xf
#define EHCI_ITD_STATUS_ACTIVE (1 << 3)
#define EHCI_ITD_STATUS_BUFFER (1 << 2)
#define EHCI_ITD_STATUS_BABBLE (1 << 1)
#define EHCI_ITD_STATUS_TERROR (1 << 0)
#define EHCI_ITD_ADDRESS_SHIFT 0
#define EHCI_ITD_ADDRESS_MASK 0x7f
#define EHCI_ITD_ENDPOINT_SHIFT 8
#define EHCI_ITD_ENDPOINT_MASK 0xf
#define EHCI_ITD_DIR_SHIFT 11
#define EHCI_ITD_MUL_SHIFT 0
#define EHCI_ITD_MUL_MASK 0x3
#define EHCI_ITD_BUFFERPOINTER_SHIFT 12
#define EHCI_ITD_BUFFERPOINTER_MASK 0xfffff
#define EHCI_ITD_MAXPACKETSIZE_SHIFT 0
#define EHCI_ITD_MAXPACKETSIZE_MASK 0x7ff
#define EHCI_ITD_MAXPACKETSIZE_LENGTH 11
typedef struct ehci_sitd {
uint32 next_phy;
uint8 port_number;
uint8 hub_address;
uint8 endpoint;
uint8 device_address;
uint16 reserved1;
uint8 cmask;
uint8 smask;
uint16 transfer_length;
uint8 cprogmask;
uint8 status;
uint32 buffer_phy[2];
uint32 back_phy;
uint32 ext_buffer_phy[2];
uint32 this_phy;
struct ehci_sitd *next;
struct ehci_sitd *prev;
size_t buffer_size;
void *buffer_log;
} _PACKED ehci_sitd;
typedef struct ehci_qtd {
uint32 next_phy;
uint32 alt_next_phy;
uint32 token;
uint32 buffer_phy[5];
uint32 ext_buffer_phy[5];
uint32 this_phy;
struct ehci_qtd *next_log;
struct ehci_qtd *alt_next_log;
size_t buffer_size;
void *buffer_log;
} _PACKED ehci_qtd;
#define EHCI_QTD_DATA_TOGGLE (1U << 31)
#define EHCI_QTD_BYTES_SHIFT 16
#define EHCI_QTD_BYTES_MASK 0x7fff
#define EHCI_QTD_IOC (1 << 15)
#define EHCI_QTD_CPAGE_SHIFT 12
#define EHCI_QTD_CPAGE_MASK 0x07
#define EHCI_QTD_ERRCOUNT_SHIFT 10
#define EHCI_QTD_ERRCOUNT_MASK 0x03
#define EHCI_QTD_PID_SHIFT 8
#define EHCI_QTD_PID_MASK 0x03
#define EHCI_QTD_PID_OUT 0x00
#define EHCI_QTD_PID_IN 0x01
#define EHCI_QTD_PID_SETUP 0x02
#define EHCI_QTD_STATUS_SHIFT 0
#define EHCI_QTD_STATUS_MASK 0x7f
#define EHCI_QTD_STATUS_ERRMASK 0x50
#define EHCI_QTD_STATUS_ACTIVE (1 << 7)
#define EHCI_QTD_STATUS_HALTED (1 << 6)
#define EHCI_QTD_STATUS_BUFFER (1 << 5)
#define EHCI_QTD_STATUS_BABBLE (1 << 4)
#define EHCI_QTD_STATUS_TERROR (1 << 3)
#define EHCI_QTD_STATUS_MISSED (1 << 2)
#define EHCI_QTD_STATUS_SPLIT (1 << 1)
#define EHCI_QTD_STATUS_PING (1 << 0)
#define EHCI_QTD_STATUS_LS_ERR (1 << 0)
#define EHCI_QTD_PAGE_MASK 0xfffff000
typedef struct ehci_qh {
uint32 next_phy;
uint32 endpoint_chars;
uint32 endpoint_caps;
uint32 current_qtd_phy;
struct {
uint32 next_phy;
uint32 alt_next_phy;
uint32 token;
uint32 buffer_phy[5];
uint32 ext_buffer_phy[5];
} overlay;
uint32 this_phy;
struct ehci_qh *next_log;
struct ehci_qh *prev_log;
ehci_qtd *stray_log;
ehci_qtd *element_log;
} ehci_qh;
typedef struct {
ehci_qh queue_head;
#ifdef B_HAIKU_64_BIT
uint32 padding[6];
#else
uint32 padding[2];
#endif
} interrupt_entry;
typedef struct {
ehci_itd itd;
#ifdef B_HAIKU_64_BIT
uint32 padding[1];
#else
uint32 padding[5];
#endif
} itd_entry;
typedef struct {
ehci_sitd sitd;
#ifdef B_HAIKU_64_BIT
uint32 padding[14];
#else
uint32 padding[2];
#endif
} sitd_entry;
#define EHCI_INTERRUPT_ENTRIES_COUNT (7 + 1)
#define EHCI_VFRAMELIST_ENTRIES_COUNT 128
#define EHCI_FRAMELIST_ENTRIES_COUNT 1024
#define MAX_AVAILABLE_BANDWIDTH 125
#define EHCI_QH_CHARS_RL_SHIFT 28
#define EHCI_QH_CHARS_RL_MASK 0x07
#define EHCI_QH_CHARS_CONTROL (1 << 27)
#define EHCI_QH_CHARS_MPL_SHIFT 16
#define EHCI_QH_CHARS_MPL_MASK 0x03ff
#define EHCI_QH_CHARS_RECHEAD (1 << 15)
#define EHCI_QH_CHARS_TOGGLE (1 << 14)
#define EHCI_QH_CHARS_EPS_FULL (0 << 12)
#define EHCI_QH_CHARS_EPS_LOW (1 << 12)
#define EHCI_QH_CHARS_EPS_HIGH (2 << 12)
#define EHCI_QH_CHARS_EPT_SHIFT 8
#define EHCI_QH_CHARS_EPT_MASK 0x0f
#define EHCI_QH_CHARS_INACTIVE (1 << 7)
#define EHCI_QH_CHARS_DEV_SHIFT 0
#define EHCI_QH_CHARS_DEV_MASK 0x7f
#define EHCI_QH_CAPS_MULT_SHIFT 30
#define EHCI_QH_CAPS_MULT_MASK 0x03
#define EHCI_QH_CAPS_PORT_SHIFT 23
#define EHCI_QH_CAPS_PORT_MASK 0x7f
#define EHCI_QH_CAPS_HUB_SHIFT 16
#define EHCI_QH_CAPS_HUB_MASK 0x7f
#define EHCI_QH_CAPS_SCM_SHIFT 8
#define EHCI_QH_CAPS_SCM_MASK 0xff
#define EHCI_QH_CAPS_ISM_SHIFT 0
#define EHCI_QH_CAPS_ISM_MASK 0xff
#define EHCI_QH_OL_NAK_INDEX 1
#define EHCI_QH_OL_NAK_SHIFT 1
#define EHCI_QH_OL_NAK_MASK 0x0f
#define EHCI_QH_OL_TOGGLE_INDEX 2
#define EHCI_QH_OL_TOGGLE (1U << 31)
#define EHCI_QH_OL_IOC_INDEX 2
#define EHCI_QH_OL_IOC (1 << 15)
#define EHCI_QH_OL_ERRC_INDEX 2
#define EHCI_QH_OL_ERRC_SHIFT 10
#define EHCI_QH_OL_ERRC_MASK 0x03
#define EHCI_QH_OL_PING_INDEX 2
#define EHCI_QH_OL_PING (1 << 0)
#define EHCI_QH_OL_CPROG_INDEX 4
#define EHCI_QH_OL_CPROG_SHIFT 0
#define EHCI_QH_OL_CPROG_MASK 0xff
#define EHCI_QH_OL_FTAG_INDEX 5
#define EHCI_QH_OL_FTAG_SHIFT 0
#define EHCI_QH_OL_FTAG_MASK 0x0f
#define EHCI_QH_OL_BYTES_INDEX 5
#define EHCI_QH_OL_BYTES_SHIFT 5
#define EHCI_QH_OL_BYTES_MASK 0x7f
#define AMD_SBX00_VENDOR 0x1002
#define AMD_SBX00_SMBUS_CONTROLLER 0x4385
#define AMD_SB600_EHCI_CONTROLLER 0x4386
#define AMD_SB700_SB800_EHCI_CONTROLLER 0x4396
#define AMD_SBX00_EHCI_MISC_REGISTER 0x50
#define AMD_SBX00_EHCI_MISC_DISABLE_PERIODIC_LIST_CACHE (1 << 27)
#endif