virtio_config.h 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #include <linux/virtio_byteorder.h>
  3. #include <linux/virtio.h>
  4. #include <uapi/linux/virtio_config.h>
  5. /*
  6. * __virtio_test_bit - helper to test feature bits. For use by transports.
  7. * Devices should normally use virtio_has_feature,
  8. * which includes more checks.
  9. * @vdev: the device
  10. * @fbit: the feature bit
  11. */
  12. static inline bool __virtio_test_bit(const struct virtio_device *vdev,
  13. unsigned int fbit)
  14. {
  15. return vdev->features & (1ULL << fbit);
  16. }
  17. /**
  18. * __virtio_set_bit - helper to set feature bits. For use by transports.
  19. * @vdev: the device
  20. * @fbit: the feature bit
  21. */
  22. static inline void __virtio_set_bit(struct virtio_device *vdev,
  23. unsigned int fbit)
  24. {
  25. vdev->features |= (1ULL << fbit);
  26. }
  27. /**
  28. * __virtio_clear_bit - helper to clear feature bits. For use by transports.
  29. * @vdev: the device
  30. * @fbit: the feature bit
  31. */
  32. static inline void __virtio_clear_bit(struct virtio_device *vdev,
  33. unsigned int fbit)
  34. {
  35. vdev->features &= ~(1ULL << fbit);
  36. }
  37. #define virtio_has_feature(dev, feature) \
  38. (__virtio_test_bit((dev), feature))
  39. /**
  40. * virtio_has_iommu_quirk - determine whether this device has the iommu quirk
  41. * @vdev: the device
  42. */
  43. static inline bool virtio_has_iommu_quirk(const struct virtio_device *vdev)
  44. {
  45. /*
  46. * Note the reverse polarity of the quirk feature (compared to most
  47. * other features), this is for compatibility with legacy systems.
  48. */
  49. return !virtio_has_feature(vdev, VIRTIO_F_IOMMU_PLATFORM);
  50. }
  51. static inline bool virtio_is_little_endian(struct virtio_device *vdev)
  52. {
  53. return virtio_has_feature(vdev, VIRTIO_F_VERSION_1) ||
  54. virtio_legacy_is_little_endian();
  55. }
  56. /* Memory accessors */
  57. static inline u16 virtio16_to_cpu(struct virtio_device *vdev, __virtio16 val)
  58. {
  59. return __virtio16_to_cpu(virtio_is_little_endian(vdev), val);
  60. }
  61. static inline __virtio16 cpu_to_virtio16(struct virtio_device *vdev, u16 val)
  62. {
  63. return __cpu_to_virtio16(virtio_is_little_endian(vdev), val);
  64. }
  65. static inline u32 virtio32_to_cpu(struct virtio_device *vdev, __virtio32 val)
  66. {
  67. return __virtio32_to_cpu(virtio_is_little_endian(vdev), val);
  68. }
  69. static inline __virtio32 cpu_to_virtio32(struct virtio_device *vdev, u32 val)
  70. {
  71. return __cpu_to_virtio32(virtio_is_little_endian(vdev), val);
  72. }
  73. static inline u64 virtio64_to_cpu(struct virtio_device *vdev, __virtio64 val)
  74. {
  75. return __virtio64_to_cpu(virtio_is_little_endian(vdev), val);
  76. }
  77. static inline __virtio64 cpu_to_virtio64(struct virtio_device *vdev, u64 val)
  78. {
  79. return __cpu_to_virtio64(virtio_is_little_endian(vdev), val);
  80. }