xref: /openbmc/linux/include/linux/tc.h (revision b454cc66)
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. */
87b454cc66SMaciej W. Rozycki 	char		vendor[9];
88b454cc66SMaciej W. Rozycki 	char		name[9];
89b454cc66SMaciej W. Rozycki 	char		firmware[9];
90b454cc66SMaciej W. Rozycki 	int		interrupt;
91b454cc66SMaciej W. Rozycki 	int		slot;
92b454cc66SMaciej W. Rozycki };
93b454cc66SMaciej W. Rozycki 
94b454cc66SMaciej W. Rozycki #define to_tc_dev(n) container_of(n, struct tc_dev, dev)
95b454cc66SMaciej W. Rozycki 
96b454cc66SMaciej W. Rozycki struct tc_device_id {
97b454cc66SMaciej W. Rozycki 	char		vendor[9];
98b454cc66SMaciej W. Rozycki 	char		name[9];
99b454cc66SMaciej W. Rozycki };
100b454cc66SMaciej W. Rozycki 
101b454cc66SMaciej W. Rozycki /*
102b454cc66SMaciej W. Rozycki  * TURBOchannel driver.
103b454cc66SMaciej W. Rozycki  */
104b454cc66SMaciej W. Rozycki struct tc_driver {
105b454cc66SMaciej W. Rozycki 	struct list_head node;
106b454cc66SMaciej W. Rozycki 	const struct tc_device_id *id_table;
107b454cc66SMaciej W. Rozycki 	struct device_driver driver;
108b454cc66SMaciej W. Rozycki };
109b454cc66SMaciej W. Rozycki 
110b454cc66SMaciej W. Rozycki #define to_tc_driver(drv) container_of(drv, struct tc_driver, driver)
111b454cc66SMaciej W. Rozycki 
112b454cc66SMaciej W. Rozycki /*
113b454cc66SMaciej W. Rozycki  * Return TURBOchannel clock frequency in Hz.
114b454cc66SMaciej W. Rozycki  */
115b454cc66SMaciej W. Rozycki static inline unsigned long tc_get_speed(struct tc_bus *tbus)
116b454cc66SMaciej W. Rozycki {
117b454cc66SMaciej W. Rozycki 	return 100000 * (10000 / (unsigned long)tbus->info.clk_period);
118b454cc66SMaciej W. Rozycki }
119b454cc66SMaciej W. Rozycki 
120b454cc66SMaciej W. Rozycki #ifdef CONFIG_TC
121b454cc66SMaciej W. Rozycki 
122b454cc66SMaciej W. Rozycki extern struct bus_type tc_bus_type;
123b454cc66SMaciej W. Rozycki 
124b454cc66SMaciej W. Rozycki extern int tc_register_driver(struct tc_driver *tdrv);
125b454cc66SMaciej W. Rozycki extern void tc_unregister_driver(struct tc_driver *tdrv);
126b454cc66SMaciej W. Rozycki 
127b454cc66SMaciej W. Rozycki #else /* !CONFIG_TC */
128b454cc66SMaciej W. Rozycki 
129b454cc66SMaciej W. Rozycki static inline int tc_register_driver(struct tc_driver *tdrv) { return 0; }
130b454cc66SMaciej W. Rozycki static inline void tc_unregister_driver(struct tc_driver *tdrv) { }
131b454cc66SMaciej W. Rozycki 
132b454cc66SMaciej W. Rozycki #endif /* CONFIG_TC */
133b454cc66SMaciej W. Rozycki 
134b454cc66SMaciej W. Rozycki /*
135b454cc66SMaciej W. Rozycki  * These have to be provided by the architecture.
136b454cc66SMaciej W. Rozycki  */
137b454cc66SMaciej W. Rozycki extern int tc_preadb(u8 *valp, void __iomem *addr);
138b454cc66SMaciej W. Rozycki extern int tc_bus_get_info(struct tc_bus *tbus);
139b454cc66SMaciej W. Rozycki extern void tc_device_get_irq(struct tc_dev *tdev);
140b454cc66SMaciej W. Rozycki 
141b454cc66SMaciej W. Rozycki #endif /* _LINUX_TC_H */
142