/*
 * Virtio Block Device common helpers
 *
 * Copyright IBM, Corp. 2007
 *
 * Authors:
 *  Anthony Liguori   <aliguori@us.ibm.com>
 *
 * This work is licensed under the terms of the GNU GPL, version 2.  See
 * the COPYING file in the top-level directory.
 */

#include "qemu/osdep.h"

#include "standard-headers/linux/virtio_blk.h"
#include "hw/virtio/virtio.h"
#include "hw/virtio/virtio-blk-common.h"

/* Config size before the discard support (hide associated config fields) */
#define VIRTIO_BLK_CFG_SIZE offsetof(struct virtio_blk_config, \
                                     max_discard_sectors)

/*
 * Starting from the discard feature, we can use this array to properly
 * set the config size depending on the features enabled.
 */
static const VirtIOFeature feature_sizes[] = {
    {.flags = 1ULL << VIRTIO_BLK_F_DISCARD,
     .end = endof(struct virtio_blk_config, discard_sector_alignment)},
    {.flags = 1ULL << VIRTIO_BLK_F_WRITE_ZEROES,
     .end = endof(struct virtio_blk_config, write_zeroes_may_unmap)},
    {.flags = 1ULL << VIRTIO_BLK_F_ZONED,
     .end = endof(struct virtio_blk_config, zoned)},
    {}
};

const VirtIOConfigSizeParams virtio_blk_cfg_size_params = {
    .min_size = VIRTIO_BLK_CFG_SIZE,
    .max_size = sizeof(struct virtio_blk_config),
    .feature_sizes = feature_sizes
};
