• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/linux/linux-2.6.36/arch/powerpc/include/asm/
1#ifndef _ASM_POWERPC_MACHDEP_H
2#define _ASM_POWERPC_MACHDEP_H
3#ifdef __KERNEL__
4
5/*
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version
9 * 2 of the License, or (at your option) any later version.
10 */
11
12#include <linux/seq_file.h>
13#include <linux/init.h>
14#include <linux/dma-mapping.h>
15
16#include <asm/setup.h>
17
18/* We export this macro for external modules like Alsa to know if
19 * ppc_md.feature_call is implemented or not
20 */
21#define CONFIG_PPC_HAS_FEATURE_CALLS
22
23struct pt_regs;
24struct pci_bus;
25struct device_node;
26struct iommu_table;
27struct rtc_time;
28struct file;
29struct pci_controller;
30#ifdef CONFIG_KEXEC
31struct kimage;
32#endif
33
34#ifdef CONFIG_SMP
35struct smp_ops_t {
36	void  (*message_pass)(int target, int msg);
37	int   (*probe)(void);
38	void  (*kick_cpu)(int nr);
39	void  (*setup_cpu)(int nr);
40	void  (*take_timebase)(void);
41	void  (*give_timebase)(void);
42	int   (*cpu_enable)(unsigned int nr);
43	int   (*cpu_disable)(void);
44	void  (*cpu_die)(unsigned int nr);
45	int   (*cpu_bootable)(unsigned int nr);
46};
47#endif
48
49struct machdep_calls {
50	char		*name;
51#ifdef CONFIG_PPC64
52	void            (*hpte_invalidate)(unsigned long slot,
53					   unsigned long va,
54					   int psize, int ssize,
55					   int local);
56	long		(*hpte_updatepp)(unsigned long slot,
57					 unsigned long newpp,
58					 unsigned long va,
59					 int psize, int ssize,
60					 int local);
61	void            (*hpte_updateboltedpp)(unsigned long newpp,
62					       unsigned long ea,
63					       int psize, int ssize);
64	long		(*hpte_insert)(unsigned long hpte_group,
65				       unsigned long va,
66				       unsigned long prpn,
67				       unsigned long rflags,
68				       unsigned long vflags,
69				       int psize, int ssize);
70	long		(*hpte_remove)(unsigned long hpte_group);
71	void            (*hpte_removebolted)(unsigned long ea,
72					     int psize, int ssize);
73	void		(*flush_hash_range)(unsigned long number, int local);
74
75	/* special for kexec, to be called in real mode, linar mapping is
76	 * destroyed as well */
77	void		(*hpte_clear_all)(void);
78
79	int		(*tce_build)(struct iommu_table *tbl,
80				     long index,
81				     long npages,
82				     unsigned long uaddr,
83				     enum dma_data_direction direction,
84				     struct dma_attrs *attrs);
85	void		(*tce_free)(struct iommu_table *tbl,
86				    long index,
87				    long npages);
88	unsigned long	(*tce_get)(struct iommu_table *tbl,
89				    long index);
90	void		(*tce_flush)(struct iommu_table *tbl);
91
92	void __iomem *	(*ioremap)(phys_addr_t addr, unsigned long size,
93				   unsigned long flags, void *caller);
94	void		(*iounmap)(volatile void __iomem *token);
95
96#ifdef CONFIG_PM
97	void		(*iommu_save)(void);
98	void		(*iommu_restore)(void);
99#endif
100#endif /* CONFIG_PPC64 */
101
102	void		(*pci_dma_dev_setup)(struct pci_dev *dev);
103	void		(*pci_dma_bus_setup)(struct pci_bus *bus);
104
105	int		(*probe)(void);
106	void		(*setup_arch)(void); /* Optional, may be NULL */
107	void		(*init_early)(void);
108	/* Optional, may be NULL. */
109	void		(*show_cpuinfo)(struct seq_file *m);
110	void		(*show_percpuinfo)(struct seq_file *m, int i);
111
112	void		(*init_IRQ)(void);
113
114	/* Return an irq, or NO_IRQ to indicate there are none pending.
115	 * If for some reason there is no irq, but the interrupt
116	 * shouldn't be counted as spurious, return NO_IRQ_IGNORE. */
117	unsigned int	(*get_irq)(void);
118#ifdef CONFIG_KEXEC
119	void		(*kexec_cpu_down)(int crash_shutdown, int secondary);
120#endif
121
122	/* PCI stuff */
123	/* Called after scanning the bus, before allocating resources */
124	void		(*pcibios_fixup)(void);
125	int		(*pci_probe_mode)(struct pci_bus *);
126	void		(*pci_irq_fixup)(struct pci_dev *dev);
127
128	/* To setup PHBs when using automatic OF platform driver for PCI */
129	int		(*pci_setup_phb)(struct pci_controller *host);
130
131#ifdef CONFIG_PCI_MSI
132	int		(*msi_check_device)(struct pci_dev* dev,
133					    int nvec, int type);
134	int		(*setup_msi_irqs)(struct pci_dev *dev,
135					  int nvec, int type);
136	void		(*teardown_msi_irqs)(struct pci_dev *dev);
137#endif
138
139	void		(*restart)(char *cmd);
140	void		(*power_off)(void);
141	void		(*halt)(void);
142	void		(*panic)(char *str);
143	void		(*cpu_die)(void);
144
145	long		(*time_init)(void); /* Optional, may be NULL */
146
147	int		(*set_rtc_time)(struct rtc_time *);
148	void		(*get_rtc_time)(struct rtc_time *);
149	unsigned long	(*get_boot_time)(void);
150	unsigned char 	(*rtc_read_val)(int addr);
151	void		(*rtc_write_val)(int addr, unsigned char val);
152
153	void		(*calibrate_decr)(void);
154
155	void		(*progress)(char *, unsigned short);
156
157	/* Interface for platform error logging */
158	void 		(*log_error)(char *buf, unsigned int err_type, int fatal);
159
160	unsigned char 	(*nvram_read_val)(int addr);
161	void		(*nvram_write_val)(int addr, unsigned char val);
162	ssize_t		(*nvram_write)(char *buf, size_t count, loff_t *index);
163	ssize_t		(*nvram_read)(char *buf, size_t count, loff_t *index);
164	ssize_t		(*nvram_size)(void);
165	void		(*nvram_sync)(void);
166
167	/* Exception handlers */
168	int		(*system_reset_exception)(struct pt_regs *regs);
169	int 		(*machine_check_exception)(struct pt_regs *regs);
170
171	/* Motherboard/chipset features. This is a kind of general purpose
172	 * hook used to control some machine specific features (like reset
173	 * lines, chip power control, etc...).
174	 */
175	long	 	(*feature_call)(unsigned int feature, ...);
176
177	/* Get legacy PCI/IDE interrupt mapping */
178	int		(*pci_get_legacy_ide_irq)(struct pci_dev *dev, int channel);
179
180	/* Get access protection for /dev/mem */
181	pgprot_t	(*phys_mem_access_prot)(struct file *file,
182						unsigned long pfn,
183						unsigned long size,
184						pgprot_t vma_prot);
185
186	/* Idle loop for this platform, leave empty for default idle loop */
187	void		(*idle_loop)(void);
188
189	/*
190	 * Function for waiting for work with reduced power in idle loop;
191	 * called with interrupts disabled.
192	 */
193	void		(*power_save)(void);
194
195	/* Function to enable performance monitor counters for this
196	   platform, called once per cpu. */
197	void		(*enable_pmcs)(void);
198
199	/* Set DABR for this platform, leave empty for default implemenation */
200	int		(*set_dabr)(unsigned long dabr);
201
202#ifdef CONFIG_PPC32
203	/* A general init function, called by ppc_init in init/main.c.
204	   May be NULL. */
205	void		(*init)(void);
206
207	void		(*kgdb_map_scc)(void);
208
209	/*
210	 * optional PCI "hooks"
211	 */
212	/* Called at then very end of pcibios_init() */
213	void (*pcibios_after_init)(void);
214
215#endif /* CONFIG_PPC32 */
216
217	/* Called in indirect_* to avoid touching devices */
218	int (*pci_exclude_device)(struct pci_controller *, unsigned char, unsigned char);
219
220	/* Called after PPC generic resource fixup to perform
221	   machine specific fixups */
222	void (*pcibios_fixup_resources)(struct pci_dev *);
223
224	/* Called for each PCI bus in the system when it's probed */
225	void (*pcibios_fixup_bus)(struct pci_bus *);
226
227	/* Called when pci_enable_device() is called. Returns 0 to
228	 * allow assignment/enabling of the device. */
229	int  (*pcibios_enable_device_hook)(struct pci_dev *);
230
231	/* Called to shutdown machine specific hardware not already controlled
232	 * by other drivers.
233	 */
234	void (*machine_shutdown)(void);
235
236#ifdef CONFIG_KEXEC
237	void (*machine_crash_shutdown)(struct pt_regs *regs);
238
239	/* Called to do what every setup is needed on image and the
240	 * reboot code buffer. Returns 0 on success.
241	 * Provide your own (maybe dummy) implementation if your platform
242	 * claims to support kexec.
243	 */
244	int (*machine_kexec_prepare)(struct kimage *image);
245
246	/* Called to handle any machine specific cleanup on image */
247	void (*machine_kexec_cleanup)(struct kimage *image);
248
249	/* Called to perform the _real_ kexec.
250	 * Do NOT allocate memory or fail here. We are past the point of
251	 * no return.
252	 */
253	void (*machine_kexec)(struct kimage *image);
254#endif /* CONFIG_KEXEC */
255
256#ifdef CONFIG_SUSPEND
257	/* These are called to disable and enable, respectively, IRQs when
258	 * entering a suspend state.  If NULL, then the generic versions
259	 * will be called.  The generic versions disable/enable the
260	 * decrementer along with interrupts.
261	 */
262	void (*suspend_disable_irqs)(void);
263	void (*suspend_enable_irqs)(void);
264#endif
265	int (*suspend_disable_cpu)(void);
266
267#ifdef CONFIG_ARCH_CPU_PROBE_RELEASE
268	ssize_t (*cpu_probe)(const char *, size_t);
269	ssize_t (*cpu_release)(const char *, size_t);
270#endif
271};
272
273extern void e500_idle(void);
274extern void power4_idle(void);
275extern void power4_cpu_offline_powersave(void);
276extern void ppc6xx_idle(void);
277extern void book3e_idle(void);
278
279/*
280 * ppc_md contains a copy of the machine description structure for the
281 * current platform. machine_id contains the initial address where the
282 * description was found during boot.
283 */
284extern struct machdep_calls ppc_md;
285extern struct machdep_calls *machine_id;
286
287#define __machine_desc __attribute__ ((__section__ (".machine.desc")))
288
289#define define_machine(name)					\
290	extern struct machdep_calls mach_##name;		\
291	EXPORT_SYMBOL(mach_##name);				\
292	struct machdep_calls mach_##name __machine_desc =
293
294#define machine_is(name) \
295	({ \
296		extern struct machdep_calls mach_##name \
297			__attribute__((weak));		 \
298		machine_id == &mach_##name; \
299	})
300
301extern void probe_machine(void);
302
303extern char cmd_line[COMMAND_LINE_SIZE];
304
305#ifdef CONFIG_PPC_PMAC
306/*
307 * Power macintoshes have either a CUDA, PMU or SMU controlling
308 * system reset, power, NVRAM, RTC.
309 */
310typedef enum sys_ctrler_kind {
311	SYS_CTRLER_UNKNOWN = 0,
312	SYS_CTRLER_CUDA = 1,
313	SYS_CTRLER_PMU = 2,
314	SYS_CTRLER_SMU = 3,
315} sys_ctrler_t;
316extern sys_ctrler_t sys_ctrler;
317
318#endif /* CONFIG_PPC_PMAC */
319
320extern void setup_pci_ptrs(void);
321
322#ifdef CONFIG_SMP
323/* Poor default implementations */
324extern void __devinit smp_generic_give_timebase(void);
325extern void __devinit smp_generic_take_timebase(void);
326#endif /* CONFIG_SMP */
327
328
329/* Functions to produce codes on the leds.
330 * The SRC code should be unique for the message category and should
331 * be limited to the lower 24 bits (the upper 8 are set by these funcs),
332 * and (for boot & dump) should be sorted numerically in the order
333 * the events occur.
334 */
335/* Print a boot progress message. */
336void ppc64_boot_msg(unsigned int src, const char *msg);
337
338static inline void log_error(char *buf, unsigned int err_type, int fatal)
339{
340	if (ppc_md.log_error)
341		ppc_md.log_error(buf, err_type, fatal);
342}
343
344#define __define_machine_initcall(mach,level,fn,id) \
345	static int __init __machine_initcall_##mach##_##fn(void) { \
346		if (machine_is(mach)) return fn(); \
347		return 0; \
348	} \
349	__define_initcall(level,__machine_initcall_##mach##_##fn,id);
350
351#define machine_core_initcall(mach,fn)		__define_machine_initcall(mach,"1",fn,1)
352#define machine_core_initcall_sync(mach,fn)	__define_machine_initcall(mach,"1s",fn,1s)
353#define machine_postcore_initcall(mach,fn)	__define_machine_initcall(mach,"2",fn,2)
354#define machine_postcore_initcall_sync(mach,fn)	__define_machine_initcall(mach,"2s",fn,2s)
355#define machine_arch_initcall(mach,fn)		__define_machine_initcall(mach,"3",fn,3)
356#define machine_arch_initcall_sync(mach,fn)	__define_machine_initcall(mach,"3s",fn,3s)
357#define machine_subsys_initcall(mach,fn)	__define_machine_initcall(mach,"4",fn,4)
358#define machine_subsys_initcall_sync(mach,fn)	__define_machine_initcall(mach,"4s",fn,4s)
359#define machine_fs_initcall(mach,fn)		__define_machine_initcall(mach,"5",fn,5)
360#define machine_fs_initcall_sync(mach,fn)	__define_machine_initcall(mach,"5s",fn,5s)
361#define machine_rootfs_initcall(mach,fn)	__define_machine_initcall(mach,"rootfs",fn,rootfs)
362#define machine_device_initcall(mach,fn)	__define_machine_initcall(mach,"6",fn,6)
363#define machine_device_initcall_sync(mach,fn)	__define_machine_initcall(mach,"6s",fn,6s)
364#define machine_late_initcall(mach,fn)		__define_machine_initcall(mach,"7",fn,7)
365#define machine_late_initcall_sync(mach,fn)	__define_machine_initcall(mach,"7s",fn,7s)
366
367#endif /* __KERNEL__ */
368#endif /* _ASM_POWERPC_MACHDEP_H */
369