<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE register_page SYSTEM "registers.dtd">
<!-- Copyright (c) 2010-2026 Arm Limited or its affiliates. All rights reserved. -->
<!-- This document is Non-Confidential. This document may only be used and distributed in accordance with the terms of the agreement entered into by Arm and the party that Arm delivered this document to. -->
<!--The data contained in this document is preliminary and subject to change or correction following further review. -->
<?xml-stylesheet href="one_register.xsl" type="text/xsl" ?>







<register_page>
  <registers>
  
    <register execution_state="AArch64" is_register="True" is_internal="True" is_stub_entry="False">
      <reg_short_name>ICC_DIR_EL1</reg_short_name>
        
        <reg_long_name>Interrupt Controller Deactivate Interrupt Register</reg_long_name>



      
            <reg_condition otherwise="UNDEFINED">when GICv3 is implemented and FEAT_AA64 is implemented</reg_condition>
      




          <reg_reset_value></reg_reset_value>

      <reg_mappings>
        



    
      
      <reg_mapping>
        
  

    

  

    <mapped_name filename="AArch32-icc_dir.xml">ICC_DIR</mapped_name>
  <mapped_type>Functional</mapped_type>
      <mapped_execution_state>AArch32</mapped_execution_state>
    <mapped_from_startbit>31</mapped_from_startbit>
    <mapped_from_endbit>0</mapped_from_endbit>
    <mapped_to_startbit>31</mapped_to_startbit>
    <mapped_to_endbit>0</mapped_to_endbit>
    <mapped_from_rangeset output="31:0">
      <range>
        <msb>31</msb>
        <lsb>0</lsb>
      </range>
    </mapped_from_rangeset>
    <mapped_to_rangeset output="31:0">
      <range>
        <msb>31</msb>
        <lsb>0</lsb>
      </range>
    </mapped_to_rangeset>

      </reg_mapping>

      </reg_mappings>

        <reg_purpose>
          
    
      <purpose_text>
        <para>When interrupt priority drop is separated from interrupt deactivation, a write to this register deactivates the specified interrupt.</para>
      </purpose_text>

        </reg_purpose>

      <reg_groups>
            <reg_group>GIC control registers</reg_group>
            <reg_group>GIC</reg_group>
      </reg_groups>
      
      
        
      <reg_attributes>
          
    
      <attributes_text>
        <para>ICC_DIR_EL1 is a 64-bit register.</para>
      </attributes_text>

      </reg_attributes>
      <reg_fieldsets>
        






<fields id="fieldset_0" length="64">
  <text_before_fields/>
  <field id="fieldset_0-63_24" has_partial_fieldset="False" is_linked_to_partial_fieldset="False" is_access_restriction_possible="False" is_variable_length="False" is_constant_value="False" is_partial_field="False" is_conditional_field_name="False" rwtype="RES0">
    <field_msb>63</field_msb>
    <field_lsb>24</field_lsb>
    <rel_range>63:24</rel_range>
    <field_description order="before"/>
    <field_description order="before">
      <para>Reserved, <arm-defined-word>RES0</arm-defined-word>.</para>
    </field_description>
  </field>
  <field id="fieldset_0-23_0" has_partial_fieldset="False" is_linked_to_partial_fieldset="False" is_access_restriction_possible="False" is_variable_length="False" is_constant_value="False" is_partial_field="False" is_conditional_field_name="False">
    <field_name>INTID</field_name>
    <field_msb>23</field_msb>
    <field_lsb>0</field_lsb>
    <rel_range>23:0</rel_range>
    <field_description order="before"><para>The INTID of the interrupt to be deactivated.</para>
<para>This field has either 16 or 24 bits implemented. The number of implemented bits can be found in <register_link state="AArch64" id="AArch64-icc_ctlr_el1.xml">ICC_CTLR_EL1</register_link>.IDbits and <register_link state="AArch64" id="AArch64-icc_ctlr_el3.xml">ICC_CTLR_EL3</register_link>.IDbits. If only 16 bits are implemented, bits [23:16] of this register are <arm-defined-word>RES0</arm-defined-word>.</para></field_description>
  </field>
  <text_after_fields/>
</fields>




<reg_fieldset length="64">
  <fieldat id="fieldset_0-63_24" msb="63" lsb="24"/>
  <fieldat id="fieldset_0-23_0" msb="23" lsb="0"/>
</reg_fieldset>


      </reg_fieldsets>

      <access_mechanisms>
          


  
    
      <access_permission_text>
        <para>There are two cases when writing to <register_link state="AArch64" id="AArch64-icc_dir_el1.xml">ICC_DIR_EL1</register_link> that were <arm-defined-word>UNPREDICTABLE</arm-defined-word> for a corresponding GICv2 write to <register_link state="ext" id="ext-gicc_dir.xml">GICC_DIR</register_link>:</para>

      </access_permission_text>
      <access_permission_text>
        <list type="unordered">
<listitem><content>When EOImode == 0. GICv3 implementations must ignore such writes. In systems supporting system error generation, an implementation might generate an SEI.</content>
</listitem><listitem><content>When EOImode == 1 but no EOI has been issued. The interrupt will be deactivated by the Distributor, however the active priority in the CPU interface for the interrupt will remain set (because no EOI was issued).</content>
</listitem></list>
      </access_permission_text>





    
        
        <access_mechanism accessor="MSRregister ICC_DIR_EL1" type="SystemAccessor">
            <encoding>
            <access_instruction>MSR ICC_DIR_EL1, &lt;Xt&gt;</access_instruction>
                
                <enc n="op0" v="0b11"/>
                
                <enc n="op1" v="0b000"/>
                
                <enc n="CRn" v="0b1100"/>
                
                <enc n="CRm" v="0b1011"/>
                
                <enc n="op2" v="0b001"/>
            </encoding>
            <access_permission>
                <ps name="MSRregister" sections="1" secttype="access_permission">
                <pstext>
if !(IsFeatureImplemented(FEAT_GICv3) &amp;&amp; IsFeatureImplemented(FEAT_AA64)) then
    Undefined();
elsif PSTATE.EL == EL0 then
    Undefined();
elsif PSTATE.EL == EL1 then
    if HaveEL(EL3) &amp;&amp; EL3SDDUndefPriority() &amp;&amp; SCR_EL3().[IRQ,FIQ] == '11' then
        Undefined();
    elsif ICC_SRE_EL1().SRE == '0' then
        AArch64_SystemAccessTrap(EL1, 0x18);
    elsif EL2Enabled() &amp;&amp; ICH_HCR_EL2().TDIR == '1' then
        AArch64_SystemAccessTrap(EL2, 0x18);
    elsif EL2Enabled() &amp;&amp; ICH_HCR_EL2().TC == '1' then
        AArch64_SystemAccessTrap(EL2, 0x18);
    elsif EL2Enabled() &amp;&amp; HCR_EL2().FMO == '1' then
        ICV_DIR_EL1() = X{64}(t);
    elsif EL2Enabled() &amp;&amp; HCR_EL2().IMO == '1' then
        ICV_DIR_EL1() = X{64}(t);
    elsif HaveEL(EL3) &amp;&amp; SCR_EL3().[IRQ,FIQ] == '11' then
        if EL3SDDUndef() then
            Undefined();
        else
            AArch64_SystemAccessTrap(EL3, 0x18);
        end;
    else
        ICC_DIR_EL1() = X{64}(t);
    end;
elsif PSTATE.EL == EL2 then
    if HaveEL(EL3) &amp;&amp; EL3SDDUndefPriority() &amp;&amp; SCR_EL3().[IRQ,FIQ] == '11' then
        Undefined();
    elsif ICC_SRE_EL2().SRE == '0' then
        AArch64_SystemAccessTrap(EL2, 0x18);
    elsif HaveEL(EL3) &amp;&amp; SCR_EL3().[IRQ,FIQ] == '11' then
        if EL3SDDUndef() then
            Undefined();
        else
            AArch64_SystemAccessTrap(EL3, 0x18);
        end;
    else
        ICC_DIR_EL1() = X{64}(t);
    end;
elsif PSTATE.EL == EL3 then
    if ICC_SRE_EL3().SRE == '0' then
        AArch64_SystemAccessTrap(EL3, 0x18);
    else
        ICC_DIR_EL1() = X{64}(t);
    end;
end;
                </pstext>
                </ps>
            </access_permission>
        </access_mechanism>

      </access_mechanisms>

      <arch_variants>
      </arch_variants>
  </register>
</registers>
<timestamp>2026-03-26 20:27:25</timestamp>
<commit_id>2026-03_rel</commit_id>
</register_page>