static void imx_pen_lock(uint32_t cpu) { uint32_t cpuidle_ocram_base; struct imx7_pm_info *p; cpuidle_ocram_base = core_mmu_get_va(TRUSTZONE_OCRAM_START + LOWPOWER_IDLE_OCRAM_OFFSET, MEM_AREA_TEE_COHERENT); p = (struct imx7_pm_info *)cpuidle_ocram_base; if (cpu == 0) { atomic_store_u32(&p->flag0, 1); dsb(); atomic_store_u32(&p->val, cpu); do { dsb(); } while (atomic_load_u32(&p->flag1) == 1 && atomic_load_u32(&p->val) == cpu) ; } else { atomic_store_u32(&p->flag1, 1); dsb(); atomic_store_u32(&p->val, cpu); do { dsb(); } while (atomic_load_u32(&p->flag0) == 1 && atomic_load_u32(&p->val) == cpu) ; } }
TEST(AtomicTest, test_store_load_u32) { atomic_u32_t data; atomic_store_u32(&data, -1); EXPECT_EQ((uint32_t)-1, atomic_load_u32(&data)); atomic_store_u32(&data, 0); EXPECT_EQ((uint32_t)0, atomic_load_u32(&data)); atomic_store_u32(&data, 1); EXPECT_EQ((uint32_t)1, atomic_load_u32(&data)); atomic_store_u32(&data, 2); EXPECT_EQ((uint32_t)2, atomic_load_u32(&data)); }
static void imx_pen_unlock(int cpu) { uint32_t cpuidle_ocram_base; struct imx7_pm_info *p; cpuidle_ocram_base = core_mmu_get_va(TRUSTZONE_OCRAM_START + LOWPOWER_IDLE_OCRAM_OFFSET, MEM_AREA_TEE_COHERENT); p = (struct imx7_pm_info *)cpuidle_ocram_base; dsb(); if (cpu == 0) atomic_store_u32(&p->flag0, 0); else atomic_store_u32(&p->flag1, 0); }
TEST(AtomicTest, test_inc_dec_u32) { atomic_u32_t data; atomic_store_u32(&data, 0); EXPECT_EQ((unsigned)0, atomic_load_u32(&data)); uint32_t val = atomic_inc_prefix_u32(&data); EXPECT_EQ((unsigned)1, atomic_load_u32(&data)); EXPECT_EQ((unsigned)1, val); val = atomic_inc_prefix_u32(&data); EXPECT_EQ((unsigned)2, atomic_load_u32(&data)); EXPECT_EQ((unsigned)2, val); val = atomic_inc_prefix_u32(&data); EXPECT_EQ((unsigned)3, atomic_load_u32(&data)); EXPECT_EQ((unsigned)3, val); val = atomic_dec_prefix_u32(&data); EXPECT_EQ((unsigned)2, val); val = atomic_dec_prefix_u32(&data); EXPECT_EQ((unsigned)1, val); val = atomic_dec_prefix_u32(&data); EXPECT_EQ((unsigned)0, val); val = atomic_dec_prefix_u32(&data); EXPECT_EQ((unsigned)-1, val); }