blob: b1a9a3c8a1aa51ad0428e79a53c09801959eff09 [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.
#
# Copyright 2019 Google, Inc.
#
# 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.params import *
from m5.util.fdthelper import *
from m5.SimObject import SimObject
from m5.objects.FastModel import AmbaInitiatorSocket, AmbaTargetSocket
from m5.objects.Gic import BaseGic
from m5.objects.IntPin import VectorIntSourcePin
from m5.objects.ResetPort import ResetResponsePort
from m5.objects.SystemC import SystemC_ScModule
GICV3_COMMS_TARGET_ROLE = "GICV3 COMMS TARGET"
GICV3_COMMS_INITIATOR_ROLE = "GICV3 COMMS INITIATOR"
Port.compat(GICV3_COMMS_TARGET_ROLE, GICV3_COMMS_INITIATOR_ROLE)
class Gicv3CommsTargetSocket(Port):
def __init__(self, desc):
super().__init__(GICV3_COMMS_INITIATOR_ROLE, desc)
class Gicv3CommsInitiatorSocket(Port):
def __init__(self, desc):
super().__init__(GICV3_COMMS_TARGET_ROLE, desc, is_source=True)
class VectorGicv3CommsInitiatorSocket(VectorPort):
def __init__(self, desc):
super().__init__(GICV3_COMMS_TARGET_ROLE, desc, is_source=True)
class SCFastModelGIC(SystemC_ScModule):
type = "SCFastModelGIC"
cxx_class = "gem5::fastmodel::SCGIC"
cxx_header = "arch/arm/fastmodel/GIC/gic.hh"
enabled = Param.Bool(
True,
"Enable GICv3 functionality; when false the "
"component is inactive. has_gicv3 will replace this when GIC_IRI "
"replaces GICv3IRI.",
)
has_gicv3 = Param.Bool(
False,
"Enable GICv3 functionality; when false "
'the component is inactive. This will replace "enabled" '
"parameter.",
)
has_gicv4_1 = Param.Bool(
False,
"Enable GICv4.1 functionality; when "
"false the component is inactive.",
)
vPEID_bits = Param.Unsigned(16, "Number of bits of vPEID with GICv4.1.")
print_mmap = Param.Bool(False, "Print memory map to stdout")
monolithic = Param.Bool(
False, "Indicate that the implementation is not distributed"
)
direct_lpi_support = Param.Bool(
False, "Enable support for LPI operations through GICR registers"
)
cpu_affinities = Param.String(
"",
"A comma separated list of dotted quads "
"containing the affinities of all PEs connected to this IRI.",
)
non_ARE_core_count = Param.Unsigned(
8,
"Maximum number of non-ARE cores; "
"normally used to pass the cluster-level NUM_CORES parameter to "
"the top-level redistributor.",
)
reg_base = Param.Addr(0x2C010000, "Base for decoding GICv3 registers.")
reg_base_per_redistributor = Param.String(
"",
"Base address for each "
"redistributor in the form "
"'0.0.0.0=0x2c010000, 0.0.0.1=0x2c020000'. All redistributors "
"must be specified and this overrides the reg-base parameter "
"(except that reg-base will still be used for the top-level "
"redistributor).",
)
gicd_alias = Param.Addr(
0x0,
"In GICv2 mode: the base address for a 4k "
"page alias of the first 4k of the Distributor page, in GICv3 "
"mode. the base address of a 64KB page containing message based "
"SPI signalling register aliases(0:Disabled)",
)
has_two_security_states = Param.Bool(
True, "If true, has two security states"
)
DS_fixed_to_zero = Param.Bool(
False, "Enable/disable support of single security state"
)
IIDR = Param.UInt32(0x0, "GICD_IIDR and GICR_IIDR value")
gicv2_only = Param.Bool(
False,
"If true, when using the GICv3 model, pretend to be a GICv2 system",
)
STATUSR_implemented = Param.Bool(
True, "Determines whether the GICR_STATUSR register is implemented."
)
priority_bits_implemented = Param.Unsigned(
5, "Number of implemented priority bits"
)
itargets_razwi = Param.Bool(
False, "If true, the GICD_ITARGETS registers are RAZ/WI"
)
icfgr_sgi_mask = Param.UInt32(
0x0, "Mask for writes to ICFGR registers that configure SGIs"
)
icfgr_ppi_mask = Param.UInt32(
0xAAAAAAAA, "Mask for writes to ICFGR registers that configure PPIs"
)
icfgr_spi_mask = Param.UInt32(
0xAAAAAAAA, "Mask for writes to ICFGR registers that configure SPIs"
)
icfgr_sgi_reset = Param.UInt32(
0xAAAAAAAA, "Reset value for ICFGR registers that configure SGIs"
)
icfgr_ppi_reset = Param.UInt32(
0x0, "Reset value for ICFGR regesters that configure PPIs"
)
icfgr_spi_reset = Param.UInt32(
0x0, "Reset value for ICFGR regesters that configure SPIs"
)
icfgr_ppi_rsvd_bit = Param.Bool(
False,
"If ARE=0, the value of reserved "
"bits i.e. bit 0,2,4..30 of ICFGRn for n>0",
)
igroup_sgi_mask = Param.UInt16(
0xFFFF, "Mask for writes to SGI bits in IGROUP registers"
)
igroup_ppi_mask = Param.UInt16(
0xFFFF, "Mask for writes to PPI bits in IGROUP registers"
)
igroup_sgi_reset = Param.UInt16(
0x0, "Reset value for SGI bits in IGROUP registers"
)
igroup_ppi_reset = Param.UInt16(
0x0, "Reset value for SGI bits in IGROUP registers"
)
ppi_implemented_mask = Param.UInt16(
0xFFFF,
"Mask of PPIs that are "
"implemented. One bit per PPI bit 0 == PPI 16 (first PPI). This "
"will affect other masks.",
)
spi_count = Param.UInt16(224, "Number of SPIs that are implemented.")
lockable_spi_count = Param.Unsigned(
0,
"Number of SPIs that are locked "
"down when CFGSDISABLE signal is asserted. Only applies for "
"GICv2.",
)
iri_id_bits = Param.Unsigned(
16,
"Number of bits used to represent "
"interrupts IDs in the Distributor and Redistributors, forced to "
"10 if LPIs are not supported",
)
delay_redistributor_accesses = Param.Bool(
True,
"Delay memory accesses "
"from the redistributor until GICR_SYNCR is read.",
)
gicd_pidr = Param.UInt64(
0x0,
"The value for the GICD_PIDR registers, if "
"non-zero. Note: fixed fields (device type etc.) will be "
"overriden in this value.",
)
gicr_pidr = Param.UInt64(
0x0,
"The value for the GICR_PIDR registers, if "
"non-zero. Note: fixed fields (device type etc.) will be "
"overriden in this value.",
)
its_count = Param.Unsigned(
0,
"Number of Interrupt Translation Services "
"to be instantiated (0=none)",
)
its0_base = Param.Addr(
0, "Register base address for ITS0 (automatic if 0)."
)
its1_base = Param.Addr(
0, "Register base address for ITS1 (automatic if 0)."
)
its2_base = Param.Addr(
0, "Register base address for ITS2 (automatic if 0)."
)
its3_base = Param.Addr(
0, "Register base address for ITS3 (automatic if 0)."
)
gits_pidr = Param.UInt64(
0x0,
"The value for the GITS_PIDR registers, if "
"non-zero. Note: fixed fields (device type etc.) will be "
"overriden in this value.",
)
gits_baser0_type = Param.Unsigned(
0,
"Type field for GITS_BASER0 "
"register. 0 = Unimplemented; 1 = Devices; "
"2 = Virtual Processors; 3 = Physical Processors; 4 = Collections",
)
gits_baser1_type = Param.Unsigned(
0,
"Type field for GITS_BASER1 "
"register. 0 = Unimplemented; 1 = Devices; "
"2 = Virtual Processors; 3 = Physical Processors; 4 = Collections",
)
gits_baser2_type = Param.Unsigned(
0,
"Type field for GITS_BASER2 "
"register. 0 = Unimplemented; 1 = Devices; "
"2 = Virtual Processors; 3 = Physical Processors; 4 = Collections",
)
gits_baser3_type = Param.Unsigned(
0,
"Type field for GITS_BASER3 "
"register. 0 = Unimplemented; 1 = Devices; "
"2 = Virtual Processors; 3 = Physical Processors; 4 = Collections",
)
gits_baser4_type = Param.Unsigned(
0,
"Type field for GITS_BASER4 "
"register. 0 = Unimplemented; 1 = Devices; "
"2 = Virtual Processors; 3 = Physical Processors; 4 = Collections",
)
gits_baser5_type = Param.Unsigned(
0,
"Type field for GITS_BASER5 "
"register. 0 = Unimplemented; 1 = Devices; "
"2 = Virtual Processors; 3 = Physical Processors; 4 = Collections",
)
gits_baser6_type = Param.Unsigned(
0,
"Type field for GITS_BASER6 "
"register. 0 = Unimplemented; 1 = Devices; "
"2 = Virtual Processors; 3 = Physical Processors; 4 = Collections",
)
gits_baser7_type = Param.Unsigned(
0,
"Type field for GITS_BASER7 "
"register. 0 = Unimplemented; 1 = Devices; "
"2 = Virtual Processors; 3 = Physical Processors; 4 = Collections",
)
gits_baser0_entry_bytes = Param.Unsigned(
8, "Number of bytes required per entry for GITS_BASER0 register."
)
gits_baser1_entry_bytes = Param.Unsigned(
8, "Number of bytes required per entry for GITS_BASER1 register."
)
gits_baser2_entry_bytes = Param.Unsigned(
8, "Number of bytes required per entry for GITS_BASER2 register."
)
gits_baser3_entry_bytes = Param.Unsigned(
8, "Number of bytes required per entry for GITS_BASER3 register."
)
gits_baser4_entry_bytes = Param.Unsigned(
8, "Number of bytes required per entry for GITS_BASER4 register."
)
gits_baser5_entry_bytes = Param.Unsigned(
8, "Number of bytes required per entry for GITS_BASER5 register."
)
gits_baser6_entry_bytes = Param.Unsigned(
8, "Number of bytes required per entry for GITS_BASER6 register."
)
gits_baser7_entry_bytes = Param.Unsigned(
8, "Number of bytes required per entry for GITS_BASER7 register."
)
gits_baser0_indirect_raz = Param.Bool(
False, "Indirect field for GITS_BASER0 register is RAZ/WI."
)
gits_baser1_indirect_raz = Param.Bool(
False, "Indirect field for GITS_BASER1 register is RAZ/WI."
)
gits_baser2_indirect_raz = Param.Bool(
False, "Indirect field for GITS_BASER2 register is RAZ/WI."
)
gits_baser3_indirect_raz = Param.Bool(
False, "Indirect field for GITS_BASER3 register is RAZ/WI."
)
gits_baser4_indirect_raz = Param.Bool(
False, "Indirect field for GITS_BASER4 register is RAZ/WI."
)
gits_baser5_indirect_raz = Param.Bool(
False, "Indirect field for GITS_BASER5 register is RAZ/WI."
)
gits_baser6_indirect_raz = Param.Bool(
False, "Indirect field for GITS_BASER6 register is RAZ/WI."
)
gits_baser7_indirect_raz = Param.Bool(
False, "Indirect field for GITS_BASER7 register is RAZ/WI."
)
its_baser_force_page_alignement = Param.Bool(
True,
"Force alignement of "
"address writen to a GITS_BASER register to the page size "
"configured",
)
processor_numbers = Param.String(
"",
"Specify processor numbers (as "
"appears in GICR_TYPER) in the form 0.0.0.0=0,0.0.0.1=1 etc.) If "
"not specified, will number processors starting at 0.",
)
supports_shareability = Param.Bool(
True,
"Device supports shareability "
"attributes on outgoing memory bus (i.e. is modelling an ACElite "
"port rather than an AXI4 port).",
)
a3_affinity_supported = Param.Bool(
False, "Device supports affinity level 3 values that are non-zero."
)
SGI_RSS_support = Param.Bool(
False, "Device has support for the Range Selector feature for SGI"
)
gicr_propbaser_read_only = Param.Bool(
False, "GICR_PROPBASER register is read-only."
)
gicr_propbaser_reset = Param.UInt64(
0x0, "Value of GICR_PROPBASER on reset."
)
its_device_bits = Param.Unsigned(
16, "Number of bits supported for ITS device IDs."
)
its_entry_size = Param.Unsigned(
8, "Number of bytes required to store each entry in the ITT tables."
)
its_id_bits = Param.Unsigned(
16, "Number of interrupt bits supported by ITS."
)
its_collection_id_bits = Param.Unsigned(
0,
"Number of collection bits "
"supported by ITS (optional parameter, 0 => 16bits support and "
"GITS_TYPER.CIL=0",
)
its_cumulative_collection_tables = Param.Bool(
True,
"When true, the "
"supported amount of collections is the sum of GITS_TYPER.HCC and "
"the number of collections supported in memory, otherwise, simply "
"the number supported in memory only. Irrelevant when HCC=0",
)
delay_ITS_accesses = Param.Bool(
True, "Delay accesses from the ITS until GICR_SYNCR is read."
)
local_SEIs = Param.Bool(False, "Generate SEI to signal internal issues")
local_VSEIs = Param.Bool(False, "Generate VSEI to signal internal issues")
ITS_use_physical_target_addresses = Param.Bool(
True,
"Use physical "
"hardware adresses for targets in ITS commands -- must be true "
"for distributed implementations",
)
ITS_hardware_collection_count = Param.Unsigned(
0, "Number of hardware collections held exclusively in the ITS"
)
ITS_MOVALL_update_collections = Param.Bool(
False, "Whether MOVALL command updates the collection entires"
)
ITS_TRANSLATE64R = Param.Bool(
False,
"Add an implementation specific "
"register at 0x10008 supporting 64 bit TRANSLATER (dev[63:32], "
"interupt[31:0])",
)
enable_protocol_checking = Param.Bool(
False, "Enable/disable protocol checking at cpu interface"
)
fixed_routed_spis = Param.String(
"",
"Value of IROUTER[n] register in the "
"form 'n=a.b.c.d, n=*'. The RM bit of IROUTER is 0 when n=a.b.c.d "
"is used else 1 when n=* is used. n can be >= 32 and <= 1019",
)
irouter_default_mask = Param.String(
"",
"Default Mask value for "
"IROUTER[32..1019] register in the form 'a.b.c.d'",
)
irouter_default_reset = Param.String(
"",
"Default Reset Value of "
"IROUTER[32..1019] register in the form 'a.b.c.d' or *",
)
irouter_reset_values = Param.String(
"",
"Reset Value of IROUTER[n] "
"register in the form 'n=a.b.c.d or n=*'.n can be >= 32 and "
"<= 1019",
)
irouter_mask_values = Param.String(
"",
"Mask Value of IROUTER[n] register "
"in the form 'n=a.b.c.d'.n can be >= 32 and <= 1019",
)
ITS_threaded_command_queue = Param.Bool(
True,
"Enable execution of ITS "
"commands in a separate thread which is sometimes required for "
"cosimulation",
)
ITS_legacy_iidr_typer_offset = Param.Bool(
False,
"Put the GITS_IIDR and "
"GITS_TYPER registers at their older offset of 0x8 and 0x4 "
"respectively",
)
redistributor_threaded_command_queue = Param.Bool(
True,
"Enable execution "
"of redistributor delayed transactions in a separate thread which "
"is sometimes required for cosimulation",
)
ignore_generate_sgi_when_no_are = Param.Bool(
False,
"Ignore GenerateSGI "
"packets coming form the CPU interface if both ARE_S and ARE_NS "
"are 0",
)
trace_speculative_lpi_property_updates = Param.Bool(
False,
"Trace LPI "
"propery updates performed on speculative accesses (useful for "
"debuging LPI)",
)
virtual_lpi_support = Param.Bool(
False,
"GICv4 Virtual LPIs and Direct injection of Virtual LPIs supported",
)
virtual_priority_bits = Param.Unsigned(
5, "Number of implemented virtual priority bits"
)
LPI_cache_type = Param.Unsigned(
1, "Cache type for LPIs, 0:No caching, 1:Full caching"
)
LPI_cache_check_data = Param.Bool(
False,
"Enable Cached LPI data against "
"memory checking when available for cache type",
)
DPG_bits_implemented = Param.Bool(
False,
"Enable implementation of "
"interrupt group participation bits or DPG bits in GICR_CTLR",
)
DPG_ARE_only = Param.Bool(
False,
"Limit application of DPG bits to interrupt groups for which ARE=1",
)
ARE_fixed_to_one = Param.Bool(
False,
"GICv2 compatibility is not "
"supported and GICD_CTLR.ARE_* is always one",
)
legacy_sgi_enable_rao = Param.Bool(
False, "Enables for SGI associated with an ARE=0 regime are RAO/WI"
)
pa_size = Param.Unsigned(48, "Number of valid bits in physical address")
MSI_IIDR = Param.UInt32(0x0, "Value returned in MSI_IIDR registers.")
MSI_NS_frame0_base = Param.Addr(
0x0,
"If non-zero, sets the base "
"address used for non-secure MSI frame 0 registers.",
)
MSI_NS_frame0_max_SPI = Param.UInt16(
0,
"Maximum SPI ID supported by "
"non-secure MSI frame 0. Set to 0 to disable frame.",
)
MSI_NS_frame0_min_SPI = Param.UInt16(
0,
"Minimum SPI ID supported by "
"non-secure MSI frame 0. Set to 0 to disable frame.",
)
MSI_NS_frame1_base = Param.Addr(
0x0,
"If non-zero, sets the base "
"address used for non-secure MSI frame 1 registers.",
)
MSI_NS_frame1_max_SPI = Param.UInt16(
0,
"Maximum SPI ID supported by "
"non-secure MSI frame 1. Set to 0 to disable frame.",
)
MSI_NS_frame1_min_SPI = Param.UInt16(
0,
"Minimum SPI ID supported by "
"non-secure MSI frame 1. Set to 0 to disable frame.",
)
MSI_NS_frame2_base = Param.Addr(
0x0,
"If non-zero, sets the base address "
"used for non-secure MSI frame 2 registers.",
)
MSI_NS_frame2_max_SPI = Param.UInt16(
0,
"Maximum SPI ID supported by "
"non-secure MSI frame 2. Set to 0 to disable frame.",
)
MSI_NS_frame2_min_SPI = Param.UInt16(
0,
"Minimum SPI ID supported by "
"non-secure MSI frame 2. Set to 0 to disable frame.",
)
MSI_NS_frame3_base = Param.Addr(
0x0,
"If non-zero, sets the base address "
"used for non-secure MSI frame 3 registers.",
)
MSI_NS_frame3_max_SPI = Param.UInt16(
0,
"Maximum SPI ID supported by "
"non-secure MSI frame 3. Set to 0 to disable frame.",
)
MSI_NS_frame3_min_SPI = Param.UInt16(
0,
"Minimum SPI ID supported by "
"non-secure MSI frame 3. Set to 0 to disable frame.",
)
MSI_NS_frame4_base = Param.Addr(
0x0,
"If non-zero, sets the base address "
"used for non-secure MSI frame 4 registers.",
)
MSI_NS_frame4_max_SPI = Param.UInt16(
0,
"Maximum SPI ID supported by "
"non-secure MSI frame 4. Set to 0 to disable frame.",
)
MSI_NS_frame4_min_SPI = Param.UInt16(
0,
"Minimum SPI ID supported by "
"non-secure MSI frame 4. Set to 0 to disable frame.",
)
MSI_NS_frame5_base = Param.Addr(
0x0,
"If non-zero, sets the base address "
"used for non-secure MSI frame 5 registers.",
)
MSI_NS_frame5_max_SPI = Param.UInt16(
0,
"Maximum SPI ID supported by "
"non-secure MSI frame 5. Set to 0 to disable frame.",
)
MSI_NS_frame5_min_SPI = Param.UInt16(
0,
"Minimum SPI ID supported by "
"non-secure MSI frame 5. Set to 0 to disable frame.",
)
MSI_NS_frame6_base = Param.Addr(
0x0,
"If non-zero, sets the base address "
"used for non-secure MSI frame 6 registers.",
)
MSI_NS_frame6_max_SPI = Param.UInt16(
0,
"Maximum SPI ID supported by "
"non-secure MSI frame 6. Set to 0 to disable frame.",
)
MSI_NS_frame6_min_SPI = Param.UInt16(
0,
"Minimum SPI ID supported by "
"non-secure MSI frame 6. Set to 0 to disable frame.",
)
MSI_NS_frame7_base = Param.Addr(
0x0,
"If non-zero, sets the base address "
"used for non-secure MSI frame 7 registers.",
)
MSI_NS_frame7_max_SPI = Param.UInt16(
0,
"Maximum SPI ID supported by "
"non-secure MSI frame 7. Set to 0 to disable frame.",
)
MSI_NS_frame7_min_SPI = Param.UInt16(
0,
"Minimum SPI ID supported by "
"non-secure MSI frame 7. Set to 0 to disable frame.",
)
MSI_PIDR = Param.UInt64(
0x0,
"The value for the MSI_PIDR registers, if "
"non-zero and distributor supports GICv2m. Note: fixed fields "
"(device type etc.) will be overriden in this value.",
)
MSI_S_frame0_base = Param.Addr(
0x0,
"If non-zero, sets the base address "
"used for secure MSI frame 0 registers.",
)
MSI_S_frame0_max_SPI = Param.UInt16(
0,
"Maximum SPI ID supported by "
"secure MSI frame 0. Set to 0 to disable frame.",
)
MSI_S_frame0_min_SPI = Param.UInt16(
0,
"Minimum SPI ID supported by "
"secure MSI frame 0. Set to 0 to disable frame.",
)
MSI_S_frame1_base = Param.Addr(
0x0,
"If non-zero, sets the base address "
"used for secure MSI frame 1 registers.",
)
MSI_S_frame1_max_SPI = Param.UInt16(
0,
"Maximum SPI ID supported by "
"secure MSI frame 1. Set to 0 to disable frame.",
)
MSI_S_frame1_min_SPI = Param.UInt16(
0,
"Minimum SPI ID supported by "
"secure MSI frame 1. Set to 0 to disable frame.",
)
MSI_S_frame2_base = Param.Addr(
0x0,
"If non-zero, sets the base address "
"used for secure MSI frame 2 registers.",
)
MSI_S_frame2_max_SPI = Param.UInt16(
0,
"Maximum SPI ID supported by "
"secure MSI frame 2. Set to 0 to disable frame.",
)
MSI_S_frame2_min_SPI = Param.UInt16(
0,
"Minimum SPI ID supported by "
"secure MSI frame 2. Set to 0 to disable frame.",
)
MSI_S_frame3_base = Param.Addr(
0x0,
"If non-zero, sets the base address "
"used for secure MSI frame 3 registers.",
)
MSI_S_frame3_max_SPI = Param.UInt16(
0,
"Maximum SPI ID supported by "
"secure MSI frame 3. Set to 0 to disable frame.",
)
MSI_S_frame3_min_SPI = Param.UInt16(
0,
"Minimum SPI ID supported by "
"secure MSI frame 3. Set to 0 to disable frame.",
)
MSI_S_frame4_base = Param.Addr(
0x0,
"If non-zero, sets the base address "
"used for secure MSI frame 4 registers.",
)
MSI_S_frame4_max_SPI = Param.UInt16(
0,
"Maximum SPI ID supported by "
"secure MSI frame 4. Set to 0 to disable frame.",
)
MSI_S_frame4_min_SPI = Param.UInt16(
0,
"Minimum SPI ID supported by "
"secure MSI frame 4. Set to 0 to disable frame.",
)
MSI_S_frame5_base = Param.Addr(
0x0,
"If non-zero, sets the base address "
"used for secure MSI frame 5 registers.",
)
MSI_S_frame5_max_SPI = Param.UInt16(
0,
"Maximum SPI ID supported by "
"secure MSI frame 5. Set to 0 to disable frame.",
)
MSI_S_frame5_min_SPI = Param.UInt16(
0,
"Minimum SPI ID supported by "
"secure MSI frame 5. Set to 0 to disable frame.",
)
MSI_S_frame6_base = Param.Addr(
0x0,
"If non-zero, sets the base address "
"used for secure MSI frame 6 registers.",
)
MSI_S_frame6_max_SPI = Param.UInt16(
0,
"Maximum SPI ID supported by "
"secure MSI frame 6. Set to 0 to disable frame.",
)
MSI_S_frame6_min_SPI = Param.UInt16(
0,
"Minimum SPI ID supported by "
"secure MSI frame 6. Set to 0 to disable frame.",
)
MSI_S_frame7_base = Param.Addr(
0x0,
"If non-zero, sets the base address "
"used for secure MSI frame 7 registers.",
)
MSI_S_frame7_max_SPI = Param.UInt16(
0,
"Maximum SPI ID supported by "
"secure MSI frame 7. Set to 0 to disable frame.",
)
MSI_S_frame7_min_SPI = Param.UInt16(
0,
"Minimum SPI ID supported by "
"secure MSI frame 7. Set to 0 to disable frame.",
)
outer_cacheability_support = Param.Bool(
False,
"Allow configuration of "
"outer cachability attributes in ITS and Redistributor",
)
wakeup_on_reset = Param.Bool(
False,
"Go against specification and start "
"redistributors in woken-up state at reset. This allows software "
"that was written for previous versions of the GICv3 "
"specification to work correctly. This should not be used for "
"production code or when the distributor is used separately from "
"the core fast model.",
)
SPI_MBIS = Param.Bool(
True, "Distributor supports meassage based signaling of SPI"
)
SPI_unimplemented = Param.String(
"",
"A comma spearated list of "
"unimplemented SPIs ranges for sparse SPI defintion(for ex: "
"'35, 39-42, 73)'",
)
irm_razwi = Param.Bool(
False, "GICD_IROUTERn.InterruptRoutingMode is RAZ/WI"
)
common_LPI_configuration = Param.Unsigned(
0,
"Describes which "
"re-distributors share (and must be configured with the same) "
"LPI configuration table as described in GICR_TYPER( 0:All, "
"1:A.x.x.x, 2:A.B.x.x, 3:A.B.C.x",
)
single_set_support = Param.Bool(
False,
"When true, forces redistributors "
"to recall interrupts with a clear rather than issue a second Set "
"command",
)
has_mpam = Param.Unsigned(
0,
"Implement ARMv8.4 MPAM Registers and "
"associated functionality.\n\nPossible values of this parameter "
"are:\n - 0, feature is not enabled.\n - 1, feature is "
"implemented if ARMv8.4 is enabled.\n - 2, feature is "
"implemented.",
)
mpam_max_partid = Param.UInt16(0xFFFF, "MPAM Maximum PARTID Supported")
mpam_max_pmg = Param.Unsigned(255, "MPAM Maximum PMG Supported")
output_attributes = Param.String(
"ExtendedID[62:55]=MPAM_PMG, "
"ExtendedID[54:39]=MPAM_PARTID, ExtendedID[38]=MPAM_NS",
"User-defined transform to be applied to bus attributes like "
"RequestorID, ExtendedID or UserFlags. Currently, only works for "
"MPAM Attributes encoding into bus attributes.",
)
has_DirtyVLPIOnLoad = Param.Bool(
False,
"GICR_VPENDBASER.Dirty reflects "
"transient loading state when valid=1",
)
allow_LPIEN_clear = Param.Bool(
False, "Allow RW behaviour on GICR_CTLR.LPIEN isntead of set once"
)
GICD_legacy_reg_reserved = Param.Bool(
False,
"When ARE is RAO/WI, makes "
"superfluous registers in GICD reserved (including for the "
"purpose of STATUSR updates)",
)
extended_spi_count = Param.Unsigned(0, "Number of extended SPI supported")
extended_ppi_count = Param.Unsigned(0, "Number of extended PPI supported")
consolidators = Param.String(
"",
"Specify consolidators' base addresses, "
"interrupt line counts and base interrupt IDs, in the form "
"'baseAddr0:itlineCount0:baseINTID0, "
"baseAddr1:itlineCount1:baseINTID1, [etc]' "
"(eg '0x3f100000:64:4096, 0x3f200000:64:4224'). The "
"consolidators' count is inferred from the list (maximum of 4). "
"If not specified, the component contains no consolidators.",
)
class FastModelGIC(BaseGic):
type = "FastModelGIC"
cxx_class = "gem5::fastmodel::GIC"
cxx_header = "arch/arm/fastmodel/GIC/gic.hh"
sc_gic = Param.SCFastModelGIC(
SCFastModelGIC(), "SystemC version of the GIC"
)
amba_m = AmbaInitiatorSocket(64, "Memory initiator socket")
amba_s = AmbaTargetSocket(64, "Memory target socket")
redistributor = VectorGicv3CommsInitiatorSocket(
"GIC communication initiator"
)
wake_request = VectorIntSourcePin("GIC wake request initiator")
reset = ResetResponsePort("Reset")
po_reset = ResetResponsePort("Power on reset")
# Used for DTB autogeneration
_state = FdtState(addr_cells=2, size_cells=2, interrupt_cells=3)
def get_redist_bases(self):
"""
The format of reg_base_per_redistributor is
'0.0.0.0=0x2c010000,0.0.0.1=0x2c020000...'
Return an array of base addresses
"""
redists = self.sc_gic.reg_base_per_redistributor.split(",")
# make sure we have at least one redistributor
assert len(redists) > 0 and "=" in redists[0]
return [int(r.split("=")[1], 16) for r in redists]
def get_addr_ranges(self):
"""Return address ranges that should be served by this GIC"""
sc_gic = self.sc_gic
gic_frame_size = 0x10000
# Add range of distributor
ranges = [AddrRange(sc_gic.reg_base, size=gic_frame_size)]
# Add ranges of redistributors
redist_frame_size = gic_frame_size * (4 if sc_gic.has_gicv4_1 else 2)
ranges += [
AddrRange(redist_base, size=redist_frame_size)
for redist_base in self.get_redist_bases()
]
# Add ranges of ITSs
its_bases = [
sc_gic.its0_base,
sc_gic.its1_base,
sc_gic.its2_base,
sc_gic.its3_base,
]
ranges += [
AddrRange(its_bases[i], size=2 * gic_frame_size)
for i in range(sc_gic.its_count)
]
return ranges
def interruptCells(self, int_type, int_num, int_trigger, int_affinity=0):
"""
Interupt cells generation helper:
Following specifications described in
Documentation/devicetree/bindings/interrupt-controller/arm,gic-v3.txt
"""
prop = self._state.interruptCells(0)
assert len(prop) >= 3
prop[0] = int_type
prop[1] = int_num
prop[2] = int_trigger
return prop
def generateDeviceTree(self, state):
sc_gic = self.sc_gic
node = FdtNode("interrupt-controller")
node.appendCompatible(["arm,gic-v3"])
node.append(self._state.interruptCellsProperty())
node.append(self._state.addrCellsProperty())
node.append(self._state.sizeCellsProperty())
node.append(FdtProperty("ranges"))
node.append(FdtProperty("interrupt-controller"))
redist_stride = 0x40000 if sc_gic.has_gicv4_1 else 0x20000
node.append(
FdtPropertyWords(
"redistributor-stride", state.sizeCells(redist_stride)
)
)
regs = (
state.addrCells(sc_gic.reg_base)
+ state.sizeCells(0x10000)
+ state.addrCells(self.get_redist_bases()[0])
+ state.sizeCells(0x2000000)
)
node.append(FdtPropertyWords("reg", regs))
# Maintenance interrupt (PPI 25).
node.append(
FdtPropertyWords("interrupts", self.interruptCells(1, 9, 0x4))
)
node.appendPhandle(self)
# Generate the ITS device tree
its_frame_size = 0x10000
its_bases = [
sc_gic.its0_base,
sc_gic.its1_base,
sc_gic.its2_base,
sc_gic.its3_base,
]
for its_base in its_bases:
its_node = self.generateBasicPioDeviceNode(
state, "gic-its", its_base, 2 * its_frame_size
)
its_node.appendCompatible(["arm,gic-v3-its"])
its_node.append(FdtProperty("msi-controller"))
its_node.append(FdtPropertyWords("#msi-cells", [1]))
node.append(its_node)
yield node