sparc: Use big endian packet accessors.
[gem5.git] / src / dev / Device.py
index adf262f26d4294f5d97c6904586e9c535e2914fe..e4656078d522813ac86b671707a40dfc39bf9147 100644 (file)
@@ -1,3 +1,15 @@
+# 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")
@@ -64,8 +95,11 @@ class IsaFake(BasicPioDevice):
     ret_bad_addr = Param.Bool(False, "Return pkt status bad address on access")
     update_data = Param.Bool(False, "Update the data that is returned on writes")
     warn_access = Param.String("", "String to print when device is accessed")
+    fake_mem = Param.Bool(False,
+      "Is this device acting like a memory and thus may get a cache line sized req")
 
 class BadAddr(IsaFake):
+    pio_addr = 0
     ret_bad_addr = Param.Bool(True, "Return pkt status bad address on access")