| /* |
| * Edu PCI device header. |
| * |
| * Copyright (C) 2016 Red Hat, Inc. |
| * |
| * Authors: |
| * Peter Xu <peterx@redhat.com>, |
| * |
| * This work is licensed under the terms of the GNU LGPL, version 2 or |
| * later. |
| * |
| * Edu device is a virtualized device in QEMU. Please refer to |
| * docs/specs/edu.txt in QEMU repository for EDU device manual. |
| */ |
| #ifndef _PCI_EDU_H_ |
| #define _PCI_EDU_H_ |
| |
| #include "pci.h" |
| #include "asm/io.h" |
| |
| #define PCI_VENDOR_ID_QEMU 0x1234 |
| #define PCI_DEVICE_ID_EDU 0x11e8 |
| |
| /* The only bar used by EDU device */ |
| #define EDU_BAR 0 |
| #define EDU_MAGIC 0xed |
| #define EDU_VERSION 0x100 |
| #define EDU_DMA_BUF_SIZE (1 << 20) |
| #define EDU_INPUT_BUF_SIZE 256 |
| |
| #define EDU_REG_ID 0x0 |
| #define EDU_REG_ALIVE 0x4 |
| #define EDU_REG_FACTORIAL 0x8 |
| #define EDU_REG_STATUS 0x20 |
| #define EDU_REG_INTR_STATUS 0x24 |
| #define EDU_REG_INTR_RAISE 0x60 |
| #define EDU_REG_INTR_ACK 0x64 |
| #define EDU_REG_DMA_SRC 0x80 |
| #define EDU_REG_DMA_DST 0x88 |
| #define EDU_REG_DMA_COUNT 0x90 |
| #define EDU_REG_DMA_CMD 0x98 |
| |
| #define EDU_CMD_DMA_START 0x01 |
| #define EDU_CMD_DMA_FROM 0x02 |
| #define EDU_CMD_DMA_TO 0x00 |
| |
| #define EDU_STATUS_FACTORIAL 0x1 |
| #define EDU_STATUS_INT_ENABLE 0x80 |
| |
| #define EDU_DMA_START 0x40000 |
| #define EDU_DMA_SIZE_MAX 4096 |
| |
| struct pci_edu_dev { |
| struct pci_dev pci_dev; |
| volatile void *reg_base; |
| }; |
| |
| #define edu_reg(d, r) (volatile void *)((d)->reg_base + (r)) |
| |
| static inline uint64_t edu_reg_readq(struct pci_edu_dev *dev, int reg) |
| { |
| return __raw_readq(edu_reg(dev, reg)); |
| } |
| |
| static inline uint32_t edu_reg_readl(struct pci_edu_dev *dev, int reg) |
| { |
| return __raw_readl(edu_reg(dev, reg)); |
| } |
| |
| static inline void edu_reg_writeq(struct pci_edu_dev *dev, int reg, |
| uint64_t val) |
| { |
| __raw_writeq(val, edu_reg(dev, reg)); |
| } |
| |
| static inline void edu_reg_writel(struct pci_edu_dev *dev, int reg, |
| uint32_t val) |
| { |
| __raw_writel(val, edu_reg(dev, reg)); |
| } |
| |
| bool edu_init(struct pci_edu_dev *dev); |
| void edu_dma(struct pci_edu_dev *dev, iova_t iova, |
| size_t size, unsigned int dev_offset, bool from_device); |
| |
| #endif |