dcc.h 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. /* Copyright (c) 2014-2015 The Linux Foundation. All rights reserved.
  2. *
  3. * This program is free software; you can redistribute it and/or modify
  4. * it under the terms of the GNU General Public License version 2 and
  5. * only version 2 as published by the Free Software Foundation.
  6. *
  7. * This program is distributed in the hope that it will be useful,
  8. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. * GNU General Public License for more details.
  11. *
  12. * A call to __dcc_getchar() or __dcc_putchar() is typically followed by
  13. * a call to __dcc_getstatus(). We want to make sure that the CPU does
  14. * not speculative read the DCC status before executing the read or write
  15. * instruction. That's what the ISBs are for.
  16. *
  17. * The 'volatile' ensures that the compiler does not cache the status bits,
  18. * and instead reads the DCC register every time.
  19. */
  20. #ifndef __ASM_DCC_H
  21. #define __ASM_DCC_H
  22. #include <asm/barrier.h>
  23. #include <asm/sysreg.h>
  24. static inline u32 __dcc_getstatus(void)
  25. {
  26. return read_sysreg(mdccsr_el0);
  27. }
  28. static inline char __dcc_getchar(void)
  29. {
  30. char c = read_sysreg(dbgdtrrx_el0);
  31. isb();
  32. return c;
  33. }
  34. static inline void __dcc_putchar(char c)
  35. {
  36. /*
  37. * The typecast is to make absolutely certain that 'c' is
  38. * zero-extended.
  39. */
  40. write_sysreg((unsigned char)c, dbgdtrtx_el0);
  41. isb();
  42. }
  43. #endif