Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v3.16-rc4 247 lines 7.8 kB view raw
1/* 2 * This file is provided under a dual BSD/GPLv2 license. When using or 3 * redistributing this file, you may do so under either license. 4 * 5 * GPL LICENSE SUMMARY 6 * 7 * Copyright(c) 2012 Intel Corporation. All rights reserved. 8 * 9 * This program is free software; you can redistribute it and/or modify 10 * it under the terms of version 2 of the GNU General Public License as 11 * published by the Free Software Foundation. 12 * 13 * BSD LICENSE 14 * 15 * Copyright(c) 2012 Intel Corporation. All rights reserved. 16 * 17 * Redistribution and use in source and binary forms, with or without 18 * modification, are permitted provided that the following conditions 19 * are met: 20 * 21 * * Redistributions of source code must retain the above copyright 22 * notice, this list of conditions and the following disclaimer. 23 * * Redistributions in binary form must reproduce the above copy 24 * notice, this list of conditions and the following disclaimer in 25 * the documentation and/or other materials provided with the 26 * distribution. 27 * * Neither the name of Intel Corporation nor the names of its 28 * contributors may be used to endorse or promote products derived 29 * from this software without specific prior written permission. 30 * 31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 36 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 37 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 38 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 39 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 40 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 41 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 42 * 43 * Intel PCIe NTB Linux driver 44 * 45 * Contact Information: 46 * Jon Mason <jon.mason@intel.com> 47 */ 48#include <linux/ntb.h> 49 50#define PCI_DEVICE_ID_INTEL_NTB_B2B_JSF 0x3725 51#define PCI_DEVICE_ID_INTEL_NTB_PS_JSF 0x3726 52#define PCI_DEVICE_ID_INTEL_NTB_SS_JSF 0x3727 53#define PCI_DEVICE_ID_INTEL_NTB_B2B_SNB 0x3C0D 54#define PCI_DEVICE_ID_INTEL_NTB_PS_SNB 0x3C0E 55#define PCI_DEVICE_ID_INTEL_NTB_SS_SNB 0x3C0F 56#define PCI_DEVICE_ID_INTEL_NTB_B2B_IVT 0x0E0D 57#define PCI_DEVICE_ID_INTEL_NTB_PS_IVT 0x0E0E 58#define PCI_DEVICE_ID_INTEL_NTB_SS_IVT 0x0E0F 59#define PCI_DEVICE_ID_INTEL_NTB_B2B_HSX 0x2F0D 60#define PCI_DEVICE_ID_INTEL_NTB_PS_HSX 0x2F0E 61#define PCI_DEVICE_ID_INTEL_NTB_SS_HSX 0x2F0F 62#define PCI_DEVICE_ID_INTEL_NTB_B2B_BWD 0x0C4E 63 64#ifndef readq 65static inline u64 readq(void __iomem *addr) 66{ 67 return readl(addr) | (((u64) readl(addr + 4)) << 32LL); 68} 69#endif 70 71#ifndef writeq 72static inline void writeq(u64 val, void __iomem *addr) 73{ 74 writel(val & 0xffffffff, addr); 75 writel(val >> 32, addr + 4); 76} 77#endif 78 79#define NTB_BAR_MMIO 0 80#define NTB_BAR_23 2 81#define NTB_BAR_45 4 82#define NTB_BAR_MASK ((1 << NTB_BAR_MMIO) | (1 << NTB_BAR_23) |\ 83 (1 << NTB_BAR_45)) 84 85#define NTB_HB_TIMEOUT msecs_to_jiffies(1000) 86 87#define NTB_MAX_NUM_MW 2 88 89enum ntb_hw_event { 90 NTB_EVENT_SW_EVENT0 = 0, 91 NTB_EVENT_SW_EVENT1, 92 NTB_EVENT_SW_EVENT2, 93 NTB_EVENT_HW_ERROR, 94 NTB_EVENT_HW_LINK_UP, 95 NTB_EVENT_HW_LINK_DOWN, 96}; 97 98struct ntb_mw { 99 dma_addr_t phys_addr; 100 void __iomem *vbase; 101 resource_size_t bar_sz; 102}; 103 104struct ntb_db_cb { 105 int (*callback)(void *data, int db_num); 106 unsigned int db_num; 107 void *data; 108 struct ntb_device *ndev; 109 struct tasklet_struct irq_work; 110}; 111 112struct ntb_device { 113 struct pci_dev *pdev; 114 struct msix_entry *msix_entries; 115 void __iomem *reg_base; 116 struct ntb_mw mw[NTB_MAX_NUM_MW]; 117 struct { 118 unsigned char max_mw; 119 unsigned char max_spads; 120 unsigned char max_db_bits; 121 unsigned char msix_cnt; 122 } limits; 123 struct { 124 void __iomem *ldb; 125 void __iomem *ldb_mask; 126 void __iomem *rdb; 127 void __iomem *bar2_xlat; 128 void __iomem *bar4_xlat; 129 void __iomem *spad_write; 130 void __iomem *spad_read; 131 void __iomem *lnk_cntl; 132 void __iomem *lnk_stat; 133 void __iomem *spci_cmd; 134 } reg_ofs; 135 struct ntb_transport *ntb_transport; 136 void (*event_cb)(void *handle, enum ntb_hw_event event); 137 138 struct ntb_db_cb *db_cb; 139 unsigned char hw_type; 140 unsigned char conn_type; 141 unsigned char dev_type; 142 unsigned char num_msix; 143 unsigned char bits_per_vector; 144 unsigned char max_cbs; 145 unsigned char link_width; 146 unsigned char link_speed; 147 unsigned char link_status; 148 149 struct delayed_work hb_timer; 150 unsigned long last_ts; 151 152 struct delayed_work lr_timer; 153 154 struct dentry *debugfs_dir; 155}; 156 157/** 158 * ntb_max_cbs() - return the max callbacks 159 * @ndev: pointer to ntb_device instance 160 * 161 * Given the ntb pointer, return the maximum number of callbacks 162 * 163 * RETURNS: the maximum number of callbacks 164 */ 165static inline unsigned char ntb_max_cbs(struct ntb_device *ndev) 166{ 167 return ndev->max_cbs; 168} 169 170/** 171 * ntb_max_mw() - return the max number of memory windows 172 * @ndev: pointer to ntb_device instance 173 * 174 * Given the ntb pointer, return the maximum number of memory windows 175 * 176 * RETURNS: the maximum number of memory windows 177 */ 178static inline unsigned char ntb_max_mw(struct ntb_device *ndev) 179{ 180 return ndev->limits.max_mw; 181} 182 183/** 184 * ntb_hw_link_status() - return the hardware link status 185 * @ndev: pointer to ntb_device instance 186 * 187 * Returns true if the hardware is connected to the remote system 188 * 189 * RETURNS: true or false based on the hardware link state 190 */ 191static inline bool ntb_hw_link_status(struct ntb_device *ndev) 192{ 193 return ndev->link_status == NTB_LINK_UP; 194} 195 196/** 197 * ntb_query_pdev() - return the pci_dev pointer 198 * @ndev: pointer to ntb_device instance 199 * 200 * Given the ntb pointer, return the pci_dev pointer for the NTB hardware device 201 * 202 * RETURNS: a pointer to the ntb pci_dev 203 */ 204static inline struct pci_dev *ntb_query_pdev(struct ntb_device *ndev) 205{ 206 return ndev->pdev; 207} 208 209/** 210 * ntb_query_debugfs() - return the debugfs pointer 211 * @ndev: pointer to ntb_device instance 212 * 213 * Given the ntb pointer, return the debugfs directory pointer for the NTB 214 * hardware device 215 * 216 * RETURNS: a pointer to the debugfs directory 217 */ 218static inline struct dentry *ntb_query_debugfs(struct ntb_device *ndev) 219{ 220 return ndev->debugfs_dir; 221} 222 223struct ntb_device *ntb_register_transport(struct pci_dev *pdev, 224 void *transport); 225void ntb_unregister_transport(struct ntb_device *ndev); 226void ntb_set_mw_addr(struct ntb_device *ndev, unsigned int mw, u64 addr); 227int ntb_register_db_callback(struct ntb_device *ndev, unsigned int idx, 228 void *data, int (*db_cb_func)(void *data, 229 int db_num)); 230void ntb_unregister_db_callback(struct ntb_device *ndev, unsigned int idx); 231int ntb_register_event_callback(struct ntb_device *ndev, 232 void (*event_cb_func)(void *handle, 233 enum ntb_hw_event event)); 234void ntb_unregister_event_callback(struct ntb_device *ndev); 235int ntb_get_max_spads(struct ntb_device *ndev); 236int ntb_write_local_spad(struct ntb_device *ndev, unsigned int idx, u32 val); 237int ntb_read_local_spad(struct ntb_device *ndev, unsigned int idx, u32 *val); 238int ntb_write_remote_spad(struct ntb_device *ndev, unsigned int idx, u32 val); 239int ntb_read_remote_spad(struct ntb_device *ndev, unsigned int idx, u32 *val); 240resource_size_t ntb_get_mw_base(struct ntb_device *ndev, unsigned int mw); 241void __iomem *ntb_get_mw_vbase(struct ntb_device *ndev, unsigned int mw); 242u64 ntb_get_mw_size(struct ntb_device *ndev, unsigned int mw); 243void ntb_ring_doorbell(struct ntb_device *ndev, unsigned int idx); 244void *ntb_find_transport(struct pci_dev *pdev); 245 246int ntb_transport_init(struct pci_dev *pdev); 247void ntb_transport_free(void *transport);