1 /*
2 * Edu PCI device header.
3 *
4 * Copyright (C) 2016 Red Hat, Inc.
5 *
6 * Authors:
7 * Peter Xu <peterx@redhat.com>,
8 *
9 * This work is licensed under the terms of the GNU LGPL, version 2 or
10 * later.
11 *
12 * Edu device is a virtualized device in QEMU. Please refer to
13 * docs/specs/edu.txt in QEMU repository for EDU device manual.
14 */
15 #ifndef _PCI_EDU_H_
16 #define _PCI_EDU_H_
17
18 #include "pci.h"
19 #include "asm/io.h"
20
21 #define PCI_VENDOR_ID_QEMU 0x1234
22 #define PCI_DEVICE_ID_EDU 0x11e8
23
24 /* The only bar used by EDU device */
25 #define EDU_BAR 0
26 #define EDU_MAGIC 0xed
27 #define EDU_VERSION 0x100
28 #define EDU_DMA_BUF_SIZE (1 << 20)
29 #define EDU_INPUT_BUF_SIZE 256
30
31 #define EDU_REG_ID 0x0
32 #define EDU_REG_ALIVE 0x4
33 #define EDU_REG_FACTORIAL 0x8
34 #define EDU_REG_STATUS 0x20
35 #define EDU_REG_INTR_STATUS 0x24
36 #define EDU_REG_INTR_RAISE 0x60
37 #define EDU_REG_INTR_ACK 0x64
38 #define EDU_REG_DMA_SRC 0x80
39 #define EDU_REG_DMA_DST 0x88
40 #define EDU_REG_DMA_COUNT 0x90
41 #define EDU_REG_DMA_CMD 0x98
42
43 #define EDU_CMD_DMA_START 0x01
44 #define EDU_CMD_DMA_FROM 0x02
45 #define EDU_CMD_DMA_TO 0x00
46
47 #define EDU_STATUS_FACTORIAL 0x1
48 #define EDU_STATUS_INT_ENABLE 0x80
49
50 #define EDU_DMA_START 0x40000
51 #define EDU_DMA_SIZE_MAX 4096
52
53 struct pci_edu_dev {
54 struct pci_dev pci_dev;
55 volatile void *reg_base;
56 };
57
58 #define edu_reg(d, r) (volatile void *)((d)->reg_base + (r))
59
edu_reg_readq(struct pci_edu_dev * dev,int reg)60 static inline uint64_t edu_reg_readq(struct pci_edu_dev *dev, int reg)
61 {
62 return __raw_readq(edu_reg(dev, reg));
63 }
64
edu_reg_readl(struct pci_edu_dev * dev,int reg)65 static inline uint32_t edu_reg_readl(struct pci_edu_dev *dev, int reg)
66 {
67 return __raw_readl(edu_reg(dev, reg));
68 }
69
edu_reg_writeq(struct pci_edu_dev * dev,int reg,uint64_t val)70 static inline void edu_reg_writeq(struct pci_edu_dev *dev, int reg,
71 uint64_t val)
72 {
73 __raw_writeq(val, edu_reg(dev, reg));
74 }
75
edu_reg_writel(struct pci_edu_dev * dev,int reg,uint32_t val)76 static inline void edu_reg_writel(struct pci_edu_dev *dev, int reg,
77 uint32_t val)
78 {
79 __raw_writel(val, edu_reg(dev, reg));
80 }
81
82 bool edu_init(struct pci_edu_dev *dev);
83 void edu_dma(struct pci_edu_dev *dev, iova_t iova,
84 size_t size, unsigned int dev_offset, bool from_device);
85
86 #endif
87