diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-04-22 13:55:06 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-04-22 13:55:06 -0400 |
| commit | b9bb6fb73b3e112d241a5edd146740be9a0c3cc0 (patch) | |
| tree | d65072d0371468d685b7464dc6b38f920c0c9666 /include | |
| parent | 15ce2658ddbd3db20dfba3622f3d224f01837fdc (diff) | |
| parent | 9abbfb486f5c254805bb6a3f263bc14d989eb90b (diff) | |
Merge tag 'virtio-next-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux
Pull virtio updates from Rusty Russell:
"Some virtio internal cleanups, a new virtio device "virtio input", and
a change to allow the legacy virtio balloon.
Most excitingly, some lguest work! No seriously, I got some cleanup
patches"
* tag 'virtio-next-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux:
virtio: drop virtio_device_is_legacy_only
virtio_pci: support non-legacy balloon devices
virtio_mmio: support non-legacy balloon devices
virtio_ccw: support non-legacy balloon devices
virtio: balloon might not be a legacy device
virtio_balloon: transitional interface
virtio_ring: Update weak barriers to use dma_wmb/rmb
virtio_pci_modern: switch to type-safe io accessors
virtio_pci_modern: type-safe io accessors
lguest: handle traps on the "interrupt suppressed" iret instruction.
virtio: drop a useless config read
virtio_config: reorder functions
Add virtio-input driver.
lguest: suppress interrupts for single insn, not range.
lguest: simplify lguest_iret
lguest: rename i386_head.S in the comments
lguest: explicitly set miscdevice's private_data NULL
lguest: fix pending interrupt test.
Diffstat (limited to 'include')
| -rw-r--r-- | include/linux/lguest.h | 4 | ||||
| -rw-r--r-- | include/linux/virtio.h | 2 | ||||
| -rw-r--r-- | include/linux/virtio_config.h | 16 | ||||
| -rw-r--r-- | include/linux/virtio_ring.h | 23 | ||||
| -rw-r--r-- | include/uapi/linux/Kbuild | 1 | ||||
| -rw-r--r-- | include/uapi/linux/virtio_balloon.h | 32 | ||||
| -rw-r--r-- | include/uapi/linux/virtio_ids.h | 1 | ||||
| -rw-r--r-- | include/uapi/linux/virtio_input.h | 76 |
8 files changed, 119 insertions, 36 deletions
diff --git a/include/linux/lguest.h b/include/linux/lguest.h index 9962c6bb1311..6db19f35f7c5 100644 --- a/include/linux/lguest.h +++ b/include/linux/lguest.h | |||
| @@ -61,8 +61,8 @@ struct lguest_data { | |||
| 61 | u32 tsc_khz; | 61 | u32 tsc_khz; |
| 62 | 62 | ||
| 63 | /* Fields initialized by the Guest at boot: */ | 63 | /* Fields initialized by the Guest at boot: */ |
| 64 | /* Instruction range to suppress interrupts even if enabled */ | 64 | /* Instruction to suppress interrupts even if enabled */ |
| 65 | unsigned long noirq_start, noirq_end; | 65 | unsigned long noirq_iret; |
| 66 | /* Address above which page tables are all identical. */ | 66 | /* Address above which page tables are all identical. */ |
| 67 | unsigned long kernel_address; | 67 | unsigned long kernel_address; |
| 68 | /* The vector to try to use for system calls (0x40 or 0x80). */ | 68 | /* The vector to try to use for system calls (0x40 or 0x80). */ |
diff --git a/include/linux/virtio.h b/include/linux/virtio.h index 28f0e65b9a11..8f4d4bfa6d46 100644 --- a/include/linux/virtio.h +++ b/include/linux/virtio.h | |||
| @@ -108,8 +108,6 @@ struct virtio_device { | |||
| 108 | void *priv; | 108 | void *priv; |
| 109 | }; | 109 | }; |
| 110 | 110 | ||
| 111 | bool virtio_device_is_legacy_only(struct virtio_device_id id); | ||
| 112 | |||
| 113 | static inline struct virtio_device *dev_to_virtio(struct device *_dev) | 111 | static inline struct virtio_device *dev_to_virtio(struct device *_dev) |
| 114 | { | 112 | { |
| 115 | return container_of(_dev, struct virtio_device, dev); | 113 | return container_of(_dev, struct virtio_device, dev); |
diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h index ca3ed78e5ec7..1e306f727edc 100644 --- a/include/linux/virtio_config.h +++ b/include/linux/virtio_config.h | |||
| @@ -298,13 +298,6 @@ static inline __virtio64 cpu_to_virtio64(struct virtio_device *vdev, u64 val) | |||
| 298 | } \ | 298 | } \ |
| 299 | } while(0) | 299 | } while(0) |
| 300 | 300 | ||
| 301 | static inline u8 virtio_cread8(struct virtio_device *vdev, unsigned int offset) | ||
| 302 | { | ||
| 303 | u8 ret; | ||
| 304 | vdev->config->get(vdev, offset, &ret, sizeof(ret)); | ||
| 305 | return ret; | ||
| 306 | } | ||
| 307 | |||
| 308 | /* Read @count fields, @bytes each. */ | 301 | /* Read @count fields, @bytes each. */ |
| 309 | static inline void __virtio_cread_many(struct virtio_device *vdev, | 302 | static inline void __virtio_cread_many(struct virtio_device *vdev, |
| 310 | unsigned int offset, | 303 | unsigned int offset, |
| @@ -326,7 +319,6 @@ static inline void __virtio_cread_many(struct virtio_device *vdev, | |||
| 326 | } while (gen != old); | 319 | } while (gen != old); |
| 327 | } | 320 | } |
| 328 | 321 | ||
| 329 | |||
| 330 | static inline void virtio_cread_bytes(struct virtio_device *vdev, | 322 | static inline void virtio_cread_bytes(struct virtio_device *vdev, |
| 331 | unsigned int offset, | 323 | unsigned int offset, |
| 332 | void *buf, size_t len) | 324 | void *buf, size_t len) |
| @@ -334,6 +326,13 @@ static inline void virtio_cread_bytes(struct virtio_device *vdev, | |||
| 334 | __virtio_cread_many(vdev, offset, buf, len, 1); | 326 | __virtio_cread_many(vdev, offset, buf, len, 1); |
| 335 | } | 327 | } |
| 336 | 328 | ||
| 329 | static inline u8 virtio_cread8(struct virtio_device *vdev, unsigned int offset) | ||
| 330 | { | ||
| 331 | u8 ret; | ||
| 332 | vdev->config->get(vdev, offset, &ret, sizeof(ret)); | ||
| 333 | return ret; | ||
| 334 | } | ||
| 335 | |||
| 337 | static inline void virtio_cwrite8(struct virtio_device *vdev, | 336 | static inline void virtio_cwrite8(struct virtio_device *vdev, |
| 338 | unsigned int offset, u8 val) | 337 | unsigned int offset, u8 val) |
| 339 | { | 338 | { |
| @@ -374,7 +373,6 @@ static inline u64 virtio_cread64(struct virtio_device *vdev, | |||
| 374 | unsigned int offset) | 373 | unsigned int offset) |
| 375 | { | 374 | { |
| 376 | u64 ret; | 375 | u64 ret; |
| 377 | vdev->config->get(vdev, offset, &ret, sizeof(ret)); | ||
| 378 | __virtio_cread_many(vdev, offset, &ret, 1, sizeof(ret)); | 376 | __virtio_cread_many(vdev, offset, &ret, 1, sizeof(ret)); |
| 379 | return virtio64_to_cpu(vdev, (__force __virtio64)ret); | 377 | return virtio64_to_cpu(vdev, (__force __virtio64)ret); |
| 380 | } | 378 | } |
diff --git a/include/linux/virtio_ring.h b/include/linux/virtio_ring.h index 67e06fe18c03..8e50888a6d59 100644 --- a/include/linux/virtio_ring.h +++ b/include/linux/virtio_ring.h | |||
| @@ -21,19 +21,20 @@ | |||
| 21 | * actually quite cheap. | 21 | * actually quite cheap. |
| 22 | */ | 22 | */ |
| 23 | 23 | ||
| 24 | #ifdef CONFIG_SMP | ||
| 25 | static inline void virtio_mb(bool weak_barriers) | 24 | static inline void virtio_mb(bool weak_barriers) |
| 26 | { | 25 | { |
| 26 | #ifdef CONFIG_SMP | ||
| 27 | if (weak_barriers) | 27 | if (weak_barriers) |
| 28 | smp_mb(); | 28 | smp_mb(); |
| 29 | else | 29 | else |
| 30 | #endif | ||
| 30 | mb(); | 31 | mb(); |
| 31 | } | 32 | } |
| 32 | 33 | ||
| 33 | static inline void virtio_rmb(bool weak_barriers) | 34 | static inline void virtio_rmb(bool weak_barriers) |
| 34 | { | 35 | { |
| 35 | if (weak_barriers) | 36 | if (weak_barriers) |
| 36 | smp_rmb(); | 37 | dma_rmb(); |
| 37 | else | 38 | else |
| 38 | rmb(); | 39 | rmb(); |
| 39 | } | 40 | } |
| @@ -41,26 +42,10 @@ static inline void virtio_rmb(bool weak_barriers) | |||
| 41 | static inline void virtio_wmb(bool weak_barriers) | 42 | static inline void virtio_wmb(bool weak_barriers) |
| 42 | { | 43 | { |
| 43 | if (weak_barriers) | 44 | if (weak_barriers) |
| 44 | smp_wmb(); | 45 | dma_wmb(); |
| 45 | else | 46 | else |
| 46 | wmb(); | 47 | wmb(); |
| 47 | } | 48 | } |
| 48 | #else | ||
| 49 | static inline void virtio_mb(bool weak_barriers) | ||
| 50 | { | ||
| 51 | mb(); | ||
| 52 | } | ||
| 53 | |||
| 54 | static inline void virtio_rmb(bool weak_barriers) | ||
| 55 | { | ||
| 56 | rmb(); | ||
| 57 | } | ||
| 58 | |||
| 59 | static inline void virtio_wmb(bool weak_barriers) | ||
| 60 | { | ||
| 61 | wmb(); | ||
| 62 | } | ||
| 63 | #endif | ||
| 64 | 49 | ||
| 65 | struct virtio_device; | 50 | struct virtio_device; |
| 66 | struct virtqueue; | 51 | struct virtqueue; |
diff --git a/include/uapi/linux/Kbuild b/include/uapi/linux/Kbuild index 640954b9ecf9..1a0006a76b00 100644 --- a/include/uapi/linux/Kbuild +++ b/include/uapi/linux/Kbuild | |||
| @@ -431,6 +431,7 @@ header-y += virtio_blk.h | |||
| 431 | header-y += virtio_config.h | 431 | header-y += virtio_config.h |
| 432 | header-y += virtio_console.h | 432 | header-y += virtio_console.h |
| 433 | header-y += virtio_ids.h | 433 | header-y += virtio_ids.h |
| 434 | header-y += virtio_input.h | ||
| 434 | header-y += virtio_net.h | 435 | header-y += virtio_net.h |
| 435 | header-y += virtio_pci.h | 436 | header-y += virtio_pci.h |
| 436 | header-y += virtio_ring.h | 437 | header-y += virtio_ring.h |
diff --git a/include/uapi/linux/virtio_balloon.h b/include/uapi/linux/virtio_balloon.h index 4b0488f20b2e..984169a819ee 100644 --- a/include/uapi/linux/virtio_balloon.h +++ b/include/uapi/linux/virtio_balloon.h | |||
| @@ -25,6 +25,7 @@ | |||
| 25 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | 25 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
| 26 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | 26 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
| 27 | * SUCH DAMAGE. */ | 27 | * SUCH DAMAGE. */ |
| 28 | #include <linux/types.h> | ||
| 28 | #include <linux/virtio_ids.h> | 29 | #include <linux/virtio_ids.h> |
| 29 | #include <linux/virtio_config.h> | 30 | #include <linux/virtio_config.h> |
| 30 | 31 | ||
| @@ -38,9 +39,9 @@ | |||
| 38 | 39 | ||
| 39 | struct virtio_balloon_config { | 40 | struct virtio_balloon_config { |
| 40 | /* Number of pages host wants Guest to give up. */ | 41 | /* Number of pages host wants Guest to give up. */ |
| 41 | __le32 num_pages; | 42 | __u32 num_pages; |
| 42 | /* Number of pages we've actually got in balloon. */ | 43 | /* Number of pages we've actually got in balloon. */ |
| 43 | __le32 actual; | 44 | __u32 actual; |
| 44 | }; | 45 | }; |
| 45 | 46 | ||
| 46 | #define VIRTIO_BALLOON_S_SWAP_IN 0 /* Amount of memory swapped in */ | 47 | #define VIRTIO_BALLOON_S_SWAP_IN 0 /* Amount of memory swapped in */ |
| @@ -51,9 +52,32 @@ struct virtio_balloon_config { | |||
| 51 | #define VIRTIO_BALLOON_S_MEMTOT 5 /* Total amount of memory */ | 52 | #define VIRTIO_BALLOON_S_MEMTOT 5 /* Total amount of memory */ |
| 52 | #define VIRTIO_BALLOON_S_NR 6 | 53 | #define VIRTIO_BALLOON_S_NR 6 |
| 53 | 54 | ||
| 55 | /* | ||
| 56 | * Memory statistics structure. | ||
| 57 | * Driver fills an array of these structures and passes to device. | ||
| 58 | * | ||
| 59 | * NOTE: fields are laid out in a way that would make compiler add padding | ||
| 60 | * between and after fields, so we have to use compiler-specific attributes to | ||
| 61 | * pack it, to disable this padding. This also often causes compiler to | ||
| 62 | * generate suboptimal code. | ||
| 63 | * | ||
| 64 | * We maintain this statistics structure format for backwards compatibility, | ||
| 65 | * but don't follow this example. | ||
| 66 | * | ||
| 67 | * If implementing a similar structure, do something like the below instead: | ||
| 68 | * struct virtio_balloon_stat { | ||
| 69 | * __virtio16 tag; | ||
| 70 | * __u8 reserved[6]; | ||
| 71 | * __virtio64 val; | ||
| 72 | * }; | ||
| 73 | * | ||
| 74 | * In other words, add explicit reserved fields to align field and | ||
| 75 | * structure boundaries at field size, avoiding compiler padding | ||
| 76 | * without the packed attribute. | ||
| 77 | */ | ||
| 54 | struct virtio_balloon_stat { | 78 | struct virtio_balloon_stat { |
| 55 | __u16 tag; | 79 | __virtio16 tag; |
| 56 | __u64 val; | 80 | __virtio64 val; |
| 57 | } __attribute__((packed)); | 81 | } __attribute__((packed)); |
| 58 | 82 | ||
| 59 | #endif /* _LINUX_VIRTIO_BALLOON_H */ | 83 | #endif /* _LINUX_VIRTIO_BALLOON_H */ |
diff --git a/include/uapi/linux/virtio_ids.h b/include/uapi/linux/virtio_ids.h index 284fc3a05f7b..5f60aa4be50a 100644 --- a/include/uapi/linux/virtio_ids.h +++ b/include/uapi/linux/virtio_ids.h | |||
| @@ -39,5 +39,6 @@ | |||
| 39 | #define VIRTIO_ID_9P 9 /* 9p virtio console */ | 39 | #define VIRTIO_ID_9P 9 /* 9p virtio console */ |
| 40 | #define VIRTIO_ID_RPROC_SERIAL 11 /* virtio remoteproc serial link */ | 40 | #define VIRTIO_ID_RPROC_SERIAL 11 /* virtio remoteproc serial link */ |
| 41 | #define VIRTIO_ID_CAIF 12 /* Virtio caif */ | 41 | #define VIRTIO_ID_CAIF 12 /* Virtio caif */ |
| 42 | #define VIRTIO_ID_INPUT 18 /* virtio input */ | ||
| 42 | 43 | ||
| 43 | #endif /* _LINUX_VIRTIO_IDS_H */ | 44 | #endif /* _LINUX_VIRTIO_IDS_H */ |
diff --git a/include/uapi/linux/virtio_input.h b/include/uapi/linux/virtio_input.h new file mode 100644 index 000000000000..a7fe5c8fb135 --- /dev/null +++ b/include/uapi/linux/virtio_input.h | |||
| @@ -0,0 +1,76 @@ | |||
| 1 | #ifndef _LINUX_VIRTIO_INPUT_H | ||
| 2 | #define _LINUX_VIRTIO_INPUT_H | ||
| 3 | /* This header is BSD licensed so anyone can use the definitions to implement | ||
| 4 | * compatible drivers/servers. | ||
| 5 | * | ||
| 6 | * Redistribution and use in source and binary forms, with or without | ||
| 7 | * modification, are permitted provided that the following conditions | ||
| 8 | * are met: | ||
| 9 | * 1. Redistributions of source code must retain the above copyright | ||
| 10 | * notice, this list of conditions and the following disclaimer. | ||
| 11 | * 2. Redistributions in binary form must reproduce the above copyright | ||
| 12 | * notice, this list of conditions and the following disclaimer in the | ||
| 13 | * documentation and/or other materials provided with the distribution. | ||
| 14 | * 3. Neither the name of IBM nor the names of its contributors | ||
| 15 | * may be used to endorse or promote products derived from this software | ||
| 16 | * without specific prior written permission. | ||
| 17 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| 18 | * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| 19 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||
| 20 | * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL IBM OR | ||
| 21 | * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
| 22 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||
| 23 | * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | ||
| 24 | * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
| 25 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | ||
| 26 | * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | ||
| 27 | * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||
| 28 | * SUCH DAMAGE. */ | ||
| 29 | |||
| 30 | #include <linux/types.h> | ||
| 31 | |||
| 32 | enum virtio_input_config_select { | ||
| 33 | VIRTIO_INPUT_CFG_UNSET = 0x00, | ||
| 34 | VIRTIO_INPUT_CFG_ID_NAME = 0x01, | ||
| 35 | VIRTIO_INPUT_CFG_ID_SERIAL = 0x02, | ||
| 36 | VIRTIO_INPUT_CFG_ID_DEVIDS = 0x03, | ||
| 37 | VIRTIO_INPUT_CFG_PROP_BITS = 0x10, | ||
| 38 | VIRTIO_INPUT_CFG_EV_BITS = 0x11, | ||
| 39 | VIRTIO_INPUT_CFG_ABS_INFO = 0x12, | ||
| 40 | }; | ||
| 41 | |||
| 42 | struct virtio_input_absinfo { | ||
| 43 | __u32 min; | ||
| 44 | __u32 max; | ||
| 45 | __u32 fuzz; | ||
| 46 | __u32 flat; | ||
| 47 | __u32 res; | ||
| 48 | }; | ||
| 49 | |||
| 50 | struct virtio_input_devids { | ||
| 51 | __u16 bustype; | ||
| 52 | __u16 vendor; | ||
| 53 | __u16 product; | ||
| 54 | __u16 version; | ||
| 55 | }; | ||
| 56 | |||
| 57 | struct virtio_input_config { | ||
| 58 | __u8 select; | ||
| 59 | __u8 subsel; | ||
| 60 | __u8 size; | ||
| 61 | __u8 reserved[5]; | ||
| 62 | union { | ||
| 63 | char string[128]; | ||
| 64 | __u8 bitmap[128]; | ||
| 65 | struct virtio_input_absinfo abs; | ||
| 66 | struct virtio_input_devids ids; | ||
| 67 | } u; | ||
| 68 | }; | ||
| 69 | |||
| 70 | struct virtio_input_event { | ||
| 71 | __le16 type; | ||
| 72 | __le16 code; | ||
| 73 | __le32 value; | ||
| 74 | }; | ||
| 75 | |||
| 76 | #endif /* _LINUX_VIRTIO_INPUT_H */ | ||
