xref: /openbmc/linux/include/linux/tc.h (revision 3f2aa244)
1b454cc66SMaciej W. Rozycki /*
2b454cc66SMaciej W. Rozycki  *	Interface to the TURBOchannel related routines.
3b454cc66SMaciej W. Rozycki  *
4b454cc66SMaciej W. Rozycki  *	Copyright (c) 1998  Harald Koerfgen
5b454cc66SMaciej W. Rozycki  *	Copyright (c) 2005  James Simmons
6b454cc66SMaciej W. Rozycki  *	Copyright (c) 2006  Maciej W. Rozycki
7b454cc66SMaciej W. Rozycki  *
8b454cc66SMaciej W. Rozycki  *	Based on:
9b454cc66SMaciej W. Rozycki  *
10b454cc66SMaciej W. Rozycki  *	"TURBOchannel Firmware Specification", EK-TCAAD-FS-004
11b454cc66SMaciej W. Rozycki  *
12b454cc66SMaciej W. Rozycki  *	from Digital Equipment Corporation.
13b454cc66SMaciej W. Rozycki  *
14b454cc66SMaciej W. Rozycki  *	This file is subject to the terms and conditions of the GNU
15b454cc66SMaciej W. Rozycki  *	General Public License.  See the file "COPYING" in the main
16b454cc66SMaciej W. Rozycki  *	directory of this archive for more details.
17b454cc66SMaciej W. Rozycki  */
18b454cc66SMaciej W. Rozycki #ifndef _LINUX_TC_H
19b454cc66SMaciej W. Rozycki #define _LINUX_TC_H
20b454cc66SMaciej W. Rozycki 
21b454cc66SMaciej W. Rozycki #include <linux/compiler.h>
22b454cc66SMaciej W. Rozycki #include <linux/device.h>
23b454cc66SMaciej W. Rozycki #include <linux/ioport.h>
24b454cc66SMaciej W. Rozycki #include <linux/types.h>
25b454cc66SMaciej W. Rozycki 
26b454cc66SMaciej W. Rozycki /*
27b454cc66SMaciej W. Rozycki  * Offsets for the ROM header locations for TURBOchannel cards.
28b454cc66SMaciej W. Rozycki  */
29b454cc66SMaciej W. Rozycki #define TC_OLDCARD	0x3c0000
30b454cc66SMaciej W. Rozycki #define TC_NEWCARD	0x000000
31b454cc66SMaciej W. Rozycki 
32b454cc66SMaciej W. Rozycki #define TC_ROM_WIDTH	0x3e0
33b454cc66SMaciej W. Rozycki #define TC_ROM_STRIDE	0x3e4
34b454cc66SMaciej W. Rozycki #define TC_ROM_SIZE	0x3e8
35b454cc66SMaciej W. Rozycki #define TC_SLOT_SIZE	0x3ec
36b454cc66SMaciej W. Rozycki #define TC_PATTERN0	0x3f0
37b454cc66SMaciej W. Rozycki #define TC_PATTERN1	0x3f4
38b454cc66SMaciej W. Rozycki #define TC_PATTERN2	0x3f8
39b454cc66SMaciej W. Rozycki #define TC_PATTERN3	0x3fc
40b454cc66SMaciej W. Rozycki #define TC_FIRM_VER	0x400
41b454cc66SMaciej W. Rozycki #define TC_VENDOR	0x420
42b454cc66SMaciej W. Rozycki #define TC_MODULE	0x440
43b454cc66SMaciej W. Rozycki #define TC_FIRM_TYPE	0x460
44b454cc66SMaciej W. Rozycki #define TC_FLAGS	0x470
45b454cc66SMaciej W. Rozycki #define TC_ROM_OBJECTS	0x480
46b454cc66SMaciej W. Rozycki 
47b454cc66SMaciej W. Rozycki /*
48b454cc66SMaciej W. Rozycki  * Information obtained through the get_tcinfo() PROM call.
49b454cc66SMaciej W. Rozycki  */
50b454cc66SMaciej W. Rozycki struct tcinfo {
51b454cc66SMaciej W. Rozycki 	s32		revision;	/* Hardware revision level. */
52b454cc66SMaciej W. Rozycki 	s32		clk_period;	/* Clock period in nanoseconds. */
53b454cc66SMaciej W. Rozycki 	s32		slot_size;	/* Slot size in megabytes. */
54b454cc66SMaciej W. Rozycki 	s32		io_timeout;	/* I/O timeout in cycles. */
55b454cc66SMaciej W. Rozycki 	s32		dma_range;	/* DMA address range in megabytes. */
56b454cc66SMaciej W. Rozycki 	s32		max_dma_burst;	/* Maximum DMA burst length. */
57b454cc66SMaciej W. Rozycki 	s32		parity;		/* System module supports TC parity. */
58b454cc66SMaciej W. Rozycki 	s32		reserved[4];
59b454cc66SMaciej W. Rozycki };
60b454cc66SMaciej W. Rozycki 
61b454cc66SMaciej W. Rozycki /*
62b454cc66SMaciej W. Rozycki  * TURBOchannel bus.
63b454cc66SMaciej W. Rozycki  */
64b454cc66SMaciej W. Rozycki struct tc_bus {
65b454cc66SMaciej W. Rozycki 	struct list_head devices;	/* List of devices on this bus. */
66b454cc66SMaciej W. Rozycki 	struct resource	resource[2];	/* Address space routed to this bus. */
67b454cc66SMaciej W. Rozycki 
68b454cc66SMaciej W. Rozycki 	struct device	dev;
69b454cc66SMaciej W. Rozycki 	char		name[13];
70b454cc66SMaciej W. Rozycki 	resource_size_t	slot_base;
71b454cc66SMaciej W. Rozycki 	resource_size_t	ext_slot_base;
72b454cc66SMaciej W. Rozycki 	resource_size_t	ext_slot_size;
73b454cc66SMaciej W. Rozycki 	int		num_tcslots;
74b454cc66SMaciej W. Rozycki 	struct tcinfo	info;
75b454cc66SMaciej W. Rozycki };
76b454cc66SMaciej W. Rozycki 
77b454cc66SMaciej W. Rozycki /*
78b454cc66SMaciej W. Rozycki  * TURBOchannel device.
79b454cc66SMaciej W. Rozycki  */
80b454cc66SMaciej W. Rozycki struct tc_dev {
81b454cc66SMaciej W. Rozycki 	struct list_head node;		/* Node in list of all TC devices. */
82b454cc66SMaciej W. Rozycki 	struct tc_bus	*bus;		/* Bus this device is on. */
83b454cc66SMaciej W. Rozycki 	struct tc_driver *driver;	/* Which driver has allocated this
84b454cc66SMaciej W. Rozycki 					   device. */
85b454cc66SMaciej W. Rozycki 	struct device	dev;		/* Generic device interface. */
86b454cc66SMaciej W. Rozycki 	struct resource	resource;	/* Address space of this device. */
873f2aa244SMaciej W. Rozycki 	u64		dma_mask;	/* DMA addressable range. */
88b454cc66SMaciej W. Rozycki 	char		vendor[9];
89b454cc66SMaciej W. Rozycki 	char		name[9];
90b454cc66SMaciej W. Rozycki 	char		firmware[9];
91b454cc66SMaciej W. Rozycki 	int		interrupt;
92b454cc66SMaciej W. Rozycki 	int		slot;
93b454cc66SMaciej W. Rozycki };
94b454cc66SMaciej W. Rozycki 
95b454cc66SMaciej W. Rozycki #define to_tc_dev(n) container_of(n, struct tc_dev, dev)
96b454cc66SMaciej W. Rozycki 
97b454cc66SMaciej W. Rozycki struct tc_device_id {
98b454cc66SMaciej W. Rozycki 	char		vendor[9];
99b454cc66SMaciej W. Rozycki 	char		name[9];
100b454cc66SMaciej W. Rozycki };
101b454cc66SMaciej W. Rozycki 
102b454cc66SMaciej W. Rozycki /*
103b454cc66SMaciej W. Rozycki  * TURBOchannel driver.
104b454cc66SMaciej W. Rozycki  */
105b454cc66SMaciej W. Rozycki struct tc_driver {
106b454cc66SMaciej W. Rozycki 	struct list_head node;
107b454cc66SMaciej W. Rozycki 	const struct tc_device_id *id_table;
108b454cc66SMaciej W. Rozycki 	struct device_driver driver;
109b454cc66SMaciej W. Rozycki };
110b454cc66SMaciej W. Rozycki 
111b454cc66SMaciej W. Rozycki #define to_tc_driver(drv) container_of(drv, struct tc_driver, driver)
112b454cc66SMaciej W. Rozycki 
113b454cc66SMaciej W. Rozycki /*
114b454cc66SMaciej W. Rozycki  * Return TURBOchannel clock frequency in Hz.
115b454cc66SMaciej W. Rozycki  */
tc_get_speed(struct tc_bus * tbus)116b454cc66SMaciej W. Rozycki static inline unsigned long tc_get_speed(struct tc_bus *tbus)
117b454cc66SMaciej W. Rozycki {
118b454cc66SMaciej W. Rozycki 	return 100000 * (10000 / (unsigned long)tbus->info.clk_period);
119b454cc66SMaciej W. Rozycki }
120b454cc66SMaciej W. Rozycki 
121b454cc66SMaciej W. Rozycki #ifdef CONFIG_TC
122b454cc66SMaciej W. Rozycki 
123b454cc66SMaciej W. Rozycki extern struct bus_type tc_bus_type;
124b454cc66SMaciej W. Rozycki 
125b454cc66SMaciej W. Rozycki extern int tc_register_driver(struct tc_driver *tdrv);
126b454cc66SMaciej W. Rozycki extern void tc_unregister_driver(struct tc_driver *tdrv);
127b454cc66SMaciej W. Rozycki 
128b454cc66SMaciej W. Rozycki #else /* !CONFIG_TC */
129b454cc66SMaciej W. Rozycki 
tc_register_driver(struct tc_driver * tdrv)130b454cc66SMaciej W. Rozycki static inline int tc_register_driver(struct tc_driver *tdrv) { return 0; }
tc_unregister_driver(struct tc_driver * tdrv)131b454cc66SMaciej W. Rozycki static inline void tc_unregister_driver(struct tc_driver *tdrv) { }
132b454cc66SMaciej W. Rozycki 
133b454cc66SMaciej W. Rozycki #endif /* CONFIG_TC */
134b454cc66SMaciej W. Rozycki 
135b454cc66SMaciej W. Rozycki /*
136b454cc66SMaciej W. Rozycki  * These have to be provided by the architecture.
137b454cc66SMaciej W. Rozycki  */
138b454cc66SMaciej W. Rozycki extern int tc_preadb(u8 *valp, void __iomem *addr);
139b454cc66SMaciej W. Rozycki extern int tc_bus_get_info(struct tc_bus *tbus);
140b454cc66SMaciej W. Rozycki extern void tc_device_get_irq(struct tc_dev *tdev);
141b454cc66SMaciej W. Rozycki 
142b454cc66SMaciej W. Rozycki #endif /* _LINUX_TC_H */
143