1 /*
2 * Intel MIC Platform Software Stack (MPSS)
3 *
4 * Copyright(c) 2014 Intel Corporation.
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License, version 2, as
8 * published by the Free Software Foundation.
9 *
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
14 *
15 * The full GNU General Public License is included in this distribution in
16 * the file called "COPYING".
17 *
18 * Intel MIC Bus driver.
19 *
20 * This implementation is very similar to the the virtio bus driver
21 * implementation @ include/linux/virtio.h.
22 */
23 #ifndef _MIC_BUS_H_
24 #define _MIC_BUS_H_
25 /*
26 * Everything a mbus driver needs to work with any particular mbus
27 * implementation.
28 */
29 #include <linux/interrupt.h>
30 #include <linux/dma-mapping.h>
31
32 struct mbus_device_id {
33 __u32 device;
34 __u32 vendor;
35 };
36
37 #define MBUS_DEV_DMA_HOST 2
38 #define MBUS_DEV_DMA_MIC 3
39 #define MBUS_DEV_ANY_ID 0xffffffff
40
41 /**
42 * mbus_device - representation of a device using mbus
43 * @mmio_va: virtual address of mmio space
44 * @hw_ops: the hardware ops supported by this device.
45 * @id: the device type identification (used to match it with a driver).
46 * @dev: underlying device.
47 * be used to communicate with.
48 * @index: unique position on the mbus bus
49 */
50 struct mbus_device {
51 void __iomem *mmio_va;
52 struct mbus_hw_ops *hw_ops;
53 struct mbus_device_id id;
54 struct device dev;
55 int index;
56 };
57
58 /**
59 * mbus_driver - operations for a mbus I/O driver
60 * @driver: underlying device driver (populate name and owner).
61 * @id_table: the ids serviced by this driver.
62 * @probe: the function to call when a device is found. Returns 0 or -errno.
63 * @remove: the function to call when a device is removed.
64 */
65 struct mbus_driver {
66 struct device_driver driver;
67 const struct mbus_device_id *id_table;
68 int (*probe)(struct mbus_device *dev);
69 void (*scan)(struct mbus_device *dev);
70 void (*remove)(struct mbus_device *dev);
71 };
72
73 /**
74 * struct mic_irq - opaque pointer used as cookie
75 */
76 struct mic_irq;
77
78 /**
79 * mbus_hw_ops - Hardware operations for accessing a MIC device on the MIC bus.
80 */
81 struct mbus_hw_ops {
82 struct mic_irq* (*request_threaded_irq)(struct mbus_device *mbdev,
83 irq_handler_t handler,
84 irq_handler_t thread_fn,
85 const char *name, void *data,
86 int intr_src);
87 void (*free_irq)(struct mbus_device *mbdev,
88 struct mic_irq *cookie, void *data);
89 void (*ack_interrupt)(struct mbus_device *mbdev, int num);
90 };
91
92 struct mbus_device *
93 mbus_register_device(struct device *pdev, int id, const struct dma_map_ops *dma_ops,
94 struct mbus_hw_ops *hw_ops, int index,
95 void __iomem *mmio_va);
96 void mbus_unregister_device(struct mbus_device *mbdev);
97
98 int mbus_register_driver(struct mbus_driver *drv);
99 void mbus_unregister_driver(struct mbus_driver *drv);
100
dev_to_mbus(struct device * _dev)101 static inline struct mbus_device *dev_to_mbus(struct device *_dev)
102 {
103 return container_of(_dev, struct mbus_device, dev);
104 }
105
drv_to_mbus(struct device_driver * drv)106 static inline struct mbus_driver *drv_to_mbus(struct device_driver *drv)
107 {
108 return container_of(drv, struct mbus_driver, driver);
109 }
110
111 #endif /* _MIC_BUS_H */
112