arch/arm64: add DSB ISB where necessary

Signed-off-by: Xu Xingliang <xuxingliang@xiaomi.com>
This commit is contained in:
Xu Xingliang
2024-05-23 17:11:47 +08:00
committed by Xiang Xiao
parent e40cbfd589
commit ba25ee6725
+22
View File
@@ -295,6 +295,13 @@ unsigned int arm64_gic_get_active_irq(void)
intid = read_sysreg(ICC_IAR1_EL1);
/* The ARM GICv3 specification states in 4.1.1 Physical CPU Interface:
* The effects of reading ICC_IAR0_EL1 and ICC_IAR1_EL1
* on the state of a returned INTID are not guaranteed
* to be visible until after the execution of a DSB.
*/
ARM64_DSB();
return intid;
}
@@ -307,6 +314,13 @@ unsigned int arm64_gic_get_active_fiq(void)
intid = read_sysreg(ICC_IAR0_EL1);
/* The ARM GICv3 specification states in 4.1.1 Physical CPU Interface:
* The effects of reading ICC_IAR0_EL1 and ICC_IAR1_EL1
* on the state of a returned INTID are not guaranteed
* to be visible until after the execution of a DSB.
*/
ARM64_DSB();
return intid;
}
#endif
@@ -329,6 +343,8 @@ void aarm64_gic_eoi_irq(unsigned int intid)
/* (AP -> Pending) Or (Active -> Inactive) or (AP to AP) nested case */
write_sysreg(intid, ICC_EOIR1_EL1);
ARM64_ISB();
}
#ifdef CONFIG_ARM64_DECODEFIQ
@@ -350,6 +366,7 @@ void arm64_gic_eoi_fiq(unsigned int intid)
/* (AP -> Pending) Or (Active -> Inactive) or (AP to AP) nested case */
write_sysreg(intid, ICC_EOIR0_EL1);
ARM64_ISB();
}
#endif
@@ -506,6 +523,9 @@ static void gicv3_cpuif_init(void)
(icc_sre | ICC_SRE_ELX_SRE_BIT | ICC_SRE_ELX_DIB_BIT |
ICC_SRE_ELX_DFB_BIT);
write_sysreg(icc_sre, ICC_SRE_EL1);
ARM64_ISB();
icc_sre = read_sysreg(ICC_SRE_EL1);
ASSERT(icc_sre & ICC_SRE_ELX_SRE_BIT);
@@ -520,6 +540,8 @@ static void gicv3_cpuif_init(void)
#ifdef CONFIG_ARM64_DECODEFIQ
write_sysreg(1, ICC_IGRPEN0_EL1);
#endif
ARM64_ISB();
}
static void gicv3_dist_init(void)