| /* |
| * 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". |
| * |
| * Intel MIC Host driver. |
| * |
| */ |
| #ifndef MIC_SMPT_H |
| #define MIC_SMPT_H |
| /** |
| * struct mic_smpt_ops - MIC HW specific SMPT operations. |
| * @init: Initialize hardware specific SMPT information in mic_smpt_hw_info. |
| * @set: Set the value for a particular SMPT entry. |
| */ |
| struct mic_smpt_ops { |
| void (*init)(struct mic_device *mdev); |
| void (*set)(struct mic_device *mdev, dma_addr_t dma_addr, u8 index); |
| }; |
| |
| /** |
| * struct mic_smpt - MIC SMPT entry information. |
| * @dma_addr: Base DMA address for this SMPT entry. |
| * @ref_count: Number of active mappings for this SMPT entry in bytes. |
| */ |
| struct mic_smpt { |
| dma_addr_t dma_addr; |
| s64 ref_count; |
| }; |
| |
| /** |
| * struct mic_smpt_hw_info - MIC SMPT hardware specific information. |
| * @num_reg: Number of SMPT registers. |
| * @page_shift: System memory page shift. |
| * @page_size: System memory page size. |
| * @base: System address base. |
| */ |
| struct mic_smpt_hw_info { |
| u8 num_reg; |
| u8 page_shift; |
| u64 page_size; |
| u64 base; |
| }; |
| |
| /** |
| * struct mic_smpt_info - MIC SMPT information. |
| * @entry: Array of SMPT entries. |
| * @smpt_lock: Spin lock protecting access to SMPT data structures. |
| * @info: Hardware specific SMPT information. |
| * @ref_count: Number of active SMPT mappings (for debug). |
| * @map_count: Number of SMPT mappings created (for debug). |
| * @unmap_count: Number of SMPT mappings destroyed (for debug). |
| */ |
| struct mic_smpt_info { |
| struct mic_smpt *entry; |
| spinlock_t smpt_lock; |
| struct mic_smpt_hw_info info; |
| s64 ref_count; |
| s64 map_count; |
| s64 unmap_count; |
| }; |
| |
| dma_addr_t mic_map_single(struct mic_device *mdev, void *va, size_t size); |
| void mic_unmap_single(struct mic_device *mdev, |
| dma_addr_t mic_addr, size_t size); |
| dma_addr_t mic_map(struct mic_device *mdev, |
| dma_addr_t dma_addr, size_t size); |
| void mic_unmap(struct mic_device *mdev, dma_addr_t mic_addr, size_t size); |
| dma_addr_t mic_to_dma_addr(struct mic_device *mdev, dma_addr_t mic_addr); |
| |
| /** |
| * mic_map_error - Check a MIC address for errors. |
| * |
| * @mdev: pointer to mic_device instance. |
| * |
| * returns Whether there was an error during mic_map..(..) APIs. |
| */ |
| static inline bool mic_map_error(dma_addr_t mic_addr) |
| { |
| return !mic_addr; |
| } |
| |
| int mic_smpt_init(struct mic_device *mdev); |
| void mic_smpt_uninit(struct mic_device *mdev); |
| void mic_smpt_restore(struct mic_device *mdev); |
| |
| #endif |