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);
}