/*
 * Common code for block device models
 *
 * Copyright (C) 2012 Red Hat, Inc.
 *
 * This work is licensed under the terms of the GNU GPL, version 2 or
 * later.  See the COPYING file in the top-level directory.
 */

#include "blockdev.h"
#include "hw/block-common.h"
#include "qemu-error.h"

void blkconf_serial(BlockConf *conf, char **serial)
{
    DriveInfo *dinfo;

    if (!*serial) {
        /* try to fall back to value set with legacy -drive serial=... */
        dinfo = drive_get_by_blockdev(conf->bs);
        if (dinfo->serial) {
            *serial = g_strdup(dinfo->serial);
        }
    }
}

int blkconf_geometry(BlockConf *conf, int *ptrans,
                     unsigned cyls_max, unsigned heads_max, unsigned secs_max)
{
    DriveInfo *dinfo;

    if (!conf->cyls && !conf->heads && !conf->secs) {
        /* try to fall back to value set with legacy -drive cyls=... */
        dinfo = drive_get_by_blockdev(conf->bs);
        conf->cyls  = dinfo->cyls;
        conf->heads = dinfo->heads;
        conf->secs  = dinfo->secs;
        if (ptrans) {
            *ptrans = dinfo->trans;
        }
    }
    if (!conf->cyls && !conf->heads && !conf->secs) {
        hd_geometry_guess(conf->bs,
                          &conf->cyls, &conf->heads, &conf->secs,
                          ptrans);
    } else if (ptrans && *ptrans == BIOS_ATA_TRANSLATION_AUTO) {
        *ptrans = hd_bios_chs_auto_trans(conf->cyls, conf->heads, conf->secs);
    }
    if (conf->cyls || conf->heads || conf->secs) {
        if (conf->cyls < 1 || conf->cyls > cyls_max) {
            error_report("cyls must be between 1 and %u", cyls_max);
            return -1;
        }
        if (conf->heads < 1 || conf->heads > heads_max) {
            error_report("heads must be between 1 and %u", heads_max);
            return -1;
        }
        if (conf->secs < 1 || conf->secs > secs_max) {
            error_report("secs must be between 1 and %u", secs_max);
            return -1;
        }
    }
    return 0;
}
