/*
 * 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 "sysemu/blockdev.h"
#include "hw/block-common.h"
#include "qemu/error-report.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;
}
