virtio-pci.c 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876
  1. /*
  2. * Virtio PCI Bindings
  3. *
  4. * Copyright IBM, Corp. 2007
  5. * Copyright (c) 2009 CodeSourcery
  6. *
  7. * Authors:
  8. * Anthony Liguori <aliguori@us.ibm.com>
  9. * Paul Brook <paul@codesourcery.com>
  10. *
  11. * This work is licensed under the terms of the GNU GPL, version 2. See
  12. * the COPYING file in the top-level directory.
  13. *
  14. */
  15. #include <inttypes.h>
  16. #include "virtio.h"
  17. #include "virtio-blk.h"
  18. #include "virtio-net.h"
  19. #include "virtio-serial.h"
  20. #include "pci.h"
  21. #include "qemu-error.h"
  22. #include "msix.h"
  23. #include "net.h"
  24. #include "loader.h"
  25. #include "kvm.h"
  26. #include "blockdev.h"
  27. #include "virtio-pci.h"
  28. #include "range.h"
  29. /* from Linux's linux/virtio_pci.h */
  30. /* A 32-bit r/o bitmask of the features supported by the host */
  31. #define VIRTIO_PCI_HOST_FEATURES 0
  32. /* A 32-bit r/w bitmask of features activated by the guest */
  33. #define VIRTIO_PCI_GUEST_FEATURES 4
  34. /* A 32-bit r/w PFN for the currently selected queue */
  35. #define VIRTIO_PCI_QUEUE_PFN 8
  36. /* A 16-bit r/o queue size for the currently selected queue */
  37. #define VIRTIO_PCI_QUEUE_NUM 12
  38. /* A 16-bit r/w queue selector */
  39. #define VIRTIO_PCI_QUEUE_SEL 14
  40. /* A 16-bit r/w queue notifier */
  41. #define VIRTIO_PCI_QUEUE_NOTIFY 16
  42. /* An 8-bit device status register. */
  43. #define VIRTIO_PCI_STATUS 18
  44. /* An 8-bit r/o interrupt status register. Reading the value will return the
  45. * current contents of the ISR and will also clear it. This is effectively
  46. * a read-and-acknowledge. */
  47. #define VIRTIO_PCI_ISR 19
  48. /* MSI-X registers: only enabled if MSI-X is enabled. */
  49. /* A 16-bit vector for configuration changes. */
  50. #define VIRTIO_MSI_CONFIG_VECTOR 20
  51. /* A 16-bit vector for selected queue notifications. */
  52. #define VIRTIO_MSI_QUEUE_VECTOR 22
  53. /* Config space size */
  54. #define VIRTIO_PCI_CONFIG_NOMSI 20
  55. #define VIRTIO_PCI_CONFIG_MSI 24
  56. #define VIRTIO_PCI_REGION_SIZE(dev) (msix_present(dev) ? \
  57. VIRTIO_PCI_CONFIG_MSI : \
  58. VIRTIO_PCI_CONFIG_NOMSI)
  59. /* The remaining space is defined by each driver as the per-driver
  60. * configuration space */
  61. #define VIRTIO_PCI_CONFIG(dev) (msix_enabled(dev) ? \
  62. VIRTIO_PCI_CONFIG_MSI : \
  63. VIRTIO_PCI_CONFIG_NOMSI)
  64. /* How many bits to shift physical queue address written to QUEUE_PFN.
  65. * 12 is historical, and due to x86 page size. */
  66. #define VIRTIO_PCI_QUEUE_ADDR_SHIFT 12
  67. /* Flags track per-device state like workarounds for quirks in older guests. */
  68. #define VIRTIO_PCI_FLAG_BUS_MASTER_BUG (1 << 0)
  69. /* QEMU doesn't strictly need write barriers since everything runs in
  70. * lock-step. We'll leave the calls to wmb() in though to make it obvious for
  71. * KVM or if kqemu gets SMP support.
  72. */
  73. #define wmb() do { } while (0)
  74. /* virtio device */
  75. static void virtio_pci_notify(void *opaque, uint16_t vector)
  76. {
  77. VirtIOPCIProxy *proxy = opaque;
  78. if (msix_enabled(&proxy->pci_dev))
  79. msix_notify(&proxy->pci_dev, vector);
  80. else
  81. qemu_set_irq(proxy->pci_dev.irq[0], proxy->vdev->isr & 1);
  82. }
  83. static void virtio_pci_save_config(void * opaque, QEMUFile *f)
  84. {
  85. VirtIOPCIProxy *proxy = opaque;
  86. pci_device_save(&proxy->pci_dev, f);
  87. msix_save(&proxy->pci_dev, f);
  88. if (msix_present(&proxy->pci_dev))
  89. qemu_put_be16(f, proxy->vdev->config_vector);
  90. }
  91. static void virtio_pci_save_queue(void * opaque, int n, QEMUFile *f)
  92. {
  93. VirtIOPCIProxy *proxy = opaque;
  94. if (msix_present(&proxy->pci_dev))
  95. qemu_put_be16(f, virtio_queue_vector(proxy->vdev, n));
  96. }
  97. static int virtio_pci_load_config(void * opaque, QEMUFile *f)
  98. {
  99. VirtIOPCIProxy *proxy = opaque;
  100. int ret;
  101. ret = pci_device_load(&proxy->pci_dev, f);
  102. if (ret) {
  103. return ret;
  104. }
  105. msix_load(&proxy->pci_dev, f);
  106. if (msix_present(&proxy->pci_dev)) {
  107. qemu_get_be16s(f, &proxy->vdev->config_vector);
  108. } else {
  109. proxy->vdev->config_vector = VIRTIO_NO_VECTOR;
  110. }
  111. if (proxy->vdev->config_vector != VIRTIO_NO_VECTOR) {
  112. return msix_vector_use(&proxy->pci_dev, proxy->vdev->config_vector);
  113. }
  114. return 0;
  115. }
  116. static int virtio_pci_load_queue(void * opaque, int n, QEMUFile *f)
  117. {
  118. VirtIOPCIProxy *proxy = opaque;
  119. uint16_t vector;
  120. if (msix_present(&proxy->pci_dev)) {
  121. qemu_get_be16s(f, &vector);
  122. } else {
  123. vector = VIRTIO_NO_VECTOR;
  124. }
  125. virtio_queue_set_vector(proxy->vdev, n, vector);
  126. if (vector != VIRTIO_NO_VECTOR) {
  127. return msix_vector_use(&proxy->pci_dev, vector);
  128. }
  129. return 0;
  130. }
  131. static int virtio_pci_set_host_notifier_internal(VirtIOPCIProxy *proxy,
  132. int n, bool assign)
  133. {
  134. VirtQueue *vq = virtio_get_queue(proxy->vdev, n);
  135. EventNotifier *notifier = virtio_queue_get_host_notifier(vq);
  136. int r = 0;
  137. if (assign) {
  138. r = event_notifier_init(notifier, 1);
  139. if (r < 0) {
  140. error_report("%s: unable to init event notifier: %d",
  141. __func__, r);
  142. return r;
  143. }
  144. memory_region_add_eventfd(&proxy->bar, VIRTIO_PCI_QUEUE_NOTIFY, 2,
  145. true, n, event_notifier_get_fd(notifier));
  146. } else {
  147. memory_region_del_eventfd(&proxy->bar, VIRTIO_PCI_QUEUE_NOTIFY, 2,
  148. true, n, event_notifier_get_fd(notifier));
  149. /* Handle the race condition where the guest kicked and we deassigned
  150. * before we got around to handling the kick.
  151. */
  152. if (event_notifier_test_and_clear(notifier)) {
  153. virtio_queue_notify_vq(vq);
  154. }
  155. event_notifier_cleanup(notifier);
  156. }
  157. return r;
  158. }
  159. static void virtio_pci_host_notifier_read(void *opaque)
  160. {
  161. VirtQueue *vq = opaque;
  162. EventNotifier *n = virtio_queue_get_host_notifier(vq);
  163. if (event_notifier_test_and_clear(n)) {
  164. virtio_queue_notify_vq(vq);
  165. }
  166. }
  167. static void virtio_pci_set_host_notifier_fd_handler(VirtIOPCIProxy *proxy,
  168. int n, bool assign)
  169. {
  170. VirtQueue *vq = virtio_get_queue(proxy->vdev, n);
  171. EventNotifier *notifier = virtio_queue_get_host_notifier(vq);
  172. if (assign) {
  173. qemu_set_fd_handler(event_notifier_get_fd(notifier),
  174. virtio_pci_host_notifier_read, NULL, vq);
  175. } else {
  176. qemu_set_fd_handler(event_notifier_get_fd(notifier),
  177. NULL, NULL, NULL);
  178. }
  179. }
  180. static void virtio_pci_start_ioeventfd(VirtIOPCIProxy *proxy)
  181. {
  182. int n, r;
  183. if (!(proxy->flags & VIRTIO_PCI_FLAG_USE_IOEVENTFD) ||
  184. proxy->ioeventfd_disabled ||
  185. proxy->ioeventfd_started) {
  186. return;
  187. }
  188. for (n = 0; n < VIRTIO_PCI_QUEUE_MAX; n++) {
  189. if (!virtio_queue_get_num(proxy->vdev, n)) {
  190. continue;
  191. }
  192. r = virtio_pci_set_host_notifier_internal(proxy, n, true);
  193. if (r < 0) {
  194. goto assign_error;
  195. }
  196. virtio_pci_set_host_notifier_fd_handler(proxy, n, true);
  197. }
  198. proxy->ioeventfd_started = true;
  199. return;
  200. assign_error:
  201. while (--n >= 0) {
  202. if (!virtio_queue_get_num(proxy->vdev, n)) {
  203. continue;
  204. }
  205. virtio_pci_set_host_notifier_fd_handler(proxy, n, false);
  206. r = virtio_pci_set_host_notifier_internal(proxy, n, false);
  207. assert(r >= 0);
  208. }
  209. proxy->ioeventfd_started = false;
  210. error_report("%s: failed. Fallback to a userspace (slower).", __func__);
  211. }
  212. static void virtio_pci_stop_ioeventfd(VirtIOPCIProxy *proxy)
  213. {
  214. int r;
  215. int n;
  216. if (!proxy->ioeventfd_started) {
  217. return;
  218. }
  219. for (n = 0; n < VIRTIO_PCI_QUEUE_MAX; n++) {
  220. if (!virtio_queue_get_num(proxy->vdev, n)) {
  221. continue;
  222. }
  223. virtio_pci_set_host_notifier_fd_handler(proxy, n, false);
  224. r = virtio_pci_set_host_notifier_internal(proxy, n, false);
  225. assert(r >= 0);
  226. }
  227. proxy->ioeventfd_started = false;
  228. }
  229. void virtio_pci_reset(DeviceState *d)
  230. {
  231. VirtIOPCIProxy *proxy = container_of(d, VirtIOPCIProxy, pci_dev.qdev);
  232. virtio_pci_stop_ioeventfd(proxy);
  233. virtio_reset(proxy->vdev);
  234. msix_reset(&proxy->pci_dev);
  235. proxy->flags &= ~VIRTIO_PCI_FLAG_BUS_MASTER_BUG;
  236. }
  237. static void virtio_ioport_write(void *opaque, uint32_t addr, uint32_t val)
  238. {
  239. VirtIOPCIProxy *proxy = opaque;
  240. VirtIODevice *vdev = proxy->vdev;
  241. target_phys_addr_t pa;
  242. switch (addr) {
  243. case VIRTIO_PCI_GUEST_FEATURES:
  244. /* Guest does not negotiate properly? We have to assume nothing. */
  245. if (val & (1 << VIRTIO_F_BAD_FEATURE)) {
  246. val = vdev->bad_features ? vdev->bad_features(vdev) : 0;
  247. }
  248. virtio_set_features(vdev, val);
  249. break;
  250. case VIRTIO_PCI_QUEUE_PFN:
  251. pa = (target_phys_addr_t)val << VIRTIO_PCI_QUEUE_ADDR_SHIFT;
  252. if (pa == 0) {
  253. virtio_pci_stop_ioeventfd(proxy);
  254. virtio_reset(proxy->vdev);
  255. msix_unuse_all_vectors(&proxy->pci_dev);
  256. }
  257. else
  258. virtio_queue_set_addr(vdev, vdev->queue_sel, pa);
  259. break;
  260. case VIRTIO_PCI_QUEUE_SEL:
  261. if (val < VIRTIO_PCI_QUEUE_MAX)
  262. vdev->queue_sel = val;
  263. break;
  264. case VIRTIO_PCI_QUEUE_NOTIFY:
  265. if (val < VIRTIO_PCI_QUEUE_MAX) {
  266. virtio_queue_notify(vdev, val);
  267. }
  268. break;
  269. case VIRTIO_PCI_STATUS:
  270. if (!(val & VIRTIO_CONFIG_S_DRIVER_OK)) {
  271. virtio_pci_stop_ioeventfd(proxy);
  272. }
  273. virtio_set_status(vdev, val & 0xFF);
  274. if (val & VIRTIO_CONFIG_S_DRIVER_OK) {
  275. virtio_pci_start_ioeventfd(proxy);
  276. }
  277. if (vdev->status == 0) {
  278. virtio_reset(proxy->vdev);
  279. msix_unuse_all_vectors(&proxy->pci_dev);
  280. }
  281. /* Linux before 2.6.34 sets the device as OK without enabling
  282. the PCI device bus master bit. In this case we need to disable
  283. some safety checks. */
  284. if ((val & VIRTIO_CONFIG_S_DRIVER_OK) &&
  285. !(proxy->pci_dev.config[PCI_COMMAND] & PCI_COMMAND_MASTER)) {
  286. proxy->flags |= VIRTIO_PCI_FLAG_BUS_MASTER_BUG;
  287. }
  288. break;
  289. case VIRTIO_MSI_CONFIG_VECTOR:
  290. msix_vector_unuse(&proxy->pci_dev, vdev->config_vector);
  291. /* Make it possible for guest to discover an error took place. */
  292. if (msix_vector_use(&proxy->pci_dev, val) < 0)
  293. val = VIRTIO_NO_VECTOR;
  294. vdev->config_vector = val;
  295. break;
  296. case VIRTIO_MSI_QUEUE_VECTOR:
  297. msix_vector_unuse(&proxy->pci_dev,
  298. virtio_queue_vector(vdev, vdev->queue_sel));
  299. /* Make it possible for guest to discover an error took place. */
  300. if (msix_vector_use(&proxy->pci_dev, val) < 0)
  301. val = VIRTIO_NO_VECTOR;
  302. virtio_queue_set_vector(vdev, vdev->queue_sel, val);
  303. break;
  304. default:
  305. error_report("%s: unexpected address 0x%x value 0x%x",
  306. __func__, addr, val);
  307. break;
  308. }
  309. }
  310. static uint32_t virtio_ioport_read(VirtIOPCIProxy *proxy, uint32_t addr)
  311. {
  312. VirtIODevice *vdev = proxy->vdev;
  313. uint32_t ret = 0xFFFFFFFF;
  314. switch (addr) {
  315. case VIRTIO_PCI_HOST_FEATURES:
  316. ret = proxy->host_features;
  317. break;
  318. case VIRTIO_PCI_GUEST_FEATURES:
  319. ret = vdev->guest_features;
  320. break;
  321. case VIRTIO_PCI_QUEUE_PFN:
  322. ret = virtio_queue_get_addr(vdev, vdev->queue_sel)
  323. >> VIRTIO_PCI_QUEUE_ADDR_SHIFT;
  324. break;
  325. case VIRTIO_PCI_QUEUE_NUM:
  326. ret = virtio_queue_get_num(vdev, vdev->queue_sel);
  327. break;
  328. case VIRTIO_PCI_QUEUE_SEL:
  329. ret = vdev->queue_sel;
  330. break;
  331. case VIRTIO_PCI_STATUS:
  332. ret = vdev->status;
  333. break;
  334. case VIRTIO_PCI_ISR:
  335. /* reading from the ISR also clears it. */
  336. ret = vdev->isr;
  337. vdev->isr = 0;
  338. qemu_set_irq(proxy->pci_dev.irq[0], 0);
  339. break;
  340. case VIRTIO_MSI_CONFIG_VECTOR:
  341. ret = vdev->config_vector;
  342. break;
  343. case VIRTIO_MSI_QUEUE_VECTOR:
  344. ret = virtio_queue_vector(vdev, vdev->queue_sel);
  345. break;
  346. default:
  347. break;
  348. }
  349. return ret;
  350. }
  351. static uint32_t virtio_pci_config_readb(void *opaque, uint32_t addr)
  352. {
  353. VirtIOPCIProxy *proxy = opaque;
  354. uint32_t config = VIRTIO_PCI_CONFIG(&proxy->pci_dev);
  355. if (addr < config)
  356. return virtio_ioport_read(proxy, addr);
  357. addr -= config;
  358. return virtio_config_readb(proxy->vdev, addr);
  359. }
  360. static uint32_t virtio_pci_config_readw(void *opaque, uint32_t addr)
  361. {
  362. VirtIOPCIProxy *proxy = opaque;
  363. uint32_t config = VIRTIO_PCI_CONFIG(&proxy->pci_dev);
  364. if (addr < config)
  365. return virtio_ioport_read(proxy, addr);
  366. addr -= config;
  367. return virtio_config_readw(proxy->vdev, addr);
  368. }
  369. static uint32_t virtio_pci_config_readl(void *opaque, uint32_t addr)
  370. {
  371. VirtIOPCIProxy *proxy = opaque;
  372. uint32_t config = VIRTIO_PCI_CONFIG(&proxy->pci_dev);
  373. if (addr < config)
  374. return virtio_ioport_read(proxy, addr);
  375. addr -= config;
  376. return virtio_config_readl(proxy->vdev, addr);
  377. }
  378. static void virtio_pci_config_writeb(void *opaque, uint32_t addr, uint32_t val)
  379. {
  380. VirtIOPCIProxy *proxy = opaque;
  381. uint32_t config = VIRTIO_PCI_CONFIG(&proxy->pci_dev);
  382. if (addr < config) {
  383. virtio_ioport_write(proxy, addr, val);
  384. return;
  385. }
  386. addr -= config;
  387. virtio_config_writeb(proxy->vdev, addr, val);
  388. }
  389. static void virtio_pci_config_writew(void *opaque, uint32_t addr, uint32_t val)
  390. {
  391. VirtIOPCIProxy *proxy = opaque;
  392. uint32_t config = VIRTIO_PCI_CONFIG(&proxy->pci_dev);
  393. if (addr < config) {
  394. virtio_ioport_write(proxy, addr, val);
  395. return;
  396. }
  397. addr -= config;
  398. virtio_config_writew(proxy->vdev, addr, val);
  399. }
  400. static void virtio_pci_config_writel(void *opaque, uint32_t addr, uint32_t val)
  401. {
  402. VirtIOPCIProxy *proxy = opaque;
  403. uint32_t config = VIRTIO_PCI_CONFIG(&proxy->pci_dev);
  404. if (addr < config) {
  405. virtio_ioport_write(proxy, addr, val);
  406. return;
  407. }
  408. addr -= config;
  409. virtio_config_writel(proxy->vdev, addr, val);
  410. }
  411. const MemoryRegionPortio virtio_portio[] = {
  412. { 0, 0x10000, 1, .write = virtio_pci_config_writeb, },
  413. { 0, 0x10000, 2, .write = virtio_pci_config_writew, },
  414. { 0, 0x10000, 4, .write = virtio_pci_config_writel, },
  415. { 0, 0x10000, 1, .read = virtio_pci_config_readb, },
  416. { 0, 0x10000, 2, .read = virtio_pci_config_readw, },
  417. { 0, 0x10000, 4, .read = virtio_pci_config_readl, },
  418. PORTIO_END_OF_LIST()
  419. };
  420. static const MemoryRegionOps virtio_pci_config_ops = {
  421. .old_portio = virtio_portio,
  422. .endianness = DEVICE_LITTLE_ENDIAN,
  423. };
  424. static void virtio_write_config(PCIDevice *pci_dev, uint32_t address,
  425. uint32_t val, int len)
  426. {
  427. VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
  428. pci_default_write_config(pci_dev, address, val, len);
  429. if (range_covers_byte(address, len, PCI_COMMAND) &&
  430. !(pci_dev->config[PCI_COMMAND] & PCI_COMMAND_MASTER) &&
  431. !(proxy->flags & VIRTIO_PCI_FLAG_BUS_MASTER_BUG)) {
  432. virtio_pci_stop_ioeventfd(proxy);
  433. virtio_set_status(proxy->vdev,
  434. proxy->vdev->status & ~VIRTIO_CONFIG_S_DRIVER_OK);
  435. }
  436. msix_write_config(pci_dev, address, val, len);
  437. }
  438. static unsigned virtio_pci_get_features(void *opaque)
  439. {
  440. VirtIOPCIProxy *proxy = opaque;
  441. return proxy->host_features;
  442. }
  443. static void virtio_pci_guest_notifier_read(void *opaque)
  444. {
  445. VirtQueue *vq = opaque;
  446. EventNotifier *n = virtio_queue_get_guest_notifier(vq);
  447. if (event_notifier_test_and_clear(n)) {
  448. virtio_irq(vq);
  449. }
  450. }
  451. static int virtio_pci_set_guest_notifier(void *opaque, int n, bool assign)
  452. {
  453. VirtIOPCIProxy *proxy = opaque;
  454. VirtQueue *vq = virtio_get_queue(proxy->vdev, n);
  455. EventNotifier *notifier = virtio_queue_get_guest_notifier(vq);
  456. if (assign) {
  457. int r = event_notifier_init(notifier, 0);
  458. if (r < 0) {
  459. return r;
  460. }
  461. qemu_set_fd_handler(event_notifier_get_fd(notifier),
  462. virtio_pci_guest_notifier_read, NULL, vq);
  463. } else {
  464. qemu_set_fd_handler(event_notifier_get_fd(notifier),
  465. NULL, NULL, NULL);
  466. event_notifier_cleanup(notifier);
  467. }
  468. return 0;
  469. }
  470. static bool virtio_pci_query_guest_notifiers(void *opaque)
  471. {
  472. VirtIOPCIProxy *proxy = opaque;
  473. return msix_enabled(&proxy->pci_dev);
  474. }
  475. static int virtio_pci_set_guest_notifiers(void *opaque, bool assign)
  476. {
  477. VirtIOPCIProxy *proxy = opaque;
  478. VirtIODevice *vdev = proxy->vdev;
  479. int r, n;
  480. for (n = 0; n < VIRTIO_PCI_QUEUE_MAX; n++) {
  481. if (!virtio_queue_get_num(vdev, n)) {
  482. break;
  483. }
  484. r = virtio_pci_set_guest_notifier(opaque, n, assign);
  485. if (r < 0) {
  486. goto assign_error;
  487. }
  488. }
  489. return 0;
  490. assign_error:
  491. /* We get here on assignment failure. Recover by undoing for VQs 0 .. n. */
  492. while (--n >= 0) {
  493. virtio_pci_set_guest_notifier(opaque, n, !assign);
  494. }
  495. return r;
  496. }
  497. static int virtio_pci_set_host_notifier(void *opaque, int n, bool assign)
  498. {
  499. VirtIOPCIProxy *proxy = opaque;
  500. /* Stop using ioeventfd for virtqueue kick if the device starts using host
  501. * notifiers. This makes it easy to avoid stepping on each others' toes.
  502. */
  503. proxy->ioeventfd_disabled = assign;
  504. if (assign) {
  505. virtio_pci_stop_ioeventfd(proxy);
  506. }
  507. /* We don't need to start here: it's not needed because backend
  508. * currently only stops on status change away from ok,
  509. * reset, vmstop and such. If we do add code to start here,
  510. * need to check vmstate, device state etc. */
  511. return virtio_pci_set_host_notifier_internal(proxy, n, assign);
  512. }
  513. static void virtio_pci_vmstate_change(void *opaque, bool running)
  514. {
  515. VirtIOPCIProxy *proxy = opaque;
  516. if (running) {
  517. /* Try to find out if the guest has bus master disabled, but is
  518. in ready state. Then we have a buggy guest OS. */
  519. if ((proxy->vdev->status & VIRTIO_CONFIG_S_DRIVER_OK) &&
  520. !(proxy->pci_dev.config[PCI_COMMAND] & PCI_COMMAND_MASTER)) {
  521. proxy->flags |= VIRTIO_PCI_FLAG_BUS_MASTER_BUG;
  522. }
  523. virtio_pci_start_ioeventfd(proxy);
  524. } else {
  525. virtio_pci_stop_ioeventfd(proxy);
  526. }
  527. }
  528. static const VirtIOBindings virtio_pci_bindings = {
  529. .notify = virtio_pci_notify,
  530. .save_config = virtio_pci_save_config,
  531. .load_config = virtio_pci_load_config,
  532. .save_queue = virtio_pci_save_queue,
  533. .load_queue = virtio_pci_load_queue,
  534. .get_features = virtio_pci_get_features,
  535. .query_guest_notifiers = virtio_pci_query_guest_notifiers,
  536. .set_host_notifier = virtio_pci_set_host_notifier,
  537. .set_guest_notifiers = virtio_pci_set_guest_notifiers,
  538. .vmstate_change = virtio_pci_vmstate_change,
  539. };
  540. void virtio_init_pci(VirtIOPCIProxy *proxy, VirtIODevice *vdev)
  541. {
  542. uint8_t *config;
  543. uint32_t size;
  544. proxy->vdev = vdev;
  545. config = proxy->pci_dev.config;
  546. if (proxy->class_code) {
  547. pci_config_set_class(config, proxy->class_code);
  548. }
  549. pci_set_word(config + 0x2c, pci_get_word(config + PCI_VENDOR_ID));
  550. pci_set_word(config + 0x2e, vdev->device_id);
  551. config[0x3d] = 1;
  552. memory_region_init(&proxy->msix_bar, "virtio-msix", 4096);
  553. if (vdev->nvectors && !msix_init(&proxy->pci_dev, vdev->nvectors,
  554. &proxy->msix_bar, 1, 0)) {
  555. pci_register_bar(&proxy->pci_dev, 1, PCI_BASE_ADDRESS_SPACE_MEMORY,
  556. &proxy->msix_bar);
  557. } else
  558. vdev->nvectors = 0;
  559. proxy->pci_dev.config_write = virtio_write_config;
  560. size = VIRTIO_PCI_REGION_SIZE(&proxy->pci_dev) + vdev->config_len;
  561. if (size & (size-1))
  562. size = 1 << qemu_fls(size);
  563. memory_region_init_io(&proxy->bar, &virtio_pci_config_ops, proxy,
  564. "virtio-pci", size);
  565. pci_register_bar(&proxy->pci_dev, 0, PCI_BASE_ADDRESS_SPACE_IO,
  566. &proxy->bar);
  567. if (!kvm_has_many_ioeventfds()) {
  568. proxy->flags &= ~VIRTIO_PCI_FLAG_USE_IOEVENTFD;
  569. }
  570. virtio_bind_device(vdev, &virtio_pci_bindings, proxy);
  571. proxy->host_features |= 0x1 << VIRTIO_F_NOTIFY_ON_EMPTY;
  572. proxy->host_features |= 0x1 << VIRTIO_F_BAD_FEATURE;
  573. proxy->host_features = vdev->get_features(vdev, proxy->host_features);
  574. }
  575. static int virtio_blk_init_pci(PCIDevice *pci_dev)
  576. {
  577. VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
  578. VirtIODevice *vdev;
  579. if (proxy->class_code != PCI_CLASS_STORAGE_SCSI &&
  580. proxy->class_code != PCI_CLASS_STORAGE_OTHER)
  581. proxy->class_code = PCI_CLASS_STORAGE_SCSI;
  582. vdev = virtio_blk_init(&pci_dev->qdev, &proxy->block,
  583. &proxy->block_serial);
  584. if (!vdev) {
  585. return -1;
  586. }
  587. vdev->nvectors = proxy->nvectors;
  588. virtio_init_pci(proxy, vdev);
  589. /* make the actual value visible */
  590. proxy->nvectors = vdev->nvectors;
  591. return 0;
  592. }
  593. static int virtio_exit_pci(PCIDevice *pci_dev)
  594. {
  595. VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
  596. int r;
  597. memory_region_destroy(&proxy->bar);
  598. r = msix_uninit(pci_dev, &proxy->msix_bar);
  599. memory_region_destroy(&proxy->msix_bar);
  600. return r;
  601. }
  602. static int virtio_blk_exit_pci(PCIDevice *pci_dev)
  603. {
  604. VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
  605. virtio_pci_stop_ioeventfd(proxy);
  606. virtio_blk_exit(proxy->vdev);
  607. blockdev_mark_auto_del(proxy->block.bs);
  608. return virtio_exit_pci(pci_dev);
  609. }
  610. static int virtio_serial_init_pci(PCIDevice *pci_dev)
  611. {
  612. VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
  613. VirtIODevice *vdev;
  614. if (proxy->class_code != PCI_CLASS_COMMUNICATION_OTHER &&
  615. proxy->class_code != PCI_CLASS_DISPLAY_OTHER && /* qemu 0.10 */
  616. proxy->class_code != PCI_CLASS_OTHERS) /* qemu-kvm */
  617. proxy->class_code = PCI_CLASS_COMMUNICATION_OTHER;
  618. vdev = virtio_serial_init(&pci_dev->qdev, &proxy->serial);
  619. if (!vdev) {
  620. return -1;
  621. }
  622. vdev->nvectors = proxy->nvectors == DEV_NVECTORS_UNSPECIFIED
  623. ? proxy->serial.max_virtserial_ports + 1
  624. : proxy->nvectors;
  625. virtio_init_pci(proxy, vdev);
  626. proxy->nvectors = vdev->nvectors;
  627. return 0;
  628. }
  629. static int virtio_serial_exit_pci(PCIDevice *pci_dev)
  630. {
  631. VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
  632. virtio_pci_stop_ioeventfd(proxy);
  633. virtio_serial_exit(proxy->vdev);
  634. return virtio_exit_pci(pci_dev);
  635. }
  636. static int virtio_net_init_pci(PCIDevice *pci_dev)
  637. {
  638. VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
  639. VirtIODevice *vdev;
  640. vdev = virtio_net_init(&pci_dev->qdev, &proxy->nic, &proxy->net);
  641. vdev->nvectors = proxy->nvectors;
  642. virtio_init_pci(proxy, vdev);
  643. /* make the actual value visible */
  644. proxy->nvectors = vdev->nvectors;
  645. return 0;
  646. }
  647. static int virtio_net_exit_pci(PCIDevice *pci_dev)
  648. {
  649. VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
  650. virtio_pci_stop_ioeventfd(proxy);
  651. virtio_net_exit(proxy->vdev);
  652. return virtio_exit_pci(pci_dev);
  653. }
  654. static int virtio_balloon_init_pci(PCIDevice *pci_dev)
  655. {
  656. VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
  657. VirtIODevice *vdev;
  658. vdev = virtio_balloon_init(&pci_dev->qdev);
  659. if (!vdev) {
  660. return -1;
  661. }
  662. virtio_init_pci(proxy, vdev);
  663. return 0;
  664. }
  665. static int virtio_balloon_exit_pci(PCIDevice *pci_dev)
  666. {
  667. VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
  668. virtio_pci_stop_ioeventfd(proxy);
  669. virtio_balloon_exit(proxy->vdev);
  670. return virtio_exit_pci(pci_dev);
  671. }
  672. static PCIDeviceInfo virtio_info[] = {
  673. {
  674. .qdev.name = "virtio-blk-pci",
  675. .qdev.alias = "virtio-blk",
  676. .qdev.size = sizeof(VirtIOPCIProxy),
  677. .init = virtio_blk_init_pci,
  678. .exit = virtio_blk_exit_pci,
  679. .vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET,
  680. .device_id = PCI_DEVICE_ID_VIRTIO_BLOCK,
  681. .revision = VIRTIO_PCI_ABI_VERSION,
  682. .class_id = PCI_CLASS_STORAGE_SCSI,
  683. .qdev.props = (Property[]) {
  684. DEFINE_PROP_HEX32("class", VirtIOPCIProxy, class_code, 0),
  685. DEFINE_BLOCK_PROPERTIES(VirtIOPCIProxy, block),
  686. DEFINE_PROP_STRING("serial", VirtIOPCIProxy, block_serial),
  687. DEFINE_PROP_BIT("ioeventfd", VirtIOPCIProxy, flags,
  688. VIRTIO_PCI_FLAG_USE_IOEVENTFD_BIT, true),
  689. DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors, 2),
  690. DEFINE_VIRTIO_BLK_FEATURES(VirtIOPCIProxy, host_features),
  691. DEFINE_PROP_END_OF_LIST(),
  692. },
  693. .qdev.reset = virtio_pci_reset,
  694. },{
  695. .qdev.name = "virtio-net-pci",
  696. .qdev.alias = "virtio-net",
  697. .qdev.size = sizeof(VirtIOPCIProxy),
  698. .init = virtio_net_init_pci,
  699. .exit = virtio_net_exit_pci,
  700. .romfile = "pxe-virtio.rom",
  701. .vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET,
  702. .device_id = PCI_DEVICE_ID_VIRTIO_NET,
  703. .revision = VIRTIO_PCI_ABI_VERSION,
  704. .class_id = PCI_CLASS_NETWORK_ETHERNET,
  705. .qdev.props = (Property[]) {
  706. DEFINE_PROP_BIT("ioeventfd", VirtIOPCIProxy, flags,
  707. VIRTIO_PCI_FLAG_USE_IOEVENTFD_BIT, false),
  708. DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors, 3),
  709. DEFINE_VIRTIO_NET_FEATURES(VirtIOPCIProxy, host_features),
  710. DEFINE_NIC_PROPERTIES(VirtIOPCIProxy, nic),
  711. DEFINE_PROP_UINT32("x-txtimer", VirtIOPCIProxy,
  712. net.txtimer, TX_TIMER_INTERVAL),
  713. DEFINE_PROP_INT32("x-txburst", VirtIOPCIProxy,
  714. net.txburst, TX_BURST),
  715. DEFINE_PROP_STRING("tx", VirtIOPCIProxy, net.tx),
  716. DEFINE_PROP_END_OF_LIST(),
  717. },
  718. .qdev.reset = virtio_pci_reset,
  719. },{
  720. .qdev.name = "virtio-serial-pci",
  721. .qdev.alias = "virtio-serial",
  722. .qdev.size = sizeof(VirtIOPCIProxy),
  723. .init = virtio_serial_init_pci,
  724. .exit = virtio_serial_exit_pci,
  725. .vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET,
  726. .device_id = PCI_DEVICE_ID_VIRTIO_CONSOLE,
  727. .revision = VIRTIO_PCI_ABI_VERSION,
  728. .class_id = PCI_CLASS_COMMUNICATION_OTHER,
  729. .qdev.props = (Property[]) {
  730. DEFINE_PROP_BIT("ioeventfd", VirtIOPCIProxy, flags,
  731. VIRTIO_PCI_FLAG_USE_IOEVENTFD_BIT, true),
  732. DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors,
  733. DEV_NVECTORS_UNSPECIFIED),
  734. DEFINE_PROP_HEX32("class", VirtIOPCIProxy, class_code, 0),
  735. DEFINE_VIRTIO_COMMON_FEATURES(VirtIOPCIProxy, host_features),
  736. DEFINE_PROP_UINT32("max_ports", VirtIOPCIProxy,
  737. serial.max_virtserial_ports, 31),
  738. DEFINE_PROP_END_OF_LIST(),
  739. },
  740. .qdev.reset = virtio_pci_reset,
  741. },{
  742. .qdev.name = "virtio-balloon-pci",
  743. .qdev.alias = "virtio-balloon",
  744. .qdev.size = sizeof(VirtIOPCIProxy),
  745. .init = virtio_balloon_init_pci,
  746. .exit = virtio_balloon_exit_pci,
  747. .vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET,
  748. .device_id = PCI_DEVICE_ID_VIRTIO_BALLOON,
  749. .revision = VIRTIO_PCI_ABI_VERSION,
  750. .class_id = PCI_CLASS_MEMORY_RAM,
  751. .qdev.props = (Property[]) {
  752. DEFINE_VIRTIO_COMMON_FEATURES(VirtIOPCIProxy, host_features),
  753. DEFINE_PROP_END_OF_LIST(),
  754. },
  755. .qdev.reset = virtio_pci_reset,
  756. },{
  757. /* end of list */
  758. }
  759. };
  760. static void virtio_pci_register_devices(void)
  761. {
  762. pci_qdev_register_many(virtio_info);
  763. }
  764. device_init(virtio_pci_register_devices)