Blame view

include/asm-powerpc/machdep.h 9.5 KB
b41fc4f82   Paul Mackerras   power: Update the...
1
2
  #ifndef _ASM_POWERPC_MACHDEP_H
  #define _ASM_POWERPC_MACHDEP_H
143a1dec7   Paul Mackerras   powerpc: Merge ma...
3
  #ifdef __KERNEL__
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4
5
6
7
8
9
10
  
  /*
   * 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.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
11
12
13
14
15
  #include <linux/seq_file.h>
  #include <linux/init.h>
  #include <linux/dma-mapping.h>
  
  #include <asm/setup.h>
143a1dec7   Paul Mackerras   powerpc: Merge ma...
16
17
18
19
  /* 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
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
20
21
22
23
24
25
  struct pt_regs;
  struct pci_bus;	
  struct device_node;
  struct iommu_table;
  struct rtc_time;
  struct file;
4c9d2800b   Benjamin Herrenschmidt   [POWERPC] Generic...
26
  struct pci_controller;
3d1229d6a   Michael Ellerman   [PATCH] powerpc: ...
27
28
29
  #ifdef CONFIG_KEXEC
  struct kimage;
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
  
  #ifdef CONFIG_SMP
  struct smp_ops_t {
  	void  (*message_pass)(int target, int msg);
  	int   (*probe)(void);
  	void  (*kick_cpu)(int nr);
  	void  (*setup_cpu)(int nr);
  	void  (*take_timebase)(void);
  	void  (*give_timebase)(void);
  	int   (*cpu_enable)(unsigned int nr);
  	int   (*cpu_disable)(void);
  	void  (*cpu_die)(unsigned int nr);
  	int   (*cpu_bootable)(unsigned int nr);
  };
  #endif
  
  struct machdep_calls {
e8222502e   Benjamin Herrenschmidt   [PATCH] powerpc: ...
47
  	char		*name;
143a1dec7   Paul Mackerras   powerpc: Merge ma...
48
  #ifdef CONFIG_PPC64
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
49
50
  	void            (*hpte_invalidate)(unsigned long slot,
  					   unsigned long va,
3c726f8de   Benjamin Herrenschmidt   [PATCH] ppc64: su...
51
  					   int psize,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
52
53
54
55
  					   int local);
  	long		(*hpte_updatepp)(unsigned long slot, 
  					 unsigned long newpp, 
  					 unsigned long va,
3c726f8de   Benjamin Herrenschmidt   [PATCH] ppc64: su...
56
  					 int pize,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
57
58
  					 int local);
  	void            (*hpte_updateboltedpp)(unsigned long newpp, 
3c726f8de   Benjamin Herrenschmidt   [PATCH] ppc64: su...
59
60
  					       unsigned long ea,
  					       int psize);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
61
62
63
  	long		(*hpte_insert)(unsigned long hpte_group,
  				       unsigned long va,
  				       unsigned long prpn,
3c726f8de   Benjamin Herrenschmidt   [PATCH] ppc64: su...
64
  				       unsigned long rflags,
96e284499   David Gibson   [PATCH] ppc64: ki...
65
  				       unsigned long vflags,
3c726f8de   Benjamin Herrenschmidt   [PATCH] ppc64: su...
66
  				       int psize);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
67
  	long		(*hpte_remove)(unsigned long hpte_group);
61b1a9425   Benjamin Herrenschmidt   [PATCH] ppc64: St...
68
  	void		(*flush_hash_range)(unsigned long number, int local);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
69
70
71
72
73
74
75
76
77
78
79
80
  	/* special for kexec, to be called in real mode, linar mapping is
  	 * destroyed as well */
  	void		(*hpte_clear_all)(void);
  
  	void		(*tce_build)(struct iommu_table * tbl,
  				     long index,
  				     long npages,
  				     unsigned long uaddr,
  				     enum dma_data_direction direction);
  	void		(*tce_free)(struct iommu_table *tbl,
  				    long index,
  				    long npages);
5f50867b4   Haren Myneni   [POWERPC] kdump: ...
81
82
  	unsigned long	(*tce_get)(struct iommu_table *tbl,
  				    long index);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
83
  	void		(*tce_flush)(struct iommu_table *tbl);
12d04eef9   Benjamin Herrenschmidt   [POWERPC] Refacto...
84
85
  	void		(*pci_dma_dev_setup)(struct pci_dev *dev);
  	void		(*pci_dma_bus_setup)(struct pci_bus *bus);
4cb3cee03   Benjamin Herrenschmidt   [POWERPC] Allow h...
86

68a64357d   Benjamin Herrenschmidt   [POWERPC] Merge 3...
87
  	void __iomem *	(*ioremap)(phys_addr_t addr, unsigned long size,
4cb3cee03   Benjamin Herrenschmidt   [POWERPC] Allow h...
88
  				   unsigned long flags);
68a64357d   Benjamin Herrenschmidt   [POWERPC] Merge 3...
89
  	void		(*iounmap)(volatile void __iomem *token);
7e11580b3   Johannes Berg   [POWERPC] DART io...
90
91
92
93
94
  
  #ifdef CONFIG_PM
  	void		(*iommu_save)(void);
  	void		(*iommu_restore)(void);
  #endif
e8222502e   Benjamin Herrenschmidt   [PATCH] powerpc: ...
95
  #endif /* CONFIG_PPC64 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
96

e8222502e   Benjamin Herrenschmidt   [PATCH] powerpc: ...
97
  	int		(*probe)(void);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
98
99
100
  	void		(*setup_arch)(void);
  	void		(*init_early)(void);
  	/* Optional, may be NULL. */
d8699e65c   Paul Mackerras   ppc64: Change ppc...
101
102
  	void		(*show_cpuinfo)(struct seq_file *m);
  	void		(*show_percpuinfo)(struct seq_file *m, int i);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
103
104
  
  	void		(*init_IRQ)(void);
35a84c2f5   Olaf Hering   [POWERPC] Fix up ...
105
  	unsigned int	(*get_irq)(void);
c5e24354e   Michael Ellerman   [PATCH] powerpc: ...
106
107
108
  #ifdef CONFIG_KEXEC
  	void		(*kexec_cpu_down)(int crash_shutdown, int secondary);
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
109
110
  
  	/* PCI stuff */
143a1dec7   Paul Mackerras   powerpc: Merge ma...
111
  	/* Called after scanning the bus, before allocating resources */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
112
  	void		(*pcibios_fixup)(void);
4267292b0   Paul Mackerras   ppc64: Set up PCI...
113
  	int		(*pci_probe_mode)(struct pci_bus *);
f90bb153b   Benjamin Herrenschmidt   [POWERPC] Make pc...
114
  	void		(*pci_irq_fixup)(struct pci_dev *dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
115

4c9d2800b   Benjamin Herrenschmidt   [POWERPC] Generic...
116
117
  	/* To setup PHBs when using automatic OF platform driver for PCI */
  	int		(*pci_setup_phb)(struct pci_controller *host);
df87ef550   Michael Ellerman   [POWERPC] PowerPC...
118
119
120
121
122
123
124
  #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
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
125
126
127
128
129
  	void		(*restart)(char *cmd);
  	void		(*power_off)(void);
  	void		(*halt)(void);
  	void		(*panic)(char *str);
  	void		(*cpu_die)(void);
143a1dec7   Paul Mackerras   powerpc: Merge ma...
130
  	long		(*time_init)(void); /* Optional, may be NULL */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
131
132
  	int		(*set_rtc_time)(struct rtc_time *);
  	void		(*get_rtc_time)(struct rtc_time *);
143a1dec7   Paul Mackerras   powerpc: Merge ma...
133
134
135
  	unsigned long	(*get_boot_time)(void);
  	unsigned char 	(*rtc_read_val)(int addr);
  	void		(*rtc_write_val)(int addr, unsigned char val);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
136
137
138
139
  
  	void		(*calibrate_decr)(void);
  
  	void		(*progress)(char *, unsigned short);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
140
141
  	/* Interface for platform error logging */
  	void 		(*log_error)(char *buf, unsigned int err_type, int fatal);
35499c019   Paul Mackerras   powerpc: Merge in...
142
143
  	unsigned char 	(*nvram_read_val)(int addr);
  	void		(*nvram_write_val)(int addr, unsigned char val);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
144
145
146
  	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);		
143a1dec7   Paul Mackerras   powerpc: Merge ma...
147
  	void		(*nvram_sync)(void);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
148
149
  
  	/* Exception handlers */
c902be71d   Arnd Bergmann   [PATCH] cell: ena...
150
  	int		(*system_reset_exception)(struct pt_regs *regs);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
151
152
153
154
155
156
157
  	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, ...);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
158
159
160
161
162
  	/* 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,
8b150478a   Roland Dreier   [PATCH] ppc: make...
163
  						unsigned long pfn,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
164
165
  						unsigned long size,
  						pgprot_t vma_prot);
fd899c0cc   Michael Ellerman   [PATCH] ppc64: Ma...
166
  	/* Idle loop for this platform, leave empty for default idle loop */
143a1dec7   Paul Mackerras   powerpc: Merge ma...
167
  	void		(*idle_loop)(void);
180a33627   Michael Ellerman   [PATCH] ppc64: Mo...
168

a0652fc9a   Paul Mackerras   powerpc: Unify th...
169
170
171
172
173
  	/*
  	 * Function for waiting for work with reduced power in idle loop;
  	 * called with interrupts disabled.
  	 */
  	void		(*power_save)(void);
143a1dec7   Paul Mackerras   powerpc: Merge ma...
174
175
  	/* Function to enable performance monitor counters for this
  	   platform, called once per cpu. */
180a33627   Michael Ellerman   [PATCH] ppc64: Mo...
176
  	void		(*enable_pmcs)(void);
143a1dec7   Paul Mackerras   powerpc: Merge ma...
177

76032de89   Michael Ellerman   [PATCH] powerpc: ...
178
179
  	/* Set DABR for this platform, leave empty for default implemenation */
  	int		(*set_dabr)(unsigned long dabr);
143a1dec7   Paul Mackerras   powerpc: Merge ma...
180
  #ifdef CONFIG_PPC32	/* XXX for now */
143a1dec7   Paul Mackerras   powerpc: Merge ma...
181
182
183
  	/* A general init function, called by ppc_init in init/main.c.
  	   May be NULL. */
  	void		(*init)(void);
143a1dec7   Paul Mackerras   powerpc: Merge ma...
184
185
186
187
  	void		(*setup_io_mappings)(void);
  
  	void		(*early_serial_map)(void);
  	void		(*kgdb_map_scc)(void);
143a1dec7   Paul Mackerras   powerpc: Merge ma...
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
  	/*
  	 * optional PCI "hooks"
  	 */
  
  	/* 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 *);
  
  	/* Called when pci_enable_device() is called (initial=0) or
  	 * when a device with no assigned resource is found (initial=1).
  	 * Returns 0 to allow assignment/enabling of the device. */
  	int  (*pcibios_enable_device_hook)(struct pci_dev *, int initial);
143a1dec7   Paul Mackerras   powerpc: Merge ma...
203
204
205
206
207
  	/* Called in indirect_* to avoid touching devices */
  	int (*pci_exclude_device)(unsigned char, unsigned char);
  
  	/* Called at then very end of pcibios_init() */
  	void (*pcibios_after_init)(void);
3d1229d6a   Michael Ellerman   [PATCH] powerpc: ...
208
  #endif /* CONFIG_PPC32 */
143a1dec7   Paul Mackerras   powerpc: Merge ma...
209

143a1dec7   Paul Mackerras   powerpc: Merge ma...
210
211
  	/* Called to shutdown machine specific hardware not already controlled
  	 * by other drivers.
143a1dec7   Paul Mackerras   powerpc: Merge ma...
212
213
  	 */
  	void (*machine_shutdown)(void);
3d1229d6a   Michael Ellerman   [PATCH] powerpc: ...
214
  #ifdef CONFIG_KEXEC
143a1dec7   Paul Mackerras   powerpc: Merge ma...
215
216
217
218
  	/* Called to do the minimal shutdown needed to run a kexec'd kernel
  	 * to run successfully.
  	 * XXX Should we move this one out of kexec scope?
  	 */
cd0ca2ce4   Michael Ellerman   [PATCH] powerpc: ...
219
  	void (*machine_crash_shutdown)(struct pt_regs *regs);
143a1dec7   Paul Mackerras   powerpc: Merge ma...
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
  
  	/* 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);
  
  	/* Called to handle any machine specific cleanup on image */
  	void (*machine_kexec_cleanup)(struct kimage *image);
  
  	/* 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);
  #endif /* CONFIG_KEXEC */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
237
  };
a0652fc9a   Paul Mackerras   powerpc: Unify th...
238
  extern void power4_idle(void);
d9333afd6   Johannes Berg   [POWERPC] powerma...
239
  extern void power4_cpu_offline_powersave(void);
a0652fc9a   Paul Mackerras   powerpc: Unify th...
240
  extern void ppc6xx_idle(void);
fd899c0cc   Michael Ellerman   [PATCH] ppc64: Ma...
241

e8222502e   Benjamin Herrenschmidt   [PATCH] powerpc: ...
242
243
244
245
246
  /*
   * 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.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
247
  extern struct machdep_calls ppc_md;
e8222502e   Benjamin Herrenschmidt   [PATCH] powerpc: ...
248
249
250
  extern struct machdep_calls *machine_id;
  
  #define __machine_desc __attribute__ ((__section__ (".machine.desc")))
d0e15bed8   Paul Mackerras   powerpc: Fix defi...
251
252
253
254
  #define define_machine(name)					\
  	extern struct machdep_calls mach_##name;		\
  	EXPORT_SYMBOL(mach_##name);				\
  	struct machdep_calls mach_##name __machine_desc =
e8222502e   Benjamin Herrenschmidt   [PATCH] powerpc: ...
255
256
257
258
259
260
261
262
  #define machine_is(name) \
  	({ \
  		extern struct machdep_calls mach_##name \
  			__attribute__((weak));		 \
  		machine_id == &mach_##name; \
  	})
  
  extern void probe_machine(void);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
  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 */
143a1dec7   Paul Mackerras   powerpc: Merge ma...
279
280
281
282
283
284
285
  extern void setup_pci_ptrs(void);
  
  #ifdef CONFIG_SMP
  /* Poor default implementations */
  extern void __devinit smp_generic_give_timebase(void);
  extern void __devinit smp_generic_take_timebase(void);
  #endif /* CONFIG_SMP */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
286
287
288
289
290
291
292
293
294
295
296
297
  
  
  /* 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);
  /* Print a termination message (print only -- does not stop the kernel) */
  void ppc64_terminate_msg(unsigned int src, const char *msg);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
298
299
300
301
302
303
  
  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);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
304
  #endif /* __KERNEL__ */
b41fc4f82   Paul Mackerras   power: Update the...
305
  #endif /* _ASM_POWERPC_MACHDEP_H */