You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

intel.h 10KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  1. #ifndef _INTEL_H
  2. #define _INTEL_H
  3. /** @file
  4. *
  5. * Intel 10/100/1000 network card driver
  6. *
  7. */
  8. FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
  9. #include <stdint.h>
  10. #include <ipxe/if_ether.h>
  11. #include <ipxe/nvs.h>
  12. /** Intel BAR size */
  13. #define INTEL_BAR_SIZE ( 128 * 1024 )
  14. /** A packet descriptor */
  15. struct intel_descriptor {
  16. /** Buffer address */
  17. uint64_t address;
  18. /** Length */
  19. uint16_t length;
  20. /** Flags */
  21. uint8_t flags;
  22. /** Command */
  23. uint8_t command;
  24. /** Status */
  25. uint32_t status;
  26. } __attribute__ (( packed ));
  27. /** Descriptor type */
  28. #define INTEL_DESC_FL_DTYP( dtyp ) ( (dtyp) << 4 )
  29. #define INTEL_DESC_FL_DTYP_DATA INTEL_DESC_FL_DTYP ( 0x03 )
  30. /** Descriptor extension */
  31. #define INTEL_DESC_CMD_DEXT 0x20
  32. /** Report status */
  33. #define INTEL_DESC_CMD_RS 0x08
  34. /** Insert frame checksum (CRC) */
  35. #define INTEL_DESC_CMD_IFCS 0x02
  36. /** End of packet */
  37. #define INTEL_DESC_CMD_EOP 0x01
  38. /** Descriptor done */
  39. #define INTEL_DESC_STATUS_DD 0x00000001UL
  40. /** Receive error */
  41. #define INTEL_DESC_STATUS_RXE 0x00000100UL
  42. /** Payload length */
  43. #define INTEL_DESC_STATUS_PAYLEN( len ) ( (len) << 14 )
  44. /** Device Control Register */
  45. #define INTEL_CTRL 0x00000UL
  46. #define INTEL_CTRL_LRST 0x00000008UL /**< Link reset */
  47. #define INTEL_CTRL_ASDE 0x00000020UL /**< Auto-speed detection */
  48. #define INTEL_CTRL_SLU 0x00000040UL /**< Set link up */
  49. #define INTEL_CTRL_FRCSPD 0x00000800UL /**< Force speed */
  50. #define INTEL_CTRL_FRCDPLX 0x00001000UL /**< Force duplex */
  51. #define INTEL_CTRL_RST 0x04000000UL /**< Device reset */
  52. #define INTEL_CTRL_PHY_RST 0x80000000UL /**< PHY reset */
  53. /** Time to delay for device reset, in milliseconds */
  54. #define INTEL_RESET_DELAY_MS 20
  55. /** Device Status Register */
  56. #define INTEL_STATUS 0x00008UL
  57. #define INTEL_STATUS_LU 0x00000002UL /**< Link up */
  58. /** EEPROM Read Register */
  59. #define INTEL_EERD 0x00014UL
  60. #define INTEL_EERD_START 0x00000001UL /**< Start read */
  61. #define INTEL_EERD_DONE_SMALL 0x00000010UL /**< Read done (small EERD) */
  62. #define INTEL_EERD_DONE_LARGE 0x00000002UL /**< Read done (large EERD) */
  63. #define INTEL_EERD_ADDR_SHIFT_SMALL 8 /**< Address shift (small) */
  64. #define INTEL_EERD_ADDR_SHIFT_LARGE 2 /**< Address shift (large) */
  65. #define INTEL_EERD_DATA(value) ( (value) >> 16 ) /**< Read data */
  66. /** Maximum time to wait for EEPROM read, in milliseconds */
  67. #define INTEL_EEPROM_MAX_WAIT_MS 100
  68. /** EEPROM word length */
  69. #define INTEL_EEPROM_WORD_LEN_LOG2 1
  70. /** Minimum EEPROM size, in words */
  71. #define INTEL_EEPROM_MIN_SIZE_WORDS 64
  72. /** Offset of MAC address within EEPROM */
  73. #define INTEL_EEPROM_MAC 0x00
  74. /** Interrupt Cause Read Register */
  75. #define INTEL_ICR 0x000c0UL
  76. #define INTEL_IRQ_TXDW 0x00000001UL /**< Transmit descriptor done */
  77. #define INTEL_IRQ_TXQE 0x00000002UL /**< Transmit queue empty */
  78. #define INTEL_IRQ_LSC 0x00000004UL /**< Link status change */
  79. #define INTEL_IRQ_RXDMT0 0x00000010UL /**< Receive queue low */
  80. #define INTEL_IRQ_RXO 0x00000040UL /**< Receive overrun */
  81. #define INTEL_IRQ_RXT0 0x00000080UL /**< Receive timer */
  82. /** Interrupt Mask Set/Read Register */
  83. #define INTEL_IMS 0x000d0UL
  84. /** Interrupt Mask Clear Register */
  85. #define INTEL_IMC 0x000d8UL
  86. /** Receive Control Register */
  87. #define INTEL_RCTL 0x00100UL
  88. #define INTEL_RCTL_EN 0x00000002UL /**< Receive enable */
  89. #define INTEL_RCTL_UPE 0x00000008UL /**< Unicast promiscuous mode */
  90. #define INTEL_RCTL_MPE 0x00000010UL /**< Multicast promiscuous */
  91. #define INTEL_RCTL_BAM 0x00008000UL /**< Broadcast accept mode */
  92. #define INTEL_RCTL_BSIZE_BSEX(bsex,bsize) \
  93. ( ( (bsize) << 16 ) | ( (bsex) << 25 ) ) /**< Buffer size */
  94. #define INTEL_RCTL_BSIZE_2048 INTEL_RCTL_BSIZE_BSEX ( 0, 0 )
  95. #define INTEL_RCTL_BSIZE_BSEX_MASK INTEL_RCTL_BSIZE_BSEX ( 1, 3 )
  96. #define INTEL_RCTL_SECRC 0x04000000UL /**< Strip CRC */
  97. /** Transmit Control Register */
  98. #define INTEL_TCTL 0x00400UL
  99. #define INTEL_TCTL_EN 0x00000002UL /**< Transmit enable */
  100. #define INTEL_TCTL_PSP 0x00000008UL /**< Pad short packets */
  101. #define INTEL_TCTL_CT(x) ( (x) << 4 ) /**< Collision threshold */
  102. #define INTEL_TCTL_CT_DEFAULT INTEL_TCTL_CT ( 0x0f )
  103. #define INTEL_TCTL_CT_MASK INTEL_TCTL_CT ( 0xff )
  104. #define INTEL_TCTL_COLD(x) ( (x) << 12 ) /**< Collision distance */
  105. #define INTEL_TCTL_COLD_DEFAULT INTEL_TCTL_COLD ( 0x040 )
  106. #define INTEL_TCTL_COLD_MASK INTEL_TCTL_COLD ( 0x3ff )
  107. /** Packet Buffer Allocation */
  108. #define INTEL_PBA 0x01000UL
  109. /** Packet Buffer Size */
  110. #define INTEL_PBS 0x01008UL
  111. /** Receive Descriptor register block */
  112. #define INTEL_RD 0x02800UL
  113. /** Number of receive descriptors
  114. *
  115. * Minimum value is 8, since the descriptor ring length must be a
  116. * multiple of 128.
  117. */
  118. #define INTEL_NUM_RX_DESC 16
  119. /** Receive descriptor ring fill level */
  120. #define INTEL_RX_FILL 8
  121. /** Receive buffer length */
  122. #define INTEL_RX_MAX_LEN 2048
  123. /** Transmit Descriptor register block */
  124. #define INTEL_TD 0x03800UL
  125. /** Number of transmit descriptors
  126. *
  127. * Descriptor ring length must be a multiple of 16. ICH8/9/10
  128. * requires a minimum of 16 TX descriptors.
  129. */
  130. #define INTEL_NUM_TX_DESC 16
  131. /** Transmit descriptor ring maximum fill level */
  132. #define INTEL_TX_FILL ( INTEL_NUM_TX_DESC - 1 )
  133. /** Receive/Transmit Descriptor Base Address Low (offset) */
  134. #define INTEL_xDBAL 0x00
  135. /** Receive/Transmit Descriptor Base Address High (offset) */
  136. #define INTEL_xDBAH 0x04
  137. /** Receive/Transmit Descriptor Length (offset) */
  138. #define INTEL_xDLEN 0x08
  139. /** Receive/Transmit Descriptor Head (offset) */
  140. #define INTEL_xDH 0x10
  141. /** Receive/Transmit Descriptor Tail (offset) */
  142. #define INTEL_xDT 0x18
  143. /** Receive/Transmit Descriptor Control (offset) */
  144. #define INTEL_xDCTL 0x28
  145. #define INTEL_xDCTL_ENABLE 0x02000000UL /**< Queue enable */
  146. /** Maximum time to wait for queue disable, in milliseconds */
  147. #define INTEL_DISABLE_MAX_WAIT_MS 100
  148. /** Receive Address Low */
  149. #define INTEL_RAL0 0x05400UL
  150. /** Receive Address High */
  151. #define INTEL_RAH0 0x05404UL
  152. #define INTEL_RAH0_AV 0x80000000UL /**< Address valid */
  153. /** Future Extended NVM register 11 */
  154. #define INTEL_FEXTNVM11 0x05bbcUL
  155. #define INTEL_FEXTNVM11_WTF 0x00002000UL /**< Don't ask */
  156. /** Receive address */
  157. union intel_receive_address {
  158. struct {
  159. uint32_t low;
  160. uint32_t high;
  161. } __attribute__ (( packed )) reg;
  162. uint8_t raw[ETH_ALEN];
  163. };
  164. /** An Intel descriptor ring */
  165. struct intel_ring {
  166. /** Descriptors */
  167. struct intel_descriptor *desc;
  168. /** Producer index */
  169. unsigned int prod;
  170. /** Consumer index */
  171. unsigned int cons;
  172. /** Register block */
  173. unsigned int reg;
  174. /** Length (in bytes) */
  175. size_t len;
  176. /** Populate descriptor
  177. *
  178. * @v desc Descriptor
  179. * @v addr Data buffer address
  180. * @v len Length of data
  181. */
  182. void ( * describe ) ( struct intel_descriptor *desc, physaddr_t addr,
  183. size_t len );
  184. };
  185. /**
  186. * Initialise descriptor ring
  187. *
  188. * @v ring Descriptor ring
  189. * @v count Number of descriptors
  190. * @v reg Descriptor register block
  191. * @v describe Method to populate descriptor
  192. */
  193. static inline __attribute__ (( always_inline)) void
  194. intel_init_ring ( struct intel_ring *ring, unsigned int count, unsigned int reg,
  195. void ( * describe ) ( struct intel_descriptor *desc,
  196. physaddr_t addr, size_t len ) ) {
  197. ring->len = ( count * sizeof ( ring->desc[0] ) );
  198. ring->reg = reg;
  199. ring->describe = describe;
  200. }
  201. /** An Intel virtual function mailbox */
  202. struct intel_mailbox {
  203. /** Mailbox control register */
  204. unsigned int ctrl;
  205. /** Mailbox memory base */
  206. unsigned int mem;
  207. };
  208. /**
  209. * Initialise mailbox
  210. *
  211. * @v mbox Mailbox
  212. * @v ctrl Mailbox control register
  213. * @v mem Mailbox memory register base
  214. */
  215. static inline __attribute__ (( always_inline )) void
  216. intel_init_mbox ( struct intel_mailbox *mbox, unsigned int ctrl,
  217. unsigned int mem ) {
  218. mbox->ctrl = ctrl;
  219. mbox->mem = mem;
  220. }
  221. /** An Intel network card */
  222. struct intel_nic {
  223. /** Registers */
  224. void *regs;
  225. /** Port number (for multi-port devices) */
  226. unsigned int port;
  227. /** Flags */
  228. unsigned int flags;
  229. /** Forced interrupts */
  230. unsigned int force_icr;
  231. /** EEPROM */
  232. struct nvs_device eeprom;
  233. /** EEPROM done flag */
  234. uint32_t eerd_done;
  235. /** EEPROM address shift */
  236. unsigned int eerd_addr_shift;
  237. /** Mailbox */
  238. struct intel_mailbox mbox;
  239. /** Transmit descriptor ring */
  240. struct intel_ring tx;
  241. /** Receive descriptor ring */
  242. struct intel_ring rx;
  243. /** Receive I/O buffers */
  244. struct io_buffer *rx_iobuf[INTEL_NUM_RX_DESC];
  245. };
  246. /** Driver flags */
  247. enum intel_flags {
  248. /** PBS/PBA errata workaround required */
  249. INTEL_PBS_ERRATA = 0x0001,
  250. /** VMware missing interrupt workaround required */
  251. INTEL_VMWARE = 0x0002,
  252. /** PHY reset is broken */
  253. INTEL_NO_PHY_RST = 0x0004,
  254. /** ASDE is broken */
  255. INTEL_NO_ASDE = 0x0008,
  256. /** Reset may cause a complete device hang */
  257. INTEL_RST_HANG = 0x0010,
  258. };
  259. /** The i219 has a seriously broken reset mechanism */
  260. #define INTEL_I219 ( INTEL_NO_PHY_RST | INTEL_RST_HANG )
  261. /**
  262. * Dump diagnostic information
  263. *
  264. * @v intel Intel device
  265. */
  266. static inline void intel_diag ( struct intel_nic *intel ) {
  267. DBGC ( intel, "INTEL %p TX %04x(%02x)/%04x(%02x) "
  268. "RX %04x(%02x)/%04x(%02x)\n", intel,
  269. ( intel->tx.cons & 0xffff ),
  270. readl ( intel->regs + intel->tx.reg + INTEL_xDH ),
  271. ( intel->tx.prod & 0xffff ),
  272. readl ( intel->regs + intel->tx.reg + INTEL_xDT ),
  273. ( intel->rx.cons & 0xffff ),
  274. readl ( intel->regs + intel->rx.reg + INTEL_xDH ),
  275. ( intel->rx.prod & 0xffff ),
  276. readl ( intel->regs + intel->rx.reg + INTEL_xDT ) );
  277. }
  278. extern void intel_describe_tx ( struct intel_descriptor *tx,
  279. physaddr_t addr, size_t len );
  280. extern void intel_describe_tx_adv ( struct intel_descriptor *tx,
  281. physaddr_t addr, size_t len );
  282. extern void intel_describe_rx ( struct intel_descriptor *rx,
  283. physaddr_t addr, size_t len );
  284. extern void intel_reset_ring ( struct intel_nic *intel, unsigned int reg );
  285. extern int intel_create_ring ( struct intel_nic *intel,
  286. struct intel_ring *ring );
  287. extern void intel_destroy_ring ( struct intel_nic *intel,
  288. struct intel_ring *ring );
  289. extern void intel_refill_rx ( struct intel_nic *intel );
  290. extern void intel_empty_rx ( struct intel_nic *intel );
  291. extern int intel_transmit ( struct net_device *netdev,
  292. struct io_buffer *iobuf );
  293. extern void intel_poll_tx ( struct net_device *netdev );
  294. extern void intel_poll_rx ( struct net_device *netdev );
  295. #endif /* _INTEL_H */