1/*- 2 * Copyright 2014 Svatopluk Kraus <onwahe@gmail.com> 3 * Copyright 2014 Michal Meloun <meloun@miracle.cz> 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: --- 10 unchanged lines hidden (view full) --- 19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25 * SUCH DAMAGE. 26 * |
27 * $FreeBSD: head/sys/arm/include/cpu-v6.h 279811 2015-03-09 14:46:10Z ian $ |
28 */ 29#ifndef MACHINE_CPU_V6_H 30#define MACHINE_CPU_V6_H 31 32#include "machine/atomic.h" 33#include "machine/cpufunc.h" 34#include "machine/cpuinfo.h" 35#include "machine/sysreg.h" 36 37 38#define CPU_ASID_KERNEL 0 39 |
40vm_offset_t dcache_wb_pou_checked(vm_offset_t, vm_size_t); 41vm_offset_t icache_inv_pou_checked(vm_offset_t, vm_size_t); 42 |
43/* 44 * Macros to generate CP15 (system control processor) read/write functions. 45 */ 46#define _FX(s...) #s 47 48#define _RF0(fname, aname...) \ 49static __inline register_t \ 50fname(void) \ --- 249 unchanged lines hidden (view full) --- 300/* Sync I and D caches to PoU */ 301static __inline void 302icache_sync(vm_offset_t sva, vm_size_t size) 303{ 304 vm_offset_t va; 305 vm_offset_t eva = sva + size; 306 307 dsb(); |
308 for (va = sva; va < eva; va += cpuinfo.dcache_line_size) { |
309#if __ARM_ARCH >= 7 && defined SMP 310 _CP15_DCCMVAU(va); 311#else 312 _CP15_DCCMVAC(va); 313#endif 314 } 315 dsb(); 316#if __ARM_ARCH >= 7 && defined SMP --- 13 unchanged lines hidden (view full) --- 330 _CP15_ICIALLUIS(); 331#else 332 _CP15_ICIALLU(); 333#endif 334 dsb(); 335 isb(); 336} 337 |
338/* Invalidate branch predictor buffer */ 339static __inline void 340bpb_inv_all(void) 341{ 342#if __ARM_ARCH >= 7 && defined SMP 343 _CP15_BPIALLIS(); 344#else 345 _CP15_BPIALL(); 346#endif 347 dsb(); 348 isb(); 349} 350 |
351/* Write back D-cache to PoU */ 352static __inline void 353dcache_wb_pou(vm_offset_t sva, vm_size_t size) 354{ 355 vm_offset_t va; 356 vm_offset_t eva = sva + size; 357 358 dsb(); |
359 for (va = sva; va < eva; va += cpuinfo.dcache_line_size) { |
360#if __ARM_ARCH >= 7 && defined SMP 361 _CP15_DCCMVAU(va); 362#else 363 _CP15_DCCMVAC(va); 364#endif 365 } 366 dsb(); 367} 368 369/* Invalidate D-cache to PoC */ 370static __inline void 371dcache_inv_poc(vm_offset_t sva, vm_paddr_t pa, vm_size_t size) 372{ 373 vm_offset_t va; 374 vm_offset_t eva = sva + size; 375 376 /* invalidate L1 first */ |
377 for (va = sva; va < eva; va += cpuinfo.dcache_line_size) { |
378 _CP15_DCIMVAC(va); 379 } 380 dsb(); 381 382 /* then L2 */ 383 cpu_l2cache_inv_range(pa, size); 384 dsb(); 385 386 /* then L1 again */ |
387 for (va = sva; va < eva; va += cpuinfo.dcache_line_size) { |
388 _CP15_DCIMVAC(va); 389 } 390 dsb(); 391} 392 393/* Write back D-cache to PoC */ 394static __inline void 395dcache_wb_poc(vm_offset_t sva, vm_paddr_t pa, vm_size_t size) 396{ 397 vm_offset_t va; 398 vm_offset_t eva = sva + size; 399 400 dsb(); 401 |
402 for (va = sva; va < eva; va += cpuinfo.dcache_line_size) { |
403 _CP15_DCCMVAC(va); 404 } 405 dsb(); 406 407 cpu_l2cache_wb_range(pa, size); 408} 409 410/* Write back and invalidate D-cache to PoC */ 411static __inline void 412dcache_wbinv_poc(vm_offset_t sva, vm_paddr_t pa, vm_size_t size) 413{ 414 vm_offset_t va; 415 vm_offset_t eva = sva + size; 416 417 dsb(); 418 419 /* write back L1 first */ |
420 for (va = sva; va < eva; va += cpuinfo.dcache_line_size) { |
421 _CP15_DCCMVAC(va); 422 } 423 dsb(); 424 425 /* then write back and invalidate L2 */ 426 cpu_l2cache_wbinv_range(pa, size); 427 428 /* then invalidate L1 */ |
429 for (va = sva; va < eva; va += cpuinfo.dcache_line_size) { |
430 _CP15_DCIMVAC(va); 431 } 432 dsb(); 433} 434 435/* Set TTB0 register */ 436static __inline void 437cp15_ttbr_set(uint32_t reg) 438{ 439 dsb(); 440 _CP15_TTB_SET(reg); 441 dsb(); 442 _CP15_BPIALL(); 443 dsb(); 444 isb(); 445 tlb_flush_all_ng_local(); 446} 447 448#endif /* !MACHINE_CPU_V6_H */ |