1ad08e67aSMarc-André Lureau /*
2ad08e67aSMarc-André Lureau  * Virtio GPU Device
3ad08e67aSMarc-André Lureau  *
4ad08e67aSMarc-André Lureau  * Copyright Red Hat, Inc. 2013-2014
5ad08e67aSMarc-André Lureau  *
6ad08e67aSMarc-André Lureau  * Authors:
7ad08e67aSMarc-André Lureau  *     Dave Airlie <airlied@redhat.com>
8ad08e67aSMarc-André Lureau  *     Gerd Hoffmann <kraxel@redhat.com>
9ad08e67aSMarc-André Lureau  *
10ad08e67aSMarc-André Lureau  * This work is licensed under the terms of the GNU GPL, version 2 or later.
11ad08e67aSMarc-André Lureau  * See the COPYING file in the top-level directory.
12ad08e67aSMarc-André Lureau  */
13ad08e67aSMarc-André Lureau 
14ad08e67aSMarc-André Lureau #ifndef HW_VIRTIO_GPU_BSWAP_H
15ad08e67aSMarc-André Lureau #define HW_VIRTIO_GPU_BSWAP_H
16ad08e67aSMarc-André Lureau 
17ad08e67aSMarc-André Lureau #include "qemu/bswap.h"
18ec150c7eSMarkus Armbruster #include "standard-headers/linux/virtio_gpu.h"
19ad08e67aSMarc-André Lureau 
20ad08e67aSMarc-André Lureau static inline void
virtio_gpu_ctrl_hdr_bswap(struct virtio_gpu_ctrl_hdr * hdr)21ad08e67aSMarc-André Lureau virtio_gpu_ctrl_hdr_bswap(struct virtio_gpu_ctrl_hdr *hdr)
22ad08e67aSMarc-André Lureau {
23ad08e67aSMarc-André Lureau     le32_to_cpus(&hdr->type);
24ad08e67aSMarc-André Lureau     le32_to_cpus(&hdr->flags);
25ad08e67aSMarc-André Lureau     le64_to_cpus(&hdr->fence_id);
26ad08e67aSMarc-André Lureau     le32_to_cpus(&hdr->ctx_id);
27ad08e67aSMarc-André Lureau }
28ad08e67aSMarc-André Lureau 
29ad08e67aSMarc-André Lureau static inline void
virtio_gpu_bswap_32(void * ptr,size_t size)30ad08e67aSMarc-André Lureau virtio_gpu_bswap_32(void *ptr, size_t size)
31ad08e67aSMarc-André Lureau {
32e03b5686SMarc-André Lureau #if HOST_BIG_ENDIAN
33ad08e67aSMarc-André Lureau 
34ad08e67aSMarc-André Lureau     size_t i;
35ad08e67aSMarc-André Lureau     struct virtio_gpu_ctrl_hdr *hdr = (struct virtio_gpu_ctrl_hdr *) ptr;
36ad08e67aSMarc-André Lureau 
37ad08e67aSMarc-André Lureau     virtio_gpu_ctrl_hdr_bswap(hdr);
38ad08e67aSMarc-André Lureau 
39ad08e67aSMarc-André Lureau     i = sizeof(struct virtio_gpu_ctrl_hdr);
40ad08e67aSMarc-André Lureau     while (i < size) {
41ad08e67aSMarc-André Lureau         le32_to_cpus((uint32_t *)(ptr + i));
42ad08e67aSMarc-André Lureau         i = i + sizeof(uint32_t);
43ad08e67aSMarc-André Lureau     }
44ad08e67aSMarc-André Lureau 
45ad08e67aSMarc-André Lureau #endif
46ad08e67aSMarc-André Lureau }
47ad08e67aSMarc-André Lureau 
48ad08e67aSMarc-André Lureau static inline void
virtio_gpu_t2d_bswap(struct virtio_gpu_transfer_to_host_2d * t2d)49ad08e67aSMarc-André Lureau virtio_gpu_t2d_bswap(struct virtio_gpu_transfer_to_host_2d *t2d)
50ad08e67aSMarc-André Lureau {
51ad08e67aSMarc-André Lureau     virtio_gpu_ctrl_hdr_bswap(&t2d->hdr);
52ad08e67aSMarc-André Lureau     le32_to_cpus(&t2d->r.x);
53ad08e67aSMarc-André Lureau     le32_to_cpus(&t2d->r.y);
54ad08e67aSMarc-André Lureau     le32_to_cpus(&t2d->r.width);
55ad08e67aSMarc-André Lureau     le32_to_cpus(&t2d->r.height);
56ad08e67aSMarc-André Lureau     le64_to_cpus(&t2d->offset);
57ad08e67aSMarc-André Lureau     le32_to_cpus(&t2d->resource_id);
58ad08e67aSMarc-André Lureau     le32_to_cpus(&t2d->padding);
59ad08e67aSMarc-André Lureau }
60ad08e67aSMarc-André Lureau 
61e0933d91SVivek Kasireddy static inline void
virtio_gpu_create_blob_bswap(struct virtio_gpu_resource_create_blob * cblob)62e0933d91SVivek Kasireddy virtio_gpu_create_blob_bswap(struct virtio_gpu_resource_create_blob *cblob)
63e0933d91SVivek Kasireddy {
64e0933d91SVivek Kasireddy     virtio_gpu_ctrl_hdr_bswap(&cblob->hdr);
65e0933d91SVivek Kasireddy     le32_to_cpus(&cblob->resource_id);
66d1943629SThomas Huth     le32_to_cpus(&cblob->blob_mem);
67e0933d91SVivek Kasireddy     le32_to_cpus(&cblob->blob_flags);
68d1943629SThomas Huth     le32_to_cpus(&cblob->nr_entries);
69d1943629SThomas Huth     le64_to_cpus(&cblob->blob_id);
70e0933d91SVivek Kasireddy     le64_to_cpus(&cblob->size);
71e0933d91SVivek Kasireddy }
72e0933d91SVivek Kasireddy 
7332db3c63SVivek Kasireddy static inline void
virtio_gpu_map_blob_bswap(struct virtio_gpu_resource_map_blob * mblob)74*49a8b659SAntonio Caggiano virtio_gpu_map_blob_bswap(struct virtio_gpu_resource_map_blob *mblob)
75*49a8b659SAntonio Caggiano {
76*49a8b659SAntonio Caggiano     virtio_gpu_ctrl_hdr_bswap(&mblob->hdr);
77*49a8b659SAntonio Caggiano     le32_to_cpus(&mblob->resource_id);
78*49a8b659SAntonio Caggiano     le64_to_cpus(&mblob->offset);
79*49a8b659SAntonio Caggiano }
80*49a8b659SAntonio Caggiano 
81*49a8b659SAntonio Caggiano static inline void
virtio_gpu_unmap_blob_bswap(struct virtio_gpu_resource_unmap_blob * ublob)82*49a8b659SAntonio Caggiano virtio_gpu_unmap_blob_bswap(struct virtio_gpu_resource_unmap_blob *ublob)
83*49a8b659SAntonio Caggiano {
84*49a8b659SAntonio Caggiano     virtio_gpu_ctrl_hdr_bswap(&ublob->hdr);
85*49a8b659SAntonio Caggiano     le32_to_cpus(&ublob->resource_id);
86*49a8b659SAntonio Caggiano }
87*49a8b659SAntonio Caggiano 
88*49a8b659SAntonio Caggiano static inline void
virtio_gpu_scanout_blob_bswap(struct virtio_gpu_set_scanout_blob * ssb)8932db3c63SVivek Kasireddy virtio_gpu_scanout_blob_bswap(struct virtio_gpu_set_scanout_blob *ssb)
9032db3c63SVivek Kasireddy {
9132db3c63SVivek Kasireddy     virtio_gpu_bswap_32(ssb, sizeof(*ssb) - sizeof(ssb->offsets[3]));
9232db3c63SVivek Kasireddy     le32_to_cpus(&ssb->offsets[3]);
9332db3c63SVivek Kasireddy }
9432db3c63SVivek Kasireddy 
95ad08e67aSMarc-André Lureau #endif
96