| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * Copyright (c) 2013-2014 Linaro Ltd. |
|---|
| 3 | 4 | * Copyright (c) 2013-2014 Hisilicon Limited. |
|---|
| 4 | | - * |
|---|
| 5 | | - * This program is free software; you can redistribute it and/or modify it |
|---|
| 6 | | - * under the terms and conditions of the GNU General Public License, |
|---|
| 7 | | - * version 2, as published by the Free Software Foundation. |
|---|
| 8 | 5 | */ |
|---|
| 9 | 6 | #include <linux/init.h> |
|---|
| 10 | 7 | #include <linux/smp.h> |
|---|
| .. | .. |
|---|
| 61 | 58 | |
|---|
| 62 | 59 | static void __iomem *sysctrl, *fabric; |
|---|
| 63 | 60 | static int hip04_cpu_table[HIP04_MAX_CLUSTERS][HIP04_MAX_CPUS_PER_CLUSTER]; |
|---|
| 64 | | -static DEFINE_RAW_SPINLOCK(boot_lock); |
|---|
| 61 | +static DEFINE_SPINLOCK(boot_lock); |
|---|
| 65 | 62 | static u32 fabric_phys_addr; |
|---|
| 66 | 63 | /* |
|---|
| 67 | 64 | * [0]: bootwrapper physical address |
|---|
| .. | .. |
|---|
| 113 | 110 | if (cluster >= HIP04_MAX_CLUSTERS || cpu >= HIP04_MAX_CPUS_PER_CLUSTER) |
|---|
| 114 | 111 | return -EINVAL; |
|---|
| 115 | 112 | |
|---|
| 116 | | - raw_spin_lock_irq(&boot_lock); |
|---|
| 113 | + spin_lock_irq(&boot_lock); |
|---|
| 117 | 114 | |
|---|
| 118 | 115 | if (hip04_cpu_table[cluster][cpu]) |
|---|
| 119 | 116 | goto out; |
|---|
| .. | .. |
|---|
| 147 | 144 | |
|---|
| 148 | 145 | out: |
|---|
| 149 | 146 | hip04_cpu_table[cluster][cpu]++; |
|---|
| 150 | | - raw_spin_unlock_irq(&boot_lock); |
|---|
| 147 | + spin_unlock_irq(&boot_lock); |
|---|
| 151 | 148 | |
|---|
| 152 | 149 | return 0; |
|---|
| 153 | 150 | } |
|---|
| .. | .. |
|---|
| 162 | 159 | cpu = MPIDR_AFFINITY_LEVEL(mpidr, 0); |
|---|
| 163 | 160 | cluster = MPIDR_AFFINITY_LEVEL(mpidr, 1); |
|---|
| 164 | 161 | |
|---|
| 165 | | - raw_spin_lock(&boot_lock); |
|---|
| 162 | + spin_lock(&boot_lock); |
|---|
| 166 | 163 | hip04_cpu_table[cluster][cpu]--; |
|---|
| 167 | 164 | if (hip04_cpu_table[cluster][cpu] == 1) { |
|---|
| 168 | 165 | /* A power_up request went ahead of us. */ |
|---|
| 169 | | - raw_spin_unlock(&boot_lock); |
|---|
| 166 | + spin_unlock(&boot_lock); |
|---|
| 170 | 167 | return; |
|---|
| 171 | 168 | } else if (hip04_cpu_table[cluster][cpu] > 1) { |
|---|
| 172 | 169 | pr_err("Cluster %d CPU%d boots multiple times\n", cluster, cpu); |
|---|
| .. | .. |
|---|
| 174 | 171 | } |
|---|
| 175 | 172 | |
|---|
| 176 | 173 | last_man = hip04_cluster_is_down(cluster); |
|---|
| 177 | | - raw_spin_unlock(&boot_lock); |
|---|
| 174 | + spin_unlock(&boot_lock); |
|---|
| 178 | 175 | if (last_man) { |
|---|
| 179 | 176 | /* Since it's Cortex A15, disable L2 prefetching. */ |
|---|
| 180 | 177 | asm volatile( |
|---|
| .. | .. |
|---|
| 203 | 200 | cpu >= HIP04_MAX_CPUS_PER_CLUSTER); |
|---|
| 204 | 201 | |
|---|
| 205 | 202 | count = TIMEOUT_MSEC / POLL_MSEC; |
|---|
| 206 | | - raw_spin_lock_irq(&boot_lock); |
|---|
| 203 | + spin_lock_irq(&boot_lock); |
|---|
| 207 | 204 | for (tries = 0; tries < count; tries++) { |
|---|
| 208 | 205 | if (hip04_cpu_table[cluster][cpu]) |
|---|
| 209 | 206 | goto err; |
|---|
| .. | .. |
|---|
| 211 | 208 | data = readl_relaxed(sysctrl + SC_CPU_RESET_STATUS(cluster)); |
|---|
| 212 | 209 | if (data & CORE_WFI_STATUS(cpu)) |
|---|
| 213 | 210 | break; |
|---|
| 214 | | - raw_spin_unlock_irq(&boot_lock); |
|---|
| 211 | + spin_unlock_irq(&boot_lock); |
|---|
| 215 | 212 | /* Wait for clean L2 when the whole cluster is down. */ |
|---|
| 216 | 213 | msleep(POLL_MSEC); |
|---|
| 217 | | - raw_spin_lock_irq(&boot_lock); |
|---|
| 214 | + spin_lock_irq(&boot_lock); |
|---|
| 218 | 215 | } |
|---|
| 219 | 216 | if (tries >= count) |
|---|
| 220 | 217 | goto err; |
|---|
| .. | .. |
|---|
| 231 | 228 | goto err; |
|---|
| 232 | 229 | if (hip04_cluster_is_down(cluster)) |
|---|
| 233 | 230 | hip04_set_snoop_filter(cluster, 0); |
|---|
| 234 | | - raw_spin_unlock_irq(&boot_lock); |
|---|
| 231 | + spin_unlock_irq(&boot_lock); |
|---|
| 235 | 232 | return 1; |
|---|
| 236 | 233 | err: |
|---|
| 237 | | - raw_spin_unlock_irq(&boot_lock); |
|---|
| 234 | + spin_unlock_irq(&boot_lock); |
|---|
| 238 | 235 | return 0; |
|---|
| 239 | 236 | } |
|---|
| 240 | 237 | #endif |
|---|