blob: 9ad057845d87e3c42dd54964ef1bab7c8cbac72c [file] [log] [blame]
// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SRC_DEVICES_USB_DRIVERS_DWC3_DWC3_REGS_H_
#define SRC_DEVICES_USB_DRIVERS_DWC3_DWC3_REGS_H_
#include <zircon/types.h>
#include <hwreg/bitfields.h>
// Global Core Control Register
class GCTL : public hwreg::RegisterBase<GCTL, uint32_t> {
public:
DEF_FIELD(31, 19, PWRDNSCALE);
DEF_BIT(18, MASTERFILTBYPASS);
DEF_BIT(17, BYPSSETADDR);
DEF_BIT(16, U2RSTECN);
DEF_FIELD(15, 14, FRMSCLDWN);
DEF_FIELD(13, 12, PRTCAPDIR);
DEF_BIT(11, CORESOFTRESET);
DEF_BIT(9, U1U2TimerScale);
DEF_BIT(8, DEBUGATTACH);
DEF_FIELD(7, 6, RAMCLKSEL);
DEF_FIELD(5, 4, SCALEDOWN);
DEF_BIT(3, DISSCRAMBLE);
DEF_BIT(2, U2EXIT_LFPS);
DEF_BIT(1, GblHibernationEn);
DEF_BIT(0, DSBLCLKGTNG);
static auto Get() { return hwreg::RegisterAddr<GCTL>(0xc110); }
static constexpr uint32_t PRTCAPDIR_HOST = 1;
static constexpr uint32_t PRTCAPDIR_DEVICE = 2;
static constexpr uint32_t PRTCAPDIR_OTG = 3;
};
// Global Status Register
class GSTS : public hwreg::RegisterBase<GSTS, uint32_t> {
public:
DEF_FIELD(31, 20, CBELT);
DEF_BIT(11, SSIC_IP);
DEF_BIT(10, OTG_IP);
DEF_BIT(9, BC_IP);
DEF_BIT(8, ADP_IP);
DEF_BIT(7, Host_IP);
DEF_BIT(6, Device_IP);
DEF_BIT(5, CSRTimeout);
DEF_BIT(4, BUSERRADDRVLD);
DEF_FIELD(1, 0, CURMOD);
static auto Get() { return hwreg::RegisterAddr<GSTS>(0xc118); }
};
// Global USB2 PHY Configuration Register
class GUSB2PHYCFG : public hwreg::RegisterBase<GUSB2PHYCFG, uint32_t> {
public:
DEF_BIT(31, PHYSOFTRST);
DEF_BIT(29, ULPI_LPM_WITH_OPMODE_CHK);
DEF_FIELD(28, 27, HSIC_CON_WIDTH_ADJ);
DEF_BIT(26, INV_SEL_HSIC);
DEF_FIELD(24, 22, LSTRD);
DEF_FIELD(21, 19, LSIPD);
DEF_BIT(18, ULPIEXTVBUSINDICATOR);
DEF_BIT(17, ULPIEXTVBUSDRV);
DEF_BIT(15, ULPIAUTORES);
DEF_FIELD(13, 10, USBTRDTIM);
DEF_BIT(9, XCVRDLY);
DEF_BIT(8, ENBLSLPM);
DEF_BIT(7, PHYSEL);
DEF_BIT(6, SUSPENDUSB20);
DEF_BIT(5, FSINTF);
DEF_BIT(4, ULPI_UTMI_Sel);
DEF_BIT(3, PHYIF);
DEF_FIELD(2, 0, TOutCal);
static auto Get(uint32_t index) { return hwreg::RegisterAddr<GUSB2PHYCFG>(0xc118 + index * 0x4); }
};
// Global USB 3.1 PIPE Control Register
class GUSB3PIPECTL : public hwreg::RegisterBase<GUSB3PIPECTL, uint32_t> {
public:
DEF_BIT(31, PHYSoftRst);
DEF_BIT(30, HstPrtCmpl);
DEF_BIT(28, DisRxDetP3);
DEF_BIT(27, Ux_exit_in_Px);
DEF_BIT(26, ping_enhancement_en);
DEF_BIT(25, u1u2exitfail_to_recov);
DEF_BIT(24, request_p1p2p3);
DEF_BIT(23, StartRxDetU3RxDet);
DEF_BIT(22, DisRxDetU3RxDet);
DEF_FIELD(21, 19, DelayP1P2P3);
DEF_BIT(18, DELAYP1TRANS);
DEF_BIT(17, SUSPENDENABLE);
DEF_FIELD(16, 15, DATWIDTH);
DEF_BIT(14, AbortRxDetInU2);
DEF_BIT(13, SkipRxDet);
DEF_BIT(12, LFPSP0Algn);
DEF_BIT(11, P3P2TranOK);
DEF_BIT(10, P3ExSigP2);
DEF_BIT(9, LFPSFILTER);
DEF_BIT(8, RX_DETECT_to_Polling_LFPS_Control);
DEF_BIT(7, SSICEn);
DEF_BIT(6, TX_SWING);
DEF_FIELD(5, 3, TX_MARGIN);
DEF_FIELD(2, 1, SS_TX_DE_EMPHASIS);
DEF_BIT(0, ELASTIC_BUFFER_MODE);
static auto Get(uint32_t index) {
return hwreg::RegisterAddr<GUSB3PIPECTL>(0xc2c0 + index * 0x4);
}
};
// HW Parameters used during IP synthesis. This register contains
// DWC_USB31_NUM_EPS, which we use to know how many sets of physical endpoint
// registers are present in this instantiation of the IP.
class GHWPARAMS3 : public hwreg::RegisterBase<GHWPARAMS3, uint32_t> {
public:
DEF_FIELD(30, 23, DWC_USB31_CACHE_TOTAL_XFER_RESOURCES);
DEF_FIELD(22, 18, DWC_USB31_NUM_IN_EPS);
DEF_FIELD(17, 12, DWC_USB31_NUM_EPS);
DEF_BIT(10, DWC_USB31_VENDOR_CTL_INTERFACE);
DEF_FIELD(7, 6, DWC_USB31_HSPHY_DWIDTH);
DEF_FIELD(3, 2, DWC_USB31_HSPHY_INTERFACE);
DEF_FIELD(1, 0, DWC_USB31_SSPHY_INTERFACE);
static auto Get() { return hwreg::RegisterAddr<GHWPARAMS3>(0xc14c); }
};
// Global Event Buffer Address Register
class GEVNTADR : public hwreg::RegisterBase<GEVNTADR, uint64_t> {
public:
DEF_FIELD(63, 0, EVNTADR);
static auto Get(uint32_t index) { return hwreg::RegisterAddr<GEVNTADR>(0xc400 + index * 0x10); }
};
// Global Event Buffer Size Register
class GEVNTSIZ : public hwreg::RegisterBase<GEVNTSIZ, uint32_t> {
public:
DEF_BIT(31, EVNTINTRPTMASK);
DEF_FIELD(15, 0, EVENTSIZ);
static auto Get(uint32_t index) { return hwreg::RegisterAddr<GEVNTSIZ>(0xc408 + index * 0x10); }
};
// Global Event Buffer Count Register
class GEVNTCOUNT : public hwreg::RegisterBase<GEVNTCOUNT, uint32_t> {
public:
DEF_BIT(31, EVNT_HANDLER_BUSY);
DEF_FIELD(15, 0, EVNTCOUNT);
static auto Get(uint32_t index) { return hwreg::RegisterAddr<GEVNTCOUNT>(0xc40c + index * 0x10); }
};
// Device Configuration Register
class DCFG : public hwreg::RegisterBase<DCFG, uint32_t> {
public:
DEF_BIT(24, StopOnDisconnect);
DEF_BIT(23, IgnStrmPP);
DEF_BIT(22, LPMCAP);
DEF_FIELD(21, 17, NUMP);
DEF_FIELD(16, 12, INTRNUM);
DEF_FIELD(9, 3, DEVADDR);
DEF_FIELD(2, 0, DEVSPD);
static auto Get() { return hwreg::RegisterAddr<DCFG>(0xc700); }
static constexpr uint32_t DEVSPD_HIGH = 0;
static constexpr uint32_t DEVSPD_FULL = 1;
static constexpr uint32_t DEVSPD_LOW = 2;
static constexpr uint32_t DEVSPD_SUPER = 4;
static constexpr uint32_t DEVSPD_ENHANCED_SUPER = 5;
};
// Device Control Register
class DCTL : public hwreg::RegisterBase<DCTL, uint32_t> {
public:
DEF_BIT(31, RUN_STOP);
DEF_BIT(30, CSFTRST);
DEF_FIELD(28, 24, HIRDTHRES);
DEF_FIELD(23, 20, LPM_NYET_thres);
DEF_BIT(19, KeepConnect);
DEF_BIT(18, L1HibernationEn);
DEF_BIT(17, CRS);
DEF_BIT(16, CSS);
DEF_BIT(12, INITU2ENA);
DEF_BIT(11, ACCEPTU2ENA);
DEF_BIT(10, INITU1ENA);
DEF_BIT(9, ACCEPTU1ENA);
DEF_FIELD(8, 5, ULSTCHNGREQ);
DEF_FIELD(4, 1, TSTCTL);
static auto Get() { return hwreg::RegisterAddr<DCTL>(0xc704); }
};
// Device Event Enable Register
class DEVTEN : public hwreg::RegisterBase<DEVTEN, uint32_t> {
public:
DEF_BIT(15, LDMEVTEN);
DEF_BIT(14, L1WKUPEVTEN);
DEF_BIT(13, StopOnDisconnectEn);
DEF_BIT(12, VENDEVTSTRCVDEN);
DEF_BIT(9, ERRTICERREVTEN);
DEF_BIT(8, L1SUSPEN);
DEF_BIT(7, SOFTEVTEN);
DEF_BIT(6, U3L2L1SuspEn);
DEF_BIT(5, HibernationReqEvtEn);
DEF_BIT(4, WKUPEVTEN);
DEF_BIT(3, ULSTCNGEN);
DEF_BIT(2, CONNECTDONEEVTEN);
DEF_BIT(1, USBRSTEVTEN);
DEF_BIT(0, DISSCONNEVTEN);
static auto Get() { return hwreg::RegisterAddr<DEVTEN>(0xc708); }
};
// Device Status Register
class DSTS : public hwreg::RegisterBase<DSTS, uint32_t> {
public:
DEF_BIT(29, DCNRD);
DEF_BIT(28, SRE);
DEF_BIT(25, RSS);
DEF_BIT(24, SSS);
DEF_BIT(23, COREIDLE);
DEF_BIT(22, DEVCTRLHLT);
DEF_FIELD(21, 18, USBLNKST);
DEF_BIT(17, RXFIFOEMPTY);
DEF_FIELD(16, 3, SOFFN);
DEF_FIELD(2, 0, CONNECTSPD);
static auto Get() { return hwreg::RegisterAddr<DSTS>(0xc70c); }
// Link state in SS node
static constexpr uint32_t USBLNKST_U0 = 0x0;
static constexpr uint32_t USBLNKST_U1 = 0x1;
static constexpr uint32_t USBLNKST_U2 = 0x2;
static constexpr uint32_t USBLNKST_U3 = 0x3;
static constexpr uint32_t USBLNKST_ESS_DIS = 0x4;
static constexpr uint32_t USBLNKST_RX_DET = 0x5;
static constexpr uint32_t USBLNKST_ESS_INACT = 0x6;
static constexpr uint32_t USBLNKST_POLL = 0x7;
static constexpr uint32_t USBLNKST_RECOV = 0x8;
static constexpr uint32_t USBLNKST_HRESET = 0x9;
static constexpr uint32_t USBLNKST_CMPLY = 0xa;
static constexpr uint32_t USBLNKST_LPBK = 0xb;
static constexpr uint32_t USBLNKST_RESUME_RESET = 0xf;
// Link state in HS/FS/LS node
static constexpr uint32_t USBLNKST_ON = 0x0;
static constexpr uint32_t USBLNKST_SLEEP = 0x2;
static constexpr uint32_t USBLNKST_SUSPEND = 0x3;
static constexpr uint32_t USBLNKST_DISCONNECTED = 0x4;
static constexpr uint32_t USBLNKST_EARLY_SUSPEND = 0x5;
static constexpr uint32_t USBLNKST_RESET = 0xe;
static constexpr uint32_t USBLNKST_RESUME = 0xf;
// Connection speed
static constexpr uint32_t CONNECTSPD_HIGH = 0;
static constexpr uint32_t CONNECTSPD_FULL = 1;
static constexpr uint32_t CONNECTSPD_SUPER = 4;
static constexpr uint32_t CONNECTSPD_ENHANCED_SUPER = 5;
};
// Device Active USB Endpoint Enable Register
class DALEPENA : public hwreg::RegisterBase<DALEPENA, uint32_t> {
public:
DEF_FIELD(31, 0, USBACTEP);
static auto Get() { return hwreg::RegisterAddr<DALEPENA>(0xc720); }
DALEPENA& EnableEp(uint32_t ep) {
*reg_value_ptr() |= (1 << ep);
return *this;
}
DALEPENA& DisableEp(uint32_t ep) {
*reg_value_ptr() &= ~(1 << ep);
return *this;
}
};
// Device Physical Endpoint-n Command Parameter 2 Register
class DEPCMDPAR2 : public hwreg::RegisterBase<DEPCMDPAR2, uint32_t> {
public:
DEF_FIELD(31, 0, PARAMETER);
static auto Get(uint32_t index) { return hwreg::RegisterAddr<DEPCMDPAR2>(0xc800 + index * 0x10); }
};
// Device Physical Endpoint-n Command Parameter 1 Register
class DEPCMDPAR1 : public hwreg::RegisterBase<DEPCMDPAR1, uint32_t> {
public:
DEF_FIELD(31, 0, PARAMETER);
static auto Get(uint32_t index) { return hwreg::RegisterAddr<DEPCMDPAR1>(0xc804 + index * 0x10); }
};
// Device Physical Endpoint-n Command Parameter 0 Register
class DEPCMDPAR0 : public hwreg::RegisterBase<DEPCMDPAR0, uint32_t> {
public:
DEF_FIELD(31, 0, PARAMETER);
static auto Get(uint32_t index) { return hwreg::RegisterAddr<DEPCMDPAR0>(0xc808 + index * 0x10); }
};
// Variant of DEPCMDPAR1 for the DEPCFG command
class DEPCFG_DEPCMDPAR1 : public hwreg::RegisterBase<DEPCFG_DEPCMDPAR1, uint32_t> {
public:
DEF_BIT(31, FIFO_BASED);
DEF_FIELD(29, 25, EP_NUMBER);
DEF_BIT(24, STREAM_CAPABLE);
DEF_FIELD(23, 16, INTERVAL);
DEF_BIT(15, EBC); // External Buffer Control
DEF_BIT(14, EBC_NO_WRITE_BACK); // Don't write back HWO bit to the TRB descriptor
DEF_BIT(13, STREAM_EVT_EN);
DEF_BIT(10, XFER_NOT_READY_EN);
DEF_BIT(9, XFER_IN_PROGRESS_EN);
DEF_BIT(8, XFER_COMPLETE_EN);
DEF_FIELD(4, 0, INTR_NUM);
static auto Get(uint32_t index) {
return hwreg::RegisterAddr<DEPCFG_DEPCMDPAR1>(0xc804 + index * 0x10);
}
};
// Variant of DEPCMDPAR0 for the DEPCFG command
class DEPCFG_DEPCMDPAR0 : public hwreg::RegisterBase<DEPCFG_DEPCMDPAR0, uint32_t> {
public:
DEF_FIELD(31, 30, ACTION);
DEF_FIELD(25, 22, BURST_SIZE); // subtract one
DEF_FIELD(21, 17, FIFO_NUM);
DEF_BIT(15, INTERNAL_RETRY);
DEF_FIELD(13, 3, MAX_PACKET_SIZE);
DEF_FIELD(2, 1, EP_TYPE);
static auto Get(uint32_t index) {
return hwreg::RegisterAddr<DEPCFG_DEPCMDPAR0>(0xc808 + index * 0x10);
}
static constexpr uint32_t ACTION_INITIALIZE = 0;
static constexpr uint32_t ACTION_RESTORE = 1;
static constexpr uint32_t ACTION_MODIFY = 2;
};
// Device Physical Endpoint-n Command Register
class DEPCMD : public hwreg::RegisterBase<DEPCMD, uint32_t> {
public:
DEF_FIELD(31, 16, COMMANDPARAM);
DEF_FIELD(15, 12, CMDSTATUS);
DEF_BIT(11, HIPRI_FORCERM);
DEF_BIT(10, CMDACT);
DEF_BIT(8, CMDIOC);
DEF_FIELD(3, 0, CMDTYP);
static auto Get(uint32_t index) { return hwreg::RegisterAddr<DEPCMD>(0xc80c + index * 0x10); }
// Command Types
static constexpr uint32_t DEPCFG = 1; // Set Endpoint Configuration
static constexpr uint32_t DEPXFERCFG = 2; // Set Endpoint Transfer Resource Configuration
static constexpr uint32_t DEPGETSTATE = 3; // Get Endpoint State
static constexpr uint32_t DEPSSTALL = 4; // Set Stall
static constexpr uint32_t DEPCSTALL = 5; // Clear Stall
static constexpr uint32_t DEPSTRTXFER = 6; // Start Transfer
static constexpr uint32_t DEPUPDXFER = 7; // Update Transfer
static constexpr uint32_t DEPENDXFER = 8; // End Transfer
static constexpr uint32_t DEPSTARTCFG = 9; // Start New Configuration
};
class USB31_VER_NUMBER : public hwreg::RegisterBase<USB31_VER_NUMBER, uint32_t> {
public:
DEF_FIELD(31, 0, IPVERSION);
static auto Get() { return hwreg::RegisterAddr<USB31_VER_NUMBER>(0xc1a0); }
};
class USB31_VER_TYPE : public hwreg::RegisterBase<USB31_VER_TYPE, uint32_t> {
public:
DEF_FIELD(31, 0, VERSIONTYPE);
static auto Get() { return hwreg::RegisterAddr<USB31_VER_TYPE>(0xc1a4); }
};
#endif // SRC_DEVICES_USB_DRIVERS_DWC3_DWC3_REGS_H_