| /* |
| * Copyright 2010 Tilera Corporation. All Rights Reserved. |
| * |
| * This program is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU General Public License |
| * as published by the Free Software Foundation, version 2. |
| * |
| * This program is distributed in the hope that it will be useful, but |
| * WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or |
| * NON INFRINGEMENT. See the GNU General Public License for |
| * more details. |
| * This file is included into spinlock_32.c or _64.c. |
| */ |
| |
| /* |
| * The mfspr in __spinlock_relax() is 5 or 6 cycles plus 2 for loop |
| * overhead. |
| */ |
| #ifdef __tilegx__ |
| #define CYCLES_PER_RELAX_LOOP 7 |
| #else |
| #define CYCLES_PER_RELAX_LOOP 8 |
| #endif |
| |
| /* |
| * Idle the core for CYCLES_PER_RELAX_LOOP * iterations cycles. |
| */ |
| static inline void |
| relax(int iterations) |
| { |
| for (/*above*/; iterations > 0; iterations--) |
| __insn_mfspr(SPR_PASS); |
| barrier(); |
| } |
| |
| /* Perform bounded exponential backoff.*/ |
| static void delay_backoff(int iterations) |
| { |
| u32 exponent, loops; |
| |
| /* |
| * 2^exponent is how many times we go around the loop, |
| * which takes 8 cycles. We want to start with a 16- to 31-cycle |
| * loop, so we need to go around minimum 2 = 2^1 times, so we |
| * bias the original value up by 1. |
| */ |
| exponent = iterations + 1; |
| |
| /* |
| * Don't allow exponent to exceed 7, so we have 128 loops, |
| * or 1,024 (to 2,047) cycles, as our maximum. |
| */ |
| if (exponent > 8) |
| exponent = 8; |
| |
| loops = 1 << exponent; |
| |
| /* Add a randomness factor so two cpus never get in lock step. */ |
| loops += __insn_crc32_32(stack_pointer, get_cycles_low()) & |
| (loops - 1); |
| |
| relax(loops); |
| } |