virtio-mmio.h 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #ifndef _VIRTIO_MMIO_H_
  2. #define _VIRTIO_MMIO_H_
  3. /*
  4. * A minimal implementation of virtio-mmio. Adapted from the Linux Kernel.
  5. *
  6. * Copyright (C) 2017, Red Hat Inc, Andrew Jones <drjones@redhat.com>
  7. *
  8. * This work is licensed under the terms of the GNU GPL, version 2.
  9. */
  10. #include "libcflat.h"
  11. #include "asm/page.h"
  12. #include "virtio.h"
  13. #define VIRTIO_MMIO_MAGIC_VALUE 0x000
  14. #define VIRTIO_MMIO_VERSION 0x004
  15. #define VIRTIO_MMIO_DEVICE_ID 0x008
  16. #define VIRTIO_MMIO_VENDOR_ID 0x00c
  17. #define VIRTIO_MMIO_HOST_FEATURES 0x010
  18. #define VIRTIO_MMIO_HOST_FEATURES_SEL 0x014
  19. #define VIRTIO_MMIO_GUEST_FEATURES 0x020
  20. #define VIRTIO_MMIO_GUEST_FEATURES_SEL 0x024
  21. #define VIRTIO_MMIO_GUEST_PAGE_SIZE 0x028
  22. #define VIRTIO_MMIO_QUEUE_SEL 0x030
  23. #define VIRTIO_MMIO_QUEUE_NUM_MAX 0x034
  24. #define VIRTIO_MMIO_QUEUE_NUM 0x038
  25. #define VIRTIO_MMIO_QUEUE_ALIGN 0x03c
  26. #define VIRTIO_MMIO_QUEUE_PFN 0x040
  27. #define VIRTIO_MMIO_QUEUE_NOTIFY 0x050
  28. #define VIRTIO_MMIO_INTERRUPT_STATUS 0x060
  29. #define VIRTIO_MMIO_INTERRUPT_ACK 0x064
  30. #define VIRTIO_MMIO_STATUS 0x070
  31. #define VIRTIO_MMIO_CONFIG 0x100
  32. #define VIRTIO_MMIO_INT_VRING (1 << 0)
  33. #define VIRTIO_MMIO_INT_CONFIG (1 << 1)
  34. #define VIRTIO_MMIO_VRING_ALIGN PAGE_SIZE
  35. /*
  36. * The minimum queue size is 2*VIRTIO_MMIO_VRING_ALIGN, which
  37. * means the largest queue num for the minimum queue size is 128, i.e.
  38. * 2*VIRTIO_MMIO_VRING_ALIGN = vring_size(128, VIRTIO_MMIO_VRING_ALIGN),
  39. * where vring_size is
  40. *
  41. * unsigned vring_size(unsigned num, unsigned long align)
  42. * {
  43. * return ((sizeof(struct vring_desc) * num + sizeof(u16) * (3 + num)
  44. * + align - 1) & ~(align - 1))
  45. * + sizeof(u16) * 3 + sizeof(struct vring_used_elem) * num;
  46. * }
  47. */
  48. #define VIRTIO_MMIO_QUEUE_SIZE_MIN (2*VIRTIO_MMIO_VRING_ALIGN)
  49. #define VIRTIO_MMIO_QUEUE_NUM_MIN 128
  50. #define to_virtio_mmio_device(vdev_ptr) \
  51. container_of(vdev_ptr, struct virtio_mmio_device, vdev)
  52. struct virtio_mmio_device {
  53. struct virtio_device vdev;
  54. void *base;
  55. };
  56. extern struct virtio_device *virtio_mmio_bind(u32 devid);
  57. #endif /* _VIRTIO_MMIO_H_ */