1 // Copyright 2017 The Fuchsia Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #pragma once 6 7 // Transfer Request Block 8 typedef struct { 9 uint32_t ptr_low; 10 uint32_t ptr_high; 11 uint32_t status; 12 uint32_t control; 13 } __PACKED dwc3_trb_t; 14 15 // TRB status fields 16 #define TRB_BUFSIZ_START 0 // Buffer Size 17 #define TRB_BUFSIZ_BITS 24 18 #define TRB_BUFSIZ(n) (((n) & 0xffffff) << 0) 19 #define TRB_PCM1_START 24 // Packet Count M1 20 #define TRB_PCM1_BITS 2 21 #define TRB_SPR (1 << 26) // Short Packet Received 22 #define TRB_TRBSTS_START 28 // TRB Status 23 #define TRB_TRBSTS_BITS 4 24 25 // TRB control fields 26 #define TRB_HWO (1 << 0) // Hardware Owner of Descriptor 27 #define TRB_LST (1 << 1) // Last TRB 28 #define TRB_CHN (1 << 2) // Chain Buffers 29 #define TRB_CSP (1 << 3) // Continue on Short Packet 30 #define TRB_TRBCTL_START 4 31 #define TRB_TRBCTL_BITS 5 32 #define TRB_TRBCTL(c) ((c) & (((1 << TRB_TRBCTL_BITS) - 1) << TRB_TRBCTL_START)) 33 #define TRB_TRBCTL_NORMAL (1 << TRB_TRBCTL_START) 34 #define TRB_TRBCTL_SETUP (2 << TRB_TRBCTL_START) 35 #define TRB_TRBCTL_STATUS_2 (3 << TRB_TRBCTL_START) 36 #define TRB_TRBCTL_STATUS_3 (4 << TRB_TRBCTL_START) 37 #define TRB_TRBCTL_CONTROL_DATA (5 << TRB_TRBCTL_START) 38 #define TRB_TRBCTL_ISOCH_FIRST (6 << TRB_TRBCTL_START) 39 #define TRB_TRBCTL_ISOCH (7 << TRB_TRBCTL_START) 40 #define TRB_TRBCTL_LINK (8 << TRB_TRBCTL_START) 41 #define TRB_ISP (1 << 10) // Interrupt on Short Packet 42 #define TRB_IMI (1 << 10) // Interrupt on Missed ISOC 43 #define TRB_IOC (1 << 11) // Interrupt on Complete 44 #define TRB_STREAM_ID_START 14 // Stream ID 45 #define TRB_STREAM_ID_BITS 16 46 #define TRB_SOF_NUM_START 14 // SOF Number 47 #define TRB_SOF_NUM_BITS 16 48 49 // DEPEVT (endpoint specific) 50 #define DEPEVT_PARAMS_START 16 // Event Parameters 51 #define DEPEVT_PARAMS_BITS 16 52 #define DEPEVT_STATUS_START 12 // Event Status 53 #define DEPEVT_STATUS_BITS 4 54 #define DEPEVT_TYPE_START 6 // Event Type 55 #define DEPEVT_TYPE_BITS 4 56 #define DEPEVT_PHYS_EP_START 1 57 #define DEPEVT_PHYS_EP_BITS 5 58 #define DEPEVT_NON_EP (1 << 0) // Event is not endpoint specific 59 60 #define DEPEVT_PARAMS(e) (((e) >> DEPEVT_PARAMS_START) & ((1 << DEPEVT_PARAMS_BITS) - 1)) 61 #define DEPEVT_STATUS(e) (((e) >> DEPEVT_STATUS_START) & ((1 << DEPEVT_STATUS_BITS) - 1)) 62 #define DEPEVT_TYPE(e) (((e) >> DEPEVT_TYPE_START) & ((1 << DEPEVT_TYPE_BITS) - 1)) 63 #define DEPEVT_PHYS_EP(e) (((e) >> DEPEVT_PHYS_EP_START) & \ 64 ((1 << DEPEVT_PHYS_EP_BITS) - 1)) 65 66 // event parameters for DEPEVT_CMD_CMPLT 67 #define DEPEVT_CMD_CMPLT_CMD_TYPE_START 24 68 #define DEPEVT_CMD_CMPLT_CMD_TYPE_BITS 4 69 #define DEPEVT_CMD_CMPLT_CMD_TYPE(e) (((e) >> DEPEVT_CMD_CMPLT_CMD_TYPE_START) & \ 70 ((1 << DEPEVT_CMD_CMPLT_CMD_TYPE_BITS) - 1)) 71 #define DEPEVT_CMD_CMPLT_RSRC_ID_START 16 72 #define DEPEVT_CMD_CMPLT_RSRC_ID_BITS 7 73 #define DEPEVT_CMD_CMPLT_RSRC_ID(e) (((e) >> DEPEVT_CMD_CMPLT_RSRC_ID_START) & \ 74 ((1 << DEPEVT_CMD_CMPLT_RSRC_ID_BITS) - 1)) 75 76 // event parameters for DEPEVT_XFER_NOT_READY 77 #define DEPEVT_XFER_NOT_READY_REASON (1 << 15) 78 #define DEPEVT_XFER_NOT_READY_STAGE_START 12 79 #define DEPEVT_XFER_NOT_READY_STAGE_BITS 2 80 #define DEPEVT_XFER_NOT_READY_STAGE(e) (((e) >> DEPEVT_XFER_NOT_READY_STAGE_START) & \ 81 ((1 << DEPEVT_XFER_NOT_READY_STAGE_BITS) - 1)) 82 #define DEPEVT_XFER_NOT_READY_STAGE_DATA 1 83 #define DEPEVT_XFER_NOT_READY_STAGE_STATUS 2 84 85 86 // DEPEVT event types 87 #define DEPEVT_XFER_COMPLETE 1 88 #define DEPEVT_XFER_IN_PROGRESS 2 89 #define DEPEVT_XFER_NOT_READY 3 90 #define DEPEVT_STREAM_EVT 6 91 #define DEPEVT_CMD_CMPLT 7 92 93 // DEVT (device specific) 94 #define DEVT_INFO_START 16 // Event Information Bits 95 #define DEVT_INFO_BITS 16 96 #define DEVT_TYPE_START 8 // Event type 97 #define DEVT_TYPE_BITS 7 98 #define DEVT_NON_EP (1 << 0) // Event is not endpoint specific 99 100 #define DEVT_INFO(e) (((e) >> DEVT_INFO_START) & ((1 << DEVT_INFO_BITS) - 1)) 101 #define DEVT_TYPE(e) (((e) >> DEVT_TYPE_START) & ((1 << DEVT_TYPE_BITS) - 1)) 102 103 // DEVT event types 104 #define DEVT_DISCONNECT 0 105 #define DEVT_USB_RESET 1 106 #define DEVT_CONNECTION_DONE 2 107 #define DEVT_LINK_STATE_CHANGE 3 108 #define DEVT_REMOTE_WAKEUP 4 109 #define DEVT_HIBERNATE_REQUEST 5 110 #define DEVT_SUSPEND_ENTRY 6 111 #define DEVT_SOF 7 112 #define DEVT_ERRATIC_ERROR 9 113 #define DEVT_COMMAND_COMPLETE 10 114 #define DEVT_EVENT_BUF_OVERFLOW 11 115 #define DEVT_VENDOR_TEST_LMP 12 116 #define DEVT_STOPPED_DISCONNECT 13 117 #define DEVT_L1_RESUME_DETECT 14 118 #define DEVT_LDM_RESPONSE 15 119 120 // for DEVT_LINK_STATE_CHANGE 121 #define DEVT_LINK_STATE_CHANGE_SS (1 << 4) // Set if link is super speed 122 #define DEVT_LINK_STATE_CHANGE_STATE(s) ((s) & 0xf) // Same as DSTS state 123