Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /*
0003  * Copyright (C) 2007 Krzysztof Halasa <khc@pm.waw.pl>
0004  */
0005 
0006 #ifndef IXP4XX_QMGR_H
0007 #define IXP4XX_QMGR_H
0008 
0009 #include <linux/io.h>
0010 #include <linux/kernel.h>
0011 
0012 #define DEBUG_QMGR  0
0013 
0014 #define HALF_QUEUES 32
0015 #define QUEUES      64
0016 #define MAX_QUEUE_LENGTH 4  /* in dwords */
0017 
0018 #define QUEUE_STAT1_EMPTY       1 /* queue status bits */
0019 #define QUEUE_STAT1_NEARLY_EMPTY    2
0020 #define QUEUE_STAT1_NEARLY_FULL     4
0021 #define QUEUE_STAT1_FULL        8
0022 #define QUEUE_STAT2_UNDERFLOW       1
0023 #define QUEUE_STAT2_OVERFLOW        2
0024 
0025 #define QUEUE_WATERMARK_0_ENTRIES   0
0026 #define QUEUE_WATERMARK_1_ENTRY     1
0027 #define QUEUE_WATERMARK_2_ENTRIES   2
0028 #define QUEUE_WATERMARK_4_ENTRIES   3
0029 #define QUEUE_WATERMARK_8_ENTRIES   4
0030 #define QUEUE_WATERMARK_16_ENTRIES  5
0031 #define QUEUE_WATERMARK_32_ENTRIES  6
0032 #define QUEUE_WATERMARK_64_ENTRIES  7
0033 
0034 /* queue interrupt request conditions */
0035 #define QUEUE_IRQ_SRC_EMPTY     0
0036 #define QUEUE_IRQ_SRC_NEARLY_EMPTY  1
0037 #define QUEUE_IRQ_SRC_NEARLY_FULL   2
0038 #define QUEUE_IRQ_SRC_FULL      3
0039 #define QUEUE_IRQ_SRC_NOT_EMPTY     4
0040 #define QUEUE_IRQ_SRC_NOT_NEARLY_EMPTY  5
0041 #define QUEUE_IRQ_SRC_NOT_NEARLY_FULL   6
0042 #define QUEUE_IRQ_SRC_NOT_FULL      7
0043 
0044 struct qmgr_regs {
0045     u32 acc[QUEUES][MAX_QUEUE_LENGTH]; /* 0x000 - 0x3FF */
0046     u32 stat1[4];       /* 0x400 - 0x40F */
0047     u32 stat2[2];       /* 0x410 - 0x417 */
0048     u32 statne_h;       /* 0x418 - queue nearly empty */
0049     u32 statf_h;        /* 0x41C - queue full */
0050     u32 irqsrc[4];      /* 0x420 - 0x42F IRC source */
0051     u32 irqen[2];       /* 0x430 - 0x437 IRQ enabled */
0052     u32 irqstat[2];     /* 0x438 - 0x43F - IRQ access only */
0053     u32 reserved[1776];
0054     u32 sram[2048];     /* 0x2000 - 0x3FFF - config and buffer */
0055 };
0056 
0057 void qmgr_put_entry(unsigned int queue, u32 val);
0058 u32 qmgr_get_entry(unsigned int queue);
0059 int qmgr_stat_empty(unsigned int queue);
0060 int qmgr_stat_below_low_watermark(unsigned int queue);
0061 int qmgr_stat_full(unsigned int queue);
0062 int qmgr_stat_overflow(unsigned int queue);
0063 void qmgr_release_queue(unsigned int queue);
0064 void qmgr_set_irq(unsigned int queue, int src,
0065           void (*handler)(void *pdev), void *pdev);
0066 void qmgr_enable_irq(unsigned int queue);
0067 void qmgr_disable_irq(unsigned int queue);
0068 
0069 /* request_ and release_queue() must be called from non-IRQ context */
0070 
0071 #if DEBUG_QMGR
0072 extern char qmgr_queue_descs[QUEUES][32];
0073 
0074 int qmgr_request_queue(unsigned int queue, unsigned int len /* dwords */,
0075                unsigned int nearly_empty_watermark,
0076                unsigned int nearly_full_watermark,
0077                const char *desc_format, const char* name);
0078 #else
0079 int __qmgr_request_queue(unsigned int queue, unsigned int len /* dwords */,
0080              unsigned int nearly_empty_watermark,
0081              unsigned int nearly_full_watermark);
0082 #define qmgr_request_queue(queue, len, nearly_empty_watermark,      \
0083                nearly_full_watermark, desc_format, name)    \
0084     __qmgr_request_queue(queue, len, nearly_empty_watermark,    \
0085                  nearly_full_watermark)
0086 #endif
0087 
0088 #endif