virtio-pci.c 33 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079
  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. * Contributions after 2012-01-13 are licensed under the terms of the
  15. * GNU GPL, version 2 or (at your option) any later version.
  16. */
  17. #include <inttypes.h>
  18. #include "virtio.h"
  19. #include "virtio-blk.h"
  20. #include "virtio-net.h"
  21. #include "virtio-serial.h"
  22. #include "virtio-scsi.h"
  23. #include "pci.h"
  24. #include "qemu-error.h"
  25. #include "msi.h"
  26. #include "msix.h"
  27. #include "net.h"
  28. #include "loader.h"
  29. #include "kvm.h"
  30. #include "blockdev.h"
  31. #include "virtio-pci.h"
  32. #include "range.h"
  33. /* from Linux's linux/virtio_pci.h */
  34. /* A 32-bit r/o bitmask of the features supported by the host */
  35. #define VIRTIO_PCI_HOST_FEATURES 0
  36. /* A 32-bit r/w bitmask of features activated by the guest */
  37. #define VIRTIO_PCI_GUEST_FEATURES 4
  38. /* A 32-bit r/w PFN for the currently selected queue */
  39. #define VIRTIO_PCI_QUEUE_PFN 8
  40. /* A 16-bit r/o queue size for the currently selected queue */
  41. #define VIRTIO_PCI_QUEUE_NUM 12
  42. /* A 16-bit r/w queue selector */
  43. #define VIRTIO_PCI_QUEUE_SEL 14
  44. /* A 16-bit r/w queue notifier */
  45. #define VIRTIO_PCI_QUEUE_NOTIFY 16
  46. /* An 8-bit device status register. */
  47. #define VIRTIO_PCI_STATUS 18
  48. /* An 8-bit r/o interrupt status register. Reading the value will return the
  49. * current contents of the ISR and will also clear it. This is effectively
  50. * a read-and-acknowledge. */
  51. #define VIRTIO_PCI_ISR 19
  52. /* MSI-X registers: only enabled if MSI-X is enabled. */
  53. /* A 16-bit vector for configuration changes. */
  54. #define VIRTIO_MSI_CONFIG_VECTOR 20
  55. /* A 16-bit vector for selected queue notifications. */
  56. #define VIRTIO_MSI_QUEUE_VECTOR 22
  57. /* Config space size */
  58. #define VIRTIO_PCI_CONFIG_NOMSI 20
  59. #define VIRTIO_PCI_CONFIG_MSI 24
  60. #define VIRTIO_PCI_REGION_SIZE(dev) (msix_present(dev) ? \
  61. VIRTIO_PCI_CONFIG_MSI : \
  62. VIRTIO_PCI_CONFIG_NOMSI)
  63. /* The remaining space is defined by each driver as the per-driver
  64. * configuration space */
  65. #define VIRTIO_PCI_CONFIG(dev) (msix_enabled(dev) ? \
  66. VIRTIO_PCI_CONFIG_MSI : \
  67. VIRTIO_PCI_CONFIG_NOMSI)
  68. /* How many bits to shift physical queue address written to QUEUE_PFN.
  69. * 12 is historical, and due to x86 page size. */
  70. #define VIRTIO_PCI_QUEUE_ADDR_SHIFT 12
  71. /* Flags track per-device state like workarounds for quirks in older guests. */
  72. #define VIRTIO_PCI_FLAG_BUS_MASTER_BUG (1 << 0)
  73. /* QEMU doesn't strictly need write barriers since everything runs in
  74. * lock-step. We'll leave the calls to wmb() in though to make it obvious for
  75. * KVM or if kqemu gets SMP support.
  76. */
  77. #define wmb() do { } while (0)
  78. /* HACK for virtio to determine if it's running a big endian guest */
  79. bool virtio_is_big_endian(void);
  80. /* virtio device */
  81. static void virtio_pci_notify(void *opaque, uint16_t vector)
  82. {
  83. VirtIOPCIProxy *proxy = opaque;
  84. if (msix_enabled(&proxy->pci_dev))
  85. msix_notify(&proxy->pci_dev, vector);
  86. else
  87. qemu_set_irq(proxy->pci_dev.irq[0], proxy->vdev->isr & 1);
  88. }
  89. static void virtio_pci_save_config(void * opaque, QEMUFile *f)
  90. {
  91. VirtIOPCIProxy *proxy = opaque;
  92. pci_device_save(&proxy->pci_dev, f);
  93. msix_save(&proxy->pci_dev, f);
  94. if (msix_present(&proxy->pci_dev))
  95. qemu_put_be16(f, proxy->vdev->config_vector);
  96. }
  97. static void virtio_pci_save_queue(void * opaque, int n, QEMUFile *f)
  98. {
  99. VirtIOPCIProxy *proxy = opaque;
  100. if (msix_present(&proxy->pci_dev))
  101. qemu_put_be16(f, virtio_queue_vector(proxy->vdev, n));
  102. }
  103. static int virtio_pci_load_config(void * opaque, QEMUFile *f)
  104. {
  105. VirtIOPCIProxy *proxy = opaque;
  106. int ret;
  107. ret = pci_device_load(&proxy->pci_dev, f);
  108. if (ret) {
  109. return ret;
  110. }
  111. msix_unuse_all_vectors(&proxy->pci_dev);
  112. msix_load(&proxy->pci_dev, f);
  113. if (msix_present(&proxy->pci_dev)) {
  114. qemu_get_be16s(f, &proxy->vdev->config_vector);
  115. } else {
  116. proxy->vdev->config_vector = VIRTIO_NO_VECTOR;
  117. }
  118. if (proxy->vdev->config_vector != VIRTIO_NO_VECTOR) {
  119. return msix_vector_use(&proxy->pci_dev, proxy->vdev->config_vector);
  120. }
  121. return 0;
  122. }
  123. static int virtio_pci_load_queue(void * opaque, int n, QEMUFile *f)
  124. {
  125. VirtIOPCIProxy *proxy = opaque;
  126. uint16_t vector;
  127. if (msix_present(&proxy->pci_dev)) {
  128. qemu_get_be16s(f, &vector);
  129. } else {
  130. vector = VIRTIO_NO_VECTOR;
  131. }
  132. virtio_queue_set_vector(proxy->vdev, n, vector);
  133. if (vector != VIRTIO_NO_VECTOR) {
  134. return msix_vector_use(&proxy->pci_dev, vector);
  135. }
  136. return 0;
  137. }
  138. static int virtio_pci_set_host_notifier_internal(VirtIOPCIProxy *proxy,
  139. int n, bool assign, bool set_handler)
  140. {
  141. VirtQueue *vq = virtio_get_queue(proxy->vdev, n);
  142. EventNotifier *notifier = virtio_queue_get_host_notifier(vq);
  143. int r = 0;
  144. if (assign) {
  145. r = event_notifier_init(notifier, 1);
  146. if (r < 0) {
  147. error_report("%s: unable to init event notifier: %d",
  148. __func__, r);
  149. return r;
  150. }
  151. virtio_queue_set_host_notifier_fd_handler(vq, true, set_handler);
  152. memory_region_add_eventfd(&proxy->bar, VIRTIO_PCI_QUEUE_NOTIFY, 2,
  153. true, n, notifier);
  154. } else {
  155. memory_region_del_eventfd(&proxy->bar, VIRTIO_PCI_QUEUE_NOTIFY, 2,
  156. true, n, notifier);
  157. virtio_queue_set_host_notifier_fd_handler(vq, false, false);
  158. event_notifier_cleanup(notifier);
  159. }
  160. return r;
  161. }
  162. static void virtio_pci_start_ioeventfd(VirtIOPCIProxy *proxy)
  163. {
  164. int n, r;
  165. if (!(proxy->flags & VIRTIO_PCI_FLAG_USE_IOEVENTFD) ||
  166. proxy->ioeventfd_disabled ||
  167. proxy->ioeventfd_started) {
  168. return;
  169. }
  170. for (n = 0; n < VIRTIO_PCI_QUEUE_MAX; n++) {
  171. if (!virtio_queue_get_num(proxy->vdev, n)) {
  172. continue;
  173. }
  174. r = virtio_pci_set_host_notifier_internal(proxy, n, true, true);
  175. if (r < 0) {
  176. goto assign_error;
  177. }
  178. }
  179. proxy->ioeventfd_started = true;
  180. return;
  181. assign_error:
  182. while (--n >= 0) {
  183. if (!virtio_queue_get_num(proxy->vdev, n)) {
  184. continue;
  185. }
  186. r = virtio_pci_set_host_notifier_internal(proxy, n, false, false);
  187. assert(r >= 0);
  188. }
  189. proxy->ioeventfd_started = false;
  190. error_report("%s: failed. Fallback to a userspace (slower).", __func__);
  191. }
  192. static void virtio_pci_stop_ioeventfd(VirtIOPCIProxy *proxy)
  193. {
  194. int r;
  195. int n;
  196. if (!proxy->ioeventfd_started) {
  197. return;
  198. }
  199. for (n = 0; n < VIRTIO_PCI_QUEUE_MAX; n++) {
  200. if (!virtio_queue_get_num(proxy->vdev, n)) {
  201. continue;
  202. }
  203. r = virtio_pci_set_host_notifier_internal(proxy, n, false, false);
  204. assert(r >= 0);
  205. }
  206. proxy->ioeventfd_started = false;
  207. }
  208. void virtio_pci_reset(DeviceState *d)
  209. {
  210. VirtIOPCIProxy *proxy = container_of(d, VirtIOPCIProxy, pci_dev.qdev);
  211. virtio_pci_stop_ioeventfd(proxy);
  212. virtio_reset(proxy->vdev);
  213. msix_unuse_all_vectors(&proxy->pci_dev);
  214. proxy->flags &= ~VIRTIO_PCI_FLAG_BUS_MASTER_BUG;
  215. }
  216. static void virtio_ioport_write(void *opaque, uint32_t addr, uint32_t val)
  217. {
  218. VirtIOPCIProxy *proxy = opaque;
  219. VirtIODevice *vdev = proxy->vdev;
  220. target_phys_addr_t pa;
  221. switch (addr) {
  222. case VIRTIO_PCI_GUEST_FEATURES:
  223. /* Guest does not negotiate properly? We have to assume nothing. */
  224. if (val & (1 << VIRTIO_F_BAD_FEATURE)) {
  225. val = vdev->bad_features ? vdev->bad_features(vdev) : 0;
  226. }
  227. virtio_set_features(vdev, val);
  228. break;
  229. case VIRTIO_PCI_QUEUE_PFN:
  230. pa = (target_phys_addr_t)val << VIRTIO_PCI_QUEUE_ADDR_SHIFT;
  231. if (pa == 0) {
  232. virtio_pci_stop_ioeventfd(proxy);
  233. virtio_reset(proxy->vdev);
  234. msix_unuse_all_vectors(&proxy->pci_dev);
  235. }
  236. else
  237. virtio_queue_set_addr(vdev, vdev->queue_sel, pa);
  238. break;
  239. case VIRTIO_PCI_QUEUE_SEL:
  240. if (val < VIRTIO_PCI_QUEUE_MAX)
  241. vdev->queue_sel = val;
  242. break;
  243. case VIRTIO_PCI_QUEUE_NOTIFY:
  244. if (val < VIRTIO_PCI_QUEUE_MAX) {
  245. virtio_queue_notify(vdev, val);
  246. }
  247. break;
  248. case VIRTIO_PCI_STATUS:
  249. if (!(val & VIRTIO_CONFIG_S_DRIVER_OK)) {
  250. virtio_pci_stop_ioeventfd(proxy);
  251. }
  252. virtio_set_status(vdev, val & 0xFF);
  253. if (val & VIRTIO_CONFIG_S_DRIVER_OK) {
  254. virtio_pci_start_ioeventfd(proxy);
  255. }
  256. if (vdev->status == 0) {
  257. virtio_reset(proxy->vdev);
  258. msix_unuse_all_vectors(&proxy->pci_dev);
  259. }
  260. /* Linux before 2.6.34 sets the device as OK without enabling
  261. the PCI device bus master bit. In this case we need to disable
  262. some safety checks. */
  263. if ((val & VIRTIO_CONFIG_S_DRIVER_OK) &&
  264. !(proxy->pci_dev.config[PCI_COMMAND] & PCI_COMMAND_MASTER)) {
  265. proxy->flags |= VIRTIO_PCI_FLAG_BUS_MASTER_BUG;
  266. }
  267. break;
  268. case VIRTIO_MSI_CONFIG_VECTOR:
  269. msix_vector_unuse(&proxy->pci_dev, vdev->config_vector);
  270. /* Make it possible for guest to discover an error took place. */
  271. if (msix_vector_use(&proxy->pci_dev, val) < 0)
  272. val = VIRTIO_NO_VECTOR;
  273. vdev->config_vector = val;
  274. break;
  275. case VIRTIO_MSI_QUEUE_VECTOR:
  276. msix_vector_unuse(&proxy->pci_dev,
  277. virtio_queue_vector(vdev, vdev->queue_sel));
  278. /* Make it possible for guest to discover an error took place. */
  279. if (msix_vector_use(&proxy->pci_dev, val) < 0)
  280. val = VIRTIO_NO_VECTOR;
  281. virtio_queue_set_vector(vdev, vdev->queue_sel, val);
  282. break;
  283. default:
  284. error_report("%s: unexpected address 0x%x value 0x%x",
  285. __func__, addr, val);
  286. break;
  287. }
  288. }
  289. static uint32_t virtio_ioport_read(VirtIOPCIProxy *proxy, uint32_t addr)
  290. {
  291. VirtIODevice *vdev = proxy->vdev;
  292. uint32_t ret = 0xFFFFFFFF;
  293. switch (addr) {
  294. case VIRTIO_PCI_HOST_FEATURES:
  295. ret = proxy->host_features;
  296. break;
  297. case VIRTIO_PCI_GUEST_FEATURES:
  298. ret = vdev->guest_features;
  299. break;
  300. case VIRTIO_PCI_QUEUE_PFN:
  301. ret = virtio_queue_get_addr(vdev, vdev->queue_sel)
  302. >> VIRTIO_PCI_QUEUE_ADDR_SHIFT;
  303. break;
  304. case VIRTIO_PCI_QUEUE_NUM:
  305. ret = virtio_queue_get_num(vdev, vdev->queue_sel);
  306. break;
  307. case VIRTIO_PCI_QUEUE_SEL:
  308. ret = vdev->queue_sel;
  309. break;
  310. case VIRTIO_PCI_STATUS:
  311. ret = vdev->status;
  312. break;
  313. case VIRTIO_PCI_ISR:
  314. /* reading from the ISR also clears it. */
  315. ret = vdev->isr;
  316. vdev->isr = 0;
  317. qemu_set_irq(proxy->pci_dev.irq[0], 0);
  318. break;
  319. case VIRTIO_MSI_CONFIG_VECTOR:
  320. ret = vdev->config_vector;
  321. break;
  322. case VIRTIO_MSI_QUEUE_VECTOR:
  323. ret = virtio_queue_vector(vdev, vdev->queue_sel);
  324. break;
  325. default:
  326. break;
  327. }
  328. return ret;
  329. }
  330. static uint32_t virtio_pci_config_readb(void *opaque, uint32_t addr)
  331. {
  332. VirtIOPCIProxy *proxy = opaque;
  333. uint32_t config = VIRTIO_PCI_CONFIG(&proxy->pci_dev);
  334. if (addr < config)
  335. return virtio_ioport_read(proxy, addr);
  336. addr -= config;
  337. return virtio_config_readb(proxy->vdev, addr);
  338. }
  339. static uint32_t virtio_pci_config_readw(void *opaque, uint32_t addr)
  340. {
  341. VirtIOPCIProxy *proxy = opaque;
  342. uint32_t config = VIRTIO_PCI_CONFIG(&proxy->pci_dev);
  343. uint16_t val;
  344. if (addr < config)
  345. return virtio_ioport_read(proxy, addr);
  346. addr -= config;
  347. val = virtio_config_readw(proxy->vdev, addr);
  348. if (virtio_is_big_endian()) {
  349. /*
  350. * virtio is odd, ioports are LE but config space is target native
  351. * endian. However, in qemu, all PIO is LE, so we need to re-swap
  352. * on BE targets
  353. */
  354. val = bswap16(val);
  355. }
  356. return val;
  357. }
  358. static uint32_t virtio_pci_config_readl(void *opaque, uint32_t addr)
  359. {
  360. VirtIOPCIProxy *proxy = opaque;
  361. uint32_t config = VIRTIO_PCI_CONFIG(&proxy->pci_dev);
  362. uint32_t val;
  363. if (addr < config)
  364. return virtio_ioport_read(proxy, addr);
  365. addr -= config;
  366. val = virtio_config_readl(proxy->vdev, addr);
  367. if (virtio_is_big_endian()) {
  368. val = bswap32(val);
  369. }
  370. return val;
  371. }
  372. static void virtio_pci_config_writeb(void *opaque, uint32_t addr, uint32_t val)
  373. {
  374. VirtIOPCIProxy *proxy = opaque;
  375. uint32_t config = VIRTIO_PCI_CONFIG(&proxy->pci_dev);
  376. if (addr < config) {
  377. virtio_ioport_write(proxy, addr, val);
  378. return;
  379. }
  380. addr -= config;
  381. virtio_config_writeb(proxy->vdev, addr, val);
  382. }
  383. static void virtio_pci_config_writew(void *opaque, uint32_t addr, uint32_t val)
  384. {
  385. VirtIOPCIProxy *proxy = opaque;
  386. uint32_t config = VIRTIO_PCI_CONFIG(&proxy->pci_dev);
  387. if (addr < config) {
  388. virtio_ioport_write(proxy, addr, val);
  389. return;
  390. }
  391. addr -= config;
  392. if (virtio_is_big_endian()) {
  393. val = bswap16(val);
  394. }
  395. virtio_config_writew(proxy->vdev, addr, val);
  396. }
  397. static void virtio_pci_config_writel(void *opaque, uint32_t addr, uint32_t val)
  398. {
  399. VirtIOPCIProxy *proxy = opaque;
  400. uint32_t config = VIRTIO_PCI_CONFIG(&proxy->pci_dev);
  401. if (addr < config) {
  402. virtio_ioport_write(proxy, addr, val);
  403. return;
  404. }
  405. addr -= config;
  406. if (virtio_is_big_endian()) {
  407. val = bswap32(val);
  408. }
  409. virtio_config_writel(proxy->vdev, addr, val);
  410. }
  411. static 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. }
  437. static unsigned virtio_pci_get_features(void *opaque)
  438. {
  439. VirtIOPCIProxy *proxy = opaque;
  440. return proxy->host_features;
  441. }
  442. static int kvm_virtio_pci_vq_vector_use(VirtIOPCIProxy *proxy,
  443. unsigned int queue_no,
  444. unsigned int vector,
  445. MSIMessage msg)
  446. {
  447. VirtQueue *vq = virtio_get_queue(proxy->vdev, queue_no);
  448. EventNotifier *n = virtio_queue_get_guest_notifier(vq);
  449. VirtIOIRQFD *irqfd = &proxy->vector_irqfd[vector];
  450. int ret;
  451. if (irqfd->users == 0) {
  452. ret = kvm_irqchip_add_msi_route(kvm_state, msg);
  453. if (ret < 0) {
  454. return ret;
  455. }
  456. irqfd->virq = ret;
  457. }
  458. irqfd->users++;
  459. ret = kvm_irqchip_add_irq_notifier(kvm_state, n, irqfd->virq);
  460. if (ret < 0) {
  461. if (--irqfd->users == 0) {
  462. kvm_irqchip_release_virq(kvm_state, irqfd->virq);
  463. }
  464. return ret;
  465. }
  466. virtio_queue_set_guest_notifier_fd_handler(vq, true, true);
  467. return 0;
  468. }
  469. static void kvm_virtio_pci_vq_vector_release(VirtIOPCIProxy *proxy,
  470. unsigned int queue_no,
  471. unsigned int vector)
  472. {
  473. VirtQueue *vq = virtio_get_queue(proxy->vdev, queue_no);
  474. EventNotifier *n = virtio_queue_get_guest_notifier(vq);
  475. VirtIOIRQFD *irqfd = &proxy->vector_irqfd[vector];
  476. int ret;
  477. ret = kvm_irqchip_remove_irq_notifier(kvm_state, n, irqfd->virq);
  478. assert(ret == 0);
  479. if (--irqfd->users == 0) {
  480. kvm_irqchip_release_virq(kvm_state, irqfd->virq);
  481. }
  482. virtio_queue_set_guest_notifier_fd_handler(vq, true, false);
  483. }
  484. static int kvm_virtio_pci_vector_use(PCIDevice *dev, unsigned vector,
  485. MSIMessage msg)
  486. {
  487. VirtIOPCIProxy *proxy = container_of(dev, VirtIOPCIProxy, pci_dev);
  488. VirtIODevice *vdev = proxy->vdev;
  489. int ret, queue_no;
  490. for (queue_no = 0; queue_no < VIRTIO_PCI_QUEUE_MAX; queue_no++) {
  491. if (!virtio_queue_get_num(vdev, queue_no)) {
  492. break;
  493. }
  494. if (virtio_queue_vector(vdev, queue_no) != vector) {
  495. continue;
  496. }
  497. ret = kvm_virtio_pci_vq_vector_use(proxy, queue_no, vector, msg);
  498. if (ret < 0) {
  499. goto undo;
  500. }
  501. }
  502. return 0;
  503. undo:
  504. while (--queue_no >= 0) {
  505. if (virtio_queue_vector(vdev, queue_no) != vector) {
  506. continue;
  507. }
  508. kvm_virtio_pci_vq_vector_release(proxy, queue_no, vector);
  509. }
  510. return ret;
  511. }
  512. static void kvm_virtio_pci_vector_release(PCIDevice *dev, unsigned vector)
  513. {
  514. VirtIOPCIProxy *proxy = container_of(dev, VirtIOPCIProxy, pci_dev);
  515. VirtIODevice *vdev = proxy->vdev;
  516. int queue_no;
  517. for (queue_no = 0; queue_no < VIRTIO_PCI_QUEUE_MAX; queue_no++) {
  518. if (!virtio_queue_get_num(vdev, queue_no)) {
  519. break;
  520. }
  521. if (virtio_queue_vector(vdev, queue_no) != vector) {
  522. continue;
  523. }
  524. kvm_virtio_pci_vq_vector_release(proxy, queue_no, vector);
  525. }
  526. }
  527. static int virtio_pci_set_guest_notifier(void *opaque, int n, bool assign)
  528. {
  529. VirtIOPCIProxy *proxy = opaque;
  530. VirtQueue *vq = virtio_get_queue(proxy->vdev, n);
  531. EventNotifier *notifier = virtio_queue_get_guest_notifier(vq);
  532. if (assign) {
  533. int r = event_notifier_init(notifier, 0);
  534. if (r < 0) {
  535. return r;
  536. }
  537. virtio_queue_set_guest_notifier_fd_handler(vq, true, false);
  538. } else {
  539. virtio_queue_set_guest_notifier_fd_handler(vq, false, false);
  540. event_notifier_cleanup(notifier);
  541. }
  542. return 0;
  543. }
  544. static bool virtio_pci_query_guest_notifiers(void *opaque)
  545. {
  546. VirtIOPCIProxy *proxy = opaque;
  547. return msix_enabled(&proxy->pci_dev);
  548. }
  549. static int virtio_pci_set_guest_notifiers(void *opaque, bool assign)
  550. {
  551. VirtIOPCIProxy *proxy = opaque;
  552. VirtIODevice *vdev = proxy->vdev;
  553. int r, n;
  554. /* Must unset vector notifier while guest notifier is still assigned */
  555. if (kvm_msi_via_irqfd_enabled() && !assign) {
  556. msix_unset_vector_notifiers(&proxy->pci_dev);
  557. g_free(proxy->vector_irqfd);
  558. proxy->vector_irqfd = NULL;
  559. }
  560. for (n = 0; n < VIRTIO_PCI_QUEUE_MAX; n++) {
  561. if (!virtio_queue_get_num(vdev, n)) {
  562. break;
  563. }
  564. r = virtio_pci_set_guest_notifier(opaque, n, assign);
  565. if (r < 0) {
  566. goto assign_error;
  567. }
  568. }
  569. /* Must set vector notifier after guest notifier has been assigned */
  570. if (kvm_msi_via_irqfd_enabled() && assign) {
  571. proxy->vector_irqfd =
  572. g_malloc0(sizeof(*proxy->vector_irqfd) *
  573. msix_nr_vectors_allocated(&proxy->pci_dev));
  574. r = msix_set_vector_notifiers(&proxy->pci_dev,
  575. kvm_virtio_pci_vector_use,
  576. kvm_virtio_pci_vector_release);
  577. if (r < 0) {
  578. goto assign_error;
  579. }
  580. }
  581. return 0;
  582. assign_error:
  583. /* We get here on assignment failure. Recover by undoing for VQs 0 .. n. */
  584. assert(assign);
  585. while (--n >= 0) {
  586. virtio_pci_set_guest_notifier(opaque, n, !assign);
  587. }
  588. return r;
  589. }
  590. static int virtio_pci_set_host_notifier(void *opaque, int n, bool assign)
  591. {
  592. VirtIOPCIProxy *proxy = opaque;
  593. /* Stop using ioeventfd for virtqueue kick if the device starts using host
  594. * notifiers. This makes it easy to avoid stepping on each others' toes.
  595. */
  596. proxy->ioeventfd_disabled = assign;
  597. if (assign) {
  598. virtio_pci_stop_ioeventfd(proxy);
  599. }
  600. /* We don't need to start here: it's not needed because backend
  601. * currently only stops on status change away from ok,
  602. * reset, vmstop and such. If we do add code to start here,
  603. * need to check vmstate, device state etc. */
  604. return virtio_pci_set_host_notifier_internal(proxy, n, assign, false);
  605. }
  606. static void virtio_pci_vmstate_change(void *opaque, bool running)
  607. {
  608. VirtIOPCIProxy *proxy = opaque;
  609. if (running) {
  610. /* Try to find out if the guest has bus master disabled, but is
  611. in ready state. Then we have a buggy guest OS. */
  612. if ((proxy->vdev->status & VIRTIO_CONFIG_S_DRIVER_OK) &&
  613. !(proxy->pci_dev.config[PCI_COMMAND] & PCI_COMMAND_MASTER)) {
  614. proxy->flags |= VIRTIO_PCI_FLAG_BUS_MASTER_BUG;
  615. }
  616. virtio_pci_start_ioeventfd(proxy);
  617. } else {
  618. virtio_pci_stop_ioeventfd(proxy);
  619. }
  620. }
  621. static const VirtIOBindings virtio_pci_bindings = {
  622. .notify = virtio_pci_notify,
  623. .save_config = virtio_pci_save_config,
  624. .load_config = virtio_pci_load_config,
  625. .save_queue = virtio_pci_save_queue,
  626. .load_queue = virtio_pci_load_queue,
  627. .get_features = virtio_pci_get_features,
  628. .query_guest_notifiers = virtio_pci_query_guest_notifiers,
  629. .set_host_notifier = virtio_pci_set_host_notifier,
  630. .set_guest_notifiers = virtio_pci_set_guest_notifiers,
  631. .vmstate_change = virtio_pci_vmstate_change,
  632. };
  633. void virtio_init_pci(VirtIOPCIProxy *proxy, VirtIODevice *vdev)
  634. {
  635. uint8_t *config;
  636. uint32_t size;
  637. proxy->vdev = vdev;
  638. config = proxy->pci_dev.config;
  639. if (proxy->class_code) {
  640. pci_config_set_class(config, proxy->class_code);
  641. }
  642. pci_set_word(config + PCI_SUBSYSTEM_VENDOR_ID,
  643. pci_get_word(config + PCI_VENDOR_ID));
  644. pci_set_word(config + PCI_SUBSYSTEM_ID, vdev->device_id);
  645. config[PCI_INTERRUPT_PIN] = 1;
  646. if (vdev->nvectors &&
  647. msix_init_exclusive_bar(&proxy->pci_dev, vdev->nvectors, 1)) {
  648. vdev->nvectors = 0;
  649. }
  650. proxy->pci_dev.config_write = virtio_write_config;
  651. size = VIRTIO_PCI_REGION_SIZE(&proxy->pci_dev) + vdev->config_len;
  652. if (size & (size-1))
  653. size = 1 << qemu_fls(size);
  654. memory_region_init_io(&proxy->bar, &virtio_pci_config_ops, proxy,
  655. "virtio-pci", size);
  656. pci_register_bar(&proxy->pci_dev, 0, PCI_BASE_ADDRESS_SPACE_IO,
  657. &proxy->bar);
  658. if (!kvm_has_many_ioeventfds()) {
  659. proxy->flags &= ~VIRTIO_PCI_FLAG_USE_IOEVENTFD;
  660. }
  661. virtio_bind_device(vdev, &virtio_pci_bindings, proxy);
  662. proxy->host_features |= 0x1 << VIRTIO_F_NOTIFY_ON_EMPTY;
  663. proxy->host_features |= 0x1 << VIRTIO_F_BAD_FEATURE;
  664. proxy->host_features = vdev->get_features(vdev, proxy->host_features);
  665. }
  666. static int virtio_blk_init_pci(PCIDevice *pci_dev)
  667. {
  668. VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
  669. VirtIODevice *vdev;
  670. if (proxy->class_code != PCI_CLASS_STORAGE_SCSI &&
  671. proxy->class_code != PCI_CLASS_STORAGE_OTHER)
  672. proxy->class_code = PCI_CLASS_STORAGE_SCSI;
  673. vdev = virtio_blk_init(&pci_dev->qdev, &proxy->blk);
  674. if (!vdev) {
  675. return -1;
  676. }
  677. vdev->nvectors = proxy->nvectors;
  678. virtio_init_pci(proxy, vdev);
  679. /* make the actual value visible */
  680. proxy->nvectors = vdev->nvectors;
  681. return 0;
  682. }
  683. static void virtio_exit_pci(PCIDevice *pci_dev)
  684. {
  685. VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
  686. memory_region_destroy(&proxy->bar);
  687. msix_uninit_exclusive_bar(pci_dev);
  688. }
  689. static void virtio_blk_exit_pci(PCIDevice *pci_dev)
  690. {
  691. VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
  692. virtio_pci_stop_ioeventfd(proxy);
  693. virtio_blk_exit(proxy->vdev);
  694. virtio_exit_pci(pci_dev);
  695. }
  696. static int virtio_serial_init_pci(PCIDevice *pci_dev)
  697. {
  698. VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
  699. VirtIODevice *vdev;
  700. if (proxy->class_code != PCI_CLASS_COMMUNICATION_OTHER &&
  701. proxy->class_code != PCI_CLASS_DISPLAY_OTHER && /* qemu 0.10 */
  702. proxy->class_code != PCI_CLASS_OTHERS) /* qemu-kvm */
  703. proxy->class_code = PCI_CLASS_COMMUNICATION_OTHER;
  704. vdev = virtio_serial_init(&pci_dev->qdev, &proxy->serial);
  705. if (!vdev) {
  706. return -1;
  707. }
  708. vdev->nvectors = proxy->nvectors == DEV_NVECTORS_UNSPECIFIED
  709. ? proxy->serial.max_virtserial_ports + 1
  710. : proxy->nvectors;
  711. virtio_init_pci(proxy, vdev);
  712. proxy->nvectors = vdev->nvectors;
  713. return 0;
  714. }
  715. static void virtio_serial_exit_pci(PCIDevice *pci_dev)
  716. {
  717. VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
  718. virtio_pci_stop_ioeventfd(proxy);
  719. virtio_serial_exit(proxy->vdev);
  720. virtio_exit_pci(pci_dev);
  721. }
  722. static int virtio_net_init_pci(PCIDevice *pci_dev)
  723. {
  724. VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
  725. VirtIODevice *vdev;
  726. vdev = virtio_net_init(&pci_dev->qdev, &proxy->nic, &proxy->net);
  727. vdev->nvectors = proxy->nvectors;
  728. virtio_init_pci(proxy, vdev);
  729. /* make the actual value visible */
  730. proxy->nvectors = vdev->nvectors;
  731. return 0;
  732. }
  733. static void virtio_net_exit_pci(PCIDevice *pci_dev)
  734. {
  735. VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
  736. virtio_pci_stop_ioeventfd(proxy);
  737. virtio_net_exit(proxy->vdev);
  738. virtio_exit_pci(pci_dev);
  739. }
  740. static int virtio_balloon_init_pci(PCIDevice *pci_dev)
  741. {
  742. VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
  743. VirtIODevice *vdev;
  744. if (proxy->class_code != PCI_CLASS_OTHERS &&
  745. proxy->class_code != PCI_CLASS_MEMORY_RAM) { /* qemu < 1.1 */
  746. proxy->class_code = PCI_CLASS_OTHERS;
  747. }
  748. vdev = virtio_balloon_init(&pci_dev->qdev);
  749. if (!vdev) {
  750. return -1;
  751. }
  752. virtio_init_pci(proxy, vdev);
  753. return 0;
  754. }
  755. static void virtio_balloon_exit_pci(PCIDevice *pci_dev)
  756. {
  757. VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
  758. virtio_pci_stop_ioeventfd(proxy);
  759. virtio_balloon_exit(proxy->vdev);
  760. virtio_exit_pci(pci_dev);
  761. }
  762. static Property virtio_blk_properties[] = {
  763. DEFINE_PROP_HEX32("class", VirtIOPCIProxy, class_code, 0),
  764. DEFINE_BLOCK_PROPERTIES(VirtIOPCIProxy, blk.conf),
  765. DEFINE_BLOCK_CHS_PROPERTIES(VirtIOPCIProxy, blk.conf),
  766. DEFINE_PROP_STRING("serial", VirtIOPCIProxy, blk.serial),
  767. #ifdef __linux__
  768. DEFINE_PROP_BIT("scsi", VirtIOPCIProxy, blk.scsi, 0, true),
  769. #endif
  770. DEFINE_PROP_BIT("config-wce", VirtIOPCIProxy, blk.config_wce, 0, true),
  771. DEFINE_PROP_BIT("ioeventfd", VirtIOPCIProxy, flags, VIRTIO_PCI_FLAG_USE_IOEVENTFD_BIT, true),
  772. DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors, 2),
  773. DEFINE_VIRTIO_BLK_FEATURES(VirtIOPCIProxy, host_features),
  774. DEFINE_PROP_END_OF_LIST(),
  775. };
  776. static void virtio_blk_class_init(ObjectClass *klass, void *data)
  777. {
  778. DeviceClass *dc = DEVICE_CLASS(klass);
  779. PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
  780. k->init = virtio_blk_init_pci;
  781. k->exit = virtio_blk_exit_pci;
  782. k->vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET;
  783. k->device_id = PCI_DEVICE_ID_VIRTIO_BLOCK;
  784. k->revision = VIRTIO_PCI_ABI_VERSION;
  785. k->class_id = PCI_CLASS_STORAGE_SCSI;
  786. dc->reset = virtio_pci_reset;
  787. dc->props = virtio_blk_properties;
  788. }
  789. static TypeInfo virtio_blk_info = {
  790. .name = "virtio-blk-pci",
  791. .parent = TYPE_PCI_DEVICE,
  792. .instance_size = sizeof(VirtIOPCIProxy),
  793. .class_init = virtio_blk_class_init,
  794. };
  795. static Property virtio_net_properties[] = {
  796. DEFINE_PROP_BIT("ioeventfd", VirtIOPCIProxy, flags, VIRTIO_PCI_FLAG_USE_IOEVENTFD_BIT, false),
  797. DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors, 3),
  798. DEFINE_VIRTIO_NET_FEATURES(VirtIOPCIProxy, host_features),
  799. DEFINE_NIC_PROPERTIES(VirtIOPCIProxy, nic),
  800. DEFINE_PROP_UINT32("x-txtimer", VirtIOPCIProxy, net.txtimer, TX_TIMER_INTERVAL),
  801. DEFINE_PROP_INT32("x-txburst", VirtIOPCIProxy, net.txburst, TX_BURST),
  802. DEFINE_PROP_STRING("tx", VirtIOPCIProxy, net.tx),
  803. DEFINE_PROP_END_OF_LIST(),
  804. };
  805. static void virtio_net_class_init(ObjectClass *klass, void *data)
  806. {
  807. DeviceClass *dc = DEVICE_CLASS(klass);
  808. PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
  809. k->init = virtio_net_init_pci;
  810. k->exit = virtio_net_exit_pci;
  811. k->romfile = "pxe-virtio.rom";
  812. k->vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET;
  813. k->device_id = PCI_DEVICE_ID_VIRTIO_NET;
  814. k->revision = VIRTIO_PCI_ABI_VERSION;
  815. k->class_id = PCI_CLASS_NETWORK_ETHERNET;
  816. dc->reset = virtio_pci_reset;
  817. dc->props = virtio_net_properties;
  818. }
  819. static TypeInfo virtio_net_info = {
  820. .name = "virtio-net-pci",
  821. .parent = TYPE_PCI_DEVICE,
  822. .instance_size = sizeof(VirtIOPCIProxy),
  823. .class_init = virtio_net_class_init,
  824. };
  825. static Property virtio_serial_properties[] = {
  826. DEFINE_PROP_BIT("ioeventfd", VirtIOPCIProxy, flags, VIRTIO_PCI_FLAG_USE_IOEVENTFD_BIT, true),
  827. DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors, DEV_NVECTORS_UNSPECIFIED),
  828. DEFINE_PROP_HEX32("class", VirtIOPCIProxy, class_code, 0),
  829. DEFINE_VIRTIO_COMMON_FEATURES(VirtIOPCIProxy, host_features),
  830. DEFINE_PROP_UINT32("max_ports", VirtIOPCIProxy, serial.max_virtserial_ports, 31),
  831. DEFINE_PROP_END_OF_LIST(),
  832. };
  833. static void virtio_serial_class_init(ObjectClass *klass, void *data)
  834. {
  835. DeviceClass *dc = DEVICE_CLASS(klass);
  836. PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
  837. k->init = virtio_serial_init_pci;
  838. k->exit = virtio_serial_exit_pci;
  839. k->vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET;
  840. k->device_id = PCI_DEVICE_ID_VIRTIO_CONSOLE;
  841. k->revision = VIRTIO_PCI_ABI_VERSION;
  842. k->class_id = PCI_CLASS_COMMUNICATION_OTHER;
  843. dc->reset = virtio_pci_reset;
  844. dc->props = virtio_serial_properties;
  845. }
  846. static TypeInfo virtio_serial_info = {
  847. .name = "virtio-serial-pci",
  848. .parent = TYPE_PCI_DEVICE,
  849. .instance_size = sizeof(VirtIOPCIProxy),
  850. .class_init = virtio_serial_class_init,
  851. };
  852. static Property virtio_balloon_properties[] = {
  853. DEFINE_VIRTIO_COMMON_FEATURES(VirtIOPCIProxy, host_features),
  854. DEFINE_PROP_HEX32("class", VirtIOPCIProxy, class_code, 0),
  855. DEFINE_PROP_END_OF_LIST(),
  856. };
  857. static void virtio_balloon_class_init(ObjectClass *klass, void *data)
  858. {
  859. DeviceClass *dc = DEVICE_CLASS(klass);
  860. PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
  861. k->init = virtio_balloon_init_pci;
  862. k->exit = virtio_balloon_exit_pci;
  863. k->vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET;
  864. k->device_id = PCI_DEVICE_ID_VIRTIO_BALLOON;
  865. k->revision = VIRTIO_PCI_ABI_VERSION;
  866. k->class_id = PCI_CLASS_OTHERS;
  867. dc->reset = virtio_pci_reset;
  868. dc->props = virtio_balloon_properties;
  869. }
  870. static TypeInfo virtio_balloon_info = {
  871. .name = "virtio-balloon-pci",
  872. .parent = TYPE_PCI_DEVICE,
  873. .instance_size = sizeof(VirtIOPCIProxy),
  874. .class_init = virtio_balloon_class_init,
  875. };
  876. static int virtio_scsi_init_pci(PCIDevice *pci_dev)
  877. {
  878. VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
  879. VirtIODevice *vdev;
  880. vdev = virtio_scsi_init(&pci_dev->qdev, &proxy->scsi);
  881. if (!vdev) {
  882. return -EINVAL;
  883. }
  884. vdev->nvectors = proxy->nvectors == DEV_NVECTORS_UNSPECIFIED
  885. ? proxy->scsi.num_queues + 3
  886. : proxy->nvectors;
  887. virtio_init_pci(proxy, vdev);
  888. /* make the actual value visible */
  889. proxy->nvectors = vdev->nvectors;
  890. return 0;
  891. }
  892. static void virtio_scsi_exit_pci(PCIDevice *pci_dev)
  893. {
  894. VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
  895. virtio_scsi_exit(proxy->vdev);
  896. virtio_exit_pci(pci_dev);
  897. }
  898. static Property virtio_scsi_properties[] = {
  899. DEFINE_PROP_BIT("ioeventfd", VirtIOPCIProxy, flags, VIRTIO_PCI_FLAG_USE_IOEVENTFD_BIT, true),
  900. DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors, DEV_NVECTORS_UNSPECIFIED),
  901. DEFINE_VIRTIO_SCSI_PROPERTIES(VirtIOPCIProxy, host_features, scsi),
  902. DEFINE_PROP_END_OF_LIST(),
  903. };
  904. static void virtio_scsi_class_init(ObjectClass *klass, void *data)
  905. {
  906. DeviceClass *dc = DEVICE_CLASS(klass);
  907. PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
  908. k->init = virtio_scsi_init_pci;
  909. k->exit = virtio_scsi_exit_pci;
  910. k->vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET;
  911. k->device_id = PCI_DEVICE_ID_VIRTIO_SCSI;
  912. k->revision = 0x00;
  913. k->class_id = PCI_CLASS_STORAGE_SCSI;
  914. dc->reset = virtio_pci_reset;
  915. dc->props = virtio_scsi_properties;
  916. }
  917. static TypeInfo virtio_scsi_info = {
  918. .name = "virtio-scsi-pci",
  919. .parent = TYPE_PCI_DEVICE,
  920. .instance_size = sizeof(VirtIOPCIProxy),
  921. .class_init = virtio_scsi_class_init,
  922. };
  923. static void virtio_pci_register_types(void)
  924. {
  925. type_register_static(&virtio_blk_info);
  926. type_register_static(&virtio_net_info);
  927. type_register_static(&virtio_serial_info);
  928. type_register_static(&virtio_balloon_info);
  929. type_register_static(&virtio_scsi_info);
  930. }
  931. type_init(virtio_pci_register_types)