qmgr.h 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Copyright (C) 2007 Krzysztof Halasa <[email protected]>
  4. */
  5. #ifndef IXP4XX_QMGR_H
  6. #define IXP4XX_QMGR_H
  7. #include <linux/io.h>
  8. #include <linux/kernel.h>
  9. #define DEBUG_QMGR 0
  10. #define HALF_QUEUES 32
  11. #define QUEUES 64
  12. #define MAX_QUEUE_LENGTH 4 /* in dwords */
  13. #define QUEUE_STAT1_EMPTY 1 /* queue status bits */
  14. #define QUEUE_STAT1_NEARLY_EMPTY 2
  15. #define QUEUE_STAT1_NEARLY_FULL 4
  16. #define QUEUE_STAT1_FULL 8
  17. #define QUEUE_STAT2_UNDERFLOW 1
  18. #define QUEUE_STAT2_OVERFLOW 2
  19. #define QUEUE_WATERMARK_0_ENTRIES 0
  20. #define QUEUE_WATERMARK_1_ENTRY 1
  21. #define QUEUE_WATERMARK_2_ENTRIES 2
  22. #define QUEUE_WATERMARK_4_ENTRIES 3
  23. #define QUEUE_WATERMARK_8_ENTRIES 4
  24. #define QUEUE_WATERMARK_16_ENTRIES 5
  25. #define QUEUE_WATERMARK_32_ENTRIES 6
  26. #define QUEUE_WATERMARK_64_ENTRIES 7
  27. /* queue interrupt request conditions */
  28. #define QUEUE_IRQ_SRC_EMPTY 0
  29. #define QUEUE_IRQ_SRC_NEARLY_EMPTY 1
  30. #define QUEUE_IRQ_SRC_NEARLY_FULL 2
  31. #define QUEUE_IRQ_SRC_FULL 3
  32. #define QUEUE_IRQ_SRC_NOT_EMPTY 4
  33. #define QUEUE_IRQ_SRC_NOT_NEARLY_EMPTY 5
  34. #define QUEUE_IRQ_SRC_NOT_NEARLY_FULL 6
  35. #define QUEUE_IRQ_SRC_NOT_FULL 7
  36. struct qmgr_regs {
  37. u32 acc[QUEUES][MAX_QUEUE_LENGTH]; /* 0x000 - 0x3FF */
  38. u32 stat1[4]; /* 0x400 - 0x40F */
  39. u32 stat2[2]; /* 0x410 - 0x417 */
  40. u32 statne_h; /* 0x418 - queue nearly empty */
  41. u32 statf_h; /* 0x41C - queue full */
  42. u32 irqsrc[4]; /* 0x420 - 0x42F IRC source */
  43. u32 irqen[2]; /* 0x430 - 0x437 IRQ enabled */
  44. u32 irqstat[2]; /* 0x438 - 0x43F - IRQ access only */
  45. u32 reserved[1776];
  46. u32 sram[2048]; /* 0x2000 - 0x3FFF - config and buffer */
  47. };
  48. void qmgr_put_entry(unsigned int queue, u32 val);
  49. u32 qmgr_get_entry(unsigned int queue);
  50. int qmgr_stat_empty(unsigned int queue);
  51. int qmgr_stat_below_low_watermark(unsigned int queue);
  52. int qmgr_stat_full(unsigned int queue);
  53. int qmgr_stat_overflow(unsigned int queue);
  54. void qmgr_release_queue(unsigned int queue);
  55. void qmgr_set_irq(unsigned int queue, int src,
  56. void (*handler)(void *pdev), void *pdev);
  57. void qmgr_enable_irq(unsigned int queue);
  58. void qmgr_disable_irq(unsigned int queue);
  59. /* request_ and release_queue() must be called from non-IRQ context */
  60. #if DEBUG_QMGR
  61. extern char qmgr_queue_descs[QUEUES][32];
  62. int qmgr_request_queue(unsigned int queue, unsigned int len /* dwords */,
  63. unsigned int nearly_empty_watermark,
  64. unsigned int nearly_full_watermark,
  65. const char *desc_format, const char* name);
  66. #else
  67. int __qmgr_request_queue(unsigned int queue, unsigned int len /* dwords */,
  68. unsigned int nearly_empty_watermark,
  69. unsigned int nearly_full_watermark);
  70. #define qmgr_request_queue(queue, len, nearly_empty_watermark, \
  71. nearly_full_watermark, desc_format, name) \
  72. __qmgr_request_queue(queue, len, nearly_empty_watermark, \
  73. nearly_full_watermark)
  74. #endif
  75. #endif