diff options
31 files changed, 160 insertions, 65 deletions
diff --git a/arch/powerpc/configs/44x/warp_defconfig b/arch/powerpc/configs/44x/warp_defconfig index 6cf9d661480..abf74dc1f79 100644 --- a/arch/powerpc/configs/44x/warp_defconfig +++ b/arch/powerpc/configs/44x/warp_defconfig @@ -47,6 +47,7 @@ CONFIG_MTD_NAND_NDFC=y  CONFIG_MTD_UBI=y  CONFIG_PROC_DEVICETREE=y  CONFIG_BLK_DEV_RAM=y +CONFIG_MISC_DEVICES=y  CONFIG_EEPROM_AT24=y  CONFIG_SCSI=y  CONFIG_BLK_DEV_SD=y diff --git a/arch/powerpc/configs/52xx/motionpro_defconfig b/arch/powerpc/configs/52xx/motionpro_defconfig index 6828eda02bd..0c7de9620ea 100644 --- a/arch/powerpc/configs/52xx/motionpro_defconfig +++ b/arch/powerpc/configs/52xx/motionpro_defconfig @@ -43,6 +43,7 @@ CONFIG_PROC_DEVICETREE=y  CONFIG_BLK_DEV_LOOP=y  CONFIG_BLK_DEV_RAM=y  CONFIG_BLK_DEV_RAM_SIZE=32768 +CONFIG_MISC_DEVICES=y  CONFIG_EEPROM_LEGACY=y  CONFIG_SCSI_TGT=y  CONFIG_BLK_DEV_SD=y diff --git a/arch/powerpc/configs/86xx/gef_ppc9a_defconfig b/arch/powerpc/configs/86xx/gef_ppc9a_defconfig index 4b2441244ea..d41857a5152 100644 --- a/arch/powerpc/configs/86xx/gef_ppc9a_defconfig +++ b/arch/powerpc/configs/86xx/gef_ppc9a_defconfig @@ -85,6 +85,7 @@ CONFIG_BLK_DEV_CRYPTOLOOP=m  CONFIG_BLK_DEV_NBD=m  CONFIG_BLK_DEV_RAM=y  CONFIG_BLK_DEV_RAM_SIZE=131072 +CONFIG_MISC_DEVICES=y  CONFIG_DS1682=y  CONFIG_IDE=y  CONFIG_BLK_DEV_IDECS=y diff --git a/arch/powerpc/configs/86xx/gef_sbc310_defconfig b/arch/powerpc/configs/86xx/gef_sbc310_defconfig index a360ba44b92..38303ec11bc 100644 --- a/arch/powerpc/configs/86xx/gef_sbc310_defconfig +++ b/arch/powerpc/configs/86xx/gef_sbc310_defconfig @@ -85,6 +85,7 @@ CONFIG_BLK_DEV_CRYPTOLOOP=m  CONFIG_BLK_DEV_NBD=m  CONFIG_BLK_DEV_RAM=y  CONFIG_BLK_DEV_RAM_SIZE=131072 +CONFIG_MISC_DEVICES=y  CONFIG_DS1682=y  CONFIG_IDE=y  CONFIG_BLK_DEV_IDECS=y diff --git a/arch/powerpc/configs/86xx/gef_sbc610_defconfig b/arch/powerpc/configs/86xx/gef_sbc610_defconfig index be2829dd129..98533973d20 100644 --- a/arch/powerpc/configs/86xx/gef_sbc610_defconfig +++ b/arch/powerpc/configs/86xx/gef_sbc610_defconfig @@ -138,6 +138,7 @@ CONFIG_BLK_DEV_CRYPTOLOOP=m  CONFIG_BLK_DEV_NBD=m  CONFIG_BLK_DEV_RAM=y  CONFIG_BLK_DEV_RAM_SIZE=131072 +CONFIG_MISC_DEVICES=y  CONFIG_DS1682=y  CONFIG_BLK_DEV_SD=y  CONFIG_CHR_DEV_ST=y diff --git a/arch/powerpc/configs/86xx/mpc8641_hpcn_defconfig b/arch/powerpc/configs/86xx/mpc8641_hpcn_defconfig index 0c9c7ed7ec7..b614508d6fd 100644 --- a/arch/powerpc/configs/86xx/mpc8641_hpcn_defconfig +++ b/arch/powerpc/configs/86xx/mpc8641_hpcn_defconfig @@ -63,6 +63,7 @@ CONFIG_BLK_DEV_LOOP=y  CONFIG_BLK_DEV_NBD=y  CONFIG_BLK_DEV_RAM=y  CONFIG_BLK_DEV_RAM_SIZE=131072 +CONFIG_MISC_DEVICES=y  CONFIG_EEPROM_LEGACY=y  CONFIG_BLK_DEV_SD=y  CONFIG_CHR_DEV_ST=y diff --git a/arch/powerpc/configs/e55xx_smp_defconfig b/arch/powerpc/configs/e55xx_smp_defconfig index 06f95492afc..9fa1613e5e2 100644 --- a/arch/powerpc/configs/e55xx_smp_defconfig +++ b/arch/powerpc/configs/e55xx_smp_defconfig @@ -32,6 +32,7 @@ CONFIG_PROC_DEVICETREE=y  CONFIG_BLK_DEV_LOOP=y  CONFIG_BLK_DEV_RAM=y  CONFIG_BLK_DEV_RAM_SIZE=131072 +CONFIG_MISC_DEVICES=y  CONFIG_EEPROM_LEGACY=y  CONFIG_INPUT_FF_MEMLESS=m  # CONFIG_INPUT_MOUSEDEV is not set diff --git a/arch/powerpc/configs/linkstation_defconfig b/arch/powerpc/configs/linkstation_defconfig index f39d0cf876d..8a874b99986 100644 --- a/arch/powerpc/configs/linkstation_defconfig +++ b/arch/powerpc/configs/linkstation_defconfig @@ -78,6 +78,7 @@ CONFIG_BLK_DEV_LOOP=y  CONFIG_BLK_DEV_RAM=y  CONFIG_BLK_DEV_RAM_COUNT=2  CONFIG_BLK_DEV_RAM_SIZE=8192 +CONFIG_MISC_DEVICES=y  CONFIG_EEPROM_LEGACY=m  CONFIG_BLK_DEV_SD=y  CONFIG_CHR_DEV_SG=y diff --git a/arch/powerpc/configs/mpc512x_defconfig b/arch/powerpc/configs/mpc512x_defconfig index 62db8a3df16..c02bbb2fddf 100644 --- a/arch/powerpc/configs/mpc512x_defconfig +++ b/arch/powerpc/configs/mpc512x_defconfig @@ -61,6 +61,7 @@ CONFIG_BLK_DEV_RAM=y  CONFIG_BLK_DEV_RAM_COUNT=1  CONFIG_BLK_DEV_RAM_SIZE=8192  CONFIG_BLK_DEV_XIP=y +CONFIG_MISC_DEVICES=y  CONFIG_EEPROM_AT24=y  CONFIG_SCSI=y  # CONFIG_SCSI_PROC_FS is not set diff --git a/arch/powerpc/configs/mpc5200_defconfig b/arch/powerpc/configs/mpc5200_defconfig index 7376e27b8ed..e63f537b854 100644 --- a/arch/powerpc/configs/mpc5200_defconfig +++ b/arch/powerpc/configs/mpc5200_defconfig @@ -52,6 +52,7 @@ CONFIG_PROC_DEVICETREE=y  CONFIG_BLK_DEV_LOOP=y  CONFIG_BLK_DEV_RAM=y  CONFIG_BLK_DEV_RAM_SIZE=32768 +CONFIG_MISC_DEVICES=y  CONFIG_EEPROM_AT24=y  CONFIG_SCSI_TGT=y  CONFIG_BLK_DEV_SD=y diff --git a/arch/powerpc/configs/mpc85xx_defconfig b/arch/powerpc/configs/mpc85xx_defconfig index 99a19d1e9bf..c06a86c3309 100644 --- a/arch/powerpc/configs/mpc85xx_defconfig +++ b/arch/powerpc/configs/mpc85xx_defconfig @@ -82,6 +82,7 @@ CONFIG_BLK_DEV_LOOP=y  CONFIG_BLK_DEV_NBD=y  CONFIG_BLK_DEV_RAM=y  CONFIG_BLK_DEV_RAM_SIZE=131072 +CONFIG_MISC_DEVICES=y  CONFIG_EEPROM_LEGACY=y  CONFIG_BLK_DEV_SD=y  CONFIG_CHR_DEV_ST=y diff --git a/arch/powerpc/configs/mpc85xx_smp_defconfig b/arch/powerpc/configs/mpc85xx_smp_defconfig index c636f23f8c9..942ced90557 100644 --- a/arch/powerpc/configs/mpc85xx_smp_defconfig +++ b/arch/powerpc/configs/mpc85xx_smp_defconfig @@ -84,6 +84,7 @@ CONFIG_BLK_DEV_LOOP=y  CONFIG_BLK_DEV_NBD=y  CONFIG_BLK_DEV_RAM=y  CONFIG_BLK_DEV_RAM_SIZE=131072 +CONFIG_MISC_DEVICES=y  CONFIG_EEPROM_LEGACY=y  CONFIG_BLK_DEV_SD=y  CONFIG_CHR_DEV_ST=y diff --git a/arch/powerpc/configs/mpc86xx_defconfig b/arch/powerpc/configs/mpc86xx_defconfig index 55b54318fef..038a308cbfc 100644 --- a/arch/powerpc/configs/mpc86xx_defconfig +++ b/arch/powerpc/configs/mpc86xx_defconfig @@ -66,6 +66,7 @@ CONFIG_BLK_DEV_LOOP=y  CONFIG_BLK_DEV_NBD=y  CONFIG_BLK_DEV_RAM=y  CONFIG_BLK_DEV_RAM_SIZE=131072 +CONFIG_MISC_DEVICES=y  CONFIG_EEPROM_LEGACY=y  CONFIG_BLK_DEV_SD=y  CONFIG_CHR_DEV_ST=y diff --git a/arch/powerpc/configs/pasemi_defconfig b/arch/powerpc/configs/pasemi_defconfig index edd2d54c819..f4deb0b78cf 100644 --- a/arch/powerpc/configs/pasemi_defconfig +++ b/arch/powerpc/configs/pasemi_defconfig @@ -59,6 +59,7 @@ CONFIG_PROC_DEVICETREE=y  CONFIG_BLK_DEV_LOOP=y  CONFIG_BLK_DEV_RAM=y  CONFIG_BLK_DEV_RAM_SIZE=16384 +CONFIG_MISC_DEVICES=y  CONFIG_EEPROM_LEGACY=y  CONFIG_IDE=y  CONFIG_BLK_DEV_IDECD=y diff --git a/arch/powerpc/configs/ppc6xx_defconfig b/arch/powerpc/configs/ppc6xx_defconfig index 9d64a6822d8..0a10fb009ef 100644 --- a/arch/powerpc/configs/ppc6xx_defconfig +++ b/arch/powerpc/configs/ppc6xx_defconfig @@ -398,6 +398,7 @@ CONFIG_BLK_DEV_RAM_SIZE=16384  CONFIG_CDROM_PKTCDVD=m  CONFIG_VIRTIO_BLK=m  CONFIG_BLK_DEV_HD=y +CONFIG_MISC_DEVICES=y  CONFIG_ENCLOSURE_SERVICES=m  CONFIG_SENSORS_TSL2550=m  CONFIG_EEPROM_AT24=m diff --git a/arch/powerpc/configs/pseries_defconfig b/arch/powerpc/configs/pseries_defconfig index 9c3f22c6cde..249ddd0a27c 100644 --- a/arch/powerpc/configs/pseries_defconfig +++ b/arch/powerpc/configs/pseries_defconfig @@ -189,6 +189,7 @@ CONFIG_TIGON3=y  CONFIG_BNX2=m  CONFIG_CHELSIO_T1=m  CONFIG_CHELSIO_T3=m +CONFIG_CHELSIO_T4=m  CONFIG_EHEA=y  CONFIG_IXGBE=m  CONFIG_IXGB=m @@ -255,6 +256,8 @@ CONFIG_INFINIBAND_USER_MAD=m  CONFIG_INFINIBAND_USER_ACCESS=m  CONFIG_INFINIBAND_MTHCA=m  CONFIG_INFINIBAND_EHCA=m +CONFIG_INFINIBAND_CXGB3=m +CONFIG_INFINIBAND_CXGB4=m  CONFIG_MLX4_INFINIBAND=m  CONFIG_INFINIBAND_IPOIB=m  CONFIG_INFINIBAND_IPOIB_CM=y diff --git a/arch/powerpc/include/asm/dma-mapping.h b/arch/powerpc/include/asm/dma-mapping.h index 6d2416a8570..dd70fac57ec 100644 --- a/arch/powerpc/include/asm/dma-mapping.h +++ b/arch/powerpc/include/asm/dma-mapping.h @@ -42,6 +42,7 @@ extern void __dma_free_coherent(size_t size, void *vaddr);  extern void __dma_sync(void *vaddr, size_t size, int direction);  extern void __dma_sync_page(struct page *page, unsigned long offset,  				 size_t size, int direction); +extern unsigned long __dma_get_coherent_pfn(unsigned long cpu_addr);  #else /* ! CONFIG_NOT_COHERENT_CACHE */  /* @@ -198,6 +199,11 @@ static inline phys_addr_t dma_to_phys(struct device *dev, dma_addr_t daddr)  #define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f)  #define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h) +extern int dma_mmap_coherent(struct device *, struct vm_area_struct *, +			     void *, dma_addr_t, size_t); +#define ARCH_HAS_DMA_MMAP_COHERENT + +  static inline void dma_cache_sync(struct device *dev, void *vaddr, size_t size,  		enum dma_data_direction direction)  { diff --git a/arch/powerpc/include/asm/mmu-hash64.h b/arch/powerpc/include/asm/mmu-hash64.h index acac35d5b38..ae7b3efec8e 100644 --- a/arch/powerpc/include/asm/mmu-hash64.h +++ b/arch/powerpc/include/asm/mmu-hash64.h @@ -27,7 +27,7 @@  #define STE_VSID_SHIFT	12  /* Location of cpu0's segment table */ -#define STAB0_PAGE	0x6 +#define STAB0_PAGE	0x8  #define STAB0_OFFSET	(STAB0_PAGE << 12)  #define STAB0_PHYS_ADDR	(STAB0_OFFSET + PHYSICAL_START) diff --git a/arch/powerpc/include/asm/page.h b/arch/powerpc/include/asm/page.h index da4b2000854..2cd664ef0a5 100644 --- a/arch/powerpc/include/asm/page.h +++ b/arch/powerpc/include/asm/page.h @@ -100,7 +100,7 @@ extern phys_addr_t kernstart_addr;  #endif  #ifdef CONFIG_FLATMEM -#define ARCH_PFN_OFFSET		(MEMORY_START >> PAGE_SHIFT) +#define ARCH_PFN_OFFSET		((unsigned long)(MEMORY_START >> PAGE_SHIFT))  #define pfn_valid(pfn)		((pfn) >= ARCH_PFN_OFFSET && (pfn) < max_mapnr)  #endif diff --git a/arch/powerpc/include/asm/qe_ic.h b/arch/powerpc/include/asm/qe_ic.h index 9e2cb201916..5f53dba81ea 100644 --- a/arch/powerpc/include/asm/qe_ic.h +++ b/arch/powerpc/include/asm/qe_ic.h @@ -81,7 +81,7 @@ int qe_ic_set_high_priority(unsigned int virq, unsigned int priority, int high);  static inline void qe_ic_cascade_low_ipic(unsigned int irq,  					  struct irq_desc *desc)  { -	struct qe_ic *qe_ic = get_irq_desc_data(desc); +	struct qe_ic *qe_ic = irq_desc_get_chip_data(desc);  	unsigned int cascade_irq = qe_ic_get_low_irq(qe_ic);  	if (cascade_irq != NO_IRQ) @@ -91,7 +91,7 @@ static inline void qe_ic_cascade_low_ipic(unsigned int irq,  static inline void qe_ic_cascade_high_ipic(unsigned int irq,  					   struct irq_desc *desc)  { -	struct qe_ic *qe_ic = get_irq_desc_data(desc); +	struct qe_ic *qe_ic = irq_desc_get_chip_data(desc);  	unsigned int cascade_irq = qe_ic_get_high_irq(qe_ic);  	if (cascade_irq != NO_IRQ) @@ -101,9 +101,9 @@ static inline void qe_ic_cascade_high_ipic(unsigned int irq,  static inline void qe_ic_cascade_low_mpic(unsigned int irq,  					  struct irq_desc *desc)  { -	struct qe_ic *qe_ic = get_irq_desc_data(desc); +	struct qe_ic *qe_ic = irq_desc_get_chip_data(desc);  	unsigned int cascade_irq = qe_ic_get_low_irq(qe_ic); -	struct irq_chip *chip = get_irq_desc_chip(desc); +	struct irq_chip *chip = irq_desc_get_chip(desc);  	if (cascade_irq != NO_IRQ)  		generic_handle_irq(cascade_irq); @@ -114,9 +114,9 @@ static inline void qe_ic_cascade_low_mpic(unsigned int irq,  static inline void qe_ic_cascade_high_mpic(unsigned int irq,  					   struct irq_desc *desc)  { -	struct qe_ic *qe_ic = get_irq_desc_data(desc); +	struct qe_ic *qe_ic = irq_desc_get_chip_data(desc);  	unsigned int cascade_irq = qe_ic_get_high_irq(qe_ic); -	struct irq_chip *chip = get_irq_desc_chip(desc); +	struct irq_chip *chip = irq_desc_get_chip(desc);  	if (cascade_irq != NO_IRQ)  		generic_handle_irq(cascade_irq); @@ -127,9 +127,9 @@ static inline void qe_ic_cascade_high_mpic(unsigned int irq,  static inline void qe_ic_cascade_muxed_mpic(unsigned int irq,  					    struct irq_desc *desc)  { -	struct qe_ic *qe_ic = get_irq_desc_data(desc); +	struct qe_ic *qe_ic = irq_desc_get_chip_data(desc);  	unsigned int cascade_irq; -	struct irq_chip *chip = get_irq_desc_chip(desc); +	struct irq_chip *chip = irq_desc_get_chip(desc);  	cascade_irq = qe_ic_get_high_irq(qe_ic);  	if (cascade_irq == NO_IRQ) diff --git a/arch/powerpc/include/asm/reg_booke.h b/arch/powerpc/include/asm/reg_booke.h index 86ad8128963..3b1a9b70736 100644 --- a/arch/powerpc/include/asm/reg_booke.h +++ b/arch/powerpc/include/asm/reg_booke.h @@ -110,7 +110,7 @@  #define SPRN_MAS2	0x272	/* MMU Assist Register 2 */  #define SPRN_MAS3	0x273	/* MMU Assist Register 3 */  #define SPRN_MAS4	0x274	/* MMU Assist Register 4 */ -#define SPRN_MAS5	0x275	/* MMU Assist Register 5 */ +#define SPRN_MAS5	0x153	/* MMU Assist Register 5 */  #define SPRN_MAS6	0x276	/* MMU Assist Register 6 */  #define SPRN_PID1	0x279	/* Process ID Register 1 */  #define SPRN_PID2	0x27A	/* Process ID Register 2 */ diff --git a/arch/powerpc/include/asm/systbl.h b/arch/powerpc/include/asm/systbl.h index aa0f1ebb4aa..60f64b132bd 100644 --- a/arch/powerpc/include/asm/systbl.h +++ b/arch/powerpc/include/asm/systbl.h @@ -348,3 +348,7 @@ COMPAT_SYS_SPU(sendmsg)  COMPAT_SYS_SPU(recvmsg)  COMPAT_SYS_SPU(recvmmsg)  SYSCALL_SPU(accept4) +SYSCALL_SPU(name_to_handle_at) +COMPAT_SYS_SPU(open_by_handle_at) +COMPAT_SYS_SPU(clock_adjtime) +SYSCALL_SPU(syncfs) diff --git a/arch/powerpc/include/asm/unistd.h b/arch/powerpc/include/asm/unistd.h index 6151937657f..3c215648ce6 100644 --- a/arch/powerpc/include/asm/unistd.h +++ b/arch/powerpc/include/asm/unistd.h @@ -367,10 +367,14 @@  #define __NR_recvmsg		342  #define __NR_recvmmsg		343  #define __NR_accept4		344 +#define __NR_name_to_handle_at	345 +#define __NR_open_by_handle_at	346 +#define __NR_clock_adjtime	347 +#define __NR_syncfs		348  #ifdef __KERNEL__ -#define __NR_syscalls		345 +#define __NR_syscalls		349  #define __NR__exit __NR_exit  #define NR_syscalls	__NR_syscalls diff --git a/arch/powerpc/kernel/dma.c b/arch/powerpc/kernel/dma.c index cf02cad62d9..d238c082c3c 100644 --- a/arch/powerpc/kernel/dma.c +++ b/arch/powerpc/kernel/dma.c @@ -179,3 +179,21 @@ static int __init dma_init(void)         return 0;  }  fs_initcall(dma_init); + +int dma_mmap_coherent(struct device *dev, struct vm_area_struct *vma, +		      void *cpu_addr, dma_addr_t handle, size_t size) +{ +	unsigned long pfn; + +#ifdef CONFIG_NOT_COHERENT_CACHE +	vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); +	pfn = __dma_get_coherent_pfn((unsigned long)cpu_addr); +#else +	pfn = page_to_pfn(virt_to_page(cpu_addr)); +#endif +	return remap_pfn_range(vma, vma->vm_start, +			       pfn + vma->vm_pgoff, +			       vma->vm_end - vma->vm_start, +			       vma->vm_page_prot); +} +EXPORT_SYMBOL_GPL(dma_mmap_coherent); diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S index 8a817995b4c..c532cb2c927 100644 --- a/arch/powerpc/kernel/exceptions-64s.S +++ b/arch/powerpc/kernel/exceptions-64s.S @@ -977,20 +977,6 @@ _GLOBAL(do_stab_bolted)  	rfid  	b	.	/* prevent speculative execution */ -/* - * Space for CPU0's segment table. - * - * On iSeries, the hypervisor must fill in at least one entry before - * we get control (with relocate on).  The address is given to the hv - * as a page number (see xLparMap below), so this must be at a - * fixed address (the linker can't compute (u64)&initial_stab >> - * PAGE_SHIFT). - */ -	. = STAB0_OFFSET	/* 0x6000 */ -	.globl initial_stab -initial_stab: -	.space	4096 -  #ifdef CONFIG_PPC_PSERIES  /*   * Data area reserved for FWNMI option. @@ -1027,3 +1013,17 @@ xLparMap:  #ifdef CONFIG_PPC_PSERIES          . = 0x8000  #endif /* CONFIG_PPC_PSERIES */ + +/* + * Space for CPU0's segment table. + * + * On iSeries, the hypervisor must fill in at least one entry before + * we get control (with relocate on).  The address is given to the hv + * as a page number (see xLparMap above), so this must be at a + * fixed address (the linker can't compute (u64)&initial_stab >> + * PAGE_SHIFT). + */ +	. = STAB0_OFFSET	/* 0x8000 */ +	.globl initial_stab +initial_stab: +	.space	4096 diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c index 09d31dbf43f..aa9269600ca 100644 --- a/arch/powerpc/kernel/time.c +++ b/arch/powerpc/kernel/time.c @@ -356,7 +356,7 @@ void account_system_vtime(struct task_struct *tsk)  	}  	get_paca()->user_time_scaled += user_scaled; -	if (in_irq() || idle_task(smp_processor_id()) != tsk) { +	if (in_interrupt() || idle_task(smp_processor_id()) != tsk) {  		account_system_time(tsk, 0, delta, sys_scaled);  		if (stolen)  			account_steal_time(stolen); diff --git a/arch/powerpc/mm/dma-noncoherent.c b/arch/powerpc/mm/dma-noncoherent.c index 757c0bed9a9..b42f76c4948 100644 --- a/arch/powerpc/mm/dma-noncoherent.c +++ b/arch/powerpc/mm/dma-noncoherent.c @@ -399,3 +399,23 @@ void __dma_sync_page(struct page *page, unsigned long offset,  #endif  }  EXPORT_SYMBOL(__dma_sync_page); + +/* + * Return the PFN for a given cpu virtual address returned by + * __dma_alloc_coherent. This is used by dma_mmap_coherent() + */ +unsigned long __dma_get_coherent_pfn(unsigned long cpu_addr) +{ +	/* This should always be populated, so we don't test every +	 * level. If that fails, we'll have a nice crash which +	 * will be as good as a BUG_ON() +	 */ +	pgd_t *pgd = pgd_offset_k(cpu_addr); +	pud_t *pud = pud_offset(pgd, cpu_addr); +	pmd_t *pmd = pmd_offset(pud, cpu_addr); +	pte_t *ptep = pte_offset_kernel(pmd, cpu_addr); + +	if (pte_none(*ptep) || !pte_present(*ptep)) +		return 0; +	return pte_pfn(*ptep); +} diff --git a/arch/powerpc/platforms/pseries/nvram.c b/arch/powerpc/platforms/pseries/nvram.c index 419707b0724..00cc3a09488 100644 --- a/arch/powerpc/platforms/pseries/nvram.c +++ b/arch/powerpc/platforms/pseries/nvram.c @@ -480,8 +480,32 @@ static void oops_to_nvram(struct kmsg_dumper *dumper,  		const char *new_msgs, unsigned long new_len)  {  	static unsigned int oops_count = 0; +	static bool panicking = false;  	size_t text_len; +	switch (reason) { +	case KMSG_DUMP_RESTART: +	case KMSG_DUMP_HALT: +	case KMSG_DUMP_POWEROFF: +		/* These are almost always orderly shutdowns. */ +		return; +	case KMSG_DUMP_OOPS: +	case KMSG_DUMP_KEXEC: +		break; +	case KMSG_DUMP_PANIC: +		panicking = true; +		break; +	case KMSG_DUMP_EMERG: +		if (panicking) +			/* Panic report already captured. */ +			return; +		break; +	default: +		pr_err("%s: ignoring unrecognized KMSG_DUMP_* reason %d\n", +						__FUNCTION__, (int) reason); +		return; +	} +  	if (clobbering_unread_rtas_event())  		return; diff --git a/arch/powerpc/platforms/pseries/smp.c b/arch/powerpc/platforms/pseries/smp.c index 0317cce877c..d6479f9738f 100644 --- a/arch/powerpc/platforms/pseries/smp.c +++ b/arch/powerpc/platforms/pseries/smp.c @@ -64,8 +64,8 @@ int smp_query_cpu_stopped(unsigned int pcpu)  	int qcss_tok = rtas_token("query-cpu-stopped-state");  	if (qcss_tok == RTAS_UNKNOWN_SERVICE) { -		printk(KERN_INFO "Firmware doesn't support " -				"query-cpu-stopped-state\n"); +		printk_once(KERN_INFO +			"Firmware doesn't support query-cpu-stopped-state\n");  		return QCSS_HARDWARE_ERROR;  	} diff --git a/arch/powerpc/platforms/pseries/xics.c b/arch/powerpc/platforms/pseries/xics.c index 6c1e638f0ce..ec8fe22047b 100644 --- a/arch/powerpc/platforms/pseries/xics.c +++ b/arch/powerpc/platforms/pseries/xics.c @@ -204,33 +204,33 @@ static int get_irq_server(unsigned int virq, const struct cpumask *cpumask,  static void xics_unmask_irq(struct irq_data *d)  { -	unsigned int irq; +	unsigned int hwirq;  	int call_status;  	int server;  	pr_devel("xics: unmask virq %d\n", d->irq); -	irq = (unsigned int)irq_map[d->irq].hwirq; -	pr_devel(" -> map to hwirq 0x%x\n", irq); -	if (irq == XICS_IPI || irq == XICS_IRQ_SPURIOUS) +	hwirq = (unsigned int)irq_map[d->irq].hwirq; +	pr_devel(" -> map to hwirq 0x%x\n", hwirq); +	if (hwirq == XICS_IPI || hwirq == XICS_IRQ_SPURIOUS)  		return;  	server = get_irq_server(d->irq, d->affinity, 0); -	call_status = rtas_call(ibm_set_xive, 3, 1, NULL, irq, server, +	call_status = rtas_call(ibm_set_xive, 3, 1, NULL, hwirq, server,  				DEFAULT_PRIORITY);  	if (call_status != 0) {  		printk(KERN_ERR  			"%s: ibm_set_xive irq %u server %x returned %d\n", -			__func__, irq, server, call_status); +			__func__, hwirq, server, call_status);  		return;  	}  	/* Now unmask the interrupt (often a no-op) */ -	call_status = rtas_call(ibm_int_on, 1, 1, NULL, irq); +	call_status = rtas_call(ibm_int_on, 1, 1, NULL, hwirq);  	if (call_status != 0) {  		printk(KERN_ERR "%s: ibm_int_on irq=%u returned %d\n", -			__func__, irq, call_status); +			__func__, hwirq, call_status);  		return;  	}  } @@ -250,46 +250,46 @@ static unsigned int xics_startup(struct irq_data *d)  	return 0;  } -static void xics_mask_real_irq(struct irq_data *d) +static void xics_mask_real_irq(unsigned int hwirq)  {  	int call_status; -	if (d->irq == XICS_IPI) +	if (hwirq == XICS_IPI)  		return; -	call_status = rtas_call(ibm_int_off, 1, 1, NULL, d->irq); +	call_status = rtas_call(ibm_int_off, 1, 1, NULL, hwirq);  	if (call_status != 0) {  		printk(KERN_ERR "%s: ibm_int_off irq=%u returned %d\n", -			__func__, d->irq, call_status); +			__func__, hwirq, call_status);  		return;  	}  	/* Have to set XIVE to 0xff to be able to remove a slot */ -	call_status = rtas_call(ibm_set_xive, 3, 1, NULL, d->irq, +	call_status = rtas_call(ibm_set_xive, 3, 1, NULL, hwirq,  				default_server, 0xff);  	if (call_status != 0) {  		printk(KERN_ERR "%s: ibm_set_xive(0xff) irq=%u returned %d\n", -			__func__, d->irq, call_status); +			__func__, hwirq, call_status);  		return;  	}  }  static void xics_mask_irq(struct irq_data *d)  { -	unsigned int irq; +	unsigned int hwirq;  	pr_devel("xics: mask virq %d\n", d->irq); -	irq = (unsigned int)irq_map[d->irq].hwirq; -	if (irq == XICS_IPI || irq == XICS_IRQ_SPURIOUS) +	hwirq = (unsigned int)irq_map[d->irq].hwirq; +	if (hwirq == XICS_IPI || hwirq == XICS_IRQ_SPURIOUS)  		return; -	xics_mask_real_irq(d); +	xics_mask_real_irq(hwirq);  }  static void xics_mask_unknown_vec(unsigned int vec)  {  	printk(KERN_ERR "Interrupt %u (real) is invalid, disabling it.\n", vec); -	xics_mask_real_irq(irq_get_irq_data(vec)); +	xics_mask_real_irq(vec);  }  static inline unsigned int xics_xirr_vector(unsigned int xirr) @@ -373,37 +373,37 @@ static unsigned char pop_cppr(void)  static void xics_eoi_direct(struct irq_data *d)  { -	unsigned int irq = (unsigned int)irq_map[d->irq].hwirq; +	unsigned int hwirq = (unsigned int)irq_map[d->irq].hwirq;  	iosync(); -	direct_xirr_info_set((pop_cppr() << 24) | irq); +	direct_xirr_info_set((pop_cppr() << 24) | hwirq);  }  static void xics_eoi_lpar(struct irq_data *d)  { -	unsigned int irq = (unsigned int)irq_map[d->irq].hwirq; +	unsigned int hwirq = (unsigned int)irq_map[d->irq].hwirq;  	iosync(); -	lpar_xirr_info_set((pop_cppr() << 24) | irq); +	lpar_xirr_info_set((pop_cppr() << 24) | hwirq);  }  static int  xics_set_affinity(struct irq_data *d, const struct cpumask *cpumask, bool force)  { -	unsigned int irq; +	unsigned int hwirq;  	int status;  	int xics_status[2];  	int irq_server; -	irq = (unsigned int)irq_map[d->irq].hwirq; -	if (irq == XICS_IPI || irq == XICS_IRQ_SPURIOUS) +	hwirq = (unsigned int)irq_map[d->irq].hwirq; +	if (hwirq == XICS_IPI || hwirq == XICS_IRQ_SPURIOUS)  		return -1; -	status = rtas_call(ibm_get_xive, 1, 3, xics_status, irq); +	status = rtas_call(ibm_get_xive, 1, 3, xics_status, hwirq);  	if (status) {  		printk(KERN_ERR "%s: ibm,get-xive irq=%u returns %d\n", -			__func__, irq, status); +			__func__, hwirq, status);  		return -1;  	} @@ -418,11 +418,11 @@ xics_set_affinity(struct irq_data *d, const struct cpumask *cpumask, bool force)  	}  	status = rtas_call(ibm_set_xive, 3, 1, NULL, -				irq, irq_server, xics_status[1]); +				hwirq, irq_server, xics_status[1]);  	if (status) {  		printk(KERN_ERR "%s: ibm,set-xive irq=%u returns %d\n", -			__func__, irq, status); +			__func__, hwirq, status);  		return -1;  	} @@ -874,7 +874,7 @@ void xics_kexec_teardown_cpu(int secondary)  void xics_migrate_irqs_away(void)  {  	int cpu = smp_processor_id(), hw_cpu = hard_smp_processor_id(); -	unsigned int irq, virq; +	int virq;  	/* If we used to be the default server, move to the new "boot_cpuid" */  	if (hw_cpu == default_server) @@ -892,6 +892,7 @@ void xics_migrate_irqs_away(void)  	for_each_irq(virq) {  		struct irq_desc *desc;  		struct irq_chip *chip; +		unsigned int hwirq;  		int xics_status[2];  		int status;  		unsigned long flags; @@ -901,9 +902,9 @@ void xics_migrate_irqs_away(void)  			continue;  		if (irq_map[virq].host != xics_host)  			continue; -		irq = (unsigned int)irq_map[virq].hwirq; +		hwirq = (unsigned int)irq_map[virq].hwirq;  		/* We need to get IPIs still. */ -		if (irq == XICS_IPI || irq == XICS_IRQ_SPURIOUS) +		if (hwirq == XICS_IPI || hwirq == XICS_IRQ_SPURIOUS)  			continue;  		desc = irq_to_desc(virq); @@ -918,10 +919,10 @@ void xics_migrate_irqs_away(void)  		raw_spin_lock_irqsave(&desc->lock, flags); -		status = rtas_call(ibm_get_xive, 1, 3, xics_status, irq); +		status = rtas_call(ibm_get_xive, 1, 3, xics_status, hwirq);  		if (status) {  			printk(KERN_ERR "%s: ibm,get-xive irq=%u returns %d\n", -					__func__, irq, status); +					__func__, hwirq, status);  			goto unlock;  		} diff --git a/arch/powerpc/sysdev/mpc8xx_pic.c b/arch/powerpc/sysdev/mpc8xx_pic.c index f550e23632f..a88800ff4d0 100644 --- a/arch/powerpc/sysdev/mpc8xx_pic.c +++ b/arch/powerpc/sysdev/mpc8xx_pic.c @@ -80,7 +80,7 @@ static int mpc8xx_set_irq_type(struct irq_data *d, unsigned int flow_type)  		if ((hw & 1) == 0) {  			siel |= (0x80000000 >> hw);  			out_be32(&siu_reg->sc_siel, siel); -			__irq_set_handler_locked(irq, handle_edge_irq); +			__irq_set_handler_locked(d->irq, handle_edge_irq);  		}  	}  	return 0;  |