usb_dwc2_param.h 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367
  1. /*
  2. * Copyright (c) 2025, sakumisu
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #ifndef __USB_DWC2_PARAM_H__
  7. #define __USB_DWC2_PARAM_H__
  8. /* Maximum number of Endpoints/HostChannels */
  9. #define MAX_EPS_CHANNELS 16
  10. #define HSOTG_REG(x) (x)
  11. #define dwc2_readl(addr) \
  12. (*(volatile uint32_t *)(addr))
  13. #define GUID_OFFSET HSOTG_REG(0x003C)
  14. #define GSNPSID_OFFSET HSOTG_REG(0x0040)
  15. #define GSNPSID_ID_MASK (0xFFFF0000UL)
  16. #define GHWCFG1_OFFSET HSOTG_REG(0x0044)
  17. #define GHWCFG2_OFFSET HSOTG_REG(0x0048)
  18. #define GHWCFG2_OTG_ENABLE_IC_USB (0x01UL << 31U)
  19. #define GHWCFG2_DEV_TOKEN_Q_DEPTH_MASK (0x1FUL << 26U)
  20. #define GHWCFG2_DEV_TOKEN_Q_DEPTH_SHIFT (26U)
  21. #define GHWCFG2_HOST_PERIO_TX_Q_DEPTH_MASK (0x03UL << 24U)
  22. #define GHWCFG2_HOST_PERIO_TX_Q_DEPTH_SHIFT (24U)
  23. #define GHWCFG2_NONPERIO_TX_Q_DEPTH_MASK (0x03UL << 22U)
  24. #define GHWCFG2_NONPERIO_TX_Q_DEPTH_SHIFT (22U)
  25. #define GHWCFG2_MULTI_PROC_INT (0x01UL << 20U)
  26. #define GHWCFG2_DYNAMIC_FIFO (0x01UL << 19U)
  27. #define GHWCFG2_PERIO_EP_SUPPORTED (0x01UL << 18U)
  28. #define GHWCFG2_NUM_HOST_CHAN_MASK (0x0FUL << 14U)
  29. #define GHWCFG2_NUM_HOST_CHAN_SHIFT (14U)
  30. #define GHWCFG2_NUM_DEV_EP_MASK (0x0FUL << 10U)
  31. #define GHWCFG2_NUM_DEV_EP_SHIFT (10U)
  32. #define GHWCFG2_FS_PHY_TYPE_MASK (0x03UL << 8U)
  33. #define GHWCFG2_FS_PHY_TYPE_SHIFT (8U)
  34. #define GHWCFG2_FS_PHY_TYPE_NOT_SUPPORTED (0x00UL)
  35. #define GHWCFG2_FS_PHY_TYPE_DEDICATED (0x01UL)
  36. #define GHWCFG2_FS_PHY_TYPE_SHARED_UTMI (0x02UL)
  37. #define GHWCFG2_FS_PHY_TYPE_SHARED_ULPI (0x03UL)
  38. #define GHWCFG2_HS_PHY_TYPE_MASK (0x03UL << 6U)
  39. #define GHWCFG2_HS_PHY_TYPE_SHIFT (6U)
  40. #define GHWCFG2_HS_PHY_TYPE_NOT_SUPPORTED (0x00UL)
  41. #define GHWCFG2_HS_PHY_TYPE_UTMI (0x01UL)
  42. #define GHWCFG2_HS_PHY_TYPE_ULPI (0x02UL)
  43. #define GHWCFG2_HS_PHY_TYPE_UTMI_ULPI (0x03UL)
  44. #define GHWCFG2_POINT2POINT (0x01UL << 5U)
  45. #define GHWCFG2_ARCHITECTURE_MASK (0x03UL << 3U)
  46. #define GHWCFG2_ARCHITECTURE_SHIFT (3U)
  47. #define GHWCFG2_SLAVE_ONLY_ARCH (0x00UL)
  48. #define GHWCFG2_EXT_DMA_ARCH (0x01UL)
  49. #define GHWCFG2_INT_DMA_ARCH (0x02UL)
  50. #define GHWCFG2_OP_MODE_MASK (0x07UL << 0U)
  51. #define GHWCFG2_OP_MODE_SHIFT (0U)
  52. #define GHWCFG2_OP_MODE_HNP_SRP_CAPABLE (0x00UL)
  53. #define GHWCFG2_OP_MODE_SRP_ONLY_CAPABLE (0x01UL)
  54. #define GHWCFG2_OP_MODE_NO_HNP_SRP_CAPABLE (0x02UL)
  55. #define GHWCFG2_OP_MODE_SRP_CAPABLE_DEVICE (0x03UL)
  56. #define GHWCFG2_OP_MODE_NO_SRP_CAPABLE_DEVICE (0x04UL)
  57. #define GHWCFG2_OP_MODE_SRP_CAPABLE_HOST (0x05UL)
  58. #define GHWCFG2_OP_MODE_NO_SRP_CAPABLE_HOST (0x06UL)
  59. #define GHWCFG2_OP_MODE_UNDEFINED (0x07UL)
  60. #define GHWCFG3_OFFSET HSOTG_REG(0x004C)
  61. #define GHWCFG3_DFIFO_DEPTH_MASK (0xFFFFUL << 16U)
  62. #define GHWCFG3_DFIFO_DEPTH_SHIFT (16U)
  63. #define GHWCFG3_OTG_LPM_EN (0x0001UL << 15U)
  64. #define GHWCFG3_BC_SUPPORT (0x0001UL << 14U)
  65. #define GHWCFG3_OTG_ENABLE_HSIC (0x0001UL << 13U)
  66. #define GHWCFG3_ADP_SUPP (0x0001UL << 12U)
  67. #define GHWCFG3_SYNCH_RESET_TYPE (0x0001UL << 11U)
  68. #define GHWCFG3_OPTIONAL_FEATURES (0x0001UL << 10U)
  69. #define GHWCFG3_VENDOR_CTRL_IF (0x0001UL << 9U)
  70. #define GHWCFG3_I2C (0x0001UL << 8U)
  71. #define GHWCFG3_OTG_FUNC (0x0001UL << 7U)
  72. #define GHWCFG3_PACKET_SIZE_CNTR_WIDTH_MASK (0x0007UL << 4U)
  73. #define GHWCFG3_PACKET_SIZE_CNTR_WIDTH_SHIFT (4U)
  74. #define GHWCFG3_XFER_SIZE_CNTR_WIDTH_MASK (0x000FUL << 0U)
  75. #define GHWCFG3_XFER_SIZE_CNTR_WIDTH_SHIFT (0U)
  76. #define GHWCFG4_OFFSET HSOTG_REG(0x0050)
  77. #define GHWCFG4_DESC_DMA_DYN (0x1UL << 31U)
  78. #define GHWCFG4_DESC_DMA (0x1UL << 30U)
  79. #define GHWCFG4_NUM_IN_EPS_MASK (0xFUL << 26U)
  80. #define GHWCFG4_NUM_IN_EPS_SHIFT (26U)
  81. #define GHWCFG4_DED_FIFO_EN (0x1UL << 25U)
  82. #define GHWCFG4_DED_FIFO_SHIFT (25U)
  83. #define GHWCFG4_SESSION_END_FILT_EN (0x1UL << 24U)
  84. #define GHWCFG4_B_VALID_FILT_EN (0x1UL << 23U)
  85. #define GHWCFG4_A_VALID_FILT_EN (0x1UL << 22U)
  86. #define GHWCFG4_VBUS_VALID_FILT_EN (0x1UL << 21U)
  87. #define GHWCFG4_IDDIG_FILT_EN (0x1UL << 20U)
  88. #define GHWCFG4_NUM_DEV_MODE_CTRL_EP_MASK (0xFUL << 16U)
  89. #define GHWCFG4_NUM_DEV_MODE_CTRL_EP_SHIFT (16U)
  90. #define GHWCFG4_UTMI_PHY_DATA_WIDTH_MASK (0x3UL << 14U)
  91. #define GHWCFG4_UTMI_PHY_DATA_WIDTH_SHIFT (14U)
  92. #define GHWCFG4_UTMI_PHY_DATA_WIDTH_8 (0x0UL)
  93. #define GHWCFG4_UTMI_PHY_DATA_WIDTH_16 (0x1UL)
  94. #define GHWCFG4_UTMI_PHY_DATA_WIDTH_8_OR_16 (0x2UL)
  95. #define GHWCFG4_ACG_SUPPORTED (0x1UL << 12U)
  96. #define GHWCFG4_IPG_ISOC_SUPPORTED (0x1UL << 11U)
  97. #define GHWCFG4_SERVICE_INTERVAL_SUPPORTED (0x1UL << 10U)
  98. #define GHWCFG4_XHIBER (0x1UL << 7U)
  99. #define GHWCFG4_HIBER (0x1UL << 6U)
  100. #define GHWCFG4_MIN_AHB_FREQ (0x1UL << 5U)
  101. #define GHWCFG4_POWER_OPTIMIZ (0x1UL << 4U)
  102. #define GHWCFG4_NUM_DEV_PERIO_IN_EP_MASK (0xFUL << 0U)
  103. #define GHWCFG4_NUM_DEV_PERIO_IN_EP_SHIFT (0U)
  104. /**
  105. * struct dwc2_hw_params - Autodetected parameters.
  106. *
  107. * These parameters are the various parameters read from hardware
  108. * registers during initialization. They typically contain the best
  109. * supported or maximum value that can be configured in the
  110. * corresponding dwc2_core_params value.
  111. *
  112. * The values that are not in dwc2_core_params are documented below.
  113. *
  114. * @snpsid: Value from SNPSID register
  115. * @dev_ep_dirs: Direction of device endpoints (GHWCFG1)
  116. *
  117. * @op_mode: Mode of Operation
  118. * 0 - HNP- and SRP-Capable OTG (Host & Device)
  119. * 1 - SRP-Capable OTG (Host & Device)
  120. * 2 - Non-HNP and Non-SRP Capable OTG (Host & Device)
  121. * 3 - SRP-Capable Device
  122. * 4 - Non-OTG Device
  123. * 5 - SRP-Capable Host
  124. * 6 - Non-OTG Host
  125. * @arch: Architecture
  126. * 0 - Slave only
  127. * 1 - External DMA
  128. * 2 - Internal DMA
  129. * @enable_dynamic_fifo: 0 - Use coreConsultant-specified FIFO size parameters
  130. * 1 - Allow dynamic FIFO sizing (default, if available)
  131. * @host_channels: The number of host channel registers to use
  132. * 1 to 16
  133. * @hs_phy_type: High-speed PHY interface type
  134. * 0 - High-speed interface not supported
  135. * 1 - UTMI+
  136. * 2 - ULPI
  137. * 3 - UTMI+ and ULPI
  138. * @fs_phy_type: Full-speed PHY interface type
  139. * 0 - Full speed interface not supported
  140. * 1 - Dedicated full speed interface
  141. * 2 - FS pins shared with UTMI+ pins
  142. * 3 - FS pins shared with ULPI pins
  143. * @num_dev_ep: Number of device endpoints available
  144. * @nperio_tx_q_depth:
  145. * Non-Periodic Request Queue Depth
  146. * 2, 4 or 8
  147. * @dev_token_q_depth: Device Mode IN Token Sequence Learning Queue
  148. * Depth
  149. * 0 to 30
  150. * @host_perio_tx_q_depth:
  151. * Host Mode Periodic Request Queue Depth
  152. * 2, 4 or 8
  153. *
  154. * @max_transfer_size: The maximum transfer size supported, in bytes
  155. * 2047 to 65,535
  156. * Actual maximum value is autodetected and also
  157. * the default.
  158. * @max_packet_count: The maximum number of packets in a transfer
  159. * 15 to 511
  160. * Actual maximum value is autodetected and also
  161. * the default.
  162. * @i2c_enable: Specifies whether to use the I2Cinterface for a full
  163. * speed PHY. This parameter is only applicable if phy_type
  164. * is FS.
  165. * 0 - No (default)
  166. * 1 - Yes
  167. * @total_fifo_size: Total internal RAM for FIFOs (bytes)
  168. * @lpm_mode: For enabling Link Power Management in the controller
  169. * 0 - Disable
  170. * 1 - Enable
  171. *
  172. * @en_multiple_tx_fifo: Specifies whether dedicated per-endpoint transmit FIFOs
  173. * are enabled for non-periodic IN endpoints in device
  174. * mode.
  175. * @num_dev_in_eps: Number of device IN endpoints available
  176. * @num_dev_perio_in_ep: Number of device periodic IN endpoints
  177. * available
  178. * @dma_desc_enable: When DMA mode is enabled, specifies whether to use
  179. * address DMA mode or descriptor DMA mode for accessing
  180. * the data FIFOs. The driver will automatically detect the
  181. * value for this if none is specified.
  182. * 0 - Address DMA
  183. * 1 - Descriptor DMA (default, if available)
  184. * @power_optimized: Are power optimizations enabled?
  185. * @hibernation: Is hibernation enabled?
  186. * @utmi_phy_data_width: UTMI+ PHY data width
  187. * 0 - 8 bits
  188. * 1 - 16 bits
  189. * 2 - 8 or 16 bits
  190. * @acg_enable: For enabling Active Clock Gating in the controller
  191. * 0 - Disable
  192. * 1 - Enable
  193. * @ipg_isoc_en: This feature indicates that the controller supports
  194. * the worst-case scenario of Rx followed by Rx
  195. * Interpacket Gap (IPG) (32 bitTimes) as per the utmi
  196. * specification for any token following ISOC OUT token.
  197. * 0 - Don't support
  198. * 1 - Support
  199. * @service_interval_mode: For enabling service interval based scheduling in the
  200. * controller.
  201. * 0 - Disable
  202. * 1 - Enable
  203. */
  204. struct dwc2_hw_params {
  205. uint32_t snpsid;
  206. uint32_t dev_ep_dirs;
  207. unsigned op_mode : 3;
  208. unsigned arch : 2;
  209. unsigned enable_dynamic_fifo : 1;
  210. unsigned host_channels : 5;
  211. unsigned hs_phy_type : 2;
  212. unsigned fs_phy_type : 2;
  213. unsigned num_dev_ep : 4;
  214. unsigned nperio_tx_q_depth : 3;
  215. unsigned host_perio_tx_q_depth : 3;
  216. unsigned dev_token_q_depth : 5;
  217. unsigned max_transfer_size : 26;
  218. unsigned max_packet_count : 11;
  219. unsigned i2c_enable : 1;
  220. unsigned total_fifo_size : 16;
  221. unsigned lpm_mode : 1;
  222. unsigned en_multiple_tx_fifo : 1;
  223. unsigned num_dev_in_eps : 4;
  224. unsigned num_dev_perio_in_ep : 4;
  225. unsigned dma_desc_enable : 1;
  226. unsigned power_optimized : 1;
  227. unsigned hibernation : 1;
  228. unsigned utmi_phy_data_width : 2;
  229. unsigned acg_enable : 1;
  230. unsigned ipg_isoc_en : 1;
  231. unsigned service_interval_mode : 1;
  232. };
  233. #define DWC2_PHY_TYPE_PARAM_FS 0
  234. #define DWC2_PHY_TYPE_PARAM_UTMI 1
  235. #define DWC2_PHY_TYPE_PARAM_ULPI 2
  236. struct dwc2_user_params {
  237. uint8_t phy_type;
  238. uint8_t phy_utmi_width;
  239. bool device_dma_enable;
  240. bool device_dma_desc_enable;
  241. /* (5 * number of control endpoints + 8) + ((largest USB packet used / 4) + 1 for
  242. * status information) + (2 * number of OUT endpoints) + 1 for Global NAK
  243. */
  244. uint16_t device_rx_fifo_size;
  245. /* IN Endpoints Max packet Size / 4 */
  246. uint16_t device_tx_fifo_size[MAX_EPS_CHANNELS];
  247. bool host_dma_desc_enable;
  248. /*
  249. * (largest USB packet used / 4) + 1 for status information + 1 transfer complete +
  250. * 1 location each for Bulk/Control endpoint for handling NAK/NYET scenario
  251. */
  252. uint16_t host_rx_fifo_size;
  253. /* largest non-periodic USB packet used / 4 */
  254. uint16_t host_nperio_tx_fifo_size;
  255. /* largest periodic USB packet used / 4 */
  256. uint16_t host_perio_tx_fifo_size;
  257. uint32_t device_gccfg;
  258. uint32_t host_gccfg;
  259. bool b_session_valid_override;
  260. uint32_t total_fifo_size;
  261. };
  262. struct usb_dwc2_user_fifo_config {
  263. /* (5 * number of control endpoints + 8) + ((largest USB packet used / 4) + 1 for
  264. * status information) + (2 * number of OUT endpoints) + 1 for Global NAK
  265. */
  266. uint16_t device_rx_fifo_size;
  267. /* IN Endpoints Max packet Size / 4 */
  268. uint16_t device_tx_fifo_size[MAX_EPS_CHANNELS];
  269. };
  270. static inline void dwc2_get_hwparams(uint32_t reg_base, struct dwc2_hw_params *hw)
  271. {
  272. unsigned int width;
  273. uint32_t snpsid, hwcfg1, hwcfg2, hwcfg3, hwcfg4;
  274. snpsid = dwc2_readl(reg_base + GSNPSID_OFFSET);
  275. hwcfg1 = dwc2_readl(reg_base + GHWCFG1_OFFSET);
  276. hwcfg2 = dwc2_readl(reg_base + GHWCFG2_OFFSET);
  277. hwcfg3 = dwc2_readl(reg_base + GHWCFG3_OFFSET);
  278. hwcfg4 = dwc2_readl(reg_base + GHWCFG4_OFFSET);
  279. /* snpsid */
  280. hw->snpsid = snpsid;
  281. /* hwcfg1 */
  282. hw->dev_ep_dirs = hwcfg1;
  283. /* hwcfg2 */
  284. hw->op_mode = (hwcfg2 & GHWCFG2_OP_MODE_MASK) >>
  285. GHWCFG2_OP_MODE_SHIFT;
  286. hw->arch = (hwcfg2 & GHWCFG2_ARCHITECTURE_MASK) >>
  287. GHWCFG2_ARCHITECTURE_SHIFT;
  288. hw->enable_dynamic_fifo = !!(hwcfg2 & GHWCFG2_DYNAMIC_FIFO);
  289. hw->host_channels = 1 + ((hwcfg2 & GHWCFG2_NUM_HOST_CHAN_MASK) >>
  290. GHWCFG2_NUM_HOST_CHAN_SHIFT);
  291. hw->hs_phy_type = (hwcfg2 & GHWCFG2_HS_PHY_TYPE_MASK) >>
  292. GHWCFG2_HS_PHY_TYPE_SHIFT;
  293. hw->fs_phy_type = (hwcfg2 & GHWCFG2_FS_PHY_TYPE_MASK) >>
  294. GHWCFG2_FS_PHY_TYPE_SHIFT;
  295. hw->num_dev_ep = (hwcfg2 & GHWCFG2_NUM_DEV_EP_MASK) >>
  296. GHWCFG2_NUM_DEV_EP_SHIFT;
  297. hw->nperio_tx_q_depth =
  298. (hwcfg2 & GHWCFG2_NONPERIO_TX_Q_DEPTH_MASK) >>
  299. GHWCFG2_NONPERIO_TX_Q_DEPTH_SHIFT << 1;
  300. hw->host_perio_tx_q_depth =
  301. (hwcfg2 & GHWCFG2_HOST_PERIO_TX_Q_DEPTH_MASK) >>
  302. GHWCFG2_HOST_PERIO_TX_Q_DEPTH_SHIFT << 1;
  303. hw->dev_token_q_depth =
  304. (hwcfg2 & GHWCFG2_DEV_TOKEN_Q_DEPTH_MASK) >>
  305. GHWCFG2_DEV_TOKEN_Q_DEPTH_SHIFT;
  306. /* hwcfg3 */
  307. width = (hwcfg3 & GHWCFG3_XFER_SIZE_CNTR_WIDTH_MASK) >>
  308. GHWCFG3_XFER_SIZE_CNTR_WIDTH_SHIFT;
  309. hw->max_transfer_size = (1 << (width + 11)) - 1;
  310. width = (hwcfg3 & GHWCFG3_PACKET_SIZE_CNTR_WIDTH_MASK) >>
  311. GHWCFG3_PACKET_SIZE_CNTR_WIDTH_SHIFT;
  312. hw->max_packet_count = (1 << (width + 4)) - 1;
  313. hw->i2c_enable = !!(hwcfg3 & GHWCFG3_I2C);
  314. hw->total_fifo_size = (hwcfg3 & GHWCFG3_DFIFO_DEPTH_MASK) >>
  315. GHWCFG3_DFIFO_DEPTH_SHIFT;
  316. hw->lpm_mode = !!(hwcfg3 & GHWCFG3_OTG_LPM_EN);
  317. /* hwcfg4 */
  318. hw->en_multiple_tx_fifo = !!(hwcfg4 & GHWCFG4_DED_FIFO_EN);
  319. hw->num_dev_perio_in_ep = (hwcfg4 & GHWCFG4_NUM_DEV_PERIO_IN_EP_MASK) >>
  320. GHWCFG4_NUM_DEV_PERIO_IN_EP_SHIFT;
  321. hw->num_dev_in_eps = (hwcfg4 & GHWCFG4_NUM_IN_EPS_MASK) >>
  322. GHWCFG4_NUM_IN_EPS_SHIFT;
  323. hw->dma_desc_enable = !!(hwcfg4 & GHWCFG4_DESC_DMA);
  324. hw->power_optimized = !!(hwcfg4 & GHWCFG4_POWER_OPTIMIZ);
  325. hw->hibernation = !!(hwcfg4 & GHWCFG4_HIBER);
  326. hw->utmi_phy_data_width = (hwcfg4 & GHWCFG4_UTMI_PHY_DATA_WIDTH_MASK) >>
  327. GHWCFG4_UTMI_PHY_DATA_WIDTH_SHIFT;
  328. hw->acg_enable = !!(hwcfg4 & GHWCFG4_ACG_SUPPORTED);
  329. hw->ipg_isoc_en = !!(hwcfg4 & GHWCFG4_IPG_ISOC_SUPPORTED);
  330. hw->service_interval_mode = !!(hwcfg4 &
  331. GHWCFG4_SERVICE_INTERVAL_SUPPORTED);
  332. }
  333. void dwc2_get_user_params(uint32_t reg_base, struct dwc2_user_params *params);
  334. void dwc2_get_user_fifo_config(uint32_t reg_base, struct usb_dwc2_user_fifo_config *config);
  335. #endif