xref: /openbmc/linux/drivers/staging/vme_user/vme.h (revision 9ac9e59f)
135ba63b8SArnd Bergmann /* SPDX-License-Identifier: GPL-2.0 */
235ba63b8SArnd Bergmann #ifndef _VME_H_
335ba63b8SArnd Bergmann #define _VME_H_
435ba63b8SArnd Bergmann 
5*9ac9e59fSAbhirup Deb #include <linux/bitops.h>
6*9ac9e59fSAbhirup Deb 
735ba63b8SArnd Bergmann /* Resource Type */
835ba63b8SArnd Bergmann enum vme_resource_type {
935ba63b8SArnd Bergmann 	VME_MASTER,
1035ba63b8SArnd Bergmann 	VME_SLAVE,
1135ba63b8SArnd Bergmann 	VME_DMA,
1235ba63b8SArnd Bergmann 	VME_LM
1335ba63b8SArnd Bergmann };
1435ba63b8SArnd Bergmann 
1535ba63b8SArnd Bergmann /* VME Address Spaces */
1635ba63b8SArnd Bergmann #define VME_A16		0x1
1735ba63b8SArnd Bergmann #define VME_A24		0x2
1835ba63b8SArnd Bergmann #define	VME_A32		0x4
1935ba63b8SArnd Bergmann #define VME_A64		0x8
2035ba63b8SArnd Bergmann #define VME_CRCSR	0x10
2135ba63b8SArnd Bergmann #define VME_USER1	0x20
2235ba63b8SArnd Bergmann #define VME_USER2	0x40
2335ba63b8SArnd Bergmann #define VME_USER3	0x80
2435ba63b8SArnd Bergmann #define VME_USER4	0x100
2535ba63b8SArnd Bergmann 
2635ba63b8SArnd Bergmann #define VME_A16_MAX	0x10000ULL
2735ba63b8SArnd Bergmann #define VME_A24_MAX	0x1000000ULL
2835ba63b8SArnd Bergmann #define VME_A32_MAX	0x100000000ULL
2935ba63b8SArnd Bergmann #define VME_A64_MAX	0x10000000000000000ULL
3035ba63b8SArnd Bergmann #define VME_CRCSR_MAX	0x1000000ULL
3135ba63b8SArnd Bergmann 
3235ba63b8SArnd Bergmann /* VME Cycle Types */
3335ba63b8SArnd Bergmann #define VME_SCT		0x1
3435ba63b8SArnd Bergmann #define VME_BLT		0x2
3535ba63b8SArnd Bergmann #define VME_MBLT	0x4
3635ba63b8SArnd Bergmann #define VME_2eVME	0x8
3735ba63b8SArnd Bergmann #define VME_2eSST	0x10
3835ba63b8SArnd Bergmann #define VME_2eSSTB	0x20
3935ba63b8SArnd Bergmann 
4035ba63b8SArnd Bergmann #define VME_2eSST160	0x100
4135ba63b8SArnd Bergmann #define VME_2eSST267	0x200
4235ba63b8SArnd Bergmann #define VME_2eSST320	0x400
4335ba63b8SArnd Bergmann 
4435ba63b8SArnd Bergmann #define	VME_SUPER	0x1000
4535ba63b8SArnd Bergmann #define	VME_USER	0x2000
4635ba63b8SArnd Bergmann #define	VME_PROG	0x4000
4735ba63b8SArnd Bergmann #define	VME_DATA	0x8000
4835ba63b8SArnd Bergmann 
4935ba63b8SArnd Bergmann /* VME Data Widths */
5035ba63b8SArnd Bergmann #define VME_D8		0x1
5135ba63b8SArnd Bergmann #define VME_D16		0x2
5235ba63b8SArnd Bergmann #define VME_D32		0x4
5335ba63b8SArnd Bergmann #define VME_D64		0x8
5435ba63b8SArnd Bergmann 
5535ba63b8SArnd Bergmann /* Arbitration Scheduling Modes */
5635ba63b8SArnd Bergmann #define VME_R_ROBIN_MODE	0x1
5735ba63b8SArnd Bergmann #define VME_PRIORITY_MODE	0x2
5835ba63b8SArnd Bergmann 
59*9ac9e59fSAbhirup Deb #define VME_DMA_PATTERN		BIT(0)
60*9ac9e59fSAbhirup Deb #define VME_DMA_PCI			BIT(1)
61*9ac9e59fSAbhirup Deb #define VME_DMA_VME			BIT(2)
6235ba63b8SArnd Bergmann 
63*9ac9e59fSAbhirup Deb #define VME_DMA_PATTERN_BYTE		BIT(0)
64*9ac9e59fSAbhirup Deb #define VME_DMA_PATTERN_WORD		BIT(1)
65*9ac9e59fSAbhirup Deb #define VME_DMA_PATTERN_INCREMENT	BIT(2)
6635ba63b8SArnd Bergmann 
67*9ac9e59fSAbhirup Deb #define VME_DMA_VME_TO_MEM		BIT(0)
68*9ac9e59fSAbhirup Deb #define VME_DMA_MEM_TO_VME		BIT(1)
69*9ac9e59fSAbhirup Deb #define VME_DMA_VME_TO_VME		BIT(2)
70*9ac9e59fSAbhirup Deb #define VME_DMA_MEM_TO_MEM		BIT(3)
71*9ac9e59fSAbhirup Deb #define VME_DMA_PATTERN_TO_VME		BIT(4)
72*9ac9e59fSAbhirup Deb #define VME_DMA_PATTERN_TO_MEM		BIT(5)
7335ba63b8SArnd Bergmann 
7435ba63b8SArnd Bergmann struct vme_dma_attr {
7535ba63b8SArnd Bergmann 	u32 type;
7635ba63b8SArnd Bergmann 	void *private;
7735ba63b8SArnd Bergmann };
7835ba63b8SArnd Bergmann 
7935ba63b8SArnd Bergmann struct vme_resource {
8035ba63b8SArnd Bergmann 	enum vme_resource_type type;
8135ba63b8SArnd Bergmann 	struct list_head *entry;
8235ba63b8SArnd Bergmann };
8335ba63b8SArnd Bergmann 
8435ba63b8SArnd Bergmann extern struct bus_type vme_bus_type;
8535ba63b8SArnd Bergmann 
8635ba63b8SArnd Bergmann /* Number of VME interrupt vectors */
8735ba63b8SArnd Bergmann #define VME_NUM_STATUSID	256
8835ba63b8SArnd Bergmann 
8935ba63b8SArnd Bergmann /* VME_MAX_BRIDGES comes from the type of vme_bus_numbers */
9035ba63b8SArnd Bergmann #define VME_MAX_BRIDGES		(sizeof(unsigned int)*8)
9135ba63b8SArnd Bergmann #define VME_MAX_SLOTS		32
9235ba63b8SArnd Bergmann 
9335ba63b8SArnd Bergmann #define VME_SLOT_CURRENT	-1
9435ba63b8SArnd Bergmann #define VME_SLOT_ALL		-2
9535ba63b8SArnd Bergmann 
9635ba63b8SArnd Bergmann /**
9735ba63b8SArnd Bergmann  * struct vme_dev - Structure representing a VME device
9835ba63b8SArnd Bergmann  * @num: The device number
9935ba63b8SArnd Bergmann  * @bridge: Pointer to the bridge device this device is on
10035ba63b8SArnd Bergmann  * @dev: Internal device structure
10135ba63b8SArnd Bergmann  * @drv_list: List of devices (per driver)
10235ba63b8SArnd Bergmann  * @bridge_list: List of devices (per bridge)
10335ba63b8SArnd Bergmann  */
10435ba63b8SArnd Bergmann struct vme_dev {
10535ba63b8SArnd Bergmann 	int num;
10635ba63b8SArnd Bergmann 	struct vme_bridge *bridge;
10735ba63b8SArnd Bergmann 	struct device dev;
10835ba63b8SArnd Bergmann 	struct list_head drv_list;
10935ba63b8SArnd Bergmann 	struct list_head bridge_list;
11035ba63b8SArnd Bergmann };
11135ba63b8SArnd Bergmann 
11235ba63b8SArnd Bergmann /**
11335ba63b8SArnd Bergmann  * struct vme_driver - Structure representing a VME driver
11435ba63b8SArnd Bergmann  * @name: Driver name, should be unique among VME drivers and usually the same
11535ba63b8SArnd Bergmann  *        as the module name.
11635ba63b8SArnd Bergmann  * @match: Callback used to determine whether probe should be run.
11735ba63b8SArnd Bergmann  * @probe: Callback for device binding, called when new device is detected.
11835ba63b8SArnd Bergmann  * @remove: Callback, called on device removal.
11935ba63b8SArnd Bergmann  * @driver: Underlying generic device driver structure.
12035ba63b8SArnd Bergmann  * @devices: List of VME devices (struct vme_dev) associated with this driver.
12135ba63b8SArnd Bergmann  */
12235ba63b8SArnd Bergmann struct vme_driver {
12335ba63b8SArnd Bergmann 	const char *name;
12435ba63b8SArnd Bergmann 	int (*match)(struct vme_dev *);
12535ba63b8SArnd Bergmann 	int (*probe)(struct vme_dev *);
12635ba63b8SArnd Bergmann 	void (*remove)(struct vme_dev *);
12735ba63b8SArnd Bergmann 	struct device_driver driver;
12835ba63b8SArnd Bergmann 	struct list_head devices;
12935ba63b8SArnd Bergmann };
13035ba63b8SArnd Bergmann 
13135ba63b8SArnd Bergmann void *vme_alloc_consistent(struct vme_resource *, size_t, dma_addr_t *);
13235ba63b8SArnd Bergmann void vme_free_consistent(struct vme_resource *, size_t,  void *,
13335ba63b8SArnd Bergmann 	dma_addr_t);
13435ba63b8SArnd Bergmann 
13535ba63b8SArnd Bergmann size_t vme_get_size(struct vme_resource *);
13635ba63b8SArnd Bergmann int vme_check_window(u32 aspace, unsigned long long vme_base,
13735ba63b8SArnd Bergmann 		     unsigned long long size);
13835ba63b8SArnd Bergmann 
13935ba63b8SArnd Bergmann struct vme_resource *vme_slave_request(struct vme_dev *, u32, u32);
14035ba63b8SArnd Bergmann int vme_slave_set(struct vme_resource *, int, unsigned long long,
14135ba63b8SArnd Bergmann 	unsigned long long, dma_addr_t, u32, u32);
14235ba63b8SArnd Bergmann int vme_slave_get(struct vme_resource *, int *, unsigned long long *,
14335ba63b8SArnd Bergmann 	unsigned long long *, dma_addr_t *, u32 *, u32 *);
14435ba63b8SArnd Bergmann void vme_slave_free(struct vme_resource *);
14535ba63b8SArnd Bergmann 
14635ba63b8SArnd Bergmann struct vme_resource *vme_master_request(struct vme_dev *, u32, u32, u32);
14735ba63b8SArnd Bergmann int vme_master_set(struct vme_resource *, int, unsigned long long,
14835ba63b8SArnd Bergmann 	unsigned long long, u32, u32, u32);
14935ba63b8SArnd Bergmann int vme_master_get(struct vme_resource *, int *, unsigned long long *,
15035ba63b8SArnd Bergmann 	unsigned long long *, u32 *, u32 *, u32 *);
15135ba63b8SArnd Bergmann ssize_t vme_master_read(struct vme_resource *, void *, size_t, loff_t);
15235ba63b8SArnd Bergmann ssize_t vme_master_write(struct vme_resource *, void *, size_t, loff_t);
15335ba63b8SArnd Bergmann unsigned int vme_master_rmw(struct vme_resource *, unsigned int, unsigned int,
15435ba63b8SArnd Bergmann 	unsigned int, loff_t);
15535ba63b8SArnd Bergmann int vme_master_mmap(struct vme_resource *resource, struct vm_area_struct *vma);
15635ba63b8SArnd Bergmann void vme_master_free(struct vme_resource *);
15735ba63b8SArnd Bergmann 
15835ba63b8SArnd Bergmann struct vme_resource *vme_dma_request(struct vme_dev *, u32);
15935ba63b8SArnd Bergmann struct vme_dma_list *vme_new_dma_list(struct vme_resource *);
16035ba63b8SArnd Bergmann struct vme_dma_attr *vme_dma_pattern_attribute(u32, u32);
16135ba63b8SArnd Bergmann struct vme_dma_attr *vme_dma_pci_attribute(dma_addr_t);
16235ba63b8SArnd Bergmann struct vme_dma_attr *vme_dma_vme_attribute(unsigned long long, u32, u32, u32);
16335ba63b8SArnd Bergmann void vme_dma_free_attribute(struct vme_dma_attr *);
16435ba63b8SArnd Bergmann int vme_dma_list_add(struct vme_dma_list *, struct vme_dma_attr *,
16535ba63b8SArnd Bergmann 	struct vme_dma_attr *, size_t);
16635ba63b8SArnd Bergmann int vme_dma_list_exec(struct vme_dma_list *);
16735ba63b8SArnd Bergmann int vme_dma_list_free(struct vme_dma_list *);
16835ba63b8SArnd Bergmann int vme_dma_free(struct vme_resource *);
16935ba63b8SArnd Bergmann 
17035ba63b8SArnd Bergmann int vme_irq_request(struct vme_dev *, int, int,
17135ba63b8SArnd Bergmann 	void (*callback)(int, int, void *), void *);
17235ba63b8SArnd Bergmann void vme_irq_free(struct vme_dev *, int, int);
17335ba63b8SArnd Bergmann int vme_irq_generate(struct vme_dev *, int, int);
17435ba63b8SArnd Bergmann 
17535ba63b8SArnd Bergmann struct vme_resource *vme_lm_request(struct vme_dev *);
17635ba63b8SArnd Bergmann int vme_lm_count(struct vme_resource *);
17735ba63b8SArnd Bergmann int vme_lm_set(struct vme_resource *, unsigned long long, u32, u32);
17835ba63b8SArnd Bergmann int vme_lm_get(struct vme_resource *, unsigned long long *, u32 *, u32 *);
17935ba63b8SArnd Bergmann int vme_lm_attach(struct vme_resource *, int, void (*callback)(void *), void *);
18035ba63b8SArnd Bergmann int vme_lm_detach(struct vme_resource *, int);
18135ba63b8SArnd Bergmann void vme_lm_free(struct vme_resource *);
18235ba63b8SArnd Bergmann 
18335ba63b8SArnd Bergmann int vme_slot_num(struct vme_dev *);
18435ba63b8SArnd Bergmann int vme_bus_num(struct vme_dev *);
18535ba63b8SArnd Bergmann 
18635ba63b8SArnd Bergmann int vme_register_driver(struct vme_driver *, unsigned int);
18735ba63b8SArnd Bergmann void vme_unregister_driver(struct vme_driver *);
18835ba63b8SArnd Bergmann 
18935ba63b8SArnd Bergmann #endif /* _VME_H_ */
19035ba63b8SArnd Bergmann 
191