entry-macro.S 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. /*
  2. * arch/arm/mach-h720x/include/mach/entry-macro.S
  3. *
  4. * Low-level IRQ helper macros for Hynix HMS720x based platforms
  5. *
  6. * This file is licensed under the terms of the GNU General Public
  7. * License version 2. This program is licensed "as is" without any
  8. * warranty of any kind, whether express or implied.
  9. */
  10. .macro get_irqnr_preamble, base, tmp
  11. .endm
  12. .macro get_irqnr_and_base, irqnr, irqstat, base, tmp
  13. #if defined (CONFIG_CPU_H7201) || defined (CONFIG_CPU_H7202)
  14. @ we could use the id register on H7202, but this is not
  15. @ properly updated when we come back from asm_do_irq
  16. @ without a previous return from interrupt
  17. @ (see loops below in irq_svc, irq_usr)
  18. @ We see unmasked pending ints only, as the masked pending ints
  19. @ are not visible here
  20. mov \base, #0xf0000000 @ base register
  21. orr \base, \base, #0x24000 @ irqbase
  22. ldr \irqstat, [\base, #0x04] @ get interrupt status
  23. #if defined (CONFIG_CPU_H7201)
  24. ldr \tmp, =0x001fffff
  25. #else
  26. mvn \tmp, #0xc0000000
  27. #endif
  28. and \irqstat, \irqstat, \tmp @ mask out unused ints
  29. mov \irqnr, #0
  30. mov \tmp, #0xff00
  31. orr \tmp, \tmp, #0xff
  32. tst \irqstat, \tmp
  33. addeq \irqnr, \irqnr, #16
  34. moveq \irqstat, \irqstat, lsr #16
  35. tst \irqstat, #255
  36. addeq \irqnr, \irqnr, #8
  37. moveq \irqstat, \irqstat, lsr #8
  38. tst \irqstat, #15
  39. addeq \irqnr, \irqnr, #4
  40. moveq \irqstat, \irqstat, lsr #4
  41. tst \irqstat, #3
  42. addeq \irqnr, \irqnr, #2
  43. moveq \irqstat, \irqstat, lsr #2
  44. tst \irqstat, #1
  45. addeq \irqnr, \irqnr, #1
  46. moveq \irqstat, \irqstat, lsr #1
  47. tst \irqstat, #1 @ bit 0 should be set
  48. .endm
  49. #else
  50. #error hynix processor selection missmatch
  51. #endif