machdep.h 11.2 KB
Newer Older
1
2
#ifndef _ASM_POWERPC_MACHDEP_H
#define _ASM_POWERPC_MACHDEP_H
Paul Mackerras's avatar
Paul Mackerras committed
3
#ifdef __KERNEL__
Linus Torvalds's avatar
Linus Torvalds committed
4
5
6
7
8
9
10
11
12
13
14

/*
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version
 * 2 of the License, or (at your option) any later version.
 */

#include <linux/seq_file.h>
#include <linux/init.h>
#include <linux/dma-mapping.h>
15
#include <linux/export.h>
Linus Torvalds's avatar
Linus Torvalds committed
16
17
18

#include <asm/setup.h>

Paul Mackerras's avatar
Paul Mackerras committed
19
20
21
22
23
/* We export this macro for external modules like Alsa to know if
 * ppc_md.feature_call is implemented or not
 */
#define CONFIG_PPC_HAS_FEATURE_CALLS

Linus Torvalds's avatar
Linus Torvalds committed
24
25
26
27
28
29
struct pt_regs;
struct pci_bus;	
struct device_node;
struct iommu_table;
struct rtc_time;
struct file;
30
struct pci_controller;
31
struct kimage;
32
struct pci_host_bridge;
Linus Torvalds's avatar
Linus Torvalds committed
33
34

struct machdep_calls {
35
	char		*name;
Paul Mackerras's avatar
Paul Mackerras committed
36
#ifdef CONFIG_PPC64
Linus Torvalds's avatar
Linus Torvalds committed
37
	void            (*hpte_invalidate)(unsigned long slot,
38
					   unsigned long vpn,
Paul Mackerras's avatar
Paul Mackerras committed
39
					   int psize, int ssize,
Linus Torvalds's avatar
Linus Torvalds committed
40
41
42
					   int local);
	long		(*hpte_updatepp)(unsigned long slot, 
					 unsigned long newpp, 
43
					 unsigned long vpn,
Paul Mackerras's avatar
Paul Mackerras committed
44
					 int psize, int ssize,
Linus Torvalds's avatar
Linus Torvalds committed
45
46
					 int local);
	void            (*hpte_updateboltedpp)(unsigned long newpp, 
47
					       unsigned long ea,
Paul Mackerras's avatar
Paul Mackerras committed
48
					       int psize, int ssize);
Linus Torvalds's avatar
Linus Torvalds committed
49
	long		(*hpte_insert)(unsigned long hpte_group,
50
				       unsigned long vpn,
Linus Torvalds's avatar
Linus Torvalds committed
51
				       unsigned long prpn,
52
				       unsigned long rflags,
53
				       unsigned long vflags,
54
55
				       int psize, int apsize,
				       int ssize);
Linus Torvalds's avatar
Linus Torvalds committed
56
	long		(*hpte_remove)(unsigned long hpte_group);
57
58
	void            (*hpte_removebolted)(unsigned long ea,
					     int psize, int ssize);
59
60
	void		(*flush_hash_range)(unsigned long number, int local);

61
	/* special for kexec, to be called in real mode, linear mapping is
Linus Torvalds's avatar
Linus Torvalds committed
62
63
64
	 * destroyed as well */
	void		(*hpte_clear_all)(void);

65
	int		(*tce_build)(struct iommu_table *tbl,
Linus Torvalds's avatar
Linus Torvalds committed
66
67
68
				     long index,
				     long npages,
				     unsigned long uaddr,
69
70
				     enum dma_data_direction direction,
				     struct dma_attrs *attrs);
Linus Torvalds's avatar
Linus Torvalds committed
71
72
73
	void		(*tce_free)(struct iommu_table *tbl,
				    long index,
				    long npages);
74
75
	unsigned long	(*tce_get)(struct iommu_table *tbl,
				    long index);
Linus Torvalds's avatar
Linus Torvalds committed
76
	void		(*tce_flush)(struct iommu_table *tbl);
77

78
	void __iomem *	(*ioremap)(phys_addr_t addr, unsigned long size,
79
				   unsigned long flags, void *caller);
80
	void		(*iounmap)(volatile void __iomem *token);
Johannes Berg's avatar
Johannes Berg committed
81
82
83
84
85

#ifdef CONFIG_PM
	void		(*iommu_save)(void);
	void		(*iommu_restore)(void);
#endif
86
#endif /* CONFIG_PPC64 */
Linus Torvalds's avatar
Linus Torvalds committed
87

88
89
90
	void		(*pci_dma_dev_setup)(struct pci_dev *dev);
	void		(*pci_dma_bus_setup)(struct pci_bus *bus);

91
	/* Platform set_dma_mask and dma_get_required_mask overrides */
92
	int		(*dma_set_mask)(struct device *dev, u64 dma_mask);
93
	u64		(*dma_get_required_mask)(struct device *dev);
94

95
	int		(*probe)(void);
96
	void		(*setup_arch)(void); /* Optional, may be NULL */
Linus Torvalds's avatar
Linus Torvalds committed
97
98
	void		(*init_early)(void);
	/* Optional, may be NULL. */
99
100
	void		(*show_cpuinfo)(struct seq_file *m);
	void		(*show_percpuinfo)(struct seq_file *m, int i);
Linus Torvalds's avatar
Linus Torvalds committed
101
102

	void		(*init_IRQ)(void);
103

104
	/* Return an irq, or NO_IRQ to indicate there are none pending. */
105
	unsigned int	(*get_irq)(void);
Linus Torvalds's avatar
Linus Torvalds committed
106
107

	/* PCI stuff */
Paul Mackerras's avatar
Paul Mackerras committed
108
	/* Called after scanning the bus, before allocating resources */
Linus Torvalds's avatar
Linus Torvalds committed
109
	void		(*pcibios_fixup)(void);
110
	int		(*pci_probe_mode)(struct pci_bus *);
111
	void		(*pci_irq_fixup)(struct pci_dev *dev);
112
113
	int		(*pcibios_root_bridge_prepare)(struct pci_host_bridge
				*bridge);
Linus Torvalds's avatar
Linus Torvalds committed
114

115
116
117
	/* To setup PHBs when using automatic OF platform driver for PCI */
	int		(*pci_setup_phb)(struct pci_controller *host);

118
119
120
121
122
123
124
125
#ifdef CONFIG_PCI_MSI
	int		(*msi_check_device)(struct pci_dev* dev,
					    int nvec, int type);
	int		(*setup_msi_irqs)(struct pci_dev *dev,
					  int nvec, int type);
	void		(*teardown_msi_irqs)(struct pci_dev *dev);
#endif

Linus Torvalds's avatar
Linus Torvalds committed
126
127
128
129
130
131
	void		(*restart)(char *cmd);
	void		(*power_off)(void);
	void		(*halt)(void);
	void		(*panic)(char *str);
	void		(*cpu_die)(void);

Paul Mackerras's avatar
Paul Mackerras committed
132
133
	long		(*time_init)(void); /* Optional, may be NULL */

Linus Torvalds's avatar
Linus Torvalds committed
134
135
	int		(*set_rtc_time)(struct rtc_time *);
	void		(*get_rtc_time)(struct rtc_time *);
Paul Mackerras's avatar
Paul Mackerras committed
136
137
138
	unsigned long	(*get_boot_time)(void);
	unsigned char 	(*rtc_read_val)(int addr);
	void		(*rtc_write_val)(int addr, unsigned char val);
Linus Torvalds's avatar
Linus Torvalds committed
139
140
141
142
143
144
145
146

	void		(*calibrate_decr)(void);

	void		(*progress)(char *, unsigned short);

	/* Interface for platform error logging */
	void 		(*log_error)(char *buf, unsigned int err_type, int fatal);

147
148
	unsigned char 	(*nvram_read_val)(int addr);
	void		(*nvram_write_val)(int addr, unsigned char val);
Linus Torvalds's avatar
Linus Torvalds committed
149
150
151
	ssize_t		(*nvram_write)(char *buf, size_t count, loff_t *index);
	ssize_t		(*nvram_read)(char *buf, size_t count, loff_t *index);	
	ssize_t		(*nvram_size)(void);		
Paul Mackerras's avatar
Paul Mackerras committed
152
	void		(*nvram_sync)(void);
Linus Torvalds's avatar
Linus Torvalds committed
153
154

	/* Exception handlers */
155
	int		(*system_reset_exception)(struct pt_regs *regs);
Linus Torvalds's avatar
Linus Torvalds committed
156
157
158
159
160
161
162
163
164
165
166
167
168
	int 		(*machine_check_exception)(struct pt_regs *regs);

	/* Motherboard/chipset features. This is a kind of general purpose
	 * hook used to control some machine specific features (like reset
	 * lines, chip power control, etc...).
	 */
	long	 	(*feature_call)(unsigned int feature, ...);

	/* Get legacy PCI/IDE interrupt mapping */ 
	int		(*pci_get_legacy_ide_irq)(struct pci_dev *dev, int channel);
	
	/* Get access protection for /dev/mem */
	pgprot_t	(*phys_mem_access_prot)(struct file *file,
169
						unsigned long pfn,
Linus Torvalds's avatar
Linus Torvalds committed
170
171
172
						unsigned long size,
						pgprot_t vma_prot);

173
174
175
176
177
178
	/*
	 * Function for waiting for work with reduced power in idle loop;
	 * called with interrupts disabled.
	 */
	void		(*power_save)(void);

Paul Mackerras's avatar
Paul Mackerras committed
179
180
	/* Function to enable performance monitor counters for this
	   platform, called once per cpu. */
181
	void		(*enable_pmcs)(void);
Paul Mackerras's avatar
Paul Mackerras committed
182

183
	/* Set DABR for this platform, leave empty for default implemenation */
184
185
	int		(*set_dabr)(unsigned long dabr,
				    unsigned long dabrx);
186

187
188
189
190
	/* Set DAWR for this platform, leave empty for default implemenation */
	int		(*set_dawr)(unsigned long dawr,
				    unsigned long dawrx);

Paul Mackerras's avatar
Paul Mackerras committed
191
192
193
194
195
196
197
198
199
200
201
202
203
#ifdef CONFIG_PPC32	/* XXX for now */
	/* A general init function, called by ppc_init in init/main.c.
	   May be NULL. */
	void		(*init)(void);

	void		(*kgdb_map_scc)(void);

	/*
	 * optional PCI "hooks"
	 */
	/* Called at then very end of pcibios_init() */
	void (*pcibios_after_init)(void);

204
#endif /* CONFIG_PPC32 */
Paul Mackerras's avatar
Paul Mackerras committed
205

206
207
208
	/* Called in indirect_* to avoid touching devices */
	int (*pci_exclude_device)(struct pci_controller *, unsigned char, unsigned char);

209
210
211
212
213
214
215
	/* Called after PPC generic resource fixup to perform
	   machine specific fixups */
	void (*pcibios_fixup_resources)(struct pci_dev *);

	/* Called for each PCI bus in the system when it's probed */
	void (*pcibios_fixup_bus)(struct pci_bus *);

216
217
218
219
	/* Called when pci_enable_device() is called. Returns 0 to
	 * allow assignment/enabling of the device. */
	int  (*pcibios_enable_device_hook)(struct pci_dev *);

220
221
222
	/* Called after scan and before resource survey */
	void (*pcibios_fixup_phb)(struct pci_controller *hose);

223
224
225
	/* Called during PCI resource reassignment */
	resource_size_t (*pcibios_window_alignment)(struct pci_bus *, unsigned long type);

Paul Mackerras's avatar
Paul Mackerras committed
226
227
228
229
230
	/* Called to shutdown machine specific hardware not already controlled
	 * by other drivers.
	 */
	void (*machine_shutdown)(void);

231
#ifdef CONFIG_KEXEC
232
233
	void (*kexec_cpu_down)(int crash_shutdown, int secondary);

Paul Mackerras's avatar
Paul Mackerras committed
234
235
236
237
238
239
	/* Called to do what every setup is needed on image and the
	 * reboot code buffer. Returns 0 on success.
	 * Provide your own (maybe dummy) implementation if your platform
	 * claims to support kexec.
	 */
	int (*machine_kexec_prepare)(struct kimage *image);
240
241
242
243
244
245

	/* Called to perform the _real_ kexec.
	 * Do NOT allocate memory or fail here. We are past the point of
	 * no return.
	 */
	void (*machine_kexec)(struct kimage *image);
Paul Mackerras's avatar
Paul Mackerras committed
246
#endif /* CONFIG_KEXEC */
247
248
249
250
251
252
253
254
255
256

#ifdef CONFIG_SUSPEND
	/* These are called to disable and enable, respectively, IRQs when
	 * entering a suspend state.  If NULL, then the generic versions
	 * will be called.  The generic versions disable/enable the
	 * decrementer along with interrupts.
	 */
	void (*suspend_disable_irqs)(void);
	void (*suspend_enable_irqs)(void);
#endif
257
	int (*suspend_disable_cpu)(void);
258
259
260
261
262

#ifdef CONFIG_ARCH_CPU_PROBE_RELEASE
	ssize_t (*cpu_probe)(const char *, size_t);
	ssize_t (*cpu_release)(const char *, size_t);
#endif
Linus Torvalds's avatar
Linus Torvalds committed
263
264
};

265
extern void e500_idle(void);
266
extern void power4_idle(void);
267
extern void power7_idle(void);
268
extern void ppc6xx_idle(void);
269
extern void book3e_idle(void);
270

271
272
273
274
275
/*
 * ppc_md contains a copy of the machine description structure for the
 * current platform. machine_id contains the initial address where the
 * description was found during boot.
 */
Linus Torvalds's avatar
Linus Torvalds committed
276
extern struct machdep_calls ppc_md;
277
278
279
280
extern struct machdep_calls *machine_id;

#define __machine_desc __attribute__ ((__section__ (".machine.desc")))

281
282
283
284
285
#define define_machine(name)					\
	extern struct machdep_calls mach_##name;		\
	EXPORT_SYMBOL(mach_##name);				\
	struct machdep_calls mach_##name __machine_desc =

286
287
288
289
290
291
292
293
294
#define machine_is(name) \
	({ \
		extern struct machdep_calls mach_##name \
			__attribute__((weak));		 \
		machine_id == &mach_##name; \
	})

extern void probe_machine(void);

Linus Torvalds's avatar
Linus Torvalds committed
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
extern char cmd_line[COMMAND_LINE_SIZE];

#ifdef CONFIG_PPC_PMAC
/*
 * Power macintoshes have either a CUDA, PMU or SMU controlling
 * system reset, power, NVRAM, RTC.
 */
typedef enum sys_ctrler_kind {
	SYS_CTRLER_UNKNOWN = 0,
	SYS_CTRLER_CUDA = 1,
	SYS_CTRLER_PMU = 2,
	SYS_CTRLER_SMU = 3,
} sys_ctrler_t;
extern sys_ctrler_t sys_ctrler;

#endif /* CONFIG_PPC_PMAC */


/* Functions to produce codes on the leds.
 * The SRC code should be unique for the message category and should
 * be limited to the lower 24 bits (the upper 8 are set by these funcs),
 * and (for boot & dump) should be sorted numerically in the order
 * the events occur.
 */
/* Print a boot progress message. */
void ppc64_boot_msg(unsigned int src, const char *msg);

static inline void log_error(char *buf, unsigned int err_type, int fatal)
{
	if (ppc_md.log_error)
		ppc_md.log_error(buf, err_type, fatal);
}

328
#define __define_machine_initcall(mach, fn, id) \
329
330
331
332
	static int __init __machine_initcall_##mach##_##fn(void) { \
		if (machine_is(mach)) return fn(); \
		return 0; \
	} \
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
	__define_initcall(__machine_initcall_##mach##_##fn, id);

#define machine_core_initcall(mach, fn)		__define_machine_initcall(mach, fn, 1)
#define machine_core_initcall_sync(mach, fn)	__define_machine_initcall(mach, fn, 1s)
#define machine_postcore_initcall(mach, fn)	__define_machine_initcall(mach, fn, 2)
#define machine_postcore_initcall_sync(mach, fn)	__define_machine_initcall(mach, fn, 2s)
#define machine_arch_initcall(mach, fn)		__define_machine_initcall(mach, fn, 3)
#define machine_arch_initcall_sync(mach, fn)	__define_machine_initcall(mach, fn, 3s)
#define machine_subsys_initcall(mach, fn)	__define_machine_initcall(mach, fn, 4)
#define machine_subsys_initcall_sync(mach, fn)	__define_machine_initcall(mach, fn, 4s)
#define machine_fs_initcall(mach, fn)		__define_machine_initcall(mach, fn, 5)
#define machine_fs_initcall_sync(mach, fn)	__define_machine_initcall(mach, fn, 5s)
#define machine_rootfs_initcall(mach, fn)	__define_machine_initcall(mach, fn, rootfs)
#define machine_device_initcall(mach, fn)	__define_machine_initcall(mach, fn, 6)
#define machine_device_initcall_sync(mach, fn)	__define_machine_initcall(mach, fn, 6s)
#define machine_late_initcall(mach, fn)		__define_machine_initcall(mach, fn, 7)
#define machine_late_initcall_sync(mach, fn)	__define_machine_initcall(mach, fn, 7s)
350

Linus Torvalds's avatar
Linus Torvalds committed
351
#endif /* __KERNEL__ */
352
#endif /* _ASM_POWERPC_MACHDEP_H */