igbvf.c 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  1. /*
  2. * QEMU Intel 82576 SR/IOV Ethernet Controller Emulation
  3. *
  4. * Datasheet:
  5. * https://www.intel.com/content/dam/www/public/us/en/documents/datasheets/82576eg-gbe-datasheet.pdf
  6. *
  7. * Copyright (c) 2020-2023 Red Hat, Inc.
  8. * Copyright (c) 2015 Ravello Systems LTD (http://ravellosystems.com)
  9. * Developed by Daynix Computing LTD (http://www.daynix.com)
  10. *
  11. * Authors:
  12. * Akihiko Odaki <akihiko.odaki@daynix.com>
  13. * Gal Hammmer <gal.hammer@sap.com>
  14. * Marcel Apfelbaum <marcel.apfelbaum@gmail.com>
  15. * Dmitry Fleytman <dmitry@daynix.com>
  16. * Leonid Bloch <leonid@daynix.com>
  17. * Yan Vugenfirer <yan@daynix.com>
  18. *
  19. * Based on work done by:
  20. * Nir Peleg, Tutis Systems Ltd. for Qumranet Inc.
  21. * Copyright (c) 2008 Qumranet
  22. * Based on work done by:
  23. * Copyright (c) 2007 Dan Aloni
  24. * Copyright (c) 2004 Antony T Curtis
  25. *
  26. * This library is free software; you can redistribute it and/or
  27. * modify it under the terms of the GNU Lesser General Public
  28. * License as published by the Free Software Foundation; either
  29. * version 2.1 of the License, or (at your option) any later version.
  30. *
  31. * This library is distributed in the hope that it will be useful,
  32. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  33. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  34. * Lesser General Public License for more details.
  35. *
  36. * You should have received a copy of the GNU Lesser General Public
  37. * License along with this library; if not, see <http://www.gnu.org/licenses/>.
  38. */
  39. #include "qemu/osdep.h"
  40. #include "hw/hw.h"
  41. #include "hw/net/mii.h"
  42. #include "hw/pci/pci_device.h"
  43. #include "hw/pci/pcie.h"
  44. #include "hw/pci/msix.h"
  45. #include "net/eth.h"
  46. #include "net/net.h"
  47. #include "igb_common.h"
  48. #include "igb_core.h"
  49. #include "trace.h"
  50. #include "qapi/error.h"
  51. OBJECT_DECLARE_SIMPLE_TYPE(IgbVfState, IGBVF)
  52. struct IgbVfState {
  53. PCIDevice parent_obj;
  54. MemoryRegion mmio;
  55. MemoryRegion msix;
  56. };
  57. static hwaddr vf_to_pf_addr(hwaddr addr, uint16_t vfn, bool write)
  58. {
  59. switch (addr) {
  60. case E1000_CTRL:
  61. case E1000_CTRL_DUP:
  62. return E1000_PVTCTRL(vfn);
  63. case E1000_EICS:
  64. return E1000_PVTEICS(vfn);
  65. case E1000_EIMS:
  66. return E1000_PVTEIMS(vfn);
  67. case E1000_EIMC:
  68. return E1000_PVTEIMC(vfn);
  69. case E1000_EIAC:
  70. return E1000_PVTEIAC(vfn);
  71. case E1000_EIAM:
  72. return E1000_PVTEIAM(vfn);
  73. case E1000_EICR:
  74. return E1000_PVTEICR(vfn);
  75. case E1000_EITR(0):
  76. case E1000_EITR(1):
  77. case E1000_EITR(2):
  78. return E1000_EITR(22) + (addr - E1000_EITR(0)) - vfn * 0xC;
  79. case E1000_IVAR0:
  80. return E1000_VTIVAR + vfn * 4;
  81. case E1000_IVAR_MISC:
  82. return E1000_VTIVAR_MISC + vfn * 4;
  83. case 0x0F04: /* PBACL */
  84. return E1000_PBACLR;
  85. case 0x0F0C: /* PSRTYPE */
  86. return E1000_PSRTYPE(vfn);
  87. case E1000_V2PMAILBOX(0):
  88. return E1000_V2PMAILBOX(vfn);
  89. case E1000_VMBMEM(0) ... E1000_VMBMEM(0) + 0x3F:
  90. return addr + vfn * 0x40;
  91. case E1000_RDBAL_A(0):
  92. return E1000_RDBAL(vfn);
  93. case E1000_RDBAL_A(1):
  94. return E1000_RDBAL(vfn + IGB_MAX_VF_FUNCTIONS);
  95. case E1000_RDBAH_A(0):
  96. return E1000_RDBAH(vfn);
  97. case E1000_RDBAH_A(1):
  98. return E1000_RDBAH(vfn + IGB_MAX_VF_FUNCTIONS);
  99. case E1000_RDLEN_A(0):
  100. return E1000_RDLEN(vfn);
  101. case E1000_RDLEN_A(1):
  102. return E1000_RDLEN(vfn + IGB_MAX_VF_FUNCTIONS);
  103. case E1000_SRRCTL_A(0):
  104. return E1000_SRRCTL(vfn);
  105. case E1000_SRRCTL_A(1):
  106. return E1000_SRRCTL(vfn + IGB_MAX_VF_FUNCTIONS);
  107. case E1000_RDH_A(0):
  108. return E1000_RDH(vfn);
  109. case E1000_RDH_A(1):
  110. return E1000_RDH(vfn + IGB_MAX_VF_FUNCTIONS);
  111. case E1000_RXCTL_A(0):
  112. return E1000_RXCTL(vfn);
  113. case E1000_RXCTL_A(1):
  114. return E1000_RXCTL(vfn + IGB_MAX_VF_FUNCTIONS);
  115. case E1000_RDT_A(0):
  116. return E1000_RDT(vfn);
  117. case E1000_RDT_A(1):
  118. return E1000_RDT(vfn + IGB_MAX_VF_FUNCTIONS);
  119. case E1000_RXDCTL_A(0):
  120. return E1000_RXDCTL(vfn);
  121. case E1000_RXDCTL_A(1):
  122. return E1000_RXDCTL(vfn + IGB_MAX_VF_FUNCTIONS);
  123. case E1000_RQDPC_A(0):
  124. return E1000_RQDPC(vfn);
  125. case E1000_RQDPC_A(1):
  126. return E1000_RQDPC(vfn + IGB_MAX_VF_FUNCTIONS);
  127. case E1000_TDBAL_A(0):
  128. return E1000_TDBAL(vfn);
  129. case E1000_TDBAL_A(1):
  130. return E1000_TDBAL(vfn + IGB_MAX_VF_FUNCTIONS);
  131. case E1000_TDBAH_A(0):
  132. return E1000_TDBAH(vfn);
  133. case E1000_TDBAH_A(1):
  134. return E1000_TDBAH(vfn + IGB_MAX_VF_FUNCTIONS);
  135. case E1000_TDLEN_A(0):
  136. return E1000_TDLEN(vfn);
  137. case E1000_TDLEN_A(1):
  138. return E1000_TDLEN(vfn + IGB_MAX_VF_FUNCTIONS);
  139. case E1000_TDH_A(0):
  140. return E1000_TDH(vfn);
  141. case E1000_TDH_A(1):
  142. return E1000_TDH(vfn + IGB_MAX_VF_FUNCTIONS);
  143. case E1000_TXCTL_A(0):
  144. return E1000_TXCTL(vfn);
  145. case E1000_TXCTL_A(1):
  146. return E1000_TXCTL(vfn + IGB_MAX_VF_FUNCTIONS);
  147. case E1000_TDT_A(0):
  148. return E1000_TDT(vfn);
  149. case E1000_TDT_A(1):
  150. return E1000_TDT(vfn + IGB_MAX_VF_FUNCTIONS);
  151. case E1000_TXDCTL_A(0):
  152. return E1000_TXDCTL(vfn);
  153. case E1000_TXDCTL_A(1):
  154. return E1000_TXDCTL(vfn + IGB_MAX_VF_FUNCTIONS);
  155. case E1000_TDWBAL_A(0):
  156. return E1000_TDWBAL(vfn);
  157. case E1000_TDWBAL_A(1):
  158. return E1000_TDWBAL(vfn + IGB_MAX_VF_FUNCTIONS);
  159. case E1000_TDWBAH_A(0):
  160. return E1000_TDWBAH(vfn);
  161. case E1000_TDWBAH_A(1):
  162. return E1000_TDWBAH(vfn + IGB_MAX_VF_FUNCTIONS);
  163. case E1000_VFGPRC:
  164. return E1000_PVFGPRC(vfn);
  165. case E1000_VFGPTC:
  166. return E1000_PVFGPTC(vfn);
  167. case E1000_VFGORC:
  168. return E1000_PVFGORC(vfn);
  169. case E1000_VFGOTC:
  170. return E1000_PVFGOTC(vfn);
  171. case E1000_VFMPRC:
  172. return E1000_PVFMPRC(vfn);
  173. case E1000_VFGPRLBC:
  174. return E1000_PVFGPRLBC(vfn);
  175. case E1000_VFGPTLBC:
  176. return E1000_PVFGPTLBC(vfn);
  177. case E1000_VFGORLBC:
  178. return E1000_PVFGORLBC(vfn);
  179. case E1000_VFGOTLBC:
  180. return E1000_PVFGOTLBC(vfn);
  181. case E1000_STATUS:
  182. case E1000_FRTIMER:
  183. if (write) {
  184. return HWADDR_MAX;
  185. }
  186. /* fallthrough */
  187. case 0x34E8: /* PBTWAC */
  188. case 0x24E8: /* PBRWAC */
  189. return addr;
  190. }
  191. trace_igbvf_wrn_io_addr_unknown(addr);
  192. return HWADDR_MAX;
  193. }
  194. static void igbvf_write_config(PCIDevice *dev, uint32_t addr, uint32_t val,
  195. int len)
  196. {
  197. trace_igbvf_write_config(addr, val, len);
  198. pci_default_write_config(dev, addr, val, len);
  199. if (object_property_get_bool(OBJECT(pcie_sriov_get_pf(dev)),
  200. "x-pcie-flr-init", &error_abort)) {
  201. pcie_cap_flr_write_config(dev, addr, val, len);
  202. }
  203. }
  204. static uint64_t igbvf_mmio_read(void *opaque, hwaddr addr, unsigned size)
  205. {
  206. PCIDevice *vf = PCI_DEVICE(opaque);
  207. PCIDevice *pf = pcie_sriov_get_pf(vf);
  208. addr = vf_to_pf_addr(addr, pcie_sriov_vf_number(vf), false);
  209. return addr == HWADDR_MAX ? 0 : igb_mmio_read(pf, addr, size);
  210. }
  211. static void igbvf_mmio_write(void *opaque, hwaddr addr, uint64_t val,
  212. unsigned size)
  213. {
  214. PCIDevice *vf = PCI_DEVICE(opaque);
  215. PCIDevice *pf = pcie_sriov_get_pf(vf);
  216. addr = vf_to_pf_addr(addr, pcie_sriov_vf_number(vf), true);
  217. if (addr != HWADDR_MAX) {
  218. igb_mmio_write(pf, addr, val, size);
  219. }
  220. }
  221. static const MemoryRegionOps mmio_ops = {
  222. .read = igbvf_mmio_read,
  223. .write = igbvf_mmio_write,
  224. .endianness = DEVICE_LITTLE_ENDIAN,
  225. .impl = {
  226. .min_access_size = 4,
  227. .max_access_size = 4,
  228. },
  229. };
  230. static void igbvf_pci_realize(PCIDevice *dev, Error **errp)
  231. {
  232. IgbVfState *s = IGBVF(dev);
  233. int ret;
  234. int i;
  235. dev->config_write = igbvf_write_config;
  236. memory_region_init_io(&s->mmio, OBJECT(dev), &mmio_ops, s, "igbvf-mmio",
  237. IGBVF_MMIO_SIZE);
  238. pcie_sriov_vf_register_bar(dev, IGBVF_MMIO_BAR_IDX, &s->mmio);
  239. memory_region_init(&s->msix, OBJECT(dev), "igbvf-msix", IGBVF_MSIX_SIZE);
  240. pcie_sriov_vf_register_bar(dev, IGBVF_MSIX_BAR_IDX, &s->msix);
  241. ret = msix_init(dev, IGBVF_MSIX_VEC_NUM, &s->msix, IGBVF_MSIX_BAR_IDX, 0,
  242. &s->msix, IGBVF_MSIX_BAR_IDX, 0x2000, 0x70, errp);
  243. if (ret) {
  244. return;
  245. }
  246. for (i = 0; i < IGBVF_MSIX_VEC_NUM; i++) {
  247. msix_vector_use(dev, i);
  248. }
  249. if (pcie_endpoint_cap_init(dev, 0xa0) < 0) {
  250. hw_error("Failed to initialize PCIe capability");
  251. }
  252. if (object_property_get_bool(OBJECT(pcie_sriov_get_pf(dev)),
  253. "x-pcie-flr-init", &error_abort)) {
  254. pcie_cap_flr_init(dev);
  255. }
  256. if (pcie_aer_init(dev, 1, 0x100, 0x40, errp) < 0) {
  257. hw_error("Failed to initialize AER capability");
  258. }
  259. pcie_ari_init(dev, 0x150);
  260. }
  261. static void igbvf_qdev_reset_hold(Object *obj, ResetType type)
  262. {
  263. PCIDevice *vf = PCI_DEVICE(obj);
  264. igb_vf_reset(pcie_sriov_get_pf(vf), pcie_sriov_vf_number(vf));
  265. }
  266. static void igbvf_pci_uninit(PCIDevice *dev)
  267. {
  268. IgbVfState *s = IGBVF(dev);
  269. pcie_aer_exit(dev);
  270. pcie_cap_exit(dev);
  271. msix_unuse_all_vectors(dev);
  272. msix_uninit(dev, &s->msix, &s->msix);
  273. }
  274. static void igbvf_class_init(ObjectClass *class, void *data)
  275. {
  276. DeviceClass *dc = DEVICE_CLASS(class);
  277. PCIDeviceClass *c = PCI_DEVICE_CLASS(class);
  278. ResettableClass *rc = RESETTABLE_CLASS(class);
  279. c->realize = igbvf_pci_realize;
  280. c->exit = igbvf_pci_uninit;
  281. c->vendor_id = PCI_VENDOR_ID_INTEL;
  282. c->device_id = E1000_DEV_ID_82576_VF;
  283. c->revision = 1;
  284. c->class_id = PCI_CLASS_NETWORK_ETHERNET;
  285. rc->phases.hold = igbvf_qdev_reset_hold;
  286. dc->desc = "Intel 82576 Virtual Function";
  287. dc->user_creatable = false;
  288. set_bit(DEVICE_CATEGORY_NETWORK, dc->categories);
  289. }
  290. static const TypeInfo igbvf_info = {
  291. .name = TYPE_IGBVF,
  292. .parent = TYPE_PCI_DEVICE,
  293. .instance_size = sizeof(IgbVfState),
  294. .class_init = igbvf_class_init,
  295. .interfaces = (InterfaceInfo[]) {
  296. { INTERFACE_PCIE_DEVICE },
  297. { }
  298. },
  299. };
  300. static void igb_register_types(void)
  301. {
  302. type_register_static(&igbvf_info);
  303. }
  304. type_init(igb_register_types)