Owners manual
System
H3 Datasheet(Revision1.2) Copyright© 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