| /* |
| * Intel MIC Platform Software Stack (MPSS) |
| * |
| * Copyright(c) 2013 Intel Corporation. |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License, version 2, as |
| * published by the Free Software Foundation. |
| * |
| * This program is distributed in the hope that it will be useful, but |
| * WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * General Public License for more details. |
| * |
| * The full GNU General Public License is included in this distribution in |
| * the file called "COPYING". |
| * |
| * Disclaimer: The codes contained in these modules may be specific to |
| * the Intel Software Development Platform codenamed: Knights Ferry, and |
| * the Intel product codenamed: Knights Corner, and are not backward |
| * compatible with other Intel products. Additionally, Intel will NOT |
| * support the codes or instruction set in future products. |
| * |
| * Intel MIC Card driver. |
| * |
| */ |
| #ifndef _MIC_CARD_DEVICE_H_ |
| #define _MIC_CARD_DEVICE_H_ |
| |
| #include <linux/workqueue.h> |
| #include <linux/io.h> |
| #include <linux/interrupt.h> |
| #include <linux/mic_bus.h> |
| #include "../bus/scif_bus.h" |
| #include "../bus/vop_bus.h" |
| |
| /** |
| * struct mic_intr_info - Contains h/w specific interrupt sources info |
| * |
| * @num_intr: The number of irqs available |
| */ |
| struct mic_intr_info { |
| u32 num_intr; |
| }; |
| |
| /** |
| * struct mic_irq_info - OS specific irq information |
| * |
| * @irq_usage_count: usage count array tracking the number of sources |
| * assigned for each irq. |
| */ |
| struct mic_irq_info { |
| int *irq_usage_count; |
| }; |
| |
| /** |
| * struct mic_device - MIC device information. |
| * |
| * @mmio: MMIO bar information. |
| */ |
| struct mic_device { |
| struct mic_mw mmio; |
| }; |
| |
| /** |
| * struct mic_driver - MIC card driver information. |
| * |
| * @name: Name for MIC driver. |
| * @dbg_dir: debugfs directory of this MIC device. |
| * @dev: The device backing this MIC. |
| * @dp: The pointer to the virtio device page. |
| * @mdev: MIC device information for the host. |
| * @hotplug_work: Hot plug work for adding/removing virtio devices. |
| * @irq_info: The OS specific irq information |
| * @intr_info: H/W specific interrupt information. |
| * @dma_mbdev: dma device on the MIC virtual bus. |
| * @dma_ch - Array of DMA channels |
| * @num_dma_ch - Number of DMA channels available |
| * @scdev: SCIF device on the SCIF virtual bus. |
| * @vpdev: Virtio over PCIe device on the VOP virtual bus. |
| */ |
| struct mic_driver { |
| char name[20]; |
| struct dentry *dbg_dir; |
| struct device *dev; |
| void __iomem *dp; |
| struct mic_device mdev; |
| struct work_struct hotplug_work; |
| struct mic_irq_info irq_info; |
| struct mic_intr_info intr_info; |
| struct mbus_device *dma_mbdev; |
| struct dma_chan *dma_ch[MIC_MAX_DMA_CHAN]; |
| int num_dma_ch; |
| struct scif_hw_dev *scdev; |
| struct vop_device *vpdev; |
| }; |
| |
| /** |
| * struct mic_irq - opaque pointer used as cookie |
| */ |
| struct mic_irq; |
| |
| /** |
| * mic_mmio_read - read from an MMIO register. |
| * @mw: MMIO register base virtual address. |
| * @offset: register offset. |
| * |
| * RETURNS: register value. |
| */ |
| static inline u32 mic_mmio_read(struct mic_mw *mw, u32 offset) |
| { |
| return ioread32(mw->va + offset); |
| } |
| |
| /** |
| * mic_mmio_write - write to an MMIO register. |
| * @mw: MMIO register base virtual address. |
| * @val: the data value to put into the register |
| * @offset: register offset. |
| * |
| * RETURNS: none. |
| */ |
| static inline void |
| mic_mmio_write(struct mic_mw *mw, u32 val, u32 offset) |
| { |
| iowrite32(val, mw->va + offset); |
| } |
| |
| int mic_driver_init(struct mic_driver *mdrv); |
| void mic_driver_uninit(struct mic_driver *mdrv); |
| int mic_next_card_db(void); |
| struct mic_irq * |
| mic_request_card_irq(irq_handler_t handler, irq_handler_t thread_fn, |
| const char *name, void *data, int db); |
| void mic_free_card_irq(struct mic_irq *cookie, void *data); |
| u32 mic_read_spad(struct mic_device *mdev, unsigned int idx); |
| void mic_send_intr(struct mic_device *mdev, int doorbell); |
| void mic_send_p2p_intr(int doorbell, struct mic_mw *mw); |
| int mic_db_to_irq(struct mic_driver *mdrv, int db); |
| u32 mic_ack_interrupt(struct mic_device *mdev); |
| void mic_hw_intr_init(struct mic_driver *mdrv); |
| void __iomem * |
| mic_card_map(struct mic_device *mdev, dma_addr_t addr, size_t size); |
| void mic_card_unmap(struct mic_device *mdev, void __iomem *addr); |
| void __init mic_create_card_debug_dir(struct mic_driver *mdrv); |
| void mic_delete_card_debug_dir(struct mic_driver *mdrv); |
| void __init mic_init_card_debugfs(void); |
| void mic_exit_card_debugfs(void); |
| #endif |