cache.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:2k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * include/asm-parisc/cache.h
  3.  */
  4. #ifndef __ARCH_PARISC_CACHE_H
  5. #define __ARCH_PARISC_CACHE_H
  6. /*
  7. ** XXX FIXME : L1_CACHE_BYTES (cacheline size) should be a boot time thing.
  8. ** 
  9. ** 32-bit on PA2.0 is not covered well by the #ifdef __LP64__ below.
  10. ** PA2.0 processors have 64-byte cachelines.
  11. **
  12. ** The issue is mostly cacheline ping-ponging on SMP boxes.
  13. ** To avoid this, code should define stuff to be per CPU on cacheline
  14. ** aligned boundaries. This can make a 2x or more difference in perf
  15. ** depending on how badly the thrashing is.
  16. **
  17. ** We don't need to worry about I/O since all PA2.0 boxes (except T600)
  18. ** are I/O coherent. That means flushing less than you needed to generally
  19. ** doesn't matter - the I/O MMU will read/modify/write the cacheline.
  20. **
  21. ** (Digression: it is possible to program I/O MMU's to not first read
  22. ** a cacheline for inbound data - ie just grab ownership and start writing.
  23. ** While it improves I/O throughput, you gotta know the device driver
  24. ** is well behaved and can deal with the issues.)
  25. */
  26. #if defined(__LP64__)
  27. #define L1_CACHE_BYTES 64
  28. #else
  29. #define L1_CACHE_BYTES 32
  30. #endif
  31. #define L1_CACHE_ALIGN(x)       (((x)+(L1_CACHE_BYTES-1))&~(L1_CACHE_BYTES-1))
  32. #define SMP_CACHE_BYTES L1_CACHE_BYTES
  33. #define __cacheline_aligned __attribute__((__aligned__(L1_CACHE_BYTES)))
  34. extern void init_cache(void); /* initializes cache-flushing */
  35. extern void flush_data_cache(void); /* flushes data-cache only */
  36. extern void flush_instruction_cache(void);/* flushes code-cache only */
  37. extern void flush_all_caches(void); /* flushes code and data-cache */
  38. extern int get_cache_info(char *);
  39. extern struct pdc_cache_info cache_info;
  40. #define fdce(addr) asm volatile("fdce 0(%0)" : : "r" (addr))
  41. #define fice(addr) asm volatile("fice 0(%%sr1,%0)" : : "r" (addr))
  42. #define pdtlbe(addr) asm volatile("pdtlbe 0(%%sr1,%0)" : : "r" (addr))
  43. #define pdtlb_kernel(addr)  asm volatile("pdtlb 0(%0)" : : "r" (addr));
  44. #define pitlbe(addr) asm volatile("pitlbe 0(%%sr1,%0)" : : "r" (addr))
  45. #define kernel_fdc(addr) asm volatile("fdc 0(%%sr0, %0)" : : "r" (addr))
  46. #endif