0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/err.h>
0009 #include <linux/spinlock.h>
0010 #include <linux/io.h>
0011 #include <linux/bitops.h>
0012 #include <linux/of_address.h>
0013 #include <linux/notifier.h>
0014 #include <linux/cpu.h>
0015 #include <linux/syscore_ops.h>
0016 #include <linux/reboot.h>
0017
0018 #include <asm/cacheflush.h>
0019 #include <asm/hardware/cache-b15-rac.h>
0020
0021 extern void v7_flush_kern_cache_all(void);
0022
0023
0024 #define RAC_CONFIG0_REG (0x78)
0025 #define RACENPREF_MASK (0x3)
0026 #define RACPREFINST_SHIFT (0)
0027 #define RACENINST_SHIFT (2)
0028 #define RACPREFDATA_SHIFT (4)
0029 #define RACENDATA_SHIFT (6)
0030 #define RAC_CPU_SHIFT (8)
0031 #define RACCFG_MASK (0xff)
0032 #define RAC_CONFIG1_REG (0x7c)
0033
0034 #define B15_RAC_FLUSH_REG (0x80)
0035
0036 #define B53_RAC_FLUSH_REG (0x84)
0037 #define FLUSH_RAC (1 << 0)
0038
0039
0040 #define RAC_DATA_INST_EN_MASK (1 << RACPREFINST_SHIFT | \
0041 RACENPREF_MASK << RACENINST_SHIFT | \
0042 1 << RACPREFDATA_SHIFT | \
0043 RACENPREF_MASK << RACENDATA_SHIFT)
0044
0045 #define RAC_ENABLED 0
0046
0047
0048
0049 #define RAC_SUSPENDED 1
0050
0051 static void __iomem *b15_rac_base;
0052 static DEFINE_SPINLOCK(rac_lock);
0053
0054 static u32 rac_config0_reg;
0055 static u32 rac_flush_offset;
0056
0057
0058
0059
0060 static unsigned long b15_rac_flags;
0061
0062 static inline u32 __b15_rac_disable(void)
0063 {
0064 u32 val = __raw_readl(b15_rac_base + RAC_CONFIG0_REG);
0065 __raw_writel(0, b15_rac_base + RAC_CONFIG0_REG);
0066 dmb();
0067 return val;
0068 }
0069
0070 static inline void __b15_rac_flush(void)
0071 {
0072 u32 reg;
0073
0074 __raw_writel(FLUSH_RAC, b15_rac_base + rac_flush_offset);
0075 do {
0076
0077
0078
0079
0080 dmb();
0081 reg = __raw_readl(b15_rac_base + rac_flush_offset);
0082 } while (reg & FLUSH_RAC);
0083 }
0084
0085 static inline u32 b15_rac_disable_and_flush(void)
0086 {
0087 u32 reg;
0088
0089 reg = __b15_rac_disable();
0090 __b15_rac_flush();
0091 return reg;
0092 }
0093
0094 static inline void __b15_rac_enable(u32 val)
0095 {
0096 __raw_writel(val, b15_rac_base + RAC_CONFIG0_REG);
0097
0098 dsb();
0099 }
0100
0101 #define BUILD_RAC_CACHE_OP(name, bar) \
0102 void b15_flush_##name(void) \
0103 { \
0104 unsigned int do_flush; \
0105 u32 val = 0; \
0106 \
0107 if (test_bit(RAC_SUSPENDED, &b15_rac_flags)) { \
0108 v7_flush_##name(); \
0109 bar; \
0110 return; \
0111 } \
0112 \
0113 spin_lock(&rac_lock); \
0114 do_flush = test_bit(RAC_ENABLED, &b15_rac_flags); \
0115 if (do_flush) \
0116 val = b15_rac_disable_and_flush(); \
0117 v7_flush_##name(); \
0118 if (!do_flush) \
0119 bar; \
0120 else \
0121 __b15_rac_enable(val); \
0122 spin_unlock(&rac_lock); \
0123 }
0124
0125 #define nobarrier
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136
0137
0138
0139
0140
0141
0142
0143 BUILD_RAC_CACHE_OP(kern_cache_all, nobarrier);
0144
0145 static void b15_rac_enable(void)
0146 {
0147 unsigned int cpu;
0148 u32 enable = 0;
0149
0150 for_each_possible_cpu(cpu)
0151 enable |= (RAC_DATA_INST_EN_MASK << (cpu * RAC_CPU_SHIFT));
0152
0153 b15_rac_disable_and_flush();
0154 __b15_rac_enable(enable);
0155 }
0156
0157 static int b15_rac_reboot_notifier(struct notifier_block *nb,
0158 unsigned long action,
0159 void *data)
0160 {
0161
0162
0163
0164
0165 if (action == SYS_RESTART) {
0166 spin_lock(&rac_lock);
0167 b15_rac_disable_and_flush();
0168 clear_bit(RAC_ENABLED, &b15_rac_flags);
0169 set_bit(RAC_SUSPENDED, &b15_rac_flags);
0170 spin_unlock(&rac_lock);
0171 }
0172
0173 return NOTIFY_DONE;
0174 }
0175
0176 static struct notifier_block b15_rac_reboot_nb = {
0177 .notifier_call = b15_rac_reboot_notifier,
0178 };
0179
0180
0181
0182
0183
0184
0185
0186
0187
0188
0189
0190
0191
0192
0193
0194
0195
0196
0197
0198
0199
0200
0201
0202
0203
0204
0205
0206
0207
0208
0209
0210
0211
0212
0213
0214
0215
0216
0217 static int b15_rac_dying_cpu(unsigned int cpu)
0218 {
0219
0220
0221
0222 if (test_bit(RAC_SUSPENDED, &b15_rac_flags))
0223 return 0;
0224
0225 spin_lock(&rac_lock);
0226
0227
0228 __clear_bit(RAC_ENABLED, &b15_rac_flags);
0229
0230
0231 rac_config0_reg = b15_rac_disable_and_flush();
0232
0233 spin_unlock(&rac_lock);
0234
0235 return 0;
0236 }
0237
0238
0239 static int b15_rac_dead_cpu(unsigned int cpu)
0240 {
0241
0242
0243
0244 if (test_bit(RAC_SUSPENDED, &b15_rac_flags))
0245 return 0;
0246
0247 spin_lock(&rac_lock);
0248
0249
0250 __b15_rac_enable(rac_config0_reg);
0251 __set_bit(RAC_ENABLED, &b15_rac_flags);
0252
0253 spin_unlock(&rac_lock);
0254
0255 return 0;
0256 }
0257
0258 static int b15_rac_suspend(void)
0259 {
0260
0261
0262
0263
0264
0265
0266
0267 rac_config0_reg = b15_rac_disable_and_flush();
0268 set_bit(RAC_SUSPENDED, &b15_rac_flags);
0269
0270 return 0;
0271 }
0272
0273 static void b15_rac_resume(void)
0274 {
0275
0276
0277
0278
0279
0280 __b15_rac_enable(rac_config0_reg);
0281 clear_bit(RAC_SUSPENDED, &b15_rac_flags);
0282 }
0283
0284 static struct syscore_ops b15_rac_syscore_ops = {
0285 .suspend = b15_rac_suspend,
0286 .resume = b15_rac_resume,
0287 };
0288
0289 static int __init b15_rac_init(void)
0290 {
0291 struct device_node *dn, *cpu_dn;
0292 int ret = 0, cpu;
0293 u32 reg, en_mask = 0;
0294
0295 dn = of_find_compatible_node(NULL, NULL, "brcm,brcmstb-cpu-biu-ctrl");
0296 if (!dn)
0297 return -ENODEV;
0298
0299 if (WARN(num_possible_cpus() > 4, "RAC only supports 4 CPUs\n"))
0300 goto out;
0301
0302 b15_rac_base = of_iomap(dn, 0);
0303 if (!b15_rac_base) {
0304 pr_err("failed to remap BIU control base\n");
0305 ret = -ENOMEM;
0306 goto out;
0307 }
0308
0309 cpu_dn = of_get_cpu_node(0, NULL);
0310 if (!cpu_dn) {
0311 ret = -ENODEV;
0312 goto out;
0313 }
0314
0315 if (of_device_is_compatible(cpu_dn, "brcm,brahma-b15"))
0316 rac_flush_offset = B15_RAC_FLUSH_REG;
0317 else if (of_device_is_compatible(cpu_dn, "brcm,brahma-b53"))
0318 rac_flush_offset = B53_RAC_FLUSH_REG;
0319 else {
0320 pr_err("Unsupported CPU\n");
0321 of_node_put(cpu_dn);
0322 ret = -EINVAL;
0323 goto out;
0324 }
0325 of_node_put(cpu_dn);
0326
0327 ret = register_reboot_notifier(&b15_rac_reboot_nb);
0328 if (ret) {
0329 pr_err("failed to register reboot notifier\n");
0330 iounmap(b15_rac_base);
0331 goto out;
0332 }
0333
0334 if (IS_ENABLED(CONFIG_HOTPLUG_CPU)) {
0335 ret = cpuhp_setup_state_nocalls(CPUHP_AP_ARM_CACHE_B15_RAC_DEAD,
0336 "arm/cache-b15-rac:dead",
0337 NULL, b15_rac_dead_cpu);
0338 if (ret)
0339 goto out_unmap;
0340
0341 ret = cpuhp_setup_state_nocalls(CPUHP_AP_ARM_CACHE_B15_RAC_DYING,
0342 "arm/cache-b15-rac:dying",
0343 NULL, b15_rac_dying_cpu);
0344 if (ret)
0345 goto out_cpu_dead;
0346 }
0347
0348 if (IS_ENABLED(CONFIG_PM_SLEEP))
0349 register_syscore_ops(&b15_rac_syscore_ops);
0350
0351 spin_lock(&rac_lock);
0352 reg = __raw_readl(b15_rac_base + RAC_CONFIG0_REG);
0353 for_each_possible_cpu(cpu)
0354 en_mask |= ((1 << RACPREFDATA_SHIFT) << (cpu * RAC_CPU_SHIFT));
0355 WARN(reg & en_mask, "Read-ahead cache not previously disabled\n");
0356
0357 b15_rac_enable();
0358 set_bit(RAC_ENABLED, &b15_rac_flags);
0359 spin_unlock(&rac_lock);
0360
0361 pr_info("%pOF: Broadcom Brahma-B15 readahead cache\n", dn);
0362
0363 goto out;
0364
0365 out_cpu_dead:
0366 cpuhp_remove_state_nocalls(CPUHP_AP_ARM_CACHE_B15_RAC_DYING);
0367 out_unmap:
0368 unregister_reboot_notifier(&b15_rac_reboot_nb);
0369 iounmap(b15_rac_base);
0370 out:
0371 of_node_put(dn);
0372 return ret;
0373 }
0374 arch_initcall(b15_rac_init);