hw: Convert from BlockDriverState to BlockBackend, mostly
Device models should access their block backends only through the block-backend.h API. Convert them, and drop direct includes of inappropriate headers. Just four uses of BlockDriverState are left: * The Xen paravirtual block device backend (xen_disk.c) opens images itself when set up via xenbus, bypassing blockdev.c. I figure it should go through qmp_blockdev_add() instead. * Device model "usb-storage" prompts for keys. No other device model does, and this one probably shouldn't do it, either. * ide_issue_trim_cb() uses bdrv_aio_discard() instead of blk_aio_discard() because it fishes its backend out of a BlockAIOCB, which has only the BlockDriverState. * PC87312State has an unused BlockDriverState[] member. The next two commits take care of the latter two. Signed-off-by: Markus Armbruster <armbru@redhat.com> Reviewed-by: Max Reitz <mreitz@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
2a30307f70
commit
4be746345f
@ -237,3 +237,265 @@ void blk_hide_on_behalf_of_do_drive_del(BlockBackend *blk)
|
|||||||
bdrv_make_anon(blk->bs);
|
bdrv_make_anon(blk->bs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void blk_iostatus_enable(BlockBackend *blk)
|
||||||
|
{
|
||||||
|
bdrv_iostatus_enable(blk->bs);
|
||||||
|
}
|
||||||
|
|
||||||
|
int blk_attach_dev(BlockBackend *blk, void *dev)
|
||||||
|
{
|
||||||
|
return bdrv_attach_dev(blk->bs, dev);
|
||||||
|
}
|
||||||
|
|
||||||
|
void blk_attach_dev_nofail(BlockBackend *blk, void *dev)
|
||||||
|
{
|
||||||
|
bdrv_attach_dev_nofail(blk->bs, dev);
|
||||||
|
}
|
||||||
|
|
||||||
|
void blk_detach_dev(BlockBackend *blk, void *dev)
|
||||||
|
{
|
||||||
|
bdrv_detach_dev(blk->bs, dev);
|
||||||
|
}
|
||||||
|
|
||||||
|
void *blk_get_attached_dev(BlockBackend *blk)
|
||||||
|
{
|
||||||
|
return bdrv_get_attached_dev(blk->bs);
|
||||||
|
}
|
||||||
|
|
||||||
|
void blk_set_dev_ops(BlockBackend *blk, const BlockDevOps *ops, void *opaque)
|
||||||
|
{
|
||||||
|
bdrv_set_dev_ops(blk->bs, ops, opaque);
|
||||||
|
}
|
||||||
|
|
||||||
|
int blk_read(BlockBackend *blk, int64_t sector_num, uint8_t *buf,
|
||||||
|
int nb_sectors)
|
||||||
|
{
|
||||||
|
return bdrv_read(blk->bs, sector_num, buf, nb_sectors);
|
||||||
|
}
|
||||||
|
|
||||||
|
int blk_read_unthrottled(BlockBackend *blk, int64_t sector_num, uint8_t *buf,
|
||||||
|
int nb_sectors)
|
||||||
|
{
|
||||||
|
return bdrv_read_unthrottled(blk->bs, sector_num, buf, nb_sectors);
|
||||||
|
}
|
||||||
|
|
||||||
|
int blk_write(BlockBackend *blk, int64_t sector_num, const uint8_t *buf,
|
||||||
|
int nb_sectors)
|
||||||
|
{
|
||||||
|
return bdrv_write(blk->bs, sector_num, buf, nb_sectors);
|
||||||
|
}
|
||||||
|
|
||||||
|
BlockAIOCB *blk_aio_write_zeroes(BlockBackend *blk, int64_t sector_num,
|
||||||
|
int nb_sectors, BdrvRequestFlags flags,
|
||||||
|
BlockCompletionFunc *cb, void *opaque)
|
||||||
|
{
|
||||||
|
return bdrv_aio_write_zeroes(blk->bs, sector_num, nb_sectors, flags,
|
||||||
|
cb, opaque);
|
||||||
|
}
|
||||||
|
|
||||||
|
int blk_pread(BlockBackend *blk, int64_t offset, void *buf, int count)
|
||||||
|
{
|
||||||
|
return bdrv_pread(blk->bs, offset, buf, count);
|
||||||
|
}
|
||||||
|
|
||||||
|
int blk_pwrite(BlockBackend *blk, int64_t offset, const void *buf, int count)
|
||||||
|
{
|
||||||
|
return bdrv_pwrite(blk->bs, offset, buf, count);
|
||||||
|
}
|
||||||
|
|
||||||
|
int64_t blk_getlength(BlockBackend *blk)
|
||||||
|
{
|
||||||
|
return bdrv_getlength(blk->bs);
|
||||||
|
}
|
||||||
|
|
||||||
|
void blk_get_geometry(BlockBackend *blk, uint64_t *nb_sectors_ptr)
|
||||||
|
{
|
||||||
|
bdrv_get_geometry(blk->bs, nb_sectors_ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
BlockAIOCB *blk_aio_readv(BlockBackend *blk, int64_t sector_num,
|
||||||
|
QEMUIOVector *iov, int nb_sectors,
|
||||||
|
BlockCompletionFunc *cb, void *opaque)
|
||||||
|
{
|
||||||
|
return bdrv_aio_readv(blk->bs, sector_num, iov, nb_sectors, cb, opaque);
|
||||||
|
}
|
||||||
|
|
||||||
|
BlockAIOCB *blk_aio_writev(BlockBackend *blk, int64_t sector_num,
|
||||||
|
QEMUIOVector *iov, int nb_sectors,
|
||||||
|
BlockCompletionFunc *cb, void *opaque)
|
||||||
|
{
|
||||||
|
return bdrv_aio_writev(blk->bs, sector_num, iov, nb_sectors, cb, opaque);
|
||||||
|
}
|
||||||
|
|
||||||
|
BlockAIOCB *blk_aio_flush(BlockBackend *blk,
|
||||||
|
BlockCompletionFunc *cb, void *opaque)
|
||||||
|
{
|
||||||
|
return bdrv_aio_flush(blk->bs, cb, opaque);
|
||||||
|
}
|
||||||
|
|
||||||
|
BlockAIOCB *blk_aio_discard(BlockBackend *blk,
|
||||||
|
int64_t sector_num, int nb_sectors,
|
||||||
|
BlockCompletionFunc *cb, void *opaque)
|
||||||
|
{
|
||||||
|
return bdrv_aio_discard(blk->bs, sector_num, nb_sectors, cb, opaque);
|
||||||
|
}
|
||||||
|
|
||||||
|
void blk_aio_cancel(BlockAIOCB *acb)
|
||||||
|
{
|
||||||
|
bdrv_aio_cancel(acb);
|
||||||
|
}
|
||||||
|
|
||||||
|
void blk_aio_cancel_async(BlockAIOCB *acb)
|
||||||
|
{
|
||||||
|
bdrv_aio_cancel_async(acb);
|
||||||
|
}
|
||||||
|
|
||||||
|
int blk_aio_multiwrite(BlockBackend *blk, BlockRequest *reqs, int num_reqs)
|
||||||
|
{
|
||||||
|
return bdrv_aio_multiwrite(blk->bs, reqs, num_reqs);
|
||||||
|
}
|
||||||
|
|
||||||
|
int blk_ioctl(BlockBackend *blk, unsigned long int req, void *buf)
|
||||||
|
{
|
||||||
|
return bdrv_ioctl(blk->bs, req, buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
BlockAIOCB *blk_aio_ioctl(BlockBackend *blk, unsigned long int req, void *buf,
|
||||||
|
BlockCompletionFunc *cb, void *opaque)
|
||||||
|
{
|
||||||
|
return bdrv_aio_ioctl(blk->bs, req, buf, cb, opaque);
|
||||||
|
}
|
||||||
|
|
||||||
|
int blk_flush(BlockBackend *blk)
|
||||||
|
{
|
||||||
|
return bdrv_flush(blk->bs);
|
||||||
|
}
|
||||||
|
|
||||||
|
int blk_flush_all(void)
|
||||||
|
{
|
||||||
|
return bdrv_flush_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
void blk_drain_all(void)
|
||||||
|
{
|
||||||
|
bdrv_drain_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
BlockdevOnError blk_get_on_error(BlockBackend *blk, bool is_read)
|
||||||
|
{
|
||||||
|
return bdrv_get_on_error(blk->bs, is_read);
|
||||||
|
}
|
||||||
|
|
||||||
|
BlockErrorAction blk_get_error_action(BlockBackend *blk, bool is_read,
|
||||||
|
int error)
|
||||||
|
{
|
||||||
|
return bdrv_get_error_action(blk->bs, is_read, error);
|
||||||
|
}
|
||||||
|
|
||||||
|
void blk_error_action(BlockBackend *blk, BlockErrorAction action,
|
||||||
|
bool is_read, int error)
|
||||||
|
{
|
||||||
|
bdrv_error_action(blk->bs, action, is_read, error);
|
||||||
|
}
|
||||||
|
|
||||||
|
int blk_is_read_only(BlockBackend *blk)
|
||||||
|
{
|
||||||
|
return bdrv_is_read_only(blk->bs);
|
||||||
|
}
|
||||||
|
|
||||||
|
int blk_is_sg(BlockBackend *blk)
|
||||||
|
{
|
||||||
|
return bdrv_is_sg(blk->bs);
|
||||||
|
}
|
||||||
|
|
||||||
|
int blk_enable_write_cache(BlockBackend *blk)
|
||||||
|
{
|
||||||
|
return bdrv_enable_write_cache(blk->bs);
|
||||||
|
}
|
||||||
|
|
||||||
|
void blk_set_enable_write_cache(BlockBackend *blk, bool wce)
|
||||||
|
{
|
||||||
|
bdrv_set_enable_write_cache(blk->bs, wce);
|
||||||
|
}
|
||||||
|
|
||||||
|
int blk_is_inserted(BlockBackend *blk)
|
||||||
|
{
|
||||||
|
return bdrv_is_inserted(blk->bs);
|
||||||
|
}
|
||||||
|
|
||||||
|
void blk_lock_medium(BlockBackend *blk, bool locked)
|
||||||
|
{
|
||||||
|
bdrv_lock_medium(blk->bs, locked);
|
||||||
|
}
|
||||||
|
|
||||||
|
void blk_eject(BlockBackend *blk, bool eject_flag)
|
||||||
|
{
|
||||||
|
bdrv_eject(blk->bs, eject_flag);
|
||||||
|
}
|
||||||
|
|
||||||
|
int blk_get_flags(BlockBackend *blk)
|
||||||
|
{
|
||||||
|
return bdrv_get_flags(blk->bs);
|
||||||
|
}
|
||||||
|
|
||||||
|
void blk_set_guest_block_size(BlockBackend *blk, int align)
|
||||||
|
{
|
||||||
|
bdrv_set_guest_block_size(blk->bs, align);
|
||||||
|
}
|
||||||
|
|
||||||
|
void *blk_blockalign(BlockBackend *blk, size_t size)
|
||||||
|
{
|
||||||
|
return qemu_blockalign(blk ? blk->bs : NULL, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool blk_op_is_blocked(BlockBackend *blk, BlockOpType op, Error **errp)
|
||||||
|
{
|
||||||
|
return bdrv_op_is_blocked(blk->bs, op, errp);
|
||||||
|
}
|
||||||
|
|
||||||
|
void blk_op_unblock(BlockBackend *blk, BlockOpType op, Error *reason)
|
||||||
|
{
|
||||||
|
bdrv_op_unblock(blk->bs, op, reason);
|
||||||
|
}
|
||||||
|
|
||||||
|
void blk_op_block_all(BlockBackend *blk, Error *reason)
|
||||||
|
{
|
||||||
|
bdrv_op_block_all(blk->bs, reason);
|
||||||
|
}
|
||||||
|
|
||||||
|
void blk_op_unblock_all(BlockBackend *blk, Error *reason)
|
||||||
|
{
|
||||||
|
bdrv_op_unblock_all(blk->bs, reason);
|
||||||
|
}
|
||||||
|
|
||||||
|
AioContext *blk_get_aio_context(BlockBackend *blk)
|
||||||
|
{
|
||||||
|
return bdrv_get_aio_context(blk->bs);
|
||||||
|
}
|
||||||
|
|
||||||
|
void blk_set_aio_context(BlockBackend *blk, AioContext *new_context)
|
||||||
|
{
|
||||||
|
bdrv_set_aio_context(blk->bs, new_context);
|
||||||
|
}
|
||||||
|
|
||||||
|
void blk_io_plug(BlockBackend *blk)
|
||||||
|
{
|
||||||
|
bdrv_io_plug(blk->bs);
|
||||||
|
}
|
||||||
|
|
||||||
|
void blk_io_unplug(BlockBackend *blk)
|
||||||
|
{
|
||||||
|
bdrv_io_unplug(blk->bs);
|
||||||
|
}
|
||||||
|
|
||||||
|
BlockAcctStats *blk_get_stats(BlockBackend *blk)
|
||||||
|
{
|
||||||
|
return bdrv_get_stats(blk->bs);
|
||||||
|
}
|
||||||
|
|
||||||
|
void *blk_aio_get(const AIOCBInfo *aiocb_info, BlockBackend *blk,
|
||||||
|
BlockCompletionFunc *cb, void *opaque)
|
||||||
|
{
|
||||||
|
return qemu_aio_get(aiocb_info, blk_bs(blk), cb, opaque);
|
||||||
|
}
|
||||||
|
12
blockdev.c
12
blockdev.c
@ -111,10 +111,10 @@ void override_max_devs(BlockInterfaceType type, int max_devs)
|
|||||||
* automatic deletion, and generic qdev code calls blockdev_auto_del()
|
* automatic deletion, and generic qdev code calls blockdev_auto_del()
|
||||||
* when deletion is actually safe.
|
* when deletion is actually safe.
|
||||||
*/
|
*/
|
||||||
void blockdev_mark_auto_del(BlockDriverState *bs)
|
void blockdev_mark_auto_del(BlockBackend *blk)
|
||||||
{
|
{
|
||||||
BlockBackend *blk = bs->blk;
|
|
||||||
DriveInfo *dinfo = blk_legacy_dinfo(blk);
|
DriveInfo *dinfo = blk_legacy_dinfo(blk);
|
||||||
|
BlockDriverState *bs = blk_bs(blk);
|
||||||
|
|
||||||
if (dinfo && !dinfo->enable_auto_del) {
|
if (dinfo && !dinfo->enable_auto_del) {
|
||||||
return;
|
return;
|
||||||
@ -128,9 +128,8 @@ void blockdev_mark_auto_del(BlockDriverState *bs)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void blockdev_auto_del(BlockDriverState *bs)
|
void blockdev_auto_del(BlockBackend *blk)
|
||||||
{
|
{
|
||||||
BlockBackend *blk = bs->blk;
|
|
||||||
DriveInfo *dinfo = blk_legacy_dinfo(blk);
|
DriveInfo *dinfo = blk_legacy_dinfo(blk);
|
||||||
|
|
||||||
if (dinfo && dinfo->auto_del) {
|
if (dinfo && dinfo->auto_del) {
|
||||||
@ -266,11 +265,6 @@ DriveInfo *drive_get_next(BlockInterfaceType type)
|
|||||||
return drive_get(type, 0, next_block_unit[type]++);
|
return drive_get(type, 0, next_block_unit[type]++);
|
||||||
}
|
}
|
||||||
|
|
||||||
DriveInfo *drive_get_by_blockdev(BlockDriverState *bs)
|
|
||||||
{
|
|
||||||
return bs->blk ? blk_legacy_dinfo(bs->blk) : NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void bdrv_format_print(void *opaque, const char *name)
|
static void bdrv_format_print(void *opaque, const char *name)
|
||||||
{
|
{
|
||||||
error_printf(" %s", name);
|
error_printf(" %s", name);
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
* (GNU GPL), version 2 or later.
|
* (GNU GPL), version 2 or later.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "sysemu/block-backend.h"
|
||||||
#include "sysemu/dma.h"
|
#include "sysemu/dma.h"
|
||||||
#include "trace.h"
|
#include "trace.h"
|
||||||
#include "qemu/range.h"
|
#include "qemu/range.h"
|
||||||
@ -68,7 +69,7 @@ void qemu_sglist_destroy(QEMUSGList *qsg)
|
|||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
BlockAIOCB common;
|
BlockAIOCB common;
|
||||||
BlockDriverState *bs;
|
BlockBackend *blk;
|
||||||
BlockAIOCB *acb;
|
BlockAIOCB *acb;
|
||||||
QEMUSGList *sg;
|
QEMUSGList *sg;
|
||||||
uint64_t sector_num;
|
uint64_t sector_num;
|
||||||
@ -80,7 +81,7 @@ typedef struct {
|
|||||||
DMAIOFunc *io_func;
|
DMAIOFunc *io_func;
|
||||||
} DMAAIOCB;
|
} DMAAIOCB;
|
||||||
|
|
||||||
static void dma_bdrv_cb(void *opaque, int ret);
|
static void dma_blk_cb(void *opaque, int ret);
|
||||||
|
|
||||||
static void reschedule_dma(void *opaque)
|
static void reschedule_dma(void *opaque)
|
||||||
{
|
{
|
||||||
@ -88,7 +89,7 @@ static void reschedule_dma(void *opaque)
|
|||||||
|
|
||||||
qemu_bh_delete(dbs->bh);
|
qemu_bh_delete(dbs->bh);
|
||||||
dbs->bh = NULL;
|
dbs->bh = NULL;
|
||||||
dma_bdrv_cb(dbs, 0);
|
dma_blk_cb(dbs, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void continue_after_map_failure(void *opaque)
|
static void continue_after_map_failure(void *opaque)
|
||||||
@ -99,7 +100,7 @@ static void continue_after_map_failure(void *opaque)
|
|||||||
qemu_bh_schedule(dbs->bh);
|
qemu_bh_schedule(dbs->bh);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dma_bdrv_unmap(DMAAIOCB *dbs)
|
static void dma_blk_unmap(DMAAIOCB *dbs)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@ -115,7 +116,7 @@ static void dma_complete(DMAAIOCB *dbs, int ret)
|
|||||||
{
|
{
|
||||||
trace_dma_complete(dbs, ret, dbs->common.cb);
|
trace_dma_complete(dbs, ret, dbs->common.cb);
|
||||||
|
|
||||||
dma_bdrv_unmap(dbs);
|
dma_blk_unmap(dbs);
|
||||||
if (dbs->common.cb) {
|
if (dbs->common.cb) {
|
||||||
dbs->common.cb(dbs->common.opaque, ret);
|
dbs->common.cb(dbs->common.opaque, ret);
|
||||||
}
|
}
|
||||||
@ -127,13 +128,13 @@ static void dma_complete(DMAAIOCB *dbs, int ret)
|
|||||||
qemu_aio_unref(dbs);
|
qemu_aio_unref(dbs);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dma_bdrv_cb(void *opaque, int ret)
|
static void dma_blk_cb(void *opaque, int ret)
|
||||||
{
|
{
|
||||||
DMAAIOCB *dbs = (DMAAIOCB *)opaque;
|
DMAAIOCB *dbs = (DMAAIOCB *)opaque;
|
||||||
dma_addr_t cur_addr, cur_len;
|
dma_addr_t cur_addr, cur_len;
|
||||||
void *mem;
|
void *mem;
|
||||||
|
|
||||||
trace_dma_bdrv_cb(dbs, ret);
|
trace_dma_blk_cb(dbs, ret);
|
||||||
|
|
||||||
dbs->acb = NULL;
|
dbs->acb = NULL;
|
||||||
dbs->sector_num += dbs->iov.size / 512;
|
dbs->sector_num += dbs->iov.size / 512;
|
||||||
@ -142,7 +143,7 @@ static void dma_bdrv_cb(void *opaque, int ret)
|
|||||||
dma_complete(dbs, ret);
|
dma_complete(dbs, ret);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
dma_bdrv_unmap(dbs);
|
dma_blk_unmap(dbs);
|
||||||
|
|
||||||
while (dbs->sg_cur_index < dbs->sg->nsg) {
|
while (dbs->sg_cur_index < dbs->sg->nsg) {
|
||||||
cur_addr = dbs->sg->sg[dbs->sg_cur_index].base + dbs->sg_cur_byte;
|
cur_addr = dbs->sg->sg[dbs->sg_cur_index].base + dbs->sg_cur_byte;
|
||||||
@ -168,8 +169,8 @@ static void dma_bdrv_cb(void *opaque, int ret)
|
|||||||
qemu_iovec_discard_back(&dbs->iov, dbs->iov.size & ~BDRV_SECTOR_MASK);
|
qemu_iovec_discard_back(&dbs->iov, dbs->iov.size & ~BDRV_SECTOR_MASK);
|
||||||
}
|
}
|
||||||
|
|
||||||
dbs->acb = dbs->io_func(dbs->bs, dbs->sector_num, &dbs->iov,
|
dbs->acb = dbs->io_func(dbs->blk, dbs->sector_num, &dbs->iov,
|
||||||
dbs->iov.size / 512, dma_bdrv_cb, dbs);
|
dbs->iov.size / 512, dma_blk_cb, dbs);
|
||||||
assert(dbs->acb);
|
assert(dbs->acb);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -180,7 +181,7 @@ static void dma_aio_cancel(BlockAIOCB *acb)
|
|||||||
trace_dma_aio_cancel(dbs);
|
trace_dma_aio_cancel(dbs);
|
||||||
|
|
||||||
if (dbs->acb) {
|
if (dbs->acb) {
|
||||||
bdrv_aio_cancel_async(dbs->acb);
|
blk_aio_cancel_async(dbs->acb);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -190,17 +191,17 @@ static const AIOCBInfo dma_aiocb_info = {
|
|||||||
.cancel_async = dma_aio_cancel,
|
.cancel_async = dma_aio_cancel,
|
||||||
};
|
};
|
||||||
|
|
||||||
BlockAIOCB *dma_bdrv_io(
|
BlockAIOCB *dma_blk_io(
|
||||||
BlockDriverState *bs, QEMUSGList *sg, uint64_t sector_num,
|
BlockBackend *blk, QEMUSGList *sg, uint64_t sector_num,
|
||||||
DMAIOFunc *io_func, BlockCompletionFunc *cb,
|
DMAIOFunc *io_func, BlockCompletionFunc *cb,
|
||||||
void *opaque, DMADirection dir)
|
void *opaque, DMADirection dir)
|
||||||
{
|
{
|
||||||
DMAAIOCB *dbs = qemu_aio_get(&dma_aiocb_info, bs, cb, opaque);
|
DMAAIOCB *dbs = blk_aio_get(&dma_aiocb_info, blk, cb, opaque);
|
||||||
|
|
||||||
trace_dma_bdrv_io(dbs, bs, sector_num, (dir == DMA_DIRECTION_TO_DEVICE));
|
trace_dma_blk_io(dbs, blk, sector_num, (dir == DMA_DIRECTION_TO_DEVICE));
|
||||||
|
|
||||||
dbs->acb = NULL;
|
dbs->acb = NULL;
|
||||||
dbs->bs = bs;
|
dbs->blk = blk;
|
||||||
dbs->sg = sg;
|
dbs->sg = sg;
|
||||||
dbs->sector_num = sector_num;
|
dbs->sector_num = sector_num;
|
||||||
dbs->sg_cur_index = 0;
|
dbs->sg_cur_index = 0;
|
||||||
@ -209,25 +210,25 @@ BlockAIOCB *dma_bdrv_io(
|
|||||||
dbs->io_func = io_func;
|
dbs->io_func = io_func;
|
||||||
dbs->bh = NULL;
|
dbs->bh = NULL;
|
||||||
qemu_iovec_init(&dbs->iov, sg->nsg);
|
qemu_iovec_init(&dbs->iov, sg->nsg);
|
||||||
dma_bdrv_cb(dbs, 0);
|
dma_blk_cb(dbs, 0);
|
||||||
return &dbs->common;
|
return &dbs->common;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
BlockAIOCB *dma_bdrv_read(BlockDriverState *bs,
|
BlockAIOCB *dma_blk_read(BlockBackend *blk,
|
||||||
|
QEMUSGList *sg, uint64_t sector,
|
||||||
|
void (*cb)(void *opaque, int ret), void *opaque)
|
||||||
|
{
|
||||||
|
return dma_blk_io(blk, sg, sector, blk_aio_readv, cb, opaque,
|
||||||
|
DMA_DIRECTION_FROM_DEVICE);
|
||||||
|
}
|
||||||
|
|
||||||
|
BlockAIOCB *dma_blk_write(BlockBackend *blk,
|
||||||
QEMUSGList *sg, uint64_t sector,
|
QEMUSGList *sg, uint64_t sector,
|
||||||
void (*cb)(void *opaque, int ret), void *opaque)
|
void (*cb)(void *opaque, int ret), void *opaque)
|
||||||
{
|
{
|
||||||
return dma_bdrv_io(bs, sg, sector, bdrv_aio_readv, cb, opaque,
|
return dma_blk_io(blk, sg, sector, blk_aio_writev, cb, opaque,
|
||||||
DMA_DIRECTION_FROM_DEVICE);
|
DMA_DIRECTION_TO_DEVICE);
|
||||||
}
|
|
||||||
|
|
||||||
BlockAIOCB *dma_bdrv_write(BlockDriverState *bs,
|
|
||||||
QEMUSGList *sg, uint64_t sector,
|
|
||||||
void (*cb)(void *opaque, int ret), void *opaque)
|
|
||||||
{
|
|
||||||
return dma_bdrv_io(bs, sg, sector, bdrv_aio_writev, cb, opaque,
|
|
||||||
DMA_DIRECTION_TO_DEVICE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -262,8 +263,8 @@ uint64_t dma_buf_write(uint8_t *ptr, int32_t len, QEMUSGList *sg)
|
|||||||
return dma_buf_rw(ptr, len, sg, DMA_DIRECTION_TO_DEVICE);
|
return dma_buf_rw(ptr, len, sg, DMA_DIRECTION_TO_DEVICE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void dma_acct_start(BlockDriverState *bs, BlockAcctCookie *cookie,
|
void dma_acct_start(BlockBackend *blk, BlockAcctCookie *cookie,
|
||||||
QEMUSGList *sg, enum BlockAcctType type)
|
QEMUSGList *sg, enum BlockAcctType type)
|
||||||
{
|
{
|
||||||
block_acct_start(bdrv_get_stats(bs), cookie, sg->size, type);
|
block_acct_start(blk_get_stats(blk), cookie, sg->size, type);
|
||||||
}
|
}
|
||||||
|
@ -16,7 +16,6 @@
|
|||||||
#include "hw/arm/arm.h"
|
#include "hw/arm/arm.h"
|
||||||
#include "hw/block/flash.h"
|
#include "hw/block/flash.h"
|
||||||
#include "sysemu/block-backend.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "sysemu/blockdev.h"
|
|
||||||
#include "exec/address-spaces.h"
|
#include "exec/address-spaces.h"
|
||||||
|
|
||||||
static struct arm_boot_info collie_binfo = {
|
static struct arm_boot_info collie_binfo = {
|
||||||
@ -42,12 +41,12 @@ static void collie_init(MachineState *machine)
|
|||||||
|
|
||||||
dinfo = drive_get(IF_PFLASH, 0, 0);
|
dinfo = drive_get(IF_PFLASH, 0, 0);
|
||||||
pflash_cfi01_register(SA_CS0, NULL, "collie.fl1", 0x02000000,
|
pflash_cfi01_register(SA_CS0, NULL, "collie.fl1", 0x02000000,
|
||||||
dinfo ? blk_bs(blk_by_legacy_dinfo(dinfo)) : NULL,
|
dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
|
||||||
(64 * 1024), 512, 4, 0x00, 0x00, 0x00, 0x00, 0);
|
(64 * 1024), 512, 4, 0x00, 0x00, 0x00, 0x00, 0);
|
||||||
|
|
||||||
dinfo = drive_get(IF_PFLASH, 0, 1);
|
dinfo = drive_get(IF_PFLASH, 0, 1);
|
||||||
pflash_cfi01_register(SA_CS1, NULL, "collie.fl2", 0x02000000,
|
pflash_cfi01_register(SA_CS1, NULL, "collie.fl2", 0x02000000,
|
||||||
dinfo ? blk_bs(blk_by_legacy_dinfo(dinfo)) : NULL,
|
dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
|
||||||
(64 * 1024), 512, 4, 0x00, 0x00, 0x00, 0x00, 0);
|
(64 * 1024), 512, 4, 0x00, 0x00, 0x00, 0x00, 0);
|
||||||
|
|
||||||
sysbus_create_simple("scoop", 0x40800000, NULL);
|
sysbus_create_simple("scoop", 0x40800000, NULL);
|
||||||
|
@ -41,7 +41,6 @@
|
|||||||
#include "hw/devices.h"
|
#include "hw/devices.h"
|
||||||
#include "hw/boards.h"
|
#include "hw/boards.h"
|
||||||
#include "sysemu/block-backend.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "sysemu/blockdev.h"
|
|
||||||
#include "exec/address-spaces.h"
|
#include "exec/address-spaces.h"
|
||||||
#include "sysemu/qtest.h"
|
#include "sysemu/qtest.h"
|
||||||
|
|
||||||
@ -72,7 +71,7 @@ static void connex_init(MachineState *machine)
|
|||||||
be = 0;
|
be = 0;
|
||||||
#endif
|
#endif
|
||||||
if (!pflash_cfi01_register(0x00000000, NULL, "connext.rom", connex_rom,
|
if (!pflash_cfi01_register(0x00000000, NULL, "connext.rom", connex_rom,
|
||||||
dinfo ? blk_bs(blk_by_legacy_dinfo(dinfo)) : NULL,
|
dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
|
||||||
sector_len, connex_rom / sector_len,
|
sector_len, connex_rom / sector_len,
|
||||||
2, 0, 0, 0, 0, be)) {
|
2, 0, 0, 0, 0, be)) {
|
||||||
fprintf(stderr, "qemu: Error registering flash memory.\n");
|
fprintf(stderr, "qemu: Error registering flash memory.\n");
|
||||||
@ -110,7 +109,7 @@ static void verdex_init(MachineState *machine)
|
|||||||
be = 0;
|
be = 0;
|
||||||
#endif
|
#endif
|
||||||
if (!pflash_cfi01_register(0x00000000, NULL, "verdex.rom", verdex_rom,
|
if (!pflash_cfi01_register(0x00000000, NULL, "verdex.rom", verdex_rom,
|
||||||
dinfo ? blk_bs(blk_by_legacy_dinfo(dinfo)) : NULL,
|
dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
|
||||||
sector_len, verdex_rom / sector_len,
|
sector_len, verdex_rom / sector_len,
|
||||||
2, 0, 0, 0, 0, be)) {
|
2, 0, 0, 0, 0, be)) {
|
||||||
fprintf(stderr, "qemu: Error registering flash memory.\n");
|
fprintf(stderr, "qemu: Error registering flash memory.\n");
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
#include "net/net.h"
|
#include "net/net.h"
|
||||||
#include "sysemu/sysemu.h"
|
#include "sysemu/sysemu.h"
|
||||||
#include "hw/boards.h"
|
#include "hw/boards.h"
|
||||||
#include "sysemu/blockdev.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "exec/address-spaces.h"
|
#include "exec/address-spaces.h"
|
||||||
#include "qemu/error-report.h"
|
#include "qemu/error-report.h"
|
||||||
|
|
||||||
|
@ -149,7 +149,7 @@ static void mainstone_common_init(MemoryRegion *address_space_mem,
|
|||||||
if (!pflash_cfi01_register(mainstone_flash_base[i], NULL,
|
if (!pflash_cfi01_register(mainstone_flash_base[i], NULL,
|
||||||
i ? "mainstone.flash1" : "mainstone.flash0",
|
i ? "mainstone.flash1" : "mainstone.flash0",
|
||||||
MAINSTONE_FLASH,
|
MAINSTONE_FLASH,
|
||||||
blk_bs(blk_by_legacy_dinfo(dinfo)),
|
blk_by_legacy_dinfo(dinfo),
|
||||||
sector_len, MAINSTONE_FLASH / sector_len,
|
sector_len, MAINSTONE_FLASH / sector_len,
|
||||||
4, 0, 0, 0, 0, be)) {
|
4, 0, 0, 0, 0, be)) {
|
||||||
fprintf(stderr, "qemu: Error registering flash memory.\n");
|
fprintf(stderr, "qemu: Error registering flash memory.\n");
|
||||||
|
@ -18,12 +18,10 @@
|
|||||||
#include "hw/char/serial.h"
|
#include "hw/char/serial.h"
|
||||||
#include "qemu/timer.h"
|
#include "qemu/timer.h"
|
||||||
#include "hw/ptimer.h"
|
#include "hw/ptimer.h"
|
||||||
#include "block/block.h"
|
|
||||||
#include "hw/block/flash.h"
|
#include "hw/block/flash.h"
|
||||||
#include "ui/console.h"
|
#include "ui/console.h"
|
||||||
#include "hw/i2c/i2c.h"
|
#include "hw/i2c/i2c.h"
|
||||||
#include "sysemu/block-backend.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "sysemu/blockdev.h"
|
|
||||||
#include "exec/address-spaces.h"
|
#include "exec/address-spaces.h"
|
||||||
#include "ui/pixel_ops.h"
|
#include "ui/pixel_ops.h"
|
||||||
|
|
||||||
@ -1633,9 +1631,9 @@ static void musicpal_init(MachineState *machine)
|
|||||||
/* Register flash */
|
/* Register flash */
|
||||||
dinfo = drive_get(IF_PFLASH, 0, 0);
|
dinfo = drive_get(IF_PFLASH, 0, 0);
|
||||||
if (dinfo) {
|
if (dinfo) {
|
||||||
BlockDriverState *bs = blk_bs(blk_by_legacy_dinfo(dinfo));
|
BlockBackend *blk = blk_by_legacy_dinfo(dinfo);
|
||||||
|
|
||||||
flash_size = bdrv_getlength(bs);
|
flash_size = blk_getlength(blk);
|
||||||
if (flash_size != 8*1024*1024 && flash_size != 16*1024*1024 &&
|
if (flash_size != 8*1024*1024 && flash_size != 16*1024*1024 &&
|
||||||
flash_size != 32*1024*1024) {
|
flash_size != 32*1024*1024) {
|
||||||
fprintf(stderr, "Invalid flash image size\n");
|
fprintf(stderr, "Invalid flash image size\n");
|
||||||
@ -1650,14 +1648,14 @@ static void musicpal_init(MachineState *machine)
|
|||||||
#ifdef TARGET_WORDS_BIGENDIAN
|
#ifdef TARGET_WORDS_BIGENDIAN
|
||||||
pflash_cfi02_register(0x100000000ULL-MP_FLASH_SIZE_MAX, NULL,
|
pflash_cfi02_register(0x100000000ULL-MP_FLASH_SIZE_MAX, NULL,
|
||||||
"musicpal.flash", flash_size,
|
"musicpal.flash", flash_size,
|
||||||
bs, 0x10000, (flash_size + 0xffff) >> 16,
|
blk, 0x10000, (flash_size + 0xffff) >> 16,
|
||||||
MP_FLASH_SIZE_MAX / flash_size,
|
MP_FLASH_SIZE_MAX / flash_size,
|
||||||
2, 0x00BF, 0x236D, 0x0000, 0x0000,
|
2, 0x00BF, 0x236D, 0x0000, 0x0000,
|
||||||
0x5555, 0x2AAA, 1);
|
0x5555, 0x2AAA, 1);
|
||||||
#else
|
#else
|
||||||
pflash_cfi02_register(0x100000000ULL-MP_FLASH_SIZE_MAX, NULL,
|
pflash_cfi02_register(0x100000000ULL-MP_FLASH_SIZE_MAX, NULL,
|
||||||
"musicpal.flash", flash_size,
|
"musicpal.flash", flash_size,
|
||||||
bs, 0x10000, (flash_size + 0xffff) >> 16,
|
blk, 0x10000, (flash_size + 0xffff) >> 16,
|
||||||
MP_FLASH_SIZE_MAX / flash_size,
|
MP_FLASH_SIZE_MAX / flash_size,
|
||||||
2, 0x00BF, 0x236D, 0x0000, 0x0000,
|
2, 0x00BF, 0x236D, 0x0000, 0x0000,
|
||||||
0x5555, 0x2AAA, 0);
|
0x5555, 0x2AAA, 0);
|
||||||
|
@ -32,7 +32,6 @@
|
|||||||
#include "hw/bt.h"
|
#include "hw/bt.h"
|
||||||
#include "hw/loader.h"
|
#include "hw/loader.h"
|
||||||
#include "sysemu/block-backend.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "sysemu/blockdev.h"
|
|
||||||
#include "hw/sysbus.h"
|
#include "hw/sysbus.h"
|
||||||
#include "exec/address-spaces.h"
|
#include "exec/address-spaces.h"
|
||||||
|
|
||||||
@ -175,7 +174,7 @@ static void n8x0_nand_setup(struct n800_s *s)
|
|||||||
dinfo = drive_get(IF_MTD, 0, 0);
|
dinfo = drive_get(IF_MTD, 0, 0);
|
||||||
if (dinfo) {
|
if (dinfo) {
|
||||||
qdev_prop_set_drive_nofail(s->nand, "drive",
|
qdev_prop_set_drive_nofail(s->nand, "drive",
|
||||||
blk_bs(blk_by_legacy_dinfo(dinfo)));
|
blk_by_legacy_dinfo(dinfo));
|
||||||
}
|
}
|
||||||
qdev_init_nofail(s->nand);
|
qdev_init_nofail(s->nand);
|
||||||
sysbus_connect_irq(SYS_BUS_DEVICE(s->nand), 0,
|
sysbus_connect_irq(SYS_BUS_DEVICE(s->nand), 0,
|
||||||
|
@ -3980,7 +3980,7 @@ struct omap_mpu_state_s *omap310_mpu_init(MemoryRegion *system_memory,
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
s->mmc = omap_mmc_init(0xfffb7800, system_memory,
|
s->mmc = omap_mmc_init(0xfffb7800, system_memory,
|
||||||
blk_bs(blk_by_legacy_dinfo(dinfo)),
|
blk_by_legacy_dinfo(dinfo),
|
||||||
qdev_get_gpio_in(s->ih[1], OMAP_INT_OQN),
|
qdev_get_gpio_in(s->ih[1], OMAP_INT_OQN),
|
||||||
&s->drq[OMAP_DMA_MMC_TX],
|
&s->drq[OMAP_DMA_MMC_TX],
|
||||||
omap_findclk(s, "mmc_ck"));
|
omap_findclk(s, "mmc_ck"));
|
||||||
|
@ -2463,7 +2463,7 @@ struct omap_mpu_state_s *omap2420_mpu_init(MemoryRegion *sysmem,
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
s->mmc = omap2_mmc_init(omap_l4tao(s->l4, 9),
|
s->mmc = omap2_mmc_init(omap_l4tao(s->l4, 9),
|
||||||
blk_bs(blk_by_legacy_dinfo(dinfo)),
|
blk_by_legacy_dinfo(dinfo),
|
||||||
qdev_get_gpio_in(s->ih[0], OMAP_INT_24XX_MMC_IRQ),
|
qdev_get_gpio_in(s->ih[0], OMAP_INT_24XX_MMC_IRQ),
|
||||||
&s->drq[OMAP24XX_DMA_MMC1_TX],
|
&s->drq[OMAP24XX_DMA_MMC1_TX],
|
||||||
omap_findclk(s, "mmc_fclk"), omap_findclk(s, "mmc_iclk"));
|
omap_findclk(s, "mmc_fclk"), omap_findclk(s, "mmc_iclk"));
|
||||||
|
@ -32,7 +32,6 @@
|
|||||||
#include "hw/arm/arm.h"
|
#include "hw/arm/arm.h"
|
||||||
#include "hw/block/flash.h"
|
#include "hw/block/flash.h"
|
||||||
#include "sysemu/block-backend.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "sysemu/blockdev.h"
|
|
||||||
#include "sysemu/qtest.h"
|
#include "sysemu/qtest.h"
|
||||||
#include "exec/address-spaces.h"
|
#include "exec/address-spaces.h"
|
||||||
|
|
||||||
@ -155,7 +154,7 @@ static void sx1_init(MachineState *machine, const int version)
|
|||||||
if ((dinfo = drive_get(IF_PFLASH, 0, fl_idx)) != NULL) {
|
if ((dinfo = drive_get(IF_PFLASH, 0, fl_idx)) != NULL) {
|
||||||
if (!pflash_cfi01_register(OMAP_CS0_BASE, NULL,
|
if (!pflash_cfi01_register(OMAP_CS0_BASE, NULL,
|
||||||
"omap_sx1.flash0-1", flash_size,
|
"omap_sx1.flash0-1", flash_size,
|
||||||
blk_bs(blk_by_legacy_dinfo(dinfo)),
|
blk_by_legacy_dinfo(dinfo),
|
||||||
sector_size, flash_size / sector_size,
|
sector_size, flash_size / sector_size,
|
||||||
4, 0, 0, 0, 0, be)) {
|
4, 0, 0, 0, 0, be)) {
|
||||||
fprintf(stderr, "qemu: Error registering flash memory %d.\n",
|
fprintf(stderr, "qemu: Error registering flash memory %d.\n",
|
||||||
@ -179,7 +178,7 @@ static void sx1_init(MachineState *machine, const int version)
|
|||||||
|
|
||||||
if (!pflash_cfi01_register(OMAP_CS1_BASE, NULL,
|
if (!pflash_cfi01_register(OMAP_CS1_BASE, NULL,
|
||||||
"omap_sx1.flash1-1", flash1_size,
|
"omap_sx1.flash1-1", flash1_size,
|
||||||
blk_bs(blk_by_legacy_dinfo(dinfo)),
|
blk_by_legacy_dinfo(dinfo),
|
||||||
sector_size, flash1_size / sector_size,
|
sector_size, flash1_size / sector_size,
|
||||||
4, 0, 0, 0, 0, be)) {
|
4, 0, 0, 0, 0, be)) {
|
||||||
fprintf(stderr, "qemu: Error registering flash memory %d.\n",
|
fprintf(stderr, "qemu: Error registering flash memory %d.\n",
|
||||||
|
@ -2087,7 +2087,7 @@ PXA2xxState *pxa270_init(MemoryRegion *address_space,
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
s->mmc = pxa2xx_mmci_init(address_space, 0x41100000,
|
s->mmc = pxa2xx_mmci_init(address_space, 0x41100000,
|
||||||
blk_bs(blk_by_legacy_dinfo(dinfo)),
|
blk_by_legacy_dinfo(dinfo),
|
||||||
qdev_get_gpio_in(s->pic, PXA2XX_PIC_MMC),
|
qdev_get_gpio_in(s->pic, PXA2XX_PIC_MMC),
|
||||||
qdev_get_gpio_in(s->dma, PXA2XX_RX_RQ_MMCI),
|
qdev_get_gpio_in(s->dma, PXA2XX_RX_RQ_MMCI),
|
||||||
qdev_get_gpio_in(s->dma, PXA2XX_TX_RQ_MMCI));
|
qdev_get_gpio_in(s->dma, PXA2XX_TX_RQ_MMCI));
|
||||||
@ -2220,7 +2220,7 @@ PXA2xxState *pxa255_init(MemoryRegion *address_space, unsigned int sdram_size)
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
s->mmc = pxa2xx_mmci_init(address_space, 0x41100000,
|
s->mmc = pxa2xx_mmci_init(address_space, 0x41100000,
|
||||||
blk_bs(blk_by_legacy_dinfo(dinfo)),
|
blk_by_legacy_dinfo(dinfo),
|
||||||
qdev_get_gpio_in(s->pic, PXA2XX_PIC_MMC),
|
qdev_get_gpio_in(s->pic, PXA2XX_PIC_MMC),
|
||||||
qdev_get_gpio_in(s->dma, PXA2XX_RX_RQ_MMCI),
|
qdev_get_gpio_in(s->dma, PXA2XX_RX_RQ_MMCI),
|
||||||
qdev_get_gpio_in(s->dma, PXA2XX_TX_RQ_MMCI));
|
qdev_get_gpio_in(s->dma, PXA2XX_TX_RQ_MMCI));
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
#include "sysemu/sysemu.h"
|
#include "sysemu/sysemu.h"
|
||||||
#include "hw/boards.h"
|
#include "hw/boards.h"
|
||||||
#include "hw/i2c/i2c.h"
|
#include "hw/i2c/i2c.h"
|
||||||
#include "sysemu/blockdev.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "exec/address-spaces.h"
|
#include "exec/address-spaces.h"
|
||||||
#include "qemu/error-report.h"
|
#include "qemu/error-report.h"
|
||||||
|
|
||||||
|
@ -22,11 +22,9 @@
|
|||||||
#include "hw/devices.h"
|
#include "hw/devices.h"
|
||||||
#include "hw/arm/sharpsl.h"
|
#include "hw/arm/sharpsl.h"
|
||||||
#include "ui/console.h"
|
#include "ui/console.h"
|
||||||
#include "block/block.h"
|
|
||||||
#include "audio/audio.h"
|
#include "audio/audio.h"
|
||||||
#include "hw/boards.h"
|
#include "hw/boards.h"
|
||||||
#include "sysemu/block-backend.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "sysemu/blockdev.h"
|
|
||||||
#include "hw/sysbus.h"
|
#include "hw/sysbus.h"
|
||||||
#include "exec/address-spaces.h"
|
#include "exec/address-spaces.h"
|
||||||
|
|
||||||
@ -171,7 +169,7 @@ static int sl_nand_init(SysBusDevice *dev)
|
|||||||
|
|
||||||
s->ctl = 0;
|
s->ctl = 0;
|
||||||
nand = drive_get(IF_MTD, 0, 0);
|
nand = drive_get(IF_MTD, 0, 0);
|
||||||
s->nand = nand_init(nand ? blk_bs(blk_by_legacy_dinfo(nand)) : NULL,
|
s->nand = nand_init(nand ? blk_by_legacy_dinfo(nand) : NULL,
|
||||||
s->manf_id, s->chip_id);
|
s->manf_id, s->chip_id);
|
||||||
|
|
||||||
memory_region_init_io(&s->iomem, OBJECT(s), &sl_ops, s, "sl", 0x40);
|
memory_region_init_io(&s->iomem, OBJECT(s), &sl_ops, s, "sl", 0x40);
|
||||||
|
@ -17,11 +17,10 @@
|
|||||||
#include "hw/devices.h"
|
#include "hw/devices.h"
|
||||||
#include "hw/arm/sharpsl.h"
|
#include "hw/arm/sharpsl.h"
|
||||||
#include "hw/pcmcia.h"
|
#include "hw/pcmcia.h"
|
||||||
#include "block/block.h"
|
|
||||||
#include "hw/boards.h"
|
#include "hw/boards.h"
|
||||||
#include "hw/i2c/i2c.h"
|
#include "hw/i2c/i2c.h"
|
||||||
#include "hw/ssi.h"
|
#include "hw/ssi.h"
|
||||||
#include "sysemu/blockdev.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "hw/sysbus.h"
|
#include "hw/sysbus.h"
|
||||||
#include "exec/address-spaces.h"
|
#include "exec/address-spaces.h"
|
||||||
|
|
||||||
|
@ -16,7 +16,6 @@
|
|||||||
#include "hw/i2c/i2c.h"
|
#include "hw/i2c/i2c.h"
|
||||||
#include "hw/boards.h"
|
#include "hw/boards.h"
|
||||||
#include "sysemu/block-backend.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "sysemu/blockdev.h"
|
|
||||||
#include "exec/address-spaces.h"
|
#include "exec/address-spaces.h"
|
||||||
#include "hw/block/flash.h"
|
#include "hw/block/flash.h"
|
||||||
|
|
||||||
@ -340,7 +339,7 @@ static void versatile_init(MachineState *machine, int board_id)
|
|||||||
dinfo = drive_get(IF_PFLASH, 0, 0);
|
dinfo = drive_get(IF_PFLASH, 0, 0);
|
||||||
if (!pflash_cfi01_register(VERSATILE_FLASH_ADDR, NULL, "versatile.flash",
|
if (!pflash_cfi01_register(VERSATILE_FLASH_ADDR, NULL, "versatile.flash",
|
||||||
VERSATILE_FLASH_SIZE,
|
VERSATILE_FLASH_SIZE,
|
||||||
dinfo ? blk_bs(blk_by_legacy_dinfo(dinfo)) : NULL,
|
dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
|
||||||
VERSATILE_FLASH_SECT_SIZE,
|
VERSATILE_FLASH_SECT_SIZE,
|
||||||
VERSATILE_FLASH_SIZE / VERSATILE_FLASH_SECT_SIZE,
|
VERSATILE_FLASH_SIZE / VERSATILE_FLASH_SECT_SIZE,
|
||||||
4, 0x0089, 0x0018, 0x0000, 0x0, 0)) {
|
4, 0x0089, 0x0018, 0x0000, 0x0, 0)) {
|
||||||
|
@ -31,7 +31,6 @@
|
|||||||
#include "hw/loader.h"
|
#include "hw/loader.h"
|
||||||
#include "exec/address-spaces.h"
|
#include "exec/address-spaces.h"
|
||||||
#include "sysemu/block-backend.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "sysemu/blockdev.h"
|
|
||||||
#include "hw/block/flash.h"
|
#include "hw/block/flash.h"
|
||||||
#include "sysemu/device_tree.h"
|
#include "sysemu/device_tree.h"
|
||||||
#include "qemu/error-report.h"
|
#include "qemu/error-report.h"
|
||||||
@ -493,7 +492,7 @@ static pflash_t *ve_pflash_cfi01_register(hwaddr base, const char *name,
|
|||||||
DeviceState *dev = qdev_create(NULL, "cfi.pflash01");
|
DeviceState *dev = qdev_create(NULL, "cfi.pflash01");
|
||||||
|
|
||||||
if (di && qdev_prop_set_drive(dev, "drive",
|
if (di && qdev_prop_set_drive(dev, "drive",
|
||||||
blk_bs(blk_by_legacy_dinfo(di)))) {
|
blk_by_legacy_dinfo(di))) {
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -452,7 +452,7 @@ static void create_one_flash(const char *name, hwaddr flashbase,
|
|||||||
const uint64_t sectorlength = 256 * 1024;
|
const uint64_t sectorlength = 256 * 1024;
|
||||||
|
|
||||||
if (dinfo && qdev_prop_set_drive(dev, "drive",
|
if (dinfo && qdev_prop_set_drive(dev, "drive",
|
||||||
blk_bs(blk_by_legacy_dinfo(dinfo)))) {
|
blk_by_legacy_dinfo(dinfo))) {
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -23,7 +23,6 @@
|
|||||||
#include "hw/boards.h"
|
#include "hw/boards.h"
|
||||||
#include "hw/block/flash.h"
|
#include "hw/block/flash.h"
|
||||||
#include "sysemu/block-backend.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "sysemu/blockdev.h"
|
|
||||||
#include "hw/loader.h"
|
#include "hw/loader.h"
|
||||||
#include "hw/ssi.h"
|
#include "hw/ssi.h"
|
||||||
#include "qemu/error-report.h"
|
#include "qemu/error-report.h"
|
||||||
@ -165,7 +164,7 @@ static void zynq_init(MachineState *machine)
|
|||||||
|
|
||||||
/* AMD */
|
/* AMD */
|
||||||
pflash_cfi02_register(0xe2000000, NULL, "zynq.pflash", FLASH_SIZE,
|
pflash_cfi02_register(0xe2000000, NULL, "zynq.pflash", FLASH_SIZE,
|
||||||
dinfo ? blk_bs(blk_by_legacy_dinfo(dinfo)) : NULL,
|
dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
|
||||||
FLASH_SECTOR_SIZE,
|
FLASH_SECTOR_SIZE,
|
||||||
FLASH_SIZE/FLASH_SECTOR_SIZE, 1,
|
FLASH_SIZE/FLASH_SECTOR_SIZE, 1,
|
||||||
1, 0x0066, 0x0022, 0x0000, 0x0000, 0x0555, 0x2aa,
|
1, 0x0066, 0x0022, 0x0000, 0x0000, 0x0555, 0x2aa,
|
||||||
|
@ -21,7 +21,6 @@
|
|||||||
#include "sysemu/sysemu.h"
|
#include "sysemu/sysemu.h"
|
||||||
#include "hw/block/flash.h"
|
#include "hw/block/flash.h"
|
||||||
#include "sysemu/block-backend.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "sysemu/blockdev.h"
|
|
||||||
#include "ui/console.h"
|
#include "ui/console.h"
|
||||||
#include "audio/audio.h"
|
#include "audio/audio.h"
|
||||||
#include "exec/address-spaces.h"
|
#include "exec/address-spaces.h"
|
||||||
@ -337,7 +336,7 @@ static void z2_init(MachineState *machine)
|
|||||||
|
|
||||||
if (!pflash_cfi01_register(Z2_FLASH_BASE,
|
if (!pflash_cfi01_register(Z2_FLASH_BASE,
|
||||||
NULL, "z2.flash0", Z2_FLASH_SIZE,
|
NULL, "z2.flash0", Z2_FLASH_SIZE,
|
||||||
dinfo ? blk_bs(blk_by_legacy_dinfo(dinfo)) : NULL,
|
dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
|
||||||
sector_len, Z2_FLASH_SIZE / sector_len,
|
sector_len, Z2_FLASH_SIZE / sector_len,
|
||||||
4, 0, 0, 0, 0, be)) {
|
4, 0, 0, 0, 0, be)) {
|
||||||
fprintf(stderr, "qemu: Error registering flash memory.\n");
|
fprintf(stderr, "qemu: Error registering flash memory.\n");
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "sysemu/blockdev.h"
|
#include "sysemu/blockdev.h"
|
||||||
|
#include "sysemu/block-backend.h"
|
||||||
#include "hw/block/block.h"
|
#include "hw/block/block.h"
|
||||||
#include "qemu/error-report.h"
|
#include "qemu/error-report.h"
|
||||||
|
|
||||||
@ -17,7 +18,7 @@ void blkconf_serial(BlockConf *conf, char **serial)
|
|||||||
|
|
||||||
if (!*serial) {
|
if (!*serial) {
|
||||||
/* try to fall back to value set with legacy -drive serial=... */
|
/* try to fall back to value set with legacy -drive serial=... */
|
||||||
dinfo = drive_get_by_blockdev(conf->bs);
|
dinfo = blk_legacy_dinfo(conf->blk);
|
||||||
*serial = g_strdup(dinfo->serial);
|
*serial = g_strdup(dinfo->serial);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -30,7 +31,7 @@ void blkconf_geometry(BlockConf *conf, int *ptrans,
|
|||||||
|
|
||||||
if (!conf->cyls && !conf->heads && !conf->secs) {
|
if (!conf->cyls && !conf->heads && !conf->secs) {
|
||||||
/* try to fall back to value set with legacy -drive cyls=... */
|
/* try to fall back to value set with legacy -drive cyls=... */
|
||||||
dinfo = drive_get_by_blockdev(conf->bs);
|
dinfo = blk_legacy_dinfo(conf->blk);
|
||||||
conf->cyls = dinfo->cyls;
|
conf->cyls = dinfo->cyls;
|
||||||
conf->heads = dinfo->heads;
|
conf->heads = dinfo->heads;
|
||||||
conf->secs = dinfo->secs;
|
conf->secs = dinfo->secs;
|
||||||
@ -39,7 +40,7 @@ void blkconf_geometry(BlockConf *conf, int *ptrans,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!conf->cyls && !conf->heads && !conf->secs) {
|
if (!conf->cyls && !conf->heads && !conf->secs) {
|
||||||
hd_geometry_guess(conf->bs,
|
hd_geometry_guess(conf->blk,
|
||||||
&conf->cyls, &conf->heads, &conf->secs,
|
&conf->cyls, &conf->heads, &conf->secs,
|
||||||
ptrans);
|
ptrans);
|
||||||
} else if (ptrans && *ptrans == BIOS_ATA_TRANSLATION_AUTO) {
|
} else if (ptrans && *ptrans == BIOS_ATA_TRANSLATION_AUTO) {
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
#include "qemu/thread.h"
|
#include "qemu/thread.h"
|
||||||
#include "qemu/error-report.h"
|
#include "qemu/error-report.h"
|
||||||
#include "hw/virtio/dataplane/vring.h"
|
#include "hw/virtio/dataplane/vring.h"
|
||||||
#include "block/block.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "hw/virtio/virtio-blk.h"
|
#include "hw/virtio/virtio-blk.h"
|
||||||
#include "virtio-blk.h"
|
#include "virtio-blk.h"
|
||||||
#include "block/aio.h"
|
#include "block/aio.h"
|
||||||
@ -94,7 +94,7 @@ static void handle_notify(EventNotifier *e)
|
|||||||
VirtIOBlock *vblk = VIRTIO_BLK(s->vdev);
|
VirtIOBlock *vblk = VIRTIO_BLK(s->vdev);
|
||||||
|
|
||||||
event_notifier_test_and_clear(&s->host_notifier);
|
event_notifier_test_and_clear(&s->host_notifier);
|
||||||
bdrv_io_plug(s->conf->conf.bs);
|
blk_io_plug(s->conf->conf.blk);
|
||||||
for (;;) {
|
for (;;) {
|
||||||
MultiReqBuffer mrb = {
|
MultiReqBuffer mrb = {
|
||||||
.num_writes = 0,
|
.num_writes = 0,
|
||||||
@ -120,7 +120,7 @@ static void handle_notify(EventNotifier *e)
|
|||||||
virtio_blk_handle_request(req, &mrb);
|
virtio_blk_handle_request(req, &mrb);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtio_submit_multiwrite(s->conf->conf.bs, &mrb);
|
virtio_submit_multiwrite(s->conf->conf.blk, &mrb);
|
||||||
|
|
||||||
if (likely(ret == -EAGAIN)) { /* vring emptied */
|
if (likely(ret == -EAGAIN)) { /* vring emptied */
|
||||||
/* Re-enable guest->host notifies and stop processing the vring.
|
/* Re-enable guest->host notifies and stop processing the vring.
|
||||||
@ -133,7 +133,7 @@ static void handle_notify(EventNotifier *e)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
bdrv_io_unplug(s->conf->conf.bs);
|
blk_io_unplug(s->conf->conf.blk);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Context: QEMU global mutex held */
|
/* Context: QEMU global mutex held */
|
||||||
@ -163,8 +163,8 @@ void virtio_blk_data_plane_create(VirtIODevice *vdev, VirtIOBlkConf *conf,
|
|||||||
/* If dataplane is (re-)enabled while the guest is running there could be
|
/* If dataplane is (re-)enabled while the guest is running there could be
|
||||||
* block jobs that can conflict.
|
* block jobs that can conflict.
|
||||||
*/
|
*/
|
||||||
if (bdrv_op_is_blocked(conf->conf.bs, BLOCK_OP_TYPE_DATAPLANE,
|
if (blk_op_is_blocked(conf->conf.blk, BLOCK_OP_TYPE_DATAPLANE,
|
||||||
&local_err)) {
|
&local_err)) {
|
||||||
error_setg(errp, "cannot start dataplane thread: %s",
|
error_setg(errp, "cannot start dataplane thread: %s",
|
||||||
error_get_pretty(local_err));
|
error_get_pretty(local_err));
|
||||||
error_free(local_err);
|
error_free(local_err);
|
||||||
@ -193,9 +193,9 @@ void virtio_blk_data_plane_create(VirtIODevice *vdev, VirtIOBlkConf *conf,
|
|||||||
s->bh = aio_bh_new(s->ctx, notify_guest_bh, s);
|
s->bh = aio_bh_new(s->ctx, notify_guest_bh, s);
|
||||||
|
|
||||||
error_setg(&s->blocker, "block device is in use by data plane");
|
error_setg(&s->blocker, "block device is in use by data plane");
|
||||||
bdrv_op_block_all(conf->conf.bs, s->blocker);
|
blk_op_block_all(conf->conf.blk, s->blocker);
|
||||||
bdrv_op_unblock(conf->conf.bs, BLOCK_OP_TYPE_RESIZE, s->blocker);
|
blk_op_unblock(conf->conf.blk, BLOCK_OP_TYPE_RESIZE, s->blocker);
|
||||||
bdrv_op_unblock(conf->conf.bs, BLOCK_OP_TYPE_DRIVE_DEL, s->blocker);
|
blk_op_unblock(conf->conf.blk, BLOCK_OP_TYPE_DRIVE_DEL, s->blocker);
|
||||||
|
|
||||||
*dataplane = s;
|
*dataplane = s;
|
||||||
}
|
}
|
||||||
@ -208,7 +208,7 @@ void virtio_blk_data_plane_destroy(VirtIOBlockDataPlane *s)
|
|||||||
}
|
}
|
||||||
|
|
||||||
virtio_blk_data_plane_stop(s);
|
virtio_blk_data_plane_stop(s);
|
||||||
bdrv_op_unblock_all(s->conf->conf.bs, s->blocker);
|
blk_op_unblock_all(s->conf->conf.blk, s->blocker);
|
||||||
error_free(s->blocker);
|
error_free(s->blocker);
|
||||||
object_unref(OBJECT(s->iothread));
|
object_unref(OBJECT(s->iothread));
|
||||||
qemu_bh_delete(s->bh);
|
qemu_bh_delete(s->bh);
|
||||||
@ -263,7 +263,7 @@ void virtio_blk_data_plane_start(VirtIOBlockDataPlane *s)
|
|||||||
s->started = true;
|
s->started = true;
|
||||||
trace_virtio_blk_data_plane_start(s);
|
trace_virtio_blk_data_plane_start(s);
|
||||||
|
|
||||||
bdrv_set_aio_context(s->conf->conf.bs, s->ctx);
|
blk_set_aio_context(s->conf->conf.blk, s->ctx);
|
||||||
|
|
||||||
/* Kick right away to begin processing requests already in vring */
|
/* Kick right away to begin processing requests already in vring */
|
||||||
event_notifier_set(virtio_queue_get_host_notifier(vq));
|
event_notifier_set(virtio_queue_get_host_notifier(vq));
|
||||||
@ -309,7 +309,7 @@ void virtio_blk_data_plane_stop(VirtIOBlockDataPlane *s)
|
|||||||
aio_set_event_notifier(s->ctx, &s->host_notifier, NULL);
|
aio_set_event_notifier(s->ctx, &s->host_notifier, NULL);
|
||||||
|
|
||||||
/* Drain and switch bs back to the QEMU main loop */
|
/* Drain and switch bs back to the QEMU main loop */
|
||||||
bdrv_set_aio_context(s->conf->conf.bs, qemu_get_aio_context());
|
blk_set_aio_context(s->conf->conf.blk, qemu_get_aio_context());
|
||||||
|
|
||||||
aio_context_release(s->ctx);
|
aio_context_release(s->ctx);
|
||||||
|
|
||||||
|
@ -114,7 +114,7 @@ static const FDFormat fd_formats[] = {
|
|||||||
{ FDRIVE_DRV_NONE, -1, -1, 0, 0, },
|
{ FDRIVE_DRV_NONE, -1, -1, 0, 0, },
|
||||||
};
|
};
|
||||||
|
|
||||||
static void pick_geometry(BlockDriverState *bs, int *nb_heads,
|
static void pick_geometry(BlockBackend *blk, int *nb_heads,
|
||||||
int *max_track, int *last_sect,
|
int *max_track, int *last_sect,
|
||||||
FDriveType drive_in, FDriveType *drive,
|
FDriveType drive_in, FDriveType *drive,
|
||||||
FDriveRate *rate)
|
FDriveRate *rate)
|
||||||
@ -123,7 +123,7 @@ static void pick_geometry(BlockDriverState *bs, int *nb_heads,
|
|||||||
uint64_t nb_sectors, size;
|
uint64_t nb_sectors, size;
|
||||||
int i, first_match, match;
|
int i, first_match, match;
|
||||||
|
|
||||||
bdrv_get_geometry(bs, &nb_sectors);
|
blk_get_geometry(blk, &nb_sectors);
|
||||||
match = -1;
|
match = -1;
|
||||||
first_match = -1;
|
first_match = -1;
|
||||||
for (i = 0; ; i++) {
|
for (i = 0; ; i++) {
|
||||||
@ -176,7 +176,7 @@ typedef enum FDiskFlags {
|
|||||||
|
|
||||||
typedef struct FDrive {
|
typedef struct FDrive {
|
||||||
FDCtrl *fdctrl;
|
FDCtrl *fdctrl;
|
||||||
BlockDriverState *bs;
|
BlockBackend *blk;
|
||||||
/* Drive status */
|
/* Drive status */
|
||||||
FDriveType drive;
|
FDriveType drive;
|
||||||
uint8_t perpendicular; /* 2.88 MB access mode */
|
uint8_t perpendicular; /* 2.88 MB access mode */
|
||||||
@ -261,7 +261,7 @@ static int fd_seek(FDrive *drv, uint8_t head, uint8_t track, uint8_t sect,
|
|||||||
#endif
|
#endif
|
||||||
drv->head = head;
|
drv->head = head;
|
||||||
if (drv->track != track) {
|
if (drv->track != track) {
|
||||||
if (drv->bs != NULL && bdrv_is_inserted(drv->bs)) {
|
if (drv->blk != NULL && blk_is_inserted(drv->blk)) {
|
||||||
drv->media_changed = 0;
|
drv->media_changed = 0;
|
||||||
}
|
}
|
||||||
ret = 1;
|
ret = 1;
|
||||||
@ -270,7 +270,7 @@ static int fd_seek(FDrive *drv, uint8_t head, uint8_t track, uint8_t sect,
|
|||||||
drv->sect = sect;
|
drv->sect = sect;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (drv->bs == NULL || !bdrv_is_inserted(drv->bs)) {
|
if (drv->blk == NULL || !blk_is_inserted(drv->blk)) {
|
||||||
ret = 2;
|
ret = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -292,11 +292,11 @@ static void fd_revalidate(FDrive *drv)
|
|||||||
FDriveRate rate;
|
FDriveRate rate;
|
||||||
|
|
||||||
FLOPPY_DPRINTF("revalidate\n");
|
FLOPPY_DPRINTF("revalidate\n");
|
||||||
if (drv->bs != NULL) {
|
if (drv->blk != NULL) {
|
||||||
ro = bdrv_is_read_only(drv->bs);
|
ro = blk_is_read_only(drv->blk);
|
||||||
pick_geometry(drv->bs, &nb_heads, &max_track,
|
pick_geometry(drv->blk, &nb_heads, &max_track,
|
||||||
&last_sect, drv->drive, &drive, &rate);
|
&last_sect, drv->drive, &drive, &rate);
|
||||||
if (!bdrv_is_inserted(drv->bs)) {
|
if (!blk_is_inserted(drv->blk)) {
|
||||||
FLOPPY_DPRINTF("No disk in drive\n");
|
FLOPPY_DPRINTF("No disk in drive\n");
|
||||||
} else {
|
} else {
|
||||||
FLOPPY_DPRINTF("Floppy disk (%d h %d t %d s) %s\n", nb_heads,
|
FLOPPY_DPRINTF("Floppy disk (%d h %d t %d s) %s\n", nb_heads,
|
||||||
@ -666,7 +666,7 @@ static bool fdrive_media_changed_needed(void *opaque)
|
|||||||
{
|
{
|
||||||
FDrive *drive = opaque;
|
FDrive *drive = opaque;
|
||||||
|
|
||||||
return (drive->bs != NULL && drive->media_changed != 1);
|
return (drive->blk != NULL && drive->media_changed != 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const VMStateDescription vmstate_fdrive_media_changed = {
|
static const VMStateDescription vmstate_fdrive_media_changed = {
|
||||||
@ -911,8 +911,9 @@ static void fdctrl_reset(FDCtrl *fdctrl, int do_irq)
|
|||||||
/* Initialise controller */
|
/* Initialise controller */
|
||||||
fdctrl->sra = 0;
|
fdctrl->sra = 0;
|
||||||
fdctrl->srb = 0xc0;
|
fdctrl->srb = 0xc0;
|
||||||
if (!fdctrl->drives[1].bs)
|
if (!fdctrl->drives[1].blk) {
|
||||||
fdctrl->sra |= FD_SRA_nDRV2;
|
fdctrl->sra |= FD_SRA_nDRV2;
|
||||||
|
}
|
||||||
fdctrl->cur_drv = 0;
|
fdctrl->cur_drv = 0;
|
||||||
fdctrl->dor = FD_DOR_nRESET;
|
fdctrl->dor = FD_DOR_nRESET;
|
||||||
fdctrl->dor |= (fdctrl->dma_chann != -1) ? FD_DOR_DMAEN : 0;
|
fdctrl->dor |= (fdctrl->dma_chann != -1) ? FD_DOR_DMAEN : 0;
|
||||||
@ -1404,7 +1405,7 @@ static int fdctrl_transfer_handler (void *opaque, int nchan,
|
|||||||
status2 = FD_SR2_SNS;
|
status2 = FD_SR2_SNS;
|
||||||
if (dma_len > fdctrl->data_len)
|
if (dma_len > fdctrl->data_len)
|
||||||
dma_len = fdctrl->data_len;
|
dma_len = fdctrl->data_len;
|
||||||
if (cur_drv->bs == NULL) {
|
if (cur_drv->blk == NULL) {
|
||||||
if (fdctrl->data_dir == FD_DIR_WRITE)
|
if (fdctrl->data_dir == FD_DIR_WRITE)
|
||||||
fdctrl_stop_transfer(fdctrl, FD_SR0_ABNTERM | FD_SR0_SEEK, 0x00, 0x00);
|
fdctrl_stop_transfer(fdctrl, FD_SR0_ABNTERM | FD_SR0_SEEK, 0x00, 0x00);
|
||||||
else
|
else
|
||||||
@ -1425,8 +1426,8 @@ static int fdctrl_transfer_handler (void *opaque, int nchan,
|
|||||||
if (fdctrl->data_dir != FD_DIR_WRITE ||
|
if (fdctrl->data_dir != FD_DIR_WRITE ||
|
||||||
len < FD_SECTOR_LEN || rel_pos != 0) {
|
len < FD_SECTOR_LEN || rel_pos != 0) {
|
||||||
/* READ & SCAN commands and realign to a sector for WRITE */
|
/* READ & SCAN commands and realign to a sector for WRITE */
|
||||||
if (bdrv_read(cur_drv->bs, fd_sector(cur_drv),
|
if (blk_read(cur_drv->blk, fd_sector(cur_drv),
|
||||||
fdctrl->fifo, 1) < 0) {
|
fdctrl->fifo, 1) < 0) {
|
||||||
FLOPPY_DPRINTF("Floppy: error getting sector %d\n",
|
FLOPPY_DPRINTF("Floppy: error getting sector %d\n",
|
||||||
fd_sector(cur_drv));
|
fd_sector(cur_drv));
|
||||||
/* Sure, image size is too small... */
|
/* Sure, image size is too small... */
|
||||||
@ -1453,8 +1454,8 @@ static int fdctrl_transfer_handler (void *opaque, int nchan,
|
|||||||
|
|
||||||
DMA_read_memory (nchan, fdctrl->fifo + rel_pos,
|
DMA_read_memory (nchan, fdctrl->fifo + rel_pos,
|
||||||
fdctrl->data_pos, len);
|
fdctrl->data_pos, len);
|
||||||
if (bdrv_write(cur_drv->bs, fd_sector(cur_drv),
|
if (blk_write(cur_drv->blk, fd_sector(cur_drv),
|
||||||
fdctrl->fifo, 1) < 0) {
|
fdctrl->fifo, 1) < 0) {
|
||||||
FLOPPY_DPRINTF("error writing sector %d\n",
|
FLOPPY_DPRINTF("error writing sector %d\n",
|
||||||
fd_sector(cur_drv));
|
fd_sector(cur_drv));
|
||||||
fdctrl_stop_transfer(fdctrl, FD_SR0_ABNTERM | FD_SR0_SEEK, 0x00, 0x00);
|
fdctrl_stop_transfer(fdctrl, FD_SR0_ABNTERM | FD_SR0_SEEK, 0x00, 0x00);
|
||||||
@ -1529,7 +1530,8 @@ static uint32_t fdctrl_read_data(FDCtrl *fdctrl)
|
|||||||
fd_sector(cur_drv));
|
fd_sector(cur_drv));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (bdrv_read(cur_drv->bs, fd_sector(cur_drv), fdctrl->fifo, 1) < 0) {
|
if (blk_read(cur_drv->blk, fd_sector(cur_drv), fdctrl->fifo, 1)
|
||||||
|
< 0) {
|
||||||
FLOPPY_DPRINTF("error getting sector %d\n",
|
FLOPPY_DPRINTF("error getting sector %d\n",
|
||||||
fd_sector(cur_drv));
|
fd_sector(cur_drv));
|
||||||
/* Sure, image size is too small... */
|
/* Sure, image size is too small... */
|
||||||
@ -1598,8 +1600,8 @@ static void fdctrl_format_sector(FDCtrl *fdctrl)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
memset(fdctrl->fifo, 0, FD_SECTOR_LEN);
|
memset(fdctrl->fifo, 0, FD_SECTOR_LEN);
|
||||||
if (cur_drv->bs == NULL ||
|
if (cur_drv->blk == NULL ||
|
||||||
bdrv_write(cur_drv->bs, fd_sector(cur_drv), fdctrl->fifo, 1) < 0) {
|
blk_write(cur_drv->blk, fd_sector(cur_drv), fdctrl->fifo, 1) < 0) {
|
||||||
FLOPPY_DPRINTF("error formatting sector %d\n", fd_sector(cur_drv));
|
FLOPPY_DPRINTF("error formatting sector %d\n", fd_sector(cur_drv));
|
||||||
fdctrl_stop_transfer(fdctrl, FD_SR0_ABNTERM | FD_SR0_SEEK, 0x00, 0x00);
|
fdctrl_stop_transfer(fdctrl, FD_SR0_ABNTERM | FD_SR0_SEEK, 0x00, 0x00);
|
||||||
} else {
|
} else {
|
||||||
@ -1989,7 +1991,8 @@ static void fdctrl_write_data(FDCtrl *fdctrl, uint32_t value)
|
|||||||
if (pos == FD_SECTOR_LEN - 1 ||
|
if (pos == FD_SECTOR_LEN - 1 ||
|
||||||
fdctrl->data_pos == fdctrl->data_len) {
|
fdctrl->data_pos == fdctrl->data_len) {
|
||||||
cur_drv = get_cur_drv(fdctrl);
|
cur_drv = get_cur_drv(fdctrl);
|
||||||
if (bdrv_write(cur_drv->bs, fd_sector(cur_drv), fdctrl->fifo, 1) < 0) {
|
if (blk_write(cur_drv->blk, fd_sector(cur_drv), fdctrl->fifo, 1)
|
||||||
|
< 0) {
|
||||||
FLOPPY_DPRINTF("error writing sector %d\n",
|
FLOPPY_DPRINTF("error writing sector %d\n",
|
||||||
fd_sector(cur_drv));
|
fd_sector(cur_drv));
|
||||||
return;
|
return;
|
||||||
@ -2077,12 +2080,12 @@ static void fdctrl_connect_drives(FDCtrl *fdctrl, Error **errp)
|
|||||||
drive = &fdctrl->drives[i];
|
drive = &fdctrl->drives[i];
|
||||||
drive->fdctrl = fdctrl;
|
drive->fdctrl = fdctrl;
|
||||||
|
|
||||||
if (drive->bs) {
|
if (drive->blk) {
|
||||||
if (bdrv_get_on_error(drive->bs, 0) != BLOCKDEV_ON_ERROR_ENOSPC) {
|
if (blk_get_on_error(drive->blk, 0) != BLOCKDEV_ON_ERROR_ENOSPC) {
|
||||||
error_setg(errp, "fdc doesn't support drive option werror");
|
error_setg(errp, "fdc doesn't support drive option werror");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (bdrv_get_on_error(drive->bs, 1) != BLOCKDEV_ON_ERROR_REPORT) {
|
if (blk_get_on_error(drive->blk, 1) != BLOCKDEV_ON_ERROR_REPORT) {
|
||||||
error_setg(errp, "fdc doesn't support drive option rerror");
|
error_setg(errp, "fdc doesn't support drive option rerror");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -2090,8 +2093,8 @@ static void fdctrl_connect_drives(FDCtrl *fdctrl, Error **errp)
|
|||||||
|
|
||||||
fd_init(drive);
|
fd_init(drive);
|
||||||
fdctrl_change_cb(drive, 0);
|
fdctrl_change_cb(drive, 0);
|
||||||
if (drive->bs) {
|
if (drive->blk) {
|
||||||
bdrv_set_dev_ops(drive->bs, &fdctrl_block_ops, drive);
|
blk_set_dev_ops(drive->blk, &fdctrl_block_ops, drive);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2108,12 +2111,10 @@ ISADevice *fdctrl_init_isa(ISABus *bus, DriveInfo **fds)
|
|||||||
dev = DEVICE(isadev);
|
dev = DEVICE(isadev);
|
||||||
|
|
||||||
if (fds[0]) {
|
if (fds[0]) {
|
||||||
qdev_prop_set_drive_nofail(dev, "driveA",
|
qdev_prop_set_drive_nofail(dev, "driveA", blk_by_legacy_dinfo(fds[0]));
|
||||||
blk_bs(blk_by_legacy_dinfo(fds[0])));
|
|
||||||
}
|
}
|
||||||
if (fds[1]) {
|
if (fds[1]) {
|
||||||
qdev_prop_set_drive_nofail(dev, "driveB",
|
qdev_prop_set_drive_nofail(dev, "driveB", blk_by_legacy_dinfo(fds[1]));
|
||||||
blk_bs(blk_by_legacy_dinfo(fds[1])));
|
|
||||||
}
|
}
|
||||||
qdev_init_nofail(dev);
|
qdev_init_nofail(dev);
|
||||||
|
|
||||||
@ -2133,12 +2134,10 @@ void fdctrl_init_sysbus(qemu_irq irq, int dma_chann,
|
|||||||
fdctrl = &sys->state;
|
fdctrl = &sys->state;
|
||||||
fdctrl->dma_chann = dma_chann; /* FIXME */
|
fdctrl->dma_chann = dma_chann; /* FIXME */
|
||||||
if (fds[0]) {
|
if (fds[0]) {
|
||||||
qdev_prop_set_drive_nofail(dev, "driveA",
|
qdev_prop_set_drive_nofail(dev, "driveA", blk_by_legacy_dinfo(fds[0]));
|
||||||
blk_bs(blk_by_legacy_dinfo(fds[0])));
|
|
||||||
}
|
}
|
||||||
if (fds[1]) {
|
if (fds[1]) {
|
||||||
qdev_prop_set_drive_nofail(dev, "driveB",
|
qdev_prop_set_drive_nofail(dev, "driveB", blk_by_legacy_dinfo(fds[1]));
|
||||||
blk_bs(blk_by_legacy_dinfo(fds[1])));
|
|
||||||
}
|
}
|
||||||
qdev_init_nofail(dev);
|
qdev_init_nofail(dev);
|
||||||
sbd = SYS_BUS_DEVICE(dev);
|
sbd = SYS_BUS_DEVICE(dev);
|
||||||
@ -2154,8 +2153,7 @@ void sun4m_fdctrl_init(qemu_irq irq, hwaddr io_base,
|
|||||||
|
|
||||||
dev = qdev_create(NULL, "SUNW,fdtwo");
|
dev = qdev_create(NULL, "SUNW,fdtwo");
|
||||||
if (fds[0]) {
|
if (fds[0]) {
|
||||||
qdev_prop_set_drive_nofail(dev, "drive",
|
qdev_prop_set_drive_nofail(dev, "drive", blk_by_legacy_dinfo(fds[0]));
|
||||||
blk_bs(blk_by_legacy_dinfo(fds[0])));
|
|
||||||
}
|
}
|
||||||
qdev_init_nofail(dev);
|
qdev_init_nofail(dev);
|
||||||
sys = SYSBUS_FDC(dev);
|
sys = SYSBUS_FDC(dev);
|
||||||
@ -2292,8 +2290,8 @@ static Property isa_fdc_properties[] = {
|
|||||||
DEFINE_PROP_UINT32("iobase", FDCtrlISABus, iobase, 0x3f0),
|
DEFINE_PROP_UINT32("iobase", FDCtrlISABus, iobase, 0x3f0),
|
||||||
DEFINE_PROP_UINT32("irq", FDCtrlISABus, irq, 6),
|
DEFINE_PROP_UINT32("irq", FDCtrlISABus, irq, 6),
|
||||||
DEFINE_PROP_UINT32("dma", FDCtrlISABus, dma, 2),
|
DEFINE_PROP_UINT32("dma", FDCtrlISABus, dma, 2),
|
||||||
DEFINE_PROP_DRIVE("driveA", FDCtrlISABus, state.drives[0].bs),
|
DEFINE_PROP_DRIVE("driveA", FDCtrlISABus, state.drives[0].blk),
|
||||||
DEFINE_PROP_DRIVE("driveB", FDCtrlISABus, state.drives[1].bs),
|
DEFINE_PROP_DRIVE("driveB", FDCtrlISABus, state.drives[1].blk),
|
||||||
DEFINE_PROP_BIT("check_media_rate", FDCtrlISABus, state.check_media_rate,
|
DEFINE_PROP_BIT("check_media_rate", FDCtrlISABus, state.check_media_rate,
|
||||||
0, true),
|
0, true),
|
||||||
DEFINE_PROP_END_OF_LIST(),
|
DEFINE_PROP_END_OF_LIST(),
|
||||||
@ -2342,8 +2340,8 @@ static const VMStateDescription vmstate_sysbus_fdc ={
|
|||||||
};
|
};
|
||||||
|
|
||||||
static Property sysbus_fdc_properties[] = {
|
static Property sysbus_fdc_properties[] = {
|
||||||
DEFINE_PROP_DRIVE("driveA", FDCtrlSysBus, state.drives[0].bs),
|
DEFINE_PROP_DRIVE("driveA", FDCtrlSysBus, state.drives[0].blk),
|
||||||
DEFINE_PROP_DRIVE("driveB", FDCtrlSysBus, state.drives[1].bs),
|
DEFINE_PROP_DRIVE("driveB", FDCtrlSysBus, state.drives[1].blk),
|
||||||
DEFINE_PROP_END_OF_LIST(),
|
DEFINE_PROP_END_OF_LIST(),
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -2363,7 +2361,7 @@ static const TypeInfo sysbus_fdc_info = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static Property sun4m_fdc_properties[] = {
|
static Property sun4m_fdc_properties[] = {
|
||||||
DEFINE_PROP_DRIVE("drive", FDCtrlSysBus, state.drives[0].bs),
|
DEFINE_PROP_DRIVE("drive", FDCtrlSysBus, state.drives[0].blk),
|
||||||
DEFINE_PROP_END_OF_LIST(),
|
DEFINE_PROP_END_OF_LIST(),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -30,7 +30,7 @@
|
|||||||
* THE SOFTWARE.
|
* THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "block/block.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "hw/block/block.h"
|
#include "hw/block/block.h"
|
||||||
#include "trace.h"
|
#include "trace.h"
|
||||||
|
|
||||||
@ -49,7 +49,7 @@ struct partition {
|
|||||||
|
|
||||||
/* try to guess the disk logical geometry from the MSDOS partition table.
|
/* try to guess the disk logical geometry from the MSDOS partition table.
|
||||||
Return 0 if OK, -1 if could not guess */
|
Return 0 if OK, -1 if could not guess */
|
||||||
static int guess_disk_lchs(BlockDriverState *bs,
|
static int guess_disk_lchs(BlockBackend *blk,
|
||||||
int *pcylinders, int *pheads, int *psectors)
|
int *pcylinders, int *pheads, int *psectors)
|
||||||
{
|
{
|
||||||
uint8_t buf[BDRV_SECTOR_SIZE];
|
uint8_t buf[BDRV_SECTOR_SIZE];
|
||||||
@ -58,14 +58,14 @@ static int guess_disk_lchs(BlockDriverState *bs,
|
|||||||
uint32_t nr_sects;
|
uint32_t nr_sects;
|
||||||
uint64_t nb_sectors;
|
uint64_t nb_sectors;
|
||||||
|
|
||||||
bdrv_get_geometry(bs, &nb_sectors);
|
blk_get_geometry(blk, &nb_sectors);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The function will be invoked during startup not only in sync I/O mode,
|
* The function will be invoked during startup not only in sync I/O mode,
|
||||||
* but also in async I/O mode. So the I/O throttling function has to
|
* but also in async I/O mode. So the I/O throttling function has to
|
||||||
* be disabled temporarily here, not permanently.
|
* be disabled temporarily here, not permanently.
|
||||||
*/
|
*/
|
||||||
if (bdrv_read_unthrottled(bs, 0, buf, 1) < 0) {
|
if (blk_read_unthrottled(blk, 0, buf, 1) < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
/* test msdos magic */
|
/* test msdos magic */
|
||||||
@ -90,20 +90,20 @@ static int guess_disk_lchs(BlockDriverState *bs,
|
|||||||
*pheads = heads;
|
*pheads = heads;
|
||||||
*psectors = sectors;
|
*psectors = sectors;
|
||||||
*pcylinders = cylinders;
|
*pcylinders = cylinders;
|
||||||
trace_hd_geometry_lchs_guess(bs, cylinders, heads, sectors);
|
trace_hd_geometry_lchs_guess(blk, cylinders, heads, sectors);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void guess_chs_for_size(BlockDriverState *bs,
|
static void guess_chs_for_size(BlockBackend *blk,
|
||||||
uint32_t *pcyls, uint32_t *pheads, uint32_t *psecs)
|
uint32_t *pcyls, uint32_t *pheads, uint32_t *psecs)
|
||||||
{
|
{
|
||||||
uint64_t nb_sectors;
|
uint64_t nb_sectors;
|
||||||
int cylinders;
|
int cylinders;
|
||||||
|
|
||||||
bdrv_get_geometry(bs, &nb_sectors);
|
blk_get_geometry(blk, &nb_sectors);
|
||||||
|
|
||||||
cylinders = nb_sectors / (16 * 63);
|
cylinders = nb_sectors / (16 * 63);
|
||||||
if (cylinders > 16383) {
|
if (cylinders > 16383) {
|
||||||
@ -116,21 +116,21 @@ static void guess_chs_for_size(BlockDriverState *bs,
|
|||||||
*psecs = 63;
|
*psecs = 63;
|
||||||
}
|
}
|
||||||
|
|
||||||
void hd_geometry_guess(BlockDriverState *bs,
|
void hd_geometry_guess(BlockBackend *blk,
|
||||||
uint32_t *pcyls, uint32_t *pheads, uint32_t *psecs,
|
uint32_t *pcyls, uint32_t *pheads, uint32_t *psecs,
|
||||||
int *ptrans)
|
int *ptrans)
|
||||||
{
|
{
|
||||||
int cylinders, heads, secs, translation;
|
int cylinders, heads, secs, translation;
|
||||||
|
|
||||||
if (guess_disk_lchs(bs, &cylinders, &heads, &secs) < 0) {
|
if (guess_disk_lchs(blk, &cylinders, &heads, &secs) < 0) {
|
||||||
/* no LCHS guess: use a standard physical disk geometry */
|
/* no LCHS guess: use a standard physical disk geometry */
|
||||||
guess_chs_for_size(bs, pcyls, pheads, psecs);
|
guess_chs_for_size(blk, pcyls, pheads, psecs);
|
||||||
translation = hd_bios_chs_auto_trans(*pcyls, *pheads, *psecs);
|
translation = hd_bios_chs_auto_trans(*pcyls, *pheads, *psecs);
|
||||||
} else if (heads > 16) {
|
} else if (heads > 16) {
|
||||||
/* LCHS guess with heads > 16 means that a BIOS LBA
|
/* LCHS guess with heads > 16 means that a BIOS LBA
|
||||||
translation was active, so a standard physical disk
|
translation was active, so a standard physical disk
|
||||||
geometry is OK */
|
geometry is OK */
|
||||||
guess_chs_for_size(bs, pcyls, pheads, psecs);
|
guess_chs_for_size(blk, pcyls, pheads, psecs);
|
||||||
translation = *pcyls * *pheads <= 131072
|
translation = *pcyls * *pheads <= 131072
|
||||||
? BIOS_ATA_TRANSLATION_LARGE
|
? BIOS_ATA_TRANSLATION_LARGE
|
||||||
: BIOS_ATA_TRANSLATION_LBA;
|
: BIOS_ATA_TRANSLATION_LBA;
|
||||||
@ -146,7 +146,7 @@ void hd_geometry_guess(BlockDriverState *bs,
|
|||||||
if (ptrans) {
|
if (ptrans) {
|
||||||
*ptrans = translation;
|
*ptrans = translation;
|
||||||
}
|
}
|
||||||
trace_hd_geometry_guess(bs, *pcyls, *pheads, *psecs, translation);
|
trace_hd_geometry_guess(blk, *pcyls, *pheads, *psecs, translation);
|
||||||
}
|
}
|
||||||
|
|
||||||
int hd_bios_chs_auto_trans(uint32_t cyls, uint32_t heads, uint32_t secs)
|
int hd_bios_chs_auto_trans(uint32_t cyls, uint32_t heads, uint32_t secs)
|
||||||
|
@ -246,7 +246,7 @@ typedef struct Flash {
|
|||||||
|
|
||||||
uint32_t r;
|
uint32_t r;
|
||||||
|
|
||||||
BlockDriverState *bdrv;
|
BlockBackend *blk;
|
||||||
|
|
||||||
uint8_t *storage;
|
uint8_t *storage;
|
||||||
uint32_t size;
|
uint32_t size;
|
||||||
@ -280,7 +280,7 @@ typedef struct M25P80Class {
|
|||||||
#define M25P80_GET_CLASS(obj) \
|
#define M25P80_GET_CLASS(obj) \
|
||||||
OBJECT_GET_CLASS(M25P80Class, (obj), TYPE_M25P80)
|
OBJECT_GET_CLASS(M25P80Class, (obj), TYPE_M25P80)
|
||||||
|
|
||||||
static void bdrv_sync_complete(void *opaque, int ret)
|
static void blk_sync_complete(void *opaque, int ret)
|
||||||
{
|
{
|
||||||
/* do nothing. Masters do not directly interact with the backing store,
|
/* do nothing. Masters do not directly interact with the backing store,
|
||||||
* only the working copy so no mutexing required.
|
* only the working copy so no mutexing required.
|
||||||
@ -289,20 +289,20 @@ static void bdrv_sync_complete(void *opaque, int ret)
|
|||||||
|
|
||||||
static void flash_sync_page(Flash *s, int page)
|
static void flash_sync_page(Flash *s, int page)
|
||||||
{
|
{
|
||||||
int bdrv_sector, nb_sectors;
|
int blk_sector, nb_sectors;
|
||||||
QEMUIOVector iov;
|
QEMUIOVector iov;
|
||||||
|
|
||||||
if (!s->bdrv || bdrv_is_read_only(s->bdrv)) {
|
if (!s->blk || blk_is_read_only(s->blk)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
bdrv_sector = (page * s->pi->page_size) / BDRV_SECTOR_SIZE;
|
blk_sector = (page * s->pi->page_size) / BDRV_SECTOR_SIZE;
|
||||||
nb_sectors = DIV_ROUND_UP(s->pi->page_size, BDRV_SECTOR_SIZE);
|
nb_sectors = DIV_ROUND_UP(s->pi->page_size, BDRV_SECTOR_SIZE);
|
||||||
qemu_iovec_init(&iov, 1);
|
qemu_iovec_init(&iov, 1);
|
||||||
qemu_iovec_add(&iov, s->storage + bdrv_sector * BDRV_SECTOR_SIZE,
|
qemu_iovec_add(&iov, s->storage + blk_sector * BDRV_SECTOR_SIZE,
|
||||||
nb_sectors * BDRV_SECTOR_SIZE);
|
nb_sectors * BDRV_SECTOR_SIZE);
|
||||||
bdrv_aio_writev(s->bdrv, bdrv_sector, &iov, nb_sectors, bdrv_sync_complete,
|
blk_aio_writev(s->blk, blk_sector, &iov, nb_sectors, blk_sync_complete,
|
||||||
NULL);
|
NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void flash_sync_area(Flash *s, int64_t off, int64_t len)
|
static inline void flash_sync_area(Flash *s, int64_t off, int64_t len)
|
||||||
@ -310,7 +310,7 @@ static inline void flash_sync_area(Flash *s, int64_t off, int64_t len)
|
|||||||
int64_t start, end, nb_sectors;
|
int64_t start, end, nb_sectors;
|
||||||
QEMUIOVector iov;
|
QEMUIOVector iov;
|
||||||
|
|
||||||
if (!s->bdrv || bdrv_is_read_only(s->bdrv)) {
|
if (!s->blk || blk_is_read_only(s->blk)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -321,7 +321,7 @@ static inline void flash_sync_area(Flash *s, int64_t off, int64_t len)
|
|||||||
qemu_iovec_init(&iov, 1);
|
qemu_iovec_init(&iov, 1);
|
||||||
qemu_iovec_add(&iov, s->storage + (start * BDRV_SECTOR_SIZE),
|
qemu_iovec_add(&iov, s->storage + (start * BDRV_SECTOR_SIZE),
|
||||||
nb_sectors * BDRV_SECTOR_SIZE);
|
nb_sectors * BDRV_SECTOR_SIZE);
|
||||||
bdrv_aio_writev(s->bdrv, start, &iov, nb_sectors, bdrv_sync_complete, NULL);
|
blk_aio_writev(s->blk, start, &iov, nb_sectors, blk_sync_complete, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void flash_erase(Flash *s, int offset, FlashCMD cmd)
|
static void flash_erase(Flash *s, int offset, FlashCMD cmd)
|
||||||
@ -621,17 +621,17 @@ static int m25p80_init(SSISlave *ss)
|
|||||||
|
|
||||||
s->size = s->pi->sector_size * s->pi->n_sectors;
|
s->size = s->pi->sector_size * s->pi->n_sectors;
|
||||||
s->dirty_page = -1;
|
s->dirty_page = -1;
|
||||||
s->storage = qemu_blockalign(s->bdrv, s->size);
|
s->storage = blk_blockalign(s->blk, s->size);
|
||||||
|
|
||||||
dinfo = drive_get_next(IF_MTD);
|
dinfo = drive_get_next(IF_MTD);
|
||||||
|
|
||||||
if (dinfo) {
|
if (dinfo) {
|
||||||
DB_PRINT_L(0, "Binding to IF_MTD drive\n");
|
DB_PRINT_L(0, "Binding to IF_MTD drive\n");
|
||||||
s->bdrv = blk_bs(blk_by_legacy_dinfo(dinfo));
|
s->blk = blk_by_legacy_dinfo(dinfo);
|
||||||
|
|
||||||
/* FIXME: Move to late init */
|
/* FIXME: Move to late init */
|
||||||
if (bdrv_read(s->bdrv, 0, s->storage, DIV_ROUND_UP(s->size,
|
if (blk_read(s->blk, 0, s->storage,
|
||||||
BDRV_SECTOR_SIZE))) {
|
DIV_ROUND_UP(s->size, BDRV_SECTOR_SIZE))) {
|
||||||
fprintf(stderr, "Failed to initialize SPI flash!\n");
|
fprintf(stderr, "Failed to initialize SPI flash!\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
|
|
||||||
# include "hw/hw.h"
|
# include "hw/hw.h"
|
||||||
# include "hw/block/flash.h"
|
# include "hw/block/flash.h"
|
||||||
# include "sysemu/blockdev.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "hw/qdev.h"
|
#include "hw/qdev.h"
|
||||||
#include "qemu/error-report.h"
|
#include "qemu/error-report.h"
|
||||||
|
|
||||||
@ -61,7 +61,7 @@ struct NANDFlashState {
|
|||||||
int size, pages;
|
int size, pages;
|
||||||
int page_shift, oob_shift, erase_shift, addr_shift;
|
int page_shift, oob_shift, erase_shift, addr_shift;
|
||||||
uint8_t *storage;
|
uint8_t *storage;
|
||||||
BlockDriverState *bdrv;
|
BlockBackend *blk;
|
||||||
int mem_oob;
|
int mem_oob;
|
||||||
|
|
||||||
uint8_t cle, ale, ce, wp, gnd;
|
uint8_t cle, ale, ce, wp, gnd;
|
||||||
@ -400,12 +400,12 @@ static void nand_realize(DeviceState *dev, Error **errp)
|
|||||||
|
|
||||||
pagesize = 1 << s->oob_shift;
|
pagesize = 1 << s->oob_shift;
|
||||||
s->mem_oob = 1;
|
s->mem_oob = 1;
|
||||||
if (s->bdrv) {
|
if (s->blk) {
|
||||||
if (bdrv_is_read_only(s->bdrv)) {
|
if (blk_is_read_only(s->blk)) {
|
||||||
error_setg(errp, "Can't use a read-only drive");
|
error_setg(errp, "Can't use a read-only drive");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (bdrv_getlength(s->bdrv) >=
|
if (blk_getlength(s->blk) >=
|
||||||
(s->pages << s->page_shift) + (s->pages << s->oob_shift)) {
|
(s->pages << s->page_shift) + (s->pages << s->oob_shift)) {
|
||||||
pagesize = 0;
|
pagesize = 0;
|
||||||
s->mem_oob = 0;
|
s->mem_oob = 0;
|
||||||
@ -424,7 +424,7 @@ static void nand_realize(DeviceState *dev, Error **errp)
|
|||||||
static Property nand_properties[] = {
|
static Property nand_properties[] = {
|
||||||
DEFINE_PROP_UINT8("manufacturer_id", NANDFlashState, manf_id, 0),
|
DEFINE_PROP_UINT8("manufacturer_id", NANDFlashState, manf_id, 0),
|
||||||
DEFINE_PROP_UINT8("chip_id", NANDFlashState, chip_id, 0),
|
DEFINE_PROP_UINT8("chip_id", NANDFlashState, chip_id, 0),
|
||||||
DEFINE_PROP_DRIVE("drive", NANDFlashState, bdrv),
|
DEFINE_PROP_DRIVE("drive", NANDFlashState, blk),
|
||||||
DEFINE_PROP_END_OF_LIST(),
|
DEFINE_PROP_END_OF_LIST(),
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -624,7 +624,7 @@ uint32_t nand_getbuswidth(DeviceState *dev)
|
|||||||
return s->buswidth << 3;
|
return s->buswidth << 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
DeviceState *nand_init(BlockDriverState *bdrv, int manf_id, int chip_id)
|
DeviceState *nand_init(BlockBackend *blk, int manf_id, int chip_id)
|
||||||
{
|
{
|
||||||
DeviceState *dev;
|
DeviceState *dev;
|
||||||
|
|
||||||
@ -634,8 +634,8 @@ DeviceState *nand_init(BlockDriverState *bdrv, int manf_id, int chip_id)
|
|||||||
dev = DEVICE(object_new(TYPE_NAND));
|
dev = DEVICE(object_new(TYPE_NAND));
|
||||||
qdev_prop_set_uint8(dev, "manufacturer_id", manf_id);
|
qdev_prop_set_uint8(dev, "manufacturer_id", manf_id);
|
||||||
qdev_prop_set_uint8(dev, "chip_id", chip_id);
|
qdev_prop_set_uint8(dev, "chip_id", chip_id);
|
||||||
if (bdrv) {
|
if (blk) {
|
||||||
qdev_prop_set_drive_nofail(dev, "drive", bdrv);
|
qdev_prop_set_drive_nofail(dev, "drive", blk);
|
||||||
}
|
}
|
||||||
|
|
||||||
qdev_init_nofail(dev);
|
qdev_init_nofail(dev);
|
||||||
@ -654,14 +654,14 @@ static void glue(nand_blk_write_, PAGE_SIZE)(NANDFlashState *s)
|
|||||||
if (PAGE(s->addr) >= s->pages)
|
if (PAGE(s->addr) >= s->pages)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!s->bdrv) {
|
if (!s->blk) {
|
||||||
mem_and(s->storage + PAGE_START(s->addr) + (s->addr & PAGE_MASK) +
|
mem_and(s->storage + PAGE_START(s->addr) + (s->addr & PAGE_MASK) +
|
||||||
s->offset, s->io, s->iolen);
|
s->offset, s->io, s->iolen);
|
||||||
} else if (s->mem_oob) {
|
} else if (s->mem_oob) {
|
||||||
sector = SECTOR(s->addr);
|
sector = SECTOR(s->addr);
|
||||||
off = (s->addr & PAGE_MASK) + s->offset;
|
off = (s->addr & PAGE_MASK) + s->offset;
|
||||||
soff = SECTOR_OFFSET(s->addr);
|
soff = SECTOR_OFFSET(s->addr);
|
||||||
if (bdrv_read(s->bdrv, sector, iobuf, PAGE_SECTORS) < 0) {
|
if (blk_read(s->blk, sector, iobuf, PAGE_SECTORS) < 0) {
|
||||||
printf("%s: read error in sector %" PRIu64 "\n", __func__, sector);
|
printf("%s: read error in sector %" PRIu64 "\n", __func__, sector);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -673,21 +673,21 @@ static void glue(nand_blk_write_, PAGE_SIZE)(NANDFlashState *s)
|
|||||||
MIN(OOB_SIZE, off + s->iolen - PAGE_SIZE));
|
MIN(OOB_SIZE, off + s->iolen - PAGE_SIZE));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bdrv_write(s->bdrv, sector, iobuf, PAGE_SECTORS) < 0) {
|
if (blk_write(s->blk, sector, iobuf, PAGE_SECTORS) < 0) {
|
||||||
printf("%s: write error in sector %" PRIu64 "\n", __func__, sector);
|
printf("%s: write error in sector %" PRIu64 "\n", __func__, sector);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
off = PAGE_START(s->addr) + (s->addr & PAGE_MASK) + s->offset;
|
off = PAGE_START(s->addr) + (s->addr & PAGE_MASK) + s->offset;
|
||||||
sector = off >> 9;
|
sector = off >> 9;
|
||||||
soff = off & 0x1ff;
|
soff = off & 0x1ff;
|
||||||
if (bdrv_read(s->bdrv, sector, iobuf, PAGE_SECTORS + 2) < 0) {
|
if (blk_read(s->blk, sector, iobuf, PAGE_SECTORS + 2) < 0) {
|
||||||
printf("%s: read error in sector %" PRIu64 "\n", __func__, sector);
|
printf("%s: read error in sector %" PRIu64 "\n", __func__, sector);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
mem_and(iobuf + soff, s->io, s->iolen);
|
mem_and(iobuf + soff, s->io, s->iolen);
|
||||||
|
|
||||||
if (bdrv_write(s->bdrv, sector, iobuf, PAGE_SECTORS + 2) < 0) {
|
if (blk_write(s->blk, sector, iobuf, PAGE_SECTORS + 2) < 0) {
|
||||||
printf("%s: write error in sector %" PRIu64 "\n", __func__, sector);
|
printf("%s: write error in sector %" PRIu64 "\n", __func__, sector);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -705,7 +705,7 @@ static void glue(nand_blk_erase_, PAGE_SIZE)(NANDFlashState *s)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!s->bdrv) {
|
if (!s->blk) {
|
||||||
memset(s->storage + PAGE_START(addr),
|
memset(s->storage + PAGE_START(addr),
|
||||||
0xff, (PAGE_SIZE + OOB_SIZE) << s->erase_shift);
|
0xff, (PAGE_SIZE + OOB_SIZE) << s->erase_shift);
|
||||||
} else if (s->mem_oob) {
|
} else if (s->mem_oob) {
|
||||||
@ -714,17 +714,17 @@ static void glue(nand_blk_erase_, PAGE_SIZE)(NANDFlashState *s)
|
|||||||
i = SECTOR(addr);
|
i = SECTOR(addr);
|
||||||
page = SECTOR(addr + (ADDR_SHIFT + s->erase_shift));
|
page = SECTOR(addr + (ADDR_SHIFT + s->erase_shift));
|
||||||
for (; i < page; i ++)
|
for (; i < page; i ++)
|
||||||
if (bdrv_write(s->bdrv, i, iobuf, 1) < 0) {
|
if (blk_write(s->blk, i, iobuf, 1) < 0) {
|
||||||
printf("%s: write error in sector %" PRIu64 "\n", __func__, i);
|
printf("%s: write error in sector %" PRIu64 "\n", __func__, i);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
addr = PAGE_START(addr);
|
addr = PAGE_START(addr);
|
||||||
page = addr >> 9;
|
page = addr >> 9;
|
||||||
if (bdrv_read(s->bdrv, page, iobuf, 1) < 0) {
|
if (blk_read(s->blk, page, iobuf, 1) < 0) {
|
||||||
printf("%s: read error in sector %" PRIu64 "\n", __func__, page);
|
printf("%s: read error in sector %" PRIu64 "\n", __func__, page);
|
||||||
}
|
}
|
||||||
memset(iobuf + (addr & 0x1ff), 0xff, (~addr & 0x1ff) + 1);
|
memset(iobuf + (addr & 0x1ff), 0xff, (~addr & 0x1ff) + 1);
|
||||||
if (bdrv_write(s->bdrv, page, iobuf, 1) < 0) {
|
if (blk_write(s->blk, page, iobuf, 1) < 0) {
|
||||||
printf("%s: write error in sector %" PRIu64 "\n", __func__, page);
|
printf("%s: write error in sector %" PRIu64 "\n", __func__, page);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -732,18 +732,18 @@ static void glue(nand_blk_erase_, PAGE_SIZE)(NANDFlashState *s)
|
|||||||
i = (addr & ~0x1ff) + 0x200;
|
i = (addr & ~0x1ff) + 0x200;
|
||||||
for (addr += ((PAGE_SIZE + OOB_SIZE) << s->erase_shift) - 0x200;
|
for (addr += ((PAGE_SIZE + OOB_SIZE) << s->erase_shift) - 0x200;
|
||||||
i < addr; i += 0x200) {
|
i < addr; i += 0x200) {
|
||||||
if (bdrv_write(s->bdrv, i >> 9, iobuf, 1) < 0) {
|
if (blk_write(s->blk, i >> 9, iobuf, 1) < 0) {
|
||||||
printf("%s: write error in sector %" PRIu64 "\n",
|
printf("%s: write error in sector %" PRIu64 "\n",
|
||||||
__func__, i >> 9);
|
__func__, i >> 9);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
page = i >> 9;
|
page = i >> 9;
|
||||||
if (bdrv_read(s->bdrv, page, iobuf, 1) < 0) {
|
if (blk_read(s->blk, page, iobuf, 1) < 0) {
|
||||||
printf("%s: read error in sector %" PRIu64 "\n", __func__, page);
|
printf("%s: read error in sector %" PRIu64 "\n", __func__, page);
|
||||||
}
|
}
|
||||||
memset(iobuf, 0xff, ((addr - 1) & 0x1ff) + 1);
|
memset(iobuf, 0xff, ((addr - 1) & 0x1ff) + 1);
|
||||||
if (bdrv_write(s->bdrv, page, iobuf, 1) < 0) {
|
if (blk_write(s->blk, page, iobuf, 1) < 0) {
|
||||||
printf("%s: write error in sector %" PRIu64 "\n", __func__, page);
|
printf("%s: write error in sector %" PRIu64 "\n", __func__, page);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -756,9 +756,9 @@ static void glue(nand_blk_load_, PAGE_SIZE)(NANDFlashState *s,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s->bdrv) {
|
if (s->blk) {
|
||||||
if (s->mem_oob) {
|
if (s->mem_oob) {
|
||||||
if (bdrv_read(s->bdrv, SECTOR(addr), s->io, PAGE_SECTORS) < 0) {
|
if (blk_read(s->blk, SECTOR(addr), s->io, PAGE_SECTORS) < 0) {
|
||||||
printf("%s: read error in sector %" PRIu64 "\n",
|
printf("%s: read error in sector %" PRIu64 "\n",
|
||||||
__func__, SECTOR(addr));
|
__func__, SECTOR(addr));
|
||||||
}
|
}
|
||||||
@ -767,8 +767,8 @@ static void glue(nand_blk_load_, PAGE_SIZE)(NANDFlashState *s,
|
|||||||
OOB_SIZE);
|
OOB_SIZE);
|
||||||
s->ioaddr = s->io + SECTOR_OFFSET(s->addr) + offset;
|
s->ioaddr = s->io + SECTOR_OFFSET(s->addr) + offset;
|
||||||
} else {
|
} else {
|
||||||
if (bdrv_read(s->bdrv, PAGE_START(addr) >> 9,
|
if (blk_read(s->blk, PAGE_START(addr) >> 9,
|
||||||
s->io, (PAGE_SECTORS + 2)) < 0) {
|
s->io, (PAGE_SECTORS + 2)) < 0) {
|
||||||
printf("%s: read error in sector %" PRIu64 "\n",
|
printf("%s: read error in sector %" PRIu64 "\n",
|
||||||
__func__, PAGE_START(addr) >> 9);
|
__func__, PAGE_START(addr) >> 9);
|
||||||
}
|
}
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
#include <hw/pci/pci.h>
|
#include <hw/pci/pci.h>
|
||||||
#include "sysemu/sysemu.h"
|
#include "sysemu/sysemu.h"
|
||||||
#include "qapi/visitor.h"
|
#include "qapi/visitor.h"
|
||||||
|
#include "sysemu/block-backend.h"
|
||||||
|
|
||||||
#include "nvme.h"
|
#include "nvme.h"
|
||||||
|
|
||||||
@ -199,7 +200,7 @@ static void nvme_rw_cb(void *opaque, int ret)
|
|||||||
NvmeCtrl *n = sq->ctrl;
|
NvmeCtrl *n = sq->ctrl;
|
||||||
NvmeCQueue *cq = n->cq[sq->cqid];
|
NvmeCQueue *cq = n->cq[sq->cqid];
|
||||||
|
|
||||||
block_acct_done(bdrv_get_stats(n->conf.bs), &req->acct);
|
block_acct_done(blk_get_stats(n->conf.blk), &req->acct);
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
req->status = NVME_SUCCESS;
|
req->status = NVME_SUCCESS;
|
||||||
} else {
|
} else {
|
||||||
@ -233,11 +234,11 @@ static uint16_t nvme_rw(NvmeCtrl *n, NvmeNamespace *ns, NvmeCmd *cmd,
|
|||||||
}
|
}
|
||||||
assert((nlb << data_shift) == req->qsg.size);
|
assert((nlb << data_shift) == req->qsg.size);
|
||||||
|
|
||||||
dma_acct_start(n->conf.bs, &req->acct, &req->qsg, is_write ?
|
dma_acct_start(n->conf.blk, &req->acct, &req->qsg,
|
||||||
BLOCK_ACCT_WRITE : BLOCK_ACCT_READ);
|
is_write ? BLOCK_ACCT_WRITE : BLOCK_ACCT_READ);
|
||||||
req->aiocb = is_write ?
|
req->aiocb = is_write ?
|
||||||
dma_bdrv_write(n->conf.bs, &req->qsg, aio_slba, nvme_rw_cb, req) :
|
dma_blk_write(n->conf.blk, &req->qsg, aio_slba, nvme_rw_cb, req) :
|
||||||
dma_bdrv_read(n->conf.bs, &req->qsg, aio_slba, nvme_rw_cb, req);
|
dma_blk_read(n->conf.blk, &req->qsg, aio_slba, nvme_rw_cb, req);
|
||||||
|
|
||||||
return NVME_NO_COMPLETE;
|
return NVME_NO_COMPLETE;
|
||||||
}
|
}
|
||||||
@ -290,7 +291,7 @@ static uint16_t nvme_del_sq(NvmeCtrl *n, NvmeCmd *cmd)
|
|||||||
while (!QTAILQ_EMPTY(&sq->out_req_list)) {
|
while (!QTAILQ_EMPTY(&sq->out_req_list)) {
|
||||||
req = QTAILQ_FIRST(&sq->out_req_list);
|
req = QTAILQ_FIRST(&sq->out_req_list);
|
||||||
assert(req->aiocb);
|
assert(req->aiocb);
|
||||||
bdrv_aio_cancel(req->aiocb);
|
blk_aio_cancel(req->aiocb);
|
||||||
}
|
}
|
||||||
if (!nvme_check_cqid(n, sq->cqid)) {
|
if (!nvme_check_cqid(n, sq->cqid)) {
|
||||||
cq = n->cq[sq->cqid];
|
cq = n->cq[sq->cqid];
|
||||||
@ -565,7 +566,7 @@ static void nvme_clear_ctrl(NvmeCtrl *n)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bdrv_flush(n->conf.bs);
|
blk_flush(n->conf.blk);
|
||||||
n->bar.cc = 0;
|
n->bar.cc = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -750,11 +751,11 @@ static int nvme_init(PCIDevice *pci_dev)
|
|||||||
int64_t bs_size;
|
int64_t bs_size;
|
||||||
uint8_t *pci_conf;
|
uint8_t *pci_conf;
|
||||||
|
|
||||||
if (!(n->conf.bs)) {
|
if (!n->conf.blk) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
bs_size = bdrv_getlength(n->conf.bs);
|
bs_size = blk_getlength(n->conf.blk);
|
||||||
if (bs_size < 0) {
|
if (bs_size < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
#include "hw/hw.h"
|
#include "hw/hw.h"
|
||||||
#include "hw/block/flash.h"
|
#include "hw/block/flash.h"
|
||||||
#include "hw/irq.h"
|
#include "hw/irq.h"
|
||||||
|
#include "sysemu/block-backend.h"
|
||||||
#include "sysemu/blockdev.h"
|
#include "sysemu/blockdev.h"
|
||||||
#include "exec/memory.h"
|
#include "exec/memory.h"
|
||||||
#include "exec/address-spaces.h"
|
#include "exec/address-spaces.h"
|
||||||
@ -49,8 +50,8 @@ typedef struct OneNANDState {
|
|||||||
hwaddr base;
|
hwaddr base;
|
||||||
qemu_irq intr;
|
qemu_irq intr;
|
||||||
qemu_irq rdy;
|
qemu_irq rdy;
|
||||||
BlockDriverState *bdrv;
|
BlockBackend *blk;
|
||||||
BlockDriverState *bdrv_cur;
|
BlockBackend *blk_cur;
|
||||||
uint8_t *image;
|
uint8_t *image;
|
||||||
uint8_t *otp;
|
uint8_t *otp;
|
||||||
uint8_t *current;
|
uint8_t *current;
|
||||||
@ -213,7 +214,7 @@ static void onenand_reset(OneNANDState *s, int cold)
|
|||||||
s->wpstatus = 0x0002;
|
s->wpstatus = 0x0002;
|
||||||
s->cycle = 0;
|
s->cycle = 0;
|
||||||
s->otpmode = 0;
|
s->otpmode = 0;
|
||||||
s->bdrv_cur = s->bdrv;
|
s->blk_cur = s->blk;
|
||||||
s->current = s->image;
|
s->current = s->image;
|
||||||
s->secs_cur = s->secs;
|
s->secs_cur = s->secs;
|
||||||
|
|
||||||
@ -221,7 +222,7 @@ static void onenand_reset(OneNANDState *s, int cold)
|
|||||||
/* Lock the whole flash */
|
/* Lock the whole flash */
|
||||||
memset(s->blockwp, ONEN_LOCK_LOCKED, s->blocks);
|
memset(s->blockwp, ONEN_LOCK_LOCKED, s->blocks);
|
||||||
|
|
||||||
if (s->bdrv_cur && bdrv_read(s->bdrv_cur, 0, s->boot[0], 8) < 0) {
|
if (s->blk_cur && blk_read(s->blk_cur, 0, s->boot[0], 8) < 0) {
|
||||||
hw_error("%s: Loading the BootRAM failed.\n", __func__);
|
hw_error("%s: Loading the BootRAM failed.\n", __func__);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -237,10 +238,11 @@ static void onenand_system_reset(DeviceState *dev)
|
|||||||
static inline int onenand_load_main(OneNANDState *s, int sec, int secn,
|
static inline int onenand_load_main(OneNANDState *s, int sec, int secn,
|
||||||
void *dest)
|
void *dest)
|
||||||
{
|
{
|
||||||
if (s->bdrv_cur)
|
if (s->blk_cur) {
|
||||||
return bdrv_read(s->bdrv_cur, sec, dest, secn) < 0;
|
return blk_read(s->blk_cur, sec, dest, secn) < 0;
|
||||||
else if (sec + secn > s->secs_cur)
|
} else if (sec + secn > s->secs_cur) {
|
||||||
return 1;
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
memcpy(dest, s->current + (sec << 9), secn << 9);
|
memcpy(dest, s->current + (sec << 9), secn << 9);
|
||||||
|
|
||||||
@ -256,9 +258,9 @@ static inline int onenand_prog_main(OneNANDState *s, int sec, int secn,
|
|||||||
uint32_t size = (uint32_t)secn * 512;
|
uint32_t size = (uint32_t)secn * 512;
|
||||||
const uint8_t *sp = (const uint8_t *)src;
|
const uint8_t *sp = (const uint8_t *)src;
|
||||||
uint8_t *dp = 0;
|
uint8_t *dp = 0;
|
||||||
if (s->bdrv_cur) {
|
if (s->blk_cur) {
|
||||||
dp = g_malloc(size);
|
dp = g_malloc(size);
|
||||||
if (!dp || bdrv_read(s->bdrv_cur, sec, dp, secn) < 0) {
|
if (!dp || blk_read(s->blk_cur, sec, dp, secn) < 0) {
|
||||||
result = 1;
|
result = 1;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -273,11 +275,11 @@ static inline int onenand_prog_main(OneNANDState *s, int sec, int secn,
|
|||||||
for (i = 0; i < size; i++) {
|
for (i = 0; i < size; i++) {
|
||||||
dp[i] &= sp[i];
|
dp[i] &= sp[i];
|
||||||
}
|
}
|
||||||
if (s->bdrv_cur) {
|
if (s->blk_cur) {
|
||||||
result = bdrv_write(s->bdrv_cur, sec, dp, secn) < 0;
|
result = blk_write(s->blk_cur, sec, dp, secn) < 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (dp && s->bdrv_cur) {
|
if (dp && s->blk_cur) {
|
||||||
g_free(dp);
|
g_free(dp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -290,14 +292,16 @@ static inline int onenand_load_spare(OneNANDState *s, int sec, int secn,
|
|||||||
{
|
{
|
||||||
uint8_t buf[512];
|
uint8_t buf[512];
|
||||||
|
|
||||||
if (s->bdrv_cur) {
|
if (s->blk_cur) {
|
||||||
if (bdrv_read(s->bdrv_cur, s->secs_cur + (sec >> 5), buf, 1) < 0)
|
if (blk_read(s->blk_cur, s->secs_cur + (sec >> 5), buf, 1) < 0) {
|
||||||
return 1;
|
return 1;
|
||||||
|
}
|
||||||
memcpy(dest, buf + ((sec & 31) << 4), secn << 4);
|
memcpy(dest, buf + ((sec & 31) << 4), secn << 4);
|
||||||
} else if (sec + secn > s->secs_cur)
|
} else if (sec + secn > s->secs_cur) {
|
||||||
return 1;
|
return 1;
|
||||||
else
|
} else {
|
||||||
memcpy(dest, s->current + (s->secs_cur << 9) + (sec << 4), secn << 4);
|
memcpy(dest, s->current + (s->secs_cur << 9) + (sec << 4), secn << 4);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -309,11 +313,10 @@ static inline int onenand_prog_spare(OneNANDState *s, int sec, int secn,
|
|||||||
if (secn > 0) {
|
if (secn > 0) {
|
||||||
const uint8_t *sp = (const uint8_t *)src;
|
const uint8_t *sp = (const uint8_t *)src;
|
||||||
uint8_t *dp = 0, *dpp = 0;
|
uint8_t *dp = 0, *dpp = 0;
|
||||||
if (s->bdrv_cur) {
|
if (s->blk_cur) {
|
||||||
dp = g_malloc(512);
|
dp = g_malloc(512);
|
||||||
if (!dp || bdrv_read(s->bdrv_cur,
|
if (!dp
|
||||||
s->secs_cur + (sec >> 5),
|
|| blk_read(s->blk_cur, s->secs_cur + (sec >> 5), dp, 1) < 0) {
|
||||||
dp, 1) < 0) {
|
|
||||||
result = 1;
|
result = 1;
|
||||||
} else {
|
} else {
|
||||||
dpp = dp + ((sec & 31) << 4);
|
dpp = dp + ((sec & 31) << 4);
|
||||||
@ -330,9 +333,9 @@ static inline int onenand_prog_spare(OneNANDState *s, int sec, int secn,
|
|||||||
for (i = 0; i < (secn << 4); i++) {
|
for (i = 0; i < (secn << 4); i++) {
|
||||||
dpp[i] &= sp[i];
|
dpp[i] &= sp[i];
|
||||||
}
|
}
|
||||||
if (s->bdrv_cur) {
|
if (s->blk_cur) {
|
||||||
result = bdrv_write(s->bdrv_cur, s->secs_cur + (sec >> 5),
|
result = blk_write(s->blk_cur, s->secs_cur + (sec >> 5),
|
||||||
dp, 1) < 0;
|
dp, 1) < 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
g_free(dp);
|
g_free(dp);
|
||||||
@ -354,16 +357,16 @@ static inline int onenand_erase(OneNANDState *s, int sec, int num)
|
|||||||
}
|
}
|
||||||
memset(blankbuf, 0xff, 512);
|
memset(blankbuf, 0xff, 512);
|
||||||
for (; num > 0; num--, sec++) {
|
for (; num > 0; num--, sec++) {
|
||||||
if (s->bdrv_cur) {
|
if (s->blk_cur) {
|
||||||
int erasesec = s->secs_cur + (sec >> 5);
|
int erasesec = s->secs_cur + (sec >> 5);
|
||||||
if (bdrv_write(s->bdrv_cur, sec, blankbuf, 1) < 0) {
|
if (blk_write(s->blk_cur, sec, blankbuf, 1) < 0) {
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
if (bdrv_read(s->bdrv_cur, erasesec, tmpbuf, 1) < 0) {
|
if (blk_read(s->blk_cur, erasesec, tmpbuf, 1) < 0) {
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
memcpy(tmpbuf + ((sec & 31) << 4), blankbuf, 1 << 4);
|
memcpy(tmpbuf + ((sec & 31) << 4), blankbuf, 1 << 4);
|
||||||
if (bdrv_write(s->bdrv_cur, erasesec, tmpbuf, 1) < 0) {
|
if (blk_write(s->blk_cur, erasesec, tmpbuf, 1) < 0) {
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -576,7 +579,7 @@ static void onenand_command(OneNANDState *s)
|
|||||||
|
|
||||||
case 0x65: /* OTP Access */
|
case 0x65: /* OTP Access */
|
||||||
s->intstatus |= ONEN_INT;
|
s->intstatus |= ONEN_INT;
|
||||||
s->bdrv_cur = NULL;
|
s->blk_cur = NULL;
|
||||||
s->current = s->otp;
|
s->current = s->otp;
|
||||||
s->secs_cur = 1 << (BLOCK_SHIFT - 9);
|
s->secs_cur = 1 << (BLOCK_SHIFT - 9);
|
||||||
s->addr[ONEN_BUF_BLOCK] = 0;
|
s->addr[ONEN_BUF_BLOCK] = 0;
|
||||||
@ -776,15 +779,15 @@ static int onenand_initfn(SysBusDevice *sbd)
|
|||||||
? (1 << (6 + ((s->id.dev >> 4) & 7))) : 0;
|
? (1 << (6 + ((s->id.dev >> 4) & 7))) : 0;
|
||||||
memory_region_init_io(&s->iomem, OBJECT(s), &onenand_ops, s, "onenand",
|
memory_region_init_io(&s->iomem, OBJECT(s), &onenand_ops, s, "onenand",
|
||||||
0x10000 << s->shift);
|
0x10000 << s->shift);
|
||||||
if (!s->bdrv) {
|
if (!s->blk) {
|
||||||
s->image = memset(g_malloc(size + (size >> 5)),
|
s->image = memset(g_malloc(size + (size >> 5)),
|
||||||
0xff, size + (size >> 5));
|
0xff, size + (size >> 5));
|
||||||
} else {
|
} else {
|
||||||
if (bdrv_is_read_only(s->bdrv)) {
|
if (blk_is_read_only(s->blk)) {
|
||||||
error_report("Can't use a read-only drive");
|
error_report("Can't use a read-only drive");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
s->bdrv_cur = s->bdrv;
|
s->blk_cur = s->blk;
|
||||||
}
|
}
|
||||||
s->otp = memset(g_malloc((64 + 2) << PAGE_SHIFT),
|
s->otp = memset(g_malloc((64 + 2) << PAGE_SHIFT),
|
||||||
0xff, (64 + 2) << PAGE_SHIFT);
|
0xff, (64 + 2) << PAGE_SHIFT);
|
||||||
@ -815,7 +818,7 @@ static Property onenand_properties[] = {
|
|||||||
DEFINE_PROP_UINT16("device_id", OneNANDState, id.dev, 0),
|
DEFINE_PROP_UINT16("device_id", OneNANDState, id.dev, 0),
|
||||||
DEFINE_PROP_UINT16("version_id", OneNANDState, id.ver, 0),
|
DEFINE_PROP_UINT16("version_id", OneNANDState, id.ver, 0),
|
||||||
DEFINE_PROP_INT32("shift", OneNANDState, shift, 0),
|
DEFINE_PROP_INT32("shift", OneNANDState, shift, 0),
|
||||||
DEFINE_PROP_DRIVE("drive", OneNANDState, bdrv),
|
DEFINE_PROP_DRIVE("drive", OneNANDState, blk),
|
||||||
DEFINE_PROP_END_OF_LIST(),
|
DEFINE_PROP_END_OF_LIST(),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -38,7 +38,7 @@
|
|||||||
|
|
||||||
#include "hw/hw.h"
|
#include "hw/hw.h"
|
||||||
#include "hw/block/flash.h"
|
#include "hw/block/flash.h"
|
||||||
#include "block/block.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "qemu/timer.h"
|
#include "qemu/timer.h"
|
||||||
#include "qemu/bitops.h"
|
#include "qemu/bitops.h"
|
||||||
#include "exec/address-spaces.h"
|
#include "exec/address-spaces.h"
|
||||||
@ -69,7 +69,7 @@ struct pflash_t {
|
|||||||
SysBusDevice parent_obj;
|
SysBusDevice parent_obj;
|
||||||
/*< public >*/
|
/*< public >*/
|
||||||
|
|
||||||
BlockDriverState *bs;
|
BlockBackend *blk;
|
||||||
uint32_t nb_blocs;
|
uint32_t nb_blocs;
|
||||||
uint64_t sector_len;
|
uint64_t sector_len;
|
||||||
uint8_t bank_width;
|
uint8_t bank_width;
|
||||||
@ -395,13 +395,13 @@ static void pflash_update(pflash_t *pfl, int offset,
|
|||||||
int size)
|
int size)
|
||||||
{
|
{
|
||||||
int offset_end;
|
int offset_end;
|
||||||
if (pfl->bs) {
|
if (pfl->blk) {
|
||||||
offset_end = offset + size;
|
offset_end = offset + size;
|
||||||
/* round to sectors */
|
/* round to sectors */
|
||||||
offset = offset >> 9;
|
offset = offset >> 9;
|
||||||
offset_end = (offset_end + 511) >> 9;
|
offset_end = (offset_end + 511) >> 9;
|
||||||
bdrv_write(pfl->bs, offset, pfl->storage + (offset << 9),
|
blk_write(pfl->blk, offset, pfl->storage + (offset << 9),
|
||||||
offset_end - offset);
|
offset_end - offset);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -784,9 +784,9 @@ static void pflash_cfi01_realize(DeviceState *dev, Error **errp)
|
|||||||
pfl->storage = memory_region_get_ram_ptr(&pfl->mem);
|
pfl->storage = memory_region_get_ram_ptr(&pfl->mem);
|
||||||
sysbus_init_mmio(SYS_BUS_DEVICE(dev), &pfl->mem);
|
sysbus_init_mmio(SYS_BUS_DEVICE(dev), &pfl->mem);
|
||||||
|
|
||||||
if (pfl->bs) {
|
if (pfl->blk) {
|
||||||
/* read the initial flash content */
|
/* read the initial flash content */
|
||||||
ret = bdrv_read(pfl->bs, 0, pfl->storage, total_len >> 9);
|
ret = blk_read(pfl->blk, 0, pfl->storage, total_len >> 9);
|
||||||
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
vmstate_unregister_ram(&pfl->mem, DEVICE(pfl));
|
vmstate_unregister_ram(&pfl->mem, DEVICE(pfl));
|
||||||
@ -795,8 +795,8 @@ static void pflash_cfi01_realize(DeviceState *dev, Error **errp)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pfl->bs) {
|
if (pfl->blk) {
|
||||||
pfl->ro = bdrv_is_read_only(pfl->bs);
|
pfl->ro = blk_is_read_only(pfl->blk);
|
||||||
} else {
|
} else {
|
||||||
pfl->ro = 0;
|
pfl->ro = 0;
|
||||||
}
|
}
|
||||||
@ -898,7 +898,7 @@ static void pflash_cfi01_realize(DeviceState *dev, Error **errp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static Property pflash_cfi01_properties[] = {
|
static Property pflash_cfi01_properties[] = {
|
||||||
DEFINE_PROP_DRIVE("drive", struct pflash_t, bs),
|
DEFINE_PROP_DRIVE("drive", struct pflash_t, blk),
|
||||||
/* num-blocks is the number of blocks actually visible to the guest,
|
/* num-blocks is the number of blocks actually visible to the guest,
|
||||||
* ie the total size of the device divided by the sector length.
|
* ie the total size of the device divided by the sector length.
|
||||||
* If we're emulating flash devices wired in parallel the actual
|
* If we're emulating flash devices wired in parallel the actual
|
||||||
@ -962,14 +962,14 @@ type_init(pflash_cfi01_register_types)
|
|||||||
pflash_t *pflash_cfi01_register(hwaddr base,
|
pflash_t *pflash_cfi01_register(hwaddr base,
|
||||||
DeviceState *qdev, const char *name,
|
DeviceState *qdev, const char *name,
|
||||||
hwaddr size,
|
hwaddr size,
|
||||||
BlockDriverState *bs,
|
BlockBackend *blk,
|
||||||
uint32_t sector_len, int nb_blocs,
|
uint32_t sector_len, int nb_blocs,
|
||||||
int bank_width, uint16_t id0, uint16_t id1,
|
int bank_width, uint16_t id0, uint16_t id1,
|
||||||
uint16_t id2, uint16_t id3, int be)
|
uint16_t id2, uint16_t id3, int be)
|
||||||
{
|
{
|
||||||
DeviceState *dev = qdev_create(NULL, TYPE_CFI_PFLASH01);
|
DeviceState *dev = qdev_create(NULL, TYPE_CFI_PFLASH01);
|
||||||
|
|
||||||
if (bs && qdev_prop_set_drive(dev, "drive", bs)) {
|
if (blk && qdev_prop_set_drive(dev, "drive", blk)) {
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
qdev_prop_set_uint32(dev, "num-blocks", nb_blocs);
|
qdev_prop_set_uint32(dev, "num-blocks", nb_blocs);
|
||||||
|
@ -38,7 +38,7 @@
|
|||||||
#include "hw/hw.h"
|
#include "hw/hw.h"
|
||||||
#include "hw/block/flash.h"
|
#include "hw/block/flash.h"
|
||||||
#include "qemu/timer.h"
|
#include "qemu/timer.h"
|
||||||
#include "block/block.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "exec/address-spaces.h"
|
#include "exec/address-spaces.h"
|
||||||
#include "qemu/host-utils.h"
|
#include "qemu/host-utils.h"
|
||||||
#include "hw/sysbus.h"
|
#include "hw/sysbus.h"
|
||||||
@ -63,7 +63,7 @@ struct pflash_t {
|
|||||||
SysBusDevice parent_obj;
|
SysBusDevice parent_obj;
|
||||||
/*< public >*/
|
/*< public >*/
|
||||||
|
|
||||||
BlockDriverState *bs;
|
BlockBackend *blk;
|
||||||
uint32_t sector_len;
|
uint32_t sector_len;
|
||||||
uint32_t nb_blocs;
|
uint32_t nb_blocs;
|
||||||
uint32_t chip_len;
|
uint32_t chip_len;
|
||||||
@ -249,13 +249,13 @@ static void pflash_update(pflash_t *pfl, int offset,
|
|||||||
int size)
|
int size)
|
||||||
{
|
{
|
||||||
int offset_end;
|
int offset_end;
|
||||||
if (pfl->bs) {
|
if (pfl->blk) {
|
||||||
offset_end = offset + size;
|
offset_end = offset + size;
|
||||||
/* round to sectors */
|
/* round to sectors */
|
||||||
offset = offset >> 9;
|
offset = offset >> 9;
|
||||||
offset_end = (offset_end + 511) >> 9;
|
offset_end = (offset_end + 511) >> 9;
|
||||||
bdrv_write(pfl->bs, offset, pfl->storage + (offset << 9),
|
blk_write(pfl->blk, offset, pfl->storage + (offset << 9),
|
||||||
offset_end - offset);
|
offset_end - offset);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -618,9 +618,9 @@ static void pflash_cfi02_realize(DeviceState *dev, Error **errp)
|
|||||||
vmstate_register_ram(&pfl->orig_mem, DEVICE(pfl));
|
vmstate_register_ram(&pfl->orig_mem, DEVICE(pfl));
|
||||||
pfl->storage = memory_region_get_ram_ptr(&pfl->orig_mem);
|
pfl->storage = memory_region_get_ram_ptr(&pfl->orig_mem);
|
||||||
pfl->chip_len = chip_len;
|
pfl->chip_len = chip_len;
|
||||||
if (pfl->bs) {
|
if (pfl->blk) {
|
||||||
/* read the initial flash content */
|
/* read the initial flash content */
|
||||||
ret = bdrv_read(pfl->bs, 0, pfl->storage, chip_len >> 9);
|
ret = blk_read(pfl->blk, 0, pfl->storage, chip_len >> 9);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
vmstate_unregister_ram(&pfl->orig_mem, DEVICE(pfl));
|
vmstate_unregister_ram(&pfl->orig_mem, DEVICE(pfl));
|
||||||
error_setg(errp, "failed to read the initial flash content");
|
error_setg(errp, "failed to read the initial flash content");
|
||||||
@ -632,8 +632,8 @@ static void pflash_cfi02_realize(DeviceState *dev, Error **errp)
|
|||||||
pfl->rom_mode = 1;
|
pfl->rom_mode = 1;
|
||||||
sysbus_init_mmio(SYS_BUS_DEVICE(dev), &pfl->mem);
|
sysbus_init_mmio(SYS_BUS_DEVICE(dev), &pfl->mem);
|
||||||
|
|
||||||
if (pfl->bs) {
|
if (pfl->blk) {
|
||||||
pfl->ro = bdrv_is_read_only(pfl->bs);
|
pfl->ro = blk_is_read_only(pfl->blk);
|
||||||
} else {
|
} else {
|
||||||
pfl->ro = 0;
|
pfl->ro = 0;
|
||||||
}
|
}
|
||||||
@ -722,7 +722,7 @@ static void pflash_cfi02_realize(DeviceState *dev, Error **errp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static Property pflash_cfi02_properties[] = {
|
static Property pflash_cfi02_properties[] = {
|
||||||
DEFINE_PROP_DRIVE("drive", struct pflash_t, bs),
|
DEFINE_PROP_DRIVE("drive", struct pflash_t, blk),
|
||||||
DEFINE_PROP_UINT32("num-blocks", struct pflash_t, nb_blocs, 0),
|
DEFINE_PROP_UINT32("num-blocks", struct pflash_t, nb_blocs, 0),
|
||||||
DEFINE_PROP_UINT32("sector-length", struct pflash_t, sector_len, 0),
|
DEFINE_PROP_UINT32("sector-length", struct pflash_t, sector_len, 0),
|
||||||
DEFINE_PROP_UINT8("width", struct pflash_t, width, 0),
|
DEFINE_PROP_UINT8("width", struct pflash_t, width, 0),
|
||||||
@ -763,7 +763,7 @@ type_init(pflash_cfi02_register_types)
|
|||||||
pflash_t *pflash_cfi02_register(hwaddr base,
|
pflash_t *pflash_cfi02_register(hwaddr base,
|
||||||
DeviceState *qdev, const char *name,
|
DeviceState *qdev, const char *name,
|
||||||
hwaddr size,
|
hwaddr size,
|
||||||
BlockDriverState *bs, uint32_t sector_len,
|
BlockBackend *blk, uint32_t sector_len,
|
||||||
int nb_blocs, int nb_mappings, int width,
|
int nb_blocs, int nb_mappings, int width,
|
||||||
uint16_t id0, uint16_t id1,
|
uint16_t id0, uint16_t id1,
|
||||||
uint16_t id2, uint16_t id3,
|
uint16_t id2, uint16_t id3,
|
||||||
@ -772,7 +772,7 @@ pflash_t *pflash_cfi02_register(hwaddr base,
|
|||||||
{
|
{
|
||||||
DeviceState *dev = qdev_create(NULL, TYPE_CFI_PFLASH02);
|
DeviceState *dev = qdev_create(NULL, TYPE_CFI_PFLASH02);
|
||||||
|
|
||||||
if (bs && qdev_prop_set_drive(dev, "drive", bs)) {
|
if (blk && qdev_prop_set_drive(dev, "drive", blk)) {
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
qdev_prop_set_uint32(dev, "num-blocks", nb_blocs);
|
qdev_prop_set_uint32(dev, "num-blocks", nb_blocs);
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
#include "qemu/error-report.h"
|
#include "qemu/error-report.h"
|
||||||
#include "trace.h"
|
#include "trace.h"
|
||||||
#include "hw/block/block.h"
|
#include "hw/block/block.h"
|
||||||
|
#include "sysemu/block-backend.h"
|
||||||
#include "sysemu/blockdev.h"
|
#include "sysemu/blockdev.h"
|
||||||
#include "hw/virtio/virtio-blk.h"
|
#include "hw/virtio/virtio-blk.h"
|
||||||
#include "dataplane/virtio-blk.h"
|
#include "dataplane/virtio-blk.h"
|
||||||
@ -64,7 +65,8 @@ static void virtio_blk_req_complete(VirtIOBlockReq *req, unsigned char status)
|
|||||||
static int virtio_blk_handle_rw_error(VirtIOBlockReq *req, int error,
|
static int virtio_blk_handle_rw_error(VirtIOBlockReq *req, int error,
|
||||||
bool is_read)
|
bool is_read)
|
||||||
{
|
{
|
||||||
BlockErrorAction action = bdrv_get_error_action(req->dev->bs, is_read, error);
|
BlockErrorAction action = blk_get_error_action(req->dev->blk,
|
||||||
|
is_read, error);
|
||||||
VirtIOBlock *s = req->dev;
|
VirtIOBlock *s = req->dev;
|
||||||
|
|
||||||
if (action == BLOCK_ERROR_ACTION_STOP) {
|
if (action == BLOCK_ERROR_ACTION_STOP) {
|
||||||
@ -72,11 +74,11 @@ static int virtio_blk_handle_rw_error(VirtIOBlockReq *req, int error,
|
|||||||
s->rq = req;
|
s->rq = req;
|
||||||
} else if (action == BLOCK_ERROR_ACTION_REPORT) {
|
} else if (action == BLOCK_ERROR_ACTION_REPORT) {
|
||||||
virtio_blk_req_complete(req, VIRTIO_BLK_S_IOERR);
|
virtio_blk_req_complete(req, VIRTIO_BLK_S_IOERR);
|
||||||
block_acct_done(bdrv_get_stats(s->bs), &req->acct);
|
block_acct_done(blk_get_stats(s->blk), &req->acct);
|
||||||
virtio_blk_free_request(req);
|
virtio_blk_free_request(req);
|
||||||
}
|
}
|
||||||
|
|
||||||
bdrv_error_action(s->bs, action, is_read, error);
|
blk_error_action(s->blk, action, is_read, error);
|
||||||
return action != BLOCK_ERROR_ACTION_IGNORE;
|
return action != BLOCK_ERROR_ACTION_IGNORE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -94,7 +96,7 @@ static void virtio_blk_rw_complete(void *opaque, int ret)
|
|||||||
}
|
}
|
||||||
|
|
||||||
virtio_blk_req_complete(req, VIRTIO_BLK_S_OK);
|
virtio_blk_req_complete(req, VIRTIO_BLK_S_OK);
|
||||||
block_acct_done(bdrv_get_stats(req->dev->bs), &req->acct);
|
block_acct_done(blk_get_stats(req->dev->blk), &req->acct);
|
||||||
virtio_blk_free_request(req);
|
virtio_blk_free_request(req);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -109,7 +111,7 @@ static void virtio_blk_flush_complete(void *opaque, int ret)
|
|||||||
}
|
}
|
||||||
|
|
||||||
virtio_blk_req_complete(req, VIRTIO_BLK_S_OK);
|
virtio_blk_req_complete(req, VIRTIO_BLK_S_OK);
|
||||||
block_acct_done(bdrv_get_stats(req->dev->bs), &req->acct);
|
block_acct_done(blk_get_stats(req->dev->blk), &req->acct);
|
||||||
virtio_blk_free_request(req);
|
virtio_blk_free_request(req);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -209,7 +211,7 @@ int virtio_blk_handle_scsi_req(VirtIOBlock *blk,
|
|||||||
hdr.sbp = elem->in_sg[elem->in_num - 3].iov_base;
|
hdr.sbp = elem->in_sg[elem->in_num - 3].iov_base;
|
||||||
hdr.mx_sb_len = elem->in_sg[elem->in_num - 3].iov_len;
|
hdr.mx_sb_len = elem->in_sg[elem->in_num - 3].iov_len;
|
||||||
|
|
||||||
status = bdrv_ioctl(blk->bs, SG_IO, &hdr);
|
status = blk_ioctl(blk->blk, SG_IO, &hdr);
|
||||||
if (status) {
|
if (status) {
|
||||||
status = VIRTIO_BLK_S_UNSUPP;
|
status = VIRTIO_BLK_S_UNSUPP;
|
||||||
goto fail;
|
goto fail;
|
||||||
@ -255,7 +257,7 @@ static void virtio_blk_handle_scsi(VirtIOBlockReq *req)
|
|||||||
virtio_blk_free_request(req);
|
virtio_blk_free_request(req);
|
||||||
}
|
}
|
||||||
|
|
||||||
void virtio_submit_multiwrite(BlockDriverState *bs, MultiReqBuffer *mrb)
|
void virtio_submit_multiwrite(BlockBackend *blk, MultiReqBuffer *mrb)
|
||||||
{
|
{
|
||||||
int i, ret;
|
int i, ret;
|
||||||
|
|
||||||
@ -263,7 +265,7 @@ void virtio_submit_multiwrite(BlockDriverState *bs, MultiReqBuffer *mrb)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = bdrv_aio_multiwrite(bs, mrb->blkreq, mrb->num_writes);
|
ret = blk_aio_multiwrite(blk, mrb->blkreq, mrb->num_writes);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
for (i = 0; i < mrb->num_writes; i++) {
|
for (i = 0; i < mrb->num_writes; i++) {
|
||||||
if (mrb->blkreq[i].error) {
|
if (mrb->blkreq[i].error) {
|
||||||
@ -277,14 +279,14 @@ void virtio_submit_multiwrite(BlockDriverState *bs, MultiReqBuffer *mrb)
|
|||||||
|
|
||||||
static void virtio_blk_handle_flush(VirtIOBlockReq *req, MultiReqBuffer *mrb)
|
static void virtio_blk_handle_flush(VirtIOBlockReq *req, MultiReqBuffer *mrb)
|
||||||
{
|
{
|
||||||
block_acct_start(bdrv_get_stats(req->dev->bs), &req->acct, 0,
|
block_acct_start(blk_get_stats(req->dev->blk), &req->acct, 0,
|
||||||
BLOCK_ACCT_FLUSH);
|
BLOCK_ACCT_FLUSH);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Make sure all outstanding writes are posted to the backing device.
|
* Make sure all outstanding writes are posted to the backing device.
|
||||||
*/
|
*/
|
||||||
virtio_submit_multiwrite(req->dev->bs, mrb);
|
virtio_submit_multiwrite(req->dev->blk, mrb);
|
||||||
bdrv_aio_flush(req->dev->bs, virtio_blk_flush_complete, req);
|
blk_aio_flush(req->dev->blk, virtio_blk_flush_complete, req);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool virtio_blk_sect_range_ok(VirtIOBlock *dev,
|
static bool virtio_blk_sect_range_ok(VirtIOBlock *dev,
|
||||||
@ -299,7 +301,7 @@ static bool virtio_blk_sect_range_ok(VirtIOBlock *dev,
|
|||||||
if (size % dev->conf.conf.logical_block_size) {
|
if (size % dev->conf.conf.logical_block_size) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
bdrv_get_geometry(dev->bs, &total_sectors);
|
blk_get_geometry(dev->blk, &total_sectors);
|
||||||
if (sector > total_sectors || nb_sectors > total_sectors - sector) {
|
if (sector > total_sectors || nb_sectors > total_sectors - sector) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -321,11 +323,11 @@ static void virtio_blk_handle_write(VirtIOBlockReq *req, MultiReqBuffer *mrb)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
block_acct_start(bdrv_get_stats(req->dev->bs), &req->acct, req->qiov.size,
|
block_acct_start(blk_get_stats(req->dev->blk), &req->acct, req->qiov.size,
|
||||||
BLOCK_ACCT_WRITE);
|
BLOCK_ACCT_WRITE);
|
||||||
|
|
||||||
if (mrb->num_writes == 32) {
|
if (mrb->num_writes == 32) {
|
||||||
virtio_submit_multiwrite(req->dev->bs, mrb);
|
virtio_submit_multiwrite(req->dev->blk, mrb);
|
||||||
}
|
}
|
||||||
|
|
||||||
blkreq = &mrb->blkreq[mrb->num_writes];
|
blkreq = &mrb->blkreq[mrb->num_writes];
|
||||||
@ -353,11 +355,11 @@ static void virtio_blk_handle_read(VirtIOBlockReq *req)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
block_acct_start(bdrv_get_stats(req->dev->bs), &req->acct, req->qiov.size,
|
block_acct_start(blk_get_stats(req->dev->blk), &req->acct, req->qiov.size,
|
||||||
BLOCK_ACCT_READ);
|
BLOCK_ACCT_READ);
|
||||||
bdrv_aio_readv(req->dev->bs, sector, &req->qiov,
|
blk_aio_readv(req->dev->blk, sector, &req->qiov,
|
||||||
req->qiov.size / BDRV_SECTOR_SIZE,
|
req->qiov.size / BDRV_SECTOR_SIZE,
|
||||||
virtio_blk_rw_complete, req);
|
virtio_blk_rw_complete, req);
|
||||||
}
|
}
|
||||||
|
|
||||||
void virtio_blk_handle_request(VirtIOBlockReq *req, MultiReqBuffer *mrb)
|
void virtio_blk_handle_request(VirtIOBlockReq *req, MultiReqBuffer *mrb)
|
||||||
@ -445,7 +447,7 @@ static void virtio_blk_handle_output(VirtIODevice *vdev, VirtQueue *vq)
|
|||||||
virtio_blk_handle_request(req, &mrb);
|
virtio_blk_handle_request(req, &mrb);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtio_submit_multiwrite(s->bs, &mrb);
|
virtio_submit_multiwrite(s->blk, &mrb);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* FIXME: Want to check for completions before returning to guest mode,
|
* FIXME: Want to check for completions before returning to guest mode,
|
||||||
@ -473,7 +475,7 @@ static void virtio_blk_dma_restart_bh(void *opaque)
|
|||||||
req = next;
|
req = next;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtio_submit_multiwrite(s->bs, &mrb);
|
virtio_submit_multiwrite(s->blk, &mrb);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void virtio_blk_dma_restart_cb(void *opaque, int running,
|
static void virtio_blk_dma_restart_cb(void *opaque, int running,
|
||||||
@ -486,7 +488,7 @@ static void virtio_blk_dma_restart_cb(void *opaque, int running,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!s->bh) {
|
if (!s->bh) {
|
||||||
s->bh = aio_bh_new(bdrv_get_aio_context(s->conf.conf.bs),
|
s->bh = aio_bh_new(blk_get_aio_context(s->conf.conf.blk),
|
||||||
virtio_blk_dma_restart_bh, s);
|
virtio_blk_dma_restart_bh, s);
|
||||||
qemu_bh_schedule(s->bh);
|
qemu_bh_schedule(s->bh);
|
||||||
}
|
}
|
||||||
@ -504,8 +506,8 @@ static void virtio_blk_reset(VirtIODevice *vdev)
|
|||||||
* This should cancel pending requests, but can't do nicely until there
|
* This should cancel pending requests, but can't do nicely until there
|
||||||
* are per-device request lists.
|
* are per-device request lists.
|
||||||
*/
|
*/
|
||||||
bdrv_drain_all();
|
blk_drain_all();
|
||||||
bdrv_set_enable_write_cache(s->bs, s->original_wce);
|
blk_set_enable_write_cache(s->blk, s->original_wce);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* coalesce internal state, copy to pci i/o region 0
|
/* coalesce internal state, copy to pci i/o region 0
|
||||||
@ -518,7 +520,7 @@ static void virtio_blk_update_config(VirtIODevice *vdev, uint8_t *config)
|
|||||||
uint64_t capacity;
|
uint64_t capacity;
|
||||||
int blk_size = conf->logical_block_size;
|
int blk_size = conf->logical_block_size;
|
||||||
|
|
||||||
bdrv_get_geometry(s->bs, &capacity);
|
blk_get_geometry(s->blk, &capacity);
|
||||||
memset(&blkcfg, 0, sizeof(blkcfg));
|
memset(&blkcfg, 0, sizeof(blkcfg));
|
||||||
virtio_stq_p(vdev, &blkcfg.capacity, capacity);
|
virtio_stq_p(vdev, &blkcfg.capacity, capacity);
|
||||||
virtio_stl_p(vdev, &blkcfg.seg_max, 128 - 2);
|
virtio_stl_p(vdev, &blkcfg.seg_max, 128 - 2);
|
||||||
@ -538,7 +540,7 @@ static void virtio_blk_update_config(VirtIODevice *vdev, uint8_t *config)
|
|||||||
* divided by 512 - instead it is the amount of blk_size blocks
|
* divided by 512 - instead it is the amount of blk_size blocks
|
||||||
* per track (cylinder).
|
* per track (cylinder).
|
||||||
*/
|
*/
|
||||||
if (bdrv_getlength(s->bs) / conf->heads / conf->secs % blk_size) {
|
if (blk_getlength(s->blk) / conf->heads / conf->secs % blk_size) {
|
||||||
blkcfg.sectors = conf->secs & ~s->sector_mask;
|
blkcfg.sectors = conf->secs & ~s->sector_mask;
|
||||||
} else {
|
} else {
|
||||||
blkcfg.sectors = conf->secs;
|
blkcfg.sectors = conf->secs;
|
||||||
@ -546,7 +548,7 @@ static void virtio_blk_update_config(VirtIODevice *vdev, uint8_t *config)
|
|||||||
blkcfg.size_max = 0;
|
blkcfg.size_max = 0;
|
||||||
blkcfg.physical_block_exp = get_physical_block_exp(conf);
|
blkcfg.physical_block_exp = get_physical_block_exp(conf);
|
||||||
blkcfg.alignment_offset = 0;
|
blkcfg.alignment_offset = 0;
|
||||||
blkcfg.wce = bdrv_enable_write_cache(s->bs);
|
blkcfg.wce = blk_enable_write_cache(s->blk);
|
||||||
memcpy(config, &blkcfg, sizeof(struct virtio_blk_config));
|
memcpy(config, &blkcfg, sizeof(struct virtio_blk_config));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -557,9 +559,9 @@ static void virtio_blk_set_config(VirtIODevice *vdev, const uint8_t *config)
|
|||||||
|
|
||||||
memcpy(&blkcfg, config, sizeof(blkcfg));
|
memcpy(&blkcfg, config, sizeof(blkcfg));
|
||||||
|
|
||||||
aio_context_acquire(bdrv_get_aio_context(s->bs));
|
aio_context_acquire(blk_get_aio_context(s->blk));
|
||||||
bdrv_set_enable_write_cache(s->bs, blkcfg.wce != 0);
|
blk_set_enable_write_cache(s->blk, blkcfg.wce != 0);
|
||||||
aio_context_release(bdrv_get_aio_context(s->bs));
|
aio_context_release(blk_get_aio_context(s->blk));
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint32_t virtio_blk_get_features(VirtIODevice *vdev, uint32_t features)
|
static uint32_t virtio_blk_get_features(VirtIODevice *vdev, uint32_t features)
|
||||||
@ -575,11 +577,12 @@ static uint32_t virtio_blk_get_features(VirtIODevice *vdev, uint32_t features)
|
|||||||
if (s->conf.config_wce) {
|
if (s->conf.config_wce) {
|
||||||
features |= (1 << VIRTIO_BLK_F_CONFIG_WCE);
|
features |= (1 << VIRTIO_BLK_F_CONFIG_WCE);
|
||||||
}
|
}
|
||||||
if (bdrv_enable_write_cache(s->bs))
|
if (blk_enable_write_cache(s->blk)) {
|
||||||
features |= (1 << VIRTIO_BLK_F_WCE);
|
features |= (1 << VIRTIO_BLK_F_WCE);
|
||||||
|
}
|
||||||
if (bdrv_is_read_only(s->bs))
|
if (blk_is_read_only(s->blk)) {
|
||||||
features |= 1 << VIRTIO_BLK_F_RO;
|
features |= 1 << VIRTIO_BLK_F_RO;
|
||||||
|
}
|
||||||
|
|
||||||
return features;
|
return features;
|
||||||
}
|
}
|
||||||
@ -613,13 +616,13 @@ static void virtio_blk_set_status(VirtIODevice *vdev, uint8_t status)
|
|||||||
* Guest writes 1 to the WCE configuration field (writeback mode)
|
* Guest writes 1 to the WCE configuration field (writeback mode)
|
||||||
* Guest sets DRIVER_OK bit in status field
|
* Guest sets DRIVER_OK bit in status field
|
||||||
*
|
*
|
||||||
* s->bs would erroneously be placed in writethrough mode.
|
* s->blk would erroneously be placed in writethrough mode.
|
||||||
*/
|
*/
|
||||||
if (!(features & (1 << VIRTIO_BLK_F_CONFIG_WCE))) {
|
if (!(features & (1 << VIRTIO_BLK_F_CONFIG_WCE))) {
|
||||||
aio_context_acquire(bdrv_get_aio_context(s->bs));
|
aio_context_acquire(blk_get_aio_context(s->blk));
|
||||||
bdrv_set_enable_write_cache(s->bs,
|
blk_set_enable_write_cache(s->blk,
|
||||||
!!(features & (1 << VIRTIO_BLK_F_WCE)));
|
!!(features & (1 << VIRTIO_BLK_F_WCE)));
|
||||||
aio_context_release(bdrv_get_aio_context(s->bs));
|
aio_context_release(blk_get_aio_context(s->blk));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -708,7 +711,7 @@ static void virtio_blk_migration_state_changed(Notifier *notifier, void *data)
|
|||||||
if (s->dataplane) {
|
if (s->dataplane) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
bdrv_drain_all(); /* complete in-flight non-dataplane requests */
|
blk_drain_all(); /* complete in-flight non-dataplane requests */
|
||||||
virtio_blk_data_plane_create(VIRTIO_DEVICE(s), &s->conf,
|
virtio_blk_data_plane_create(VIRTIO_DEVICE(s), &s->conf,
|
||||||
&s->dataplane, &err);
|
&s->dataplane, &err);
|
||||||
if (err != NULL) {
|
if (err != NULL) {
|
||||||
@ -726,17 +729,17 @@ static void virtio_blk_device_realize(DeviceState *dev, Error **errp)
|
|||||||
Error *err = NULL;
|
Error *err = NULL;
|
||||||
static int virtio_blk_id;
|
static int virtio_blk_id;
|
||||||
|
|
||||||
if (!conf->conf.bs) {
|
if (!conf->conf.blk) {
|
||||||
error_setg(errp, "drive property not set");
|
error_setg(errp, "drive property not set");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!bdrv_is_inserted(conf->conf.bs)) {
|
if (!blk_is_inserted(conf->conf.blk)) {
|
||||||
error_setg(errp, "Device needs media, but drive is empty");
|
error_setg(errp, "Device needs media, but drive is empty");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
blkconf_serial(&conf->conf, &conf->serial);
|
blkconf_serial(&conf->conf, &conf->serial);
|
||||||
s->original_wce = bdrv_enable_write_cache(conf->conf.bs);
|
s->original_wce = blk_enable_write_cache(conf->conf.blk);
|
||||||
blkconf_geometry(&conf->conf, NULL, 65535, 255, 255, &err);
|
blkconf_geometry(&conf->conf, NULL, 65535, 255, 255, &err);
|
||||||
if (err) {
|
if (err) {
|
||||||
error_propagate(errp, err);
|
error_propagate(errp, err);
|
||||||
@ -746,7 +749,7 @@ static void virtio_blk_device_realize(DeviceState *dev, Error **errp)
|
|||||||
virtio_init(vdev, "virtio-blk", VIRTIO_ID_BLOCK,
|
virtio_init(vdev, "virtio-blk", VIRTIO_ID_BLOCK,
|
||||||
sizeof(struct virtio_blk_config));
|
sizeof(struct virtio_blk_config));
|
||||||
|
|
||||||
s->bs = conf->conf.bs;
|
s->blk = conf->conf.blk;
|
||||||
s->rq = NULL;
|
s->rq = NULL;
|
||||||
s->sector_mask = (s->conf.conf.logical_block_size / BDRV_SECTOR_SIZE) - 1;
|
s->sector_mask = (s->conf.conf.logical_block_size / BDRV_SECTOR_SIZE) - 1;
|
||||||
|
|
||||||
@ -764,10 +767,10 @@ static void virtio_blk_device_realize(DeviceState *dev, Error **errp)
|
|||||||
s->change = qemu_add_vm_change_state_handler(virtio_blk_dma_restart_cb, s);
|
s->change = qemu_add_vm_change_state_handler(virtio_blk_dma_restart_cb, s);
|
||||||
register_savevm(dev, "virtio-blk", virtio_blk_id++, 2,
|
register_savevm(dev, "virtio-blk", virtio_blk_id++, 2,
|
||||||
virtio_blk_save, virtio_blk_load, s);
|
virtio_blk_save, virtio_blk_load, s);
|
||||||
bdrv_set_dev_ops(s->bs, &virtio_block_ops, s);
|
blk_set_dev_ops(s->blk, &virtio_block_ops, s);
|
||||||
bdrv_set_guest_block_size(s->bs, s->conf.conf.logical_block_size);
|
blk_set_guest_block_size(s->blk, s->conf.conf.logical_block_size);
|
||||||
|
|
||||||
bdrv_iostatus_enable(s->bs);
|
blk_iostatus_enable(s->blk);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void virtio_blk_device_unrealize(DeviceState *dev, Error **errp)
|
static void virtio_blk_device_unrealize(DeviceState *dev, Error **errp)
|
||||||
@ -780,7 +783,7 @@ static void virtio_blk_device_unrealize(DeviceState *dev, Error **errp)
|
|||||||
s->dataplane = NULL;
|
s->dataplane = NULL;
|
||||||
qemu_del_vm_change_state_handler(s->change);
|
qemu_del_vm_change_state_handler(s->change);
|
||||||
unregister_savevm(dev, "virtio-blk", s);
|
unregister_savevm(dev, "virtio-blk", s);
|
||||||
blockdev_mark_auto_del(s->bs);
|
blockdev_mark_auto_del(s->blk);
|
||||||
virtio_cleanup(vdev);
|
virtio_cleanup(vdev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -123,7 +123,7 @@ struct XenBlkDev {
|
|||||||
|
|
||||||
/* qemu block driver */
|
/* qemu block driver */
|
||||||
DriveInfo *dinfo;
|
DriveInfo *dinfo;
|
||||||
BlockDriverState *bs;
|
BlockBackend *blk;
|
||||||
QEMUBH *bh;
|
QEMUBH *bh;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -480,7 +480,7 @@ static void qemu_aio_complete(void *opaque, int ret)
|
|||||||
if (ioreq->postsync) {
|
if (ioreq->postsync) {
|
||||||
ioreq->postsync = 0;
|
ioreq->postsync = 0;
|
||||||
ioreq->aio_inflight++;
|
ioreq->aio_inflight++;
|
||||||
bdrv_aio_flush(ioreq->blkdev->bs, qemu_aio_complete, ioreq);
|
blk_aio_flush(ioreq->blkdev->blk, qemu_aio_complete, ioreq);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -494,7 +494,7 @@ static void qemu_aio_complete(void *opaque, int ret)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case BLKIF_OP_READ:
|
case BLKIF_OP_READ:
|
||||||
block_acct_done(bdrv_get_stats(ioreq->blkdev->bs), &ioreq->acct);
|
block_acct_done(blk_get_stats(ioreq->blkdev->blk), &ioreq->acct);
|
||||||
break;
|
break;
|
||||||
case BLKIF_OP_DISCARD:
|
case BLKIF_OP_DISCARD:
|
||||||
default:
|
default:
|
||||||
@ -513,18 +513,18 @@ static int ioreq_runio_qemu_aio(struct ioreq *ioreq)
|
|||||||
|
|
||||||
ioreq->aio_inflight++;
|
ioreq->aio_inflight++;
|
||||||
if (ioreq->presync) {
|
if (ioreq->presync) {
|
||||||
bdrv_aio_flush(ioreq->blkdev->bs, qemu_aio_complete, ioreq);
|
blk_aio_flush(ioreq->blkdev->blk, qemu_aio_complete, ioreq);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (ioreq->req.operation) {
|
switch (ioreq->req.operation) {
|
||||||
case BLKIF_OP_READ:
|
case BLKIF_OP_READ:
|
||||||
block_acct_start(bdrv_get_stats(blkdev->bs), &ioreq->acct,
|
block_acct_start(blk_get_stats(blkdev->blk), &ioreq->acct,
|
||||||
ioreq->v.size, BLOCK_ACCT_READ);
|
ioreq->v.size, BLOCK_ACCT_READ);
|
||||||
ioreq->aio_inflight++;
|
ioreq->aio_inflight++;
|
||||||
bdrv_aio_readv(blkdev->bs, ioreq->start / BLOCK_SIZE,
|
blk_aio_readv(blkdev->blk, ioreq->start / BLOCK_SIZE,
|
||||||
&ioreq->v, ioreq->v.size / BLOCK_SIZE,
|
&ioreq->v, ioreq->v.size / BLOCK_SIZE,
|
||||||
qemu_aio_complete, ioreq);
|
qemu_aio_complete, ioreq);
|
||||||
break;
|
break;
|
||||||
case BLKIF_OP_WRITE:
|
case BLKIF_OP_WRITE:
|
||||||
case BLKIF_OP_FLUSH_DISKCACHE:
|
case BLKIF_OP_FLUSH_DISKCACHE:
|
||||||
@ -532,18 +532,18 @@ static int ioreq_runio_qemu_aio(struct ioreq *ioreq)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
block_acct_start(bdrv_get_stats(blkdev->bs), &ioreq->acct,
|
block_acct_start(blk_get_stats(blkdev->blk), &ioreq->acct,
|
||||||
ioreq->v.size, BLOCK_ACCT_WRITE);
|
ioreq->v.size, BLOCK_ACCT_WRITE);
|
||||||
ioreq->aio_inflight++;
|
ioreq->aio_inflight++;
|
||||||
bdrv_aio_writev(blkdev->bs, ioreq->start / BLOCK_SIZE,
|
blk_aio_writev(blkdev->blk, ioreq->start / BLOCK_SIZE,
|
||||||
&ioreq->v, ioreq->v.size / BLOCK_SIZE,
|
&ioreq->v, ioreq->v.size / BLOCK_SIZE,
|
||||||
qemu_aio_complete, ioreq);
|
qemu_aio_complete, ioreq);
|
||||||
break;
|
break;
|
||||||
case BLKIF_OP_DISCARD:
|
case BLKIF_OP_DISCARD:
|
||||||
{
|
{
|
||||||
struct blkif_request_discard *discard_req = (void *)&ioreq->req;
|
struct blkif_request_discard *discard_req = (void *)&ioreq->req;
|
||||||
ioreq->aio_inflight++;
|
ioreq->aio_inflight++;
|
||||||
bdrv_aio_discard(blkdev->bs,
|
blk_aio_discard(blkdev->blk,
|
||||||
discard_req->sector_number, discard_req->nr_sectors,
|
discard_req->sector_number, discard_req->nr_sectors,
|
||||||
qemu_aio_complete, ioreq);
|
qemu_aio_complete, ioreq);
|
||||||
break;
|
break;
|
||||||
@ -857,6 +857,7 @@ static int blk_connect(struct XenDevice *xendev)
|
|||||||
Error *local_err = NULL;
|
Error *local_err = NULL;
|
||||||
BlockBackend *blk;
|
BlockBackend *blk;
|
||||||
BlockDriver *drv;
|
BlockDriver *drv;
|
||||||
|
BlockDriverState *bs;
|
||||||
|
|
||||||
/* setup via xenbus -> create new block driver instance */
|
/* setup via xenbus -> create new block driver instance */
|
||||||
xen_be_printf(&blkdev->xendev, 2, "create new bdrv (xenbus setup)\n");
|
xen_be_printf(&blkdev->xendev, 2, "create new bdrv (xenbus setup)\n");
|
||||||
@ -864,39 +865,39 @@ static int blk_connect(struct XenDevice *xendev)
|
|||||||
if (!blk) {
|
if (!blk) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
blkdev->bs = blk_bs(blk);
|
blkdev->blk = blk;
|
||||||
|
|
||||||
|
bs = blk_bs(blk);
|
||||||
drv = bdrv_find_whitelisted_format(blkdev->fileproto, readonly);
|
drv = bdrv_find_whitelisted_format(blkdev->fileproto, readonly);
|
||||||
if (bdrv_open(&blkdev->bs, blkdev->filename, NULL, NULL, qflags,
|
if (bdrv_open(&bs, blkdev->filename, NULL, NULL, qflags,
|
||||||
drv, &local_err) != 0) {
|
drv, &local_err) != 0) {
|
||||||
xen_be_printf(&blkdev->xendev, 0, "error: %s\n",
|
xen_be_printf(&blkdev->xendev, 0, "error: %s\n",
|
||||||
error_get_pretty(local_err));
|
error_get_pretty(local_err));
|
||||||
error_free(local_err);
|
error_free(local_err);
|
||||||
blk_unref(blk);
|
blk_unref(blk);
|
||||||
blkdev->bs = NULL;
|
blkdev->blk = NULL;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
assert(bs == blk_bs(blk));
|
||||||
} else {
|
} else {
|
||||||
/* setup via qemu cmdline -> already setup for us */
|
/* setup via qemu cmdline -> already setup for us */
|
||||||
xen_be_printf(&blkdev->xendev, 2, "get configured bdrv (cmdline setup)\n");
|
xen_be_printf(&blkdev->xendev, 2, "get configured bdrv (cmdline setup)\n");
|
||||||
blkdev->bs = blk_bs(blk_by_legacy_dinfo(blkdev->dinfo));
|
blkdev->blk = blk_by_legacy_dinfo(blkdev->dinfo);
|
||||||
if (bdrv_is_read_only(blkdev->bs) && !readonly) {
|
if (blk_is_read_only(blkdev->blk) && !readonly) {
|
||||||
xen_be_printf(&blkdev->xendev, 0, "Unexpected read-only drive");
|
xen_be_printf(&blkdev->xendev, 0, "Unexpected read-only drive");
|
||||||
blkdev->bs = NULL;
|
blkdev->blk = NULL;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
/* blkdev->bs is not create by us, we get a reference
|
/* blkdev->blk is not create by us, we get a reference
|
||||||
* so we can bdrv_unref() unconditionally */
|
* so we can blk_unref() unconditionally */
|
||||||
/* Except we don't bdrv_unref() anymore, we blk_unref().
|
blk_ref(blkdev->blk);
|
||||||
* Conditionally, because we can't easily blk_ref() here.
|
|
||||||
* TODO Clean this up! */
|
|
||||||
}
|
}
|
||||||
bdrv_attach_dev_nofail(blkdev->bs, blkdev);
|
blk_attach_dev_nofail(blkdev->blk, blkdev);
|
||||||
blkdev->file_size = bdrv_getlength(blkdev->bs);
|
blkdev->file_size = blk_getlength(blkdev->blk);
|
||||||
if (blkdev->file_size < 0) {
|
if (blkdev->file_size < 0) {
|
||||||
xen_be_printf(&blkdev->xendev, 1, "bdrv_getlength: %d (%s) | drv %s\n",
|
xen_be_printf(&blkdev->xendev, 1, "blk_getlength: %d (%s) | drv %s\n",
|
||||||
(int)blkdev->file_size, strerror(-blkdev->file_size),
|
(int)blkdev->file_size, strerror(-blkdev->file_size),
|
||||||
bdrv_get_format_name(blkdev->bs) ?: "-");
|
bdrv_get_format_name(blk_bs(blkdev->blk)) ?: "-");
|
||||||
blkdev->file_size = 0;
|
blkdev->file_size = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -987,12 +988,10 @@ static void blk_disconnect(struct XenDevice *xendev)
|
|||||||
{
|
{
|
||||||
struct XenBlkDev *blkdev = container_of(xendev, struct XenBlkDev, xendev);
|
struct XenBlkDev *blkdev = container_of(xendev, struct XenBlkDev, xendev);
|
||||||
|
|
||||||
if (blkdev->bs) {
|
if (blkdev->blk) {
|
||||||
bdrv_detach_dev(blkdev->bs, blkdev);
|
blk_detach_dev(blkdev->blk, blkdev);
|
||||||
if (!blkdev->dinfo) {
|
blk_unref(blkdev->blk);
|
||||||
blk_unref(blk_by_name(blkdev->dev));
|
blkdev->blk = NULL;
|
||||||
}
|
|
||||||
blkdev->bs = NULL;
|
|
||||||
}
|
}
|
||||||
xen_be_unbind_evtchn(&blkdev->xendev);
|
xen_be_unbind_evtchn(&blkdev->xendev);
|
||||||
|
|
||||||
@ -1008,7 +1007,7 @@ static int blk_free(struct XenDevice *xendev)
|
|||||||
struct XenBlkDev *blkdev = container_of(xendev, struct XenBlkDev, xendev);
|
struct XenBlkDev *blkdev = container_of(xendev, struct XenBlkDev, xendev);
|
||||||
struct ioreq *ioreq;
|
struct ioreq *ioreq;
|
||||||
|
|
||||||
if (blkdev->bs || blkdev->sring) {
|
if (blkdev->blk || blkdev->sring) {
|
||||||
blk_disconnect(xendev);
|
blk_disconnect(xendev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
#include "net/net.h"
|
#include "net/net.h"
|
||||||
#include "hw/qdev.h"
|
#include "hw/qdev.h"
|
||||||
#include "qapi/qmp/qerror.h"
|
#include "qapi/qmp/qerror.h"
|
||||||
|
#include "sysemu/block-backend.h"
|
||||||
#include "sysemu/blockdev.h"
|
#include "sysemu/blockdev.h"
|
||||||
#include "hw/block/block.h"
|
#include "hw/block/block.h"
|
||||||
#include "net/hub.h"
|
#include "net/hub.h"
|
||||||
@ -68,16 +69,16 @@ static void set_pointer(Object *obj, Visitor *v, Property *prop,
|
|||||||
|
|
||||||
static int parse_drive(DeviceState *dev, const char *str, void **ptr)
|
static int parse_drive(DeviceState *dev, const char *str, void **ptr)
|
||||||
{
|
{
|
||||||
BlockDriverState *bs;
|
BlockBackend *blk;
|
||||||
|
|
||||||
bs = bdrv_find(str);
|
blk = blk_by_name(str);
|
||||||
if (bs == NULL) {
|
if (!blk) {
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
}
|
}
|
||||||
if (bdrv_attach_dev(bs, dev) < 0) {
|
if (blk_attach_dev(blk, dev) < 0) {
|
||||||
return -EEXIST;
|
return -EEXIST;
|
||||||
}
|
}
|
||||||
*ptr = bs;
|
*ptr = blk;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -85,17 +86,17 @@ static void release_drive(Object *obj, const char *name, void *opaque)
|
|||||||
{
|
{
|
||||||
DeviceState *dev = DEVICE(obj);
|
DeviceState *dev = DEVICE(obj);
|
||||||
Property *prop = opaque;
|
Property *prop = opaque;
|
||||||
BlockDriverState **ptr = qdev_get_prop_ptr(dev, prop);
|
BlockBackend **ptr = qdev_get_prop_ptr(dev, prop);
|
||||||
|
|
||||||
if (*ptr) {
|
if (*ptr) {
|
||||||
bdrv_detach_dev(*ptr, dev);
|
blk_detach_dev(*ptr, dev);
|
||||||
blockdev_auto_del(*ptr);
|
blockdev_auto_del(*ptr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *print_drive(void *ptr)
|
static char *print_drive(void *ptr)
|
||||||
{
|
{
|
||||||
return g_strdup(bdrv_get_device_name(ptr));
|
return g_strdup(blk_name(ptr));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void get_drive(Object *obj, Visitor *v, void *opaque,
|
static void get_drive(Object *obj, Visitor *v, void *opaque,
|
||||||
@ -335,12 +336,11 @@ PropertyInfo qdev_prop_vlan = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
int qdev_prop_set_drive(DeviceState *dev, const char *name,
|
int qdev_prop_set_drive(DeviceState *dev, const char *name,
|
||||||
BlockDriverState *value)
|
BlockBackend *value)
|
||||||
{
|
{
|
||||||
Error *err = NULL;
|
Error *err = NULL;
|
||||||
const char *bdrv_name = value ? bdrv_get_device_name(value) : "";
|
object_property_set_str(OBJECT(dev),
|
||||||
object_property_set_str(OBJECT(dev), bdrv_name,
|
value ? blk_name(value) : "", name, &err);
|
||||||
name, &err);
|
|
||||||
if (err) {
|
if (err) {
|
||||||
qerror_report_err(err);
|
qerror_report_err(err);
|
||||||
error_free(err);
|
error_free(err);
|
||||||
@ -350,7 +350,7 @@ int qdev_prop_set_drive(DeviceState *dev, const char *name,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void qdev_prop_set_drive_nofail(DeviceState *dev, const char *name,
|
void qdev_prop_set_drive_nofail(DeviceState *dev, const char *name,
|
||||||
BlockDriverState *value)
|
BlockBackend *value)
|
||||||
{
|
{
|
||||||
if (qdev_prop_set_drive(dev, name, value) < 0) {
|
if (qdev_prop_set_drive(dev, name, value) < 0) {
|
||||||
exit(1);
|
exit(1);
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#include "net/net.h"
|
#include "net/net.h"
|
||||||
#include "hw/qdev.h"
|
#include "hw/qdev.h"
|
||||||
#include "qapi/qmp/qerror.h"
|
#include "qapi/qmp/qerror.h"
|
||||||
#include "sysemu/blockdev.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "hw/block/block.h"
|
#include "hw/block/block.h"
|
||||||
#include "net/hub.h"
|
#include "net/hub.h"
|
||||||
#include "qapi/visitor.h"
|
#include "qapi/visitor.h"
|
||||||
|
@ -31,7 +31,6 @@
|
|||||||
#include "elf.h"
|
#include "elf.h"
|
||||||
#include "boot.h"
|
#include "boot.h"
|
||||||
#include "sysemu/block-backend.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "sysemu/blockdev.h"
|
|
||||||
#include "exec/address-spaces.h"
|
#include "exec/address-spaces.h"
|
||||||
#include "sysemu/qtest.h"
|
#include "sysemu/qtest.h"
|
||||||
|
|
||||||
@ -285,7 +284,7 @@ void axisdev88_init(MachineState *machine)
|
|||||||
|
|
||||||
/* Attach a NAND flash to CS1. */
|
/* Attach a NAND flash to CS1. */
|
||||||
nand = drive_get(IF_MTD, 0, 0);
|
nand = drive_get(IF_MTD, 0, 0);
|
||||||
nand_state.nand = nand_init(nand ? blk_bs(blk_by_legacy_dinfo(nand)) : NULL,
|
nand_state.nand = nand_init(nand ? blk_by_legacy_dinfo(nand) : NULL,
|
||||||
NAND_MFR_STMICRO, 0x39);
|
NAND_MFR_STMICRO, 0x39);
|
||||||
memory_region_init_io(&nand_state.iomem, NULL, &nand_ops, &nand_state,
|
memory_region_init_io(&nand_state.iomem, NULL, &nand_ops, &nand_state,
|
||||||
"nand", 0x05000000);
|
"nand", 0x05000000);
|
||||||
|
@ -577,7 +577,7 @@ TC6393xbState *tc6393xb_init(MemoryRegion *sysmem, uint32_t base, qemu_irq irq)
|
|||||||
s->sub_irqs = qemu_allocate_irqs(tc6393xb_sub_irq, s, TC6393XB_NR_IRQS);
|
s->sub_irqs = qemu_allocate_irqs(tc6393xb_sub_irq, s, TC6393XB_NR_IRQS);
|
||||||
|
|
||||||
nand = drive_get(IF_MTD, 0, 0);
|
nand = drive_get(IF_MTD, 0, 0);
|
||||||
s->flash = nand_init(nand ? blk_bs(blk_by_legacy_dinfo(nand)) : NULL,
|
s->flash = nand_init(nand ? blk_by_legacy_dinfo(nand) : NULL,
|
||||||
NAND_MFR_TOSHIBA, 0x76);
|
NAND_MFR_TOSHIBA, 0x76);
|
||||||
|
|
||||||
memory_region_init_io(&s->iomem, NULL, &tc6393xb_ops, s, "tc6393xb", 0x10000);
|
memory_region_init_io(&s->iomem, NULL, &tc6393xb_ops, s, "tc6393xb", 0x10000);
|
||||||
|
@ -44,7 +44,7 @@
|
|||||||
#include "sysemu/kvm.h"
|
#include "sysemu/kvm.h"
|
||||||
#include "kvm_i386.h"
|
#include "kvm_i386.h"
|
||||||
#include "hw/xen/xen.h"
|
#include "hw/xen/xen.h"
|
||||||
#include "sysemu/blockdev.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "hw/block/block.h"
|
#include "hw/block/block.h"
|
||||||
#include "ui/qemu-spice.h"
|
#include "ui/qemu-spice.h"
|
||||||
#include "exec/memory.h"
|
#include "exec/memory.h"
|
||||||
|
@ -41,7 +41,7 @@
|
|||||||
#include "hw/sysbus.h"
|
#include "hw/sysbus.h"
|
||||||
#include "hw/cpu/icc_bus.h"
|
#include "hw/cpu/icc_bus.h"
|
||||||
#include "sysemu/arch_init.h"
|
#include "sysemu/arch_init.h"
|
||||||
#include "sysemu/blockdev.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "hw/i2c/smbus.h"
|
#include "hw/i2c/smbus.h"
|
||||||
#include "hw/xen/xen.h"
|
#include "hw/xen/xen.h"
|
||||||
#include "exec/memory.h"
|
#include "exec/memory.h"
|
||||||
|
@ -24,7 +24,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "sysemu/block-backend.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "sysemu/blockdev.h"
|
|
||||||
#include "qemu/error-report.h"
|
#include "qemu/error-report.h"
|
||||||
#include "hw/sysbus.h"
|
#include "hw/sysbus.h"
|
||||||
#include "hw/hw.h"
|
#include "hw/hw.h"
|
||||||
@ -104,7 +103,7 @@ static void pc_system_flash_init(MemoryRegion *rom_memory)
|
|||||||
{
|
{
|
||||||
int unit;
|
int unit;
|
||||||
DriveInfo *pflash_drv;
|
DriveInfo *pflash_drv;
|
||||||
BlockDriverState *bdrv;
|
BlockBackend *blk;
|
||||||
int64_t size;
|
int64_t size;
|
||||||
char *fatal_errmsg = NULL;
|
char *fatal_errmsg = NULL;
|
||||||
hwaddr phys_addr = 0x100000000ULL;
|
hwaddr phys_addr = 0x100000000ULL;
|
||||||
@ -120,8 +119,8 @@ static void pc_system_flash_init(MemoryRegion *rom_memory)
|
|||||||
(unit < FLASH_MAP_UNIT_MAX &&
|
(unit < FLASH_MAP_UNIT_MAX &&
|
||||||
(pflash_drv = drive_get(IF_PFLASH, 0, unit)) != NULL);
|
(pflash_drv = drive_get(IF_PFLASH, 0, unit)) != NULL);
|
||||||
++unit) {
|
++unit) {
|
||||||
bdrv = blk_bs(blk_by_legacy_dinfo(pflash_drv));
|
blk = blk_by_legacy_dinfo(pflash_drv);
|
||||||
size = bdrv_getlength(bdrv);
|
size = blk_getlength(blk);
|
||||||
if (size < 0) {
|
if (size < 0) {
|
||||||
fatal_errmsg = g_strdup_printf("failed to get backing file size");
|
fatal_errmsg = g_strdup_printf("failed to get backing file size");
|
||||||
} else if (size == 0) {
|
} else if (size == 0) {
|
||||||
@ -157,7 +156,7 @@ static void pc_system_flash_init(MemoryRegion *rom_memory)
|
|||||||
/* pflash_cfi01_register() creates a deep copy of the name */
|
/* pflash_cfi01_register() creates a deep copy of the name */
|
||||||
snprintf(name, sizeof name, "system.flash%d", unit);
|
snprintf(name, sizeof name, "system.flash%d", unit);
|
||||||
system_flash = pflash_cfi01_register(phys_addr, NULL /* qdev */, name,
|
system_flash = pflash_cfi01_register(phys_addr, NULL /* qdev */, name,
|
||||||
size, bdrv, sector_size,
|
size, blk, sector_size,
|
||||||
size >> sector_bits,
|
size >> sector_bits,
|
||||||
1 /* width */,
|
1 /* width */,
|
||||||
0x0000 /* id0 */,
|
0x0000 /* id0 */,
|
||||||
|
@ -34,6 +34,7 @@
|
|||||||
#include "hw/xen/xen_backend.h"
|
#include "hw/xen/xen_backend.h"
|
||||||
#include "trace.h"
|
#include "trace.h"
|
||||||
#include "exec/address-spaces.h"
|
#include "exec/address-spaces.h"
|
||||||
|
#include "sysemu/block-backend.h"
|
||||||
|
|
||||||
#include <xenguest.h>
|
#include <xenguest.h>
|
||||||
|
|
||||||
@ -132,8 +133,8 @@ static void platform_fixed_ioport_writew(void *opaque, uint32_t addr, uint32_t v
|
|||||||
devices, and bit 2 the non-primary-master IDE devices. */
|
devices, and bit 2 the non-primary-master IDE devices. */
|
||||||
if (val & UNPLUG_ALL_IDE_DISKS) {
|
if (val & UNPLUG_ALL_IDE_DISKS) {
|
||||||
DPRINTF("unplug disks\n");
|
DPRINTF("unplug disks\n");
|
||||||
bdrv_drain_all();
|
blk_drain_all();
|
||||||
bdrv_flush_all();
|
blk_flush_all();
|
||||||
pci_unplug_disks(pci_dev->bus);
|
pci_unplug_disks(pci_dev->bus);
|
||||||
}
|
}
|
||||||
if (val & UNPLUG_ALL_NICS) {
|
if (val & UNPLUG_ALL_NICS) {
|
||||||
|
@ -28,6 +28,7 @@
|
|||||||
#include <hw/sysbus.h>
|
#include <hw/sysbus.h>
|
||||||
|
|
||||||
#include "monitor/monitor.h"
|
#include "monitor/monitor.h"
|
||||||
|
#include "sysemu/block-backend.h"
|
||||||
#include "sysemu/dma.h"
|
#include "sysemu/dma.h"
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
#include <hw/ide/pci.h>
|
#include <hw/ide/pci.h>
|
||||||
@ -84,7 +85,7 @@ static uint32_t ahci_port_read(AHCIState *s, int port, int offset)
|
|||||||
val = pr->sig;
|
val = pr->sig;
|
||||||
break;
|
break;
|
||||||
case PORT_SCR_STAT:
|
case PORT_SCR_STAT:
|
||||||
if (s->dev[port].port.ifs[0].bs) {
|
if (s->dev[port].port.ifs[0].blk) {
|
||||||
val = SATA_SCR_SSTATUS_DET_DEV_PRESENT_PHY_UP |
|
val = SATA_SCR_SSTATUS_DET_DEV_PRESENT_PHY_UP |
|
||||||
SATA_SCR_SSTATUS_SPD_GEN1 | SATA_SCR_SSTATUS_IPM_ACTIVE;
|
SATA_SCR_SSTATUS_SPD_GEN1 | SATA_SCR_SSTATUS_IPM_ACTIVE;
|
||||||
} else {
|
} else {
|
||||||
@ -501,7 +502,7 @@ static void ahci_reset_port(AHCIState *s, int port)
|
|||||||
d->init_d2h_sent = false;
|
d->init_d2h_sent = false;
|
||||||
|
|
||||||
ide_state = &s->dev[port].port.ifs[0];
|
ide_state = &s->dev[port].port.ifs[0];
|
||||||
if (!ide_state->bs) {
|
if (!ide_state->blk) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -513,11 +514,11 @@ static void ahci_reset_port(AHCIState *s, int port)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (ncq_tfs->aiocb) {
|
if (ncq_tfs->aiocb) {
|
||||||
bdrv_aio_cancel(ncq_tfs->aiocb);
|
blk_aio_cancel(ncq_tfs->aiocb);
|
||||||
ncq_tfs->aiocb = NULL;
|
ncq_tfs->aiocb = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Maybe we just finished the request thanks to bdrv_aio_cancel() */
|
/* Maybe we just finished the request thanks to blk_aio_cancel() */
|
||||||
if (!ncq_tfs->used) {
|
if (!ncq_tfs->used) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -527,7 +528,7 @@ static void ahci_reset_port(AHCIState *s, int port)
|
|||||||
}
|
}
|
||||||
|
|
||||||
s->dev[port].port_state = STATE_RUN;
|
s->dev[port].port_state = STATE_RUN;
|
||||||
if (!ide_state->bs) {
|
if (!ide_state->blk) {
|
||||||
pr->sig = 0;
|
pr->sig = 0;
|
||||||
ide_state->status = SEEK_STAT | WRERR_STAT;
|
ide_state->status = SEEK_STAT | WRERR_STAT;
|
||||||
} else if (ide_state->drive_kind == IDE_CD) {
|
} else if (ide_state->drive_kind == IDE_CD) {
|
||||||
@ -826,7 +827,7 @@ static void ncq_cb(void *opaque, int ret)
|
|||||||
DPRINTF(ncq_tfs->drive->port_no, "NCQ transfer tag %d finished\n",
|
DPRINTF(ncq_tfs->drive->port_no, "NCQ transfer tag %d finished\n",
|
||||||
ncq_tfs->tag);
|
ncq_tfs->tag);
|
||||||
|
|
||||||
block_acct_done(bdrv_get_stats(ncq_tfs->drive->port.ifs[0].bs),
|
block_acct_done(blk_get_stats(ncq_tfs->drive->port.ifs[0].blk),
|
||||||
&ncq_tfs->acct);
|
&ncq_tfs->acct);
|
||||||
qemu_sglist_destroy(&ncq_tfs->sglist);
|
qemu_sglist_destroy(&ncq_tfs->sglist);
|
||||||
ncq_tfs->used = 0;
|
ncq_tfs->used = 0;
|
||||||
@ -877,11 +878,11 @@ static void process_ncq_command(AHCIState *s, int port, uint8_t *cmd_fis,
|
|||||||
DPRINTF(port, "tag %d aio read %"PRId64"\n",
|
DPRINTF(port, "tag %d aio read %"PRId64"\n",
|
||||||
ncq_tfs->tag, ncq_tfs->lba);
|
ncq_tfs->tag, ncq_tfs->lba);
|
||||||
|
|
||||||
dma_acct_start(ncq_tfs->drive->port.ifs[0].bs, &ncq_tfs->acct,
|
dma_acct_start(ncq_tfs->drive->port.ifs[0].blk, &ncq_tfs->acct,
|
||||||
&ncq_tfs->sglist, BLOCK_ACCT_READ);
|
&ncq_tfs->sglist, BLOCK_ACCT_READ);
|
||||||
ncq_tfs->aiocb = dma_bdrv_read(ncq_tfs->drive->port.ifs[0].bs,
|
ncq_tfs->aiocb = dma_blk_read(ncq_tfs->drive->port.ifs[0].blk,
|
||||||
&ncq_tfs->sglist, ncq_tfs->lba,
|
&ncq_tfs->sglist, ncq_tfs->lba,
|
||||||
ncq_cb, ncq_tfs);
|
ncq_cb, ncq_tfs);
|
||||||
break;
|
break;
|
||||||
case WRITE_FPDMA_QUEUED:
|
case WRITE_FPDMA_QUEUED:
|
||||||
DPRINTF(port, "NCQ writing %d sectors to LBA %"PRId64", tag %d\n",
|
DPRINTF(port, "NCQ writing %d sectors to LBA %"PRId64", tag %d\n",
|
||||||
@ -890,11 +891,11 @@ static void process_ncq_command(AHCIState *s, int port, uint8_t *cmd_fis,
|
|||||||
DPRINTF(port, "tag %d aio write %"PRId64"\n",
|
DPRINTF(port, "tag %d aio write %"PRId64"\n",
|
||||||
ncq_tfs->tag, ncq_tfs->lba);
|
ncq_tfs->tag, ncq_tfs->lba);
|
||||||
|
|
||||||
dma_acct_start(ncq_tfs->drive->port.ifs[0].bs, &ncq_tfs->acct,
|
dma_acct_start(ncq_tfs->drive->port.ifs[0].blk, &ncq_tfs->acct,
|
||||||
&ncq_tfs->sglist, BLOCK_ACCT_WRITE);
|
&ncq_tfs->sglist, BLOCK_ACCT_WRITE);
|
||||||
ncq_tfs->aiocb = dma_bdrv_write(ncq_tfs->drive->port.ifs[0].bs,
|
ncq_tfs->aiocb = dma_blk_write(ncq_tfs->drive->port.ifs[0].blk,
|
||||||
&ncq_tfs->sglist, ncq_tfs->lba,
|
&ncq_tfs->sglist, ncq_tfs->lba,
|
||||||
ncq_cb, ncq_tfs);
|
ncq_cb, ncq_tfs);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
DPRINTF(port, "error: tried to process non-NCQ command as NCQ\n");
|
DPRINTF(port, "error: tried to process non-NCQ command as NCQ\n");
|
||||||
@ -943,7 +944,7 @@ static int handle_cmd(AHCIState *s, int port, int slot)
|
|||||||
/* The device we are working for */
|
/* The device we are working for */
|
||||||
ide_state = &s->dev[port].port.ifs[0];
|
ide_state = &s->dev[port].port.ifs[0];
|
||||||
|
|
||||||
if (!ide_state->bs) {
|
if (!ide_state->blk) {
|
||||||
DPRINTF(port, "error: guest accessed unused port");
|
DPRINTF(port, "error: guest accessed unused port");
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
@ -25,6 +25,7 @@
|
|||||||
|
|
||||||
#include "hw/ide/internal.h"
|
#include "hw/ide/internal.h"
|
||||||
#include "hw/scsi/scsi.h"
|
#include "hw/scsi/scsi.h"
|
||||||
|
#include "sysemu/block-backend.h"
|
||||||
|
|
||||||
static void ide_atapi_cmd_read_dma_cb(void *opaque, int ret);
|
static void ide_atapi_cmd_read_dma_cb(void *opaque, int ret);
|
||||||
|
|
||||||
@ -110,16 +111,16 @@ static int cd_read_sector(IDEState *s, int lba, uint8_t *buf, int sector_size)
|
|||||||
|
|
||||||
switch(sector_size) {
|
switch(sector_size) {
|
||||||
case 2048:
|
case 2048:
|
||||||
block_acct_start(bdrv_get_stats(s->bs), &s->acct,
|
block_acct_start(blk_get_stats(s->blk), &s->acct,
|
||||||
4 * BDRV_SECTOR_SIZE, BLOCK_ACCT_READ);
|
4 * BDRV_SECTOR_SIZE, BLOCK_ACCT_READ);
|
||||||
ret = bdrv_read(s->bs, (int64_t)lba << 2, buf, 4);
|
ret = blk_read(s->blk, (int64_t)lba << 2, buf, 4);
|
||||||
block_acct_done(bdrv_get_stats(s->bs), &s->acct);
|
block_acct_done(blk_get_stats(s->blk), &s->acct);
|
||||||
break;
|
break;
|
||||||
case 2352:
|
case 2352:
|
||||||
block_acct_start(bdrv_get_stats(s->bs), &s->acct,
|
block_acct_start(blk_get_stats(s->blk), &s->acct,
|
||||||
4 * BDRV_SECTOR_SIZE, BLOCK_ACCT_READ);
|
4 * BDRV_SECTOR_SIZE, BLOCK_ACCT_READ);
|
||||||
ret = bdrv_read(s->bs, (int64_t)lba << 2, buf + 16, 4);
|
ret = blk_read(s->blk, (int64_t)lba << 2, buf + 16, 4);
|
||||||
block_acct_done(bdrv_get_stats(s->bs), &s->acct);
|
block_acct_done(blk_get_stats(s->blk), &s->acct);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
cd_data_to_raw(buf, lba);
|
cd_data_to_raw(buf, lba);
|
||||||
@ -254,7 +255,7 @@ static void ide_atapi_cmd_reply(IDEState *s, int size, int max_size)
|
|||||||
s->io_buffer_index = 0;
|
s->io_buffer_index = 0;
|
||||||
|
|
||||||
if (s->atapi_dma) {
|
if (s->atapi_dma) {
|
||||||
block_acct_start(bdrv_get_stats(s->bs), &s->acct, size,
|
block_acct_start(blk_get_stats(s->blk), &s->acct, size,
|
||||||
BLOCK_ACCT_READ);
|
BLOCK_ACCT_READ);
|
||||||
s->status = READY_STAT | SEEK_STAT | DRQ_STAT;
|
s->status = READY_STAT | SEEK_STAT | DRQ_STAT;
|
||||||
ide_start_dma(s, ide_atapi_cmd_read_dma_cb);
|
ide_start_dma(s, ide_atapi_cmd_read_dma_cb);
|
||||||
@ -350,13 +351,13 @@ static void ide_atapi_cmd_read_dma_cb(void *opaque, int ret)
|
|||||||
s->bus->dma->iov.iov_len = n * 4 * 512;
|
s->bus->dma->iov.iov_len = n * 4 * 512;
|
||||||
qemu_iovec_init_external(&s->bus->dma->qiov, &s->bus->dma->iov, 1);
|
qemu_iovec_init_external(&s->bus->dma->qiov, &s->bus->dma->iov, 1);
|
||||||
|
|
||||||
s->bus->dma->aiocb = bdrv_aio_readv(s->bs, (int64_t)s->lba << 2,
|
s->bus->dma->aiocb = blk_aio_readv(s->blk, (int64_t)s->lba << 2,
|
||||||
&s->bus->dma->qiov, n * 4,
|
&s->bus->dma->qiov, n * 4,
|
||||||
ide_atapi_cmd_read_dma_cb, s);
|
ide_atapi_cmd_read_dma_cb, s);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
eot:
|
eot:
|
||||||
block_acct_done(bdrv_get_stats(s->bs), &s->acct);
|
block_acct_done(blk_get_stats(s->blk), &s->acct);
|
||||||
ide_set_inactive(s, false);
|
ide_set_inactive(s, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -371,7 +372,7 @@ static void ide_atapi_cmd_read_dma(IDEState *s, int lba, int nb_sectors,
|
|||||||
s->io_buffer_size = 0;
|
s->io_buffer_size = 0;
|
||||||
s->cd_sector_size = sector_size;
|
s->cd_sector_size = sector_size;
|
||||||
|
|
||||||
block_acct_start(bdrv_get_stats(s->bs), &s->acct, s->packet_transfer_size,
|
block_acct_start(blk_get_stats(s->blk), &s->acct, s->packet_transfer_size,
|
||||||
BLOCK_ACCT_READ);
|
BLOCK_ACCT_READ);
|
||||||
|
|
||||||
/* XXX: check if BUSY_STAT should be set */
|
/* XXX: check if BUSY_STAT should be set */
|
||||||
@ -504,7 +505,7 @@ static unsigned int event_status_media(IDEState *s,
|
|||||||
media_status = 0;
|
media_status = 0;
|
||||||
if (s->tray_open) {
|
if (s->tray_open) {
|
||||||
media_status = MS_TRAY_OPEN;
|
media_status = MS_TRAY_OPEN;
|
||||||
} else if (bdrv_is_inserted(s->bs)) {
|
} else if (blk_is_inserted(s->blk)) {
|
||||||
media_status = MS_MEDIA_PRESENT;
|
media_status = MS_MEDIA_PRESENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -800,7 +801,7 @@ static void cmd_test_unit_ready(IDEState *s, uint8_t *buf)
|
|||||||
static void cmd_prevent_allow_medium_removal(IDEState *s, uint8_t* buf)
|
static void cmd_prevent_allow_medium_removal(IDEState *s, uint8_t* buf)
|
||||||
{
|
{
|
||||||
s->tray_locked = buf[4] & 1;
|
s->tray_locked = buf[4] & 1;
|
||||||
bdrv_lock_medium(s->bs, buf[4] & 1);
|
blk_lock_medium(s->blk, buf[4] & 1);
|
||||||
ide_atapi_cmd_ok(s);
|
ide_atapi_cmd_ok(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -884,14 +885,14 @@ static void cmd_start_stop_unit(IDEState *s, uint8_t* buf)
|
|||||||
|
|
||||||
if (loej) {
|
if (loej) {
|
||||||
if (!start && !s->tray_open && s->tray_locked) {
|
if (!start && !s->tray_open && s->tray_locked) {
|
||||||
sense = bdrv_is_inserted(s->bs)
|
sense = blk_is_inserted(s->blk)
|
||||||
? NOT_READY : ILLEGAL_REQUEST;
|
? NOT_READY : ILLEGAL_REQUEST;
|
||||||
ide_atapi_cmd_error(s, sense, ASC_MEDIA_REMOVAL_PREVENTED);
|
ide_atapi_cmd_error(s, sense, ASC_MEDIA_REMOVAL_PREVENTED);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s->tray_open != !start) {
|
if (s->tray_open != !start) {
|
||||||
bdrv_eject(s->bs, !start);
|
blk_eject(s->blk, !start);
|
||||||
s->tray_open = !start;
|
s->tray_open = !start;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1125,7 +1126,7 @@ void ide_atapi_cmd(IDEState *s)
|
|||||||
* states rely on this behavior.
|
* states rely on this behavior.
|
||||||
*/
|
*/
|
||||||
if (!(atapi_cmd_table[s->io_buffer[0]].flags & ALLOW_UA) &&
|
if (!(atapi_cmd_table[s->io_buffer[0]].flags & ALLOW_UA) &&
|
||||||
!s->tray_open && bdrv_is_inserted(s->bs) && s->cdrom_changed) {
|
!s->tray_open && blk_is_inserted(s->blk) && s->cdrom_changed) {
|
||||||
|
|
||||||
if (s->cdrom_changed == 1) {
|
if (s->cdrom_changed == 1) {
|
||||||
ide_atapi_cmd_error(s, NOT_READY, ASC_MEDIUM_NOT_PRESENT);
|
ide_atapi_cmd_error(s, NOT_READY, ASC_MEDIUM_NOT_PRESENT);
|
||||||
@ -1140,7 +1141,7 @@ void ide_atapi_cmd(IDEState *s)
|
|||||||
|
|
||||||
/* Report a Not Ready condition if appropriate for the command */
|
/* Report a Not Ready condition if appropriate for the command */
|
||||||
if ((atapi_cmd_table[s->io_buffer[0]].flags & CHECK_READY) &&
|
if ((atapi_cmd_table[s->io_buffer[0]].flags & CHECK_READY) &&
|
||||||
(!media_present(s) || !bdrv_is_inserted(s->bs)))
|
(!media_present(s) || !blk_is_inserted(s->blk)))
|
||||||
{
|
{
|
||||||
ide_atapi_cmd_error(s, NOT_READY, ASC_MEDIUM_NOT_PRESENT);
|
ide_atapi_cmd_error(s, NOT_READY, ASC_MEDIUM_NOT_PRESENT);
|
||||||
return;
|
return;
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
#include <hw/i386/pc.h>
|
#include <hw/i386/pc.h>
|
||||||
#include <hw/pci/pci.h>
|
#include <hw/pci/pci.h>
|
||||||
#include <hw/isa/isa.h>
|
#include <hw/isa/isa.h>
|
||||||
#include "block/block.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "sysemu/sysemu.h"
|
#include "sysemu/sysemu.h"
|
||||||
#include "sysemu/dma.h"
|
#include "sysemu/dma.h"
|
||||||
|
|
||||||
|
182
hw/ide/core.c
182
hw/ide/core.c
@ -31,7 +31,7 @@
|
|||||||
#include "sysemu/sysemu.h"
|
#include "sysemu/sysemu.h"
|
||||||
#include "sysemu/dma.h"
|
#include "sysemu/dma.h"
|
||||||
#include "hw/block/block.h"
|
#include "hw/block/block.h"
|
||||||
#include "sysemu/blockdev.h"
|
#include "sysemu/block-backend.h"
|
||||||
|
|
||||||
#include <hw/ide/internal.h>
|
#include <hw/ide/internal.h>
|
||||||
|
|
||||||
@ -158,10 +158,11 @@ static void ide_identify(IDEState *s)
|
|||||||
put_le16(p + 84, (1 << 14) | 0);
|
put_le16(p + 84, (1 << 14) | 0);
|
||||||
}
|
}
|
||||||
/* 14 = NOP supported, 5=WCACHE enabled, 0=SMART feature set enabled */
|
/* 14 = NOP supported, 5=WCACHE enabled, 0=SMART feature set enabled */
|
||||||
if (bdrv_enable_write_cache(s->bs))
|
if (blk_enable_write_cache(s->blk)) {
|
||||||
put_le16(p + 85, (1 << 14) | (1 << 5) | 1);
|
put_le16(p + 85, (1 << 14) | (1 << 5) | 1);
|
||||||
else
|
} else {
|
||||||
put_le16(p + 85, (1 << 14) | 1);
|
put_le16(p + 85, (1 << 14) | 1);
|
||||||
|
}
|
||||||
/* 13=flush_cache_ext,12=flush_cache,10=lba48 */
|
/* 13=flush_cache_ext,12=flush_cache,10=lba48 */
|
||||||
put_le16(p + 86, (1 << 13) | (1 <<12) | (1 << 10));
|
put_le16(p + 86, (1 << 13) | (1 <<12) | (1 << 10));
|
||||||
/* 14=set to 1, 8=has WWN, 1=SMART self test, 0=SMART error logging */
|
/* 14=set to 1, 8=has WWN, 1=SMART self test, 0=SMART error logging */
|
||||||
@ -350,7 +351,7 @@ static void ide_set_signature(IDEState *s)
|
|||||||
if (s->drive_kind == IDE_CD) {
|
if (s->drive_kind == IDE_CD) {
|
||||||
s->lcyl = 0x14;
|
s->lcyl = 0x14;
|
||||||
s->hcyl = 0xeb;
|
s->hcyl = 0xeb;
|
||||||
} else if (s->bs) {
|
} else if (s->blk) {
|
||||||
s->lcyl = 0;
|
s->lcyl = 0;
|
||||||
s->hcyl = 0;
|
s->hcyl = 0;
|
||||||
} else {
|
} else {
|
||||||
@ -379,7 +380,7 @@ static void trim_aio_cancel(BlockAIOCB *acb)
|
|||||||
iocb->ret = -ECANCELED;
|
iocb->ret = -ECANCELED;
|
||||||
|
|
||||||
if (iocb->aiocb) {
|
if (iocb->aiocb) {
|
||||||
bdrv_aio_cancel_async(iocb->aiocb);
|
blk_aio_cancel_async(iocb->aiocb);
|
||||||
iocb->aiocb = NULL;
|
iocb->aiocb = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -438,13 +439,13 @@ static void ide_issue_trim_cb(void *opaque, int ret)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
BlockAIOCB *ide_issue_trim(BlockDriverState *bs,
|
BlockAIOCB *ide_issue_trim(BlockBackend *blk,
|
||||||
int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
|
int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
|
||||||
BlockCompletionFunc *cb, void *opaque)
|
BlockCompletionFunc *cb, void *opaque)
|
||||||
{
|
{
|
||||||
TrimAIOCB *iocb;
|
TrimAIOCB *iocb;
|
||||||
|
|
||||||
iocb = qemu_aio_get(&trim_aiocb_info, bs, cb, opaque);
|
iocb = blk_aio_get(&trim_aiocb_info, blk, cb, opaque);
|
||||||
iocb->bh = qemu_bh_new(ide_trim_bh_cb, iocb);
|
iocb->bh = qemu_bh_new(ide_trim_bh_cb, iocb);
|
||||||
iocb->ret = 0;
|
iocb->ret = 0;
|
||||||
iocb->qiov = qiov;
|
iocb->qiov = qiov;
|
||||||
@ -551,7 +552,7 @@ static bool ide_sect_range_ok(IDEState *s,
|
|||||||
{
|
{
|
||||||
uint64_t total_sectors;
|
uint64_t total_sectors;
|
||||||
|
|
||||||
bdrv_get_geometry(s->bs, &total_sectors);
|
blk_get_geometry(s->blk, &total_sectors);
|
||||||
if (sector > total_sectors || nb_sectors > total_sectors - sector) {
|
if (sector > total_sectors || nb_sectors > total_sectors - sector) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -569,7 +570,7 @@ static void ide_sector_read_cb(void *opaque, int ret)
|
|||||||
if (ret == -ECANCELED) {
|
if (ret == -ECANCELED) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
block_acct_done(bdrv_get_stats(s->bs), &s->acct);
|
block_acct_done(blk_get_stats(s->blk), &s->acct);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
if (ide_handle_rw_error(s, -ret, IDE_RETRY_PIO |
|
if (ide_handle_rw_error(s, -ret, IDE_RETRY_PIO |
|
||||||
IDE_RETRY_READ)) {
|
IDE_RETRY_READ)) {
|
||||||
@ -625,10 +626,10 @@ void ide_sector_read(IDEState *s)
|
|||||||
s->iov.iov_len = n * BDRV_SECTOR_SIZE;
|
s->iov.iov_len = n * BDRV_SECTOR_SIZE;
|
||||||
qemu_iovec_init_external(&s->qiov, &s->iov, 1);
|
qemu_iovec_init_external(&s->qiov, &s->iov, 1);
|
||||||
|
|
||||||
block_acct_start(bdrv_get_stats(s->bs), &s->acct,
|
block_acct_start(blk_get_stats(s->blk), &s->acct,
|
||||||
n * BDRV_SECTOR_SIZE, BLOCK_ACCT_READ);
|
n * BDRV_SECTOR_SIZE, BLOCK_ACCT_READ);
|
||||||
s->pio_aiocb = bdrv_aio_readv(s->bs, sector_num, &s->qiov, n,
|
s->pio_aiocb = blk_aio_readv(s->blk, sector_num, &s->qiov, n,
|
||||||
ide_sector_read_cb, s);
|
ide_sector_read_cb, s);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dma_buf_commit(IDEState *s)
|
static void dma_buf_commit(IDEState *s)
|
||||||
@ -655,7 +656,7 @@ void ide_dma_error(IDEState *s)
|
|||||||
static int ide_handle_rw_error(IDEState *s, int error, int op)
|
static int ide_handle_rw_error(IDEState *s, int error, int op)
|
||||||
{
|
{
|
||||||
bool is_read = (op & IDE_RETRY_READ) != 0;
|
bool is_read = (op & IDE_RETRY_READ) != 0;
|
||||||
BlockErrorAction action = bdrv_get_error_action(s->bs, is_read, error);
|
BlockErrorAction action = blk_get_error_action(s->blk, is_read, error);
|
||||||
|
|
||||||
if (action == BLOCK_ERROR_ACTION_STOP) {
|
if (action == BLOCK_ERROR_ACTION_STOP) {
|
||||||
s->bus->dma->ops->set_unit(s->bus->dma, s->unit);
|
s->bus->dma->ops->set_unit(s->bus->dma, s->unit);
|
||||||
@ -668,7 +669,7 @@ static int ide_handle_rw_error(IDEState *s, int error, int op)
|
|||||||
ide_rw_error(s);
|
ide_rw_error(s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
bdrv_error_action(s->bs, action, is_read, error);
|
blk_error_action(s->blk, action, is_read, error);
|
||||||
return action != BLOCK_ERROR_ACTION_IGNORE;
|
return action != BLOCK_ERROR_ACTION_IGNORE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -744,24 +745,24 @@ void ide_dma_cb(void *opaque, int ret)
|
|||||||
|
|
||||||
switch (s->dma_cmd) {
|
switch (s->dma_cmd) {
|
||||||
case IDE_DMA_READ:
|
case IDE_DMA_READ:
|
||||||
s->bus->dma->aiocb = dma_bdrv_read(s->bs, &s->sg, sector_num,
|
s->bus->dma->aiocb = dma_blk_read(s->blk, &s->sg, sector_num,
|
||||||
ide_dma_cb, s);
|
ide_dma_cb, s);
|
||||||
break;
|
break;
|
||||||
case IDE_DMA_WRITE:
|
case IDE_DMA_WRITE:
|
||||||
s->bus->dma->aiocb = dma_bdrv_write(s->bs, &s->sg, sector_num,
|
s->bus->dma->aiocb = dma_blk_write(s->blk, &s->sg, sector_num,
|
||||||
ide_dma_cb, s);
|
ide_dma_cb, s);
|
||||||
break;
|
break;
|
||||||
case IDE_DMA_TRIM:
|
case IDE_DMA_TRIM:
|
||||||
s->bus->dma->aiocb = dma_bdrv_io(s->bs, &s->sg, sector_num,
|
s->bus->dma->aiocb = dma_blk_io(s->blk, &s->sg, sector_num,
|
||||||
ide_issue_trim, ide_dma_cb, s,
|
ide_issue_trim, ide_dma_cb, s,
|
||||||
DMA_DIRECTION_TO_DEVICE);
|
DMA_DIRECTION_TO_DEVICE);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
|
||||||
eot:
|
eot:
|
||||||
if (s->dma_cmd == IDE_DMA_READ || s->dma_cmd == IDE_DMA_WRITE) {
|
if (s->dma_cmd == IDE_DMA_READ || s->dma_cmd == IDE_DMA_WRITE) {
|
||||||
block_acct_done(bdrv_get_stats(s->bs), &s->acct);
|
block_acct_done(blk_get_stats(s->blk), &s->acct);
|
||||||
}
|
}
|
||||||
ide_set_inactive(s, stay_active);
|
ide_set_inactive(s, stay_active);
|
||||||
}
|
}
|
||||||
@ -775,11 +776,11 @@ static void ide_sector_start_dma(IDEState *s, enum ide_dma_cmd dma_cmd)
|
|||||||
|
|
||||||
switch (dma_cmd) {
|
switch (dma_cmd) {
|
||||||
case IDE_DMA_READ:
|
case IDE_DMA_READ:
|
||||||
block_acct_start(bdrv_get_stats(s->bs), &s->acct,
|
block_acct_start(blk_get_stats(s->blk), &s->acct,
|
||||||
s->nsector * BDRV_SECTOR_SIZE, BLOCK_ACCT_READ);
|
s->nsector * BDRV_SECTOR_SIZE, BLOCK_ACCT_READ);
|
||||||
break;
|
break;
|
||||||
case IDE_DMA_WRITE:
|
case IDE_DMA_WRITE:
|
||||||
block_acct_start(bdrv_get_stats(s->bs), &s->acct,
|
block_acct_start(blk_get_stats(s->blk), &s->acct,
|
||||||
s->nsector * BDRV_SECTOR_SIZE, BLOCK_ACCT_WRITE);
|
s->nsector * BDRV_SECTOR_SIZE, BLOCK_ACCT_WRITE);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -810,7 +811,7 @@ static void ide_sector_write_cb(void *opaque, int ret)
|
|||||||
if (ret == -ECANCELED) {
|
if (ret == -ECANCELED) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
block_acct_done(bdrv_get_stats(s->bs), &s->acct);
|
block_acct_done(blk_get_stats(s->blk), &s->acct);
|
||||||
|
|
||||||
s->pio_aiocb = NULL;
|
s->pio_aiocb = NULL;
|
||||||
s->status &= ~BUSY_STAT;
|
s->status &= ~BUSY_STAT;
|
||||||
@ -877,10 +878,10 @@ void ide_sector_write(IDEState *s)
|
|||||||
s->iov.iov_len = n * BDRV_SECTOR_SIZE;
|
s->iov.iov_len = n * BDRV_SECTOR_SIZE;
|
||||||
qemu_iovec_init_external(&s->qiov, &s->iov, 1);
|
qemu_iovec_init_external(&s->qiov, &s->iov, 1);
|
||||||
|
|
||||||
block_acct_start(bdrv_get_stats(s->bs), &s->acct,
|
block_acct_start(blk_get_stats(s->blk), &s->acct,
|
||||||
n * BDRV_SECTOR_SIZE, BLOCK_ACCT_READ);
|
n * BDRV_SECTOR_SIZE, BLOCK_ACCT_READ);
|
||||||
s->pio_aiocb = bdrv_aio_writev(s->bs, sector_num, &s->qiov, n,
|
s->pio_aiocb = blk_aio_writev(s->blk, sector_num, &s->qiov, n,
|
||||||
ide_sector_write_cb, s);
|
ide_sector_write_cb, s);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ide_flush_cb(void *opaque, int ret)
|
static void ide_flush_cb(void *opaque, int ret)
|
||||||
@ -899,8 +900,8 @@ static void ide_flush_cb(void *opaque, int ret)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s->bs) {
|
if (s->blk) {
|
||||||
block_acct_done(bdrv_get_stats(s->bs), &s->acct);
|
block_acct_done(blk_get_stats(s->blk), &s->acct);
|
||||||
}
|
}
|
||||||
s->status = READY_STAT | SEEK_STAT;
|
s->status = READY_STAT | SEEK_STAT;
|
||||||
ide_cmd_done(s);
|
ide_cmd_done(s);
|
||||||
@ -909,14 +910,14 @@ static void ide_flush_cb(void *opaque, int ret)
|
|||||||
|
|
||||||
void ide_flush_cache(IDEState *s)
|
void ide_flush_cache(IDEState *s)
|
||||||
{
|
{
|
||||||
if (s->bs == NULL) {
|
if (s->blk == NULL) {
|
||||||
ide_flush_cb(s, 0);
|
ide_flush_cb(s, 0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
s->status |= BUSY_STAT;
|
s->status |= BUSY_STAT;
|
||||||
block_acct_start(bdrv_get_stats(s->bs), &s->acct, 0, BLOCK_ACCT_FLUSH);
|
block_acct_start(blk_get_stats(s->blk), &s->acct, 0, BLOCK_ACCT_FLUSH);
|
||||||
s->pio_aiocb = bdrv_aio_flush(s->bs, ide_flush_cb, s);
|
s->pio_aiocb = blk_aio_flush(s->blk, ide_flush_cb, s);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ide_cfata_metadata_inquiry(IDEState *s)
|
static void ide_cfata_metadata_inquiry(IDEState *s)
|
||||||
@ -979,7 +980,7 @@ static void ide_cd_change_cb(void *opaque, bool load)
|
|||||||
uint64_t nb_sectors;
|
uint64_t nb_sectors;
|
||||||
|
|
||||||
s->tray_open = !load;
|
s->tray_open = !load;
|
||||||
bdrv_get_geometry(s->bs, &nb_sectors);
|
blk_get_geometry(s->blk, &nb_sectors);
|
||||||
s->nb_sectors = nb_sectors;
|
s->nb_sectors = nb_sectors;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1113,7 +1114,7 @@ static bool cmd_data_set_management(IDEState *s, uint8_t cmd)
|
|||||||
{
|
{
|
||||||
switch (s->feature) {
|
switch (s->feature) {
|
||||||
case DSM_TRIM:
|
case DSM_TRIM:
|
||||||
if (s->bs) {
|
if (s->blk) {
|
||||||
ide_sector_start_dma(s, IDE_DMA_TRIM);
|
ide_sector_start_dma(s, IDE_DMA_TRIM);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -1126,7 +1127,7 @@ static bool cmd_data_set_management(IDEState *s, uint8_t cmd)
|
|||||||
|
|
||||||
static bool cmd_identify(IDEState *s, uint8_t cmd)
|
static bool cmd_identify(IDEState *s, uint8_t cmd)
|
||||||
{
|
{
|
||||||
if (s->bs && s->drive_kind != IDE_CD) {
|
if (s->blk && s->drive_kind != IDE_CD) {
|
||||||
if (s->drive_kind != IDE_CFATA) {
|
if (s->drive_kind != IDE_CFATA) {
|
||||||
ide_identify(s);
|
ide_identify(s);
|
||||||
} else {
|
} else {
|
||||||
@ -1176,7 +1177,7 @@ static bool cmd_read_multiple(IDEState *s, uint8_t cmd)
|
|||||||
{
|
{
|
||||||
bool lba48 = (cmd == WIN_MULTREAD_EXT);
|
bool lba48 = (cmd == WIN_MULTREAD_EXT);
|
||||||
|
|
||||||
if (!s->bs || !s->mult_sectors) {
|
if (!s->blk || !s->mult_sectors) {
|
||||||
ide_abort_command(s);
|
ide_abort_command(s);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -1192,7 +1193,7 @@ static bool cmd_write_multiple(IDEState *s, uint8_t cmd)
|
|||||||
bool lba48 = (cmd == WIN_MULTWRITE_EXT);
|
bool lba48 = (cmd == WIN_MULTWRITE_EXT);
|
||||||
int n;
|
int n;
|
||||||
|
|
||||||
if (!s->bs || !s->mult_sectors) {
|
if (!s->blk || !s->mult_sectors) {
|
||||||
ide_abort_command(s);
|
ide_abort_command(s);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -1220,7 +1221,7 @@ static bool cmd_read_pio(IDEState *s, uint8_t cmd)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!s->bs) {
|
if (!s->blk) {
|
||||||
ide_abort_command(s);
|
ide_abort_command(s);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -1236,7 +1237,7 @@ static bool cmd_write_pio(IDEState *s, uint8_t cmd)
|
|||||||
{
|
{
|
||||||
bool lba48 = (cmd == WIN_WRITE_EXT);
|
bool lba48 = (cmd == WIN_WRITE_EXT);
|
||||||
|
|
||||||
if (!s->bs) {
|
if (!s->blk) {
|
||||||
ide_abort_command(s);
|
ide_abort_command(s);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -1256,7 +1257,7 @@ static bool cmd_read_dma(IDEState *s, uint8_t cmd)
|
|||||||
{
|
{
|
||||||
bool lba48 = (cmd == WIN_READDMA_EXT);
|
bool lba48 = (cmd == WIN_READDMA_EXT);
|
||||||
|
|
||||||
if (!s->bs) {
|
if (!s->blk) {
|
||||||
ide_abort_command(s);
|
ide_abort_command(s);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -1271,7 +1272,7 @@ static bool cmd_write_dma(IDEState *s, uint8_t cmd)
|
|||||||
{
|
{
|
||||||
bool lba48 = (cmd == WIN_WRITEDMA_EXT);
|
bool lba48 = (cmd == WIN_WRITEDMA_EXT);
|
||||||
|
|
||||||
if (!s->bs) {
|
if (!s->blk) {
|
||||||
ide_abort_command(s);
|
ide_abort_command(s);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -1322,7 +1323,7 @@ static bool cmd_set_features(IDEState *s, uint8_t cmd)
|
|||||||
{
|
{
|
||||||
uint16_t *identify_data;
|
uint16_t *identify_data;
|
||||||
|
|
||||||
if (!s->bs) {
|
if (!s->blk) {
|
||||||
ide_abort_command(s);
|
ide_abort_command(s);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -1330,12 +1331,12 @@ static bool cmd_set_features(IDEState *s, uint8_t cmd)
|
|||||||
/* XXX: valid for CDROM ? */
|
/* XXX: valid for CDROM ? */
|
||||||
switch (s->feature) {
|
switch (s->feature) {
|
||||||
case 0x02: /* write cache enable */
|
case 0x02: /* write cache enable */
|
||||||
bdrv_set_enable_write_cache(s->bs, true);
|
blk_set_enable_write_cache(s->blk, true);
|
||||||
identify_data = (uint16_t *)s->identify_data;
|
identify_data = (uint16_t *)s->identify_data;
|
||||||
put_le16(identify_data + 85, (1 << 14) | (1 << 5) | 1);
|
put_le16(identify_data + 85, (1 << 14) | (1 << 5) | 1);
|
||||||
return true;
|
return true;
|
||||||
case 0x82: /* write cache disable */
|
case 0x82: /* write cache disable */
|
||||||
bdrv_set_enable_write_cache(s->bs, false);
|
blk_set_enable_write_cache(s->blk, false);
|
||||||
identify_data = (uint16_t *)s->identify_data;
|
identify_data = (uint16_t *)s->identify_data;
|
||||||
put_le16(identify_data + 85, (1 << 14) | 1);
|
put_le16(identify_data + 85, (1 << 14) | 1);
|
||||||
ide_flush_cache(s);
|
ide_flush_cache(s);
|
||||||
@ -1802,8 +1803,9 @@ void ide_exec_cmd(IDEBus *bus, uint32_t val)
|
|||||||
#endif
|
#endif
|
||||||
s = idebus_active_if(bus);
|
s = idebus_active_if(bus);
|
||||||
/* ignore commands to non existent slave */
|
/* ignore commands to non existent slave */
|
||||||
if (s != bus->ifs && !s->bs)
|
if (s != bus->ifs && !s->blk) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* Only DEVICE RESET is allowed while BSY or/and DRQ are set */
|
/* Only DEVICE RESET is allowed while BSY or/and DRQ are set */
|
||||||
if ((s->status & (BUSY_STAT|DRQ_STAT)) && val != WIN_DEVICE_RESET)
|
if ((s->status & (BUSY_STAT|DRQ_STAT)) && val != WIN_DEVICE_RESET)
|
||||||
@ -1848,59 +1850,66 @@ uint32_t ide_ioport_read(void *opaque, uint32_t addr1)
|
|||||||
ret = 0xff;
|
ret = 0xff;
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
if ((!bus->ifs[0].bs && !bus->ifs[1].bs) ||
|
if ((!bus->ifs[0].blk && !bus->ifs[1].blk) ||
|
||||||
(s != bus->ifs && !s->bs))
|
(s != bus->ifs && !s->blk)) {
|
||||||
ret = 0;
|
ret = 0;
|
||||||
else if (!hob)
|
} else if (!hob) {
|
||||||
ret = s->error;
|
ret = s->error;
|
||||||
else
|
} else {
|
||||||
ret = s->hob_feature;
|
ret = s->hob_feature;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
if (!bus->ifs[0].bs && !bus->ifs[1].bs)
|
if (!bus->ifs[0].blk && !bus->ifs[1].blk) {
|
||||||
ret = 0;
|
ret = 0;
|
||||||
else if (!hob)
|
} else if (!hob) {
|
||||||
ret = s->nsector & 0xff;
|
ret = s->nsector & 0xff;
|
||||||
else
|
} else {
|
||||||
ret = s->hob_nsector;
|
ret = s->hob_nsector;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
if (!bus->ifs[0].bs && !bus->ifs[1].bs)
|
if (!bus->ifs[0].blk && !bus->ifs[1].blk) {
|
||||||
ret = 0;
|
ret = 0;
|
||||||
else if (!hob)
|
} else if (!hob) {
|
||||||
ret = s->sector;
|
ret = s->sector;
|
||||||
else
|
} else {
|
||||||
ret = s->hob_sector;
|
ret = s->hob_sector;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
if (!bus->ifs[0].bs && !bus->ifs[1].bs)
|
if (!bus->ifs[0].blk && !bus->ifs[1].blk) {
|
||||||
ret = 0;
|
ret = 0;
|
||||||
else if (!hob)
|
} else if (!hob) {
|
||||||
ret = s->lcyl;
|
ret = s->lcyl;
|
||||||
else
|
} else {
|
||||||
ret = s->hob_lcyl;
|
ret = s->hob_lcyl;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 5:
|
case 5:
|
||||||
if (!bus->ifs[0].bs && !bus->ifs[1].bs)
|
if (!bus->ifs[0].blk && !bus->ifs[1].blk) {
|
||||||
ret = 0;
|
ret = 0;
|
||||||
else if (!hob)
|
} else if (!hob) {
|
||||||
ret = s->hcyl;
|
ret = s->hcyl;
|
||||||
else
|
} else {
|
||||||
ret = s->hob_hcyl;
|
ret = s->hob_hcyl;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 6:
|
case 6:
|
||||||
if (!bus->ifs[0].bs && !bus->ifs[1].bs)
|
if (!bus->ifs[0].blk && !bus->ifs[1].blk) {
|
||||||
ret = 0;
|
ret = 0;
|
||||||
else
|
} else {
|
||||||
ret = s->select;
|
ret = s->select;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
case 7:
|
case 7:
|
||||||
if ((!bus->ifs[0].bs && !bus->ifs[1].bs) ||
|
if ((!bus->ifs[0].blk && !bus->ifs[1].blk) ||
|
||||||
(s != bus->ifs && !s->bs))
|
(s != bus->ifs && !s->blk)) {
|
||||||
ret = 0;
|
ret = 0;
|
||||||
else
|
} else {
|
||||||
ret = s->status;
|
ret = s->status;
|
||||||
|
}
|
||||||
qemu_irq_lower(bus->irq);
|
qemu_irq_lower(bus->irq);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1916,11 +1925,12 @@ uint32_t ide_status_read(void *opaque, uint32_t addr)
|
|||||||
IDEState *s = idebus_active_if(bus);
|
IDEState *s = idebus_active_if(bus);
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if ((!bus->ifs[0].bs && !bus->ifs[1].bs) ||
|
if ((!bus->ifs[0].blk && !bus->ifs[1].blk) ||
|
||||||
(s != bus->ifs && !s->bs))
|
(s != bus->ifs && !s->blk)) {
|
||||||
ret = 0;
|
ret = 0;
|
||||||
else
|
} else {
|
||||||
ret = s->status;
|
ret = s->status;
|
||||||
|
}
|
||||||
#ifdef DEBUG_IDE
|
#ifdef DEBUG_IDE
|
||||||
printf("ide: read status addr=0x%x val=%02x\n", addr, ret);
|
printf("ide: read status addr=0x%x val=%02x\n", addr, ret);
|
||||||
#endif
|
#endif
|
||||||
@ -2081,7 +2091,7 @@ static void ide_reset(IDEState *s)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (s->pio_aiocb) {
|
if (s->pio_aiocb) {
|
||||||
bdrv_aio_cancel(s->pio_aiocb);
|
blk_aio_cancel(s->pio_aiocb);
|
||||||
s->pio_aiocb = NULL;
|
s->pio_aiocb = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2145,7 +2155,7 @@ void ide_bus_reset(IDEBus *bus)
|
|||||||
#ifdef DEBUG_AIO
|
#ifdef DEBUG_AIO
|
||||||
printf("aio_cancel\n");
|
printf("aio_cancel\n");
|
||||||
#endif
|
#endif
|
||||||
bdrv_aio_cancel(bus->dma->aiocb);
|
blk_aio_cancel(bus->dma->aiocb);
|
||||||
bus->dma->aiocb = NULL;
|
bus->dma->aiocb = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2174,7 +2184,7 @@ static void ide_resize_cb(void *opaque)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
bdrv_get_geometry(s->bs, &nb_sectors);
|
blk_get_geometry(s->blk, &nb_sectors);
|
||||||
s->nb_sectors = nb_sectors;
|
s->nb_sectors = nb_sectors;
|
||||||
|
|
||||||
/* Update the identify data buffer. */
|
/* Update the identify data buffer. */
|
||||||
@ -2198,7 +2208,7 @@ static const BlockDevOps ide_hd_block_ops = {
|
|||||||
.resize_cb = ide_resize_cb,
|
.resize_cb = ide_resize_cb,
|
||||||
};
|
};
|
||||||
|
|
||||||
int ide_init_drive(IDEState *s, BlockDriverState *bs, IDEDriveKind kind,
|
int ide_init_drive(IDEState *s, BlockBackend *blk, IDEDriveKind kind,
|
||||||
const char *version, const char *serial, const char *model,
|
const char *version, const char *serial, const char *model,
|
||||||
uint64_t wwn,
|
uint64_t wwn,
|
||||||
uint32_t cylinders, uint32_t heads, uint32_t secs,
|
uint32_t cylinders, uint32_t heads, uint32_t secs,
|
||||||
@ -2206,10 +2216,10 @@ int ide_init_drive(IDEState *s, BlockDriverState *bs, IDEDriveKind kind,
|
|||||||
{
|
{
|
||||||
uint64_t nb_sectors;
|
uint64_t nb_sectors;
|
||||||
|
|
||||||
s->bs = bs;
|
s->blk = blk;
|
||||||
s->drive_kind = kind;
|
s->drive_kind = kind;
|
||||||
|
|
||||||
bdrv_get_geometry(bs, &nb_sectors);
|
blk_get_geometry(blk, &nb_sectors);
|
||||||
s->cylinders = cylinders;
|
s->cylinders = cylinders;
|
||||||
s->heads = heads;
|
s->heads = heads;
|
||||||
s->sectors = secs;
|
s->sectors = secs;
|
||||||
@ -2223,18 +2233,18 @@ int ide_init_drive(IDEState *s, BlockDriverState *bs, IDEDriveKind kind,
|
|||||||
s->smart_errors = 0;
|
s->smart_errors = 0;
|
||||||
s->smart_selftest_count = 0;
|
s->smart_selftest_count = 0;
|
||||||
if (kind == IDE_CD) {
|
if (kind == IDE_CD) {
|
||||||
bdrv_set_dev_ops(bs, &ide_cd_block_ops, s);
|
blk_set_dev_ops(blk, &ide_cd_block_ops, s);
|
||||||
bdrv_set_guest_block_size(bs, 2048);
|
blk_set_guest_block_size(blk, 2048);
|
||||||
} else {
|
} else {
|
||||||
if (!bdrv_is_inserted(s->bs)) {
|
if (!blk_is_inserted(s->blk)) {
|
||||||
error_report("Device needs media, but drive is empty");
|
error_report("Device needs media, but drive is empty");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (bdrv_is_read_only(bs)) {
|
if (blk_is_read_only(blk)) {
|
||||||
error_report("Can't use a read-only drive");
|
error_report("Can't use a read-only drive");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
bdrv_set_dev_ops(bs, &ide_hd_block_ops, s);
|
blk_set_dev_ops(blk, &ide_hd_block_ops, s);
|
||||||
}
|
}
|
||||||
if (serial) {
|
if (serial) {
|
||||||
pstrcpy(s->drive_serial_str, sizeof(s->drive_serial_str), serial);
|
pstrcpy(s->drive_serial_str, sizeof(s->drive_serial_str), serial);
|
||||||
@ -2265,7 +2275,7 @@ int ide_init_drive(IDEState *s, BlockDriverState *bs, IDEDriveKind kind,
|
|||||||
}
|
}
|
||||||
|
|
||||||
ide_reset(s);
|
ide_reset(s);
|
||||||
bdrv_iostatus_enable(bs);
|
blk_iostatus_enable(blk);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2282,7 +2292,7 @@ static void ide_init1(IDEBus *bus, int unit)
|
|||||||
s->io_buffer = qemu_memalign(2048, s->io_buffer_total_len);
|
s->io_buffer = qemu_memalign(2048, s->io_buffer_total_len);
|
||||||
memset(s->io_buffer, 0, s->io_buffer_total_len);
|
memset(s->io_buffer, 0, s->io_buffer_total_len);
|
||||||
|
|
||||||
s->smart_selftest_data = qemu_blockalign(s->bs, 512);
|
s->smart_selftest_data = blk_blockalign(s->blk, 512);
|
||||||
memset(s->smart_selftest_data, 0, 512);
|
memset(s->smart_selftest_data, 0, 512);
|
||||||
|
|
||||||
s->sector_write_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL,
|
s->sector_write_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL,
|
||||||
@ -2377,7 +2387,7 @@ static int ide_drive_post_load(void *opaque, int version_id)
|
|||||||
IDEState *s = opaque;
|
IDEState *s = opaque;
|
||||||
|
|
||||||
if (s->identify_set) {
|
if (s->identify_set) {
|
||||||
bdrv_set_enable_write_cache(s->bs, !!(s->identify_data[85] & (1 << 5)));
|
blk_set_enable_write_cache(s->blk, !!(s->identify_data[85] & (1 << 5)));
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -65,7 +65,7 @@
|
|||||||
#include <hw/i386/pc.h>
|
#include <hw/i386/pc.h>
|
||||||
#include <hw/pci/pci.h>
|
#include <hw/pci/pci.h>
|
||||||
#include <hw/isa/isa.h>
|
#include <hw/isa/isa.h>
|
||||||
#include "block/block.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "sysemu/dma.h"
|
#include "sysemu/dma.h"
|
||||||
|
|
||||||
#include <hw/ide/pci.h>
|
#include <hw/ide/pci.h>
|
||||||
|
@ -373,7 +373,7 @@ struct IDEState {
|
|||||||
|
|
||||||
/* set for lba48 access */
|
/* set for lba48 access */
|
||||||
uint8_t lba48;
|
uint8_t lba48;
|
||||||
BlockDriverState *bs;
|
BlockBackend *blk;
|
||||||
char version[9];
|
char version[9];
|
||||||
/* ATAPI specific */
|
/* ATAPI specific */
|
||||||
struct unreported_events events;
|
struct unreported_events events;
|
||||||
@ -537,7 +537,7 @@ uint32_t ide_data_readw(void *opaque, uint32_t addr);
|
|||||||
void ide_data_writel(void *opaque, uint32_t addr, uint32_t val);
|
void ide_data_writel(void *opaque, uint32_t addr, uint32_t val);
|
||||||
uint32_t ide_data_readl(void *opaque, uint32_t addr);
|
uint32_t ide_data_readl(void *opaque, uint32_t addr);
|
||||||
|
|
||||||
int ide_init_drive(IDEState *s, BlockDriverState *bs, IDEDriveKind kind,
|
int ide_init_drive(IDEState *s, BlockBackend *blk, IDEDriveKind kind,
|
||||||
const char *version, const char *serial, const char *model,
|
const char *version, const char *serial, const char *model,
|
||||||
uint64_t wwn,
|
uint64_t wwn,
|
||||||
uint32_t cylinders, uint32_t heads, uint32_t secs,
|
uint32_t cylinders, uint32_t heads, uint32_t secs,
|
||||||
@ -555,7 +555,7 @@ void ide_transfer_start(IDEState *s, uint8_t *buf, int size,
|
|||||||
EndTransferFunc *end_transfer_func);
|
EndTransferFunc *end_transfer_func);
|
||||||
void ide_transfer_stop(IDEState *s);
|
void ide_transfer_stop(IDEState *s);
|
||||||
void ide_set_inactive(IDEState *s, bool more);
|
void ide_set_inactive(IDEState *s, bool more);
|
||||||
BlockAIOCB *ide_issue_trim(BlockDriverState *bs,
|
BlockAIOCB *ide_issue_trim(BlockBackend *blk,
|
||||||
int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
|
int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
|
||||||
BlockCompletionFunc *cb, void *opaque);
|
BlockCompletionFunc *cb, void *opaque);
|
||||||
|
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
#include <hw/hw.h>
|
#include <hw/hw.h>
|
||||||
#include <hw/i386/pc.h>
|
#include <hw/i386/pc.h>
|
||||||
#include <hw/isa/isa.h>
|
#include <hw/isa/isa.h>
|
||||||
#include "block/block.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "sysemu/dma.h"
|
#include "sysemu/dma.h"
|
||||||
|
|
||||||
#include <hw/ide/internal.h>
|
#include <hw/ide/internal.h>
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
#include "hw/hw.h"
|
#include "hw/hw.h"
|
||||||
#include "hw/ppc/mac.h"
|
#include "hw/ppc/mac.h"
|
||||||
#include "hw/ppc/mac_dbdma.h"
|
#include "hw/ppc/mac_dbdma.h"
|
||||||
#include "block/block.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "sysemu/dma.h"
|
#include "sysemu/dma.h"
|
||||||
|
|
||||||
#include <hw/ide/internal.h>
|
#include <hw/ide/internal.h>
|
||||||
@ -134,7 +134,7 @@ static void pmac_ide_atapi_transfer_cb(void *opaque, int ret)
|
|||||||
MACIO_DPRINTF("precopying unaligned %d bytes to %#" HWADDR_PRIx "\n",
|
MACIO_DPRINTF("precopying unaligned %d bytes to %#" HWADDR_PRIx "\n",
|
||||||
unaligned, io->addr + io->len - unaligned);
|
unaligned, io->addr + io->len - unaligned);
|
||||||
|
|
||||||
bdrv_read(s->bs, sector_num + nsector, io->remainder, 1);
|
blk_read(s->blk, sector_num + nsector, io->remainder, 1);
|
||||||
cpu_physical_memory_write(io->addr + io->len - unaligned,
|
cpu_physical_memory_write(io->addr + io->len - unaligned,
|
||||||
io->remainder, unaligned);
|
io->remainder, unaligned);
|
||||||
|
|
||||||
@ -164,14 +164,14 @@ static void pmac_ide_atapi_transfer_cb(void *opaque, int ret)
|
|||||||
(s->lba << 2) + (s->io_buffer_index >> 9),
|
(s->lba << 2) + (s->io_buffer_index >> 9),
|
||||||
s->packet_transfer_size, s->dma_cmd);
|
s->packet_transfer_size, s->dma_cmd);
|
||||||
|
|
||||||
m->aiocb = dma_bdrv_read(s->bs, &s->sg,
|
m->aiocb = dma_blk_read(s->blk, &s->sg,
|
||||||
(int64_t)(s->lba << 2) + (s->io_buffer_index >> 9),
|
(int64_t)(s->lba << 2) + (s->io_buffer_index >> 9),
|
||||||
pmac_ide_atapi_transfer_cb, io);
|
pmac_ide_atapi_transfer_cb, io);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
done:
|
done:
|
||||||
MACIO_DPRINTF("done DMA\n");
|
MACIO_DPRINTF("done DMA\n");
|
||||||
block_acct_done(bdrv_get_stats(s->bs), &s->acct);
|
block_acct_done(blk_get_stats(s->blk), &s->acct);
|
||||||
io->dma_end(opaque);
|
io->dma_end(opaque);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -254,8 +254,8 @@ static void pmac_ide_transfer_cb(void *opaque, int ret)
|
|||||||
qemu_iovec_reset(&io->iov);
|
qemu_iovec_reset(&io->iov);
|
||||||
qemu_iovec_add(&io->iov, io->remainder, 0x200);
|
qemu_iovec_add(&io->iov, io->remainder, 0x200);
|
||||||
|
|
||||||
m->aiocb = bdrv_aio_writev(s->bs, sector_num - 1, &io->iov, 1,
|
m->aiocb = blk_aio_writev(s->blk, sector_num - 1, &io->iov, 1,
|
||||||
pmac_ide_transfer_cb, io);
|
pmac_ide_transfer_cb, io);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -294,8 +294,8 @@ static void pmac_ide_transfer_cb(void *opaque, int ret)
|
|||||||
qemu_iovec_reset(&io->iov);
|
qemu_iovec_reset(&io->iov);
|
||||||
qemu_iovec_add(&io->iov, io->remainder, 0x200);
|
qemu_iovec_add(&io->iov, io->remainder, 0x200);
|
||||||
|
|
||||||
m->aiocb = bdrv_aio_readv(s->bs, sector_num + nsector, &io->iov, 1,
|
m->aiocb = blk_aio_readv(s->blk, sector_num + nsector, &io->iov, 1,
|
||||||
pmac_ide_transfer_cb, io);
|
pmac_ide_transfer_cb, io);
|
||||||
break;
|
break;
|
||||||
case IDE_DMA_WRITE:
|
case IDE_DMA_WRITE:
|
||||||
/* cache the contents in our io struct */
|
/* cache the contents in our io struct */
|
||||||
@ -333,17 +333,17 @@ static void pmac_ide_transfer_cb(void *opaque, int ret)
|
|||||||
|
|
||||||
switch (s->dma_cmd) {
|
switch (s->dma_cmd) {
|
||||||
case IDE_DMA_READ:
|
case IDE_DMA_READ:
|
||||||
m->aiocb = dma_bdrv_read(s->bs, &s->sg, sector_num,
|
m->aiocb = dma_blk_read(s->blk, &s->sg, sector_num,
|
||||||
pmac_ide_transfer_cb, io);
|
pmac_ide_transfer_cb, io);
|
||||||
break;
|
break;
|
||||||
case IDE_DMA_WRITE:
|
case IDE_DMA_WRITE:
|
||||||
m->aiocb = dma_bdrv_write(s->bs, &s->sg, sector_num,
|
m->aiocb = dma_blk_write(s->blk, &s->sg, sector_num,
|
||||||
pmac_ide_transfer_cb, io);
|
pmac_ide_transfer_cb, io);
|
||||||
break;
|
break;
|
||||||
case IDE_DMA_TRIM:
|
case IDE_DMA_TRIM:
|
||||||
m->aiocb = dma_bdrv_io(s->bs, &s->sg, sector_num,
|
m->aiocb = dma_blk_io(s->blk, &s->sg, sector_num,
|
||||||
ide_issue_trim, pmac_ide_transfer_cb, io,
|
ide_issue_trim, pmac_ide_transfer_cb, io,
|
||||||
DMA_DIRECTION_TO_DEVICE);
|
DMA_DIRECTION_TO_DEVICE);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -352,7 +352,7 @@ static void pmac_ide_transfer_cb(void *opaque, int ret)
|
|||||||
|
|
||||||
done:
|
done:
|
||||||
if (s->dma_cmd == IDE_DMA_READ || s->dma_cmd == IDE_DMA_WRITE) {
|
if (s->dma_cmd == IDE_DMA_READ || s->dma_cmd == IDE_DMA_WRITE) {
|
||||||
block_acct_done(bdrv_get_stats(s->bs), &s->acct);
|
block_acct_done(blk_get_stats(s->blk), &s->acct);
|
||||||
}
|
}
|
||||||
io->dma_end(io);
|
io->dma_end(io);
|
||||||
}
|
}
|
||||||
@ -370,7 +370,7 @@ static void pmac_ide_transfer(DBDMA_io *io)
|
|||||||
/* Handle non-block ATAPI DMA transfers */
|
/* Handle non-block ATAPI DMA transfers */
|
||||||
if (s->lba == -1) {
|
if (s->lba == -1) {
|
||||||
s->io_buffer_size = MIN(io->len, s->packet_transfer_size);
|
s->io_buffer_size = MIN(io->len, s->packet_transfer_size);
|
||||||
block_acct_start(bdrv_get_stats(s->bs), &s->acct, s->io_buffer_size,
|
block_acct_start(blk_get_stats(s->blk), &s->acct, s->io_buffer_size,
|
||||||
BLOCK_ACCT_READ);
|
BLOCK_ACCT_READ);
|
||||||
MACIO_DPRINTF("non-block ATAPI DMA transfer size: %d\n",
|
MACIO_DPRINTF("non-block ATAPI DMA transfer size: %d\n",
|
||||||
s->io_buffer_size);
|
s->io_buffer_size);
|
||||||
@ -382,12 +382,12 @@ static void pmac_ide_transfer(DBDMA_io *io)
|
|||||||
m->dma_active = false;
|
m->dma_active = false;
|
||||||
|
|
||||||
MACIO_DPRINTF("end of non-block ATAPI DMA transfer\n");
|
MACIO_DPRINTF("end of non-block ATAPI DMA transfer\n");
|
||||||
block_acct_done(bdrv_get_stats(s->bs), &s->acct);
|
block_acct_done(blk_get_stats(s->blk), &s->acct);
|
||||||
io->dma_end(io);
|
io->dma_end(io);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
block_acct_start(bdrv_get_stats(s->bs), &s->acct, io->len,
|
block_acct_start(blk_get_stats(s->blk), &s->acct, io->len,
|
||||||
BLOCK_ACCT_READ);
|
BLOCK_ACCT_READ);
|
||||||
pmac_ide_atapi_transfer_cb(io, 0);
|
pmac_ide_atapi_transfer_cb(io, 0);
|
||||||
return;
|
return;
|
||||||
@ -395,11 +395,11 @@ static void pmac_ide_transfer(DBDMA_io *io)
|
|||||||
|
|
||||||
switch (s->dma_cmd) {
|
switch (s->dma_cmd) {
|
||||||
case IDE_DMA_READ:
|
case IDE_DMA_READ:
|
||||||
block_acct_start(bdrv_get_stats(s->bs), &s->acct, io->len,
|
block_acct_start(blk_get_stats(s->blk), &s->acct, io->len,
|
||||||
BLOCK_ACCT_READ);
|
BLOCK_ACCT_READ);
|
||||||
break;
|
break;
|
||||||
case IDE_DMA_WRITE:
|
case IDE_DMA_WRITE:
|
||||||
block_acct_start(bdrv_get_stats(s->bs), &s->acct, io->len,
|
block_acct_start(blk_get_stats(s->blk), &s->acct, io->len,
|
||||||
BLOCK_ACCT_WRITE);
|
BLOCK_ACCT_WRITE);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -415,7 +415,7 @@ static void pmac_ide_flush(DBDMA_io *io)
|
|||||||
MACIOIDEState *m = io->opaque;
|
MACIOIDEState *m = io->opaque;
|
||||||
|
|
||||||
if (m->aiocb) {
|
if (m->aiocb) {
|
||||||
bdrv_drain_all();
|
blk_drain_all();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
#include <hw/hw.h>
|
#include <hw/hw.h>
|
||||||
#include <hw/i386/pc.h>
|
#include <hw/i386/pc.h>
|
||||||
#include <hw/pcmcia.h>
|
#include <hw/pcmcia.h>
|
||||||
#include "block/block.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "sysemu/dma.h"
|
#include "sysemu/dma.h"
|
||||||
|
|
||||||
#include <hw/ide/internal.h>
|
#include <hw/ide/internal.h>
|
||||||
@ -247,7 +247,7 @@ static uint16_t md_common_read(PCMCIACardState *card, uint32_t at)
|
|||||||
return ide_ioport_read(&s->bus, 0x1);
|
return ide_ioport_read(&s->bus, 0x1);
|
||||||
case 0xe: /* Alternate Status */
|
case 0xe: /* Alternate Status */
|
||||||
ifs = idebus_active_if(&s->bus);
|
ifs = idebus_active_if(&s->bus);
|
||||||
if (ifs->bs) {
|
if (ifs->blk) {
|
||||||
return ifs->status;
|
return ifs->status;
|
||||||
} else {
|
} else {
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
*/
|
*/
|
||||||
#include "hw/hw.h"
|
#include "hw/hw.h"
|
||||||
#include "hw/sysbus.h"
|
#include "hw/sysbus.h"
|
||||||
#include "block/block.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "sysemu/dma.h"
|
#include "sysemu/dma.h"
|
||||||
|
|
||||||
#include <hw/ide/internal.h>
|
#include <hw/ide/internal.h>
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
#include <hw/i386/pc.h>
|
#include <hw/i386/pc.h>
|
||||||
#include <hw/pci/pci.h>
|
#include <hw/pci/pci.h>
|
||||||
#include <hw/isa/isa.h>
|
#include <hw/isa/isa.h>
|
||||||
#include "block/block.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "sysemu/dma.h"
|
#include "sysemu/dma.h"
|
||||||
|
|
||||||
#include <hw/ide/pci.h>
|
#include <hw/ide/pci.h>
|
||||||
@ -302,7 +302,7 @@ void bmdma_cmd_writeb(BMDMAState *bm, uint32_t val)
|
|||||||
* aio operation with preadv/pwritev.
|
* aio operation with preadv/pwritev.
|
||||||
*/
|
*/
|
||||||
if (bm->bus->dma->aiocb) {
|
if (bm->bus->dma->aiocb) {
|
||||||
bdrv_drain_all();
|
blk_drain_all();
|
||||||
assert(bm->bus->dma->aiocb == NULL);
|
assert(bm->bus->dma->aiocb == NULL);
|
||||||
}
|
}
|
||||||
bm->status &= ~BM_STATUS_DMAING;
|
bm->status &= ~BM_STATUS_DMAING;
|
||||||
|
@ -28,7 +28,6 @@
|
|||||||
#include <hw/pci/pci.h>
|
#include <hw/pci/pci.h>
|
||||||
#include <hw/isa/isa.h>
|
#include <hw/isa/isa.h>
|
||||||
#include "sysemu/block-backend.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "sysemu/blockdev.h"
|
|
||||||
#include "sysemu/sysemu.h"
|
#include "sysemu/sysemu.h"
|
||||||
#include "sysemu/dma.h"
|
#include "sysemu/dma.h"
|
||||||
|
|
||||||
@ -180,12 +179,11 @@ int pci_piix3_xen_ide_unplug(DeviceState *dev)
|
|||||||
di = drive_get_by_index(IF_IDE, i);
|
di = drive_get_by_index(IF_IDE, i);
|
||||||
if (di != NULL && !di->media_cd) {
|
if (di != NULL && !di->media_cd) {
|
||||||
BlockBackend *blk = blk_by_legacy_dinfo(di);
|
BlockBackend *blk = blk_by_legacy_dinfo(di);
|
||||||
BlockDriverState *bs = blk_bs(blk);
|
DeviceState *ds = blk_get_attached_dev(blk);
|
||||||
DeviceState *ds = bdrv_get_attached_dev(bs);
|
|
||||||
if (ds) {
|
if (ds) {
|
||||||
bdrv_detach_dev(bs, ds);
|
blk_detach_dev(blk, ds);
|
||||||
}
|
}
|
||||||
pci_ide->bus[di->bus].ifs[di->unit].bs = NULL;
|
pci_ide->bus[di->bus].ifs[di->unit].blk = NULL;
|
||||||
blk_unref(blk);
|
blk_unref(blk);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -73,7 +73,7 @@ static int ide_qdev_init(DeviceState *qdev)
|
|||||||
IDEDeviceClass *dc = IDE_DEVICE_GET_CLASS(dev);
|
IDEDeviceClass *dc = IDE_DEVICE_GET_CLASS(dev);
|
||||||
IDEBus *bus = DO_UPCAST(IDEBus, qbus, qdev->parent_bus);
|
IDEBus *bus = DO_UPCAST(IDEBus, qbus, qdev->parent_bus);
|
||||||
|
|
||||||
if (!dev->conf.bs) {
|
if (!dev->conf.blk) {
|
||||||
error_report("No drive specified");
|
error_report("No drive specified");
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
@ -118,8 +118,7 @@ IDEDevice *ide_create_drive(IDEBus *bus, int unit, DriveInfo *drive)
|
|||||||
|
|
||||||
dev = qdev_create(&bus->qbus, drive->media_cd ? "ide-cd" : "ide-hd");
|
dev = qdev_create(&bus->qbus, drive->media_cd ? "ide-cd" : "ide-hd");
|
||||||
qdev_prop_set_uint32(dev, "unit", unit);
|
qdev_prop_set_uint32(dev, "unit", unit);
|
||||||
qdev_prop_set_drive_nofail(dev, "drive",
|
qdev_prop_set_drive_nofail(dev, "drive", blk_by_legacy_dinfo(drive));
|
||||||
blk_bs(blk_by_legacy_dinfo(drive)));
|
|
||||||
qdev_init_nofail(dev);
|
qdev_init_nofail(dev);
|
||||||
return DO_UPCAST(IDEDevice, qdev, dev);
|
return DO_UPCAST(IDEDevice, qdev, dev);
|
||||||
}
|
}
|
||||||
@ -129,7 +128,7 @@ int ide_get_geometry(BusState *bus, int unit,
|
|||||||
{
|
{
|
||||||
IDEState *s = &DO_UPCAST(IDEBus, qbus, bus)->ifs[unit];
|
IDEState *s = &DO_UPCAST(IDEBus, qbus, bus)->ifs[unit];
|
||||||
|
|
||||||
if (s->drive_kind != IDE_HD || !s->bs) {
|
if (s->drive_kind != IDE_HD || !s->blk) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -174,7 +173,7 @@ static int ide_dev_initfn(IDEDevice *dev, IDEDriveKind kind)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ide_init_drive(s, dev->conf.bs, kind,
|
if (ide_init_drive(s, dev->conf.blk, kind,
|
||||||
dev->version, dev->serial, dev->model, dev->wwn,
|
dev->version, dev->serial, dev->model, dev->wwn,
|
||||||
dev->conf.cyls, dev->conf.heads, dev->conf.secs,
|
dev->conf.cyls, dev->conf.heads, dev->conf.secs,
|
||||||
dev->chs_trans) < 0) {
|
dev->chs_trans) < 0) {
|
||||||
@ -251,7 +250,7 @@ static int ide_cd_initfn(IDEDevice *dev)
|
|||||||
|
|
||||||
static int ide_drive_initfn(IDEDevice *dev)
|
static int ide_drive_initfn(IDEDevice *dev)
|
||||||
{
|
{
|
||||||
DriveInfo *dinfo = drive_get_by_blockdev(dev->conf.bs);
|
DriveInfo *dinfo = blk_legacy_dinfo(dev->conf.blk);
|
||||||
|
|
||||||
return ide_dev_initfn(dev, dinfo->media_cd ? IDE_CD : IDE_HD);
|
return ide_dev_initfn(dev, dinfo->media_cd ? IDE_CD : IDE_HD);
|
||||||
}
|
}
|
||||||
|
@ -27,7 +27,7 @@
|
|||||||
#include <hw/i386/pc.h>
|
#include <hw/i386/pc.h>
|
||||||
#include <hw/pci/pci.h>
|
#include <hw/pci/pci.h>
|
||||||
#include <hw/isa/isa.h>
|
#include <hw/isa/isa.h>
|
||||||
#include "block/block.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "sysemu/sysemu.h"
|
#include "sysemu/sysemu.h"
|
||||||
#include "sysemu/dma.h"
|
#include "sysemu/dma.h"
|
||||||
|
|
||||||
|
@ -322,12 +322,12 @@ static void pc87312_realize(DeviceState *dev, Error **errp)
|
|||||||
drive = drive_get(IF_FLOPPY, 0, 0);
|
drive = drive_get(IF_FLOPPY, 0, 0);
|
||||||
if (drive != NULL) {
|
if (drive != NULL) {
|
||||||
qdev_prop_set_drive_nofail(d, "driveA",
|
qdev_prop_set_drive_nofail(d, "driveA",
|
||||||
blk_bs(blk_by_legacy_dinfo(drive)));
|
blk_by_legacy_dinfo(drive));
|
||||||
}
|
}
|
||||||
drive = drive_get(IF_FLOPPY, 0, 1);
|
drive = drive_get(IF_FLOPPY, 0, 1);
|
||||||
if (drive != NULL) {
|
if (drive != NULL) {
|
||||||
qdev_prop_set_drive_nofail(d, "driveB",
|
qdev_prop_set_drive_nofail(d, "driveB",
|
||||||
blk_bs(blk_by_legacy_dinfo(drive)));
|
blk_by_legacy_dinfo(drive));
|
||||||
}
|
}
|
||||||
qdev_init_nofail(d);
|
qdev_init_nofail(d);
|
||||||
s->fdc.dev = isa;
|
s->fdc.dev = isa;
|
||||||
|
@ -24,7 +24,6 @@
|
|||||||
#include "hw/boards.h"
|
#include "hw/boards.h"
|
||||||
#include "hw/loader.h"
|
#include "hw/loader.h"
|
||||||
#include "sysemu/block-backend.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "sysemu/blockdev.h"
|
|
||||||
#include "elf.h"
|
#include "elf.h"
|
||||||
#include "lm32_hwsetup.h"
|
#include "lm32_hwsetup.h"
|
||||||
#include "lm32.h"
|
#include "lm32.h"
|
||||||
@ -120,7 +119,7 @@ static void lm32_evr_init(MachineState *machine)
|
|||||||
dinfo = drive_get(IF_PFLASH, 0, 0);
|
dinfo = drive_get(IF_PFLASH, 0, 0);
|
||||||
/* Spansion S29NS128P */
|
/* Spansion S29NS128P */
|
||||||
pflash_cfi02_register(flash_base, NULL, "lm32_evr.flash", flash_size,
|
pflash_cfi02_register(flash_base, NULL, "lm32_evr.flash", flash_size,
|
||||||
dinfo ? blk_bs(blk_by_legacy_dinfo(dinfo)) : NULL,
|
dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
|
||||||
flash_sector_size, flash_size / flash_sector_size,
|
flash_sector_size, flash_size / flash_sector_size,
|
||||||
1, 2, 0x01, 0x7e, 0x43, 0x00, 0x555, 0x2aa, 1);
|
1, 2, 0x01, 0x7e, 0x43, 0x00, 0x555, 0x2aa, 1);
|
||||||
|
|
||||||
@ -223,7 +222,7 @@ static void lm32_uclinux_init(MachineState *machine)
|
|||||||
dinfo = drive_get(IF_PFLASH, 0, 0);
|
dinfo = drive_get(IF_PFLASH, 0, 0);
|
||||||
/* Spansion S29NS128P */
|
/* Spansion S29NS128P */
|
||||||
pflash_cfi02_register(flash_base, NULL, "lm32_uclinux.flash", flash_size,
|
pflash_cfi02_register(flash_base, NULL, "lm32_uclinux.flash", flash_size,
|
||||||
dinfo ? blk_bs(blk_by_legacy_dinfo(dinfo)) : NULL,
|
dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
|
||||||
flash_sector_size, flash_size / flash_sector_size,
|
flash_sector_size, flash_size / flash_sector_size,
|
||||||
1, 2, 0x01, 0x7e, 0x43, 0x00, 0x555, 0x2aa, 1);
|
1, 2, 0x01, 0x7e, 0x43, 0x00, 0x555, 0x2aa, 1);
|
||||||
|
|
||||||
|
@ -27,7 +27,6 @@
|
|||||||
#include "hw/loader.h"
|
#include "hw/loader.h"
|
||||||
#include "elf.h"
|
#include "elf.h"
|
||||||
#include "sysemu/block-backend.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "sysemu/blockdev.h"
|
|
||||||
#include "milkymist-hw.h"
|
#include "milkymist-hw.h"
|
||||||
#include "lm32.h"
|
#include "lm32.h"
|
||||||
#include "exec/address-spaces.h"
|
#include "exec/address-spaces.h"
|
||||||
@ -127,7 +126,7 @@ milkymist_init(MachineState *machine)
|
|||||||
dinfo = drive_get(IF_PFLASH, 0, 0);
|
dinfo = drive_get(IF_PFLASH, 0, 0);
|
||||||
/* Numonyx JS28F256J3F105 */
|
/* Numonyx JS28F256J3F105 */
|
||||||
pflash_cfi01_register(flash_base, NULL, "milkymist.flash", flash_size,
|
pflash_cfi01_register(flash_base, NULL, "milkymist.flash", flash_size,
|
||||||
dinfo ? blk_bs(blk_by_legacy_dinfo(dinfo)) : NULL,
|
dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
|
||||||
flash_sector_size, flash_size / flash_sector_size,
|
flash_sector_size, flash_size / flash_sector_size,
|
||||||
2, 0x00, 0x89, 0x00, 0x1d, 1);
|
2, 0x00, 0x89, 0x00, 0x1d, 1);
|
||||||
|
|
||||||
|
@ -33,7 +33,6 @@
|
|||||||
#include "hw/devices.h"
|
#include "hw/devices.h"
|
||||||
#include "hw/boards.h"
|
#include "hw/boards.h"
|
||||||
#include "sysemu/block-backend.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "sysemu/blockdev.h"
|
|
||||||
#include "hw/char/serial.h"
|
#include "hw/char/serial.h"
|
||||||
#include "exec/address-spaces.h"
|
#include "exec/address-spaces.h"
|
||||||
#include "hw/ssi.h"
|
#include "hw/ssi.h"
|
||||||
@ -114,7 +113,7 @@ petalogix_ml605_init(MachineState *machine)
|
|||||||
* 10th paremeter 0 means little-endian */
|
* 10th paremeter 0 means little-endian */
|
||||||
pflash_cfi01_register(FLASH_BASEADDR,
|
pflash_cfi01_register(FLASH_BASEADDR,
|
||||||
NULL, "petalogix_ml605.flash", FLASH_SIZE,
|
NULL, "petalogix_ml605.flash", FLASH_SIZE,
|
||||||
dinfo ? blk_bs(blk_by_legacy_dinfo(dinfo)) : NULL,
|
dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
|
||||||
(64 * 1024), FLASH_SIZE >> 16,
|
(64 * 1024), FLASH_SIZE >> 16,
|
||||||
2, 0x89, 0x18, 0x0000, 0x0, 0);
|
2, 0x89, 0x18, 0x0000, 0x0, 0);
|
||||||
|
|
||||||
|
@ -31,7 +31,6 @@
|
|||||||
#include "hw/devices.h"
|
#include "hw/devices.h"
|
||||||
#include "hw/boards.h"
|
#include "hw/boards.h"
|
||||||
#include "sysemu/block-backend.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "sysemu/blockdev.h"
|
|
||||||
#include "exec/address-spaces.h"
|
#include "exec/address-spaces.h"
|
||||||
|
|
||||||
#include "boot.h"
|
#include "boot.h"
|
||||||
@ -95,7 +94,7 @@ petalogix_s3adsp1800_init(MachineState *machine)
|
|||||||
dinfo = drive_get(IF_PFLASH, 0, 0);
|
dinfo = drive_get(IF_PFLASH, 0, 0);
|
||||||
pflash_cfi01_register(FLASH_BASEADDR,
|
pflash_cfi01_register(FLASH_BASEADDR,
|
||||||
NULL, "petalogix_s3adsp1800.flash", FLASH_SIZE,
|
NULL, "petalogix_s3adsp1800.flash", FLASH_SIZE,
|
||||||
dinfo ? blk_bs(blk_by_legacy_dinfo(dinfo)) : NULL,
|
dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
|
||||||
(64 * 1024), FLASH_SIZE >> 16,
|
(64 * 1024), FLASH_SIZE >> 16,
|
||||||
1, 0x89, 0x18, 0x0000, 0x0, 1);
|
1, 0x89, 0x18, 0x0000, 0x0, 1);
|
||||||
|
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
#include "net/net.h"
|
#include "net/net.h"
|
||||||
#include "hw/boards.h"
|
#include "hw/boards.h"
|
||||||
#include "hw/i2c/smbus.h"
|
#include "hw/i2c/smbus.h"
|
||||||
#include "block/block.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "hw/block/flash.h"
|
#include "hw/block/flash.h"
|
||||||
#include "hw/mips/mips.h"
|
#include "hw/mips/mips.h"
|
||||||
#include "hw/mips/cpudevs.h"
|
#include "hw/mips/cpudevs.h"
|
||||||
|
@ -39,7 +39,7 @@
|
|||||||
#include "hw/timer/mc146818rtc.h"
|
#include "hw/timer/mc146818rtc.h"
|
||||||
#include "hw/timer/i8254.h"
|
#include "hw/timer/i8254.h"
|
||||||
#include "hw/audio/pcspk.h"
|
#include "hw/audio/pcspk.h"
|
||||||
#include "sysemu/blockdev.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "hw/sysbus.h"
|
#include "hw/sysbus.h"
|
||||||
#include "exec/address-spaces.h"
|
#include "exec/address-spaces.h"
|
||||||
#include "sysemu/qtest.h"
|
#include "sysemu/qtest.h"
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
#include "net/net.h"
|
#include "net/net.h"
|
||||||
#include "hw/boards.h"
|
#include "hw/boards.h"
|
||||||
#include "hw/i2c/smbus.h"
|
#include "hw/i2c/smbus.h"
|
||||||
#include "block/block.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "hw/block/flash.h"
|
#include "hw/block/flash.h"
|
||||||
#include "hw/mips/mips.h"
|
#include "hw/mips/mips.h"
|
||||||
#include "hw/mips/cpudevs.h"
|
#include "hw/mips/cpudevs.h"
|
||||||
@ -1033,12 +1033,12 @@ void mips_malta_init(MachineState *machine)
|
|||||||
printf("Register parallel flash %d size " TARGET_FMT_lx " at "
|
printf("Register parallel flash %d size " TARGET_FMT_lx " at "
|
||||||
"addr %08llx '%s' %x\n",
|
"addr %08llx '%s' %x\n",
|
||||||
fl_idx, bios_size, FLASH_ADDRESS,
|
fl_idx, bios_size, FLASH_ADDRESS,
|
||||||
bdrv_get_device_name(dinfo->bdrv), fl_sectors);
|
blk_name(dinfo->bdrv), fl_sectors);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
fl = pflash_cfi01_register(FLASH_ADDRESS, NULL, "mips_malta.bios",
|
fl = pflash_cfi01_register(FLASH_ADDRESS, NULL, "mips_malta.bios",
|
||||||
BIOS_SIZE,
|
BIOS_SIZE,
|
||||||
dinfo ? blk_bs(blk_by_legacy_dinfo(dinfo)) : NULL,
|
dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
|
||||||
65536, fl_sectors,
|
65536, fl_sectors,
|
||||||
4, 0x0000, 0x0000, 0x0000, 0x0000, be);
|
4, 0x0000, 0x0000, 0x0000, 0x0000, be);
|
||||||
bios = pflash_cfi01_get_memory(fl);
|
bios = pflash_cfi01_get_memory(fl);
|
||||||
|
@ -25,7 +25,6 @@
|
|||||||
#include "hw/timer/mc146818rtc.h"
|
#include "hw/timer/mc146818rtc.h"
|
||||||
#include "hw/timer/i8254.h"
|
#include "hw/timer/i8254.h"
|
||||||
#include "sysemu/block-backend.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "sysemu/blockdev.h"
|
|
||||||
#include "exec/address-spaces.h"
|
#include "exec/address-spaces.h"
|
||||||
#include "sysemu/qtest.h"
|
#include "sysemu/qtest.h"
|
||||||
|
|
||||||
@ -242,7 +241,7 @@ void mips_r4k_init(MachineState *machine)
|
|||||||
} else if ((dinfo = drive_get(IF_PFLASH, 0, 0)) != NULL) {
|
} else if ((dinfo = drive_get(IF_PFLASH, 0, 0)) != NULL) {
|
||||||
uint32_t mips_rom = 0x00400000;
|
uint32_t mips_rom = 0x00400000;
|
||||||
if (!pflash_cfi01_register(0x1fc00000, NULL, "mips_r4k.bios", mips_rom,
|
if (!pflash_cfi01_register(0x1fc00000, NULL, "mips_r4k.bios", mips_rom,
|
||||||
blk_bs(blk_by_legacy_dinfo(dinfo)),
|
blk_by_legacy_dinfo(dinfo),
|
||||||
sector_len, mips_rom / sector_len,
|
sector_len, mips_rom / sector_len,
|
||||||
4, 0, 0, 0, 0, be)) {
|
4, 0, 0, 0, 0, be)) {
|
||||||
fprintf(stderr, "qemu: Error registering flash memory.\n");
|
fprintf(stderr, "qemu: Error registering flash memory.\n");
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
|
|
||||||
#include <libfdt.h>
|
#include <libfdt.h>
|
||||||
|
|
||||||
|
#include "sysemu/block-backend.h"
|
||||||
#include "sysemu/device_tree.h"
|
#include "sysemu/device_tree.h"
|
||||||
#include "hw/sysbus.h"
|
#include "hw/sysbus.h"
|
||||||
#include "hw/ppc/spapr.h"
|
#include "hw/ppc/spapr.h"
|
||||||
@ -33,7 +34,7 @@ typedef struct sPAPRNVRAM {
|
|||||||
VIOsPAPRDevice sdev;
|
VIOsPAPRDevice sdev;
|
||||||
uint32_t size;
|
uint32_t size;
|
||||||
uint8_t *buf;
|
uint8_t *buf;
|
||||||
BlockDriverState *drive;
|
BlockBackend *blk;
|
||||||
} sPAPRNVRAM;
|
} sPAPRNVRAM;
|
||||||
|
|
||||||
#define TYPE_VIO_SPAPR_NVRAM "spapr-nvram"
|
#define TYPE_VIO_SPAPR_NVRAM "spapr-nvram"
|
||||||
@ -77,8 +78,8 @@ static void rtas_nvram_fetch(PowerPCCPU *cpu, sPAPREnvironment *spapr,
|
|||||||
}
|
}
|
||||||
|
|
||||||
membuf = cpu_physical_memory_map(buffer, &len, 1);
|
membuf = cpu_physical_memory_map(buffer, &len, 1);
|
||||||
if (nvram->drive) {
|
if (nvram->blk) {
|
||||||
alen = bdrv_pread(nvram->drive, offset, membuf, len);
|
alen = blk_pread(nvram->blk, offset, membuf, len);
|
||||||
} else {
|
} else {
|
||||||
assert(nvram->buf);
|
assert(nvram->buf);
|
||||||
|
|
||||||
@ -122,8 +123,8 @@ static void rtas_nvram_store(PowerPCCPU *cpu, sPAPREnvironment *spapr,
|
|||||||
}
|
}
|
||||||
|
|
||||||
membuf = cpu_physical_memory_map(buffer, &len, 0);
|
membuf = cpu_physical_memory_map(buffer, &len, 0);
|
||||||
if (nvram->drive) {
|
if (nvram->blk) {
|
||||||
alen = bdrv_pwrite(nvram->drive, offset, membuf, len);
|
alen = blk_pwrite(nvram->blk, offset, membuf, len);
|
||||||
} else {
|
} else {
|
||||||
assert(nvram->buf);
|
assert(nvram->buf);
|
||||||
|
|
||||||
@ -140,8 +141,8 @@ static int spapr_nvram_init(VIOsPAPRDevice *dev)
|
|||||||
{
|
{
|
||||||
sPAPRNVRAM *nvram = VIO_SPAPR_NVRAM(dev);
|
sPAPRNVRAM *nvram = VIO_SPAPR_NVRAM(dev);
|
||||||
|
|
||||||
if (nvram->drive) {
|
if (nvram->blk) {
|
||||||
nvram->size = bdrv_getlength(nvram->drive);
|
nvram->size = blk_getlength(nvram->blk);
|
||||||
} else {
|
} else {
|
||||||
nvram->size = DEFAULT_NVRAM_SIZE;
|
nvram->size = DEFAULT_NVRAM_SIZE;
|
||||||
nvram->buf = g_malloc0(nvram->size);
|
nvram->buf = g_malloc0(nvram->size);
|
||||||
@ -168,7 +169,7 @@ static int spapr_nvram_devnode(VIOsPAPRDevice *dev, void *fdt, int node_off)
|
|||||||
|
|
||||||
static Property spapr_nvram_properties[] = {
|
static Property spapr_nvram_properties[] = {
|
||||||
DEFINE_SPAPR_PROPERTIES(sPAPRNVRAM, sdev),
|
DEFINE_SPAPR_PROPERTIES(sPAPRNVRAM, sdev),
|
||||||
DEFINE_PROP_DRIVE("drive", sPAPRNVRAM, drive),
|
DEFINE_PROP_DRIVE("drive", sPAPRNVRAM, blk),
|
||||||
DEFINE_PROP_END_OF_LIST(),
|
DEFINE_PROP_END_OF_LIST(),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -34,7 +34,6 @@
|
|||||||
#include "hw/virtio/virtio-blk.h"
|
#include "hw/virtio/virtio-blk.h"
|
||||||
#include "qemu/config-file.h"
|
#include "qemu/config-file.h"
|
||||||
#include "sysemu/block-backend.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "sysemu/blockdev.h"
|
|
||||||
#include "qapi/error.h"
|
#include "qapi/error.h"
|
||||||
|
|
||||||
static int pci_read_devaddr(Monitor *mon, const char *addr,
|
static int pci_read_devaddr(Monitor *mon, const char *addr,
|
||||||
@ -129,7 +128,7 @@ static int scsi_hot_add(Monitor *mon, DeviceState *adapter,
|
|||||||
dinfo->unit = qemu_opt_get_number(dinfo->opts, "unit", -1);
|
dinfo->unit = qemu_opt_get_number(dinfo->opts, "unit", -1);
|
||||||
dinfo->bus = scsibus->busnr;
|
dinfo->bus = scsibus->busnr;
|
||||||
scsidev = scsi_bus_legacy_add_drive(scsibus,
|
scsidev = scsi_bus_legacy_add_drive(scsibus,
|
||||||
blk_bs(blk_by_legacy_dinfo(dinfo)),
|
blk_by_legacy_dinfo(dinfo),
|
||||||
dinfo->unit, false, -1, NULL,
|
dinfo->unit, false, -1, NULL,
|
||||||
&local_err);
|
&local_err);
|
||||||
if (!scsidev) {
|
if (!scsidev) {
|
||||||
@ -254,7 +253,7 @@ static PCIDevice *qemu_pci_hot_add_storage(Monitor *mon,
|
|||||||
}
|
}
|
||||||
dev = pci_create(bus, devfn, "virtio-blk-pci");
|
dev = pci_create(bus, devfn, "virtio-blk-pci");
|
||||||
if (qdev_prop_set_drive(&dev->qdev, "drive",
|
if (qdev_prop_set_drive(&dev->qdev, "drive",
|
||||||
blk_bs(blk_by_legacy_dinfo(dinfo))) < 0) {
|
blk_by_legacy_dinfo(dinfo)) < 0) {
|
||||||
object_unparent(OBJECT(dev));
|
object_unparent(OBJECT(dev));
|
||||||
dev = NULL;
|
dev = NULL;
|
||||||
break;
|
break;
|
||||||
|
@ -65,7 +65,7 @@
|
|||||||
#include "sysemu/kvm.h"
|
#include "sysemu/kvm.h"
|
||||||
#include "kvm_ppc.h"
|
#include "kvm_ppc.h"
|
||||||
#include "hw/usb.h"
|
#include "hw/usb.h"
|
||||||
#include "sysemu/blockdev.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "exec/address-spaces.h"
|
#include "exec/address-spaces.h"
|
||||||
#include "hw/sysbus.h"
|
#include "hw/sysbus.h"
|
||||||
|
|
||||||
|
@ -40,7 +40,7 @@
|
|||||||
#include "elf.h"
|
#include "elf.h"
|
||||||
#include "sysemu/kvm.h"
|
#include "sysemu/kvm.h"
|
||||||
#include "kvm_ppc.h"
|
#include "kvm_ppc.h"
|
||||||
#include "sysemu/blockdev.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "exec/address-spaces.h"
|
#include "exec/address-spaces.h"
|
||||||
|
|
||||||
#define MAX_IDE_BUS 2
|
#define MAX_IDE_BUS 2
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
#include "hw/block/flash.h"
|
#include "hw/block/flash.h"
|
||||||
#include "sysemu/sysemu.h"
|
#include "sysemu/sysemu.h"
|
||||||
#include "sysemu/qtest.h"
|
#include "sysemu/qtest.h"
|
||||||
#include "block/block.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "hw/boards.h"
|
#include "hw/boards.h"
|
||||||
#include "qemu/log.h"
|
#include "qemu/log.h"
|
||||||
#include "qemu/error-report.h"
|
#include "qemu/error-report.h"
|
||||||
@ -226,19 +226,19 @@ static void ref405ep_init(MachineState *machine)
|
|||||||
#ifdef USE_FLASH_BIOS
|
#ifdef USE_FLASH_BIOS
|
||||||
dinfo = drive_get(IF_PFLASH, 0, fl_idx);
|
dinfo = drive_get(IF_PFLASH, 0, fl_idx);
|
||||||
if (dinfo) {
|
if (dinfo) {
|
||||||
BlockDriverState *bs = blk_bs(blk_by_legacy_dinfo(dinfo));
|
BlockBackend *blk = blk_by_legacy_dinfo(dinfo);
|
||||||
|
|
||||||
bios_size = bdrv_getlength(bs);
|
bios_size = blk_getlength(blk);
|
||||||
fl_sectors = (bios_size + 65535) >> 16;
|
fl_sectors = (bios_size + 65535) >> 16;
|
||||||
#ifdef DEBUG_BOARD_INIT
|
#ifdef DEBUG_BOARD_INIT
|
||||||
printf("Register parallel flash %d size %lx"
|
printf("Register parallel flash %d size %lx"
|
||||||
" at addr %lx '%s' %d\n",
|
" at addr %lx '%s' %d\n",
|
||||||
fl_idx, bios_size, -bios_size,
|
fl_idx, bios_size, -bios_size,
|
||||||
bdrv_get_device_name(bs), fl_sectors);
|
blk_name(blk), fl_sectors);
|
||||||
#endif
|
#endif
|
||||||
pflash_cfi02_register((uint32_t)(-bios_size),
|
pflash_cfi02_register((uint32_t)(-bios_size),
|
||||||
NULL, "ef405ep.bios", bios_size,
|
NULL, "ef405ep.bios", bios_size,
|
||||||
bs, 65536, fl_sectors, 1,
|
blk, 65536, fl_sectors, 1,
|
||||||
2, 0x0001, 0x22DA, 0x0000, 0x0000, 0x555, 0x2AA,
|
2, 0x0001, 0x22DA, 0x0000, 0x0000, 0x555, 0x2AA,
|
||||||
1);
|
1);
|
||||||
fl_idx++;
|
fl_idx++;
|
||||||
@ -551,9 +551,9 @@ static void taihu_405ep_init(MachineState *machine)
|
|||||||
#if defined(USE_FLASH_BIOS)
|
#if defined(USE_FLASH_BIOS)
|
||||||
dinfo = drive_get(IF_PFLASH, 0, fl_idx);
|
dinfo = drive_get(IF_PFLASH, 0, fl_idx);
|
||||||
if (dinfo) {
|
if (dinfo) {
|
||||||
BlockDriverState *bs = blk_bs(blk_by_legacy_dinfo(dinfo));
|
BlockBackend *blk = blk_by_legacy_dinfo(dinfo);
|
||||||
|
|
||||||
bios_size = bdrv_getlength(bs);
|
bios_size = blk_getlength(blk);
|
||||||
/* XXX: should check that size is 2MB */
|
/* XXX: should check that size is 2MB */
|
||||||
// bios_size = 2 * 1024 * 1024;
|
// bios_size = 2 * 1024 * 1024;
|
||||||
fl_sectors = (bios_size + 65535) >> 16;
|
fl_sectors = (bios_size + 65535) >> 16;
|
||||||
@ -561,11 +561,11 @@ static void taihu_405ep_init(MachineState *machine)
|
|||||||
printf("Register parallel flash %d size %lx"
|
printf("Register parallel flash %d size %lx"
|
||||||
" at addr %lx '%s' %d\n",
|
" at addr %lx '%s' %d\n",
|
||||||
fl_idx, bios_size, -bios_size,
|
fl_idx, bios_size, -bios_size,
|
||||||
bdrv_get_device_name(bs), fl_sectors);
|
blk_name(blk), fl_sectors);
|
||||||
#endif
|
#endif
|
||||||
pflash_cfi02_register((uint32_t)(-bios_size),
|
pflash_cfi02_register((uint32_t)(-bios_size),
|
||||||
NULL, "taihu_405ep.bios", bios_size,
|
NULL, "taihu_405ep.bios", bios_size,
|
||||||
bs, 65536, fl_sectors, 1,
|
blk, 65536, fl_sectors, 1,
|
||||||
4, 0x0001, 0x22DA, 0x0000, 0x0000, 0x555, 0x2AA,
|
4, 0x0001, 0x22DA, 0x0000, 0x0000, 0x555, 0x2AA,
|
||||||
1);
|
1);
|
||||||
fl_idx++;
|
fl_idx++;
|
||||||
@ -600,9 +600,9 @@ static void taihu_405ep_init(MachineState *machine)
|
|||||||
/* Register Linux flash */
|
/* Register Linux flash */
|
||||||
dinfo = drive_get(IF_PFLASH, 0, fl_idx);
|
dinfo = drive_get(IF_PFLASH, 0, fl_idx);
|
||||||
if (dinfo) {
|
if (dinfo) {
|
||||||
BlockDriverState *bs = blk_bs(blk_by_legacy_dinfo(dinfo));
|
BlockBackend *blk = blk_by_legacy_dinfo(dinfo);
|
||||||
|
|
||||||
bios_size = bdrv_getlength(bs);
|
bios_size = blk_getlength(blk);
|
||||||
/* XXX: should check that size is 32MB */
|
/* XXX: should check that size is 32MB */
|
||||||
bios_size = 32 * 1024 * 1024;
|
bios_size = 32 * 1024 * 1024;
|
||||||
fl_sectors = (bios_size + 65535) >> 16;
|
fl_sectors = (bios_size + 65535) >> 16;
|
||||||
@ -610,10 +610,10 @@ static void taihu_405ep_init(MachineState *machine)
|
|||||||
printf("Register parallel flash %d size %lx"
|
printf("Register parallel flash %d size %lx"
|
||||||
" at addr " TARGET_FMT_lx " '%s'\n",
|
" at addr " TARGET_FMT_lx " '%s'\n",
|
||||||
fl_idx, bios_size, (target_ulong)0xfc000000,
|
fl_idx, bios_size, (target_ulong)0xfc000000,
|
||||||
bdrv_get_device_name(bs));
|
blk_name(blk));
|
||||||
#endif
|
#endif
|
||||||
pflash_cfi02_register(0xfc000000, NULL, "taihu_405ep.flash", bios_size,
|
pflash_cfi02_register(0xfc000000, NULL, "taihu_405ep.flash", bios_size,
|
||||||
bs, 65536, fl_sectors, 1,
|
blk, 65536, fl_sectors, 1,
|
||||||
4, 0x0001, 0x22DA, 0x0000, 0x0000, 0x555, 0x2AA,
|
4, 0x0001, 0x22DA, 0x0000, 0x0000, 0x555, 0x2AA,
|
||||||
1);
|
1);
|
||||||
fl_idx++;
|
fl_idx++;
|
||||||
|
@ -38,7 +38,7 @@
|
|||||||
#include "hw/loader.h"
|
#include "hw/loader.h"
|
||||||
#include "hw/timer/mc146818rtc.h"
|
#include "hw/timer/mc146818rtc.h"
|
||||||
#include "hw/isa/pc87312.h"
|
#include "hw/isa/pc87312.h"
|
||||||
#include "sysemu/blockdev.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "sysemu/arch_init.h"
|
#include "sysemu/arch_init.h"
|
||||||
#include "sysemu/qtest.h"
|
#include "sysemu/qtest.h"
|
||||||
#include "exec/address-spaces.h"
|
#include "exec/address-spaces.h"
|
||||||
|
@ -30,7 +30,6 @@
|
|||||||
#include "elf.h"
|
#include "elf.h"
|
||||||
#include "net/net.h"
|
#include "net/net.h"
|
||||||
#include "sysemu/block-backend.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "sysemu/blockdev.h"
|
|
||||||
#include "sysemu/cpus.h"
|
#include "sysemu/cpus.h"
|
||||||
#include "sysemu/kvm.h"
|
#include "sysemu/kvm.h"
|
||||||
#include "kvm_ppc.h"
|
#include "kvm_ppc.h"
|
||||||
@ -926,8 +925,7 @@ static void spapr_create_nvram(sPAPREnvironment *spapr)
|
|||||||
DriveInfo *dinfo = drive_get(IF_PFLASH, 0, 0);
|
DriveInfo *dinfo = drive_get(IF_PFLASH, 0, 0);
|
||||||
|
|
||||||
if (dinfo) {
|
if (dinfo) {
|
||||||
qdev_prop_set_drive_nofail(dev, "drive",
|
qdev_prop_set_drive_nofail(dev, "drive", blk_by_legacy_dinfo(dinfo));
|
||||||
blk_bs(blk_by_legacy_dinfo(dinfo)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
qdev_init_nofail(dev);
|
qdev_init_nofail(dev);
|
||||||
|
@ -40,7 +40,6 @@
|
|||||||
#include "ppc405.h"
|
#include "ppc405.h"
|
||||||
|
|
||||||
#include "sysemu/block-backend.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "sysemu/blockdev.h"
|
|
||||||
#include "qapi/qmp/qerror.h"
|
#include "qapi/qmp/qerror.h"
|
||||||
|
|
||||||
#define EPAPR_MAGIC (0x45504150)
|
#define EPAPR_MAGIC (0x45504150)
|
||||||
@ -228,7 +227,7 @@ static void virtex_init(MachineState *machine)
|
|||||||
|
|
||||||
dinfo = drive_get(IF_PFLASH, 0, 0);
|
dinfo = drive_get(IF_PFLASH, 0, 0);
|
||||||
pflash_cfi01_register(PFLASH_BASEADDR, NULL, "virtex.flash", FLASH_SIZE,
|
pflash_cfi01_register(PFLASH_BASEADDR, NULL, "virtex.flash", FLASH_SIZE,
|
||||||
dinfo ? blk_bs(blk_by_legacy_dinfo(dinfo)) : NULL,
|
dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
|
||||||
(64 * 1024), FLASH_SIZE >> 16,
|
(64 * 1024), FLASH_SIZE >> 16,
|
||||||
1, 0x89, 0x18, 0x0000, 0x0, 1);
|
1, 0x89, 0x18, 0x0000, 0x0, 1);
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "hw/hw.h"
|
#include "hw/hw.h"
|
||||||
#include "block/block.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "sysemu/sysemu.h"
|
#include "sysemu/sysemu.h"
|
||||||
#include "hw/boards.h"
|
#include "hw/boards.h"
|
||||||
#include "monitor/monitor.h"
|
#include "monitor/monitor.h"
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "hw/hw.h"
|
#include "hw/hw.h"
|
||||||
#include "block/block.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "sysemu/blockdev.h"
|
#include "sysemu/blockdev.h"
|
||||||
#include "sysemu/sysemu.h"
|
#include "sysemu/sysemu.h"
|
||||||
#include "net/net.h"
|
#include "net/net.h"
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "hw/hw.h"
|
#include "hw/hw.h"
|
||||||
#include "block/block.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "sysemu/blockdev.h"
|
#include "sysemu/blockdev.h"
|
||||||
#include "sysemu/sysemu.h"
|
#include "sysemu/sysemu.h"
|
||||||
#include "net/net.h"
|
#include "net/net.h"
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include "hw/hw.h"
|
#include "hw/hw.h"
|
||||||
#include "hw/pci/pci.h"
|
#include "hw/pci/pci.h"
|
||||||
#include "sysemu/dma.h"
|
#include "sysemu/dma.h"
|
||||||
|
#include "sysemu/block-backend.h"
|
||||||
#include "hw/pci/msi.h"
|
#include "hw/pci/msi.h"
|
||||||
#include "hw/pci/msix.h"
|
#include "hw/pci/msix.h"
|
||||||
#include "qemu/iov.h"
|
#include "qemu/iov.h"
|
||||||
@ -976,7 +977,6 @@ static int megasas_pd_get_info_submit(SCSIDevice *sdev, int lun,
|
|||||||
{
|
{
|
||||||
struct mfi_pd_info *info = cmd->iov_buf;
|
struct mfi_pd_info *info = cmd->iov_buf;
|
||||||
size_t dcmd_size = sizeof(struct mfi_pd_info);
|
size_t dcmd_size = sizeof(struct mfi_pd_info);
|
||||||
BlockConf *conf = &sdev->conf;
|
|
||||||
uint64_t pd_size;
|
uint64_t pd_size;
|
||||||
uint16_t sdev_id = ((sdev->id & 0xFF) >> 8) | (lun & 0xFF);
|
uint16_t sdev_id = ((sdev->id & 0xFF) >> 8) | (lun & 0xFF);
|
||||||
uint8_t cmdbuf[6];
|
uint8_t cmdbuf[6];
|
||||||
@ -1037,7 +1037,7 @@ static int megasas_pd_get_info_submit(SCSIDevice *sdev, int lun,
|
|||||||
info->ref.v.device_id = cpu_to_le16(sdev_id);
|
info->ref.v.device_id = cpu_to_le16(sdev_id);
|
||||||
info->state.ddf.pd_type = cpu_to_le16(MFI_PD_DDF_TYPE_IN_VD|
|
info->state.ddf.pd_type = cpu_to_le16(MFI_PD_DDF_TYPE_IN_VD|
|
||||||
MFI_PD_DDF_TYPE_INTF_SAS);
|
MFI_PD_DDF_TYPE_INTF_SAS);
|
||||||
bdrv_get_geometry(conf->bs, &pd_size);
|
blk_get_geometry(sdev->conf.blk, &pd_size);
|
||||||
info->raw_size = cpu_to_le64(pd_size);
|
info->raw_size = cpu_to_le64(pd_size);
|
||||||
info->non_coerced_size = cpu_to_le64(pd_size);
|
info->non_coerced_size = cpu_to_le64(pd_size);
|
||||||
info->coerced_size = cpu_to_le64(pd_size);
|
info->coerced_size = cpu_to_le64(pd_size);
|
||||||
@ -1100,13 +1100,12 @@ static int megasas_dcmd_ld_get_list(MegasasState *s, MegasasCmd *cmd)
|
|||||||
}
|
}
|
||||||
QTAILQ_FOREACH(kid, &s->bus.qbus.children, sibling) {
|
QTAILQ_FOREACH(kid, &s->bus.qbus.children, sibling) {
|
||||||
SCSIDevice *sdev = DO_UPCAST(SCSIDevice, qdev, kid->child);
|
SCSIDevice *sdev = DO_UPCAST(SCSIDevice, qdev, kid->child);
|
||||||
BlockConf *conf = &sdev->conf;
|
|
||||||
|
|
||||||
if (num_ld_disks >= max_ld_disks) {
|
if (num_ld_disks >= max_ld_disks) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* Logical device size is in blocks */
|
/* Logical device size is in blocks */
|
||||||
bdrv_get_geometry(conf->bs, &ld_size);
|
blk_get_geometry(sdev->conf.blk, &ld_size);
|
||||||
info.ld_list[num_ld_disks].ld.v.target_id = sdev->id;
|
info.ld_list[num_ld_disks].ld.v.target_id = sdev->id;
|
||||||
info.ld_list[num_ld_disks].ld.v.lun_id = sdev->lun;
|
info.ld_list[num_ld_disks].ld.v.lun_id = sdev->lun;
|
||||||
info.ld_list[num_ld_disks].state = MFI_LD_STATE_OPTIMAL;
|
info.ld_list[num_ld_disks].state = MFI_LD_STATE_OPTIMAL;
|
||||||
@ -1144,7 +1143,6 @@ static int megasas_ld_get_info_submit(SCSIDevice *sdev, int lun,
|
|||||||
uint8_t cdb[6];
|
uint8_t cdb[6];
|
||||||
SCSIRequest *req;
|
SCSIRequest *req;
|
||||||
ssize_t len, resid;
|
ssize_t len, resid;
|
||||||
BlockConf *conf = &sdev->conf;
|
|
||||||
uint16_t sdev_id = ((sdev->id & 0xFF) >> 8) | (lun & 0xFF);
|
uint16_t sdev_id = ((sdev->id & 0xFF) >> 8) | (lun & 0xFF);
|
||||||
uint64_t ld_size;
|
uint64_t ld_size;
|
||||||
|
|
||||||
@ -1177,7 +1175,7 @@ static int megasas_ld_get_info_submit(SCSIDevice *sdev, int lun,
|
|||||||
info->ld_config.params.num_drives = 1;
|
info->ld_config.params.num_drives = 1;
|
||||||
info->ld_config.params.is_consistent = 1;
|
info->ld_config.params.is_consistent = 1;
|
||||||
/* Logical device size is in blocks */
|
/* Logical device size is in blocks */
|
||||||
bdrv_get_geometry(conf->bs, &ld_size);
|
blk_get_geometry(sdev->conf.blk, &ld_size);
|
||||||
info->size = cpu_to_le64(ld_size);
|
info->size = cpu_to_le64(ld_size);
|
||||||
memset(info->ld_config.span, 0, sizeof(info->ld_config.span));
|
memset(info->ld_config.span, 0, sizeof(info->ld_config.span));
|
||||||
info->ld_config.span[0].start_block = 0;
|
info->ld_config.span[0].start_block = 0;
|
||||||
@ -1261,7 +1259,6 @@ static int megasas_dcmd_cfg_read(MegasasState *s, MegasasCmd *cmd)
|
|||||||
|
|
||||||
QTAILQ_FOREACH(kid, &s->bus.qbus.children, sibling) {
|
QTAILQ_FOREACH(kid, &s->bus.qbus.children, sibling) {
|
||||||
SCSIDevice *sdev = DO_UPCAST(SCSIDevice, qdev, kid->child);
|
SCSIDevice *sdev = DO_UPCAST(SCSIDevice, qdev, kid->child);
|
||||||
BlockConf *conf = &sdev->conf;
|
|
||||||
uint16_t sdev_id = ((sdev->id & 0xFF) >> 8) | (sdev->lun & 0xFF);
|
uint16_t sdev_id = ((sdev->id & 0xFF) >> 8) | (sdev->lun & 0xFF);
|
||||||
struct mfi_array *array;
|
struct mfi_array *array;
|
||||||
struct mfi_ld_config *ld;
|
struct mfi_ld_config *ld;
|
||||||
@ -1269,7 +1266,7 @@ static int megasas_dcmd_cfg_read(MegasasState *s, MegasasCmd *cmd)
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
array = (struct mfi_array *)(data + array_offset);
|
array = (struct mfi_array *)(data + array_offset);
|
||||||
bdrv_get_geometry(conf->bs, &pd_size);
|
blk_get_geometry(sdev->conf.blk, &pd_size);
|
||||||
array->size = cpu_to_le64(pd_size);
|
array->size = cpu_to_le64(pd_size);
|
||||||
array->num_drives = 1;
|
array->num_drives = 1;
|
||||||
array->array_ref = cpu_to_le16(sdev_id);
|
array->array_ref = cpu_to_le16(sdev_id);
|
||||||
@ -1340,7 +1337,7 @@ static int megasas_dcmd_get_properties(MegasasState *s, MegasasCmd *cmd)
|
|||||||
|
|
||||||
static int megasas_cache_flush(MegasasState *s, MegasasCmd *cmd)
|
static int megasas_cache_flush(MegasasState *s, MegasasCmd *cmd)
|
||||||
{
|
{
|
||||||
bdrv_drain_all();
|
blk_drain_all();
|
||||||
return MFI_STAT_OK;
|
return MFI_STAT_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -222,7 +222,7 @@ static void scsi_qdev_unrealize(DeviceState *qdev, Error **errp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* handle legacy '-drive if=scsi,...' cmd line args */
|
/* handle legacy '-drive if=scsi,...' cmd line args */
|
||||||
SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, BlockDriverState *bdrv,
|
SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, BlockBackend *blk,
|
||||||
int unit, bool removable, int bootindex,
|
int unit, bool removable, int bootindex,
|
||||||
const char *serial, Error **errp)
|
const char *serial, Error **errp)
|
||||||
{
|
{
|
||||||
@ -230,7 +230,7 @@ SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, BlockDriverState *bdrv,
|
|||||||
DeviceState *dev;
|
DeviceState *dev;
|
||||||
Error *err = NULL;
|
Error *err = NULL;
|
||||||
|
|
||||||
driver = bdrv_is_sg(bdrv) ? "scsi-generic" : "scsi-disk";
|
driver = blk_is_sg(blk) ? "scsi-generic" : "scsi-disk";
|
||||||
dev = qdev_create(&bus->qbus, driver);
|
dev = qdev_create(&bus->qbus, driver);
|
||||||
qdev_prop_set_uint32(dev, "scsi-id", unit);
|
qdev_prop_set_uint32(dev, "scsi-id", unit);
|
||||||
if (bootindex >= 0) {
|
if (bootindex >= 0) {
|
||||||
@ -243,7 +243,7 @@ SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, BlockDriverState *bdrv,
|
|||||||
if (serial && object_property_find(OBJECT(dev), "serial", NULL)) {
|
if (serial && object_property_find(OBJECT(dev), "serial", NULL)) {
|
||||||
qdev_prop_set_string(dev, "serial", serial);
|
qdev_prop_set_string(dev, "serial", serial);
|
||||||
}
|
}
|
||||||
if (qdev_prop_set_drive(dev, "drive", bdrv) < 0) {
|
if (qdev_prop_set_drive(dev, "drive", blk) < 0) {
|
||||||
error_setg(errp, "Setting drive property failed");
|
error_setg(errp, "Setting drive property failed");
|
||||||
object_unparent(OBJECT(dev));
|
object_unparent(OBJECT(dev));
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -271,7 +271,7 @@ void scsi_bus_legacy_handle_cmdline(SCSIBus *bus, Error **errp)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
qemu_opts_loc_restore(dinfo->opts);
|
qemu_opts_loc_restore(dinfo->opts);
|
||||||
scsi_bus_legacy_add_drive(bus, blk_bs(blk_by_legacy_dinfo(dinfo)),
|
scsi_bus_legacy_add_drive(bus, blk_by_legacy_dinfo(dinfo),
|
||||||
unit, false, -1, NULL, &err);
|
unit, false, -1, NULL, &err);
|
||||||
if (err != NULL) {
|
if (err != NULL) {
|
||||||
error_report("%s", error_get_pretty(err));
|
error_report("%s", error_get_pretty(err));
|
||||||
@ -1754,7 +1754,7 @@ void scsi_req_cancel_async(SCSIRequest *req, Notifier *notifier)
|
|||||||
scsi_req_dequeue(req);
|
scsi_req_dequeue(req);
|
||||||
req->io_canceled = true;
|
req->io_canceled = true;
|
||||||
if (req->aiocb) {
|
if (req->aiocb) {
|
||||||
bdrv_aio_cancel_async(req->aiocb);
|
blk_aio_cancel_async(req->aiocb);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1768,7 +1768,7 @@ void scsi_req_cancel(SCSIRequest *req)
|
|||||||
scsi_req_dequeue(req);
|
scsi_req_dequeue(req);
|
||||||
req->io_canceled = true;
|
req->io_canceled = true;
|
||||||
if (req->aiocb) {
|
if (req->aiocb) {
|
||||||
bdrv_aio_cancel(req->aiocb);
|
blk_aio_cancel(req->aiocb);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,6 +33,7 @@ do { printf("scsi-disk: " fmt , ## __VA_ARGS__); } while (0)
|
|||||||
#include "hw/scsi/scsi.h"
|
#include "hw/scsi/scsi.h"
|
||||||
#include "block/scsi.h"
|
#include "block/scsi.h"
|
||||||
#include "sysemu/sysemu.h"
|
#include "sysemu/sysemu.h"
|
||||||
|
#include "sysemu/block-backend.h"
|
||||||
#include "sysemu/blockdev.h"
|
#include "sysemu/blockdev.h"
|
||||||
#include "hw/block/block.h"
|
#include "hw/block/block.h"
|
||||||
#include "sysemu/dma.h"
|
#include "sysemu/dma.h"
|
||||||
@ -111,7 +112,7 @@ static uint32_t scsi_init_iovec(SCSIDiskReq *r, size_t size)
|
|||||||
|
|
||||||
if (!r->iov.iov_base) {
|
if (!r->iov.iov_base) {
|
||||||
r->buflen = size;
|
r->buflen = size;
|
||||||
r->iov.iov_base = qemu_blockalign(s->qdev.conf.bs, r->buflen);
|
r->iov.iov_base = blk_blockalign(s->qdev.conf.blk, r->buflen);
|
||||||
}
|
}
|
||||||
r->iov.iov_len = MIN(r->sector_count * 512, r->buflen);
|
r->iov.iov_len = MIN(r->sector_count * 512, r->buflen);
|
||||||
qemu_iovec_init_external(&r->qiov, &r->iov, 1);
|
qemu_iovec_init_external(&r->qiov, &r->iov, 1);
|
||||||
@ -166,7 +167,7 @@ static void scsi_aio_complete(void *opaque, int ret)
|
|||||||
|
|
||||||
assert(r->req.aiocb != NULL);
|
assert(r->req.aiocb != NULL);
|
||||||
r->req.aiocb = NULL;
|
r->req.aiocb = NULL;
|
||||||
block_acct_done(bdrv_get_stats(s->qdev.conf.bs), &r->acct);
|
block_acct_done(blk_get_stats(s->qdev.conf.blk), &r->acct);
|
||||||
if (r->req.io_canceled) {
|
if (r->req.io_canceled) {
|
||||||
scsi_req_cancel_complete(&r->req);
|
scsi_req_cancel_complete(&r->req);
|
||||||
goto done;
|
goto done;
|
||||||
@ -220,9 +221,9 @@ static void scsi_write_do_fua(SCSIDiskReq *r)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (scsi_is_cmd_fua(&r->req.cmd)) {
|
if (scsi_is_cmd_fua(&r->req.cmd)) {
|
||||||
block_acct_start(bdrv_get_stats(s->qdev.conf.bs), &r->acct, 0,
|
block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct, 0,
|
||||||
BLOCK_ACCT_FLUSH);
|
BLOCK_ACCT_FLUSH);
|
||||||
r->req.aiocb = bdrv_aio_flush(s->qdev.conf.bs, scsi_aio_complete, r);
|
r->req.aiocb = blk_aio_flush(s->qdev.conf.blk, scsi_aio_complete, r);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -239,7 +240,7 @@ static void scsi_dma_complete_noio(void *opaque, int ret)
|
|||||||
|
|
||||||
if (r->req.aiocb != NULL) {
|
if (r->req.aiocb != NULL) {
|
||||||
r->req.aiocb = NULL;
|
r->req.aiocb = NULL;
|
||||||
block_acct_done(bdrv_get_stats(s->qdev.conf.bs), &r->acct);
|
block_acct_done(blk_get_stats(s->qdev.conf.blk), &r->acct);
|
||||||
}
|
}
|
||||||
if (r->req.io_canceled) {
|
if (r->req.io_canceled) {
|
||||||
scsi_req_cancel_complete(&r->req);
|
scsi_req_cancel_complete(&r->req);
|
||||||
@ -281,7 +282,7 @@ static void scsi_read_complete(void * opaque, int ret)
|
|||||||
|
|
||||||
assert(r->req.aiocb != NULL);
|
assert(r->req.aiocb != NULL);
|
||||||
r->req.aiocb = NULL;
|
r->req.aiocb = NULL;
|
||||||
block_acct_done(bdrv_get_stats(s->qdev.conf.bs), &r->acct);
|
block_acct_done(blk_get_stats(s->qdev.conf.blk), &r->acct);
|
||||||
if (r->req.io_canceled) {
|
if (r->req.io_canceled) {
|
||||||
scsi_req_cancel_complete(&r->req);
|
scsi_req_cancel_complete(&r->req);
|
||||||
goto done;
|
goto done;
|
||||||
@ -313,7 +314,7 @@ static void scsi_do_read(void *opaque, int ret)
|
|||||||
|
|
||||||
if (r->req.aiocb != NULL) {
|
if (r->req.aiocb != NULL) {
|
||||||
r->req.aiocb = NULL;
|
r->req.aiocb = NULL;
|
||||||
block_acct_done(bdrv_get_stats(s->qdev.conf.bs), &r->acct);
|
block_acct_done(blk_get_stats(s->qdev.conf.blk), &r->acct);
|
||||||
}
|
}
|
||||||
if (r->req.io_canceled) {
|
if (r->req.io_canceled) {
|
||||||
scsi_req_cancel_complete(&r->req);
|
scsi_req_cancel_complete(&r->req);
|
||||||
@ -330,16 +331,16 @@ static void scsi_do_read(void *opaque, int ret)
|
|||||||
scsi_req_ref(&r->req);
|
scsi_req_ref(&r->req);
|
||||||
|
|
||||||
if (r->req.sg) {
|
if (r->req.sg) {
|
||||||
dma_acct_start(s->qdev.conf.bs, &r->acct, r->req.sg, BLOCK_ACCT_READ);
|
dma_acct_start(s->qdev.conf.blk, &r->acct, r->req.sg, BLOCK_ACCT_READ);
|
||||||
r->req.resid -= r->req.sg->size;
|
r->req.resid -= r->req.sg->size;
|
||||||
r->req.aiocb = dma_bdrv_read(s->qdev.conf.bs, r->req.sg, r->sector,
|
r->req.aiocb = dma_blk_read(s->qdev.conf.blk, r->req.sg, r->sector,
|
||||||
scsi_dma_complete, r);
|
scsi_dma_complete, r);
|
||||||
} else {
|
} else {
|
||||||
n = scsi_init_iovec(r, SCSI_DMA_BUF_SIZE);
|
n = scsi_init_iovec(r, SCSI_DMA_BUF_SIZE);
|
||||||
block_acct_start(bdrv_get_stats(s->qdev.conf.bs), &r->acct,
|
block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct,
|
||||||
n * BDRV_SECTOR_SIZE, BLOCK_ACCT_READ);
|
n * BDRV_SECTOR_SIZE, BLOCK_ACCT_READ);
|
||||||
r->req.aiocb = bdrv_aio_readv(s->qdev.conf.bs, r->sector, &r->qiov, n,
|
r->req.aiocb = blk_aio_readv(s->qdev.conf.blk, r->sector, &r->qiov, n,
|
||||||
scsi_read_complete, r);
|
scsi_read_complete, r);
|
||||||
}
|
}
|
||||||
|
|
||||||
done:
|
done:
|
||||||
@ -379,9 +380,9 @@ static void scsi_read_data(SCSIRequest *req)
|
|||||||
first = !r->started;
|
first = !r->started;
|
||||||
r->started = true;
|
r->started = true;
|
||||||
if (first && scsi_is_cmd_fua(&r->req.cmd)) {
|
if (first && scsi_is_cmd_fua(&r->req.cmd)) {
|
||||||
block_acct_start(bdrv_get_stats(s->qdev.conf.bs), &r->acct, 0,
|
block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct, 0,
|
||||||
BLOCK_ACCT_FLUSH);
|
BLOCK_ACCT_FLUSH);
|
||||||
r->req.aiocb = bdrv_aio_flush(s->qdev.conf.bs, scsi_do_read, r);
|
r->req.aiocb = blk_aio_flush(s->qdev.conf.blk, scsi_do_read, r);
|
||||||
} else {
|
} else {
|
||||||
scsi_do_read(r, 0);
|
scsi_do_read(r, 0);
|
||||||
}
|
}
|
||||||
@ -398,7 +399,8 @@ static int scsi_handle_rw_error(SCSIDiskReq *r, int error)
|
|||||||
{
|
{
|
||||||
bool is_read = (r->req.cmd.xfer == SCSI_XFER_FROM_DEV);
|
bool is_read = (r->req.cmd.xfer == SCSI_XFER_FROM_DEV);
|
||||||
SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
|
SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
|
||||||
BlockErrorAction action = bdrv_get_error_action(s->qdev.conf.bs, is_read, error);
|
BlockErrorAction action = blk_get_error_action(s->qdev.conf.blk,
|
||||||
|
is_read, error);
|
||||||
|
|
||||||
if (action == BLOCK_ERROR_ACTION_REPORT) {
|
if (action == BLOCK_ERROR_ACTION_REPORT) {
|
||||||
switch (error) {
|
switch (error) {
|
||||||
@ -419,7 +421,7 @@ static int scsi_handle_rw_error(SCSIDiskReq *r, int error)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
bdrv_error_action(s->qdev.conf.bs, action, is_read, error);
|
blk_error_action(s->qdev.conf.blk, action, is_read, error);
|
||||||
if (action == BLOCK_ERROR_ACTION_STOP) {
|
if (action == BLOCK_ERROR_ACTION_STOP) {
|
||||||
scsi_req_retry(&r->req);
|
scsi_req_retry(&r->req);
|
||||||
}
|
}
|
||||||
@ -434,7 +436,7 @@ static void scsi_write_complete(void * opaque, int ret)
|
|||||||
|
|
||||||
if (r->req.aiocb != NULL) {
|
if (r->req.aiocb != NULL) {
|
||||||
r->req.aiocb = NULL;
|
r->req.aiocb = NULL;
|
||||||
block_acct_done(bdrv_get_stats(s->qdev.conf.bs), &r->acct);
|
block_acct_done(blk_get_stats(s->qdev.conf.blk), &r->acct);
|
||||||
}
|
}
|
||||||
if (r->req.io_canceled) {
|
if (r->req.io_canceled) {
|
||||||
scsi_req_cancel_complete(&r->req);
|
scsi_req_cancel_complete(&r->req);
|
||||||
@ -502,16 +504,16 @@ static void scsi_write_data(SCSIRequest *req)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (r->req.sg) {
|
if (r->req.sg) {
|
||||||
dma_acct_start(s->qdev.conf.bs, &r->acct, r->req.sg, BLOCK_ACCT_WRITE);
|
dma_acct_start(s->qdev.conf.blk, &r->acct, r->req.sg, BLOCK_ACCT_WRITE);
|
||||||
r->req.resid -= r->req.sg->size;
|
r->req.resid -= r->req.sg->size;
|
||||||
r->req.aiocb = dma_bdrv_write(s->qdev.conf.bs, r->req.sg, r->sector,
|
r->req.aiocb = dma_blk_write(s->qdev.conf.blk, r->req.sg, r->sector,
|
||||||
scsi_dma_complete, r);
|
scsi_dma_complete, r);
|
||||||
} else {
|
} else {
|
||||||
n = r->qiov.size / 512;
|
n = r->qiov.size / 512;
|
||||||
block_acct_start(bdrv_get_stats(s->qdev.conf.bs), &r->acct,
|
block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct,
|
||||||
n * BDRV_SECTOR_SIZE, BLOCK_ACCT_WRITE);
|
n * BDRV_SECTOR_SIZE, BLOCK_ACCT_WRITE);
|
||||||
r->req.aiocb = bdrv_aio_writev(s->qdev.conf.bs, r->sector, &r->qiov, n,
|
r->req.aiocb = blk_aio_writev(s->qdev.conf.blk, r->sector, &r->qiov, n,
|
||||||
scsi_write_complete, r);
|
scsi_write_complete, r);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -578,7 +580,7 @@ static int scsi_disk_emulate_inquiry(SCSIRequest *req, uint8_t *outbuf)
|
|||||||
|
|
||||||
case 0x83: /* Device identification page, mandatory */
|
case 0x83: /* Device identification page, mandatory */
|
||||||
{
|
{
|
||||||
const char *str = s->serial ?: bdrv_get_device_name(s->qdev.conf.bs);
|
const char *str = s->serial ?: blk_name(s->qdev.conf.blk);
|
||||||
int max_len = s->serial ? 20 : 255 - 8;
|
int max_len = s->serial ? 20 : 255 - 8;
|
||||||
int id_len = strlen(str);
|
int id_len = strlen(str);
|
||||||
|
|
||||||
@ -739,10 +741,10 @@ static inline bool media_is_dvd(SCSIDiskState *s)
|
|||||||
if (s->qdev.type != TYPE_ROM) {
|
if (s->qdev.type != TYPE_ROM) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!bdrv_is_inserted(s->qdev.conf.bs)) {
|
if (!blk_is_inserted(s->qdev.conf.blk)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
bdrv_get_geometry(s->qdev.conf.bs, &nb_sectors);
|
blk_get_geometry(s->qdev.conf.blk, &nb_sectors);
|
||||||
return nb_sectors > CD_MAX_SECTORS;
|
return nb_sectors > CD_MAX_SECTORS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -752,10 +754,10 @@ static inline bool media_is_cd(SCSIDiskState *s)
|
|||||||
if (s->qdev.type != TYPE_ROM) {
|
if (s->qdev.type != TYPE_ROM) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!bdrv_is_inserted(s->qdev.conf.bs)) {
|
if (!blk_is_inserted(s->qdev.conf.blk)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
bdrv_get_geometry(s->qdev.conf.bs, &nb_sectors);
|
blk_get_geometry(s->qdev.conf.blk, &nb_sectors);
|
||||||
return nb_sectors <= CD_MAX_SECTORS;
|
return nb_sectors <= CD_MAX_SECTORS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -816,7 +818,7 @@ static int scsi_read_dvd_structure(SCSIDiskState *s, SCSIDiskReq *r,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (format != 0xff) {
|
if (format != 0xff) {
|
||||||
if (s->tray_open || !bdrv_is_inserted(s->qdev.conf.bs)) {
|
if (s->tray_open || !blk_is_inserted(s->qdev.conf.blk)) {
|
||||||
scsi_check_condition(r, SENSE_CODE(NO_MEDIUM));
|
scsi_check_condition(r, SENSE_CODE(NO_MEDIUM));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -838,7 +840,7 @@ static int scsi_read_dvd_structure(SCSIDiskState *s, SCSIDiskReq *r,
|
|||||||
if (layer != 0) {
|
if (layer != 0) {
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
bdrv_get_geometry(s->qdev.conf.bs, &nb_sectors);
|
blk_get_geometry(s->qdev.conf.blk, &nb_sectors);
|
||||||
|
|
||||||
outbuf[4] = 1; /* DVD-ROM, part version 1 */
|
outbuf[4] = 1; /* DVD-ROM, part version 1 */
|
||||||
outbuf[5] = 0xf; /* 120mm disc, minimum rate unspecified */
|
outbuf[5] = 0xf; /* 120mm disc, minimum rate unspecified */
|
||||||
@ -893,7 +895,7 @@ static int scsi_event_status_media(SCSIDiskState *s, uint8_t *outbuf)
|
|||||||
media_status = 0;
|
media_status = 0;
|
||||||
if (s->tray_open) {
|
if (s->tray_open) {
|
||||||
media_status = MS_TRAY_OPEN;
|
media_status = MS_TRAY_OPEN;
|
||||||
} else if (bdrv_is_inserted(s->qdev.conf.bs)) {
|
} else if (blk_is_inserted(s->qdev.conf.blk)) {
|
||||||
media_status = MS_MEDIA_PRESENT;
|
media_status = MS_MEDIA_PRESENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1091,7 +1093,7 @@ static int mode_sense_page(SCSIDiskState *s, int page, uint8_t **p_outbuf,
|
|||||||
case MODE_PAGE_CACHING:
|
case MODE_PAGE_CACHING:
|
||||||
length = 0x12;
|
length = 0x12;
|
||||||
if (page_control == 1 || /* Changeable Values */
|
if (page_control == 1 || /* Changeable Values */
|
||||||
bdrv_enable_write_cache(s->qdev.conf.bs)) {
|
blk_enable_write_cache(s->qdev.conf.blk)) {
|
||||||
p[0] = 4; /* WCE */
|
p[0] = 4; /* WCE */
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -1172,7 +1174,7 @@ static int scsi_disk_emulate_mode_sense(SCSIDiskReq *r, uint8_t *outbuf)
|
|||||||
|
|
||||||
if (s->qdev.type == TYPE_DISK) {
|
if (s->qdev.type == TYPE_DISK) {
|
||||||
dev_specific_param = s->features & (1 << SCSI_DISK_F_DPOFUA) ? 0x10 : 0;
|
dev_specific_param = s->features & (1 << SCSI_DISK_F_DPOFUA) ? 0x10 : 0;
|
||||||
if (bdrv_is_read_only(s->qdev.conf.bs)) {
|
if (blk_is_read_only(s->qdev.conf.blk)) {
|
||||||
dev_specific_param |= 0x80; /* Readonly. */
|
dev_specific_param |= 0x80; /* Readonly. */
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -1194,7 +1196,7 @@ static int scsi_disk_emulate_mode_sense(SCSIDiskReq *r, uint8_t *outbuf)
|
|||||||
p += 8;
|
p += 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
bdrv_get_geometry(s->qdev.conf.bs, &nb_sectors);
|
blk_get_geometry(s->qdev.conf.blk, &nb_sectors);
|
||||||
if (!dbd && nb_sectors) {
|
if (!dbd && nb_sectors) {
|
||||||
if (r->req.cmd.buf[0] == MODE_SENSE) {
|
if (r->req.cmd.buf[0] == MODE_SENSE) {
|
||||||
outbuf[3] = 8; /* Block descriptor length */
|
outbuf[3] = 8; /* Block descriptor length */
|
||||||
@ -1257,7 +1259,7 @@ static int scsi_disk_emulate_read_toc(SCSIRequest *req, uint8_t *outbuf)
|
|||||||
msf = req->cmd.buf[1] & 2;
|
msf = req->cmd.buf[1] & 2;
|
||||||
format = req->cmd.buf[2] & 0xf;
|
format = req->cmd.buf[2] & 0xf;
|
||||||
start_track = req->cmd.buf[6];
|
start_track = req->cmd.buf[6];
|
||||||
bdrv_get_geometry(s->qdev.conf.bs, &nb_sectors);
|
blk_get_geometry(s->qdev.conf.blk, &nb_sectors);
|
||||||
DPRINTF("Read TOC (track %d format %d msf %d)\n", start_track, format, msf >> 1);
|
DPRINTF("Read TOC (track %d format %d msf %d)\n", start_track, format, msf >> 1);
|
||||||
nb_sectors /= s->qdev.blocksize / 512;
|
nb_sectors /= s->qdev.blocksize / 512;
|
||||||
switch (format) {
|
switch (format) {
|
||||||
@ -1297,14 +1299,14 @@ static int scsi_disk_emulate_start_stop(SCSIDiskReq *r)
|
|||||||
if ((s->features & (1 << SCSI_DISK_F_REMOVABLE)) && loej) {
|
if ((s->features & (1 << SCSI_DISK_F_REMOVABLE)) && loej) {
|
||||||
if (!start && !s->tray_open && s->tray_locked) {
|
if (!start && !s->tray_open && s->tray_locked) {
|
||||||
scsi_check_condition(r,
|
scsi_check_condition(r,
|
||||||
bdrv_is_inserted(s->qdev.conf.bs)
|
blk_is_inserted(s->qdev.conf.blk)
|
||||||
? SENSE_CODE(ILLEGAL_REQ_REMOVAL_PREVENTED)
|
? SENSE_CODE(ILLEGAL_REQ_REMOVAL_PREVENTED)
|
||||||
: SENSE_CODE(NOT_READY_REMOVAL_PREVENTED));
|
: SENSE_CODE(NOT_READY_REMOVAL_PREVENTED));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s->tray_open != !start) {
|
if (s->tray_open != !start) {
|
||||||
bdrv_eject(s->qdev.conf.bs, !start);
|
blk_eject(s->qdev.conf.blk, !start);
|
||||||
s->tray_open = !start;
|
s->tray_open = !start;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1371,7 +1373,7 @@ static void scsi_disk_apply_mode_select(SCSIDiskState *s, int page, uint8_t *p)
|
|||||||
{
|
{
|
||||||
switch (page) {
|
switch (page) {
|
||||||
case MODE_PAGE_CACHING:
|
case MODE_PAGE_CACHING:
|
||||||
bdrv_set_enable_write_cache(s->qdev.conf.bs, (p[0] & 4) != 0);
|
blk_set_enable_write_cache(s->qdev.conf.blk, (p[0] & 4) != 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -1474,12 +1476,12 @@ static void scsi_disk_emulate_mode_select(SCSIDiskReq *r, uint8_t *inbuf)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!bdrv_enable_write_cache(s->qdev.conf.bs)) {
|
if (!blk_enable_write_cache(s->qdev.conf.blk)) {
|
||||||
/* The request is used as the AIO opaque value, so add a ref. */
|
/* The request is used as the AIO opaque value, so add a ref. */
|
||||||
scsi_req_ref(&r->req);
|
scsi_req_ref(&r->req);
|
||||||
block_acct_start(bdrv_get_stats(s->qdev.conf.bs), &r->acct, 0,
|
block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct, 0,
|
||||||
BLOCK_ACCT_FLUSH);
|
BLOCK_ACCT_FLUSH);
|
||||||
r->req.aiocb = bdrv_aio_flush(s->qdev.conf.bs, scsi_aio_complete, r);
|
r->req.aiocb = blk_aio_flush(s->qdev.conf.blk, scsi_aio_complete, r);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1548,10 +1550,10 @@ static void scsi_unmap_complete(void *opaque, int ret)
|
|||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
r->req.aiocb = bdrv_aio_discard(s->qdev.conf.bs,
|
r->req.aiocb = blk_aio_discard(s->qdev.conf.blk,
|
||||||
sector_num * (s->qdev.blocksize / 512),
|
sector_num * (s->qdev.blocksize / 512),
|
||||||
nb_sectors * (s->qdev.blocksize / 512),
|
nb_sectors * (s->qdev.blocksize / 512),
|
||||||
scsi_unmap_complete, data);
|
scsi_unmap_complete, data);
|
||||||
data->count--;
|
data->count--;
|
||||||
data->inbuf += 16;
|
data->inbuf += 16;
|
||||||
return;
|
return;
|
||||||
@ -1589,7 +1591,7 @@ static void scsi_disk_emulate_unmap(SCSIDiskReq *r, uint8_t *inbuf)
|
|||||||
goto invalid_param_len;
|
goto invalid_param_len;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bdrv_is_read_only(s->qdev.conf.bs)) {
|
if (blk_is_read_only(s->qdev.conf.blk)) {
|
||||||
scsi_check_condition(r, SENSE_CODE(WRITE_PROTECTED));
|
scsi_check_condition(r, SENSE_CODE(WRITE_PROTECTED));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1628,7 +1630,7 @@ static void scsi_write_same_complete(void *opaque, int ret)
|
|||||||
|
|
||||||
assert(r->req.aiocb != NULL);
|
assert(r->req.aiocb != NULL);
|
||||||
r->req.aiocb = NULL;
|
r->req.aiocb = NULL;
|
||||||
block_acct_done(bdrv_get_stats(s->qdev.conf.bs), &r->acct);
|
block_acct_done(blk_get_stats(s->qdev.conf.blk), &r->acct);
|
||||||
if (r->req.io_canceled) {
|
if (r->req.io_canceled) {
|
||||||
scsi_req_cancel_complete(&r->req);
|
scsi_req_cancel_complete(&r->req);
|
||||||
goto done;
|
goto done;
|
||||||
@ -1644,11 +1646,11 @@ static void scsi_write_same_complete(void *opaque, int ret)
|
|||||||
data->sector += data->iov.iov_len / 512;
|
data->sector += data->iov.iov_len / 512;
|
||||||
data->iov.iov_len = MIN(data->nb_sectors * 512, data->iov.iov_len);
|
data->iov.iov_len = MIN(data->nb_sectors * 512, data->iov.iov_len);
|
||||||
if (data->iov.iov_len) {
|
if (data->iov.iov_len) {
|
||||||
block_acct_start(bdrv_get_stats(s->qdev.conf.bs), &r->acct,
|
block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct,
|
||||||
data->iov.iov_len, BLOCK_ACCT_WRITE);
|
data->iov.iov_len, BLOCK_ACCT_WRITE);
|
||||||
r->req.aiocb = bdrv_aio_writev(s->qdev.conf.bs, data->sector,
|
r->req.aiocb = blk_aio_writev(s->qdev.conf.blk, data->sector,
|
||||||
&data->qiov, data->iov.iov_len / 512,
|
&data->qiov, data->iov.iov_len / 512,
|
||||||
scsi_write_same_complete, data);
|
scsi_write_same_complete, data);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1675,7 +1677,7 @@ static void scsi_disk_emulate_write_same(SCSIDiskReq *r, uint8_t *inbuf)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bdrv_is_read_only(s->qdev.conf.bs)) {
|
if (blk_is_read_only(s->qdev.conf.blk)) {
|
||||||
scsi_check_condition(r, SENSE_CODE(WRITE_PROTECTED));
|
scsi_check_condition(r, SENSE_CODE(WRITE_PROTECTED));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1689,13 +1691,13 @@ static void scsi_disk_emulate_write_same(SCSIDiskReq *r, uint8_t *inbuf)
|
|||||||
|
|
||||||
/* The request is used as the AIO opaque value, so add a ref. */
|
/* The request is used as the AIO opaque value, so add a ref. */
|
||||||
scsi_req_ref(&r->req);
|
scsi_req_ref(&r->req);
|
||||||
block_acct_start(bdrv_get_stats(s->qdev.conf.bs), &r->acct,
|
block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct,
|
||||||
nb_sectors * s->qdev.blocksize,
|
nb_sectors * s->qdev.blocksize,
|
||||||
BLOCK_ACCT_WRITE);
|
BLOCK_ACCT_WRITE);
|
||||||
r->req.aiocb = bdrv_aio_write_zeroes(s->qdev.conf.bs,
|
r->req.aiocb = blk_aio_write_zeroes(s->qdev.conf.blk,
|
||||||
r->req.cmd.lba * (s->qdev.blocksize / 512),
|
r->req.cmd.lba * (s->qdev.blocksize / 512),
|
||||||
nb_sectors * (s->qdev.blocksize / 512),
|
nb_sectors * (s->qdev.blocksize / 512),
|
||||||
flags, scsi_aio_complete, r);
|
flags, scsi_aio_complete, r);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1704,7 +1706,8 @@ static void scsi_disk_emulate_write_same(SCSIDiskReq *r, uint8_t *inbuf)
|
|||||||
data->sector = r->req.cmd.lba * (s->qdev.blocksize / 512);
|
data->sector = r->req.cmd.lba * (s->qdev.blocksize / 512);
|
||||||
data->nb_sectors = nb_sectors * (s->qdev.blocksize / 512);
|
data->nb_sectors = nb_sectors * (s->qdev.blocksize / 512);
|
||||||
data->iov.iov_len = MIN(data->nb_sectors * 512, SCSI_WRITE_SAME_MAX);
|
data->iov.iov_len = MIN(data->nb_sectors * 512, SCSI_WRITE_SAME_MAX);
|
||||||
data->iov.iov_base = buf = qemu_blockalign(s->qdev.conf.bs, data->iov.iov_len);
|
data->iov.iov_base = buf = blk_blockalign(s->qdev.conf.blk,
|
||||||
|
data->iov.iov_len);
|
||||||
qemu_iovec_init_external(&data->qiov, &data->iov, 1);
|
qemu_iovec_init_external(&data->qiov, &data->iov, 1);
|
||||||
|
|
||||||
for (i = 0; i < data->iov.iov_len; i += s->qdev.blocksize) {
|
for (i = 0; i < data->iov.iov_len; i += s->qdev.blocksize) {
|
||||||
@ -1712,11 +1715,11 @@ static void scsi_disk_emulate_write_same(SCSIDiskReq *r, uint8_t *inbuf)
|
|||||||
}
|
}
|
||||||
|
|
||||||
scsi_req_ref(&r->req);
|
scsi_req_ref(&r->req);
|
||||||
block_acct_start(bdrv_get_stats(s->qdev.conf.bs), &r->acct,
|
block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct,
|
||||||
data->iov.iov_len, BLOCK_ACCT_WRITE);
|
data->iov.iov_len, BLOCK_ACCT_WRITE);
|
||||||
r->req.aiocb = bdrv_aio_writev(s->qdev.conf.bs, data->sector,
|
r->req.aiocb = blk_aio_writev(s->qdev.conf.blk, data->sector,
|
||||||
&data->qiov, data->iov.iov_len / 512,
|
&data->qiov, data->iov.iov_len / 512,
|
||||||
scsi_write_same_complete, data);
|
scsi_write_same_complete, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void scsi_disk_emulate_write_data(SCSIRequest *req)
|
static void scsi_disk_emulate_write_data(SCSIRequest *req)
|
||||||
@ -1785,7 +1788,7 @@ static int32_t scsi_disk_emulate_command(SCSIRequest *req, uint8_t *buf)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
if (s->tray_open || !bdrv_is_inserted(s->qdev.conf.bs)) {
|
if (s->tray_open || !blk_is_inserted(s->qdev.conf.blk)) {
|
||||||
scsi_check_condition(r, SENSE_CODE(NO_MEDIUM));
|
scsi_check_condition(r, SENSE_CODE(NO_MEDIUM));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1806,7 +1809,7 @@ static int32_t scsi_disk_emulate_command(SCSIRequest *req, uint8_t *buf)
|
|||||||
r->buflen = MAX(4096, req->cmd.xfer);
|
r->buflen = MAX(4096, req->cmd.xfer);
|
||||||
|
|
||||||
if (!r->iov.iov_base) {
|
if (!r->iov.iov_base) {
|
||||||
r->iov.iov_base = qemu_blockalign(s->qdev.conf.bs, r->buflen);
|
r->iov.iov_base = blk_blockalign(s->qdev.conf.blk, r->buflen);
|
||||||
}
|
}
|
||||||
|
|
||||||
buflen = req->cmd.xfer;
|
buflen = req->cmd.xfer;
|
||||||
@ -1814,7 +1817,7 @@ static int32_t scsi_disk_emulate_command(SCSIRequest *req, uint8_t *buf)
|
|||||||
memset(outbuf, 0, r->buflen);
|
memset(outbuf, 0, r->buflen);
|
||||||
switch (req->cmd.buf[0]) {
|
switch (req->cmd.buf[0]) {
|
||||||
case TEST_UNIT_READY:
|
case TEST_UNIT_READY:
|
||||||
assert(!s->tray_open && bdrv_is_inserted(s->qdev.conf.bs));
|
assert(!s->tray_open && blk_is_inserted(s->qdev.conf.blk));
|
||||||
break;
|
break;
|
||||||
case INQUIRY:
|
case INQUIRY:
|
||||||
buflen = scsi_disk_emulate_inquiry(req, outbuf);
|
buflen = scsi_disk_emulate_inquiry(req, outbuf);
|
||||||
@ -1862,12 +1865,12 @@ static int32_t scsi_disk_emulate_command(SCSIRequest *req, uint8_t *buf)
|
|||||||
break;
|
break;
|
||||||
case ALLOW_MEDIUM_REMOVAL:
|
case ALLOW_MEDIUM_REMOVAL:
|
||||||
s->tray_locked = req->cmd.buf[4] & 1;
|
s->tray_locked = req->cmd.buf[4] & 1;
|
||||||
bdrv_lock_medium(s->qdev.conf.bs, req->cmd.buf[4] & 1);
|
blk_lock_medium(s->qdev.conf.blk, req->cmd.buf[4] & 1);
|
||||||
break;
|
break;
|
||||||
case READ_CAPACITY_10:
|
case READ_CAPACITY_10:
|
||||||
/* The normal LEN field for this command is zero. */
|
/* The normal LEN field for this command is zero. */
|
||||||
memset(outbuf, 0, 8);
|
memset(outbuf, 0, 8);
|
||||||
bdrv_get_geometry(s->qdev.conf.bs, &nb_sectors);
|
blk_get_geometry(s->qdev.conf.blk, &nb_sectors);
|
||||||
if (!nb_sectors) {
|
if (!nb_sectors) {
|
||||||
scsi_check_condition(r, SENSE_CODE(LUN_NOT_READY));
|
scsi_check_condition(r, SENSE_CODE(LUN_NOT_READY));
|
||||||
return 0;
|
return 0;
|
||||||
@ -1936,7 +1939,7 @@ static int32_t scsi_disk_emulate_command(SCSIRequest *req, uint8_t *buf)
|
|||||||
if ((req->cmd.buf[1] & 31) == SAI_READ_CAPACITY_16) {
|
if ((req->cmd.buf[1] & 31) == SAI_READ_CAPACITY_16) {
|
||||||
DPRINTF("SAI READ CAPACITY(16)\n");
|
DPRINTF("SAI READ CAPACITY(16)\n");
|
||||||
memset(outbuf, 0, req->cmd.xfer);
|
memset(outbuf, 0, req->cmd.xfer);
|
||||||
bdrv_get_geometry(s->qdev.conf.bs, &nb_sectors);
|
blk_get_geometry(s->qdev.conf.blk, &nb_sectors);
|
||||||
if (!nb_sectors) {
|
if (!nb_sectors) {
|
||||||
scsi_check_condition(r, SENSE_CODE(LUN_NOT_READY));
|
scsi_check_condition(r, SENSE_CODE(LUN_NOT_READY));
|
||||||
return 0;
|
return 0;
|
||||||
@ -1977,9 +1980,9 @@ static int32_t scsi_disk_emulate_command(SCSIRequest *req, uint8_t *buf)
|
|||||||
case SYNCHRONIZE_CACHE:
|
case SYNCHRONIZE_CACHE:
|
||||||
/* The request is used as the AIO opaque value, so add a ref. */
|
/* The request is used as the AIO opaque value, so add a ref. */
|
||||||
scsi_req_ref(&r->req);
|
scsi_req_ref(&r->req);
|
||||||
block_acct_start(bdrv_get_stats(s->qdev.conf.bs), &r->acct, 0,
|
block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct, 0,
|
||||||
BLOCK_ACCT_FLUSH);
|
BLOCK_ACCT_FLUSH);
|
||||||
r->req.aiocb = bdrv_aio_flush(s->qdev.conf.bs, scsi_aio_complete, r);
|
r->req.aiocb = blk_aio_flush(s->qdev.conf.blk, scsi_aio_complete, r);
|
||||||
return 0;
|
return 0;
|
||||||
case SEEK_10:
|
case SEEK_10:
|
||||||
DPRINTF("Seek(10) (sector %" PRId64 ")\n", r->req.cmd.lba);
|
DPRINTF("Seek(10) (sector %" PRId64 ")\n", r->req.cmd.lba);
|
||||||
@ -2053,7 +2056,7 @@ static int32_t scsi_disk_dma_command(SCSIRequest *req, uint8_t *buf)
|
|||||||
|
|
||||||
command = buf[0];
|
command = buf[0];
|
||||||
|
|
||||||
if (s->tray_open || !bdrv_is_inserted(s->qdev.conf.bs)) {
|
if (s->tray_open || !blk_is_inserted(s->qdev.conf.blk)) {
|
||||||
scsi_check_condition(r, SENSE_CODE(NO_MEDIUM));
|
scsi_check_condition(r, SENSE_CODE(NO_MEDIUM));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -2081,7 +2084,7 @@ static int32_t scsi_disk_dma_command(SCSIRequest *req, uint8_t *buf)
|
|||||||
case WRITE_VERIFY_10:
|
case WRITE_VERIFY_10:
|
||||||
case WRITE_VERIFY_12:
|
case WRITE_VERIFY_12:
|
||||||
case WRITE_VERIFY_16:
|
case WRITE_VERIFY_16:
|
||||||
if (bdrv_is_read_only(s->qdev.conf.bs)) {
|
if (blk_is_read_only(s->qdev.conf.blk)) {
|
||||||
scsi_check_condition(r, SENSE_CODE(WRITE_PROTECTED));
|
scsi_check_condition(r, SENSE_CODE(WRITE_PROTECTED));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -2124,7 +2127,7 @@ static void scsi_disk_reset(DeviceState *dev)
|
|||||||
|
|
||||||
scsi_device_purge_requests(&s->qdev, SENSE_CODE(RESET));
|
scsi_device_purge_requests(&s->qdev, SENSE_CODE(RESET));
|
||||||
|
|
||||||
bdrv_get_geometry(s->qdev.conf.bs, &nb_sectors);
|
blk_get_geometry(s->qdev.conf.blk, &nb_sectors);
|
||||||
nb_sectors /= s->qdev.blocksize / 512;
|
nb_sectors /= s->qdev.blocksize / 512;
|
||||||
if (nb_sectors) {
|
if (nb_sectors) {
|
||||||
nb_sectors--;
|
nb_sectors--;
|
||||||
@ -2140,7 +2143,7 @@ static void scsi_unrealize(SCSIDevice *dev, Error **errp)
|
|||||||
SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
|
SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
|
||||||
|
|
||||||
scsi_device_purge_requests(&s->qdev, SENSE_CODE(NO_SENSE));
|
scsi_device_purge_requests(&s->qdev, SENSE_CODE(NO_SENSE));
|
||||||
blockdev_mark_auto_del(s->qdev.conf.bs);
|
blockdev_mark_auto_del(s->qdev.conf.blk);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void scsi_disk_resize_cb(void *opaque)
|
static void scsi_disk_resize_cb(void *opaque)
|
||||||
@ -2223,13 +2226,13 @@ static void scsi_realize(SCSIDevice *dev, Error **errp)
|
|||||||
SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
|
SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
|
||||||
Error *err = NULL;
|
Error *err = NULL;
|
||||||
|
|
||||||
if (!s->qdev.conf.bs) {
|
if (!s->qdev.conf.blk) {
|
||||||
error_setg(errp, "drive property not set");
|
error_setg(errp, "drive property not set");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(s->features & (1 << SCSI_DISK_F_REMOVABLE)) &&
|
if (!(s->features & (1 << SCSI_DISK_F_REMOVABLE)) &&
|
||||||
!bdrv_is_inserted(s->qdev.conf.bs)) {
|
!blk_is_inserted(s->qdev.conf.blk)) {
|
||||||
error_setg(errp, "Device needs media, but drive is empty");
|
error_setg(errp, "Device needs media, but drive is empty");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -2255,20 +2258,20 @@ static void scsi_realize(SCSIDevice *dev, Error **errp)
|
|||||||
s->vendor = g_strdup("QEMU");
|
s->vendor = g_strdup("QEMU");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bdrv_is_sg(s->qdev.conf.bs)) {
|
if (blk_is_sg(s->qdev.conf.blk)) {
|
||||||
error_setg(errp, "unwanted /dev/sg*");
|
error_setg(errp, "unwanted /dev/sg*");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((s->features & (1 << SCSI_DISK_F_REMOVABLE)) &&
|
if ((s->features & (1 << SCSI_DISK_F_REMOVABLE)) &&
|
||||||
!(s->features & (1 << SCSI_DISK_F_NO_REMOVABLE_DEVOPS))) {
|
!(s->features & (1 << SCSI_DISK_F_NO_REMOVABLE_DEVOPS))) {
|
||||||
bdrv_set_dev_ops(s->qdev.conf.bs, &scsi_disk_removable_block_ops, s);
|
blk_set_dev_ops(s->qdev.conf.blk, &scsi_disk_removable_block_ops, s);
|
||||||
} else {
|
} else {
|
||||||
bdrv_set_dev_ops(s->qdev.conf.bs, &scsi_disk_block_ops, s);
|
blk_set_dev_ops(s->qdev.conf.blk, &scsi_disk_block_ops, s);
|
||||||
}
|
}
|
||||||
bdrv_set_guest_block_size(s->qdev.conf.bs, s->qdev.blocksize);
|
blk_set_guest_block_size(s->qdev.conf.blk, s->qdev.blocksize);
|
||||||
|
|
||||||
bdrv_iostatus_enable(s->qdev.conf.bs);
|
blk_iostatus_enable(s->qdev.conf.blk);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void scsi_hd_realize(SCSIDevice *dev, Error **errp)
|
static void scsi_hd_realize(SCSIDevice *dev, Error **errp)
|
||||||
@ -2299,14 +2302,14 @@ static void scsi_disk_realize(SCSIDevice *dev, Error **errp)
|
|||||||
DriveInfo *dinfo;
|
DriveInfo *dinfo;
|
||||||
Error *local_err = NULL;
|
Error *local_err = NULL;
|
||||||
|
|
||||||
if (!dev->conf.bs) {
|
if (!dev->conf.blk) {
|
||||||
scsi_realize(dev, &local_err);
|
scsi_realize(dev, &local_err);
|
||||||
assert(local_err);
|
assert(local_err);
|
||||||
error_propagate(errp, local_err);
|
error_propagate(errp, local_err);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
dinfo = drive_get_by_blockdev(dev->conf.bs);
|
dinfo = blk_legacy_dinfo(dev->conf.blk);
|
||||||
if (dinfo->media_cd) {
|
if (dinfo->media_cd) {
|
||||||
scsi_cd_realize(dev, errp);
|
scsi_cd_realize(dev, errp);
|
||||||
} else {
|
} else {
|
||||||
@ -2406,7 +2409,6 @@ static SCSIRequest *scsi_new_request(SCSIDevice *d, uint32_t tag, uint32_t lun,
|
|||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
static int get_device_type(SCSIDiskState *s)
|
static int get_device_type(SCSIDiskState *s)
|
||||||
{
|
{
|
||||||
BlockDriverState *bdrv = s->qdev.conf.bs;
|
|
||||||
uint8_t cmd[16];
|
uint8_t cmd[16];
|
||||||
uint8_t buf[36];
|
uint8_t buf[36];
|
||||||
uint8_t sensebuf[8];
|
uint8_t sensebuf[8];
|
||||||
@ -2429,7 +2431,7 @@ static int get_device_type(SCSIDiskState *s)
|
|||||||
io_header.sbp = sensebuf;
|
io_header.sbp = sensebuf;
|
||||||
io_header.timeout = 6000; /* XXX */
|
io_header.timeout = 6000; /* XXX */
|
||||||
|
|
||||||
ret = bdrv_ioctl(bdrv, SG_IO, &io_header);
|
ret = blk_ioctl(s->qdev.conf.blk, SG_IO, &io_header);
|
||||||
if (ret < 0 || io_header.driver_status || io_header.host_status) {
|
if (ret < 0 || io_header.driver_status || io_header.host_status) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -2446,13 +2448,13 @@ static void scsi_block_realize(SCSIDevice *dev, Error **errp)
|
|||||||
int sg_version;
|
int sg_version;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
if (!s->qdev.conf.bs) {
|
if (!s->qdev.conf.blk) {
|
||||||
error_setg(errp, "drive property not set");
|
error_setg(errp, "drive property not set");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* check we are using a driver managing SG_IO (version 3 and after) */
|
/* check we are using a driver managing SG_IO (version 3 and after) */
|
||||||
rc = bdrv_ioctl(s->qdev.conf.bs, SG_GET_VERSION_NUM, &sg_version);
|
rc = blk_ioctl(s->qdev.conf.blk, SG_GET_VERSION_NUM, &sg_version);
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
error_setg(errp, "cannot get SG_IO version number: %s. "
|
error_setg(errp, "cannot get SG_IO version number: %s. "
|
||||||
"Is this a SCSI device?",
|
"Is this a SCSI device?",
|
||||||
@ -2511,7 +2513,7 @@ static bool scsi_block_is_passthrough(SCSIDiskState *s, uint8_t *buf)
|
|||||||
* ones (such as WRITE SAME or EXTENDED COPY, etc.). So, without
|
* ones (such as WRITE SAME or EXTENDED COPY, etc.). So, without
|
||||||
* O_DIRECT everything must go through SG_IO.
|
* O_DIRECT everything must go through SG_IO.
|
||||||
*/
|
*/
|
||||||
if (!(bdrv_get_flags(s->qdev.conf.bs) & BDRV_O_NOCACHE)) {
|
if (!(blk_get_flags(s->qdev.conf.blk) & BDRV_O_NOCACHE)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2660,7 +2662,7 @@ static const TypeInfo scsi_cd_info = {
|
|||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
static Property scsi_block_properties[] = {
|
static Property scsi_block_properties[] = {
|
||||||
DEFINE_PROP_DRIVE("drive", SCSIDiskState, qdev.conf.bs),
|
DEFINE_PROP_DRIVE("drive", SCSIDiskState, qdev.conf.blk),
|
||||||
DEFINE_PROP_END_OF_LIST(),
|
DEFINE_PROP_END_OF_LIST(),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
#include "qemu-common.h"
|
#include "qemu-common.h"
|
||||||
#include "qemu/error-report.h"
|
#include "qemu/error-report.h"
|
||||||
#include "hw/scsi/scsi.h"
|
#include "hw/scsi/scsi.h"
|
||||||
|
#include "sysemu/block-backend.h"
|
||||||
#include "sysemu/blockdev.h"
|
#include "sysemu/blockdev.h"
|
||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
@ -141,7 +142,7 @@ done:
|
|||||||
scsi_req_unref(&r->req);
|
scsi_req_unref(&r->req);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int execute_command(BlockDriverState *bdrv,
|
static int execute_command(BlockBackend *blk,
|
||||||
SCSIGenericReq *r, int direction,
|
SCSIGenericReq *r, int direction,
|
||||||
BlockCompletionFunc *complete)
|
BlockCompletionFunc *complete)
|
||||||
{
|
{
|
||||||
@ -157,7 +158,7 @@ static int execute_command(BlockDriverState *bdrv,
|
|||||||
r->io_header.usr_ptr = r;
|
r->io_header.usr_ptr = r;
|
||||||
r->io_header.flags |= SG_FLAG_DIRECT_IO;
|
r->io_header.flags |= SG_FLAG_DIRECT_IO;
|
||||||
|
|
||||||
r->req.aiocb = bdrv_aio_ioctl(bdrv, SG_IO, &r->io_header, complete, r);
|
r->req.aiocb = blk_aio_ioctl(blk, SG_IO, &r->io_header, complete, r);
|
||||||
if (r->req.aiocb == NULL) {
|
if (r->req.aiocb == NULL) {
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
@ -193,7 +194,7 @@ static void scsi_read_complete(void * opaque, int ret)
|
|||||||
s->blocksize = ldl_be_p(&r->buf[8]);
|
s->blocksize = ldl_be_p(&r->buf[8]);
|
||||||
s->max_lba = ldq_be_p(&r->buf[0]);
|
s->max_lba = ldq_be_p(&r->buf[0]);
|
||||||
}
|
}
|
||||||
bdrv_set_guest_block_size(s->conf.bs, s->blocksize);
|
blk_set_guest_block_size(s->conf.blk, s->blocksize);
|
||||||
|
|
||||||
scsi_req_data(&r->req, len);
|
scsi_req_data(&r->req, len);
|
||||||
scsi_req_unref(&r->req);
|
scsi_req_unref(&r->req);
|
||||||
@ -216,7 +217,8 @@ static void scsi_read_data(SCSIRequest *req)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = execute_command(s->conf.bs, r, SG_DXFER_FROM_DEV, scsi_read_complete);
|
ret = execute_command(s->conf.blk, r, SG_DXFER_FROM_DEV,
|
||||||
|
scsi_read_complete);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
scsi_command_complete(r, ret);
|
scsi_command_complete(r, ret);
|
||||||
}
|
}
|
||||||
@ -260,7 +262,7 @@ static void scsi_write_data(SCSIRequest *req)
|
|||||||
|
|
||||||
/* The request is used as the AIO opaque value, so add a ref. */
|
/* The request is used as the AIO opaque value, so add a ref. */
|
||||||
scsi_req_ref(&r->req);
|
scsi_req_ref(&r->req);
|
||||||
ret = execute_command(s->conf.bs, r, SG_DXFER_TO_DEV, scsi_write_complete);
|
ret = execute_command(s->conf.blk, r, SG_DXFER_TO_DEV, scsi_write_complete);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
scsi_command_complete(r, ret);
|
scsi_command_complete(r, ret);
|
||||||
}
|
}
|
||||||
@ -302,7 +304,8 @@ static int32_t scsi_send_command(SCSIRequest *req, uint8_t *cmd)
|
|||||||
r->buf = NULL;
|
r->buf = NULL;
|
||||||
/* The request is used as the AIO opaque value, so add a ref. */
|
/* The request is used as the AIO opaque value, so add a ref. */
|
||||||
scsi_req_ref(&r->req);
|
scsi_req_ref(&r->req);
|
||||||
ret = execute_command(s->conf.bs, r, SG_DXFER_NONE, scsi_command_complete);
|
ret = execute_command(s->conf.blk, r, SG_DXFER_NONE,
|
||||||
|
scsi_command_complete);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
scsi_command_complete(r, ret);
|
scsi_command_complete(r, ret);
|
||||||
return 0;
|
return 0;
|
||||||
@ -327,7 +330,7 @@ static int32_t scsi_send_command(SCSIRequest *req, uint8_t *cmd)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int get_stream_blocksize(BlockDriverState *bdrv)
|
static int get_stream_blocksize(BlockBackend *blk)
|
||||||
{
|
{
|
||||||
uint8_t cmd[6];
|
uint8_t cmd[6];
|
||||||
uint8_t buf[12];
|
uint8_t buf[12];
|
||||||
@ -351,7 +354,7 @@ static int get_stream_blocksize(BlockDriverState *bdrv)
|
|||||||
io_header.sbp = sensebuf;
|
io_header.sbp = sensebuf;
|
||||||
io_header.timeout = 6000; /* XXX */
|
io_header.timeout = 6000; /* XXX */
|
||||||
|
|
||||||
ret = bdrv_ioctl(bdrv, SG_IO, &io_header);
|
ret = blk_ioctl(blk, SG_IO, &io_header);
|
||||||
if (ret < 0 || io_header.driver_status || io_header.host_status) {
|
if (ret < 0 || io_header.driver_status || io_header.host_status) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -368,7 +371,7 @@ static void scsi_generic_reset(DeviceState *dev)
|
|||||||
static void scsi_unrealize(SCSIDevice *s, Error **errp)
|
static void scsi_unrealize(SCSIDevice *s, Error **errp)
|
||||||
{
|
{
|
||||||
scsi_device_purge_requests(s, SENSE_CODE(NO_SENSE));
|
scsi_device_purge_requests(s, SENSE_CODE(NO_SENSE));
|
||||||
blockdev_mark_auto_del(s->conf.bs);
|
blockdev_mark_auto_del(s->conf.blk);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void scsi_generic_realize(SCSIDevice *s, Error **errp)
|
static void scsi_generic_realize(SCSIDevice *s, Error **errp)
|
||||||
@ -377,22 +380,22 @@ static void scsi_generic_realize(SCSIDevice *s, Error **errp)
|
|||||||
int sg_version;
|
int sg_version;
|
||||||
struct sg_scsi_id scsiid;
|
struct sg_scsi_id scsiid;
|
||||||
|
|
||||||
if (!s->conf.bs) {
|
if (!s->conf.blk) {
|
||||||
error_setg(errp, "drive property not set");
|
error_setg(errp, "drive property not set");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bdrv_get_on_error(s->conf.bs, 0) != BLOCKDEV_ON_ERROR_ENOSPC) {
|
if (blk_get_on_error(s->conf.blk, 0) != BLOCKDEV_ON_ERROR_ENOSPC) {
|
||||||
error_setg(errp, "Device doesn't support drive option werror");
|
error_setg(errp, "Device doesn't support drive option werror");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (bdrv_get_on_error(s->conf.bs, 1) != BLOCKDEV_ON_ERROR_REPORT) {
|
if (blk_get_on_error(s->conf.blk, 1) != BLOCKDEV_ON_ERROR_REPORT) {
|
||||||
error_setg(errp, "Device doesn't support drive option rerror");
|
error_setg(errp, "Device doesn't support drive option rerror");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* check we are using a driver managing SG_IO (version 3 and after */
|
/* check we are using a driver managing SG_IO (version 3 and after */
|
||||||
rc = bdrv_ioctl(s->conf.bs, SG_GET_VERSION_NUM, &sg_version);
|
rc = blk_ioctl(s->conf.blk, SG_GET_VERSION_NUM, &sg_version);
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
error_setg(errp, "cannot get SG_IO version number: %s. "
|
error_setg(errp, "cannot get SG_IO version number: %s. "
|
||||||
"Is this a SCSI device?",
|
"Is this a SCSI device?",
|
||||||
@ -405,7 +408,7 @@ static void scsi_generic_realize(SCSIDevice *s, Error **errp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* get LUN of the /dev/sg? */
|
/* get LUN of the /dev/sg? */
|
||||||
if (bdrv_ioctl(s->conf.bs, SG_GET_SCSI_ID, &scsiid)) {
|
if (blk_ioctl(s->conf.blk, SG_GET_SCSI_ID, &scsiid)) {
|
||||||
error_setg(errp, "SG_GET_SCSI_ID ioctl failed");
|
error_setg(errp, "SG_GET_SCSI_ID ioctl failed");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -416,7 +419,7 @@ static void scsi_generic_realize(SCSIDevice *s, Error **errp)
|
|||||||
|
|
||||||
switch (s->type) {
|
switch (s->type) {
|
||||||
case TYPE_TAPE:
|
case TYPE_TAPE:
|
||||||
s->blocksize = get_stream_blocksize(s->conf.bs);
|
s->blocksize = get_stream_blocksize(s->conf.blk);
|
||||||
if (s->blocksize == -1) {
|
if (s->blocksize == -1) {
|
||||||
s->blocksize = 0;
|
s->blocksize = 0;
|
||||||
}
|
}
|
||||||
@ -459,7 +462,7 @@ static SCSIRequest *scsi_new_request(SCSIDevice *d, uint32_t tag, uint32_t lun,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static Property scsi_generic_properties[] = {
|
static Property scsi_generic_properties[] = {
|
||||||
DEFINE_PROP_DRIVE("drive", SCSIDevice, conf.bs),
|
DEFINE_PROP_DRIVE("drive", SCSIDevice, conf.blk),
|
||||||
DEFINE_PROP_END_OF_LIST(),
|
DEFINE_PROP_END_OF_LIST(),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
|
|
||||||
#include "hw/virtio/virtio-scsi.h"
|
#include "hw/virtio/virtio-scsi.h"
|
||||||
#include "qemu/error-report.h"
|
#include "qemu/error-report.h"
|
||||||
|
#include "sysemu/block-backend.h"
|
||||||
#include <hw/scsi/scsi.h>
|
#include <hw/scsi/scsi.h>
|
||||||
#include <block/scsi.h>
|
#include <block/scsi.h>
|
||||||
#include <hw/virtio/virtio-bus.h>
|
#include <hw/virtio/virtio-bus.h>
|
||||||
@ -205,7 +206,7 @@ void virtio_scsi_dataplane_stop(VirtIOSCSI *s)
|
|||||||
aio_set_event_notifier(s->ctx, &s->cmd_vrings[i]->host_notifier, NULL);
|
aio_set_event_notifier(s->ctx, &s->cmd_vrings[i]->host_notifier, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
bdrv_drain_all(); /* ensure there are no in-flight requests */
|
blk_drain_all(); /* ensure there are no in-flight requests */
|
||||||
|
|
||||||
aio_context_release(s->ctx);
|
aio_context_release(s->ctx);
|
||||||
|
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
#include "hw/virtio/virtio-scsi.h"
|
#include "hw/virtio/virtio-scsi.h"
|
||||||
#include "qemu/error-report.h"
|
#include "qemu/error-report.h"
|
||||||
#include "qemu/iov.h"
|
#include "qemu/iov.h"
|
||||||
|
#include "sysemu/block-backend.h"
|
||||||
#include <hw/scsi/scsi.h>
|
#include <hw/scsi/scsi.h>
|
||||||
#include <block/scsi.h>
|
#include <block/scsi.h>
|
||||||
#include <hw/virtio/virtio-bus.h>
|
#include <hw/virtio/virtio-bus.h>
|
||||||
@ -236,9 +237,9 @@ static int virtio_scsi_do_tmf(VirtIOSCSI *s, VirtIOSCSIReq *req)
|
|||||||
int target;
|
int target;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
if (s->dataplane_started && bdrv_get_aio_context(d->conf.bs) != s->ctx) {
|
if (s->dataplane_started && blk_get_aio_context(d->conf.blk) != s->ctx) {
|
||||||
aio_context_acquire(s->ctx);
|
aio_context_acquire(s->ctx);
|
||||||
bdrv_set_aio_context(d->conf.bs, s->ctx);
|
blk_set_aio_context(d->conf.blk, s->ctx);
|
||||||
aio_context_release(s->ctx);
|
aio_context_release(s->ctx);
|
||||||
}
|
}
|
||||||
/* Here VIRTIO_SCSI_S_OK means "FUNCTION COMPLETE". */
|
/* Here VIRTIO_SCSI_S_OK means "FUNCTION COMPLETE". */
|
||||||
@ -522,9 +523,9 @@ bool virtio_scsi_handle_cmd_req_prepare(VirtIOSCSI *s, VirtIOSCSIReq *req)
|
|||||||
virtio_scsi_complete_cmd_req(req);
|
virtio_scsi_complete_cmd_req(req);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (s->dataplane_started && bdrv_get_aio_context(d->conf.bs) != s->ctx) {
|
if (s->dataplane_started && blk_get_aio_context(d->conf.blk) != s->ctx) {
|
||||||
aio_context_acquire(s->ctx);
|
aio_context_acquire(s->ctx);
|
||||||
bdrv_set_aio_context(d->conf.bs, s->ctx);
|
blk_set_aio_context(d->conf.blk, s->ctx);
|
||||||
aio_context_release(s->ctx);
|
aio_context_release(s->ctx);
|
||||||
}
|
}
|
||||||
req->sreq = scsi_req_new(d, req->req.cmd.tag,
|
req->sreq = scsi_req_new(d, req->req.cmd.tag,
|
||||||
@ -539,7 +540,7 @@ bool virtio_scsi_handle_cmd_req_prepare(VirtIOSCSI *s, VirtIOSCSIReq *req)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
scsi_req_ref(req->sreq);
|
scsi_req_ref(req->sreq);
|
||||||
bdrv_io_plug(d->conf.bs);
|
blk_io_plug(d->conf.blk);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -549,7 +550,7 @@ void virtio_scsi_handle_cmd_req_submit(VirtIOSCSI *s, VirtIOSCSIReq *req)
|
|||||||
if (scsi_req_enqueue(sreq)) {
|
if (scsi_req_enqueue(sreq)) {
|
||||||
scsi_req_continue(sreq);
|
scsi_req_continue(sreq);
|
||||||
}
|
}
|
||||||
bdrv_io_unplug(sreq->dev->conf.bs);
|
blk_io_unplug(sreq->dev->conf.blk);
|
||||||
scsi_req_unref(sreq);
|
scsi_req_unref(sreq);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -832,7 +833,7 @@ static void virtio_scsi_migration_state_changed(Notifier *notifier, void *data)
|
|||||||
if (s->dataplane_started) {
|
if (s->dataplane_started) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
bdrv_drain_all(); /* complete in-flight non-dataplane requests */
|
blk_drain_all(); /* complete in-flight non-dataplane requests */
|
||||||
s->dataplane_disabled = false;
|
s->dataplane_disabled = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -253,16 +253,16 @@ static int milkymist_memcard_init(SysBusDevice *dev)
|
|||||||
{
|
{
|
||||||
MilkymistMemcardState *s = MILKYMIST_MEMCARD(dev);
|
MilkymistMemcardState *s = MILKYMIST_MEMCARD(dev);
|
||||||
DriveInfo *dinfo;
|
DriveInfo *dinfo;
|
||||||
BlockDriverState *bs;
|
BlockBackend *blk;
|
||||||
|
|
||||||
dinfo = drive_get_next(IF_SD);
|
dinfo = drive_get_next(IF_SD);
|
||||||
bs = dinfo ? blk_bs(blk_by_legacy_dinfo(dinfo)) : NULL;
|
blk = dinfo ? blk_by_legacy_dinfo(dinfo) : NULL;
|
||||||
s->card = sd_init(bs, false);
|
s->card = sd_init(blk, false);
|
||||||
if (s->card == NULL) {
|
if (s->card == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
s->enabled = bs && bdrv_is_inserted(bs);
|
s->enabled = blk && blk_is_inserted(blk);
|
||||||
|
|
||||||
memory_region_init_io(&s->regs_region, OBJECT(s), &memcard_mmio_ops, s,
|
memory_region_init_io(&s->regs_region, OBJECT(s), &memcard_mmio_ops, s,
|
||||||
"milkymist-memcard", R_MAX * 4);
|
"milkymist-memcard", R_MAX * 4);
|
||||||
|
@ -574,7 +574,7 @@ static void omap_mmc_cover_cb(void *opaque, int line, int level)
|
|||||||
|
|
||||||
struct omap_mmc_s *omap_mmc_init(hwaddr base,
|
struct omap_mmc_s *omap_mmc_init(hwaddr base,
|
||||||
MemoryRegion *sysmem,
|
MemoryRegion *sysmem,
|
||||||
BlockDriverState *bd,
|
BlockBackend *blk,
|
||||||
qemu_irq irq, qemu_irq dma[], omap_clk clk)
|
qemu_irq irq, qemu_irq dma[], omap_clk clk)
|
||||||
{
|
{
|
||||||
struct omap_mmc_s *s = (struct omap_mmc_s *)
|
struct omap_mmc_s *s = (struct omap_mmc_s *)
|
||||||
@ -592,7 +592,7 @@ struct omap_mmc_s *omap_mmc_init(hwaddr base,
|
|||||||
memory_region_add_subregion(sysmem, base, &s->iomem);
|
memory_region_add_subregion(sysmem, base, &s->iomem);
|
||||||
|
|
||||||
/* Instantiate the storage */
|
/* Instantiate the storage */
|
||||||
s->card = sd_init(bd, false);
|
s->card = sd_init(blk, false);
|
||||||
if (s->card == NULL) {
|
if (s->card == NULL) {
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
@ -601,7 +601,7 @@ struct omap_mmc_s *omap_mmc_init(hwaddr base,
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct omap_mmc_s *omap2_mmc_init(struct omap_target_agent_s *ta,
|
struct omap_mmc_s *omap2_mmc_init(struct omap_target_agent_s *ta,
|
||||||
BlockDriverState *bd, qemu_irq irq, qemu_irq dma[],
|
BlockBackend *blk, qemu_irq irq, qemu_irq dma[],
|
||||||
omap_clk fclk, omap_clk iclk)
|
omap_clk fclk, omap_clk iclk)
|
||||||
{
|
{
|
||||||
struct omap_mmc_s *s = (struct omap_mmc_s *)
|
struct omap_mmc_s *s = (struct omap_mmc_s *)
|
||||||
@ -620,7 +620,7 @@ struct omap_mmc_s *omap2_mmc_init(struct omap_target_agent_s *ta,
|
|||||||
omap_l4_attach(ta, 0, &s->iomem);
|
omap_l4_attach(ta, 0, &s->iomem);
|
||||||
|
|
||||||
/* Instantiate the storage */
|
/* Instantiate the storage */
|
||||||
s->card = sd_init(bd, false);
|
s->card = sd_init(blk, false);
|
||||||
if (s->card == NULL) {
|
if (s->card == NULL) {
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
@ -491,7 +491,7 @@ static int pl181_init(SysBusDevice *sbd)
|
|||||||
sysbus_init_irq(sbd, &s->irq[1]);
|
sysbus_init_irq(sbd, &s->irq[1]);
|
||||||
qdev_init_gpio_out(dev, s->cardstatus, 2);
|
qdev_init_gpio_out(dev, s->cardstatus, 2);
|
||||||
dinfo = drive_get_next(IF_SD);
|
dinfo = drive_get_next(IF_SD);
|
||||||
s->card = sd_init(dinfo ? blk_bs(blk_by_legacy_dinfo(dinfo)) : NULL, false);
|
s->card = sd_init(dinfo ? blk_by_legacy_dinfo(dinfo) : NULL, false);
|
||||||
if (s->card == NULL) {
|
if (s->card == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -523,7 +523,7 @@ static int pxa2xx_mmci_load(QEMUFile *f, void *opaque, int version_id)
|
|||||||
|
|
||||||
PXA2xxMMCIState *pxa2xx_mmci_init(MemoryRegion *sysmem,
|
PXA2xxMMCIState *pxa2xx_mmci_init(MemoryRegion *sysmem,
|
||||||
hwaddr base,
|
hwaddr base,
|
||||||
BlockDriverState *bd, qemu_irq irq,
|
BlockBackend *blk, qemu_irq irq,
|
||||||
qemu_irq rx_dma, qemu_irq tx_dma)
|
qemu_irq rx_dma, qemu_irq tx_dma)
|
||||||
{
|
{
|
||||||
PXA2xxMMCIState *s;
|
PXA2xxMMCIState *s;
|
||||||
@ -538,7 +538,7 @@ PXA2xxMMCIState *pxa2xx_mmci_init(MemoryRegion *sysmem,
|
|||||||
memory_region_add_subregion(sysmem, base, &s->iomem);
|
memory_region_add_subregion(sysmem, base, &s->iomem);
|
||||||
|
|
||||||
/* Instantiate the actual storage */
|
/* Instantiate the actual storage */
|
||||||
s->card = sd_init(bd, false);
|
s->card = sd_init(blk, false);
|
||||||
if (s->card == NULL) {
|
if (s->card == NULL) {
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
60
hw/sd/sd.c
60
hw/sd/sd.c
@ -30,7 +30,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "hw/hw.h"
|
#include "hw/hw.h"
|
||||||
#include "block/block.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "hw/sd.h"
|
#include "hw/sd.h"
|
||||||
#include "qemu/bitmap.h"
|
#include "qemu/bitmap.h"
|
||||||
|
|
||||||
@ -110,7 +110,7 @@ struct SDState {
|
|||||||
uint8_t data[512];
|
uint8_t data[512];
|
||||||
qemu_irq readonly_cb;
|
qemu_irq readonly_cb;
|
||||||
qemu_irq inserted_cb;
|
qemu_irq inserted_cb;
|
||||||
BlockDriverState *bdrv;
|
BlockBackend *blk;
|
||||||
uint8_t *buf;
|
uint8_t *buf;
|
||||||
|
|
||||||
bool enable;
|
bool enable;
|
||||||
@ -389,13 +389,13 @@ static inline uint64_t sd_addr_to_wpnum(uint64_t addr)
|
|||||||
return addr >> (HWBLOCK_SHIFT + SECTOR_SHIFT + WPGROUP_SHIFT);
|
return addr >> (HWBLOCK_SHIFT + SECTOR_SHIFT + WPGROUP_SHIFT);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sd_reset(SDState *sd, BlockDriverState *bdrv)
|
static void sd_reset(SDState *sd, BlockBackend *blk)
|
||||||
{
|
{
|
||||||
uint64_t size;
|
uint64_t size;
|
||||||
uint64_t sect;
|
uint64_t sect;
|
||||||
|
|
||||||
if (bdrv) {
|
if (blk) {
|
||||||
bdrv_get_geometry(bdrv, §);
|
blk_get_geometry(blk, §);
|
||||||
} else {
|
} else {
|
||||||
sect = 0;
|
sect = 0;
|
||||||
}
|
}
|
||||||
@ -412,11 +412,11 @@ static void sd_reset(SDState *sd, BlockDriverState *bdrv)
|
|||||||
sd_set_cardstatus(sd);
|
sd_set_cardstatus(sd);
|
||||||
sd_set_sdstatus(sd);
|
sd_set_sdstatus(sd);
|
||||||
|
|
||||||
sd->bdrv = bdrv;
|
sd->blk = blk;
|
||||||
|
|
||||||
if (sd->wp_groups)
|
if (sd->wp_groups)
|
||||||
g_free(sd->wp_groups);
|
g_free(sd->wp_groups);
|
||||||
sd->wp_switch = bdrv ? bdrv_is_read_only(bdrv) : false;
|
sd->wp_switch = blk ? blk_is_read_only(blk) : false;
|
||||||
sd->wpgrps_size = sect;
|
sd->wpgrps_size = sect;
|
||||||
sd->wp_groups = bitmap_new(sd->wpgrps_size);
|
sd->wp_groups = bitmap_new(sd->wpgrps_size);
|
||||||
memset(sd->function_group, 0, sizeof(sd->function_group));
|
memset(sd->function_group, 0, sizeof(sd->function_group));
|
||||||
@ -432,9 +432,9 @@ static void sd_cardchange(void *opaque, bool load)
|
|||||||
{
|
{
|
||||||
SDState *sd = opaque;
|
SDState *sd = opaque;
|
||||||
|
|
||||||
qemu_set_irq(sd->inserted_cb, bdrv_is_inserted(sd->bdrv));
|
qemu_set_irq(sd->inserted_cb, blk_is_inserted(sd->blk));
|
||||||
if (bdrv_is_inserted(sd->bdrv)) {
|
if (blk_is_inserted(sd->blk)) {
|
||||||
sd_reset(sd, sd->bdrv);
|
sd_reset(sd, sd->blk);
|
||||||
qemu_set_irq(sd->readonly_cb, sd->wp_switch);
|
qemu_set_irq(sd->readonly_cb, sd->wp_switch);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -479,23 +479,23 @@ static const VMStateDescription sd_vmstate = {
|
|||||||
whether card should be in SSI or MMC/SD mode. It is also up to the
|
whether card should be in SSI or MMC/SD mode. It is also up to the
|
||||||
board to ensure that ssi transfers only occur when the chip select
|
board to ensure that ssi transfers only occur when the chip select
|
||||||
is asserted. */
|
is asserted. */
|
||||||
SDState *sd_init(BlockDriverState *bs, bool is_spi)
|
SDState *sd_init(BlockBackend *blk, bool is_spi)
|
||||||
{
|
{
|
||||||
SDState *sd;
|
SDState *sd;
|
||||||
|
|
||||||
if (bs && bdrv_is_read_only(bs)) {
|
if (blk && blk_is_read_only(blk)) {
|
||||||
fprintf(stderr, "sd_init: Cannot use read-only drive\n");
|
fprintf(stderr, "sd_init: Cannot use read-only drive\n");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
sd = (SDState *) g_malloc0(sizeof(SDState));
|
sd = (SDState *) g_malloc0(sizeof(SDState));
|
||||||
sd->buf = qemu_blockalign(bs, 512);
|
sd->buf = blk_blockalign(blk, 512);
|
||||||
sd->spi = is_spi;
|
sd->spi = is_spi;
|
||||||
sd->enable = true;
|
sd->enable = true;
|
||||||
sd_reset(sd, bs);
|
sd_reset(sd, blk);
|
||||||
if (sd->bdrv) {
|
if (sd->blk) {
|
||||||
bdrv_attach_dev_nofail(sd->bdrv, sd);
|
blk_attach_dev_nofail(sd->blk, sd);
|
||||||
bdrv_set_dev_ops(sd->bdrv, &sd_block_ops, sd);
|
blk_set_dev_ops(sd->blk, &sd_block_ops, sd);
|
||||||
}
|
}
|
||||||
vmstate_register(NULL, -1, &sd_vmstate, sd);
|
vmstate_register(NULL, -1, &sd_vmstate, sd);
|
||||||
return sd;
|
return sd;
|
||||||
@ -505,8 +505,8 @@ void sd_set_cb(SDState *sd, qemu_irq readonly, qemu_irq insert)
|
|||||||
{
|
{
|
||||||
sd->readonly_cb = readonly;
|
sd->readonly_cb = readonly;
|
||||||
sd->inserted_cb = insert;
|
sd->inserted_cb = insert;
|
||||||
qemu_set_irq(readonly, sd->bdrv ? bdrv_is_read_only(sd->bdrv) : 0);
|
qemu_set_irq(readonly, sd->blk ? blk_is_read_only(sd->blk) : 0);
|
||||||
qemu_set_irq(insert, sd->bdrv ? bdrv_is_inserted(sd->bdrv) : 0);
|
qemu_set_irq(insert, sd->blk ? blk_is_inserted(sd->blk) : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sd_erase(SDState *sd)
|
static void sd_erase(SDState *sd)
|
||||||
@ -680,7 +680,7 @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
|
|||||||
|
|
||||||
default:
|
default:
|
||||||
sd->state = sd_idle_state;
|
sd->state = sd_idle_state;
|
||||||
sd_reset(sd, sd->bdrv);
|
sd_reset(sd, sd->blk);
|
||||||
return sd->spi ? sd_r1 : sd_r0;
|
return sd->spi ? sd_r1 : sd_r0;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -1347,7 +1347,7 @@ int sd_do_command(SDState *sd, SDRequest *req,
|
|||||||
sd_rsp_type_t rtype;
|
sd_rsp_type_t rtype;
|
||||||
int rsplen;
|
int rsplen;
|
||||||
|
|
||||||
if (!sd->bdrv || !bdrv_is_inserted(sd->bdrv) || !sd->enable) {
|
if (!sd->blk || !blk_is_inserted(sd->blk) || !sd->enable) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1456,7 +1456,7 @@ static void sd_blk_read(SDState *sd, uint64_t addr, uint32_t len)
|
|||||||
|
|
||||||
DPRINTF("sd_blk_read: addr = 0x%08llx, len = %d\n",
|
DPRINTF("sd_blk_read: addr = 0x%08llx, len = %d\n",
|
||||||
(unsigned long long) addr, len);
|
(unsigned long long) addr, len);
|
||||||
if (!sd->bdrv || bdrv_read(sd->bdrv, addr >> 9, sd->buf, 1) < 0) {
|
if (!sd->blk || blk_read(sd->blk, addr >> 9, sd->buf, 1) < 0) {
|
||||||
fprintf(stderr, "sd_blk_read: read error on host side\n");
|
fprintf(stderr, "sd_blk_read: read error on host side\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1464,7 +1464,7 @@ static void sd_blk_read(SDState *sd, uint64_t addr, uint32_t len)
|
|||||||
if (end > (addr & ~511) + 512) {
|
if (end > (addr & ~511) + 512) {
|
||||||
memcpy(sd->data, sd->buf + (addr & 511), 512 - (addr & 511));
|
memcpy(sd->data, sd->buf + (addr & 511), 512 - (addr & 511));
|
||||||
|
|
||||||
if (bdrv_read(sd->bdrv, end >> 9, sd->buf, 1) < 0) {
|
if (blk_read(sd->blk, end >> 9, sd->buf, 1) < 0) {
|
||||||
fprintf(stderr, "sd_blk_read: read error on host side\n");
|
fprintf(stderr, "sd_blk_read: read error on host side\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1478,29 +1478,29 @@ static void sd_blk_write(SDState *sd, uint64_t addr, uint32_t len)
|
|||||||
uint64_t end = addr + len;
|
uint64_t end = addr + len;
|
||||||
|
|
||||||
if ((addr & 511) || len < 512)
|
if ((addr & 511) || len < 512)
|
||||||
if (!sd->bdrv || bdrv_read(sd->bdrv, addr >> 9, sd->buf, 1) < 0) {
|
if (!sd->blk || blk_read(sd->blk, addr >> 9, sd->buf, 1) < 0) {
|
||||||
fprintf(stderr, "sd_blk_write: read error on host side\n");
|
fprintf(stderr, "sd_blk_write: read error on host side\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (end > (addr & ~511) + 512) {
|
if (end > (addr & ~511) + 512) {
|
||||||
memcpy(sd->buf + (addr & 511), sd->data, 512 - (addr & 511));
|
memcpy(sd->buf + (addr & 511), sd->data, 512 - (addr & 511));
|
||||||
if (bdrv_write(sd->bdrv, addr >> 9, sd->buf, 1) < 0) {
|
if (blk_write(sd->blk, addr >> 9, sd->buf, 1) < 0) {
|
||||||
fprintf(stderr, "sd_blk_write: write error on host side\n");
|
fprintf(stderr, "sd_blk_write: write error on host side\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bdrv_read(sd->bdrv, end >> 9, sd->buf, 1) < 0) {
|
if (blk_read(sd->blk, end >> 9, sd->buf, 1) < 0) {
|
||||||
fprintf(stderr, "sd_blk_write: read error on host side\n");
|
fprintf(stderr, "sd_blk_write: read error on host side\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
memcpy(sd->buf, sd->data + 512 - (addr & 511), end & 511);
|
memcpy(sd->buf, sd->data + 512 - (addr & 511), end & 511);
|
||||||
if (bdrv_write(sd->bdrv, end >> 9, sd->buf, 1) < 0) {
|
if (blk_write(sd->blk, end >> 9, sd->buf, 1) < 0) {
|
||||||
fprintf(stderr, "sd_blk_write: write error on host side\n");
|
fprintf(stderr, "sd_blk_write: write error on host side\n");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
memcpy(sd->buf + (addr & 511), sd->data, len);
|
memcpy(sd->buf + (addr & 511), sd->data, len);
|
||||||
if (!sd->bdrv || bdrv_write(sd->bdrv, addr >> 9, sd->buf, 1) < 0) {
|
if (!sd->blk || blk_write(sd->blk, addr >> 9, sd->buf, 1) < 0) {
|
||||||
fprintf(stderr, "sd_blk_write: write error on host side\n");
|
fprintf(stderr, "sd_blk_write: write error on host side\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1515,7 +1515,7 @@ void sd_write_data(SDState *sd, uint8_t value)
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (!sd->bdrv || !bdrv_is_inserted(sd->bdrv) || !sd->enable)
|
if (!sd->blk || !blk_is_inserted(sd->blk) || !sd->enable)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (sd->state != sd_receivingdata_state) {
|
if (sd->state != sd_receivingdata_state) {
|
||||||
@ -1641,7 +1641,7 @@ uint8_t sd_read_data(SDState *sd)
|
|||||||
uint8_t ret;
|
uint8_t ret;
|
||||||
int io_len;
|
int io_len;
|
||||||
|
|
||||||
if (!sd->bdrv || !bdrv_is_inserted(sd->bdrv) || !sd->enable)
|
if (!sd->blk || !blk_is_inserted(sd->blk) || !sd->enable)
|
||||||
return 0x00;
|
return 0x00;
|
||||||
|
|
||||||
if (sd->state != sd_sendingdata_state) {
|
if (sd->state != sd_sendingdata_state) {
|
||||||
|
@ -1166,7 +1166,7 @@ static void sdhci_initfn(Object *obj)
|
|||||||
DriveInfo *di;
|
DriveInfo *di;
|
||||||
|
|
||||||
di = drive_get_next(IF_SD);
|
di = drive_get_next(IF_SD);
|
||||||
s->card = sd_init(di ? blk_bs(blk_by_legacy_dinfo(di)) : NULL, false);
|
s->card = sd_init(di ? blk_by_legacy_dinfo(di) : NULL, false);
|
||||||
if (s->card == NULL) {
|
if (s->card == NULL) {
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
@ -256,7 +256,7 @@ static int ssi_sd_init(SSISlave *d)
|
|||||||
|
|
||||||
s->mode = SSI_SD_CMD;
|
s->mode = SSI_SD_CMD;
|
||||||
dinfo = drive_get_next(IF_SD);
|
dinfo = drive_get_next(IF_SD);
|
||||||
s->sd = sd_init(dinfo ? blk_bs(blk_by_legacy_dinfo(dinfo)) : NULL, true);
|
s->sd = sd_init(dinfo ? blk_by_legacy_dinfo(dinfo) : NULL, true);
|
||||||
if (s->sd == NULL) {
|
if (s->sd == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -37,7 +37,6 @@
|
|||||||
#include "hw/usb.h"
|
#include "hw/usb.h"
|
||||||
#include "hw/block/flash.h"
|
#include "hw/block/flash.h"
|
||||||
#include "sysemu/block-backend.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "sysemu/blockdev.h"
|
|
||||||
#include "exec/address-spaces.h"
|
#include "exec/address-spaces.h"
|
||||||
|
|
||||||
#define FLASH_BASE 0x00000000
|
#define FLASH_BASE 0x00000000
|
||||||
@ -291,7 +290,7 @@ static void r2d_init(MachineState *machine)
|
|||||||
/* onboard flash memory */
|
/* onboard flash memory */
|
||||||
dinfo = drive_get(IF_PFLASH, 0, 0);
|
dinfo = drive_get(IF_PFLASH, 0, 0);
|
||||||
pflash_cfi02_register(0x0, NULL, "r2d.flash", FLASH_SIZE,
|
pflash_cfi02_register(0x0, NULL, "r2d.flash", FLASH_SIZE,
|
||||||
dinfo ? blk_bs(blk_by_legacy_dinfo(dinfo)) : NULL,
|
dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
|
||||||
(16 * 1024), FLASH_SIZE >> 16,
|
(16 * 1024), FLASH_SIZE >> 16,
|
||||||
1, 4, 0x0000, 0x0000, 0x0000, 0x0000,
|
1, 4, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||||
0x555, 0x2aa, 0);
|
0x555, 0x2aa, 0);
|
||||||
|
@ -40,7 +40,7 @@
|
|||||||
#include "hw/empty_slot.h"
|
#include "hw/empty_slot.h"
|
||||||
#include "hw/loader.h"
|
#include "hw/loader.h"
|
||||||
#include "elf.h"
|
#include "elf.h"
|
||||||
#include "sysemu/blockdev.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "trace.h"
|
#include "trace.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -38,7 +38,7 @@
|
|||||||
#include "hw/ide.h"
|
#include "hw/ide.h"
|
||||||
#include "hw/loader.h"
|
#include "hw/loader.h"
|
||||||
#include "elf.h"
|
#include "elf.h"
|
||||||
#include "sysemu/blockdev.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "exec/address-spaces.h"
|
#include "exec/address-spaces.h"
|
||||||
|
|
||||||
//#define DEBUG_IRQ
|
//#define DEBUG_IRQ
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
|
|
||||||
#include "sysemu/tpm_backend.h"
|
#include "sysemu/tpm_backend.h"
|
||||||
#include "tpm_int.h"
|
#include "tpm_int.h"
|
||||||
#include "block/block.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "exec/address-spaces.h"
|
#include "exec/address-spaces.h"
|
||||||
#include "hw/hw.h"
|
#include "hw/hw.h"
|
||||||
#include "hw/i386/pc.h"
|
#include "hw/i386/pc.h"
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
#include "sysemu/sysemu.h"
|
#include "sysemu/sysemu.h"
|
||||||
#include "hw/boards.h"
|
#include "hw/boards.h"
|
||||||
#include "hw/loader.h"
|
#include "hw/loader.h"
|
||||||
#include "sysemu/blockdev.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "exec/address-spaces.h"
|
#include "exec/address-spaces.h"
|
||||||
#include "hw/block/flash.h"
|
#include "hw/block/flash.h"
|
||||||
#include "elf.h"
|
#include "elf.h"
|
||||||
|
@ -601,11 +601,11 @@ static const struct SCSIBusInfo usb_msd_scsi_info_bot = {
|
|||||||
static void usb_msd_realize_storage(USBDevice *dev, Error **errp)
|
static void usb_msd_realize_storage(USBDevice *dev, Error **errp)
|
||||||
{
|
{
|
||||||
MSDState *s = DO_UPCAST(MSDState, dev, dev);
|
MSDState *s = DO_UPCAST(MSDState, dev, dev);
|
||||||
BlockDriverState *bs = s->conf.bs;
|
BlockBackend *blk = s->conf.blk;
|
||||||
SCSIDevice *scsi_dev;
|
SCSIDevice *scsi_dev;
|
||||||
Error *err = NULL;
|
Error *err = NULL;
|
||||||
|
|
||||||
if (!bs) {
|
if (!blk) {
|
||||||
error_setg(errp, "drive property not set");
|
error_setg(errp, "drive property not set");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -621,14 +621,14 @@ static void usb_msd_realize_storage(USBDevice *dev, Error **errp)
|
|||||||
*
|
*
|
||||||
* The hack is probably a bad idea.
|
* The hack is probably a bad idea.
|
||||||
*/
|
*/
|
||||||
bdrv_detach_dev(bs, &s->dev.qdev);
|
blk_detach_dev(blk, &s->dev.qdev);
|
||||||
s->conf.bs = NULL;
|
s->conf.blk = NULL;
|
||||||
|
|
||||||
usb_desc_create_serial(dev);
|
usb_desc_create_serial(dev);
|
||||||
usb_desc_init(dev);
|
usb_desc_init(dev);
|
||||||
scsi_bus_new(&s->bus, sizeof(s->bus), DEVICE(dev),
|
scsi_bus_new(&s->bus, sizeof(s->bus), DEVICE(dev),
|
||||||
&usb_msd_scsi_info_storage, NULL);
|
&usb_msd_scsi_info_storage, NULL);
|
||||||
scsi_dev = scsi_bus_legacy_add_drive(&s->bus, bs, 0, !!s->removable,
|
scsi_dev = scsi_bus_legacy_add_drive(&s->bus, blk, 0, !!s->removable,
|
||||||
s->conf.bootindex, dev->serial,
|
s->conf.bootindex, dev->serial,
|
||||||
&err);
|
&err);
|
||||||
if (!scsi_dev) {
|
if (!scsi_dev) {
|
||||||
@ -638,9 +638,10 @@ static void usb_msd_realize_storage(USBDevice *dev, Error **errp)
|
|||||||
usb_msd_handle_reset(dev);
|
usb_msd_handle_reset(dev);
|
||||||
s->scsi_dev = scsi_dev;
|
s->scsi_dev = scsi_dev;
|
||||||
|
|
||||||
if (bdrv_key_required(bs)) {
|
if (bdrv_key_required(blk_bs(blk))) {
|
||||||
if (cur_mon) {
|
if (cur_mon) {
|
||||||
monitor_read_bdrv_key_start(cur_mon, bs, usb_msd_password_cb, s);
|
monitor_read_bdrv_key_start(cur_mon, blk_bs(blk),
|
||||||
|
usb_msd_password_cb, s);
|
||||||
s->dev.auto_attach = 0;
|
s->dev.auto_attach = 0;
|
||||||
} else {
|
} else {
|
||||||
autostart = 0;
|
autostart = 0;
|
||||||
@ -709,7 +710,7 @@ static USBDevice *usb_msd_init(USBBus *bus, const char *filename)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (qdev_prop_set_drive(&dev->qdev, "drive",
|
if (qdev_prop_set_drive(&dev->qdev, "drive",
|
||||||
blk_bs(blk_by_legacy_dinfo(dinfo))) < 0) {
|
blk_by_legacy_dinfo(dinfo)) < 0) {
|
||||||
object_unparent(OBJECT(dev));
|
object_unparent(OBJECT(dev));
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
#include "hw/pci/msix.h"
|
#include "hw/pci/msix.h"
|
||||||
#include "hw/loader.h"
|
#include "hw/loader.h"
|
||||||
#include "sysemu/kvm.h"
|
#include "sysemu/kvm.h"
|
||||||
#include "sysemu/blockdev.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "virtio-pci.h"
|
#include "virtio-pci.h"
|
||||||
#include "qemu/range.h"
|
#include "qemu/range.h"
|
||||||
#include "hw/virtio/virtio-bus.h"
|
#include "hw/virtio/virtio-bus.h"
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
#include "hw/xen/xen_backend.h"
|
#include "hw/xen/xen_backend.h"
|
||||||
|
#include "sysemu/block-backend.h"
|
||||||
#include "sysemu/blockdev.h"
|
#include "sysemu/blockdev.h"
|
||||||
|
|
||||||
/* ------------------------------------------------------------- */
|
/* ------------------------------------------------------------- */
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
#include "hw/boards.h"
|
#include "hw/boards.h"
|
||||||
#include "hw/xen/xen_backend.h"
|
#include "hw/xen/xen_backend.h"
|
||||||
#include "xen_domainbuild.h"
|
#include "xen_domainbuild.h"
|
||||||
#include "sysemu/blockdev.h"
|
#include "sysemu/block-backend.h"
|
||||||
|
|
||||||
static void xen_init_pv(MachineState *machine)
|
static void xen_init_pv(MachineState *machine)
|
||||||
{
|
{
|
||||||
|
@ -36,7 +36,6 @@
|
|||||||
#include "hw/sysbus.h"
|
#include "hw/sysbus.h"
|
||||||
#include "hw/block/flash.h"
|
#include "hw/block/flash.h"
|
||||||
#include "sysemu/block-backend.h"
|
#include "sysemu/block-backend.h"
|
||||||
#include "sysemu/blockdev.h"
|
|
||||||
#include "sysemu/char.h"
|
#include "sysemu/char.h"
|
||||||
#include "sysemu/device_tree.h"
|
#include "sysemu/device_tree.h"
|
||||||
#include "qemu/error-report.h"
|
#include "qemu/error-report.h"
|
||||||
@ -231,7 +230,7 @@ static void lx_init(const LxBoardDesc *board, MachineState *machine)
|
|||||||
if (dinfo) {
|
if (dinfo) {
|
||||||
flash = pflash_cfi01_register(board->flash_base,
|
flash = pflash_cfi01_register(board->flash_base,
|
||||||
NULL, "lx60.io.flash", board->flash_size,
|
NULL, "lx60.io.flash", board->flash_size,
|
||||||
blk_bs(blk_by_legacy_dinfo(dinfo)),
|
blk_by_legacy_dinfo(dinfo),
|
||||||
board->flash_sector_size,
|
board->flash_sector_size,
|
||||||
board->flash_size / board->flash_sector_size,
|
board->flash_size / board->flash_sector_size,
|
||||||
4, 0x0000, 0x0000, 0x0000, 0x0000, be);
|
4, 0x0000, 0x0000, 0x0000, 0x0000, be);
|
||||||
|
@ -755,10 +755,10 @@ void omap_rfbi_attach(struct omap_dss_s *s, int cs, struct rfbi_chip_s *chip);
|
|||||||
struct omap_mmc_s;
|
struct omap_mmc_s;
|
||||||
struct omap_mmc_s *omap_mmc_init(hwaddr base,
|
struct omap_mmc_s *omap_mmc_init(hwaddr base,
|
||||||
MemoryRegion *sysmem,
|
MemoryRegion *sysmem,
|
||||||
BlockDriverState *bd,
|
BlockBackend *blk,
|
||||||
qemu_irq irq, qemu_irq dma[], omap_clk clk);
|
qemu_irq irq, qemu_irq dma[], omap_clk clk);
|
||||||
struct omap_mmc_s *omap2_mmc_init(struct omap_target_agent_s *ta,
|
struct omap_mmc_s *omap2_mmc_init(struct omap_target_agent_s *ta,
|
||||||
BlockDriverState *bd, qemu_irq irq, qemu_irq dma[],
|
BlockBackend *blk, qemu_irq irq, qemu_irq dma[],
|
||||||
omap_clk fclk, omap_clk iclk);
|
omap_clk fclk, omap_clk iclk);
|
||||||
void omap_mmc_reset(struct omap_mmc_s *s);
|
void omap_mmc_reset(struct omap_mmc_s *s);
|
||||||
void omap_mmc_handlers(struct omap_mmc_s *s, qemu_irq ro, qemu_irq cover);
|
void omap_mmc_handlers(struct omap_mmc_s *s, qemu_irq ro, qemu_irq cover);
|
||||||
|
@ -87,7 +87,7 @@ void pxa2xx_lcdc_oritentation(void *opaque, int angle);
|
|||||||
typedef struct PXA2xxMMCIState PXA2xxMMCIState;
|
typedef struct PXA2xxMMCIState PXA2xxMMCIState;
|
||||||
PXA2xxMMCIState *pxa2xx_mmci_init(MemoryRegion *sysmem,
|
PXA2xxMMCIState *pxa2xx_mmci_init(MemoryRegion *sysmem,
|
||||||
hwaddr base,
|
hwaddr base,
|
||||||
BlockDriverState *bd, qemu_irq irq,
|
BlockBackend *blk, qemu_irq irq,
|
||||||
qemu_irq rx_dma, qemu_irq tx_dma);
|
qemu_irq rx_dma, qemu_irq tx_dma);
|
||||||
void pxa2xx_mmci_handlers(PXA2xxMMCIState *s, qemu_irq readonly,
|
void pxa2xx_mmci_handlers(PXA2xxMMCIState *s, qemu_irq readonly,
|
||||||
qemu_irq coverswitch);
|
qemu_irq coverswitch);
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user