Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Chapter 9: Memory Partitioning and Monitoring

This chapter describes Memory Partitioning and Monitoring (MPAM) as it applies to the GICv3 architecture. It contains the following sections:

  • Overview.

  • MPAM and the Redistributors.

  • MPAM and the ITS.

  • GIC usage of MPAM.

  • GICv4.1 data structures and MPAM.

9.1 Overview

The GIC optionally supports MPAM. This support is limited to providing controls for software to set the Partition IDs (PARTIDs) that are used when the GIC accesses memory. A PARTID is an MPAM ID that indicates which memory system performance resource partition to use in the memory system components.

When GICD_CTLR.DS == 0, all PARTIDs that are used by the GIC are Non-secure MPAM IDs, and are communicated with the MPAM_NS indicator as true.

When GICD_CTLR.DS == 1, whether PARTIDs are Non-secure or Secure MPAM IDs is IMPLEMENTATION DEFINED.

Arm recommends that in a system that supports MPAM, software is able to control the PARTID that is used by the GIC when accessing data structures and the structures in memory.

See the following sections for more details on these structures:

  • LPI Configuration tables.

  • LPI Pending tables.

  • Virtual LPI Configuration tables and virtual LPI Pending tables.

  • The Device table.

  • The Interrupt translation table.

  • The Collection table.

  • The vPE table.

  • The ITS command interface.

9.2 MPAM and the Redistributors

GICR_TYPER.MPAM reports support for MPAM, and all Redistributors that are part of the same IRI report the same value of GICR_TYPER.MPAM.

GICR_MPAMIDR reports the PMG and PARTID sizes that are supported.

GICR_PARTIDR controls the PARTID and PMG that are used by the Redistributor.

Writing an out-of-range value to GICR_PARTIDR.PARTID results in CONSTRAINED UNPREDICTABLE behavior, and either:

  • The default values of PARTID and PMG are used, and returned on reads.

  • An UNKNOWN valid value is used, and returned on reads.

Writing an out-of-range value to GICR_PARTIDR.PMG results in CONSTRAINED UPREDICTABLE behavior, and either:

  • The default PMG value is used, and returned on reads.

  • An UNKNOWN valid value is used, and returned on reads.

A write to GICR_PARTIDR is only guaranteed to take effect the next time GICR_CTLR.Enable_LPIs is written from 0 to 1. An implementation must ensure that either the old value or the new value is used, and that at no point a partially updated value is used.

Note

Arm strongly recommends that software does not write GICR_PARTIDR while GICR_CTLR.Enable_LPIs == 1, because of the uncertainty of when the change takes effect.

For Redistributors that are required to share an LPI Configuration table, it is IMPLEMENTATION DEFINED whether GICR_PARTIDR accesses common state. GICR_TYPER.CommonLPIAff indicates which Redistributors are required to share an LPI Configuration table.

When GICR_TYPER.MPAM == 1, all accesses by the Redistributor to the following data structures use the PARTID and PMG values that are specified in GICR_PARTIDR:

  • LPI Pending table.

  • LPI Configuration table.

  • Virtual LPI Pending table.

  • Virtual LPI Configuration table.

9.3 MPAM and the ITS

GITS_TYPER.MPAM reports support for MPAM, and all ITSs that are part of the same IRI report the same value of GITS_TYPER.MPAM.

GITS_MPAMIDR reports the PMG and PARTID sizes that are supported.

GITS_PARTIDR controls the PARTID and PMG that are used by the ITS.

Writing an out-of-range value to GITS_PARTIDR.PARTID results in CONSTRAINED UNPREDICTABLE behavior, and either:

  • The default values of PARTID and PMG are used, and returned on reads.

  • An UNKNOWN valid value is used, and returned on reads.

Writing an out-of-range value to GITS_PARTIDR.PMG results in CONSTRAINED UPREDICTABLE behavior, and either:

  • The default PMG value is used, and returned on reads.

  • An UNKNOWN valid value is used, and returned on reads.

A write to GITS_PARTIDR is only guaranteed to take effect the next time GITS_CTLR.Enable is written from 0 to 1. An implementation must ensure that either the old value or the new value is used, and that at no point a partially updated value is used.

Note

Arm strongly recommends that software does not write GITS_PARTIDR while GITS_CTLR.Enable == 1, because of the uncertainty of when the change takes effect.

When GITS_TYPER.MPAM == 1, all accesses by the Redistributor to the following data structures use PARTID and PMG values that are specified in GITS_PARTIDR:

  • Device table.

  • Interruption Translation table.

  • Collection table.

  • Virtual PE table.

  • Command queue.

9.4 GIC usage of MPAM

This extension is limited to providing a mechanism for software to specify the PARTIDs that are used by the GIC when accessing memory.

Any support for using PARTIDs to internally partition resources or monitor performance is IMPLEMENTATION DEFINED.

Where an implementation provides such support, Arm expects it to do so in accordance with what is described in the Arm[®] Architecture Reference Manual Supplement, Memory System Resource Partitioning and Monitoring (MPAM), for Armv8-A .

9.5 GICv4.1 data structures and MPAM

When MPAM is supported, and GITS_TYPER.SVPET==0, accesses to the vPE Configuration Table use the PARTID and PMG values from GICR_PARTIDR.

When MPAM is supported, and GITS_TYPER.SVPET!=0, accesses to the vPE Configuration Table use the PARTID and PMG values from:

Table 9-1 PARTID usage in GICv4.1 |—|—|—| | GICR_VPROPBASER.Valid | GITS_CTLR.Enabled | MPAM information from: | | x | 1 | GITS_PARTIDR | | 0 | 1 | GITS_PARTIDR | | 1 | 1 | GICR_PARTIDRorGITS_PARTIDR | | 1 | 0 | GICR_PARTIDR |

When the vPE Configuration Table is shared between the Redistributor(s) and ITS(s), either the Redistributors or ITS PARTID and PMG values can be used to access the table, and this can vary depending on the cause of the access.