dev: Add a dummy VirtIO device

VirtIO transport interfaces always expect a VirtIO device
pointer. However, there are cases (in particular when using VirtIO's
MMIO interface) where we want to instantiate an interface without a
device. Add a dummy device using VirtIO device ID 0 and no queues to
handle this use case.

Change-Id: I6cbe12fd403903ef585be40279c3b1321fde48ff
Signed-off-by: Andreas Sandberg <andreas.sandberg@arm.com>
Reviewed-by: Nikos Nikoleris <nikos.nikoleris@arm.com>
Reviewed-by: Sudhanshu Jha <sudhanshu.jha@arm.com>
Reviewed-by: Rekai Gonzalez Alberquilla <rekai.gonzalezalberquilla@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/2325
Reviewed-by: Weiping Liao <weipingliao@google.com>
Reviewed-by: Jason Lowe-Power <jason@lowepower.com>
This commit is contained in:
Andreas Sandberg 2016-11-07 18:16:51 +00:00
parent cd9ca71b25
commit ba00d7449d
3 changed files with 33 additions and 4 deletions

View file

@ -1,6 +1,6 @@
# -*- mode:python -*- # -*- mode:python -*-
# Copyright (c) 2014 ARM Limited # Copyright (c) 2014, 2016 ARM Limited
# All rights reserved. # All rights reserved.
# #
# The license below extends only to copyright in the software and shall # The license below extends only to copyright in the software and shall
@ -53,11 +53,15 @@ class VirtIODeviceBase(SimObject):
system = Param.System(Parent.any, "system object") system = Param.System(Parent.any, "system object")
class VirtIODummyDevice(VirtIODeviceBase):
type = 'VirtIODummyDevice'
cxx_header = 'dev/virtio/base.hh'
class PciVirtIO(PciDevice): class PciVirtIO(PciDevice):
type = 'PciVirtIO' type = 'PciVirtIO'
cxx_header = 'dev/virtio/pci.hh' cxx_header = 'dev/virtio/pci.hh'
vio = Param.VirtIODeviceBase("VirtIO device") vio = Param.VirtIODeviceBase(VirtIODummyDevice(), "VirtIO device")
VendorID = 0x1AF4 VendorID = 0x1AF4
SubsystemVendorID = VendorID; SubsystemVendorID = VendorID;

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2014 ARM Limited * Copyright (c) 2014, 2016 ARM Limited
* All rights reserved * All rights reserved
* *
* The license below extends only to copyright in the software and shall * The license below extends only to copyright in the software and shall
@ -41,6 +41,7 @@
#include "debug/VIO.hh" #include "debug/VIO.hh"
#include "params/VirtIODeviceBase.hh" #include "params/VirtIODeviceBase.hh"
#include "params/VirtIODummyDevice.hh"
VirtDescriptor::VirtDescriptor(PortProxy &_memProxy, VirtQueue &_queue, VirtDescriptor::VirtDescriptor(PortProxy &_memProxy, VirtQueue &_queue,
Index descIndex) Index descIndex)
@ -477,3 +478,15 @@ VirtIODeviceBase::registerQueue(VirtQueue &queue)
{ {
_queues.push_back(&queue); _queues.push_back(&queue);
} }
VirtIODummyDevice::VirtIODummyDevice(VirtIODummyDeviceParams *params)
: VirtIODeviceBase(params, ID_INVALID, 0, 0)
{
}
VirtIODummyDevice *
VirtIODummyDeviceParams::create()
{
return new VirtIODummyDevice(this);
}

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2014 ARM Limited * Copyright (c) 2014, 2016 ARM Limited
* All rights reserved * All rights reserved
* *
* The license below extends only to copyright in the software and shall * The license below extends only to copyright in the software and shall
@ -48,6 +48,8 @@
#include "sim/sim_object.hh" #include "sim/sim_object.hh"
struct VirtIODeviceBaseParams; struct VirtIODeviceBaseParams;
struct VirtIODummyDeviceParams;
class VirtQueue; class VirtQueue;
/** @{ /** @{
@ -875,4 +877,14 @@ class VirtIODeviceBase : public SimObject
Callback *transKick; Callback *transKick;
}; };
class VirtIODummyDevice : public VirtIODeviceBase
{
public:
VirtIODummyDevice(VirtIODummyDeviceParams *params);
protected:
/** VirtIO device ID */
static const DeviceId ID_INVALID = 0x00;
};
#endif // __DEV_VIRTIO_BASE_HH__ #endif // __DEV_VIRTIO_BASE_HH__