Subversion Repositories Kolibri OS

Rev

Rev 5270 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. /**
  2.  * \file drm_os_linux.h
  3.  * OS abstraction macros.
  4.  */
  5.  
  6. #include <linux/interrupt.h>    /* For task queue support */
  7. #include <linux/delay.h>
  8.  
  9. #ifndef readq
  10. static inline u64 readq(void __iomem *reg)
  11. {
  12.         return ((u64) readl(reg)) | (((u64) readl(reg + 4UL)) << 32);
  13. }
  14.  
  15. static inline void writeq(u64 val, void __iomem *reg)
  16. {
  17.         writel(val & 0xffffffff, reg);
  18.         writel(val >> 32, reg + 0x4UL);
  19. }
  20. #endif
  21.  
  22. /** Current process ID */
  23. #define DRM_CURRENTPID                  task_pid_nr(current)
  24. #define DRM_UDELAY(d)                   udelay(d)
  25. /** Read a byte from a MMIO region */
  26. #define DRM_READ8(map, offset)          readb(((void __iomem *)(map)->handle) + (offset))
  27. /** Read a word from a MMIO region */
  28. #define DRM_READ16(map, offset)         readw(((void __iomem *)(map)->handle) + (offset))
  29. /** Read a dword from a MMIO region */
  30. #define DRM_READ32(map, offset)         readl(((void __iomem *)(map)->handle) + (offset))
  31. /** Write a byte into a MMIO region */
  32. #define DRM_WRITE8(map, offset, val)    writeb(val, ((void __iomem *)(map)->handle) + (offset))
  33. /** Write a word into a MMIO region */
  34. #define DRM_WRITE16(map, offset, val)   writew(val, ((void __iomem *)(map)->handle) + (offset))
  35. /** Write a dword into a MMIO region */
  36. #define DRM_WRITE32(map, offset, val)   writel(val, ((void __iomem *)(map)->handle) + (offset))
  37.  
  38. /** Read a qword from a MMIO region - be careful using these unless you really understand them */
  39. #define DRM_READ64(map, offset)         readq(((void __iomem *)(map)->handle) + (offset))
  40. /** Write a qword into a MMIO region */
  41. #define DRM_WRITE64(map, offset, val)   writeq(val, ((void __iomem *)(map)->handle) + (offset))
  42.  
  43. #define DRM_WAIT_ON( ret, queue, timeout, condition )           \
  44. do {                                                            \
  45.         DECLARE_WAITQUEUE(entry, current);                      \
  46.         unsigned long end = jiffies + (timeout);                \
  47.         add_wait_queue(&(queue), &entry);                       \
  48.                                                                 \
  49.         for (;;) {                                              \
  50.                 __set_current_state(TASK_INTERRUPTIBLE);        \
  51.                 if (condition)                                  \
  52.                         break;                                  \
  53.                 if (time_after_eq(jiffies, end)) {              \
  54.                         ret = -EBUSY;                           \
  55.                         break;                                  \
  56.                 }                                               \
  57.                 schedule_timeout((HZ/100 > 1) ? HZ/100 : 1);    \
  58.                 if (signal_pending(current)) {                  \
  59.                         ret = -EINTR;                           \
  60.                         break;                                  \
  61.                 }                                               \
  62.         }                                                       \
  63.         __set_current_state(TASK_RUNNING);                      \
  64.         remove_wait_queue(&(queue), &entry);                    \
  65. } while (0)
  66.