blob: 179173965d5cc5b99856f19e7a065d3ca1eee00a [file] [log] [blame]
# Copyright (c) 2020 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.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met: redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer;
# redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution;
# neither the name of the copyright holders nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
from m5.objects.Device import BasicPioDevice
from m5.objects.Doorbell import Doorbell
from m5.params import *
from m5.proxy import *
from m5.util.fdthelper import *
class MhuDoorbell(Doorbell):
type = 'MhuDoorbell'
abstract = True
cxx_header = "dev/arm/css/mhu.hh"
cxx_class = 'gem5::MhuDoorbell'
class Scp2ApDoorbell(MhuDoorbell):
type = 'Scp2ApDoorbell'
cxx_header = "dev/arm/css/mhu.hh"
cxx_class = 'gem5::Scp2ApDoorbell'
interrupt = Param.ArmInterruptPin("Interrupt Pin")
class Ap2ScpDoorbell(MhuDoorbell):
type = 'Ap2ScpDoorbell'
cxx_header = "dev/arm/css/mhu.hh"
cxx_class = 'gem5::Ap2ScpDoorbell'
# Message Handling Unit
class MHU(BasicPioDevice):
type = 'MHU'
cxx_header = "dev/arm/css/mhu.hh"
cxx_class = 'gem5::MHU'
pio_size = Param.Unsigned(0x1000, "MHU pio size")
lowp_scp2ap = Param.Scp2ApDoorbell(
"Low Priority doorbell channel for communications "
"from the System Control Processor (SCP) to the "
"Application Processor (AP)")
highp_scp2ap = Param.Scp2ApDoorbell(
"High Priority doorbell channel for communications "
"from the System Control Processor (SCP) to the "
"Application Processor (AP)")
sec_scp2ap = Param.Scp2ApDoorbell(
"Secure doorbell channel for communications "
"from the System Control Processor (SCP) to the "
"Application Processor (AP)")
lowp_ap2scp = Param.Ap2ScpDoorbell(
"Low Priority doorbell channel for communications "
"from the Application Processor (AP) to the "
"System Control Processor (SCP)")
highp_ap2scp = Param.Ap2ScpDoorbell(
"High Priority doorbell channel for communications "
"from the Application Processor (AP) to the "
"System Control Processor (SCP)")
sec_ap2scp = Param.Ap2ScpDoorbell(
"Secure doorbell channel for communications "
"from the Application Processor (AP) to the "
"System Control Processor (SCP)")
scp = Param.Scp(Parent.any, "System Control Processor")
def generateDeviceTree(self, state):
node = FdtNode("mailbox@%x" % int(self.pio_addr))
node.appendCompatible(["arm,mhu", "arm,primecell"])
node.append(FdtPropertyWords("reg",
state.addrCells(self.pio_addr) +
state.sizeCells(self.pio_size) ))
node.append(FdtPropertyWords("#mbox-cells", 1))
node.append(FdtPropertyWords("interrupts", [
0, int(self.lowp_scp2ap.interrupt.num) - 32, 1,
0, int(self.highp_scp2ap.interrupt.num) - 32, 1,
0, int(self.sec_scp2ap.interrupt.num) - 32, 1,
]))
realview = self._parent.unproxy(self)
node.append(FdtPropertyWords("clocks",
[state.phandle(realview.mcc.osc_peripheral),
state.phandle(realview.dcc.osc_smb)]))
node.append(FdtPropertyStrings("clock-names", ["apb_pclk"]))
node.appendPhandle(self)
yield node