1c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 2c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * linux/include/asm-arm/locks.h 3c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 4c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Copyright (C) 2000 Russell King 5c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 6c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * This program is free software; you can redistribute it and/or modify 7c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * it under the terms of the GNU General Public License version 2 as 8c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * published by the Free Software Foundation. 9c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 10c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Interrupt safe locking assembler. 11c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 12c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef __ASM_PROC_LOCKS_H 13c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __ASM_PROC_LOCKS_H 14c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 15c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#if __LINUX_ARM_ARCH__ >= 6 16c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 17c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __down_op(ptr,fail) \ 18c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ({ \ 19c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __asm__ __volatile__( \ 20c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "@ down_op\n" \ 21c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru"1: ldrex lr, [%0]\n" \ 22c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" sub lr, lr, %1\n" \ 23c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" strex ip, lr, [%0]\n" \ 24c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" teq ip, #0\n" \ 25c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" bne 1b\n" \ 26c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" teq lr, #0\n" \ 27c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" movmi ip, %0\n" \ 28c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" blmi " #fail \ 29c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : \ 30c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "r" (ptr), "I" (1) \ 31c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "ip", "lr", "cc"); \ 32c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru smp_mb(); \ 33c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru }) 34c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 35c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __down_op_ret(ptr,fail) \ 36c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ({ \ 37c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned int ret; \ 38c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __asm__ __volatile__( \ 39c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "@ down_op_ret\n" \ 40c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru"1: ldrex lr, [%1]\n" \ 41c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" sub lr, lr, %2\n" \ 42c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" strex ip, lr, [%1]\n" \ 43c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" teq ip, #0\n" \ 44c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" bne 1b\n" \ 45c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" teq lr, #0\n" \ 46c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" movmi ip, %1\n" \ 47c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" movpl ip, #0\n" \ 48c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" blmi " #fail "\n" \ 49c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" mov %0, ip" \ 50c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "=&r" (ret) \ 51c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "r" (ptr), "I" (1) \ 52c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "ip", "lr", "cc"); \ 53c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru smp_mb(); \ 54c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ret; \ 55c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru }) 56c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 57c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __up_op(ptr,wake) \ 58c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ({ \ 59c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru smp_mb(); \ 60c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __asm__ __volatile__( \ 61c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "@ up_op\n" \ 62c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru"1: ldrex lr, [%0]\n" \ 63c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" add lr, lr, %1\n" \ 64c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" strex ip, lr, [%0]\n" \ 65c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" teq ip, #0\n" \ 66c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" bne 1b\n" \ 67c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" cmp lr, #0\n" \ 68c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" movle ip, %0\n" \ 69c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" blle " #wake \ 70c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : \ 71c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "r" (ptr), "I" (1) \ 72c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "ip", "lr", "cc"); \ 73c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru }) 74c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 75c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 76c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * The value 0x01000000 supports up to 128 processors and 77c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * lots of processes. BIAS must be chosen such that sub'ing 78c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * BIAS once per CPU will result in the long remaining 79c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * negative. 80c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 81c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RW_LOCK_BIAS 0x01000000 82c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RW_LOCK_BIAS_STR "0x01000000" 83c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 84c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __down_op_write(ptr,fail) \ 85c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ({ \ 86c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __asm__ __volatile__( \ 87c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "@ down_op_write\n" \ 88c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru"1: ldrex lr, [%0]\n" \ 89c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" sub lr, lr, %1\n" \ 90c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" strex ip, lr, [%0]\n" \ 91c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" teq ip, #0\n" \ 92c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" bne 1b\n" \ 93c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" teq lr, #0\n" \ 94c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" movne ip, %0\n" \ 95c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" blne " #fail \ 96c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : \ 97c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "r" (ptr), "I" (RW_LOCK_BIAS) \ 98c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "ip", "lr", "cc"); \ 99c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru smp_mb(); \ 100c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru }) 101c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 102c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __up_op_write(ptr,wake) \ 103c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ({ \ 104c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru smp_mb(); \ 105c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __asm__ __volatile__( \ 106c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "@ up_op_write\n" \ 107c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru"1: ldrex lr, [%0]\n" \ 108c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" adds lr, lr, %1\n" \ 109c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" strex ip, lr, [%0]\n" \ 110c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" teq ip, #0\n" \ 111c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" bne 1b\n" \ 112c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" movcs ip, %0\n" \ 113c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" blcs " #wake \ 114c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : \ 115c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "r" (ptr), "I" (RW_LOCK_BIAS) \ 116c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "ip", "lr", "cc"); \ 117c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru }) 118c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 119c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __down_op_read(ptr,fail) \ 120c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __down_op(ptr, fail) 121c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 122c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __up_op_read(ptr,wake) \ 123c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ({ \ 124c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru smp_mb(); \ 125c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __asm__ __volatile__( \ 126c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "@ up_op_read\n" \ 127c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru"1: ldrex lr, [%0]\n" \ 128c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" add lr, lr, %1\n" \ 129c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" strex ip, lr, [%0]\n" \ 130c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" teq ip, #0\n" \ 131c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" bne 1b\n" \ 132c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" teq lr, #0\n" \ 133c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" moveq ip, %0\n" \ 134c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" bleq " #wake \ 135c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : \ 136c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "r" (ptr), "I" (1) \ 137c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "ip", "lr", "cc"); \ 138c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru }) 139c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 140c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else 141c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 142c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __down_op(ptr,fail) \ 143c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ({ \ 144c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __asm__ __volatile__( \ 145c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "@ down_op\n" \ 146c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" mrs ip, cpsr\n" \ 147c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" orr lr, ip, #128\n" \ 148c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" msr cpsr_c, lr\n" \ 149c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" ldr lr, [%0]\n" \ 150c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" subs lr, lr, %1\n" \ 151c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" str lr, [%0]\n" \ 152c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" msr cpsr_c, ip\n" \ 153c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" movmi ip, %0\n" \ 154c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" blmi " #fail \ 155c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : \ 156c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "r" (ptr), "I" (1) \ 157c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "ip", "lr", "cc"); \ 158c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru smp_mb(); \ 159c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru }) 160c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 161c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __down_op_ret(ptr,fail) \ 162c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ({ \ 163c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned int ret; \ 164c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __asm__ __volatile__( \ 165c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "@ down_op_ret\n" \ 166c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" mrs ip, cpsr\n" \ 167c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" orr lr, ip, #128\n" \ 168c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" msr cpsr_c, lr\n" \ 169c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" ldr lr, [%1]\n" \ 170c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" subs lr, lr, %2\n" \ 171c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" str lr, [%1]\n" \ 172c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" msr cpsr_c, ip\n" \ 173c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" movmi ip, %1\n" \ 174c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" movpl ip, #0\n" \ 175c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" blmi " #fail "\n" \ 176c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" mov %0, ip" \ 177c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "=&r" (ret) \ 178c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "r" (ptr), "I" (1) \ 179c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "ip", "lr", "cc"); \ 180c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru smp_mb(); \ 181c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ret; \ 182c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru }) 183c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 184c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __up_op(ptr,wake) \ 185c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ({ \ 186c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru smp_mb(); \ 187c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __asm__ __volatile__( \ 188c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "@ up_op\n" \ 189c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" mrs ip, cpsr\n" \ 190c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" orr lr, ip, #128\n" \ 191c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" msr cpsr_c, lr\n" \ 192c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" ldr lr, [%0]\n" \ 193c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" adds lr, lr, %1\n" \ 194c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" str lr, [%0]\n" \ 195c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" msr cpsr_c, ip\n" \ 196c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" movle ip, %0\n" \ 197c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" blle " #wake \ 198c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : \ 199c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "r" (ptr), "I" (1) \ 200c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "ip", "lr", "cc"); \ 201c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru }) 202c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 203c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 204c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * The value 0x01000000 supports up to 128 processors and 205c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * lots of processes. BIAS must be chosen such that sub'ing 206c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * BIAS once per CPU will result in the long remaining 207c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * negative. 208c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 209c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RW_LOCK_BIAS 0x01000000 210c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define RW_LOCK_BIAS_STR "0x01000000" 211c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 212c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __down_op_write(ptr,fail) \ 213c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ({ \ 214c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __asm__ __volatile__( \ 215c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "@ down_op_write\n" \ 216c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" mrs ip, cpsr\n" \ 217c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" orr lr, ip, #128\n" \ 218c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" msr cpsr_c, lr\n" \ 219c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" ldr lr, [%0]\n" \ 220c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" subs lr, lr, %1\n" \ 221c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" str lr, [%0]\n" \ 222c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" msr cpsr_c, ip\n" \ 223c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" movne ip, %0\n" \ 224c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" blne " #fail \ 225c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : \ 226c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "r" (ptr), "I" (RW_LOCK_BIAS) \ 227c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "ip", "lr", "cc"); \ 228c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru smp_mb(); \ 229c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru }) 230c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 231c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __up_op_write(ptr,wake) \ 232c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ({ \ 233c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __asm__ __volatile__( \ 234c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "@ up_op_write\n" \ 235c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" mrs ip, cpsr\n" \ 236c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" orr lr, ip, #128\n" \ 237c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" msr cpsr_c, lr\n" \ 238c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" ldr lr, [%0]\n" \ 239c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" adds lr, lr, %1\n" \ 240c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" str lr, [%0]\n" \ 241c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" msr cpsr_c, ip\n" \ 242c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" movcs ip, %0\n" \ 243c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" blcs " #wake \ 244c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : \ 245c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "r" (ptr), "I" (RW_LOCK_BIAS) \ 246c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "ip", "lr", "cc"); \ 247c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru smp_mb(); \ 248c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru }) 249c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 250c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __down_op_read(ptr,fail) \ 251c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __down_op(ptr, fail) 252c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 253c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __up_op_read(ptr,wake) \ 254c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ({ \ 255c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru smp_mb(); \ 256c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __asm__ __volatile__( \ 257c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "@ up_op_read\n" \ 258c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" mrs ip, cpsr\n" \ 259c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" orr lr, ip, #128\n" \ 260c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" msr cpsr_c, lr\n" \ 261c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" ldr lr, [%0]\n" \ 262c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" adds lr, lr, %1\n" \ 263c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" str lr, [%0]\n" \ 264c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" msr cpsr_c, ip\n" \ 265c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" moveq ip, %0\n" \ 266c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" bleq " #wake \ 267c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : \ 268c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "r" (ptr), "I" (1) \ 269c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "ip", "lr", "cc"); \ 270c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru }) 271c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 272c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 273c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 274c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 275