+# Copyright (c) 2012-2016 ARM Limited
+# All rights reserved.
+#
+# The license below extends only to copyright in the software and shall
+# not be construed as granting a license to any other intellectual
+# property including but not limited to intellectual property relating
+# to a hardware implementation of the functionality of the software
+# licensed hereunder. You may use the software subject to the license
+# terms below provided that you ensure that this notice is replicated
+# unmodified and in its entirety in all distributions of the software,
+# modified or unmodified, in source code or in binary form.
+#
# Copyright (c) 2005-2007 The Regents of The University of Michigan
# All rights reserved.
#
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
# Authors: Nathan Binkert
+# Glenn Bergmans
from m5.params import *
from m5.proxy import *
+from m5.util.fdthelper import *
from MemObject import MemObject
class PioDevice(MemObject):
type = 'PioDevice'
+ cxx_header = "dev/io_device.hh"
abstract = True
- pio = Port("Programmed I/O port")
- platform = Param.Platform(Parent.any, "Platform this device is part of")
+ pio = SlavePort("Programmed I/O port")
system = Param.System(Parent.any, "System this device is part of")
+ def generateBasicPioDeviceNode(self, state, name, pio_addr,
+ size, interrupts = None):
+ node = FdtNode("%s@%x" % (name, long(pio_addr)))
+ node.append(FdtPropertyWords("reg",
+ state.addrCells(pio_addr) +
+ state.sizeCells(size) ))
+
+ if interrupts:
+ if any([i < 32 for i in interrupts]):
+ raise(("Interrupt number smaller than 32 "+
+ " in PioDevice %s") % name)
+
+ # subtracting 32 because Linux assumes that SPIs start at 0, while
+ # gem5 uses the internal GIC numbering (SPIs start at 32)
+ node.append(FdtPropertyWords("interrupts", sum(
+ [[0, i - 32, 4] for i in interrupts], []) ))
+
+ return node
+
class BasicPioDevice(PioDevice):
type = 'BasicPioDevice'
+ cxx_header = "dev/io_device.hh"
abstract = True
pio_addr = Param.Addr("Device Address")
- pio_latency = Param.Latency('1ns', "Programmed IO latency in simticks")
+ pio_latency = Param.Latency('100ns', "Programmed IO latency")
class DmaDevice(PioDevice):
type = 'DmaDevice'
+ cxx_header = "dev/dma_device.hh"
abstract = True
- dma = Port(Self.pio.peerObj.port, "DMA port")
- min_backoff_delay = Param.Latency('4ns',
- "min time between a nack packet being received and the next request made by the device")
- max_backoff_delay = Param.Latency('10us',
- "max time between a nack packet being received and the next request made by the device")
-
+ dma = MasterPort("DMA port")
class IsaFake(BasicPioDevice):
type = 'IsaFake'
+ cxx_header = "dev/isa_fake.hh"
pio_size = Param.Addr(0x8, "Size of address range")
ret_data8 = Param.UInt8(0xFF, "Default data to return")
ret_data16 = Param.UInt16(0xFFFF, "Default data to return")