729 lines
30 KiB
C
729 lines
30 KiB
C
/** @file
|
|
Header file for XDCI APIs.
|
|
|
|
@copyright
|
|
INTEL CONFIDENTIAL
|
|
Copyright 2015 - 2020 Intel Corporation.
|
|
|
|
The source code contained or described herein and all documents related to the
|
|
source code ("Material") are owned by Intel Corporation or its suppliers or
|
|
licensors. Title to the Material remains with Intel Corporation or its suppliers
|
|
and licensors. The Material may contain trade secrets and proprietary and
|
|
confidential information of Intel Corporation and its suppliers and licensors,
|
|
and is protected by worldwide copyright and trade secret laws and treaty
|
|
provisions. No part of the Material may be used, copied, reproduced, modified,
|
|
published, uploaded, posted, transmitted, distributed, or disclosed in any way
|
|
without Intel's prior express written permission.
|
|
|
|
No license under any patent, copyright, trade secret or other intellectual
|
|
property right is granted to or conferred upon you by disclosure or delivery
|
|
of the Materials, either expressly, by implication, inducement, estoppel or
|
|
otherwise. Any license under such intellectual property rights must be
|
|
express and approved by Intel in writing.
|
|
|
|
Unless otherwise agreed by Intel in writing, you may not remove or alter
|
|
this notice or any other notice embedded in Materials by Intel or
|
|
Intel's suppliers or licensors in any way.
|
|
|
|
This file contains a 'Sample Driver' and is licensed as such under the terms
|
|
of your license agreement with Intel or your vendor. This file may be modified
|
|
by the user, subject to the additional terms of the license agreement.
|
|
|
|
@par Specification Reference:
|
|
**/
|
|
|
|
|
|
#ifndef _XDCI_DWC_H_
|
|
#define _XDCI_DWC_H_
|
|
|
|
#include "XdciCommon.h"
|
|
#include "XdciDevice.h"
|
|
|
|
#define DWC_XDCI_MAX_ENDPOINTS (16)
|
|
#define DWC_XDCI_SS_CTRL_EP_MPS (512)
|
|
#define DWC_XDCI_HS_CTRL_EP_MPS (64)
|
|
#define DWC_XDCI_FS_CTRL_EP_MPS (64)
|
|
#define DWC_XDCI_LS_CTRL_EP_MPS (8)
|
|
#define DWC_XDCI_SS_CTRL_BUF_SIZE (512)
|
|
#define DWC_XDCI_SETUP_BUFF_SIZE (8)
|
|
#define DWC_XDCI_MAX_EVENTS_PER_BUFFER (128)
|
|
#define DWC_XDCI_TRB_BYTE_ALIGNMENT (16)
|
|
#define DWC_XDCI_DEFAULT_TX_FIFO_SIZE (1024)
|
|
#define DWC_XDCI_TRB_NUM (32)
|
|
#define DWC_XDCI_MASK (DWC_XDCI_TRB_NUM - 1)
|
|
|
|
/* TODO: Platform-specific define. Later move it to platform-specific
|
|
* header file
|
|
* */
|
|
#define DWC_XDCI_MAX_DELAY_ITERATIONS (1000)
|
|
|
|
/* Top-level register offsets from base address */
|
|
#define DWC_XDCI_GLOBAL_REG_OFFSET (0xC100)
|
|
#define DWC_XDCI_DEVICE_REG_OFFSET (0xC700)
|
|
#define DWC_XDCI_OTG_BC_REG_OFFSET (0xCC00)
|
|
|
|
#define DWC_XDCI_GSBUSCFG0_REG (0xC100)
|
|
#define DWC_XDCI_GSBUSCFG1_REG (0xC104)
|
|
#define DWC_XDCI_GTXTHRCFG_REG (0xC108)
|
|
#define DWC_XDCI_GRXTHRCFG_REG (0xC10C)
|
|
|
|
/* Global Control Register and bit definitions */
|
|
#define DWC_XDCI_GCTL_REG (0xC110)
|
|
#define DWC_XDCI_GCTL_PWRDNSCALE_MASK (0xFFF80000)
|
|
#define DWC_XDCI_GCTL_PWRDNSCALE_VAL (0x13880000)
|
|
#define DWC_XDCI_GCTL_U2RSTECN_MASK (0x00010000)
|
|
#define DWC_XDCI_GCTL_PRT_CAP_DIR_MASK (0x00003000)
|
|
#define DWC_XDCI_GCTL_PRT_CAP_DIR_BIT_POS (12)
|
|
#define DWC_XDCI_GCTL_PRT_CAP_HOST (1)
|
|
#define DWC_XDCI_GCTL_PRT_CAP_DEVICE (2)
|
|
#define DWC_XDCI_GCTL_PRT_CAP_OTG (3)
|
|
#define DWC_XDCI_GCTL_RAMCLKSEL_MASK (0x000000C0)
|
|
#define DWC_XDCI_GCTL_SCALE_DOWN_MODE_MASK (0x00000030)
|
|
#define DWC_XDCI_GCTL_DISABLE_CLK_GATING_MASK (0x00000001)
|
|
#define DWC_XDCI_GCTL_DISABLE_SCRAMB_MASK (0x00000008)
|
|
|
|
#define DWC_XDCI_GSTS_REG (0xC118)
|
|
#define DWC_XDCI_GSNPSID_REG (0xC120)
|
|
#define DWC_XDCI_GGPIO_REG (0xC124)
|
|
#define DWC_XDCI_GUID_REG (0xC128)
|
|
#define DWC_XDCI_GUCTL_REG (0xC12C)
|
|
#define DWC_XDCI_GBUSERRADDR (0xC130)
|
|
|
|
/* Global Hardware Parameters Registers */
|
|
#define DWC_XDCI_GHWPARAMS0_REG (0xC140)
|
|
#define DWC_XDCI_GHWPARAMS1_REG (0xC144)
|
|
#define DWC_XDCI_GHWPARAMS1_NUM_INT_MASK (0x1F8000)
|
|
#define DWC_XDCI_GHWPARAMS1_NUM_INT_BIT_POS (15)
|
|
|
|
#define DWC_XDCI_GHWPARAMS2_REG (0xC148)
|
|
#define DWC_XDCI_GHWPARAMS3_REG (0xC14C)
|
|
#define DWC_XDCI_GHWPARAMS4_REG (0xC150)
|
|
#define DWC_XDCI_GHWPARAMS4_CACHE_TRBS_PER_XFER_MASK (0x0000003F)
|
|
#define DWC_XDCI_GHWPARAMS5_REG (0xC154)
|
|
#define DWC_XDCI_GHWPARAMS6_REG (0xC158)
|
|
#define DWC_XDCI_GHWPARAMS7_REG (0xC15C)
|
|
#define DWC_XDCI_GHWPARAMS8_REG (0xC600)
|
|
|
|
#define DWC_XDCI_GDBGFIFOSPACE_REG (0xC160)
|
|
|
|
#define DWC_XDCI_GUSB2PHYCFG_REG(n) (0xC200 + (n << 2))
|
|
#define DWC_XDCI_GUSB2PHYCFG_ULPI_AUTO_RESUME_MASK (0x00008000)
|
|
#define DWC_XDCI_GUSB2PHYCFG_SUSPEND_PHY_MASK (0x00000040)
|
|
|
|
#define DWC_XDCI_GUSB3PIPECTL_REG(n) (0xC2C0 + (n << 2))
|
|
#define DWC_XDCI_GUSB3PIPECTL_SUSPEND_PHY_MASK (0x00020000)
|
|
|
|
#define DWC_XDCI_GTXFIFOSIZ_REG(n) (0xC300 + (n << 2))
|
|
#define DWC_XDCI_GTXFIFOSIZ_START_ADDRESS_MASK (0xFFFF0000)
|
|
#define DWC_XDCI_GTXFIFOSIZ_START_ADDRESS_BIT_POS (16)
|
|
#define DWC_XDCI_GRXFIFOSIZ_REG(n) (0xC380 + (n << 2))
|
|
|
|
/* Global Event Buffer Registers */
|
|
#define DWC_XDCI_GEVNTADR_REG(n) (0xC400 + (n << 4))
|
|
#define DWC_XDCI_EVNTSIZ_REG(n) (0xC408 + (n << 4))
|
|
#define DWC_XDCI_EVNTSIZ_MASK (0x0000FFFF)
|
|
#define DWC_XDCI_EVNT_INTR_MASK (0x80000000)
|
|
#define DWC_XDCI_EVNTCOUNT_REG(n) (0xC40C + (n << 4))
|
|
#define DWC_XDCI_EVNTCOUNT_MASK (0x0000FFFF)
|
|
|
|
/* Device Configuration Register and Bit Definitions */
|
|
#define DWC_XDCI_DCFG_REG (0xC700)
|
|
#define DWC_XDCI_DCFG_LPM_CAPABLE_MASK (0x00400000)
|
|
#define DWC_XDCI_DCFG_DEV_ADDRESS_MASK (0x000003F8)
|
|
#define DWC_XDCI_DCFG_DEV_ADDRESS_BIT_POS (3)
|
|
#define DWC_XDCI_DCFG_DESIRED_DEV_SPEED_MASK (0x00000007)
|
|
#define DWC_XDCI_DCFG_DESIRED_SS_SPEED (0x00000004)
|
|
#define DWC_XDCI_DCFG_DESIRED_FS_SPEED (0x00000001)
|
|
#define DWC_XDCI_DCFG_DESIRED_HS_SPEED (0x00000000)
|
|
|
|
/* Device Control Register */
|
|
#define DWC_XDCI_DCTL_REG (0xC704)
|
|
#define DWC_XDCI_DCTL_RUN_STOP_MASK (0x80000000)
|
|
#define DWC_XDCI_DCTL_RUN_STOP_BIT_POS (31)
|
|
#define DWC_XDCI_DCTL_CSFTRST_MASK (0x40000000)
|
|
#define DWC_XDCI_DCTL_CSFTRST_BIT_POS (30)
|
|
#define DWC_XDCI_DCTL_KEEP_CONNECT_MASK (0x00080000)
|
|
#define DWC_XDCI_DCTL_KEEP_CONNECT_BIT_POS (19)
|
|
#define DWC_XDCI_DCTL_CSFTRST_BIT_POS (30)
|
|
#define DWC_XDCI_DCTL_STATE_CHANGE_REQ_MASK (0x000001E0)
|
|
#define DWC_XDCI_DCTL_STATE_CHANGE_REQ_BIT_POS (5)
|
|
#define DWC_XDCI_DCTL_STATE_CHANGE_REQ_NO_ACTION (1)
|
|
#define DWC_XDCI_DCTL_STATE_CHANGE_REQ_SS_DISABLED (4)
|
|
#define DWC_XDCI_DCTL_STATE_CHANGE_REQ_RX_DETECT (5)
|
|
#define DWC_XDCI_DCTL_STATE_CHANGE_REQ_SS_INACTIVE (6)
|
|
#define DWC_XDCI_DCTL_STATE_CHANGE_REQ_RECOVERY (8)
|
|
#define DWC_XDCI_DCTL_STATE_CHANGE_REQ_COMPLIANCE (10)
|
|
#define DWC_XDCI_DCTL_STATE_CHANGE_REQ_REMOTE_WAKEUP (8)
|
|
|
|
/* Device Event Enable Register */
|
|
#define DWC_XDCI_DEVTEN_REG (0xC708)
|
|
#define DWC_XDCI_DEVTEN_DISCONN_DET_EN_MASK (0x00000001)
|
|
#define DWC_XDCI_DEVTEN_RESET_DET_EN_MASK (0x00000002)
|
|
#define DWC_XDCI_DEVTEN_CONN_DONE_DET_EN_MASK (0x00000004)
|
|
#define DWC_XDCI_DEVTEN_LINK_STATE_CHANGE_DET_EN_MASK (0x00000008)
|
|
#define DWC_XDCI_DEVTEN_RESUME_WAKEUP_DET_EN_MASK (0x00000010)
|
|
#define DWC_XDCI_DEVTEN_HIBERNATION_REQ_EN_MASK (0x00000020)
|
|
#define DWC_XDCI_DEVTEN_U3L2L1_DET_EN_MASK (0x00000040)
|
|
#define DWC_XDCI_DEVTEN_SOF_DET_EN_MASK (0x00000080)
|
|
#define DWC_XDCI_DEVTEN_ERRATIC_ERR_DET_EN_MASK (0x00000200)
|
|
#define DWC_XDCI_DEVTEN_VNDR_DEV_TST_RX_DET_EN_MASK (0x00001000)
|
|
|
|
#define DWC_XDCI_DEVTEN_DEVICE_INTS (DWC_XDCI_DEVTEN_DISCONN_DET_EN_MASK | \
|
|
DWC_XDCI_DEVTEN_RESET_DET_EN_MASK | DWC_XDCI_DEVTEN_CONN_DONE_DET_EN_MASK | \
|
|
DWC_XDCI_DEVTEN_LINK_STATE_CHANGE_DET_EN_MASK | DWC_XDCI_DEVTEN_RESUME_WAKEUP_DET_EN_MASK | \
|
|
DWC_XDCI_DEVTEN_HIBERNATION_REQ_EN_MASK | DWC_XDCI_DEVTEN_U3L2L1_DET_EN_MASK | \
|
|
DWC_XDCI_DEVTEN_ERRATIC_ERR_DET_EN_MASK)
|
|
|
|
#define DWC_XDCI_EVENT_BUFF_BULK_STREAM_ID_MASK (0xFFFF0000)
|
|
#define DWC_XDCI_EVENT_BUFF_ISOCH_UFRAME_NUM_MASK (0xFFFF0000)
|
|
#define DWC_XDCI_EVENT_BUFF_EP_CMD_TYPE_MASK (0x0F000000)
|
|
#define DWC_XDCI_EVENT_BUFF_EP_XFER_RES_INDEX_MASK (0x007F0000)
|
|
#define DWC_XDCI_EVENT_BUFF_EP_XFER_ACTIVE_MASK (0x00008000)
|
|
#define DWC_XDCI_EVENT_BUFF_EP_CTRL_DATA_REQ_MASK (0x00001000)
|
|
#define DWC_XDCI_EVENT_BUFF_EP_CTRL_STATUS_REQ_MASK (0x00002000)
|
|
#define DWC_XDCI_EVENT_BUFF_EP_LST_MASK (0x00008000)
|
|
#define DWC_XDCI_EVENT_BUFF_EP_MISSED_ISOCH_MASK (0x00008000)
|
|
#define DWC_XDCI_EVENT_BUFF_EP_IOC_MASK (0x00004000)
|
|
#define DWC_XDCI_EVENT_BUFF_EP_LAST_PKT_MASK (0x00002000)
|
|
#define DWC_XDCI_EVENT_BUFF_EP_STREAM_NOT_FND_MASK (0x00002000)
|
|
#define DWC_XDCI_EVENT_BUFF_EP_STREAM_FND_MASK (0x00001000)
|
|
#define DWC_XDCI_EVENT_BUFF_EP_ERR_NO_RES_MASK (0x00001000)
|
|
#define DWC_XDCI_EVENT_BUFF_EP_INVALID_RES_MASK (0x00001000)
|
|
|
|
#define DWC_XDCI_EVENT_BUFF_EP_EVENT_MASK (0x000003C0)
|
|
#define DWC_XDCI_EVENT_BUFF_EP_EVENT_BIT_POS (6)
|
|
#define DWC_XDCI_EVENT_BUFF_EP_XFER_CMPLT (1)
|
|
#define DWC_XDCI_EVENT_BUFF_EP_XFER_IN_PROGRESS (2)
|
|
#define DWC_XDCI_EVENT_BUFF_EP_XFER_NOT_READY (3)
|
|
#define DWC_XDCI_EVENT_BUFF_EP_STREAM_EVENT (6)
|
|
#define DWC_XDCI_EVENT_BUFF_EP_CMD_CMPLT (7)
|
|
|
|
#define DWC_XDCI_EVENT_BUFF_EP_NUM_MASK (0x0000003E)
|
|
#define DWC_XDCI_EVENT_BUFF_EP_NUM_BIT_POS (1)
|
|
|
|
#define DWC_XDCI_EVENT_BUFF_EP_EVENT_STATUS_MASK (0x0000F000)
|
|
|
|
|
|
#define DWC_XDCI_EVENT_BUFF_DEV_HIRD_MASK (0x01E00000)
|
|
#define DWC_XDCI_EVENT_BUFF_DEV_HIRD_BIT_POS (21)
|
|
#define DWC_XDCI_EVENT_BUFF_DEV_SS_EVENT_MASK (0x00100000)
|
|
#define DWC_XDCI_EVENT_BUFF_DEV_LINK_STATE_MASK (0x000F0000)
|
|
#define DWC_XDCI_EVENT_BUFF_DEV_LINK_STATE_BIT_POS (16)
|
|
|
|
#define DWC_XDCI_EVENT_BUFF_DEV_EVT_MASK (0x00000F00)
|
|
#define DWC_XDCI_EVENT_BUFF_DEV_EVT_BIT_POS (8)
|
|
#define DWC_XDCI_EVENT_BUFF_DEV_TST_LMP_RX_EVENT (12)
|
|
#define DWC_XDCI_EVENT_BUFF_DEV_BUFF_OVFL_EVENT (11)
|
|
#define DWC_XDCI_EVENT_BUFF_DEV_CMD_CMPLT_EVENT (10)
|
|
#define DWC_XDCI_EVENT_BUFF_DEV_ERRATIC_ERR_EVENT (9)
|
|
#define DWC_XDCI_EVENT_BUFF_DEV_SOF_EVENT (7)
|
|
#define DWC_XDCI_EVENT_BUFF_DEV_HBRNTN_REQ_EVENT (5)
|
|
#define DWC_XDCI_EVENT_BUFF_DEV_WKUP_EVENT (4)
|
|
#define DWC_XDCI_EVENT_BUFF_DEV_STATE_CHANGE_EVENT (3)
|
|
#define DWC_XDCI_EVENT_BUFF_DEV_CONN_DONE_EVENT (2)
|
|
#define DWC_XDCI_EVENT_BUFF_DEV_USB_RESET_EVENT (1)
|
|
#define DWC_XDCI_EVENT_BUFF_DEV_DISCONN_EVENT (0)
|
|
|
|
#define DWC_XDCI_EVENT_DEV_MASK (0x00000001)
|
|
|
|
/* Device Status Register and Bit Definitions */
|
|
#define DWC_XDCI_DSTS_REG (0xC70C)
|
|
#define DWC_XDCI_DSTS_DEV_CTRL_HALTED_MASK (0x00400000)
|
|
#define DWC_XDCI_DSTS_DEV_CTRL_HALTED_BIT_POS (22)
|
|
#define DWC_XDCI_DSTS_CORE_IDLE (1 << 23)
|
|
#define DWC_XDCI_DSTS_CONN_SPEED_MASK (0x00000007)
|
|
#define DWC_XDCI_DSTS_LINK_STATE_MASK (0x003C0000)
|
|
#define DWC_XDCI_DSTS_LINK_STATE_DISCONNECT (0x00100000)
|
|
|
|
/* Device Generic Command Parameter Register */
|
|
#define DWC_XDCI_DGCMD_PARAM_REG (0xC710)
|
|
#define DWC_XDCI_DGCMD_PARAM_TX_FIFO_NUM_MASK (0x0000001F)
|
|
#define DWC_XDCI_DGCMD_PARAM_TX_FIFO_DIR_MASK (0x00000020)
|
|
#define DWC_XDCI_DGCMD_PARAM_TX_FIFO_DIR_BIT_POS (5)
|
|
|
|
/* Device Generic Command Register */
|
|
#define DWC_XDCI_DGCMD_REG (0xC714)
|
|
#define DWC_XDCI_DGCMD_CMD_STATUS_MASK (0x00008000)
|
|
#define DWC_XDCI_DGCMD_CMD_ACTIVE_MASK (0x00000400)
|
|
#define DWC_XDCI_DGCMD_CMD_IOC_MASK (0x00000100)
|
|
#define DWC_XDCI_DGCMD_CMD_TYPE_MASK (0x000000FF)
|
|
#define DWC_XDCI_DGCMD_CMD_SET_PERIODIC_PARAMS (0x2)
|
|
#define DWC_XDCI_DGCMD_CMD_SET_SCRATCH_PAD_BUFF_ARR_LO (0x4)
|
|
#define DWC_XDCI_DGCMD_CMD_SET_SCRATCH_PAD_BUFF_ARR_HI (0x5)
|
|
#define DWC_XDCI_DGCMD_CMD_XMIT_DEVICE_NOTIFICATION (0x7)
|
|
#define DWC_XDCI_DGCMD_CMD_SEL_FIFO_FLUSH (0x9)
|
|
#define DWC_XDCI_DGCMD_CMD_ALL_FIFO_FLUSH (0xA)
|
|
#define DWC_XDCI_DGCMD_CMD_SET_EP_NRDY (0xC)
|
|
#define DWC_XDCI_DGCMD_CMD_RUN_SOC_BUS_LPBK (0x10)
|
|
|
|
/* Device Active USB EP Enable Register */
|
|
#define DWC_XDCI_EP_DALEPENA_REG (0xC720)
|
|
|
|
/* Device Physical EP CMD Param 2 Register. Value is 32-bit */
|
|
#define DWC_XDCI_EPCMD_PARAM2_REG(n) (0xC800 + (n << 4))
|
|
|
|
/* Device Physical EP CMD Param 1 Register. Value is 32-bit */
|
|
#define DWC_XDCI_EPCMD_PARAM1_REG(n) (0xC804 + (n << 4))
|
|
|
|
/* Device Physical EP CMD Param 0 Register. Value is 32-bit */
|
|
#define DWC_XDCI_EPCMD_PARAM0_REG(n) (0xC808 + (n << 4))
|
|
|
|
/* Device Physical EP Command Registers and Bit Definitions */
|
|
#define DWC_XDCI_EPCMD_REG(n) (0xC80C + (n << 4))
|
|
#define DWC_XDCI_EPCMD_RES_IDX_MASK (0x007F0000)
|
|
#define DWC_XDCI_EPCMD_RES_IDX_BIT_POS (16)
|
|
#define DWC_XDCI_EPCMD_CMDTYPE_MASK (0x0000000F)
|
|
#define DWC_XDCI_EPCMD_SET_EP_CONFIG (0x1)
|
|
#define DWC_XDCI_EPCMD_SET_EP_XFER_RES_CONFIG (0x2)
|
|
#define DWC_XDCI_EPCMD_GET_EP_STATE (0x3)
|
|
#define DWC_XDCI_EPCMD_SET_STALL (0x4)
|
|
#define DWC_XDCI_EPCMD_CLEAR_STALL (0x5)
|
|
#define DWC_XDCI_EPCMD_START_XFER (0x6)
|
|
#define DWC_XDCI_EPCMD_UPDATE_XFER (0x7)
|
|
#define DWC_XDCI_EPCMD_END_XFER (0x8)
|
|
#define DWC_XDCI_EPCMD_START_NEW_CONFIG (0x9)
|
|
|
|
#define DWC_XDCI_EPCMD_CMD_IOC_MASK (0x00000100)
|
|
#define DWC_XDCI_EPCMD_CMD_ACTIVE_MASK (0x00000400)
|
|
#define DWC_XDCI_EPCMD_HIGH_PRIO_MASK (0x00000800)
|
|
#define DWC_XDCI_EPCMD_FORCE_RM_MASK (0x00000800)
|
|
|
|
/* Command status and parameter values same as event status and parameters values */
|
|
#define DWC_XDCI_EPCMD_CMD_STATUS_MASK (0x0000F000)
|
|
|
|
/* Command Params bit masks */
|
|
#define DWC_XDCI_PARAM1_SET_EP_CFG_FIFO_BASED_MASK (0x80000000)
|
|
#define DWC_XDCI_PARAM1_SET_EP_CFG_BULK_BASED_MASK (0x40000000)
|
|
#define DWC_XDCI_PARAM1_SET_EP_CFG_EP_NUM_MASK (0x3C000000)
|
|
#define DWC_XDCI_PARAM1_SET_EP_CFG_EP_DIR_MASK (0x02000000)
|
|
#define DWC_XDCI_PARAM1_SET_EP_CFG_STRM_CAP_MASK (0x01000000)
|
|
#define DWC_XDCI_PARAM1_SET_EP_CFG_BINTM1_MASK (0x00FF0000)
|
|
#define DWC_XDCI_PARAM1_SET_EP_CFG_BINTM1_BIT_POS (16)
|
|
#define DWC_XDCI_PARAM1_SET_EP_CFG_EBC_MASK (0x00008000)
|
|
#define DWC_XDCI_PARAM1_SET_EP_CFG_EVT_EN_MASK (0x00003F00)
|
|
#define DWC_XDCI_PARAM1_SET_EP_CFG_EVT_EN_BIT_POS (8)
|
|
#define DWC_XDCI_PARAM1_SET_EP_CFG_EVT_STRM_MASK (0x00002000)
|
|
#define DWC_XDCI_PARAM1_SET_EP_CFG_EVT_XFER_NRDY_MASK (0x00000400)
|
|
#define DWC_XDCI_PARAM1_SET_EP_CFG_EVT_XFER_IN_PRG_MASK (0x00000200)
|
|
#define DWC_XDCI_PARAM1_SET_EP_CFG_EVT_XFER_CMPLT_MASK (0x00000100)
|
|
#define DWC_XDCI_PARAM1_SET_EP_CFG_INTR_NUM_MASK (0x0000001F)
|
|
|
|
/* CMD 1 param 0 */
|
|
#define DWC_XDCI_PARAM0_SET_EP_CFG_ACTN_MASK (0xC0000000)
|
|
#define DWC_XDCI_PARAM0_SET_EP_CFG_ACTN_BIT_POS (30)
|
|
#define DWC_XDCI_PARAM0_SET_EP_CFG_ACTN_INIT_STATE (0)
|
|
#define DWC_XDCI_PARAM0_SET_EP_CFG_ACTN_RESTORE_ST (1)
|
|
#define DWC_XDCI_PARAM0_SET_EP_CFG_ACTN_MDFY_STATE (2)
|
|
#define DWC_XDCI_PARAM0_SET_EP_CFG_ACTN_NONE (3)
|
|
#define DWC_XDCI_PARAM0_SET_EP_CFG_BRST_SIZE_MASK (0x03C00000)
|
|
#define DWC_XDCI_PARAM0_SET_EP_CFG_BRST_SIZE_BIT_POS (22)
|
|
#define DWC_XDCI_PARAM0_SET_EP_CFG_FIFO_NUM_MASK (0x003E0000)
|
|
#define DWC_XDCI_PARAM0_SET_EP_CFG_FIFO_NUM_BIT_POS (17)
|
|
#define DWC_XDCI_PARAM0_SET_EP_CFG_MPS_MASK (0x00003FF8)
|
|
#define DWC_XDCI_PARAM0_SET_EP_CFG_MPS_BIT_POS (3)
|
|
#define DWC_XDCI_PARAM0_SET_EP_CFG_EP_TYPE_MASK (0x00000006)
|
|
#define DWC_XDCI_PARAM0_SET_EP_CFG_EP_TYPE_BIT_POS (1)
|
|
#define DWC_XDCI_PARAM0_EP_TYPE_CTRL (0)
|
|
#define DWC_XDCI_PARAM0_EP_TYPE_ISOCH (1)
|
|
#define DWC_XDCI_PARAM0_EP_TYPE_BULK (2)
|
|
#define DWC_XDCI_PARAM0_EP_TYPE_INTR (3)
|
|
|
|
/* CMD 1 param 1 */
|
|
#define DWC_XDCI_PARAM1_SET_EP_CFG_BULK_BASED_MASK (0x40000000)
|
|
#define DWC_XDCI_PARAM1_SET_EP_CFG_EP_NUM_MASK (0x3C000000)
|
|
#define DWC_XDCI_PARAM1_SET_EP_CFG_EP_NUM_BIT_POS (26)
|
|
#define DWC_XDCI_PARAM1_SET_EP_CFG_EP_DIR_MASK (0x02000000)
|
|
#define DWC_XDCI_PARAM1_SET_EP_CFG_EP_DIR_BIT_POS (25)
|
|
#define DWC_XDCI_PARAM1_SET_EP_CFG_STRM_CAP_MASK (0x01000000)
|
|
#define DWC_XDCI_PARAM1_SET_EP_CFG_BINTM1_MASK (0x00FF0000)
|
|
#define DWC_XDCI_PARAM1_SET_EP_CFG_BINTM1_BIT_POS (16)
|
|
#define DWC_XDCI_PARAM1_SET_EP_CFG_EBC_MASK (0x00008000)
|
|
#define DWC_XDCI_PARAM1_SET_EP_CFG_EVT_EN_MASK (0x00003F00)
|
|
#define DWC_XDCI_PARAM1_SET_EP_CFG_EVT_EN_BIT_POS (8)
|
|
#define DWC_XDCI_PARAM1_SET_EP_CFG_EVT_STRM_MASK (0x00002000)
|
|
#define DWC_XDCI_PARAM1_SET_EP_CFG_EVT_XFER_NRDY_MASK (0x00000400)
|
|
#define DWC_XDCI_PARAM1_SET_EP_CFG_EVT_XFER_IN_PRG_MASK (0x00000200)
|
|
#define DWC_XDCI_PARAM1_SET_EP_CFG_EVT_XFER_CMPLT_MASK (0x00000100)
|
|
#define DWC_XDCI_PARAM1_SET_EP_CFG_INTR_NUM_MASK (0x0000001F)
|
|
|
|
/* CMD 2 param 0 */
|
|
#define DWC_XDCI_PARAM0_SET_EP_XFER_RES_NUM_MASK (0x0000FFFF)
|
|
|
|
/* CMD 3 param 2 */
|
|
#define DWC_XDCI_PARAM2_GET_EP_STATE_MASK (0xFFFFFFFF)
|
|
|
|
/* CMD 6 param 1 */
|
|
#define DWC_XDCI_PARAM1_STRT_XFER_TD_ADDR_LO_MASK (0xFFFFFFFF)
|
|
|
|
/* CMD 6 param 0 */
|
|
#define DWC_XDCI_PARAM0_STRT_XFER_TD_ADDR_HI_MASK (0xFFFFFFFF)
|
|
|
|
/* Transfer Request Block Fields' Bit Definitions */
|
|
#define DWC_XDCI_TRB_BUFF_SIZE_MASK (0x00FFFFFF)
|
|
#define DWC_XDCI_TRB_PCM1_MASK (0x03000000)
|
|
#define DWC_XDCI_TRB_PCM1_BIT_POS (24)
|
|
#define DWC_XDCI_TRB_STATUS_MASK (0xF0000000)
|
|
#define DWC_XDCI_TRB_STATUS_BIT_POS (28)
|
|
#define DWC_XDCI_TRB_STATUS_OK (0)
|
|
#define DWC_XDCI_TRB_STATUS_MISSED_ISOCH (1)
|
|
#define DWC_XDCI_TRB_STATUS_SETUP_PENDING (2)
|
|
|
|
#define DWC_XDCI_TRB_CTRL_HWO_MASK (0x00000001)
|
|
#define DWC_XDCI_TRB_CTRL_LST_TRB_MASK (0x00000002)
|
|
#define DWC_XDCI_TRB_CTRL_LST_TRB_BIT_POS (1)
|
|
#define DWC_XDCI_TRB_CTRL_CHAIN_BUFF_MASK (0x00000004)
|
|
#define DWC_XDCI_TRB_CTRL_CHAIN_BUFF_BIT_POS (2)
|
|
#define DWC_XDCI_TRB_CTRL_CSP_MASK (0x00000008)
|
|
#define DWC_XDCI_TRB_CTRL_CSP_BIT_POS (3)
|
|
#define DWC_XDCI_TRB_CTRL_TYPE_MASK (0x000003F0)
|
|
#define DWC_XDCI_TRB_CTRL_TYPE_BIT_POS (4)
|
|
#define DWC_XDCI_TRB_CTRL_TYPE_NORMAL (1)
|
|
#define DWC_XDCI_TRB_CTRL_TYPE_SETUP (2)
|
|
#define DWC_XDCI_TRB_CTRL_TYPE_STATUS2 (3)
|
|
#define DWC_XDCI_TRB_CTRL_TYPE_STATUS3 (4)
|
|
#define DWC_XDCI_TRB_CTRL_TYPE_DATA (5)
|
|
#define DWC_XDCI_TRB_CTRL_TYPE_ISOCH_FIRST (6)
|
|
#define DWC_XDCI_TRB_CTRL_TYPE_ISOCH (7)
|
|
#define DWC_XDCI_TRB_CTRL_TYPE_LINK_TRB (8)
|
|
#define DWC_XDCI_TRB_CTRL_IOSP_MISOCH_MASK (0x00000400)
|
|
#define DWC_XDCI_TRB_CTRL_IOSP_MISOCH_BIT_POS (10)
|
|
#define DWC_XDCI_TRB_CTRL_IOC_MASK (0x00000800)
|
|
#define DWC_XDCI_TRB_CTRL_IOC_BIT_POS (11)
|
|
#define DWC_XDCI_TRB_CTRL_STRM_ID_SOF_NUM_MASK (0x3FFFC000)
|
|
#define DWC_XDCI_TRB_CTRL_STRM_ID_SOF_BIT_POS (14)
|
|
|
|
#define DWC_XDCI_DEV_EVENT_DEFAULT_SIZE_IN_BYTES (4)
|
|
#define DWC_XDCI_DEV_EVENT_TST_LMP_SIZE_IN_BYTES (12)
|
|
|
|
typedef enum {
|
|
EPCMD_SET_EP_CONFIG = 1,
|
|
EPCMD_SET_EP_XFER_RES_CONFIG,
|
|
EPCMD_GET_EP_STATE,
|
|
EPCMD_SET_STALL,
|
|
EPCMD_CLEAR_STALL,
|
|
EPCMD_START_XFER,
|
|
EPCMD_UPDATE_XFER,
|
|
EPCMD_END_XFER,
|
|
EPCMD_START_NEW_CONFIG = 9
|
|
} DWC_XDCI_ENDPOINT_CMD;
|
|
|
|
typedef enum {
|
|
ON = 0,
|
|
SLEEP = 2,
|
|
SUSPEND,
|
|
DISCONNECTED,
|
|
EARLY_SUSPEND,
|
|
RESET = 14,
|
|
RESUME = 15
|
|
} DWC_XDCI_HS_LINK_STATE;
|
|
|
|
typedef enum {
|
|
TRBCTL_NORMAL = 1,
|
|
TRBCTL_SETUP,
|
|
TRBCTL_2_PHASE,
|
|
TRBCTL_3_PHASE,
|
|
TRBCTL_CTRL_DATA_PHASE,
|
|
TRBCTL_ISOCH_FIRST,
|
|
TRBCTL_ISOCH,
|
|
TRBCTL_LINK
|
|
} DWC_XDCI_TRB_CONTROL;
|
|
|
|
/* TODO: Make sure none of the mechanisms and data structures
|
|
* are leaving any holes
|
|
*/
|
|
|
|
/* DWC XDCI Endpoint Commands Parameters struct */
|
|
typedef struct {
|
|
UINT32 param2;
|
|
UINT32 param1;
|
|
UINT32 param0;
|
|
} DWC_XDCI_ENDPOINT_CMD_PARAMS;
|
|
|
|
/* Event Buffer Struct */
|
|
typedef struct {
|
|
UINT32 event;
|
|
UINT32 dev_tst_lmp1;
|
|
UINT32 dev_tst_lmp2;
|
|
UINT32 reserved;
|
|
} DWC_XDCI_EVENT_BUFFER;
|
|
|
|
/* Transfer Request Block */
|
|
typedef struct {
|
|
UINT32 buff_ptr_low;
|
|
UINT32 buff_ptr_high;
|
|
UINT32 len_xfer_params;
|
|
UINT32 trb_ctrl;
|
|
} DWC_XDCI_TRB;
|
|
|
|
typedef struct {
|
|
USB_EP_INFO ep_info;
|
|
DWC_XDCI_TRB *trb;
|
|
USB_XFER_REQUEST xfer_handle;
|
|
UINT32 currentXferRscIdx;
|
|
VOID *core_handle;
|
|
USB_EP_STATE state;
|
|
USB_EP_STATE Orgstate;
|
|
BOOLEAN CheckFlag;
|
|
} DWC_XDCI_ENDPOINT;
|
|
|
|
typedef struct {
|
|
/* cb_event_params must be copied over by upper layer if
|
|
* it defers event processing
|
|
*/
|
|
USB_DEVICE_CALLBACK_PARAM cb_event_params;
|
|
|
|
/* Callback function list */
|
|
USB_DEVICE_CALLBACK_FUNC dev_disconnect_callback;
|
|
USB_DEVICE_CALLBACK_FUNC dev_bus_reset_callback;
|
|
USB_DEVICE_CALLBACK_FUNC dev_reset_done_callback;
|
|
USB_DEVICE_CALLBACK_FUNC dev_link_state_callback;
|
|
USB_DEVICE_CALLBACK_FUNC dev_wakeup_callback;
|
|
USB_DEVICE_CALLBACK_FUNC dev_hibernation_callback;
|
|
USB_DEVICE_CALLBACK_FUNC dev_sof_callback;
|
|
USB_DEVICE_CALLBACK_FUNC dev_erratic_err_callback;
|
|
USB_DEVICE_CALLBACK_FUNC dev_cmd_cmplt_callback;
|
|
USB_DEVICE_CALLBACK_FUNC dev_buff_ovflw_callback;
|
|
USB_DEVICE_CALLBACK_FUNC dev_test_lmp_rx_callback;
|
|
USB_DEVICE_CALLBACK_FUNC dev_setup_pkt_received_callback;
|
|
USB_DEVICE_CALLBACK_FUNC dev_xfer_nrdy_callback;
|
|
USB_DEVICE_CALLBACK_FUNC dev_xfer_done_callback;
|
|
} USB_DEV_CALLBACK_LIST;
|
|
|
|
typedef struct {
|
|
VOID *parent_handle; // Pointer to the parent this driver is associated
|
|
USB_CONTROLLER_ID id; // ID of the controllers supported in our DCD
|
|
USB_SPEED desired_speed; // Desired SS, HS, FS or LS speeds for the core
|
|
USB_ROLE role; // Desired role i.e. host, device or OTG
|
|
USB_SPEED actual_speed; // Actual speed
|
|
USB_DEVICE_STATE dev_state; // Device state
|
|
UINTN base_address; // Register base address
|
|
UINT32 flags; // Init flags
|
|
UINT32 max_dev_int_lines; // One event buffer per interrupt line
|
|
DWC_XDCI_EVENT_BUFFER event_buffers [DWC_XDCI_MAX_EVENTS_PER_BUFFER * 2]; // Event buffer pool
|
|
DWC_XDCI_EVENT_BUFFER *aligned_event_buffers; // Aligned event buffer pool
|
|
DWC_XDCI_EVENT_BUFFER *current_event_buffer; // Current event buffer address
|
|
DWC_XDCI_TRB unaligned_trbs [((DWC_XDCI_MAX_ENDPOINTS * 2) + 1) * DWC_XDCI_TRB_NUM]; // TRBs.
|
|
DWC_XDCI_TRB *trbs; // 16-bytes aligned TRBs.
|
|
DWC_XDCI_ENDPOINT ep_handles [DWC_XDCI_MAX_ENDPOINTS * 2]; // EPs
|
|
UINT8 default_setup_buffer [DWC_XDCI_SETUP_BUFF_SIZE * 2]; // Unaligned setup buffer
|
|
UINT8 *aligned_setup_buffer; // Aligned setup buffer. Aligned to 8-byte boundary
|
|
UINT8 misc_buffer [528]; // Unaligned misc buffer
|
|
UINT8 *aligned_misc_buffer; // Aligned misc buffer
|
|
UINT32 link_state; // Link state
|
|
UINT32 hird_val; // HIRD value
|
|
USB_DEV_CALLBACK_LIST event_callbacks;
|
|
volatile BOOLEAN interrup_processing;
|
|
} XDCI_CORE_HANDLE;
|
|
|
|
/* DWC XDCI API prototypes */
|
|
EFI_STATUS
|
|
EFIAPI
|
|
dwc_xdci_core_init (
|
|
IN USB_DEV_CONFIG_PARAMS *config_params,
|
|
IN VOID *parent_handle,
|
|
IN VOID **core_handle
|
|
);
|
|
|
|
EFI_STATUS
|
|
EFIAPI
|
|
dwc_xdci_core_deinit (
|
|
IN VOID *core_handle,
|
|
IN UINT32 flags
|
|
);
|
|
|
|
EFI_STATUS
|
|
EFIAPI
|
|
dwc_xdci_core_register_callback (
|
|
IN VOID *core_handle,
|
|
IN USB_DEVICE_EVENT_ID event,
|
|
IN USB_DEVICE_CALLBACK_FUNC CallbackFunc
|
|
);
|
|
|
|
EFI_STATUS
|
|
EFIAPI
|
|
dwc_xdci_core_unregister_callback (
|
|
IN VOID *core_handle,
|
|
IN USB_DEVICE_EVENT_ID event
|
|
);
|
|
|
|
EFI_STATUS
|
|
EFIAPI
|
|
dwc_xdci_core_isr_routine (
|
|
IN VOID *core_handle
|
|
);
|
|
|
|
EFI_STATUS
|
|
EFIAPI
|
|
dwc_xdci_core_isr_routine_timer_based (
|
|
IN VOID *core_handle
|
|
);
|
|
|
|
EFI_STATUS
|
|
EFIAPI
|
|
dwc_xdci_core_connect (
|
|
IN VOID *core_handle
|
|
);
|
|
|
|
EFI_STATUS
|
|
EFIAPI
|
|
dwc_xdci_core_disconnect (
|
|
IN VOID *core_handle
|
|
);
|
|
|
|
EFI_STATUS
|
|
EFIAPI
|
|
dwc_xdci_core_get_speed (
|
|
IN VOID *core_handle,
|
|
IN USB_SPEED *speed
|
|
);
|
|
|
|
EFI_STATUS
|
|
EFIAPI
|
|
dwc_xdci_core_set_address (
|
|
IN VOID *core_handle,
|
|
IN UINT32 address
|
|
);
|
|
|
|
EFI_STATUS
|
|
EFIAPI
|
|
dwc_xdci_core_set_config (
|
|
IN VOID *core_handle,
|
|
IN UINT32 config_num
|
|
);
|
|
|
|
EFI_STATUS
|
|
EFIAPI
|
|
dwc_xdci_set_link_state (
|
|
IN VOID *core_handle,
|
|
IN USB_DEVICE_SS_LINK_STATE state
|
|
);
|
|
|
|
EFI_STATUS
|
|
EFIAPI
|
|
dwc_xdci_init_ep (
|
|
IN VOID *core_handle,
|
|
IN USB_EP_INFO *ep_info
|
|
);
|
|
|
|
EFI_STATUS
|
|
EFIAPI
|
|
dwc_xdci_ep_enable (
|
|
IN VOID *core_handle,
|
|
IN USB_EP_INFO *ep_info
|
|
);
|
|
|
|
EFI_STATUS
|
|
EFIAPI
|
|
dwc_xdci_ep_disable (
|
|
IN VOID *core_handle,
|
|
IN USB_EP_INFO *ep_info
|
|
);
|
|
|
|
EFI_STATUS
|
|
EFIAPI
|
|
dwc_xdci_ep_stall (
|
|
IN VOID *core_handle,
|
|
IN USB_EP_INFO *ep_info
|
|
);
|
|
|
|
EFI_STATUS
|
|
EFIAPI
|
|
dwc_xdci_ep_clear_stall (
|
|
IN VOID *core_handle,
|
|
IN USB_EP_INFO *ep_info
|
|
);
|
|
|
|
EFI_STATUS
|
|
EFIAPI
|
|
dwc_xdci_ep_set_nrdy (
|
|
IN VOID *core_handle,
|
|
IN USB_EP_INFO *ep_info
|
|
);
|
|
|
|
EFI_STATUS
|
|
EFIAPI
|
|
dwc_xdci_ep0_receive_setup_pkt (
|
|
IN VOID *core_handle,
|
|
IN UINT8 *buffer
|
|
);
|
|
|
|
EFI_STATUS
|
|
EFIAPI
|
|
dwc_xdci_ep0_receive_status_pkt (
|
|
IN VOID *core_handle
|
|
);
|
|
|
|
EFI_STATUS
|
|
EFIAPI
|
|
dwc_xdci_ep0_send_status_pkt (
|
|
IN VOID *core_handle
|
|
);
|
|
|
|
EFI_STATUS
|
|
EFIAPI
|
|
dwc_xdci_ep_tx_data (
|
|
IN VOID *core_handle,
|
|
IN USB_XFER_REQUEST *xfer_req
|
|
);
|
|
|
|
EFI_STATUS
|
|
EFIAPI
|
|
dwc_xdci_ep_rx_data(
|
|
IN VOID *core_handle,
|
|
IN USB_XFER_REQUEST *xfer_req
|
|
);
|
|
|
|
EFI_STATUS
|
|
EFIAPI
|
|
dwc_xdci_ep_cancel_transfer (
|
|
IN VOID *core_handle,
|
|
IN USB_EP_INFO *ep_info
|
|
);
|
|
|
|
EFI_STATUS
|
|
usb_process_device_reset_det (
|
|
IN XDCI_CORE_HANDLE *core_handle
|
|
);
|
|
|
|
EFI_STATUS
|
|
usb_process_device_reset_done (
|
|
IN XDCI_CORE_HANDLE *core_handle
|
|
);
|
|
|
|
UINT32
|
|
usb_get_physical_ep_num (
|
|
IN UINT32 EndpointNum,
|
|
IN USB_EP_DIR EndpointDir
|
|
);
|
|
|
|
UINT32
|
|
usb_reg_read (
|
|
IN UINTN base,
|
|
IN UINT32 offset
|
|
);
|
|
|
|
VOID
|
|
usb_reg_write (
|
|
IN UINTN base,
|
|
IN UINT32 offset,
|
|
IN UINT32 val
|
|
);
|
|
|
|
EFI_STATUS
|
|
usb_xdci_core_flush_ep_fifo (
|
|
IN VOID *core_handle,
|
|
IN USB_EP_INFO *ep_info
|
|
);
|
|
|
|
EFI_STATUS
|
|
usb_process_device_disconnect (
|
|
IN XDCI_CORE_HANDLE *core_handle
|
|
);
|
|
|
|
EFI_STATUS
|
|
EFIAPI
|
|
usb_xdci_core_reinit (
|
|
IN VOID *core_handle
|
|
);
|
|
#endif
|