#ifndef _SYS_1394_ADAPTERS_HCI1394_DESCRIPTORS_H
#define _SYS_1394_ADAPTERS_HCI1394_DESCRIPTORS_H
#ifdef __cplusplus
extern "C" {
#endif
#include <sys/note.h>
typedef struct hci1394_desc_s {
uint32_t hdr;
uint32_t data_addr;
uint32_t branch;
uint32_t status;
} hci1394_desc_t;
_NOTE(SCHEME_PROTECTS_DATA("Single thread modifies", hci1394_desc_s))
typedef struct hci1394_desc_imm_s {
uint32_t hdr;
uint32_t data_addr;
uint32_t branch;
uint32_t status;
uint32_t q1;
uint32_t q2;
uint32_t q3;
uint32_t q4;
} hci1394_desc_imm_t;
_NOTE(SCHEME_PROTECTS_DATA("Single thread modifies", hci1394_desc_imm_s))
typedef struct hci1394_desc_hdr_s {
uint32_t q1;
uint32_t q2;
uint32_t q3;
uint32_t q4;
} hci1394_desc_hdr_t;
typedef hci1394_desc_imm_t hci1394_output_more_imm_t;
typedef hci1394_desc_t hci1394_output_more_t;
typedef hci1394_desc_imm_t hci1394_output_last_imm_t;
typedef hci1394_desc_t hci1394_output_last_t;
typedef hci1394_desc_t hci1394_input_more_t;
typedef hci1394_desc_t hci1394_input_last_t;
#define HCI1394_DESC_MAX_Z 8
#define DESC_HDR_STAT_ENBL 0x08000000
#define DESC_HDR_STAT_DSABL 0x00000000
#define DESC_HDR_PING_ENBL 0x00800000
#define DESC_HDR_REQCOUNT_MASK 0x0000FFFF
#define DESC_HDR_REQCOUNT_SHIFT 0
#define DESC_HDR_STVAL_MASK 0x0000FFFF
#define DESC_HDR_STVAL_SHIFT 0
#define DESC_GET_HDR_REQCOUNT(DESCP) \
(((DESCP)->hdr & DESC_HDR_REQCOUNT_MASK) >> DESC_HDR_REQCOUNT_SHIFT)
#define DESC_TY_OUTPUT_MORE 0x00000000
#define DESC_TY_OUTPUT_LAST 0x10000000
#define DESC_TY_INPUT_MORE 0x20000000
#define DESC_TY_INPUT_LAST 0x30000000
#define DESC_TY_STORE 0x80000000
#define DESC_KEY_REF 0x00000000
#define DESC_KEY_IMMED 0x02000000
#define DESC_KEY_STORE 0x06000000
#define DESC_INTR_DSABL 0x00000000
#define DESC_INTR_ENBL 0x00300000
#define DESC_BR_DSABL 0x00000000
#define DESC_BR_ENBL 0x000C0000
#define DESC_W_DSABL 0x00000000
#define DESC_W_ENBL 0x00030000
#define DESC_AT_OM DESC_TY_OUTPUT_MORE
#define DESC_AT_OMI (DESC_TY_OUTPUT_MORE | DESC_KEY_IMMED)
#define DESC_AT_OL (DESC_TY_OUTPUT_LAST | DESC_INTR_ENBL | DESC_BR_ENBL)
#define DESC_AT_OLI (DESC_AT_OL | DESC_KEY_IMMED)
#define DESC_AR_IM (DESC_TY_INPUT_MORE | DESC_HDR_STAT_ENBL | \
DESC_INTR_ENBL | DESC_BR_ENBL)
#define DESC_BRANCH_MASK 0xFFFFFFF0
#define DESC_Z_MASK 0x0000000F
#define HCI1394_SET_BRANCH(DESCP, ADDR, Z) ((DESCP)->branch = 0 | \
((ADDR) & DESC_BRANCH_MASK) | ((Z) & DESC_Z_MASK))
#define HCI1394_GET_BRANCH_ADDR(DESCP) ((DESCP)->branch & ~DESC_Z_MASK)
#define HCI1394_GET_BRANCH_Z(DESCP) ((DESCP)->branch & DESC_Z_MASK)
#define DESC_ST_XFER_STAT_MASK 0xFFFF0000
#define DESC_ST_XFER_STAT_SHIFT 16
#define DESC_ST_RESCOUNT_MASK 0x0000FFFF
#define DESC_ST_RESCOUNT_SHIFT 0
#define DESC_ST_TIMESTAMP_MASK 0x0000FFFF
#define DESC_ST_TIMESTAMP_SHIFT 0
#define HCI1394_DESC_RESCOUNT_GET(data) ((data) & DESC_ST_RESCOUNT_MASK)
#define HCI1394_DESC_TIMESTAMP_GET(data) ((data) & DESC_ST_TIMESTAMP_MASK)
#define DESC_XFER_RUN_MASK (OHCI_CC_RUN_MASK << DESC_ST_XFER_STAT_SHIFT)
#define DESC_XFER_WAKE_MASK (OHCI_CC_WAKE_MASK << DESC_ST_XFER_STAT_SHIFT)
#define DESC_XFER_DEAD_MASK (OHCI_CC_DEAD_MASK << DESC_ST_XFER_STAT_SHIFT)
#define DESC_XFER_ACTIVE_MASK (OHCI_CC_ACTIVE_MASK << DESC_ST_XFER_STAT_SHIFT)
#define DESC_AT_SPD_MASK 0x7
#define DESC_AT_SPD_SHIFT 16
#define DESC_AR_SPD_MASK 0x00E00000
#define DESC_AR_SPD_SHIFT 21
#define DESC_AR_EVT_MASK 0x001F0000
#define DESC_AR_EVT_SHIFT 16
#define HCI1394_DESC_EVT_GET(data) \
(((data) & DESC_AR_EVT_MASK) >> DESC_AR_EVT_SHIFT)
#define HCI1394_DESC_AR_SPD_GET(data) \
(((data) & DESC_AR_SPD_MASK) >> DESC_AR_SPD_SHIFT)
#define HCI1394_DESC_AT_SPD_SET(data) \
(((data) & DESC_AT_SPD_MASK) << DESC_AT_SPD_SHIFT)
#define DESC_EVT_NO_STATUS 0x00
#define DESC_EVT_LONG_PKT 0x02
#define DESC_EVT_MISSING_ACK 0x03
#define DESC_EVT_UNDERRUN 0x04
#define DESC_EVT_OVERRUN 0x05
#define DESC_EVT_DESC_READ 0x06
#define DESC_EVT_DATA_READ 0x07
#define DESC_EVT_DATA_WRITE 0x08
#define DESC_EVT_BUS_RESET 0x09
#define DESC_EVT_TIMEOUT 0x0A
#define DESC_EVT_TCODE_ERR 0x0B
#define DESC_ACK_COMPLETE 0x11
#define DESC_ACK_PENDING 0x12
#define DESC_ACK_BUSY_X 0x14
#define DESC_ACK_BUSY_A 0x15
#define DESC_ACK_BUSY_B 0x16
#define DESC_ACK_TARDY 0x1B
#define DESC_ACK_DATA_ERR 0x1D
#define DESC_ACK_TYPE_ERR 0x1E
#define DESC_RESP_COMPLETE 0x0
#define DESC_RESP_CONFLICT_ERR 0x4
#define DESC_RESP_DATA_ERR 0x5
#define DESC_RESP_TYPE_ERR 0x6
#define DESC_RESP_ADDR_ERR 0x7
#define HCI1394_INIT_IT_OMORE(DESCP, REQCOUNT) ((DESCP)->hdr = 0 | \
(DESC_TY_OUTPUT_MORE | DESC_KEY_REF | DESC_BR_DSABL | \
((REQCOUNT) << DESC_HDR_REQCOUNT_SHIFT)))
#define HCI1394_INIT_IT_OMORE_IMM(DESCP) ((DESCP)->hdr = 0 | \
(DESC_TY_OUTPUT_MORE | DESC_KEY_IMMED | DESC_BR_DSABL | \
(8 << DESC_HDR_REQCOUNT_SHIFT)))
#define HCI1394_INIT_IT_OLAST(DESCP, STAT, INTR, REQCOUNT) ((DESCP)->hdr = 0 |\
(DESC_TY_OUTPUT_LAST | (STAT) | DESC_KEY_REF | (INTR) | \
DESC_BR_ENBL | ((REQCOUNT) << DESC_HDR_REQCOUNT_SHIFT)))
#define HCI1394_INIT_IT_OLAST_IMM(DESCP, STAT, INTR) ((DESCP)->hdr = 0 | \
(DESC_TY_OUTPUT_LAST | (STAT) | DESC_KEY_IMMED | (INTR) | \
DESC_BR_ENBL | (8 << DESC_HDR_REQCOUNT_SHIFT)))
#define HCI1394_INIT_IT_STORE(DESCP, VAL) ((DESCP)->hdr = 0 | \
(DESC_TY_STORE | DESC_KEY_STORE | ((VAL) << DESC_HDR_STVAL_SHIFT)))
#define HCI1394_INIT_IR_PPB_IMORE(DESCP, WAIT, REQCOUNT) (DESCP)->hdr = 0 | \
(DESC_TY_INPUT_MORE | DESC_HDR_STAT_DSABL | DESC_KEY_REF | \
DESC_INTR_DSABL | DESC_BR_DSABL | (WAIT) | \
((REQCOUNT) << DESC_HDR_REQCOUNT_SHIFT)); \
(DESCP)->status = 0 | (((REQCOUNT) << DESC_ST_RESCOUNT_SHIFT) & \
DESC_ST_RESCOUNT_MASK);
#define HCI1394_INIT_IR_PPB_ILAST(DESCP, STAT, INTR, WAIT, REQCOUNT) \
(DESCP)->hdr = 0 | (DESC_TY_INPUT_LAST | (STAT) | DESC_KEY_REF | \
(INTR) | DESC_BR_ENBL | (WAIT) | \
((REQCOUNT) << DESC_HDR_REQCOUNT_SHIFT)); \
(DESCP)->status = 0 | (((REQCOUNT) << DESC_ST_RESCOUNT_SHIFT) & \
DESC_ST_RESCOUNT_MASK);
#define HCI1394_INIT_IR_BF_IMORE(DESCP, INT, WAIT, REQCOUNT) \
(DESCP)->hdr = 0 | (DESC_TY_INPUT_MORE | DESC_HDR_STAT_ENBL | \
DESC_KEY_REF | (INT) | DESC_BR_ENBL | (WAIT) | \
((REQCOUNT) << DESC_HDR_REQCOUNT_SHIFT)); \
(DESCP)->status = 0 | (((REQCOUNT) << DESC_ST_RESCOUNT_SHIFT) & \
DESC_ST_RESCOUNT_MASK);
typedef struct hci1394_basic_packet {
uint32_t q1;
uint32_t q2;
uint32_t q3;
uint32_t q4;
uint32_t q5;
} hci1394_basic_pkt_t;
#define DESC_FIVE_QUADS 20
#define DESC_FOUR_QUADS 16
#define DESC_THREE_QUADS 12
#define DESC_TWO_QUADS 8
#define DESC_ONE_QUAD 4
#define DESC_ONE_OCTLET 8
#define DESC_TWO_OCTLETS 16
#define DESC_PKT_HDRLEN_AT_READQUAD DESC_THREE_QUADS
#define DESC_PKT_HDRLEN_AT_WRITEQUAD DESC_FOUR_QUADS
#define DESC_PKT_HDRLEN_AT_READBLOCK DESC_FOUR_QUADS
#define DESC_PKT_HDRLEN_AT_WRITEBLOCK DESC_FOUR_QUADS
#define DESC_PKT_HDRLEN_AT_LOCK DESC_FOUR_QUADS
#define DESC_PKT_HDRLEN_AT_PHY DESC_THREE_QUADS
#define DESC_PKT_HDRLEN_AT_WRITE_RESP DESC_THREE_QUADS
#define DESC_PKT_HDRLEN_AT_READQUAD_RESP DESC_FOUR_QUADS
#define DESC_PKT_HDRLEN_AT_READBLOCK_RESP DESC_FOUR_QUADS
#define DESC_PKT_HDRLEN_AT_LOCK_RESP DESC_FOUR_QUADS
#define DESC_PKT_HDRLEN_AT_STREAM DESC_TWO_QUADS
#define DESC_PKT_HDRLEN_AT_ISOCH DESC_PKT_HDRLEN_AT_STREAM
#define DESC_AT_SRCBUSID 0x00800000
#define DESC_ATREQ_Q1_PHY 0x000000E0
#define DESC_ATREQ_Q1_QWR 0x00000100
#define DESC_ATREQ_Q1_BWR 0x00000110
#define DESC_ATREQ_Q1_QRD 0x00000140
#define DESC_ATREQ_Q1_BRD 0x00000150
#define DESC_ATREQ_Q1_LCK 0x00000190
#define DESC_ATRESP_Q1_WR 0x00000120
#define DESC_ATRESP_Q1_QRD 0x00000160
#define DESC_ATRESP_Q1_BRD 0x00000170
#define DESC_ATRESP_Q1_LCK 0x000001B0
#define DESC_PKT_SRCBUSID_SHIFT 23
#define DESC_PKT_SRCBUSID_MASK 0x00800000
#define DESC_PKT_SPD_SHIFT 16
#define DESC_PKT_SPD_MASK 0x00070000
#define DESC_PKT_TLABEL_SHIFT 10
#define DESC_PKT_TLABEL_MASK 0x0000FC00
#define DESC_PKT_RT_SHIFT 8
#define DESC_PKT_RT_MASK 0x00000300
#define DESC_PKT_TCODE_SHIFT 4
#define DESC_PKT_TCODE_MASK 0x000000F0
#define DESC_RT_RETRYX 0x1
#define DESC_PKT_TAG_SHIFT 14
#define DESC_PKT_TAG_MASK 0x0000C000
#define DESC_PKT_CHAN_SHIFT 8
#define DESC_PKT_CHAN_MASK 0x00003F00
#define DESC_PKT_SY_SHIFT 0
#define DESC_PKT_SY_MASK 0x0000000F
#define DESC_PKT_DESTID_SHIFT 16
#define DESC_PKT_DESTID_MASK 0xFFFF0000
#define DESC_PKT_SRCID_SHIFT 16
#define DESC_PKT_SRCID_MASK 0xFFFF0000
#define DESC_PKT_DESTOFFHI_SHIFT 0
#define DESC_PKT_DESTOFFHI_MASK 0x0000FFFF
#define DESC_PKT_BUSID_SHIFT 22
#define DESC_PKT_BUSID_MASK 0xFFC00000
#define DESC_PKT_NODENUM_SHIFT 16
#define DESC_PKT_NODENUM_MASK 0x003F0000
#define DESC_PKT_RC_SHIFT 12
#define DESC_PKT_RC_MASK 0x0000F000
#define DESC_PKT_DESTOFFLO_SHIFT 0
#define DESC_PKT_DESTOFFLO_MASK 0xFFFFFFFF
#define DESC_PKT_PHYGEN_SHIFT 16
#define DESC_PKT_PHYGEN_MASK 0x00FF0000
#define DESC_PKT_QDATA_SHIFT 0
#define DESC_PKT_QDATA_MASK 0xFFFFFFFF
#define DESC_PKT_DATALEN_SHIFT 16
#define DESC_PKT_DATALEN_MASK 0xFFFF0000
#define DESC_PKT_EXTTCODE_MASK 0x0000FFFF
#define HCI1394_DESC_TCODE_GET(data) \
(((data) & DESC_PKT_TCODE_MASK) >> DESC_PKT_TCODE_SHIFT)
#define HCI1394_DESC_TLABEL_GET(data) \
(((data) & DESC_PKT_TLABEL_MASK) >> DESC_PKT_TLABEL_SHIFT)
#define HCI1394_DESC_RCODE_GET(data) \
(((data) & DESC_PKT_RC_MASK) >> DESC_PKT_RC_SHIFT)
#define HCI1394_DESC_DESTID_GET(data) \
(((data) & DESC_PKT_DESTID_MASK) >> DESC_PKT_DESTID_SHIFT)
#define HCI1394_DESC_SRCID_GET(data) \
(((data) & DESC_PKT_SRCID_MASK) >> DESC_PKT_SRCID_SHIFT)
#define HCI1394_DESC_DATALEN_GET(data) \
(((data) & DESC_PKT_DATALEN_MASK) >> DESC_PKT_DATALEN_SHIFT)
#define HCI1394_DESC_EXTTCODE_GET(data) \
((data) & DESC_PKT_EXTTCODE_MASK)
#define HCI1394_DESC_PHYGEN_GET(data) \
(((data) & DESC_PKT_PHYGEN_MASK) >> DESC_PKT_PHYGEN_SHIFT)
#define HCI1394_DESC_TLABEL_SET(data) \
(((data) << DESC_PKT_TLABEL_SHIFT) & DESC_PKT_TLABEL_MASK)
#define HCI1394_DESC_RCODE_SET(data) \
(((data) << DESC_PKT_RC_SHIFT) & DESC_PKT_RC_MASK)
#define HCI1394_DESC_DESTID_SET(data) \
(((data) << DESC_PKT_DESTID_SHIFT) & DESC_PKT_DESTID_MASK)
#define HCI1394_DESC_DATALEN_SET(data) \
(((data) << DESC_PKT_DATALEN_SHIFT) & DESC_PKT_DATALEN_MASK)
#define HCI1394_DESC_EXTTCODE_SET(data) \
((data) & DESC_PKT_EXTTCODE_MASK)
#define HCI1394_GETTAG(Q) (((Q) & DESC_TAG_MASK) >> DESC_TAG_SHIFT)
#define HCI1394_SETTAG(PKT, VAL) ((PKT)->q1 = (((PKT)->q1) & \
~DESC_PKT_TAG_MASK) | (((VAL) << DESC_PKT_TAG_SHIFT) & \
DESC_PKT_TAG_MASK))
#define HCI1394_GETCHAN(Q) (((Q) & PKT_CHAN_MASK) >> \
DESC_PKT_CHAN_SHIFT)
#define HCI1394_SETCHAN(PKT, VAL) ((PKT)->q1 = ((PKT)->q1) & \
~DESC_PKT_CHAN_MASK) | (((VAL) << DESC_PKT_CHAN_SHIFT) & \
DESC_PKT_CHAN_MASK))
#define HCI1394_GETSY(Q) (((Q) & DESC_PKT_SY_MASK) >> \
DESC_PKT_SY_SHIFT)
#define HCI1394_SETSY(PKT, VAL) ((PKT)->q1 = ((PKT)->q1) & \
~DESC_PKT_SY_MASK) | (((VAL) << DESC_PKT_SY_SHIFT) & DESC_PKT_SY_MASK))
#define HCI1394_GET_ILEN(Q) (((Q) & DESC_DATALEN_MASK) >> \
DESC_DATALEN_SHIFT)
#define HCI1394_SET_ILEN(PKT, VAL) ((PKT)->q2 = (((PKT)->q1) & \
~DESC_PKT_DATALEN_MASK) | (((VAL) << DESC_PKT_DATALEN_SHIFT) & \
DESC_PKT_DATALEN_MASK))
#define HCI1394_IT_SET_HDR_Q1(PKT, SPD, TAG, CH, TC, SY) ((PKT)->q1 = 0 | \
(((SPD) << DESC_PKT_SPD_SHIFT) & DESC_PKT_SPD_MASK) | \
(((TAG) << DESC_PKT_TAG_SHIFT) & DESC_PKT_TAG_MASK) | \
(((CH) << DESC_PKT_CH_SHIFT) & DESC_PKT_CH_MASK) | \
(((TC) << DESC_PKT_TCODE_SHIFT) & DESC_PKT_TCODE_MASK) | \
(((SY) << DESC_PKT_SY_SHIFT) & DESC_PKT_SY_MASK))
#define DESC_SZ_AR_WRITEQUAD_REQ DESC_FIVE_QUADS
#define DESC_SZ_AR_WRITEBLOCK_REQ DESC_FIVE_QUADS
#define DESC_SZ_AR_WRITE_RESP DESC_FOUR_QUADS
#define DESC_SZ_AR_READQUAD_REQ DESC_FOUR_QUADS
#define DESC_SZ_AR_READBLOCK_REQ DESC_FIVE_QUADS
#define DESC_SZ_AR_READQUAD_RESP DESC_FIVE_QUADS
#define DESC_SZ_AR_READ_BLOCK_RESP DESC_FIVE_QUADS
#define DESC_SZ_AR_PHY DESC_FOUR_QUADS
#define DESC_SZ_AR_LOCK_REQ DESC_FIVE_QUADS
#define DESC_SZ_AR_LOCK_RESP DESC_FIVE_QUADS
#ifdef __cplusplus
}
#endif
#endif