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