diff options
Diffstat (limited to 'arch/powerpc/include/asm/machdep.h')
| -rw-r--r-- | arch/powerpc/include/asm/machdep.h | 155 | 
1 files changed, 83 insertions, 72 deletions
diff --git a/arch/powerpc/include/asm/machdep.h b/arch/powerpc/include/asm/machdep.h index d045b014553..f92b0b54e92 100644 --- a/arch/powerpc/include/asm/machdep.h +++ b/arch/powerpc/include/asm/machdep.h @@ -12,6 +12,7 @@  #include <linux/seq_file.h>  #include <linux/init.h>  #include <linux/dma-mapping.h> +#include <linux/export.h>  #include <asm/setup.h> @@ -27,52 +28,40 @@ struct iommu_table;  struct rtc_time;  struct file;  struct pci_controller; -#ifdef CONFIG_KEXEC  struct kimage; -#endif - -#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 pci_host_bridge;  struct machdep_calls {  	char		*name;  #ifdef CONFIG_PPC64  	void            (*hpte_invalidate)(unsigned long slot, -					   unsigned long va, -					   int psize, int ssize, -					   int local); +					   unsigned long vpn, +					   int bpsize, int apsize, +					   int ssize, int local);  	long		(*hpte_updatepp)(unsigned long slot,   					 unsigned long newpp,  -					 unsigned long va, -					 int psize, int ssize, -					 int local); +					 unsigned long vpn, +					 int bpsize, int apsize, +					 int ssize, int local);  	void            (*hpte_updateboltedpp)(unsigned long newpp,   					       unsigned long ea,  					       int psize, int ssize);  	long		(*hpte_insert)(unsigned long hpte_group, -				       unsigned long va, +				       unsigned long vpn,  				       unsigned long prpn,  				       unsigned long rflags,  				       unsigned long vflags, -				       int psize, int ssize); +				       int psize, int apsize, +				       int ssize);  	long		(*hpte_remove)(unsigned long hpte_group);  	void            (*hpte_removebolted)(unsigned long ea,  					     int psize, int ssize);  	void		(*flush_hash_range)(unsigned long number, int local); +	void		(*hugepage_invalidate)(struct mm_struct *mm, +					       unsigned char *hpte_slot_array, +					       unsigned long addr, int psize); -	/* special for kexec, to be called in real mode, linar mapping is +	/* special for kexec, to be called in real mode, linear mapping is  	 * destroyed as well */  	void		(*hpte_clear_all)(void); @@ -89,6 +78,18 @@ struct machdep_calls {  				    long index);  	void		(*tce_flush)(struct iommu_table *tbl); +	/* _rm versions are for real mode use only */ +	int		(*tce_build_rm)(struct iommu_table *tbl, +				     long index, +				     long npages, +				     unsigned long uaddr, +				     enum dma_data_direction direction, +				     struct dma_attrs *attrs); +	void		(*tce_free_rm)(struct iommu_table *tbl, +				    long index, +				    long npages); +	void		(*tce_flush_rm)(struct iommu_table *tbl); +  	void __iomem *	(*ioremap)(phys_addr_t addr, unsigned long size,  				   unsigned long flags, void *caller);  	void		(*iounmap)(volatile void __iomem *token); @@ -97,13 +98,17 @@ struct machdep_calls {  	void		(*iommu_save)(void);  	void		(*iommu_restore)(void);  #endif +#ifdef CONFIG_MEMORY_HOTPLUG_SPARSE +	unsigned long	(*memory_block_size)(void); +#endif  #endif /* CONFIG_PPC64 */  	void		(*pci_dma_dev_setup)(struct pci_dev *dev);  	void		(*pci_dma_bus_setup)(struct pci_bus *bus); -	/* Platform set_dma_mask override */ +	/* Platform set_dma_mask and dma_get_required_mask overrides */  	int		(*dma_set_mask)(struct device *dev, u64 dma_mask); +	u64		(*dma_get_required_mask)(struct device *dev);  	int		(*probe)(void);  	void		(*setup_arch)(void); /* Optional, may be NULL */ @@ -111,22 +116,21 @@ struct machdep_calls {  	/* Optional, may be NULL. */  	void		(*show_cpuinfo)(struct seq_file *m);  	void		(*show_percpuinfo)(struct seq_file *m, int i); +	/* Returns the current operating frequency of "cpu" in Hz */ +	unsigned long  	(*get_proc_freq)(unsigned int cpu);  	void		(*init_IRQ)(void); -	/* Return an irq, or NO_IRQ to indicate there are none pending. -	 * If for some reason there is no irq, but the interrupt -	 * shouldn't be counted as spurious, return NO_IRQ_IGNORE. */ +	/* Return an irq, or NO_IRQ to indicate there are none pending. */  	unsigned int	(*get_irq)(void); -#ifdef CONFIG_KEXEC -	void		(*kexec_cpu_down)(int crash_shutdown, int secondary); -#endif  	/* PCI stuff */  	/* Called after scanning the bus, before allocating resources */  	void		(*pcibios_fixup)(void);  	int		(*pci_probe_mode)(struct pci_bus *);  	void		(*pci_irq_fixup)(struct pci_dev *dev); +	int		(*pcibios_root_bridge_prepare)(struct pci_host_bridge +				*bridge);  	/* To setup PHBs when using automatic OF platform driver for PCI */  	int		(*pci_setup_phb)(struct pci_controller *host); @@ -171,6 +175,9 @@ struct machdep_calls {  	int		(*system_reset_exception)(struct pt_regs *regs);  	int 		(*machine_check_exception)(struct pt_regs *regs); +	/* Called during machine check exception to retrive fixup address. */ +	bool		(*mce_check_early_recovery)(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...). @@ -186,9 +193,6 @@ struct machdep_calls {  						unsigned long size,  						pgprot_t vma_prot); -	/* Idle loop for this platform, leave empty for default idle loop */ -	void		(*idle_loop)(void); -  	/*  	 * Function for waiting for work with reduced power in idle loop;  	 * called with interrupts disabled. @@ -200,7 +204,12 @@ struct machdep_calls {  	void		(*enable_pmcs)(void);  	/* Set DABR for this platform, leave empty for default implemenation */ -	int		(*set_dabr)(unsigned long dabr); +	int		(*set_dabr)(unsigned long dabr, +				    unsigned long dabrx); + +	/* Set DAWR for this platform, leave empty for default implemenation */ +	int		(*set_dawr)(unsigned long dawr, +				    unsigned long dawrx);  #ifdef CONFIG_PPC32	/* XXX for now */  	/* A general init function, called by ppc_init in init/main.c. @@ -231,17 +240,22 @@ struct machdep_calls {  	 * allow assignment/enabling of the device. */  	int  (*pcibios_enable_device_hook)(struct pci_dev *); +	/* Called after scan and before resource survey */ +	void (*pcibios_fixup_phb)(struct pci_controller *hose); + +	/* Called during PCI resource reassignment */ +	resource_size_t (*pcibios_window_alignment)(struct pci_bus *, unsigned long type); + +	/* Reset the secondary bus of bridge */ +	void  (*pcibios_reset_secondary_bus)(struct pci_dev *dev); +  	/* Called to shutdown machine specific hardware not already controlled  	 * by other drivers.  	 */  	void (*machine_shutdown)(void);  #ifdef CONFIG_KEXEC -	/* 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? -	 */ -	void (*machine_crash_shutdown)(struct pt_regs *regs); +	void (*kexec_cpu_down)(int crash_shutdown, int secondary);  	/* Called to do what every setup is needed on image and the  	 * reboot code buffer. Returns 0 on success. @@ -250,9 +264,6 @@ struct machdep_calls {  	 */  	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. @@ -275,11 +286,19 @@ struct machdep_calls {  	ssize_t (*cpu_probe)(const char *, size_t);  	ssize_t (*cpu_release)(const char *, size_t);  #endif + +#ifdef CONFIG_ARCH_RANDOM +	int (*get_random_long)(unsigned long *v); +#endif + +#ifdef CONFIG_MEMORY_HOTREMOVE +	int (*remove_memory)(u64, u64); +#endif  };  extern void e500_idle(void);  extern void power4_idle(void); -extern void power4_cpu_offline_powersave(void); +extern void power7_idle(void);  extern void ppc6xx_idle(void);  extern void book3e_idle(void); @@ -324,14 +343,6 @@ extern sys_ctrler_t sys_ctrler;  #endif /* CONFIG_PPC_PMAC */ -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 */ -  /* Functions to produce codes on the leds.   * The SRC code should be unique for the message category and should @@ -348,28 +359,28 @@ static inline void log_error(char *buf, unsigned int err_type, int fatal)  		ppc_md.log_error(buf, err_type, fatal);  } -#define __define_machine_initcall(mach,level,fn,id) \ +#define __define_machine_initcall(mach, fn, id) \  	static int __init __machine_initcall_##mach##_##fn(void) { \  		if (machine_is(mach)) return fn(); \  		return 0; \  	} \ -	__define_initcall(level,__machine_initcall_##mach##_##fn,id); - -#define machine_core_initcall(mach,fn)		__define_machine_initcall(mach,"1",fn,1) -#define machine_core_initcall_sync(mach,fn)	__define_machine_initcall(mach,"1s",fn,1s) -#define machine_postcore_initcall(mach,fn)	__define_machine_initcall(mach,"2",fn,2) -#define machine_postcore_initcall_sync(mach,fn)	__define_machine_initcall(mach,"2s",fn,2s) -#define machine_arch_initcall(mach,fn)		__define_machine_initcall(mach,"3",fn,3) -#define machine_arch_initcall_sync(mach,fn)	__define_machine_initcall(mach,"3s",fn,3s) -#define machine_subsys_initcall(mach,fn)	__define_machine_initcall(mach,"4",fn,4) -#define machine_subsys_initcall_sync(mach,fn)	__define_machine_initcall(mach,"4s",fn,4s) -#define machine_fs_initcall(mach,fn)		__define_machine_initcall(mach,"5",fn,5) -#define machine_fs_initcall_sync(mach,fn)	__define_machine_initcall(mach,"5s",fn,5s) -#define machine_rootfs_initcall(mach,fn)	__define_machine_initcall(mach,"rootfs",fn,rootfs) -#define machine_device_initcall(mach,fn)	__define_machine_initcall(mach,"6",fn,6) -#define machine_device_initcall_sync(mach,fn)	__define_machine_initcall(mach,"6s",fn,6s) -#define machine_late_initcall(mach,fn)		__define_machine_initcall(mach,"7",fn,7) -#define machine_late_initcall_sync(mach,fn)	__define_machine_initcall(mach,"7s",fn,7s) +	__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)  #endif /* __KERNEL__ */  #endif /* _ASM_POWERPC_MACHDEP_H */  | 
