Owners manual

System
H3 Datasheet(Revision1.2) Copyrigh 2015 Allwinner Technology Co.,Ltd.All Rights Reserved. Page 225
4.14.6. Programming Guidelines
Take CPU0's synchronization with CPUS with Spinlock0 for an example, CPU0 takes the spinlock0 firstly in the instance
CPU0
Step 1: CPU0 initializes Spinlock
writel(readl(BUS_GATING_REG1)|(1<<22) ,BUS_GATING_REG1); //open Spinlock clock gating
writel (readl(BUS_RST_REG1)|(1<<22) , BUS_RST_REG1); //software reset Spinlock
Step 2: CPU0 requests to take spinlock0
rdata=readl(SPINLOCK_STATUS_REG0); //check lock register0 status, if it is taken, check till
if(rdata != 0) rdata=readl(SPINLOCK_STATUS_REG0); // lock register0 is free
rdata=readl(SPINLOCKN_LOCK_REG0); //request to take spinlock0, if fail, retry till
if(rdata != 0) rdata=readl(SPINLOCKN_LOCK_REG0); // lock register0 is taken
---------- CPU0 critical code section ----------
Step 3: CPU0 free spinlock0
writel (0, SPINLOCKN_LOCK_REG0); //CPU0 frees spinlock0
Step 4: CPU0 waits for CPUS freeing spinlock0
writel (readl(SPINLOCK_STATUS_REG0) == 1); // CPU0 waits for CPUS freeing spinlock0
CPUS
Step 1: CPU0 has taken spinlock0, CPUS waits for CPU0 freeing spinlock0
while(readl(SPINLOCK_STATUS_REG0) == 1); // CPUS waits for CPU0 freeing spinlock0
Step 2: CPUS takes spinlock0 and go on
---------- CPUS critical code section ----------
Step 3: CPUS frees spinlock0
writel (0, SPINLOCKN_LOCK_REG0); //CPUS frees spinlock0
confidential