162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * Copyright (c) 2004, 2005 Topspin Communications. All rights reserved. 362306a36Sopenharmony_ci * Copyright (c) 2005 Sun Microsystems, Inc. All rights reserved. 462306a36Sopenharmony_ci * Copyright (c) 2005, 2006 Cisco Systems. All rights reserved. 562306a36Sopenharmony_ci * Copyright (c) 2005 Mellanox Technologies. All rights reserved. 662306a36Sopenharmony_ci * Copyright (c) 2004 Voltaire, Inc. All rights reserved. 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci * This software is available to you under a choice of one of two 962306a36Sopenharmony_ci * licenses. You may choose to be licensed under the terms of the GNU 1062306a36Sopenharmony_ci * General Public License (GPL) Version 2, available from the file 1162306a36Sopenharmony_ci * COPYING in the main directory of this source tree, or the 1262306a36Sopenharmony_ci * OpenIB.org BSD license below: 1362306a36Sopenharmony_ci * 1462306a36Sopenharmony_ci * Redistribution and use in source and binary forms, with or 1562306a36Sopenharmony_ci * without modification, are permitted provided that the following 1662306a36Sopenharmony_ci * conditions are met: 1762306a36Sopenharmony_ci * 1862306a36Sopenharmony_ci * - Redistributions of source code must retain the above 1962306a36Sopenharmony_ci * copyright notice, this list of conditions and the following 2062306a36Sopenharmony_ci * disclaimer. 2162306a36Sopenharmony_ci * 2262306a36Sopenharmony_ci * - Redistributions in binary form must reproduce the above 2362306a36Sopenharmony_ci * copyright notice, this list of conditions and the following 2462306a36Sopenharmony_ci * disclaimer in the documentation and/or other materials 2562306a36Sopenharmony_ci * provided with the distribution. 2662306a36Sopenharmony_ci * 2762306a36Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 2862306a36Sopenharmony_ci * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 2962306a36Sopenharmony_ci * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 3062306a36Sopenharmony_ci * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 3162306a36Sopenharmony_ci * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 3262306a36Sopenharmony_ci * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 3362306a36Sopenharmony_ci * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 3462306a36Sopenharmony_ci * SOFTWARE. 3562306a36Sopenharmony_ci */ 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci#ifndef MTHCA_DEV_H 3862306a36Sopenharmony_ci#define MTHCA_DEV_H 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci#include <linux/spinlock.h> 4162306a36Sopenharmony_ci#include <linux/kernel.h> 4262306a36Sopenharmony_ci#include <linux/pci.h> 4362306a36Sopenharmony_ci#include <linux/dma-mapping.h> 4462306a36Sopenharmony_ci#include <linux/timer.h> 4562306a36Sopenharmony_ci#include <linux/mutex.h> 4662306a36Sopenharmony_ci#include <linux/list.h> 4762306a36Sopenharmony_ci#include <linux/semaphore.h> 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci#include "mthca_provider.h" 5062306a36Sopenharmony_ci#include "mthca_doorbell.h" 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci#define DRV_NAME "ib_mthca" 5362306a36Sopenharmony_ci#define PFX DRV_NAME ": " 5462306a36Sopenharmony_ci#define DRV_VERSION "1.0" 5562306a36Sopenharmony_ci#define DRV_RELDATE "April 4, 2008" 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_cienum { 5862306a36Sopenharmony_ci MTHCA_FLAG_DDR_HIDDEN = 1 << 1, 5962306a36Sopenharmony_ci MTHCA_FLAG_SRQ = 1 << 2, 6062306a36Sopenharmony_ci MTHCA_FLAG_MSI_X = 1 << 3, 6162306a36Sopenharmony_ci MTHCA_FLAG_NO_LAM = 1 << 4, 6262306a36Sopenharmony_ci MTHCA_FLAG_FMR = 1 << 5, 6362306a36Sopenharmony_ci MTHCA_FLAG_MEMFREE = 1 << 6, 6462306a36Sopenharmony_ci MTHCA_FLAG_PCIE = 1 << 7, 6562306a36Sopenharmony_ci MTHCA_FLAG_SINAI_OPT = 1 << 8 6662306a36Sopenharmony_ci}; 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_cienum { 6962306a36Sopenharmony_ci MTHCA_MAX_PORTS = 2 7062306a36Sopenharmony_ci}; 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_cienum { 7362306a36Sopenharmony_ci MTHCA_BOARD_ID_LEN = 64 7462306a36Sopenharmony_ci}; 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_cienum { 7762306a36Sopenharmony_ci MTHCA_EQ_CONTEXT_SIZE = 0x40, 7862306a36Sopenharmony_ci MTHCA_CQ_CONTEXT_SIZE = 0x40, 7962306a36Sopenharmony_ci MTHCA_QP_CONTEXT_SIZE = 0x200, 8062306a36Sopenharmony_ci MTHCA_RDB_ENTRY_SIZE = 0x20, 8162306a36Sopenharmony_ci MTHCA_AV_SIZE = 0x20, 8262306a36Sopenharmony_ci MTHCA_MGM_ENTRY_SIZE = 0x100, 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci /* Arbel FW gives us these, but we need them for Tavor */ 8562306a36Sopenharmony_ci MTHCA_MPT_ENTRY_SIZE = 0x40, 8662306a36Sopenharmony_ci MTHCA_MTT_SEG_SIZE = 0x40, 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ci MTHCA_QP_PER_MGM = 4 * (MTHCA_MGM_ENTRY_SIZE / 16 - 2) 8962306a36Sopenharmony_ci}; 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_cienum { 9262306a36Sopenharmony_ci MTHCA_EQ_CMD, 9362306a36Sopenharmony_ci MTHCA_EQ_ASYNC, 9462306a36Sopenharmony_ci MTHCA_EQ_COMP, 9562306a36Sopenharmony_ci MTHCA_NUM_EQ 9662306a36Sopenharmony_ci}; 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_cienum { 9962306a36Sopenharmony_ci MTHCA_OPCODE_NOP = 0x00, 10062306a36Sopenharmony_ci MTHCA_OPCODE_RDMA_WRITE = 0x08, 10162306a36Sopenharmony_ci MTHCA_OPCODE_RDMA_WRITE_IMM = 0x09, 10262306a36Sopenharmony_ci MTHCA_OPCODE_SEND = 0x0a, 10362306a36Sopenharmony_ci MTHCA_OPCODE_SEND_IMM = 0x0b, 10462306a36Sopenharmony_ci MTHCA_OPCODE_RDMA_READ = 0x10, 10562306a36Sopenharmony_ci MTHCA_OPCODE_ATOMIC_CS = 0x11, 10662306a36Sopenharmony_ci MTHCA_OPCODE_ATOMIC_FA = 0x12, 10762306a36Sopenharmony_ci MTHCA_OPCODE_BIND_MW = 0x18, 10862306a36Sopenharmony_ci}; 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_cienum { 11162306a36Sopenharmony_ci MTHCA_CMD_USE_EVENTS = 1 << 0, 11262306a36Sopenharmony_ci MTHCA_CMD_POST_DOORBELLS = 1 << 1 11362306a36Sopenharmony_ci}; 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_cienum { 11662306a36Sopenharmony_ci MTHCA_CMD_NUM_DBELL_DWORDS = 8 11762306a36Sopenharmony_ci}; 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_cistruct mthca_cmd { 12062306a36Sopenharmony_ci struct dma_pool *pool; 12162306a36Sopenharmony_ci struct mutex hcr_mutex; 12262306a36Sopenharmony_ci struct semaphore poll_sem; 12362306a36Sopenharmony_ci struct semaphore event_sem; 12462306a36Sopenharmony_ci int max_cmds; 12562306a36Sopenharmony_ci spinlock_t context_lock; 12662306a36Sopenharmony_ci int free_head; 12762306a36Sopenharmony_ci struct mthca_cmd_context *context; 12862306a36Sopenharmony_ci u16 token_mask; 12962306a36Sopenharmony_ci u32 flags; 13062306a36Sopenharmony_ci void __iomem *dbell_map; 13162306a36Sopenharmony_ci u16 dbell_offsets[MTHCA_CMD_NUM_DBELL_DWORDS]; 13262306a36Sopenharmony_ci}; 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_cistruct mthca_limits { 13562306a36Sopenharmony_ci int num_ports; 13662306a36Sopenharmony_ci int vl_cap; 13762306a36Sopenharmony_ci int mtu_cap; 13862306a36Sopenharmony_ci int gid_table_len; 13962306a36Sopenharmony_ci int pkey_table_len; 14062306a36Sopenharmony_ci int local_ca_ack_delay; 14162306a36Sopenharmony_ci int num_uars; 14262306a36Sopenharmony_ci int max_sg; 14362306a36Sopenharmony_ci int num_qps; 14462306a36Sopenharmony_ci int max_wqes; 14562306a36Sopenharmony_ci int max_desc_sz; 14662306a36Sopenharmony_ci int max_qp_init_rdma; 14762306a36Sopenharmony_ci int reserved_qps; 14862306a36Sopenharmony_ci int num_srqs; 14962306a36Sopenharmony_ci int max_srq_wqes; 15062306a36Sopenharmony_ci int max_srq_sge; 15162306a36Sopenharmony_ci int reserved_srqs; 15262306a36Sopenharmony_ci int num_eecs; 15362306a36Sopenharmony_ci int reserved_eecs; 15462306a36Sopenharmony_ci int num_cqs; 15562306a36Sopenharmony_ci int max_cqes; 15662306a36Sopenharmony_ci int reserved_cqs; 15762306a36Sopenharmony_ci int num_eqs; 15862306a36Sopenharmony_ci int reserved_eqs; 15962306a36Sopenharmony_ci int num_mpts; 16062306a36Sopenharmony_ci int num_mtt_segs; 16162306a36Sopenharmony_ci int mtt_seg_size; 16262306a36Sopenharmony_ci int fmr_reserved_mtts; 16362306a36Sopenharmony_ci int reserved_mtts; 16462306a36Sopenharmony_ci int reserved_mrws; 16562306a36Sopenharmony_ci int reserved_uars; 16662306a36Sopenharmony_ci int num_mgms; 16762306a36Sopenharmony_ci int num_amgms; 16862306a36Sopenharmony_ci int reserved_mcgs; 16962306a36Sopenharmony_ci int num_pds; 17062306a36Sopenharmony_ci int reserved_pds; 17162306a36Sopenharmony_ci u32 page_size_cap; 17262306a36Sopenharmony_ci u32 flags; 17362306a36Sopenharmony_ci u16 stat_rate_support; 17462306a36Sopenharmony_ci u8 port_width_cap; 17562306a36Sopenharmony_ci}; 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_cistruct mthca_alloc { 17862306a36Sopenharmony_ci u32 last; 17962306a36Sopenharmony_ci u32 top; 18062306a36Sopenharmony_ci u32 max; 18162306a36Sopenharmony_ci u32 mask; 18262306a36Sopenharmony_ci spinlock_t lock; 18362306a36Sopenharmony_ci unsigned long *table; 18462306a36Sopenharmony_ci}; 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_cistruct mthca_array { 18762306a36Sopenharmony_ci struct { 18862306a36Sopenharmony_ci void **page; 18962306a36Sopenharmony_ci int used; 19062306a36Sopenharmony_ci } *page_list; 19162306a36Sopenharmony_ci}; 19262306a36Sopenharmony_ci 19362306a36Sopenharmony_cistruct mthca_uar_table { 19462306a36Sopenharmony_ci struct mthca_alloc alloc; 19562306a36Sopenharmony_ci u64 uarc_base; 19662306a36Sopenharmony_ci int uarc_size; 19762306a36Sopenharmony_ci}; 19862306a36Sopenharmony_ci 19962306a36Sopenharmony_cistruct mthca_pd_table { 20062306a36Sopenharmony_ci struct mthca_alloc alloc; 20162306a36Sopenharmony_ci}; 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_cistruct mthca_buddy { 20462306a36Sopenharmony_ci unsigned long **bits; 20562306a36Sopenharmony_ci int *num_free; 20662306a36Sopenharmony_ci int max_order; 20762306a36Sopenharmony_ci spinlock_t lock; 20862306a36Sopenharmony_ci}; 20962306a36Sopenharmony_ci 21062306a36Sopenharmony_cistruct mthca_mr_table { 21162306a36Sopenharmony_ci struct mthca_alloc mpt_alloc; 21262306a36Sopenharmony_ci struct mthca_buddy mtt_buddy; 21362306a36Sopenharmony_ci struct mthca_buddy *fmr_mtt_buddy; 21462306a36Sopenharmony_ci u64 mtt_base; 21562306a36Sopenharmony_ci u64 mpt_base; 21662306a36Sopenharmony_ci struct mthca_icm_table *mtt_table; 21762306a36Sopenharmony_ci struct mthca_icm_table *mpt_table; 21862306a36Sopenharmony_ci struct { 21962306a36Sopenharmony_ci void __iomem *mpt_base; 22062306a36Sopenharmony_ci void __iomem *mtt_base; 22162306a36Sopenharmony_ci struct mthca_buddy mtt_buddy; 22262306a36Sopenharmony_ci } tavor_fmr; 22362306a36Sopenharmony_ci}; 22462306a36Sopenharmony_ci 22562306a36Sopenharmony_cistruct mthca_eq_table { 22662306a36Sopenharmony_ci struct mthca_alloc alloc; 22762306a36Sopenharmony_ci void __iomem *clr_int; 22862306a36Sopenharmony_ci u32 clr_mask; 22962306a36Sopenharmony_ci u32 arm_mask; 23062306a36Sopenharmony_ci struct mthca_eq eq[MTHCA_NUM_EQ]; 23162306a36Sopenharmony_ci u64 icm_virt; 23262306a36Sopenharmony_ci struct page *icm_page; 23362306a36Sopenharmony_ci dma_addr_t icm_dma; 23462306a36Sopenharmony_ci int have_irq; 23562306a36Sopenharmony_ci u8 inta_pin; 23662306a36Sopenharmony_ci}; 23762306a36Sopenharmony_ci 23862306a36Sopenharmony_cistruct mthca_cq_table { 23962306a36Sopenharmony_ci struct mthca_alloc alloc; 24062306a36Sopenharmony_ci spinlock_t lock; 24162306a36Sopenharmony_ci struct mthca_array cq; 24262306a36Sopenharmony_ci struct mthca_icm_table *table; 24362306a36Sopenharmony_ci}; 24462306a36Sopenharmony_ci 24562306a36Sopenharmony_cistruct mthca_srq_table { 24662306a36Sopenharmony_ci struct mthca_alloc alloc; 24762306a36Sopenharmony_ci spinlock_t lock; 24862306a36Sopenharmony_ci struct mthca_array srq; 24962306a36Sopenharmony_ci struct mthca_icm_table *table; 25062306a36Sopenharmony_ci}; 25162306a36Sopenharmony_ci 25262306a36Sopenharmony_cistruct mthca_qp_table { 25362306a36Sopenharmony_ci struct mthca_alloc alloc; 25462306a36Sopenharmony_ci u32 rdb_base; 25562306a36Sopenharmony_ci int rdb_shift; 25662306a36Sopenharmony_ci int sqp_start; 25762306a36Sopenharmony_ci spinlock_t lock; 25862306a36Sopenharmony_ci struct mthca_array qp; 25962306a36Sopenharmony_ci struct mthca_icm_table *qp_table; 26062306a36Sopenharmony_ci struct mthca_icm_table *eqp_table; 26162306a36Sopenharmony_ci struct mthca_icm_table *rdb_table; 26262306a36Sopenharmony_ci}; 26362306a36Sopenharmony_ci 26462306a36Sopenharmony_cistruct mthca_av_table { 26562306a36Sopenharmony_ci struct dma_pool *pool; 26662306a36Sopenharmony_ci int num_ddr_avs; 26762306a36Sopenharmony_ci u64 ddr_av_base; 26862306a36Sopenharmony_ci void __iomem *av_map; 26962306a36Sopenharmony_ci struct mthca_alloc alloc; 27062306a36Sopenharmony_ci}; 27162306a36Sopenharmony_ci 27262306a36Sopenharmony_cistruct mthca_mcg_table { 27362306a36Sopenharmony_ci struct mutex mutex; 27462306a36Sopenharmony_ci struct mthca_alloc alloc; 27562306a36Sopenharmony_ci struct mthca_icm_table *table; 27662306a36Sopenharmony_ci}; 27762306a36Sopenharmony_ci 27862306a36Sopenharmony_cistruct mthca_catas_err { 27962306a36Sopenharmony_ci u64 addr; 28062306a36Sopenharmony_ci u32 __iomem *map; 28162306a36Sopenharmony_ci u32 size; 28262306a36Sopenharmony_ci struct timer_list timer; 28362306a36Sopenharmony_ci struct list_head list; 28462306a36Sopenharmony_ci}; 28562306a36Sopenharmony_ci 28662306a36Sopenharmony_ciextern struct mutex mthca_device_mutex; 28762306a36Sopenharmony_ci 28862306a36Sopenharmony_cistruct mthca_dev { 28962306a36Sopenharmony_ci struct ib_device ib_dev; 29062306a36Sopenharmony_ci struct pci_dev *pdev; 29162306a36Sopenharmony_ci 29262306a36Sopenharmony_ci int hca_type; 29362306a36Sopenharmony_ci unsigned long mthca_flags; 29462306a36Sopenharmony_ci unsigned long device_cap_flags; 29562306a36Sopenharmony_ci 29662306a36Sopenharmony_ci u32 rev_id; 29762306a36Sopenharmony_ci char board_id[MTHCA_BOARD_ID_LEN]; 29862306a36Sopenharmony_ci 29962306a36Sopenharmony_ci /* firmware info */ 30062306a36Sopenharmony_ci u64 fw_ver; 30162306a36Sopenharmony_ci union { 30262306a36Sopenharmony_ci struct { 30362306a36Sopenharmony_ci u64 fw_start; 30462306a36Sopenharmony_ci u64 fw_end; 30562306a36Sopenharmony_ci } tavor; 30662306a36Sopenharmony_ci struct { 30762306a36Sopenharmony_ci u64 clr_int_base; 30862306a36Sopenharmony_ci u64 eq_arm_base; 30962306a36Sopenharmony_ci u64 eq_set_ci_base; 31062306a36Sopenharmony_ci struct mthca_icm *fw_icm; 31162306a36Sopenharmony_ci struct mthca_icm *aux_icm; 31262306a36Sopenharmony_ci u16 fw_pages; 31362306a36Sopenharmony_ci } arbel; 31462306a36Sopenharmony_ci } fw; 31562306a36Sopenharmony_ci 31662306a36Sopenharmony_ci u64 ddr_start; 31762306a36Sopenharmony_ci u64 ddr_end; 31862306a36Sopenharmony_ci 31962306a36Sopenharmony_ci MTHCA_DECLARE_DOORBELL_LOCK(doorbell_lock) 32062306a36Sopenharmony_ci struct mutex cap_mask_mutex; 32162306a36Sopenharmony_ci 32262306a36Sopenharmony_ci void __iomem *hcr; 32362306a36Sopenharmony_ci void __iomem *kar; 32462306a36Sopenharmony_ci void __iomem *clr_base; 32562306a36Sopenharmony_ci union { 32662306a36Sopenharmony_ci struct { 32762306a36Sopenharmony_ci void __iomem *ecr_base; 32862306a36Sopenharmony_ci } tavor; 32962306a36Sopenharmony_ci struct { 33062306a36Sopenharmony_ci void __iomem *eq_arm; 33162306a36Sopenharmony_ci void __iomem *eq_set_ci_base; 33262306a36Sopenharmony_ci } arbel; 33362306a36Sopenharmony_ci } eq_regs; 33462306a36Sopenharmony_ci 33562306a36Sopenharmony_ci struct mthca_cmd cmd; 33662306a36Sopenharmony_ci struct mthca_limits limits; 33762306a36Sopenharmony_ci 33862306a36Sopenharmony_ci struct mthca_uar_table uar_table; 33962306a36Sopenharmony_ci struct mthca_pd_table pd_table; 34062306a36Sopenharmony_ci struct mthca_mr_table mr_table; 34162306a36Sopenharmony_ci struct mthca_eq_table eq_table; 34262306a36Sopenharmony_ci struct mthca_cq_table cq_table; 34362306a36Sopenharmony_ci struct mthca_srq_table srq_table; 34462306a36Sopenharmony_ci struct mthca_qp_table qp_table; 34562306a36Sopenharmony_ci struct mthca_av_table av_table; 34662306a36Sopenharmony_ci struct mthca_mcg_table mcg_table; 34762306a36Sopenharmony_ci 34862306a36Sopenharmony_ci struct mthca_catas_err catas_err; 34962306a36Sopenharmony_ci 35062306a36Sopenharmony_ci struct mthca_uar driver_uar; 35162306a36Sopenharmony_ci struct mthca_db_table *db_tab; 35262306a36Sopenharmony_ci struct mthca_pd driver_pd; 35362306a36Sopenharmony_ci struct mthca_mr driver_mr; 35462306a36Sopenharmony_ci 35562306a36Sopenharmony_ci struct ib_mad_agent *send_agent[MTHCA_MAX_PORTS][2]; 35662306a36Sopenharmony_ci struct ib_ah *sm_ah[MTHCA_MAX_PORTS]; 35762306a36Sopenharmony_ci spinlock_t sm_lock; 35862306a36Sopenharmony_ci u8 rate[MTHCA_MAX_PORTS]; 35962306a36Sopenharmony_ci bool active; 36062306a36Sopenharmony_ci}; 36162306a36Sopenharmony_ci 36262306a36Sopenharmony_ci#ifdef CONFIG_INFINIBAND_MTHCA_DEBUG 36362306a36Sopenharmony_ciextern int mthca_debug_level; 36462306a36Sopenharmony_ci 36562306a36Sopenharmony_ci#define mthca_dbg(mdev, format, arg...) \ 36662306a36Sopenharmony_ci do { \ 36762306a36Sopenharmony_ci if (mthca_debug_level) \ 36862306a36Sopenharmony_ci dev_printk(KERN_DEBUG, &mdev->pdev->dev, format, ## arg); \ 36962306a36Sopenharmony_ci } while (0) 37062306a36Sopenharmony_ci 37162306a36Sopenharmony_ci#else /* CONFIG_INFINIBAND_MTHCA_DEBUG */ 37262306a36Sopenharmony_ci 37362306a36Sopenharmony_ci#define mthca_dbg(mdev, format, arg...) do { (void) mdev; } while (0) 37462306a36Sopenharmony_ci 37562306a36Sopenharmony_ci#endif /* CONFIG_INFINIBAND_MTHCA_DEBUG */ 37662306a36Sopenharmony_ci 37762306a36Sopenharmony_ci#define mthca_err(mdev, format, arg...) \ 37862306a36Sopenharmony_ci dev_err(&mdev->pdev->dev, format, ## arg) 37962306a36Sopenharmony_ci#define mthca_info(mdev, format, arg...) \ 38062306a36Sopenharmony_ci dev_info(&mdev->pdev->dev, format, ## arg) 38162306a36Sopenharmony_ci#define mthca_warn(mdev, format, arg...) \ 38262306a36Sopenharmony_ci dev_warn(&mdev->pdev->dev, format, ## arg) 38362306a36Sopenharmony_ci 38462306a36Sopenharmony_ciextern void __buggy_use_of_MTHCA_GET(void); 38562306a36Sopenharmony_ciextern void __buggy_use_of_MTHCA_PUT(void); 38662306a36Sopenharmony_ci 38762306a36Sopenharmony_ci#define MTHCA_GET(dest, source, offset) \ 38862306a36Sopenharmony_ci do { \ 38962306a36Sopenharmony_ci void *__p = (char *) (source) + (offset); \ 39062306a36Sopenharmony_ci switch (sizeof (dest)) { \ 39162306a36Sopenharmony_ci case 1: (dest) = *(u8 *) __p; break; \ 39262306a36Sopenharmony_ci case 2: (dest) = be16_to_cpup(__p); break; \ 39362306a36Sopenharmony_ci case 4: (dest) = be32_to_cpup(__p); break; \ 39462306a36Sopenharmony_ci case 8: (dest) = be64_to_cpup(__p); break; \ 39562306a36Sopenharmony_ci default: __buggy_use_of_MTHCA_GET(); \ 39662306a36Sopenharmony_ci } \ 39762306a36Sopenharmony_ci } while (0) 39862306a36Sopenharmony_ci 39962306a36Sopenharmony_ci#define MTHCA_PUT(dest, source, offset) \ 40062306a36Sopenharmony_ci do { \ 40162306a36Sopenharmony_ci void *__d = ((char *) (dest) + (offset)); \ 40262306a36Sopenharmony_ci switch (sizeof(source)) { \ 40362306a36Sopenharmony_ci case 1: *(u8 *) __d = (source); break; \ 40462306a36Sopenharmony_ci case 2: *(__be16 *) __d = cpu_to_be16(source); break; \ 40562306a36Sopenharmony_ci case 4: *(__be32 *) __d = cpu_to_be32(source); break; \ 40662306a36Sopenharmony_ci case 8: *(__be64 *) __d = cpu_to_be64(source); break; \ 40762306a36Sopenharmony_ci default: __buggy_use_of_MTHCA_PUT(); \ 40862306a36Sopenharmony_ci } \ 40962306a36Sopenharmony_ci } while (0) 41062306a36Sopenharmony_ci 41162306a36Sopenharmony_ciint mthca_reset(struct mthca_dev *mdev); 41262306a36Sopenharmony_ci 41362306a36Sopenharmony_ciu32 mthca_alloc(struct mthca_alloc *alloc); 41462306a36Sopenharmony_civoid mthca_free(struct mthca_alloc *alloc, u32 obj); 41562306a36Sopenharmony_ciint mthca_alloc_init(struct mthca_alloc *alloc, u32 num, u32 mask, 41662306a36Sopenharmony_ci u32 reserved); 41762306a36Sopenharmony_civoid mthca_alloc_cleanup(struct mthca_alloc *alloc); 41862306a36Sopenharmony_civoid *mthca_array_get(struct mthca_array *array, int index); 41962306a36Sopenharmony_ciint mthca_array_set(struct mthca_array *array, int index, void *value); 42062306a36Sopenharmony_civoid mthca_array_clear(struct mthca_array *array, int index); 42162306a36Sopenharmony_ciint mthca_array_init(struct mthca_array *array, int nent); 42262306a36Sopenharmony_civoid mthca_array_cleanup(struct mthca_array *array, int nent); 42362306a36Sopenharmony_ciint mthca_buf_alloc(struct mthca_dev *dev, int size, int max_direct, 42462306a36Sopenharmony_ci union mthca_buf *buf, int *is_direct, struct mthca_pd *pd, 42562306a36Sopenharmony_ci int hca_write, struct mthca_mr *mr); 42662306a36Sopenharmony_civoid mthca_buf_free(struct mthca_dev *dev, int size, union mthca_buf *buf, 42762306a36Sopenharmony_ci int is_direct, struct mthca_mr *mr); 42862306a36Sopenharmony_ci 42962306a36Sopenharmony_ciint mthca_init_uar_table(struct mthca_dev *dev); 43062306a36Sopenharmony_ciint mthca_init_pd_table(struct mthca_dev *dev); 43162306a36Sopenharmony_ciint mthca_init_mr_table(struct mthca_dev *dev); 43262306a36Sopenharmony_ciint mthca_init_eq_table(struct mthca_dev *dev); 43362306a36Sopenharmony_ciint mthca_init_cq_table(struct mthca_dev *dev); 43462306a36Sopenharmony_ciint mthca_init_srq_table(struct mthca_dev *dev); 43562306a36Sopenharmony_ciint mthca_init_qp_table(struct mthca_dev *dev); 43662306a36Sopenharmony_ciint mthca_init_av_table(struct mthca_dev *dev); 43762306a36Sopenharmony_ciint mthca_init_mcg_table(struct mthca_dev *dev); 43862306a36Sopenharmony_ci 43962306a36Sopenharmony_civoid mthca_cleanup_uar_table(struct mthca_dev *dev); 44062306a36Sopenharmony_civoid mthca_cleanup_pd_table(struct mthca_dev *dev); 44162306a36Sopenharmony_civoid mthca_cleanup_mr_table(struct mthca_dev *dev); 44262306a36Sopenharmony_civoid mthca_cleanup_eq_table(struct mthca_dev *dev); 44362306a36Sopenharmony_civoid mthca_cleanup_cq_table(struct mthca_dev *dev); 44462306a36Sopenharmony_civoid mthca_cleanup_srq_table(struct mthca_dev *dev); 44562306a36Sopenharmony_civoid mthca_cleanup_qp_table(struct mthca_dev *dev); 44662306a36Sopenharmony_civoid mthca_cleanup_av_table(struct mthca_dev *dev); 44762306a36Sopenharmony_civoid mthca_cleanup_mcg_table(struct mthca_dev *dev); 44862306a36Sopenharmony_ci 44962306a36Sopenharmony_ciint mthca_register_device(struct mthca_dev *dev); 45062306a36Sopenharmony_civoid mthca_unregister_device(struct mthca_dev *dev); 45162306a36Sopenharmony_ci 45262306a36Sopenharmony_civoid mthca_start_catas_poll(struct mthca_dev *dev); 45362306a36Sopenharmony_civoid mthca_stop_catas_poll(struct mthca_dev *dev); 45462306a36Sopenharmony_ciint __mthca_restart_one(struct pci_dev *pdev); 45562306a36Sopenharmony_ciint mthca_catas_init(void); 45662306a36Sopenharmony_civoid mthca_catas_cleanup(void); 45762306a36Sopenharmony_ci 45862306a36Sopenharmony_ciint mthca_uar_alloc(struct mthca_dev *dev, struct mthca_uar *uar); 45962306a36Sopenharmony_civoid mthca_uar_free(struct mthca_dev *dev, struct mthca_uar *uar); 46062306a36Sopenharmony_ci 46162306a36Sopenharmony_ciint mthca_pd_alloc(struct mthca_dev *dev, int privileged, struct mthca_pd *pd); 46262306a36Sopenharmony_civoid mthca_pd_free(struct mthca_dev *dev, struct mthca_pd *pd); 46362306a36Sopenharmony_ci 46462306a36Sopenharmony_ciint mthca_write_mtt_size(struct mthca_dev *dev); 46562306a36Sopenharmony_ci 46662306a36Sopenharmony_cistruct mthca_mtt *mthca_alloc_mtt(struct mthca_dev *dev, int size); 46762306a36Sopenharmony_civoid mthca_free_mtt(struct mthca_dev *dev, struct mthca_mtt *mtt); 46862306a36Sopenharmony_ciint mthca_write_mtt(struct mthca_dev *dev, struct mthca_mtt *mtt, 46962306a36Sopenharmony_ci int start_index, u64 *buffer_list, int list_len); 47062306a36Sopenharmony_ciint mthca_mr_alloc(struct mthca_dev *dev, u32 pd, int buffer_size_shift, 47162306a36Sopenharmony_ci u64 iova, u64 total_size, u32 access, struct mthca_mr *mr); 47262306a36Sopenharmony_ciint mthca_mr_alloc_notrans(struct mthca_dev *dev, u32 pd, 47362306a36Sopenharmony_ci u32 access, struct mthca_mr *mr); 47462306a36Sopenharmony_ciint mthca_mr_alloc_phys(struct mthca_dev *dev, u32 pd, 47562306a36Sopenharmony_ci u64 *buffer_list, int buffer_size_shift, 47662306a36Sopenharmony_ci int list_len, u64 iova, u64 total_size, 47762306a36Sopenharmony_ci u32 access, struct mthca_mr *mr); 47862306a36Sopenharmony_civoid mthca_free_mr(struct mthca_dev *dev, struct mthca_mr *mr); 47962306a36Sopenharmony_ci 48062306a36Sopenharmony_ciint mthca_map_eq_icm(struct mthca_dev *dev, u64 icm_virt); 48162306a36Sopenharmony_civoid mthca_unmap_eq_icm(struct mthca_dev *dev); 48262306a36Sopenharmony_ci 48362306a36Sopenharmony_ciint mthca_poll_cq(struct ib_cq *ibcq, int num_entries, 48462306a36Sopenharmony_ci struct ib_wc *entry); 48562306a36Sopenharmony_ciint mthca_tavor_arm_cq(struct ib_cq *cq, enum ib_cq_notify_flags flags); 48662306a36Sopenharmony_ciint mthca_arbel_arm_cq(struct ib_cq *cq, enum ib_cq_notify_flags flags); 48762306a36Sopenharmony_ciint mthca_init_cq(struct mthca_dev *dev, int nent, 48862306a36Sopenharmony_ci struct mthca_ucontext *ctx, u32 pdn, 48962306a36Sopenharmony_ci struct mthca_cq *cq); 49062306a36Sopenharmony_civoid mthca_free_cq(struct mthca_dev *dev, 49162306a36Sopenharmony_ci struct mthca_cq *cq); 49262306a36Sopenharmony_civoid mthca_cq_completion(struct mthca_dev *dev, u32 cqn); 49362306a36Sopenharmony_civoid mthca_cq_event(struct mthca_dev *dev, u32 cqn, 49462306a36Sopenharmony_ci enum ib_event_type event_type); 49562306a36Sopenharmony_civoid mthca_cq_clean(struct mthca_dev *dev, struct mthca_cq *cq, u32 qpn, 49662306a36Sopenharmony_ci struct mthca_srq *srq); 49762306a36Sopenharmony_civoid mthca_cq_resize_copy_cqes(struct mthca_cq *cq); 49862306a36Sopenharmony_ciint mthca_alloc_cq_buf(struct mthca_dev *dev, struct mthca_cq_buf *buf, int nent); 49962306a36Sopenharmony_civoid mthca_free_cq_buf(struct mthca_dev *dev, struct mthca_cq_buf *buf, int cqe); 50062306a36Sopenharmony_ci 50162306a36Sopenharmony_ciint mthca_alloc_srq(struct mthca_dev *dev, struct mthca_pd *pd, 50262306a36Sopenharmony_ci struct ib_srq_attr *attr, struct mthca_srq *srq, 50362306a36Sopenharmony_ci struct ib_udata *udata); 50462306a36Sopenharmony_civoid mthca_free_srq(struct mthca_dev *dev, struct mthca_srq *srq); 50562306a36Sopenharmony_ciint mthca_modify_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr, 50662306a36Sopenharmony_ci enum ib_srq_attr_mask attr_mask, struct ib_udata *udata); 50762306a36Sopenharmony_ciint mthca_query_srq(struct ib_srq *srq, struct ib_srq_attr *srq_attr); 50862306a36Sopenharmony_ciint mthca_max_srq_sge(struct mthca_dev *dev); 50962306a36Sopenharmony_civoid mthca_srq_event(struct mthca_dev *dev, u32 srqn, 51062306a36Sopenharmony_ci enum ib_event_type event_type); 51162306a36Sopenharmony_civoid mthca_free_srq_wqe(struct mthca_srq *srq, u32 wqe_addr); 51262306a36Sopenharmony_ciint mthca_tavor_post_srq_recv(struct ib_srq *srq, const struct ib_recv_wr *wr, 51362306a36Sopenharmony_ci const struct ib_recv_wr **bad_wr); 51462306a36Sopenharmony_ciint mthca_arbel_post_srq_recv(struct ib_srq *srq, const struct ib_recv_wr *wr, 51562306a36Sopenharmony_ci const struct ib_recv_wr **bad_wr); 51662306a36Sopenharmony_ci 51762306a36Sopenharmony_civoid mthca_qp_event(struct mthca_dev *dev, u32 qpn, 51862306a36Sopenharmony_ci enum ib_event_type event_type); 51962306a36Sopenharmony_ciint mthca_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *qp_attr, int qp_attr_mask, 52062306a36Sopenharmony_ci struct ib_qp_init_attr *qp_init_attr); 52162306a36Sopenharmony_ciint mthca_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, int attr_mask, 52262306a36Sopenharmony_ci struct ib_udata *udata); 52362306a36Sopenharmony_ciint mthca_tavor_post_send(struct ib_qp *ibqp, const struct ib_send_wr *wr, 52462306a36Sopenharmony_ci const struct ib_send_wr **bad_wr); 52562306a36Sopenharmony_ciint mthca_tavor_post_receive(struct ib_qp *ibqp, const struct ib_recv_wr *wr, 52662306a36Sopenharmony_ci const struct ib_recv_wr **bad_wr); 52762306a36Sopenharmony_ciint mthca_arbel_post_send(struct ib_qp *ibqp, const struct ib_send_wr *wr, 52862306a36Sopenharmony_ci const struct ib_send_wr **bad_wr); 52962306a36Sopenharmony_ciint mthca_arbel_post_receive(struct ib_qp *ibqp, const struct ib_recv_wr *wr, 53062306a36Sopenharmony_ci const struct ib_recv_wr **bad_wr); 53162306a36Sopenharmony_civoid mthca_free_err_wqe(struct mthca_dev *dev, struct mthca_qp *qp, int is_send, 53262306a36Sopenharmony_ci int index, int *dbd, __be32 *new_wqe); 53362306a36Sopenharmony_ciint mthca_alloc_qp(struct mthca_dev *dev, 53462306a36Sopenharmony_ci struct mthca_pd *pd, 53562306a36Sopenharmony_ci struct mthca_cq *send_cq, 53662306a36Sopenharmony_ci struct mthca_cq *recv_cq, 53762306a36Sopenharmony_ci enum ib_qp_type type, 53862306a36Sopenharmony_ci enum ib_sig_type send_policy, 53962306a36Sopenharmony_ci struct ib_qp_cap *cap, 54062306a36Sopenharmony_ci struct mthca_qp *qp, 54162306a36Sopenharmony_ci struct ib_udata *udata); 54262306a36Sopenharmony_ciint mthca_alloc_sqp(struct mthca_dev *dev, 54362306a36Sopenharmony_ci struct mthca_pd *pd, 54462306a36Sopenharmony_ci struct mthca_cq *send_cq, 54562306a36Sopenharmony_ci struct mthca_cq *recv_cq, 54662306a36Sopenharmony_ci enum ib_sig_type send_policy, 54762306a36Sopenharmony_ci struct ib_qp_cap *cap, 54862306a36Sopenharmony_ci int qpn, 54962306a36Sopenharmony_ci u32 port, 55062306a36Sopenharmony_ci struct mthca_qp *qp, 55162306a36Sopenharmony_ci struct ib_udata *udata); 55262306a36Sopenharmony_civoid mthca_free_qp(struct mthca_dev *dev, struct mthca_qp *qp); 55362306a36Sopenharmony_ciint mthca_create_ah(struct mthca_dev *dev, 55462306a36Sopenharmony_ci struct mthca_pd *pd, 55562306a36Sopenharmony_ci struct rdma_ah_attr *ah_attr, 55662306a36Sopenharmony_ci struct mthca_ah *ah); 55762306a36Sopenharmony_ciint mthca_destroy_ah(struct mthca_dev *dev, struct mthca_ah *ah); 55862306a36Sopenharmony_ciint mthca_read_ah(struct mthca_dev *dev, struct mthca_ah *ah, 55962306a36Sopenharmony_ci struct ib_ud_header *header); 56062306a36Sopenharmony_ciint mthca_ah_query(struct ib_ah *ibah, struct rdma_ah_attr *attr); 56162306a36Sopenharmony_ciint mthca_ah_grh_present(struct mthca_ah *ah); 56262306a36Sopenharmony_ciu8 mthca_get_rate(struct mthca_dev *dev, int static_rate, u32 port); 56362306a36Sopenharmony_cienum ib_rate mthca_rate_to_ib(struct mthca_dev *dev, u8 mthca_rate, u32 port); 56462306a36Sopenharmony_ci 56562306a36Sopenharmony_ciint mthca_multicast_attach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid); 56662306a36Sopenharmony_ciint mthca_multicast_detach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid); 56762306a36Sopenharmony_ci 56862306a36Sopenharmony_ciint mthca_process_mad(struct ib_device *ibdev, int mad_flags, u32 port_num, 56962306a36Sopenharmony_ci const struct ib_wc *in_wc, const struct ib_grh *in_grh, 57062306a36Sopenharmony_ci const struct ib_mad *in, struct ib_mad *out, 57162306a36Sopenharmony_ci size_t *out_mad_size, u16 *out_mad_pkey_index); 57262306a36Sopenharmony_ciint mthca_create_agents(struct mthca_dev *dev); 57362306a36Sopenharmony_civoid mthca_free_agents(struct mthca_dev *dev); 57462306a36Sopenharmony_ci 57562306a36Sopenharmony_cistatic inline struct mthca_dev *to_mdev(struct ib_device *ibdev) 57662306a36Sopenharmony_ci{ 57762306a36Sopenharmony_ci return container_of(ibdev, struct mthca_dev, ib_dev); 57862306a36Sopenharmony_ci} 57962306a36Sopenharmony_ci 58062306a36Sopenharmony_cistatic inline int mthca_is_memfree(struct mthca_dev *dev) 58162306a36Sopenharmony_ci{ 58262306a36Sopenharmony_ci return dev->mthca_flags & MTHCA_FLAG_MEMFREE; 58362306a36Sopenharmony_ci} 58462306a36Sopenharmony_ci 58562306a36Sopenharmony_ci#endif /* MTHCA_DEV_H */ 586