1/* 2 * Copyright (c) 2005 Ammasso, Inc. All rights reserved. 3 * Copyright (c) 2005 Open Grid Computing, Inc. All rights reserved. 4 * 5 * This software is available to you under a choice of one of two 6 * licenses. You may choose to be licensed under the terms of the GNU 7 * General Public License (GPL) Version 2, available from the file 8 * COPYING in the main directory of this source tree, or the 9 * OpenIB.org BSD license below: 10 * 11 * Redistribution and use in source and binary forms, with or 12 * without modification, are permitted provided that the following 13 * conditions are met: 14 * 15 * - Redistributions of source code must retain the above 16 * copyright notice, this list of conditions and the following 17 * disclaimer. 18 * 19 * - Redistributions in binary form must reproduce the above 20 * copyright notice, this list of conditions and the following 21 * disclaimer in the documentation and/or other materials 22 * provided with the distribution. 23 * 24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 25 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 26 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 27 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 28 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 29 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 30 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 31 * SOFTWARE. 32 */ 33 34#ifndef _C2_MQ_H_ 35#define _C2_MQ_H_ 36#include <linux/kernel.h> 37#include <linux/dma-mapping.h> 38#include "c2_wr.h" 39 40enum c2_shared_regs { 41 42 C2_SHARED_ARMED = 0x10, 43 C2_SHARED_NOTIFY = 0x18, 44 C2_SHARED_SHARED = 0x40, 45}; 46 47struct c2_mq_shared { 48 u16 unused1; 49 u8 armed; 50 u8 notification_type; 51 u32 unused2; 52 u16 shared; 53 /* Pad to 64 bytes. */ 54 u8 pad[64 - sizeof(u16) - 2 * sizeof(u8) - sizeof(u32) - sizeof(u16)]; 55}; 56 57enum c2_mq_type { 58 C2_MQ_HOST_TARGET = 1, 59 C2_MQ_ADAPTER_TARGET = 2, 60}; 61 62/* 63 * c2_mq_t is for kernel-mode MQs like the VQs Cand the AEQ. 64 * c2_user_mq_t (which is the same format) is for user-mode MQs... 65 */ 66#define C2_MQ_MAGIC 0x4d512020 /* 'MQ ' */ 67struct c2_mq { 68 u32 magic; 69 union { 70 u8 *host; 71 u8 __iomem *adapter; 72 } msg_pool; 73 dma_addr_t host_dma; 74 DECLARE_PCI_UNMAP_ADDR(mapping); 75 u16 hint_count; 76 u16 priv; 77 struct c2_mq_shared __iomem *peer; 78 u16 *shared; 79 dma_addr_t shared_dma; 80 u32 q_size; 81 u32 msg_size; 82 u32 index; 83 enum c2_mq_type type; 84}; 85 86static __inline__ int c2_mq_empty(struct c2_mq *q) 87{ 88 return q->priv == be16_to_cpu(*q->shared); 89} 90 91static __inline__ int c2_mq_full(struct c2_mq *q) 92{ 93 return q->priv == (be16_to_cpu(*q->shared) + q->q_size - 1) % q->q_size; 94} 95 96extern void c2_mq_lconsume(struct c2_mq *q, u32 wqe_count); 97extern void *c2_mq_alloc(struct c2_mq *q); 98extern void c2_mq_produce(struct c2_mq *q); 99extern void *c2_mq_consume(struct c2_mq *q); 100extern void c2_mq_free(struct c2_mq *q); 101extern void c2_mq_req_init(struct c2_mq *q, u32 index, u32 q_size, u32 msg_size, 102 u8 __iomem *pool_start, u16 __iomem *peer, u32 type); 103extern void c2_mq_rep_init(struct c2_mq *q, u32 index, u32 q_size, u32 msg_size, 104 u8 *pool_start, u16 __iomem *peer, u32 type); 105 106#endif /* _C2_MQ_H_ */ 107