sparc: Use big endian packet accessors.
[gem5.git] / src / dev / Device.py
index 60c21df914aa3b234c0fb2af80fd19670064837a..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 = 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")
+    pio_latency = Param.Latency('100ns', "Programmed IO latency")
 
 class DmaDevice(PioDevice):
     type = 'DmaDevice'
+    cxx_header = "dev/dma_device.hh"
     abstract = True
     dma = MasterPort("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")
-
 
 
 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")