diff options
Diffstat (limited to 'arch')
616 files changed, 6609 insertions, 4136 deletions
diff --git a/arch/Kconfig b/arch/Kconfig index 7f8f281f258..97fb7d0365d 100644 --- a/arch/Kconfig +++ b/arch/Kconfig @@ -76,6 +76,15 @@ config OPTPROBES  	depends on KPROBES && HAVE_OPTPROBES  	depends on !PREEMPT +config KPROBES_ON_FTRACE +	def_bool y +	depends on KPROBES && HAVE_KPROBES_ON_FTRACE +	depends on DYNAMIC_FTRACE_WITH_REGS +	help +	 If function tracer is enabled and the arch supports full +	 passing of pt_regs to function tracing, then kprobes can +	 optimize on top of function tracing. +  config UPROBES  	bool "Transparent user-space probes (EXPERIMENTAL)"  	depends on UPROBE_EVENT && PERF_EVENTS @@ -158,6 +167,9 @@ config HAVE_KRETPROBES  config HAVE_OPTPROBES  	bool +config HAVE_KPROBES_ON_FTRACE +	bool +  config HAVE_NMI_WATCHDOG  	bool  # diff --git a/arch/alpha/Kconfig b/arch/alpha/Kconfig index 9d5904cc771..9b504af2e96 100644 --- a/arch/alpha/Kconfig +++ b/arch/alpha/Kconfig @@ -5,7 +5,6 @@ config ALPHA  	select HAVE_IDE  	select HAVE_OPROFILE  	select HAVE_SYSCALL_WRAPPERS -	select HAVE_IRQ_WORK  	select HAVE_PCSPKR_PLATFORM  	select HAVE_PERF_EVENTS  	select HAVE_DMA_ATTRS diff --git a/arch/alpha/include/asm/parport.h b/arch/alpha/include/asm/parport.h index c5ee7cbb2fc..6abd0af11f1 100644 --- a/arch/alpha/include/asm/parport.h +++ b/arch/alpha/include/asm/parport.h @@ -9,8 +9,8 @@  #ifndef _ASM_AXP_PARPORT_H  #define _ASM_AXP_PARPORT_H 1 -static int __devinit parport_pc_find_isa_ports (int autoirq, int autodma); -static int __devinit parport_pc_find_nonpci_ports (int autoirq, int autodma) +static int parport_pc_find_isa_ports (int autoirq, int autodma); +static int parport_pc_find_nonpci_ports (int autoirq, int autodma)  {  	return parport_pc_find_isa_ports (autoirq, autodma);  } diff --git a/arch/alpha/kernel/osf_sys.c b/arch/alpha/kernel/osf_sys.c index 14db93e4c8a..dbc1760f418 100644 --- a/arch/alpha/kernel/osf_sys.c +++ b/arch/alpha/kernel/osf_sys.c @@ -1139,6 +1139,7 @@ struct rusage32 {  SYSCALL_DEFINE2(osf_getrusage, int, who, struct rusage32 __user *, ru)  {  	struct rusage32 r; +	cputime_t utime, stime;  	if (who != RUSAGE_SELF && who != RUSAGE_CHILDREN)  		return -EINVAL; @@ -1146,8 +1147,9 @@ SYSCALL_DEFINE2(osf_getrusage, int, who, struct rusage32 __user *, ru)  	memset(&r, 0, sizeof(r));  	switch (who) {  	case RUSAGE_SELF: -		jiffies_to_timeval32(current->utime, &r.ru_utime); -		jiffies_to_timeval32(current->stime, &r.ru_stime); +		task_cputime(current, &utime, &stime); +		jiffies_to_timeval32(utime, &r.ru_utime); +		jiffies_to_timeval32(stime, &r.ru_stime);  		r.ru_minflt = current->min_flt;  		r.ru_majflt = current->maj_flt;  		break; diff --git a/arch/alpha/kernel/pci.c b/arch/alpha/kernel/pci.c index ef757147cbf..edb4e0097b7 100644 --- a/arch/alpha/kernel/pci.c +++ b/arch/alpha/kernel/pci.c @@ -59,13 +59,13 @@ struct pci_controller *pci_isa_hose;   * Quirks.   */ -static void __devinit quirk_isa_bridge(struct pci_dev *dev) +static void quirk_isa_bridge(struct pci_dev *dev)  {  	dev->class = PCI_CLASS_BRIDGE_ISA << 8;  }  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82378, quirk_isa_bridge); -static void __devinit quirk_cypress(struct pci_dev *dev) +static void quirk_cypress(struct pci_dev *dev)  {  	/* The Notorious Cy82C693 chip.  */ @@ -104,7 +104,7 @@ static void __devinit quirk_cypress(struct pci_dev *dev)  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_CONTAQ, PCI_DEVICE_ID_CONTAQ_82C693, quirk_cypress);  /* Called for each device after PCI setup is done. */ -static void __devinit pcibios_fixup_final(struct pci_dev *dev) +static void pcibios_fixup_final(struct pci_dev *dev)  {  	unsigned int class = dev->class >> 8; @@ -198,8 +198,7 @@ subsys_initcall(pcibios_init);  #ifdef ALPHA_RESTORE_SRM_SETUP  static struct pdev_srm_saved_conf *srm_saved_configs; -void __devinit -pdev_save_srm_config(struct pci_dev *dev) +void pdev_save_srm_config(struct pci_dev *dev)  {  	struct pdev_srm_saved_conf *tmp;  	static int printed = 0; @@ -241,8 +240,7 @@ pci_restore_srm_config(void)  }  #endif -void __devinit -pcibios_fixup_bus(struct pci_bus *bus) +void pcibios_fixup_bus(struct pci_bus *bus)  {  	struct pci_dev *dev = bus->self; diff --git a/arch/alpha/kernel/smp.c b/arch/alpha/kernel/smp.c index a41ad90a97a..9603bc234b4 100644 --- a/arch/alpha/kernel/smp.c +++ b/arch/alpha/kernel/smp.c @@ -68,7 +68,7 @@ enum ipi_message_type {  };  /* Set to a secondary's cpuid when it comes online.  */ -static int smp_secondary_alive __devinitdata = 0; +static int smp_secondary_alive = 0;  int smp_num_probed;		/* Internal processor count */  int smp_num_cpus = 1;		/* Number that came online.  */ @@ -172,7 +172,7 @@ smp_callin(void)  }  /* Wait until hwrpb->txrdy is clear for cpu.  Return -1 on timeout.  */ -static int __devinit +static int  wait_for_txrdy (unsigned long cpumask)  {  	unsigned long timeout; @@ -468,7 +468,7 @@ smp_prepare_cpus(unsigned int max_cpus)  	smp_num_cpus = smp_num_probed;  } -void __devinit +void  smp_prepare_boot_cpu(void)  {  } diff --git a/arch/alpha/kernel/sys_titan.c b/arch/alpha/kernel/sys_titan.c index 2533db280d9..5cf4a481b8c 100644 --- a/arch/alpha/kernel/sys_titan.c +++ b/arch/alpha/kernel/sys_titan.c @@ -303,7 +303,7 @@ titan_late_init(void)  } -static int __devinit +static int  titan_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)  {  	u8 intline; diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index f95ba14ae3d..9bbe760f235 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -36,7 +36,6 @@ config ARM  	select HAVE_GENERIC_HARDIRQS  	select HAVE_HW_BREAKPOINT if (PERF_EVENTS && (CPU_V6 || CPU_V6K || CPU_V7))  	select HAVE_IDE if PCI || ISA || PCMCIA -	select HAVE_IRQ_WORK  	select HAVE_KERNEL_GZIP  	select HAVE_KERNEL_LZMA  	select HAVE_KERNEL_LZO @@ -371,7 +370,6 @@ config ARCH_CNS3XXX  config ARCH_CLPS711X  	bool "Cirrus Logic CLPS711x/EP721x/EP731x-based"  	select ARCH_REQUIRE_GPIOLIB -	select ARCH_USES_GETTIMEOFFSET  	select AUTO_ZRELADDR  	select CLKDEV_LOOKUP  	select COMMON_CLK @@ -1230,6 +1228,7 @@ config ARM_ERRATA_430973  config ARM_ERRATA_458693  	bool "ARM errata: Processor deadlock when a false hazard is created"  	depends on CPU_V7 +	depends on !ARCH_MULTIPLATFORM  	help  	  This option enables the workaround for the 458693 Cortex-A8 (r2p0)  	  erratum. For very specific sequences of memory operations, it is @@ -1243,6 +1242,7 @@ config ARM_ERRATA_458693  config ARM_ERRATA_460075  	bool "ARM errata: Data written to the L2 cache can be overwritten with stale data"  	depends on CPU_V7 +	depends on !ARCH_MULTIPLATFORM  	help  	  This option enables the workaround for the 460075 Cortex-A8 (r2p0)  	  erratum. Any asynchronous access to the L2 cache may encounter a @@ -1255,6 +1255,7 @@ config ARM_ERRATA_460075  config ARM_ERRATA_742230  	bool "ARM errata: DMB operation may be faulty"  	depends on CPU_V7 && SMP +	depends on !ARCH_MULTIPLATFORM  	help  	  This option enables the workaround for the 742230 Cortex-A9  	  (r1p0..r2p2) erratum. Under rare circumstances, a DMB instruction @@ -1267,6 +1268,7 @@ config ARM_ERRATA_742230  config ARM_ERRATA_742231  	bool "ARM errata: Incorrect hazard handling in the SCU may lead to data corruption"  	depends on CPU_V7 && SMP +	depends on !ARCH_MULTIPLATFORM  	help  	  This option enables the workaround for the 742231 Cortex-A9  	  (r2p0..r2p2) erratum. Under certain conditions, specific to the @@ -1317,6 +1319,7 @@ config PL310_ERRATA_727915  config ARM_ERRATA_743622  	bool "ARM errata: Faulty hazard checking in the Store Buffer may lead to data corruption"  	depends on CPU_V7 +	depends on !ARCH_MULTIPLATFORM  	help  	  This option enables the workaround for the 743622 Cortex-A9  	  (r2p*) erratum. Under very rare conditions, a faulty @@ -1330,6 +1333,7 @@ config ARM_ERRATA_743622  config ARM_ERRATA_751472  	bool "ARM errata: Interrupted ICIALLUIS may prevent completion of broadcasted operation"  	depends on CPU_V7 +	depends on !ARCH_MULTIPLATFORM  	help  	  This option enables the workaround for the 751472 Cortex-A9 (prior  	  to r3p0) erratum. An interrupted ICIALLUIS operation may prevent the diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile index e44da40d984..5ebb44fe826 100644 --- a/arch/arm/boot/dts/Makefile +++ b/arch/arm/boot/dts/Makefile @@ -155,6 +155,7 @@ dtb-$(CONFIG_ARCH_VT8500) += vt8500-bv07.dtb \  dtb-$(CONFIG_ARCH_ZYNQ) += zynq-zc702.dtb  targets += dtbs +targets += $(dtb-y)  endif  # *.dtb used to be generated in the directory above. Clean out the diff --git a/arch/arm/boot/dts/armada-370-db.dts b/arch/arm/boot/dts/armada-370-db.dts index 00044026ef1..9b82facb256 100644 --- a/arch/arm/boot/dts/armada-370-db.dts +++ b/arch/arm/boot/dts/armada-370-db.dts @@ -26,7 +26,7 @@  	memory {  		device_type = "memory"; -		reg = <0x00000000 0x20000000>; /* 512 MB */ +		reg = <0x00000000 0x40000000>; /* 1 GB */  	};  	soc { diff --git a/arch/arm/boot/dts/armada-370-xp.dtsi b/arch/arm/boot/dts/armada-370-xp.dtsi index cf6c48a09ea..4c0abe85405 100644 --- a/arch/arm/boot/dts/armada-370-xp.dtsi +++ b/arch/arm/boot/dts/armada-370-xp.dtsi @@ -50,17 +50,19 @@  		ranges;  		serial@d0012000 { -				compatible = "ns16550"; +				compatible = "snps,dw-apb-uart";  				reg = <0xd0012000 0x100>;  				reg-shift = <2>;  				interrupts = <41>; +				reg-io-width = <4>;  				status = "disabled";  		};  		serial@d0012100 { -				compatible = "ns16550"; +				compatible = "snps,dw-apb-uart";  				reg = <0xd0012100 0x100>;  				reg-shift = <2>;  				interrupts = <42>; +				reg-io-width = <4>;  				status = "disabled";  		}; diff --git a/arch/arm/boot/dts/armada-xp-mv78230.dtsi b/arch/arm/boot/dts/armada-xp-mv78230.dtsi index c45c7b4dc35..e041f42ed71 100644 --- a/arch/arm/boot/dts/armada-xp-mv78230.dtsi +++ b/arch/arm/boot/dts/armada-xp-mv78230.dtsi @@ -34,7 +34,14 @@  		reg = <0>;  		clocks = <&cpuclk 0>;  	    }; -	} + +	    cpu@1 { +		device_type = "cpu"; +		compatible = "marvell,sheeva-v7"; +		reg = <1>; +		clocks = <&cpuclk 1>; +	    }; +	};  	soc {  		pinctrl { @@ -43,27 +50,25 @@  		};  		gpio0: gpio@d0018100 { -			compatible = "marvell,armadaxp-gpio"; -			reg = <0xd0018100 0x40>, -			    <0xd0018800 0x30>; +			compatible = "marvell,orion-gpio"; +			reg = <0xd0018100 0x40>;  			ngpios = <32>;  			gpio-controller;  			#gpio-cells = <2>;  			interrupt-controller;  			#interrupts-cells = <2>; -			interrupts = <16>, <17>, <18>, <19>; +			interrupts = <82>, <83>, <84>, <85>;  		};  		gpio1: gpio@d0018140 { -			compatible = "marvell,armadaxp-gpio"; -			reg = <0xd0018140 0x40>, -			    <0xd0018840 0x30>; +			compatible = "marvell,orion-gpio"; +			reg = <0xd0018140 0x40>;  			ngpios = <17>;  			gpio-controller;  			#gpio-cells = <2>;  			interrupt-controller;  			#interrupts-cells = <2>; -			interrupts = <20>, <21>, <22>; +			interrupts = <87>, <88>, <89>;  		};  	};  }; diff --git a/arch/arm/boot/dts/armada-xp-mv78260.dtsi b/arch/arm/boot/dts/armada-xp-mv78260.dtsi index a2aee570737..9e23bd8c953 100644 --- a/arch/arm/boot/dts/armada-xp-mv78260.dtsi +++ b/arch/arm/boot/dts/armada-xp-mv78260.dtsi @@ -51,39 +51,44 @@  		};  		gpio0: gpio@d0018100 { -			compatible = "marvell,armadaxp-gpio"; -			reg = <0xd0018100 0x40>, -			    <0xd0018800 0x30>; +			compatible = "marvell,orion-gpio"; +			reg = <0xd0018100 0x40>;  			ngpios = <32>;  			gpio-controller;  			#gpio-cells = <2>;  			interrupt-controller;  			#interrupts-cells = <2>; -			interrupts = <16>, <17>, <18>, <19>; +			interrupts = <82>, <83>, <84>, <85>;  		};  		gpio1: gpio@d0018140 { -			compatible = "marvell,armadaxp-gpio"; -			reg = <0xd0018140 0x40>, -			    <0xd0018840 0x30>; +			compatible = "marvell,orion-gpio"; +			reg = <0xd0018140 0x40>;  			ngpios = <32>;  			gpio-controller;  			#gpio-cells = <2>;  			interrupt-controller;  			#interrupts-cells = <2>; -			interrupts = <20>, <21>, <22>, <23>; +			interrupts = <87>, <88>, <89>, <90>;  		};  		gpio2: gpio@d0018180 { -			compatible = "marvell,armadaxp-gpio"; -			reg = <0xd0018180 0x40>, -			    <0xd0018870 0x30>; +			compatible = "marvell,orion-gpio"; +			reg = <0xd0018180 0x40>;  			ngpios = <3>;  			gpio-controller;  			#gpio-cells = <2>;  			interrupt-controller;  			#interrupts-cells = <2>; -			interrupts = <24>; +			interrupts = <91>; +		}; + +		ethernet@d0034000 { +				compatible = "marvell,armada-370-neta"; +				reg = <0xd0034000 0x2500>; +				interrupts = <14>; +				clocks = <&gateclk 1>; +				status = "disabled";  		};  	};  }; diff --git a/arch/arm/boot/dts/armada-xp-mv78460.dtsi b/arch/arm/boot/dts/armada-xp-mv78460.dtsi index da03a129243..965966110e3 100644 --- a/arch/arm/boot/dts/armada-xp-mv78460.dtsi +++ b/arch/arm/boot/dts/armada-xp-mv78460.dtsi @@ -66,39 +66,44 @@  		};  		gpio0: gpio@d0018100 { -			compatible = "marvell,armadaxp-gpio"; -			reg = <0xd0018100 0x40>, -			    <0xd0018800 0x30>; +			compatible = "marvell,orion-gpio"; +			reg = <0xd0018100 0x40>;  			ngpios = <32>;  			gpio-controller;  			#gpio-cells = <2>;  			interrupt-controller;  			#interrupts-cells = <2>; -			interrupts = <16>, <17>, <18>, <19>; +			interrupts = <82>, <83>, <84>, <85>;  		};  		gpio1: gpio@d0018140 { -			compatible = "marvell,armadaxp-gpio"; -			reg = <0xd0018140 0x40>, -			    <0xd0018840 0x30>; +			compatible = "marvell,orion-gpio"; +			reg = <0xd0018140 0x40>;  			ngpios = <32>;  			gpio-controller;  			#gpio-cells = <2>;  			interrupt-controller;  			#interrupts-cells = <2>; -			interrupts = <20>, <21>, <22>, <23>; +			interrupts = <87>, <88>, <89>, <90>;  		};  		gpio2: gpio@d0018180 { -			compatible = "marvell,armadaxp-gpio"; -			reg = <0xd0018180 0x40>, -			    <0xd0018870 0x30>; +			compatible = "marvell,orion-gpio"; +			reg = <0xd0018180 0x40>;  			ngpios = <3>;  			gpio-controller;  			#gpio-cells = <2>;  			interrupt-controller;  			#interrupts-cells = <2>; -			interrupts = <24>; +			interrupts = <91>; +		}; + +		ethernet@d0034000 { +				compatible = "marvell,armada-370-neta"; +				reg = <0xd0034000 0x2500>; +				interrupts = <14>; +				clocks = <&gateclk 1>; +				status = "disabled";  		};  	};   }; diff --git a/arch/arm/boot/dts/armada-xp.dtsi b/arch/arm/boot/dts/armada-xp.dtsi index 367aa3f9491..2e37ef101c9 100644 --- a/arch/arm/boot/dts/armada-xp.dtsi +++ b/arch/arm/boot/dts/armada-xp.dtsi @@ -42,17 +42,19 @@  	soc {  		serial@d0012200 { -				compatible = "ns16550"; +				compatible = "snps,dw-apb-uart";  				reg = <0xd0012200 0x100>;  				reg-shift = <2>;  				interrupts = <43>; +				reg-io-width = <4>;  				status = "disabled";  		};  		serial@d0012300 { -				compatible = "ns16550"; +				compatible = "snps,dw-apb-uart";  				reg = <0xd0012300 0x100>;  				reg-shift = <2>;  				interrupts = <44>; +				reg-io-width = <4>;  				status = "disabled";  		}; @@ -93,14 +95,6 @@  				status = "disabled";  		}; -		ethernet@d0034000 { -				compatible = "marvell,armada-370-neta"; -				reg = <0xd0034000 0x2500>; -				interrupts = <14>; -				clocks = <&gateclk 1>; -				status = "disabled"; -		}; -  		xor@d0060900 {  			compatible = "marvell,orion-xor";  			reg = <0xd0060900 0x100 diff --git a/arch/arm/boot/dts/at91rm9200.dtsi b/arch/arm/boot/dts/at91rm9200.dtsi index e154f242c68..222047f1ece 100644 --- a/arch/arm/boot/dts/at91rm9200.dtsi +++ b/arch/arm/boot/dts/at91rm9200.dtsi @@ -336,8 +336,8 @@  	i2c@0 {  		compatible = "i2c-gpio"; -		gpios = <&pioA 23 0 /* sda */ -			 &pioA 24 0 /* scl */ +		gpios = <&pioA 25 0 /* sda */ +			 &pioA 26 0 /* scl */  			>;  		i2c-gpio,sda-open-drain;  		i2c-gpio,scl-open-drain; diff --git a/arch/arm/boot/dts/at91sam9260.dtsi b/arch/arm/boot/dts/at91sam9260.dtsi index 68bccf41a2c..cb7bcc51608 100644 --- a/arch/arm/boot/dts/at91sam9260.dtsi +++ b/arch/arm/boot/dts/at91sam9260.dtsi @@ -306,6 +306,22 @@  					};  				}; +				ssc0 { +					pinctrl_ssc0_tx: ssc0_tx-0 { +						atmel,pins = +							<1 16 0x1 0x0	/* PB16 periph A */ +							 1 17 0x1 0x0	/* PB17 periph A */ +							 1 18 0x1 0x0>;	/* PB18 periph A */ +					}; + +					pinctrl_ssc0_rx: ssc0_rx-0 { +						atmel,pins = +							<1 19 0x1 0x0	/* PB19 periph A */ +							 1 20 0x1 0x0	/* PB20 periph A */ +							 1 21 0x1 0x0>;	/* PB21 periph A */ +					}; +				}; +  				pioA: gpio@fffff400 {  					compatible = "atmel,at91rm9200-gpio";  					reg = <0xfffff400 0x200>; @@ -450,6 +466,8 @@  				compatible = "atmel,at91rm9200-ssc";  				reg = <0xfffbc000 0x4000>;  				interrupts = <14 4 5>; +				pinctrl-names = "default"; +				pinctrl-0 = <&pinctrl_ssc0_tx &pinctrl_ssc0_rx>;  				status = "disabled";  			}; diff --git a/arch/arm/boot/dts/at91sam9263.dtsi b/arch/arm/boot/dts/at91sam9263.dtsi index 32ec62cf538..271d4de026e 100644 --- a/arch/arm/boot/dts/at91sam9263.dtsi +++ b/arch/arm/boot/dts/at91sam9263.dtsi @@ -271,6 +271,38 @@  					};  				}; +				ssc0 { +					pinctrl_ssc0_tx: ssc0_tx-0 { +						atmel,pins = +							<1 0 0x2 0x0	/* PB0 periph B */ +							 1 1 0x2 0x0	/* PB1 periph B */ +							 1 2 0x2 0x0>;	/* PB2 periph B */ +					}; + +					pinctrl_ssc0_rx: ssc0_rx-0 { +						atmel,pins = +							<1 3 0x2 0x0	/* PB3 periph B */ +							 1 4 0x2 0x0	/* PB4 periph B */ +							 1 5 0x2 0x0>;	/* PB5 periph B */ +					}; +				}; + +				ssc1 { +					pinctrl_ssc1_tx: ssc1_tx-0 { +						atmel,pins = +							<1 6 0x1 0x0	/* PB6 periph A */ +							 1 7 0x1 0x0	/* PB7 periph A */ +							 1 8 0x1 0x0>;	/* PB8 periph A */ +					}; + +					pinctrl_ssc1_rx: ssc1_rx-0 { +						atmel,pins = +							<1 9 0x1 0x0	/* PB9 periph A */ +							 1 10 0x1 0x0	/* PB10 periph A */ +							 1 11 0x1 0x0>;	/* PB11 periph A */ +					}; +				}; +  				pioA: gpio@fffff200 {  					compatible = "atmel,at91rm9200-gpio";  					reg = <0xfffff200 0x200>; @@ -368,6 +400,8 @@  				compatible = "atmel,at91rm9200-ssc";  				reg = <0xfff98000 0x4000>;  				interrupts = <16 4 5>; +				pinctrl-names = "default"; +				pinctrl-0 = <&pinctrl_ssc0_tx &pinctrl_ssc0_rx>;  				status = "disabled";  			}; @@ -375,6 +409,8 @@  				compatible = "atmel,at91rm9200-ssc";  				reg = <0xfff9c000 0x4000>;  				interrupts = <17 4 5>; +				pinctrl-names = "default"; +				pinctrl-0 = <&pinctrl_ssc1_tx &pinctrl_ssc1_rx>;  				status = "disabled";  			}; diff --git a/arch/arm/boot/dts/at91sam9g45.dtsi b/arch/arm/boot/dts/at91sam9g45.dtsi index 231858ffd85..6b1d4cab24c 100644 --- a/arch/arm/boot/dts/at91sam9g45.dtsi +++ b/arch/arm/boot/dts/at91sam9g45.dtsi @@ -290,6 +290,38 @@  					};  				}; +				ssc0 { +					pinctrl_ssc0_tx: ssc0_tx-0 { +						atmel,pins = +							<3 0 0x1 0x0	/* PD0 periph A */ +							 3 1 0x1 0x0	/* PD1 periph A */ +							 3 2 0x1 0x0>;	/* PD2 periph A */ +					}; + +					pinctrl_ssc0_rx: ssc0_rx-0 { +						atmel,pins = +							<3 3 0x1 0x0	/* PD3 periph A */ +							 3 4 0x1 0x0	/* PD4 periph A */ +							 3 5 0x1 0x0>;	/* PD5 periph A */ +					}; +				}; + +				ssc1 { +					pinctrl_ssc1_tx: ssc1_tx-0 { +						atmel,pins = +							<3 10 0x1 0x0	/* PD10 periph A */ +							 3 11 0x1 0x0	/* PD11 periph A */ +							 3 12 0x1 0x0>;	/* PD12 periph A */ +					}; + +					pinctrl_ssc1_rx: ssc1_rx-0 { +						atmel,pins = +							<3 13 0x1 0x0	/* PD13 periph A */ +							 3 14 0x1 0x0	/* PD14 periph A */ +							 3 15 0x1 0x0>;	/* PD15 periph A */ +					}; +				}; +  				pioA: gpio@fffff200 {  					compatible = "atmel,at91rm9200-gpio";  					reg = <0xfffff200 0x200>; @@ -425,6 +457,8 @@  				compatible = "atmel,at91sam9g45-ssc";  				reg = <0xfff9c000 0x4000>;  				interrupts = <16 4 5>; +				pinctrl-names = "default"; +				pinctrl-0 = <&pinctrl_ssc0_tx &pinctrl_ssc0_rx>;  				status = "disabled";  			}; @@ -432,6 +466,8 @@  				compatible = "atmel,at91sam9g45-ssc";  				reg = <0xfffa0000 0x4000>;  				interrupts = <17 4 5>; +				pinctrl-names = "default"; +				pinctrl-0 = <&pinctrl_ssc1_tx &pinctrl_ssc1_rx>;  				status = "disabled";  			}; diff --git a/arch/arm/boot/dts/at91sam9n12.dtsi b/arch/arm/boot/dts/at91sam9n12.dtsi index e9efb34f437..80e29c605d4 100644 --- a/arch/arm/boot/dts/at91sam9n12.dtsi +++ b/arch/arm/boot/dts/at91sam9n12.dtsi @@ -28,6 +28,7 @@  		tcb1 = &tcb1;  		i2c0 = &i2c0;  		i2c1 = &i2c1; +		ssc0 = &ssc0;  	};  	cpus {  		cpu@0 { @@ -244,6 +245,22 @@  					};  				}; +				ssc0 { +					pinctrl_ssc0_tx: ssc0_tx-0 { +						atmel,pins = +							<0 24 0x2 0x0	/* PA24 periph B */ +							 0 25 0x2 0x0	/* PA25 periph B */ +							 0 26 0x2 0x0>;	/* PA26 periph B */ +					}; + +					pinctrl_ssc0_rx: ssc0_rx-0 { +						atmel,pins = +							<0 27 0x2 0x0	/* PA27 periph B */ +							 0 28 0x2 0x0	/* PA28 periph B */ +							 0 29 0x2 0x0>;	/* PA29 periph B */ +					}; +				}; +  				pioA: gpio@fffff400 {  					compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio";  					reg = <0xfffff400 0x200>; @@ -294,6 +311,15 @@  				status = "disabled";  			}; +			ssc0: ssc@f0010000 { +				compatible = "atmel,at91sam9g45-ssc"; +				reg = <0xf0010000 0x4000>; +				interrupts = <28 4 5>; +				pinctrl-names = "default"; +				pinctrl-0 = <&pinctrl_ssc0_tx &pinctrl_ssc0_rx>; +				status = "disabled"; +			}; +  			usart0: serial@f801c000 {  				compatible = "atmel,at91sam9260-usart";  				reg = <0xf801c000 0x4000>; diff --git a/arch/arm/boot/dts/at91sam9x5.dtsi b/arch/arm/boot/dts/at91sam9x5.dtsi index 40ac3a4eb1a..8ecca6948d8 100644 --- a/arch/arm/boot/dts/at91sam9x5.dtsi +++ b/arch/arm/boot/dts/at91sam9x5.dtsi @@ -88,13 +88,6 @@  				interrupts = <1 4 7>;  			}; -			ssc0: ssc@f0010000 { -				compatible = "atmel,at91sam9g45-ssc"; -				reg = <0xf0010000 0x4000>; -				interrupts = <28 4 5>; -				status = "disabled"; -			}; -  			tcb0: timer@f8008000 {  				compatible = "atmel,at91sam9x5-tcb";  				reg = <0xf8008000 0x100>; @@ -150,6 +143,11 @@  						atmel,pins =  							<0 3 0x1 0x0>;	/* PA3 periph A */  					}; + +					pinctrl_usart0_sck: usart0_sck-0 { +						atmel,pins = +							<0 4 0x1 0x0>;	/* PA4 periph A */ +					};  				};  				usart1 { @@ -161,12 +159,17 @@  					pinctrl_usart1_rts: usart1_rts-0 {  						atmel,pins = -							<3 27 0x3 0x0>;	/* PC27 periph C */ +							<2 27 0x3 0x0>;	/* PC27 periph C */  					};  					pinctrl_usart1_cts: usart1_cts-0 {  						atmel,pins = -							<3 28 0x3 0x0>;	/* PC28 periph C */ +							<2 28 0x3 0x0>;	/* PC28 periph C */ +					}; + +					pinctrl_usart1_sck: usart1_sck-0 { +						atmel,pins = +							<2 28 0x3 0x0>;	/* PC29 periph C */  					};  				}; @@ -179,46 +182,56 @@  					pinctrl_uart2_rts: uart2_rts-0 {  						atmel,pins = -							<0 0 0x2 0x0>;	/* PB0 periph B */ +							<1 0 0x2 0x0>;	/* PB0 periph B */  					};  					pinctrl_uart2_cts: uart2_cts-0 {  						atmel,pins = -							<0 1 0x2 0x0>;	/* PB1 periph B */ +							<1 1 0x2 0x0>;	/* PB1 periph B */ +					}; + +					pinctrl_usart2_sck: usart2_sck-0 { +						atmel,pins = +							<1 2 0x2 0x0>;	/* PB2 periph B */  					};  				};  				usart3 {  					pinctrl_uart3: usart3-0 {  						atmel,pins = -							<3 23 0x2 0x1	/* PC22 periph B with pullup */ -							 3 23 0x2 0x0>;	/* PC23 periph B */ +							<2 23 0x2 0x1	/* PC22 periph B with pullup */ +							 2 23 0x2 0x0>;	/* PC23 periph B */  					};  					pinctrl_usart3_rts: usart3_rts-0 {  						atmel,pins = -							<3 24 0x2 0x0>;	/* PC24 periph B */ +							<2 24 0x2 0x0>;	/* PC24 periph B */  					};  					pinctrl_usart3_cts: usart3_cts-0 {  						atmel,pins = -							<3 25 0x2 0x0>;	/* PC25 periph B */ +							<2 25 0x2 0x0>;	/* PC25 periph B */ +					}; + +					pinctrl_usart3_sck: usart3_sck-0 { +						atmel,pins = +							<2 26 0x2 0x0>;	/* PC26 periph B */  					};  				};  				uart0 {  					pinctrl_uart0: uart0-0 {  						atmel,pins = -							<3 8 0x3 0x0	/* PC8 periph C */ -							 3 9 0x3 0x1>;	/* PC9 periph C with pullup */ +							<2 8 0x3 0x0	/* PC8 periph C */ +							 2 9 0x3 0x1>;	/* PC9 periph C with pullup */  					};  				};  				uart1 {  					pinctrl_uart1: uart1-0 {  						atmel,pins = -							<3 16 0x3 0x0	/* PC16 periph C */ -							 3 17 0x3 0x1>;	/* PC17 periph C with pullup */ +							<2 16 0x3 0x0	/* PC16 periph C */ +							 2 17 0x3 0x1>;	/* PC17 periph C with pullup */  					};  				}; @@ -247,14 +260,14 @@  					pinctrl_macb0_rmii_mii: macb0_rmii_mii-0 {  						atmel,pins = -							<1 8 0x1 0x0	/* PA8 periph A */ -							 1 11 0x1 0x0	/* PA11 periph A */ -							 1 12 0x1 0x0	/* PA12 periph A */ -							 1 13 0x1 0x0	/* PA13 periph A */ -							 1 14 0x1 0x0	/* PA14 periph A */ -							 1 15 0x1 0x0	/* PA15 periph A */ -							 1 16 0x1 0x0	/* PA16 periph A */ -							 1 17 0x1 0x0>;	/* PA17 periph A */ +							<1 8 0x1 0x0	/* PB8 periph A */ +							 1 11 0x1 0x0	/* PB11 periph A */ +							 1 12 0x1 0x0	/* PB12 periph A */ +							 1 13 0x1 0x0	/* PB13 periph A */ +							 1 14 0x1 0x0	/* PB14 periph A */ +							 1 15 0x1 0x0	/* PB15 periph A */ +							 1 16 0x1 0x0	/* PB16 periph A */ +							 1 17 0x1 0x0>;	/* PB17 periph A */  					};  				}; @@ -290,6 +303,22 @@  					};  				}; +				ssc0 { +					pinctrl_ssc0_tx: ssc0_tx-0 { +						atmel,pins = +							<0 24 0x2 0x0	/* PA24 periph B */ +							 0 25 0x2 0x0	/* PA25 periph B */ +							 0 26 0x2 0x0>;	/* PA26 periph B */ +					}; + +					pinctrl_ssc0_rx: ssc0_rx-0 { +						atmel,pins = +							<0 27 0x2 0x0	/* PA27 periph B */ +							 0 28 0x2 0x0	/* PA28 periph B */ +							 0 29 0x2 0x0>;	/* PA29 periph B */ +					}; +				}; +  				pioA: gpio@fffff400 {  					compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio";  					reg = <0xfffff400 0x200>; @@ -333,6 +362,15 @@  				};  			}; +			ssc0: ssc@f0010000 { +				compatible = "atmel,at91sam9g45-ssc"; +				reg = <0xf0010000 0x4000>; +				interrupts = <28 4 5>; +				pinctrl-names = "default"; +				pinctrl-0 = <&pinctrl_ssc0_tx &pinctrl_ssc0_rx>; +				status = "disabled"; +			}; +  			mmc0: mmc@f0008000 {  				compatible = "atmel,hsmci";  				reg = <0xf0008000 0x600>; diff --git a/arch/arm/boot/dts/cros5250-common.dtsi b/arch/arm/boot/dts/cros5250-common.dtsi index fddd1741743..46c09801703 100644 --- a/arch/arm/boot/dts/cros5250-common.dtsi +++ b/arch/arm/boot/dts/cros5250-common.dtsi @@ -96,8 +96,8 @@  		fifo-depth = <0x80>;  		card-detect-delay = <200>;  		samsung,dw-mshc-ciu-div = <3>; -		samsung,dw-mshc-sdr-timing = <2 3 3>; -		samsung,dw-mshc-ddr-timing = <1 2 3>; +		samsung,dw-mshc-sdr-timing = <2 3>; +		samsung,dw-mshc-ddr-timing = <1 2>;  		slot@0 {  			reg = <0>; @@ -120,8 +120,8 @@  		fifo-depth = <0x80>;  		card-detect-delay = <200>;  		samsung,dw-mshc-ciu-div = <3>; -		samsung,dw-mshc-sdr-timing = <2 3 3>; -		samsung,dw-mshc-ddr-timing = <1 2 3>; +		samsung,dw-mshc-sdr-timing = <2 3>; +		samsung,dw-mshc-ddr-timing = <1 2>;  		slot@0 {  			reg = <0>; @@ -141,8 +141,8 @@  		fifo-depth = <0x80>;  		card-detect-delay = <200>;  		samsung,dw-mshc-ciu-div = <3>; -		samsung,dw-mshc-sdr-timing = <2 3 3>; -		samsung,dw-mshc-ddr-timing = <1 2 3>; +		samsung,dw-mshc-sdr-timing = <2 3>; +		samsung,dw-mshc-ddr-timing = <1 2>;  		slot@0 {  			reg = <0>; diff --git a/arch/arm/boot/dts/dbx5x0.dtsi b/arch/arm/boot/dts/dbx5x0.dtsi index 2efd9c891bc..63f2fbcfe81 100644 --- a/arch/arm/boot/dts/dbx5x0.dtsi +++ b/arch/arm/boot/dts/dbx5x0.dtsi @@ -170,7 +170,9 @@  			gpio-bank = <8>;  		}; -		pinctrl { +		pinctrl@80157000 { +			// This is actually the PRCMU base address +			reg = <0x80157000 0x2000>;  			compatible = "stericsson,nmk_pinctrl";  		}; diff --git a/arch/arm/boot/dts/dove-cubox.dts b/arch/arm/boot/dts/dove-cubox.dts index fed7d3f9f43..cdee96fca6e 100644 --- a/arch/arm/boot/dts/dove-cubox.dts +++ b/arch/arm/boot/dts/dove-cubox.dts @@ -26,10 +26,15 @@  };  &uart0 { status = "okay"; }; -&sdio0 { status = "okay"; };  &sata0 { status = "okay"; };  &i2c0 { status = "okay"; }; +&sdio0 { +	status = "okay"; +	/* sdio0 card detect is connected to wrong pin on CuBox */ +	cd-gpios = <&gpio0 12 1>; +}; +  &spi0 {  	status = "okay"; @@ -42,9 +47,14 @@  };  &pinctrl { -	pinctrl-0 = <&pmx_gpio_18>; +	pinctrl-0 = <&pmx_gpio_12 &pmx_gpio_18>;  	pinctrl-names = "default"; +	pmx_gpio_12: pmx-gpio-12 { +		marvell,pins = "mpp12"; +		marvell,function = "gpio"; +	}; +  	pmx_gpio_18: pmx-gpio-18 {  		marvell,pins = "mpp18";  		marvell,function = "gpio"; diff --git a/arch/arm/boot/dts/dove.dtsi b/arch/arm/boot/dts/dove.dtsi index f3f7e9d8adc..42eac1ff3cc 100644 --- a/arch/arm/boot/dts/dove.dtsi +++ b/arch/arm/boot/dts/dove.dtsi @@ -117,6 +117,7 @@  		pinctrl: pinctrl@d0200 {  			compatible = "marvell,dove-pinctrl";  			reg = <0xd0200 0x10>; +			clocks = <&gate_clk 22>;  		};  		spi0: spi@10600 { diff --git a/arch/arm/boot/dts/ecx-2000.dts b/arch/arm/boot/dts/ecx-2000.dts index 46477ac1de9..139b40cc3a2 100644 --- a/arch/arm/boot/dts/ecx-2000.dts +++ b/arch/arm/boot/dts/ecx-2000.dts @@ -32,6 +32,7 @@  		cpu@0 {  			compatible = "arm,cortex-a15"; +			device_type = "cpu";  			reg = <0>;  			clocks = <&a9pll>;  			clock-names = "cpu"; @@ -39,6 +40,7 @@  		cpu@1 {  			compatible = "arm,cortex-a15"; +			device_type = "cpu";  			reg = <1>;  			clocks = <&a9pll>;  			clock-names = "cpu"; @@ -46,6 +48,7 @@  		cpu@2 {  			compatible = "arm,cortex-a15"; +			device_type = "cpu";  			reg = <2>;  			clocks = <&a9pll>;  			clock-names = "cpu"; @@ -53,6 +56,7 @@  		cpu@3 {  			compatible = "arm,cortex-a15"; +			device_type = "cpu";  			reg = <3>;  			clocks = <&a9pll>;  			clock-names = "cpu"; diff --git a/arch/arm/boot/dts/exynos4210-smdkv310.dts b/arch/arm/boot/dts/exynos4210-smdkv310.dts index 9b23a8255e3..f63490707f3 100644 --- a/arch/arm/boot/dts/exynos4210-smdkv310.dts +++ b/arch/arm/boot/dts/exynos4210-smdkv310.dts @@ -26,7 +26,7 @@  	};  	chosen { -		bootargs = "root=/dev/ram0 rw ramdisk=8192 initrd=0x41000000,8M console=ttySAC2,115200 init=/linuxrc"; +		bootargs = "root=/dev/ram0 rw ramdisk=8192 initrd=0x41000000,8M console=ttySAC1,115200 init=/linuxrc";  	};  	sdhci@12530000 { diff --git a/arch/arm/boot/dts/exynos5250-smdk5250.dts b/arch/arm/boot/dts/exynos5250-smdk5250.dts index 942d5761ca9..e05b18f3c33 100644 --- a/arch/arm/boot/dts/exynos5250-smdk5250.dts +++ b/arch/arm/boot/dts/exynos5250-smdk5250.dts @@ -115,8 +115,8 @@  		fifo-depth = <0x80>;  		card-detect-delay = <200>;  		samsung,dw-mshc-ciu-div = <3>; -		samsung,dw-mshc-sdr-timing = <2 3 3>; -		samsung,dw-mshc-ddr-timing = <1 2 3>; +		samsung,dw-mshc-sdr-timing = <2 3>; +		samsung,dw-mshc-ddr-timing = <1 2>;  		slot@0 {  			reg = <0>; @@ -139,8 +139,8 @@  		fifo-depth = <0x80>;  		card-detect-delay = <200>;  		samsung,dw-mshc-ciu-div = <3>; -		samsung,dw-mshc-sdr-timing = <2 3 3>; -		samsung,dw-mshc-ddr-timing = <1 2 3>; +		samsung,dw-mshc-sdr-timing = <2 3>; +		samsung,dw-mshc-ddr-timing = <1 2>;  		slot@0 {  			reg = <0>; diff --git a/arch/arm/boot/dts/exynos5250.dtsi b/arch/arm/boot/dts/exynos5250.dtsi index 2e3b6efaf1a..3acf594ea60 100644 --- a/arch/arm/boot/dts/exynos5250.dtsi +++ b/arch/arm/boot/dts/exynos5250.dtsi @@ -574,7 +574,7 @@  	hdmi {  		compatible = "samsung,exynos5-hdmi"; -		reg = <0x14530000 0x100000>; +		reg = <0x14530000 0x70000>;  		interrupts = <0 95 0>;  	}; diff --git a/arch/arm/boot/dts/exynos5440-ssdk5440.dts b/arch/arm/boot/dts/exynos5440-ssdk5440.dts index 921c83cf694..81e2c964a90 100644 --- a/arch/arm/boot/dts/exynos5440-ssdk5440.dts +++ b/arch/arm/boot/dts/exynos5440-ssdk5440.dts @@ -21,7 +21,7 @@  	};  	chosen { -		bootargs = "root=/dev/ram0 rw ramdisk=8192 initrd=0x81000000,8M console=ttySAC2,115200 init=/linuxrc"; +		bootargs = "root=/dev/ram0 rw ramdisk=8192 initrd=0x81000000,8M console=ttySAC0,115200 init=/linuxrc";  	};  	spi { diff --git a/arch/arm/boot/dts/highbank.dts b/arch/arm/boot/dts/highbank.dts index a9ae5d32e80..5927a8df562 100644 --- a/arch/arm/boot/dts/highbank.dts +++ b/arch/arm/boot/dts/highbank.dts @@ -30,33 +30,37 @@  		#address-cells = <1>;  		#size-cells = <0>; -		cpu@0 { +		cpu@900 {  			compatible = "arm,cortex-a9"; -			reg = <0>; +			device_type = "cpu"; +			reg = <0x900>;  			next-level-cache = <&L2>;  			clocks = <&a9pll>;  			clock-names = "cpu";  		}; -		cpu@1 { +		cpu@901 {  			compatible = "arm,cortex-a9"; -			reg = <1>; +			device_type = "cpu"; +			reg = <0x901>;  			next-level-cache = <&L2>;  			clocks = <&a9pll>;  			clock-names = "cpu";  		}; -		cpu@2 { +		cpu@902 {  			compatible = "arm,cortex-a9"; -			reg = <2>; +			device_type = "cpu"; +			reg = <0x902>;  			next-level-cache = <&L2>;  			clocks = <&a9pll>;  			clock-names = "cpu";  		}; -		cpu@3 { +		cpu@903 {  			compatible = "arm,cortex-a9"; -			reg = <3>; +			device_type = "cpu"; +			reg = <0x903>;  			next-level-cache = <&L2>;  			clocks = <&a9pll>;  			clock-names = "cpu"; diff --git a/arch/arm/boot/dts/imx23-olinuxino.dts b/arch/arm/boot/dts/imx23-olinuxino.dts index 7c43b8e70b9..e7484e4ea65 100644 --- a/arch/arm/boot/dts/imx23-olinuxino.dts +++ b/arch/arm/boot/dts/imx23-olinuxino.dts @@ -39,17 +39,17 @@  				hog_pins_a: hog@0 {  					reg = <0>;  					fsl,pinmux-ids = < -						0x2013 /* MX23_PAD_SSP1_DETECT__GPIO_2_1 */ +						0x0113 /* MX23_PAD_GPMI_ALE__GPIO_0_17 */  					>;  					fsl,drive-strength = <0>;  					fsl,voltage = <1>;  					fsl,pull-up = <0>;  				}; -				led_pin_gpio0_17: led_gpio0_17@0 { +				led_pin_gpio2_1: led_gpio2_1@0 {  					reg = <0>;  					fsl,pinmux-ids = < -						0x0113 /* MX23_PAD_GPMI_ALE__GPIO_0_17 */ +						0x2013 /* MX23_PAD_SSP1_DETECT__GPIO_2_1 */  					>;  					fsl,drive-strength = <0>;  					fsl,voltage = <1>; @@ -110,7 +110,7 @@  	leds {  		compatible = "gpio-leds";  		pinctrl-names = "default"; -		pinctrl-0 = <&led_pin_gpio0_17>; +		pinctrl-0 = <&led_pin_gpio2_1>;  		user {  			label = "green"; diff --git a/arch/arm/boot/dts/imx31-bug.dts b/arch/arm/boot/dts/imx31-bug.dts index 24731cb78e8..7f67402328d 100644 --- a/arch/arm/boot/dts/imx31-bug.dts +++ b/arch/arm/boot/dts/imx31-bug.dts @@ -14,7 +14,7 @@  / {  	model = "Buglabs i.MX31 Bug 1.x"; -	compatible = "fsl,imx31-bug", "fsl,imx31"; +	compatible = "buglabs,imx31-bug", "fsl,imx31";  	memory {  		reg = <0x80000000 0x8000000>; /* 128M */ diff --git a/arch/arm/boot/dts/imx53.dtsi b/arch/arm/boot/dts/imx53.dtsi index 552aed4ff98..edc3f1eb669 100644 --- a/arch/arm/boot/dts/imx53.dtsi +++ b/arch/arm/boot/dts/imx53.dtsi @@ -492,7 +492,7 @@  				compatible = "fsl,imx53-flexcan", "fsl,p1010-flexcan";  				reg = <0x53fcc000 0x4000>;  				interrupts = <83>; -				clocks = <&clks 158>, <&clks 157>; +				clocks = <&clks 87>, <&clks 86>;  				clock-names = "ipg", "per";  				status = "disabled";  			}; diff --git a/arch/arm/boot/dts/kirkwood-6282.dtsi b/arch/arm/boot/dts/kirkwood-6282.dtsi index 9ae2004d567..4ccea2130a6 100644 --- a/arch/arm/boot/dts/kirkwood-6282.dtsi +++ b/arch/arm/boot/dts/kirkwood-6282.dtsi @@ -39,6 +39,7 @@  			#size-cells = <0>;  			interrupts = <32>;  			clock-frequency = <100000>; +			clocks = <&gate_clk 7>;  			status = "disabled";  		};  	}; diff --git a/arch/arm/boot/dts/kirkwood-ns2-common.dtsi b/arch/arm/boot/dts/kirkwood-ns2-common.dtsi index 9bc6785ad22..77d21abfcdf 100644 --- a/arch/arm/boot/dts/kirkwood-ns2-common.dtsi +++ b/arch/arm/boot/dts/kirkwood-ns2-common.dtsi @@ -1,4 +1,5 @@  /include/ "kirkwood.dtsi" +/include/ "kirkwood-6281.dtsi"  / {  	chosen { @@ -6,6 +7,21 @@  	};  	ocp@f1000000 { +		pinctrl: pinctrl@10000 { +			pinctrl-0 = < &pmx_spi &pmx_twsi0 &pmx_uart0 +					&pmx_ns2_sata0 &pmx_ns2_sata1>; +			pinctrl-names = "default"; + +			pmx_ns2_sata0: pmx-ns2-sata0 { +				marvell,pins = "mpp21"; +				marvell,function = "sata0"; +			}; +			pmx_ns2_sata1: pmx-ns2-sata1 { +				marvell,pins = "mpp20"; +				marvell,function = "sata1"; +			}; +		}; +  		serial@12000 {  			clock-frequency = <166666667>;  			status = "okay"; diff --git a/arch/arm/boot/dts/kirkwood-topkick.dts b/arch/arm/boot/dts/kirkwood-topkick.dts index c0de5a7f660..cd15452a52a 100644 --- a/arch/arm/boot/dts/kirkwood-topkick.dts +++ b/arch/arm/boot/dts/kirkwood-topkick.dts @@ -82,4 +82,21 @@  			gpios = <&gpio1 16 1>;  		};  	}; +	regulators { +		compatible = "simple-bus"; +		#address-cells = <1>; +		#size-cells = <0>; + +		sata0_power: regulator@1 { +			compatible = "regulator-fixed"; +			reg = <1>; +			regulator-name = "SATA0 Power"; +			regulator-min-microvolt = <5000000>; +			regulator-max-microvolt = <5000000>; +			enable-active-high; +			regulator-always-on; +			regulator-boot-on; +			gpio = <&gpio1 4 0>; +		}; +	};  }; diff --git a/arch/arm/boot/dts/kirkwood.dtsi b/arch/arm/boot/dts/kirkwood.dtsi index 7735cee4a9c..d6ab442b701 100644 --- a/arch/arm/boot/dts/kirkwood.dtsi +++ b/arch/arm/boot/dts/kirkwood.dtsi @@ -36,6 +36,7 @@  			reg = <0x10100 0x40>;  			ngpios = <32>;  			interrupt-controller; +			#interrupt-cells = <2>;  			interrupts = <35>, <36>, <37>, <38>;  		}; @@ -46,6 +47,7 @@  			reg = <0x10140 0x40>;  			ngpios = <18>;  			interrupt-controller; +			#interrupt-cells = <2>;  			interrupts = <39>, <40>, <41>;  		}; @@ -144,6 +146,7 @@  			compatible = "marvell,orion-ehci";  			reg = <0x50000 0x1000>;  			interrupts = <19>; +			clocks = <&gate_clk 3>;  			status = "okay";  		}; diff --git a/arch/arm/boot/dts/kizbox.dts b/arch/arm/boot/dts/kizbox.dts index e8814fe0e27..b4dc3ed9a3e 100644 --- a/arch/arm/boot/dts/kizbox.dts +++ b/arch/arm/boot/dts/kizbox.dts @@ -48,6 +48,8 @@  			macb0: ethernet@fffc4000 {  				phy-mode = "mii"; +				pinctrl-0 = <&pinctrl_macb_rmii +				             &pinctrl_macb_rmii_mii_alt>;  				status = "okay";  			}; diff --git a/arch/arm/boot/dts/sunxi.dtsi b/arch/arm/boot/dts/sunxi.dtsi index 8bbc2bfef22..8b36abea9f2 100644 --- a/arch/arm/boot/dts/sunxi.dtsi +++ b/arch/arm/boot/dts/sunxi.dtsi @@ -60,19 +60,21 @@  		};  		uart0: uart@01c28000 { -			compatible = "ns8250"; +			compatible = "snps,dw-apb-uart";  			reg = <0x01c28000 0x400>;  			interrupts = <1>;  			reg-shift = <2>; +			reg-io-width = <4>;  			clock-frequency = <24000000>;  			status = "disabled";  		};  		uart1: uart@01c28400 { -			compatible = "ns8250"; +			compatible = "snps,dw-apb-uart";  			reg = <0x01c28400 0x400>;  			interrupts = <2>;  			reg-shift = <2>; +			reg-io-width = <4>;  			clock-frequency = <24000000>;  			status = "disabled";  		}; diff --git a/arch/arm/boot/dts/vexpress-v2p-ca15_a7.dts b/arch/arm/boot/dts/vexpress-v2p-ca15_a7.dts index 1fc405a9ecf..cf8071ad22d 100644 --- a/arch/arm/boot/dts/vexpress-v2p-ca15_a7.dts +++ b/arch/arm/boot/dts/vexpress-v2p-ca15_a7.dts @@ -45,7 +45,6 @@  			reg = <1>;  		}; -/* A7s disabled till big.LITTLE patches are available...  		cpu2: cpu@2 {  			device_type = "cpu";  			compatible = "arm,cortex-a7"; @@ -63,7 +62,6 @@  			compatible = "arm,cortex-a7";  			reg = <0x102>;  		}; -*/  	};  	memory@80000000 { diff --git a/arch/arm/common/gic.c b/arch/arm/common/gic.c index 36ae03a3f5d..87dfa9026c5 100644 --- a/arch/arm/common/gic.c +++ b/arch/arm/common/gic.c @@ -351,6 +351,25 @@ void __init gic_cascade_irq(unsigned int gic_nr, unsigned int irq)  	irq_set_chained_handler(irq, gic_handle_cascade_irq);  } +static u8 gic_get_cpumask(struct gic_chip_data *gic) +{ +	void __iomem *base = gic_data_dist_base(gic); +	u32 mask, i; + +	for (i = mask = 0; i < 32; i += 4) { +		mask = readl_relaxed(base + GIC_DIST_TARGET + i); +		mask |= mask >> 16; +		mask |= mask >> 8; +		if (mask) +			break; +	} + +	if (!mask) +		pr_crit("GIC CPU mask not found - kernel will fail to boot.\n"); + +	return mask; +} +  static void __init gic_dist_init(struct gic_chip_data *gic)  {  	unsigned int i; @@ -369,7 +388,9 @@ static void __init gic_dist_init(struct gic_chip_data *gic)  	/*  	 * Set all global interrupts to this CPU only.  	 */ -	cpumask = readl_relaxed(base + GIC_DIST_TARGET + 0); +	cpumask = gic_get_cpumask(gic); +	cpumask |= cpumask << 8; +	cpumask |= cpumask << 16;  	for (i = 32; i < gic_irqs; i += 4)  		writel_relaxed(cpumask, base + GIC_DIST_TARGET + i * 4 / 4); @@ -400,7 +421,7 @@ static void __cpuinit gic_cpu_init(struct gic_chip_data *gic)  	 * Get what the GIC says our CPU mask is.  	 */  	BUG_ON(cpu >= NR_GIC_CPU_IF); -	cpu_mask = readl_relaxed(dist_base + GIC_DIST_TARGET + 0); +	cpu_mask = gic_get_cpumask(gic);  	gic_cpu_map[cpu] = cpu_mask;  	/* diff --git a/arch/arm/common/sa1111.c b/arch/arm/common/sa1111.c index 9173d112ea0..e57d7e5bf96 100644 --- a/arch/arm/common/sa1111.c +++ b/arch/arm/common/sa1111.c @@ -686,8 +686,7 @@ sa1111_init_one_child(struct sa1111 *sachip, struct resource *parent,   *	%-EINVAL	no platform data passed   *	%0		successful.   */ -static int __devinit -__sa1111_probe(struct device *me, struct resource *mem, int irq) +static int __sa1111_probe(struct device *me, struct resource *mem, int irq)  {  	struct sa1111_platform_data *pd = me->platform_data;  	struct sa1111 *sachip; @@ -1011,7 +1010,7 @@ static int sa1111_resume(struct platform_device *dev)  #define sa1111_resume  NULL  #endif -static int __devinit sa1111_probe(struct platform_device *pdev) +static int sa1111_probe(struct platform_device *pdev)  {  	struct resource *mem;  	int irq; diff --git a/arch/arm/common/scoop.c b/arch/arm/common/scoop.c index 0c616d5fcb0..a5c3dc38aa1 100644 --- a/arch/arm/common/scoop.c +++ b/arch/arm/common/scoop.c @@ -176,7 +176,7 @@ static int scoop_resume(struct platform_device *dev)  #define scoop_resume	NULL  #endif -static int __devinit scoop_probe(struct platform_device *pdev) +static int scoop_probe(struct platform_device *pdev)  {  	struct scoop_dev *devptr;  	struct scoop_config *inf; @@ -243,7 +243,7 @@ err_ioremap:  	return ret;  } -static int __devexit scoop_remove(struct platform_device *pdev) +static int scoop_remove(struct platform_device *pdev)  {  	struct scoop_dev *sdev = platform_get_drvdata(pdev);  	int ret; @@ -268,7 +268,7 @@ static int __devexit scoop_remove(struct platform_device *pdev)  static struct platform_driver scoop_driver = {  	.probe		= scoop_probe, -	.remove		= __devexit_p(scoop_remove), +	.remove		= scoop_remove,  	.suspend	= scoop_suspend,  	.resume		= scoop_resume,  	.driver		= { diff --git a/arch/arm/common/vic.c b/arch/arm/common/vic.c index e4df17ca90c..8f324b99416 100644 --- a/arch/arm/common/vic.c +++ b/arch/arm/common/vic.c @@ -206,6 +206,7 @@ static void __init vic_register(void __iomem *base, unsigned int irq,  				struct device_node *node)  {  	struct vic_device *v; +	int i;  	if (vic_id >= ARRAY_SIZE(vic_devices)) {  		printk(KERN_ERR "%s: too few VICs, increase CONFIG_ARM_VIC_NR\n", __func__); @@ -220,6 +221,10 @@ static void __init vic_register(void __iomem *base, unsigned int irq,  	vic_id++;  	v->domain = irq_domain_add_simple(node, fls(valid_sources), irq,  					  &vic_irqdomain_ops, v); +	/* create an IRQ mapping for each valid IRQ */ +	for (i = 0; i < fls(valid_sources); i++) +		if (valid_sources & (1 << i)) +			irq_create_mapping(v->domain, i);  }  static void vic_ack_irq(struct irq_data *d) @@ -416,9 +421,9 @@ int __init vic_of_init(struct device_node *node, struct device_node *parent)  		return -EIO;  	/* -	 * Passing -1 as first IRQ makes the simple domain allocate descriptors +	 * Passing 0 as first IRQ makes the simple domain allocate descriptors  	 */ -	__vic_init(regs, -1, ~0, ~0, node); +	__vic_init(regs, 0, ~0, ~0, node);  	return 0;  } diff --git a/arch/arm/configs/at91_dt_defconfig b/arch/arm/configs/at91_dt_defconfig index b175577d7ab..1ea959019fc 100644 --- a/arch/arm/configs/at91_dt_defconfig +++ b/arch/arm/configs/at91_dt_defconfig @@ -19,6 +19,7 @@ CONFIG_SOC_AT91SAM9260=y  CONFIG_SOC_AT91SAM9263=y  CONFIG_SOC_AT91SAM9G45=y  CONFIG_SOC_AT91SAM9X5=y +CONFIG_SOC_AT91SAM9N12=y  CONFIG_MACH_AT91SAM_DT=y  CONFIG_AT91_PROGRAMMABLE_CLOCKS=y  CONFIG_AT91_TIMER_HZ=128 @@ -31,7 +32,7 @@ CONFIG_ZBOOT_ROM_TEXT=0x0  CONFIG_ZBOOT_ROM_BSS=0x0  CONFIG_ARM_APPENDED_DTB=y  CONFIG_ARM_ATAG_DTB_COMPAT=y -CONFIG_CMDLINE="mem=128M console=ttyS0,115200 initrd=0x21100000,25165824 root=/dev/ram0 rw" +CONFIG_CMDLINE="console=ttyS0,115200 initrd=0x21100000,25165824 root=/dev/ram0 rw"  CONFIG_KEXEC=y  CONFIG_AUTO_ZRELADDR=y  # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set diff --git a/arch/arm/configs/mvebu_defconfig b/arch/arm/configs/mvebu_defconfig index a702fb345c0..b5bc96cb65a 100644 --- a/arch/arm/configs/mvebu_defconfig +++ b/arch/arm/configs/mvebu_defconfig @@ -33,9 +33,7 @@ CONFIG_MVNETA=y  CONFIG_MARVELL_PHY=y  CONFIG_SERIAL_8250=y  CONFIG_SERIAL_8250_CONSOLE=y -CONFIG_SERIAL_OF_PLATFORM=y -CONFIG_I2C=y -CONFIG_I2C_MV64XXX=y +CONFIG_SERIAL_8250_DW=y  CONFIG_GPIOLIB=y  CONFIG_GPIO_SYSFS=y  # CONFIG_USB_SUPPORT is not set diff --git a/arch/arm/include/asm/memory.h b/arch/arm/include/asm/memory.h index 73cf03aa981..1c4df27f933 100644 --- a/arch/arm/include/asm/memory.h +++ b/arch/arm/include/asm/memory.h @@ -37,7 +37,7 @@   */  #define PAGE_OFFSET		UL(CONFIG_PAGE_OFFSET)  #define TASK_SIZE		(UL(CONFIG_PAGE_OFFSET) - UL(0x01000000)) -#define TASK_UNMAPPED_BASE	(UL(CONFIG_PAGE_OFFSET) / 3) +#define TASK_UNMAPPED_BASE	ALIGN(TASK_SIZE / 3, SZ_16M)  /*   * The maximum size of a 26-bit user space task. diff --git a/arch/arm/include/asm/smp_scu.h b/arch/arm/include/asm/smp_scu.h index 4eb6d005ffa..86dff32a073 100644 --- a/arch/arm/include/asm/smp_scu.h +++ b/arch/arm/include/asm/smp_scu.h @@ -7,8 +7,14 @@  #ifndef __ASSEMBLER__  unsigned int scu_get_core_count(void __iomem *); -void scu_enable(void __iomem *);  int scu_power_mode(void __iomem *, unsigned int); + +#ifdef CONFIG_SMP +void scu_enable(void __iomem *scu_base); +#else +static inline void scu_enable(void __iomem *scu_base) {} +#endif +  #endif  #endif diff --git a/arch/arm/kernel/bios32.c b/arch/arm/kernel/bios32.c index 9b722612553..379cf329239 100644 --- a/arch/arm/kernel/bios32.c +++ b/arch/arm/kernel/bios32.c @@ -78,7 +78,7 @@ void pcibios_report_status(u_int status_mask, int warn)   * Bug 3 is responsible for the sound DMA grinding to a halt.  We now   * live with bug 2.   */ -static void __devinit pci_fixup_83c553(struct pci_dev *dev) +static void pci_fixup_83c553(struct pci_dev *dev)  {  	/*  	 * Set memory region to start at address 0, and enable IO @@ -130,7 +130,7 @@ static void __devinit pci_fixup_83c553(struct pci_dev *dev)  }  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_WINBOND, PCI_DEVICE_ID_WINBOND_83C553, pci_fixup_83c553); -static void __devinit pci_fixup_unassign(struct pci_dev *dev) +static void pci_fixup_unassign(struct pci_dev *dev)  {  	dev->resource[0].end -= dev->resource[0].start;  	dev->resource[0].start = 0; @@ -142,7 +142,7 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_WINBOND2, PCI_DEVICE_ID_WINBOND2_89C940F,   * if it is the host bridge by marking it as such.  These resources are of   * no consequence to the PCI layer (they are handled elsewhere).   */ -static void __devinit pci_fixup_dec21285(struct pci_dev *dev) +static void pci_fixup_dec21285(struct pci_dev *dev)  {  	int i; @@ -161,7 +161,7 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_21285, pci_fixup_d  /*   * PCI IDE controllers use non-standard I/O port decoding, respect it.   */ -static void __devinit pci_fixup_ide_bases(struct pci_dev *dev) +static void pci_fixup_ide_bases(struct pci_dev *dev)  {  	struct resource *r;  	int i; @@ -182,7 +182,7 @@ DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, pci_fixup_ide_bases);  /*   * Put the DEC21142 to sleep   */ -static void __devinit pci_fixup_dec21142(struct pci_dev *dev) +static void pci_fixup_dec21142(struct pci_dev *dev)  {  	pci_write_config_dword(dev, 0x40, 0x80000000);  } @@ -204,7 +204,7 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_21142, pci_fixup_d   * functional.  However, The CY82C693U _does not work_ in bus   * master mode without locking the PCI bus solid.   */ -static void __devinit pci_fixup_cy82c693(struct pci_dev *dev) +static void pci_fixup_cy82c693(struct pci_dev *dev)  {  	if ((dev->class >> 8) == PCI_CLASS_STORAGE_IDE) {  		u32 base0, base1; @@ -254,7 +254,7 @@ static void __devinit pci_fixup_cy82c693(struct pci_dev *dev)  }  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_CONTAQ, PCI_DEVICE_ID_CONTAQ_82C693, pci_fixup_cy82c693); -static void __devinit pci_fixup_it8152(struct pci_dev *dev) +static void pci_fixup_it8152(struct pci_dev *dev)  {  	int i;  	/* fixup for ITE 8152 devices */ @@ -361,9 +361,7 @@ void pcibios_fixup_bus(struct pci_bus *bus)  	printk(KERN_INFO "PCI: bus%d: Fast back to back transfers %sabled\n",  		bus->number, (features & PCI_COMMAND_FAST_BACK) ? "en" : "dis");  } -#ifdef CONFIG_HOTPLUG  EXPORT_SYMBOL(pcibios_fixup_bus); -#endif  /*   * Swizzle the device pin each time we cross a bridge.  If a platform does @@ -380,7 +378,7 @@ EXPORT_SYMBOL(pcibios_fixup_bus);   * PCI standard swizzle is implemented on plug-in cards and Cardbus based   * PCI extenders, so it can not be ignored.   */ -static u8 __devinit pcibios_swizzle(struct pci_dev *dev, u8 *pin) +static u8 pcibios_swizzle(struct pci_dev *dev, u8 *pin)  {  	struct pci_sys_data *sys = dev->sysdata;  	int slot, oldpin = *pin; diff --git a/arch/arm/kernel/debug.S b/arch/arm/kernel/debug.S index 6809200c31f..14f7c3b1463 100644 --- a/arch/arm/kernel/debug.S +++ b/arch/arm/kernel/debug.S @@ -100,12 +100,14 @@ ENTRY(printch)  		b	1b  ENDPROC(printch) +#ifdef CONFIG_MMU  ENTRY(debug_ll_addr)  		addruart r2, r3, ip  		str	r2, [r0]  		str	r3, [r1]  		mov	pc, lr  ENDPROC(debug_ll_addr) +#endif  #else diff --git a/arch/arm/kernel/etm.c b/arch/arm/kernel/etm.c index 36d20bd5012..9b6de8c988f 100644 --- a/arch/arm/kernel/etm.c +++ b/arch/arm/kernel/etm.c @@ -339,7 +339,7 @@ static struct miscdevice etb_miscdev = {  	.fops = &etb_fops,  }; -static int __devinit etb_probe(struct amba_device *dev, const struct amba_id *id) +static int etb_probe(struct amba_device *dev, const struct amba_id *id)  {  	struct tracectx *t = &tracer;  	int ret = 0; @@ -531,7 +531,7 @@ static ssize_t trace_mode_store(struct kobject *kobj,  static struct kobj_attribute trace_mode_attr =  	__ATTR(trace_mode, 0644, trace_mode_show, trace_mode_store); -static int __devinit etm_probe(struct amba_device *dev, const struct amba_id *id) +static int etm_probe(struct amba_device *dev, const struct amba_id *id)  {  	struct tracectx *t = &tracer;  	int ret = 0; diff --git a/arch/arm/kernel/head.S b/arch/arm/kernel/head.S index 4eee351f466..486a15ae901 100644 --- a/arch/arm/kernel/head.S +++ b/arch/arm/kernel/head.S @@ -246,6 +246,7 @@ __create_page_tables:  	/*  	 * Then map boot params address in r2 if specified. +	 * We map 2 sections in case the ATAGs/DTB crosses a section boundary.  	 */  	mov	r0, r2, lsr #SECTION_SHIFT  	movs	r0, r0, lsl #SECTION_SHIFT @@ -253,6 +254,8 @@ __create_page_tables:  	addne	r3, r3, #PAGE_OFFSET  	addne	r3, r4, r3, lsr #(SECTION_SHIFT - PMD_ORDER)  	orrne	r6, r7, r0 +	strne	r6, [r3], #1 << PMD_ORDER +	addne	r6, r6, #1 << SECTION_SHIFT  	strne	r6, [r3]  #ifdef CONFIG_DEBUG_LL @@ -331,7 +334,7 @@ ENTRY(secondary_startup)  	 * as it has already been validated by the primary processor.  	 */  #ifdef CONFIG_ARM_VIRT_EXT -	bl	__hyp_stub_install +	bl	__hyp_stub_install_secondary  #endif  	safe_svcmode_maskall r9 diff --git a/arch/arm/kernel/hyp-stub.S b/arch/arm/kernel/hyp-stub.S index 65b2417aebc..1315c4ccfa5 100644 --- a/arch/arm/kernel/hyp-stub.S +++ b/arch/arm/kernel/hyp-stub.S @@ -99,7 +99,7 @@ ENTRY(__hyp_stub_install_secondary)  	 * immediately.  	 */  	compare_cpu_mode_with_primary	r4, r5, r6, r7 -	bxne	lr +	movne	pc, lr  	/*  	 * Once we have given up on one CPU, we do not try to install the @@ -111,7 +111,7 @@ ENTRY(__hyp_stub_install_secondary)  	 */  	cmp	r4, #HYP_MODE -	bxne	lr			@ give up if the CPU is not in HYP mode +	movne	pc, lr			@ give up if the CPU is not in HYP mode  /*   * Configure HSCTLR to set correct exception endianness/instruction set @@ -120,7 +120,8 @@ ENTRY(__hyp_stub_install_secondary)   * Eventually, CPU-specific code might be needed -- assume not for now   *   * This code relies on the "eret" instruction to synchronize the - * various coprocessor accesses. + * various coprocessor accesses. This is done when we switch to SVC + * (see safe_svcmode_maskall).   */  	@ Now install the hypervisor stub:  	adr	r7, __hyp_stub_vectors @@ -155,14 +156,7 @@ THUMB(	orr	r7, #(1 << 30)	)	@ HSCTLR.TE  1:  #endif -	bic	r7, r4, #MODE_MASK -	orr	r7, r7, #SVC_MODE -THUMB(	orr	r7, r7, #PSR_T_BIT	) -	msr	spsr_cxsf, r7		@ This is SPSR_hyp. - -	__MSR_ELR_HYP(14)		@ msr elr_hyp, lr -	__ERET				@ return, switching to SVC mode -					@ The boot CPU mode is left in r4. +	bx	lr			@ The boot CPU mode is left in r4.  ENDPROC(__hyp_stub_install_secondary)  __hyp_stub_do_trap: @@ -200,7 +194,7 @@ ENDPROC(__hyp_get_vectors)  	@ fall through  ENTRY(__hyp_set_vectors)  	__HVC(0) -	bx	lr +	mov	pc, lr  ENDPROC(__hyp_set_vectors)  #ifndef ZIMAGE diff --git a/arch/arm/kernel/perf_event_cpu.c b/arch/arm/kernel/perf_event_cpu.c index 9a4f6307a01..5f6620684e2 100644 --- a/arch/arm/kernel/perf_event_cpu.c +++ b/arch/arm/kernel/perf_event_cpu.c @@ -132,7 +132,7 @@ static int cpu_pmu_request_irq(struct arm_pmu *cpu_pmu, irq_handler_t handler)  	return 0;  } -static void __devinit cpu_pmu_init(struct arm_pmu *cpu_pmu) +static void cpu_pmu_init(struct arm_pmu *cpu_pmu)  {  	int cpu;  	for_each_possible_cpu(cpu) { @@ -178,7 +178,7 @@ static struct notifier_block __cpuinitdata cpu_pmu_hotplug_notifier = {  /*   * PMU platform driver and devicetree bindings.   */ -static struct of_device_id __devinitdata cpu_pmu_of_device_ids[] = { +static struct of_device_id cpu_pmu_of_device_ids[] = {  	{.compatible = "arm,cortex-a15-pmu",	.data = armv7_a15_pmu_init},  	{.compatible = "arm,cortex-a9-pmu",	.data = armv7_a9_pmu_init},  	{.compatible = "arm,cortex-a8-pmu",	.data = armv7_a8_pmu_init}, @@ -190,7 +190,7 @@ static struct of_device_id __devinitdata cpu_pmu_of_device_ids[] = {  	{},  }; -static struct platform_device_id __devinitdata cpu_pmu_plat_device_ids[] = { +static struct platform_device_id cpu_pmu_plat_device_ids[] = {  	{.name = "arm-pmu"},  	{},  }; @@ -198,7 +198,7 @@ static struct platform_device_id __devinitdata cpu_pmu_plat_device_ids[] = {  /*   * CPU PMU identification and probing.   */ -static int __devinit probe_current_pmu(struct arm_pmu *pmu) +static int probe_current_pmu(struct arm_pmu *pmu)  {  	int cpu = get_cpu();  	unsigned long cpuid = read_cpuid_id(); @@ -252,7 +252,7 @@ static int __devinit probe_current_pmu(struct arm_pmu *pmu)  	return ret;  } -static int __devinit cpu_pmu_device_probe(struct platform_device *pdev) +static int cpu_pmu_device_probe(struct platform_device *pdev)  {  	const struct of_device_id *of_id;  	int (*init_fn)(struct arm_pmu *); diff --git a/arch/arm/kernel/perf_event_v6.c b/arch/arm/kernel/perf_event_v6.c index f3e22ff8b6a..041d0526a28 100644 --- a/arch/arm/kernel/perf_event_v6.c +++ b/arch/arm/kernel/perf_event_v6.c @@ -653,7 +653,7 @@ static int armv6_map_event(struct perf_event *event)  				&armv6_perf_cache_map, 0xFF);  } -static int __devinit armv6pmu_init(struct arm_pmu *cpu_pmu) +static int armv6pmu_init(struct arm_pmu *cpu_pmu)  {  	cpu_pmu->name		= "v6";  	cpu_pmu->handle_irq	= armv6pmu_handle_irq; @@ -685,7 +685,7 @@ static int armv6mpcore_map_event(struct perf_event *event)  				&armv6mpcore_perf_cache_map, 0xFF);  } -static int __devinit armv6mpcore_pmu_init(struct arm_pmu *cpu_pmu) +static int armv6mpcore_pmu_init(struct arm_pmu *cpu_pmu)  {  	cpu_pmu->name		= "v6mpcore";  	cpu_pmu->handle_irq	= armv6pmu_handle_irq; diff --git a/arch/arm/kernel/perf_event_v7.c b/arch/arm/kernel/perf_event_v7.c index 7d0cce85d17..4fbc757d9cf 100644 --- a/arch/arm/kernel/perf_event_v7.c +++ b/arch/arm/kernel/perf_event_v7.c @@ -1226,7 +1226,7 @@ static void armv7pmu_init(struct arm_pmu *cpu_pmu)  	cpu_pmu->max_period	= (1LLU << 32) - 1;  }; -static u32 __devinit armv7_read_num_pmnc_events(void) +static u32 armv7_read_num_pmnc_events(void)  {  	u32 nb_cnt; @@ -1237,7 +1237,7 @@ static u32 __devinit armv7_read_num_pmnc_events(void)  	return nb_cnt + 1;  } -static int __devinit armv7_a8_pmu_init(struct arm_pmu *cpu_pmu) +static int armv7_a8_pmu_init(struct arm_pmu *cpu_pmu)  {  	armv7pmu_init(cpu_pmu);  	cpu_pmu->name		= "ARMv7 Cortex-A8"; @@ -1246,7 +1246,7 @@ static int __devinit armv7_a8_pmu_init(struct arm_pmu *cpu_pmu)  	return 0;  } -static int __devinit armv7_a9_pmu_init(struct arm_pmu *cpu_pmu) +static int armv7_a9_pmu_init(struct arm_pmu *cpu_pmu)  {  	armv7pmu_init(cpu_pmu);  	cpu_pmu->name		= "ARMv7 Cortex-A9"; @@ -1255,7 +1255,7 @@ static int __devinit armv7_a9_pmu_init(struct arm_pmu *cpu_pmu)  	return 0;  } -static int __devinit armv7_a5_pmu_init(struct arm_pmu *cpu_pmu) +static int armv7_a5_pmu_init(struct arm_pmu *cpu_pmu)  {  	armv7pmu_init(cpu_pmu);  	cpu_pmu->name		= "ARMv7 Cortex-A5"; @@ -1264,7 +1264,7 @@ static int __devinit armv7_a5_pmu_init(struct arm_pmu *cpu_pmu)  	return 0;  } -static int __devinit armv7_a15_pmu_init(struct arm_pmu *cpu_pmu) +static int armv7_a15_pmu_init(struct arm_pmu *cpu_pmu)  {  	armv7pmu_init(cpu_pmu);  	cpu_pmu->name		= "ARMv7 Cortex-A15"; @@ -1274,7 +1274,7 @@ static int __devinit armv7_a15_pmu_init(struct arm_pmu *cpu_pmu)  	return 0;  } -static int __devinit armv7_a7_pmu_init(struct arm_pmu *cpu_pmu) +static int armv7_a7_pmu_init(struct arm_pmu *cpu_pmu)  {  	armv7pmu_init(cpu_pmu);  	cpu_pmu->name		= "ARMv7 Cortex-A7"; diff --git a/arch/arm/kernel/perf_event_xscale.c b/arch/arm/kernel/perf_event_xscale.c index 0c8265e53d5..2b0fe30ec12 100644 --- a/arch/arm/kernel/perf_event_xscale.c +++ b/arch/arm/kernel/perf_event_xscale.c @@ -440,7 +440,7 @@ static int xscale_map_event(struct perf_event *event)  				&xscale_perf_cache_map, 0xFF);  } -static int __devinit xscale1pmu_init(struct arm_pmu *cpu_pmu) +static int xscale1pmu_init(struct arm_pmu *cpu_pmu)  {  	cpu_pmu->name		= "xscale1";  	cpu_pmu->handle_irq	= xscale1pmu_handle_irq; @@ -810,7 +810,7 @@ static inline void xscale2pmu_write_counter(struct perf_event *event, u32 val)  	}  } -static int __devinit xscale2pmu_init(struct arm_pmu *cpu_pmu) +static int xscale2pmu_init(struct arm_pmu *cpu_pmu)  {  	cpu_pmu->name		= "xscale2";  	cpu_pmu->handle_irq	= xscale2pmu_handle_irq; diff --git a/arch/arm/kernel/smp_scu.c b/arch/arm/kernel/smp_scu.c index b9f015e843d..45eac87ed66 100644 --- a/arch/arm/kernel/smp_scu.c +++ b/arch/arm/kernel/smp_scu.c @@ -75,7 +75,7 @@ void scu_enable(void __iomem *scu_base)  int scu_power_mode(void __iomem *scu_base, unsigned int mode)  {  	unsigned int val; -	int cpu = cpu_logical_map(smp_processor_id()); +	int cpu = MPIDR_AFFINITY_LEVEL(cpu_logical_map(smp_processor_id()), 0);  	if (mode > 3 || mode == 1 || cpu > 3)  		return -EINVAL; diff --git a/arch/arm/mach-at91/setup.c b/arch/arm/mach-at91/setup.c index 9ee866ce047..4b678478cf9 100644 --- a/arch/arm/mach-at91/setup.c +++ b/arch/arm/mach-at91/setup.c @@ -105,6 +105,8 @@ static void __init soc_detect(u32 dbgu_base)  	switch (socid) {  	case ARCH_ID_AT91RM9200:  		at91_soc_initdata.type = AT91_SOC_RM9200; +		if (at91_soc_initdata.subtype == AT91_SOC_SUBTYPE_NONE) +			at91_soc_initdata.subtype = AT91_SOC_RM9200_BGA;  		at91_boot_soc = at91rm9200_soc;  		break; diff --git a/arch/arm/mach-davinci/board-dm646x-evm.c b/arch/arm/mach-davinci/board-dm646x-evm.c index 9211e8800c7..6e2f1631df5 100644 --- a/arch/arm/mach-davinci/board-dm646x-evm.c +++ b/arch/arm/mach-davinci/board-dm646x-evm.c @@ -358,7 +358,7 @@ static int cpld_video_probe(struct i2c_client *client,  	return 0;  } -static int __devexit cpld_video_remove(struct i2c_client *client) +static int cpld_video_remove(struct i2c_client *client)  {  	cpld_client = NULL;  	return 0; diff --git a/arch/arm/mach-davinci/cdce949.c b/arch/arm/mach-davinci/cdce949.c index f2232ca6d07..abafb92031c 100644 --- a/arch/arm/mach-davinci/cdce949.c +++ b/arch/arm/mach-davinci/cdce949.c @@ -256,7 +256,7 @@ static int cdce_probe(struct i2c_client *client,  	return 0;  } -static int __devexit cdce_remove(struct i2c_client *client) +static int cdce_remove(struct i2c_client *client)  {  	cdce_i2c_client = NULL;  	return 0; @@ -274,7 +274,7 @@ static struct i2c_driver cdce_driver = {  		.name	= "cdce949",  	},  	.probe		= cdce_probe, -	.remove		= __devexit_p(cdce_remove), +	.remove		= cdce_remove,  	.id_table	= cdce_id,  }; diff --git a/arch/arm/mach-dove/pcie.c b/arch/arm/mach-dove/pcie.c index 0ef4435b165..8a275f29752 100644 --- a/arch/arm/mach-dove/pcie.c +++ b/arch/arm/mach-dove/pcie.c @@ -135,7 +135,7 @@ static struct pci_ops pcie_ops = {  	.write = pcie_wr_conf,  }; -static void __devinit rc_pci_fixup(struct pci_dev *dev) +static void rc_pci_fixup(struct pci_dev *dev)  {  	/*  	 * Prevent enumeration of root complex. diff --git a/arch/arm/mach-exynos/Kconfig b/arch/arm/mach-exynos/Kconfig index 91d5b6f1d5a..85afb031b67 100644 --- a/arch/arm/mach-exynos/Kconfig +++ b/arch/arm/mach-exynos/Kconfig @@ -74,6 +74,8 @@ config SOC_EXYNOS5440  	depends on ARCH_EXYNOS5  	select ARM_ARCH_TIMER  	select AUTO_ZRELADDR +	select PINCTRL +	select PINCTRL_EXYNOS5440  	help  	  Enable EXYNOS5440 SoC support @@ -412,7 +414,7 @@ config MACH_EXYNOS4_DT  	select CPU_EXYNOS4210  	select HAVE_SAMSUNG_KEYPAD if INPUT_KEYBOARD  	select PINCTRL -	select PINCTRL_EXYNOS4 +	select PINCTRL_EXYNOS  	select USE_OF  	help  	  Machine support for Samsung Exynos4 machine with device tree enabled. diff --git a/arch/arm/mach-exynos/common.c b/arch/arm/mach-exynos/common.c index d6d0dc65108..1a89824a5f7 100644 --- a/arch/arm/mach-exynos/common.c +++ b/arch/arm/mach-exynos/common.c @@ -424,11 +424,18 @@ static void __init exynos5_init_clocks(int xtal)  {  	printk(KERN_DEBUG "%s: initializing clocks\n", __func__); +	/* EXYNOS5440 can support only common clock framework */ + +	if (soc_is_exynos5440()) +		return; + +#ifdef CONFIG_SOC_EXYNOS5250  	s3c24xx_register_baseclocks(xtal);  	s5p_register_clocks(xtal);  	exynos5_register_clocks();  	exynos5_setup_clocks(); +#endif  }  #define COMBINER_ENABLE_SET	0x0 diff --git a/arch/arm/mach-highbank/highbank.c b/arch/arm/mach-highbank/highbank.c index dc248167d20..e6c06128293 100644 --- a/arch/arm/mach-highbank/highbank.c +++ b/arch/arm/mach-highbank/highbank.c @@ -28,6 +28,7 @@  #include <asm/arch_timer.h>  #include <asm/cacheflush.h> +#include <asm/cputype.h>  #include <asm/smp_plat.h>  #include <asm/smp_twd.h>  #include <asm/hardware/arm_timer.h> @@ -59,7 +60,7 @@ static void __init highbank_scu_map_io(void)  void highbank_set_cpu_jump(int cpu, void *jump_addr)  { -	cpu = cpu_logical_map(cpu); +	cpu = MPIDR_AFFINITY_LEVEL(cpu_logical_map(cpu), 0);  	writel(virt_to_phys(jump_addr), HB_JUMP_TABLE_VIRT(cpu));  	__cpuc_flush_dcache_area(HB_JUMP_TABLE_VIRT(cpu), 16);  	outer_clean_range(HB_JUMP_TABLE_PHYS(cpu), @@ -135,7 +136,7 @@ static struct sys_timer highbank_timer = {  static void highbank_power_off(void)  { -	hignbank_set_pwr_shutdown(); +	highbank_set_pwr_shutdown();  	while (1)  		cpu_do_idle(); diff --git a/arch/arm/mach-highbank/hotplug.c b/arch/arm/mach-highbank/hotplug.c index 7b60faccd55..f30c5284339 100644 --- a/arch/arm/mach-highbank/hotplug.c +++ b/arch/arm/mach-highbank/hotplug.c @@ -30,7 +30,7 @@ void __ref highbank_cpu_die(unsigned int cpu)  {  	flush_cache_all(); -	highbank_set_cpu_jump(cpu, secondary_startup); +	highbank_set_cpu_jump(cpu, phys_to_virt(0));  	highbank_set_core_pwr();  	cpu_do_idle(); diff --git a/arch/arm/mach-highbank/platsmp.c b/arch/arm/mach-highbank/platsmp.c index 1129957f6c1..4ecc864ac8b 100644 --- a/arch/arm/mach-highbank/platsmp.c +++ b/arch/arm/mach-highbank/platsmp.c @@ -32,6 +32,7 @@ static void __cpuinit highbank_secondary_init(unsigned int cpu)  static int __cpuinit highbank_boot_secondary(unsigned int cpu, struct task_struct *idle)  { +	highbank_set_cpu_jump(cpu, secondary_startup);  	gic_raise_softirq(cpumask_of(cpu), 0);  	return 0;  } @@ -61,19 +62,8 @@ static void __init highbank_smp_init_cpus(void)  static void __init highbank_smp_prepare_cpus(unsigned int max_cpus)  { -	int i; -  	if (scu_base_addr)  		scu_enable(scu_base_addr); - -	/* -	 * Write the address of secondary startup into the jump table -	 * The cores are in wfi and wait until they receive a soft interrupt -	 * and a non-zero value to jump to. Then the secondary CPU branches -	 * to this address. -	 */ -	for (i = 1; i < max_cpus; i++) -		highbank_set_cpu_jump(i, secondary_startup);  }  struct smp_operations highbank_smp_ops __initdata = { diff --git a/arch/arm/mach-highbank/pm.c b/arch/arm/mach-highbank/pm.c index 74aa135966f..04eddb4f438 100644 --- a/arch/arm/mach-highbank/pm.c +++ b/arch/arm/mach-highbank/pm.c @@ -14,10 +14,12 @@   * this program.  If not, see <http://www.gnu.org/licenses/>.   */ +#include <linux/cpu_pm.h>  #include <linux/init.h>  #include <linux/io.h>  #include <linux/suspend.h> +#include <asm/cacheflush.h>  #include <asm/proc-fns.h>  #include <asm/suspend.h> @@ -26,16 +28,31 @@  static int highbank_suspend_finish(unsigned long val)  { +	outer_flush_all(); +	outer_disable(); + +	highbank_set_pwr_suspend(); +  	cpu_do_idle(); + +	highbank_clear_pwr_request();  	return 0;  }  static int highbank_pm_enter(suspend_state_t state)  { -	hignbank_set_pwr_suspend(); +	cpu_pm_enter(); +	cpu_cluster_pm_enter(); +  	highbank_set_cpu_jump(0, cpu_resume);  	cpu_suspend(0, highbank_suspend_finish); +	cpu_cluster_pm_exit(); +	cpu_pm_exit(); + +	highbank_smc1(0x102, 0x1); +	if (scu_base_addr) +		scu_enable(scu_base_addr);  	return 0;  } diff --git a/arch/arm/mach-highbank/sysregs.h b/arch/arm/mach-highbank/sysregs.h index e13e8ea7c6c..5995df7f262 100644 --- a/arch/arm/mach-highbank/sysregs.h +++ b/arch/arm/mach-highbank/sysregs.h @@ -37,35 +37,50 @@ extern void __iomem *sregs_base;  static inline void highbank_set_core_pwr(void)  { -	int cpu = cpu_logical_map(smp_processor_id()); +	int cpu = MPIDR_AFFINITY_LEVEL(cpu_logical_map(smp_processor_id()), 0);  	if (scu_base_addr)  		scu_power_mode(scu_base_addr, SCU_PM_POWEROFF);  	else  		writel_relaxed(1, sregs_base + SREG_CPU_PWR_CTRL(cpu));  } -static inline void hignbank_set_pwr_suspend(void) +static inline void highbank_clear_core_pwr(void) +{ +	int cpu = MPIDR_AFFINITY_LEVEL(cpu_logical_map(smp_processor_id()), 0); +	if (scu_base_addr) +		scu_power_mode(scu_base_addr, SCU_PM_NORMAL); +	else +		writel_relaxed(0, sregs_base + SREG_CPU_PWR_CTRL(cpu)); +} + +static inline void highbank_set_pwr_suspend(void)  {  	writel(HB_PWR_SUSPEND, sregs_base + HB_SREG_A9_PWR_REQ);  	highbank_set_core_pwr();  } -static inline void hignbank_set_pwr_shutdown(void) +static inline void highbank_set_pwr_shutdown(void)  {  	writel(HB_PWR_SHUTDOWN, sregs_base + HB_SREG_A9_PWR_REQ);  	highbank_set_core_pwr();  } -static inline void hignbank_set_pwr_soft_reset(void) +static inline void highbank_set_pwr_soft_reset(void)  {  	writel(HB_PWR_SOFT_RESET, sregs_base + HB_SREG_A9_PWR_REQ);  	highbank_set_core_pwr();  } -static inline void hignbank_set_pwr_hard_reset(void) +static inline void highbank_set_pwr_hard_reset(void)  {  	writel(HB_PWR_HARD_RESET, sregs_base + HB_SREG_A9_PWR_REQ);  	highbank_set_core_pwr();  } +static inline void highbank_clear_pwr_request(void) +{ +	writel(~0UL, sregs_base + HB_SREG_A9_PWR_REQ); +	highbank_clear_core_pwr(); +} +  #endif diff --git a/arch/arm/mach-highbank/system.c b/arch/arm/mach-highbank/system.c index aed96ad9bd4..37d8384dcf1 100644 --- a/arch/arm/mach-highbank/system.c +++ b/arch/arm/mach-highbank/system.c @@ -22,9 +22,9 @@  void highbank_restart(char mode, const char *cmd)  {  	if (mode == 'h') -		hignbank_set_pwr_hard_reset(); +		highbank_set_pwr_hard_reset();  	else -		hignbank_set_pwr_soft_reset(); +		highbank_set_pwr_soft_reset();  	while (1)  		cpu_do_idle(); diff --git a/arch/arm/mach-imx/Kconfig b/arch/arm/mach-imx/Kconfig index 1ad0d76de8c..0a2349dc701 100644 --- a/arch/arm/mach-imx/Kconfig +++ b/arch/arm/mach-imx/Kconfig @@ -841,8 +841,6 @@ config SOC_IMX6Q  	select ARCH_HAS_CPUFREQ  	select ARCH_HAS_OPP  	select ARM_CPU_SUSPEND if PM -	select ARM_ERRATA_743622 -	select ARM_ERRATA_751472  	select ARM_ERRATA_754322  	select ARM_ERRATA_764369 if SMP  	select ARM_ERRATA_775420 @@ -853,6 +851,7 @@ config SOC_IMX6Q  	select HAVE_CAN_FLEXCAN if CAN  	select HAVE_IMX_GPC  	select HAVE_IMX_MMDC +	select HAVE_IMX_SRC  	select HAVE_SMP  	select MFD_SYSCON  	select PINCTRL diff --git a/arch/arm/mach-imx/clk-imx25.c b/arch/arm/mach-imx/clk-imx25.c index b197aa73dc4..2c570cdaae7 100644 --- a/arch/arm/mach-imx/clk-imx25.c +++ b/arch/arm/mach-imx/clk-imx25.c @@ -254,9 +254,9 @@ int __init mx25_clocks_init(void)  	clk_register_clkdev(clk[ipg], "ipg", "mxc-ehci.2");  	clk_register_clkdev(clk[usbotg_ahb], "ahb", "mxc-ehci.2");  	clk_register_clkdev(clk[usb_div], "per", "mxc-ehci.2"); -	clk_register_clkdev(clk[ipg], "ipg", "fsl-usb2-udc"); -	clk_register_clkdev(clk[usbotg_ahb], "ahb", "fsl-usb2-udc"); -	clk_register_clkdev(clk[usb_div], "per", "fsl-usb2-udc"); +	clk_register_clkdev(clk[ipg], "ipg", "imx-udc-mx27"); +	clk_register_clkdev(clk[usbotg_ahb], "ahb", "imx-udc-mx27"); +	clk_register_clkdev(clk[usb_div], "per", "imx-udc-mx27");  	clk_register_clkdev(clk[nfc_ipg_per], NULL, "imx25-nand.0");  	/* i.mx25 has the i.mx35 type cspi */  	clk_register_clkdev(clk[cspi1_ipg], NULL, "imx35-cspi.0"); diff --git a/arch/arm/mach-imx/clk-imx27.c b/arch/arm/mach-imx/clk-imx27.c index 4c1d1e4efc7..1ffe3b534e5 100644 --- a/arch/arm/mach-imx/clk-imx27.c +++ b/arch/arm/mach-imx/clk-imx27.c @@ -236,9 +236,9 @@ int __init mx27_clocks_init(unsigned long fref)  	clk_register_clkdev(clk[lcdc_ahb_gate], "ahb", "imx21-fb.0");  	clk_register_clkdev(clk[csi_ahb_gate], "ahb", "imx27-camera.0");  	clk_register_clkdev(clk[per4_gate], "per", "imx27-camera.0"); -	clk_register_clkdev(clk[usb_div], "per", "fsl-usb2-udc"); -	clk_register_clkdev(clk[usb_ipg_gate], "ipg", "fsl-usb2-udc"); -	clk_register_clkdev(clk[usb_ahb_gate], "ahb", "fsl-usb2-udc"); +	clk_register_clkdev(clk[usb_div], "per", "imx-udc-mx27"); +	clk_register_clkdev(clk[usb_ipg_gate], "ipg", "imx-udc-mx27"); +	clk_register_clkdev(clk[usb_ahb_gate], "ahb", "imx-udc-mx27");  	clk_register_clkdev(clk[usb_div], "per", "mxc-ehci.0");  	clk_register_clkdev(clk[usb_ipg_gate], "ipg", "mxc-ehci.0");  	clk_register_clkdev(clk[usb_ahb_gate], "ahb", "mxc-ehci.0"); diff --git a/arch/arm/mach-imx/clk-imx31.c b/arch/arm/mach-imx/clk-imx31.c index 8be64e0a4ac..16ccbd41dea 100644 --- a/arch/arm/mach-imx/clk-imx31.c +++ b/arch/arm/mach-imx/clk-imx31.c @@ -139,9 +139,9 @@ int __init mx31_clocks_init(unsigned long fref)  	clk_register_clkdev(clk[usb_div_post], "per", "mxc-ehci.2");  	clk_register_clkdev(clk[usb_gate], "ahb", "mxc-ehci.2");  	clk_register_clkdev(clk[ipg], "ipg", "mxc-ehci.2"); -	clk_register_clkdev(clk[usb_div_post], "per", "fsl-usb2-udc"); -	clk_register_clkdev(clk[usb_gate], "ahb", "fsl-usb2-udc"); -	clk_register_clkdev(clk[ipg], "ipg", "fsl-usb2-udc"); +	clk_register_clkdev(clk[usb_div_post], "per", "imx-udc-mx27"); +	clk_register_clkdev(clk[usb_gate], "ahb", "imx-udc-mx27"); +	clk_register_clkdev(clk[ipg], "ipg", "imx-udc-mx27");  	clk_register_clkdev(clk[csi_gate], NULL, "mx3-camera.0");  	/* i.mx31 has the i.mx21 type uart */  	clk_register_clkdev(clk[uart1_gate], "per", "imx21-uart.0"); diff --git a/arch/arm/mach-imx/clk-imx35.c b/arch/arm/mach-imx/clk-imx35.c index 66f3d65ea27..f0727e80815 100644 --- a/arch/arm/mach-imx/clk-imx35.c +++ b/arch/arm/mach-imx/clk-imx35.c @@ -251,9 +251,9 @@ int __init mx35_clocks_init()  	clk_register_clkdev(clk[usb_div], "per", "mxc-ehci.2");  	clk_register_clkdev(clk[ipg], "ipg", "mxc-ehci.2");  	clk_register_clkdev(clk[usbotg_gate], "ahb", "mxc-ehci.2"); -	clk_register_clkdev(clk[usb_div], "per", "fsl-usb2-udc"); -	clk_register_clkdev(clk[ipg], "ipg", "fsl-usb2-udc"); -	clk_register_clkdev(clk[usbotg_gate], "ahb", "fsl-usb2-udc"); +	clk_register_clkdev(clk[usb_div], "per", "imx-udc-mx27"); +	clk_register_clkdev(clk[ipg], "ipg", "imx-udc-mx27"); +	clk_register_clkdev(clk[usbotg_gate], "ahb", "imx-udc-mx27");  	clk_register_clkdev(clk[wdog_gate], NULL, "imx2-wdt.0");  	clk_register_clkdev(clk[nfc_div], NULL, "imx25-nand.0");  	clk_register_clkdev(clk[csi_gate], NULL, "mx3-camera.0"); diff --git a/arch/arm/mach-imx/clk-imx51-imx53.c b/arch/arm/mach-imx/clk-imx51-imx53.c index 579023f59dc..fb7cb841b64 100644 --- a/arch/arm/mach-imx/clk-imx51-imx53.c +++ b/arch/arm/mach-imx/clk-imx51-imx53.c @@ -269,9 +269,9 @@ static void __init mx5_clocks_common_init(unsigned long rate_ckil,  	clk_register_clkdev(clk[usboh3_per_gate], "per", "mxc-ehci.2");  	clk_register_clkdev(clk[usboh3_gate], "ipg", "mxc-ehci.2");  	clk_register_clkdev(clk[usboh3_gate], "ahb", "mxc-ehci.2"); -	clk_register_clkdev(clk[usboh3_per_gate], "per", "fsl-usb2-udc"); -	clk_register_clkdev(clk[usboh3_gate], "ipg", "fsl-usb2-udc"); -	clk_register_clkdev(clk[usboh3_gate], "ahb", "fsl-usb2-udc"); +	clk_register_clkdev(clk[usboh3_per_gate], "per", "imx-udc-mx51"); +	clk_register_clkdev(clk[usboh3_gate], "ipg", "imx-udc-mx51"); +	clk_register_clkdev(clk[usboh3_gate], "ahb", "imx-udc-mx51");  	clk_register_clkdev(clk[nfc_gate], NULL, "imx51-nand");  	clk_register_clkdev(clk[ssi1_ipg_gate], NULL, "imx-ssi.0");  	clk_register_clkdev(clk[ssi2_ipg_gate], NULL, "imx-ssi.1"); diff --git a/arch/arm/mach-imx/clk-imx6q.c b/arch/arm/mach-imx/clk-imx6q.c index 7f2c10c7413..c0c4e723b7f 100644 --- a/arch/arm/mach-imx/clk-imx6q.c +++ b/arch/arm/mach-imx/clk-imx6q.c @@ -436,6 +436,9 @@ int __init mx6q_clocks_init(void)  	for (i = 0; i < ARRAY_SIZE(clks_init_on); i++)  		clk_prepare_enable(clk[clks_init_on[i]]); +	/* Set initial power mode */ +	imx6q_set_lpm(WAIT_CLOCKED); +  	np = of_find_compatible_node(NULL, NULL, "fsl,imx6q-gpt");  	base = of_iomap(np, 0);  	WARN_ON(!base); diff --git a/arch/arm/mach-imx/common.h b/arch/arm/mach-imx/common.h index 7191ab4434e..fa36fb84ab1 100644 --- a/arch/arm/mach-imx/common.h +++ b/arch/arm/mach-imx/common.h @@ -142,6 +142,7 @@ extern int imx6q_set_lpm(enum mxc_cpu_pwr_mode mode);  extern void imx6q_clock_map_io(void);  extern void imx_cpu_die(unsigned int cpu); +extern int imx_cpu_kill(unsigned int cpu);  #ifdef CONFIG_PM  extern void imx6q_pm_init(void); diff --git a/arch/arm/mach-imx/cpufreq.c b/arch/arm/mach-imx/cpufreq.c index 36e8b399447..d8c75c3c925 100644 --- a/arch/arm/mach-imx/cpufreq.c +++ b/arch/arm/mach-imx/cpufreq.c @@ -188,7 +188,7 @@ static struct cpufreq_driver mxc_driver = {  	.name = "imx",  }; -static int __devinit mxc_cpufreq_driver_init(void) +static int mxc_cpufreq_driver_init(void)  {  	return cpufreq_register_driver(&mxc_driver);  } diff --git a/arch/arm/mach-imx/devices/devices-common.h b/arch/arm/mach-imx/devices/devices-common.h index 6277baf1b7b..9bd5777ff0e 100644 --- a/arch/arm/mach-imx/devices/devices-common.h +++ b/arch/arm/mach-imx/devices/devices-common.h @@ -63,6 +63,7 @@ struct platform_device *__init imx_add_flexcan(  #include <linux/fsl_devices.h>  struct imx_fsl_usb2_udc_data { +	const char *devid;  	resource_size_t iobase;  	resource_size_t irq;  }; diff --git a/arch/arm/mach-imx/devices/platform-fsl-usb2-udc.c b/arch/arm/mach-imx/devices/platform-fsl-usb2-udc.c index 37e44398197..3c06bd96e9c 100644 --- a/arch/arm/mach-imx/devices/platform-fsl-usb2-udc.c +++ b/arch/arm/mach-imx/devices/platform-fsl-usb2-udc.c @@ -11,35 +11,36 @@  #include "../hardware.h"  #include "devices-common.h" -#define imx_fsl_usb2_udc_data_entry_single(soc)				\ +#define imx_fsl_usb2_udc_data_entry_single(soc, _devid)			\  	{								\ +		.devid = _devid,					\  		.iobase = soc ## _USB_OTG_BASE_ADDR,			\  		.irq = soc ## _INT_USB_OTG,				\  	}  #ifdef CONFIG_SOC_IMX25  const struct imx_fsl_usb2_udc_data imx25_fsl_usb2_udc_data __initconst = -	imx_fsl_usb2_udc_data_entry_single(MX25); +	imx_fsl_usb2_udc_data_entry_single(MX25, "imx-udc-mx27");  #endif /* ifdef CONFIG_SOC_IMX25 */  #ifdef CONFIG_SOC_IMX27  const struct imx_fsl_usb2_udc_data imx27_fsl_usb2_udc_data __initconst = -	imx_fsl_usb2_udc_data_entry_single(MX27); +	imx_fsl_usb2_udc_data_entry_single(MX27, "imx-udc-mx27");  #endif /* ifdef CONFIG_SOC_IMX27 */  #ifdef CONFIG_SOC_IMX31  const struct imx_fsl_usb2_udc_data imx31_fsl_usb2_udc_data __initconst = -	imx_fsl_usb2_udc_data_entry_single(MX31); +	imx_fsl_usb2_udc_data_entry_single(MX31, "imx-udc-mx27");  #endif /* ifdef CONFIG_SOC_IMX31 */  #ifdef CONFIG_SOC_IMX35  const struct imx_fsl_usb2_udc_data imx35_fsl_usb2_udc_data __initconst = -	imx_fsl_usb2_udc_data_entry_single(MX35); +	imx_fsl_usb2_udc_data_entry_single(MX35, "imx-udc-mx27");  #endif /* ifdef CONFIG_SOC_IMX35 */  #ifdef CONFIG_SOC_IMX51  const struct imx_fsl_usb2_udc_data imx51_fsl_usb2_udc_data __initconst = -	imx_fsl_usb2_udc_data_entry_single(MX51); +	imx_fsl_usb2_udc_data_entry_single(MX51, "imx-udc-mx51");  #endif  struct platform_device *__init imx_add_fsl_usb2_udc( @@ -57,7 +58,7 @@ struct platform_device *__init imx_add_fsl_usb2_udc(  			.flags = IORESOURCE_IRQ,  		},  	}; -	return imx_add_platform_device_dmamask("fsl-usb2-udc", -1, +	return imx_add_platform_device_dmamask(data->devid, -1,  			res, ARRAY_SIZE(res),  			pdata, sizeof(*pdata), DMA_BIT_MASK(32));  } diff --git a/arch/arm/mach-imx/devices/platform-imx-fb.c b/arch/arm/mach-imx/devices/platform-imx-fb.c index 10b0ed39f07..25a47c616b2 100644 --- a/arch/arm/mach-imx/devices/platform-imx-fb.c +++ b/arch/arm/mach-imx/devices/platform-imx-fb.c @@ -54,7 +54,7 @@ struct platform_device *__init imx_add_imx_fb(  			.flags = IORESOURCE_IRQ,  		},  	}; -	return imx_add_platform_device_dmamask("imx-fb", 0, +	return imx_add_platform_device_dmamask(data->devid, 0,  			res, ARRAY_SIZE(res),  			pdata, sizeof(*pdata), DMA_BIT_MASK(32));  } diff --git a/arch/arm/mach-imx/hotplug.c b/arch/arm/mach-imx/hotplug.c index 3dec962b077..7bc5fe15dda 100644 --- a/arch/arm/mach-imx/hotplug.c +++ b/arch/arm/mach-imx/hotplug.c @@ -46,9 +46,11 @@ static inline void cpu_enter_lowpower(void)  void imx_cpu_die(unsigned int cpu)  {  	cpu_enter_lowpower(); -	imx_enable_cpu(cpu, false); +	cpu_do_idle(); +} -	/* spin here until hardware takes it down */ -	while (1) -		; +int imx_cpu_kill(unsigned int cpu) +{ +	imx_enable_cpu(cpu, false); +	return 1;  } diff --git a/arch/arm/mach-imx/iram.h b/arch/arm/mach-imx/iram.h deleted file mode 100644 index 022690c3370..00000000000 --- a/arch/arm/mach-imx/iram.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2010 Freescale Semiconductor, Inc. All Rights Reserved. - * - * 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. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, - * MA 02110-1301, USA. - */ -#include <linux/errno.h> - -#ifdef CONFIG_IRAM_ALLOC - -int __init iram_init(unsigned long base, unsigned long size); -void __iomem *iram_alloc(unsigned int size, unsigned long *dma_addr); -void iram_free(unsigned long dma_addr, unsigned int size); - -#else - -static inline int __init iram_init(unsigned long base, unsigned long size) -{ -	return -ENOMEM; -} - -static inline void __iomem *iram_alloc(unsigned int size, unsigned long *dma_addr) -{ -	return NULL; -} - -static inline void iram_free(unsigned long base, unsigned long size) {} - -#endif diff --git a/arch/arm/mach-imx/iram_alloc.c b/arch/arm/mach-imx/iram_alloc.c index 6c80424f678..e05cf407db6 100644 --- a/arch/arm/mach-imx/iram_alloc.c +++ b/arch/arm/mach-imx/iram_alloc.c @@ -22,8 +22,7 @@  #include <linux/module.h>  #include <linux/spinlock.h>  #include <linux/genalloc.h> - -#include "iram.h" +#include "linux/platform_data/imx-iram.h"  static unsigned long iram_phys_base;  static void __iomem *iram_virt_base; diff --git a/arch/arm/mach-imx/mmdc.c b/arch/arm/mach-imx/mmdc.c index c461e98496c..7a9686ad994 100644 --- a/arch/arm/mach-imx/mmdc.c +++ b/arch/arm/mach-imx/mmdc.c @@ -21,7 +21,7 @@  #define BP_MMDC_MAPSR_PSD	0  #define BP_MMDC_MAPSR_PSS	4 -static int __devinit imx_mmdc_probe(struct platform_device *pdev) +static int imx_mmdc_probe(struct platform_device *pdev)  {  	struct device_node *np = pdev->dev.of_node;  	void __iomem *mmdc_base, *reg; diff --git a/arch/arm/mach-imx/platsmp.c b/arch/arm/mach-imx/platsmp.c index 3777b805b76..66fae885c84 100644 --- a/arch/arm/mach-imx/platsmp.c +++ b/arch/arm/mach-imx/platsmp.c @@ -92,5 +92,6 @@ struct smp_operations  imx_smp_ops __initdata = {  	.smp_boot_secondary	= imx_boot_secondary,  #ifdef CONFIG_HOTPLUG_CPU  	.cpu_die		= imx_cpu_die, +	.cpu_kill		= imx_cpu_kill,  #endif  }; diff --git a/arch/arm/mach-imx/pm-imx6q.c b/arch/arm/mach-imx/pm-imx6q.c index a17543da602..ee42d20cba1 100644 --- a/arch/arm/mach-imx/pm-imx6q.c +++ b/arch/arm/mach-imx/pm-imx6q.c @@ -41,6 +41,7 @@ static int imx6q_pm_enter(suspend_state_t state)  		cpu_suspend(0, imx6q_suspend_finish);  		imx_smp_prepare();  		imx_gpc_post_resume(); +		imx6q_set_lpm(WAIT_CLOCKED);  		break;  	default:  		return -EINVAL; diff --git a/arch/arm/mach-integrator/pci_v3.c b/arch/arm/mach-integrator/pci_v3.c index be50e795536..e7fcea7f330 100644 --- a/arch/arm/mach-integrator/pci_v3.c +++ b/arch/arm/mach-integrator/pci_v3.c @@ -475,13 +475,12 @@ int __init pci_v3_setup(int nr, struct pci_sys_data *sys)  {  	int ret = 0; +	if (!ap_syscon_base) +		return -EINVAL; +  	if (nr == 0) {  		sys->mem_offset = PHYS_PCI_MEM_BASE;  		ret = pci_v3_setup_resources(sys); -		/* Remap the Integrator system controller */ -		ap_syscon_base = ioremap(INTEGRATOR_SC_BASE, 0x100); -		if (!ap_syscon_base) -			return -EINVAL;  	}  	return ret; @@ -497,6 +496,13 @@ void __init pci_v3_preinit(void)  	unsigned int temp;  	int ret; +	/* Remap the Integrator system controller */ +	ap_syscon_base = ioremap(INTEGRATOR_SC_BASE, 0x100); +	if (!ap_syscon_base) { +		pr_err("unable to remap the AP syscon for PCIv3\n"); +		return; +	} +  	pcibios_min_mem = 0x00100000;  	/* diff --git a/arch/arm/mach-iop13xx/pci.c b/arch/arm/mach-iop13xx/pci.c index 2f28018c444..9082b84aeeb 100644 --- a/arch/arm/mach-iop13xx/pci.c +++ b/arch/arm/mach-iop13xx/pci.c @@ -504,7 +504,7 @@ iop13xx_pci_abort(unsigned long addr, unsigned int fsr, struct pt_regs *regs)  /* Scan an IOP13XX PCI bus.  nr selects which ATU we use.   */ -struct pci_bus * __devinit iop13xx_scan_bus(int nr, struct pci_sys_data *sys) +struct pci_bus *iop13xx_scan_bus(int nr, struct pci_sys_data *sys)  {  	int which_atu;  	struct pci_bus *bus = NULL; diff --git a/arch/arm/mach-kirkwood/board-dt.c b/arch/arm/mach-kirkwood/board-dt.c index ff4150a2ad0..de4fd2bb1e2 100644 --- a/arch/arm/mach-kirkwood/board-dt.c +++ b/arch/arm/mach-kirkwood/board-dt.c @@ -67,6 +67,10 @@ static void __init kirkwood_legacy_clk_init(void)  	orion_clkdev_add(NULL, "mv643xx_eth_port.1",  			 of_clk_get_from_provider(&clkspec)); +	clkspec.args[0] = CGC_BIT_SDIO; +	orion_clkdev_add(NULL, "mvsdio", +			 of_clk_get_from_provider(&clkspec)); +  }  static void __init kirkwood_of_clk_init(void) diff --git a/arch/arm/mach-kirkwood/board-ns2.c b/arch/arm/mach-kirkwood/board-ns2.c index 8821720ab5a..f4632a809f6 100644 --- a/arch/arm/mach-kirkwood/board-ns2.c +++ b/arch/arm/mach-kirkwood/board-ns2.c @@ -18,47 +18,11 @@  #include <linux/gpio.h>  #include <linux/of.h>  #include "common.h" -#include "mpp.h"  static struct mv643xx_eth_platform_data ns2_ge00_data = {  	.phy_addr	= MV643XX_ETH_PHY_ADDR(8),  }; -static unsigned int ns2_mpp_config[] __initdata = { -	MPP0_SPI_SCn, -	MPP1_SPI_MOSI, -	MPP2_SPI_SCK, -	MPP3_SPI_MISO, -	MPP4_NF_IO6, -	MPP5_NF_IO7, -	MPP6_SYSRST_OUTn, -	MPP7_GPO,		/* Fan speed (bit 1) */ -	MPP8_TW0_SDA, -	MPP9_TW0_SCK, -	MPP10_UART0_TXD, -	MPP11_UART0_RXD, -	MPP12_GPO,		/* Red led */ -	MPP14_GPIO,		/* USB fuse */ -	MPP16_GPIO,		/* SATA 0 power */ -	MPP17_GPIO,		/* SATA 1 power */ -	MPP18_NF_IO0, -	MPP19_NF_IO1, -	MPP20_SATA1_ACTn, -	MPP21_SATA0_ACTn, -	MPP22_GPIO,		/* Fan speed (bit 0) */ -	MPP23_GPIO,		/* Fan power */ -	MPP24_GPIO,		/* USB mode select */ -	MPP25_GPIO,		/* Fan rotation fail */ -	MPP26_GPIO,		/* USB device vbus */ -	MPP28_GPIO,		/* USB enable host vbus */ -	MPP29_GPIO,		/* Blue led (slow register) */ -	MPP30_GPIO,		/* Blue led (command register) */ -	MPP31_GPIO,		/* Board power off */ -	MPP32_GPIO,		/* Power button (0 = Released, 1 = Pushed) */ -	MPP33_GPO,		/* Fan speed (bit 2) */ -	0 -}; -  #define NS2_GPIO_POWER_OFF	31  static void ns2_power_off(void) @@ -71,8 +35,6 @@ void __init ns2_init(void)  	/*  	 * Basic setup. Needs to be called early.  	 */ -	kirkwood_mpp_conf(ns2_mpp_config); -  	if (of_machine_is_compatible("lacie,netspace_lite_v2") ||  	    of_machine_is_compatible("lacie,netspace_mini_v2"))  		ns2_ge00_data.phy_addr = MV643XX_ETH_PHY_ADDR(0); diff --git a/arch/arm/mach-kirkwood/board-usi_topkick.c b/arch/arm/mach-kirkwood/board-usi_topkick.c index 15e69fcde9f..23d2dd1b1b1 100644 --- a/arch/arm/mach-kirkwood/board-usi_topkick.c +++ b/arch/arm/mach-kirkwood/board-usi_topkick.c @@ -64,8 +64,6 @@ static unsigned int topkick_mpp_config[] __initdata = {  	0  }; -#define TOPKICK_SATA0_PWR_ENABLE 36 -  void __init usi_topkick_init(void)  {  	/* @@ -73,8 +71,6 @@ void __init usi_topkick_init(void)  	 */  	kirkwood_mpp_conf(topkick_mpp_config); -	/* SATA0 power enable */ -	gpio_set_value(TOPKICK_SATA0_PWR_ENABLE, 1);  	kirkwood_ge00_init(&topkick_ge00_data);  	kirkwood_sdio_init(&topkick_mvsdio_data); diff --git a/arch/arm/mach-kirkwood/pcie.c b/arch/arm/mach-kirkwood/pcie.c index ef102646ba9..a1c3ab6fc80 100644 --- a/arch/arm/mach-kirkwood/pcie.c +++ b/arch/arm/mach-kirkwood/pcie.c @@ -214,7 +214,7 @@ static int __init kirkwood_pcie_setup(int nr, struct pci_sys_data *sys)   * PCI_CLASS_BRIDGE_HOST or Linux will errantly try to process the BAR's on   * the device. Decoding setup is handled by the orion code.   */ -static void __devinit rc_pci_fixup(struct pci_dev *dev) +static void rc_pci_fixup(struct pci_dev *dev)  {  	if (dev->bus->parent == NULL && dev->devfn == 0) {  		int i; diff --git a/arch/arm/mach-ks8695/board-acs5k.c b/arch/arm/mach-ks8695/board-acs5k.c index 255502ddd87..b0c306ccbc6 100644 --- a/arch/arm/mach-ks8695/board-acs5k.c +++ b/arch/arm/mach-ks8695/board-acs5k.c @@ -92,7 +92,7 @@ static struct i2c_board_info acs5k_i2c_devs[] __initdata = {  	},  }; -static void __devinit acs5k_i2c_init(void) +static void acs5k_i2c_init(void)  {  	/* The gpio interface */  	platform_device_register(&acs5k_i2c_device); diff --git a/arch/arm/mach-mmp/sram.c b/arch/arm/mach-mmp/sram.c index a6c08ede449..bf5e64906e6 100644 --- a/arch/arm/mach-mmp/sram.c +++ b/arch/arm/mach-mmp/sram.c @@ -61,7 +61,7 @@ struct gen_pool *sram_get_gpool(char *pool_name)  }  EXPORT_SYMBOL(sram_get_gpool); -static int __devinit sram_probe(struct platform_device *pdev) +static int sram_probe(struct platform_device *pdev)  {  	struct sram_platdata *pdata = pdev->dev.platform_data;  	struct sram_bank_info *info; @@ -125,7 +125,7 @@ out:  	return ret;  } -static int __devexit sram_remove(struct platform_device *pdev) +static int sram_remove(struct platform_device *pdev)  {  	struct sram_bank_info *info; diff --git a/arch/arm/mach-msm/proc_comm.c b/arch/arm/mach-msm/proc_comm.c index 8f1eecd8818..507f5ca8069 100644 --- a/arch/arm/mach-msm/proc_comm.c +++ b/arch/arm/mach-msm/proc_comm.c @@ -120,7 +120,7 @@ int msm_proc_comm(unsigned cmd, unsigned *data1, unsigned *data2)   * and unknown state. This function should be called early to   * wait on the ARM9.   */ -void __devinit proc_comm_boot_wait(void) +void proc_comm_boot_wait(void)  {  	void __iomem *base = MSM_SHARED_RAM_BASE; diff --git a/arch/arm/mach-msm/smd.c b/arch/arm/mach-msm/smd.c index c5a2eddc6cd..b1588a1ea2f 100644 --- a/arch/arm/mach-msm/smd.c +++ b/arch/arm/mach-msm/smd.c @@ -988,7 +988,7 @@ int smd_core_init(void)  	return 0;  } -static int __devinit msm_smd_probe(struct platform_device *pdev) +static int msm_smd_probe(struct platform_device *pdev)  {  	/*  	 * If we haven't waited for the ARM9 to boot up till now, diff --git a/arch/arm/mach-mv78xx0/pcie.c b/arch/arm/mach-mv78xx0/pcie.c index a9a154a646d..ee8c0b51df2 100644 --- a/arch/arm/mach-mv78xx0/pcie.c +++ b/arch/arm/mach-mv78xx0/pcie.c @@ -173,7 +173,7 @@ static struct pci_ops pcie_ops = {  	.write = pcie_wr_conf,  }; -static void __devinit rc_pci_fixup(struct pci_dev *dev) +static void rc_pci_fixup(struct pci_dev *dev)  {  	/*  	 * Prevent enumeration of root complex. diff --git a/arch/arm/mach-mvebu/Makefile b/arch/arm/mach-mvebu/Makefile index 5dcb369b58a..99df4df680f 100644 --- a/arch/arm/mach-mvebu/Makefile +++ b/arch/arm/mach-mvebu/Makefile @@ -1,6 +1,8 @@  ccflags-$(CONFIG_ARCH_MULTIPLATFORM) := -I$(srctree)/$(src)/include \  	-I$(srctree)/arch/arm/plat-orion/include +AFLAGS_coherency_ll.o		:= -Wa,-march=armv7-a +  obj-y += system-controller.o  obj-$(CONFIG_MACH_ARMADA_370_XP) += armada-370-xp.o irq-armada-370-xp.o addr-map.o coherency.o coherency_ll.o pmsu.o  obj-$(CONFIG_SMP)                += platsmp.o headsmp.o diff --git a/arch/arm/mach-nomadik/board-nhk8815.c b/arch/arm/mach-nomadik/board-nhk8815.c index 98167a4319f..9f19069248d 100644 --- a/arch/arm/mach-nomadik/board-nhk8815.c +++ b/arch/arm/mach-nomadik/board-nhk8815.c @@ -27,7 +27,6 @@  #include <linux/pinctrl/machine.h>  #include <linux/platform_data/pinctrl-nomadik.h>  #include <linux/platform_data/clocksource-nomadik-mtu.h> -#include <linux/platform_data/mtd-nomadik-nand.h>  #include <asm/hardware/vic.h>  #include <asm/sizes.h>  #include <asm/mach-types.h> diff --git a/arch/arm/mach-nomadik/include/mach/irqs.h b/arch/arm/mach-nomadik/include/mach/irqs.h index b549d057154..215f8cdb400 100644 --- a/arch/arm/mach-nomadik/include/mach/irqs.h +++ b/arch/arm/mach-nomadik/include/mach/irqs.h @@ -22,49 +22,49 @@  #include <mach/hardware.h> -#define IRQ_VIC_START		1	/* first VIC interrupt is 1 */ +#define IRQ_VIC_START		32	/* first VIC interrupt is 1 */  /*   * Interrupt numbers generic for all Nomadik Chip cuts   */ -#define IRQ_WATCHDOG			1 -#define IRQ_SOFTINT			2 -#define IRQ_CRYPTO			3 -#define IRQ_OWM				4 -#define IRQ_MTU0			5 -#define IRQ_MTU1			6 -#define IRQ_GPIO0			7 -#define IRQ_GPIO1			8 -#define IRQ_GPIO2			9 -#define IRQ_GPIO3			10 -#define IRQ_RTC_RTT			11 -#define IRQ_SSP				12 -#define IRQ_UART0			13 -#define IRQ_DMA1			14 -#define IRQ_CLCD_MDIF			15 -#define IRQ_DMA0			16 -#define IRQ_PWRFAIL			17 -#define IRQ_UART1			18 -#define IRQ_FIRDA			19 -#define IRQ_MSP0			20 -#define IRQ_I2C0			21 -#define IRQ_I2C1			22 -#define IRQ_SDMMC			23 -#define IRQ_USBOTG			24 -#define IRQ_SVA_IT0			25 -#define IRQ_SVA_IT1			26 -#define IRQ_SAA_IT0			27 -#define IRQ_SAA_IT1			28 -#define IRQ_UART2			29 -#define IRQ_MSP2			30 -#define IRQ_L2CC			49 -#define IRQ_HPI				50 -#define IRQ_SKE				51 -#define IRQ_KP				52 -#define IRQ_MEMST			55 -#define IRQ_SGA_IT			59 -#define IRQ_USBM			61 -#define IRQ_MSP1			63 +#define IRQ_WATCHDOG			(IRQ_VIC_START+0) +#define IRQ_SOFTINT			(IRQ_VIC_START+1) +#define IRQ_CRYPTO			(IRQ_VIC_START+2) +#define IRQ_OWM				(IRQ_VIC_START+3) +#define IRQ_MTU0			(IRQ_VIC_START+4) +#define IRQ_MTU1			(IRQ_VIC_START+5) +#define IRQ_GPIO0			(IRQ_VIC_START+6) +#define IRQ_GPIO1			(IRQ_VIC_START+7) +#define IRQ_GPIO2			(IRQ_VIC_START+8) +#define IRQ_GPIO3			(IRQ_VIC_START+9) +#define IRQ_RTC_RTT			(IRQ_VIC_START+10) +#define IRQ_SSP				(IRQ_VIC_START+11) +#define IRQ_UART0			(IRQ_VIC_START+12) +#define IRQ_DMA1			(IRQ_VIC_START+13) +#define IRQ_CLCD_MDIF			(IRQ_VIC_START+14) +#define IRQ_DMA0			(IRQ_VIC_START+15) +#define IRQ_PWRFAIL			(IRQ_VIC_START+16) +#define IRQ_UART1			(IRQ_VIC_START+17) +#define IRQ_FIRDA			(IRQ_VIC_START+18) +#define IRQ_MSP0			(IRQ_VIC_START+19) +#define IRQ_I2C0			(IRQ_VIC_START+20) +#define IRQ_I2C1			(IRQ_VIC_START+21) +#define IRQ_SDMMC			(IRQ_VIC_START+22) +#define IRQ_USBOTG			(IRQ_VIC_START+23) +#define IRQ_SVA_IT0			(IRQ_VIC_START+24) +#define IRQ_SVA_IT1			(IRQ_VIC_START+25) +#define IRQ_SAA_IT0			(IRQ_VIC_START+26) +#define IRQ_SAA_IT1			(IRQ_VIC_START+27) +#define IRQ_UART2			(IRQ_VIC_START+28) +#define IRQ_MSP2			(IRQ_VIC_START+29) +#define IRQ_L2CC			(IRQ_VIC_START+30) +#define IRQ_HPI				(IRQ_VIC_START+31) +#define IRQ_SKE				(IRQ_VIC_START+32) +#define IRQ_KP				(IRQ_VIC_START+33) +#define IRQ_MEMST			(IRQ_VIC_START+34) +#define IRQ_SGA_IT			(IRQ_VIC_START+35) +#define IRQ_USBM			(IRQ_VIC_START+36) +#define IRQ_MSP1			(IRQ_VIC_START+37)  #define NOMADIK_GPIO_OFFSET		(IRQ_VIC_START+64) diff --git a/arch/arm/mach-omap1/board-ams-delta.c b/arch/arm/mach-omap1/board-ams-delta.c index a8fce3ccc70..2e98a3ac7c5 100644 --- a/arch/arm/mach-omap1/board-ams-delta.c +++ b/arch/arm/mach-omap1/board-ams-delta.c @@ -160,7 +160,7 @@ static struct omap_lcd_config ams_delta_lcd_config __initdata = {  	.ctrl_name	= "internal",  }; -static struct omap_usb_config ams_delta_usb_config = { +static struct omap_usb_config ams_delta_usb_config __initdata = {  	.register_host	= 1,  	.hmc_mode	= 16,  	.pins[0]	= 2, diff --git a/arch/arm/mach-omap1/mailbox.c b/arch/arm/mach-omap1/mailbox.c index e962926b67b..efc8f207f6f 100644 --- a/arch/arm/mach-omap1/mailbox.c +++ b/arch/arm/mach-omap1/mailbox.c @@ -142,7 +142,7 @@ static struct omap_mbox mbox_dsp_info = {  static struct omap_mbox *omap1_mboxes[] = { &mbox_dsp_info, NULL }; -static int __devinit omap1_mbox_probe(struct platform_device *pdev) +static int omap1_mbox_probe(struct platform_device *pdev)  {  	struct resource *mem;  	int ret; @@ -165,7 +165,7 @@ static int __devinit omap1_mbox_probe(struct platform_device *pdev)  	return 0;  } -static int __devexit omap1_mbox_remove(struct platform_device *pdev) +static int omap1_mbox_remove(struct platform_device *pdev)  {  	omap_mbox_unregister();  	iounmap(mbox_base); @@ -174,7 +174,7 @@ static int __devexit omap1_mbox_remove(struct platform_device *pdev)  static struct platform_driver omap1_mbox_driver = {  	.probe	= omap1_mbox_probe, -	.remove	= __devexit_p(omap1_mbox_remove), +	.remove	= omap1_mbox_remove,  	.driver	= {  		.name	= "omap-mailbox",  	}, diff --git a/arch/arm/mach-omap1/usb.c b/arch/arm/mach-omap1/usb.c index 104fed366b8..1a1db5971cd 100644 --- a/arch/arm/mach-omap1/usb.c +++ b/arch/arm/mach-omap1/usb.c @@ -629,8 +629,14 @@ static void __init omap_1510_usb_init(struct omap_usb_config *config)  static inline void omap_1510_usb_init(struct omap_usb_config *config) {}  #endif -void __init omap1_usb_init(struct omap_usb_config *pdata) +void __init omap1_usb_init(struct omap_usb_config *_pdata)  { +	struct omap_usb_config *pdata; + +	pdata = kmemdup(_pdata, sizeof(*pdata), GFP_KERNEL); +	if (!pdata) +		return; +  	pdata->usb0_init = omap1_usb0_init;  	pdata->usb1_init = omap1_usb1_init;  	pdata->usb2_init = omap1_usb2_init; diff --git a/arch/arm/mach-omap2/board-omap4panda.c b/arch/arm/mach-omap2/board-omap4panda.c index 5c8e9cee2c2..769c1feee1c 100644 --- a/arch/arm/mach-omap2/board-omap4panda.c +++ b/arch/arm/mach-omap2/board-omap4panda.c @@ -397,6 +397,12 @@ static struct omap_board_mux board_mux[] __initdata = {  		  OMAP_PULL_ENA),  	OMAP4_MUX(ABE_MCBSP1_FSX, OMAP_MUX_MODE0 | OMAP_PIN_INPUT), +	/* UART2 - BT/FM/GPS shared transport */ +	OMAP4_MUX(UART2_CTS,	OMAP_PIN_INPUT	| OMAP_MUX_MODE0), +	OMAP4_MUX(UART2_RTS,	OMAP_PIN_OUTPUT	| OMAP_MUX_MODE0), +	OMAP4_MUX(UART2_RX,	OMAP_PIN_INPUT	| OMAP_MUX_MODE0), +	OMAP4_MUX(UART2_TX,	OMAP_PIN_OUTPUT	| OMAP_MUX_MODE0), +  	{ .reg_offset = OMAP_MUX_TERMINATOR },  }; diff --git a/arch/arm/mach-omap2/cclock2420_data.c b/arch/arm/mach-omap2/cclock2420_data.c index 7e5febe456d..ab7e952d207 100644 --- a/arch/arm/mach-omap2/cclock2420_data.c +++ b/arch/arm/mach-omap2/cclock2420_data.c @@ -1935,6 +1935,8 @@ int __init omap2420_clk_init(void)  			omap2_init_clk_hw_omap_clocks(c->lk.clk);  	} +	omap2xxx_clkt_vps_late_init(); +  	omap2_clk_disable_autoidle_all();  	omap2_clk_enable_init_clocks(enable_init_clks, diff --git a/arch/arm/mach-omap2/cclock2430_data.c b/arch/arm/mach-omap2/cclock2430_data.c index eda079b96c6..eb3dab68d53 100644 --- a/arch/arm/mach-omap2/cclock2430_data.c +++ b/arch/arm/mach-omap2/cclock2430_data.c @@ -2050,6 +2050,8 @@ int __init omap2430_clk_init(void)  			omap2_init_clk_hw_omap_clocks(c->lk.clk);  	} +	omap2xxx_clkt_vps_late_init(); +  	omap2_clk_disable_autoidle_all();  	omap2_clk_enable_init_clocks(enable_init_clks, diff --git a/arch/arm/mach-omap2/cclock3xxx_data.c b/arch/arm/mach-omap2/cclock3xxx_data.c index bdf39481fbd..6ef87580c33 100644 --- a/arch/arm/mach-omap2/cclock3xxx_data.c +++ b/arch/arm/mach-omap2/cclock3xxx_data.c @@ -1167,6 +1167,8 @@ static const struct clk_ops emu_src_ck_ops = {  	.recalc_rate	= &omap2_clksel_recalc,  	.get_parent	= &omap2_clksel_find_parent_index,  	.set_parent	= &omap2_clksel_set_parent, +	.enable		= &omap2_clkops_enable_clkdm, +	.disable	= &omap2_clkops_disable_clkdm,  };  static struct clk emu_src_ck; diff --git a/arch/arm/mach-omap2/cclock44xx_data.c b/arch/arm/mach-omap2/cclock44xx_data.c index 5789a5e2556..a2cc046b47f 100644 --- a/arch/arm/mach-omap2/cclock44xx_data.c +++ b/arch/arm/mach-omap2/cclock44xx_data.c @@ -2026,14 +2026,13 @@ int __init omap4xxx_clk_init(void)  	 * On OMAP4460 the ABE DPLL fails to turn on if in idle low-power  	 * state when turning the ABE clock domain. Workaround this by  	 * locking the ABE DPLL on boot. +	 * Lock the ABE DPLL in any case to avoid issues with audio.  	 */ -	if (cpu_is_omap446x()) { -		rc = clk_set_parent(&abe_dpll_refclk_mux_ck, &sys_32k_ck); -		if (!rc) -			rc = clk_set_rate(&dpll_abe_ck, OMAP4_DPLL_ABE_DEFFREQ); -		if (rc) -			pr_err("%s: failed to configure ABE DPLL!\n", __func__); -	} +	rc = clk_set_parent(&abe_dpll_refclk_mux_ck, &sys_32k_ck); +	if (!rc) +		rc = clk_set_rate(&dpll_abe_ck, OMAP4_DPLL_ABE_DEFFREQ); +	if (rc) +		pr_err("%s: failed to configure ABE DPLL!\n", __func__);  	return 0;  } diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c index 5e304d0719a..626f3ea3142 100644 --- a/arch/arm/mach-omap2/devices.c +++ b/arch/arm/mach-omap2/devices.c @@ -639,7 +639,7 @@ static int count_ocp2scp_devices(struct omap_ocp2scp_dev *ocp2scp_dev)  	return cnt;  } -static void omap_init_ocp2scp(void) +static void __init omap_init_ocp2scp(void)  {  	struct omap_hwmod	*oh;  	struct platform_device	*pdev; diff --git a/arch/arm/mach-omap2/drm.c b/arch/arm/mach-omap2/drm.c index 4c7566c7e24..2a2cfa88ddb 100644 --- a/arch/arm/mach-omap2/drm.c +++ b/arch/arm/mach-omap2/drm.c @@ -25,6 +25,7 @@  #include <linux/dma-mapping.h>  #include <linux/platform_data/omap_drm.h> +#include "soc.h"  #include "omap_device.h"  #include "omap_hwmod.h" @@ -56,7 +57,7 @@ static int __init omap_init_drm(void)  			oh->name);  	} -	platform_data.omaprev = GET_OMAP_REVISION(); +	platform_data.omaprev = GET_OMAP_TYPE;  	return platform_device_register(&omap_drm_device); diff --git a/arch/arm/mach-omap2/gpmc.c b/arch/arm/mach-omap2/gpmc.c index 65468f6d7f0..8033cb747c8 100644 --- a/arch/arm/mach-omap2/gpmc.c +++ b/arch/arm/mach-omap2/gpmc.c @@ -744,7 +744,7 @@ static int gpmc_setup_irq(void)  	return request_irq(gpmc_irq, gpmc_handle_irq, 0, "gpmc", NULL);  } -static __devexit int gpmc_free_irq(void) +static int gpmc_free_irq(void)  {  	int i; @@ -762,7 +762,7 @@ static __devexit int gpmc_free_irq(void)  	return 0;  } -static void __devexit gpmc_mem_exit(void) +static void gpmc_mem_exit(void)  {  	int cs; @@ -774,7 +774,7 @@ static void __devexit gpmc_mem_exit(void)  } -static int __devinit gpmc_mem_init(void) +static int gpmc_mem_init(void)  {  	int cs, rc;  	unsigned long boot_rom_space = 0; @@ -1121,7 +1121,7 @@ int gpmc_calc_timings(struct gpmc_timings *gpmc_t,  	return 0;  } -static __devinit int gpmc_probe(struct platform_device *pdev) +static int gpmc_probe(struct platform_device *pdev)  {  	int rc;  	u32 l; @@ -1177,7 +1177,7 @@ static __devinit int gpmc_probe(struct platform_device *pdev)  	return 0;  } -static __devexit int gpmc_remove(struct platform_device *pdev) +static int gpmc_remove(struct platform_device *pdev)  {  	gpmc_free_irq();  	gpmc_mem_exit(); @@ -1187,7 +1187,7 @@ static __devexit int gpmc_remove(struct platform_device *pdev)  static struct platform_driver gpmc_driver = {  	.probe		= gpmc_probe, -	.remove		= __devexit_p(gpmc_remove), +	.remove		= gpmc_remove,  	.driver		= {  		.name	= DEVICE_NAME,  		.owner	= THIS_MODULE, diff --git a/arch/arm/mach-omap2/mailbox.c b/arch/arm/mach-omap2/mailbox.c index 0d974565f8c..0b080267b7f 100644 --- a/arch/arm/mach-omap2/mailbox.c +++ b/arch/arm/mach-omap2/mailbox.c @@ -342,7 +342,7 @@ struct omap_mbox mbox_2_info = {  struct omap_mbox *omap4_mboxes[] = { &mbox_1_info, &mbox_2_info, NULL };  #endif -static int __devinit omap2_mbox_probe(struct platform_device *pdev) +static int omap2_mbox_probe(struct platform_device *pdev)  {  	struct resource *mem;  	int ret; @@ -395,7 +395,7 @@ static int __devinit omap2_mbox_probe(struct platform_device *pdev)  	return 0;  } -static int __devexit omap2_mbox_remove(struct platform_device *pdev) +static int omap2_mbox_remove(struct platform_device *pdev)  {  	omap_mbox_unregister();  	iounmap(mbox_base); @@ -404,7 +404,7 @@ static int __devexit omap2_mbox_remove(struct platform_device *pdev)  static struct platform_driver omap2_mbox_driver = {  	.probe = omap2_mbox_probe, -	.remove = __devexit_p(omap2_mbox_remove), +	.remove = omap2_mbox_remove,  	.driver = {  		.name = "omap-mailbox",  	}, diff --git a/arch/arm/mach-omap2/omap_hwmod_33xx_data.c b/arch/arm/mach-omap2/omap_hwmod_33xx_data.c index 081c71edddf..646c14d9fdb 100644 --- a/arch/arm/mach-omap2/omap_hwmod_33xx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_33xx_data.c @@ -2070,7 +2070,7 @@ static struct omap_hwmod_irq_info am33xx_usbss_mpu_irqs[] = {  	{ .name = "usbss-irq", .irq = 17 + OMAP_INTC_START, },  	{ .name = "musb0-irq", .irq = 18 + OMAP_INTC_START, },  	{ .name = "musb1-irq", .irq = 19 + OMAP_INTC_START, }, -	{ .irq = -1 + OMAP_INTC_START, }, +	{ .irq = -1, },  };  static struct omap_hwmod am33xx_usbss_hwmod = { @@ -2515,7 +2515,7 @@ static struct omap_hwmod_ocp_if am33xx_l4_hs__cpgmac0 = {  	.user		= OCP_USER_MPU,  }; -struct omap_hwmod_addr_space am33xx_mdio_addr_space[] = { +static struct omap_hwmod_addr_space am33xx_mdio_addr_space[] = {  	{  		.pa_start	= 0x4A101000,  		.pa_end		= 0x4A101000 + SZ_256 - 1, @@ -2523,7 +2523,7 @@ struct omap_hwmod_addr_space am33xx_mdio_addr_space[] = {  	{ }  }; -struct omap_hwmod_ocp_if am33xx_cpgmac0__mdio = { +static struct omap_hwmod_ocp_if am33xx_cpgmac0__mdio = {  	.master		= &am33xx_cpgmac0_hwmod,  	.slave		= &am33xx_mdio_hwmod,  	.addr		= am33xx_mdio_addr_space, diff --git a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c index 129d5081ed1..793f54ac7d1 100644 --- a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c @@ -2132,8 +2132,12 @@ static struct omap_hwmod omap44xx_mcpdm_hwmod = {  	 * currently reset very early during boot, before I2C is  	 * available, so it doesn't seem that we have any choice in  	 * the kernel other than to avoid resetting it. +	 * +	 * Also, McPDM needs to be configured to NO_IDLE mode when it +	 * is in used otherwise vital clocks will be gated which +	 * results 'slow motion' audio playback.  	 */ -	.flags		= HWMOD_EXT_OPT_MAIN_CLK, +	.flags		= HWMOD_EXT_OPT_MAIN_CLK | HWMOD_SWSUP_SIDLE,  	.mpu_irqs	= omap44xx_mcpdm_irqs,  	.sdma_reqs	= omap44xx_mcpdm_sdma_reqs,  	.main_clk	= "mcpdm_fck", diff --git a/arch/arm/mach-omap2/prm2xxx.c b/arch/arm/mach-omap2/prm2xxx.c index cc0e71430af..418de9c3b31 100644 --- a/arch/arm/mach-omap2/prm2xxx.c +++ b/arch/arm/mach-omap2/prm2xxx.c @@ -28,6 +28,14 @@  #include "prm-regbits-24xx.h"  /* + * OMAP24xx PM_PWSTCTRL_*.POWERSTATE and PM_PWSTST_*.LASTSTATEENTERED bits - + * these are reversed from the bits used on OMAP3+ + */ +#define OMAP24XX_PWRDM_POWER_ON			0x0 +#define OMAP24XX_PWRDM_POWER_RET		0x1 +#define OMAP24XX_PWRDM_POWER_OFF		0x3 + +/*   * omap2xxx_prm_reset_src_map - map from bits in the PRM_RSTST_WKUP   *   hardware register (which are specific to the OMAP2xxx SoCs) to   *   reset source ID bit shifts (which is an OMAP SoC-independent @@ -68,6 +76,34 @@ static u32 omap2xxx_prm_read_reset_sources(void)  }  /** + * omap2xxx_pwrst_to_common_pwrst - convert OMAP2xxx pwrst to common pwrst + * @omap2xxx_pwrst: OMAP2xxx hardware power state to convert + * + * Return the common power state bits corresponding to the OMAP2xxx + * hardware power state bits @omap2xxx_pwrst, or -EINVAL upon error. + */ +static int omap2xxx_pwrst_to_common_pwrst(u8 omap2xxx_pwrst) +{ +	u8 pwrst; + +	switch (omap2xxx_pwrst) { +	case OMAP24XX_PWRDM_POWER_OFF: +		pwrst = PWRDM_POWER_OFF; +		break; +	case OMAP24XX_PWRDM_POWER_RET: +		pwrst = PWRDM_POWER_RET; +		break; +	case OMAP24XX_PWRDM_POWER_ON: +		pwrst = PWRDM_POWER_ON; +		break; +	default: +		return -EINVAL; +	} + +	return pwrst; +} + +/**   * omap2xxx_prm_dpll_reset - use DPLL reset to reboot the OMAP SoC   *   * Set the DPLL reset bit, which should reboot the SoC.  This is the @@ -97,10 +133,56 @@ int omap2xxx_clkdm_wakeup(struct clockdomain *clkdm)  	return 0;  } +static int omap2xxx_pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst) +{ +	u8 omap24xx_pwrst; + +	switch (pwrst) { +	case PWRDM_POWER_OFF: +		omap24xx_pwrst = OMAP24XX_PWRDM_POWER_OFF; +		break; +	case PWRDM_POWER_RET: +		omap24xx_pwrst = OMAP24XX_PWRDM_POWER_RET; +		break; +	case PWRDM_POWER_ON: +		omap24xx_pwrst = OMAP24XX_PWRDM_POWER_ON; +		break; +	default: +		return -EINVAL; +	} + +	omap2_prm_rmw_mod_reg_bits(OMAP_POWERSTATE_MASK, +				   (omap24xx_pwrst << OMAP_POWERSTATE_SHIFT), +				   pwrdm->prcm_offs, OMAP2_PM_PWSTCTRL); +	return 0; +} + +static int omap2xxx_pwrdm_read_next_pwrst(struct powerdomain *pwrdm) +{ +	u8 omap2xxx_pwrst; + +	omap2xxx_pwrst = omap2_prm_read_mod_bits_shift(pwrdm->prcm_offs, +						       OMAP2_PM_PWSTCTRL, +						       OMAP_POWERSTATE_MASK); + +	return omap2xxx_pwrst_to_common_pwrst(omap2xxx_pwrst); +} + +static int omap2xxx_pwrdm_read_pwrst(struct powerdomain *pwrdm) +{ +	u8 omap2xxx_pwrst; + +	omap2xxx_pwrst = omap2_prm_read_mod_bits_shift(pwrdm->prcm_offs, +						       OMAP2_PM_PWSTST, +						       OMAP_POWERSTATEST_MASK); + +	return omap2xxx_pwrst_to_common_pwrst(omap2xxx_pwrst); +} +  struct pwrdm_ops omap2_pwrdm_operations = { -	.pwrdm_set_next_pwrst	= omap2_pwrdm_set_next_pwrst, -	.pwrdm_read_next_pwrst	= omap2_pwrdm_read_next_pwrst, -	.pwrdm_read_pwrst	= omap2_pwrdm_read_pwrst, +	.pwrdm_set_next_pwrst	= omap2xxx_pwrdm_set_next_pwrst, +	.pwrdm_read_next_pwrst	= omap2xxx_pwrdm_read_next_pwrst, +	.pwrdm_read_pwrst	= omap2xxx_pwrdm_read_pwrst,  	.pwrdm_set_logic_retst	= omap2_pwrdm_set_logic_retst,  	.pwrdm_set_mem_onst	= omap2_pwrdm_set_mem_onst,  	.pwrdm_set_mem_retst	= omap2_pwrdm_set_mem_retst, diff --git a/arch/arm/mach-omap2/prm2xxx_3xxx.c b/arch/arm/mach-omap2/prm2xxx_3xxx.c index 30517f5af70..a3e121f94a8 100644 --- a/arch/arm/mach-omap2/prm2xxx_3xxx.c +++ b/arch/arm/mach-omap2/prm2xxx_3xxx.c @@ -103,28 +103,6 @@ int omap2_prm_deassert_hardreset(s16 prm_mod, u8 rst_shift, u8 st_shift)  /* Powerdomain low-level functions */  /* Common functions across OMAP2 and OMAP3 */ -int omap2_pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst) -{ -	omap2_prm_rmw_mod_reg_bits(OMAP_POWERSTATE_MASK, -				   (pwrst << OMAP_POWERSTATE_SHIFT), -				   pwrdm->prcm_offs, OMAP2_PM_PWSTCTRL); -	return 0; -} - -int omap2_pwrdm_read_next_pwrst(struct powerdomain *pwrdm) -{ -	return omap2_prm_read_mod_bits_shift(pwrdm->prcm_offs, -					     OMAP2_PM_PWSTCTRL, -					     OMAP_POWERSTATE_MASK); -} - -int omap2_pwrdm_read_pwrst(struct powerdomain *pwrdm) -{ -	return omap2_prm_read_mod_bits_shift(pwrdm->prcm_offs, -					     OMAP2_PM_PWSTST, -					     OMAP_POWERSTATEST_MASK); -} -  int omap2_pwrdm_set_mem_onst(struct powerdomain *pwrdm, u8 bank,  								u8 pwrst)  { diff --git a/arch/arm/mach-omap2/prm3xxx.c b/arch/arm/mach-omap2/prm3xxx.c index 39822aabcff..e648bd55b07 100644 --- a/arch/arm/mach-omap2/prm3xxx.c +++ b/arch/arm/mach-omap2/prm3xxx.c @@ -277,6 +277,28 @@ static u32 omap3xxx_prm_read_reset_sources(void)  /* Powerdomain low-level functions */ +static int omap3_pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst) +{ +	omap2_prm_rmw_mod_reg_bits(OMAP_POWERSTATE_MASK, +				   (pwrst << OMAP_POWERSTATE_SHIFT), +				   pwrdm->prcm_offs, OMAP2_PM_PWSTCTRL); +	return 0; +} + +static int omap3_pwrdm_read_next_pwrst(struct powerdomain *pwrdm) +{ +	return omap2_prm_read_mod_bits_shift(pwrdm->prcm_offs, +					     OMAP2_PM_PWSTCTRL, +					     OMAP_POWERSTATE_MASK); +} + +static int omap3_pwrdm_read_pwrst(struct powerdomain *pwrdm) +{ +	return omap2_prm_read_mod_bits_shift(pwrdm->prcm_offs, +					     OMAP2_PM_PWSTST, +					     OMAP_POWERSTATEST_MASK); +} +  /* Applicable only for OMAP3. Not supported on OMAP2 */  static int omap3_pwrdm_read_prev_pwrst(struct powerdomain *pwrdm)  { @@ -355,9 +377,9 @@ static int omap3_pwrdm_disable_hdwr_sar(struct powerdomain *pwrdm)  }  struct pwrdm_ops omap3_pwrdm_operations = { -	.pwrdm_set_next_pwrst	= omap2_pwrdm_set_next_pwrst, -	.pwrdm_read_next_pwrst	= omap2_pwrdm_read_next_pwrst, -	.pwrdm_read_pwrst	= omap2_pwrdm_read_pwrst, +	.pwrdm_set_next_pwrst	= omap3_pwrdm_set_next_pwrst, +	.pwrdm_read_next_pwrst	= omap3_pwrdm_read_next_pwrst, +	.pwrdm_read_pwrst	= omap3_pwrdm_read_pwrst,  	.pwrdm_read_prev_pwrst	= omap3_pwrdm_read_prev_pwrst,  	.pwrdm_set_logic_retst	= omap2_pwrdm_set_logic_retst,  	.pwrdm_read_logic_pwrst	= omap3_pwrdm_read_logic_pwrst, diff --git a/arch/arm/mach-omap2/prm44xx.c b/arch/arm/mach-omap2/prm44xx.c index 7498bc77fe8..c05a343d465 100644 --- a/arch/arm/mach-omap2/prm44xx.c +++ b/arch/arm/mach-omap2/prm44xx.c @@ -56,9 +56,9 @@ static struct omap_prcm_irq_setup omap4_prcm_irq_setup = {   *   enumeration)   */  static struct prm_reset_src_map omap44xx_prm_reset_src_map[] = { -	{ OMAP4430_RST_GLOBAL_WARM_SW_SHIFT, +	{ OMAP4430_GLOBAL_WARM_SW_RST_SHIFT,  	  OMAP_GLOBAL_WARM_RST_SRC_ID_SHIFT }, -	{ OMAP4430_RST_GLOBAL_COLD_SW_SHIFT, +	{ OMAP4430_GLOBAL_COLD_RST_SHIFT,  	  OMAP_GLOBAL_COLD_RST_SRC_ID_SHIFT },  	{ OMAP4430_MPU_SECURITY_VIOL_RST_SHIFT,  	  OMAP_SECU_VIOL_RST_SRC_ID_SHIFT }, @@ -333,7 +333,7 @@ static u32 omap44xx_prm_read_reset_sources(void)  	u32 r = 0;  	u32 v; -	v = omap4_prm_read_inst_reg(OMAP4430_PRM_OCP_SOCKET_INST, +	v = omap4_prm_read_inst_reg(OMAP4430_PRM_DEVICE_INST,  				    OMAP4_RM_RSTST);  	p = omap44xx_prm_reset_src_map; diff --git a/arch/arm/mach-omap2/prm44xx.h b/arch/arm/mach-omap2/prm44xx.h index 22b0979206c..8ee1fbdec56 100644 --- a/arch/arm/mach-omap2/prm44xx.h +++ b/arch/arm/mach-omap2/prm44xx.h @@ -62,8 +62,8 @@  /* OMAP4 specific register offsets */  #define OMAP4_RM_RSTCTRL				0x0000 -#define OMAP4_RM_RSTTIME				0x0004 -#define OMAP4_RM_RSTST					0x0008 +#define OMAP4_RM_RSTST					0x0004 +#define OMAP4_RM_RSTTIME				0x0008  #define OMAP4_PM_PWSTCTRL				0x0000  #define OMAP4_PM_PWSTST					0x0004 diff --git a/arch/arm/mach-omap2/timer.c b/arch/arm/mach-omap2/timer.c index 691aa674665..b8ad6e632bb 100644 --- a/arch/arm/mach-omap2/timer.c +++ b/arch/arm/mach-omap2/timer.c @@ -165,15 +165,11 @@ static struct device_node * __init omap_get_timer_dt(struct of_device_id *match,  	struct device_node *np;  	for_each_matching_node(np, match) { -		if (!of_device_is_available(np)) { -			of_node_put(np); +		if (!of_device_is_available(np))  			continue; -		} -		if (property && !of_get_property(np, property, NULL)) { -			of_node_put(np); +		if (property && !of_get_property(np, property, NULL))  			continue; -		}  		of_add_property(np, &device_disabled);  		return np; diff --git a/arch/arm/mach-orion5x/pci.c b/arch/arm/mach-orion5x/pci.c index cd50e328db2..d9c7c3bf0d9 100644 --- a/arch/arm/mach-orion5x/pci.c +++ b/arch/arm/mach-orion5x/pci.c @@ -506,7 +506,7 @@ static int __init pci_setup(struct pci_sys_data *sys)  /*****************************************************************************   * General PCIe + PCI   ****************************************************************************/ -static void __devinit rc_pci_fixup(struct pci_dev *dev) +static void rc_pci_fixup(struct pci_dev *dev)  {  	/*  	 * Prevent enumeration of root complex. diff --git a/arch/arm/mach-prima2/pm.c b/arch/arm/mach-prima2/pm.c index fb5a7910af3..9936c180bf0 100644 --- a/arch/arm/mach-prima2/pm.c +++ b/arch/arm/mach-prima2/pm.c @@ -123,7 +123,7 @@ static const struct of_device_id memc_ids[] = {  	{}  }; -static int __devinit sirfsoc_memc_probe(struct platform_device *op) +static int sirfsoc_memc_probe(struct platform_device *op)  {  	struct device_node *np = op->dev.of_node; diff --git a/arch/arm/mach-prima2/rtciobrg.c b/arch/arm/mach-prima2/rtciobrg.c index 9d80f1e20a9..55735360213 100644 --- a/arch/arm/mach-prima2/rtciobrg.c +++ b/arch/arm/mach-prima2/rtciobrg.c @@ -107,7 +107,7 @@ static const struct of_device_id rtciobrg_ids[] = {  	{}  }; -static int __devinit sirfsoc_rtciobrg_probe(struct platform_device *op) +static int sirfsoc_rtciobrg_probe(struct platform_device *op)  {  	struct device_node *np = op->dev.of_node; diff --git a/arch/arm/mach-pxa/corgi_pm.c b/arch/arm/mach-pxa/corgi_pm.c index 048c4299473..7a39efc5086 100644 --- a/arch/arm/mach-pxa/corgi_pm.c +++ b/arch/arm/mach-pxa/corgi_pm.c @@ -198,7 +198,7 @@ static struct sharpsl_charger_machinfo corgi_pm_machinfo = {  static struct platform_device *corgipm_device; -static int __devinit corgipm_init(void) +static int corgipm_init(void)  {  	int ret; diff --git a/arch/arm/mach-pxa/include/mach/mfp-pxa27x.h b/arch/arm/mach-pxa/include/mach/mfp-pxa27x.h index a611ad3153c..b6132aa95dc 100644 --- a/arch/arm/mach-pxa/include/mach/mfp-pxa27x.h +++ b/arch/arm/mach-pxa/include/mach/mfp-pxa27x.h @@ -463,6 +463,9 @@  	GPIO76_LCD_PCLK,	\  	GPIO77_LCD_BIAS +/* these enable a work-around for a hw bug in pxa27x during ac97 warm reset */ +#define GPIO113_AC97_nRESET_GPIO_HIGH MFP_CFG_OUT(GPIO113, AF0, DEFAULT) +#define GPIO95_AC97_nRESET_GPIO_HIGH MFP_CFG_OUT(GPIO95, AF0, DEFAULT)  extern int keypad_set_wake(unsigned int on);  #endif /* __ASM_ARCH_MFP_PXA27X_H */ diff --git a/arch/arm/mach-pxa/pxa27x.c b/arch/arm/mach-pxa/pxa27x.c index 8047ee0effc..616cb87b617 100644 --- a/arch/arm/mach-pxa/pxa27x.c +++ b/arch/arm/mach-pxa/pxa27x.c @@ -47,9 +47,9 @@ void pxa27x_clear_otgph(void)  EXPORT_SYMBOL(pxa27x_clear_otgph);  static unsigned long ac97_reset_config[] = { -	GPIO113_GPIO, +	GPIO113_AC97_nRESET_GPIO_HIGH,  	GPIO113_AC97_nRESET, -	GPIO95_GPIO, +	GPIO95_AC97_nRESET_GPIO_HIGH,  	GPIO95_AC97_nRESET,  }; diff --git a/arch/arm/mach-pxa/sharpsl_pm.c b/arch/arm/mach-pxa/sharpsl_pm.c index ec55c575ed1..0a36d3585f2 100644 --- a/arch/arm/mach-pxa/sharpsl_pm.c +++ b/arch/arm/mach-pxa/sharpsl_pm.c @@ -829,7 +829,7 @@ static const struct platform_suspend_ops sharpsl_pm_ops = {  };  #endif -static int __devinit sharpsl_pm_probe(struct platform_device *pdev) +static int sharpsl_pm_probe(struct platform_device *pdev)  {  	int ret, irq; @@ -941,7 +941,7 @@ static struct platform_driver sharpsl_pm_driver = {  	},  }; -static int __devinit sharpsl_pm_init(void) +static int sharpsl_pm_init(void)  {  	return platform_driver_register(&sharpsl_pm_driver);  } diff --git a/arch/arm/mach-pxa/spitz_pm.c b/arch/arm/mach-pxa/spitz_pm.c index 842596d4d31..e191f9996b2 100644 --- a/arch/arm/mach-pxa/spitz_pm.c +++ b/arch/arm/mach-pxa/spitz_pm.c @@ -232,7 +232,7 @@ struct sharpsl_charger_machinfo spitz_pm_machinfo = {  static struct platform_device *spitzpm_device; -static int __devinit spitzpm_init(void) +static int spitzpm_init(void)  {  	int ret; diff --git a/arch/arm/mach-pxa/tosa-bt.c b/arch/arm/mach-pxa/tosa-bt.c index b9b1e5c2b29..fc3646c2c69 100644 --- a/arch/arm/mach-pxa/tosa-bt.c +++ b/arch/arm/mach-pxa/tosa-bt.c @@ -102,7 +102,7 @@ err_reset:  	return rc;  } -static int __devexit tosa_bt_remove(struct platform_device *dev) +static int tosa_bt_remove(struct platform_device *dev)  {  	struct tosa_bt_data *data = dev->dev.platform_data;  	struct rfkill *rfk = platform_get_drvdata(dev); @@ -125,7 +125,7 @@ static int __devexit tosa_bt_remove(struct platform_device *dev)  static struct platform_driver tosa_bt_driver = {  	.probe = tosa_bt_probe, -	.remove = __devexit_p(tosa_bt_remove), +	.remove = tosa_bt_remove,  	.driver = {  		.name = "tosa-bt", diff --git a/arch/arm/mach-realview/include/mach/irqs-eb.h b/arch/arm/mach-realview/include/mach/irqs-eb.h index d6b5073692d..44754230fdc 100644 --- a/arch/arm/mach-realview/include/mach/irqs-eb.h +++ b/arch/arm/mach-realview/include/mach/irqs-eb.h @@ -115,7 +115,7 @@  /*   * Only define NR_IRQS if less than NR_IRQS_EB   */ -#define NR_IRQS_EB		(IRQ_EB_GIC_START + 96) +#define NR_IRQS_EB		(IRQ_EB_GIC_START + 128)  #if defined(CONFIG_MACH_REALVIEW_EB) \  	&& (!defined(NR_IRQS) || (NR_IRQS < NR_IRQS_EB)) diff --git a/arch/arm/mach-s3c24xx/h1940-bluetooth.c b/arch/arm/mach-s3c24xx/h1940-bluetooth.c index 57aee916bdb..3f40c61b6e0 100644 --- a/arch/arm/mach-s3c24xx/h1940-bluetooth.c +++ b/arch/arm/mach-s3c24xx/h1940-bluetooth.c @@ -62,7 +62,7 @@ static const struct rfkill_ops h1940bt_rfkill_ops = {  	.set_block = h1940bt_set_block,  }; -static int __devinit h1940bt_probe(struct platform_device *pdev) +static int h1940bt_probe(struct platform_device *pdev)  {  	struct rfkill *rfk;  	int ret = 0; diff --git a/arch/arm/mach-s3c24xx/mach-osiris-dvs.c b/arch/arm/mach-s3c24xx/mach-osiris-dvs.c index 5876c6ba750..45e74363aaa 100644 --- a/arch/arm/mach-s3c24xx/mach-osiris-dvs.c +++ b/arch/arm/mach-s3c24xx/mach-osiris-dvs.c @@ -93,7 +93,7 @@ static struct notifier_block osiris_dvs_nb = {  	.notifier_call	= osiris_dvs_notify,  }; -static int __devinit osiris_dvs_probe(struct platform_device *pdev) +static int osiris_dvs_probe(struct platform_device *pdev)  {  	int ret; @@ -126,7 +126,7 @@ err_nogpio:  	return ret;  } -static int __devexit osiris_dvs_remove(struct platform_device *pdev) +static int osiris_dvs_remove(struct platform_device *pdev)  {  	dev_info(&pdev->dev, "exiting\n"); @@ -167,7 +167,7 @@ static const struct dev_pm_ops osiris_dvs_pm = {  static struct platform_driver osiris_dvs_driver = {  	.probe		= osiris_dvs_probe, -	.remove		= __devexit_p(osiris_dvs_remove), +	.remove		= osiris_dvs_remove,  	.driver		= {  		.name	= "osiris-dvs",  		.owner	= THIS_MODULE, diff --git a/arch/arm/mach-s3c64xx/mach-crag6410-module.c b/arch/arm/mach-s3c64xx/mach-crag6410-module.c index c6d8dba9062..755c0bb119f 100644 --- a/arch/arm/mach-s3c64xx/mach-crag6410-module.c +++ b/arch/arm/mach-s3c64xx/mach-crag6410-module.c @@ -47,7 +47,7 @@ static struct spi_board_info wm1253_devs[] = {  		.bus_num	= 0,  		.chip_select	= 0,  		.mode		= SPI_MODE_0, -		.irq		= S3C_EINT(5), +		.irq		= S3C_EINT(4),  		.controller_data = &wm0010_spi_csinfo,  		.platform_data = &wm0010_pdata,  	}, @@ -290,7 +290,7 @@ static const struct i2c_board_info wm2200_i2c[] = {  	  .platform_data = &wm2200_pdata, },  }; -static __devinitdata const struct { +static const struct {  	u8 id;  	u8 rev;  	const char *name; @@ -343,8 +343,8 @@ static __devinitdata const struct {  	  .i2c_devs = wm2200_i2c, .num_i2c_devs = ARRAY_SIZE(wm2200_i2c) },  }; -static __devinit int wlf_gf_module_probe(struct i2c_client *i2c, -					 const struct i2c_device_id *i2c_id) +static int wlf_gf_module_probe(struct i2c_client *i2c, +			       const struct i2c_device_id *i2c_id)  {  	int ret, i, j, id, rev; diff --git a/arch/arm/mach-s3c64xx/mach-crag6410.c b/arch/arm/mach-s3c64xx/mach-crag6410.c index cdde249166b..bf6311a28f3 100644 --- a/arch/arm/mach-s3c64xx/mach-crag6410.c +++ b/arch/arm/mach-s3c64xx/mach-crag6410.c @@ -171,7 +171,7 @@ static struct fb_videomode crag6410_lcd_timing = {  };  /* 405566 clocks per frame => 60Hz refresh requires 24333960Hz clock */ -static struct s3c_fb_platdata crag6410_lcd_pdata __devinitdata = { +static struct s3c_fb_platdata crag6410_lcd_pdata = {  	.setup_gpio	= s3c64xx_fb_gpio_setup_24bpp,  	.vtiming	= &crag6410_lcd_timing,  	.win[0]		= &crag6410_fb_win0, @@ -181,7 +181,7 @@ static struct s3c_fb_platdata crag6410_lcd_pdata __devinitdata = {  /* 2x6 keypad */ -static uint32_t crag6410_keymap[] __devinitdata = { +static uint32_t crag6410_keymap[] = {  	/* KEY(row, col, keycode) */  	KEY(0, 0, KEY_VOLUMEUP),  	KEY(0, 1, KEY_HOME), @@ -197,12 +197,12 @@ static uint32_t crag6410_keymap[] __devinitdata = {  	KEY(1, 5, KEY_CAMERA),  }; -static struct matrix_keymap_data crag6410_keymap_data __devinitdata = { +static struct matrix_keymap_data crag6410_keymap_data = {  	.keymap		= crag6410_keymap,  	.keymap_size	= ARRAY_SIZE(crag6410_keymap),  }; -static struct samsung_keypad_platdata crag6410_keypad_data __devinitdata = { +static struct samsung_keypad_platdata crag6410_keypad_data = {  	.keymap_data	= &crag6410_keymap_data,  	.rows		= 2,  	.cols		= 6, @@ -407,11 +407,11 @@ static struct wm831x_buckv_pdata vddarm_pdata = {  	.dvs_gpio = S3C64XX_GPK(0),  }; -static struct regulator_consumer_supply vddarm_consumers[] __devinitdata = { +static struct regulator_consumer_supply vddarm_consumers[] = {  	REGULATOR_SUPPLY("vddarm", NULL),  }; -static struct regulator_init_data vddarm __devinitdata = { +static struct regulator_init_data vddarm = {  	.constraints = {  		.name = "VDDARM",  		.min_uV = 1000000, @@ -425,11 +425,11 @@ static struct regulator_init_data vddarm __devinitdata = {  	.driver_data = &vddarm_pdata,  }; -static struct regulator_consumer_supply vddint_consumers[] __devinitdata = { +static struct regulator_consumer_supply vddint_consumers[] = {  	REGULATOR_SUPPLY("vddint", NULL),  }; -static struct regulator_init_data vddint __devinitdata = { +static struct regulator_init_data vddint = {  	.constraints = {  		.name = "VDDINT",  		.min_uV = 1000000, @@ -442,27 +442,27 @@ static struct regulator_init_data vddint __devinitdata = {  	.supply_regulator = "WALLVDD",  }; -static struct regulator_init_data vddmem __devinitdata = { +static struct regulator_init_data vddmem = {  	.constraints = {  		.name = "VDDMEM",  		.always_on = 1,  	},  }; -static struct regulator_init_data vddsys __devinitdata = { +static struct regulator_init_data vddsys = {  	.constraints = {  		.name = "VDDSYS,VDDEXT,VDDPCM,VDDSS",  		.always_on = 1,  	},  }; -static struct regulator_consumer_supply vddmmc_consumers[] __devinitdata = { +static struct regulator_consumer_supply vddmmc_consumers[] = {  	REGULATOR_SUPPLY("vmmc", "s3c-sdhci.0"),  	REGULATOR_SUPPLY("vmmc", "s3c-sdhci.1"),  	REGULATOR_SUPPLY("vmmc", "s3c-sdhci.2"),  }; -static struct regulator_init_data vddmmc __devinitdata = { +static struct regulator_init_data vddmmc = {  	.constraints = {  		.name = "VDDMMC,UH",  		.always_on = 1, @@ -472,7 +472,7 @@ static struct regulator_init_data vddmmc __devinitdata = {  	.supply_regulator = "WALLVDD",  }; -static struct regulator_init_data vddotgi __devinitdata = { +static struct regulator_init_data vddotgi = {  	.constraints = {  		.name = "VDDOTGi",  		.always_on = 1, @@ -480,7 +480,7 @@ static struct regulator_init_data vddotgi __devinitdata = {  	.supply_regulator = "WALLVDD",  }; -static struct regulator_init_data vddotg __devinitdata = { +static struct regulator_init_data vddotg = {  	.constraints = {  		.name = "VDDOTG",  		.always_on = 1, @@ -488,7 +488,7 @@ static struct regulator_init_data vddotg __devinitdata = {  	.supply_regulator = "WALLVDD",  }; -static struct regulator_init_data vddhi __devinitdata = { +static struct regulator_init_data vddhi = {  	.constraints = {  		.name = "VDDHI",  		.always_on = 1, @@ -496,7 +496,7 @@ static struct regulator_init_data vddhi __devinitdata = {  	.supply_regulator = "WALLVDD",  }; -static struct regulator_init_data vddadc __devinitdata = { +static struct regulator_init_data vddadc = {  	.constraints = {  		.name = "VDDADC,VDDDAC",  		.always_on = 1, @@ -504,7 +504,7 @@ static struct regulator_init_data vddadc __devinitdata = {  	.supply_regulator = "WALLVDD",  }; -static struct regulator_init_data vddmem0 __devinitdata = { +static struct regulator_init_data vddmem0 = {  	.constraints = {  		.name = "VDDMEM0",  		.always_on = 1, @@ -512,7 +512,7 @@ static struct regulator_init_data vddmem0 __devinitdata = {  	.supply_regulator = "WALLVDD",  }; -static struct regulator_init_data vddpll __devinitdata = { +static struct regulator_init_data vddpll = {  	.constraints = {  		.name = "VDDPLL",  		.always_on = 1, @@ -520,7 +520,7 @@ static struct regulator_init_data vddpll __devinitdata = {  	.supply_regulator = "WALLVDD",  }; -static struct regulator_init_data vddlcd __devinitdata = { +static struct regulator_init_data vddlcd = {  	.constraints = {  		.name = "VDDLCD",  		.always_on = 1, @@ -528,7 +528,7 @@ static struct regulator_init_data vddlcd __devinitdata = {  	.supply_regulator = "WALLVDD",  }; -static struct regulator_init_data vddalive __devinitdata = { +static struct regulator_init_data vddalive = {  	.constraints = {  		.name = "VDDALIVE",  		.always_on = 1, @@ -536,28 +536,28 @@ static struct regulator_init_data vddalive __devinitdata = {  	.supply_regulator = "WALLVDD",  }; -static struct wm831x_backup_pdata banff_backup_pdata __devinitdata = { +static struct wm831x_backup_pdata banff_backup_pdata = {  	.charger_enable = 1,  	.vlim = 2500,  /* mV */  	.ilim = 200,   /* uA */  }; -static struct wm831x_status_pdata banff_red_led __devinitdata = { +static struct wm831x_status_pdata banff_red_led = {  	.name = "banff:red:",  	.default_src = WM831X_STATUS_MANUAL,  }; -static struct wm831x_status_pdata banff_green_led __devinitdata = { +static struct wm831x_status_pdata banff_green_led = {  	.name = "banff:green:",  	.default_src = WM831X_STATUS_MANUAL,  }; -static struct wm831x_touch_pdata touch_pdata __devinitdata = { +static struct wm831x_touch_pdata touch_pdata = {  	.data_irq = S3C_EINT(26),  	.pd_irq = S3C_EINT(27),  }; -static struct wm831x_pdata crag_pmic_pdata __devinitdata = { +static struct wm831x_pdata crag_pmic_pdata = {  	.wm831x_num = 1,  	.gpio_base = BANFF_PMIC_GPIO_BASE,  	.soft_shutdown = true, @@ -601,7 +601,7 @@ static struct wm831x_pdata crag_pmic_pdata __devinitdata = {  	.touch = &touch_pdata,  }; -static struct i2c_board_info i2c_devs0[] __devinitdata = { +static struct i2c_board_info i2c_devs0[] = {  	{ I2C_BOARD_INFO("24c08", 0x50), },  	{ I2C_BOARD_INFO("tca6408", 0x20),  	  .platform_data = &crag6410_pca_data, @@ -616,13 +616,13 @@ static struct s3c2410_platform_i2c i2c0_pdata = {  	.frequency = 400000,  }; -static struct regulator_consumer_supply pvdd_1v2_consumers[] __devinitdata = { +static struct regulator_consumer_supply pvdd_1v2_consumers[] = {  	REGULATOR_SUPPLY("DCVDD", "spi0.0"),  	REGULATOR_SUPPLY("AVDD", "spi0.0"),  	REGULATOR_SUPPLY("AVDD", "spi0.1"),  }; -static struct regulator_init_data pvdd_1v2 __devinitdata = { +static struct regulator_init_data pvdd_1v2 = {  	.constraints = {  		.name = "PVDD_1V2",  		.valid_ops_mask = REGULATOR_CHANGE_STATUS, @@ -632,7 +632,7 @@ static struct regulator_init_data pvdd_1v2 __devinitdata = {  	.num_consumer_supplies = ARRAY_SIZE(pvdd_1v2_consumers),  }; -static struct regulator_consumer_supply pvdd_1v8_consumers[] __devinitdata = { +static struct regulator_consumer_supply pvdd_1v8_consumers[] = {  	REGULATOR_SUPPLY("LDOVDD", "1-001a"),  	REGULATOR_SUPPLY("PLLVDD", "1-001a"),  	REGULATOR_SUPPLY("DBVDD", "1-001a"), @@ -664,7 +664,7 @@ static struct regulator_consumer_supply pvdd_1v8_consumers[] __devinitdata = {  	REGULATOR_SUPPLY("CPVDD", "wm5110-codec"),  }; -static struct regulator_init_data pvdd_1v8 __devinitdata = { +static struct regulator_init_data pvdd_1v8 = {  	.constraints = {  		.name = "PVDD_1V8",  		.always_on = 1, @@ -674,12 +674,12 @@ static struct regulator_init_data pvdd_1v8 __devinitdata = {  	.num_consumer_supplies = ARRAY_SIZE(pvdd_1v8_consumers),  }; -static struct regulator_consumer_supply pvdd_3v3_consumers[] __devinitdata = { +static struct regulator_consumer_supply pvdd_3v3_consumers[] = {  	REGULATOR_SUPPLY("MICVDD", "1-001a"),  	REGULATOR_SUPPLY("AVDD1", "1-001a"),  }; -static struct regulator_init_data pvdd_3v3 __devinitdata = { +static struct regulator_init_data pvdd_3v3 = {  	.constraints = {  		.name = "PVDD_3V3",  		.always_on = 1, @@ -689,7 +689,7 @@ static struct regulator_init_data pvdd_3v3 __devinitdata = {  	.num_consumer_supplies = ARRAY_SIZE(pvdd_3v3_consumers),  }; -static struct wm831x_pdata glenfarclas_pmic_pdata __devinitdata = { +static struct wm831x_pdata glenfarclas_pmic_pdata = {  	.wm831x_num = 2,  	.irq_base = GLENFARCLAS_PMIC_IRQ_BASE,  	.gpio_base = GLENFARCLAS_PMIC_GPIO_BASE, @@ -721,7 +721,7 @@ static struct wm1250_ev1_pdata wm1250_ev1_pdata = {  	},  }; -static struct i2c_board_info i2c_devs1[] __devinitdata = { +static struct i2c_board_info i2c_devs1[] = {  	{ I2C_BOARD_INFO("wm8311", 0x34),  	  .irq = S3C_EINT(0),  	  .platform_data = &glenfarclas_pmic_pdata }, diff --git a/arch/arm/mach-s3c64xx/pm.c b/arch/arm/mach-s3c64xx/pm.c index 7feb426fc20..d2e1a16690b 100644 --- a/arch/arm/mach-s3c64xx/pm.c +++ b/arch/arm/mach-s3c64xx/pm.c @@ -338,8 +338,10 @@ int __init s3c64xx_pm_init(void)  	for (i = 0; i < ARRAY_SIZE(s3c64xx_pm_domains); i++)  		pm_genpd_init(&s3c64xx_pm_domains[i]->pd, NULL, false); +#ifdef CONFIG_S3C_DEV_FB  	if (dev_get_platdata(&s3c_device_fb.dev))  		pm_genpd_add_device(&s3c64xx_pm_f.pd, &s3c_device_fb.dev); +#endif  	return 0;  } diff --git a/arch/arm/mach-sa1100/jornada720_ssp.c b/arch/arm/mach-sa1100/jornada720_ssp.c index 7f07f08d896..b143c465934 100644 --- a/arch/arm/mach-sa1100/jornada720_ssp.c +++ b/arch/arm/mach-sa1100/jornada720_ssp.c @@ -130,7 +130,7 @@ void jornada_ssp_end(void)  };  EXPORT_SYMBOL(jornada_ssp_end); -static int __devinit jornada_ssp_probe(struct platform_device *dev) +static int jornada_ssp_probe(struct platform_device *dev)  {  	int ret; diff --git a/arch/arm/mach-sa1100/neponset.c b/arch/arm/mach-sa1100/neponset.c index 88be0474f3d..400f8033204 100644 --- a/arch/arm/mach-sa1100/neponset.c +++ b/arch/arm/mach-sa1100/neponset.c @@ -154,7 +154,7 @@ static u_int neponset_get_mctrl(struct uart_port *port)  	return ret;  } -static struct sa1100_port_fns neponset_port_fns __devinitdata = { +static struct sa1100_port_fns neponset_port_fns = {  	.set_mctrl	= neponset_set_mctrl,  	.get_mctrl	= neponset_get_mctrl,  }; @@ -233,7 +233,7 @@ static struct sa1111_platform_data sa1111_info = {  	.disable_devs	= SA1111_DEVID_PS2_MSE,  }; -static int __devinit neponset_probe(struct platform_device *dev) +static int neponset_probe(struct platform_device *dev)  {  	struct neponset_drvdata *d;  	struct resource *nep_res, *sa1111_res, *smc91x_res; @@ -368,7 +368,7 @@ static int __devinit neponset_probe(struct platform_device *dev)  	return ret;  } -static int __devexit neponset_remove(struct platform_device *dev) +static int neponset_remove(struct platform_device *dev)  {  	struct neponset_drvdata *d = platform_get_drvdata(dev);  	int irq = platform_get_irq(dev, 0); @@ -420,7 +420,7 @@ static const struct dev_pm_ops neponset_pm_ops = {  static struct platform_driver neponset_device_driver = {  	.probe		= neponset_probe, -	.remove		= __devexit_p(neponset_remove), +	.remove		= neponset_remove,  	.driver		= {  		.name	= "neponset",  		.owner	= THIS_MODULE, diff --git a/arch/arm/mach-tegra/pcie.c b/arch/arm/mach-tegra/pcie.c index 53d08587179..bffcd643d7a 100644 --- a/arch/arm/mach-tegra/pcie.c +++ b/arch/arm/mach-tegra/pcie.c @@ -331,7 +331,7 @@ static struct pci_ops tegra_pcie_ops = {  	.write	= tegra_pcie_write_conf,  }; -static void __devinit tegra_pcie_fixup_bridge(struct pci_dev *dev) +static void tegra_pcie_fixup_bridge(struct pci_dev *dev)  {  	u16 reg; @@ -345,7 +345,7 @@ static void __devinit tegra_pcie_fixup_bridge(struct pci_dev *dev)  DECLARE_PCI_FIXUP_FINAL(PCI_ANY_ID, PCI_ANY_ID, tegra_pcie_fixup_bridge);  /* Tegra PCIE root complex wrongly reports device class */ -static void __devinit tegra_pcie_fixup_class(struct pci_dev *dev) +static void tegra_pcie_fixup_class(struct pci_dev *dev)  {  	dev->class = PCI_CLASS_BRIDGE_PCI << 8;  } @@ -353,7 +353,7 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_NVIDIA, 0x0bf0, tegra_pcie_fixup_class);  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_NVIDIA, 0x0bf1, tegra_pcie_fixup_class);  /* Tegra PCIE requires relaxed ordering */ -static void __devinit tegra_pcie_relax_enable(struct pci_dev *dev) +static void tegra_pcie_relax_enable(struct pci_dev *dev)  {  	pcie_capability_set_word(dev, PCI_EXP_DEVCTL, PCI_EXP_DEVCTL_RELAX_EN);  } diff --git a/arch/arm/mach-tegra/tegra2_emc.c b/arch/arm/mach-tegra/tegra2_emc.c index 837c7b9ea63..e18aa2f83eb 100644 --- a/arch/arm/mach-tegra/tegra2_emc.c +++ b/arch/arm/mach-tegra/tegra2_emc.c @@ -268,7 +268,7 @@ static struct tegra_emc_pdata *tegra_emc_dt_parse_pdata(  }  #endif -static struct tegra_emc_pdata __devinit *tegra_emc_fill_pdata(struct platform_device *pdev) +static struct tegra_emc_pdata *tegra_emc_fill_pdata(struct platform_device *pdev)  {  	struct clk *c = clk_get_sys(NULL, "emc");  	struct tegra_emc_pdata *pdata; @@ -296,7 +296,7 @@ static struct tegra_emc_pdata __devinit *tegra_emc_fill_pdata(struct platform_de  	return pdata;  } -static int __devinit tegra_emc_probe(struct platform_device *pdev) +static int tegra_emc_probe(struct platform_device *pdev)  {  	struct tegra_emc_pdata *pdata;  	struct resource *res; @@ -333,7 +333,7 @@ static int __devinit tegra_emc_probe(struct platform_device *pdev)  	return 0;  } -static struct of_device_id tegra_emc_of_match[] __devinitdata = { +static struct of_device_id tegra_emc_of_match[] = {  	{ .compatible = "nvidia,tegra20-emc", },  	{ },  }; diff --git a/arch/arm/mach-u300/dummyspichip.c b/arch/arm/mach-u300/dummyspichip.c index 03f79361259..2785cb67b5e 100644 --- a/arch/arm/mach-u300/dummyspichip.c +++ b/arch/arm/mach-u300/dummyspichip.c @@ -222,7 +222,7 @@ static ssize_t dummy_looptest(struct device *dev,  static DEVICE_ATTR(looptest, S_IRUGO, dummy_looptest, NULL); -static int __devinit pl022_dummy_probe(struct spi_device *spi) +static int pl022_dummy_probe(struct spi_device *spi)  {  	struct dummy *p_dummy;  	int status; @@ -251,7 +251,7 @@ out_dev_create_looptest_failed:  	return status;  } -static int __devexit pl022_dummy_remove(struct spi_device *spi) +static int pl022_dummy_remove(struct spi_device *spi)  {  	struct dummy *p_dummy = dev_get_drvdata(&spi->dev); @@ -269,7 +269,7 @@ static struct spi_driver pl022_dummy_driver = {  		.owner	= THIS_MODULE,  	},  	.probe	= pl022_dummy_probe, -	.remove	= __devexit_p(pl022_dummy_remove), +	.remove	= pl022_dummy_remove,  };  static int __init pl022_init_dummy(void) diff --git a/arch/arm/mach-ux500/cpu-db8500.c b/arch/arm/mach-ux500/cpu-db8500.c index db0bb75e2c7..5b286e06474 100644 --- a/arch/arm/mach-ux500/cpu-db8500.c +++ b/arch/arm/mach-ux500/cpu-db8500.c @@ -285,7 +285,8 @@ static struct of_dev_auxdata u8500_auxdata_lookup[] __initdata = {  	OF_DEV_AUXDATA("st,nomadik-i2c", 0x80110000, "nmk-i2c.3", NULL),  	OF_DEV_AUXDATA("st,nomadik-i2c", 0x8012a000, "nmk-i2c.4", NULL),  	/* Requires device name bindings. */ -	OF_DEV_AUXDATA("stericsson,nmk_pinctrl", 0, "pinctrl-db8500", NULL), +	OF_DEV_AUXDATA("stericsson,nmk_pinctrl", U8500_PRCMU_BASE, +		"pinctrl-db8500", NULL),  	/* Requires clock name and DMA bindings. */  	OF_DEV_AUXDATA("stericsson,ux500-msp-i2s", 0x80123000,  		"ux500-msp-i2s.0", &msp0_platform_data), diff --git a/arch/arm/mach-versatile/include/mach/irqs.h b/arch/arm/mach-versatile/include/mach/irqs.h index bf44c61bd1f..0fd771ca617 100644 --- a/arch/arm/mach-versatile/include/mach/irqs.h +++ b/arch/arm/mach-versatile/include/mach/irqs.h @@ -25,7 +25,7 @@   *  IRQ interrupts definitions are the same as the INT definitions   *  held within platform.h   */ -#define IRQ_VIC_START		0 +#define IRQ_VIC_START		32  #define IRQ_WDOGINT		(IRQ_VIC_START + INT_WDOGINT)  #define IRQ_SOFTINT		(IRQ_VIC_START + INT_SOFTINT)  #define IRQ_COMMRx		(IRQ_VIC_START + INT_COMMRx) @@ -100,7 +100,7 @@  /*   * Secondary interrupt controller   */ -#define IRQ_SIC_START		32 +#define IRQ_SIC_START		64  #define IRQ_SIC_MMCI0B 		(IRQ_SIC_START + SIC_INT_MMCI0B)  #define IRQ_SIC_MMCI1B 		(IRQ_SIC_START + SIC_INT_MMCI1B)  #define IRQ_SIC_KMI0		(IRQ_SIC_START + SIC_INT_KMI0) @@ -120,7 +120,7 @@  #define IRQ_SIC_PCI1		(IRQ_SIC_START + SIC_INT_PCI1)  #define IRQ_SIC_PCI2		(IRQ_SIC_START + SIC_INT_PCI2)  #define IRQ_SIC_PCI3		(IRQ_SIC_START + SIC_INT_PCI3) -#define IRQ_SIC_END		63 +#define IRQ_SIC_END		95  #define IRQ_GPIO0_START		(IRQ_SIC_END + 1)  #define IRQ_GPIO0_END		(IRQ_GPIO0_START + 31) diff --git a/arch/arm/mach-vexpress/Kconfig b/arch/arm/mach-vexpress/Kconfig index 99e63f5f99d..52d315b792c 100644 --- a/arch/arm/mach-vexpress/Kconfig +++ b/arch/arm/mach-vexpress/Kconfig @@ -42,7 +42,6 @@ config ARCH_VEXPRESS_CORTEX_A5_A9_ERRATA  	bool "Enable A5 and A9 only errata work-arounds"  	default y  	select ARM_ERRATA_720789 -	select ARM_ERRATA_751472  	select PL310_ERRATA_753970 if CACHE_PL310  	help  	  Provides common dependencies for Versatile Express platforms diff --git a/arch/arm/mm/cache-l2x0.c b/arch/arm/mm/cache-l2x0.c index 6911b8b2745..c2f37390308 100644 --- a/arch/arm/mm/cache-l2x0.c +++ b/arch/arm/mm/cache-l2x0.c @@ -352,7 +352,8 @@ void __init l2x0_init(void __iomem *base, u32 aux_val, u32 aux_mask)  		/* Unmapped register. */  		sync_reg_offset = L2X0_DUMMY_REG;  #endif -		outer_cache.set_debug = pl310_set_debug; +		if ((cache_id & L2X0_CACHE_ID_RTL_MASK) <= L2X0_CACHE_ID_RTL_R3P0) +			outer_cache.set_debug = pl310_set_debug;  		break;  	case L2X0_CACHE_ID_PART_L210:  		ways = (aux >> 13) & 0xf; @@ -459,8 +460,8 @@ static void aurora_pa_range(unsigned long start, unsigned long end,  	unsigned long flags;  	raw_spin_lock_irqsave(&l2x0_lock, flags); -	writel(start, l2x0_base + AURORA_RANGE_BASE_ADDR_REG); -	writel(end, l2x0_base + offset); +	writel_relaxed(start, l2x0_base + AURORA_RANGE_BASE_ADDR_REG); +	writel_relaxed(end, l2x0_base + offset);  	raw_spin_unlock_irqrestore(&l2x0_lock, flags);  	cache_sync(); @@ -505,15 +506,21 @@ static void aurora_clean_range(unsigned long start, unsigned long end)  static void aurora_flush_range(unsigned long start, unsigned long end)  { -	if (!l2_wt_override) { -		start &= ~(CACHE_LINE_SIZE - 1); -		end = ALIGN(end, CACHE_LINE_SIZE); -		while (start != end) { -			unsigned long range_end = calc_range_end(start, end); +	start &= ~(CACHE_LINE_SIZE - 1); +	end = ALIGN(end, CACHE_LINE_SIZE); +	while (start != end) { +		unsigned long range_end = calc_range_end(start, end); +		/* +		 * If L2 is forced to WT, the L2 will always be clean and we +		 * just need to invalidate. +		 */ +		if (l2_wt_override)  			aurora_pa_range(start, range_end - CACHE_LINE_SIZE, -					AURORA_FLUSH_RANGE_REG); -			start = range_end; -		} +							AURORA_INVAL_RANGE_REG); +		else +			aurora_pa_range(start, range_end - CACHE_LINE_SIZE, +							AURORA_FLUSH_RANGE_REG); +		start = range_end;  	}  } @@ -668,8 +675,9 @@ static void pl310_resume(void)  static void aurora_resume(void)  {  	if (!(readl(l2x0_base + L2X0_CTRL) & L2X0_CTRL_EN)) { -		writel(l2x0_saved_regs.aux_ctrl, l2x0_base + L2X0_AUX_CTRL); -		writel(l2x0_saved_regs.ctrl, l2x0_base + L2X0_CTRL); +		writel_relaxed(l2x0_saved_regs.aux_ctrl, +				l2x0_base + L2X0_AUX_CTRL); +		writel_relaxed(l2x0_saved_regs.ctrl, l2x0_base + L2X0_CTRL);  	}  } diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index 6b2fb87c869..dda3904dc64 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c @@ -640,7 +640,7 @@ static void *__dma_alloc(struct device *dev, size_t size, dma_addr_t *handle,  	if (is_coherent || nommu())  		addr = __alloc_simple_buffer(dev, size, gfp, &page); -	else if (gfp & GFP_ATOMIC) +	else if (!(gfp & __GFP_WAIT))  		addr = __alloc_from_pool(size, &page);  	else if (!IS_ENABLED(CONFIG_CMA))  		addr = __alloc_remap_buffer(dev, size, gfp, prot, &page, caller); @@ -774,25 +774,27 @@ static void dma_cache_maint_page(struct page *page, unsigned long offset,  	size_t size, enum dma_data_direction dir,  	void (*op)(const void *, size_t, int))  { +	unsigned long pfn; +	size_t left = size; + +	pfn = page_to_pfn(page) + offset / PAGE_SIZE; +	offset %= PAGE_SIZE; +  	/*  	 * A single sg entry may refer to multiple physically contiguous  	 * pages.  But we still need to process highmem pages individually.  	 * If highmem is not configured then the bulk of this loop gets  	 * optimized out.  	 */ -	size_t left = size;  	do {  		size_t len = left;  		void *vaddr; +		page = pfn_to_page(pfn); +  		if (PageHighMem(page)) { -			if (len + offset > PAGE_SIZE) { -				if (offset >= PAGE_SIZE) { -					page += offset / PAGE_SIZE; -					offset %= PAGE_SIZE; -				} +			if (len + offset > PAGE_SIZE)  				len = PAGE_SIZE - offset; -			}  			vaddr = kmap_high_get(page);  			if (vaddr) {  				vaddr += offset; @@ -809,7 +811,7 @@ static void dma_cache_maint_page(struct page *page, unsigned long offset,  			op(vaddr, len, dir);  		}  		offset = 0; -		page++; +		pfn++;  		left -= len;  	} while (left);  } diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c index 9f0610243bd..ce328c7f5c9 100644 --- a/arch/arm/mm/mmu.c +++ b/arch/arm/mm/mmu.c @@ -283,7 +283,7 @@ static struct mem_type mem_types[] = {  	},  	[MT_MEMORY_SO] = {  		.prot_pte  = L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_DIRTY | -				L_PTE_MT_UNCACHED, +				L_PTE_MT_UNCACHED | L_PTE_XN,  		.prot_l1   = PMD_TYPE_TABLE,  		.prot_sect = PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_SECT_S |  				PMD_SECT_UNCACHED | PMD_SECT_XN, diff --git a/arch/arm/mm/proc-v7.S b/arch/arm/mm/proc-v7.S index 350f6a74992..3a3c015f8d5 100644 --- a/arch/arm/mm/proc-v7.S +++ b/arch/arm/mm/proc-v7.S @@ -169,6 +169,7 @@ __v7_ca15mp_setup:  	orreq	r0, r0, r10			@ Enable CPU-specific SMP bits  	mcreq	p15, 0, r0, c1, c0, 1  #endif +	b	__v7_setup  __v7_pj4b_setup:  #ifdef CONFIG_CPU_PJ4B @@ -245,7 +246,8 @@ __v7_setup:  	ldr	r10, =0x00000c08		@ Cortex-A8 primary part number  	teq	r0, r10  	bne	2f -#ifdef CONFIG_ARM_ERRATA_430973 +#if defined(CONFIG_ARM_ERRATA_430973) && !defined(CONFIG_ARCH_MULTIPLATFORM) +  	teq	r5, #0x00100000			@ only present in r1p*  	mrceq	p15, 0, r10, c1, c0, 1		@ read aux control register  	orreq	r10, r10, #(1 << 6)		@ set IBE to 1 diff --git a/arch/arm/plat-omap/counter_32k.c b/arch/arm/plat-omap/counter_32k.c index f3771cdb983..5b0b86bb34b 100644 --- a/arch/arm/plat-omap/counter_32k.c +++ b/arch/arm/plat-omap/counter_32k.c @@ -22,6 +22,8 @@  #include <asm/mach/time.h>  #include <asm/sched_clock.h> +#include <plat/counter-32k.h> +  /* OMAP2_32KSYNCNT_CR_OFF: offset of 32ksync counter register */  #define OMAP2_32KSYNCNT_REV_OFF		0x0  #define OMAP2_32KSYNCNT_REV_SCHEME	(0x3 << 30) diff --git a/arch/arm/plat-omap/dma.c b/arch/arm/plat-omap/dma.c index 37a488aaa2b..4136b20cba3 100644 --- a/arch/arm/plat-omap/dma.c +++ b/arch/arm/plat-omap/dma.c @@ -2000,7 +2000,7 @@ void omap_dma_global_context_restore(void)  			omap_clear_dma(ch);  } -static int __devinit omap_system_dma_probe(struct platform_device *pdev) +static int omap_system_dma_probe(struct platform_device *pdev)  {  	int ch, ret = 0;  	int dma_irq; @@ -2116,7 +2116,7 @@ exit_dma_lch_fail:  	return ret;  } -static int __devexit omap_system_dma_remove(struct platform_device *pdev) +static int omap_system_dma_remove(struct platform_device *pdev)  {  	int dma_irq; @@ -2140,7 +2140,7 @@ static int __devexit omap_system_dma_remove(struct platform_device *pdev)  static struct platform_driver omap_system_dma_driver = {  	.probe		= omap_system_dma_probe, -	.remove		= __devexit_p(omap_system_dma_remove), +	.remove		= omap_system_dma_remove,  	.driver		= {  		.name	= "omap_dma_system"  	}, diff --git a/arch/arm/plat-omap/dmtimer.c b/arch/arm/plat-omap/dmtimer.c index d51b75bdcad..7b433f3bddc 100644 --- a/arch/arm/plat-omap/dmtimer.c +++ b/arch/arm/plat-omap/dmtimer.c @@ -777,7 +777,7 @@ EXPORT_SYMBOL_GPL(omap_dm_timers_active);   * Called by driver framework at the end of device registration for all   * timer devices.   */ -static int __devinit omap_dm_timer_probe(struct platform_device *pdev) +static int omap_dm_timer_probe(struct platform_device *pdev)  {  	unsigned long flags;  	struct omap_dm_timer *timer; @@ -864,7 +864,7 @@ static int __devinit omap_dm_timer_probe(struct platform_device *pdev)   * In addition to freeing platform resources it also deletes the timer   * entry from the local list.   */ -static int __devexit omap_dm_timer_remove(struct platform_device *pdev) +static int omap_dm_timer_remove(struct platform_device *pdev)  {  	struct omap_dm_timer *timer;  	unsigned long flags; @@ -891,7 +891,7 @@ MODULE_DEVICE_TABLE(of, omap_timer_match);  static struct platform_driver omap_dm_timer_driver = {  	.probe  = omap_dm_timer_probe, -	.remove = __devexit_p(omap_dm_timer_remove), +	.remove = omap_dm_timer_remove,  	.driver = {  		.name   = "omap_timer",  		.of_match_table = of_match_ptr(omap_timer_match), diff --git a/arch/arm/plat-omap/sram.c b/arch/arm/plat-omap/sram.c index 743fc2836f7..a5bc92d7e47 100644 --- a/arch/arm/plat-omap/sram.c +++ b/arch/arm/plat-omap/sram.c @@ -26,6 +26,8 @@  #include <asm/mach/map.h> +#include <plat/sram.h> +  #define ROUND_DOWN(value,boundary)	((value) & (~((boundary)-1)))  static void __iomem *omap_sram_base; diff --git a/arch/arm/plat-pxa/ssp.c b/arch/arm/plat-pxa/ssp.c index 584c9bf8ed2..8e11e96eab5 100644 --- a/arch/arm/plat-pxa/ssp.c +++ b/arch/arm/plat-pxa/ssp.c @@ -72,7 +72,7 @@ void pxa_ssp_free(struct ssp_device *ssp)  }  EXPORT_SYMBOL(pxa_ssp_free); -static int __devinit pxa_ssp_probe(struct platform_device *pdev) +static int pxa_ssp_probe(struct platform_device *pdev)  {  	const struct platform_device_id *id = platform_get_device_id(pdev);  	struct resource *res; @@ -164,7 +164,7 @@ err_free:  	return ret;  } -static int __devexit pxa_ssp_remove(struct platform_device *pdev) +static int pxa_ssp_remove(struct platform_device *pdev)  {  	struct resource *res;  	struct ssp_device *ssp; @@ -199,7 +199,7 @@ static const struct platform_device_id ssp_id_table[] = {  static struct platform_driver pxa_ssp_driver = {  	.probe		= pxa_ssp_probe, -	.remove		= __devexit_p(pxa_ssp_remove), +	.remove		= pxa_ssp_remove,  	.driver		= {  		.owner	= THIS_MODULE,  		.name	= "pxa2xx-ssp", diff --git a/arch/arm/plat-samsung/adc.c b/arch/arm/plat-samsung/adc.c index 37542c2689a..2d676ab50f7 100644 --- a/arch/arm/plat-samsung/adc.c +++ b/arch/arm/plat-samsung/adc.c @@ -416,7 +416,7 @@ static int s3c_adc_probe(struct platform_device *pdev)  	return 0;  } -static int __devexit s3c_adc_remove(struct platform_device *pdev) +static int s3c_adc_remove(struct platform_device *pdev)  {  	struct adc_device *adc = platform_get_drvdata(pdev); @@ -516,7 +516,7 @@ static struct platform_driver s3c_adc_driver = {  		.pm	= &adc_pm_ops,  	},  	.probe		= s3c_adc_probe, -	.remove		= __devexit_p(s3c_adc_remove), +	.remove		= s3c_adc_remove,  };  static int __init adc_init(void) diff --git a/arch/arm/plat-samsung/include/plat/cpu.h b/arch/arm/plat-samsung/include/plat/cpu.h index e0072ce8d6e..b69e11dc679 100644 --- a/arch/arm/plat-samsung/include/plat/cpu.h +++ b/arch/arm/plat-samsung/include/plat/cpu.h @@ -43,7 +43,7 @@ extern unsigned long samsung_cpu_id;  #define EXYNOS4_CPU_MASK	0xFFFE0000  #define EXYNOS5250_SOC_ID	0x43520000 -#define EXYNOS5440_SOC_ID	0x54400000 +#define EXYNOS5440_SOC_ID	0xE5440000  #define EXYNOS5_SOC_MASK	0xFFFFF000  #define IS_SAMSUNG_CPU(name, id, mask)		\ diff --git a/arch/arm/plat-versatile/headsmp.S b/arch/arm/plat-versatile/headsmp.S index dd703ef09b8..b178d44e9ea 100644 --- a/arch/arm/plat-versatile/headsmp.S +++ b/arch/arm/plat-versatile/headsmp.S @@ -20,7 +20,7 @@   */  ENTRY(versatile_secondary_startup)  	mrc	p15, 0, r0, c0, c0, 5 -	and	r0, r0, #15 +	bic	r0, #0xff000000  	adr	r4, 1f  	ldmia	r4, {r5, r6}  	sub	r4, r4, r5 diff --git a/arch/arm/vfp/entry.S b/arch/arm/vfp/entry.S index cc926c98598..323ce1a62bb 100644 --- a/arch/arm/vfp/entry.S +++ b/arch/arm/vfp/entry.S @@ -22,7 +22,7 @@  @  IRQs disabled.  @  ENTRY(do_vfp) -#ifdef CONFIG_PREEMPT +#ifdef CONFIG_PREEMPT_COUNT  	ldr	r4, [r10, #TI_PREEMPT]	@ get preempt count  	add	r11, r4, #1		@ increment it  	str	r11, [r10, #TI_PREEMPT] @@ -35,7 +35,7 @@ ENTRY(do_vfp)  ENDPROC(do_vfp)  ENTRY(vfp_null_entry) -#ifdef CONFIG_PREEMPT +#ifdef CONFIG_PREEMPT_COUNT  	get_thread_info	r10  	ldr	r4, [r10, #TI_PREEMPT]	@ get preempt count  	sub	r11, r4, #1		@ decrement it @@ -53,7 +53,7 @@ ENDPROC(vfp_null_entry)  	__INIT  ENTRY(vfp_testing_entry) -#ifdef CONFIG_PREEMPT +#ifdef CONFIG_PREEMPT_COUNT  	get_thread_info	r10  	ldr	r4, [r10, #TI_PREEMPT]	@ get preempt count  	sub	r11, r4, #1		@ decrement it diff --git a/arch/arm/vfp/vfphw.S b/arch/arm/vfp/vfphw.S index ea0349f6358..dd5e56f95f3 100644 --- a/arch/arm/vfp/vfphw.S +++ b/arch/arm/vfp/vfphw.S @@ -168,7 +168,7 @@ vfp_hw_state_valid:  					@ else it's one 32-bit instruction, so  					@ always subtract 4 from the following  					@ instruction address. -#ifdef CONFIG_PREEMPT +#ifdef CONFIG_PREEMPT_COUNT  	get_thread_info	r10  	ldr	r4, [r10, #TI_PREEMPT]	@ get preempt count  	sub	r11, r4, #1		@ decrement it @@ -192,7 +192,7 @@ look_for_VFP_exceptions:  	@ not recognised by VFP  	DBGSTR	"not VFP" -#ifdef CONFIG_PREEMPT +#ifdef CONFIG_PREEMPT_COUNT  	get_thread_info	r10  	ldr	r4, [r10, #TI_PREEMPT]	@ get preempt count  	sub	r11, r4, #1		@ decrement it diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index 9c829b00826..75e915b7247 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -2,6 +2,8 @@ config ARM64  	def_bool y  	select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE  	select ARCH_WANT_COMPAT_IPC_PARSE_VERSION +	select ARM_AMBA +	select CLONE_BACKWARDS  	select COMMON_CLK  	select GENERIC_CLOCKEVENTS  	select GENERIC_HARDIRQS_NO_DEPRECATED @@ -19,7 +21,6 @@ config ARM64  	select HAVE_GENERIC_DMA_COHERENT  	select HAVE_GENERIC_HARDIRQS  	select HAVE_HW_BREAKPOINT if PERF_EVENTS -	select HAVE_IRQ_WORK  	select HAVE_MEMBLOCK  	select HAVE_PERF_EVENTS  	select IRQ_DOMAIN @@ -31,7 +32,6 @@ config ARM64  	select RTC_LIB  	select SPARSE_IRQ  	select SYSCTL_EXCEPTION_TRACE -	select CLONE_BACKWARDS  	help  	  ARM 64-bit (AArch64) Linux support. @@ -90,6 +90,9 @@ config SWIOTLB  config IOMMU_HELPER  	def_bool SWIOTLB +config GENERIC_GPIO +	def_bool y +  source "init/Kconfig"  source "kernel/Kconfig.freezer" diff --git a/arch/arm64/boot/dts/Makefile b/arch/arm64/boot/dts/Makefile index 801e2d7fcbc..32ac0aef006 100644 --- a/arch/arm64/boot/dts/Makefile +++ b/arch/arm64/boot/dts/Makefile @@ -1,4 +1,5 @@  targets += dtbs +targets += $(dtb-y)  dtbs: $(addprefix $(obj)/, $(dtb-y)) diff --git a/arch/arm64/include/asm/compat.h b/arch/arm64/include/asm/compat.h index d9ec40217a2..618b450e5a1 100644 --- a/arch/arm64/include/asm/compat.h +++ b/arch/arm64/include/asm/compat.h @@ -23,6 +23,7 @@   */  #include <linux/types.h>  #include <linux/sched.h> +#include <linux/ptrace.h>  #define COMPAT_USER_HZ		100  #define COMPAT_UTS_MACHINE	"armv8l\0\0" diff --git a/arch/arm64/include/asm/elf.h b/arch/arm64/include/asm/elf.h index 07fea290d7c..fe32c0e4ac0 100644 --- a/arch/arm64/include/asm/elf.h +++ b/arch/arm64/include/asm/elf.h @@ -26,7 +26,10 @@  typedef unsigned long elf_greg_t; -#define ELF_NGREG (sizeof (struct pt_regs) / sizeof(elf_greg_t)) +#define ELF_NGREG (sizeof(struct user_pt_regs) / sizeof(elf_greg_t)) +#define ELF_CORE_COPY_REGS(dest, regs)	\ +	*(struct user_pt_regs *)&(dest) = (regs)->user_regs; +  typedef elf_greg_t elf_gregset_t[ELF_NGREG];  typedef struct user_fpsimd_state elf_fpregset_t; diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h index 64b13394950..e333a243bfc 100644 --- a/arch/arm64/include/asm/pgtable.h +++ b/arch/arm64/include/asm/pgtable.h @@ -24,7 +24,8 @@  /*   * Software defined PTE bits definition.   */ -#define PTE_VALID		(_AT(pteval_t, 1) << 0)	/* pte_present() check */ +#define PTE_VALID		(_AT(pteval_t, 1) << 0) +#define PTE_PROT_NONE		(_AT(pteval_t, 1) << 1)	/* only when !PTE_VALID */  #define PTE_FILE		(_AT(pteval_t, 1) << 2)	/* only when !pte_present() */  #define PTE_DIRTY		(_AT(pteval_t, 1) << 55)  #define PTE_SPECIAL		(_AT(pteval_t, 1) << 56) @@ -60,9 +61,12 @@ extern void __pgd_error(const char *file, int line, unsigned long val);  extern pgprot_t pgprot_default; -#define _MOD_PROT(p, b)	__pgprot(pgprot_val(p) | (b)) +#define __pgprot_modify(prot,mask,bits) \ +	__pgprot((pgprot_val(prot) & ~(mask)) | (bits)) + +#define _MOD_PROT(p, b)		__pgprot_modify(p, 0, b) -#define PAGE_NONE		_MOD_PROT(pgprot_default, PTE_NG | PTE_PXN | PTE_UXN | PTE_RDONLY) +#define PAGE_NONE		__pgprot_modify(pgprot_default, PTE_TYPE_MASK, PTE_PROT_NONE)  #define PAGE_SHARED		_MOD_PROT(pgprot_default, PTE_USER | PTE_NG | PTE_PXN | PTE_UXN)  #define PAGE_SHARED_EXEC	_MOD_PROT(pgprot_default, PTE_USER | PTE_NG | PTE_PXN)  #define PAGE_COPY		_MOD_PROT(pgprot_default, PTE_USER | PTE_NG | PTE_PXN | PTE_UXN | PTE_RDONLY) @@ -72,7 +76,7 @@ extern pgprot_t pgprot_default;  #define PAGE_KERNEL		_MOD_PROT(pgprot_default, PTE_PXN | PTE_UXN | PTE_DIRTY)  #define PAGE_KERNEL_EXEC	_MOD_PROT(pgprot_default, PTE_UXN | PTE_DIRTY) -#define __PAGE_NONE		__pgprot(_PAGE_DEFAULT | PTE_NG | PTE_PXN | PTE_UXN | PTE_RDONLY) +#define __PAGE_NONE		__pgprot(((_PAGE_DEFAULT) & ~PTE_TYPE_MASK) | PTE_PROT_NONE)  #define __PAGE_SHARED		__pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN | PTE_UXN)  #define __PAGE_SHARED_EXEC	__pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN)  #define __PAGE_COPY		__pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN | PTE_UXN | PTE_RDONLY) @@ -125,16 +129,15 @@ extern struct page *empty_zero_page;  /*   * The following only work if pte_present(). Undefined behaviour otherwise.   */ -#define pte_present(pte)	(pte_val(pte) & PTE_VALID) +#define pte_present(pte)	(pte_val(pte) & (PTE_VALID | PTE_PROT_NONE))  #define pte_dirty(pte)		(pte_val(pte) & PTE_DIRTY)  #define pte_young(pte)		(pte_val(pte) & PTE_AF)  #define pte_special(pte)	(pte_val(pte) & PTE_SPECIAL)  #define pte_write(pte)		(!(pte_val(pte) & PTE_RDONLY))  #define pte_exec(pte)		(!(pte_val(pte) & PTE_UXN)) -#define pte_present_exec_user(pte) \ -	((pte_val(pte) & (PTE_VALID | PTE_USER | PTE_UXN)) == \ -	 (PTE_VALID | PTE_USER)) +#define pte_valid_user(pte) \ +	((pte_val(pte) & (PTE_VALID | PTE_USER)) == (PTE_VALID | PTE_USER))  #define PTE_BIT_FUNC(fn,op) \  static inline pte_t pte_##fn(pte_t pte) { pte_val(pte) op; return pte; } @@ -157,10 +160,13 @@ extern void __sync_icache_dcache(pte_t pteval, unsigned long addr);  static inline void set_pte_at(struct mm_struct *mm, unsigned long addr,  			      pte_t *ptep, pte_t pte)  { -	if (pte_present_exec_user(pte)) -		__sync_icache_dcache(pte, addr); -	if (!pte_dirty(pte)) -		pte = pte_wrprotect(pte); +	if (pte_valid_user(pte)) { +		if (pte_exec(pte)) +			__sync_icache_dcache(pte, addr); +		if (!pte_dirty(pte)) +			pte = pte_wrprotect(pte); +	} +  	set_pte(ptep, pte);  } @@ -170,9 +176,6 @@ static inline void set_pte_at(struct mm_struct *mm, unsigned long addr,  #define pte_huge(pte)		((pte_val(pte) & PTE_TYPE_MASK) == PTE_TYPE_HUGEPAGE)  #define pte_mkhuge(pte)		(__pte((pte_val(pte) & ~PTE_TYPE_MASK) | PTE_TYPE_HUGEPAGE)) -#define __pgprot_modify(prot,mask,bits)		\ -	__pgprot((pgprot_val(prot) & ~(mask)) | (bits)) -  #define __HAVE_ARCH_PTE_SPECIAL  /* @@ -264,7 +267,8 @@ static inline pmd_t *pmd_offset(pud_t *pud, unsigned long addr)  static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)  { -	const pteval_t mask = PTE_USER | PTE_PXN | PTE_UXN | PTE_RDONLY; +	const pteval_t mask = PTE_USER | PTE_PXN | PTE_UXN | PTE_RDONLY | +			      PTE_PROT_NONE | PTE_VALID;  	pte_val(pte) = (pte_val(pte) & ~mask) | (pgprot_val(newprot) & mask);  	return pte;  } diff --git a/arch/arm64/include/asm/unistd32.h b/arch/arm64/include/asm/unistd32.h index 58432625fdb..5ef47ba3ed4 100644 --- a/arch/arm64/include/asm/unistd32.h +++ b/arch/arm64/include/asm/unistd32.h @@ -395,8 +395,13 @@ __SYSCALL(370, sys_name_to_handle_at)  __SYSCALL(371, compat_sys_open_by_handle_at)  __SYSCALL(372, compat_sys_clock_adjtime)  __SYSCALL(373, sys_syncfs) +__SYSCALL(374, compat_sys_sendmmsg) +__SYSCALL(375, sys_setns) +__SYSCALL(376, compat_sys_process_vm_readv) +__SYSCALL(377, compat_sys_process_vm_writev) +__SYSCALL(378, sys_ni_syscall)			/* 378 for kcmp */ -#define __NR_compat_syscalls		374 +#define __NR_compat_syscalls		379  /*   * Compat syscall numbers used by the AArch64 kernel. diff --git a/arch/arm64/kernel/perf_event.c b/arch/arm64/kernel/perf_event.c index c76c7241125..f7073c7b1ca 100644 --- a/arch/arm64/kernel/perf_event.c +++ b/arch/arm64/kernel/perf_event.c @@ -1221,7 +1221,7 @@ static struct of_device_id armpmu_of_device_ids[] = {  	{},  }; -static int __devinit armpmu_device_probe(struct platform_device *pdev) +static int armpmu_device_probe(struct platform_device *pdev)  {  	if (!cpu_pmu)  		return -ENODEV; diff --git a/arch/arm64/kernel/vdso.c b/arch/arm64/kernel/vdso.c index c958cb84d75..6a389dc1bd4 100644 --- a/arch/arm64/kernel/vdso.c +++ b/arch/arm64/kernel/vdso.c @@ -252,10 +252,6 @@ void update_vsyscall(struct timekeeper *tk)  void update_vsyscall_tz(void)  { -	++vdso_data->tb_seq_count; -	smp_wmb();  	vdso_data->tz_minuteswest	= sys_tz.tz_minuteswest;  	vdso_data->tz_dsttime		= sys_tz.tz_dsttime; -	smp_wmb(); -	++vdso_data->tb_seq_count;  } diff --git a/arch/arm64/kernel/vdso/gettimeofday.S b/arch/arm64/kernel/vdso/gettimeofday.S index 8bf658d974f..f0a6d10b521 100644 --- a/arch/arm64/kernel/vdso/gettimeofday.S +++ b/arch/arm64/kernel/vdso/gettimeofday.S @@ -73,8 +73,6 @@ ENTRY(__kernel_gettimeofday)  	/* If tz is NULL, return 0. */  	cbz	x1, 3f  	ldp	w4, w5, [vdso_data, #VDSO_TZ_MINWEST] -	seqcnt_read w9 -	seqcnt_check w9, 1b  	stp	w4, w5, [x1, #TZ_MINWEST]  3:  	mov	x0, xzr diff --git a/arch/avr32/include/asm/dma-mapping.h b/arch/avr32/include/asm/dma-mapping.h index aaf5199d8fc..b3d18f9f3e8 100644 --- a/arch/avr32/include/asm/dma-mapping.h +++ b/arch/avr32/include/asm/dma-mapping.h @@ -336,4 +336,14 @@ dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg,  #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) +/* drivers/base/dma-mapping.c */ +extern int dma_common_mmap(struct device *dev, struct vm_area_struct *vma, +			   void *cpu_addr, dma_addr_t dma_addr, size_t size); +extern int dma_common_get_sgtable(struct device *dev, struct sg_table *sgt, +				  void *cpu_addr, dma_addr_t dma_addr, +				  size_t size); + +#define dma_mmap_coherent(d, v, c, h, s) dma_common_mmap(d, v, c, h, s) +#define dma_get_sgtable(d, t, v, h, s) dma_common_get_sgtable(d, t, v, h, s) +  #endif /* __ASM_AVR32_DMA_MAPPING_H */ diff --git a/arch/avr32/lib/delay.c b/arch/avr32/lib/delay.c index 9aa8800830f..c2f4a07dcda 100644 --- a/arch/avr32/lib/delay.c +++ b/arch/avr32/lib/delay.c @@ -20,7 +20,7 @@  #include <asm/processor.h>  #include <asm/sysreg.h> -int __devinit read_current_timer(unsigned long *timer_value) +int read_current_timer(unsigned long *timer_value)  {  	*timer_value = sysreg_read(COUNT);  	return 0; diff --git a/arch/blackfin/Kconfig b/arch/blackfin/Kconfig index b6f3ad5441c..67e4aaad78f 100644 --- a/arch/blackfin/Kconfig +++ b/arch/blackfin/Kconfig @@ -24,7 +24,6 @@ config BLACKFIN  	select HAVE_FUNCTION_TRACER  	select HAVE_FUNCTION_TRACE_MCOUNT_TEST  	select HAVE_IDE -	select HAVE_IRQ_WORK  	select HAVE_KERNEL_GZIP if RAMKERNEL  	select HAVE_KERNEL_BZIP2 if RAMKERNEL  	select HAVE_KERNEL_LZMA if RAMKERNEL @@ -38,7 +37,6 @@ config BLACKFIN  	select HAVE_GENERIC_HARDIRQS  	select GENERIC_ATOMIC64  	select GENERIC_IRQ_PROBE -	select IRQ_PER_CPU if SMP  	select USE_GENERIC_SMP_HELPERS if SMP  	select HAVE_NMI_WATCHDOG if NMI_WATCHDOG  	select GENERIC_SMP_IDLE_THREAD diff --git a/arch/blackfin/include/asm/dma-mapping.h b/arch/blackfin/include/asm/dma-mapping.h index bbf461076a0..054d9ec57d9 100644 --- a/arch/blackfin/include/asm/dma-mapping.h +++ b/arch/blackfin/include/asm/dma-mapping.h @@ -154,4 +154,14 @@ dma_cache_sync(struct device *dev, void *vaddr, size_t size,  	_dma_sync((dma_addr_t)vaddr, size, dir);  } +/* drivers/base/dma-mapping.c */ +extern int dma_common_mmap(struct device *dev, struct vm_area_struct *vma, +			   void *cpu_addr, dma_addr_t dma_addr, size_t size); +extern int dma_common_get_sgtable(struct device *dev, struct sg_table *sgt, +				  void *cpu_addr, dma_addr_t dma_addr, +				  size_t size); + +#define dma_mmap_coherent(d, v, c, h, s) dma_common_mmap(d, v, c, h, s) +#define dma_get_sgtable(d, t, v, h, s) dma_common_get_sgtable(d, t, v, h, s) +  #endif				/* _BLACKFIN_DMA_MAPPING_H */ diff --git a/arch/blackfin/mach-common/dpmc.c b/arch/blackfin/mach-common/dpmc.c index 978bb400be0..724a8c5f557 100644 --- a/arch/blackfin/mach-common/dpmc.c +++ b/arch/blackfin/mach-common/dpmc.c @@ -129,7 +129,7 @@ static struct notifier_block vreg_cpufreq_notifier_block = {   *	bfin_dpmc_probe -   *   */ -static int __devinit bfin_dpmc_probe(struct platform_device *pdev) +static int bfin_dpmc_probe(struct platform_device *pdev)  {  	if (pdev->dev.platform_data)  		pdata = pdev->dev.platform_data; @@ -143,7 +143,7 @@ static int __devinit bfin_dpmc_probe(struct platform_device *pdev)  /**   *	bfin_dpmc_remove -   */ -static int __devexit bfin_dpmc_remove(struct platform_device *pdev) +static int bfin_dpmc_remove(struct platform_device *pdev)  {  	pdata = NULL;  	return cpufreq_unregister_notifier(&vreg_cpufreq_notifier_block, @@ -152,7 +152,7 @@ static int __devexit bfin_dpmc_remove(struct platform_device *pdev)  struct platform_driver bfin_dpmc_device_driver = {  	.probe   = bfin_dpmc_probe, -	.remove  = __devexit_p(bfin_dpmc_remove), +	.remove  = bfin_dpmc_remove,  	.driver  = {  		.name = DRIVER_NAME,  	} diff --git a/arch/c6x/include/asm/dma-mapping.h b/arch/c6x/include/asm/dma-mapping.h index 3c694065030..88bd0d899bd 100644 --- a/arch/c6x/include/asm/dma-mapping.h +++ b/arch/c6x/include/asm/dma-mapping.h @@ -89,4 +89,19 @@ extern void dma_free_coherent(struct device *, size_t, void *, dma_addr_t);  #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)) +/* Not supported for now */ +static inline int dma_mmap_coherent(struct device *dev, +				    struct vm_area_struct *vma, void *cpu_addr, +				    dma_addr_t dma_addr, size_t size) +{ +	return -EINVAL; +} + +static inline int dma_get_sgtable(struct device *dev, struct sg_table *sgt, +				  void *cpu_addr, dma_addr_t dma_addr, +				  size_t size) +{ +	return -EINVAL; +} +  #endif	/* _ASM_C6X_DMA_MAPPING_H */ diff --git a/arch/cris/arch-v32/drivers/pci/bios.c b/arch/cris/arch-v32/drivers/pci/bios.c index e3dfc72d0cf..64a5fb93767 100644 --- a/arch/cris/arch-v32/drivers/pci/bios.c +++ b/arch/cris/arch-v32/drivers/pci/bios.c @@ -2,7 +2,7 @@  #include <linux/kernel.h>  #include <arch/hwregs/intr_vect.h> -void __devinit  pcibios_fixup_bus(struct pci_bus *b) +void pcibios_fixup_bus(struct pci_bus *b)  {  } diff --git a/arch/cris/arch-v32/kernel/smp.c b/arch/cris/arch-v32/kernel/smp.c index ebe2cb30bd1..04a16edd540 100644 --- a/arch/cris/arch-v32/kernel/smp.c +++ b/arch/cris/arch-v32/kernel/smp.c @@ -84,7 +84,7 @@ void __init smp_prepare_cpus(unsigned int max_cpus)  		cpumask_set_cpu(i, &phys_cpu_present_map);  } -void __devinit smp_prepare_boot_cpu(void) +void smp_prepare_boot_cpu(void)  {  	/* PGD pointer has moved after per_cpu initialization so  	 * update the MMU. diff --git a/arch/cris/include/asm/dma-mapping.h b/arch/cris/include/asm/dma-mapping.h index 8588b2ccf85..2f0f654f1b4 100644 --- a/arch/cris/include/asm/dma-mapping.h +++ b/arch/cris/include/asm/dma-mapping.h @@ -158,5 +158,15 @@ dma_cache_sync(struct device *dev, void *vaddr, size_t size,  {  } +/* drivers/base/dma-mapping.c */ +extern int dma_common_mmap(struct device *dev, struct vm_area_struct *vma, +			   void *cpu_addr, dma_addr_t dma_addr, size_t size); +extern int dma_common_get_sgtable(struct device *dev, struct sg_table *sgt, +				  void *cpu_addr, dma_addr_t dma_addr, +				  size_t size); + +#define dma_mmap_coherent(d, v, c, h, s) dma_common_mmap(d, v, c, h, s) +#define dma_get_sgtable(d, t, v, h, s) dma_common_get_sgtable(d, t, v, h, s) +  #endif diff --git a/arch/frv/Kconfig b/arch/frv/Kconfig index 9d262645f66..17df48fc8f4 100644 --- a/arch/frv/Kconfig +++ b/arch/frv/Kconfig @@ -3,7 +3,6 @@ config FRV  	default y  	select HAVE_IDE  	select HAVE_ARCH_TRACEHOOK -	select HAVE_IRQ_WORK  	select HAVE_PERF_EVENTS  	select HAVE_UID16  	select HAVE_GENERIC_HARDIRQS diff --git a/arch/frv/include/asm/dma-mapping.h b/arch/frv/include/asm/dma-mapping.h index dfb811002c6..1746a2b8e6e 100644 --- a/arch/frv/include/asm/dma-mapping.h +++ b/arch/frv/include/asm/dma-mapping.h @@ -132,4 +132,19 @@ void dma_cache_sync(struct device *dev, void *vaddr, size_t size,  	flush_write_buffers();  } +/* Not supported for now */ +static inline int dma_mmap_coherent(struct device *dev, +				    struct vm_area_struct *vma, void *cpu_addr, +				    dma_addr_t dma_addr, size_t size) +{ +	return -EINVAL; +} + +static inline int dma_get_sgtable(struct device *dev, struct sg_table *sgt, +				  void *cpu_addr, dma_addr_t dma_addr, +				  size_t size) +{ +	return -EINVAL; +} +  #endif  /* _ASM_DMA_MAPPING_H */ diff --git a/arch/frv/kernel/setup.c b/arch/frv/kernel/setup.c index 3cb3392f799..a5136474c6f 100644 --- a/arch/frv/kernel/setup.c +++ b/arch/frv/kernel/setup.c @@ -852,7 +852,7 @@ void __init setup_arch(char **cmdline_p)  /*   *   */ -static int __devinit setup_arch_serial(void) +static int setup_arch_serial(void)  {  	/* register those serial ports that are available */  #ifndef CONFIG_GDBSTUB_UART0 diff --git a/arch/frv/mb93090-mb00/pci-vdk.c b/arch/frv/mb93090-mb00/pci-vdk.c index 71e9bcf5810..d186b254ce9 100644 --- a/arch/frv/mb93090-mb00/pci-vdk.c +++ b/arch/frv/mb93090-mb00/pci-vdk.c @@ -268,7 +268,7 @@ static void __init pci_fixup_umc_ide(struct pci_dev *d)  		d->resource[i].flags |= PCI_BASE_ADDRESS_SPACE_IO;  } -static void __devinit pci_fixup_ide_bases(struct pci_dev *d) +static void pci_fixup_ide_bases(struct pci_dev *d)  {  	int i; @@ -287,7 +287,7 @@ static void __devinit pci_fixup_ide_bases(struct pci_dev *d)  	}  } -static void __devinit pci_fixup_ide_trash(struct pci_dev *d) +static void pci_fixup_ide_trash(struct pci_dev *d)  {  	int i; @@ -300,7 +300,7 @@ static void __devinit pci_fixup_ide_trash(struct pci_dev *d)  		d->resource[i].start = d->resource[i].end = d->resource[i].flags = 0;  } -static void __devinit  pci_fixup_latency(struct pci_dev *d) +static void pci_fixup_latency(struct pci_dev *d)  {  	/*  	 *  SiS 5597 and 5598 chipsets require latency timer set to diff --git a/arch/hexagon/Kconfig b/arch/hexagon/Kconfig index 0744f7d7b1f..e4decc6b894 100644 --- a/arch/hexagon/Kconfig +++ b/arch/hexagon/Kconfig @@ -12,9 +12,7 @@ config HEXAGON  	# select ARCH_WANT_OPTIONAL_GPIOLIB  	# select ARCH_REQUIRE_GPIOLIB  	# select HAVE_CLK -	# select IRQ_PER_CPU  	# select GENERIC_PENDING_IRQ if SMP -	select HAVE_IRQ_WORK  	select GENERIC_ATOMIC64  	select HAVE_PERF_EVENTS  	select HAVE_GENERIC_HARDIRQS diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig index 3279646120e..00c2e88f775 100644 --- a/arch/ia64/Kconfig +++ b/arch/ia64/Kconfig @@ -29,7 +29,6 @@ config IA64  	select ARCH_DISCARD_MEMBLOCK  	select GENERIC_IRQ_PROBE  	select GENERIC_PENDING_IRQ if SMP -	select IRQ_PER_CPU  	select GENERIC_IRQ_SHOW  	select ARCH_WANT_OPTIONAL_GPIOLIB  	select ARCH_HAVE_NMI_SAFE_CMPXCHG diff --git a/arch/ia64/include/asm/acpi.h b/arch/ia64/include/asm/acpi.h index 301609c3fce..359e68a03ca 100644 --- a/arch/ia64/include/asm/acpi.h +++ b/arch/ia64/include/asm/acpi.h @@ -153,7 +153,7 @@ extern int additional_cpus;  #else  #define MAX_PXM_DOMAINS (256)  #endif -extern int __devinitdata pxm_to_nid_map[MAX_PXM_DOMAINS]; +extern int pxm_to_nid_map[MAX_PXM_DOMAINS];  extern int __initdata nid_to_pxm_map[MAX_NUMNODES];  #endif diff --git a/arch/ia64/include/asm/cputime.h b/arch/ia64/include/asm/cputime.h index 7fcf7f08ab0..e2d3f5baf26 100644 --- a/arch/ia64/include/asm/cputime.h +++ b/arch/ia64/include/asm/cputime.h @@ -11,99 +11,19 @@   * as published by the Free Software Foundation; either version   * 2 of the License, or (at your option) any later version.   * - * If we have CONFIG_VIRT_CPU_ACCOUNTING, we measure cpu time in nsec. + * If we have CONFIG_VIRT_CPU_ACCOUNTING_NATIVE, we measure cpu time in nsec.   * Otherwise we measure cpu time in jiffies using the generic definitions.   */  #ifndef __IA64_CPUTIME_H  #define __IA64_CPUTIME_H -#ifndef CONFIG_VIRT_CPU_ACCOUNTING -#include <asm-generic/cputime.h> +#ifndef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE +# include <asm-generic/cputime.h>  #else - -#include <linux/time.h> -#include <linux/jiffies.h> -#include <asm/processor.h> - -typedef u64 __nocast cputime_t; -typedef u64 __nocast cputime64_t; - -#define cputime_one_jiffy		jiffies_to_cputime(1) - -/* - * Convert cputime <-> jiffies (HZ) - */ -#define cputime_to_jiffies(__ct)	\ -	((__force u64)(__ct) / (NSEC_PER_SEC / HZ)) -#define jiffies_to_cputime(__jif)	\ -	(__force cputime_t)((__jif) * (NSEC_PER_SEC / HZ)) -#define cputime64_to_jiffies64(__ct)	\ -	((__force u64)(__ct) / (NSEC_PER_SEC / HZ)) -#define jiffies64_to_cputime64(__jif)	\ -	(__force cputime64_t)((__jif) * (NSEC_PER_SEC / HZ)) - -/* - * Convert cputime <-> microseconds - */ -#define cputime_to_usecs(__ct)		\ -	((__force u64)(__ct) / NSEC_PER_USEC) -#define usecs_to_cputime(__usecs)	\ -	(__force cputime_t)((__usecs) * NSEC_PER_USEC) -#define usecs_to_cputime64(__usecs)	\ -	(__force cputime64_t)((__usecs) * NSEC_PER_USEC) - -/* - * Convert cputime <-> seconds - */ -#define cputime_to_secs(__ct)		\ -	((__force u64)(__ct) / NSEC_PER_SEC) -#define secs_to_cputime(__secs)		\ -	(__force cputime_t)((__secs) * NSEC_PER_SEC) - -/* - * Convert cputime <-> timespec (nsec) - */ -static inline cputime_t timespec_to_cputime(const struct timespec *val) -{ -	u64 ret = val->tv_sec * NSEC_PER_SEC + val->tv_nsec; -	return (__force cputime_t) ret; -} -static inline void cputime_to_timespec(const cputime_t ct, struct timespec *val) -{ -	val->tv_sec  = (__force u64) ct / NSEC_PER_SEC; -	val->tv_nsec = (__force u64) ct % NSEC_PER_SEC; -} - -/* - * Convert cputime <-> timeval (msec) - */ -static inline cputime_t timeval_to_cputime(struct timeval *val) -{ -	u64 ret = val->tv_sec * NSEC_PER_SEC + val->tv_usec * NSEC_PER_USEC; -	return (__force cputime_t) ret; -} -static inline void cputime_to_timeval(const cputime_t ct, struct timeval *val) -{ -	val->tv_sec = (__force u64) ct / NSEC_PER_SEC; -	val->tv_usec = ((__force u64) ct % NSEC_PER_SEC) / NSEC_PER_USEC; -} - -/* - * Convert cputime <-> clock (USER_HZ) - */ -#define cputime_to_clock_t(__ct)	\ -	((__force u64)(__ct) / (NSEC_PER_SEC / USER_HZ)) -#define clock_t_to_cputime(__x)		\ -	(__force cputime_t)((__x) * (NSEC_PER_SEC / USER_HZ)) - -/* - * Convert cputime64 to clock. - */ -#define cputime64_to_clock_t(__ct)	\ -	cputime_to_clock_t((__force cputime_t)__ct) - +# include <asm/processor.h> +# include <asm-generic/cputime_nsecs.h>  extern void arch_vtime_task_switch(struct task_struct *tsk); +#endif /* CONFIG_VIRT_CPU_ACCOUNTING_NATIVE */ -#endif /* CONFIG_VIRT_CPU_ACCOUNTING */  #endif /* __IA64_CPUTIME_H */ diff --git a/arch/ia64/include/asm/iosapic.h b/arch/ia64/include/asm/iosapic.h index b9c102e15f2..94c89a2d97f 100644 --- a/arch/ia64/include/asm/iosapic.h +++ b/arch/ia64/include/asm/iosapic.h @@ -87,18 +87,13 @@ static inline void iosapic_eoi(char __iomem *iosapic, u32 vector)  }  extern void __init iosapic_system_init (int pcat_compat); -extern int __devinit iosapic_init (unsigned long address, -				    unsigned int gsi_base); -#ifdef CONFIG_HOTPLUG +extern int iosapic_init (unsigned long address, unsigned int gsi_base);  extern int iosapic_remove (unsigned int gsi_base); -#else -#define iosapic_remove(gsi_base)				(-EINVAL) -#endif /* CONFIG_HOTPLUG */  extern int gsi_to_irq (unsigned int gsi);  extern int iosapic_register_intr (unsigned int gsi, unsigned long polarity,  				  unsigned long trigger);  extern void iosapic_unregister_intr (unsigned int irq); -extern void __devinit iosapic_override_isa_irq (unsigned int isa_irq, unsigned int gsi, +extern void iosapic_override_isa_irq (unsigned int isa_irq, unsigned int gsi,  				      unsigned long polarity,  				      unsigned long trigger);  extern int __init iosapic_register_platform_intr (u32 int_type, @@ -109,7 +104,7 @@ extern int __init iosapic_register_platform_intr (u32 int_type,  					   unsigned long trigger);  #ifdef CONFIG_NUMA -extern void __devinit map_iosapic_to_node (unsigned int, int); +extern void map_iosapic_to_node (unsigned int, int);  #endif  #else  #define iosapic_system_init(pcat_compat)			do { } while (0) diff --git a/arch/ia64/include/asm/parport.h b/arch/ia64/include/asm/parport.h index 67e16adfcd2..638b4d271b9 100644 --- a/arch/ia64/include/asm/parport.h +++ b/arch/ia64/include/asm/parport.h @@ -9,10 +9,9 @@  #ifndef _ASM_IA64_PARPORT_H  #define _ASM_IA64_PARPORT_H 1 -static int __devinit parport_pc_find_isa_ports (int autoirq, int autodma); +static int parport_pc_find_isa_ports(int autoirq, int autodma); -static int __devinit -parport_pc_find_nonpci_ports (int autoirq, int autodma) +static int parport_pc_find_nonpci_ports(int autoirq, int autodma)  {  	return parport_pc_find_isa_ports(autoirq, autodma);  } diff --git a/arch/ia64/include/asm/smp.h b/arch/ia64/include/asm/smp.h index 0b3b3997dec..fea21e98602 100644 --- a/arch/ia64/include/asm/smp.h +++ b/arch/ia64/include/asm/smp.h @@ -55,7 +55,7 @@ extern struct smp_boot_data {  	int cpu_phys_id[NR_CPUS];  } smp_boot_data __initdata; -extern char no_int_routing __devinitdata; +extern char no_int_routing;  extern cpumask_t cpu_core_map[NR_CPUS];  DECLARE_PER_CPU_SHARED_ALIGNED(cpumask_t, cpu_sibling_map); diff --git a/arch/ia64/include/asm/thread_info.h b/arch/ia64/include/asm/thread_info.h index ff2ae413658..020d655ed08 100644 --- a/arch/ia64/include/asm/thread_info.h +++ b/arch/ia64/include/asm/thread_info.h @@ -31,7 +31,7 @@ struct thread_info {  	mm_segment_t addr_limit;	/* user-level address space limit */  	int preempt_count;		/* 0=premptable, <0=BUG; will also serve as bh-counter */  	struct restart_block restart_block; -#ifdef CONFIG_VIRT_CPU_ACCOUNTING +#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE  	__u64 ac_stamp;  	__u64 ac_leave;  	__u64 ac_stime; @@ -69,7 +69,7 @@ struct thread_info {  #define task_stack_page(tsk)	((void *)(tsk))  #define __HAVE_THREAD_FUNCTIONS -#ifdef CONFIG_VIRT_CPU_ACCOUNTING +#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE  #define setup_thread_stack(p, org)			\  	*task_thread_info(p) = *task_thread_info(org);	\  	task_thread_info(p)->ac_stime = 0;		\ diff --git a/arch/ia64/include/asm/unistd.h b/arch/ia64/include/asm/unistd.h index 8b3ff2f5b86..c3cc42a15af 100644 --- a/arch/ia64/include/asm/unistd.h +++ b/arch/ia64/include/asm/unistd.h @@ -11,7 +11,7 @@ -#define NR_syscalls			311 /* length of syscall table */ +#define NR_syscalls			312 /* length of syscall table */  /*   * The following defines stop scripts/checksyscalls.sh from complaining about diff --git a/arch/ia64/include/asm/xen/minstate.h b/arch/ia64/include/asm/xen/minstate.h index c57fa910f2c..00cf03e0cb8 100644 --- a/arch/ia64/include/asm/xen/minstate.h +++ b/arch/ia64/include/asm/xen/minstate.h @@ -1,5 +1,5 @@ -#ifdef CONFIG_VIRT_CPU_ACCOUNTING +#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE  /* read ar.itc in advance, and use it before leaving bank 0 */  #define XEN_ACCOUNT_GET_STAMP		\  	MOV_FROM_ITC(pUStk, p6, r20, r2); diff --git a/arch/ia64/include/uapi/asm/unistd.h b/arch/ia64/include/uapi/asm/unistd.h index b706aa54df2..34fd6fe46da 100644 --- a/arch/ia64/include/uapi/asm/unistd.h +++ b/arch/ia64/include/uapi/asm/unistd.h @@ -324,5 +324,6 @@  #define __NR_process_vm_readv		1332  #define __NR_process_vm_writev		1333  #define __NR_accept4			1334 +#define __NR_finit_module		1335  #endif /* _UAPI_ASM_IA64_UNISTD_H */ diff --git a/arch/ia64/kernel/acpi.c b/arch/ia64/kernel/acpi.c index e9682f5be34..335eb07480f 100644 --- a/arch/ia64/kernel/acpi.c +++ b/arch/ia64/kernel/acpi.c @@ -422,7 +422,7 @@ static int __init acpi_parse_madt(struct acpi_table_header *table)  #define PXM_FLAG_LEN ((MAX_PXM_DOMAINS + 1)/32)  static int __initdata srat_num_cpus;	/* number of cpus */ -static u32 __devinitdata pxm_flag[PXM_FLAG_LEN]; +static u32 pxm_flag[PXM_FLAG_LEN];  #define pxm_bit_set(bit)	(set_bit(bit,(void *)pxm_flag))  #define pxm_bit_test(bit)	(test_bit(bit,(void *)pxm_flag))  static struct acpi_table_slit __initdata *slit_table; @@ -956,8 +956,8 @@ EXPORT_SYMBOL(acpi_unmap_lsapic);  #endif				/* CONFIG_ACPI_HOTPLUG_CPU */  #ifdef CONFIG_ACPI_NUMA -static acpi_status __devinit -acpi_map_iosapic(acpi_handle handle, u32 depth, void *context, void **ret) +static acpi_status acpi_map_iosapic(acpi_handle handle, u32 depth, +				    void *context, void **ret)  {  	struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };  	union acpi_object *obj; diff --git a/arch/ia64/kernel/asm-offsets.c b/arch/ia64/kernel/asm-offsets.c index a48bd9a9927..46c9e300731 100644 --- a/arch/ia64/kernel/asm-offsets.c +++ b/arch/ia64/kernel/asm-offsets.c @@ -41,7 +41,7 @@ void foo(void)  	DEFINE(TI_FLAGS, offsetof(struct thread_info, flags));  	DEFINE(TI_CPU, offsetof(struct thread_info, cpu));  	DEFINE(TI_PRE_COUNT, offsetof(struct thread_info, preempt_count)); -#ifdef CONFIG_VIRT_CPU_ACCOUNTING +#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE  	DEFINE(TI_AC_STAMP, offsetof(struct thread_info, ac_stamp));  	DEFINE(TI_AC_LEAVE, offsetof(struct thread_info, ac_leave));  	DEFINE(TI_AC_STIME, offsetof(struct thread_info, ac_stime)); diff --git a/arch/ia64/kernel/entry.S b/arch/ia64/kernel/entry.S index e25b784a2b7..7a53530f22c 100644 --- a/arch/ia64/kernel/entry.S +++ b/arch/ia64/kernel/entry.S @@ -724,7 +724,7 @@ GLOBAL_ENTRY(__paravirt_leave_syscall)  #endif  .global __paravirt_work_processed_syscall;  __paravirt_work_processed_syscall: -#ifdef CONFIG_VIRT_CPU_ACCOUNTING +#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE  	adds r2=PT(LOADRS)+16,r12  	MOV_FROM_ITC(pUStk, p9, r22, r19)	// fetch time at leave  	adds r18=TI_FLAGS+IA64_TASK_SIZE,r13 @@ -762,7 +762,7 @@ __paravirt_work_processed_syscall:  	ld8 r29=[r2],16		// M0|1 load cr.ipsr  	ld8 r28=[r3],16		// M0|1 load cr.iip -#ifdef CONFIG_VIRT_CPU_ACCOUNTING +#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE  (pUStk) add r14=TI_AC_LEAVE+IA64_TASK_SIZE,r13  	;;  	ld8 r30=[r2],16		// M0|1 load cr.ifs @@ -793,7 +793,7 @@ __paravirt_work_processed_syscall:  	ld8.fill r1=[r3],16			// M0|1 load r1  (pUStk) mov r17=1				// A  	;; -#ifdef CONFIG_VIRT_CPU_ACCOUNTING +#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE  (pUStk) st1 [r15]=r17				// M2|3  #else  (pUStk) st1 [r14]=r17				// M2|3 @@ -813,7 +813,7 @@ __paravirt_work_processed_syscall:  	shr.u r18=r19,16		// I0|1 get byte size of existing "dirty" partition  	COVER				// B    add current frame into dirty partition & set cr.ifs  	;; -#ifdef CONFIG_VIRT_CPU_ACCOUNTING +#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE  	mov r19=ar.bsp			// M2   get new backing store pointer  	st8 [r14]=r22			// M	save time at leave  	mov f10=f0			// F    clear f10 @@ -948,7 +948,7 @@ GLOBAL_ENTRY(__paravirt_leave_kernel)  	adds r16=PT(CR_IPSR)+16,r12  	adds r17=PT(CR_IIP)+16,r12 -#ifdef CONFIG_VIRT_CPU_ACCOUNTING +#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE  	.pred.rel.mutex pUStk,pKStk  	MOV_FROM_PSR(pKStk, r22, r29)	// M2 read PSR now that interrupts are disabled  	MOV_FROM_ITC(pUStk, p9, r22, r29)	// M  fetch time at leave @@ -981,7 +981,7 @@ GLOBAL_ENTRY(__paravirt_leave_kernel)  	;;  	ld8.fill r12=[r16],16  	ld8.fill r13=[r17],16 -#ifdef CONFIG_VIRT_CPU_ACCOUNTING +#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE  (pUStk)	adds r3=TI_AC_LEAVE+IA64_TASK_SIZE,r18  #else  (pUStk)	adds r18=IA64_TASK_THREAD_ON_USTACK_OFFSET,r18 @@ -989,7 +989,7 @@ GLOBAL_ENTRY(__paravirt_leave_kernel)  	;;  	ld8 r20=[r16],16	// ar.fpsr  	ld8.fill r15=[r17],16 -#ifdef CONFIG_VIRT_CPU_ACCOUNTING +#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE  (pUStk)	adds r18=IA64_TASK_THREAD_ON_USTACK_OFFSET,r18	// deferred  #endif  	;; @@ -997,7 +997,7 @@ GLOBAL_ENTRY(__paravirt_leave_kernel)  	ld8.fill r2=[r17]  (pUStk)	mov r17=1  	;; -#ifdef CONFIG_VIRT_CPU_ACCOUNTING +#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE  	//  mmi_ :  ld8 st1 shr;;         mmi_ : st8 st1 shr;;  	//  mib  :  mov add br        ->  mib  : ld8 add br  	//  bbb_ :  br  nop cover;;       mbb_ : mov br  cover;; @@ -1785,6 +1785,7 @@ sys_call_table:  	data8 sys_process_vm_readv  	data8 sys_process_vm_writev  	data8 sys_accept4 +	data8 sys_finit_module			// 1335  	.org sys_call_table + 8*NR_syscalls	// guard against failures to increase NR_syscalls  #endif /* __IA64_ASM_PARAVIRTUALIZED_NATIVE */ diff --git a/arch/ia64/kernel/fsys.S b/arch/ia64/kernel/fsys.S index e662f178b99..c4cd45d9774 100644 --- a/arch/ia64/kernel/fsys.S +++ b/arch/ia64/kernel/fsys.S @@ -529,7 +529,7 @@ GLOBAL_ENTRY(paravirt_fsys_bubble_down)  	nop.i 0  	;;  	mov ar.rsc=0				// M2   set enforced lazy mode, pl 0, LE, loadrs=0 -#ifdef CONFIG_VIRT_CPU_ACCOUNTING +#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE  	MOV_FROM_ITC(p0, p6, r30, r23)		// M    get cycle for accounting  #else  	nop.m 0 @@ -555,7 +555,7 @@ GLOBAL_ENTRY(paravirt_fsys_bubble_down)  	cmp.ne pKStk,pUStk=r0,r0		// A    set pKStk <- 0, pUStk <- 1  	br.call.sptk.many b7=ia64_syscall_setup	// B  	;; -#ifdef CONFIG_VIRT_CPU_ACCOUNTING +#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE  	// mov.m r30=ar.itc is called in advance  	add r16=TI_AC_STAMP+IA64_TASK_SIZE,r2  	add r17=TI_AC_LEAVE+IA64_TASK_SIZE,r2 diff --git a/arch/ia64/kernel/head.S b/arch/ia64/kernel/head.S index 4738ff7bd66..9be4e497f3d 100644 --- a/arch/ia64/kernel/head.S +++ b/arch/ia64/kernel/head.S @@ -1073,7 +1073,7 @@ END(ia64_native_sched_clock)  sched_clock = ia64_native_sched_clock  #endif -#ifdef CONFIG_VIRT_CPU_ACCOUNTING +#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE  GLOBAL_ENTRY(cycle_to_cputime)  	alloc r16=ar.pfs,1,0,0,0  	addl r8=THIS_CPU(ia64_cpu_info) + IA64_CPUINFO_NSEC_PER_CYC_OFFSET,r0 @@ -1091,7 +1091,7 @@ GLOBAL_ENTRY(cycle_to_cputime)  	shrp r8=r9,r8,IA64_NSEC_PER_CYC_SHIFT  	br.ret.sptk.many rp  END(cycle_to_cputime) -#endif /* CONFIG_VIRT_CPU_ACCOUNTING */ +#endif /* CONFIG_VIRT_CPU_ACCOUNTING_NATIVE */  #ifdef CONFIG_IA64_BRL_EMU diff --git a/arch/ia64/kernel/iosapic.c b/arch/ia64/kernel/iosapic.c index ef4b5d877cf..ee33c3aaa2f 100644 --- a/arch/ia64/kernel/iosapic.c +++ b/arch/ia64/kernel/iosapic.c @@ -147,7 +147,7 @@ static struct iosapic_intr_info {  	unsigned char	trigger	: 1;	/* trigger mode (see iosapic.h) */  } iosapic_intr_info[NR_IRQS]; -static unsigned char pcat_compat __devinitdata;	/* 8259 compatibility flag */ +static unsigned char pcat_compat;	/* 8259 compatibility flag */  static inline void  iosapic_write(struct iosapic *iosapic, unsigned int reg, u32 val) @@ -914,10 +914,8 @@ iosapic_register_platform_intr (u32 int_type, unsigned int gsi,  /*   * ACPI calls this when it finds an entry for a legacy ISA IRQ override.   */ -void __devinit -iosapic_override_isa_irq (unsigned int isa_irq, unsigned int gsi, -			  unsigned long polarity, -			  unsigned long trigger) +void iosapic_override_isa_irq(unsigned int isa_irq, unsigned int gsi, +			      unsigned long polarity, unsigned long trigger)  {  	int vector, irq;  	unsigned int dest = cpu_physical_id(smp_processor_id()); @@ -1012,8 +1010,7 @@ iosapic_check_gsi_range (unsigned int gsi_base, unsigned int ver)  	return 0;  } -int __devinit -iosapic_init (unsigned long phys_addr, unsigned int gsi_base) +int iosapic_init(unsigned long phys_addr, unsigned int gsi_base)  {  	int num_rte, err, index;  	unsigned int isa_irq, ver; @@ -1070,9 +1067,7 @@ iosapic_init (unsigned long phys_addr, unsigned int gsi_base)  	return 0;  } -#ifdef CONFIG_HOTPLUG -int -iosapic_remove (unsigned int gsi_base) +int iosapic_remove(unsigned int gsi_base)  {  	int index, err = 0;  	unsigned long flags; @@ -1098,11 +1093,9 @@ iosapic_remove (unsigned int gsi_base)  	spin_unlock_irqrestore(&iosapic_lock, flags);  	return err;  } -#endif /* CONFIG_HOTPLUG */  #ifdef CONFIG_NUMA -void __devinit -map_iosapic_to_node(unsigned int gsi_base, int node) +void map_iosapic_to_node(unsigned int gsi_base, int node)  {  	int index; diff --git a/arch/ia64/kernel/ivt.S b/arch/ia64/kernel/ivt.S index fa25689fc45..689ffcaa284 100644 --- a/arch/ia64/kernel/ivt.S +++ b/arch/ia64/kernel/ivt.S @@ -784,7 +784,7 @@ ENTRY(break_fault)  (p8)	adds r28=16,r28				// A    switch cr.iip to next bundle  (p9)	adds r8=1,r8				// A    increment ei to next slot -#ifdef CONFIG_VIRT_CPU_ACCOUNTING +#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE  	;;  	mov b6=r30				// I0   setup syscall handler branch reg early  #else @@ -801,7 +801,7 @@ ENTRY(break_fault)  	//  ///////////////////////////////////////////////////////////////////////  	st1 [r16]=r0				// M2|3 clear current->thread.on_ustack flag -#ifdef CONFIG_VIRT_CPU_ACCOUNTING +#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE  	MOV_FROM_ITC(p0, p14, r30, r18)		// M    get cycle for accounting  #else  	mov b6=r30				// I0   setup syscall handler branch reg early @@ -817,7 +817,7 @@ ENTRY(break_fault)  	cmp.eq p14,p0=r9,r0			// A    are syscalls being traced/audited?  	br.call.sptk.many b7=ia64_syscall_setup	// B  1: -#ifdef CONFIG_VIRT_CPU_ACCOUNTING +#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE  	// mov.m r30=ar.itc is called in advance, and r13 is current  	add r16=TI_AC_STAMP+IA64_TASK_SIZE,r13	// A  	add r17=TI_AC_LEAVE+IA64_TASK_SIZE,r13	// A @@ -1043,7 +1043,7 @@ END(ia64_syscall_setup)  	DBG_FAULT(16)  	FAULT(16) -#if defined(CONFIG_VIRT_CPU_ACCOUNTING) && defined(__IA64_ASM_PARAVIRTUALIZED_NATIVE) +#if defined(CONFIG_VIRT_CPU_ACCOUNTING_NATIVE) && defined(__IA64_ASM_PARAVIRTUALIZED_NATIVE)  	/*  	 * There is no particular reason for this code to be here, other than  	 * that there happens to be space here that would go unused otherwise. diff --git a/arch/ia64/kernel/minstate.h b/arch/ia64/kernel/minstate.h index d56753a1163..cc82a7d744c 100644 --- a/arch/ia64/kernel/minstate.h +++ b/arch/ia64/kernel/minstate.h @@ -4,7 +4,7 @@  #include "entry.h"  #include "paravirt_inst.h" -#ifdef CONFIG_VIRT_CPU_ACCOUNTING +#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE  /* read ar.itc in advance, and use it before leaving bank 0 */  #define ACCOUNT_GET_STAMP				\  (pUStk) mov.m r20=ar.itc; diff --git a/arch/ia64/kernel/ptrace.c b/arch/ia64/kernel/ptrace.c index 4265ff64219..b7a5fffe092 100644 --- a/arch/ia64/kernel/ptrace.c +++ b/arch/ia64/kernel/ptrace.c @@ -672,33 +672,6 @@ ptrace_attach_sync_user_rbs (struct task_struct *child)  	read_unlock(&tasklist_lock);  } -static inline int -thread_matches (struct task_struct *thread, unsigned long addr) -{ -	unsigned long thread_rbs_end; -	struct pt_regs *thread_regs; - -	if (ptrace_check_attach(thread, 0) < 0) -		/* -		 * If the thread is not in an attachable state, we'll -		 * ignore it.  The net effect is that if ADDR happens -		 * to overlap with the portion of the thread's -		 * register backing store that is currently residing -		 * on the thread's kernel stack, then ptrace() may end -		 * up accessing a stale value.  But if the thread -		 * isn't stopped, that's a problem anyhow, so we're -		 * doing as well as we can... -		 */ -		return 0; - -	thread_regs = task_pt_regs(thread); -	thread_rbs_end = ia64_get_user_rbs_end(thread, thread_regs, NULL); -	if (!on_kernel_rbs(addr, thread_regs->ar_bspstore, thread_rbs_end)) -		return 0; - -	return 1;	/* looks like we've got a winner */ -} -  /*   * Write f32-f127 back to task->thread.fph if it has been modified.   */ diff --git a/arch/ia64/kernel/smpboot.c b/arch/ia64/kernel/smpboot.c index 6a368cb2043..500f1e4d9f9 100644 --- a/arch/ia64/kernel/smpboot.c +++ b/arch/ia64/kernel/smpboot.c @@ -347,8 +347,7 @@ ia64_sync_itc (unsigned int master)  /*   * Ideally sets up per-cpu profiling hooks.  Doesn't do much now...   */ -static inline void __devinit -smp_setup_percpu_timer (void) +static inline void smp_setup_percpu_timer(void)  {  } @@ -563,7 +562,7 @@ smp_prepare_cpus (unsigned int max_cpus)  	}  } -void __devinit smp_prepare_boot_cpu(void) +void smp_prepare_boot_cpu(void)  {  	set_cpu_online(smp_processor_id(), true);  	cpu_set(smp_processor_id(), cpu_callin_map); @@ -713,8 +712,7 @@ smp_cpus_done (unsigned int dummy)  	       (int)num_online_cpus(), bogosum/(500000/HZ), (bogosum/(5000/HZ))%100);  } -static inline void __devinit -set_cpu_sibling_map(int cpu) +static inline void set_cpu_sibling_map(int cpu)  {  	int i; @@ -793,8 +791,7 @@ init_smp_config(void)   * identify_siblings(cpu) gets called from identify_cpu. This populates the    * information related to logical execution units in per_cpu_data structure.   */ -void __devinit -identify_siblings(struct cpuinfo_ia64 *c) +void identify_siblings(struct cpuinfo_ia64 *c)  {  	long status;  	u16 pltid; diff --git a/arch/ia64/kernel/time.c b/arch/ia64/kernel/time.c index b1995efbfd2..fbaac1afb84 100644 --- a/arch/ia64/kernel/time.c +++ b/arch/ia64/kernel/time.c @@ -77,7 +77,7 @@ static struct clocksource clocksource_itc = {  };  static struct clocksource *itc_clocksource; -#ifdef CONFIG_VIRT_CPU_ACCOUNTING +#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE  #include <linux/kernel_stat.h> @@ -136,13 +136,14 @@ void vtime_account_system(struct task_struct *tsk)  	account_system_time(tsk, 0, delta, delta);  } +EXPORT_SYMBOL_GPL(vtime_account_system);  void vtime_account_idle(struct task_struct *tsk)  {  	account_idle_time(vtime_delta(tsk));  } -#endif /* CONFIG_VIRT_CPU_ACCOUNTING */ +#endif /* CONFIG_VIRT_CPU_ACCOUNTING_NATIVE */  static irqreturn_t  timer_interrupt (int irq, void *dev_id) @@ -243,8 +244,7 @@ static int __init nojitter_setup(char *str)  __setup("nojitter", nojitter_setup); -void __devinit -ia64_init_itm (void) +void ia64_init_itm(void)  {  	unsigned long platform_base_freq, itc_freq;  	struct pal_freq_ratio itc_ratio, proc_ratio; diff --git a/arch/ia64/mm/init.c b/arch/ia64/mm/init.c index 082e383c1b6..b755ea92aea 100644 --- a/arch/ia64/mm/init.c +++ b/arch/ia64/mm/init.c @@ -294,11 +294,10 @@ setup_gate (void)  	ia64_patch_gate();  } -void __devinit -ia64_mmu_init (void *my_cpu_data) +void ia64_mmu_init(void *my_cpu_data)  {  	unsigned long pta, impl_va_bits; -	extern void __devinit tlb_init (void); +	extern void tlb_init(void);  #ifdef CONFIG_DISABLE_VHPT  #	define VHPT_ENABLE_BIT	0 diff --git a/arch/ia64/mm/tlb.c b/arch/ia64/mm/tlb.c index 7b3cdc6c6d9..ed612976868 100644 --- a/arch/ia64/mm/tlb.c +++ b/arch/ia64/mm/tlb.c @@ -337,8 +337,7 @@ flush_tlb_range (struct vm_area_struct *vma, unsigned long start,  }  EXPORT_SYMBOL(flush_tlb_range); -void __devinit -ia64_tlb_init (void) +void ia64_tlb_init(void)  {  	ia64_ptce_info_t uninitialized_var(ptce_info); /* GCC be quiet */  	u64 tr_pgbits; diff --git a/arch/ia64/pci/fixup.c b/arch/ia64/pci/fixup.c index eab28e31402..5dc969dd4ac 100644 --- a/arch/ia64/pci/fixup.c +++ b/arch/ia64/pci/fixup.c @@ -24,7 +24,7 @@   * video device at this point.   */ -static void __devinit pci_fixup_video(struct pci_dev *pdev) +static void pci_fixup_video(struct pci_dev *pdev)  {  	struct pci_dev *bridge;  	struct pci_bus *bus; diff --git a/arch/ia64/pci/pci.c b/arch/ia64/pci/pci.c index 5faa66c5c2a..55b72ad5732 100644 --- a/arch/ia64/pci/pci.c +++ b/arch/ia64/pci/pci.c @@ -116,8 +116,7 @@ struct pci_ops pci_root_ops = {  /* Called by ACPI when it finds a new root bus.  */ -static struct pci_controller * __devinit -alloc_pci_controller (int seg) +static struct pci_controller *alloc_pci_controller(int seg)  {  	struct pci_controller *controller; @@ -165,8 +164,8 @@ new_space (u64 phys_base, int sparse)  	return i;  } -static u64 __devinit -add_io_space (struct pci_root_info *info, struct acpi_resource_address64 *addr) +static u64 add_io_space(struct pci_root_info *info, +			struct acpi_resource_address64 *addr)  {  	struct resource *resource;  	char *name; @@ -226,8 +225,8 @@ out:  	return ~0;  } -static acpi_status __devinit resource_to_window(struct acpi_resource *resource, -	struct acpi_resource_address64 *addr) +static acpi_status resource_to_window(struct acpi_resource *resource, +				      struct acpi_resource_address64 *addr)  {  	acpi_status status; @@ -249,8 +248,7 @@ static acpi_status __devinit resource_to_window(struct acpi_resource *resource,  	return AE_ERROR;  } -static acpi_status __devinit -count_window (struct acpi_resource *resource, void *data) +static acpi_status count_window(struct acpi_resource *resource, void *data)  {  	unsigned int *windows = (unsigned int *) data;  	struct acpi_resource_address64 addr; @@ -263,7 +261,7 @@ count_window (struct acpi_resource *resource, void *data)  	return AE_OK;  } -static __devinit acpi_status add_window(struct acpi_resource *res, void *data) +static acpi_status add_window(struct acpi_resource *res, void *data)  {  	struct pci_root_info *info = data;  	struct pci_window *window; @@ -324,8 +322,7 @@ static __devinit acpi_status add_window(struct acpi_resource *res, void *data)  	return AE_OK;  } -struct pci_bus * __devinit -pci_acpi_scan_root(struct acpi_pci_root *root) +struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root)  {  	struct acpi_device *device = root->device;  	int domain = root->segment; @@ -396,7 +393,7 @@ out1:  	return NULL;  } -static int __devinit is_valid_resource(struct pci_dev *dev, int idx) +static int is_valid_resource(struct pci_dev *dev, int idx)  {  	unsigned int i, type_mask = IORESOURCE_IO | IORESOURCE_MEM;  	struct resource *devr = &dev->resource[idx], *busr; @@ -414,8 +411,7 @@ static int __devinit is_valid_resource(struct pci_dev *dev, int idx)  	return 0;  } -static void __devinit -pcibios_fixup_resources(struct pci_dev *dev, int start, int limit) +static void pcibios_fixup_resources(struct pci_dev *dev, int start, int limit)  {  	int i; @@ -427,13 +423,13 @@ pcibios_fixup_resources(struct pci_dev *dev, int start, int limit)  	}  } -void __devinit pcibios_fixup_device_resources(struct pci_dev *dev) +void pcibios_fixup_device_resources(struct pci_dev *dev)  {  	pcibios_fixup_resources(dev, 0, PCI_BRIDGE_RESOURCES);  }  EXPORT_SYMBOL_GPL(pcibios_fixup_device_resources); -static void __devinit pcibios_fixup_bridge_resources(struct pci_dev *dev) +static void pcibios_fixup_bridge_resources(struct pci_dev *dev)  {  	pcibios_fixup_resources(dev, PCI_BRIDGE_RESOURCES, PCI_NUM_RESOURCES);  } @@ -441,8 +437,7 @@ static void __devinit pcibios_fixup_bridge_resources(struct pci_dev *dev)  /*   *  Called after each bus is probed, but before its children are examined.   */ -void __devinit -pcibios_fixup_bus (struct pci_bus *b) +void pcibios_fixup_bus(struct pci_bus *b)  {  	struct pci_dev *dev; diff --git a/arch/ia64/sn/kernel/io_common.c b/arch/ia64/sn/kernel/io_common.c index 8630875e74b..11f2275570f 100644 --- a/arch/ia64/sn/kernel/io_common.c +++ b/arch/ia64/sn/kernel/io_common.c @@ -435,8 +435,7 @@ void sn_generate_path(struct pci_bus *pci_bus, char *address)  						geo_slot(geoid));  } -void __devinit -sn_pci_fixup_bus(struct pci_bus *bus) +void sn_pci_fixup_bus(struct pci_bus *bus)  {  	if (SN_ACPI_BASE_SUPPORT()) diff --git a/arch/ia64/sn/kernel/sn2/sn_hwperf.c b/arch/ia64/sn/kernel/sn2/sn_hwperf.c index 4554f68b786..b9992571c03 100644 --- a/arch/ia64/sn/kernel/sn2/sn_hwperf.c +++ b/arch/ia64/sn/kernel/sn2/sn_hwperf.c @@ -977,7 +977,7 @@ int sn_hwperf_get_nearest_node(cnodeid_t node,  	return e;  } -static int __devinit sn_hwperf_misc_register_init(void) +static int sn_hwperf_misc_register_init(void)  {  	int e; diff --git a/arch/ia64/xen/irq_xen.c b/arch/ia64/xen/irq_xen.c index 01f479ee1c4..efb74dafec4 100644 --- a/arch/ia64/xen/irq_xen.c +++ b/arch/ia64/xen/irq_xen.c @@ -273,9 +273,8 @@ xen_bind_early_percpu_irq(void)   */  #ifdef CONFIG_HOTPLUG_CPU -static int __devinit -unbind_evtchn_callback(struct notifier_block *nfb, -		       unsigned long action, void *hcpu) +static int unbind_evtchn_callback(struct notifier_block *nfb, +				  unsigned long action, void *hcpu)  {  	unsigned int cpu = (unsigned long)hcpu; diff --git a/arch/m32r/kernel/smpboot.c b/arch/m32r/kernel/smpboot.c index a2cfc0abb05..13168a769f8 100644 --- a/arch/m32r/kernel/smpboot.c +++ b/arch/m32r/kernel/smpboot.c @@ -127,7 +127,7 @@ static void unmap_cpu_to_physid(int, int);  /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/  /* Boot up APs Routines : BSP                                                */  /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ -void __devinit smp_prepare_boot_cpu(void) +void smp_prepare_boot_cpu(void)  {  	bsp_phys_id = hard_smp_processor_id();  	physid_set(bsp_phys_id, phys_cpu_present_map); diff --git a/arch/m68k/emu/nfeth.c b/arch/m68k/emu/nfeth.c index a985a7e87d4..695cd737a42 100644 --- a/arch/m68k/emu/nfeth.c +++ b/arch/m68k/emu/nfeth.c @@ -39,7 +39,7 @@ enum {  #define MAX_UNIT	8  /* These identify the driver base version and may not be removed. */ -static const char version[] __devinitconst = +static const char version[] =  	KERN_INFO KBUILD_MODNAME ".c:v" DRV_VERSION " " DRV_RELDATE  	" S.Opichal, M.Jurik, P.Stehlik\n"  	KERN_INFO " http://aranym.org/\n"; diff --git a/arch/m68k/include/asm/dma-mapping.h b/arch/m68k/include/asm/dma-mapping.h index 17f7a45948e..292805f0762 100644 --- a/arch/m68k/include/asm/dma-mapping.h +++ b/arch/m68k/include/asm/dma-mapping.h @@ -21,6 +21,22 @@ extern void *dma_alloc_coherent(struct device *, size_t,  extern void dma_free_coherent(struct device *, size_t,  			      void *, dma_addr_t); +static inline void *dma_alloc_attrs(struct device *dev, size_t size, +				    dma_addr_t *dma_handle, gfp_t flag, +				    struct dma_attrs *attrs) +{ +	/* attrs is not supported and ignored */ +	return dma_alloc_coherent(dev, size, dma_handle, flag); +} + +static inline void dma_free_attrs(struct device *dev, size_t size, +				  void *cpu_addr, dma_addr_t dma_handle, +				  struct dma_attrs *attrs) +{ +	/* attrs is not supported and ignored */ +	dma_free_coherent(dev, size, cpu_addr, dma_handle); +} +  static inline void *dma_alloc_noncoherent(struct device *dev, size_t size,  					  dma_addr_t *handle, gfp_t flag)  { @@ -99,4 +115,14 @@ static inline int dma_mapping_error(struct device *dev, dma_addr_t handle)  #include <asm-generic/dma-mapping-broken.h>  #endif +/* drivers/base/dma-mapping.c */ +extern int dma_common_mmap(struct device *dev, struct vm_area_struct *vma, +			   void *cpu_addr, dma_addr_t dma_addr, size_t size); +extern int dma_common_get_sgtable(struct device *dev, struct sg_table *sgt, +				  void *cpu_addr, dma_addr_t dma_addr, +				  size_t size); + +#define dma_mmap_coherent(d, v, c, h, s) dma_common_mmap(d, v, c, h, s) +#define dma_get_sgtable(d, t, v, h, s) dma_common_get_sgtable(d, t, v, h, s) +  #endif  /* _M68K_DMA_MAPPING_H */ diff --git a/arch/m68k/include/asm/parport.h b/arch/m68k/include/asm/parport.h index 646b1872f73..5ea75e6a739 100644 --- a/arch/m68k/include/asm/parport.h +++ b/arch/m68k/include/asm/parport.h @@ -15,8 +15,8 @@  #define outsl(port,buf,len)  isa_outsb(port,buf,(len)<<2)  /* no dma, or IRQ autoprobing */ -static int __devinit parport_pc_find_isa_ports (int autoirq, int autodma); -static int __devinit parport_pc_find_nonpci_ports (int autoirq, int autodma) +static int parport_pc_find_isa_ports (int autoirq, int autodma); +static int parport_pc_find_nonpci_ports (int autoirq, int autodma)  {          if (! (MACH_IS_Q40))  	  return 0; /* count=0 */ diff --git a/arch/m68k/include/asm/pgtable_no.h b/arch/m68k/include/asm/pgtable_no.h index bf86b29fe64..037028f4ab7 100644 --- a/arch/m68k/include/asm/pgtable_no.h +++ b/arch/m68k/include/asm/pgtable_no.h @@ -64,6 +64,8 @@ extern unsigned int kobjsize(const void *objp);   */  #define	VMALLOC_START	0  #define	VMALLOC_END	0xffffffff +#define	KMAP_START	0 +#define	KMAP_END	0xffffffff  #include <asm-generic/pgtable.h> diff --git a/arch/m68k/include/asm/processor.h b/arch/m68k/include/asm/processor.h index ae700f49e51..b0768a65792 100644 --- a/arch/m68k/include/asm/processor.h +++ b/arch/m68k/include/asm/processor.h @@ -130,7 +130,6 @@ extern int handle_kernel_fault(struct pt_regs *regs);  #define start_thread(_regs, _pc, _usp)                  \  do {                                                    \  	(_regs)->pc = (_pc);                            \ -	((struct switch_stack *)(_regs))[-1].a6 = 0;    \  	setframeformat(_regs);                          \  	if (current->mm)                                \  		(_regs)->d5 = current->mm->start_data;  \ diff --git a/arch/m68k/include/asm/unistd.h b/arch/m68k/include/asm/unistd.h index 847994ce680..f9337f61466 100644 --- a/arch/m68k/include/asm/unistd.h +++ b/arch/m68k/include/asm/unistd.h @@ -4,7 +4,7 @@  #include <uapi/asm/unistd.h> -#define NR_syscalls		348 +#define NR_syscalls		349  #define __ARCH_WANT_OLD_READDIR  #define __ARCH_WANT_OLD_STAT diff --git a/arch/m68k/include/uapi/asm/unistd.h b/arch/m68k/include/uapi/asm/unistd.h index b94bfbf9070..625f321001d 100644 --- a/arch/m68k/include/uapi/asm/unistd.h +++ b/arch/m68k/include/uapi/asm/unistd.h @@ -353,5 +353,6 @@  #define __NR_process_vm_readv	345  #define __NR_process_vm_writev	346  #define __NR_kcmp		347 +#define __NR_finit_module	348  #endif /* _UAPI_ASM_M68K_UNISTD_H_ */ diff --git a/arch/m68k/kernel/pcibios.c b/arch/m68k/kernel/pcibios.c index 73fa0b56a06..931a31ff59d 100644 --- a/arch/m68k/kernel/pcibios.c +++ b/arch/m68k/kernel/pcibios.c @@ -87,7 +87,7 @@ int pcibios_enable_device(struct pci_dev *dev, int mask)  	return 0;  } -void __devinit pcibios_fixup_bus(struct pci_bus *bus) +void pcibios_fixup_bus(struct pci_bus *bus)  {  	struct pci_dev *dev; @@ -97,7 +97,7 @@ void __devinit pcibios_fixup_bus(struct pci_bus *bus)  	}  } -char __devinit *pcibios_setup(char *str) +char *pcibios_setup(char *str)  {  	return str;  } diff --git a/arch/m68k/kernel/syscalltable.S b/arch/m68k/kernel/syscalltable.S index c30da5b3f2d..3f04ea0ab80 100644 --- a/arch/m68k/kernel/syscalltable.S +++ b/arch/m68k/kernel/syscalltable.S @@ -368,4 +368,5 @@ ENTRY(sys_call_table)  	.long sys_process_vm_readv	/* 345 */  	.long sys_process_vm_writev  	.long sys_kcmp +	.long sys_finit_module diff --git a/arch/m68k/mm/init.c b/arch/m68k/mm/init.c index f0e05bce92f..afd8106fd83 100644 --- a/arch/m68k/mm/init.c +++ b/arch/m68k/mm/init.c @@ -39,6 +39,11 @@  void *empty_zero_page;  EXPORT_SYMBOL(empty_zero_page); +#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE) +extern void init_pointer_table(unsigned long ptable); +extern pmd_t *zero_pgtable; +#endif +  #ifdef CONFIG_MMU  pg_data_t pg_data_map[MAX_NUMNODES]; @@ -69,9 +74,6 @@ void __init m68k_setup_node(int node)  	node_set_online(node);  } -extern void init_pointer_table(unsigned long ptable); -extern pmd_t *zero_pgtable; -  #else /* CONFIG_MMU */  /* diff --git a/arch/microblaze/configs/mmu_defconfig b/arch/microblaze/configs/mmu_defconfig index b3f5eecff2a..d2b097a652d 100644 --- a/arch/microblaze/configs/mmu_defconfig +++ b/arch/microblaze/configs/mmu_defconfig @@ -1,25 +1,22 @@  CONFIG_EXPERIMENTAL=y  CONFIG_SYSVIPC=y +CONFIG_POSIX_MQUEUE=y +CONFIG_FHANDLE=y +CONFIG_AUDIT=y +CONFIG_AUDIT_LOGINUID_IMMUTABLE=y  CONFIG_IKCONFIG=y  CONFIG_IKCONFIG_PROC=y +CONFIG_SYSFS_DEPRECATED=y  CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_BLK_DEV_INITRD=y -CONFIG_INITRAMFS_SOURCE="rootfs.cpio" -CONFIG_INITRAMFS_COMPRESSION_GZIP=y -# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set -CONFIG_EXPERT=y  CONFIG_KALLSYMS_ALL=y -CONFIG_KALLSYMS_EXTRA_PASS=y -# CONFIG_HOTPLUG is not set  # CONFIG_BASE_FULL is not set -# CONFIG_FUTEX is not set -# CONFIG_EPOLL is not set -# CONFIG_SIGNALFD is not set -# CONFIG_SHMEM is not set +CONFIG_EMBEDDED=y  CONFIG_SLAB=y  CONFIG_MODULES=y  CONFIG_MODULE_UNLOAD=y  # CONFIG_BLK_DEV_BSG is not set +CONFIG_PARTITION_ADVANCED=y +# CONFIG_EFI_PARTITION is not set  CONFIG_OPT_LIB_ASM=y  CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR=1  CONFIG_XILINX_MICROBLAZE0_USE_PCMP_INSTR=1 @@ -31,39 +28,62 @@ CONFIG_HZ_100=y  CONFIG_MMU=y  CONFIG_CMDLINE_BOOL=y  CONFIG_CMDLINE_FORCE=y +CONFIG_HIGHMEM=y +CONFIG_PCI=y +CONFIG_PCI_XILINX=y  CONFIG_NET=y  CONFIG_PACKET=y  CONFIG_UNIX=y  CONFIG_INET=y  # CONFIG_INET_LRO is not set  # CONFIG_IPV6 is not set +CONFIG_MTD=y  CONFIG_PROC_DEVICETREE=y  CONFIG_BLK_DEV_RAM=y  CONFIG_BLK_DEV_RAM_SIZE=8192  CONFIG_NETDEVICES=y -CONFIG_NET_ETHERNET=y  CONFIG_XILINX_EMACLITE=y +CONFIG_XILINX_LL_TEMAC=y  # CONFIG_INPUT is not set  # CONFIG_SERIO is not set  # CONFIG_VT is not set +CONFIG_SERIAL_8250=y +CONFIG_SERIAL_8250_CONSOLE=y  CONFIG_SERIAL_UARTLITE=y  CONFIG_SERIAL_UARTLITE_CONSOLE=y  # CONFIG_HW_RANDOM is not set +CONFIG_XILINX_HWICAP=y +CONFIG_I2C=y +CONFIG_I2C_XILINX=y +CONFIG_SPI=y +CONFIG_SPI_XILINX=y +CONFIG_GPIOLIB=y +CONFIG_GPIO_SYSFS=y +CONFIG_GPIO_XILINX=y  # CONFIG_HWMON is not set +CONFIG_WATCHDOG=y +CONFIG_XILINX_WATCHDOG=y +CONFIG_FB=y +CONFIG_FB_XILINX=y  # CONFIG_USB_SUPPORT is not set +CONFIG_UIO=y +CONFIG_UIO_PDRV=y +CONFIG_UIO_PDRV_GENIRQ=y +CONFIG_UIO_DMEM_GENIRQ=y  CONFIG_EXT2_FS=y  # CONFIG_DNOTIFY is not set +CONFIG_CRAMFS=y +CONFIG_ROMFS_FS=y  CONFIG_NFS_FS=y -CONFIG_NFS_V3=y  CONFIG_CIFS=y  CONFIG_CIFS_STATS=y  CONFIG_CIFS_STATS2=y -CONFIG_PARTITION_ADVANCED=y -CONFIG_DEBUG_KERNEL=y  CONFIG_DETECT_HUNG_TASK=y  CONFIG_DEBUG_SLAB=y  CONFIG_DEBUG_SPINLOCK=y  CONFIG_DEBUG_INFO=y -# CONFIG_RCU_CPU_STALL_DETECTOR is not set  CONFIG_EARLY_PRINTK=y +CONFIG_KEYS=y +CONFIG_ENCRYPTED_KEYS=y +CONFIG_KEYS_DEBUG_PROC_KEYS=y  # CONFIG_CRYPTO_ANSI_CPRNG is not set diff --git a/arch/microblaze/configs/nommu_defconfig b/arch/microblaze/configs/nommu_defconfig index 0249e4b7e1d..10b5172283d 100644 --- a/arch/microblaze/configs/nommu_defconfig +++ b/arch/microblaze/configs/nommu_defconfig @@ -1,41 +1,42 @@  CONFIG_EXPERIMENTAL=y  CONFIG_SYSVIPC=y  CONFIG_POSIX_MQUEUE=y +CONFIG_FHANDLE=y +CONFIG_AUDIT=y +CONFIG_AUDIT_LOGINUID_IMMUTABLE=y  CONFIG_BSD_PROCESS_ACCT=y  CONFIG_BSD_PROCESS_ACCT_V3=y  CONFIG_IKCONFIG=y  CONFIG_IKCONFIG_PROC=y +CONFIG_SYSFS_DEPRECATED=y  CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_EXPERT=y  CONFIG_KALLSYMS_ALL=y -CONFIG_KALLSYMS_EXTRA_PASS=y -# CONFIG_HOTPLUG is not set  # CONFIG_BASE_FULL is not set +CONFIG_EMBEDDED=y  CONFIG_SLAB=y  CONFIG_MODULES=y  CONFIG_MODULE_UNLOAD=y  # CONFIG_BLK_DEV_BSG is not set -# CONFIG_OPT_LIB_FUNCTION is not set +CONFIG_PARTITION_ADVANCED=y +# CONFIG_EFI_PARTITION is not set  CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR=1  CONFIG_XILINX_MICROBLAZE0_USE_PCMP_INSTR=1  CONFIG_XILINX_MICROBLAZE0_USE_BARREL=1  CONFIG_XILINX_MICROBLAZE0_USE_DIV=1  CONFIG_XILINX_MICROBLAZE0_USE_HW_MUL=2  CONFIG_XILINX_MICROBLAZE0_USE_FPU=2 -CONFIG_HIGH_RES_TIMERS=y  CONFIG_HZ_100=y  CONFIG_CMDLINE_BOOL=y -CONFIG_BINFMT_FLAT=y +CONFIG_CMDLINE_FORCE=y +CONFIG_PCI=y +CONFIG_PCI_XILINX=y  CONFIG_NET=y  CONFIG_PACKET=y  CONFIG_UNIX=y  CONFIG_INET=y  # CONFIG_INET_LRO is not set  # CONFIG_IPV6 is not set -# CONFIG_PREVENT_FIRMWARE_BUILD is not set  CONFIG_MTD=y -CONFIG_MTD_CONCAT=y -CONFIG_MTD_PARTITIONS=y  CONFIG_MTD_CMDLINE_PARTS=y  CONFIG_MTD_CHAR=y  CONFIG_MTD_BLOCK=y @@ -45,41 +46,55 @@ CONFIG_MTD_CFI_AMDSTD=y  CONFIG_MTD_RAM=y  CONFIG_MTD_UCLINUX=y  CONFIG_PROC_DEVICETREE=y -CONFIG_BLK_DEV_NBD=y  CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_SIZE=8192  CONFIG_NETDEVICES=y -CONFIG_NET_ETHERNET=y +CONFIG_XILINX_EMACLITE=y +CONFIG_XILINX_LL_TEMAC=y  # CONFIG_INPUT is not set  # CONFIG_SERIO is not set  # CONFIG_VT is not set +CONFIG_SERIAL_8250=y +CONFIG_SERIAL_8250_CONSOLE=y  CONFIG_SERIAL_UARTLITE=y  CONFIG_SERIAL_UARTLITE_CONSOLE=y -CONFIG_HW_RANDOM=y +# CONFIG_HW_RANDOM is not set +CONFIG_XILINX_HWICAP=y +CONFIG_I2C=y +CONFIG_I2C_XILINX=y +CONFIG_SPI=y +CONFIG_SPI_XILINX=y +CONFIG_GPIOLIB=y +CONFIG_GPIO_SYSFS=y +CONFIG_GPIO_XILINX=y  # CONFIG_HWMON is not set -CONFIG_VIDEO_OUTPUT_CONTROL=y +CONFIG_WATCHDOG=y +CONFIG_XILINX_WATCHDOG=y +CONFIG_FB=y +CONFIG_FB_XILINX=y +# CONFIG_USB_SUPPORT is not set +CONFIG_UIO=y +CONFIG_UIO_PDRV=y +CONFIG_UIO_PDRV_GENIRQ=y +CONFIG_UIO_DMEM_GENIRQ=y  CONFIG_EXT2_FS=y  # CONFIG_DNOTIFY is not set  CONFIG_CRAMFS=y  CONFIG_ROMFS_FS=y  CONFIG_NFS_FS=y -CONFIG_NFS_V3=y  CONFIG_NFS_V3_ACL=y -CONFIG_UNUSED_SYMBOLS=y -CONFIG_DEBUG_FS=y -CONFIG_DEBUG_KERNEL=y -CONFIG_DEBUG_SHIRQ=y +CONFIG_NLS=y  CONFIG_DETECT_HUNG_TASK=y -CONFIG_SCHEDSTATS=y -CONFIG_TIMER_STATS=y -CONFIG_DEBUG_OBJECTS=y -CONFIG_DEBUG_OBJECTS_SELFTEST=y -CONFIG_DEBUG_OBJECTS_FREE=y -CONFIG_DEBUG_OBJECTS_TIMERS=y +CONFIG_DEBUG_SLAB=y +CONFIG_DEBUG_SPINLOCK=y  CONFIG_DEBUG_INFO=y -CONFIG_DEBUG_LIST=y -CONFIG_DEBUG_SG=y -# CONFIG_RCU_CPU_STALL_DETECTOR is not set -CONFIG_SYSCTL_SYSCALL_CHECK=y  CONFIG_EARLY_PRINTK=y +CONFIG_KEYS=y +CONFIG_ENCRYPTED_KEYS=y +CONFIG_KEYS_DEBUG_PROC_KEYS=y +CONFIG_CRYPTO_ECB=y +CONFIG_CRYPTO_MD4=y +CONFIG_CRYPTO_MD5=y +CONFIG_CRYPTO_ARC4=y +CONFIG_CRYPTO_DES=y  # CONFIG_CRYPTO_ANSI_CPRNG is not set -# CONFIG_CRC32 is not set diff --git a/arch/microblaze/include/asm/highmem.h b/arch/microblaze/include/asm/highmem.h index 2446a73140a..d0463893243 100644 --- a/arch/microblaze/include/asm/highmem.h +++ b/arch/microblaze/include/asm/highmem.h @@ -71,7 +71,7 @@ static inline void kunmap(struct page *page)  	kunmap_high(page);  } -static inline void *__kmap_atomic(struct page *page) +static inline void *kmap_atomic(struct page *page)  {  	return kmap_atomic_prot(page, kmap_prot);  } diff --git a/arch/microblaze/include/asm/uaccess.h b/arch/microblaze/include/asm/uaccess.h index 927540d3cb7..a1ab5f0009e 100644 --- a/arch/microblaze/include/asm/uaccess.h +++ b/arch/microblaze/include/asm/uaccess.h @@ -108,7 +108,7 @@ static inline int ___range_ok(unsigned long addr, unsigned long size)  # define __EX_TABLE_SECTION	".section __ex_table,\"a\"\n"  #else  # define __FIXUP_SECTION	".section .discard,\"ax\"\n" -# define __EX_TABLE_SECTION	".section .discard,\"a\"\n" +# define __EX_TABLE_SECTION	".section .discard,\"ax\"\n"  #endif  extern unsigned long __copy_tofrom_user(void __user *to, diff --git a/arch/microblaze/include/asm/unistd.h b/arch/microblaze/include/asm/unistd.h index a5f06ac9711..10f8ac18685 100644 --- a/arch/microblaze/include/asm/unistd.h +++ b/arch/microblaze/include/asm/unistd.h @@ -37,9 +37,7 @@  #define __ARCH_WANT_SYS_RT_SIGSUSPEND  #define __ARCH_WANT_SYS_CLONE  #define __ARCH_WANT_SYS_VFORK -#ifdef CONFIG_MMU  #define __ARCH_WANT_SYS_FORK -#endif  /*   * "Conditional" syscalls diff --git a/arch/microblaze/include/uapi/asm/unistd.h b/arch/microblaze/include/uapi/asm/unistd.h index ccb6920f3b3..5f7fe7582f3 100644 --- a/arch/microblaze/include/uapi/asm/unistd.h +++ b/arch/microblaze/include/uapi/asm/unistd.h @@ -395,7 +395,8 @@  #define __NR_process_vm_readv	377  #define __NR_process_vm_writev	378  #define __NR_kcmp		379 +#define __NR_finit_module	380 -#define __NR_syscalls		380 +#define __NR_syscalls		381  #endif /* _UAPI_ASM_MICROBLAZE_UNISTD_H */ diff --git a/arch/microblaze/kernel/syscall_table.S b/arch/microblaze/kernel/syscall_table.S index 1cbace29b5e..4fca56cf02f 100644 --- a/arch/microblaze/kernel/syscall_table.S +++ b/arch/microblaze/kernel/syscall_table.S @@ -380,3 +380,4 @@ ENTRY(sys_call_table)  	.long sys_process_vm_readv  	.long sys_process_vm_writev  	.long sys_kcmp +	.long sys_finit_module diff --git a/arch/microblaze/pci/pci-common.c b/arch/microblaze/pci/pci-common.c index a1c5b996d66..96416553cb3 100644 --- a/arch/microblaze/pci/pci-common.c +++ b/arch/microblaze/pci/pci-common.c @@ -287,7 +287,7 @@ static struct resource *__pci_mmap_make_offset(struct pci_dev *dev,  	unsigned long io_offset = 0;  	int i, res_bit; -	if (hose == 0) +	if (!hose)  		return NULL;		/* should never happen */  	/* If memory, add on the PCI bridge address offset */ @@ -655,9 +655,8 @@ void pci_resource_to_user(const struct pci_dev *dev, int bar,   *   - Some 32 bits platforms such as 4xx can have physical space larger than   *     32 bits so we need to use 64 bits values for the parsing   */ -void __devinit pci_process_bridge_OF_ranges(struct pci_controller *hose, -					    struct device_node *dev, -					    int primary) +void pci_process_bridge_OF_ranges(struct pci_controller *hose, +				  struct device_node *dev, int primary)  {  	const u32 *ranges;  	int rlen; @@ -822,15 +821,13 @@ void __devinit pci_process_bridge_OF_ranges(struct pci_controller *hose,  /* Decide whether to display the domain number in /proc */  int pci_proc_domain(struct pci_bus *bus)  { -	struct pci_controller *hose = pci_bus_to_host(bus); -  	return 0;  }  /* This header fixup will do the resource fixup for all devices as they are   * probed, but not for bridge ranges   */ -static void __devinit pcibios_fixup_resources(struct pci_dev *dev) +static void pcibios_fixup_resources(struct pci_dev *dev)  {  	struct pci_controller *hose = pci_bus_to_host(dev->bus);  	int i; @@ -871,8 +868,8 @@ DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, pcibios_fixup_resources);   * things go more smoothly when it gets it right. It should covers cases such   * as Apple "closed" bridge resources and bare-metal pSeries unassigned bridges   */ -static int __devinit pcibios_uninitialized_bridge_resource(struct pci_bus *bus, -							   struct resource *res) +static int pcibios_uninitialized_bridge_resource(struct pci_bus *bus, +						 struct resource *res)  {  	struct pci_controller *hose = pci_bus_to_host(bus);  	struct pci_dev *dev = bus->self; @@ -933,7 +930,7 @@ static int __devinit pcibios_uninitialized_bridge_resource(struct pci_bus *bus,  }  /* Fixup resources of a PCI<->PCI bridge */ -static void __devinit pcibios_fixup_bridge(struct pci_bus *bus) +static void pcibios_fixup_bridge(struct pci_bus *bus)  {  	struct resource *res;  	int i; @@ -970,14 +967,14 @@ static void __devinit pcibios_fixup_bridge(struct pci_bus *bus)  	}  } -void __devinit pcibios_setup_bus_self(struct pci_bus *bus) +void pcibios_setup_bus_self(struct pci_bus *bus)  {  	/* Fix up the bus resources for P2P bridges */  	if (bus->self != NULL)  		pcibios_fixup_bridge(bus);  } -void __devinit pcibios_setup_bus_devices(struct pci_bus *bus) +void pcibios_setup_bus_devices(struct pci_bus *bus)  {  	struct pci_dev *dev; @@ -1002,7 +999,7 @@ void __devinit pcibios_setup_bus_devices(struct pci_bus *bus)  	}  } -void __devinit pcibios_fixup_bus(struct pci_bus *bus) +void pcibios_fixup_bus(struct pci_bus *bus)  {  	/* When called from the generic PCI probe, read PCI<->PCI bridge  	 * bases. This is -not- called when generating the PCI tree from @@ -1124,7 +1121,7 @@ static int __init reparent_resources(struct resource *parent,   *	    as well.   */ -void pcibios_allocate_bus_resources(struct pci_bus *bus) +static void pcibios_allocate_bus_resources(struct pci_bus *bus)  {  	struct pci_bus *b;  	int i; @@ -1179,7 +1176,7 @@ void pcibios_allocate_bus_resources(struct pci_bus *bus)  		}  		printk(KERN_WARNING "PCI: Cannot allocate resource region "  		       "%d of PCI bridge %d, will remap\n", i, bus->number); -clear_resource: +  		res->start = res->end = 0;  		res->flags = 0;  	} @@ -1188,7 +1185,7 @@ clear_resource:  		pcibios_allocate_bus_resources(b);  } -static inline void __devinit alloc_resource(struct pci_dev *dev, int idx) +static inline void alloc_resource(struct pci_dev *dev, int idx)  {  	struct resource *pr, *r = &dev->resource[idx]; @@ -1351,7 +1348,7 @@ void __init pcibios_resource_survey(void)   * rest of the code later, for now, keep it as-is as our main   * resource allocation function doesn't deal with sub-trees yet.   */ -void __devinit pcibios_claim_one_bus(struct pci_bus *bus) +void pcibios_claim_one_bus(struct pci_bus *bus)  {  	struct pci_dev *dev;  	struct pci_bus *child_bus; @@ -1410,7 +1407,8 @@ int pcibios_enable_device(struct pci_dev *dev, int mask)  	return pci_enable_resources(dev, mask);  } -static void __devinit pcibios_setup_phb_resources(struct pci_controller *hose, struct list_head *resources) +static void pcibios_setup_phb_resources(struct pci_controller *hose, +					struct list_head *resources)  {  	unsigned long io_offset;  	struct resource *res; @@ -1433,7 +1431,8 @@ static void __devinit pcibios_setup_phb_resources(struct pci_controller *hose, s  		res->end = res->start + IO_SPACE_LIMIT;  		res->flags = IORESOURCE_IO;  	} -	pci_add_resource_offset(resources, res, hose->io_base_virt - _IO_BASE); +	pci_add_resource_offset(resources, res, +		(__force resource_size_t)(hose->io_base_virt - _IO_BASE));  	pr_debug("PCI: PHB IO resource    = %016llx-%016llx [%lx]\n",  		 (unsigned long long)res->start, @@ -1477,7 +1476,7 @@ struct device_node *pcibios_get_phb_of_node(struct pci_bus *bus)  	return of_node_get(hose->dn);  } -static void __devinit pcibios_scan_phb(struct pci_controller *hose) +static void pcibios_scan_phb(struct pci_controller *hose)  {  	LIST_HEAD(resources);  	struct pci_bus *bus; diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index b7dc39c6c84..9becc44d9d7 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig @@ -4,7 +4,6 @@ config MIPS  	select HAVE_GENERIC_DMA_COHERENT  	select HAVE_IDE  	select HAVE_OPROFILE -	select HAVE_IRQ_WORK  	select HAVE_PERF_EVENTS  	select PERF_USE_VMALLOC  	select HAVE_ARCH_KGDB @@ -39,8 +38,8 @@ config MIPS  	select GENERIC_CLOCKEVENTS  	select GENERIC_CMOS_UPDATE  	select HAVE_MOD_ARCH_SPECIFIC -	select MODULES_USE_ELF_REL -	select MODULES_USE_ELF_RELA if 64BIT +	select MODULES_USE_ELF_REL if MODULES +	select MODULES_USE_ELF_RELA if MODULES && 64BIT  menu "Machine selection" @@ -2161,7 +2160,6 @@ source "mm/Kconfig"  config SMP  	bool "Multi-Processing support"  	depends on SYS_SUPPORTS_SMP -	select IRQ_PER_CPU  	select USE_GENERIC_SMP_HELPERS  	help  	  This enables support for systems with more than one CPU. If you have diff --git a/arch/mips/alchemy/common/time.c b/arch/mips/alchemy/common/time.c index a7193ae13a5..b67930d1932 100644 --- a/arch/mips/alchemy/common/time.c +++ b/arch/mips/alchemy/common/time.c @@ -53,7 +53,7 @@ static struct clocksource au1x_counter1_clocksource = {  	.read		= au1x_counter1_read,  	.mask		= CLOCKSOURCE_MASK(32),  	.flags		= CLOCK_SOURCE_IS_CONTINUOUS, -	.rating		= 100, +	.rating		= 1500,  };  static int au1x_rtcmatch2_set_next_event(unsigned long delta, @@ -84,7 +84,7 @@ static irqreturn_t au1x_rtcmatch2_irq(int irq, void *dev_id)  static struct clock_event_device au1x_rtcmatch2_clockdev = {  	.name		= "rtcmatch2",  	.features	= CLOCK_EVT_FEAT_ONESHOT, -	.rating		= 100, +	.rating		= 1500,  	.set_next_event	= au1x_rtcmatch2_set_next_event,  	.set_mode	= au1x_rtcmatch2_set_mode,  	.cpumask	= cpu_all_mask, @@ -158,20 +158,6 @@ cntr_err:  	return -1;  } -static void __init alchemy_setup_c0timer(void) -{ -	/* -	 * MIPS kernel assigns 'au1k_wait' to 'cpu_wait' before this -	 * function is called.  Because the Alchemy counters are unusable -	 * the C0 timekeeping code is installed and use of the 'wait' -	 * instruction must be prohibited, which is done most easily by -	 * assigning NULL to cpu_wait. -	 */ -	cpu_wait = NULL; -	r4k_clockevent_init(); -	init_r4k_clocksource(); -} -  static int alchemy_m2inttab[] __initdata = {  	AU1000_RTC_MATCH2_INT,  	AU1500_RTC_MATCH2_INT, @@ -186,8 +172,7 @@ void __init plat_time_init(void)  	int t;  	t = alchemy_get_cputype(); -	if (t == ALCHEMY_CPU_UNKNOWN) -		alchemy_setup_c0timer(); -	else if (alchemy_time_init(alchemy_m2inttab[t])) -		alchemy_setup_c0timer(); +	if (t == ALCHEMY_CPU_UNKNOWN || +	    alchemy_time_init(alchemy_m2inttab[t])) +		cpu_wait = NULL;	/* wait doesn't work with r4k timer */  } diff --git a/arch/mips/bcm47xx/Kconfig b/arch/mips/bcm47xx/Kconfig index d7af29f1fcf..ba611927749 100644 --- a/arch/mips/bcm47xx/Kconfig +++ b/arch/mips/bcm47xx/Kconfig @@ -8,8 +8,10 @@ config BCM47XX_SSB  	select SSB_DRIVER_EXTIF  	select SSB_EMBEDDED  	select SSB_B43_PCI_BRIDGE if PCI +	select SSB_DRIVER_PCICORE if PCI  	select SSB_PCICORE_HOSTMODE if PCI  	select SSB_DRIVER_GPIO +	select GPIOLIB  	default y  	help  	 Add support for old Broadcom BCM47xx boards with Sonics Silicon Backplane support. @@ -25,6 +27,7 @@ config BCM47XX_BCMA  	select BCMA_HOST_PCI if PCI  	select BCMA_DRIVER_PCI_HOSTMODE if PCI  	select BCMA_DRIVER_GPIO +	select GPIOLIB  	default y  	help  	 Add support for new Broadcom BCM47xx boards with Broadcom specific Advanced Microcontroller Bus. diff --git a/arch/mips/cavium-octeon/executive/cvmx-l2c.c b/arch/mips/cavium-octeon/executive/cvmx-l2c.c index 9f883bf7695..33b72144db3 100644 --- a/arch/mips/cavium-octeon/executive/cvmx-l2c.c +++ b/arch/mips/cavium-octeon/executive/cvmx-l2c.c @@ -30,6 +30,7 @@   * measurement, and debugging facilities.   */ +#include <linux/compiler.h>  #include <linux/irqflags.h>  #include <asm/octeon/cvmx.h>  #include <asm/octeon/cvmx-l2c.h> @@ -285,22 +286,22 @@ uint64_t cvmx_l2c_read_perf(uint32_t counter)   */  static void fault_in(uint64_t addr, int len)  { -	volatile char *ptr; -	volatile char dummy; +	char *ptr; +  	/*  	 * Adjust addr and length so we get all cache lines even for  	 * small ranges spanning two cache lines.  	 */  	len += addr & CVMX_CACHE_LINE_MASK;  	addr &= ~CVMX_CACHE_LINE_MASK; -	ptr = (volatile char *)cvmx_phys_to_ptr(addr); +	ptr = cvmx_phys_to_ptr(addr);  	/*  	 * Invalidate L1 cache to make sure all loads result in data  	 * being in L2.  	 */  	CVMX_DCACHE_INVALIDATE;  	while (len > 0) { -		dummy += *ptr; +		ACCESS_ONCE(*ptr);  		len -= CVMX_CACHE_LINE_SIZE;  		ptr += CVMX_CACHE_LINE_SIZE;  	} diff --git a/arch/mips/cavium-octeon/serial.c b/arch/mips/cavium-octeon/serial.c index 569f41bdcc4..f393f65f392 100644 --- a/arch/mips/cavium-octeon/serial.c +++ b/arch/mips/cavium-octeon/serial.c @@ -43,7 +43,7 @@ void octeon_serial_out(struct uart_port *up, int offset, int value)  	cvmx_write_csr((uint64_t)(up->membase + (offset << 3)), (u8)value);  } -static int __devinit octeon_serial_probe(struct platform_device *pdev) +static int octeon_serial_probe(struct platform_device *pdev)  {  	int irq, res;  	struct resource *res_mem; diff --git a/arch/mips/include/asm/dsp.h b/arch/mips/include/asm/dsp.h index e9bfc0813c7..7bfad0520e2 100644 --- a/arch/mips/include/asm/dsp.h +++ b/arch/mips/include/asm/dsp.h @@ -16,7 +16,7 @@  #include <asm/mipsregs.h>  #define DSP_DEFAULT	0x00000000 -#define DSP_MASK	0x3ff +#define DSP_MASK	0x3f  #define __enable_dsp_hazard()						\  do {									\ diff --git a/arch/mips/include/asm/inst.h b/arch/mips/include/asm/inst.h index ab84064283d..33c34adbecf 100644 --- a/arch/mips/include/asm/inst.h +++ b/arch/mips/include/asm/inst.h @@ -353,6 +353,7 @@ union mips_instruction {  	struct u_format u_format;  	struct c_format c_format;  	struct r_format r_format; +	struct p_format p_format;  	struct f_format f_format;  	struct ma_format ma_format;  	struct b_format b_format; diff --git a/arch/mips/include/asm/mach-pnx833x/war.h b/arch/mips/include/asm/mach-pnx833x/war.h index edaa06d9d49..e410df4e1b3 100644 --- a/arch/mips/include/asm/mach-pnx833x/war.h +++ b/arch/mips/include/asm/mach-pnx833x/war.h @@ -21,4 +21,4 @@  #define R10000_LLSC_WAR			0  #define MIPS34K_MISSED_ITLB_WAR		0 -#endif /* __ASM_MIPS_MACH_PNX8550_WAR_H */ +#endif /* __ASM_MIPS_MACH_PNX833X_WAR_H */ diff --git a/arch/mips/include/asm/page.h b/arch/mips/include/asm/page.h index 31ab10f02ba..dbaec94046d 100644 --- a/arch/mips/include/asm/page.h +++ b/arch/mips/include/asm/page.h @@ -45,8 +45,6 @@  #define HUGETLB_PAGE_ORDER	({BUILD_BUG(); 0; })  #endif /* CONFIG_MIPS_HUGE_TLB_SUPPORT */ -#ifndef __ASSEMBLY__ -  #include <linux/pfn.h>  #include <asm/io.h> @@ -139,8 +137,6 @@ typedef struct { unsigned long pgprot; } pgprot_t;   */  #define ptep_buddy(x)	((pte_t *)((unsigned long)(x) ^ sizeof(pte_t))) -#endif /* !__ASSEMBLY__ */ -  /*   * __pa()/__va() should be used only during mem init.   */ @@ -202,7 +198,10 @@ typedef struct { unsigned long pgprot; } pgprot_t;  #endif  #define virt_to_page(kaddr)	pfn_to_page(PFN_DOWN(virt_to_phys(kaddr))) -#define virt_addr_valid(kaddr)	pfn_valid(PFN_DOWN(virt_to_phys(kaddr))) + +extern int __virt_addr_valid(const volatile void *kaddr); +#define virt_addr_valid(kaddr)						\ +	__virt_addr_valid((const volatile void *) (kaddr))  #define VM_DATA_DEFAULT_FLAGS	(VM_READ | VM_WRITE | VM_EXEC | \  				 VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) diff --git a/arch/mips/include/asm/pci.h b/arch/mips/include/asm/pci.h index 90bf3b3fce1..d69ea743272 100644 --- a/arch/mips/include/asm/pci.h +++ b/arch/mips/include/asm/pci.h @@ -145,7 +145,7 @@ static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel)  extern char * (*pcibios_plat_setup)(char *str);  /* this function parses memory ranges from a device node */ -extern void __devinit pci_load_of_ranges(struct pci_controller *hose, -					 struct device_node *node); +extern void pci_load_of_ranges(struct pci_controller *hose, +			       struct device_node *node);  #endif /* _ASM_PCI_H */ diff --git a/arch/mips/include/asm/pgtable-64.h b/arch/mips/include/asm/pgtable-64.h index c63191055e6..013d5f78126 100644 --- a/arch/mips/include/asm/pgtable-64.h +++ b/arch/mips/include/asm/pgtable-64.h @@ -230,6 +230,7 @@ static inline void pud_clear(pud_t *pudp)  #else  #define pte_pfn(x)		((unsigned long)((x).pte >> _PFN_SHIFT))  #define pfn_pte(pfn, prot)	__pte(((pfn) << _PFN_SHIFT) | pgprot_val(prot)) +#define pfn_pmd(pfn, prot)	__pmd(((pfn) << _PFN_SHIFT) | pgprot_val(prot))  #endif  #define __pgd_offset(address)	pgd_index(address) diff --git a/arch/mips/include/asm/thread_info.h b/arch/mips/include/asm/thread_info.h index 18806a52061..b2050b9e64b 100644 --- a/arch/mips/include/asm/thread_info.h +++ b/arch/mips/include/asm/thread_info.h @@ -29,10 +29,11 @@ struct thread_info {  	__u32			cpu;		/* current CPU */  	int			preempt_count;	/* 0 => preemptable, <0 => BUG */ -	mm_segment_t		addr_limit;	/* thread address space: -						   0-0xBFFFFFFF for user-thead -						   0-0xFFFFFFFF for kernel-thread -						*/ +	mm_segment_t		addr_limit;	/* +						 * thread address space limit: +						 * 0x7fffffff for user-thead +						 * 0xffffffff for kernel-thread +						 */  	struct restart_block	restart_block;  	struct pt_regs		*regs;  }; diff --git a/arch/mips/include/uapi/asm/Kbuild b/arch/mips/include/uapi/asm/Kbuild index a1a0452ac18..77d4fb33f75 100644 --- a/arch/mips/include/uapi/asm/Kbuild +++ b/arch/mips/include/uapi/asm/Kbuild @@ -3,6 +3,7 @@ include include/uapi/asm-generic/Kbuild.asm  header-y += auxvec.h  header-y += bitsperlong.h +header-y += break.h  header-y += byteorder.h  header-y += cachectl.h  header-y += errno.h diff --git a/arch/mips/include/asm/break.h b/arch/mips/include/uapi/asm/break.h index 9161e684cb4..9161e684cb4 100644 --- a/arch/mips/include/asm/break.h +++ b/arch/mips/include/uapi/asm/break.h diff --git a/arch/mips/include/uapi/asm/unistd.h b/arch/mips/include/uapi/asm/unistd.h index cc98a9dcb01..0eebf3c3e03 100644 --- a/arch/mips/include/uapi/asm/unistd.h +++ b/arch/mips/include/uapi/asm/unistd.h @@ -368,16 +368,17 @@  #define __NR_process_vm_readv		(__NR_Linux + 345)  #define __NR_process_vm_writev		(__NR_Linux + 346)  #define __NR_kcmp			(__NR_Linux + 347) +#define __NR_finit_module		(__NR_Linux + 348)  /*   * Offset of the last Linux o32 flavoured syscall   */ -#define __NR_Linux_syscalls		347 +#define __NR_Linux_syscalls		348  #endif /* _MIPS_SIM == _MIPS_SIM_ABI32 */  #define __NR_O32_Linux			4000 -#define __NR_O32_Linux_syscalls		347 +#define __NR_O32_Linux_syscalls		348  #if _MIPS_SIM == _MIPS_SIM_ABI64 @@ -692,16 +693,17 @@  #define __NR_process_vm_readv		(__NR_Linux + 304)  #define __NR_process_vm_writev		(__NR_Linux + 305)  #define __NR_kcmp			(__NR_Linux + 306) +#define __NR_finit_module		(__NR_Linux + 307)  /*   * Offset of the last Linux 64-bit flavoured syscall   */ -#define __NR_Linux_syscalls		306 +#define __NR_Linux_syscalls		307  #endif /* _MIPS_SIM == _MIPS_SIM_ABI64 */  #define __NR_64_Linux			5000 -#define __NR_64_Linux_syscalls		306 +#define __NR_64_Linux_syscalls		307  #if _MIPS_SIM == _MIPS_SIM_NABI32 @@ -1021,15 +1023,16 @@  #define __NR_process_vm_readv		(__NR_Linux + 309)  #define __NR_process_vm_writev		(__NR_Linux + 310)  #define __NR_kcmp			(__NR_Linux + 311) +#define __NR_finit_module		(__NR_Linux + 312)  /*   * Offset of the last N32 flavoured syscall   */ -#define __NR_Linux_syscalls		311 +#define __NR_Linux_syscalls		312  #endif /* _MIPS_SIM == _MIPS_SIM_NABI32 */  #define __NR_N32_Linux			6000 -#define __NR_N32_Linux_syscalls		311 +#define __NR_N32_Linux_syscalls		312  #endif /* _UAPI_ASM_UNISTD_H */ diff --git a/arch/mips/kernel/asm-offsets.c b/arch/mips/kernel/asm-offsets.c index 9690998d4ef..50285b2c7ff 100644 --- a/arch/mips/kernel/asm-offsets.c +++ b/arch/mips/kernel/asm-offsets.c @@ -200,6 +200,9 @@ void output_mm_defines(void)  	DEFINE(_PTRS_PER_PMD, PTRS_PER_PMD);  	DEFINE(_PTRS_PER_PTE, PTRS_PER_PTE);  	BLANK(); +	DEFINE(_PAGE_SHIFT, PAGE_SHIFT); +	DEFINE(_PAGE_SIZE, PAGE_SIZE); +	BLANK();  }  #ifdef CONFIG_32BIT diff --git a/arch/mips/kernel/ftrace.c b/arch/mips/kernel/ftrace.c index 6a2d758dd8e..83fa1460e29 100644 --- a/arch/mips/kernel/ftrace.c +++ b/arch/mips/kernel/ftrace.c @@ -25,6 +25,12 @@  #define MCOUNT_OFFSET_INSNS 4  #endif +/* Arch override because MIPS doesn't need to run this from stop_machine() */ +void arch_ftrace_update_code(int command) +{ +	ftrace_modify_all_code(command); +} +  /*   * Check if the address is in kernel space   * @@ -89,6 +95,24 @@ static int ftrace_modify_code(unsigned long ip, unsigned int new_code)  	return 0;  } +#ifndef CONFIG_64BIT +static int ftrace_modify_code_2(unsigned long ip, unsigned int new_code1, +				unsigned int new_code2) +{ +	int faulted; + +	safe_store_code(new_code1, ip, faulted); +	if (unlikely(faulted)) +		return -EFAULT; +	ip += 4; +	safe_store_code(new_code2, ip, faulted); +	if (unlikely(faulted)) +		return -EFAULT; +	flush_icache_range(ip, ip + 8); /* original ip + 12 */ +	return 0; +} +#endif +  /*   * The details about the calling site of mcount on MIPS   * @@ -131,8 +155,18 @@ int ftrace_make_nop(struct module *mod,  	 * needed.  	 */  	new = in_kernel_space(ip) ? INSN_NOP : INSN_B_1F; - +#ifdef CONFIG_64BIT  	return ftrace_modify_code(ip, new); +#else +	/* +	 * On 32 bit MIPS platforms, gcc adds a stack adjust +	 * instruction in the delay slot after the branch to +	 * mcount and expects mcount to restore the sp on return. +	 * This is based on a legacy API and does nothing but +	 * waste instructions so it's being removed at runtime. +	 */ +	return ftrace_modify_code_2(ip, new, INSN_NOP); +#endif  }  int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr) diff --git a/arch/mips/kernel/genex.S b/arch/mips/kernel/genex.S index 8882e5766f2..8a0096d6281 100644 --- a/arch/mips/kernel/genex.S +++ b/arch/mips/kernel/genex.S @@ -19,7 +19,6 @@  #include <asm/mipsregs.h>  #include <asm/stackframe.h>  #include <asm/war.h> -#include <asm/page.h>  #include <asm/thread_info.h>  #define PANIC_PIC(msg)					\ @@ -483,8 +482,8 @@ NESTED(nmi_handler, PT_SIZE, sp)  	MFC0	k1, CP0_ENTRYHI  	andi	k1, 0xff	/* ASID_MASK */  	MFC0	k0, CP0_EPC -	PTR_SRL	k0, PAGE_SHIFT + 1 -	PTR_SLL	k0, PAGE_SHIFT + 1 +	PTR_SRL	k0, _PAGE_SHIFT + 1 +	PTR_SLL	k0, _PAGE_SHIFT + 1  	or	k1, k0  	MTC0	k1, CP0_ENTRYHI  	mtc0_tlbw_hazard diff --git a/arch/mips/kernel/head.S b/arch/mips/kernel/head.S index ea695d9605e..fcf97312f32 100644 --- a/arch/mips/kernel/head.S +++ b/arch/mips/kernel/head.S @@ -21,7 +21,6 @@  #include <asm/asmmacro.h>  #include <asm/irqflags.h>  #include <asm/regdef.h> -#include <asm/page.h>  #include <asm/pgtable-bits.h>  #include <asm/mipsregs.h>  #include <asm/stackframe.h> diff --git a/arch/mips/kernel/mcount.S b/arch/mips/kernel/mcount.S index 4c968e7efb7..16586767335 100644 --- a/arch/mips/kernel/mcount.S +++ b/arch/mips/kernel/mcount.S @@ -46,9 +46,8 @@  	PTR_L	a5, PT_R9(sp)  	PTR_L	a6, PT_R10(sp)  	PTR_L	a7, PT_R11(sp) -	PTR_ADDIU	sp, PT_SIZE  #else -	PTR_ADDIU	sp, (PT_SIZE + 8) +	PTR_ADDIU	sp, PT_SIZE  #endif  .endm @@ -69,7 +68,9 @@ NESTED(ftrace_caller, PT_SIZE, ra)  	.globl _mcount  _mcount:  	b	ftrace_stub -	 nop +	addiu sp,sp,8 + +	/* When tracing is activated, it calls ftrace_caller+8 (aka here) */  	lw	t1, function_trace_stop  	bnez	t1, ftrace_stub  	 nop diff --git a/arch/mips/kernel/octeon_switch.S b/arch/mips/kernel/octeon_switch.S index 0441f54b2a6..207f1341578 100644 --- a/arch/mips/kernel/octeon_switch.S +++ b/arch/mips/kernel/octeon_switch.S @@ -15,7 +15,6 @@  #include <asm/fpregdef.h>  #include <asm/mipsregs.h>  #include <asm/asm-offsets.h> -#include <asm/page.h>  #include <asm/pgtable-bits.h>  #include <asm/regdef.h>  #include <asm/stackframe.h> diff --git a/arch/mips/kernel/perf_event_mipsxx.c b/arch/mips/kernel/perf_event_mipsxx.c index b14c14d90fc..d9c81c5a6c9 100644 --- a/arch/mips/kernel/perf_event_mipsxx.c +++ b/arch/mips/kernel/perf_event_mipsxx.c @@ -847,7 +847,6 @@ static const struct mips_perf_event xlp_event_map[PERF_COUNT_HW_MAX] = {  	[PERF_COUNT_HW_CACHE_MISSES] = { 0x07, CNTR_ALL }, /* PAPI_L1_ICM */  	[PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = { 0x1b, CNTR_ALL }, /* PAPI_BR_CN */  	[PERF_COUNT_HW_BRANCH_MISSES] = { 0x1c, CNTR_ALL }, /* PAPI_BR_MSP */ -	[PERF_COUNT_HW_BUS_CYCLES] = { UNSUPPORTED_PERF_EVENT_ID },  };  /* 24K/34K/1004K cores can share the same cache event map. */ @@ -1115,24 +1114,12 @@ static const struct mips_perf_event xlp_cache_map  		[C(RESULT_ACCESS)]	= { 0x2f, CNTR_ALL }, /* PAPI_L1_DCW */  		[C(RESULT_MISS)]	= { 0x2e, CNTR_ALL }, /* PAPI_L1_STM */  	}, -	[C(OP_PREFETCH)] = { -		[C(RESULT_ACCESS)]	= { UNSUPPORTED_PERF_EVENT_ID }, -		[C(RESULT_MISS)]	= { UNSUPPORTED_PERF_EVENT_ID }, -	},  },  [C(L1I)] = {  	[C(OP_READ)] = {  		[C(RESULT_ACCESS)]	= { 0x04, CNTR_ALL }, /* PAPI_L1_ICA */  		[C(RESULT_MISS)]	= { 0x07, CNTR_ALL }, /* PAPI_L1_ICM */  	}, -	[C(OP_WRITE)] = { -		[C(RESULT_ACCESS)]	= { UNSUPPORTED_PERF_EVENT_ID }, -		[C(RESULT_MISS)]	= { UNSUPPORTED_PERF_EVENT_ID }, -	}, -	[C(OP_PREFETCH)] = { -		[C(RESULT_ACCESS)]	= { UNSUPPORTED_PERF_EVENT_ID }, -		[C(RESULT_MISS)]	= { UNSUPPORTED_PERF_EVENT_ID }, -	},  },  [C(LL)] = {  	[C(OP_READ)] = { @@ -1143,10 +1130,6 @@ static const struct mips_perf_event xlp_cache_map  		[C(RESULT_ACCESS)]	= { 0x34, CNTR_ALL }, /* PAPI_L2_DCA */  		[C(RESULT_MISS)]	= { 0x36, CNTR_ALL }, /* PAPI_L2_DCM */  	}, -	[C(OP_PREFETCH)] = { -		[C(RESULT_ACCESS)]	= { UNSUPPORTED_PERF_EVENT_ID }, -		[C(RESULT_MISS)]	= { UNSUPPORTED_PERF_EVENT_ID }, -	},  },  [C(DTLB)] = {  	/* @@ -1154,45 +1137,24 @@ static const struct mips_perf_event xlp_cache_map  	 * read and write.  	 */  	[C(OP_READ)] = { -		[C(RESULT_ACCESS)]	= { UNSUPPORTED_PERF_EVENT_ID },  		[C(RESULT_MISS)]	= { 0x2d, CNTR_ALL }, /* PAPI_TLB_DM */  	},  	[C(OP_WRITE)] = { -		[C(RESULT_ACCESS)]	= { UNSUPPORTED_PERF_EVENT_ID },  		[C(RESULT_MISS)]	= { 0x2d, CNTR_ALL }, /* PAPI_TLB_DM */  	}, -	[C(OP_PREFETCH)] = { -		[C(RESULT_ACCESS)]	= { UNSUPPORTED_PERF_EVENT_ID }, -		[C(RESULT_MISS)]	= { UNSUPPORTED_PERF_EVENT_ID }, -	},  },  [C(ITLB)] = {  	[C(OP_READ)] = { -		[C(RESULT_ACCESS)]	= { UNSUPPORTED_PERF_EVENT_ID },  		[C(RESULT_MISS)]	= { 0x08, CNTR_ALL }, /* PAPI_TLB_IM */  	},  	[C(OP_WRITE)] = { -		[C(RESULT_ACCESS)]	= { UNSUPPORTED_PERF_EVENT_ID },  		[C(RESULT_MISS)]	= { 0x08, CNTR_ALL }, /* PAPI_TLB_IM */  	}, -	[C(OP_PREFETCH)] = { -		[C(RESULT_ACCESS)]	= { UNSUPPORTED_PERF_EVENT_ID }, -		[C(RESULT_MISS)]	= { UNSUPPORTED_PERF_EVENT_ID }, -	},  },  [C(BPU)] = {  	[C(OP_READ)] = { -		[C(RESULT_ACCESS)]	= { UNSUPPORTED_PERF_EVENT_ID },  		[C(RESULT_MISS)]	= { 0x25, CNTR_ALL },  	}, -	[C(OP_WRITE)] = { -		[C(RESULT_ACCESS)]	= { UNSUPPORTED_PERF_EVENT_ID }, -		[C(RESULT_MISS)]	= { UNSUPPORTED_PERF_EVENT_ID }, -	}, -	[C(OP_PREFETCH)] = { -		[C(RESULT_ACCESS)]	= { UNSUPPORTED_PERF_EVENT_ID }, -		[C(RESULT_MISS)]	= { UNSUPPORTED_PERF_EVENT_ID }, -	},  },  }; diff --git a/arch/mips/kernel/r2300_switch.S b/arch/mips/kernel/r2300_switch.S index 9c51be5a163..8d32d5a6b46 100644 --- a/arch/mips/kernel/r2300_switch.S +++ b/arch/mips/kernel/r2300_switch.S @@ -15,7 +15,6 @@  #include <asm/fpregdef.h>  #include <asm/mipsregs.h>  #include <asm/asm-offsets.h> -#include <asm/page.h>  #include <asm/regdef.h>  #include <asm/stackframe.h>  #include <asm/thread_info.h> diff --git a/arch/mips/kernel/r4k_switch.S b/arch/mips/kernel/r4k_switch.S index 42d2a393842..8decdfacb44 100644 --- a/arch/mips/kernel/r4k_switch.S +++ b/arch/mips/kernel/r4k_switch.S @@ -15,7 +15,6 @@  #include <asm/fpregdef.h>  #include <asm/mipsregs.h>  #include <asm/asm-offsets.h> -#include <asm/page.h>  #include <asm/pgtable-bits.h>  #include <asm/regdef.h>  #include <asm/stackframe.h> diff --git a/arch/mips/kernel/relocate_kernel.S b/arch/mips/kernel/relocate_kernel.S index e4142c5f7c2..804ebb2c34a 100644 --- a/arch/mips/kernel/relocate_kernel.S +++ b/arch/mips/kernel/relocate_kernel.S @@ -9,7 +9,6 @@  #include <asm/asm.h>  #include <asm/asmmacro.h>  #include <asm/regdef.h> -#include <asm/page.h>  #include <asm/mipsregs.h>  #include <asm/stackframe.h>  #include <asm/addrspace.h> @@ -50,7 +49,7 @@ process_entry:  	and		s3, s2, 0x8  	beq		s3, zero, process_entry  	and		s2, s2, ~0x8 -	li		s6, (1 << PAGE_SHIFT) / SZREG +	li		s6, (1 << _PAGE_SHIFT) / SZREG  copy_word:  	/* copy page word by word */ diff --git a/arch/mips/kernel/scall32-o32.S b/arch/mips/kernel/scall32-o32.S index 374f66e05f3..d20a4bc9ed0 100644 --- a/arch/mips/kernel/scall32-o32.S +++ b/arch/mips/kernel/scall32-o32.S @@ -583,6 +583,7 @@ einval:	li	v0, -ENOSYS  	sys	sys_process_vm_readv	6	/* 4345 */  	sys	sys_process_vm_writev	6  	sys	sys_kcmp		5 +	sys	sys_finit_module	3  	.endm  	/* We pre-compute the number of _instruction_ bytes needed to diff --git a/arch/mips/kernel/scall64-64.S b/arch/mips/kernel/scall64-64.S index 169de6a6d91..b64f642da07 100644 --- a/arch/mips/kernel/scall64-64.S +++ b/arch/mips/kernel/scall64-64.S @@ -422,4 +422,5 @@ sys_call_table:  	PTR	sys_process_vm_readv  	PTR	sys_process_vm_writev		/* 5305 */  	PTR	sys_kcmp +	PTR	sys_finit_module  	.size	sys_call_table,.-sys_call_table diff --git a/arch/mips/kernel/scall64-n32.S b/arch/mips/kernel/scall64-n32.S index ad3de9668da..c29ac197f44 100644 --- a/arch/mips/kernel/scall64-n32.S +++ b/arch/mips/kernel/scall64-n32.S @@ -416,4 +416,5 @@ EXPORT(sysn32_call_table)  	PTR	compat_sys_process_vm_readv  	PTR	compat_sys_process_vm_writev	/* 6310 */  	PTR	sys_kcmp +	PTR	sys_finit_module  	.size	sysn32_call_table,.-sysn32_call_table diff --git a/arch/mips/kernel/scall64-o32.S b/arch/mips/kernel/scall64-o32.S index 9601be6afa3..cf3e75e4665 100644 --- a/arch/mips/kernel/scall64-o32.S +++ b/arch/mips/kernel/scall64-o32.S @@ -540,4 +540,5 @@ sys_call_table:  	PTR	compat_sys_process_vm_readv	/* 4345 */  	PTR	compat_sys_process_vm_writev  	PTR	sys_kcmp +	PTR	sys_finit_module  	.size	sys_call_table,.-sys_call_table diff --git a/arch/mips/kernel/smp.c b/arch/mips/kernel/smp.c index 2e6374a589e..66bf4e22d9b 100644 --- a/arch/mips/kernel/smp.c +++ b/arch/mips/kernel/smp.c @@ -188,7 +188,7 @@ void __init smp_prepare_cpus(unsigned int max_cpus)  }  /* preload SMP state for boot cpu */ -void __devinit smp_prepare_boot_cpu(void) +void smp_prepare_boot_cpu(void)  {  	set_cpu_possible(0, true);  	set_cpu_online(0, true); diff --git a/arch/mips/kernel/vmlinux.lds.S b/arch/mips/kernel/vmlinux.lds.S index 007ccbe1e26..0a4336b803e 100644 --- a/arch/mips/kernel/vmlinux.lds.S +++ b/arch/mips/kernel/vmlinux.lds.S @@ -1,7 +1,8 @@  #include <asm/asm-offsets.h> -#include <asm/page.h>  #include <asm/thread_info.h> +#define PAGE_SIZE _PAGE_SIZE +  /*   * Put .bss..swapper_pg_dir as the first thing in .bss. This will   * ensure that it has .bss alignment (64K). diff --git a/arch/mips/kernel/vpe.c b/arch/mips/kernel/vpe.c index eec690af658..147cec19621 100644 --- a/arch/mips/kernel/vpe.c +++ b/arch/mips/kernel/vpe.c @@ -705,7 +705,7 @@ static int vpe_run(struct vpe * v)  			printk(KERN_WARNING  			       "VPE loader: TC %d is already in use.\n", -                               t->index); +			       v->tc->index);  			return -ENOEXEC;  		}  	} else { diff --git a/arch/mips/lantiq/irq.c b/arch/mips/lantiq/irq.c index f36acd1b380..a7935bf0fec 100644 --- a/arch/mips/lantiq/irq.c +++ b/arch/mips/lantiq/irq.c @@ -408,7 +408,7 @@ int __init icu_of_init(struct device_node *node, struct device_node *parent)  #endif  	/* tell oprofile which irq to use */ -	cp0_perfcount_irq = LTQ_PERF_IRQ; +	cp0_perfcount_irq = irq_create_mapping(ltq_domain, LTQ_PERF_IRQ);  	/*  	 * if the timer irq is not one of the mips irqs we need to diff --git a/arch/mips/lantiq/xway/dma.c b/arch/mips/lantiq/xway/dma.c index 6453962ac89..e44a1866653 100644 --- a/arch/mips/lantiq/xway/dma.c +++ b/arch/mips/lantiq/xway/dma.c @@ -210,7 +210,7 @@ ltq_dma_init_port(int p)  }  EXPORT_SYMBOL_GPL(ltq_dma_init_port); -static int __devinit +static int  ltq_dma_init(struct platform_device *pdev)  {  	struct clk *clk; diff --git a/arch/mips/lantiq/xway/gptu.c b/arch/mips/lantiq/xway/gptu.c index cbb56fc022b..e30b1ed1b93 100644 --- a/arch/mips/lantiq/xway/gptu.c +++ b/arch/mips/lantiq/xway/gptu.c @@ -133,7 +133,7 @@ static inline void clkdev_add_gptu(struct device *dev, const char *con,  	clkdev_add(&clk->cl);  } -static int __devinit gptu_probe(struct platform_device *pdev) +static int gptu_probe(struct platform_device *pdev)  {  	struct clk *clk;  	struct resource *res; diff --git a/arch/mips/lantiq/xway/xrx200_phy_fw.c b/arch/mips/lantiq/xway/xrx200_phy_fw.c index fe808bf5366..d4d9d31f152 100644 --- a/arch/mips/lantiq/xway/xrx200_phy_fw.c +++ b/arch/mips/lantiq/xway/xrx200_phy_fw.c @@ -54,7 +54,7 @@ static dma_addr_t xway_gphy_load(struct platform_device *pdev)  	return dev_addr;  } -static int __devinit xway_phy_fw_probe(struct platform_device *pdev) +static int xway_phy_fw_probe(struct platform_device *pdev)  {  	dma_addr_t fw_addr;  	struct property *pp; diff --git a/arch/mips/lib/delay.c b/arch/mips/lib/delay.c index dc81ca8dc0d..288f7954988 100644 --- a/arch/mips/lib/delay.c +++ b/arch/mips/lib/delay.c @@ -21,7 +21,7 @@ void __delay(unsigned long loops)  	"	.set	noreorder				\n"  	"	.align	3					\n"  	"1:	bnez	%0, 1b					\n" -#if __SIZEOF_LONG__ == 4 +#if BITS_PER_LONG == 32  	"	subu	%0, 1					\n"  #else  	"	dsubu	%0, 1					\n" diff --git a/arch/mips/mm/mmap.c b/arch/mips/mm/mmap.c index d9be7540a6b..7e5fe2790d8 100644 --- a/arch/mips/mm/mmap.c +++ b/arch/mips/mm/mmap.c @@ -192,3 +192,9 @@ unsigned long arch_randomize_brk(struct mm_struct *mm)  	return ret;  } + +int __virt_addr_valid(const volatile void *kaddr) +{ +	return pfn_valid(PFN_DOWN(virt_to_phys(kaddr))); +} +EXPORT_SYMBOL_GPL(__virt_addr_valid); diff --git a/arch/mips/mm/tlbex-fault.S b/arch/mips/mm/tlbex-fault.S index e99eaa1fbed..318855eb5f8 100644 --- a/arch/mips/mm/tlbex-fault.S +++ b/arch/mips/mm/tlbex-fault.S @@ -7,7 +7,6 @@   * Copyright (C) 1999 Silicon Graphics, Inc.   */  #include <asm/mipsregs.h> -#include <asm/page.h>  #include <asm/regdef.h>  #include <asm/stackframe.h> diff --git a/arch/mips/mm/tlbex.c b/arch/mips/mm/tlbex.c index 05613355627..1c8ac49ec72 100644 --- a/arch/mips/mm/tlbex.c +++ b/arch/mips/mm/tlbex.c @@ -976,13 +976,6 @@ build_get_pgde32(u32 **p, unsigned int tmp, unsigned int ptr)  #endif  	uasm_i_mfc0(p, tmp, C0_BADVADDR); /* get faulting address */  	uasm_i_lw(p, ptr, uasm_rel_lo(pgdc), ptr); - -	if (cpu_has_mips_r2) { -		uasm_i_ext(p, tmp, tmp, PGDIR_SHIFT, (32 - PGDIR_SHIFT)); -		uasm_i_ins(p, ptr, tmp, PGD_T_LOG2, (32 - PGDIR_SHIFT)); -		return; -	} -  	uasm_i_srl(p, tmp, tmp, PGDIR_SHIFT); /* get pgd only bits */  	uasm_i_sll(p, tmp, tmp, PGD_T_LOG2);  	uasm_i_addu(p, ptr, ptr, tmp); /* add in pgd offset */ @@ -1018,15 +1011,6 @@ static void __cpuinit build_adjust_context(u32 **p, unsigned int ctx)  static void __cpuinit build_get_ptep(u32 **p, unsigned int tmp, unsigned int ptr)  { -	if (cpu_has_mips_r2) { -		/* PTE ptr offset is obtained from BadVAddr */ -		UASM_i_MFC0(p, tmp, C0_BADVADDR); -		UASM_i_LW(p, ptr, 0, ptr); -		uasm_i_ext(p, tmp, tmp, PAGE_SHIFT+1, PGDIR_SHIFT-PAGE_SHIFT-1); -		uasm_i_ins(p, ptr, tmp, PTE_T_LOG2+1, PGDIR_SHIFT-PAGE_SHIFT-1); -		return; -	} -  	/*  	 * Bug workaround for the Nevada. It seems as if under certain  	 * circumstances the move from cp0_context might produce a diff --git a/arch/mips/mti-sead3/sead3-i2c-drv.c b/arch/mips/mti-sead3/sead3-i2c-drv.c index 0375ee66bca..7aa2225e75b 100644 --- a/arch/mips/mti-sead3/sead3-i2c-drv.c +++ b/arch/mips/mti-sead3/sead3-i2c-drv.c @@ -297,7 +297,7 @@ static void sead3_i2c_platform_setup(struct pic32_i2c_platform_data *priv)  		priv->base + PIC32_I2CxSTATCLR);  } -static int __devinit sead3_i2c_platform_probe(struct platform_device *pdev) +static int sead3_i2c_platform_probe(struct platform_device *pdev)  {  	struct pic32_i2c_platform_data *priv;  	struct resource *r; @@ -345,7 +345,7 @@ out:  	return ret;  } -static int __devexit sead3_i2c_platform_remove(struct platform_device *pdev) +static int sead3_i2c_platform_remove(struct platform_device *pdev)  {  	struct pic32_i2c_platform_data *priv = platform_get_drvdata(pdev); @@ -383,7 +383,7 @@ static struct platform_driver sead3_i2c_platform_driver = {  		.owner	= THIS_MODULE,  	},  	.probe		= sead3_i2c_platform_probe, -	.remove		= __devexit_p(sead3_i2c_platform_remove), +	.remove		= sead3_i2c_platform_remove,  	.suspend	= sead3_i2c_platform_suspend,  	.resume		= sead3_i2c_platform_resume,  }; diff --git a/arch/mips/mti-sead3/sead3-pic32-i2c-drv.c b/arch/mips/mti-sead3/sead3-pic32-i2c-drv.c index 46509b0a620..514675ed0cd 100644 --- a/arch/mips/mti-sead3/sead3-pic32-i2c-drv.c +++ b/arch/mips/mti-sead3/sead3-pic32-i2c-drv.c @@ -304,8 +304,7 @@ static void i2c_platform_disable(struct i2c_platform_data *priv)  	pr_debug("i2c_platform_disable\n");  } -static int __devinit -i2c_platform_probe(struct platform_device *pdev) +static int i2c_platform_probe(struct platform_device *pdev)  {  	struct i2c_platform_data *priv;  	struct resource *r; @@ -362,8 +361,7 @@ out:  	return ret;  } -static int __devexit -i2c_platform_remove(struct platform_device *pdev) +static int i2c_platform_remove(struct platform_device *pdev)  {  	struct i2c_platform_data *priv = platform_get_drvdata(pdev); @@ -408,7 +406,7 @@ static struct platform_driver i2c_platform_driver = {  		.owner	= THIS_MODULE,  	},  	.probe		= i2c_platform_probe, -	.remove		= __devexit_p(i2c_platform_remove), +	.remove		= i2c_platform_remove,  	.suspend	= i2c_platform_suspend,  	.resume		= i2c_platform_resume,  }; diff --git a/arch/mips/netlogic/xlr/setup.c b/arch/mips/netlogic/xlr/setup.c index 4e7f49d3d5a..c5ce6992ac4 100644 --- a/arch/mips/netlogic/xlr/setup.c +++ b/arch/mips/netlogic/xlr/setup.c @@ -193,8 +193,11 @@ static void nlm_init_node(void)  void __init prom_init(void)  { -	int i, *argv, *envp;		/* passed as 32 bit ptrs */ +	int *argv, *envp;		/* passed as 32 bit ptrs */  	struct psb_info *prom_infop; +#ifdef CONFIG_SMP +	int i; +#endif  	/* truncate to 32 bit and sign extend all args */  	argv = (int *)(long)(int)fw_arg1; diff --git a/arch/mips/pci/fixup-cobalt.c b/arch/mips/pci/fixup-cobalt.c index 3e7ce65d776..9553b14002d 100644 --- a/arch/mips/pci/fixup-cobalt.c +++ b/arch/mips/pci/fixup-cobalt.c @@ -37,7 +37,7 @@  #define VIA_COBALT_BRD_ID_REG  0x94  #define VIA_COBALT_BRD_REG_to_ID(reg)	((unsigned char)(reg) >> 4) -static void __devinit qube_raq_galileo_early_fixup(struct pci_dev *dev) +static void qube_raq_galileo_early_fixup(struct pci_dev *dev)  {  	if (dev->devfn == PCI_DEVFN(0, 0) &&  		(dev->class >> 8) == PCI_CLASS_MEMORY_OTHER) { @@ -51,7 +51,7 @@ static void __devinit qube_raq_galileo_early_fixup(struct pci_dev *dev)  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_MARVELL, PCI_DEVICE_ID_MARVELL_GT64111,  	 qube_raq_galileo_early_fixup); -static void __devinit qube_raq_via_bmIDE_fixup(struct pci_dev *dev) +static void qube_raq_via_bmIDE_fixup(struct pci_dev *dev)  {  	unsigned short cfgword;  	unsigned char lt; @@ -74,7 +74,7 @@ static void __devinit qube_raq_via_bmIDE_fixup(struct pci_dev *dev)  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_1,  	 qube_raq_via_bmIDE_fixup); -static void __devinit qube_raq_galileo_fixup(struct pci_dev *dev) +static void qube_raq_galileo_fixup(struct pci_dev *dev)  {  	if (dev->devfn != PCI_DEVFN(0, 0))  		return; @@ -129,7 +129,7 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MARVELL, PCI_DEVICE_ID_MARVELL_GT64111,  int cobalt_board_id; -static void __devinit qube_raq_via_board_id_fixup(struct pci_dev *dev) +static void qube_raq_via_board_id_fixup(struct pci_dev *dev)  {  	u8 id;  	int retval; diff --git a/arch/mips/pci/fixup-emma2rh.c b/arch/mips/pci/fixup-emma2rh.c index 0d9ccf4dfc5..beaec32b02e 100644 --- a/arch/mips/pci/fixup-emma2rh.c +++ b/arch/mips/pci/fixup-emma2rh.c @@ -52,7 +52,7 @@ static unsigned char irq_map[][5] __initdata = {  	       MARKEINS_PCI_IRQ_INTA, MARKEINS_PCI_IRQ_INTB,},  }; -static void __devinit nec_usb_controller_fixup(struct pci_dev *dev) +static void nec_usb_controller_fixup(struct pci_dev *dev)  {  	if (PCI_SLOT(dev->devfn) == EMMA2RH_USB_SLOT)  		/* on board USB controller configuration */ @@ -67,7 +67,7 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_NEC, PCI_DEVICE_ID_NEC_USB,   * if it is the host bridge by marking it as such.  These resources are of   * no consequence to the PCI layer (they are handled elsewhere).   */ -static void __devinit emma2rh_pci_host_fixup(struct pci_dev *dev) +static void emma2rh_pci_host_fixup(struct pci_dev *dev)  {  	int i; diff --git a/arch/mips/pci/fixup-fuloong2e.c b/arch/mips/pci/fixup-fuloong2e.c index 0857ab8c391..63ab4a042cd 100644 --- a/arch/mips/pci/fixup-fuloong2e.c +++ b/arch/mips/pci/fixup-fuloong2e.c @@ -48,7 +48,7 @@ int pcibios_plat_dev_init(struct pci_dev *dev)  	return 0;  } -static void __devinit loongson2e_nec_fixup(struct pci_dev *pdev) +static void loongson2e_nec_fixup(struct pci_dev *pdev)  {  	unsigned int val; @@ -60,7 +60,7 @@ static void __devinit loongson2e_nec_fixup(struct pci_dev *pdev)  	pci_write_config_dword(pdev, 0xe4, 1 << 5);  } -static void __devinit loongson2e_686b_func0_fixup(struct pci_dev *pdev) +static void loongson2e_686b_func0_fixup(struct pci_dev *pdev)  {  	unsigned char c; @@ -135,7 +135,7 @@ static void __devinit loongson2e_686b_func0_fixup(struct pci_dev *pdev)  	printk(KERN_INFO"via686b fix: ISA bridge done\n");  } -static void __devinit loongson2e_686b_func1_fixup(struct pci_dev *pdev) +static void loongson2e_686b_func1_fixup(struct pci_dev *pdev)  {  	printk(KERN_INFO"via686b fix: IDE\n"); @@ -168,19 +168,19 @@ static void __devinit loongson2e_686b_func1_fixup(struct pci_dev *pdev)  	printk(KERN_INFO"via686b fix: IDE done\n");  } -static void __devinit loongson2e_686b_func2_fixup(struct pci_dev *pdev) +static void loongson2e_686b_func2_fixup(struct pci_dev *pdev)  {  	/* irq routing */  	pci_write_config_byte(pdev, PCI_INTERRUPT_LINE, 10);  } -static void __devinit loongson2e_686b_func3_fixup(struct pci_dev *pdev) +static void loongson2e_686b_func3_fixup(struct pci_dev *pdev)  {  	/* irq routing */  	pci_write_config_byte(pdev, PCI_INTERRUPT_LINE, 11);  } -static void __devinit loongson2e_686b_func5_fixup(struct pci_dev *pdev) +static void loongson2e_686b_func5_fixup(struct pci_dev *pdev)  {  	unsigned int val;  	unsigned char c; diff --git a/arch/mips/pci/fixup-lemote2f.c b/arch/mips/pci/fixup-lemote2f.c index a7b917dcf60..519daaebb5d 100644 --- a/arch/mips/pci/fixup-lemote2f.c +++ b/arch/mips/pci/fixup-lemote2f.c @@ -96,21 +96,21 @@ int pcibios_plat_dev_init(struct pci_dev *dev)  }  /* CS5536 SPEC. fixup */ -static void __devinit loongson_cs5536_isa_fixup(struct pci_dev *pdev) +static void loongson_cs5536_isa_fixup(struct pci_dev *pdev)  {  	/* the uart1 and uart2 interrupt in PIC is enabled as default */  	pci_write_config_dword(pdev, PCI_UART1_INT_REG, 1);  	pci_write_config_dword(pdev, PCI_UART2_INT_REG, 1);  } -static void __devinit loongson_cs5536_ide_fixup(struct pci_dev *pdev) +static void loongson_cs5536_ide_fixup(struct pci_dev *pdev)  {  	/* setting the mutex pin as IDE function */  	pci_write_config_dword(pdev, PCI_IDE_CFG_REG,  			       CS5536_IDE_FLASH_SIGNATURE);  } -static void __devinit loongson_cs5536_acc_fixup(struct pci_dev *pdev) +static void loongson_cs5536_acc_fixup(struct pci_dev *pdev)  {  	/* enable the AUDIO interrupt in PIC  */  	pci_write_config_dword(pdev, PCI_ACC_INT_REG, 1); @@ -118,14 +118,14 @@ static void __devinit loongson_cs5536_acc_fixup(struct pci_dev *pdev)  	pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 0xc0);  } -static void __devinit loongson_cs5536_ohci_fixup(struct pci_dev *pdev) +static void loongson_cs5536_ohci_fixup(struct pci_dev *pdev)  {  	/* enable the OHCI interrupt in PIC */  	/* THE OHCI, EHCI, UDC, OTG are shared with interrupt in PIC */  	pci_write_config_dword(pdev, PCI_OHCI_INT_REG, 1);  } -static void __devinit loongson_cs5536_ehci_fixup(struct pci_dev *pdev) +static void loongson_cs5536_ehci_fixup(struct pci_dev *pdev)  {  	u32 hi, lo; @@ -137,7 +137,7 @@ static void __devinit loongson_cs5536_ehci_fixup(struct pci_dev *pdev)  	pci_write_config_dword(pdev, PCI_EHCI_FLADJ_REG, 0x2000);  } -static void __devinit loongson_nec_fixup(struct pci_dev *pdev) +static void loongson_nec_fixup(struct pci_dev *pdev)  {  	unsigned int val; diff --git a/arch/mips/pci/fixup-malta.c b/arch/mips/pci/fixup-malta.c index 9a1a2244522..75d03f6be3b 100644 --- a/arch/mips/pci/fixup-malta.c +++ b/arch/mips/pci/fixup-malta.c @@ -8,7 +8,7 @@  #define PCID		4  /* This table is filled in by interrogating the PIIX4 chip */ -static char pci_irq[5] __devinitdata = { +static char pci_irq[5] = {  };  static char irq_tab[][5] __initdata = { @@ -50,10 +50,10 @@ int pcibios_plat_dev_init(struct pci_dev *dev)  	return 0;  } -static void __devinit malta_piix_func0_fixup(struct pci_dev *pdev) +static void malta_piix_func0_fixup(struct pci_dev *pdev)  {  	unsigned char reg_val; -	static int piixirqmap[16] __devinitdata = {  /* PIIX PIRQC[A:D] irq mappings */ +	static int piixirqmap[16] = {  /* PIIX PIRQC[A:D] irq mappings */  		0,  0, 	0,  3,  		4,  5,  6,  7,  		0,  9, 10, 11, @@ -84,7 +84,7 @@ static void __devinit malta_piix_func0_fixup(struct pci_dev *pdev)  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_0,  	 malta_piix_func0_fixup); -static void __devinit malta_piix_func1_fixup(struct pci_dev *pdev) +static void malta_piix_func1_fixup(struct pci_dev *pdev)  {  	unsigned char reg_val; @@ -104,7 +104,7 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB,  	 malta_piix_func1_fixup);  /* Enable PCI 2.1 compatibility in PIIX4 */ -static void __devinit quirk_dlcsetup(struct pci_dev *dev) +static void quirk_dlcsetup(struct pci_dev *dev)  {  	u8 odlc, ndlc; diff --git a/arch/mips/pci/fixup-rc32434.c b/arch/mips/pci/fixup-rc32434.c index 76bb1be99d4..d0f6ecbf35f 100644 --- a/arch/mips/pci/fixup-rc32434.c +++ b/arch/mips/pci/fixup-rc32434.c @@ -32,12 +32,12 @@  #include <asm/mach-rc32434/rc32434.h>  #include <asm/mach-rc32434/irq.h> -static int __devinitdata irq_map[2][12] = { +static int irq_map[2][12] = {  	{0, 0, 2, 3, 2, 3, 0, 0, 0, 0, 0, 1},  	{0, 0, 1, 3, 0, 2, 1, 3, 0, 2, 1, 3}  }; -int __devinit pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) +int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)  {  	int irq = 0; @@ -47,7 +47,7 @@ int __devinit pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)  	return irq + GROUP4_IRQ_BASE + 4;  } -static void __devinit rc32434_pci_early_fixup(struct pci_dev *dev) +static void rc32434_pci_early_fixup(struct pci_dev *dev)  {  	if (PCI_SLOT(dev->devfn) == 6 && dev->bus->number == 0) {  		/* disable prefetched memory range */ diff --git a/arch/mips/pci/fixup-sb1250.c b/arch/mips/pci/fixup-sb1250.c index d02900a7291..1441becdcb6 100644 --- a/arch/mips/pci/fixup-sb1250.c +++ b/arch/mips/pci/fixup-sb1250.c @@ -15,7 +15,7 @@   * Set the BCM1250, etc. PCI host bridge's TRDY timeout   * to the finite max.   */ -static void __devinit quirk_sb1250_pci(struct pci_dev *dev) +static void quirk_sb1250_pci(struct pci_dev *dev)  {  	pci_write_config_byte(dev, 0x40, 0xff);  } @@ -25,7 +25,7 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SIBYTE, PCI_DEVICE_ID_BCM1250_PCI,  /*   * The BCM1250, etc. PCI/HT bridge reports as a host bridge.   */ -static void __devinit quirk_sb1250_ht(struct pci_dev *dev) +static void quirk_sb1250_ht(struct pci_dev *dev)  {  	dev->class = PCI_CLASS_BRIDGE_PCI << 8;  } @@ -35,7 +35,7 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SIBYTE, PCI_DEVICE_ID_BCM1250_HT,  /*   * Set the SP1011 HT/PCI bridge's TRDY timeout to the finite max.   */ -static void __devinit quirk_sp1011(struct pci_dev *dev) +static void quirk_sp1011(struct pci_dev *dev)  {  	pci_write_config_byte(dev, 0x64, 0xff);  } diff --git a/arch/mips/pci/ops-bcm63xx.c b/arch/mips/pci/ops-bcm63xx.c index 65c7bd10048..4a156629e95 100644 --- a/arch/mips/pci/ops-bcm63xx.c +++ b/arch/mips/pci/ops-bcm63xx.c @@ -411,7 +411,7 @@ struct pci_ops bcm63xx_cb_ops = {   * only one IO window, so it  cannot be shared by PCI and cardbus, use   * fixup to choose and detect unhandled configuration   */ -static void __devinit bcm63xx_fixup(struct pci_dev *dev) +static void bcm63xx_fixup(struct pci_dev *dev)  {  	static int io_window = -1;  	int i, found, new_io_window; diff --git a/arch/mips/pci/ops-tx4927.c b/arch/mips/pci/ops-tx4927.c index bc13e29d2bb..0d69d6f4ea4 100644 --- a/arch/mips/pci/ops-tx4927.c +++ b/arch/mips/pci/ops-tx4927.c @@ -191,13 +191,13 @@ static struct {  	u8 trdyto;  	u8 retryto;  	u16 gbwc; -} tx4927_pci_opts __devinitdata = { +} tx4927_pci_opts = {  	.trdyto = 0,  	.retryto = 0,  	.gbwc = 0xfe0,	/* 4064 GBUSCLK for CCFG.GTOT=0b11 */  }; -char *__devinit tx4927_pcibios_setup(char *str) +char *tx4927_pcibios_setup(char *str)  {  	unsigned long val; @@ -495,7 +495,7 @@ irqreturn_t tx4927_pcierr_interrupt(int irq, void *dev_id)  }  #ifdef CONFIG_TOSHIBA_FPCIB0 -static void __devinit tx4927_quirk_slc90e66_bridge(struct pci_dev *dev) +static void tx4927_quirk_slc90e66_bridge(struct pci_dev *dev)  {  	struct tx4927_pcic_reg __iomem *pcicptr = pci_bus_to_pcicptr(dev->bus); diff --git a/arch/mips/pci/pci-alchemy.c b/arch/mips/pci/pci-alchemy.c index ec125bed721..c4ea6cc55f9 100644 --- a/arch/mips/pci/pci-alchemy.c +++ b/arch/mips/pci/pci-alchemy.c @@ -356,7 +356,7 @@ static struct syscore_ops alchemy_pci_pmops = {  	.resume		= alchemy_pci_resume,  }; -static int __devinit alchemy_pci_probe(struct platform_device *pdev) +static int alchemy_pci_probe(struct platform_device *pdev)  {  	struct alchemy_pci_platdata *pd = pdev->dev.platform_data;  	struct alchemy_pci_context *ctx; diff --git a/arch/mips/pci/pci-ar71xx.c b/arch/mips/pci/pci-ar71xx.c index 1552522b871..6eaa4f2d0e3 100644 --- a/arch/mips/pci/pci-ar71xx.c +++ b/arch/mips/pci/pci-ar71xx.c @@ -24,7 +24,7 @@  #include <asm/mach-ath79/pci.h>  #define AR71XX_PCI_MEM_BASE	0x10000000 -#define AR71XX_PCI_MEM_SIZE	0x08000000 +#define AR71XX_PCI_MEM_SIZE	0x07000000  #define AR71XX_PCI_WIN0_OFFS		0x10000000  #define AR71XX_PCI_WIN1_OFFS		0x11000000 diff --git a/arch/mips/pci/pci-ar724x.c b/arch/mips/pci/pci-ar724x.c index 86d77a66645..c11c75be2d7 100644 --- a/arch/mips/pci/pci-ar724x.c +++ b/arch/mips/pci/pci-ar724x.c @@ -21,7 +21,7 @@  #define AR724X_PCI_CTRL_SIZE	0x100  #define AR724X_PCI_MEM_BASE	0x10000000 -#define AR724X_PCI_MEM_SIZE	0x08000000 +#define AR724X_PCI_MEM_SIZE	0x04000000  #define AR724X_PCI_REG_RESET		0x18  #define AR724X_PCI_REG_INT_STATUS	0x4c diff --git a/arch/mips/pci/pci-ip27.c b/arch/mips/pci/pci-ip27.c index fdc24440294..7f4f49b09b5 100644 --- a/arch/mips/pci/pci-ip27.c +++ b/arch/mips/pci/pci-ip27.c @@ -143,7 +143,7 @@ int __cpuinit bridge_probe(nasid_t nasid, int widget_id, int masterwid)   * A given PCI device, in general, should be able to intr any of the cpus   * on any one of the hubs connected to its xbow.   */ -int __devinit pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) +int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)  {  	return 0;  } @@ -212,7 +212,7 @@ static inline void pci_enable_swapping(struct pci_dev *dev)  	bridge->b_widget.w_tflush;	/* Flush */  } -static void __devinit pci_fixup_ioc3(struct pci_dev *d) +static void pci_fixup_ioc3(struct pci_dev *d)  {  	pci_disable_swapping(d);  } diff --git a/arch/mips/pci/pci-lantiq.c b/arch/mips/pci/pci-lantiq.c index 075d87acd12..95681789b51 100644 --- a/arch/mips/pci/pci-lantiq.c +++ b/arch/mips/pci/pci-lantiq.c @@ -95,7 +95,7 @@ static inline u32 ltq_calc_bar11mask(void)  	return bar11mask;  } -static int __devinit ltq_pci_startup(struct platform_device *pdev) +static int ltq_pci_startup(struct platform_device *pdev)  {  	struct device_node *node = pdev->dev.of_node;  	const __be32 *req_mask, *bus_clk; @@ -201,7 +201,7 @@ static int __devinit ltq_pci_startup(struct platform_device *pdev)  	return 0;  } -static int __devinit ltq_pci_probe(struct platform_device *pdev) +static int ltq_pci_probe(struct platform_device *pdev)  {  	struct resource *res_cfg, *res_bridge; diff --git a/arch/mips/pci/pci.c b/arch/mips/pci/pci.c index 4040416e060..a1843448fad 100644 --- a/arch/mips/pci/pci.c +++ b/arch/mips/pci/pci.c @@ -76,7 +76,7 @@ pcibios_align_resource(void *data, const struct resource *res,  	return start;  } -static void __devinit pcibios_scanbus(struct pci_controller *hose) +static void pcibios_scanbus(struct pci_controller *hose)  {  	static int next_busno;  	static int need_domain_info; @@ -120,8 +120,7 @@ static void __devinit pcibios_scanbus(struct pci_controller *hose)  }  #ifdef CONFIG_OF -void __devinit pci_load_of_ranges(struct pci_controller *hose, -				struct device_node *node) +void pci_load_of_ranges(struct pci_controller *hose, struct device_node *node)  {  	const __be32 *ranges;  	int rlen; @@ -174,7 +173,7 @@ void __devinit pci_load_of_ranges(struct pci_controller *hose,  static DEFINE_MUTEX(pci_scan_mutex); -void __devinit register_pci_controller(struct pci_controller *hose) +void register_pci_controller(struct pci_controller *hose)  {  	if (request_resource(&iomem_resource, hose->mem_resource) < 0)  		goto out; @@ -303,7 +302,7 @@ int pcibios_enable_device(struct pci_dev *dev, int mask)  	return pcibios_plat_dev_init(dev);  } -void __devinit pcibios_fixup_bus(struct pci_bus *bus) +void pcibios_fixup_bus(struct pci_bus *bus)  {  	struct pci_dev *dev = bus->self; diff --git a/arch/mips/power/hibernate.S b/arch/mips/power/hibernate.S index f8a751c0328..61e2558a2dc 100644 --- a/arch/mips/power/hibernate.S +++ b/arch/mips/power/hibernate.S @@ -8,7 +8,6 @@   *         Wu Zhangjin <wuzhangjin@gmail.com>   */  #include <asm/asm-offsets.h> -#include <asm/page.h>  #include <asm/regdef.h>  #include <asm/asm.h> @@ -35,7 +34,7 @@ LEAF(swsusp_arch_resume)  0:  	PTR_L t1, PBE_ADDRESS(t0)   /* source */  	PTR_L t2, PBE_ORIG_ADDRESS(t0) /* destination */ -	PTR_ADDU t3, t1, PAGE_SIZE +	PTR_ADDU t3, t1, _PAGE_SIZE  1:  	REG_L t8, (t1)  	REG_S t8, (t2) diff --git a/arch/mips/sni/setup.c b/arch/mips/sni/setup.c index d6c7bd4b5ab..2e9c283b8e6 100644 --- a/arch/mips/sni/setup.c +++ b/arch/mips/sni/setup.c @@ -236,7 +236,7 @@ void __init plat_mem_setup(void)  #include <video/vga.h>  #include <video/cirrus.h> -static void __devinit quirk_cirrus_ram_size(struct pci_dev *dev) +static void quirk_cirrus_ram_size(struct pci_dev *dev)  {  	u16 cmd; diff --git a/arch/mips/txx9/generic/pci.c b/arch/mips/txx9/generic/pci.c index b14ee53581a..ce8f8b9b930 100644 --- a/arch/mips/txx9/generic/pci.c +++ b/arch/mips/txx9/generic/pci.c @@ -256,8 +256,7 @@ static irqreturn_t i8259_interrupt(int irq, void *dev_id)  	return IRQ_HANDLED;  } -static int __devinit -txx9_i8259_irq_setup(int irq) +static int txx9_i8259_irq_setup(int irq)  {  	int err; @@ -269,7 +268,7 @@ txx9_i8259_irq_setup(int irq)  	return err;  } -static void __devinit quirk_slc90e66_bridge(struct pci_dev *dev) +static void quirk_slc90e66_bridge(struct pci_dev *dev)  {  	int irq;	/* PCI/ISA Bridge interrupt */  	u8 reg_64; @@ -304,7 +303,7 @@ static void __devinit quirk_slc90e66_bridge(struct pci_dev *dev)  	smsc_fdc37m81x_config_end();  } -static void __devinit quirk_slc90e66_ide(struct pci_dev *dev) +static void quirk_slc90e66_ide(struct pci_dev *dev)  {  	unsigned char dat;  	int regs[2] = {0x41, 0x43}; @@ -339,7 +338,7 @@ static void __devinit quirk_slc90e66_ide(struct pci_dev *dev)  }  #endif /* CONFIG_TOSHIBA_FPCIB0 */ -static void __devinit tc35815_fixup(struct pci_dev *dev) +static void tc35815_fixup(struct pci_dev *dev)  {  	/* This device may have PM registers but not they are not supported. */  	if (dev->pm_cap) { @@ -348,7 +347,7 @@ static void __devinit tc35815_fixup(struct pci_dev *dev)  	}  } -static void __devinit final_fixup(struct pci_dev *dev) +static void final_fixup(struct pci_dev *dev)  {  	unsigned char bist; diff --git a/arch/mn10300/Kconfig b/arch/mn10300/Kconfig index aa03f2e1338..e70001cfa05 100644 --- a/arch/mn10300/Kconfig +++ b/arch/mn10300/Kconfig @@ -6,6 +6,7 @@ config MN10300  	select ARCH_WANT_IPC_PARSE_VERSION  	select HAVE_ARCH_TRACEHOOK  	select HAVE_ARCH_KGDB +	select GENERIC_ATOMIC64  	select HAVE_NMI_WATCHDOG if MN10300_WD_TIMER  	select GENERIC_CLOCKEVENTS  	select MODULES_USE_ELF_RELA diff --git a/arch/mn10300/include/asm/dma-mapping.h b/arch/mn10300/include/asm/dma-mapping.h index c1be4397b1e..a18abfc558e 100644 --- a/arch/mn10300/include/asm/dma-mapping.h +++ b/arch/mn10300/include/asm/dma-mapping.h @@ -168,4 +168,19 @@ void dma_cache_sync(void *vaddr, size_t size,  	mn10300_dcache_flush_inv();  } +/* Not supported for now */ +static inline int dma_mmap_coherent(struct device *dev, +				    struct vm_area_struct *vma, void *cpu_addr, +				    dma_addr_t dma_addr, size_t size) +{ +	return -EINVAL; +} + +static inline int dma_get_sgtable(struct device *dev, struct sg_table *sgt, +				  void *cpu_addr, dma_addr_t dma_addr, +				  size_t size) +{ +	return -EINVAL; +} +  #endif diff --git a/arch/mn10300/kernel/smp.c b/arch/mn10300/kernel/smp.c index 95983cd21e7..5d7e152a23b 100644 --- a/arch/mn10300/kernel/smp.c +++ b/arch/mn10300/kernel/smp.c @@ -905,7 +905,7 @@ void __init smp_cpus_done(unsigned int max_cpus)   * Set up the cpu_online_mask, cpu_callout_map and cpu_callin_map of the boot   * processor (CPU 0).   */ -void __devinit smp_prepare_boot_cpu(void) +void smp_prepare_boot_cpu(void)  {  	cpumask_set_cpu(0, &cpu_callout_map);  	cpumask_set_cpu(0, &cpu_callin_map); @@ -930,7 +930,7 @@ void initialize_secondary(void)   * __cpu_up - Set smp_commenced_mask for the nominated CPU   * @cpu: The target CPU.   */ -int __devinit __cpu_up(unsigned int cpu, struct task_struct *tidle) +int __cpu_up(unsigned int cpu, struct task_struct *tidle)  {  	int timeout; diff --git a/arch/mn10300/unit-asb2305/pci.c b/arch/mn10300/unit-asb2305/pci.c index e2059486d3f..6911e845b8c 100644 --- a/arch/mn10300/unit-asb2305/pci.c +++ b/arch/mn10300/unit-asb2305/pci.c @@ -282,7 +282,7 @@ static int __init pci_check_direct(void)  	return -ENODEV;  } -static int __devinit is_valid_resource(struct pci_dev *dev, int idx) +static int is_valid_resource(struct pci_dev *dev, int idx)  {  	unsigned int i, type_mask = IORESOURCE_IO | IORESOURCE_MEM;  	struct resource *devr = &dev->resource[idx], *busr; @@ -302,7 +302,7 @@ static int __devinit is_valid_resource(struct pci_dev *dev, int idx)  	return 0;  } -static void __devinit pcibios_fixup_device_resources(struct pci_dev *dev) +static void pcibios_fixup_device_resources(struct pci_dev *dev)  {  	int limit, i; @@ -325,7 +325,7 @@ static void __devinit pcibios_fixup_device_resources(struct pci_dev *dev)   *  Called after each bus is probed, but before its children   *  are examined.   */ -void __devinit pcibios_fixup_bus(struct pci_bus *bus) +void pcibios_fixup_bus(struct pci_bus *bus)  {  	struct pci_dev *dev; diff --git a/arch/openrisc/lib/delay.c b/arch/openrisc/lib/delay.c index c330767c921..c82b09f4a10 100644 --- a/arch/openrisc/lib/delay.c +++ b/arch/openrisc/lib/delay.c @@ -22,7 +22,7 @@  #include <asm/timex.h>  #include <asm/processor.h> -int __devinit read_current_timer(unsigned long *timer_value) +int read_current_timer(unsigned long *timer_value)  {  	*timer_value = mfspr(SPR_TTCR);  	return 0; diff --git a/arch/parisc/Kconfig b/arch/parisc/Kconfig index b77feffbade..a32e34ecda9 100644 --- a/arch/parisc/Kconfig +++ b/arch/parisc/Kconfig @@ -9,14 +9,12 @@ config PARISC  	select RTC_DRV_GENERIC  	select INIT_ALL_POSSIBLE  	select BUG -	select HAVE_IRQ_WORK  	select HAVE_PERF_EVENTS  	select GENERIC_ATOMIC64 if !64BIT  	select HAVE_GENERIC_HARDIRQS  	select BROKEN_RODATA  	select GENERIC_IRQ_PROBE  	select GENERIC_PCI_IOMAP -	select IRQ_PER_CPU  	select ARCH_HAVE_NMI_SAFE_CMPXCHG  	select GENERIC_SMP_IDLE_THREAD  	select GENERIC_STRNCPY_FROM_USER diff --git a/arch/parisc/include/asm/dma-mapping.h b/arch/parisc/include/asm/dma-mapping.h index 467bbd510ea..106b395688e 100644 --- a/arch/parisc/include/asm/dma-mapping.h +++ b/arch/parisc/include/asm/dma-mapping.h @@ -238,4 +238,19 @@ void * sba_get_iommu(struct parisc_device *dev);  /* At the moment, we panic on error for IOMMU resource exaustion */  #define dma_mapping_error(dev, x)	0 +/* This API cannot be supported on PA-RISC */ +static inline int dma_mmap_coherent(struct device *dev, +				    struct vm_area_struct *vma, void *cpu_addr, +				    dma_addr_t dma_addr, size_t size) +{ +	return -EINVAL; +} + +static inline int dma_get_sgtable(struct device *dev, struct sg_table *sgt, +				  void *cpu_addr, dma_addr_t dma_addr, +				  size_t size) +{ +	return -EINVAL; +} +  #endif diff --git a/arch/parisc/include/asm/parport.h b/arch/parisc/include/asm/parport.h index 00d9cc3e7b9..c391d7cbc22 100644 --- a/arch/parisc/include/asm/parport.h +++ b/arch/parisc/include/asm/parport.h @@ -8,7 +8,7 @@  #define _ASM_PARPORT_H 1 -static int __devinit parport_pc_find_nonpci_ports (int autoirq, int autodma) +static int parport_pc_find_nonpci_ports (int autoirq, int autodma)  {  	/* nothing ! */  	return 0; diff --git a/arch/parisc/kernel/entry.S b/arch/parisc/kernel/entry.S index bfb44247d7a..eb7850b46c2 100644 --- a/arch/parisc/kernel/entry.S +++ b/arch/parisc/kernel/entry.S @@ -1865,7 +1865,7 @@ syscall_restore:  	/* Are we being ptraced? */  	ldw	TASK_FLAGS(%r1),%r19 -	ldi	(_TIF_SINGLESTEP|_TIF_BLOCKSTEP),%r2 +	ldi	_TIF_SYSCALL_TRACE_MASK,%r2  	and,COND(=)	%r19,%r2,%r0  	b,n	syscall_restore_rfi @@ -1978,15 +1978,23 @@ syscall_restore_rfi:  	/* sr2 should be set to zero for userspace syscalls */  	STREG	%r0,TASK_PT_SR2(%r1) -pt_regs_ok:  	LDREG	TASK_PT_GR31(%r1),%r2 -	depi	3,31,2,%r2			   /* ensure return to user mode. */ -	STREG	%r2,TASK_PT_IAOQ0(%r1) +	depi	3,31,2,%r2		   /* ensure return to user mode. */ +	STREG   %r2,TASK_PT_IAOQ0(%r1)  	ldo	4(%r2),%r2  	STREG	%r2,TASK_PT_IAOQ1(%r1) +	b	intr_restore  	copy	%r25,%r16 + +pt_regs_ok: +	LDREG	TASK_PT_IAOQ0(%r1),%r2 +	depi	3,31,2,%r2		   /* ensure return to user mode. */ +	STREG	%r2,TASK_PT_IAOQ0(%r1) +	LDREG	TASK_PT_IAOQ1(%r1),%r2 +	depi	3,31,2,%r2 +	STREG	%r2,TASK_PT_IAOQ1(%r1)  	b	intr_restore -	nop +	copy	%r25,%r16  	.import schedule,code  syscall_do_resched: diff --git a/arch/parisc/kernel/hardware.c b/arch/parisc/kernel/hardware.c index f48a640b55f..f7752f6af29 100644 --- a/arch/parisc/kernel/hardware.c +++ b/arch/parisc/kernel/hardware.c @@ -38,7 +38,7 @@   *	so don't reference this table after starting the init process   */ -static struct hp_hardware hp_hardware_list[] __devinitdata = { +static struct hp_hardware hp_hardware_list[] = {  	{HPHW_NPROC,0x01,0x4,0x0,"Indigo (840, 930)"},  	{HPHW_NPROC,0x8,0x4,0x01,"Firefox(825,925)"},  	{HPHW_NPROC,0xA,0x4,0x01,"Top Gun (835,834,935,635)"}, @@ -1230,7 +1230,7 @@ static struct hp_cpu_type_mask {  	unsigned short model;  	unsigned short mask;  	enum cpu_type cpu; -} hp_cpu_type_mask_list[] __devinitdata = { +} hp_cpu_type_mask_list[] = {  	{ 0x0000, 0x0ff0, pcx    },  /* 0x0000 - 0x000f */  	{ 0x0048, 0x0ff0, pcxl   },  /* 0x0040 - 0x004f */ @@ -1327,8 +1327,7 @@ const char * const cpu_name_version[][2] = {  	[mako2] = { "PA8900 (Shortfin)",	"2.0" }  }; -const char * __devinit -parisc_hardware_description(struct parisc_device_id *id) +const char *parisc_hardware_description(struct parisc_device_id *id)  {  	struct hp_hardware *listptr; diff --git a/arch/parisc/kernel/irq.c b/arch/parisc/kernel/irq.c index c0b1affc06a..0299d63cd11 100644 --- a/arch/parisc/kernel/irq.c +++ b/arch/parisc/kernel/irq.c @@ -410,11 +410,13 @@ void __init init_IRQ(void)  {  	local_irq_disable();	/* PARANOID - should already be disabled */  	mtctl(~0UL, 23);	/* EIRR : clear all pending external intr */ -	claim_cpu_irqs();  #ifdef CONFIG_SMP -	if (!cpu_eiem) +	if (!cpu_eiem) { +		claim_cpu_irqs();  		cpu_eiem = EIEM_MASK(IPI_IRQ) | EIEM_MASK(TIMER_IRQ); +	}  #else +	claim_cpu_irqs();  	cpu_eiem = EIEM_MASK(TIMER_IRQ);  #endif          set_eiem(cpu_eiem);	/* EIEM : enable all external intr */ diff --git a/arch/parisc/kernel/ptrace.c b/arch/parisc/kernel/ptrace.c index 857c2f54547..534abd4936e 100644 --- a/arch/parisc/kernel/ptrace.c +++ b/arch/parisc/kernel/ptrace.c @@ -26,7 +26,7 @@  #include <asm/asm-offsets.h>  /* PSW bits we allow the debugger to modify */ -#define USER_PSW_BITS	(PSW_N | PSW_V | PSW_CB) +#define USER_PSW_BITS	(PSW_N | PSW_B | PSW_V | PSW_CB)  /*   * Called by kernel/ptrace.c when detaching.. diff --git a/arch/parisc/kernel/signal.c b/arch/parisc/kernel/signal.c index 53799695599..fd051705a40 100644 --- a/arch/parisc/kernel/signal.c +++ b/arch/parisc/kernel/signal.c @@ -190,8 +190,10 @@ get_sigframe(struct k_sigaction *ka, unsigned long sp, size_t frame_size)  	DBG(1,"get_sigframe: ka = %#lx, sp = %#lx, frame_size = %#lx\n",  			(unsigned long)ka, sp, frame_size); +	/* Align alternate stack and reserve 64 bytes for the signal +	   handler's frame marker.  */  	if ((ka->sa.sa_flags & SA_ONSTACK) != 0 && ! sas_ss_flags(sp)) -		sp = current->sas_ss_sp; /* Stacks grow up! */ +		sp = (current->sas_ss_sp + 0x7f) & ~0x3f; /* Stacks grow up! */  	DBG(1,"get_sigframe: Returning sp = %#lx\n", (unsigned long)sp);  	return (void __user *) sp; /* Stacks grow up.  Fun. */ diff --git a/arch/parisc/math-emu/cnv_float.h b/arch/parisc/math-emu/cnv_float.h index 9071e093164..933423fa514 100644 --- a/arch/parisc/math-emu/cnv_float.h +++ b/arch/parisc/math-emu/cnv_float.h @@ -347,16 +347,15 @@      Sgl_isinexact_to_fix(sgl_value,exponent)  #define Duint_from_sgl_mantissa(sgl_value,exponent,dresultA,dresultB)	\ -  {Sall(sgl_value) <<= SGL_EXP_LENGTH;  /*  left-justify  */		\ +  {unsigned int val = Sall(sgl_value) << SGL_EXP_LENGTH;		\      if (exponent <= 31) {						\ -    	Dintp1(dresultA) = 0;						\ -    	Dintp2(dresultB) = (unsigned)Sall(sgl_value) >> (31 - exponent); \ +	Dintp1(dresultA) = 0;						\ +	Dintp2(dresultB) = val >> (31 - exponent);			\      }									\      else {								\ -    	Dintp1(dresultA) = Sall(sgl_value) >> (63 - exponent);		\ -    	Dintp2(dresultB) = Sall(sgl_value) << (exponent - 31);		\ +	Dintp1(dresultA) = val >> (63 - exponent);			\ +	Dintp2(dresultB) = exponent <= 62 ? val << (exponent - 31) : 0;	\      }									\ -    Sall(sgl_value) >>= SGL_EXP_LENGTH;  /* return to original */	\    }  #define Duint_setzero(dresultA,dresultB) 	\ diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index 17903f1f356..561ccca7b1a 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig @@ -118,14 +118,12 @@ config PPC  	select HAVE_SYSCALL_WRAPPERS if PPC64  	select GENERIC_ATOMIC64 if PPC32  	select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE -	select HAVE_IRQ_WORK  	select HAVE_PERF_EVENTS  	select HAVE_REGS_AND_STACK_ACCESS_API  	select HAVE_HW_BREAKPOINT if PERF_EVENTS && PPC_BOOK3S_64  	select HAVE_GENERIC_HARDIRQS  	select ARCH_WANT_IPC_PARSE_VERSION  	select SPARSE_IRQ -	select IRQ_PER_CPU  	select IRQ_DOMAIN  	select GENERIC_IRQ_SHOW  	select GENERIC_IRQ_SHOW_LEVEL diff --git a/arch/powerpc/configs/chroma_defconfig b/arch/powerpc/configs/chroma_defconfig index 29bb11ec6c6..4f35fc46238 100644 --- a/arch/powerpc/configs/chroma_defconfig +++ b/arch/powerpc/configs/chroma_defconfig @@ -1,6 +1,6 @@  CONFIG_PPC64=y  CONFIG_PPC_BOOK3E_64=y -# CONFIG_VIRT_CPU_ACCOUNTING is not set +# CONFIG_VIRT_CPU_ACCOUNTING_NATIVE is not set  CONFIG_SMP=y  CONFIG_NR_CPUS=256  CONFIG_EXPERIMENTAL=y diff --git a/arch/powerpc/configs/corenet64_smp_defconfig b/arch/powerpc/configs/corenet64_smp_defconfig index 88fa5c46f66..f7df8362911 100644 --- a/arch/powerpc/configs/corenet64_smp_defconfig +++ b/arch/powerpc/configs/corenet64_smp_defconfig @@ -1,6 +1,6 @@  CONFIG_PPC64=y  CONFIG_PPC_BOOK3E_64=y -# CONFIG_VIRT_CPU_ACCOUNTING is not set +# CONFIG_VIRT_CPU_ACCOUNTING_NATIVE is not set  CONFIG_SMP=y  CONFIG_NR_CPUS=2  CONFIG_EXPERIMENTAL=y diff --git a/arch/powerpc/configs/pasemi_defconfig b/arch/powerpc/configs/pasemi_defconfig index 840a2c2d043..bcedeea0df8 100644 --- a/arch/powerpc/configs/pasemi_defconfig +++ b/arch/powerpc/configs/pasemi_defconfig @@ -1,6 +1,6 @@  CONFIG_PPC64=y  CONFIG_ALTIVEC=y -# CONFIG_VIRT_CPU_ACCOUNTING is not set +# CONFIG_VIRT_CPU_ACCOUNTING_NATIVE is not set  CONFIG_SMP=y  CONFIG_NR_CPUS=2  CONFIG_EXPERIMENTAL=y diff --git a/arch/powerpc/include/asm/cputime.h b/arch/powerpc/include/asm/cputime.h index 483733bd06d..607559ab271 100644 --- a/arch/powerpc/include/asm/cputime.h +++ b/arch/powerpc/include/asm/cputime.h @@ -8,7 +8,7 @@   * as published by the Free Software Foundation; either version   * 2 of the License, or (at your option) any later version.   * - * If we have CONFIG_VIRT_CPU_ACCOUNTING, we measure cpu time in + * If we have CONFIG_VIRT_CPU_ACCOUNTING_NATIVE, we measure cpu time in   * the same units as the timebase.  Otherwise we measure cpu time   * in jiffies using the generic definitions.   */ @@ -16,7 +16,7 @@  #ifndef __POWERPC_CPUTIME_H  #define __POWERPC_CPUTIME_H -#ifndef CONFIG_VIRT_CPU_ACCOUNTING +#ifndef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE  #include <asm-generic/cputime.h>  #ifdef __KERNEL__  static inline void setup_cputime_one_jiffy(void) { } @@ -231,5 +231,5 @@ static inline cputime_t clock_t_to_cputime(const unsigned long clk)  static inline void arch_vtime_task_switch(struct task_struct *tsk) { }  #endif /* __KERNEL__ */ -#endif /* CONFIG_VIRT_CPU_ACCOUNTING */ +#endif /* CONFIG_VIRT_CPU_ACCOUNTING_NATIVE */  #endif /* __POWERPC_CPUTIME_H */ diff --git a/arch/powerpc/include/asm/eeh.h b/arch/powerpc/include/asm/eeh.h index b0ef73882b3..a8fb03e2277 100644 --- a/arch/powerpc/include/asm/eeh.h +++ b/arch/powerpc/include/asm/eeh.h @@ -183,7 +183,7 @@ static inline void eeh_unlock(void)  #define EEH_MAX_ALLOWED_FREEZES 5  typedef void *(*eeh_traverse_func)(void *data, void *flag); -int __devinit eeh_phb_pe_create(struct pci_controller *phb); +int eeh_phb_pe_create(struct pci_controller *phb);  int eeh_add_to_parent_pe(struct eeh_dev *edev);  int eeh_rmv_from_parent_pe(struct eeh_dev *edev, int purge_pe);  void *eeh_pe_dev_traverse(struct eeh_pe *root, @@ -191,8 +191,8 @@ void *eeh_pe_dev_traverse(struct eeh_pe *root,  void eeh_pe_restore_bars(struct eeh_pe *pe);  struct pci_bus *eeh_pe_bus_get(struct eeh_pe *pe); -void * __devinit eeh_dev_init(struct device_node *dn, void *data); -void __devinit eeh_dev_phb_init_dynamic(struct pci_controller *phb); +void *eeh_dev_init(struct device_node *dn, void *data); +void eeh_dev_phb_init_dynamic(struct pci_controller *phb);  int __init eeh_ops_register(struct eeh_ops *ops);  int __exit eeh_ops_unregister(const char *name);  unsigned long eeh_check_failure(const volatile void __iomem *token, diff --git a/arch/powerpc/include/asm/io-workarounds.h b/arch/powerpc/include/asm/io-workarounds.h index fbae4928692..f96dd096ff4 100644 --- a/arch/powerpc/include/asm/io-workarounds.h +++ b/arch/powerpc/include/asm/io-workarounds.h @@ -31,8 +31,8 @@ struct iowa_bus {  	void   *private;  }; -void __devinit iowa_register_bus(struct pci_controller *, struct ppc_pci_io *, -				 int (*)(struct iowa_bus *, void *), void *); +void iowa_register_bus(struct pci_controller *, struct ppc_pci_io *, +		       int (*)(struct iowa_bus *, void *), void *);  struct iowa_bus *iowa_mem_find_bus(const PCI_IO_ADDR);  struct iowa_bus *iowa_pio_find_bus(unsigned long); diff --git a/arch/powerpc/include/asm/lppaca.h b/arch/powerpc/include/asm/lppaca.h index 531fe0c3108..b1e7f2af101 100644 --- a/arch/powerpc/include/asm/lppaca.h +++ b/arch/powerpc/include/asm/lppaca.h @@ -145,7 +145,7 @@ struct dtl_entry {  extern struct kmem_cache *dtl_cache;  /* - * When CONFIG_VIRT_CPU_ACCOUNTING = y, the cpu accounting code controls + * When CONFIG_VIRT_CPU_ACCOUNTING_NATIVE = y, the cpu accounting code controls   * reading from the dispatch trace log.  If other code wants to consume   * DTL entries, it can set this pointer to a function that will get   * called once for each DTL entry that gets processed. diff --git a/arch/powerpc/include/asm/parport.h b/arch/powerpc/include/asm/parport.h index 1ca1102b4a2..6dc2577932b 100644 --- a/arch/powerpc/include/asm/parport.h +++ b/arch/powerpc/include/asm/parport.h @@ -12,7 +12,7 @@  #include <asm/prom.h> -static int __devinit parport_pc_find_nonpci_ports (int autoirq, int autodma) +static int parport_pc_find_nonpci_ports (int autoirq, int autodma)  {  	struct device_node *np;  	const u32 *prop; diff --git a/arch/powerpc/include/asm/perf_event_server.h b/arch/powerpc/include/asm/perf_event_server.h index 9710be3a2d1..136bba62efa 100644 --- a/arch/powerpc/include/asm/perf_event_server.h +++ b/arch/powerpc/include/asm/perf_event_server.h @@ -11,6 +11,7 @@  #include <linux/types.h>  #include <asm/hw_irq.h> +#include <linux/device.h>  #define MAX_HWEVENTS		8  #define MAX_EVENT_ALTERNATIVES	8 @@ -35,6 +36,7 @@ struct power_pmu {  	void		(*disable_pmc)(unsigned int pmc, unsigned long mmcr[]);  	int		(*limited_pmc_event)(u64 event_id);  	u32		flags; +	const struct attribute_group	**attr_groups;  	int		n_generic;  	int		*generic_events;  	int		(*cache_events)[PERF_COUNT_HW_CACHE_MAX] @@ -109,3 +111,27 @@ extern unsigned long perf_instruction_pointer(struct pt_regs *regs);   * If an event_id is not subject to the constraint expressed by a particular   * field, then it will have 0 in both the mask and value for that field.   */ + +extern ssize_t power_events_sysfs_show(struct device *dev, +				struct device_attribute *attr, char *page); + +/* + * EVENT_VAR() is same as PMU_EVENT_VAR with a suffix. + * + * Having a suffix allows us to have aliases in sysfs - eg: the generic + * event 'cpu-cycles' can have two entries in sysfs: 'cpu-cycles' and + * 'PM_CYC' where the latter is the name by which the event is known in + * POWER CPU specification. + */ +#define	EVENT_VAR(_id, _suffix)		event_attr_##_id##_suffix +#define	EVENT_PTR(_id, _suffix)		&EVENT_VAR(_id, _suffix).attr.attr + +#define	EVENT_ATTR(_name, _id, _suffix)					\ +	PMU_EVENT_ATTR(_name, EVENT_VAR(_id, _suffix), PME_PM_##_id,	\ +			power_events_sysfs_show) + +#define	GENERIC_EVENT_ATTR(_name, _id)	EVENT_ATTR(_name, _id, _g) +#define	GENERIC_EVENT_PTR(_id)		EVENT_PTR(_id, _g) + +#define	POWER_EVENT_ATTR(_name, _id)	EVENT_ATTR(PM_##_name, _id, _p) +#define	POWER_EVENT_PTR(_id)		EVENT_PTR(_id, _p) diff --git a/arch/powerpc/include/asm/ppc_asm.h b/arch/powerpc/include/asm/ppc_asm.h index ea2a86e8ff9..2d0e1f5d833 100644 --- a/arch/powerpc/include/asm/ppc_asm.h +++ b/arch/powerpc/include/asm/ppc_asm.h @@ -24,7 +24,7 @@   * user_time and system_time fields in the paca.   */ -#ifndef CONFIG_VIRT_CPU_ACCOUNTING +#ifndef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE  #define ACCOUNT_CPU_USER_ENTRY(ra, rb)  #define ACCOUNT_CPU_USER_EXIT(ra, rb)  #define ACCOUNT_STOLEN_TIME @@ -70,7 +70,7 @@ END_FW_FTR_SECTION_IFSET(FW_FEATURE_SPLPAR)  #endif /* CONFIG_PPC_SPLPAR */ -#endif /* CONFIG_VIRT_CPU_ACCOUNTING */ +#endif /* CONFIG_VIRT_CPU_ACCOUNTING_NATIVE */  /*   * Macros for storing registers into and loading registers from diff --git a/arch/powerpc/include/asm/smp.h b/arch/powerpc/include/asm/smp.h index 5a4e437c238..195ce2ac569 100644 --- a/arch/powerpc/include/asm/smp.h +++ b/arch/powerpc/include/asm/smp.h @@ -54,8 +54,8 @@ struct smp_ops_t {  extern void smp_send_debugger_break(void);  extern void start_secondary_resume(void); -extern void __devinit smp_generic_give_timebase(void); -extern void __devinit smp_generic_take_timebase(void); +extern void smp_generic_give_timebase(void); +extern void smp_generic_take_timebase(void);  DECLARE_PER_CPU(unsigned int, cpu_pvr); diff --git a/arch/powerpc/include/asm/vio.h b/arch/powerpc/include/asm/vio.h index df81cb72d1e..68d0cc998b1 100644 --- a/arch/powerpc/include/asm/vio.h +++ b/arch/powerpc/include/asm/vio.h @@ -139,7 +139,7 @@ extern void vio_unregister_driver(struct vio_driver *drv);  extern int vio_cmo_entitlement_update(size_t);  extern void vio_cmo_set_dev_desired(struct vio_dev *viodev, size_t desired); -extern void __devinit vio_unregister_device(struct vio_dev *dev); +extern void vio_unregister_device(struct vio_dev *dev);  extern int vio_h_cop_sync(struct vio_dev *vdev, struct vio_pfo_op *op); diff --git a/arch/powerpc/include/uapi/asm/kvm_para.h b/arch/powerpc/include/uapi/asm/kvm_para.h index ed0e0254b47..e3af3286a06 100644 --- a/arch/powerpc/include/uapi/asm/kvm_para.h +++ b/arch/powerpc/include/uapi/asm/kvm_para.h @@ -78,7 +78,7 @@ struct kvm_vcpu_arch_shared {  #define KVM_HCALL_TOKEN(num)     _EV_HCALL_TOKEN(EV_KVM_VENDOR_ID, num) -#include <uapi/asm/epapr_hcalls.h> +#include <asm/epapr_hcalls.h>  #define KVM_FEATURE_MAGIC_PAGE	1 diff --git a/arch/powerpc/kernel/entry_32.S b/arch/powerpc/kernel/entry_32.S index d22e73e4618..e514de57a12 100644 --- a/arch/powerpc/kernel/entry_32.S +++ b/arch/powerpc/kernel/entry_32.S @@ -439,6 +439,8 @@ ret_from_fork:  ret_from_kernel_thread:  	REST_NVGPRS(r1)  	bl	schedule_tail +	li	r3,0 +	stw	r3,0(r1)  	mtlr	r14  	mr	r3,r15  	PPC440EP_ERR42 diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S index b310a057362..ac057013f9f 100644 --- a/arch/powerpc/kernel/entry_64.S +++ b/arch/powerpc/kernel/entry_64.S @@ -94,7 +94,7 @@ system_call_common:  	addi	r9,r1,STACK_FRAME_OVERHEAD  	ld	r11,exception_marker@toc(r2)  	std	r11,-16(r9)		/* "regshere" marker */ -#if defined(CONFIG_VIRT_CPU_ACCOUNTING) && defined(CONFIG_PPC_SPLPAR) +#if defined(CONFIG_VIRT_CPU_ACCOUNTING_NATIVE) && defined(CONFIG_PPC_SPLPAR)  BEGIN_FW_FTR_SECTION  	beq	33f  	/* if from user, see if there are any DTL entries to process */ @@ -110,7 +110,7 @@ BEGIN_FW_FTR_SECTION  	addi	r9,r1,STACK_FRAME_OVERHEAD  33:  END_FW_FTR_SECTION_IFSET(FW_FEATURE_SPLPAR) -#endif /* CONFIG_VIRT_CPU_ACCOUNTING && CONFIG_PPC_SPLPAR */ +#endif /* CONFIG_VIRT_CPU_ACCOUNTING_NATIVE && CONFIG_PPC_SPLPAR */  	/*  	 * A syscall should always be called with interrupts enabled @@ -664,6 +664,19 @@ resume_kernel:  	ld	r4,TI_FLAGS(r9)  	andi.	r0,r4,_TIF_NEED_RESCHED  	bne	1b + +	/* +	 * arch_local_irq_restore() from preempt_schedule_irq above may +	 * enable hard interrupt but we really should disable interrupts +	 * when we return from the interrupt, and so that we don't get +	 * interrupted after loading SRR0/1. +	 */ +#ifdef CONFIG_PPC_BOOK3E +	wrteei	0 +#else +	ld	r10,PACAKMSR(r13) /* Get kernel MSR without EE */ +	mtmsrd	r10,1		  /* Update machine state */ +#endif /* CONFIG_PPC_BOOK3E */  #endif /* CONFIG_PREEMPT */  	.globl	fast_exc_return_irq diff --git a/arch/powerpc/kernel/io-workarounds.c b/arch/powerpc/kernel/io-workarounds.c index 12d329bcbb9..50e90b7e713 100644 --- a/arch/powerpc/kernel/io-workarounds.c +++ b/arch/powerpc/kernel/io-workarounds.c @@ -118,7 +118,7 @@ static void iowa_##name at					\  #undef DEF_PCI_AC_RET  #undef DEF_PCI_AC_NORET -static const struct ppc_pci_io __devinitconst iowa_pci_io = { +static const struct ppc_pci_io iowa_pci_io = {  #define DEF_PCI_AC_RET(name, ret, at, al, space, aa)	.name = iowa_##name,  #define DEF_PCI_AC_NORET(name, at, al, space, aa)	.name = iowa_##name, @@ -146,7 +146,7 @@ static void __iomem *iowa_ioremap(phys_addr_t addr, unsigned long size,  }  /* Enable IO workaround */ -static void __devinit io_workaround_init(void) +static void io_workaround_init(void)  {  	static int io_workaround_inited; @@ -158,9 +158,8 @@ static void __devinit io_workaround_init(void)  }  /* Register new bus to support workaround */ -void __devinit iowa_register_bus(struct pci_controller *phb, -			struct ppc_pci_io *ops, -			int (*initfunc)(struct iowa_bus *, void *), void *data) +void iowa_register_bus(struct pci_controller *phb, struct ppc_pci_io *ops, +		       int (*initfunc)(struct iowa_bus *, void *), void *data)  {  	struct iowa_bus *bus;  	struct device_node *np = phb->dn; diff --git a/arch/powerpc/kernel/isa-bridge.c b/arch/powerpc/kernel/isa-bridge.c index d45ec58703c..0f199709796 100644 --- a/arch/powerpc/kernel/isa-bridge.c +++ b/arch/powerpc/kernel/isa-bridge.c @@ -41,8 +41,8 @@ EXPORT_SYMBOL_GPL(isa_bridge_pcidev);  #define ISA_SPACE_MASK 0x1  #define ISA_SPACE_IO 0x1 -static void __devinit pci_process_ISA_OF_ranges(struct device_node *isa_node, -						unsigned long phb_io_base_phys) +static void pci_process_ISA_OF_ranges(struct device_node *isa_node, +				      unsigned long phb_io_base_phys)  {  	/* We should get some saner parsing here and remove these structs */  	struct pci_address { @@ -170,8 +170,8 @@ void __init isa_bridge_find_early(struct pci_controller *hose)   * isa_bridge_find_late - Find and map the ISA IO space upon discovery of   *                        a new ISA bridge   */ -static void __devinit isa_bridge_find_late(struct pci_dev *pdev, -					   struct device_node *devnode) +static void isa_bridge_find_late(struct pci_dev *pdev, +				 struct device_node *devnode)  {  	struct pci_controller *hose = pci_bus_to_host(pdev->bus); @@ -215,8 +215,8 @@ static void isa_bridge_remove(void)  /**   * isa_bridge_notify - Get notified of PCI devices addition/removal   */ -static int __devinit isa_bridge_notify(struct notifier_block *nb, -				       unsigned long action, void *data) +static int isa_bridge_notify(struct notifier_block *nb, unsigned long action, +			     void *data)  {  	struct device *dev = data;  	struct pci_dev *pdev = to_pci_dev(dev); diff --git a/arch/powerpc/kernel/kgdb.c b/arch/powerpc/kernel/kgdb.c index c470a40b29f..a7bc7521c06 100644 --- a/arch/powerpc/kernel/kgdb.c +++ b/arch/powerpc/kernel/kgdb.c @@ -154,12 +154,12 @@ static int kgdb_handle_breakpoint(struct pt_regs *regs)  static int kgdb_singlestep(struct pt_regs *regs)  {  	struct thread_info *thread_info, *exception_thread_info; -	struct thread_info *backup_current_thread_info = \ -		(struct thread_info *)kmalloc(sizeof(struct thread_info), GFP_KERNEL); +	struct thread_info *backup_current_thread_info;  	if (user_mode(regs))  		return 0; +	backup_current_thread_info = (struct thread_info *)kmalloc(sizeof(struct thread_info), GFP_KERNEL);  	/*  	 * On Book E and perhaps other processors, singlestep is handled on  	 * the critical exception stack.  This causes current_thread_info() @@ -185,6 +185,7 @@ static int kgdb_singlestep(struct pt_regs *regs)  		/* Restore current_thread_info lastly. */  		memcpy(exception_thread_info, backup_current_thread_info, sizeof *thread_info); +	kfree(backup_current_thread_info);  	return 1;  } diff --git a/arch/powerpc/kernel/of_platform.c b/arch/powerpc/kernel/of_platform.c index 9db8ec07ec9..07c12697d70 100644 --- a/arch/powerpc/kernel/of_platform.c +++ b/arch/powerpc/kernel/of_platform.c @@ -37,7 +37,7 @@   * lacking some bits needed here.   */ -static int __devinit of_pci_phb_probe(struct platform_device *dev) +static int of_pci_phb_probe(struct platform_device *dev)  {  	struct pci_controller *phb; diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c index abc0d085699..7c37379ea9b 100644 --- a/arch/powerpc/kernel/pci-common.c +++ b/arch/powerpc/kernel/pci-common.c @@ -673,9 +673,8 @@ void pci_resource_to_user(const struct pci_dev *dev, int bar,   *   - Some 32 bits platforms such as 4xx can have physical space larger than   *     32 bits so we need to use 64 bits values for the parsing   */ -void __devinit pci_process_bridge_OF_ranges(struct pci_controller *hose, -					    struct device_node *dev, -					    int primary) +void pci_process_bridge_OF_ranges(struct pci_controller *hose, +				  struct device_node *dev, int primary)  {  	const u32 *ranges;  	int rlen; @@ -848,7 +847,7 @@ int pci_proc_domain(struct pci_bus *bus)  /* This header fixup will do the resource fixup for all devices as they are   * probed, but not for bridge ranges   */ -static void __devinit pcibios_fixup_resources(struct pci_dev *dev) +static void pcibios_fixup_resources(struct pci_dev *dev)  {  	struct pci_controller *hose = pci_bus_to_host(dev->bus);  	int i; @@ -902,8 +901,8 @@ DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, pcibios_fixup_resources);   * things go more smoothly when it gets it right. It should covers cases such   * as Apple "closed" bridge resources and bare-metal pSeries unassigned bridges   */ -static int __devinit pcibios_uninitialized_bridge_resource(struct pci_bus *bus, -							   struct resource *res) +static int pcibios_uninitialized_bridge_resource(struct pci_bus *bus, +						 struct resource *res)  {  	struct pci_controller *hose = pci_bus_to_host(bus);  	struct pci_dev *dev = bus->self; @@ -967,7 +966,7 @@ static int __devinit pcibios_uninitialized_bridge_resource(struct pci_bus *bus,  }  /* Fixup resources of a PCI<->PCI bridge */ -static void __devinit pcibios_fixup_bridge(struct pci_bus *bus) +static void pcibios_fixup_bridge(struct pci_bus *bus)  {  	struct resource *res;  	int i; @@ -1007,7 +1006,7 @@ static void __devinit pcibios_fixup_bridge(struct pci_bus *bus)  	}  } -void __devinit pcibios_setup_bus_self(struct pci_bus *bus) +void pcibios_setup_bus_self(struct pci_bus *bus)  {  	/* Fix up the bus resources for P2P bridges */  	if (bus->self != NULL) @@ -1024,7 +1023,7 @@ void __devinit pcibios_setup_bus_self(struct pci_bus *bus)  		ppc_md.pci_dma_bus_setup(bus);  } -void __devinit pcibios_setup_bus_devices(struct pci_bus *bus) +void pcibios_setup_bus_devices(struct pci_bus *bus)  {  	struct pci_dev *dev; @@ -1063,7 +1062,7 @@ void pcibios_set_master(struct pci_dev *dev)  	/* No special bus mastering setup handling */  } -void __devinit pcibios_fixup_bus(struct pci_bus *bus) +void pcibios_fixup_bus(struct pci_bus *bus)  {  	/* When called from the generic PCI probe, read PCI<->PCI bridge  	 * bases. This is -not- called when generating the PCI tree from @@ -1080,7 +1079,7 @@ void __devinit pcibios_fixup_bus(struct pci_bus *bus)  }  EXPORT_SYMBOL(pcibios_fixup_bus); -void __devinit pci_fixup_cardbus(struct pci_bus *bus) +void pci_fixup_cardbus(struct pci_bus *bus)  {  	/* Now fixup devices on that bus */  	pcibios_setup_bus_devices(bus); @@ -1264,7 +1263,7 @@ void pcibios_allocate_bus_resources(struct pci_bus *bus)  		pcibios_allocate_bus_resources(b);  } -static inline void __devinit alloc_resource(struct pci_dev *dev, int idx) +static inline void alloc_resource(struct pci_dev *dev, int idx)  {  	struct resource *pr, *r = &dev->resource[idx]; @@ -1500,7 +1499,8 @@ resource_size_t pcibios_io_space_offset(struct pci_controller *hose)  	return (unsigned long) hose->io_base_virt - _IO_BASE;  } -static void __devinit pcibios_setup_phb_resources(struct pci_controller *hose, struct list_head *resources) +static void pcibios_setup_phb_resources(struct pci_controller *hose, +					struct list_head *resources)  {  	struct resource *res;  	int i; @@ -1639,7 +1639,7 @@ struct device_node *pcibios_get_phb_of_node(struct pci_bus *bus)   * pci_scan_phb - Given a pci_controller, setup and scan the PCI bus   * @hose: Pointer to the PCI host controller instance structure   */ -void __devinit pcibios_scan_phb(struct pci_controller *hose) +void pcibios_scan_phb(struct pci_controller *hose)  {  	LIST_HEAD(resources);  	struct pci_bus *bus; diff --git a/arch/powerpc/kernel/pci_32.c b/arch/powerpc/kernel/pci_32.c index 64f526a321f..e37c2152acf 100644 --- a/arch/powerpc/kernel/pci_32.c +++ b/arch/powerpc/kernel/pci_32.c @@ -213,7 +213,7 @@ pci_create_OF_bus_map(void)  	}  } -void __devinit pcibios_setup_phb_io_space(struct pci_controller *hose) +void pcibios_setup_phb_io_space(struct pci_controller *hose)  {  	unsigned long io_offset;  	struct resource *res = &hose->io_resource; diff --git a/arch/powerpc/kernel/pci_64.c b/arch/powerpc/kernel/pci_64.c index 2cbe6768fdd..51a133a78a0 100644 --- a/arch/powerpc/kernel/pci_64.c +++ b/arch/powerpc/kernel/pci_64.c @@ -122,7 +122,7 @@ int pcibios_unmap_io_space(struct pci_bus *bus)  }  EXPORT_SYMBOL_GPL(pcibios_unmap_io_space); -static int __devinit pcibios_map_phb_io_space(struct pci_controller *hose) +static int pcibios_map_phb_io_space(struct pci_controller *hose)  {  	struct vm_struct *area;  	unsigned long phys_page; @@ -173,7 +173,7 @@ static int __devinit pcibios_map_phb_io_space(struct pci_controller *hose)  	return 0;  } -int __devinit pcibios_map_io_space(struct pci_bus *bus) +int pcibios_map_io_space(struct pci_bus *bus)  {  	WARN_ON(bus == NULL); @@ -193,7 +193,7 @@ int __devinit pcibios_map_io_space(struct pci_bus *bus)  }  EXPORT_SYMBOL_GPL(pcibios_map_io_space); -void __devinit pcibios_setup_phb_io_space(struct pci_controller *hose) +void pcibios_setup_phb_io_space(struct pci_controller *hose)  {  	pcibios_map_phb_io_space(hose);  } diff --git a/arch/powerpc/kernel/pci_dn.c b/arch/powerpc/kernel/pci_dn.c index dd9e4a04bf7..e7af165f8b9 100644 --- a/arch/powerpc/kernel/pci_dn.c +++ b/arch/powerpc/kernel/pci_dn.c @@ -36,7 +36,7 @@   * Traverse_func that inits the PCI fields of the device node.   * NOTE: this *must* be done before read/write config to the device.   */ -void * __devinit update_dn_pci_info(struct device_node *dn, void *data) +void *update_dn_pci_info(struct device_node *dn, void *data)  {  	struct pci_controller *phb = data;  	const int *type = @@ -129,7 +129,7 @@ void *traverse_pci_devices(struct device_node *start, traverse_func pre,   * subsystem is set up, before kmalloc is valid) and during the    * dynamic lpar operation of adding a PHB to a running system.   */ -void __devinit pci_devs_phb_init_dynamic(struct pci_controller *phb) +void pci_devs_phb_init_dynamic(struct pci_controller *phb)  {  	struct device_node *dn = phb->dn;  	struct pci_dn *pdn; diff --git a/arch/powerpc/kernel/pci_of_scan.c b/arch/powerpc/kernel/pci_of_scan.c index 30378a19f65..2a67e9baa59 100644 --- a/arch/powerpc/kernel/pci_of_scan.c +++ b/arch/powerpc/kernel/pci_of_scan.c @@ -204,7 +204,7 @@ EXPORT_SYMBOL(of_create_pci_dev);   * this routine in turn call of_scan_bus() recusively to scan for more child   * devices.   */ -void __devinit of_scan_pci_bridge(struct pci_dev *dev) +void of_scan_pci_bridge(struct pci_dev *dev)  {  	struct device_node *node = dev->dev.of_node;  	struct pci_bus *bus; @@ -299,8 +299,8 @@ EXPORT_SYMBOL(of_scan_pci_bridge);   * @bus: pci_bus structure for the PCI bus   * @rescan_existing: Flag indicating bus has already been set up   */ -static void __devinit __of_scan_bus(struct device_node *node, -				    struct pci_bus *bus, int rescan_existing) +static void __of_scan_bus(struct device_node *node, struct pci_bus *bus, +			  int rescan_existing)  {  	struct device_node *child;  	const u32 *reg; @@ -348,8 +348,7 @@ static void __devinit __of_scan_bus(struct device_node *node,   * @node: device tree node for the PCI bus   * @bus: pci_bus structure for the PCI bus   */ -void __devinit of_scan_bus(struct device_node *node, -			   struct pci_bus *bus) +void of_scan_bus(struct device_node *node, struct pci_bus *bus)  {  	__of_scan_bus(node, bus, 0);  } @@ -363,8 +362,7 @@ EXPORT_SYMBOL_GPL(of_scan_bus);   * Same as of_scan_bus, but for a pci_bus structure that has already been   * setup.   */ -void __devinit of_rescan_bus(struct device_node *node, -			     struct pci_bus *bus) +void of_rescan_bus(struct device_node *node, struct pci_bus *bus)  {  	__of_scan_bus(node, bus, 1);  } diff --git a/arch/powerpc/kernel/rtas_pci.c b/arch/powerpc/kernel/rtas_pci.c index 6de63e3250b..71cb20d6ec6 100644 --- a/arch/powerpc/kernel/rtas_pci.c +++ b/arch/powerpc/kernel/rtas_pci.c @@ -209,7 +209,7 @@ void __init init_pci_config_tokens (void)  	ibm_write_pci_config = rtas_token("ibm,write-pci-config");  } -unsigned long __devinit get_phb_buid (struct device_node *phb) +unsigned long get_phb_buid (struct device_node *phb)  {  	struct resource r; @@ -237,7 +237,7 @@ static int phb_set_bus_ranges(struct device_node *dev,  	return 0;  } -int __devinit rtas_setup_phb(struct pci_controller *phb) +int rtas_setup_phb(struct pci_controller *phb)  {  	struct device_node *dev = phb->dn; diff --git a/arch/powerpc/kernel/smp-tbsync.c b/arch/powerpc/kernel/smp-tbsync.c index 640de836e46..e68fd1ae727 100644 --- a/arch/powerpc/kernel/smp-tbsync.c +++ b/arch/powerpc/kernel/smp-tbsync.c @@ -36,13 +36,13 @@ static struct {  static volatile int		running; -static void __devinit enter_contest(u64 mark, long add) +static void enter_contest(u64 mark, long add)  {  	while (get_tb() < mark)  		tbsync->race_result = add;  } -void __devinit smp_generic_take_timebase(void) +void smp_generic_take_timebase(void)  {  	int cmd;  	u64 tb; @@ -75,7 +75,7 @@ void __devinit smp_generic_take_timebase(void)  	local_irq_restore(flags);  } -static int __devinit start_contest(int cmd, long offset, int num) +static int start_contest(int cmd, long offset, int num)  {  	int i, score=0;  	u64 tb; @@ -110,7 +110,7 @@ static int __devinit start_contest(int cmd, long offset, int num)  	return score;  } -void __devinit smp_generic_give_timebase(void) +void smp_generic_give_timebase(void)  {  	int i, score, score2, old, min=0, max=5000, offset=1000; diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c index e5b133ebd8a..793401e6508 100644 --- a/arch/powerpc/kernel/smp.c +++ b/arch/powerpc/kernel/smp.c @@ -82,7 +82,7 @@ int smt_enabled_at_boot = 1;  static void (*crash_ipi_function_ptr)(struct pt_regs *) = NULL;  #ifdef CONFIG_PPC64 -int __devinit smp_generic_kick_cpu(int nr) +int smp_generic_kick_cpu(int nr)  {  	BUG_ON(nr < 0 || nr >= NR_CPUS); @@ -311,7 +311,7 @@ void smp_send_stop(void)  struct thread_info *current_set[NR_CPUS]; -static void __devinit smp_store_cpu_info(int id) +static void smp_store_cpu_info(int id)  {  	per_cpu(cpu_pvr, id) = mfspr(SPRN_PVR);  #ifdef CONFIG_PPC_FSL_BOOK3E @@ -355,7 +355,7 @@ void __init smp_prepare_cpus(unsigned int max_cpus)  		max_cpus = 1;  } -void __devinit smp_prepare_boot_cpu(void) +void smp_prepare_boot_cpu(void)  {  	BUG_ON(smp_processor_id() != boot_cpuid);  #ifdef CONFIG_PPC64 @@ -610,7 +610,7 @@ static struct device_node *cpu_to_l2cache(int cpu)  }  /* Activate a secondary processor. */ -void __devinit start_secondary(void *unused) +void start_secondary(void *unused)  {  	unsigned int cpu = smp_processor_id();  	struct device_node *l2_cache; diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c index b3b14352b05..f77fa22754b 100644 --- a/arch/powerpc/kernel/time.c +++ b/arch/powerpc/kernel/time.c @@ -143,7 +143,7 @@ EXPORT_SYMBOL_GPL(ppc_proc_freq);  unsigned long ppc_tb_freq;  EXPORT_SYMBOL_GPL(ppc_tb_freq); -#ifdef CONFIG_VIRT_CPU_ACCOUNTING +#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE  /*   * Factors for converting from cputime_t (timebase ticks) to   * jiffies, microseconds, seconds, and clock_t (1/USER_HZ seconds). @@ -347,6 +347,7 @@ void vtime_account_system(struct task_struct *tsk)  	if (stolen)  		account_steal_time(stolen);  } +EXPORT_SYMBOL_GPL(vtime_account_system);  void vtime_account_idle(struct task_struct *tsk)  { @@ -377,7 +378,7 @@ void vtime_account_user(struct task_struct *tsk)  	account_user_time(tsk, utime, utimescaled);  } -#else /* ! CONFIG_VIRT_CPU_ACCOUNTING */ +#else /* ! CONFIG_VIRT_CPU_ACCOUNTING_NATIVE */  #define calc_cputime_factors()  #endif @@ -494,10 +495,15 @@ void timer_interrupt(struct pt_regs * regs)  	set_dec(DECREMENTER_MAX);  	/* Some implementations of hotplug will get timer interrupts while -	 * offline, just ignore these +	 * offline, just ignore these and we also need to set +	 * decrementers_next_tb as MAX to make sure __check_irq_replay +	 * don't replay timer interrupt when return, otherwise we'll trap +	 * here infinitely :(  	 */ -	if (!cpu_online(smp_processor_id())) +	if (!cpu_online(smp_processor_id())) { +		*next_tb = ~(u64)0;  		return; +	}  	/* Conditionally hard-enable interrupts now that the DEC has been  	 * bumped to its maximum value @@ -663,7 +669,7 @@ int update_persistent_clock(struct timespec now)  	struct rtc_time tm;  	if (!ppc_md.set_rtc_time) -		return 0; +		return -ENODEV;  	to_tm(now.tv_sec + 1 + timezone_offset, &tm);  	tm.tm_year -= 1900; @@ -770,13 +776,8 @@ void update_vsyscall_old(struct timespec *wall_time, struct timespec *wtm,  void update_vsyscall_tz(void)  { -	/* Make userspace gettimeofday spin until we're done. */ -	++vdso_data->tb_update_count; -	smp_mb();  	vdso_data->tz_minuteswest = sys_tz.tz_minuteswest;  	vdso_data->tz_dsttime = sys_tz.tz_dsttime; -	smp_mb(); -	++vdso_data->tb_update_count;  }  static void __init clocksource_init(void) diff --git a/arch/powerpc/kernel/vio.c b/arch/powerpc/kernel/vio.c index 201ba59738b..536016d792b 100644 --- a/arch/powerpc/kernel/vio.c +++ b/arch/powerpc/kernel/vio.c @@ -1289,7 +1289,7 @@ void vio_unregister_driver(struct vio_driver *viodrv)  EXPORT_SYMBOL(vio_unregister_driver);  /* vio_dev refcount hit 0 */ -static void __devinit vio_dev_release(struct device *dev) +static void vio_dev_release(struct device *dev)  {  	struct iommu_table *tbl = get_iommu_table_base(dev); @@ -1545,7 +1545,7 @@ static struct device_attribute vio_dev_attrs[] = {  	__ATTR_NULL  }; -void __devinit vio_unregister_device(struct vio_dev *viodev) +void vio_unregister_device(struct vio_dev *viodev)  {  	device_unregister(&viodev->dev);  } diff --git a/arch/powerpc/kvm/book3s_hv_ras.c b/arch/powerpc/kvm/book3s_hv_ras.c index 35f3cf0269b..a353c485808 100644 --- a/arch/powerpc/kvm/book3s_hv_ras.c +++ b/arch/powerpc/kvm/book3s_hv_ras.c @@ -79,7 +79,9 @@ static void flush_tlb_power7(struct kvm_vcpu *vcpu)  static long kvmppc_realmode_mc_power7(struct kvm_vcpu *vcpu)  {  	unsigned long srr1 = vcpu->arch.shregs.msr; +#ifdef CONFIG_PPC_POWERNV  	struct opal_machine_check_event *opal_evt; +#endif  	long handled = 1;  	if (srr1 & SRR1_MC_LDSTERR) { @@ -117,6 +119,7 @@ static long kvmppc_realmode_mc_power7(struct kvm_vcpu *vcpu)  		handled = 0;  	} +#ifdef CONFIG_PPC_POWERNV  	/*  	 * See if OPAL has already handled the condition.  	 * We assume that if the condition is recovered then OPAL @@ -131,6 +134,7 @@ static long kvmppc_realmode_mc_power7(struct kvm_vcpu *vcpu)  	if (handled)  		opal_evt->in_use = 0; +#endif  	return handled;  } diff --git a/arch/powerpc/kvm/emulate.c b/arch/powerpc/kvm/emulate.c index b0855e5d890..9d9cddc5b34 100644 --- a/arch/powerpc/kvm/emulate.c +++ b/arch/powerpc/kvm/emulate.c @@ -39,6 +39,7 @@  #define OP_31_XOP_TRAP      4  #define OP_31_XOP_LWZX      23  #define OP_31_XOP_TRAP_64   68 +#define OP_31_XOP_DCBF      86  #define OP_31_XOP_LBZX      87  #define OP_31_XOP_STWX      151  #define OP_31_XOP_STBX      215 @@ -374,6 +375,7 @@ int kvmppc_emulate_instruction(struct kvm_run *run, struct kvm_vcpu *vcpu)  			emulated = kvmppc_emulate_mtspr(vcpu, sprn, rs);  			break; +		case OP_31_XOP_DCBF:  		case OP_31_XOP_DCBI:  			/* Do nothing. The guest is performing dcbi because  			 * hardware DMA is not snooped by the dcache, but diff --git a/arch/powerpc/mm/hash_low_64.S b/arch/powerpc/mm/hash_low_64.S index 56585086413..7443481a315 100644 --- a/arch/powerpc/mm/hash_low_64.S +++ b/arch/powerpc/mm/hash_low_64.S @@ -115,11 +115,13 @@ END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEGMENT)  	sldi	r29,r5,SID_SHIFT - VPN_SHIFT  	rldicl  r28,r3,64 - VPN_SHIFT,64 - (SID_SHIFT - VPN_SHIFT)  	or	r29,r28,r29 - -	/* Calculate hash value for primary slot and store it in r28 */ -	rldicl	r5,r5,0,25		/* vsid & 0x0000007fffffffff */ -	rldicl	r0,r3,64-12,48		/* (ea >> 12) & 0xffff */ -	xor	r28,r5,r0 +	/* +	 * Calculate hash value for primary slot and store it in r28 +	 * r3 = va, r5 = vsid +	 * r0 = (va >> 12) & ((1ul << (28 - 12)) -1) +	 */ +	rldicl	r0,r3,64-12,48 +	xor	r28,r5,r0		/* hash */  	b	4f  3:	/* Calc vpn and put it in r29 */ @@ -130,11 +132,12 @@ END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEGMENT)  	/*  	 * calculate hash value for primary slot and  	 * store it in r28 for 1T segment +	 * r3 = va, r5 = vsid  	 */ -	rldic	r28,r5,25,25		/* (vsid << 25) & 0x7fffffffff */ -	clrldi	r5,r5,40		/* vsid & 0xffffff */ -	rldicl	r0,r3,64-12,36		/* (ea >> 12) & 0xfffffff */ -	xor	r28,r28,r5 +	sldi	r28,r5,25		/* vsid << 25 */ +	/* r0 =  (va >> 12) & ((1ul << (40 - 12)) -1) */ +	rldicl	r0,r3,64-12,36 +	xor	r28,r28,r5		/* vsid ^ ( vsid << 25) */  	xor	r28,r28,r0		/* hash */  	/* Convert linux PTE bits into HW equivalents */ @@ -407,11 +410,13 @@ END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEGMENT)  	 */  	rldicl  r28,r3,64 - VPN_SHIFT,64 - (SID_SHIFT - VPN_SHIFT)  	or	r29,r28,r29 - -	/* Calculate hash value for primary slot and store it in r28 */ -	rldicl	r5,r5,0,25		/* vsid & 0x0000007fffffffff */ -	rldicl	r0,r3,64-12,48		/* (ea >> 12) & 0xffff */ -	xor	r28,r5,r0 +	/* +	 * Calculate hash value for primary slot and store it in r28 +	 * r3 = va, r5 = vsid +	 * r0 = (va >> 12) & ((1ul << (28 - 12)) -1) +	 */ +	rldicl	r0,r3,64-12,48 +	xor	r28,r5,r0		/* hash */  	b	4f  3:	/* Calc vpn and put it in r29 */ @@ -426,11 +431,12 @@ END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEGMENT)  	/*  	 * Calculate hash value for primary slot and  	 * store it in r28  for 1T segment +	 * r3 = va, r5 = vsid  	 */ -	rldic	r28,r5,25,25		/* (vsid << 25) & 0x7fffffffff */ -	clrldi	r5,r5,40		/* vsid & 0xffffff */ -	rldicl	r0,r3,64-12,36		/* (ea >> 12) & 0xfffffff */ -	xor	r28,r28,r5 +	sldi	r28,r5,25		/* vsid << 25 */ +	/* r0 = (va >> 12) & ((1ul << (40 - 12)) -1) */ +	rldicl	r0,r3,64-12,36 +	xor	r28,r28,r5		/* vsid ^ ( vsid << 25) */  	xor	r28,r28,r0		/* hash */  	/* Convert linux PTE bits into HW equivalents */ @@ -752,25 +758,27 @@ END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEGMENT)  	rldicl  r28,r3,64 - VPN_SHIFT,64 - (SID_SHIFT - VPN_SHIFT)  	or	r29,r28,r29 -	/* Calculate hash value for primary slot and store it in r28 */ -	rldicl	r5,r5,0,25		/* vsid & 0x0000007fffffffff */ -	rldicl	r0,r3,64-16,52		/* (ea >> 16) & 0xfff */ -	xor	r28,r5,r0 +	/* Calculate hash value for primary slot and store it in r28 +	 * r3 = va, r5 = vsid +	 * r0 = (va >> 16) & ((1ul << (28 - 16)) -1) +	 */ +	rldicl	r0,r3,64-16,52 +	xor	r28,r5,r0		/* hash */  	b	4f  3:	/* Calc vpn and put it in r29 */  	sldi	r29,r5,SID_SHIFT_1T - VPN_SHIFT  	rldicl  r28,r3,64 - VPN_SHIFT,64 - (SID_SHIFT_1T - VPN_SHIFT)  	or	r29,r28,r29 -  	/*  	 * calculate hash value for primary slot and  	 * store it in r28 for 1T segment +	 * r3 = va, r5 = vsid  	 */ -	rldic	r28,r5,25,25		/* (vsid << 25) & 0x7fffffffff */ -	clrldi	r5,r5,40		/* vsid & 0xffffff */ -	rldicl	r0,r3,64-16,40		/* (ea >> 16) & 0xffffff */ -	xor	r28,r28,r5 +	sldi	r28,r5,25		/* vsid << 25 */ +	/* r0 = (va >> 16) & ((1ul << (40 - 16)) -1) */ +	rldicl	r0,r3,64-16,40 +	xor	r28,r28,r5		/* vsid ^ ( vsid << 25) */  	xor	r28,r28,r0		/* hash */  	/* Convert linux PTE bits into HW equivalents */ diff --git a/arch/powerpc/mm/tlb_hash64.c b/arch/powerpc/mm/tlb_hash64.c index ae758b3ff72..0d82ef50dc3 100644 --- a/arch/powerpc/mm/tlb_hash64.c +++ b/arch/powerpc/mm/tlb_hash64.c @@ -186,8 +186,6 @@ void tlb_flush(struct mmu_gather *tlb)   * Because of that usage pattern, it's only available with CONFIG_HOTPLUG   * and is implemented for small size rather than speed.   */ -#ifdef CONFIG_HOTPLUG -  void __flush_hash_table_range(struct mm_struct *mm, unsigned long start,  			      unsigned long end)  { @@ -221,5 +219,3 @@ void __flush_hash_table_range(struct mm_struct *mm, unsigned long start,  	arch_leave_lazy_mmu_mode();  	local_irq_restore(flags);  } - -#endif /* CONFIG_HOTPLUG */ diff --git a/arch/powerpc/oprofile/op_model_power4.c b/arch/powerpc/oprofile/op_model_power4.c index 315f9495e9b..f444b94935f 100644 --- a/arch/powerpc/oprofile/op_model_power4.c +++ b/arch/powerpc/oprofile/op_model_power4.c @@ -52,7 +52,7 @@ static int power7_marked_instr_event(u64 mmcr1)  	for (pmc = 0; pmc < 4; pmc++) {  		psel = mmcr1 & (OPROFILE_PM_PMCSEL_MSK  				<< (OPROFILE_MAX_PMC_NUM - pmc) -				* OPROFILE_MAX_PMC_NUM); +				* OPROFILE_PMSEL_FIELD_WIDTH);  		psel = (psel >> ((OPROFILE_MAX_PMC_NUM - pmc)  				 * OPROFILE_PMSEL_FIELD_WIDTH)) & ~1ULL;  		unit = mmcr1 & (OPROFILE_PM_UNIT_MSK diff --git a/arch/powerpc/perf/core-book3s.c b/arch/powerpc/perf/core-book3s.c index aa2465e21f1..fa476d50791 100644 --- a/arch/powerpc/perf/core-book3s.c +++ b/arch/powerpc/perf/core-book3s.c @@ -1305,6 +1305,16 @@ static int power_pmu_event_idx(struct perf_event *event)  	return event->hw.idx;  } +ssize_t power_events_sysfs_show(struct device *dev, +				struct device_attribute *attr, char *page) +{ +	struct perf_pmu_events_attr *pmu_attr; + +	pmu_attr = container_of(attr, struct perf_pmu_events_attr, attr); + +	return sprintf(page, "event=0x%02llx\n", pmu_attr->id); +} +  struct pmu power_pmu = {  	.pmu_enable	= power_pmu_enable,  	.pmu_disable	= power_pmu_disable, @@ -1537,6 +1547,8 @@ int __cpuinit register_power_pmu(struct power_pmu *pmu)  	pr_info("%s performance monitor hardware support registered\n",  		pmu->name); +	power_pmu.attr_groups = ppmu->attr_groups; +  #ifdef MSR_HV  	/*  	 * Use FCHV to ignore kernel events if MSR.HV is set. diff --git a/arch/powerpc/perf/power7-pmu.c b/arch/powerpc/perf/power7-pmu.c index 2ee01e38d5e..b554879bd31 100644 --- a/arch/powerpc/perf/power7-pmu.c +++ b/arch/powerpc/perf/power7-pmu.c @@ -51,6 +51,18 @@  #define MMCR1_PMCSEL_MSK	0xff  /* + * Power7 event codes. + */ +#define	PME_PM_CYC			0x1e +#define	PME_PM_GCT_NOSLOT_CYC		0x100f8 +#define	PME_PM_CMPLU_STALL		0x4000a +#define	PME_PM_INST_CMPL		0x2 +#define	PME_PM_LD_REF_L1		0xc880 +#define	PME_PM_LD_MISS_L1		0x400f0 +#define	PME_PM_BRU_FIN			0x10068 +#define	PME_PM_BRU_MPRED		0x400f6 + +/*   * Layout of constraint bits:   * 6666555555555544444444443333333333222222222211111111110000000000   * 3210987654321098765432109876543210987654321098765432109876543210 @@ -307,14 +319,14 @@ static void power7_disable_pmc(unsigned int pmc, unsigned long mmcr[])  }  static int power7_generic_events[] = { -	[PERF_COUNT_HW_CPU_CYCLES] = 0x1e, -	[PERF_COUNT_HW_STALLED_CYCLES_FRONTEND] = 0x100f8, /* GCT_NOSLOT_CYC */ -	[PERF_COUNT_HW_STALLED_CYCLES_BACKEND] = 0x4000a,  /* CMPLU_STALL */ -	[PERF_COUNT_HW_INSTRUCTIONS] = 2, -	[PERF_COUNT_HW_CACHE_REFERENCES] = 0xc880,	/* LD_REF_L1_LSU*/ -	[PERF_COUNT_HW_CACHE_MISSES] = 0x400f0,		/* LD_MISS_L1	*/ -	[PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = 0x10068,	/* BRU_FIN	*/ -	[PERF_COUNT_HW_BRANCH_MISSES] = 0x400f6,	/* BR_MPRED	*/ +	[PERF_COUNT_HW_CPU_CYCLES] =			PME_PM_CYC, +	[PERF_COUNT_HW_STALLED_CYCLES_FRONTEND] =	PME_PM_GCT_NOSLOT_CYC, +	[PERF_COUNT_HW_STALLED_CYCLES_BACKEND] =	PME_PM_CMPLU_STALL, +	[PERF_COUNT_HW_INSTRUCTIONS] =			PME_PM_INST_CMPL, +	[PERF_COUNT_HW_CACHE_REFERENCES] =		PME_PM_LD_REF_L1, +	[PERF_COUNT_HW_CACHE_MISSES] =			PME_PM_LD_MISS_L1, +	[PERF_COUNT_HW_BRANCH_INSTRUCTIONS] =		PME_PM_BRU_FIN, +	[PERF_COUNT_HW_BRANCH_MISSES] =			PME_PM_BRU_MPRED,  };  #define C(x)	PERF_COUNT_HW_CACHE_##x @@ -362,6 +374,57 @@ static int power7_cache_events[C(MAX)][C(OP_MAX)][C(RESULT_MAX)] = {  	},  }; + +GENERIC_EVENT_ATTR(cpu-cycles,			CYC); +GENERIC_EVENT_ATTR(stalled-cycles-frontend,	GCT_NOSLOT_CYC); +GENERIC_EVENT_ATTR(stalled-cycles-backend,	CMPLU_STALL); +GENERIC_EVENT_ATTR(instructions,		INST_CMPL); +GENERIC_EVENT_ATTR(cache-references,		LD_REF_L1); +GENERIC_EVENT_ATTR(cache-misses,		LD_MISS_L1); +GENERIC_EVENT_ATTR(branch-instructions,		BRU_FIN); +GENERIC_EVENT_ATTR(branch-misses,		BRU_MPRED); + +POWER_EVENT_ATTR(CYC,				CYC); +POWER_EVENT_ATTR(GCT_NOSLOT_CYC,		GCT_NOSLOT_CYC); +POWER_EVENT_ATTR(CMPLU_STALL,			CMPLU_STALL); +POWER_EVENT_ATTR(INST_CMPL,			INST_CMPL); +POWER_EVENT_ATTR(LD_REF_L1,			LD_REF_L1); +POWER_EVENT_ATTR(LD_MISS_L1,			LD_MISS_L1); +POWER_EVENT_ATTR(BRU_FIN,			BRU_FIN) +POWER_EVENT_ATTR(BRU_MPRED,			BRU_MPRED); + +static struct attribute *power7_events_attr[] = { +	GENERIC_EVENT_PTR(CYC), +	GENERIC_EVENT_PTR(GCT_NOSLOT_CYC), +	GENERIC_EVENT_PTR(CMPLU_STALL), +	GENERIC_EVENT_PTR(INST_CMPL), +	GENERIC_EVENT_PTR(LD_REF_L1), +	GENERIC_EVENT_PTR(LD_MISS_L1), +	GENERIC_EVENT_PTR(BRU_FIN), +	GENERIC_EVENT_PTR(BRU_MPRED), + +	POWER_EVENT_PTR(CYC), +	POWER_EVENT_PTR(GCT_NOSLOT_CYC), +	POWER_EVENT_PTR(CMPLU_STALL), +	POWER_EVENT_PTR(INST_CMPL), +	POWER_EVENT_PTR(LD_REF_L1), +	POWER_EVENT_PTR(LD_MISS_L1), +	POWER_EVENT_PTR(BRU_FIN), +	POWER_EVENT_PTR(BRU_MPRED), +	NULL +}; + + +static struct attribute_group power7_pmu_events_group = { +	.name = "events", +	.attrs = power7_events_attr, +}; + +static const struct attribute_group *power7_pmu_attr_groups[] = { +	&power7_pmu_events_group, +	NULL, +}; +  static struct power_pmu power7_pmu = {  	.name			= "POWER7",  	.n_counter		= 6, @@ -373,6 +436,7 @@ static struct power_pmu power7_pmu = {  	.get_alternatives	= power7_get_alternatives,  	.disable_pmc		= power7_disable_pmc,  	.flags			= PPMU_ALT_SIPR, +	.attr_groups		= power7_pmu_attr_groups,  	.n_generic		= ARRAY_SIZE(power7_generic_events),  	.generic_events		= power7_generic_events,  	.cache_events		= &power7_cache_events, diff --git a/arch/powerpc/platforms/40x/ppc40x_simple.c b/arch/powerpc/platforms/40x/ppc40x_simple.c index 969dddcf332..8f3920e5a04 100644 --- a/arch/powerpc/platforms/40x/ppc40x_simple.c +++ b/arch/powerpc/platforms/40x/ppc40x_simple.c @@ -57,7 +57,8 @@ static const char * const board[] __initconst = {  	"amcc,makalu",  	"apm,klondike",  	"est,hotfoot", -	"plathome,obs600" +	"plathome,obs600", +	NULL  };  static int __init ppc40x_probe(void) diff --git a/arch/powerpc/platforms/44x/currituck.c b/arch/powerpc/platforms/44x/currituck.c index 6bd89a0e0de..ecd3890c40d 100644 --- a/arch/powerpc/platforms/44x/currituck.c +++ b/arch/powerpc/platforms/44x/currituck.c @@ -46,7 +46,7 @@ static __initdata struct of_device_id ppc47x_of_bus[] = {  /* The EEPROM is missing and the default values are bogus.  This forces USB in   * to EHCI mode */ -static void __devinit quirk_ppc_currituck_usb_fixup(struct pci_dev *dev) +static void quirk_ppc_currituck_usb_fixup(struct pci_dev *dev)  {  	if (of_machine_is_compatible("ibm,currituck")) {  		pci_write_config_dword(dev, 0xe0, 0x0114231f); diff --git a/arch/powerpc/platforms/44x/virtex_ml510.c b/arch/powerpc/platforms/44x/virtex_ml510.c index ba4a6e388a4..1fdb8748638 100644 --- a/arch/powerpc/platforms/44x/virtex_ml510.c +++ b/arch/powerpc/platforms/44x/virtex_ml510.c @@ -5,7 +5,7 @@  /**   * ml510_ail_quirk   */ -static void __devinit ml510_ali_quirk(struct pci_dev *dev) +static void ml510_ali_quirk(struct pci_dev *dev)  {  	/* Enable the IDE controller */  	pci_write_config_byte(dev, 0x58, 0x4c); diff --git a/arch/powerpc/platforms/52xx/mpc52xx_gpt.c b/arch/powerpc/platforms/52xx/mpc52xx_gpt.c index a51cb07bd66..692998244d2 100644 --- a/arch/powerpc/platforms/52xx/mpc52xx_gpt.c +++ b/arch/powerpc/platforms/52xx/mpc52xx_gpt.c @@ -669,7 +669,7 @@ static struct miscdevice mpc52xx_wdt_miscdev = {  	.fops		= &mpc52xx_wdt_fops,  }; -static int __devinit mpc52xx_gpt_wdt_init(void) +static int mpc52xx_gpt_wdt_init(void)  {  	int err; @@ -704,7 +704,7 @@ static int mpc52xx_gpt_wdt_setup(struct mpc52xx_gpt_priv *gpt,  #else -static int __devinit mpc52xx_gpt_wdt_init(void) +static int mpc52xx_gpt_wdt_init(void)  {  	return 0;  } @@ -720,7 +720,7 @@ static inline int mpc52xx_gpt_wdt_setup(struct mpc52xx_gpt_priv *gpt,  /* ---------------------------------------------------------------------   * of_platform bus binding code   */ -static int __devinit mpc52xx_gpt_probe(struct platform_device *ofdev) +static int mpc52xx_gpt_probe(struct platform_device *ofdev)  {  	struct mpc52xx_gpt_priv *gpt; diff --git a/arch/powerpc/platforms/52xx/mpc52xx_lpbfifo.c b/arch/powerpc/platforms/52xx/mpc52xx_lpbfifo.c index 16150fa430f..f9f4537f546 100644 --- a/arch/powerpc/platforms/52xx/mpc52xx_lpbfifo.c +++ b/arch/powerpc/platforms/52xx/mpc52xx_lpbfifo.c @@ -470,7 +470,7 @@ void mpc52xx_lpbfifo_abort(struct mpc52xx_lpbfifo_request *req)  }  EXPORT_SYMBOL(mpc52xx_lpbfifo_abort); -static int __devinit mpc52xx_lpbfifo_probe(struct platform_device *op) +static int mpc52xx_lpbfifo_probe(struct platform_device *op)  {  	struct resource res;  	int rc = -ENOMEM; @@ -540,7 +540,7 @@ static int __devinit mpc52xx_lpbfifo_probe(struct platform_device *op)  } -static int __devexit mpc52xx_lpbfifo_remove(struct platform_device *op) +static int mpc52xx_lpbfifo_remove(struct platform_device *op)  {  	if (lpbfifo.dev != &op->dev)  		return 0; @@ -564,7 +564,7 @@ static int __devexit mpc52xx_lpbfifo_remove(struct platform_device *op)  	return 0;  } -static struct of_device_id mpc52xx_lpbfifo_match[] __devinitconst = { +static struct of_device_id mpc52xx_lpbfifo_match[] = {  	{ .compatible = "fsl,mpc5200-lpbfifo", },  	{},  }; @@ -576,6 +576,6 @@ static struct platform_driver mpc52xx_lpbfifo_driver = {  		.of_match_table = mpc52xx_lpbfifo_match,  	},  	.probe = mpc52xx_lpbfifo_probe, -	.remove = __devexit_p(mpc52xx_lpbfifo_remove), +	.remove = mpc52xx_lpbfifo_remove,  };  module_platform_driver(mpc52xx_lpbfifo_driver); diff --git a/arch/powerpc/platforms/82xx/ep8248e.c b/arch/powerpc/platforms/82xx/ep8248e.c index 10ff526cd04..79799b29ffe 100644 --- a/arch/powerpc/platforms/82xx/ep8248e.c +++ b/arch/powerpc/platforms/82xx/ep8248e.c @@ -111,7 +111,7 @@ static struct mdiobb_ctrl ep8248e_mdio_ctrl = {  	.ops = &ep8248e_mdio_ops,  }; -static int __devinit ep8248e_mdio_probe(struct platform_device *ofdev) +static int ep8248e_mdio_probe(struct platform_device *ofdev)  {  	struct mii_bus *bus;  	struct resource res; diff --git a/arch/powerpc/platforms/83xx/mcu_mpc8349emitx.c b/arch/powerpc/platforms/83xx/mcu_mpc8349emitx.c index ef6537b8ed3..624cb51d19c 100644 --- a/arch/powerpc/platforms/83xx/mcu_mpc8349emitx.c +++ b/arch/powerpc/platforms/83xx/mcu_mpc8349emitx.c @@ -145,8 +145,7 @@ static int mcu_gpiochip_remove(struct mcu *mcu)  	return gpiochip_remove(&mcu->gc);  } -static int __devinit mcu_probe(struct i2c_client *client, -			       const struct i2c_device_id *id) +static int mcu_probe(struct i2c_client *client, const struct i2c_device_id *id)  {  	struct mcu *mcu;  	int ret; @@ -188,7 +187,7 @@ err:  	return ret;  } -static int __devexit mcu_remove(struct i2c_client *client) +static int mcu_remove(struct i2c_client *client)  {  	struct mcu *mcu = i2c_get_clientdata(client);  	int ret; @@ -216,7 +215,7 @@ static const struct i2c_device_id mcu_ids[] = {  };  MODULE_DEVICE_TABLE(i2c, mcu_ids); -static struct of_device_id mcu_of_match_table[] __devinitdata = { +static struct of_device_id mcu_of_match_table[] = {  	{ .compatible = "fsl,mcu-mpc8349emitx", },  	{ },  }; @@ -228,7 +227,7 @@ static struct i2c_driver mcu_driver = {  		.of_match_table = mcu_of_match_table,  	},  	.probe = mcu_probe, -	.remove	= __devexit_p(mcu_remove), +	.remove	= mcu_remove,  	.id_table = mcu_ids,  }; diff --git a/arch/powerpc/platforms/85xx/corenet_ds.c b/arch/powerpc/platforms/85xx/corenet_ds.c index ed69c925071..6f355d8c92f 100644 --- a/arch/powerpc/platforms/85xx/corenet_ds.c +++ b/arch/powerpc/platforms/85xx/corenet_ds.c @@ -64,7 +64,7 @@ void __init corenet_ds_setup_arch(void)  	pr_info("%s board from Freescale Semiconductor\n", ppc_md.name);  } -static const struct of_device_id of_device_ids[] __devinitconst = { +static const struct of_device_id of_device_ids[] = {  	{  		.compatible	= "simple-bus"  	}, diff --git a/arch/powerpc/platforms/85xx/mpc85xx_cds.c b/arch/powerpc/platforms/85xx/mpc85xx_cds.c index c474505ad0d..7a31a0e1df2 100644 --- a/arch/powerpc/platforms/85xx/mpc85xx_cds.c +++ b/arch/powerpc/platforms/85xx/mpc85xx_cds.c @@ -154,7 +154,7 @@ static void __init mpc85xx_cds_pci_irq_fixup(struct pci_dev *dev)  	}  } -static void __devinit skip_fake_bridge(struct pci_dev *dev) +static void skip_fake_bridge(struct pci_dev *dev)  {  	/* Make it an error to skip the fake bridge  	 * in pci_setup_device() in probe.c */ diff --git a/arch/powerpc/platforms/85xx/tqm85xx.c b/arch/powerpc/platforms/85xx/tqm85xx.c index b4e58cdc09a..ec0b7272fae 100644 --- a/arch/powerpc/platforms/85xx/tqm85xx.c +++ b/arch/powerpc/platforms/85xx/tqm85xx.c @@ -85,7 +85,7 @@ static void tqm85xx_show_cpuinfo(struct seq_file *m)  	seq_printf(m, "PLL setting\t: 0x%x\n", ((phid1 >> 24) & 0x3f));  } -static void __devinit tqm85xx_ti1520_fixup(struct pci_dev *pdev) +static void tqm85xx_ti1520_fixup(struct pci_dev *pdev)  {  	unsigned int val; diff --git a/arch/powerpc/platforms/86xx/gef_ppc9a.c b/arch/powerpc/platforms/86xx/gef_ppc9a.c index bf5338754c5..c23f3443880 100644 --- a/arch/powerpc/platforms/86xx/gef_ppc9a.c +++ b/arch/powerpc/platforms/86xx/gef_ppc9a.c @@ -159,7 +159,7 @@ static void gef_ppc9a_show_cpuinfo(struct seq_file *m)  		gef_ppc9a_get_vme_is_syscon() ? "yes" : "no");  } -static void __devinit gef_ppc9a_nec_fixup(struct pci_dev *pdev) +static void gef_ppc9a_nec_fixup(struct pci_dev *pdev)  {  	unsigned int val; diff --git a/arch/powerpc/platforms/86xx/gef_sbc310.c b/arch/powerpc/platforms/86xx/gef_sbc310.c index 0b7851330a0..8a6ac20686e 100644 --- a/arch/powerpc/platforms/86xx/gef_sbc310.c +++ b/arch/powerpc/platforms/86xx/gef_sbc310.c @@ -146,7 +146,7 @@ static void gef_sbc310_show_cpuinfo(struct seq_file *m)  } -static void __devinit gef_sbc310_nec_fixup(struct pci_dev *pdev) +static void gef_sbc310_nec_fixup(struct pci_dev *pdev)  {  	unsigned int val; diff --git a/arch/powerpc/platforms/86xx/gef_sbc610.c b/arch/powerpc/platforms/86xx/gef_sbc610.c index b9eb174897b..06c72636f29 100644 --- a/arch/powerpc/platforms/86xx/gef_sbc610.c +++ b/arch/powerpc/platforms/86xx/gef_sbc610.c @@ -136,7 +136,7 @@ static void gef_sbc610_show_cpuinfo(struct seq_file *m)  	seq_printf(m, "SVR\t\t: 0x%x\n", svid);  } -static void __devinit gef_sbc610_nec_fixup(struct pci_dev *pdev) +static void gef_sbc610_nec_fixup(struct pci_dev *pdev)  {  	unsigned int val; diff --git a/arch/powerpc/platforms/cell/setup.c b/arch/powerpc/platforms/cell/setup.c index 4ab08767118..6ae25fb6201 100644 --- a/arch/powerpc/platforms/cell/setup.c +++ b/arch/powerpc/platforms/cell/setup.c @@ -117,7 +117,7 @@ static void cell_fixup_pcie_rootcomplex(struct pci_dev *dev)  }  DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, cell_fixup_pcie_rootcomplex); -static int __devinit cell_setup_phb(struct pci_controller *phb) +static int cell_setup_phb(struct pci_controller *phb)  {  	const char *model;  	struct device_node *np; diff --git a/arch/powerpc/platforms/cell/smp.c b/arch/powerpc/platforms/cell/smp.c index 49a65e2dfc7..d35dbbc8ec7 100644 --- a/arch/powerpc/platforms/cell/smp.c +++ b/arch/powerpc/platforms/cell/smp.c @@ -67,7 +67,7 @@ static cpumask_t of_spin_map;   *	0	- failure   *	1	- success   */ -static inline int __devinit smp_startup_cpu(unsigned int lcpu) +static inline int smp_startup_cpu(unsigned int lcpu)  {  	int status;  	unsigned long start_here = __pa((u32)*((unsigned long *) @@ -108,7 +108,7 @@ static int __init smp_iic_probe(void)  	return cpumask_weight(cpu_possible_mask);  } -static void __devinit smp_cell_setup_cpu(int cpu) +static void smp_cell_setup_cpu(int cpu)  {  	if (cpu != boot_cpuid)  		iic_setup_cpu(); @@ -119,7 +119,7 @@ static void __devinit smp_cell_setup_cpu(int cpu)  	mtspr(SPRN_DABRX, DABRX_KERNEL | DABRX_USER);  } -static int __devinit smp_cell_kick_cpu(int nr) +static int smp_cell_kick_cpu(int nr)  {  	BUG_ON(nr < 0 || nr >= NR_CPUS); diff --git a/arch/powerpc/platforms/cell/spufs/sched.c b/arch/powerpc/platforms/cell/spufs/sched.c index 25db92a8e1c..49318385d4f 100644 --- a/arch/powerpc/platforms/cell/spufs/sched.c +++ b/arch/powerpc/platforms/cell/spufs/sched.c @@ -24,6 +24,7 @@  #include <linux/errno.h>  #include <linux/sched.h> +#include <linux/sched/rt.h>  #include <linux/kernel.h>  #include <linux/mm.h>  #include <linux/slab.h> diff --git a/arch/powerpc/platforms/chrp/pci.c b/arch/powerpc/platforms/chrp/pci.c index 83285c5a204..1b87e198faa 100644 --- a/arch/powerpc/platforms/chrp/pci.c +++ b/arch/powerpc/platforms/chrp/pci.c @@ -323,7 +323,7 @@ chrp_find_bridges(void)   * ATA controller to be set to fully native mode or bad things   * will happen.   */ -static void __devinit chrp_pci_fixup_winbond_ata(struct pci_dev *sl82c105) +static void chrp_pci_fixup_winbond_ata(struct pci_dev *sl82c105)  {  	u8 progif; diff --git a/arch/powerpc/platforms/chrp/smp.c b/arch/powerpc/platforms/chrp/smp.c index feab30bbae2..dead91b177b 100644 --- a/arch/powerpc/platforms/chrp/smp.c +++ b/arch/powerpc/platforms/chrp/smp.c @@ -30,7 +30,7 @@  #include <asm/mpic.h>  #include <asm/rtas.h> -static int __devinit smp_chrp_kick_cpu(int nr) +static int smp_chrp_kick_cpu(int nr)  {  	*(unsigned long *)KERNELBASE = nr;  	asm volatile("dcbf 0,%0"::"r"(KERNELBASE):"memory"); @@ -38,7 +38,7 @@ static int __devinit smp_chrp_kick_cpu(int nr)  	return 0;  } -static void __devinit smp_chrp_setup_cpu(int cpu_nr) +static void smp_chrp_setup_cpu(int cpu_nr)  {  	mpic_setup_this_cpu();  } diff --git a/arch/powerpc/platforms/fsl_uli1575.c b/arch/powerpc/platforms/fsl_uli1575.c index 64fde058e54..92ac9b52b32 100644 --- a/arch/powerpc/platforms/fsl_uli1575.c +++ b/arch/powerpc/platforms/fsl_uli1575.c @@ -59,7 +59,7 @@ static inline bool is_quirk_valid(void)  }  /* Bridge */ -static void __devinit early_uli5249(struct pci_dev *dev) +static void early_uli5249(struct pci_dev *dev)  {  	unsigned char temp; @@ -82,7 +82,7 @@ static void __devinit early_uli5249(struct pci_dev *dev)  } -static void __devinit quirk_uli1575(struct pci_dev *dev) +static void quirk_uli1575(struct pci_dev *dev)  {  	int i; @@ -139,7 +139,7 @@ static void __devinit quirk_uli1575(struct pci_dev *dev)  	pci_write_config_byte(dev, 0x75, ULI_8259_IRQ15);  } -static void __devinit quirk_final_uli1575(struct pci_dev *dev) +static void quirk_final_uli1575(struct pci_dev *dev)  {  	/* Set i8259 interrupt trigger  	 * IRQ 3:  Level @@ -175,7 +175,7 @@ static void __devinit quirk_final_uli1575(struct pci_dev *dev)  }  /* SATA */ -static void __devinit quirk_uli5288(struct pci_dev *dev) +static void quirk_uli5288(struct pci_dev *dev)  {  	unsigned char c;  	unsigned int d; @@ -200,7 +200,7 @@ static void __devinit quirk_uli5288(struct pci_dev *dev)  }  /* PATA */ -static void __devinit quirk_uli5229(struct pci_dev *dev) +static void quirk_uli5229(struct pci_dev *dev)  {  	unsigned short temp; @@ -216,7 +216,7 @@ static void __devinit quirk_uli5229(struct pci_dev *dev)  }  /* We have to do a dummy read on the P2P for the RTC to work, WTF */ -static void __devinit quirk_final_uli5249(struct pci_dev *dev) +static void quirk_final_uli5249(struct pci_dev *dev)  {  	int i;  	u8 *dummy; @@ -253,7 +253,7 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AL, 0x5249, quirk_final_uli5249);  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AL, 0x1575, quirk_final_uli1575);  DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_AL, 0x5229, quirk_uli5229); -static void __devinit hpcd_quirk_uli1575(struct pci_dev *dev) +static void hpcd_quirk_uli1575(struct pci_dev *dev)  {  	u32 temp32; @@ -269,7 +269,7 @@ static void __devinit hpcd_quirk_uli1575(struct pci_dev *dev)  	pci_write_config_dword(dev, 0x90, (temp32 | 1<<22));  } -static void __devinit hpcd_quirk_uli5288(struct pci_dev *dev) +static void hpcd_quirk_uli5288(struct pci_dev *dev)  {  	unsigned char c; @@ -295,7 +295,7 @@ static void __devinit hpcd_quirk_uli5288(struct pci_dev *dev)   * IRQ14 is a sideband interrupt from IDE device to CPU and we use this   * as the interrupt for IDE device.   */ -static void __devinit hpcd_quirk_uli5229(struct pci_dev *dev) +static void hpcd_quirk_uli5229(struct pci_dev *dev)  {  	unsigned char c; @@ -317,7 +317,7 @@ static void __devinit hpcd_quirk_uli5229(struct pci_dev *dev)   * bug by re-assigning a correct irq to 5288.   *   */ -static void __devinit hpcd_final_uli5288(struct pci_dev *dev) +static void hpcd_final_uli5288(struct pci_dev *dev)  {  	struct pci_controller *hose = pci_bus_to_host(dev->bus);  	struct device_node *hosenode = hose ? hose->dn : NULL; diff --git a/arch/powerpc/platforms/maple/pci.c b/arch/powerpc/platforms/maple/pci.c index 465ee8f5c08..f7136aae8bb 100644 --- a/arch/powerpc/platforms/maple/pci.c +++ b/arch/powerpc/platforms/maple/pci.c @@ -543,7 +543,7 @@ static int __init maple_add_bridge(struct device_node *dev)  } -void __devinit maple_pci_irq_fixup(struct pci_dev *dev) +void maple_pci_irq_fixup(struct pci_dev *dev)  {  	DBG(" -> maple_pci_irq_fixup\n"); @@ -648,7 +648,7 @@ int maple_pci_get_legacy_ide_irq(struct pci_dev *pdev, int channel)  	return irq;  } -static void __devinit quirk_ipr_msi(struct pci_dev *dev) +static void quirk_ipr_msi(struct pci_dev *dev)  {  	/* Something prevents MSIs from the IPR from working on Bimini,  	 * and the driver has no smarts to recover. So disable MSI diff --git a/arch/powerpc/platforms/pasemi/cpufreq.c b/arch/powerpc/platforms/pasemi/cpufreq.c index 95d00173029..890f30e70f9 100644 --- a/arch/powerpc/platforms/pasemi/cpufreq.c +++ b/arch/powerpc/platforms/pasemi/cpufreq.c @@ -236,6 +236,13 @@ out:  static int pas_cpufreq_cpu_exit(struct cpufreq_policy *policy)  { +	/* +	 * We don't support CPU hotplug. Don't unmap after the system +	 * has already made it to a running state. +	 */ +	if (system_state != SYSTEM_BOOTING) +		return 0; +  	if (sdcasr_mapbase)  		iounmap(sdcasr_mapbase);  	if (sdcpwr_mapbase) diff --git a/arch/powerpc/platforms/pasemi/gpio_mdio.c b/arch/powerpc/platforms/pasemi/gpio_mdio.c index 9886296e08d..0237ab782fb 100644 --- a/arch/powerpc/platforms/pasemi/gpio_mdio.c +++ b/arch/powerpc/platforms/pasemi/gpio_mdio.c @@ -216,7 +216,7 @@ static int gpio_mdio_reset(struct mii_bus *bus)  } -static int __devinit gpio_mdio_probe(struct platform_device *ofdev) +static int gpio_mdio_probe(struct platform_device *ofdev)  {  	struct device *dev = &ofdev->dev;  	struct device_node *np = ofdev->dev.of_node; diff --git a/arch/powerpc/platforms/pasemi/pasemi.h b/arch/powerpc/platforms/pasemi/pasemi.h index b1e524f7489..ea65bf0eb89 100644 --- a/arch/powerpc/platforms/pasemi/pasemi.h +++ b/arch/powerpc/platforms/pasemi/pasemi.h @@ -3,8 +3,8 @@  extern unsigned long pas_get_boot_time(void);  extern void pas_pci_init(void); -extern void __devinit pas_pci_irq_fixup(struct pci_dev *dev); -extern void __devinit pas_pci_dma_dev_setup(struct pci_dev *dev); +extern void pas_pci_irq_fixup(struct pci_dev *dev); +extern void pas_pci_dma_dev_setup(struct pci_dev *dev);  extern void __iomem *pasemi_pci_getcfgaddr(struct pci_dev *dev, int offset); diff --git a/arch/powerpc/platforms/pasemi/setup.c b/arch/powerpc/platforms/pasemi/setup.c index 2ed9212d7d5..8c54de6d8ec 100644 --- a/arch/powerpc/platforms/pasemi/setup.c +++ b/arch/powerpc/platforms/pasemi/setup.c @@ -76,7 +76,7 @@ static void pas_restart(char *cmd)  static arch_spinlock_t timebase_lock;  static unsigned long timebase; -static void __devinit pas_give_timebase(void) +static void pas_give_timebase(void)  {  	unsigned long flags; @@ -94,7 +94,7 @@ static void __devinit pas_give_timebase(void)  	local_irq_restore(flags);  } -static void __devinit pas_take_timebase(void) +static void pas_take_timebase(void)  {  	while (!timebase)  		smp_rmb(); diff --git a/arch/powerpc/platforms/powermac/pci.c b/arch/powerpc/platforms/powermac/pci.c index 43bbe1bda93..2b8af75abc2 100644 --- a/arch/powerpc/platforms/powermac/pci.c +++ b/arch/powerpc/platforms/powermac/pci.c @@ -561,7 +561,7 @@ static struct pci_ops u4_pcie_pci_ops =  	.write = u4_pcie_write_config,  }; -static void __devinit pmac_pci_fixup_u4_of_node(struct pci_dev *dev) +static void pmac_pci_fixup_u4_of_node(struct pci_dev *dev)  {  	/* Apple's device-tree "hides" the root complex virtual P2P bridge  	 * on U4. However, Linux sees it, causing the PCI <-> OF matching @@ -988,7 +988,7 @@ static int __init pmac_add_bridge(struct device_node *dev)  	return 0;  } -void __devinit pmac_pci_irq_fixup(struct pci_dev *dev) +void pmac_pci_irq_fixup(struct pci_dev *dev)  {  #ifdef CONFIG_PPC32  	/* Fixup interrupt for the modem/ethernet combo controller. @@ -1138,7 +1138,7 @@ int pmac_pci_enable_device_hook(struct pci_dev *dev)  	return 0;  } -void __devinit pmac_pci_fixup_ohci(struct pci_dev *dev) +void pmac_pci_fixup_ohci(struct pci_dev *dev)  {  	struct device_node *node = pci_device_to_OF_node(dev); diff --git a/arch/powerpc/platforms/powermac/smp.c b/arch/powerpc/platforms/powermac/smp.c index b4ddaa3fbb2..bdb738a69e4 100644 --- a/arch/powerpc/platforms/powermac/smp.c +++ b/arch/powerpc/platforms/powermac/smp.c @@ -484,7 +484,7 @@ static void smp_core99_give_timebase(void)  } -static void __devinit smp_core99_take_timebase(void) +static void smp_core99_take_timebase(void)  {  	unsigned long flags; @@ -669,7 +669,7 @@ static void smp_core99_gpio_tb_freeze(int freeze)  volatile static long int core99_l2_cache;  volatile static long int core99_l3_cache; -static void __devinit core99_init_caches(int cpu) +static void core99_init_caches(int cpu)  {  #ifndef CONFIG_PPC64  	if (!cpu_has_feature(CPU_FTR_L2CR)) @@ -801,7 +801,7 @@ static int __init smp_core99_probe(void)  	return ncpus;  } -static int __devinit smp_core99_kick_cpu(int nr) +static int smp_core99_kick_cpu(int nr)  {  	unsigned int save_vector;  	unsigned long target, flags; @@ -844,7 +844,7 @@ static int __devinit smp_core99_kick_cpu(int nr)  	return 0;  } -static void __devinit smp_core99_setup_cpu(int cpu_nr) +static void smp_core99_setup_cpu(int cpu_nr)  {  	/* Setup L2/L3 */  	if (cpu_nr != 0) diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c index 53d052e95cf..8e90e8906df 100644 --- a/arch/powerpc/platforms/powernv/pci-ioda.c +++ b/arch/powerpc/platforms/powernv/pci-ioda.c @@ -76,7 +76,7 @@ static struct pci_dn *pnv_ioda_get_pdn(struct pci_dev *dev)  	return PCI_DN(np);  } -static int __devinit pnv_ioda_alloc_pe(struct pnv_phb *phb) +static int pnv_ioda_alloc_pe(struct pnv_phb *phb)  {  	unsigned long pe; @@ -91,7 +91,7 @@ static int __devinit pnv_ioda_alloc_pe(struct pnv_phb *phb)  	return pe;  } -static void __devinit pnv_ioda_free_pe(struct pnv_phb *phb, int pe) +static void pnv_ioda_free_pe(struct pnv_phb *phb, int pe)  {  	WARN_ON(phb->ioda.pe_array[pe].pdev); @@ -103,7 +103,7 @@ static void __devinit pnv_ioda_free_pe(struct pnv_phb *phb, int pe)   * but in the meantime, we need to protect them to avoid warnings   */  #ifdef CONFIG_PCI_MSI -static struct pnv_ioda_pe * __devinit pnv_ioda_get_pe(struct pci_dev *dev) +static struct pnv_ioda_pe *pnv_ioda_get_pe(struct pci_dev *dev)  {  	struct pci_controller *hose = pci_bus_to_host(dev->bus);  	struct pnv_phb *phb = hose->private_data; @@ -117,8 +117,7 @@ static struct pnv_ioda_pe * __devinit pnv_ioda_get_pe(struct pci_dev *dev)  }  #endif /* CONFIG_PCI_MSI */ -static int __devinit pnv_ioda_configure_pe(struct pnv_phb *phb, -					   struct pnv_ioda_pe *pe) +static int pnv_ioda_configure_pe(struct pnv_phb *phb, struct pnv_ioda_pe *pe)  {  	struct pci_dev *parent;  	uint8_t bcomp, dcomp, fcomp; @@ -207,8 +206,8 @@ static int __devinit pnv_ioda_configure_pe(struct pnv_phb *phb,  	return 0;  } -static void __devinit pnv_ioda_link_pe_by_weight(struct pnv_phb *phb, -						 struct pnv_ioda_pe *pe) +static void pnv_ioda_link_pe_by_weight(struct pnv_phb *phb, +				       struct pnv_ioda_pe *pe)  {  	struct pnv_ioda_pe *lpe; @@ -246,7 +245,7 @@ static unsigned int pnv_ioda_dma_weight(struct pci_dev *dev)  }  #if 0 -static struct pnv_ioda_pe * __devinit pnv_ioda_setup_dev_PE(struct pci_dev *dev) +static struct pnv_ioda_pe *pnv_ioda_setup_dev_PE(struct pci_dev *dev)  {  	struct pci_controller *hose = pci_bus_to_host(dev->bus);  	struct pnv_phb *phb = hose->private_data; @@ -343,7 +342,7 @@ static void pnv_ioda_setup_same_PE(struct pci_bus *bus, struct pnv_ioda_pe *pe)   * subordinate PCI devices and buses. The second type of PE is normally   * orgiriated by PCIe-to-PCI bridge or PLX switch downstream ports.   */ -static void __devinit pnv_ioda_setup_bus_PE(struct pci_bus *bus, int all) +static void pnv_ioda_setup_bus_PE(struct pci_bus *bus, int all)  {  	struct pci_controller *hose = pci_bus_to_host(bus);  	struct pnv_phb *phb = hose->private_data; @@ -399,7 +398,7 @@ static void __devinit pnv_ioda_setup_bus_PE(struct pci_bus *bus, int all)  	pnv_ioda_link_pe_by_weight(phb, pe);  } -static void __devinit pnv_ioda_setup_PEs(struct pci_bus *bus) +static void pnv_ioda_setup_PEs(struct pci_bus *bus)  {  	struct pci_dev *dev; @@ -423,7 +422,7 @@ static void __devinit pnv_ioda_setup_PEs(struct pci_bus *bus)   * port to PE# here. The game rule here is expected to be changed   * as soon as we can detected PLX bridge correctly.   */ -static void __devinit pnv_pci_ioda_setup_PEs(void) +static void pnv_pci_ioda_setup_PEs(void)  {  	struct pci_controller *hose, *tmp; @@ -432,14 +431,12 @@ static void __devinit pnv_pci_ioda_setup_PEs(void)  	}  } -static void __devinit pnv_pci_ioda_dma_dev_setup(struct pnv_phb *phb, -						 struct pci_dev *dev) +static void pnv_pci_ioda_dma_dev_setup(struct pnv_phb *phb, struct pci_dev *dev)  {  	/* We delay DMA setup after we have assigned all PE# */  } -static void __devinit pnv_ioda_setup_bus_dma(struct pnv_ioda_pe *pe, -					     struct pci_bus *bus) +static void pnv_ioda_setup_bus_dma(struct pnv_ioda_pe *pe, struct pci_bus *bus)  {  	struct pci_dev *dev; @@ -450,10 +447,9 @@ static void __devinit pnv_ioda_setup_bus_dma(struct pnv_ioda_pe *pe,  	}  } -static void __devinit pnv_pci_ioda_setup_dma_pe(struct pnv_phb *phb, -						struct pnv_ioda_pe *pe, -						unsigned int base, -						unsigned int segs) +static void pnv_pci_ioda_setup_dma_pe(struct pnv_phb *phb, +				      struct pnv_ioda_pe *pe, unsigned int base, +				      unsigned int segs)  {  	struct page *tce_mem = NULL; @@ -541,7 +537,7 @@ static void __devinit pnv_pci_ioda_setup_dma_pe(struct pnv_phb *phb,  		__free_pages(tce_mem, get_order(TCE32_TABLE_SIZE * segs));  } -static void __devinit pnv_ioda_setup_dma(struct pnv_phb *phb) +static void pnv_ioda_setup_dma(struct pnv_phb *phb)  {  	struct pci_controller *hose = phb->hose;  	unsigned int residual, remaining, segs, tw, base; @@ -684,8 +680,8 @@ static void pnv_pci_init_ioda_msis(struct pnv_phb *phb) { }   * to bottom style. So the the I/O or MMIO segment assigned to   * parent PE could be overrided by its child PEs if necessary.   */ -static void __devinit pnv_ioda_setup_pe_seg(struct pci_controller *hose, -				struct pnv_ioda_pe *pe) +static void pnv_ioda_setup_pe_seg(struct pci_controller *hose, +				  struct pnv_ioda_pe *pe)  {  	struct pnv_phb *phb = hose->private_data;  	struct pci_bus_region region; @@ -753,7 +749,7 @@ static void __devinit pnv_ioda_setup_pe_seg(struct pci_controller *hose,  	}  } -static void __devinit pnv_pci_ioda_setup_seg(void) +static void pnv_pci_ioda_setup_seg(void)  {  	struct pci_controller *tmp, *hose;  	struct pnv_phb *phb; @@ -767,7 +763,7 @@ static void __devinit pnv_pci_ioda_setup_seg(void)  	}  } -static void __devinit pnv_pci_ioda_setup_DMA(void) +static void pnv_pci_ioda_setup_DMA(void)  {  	struct pci_controller *hose, *tmp;  	struct pnv_phb *phb; @@ -781,7 +777,7 @@ static void __devinit pnv_pci_ioda_setup_DMA(void)  	}  } -static void __devinit pnv_pci_ioda_fixup(void) +static void pnv_pci_ioda_fixup(void)  {  	pnv_pci_ioda_setup_PEs();  	pnv_pci_ioda_setup_seg(); @@ -829,7 +825,7 @@ static resource_size_t pnv_pci_window_alignment(struct pci_bus *bus,  /* Prevent enabling devices for which we couldn't properly   * assign a PE   */ -static int __devinit pnv_pci_enable_device_hook(struct pci_dev *dev) +static int pnv_pci_enable_device_hook(struct pci_dev *dev)  {  	struct pci_controller *hose = pci_bus_to_host(dev->bus);  	struct pnv_phb *phb = hose->private_data; diff --git a/arch/powerpc/platforms/powernv/pci-p5ioc2.c b/arch/powerpc/platforms/powernv/pci-p5ioc2.c index 6b4bef4e9d8..7db8771a40f 100644 --- a/arch/powerpc/platforms/powernv/pci-p5ioc2.c +++ b/arch/powerpc/platforms/powernv/pci-p5ioc2.c @@ -84,8 +84,8 @@ static void pnv_pci_init_p5ioc2_msis(struct pnv_phb *phb)  static void pnv_pci_init_p5ioc2_msis(struct pnv_phb *phb) { }  #endif /* CONFIG_PCI_MSI */ -static void __devinit pnv_pci_p5ioc2_dma_dev_setup(struct pnv_phb *phb, -						   struct pci_dev *pdev) +static void pnv_pci_p5ioc2_dma_dev_setup(struct pnv_phb *phb, +					 struct pci_dev *pdev)  {  	if (phb->p5ioc2.iommu_table.it_map == NULL)  		iommu_init_table(&phb->p5ioc2.iommu_table, phb->hose->node); diff --git a/arch/powerpc/platforms/powernv/pci.c b/arch/powerpc/platforms/powernv/pci.c index c01688a1a74..b8b8e0bd989 100644 --- a/arch/powerpc/platforms/powernv/pci.c +++ b/arch/powerpc/platforms/powernv/pci.c @@ -464,8 +464,7 @@ void pnv_pci_setup_iommu_table(struct iommu_table *tbl,  	tbl->it_type = TCE_PCI;  } -static struct iommu_table * __devinit -pnv_pci_setup_bml_iommu(struct pci_controller *hose) +static struct iommu_table *pnv_pci_setup_bml_iommu(struct pci_controller *hose)  {  	struct iommu_table *tbl;  	const __be64 *basep, *swinvp; @@ -496,8 +495,8 @@ pnv_pci_setup_bml_iommu(struct pci_controller *hose)  	return tbl;  } -static void __devinit pnv_pci_dma_fallback_setup(struct pci_controller *hose, -						 struct pci_dev *pdev) +static void pnv_pci_dma_fallback_setup(struct pci_controller *hose, +				       struct pci_dev *pdev)  {  	struct device_node *np = pci_bus_to_OF_node(hose->bus);  	struct pci_dn *pdn; @@ -512,7 +511,7 @@ static void __devinit pnv_pci_dma_fallback_setup(struct pci_controller *hose,  	set_iommu_table_base(&pdev->dev, pdn->iommu_table);  } -static void __devinit pnv_pci_dma_dev_setup(struct pci_dev *pdev) +static void pnv_pci_dma_dev_setup(struct pci_dev *pdev)  {  	struct pci_controller *hose = pci_bus_to_host(pdev->bus);  	struct pnv_phb *phb = hose->private_data; @@ -527,7 +526,7 @@ static void __devinit pnv_pci_dma_dev_setup(struct pci_dev *pdev)  }  /* Fixup wrong class code in p7ioc root complex */ -static void __devinit pnv_p7ioc_rc_quirk(struct pci_dev *dev) +static void pnv_p7ioc_rc_quirk(struct pci_dev *dev)  {  	dev->class = PCI_CLASS_BRIDGE_PCI << 8;  } diff --git a/arch/powerpc/platforms/powernv/smp.c b/arch/powerpc/platforms/powernv/smp.c index 7698b6e13c5..0bdc735db16 100644 --- a/arch/powerpc/platforms/powernv/smp.c +++ b/arch/powerpc/platforms/powernv/smp.c @@ -62,7 +62,7 @@ static int pnv_smp_cpu_bootable(unsigned int nr)  	return 1;  } -int __devinit pnv_smp_kick_cpu(int nr) +int pnv_smp_kick_cpu(int nr)  {  	unsigned int pcpu = get_hard_smp_processor_id(nr);  	unsigned long start_here = __pa(*((unsigned long *) diff --git a/arch/powerpc/platforms/ps3/repository.c b/arch/powerpc/platforms/ps3/repository.c index 9b47ba7a5de..bfccdc7cb85 100644 --- a/arch/powerpc/platforms/ps3/repository.c +++ b/arch/powerpc/platforms/ps3/repository.c @@ -437,7 +437,7 @@ found_dev:  	return 0;  } -int __devinit ps3_repository_find_devices(enum ps3_bus_type bus_type, +int ps3_repository_find_devices(enum ps3_bus_type bus_type,  	int (*callback)(const struct ps3_repository_device *repo))  {  	int result = 0; diff --git a/arch/powerpc/platforms/pseries/dtl.c b/arch/powerpc/platforms/pseries/dtl.c index a7648543c59..0cc0ac07a55 100644 --- a/arch/powerpc/platforms/pseries/dtl.c +++ b/arch/powerpc/platforms/pseries/dtl.c @@ -57,7 +57,7 @@ static u8 dtl_event_mask = 0x7;   */  static int dtl_buf_entries = N_DISPATCH_LOG; -#ifdef CONFIG_VIRT_CPU_ACCOUNTING +#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE  struct dtl_ring {  	u64	write_index;  	struct dtl_entry *write_ptr; @@ -142,7 +142,7 @@ static u64 dtl_current_index(struct dtl *dtl)  	return per_cpu(dtl_rings, dtl->cpu).write_index;  } -#else /* CONFIG_VIRT_CPU_ACCOUNTING */ +#else /* CONFIG_VIRT_CPU_ACCOUNTING_NATIVE */  static int dtl_start(struct dtl *dtl)  { @@ -188,7 +188,7 @@ static u64 dtl_current_index(struct dtl *dtl)  {  	return lppaca_of(dtl->cpu).dtl_idx;  } -#endif /* CONFIG_VIRT_CPU_ACCOUNTING */ +#endif /* CONFIG_VIRT_CPU_ACCOUNTING_NATIVE */  static int dtl_enable(struct dtl *dtl)  { diff --git a/arch/powerpc/platforms/pseries/eeh_dev.c b/arch/powerpc/platforms/pseries/eeh_dev.c index 66442341d3a..1efa28f5fc5 100644 --- a/arch/powerpc/platforms/pseries/eeh_dev.c +++ b/arch/powerpc/platforms/pseries/eeh_dev.c @@ -49,7 +49,7 @@   * It will create EEH device according to the given OF node. The function   * might be called by PCI emunation, DR, PHB hotplug.   */ -void * __devinit eeh_dev_init(struct device_node *dn, void *data) +void *eeh_dev_init(struct device_node *dn, void *data)  {  	struct pci_controller *phb = data;  	struct eeh_dev *edev; @@ -77,7 +77,7 @@ void * __devinit eeh_dev_init(struct device_node *dn, void *data)   * Scan the PHB OF node and its child association, then create the   * EEH devices accordingly   */ -void __devinit eeh_dev_phb_init_dynamic(struct pci_controller *phb) +void eeh_dev_phb_init_dynamic(struct pci_controller *phb)  {  	struct device_node *dn = phb->dn; diff --git a/arch/powerpc/platforms/pseries/eeh_pe.c b/arch/powerpc/platforms/pseries/eeh_pe.c index d16c8ded108..fe43d1aa2cf 100644 --- a/arch/powerpc/platforms/pseries/eeh_pe.c +++ b/arch/powerpc/platforms/pseries/eeh_pe.c @@ -66,7 +66,7 @@ static struct eeh_pe *eeh_pe_alloc(struct pci_controller *phb, int type)   * The function should be called while the PHB is detected during   * system boot or PCI hotplug in order to create PHB PE.   */ -int __devinit eeh_phb_pe_create(struct pci_controller *phb) +int eeh_phb_pe_create(struct pci_controller *phb)  {  	struct eeh_pe *pe; diff --git a/arch/powerpc/platforms/pseries/pci_dlpar.c b/arch/powerpc/platforms/pseries/pci_dlpar.c index 261a577a3dd..c91b22be928 100644 --- a/arch/powerpc/platforms/pseries/pci_dlpar.c +++ b/arch/powerpc/platforms/pseries/pci_dlpar.c @@ -149,7 +149,7 @@ void pcibios_add_pci_devices(struct pci_bus * bus)  }  EXPORT_SYMBOL_GPL(pcibios_add_pci_devices); -struct pci_controller * __devinit init_phb_dynamic(struct device_node *dn) +struct pci_controller *init_phb_dynamic(struct device_node *dn)  {  	struct pci_controller *phb; diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c index ca55882465d..527e12c9573 100644 --- a/arch/powerpc/platforms/pseries/setup.c +++ b/arch/powerpc/platforms/pseries/setup.c @@ -281,7 +281,7 @@ static struct notifier_block pci_dn_reconfig_nb = {  struct kmem_cache *dtl_cache; -#ifdef CONFIG_VIRT_CPU_ACCOUNTING +#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE  /*   * Allocate space for the dispatch trace log for all possible cpus   * and register the buffers with the hypervisor.  This is used for @@ -332,12 +332,12 @@ static int alloc_dispatch_logs(void)  	return 0;  } -#else /* !CONFIG_VIRT_CPU_ACCOUNTING */ +#else /* !CONFIG_VIRT_CPU_ACCOUNTING_NATIVE */  static inline int alloc_dispatch_logs(void)  {  	return 0;  } -#endif /* CONFIG_VIRT_CPU_ACCOUNTING */ +#endif /* CONFIG_VIRT_CPU_ACCOUNTING_NATIVE */  static int alloc_dispatch_log_kmem_cache(void)  { diff --git a/arch/powerpc/platforms/pseries/smp.c b/arch/powerpc/platforms/pseries/smp.c index 9fc0a494190..80cd0be71e0 100644 --- a/arch/powerpc/platforms/pseries/smp.c +++ b/arch/powerpc/platforms/pseries/smp.c @@ -87,7 +87,7 @@ int smp_query_cpu_stopped(unsigned int pcpu)   *	0	- failure   *	1	- success   */ -static inline int __devinit smp_startup_cpu(unsigned int lcpu) +static inline int smp_startup_cpu(unsigned int lcpu)  {  	int status;  	unsigned long start_here = __pa((u32)*((unsigned long *) @@ -133,7 +133,7 @@ out:  	return 1;  } -static void __devinit smp_xics_setup_cpu(int cpu) +static void smp_xics_setup_cpu(int cpu)  {  	if (cpu != boot_cpuid)  		xics_setup_cpu(); @@ -148,7 +148,7 @@ static void __devinit smp_xics_setup_cpu(int cpu)  #endif  } -static int __devinit smp_pSeries_kick_cpu(int nr) +static int smp_pSeries_kick_cpu(int nr)  {  	BUG_ON(nr < 0 || nr >= NR_CPUS); diff --git a/arch/powerpc/platforms/wsp/scom_smp.c b/arch/powerpc/platforms/wsp/scom_smp.c index 141e7803209..b56b70aeb49 100644 --- a/arch/powerpc/platforms/wsp/scom_smp.c +++ b/arch/powerpc/platforms/wsp/scom_smp.c @@ -337,8 +337,7 @@ scom_fail:  	return rc;  } -int __devinit a2_scom_startup_cpu(unsigned int lcpu, int thr_idx, -				  struct device_node *np) +int a2_scom_startup_cpu(unsigned int lcpu, int thr_idx, struct device_node *np)  {  	u64 init_iar, init_msr, init_ccr2;  	unsigned long start_here; diff --git a/arch/powerpc/platforms/wsp/smp.c b/arch/powerpc/platforms/wsp/smp.c index 0ba103ae83a..332a18b8140 100644 --- a/arch/powerpc/platforms/wsp/smp.c +++ b/arch/powerpc/platforms/wsp/smp.c @@ -23,7 +23,7 @@  #include "ics.h"  #include "wsp.h" -static void __devinit smp_a2_setup_cpu(int cpu) +static void smp_a2_setup_cpu(int cpu)  {  	doorbell_setup_this_cpu(); @@ -31,7 +31,7 @@ static void __devinit smp_a2_setup_cpu(int cpu)  		xics_setup_cpu();  } -int __devinit smp_a2_kick_cpu(int nr) +int smp_a2_kick_cpu(int nr)  {  	const char *enable_method;  	struct device_node *np; diff --git a/arch/powerpc/platforms/wsp/wsp.h b/arch/powerpc/platforms/wsp/wsp.h index 10c1d1fff36..62ef21afb89 100644 --- a/arch/powerpc/platforms/wsp/wsp.h +++ b/arch/powerpc/platforms/wsp/wsp.h @@ -18,7 +18,7 @@ extern void a2_setup_smp(void);  extern int a2_scom_startup_cpu(unsigned int lcpu, int thr_idx,  			       struct device_node *np);  extern int smp_a2_cpu_bootable(unsigned int nr); -extern int __devinit smp_a2_kick_cpu(int nr); +extern int smp_a2_kick_cpu(int nr);  extern void opb_pic_init(void); diff --git a/arch/powerpc/platforms/wsp/wsp_pci.c b/arch/powerpc/platforms/wsp/wsp_pci.c index 1526551f9fe..8e22f561d17 100644 --- a/arch/powerpc/platforms/wsp/wsp_pci.c +++ b/arch/powerpc/platforms/wsp/wsp_pci.c @@ -402,7 +402,7 @@ static struct wsp_dma_table *wsp_pci_create_dma32_table(struct wsp_phb *phb,  	return ERR_PTR(-ENOMEM);  } -static void __devinit wsp_pci_dma_dev_setup(struct pci_dev *pdev) +static void wsp_pci_dma_dev_setup(struct pci_dev *pdev)  {  	struct dev_archdata *archdata = &pdev->dev.archdata;  	struct pci_controller *hose = pci_bus_to_host(pdev->bus); diff --git a/arch/powerpc/sysdev/bestcomm/bestcomm.c b/arch/powerpc/sysdev/bestcomm/bestcomm.c index b3fbb271be8..d9130630f7e 100644 --- a/arch/powerpc/sysdev/bestcomm/bestcomm.c +++ b/arch/powerpc/sysdev/bestcomm/bestcomm.c @@ -30,7 +30,7 @@  #define DRIVER_NAME "bestcomm-core"  /* MPC5200 device tree match tables */ -static struct of_device_id mpc52xx_sram_ids[] __devinitdata = { +static struct of_device_id mpc52xx_sram_ids[] = {  	{ .compatible = "fsl,mpc5200-sram", },  	{ .compatible = "mpc5200-sram", },  	{} @@ -273,8 +273,7 @@ static u32 fdt_ops[] = {  }; -static int __devinit -bcom_engine_init(void) +static int bcom_engine_init(void)  {  	int task;  	phys_addr_t tdt_pa, ctx_pa, var_pa, fdt_pa; @@ -365,7 +364,7 @@ bcom_engine_cleanup(void)  /* OF platform driver                                                       */  /* ======================================================================== */ -static int __devinit mpc52xx_bcom_probe(struct platform_device *op) +static int mpc52xx_bcom_probe(struct platform_device *op)  {  	struct device_node *ofn_sram;  	struct resource res_bcom; diff --git a/arch/powerpc/sysdev/fsl_85xx_l2ctlr.c b/arch/powerpc/sysdev/fsl_85xx_l2ctlr.c index d131c8a1cb1..8cf93f029e1 100644 --- a/arch/powerpc/sysdev/fsl_85xx_l2ctlr.c +++ b/arch/powerpc/sysdev/fsl_85xx_l2ctlr.c @@ -69,7 +69,7 @@ static int __init get_offset_from_cmdline(char *str)  __setup("cache-sram-size=", get_size_from_cmdline);  __setup("cache-sram-offset=", get_offset_from_cmdline); -static int __devinit mpc85xx_l2ctlr_of_probe(struct platform_device *dev) +static int mpc85xx_l2ctlr_of_probe(struct platform_device *dev)  {  	long rval;  	unsigned int rem; @@ -160,7 +160,7 @@ static int __devinit mpc85xx_l2ctlr_of_probe(struct platform_device *dev)  	return 0;  } -static int __devexit mpc85xx_l2ctlr_of_remove(struct platform_device *dev) +static int mpc85xx_l2ctlr_of_remove(struct platform_device *dev)  {  	BUG_ON(!l2ctlr); @@ -213,7 +213,7 @@ static struct platform_driver mpc85xx_l2ctlr_of_platform_driver = {  		.of_match_table	= mpc85xx_l2ctlr_of_match,  	},  	.probe		= mpc85xx_l2ctlr_of_probe, -	.remove		= __devexit_p(mpc85xx_l2ctlr_of_remove), +	.remove		= mpc85xx_l2ctlr_of_remove,  };  static __init int mpc85xx_l2ctlr_of_init(void) diff --git a/arch/powerpc/sysdev/fsl_ifc.c b/arch/powerpc/sysdev/fsl_ifc.c index 097cc9d2585..2a36fd6a958 100644 --- a/arch/powerpc/sysdev/fsl_ifc.c +++ b/arch/powerpc/sysdev/fsl_ifc.c @@ -73,7 +73,7 @@ int fsl_ifc_find(phys_addr_t addr_base)  }  EXPORT_SYMBOL(fsl_ifc_find); -static int __devinit fsl_ifc_ctrl_init(struct fsl_ifc_ctrl *ctrl) +static int fsl_ifc_ctrl_init(struct fsl_ifc_ctrl *ctrl)  {  	struct fsl_ifc_regs __iomem *ifc = ctrl->regs; @@ -211,7 +211,7 @@ static irqreturn_t fsl_ifc_ctrl_irq(int irqno, void *data)   * resources for the NAND banks themselves are allocated   * in the chip probe function.  */ -static int __devinit fsl_ifc_ctrl_probe(struct platform_device *dev) +static int fsl_ifc_ctrl_probe(struct platform_device *dev)  {  	int ret = 0; diff --git a/arch/powerpc/sysdev/fsl_lbc.c b/arch/powerpc/sysdev/fsl_lbc.c index 483126d7b3c..300be2d06a2 100644 --- a/arch/powerpc/sysdev/fsl_lbc.c +++ b/arch/powerpc/sysdev/fsl_lbc.c @@ -185,8 +185,8 @@ int fsl_upm_run_pattern(struct fsl_upm *upm, void __iomem *io_base, u32 mar)  }  EXPORT_SYMBOL(fsl_upm_run_pattern); -static int __devinit fsl_lbc_ctrl_init(struct fsl_lbc_ctrl *ctrl, -				       struct device_node *node) +static int fsl_lbc_ctrl_init(struct fsl_lbc_ctrl *ctrl, +			     struct device_node *node)  {  	struct fsl_lbc_regs __iomem *lbc = ctrl->regs; @@ -273,7 +273,7 @@ static irqreturn_t fsl_lbc_ctrl_irq(int irqno, void *data)   * in the chip probe function.  */ -static int __devinit fsl_lbc_ctrl_probe(struct platform_device *dev) +static int fsl_lbc_ctrl_probe(struct platform_device *dev)  {  	int ret; diff --git a/arch/powerpc/sysdev/fsl_msi.c b/arch/powerpc/sysdev/fsl_msi.c index 63c5f04ea58..6e53d97abd3 100644 --- a/arch/powerpc/sysdev/fsl_msi.c +++ b/arch/powerpc/sysdev/fsl_msi.c @@ -333,9 +333,8 @@ static int fsl_of_msi_remove(struct platform_device *ofdev)  	return 0;  } -static int __devinit fsl_msi_setup_hwirq(struct fsl_msi *msi, -					 struct platform_device *dev, -					 int offset, int irq_index) +static int fsl_msi_setup_hwirq(struct fsl_msi *msi, struct platform_device *dev, +			       int offset, int irq_index)  {  	struct fsl_msi_cascade_data *cascade_data = NULL;  	int virt_msir; @@ -363,7 +362,7 @@ static int __devinit fsl_msi_setup_hwirq(struct fsl_msi *msi,  }  static const struct of_device_id fsl_of_msi_ids[]; -static int __devinit fsl_of_msi_probe(struct platform_device *dev) +static int fsl_of_msi_probe(struct platform_device *dev)  {  	const struct of_device_id *match;  	struct fsl_msi *msi; diff --git a/arch/powerpc/sysdev/fsl_pci.c b/arch/powerpc/sysdev/fsl_pci.c index 5ba325bff3a..92a5915b182 100644 --- a/arch/powerpc/sysdev/fsl_pci.c +++ b/arch/powerpc/sysdev/fsl_pci.c @@ -36,7 +36,7 @@  static int fsl_pcie_bus_fixup, is_mpc83xx_pci; -static void __devinit quirk_fsl_pcie_header(struct pci_dev *dev) +static void quirk_fsl_pcie_header(struct pci_dev *dev)  {  	u8 hdr_type; @@ -871,7 +871,7 @@ void fsl_pci_assign_primary(void)  	}  } -static int __devinit fsl_pci_probe(struct platform_device *pdev) +static int fsl_pci_probe(struct platform_device *pdev)  {  	int ret;  	struct device_node *node; diff --git a/arch/powerpc/sysdev/fsl_rio.c b/arch/powerpc/sysdev/fsl_rio.c index 5b6f556094d..e2fb3171f41 100644 --- a/arch/powerpc/sysdev/fsl_rio.c +++ b/arch/powerpc/sysdev/fsl_rio.c @@ -644,7 +644,7 @@ err_rio_regs:  /* The probe function for RapidIO peer-to-peer network.   */ -static int __devinit fsl_of_rio_rpn_probe(struct platform_device *dev) +static int fsl_of_rio_rpn_probe(struct platform_device *dev)  {  	printk(KERN_INFO "Setting up RapidIO peer-to-peer network %s\n",  			dev->dev.of_node->full_name); diff --git a/arch/powerpc/sysdev/mpic.c b/arch/powerpc/sysdev/mpic.c index 9c6e535daad..3b2efd41abf 100644 --- a/arch/powerpc/sysdev/mpic.c +++ b/arch/powerpc/sysdev/mpic.c @@ -1864,7 +1864,7 @@ int __init smp_mpic_probe(void)  	return nr_cpus;  } -void __devinit smp_mpic_setup_cpu(int cpu) +void smp_mpic_setup_cpu(int cpu)  {  	mpic_setup_this_cpu();  } diff --git a/arch/powerpc/sysdev/mpic_msgr.c b/arch/powerpc/sysdev/mpic_msgr.c index e961f8c4a8f..c75325865a8 100644 --- a/arch/powerpc/sysdev/mpic_msgr.c +++ b/arch/powerpc/sysdev/mpic_msgr.c @@ -160,7 +160,7 @@ static int mpic_msgr_block_number(struct device_node *node)  /* The probe function for a single message register block.   */ -static __devinit int mpic_msgr_probe(struct platform_device *dev) +static int mpic_msgr_probe(struct platform_device *dev)  {  	void __iomem *msgr_block_addr;  	int block_number; diff --git a/arch/powerpc/sysdev/mv64x60_pci.c b/arch/powerpc/sysdev/mv64x60_pci.c index 364b14d4754..330d56613c5 100644 --- a/arch/powerpc/sysdev/mv64x60_pci.c +++ b/arch/powerpc/sysdev/mv64x60_pci.c @@ -104,7 +104,7 @@ subsys_initcall(mv64x60_sysfs_init);  #endif /* CONFIG_SYSFS */ -static void __devinit mv64x60_pci_fixup_early(struct pci_dev *dev) +static void mv64x60_pci_fixup_early(struct pci_dev *dev)  {  	/*  	 * Set the host bridge hdr_type to an invalid value so that diff --git a/arch/powerpc/sysdev/ppc4xx_msi.c b/arch/powerpc/sysdev/ppc4xx_msi.c index 82c6702dcba..43948da837a 100644 --- a/arch/powerpc/sysdev/ppc4xx_msi.c +++ b/arch/powerpc/sysdev/ppc4xx_msi.c @@ -220,7 +220,7 @@ static int ppc4xx_of_msi_remove(struct platform_device *dev)  	return 0;  } -static int __devinit ppc4xx_msi_probe(struct platform_device *dev) +static int ppc4xx_msi_probe(struct platform_device *dev)  {  	struct ppc4xx_msi *msi;  	struct resource res; diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig index b5ea38c2564..c15ba7d1be6 100644 --- a/arch/s390/Kconfig +++ b/arch/s390/Kconfig @@ -78,7 +78,6 @@ config S390  	select HAVE_KVM if 64BIT  	select HAVE_ARCH_TRACEHOOK  	select INIT_ALL_POSSIBLE -	select HAVE_IRQ_WORK  	select HAVE_PERF_EVENTS  	select ARCH_HAVE_NMI_SAFE_CMPXCHG  	select HAVE_DEBUG_KMEMLEAK diff --git a/arch/s390/Makefile b/arch/s390/Makefile index 4b8e08b56f4..7e3ce78d429 100644 --- a/arch/s390/Makefile +++ b/arch/s390/Makefile @@ -24,8 +24,8 @@ CHECKFLAGS	+= -D__s390__ -msize-long  else  LD_BFD		:= elf64-s390  LDFLAGS		:= -m elf64_s390 -KBUILD_AFLAGS_MODULE += -fpic -D__PIC__ -KBUILD_CFLAGS_MODULE += -fpic -D__PIC__ +KBUILD_AFLAGS_MODULE += -fPIC +KBUILD_CFLAGS_MODULE += -fPIC  KBUILD_CFLAGS	+= -m64  KBUILD_AFLAGS	+= -m64  UTS_MACHINE	:= s390x diff --git a/arch/s390/include/asm/dma.h b/arch/s390/include/asm/dma.h index de015d85e3e..bb9bdcd2086 100644 --- a/arch/s390/include/asm/dma.h +++ b/arch/s390/include/asm/dma.h @@ -10,4 +10,10 @@   */  #define MAX_DMA_ADDRESS         0x80000000 +#ifdef CONFIG_PCI +extern int isa_dma_bridge_buggy; +#else +#define isa_dma_bridge_buggy	(0) +#endif +  #endif /* _ASM_S390_DMA_H */ diff --git a/arch/s390/include/asm/io.h b/arch/s390/include/asm/io.h index 16c3eb164f4..27cb32185ce 100644 --- a/arch/s390/include/asm/io.h +++ b/arch/s390/include/asm/io.h @@ -85,6 +85,11 @@ static inline void iounmap(volatile void __iomem *addr)  #define __raw_writel	zpci_write_u32  #define __raw_writeq	zpci_write_u64 +#define readb_relaxed	readb +#define readw_relaxed	readw +#define readl_relaxed	readl +#define readq_relaxed	readq +  #endif /* CONFIG_PCI */  #include <asm-generic/io.h> diff --git a/arch/s390/include/asm/irq.h b/arch/s390/include/asm/irq.h index e6972f85d2b..7def77302d6 100644 --- a/arch/s390/include/asm/irq.h +++ b/arch/s390/include/asm/irq.h @@ -2,43 +2,61 @@  #define _ASM_IRQ_H  #include <linux/hardirq.h> +#include <linux/percpu.h> +#include <linux/cache.h>  #include <linux/types.h> -enum interruption_class { +enum interruption_main_class {  	EXTERNAL_INTERRUPT,  	IO_INTERRUPT, -	EXTINT_CLK, -	EXTINT_EXC, -	EXTINT_EMS, -	EXTINT_TMR, -	EXTINT_TLA, -	EXTINT_PFL, -	EXTINT_DSD, -	EXTINT_VRT, -	EXTINT_SCP, -	EXTINT_IUC, -	EXTINT_CMS, -	EXTINT_CMC, -	EXTINT_CMR, -	IOINT_CIO, -	IOINT_QAI, -	IOINT_DAS, -	IOINT_C15, -	IOINT_C70, -	IOINT_TAP, -	IOINT_VMR, -	IOINT_LCS, -	IOINT_CLW, -	IOINT_CTC, -	IOINT_APB, -	IOINT_ADM, -	IOINT_CSC, -	IOINT_PCI, -	IOINT_MSI, +	NR_IRQS +}; + +enum interruption_class { +	IRQEXT_CLK, +	IRQEXT_EXC, +	IRQEXT_EMS, +	IRQEXT_TMR, +	IRQEXT_TLA, +	IRQEXT_PFL, +	IRQEXT_DSD, +	IRQEXT_VRT, +	IRQEXT_SCP, +	IRQEXT_IUC, +	IRQEXT_CMS, +	IRQEXT_CMC, +	IRQEXT_CMR, +	IRQIO_CIO, +	IRQIO_QAI, +	IRQIO_DAS, +	IRQIO_C15, +	IRQIO_C70, +	IRQIO_TAP, +	IRQIO_VMR, +	IRQIO_LCS, +	IRQIO_CLW, +	IRQIO_CTC, +	IRQIO_APB, +	IRQIO_ADM, +	IRQIO_CSC, +	IRQIO_PCI, +	IRQIO_MSI,  	NMI_NMI, -	NR_IRQS, +	CPU_RST, +	NR_ARCH_IRQS  }; +struct irq_stat { +	unsigned int irqs[NR_ARCH_IRQS]; +}; + +DECLARE_PER_CPU_SHARED_ALIGNED(struct irq_stat, irq_stat); + +static __always_inline void inc_irq_stat(enum interruption_class irq) +{ +	__get_cpu_var(irq_stat).irqs[irq]++; +} +  struct ext_code {  	unsigned short subcode;  	unsigned short code; diff --git a/arch/s390/include/asm/pgtable.h b/arch/s390/include/asm/pgtable.h index c928dc1938f..098adbb6266 100644 --- a/arch/s390/include/asm/pgtable.h +++ b/arch/s390/include/asm/pgtable.h @@ -1365,6 +1365,18 @@ static inline void pmdp_invalidate(struct vm_area_struct *vma,  	__pmd_idte(address, pmdp);  } +#define __HAVE_ARCH_PMDP_SET_WRPROTECT +static inline void pmdp_set_wrprotect(struct mm_struct *mm, +				      unsigned long address, pmd_t *pmdp) +{ +	pmd_t pmd = *pmdp; + +	if (pmd_write(pmd)) { +		__pmd_idte(address, pmdp); +		set_pmd_at(mm, address, pmdp, pmd_wrprotect(pmd)); +	} +} +  static inline pmd_t mk_pmd_phys(unsigned long physpage, pgprot_t pgprot)  {  	pmd_t __pmd; @@ -1387,10 +1399,7 @@ static inline int has_transparent_hugepage(void)  static inline unsigned long pmd_pfn(pmd_t pmd)  { -	if (pmd_trans_huge(pmd)) -		return pmd_val(pmd) >> HPAGE_SHIFT; -	else -		return pmd_val(pmd) >> PAGE_SHIFT; +	return pmd_val(pmd) >> PAGE_SHIFT;  }  #endif /* CONFIG_TRANSPARENT_HUGEPAGE */ diff --git a/arch/s390/include/asm/timex.h b/arch/s390/include/asm/timex.h index fba4d66788a..4c060bb5b8e 100644 --- a/arch/s390/include/asm/timex.h +++ b/arch/s390/include/asm/timex.h @@ -128,4 +128,32 @@ static inline unsigned long long get_clock_monotonic(void)  	return get_clock_xt() - sched_clock_base_cc;  } +/** + * tod_to_ns - convert a TOD format value to nanoseconds + * @todval: to be converted TOD format value + * Returns: number of nanoseconds that correspond to the TOD format value + * + * Converting a 64 Bit TOD format value to nanoseconds means that the value + * must be divided by 4.096. In order to achieve that we multiply with 125 + * and divide by 512: + * + *    ns = (todval * 125) >> 9; + * + * In order to avoid an overflow with the multiplication we can rewrite this. + * With a split todval == 2^32 * th + tl (th upper 32 bits, tl lower 32 bits) + * we end up with + * + *    ns = ((2^32 * th + tl) * 125 ) >> 9; + * -> ns = (2^23 * th * 125) + ((tl * 125) >> 9); + * + */ +static inline unsigned long long tod_to_ns(unsigned long long todval) +{ +	unsigned long long ns; + +	ns = ((todval >> 32) << 23) * 125; +	ns += ((todval & 0xffffffff) * 125) >> 9; +	return ns; +} +  #endif diff --git a/arch/s390/include/uapi/asm/unistd.h b/arch/s390/include/uapi/asm/unistd.h index 63e6078699f..864f693c237 100644 --- a/arch/s390/include/uapi/asm/unistd.h +++ b/arch/s390/include/uapi/asm/unistd.h @@ -279,7 +279,8 @@  #define __NR_process_vm_writev	341  #define __NR_s390_runtime_instr 342  #define __NR_kcmp		343 -#define NR_syscalls 344 +#define __NR_finit_module	344 +#define NR_syscalls 345  /*    * There are some system calls that are not present on 64 bit, some diff --git a/arch/s390/kernel/compat_wrapper.S b/arch/s390/kernel/compat_wrapper.S index 827e094a2f4..9b9a805656b 100644 --- a/arch/s390/kernel/compat_wrapper.S +++ b/arch/s390/kernel/compat_wrapper.S @@ -1659,3 +1659,9 @@ ENTRY(sys_kcmp_wrapper)  	llgfr	%r5,%r5			# unsigned long  	llgfr	%r6,%r6			# unsigned long  	jg	sys_kcmp + +ENTRY(sys_finit_module_wrapper) +	lgfr	%r2,%r2			# int +	llgtr	%r3,%r3			# const char __user * +	lgfr	%r4,%r4			# int +	jg	sys_finit_module diff --git a/arch/s390/kernel/debug.c b/arch/s390/kernel/debug.c index ba500d8dc39..4e8215e0d4b 100644 --- a/arch/s390/kernel/debug.c +++ b/arch/s390/kernel/debug.c @@ -1127,13 +1127,14 @@ debug_register_view(debug_info_t * id, struct debug_view *view)  	if (i == DEBUG_MAX_VIEWS) {  		pr_err("Registering view %s/%s would exceed the maximum "  		       "number of views %i\n", id->name, view->name, i); -		debugfs_remove(pde);  		rc = -1;  	} else {  		id->views[i] = view;  		id->debugfs_entries[i] = pde;  	}  	spin_unlock_irqrestore(&id->lock, flags); +	if (rc) +		debugfs_remove(pde);  out:  	return rc;  } @@ -1146,9 +1147,9 @@ EXPORT_SYMBOL(debug_register_view);  int  debug_unregister_view(debug_info_t * id, struct debug_view *view)  { -	int rc = 0; -	int i; +	struct dentry *dentry = NULL;  	unsigned long flags; +	int i, rc = 0;  	if (!id)  		goto out; @@ -1160,10 +1161,12 @@ debug_unregister_view(debug_info_t * id, struct debug_view *view)  	if (i == DEBUG_MAX_VIEWS)  		rc = -1;  	else { -		debugfs_remove(id->debugfs_entries[i]); +		dentry = id->debugfs_entries[i];  		id->views[i] = NULL; +		id->debugfs_entries[i] = NULL;  	}  	spin_unlock_irqrestore(&id->lock, flags); +	debugfs_remove(dentry);  out:  	return rc;  } diff --git a/arch/s390/kernel/irq.c b/arch/s390/kernel/irq.c index bf24293970c..9df824ea166 100644 --- a/arch/s390/kernel/irq.c +++ b/arch/s390/kernel/irq.c @@ -24,43 +24,65 @@  #include <asm/irq.h>  #include "entry.h" +DEFINE_PER_CPU_SHARED_ALIGNED(struct irq_stat, irq_stat); +EXPORT_PER_CPU_SYMBOL_GPL(irq_stat); +  struct irq_class {  	char *name;  	char *desc;  }; -static const struct irq_class intrclass_names[] = { +/* + * The list of "main" irq classes on s390. This is the list of interrrupts + * that appear both in /proc/stat ("intr" line) and /proc/interrupts. + * Historically only external and I/O interrupts have been part of /proc/stat. + * We can't add the split external and I/O sub classes since the first field + * in the "intr" line in /proc/stat is supposed to be the sum of all other + * fields. + * Since the external and I/O interrupt fields are already sums we would end + * up with having a sum which accounts each interrupt twice. + */ +static const struct irq_class irqclass_main_desc[NR_IRQS] = {  	[EXTERNAL_INTERRUPT] = {.name = "EXT"}, -	[IO_INTERRUPT]	     = {.name = "I/O"}, -	[EXTINT_CLK] = {.name = "CLK", .desc = "[EXT] Clock Comparator"}, -	[EXTINT_EXC] = {.name = "EXC", .desc = "[EXT] External Call"}, -	[EXTINT_EMS] = {.name = "EMS", .desc = "[EXT] Emergency Signal"}, -	[EXTINT_TMR] = {.name = "TMR", .desc = "[EXT] CPU Timer"}, -	[EXTINT_TLA] = {.name = "TAL", .desc = "[EXT] Timing Alert"}, -	[EXTINT_PFL] = {.name = "PFL", .desc = "[EXT] Pseudo Page Fault"}, -	[EXTINT_DSD] = {.name = "DSD", .desc = "[EXT] DASD Diag"}, -	[EXTINT_VRT] = {.name = "VRT", .desc = "[EXT] Virtio"}, -	[EXTINT_SCP] = {.name = "SCP", .desc = "[EXT] Service Call"}, -	[EXTINT_IUC] = {.name = "IUC", .desc = "[EXT] IUCV"}, -	[EXTINT_CMS] = {.name = "CMS", .desc = "[EXT] CPU-Measurement: Sampling"}, -	[EXTINT_CMC] = {.name = "CMC", .desc = "[EXT] CPU-Measurement: Counter"}, -	[EXTINT_CMR] = {.name = "CMR", .desc = "[EXT] CPU-Measurement: RI"}, -	[IOINT_CIO]  = {.name = "CIO", .desc = "[I/O] Common I/O Layer Interrupt"}, -	[IOINT_QAI]  = {.name = "QAI", .desc = "[I/O] QDIO Adapter Interrupt"}, -	[IOINT_DAS]  = {.name = "DAS", .desc = "[I/O] DASD"}, -	[IOINT_C15]  = {.name = "C15", .desc = "[I/O] 3215"}, -	[IOINT_C70]  = {.name = "C70", .desc = "[I/O] 3270"}, -	[IOINT_TAP]  = {.name = "TAP", .desc = "[I/O] Tape"}, -	[IOINT_VMR]  = {.name = "VMR", .desc = "[I/O] Unit Record Devices"}, -	[IOINT_LCS]  = {.name = "LCS", .desc = "[I/O] LCS"}, -	[IOINT_CLW]  = {.name = "CLW", .desc = "[I/O] CLAW"}, -	[IOINT_CTC]  = {.name = "CTC", .desc = "[I/O] CTC"}, -	[IOINT_APB]  = {.name = "APB", .desc = "[I/O] AP Bus"}, -	[IOINT_ADM]  = {.name = "ADM", .desc = "[I/O] EADM Subchannel"}, -	[IOINT_CSC]  = {.name = "CSC", .desc = "[I/O] CHSC Subchannel"}, -	[IOINT_PCI]  = {.name = "PCI", .desc = "[I/O] PCI Interrupt" }, -	[IOINT_MSI] =  {.name = "MSI", .desc = "[I/O] MSI Interrupt" }, +	[IO_INTERRUPT]	     = {.name = "I/O"} +}; + +/* + * The list of split external and I/O interrupts that appear only in + * /proc/interrupts. + * In addition this list contains non external / I/O events like NMIs. + */ +static const struct irq_class irqclass_sub_desc[NR_ARCH_IRQS] = { +	[IRQEXT_CLK] = {.name = "CLK", .desc = "[EXT] Clock Comparator"}, +	[IRQEXT_EXC] = {.name = "EXC", .desc = "[EXT] External Call"}, +	[IRQEXT_EMS] = {.name = "EMS", .desc = "[EXT] Emergency Signal"}, +	[IRQEXT_TMR] = {.name = "TMR", .desc = "[EXT] CPU Timer"}, +	[IRQEXT_TLA] = {.name = "TAL", .desc = "[EXT] Timing Alert"}, +	[IRQEXT_PFL] = {.name = "PFL", .desc = "[EXT] Pseudo Page Fault"}, +	[IRQEXT_DSD] = {.name = "DSD", .desc = "[EXT] DASD Diag"}, +	[IRQEXT_VRT] = {.name = "VRT", .desc = "[EXT] Virtio"}, +	[IRQEXT_SCP] = {.name = "SCP", .desc = "[EXT] Service Call"}, +	[IRQEXT_IUC] = {.name = "IUC", .desc = "[EXT] IUCV"}, +	[IRQEXT_CMS] = {.name = "CMS", .desc = "[EXT] CPU-Measurement: Sampling"}, +	[IRQEXT_CMC] = {.name = "CMC", .desc = "[EXT] CPU-Measurement: Counter"}, +	[IRQEXT_CMR] = {.name = "CMR", .desc = "[EXT] CPU-Measurement: RI"}, +	[IRQIO_CIO]  = {.name = "CIO", .desc = "[I/O] Common I/O Layer Interrupt"}, +	[IRQIO_QAI]  = {.name = "QAI", .desc = "[I/O] QDIO Adapter Interrupt"}, +	[IRQIO_DAS]  = {.name = "DAS", .desc = "[I/O] DASD"}, +	[IRQIO_C15]  = {.name = "C15", .desc = "[I/O] 3215"}, +	[IRQIO_C70]  = {.name = "C70", .desc = "[I/O] 3270"}, +	[IRQIO_TAP]  = {.name = "TAP", .desc = "[I/O] Tape"}, +	[IRQIO_VMR]  = {.name = "VMR", .desc = "[I/O] Unit Record Devices"}, +	[IRQIO_LCS]  = {.name = "LCS", .desc = "[I/O] LCS"}, +	[IRQIO_CLW]  = {.name = "CLW", .desc = "[I/O] CLAW"}, +	[IRQIO_CTC]  = {.name = "CTC", .desc = "[I/O] CTC"}, +	[IRQIO_APB]  = {.name = "APB", .desc = "[I/O] AP Bus"}, +	[IRQIO_ADM]  = {.name = "ADM", .desc = "[I/O] EADM Subchannel"}, +	[IRQIO_CSC]  = {.name = "CSC", .desc = "[I/O] CHSC Subchannel"}, +	[IRQIO_PCI]  = {.name = "PCI", .desc = "[I/O] PCI Interrupt" }, +	[IRQIO_MSI]  = {.name = "MSI", .desc = "[I/O] MSI Interrupt" },  	[NMI_NMI]    = {.name = "NMI", .desc = "[NMI] Machine Check"}, +	[CPU_RST]    = {.name = "RST", .desc = "[CPU] CPU Restart"},  };  /* @@ -68,30 +90,34 @@ static const struct irq_class intrclass_names[] = {   */  int show_interrupts(struct seq_file *p, void *v)  { -	int i = *(loff_t *) v, j; +	int irq = *(loff_t *) v; +	int cpu;  	get_online_cpus(); -	if (i == 0) { +	if (irq == 0) {  		seq_puts(p, "           "); -		for_each_online_cpu(j) -			seq_printf(p, "CPU%d       ",j); +		for_each_online_cpu(cpu) +			seq_printf(p, "CPU%d       ", cpu);  		seq_putc(p, '\n');  	} - -	if (i < NR_IRQS) { -		seq_printf(p, "%s: ", intrclass_names[i].name); -#ifndef CONFIG_SMP -		seq_printf(p, "%10u ", kstat_irqs(i)); -#else -		for_each_online_cpu(j) -			seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); -#endif -		if (intrclass_names[i].desc) -			seq_printf(p, "  %s", intrclass_names[i].desc); -                seq_putc(p, '\n'); -        } +	if (irq < NR_IRQS) { +		seq_printf(p, "%s: ", irqclass_main_desc[irq].name); +		for_each_online_cpu(cpu) +			seq_printf(p, "%10u ", kstat_cpu(cpu).irqs[irq]); +		seq_putc(p, '\n'); +		goto skip_arch_irqs; +	} +	for (irq = 0; irq < NR_ARCH_IRQS; irq++) { +		seq_printf(p, "%s: ", irqclass_sub_desc[irq].name); +		for_each_online_cpu(cpu) +			seq_printf(p, "%10u ", per_cpu(irq_stat, cpu).irqs[irq]); +		if (irqclass_sub_desc[irq].desc) +			seq_printf(p, "  %s", irqclass_sub_desc[irq].desc); +		seq_putc(p, '\n'); +	} +skip_arch_irqs:  	put_online_cpus(); -        return 0; +	return 0;  }  /* @@ -222,7 +248,7 @@ void __irq_entry do_extint(struct pt_regs *regs, struct ext_code ext_code,  		/* Serve timer interrupts first. */  		clock_comparator_work();  	} -	kstat_cpu(smp_processor_id()).irqs[EXTERNAL_INTERRUPT]++; +	kstat_incr_irqs_this_cpu(EXTERNAL_INTERRUPT, NULL);  	if (ext_code.code != 0x1004)  		__get_cpu_var(s390_idle).nohz_delay = 1; diff --git a/arch/s390/kernel/nmi.c b/arch/s390/kernel/nmi.c index a6daa5c5cdb..7918fbea36b 100644 --- a/arch/s390/kernel/nmi.c +++ b/arch/s390/kernel/nmi.c @@ -254,7 +254,7 @@ void notrace s390_do_machine_check(struct pt_regs *regs)  	int umode;  	nmi_enter(); -	kstat_cpu(smp_processor_id()).irqs[NMI_NMI]++; +	inc_irq_stat(NMI_NMI);  	mci = (struct mci *) &S390_lowcore.mcck_interruption_code;  	mcck = &__get_cpu_var(cpu_mcck);  	umode = user_mode(regs); diff --git a/arch/s390/kernel/perf_cpum_cf.c b/arch/s390/kernel/perf_cpum_cf.c index c4e7269d4a0..86ec7447e1f 100644 --- a/arch/s390/kernel/perf_cpum_cf.c +++ b/arch/s390/kernel/perf_cpum_cf.c @@ -229,7 +229,7 @@ static void cpumf_measurement_alert(struct ext_code ext_code,  	if (!(alert & CPU_MF_INT_CF_MASK))  		return; -	kstat_cpu(smp_processor_id()).irqs[EXTINT_CMC]++; +	inc_irq_stat(IRQEXT_CMC);  	cpuhw = &__get_cpu_var(cpu_hw_events);  	/* Measurement alerts are shared and might happen when the PMU diff --git a/arch/s390/kernel/runtime_instr.c b/arch/s390/kernel/runtime_instr.c index 61066f6f71a..077a99389b0 100644 --- a/arch/s390/kernel/runtime_instr.c +++ b/arch/s390/kernel/runtime_instr.c @@ -71,7 +71,7 @@ static void runtime_instr_int_handler(struct ext_code ext_code,  	if (!(param32 & CPU_MF_INT_RI_MASK))  		return; -	kstat_cpu(smp_processor_id()).irqs[EXTINT_CMR]++; +	inc_irq_stat(IRQEXT_CMR);  	if (!current->thread.ri_cb)  		return; diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c index 2568590973a..a5360de85ec 100644 --- a/arch/s390/kernel/setup.c +++ b/arch/s390/kernel/setup.c @@ -16,7 +16,7 @@  #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt  #include <linux/errno.h> -#include <linux/module.h> +#include <linux/export.h>  #include <linux/sched.h>  #include <linux/kernel.h>  #include <linux/memblock.h> @@ -289,6 +289,7 @@ void machine_power_off(void)   * Dummy power off function.   */  void (*pm_power_off)(void) = machine_power_off; +EXPORT_SYMBOL_GPL(pm_power_off);  static int __init early_parse_mem(char *p)  { diff --git a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c index ea431e551c6..7433a2f9e5c 100644 --- a/arch/s390/kernel/smp.c +++ b/arch/s390/kernel/smp.c @@ -433,9 +433,9 @@ static void do_ext_call_interrupt(struct ext_code ext_code,  	cpu = smp_processor_id();  	if (ext_code.code == 0x1202) -		kstat_cpu(cpu).irqs[EXTINT_EXC]++; +		inc_irq_stat(IRQEXT_EXC);  	else -		kstat_cpu(cpu).irqs[EXTINT_EMS]++; +		inc_irq_stat(IRQEXT_EMS);  	/*  	 * handle bit signal external calls  	 */ @@ -623,9 +623,9 @@ static struct sclp_cpu_info *smp_get_cpu_info(void)  	return info;  } -static int __devinit smp_add_present_cpu(int cpu); +static int __cpuinit smp_add_present_cpu(int cpu); -static int __devinit __smp_rescan_cpus(struct sclp_cpu_info *info, +static int __cpuinit __smp_rescan_cpus(struct sclp_cpu_info *info,  				       int sysfs_add)  {  	struct pcpu *pcpu; @@ -709,6 +709,7 @@ static void __cpuinit smp_start_secondary(void *cpuvoid)  	pfault_init();  	notify_cpu_starting(smp_processor_id());  	set_cpu_online(smp_processor_id(), true); +	inc_irq_stat(CPU_RST);  	local_irq_enable();  	/* cpu_idle will call schedule for us */  	cpu_idle(); @@ -986,7 +987,7 @@ static int __cpuinit smp_cpu_notify(struct notifier_block *self,  	return notifier_from_errno(err);  } -static int __devinit smp_add_present_cpu(int cpu) +static int __cpuinit smp_add_present_cpu(int cpu)  {  	struct cpu *c = &pcpu_devices[cpu].cpu;  	struct device *s = &c->dev; diff --git a/arch/s390/kernel/syscalls.S b/arch/s390/kernel/syscalls.S index 48174850f3b..6a6c61f94dd 100644 --- a/arch/s390/kernel/syscalls.S +++ b/arch/s390/kernel/syscalls.S @@ -352,3 +352,4 @@ SYSCALL(sys_process_vm_readv,sys_process_vm_readv,compat_sys_process_vm_readv_wr  SYSCALL(sys_process_vm_writev,sys_process_vm_writev,compat_sys_process_vm_writev_wrapper)  SYSCALL(sys_ni_syscall,sys_s390_runtime_instr,sys_s390_runtime_instr_wrapper)  SYSCALL(sys_kcmp,sys_kcmp,sys_kcmp_wrapper) +SYSCALL(sys_finit_module,sys_finit_module,sys_finit_module_wrapper) diff --git a/arch/s390/kernel/time.c b/arch/s390/kernel/time.c index 7fcd690d42c..0aa98db8a80 100644 --- a/arch/s390/kernel/time.c +++ b/arch/s390/kernel/time.c @@ -63,7 +63,7 @@ static DEFINE_PER_CPU(struct clock_event_device, comparators);   */  unsigned long long notrace __kprobes sched_clock(void)  { -	return (get_clock_monotonic() * 125) >> 9; +	return tod_to_ns(get_clock_monotonic());  }  /* @@ -120,6 +120,9 @@ static int s390_next_ktime(ktime_t expires,  	nsecs = ktime_to_ns(ktime_add(timespec_to_ktime(ts), expires));  	do_div(nsecs, 125);  	S390_lowcore.clock_comparator = sched_clock_base_cc + (nsecs << 9); +	/* Program the maximum value if we have an overflow (== year 2042) */ +	if (unlikely(S390_lowcore.clock_comparator < sched_clock_base_cc)) +		S390_lowcore.clock_comparator = -1ULL;  	set_clock_comparator(S390_lowcore.clock_comparator);  	return 0;  } @@ -168,7 +171,7 @@ static void clock_comparator_interrupt(struct ext_code ext_code,  				       unsigned int param32,  				       unsigned long param64)  { -	kstat_cpu(smp_processor_id()).irqs[EXTINT_CLK]++; +	inc_irq_stat(IRQEXT_CLK);  	if (S390_lowcore.clock_comparator == -1ULL)  		set_clock_comparator(S390_lowcore.clock_comparator);  } @@ -179,7 +182,7 @@ static void stp_timing_alert(struct stp_irq_parm *);  static void timing_alert_interrupt(struct ext_code ext_code,  				   unsigned int param32, unsigned long param64)  { -	kstat_cpu(smp_processor_id()).irqs[EXTINT_TLA]++; +	inc_irq_stat(IRQEXT_TLA);  	if (param32 & 0x00c40000)  		etr_timing_alert((struct etr_irq_parm *) ¶m32);  	if (param32 & 0x00038000) diff --git a/arch/s390/kernel/topology.c b/arch/s390/kernel/topology.c index f1aba87cceb..4b2e3e31700 100644 --- a/arch/s390/kernel/topology.c +++ b/arch/s390/kernel/topology.c @@ -10,6 +10,7 @@  #include <linux/bootmem.h>  #include <linux/cpuset.h>  #include <linux/device.h> +#include <linux/export.h>  #include <linux/kernel.h>  #include <linux/sched.h>  #include <linux/init.h> @@ -42,6 +43,7 @@ static struct mask_info socket_info;  static struct mask_info book_info;  struct cpu_topology_s390 cpu_topology[NR_CPUS]; +EXPORT_SYMBOL_GPL(cpu_topology);  static cpumask_t cpu_group_map(struct mask_info *info, unsigned int cpu)  { diff --git a/arch/s390/kernel/vtime.c b/arch/s390/kernel/vtime.c index e84b8b68444..ce9cc5aa203 100644 --- a/arch/s390/kernel/vtime.c +++ b/arch/s390/kernel/vtime.c @@ -127,7 +127,7 @@ void vtime_account_user(struct task_struct *tsk)   * Update process times based on virtual cpu times stored by entry.S   * to the lowcore fields user_timer, system_timer & steal_clock.   */ -void vtime_account(struct task_struct *tsk) +void vtime_account_irq_enter(struct task_struct *tsk)  {  	struct thread_info *ti = task_thread_info(tsk);  	u64 timer, system; @@ -145,10 +145,10 @@ void vtime_account(struct task_struct *tsk)  	virt_timer_forward(system);  } -EXPORT_SYMBOL_GPL(vtime_account); +EXPORT_SYMBOL_GPL(vtime_account_irq_enter);  void vtime_account_system(struct task_struct *tsk) -__attribute__((alias("vtime_account"))); +__attribute__((alias("vtime_account_irq_enter")));  EXPORT_SYMBOL_GPL(vtime_account_system);  void __kprobes vtime_stop_cpu(void) diff --git a/arch/s390/kvm/interrupt.c b/arch/s390/kvm/interrupt.c index c30615e605a..82c481ddef7 100644 --- a/arch/s390/kvm/interrupt.c +++ b/arch/s390/kvm/interrupt.c @@ -408,7 +408,7 @@ int kvm_s390_handle_wait(struct kvm_vcpu *vcpu)  		return 0;  	} -	sltime = ((vcpu->arch.sie_block->ckc - now)*125)>>9; +	sltime = tod_to_ns(vcpu->arch.sie_block->ckc - now);  	hrtimer_start(&vcpu->arch.ckc_timer, ktime_set (0, sltime) , HRTIMER_MODE_REL);  	VCPU_EVENT(vcpu, 5, "enabled wait via clock comparator: %llx ns", sltime); diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c index c9011bfaabb..f090e819bf7 100644 --- a/arch/s390/kvm/kvm-s390.c +++ b/arch/s390/kvm/kvm-s390.c @@ -613,7 +613,9 @@ static int __vcpu_run(struct kvm_vcpu *vcpu)  		kvm_s390_deliver_pending_interrupts(vcpu);  	vcpu->arch.sie_block->icptcode = 0; +	preempt_disable();  	kvm_guest_enter(); +	preempt_enable();  	VCPU_EVENT(vcpu, 6, "entering sie flags %x",  		   atomic_read(&vcpu->arch.sie_block->cpuflags));  	trace_kvm_s390_sie_enter(vcpu, diff --git a/arch/s390/mm/fault.c b/arch/s390/mm/fault.c index 42601d6e166..2fb9e63b8fc 100644 --- a/arch/s390/mm/fault.c +++ b/arch/s390/mm/fault.c @@ -569,7 +569,7 @@ static void pfault_interrupt(struct ext_code ext_code,  	subcode = ext_code.subcode;  	if ((subcode & 0xff00) != __SUBCODE_MASK)  		return; -	kstat_cpu(smp_processor_id()).irqs[EXTINT_PFL]++; +	inc_irq_stat(IRQEXT_PFL);  	/* Get the token (= pid of the affected task). */  	pid = sizeof(void *) == 4 ? param32 : param64;  	rcu_read_lock(); diff --git a/arch/s390/oprofile/hwsampler.c b/arch/s390/oprofile/hwsampler.c index 0cb385da202..b5b2916895e 100644 --- a/arch/s390/oprofile/hwsampler.c +++ b/arch/s390/oprofile/hwsampler.c @@ -233,7 +233,7 @@ static void hws_ext_handler(struct ext_code ext_code,  	if (!(param32 & CPU_MF_INT_SF_MASK))  		return; -	kstat_cpu(smp_processor_id()).irqs[EXTINT_CMS]++; +	inc_irq_stat(IRQEXT_CMS);  	atomic_xchg(&cb->ext_params, atomic_read(&cb->ext_params) | param32);  	if (hws_wq) diff --git a/arch/s390/pci/pci.c b/arch/s390/pci/pci.c index 8fa416b8775..60e0372545d 100644 --- a/arch/s390/pci/pci.c +++ b/arch/s390/pci/pci.c @@ -160,35 +160,6 @@ int pci_proc_domain(struct pci_bus *bus)  }  EXPORT_SYMBOL_GPL(pci_proc_domain); -/* Store PCI function information block */ -static int zpci_store_fib(struct zpci_dev *zdev, u8 *fc) -{ -	struct zpci_fib *fib; -	u8 status, cc; - -	fib = (void *) get_zeroed_page(GFP_KERNEL); -	if (!fib) -		return -ENOMEM; - -	do { -		cc = __stpcifc(zdev->fh, 0, fib, &status); -		if (cc == 2) { -			msleep(ZPCI_INSN_BUSY_DELAY); -			memset(fib, 0, PAGE_SIZE); -		} -	} while (cc == 2); - -	if (cc) -		pr_err_once("%s: cc: %u  status: %u\n", -			    __func__, cc, status); - -	/* Return PCI function controls */ -	*fc = fib->fc; - -	free_page((unsigned long) fib); -	return (cc) ? -EIO : 0; -} -  /* Modify PCI: Register adapter interruptions */  static int zpci_register_airq(struct zpci_dev *zdev, unsigned int aisb,  			      u64 aibv) @@ -385,7 +356,7 @@ unsigned int probe_irq_mask(unsigned long val)  }  EXPORT_SYMBOL_GPL(probe_irq_mask); -void __devinit pcibios_fixup_bus(struct pci_bus *bus) +void pcibios_fixup_bus(struct pci_bus *bus)  {  } @@ -469,7 +440,7 @@ static void zpci_irq_handler(void *dont, void *need)  	int rescan = 0, max = aisb_max;  	struct zdev_irq_map *imap; -	kstat_cpu(smp_processor_id()).irqs[IOINT_PCI]++; +	inc_irq_stat(IRQIO_PCI);  	sbit = start;  scan: @@ -481,7 +452,7 @@ scan:  		/* find vector bit */  		imap = bucket->imap[sbit];  		for_each_set_bit_left(mbit, &imap->aibv, imap->msi_vecs) { -			kstat_cpu(smp_processor_id()).irqs[IOINT_MSI]++; +			inc_irq_stat(IRQIO_MSI);  			clear_bit(63 - mbit, &imap->aibv);  			spin_lock(&imap->lock); diff --git a/arch/s390/pci/pci_dma.c b/arch/s390/pci/pci_dma.c index 6138468b420..a547419907c 100644 --- a/arch/s390/pci/pci_dma.c +++ b/arch/s390/pci/pci_dma.c @@ -13,8 +13,6 @@  #include <linux/pci.h>  #include <asm/pci_dma.h> -static enum zpci_ioat_dtype zpci_ioat_dt = ZPCI_IOTA_RTTO; -  static struct kmem_cache *dma_region_table_cache;  static struct kmem_cache *dma_page_table_cache; diff --git a/arch/score/mm/cache.c b/arch/score/mm/cache.c index b25e9574360..f85ec1a7c88 100644 --- a/arch/score/mm/cache.c +++ b/arch/score/mm/cache.c @@ -113,7 +113,7 @@ static inline void setup_protection_map(void)  	protection_map[15] = PAGE_SHARED;  } -void __devinit cpu_cache_init(void) +void cpu_cache_init(void)  {  	setup_protection_map();  } diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig index babc2b826c5..9c833c58587 100644 --- a/arch/sh/Kconfig +++ b/arch/sh/Kconfig @@ -11,7 +11,6 @@ config SUPERH  	select HAVE_ARCH_TRACEHOOK  	select HAVE_DMA_API_DEBUG  	select HAVE_DMA_ATTRS -	select HAVE_IRQ_WORK  	select HAVE_PERF_EVENTS  	select HAVE_DEBUG_BUGVERBOSE  	select ARCH_HAVE_CUSTOM_GPIO_H @@ -91,9 +90,6 @@ config GENERIC_CSUM  config GENERIC_HWEIGHT  	def_bool y -config IRQ_PER_CPU -	def_bool y -  config GENERIC_GPIO  	def_bool n diff --git a/arch/sh/boards/mach-ecovec24/setup.c b/arch/sh/boards/mach-ecovec24/setup.c index 3fede4556c9..a0fa5791cd4 100644 --- a/arch/sh/boards/mach-ecovec24/setup.c +++ b/arch/sh/boards/mach-ecovec24/setup.c @@ -70,6 +70,16 @@   *                                  OFF-ON : MMC   */ +/* + * FSI - DA7210 + * + * it needs amixer settings for playing + * + * amixer set 'HeadPhone' 80 + * amixer set 'Out Mixer Left DAC Left' on + * amixer set 'Out Mixer Right DAC Right' on + */ +  /* Heartbeat */  static unsigned char led_pos[] = { 0, 1, 2, 3 }; diff --git a/arch/sh/drivers/pci/fixups-dreamcast.c b/arch/sh/drivers/pci/fixups-dreamcast.c index a5fe1b54c95..d6cde700e31 100644 --- a/arch/sh/drivers/pci/fixups-dreamcast.c +++ b/arch/sh/drivers/pci/fixups-dreamcast.c @@ -28,7 +28,7 @@  #include <asm/irq.h>  #include <mach/pci.h> -static void __devinit gapspci_fixup_resources(struct pci_dev *dev) +static void gapspci_fixup_resources(struct pci_dev *dev)  {  	struct pci_channel *p = dev->sysdata; diff --git a/arch/sh/drivers/pci/pci.c b/arch/sh/drivers/pci/pci.c index 81e5dafed3e..102f5d58b03 100644 --- a/arch/sh/drivers/pci/pci.c +++ b/arch/sh/drivers/pci/pci.c @@ -32,7 +32,7 @@ static struct pci_channel *hose_head, **hose_tail = &hose_head;  static int pci_initialized; -static void __devinit pcibios_scanbus(struct pci_channel *hose) +static void pcibios_scanbus(struct pci_channel *hose)  {  	static int next_busno;  	static int need_domain_info; @@ -82,7 +82,7 @@ static void __devinit pcibios_scanbus(struct pci_channel *hose)  DEFINE_RAW_SPINLOCK(pci_config_lock);  static DEFINE_MUTEX(pci_scan_mutex); -int __devinit register_pci_controller(struct pci_channel *hose) +int register_pci_controller(struct pci_channel *hose)  {  	int i; @@ -156,7 +156,7 @@ subsys_initcall(pcibios_init);   *  Called after each bus is probed, but before its children   *  are examined.   */ -void __devinit pcibios_fixup_bus(struct pci_bus *bus) +void pcibios_fixup_bus(struct pci_bus *bus)  {  } diff --git a/arch/sh/drivers/pci/pcie-sh7786.c b/arch/sh/drivers/pci/pcie-sh7786.c index 9e702f2f804..c2c85f6cd73 100644 --- a/arch/sh/drivers/pci/pcie-sh7786.c +++ b/arch/sh/drivers/pci/pcie-sh7786.c @@ -132,7 +132,7 @@ static struct clk fixed_pciexclkp = {  	.rate = 100000000,	/* 100 MHz reference clock */  }; -static void __devinit sh7786_pci_fixup(struct pci_dev *dev) +static void sh7786_pci_fixup(struct pci_dev *dev)  {  	/*  	 * Prevent enumeration of root complex resources. diff --git a/arch/sh/include/asm/elf.h b/arch/sh/include/asm/elf.h index 37924afa8d8..bf9f44f17c2 100644 --- a/arch/sh/include/asm/elf.h +++ b/arch/sh/include/asm/elf.h @@ -203,9 +203,9 @@ extern void __kernel_vsyscall;  	if (vdso_enabled)					\  		NEW_AUX_ENT(AT_SYSINFO_EHDR, VDSO_BASE);	\  	else							\ -		NEW_AUX_ENT(AT_IGNORE, 0); +		NEW_AUX_ENT(AT_IGNORE, 0)  #else -#define VSYSCALL_AUX_ENT +#define VSYSCALL_AUX_ENT	NEW_AUX_ENT(AT_IGNORE, 0)  #endif /* CONFIG_VSYSCALL */  #ifdef CONFIG_SH_FPU diff --git a/arch/sh/include/asm/processor_32.h b/arch/sh/include/asm/processor_32.h index b1320d55ca3..e699a12cdcc 100644 --- a/arch/sh/include/asm/processor_32.h +++ b/arch/sh/include/asm/processor_32.h @@ -39,7 +39,7 @@  /* This decides where the kernel will search for a free chunk of vm   * space during mmap's.   */ -#define TASK_UNMAPPED_BASE	(TASK_SIZE / 3) +#define TASK_UNMAPPED_BASE	PAGE_ALIGN(TASK_SIZE / 3)  /*   * Bit of SR register diff --git a/arch/sh/include/asm/processor_64.h b/arch/sh/include/asm/processor_64.h index 1ee8946f095..1cc7d319714 100644 --- a/arch/sh/include/asm/processor_64.h +++ b/arch/sh/include/asm/processor_64.h @@ -47,7 +47,7 @@ pc; })  /* This decides where the kernel will search for a free chunk of vm   * space during mmap's.   */ -#define TASK_UNMAPPED_BASE	(TASK_SIZE / 3) +#define TASK_UNMAPPED_BASE	PAGE_ALIGN(TASK_SIZE / 3)  /*   * Bit of SR register diff --git a/arch/sh/include/uapi/asm/unistd_32.h b/arch/sh/include/uapi/asm/unistd_32.h index 9e465f246dc..d13a1d62373 100644 --- a/arch/sh/include/uapi/asm/unistd_32.h +++ b/arch/sh/include/uapi/asm/unistd_32.h @@ -379,7 +379,8 @@  #define __NR_process_vm_readv	365  #define __NR_process_vm_writev	366  #define __NR_kcmp		367 +#define __NR_finit_module	368 -#define NR_syscalls 368 +#define NR_syscalls 369  #endif /* __ASM_SH_UNISTD_32_H */ diff --git a/arch/sh/include/uapi/asm/unistd_64.h b/arch/sh/include/uapi/asm/unistd_64.h index 8e3a2edd284..e6820c86e8c 100644 --- a/arch/sh/include/uapi/asm/unistd_64.h +++ b/arch/sh/include/uapi/asm/unistd_64.h @@ -399,7 +399,8 @@  #define __NR_process_vm_readv	376  #define __NR_process_vm_writev	377  #define __NR_kcmp		378 +#define __NR_finit_module	379 -#define NR_syscalls 379 +#define NR_syscalls 380  #endif /* __ASM_SH_UNISTD_64_H */ diff --git a/arch/sh/kernel/syscalls_32.S b/arch/sh/kernel/syscalls_32.S index fe97ae5e56f..734234be2f0 100644 --- a/arch/sh/kernel/syscalls_32.S +++ b/arch/sh/kernel/syscalls_32.S @@ -385,3 +385,4 @@ ENTRY(sys_call_table)  	.long sys_process_vm_readv	/* 365 */  	.long sys_process_vm_writev  	.long sys_kcmp +	.long sys_finit_module diff --git a/arch/sh/kernel/syscalls_64.S b/arch/sh/kernel/syscalls_64.S index 5c7b1c67bdc..579fcb9a896 100644 --- a/arch/sh/kernel/syscalls_64.S +++ b/arch/sh/kernel/syscalls_64.S @@ -405,3 +405,4 @@ sys_call_table:  	.long sys_process_vm_readv  	.long sys_process_vm_writev  	.long sys_kcmp +	.long sys_finit_module diff --git a/arch/sh/lib/mcount.S b/arch/sh/lib/mcount.S index 60164e65d66..52aa2011d75 100644 --- a/arch/sh/lib/mcount.S +++ b/arch/sh/lib/mcount.S @@ -294,6 +294,8 @@ stack_panic:  	.align 2  .L_init_thread_union:  	.long	init_thread_union +.L_ebss: +	.long	__bss_stop  .Lpanic:  	.long	panic  .Lpanic_s: diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig index 9f2edb5c555..9bff3db17c8 100644 --- a/arch/sparc/Kconfig +++ b/arch/sparc/Kconfig @@ -23,7 +23,6 @@ config SPARC  	select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE  	select RTC_CLASS  	select RTC_DRV_M48T59 -	select HAVE_IRQ_WORK  	select HAVE_DMA_ATTRS  	select HAVE_DMA_API_DEBUG  	select HAVE_ARCH_JUMP_LABEL @@ -61,6 +60,7 @@ config SPARC64  	select HAVE_MEMBLOCK  	select HAVE_MEMBLOCK_NODE_MAP  	select HAVE_SYSCALL_WRAPPERS +	select HAVE_ARCH_TRANSPARENT_HUGEPAGE  	select HAVE_DYNAMIC_FTRACE  	select HAVE_FTRACE_MCOUNT_RECORD  	select HAVE_SYSCALL_TRACEPOINTS diff --git a/arch/sparc/include/asm/parport.h b/arch/sparc/include/asm/parport.h index cb33608cc68..c55291e5b83 100644 --- a/arch/sparc/include/asm/parport.h +++ b/arch/sparc/include/asm/parport.h @@ -103,7 +103,7 @@ static inline unsigned int get_dma_residue(unsigned int dmanr)  	return ebus_dma_residue(&sparc_ebus_dmas[dmanr].info);  } -static int __devinit ecpp_probe(struct platform_device *op) +static int ecpp_probe(struct platform_device *op)  {  	unsigned long base = op->resource[0].start;  	unsigned long config = op->resource[1].start; @@ -192,7 +192,7 @@ out_err:  	return err;  } -static int __devexit ecpp_remove(struct platform_device *op) +static int ecpp_remove(struct platform_device *op)  {  	struct parport *p = dev_get_drvdata(&op->dev);  	int slot = p->dma; @@ -242,7 +242,7 @@ static struct platform_driver ecpp_driver = {  		.of_match_table = ecpp_match,  	},  	.probe			= ecpp_probe, -	.remove			= __devexit_p(ecpp_remove), +	.remove			= ecpp_remove,  };  static int parport_pc_find_nonpci_ports(int autoirq, int autodma) diff --git a/arch/sparc/include/asm/pgtable_64.h b/arch/sparc/include/asm/pgtable_64.h index 7870be0f5ad..08fcce90316 100644 --- a/arch/sparc/include/asm/pgtable_64.h +++ b/arch/sparc/include/asm/pgtable_64.h @@ -71,7 +71,6 @@  #define PMD_PADDR	_AC(0xfffffffe,UL)  #define PMD_PADDR_SHIFT	_AC(11,UL) -#ifdef CONFIG_TRANSPARENT_HUGEPAGE  #define PMD_ISHUGE	_AC(0x00000001,UL)  /* This is the PMD layout when PMD_ISHUGE is set.  With 4MB huge @@ -86,7 +85,6 @@  #define PMD_HUGE_ACCESSED	_AC(0x00000080,UL)  #define PMD_HUGE_EXEC		_AC(0x00000040,UL)  #define PMD_HUGE_SPLITTING	_AC(0x00000020,UL) -#endif  /* PGDs point to PMD tables which are 8K aligned.  */  #define PGD_PADDR	_AC(0xfffffffc,UL) @@ -628,6 +626,12 @@ static inline unsigned long pte_special(pte_t pte)  	return pte_val(pte) & _PAGE_SPECIAL;  } +static inline int pmd_large(pmd_t pmd) +{ +	return (pmd_val(pmd) & (PMD_ISHUGE | PMD_HUGE_PRESENT)) == +		(PMD_ISHUGE | PMD_HUGE_PRESENT); +} +  #ifdef CONFIG_TRANSPARENT_HUGEPAGE  static inline int pmd_young(pmd_t pmd)  { @@ -646,12 +650,6 @@ static inline unsigned long pmd_pfn(pmd_t pmd)  	return val >> (PAGE_SHIFT - PMD_PADDR_SHIFT);  } -static inline int pmd_large(pmd_t pmd) -{ -	return (pmd_val(pmd) & (PMD_ISHUGE | PMD_HUGE_PRESENT)) == -		(PMD_ISHUGE | PMD_HUGE_PRESENT); -} -  static inline int pmd_trans_splitting(pmd_t pmd)  {  	return (pmd_val(pmd) & (PMD_ISHUGE|PMD_HUGE_SPLITTING)) == diff --git a/arch/sparc/include/asm/timer_64.h b/arch/sparc/include/asm/timer_64.h index ef3c3682deb..01197d8215c 100644 --- a/arch/sparc/include/asm/timer_64.h +++ b/arch/sparc/include/asm/timer_64.h @@ -24,7 +24,7 @@ struct sparc64_tick_ops {  extern struct sparc64_tick_ops *tick_ops;  extern unsigned long sparc64_get_clock_tick(unsigned int cpu); -extern void __devinit setup_sparc64_timer(void); +extern void setup_sparc64_timer(void);  extern void __init time_init(void);  #endif /* _SPARC64_TIMER_H */ diff --git a/arch/sparc/include/uapi/asm/unistd.h b/arch/sparc/include/uapi/asm/unistd.h index cac719d1bc5..62ced589bcf 100644 --- a/arch/sparc/include/uapi/asm/unistd.h +++ b/arch/sparc/include/uapi/asm/unistd.h @@ -407,8 +407,9 @@  #define __NR_process_vm_writev	339  #define __NR_kern_features	340  #define __NR_kcmp		341 +#define __NR_finit_module	342 -#define NR_syscalls		342 +#define NR_syscalls		343  /* Bitmask values returned from kern_features system call.  */  #define KERN_FEATURE_MIXED_MODE_STACK	0x00000001 diff --git a/arch/sparc/kernel/apc.c b/arch/sparc/kernel/apc.c index 812e10bbb0b..348fa1aeabc 100644 --- a/arch/sparc/kernel/apc.c +++ b/arch/sparc/kernel/apc.c @@ -31,7 +31,7 @@  #define APC_DEVNAME "apc"  static u8 __iomem *regs; -static int apc_no_idle __devinitdata = 0; +static int apc_no_idle = 0;  #define apc_readb(offs)		(sbus_readb(regs+offs))  #define apc_writeb(val, offs) 	(sbus_writeb(val, regs+offs)) @@ -138,7 +138,7 @@ static const struct file_operations apc_fops = {  static struct miscdevice apc_miscdev = { APC_MINOR, APC_DEVNAME, &apc_fops }; -static int __devinit apc_probe(struct platform_device *op) +static int apc_probe(struct platform_device *op)  {  	int err; diff --git a/arch/sparc/kernel/auxio_64.c b/arch/sparc/kernel/auxio_64.c index 773091ac71a..86e55778e4a 100644 --- a/arch/sparc/kernel/auxio_64.c +++ b/arch/sparc/kernel/auxio_64.c @@ -102,7 +102,7 @@ static const struct of_device_id auxio_match[] = {  MODULE_DEVICE_TABLE(of, auxio_match); -static int __devinit auxio_probe(struct platform_device *dev) +static int auxio_probe(struct platform_device *dev)  {  	struct device_node *dp = dev->dev.of_node;  	unsigned long size; diff --git a/arch/sparc/kernel/central.c b/arch/sparc/kernel/central.c index 9708851a8b9..052b5a44318 100644 --- a/arch/sparc/kernel/central.c +++ b/arch/sparc/kernel/central.c @@ -33,7 +33,7 @@ struct fhc {  	struct platform_device	leds_pdev;  }; -static int __devinit clock_board_calc_nslots(struct clock_board *p) +static int clock_board_calc_nslots(struct clock_board *p)  {  	u8 reg = upa_readb(p->clock_regs + CLOCK_STAT1) & 0xc0; @@ -60,7 +60,7 @@ static int __devinit clock_board_calc_nslots(struct clock_board *p)  	}  } -static int __devinit clock_board_probe(struct platform_device *op) +static int clock_board_probe(struct platform_device *op)  {  	struct clock_board *p = kzalloc(sizeof(*p), GFP_KERNEL);  	int err = -ENOMEM; @@ -157,7 +157,7 @@ static struct platform_driver clock_board_driver = {  	},  }; -static int __devinit fhc_probe(struct platform_device *op) +static int fhc_probe(struct platform_device *op)  {  	struct fhc *p = kzalloc(sizeof(*p), GFP_KERNEL);  	int err = -ENOMEM; diff --git a/arch/sparc/kernel/chmc.c b/arch/sparc/kernel/chmc.c index 5f450260981..dbb210d74e2 100644 --- a/arch/sparc/kernel/chmc.c +++ b/arch/sparc/kernel/chmc.c @@ -336,9 +336,9 @@ static int jbusmc_print_dimm(int syndrome_code,  	return 0;  } -static u64 __devinit jbusmc_dimm_group_size(u64 base, -					    const struct linux_prom64_registers *mem_regs, -					    int num_mem_regs) +static u64 jbusmc_dimm_group_size(u64 base, +				  const struct linux_prom64_registers *mem_regs, +				  int num_mem_regs)  {  	u64 max = base + (8UL * 1024 * 1024 * 1024);  	u64 max_seen = base; @@ -363,10 +363,10 @@ static u64 __devinit jbusmc_dimm_group_size(u64 base,  	return max_seen - base;  } -static void __devinit jbusmc_construct_one_dimm_group(struct jbusmc *p, -						      unsigned long index, -						      const struct linux_prom64_registers *mem_regs, -						      int num_mem_regs) +static void jbusmc_construct_one_dimm_group(struct jbusmc *p, +					    unsigned long index, +					    const struct linux_prom64_registers *mem_regs, +					    int num_mem_regs)  {  	struct jbusmc_dimm_group *dp = &p->dimm_groups[index]; @@ -378,9 +378,9 @@ static void __devinit jbusmc_construct_one_dimm_group(struct jbusmc *p,  	dp->size = jbusmc_dimm_group_size(dp->base_addr, mem_regs, num_mem_regs);  } -static void __devinit jbusmc_construct_dimm_groups(struct jbusmc *p, -						   const struct linux_prom64_registers *mem_regs, -						   int num_mem_regs) +static void jbusmc_construct_dimm_groups(struct jbusmc *p, +					 const struct linux_prom64_registers *mem_regs, +					 int num_mem_regs)  {  	if (p->mc_reg_1 & JB_MC_REG1_DIMM1_BANK0) {  		jbusmc_construct_one_dimm_group(p, 0, mem_regs, num_mem_regs); @@ -392,7 +392,7 @@ static void __devinit jbusmc_construct_dimm_groups(struct jbusmc *p,  	}  } -static int __devinit jbusmc_probe(struct platform_device *op) +static int jbusmc_probe(struct platform_device *op)  {  	const struct linux_prom64_registers *mem_regs;  	struct device_node *mem_node; @@ -689,7 +689,7 @@ static void chmc_fetch_decode_regs(struct chmc *p)  				      chmc_read_mcreg(p, CHMCTRL_DECODE4));  } -static int __devinit chmc_probe(struct platform_device *op) +static int chmc_probe(struct platform_device *op)  {  	struct device_node *dp = op->dev.of_node;  	unsigned long ver; @@ -763,7 +763,7 @@ out_free:  	goto out;  } -static int __devinit us3mc_probe(struct platform_device *op) +static int us3mc_probe(struct platform_device *op)  {  	if (mc_type == MC_TYPE_SAFARI)  		return chmc_probe(op); @@ -772,21 +772,21 @@ static int __devinit us3mc_probe(struct platform_device *op)  	return -ENODEV;  } -static void __devexit chmc_destroy(struct platform_device *op, struct chmc *p) +static void chmc_destroy(struct platform_device *op, struct chmc *p)  {  	list_del(&p->list);  	of_iounmap(&op->resource[0], p->regs, 0x48);  	kfree(p);  } -static void __devexit jbusmc_destroy(struct platform_device *op, struct jbusmc *p) +static void jbusmc_destroy(struct platform_device *op, struct jbusmc *p)  {  	mc_list_del(&p->list);  	of_iounmap(&op->resource[0], p->regs, JBUSMC_REGS_SIZE);  	kfree(p);  } -static int __devexit us3mc_remove(struct platform_device *op) +static int us3mc_remove(struct platform_device *op)  {  	void *p = dev_get_drvdata(&op->dev); @@ -814,7 +814,7 @@ static struct platform_driver us3mc_driver = {  		.of_match_table = us3mc_match,  	},  	.probe		= us3mc_probe, -	.remove		= __devexit_p(us3mc_remove), +	.remove		= us3mc_remove,  };  static inline bool us3mc_platform(void) diff --git a/arch/sparc/kernel/ds.c b/arch/sparc/kernel/ds.c index f09257c8610..75bb608c423 100644 --- a/arch/sparc/kernel/ds.c +++ b/arch/sparc/kernel/ds.c @@ -29,7 +29,7 @@  #define DRV_MODULE_VERSION	"1.0"  #define DRV_MODULE_RELDATE	"Jul 11, 2007" -static char version[] __devinitdata = +static char version[] =  	DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n";  MODULE_AUTHOR("David S. Miller (davem@davemloft.net)");  MODULE_DESCRIPTION("Sun LDOM domain services driver"); @@ -1146,8 +1146,7 @@ static void ds_event(void *arg, int event)  	spin_unlock_irqrestore(&ds_lock, flags);  } -static int __devinit ds_probe(struct vio_dev *vdev, -			      const struct vio_device_id *id) +static int ds_probe(struct vio_dev *vdev, const struct vio_device_id *id)  {  	static int ds_version_printed;  	struct ldc_channel_config ds_cfg = { diff --git a/arch/sparc/kernel/ldc.c b/arch/sparc/kernel/ldc.c index 81d92fc9983..9fcc6b4e93b 100644 --- a/arch/sparc/kernel/ldc.c +++ b/arch/sparc/kernel/ldc.c @@ -27,7 +27,7 @@  #define DRV_MODULE_VERSION	"1.1"  #define DRV_MODULE_RELDATE	"July 22, 2008" -static char version[] __devinitdata = +static char version[] =  	DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n";  #define LDC_PACKET_SIZE		64 diff --git a/arch/sparc/kernel/leon_pci.c b/arch/sparc/kernel/leon_pci.c index fc052116156..852dc843052 100644 --- a/arch/sparc/kernel/leon_pci.c +++ b/arch/sparc/kernel/leon_pci.c @@ -43,7 +43,7 @@ void leon_pci_init(struct platform_device *ofdev, struct leon_pci_info *info)  	}  } -void __devinit pcibios_fixup_bus(struct pci_bus *pbus) +void pcibios_fixup_bus(struct pci_bus *pbus)  {  	struct pci_dev *dev;  	int i, has_io, has_mem; diff --git a/arch/sparc/kernel/leon_pci_grpci2.c b/arch/sparc/kernel/leon_pci_grpci2.c index b1bc38853a3..fc4320886a3 100644 --- a/arch/sparc/kernel/leon_pci_grpci2.c +++ b/arch/sparc/kernel/leon_pci_grpci2.c @@ -668,7 +668,7 @@ static irqreturn_t grpci2_err_interrupt(int irq, void *arg)  	return IRQ_HANDLED;  } -static int __devinit grpci2_of_probe(struct platform_device *ofdev) +static int grpci2_of_probe(struct platform_device *ofdev)  {  	struct grpci2_regs *regs;  	struct grpci2_priv *priv; diff --git a/arch/sparc/kernel/pci.c b/arch/sparc/kernel/pci.c index 75b31bcdead..baf4366e2d6 100644 --- a/arch/sparc/kernel/pci.c +++ b/arch/sparc/kernel/pci.c @@ -356,7 +356,7 @@ static struct pci_dev *of_create_pci_dev(struct pci_pbm_info *pbm,  	return dev;  } -static void __devinit apb_calc_first_last(u8 map, u32 *first_p, u32 *last_p) +static void apb_calc_first_last(u8 map, u32 *first_p, u32 *last_p)  {  	u32 idx, first, last; @@ -378,9 +378,9 @@ static void __devinit apb_calc_first_last(u8 map, u32 *first_p, u32 *last_p)  /* Cook up fake bus resources for SUNW,simba PCI bridges which lack   * a proper 'ranges' property.   */ -static void __devinit apb_fake_ranges(struct pci_dev *dev, -				      struct pci_bus *bus, -				      struct pci_pbm_info *pbm) +static void apb_fake_ranges(struct pci_dev *dev, +			    struct pci_bus *bus, +			    struct pci_pbm_info *pbm)  {  	struct pci_bus_region region;  	struct resource *res; @@ -404,15 +404,15 @@ static void __devinit apb_fake_ranges(struct pci_dev *dev,  	pcibios_bus_to_resource(dev, res, ®ion);  } -static void __devinit pci_of_scan_bus(struct pci_pbm_info *pbm, -				      struct device_node *node, -				      struct pci_bus *bus); +static void pci_of_scan_bus(struct pci_pbm_info *pbm, +			    struct device_node *node, +			    struct pci_bus *bus);  #define GET_64BIT(prop, i)	((((u64) (prop)[(i)]) << 32) | (prop)[(i)+1]) -static void __devinit of_scan_pci_bridge(struct pci_pbm_info *pbm, -					 struct device_node *node, -					 struct pci_dev *dev) +static void of_scan_pci_bridge(struct pci_pbm_info *pbm, +			       struct device_node *node, +			       struct pci_dev *dev)  {  	struct pci_bus *bus;  	const u32 *busrange, *ranges; @@ -503,9 +503,9 @@ after_ranges:  	pci_of_scan_bus(pbm, node, bus);  } -static void __devinit pci_of_scan_bus(struct pci_pbm_info *pbm, -				      struct device_node *node, -				      struct pci_bus *bus) +static void pci_of_scan_bus(struct pci_pbm_info *pbm, +			    struct device_node *node, +			    struct pci_bus *bus)  {  	struct device_node *child;  	const u32 *reg; @@ -564,7 +564,7 @@ show_pciobppath_attr(struct device * dev, struct device_attribute * attr, char *  static DEVICE_ATTR(obppath, S_IRUSR | S_IRGRP | S_IROTH, show_pciobppath_attr, NULL); -static void __devinit pci_bus_register_of_sysfs(struct pci_bus *bus) +static void pci_bus_register_of_sysfs(struct pci_bus *bus)  {  	struct pci_dev *dev;  	struct pci_bus *child_bus; @@ -585,8 +585,8 @@ static void __devinit pci_bus_register_of_sysfs(struct pci_bus *bus)  		pci_bus_register_of_sysfs(child_bus);  } -struct pci_bus * __devinit pci_scan_one_pbm(struct pci_pbm_info *pbm, -					    struct device *parent) +struct pci_bus *pci_scan_one_pbm(struct pci_pbm_info *pbm, +				 struct device *parent)  {  	LIST_HEAD(resources);  	struct device_node *node = pbm->op->dev.of_node; @@ -618,7 +618,7 @@ struct pci_bus * __devinit pci_scan_one_pbm(struct pci_pbm_info *pbm,  	return bus;  } -void __devinit pcibios_fixup_bus(struct pci_bus *pbus) +void pcibios_fixup_bus(struct pci_bus *pbus)  {  } @@ -949,8 +949,7 @@ static int __init pcibios_init(void)  subsys_initcall(pcibios_init);  #ifdef CONFIG_SYSFS -static void __devinit pci_bus_slot_names(struct device_node *node, -					 struct pci_bus *bus) +static void pci_bus_slot_names(struct device_node *node, struct pci_bus *bus)  {  	const struct pci_slot_names {  		u32	slot_mask; diff --git a/arch/sparc/kernel/pci_fire.c b/arch/sparc/kernel/pci_fire.c index 188f935276f..e60fc6a67e9 100644 --- a/arch/sparc/kernel/pci_fire.c +++ b/arch/sparc/kernel/pci_fire.c @@ -408,8 +408,8 @@ static void pci_fire_hw_init(struct pci_pbm_info *pbm)  	upa_writeq(~(u64)0, pbm->pbm_regs + FIRE_PEC_IENAB);  } -static int __devinit pci_fire_pbm_init(struct pci_pbm_info *pbm, -				       struct platform_device *op, u32 portid) +static int pci_fire_pbm_init(struct pci_pbm_info *pbm, +			     struct platform_device *op, u32 portid)  {  	const struct linux_prom64_registers *regs;  	struct device_node *dp = op->dev.of_node; @@ -454,7 +454,7 @@ static int __devinit pci_fire_pbm_init(struct pci_pbm_info *pbm,  	return 0;  } -static int __devinit fire_probe(struct platform_device *op) +static int fire_probe(struct platform_device *op)  {  	struct device_node *dp = op->dev.of_node;  	struct pci_pbm_info *pbm; diff --git a/arch/sparc/kernel/pci_psycho.c b/arch/sparc/kernel/pci_psycho.c index f4d29e15ce7..c647634ead2 100644 --- a/arch/sparc/kernel/pci_psycho.c +++ b/arch/sparc/kernel/pci_psycho.c @@ -366,8 +366,8 @@ static void pbm_config_busmastering(struct pci_pbm_info *pbm)  	pci_config_write8(addr, 64);  } -static void __devinit psycho_scan_bus(struct pci_pbm_info *pbm, -				      struct device *parent) +static void psycho_scan_bus(struct pci_pbm_info *pbm, +			    struct device *parent)  {  	pbm_config_busmastering(pbm);  	pbm->is_66mhz_capable = 0; @@ -483,15 +483,15 @@ static void psycho_pbm_strbuf_init(struct pci_pbm_info *pbm,  #define PSYCHO_MEMSPACE_B	0x180000000UL  #define PSYCHO_MEMSPACE_SIZE	0x07fffffffUL -static void __devinit psycho_pbm_init(struct pci_pbm_info *pbm, -				      struct platform_device *op, int is_pbm_a) +static void psycho_pbm_init(struct pci_pbm_info *pbm, +			    struct platform_device *op, int is_pbm_a)  {  	psycho_pbm_init_common(pbm, op, "PSYCHO", PBM_CHIP_TYPE_PSYCHO);  	psycho_pbm_strbuf_init(pbm, is_pbm_a);  	psycho_scan_bus(pbm, &op->dev);  } -static struct pci_pbm_info * __devinit psycho_find_sibling(u32 upa_portid) +static struct pci_pbm_info *psycho_find_sibling(u32 upa_portid)  {  	struct pci_pbm_info *pbm; @@ -504,7 +504,7 @@ static struct pci_pbm_info * __devinit psycho_find_sibling(u32 upa_portid)  #define PSYCHO_CONFIGSPACE	0x001000000UL -static int __devinit psycho_probe(struct platform_device *op) +static int psycho_probe(struct platform_device *op)  {  	const struct linux_prom64_registers *pr_regs;  	struct device_node *dp = op->dev.of_node; diff --git a/arch/sparc/kernel/pci_sabre.c b/arch/sparc/kernel/pci_sabre.c index 3efaa4644d6..6f00d27e8da 100644 --- a/arch/sparc/kernel/pci_sabre.c +++ b/arch/sparc/kernel/pci_sabre.c @@ -403,8 +403,7 @@ static void apb_init(struct pci_bus *sabre_bus)  	}  } -static void __devinit sabre_scan_bus(struct pci_pbm_info *pbm, -				     struct device *parent) +static void sabre_scan_bus(struct pci_pbm_info *pbm, struct device *parent)  {  	static int once; @@ -443,8 +442,8 @@ static void __devinit sabre_scan_bus(struct pci_pbm_info *pbm,  	sabre_register_error_handlers(pbm);  } -static void __devinit sabre_pbm_init(struct pci_pbm_info *pbm, -				     struct platform_device *op) +static void sabre_pbm_init(struct pci_pbm_info *pbm, +			   struct platform_device *op)  {  	psycho_pbm_init_common(pbm, op, "SABRE", PBM_CHIP_TYPE_SABRE);  	pbm->pci_afsr = pbm->controller_regs + SABRE_PIOAFSR; @@ -454,7 +453,7 @@ static void __devinit sabre_pbm_init(struct pci_pbm_info *pbm,  }  static const struct of_device_id sabre_match[]; -static int __devinit sabre_probe(struct platform_device *op) +static int sabre_probe(struct platform_device *op)  {  	const struct of_device_id *match;  	const struct linux_prom64_registers *pr_regs; diff --git a/arch/sparc/kernel/pci_schizo.c b/arch/sparc/kernel/pci_schizo.c index 13d4aa20b5a..8f76f23dac3 100644 --- a/arch/sparc/kernel/pci_schizo.c +++ b/arch/sparc/kernel/pci_schizo.c @@ -1064,8 +1064,7 @@ static void pbm_config_busmastering(struct pci_pbm_info *pbm)  	pci_config_write8(addr, 64);  } -static void __devinit schizo_scan_bus(struct pci_pbm_info *pbm, -				      struct device *parent) +static void schizo_scan_bus(struct pci_pbm_info *pbm, struct device *parent)  {  	pbm_config_busmastering(pbm);  	pbm->is_66mhz_capable = @@ -1307,9 +1306,9 @@ static void schizo_pbm_hw_init(struct pci_pbm_info *pbm)  	}  } -static int __devinit schizo_pbm_init(struct pci_pbm_info *pbm, -				     struct platform_device *op, u32 portid, -				     int chip_type) +static int schizo_pbm_init(struct pci_pbm_info *pbm, +			   struct platform_device *op, u32 portid, +			   int chip_type)  {  	const struct linux_prom64_registers *regs;  	struct device_node *dp = op->dev.of_node; @@ -1400,8 +1399,7 @@ static inline int portid_compare(u32 x, u32 y, int chip_type)  	return (x == y);  } -static struct pci_pbm_info * __devinit schizo_find_sibling(u32 portid, -							   int chip_type) +static struct pci_pbm_info *schizo_find_sibling(u32 portid, int chip_type)  {  	struct pci_pbm_info *pbm; @@ -1412,7 +1410,7 @@ static struct pci_pbm_info * __devinit schizo_find_sibling(u32 portid,  	return NULL;  } -static int __devinit __schizo_init(struct platform_device *op, unsigned long chip_type) +static int __schizo_init(struct platform_device *op, unsigned long chip_type)  {  	struct device_node *dp = op->dev.of_node;  	struct pci_pbm_info *pbm; @@ -1460,7 +1458,7 @@ out_err:  }  static const struct of_device_id schizo_match[]; -static int __devinit schizo_probe(struct platform_device *op) +static int schizo_probe(struct platform_device *op)  {  	const struct of_device_id *match; diff --git a/arch/sparc/kernel/pci_sun4v.c b/arch/sparc/kernel/pci_sun4v.c index 051b69caeff..d07f6b29aed 100644 --- a/arch/sparc/kernel/pci_sun4v.c +++ b/arch/sparc/kernel/pci_sun4v.c @@ -536,8 +536,7 @@ static struct dma_map_ops sun4v_dma_ops = {  	.unmap_sg			= dma_4v_unmap_sg,  }; -static void __devinit pci_sun4v_scan_bus(struct pci_pbm_info *pbm, -					 struct device *parent) +static void pci_sun4v_scan_bus(struct pci_pbm_info *pbm, struct device *parent)  {  	struct property *prop;  	struct device_node *dp; @@ -550,8 +549,8 @@ static void __devinit pci_sun4v_scan_bus(struct pci_pbm_info *pbm,  	/* XXX register error interrupt handlers XXX */  } -static unsigned long __devinit probe_existing_entries(struct pci_pbm_info *pbm, -						      struct iommu *iommu) +static unsigned long probe_existing_entries(struct pci_pbm_info *pbm, +					    struct iommu *iommu)  {  	struct iommu_arena *arena = &iommu->arena;  	unsigned long i, cnt = 0; @@ -578,7 +577,7 @@ static unsigned long __devinit probe_existing_entries(struct pci_pbm_info *pbm,  	return cnt;  } -static int __devinit pci_sun4v_iommu_init(struct pci_pbm_info *pbm) +static int pci_sun4v_iommu_init(struct pci_pbm_info *pbm)  {  	static const u32 vdma_default[] = { 0x80000000, 0x80000000 };  	struct iommu *iommu = pbm->iommu; @@ -879,8 +878,8 @@ static void pci_sun4v_msi_init(struct pci_pbm_info *pbm)  }  #endif /* !(CONFIG_PCI_MSI) */ -static int __devinit pci_sun4v_pbm_init(struct pci_pbm_info *pbm, -					struct platform_device *op, u32 devhandle) +static int pci_sun4v_pbm_init(struct pci_pbm_info *pbm, +			      struct platform_device *op, u32 devhandle)  {  	struct device_node *dp = op->dev.of_node;  	int err; @@ -919,7 +918,7 @@ static int __devinit pci_sun4v_pbm_init(struct pci_pbm_info *pbm,  	return 0;  } -static int __devinit pci_sun4v_probe(struct platform_device *op) +static int pci_sun4v_probe(struct platform_device *op)  {  	const struct linux_prom64_registers *regs;  	static int hvapi_negotiated = 0; diff --git a/arch/sparc/kernel/pcic.c b/arch/sparc/kernel/pcic.c index 521fdf1b20e..09f4fdd8d80 100644 --- a/arch/sparc/kernel/pcic.c +++ b/arch/sparc/kernel/pcic.c @@ -439,8 +439,7 @@ int pcic_present(void)  	return pcic0_up;  } -static int __devinit pdev_to_pnode(struct linux_pbm_info *pbm, -				    struct pci_dev *pdev) +static int pdev_to_pnode(struct linux_pbm_info *pbm, struct pci_dev *pdev)  {  	struct linux_prom_pci_registers regs[PROMREG_MAX];  	int err; @@ -595,7 +594,7 @@ pcic_fill_irq(struct linux_pcic *pcic, struct pci_dev *dev, int node)  /*   * Normally called from {do_}pci_scan_bus...   */ -void __devinit pcibios_fixup_bus(struct pci_bus *bus) +void pcibios_fixup_bus(struct pci_bus *bus)  {  	struct pci_dev *dev;  	int i, has_io, has_mem; diff --git a/arch/sparc/kernel/pmc.c b/arch/sparc/kernel/pmc.c index 0e3202239ff..dcbb62f6306 100644 --- a/arch/sparc/kernel/pmc.c +++ b/arch/sparc/kernel/pmc.c @@ -52,7 +52,7 @@ static void pmc_swift_idle(void)  #endif  } -static int __devinit pmc_probe(struct platform_device *op) +static int pmc_probe(struct platform_device *op)  {  	regs = of_ioremap(&op->resource[0], 0,  			  resource_size(&op->resource[0]), PMC_OBPNAME); diff --git a/arch/sparc/kernel/power.c b/arch/sparc/kernel/power.c index 0d39075063b..4cb23c41553 100644 --- a/arch/sparc/kernel/power.c +++ b/arch/sparc/kernel/power.c @@ -23,7 +23,7 @@ static irqreturn_t power_handler(int irq, void *dev_id)  	return IRQ_HANDLED;  } -static int __devinit has_button_interrupt(unsigned int irq, struct device_node *dp) +static int has_button_interrupt(unsigned int irq, struct device_node *dp)  {  	if (irq == 0xffffffff)  		return 0; @@ -33,7 +33,7 @@ static int __devinit has_button_interrupt(unsigned int irq, struct device_node *  	return 1;  } -static int __devinit power_probe(struct platform_device *op) +static int power_probe(struct platform_device *op)  {  	struct resource *res = &op->resource[0];  	unsigned int irq = op->archdata.irqs[0]; diff --git a/arch/sparc/kernel/sbus.c b/arch/sparc/kernel/sbus.c index 1271b3a27d4..be5bdf93c76 100644 --- a/arch/sparc/kernel/sbus.c +++ b/arch/sparc/kernel/sbus.c @@ -554,10 +554,8 @@ static void __init sbus_iommu_init(struct platform_device *op)  	regs = pr->phys_addr;  	iommu = kzalloc(sizeof(*iommu), GFP_ATOMIC); -	if (!iommu) -		goto fatal_memory_error;  	strbuf = kzalloc(sizeof(*strbuf), GFP_ATOMIC); -	if (!strbuf) +	if (!iommu || !strbuf)  		goto fatal_memory_error;  	op->dev.archdata.iommu = iommu; @@ -656,6 +654,8 @@ static void __init sbus_iommu_init(struct platform_device *op)  	return;  fatal_memory_error: +	kfree(iommu); +	kfree(strbuf);  	prom_printf("sbus_iommu_init: Fatal memory allocation error.\n");  } diff --git a/arch/sparc/kernel/smp_64.c b/arch/sparc/kernel/smp_64.c index d94b878577b..537eb66abd0 100644 --- a/arch/sparc/kernel/smp_64.c +++ b/arch/sparc/kernel/smp_64.c @@ -1180,7 +1180,7 @@ void __init smp_prepare_cpus(unsigned int max_cpus)  {  } -void __devinit smp_prepare_boot_cpu(void) +void smp_prepare_boot_cpu(void)  {  } @@ -1194,7 +1194,7 @@ void __init smp_setup_processor_id(void)  		xcall_deliver_impl = hypervisor_xcall_deliver;  } -void __devinit smp_fill_in_sib_core_maps(void) +void smp_fill_in_sib_core_maps(void)  {  	unsigned int i; diff --git a/arch/sparc/kernel/systbls_32.S b/arch/sparc/kernel/systbls_32.S index 5147f574f12..6ac43c36bbb 100644 --- a/arch/sparc/kernel/systbls_32.S +++ b/arch/sparc/kernel/systbls_32.S @@ -85,4 +85,4 @@ sys_call_table:  /*325*/	.long sys_pwritev, sys_rt_tgsigqueueinfo, sys_perf_event_open, sys_recvmmsg, sys_fanotify_init  /*330*/	.long sys_fanotify_mark, sys_prlimit64, sys_name_to_handle_at, sys_open_by_handle_at, sys_clock_adjtime  /*335*/	.long sys_syncfs, sys_sendmmsg, sys_setns, sys_process_vm_readv, sys_process_vm_writev -/*340*/	.long sys_ni_syscall, sys_kcmp +/*340*/	.long sys_ni_syscall, sys_kcmp, sys_finit_module diff --git a/arch/sparc/kernel/systbls_64.S b/arch/sparc/kernel/systbls_64.S index cdbd9b81775..1009ecb9267 100644 --- a/arch/sparc/kernel/systbls_64.S +++ b/arch/sparc/kernel/systbls_64.S @@ -86,7 +86,7 @@ sys_call_table32:  	.word compat_sys_pwritev, compat_sys_rt_tgsigqueueinfo, sys_perf_event_open, compat_sys_recvmmsg, sys_fanotify_init  /*330*/	.word sys32_fanotify_mark, sys_prlimit64, sys_name_to_handle_at, compat_sys_open_by_handle_at, compat_sys_clock_adjtime  	.word sys_syncfs, compat_sys_sendmmsg, sys_setns, compat_sys_process_vm_readv, compat_sys_process_vm_writev -/*340*/	.word sys_kern_features, sys_kcmp +/*340*/	.word sys_kern_features, sys_kcmp, sys_finit_module  #endif /* CONFIG_COMPAT */ @@ -164,4 +164,4 @@ sys_call_table:  	.word sys_pwritev, sys_rt_tgsigqueueinfo, sys_perf_event_open, sys_recvmmsg, sys_fanotify_init  /*330*/	.word sys_fanotify_mark, sys_prlimit64, sys_name_to_handle_at, sys_open_by_handle_at, sys_clock_adjtime  	.word sys_syncfs, sys_sendmmsg, sys_setns, sys_process_vm_readv, sys_process_vm_writev -/*340*/	.word sys_kern_features, sys_kcmp +/*340*/	.word sys_kern_features, sys_kcmp, sys_finit_module diff --git a/arch/sparc/kernel/time_32.c b/arch/sparc/kernel/time_32.c index 953641549e8..c4c27b0f906 100644 --- a/arch/sparc/kernel/time_32.c +++ b/arch/sparc/kernel/time_32.c @@ -278,7 +278,7 @@ static struct platform_device m48t59_rtc = {  	},  }; -static int __devinit clock_probe(struct platform_device *op) +static int clock_probe(struct platform_device *op)  {  	struct device_node *dp = op->dev.of_node;  	const char *model = of_get_property(dp, "model", NULL); diff --git a/arch/sparc/kernel/time_64.c b/arch/sparc/kernel/time_64.c index e861072b9c5..c3d82b5f54c 100644 --- a/arch/sparc/kernel/time_64.c +++ b/arch/sparc/kernel/time_64.c @@ -419,7 +419,7 @@ static struct platform_device rtc_cmos_device = {  	.num_resources	= 1,  }; -static int __devinit rtc_probe(struct platform_device *op) +static int rtc_probe(struct platform_device *op)  {  	struct resource *r; @@ -477,7 +477,7 @@ static struct platform_device rtc_bq4802_device = {  	.num_resources	= 1,  }; -static int __devinit bq4802_probe(struct platform_device *op) +static int bq4802_probe(struct platform_device *op)  {  	printk(KERN_INFO "%s: BQ4802 regs at 0x%llx\n", @@ -534,7 +534,7 @@ static struct platform_device m48t59_rtc = {  	},  }; -static int __devinit mostek_probe(struct platform_device *op) +static int mostek_probe(struct platform_device *op)  {  	struct device_node *dp = op->dev.of_node; @@ -746,7 +746,7 @@ void __irq_entry timer_interrupt(int irq, struct pt_regs *regs)  	set_irq_regs(old_regs);  } -void __devinit setup_sparc64_timer(void) +void setup_sparc64_timer(void)  {  	struct clock_event_device *sevt;  	unsigned long pstate; @@ -844,7 +844,7 @@ unsigned long long sched_clock(void)  		>> SPARC64_NSEC_PER_CYC_SHIFT;  } -int __devinit read_current_timer(unsigned long *timer_val) +int read_current_timer(unsigned long *timer_val)  {  	*timer_val = tick_ops->get_tick();  	return 0; diff --git a/arch/sparc/mm/gup.c b/arch/sparc/mm/gup.c index 42c55df3aec..01ee23dd724 100644 --- a/arch/sparc/mm/gup.c +++ b/arch/sparc/mm/gup.c @@ -66,6 +66,56 @@ static noinline int gup_pte_range(pmd_t pmd, unsigned long addr,  	return 1;  } +static int gup_huge_pmd(pmd_t *pmdp, pmd_t pmd, unsigned long addr, +			unsigned long end, int write, struct page **pages, +			int *nr) +{ +	struct page *head, *page, *tail; +	u32 mask; +	int refs; + +	mask = PMD_HUGE_PRESENT; +	if (write) +		mask |= PMD_HUGE_WRITE; +	if ((pmd_val(pmd) & mask) != mask) +		return 0; + +	refs = 0; +	head = pmd_page(pmd); +	page = head + ((addr & ~PMD_MASK) >> PAGE_SHIFT); +	tail = page; +	do { +		VM_BUG_ON(compound_head(page) != head); +		pages[*nr] = page; +		(*nr)++; +		page++; +		refs++; +	} while (addr += PAGE_SIZE, addr != end); + +	if (!page_cache_add_speculative(head, refs)) { +		*nr -= refs; +		return 0; +	} + +	if (unlikely(pmd_val(pmd) != pmd_val(*pmdp))) { +		*nr -= refs; +		while (refs--) +			put_page(head); +		return 0; +	} + +	/* Any tail page need their mapcount reference taken before we +	 * return. +	 */ +	while (refs--) { +		if (PageTail(tail)) +			get_huge_page_tail(tail); +		tail++; +	} + +	return 1; +} +  static int gup_pmd_range(pud_t pud, unsigned long addr, unsigned long end,  		int write, struct page **pages, int *nr)  { @@ -77,9 +127,14 @@ static int gup_pmd_range(pud_t pud, unsigned long addr, unsigned long end,  		pmd_t pmd = *pmdp;  		next = pmd_addr_end(addr, end); -		if (pmd_none(pmd)) +		if (pmd_none(pmd) || pmd_trans_splitting(pmd))  			return 0; -		if (!gup_pte_range(pmd, addr, next, write, pages, nr)) +		if (unlikely(pmd_large(pmd))) { +			if (!gup_huge_pmd(pmdp, pmd, addr, next, +					  write, pages, nr)) +				return 0; +		} else if (!gup_pte_range(pmd, addr, next, write, +					  pages, nr))  			return 0;  	} while (pmdp++, addr = next, addr != end); diff --git a/arch/sparc/mm/init_64.c b/arch/sparc/mm/init_64.c index 85be1ca539b..c3b72423c84 100644 --- a/arch/sparc/mm/init_64.c +++ b/arch/sparc/mm/init_64.c @@ -87,8 +87,8 @@ static unsigned long cpu_pgsz_mask;  #define MAX_BANKS	32 -static struct linux_prom64_registers pavail[MAX_BANKS] __devinitdata; -static int pavail_ents __devinitdata; +static struct linux_prom64_registers pavail[MAX_BANKS]; +static int pavail_ents;  static int cmp_p64(const void *a, const void *b)  { @@ -1931,7 +1931,7 @@ void __init paging_init(void)  	printk("Booting Linux...\n");  } -int __devinit page_in_phys_avail(unsigned long paddr) +int page_in_phys_avail(unsigned long paddr)  {  	int i; diff --git a/arch/tile/Kconfig b/arch/tile/Kconfig index 875d008828b..1bb7ad4aeff 100644 --- a/arch/tile/Kconfig +++ b/arch/tile/Kconfig @@ -140,6 +140,8 @@ config ARCH_DEFCONFIG  source "init/Kconfig" +source "kernel/Kconfig.freezer" +  menu "Tilera-specific configuration"  config NR_CPUS diff --git a/arch/tile/include/asm/io.h b/arch/tile/include/asm/io.h index 2a9b293fece..31672918064 100644 --- a/arch/tile/include/asm/io.h +++ b/arch/tile/include/asm/io.h @@ -250,7 +250,9 @@ static inline void writeq(u64 val, unsigned long addr)  #define iowrite32 writel  #define iowrite64 writeq -static inline void memset_io(void *dst, int val, size_t len) +#if CHIP_HAS_MMIO() || defined(CONFIG_PCI) + +static inline void memset_io(volatile void *dst, int val, size_t len)  {  	int x;  	BUG_ON((unsigned long)dst & 0x3); @@ -277,6 +279,8 @@ static inline void memcpy_toio(volatile void __iomem *dst, const void *src,  		writel(*(u32 *)(src + x), dst + x);  } +#endif +  /*   * The Tile architecture does not support IOPORT, even with PCI.   * Unfortunately we can't yet simply not declare these methods, diff --git a/arch/tile/include/asm/irqflags.h b/arch/tile/include/asm/irqflags.h index b4e96fef2cf..241c0bb60b1 100644 --- a/arch/tile/include/asm/irqflags.h +++ b/arch/tile/include/asm/irqflags.h @@ -18,32 +18,20 @@  #include <arch/interrupts.h>  #include <arch/chip.h> -#if !defined(__tilegx__) && defined(__ASSEMBLY__) -  /*   * The set of interrupts we want to allow when interrupts are nominally   * disabled.  The remainder are effectively "NMI" interrupts from   * the point of view of the generic Linux code.  Note that synchronous   * interrupts (aka "non-queued") are not blocked by the mask in any case.   */ -#if CHIP_HAS_AUX_PERF_COUNTERS() -#define LINUX_MASKABLE_INTERRUPTS_HI \ -	(~(INT_MASK_HI(INT_PERF_COUNT) | INT_MASK_HI(INT_AUX_PERF_COUNT))) -#else -#define LINUX_MASKABLE_INTERRUPTS_HI \ -	(~(INT_MASK_HI(INT_PERF_COUNT))) -#endif - -#else - -#if CHIP_HAS_AUX_PERF_COUNTERS() -#define LINUX_MASKABLE_INTERRUPTS \ -	(~(INT_MASK(INT_PERF_COUNT) | INT_MASK(INT_AUX_PERF_COUNT))) -#else  #define LINUX_MASKABLE_INTERRUPTS \ -	(~(INT_MASK(INT_PERF_COUNT))) -#endif +	(~((_AC(1,ULL) << INT_PERF_COUNT) | (_AC(1,ULL) << INT_AUX_PERF_COUNT))) +#if CHIP_HAS_SPLIT_INTR_MASK() +/* The same macro, but for the two 32-bit SPRs separately. */ +#define LINUX_MASKABLE_INTERRUPTS_LO (-1) +#define LINUX_MASKABLE_INTERRUPTS_HI \ +	(~((1 << (INT_PERF_COUNT - 32)) | (1 << (INT_AUX_PERF_COUNT - 32))))  #endif  #ifndef __ASSEMBLY__ @@ -126,7 +114,7 @@   * to know our current state.   */  DECLARE_PER_CPU(unsigned long long, interrupts_enabled_mask); -#define INITIAL_INTERRUPTS_ENABLED INT_MASK(INT_MEM_ERROR) +#define INITIAL_INTERRUPTS_ENABLED (1ULL << INT_MEM_ERROR)  /* Disable interrupts. */  #define arch_local_irq_disable() \ @@ -165,7 +153,7 @@ DECLARE_PER_CPU(unsigned long long, interrupts_enabled_mask);  /* Prevent the given interrupt from being enabled next time we enable irqs. */  #define arch_local_irq_mask(interrupt) \ -	(__get_cpu_var(interrupts_enabled_mask) &= ~INT_MASK(interrupt)) +	(__get_cpu_var(interrupts_enabled_mask) &= ~(1ULL << (interrupt)))  /* Prevent the given interrupt from being enabled immediately. */  #define arch_local_irq_mask_now(interrupt) do { \ @@ -175,7 +163,7 @@ DECLARE_PER_CPU(unsigned long long, interrupts_enabled_mask);  /* Allow the given interrupt to be enabled next time we enable irqs. */  #define arch_local_irq_unmask(interrupt) \ -	(__get_cpu_var(interrupts_enabled_mask) |= INT_MASK(interrupt)) +	(__get_cpu_var(interrupts_enabled_mask) |= (1ULL << (interrupt)))  /* Allow the given interrupt to be enabled immediately, if !irqs_disabled. */  #define arch_local_irq_unmask_now(interrupt) do { \ @@ -250,7 +238,7 @@ DECLARE_PER_CPU(unsigned long long, interrupts_enabled_mask);  /* Disable interrupts. */  #define IRQ_DISABLE(tmp0, tmp1)					\  	{							\ -	 movei  tmp0, -1;					\ +	 movei  tmp0, LINUX_MASKABLE_INTERRUPTS_LO;		\  	 moveli tmp1, lo16(LINUX_MASKABLE_INTERRUPTS_HI)	\  	};							\  	{							\ diff --git a/arch/tile/include/asm/pci.h b/arch/tile/include/asm/pci.h index 302cdf71cee..54a924208d3 100644 --- a/arch/tile/include/asm/pci.h +++ b/arch/tile/include/asm/pci.h @@ -188,7 +188,7 @@ extern void pci_iounmap(struct pci_dev *dev, void __iomem *);  int __init tile_pci_init(void);  int __init pcibios_init(void); -void __devinit pcibios_fixup_bus(struct pci_bus *bus); +void pcibios_fixup_bus(struct pci_bus *bus);  #define pci_domain_nr(bus) (((struct pci_controller *)(bus)->sysdata)->index) diff --git a/arch/tile/include/uapi/arch/interrupts_32.h b/arch/tile/include/uapi/arch/interrupts_32.h index 96b5710505b..2efe3f68b2d 100644 --- a/arch/tile/include/uapi/arch/interrupts_32.h +++ b/arch/tile/include/uapi/arch/interrupts_32.h @@ -15,6 +15,7 @@  #ifndef __ARCH_INTERRUPTS_H__  #define __ARCH_INTERRUPTS_H__ +#ifndef __KERNEL__  /** Mask for an interrupt. */  /* Note: must handle breaking interrupts into high and low words manually. */  #define INT_MASK_LO(intno) (1 << (intno)) @@ -23,6 +24,7 @@  #ifndef __ASSEMBLER__  #define INT_MASK(intno) (1ULL << (intno))  #endif +#endif  /** Where a given interrupt executes */ @@ -92,216 +94,216 @@  #ifndef __ASSEMBLER__  #define QUEUED_INTERRUPTS ( \ -    INT_MASK(INT_MEM_ERROR) | \ -    INT_MASK(INT_DMATLB_MISS) | \ -    INT_MASK(INT_DMATLB_ACCESS) | \ -    INT_MASK(INT_SNITLB_MISS) | \ -    INT_MASK(INT_SN_NOTIFY) | \ -    INT_MASK(INT_SN_FIREWALL) | \ -    INT_MASK(INT_IDN_FIREWALL) | \ -    INT_MASK(INT_UDN_FIREWALL) | \ -    INT_MASK(INT_TILE_TIMER) | \ -    INT_MASK(INT_IDN_TIMER) | \ -    INT_MASK(INT_UDN_TIMER) | \ -    INT_MASK(INT_DMA_NOTIFY) | \ -    INT_MASK(INT_IDN_CA) | \ -    INT_MASK(INT_UDN_CA) | \ -    INT_MASK(INT_IDN_AVAIL) | \ -    INT_MASK(INT_UDN_AVAIL) | \ -    INT_MASK(INT_PERF_COUNT) | \ -    INT_MASK(INT_INTCTRL_3) | \ -    INT_MASK(INT_INTCTRL_2) | \ -    INT_MASK(INT_INTCTRL_1) | \ -    INT_MASK(INT_INTCTRL_0) | \ -    INT_MASK(INT_BOOT_ACCESS) | \ -    INT_MASK(INT_WORLD_ACCESS) | \ -    INT_MASK(INT_I_ASID) | \ -    INT_MASK(INT_D_ASID) | \ -    INT_MASK(INT_DMA_ASID) | \ -    INT_MASK(INT_SNI_ASID) | \ -    INT_MASK(INT_DMA_CPL) | \ -    INT_MASK(INT_SN_CPL) | \ -    INT_MASK(INT_DOUBLE_FAULT) | \ -    INT_MASK(INT_AUX_PERF_COUNT) | \ +    (1ULL << INT_MEM_ERROR) | \ +    (1ULL << INT_DMATLB_MISS) | \ +    (1ULL << INT_DMATLB_ACCESS) | \ +    (1ULL << INT_SNITLB_MISS) | \ +    (1ULL << INT_SN_NOTIFY) | \ +    (1ULL << INT_SN_FIREWALL) | \ +    (1ULL << INT_IDN_FIREWALL) | \ +    (1ULL << INT_UDN_FIREWALL) | \ +    (1ULL << INT_TILE_TIMER) | \ +    (1ULL << INT_IDN_TIMER) | \ +    (1ULL << INT_UDN_TIMER) | \ +    (1ULL << INT_DMA_NOTIFY) | \ +    (1ULL << INT_IDN_CA) | \ +    (1ULL << INT_UDN_CA) | \ +    (1ULL << INT_IDN_AVAIL) | \ +    (1ULL << INT_UDN_AVAIL) | \ +    (1ULL << INT_PERF_COUNT) | \ +    (1ULL << INT_INTCTRL_3) | \ +    (1ULL << INT_INTCTRL_2) | \ +    (1ULL << INT_INTCTRL_1) | \ +    (1ULL << INT_INTCTRL_0) | \ +    (1ULL << INT_BOOT_ACCESS) | \ +    (1ULL << INT_WORLD_ACCESS) | \ +    (1ULL << INT_I_ASID) | \ +    (1ULL << INT_D_ASID) | \ +    (1ULL << INT_DMA_ASID) | \ +    (1ULL << INT_SNI_ASID) | \ +    (1ULL << INT_DMA_CPL) | \ +    (1ULL << INT_SN_CPL) | \ +    (1ULL << INT_DOUBLE_FAULT) | \ +    (1ULL << INT_AUX_PERF_COUNT) | \      0)  #define NONQUEUED_INTERRUPTS ( \ -    INT_MASK(INT_ITLB_MISS) | \ -    INT_MASK(INT_ILL) | \ -    INT_MASK(INT_GPV) | \ -    INT_MASK(INT_SN_ACCESS) | \ -    INT_MASK(INT_IDN_ACCESS) | \ -    INT_MASK(INT_UDN_ACCESS) | \ -    INT_MASK(INT_IDN_REFILL) | \ -    INT_MASK(INT_UDN_REFILL) | \ -    INT_MASK(INT_IDN_COMPLETE) | \ -    INT_MASK(INT_UDN_COMPLETE) | \ -    INT_MASK(INT_SWINT_3) | \ -    INT_MASK(INT_SWINT_2) | \ -    INT_MASK(INT_SWINT_1) | \ -    INT_MASK(INT_SWINT_0) | \ -    INT_MASK(INT_UNALIGN_DATA) | \ -    INT_MASK(INT_DTLB_MISS) | \ -    INT_MASK(INT_DTLB_ACCESS) | \ -    INT_MASK(INT_SN_STATIC_ACCESS) | \ +    (1ULL << INT_ITLB_MISS) | \ +    (1ULL << INT_ILL) | \ +    (1ULL << INT_GPV) | \ +    (1ULL << INT_SN_ACCESS) | \ +    (1ULL << INT_IDN_ACCESS) | \ +    (1ULL << INT_UDN_ACCESS) | \ +    (1ULL << INT_IDN_REFILL) | \ +    (1ULL << INT_UDN_REFILL) | \ +    (1ULL << INT_IDN_COMPLETE) | \ +    (1ULL << INT_UDN_COMPLETE) | \ +    (1ULL << INT_SWINT_3) | \ +    (1ULL << INT_SWINT_2) | \ +    (1ULL << INT_SWINT_1) | \ +    (1ULL << INT_SWINT_0) | \ +    (1ULL << INT_UNALIGN_DATA) | \ +    (1ULL << INT_DTLB_MISS) | \ +    (1ULL << INT_DTLB_ACCESS) | \ +    (1ULL << INT_SN_STATIC_ACCESS) | \      0)  #define CRITICAL_MASKED_INTERRUPTS ( \ -    INT_MASK(INT_MEM_ERROR) | \ -    INT_MASK(INT_DMATLB_MISS) | \ -    INT_MASK(INT_DMATLB_ACCESS) | \ -    INT_MASK(INT_SNITLB_MISS) | \ -    INT_MASK(INT_SN_NOTIFY) | \ -    INT_MASK(INT_SN_FIREWALL) | \ -    INT_MASK(INT_IDN_FIREWALL) | \ -    INT_MASK(INT_UDN_FIREWALL) | \ -    INT_MASK(INT_TILE_TIMER) | \ -    INT_MASK(INT_IDN_TIMER) | \ -    INT_MASK(INT_UDN_TIMER) | \ -    INT_MASK(INT_DMA_NOTIFY) | \ -    INT_MASK(INT_IDN_CA) | \ -    INT_MASK(INT_UDN_CA) | \ -    INT_MASK(INT_IDN_AVAIL) | \ -    INT_MASK(INT_UDN_AVAIL) | \ -    INT_MASK(INT_PERF_COUNT) | \ -    INT_MASK(INT_INTCTRL_3) | \ -    INT_MASK(INT_INTCTRL_2) | \ -    INT_MASK(INT_INTCTRL_1) | \ -    INT_MASK(INT_INTCTRL_0) | \ -    INT_MASK(INT_AUX_PERF_COUNT) | \ +    (1ULL << INT_MEM_ERROR) | \ +    (1ULL << INT_DMATLB_MISS) | \ +    (1ULL << INT_DMATLB_ACCESS) | \ +    (1ULL << INT_SNITLB_MISS) | \ +    (1ULL << INT_SN_NOTIFY) | \ +    (1ULL << INT_SN_FIREWALL) | \ +    (1ULL << INT_IDN_FIREWALL) | \ +    (1ULL << INT_UDN_FIREWALL) | \ +    (1ULL << INT_TILE_TIMER) | \ +    (1ULL << INT_IDN_TIMER) | \ +    (1ULL << INT_UDN_TIMER) | \ +    (1ULL << INT_DMA_NOTIFY) | \ +    (1ULL << INT_IDN_CA) | \ +    (1ULL << INT_UDN_CA) | \ +    (1ULL << INT_IDN_AVAIL) | \ +    (1ULL << INT_UDN_AVAIL) | \ +    (1ULL << INT_PERF_COUNT) | \ +    (1ULL << INT_INTCTRL_3) | \ +    (1ULL << INT_INTCTRL_2) | \ +    (1ULL << INT_INTCTRL_1) | \ +    (1ULL << INT_INTCTRL_0) | \ +    (1ULL << INT_AUX_PERF_COUNT) | \      0)  #define CRITICAL_UNMASKED_INTERRUPTS ( \ -    INT_MASK(INT_ITLB_MISS) | \ -    INT_MASK(INT_ILL) | \ -    INT_MASK(INT_GPV) | \ -    INT_MASK(INT_SN_ACCESS) | \ -    INT_MASK(INT_IDN_ACCESS) | \ -    INT_MASK(INT_UDN_ACCESS) | \ -    INT_MASK(INT_IDN_REFILL) | \ -    INT_MASK(INT_UDN_REFILL) | \ -    INT_MASK(INT_IDN_COMPLETE) | \ -    INT_MASK(INT_UDN_COMPLETE) | \ -    INT_MASK(INT_SWINT_3) | \ -    INT_MASK(INT_SWINT_2) | \ -    INT_MASK(INT_SWINT_1) | \ -    INT_MASK(INT_SWINT_0) | \ -    INT_MASK(INT_UNALIGN_DATA) | \ -    INT_MASK(INT_DTLB_MISS) | \ -    INT_MASK(INT_DTLB_ACCESS) | \ -    INT_MASK(INT_BOOT_ACCESS) | \ -    INT_MASK(INT_WORLD_ACCESS) | \ -    INT_MASK(INT_I_ASID) | \ -    INT_MASK(INT_D_ASID) | \ -    INT_MASK(INT_DMA_ASID) | \ -    INT_MASK(INT_SNI_ASID) | \ -    INT_MASK(INT_DMA_CPL) | \ -    INT_MASK(INT_SN_CPL) | \ -    INT_MASK(INT_DOUBLE_FAULT) | \ -    INT_MASK(INT_SN_STATIC_ACCESS) | \ +    (1ULL << INT_ITLB_MISS) | \ +    (1ULL << INT_ILL) | \ +    (1ULL << INT_GPV) | \ +    (1ULL << INT_SN_ACCESS) | \ +    (1ULL << INT_IDN_ACCESS) | \ +    (1ULL << INT_UDN_ACCESS) | \ +    (1ULL << INT_IDN_REFILL) | \ +    (1ULL << INT_UDN_REFILL) | \ +    (1ULL << INT_IDN_COMPLETE) | \ +    (1ULL << INT_UDN_COMPLETE) | \ +    (1ULL << INT_SWINT_3) | \ +    (1ULL << INT_SWINT_2) | \ +    (1ULL << INT_SWINT_1) | \ +    (1ULL << INT_SWINT_0) | \ +    (1ULL << INT_UNALIGN_DATA) | \ +    (1ULL << INT_DTLB_MISS) | \ +    (1ULL << INT_DTLB_ACCESS) | \ +    (1ULL << INT_BOOT_ACCESS) | \ +    (1ULL << INT_WORLD_ACCESS) | \ +    (1ULL << INT_I_ASID) | \ +    (1ULL << INT_D_ASID) | \ +    (1ULL << INT_DMA_ASID) | \ +    (1ULL << INT_SNI_ASID) | \ +    (1ULL << INT_DMA_CPL) | \ +    (1ULL << INT_SN_CPL) | \ +    (1ULL << INT_DOUBLE_FAULT) | \ +    (1ULL << INT_SN_STATIC_ACCESS) | \      0)  #define MASKABLE_INTERRUPTS ( \ -    INT_MASK(INT_MEM_ERROR) | \ -    INT_MASK(INT_IDN_REFILL) | \ -    INT_MASK(INT_UDN_REFILL) | \ -    INT_MASK(INT_IDN_COMPLETE) | \ -    INT_MASK(INT_UDN_COMPLETE) | \ -    INT_MASK(INT_DMATLB_MISS) | \ -    INT_MASK(INT_DMATLB_ACCESS) | \ -    INT_MASK(INT_SNITLB_MISS) | \ -    INT_MASK(INT_SN_NOTIFY) | \ -    INT_MASK(INT_SN_FIREWALL) | \ -    INT_MASK(INT_IDN_FIREWALL) | \ -    INT_MASK(INT_UDN_FIREWALL) | \ -    INT_MASK(INT_TILE_TIMER) | \ -    INT_MASK(INT_IDN_TIMER) | \ -    INT_MASK(INT_UDN_TIMER) | \ -    INT_MASK(INT_DMA_NOTIFY) | \ -    INT_MASK(INT_IDN_CA) | \ -    INT_MASK(INT_UDN_CA) | \ -    INT_MASK(INT_IDN_AVAIL) | \ -    INT_MASK(INT_UDN_AVAIL) | \ -    INT_MASK(INT_PERF_COUNT) | \ -    INT_MASK(INT_INTCTRL_3) | \ -    INT_MASK(INT_INTCTRL_2) | \ -    INT_MASK(INT_INTCTRL_1) | \ -    INT_MASK(INT_INTCTRL_0) | \ -    INT_MASK(INT_AUX_PERF_COUNT) | \ +    (1ULL << INT_MEM_ERROR) | \ +    (1ULL << INT_IDN_REFILL) | \ +    (1ULL << INT_UDN_REFILL) | \ +    (1ULL << INT_IDN_COMPLETE) | \ +    (1ULL << INT_UDN_COMPLETE) | \ +    (1ULL << INT_DMATLB_MISS) | \ +    (1ULL << INT_DMATLB_ACCESS) | \ +    (1ULL << INT_SNITLB_MISS) | \ +    (1ULL << INT_SN_NOTIFY) | \ +    (1ULL << INT_SN_FIREWALL) | \ +    (1ULL << INT_IDN_FIREWALL) | \ +    (1ULL << INT_UDN_FIREWALL) | \ +    (1ULL << INT_TILE_TIMER) | \ +    (1ULL << INT_IDN_TIMER) | \ +    (1ULL << INT_UDN_TIMER) | \ +    (1ULL << INT_DMA_NOTIFY) | \ +    (1ULL << INT_IDN_CA) | \ +    (1ULL << INT_UDN_CA) | \ +    (1ULL << INT_IDN_AVAIL) | \ +    (1ULL << INT_UDN_AVAIL) | \ +    (1ULL << INT_PERF_COUNT) | \ +    (1ULL << INT_INTCTRL_3) | \ +    (1ULL << INT_INTCTRL_2) | \ +    (1ULL << INT_INTCTRL_1) | \ +    (1ULL << INT_INTCTRL_0) | \ +    (1ULL << INT_AUX_PERF_COUNT) | \      0)  #define UNMASKABLE_INTERRUPTS ( \ -    INT_MASK(INT_ITLB_MISS) | \ -    INT_MASK(INT_ILL) | \ -    INT_MASK(INT_GPV) | \ -    INT_MASK(INT_SN_ACCESS) | \ -    INT_MASK(INT_IDN_ACCESS) | \ -    INT_MASK(INT_UDN_ACCESS) | \ -    INT_MASK(INT_SWINT_3) | \ -    INT_MASK(INT_SWINT_2) | \ -    INT_MASK(INT_SWINT_1) | \ -    INT_MASK(INT_SWINT_0) | \ -    INT_MASK(INT_UNALIGN_DATA) | \ -    INT_MASK(INT_DTLB_MISS) | \ -    INT_MASK(INT_DTLB_ACCESS) | \ -    INT_MASK(INT_BOOT_ACCESS) | \ -    INT_MASK(INT_WORLD_ACCESS) | \ -    INT_MASK(INT_I_ASID) | \ -    INT_MASK(INT_D_ASID) | \ -    INT_MASK(INT_DMA_ASID) | \ -    INT_MASK(INT_SNI_ASID) | \ -    INT_MASK(INT_DMA_CPL) | \ -    INT_MASK(INT_SN_CPL) | \ -    INT_MASK(INT_DOUBLE_FAULT) | \ -    INT_MASK(INT_SN_STATIC_ACCESS) | \ +    (1ULL << INT_ITLB_MISS) | \ +    (1ULL << INT_ILL) | \ +    (1ULL << INT_GPV) | \ +    (1ULL << INT_SN_ACCESS) | \ +    (1ULL << INT_IDN_ACCESS) | \ +    (1ULL << INT_UDN_ACCESS) | \ +    (1ULL << INT_SWINT_3) | \ +    (1ULL << INT_SWINT_2) | \ +    (1ULL << INT_SWINT_1) | \ +    (1ULL << INT_SWINT_0) | \ +    (1ULL << INT_UNALIGN_DATA) | \ +    (1ULL << INT_DTLB_MISS) | \ +    (1ULL << INT_DTLB_ACCESS) | \ +    (1ULL << INT_BOOT_ACCESS) | \ +    (1ULL << INT_WORLD_ACCESS) | \ +    (1ULL << INT_I_ASID) | \ +    (1ULL << INT_D_ASID) | \ +    (1ULL << INT_DMA_ASID) | \ +    (1ULL << INT_SNI_ASID) | \ +    (1ULL << INT_DMA_CPL) | \ +    (1ULL << INT_SN_CPL) | \ +    (1ULL << INT_DOUBLE_FAULT) | \ +    (1ULL << INT_SN_STATIC_ACCESS) | \      0)  #define SYNC_INTERRUPTS ( \ -    INT_MASK(INT_ITLB_MISS) | \ -    INT_MASK(INT_ILL) | \ -    INT_MASK(INT_GPV) | \ -    INT_MASK(INT_SN_ACCESS) | \ -    INT_MASK(INT_IDN_ACCESS) | \ -    INT_MASK(INT_UDN_ACCESS) | \ -    INT_MASK(INT_IDN_REFILL) | \ -    INT_MASK(INT_UDN_REFILL) | \ -    INT_MASK(INT_IDN_COMPLETE) | \ -    INT_MASK(INT_UDN_COMPLETE) | \ -    INT_MASK(INT_SWINT_3) | \ -    INT_MASK(INT_SWINT_2) | \ -    INT_MASK(INT_SWINT_1) | \ -    INT_MASK(INT_SWINT_0) | \ -    INT_MASK(INT_UNALIGN_DATA) | \ -    INT_MASK(INT_DTLB_MISS) | \ -    INT_MASK(INT_DTLB_ACCESS) | \ -    INT_MASK(INT_SN_STATIC_ACCESS) | \ +    (1ULL << INT_ITLB_MISS) | \ +    (1ULL << INT_ILL) | \ +    (1ULL << INT_GPV) | \ +    (1ULL << INT_SN_ACCESS) | \ +    (1ULL << INT_IDN_ACCESS) | \ +    (1ULL << INT_UDN_ACCESS) | \ +    (1ULL << INT_IDN_REFILL) | \ +    (1ULL << INT_UDN_REFILL) | \ +    (1ULL << INT_IDN_COMPLETE) | \ +    (1ULL << INT_UDN_COMPLETE) | \ +    (1ULL << INT_SWINT_3) | \ +    (1ULL << INT_SWINT_2) | \ +    (1ULL << INT_SWINT_1) | \ +    (1ULL << INT_SWINT_0) | \ +    (1ULL << INT_UNALIGN_DATA) | \ +    (1ULL << INT_DTLB_MISS) | \ +    (1ULL << INT_DTLB_ACCESS) | \ +    (1ULL << INT_SN_STATIC_ACCESS) | \      0)  #define NON_SYNC_INTERRUPTS ( \ -    INT_MASK(INT_MEM_ERROR) | \ -    INT_MASK(INT_DMATLB_MISS) | \ -    INT_MASK(INT_DMATLB_ACCESS) | \ -    INT_MASK(INT_SNITLB_MISS) | \ -    INT_MASK(INT_SN_NOTIFY) | \ -    INT_MASK(INT_SN_FIREWALL) | \ -    INT_MASK(INT_IDN_FIREWALL) | \ -    INT_MASK(INT_UDN_FIREWALL) | \ -    INT_MASK(INT_TILE_TIMER) | \ -    INT_MASK(INT_IDN_TIMER) | \ -    INT_MASK(INT_UDN_TIMER) | \ -    INT_MASK(INT_DMA_NOTIFY) | \ -    INT_MASK(INT_IDN_CA) | \ -    INT_MASK(INT_UDN_CA) | \ -    INT_MASK(INT_IDN_AVAIL) | \ -    INT_MASK(INT_UDN_AVAIL) | \ -    INT_MASK(INT_PERF_COUNT) | \ -    INT_MASK(INT_INTCTRL_3) | \ -    INT_MASK(INT_INTCTRL_2) | \ -    INT_MASK(INT_INTCTRL_1) | \ -    INT_MASK(INT_INTCTRL_0) | \ -    INT_MASK(INT_BOOT_ACCESS) | \ -    INT_MASK(INT_WORLD_ACCESS) | \ -    INT_MASK(INT_I_ASID) | \ -    INT_MASK(INT_D_ASID) | \ -    INT_MASK(INT_DMA_ASID) | \ -    INT_MASK(INT_SNI_ASID) | \ -    INT_MASK(INT_DMA_CPL) | \ -    INT_MASK(INT_SN_CPL) | \ -    INT_MASK(INT_DOUBLE_FAULT) | \ -    INT_MASK(INT_AUX_PERF_COUNT) | \ +    (1ULL << INT_MEM_ERROR) | \ +    (1ULL << INT_DMATLB_MISS) | \ +    (1ULL << INT_DMATLB_ACCESS) | \ +    (1ULL << INT_SNITLB_MISS) | \ +    (1ULL << INT_SN_NOTIFY) | \ +    (1ULL << INT_SN_FIREWALL) | \ +    (1ULL << INT_IDN_FIREWALL) | \ +    (1ULL << INT_UDN_FIREWALL) | \ +    (1ULL << INT_TILE_TIMER) | \ +    (1ULL << INT_IDN_TIMER) | \ +    (1ULL << INT_UDN_TIMER) | \ +    (1ULL << INT_DMA_NOTIFY) | \ +    (1ULL << INT_IDN_CA) | \ +    (1ULL << INT_UDN_CA) | \ +    (1ULL << INT_IDN_AVAIL) | \ +    (1ULL << INT_UDN_AVAIL) | \ +    (1ULL << INT_PERF_COUNT) | \ +    (1ULL << INT_INTCTRL_3) | \ +    (1ULL << INT_INTCTRL_2) | \ +    (1ULL << INT_INTCTRL_1) | \ +    (1ULL << INT_INTCTRL_0) | \ +    (1ULL << INT_BOOT_ACCESS) | \ +    (1ULL << INT_WORLD_ACCESS) | \ +    (1ULL << INT_I_ASID) | \ +    (1ULL << INT_D_ASID) | \ +    (1ULL << INT_DMA_ASID) | \ +    (1ULL << INT_SNI_ASID) | \ +    (1ULL << INT_DMA_CPL) | \ +    (1ULL << INT_SN_CPL) | \ +    (1ULL << INT_DOUBLE_FAULT) | \ +    (1ULL << INT_AUX_PERF_COUNT) | \      0)  #endif /* !__ASSEMBLER__ */  #endif /* !__ARCH_INTERRUPTS_H__ */ diff --git a/arch/tile/include/uapi/arch/interrupts_64.h b/arch/tile/include/uapi/arch/interrupts_64.h index 5bb58b2e4e6..13c9f918234 100644 --- a/arch/tile/include/uapi/arch/interrupts_64.h +++ b/arch/tile/include/uapi/arch/interrupts_64.h @@ -15,6 +15,7 @@  #ifndef __ARCH_INTERRUPTS_H__  #define __ARCH_INTERRUPTS_H__ +#ifndef __KERNEL__  /** Mask for an interrupt. */  #ifdef __ASSEMBLER__  /* Note: must handle breaking interrupts into high and low words manually. */ @@ -22,6 +23,7 @@  #else  #define INT_MASK(intno) (1ULL << (intno))  #endif +#endif  /** Where a given interrupt executes */ @@ -85,192 +87,192 @@  #ifndef __ASSEMBLER__  #define QUEUED_INTERRUPTS ( \ -    INT_MASK(INT_MEM_ERROR) | \ -    INT_MASK(INT_IDN_COMPLETE) | \ -    INT_MASK(INT_UDN_COMPLETE) | \ -    INT_MASK(INT_IDN_FIREWALL) | \ -    INT_MASK(INT_UDN_FIREWALL) | \ -    INT_MASK(INT_TILE_TIMER) | \ -    INT_MASK(INT_AUX_TILE_TIMER) | \ -    INT_MASK(INT_IDN_TIMER) | \ -    INT_MASK(INT_UDN_TIMER) | \ -    INT_MASK(INT_IDN_AVAIL) | \ -    INT_MASK(INT_UDN_AVAIL) | \ -    INT_MASK(INT_IPI_3) | \ -    INT_MASK(INT_IPI_2) | \ -    INT_MASK(INT_IPI_1) | \ -    INT_MASK(INT_IPI_0) | \ -    INT_MASK(INT_PERF_COUNT) | \ -    INT_MASK(INT_AUX_PERF_COUNT) | \ -    INT_MASK(INT_INTCTRL_3) | \ -    INT_MASK(INT_INTCTRL_2) | \ -    INT_MASK(INT_INTCTRL_1) | \ -    INT_MASK(INT_INTCTRL_0) | \ -    INT_MASK(INT_BOOT_ACCESS) | \ -    INT_MASK(INT_WORLD_ACCESS) | \ -    INT_MASK(INT_I_ASID) | \ -    INT_MASK(INT_D_ASID) | \ -    INT_MASK(INT_DOUBLE_FAULT) | \ +    (1ULL << INT_MEM_ERROR) | \ +    (1ULL << INT_IDN_COMPLETE) | \ +    (1ULL << INT_UDN_COMPLETE) | \ +    (1ULL << INT_IDN_FIREWALL) | \ +    (1ULL << INT_UDN_FIREWALL) | \ +    (1ULL << INT_TILE_TIMER) | \ +    (1ULL << INT_AUX_TILE_TIMER) | \ +    (1ULL << INT_IDN_TIMER) | \ +    (1ULL << INT_UDN_TIMER) | \ +    (1ULL << INT_IDN_AVAIL) | \ +    (1ULL << INT_UDN_AVAIL) | \ +    (1ULL << INT_IPI_3) | \ +    (1ULL << INT_IPI_2) | \ +    (1ULL << INT_IPI_1) | \ +    (1ULL << INT_IPI_0) | \ +    (1ULL << INT_PERF_COUNT) | \ +    (1ULL << INT_AUX_PERF_COUNT) | \ +    (1ULL << INT_INTCTRL_3) | \ +    (1ULL << INT_INTCTRL_2) | \ +    (1ULL << INT_INTCTRL_1) | \ +    (1ULL << INT_INTCTRL_0) | \ +    (1ULL << INT_BOOT_ACCESS) | \ +    (1ULL << INT_WORLD_ACCESS) | \ +    (1ULL << INT_I_ASID) | \ +    (1ULL << INT_D_ASID) | \ +    (1ULL << INT_DOUBLE_FAULT) | \      0)  #define NONQUEUED_INTERRUPTS ( \ -    INT_MASK(INT_SINGLE_STEP_3) | \ -    INT_MASK(INT_SINGLE_STEP_2) | \ -    INT_MASK(INT_SINGLE_STEP_1) | \ -    INT_MASK(INT_SINGLE_STEP_0) | \ -    INT_MASK(INT_ITLB_MISS) | \ -    INT_MASK(INT_ILL) | \ -    INT_MASK(INT_GPV) | \ -    INT_MASK(INT_IDN_ACCESS) | \ -    INT_MASK(INT_UDN_ACCESS) | \ -    INT_MASK(INT_SWINT_3) | \ -    INT_MASK(INT_SWINT_2) | \ -    INT_MASK(INT_SWINT_1) | \ -    INT_MASK(INT_SWINT_0) | \ -    INT_MASK(INT_ILL_TRANS) | \ -    INT_MASK(INT_UNALIGN_DATA) | \ -    INT_MASK(INT_DTLB_MISS) | \ -    INT_MASK(INT_DTLB_ACCESS) | \ +    (1ULL << INT_SINGLE_STEP_3) | \ +    (1ULL << INT_SINGLE_STEP_2) | \ +    (1ULL << INT_SINGLE_STEP_1) | \ +    (1ULL << INT_SINGLE_STEP_0) | \ +    (1ULL << INT_ITLB_MISS) | \ +    (1ULL << INT_ILL) | \ +    (1ULL << INT_GPV) | \ +    (1ULL << INT_IDN_ACCESS) | \ +    (1ULL << INT_UDN_ACCESS) | \ +    (1ULL << INT_SWINT_3) | \ +    (1ULL << INT_SWINT_2) | \ +    (1ULL << INT_SWINT_1) | \ +    (1ULL << INT_SWINT_0) | \ +    (1ULL << INT_ILL_TRANS) | \ +    (1ULL << INT_UNALIGN_DATA) | \ +    (1ULL << INT_DTLB_MISS) | \ +    (1ULL << INT_DTLB_ACCESS) | \      0)  #define CRITICAL_MASKED_INTERRUPTS ( \ -    INT_MASK(INT_MEM_ERROR) | \ -    INT_MASK(INT_SINGLE_STEP_3) | \ -    INT_MASK(INT_SINGLE_STEP_2) | \ -    INT_MASK(INT_SINGLE_STEP_1) | \ -    INT_MASK(INT_SINGLE_STEP_0) | \ -    INT_MASK(INT_IDN_COMPLETE) | \ -    INT_MASK(INT_UDN_COMPLETE) | \ -    INT_MASK(INT_IDN_FIREWALL) | \ -    INT_MASK(INT_UDN_FIREWALL) | \ -    INT_MASK(INT_TILE_TIMER) | \ -    INT_MASK(INT_AUX_TILE_TIMER) | \ -    INT_MASK(INT_IDN_TIMER) | \ -    INT_MASK(INT_UDN_TIMER) | \ -    INT_MASK(INT_IDN_AVAIL) | \ -    INT_MASK(INT_UDN_AVAIL) | \ -    INT_MASK(INT_IPI_3) | \ -    INT_MASK(INT_IPI_2) | \ -    INT_MASK(INT_IPI_1) | \ -    INT_MASK(INT_IPI_0) | \ -    INT_MASK(INT_PERF_COUNT) | \ -    INT_MASK(INT_AUX_PERF_COUNT) | \ -    INT_MASK(INT_INTCTRL_3) | \ -    INT_MASK(INT_INTCTRL_2) | \ -    INT_MASK(INT_INTCTRL_1) | \ -    INT_MASK(INT_INTCTRL_0) | \ +    (1ULL << INT_MEM_ERROR) | \ +    (1ULL << INT_SINGLE_STEP_3) | \ +    (1ULL << INT_SINGLE_STEP_2) | \ +    (1ULL << INT_SINGLE_STEP_1) | \ +    (1ULL << INT_SINGLE_STEP_0) | \ +    (1ULL << INT_IDN_COMPLETE) | \ +    (1ULL << INT_UDN_COMPLETE) | \ +    (1ULL << INT_IDN_FIREWALL) | \ +    (1ULL << INT_UDN_FIREWALL) | \ +    (1ULL << INT_TILE_TIMER) | \ +    (1ULL << INT_AUX_TILE_TIMER) | \ +    (1ULL << INT_IDN_TIMER) | \ +    (1ULL << INT_UDN_TIMER) | \ +    (1ULL << INT_IDN_AVAIL) | \ +    (1ULL << INT_UDN_AVAIL) | \ +    (1ULL << INT_IPI_3) | \ +    (1ULL << INT_IPI_2) | \ +    (1ULL << INT_IPI_1) | \ +    (1ULL << INT_IPI_0) | \ +    (1ULL << INT_PERF_COUNT) | \ +    (1ULL << INT_AUX_PERF_COUNT) | \ +    (1ULL << INT_INTCTRL_3) | \ +    (1ULL << INT_INTCTRL_2) | \ +    (1ULL << INT_INTCTRL_1) | \ +    (1ULL << INT_INTCTRL_0) | \      0)  #define CRITICAL_UNMASKED_INTERRUPTS ( \ -    INT_MASK(INT_ITLB_MISS) | \ -    INT_MASK(INT_ILL) | \ -    INT_MASK(INT_GPV) | \ -    INT_MASK(INT_IDN_ACCESS) | \ -    INT_MASK(INT_UDN_ACCESS) | \ -    INT_MASK(INT_SWINT_3) | \ -    INT_MASK(INT_SWINT_2) | \ -    INT_MASK(INT_SWINT_1) | \ -    INT_MASK(INT_SWINT_0) | \ -    INT_MASK(INT_ILL_TRANS) | \ -    INT_MASK(INT_UNALIGN_DATA) | \ -    INT_MASK(INT_DTLB_MISS) | \ -    INT_MASK(INT_DTLB_ACCESS) | \ -    INT_MASK(INT_BOOT_ACCESS) | \ -    INT_MASK(INT_WORLD_ACCESS) | \ -    INT_MASK(INT_I_ASID) | \ -    INT_MASK(INT_D_ASID) | \ -    INT_MASK(INT_DOUBLE_FAULT) | \ +    (1ULL << INT_ITLB_MISS) | \ +    (1ULL << INT_ILL) | \ +    (1ULL << INT_GPV) | \ +    (1ULL << INT_IDN_ACCESS) | \ +    (1ULL << INT_UDN_ACCESS) | \ +    (1ULL << INT_SWINT_3) | \ +    (1ULL << INT_SWINT_2) | \ +    (1ULL << INT_SWINT_1) | \ +    (1ULL << INT_SWINT_0) | \ +    (1ULL << INT_ILL_TRANS) | \ +    (1ULL << INT_UNALIGN_DATA) | \ +    (1ULL << INT_DTLB_MISS) | \ +    (1ULL << INT_DTLB_ACCESS) | \ +    (1ULL << INT_BOOT_ACCESS) | \ +    (1ULL << INT_WORLD_ACCESS) | \ +    (1ULL << INT_I_ASID) | \ +    (1ULL << INT_D_ASID) | \ +    (1ULL << INT_DOUBLE_FAULT) | \      0)  #define MASKABLE_INTERRUPTS ( \ -    INT_MASK(INT_MEM_ERROR) | \ -    INT_MASK(INT_SINGLE_STEP_3) | \ -    INT_MASK(INT_SINGLE_STEP_2) | \ -    INT_MASK(INT_SINGLE_STEP_1) | \ -    INT_MASK(INT_SINGLE_STEP_0) | \ -    INT_MASK(INT_IDN_COMPLETE) | \ -    INT_MASK(INT_UDN_COMPLETE) | \ -    INT_MASK(INT_IDN_FIREWALL) | \ -    INT_MASK(INT_UDN_FIREWALL) | \ -    INT_MASK(INT_TILE_TIMER) | \ -    INT_MASK(INT_AUX_TILE_TIMER) | \ -    INT_MASK(INT_IDN_TIMER) | \ -    INT_MASK(INT_UDN_TIMER) | \ -    INT_MASK(INT_IDN_AVAIL) | \ -    INT_MASK(INT_UDN_AVAIL) | \ -    INT_MASK(INT_IPI_3) | \ -    INT_MASK(INT_IPI_2) | \ -    INT_MASK(INT_IPI_1) | \ -    INT_MASK(INT_IPI_0) | \ -    INT_MASK(INT_PERF_COUNT) | \ -    INT_MASK(INT_AUX_PERF_COUNT) | \ -    INT_MASK(INT_INTCTRL_3) | \ -    INT_MASK(INT_INTCTRL_2) | \ -    INT_MASK(INT_INTCTRL_1) | \ -    INT_MASK(INT_INTCTRL_0) | \ +    (1ULL << INT_MEM_ERROR) | \ +    (1ULL << INT_SINGLE_STEP_3) | \ +    (1ULL << INT_SINGLE_STEP_2) | \ +    (1ULL << INT_SINGLE_STEP_1) | \ +    (1ULL << INT_SINGLE_STEP_0) | \ +    (1ULL << INT_IDN_COMPLETE) | \ +    (1ULL << INT_UDN_COMPLETE) | \ +    (1ULL << INT_IDN_FIREWALL) | \ +    (1ULL << INT_UDN_FIREWALL) | \ +    (1ULL << INT_TILE_TIMER) | \ +    (1ULL << INT_AUX_TILE_TIMER) | \ +    (1ULL << INT_IDN_TIMER) | \ +    (1ULL << INT_UDN_TIMER) | \ +    (1ULL << INT_IDN_AVAIL) | \ +    (1ULL << INT_UDN_AVAIL) | \ +    (1ULL << INT_IPI_3) | \ +    (1ULL << INT_IPI_2) | \ +    (1ULL << INT_IPI_1) | \ +    (1ULL << INT_IPI_0) | \ +    (1ULL << INT_PERF_COUNT) | \ +    (1ULL << INT_AUX_PERF_COUNT) | \ +    (1ULL << INT_INTCTRL_3) | \ +    (1ULL << INT_INTCTRL_2) | \ +    (1ULL << INT_INTCTRL_1) | \ +    (1ULL << INT_INTCTRL_0) | \      0)  #define UNMASKABLE_INTERRUPTS ( \ -    INT_MASK(INT_ITLB_MISS) | \ -    INT_MASK(INT_ILL) | \ -    INT_MASK(INT_GPV) | \ -    INT_MASK(INT_IDN_ACCESS) | \ -    INT_MASK(INT_UDN_ACCESS) | \ -    INT_MASK(INT_SWINT_3) | \ -    INT_MASK(INT_SWINT_2) | \ -    INT_MASK(INT_SWINT_1) | \ -    INT_MASK(INT_SWINT_0) | \ -    INT_MASK(INT_ILL_TRANS) | \ -    INT_MASK(INT_UNALIGN_DATA) | \ -    INT_MASK(INT_DTLB_MISS) | \ -    INT_MASK(INT_DTLB_ACCESS) | \ -    INT_MASK(INT_BOOT_ACCESS) | \ -    INT_MASK(INT_WORLD_ACCESS) | \ -    INT_MASK(INT_I_ASID) | \ -    INT_MASK(INT_D_ASID) | \ -    INT_MASK(INT_DOUBLE_FAULT) | \ +    (1ULL << INT_ITLB_MISS) | \ +    (1ULL << INT_ILL) | \ +    (1ULL << INT_GPV) | \ +    (1ULL << INT_IDN_ACCESS) | \ +    (1ULL << INT_UDN_ACCESS) | \ +    (1ULL << INT_SWINT_3) | \ +    (1ULL << INT_SWINT_2) | \ +    (1ULL << INT_SWINT_1) | \ +    (1ULL << INT_SWINT_0) | \ +    (1ULL << INT_ILL_TRANS) | \ +    (1ULL << INT_UNALIGN_DATA) | \ +    (1ULL << INT_DTLB_MISS) | \ +    (1ULL << INT_DTLB_ACCESS) | \ +    (1ULL << INT_BOOT_ACCESS) | \ +    (1ULL << INT_WORLD_ACCESS) | \ +    (1ULL << INT_I_ASID) | \ +    (1ULL << INT_D_ASID) | \ +    (1ULL << INT_DOUBLE_FAULT) | \      0)  #define SYNC_INTERRUPTS ( \ -    INT_MASK(INT_SINGLE_STEP_3) | \ -    INT_MASK(INT_SINGLE_STEP_2) | \ -    INT_MASK(INT_SINGLE_STEP_1) | \ -    INT_MASK(INT_SINGLE_STEP_0) | \ -    INT_MASK(INT_IDN_COMPLETE) | \ -    INT_MASK(INT_UDN_COMPLETE) | \ -    INT_MASK(INT_ITLB_MISS) | \ -    INT_MASK(INT_ILL) | \ -    INT_MASK(INT_GPV) | \ -    INT_MASK(INT_IDN_ACCESS) | \ -    INT_MASK(INT_UDN_ACCESS) | \ -    INT_MASK(INT_SWINT_3) | \ -    INT_MASK(INT_SWINT_2) | \ -    INT_MASK(INT_SWINT_1) | \ -    INT_MASK(INT_SWINT_0) | \ -    INT_MASK(INT_ILL_TRANS) | \ -    INT_MASK(INT_UNALIGN_DATA) | \ -    INT_MASK(INT_DTLB_MISS) | \ -    INT_MASK(INT_DTLB_ACCESS) | \ +    (1ULL << INT_SINGLE_STEP_3) | \ +    (1ULL << INT_SINGLE_STEP_2) | \ +    (1ULL << INT_SINGLE_STEP_1) | \ +    (1ULL << INT_SINGLE_STEP_0) | \ +    (1ULL << INT_IDN_COMPLETE) | \ +    (1ULL << INT_UDN_COMPLETE) | \ +    (1ULL << INT_ITLB_MISS) | \ +    (1ULL << INT_ILL) | \ +    (1ULL << INT_GPV) | \ +    (1ULL << INT_IDN_ACCESS) | \ +    (1ULL << INT_UDN_ACCESS) | \ +    (1ULL << INT_SWINT_3) | \ +    (1ULL << INT_SWINT_2) | \ +    (1ULL << INT_SWINT_1) | \ +    (1ULL << INT_SWINT_0) | \ +    (1ULL << INT_ILL_TRANS) | \ +    (1ULL << INT_UNALIGN_DATA) | \ +    (1ULL << INT_DTLB_MISS) | \ +    (1ULL << INT_DTLB_ACCESS) | \      0)  #define NON_SYNC_INTERRUPTS ( \ -    INT_MASK(INT_MEM_ERROR) | \ -    INT_MASK(INT_IDN_FIREWALL) | \ -    INT_MASK(INT_UDN_FIREWALL) | \ -    INT_MASK(INT_TILE_TIMER) | \ -    INT_MASK(INT_AUX_TILE_TIMER) | \ -    INT_MASK(INT_IDN_TIMER) | \ -    INT_MASK(INT_UDN_TIMER) | \ -    INT_MASK(INT_IDN_AVAIL) | \ -    INT_MASK(INT_UDN_AVAIL) | \ -    INT_MASK(INT_IPI_3) | \ -    INT_MASK(INT_IPI_2) | \ -    INT_MASK(INT_IPI_1) | \ -    INT_MASK(INT_IPI_0) | \ -    INT_MASK(INT_PERF_COUNT) | \ -    INT_MASK(INT_AUX_PERF_COUNT) | \ -    INT_MASK(INT_INTCTRL_3) | \ -    INT_MASK(INT_INTCTRL_2) | \ -    INT_MASK(INT_INTCTRL_1) | \ -    INT_MASK(INT_INTCTRL_0) | \ -    INT_MASK(INT_BOOT_ACCESS) | \ -    INT_MASK(INT_WORLD_ACCESS) | \ -    INT_MASK(INT_I_ASID) | \ -    INT_MASK(INT_D_ASID) | \ -    INT_MASK(INT_DOUBLE_FAULT) | \ +    (1ULL << INT_MEM_ERROR) | \ +    (1ULL << INT_IDN_FIREWALL) | \ +    (1ULL << INT_UDN_FIREWALL) | \ +    (1ULL << INT_TILE_TIMER) | \ +    (1ULL << INT_AUX_TILE_TIMER) | \ +    (1ULL << INT_IDN_TIMER) | \ +    (1ULL << INT_UDN_TIMER) | \ +    (1ULL << INT_IDN_AVAIL) | \ +    (1ULL << INT_UDN_AVAIL) | \ +    (1ULL << INT_IPI_3) | \ +    (1ULL << INT_IPI_2) | \ +    (1ULL << INT_IPI_1) | \ +    (1ULL << INT_IPI_0) | \ +    (1ULL << INT_PERF_COUNT) | \ +    (1ULL << INT_AUX_PERF_COUNT) | \ +    (1ULL << INT_INTCTRL_3) | \ +    (1ULL << INT_INTCTRL_2) | \ +    (1ULL << INT_INTCTRL_1) | \ +    (1ULL << INT_INTCTRL_0) | \ +    (1ULL << INT_BOOT_ACCESS) | \ +    (1ULL << INT_WORLD_ACCESS) | \ +    (1ULL << INT_I_ASID) | \ +    (1ULL << INT_D_ASID) | \ +    (1ULL << INT_DOUBLE_FAULT) | \      0)  #endif /* !__ASSEMBLER__ */  #endif /* !__ARCH_INTERRUPTS_H__ */ diff --git a/arch/tile/kernel/intvec_64.S b/arch/tile/kernel/intvec_64.S index 54bc9a6678e..4ea08090265 100644 --- a/arch/tile/kernel/intvec_64.S +++ b/arch/tile/kernel/intvec_64.S @@ -1035,7 +1035,9 @@ handle_syscall:  	/* Ensure that the syscall number is within the legal range. */  	{  	 moveli r20, hw2(sys_call_table) +#ifdef CONFIG_COMPAT  	 blbs   r30, .Lcompat_syscall +#endif  	}  	{  	 cmpltu r21, TREG_SYSCALL_NR_NAME, r21 @@ -1093,6 +1095,7 @@ handle_syscall:  	 j      .Lresume_userspace   /* jump into middle of interrupt_return */  	} +#ifdef CONFIG_COMPAT  .Lcompat_syscall:  	/*  	 * Load the base of the compat syscall table in r20, and @@ -1117,6 +1120,7 @@ handle_syscall:  	{ move r15, r4; addxi r4, r4, 0 }  	{ move r16, r5; addxi r5, r5, 0 }  	j .Lload_syscall_pointer +#endif  .Linvalid_syscall:  	/* Report an invalid syscall back to the user program */ diff --git a/arch/tile/kernel/pci.c b/arch/tile/kernel/pci.c index aac1cd58696..67237d34c2e 100644 --- a/arch/tile/kernel/pci.c +++ b/arch/tile/kernel/pci.c @@ -81,7 +81,7 @@ EXPORT_SYMBOL(pcibios_align_resource);   * controller_id is the controller number, config type is 0 or 1 for   * config0 or config1 operations.   */ -static int __devinit tile_pcie_open(int controller_id, int config_type) +static int tile_pcie_open(int controller_id, int config_type)  {  	char filename[32];  	int fd; @@ -97,8 +97,7 @@ static int __devinit tile_pcie_open(int controller_id, int config_type)  /*   * Get the IRQ numbers from the HV and set up the handlers for them.   */ -static int __devinit tile_init_irqs(int controller_id, -				 struct pci_controller *controller) +static int tile_init_irqs(int controller_id, struct pci_controller *controller)  {  	char filename[32];  	int fd; @@ -237,7 +236,7 @@ static int tile_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)  } -static void __devinit fixup_read_and_payload_sizes(void) +static void fixup_read_and_payload_sizes(void)  {  	struct pci_dev *dev = NULL;  	int smallest_max_payload = 0x1; /* Tile maxes out at 256 bytes. */ @@ -379,7 +378,7 @@ subsys_initcall(pcibios_init);  /*   * No bus fixups needed.   */ -void __devinit pcibios_fixup_bus(struct pci_bus *bus) +void pcibios_fixup_bus(struct pci_bus *bus)  {  	/* Nothing needs to be done. */  } @@ -458,11 +457,8 @@ int pcibios_enable_device(struct pci_dev *dev, int mask)   * specified bus & slot.   */ -static int __devinit tile_cfg_read(struct pci_bus *bus, -				   unsigned int devfn, -				   int offset, -				   int size, -				   u32 *val) +static int tile_cfg_read(struct pci_bus *bus, unsigned int devfn, int offset, +			 int size, u32 *val)  {  	struct pci_controller *controller = bus->sysdata;  	int busnum = bus->number & 0xff; @@ -504,11 +500,8 @@ static int __devinit tile_cfg_read(struct pci_bus *bus,   * See tile_cfg_read() for relevant comments.   * Note that "val" is the value to write, not a pointer to that value.   */ -static int __devinit tile_cfg_write(struct pci_bus *bus, -				    unsigned int devfn, -				    int offset, -				    int size, -				    u32 val) +static int tile_cfg_write(struct pci_bus *bus, unsigned int devfn, int offset, +			  int size, u32 val)  {  	struct pci_controller *controller = bus->sysdata;  	int busnum = bus->number & 0xff; diff --git a/arch/tile/kernel/pci_gx.c b/arch/tile/kernel/pci_gx.c index 94810d4a633..11425633b2d 100644 --- a/arch/tile/kernel/pci_gx.c +++ b/arch/tile/kernel/pci_gx.c @@ -58,10 +58,10 @@  #define TRACE_CFG_RD(...)  #endif -static int __devinitdata pci_probe = 1; +static int pci_probe = 1;  /* Information on the PCIe RC ports configuration. */ -static int __devinitdata pcie_rc[TILEGX_NUM_TRIO][TILEGX_TRIO_PCIES]; +static int pcie_rc[TILEGX_NUM_TRIO][TILEGX_TRIO_PCIES];  /*   * On some platforms with one or more Gx endpoint ports, we need to @@ -72,7 +72,7 @@ static int __devinitdata pcie_rc[TILEGX_NUM_TRIO][TILEGX_TRIO_PCIES];   * the delay in seconds. If the delay is not provided, the value   * will be DEFAULT_RC_DELAY.   */ -static int __devinitdata rc_delay[TILEGX_NUM_TRIO][TILEGX_TRIO_PCIES]; +static int rc_delay[TILEGX_NUM_TRIO][TILEGX_TRIO_PCIES];  /* Default number of seconds that the PCIe RC port probe can be delayed. */  #define DEFAULT_RC_DELAY	10 @@ -137,7 +137,7 @@ static int tile_irq_cpu(int irq)  /*   * Open a file descriptor to the TRIO shim.   */ -static int __devinit tile_pcie_open(int trio_index) +static int tile_pcie_open(int trio_index)  {  	gxio_trio_context_t *context = &trio_contexts[trio_index];  	int ret; @@ -265,7 +265,7 @@ trio_handle_level_irq(unsigned int irq, struct irq_desc *desc)   * Create kernel irqs and set up the handlers for the legacy interrupts.   * Also some minimum initialization for the MSI support.   */ -static int __devinit tile_init_irqs(struct pci_controller *controller) +static int tile_init_irqs(struct pci_controller *controller)  {  	int i;  	int j; @@ -459,8 +459,7 @@ static int tile_map_irq(const struct pci_dev *dev, u8 device, u8 pin)  } -static void __devinit fixup_read_and_payload_sizes(struct pci_controller * -						controller) +static void fixup_read_and_payload_sizes(struct pci_controller *controller)  {  	gxio_trio_context_t *trio_context = controller->trio;  	struct pci_bus *root_bus = controller->root_bus; @@ -541,7 +540,7 @@ static void __devinit fixup_read_and_payload_sizes(struct pci_controller *  	}  } -static int __devinit setup_pcie_rc_delay(char *str) +static int setup_pcie_rc_delay(char *str)  {  	unsigned long delay = 0;  	unsigned long trio_index; @@ -1016,7 +1015,7 @@ alloc_mem_map_failed:  subsys_initcall(pcibios_init);  /* Note: to be deleted after Linux 3.6 merge. */ -void __devinit pcibios_fixup_bus(struct pci_bus *bus) +void pcibios_fixup_bus(struct pci_bus *bus)  {  } @@ -1024,7 +1023,7 @@ void __devinit pcibios_fixup_bus(struct pci_bus *bus)   * This can be called from the generic PCI layer, but doesn't need to   * do anything.   */ -char __devinit *pcibios_setup(char *str) +char *pcibios_setup(char *str)  {  	if (!strcmp(str, "off")) {  		pci_probe = 0; @@ -1143,11 +1142,8 @@ EXPORT_SYMBOL(pci_iounmap);   * specified bus & device.   */ -static int __devinit tile_cfg_read(struct pci_bus *bus, -				   unsigned int devfn, -				   int offset, -				   int size, -				   u32 *val) +static int tile_cfg_read(struct pci_bus *bus, unsigned int devfn, int offset, +			 int size, u32 *val)  {  	struct pci_controller *controller = bus->sysdata;  	gxio_trio_context_t *trio_context = controller->trio; @@ -1271,11 +1267,8 @@ invalid_device:   * See tile_cfg_read() for relevent comments.   * Note that "val" is the value to write, not a pointer to that value.   */ -static int __devinit tile_cfg_write(struct pci_bus *bus, -				    unsigned int devfn, -				    int offset, -				    int size, -				    u32 val) +static int tile_cfg_write(struct pci_bus *bus, unsigned int devfn, int offset, +			  int size, u32 val)  {  	struct pci_controller *controller = bus->sysdata;  	gxio_trio_context_t *trio_context = controller->trio; diff --git a/arch/tile/kernel/process.c b/arch/tile/kernel/process.c index 0e5661e7d00..caf93ae1179 100644 --- a/arch/tile/kernel/process.c +++ b/arch/tile/kernel/process.c @@ -159,7 +159,7 @@ static void save_arch_state(struct thread_struct *t);  int copy_thread(unsigned long clone_flags, unsigned long sp,  		unsigned long arg, struct task_struct *p)  { -	struct pt_regs *childregs = task_pt_regs(p), *regs = current_pt_regs(); +	struct pt_regs *childregs = task_pt_regs(p);  	unsigned long ksp;  	unsigned long *callee_regs; diff --git a/arch/tile/kernel/reboot.c b/arch/tile/kernel/reboot.c index baa3d905fee..d1b5c913ae7 100644 --- a/arch/tile/kernel/reboot.c +++ b/arch/tile/kernel/reboot.c @@ -16,6 +16,7 @@  #include <linux/reboot.h>  #include <linux/smp.h>  #include <linux/pm.h> +#include <linux/export.h>  #include <asm/page.h>  #include <asm/setup.h>  #include <hv/hypervisor.h> @@ -49,3 +50,4 @@ void machine_restart(char *cmd)  /* No interesting distinction to be made here. */  void (*pm_power_off)(void) = NULL; +EXPORT_SYMBOL(pm_power_off); diff --git a/arch/tile/kernel/setup.c b/arch/tile/kernel/setup.c index 6a649a4462d..d1e15f7b59c 100644 --- a/arch/tile/kernel/setup.c +++ b/arch/tile/kernel/setup.c @@ -31,6 +31,7 @@  #include <linux/timex.h>  #include <linux/hugetlb.h>  #include <linux/start_kernel.h> +#include <linux/screen_info.h>  #include <asm/setup.h>  #include <asm/sections.h>  #include <asm/cacheflush.h> @@ -49,6 +50,10 @@ static inline int ABS(int x) { return x >= 0 ? x : -x; }  /* Chip information */  char chip_model[64] __write_once; +#ifdef CONFIG_VT +struct screen_info screen_info; +#endif +  struct pglist_data node_data[MAX_NUMNODES] __read_mostly;  EXPORT_SYMBOL(node_data); diff --git a/arch/tile/kernel/stack.c b/arch/tile/kernel/stack.c index b2f44c28dda..ed258b8ae32 100644 --- a/arch/tile/kernel/stack.c +++ b/arch/tile/kernel/stack.c @@ -112,7 +112,7 @@ static struct pt_regs *valid_fault_handler(struct KBacktraceIterator* kbt)  		       p->pc, p->sp, p->ex1);  		p = NULL;  	} -	if (!kbt->profile || (INT_MASK(p->faultnum) & QUEUED_INTERRUPTS) == 0) +	if (!kbt->profile || ((1ULL << p->faultnum) & QUEUED_INTERRUPTS) == 0)  		return p;  	return NULL;  } @@ -484,6 +484,7 @@ void save_stack_trace(struct stack_trace *trace)  {  	save_stack_trace_tsk(NULL, trace);  } +EXPORT_SYMBOL_GPL(save_stack_trace);  #endif diff --git a/arch/tile/lib/cacheflush.c b/arch/tile/lib/cacheflush.c index db4fb89e12d..8f8ad814b13 100644 --- a/arch/tile/lib/cacheflush.c +++ b/arch/tile/lib/cacheflush.c @@ -12,6 +12,7 @@   *   more details.   */ +#include <linux/export.h>  #include <asm/page.h>  #include <asm/cacheflush.h>  #include <arch/icache.h> @@ -165,3 +166,4 @@ void finv_buffer_remote(void *buffer, size_t size, int hfh)  	__insn_mtspr(SPR_DSTREAM_PF, old_dstream_pf);  #endif  } +EXPORT_SYMBOL_GPL(finv_buffer_remote); diff --git a/arch/tile/lib/cpumask.c b/arch/tile/lib/cpumask.c index fdc403614d1..75947edccb2 100644 --- a/arch/tile/lib/cpumask.c +++ b/arch/tile/lib/cpumask.c @@ -16,6 +16,7 @@  #include <linux/ctype.h>  #include <linux/errno.h>  #include <linux/smp.h> +#include <linux/export.h>  /*   * Allow cropping out bits beyond the end of the array. @@ -50,3 +51,4 @@ int bitmap_parselist_crop(const char *bp, unsigned long *maskp, int nmaskbits)  	} while (*bp != '\0' && *bp != '\n');  	return 0;  } +EXPORT_SYMBOL(bitmap_parselist_crop); diff --git a/arch/tile/lib/exports.c b/arch/tile/lib/exports.c index dd5f0a33fda..4385cb6fa00 100644 --- a/arch/tile/lib/exports.c +++ b/arch/tile/lib/exports.c @@ -55,6 +55,8 @@ EXPORT_SYMBOL(hv_dev_poll_cancel);  EXPORT_SYMBOL(hv_dev_close);  EXPORT_SYMBOL(hv_sysconf);  EXPORT_SYMBOL(hv_confstr); +EXPORT_SYMBOL(hv_get_rtc); +EXPORT_SYMBOL(hv_set_rtc);  /* libgcc.a */  uint32_t __udivsi3(uint32_t dividend, uint32_t divisor); diff --git a/arch/tile/mm/homecache.c b/arch/tile/mm/homecache.c index 5f7868dcd6d..1ae911939a1 100644 --- a/arch/tile/mm/homecache.c +++ b/arch/tile/mm/homecache.c @@ -408,6 +408,7 @@ void homecache_change_page_home(struct page *page, int order, int home)  		__set_pte(ptep, pte_set_home(pteval, home));  	}  } +EXPORT_SYMBOL(homecache_change_page_home);  struct page *homecache_alloc_pages(gfp_t gfp_mask,  				   unsigned int order, int home) diff --git a/arch/unicore32/kernel/pci.c b/arch/unicore32/kernel/pci.c index 7c4359240b8..ef69c0c8282 100644 --- a/arch/unicore32/kernel/pci.c +++ b/arch/unicore32/kernel/pci.c @@ -167,7 +167,7 @@ static inline int pdev_bad_for_parity(struct pci_dev *dev)   * pcibios_fixup_bus - Called after each bus is probed,   * but before its children are examined.   */ -void __devinit pcibios_fixup_bus(struct pci_bus *bus) +void pcibios_fixup_bus(struct pci_bus *bus)  {  	struct pci_dev *dev;  	u16 features = PCI_COMMAND_SERR diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 79795af5981..260857a53b8 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -1,7 +1,7 @@  # Select 32 or 64 bit  config 64BIT  	bool "64-bit kernel" if ARCH = "x86" -	default ARCH = "x86_64" +	default ARCH != "i386"  	---help---  	  Say yes to build a 64-bit kernel - formerly known as x86_64  	  Say no to build a 32-bit kernel - formerly known as i386 @@ -28,7 +28,6 @@ config X86  	select HAVE_OPROFILE  	select HAVE_PCSPKR_PLATFORM  	select HAVE_PERF_EVENTS -	select HAVE_IRQ_WORK  	select HAVE_IOREMAP_PROT  	select HAVE_KPROBES  	select HAVE_MEMBLOCK @@ -40,10 +39,12 @@ config X86  	select HAVE_DMA_CONTIGUOUS if !SWIOTLB  	select HAVE_KRETPROBES  	select HAVE_OPTPROBES +	select HAVE_KPROBES_ON_FTRACE  	select HAVE_FTRACE_MCOUNT_RECORD  	select HAVE_FENTRY if X86_64  	select HAVE_C_RECORDMCOUNT  	select HAVE_DYNAMIC_FTRACE +	select HAVE_DYNAMIC_FTRACE_WITH_REGS  	select HAVE_FUNCTION_TRACER  	select HAVE_FUNCTION_GRAPH_TRACER  	select HAVE_FUNCTION_GRAPH_FP_TEST @@ -106,6 +107,7 @@ config X86  	select GENERIC_CLOCKEVENTS_BROADCAST if X86_64 || (X86_32 && X86_LOCAL_APIC)  	select GENERIC_TIME_VSYSCALL if X86_64  	select KTIME_SCALAR if X86_32 +	select ALWAYS_USE_PERSISTENT_CLOCK  	select GENERIC_STRNCPY_FROM_USER  	select GENERIC_STRNLEN_USER  	select HAVE_CONTEXT_TRACKING if X86_64 @@ -114,6 +116,7 @@ config X86  	select MODULES_USE_ELF_RELA if X86_64  	select CLONE_BACKWARDS if X86_32  	select GENERIC_SIGALTSTACK +	select ARCH_USE_BUILTIN_BSWAP  config INSTRUCTION_DECODER  	def_bool y @@ -320,6 +323,10 @@ config X86_BIGSMP  	---help---  	  This option is needed for the systems that have more than 8 CPUs +config GOLDFISH +       def_bool y +       depends on X86_GOLDFISH +  if X86_32  config X86_EXTENDED_PLATFORM  	bool "Support for extended (non-PC) x86 platforms" @@ -402,6 +409,14 @@ config X86_UV  # Following is an alphabetically sorted list of 32 bit extended platforms  # Please maintain the alphabetic order if and when there are additions +config X86_GOLDFISH +       bool "Goldfish (Virtual Platform)" +       depends on X86_32 +       ---help--- +	 Enable support for the Goldfish virtual platform used primarily +	 for Android development. Unless you are building for the Android +	 Goldfish emulator say N here. +  config X86_INTEL_CE  	bool "CE4100 TV platform"  	depends on PCI @@ -2138,6 +2153,7 @@ config OLPC_XO1_RTC  config OLPC_XO1_SCI  	bool "OLPC XO-1 SCI extras"  	depends on OLPC && OLPC_XO1_PM +	depends on INPUT=y  	select POWER_SUPPLY  	select GPIO_CS5535  	select MFD_CORE @@ -2187,6 +2203,15 @@ config GEOS  	---help---  	  This option enables system support for the Traverse Technologies GEOS. +config TS5500 +	bool "Technologic Systems TS-5500 platform support" +	depends on MELAN +	select CHECK_SIGNATURE +	select NEW_LEDS +	select LEDS_CLASS +	---help--- +	  This option enables system support for the Technologic Systems TS-5500. +  endif # X86_32  config AMD_NB diff --git a/arch/x86/Makefile b/arch/x86/Makefile index e71fc4279aa..5c477260294 100644 --- a/arch/x86/Makefile +++ b/arch/x86/Makefile @@ -2,7 +2,11 @@  # select defconfig based on actual architecture  ifeq ($(ARCH),x86) +  ifeq ($(shell uname -m),x86_64) +        KBUILD_DEFCONFIG := x86_64_defconfig +  else          KBUILD_DEFCONFIG := i386_defconfig +  endif  else          KBUILD_DEFCONFIG := $(ARCH)_defconfig  endif diff --git a/arch/x86/boot/Makefile b/arch/x86/boot/Makefile index ccce0ed67dd..379814bc41e 100644 --- a/arch/x86/boot/Makefile +++ b/arch/x86/boot/Makefile @@ -71,7 +71,7 @@ GCOV_PROFILE := n  $(obj)/bzImage: asflags-y  := $(SVGA_MODE)  quiet_cmd_image = BUILD   $@ -cmd_image = $(obj)/tools/build $(obj)/setup.bin $(obj)/vmlinux.bin > $@ +cmd_image = $(obj)/tools/build $(obj)/setup.bin $(obj)/vmlinux.bin $(obj)/zoffset.h > $@  $(obj)/bzImage: $(obj)/setup.bin $(obj)/vmlinux.bin $(obj)/tools/build FORCE  	$(call if_changed,image) @@ -92,7 +92,7 @@ targets += voffset.h  $(obj)/voffset.h: vmlinux FORCE  	$(call if_changed,voffset) -sed-zoffset := -e 's/^\([0-9a-fA-F]*\) . \(startup_32\|input_data\|_end\|z_.*\)$$/\#define ZO_\2 0x\1/p' +sed-zoffset := -e 's/^\([0-9a-fA-F]*\) . \(startup_32\|startup_64\|efi_pe_entry\|efi_stub_entry\|input_data\|_end\|z_.*\)$$/\#define ZO_\2 0x\1/p'  quiet_cmd_zoffset = ZOFFSET $@        cmd_zoffset = $(NM) $< | sed -n $(sed-zoffset) > $@ diff --git a/arch/x86/boot/compressed/eboot.c b/arch/x86/boot/compressed/eboot.c index b1942e22276..f8fa41190c3 100644 --- a/arch/x86/boot/compressed/eboot.c +++ b/arch/x86/boot/compressed/eboot.c @@ -256,10 +256,10 @@ static efi_status_t setup_efi_pci(struct boot_params *params)  	int i;  	struct setup_data *data; -	data = (struct setup_data *)params->hdr.setup_data; +	data = (struct setup_data *)(unsigned long)params->hdr.setup_data;  	while (data && data->next) -		data = (struct setup_data *)data->next; +		data = (struct setup_data *)(unsigned long)data->next;  	status = efi_call_phys5(sys_table->boottime->locate_handle,  				EFI_LOCATE_BY_PROTOCOL, &pci_proto, @@ -295,16 +295,18 @@ static efi_status_t setup_efi_pci(struct boot_params *params)  		if (!pci)  			continue; +#ifdef CONFIG_X86_64  		status = efi_call_phys4(pci->attributes, pci,  					EfiPciIoAttributeOperationGet, 0,  					&attributes); - +#else +		status = efi_call_phys5(pci->attributes, pci, +					EfiPciIoAttributeOperationGet, 0, 0, +					&attributes); +#endif  		if (status != EFI_SUCCESS)  			continue; -		if (!attributes & EFI_PCI_IO_ATTRIBUTE_EMBEDDED_ROM) -			continue; -  		if (!pci->romimage || !pci->romsize)  			continue; @@ -345,9 +347,9 @@ static efi_status_t setup_efi_pci(struct boot_params *params)  		memcpy(rom->romdata, pci->romimage, pci->romsize);  		if (data) -			data->next = (uint64_t)rom; +			data->next = (unsigned long)rom;  		else -			params->hdr.setup_data = (uint64_t)rom; +			params->hdr.setup_data = (unsigned long)rom;  		data = (struct setup_data *)rom; @@ -432,10 +434,9 @@ static efi_status_t setup_gop(struct screen_info *si, efi_guid_t *proto,  			 * Once we've found a GOP supporting ConOut,  			 * don't bother looking any further.  			 */ +			first_gop = gop;  			if (conout_found)  				break; - -			first_gop = gop;  		}  	} diff --git a/arch/x86/boot/compressed/head_32.S b/arch/x86/boot/compressed/head_32.S index aa4aaf1b238..1e3184f6072 100644 --- a/arch/x86/boot/compressed/head_32.S +++ b/arch/x86/boot/compressed/head_32.S @@ -35,11 +35,11 @@ ENTRY(startup_32)  #ifdef CONFIG_EFI_STUB  	jmp	preferred_addr -	.balign	0x10  	/*  	 * We don't need the return address, so set up the stack so -	 * efi_main() can find its arugments. +	 * efi_main() can find its arguments.  	 */ +ENTRY(efi_pe_entry)  	add	$0x4, %esp  	call	make_boot_params @@ -50,8 +50,10 @@ ENTRY(startup_32)  	pushl	%eax  	pushl	%esi  	pushl	%ecx +	sub	$0x4, %esp -	.org 0x30,0x90 +ENTRY(efi_stub_entry) +	add	$0x4, %esp  	call	efi_main  	cmpl	$0, %eax  	movl	%eax, %esi diff --git a/arch/x86/boot/compressed/head_64.S b/arch/x86/boot/compressed/head_64.S index 2c4b171eec3..f5d1aaa0dec 100644 --- a/arch/x86/boot/compressed/head_64.S +++ b/arch/x86/boot/compressed/head_64.S @@ -201,12 +201,12 @@ ENTRY(startup_64)  	 */  #ifdef CONFIG_EFI_STUB  	/* -	 * The entry point for the PE/COFF executable is 0x210, so only -	 * legacy boot loaders will execute this jmp. +	 * The entry point for the PE/COFF executable is efi_pe_entry, so +	 * only legacy boot loaders will execute this jmp.  	 */  	jmp	preferred_addr -	.org 0x210 +ENTRY(efi_pe_entry)  	mov	%rcx, %rdi  	mov	%rdx, %rsi  	pushq	%rdi @@ -218,7 +218,7 @@ ENTRY(startup_64)  	popq	%rsi  	popq	%rdi -	.org 0x230,0x90 +ENTRY(efi_stub_entry)  	call	efi_main  	movq	%rax,%rsi  	cmpq	$0,%rax diff --git a/arch/x86/boot/compressed/misc.c b/arch/x86/boot/compressed/misc.c index 88f7ff6da40..7cb56c6ca35 100644 --- a/arch/x86/boot/compressed/misc.c +++ b/arch/x86/boot/compressed/misc.c @@ -325,6 +325,8 @@ asmlinkage void decompress_kernel(void *rmode, memptr heap,  {  	real_mode = rmode; +	sanitize_boot_params(real_mode); +  	if (real_mode->screen_info.orig_video_mode == 7) {  		vidmem = (char *) 0xb0000;  		vidport = 0x3b4; diff --git a/arch/x86/boot/compressed/misc.h b/arch/x86/boot/compressed/misc.h index 0e6dc0ee0ee..674019d8e23 100644 --- a/arch/x86/boot/compressed/misc.h +++ b/arch/x86/boot/compressed/misc.h @@ -18,6 +18,7 @@  #include <asm/page.h>  #include <asm/boot.h>  #include <asm/bootparam.h> +#include <asm/bootparam_utils.h>  #define BOOT_BOOT_H  #include "../ctype.h" diff --git a/arch/x86/boot/header.S b/arch/x86/boot/header.S index 8c132a625b9..944ce595f76 100644 --- a/arch/x86/boot/header.S +++ b/arch/x86/boot/header.S @@ -21,6 +21,7 @@  #include <asm/e820.h>  #include <asm/page_types.h>  #include <asm/setup.h> +#include <asm/bootparam.h>  #include "boot.h"  #include "voffset.h"  #include "zoffset.h" @@ -255,6 +256,9 @@ section_table:  	# header, from the old boot sector.  	.section ".header", "a" +	.globl	sentinel +sentinel:	.byte 0xff, 0xff        /* Used to detect broken loaders */ +  	.globl	hdr  hdr:  setup_sects:	.byte 0			/* Filled in by build.c */ @@ -279,7 +283,7 @@ _start:  	# Part 2 of the header, from the old setup.S  		.ascii	"HdrS"		# header signature -		.word	0x020b		# header version number (>= 0x0105) +		.word	0x020c		# header version number (>= 0x0105)  					# or else old loadlin-1.5 will fail)  		.globl realmode_swtch  realmode_swtch:	.word	0, 0		# default_switch, SETUPSEG @@ -297,13 +301,7 @@ type_of_loader:	.byte	0		# 0 means ancient bootloader, newer  # flags, unused bits must be zero (RFU) bit within loadflags  loadflags: -LOADED_HIGH	= 1			# If set, the kernel is loaded high -CAN_USE_HEAP	= 0x80			# If set, the loader also has set -					# heap_end_ptr to tell how much -					# space behind setup.S can be used for -					# heap purposes. -					# Only the loader knows what is free -		.byte	LOADED_HIGH +		.byte	LOADED_HIGH	# The kernel is to be loaded high  setup_move_size: .word  0x8000		# size to move, when setup is not  					# loaded at 0x90000. We will move setup @@ -369,7 +367,23 @@ relocatable_kernel:    .byte 1  relocatable_kernel:    .byte 0  #endif  min_alignment:		.byte MIN_KERNEL_ALIGN_LG2	# minimum alignment -pad3:			.word 0 + +xloadflags: +#ifdef CONFIG_X86_64 +# define XLF0 XLF_KERNEL_64			/* 64-bit kernel */ +#else +# define XLF0 0 +#endif +#ifdef CONFIG_EFI_STUB +# ifdef CONFIG_X86_64 +#  define XLF23 XLF_EFI_HANDOVER_64		/* 64-bit EFI handover ok */ +# else +#  define XLF23 XLF_EFI_HANDOVER_32		/* 32-bit EFI handover ok */ +# endif +#else +# define XLF23 0 +#endif +			.word XLF0 | XLF23  cmdline_size:   .long   COMMAND_LINE_SIZE-1     #length of the command line,                                                  #added with boot protocol @@ -397,8 +411,13 @@ pref_address:		.quad LOAD_PHYSICAL_ADDR	# preferred load addr  #define INIT_SIZE VO_INIT_SIZE  #endif  init_size:		.long INIT_SIZE		# kernel initialization size -handover_offset:	.long 0x30		# offset to the handover +handover_offset: +#ifdef CONFIG_EFI_STUB +  			.long 0x30		# offset to the handover  						# protocol entry point +#else +			.long 0 +#endif  # End of setup header ##################################################### diff --git a/arch/x86/boot/setup.ld b/arch/x86/boot/setup.ld index 03c0683636b..96a6c756353 100644 --- a/arch/x86/boot/setup.ld +++ b/arch/x86/boot/setup.ld @@ -13,7 +13,7 @@ SECTIONS  	.bstext		: { *(.bstext) }  	.bsdata		: { *(.bsdata) } -	. = 497; +	. = 495;  	.header		: { *(.header) }  	.entrytext	: { *(.entrytext) }  	.inittext	: { *(.inittext) } diff --git a/arch/x86/boot/tools/build.c b/arch/x86/boot/tools/build.c index 4b8e165ee57..94c54465002 100644 --- a/arch/x86/boot/tools/build.c +++ b/arch/x86/boot/tools/build.c @@ -52,6 +52,10 @@ int is_big_kernel;  #define PECOFF_RELOC_RESERVE 0x20 +unsigned long efi_stub_entry; +unsigned long efi_pe_entry; +unsigned long startup_64; +  /*----------------------------------------------------------------------*/  static const u32 crctab32[] = { @@ -132,7 +136,7 @@ static void die(const char * str, ...)  static void usage(void)  { -	die("Usage: build setup system [> image]"); +	die("Usage: build setup system [zoffset.h] [> image]");  }  #ifdef CONFIG_EFI_STUB @@ -206,30 +210,54 @@ static void update_pecoff_text(unsigned int text_start, unsigned int file_sz)  	 */  	put_unaligned_le32(file_sz - 512, &buf[pe_header + 0x1c]); -#ifdef CONFIG_X86_32  	/* -	 * Address of entry point. -	 * -	 * The EFI stub entry point is +16 bytes from the start of -	 * the .text section. +	 * Address of entry point for PE/COFF executable  	 */ -	put_unaligned_le32(text_start + 16, &buf[pe_header + 0x28]); -#else -	/* -	 * Address of entry point. startup_32 is at the beginning and -	 * the 64-bit entry point (startup_64) is always 512 bytes -	 * after. The EFI stub entry point is 16 bytes after that, as -	 * the first instruction allows legacy loaders to jump over -	 * the EFI stub initialisation -	 */ -	put_unaligned_le32(text_start + 528, &buf[pe_header + 0x28]); -#endif /* CONFIG_X86_32 */ +	put_unaligned_le32(text_start + efi_pe_entry, &buf[pe_header + 0x28]);  	update_pecoff_section_header(".text", text_start, text_sz);  }  #endif /* CONFIG_EFI_STUB */ + +/* + * Parse zoffset.h and find the entry points. We could just #include zoffset.h + * but that would mean tools/build would have to be rebuilt every time. It's + * not as if parsing it is hard... + */ +#define PARSE_ZOFS(p, sym) do { \ +	if (!strncmp(p, "#define ZO_" #sym " ", 11+sizeof(#sym)))	\ +		sym = strtoul(p + 11 + sizeof(#sym), NULL, 16);		\ +} while (0) + +static void parse_zoffset(char *fname) +{ +	FILE *file; +	char *p; +	int c; + +	file = fopen(fname, "r"); +	if (!file) +		die("Unable to open `%s': %m", fname); +	c = fread(buf, 1, sizeof(buf) - 1, file); +	if (ferror(file)) +		die("read-error on `zoffset.h'"); +	buf[c] = 0; + +	p = (char *)buf; + +	while (p && *p) { +		PARSE_ZOFS(p, efi_stub_entry); +		PARSE_ZOFS(p, efi_pe_entry); +		PARSE_ZOFS(p, startup_64); + +		p = strchr(p, '\n'); +		while (p && (*p == '\r' || *p == '\n')) +			p++; +	} +} +  int main(int argc, char ** argv)  {  	unsigned int i, sz, setup_sectors; @@ -241,7 +269,19 @@ int main(int argc, char ** argv)  	void *kernel;  	u32 crc = 0xffffffffUL; -	if (argc != 3) +	/* Defaults for old kernel */ +#ifdef CONFIG_X86_32 +	efi_pe_entry = 0x10; +	efi_stub_entry = 0x30; +#else +	efi_pe_entry = 0x210; +	efi_stub_entry = 0x230; +	startup_64 = 0x200; +#endif + +	if (argc == 4) +		parse_zoffset(argv[3]); +	else if (argc != 3)  		usage();  	/* Copy the setup code */ @@ -299,6 +339,11 @@ int main(int argc, char ** argv)  #ifdef CONFIG_EFI_STUB  	update_pecoff_text(setup_sectors * 512, sz + i + ((sys_size * 16) - sz)); + +#ifdef CONFIG_X86_64 /* Yes, this is really how we defined it :( */ +	efi_stub_entry -= 0x200; +#endif +	put_unaligned_le32(efi_stub_entry, &buf[0x264]);  #endif  	crc = partial_crc32(buf, i, crc); diff --git a/arch/x86/configs/i386_defconfig b/arch/x86/configs/i386_defconfig index 5598547281a..94447086e55 100644 --- a/arch/x86/configs/i386_defconfig +++ b/arch/x86/configs/i386_defconfig @@ -1,3 +1,4 @@ +# CONFIG_64BIT is not set  CONFIG_EXPERIMENTAL=y  # CONFIG_LOCALVERSION_AUTO is not set  CONFIG_SYSVIPC=y diff --git a/arch/x86/ia32/ia32entry.S b/arch/x86/ia32/ia32entry.S index 102ff7cb3e4..142c4ceff11 100644 --- a/arch/x86/ia32/ia32entry.S +++ b/arch/x86/ia32/ia32entry.S @@ -207,7 +207,7 @@ sysexit_from_sys_call:  	testl $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT),TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET)  	jnz ia32_ret_from_sys_call  	TRACE_IRQS_ON -	sti +	ENABLE_INTERRUPTS(CLBR_NONE)  	movl %eax,%esi		/* second arg, syscall return value */  	cmpl $-MAX_ERRNO,%eax	/* is it an error ? */  	jbe 1f @@ -217,7 +217,7 @@ sysexit_from_sys_call:  	call __audit_syscall_exit  	movq RAX-ARGOFFSET(%rsp),%rax	/* reload syscall return value */  	movl $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT),%edi -	cli +	DISABLE_INTERRUPTS(CLBR_NONE)  	TRACE_IRQS_OFF  	testl %edi,TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET)  	jz \exit diff --git a/arch/x86/include/asm/amd_nb.h b/arch/x86/include/asm/amd_nb.h index b3341e9cd8f..a54ee1d054d 100644 --- a/arch/x86/include/asm/amd_nb.h +++ b/arch/x86/include/asm/amd_nb.h @@ -81,6 +81,23 @@ static inline struct amd_northbridge *node_to_amd_nb(int node)  	return (node < amd_northbridges.num) ? &amd_northbridges.nb[node] : NULL;  } +static inline u16 amd_get_node_id(struct pci_dev *pdev) +{ +	struct pci_dev *misc; +	int i; + +	for (i = 0; i != amd_nb_num(); i++) { +		misc = node_to_amd_nb(i)->misc; + +		if (pci_domain_nr(misc->bus) == pci_domain_nr(pdev->bus) && +		    PCI_SLOT(misc->devfn) == PCI_SLOT(pdev->devfn)) +			return i; +	} + +	WARN(1, "Unable to find AMD Northbridge id for %s\n", pci_name(pdev)); +	return 0; +} +  #else  #define amd_nb_num(x)		0 diff --git a/arch/x86/include/asm/bootparam_utils.h b/arch/x86/include/asm/bootparam_utils.h new file mode 100644 index 00000000000..5b5e9cb774b --- /dev/null +++ b/arch/x86/include/asm/bootparam_utils.h @@ -0,0 +1,38 @@ +#ifndef _ASM_X86_BOOTPARAM_UTILS_H +#define _ASM_X86_BOOTPARAM_UTILS_H + +#include <asm/bootparam.h> + +/* + * This file is included from multiple environments.  Do not + * add completing #includes to make it standalone. + */ + +/* + * Deal with bootloaders which fail to initialize unknown fields in + * boot_params to zero.  The list fields in this list are taken from + * analysis of kexec-tools; if other broken bootloaders initialize a + * different set of fields we will need to figure out how to disambiguate. + * + */ +static void sanitize_boot_params(struct boot_params *boot_params) +{ +	if (boot_params->sentinel) { +		/*fields in boot_params are not valid, clear them */ +		memset(&boot_params->olpc_ofw_header, 0, +		       (char *)&boot_params->alt_mem_k - +			(char *)&boot_params->olpc_ofw_header); +		memset(&boot_params->kbd_status, 0, +		       (char *)&boot_params->hdr - +		       (char *)&boot_params->kbd_status); +		memset(&boot_params->_pad7[0], 0, +		       (char *)&boot_params->edd_mbr_sig_buffer[0] - +			(char *)&boot_params->_pad7[0]); +		memset(&boot_params->_pad8[0], 0, +		       (char *)&boot_params->eddbuf[0] - +			(char *)&boot_params->_pad8[0]); +		memset(&boot_params->_pad9[0], 0, sizeof(boot_params->_pad9)); +	} +} + +#endif /* _ASM_X86_BOOTPARAM_UTILS_H */ diff --git a/arch/x86/include/asm/cpufeature.h b/arch/x86/include/asm/cpufeature.h index 2d9075e863a..93fe929d1ce 100644 --- a/arch/x86/include/asm/cpufeature.h +++ b/arch/x86/include/asm/cpufeature.h @@ -167,6 +167,7 @@  #define X86_FEATURE_TBM		(6*32+21) /* trailing bit manipulations */  #define X86_FEATURE_TOPOEXT	(6*32+22) /* topology extensions CPUID leafs */  #define X86_FEATURE_PERFCTR_CORE (6*32+23) /* core performance counter extensions */ +#define X86_FEATURE_PERFCTR_NB  (6*32+24) /* NB performance counter extensions */  /*   * Auxiliary flags: Linux defined - For features scattered in various @@ -309,6 +310,7 @@ extern const char * const x86_power_flags[32];  #define cpu_has_hypervisor	boot_cpu_has(X86_FEATURE_HYPERVISOR)  #define cpu_has_pclmulqdq	boot_cpu_has(X86_FEATURE_PCLMULQDQ)  #define cpu_has_perfctr_core	boot_cpu_has(X86_FEATURE_PERFCTR_CORE) +#define cpu_has_perfctr_nb	boot_cpu_has(X86_FEATURE_PERFCTR_NB)  #define cpu_has_cx8		boot_cpu_has(X86_FEATURE_CX8)  #define cpu_has_cx16		boot_cpu_has(X86_FEATURE_CX16)  #define cpu_has_eager_fpu	boot_cpu_has(X86_FEATURE_EAGER_FPU) diff --git a/arch/x86/include/asm/efi.h b/arch/x86/include/asm/efi.h index 6e8fdf5ad11..28677c55113 100644 --- a/arch/x86/include/asm/efi.h +++ b/arch/x86/include/asm/efi.h @@ -94,6 +94,7 @@ extern void __iomem *efi_ioremap(unsigned long addr, unsigned long size,  #endif /* CONFIG_X86_32 */  extern int add_efi_memmap; +extern unsigned long x86_efi_facility;  extern void efi_set_executable(efi_memory_desc_t *md, bool executable);  extern int efi_memblock_x86_reserve_range(void);  extern void efi_call_phys_prelog(void); diff --git a/arch/x86/include/asm/ftrace.h b/arch/x86/include/asm/ftrace.h index 9a25b522d37..86cb51e1ca9 100644 --- a/arch/x86/include/asm/ftrace.h +++ b/arch/x86/include/asm/ftrace.h @@ -44,7 +44,6 @@  #ifdef CONFIG_DYNAMIC_FTRACE  #define ARCH_SUPPORTS_FTRACE_OPS 1 -#define ARCH_SUPPORTS_FTRACE_SAVE_REGS  #endif  #ifndef __ASSEMBLY__ diff --git a/arch/x86/include/asm/hpet.h b/arch/x86/include/asm/hpet.h index 434e2106cc8..b18df579c0e 100644 --- a/arch/x86/include/asm/hpet.h +++ b/arch/x86/include/asm/hpet.h @@ -80,9 +80,9 @@ extern void hpet_msi_write(struct hpet_dev *hdev, struct msi_msg *msg);  extern void hpet_msi_read(struct hpet_dev *hdev, struct msi_msg *msg);  #ifdef CONFIG_PCI_MSI -extern int arch_setup_hpet_msi(unsigned int irq, unsigned int id); +extern int default_setup_hpet_msi(unsigned int irq, unsigned int id);  #else -static inline int arch_setup_hpet_msi(unsigned int irq, unsigned int id) +static inline int default_setup_hpet_msi(unsigned int irq, unsigned int id)  {  	return -EINVAL;  } @@ -111,6 +111,7 @@ extern void hpet_unregister_irq_handler(rtc_irq_handler handler);  static inline int hpet_enable(void) { return 0; }  static inline int is_hpet_enabled(void) { return 0; }  #define hpet_readl(a) 0 +#define default_setup_hpet_msi	NULL  #endif  #endif /* _ASM_X86_HPET_H */ diff --git a/arch/x86/include/asm/hw_irq.h b/arch/x86/include/asm/hw_irq.h index eb92a6ed2be..10a78c3d3d5 100644 --- a/arch/x86/include/asm/hw_irq.h +++ b/arch/x86/include/asm/hw_irq.h @@ -101,6 +101,7 @@ static inline void set_io_apic_irq_attr(struct io_apic_irq_attr *irq_attr,  	irq_attr->polarity	= polarity;  } +/* Intel specific interrupt remapping information */  struct irq_2_iommu {  	struct intel_iommu *iommu;  	u16 irte_index; @@ -108,6 +109,12 @@ struct irq_2_iommu {  	u8  irte_mask;  }; +/* AMD specific interrupt remapping information */ +struct irq_2_irte { +	u16 devid; /* Device ID for IRTE table */ +	u16 index; /* Index into IRTE table*/ +}; +  /*   * This is performance-critical, we want to do it O(1)   * @@ -120,7 +127,11 @@ struct irq_cfg {  	u8			vector;  	u8			move_in_progress : 1;  #ifdef CONFIG_IRQ_REMAP -	struct irq_2_iommu	irq_2_iommu; +	u8			remapped : 1; +	union { +		struct irq_2_iommu irq_2_iommu; +		struct irq_2_irte  irq_2_irte; +	};  #endif  }; diff --git a/arch/x86/include/asm/hypervisor.h b/arch/x86/include/asm/hypervisor.h index b518c750993..86095ed1413 100644 --- a/arch/x86/include/asm/hypervisor.h +++ b/arch/x86/include/asm/hypervisor.h @@ -25,6 +25,7 @@  extern void init_hypervisor(struct cpuinfo_x86 *c);  extern void init_hypervisor_platform(void); +extern bool hypervisor_x2apic_available(void);  /*   * x86 hypervisor information @@ -41,6 +42,9 @@ struct hypervisor_x86 {  	/* Platform setup (run once per boot) */  	void		(*init_platform)(void); + +	/* X2APIC detection (run once per boot) */ +	bool		(*x2apic_available)(void);  };  extern const struct hypervisor_x86 *x86_hyper; @@ -51,13 +55,4 @@ extern const struct hypervisor_x86 x86_hyper_ms_hyperv;  extern const struct hypervisor_x86 x86_hyper_xen_hvm;  extern const struct hypervisor_x86 x86_hyper_kvm; -static inline bool hypervisor_x2apic_available(void) -{ -	if (kvm_para_available()) -		return true; -	if (xen_x2apic_para_available()) -		return true; -	return false; -} -  #endif diff --git a/arch/x86/include/asm/io_apic.h b/arch/x86/include/asm/io_apic.h index 73d8c5398ea..459e50a424d 100644 --- a/arch/x86/include/asm/io_apic.h +++ b/arch/x86/include/asm/io_apic.h @@ -144,11 +144,24 @@ extern int timer_through_8259;  	(mp_irq_entries && !skip_ioapic_setup && io_apic_irqs)  struct io_apic_irq_attr; +struct irq_cfg;  extern int io_apic_set_pci_routing(struct device *dev, int irq,  		 struct io_apic_irq_attr *irq_attr);  void setup_IO_APIC_irq_extra(u32 gsi);  extern void ioapic_insert_resources(void); +extern int native_setup_ioapic_entry(int, struct IO_APIC_route_entry *, +				     unsigned int, int, +				     struct io_apic_irq_attr *); +extern int native_setup_ioapic_entry(int, struct IO_APIC_route_entry *, +				     unsigned int, int, +				     struct io_apic_irq_attr *); +extern void eoi_ioapic_irq(unsigned int irq, struct irq_cfg *cfg); + +extern void native_compose_msi_msg(struct pci_dev *pdev, +				   unsigned int irq, unsigned int dest, +				   struct msi_msg *msg, u8 hpet_id); +extern void native_eoi_ioapic_pin(int apic, int pin, int vector);  int io_apic_setup_irq_pin_once(unsigned int irq, int node, struct io_apic_irq_attr *attr);  extern int save_ioapic_entries(void); @@ -179,6 +192,12 @@ extern void __init native_io_apic_init_mappings(void);  extern unsigned int native_io_apic_read(unsigned int apic, unsigned int reg);  extern void native_io_apic_write(unsigned int apic, unsigned int reg, unsigned int val);  extern void native_io_apic_modify(unsigned int apic, unsigned int reg, unsigned int val); +extern void native_disable_io_apic(void); +extern void native_io_apic_print_entries(unsigned int apic, unsigned int nr_entries); +extern void intel_ir_io_apic_print_entries(unsigned int apic, unsigned int nr_entries); +extern int native_ioapic_set_affinity(struct irq_data *, +				      const struct cpumask *, +				      bool);  static inline unsigned int io_apic_read(unsigned int apic, unsigned int reg)  { @@ -193,6 +212,9 @@ static inline void io_apic_modify(unsigned int apic, unsigned int reg, unsigned  {  	x86_io_apic_ops.modify(apic, reg, value);  } + +extern void io_apic_eoi(unsigned int apic, unsigned int vector); +  #else  /* !CONFIG_X86_IO_APIC */  #define io_apic_assign_pci_irqs 0 @@ -223,6 +245,12 @@ static inline void disable_ioapic_support(void) { }  #define native_io_apic_read		NULL  #define native_io_apic_write		NULL  #define native_io_apic_modify		NULL +#define native_disable_io_apic		NULL +#define native_io_apic_print_entries	NULL +#define native_ioapic_set_affinity	NULL +#define native_setup_ioapic_entry	NULL +#define native_compose_msi_msg		NULL +#define native_eoi_ioapic_pin		NULL  #endif  #endif /* _ASM_X86_IO_APIC_H */ diff --git a/arch/x86/include/asm/irq_remapping.h b/arch/x86/include/asm/irq_remapping.h index 5fb9bbbd2f1..95fd3527f63 100644 --- a/arch/x86/include/asm/irq_remapping.h +++ b/arch/x86/include/asm/irq_remapping.h @@ -26,8 +26,6 @@  #ifdef CONFIG_IRQ_REMAP -extern int irq_remapping_enabled; -  extern void setup_irq_remapping_ops(void);  extern int irq_remapping_supported(void);  extern int irq_remapping_prepare(void); @@ -40,21 +38,19 @@ extern int setup_ioapic_remapped_entry(int irq,  				       unsigned int destination,  				       int vector,  				       struct io_apic_irq_attr *attr); -extern int set_remapped_irq_affinity(struct irq_data *data, -				     const struct cpumask *mask, -				     bool force);  extern void free_remapped_irq(int irq);  extern void compose_remapped_msi_msg(struct pci_dev *pdev,  				     unsigned int irq, unsigned int dest,  				     struct msi_msg *msg, u8 hpet_id); -extern int msi_alloc_remapped_irq(struct pci_dev *pdev, int irq, int nvec); -extern int msi_setup_remapped_irq(struct pci_dev *pdev, unsigned int irq, -				  int index, int sub_handle);  extern int setup_hpet_msi_remapped(unsigned int irq, unsigned int id); +extern void panic_if_irq_remap(const char *msg); +extern bool setup_remapped_irq(int irq, +			       struct irq_cfg *cfg, +			       struct irq_chip *chip); -#else  /* CONFIG_IRQ_REMAP */ +void irq_remap_modify_chip_defaults(struct irq_chip *chip); -#define irq_remapping_enabled	0 +#else  /* CONFIG_IRQ_REMAP */  static inline void setup_irq_remapping_ops(void) { }  static inline int irq_remapping_supported(void) { return 0; } @@ -71,30 +67,30 @@ static inline int setup_ioapic_remapped_entry(int irq,  {  	return -ENODEV;  } -static inline int set_remapped_irq_affinity(struct irq_data *data, -					    const struct cpumask *mask, -					    bool force) -{ -	return 0; -}  static inline void free_remapped_irq(int irq) { }  static inline void compose_remapped_msi_msg(struct pci_dev *pdev,  					    unsigned int irq, unsigned int dest,  					    struct msi_msg *msg, u8 hpet_id)  {  } -static inline int msi_alloc_remapped_irq(struct pci_dev *pdev, int irq, int nvec) +static inline int setup_hpet_msi_remapped(unsigned int irq, unsigned int id)  {  	return -ENODEV;  } -static inline int msi_setup_remapped_irq(struct pci_dev *pdev, unsigned int irq, -					 int index, int sub_handle) + +static inline void panic_if_irq_remap(const char *msg) +{ +} + +static inline void irq_remap_modify_chip_defaults(struct irq_chip *chip)  { -	return -ENODEV;  } -static inline int setup_hpet_msi_remapped(unsigned int irq, unsigned int id) + +static inline bool setup_remapped_irq(int irq, +				      struct irq_cfg *cfg, +				      struct irq_chip *chip)  { -	return -ENODEV; +	return false;  }  #endif /* CONFIG_IRQ_REMAP */ diff --git a/arch/x86/include/asm/irq_vectors.h b/arch/x86/include/asm/irq_vectors.h index 1508e518c7e..aac5fa62a86 100644 --- a/arch/x86/include/asm/irq_vectors.h +++ b/arch/x86/include/asm/irq_vectors.h @@ -109,8 +109,8 @@  #define UV_BAU_MESSAGE			0xf5 -/* Xen vector callback to receive events in a HVM domain */ -#define XEN_HVM_EVTCHN_CALLBACK		0xf3 +/* Vector on which hypervisor callbacks will be delivered */ +#define HYPERVISOR_CALLBACK_VECTOR	0xf3  /*   * Local APIC timer IRQ vector is on a different priority level, diff --git a/arch/x86/include/asm/kvm_para.h b/arch/x86/include/asm/kvm_para.h index 5ed1f16187b..65231e173ba 100644 --- a/arch/x86/include/asm/kvm_para.h +++ b/arch/x86/include/asm/kvm_para.h @@ -85,13 +85,13 @@ static inline long kvm_hypercall4(unsigned int nr, unsigned long p1,  	return ret;  } -static inline int kvm_para_available(void) +static inline bool kvm_para_available(void)  {  	unsigned int eax, ebx, ecx, edx;  	char signature[13];  	if (boot_cpu_data.cpuid_level < 0) -		return 0;	/* So we don't blow up on old processors */ +		return false;	/* So we don't blow up on old processors */  	if (cpu_has_hypervisor) {  		cpuid(KVM_CPUID_SIGNATURE, &eax, &ebx, &ecx, &edx); @@ -101,10 +101,10 @@ static inline int kvm_para_available(void)  		signature[12] = 0;  		if (strcmp(signature, "KVMKVMKVM") == 0) -			return 1; +			return true;  	} -	return 0; +	return false;  }  static inline unsigned int kvm_arch_para_features(void) diff --git a/arch/x86/include/asm/linkage.h b/arch/x86/include/asm/linkage.h index 48142971b25..79327e9483a 100644 --- a/arch/x86/include/asm/linkage.h +++ b/arch/x86/include/asm/linkage.h @@ -27,20 +27,20 @@  #define __asmlinkage_protect0(ret) \  	__asmlinkage_protect_n(ret)  #define __asmlinkage_protect1(ret, arg1) \ -	__asmlinkage_protect_n(ret, "g" (arg1)) +	__asmlinkage_protect_n(ret, "m" (arg1))  #define __asmlinkage_protect2(ret, arg1, arg2) \ -	__asmlinkage_protect_n(ret, "g" (arg1), "g" (arg2)) +	__asmlinkage_protect_n(ret, "m" (arg1), "m" (arg2))  #define __asmlinkage_protect3(ret, arg1, arg2, arg3) \ -	__asmlinkage_protect_n(ret, "g" (arg1), "g" (arg2), "g" (arg3)) +	__asmlinkage_protect_n(ret, "m" (arg1), "m" (arg2), "m" (arg3))  #define __asmlinkage_protect4(ret, arg1, arg2, arg3, arg4) \ -	__asmlinkage_protect_n(ret, "g" (arg1), "g" (arg2), "g" (arg3), \ -			      "g" (arg4)) +	__asmlinkage_protect_n(ret, "m" (arg1), "m" (arg2), "m" (arg3), \ +			      "m" (arg4))  #define __asmlinkage_protect5(ret, arg1, arg2, arg3, arg4, arg5) \ -	__asmlinkage_protect_n(ret, "g" (arg1), "g" (arg2), "g" (arg3), \ -			      "g" (arg4), "g" (arg5)) +	__asmlinkage_protect_n(ret, "m" (arg1), "m" (arg2), "m" (arg3), \ +			      "m" (arg4), "m" (arg5))  #define __asmlinkage_protect6(ret, arg1, arg2, arg3, arg4, arg5, arg6) \ -	__asmlinkage_protect_n(ret, "g" (arg1), "g" (arg2), "g" (arg3), \ -			      "g" (arg4), "g" (arg5), "g" (arg6)) +	__asmlinkage_protect_n(ret, "m" (arg1), "m" (arg2), "m" (arg3), \ +			      "m" (arg4), "m" (arg5), "m" (arg6))  #endif /* CONFIG_X86_32 */ diff --git a/arch/x86/include/asm/mce.h b/arch/x86/include/asm/mce.h index ecdfee60ee4..f4076af1f4e 100644 --- a/arch/x86/include/asm/mce.h +++ b/arch/x86/include/asm/mce.h @@ -3,6 +3,90 @@  #include <uapi/asm/mce.h> +/* + * Machine Check support for x86 + */ + +/* MCG_CAP register defines */ +#define MCG_BANKCNT_MASK	0xff         /* Number of Banks */ +#define MCG_CTL_P		(1ULL<<8)    /* MCG_CTL register available */ +#define MCG_EXT_P		(1ULL<<9)    /* Extended registers available */ +#define MCG_CMCI_P		(1ULL<<10)   /* CMCI supported */ +#define MCG_EXT_CNT_MASK	0xff0000     /* Number of Extended registers */ +#define MCG_EXT_CNT_SHIFT	16 +#define MCG_EXT_CNT(c)		(((c) & MCG_EXT_CNT_MASK) >> MCG_EXT_CNT_SHIFT) +#define MCG_SER_P		(1ULL<<24)   /* MCA recovery/new status bits */ + +/* MCG_STATUS register defines */ +#define MCG_STATUS_RIPV  (1ULL<<0)   /* restart ip valid */ +#define MCG_STATUS_EIPV  (1ULL<<1)   /* ip points to correct instruction */ +#define MCG_STATUS_MCIP  (1ULL<<2)   /* machine check in progress */ + +/* MCi_STATUS register defines */ +#define MCI_STATUS_VAL   (1ULL<<63)  /* valid error */ +#define MCI_STATUS_OVER  (1ULL<<62)  /* previous errors lost */ +#define MCI_STATUS_UC    (1ULL<<61)  /* uncorrected error */ +#define MCI_STATUS_EN    (1ULL<<60)  /* error enabled */ +#define MCI_STATUS_MISCV (1ULL<<59)  /* misc error reg. valid */ +#define MCI_STATUS_ADDRV (1ULL<<58)  /* addr reg. valid */ +#define MCI_STATUS_PCC   (1ULL<<57)  /* processor context corrupt */ +#define MCI_STATUS_S	 (1ULL<<56)  /* Signaled machine check */ +#define MCI_STATUS_AR	 (1ULL<<55)  /* Action required */ +#define MCACOD		  0xffff     /* MCA Error Code */ + +/* Architecturally defined codes from SDM Vol. 3B Chapter 15 */ +#define MCACOD_SCRUB	0x00C0	/* 0xC0-0xCF Memory Scrubbing */ +#define MCACOD_SCRUBMSK	0xfff0 +#define MCACOD_L3WB	0x017A	/* L3 Explicit Writeback */ +#define MCACOD_DATA	0x0134	/* Data Load */ +#define MCACOD_INSTR	0x0150	/* Instruction Fetch */ + +/* MCi_MISC register defines */ +#define MCI_MISC_ADDR_LSB(m)	((m) & 0x3f) +#define MCI_MISC_ADDR_MODE(m)	(((m) >> 6) & 7) +#define  MCI_MISC_ADDR_SEGOFF	0	/* segment offset */ +#define  MCI_MISC_ADDR_LINEAR	1	/* linear address */ +#define  MCI_MISC_ADDR_PHYS	2	/* physical address */ +#define  MCI_MISC_ADDR_MEM	3	/* memory address */ +#define  MCI_MISC_ADDR_GENERIC	7	/* generic */ + +/* CTL2 register defines */ +#define MCI_CTL2_CMCI_EN		(1ULL << 30) +#define MCI_CTL2_CMCI_THRESHOLD_MASK	0x7fffULL + +#define MCJ_CTX_MASK		3 +#define MCJ_CTX(flags)		((flags) & MCJ_CTX_MASK) +#define MCJ_CTX_RANDOM		0    /* inject context: random */ +#define MCJ_CTX_PROCESS		0x1  /* inject context: process */ +#define MCJ_CTX_IRQ		0x2  /* inject context: IRQ */ +#define MCJ_NMI_BROADCAST	0x4  /* do NMI broadcasting */ +#define MCJ_EXCEPTION		0x8  /* raise as exception */ +#define MCJ_IRQ_BRAODCAST	0x10 /* do IRQ broadcasting */ + +#define MCE_OVERFLOW 0		/* bit 0 in flags means overflow */ + +/* Software defined banks */ +#define MCE_EXTENDED_BANK	128 +#define MCE_THERMAL_BANK	(MCE_EXTENDED_BANK + 0) +#define K8_MCE_THRESHOLD_BASE   (MCE_EXTENDED_BANK + 1) + +#define MCE_LOG_LEN 32 +#define MCE_LOG_SIGNATURE	"MACHINECHECK" + +/* + * This structure contains all data related to the MCE log.  Also + * carries a signature to make it easier to find from external + * debugging tools.  Each entry is only valid when its finished flag + * is set. + */ +struct mce_log { +	char signature[12]; /* "MACHINECHECK" */ +	unsigned len;	    /* = MCE_LOG_LEN */ +	unsigned next; +	unsigned flags; +	unsigned recordlen;	/* length of struct mce */ +	struct mce entry[MCE_LOG_LEN]; +};  struct mca_config {  	bool dont_log_ce; diff --git a/arch/x86/include/asm/mshyperv.h b/arch/x86/include/asm/mshyperv.h index 79ce5685ab6..c2934be2446 100644 --- a/arch/x86/include/asm/mshyperv.h +++ b/arch/x86/include/asm/mshyperv.h @@ -11,4 +11,8 @@ struct ms_hyperv_info {  extern struct ms_hyperv_info ms_hyperv; +void hyperv_callback_vector(void); +void hyperv_vector_handler(struct pt_regs *regs); +void hv_register_vmbus_handler(int irq, irq_handler_t handler); +  #endif diff --git a/arch/x86/include/asm/parport.h b/arch/x86/include/asm/parport.h index 3c4ffeb467e..0d2d3b29118 100644 --- a/arch/x86/include/asm/parport.h +++ b/arch/x86/include/asm/parport.h @@ -1,8 +1,8 @@  #ifndef _ASM_X86_PARPORT_H  #define _ASM_X86_PARPORT_H -static int __devinit parport_pc_find_isa_ports(int autoirq, int autodma); -static int __devinit parport_pc_find_nonpci_ports(int autoirq, int autodma) +static int parport_pc_find_isa_ports(int autoirq, int autodma); +static int parport_pc_find_nonpci_ports(int autoirq, int autodma)  {  	return parport_pc_find_isa_ports(autoirq, autodma);  } diff --git a/arch/x86/include/asm/pci.h b/arch/x86/include/asm/pci.h index dba7805176b..c28fd02f4bf 100644 --- a/arch/x86/include/asm/pci.h +++ b/arch/x86/include/asm/pci.h @@ -121,9 +121,12 @@ static inline void x86_restore_msi_irqs(struct pci_dev *dev, int irq)  #define arch_teardown_msi_irq x86_teardown_msi_irq  #define arch_restore_msi_irqs x86_restore_msi_irqs  /* implemented in arch/x86/kernel/apic/io_apic. */ +struct msi_desc;  int native_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);  void native_teardown_msi_irq(unsigned int irq);  void native_restore_msi_irqs(struct pci_dev *dev, int irq); +int setup_msi_irq(struct pci_dev *dev, struct msi_desc *msidesc, +		  unsigned int irq_base, unsigned int irq_offset);  /* default to the implementation in drivers/lib/msi.c */  #define HAVE_DEFAULT_MSI_TEARDOWN_IRQS  #define HAVE_DEFAULT_MSI_RESTORE_IRQS diff --git a/arch/x86/include/asm/pci_x86.h b/arch/x86/include/asm/pci_x86.h index 73e8eeff22e..747e5a38b59 100644 --- a/arch/x86/include/asm/pci_x86.h +++ b/arch/x86/include/asm/pci_x86.h @@ -140,11 +140,10 @@ struct pci_mmcfg_region {  extern int __init pci_mmcfg_arch_init(void);  extern void __init pci_mmcfg_arch_free(void); -extern int __devinit pci_mmcfg_arch_map(struct pci_mmcfg_region *cfg); +extern int pci_mmcfg_arch_map(struct pci_mmcfg_region *cfg);  extern void pci_mmcfg_arch_unmap(struct pci_mmcfg_region *cfg); -extern int __devinit pci_mmconfig_insert(struct device *dev, -					 u16 seg, u8 start, -					 u8 end, phys_addr_t addr); +extern int pci_mmconfig_insert(struct device *dev, u16 seg, u8 start, u8 end, +			       phys_addr_t addr);  extern int pci_mmconfig_delete(u16 seg, u8 start, u8 end);  extern struct pci_mmcfg_region *pci_mmconfig_lookup(int segment, int bus); diff --git a/arch/x86/include/asm/perf_event.h b/arch/x86/include/asm/perf_event.h index 4fabcdf1cfa..57cb6340221 100644 --- a/arch/x86/include/asm/perf_event.h +++ b/arch/x86/include/asm/perf_event.h @@ -29,8 +29,13 @@  #define ARCH_PERFMON_EVENTSEL_INV			(1ULL << 23)  #define ARCH_PERFMON_EVENTSEL_CMASK			0xFF000000ULL -#define AMD_PERFMON_EVENTSEL_GUESTONLY			(1ULL << 40) -#define AMD_PERFMON_EVENTSEL_HOSTONLY			(1ULL << 41) +#define AMD64_EVENTSEL_INT_CORE_ENABLE			(1ULL << 36) +#define AMD64_EVENTSEL_GUESTONLY			(1ULL << 40) +#define AMD64_EVENTSEL_HOSTONLY				(1ULL << 41) + +#define AMD64_EVENTSEL_INT_CORE_SEL_SHIFT		37 +#define AMD64_EVENTSEL_INT_CORE_SEL_MASK		\ +	(0xFULL << AMD64_EVENTSEL_INT_CORE_SEL_SHIFT)  #define AMD64_EVENTSEL_EVENT	\  	(ARCH_PERFMON_EVENTSEL_EVENT | (0x0FULL << 32)) @@ -46,8 +51,12 @@  #define AMD64_RAW_EVENT_MASK		\  	(X86_RAW_EVENT_MASK          |  \  	 AMD64_EVENTSEL_EVENT) +#define AMD64_RAW_EVENT_MASK_NB		\ +	(AMD64_EVENTSEL_EVENT        |  \ +	 ARCH_PERFMON_EVENTSEL_UMASK)  #define AMD64_NUM_COUNTERS				4  #define AMD64_NUM_COUNTERS_CORE				6 +#define AMD64_NUM_COUNTERS_NB				4  #define ARCH_PERFMON_UNHALTED_CORE_CYCLES_SEL		0x3c  #define ARCH_PERFMON_UNHALTED_CORE_CYCLES_UMASK		(0x00 << 8) diff --git a/arch/x86/include/asm/pgtable.h b/arch/x86/include/asm/pgtable.h index 5199db2923d..fc304279b55 100644 --- a/arch/x86/include/asm/pgtable.h +++ b/arch/x86/include/asm/pgtable.h @@ -142,6 +142,11 @@ static inline unsigned long pmd_pfn(pmd_t pmd)  	return (pmd_val(pmd) & PTE_PFN_MASK) >> PAGE_SHIFT;  } +static inline unsigned long pud_pfn(pud_t pud) +{ +	return (pud_val(pud) & PTE_PFN_MASK) >> PAGE_SHIFT; +} +  #define pte_page(pte)	pfn_to_page(pte_pfn(pte))  static inline int pmd_large(pmd_t pte) @@ -781,6 +786,18 @@ static inline void clone_pgd_range(pgd_t *dst, pgd_t *src, int count)         memcpy(dst, src, count * sizeof(pgd_t));  } +/* + * The x86 doesn't have any external MMU info: the kernel page + * tables contain all the necessary information. + */ +static inline void update_mmu_cache(struct vm_area_struct *vma, +		unsigned long addr, pte_t *ptep) +{ +} +static inline void update_mmu_cache_pmd(struct vm_area_struct *vma, +		unsigned long addr, pmd_t *pmd) +{ +}  #include <asm-generic/pgtable.h>  #endif	/* __ASSEMBLY__ */ diff --git a/arch/x86/include/asm/pgtable_32.h b/arch/x86/include/asm/pgtable_32.h index 8faa215a503..9ee322103c6 100644 --- a/arch/x86/include/asm/pgtable_32.h +++ b/arch/x86/include/asm/pgtable_32.h @@ -66,13 +66,6 @@ do {						\  	__flush_tlb_one((vaddr));		\  } while (0) -/* - * The i386 doesn't have any external MMU info: the kernel page - * tables contain all the necessary information. - */ -#define update_mmu_cache(vma, address, ptep) do { } while (0) -#define update_mmu_cache_pmd(vma, address, pmd) do { } while (0) -  #endif /* !__ASSEMBLY__ */  /* diff --git a/arch/x86/include/asm/pgtable_64.h b/arch/x86/include/asm/pgtable_64.h index 47356f9df82..615b0c78449 100644 --- a/arch/x86/include/asm/pgtable_64.h +++ b/arch/x86/include/asm/pgtable_64.h @@ -142,9 +142,6 @@ static inline int pgd_large(pgd_t pgd) { return 0; }  #define pte_offset_map(dir, address) pte_offset_kernel((dir), (address))  #define pte_unmap(pte) ((void)(pte))/* NOP */ -#define update_mmu_cache(vma, address, ptep) do { } while (0) -#define update_mmu_cache_pmd(vma, address, pmd) do { } while (0) -  /* Encode and de-code a swap entry */  #if _PAGE_BIT_FILE < _PAGE_BIT_PROTNONE  #define SWP_TYPE_BITS (_PAGE_BIT_FILE - _PAGE_BIT_PRESENT - 1) diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h index 888184b2fc8..cf500543f6f 100644 --- a/arch/x86/include/asm/processor.h +++ b/arch/x86/include/asm/processor.h @@ -943,7 +943,7 @@ extern void start_thread(struct pt_regs *regs, unsigned long new_ip,  extern int get_tsc_mode(unsigned long adr);  extern int set_tsc_mode(unsigned int val); -extern int amd_get_nb_id(int cpu); +extern u16 amd_get_nb_id(int cpu);  struct aperfmperf {  	u64 aperf, mperf; diff --git a/arch/x86/include/asm/required-features.h b/arch/x86/include/asm/required-features.h index 6c7fc25f2c3..5c6e4fb370f 100644 --- a/arch/x86/include/asm/required-features.h +++ b/arch/x86/include/asm/required-features.h @@ -47,6 +47,12 @@  # define NEED_NOPL	0  #endif +#ifdef CONFIG_MATOM +# define NEED_MOVBE	(1<<(X86_FEATURE_MOVBE & 31)) +#else +# define NEED_MOVBE	0 +#endif +  #ifdef CONFIG_X86_64  #ifdef CONFIG_PARAVIRT  /* Paravirtualized systems may not have PSE or PGE available */ @@ -80,7 +86,7 @@  #define REQUIRED_MASK2	0  #define REQUIRED_MASK3	(NEED_NOPL) -#define REQUIRED_MASK4	0 +#define REQUIRED_MASK4	(NEED_MOVBE)  #define REQUIRED_MASK5	0  #define REQUIRED_MASK6	0  #define REQUIRED_MASK7	0 diff --git a/arch/x86/include/asm/uv/uv.h b/arch/x86/include/asm/uv/uv.h index b47c2a82ff1..062921ef34e 100644 --- a/arch/x86/include/asm/uv/uv.h +++ b/arch/x86/include/asm/uv/uv.h @@ -16,7 +16,7 @@ extern void uv_system_init(void);  extern const struct cpumask *uv_flush_tlb_others(const struct cpumask *cpumask,  						 struct mm_struct *mm,  						 unsigned long start, -						 unsigned end, +						 unsigned long end,  						 unsigned int cpu);  #else	/* X86_UV */ diff --git a/arch/x86/include/asm/uv/uv_hub.h b/arch/x86/include/asm/uv/uv_hub.h index 21f7385badb..2c32df95bb7 100644 --- a/arch/x86/include/asm/uv/uv_hub.h +++ b/arch/x86/include/asm/uv/uv_hub.h @@ -5,7 +5,7 @@   *   * SGI UV architectural definitions   * - * Copyright (C) 2007-2010 Silicon Graphics, Inc. All rights reserved. + * Copyright (C) 2007-2013 Silicon Graphics, Inc. All rights reserved.   */  #ifndef _ASM_X86_UV_UV_HUB_H @@ -175,6 +175,7 @@ DECLARE_PER_CPU(struct uv_hub_info_s, __uv_hub_info);   */  #define UV1_HUB_REVISION_BASE		1  #define UV2_HUB_REVISION_BASE		3 +#define UV3_HUB_REVISION_BASE		5  static inline int is_uv1_hub(void)  { @@ -183,6 +184,23 @@ static inline int is_uv1_hub(void)  static inline int is_uv2_hub(void)  { +	return ((uv_hub_info->hub_revision >= UV2_HUB_REVISION_BASE) && +		(uv_hub_info->hub_revision < UV3_HUB_REVISION_BASE)); +} + +static inline int is_uv3_hub(void) +{ +	return uv_hub_info->hub_revision >= UV3_HUB_REVISION_BASE; +} + +static inline int is_uv_hub(void) +{ +	return uv_hub_info->hub_revision; +} + +/* code common to uv2 and uv3 only */ +static inline int is_uvx_hub(void) +{  	return uv_hub_info->hub_revision >= UV2_HUB_REVISION_BASE;  } @@ -230,14 +248,23 @@ union uvh_apicid {  #define UV2_LOCAL_MMR_SIZE		(32UL * 1024 * 1024)  #define UV2_GLOBAL_MMR32_SIZE		(32UL * 1024 * 1024) -#define UV_LOCAL_MMR_BASE		(is_uv1_hub() ? UV1_LOCAL_MMR_BASE     \ -						: UV2_LOCAL_MMR_BASE) -#define UV_GLOBAL_MMR32_BASE		(is_uv1_hub() ? UV1_GLOBAL_MMR32_BASE  \ -						: UV2_GLOBAL_MMR32_BASE) -#define UV_LOCAL_MMR_SIZE		(is_uv1_hub() ? UV1_LOCAL_MMR_SIZE :   \ -						UV2_LOCAL_MMR_SIZE) +#define UV3_LOCAL_MMR_BASE		0xfa000000UL +#define UV3_GLOBAL_MMR32_BASE		0xfc000000UL +#define UV3_LOCAL_MMR_SIZE		(32UL * 1024 * 1024) +#define UV3_GLOBAL_MMR32_SIZE		(32UL * 1024 * 1024) + +#define UV_LOCAL_MMR_BASE		(is_uv1_hub() ? UV1_LOCAL_MMR_BASE : \ +					(is_uv2_hub() ? UV2_LOCAL_MMR_BASE : \ +							UV3_LOCAL_MMR_BASE)) +#define UV_GLOBAL_MMR32_BASE		(is_uv1_hub() ? UV1_GLOBAL_MMR32_BASE :\ +					(is_uv2_hub() ? UV2_GLOBAL_MMR32_BASE :\ +							UV3_GLOBAL_MMR32_BASE)) +#define UV_LOCAL_MMR_SIZE		(is_uv1_hub() ? UV1_LOCAL_MMR_SIZE : \ +					(is_uv2_hub() ? UV2_LOCAL_MMR_SIZE : \ +							UV3_LOCAL_MMR_SIZE))  #define UV_GLOBAL_MMR32_SIZE		(is_uv1_hub() ? UV1_GLOBAL_MMR32_SIZE :\ -						UV2_GLOBAL_MMR32_SIZE) +					(is_uv2_hub() ? UV2_GLOBAL_MMR32_SIZE :\ +							UV3_GLOBAL_MMR32_SIZE))  #define UV_GLOBAL_MMR64_BASE		(uv_hub_info->global_mmr_base)  #define UV_GLOBAL_GRU_MMR_BASE		0x4000000 @@ -599,6 +626,7 @@ static inline void uv_hub_send_ipi(int pnode, int apicid, int vector)   *     1 - UV1 rev 1.0 initial silicon   *     2 - UV1 rev 2.0 production silicon   *     3 - UV2 rev 1.0 initial silicon + *     5 - UV3 rev 1.0 initial silicon   */  static inline int uv_get_min_hub_revision_id(void)  { diff --git a/arch/x86/include/asm/uv/uv_mmrs.h b/arch/x86/include/asm/uv/uv_mmrs.h index cf1d73643f6..bd5f80e58a2 100644 --- a/arch/x86/include/asm/uv/uv_mmrs.h +++ b/arch/x86/include/asm/uv/uv_mmrs.h @@ -5,16 +5,25 @@   *   * SGI UV MMR definitions   * - * Copyright (C) 2007-2011 Silicon Graphics, Inc. All rights reserved. + * Copyright (C) 2007-2013 Silicon Graphics, Inc. All rights reserved.   */  #ifndef _ASM_X86_UV_UV_MMRS_H  #define _ASM_X86_UV_UV_MMRS_H  /* - * This file contains MMR definitions for both UV1 & UV2 hubs. + * This file contains MMR definitions for all UV hubs types.   * - * In general, MMR addresses and structures are identical on both hubs. + * To minimize coding differences between hub types, the symbols are + * grouped by architecture types. + * + * UVH  - definitions common to all UV hub types. + * UVXH - definitions common to all UV eXtended hub types (currently 2 & 3). + * UV1H - definitions specific to UV type 1 hub. + * UV2H - definitions specific to UV type 2 hub. + * UV3H - definitions specific to UV type 3 hub. + * + * So in general, MMR addresses and structures are identical on all hubs types.   * These MMRs are identified as:   *	#define UVH_xxx		<address>   *	union uvh_xxx { @@ -23,24 +32,36 @@   *		} s;   *	};   * - * If the MMR exists on both hub type but has different addresses or - * contents, the MMR definition is similar to: - *	#define UV1H_xxx	<uv1 address> - *	#define UV2H_xxx	<uv2address> - *	#define UVH_xxx		(is_uv1_hub() ? UV1H_xxx : UV2H_xxx) + * If the MMR exists on all hub types but have different addresses: + *	#define UV1Hxxx	a + *	#define UV2Hxxx	b + *	#define UV3Hxxx	c + *	#define UVHxxx	(is_uv1_hub() ? UV1Hxxx : + *			(is_uv2_hub() ? UV2Hxxx : + *					UV3Hxxx)) + * + * If the MMR exists on all hub types > 1 but have different addresses: + *	#define UV2Hxxx	b + *	#define UV3Hxxx	c + *	#define UVXHxxx (is_uv2_hub() ? UV2Hxxx : + *					UV3Hxxx)) + *   *	union uvh_xxx {   *		unsigned long       v; - *		struct uv1h_int_cmpd_s {	 (Common fields only) + *		struct uvh_xxx_s {	 # Common fields only   *		} s; - *		struct uv1h_int_cmpd_s {	 (Full UV1 definition) + *		struct uv1h_xxx_s {	 # Full UV1 definition (*)   *		} s1; - *		struct uv2h_int_cmpd_s {	 (Full UV2 definition) + *		struct uv2h_xxx_s {	 # Full UV2 definition (*)   *		} s2; + *		struct uv3h_xxx_s {	 # Full UV3 definition (*) + *		} s3;   *	}; + *		(* - if present and different than the common struct)   * - * Only essential difference are enumerated. For example, if the address is - * the same for both UV1 & UV2, only a single #define is generated. Likewise, - * if the contents is the same for both hubs, only the "s" structure is + * Only essential differences are enumerated. For example, if the address is + * the same for all UV's, only a single #define is generated. Likewise, + * if the contents is the same for all hubs, only the "s" structure is   * generated.   *   * If the MMR exists on ONLY 1 type of hub, no generic definition is @@ -51,6 +72,8 @@   *		struct uvh_int_cmpd_s {   *		} sn;   *	}; + * + * (GEN Flags: mflags_opt= undefs=0 UV23=UVXH)   */  #define UV_MMR_ENABLE		(1UL << 63) @@ -58,15 +81,18 @@  #define UV1_HUB_PART_NUMBER	0x88a5  #define UV2_HUB_PART_NUMBER	0x8eb8  #define UV2_HUB_PART_NUMBER_X	0x1111 +#define UV3_HUB_PART_NUMBER	0x9578 +#define UV3_HUB_PART_NUMBER_X	0x4321 -/* Compat: if this #define is present, UV headers support UV2 */ +/* Compat: Indicate which UV Hubs are supported. */  #define UV2_HUB_IS_SUPPORTED	1 +#define UV3_HUB_IS_SUPPORTED	1  /* ========================================================================= */  /*                          UVH_BAU_DATA_BROADCAST                           */  /* ========================================================================= */ -#define UVH_BAU_DATA_BROADCAST				0x61688UL -#define UVH_BAU_DATA_BROADCAST_32			0x440 +#define UVH_BAU_DATA_BROADCAST 0x61688UL +#define UVH_BAU_DATA_BROADCAST_32 0x440  #define UVH_BAU_DATA_BROADCAST_ENABLE_SHFT		0  #define UVH_BAU_DATA_BROADCAST_ENABLE_MASK		0x0000000000000001UL @@ -82,8 +108,8 @@ union uvh_bau_data_broadcast_u {  /* ========================================================================= */  /*                           UVH_BAU_DATA_CONFIG                             */  /* ========================================================================= */ -#define UVH_BAU_DATA_CONFIG				0x61680UL -#define UVH_BAU_DATA_CONFIG_32				0x438 +#define UVH_BAU_DATA_CONFIG 0x61680UL +#define UVH_BAU_DATA_CONFIG_32 0x438  #define UVH_BAU_DATA_CONFIG_VECTOR_SHFT			0  #define UVH_BAU_DATA_CONFIG_DM_SHFT			8 @@ -121,10 +147,14 @@ union uvh_bau_data_config_u {  /* ========================================================================= */  /*                           UVH_EVENT_OCCURRED0                             */  /* ========================================================================= */ -#define UVH_EVENT_OCCURRED0				0x70000UL -#define UVH_EVENT_OCCURRED0_32				0x5e8 +#define UVH_EVENT_OCCURRED0 0x70000UL +#define UVH_EVENT_OCCURRED0_32 0x5e8 + +#define UVH_EVENT_OCCURRED0_LB_HCERR_SHFT		0 +#define UVH_EVENT_OCCURRED0_RH_AOERR0_SHFT		11 +#define UVH_EVENT_OCCURRED0_LB_HCERR_MASK		0x0000000000000001UL +#define UVH_EVENT_OCCURRED0_RH_AOERR0_MASK		0x0000000000000800UL -#define UV1H_EVENT_OCCURRED0_LB_HCERR_SHFT		0  #define UV1H_EVENT_OCCURRED0_GR0_HCERR_SHFT		1  #define UV1H_EVENT_OCCURRED0_GR1_HCERR_SHFT		2  #define UV1H_EVENT_OCCURRED0_LH_HCERR_SHFT		3 @@ -135,7 +165,6 @@ union uvh_bau_data_config_u {  #define UV1H_EVENT_OCCURRED0_GR0_AOERR0_SHFT		8  #define UV1H_EVENT_OCCURRED0_GR1_AOERR0_SHFT		9  #define UV1H_EVENT_OCCURRED0_LH_AOERR0_SHFT		10 -#define UV1H_EVENT_OCCURRED0_RH_AOERR0_SHFT		11  #define UV1H_EVENT_OCCURRED0_XN_AOERR0_SHFT		12  #define UV1H_EVENT_OCCURRED0_SI_AOERR0_SHFT		13  #define UV1H_EVENT_OCCURRED0_LB_AOERR1_SHFT		14 @@ -181,7 +210,6 @@ union uvh_bau_data_config_u {  #define UV1H_EVENT_OCCURRED0_RTC3_SHFT			54  #define UV1H_EVENT_OCCURRED0_BAU_DATA_SHFT		55  #define UV1H_EVENT_OCCURRED0_POWER_MANAGEMENT_REQ_SHFT	56 -#define UV1H_EVENT_OCCURRED0_LB_HCERR_MASK		0x0000000000000001UL  #define UV1H_EVENT_OCCURRED0_GR0_HCERR_MASK		0x0000000000000002UL  #define UV1H_EVENT_OCCURRED0_GR1_HCERR_MASK		0x0000000000000004UL  #define UV1H_EVENT_OCCURRED0_LH_HCERR_MASK		0x0000000000000008UL @@ -192,7 +220,6 @@ union uvh_bau_data_config_u {  #define UV1H_EVENT_OCCURRED0_GR0_AOERR0_MASK		0x0000000000000100UL  #define UV1H_EVENT_OCCURRED0_GR1_AOERR0_MASK		0x0000000000000200UL  #define UV1H_EVENT_OCCURRED0_LH_AOERR0_MASK		0x0000000000000400UL -#define UV1H_EVENT_OCCURRED0_RH_AOERR0_MASK		0x0000000000000800UL  #define UV1H_EVENT_OCCURRED0_XN_AOERR0_MASK		0x0000000000001000UL  #define UV1H_EVENT_OCCURRED0_SI_AOERR0_MASK		0x0000000000002000UL  #define UV1H_EVENT_OCCURRED0_LB_AOERR1_MASK		0x0000000000004000UL @@ -239,188 +266,130 @@ union uvh_bau_data_config_u {  #define UV1H_EVENT_OCCURRED0_BAU_DATA_MASK		0x0080000000000000UL  #define UV1H_EVENT_OCCURRED0_POWER_MANAGEMENT_REQ_MASK	0x0100000000000000UL -#define UV2H_EVENT_OCCURRED0_LB_HCERR_SHFT		0 -#define UV2H_EVENT_OCCURRED0_QP_HCERR_SHFT		1 -#define UV2H_EVENT_OCCURRED0_RH_HCERR_SHFT		2 -#define UV2H_EVENT_OCCURRED0_LH0_HCERR_SHFT		3 -#define UV2H_EVENT_OCCURRED0_LH1_HCERR_SHFT		4 -#define UV2H_EVENT_OCCURRED0_GR0_HCERR_SHFT		5 -#define UV2H_EVENT_OCCURRED0_GR1_HCERR_SHFT		6 -#define UV2H_EVENT_OCCURRED0_NI0_HCERR_SHFT		7 -#define UV2H_EVENT_OCCURRED0_NI1_HCERR_SHFT		8 -#define UV2H_EVENT_OCCURRED0_LB_AOERR0_SHFT		9 -#define UV2H_EVENT_OCCURRED0_QP_AOERR0_SHFT		10 -#define UV2H_EVENT_OCCURRED0_RH_AOERR0_SHFT		11 -#define UV2H_EVENT_OCCURRED0_LH0_AOERR0_SHFT		12 -#define UV2H_EVENT_OCCURRED0_LH1_AOERR0_SHFT		13 -#define UV2H_EVENT_OCCURRED0_GR0_AOERR0_SHFT		14 -#define UV2H_EVENT_OCCURRED0_GR1_AOERR0_SHFT		15 -#define UV2H_EVENT_OCCURRED0_XB_AOERR0_SHFT		16 -#define UV2H_EVENT_OCCURRED0_RT_AOERR0_SHFT		17 -#define UV2H_EVENT_OCCURRED0_NI0_AOERR0_SHFT		18 -#define UV2H_EVENT_OCCURRED0_NI1_AOERR0_SHFT		19 -#define UV2H_EVENT_OCCURRED0_LB_AOERR1_SHFT		20 -#define UV2H_EVENT_OCCURRED0_QP_AOERR1_SHFT		21 -#define UV2H_EVENT_OCCURRED0_RH_AOERR1_SHFT		22 -#define UV2H_EVENT_OCCURRED0_LH0_AOERR1_SHFT		23 -#define UV2H_EVENT_OCCURRED0_LH1_AOERR1_SHFT		24 -#define UV2H_EVENT_OCCURRED0_GR0_AOERR1_SHFT		25 -#define UV2H_EVENT_OCCURRED0_GR1_AOERR1_SHFT		26 -#define UV2H_EVENT_OCCURRED0_XB_AOERR1_SHFT		27 -#define UV2H_EVENT_OCCURRED0_RT_AOERR1_SHFT		28 -#define UV2H_EVENT_OCCURRED0_NI0_AOERR1_SHFT		29 -#define UV2H_EVENT_OCCURRED0_NI1_AOERR1_SHFT		30 -#define UV2H_EVENT_OCCURRED0_SYSTEM_SHUTDOWN_INT_SHFT	31 -#define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_0_SHFT		32 -#define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_1_SHFT		33 -#define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_2_SHFT		34 -#define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_3_SHFT		35 -#define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_4_SHFT		36 -#define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_5_SHFT		37 -#define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_6_SHFT		38 -#define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_7_SHFT		39 -#define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_8_SHFT		40 -#define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_9_SHFT		41 -#define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_10_SHFT		42 -#define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_11_SHFT		43 -#define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_12_SHFT		44 -#define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_13_SHFT		45 -#define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_14_SHFT		46 -#define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_15_SHFT		47 -#define UV2H_EVENT_OCCURRED0_L1_NMI_INT_SHFT		48 -#define UV2H_EVENT_OCCURRED0_STOP_CLOCK_SHFT		49 -#define UV2H_EVENT_OCCURRED0_ASIC_TO_L1_SHFT		50 -#define UV2H_EVENT_OCCURRED0_L1_TO_ASIC_SHFT		51 -#define UV2H_EVENT_OCCURRED0_LA_SEQ_TRIGGER_SHFT	52 -#define UV2H_EVENT_OCCURRED0_IPI_INT_SHFT		53 -#define UV2H_EVENT_OCCURRED0_EXTIO_INT0_SHFT		54 -#define UV2H_EVENT_OCCURRED0_EXTIO_INT1_SHFT		55 -#define UV2H_EVENT_OCCURRED0_EXTIO_INT2_SHFT		56 -#define UV2H_EVENT_OCCURRED0_EXTIO_INT3_SHFT		57 -#define UV2H_EVENT_OCCURRED0_PROFILE_INT_SHFT		58 -#define UV2H_EVENT_OCCURRED0_LB_HCERR_MASK		0x0000000000000001UL -#define UV2H_EVENT_OCCURRED0_QP_HCERR_MASK		0x0000000000000002UL -#define UV2H_EVENT_OCCURRED0_RH_HCERR_MASK		0x0000000000000004UL -#define UV2H_EVENT_OCCURRED0_LH0_HCERR_MASK		0x0000000000000008UL -#define UV2H_EVENT_OCCURRED0_LH1_HCERR_MASK		0x0000000000000010UL -#define UV2H_EVENT_OCCURRED0_GR0_HCERR_MASK		0x0000000000000020UL -#define UV2H_EVENT_OCCURRED0_GR1_HCERR_MASK		0x0000000000000040UL -#define UV2H_EVENT_OCCURRED0_NI0_HCERR_MASK		0x0000000000000080UL -#define UV2H_EVENT_OCCURRED0_NI1_HCERR_MASK		0x0000000000000100UL -#define UV2H_EVENT_OCCURRED0_LB_AOERR0_MASK		0x0000000000000200UL -#define UV2H_EVENT_OCCURRED0_QP_AOERR0_MASK		0x0000000000000400UL -#define UV2H_EVENT_OCCURRED0_RH_AOERR0_MASK		0x0000000000000800UL -#define UV2H_EVENT_OCCURRED0_LH0_AOERR0_MASK		0x0000000000001000UL -#define UV2H_EVENT_OCCURRED0_LH1_AOERR0_MASK		0x0000000000002000UL -#define UV2H_EVENT_OCCURRED0_GR0_AOERR0_MASK		0x0000000000004000UL -#define UV2H_EVENT_OCCURRED0_GR1_AOERR0_MASK		0x0000000000008000UL -#define UV2H_EVENT_OCCURRED0_XB_AOERR0_MASK		0x0000000000010000UL -#define UV2H_EVENT_OCCURRED0_RT_AOERR0_MASK		0x0000000000020000UL -#define UV2H_EVENT_OCCURRED0_NI0_AOERR0_MASK		0x0000000000040000UL -#define UV2H_EVENT_OCCURRED0_NI1_AOERR0_MASK		0x0000000000080000UL -#define UV2H_EVENT_OCCURRED0_LB_AOERR1_MASK		0x0000000000100000UL -#define UV2H_EVENT_OCCURRED0_QP_AOERR1_MASK		0x0000000000200000UL -#define UV2H_EVENT_OCCURRED0_RH_AOERR1_MASK		0x0000000000400000UL -#define UV2H_EVENT_OCCURRED0_LH0_AOERR1_MASK		0x0000000000800000UL -#define UV2H_EVENT_OCCURRED0_LH1_AOERR1_MASK		0x0000000001000000UL -#define UV2H_EVENT_OCCURRED0_GR0_AOERR1_MASK		0x0000000002000000UL -#define UV2H_EVENT_OCCURRED0_GR1_AOERR1_MASK		0x0000000004000000UL -#define UV2H_EVENT_OCCURRED0_XB_AOERR1_MASK		0x0000000008000000UL -#define UV2H_EVENT_OCCURRED0_RT_AOERR1_MASK		0x0000000010000000UL -#define UV2H_EVENT_OCCURRED0_NI0_AOERR1_MASK		0x0000000020000000UL -#define UV2H_EVENT_OCCURRED0_NI1_AOERR1_MASK		0x0000000040000000UL -#define UV2H_EVENT_OCCURRED0_SYSTEM_SHUTDOWN_INT_MASK	0x0000000080000000UL -#define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_0_MASK		0x0000000100000000UL -#define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_1_MASK		0x0000000200000000UL -#define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_2_MASK		0x0000000400000000UL -#define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_3_MASK		0x0000000800000000UL -#define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_4_MASK		0x0000001000000000UL -#define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_5_MASK		0x0000002000000000UL -#define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_6_MASK		0x0000004000000000UL -#define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_7_MASK		0x0000008000000000UL -#define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_8_MASK		0x0000010000000000UL -#define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_9_MASK		0x0000020000000000UL -#define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_10_MASK		0x0000040000000000UL -#define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_11_MASK		0x0000080000000000UL -#define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_12_MASK		0x0000100000000000UL -#define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_13_MASK		0x0000200000000000UL -#define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_14_MASK		0x0000400000000000UL -#define UV2H_EVENT_OCCURRED0_LB_IRQ_INT_15_MASK		0x0000800000000000UL -#define UV2H_EVENT_OCCURRED0_L1_NMI_INT_MASK		0x0001000000000000UL -#define UV2H_EVENT_OCCURRED0_STOP_CLOCK_MASK		0x0002000000000000UL -#define UV2H_EVENT_OCCURRED0_ASIC_TO_L1_MASK		0x0004000000000000UL -#define UV2H_EVENT_OCCURRED0_L1_TO_ASIC_MASK		0x0008000000000000UL -#define UV2H_EVENT_OCCURRED0_LA_SEQ_TRIGGER_MASK	0x0010000000000000UL -#define UV2H_EVENT_OCCURRED0_IPI_INT_MASK		0x0020000000000000UL -#define UV2H_EVENT_OCCURRED0_EXTIO_INT0_MASK		0x0040000000000000UL -#define UV2H_EVENT_OCCURRED0_EXTIO_INT1_MASK		0x0080000000000000UL -#define UV2H_EVENT_OCCURRED0_EXTIO_INT2_MASK		0x0100000000000000UL -#define UV2H_EVENT_OCCURRED0_EXTIO_INT3_MASK		0x0200000000000000UL -#define UV2H_EVENT_OCCURRED0_PROFILE_INT_MASK		0x0400000000000000UL +#define UVXH_EVENT_OCCURRED0_QP_HCERR_SHFT		1 +#define UVXH_EVENT_OCCURRED0_RH_HCERR_SHFT		2 +#define UVXH_EVENT_OCCURRED0_LH0_HCERR_SHFT		3 +#define UVXH_EVENT_OCCURRED0_LH1_HCERR_SHFT		4 +#define UVXH_EVENT_OCCURRED0_GR0_HCERR_SHFT		5 +#define UVXH_EVENT_OCCURRED0_GR1_HCERR_SHFT		6 +#define UVXH_EVENT_OCCURRED0_NI0_HCERR_SHFT		7 +#define UVXH_EVENT_OCCURRED0_NI1_HCERR_SHFT		8 +#define UVXH_EVENT_OCCURRED0_LB_AOERR0_SHFT		9 +#define UVXH_EVENT_OCCURRED0_QP_AOERR0_SHFT		10 +#define UVXH_EVENT_OCCURRED0_LH0_AOERR0_SHFT		12 +#define UVXH_EVENT_OCCURRED0_LH1_AOERR0_SHFT		13 +#define UVXH_EVENT_OCCURRED0_GR0_AOERR0_SHFT		14 +#define UVXH_EVENT_OCCURRED0_GR1_AOERR0_SHFT		15 +#define UVXH_EVENT_OCCURRED0_XB_AOERR0_SHFT		16 +#define UVXH_EVENT_OCCURRED0_RT_AOERR0_SHFT		17 +#define UVXH_EVENT_OCCURRED0_NI0_AOERR0_SHFT		18 +#define UVXH_EVENT_OCCURRED0_NI1_AOERR0_SHFT		19 +#define UVXH_EVENT_OCCURRED0_LB_AOERR1_SHFT		20 +#define UVXH_EVENT_OCCURRED0_QP_AOERR1_SHFT		21 +#define UVXH_EVENT_OCCURRED0_RH_AOERR1_SHFT		22 +#define UVXH_EVENT_OCCURRED0_LH0_AOERR1_SHFT		23 +#define UVXH_EVENT_OCCURRED0_LH1_AOERR1_SHFT		24 +#define UVXH_EVENT_OCCURRED0_GR0_AOERR1_SHFT		25 +#define UVXH_EVENT_OCCURRED0_GR1_AOERR1_SHFT		26 +#define UVXH_EVENT_OCCURRED0_XB_AOERR1_SHFT		27 +#define UVXH_EVENT_OCCURRED0_RT_AOERR1_SHFT		28 +#define UVXH_EVENT_OCCURRED0_NI0_AOERR1_SHFT		29 +#define UVXH_EVENT_OCCURRED0_NI1_AOERR1_SHFT		30 +#define UVXH_EVENT_OCCURRED0_SYSTEM_SHUTDOWN_INT_SHFT	31 +#define UVXH_EVENT_OCCURRED0_LB_IRQ_INT_0_SHFT		32 +#define UVXH_EVENT_OCCURRED0_LB_IRQ_INT_1_SHFT		33 +#define UVXH_EVENT_OCCURRED0_LB_IRQ_INT_2_SHFT		34 +#define UVXH_EVENT_OCCURRED0_LB_IRQ_INT_3_SHFT		35 +#define UVXH_EVENT_OCCURRED0_LB_IRQ_INT_4_SHFT		36 +#define UVXH_EVENT_OCCURRED0_LB_IRQ_INT_5_SHFT		37 +#define UVXH_EVENT_OCCURRED0_LB_IRQ_INT_6_SHFT		38 +#define UVXH_EVENT_OCCURRED0_LB_IRQ_INT_7_SHFT		39 +#define UVXH_EVENT_OCCURRED0_LB_IRQ_INT_8_SHFT		40 +#define UVXH_EVENT_OCCURRED0_LB_IRQ_INT_9_SHFT		41 +#define UVXH_EVENT_OCCURRED0_LB_IRQ_INT_10_SHFT		42 +#define UVXH_EVENT_OCCURRED0_LB_IRQ_INT_11_SHFT		43 +#define UVXH_EVENT_OCCURRED0_LB_IRQ_INT_12_SHFT		44 +#define UVXH_EVENT_OCCURRED0_LB_IRQ_INT_13_SHFT		45 +#define UVXH_EVENT_OCCURRED0_LB_IRQ_INT_14_SHFT		46 +#define UVXH_EVENT_OCCURRED0_LB_IRQ_INT_15_SHFT		47 +#define UVXH_EVENT_OCCURRED0_L1_NMI_INT_SHFT		48 +#define UVXH_EVENT_OCCURRED0_STOP_CLOCK_SHFT		49 +#define UVXH_EVENT_OCCURRED0_ASIC_TO_L1_SHFT		50 +#define UVXH_EVENT_OCCURRED0_L1_TO_ASIC_SHFT		51 +#define UVXH_EVENT_OCCURRED0_LA_SEQ_TRIGGER_SHFT	52 +#define UVXH_EVENT_OCCURRED0_IPI_INT_SHFT		53 +#define UVXH_EVENT_OCCURRED0_EXTIO_INT0_SHFT		54 +#define UVXH_EVENT_OCCURRED0_EXTIO_INT1_SHFT		55 +#define UVXH_EVENT_OCCURRED0_EXTIO_INT2_SHFT		56 +#define UVXH_EVENT_OCCURRED0_EXTIO_INT3_SHFT		57 +#define UVXH_EVENT_OCCURRED0_PROFILE_INT_SHFT		58 +#define UVXH_EVENT_OCCURRED0_QP_HCERR_MASK		0x0000000000000002UL +#define UVXH_EVENT_OCCURRED0_RH_HCERR_MASK		0x0000000000000004UL +#define UVXH_EVENT_OCCURRED0_LH0_HCERR_MASK		0x0000000000000008UL +#define UVXH_EVENT_OCCURRED0_LH1_HCERR_MASK		0x0000000000000010UL +#define UVXH_EVENT_OCCURRED0_GR0_HCERR_MASK		0x0000000000000020UL +#define UVXH_EVENT_OCCURRED0_GR1_HCERR_MASK		0x0000000000000040UL +#define UVXH_EVENT_OCCURRED0_NI0_HCERR_MASK		0x0000000000000080UL +#define UVXH_EVENT_OCCURRED0_NI1_HCERR_MASK		0x0000000000000100UL +#define UVXH_EVENT_OCCURRED0_LB_AOERR0_MASK		0x0000000000000200UL +#define UVXH_EVENT_OCCURRED0_QP_AOERR0_MASK		0x0000000000000400UL +#define UVXH_EVENT_OCCURRED0_LH0_AOERR0_MASK		0x0000000000001000UL +#define UVXH_EVENT_OCCURRED0_LH1_AOERR0_MASK		0x0000000000002000UL +#define UVXH_EVENT_OCCURRED0_GR0_AOERR0_MASK		0x0000000000004000UL +#define UVXH_EVENT_OCCURRED0_GR1_AOERR0_MASK		0x0000000000008000UL +#define UVXH_EVENT_OCCURRED0_XB_AOERR0_MASK		0x0000000000010000UL +#define UVXH_EVENT_OCCURRED0_RT_AOERR0_MASK		0x0000000000020000UL +#define UVXH_EVENT_OCCURRED0_NI0_AOERR0_MASK		0x0000000000040000UL +#define UVXH_EVENT_OCCURRED0_NI1_AOERR0_MASK		0x0000000000080000UL +#define UVXH_EVENT_OCCURRED0_LB_AOERR1_MASK		0x0000000000100000UL +#define UVXH_EVENT_OCCURRED0_QP_AOERR1_MASK		0x0000000000200000UL +#define UVXH_EVENT_OCCURRED0_RH_AOERR1_MASK		0x0000000000400000UL +#define UVXH_EVENT_OCCURRED0_LH0_AOERR1_MASK		0x0000000000800000UL +#define UVXH_EVENT_OCCURRED0_LH1_AOERR1_MASK		0x0000000001000000UL +#define UVXH_EVENT_OCCURRED0_GR0_AOERR1_MASK		0x0000000002000000UL +#define UVXH_EVENT_OCCURRED0_GR1_AOERR1_MASK		0x0000000004000000UL +#define UVXH_EVENT_OCCURRED0_XB_AOERR1_MASK		0x0000000008000000UL +#define UVXH_EVENT_OCCURRED0_RT_AOERR1_MASK		0x0000000010000000UL +#define UVXH_EVENT_OCCURRED0_NI0_AOERR1_MASK		0x0000000020000000UL +#define UVXH_EVENT_OCCURRED0_NI1_AOERR1_MASK		0x0000000040000000UL +#define UVXH_EVENT_OCCURRED0_SYSTEM_SHUTDOWN_INT_MASK	0x0000000080000000UL +#define UVXH_EVENT_OCCURRED0_LB_IRQ_INT_0_MASK		0x0000000100000000UL +#define UVXH_EVENT_OCCURRED0_LB_IRQ_INT_1_MASK		0x0000000200000000UL +#define UVXH_EVENT_OCCURRED0_LB_IRQ_INT_2_MASK		0x0000000400000000UL +#define UVXH_EVENT_OCCURRED0_LB_IRQ_INT_3_MASK		0x0000000800000000UL +#define UVXH_EVENT_OCCURRED0_LB_IRQ_INT_4_MASK		0x0000001000000000UL +#define UVXH_EVENT_OCCURRED0_LB_IRQ_INT_5_MASK		0x0000002000000000UL +#define UVXH_EVENT_OCCURRED0_LB_IRQ_INT_6_MASK		0x0000004000000000UL +#define UVXH_EVENT_OCCURRED0_LB_IRQ_INT_7_MASK		0x0000008000000000UL +#define UVXH_EVENT_OCCURRED0_LB_IRQ_INT_8_MASK		0x0000010000000000UL +#define UVXH_EVENT_OCCURRED0_LB_IRQ_INT_9_MASK		0x0000020000000000UL +#define UVXH_EVENT_OCCURRED0_LB_IRQ_INT_10_MASK		0x0000040000000000UL +#define UVXH_EVENT_OCCURRED0_LB_IRQ_INT_11_MASK		0x0000080000000000UL +#define UVXH_EVENT_OCCURRED0_LB_IRQ_INT_12_MASK		0x0000100000000000UL +#define UVXH_EVENT_OCCURRED0_LB_IRQ_INT_13_MASK		0x0000200000000000UL +#define UVXH_EVENT_OCCURRED0_LB_IRQ_INT_14_MASK		0x0000400000000000UL +#define UVXH_EVENT_OCCURRED0_LB_IRQ_INT_15_MASK		0x0000800000000000UL +#define UVXH_EVENT_OCCURRED0_L1_NMI_INT_MASK		0x0001000000000000UL +#define UVXH_EVENT_OCCURRED0_STOP_CLOCK_MASK		0x0002000000000000UL +#define UVXH_EVENT_OCCURRED0_ASIC_TO_L1_MASK		0x0004000000000000UL +#define UVXH_EVENT_OCCURRED0_L1_TO_ASIC_MASK		0x0008000000000000UL +#define UVXH_EVENT_OCCURRED0_LA_SEQ_TRIGGER_MASK	0x0010000000000000UL +#define UVXH_EVENT_OCCURRED0_IPI_INT_MASK		0x0020000000000000UL +#define UVXH_EVENT_OCCURRED0_EXTIO_INT0_MASK		0x0040000000000000UL +#define UVXH_EVENT_OCCURRED0_EXTIO_INT1_MASK		0x0080000000000000UL +#define UVXH_EVENT_OCCURRED0_EXTIO_INT2_MASK		0x0100000000000000UL +#define UVXH_EVENT_OCCURRED0_EXTIO_INT3_MASK		0x0200000000000000UL +#define UVXH_EVENT_OCCURRED0_PROFILE_INT_MASK		0x0400000000000000UL  union uvh_event_occurred0_u {  	unsigned long	v; -	struct uv1h_event_occurred0_s { +	struct uvh_event_occurred0_s {  		unsigned long	lb_hcerr:1;			/* RW, W1C */ -		unsigned long	gr0_hcerr:1;			/* RW, W1C */ -		unsigned long	gr1_hcerr:1;			/* RW, W1C */ -		unsigned long	lh_hcerr:1;			/* RW, W1C */ -		unsigned long	rh_hcerr:1;			/* RW, W1C */ -		unsigned long	xn_hcerr:1;			/* RW, W1C */ -		unsigned long	si_hcerr:1;			/* RW, W1C */ -		unsigned long	lb_aoerr0:1;			/* RW, W1C */ -		unsigned long	gr0_aoerr0:1;			/* RW, W1C */ -		unsigned long	gr1_aoerr0:1;			/* RW, W1C */ -		unsigned long	lh_aoerr0:1;			/* RW, W1C */ +		unsigned long	rsvd_1_10:10;  		unsigned long	rh_aoerr0:1;			/* RW, W1C */ -		unsigned long	xn_aoerr0:1;			/* RW, W1C */ -		unsigned long	si_aoerr0:1;			/* RW, W1C */ -		unsigned long	lb_aoerr1:1;			/* RW, W1C */ -		unsigned long	gr0_aoerr1:1;			/* RW, W1C */ -		unsigned long	gr1_aoerr1:1;			/* RW, W1C */ -		unsigned long	lh_aoerr1:1;			/* RW, W1C */ -		unsigned long	rh_aoerr1:1;			/* RW, W1C */ -		unsigned long	xn_aoerr1:1;			/* RW, W1C */ -		unsigned long	si_aoerr1:1;			/* RW, W1C */ -		unsigned long	rh_vpi_int:1;			/* RW, W1C */ -		unsigned long	system_shutdown_int:1;		/* RW, W1C */ -		unsigned long	lb_irq_int_0:1;			/* RW, W1C */ -		unsigned long	lb_irq_int_1:1;			/* RW, W1C */ -		unsigned long	lb_irq_int_2:1;			/* RW, W1C */ -		unsigned long	lb_irq_int_3:1;			/* RW, W1C */ -		unsigned long	lb_irq_int_4:1;			/* RW, W1C */ -		unsigned long	lb_irq_int_5:1;			/* RW, W1C */ -		unsigned long	lb_irq_int_6:1;			/* RW, W1C */ -		unsigned long	lb_irq_int_7:1;			/* RW, W1C */ -		unsigned long	lb_irq_int_8:1;			/* RW, W1C */ -		unsigned long	lb_irq_int_9:1;			/* RW, W1C */ -		unsigned long	lb_irq_int_10:1;		/* RW, W1C */ -		unsigned long	lb_irq_int_11:1;		/* RW, W1C */ -		unsigned long	lb_irq_int_12:1;		/* RW, W1C */ -		unsigned long	lb_irq_int_13:1;		/* RW, W1C */ -		unsigned long	lb_irq_int_14:1;		/* RW, W1C */ -		unsigned long	lb_irq_int_15:1;		/* RW, W1C */ -		unsigned long	l1_nmi_int:1;			/* RW, W1C */ -		unsigned long	stop_clock:1;			/* RW, W1C */ -		unsigned long	asic_to_l1:1;			/* RW, W1C */ -		unsigned long	l1_to_asic:1;			/* RW, W1C */ -		unsigned long	ltc_int:1;			/* RW, W1C */ -		unsigned long	la_seq_trigger:1;		/* RW, W1C */ -		unsigned long	ipi_int:1;			/* RW, W1C */ -		unsigned long	extio_int0:1;			/* RW, W1C */ -		unsigned long	extio_int1:1;			/* RW, W1C */ -		unsigned long	extio_int2:1;			/* RW, W1C */ -		unsigned long	extio_int3:1;			/* RW, W1C */ -		unsigned long	profile_int:1;			/* RW, W1C */ -		unsigned long	rtc0:1;				/* RW, W1C */ -		unsigned long	rtc1:1;				/* RW, W1C */ -		unsigned long	rtc2:1;				/* RW, W1C */ -		unsigned long	rtc3:1;				/* RW, W1C */ -		unsigned long	bau_data:1;			/* RW, W1C */ -		unsigned long	power_management_req:1;		/* RW, W1C */ -		unsigned long	rsvd_57_63:7; -	} s1; -	struct uv2h_event_occurred0_s { +		unsigned long	rsvd_12_63:52; +	} s; +	struct uvxh_event_occurred0_s {  		unsigned long	lb_hcerr:1;			/* RW */  		unsigned long	qp_hcerr:1;			/* RW */  		unsigned long	rh_hcerr:1;			/* RW */ @@ -481,19 +450,20 @@ union uvh_event_occurred0_u {  		unsigned long	extio_int3:1;			/* RW */  		unsigned long	profile_int:1;			/* RW */  		unsigned long	rsvd_59_63:5; -	} s2; +	} sx;  };  /* ========================================================================= */  /*                        UVH_EVENT_OCCURRED0_ALIAS                          */  /* ========================================================================= */ -#define UVH_EVENT_OCCURRED0_ALIAS			0x0000000000070008UL -#define UVH_EVENT_OCCURRED0_ALIAS_32			0x5f0 +#define UVH_EVENT_OCCURRED0_ALIAS 0x70008UL +#define UVH_EVENT_OCCURRED0_ALIAS_32 0x5f0 +  /* ========================================================================= */  /*                         UVH_GR0_TLB_INT0_CONFIG                           */  /* ========================================================================= */ -#define UVH_GR0_TLB_INT0_CONFIG				0x61b00UL +#define UVH_GR0_TLB_INT0_CONFIG 0x61b00UL  #define UVH_GR0_TLB_INT0_CONFIG_VECTOR_SHFT		0  #define UVH_GR0_TLB_INT0_CONFIG_DM_SHFT			8 @@ -531,7 +501,7 @@ union uvh_gr0_tlb_int0_config_u {  /* ========================================================================= */  /*                         UVH_GR0_TLB_INT1_CONFIG                           */  /* ========================================================================= */ -#define UVH_GR0_TLB_INT1_CONFIG				0x61b40UL +#define UVH_GR0_TLB_INT1_CONFIG 0x61b40UL  #define UVH_GR0_TLB_INT1_CONFIG_VECTOR_SHFT		0  #define UVH_GR0_TLB_INT1_CONFIG_DM_SHFT			8 @@ -571,9 +541,11 @@ union uvh_gr0_tlb_int1_config_u {  /* ========================================================================= */  #define UV1H_GR0_TLB_MMR_CONTROL 0x401080UL  #define UV2H_GR0_TLB_MMR_CONTROL 0xc01080UL -#define UVH_GR0_TLB_MMR_CONTROL (is_uv1_hub() ?				\ -			UV1H_GR0_TLB_MMR_CONTROL :			\ -			UV2H_GR0_TLB_MMR_CONTROL) +#define UV3H_GR0_TLB_MMR_CONTROL 0xc01080UL +#define UVH_GR0_TLB_MMR_CONTROL						\ +		(is_uv1_hub() ? UV1H_GR0_TLB_MMR_CONTROL :		\ +		(is_uv2_hub() ? UV2H_GR0_TLB_MMR_CONTROL :		\ +				UV3H_GR0_TLB_MMR_CONTROL))  #define UVH_GR0_TLB_MMR_CONTROL_INDEX_SHFT		0  #define UVH_GR0_TLB_MMR_CONTROL_MEM_SEL_SHFT		12 @@ -611,6 +583,21 @@ union uvh_gr0_tlb_int1_config_u {  #define UV1H_GR0_TLB_MMR_CONTROL_MMR_INJ_TLBRREG_MASK	0x0100000000000000UL  #define UV1H_GR0_TLB_MMR_CONTROL_MMR_INJ_TLBLRUV_MASK	0x1000000000000000UL +#define UVXH_GR0_TLB_MMR_CONTROL_INDEX_SHFT		0 +#define UVXH_GR0_TLB_MMR_CONTROL_MEM_SEL_SHFT		12 +#define UVXH_GR0_TLB_MMR_CONTROL_AUTO_VALID_EN_SHFT	16 +#define UVXH_GR0_TLB_MMR_CONTROL_MMR_HASH_INDEX_EN_SHFT	20 +#define UVXH_GR0_TLB_MMR_CONTROL_MMR_WRITE_SHFT		30 +#define UVXH_GR0_TLB_MMR_CONTROL_MMR_READ_SHFT		31 +#define UVXH_GR0_TLB_MMR_CONTROL_MMR_OP_DONE_SHFT	32 +#define UVXH_GR0_TLB_MMR_CONTROL_INDEX_MASK		0x0000000000000fffUL +#define UVXH_GR0_TLB_MMR_CONTROL_MEM_SEL_MASK		0x0000000000003000UL +#define UVXH_GR0_TLB_MMR_CONTROL_AUTO_VALID_EN_MASK	0x0000000000010000UL +#define UVXH_GR0_TLB_MMR_CONTROL_MMR_HASH_INDEX_EN_MASK	0x0000000000100000UL +#define UVXH_GR0_TLB_MMR_CONTROL_MMR_WRITE_MASK		0x0000000040000000UL +#define UVXH_GR0_TLB_MMR_CONTROL_MMR_READ_MASK		0x0000000080000000UL +#define UVXH_GR0_TLB_MMR_CONTROL_MMR_OP_DONE_MASK	0x0000000100000000UL +  #define UV2H_GR0_TLB_MMR_CONTROL_INDEX_SHFT		0  #define UV2H_GR0_TLB_MMR_CONTROL_MEM_SEL_SHFT		12  #define UV2H_GR0_TLB_MMR_CONTROL_AUTO_VALID_EN_SHFT	16 @@ -630,6 +617,23 @@ union uvh_gr0_tlb_int1_config_u {  #define UV2H_GR0_TLB_MMR_CONTROL_MMR_INJ_CON_MASK	0x0001000000000000UL  #define UV2H_GR0_TLB_MMR_CONTROL_MMR_INJ_TLBRAM_MASK	0x0010000000000000UL +#define UV3H_GR0_TLB_MMR_CONTROL_INDEX_SHFT		0 +#define UV3H_GR0_TLB_MMR_CONTROL_MEM_SEL_SHFT		12 +#define UV3H_GR0_TLB_MMR_CONTROL_AUTO_VALID_EN_SHFT	16 +#define UV3H_GR0_TLB_MMR_CONTROL_MMR_HASH_INDEX_EN_SHFT	20 +#define UV3H_GR0_TLB_MMR_CONTROL_ECC_SEL_SHFT		21 +#define UV3H_GR0_TLB_MMR_CONTROL_MMR_WRITE_SHFT		30 +#define UV3H_GR0_TLB_MMR_CONTROL_MMR_READ_SHFT		31 +#define UV3H_GR0_TLB_MMR_CONTROL_MMR_OP_DONE_SHFT	32 +#define UV3H_GR0_TLB_MMR_CONTROL_INDEX_MASK		0x0000000000000fffUL +#define UV3H_GR0_TLB_MMR_CONTROL_MEM_SEL_MASK		0x0000000000003000UL +#define UV3H_GR0_TLB_MMR_CONTROL_AUTO_VALID_EN_MASK	0x0000000000010000UL +#define UV3H_GR0_TLB_MMR_CONTROL_MMR_HASH_INDEX_EN_MASK	0x0000000000100000UL +#define UV3H_GR0_TLB_MMR_CONTROL_ECC_SEL_MASK		0x0000000000200000UL +#define UV3H_GR0_TLB_MMR_CONTROL_MMR_WRITE_MASK		0x0000000040000000UL +#define UV3H_GR0_TLB_MMR_CONTROL_MMR_READ_MASK		0x0000000080000000UL +#define UV3H_GR0_TLB_MMR_CONTROL_MMR_OP_DONE_MASK	0x0000000100000000UL +  union uvh_gr0_tlb_mmr_control_u {  	unsigned long	v;  	struct uvh_gr0_tlb_mmr_control_s { @@ -642,7 +646,9 @@ union uvh_gr0_tlb_mmr_control_u {  		unsigned long	rsvd_21_29:9;  		unsigned long	mmr_write:1;			/* WP */  		unsigned long	mmr_read:1;			/* WP */ -		unsigned long	rsvd_32_63:32; +		unsigned long	rsvd_32_48:17; +		unsigned long	rsvd_49_51:3; +		unsigned long	rsvd_52_63:12;  	} s;  	struct uv1h_gr0_tlb_mmr_control_s {  		unsigned long	index:12;			/* RW */ @@ -666,6 +672,23 @@ union uvh_gr0_tlb_mmr_control_u {  		unsigned long	mmr_inj_tlblruv:1;		/* RW */  		unsigned long	rsvd_61_63:3;  	} s1; +	struct uvxh_gr0_tlb_mmr_control_s { +		unsigned long	index:12;			/* RW */ +		unsigned long	mem_sel:2;			/* RW */ +		unsigned long	rsvd_14_15:2; +		unsigned long	auto_valid_en:1;		/* RW */ +		unsigned long	rsvd_17_19:3; +		unsigned long	mmr_hash_index_en:1;		/* RW */ +		unsigned long	rsvd_21_29:9; +		unsigned long	mmr_write:1;			/* WP */ +		unsigned long	mmr_read:1;			/* WP */ +		unsigned long	mmr_op_done:1;			/* RW */ +		unsigned long	rsvd_33_47:15; +		unsigned long	rsvd_48:1; +		unsigned long	rsvd_49_51:3; +		unsigned long	rsvd_52:1; +		unsigned long	rsvd_53_63:11; +	} sx;  	struct uv2h_gr0_tlb_mmr_control_s {  		unsigned long	index:12;			/* RW */  		unsigned long	mem_sel:2;			/* RW */ @@ -683,6 +706,24 @@ union uvh_gr0_tlb_mmr_control_u {  		unsigned long	mmr_inj_tlbram:1;		/* RW */  		unsigned long	rsvd_53_63:11;  	} s2; +	struct uv3h_gr0_tlb_mmr_control_s { +		unsigned long	index:12;			/* RW */ +		unsigned long	mem_sel:2;			/* RW */ +		unsigned long	rsvd_14_15:2; +		unsigned long	auto_valid_en:1;		/* RW */ +		unsigned long	rsvd_17_19:3; +		unsigned long	mmr_hash_index_en:1;		/* RW */ +		unsigned long	ecc_sel:1;			/* RW */ +		unsigned long	rsvd_22_29:8; +		unsigned long	mmr_write:1;			/* WP */ +		unsigned long	mmr_read:1;			/* WP */ +		unsigned long	mmr_op_done:1;			/* RW */ +		unsigned long	rsvd_33_47:15; +		unsigned long	undef_48:1;			/* Undefined */ +		unsigned long	rsvd_49_51:3; +		unsigned long	undef_52:1;			/* Undefined */ +		unsigned long	rsvd_53_63:11; +	} s3;  };  /* ========================================================================= */ @@ -690,9 +731,11 @@ union uvh_gr0_tlb_mmr_control_u {  /* ========================================================================= */  #define UV1H_GR0_TLB_MMR_READ_DATA_HI 0x4010a0UL  #define UV2H_GR0_TLB_MMR_READ_DATA_HI 0xc010a0UL -#define UVH_GR0_TLB_MMR_READ_DATA_HI (is_uv1_hub() ?			\ -			UV1H_GR0_TLB_MMR_READ_DATA_HI :			\ -			UV2H_GR0_TLB_MMR_READ_DATA_HI) +#define UV3H_GR0_TLB_MMR_READ_DATA_HI 0xc010a0UL +#define UVH_GR0_TLB_MMR_READ_DATA_HI					\ +		(is_uv1_hub() ? UV1H_GR0_TLB_MMR_READ_DATA_HI :		\ +		(is_uv2_hub() ? UV2H_GR0_TLB_MMR_READ_DATA_HI :		\ +				UV3H_GR0_TLB_MMR_READ_DATA_HI))  #define UVH_GR0_TLB_MMR_READ_DATA_HI_PFN_SHFT		0  #define UVH_GR0_TLB_MMR_READ_DATA_HI_GAA_SHFT		41 @@ -703,6 +746,46 @@ union uvh_gr0_tlb_mmr_control_u {  #define UVH_GR0_TLB_MMR_READ_DATA_HI_DIRTY_MASK		0x0000080000000000UL  #define UVH_GR0_TLB_MMR_READ_DATA_HI_LARGER_MASK	0x0000100000000000UL +#define UV1H_GR0_TLB_MMR_READ_DATA_HI_PFN_SHFT		0 +#define UV1H_GR0_TLB_MMR_READ_DATA_HI_GAA_SHFT		41 +#define UV1H_GR0_TLB_MMR_READ_DATA_HI_DIRTY_SHFT	43 +#define UV1H_GR0_TLB_MMR_READ_DATA_HI_LARGER_SHFT	44 +#define UV1H_GR0_TLB_MMR_READ_DATA_HI_PFN_MASK		0x000001ffffffffffUL +#define UV1H_GR0_TLB_MMR_READ_DATA_HI_GAA_MASK		0x0000060000000000UL +#define UV1H_GR0_TLB_MMR_READ_DATA_HI_DIRTY_MASK	0x0000080000000000UL +#define UV1H_GR0_TLB_MMR_READ_DATA_HI_LARGER_MASK	0x0000100000000000UL + +#define UVXH_GR0_TLB_MMR_READ_DATA_HI_PFN_SHFT		0 +#define UVXH_GR0_TLB_MMR_READ_DATA_HI_GAA_SHFT		41 +#define UVXH_GR0_TLB_MMR_READ_DATA_HI_DIRTY_SHFT	43 +#define UVXH_GR0_TLB_MMR_READ_DATA_HI_LARGER_SHFT	44 +#define UVXH_GR0_TLB_MMR_READ_DATA_HI_PFN_MASK		0x000001ffffffffffUL +#define UVXH_GR0_TLB_MMR_READ_DATA_HI_GAA_MASK		0x0000060000000000UL +#define UVXH_GR0_TLB_MMR_READ_DATA_HI_DIRTY_MASK	0x0000080000000000UL +#define UVXH_GR0_TLB_MMR_READ_DATA_HI_LARGER_MASK	0x0000100000000000UL + +#define UV2H_GR0_TLB_MMR_READ_DATA_HI_PFN_SHFT		0 +#define UV2H_GR0_TLB_MMR_READ_DATA_HI_GAA_SHFT		41 +#define UV2H_GR0_TLB_MMR_READ_DATA_HI_DIRTY_SHFT	43 +#define UV2H_GR0_TLB_MMR_READ_DATA_HI_LARGER_SHFT	44 +#define UV2H_GR0_TLB_MMR_READ_DATA_HI_PFN_MASK		0x000001ffffffffffUL +#define UV2H_GR0_TLB_MMR_READ_DATA_HI_GAA_MASK		0x0000060000000000UL +#define UV2H_GR0_TLB_MMR_READ_DATA_HI_DIRTY_MASK	0x0000080000000000UL +#define UV2H_GR0_TLB_MMR_READ_DATA_HI_LARGER_MASK	0x0000100000000000UL + +#define UV3H_GR0_TLB_MMR_READ_DATA_HI_PFN_SHFT		0 +#define UV3H_GR0_TLB_MMR_READ_DATA_HI_GAA_SHFT		41 +#define UV3H_GR0_TLB_MMR_READ_DATA_HI_DIRTY_SHFT	43 +#define UV3H_GR0_TLB_MMR_READ_DATA_HI_LARGER_SHFT	44 +#define UV3H_GR0_TLB_MMR_READ_DATA_HI_AA_EXT_SHFT	45 +#define UV3H_GR0_TLB_MMR_READ_DATA_HI_WAY_ECC_SHFT	55 +#define UV3H_GR0_TLB_MMR_READ_DATA_HI_PFN_MASK		0x000001ffffffffffUL +#define UV3H_GR0_TLB_MMR_READ_DATA_HI_GAA_MASK		0x0000060000000000UL +#define UV3H_GR0_TLB_MMR_READ_DATA_HI_DIRTY_MASK	0x0000080000000000UL +#define UV3H_GR0_TLB_MMR_READ_DATA_HI_LARGER_MASK	0x0000100000000000UL +#define UV3H_GR0_TLB_MMR_READ_DATA_HI_AA_EXT_MASK	0x0000200000000000UL +#define UV3H_GR0_TLB_MMR_READ_DATA_HI_WAY_ECC_MASK	0xff80000000000000UL +  union uvh_gr0_tlb_mmr_read_data_hi_u {  	unsigned long	v;  	struct uvh_gr0_tlb_mmr_read_data_hi_s { @@ -712,6 +795,36 @@ union uvh_gr0_tlb_mmr_read_data_hi_u {  		unsigned long	larger:1;			/* RO */  		unsigned long	rsvd_45_63:19;  	} s; +	struct uv1h_gr0_tlb_mmr_read_data_hi_s { +		unsigned long	pfn:41;				/* RO */ +		unsigned long	gaa:2;				/* RO */ +		unsigned long	dirty:1;			/* RO */ +		unsigned long	larger:1;			/* RO */ +		unsigned long	rsvd_45_63:19; +	} s1; +	struct uvxh_gr0_tlb_mmr_read_data_hi_s { +		unsigned long	pfn:41;				/* RO */ +		unsigned long	gaa:2;				/* RO */ +		unsigned long	dirty:1;			/* RO */ +		unsigned long	larger:1;			/* RO */ +		unsigned long	rsvd_45_63:19; +	} sx; +	struct uv2h_gr0_tlb_mmr_read_data_hi_s { +		unsigned long	pfn:41;				/* RO */ +		unsigned long	gaa:2;				/* RO */ +		unsigned long	dirty:1;			/* RO */ +		unsigned long	larger:1;			/* RO */ +		unsigned long	rsvd_45_63:19; +	} s2; +	struct uv3h_gr0_tlb_mmr_read_data_hi_s { +		unsigned long	pfn:41;				/* RO */ +		unsigned long	gaa:2;				/* RO */ +		unsigned long	dirty:1;			/* RO */ +		unsigned long	larger:1;			/* RO */ +		unsigned long	aa_ext:1;			/* RO */ +		unsigned long	undef_46_54:9;			/* Undefined */ +		unsigned long	way_ecc:9;			/* RO */ +	} s3;  };  /* ========================================================================= */ @@ -719,9 +832,11 @@ union uvh_gr0_tlb_mmr_read_data_hi_u {  /* ========================================================================= */  #define UV1H_GR0_TLB_MMR_READ_DATA_LO 0x4010a8UL  #define UV2H_GR0_TLB_MMR_READ_DATA_LO 0xc010a8UL -#define UVH_GR0_TLB_MMR_READ_DATA_LO (is_uv1_hub() ?			\ -			UV1H_GR0_TLB_MMR_READ_DATA_LO :			\ -			UV2H_GR0_TLB_MMR_READ_DATA_LO) +#define UV3H_GR0_TLB_MMR_READ_DATA_LO 0xc010a8UL +#define UVH_GR0_TLB_MMR_READ_DATA_LO					\ +		(is_uv1_hub() ? UV1H_GR0_TLB_MMR_READ_DATA_LO :		\ +		(is_uv2_hub() ? UV2H_GR0_TLB_MMR_READ_DATA_LO :		\ +				UV3H_GR0_TLB_MMR_READ_DATA_LO))  #define UVH_GR0_TLB_MMR_READ_DATA_LO_VPN_SHFT		0  #define UVH_GR0_TLB_MMR_READ_DATA_LO_ASID_SHFT		39 @@ -730,6 +845,34 @@ union uvh_gr0_tlb_mmr_read_data_hi_u {  #define UVH_GR0_TLB_MMR_READ_DATA_LO_ASID_MASK		0x7fffff8000000000UL  #define UVH_GR0_TLB_MMR_READ_DATA_LO_VALID_MASK		0x8000000000000000UL +#define UV1H_GR0_TLB_MMR_READ_DATA_LO_VPN_SHFT		0 +#define UV1H_GR0_TLB_MMR_READ_DATA_LO_ASID_SHFT		39 +#define UV1H_GR0_TLB_MMR_READ_DATA_LO_VALID_SHFT	63 +#define UV1H_GR0_TLB_MMR_READ_DATA_LO_VPN_MASK		0x0000007fffffffffUL +#define UV1H_GR0_TLB_MMR_READ_DATA_LO_ASID_MASK		0x7fffff8000000000UL +#define UV1H_GR0_TLB_MMR_READ_DATA_LO_VALID_MASK	0x8000000000000000UL + +#define UVXH_GR0_TLB_MMR_READ_DATA_LO_VPN_SHFT		0 +#define UVXH_GR0_TLB_MMR_READ_DATA_LO_ASID_SHFT		39 +#define UVXH_GR0_TLB_MMR_READ_DATA_LO_VALID_SHFT	63 +#define UVXH_GR0_TLB_MMR_READ_DATA_LO_VPN_MASK		0x0000007fffffffffUL +#define UVXH_GR0_TLB_MMR_READ_DATA_LO_ASID_MASK		0x7fffff8000000000UL +#define UVXH_GR0_TLB_MMR_READ_DATA_LO_VALID_MASK	0x8000000000000000UL + +#define UV2H_GR0_TLB_MMR_READ_DATA_LO_VPN_SHFT		0 +#define UV2H_GR0_TLB_MMR_READ_DATA_LO_ASID_SHFT		39 +#define UV2H_GR0_TLB_MMR_READ_DATA_LO_VALID_SHFT	63 +#define UV2H_GR0_TLB_MMR_READ_DATA_LO_VPN_MASK		0x0000007fffffffffUL +#define UV2H_GR0_TLB_MMR_READ_DATA_LO_ASID_MASK		0x7fffff8000000000UL +#define UV2H_GR0_TLB_MMR_READ_DATA_LO_VALID_MASK	0x8000000000000000UL + +#define UV3H_GR0_TLB_MMR_READ_DATA_LO_VPN_SHFT		0 +#define UV3H_GR0_TLB_MMR_READ_DATA_LO_ASID_SHFT		39 +#define UV3H_GR0_TLB_MMR_READ_DATA_LO_VALID_SHFT	63 +#define UV3H_GR0_TLB_MMR_READ_DATA_LO_VPN_MASK		0x0000007fffffffffUL +#define UV3H_GR0_TLB_MMR_READ_DATA_LO_ASID_MASK		0x7fffff8000000000UL +#define UV3H_GR0_TLB_MMR_READ_DATA_LO_VALID_MASK	0x8000000000000000UL +  union uvh_gr0_tlb_mmr_read_data_lo_u {  	unsigned long	v;  	struct uvh_gr0_tlb_mmr_read_data_lo_s { @@ -737,12 +880,32 @@ union uvh_gr0_tlb_mmr_read_data_lo_u {  		unsigned long	asid:24;			/* RO */  		unsigned long	valid:1;			/* RO */  	} s; +	struct uv1h_gr0_tlb_mmr_read_data_lo_s { +		unsigned long	vpn:39;				/* RO */ +		unsigned long	asid:24;			/* RO */ +		unsigned long	valid:1;			/* RO */ +	} s1; +	struct uvxh_gr0_tlb_mmr_read_data_lo_s { +		unsigned long	vpn:39;				/* RO */ +		unsigned long	asid:24;			/* RO */ +		unsigned long	valid:1;			/* RO */ +	} sx; +	struct uv2h_gr0_tlb_mmr_read_data_lo_s { +		unsigned long	vpn:39;				/* RO */ +		unsigned long	asid:24;			/* RO */ +		unsigned long	valid:1;			/* RO */ +	} s2; +	struct uv3h_gr0_tlb_mmr_read_data_lo_s { +		unsigned long	vpn:39;				/* RO */ +		unsigned long	asid:24;			/* RO */ +		unsigned long	valid:1;			/* RO */ +	} s3;  };  /* ========================================================================= */  /*                         UVH_GR1_TLB_INT0_CONFIG                           */  /* ========================================================================= */ -#define UVH_GR1_TLB_INT0_CONFIG				0x61f00UL +#define UVH_GR1_TLB_INT0_CONFIG 0x61f00UL  #define UVH_GR1_TLB_INT0_CONFIG_VECTOR_SHFT		0  #define UVH_GR1_TLB_INT0_CONFIG_DM_SHFT			8 @@ -780,7 +943,7 @@ union uvh_gr1_tlb_int0_config_u {  /* ========================================================================= */  /*                         UVH_GR1_TLB_INT1_CONFIG                           */  /* ========================================================================= */ -#define UVH_GR1_TLB_INT1_CONFIG				0x61f40UL +#define UVH_GR1_TLB_INT1_CONFIG 0x61f40UL  #define UVH_GR1_TLB_INT1_CONFIG_VECTOR_SHFT		0  #define UVH_GR1_TLB_INT1_CONFIG_DM_SHFT			8 @@ -820,9 +983,11 @@ union uvh_gr1_tlb_int1_config_u {  /* ========================================================================= */  #define UV1H_GR1_TLB_MMR_CONTROL 0x801080UL  #define UV2H_GR1_TLB_MMR_CONTROL 0x1001080UL -#define UVH_GR1_TLB_MMR_CONTROL (is_uv1_hub() ?				\ -			UV1H_GR1_TLB_MMR_CONTROL :			\ -			UV2H_GR1_TLB_MMR_CONTROL) +#define UV3H_GR1_TLB_MMR_CONTROL 0x1001080UL +#define UVH_GR1_TLB_MMR_CONTROL						\ +		(is_uv1_hub() ? UV1H_GR1_TLB_MMR_CONTROL :		\ +		(is_uv2_hub() ? UV2H_GR1_TLB_MMR_CONTROL :		\ +				UV3H_GR1_TLB_MMR_CONTROL))  #define UVH_GR1_TLB_MMR_CONTROL_INDEX_SHFT		0  #define UVH_GR1_TLB_MMR_CONTROL_MEM_SEL_SHFT		12 @@ -860,6 +1025,21 @@ union uvh_gr1_tlb_int1_config_u {  #define UV1H_GR1_TLB_MMR_CONTROL_MMR_INJ_TLBRREG_MASK	0x0100000000000000UL  #define UV1H_GR1_TLB_MMR_CONTROL_MMR_INJ_TLBLRUV_MASK	0x1000000000000000UL +#define UVXH_GR1_TLB_MMR_CONTROL_INDEX_SHFT		0 +#define UVXH_GR1_TLB_MMR_CONTROL_MEM_SEL_SHFT		12 +#define UVXH_GR1_TLB_MMR_CONTROL_AUTO_VALID_EN_SHFT	16 +#define UVXH_GR1_TLB_MMR_CONTROL_MMR_HASH_INDEX_EN_SHFT	20 +#define UVXH_GR1_TLB_MMR_CONTROL_MMR_WRITE_SHFT		30 +#define UVXH_GR1_TLB_MMR_CONTROL_MMR_READ_SHFT		31 +#define UVXH_GR1_TLB_MMR_CONTROL_MMR_OP_DONE_SHFT	32 +#define UVXH_GR1_TLB_MMR_CONTROL_INDEX_MASK		0x0000000000000fffUL +#define UVXH_GR1_TLB_MMR_CONTROL_MEM_SEL_MASK		0x0000000000003000UL +#define UVXH_GR1_TLB_MMR_CONTROL_AUTO_VALID_EN_MASK	0x0000000000010000UL +#define UVXH_GR1_TLB_MMR_CONTROL_MMR_HASH_INDEX_EN_MASK	0x0000000000100000UL +#define UVXH_GR1_TLB_MMR_CONTROL_MMR_WRITE_MASK		0x0000000040000000UL +#define UVXH_GR1_TLB_MMR_CONTROL_MMR_READ_MASK		0x0000000080000000UL +#define UVXH_GR1_TLB_MMR_CONTROL_MMR_OP_DONE_MASK	0x0000000100000000UL +  #define UV2H_GR1_TLB_MMR_CONTROL_INDEX_SHFT		0  #define UV2H_GR1_TLB_MMR_CONTROL_MEM_SEL_SHFT		12  #define UV2H_GR1_TLB_MMR_CONTROL_AUTO_VALID_EN_SHFT	16 @@ -879,6 +1059,23 @@ union uvh_gr1_tlb_int1_config_u {  #define UV2H_GR1_TLB_MMR_CONTROL_MMR_INJ_CON_MASK	0x0001000000000000UL  #define UV2H_GR1_TLB_MMR_CONTROL_MMR_INJ_TLBRAM_MASK	0x0010000000000000UL +#define UV3H_GR1_TLB_MMR_CONTROL_INDEX_SHFT		0 +#define UV3H_GR1_TLB_MMR_CONTROL_MEM_SEL_SHFT		12 +#define UV3H_GR1_TLB_MMR_CONTROL_AUTO_VALID_EN_SHFT	16 +#define UV3H_GR1_TLB_MMR_CONTROL_MMR_HASH_INDEX_EN_SHFT	20 +#define UV3H_GR1_TLB_MMR_CONTROL_ECC_SEL_SHFT		21 +#define UV3H_GR1_TLB_MMR_CONTROL_MMR_WRITE_SHFT		30 +#define UV3H_GR1_TLB_MMR_CONTROL_MMR_READ_SHFT		31 +#define UV3H_GR1_TLB_MMR_CONTROL_MMR_OP_DONE_SHFT	32 +#define UV3H_GR1_TLB_MMR_CONTROL_INDEX_MASK		0x0000000000000fffUL +#define UV3H_GR1_TLB_MMR_CONTROL_MEM_SEL_MASK		0x0000000000003000UL +#define UV3H_GR1_TLB_MMR_CONTROL_AUTO_VALID_EN_MASK	0x0000000000010000UL +#define UV3H_GR1_TLB_MMR_CONTROL_MMR_HASH_INDEX_EN_MASK	0x0000000000100000UL +#define UV3H_GR1_TLB_MMR_CONTROL_ECC_SEL_MASK		0x0000000000200000UL +#define UV3H_GR1_TLB_MMR_CONTROL_MMR_WRITE_MASK		0x0000000040000000UL +#define UV3H_GR1_TLB_MMR_CONTROL_MMR_READ_MASK		0x0000000080000000UL +#define UV3H_GR1_TLB_MMR_CONTROL_MMR_OP_DONE_MASK	0x0000000100000000UL +  union uvh_gr1_tlb_mmr_control_u {  	unsigned long	v;  	struct uvh_gr1_tlb_mmr_control_s { @@ -891,7 +1088,9 @@ union uvh_gr1_tlb_mmr_control_u {  		unsigned long	rsvd_21_29:9;  		unsigned long	mmr_write:1;			/* WP */  		unsigned long	mmr_read:1;			/* WP */ -		unsigned long	rsvd_32_63:32; +		unsigned long	rsvd_32_48:17; +		unsigned long	rsvd_49_51:3; +		unsigned long	rsvd_52_63:12;  	} s;  	struct uv1h_gr1_tlb_mmr_control_s {  		unsigned long	index:12;			/* RW */ @@ -915,6 +1114,23 @@ union uvh_gr1_tlb_mmr_control_u {  		unsigned long	mmr_inj_tlblruv:1;		/* RW */  		unsigned long	rsvd_61_63:3;  	} s1; +	struct uvxh_gr1_tlb_mmr_control_s { +		unsigned long	index:12;			/* RW */ +		unsigned long	mem_sel:2;			/* RW */ +		unsigned long	rsvd_14_15:2; +		unsigned long	auto_valid_en:1;		/* RW */ +		unsigned long	rsvd_17_19:3; +		unsigned long	mmr_hash_index_en:1;		/* RW */ +		unsigned long	rsvd_21_29:9; +		unsigned long	mmr_write:1;			/* WP */ +		unsigned long	mmr_read:1;			/* WP */ +		unsigned long	mmr_op_done:1;			/* RW */ +		unsigned long	rsvd_33_47:15; +		unsigned long	rsvd_48:1; +		unsigned long	rsvd_49_51:3; +		unsigned long	rsvd_52:1; +		unsigned long	rsvd_53_63:11; +	} sx;  	struct uv2h_gr1_tlb_mmr_control_s {  		unsigned long	index:12;			/* RW */  		unsigned long	mem_sel:2;			/* RW */ @@ -932,6 +1148,24 @@ union uvh_gr1_tlb_mmr_control_u {  		unsigned long	mmr_inj_tlbram:1;		/* RW */  		unsigned long	rsvd_53_63:11;  	} s2; +	struct uv3h_gr1_tlb_mmr_control_s { +		unsigned long	index:12;			/* RW */ +		unsigned long	mem_sel:2;			/* RW */ +		unsigned long	rsvd_14_15:2; +		unsigned long	auto_valid_en:1;		/* RW */ +		unsigned long	rsvd_17_19:3; +		unsigned long	mmr_hash_index_en:1;		/* RW */ +		unsigned long	ecc_sel:1;			/* RW */ +		unsigned long	rsvd_22_29:8; +		unsigned long	mmr_write:1;			/* WP */ +		unsigned long	mmr_read:1;			/* WP */ +		unsigned long	mmr_op_done:1;			/* RW */ +		unsigned long	rsvd_33_47:15; +		unsigned long	undef_48:1;			/* Undefined */ +		unsigned long	rsvd_49_51:3; +		unsigned long	undef_52:1;			/* Undefined */ +		unsigned long	rsvd_53_63:11; +	} s3;  };  /* ========================================================================= */ @@ -939,9 +1173,11 @@ union uvh_gr1_tlb_mmr_control_u {  /* ========================================================================= */  #define UV1H_GR1_TLB_MMR_READ_DATA_HI 0x8010a0UL  #define UV2H_GR1_TLB_MMR_READ_DATA_HI 0x10010a0UL -#define UVH_GR1_TLB_MMR_READ_DATA_HI (is_uv1_hub() ?			\ -			UV1H_GR1_TLB_MMR_READ_DATA_HI :			\ -			UV2H_GR1_TLB_MMR_READ_DATA_HI) +#define UV3H_GR1_TLB_MMR_READ_DATA_HI 0x10010a0UL +#define UVH_GR1_TLB_MMR_READ_DATA_HI					\ +		(is_uv1_hub() ? UV1H_GR1_TLB_MMR_READ_DATA_HI :		\ +		(is_uv2_hub() ? UV2H_GR1_TLB_MMR_READ_DATA_HI :		\ +				UV3H_GR1_TLB_MMR_READ_DATA_HI))  #define UVH_GR1_TLB_MMR_READ_DATA_HI_PFN_SHFT		0  #define UVH_GR1_TLB_MMR_READ_DATA_HI_GAA_SHFT		41 @@ -952,6 +1188,46 @@ union uvh_gr1_tlb_mmr_control_u {  #define UVH_GR1_TLB_MMR_READ_DATA_HI_DIRTY_MASK		0x0000080000000000UL  #define UVH_GR1_TLB_MMR_READ_DATA_HI_LARGER_MASK	0x0000100000000000UL +#define UV1H_GR1_TLB_MMR_READ_DATA_HI_PFN_SHFT		0 +#define UV1H_GR1_TLB_MMR_READ_DATA_HI_GAA_SHFT		41 +#define UV1H_GR1_TLB_MMR_READ_DATA_HI_DIRTY_SHFT	43 +#define UV1H_GR1_TLB_MMR_READ_DATA_HI_LARGER_SHFT	44 +#define UV1H_GR1_TLB_MMR_READ_DATA_HI_PFN_MASK		0x000001ffffffffffUL +#define UV1H_GR1_TLB_MMR_READ_DATA_HI_GAA_MASK		0x0000060000000000UL +#define UV1H_GR1_TLB_MMR_READ_DATA_HI_DIRTY_MASK	0x0000080000000000UL +#define UV1H_GR1_TLB_MMR_READ_DATA_HI_LARGER_MASK	0x0000100000000000UL + +#define UVXH_GR1_TLB_MMR_READ_DATA_HI_PFN_SHFT		0 +#define UVXH_GR1_TLB_MMR_READ_DATA_HI_GAA_SHFT		41 +#define UVXH_GR1_TLB_MMR_READ_DATA_HI_DIRTY_SHFT	43 +#define UVXH_GR1_TLB_MMR_READ_DATA_HI_LARGER_SHFT	44 +#define UVXH_GR1_TLB_MMR_READ_DATA_HI_PFN_MASK		0x000001ffffffffffUL +#define UVXH_GR1_TLB_MMR_READ_DATA_HI_GAA_MASK		0x0000060000000000UL +#define UVXH_GR1_TLB_MMR_READ_DATA_HI_DIRTY_MASK	0x0000080000000000UL +#define UVXH_GR1_TLB_MMR_READ_DATA_HI_LARGER_MASK	0x0000100000000000UL + +#define UV2H_GR1_TLB_MMR_READ_DATA_HI_PFN_SHFT		0 +#define UV2H_GR1_TLB_MMR_READ_DATA_HI_GAA_SHFT		41 +#define UV2H_GR1_TLB_MMR_READ_DATA_HI_DIRTY_SHFT	43 +#define UV2H_GR1_TLB_MMR_READ_DATA_HI_LARGER_SHFT	44 +#define UV2H_GR1_TLB_MMR_READ_DATA_HI_PFN_MASK		0x000001ffffffffffUL +#define UV2H_GR1_TLB_MMR_READ_DATA_HI_GAA_MASK		0x0000060000000000UL +#define UV2H_GR1_TLB_MMR_READ_DATA_HI_DIRTY_MASK	0x0000080000000000UL +#define UV2H_GR1_TLB_MMR_READ_DATA_HI_LARGER_MASK	0x0000100000000000UL + +#define UV3H_GR1_TLB_MMR_READ_DATA_HI_PFN_SHFT		0 +#define UV3H_GR1_TLB_MMR_READ_DATA_HI_GAA_SHFT		41 +#define UV3H_GR1_TLB_MMR_READ_DATA_HI_DIRTY_SHFT	43 +#define UV3H_GR1_TLB_MMR_READ_DATA_HI_LARGER_SHFT	44 +#define UV3H_GR1_TLB_MMR_READ_DATA_HI_AA_EXT_SHFT	45 +#define UV3H_GR1_TLB_MMR_READ_DATA_HI_WAY_ECC_SHFT	55 +#define UV3H_GR1_TLB_MMR_READ_DATA_HI_PFN_MASK		0x000001ffffffffffUL +#define UV3H_GR1_TLB_MMR_READ_DATA_HI_GAA_MASK		0x0000060000000000UL +#define UV3H_GR1_TLB_MMR_READ_DATA_HI_DIRTY_MASK	0x0000080000000000UL +#define UV3H_GR1_TLB_MMR_READ_DATA_HI_LARGER_MASK	0x0000100000000000UL +#define UV3H_GR1_TLB_MMR_READ_DATA_HI_AA_EXT_MASK	0x0000200000000000UL +#define UV3H_GR1_TLB_MMR_READ_DATA_HI_WAY_ECC_MASK	0xff80000000000000UL +  union uvh_gr1_tlb_mmr_read_data_hi_u {  	unsigned long	v;  	struct uvh_gr1_tlb_mmr_read_data_hi_s { @@ -961,6 +1237,36 @@ union uvh_gr1_tlb_mmr_read_data_hi_u {  		unsigned long	larger:1;			/* RO */  		unsigned long	rsvd_45_63:19;  	} s; +	struct uv1h_gr1_tlb_mmr_read_data_hi_s { +		unsigned long	pfn:41;				/* RO */ +		unsigned long	gaa:2;				/* RO */ +		unsigned long	dirty:1;			/* RO */ +		unsigned long	larger:1;			/* RO */ +		unsigned long	rsvd_45_63:19; +	} s1; +	struct uvxh_gr1_tlb_mmr_read_data_hi_s { +		unsigned long	pfn:41;				/* RO */ +		unsigned long	gaa:2;				/* RO */ +		unsigned long	dirty:1;			/* RO */ +		unsigned long	larger:1;			/* RO */ +		unsigned long	rsvd_45_63:19; +	} sx; +	struct uv2h_gr1_tlb_mmr_read_data_hi_s { +		unsigned long	pfn:41;				/* RO */ +		unsigned long	gaa:2;				/* RO */ +		unsigned long	dirty:1;			/* RO */ +		unsigned long	larger:1;			/* RO */ +		unsigned long	rsvd_45_63:19; +	} s2; +	struct uv3h_gr1_tlb_mmr_read_data_hi_s { +		unsigned long	pfn:41;				/* RO */ +		unsigned long	gaa:2;				/* RO */ +		unsigned long	dirty:1;			/* RO */ +		unsigned long	larger:1;			/* RO */ +		unsigned long	aa_ext:1;			/* RO */ +		unsigned long	undef_46_54:9;			/* Undefined */ +		unsigned long	way_ecc:9;			/* RO */ +	} s3;  };  /* ========================================================================= */ @@ -968,9 +1274,11 @@ union uvh_gr1_tlb_mmr_read_data_hi_u {  /* ========================================================================= */  #define UV1H_GR1_TLB_MMR_READ_DATA_LO 0x8010a8UL  #define UV2H_GR1_TLB_MMR_READ_DATA_LO 0x10010a8UL -#define UVH_GR1_TLB_MMR_READ_DATA_LO (is_uv1_hub() ?			\ -			UV1H_GR1_TLB_MMR_READ_DATA_LO :			\ -			UV2H_GR1_TLB_MMR_READ_DATA_LO) +#define UV3H_GR1_TLB_MMR_READ_DATA_LO 0x10010a8UL +#define UVH_GR1_TLB_MMR_READ_DATA_LO					\ +		(is_uv1_hub() ? UV1H_GR1_TLB_MMR_READ_DATA_LO :		\ +		(is_uv2_hub() ? UV2H_GR1_TLB_MMR_READ_DATA_LO :		\ +				UV3H_GR1_TLB_MMR_READ_DATA_LO))  #define UVH_GR1_TLB_MMR_READ_DATA_LO_VPN_SHFT		0  #define UVH_GR1_TLB_MMR_READ_DATA_LO_ASID_SHFT		39 @@ -979,6 +1287,34 @@ union uvh_gr1_tlb_mmr_read_data_hi_u {  #define UVH_GR1_TLB_MMR_READ_DATA_LO_ASID_MASK		0x7fffff8000000000UL  #define UVH_GR1_TLB_MMR_READ_DATA_LO_VALID_MASK		0x8000000000000000UL +#define UV1H_GR1_TLB_MMR_READ_DATA_LO_VPN_SHFT		0 +#define UV1H_GR1_TLB_MMR_READ_DATA_LO_ASID_SHFT		39 +#define UV1H_GR1_TLB_MMR_READ_DATA_LO_VALID_SHFT	63 +#define UV1H_GR1_TLB_MMR_READ_DATA_LO_VPN_MASK		0x0000007fffffffffUL +#define UV1H_GR1_TLB_MMR_READ_DATA_LO_ASID_MASK		0x7fffff8000000000UL +#define UV1H_GR1_TLB_MMR_READ_DATA_LO_VALID_MASK	0x8000000000000000UL + +#define UVXH_GR1_TLB_MMR_READ_DATA_LO_VPN_SHFT		0 +#define UVXH_GR1_TLB_MMR_READ_DATA_LO_ASID_SHFT		39 +#define UVXH_GR1_TLB_MMR_READ_DATA_LO_VALID_SHFT	63 +#define UVXH_GR1_TLB_MMR_READ_DATA_LO_VPN_MASK		0x0000007fffffffffUL +#define UVXH_GR1_TLB_MMR_READ_DATA_LO_ASID_MASK		0x7fffff8000000000UL +#define UVXH_GR1_TLB_MMR_READ_DATA_LO_VALID_MASK	0x8000000000000000UL + +#define UV2H_GR1_TLB_MMR_READ_DATA_LO_VPN_SHFT		0 +#define UV2H_GR1_TLB_MMR_READ_DATA_LO_ASID_SHFT		39 +#define UV2H_GR1_TLB_MMR_READ_DATA_LO_VALID_SHFT	63 +#define UV2H_GR1_TLB_MMR_READ_DATA_LO_VPN_MASK		0x0000007fffffffffUL +#define UV2H_GR1_TLB_MMR_READ_DATA_LO_ASID_MASK		0x7fffff8000000000UL +#define UV2H_GR1_TLB_MMR_READ_DATA_LO_VALID_MASK	0x8000000000000000UL + +#define UV3H_GR1_TLB_MMR_READ_DATA_LO_VPN_SHFT		0 +#define UV3H_GR1_TLB_MMR_READ_DATA_LO_ASID_SHFT		39 +#define UV3H_GR1_TLB_MMR_READ_DATA_LO_VALID_SHFT	63 +#define UV3H_GR1_TLB_MMR_READ_DATA_LO_VPN_MASK		0x0000007fffffffffUL +#define UV3H_GR1_TLB_MMR_READ_DATA_LO_ASID_MASK		0x7fffff8000000000UL +#define UV3H_GR1_TLB_MMR_READ_DATA_LO_VALID_MASK	0x8000000000000000UL +  union uvh_gr1_tlb_mmr_read_data_lo_u {  	unsigned long	v;  	struct uvh_gr1_tlb_mmr_read_data_lo_s { @@ -986,12 +1322,32 @@ union uvh_gr1_tlb_mmr_read_data_lo_u {  		unsigned long	asid:24;			/* RO */  		unsigned long	valid:1;			/* RO */  	} s; +	struct uv1h_gr1_tlb_mmr_read_data_lo_s { +		unsigned long	vpn:39;				/* RO */ +		unsigned long	asid:24;			/* RO */ +		unsigned long	valid:1;			/* RO */ +	} s1; +	struct uvxh_gr1_tlb_mmr_read_data_lo_s { +		unsigned long	vpn:39;				/* RO */ +		unsigned long	asid:24;			/* RO */ +		unsigned long	valid:1;			/* RO */ +	} sx; +	struct uv2h_gr1_tlb_mmr_read_data_lo_s { +		unsigned long	vpn:39;				/* RO */ +		unsigned long	asid:24;			/* RO */ +		unsigned long	valid:1;			/* RO */ +	} s2; +	struct uv3h_gr1_tlb_mmr_read_data_lo_s { +		unsigned long	vpn:39;				/* RO */ +		unsigned long	asid:24;			/* RO */ +		unsigned long	valid:1;			/* RO */ +	} s3;  };  /* ========================================================================= */  /*                               UVH_INT_CMPB                                */  /* ========================================================================= */ -#define UVH_INT_CMPB					0x22080UL +#define UVH_INT_CMPB 0x22080UL  #define UVH_INT_CMPB_REAL_TIME_CMPB_SHFT		0  #define UVH_INT_CMPB_REAL_TIME_CMPB_MASK		0x00ffffffffffffffUL @@ -1007,10 +1363,13 @@ union uvh_int_cmpb_u {  /* ========================================================================= */  /*                               UVH_INT_CMPC                                */  /* ========================================================================= */ -#define UVH_INT_CMPC					0x22100UL +#define UVH_INT_CMPC 0x22100UL + +#define UV1H_INT_CMPC_REAL_TIME_CMPC_SHFT		0 +#define UV1H_INT_CMPC_REAL_TIME_CMPC_MASK		0x00ffffffffffffffUL -#define UVH_INT_CMPC_REAL_TIME_CMPC_SHFT		0 -#define UVH_INT_CMPC_REAL_TIME_CMPC_MASK		0xffffffffffffffUL +#define UVXH_INT_CMPC_REAL_TIME_CMP_2_SHFT		0 +#define UVXH_INT_CMPC_REAL_TIME_CMP_2_MASK		0x00ffffffffffffffUL  union uvh_int_cmpc_u {  	unsigned long	v; @@ -1023,10 +1382,13 @@ union uvh_int_cmpc_u {  /* ========================================================================= */  /*                               UVH_INT_CMPD                                */  /* ========================================================================= */ -#define UVH_INT_CMPD					0x22180UL +#define UVH_INT_CMPD 0x22180UL -#define UVH_INT_CMPD_REAL_TIME_CMPD_SHFT		0 -#define UVH_INT_CMPD_REAL_TIME_CMPD_MASK		0xffffffffffffffUL +#define UV1H_INT_CMPD_REAL_TIME_CMPD_SHFT		0 +#define UV1H_INT_CMPD_REAL_TIME_CMPD_MASK		0x00ffffffffffffffUL + +#define UVXH_INT_CMPD_REAL_TIME_CMP_3_SHFT		0 +#define UVXH_INT_CMPD_REAL_TIME_CMP_3_MASK		0x00ffffffffffffffUL  union uvh_int_cmpd_u {  	unsigned long	v; @@ -1039,8 +1401,8 @@ union uvh_int_cmpd_u {  /* ========================================================================= */  /*                               UVH_IPI_INT                                 */  /* ========================================================================= */ -#define UVH_IPI_INT					0x60500UL -#define UVH_IPI_INT_32					0x348 +#define UVH_IPI_INT 0x60500UL +#define UVH_IPI_INT_32 0x348  #define UVH_IPI_INT_VECTOR_SHFT				0  #define UVH_IPI_INT_DELIVERY_MODE_SHFT			8 @@ -1069,8 +1431,8 @@ union uvh_ipi_int_u {  /* ========================================================================= */  /*                   UVH_LB_BAU_INTD_PAYLOAD_QUEUE_FIRST                     */  /* ========================================================================= */ -#define UVH_LB_BAU_INTD_PAYLOAD_QUEUE_FIRST		0x320050UL -#define UVH_LB_BAU_INTD_PAYLOAD_QUEUE_FIRST_32		0x9c0 +#define UVH_LB_BAU_INTD_PAYLOAD_QUEUE_FIRST 0x320050UL +#define UVH_LB_BAU_INTD_PAYLOAD_QUEUE_FIRST_32 0x9c0  #define UVH_LB_BAU_INTD_PAYLOAD_QUEUE_FIRST_ADDRESS_SHFT 4  #define UVH_LB_BAU_INTD_PAYLOAD_QUEUE_FIRST_NODE_ID_SHFT 49 @@ -1091,8 +1453,8 @@ union uvh_lb_bau_intd_payload_queue_first_u {  /* ========================================================================= */  /*                    UVH_LB_BAU_INTD_PAYLOAD_QUEUE_LAST                     */  /* ========================================================================= */ -#define UVH_LB_BAU_INTD_PAYLOAD_QUEUE_LAST		0x320060UL -#define UVH_LB_BAU_INTD_PAYLOAD_QUEUE_LAST_32		0x9c8 +#define UVH_LB_BAU_INTD_PAYLOAD_QUEUE_LAST 0x320060UL +#define UVH_LB_BAU_INTD_PAYLOAD_QUEUE_LAST_32 0x9c8  #define UVH_LB_BAU_INTD_PAYLOAD_QUEUE_LAST_ADDRESS_SHFT	4  #define UVH_LB_BAU_INTD_PAYLOAD_QUEUE_LAST_ADDRESS_MASK	0x000007fffffffff0UL @@ -1109,8 +1471,8 @@ union uvh_lb_bau_intd_payload_queue_last_u {  /* ========================================================================= */  /*                    UVH_LB_BAU_INTD_PAYLOAD_QUEUE_TAIL                     */  /* ========================================================================= */ -#define UVH_LB_BAU_INTD_PAYLOAD_QUEUE_TAIL		0x320070UL -#define UVH_LB_BAU_INTD_PAYLOAD_QUEUE_TAIL_32		0x9d0 +#define UVH_LB_BAU_INTD_PAYLOAD_QUEUE_TAIL 0x320070UL +#define UVH_LB_BAU_INTD_PAYLOAD_QUEUE_TAIL_32 0x9d0  #define UVH_LB_BAU_INTD_PAYLOAD_QUEUE_TAIL_ADDRESS_SHFT	4  #define UVH_LB_BAU_INTD_PAYLOAD_QUEUE_TAIL_ADDRESS_MASK	0x000007fffffffff0UL @@ -1127,8 +1489,8 @@ union uvh_lb_bau_intd_payload_queue_tail_u {  /* ========================================================================= */  /*                   UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE                    */  /* ========================================================================= */ -#define UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE		0x320080UL -#define UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE_32		0xa68 +#define UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE 0x320080UL +#define UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE_32 0xa68  #define UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE_PENDING_0_SHFT 0  #define UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE_PENDING_1_SHFT 1 @@ -1189,14 +1551,21 @@ union uvh_lb_bau_intd_software_acknowledge_u {  /* ========================================================================= */  /*                UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE_ALIAS                 */  /* ========================================================================= */ -#define UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE_ALIAS	0x0000000000320088UL -#define UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE_ALIAS_32	0xa70 +#define UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE_ALIAS 0x320088UL +#define UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE_ALIAS_32 0xa70 +  /* ========================================================================= */  /*                         UVH_LB_BAU_MISC_CONTROL                           */  /* ========================================================================= */ -#define UVH_LB_BAU_MISC_CONTROL				0x320170UL -#define UVH_LB_BAU_MISC_CONTROL_32			0xa10 +#define UVH_LB_BAU_MISC_CONTROL 0x320170UL +#define UV1H_LB_BAU_MISC_CONTROL 0x320170UL +#define UV2H_LB_BAU_MISC_CONTROL 0x320170UL +#define UV3H_LB_BAU_MISC_CONTROL 0x320170UL +#define UVH_LB_BAU_MISC_CONTROL_32 0xa10 +#define UV1H_LB_BAU_MISC_CONTROL_32 0x320170UL +#define UV2H_LB_BAU_MISC_CONTROL_32 0x320170UL +#define UV3H_LB_BAU_MISC_CONTROL_32 0x320170UL  #define UVH_LB_BAU_MISC_CONTROL_REJECTION_DELAY_SHFT	0  #define UVH_LB_BAU_MISC_CONTROL_APIC_MODE_SHFT		8 @@ -1213,6 +1582,7 @@ union uvh_lb_bau_intd_software_acknowledge_u {  #define UVH_LB_BAU_MISC_CONTROL_PROGRAMMED_INITIAL_PRIORITY_SHFT 24  #define UVH_LB_BAU_MISC_CONTROL_USE_INCOMING_PRIORITY_SHFT 27  #define UVH_LB_BAU_MISC_CONTROL_ENABLE_PROGRAMMED_INITIAL_PRIORITY_SHFT 28 +#define UVH_LB_BAU_MISC_CONTROL_FUN_SHFT		48  #define UVH_LB_BAU_MISC_CONTROL_REJECTION_DELAY_MASK	0x00000000000000ffUL  #define UVH_LB_BAU_MISC_CONTROL_APIC_MODE_MASK		0x0000000000000100UL  #define UVH_LB_BAU_MISC_CONTROL_FORCE_BROADCAST_MASK	0x0000000000000200UL @@ -1228,6 +1598,7 @@ union uvh_lb_bau_intd_software_acknowledge_u {  #define UVH_LB_BAU_MISC_CONTROL_PROGRAMMED_INITIAL_PRIORITY_MASK 0x0000000007000000UL  #define UVH_LB_BAU_MISC_CONTROL_USE_INCOMING_PRIORITY_MASK 0x0000000008000000UL  #define UVH_LB_BAU_MISC_CONTROL_ENABLE_PROGRAMMED_INITIAL_PRIORITY_MASK 0x0000000010000000UL +#define UVH_LB_BAU_MISC_CONTROL_FUN_MASK		0xffff000000000000UL  #define UV1H_LB_BAU_MISC_CONTROL_REJECTION_DELAY_SHFT	0  #define UV1H_LB_BAU_MISC_CONTROL_APIC_MODE_SHFT		8 @@ -1262,6 +1633,53 @@ union uvh_lb_bau_intd_software_acknowledge_u {  #define UV1H_LB_BAU_MISC_CONTROL_ENABLE_PROGRAMMED_INITIAL_PRIORITY_MASK 0x0000000010000000UL  #define UV1H_LB_BAU_MISC_CONTROL_FUN_MASK		0xffff000000000000UL +#define UVXH_LB_BAU_MISC_CONTROL_REJECTION_DELAY_SHFT	0 +#define UVXH_LB_BAU_MISC_CONTROL_APIC_MODE_SHFT		8 +#define UVXH_LB_BAU_MISC_CONTROL_FORCE_BROADCAST_SHFT	9 +#define UVXH_LB_BAU_MISC_CONTROL_FORCE_LOCK_NOP_SHFT	10 +#define UVXH_LB_BAU_MISC_CONTROL_QPI_AGENT_PRESENCE_VECTOR_SHFT 11 +#define UVXH_LB_BAU_MISC_CONTROL_DESCRIPTOR_FETCH_MODE_SHFT 14 +#define UVXH_LB_BAU_MISC_CONTROL_ENABLE_INTD_SOFT_ACK_MODE_SHFT 15 +#define UVXH_LB_BAU_MISC_CONTROL_INTD_SOFT_ACK_TIMEOUT_PERIOD_SHFT 16 +#define UVXH_LB_BAU_MISC_CONTROL_ENABLE_DUAL_MAPPING_MODE_SHFT 20 +#define UVXH_LB_BAU_MISC_CONTROL_VGA_IO_PORT_DECODE_ENABLE_SHFT 21 +#define UVXH_LB_BAU_MISC_CONTROL_VGA_IO_PORT_16_BIT_DECODE_SHFT 22 +#define UVXH_LB_BAU_MISC_CONTROL_SUPPRESS_DEST_REGISTRATION_SHFT 23 +#define UVXH_LB_BAU_MISC_CONTROL_PROGRAMMED_INITIAL_PRIORITY_SHFT 24 +#define UVXH_LB_BAU_MISC_CONTROL_USE_INCOMING_PRIORITY_SHFT 27 +#define UVXH_LB_BAU_MISC_CONTROL_ENABLE_PROGRAMMED_INITIAL_PRIORITY_SHFT 28 +#define UVXH_LB_BAU_MISC_CONTROL_ENABLE_AUTOMATIC_APIC_MODE_SELECTION_SHFT 29 +#define UVXH_LB_BAU_MISC_CONTROL_APIC_MODE_STATUS_SHFT	30 +#define UVXH_LB_BAU_MISC_CONTROL_SUPPRESS_INTERRUPTS_TO_SELF_SHFT 31 +#define UVXH_LB_BAU_MISC_CONTROL_ENABLE_LOCK_BASED_SYSTEM_FLUSH_SHFT 32 +#define UVXH_LB_BAU_MISC_CONTROL_ENABLE_EXTENDED_SB_STATUS_SHFT 33 +#define UVXH_LB_BAU_MISC_CONTROL_SUPPRESS_INT_PRIO_UDT_TO_SELF_SHFT 34 +#define UVXH_LB_BAU_MISC_CONTROL_USE_LEGACY_DESCRIPTOR_FORMATS_SHFT 35 +#define UVXH_LB_BAU_MISC_CONTROL_FUN_SHFT		48 +#define UVXH_LB_BAU_MISC_CONTROL_REJECTION_DELAY_MASK	0x00000000000000ffUL +#define UVXH_LB_BAU_MISC_CONTROL_APIC_MODE_MASK		0x0000000000000100UL +#define UVXH_LB_BAU_MISC_CONTROL_FORCE_BROADCAST_MASK	0x0000000000000200UL +#define UVXH_LB_BAU_MISC_CONTROL_FORCE_LOCK_NOP_MASK	0x0000000000000400UL +#define UVXH_LB_BAU_MISC_CONTROL_QPI_AGENT_PRESENCE_VECTOR_MASK 0x0000000000003800UL +#define UVXH_LB_BAU_MISC_CONTROL_DESCRIPTOR_FETCH_MODE_MASK 0x0000000000004000UL +#define UVXH_LB_BAU_MISC_CONTROL_ENABLE_INTD_SOFT_ACK_MODE_MASK 0x0000000000008000UL +#define UVXH_LB_BAU_MISC_CONTROL_INTD_SOFT_ACK_TIMEOUT_PERIOD_MASK 0x00000000000f0000UL +#define UVXH_LB_BAU_MISC_CONTROL_ENABLE_DUAL_MAPPING_MODE_MASK 0x0000000000100000UL +#define UVXH_LB_BAU_MISC_CONTROL_VGA_IO_PORT_DECODE_ENABLE_MASK 0x0000000000200000UL +#define UVXH_LB_BAU_MISC_CONTROL_VGA_IO_PORT_16_BIT_DECODE_MASK 0x0000000000400000UL +#define UVXH_LB_BAU_MISC_CONTROL_SUPPRESS_DEST_REGISTRATION_MASK 0x0000000000800000UL +#define UVXH_LB_BAU_MISC_CONTROL_PROGRAMMED_INITIAL_PRIORITY_MASK 0x0000000007000000UL +#define UVXH_LB_BAU_MISC_CONTROL_USE_INCOMING_PRIORITY_MASK 0x0000000008000000UL +#define UVXH_LB_BAU_MISC_CONTROL_ENABLE_PROGRAMMED_INITIAL_PRIORITY_MASK 0x0000000010000000UL +#define UVXH_LB_BAU_MISC_CONTROL_ENABLE_AUTOMATIC_APIC_MODE_SELECTION_MASK 0x0000000020000000UL +#define UVXH_LB_BAU_MISC_CONTROL_APIC_MODE_STATUS_MASK	0x0000000040000000UL +#define UVXH_LB_BAU_MISC_CONTROL_SUPPRESS_INTERRUPTS_TO_SELF_MASK 0x0000000080000000UL +#define UVXH_LB_BAU_MISC_CONTROL_ENABLE_LOCK_BASED_SYSTEM_FLUSH_MASK 0x0000000100000000UL +#define UVXH_LB_BAU_MISC_CONTROL_ENABLE_EXTENDED_SB_STATUS_MASK 0x0000000200000000UL +#define UVXH_LB_BAU_MISC_CONTROL_SUPPRESS_INT_PRIO_UDT_TO_SELF_MASK 0x0000000400000000UL +#define UVXH_LB_BAU_MISC_CONTROL_USE_LEGACY_DESCRIPTOR_FORMATS_MASK 0x0000000800000000UL +#define UVXH_LB_BAU_MISC_CONTROL_FUN_MASK		0xffff000000000000UL +  #define UV2H_LB_BAU_MISC_CONTROL_REJECTION_DELAY_SHFT	0  #define UV2H_LB_BAU_MISC_CONTROL_APIC_MODE_SHFT		8  #define UV2H_LB_BAU_MISC_CONTROL_FORCE_BROADCAST_SHFT	9 @@ -1309,6 +1727,59 @@ union uvh_lb_bau_intd_software_acknowledge_u {  #define UV2H_LB_BAU_MISC_CONTROL_USE_LEGACY_DESCRIPTOR_FORMATS_MASK 0x0000000800000000UL  #define UV2H_LB_BAU_MISC_CONTROL_FUN_MASK		0xffff000000000000UL +#define UV3H_LB_BAU_MISC_CONTROL_REJECTION_DELAY_SHFT	0 +#define UV3H_LB_BAU_MISC_CONTROL_APIC_MODE_SHFT		8 +#define UV3H_LB_BAU_MISC_CONTROL_FORCE_BROADCAST_SHFT	9 +#define UV3H_LB_BAU_MISC_CONTROL_FORCE_LOCK_NOP_SHFT	10 +#define UV3H_LB_BAU_MISC_CONTROL_QPI_AGENT_PRESENCE_VECTOR_SHFT 11 +#define UV3H_LB_BAU_MISC_CONTROL_DESCRIPTOR_FETCH_MODE_SHFT 14 +#define UV3H_LB_BAU_MISC_CONTROL_ENABLE_INTD_SOFT_ACK_MODE_SHFT 15 +#define UV3H_LB_BAU_MISC_CONTROL_INTD_SOFT_ACK_TIMEOUT_PERIOD_SHFT 16 +#define UV3H_LB_BAU_MISC_CONTROL_ENABLE_DUAL_MAPPING_MODE_SHFT 20 +#define UV3H_LB_BAU_MISC_CONTROL_VGA_IO_PORT_DECODE_ENABLE_SHFT 21 +#define UV3H_LB_BAU_MISC_CONTROL_VGA_IO_PORT_16_BIT_DECODE_SHFT 22 +#define UV3H_LB_BAU_MISC_CONTROL_SUPPRESS_DEST_REGISTRATION_SHFT 23 +#define UV3H_LB_BAU_MISC_CONTROL_PROGRAMMED_INITIAL_PRIORITY_SHFT 24 +#define UV3H_LB_BAU_MISC_CONTROL_USE_INCOMING_PRIORITY_SHFT 27 +#define UV3H_LB_BAU_MISC_CONTROL_ENABLE_PROGRAMMED_INITIAL_PRIORITY_SHFT 28 +#define UV3H_LB_BAU_MISC_CONTROL_ENABLE_AUTOMATIC_APIC_MODE_SELECTION_SHFT 29 +#define UV3H_LB_BAU_MISC_CONTROL_APIC_MODE_STATUS_SHFT	30 +#define UV3H_LB_BAU_MISC_CONTROL_SUPPRESS_INTERRUPTS_TO_SELF_SHFT 31 +#define UV3H_LB_BAU_MISC_CONTROL_ENABLE_LOCK_BASED_SYSTEM_FLUSH_SHFT 32 +#define UV3H_LB_BAU_MISC_CONTROL_ENABLE_EXTENDED_SB_STATUS_SHFT 33 +#define UV3H_LB_BAU_MISC_CONTROL_SUPPRESS_INT_PRIO_UDT_TO_SELF_SHFT 34 +#define UV3H_LB_BAU_MISC_CONTROL_USE_LEGACY_DESCRIPTOR_FORMATS_SHFT 35 +#define UV3H_LB_BAU_MISC_CONTROL_SUPPRESS_QUIESCE_MSGS_TO_QPI_SHFT 36 +#define UV3H_LB_BAU_MISC_CONTROL_ENABLE_INTD_PREFETCH_HINT_SHFT 37 +#define UV3H_LB_BAU_MISC_CONTROL_THREAD_KILL_TIMEBASE_SHFT 38 +#define UV3H_LB_BAU_MISC_CONTROL_FUN_SHFT		48 +#define UV3H_LB_BAU_MISC_CONTROL_REJECTION_DELAY_MASK	0x00000000000000ffUL +#define UV3H_LB_BAU_MISC_CONTROL_APIC_MODE_MASK		0x0000000000000100UL +#define UV3H_LB_BAU_MISC_CONTROL_FORCE_BROADCAST_MASK	0x0000000000000200UL +#define UV3H_LB_BAU_MISC_CONTROL_FORCE_LOCK_NOP_MASK	0x0000000000000400UL +#define UV3H_LB_BAU_MISC_CONTROL_QPI_AGENT_PRESENCE_VECTOR_MASK 0x0000000000003800UL +#define UV3H_LB_BAU_MISC_CONTROL_DESCRIPTOR_FETCH_MODE_MASK 0x0000000000004000UL +#define UV3H_LB_BAU_MISC_CONTROL_ENABLE_INTD_SOFT_ACK_MODE_MASK 0x0000000000008000UL +#define UV3H_LB_BAU_MISC_CONTROL_INTD_SOFT_ACK_TIMEOUT_PERIOD_MASK 0x00000000000f0000UL +#define UV3H_LB_BAU_MISC_CONTROL_ENABLE_DUAL_MAPPING_MODE_MASK 0x0000000000100000UL +#define UV3H_LB_BAU_MISC_CONTROL_VGA_IO_PORT_DECODE_ENABLE_MASK 0x0000000000200000UL +#define UV3H_LB_BAU_MISC_CONTROL_VGA_IO_PORT_16_BIT_DECODE_MASK 0x0000000000400000UL +#define UV3H_LB_BAU_MISC_CONTROL_SUPPRESS_DEST_REGISTRATION_MASK 0x0000000000800000UL +#define UV3H_LB_BAU_MISC_CONTROL_PROGRAMMED_INITIAL_PRIORITY_MASK 0x0000000007000000UL +#define UV3H_LB_BAU_MISC_CONTROL_USE_INCOMING_PRIORITY_MASK 0x0000000008000000UL +#define UV3H_LB_BAU_MISC_CONTROL_ENABLE_PROGRAMMED_INITIAL_PRIORITY_MASK 0x0000000010000000UL +#define UV3H_LB_BAU_MISC_CONTROL_ENABLE_AUTOMATIC_APIC_MODE_SELECTION_MASK 0x0000000020000000UL +#define UV3H_LB_BAU_MISC_CONTROL_APIC_MODE_STATUS_MASK	0x0000000040000000UL +#define UV3H_LB_BAU_MISC_CONTROL_SUPPRESS_INTERRUPTS_TO_SELF_MASK 0x0000000080000000UL +#define UV3H_LB_BAU_MISC_CONTROL_ENABLE_LOCK_BASED_SYSTEM_FLUSH_MASK 0x0000000100000000UL +#define UV3H_LB_BAU_MISC_CONTROL_ENABLE_EXTENDED_SB_STATUS_MASK 0x0000000200000000UL +#define UV3H_LB_BAU_MISC_CONTROL_SUPPRESS_INT_PRIO_UDT_TO_SELF_MASK 0x0000000400000000UL +#define UV3H_LB_BAU_MISC_CONTROL_USE_LEGACY_DESCRIPTOR_FORMATS_MASK 0x0000000800000000UL +#define UV3H_LB_BAU_MISC_CONTROL_SUPPRESS_QUIESCE_MSGS_TO_QPI_MASK 0x0000001000000000UL +#define UV3H_LB_BAU_MISC_CONTROL_ENABLE_INTD_PREFETCH_HINT_MASK 0x0000002000000000UL +#define UV3H_LB_BAU_MISC_CONTROL_THREAD_KILL_TIMEBASE_MASK 0x00003fc000000000UL +#define UV3H_LB_BAU_MISC_CONTROL_FUN_MASK		0xffff000000000000UL +  union uvh_lb_bau_misc_control_u {  	unsigned long	v;  	struct uvh_lb_bau_misc_control_s { @@ -1327,7 +1798,8 @@ union uvh_lb_bau_misc_control_u {  		unsigned long	programmed_initial_priority:3;	/* RW */  		unsigned long	use_incoming_priority:1;	/* RW */  		unsigned long	enable_programmed_initial_priority:1;/* RW */ -		unsigned long	rsvd_29_63:35; +		unsigned long	rsvd_29_47:19; +		unsigned long	fun:16;				/* RW */  	} s;  	struct uv1h_lb_bau_misc_control_s {  		unsigned long	rejection_delay:8;		/* RW */ @@ -1348,6 +1820,32 @@ union uvh_lb_bau_misc_control_u {  		unsigned long	rsvd_29_47:19;  		unsigned long	fun:16;				/* RW */  	} s1; +	struct uvxh_lb_bau_misc_control_s { +		unsigned long	rejection_delay:8;		/* RW */ +		unsigned long	apic_mode:1;			/* RW */ +		unsigned long	force_broadcast:1;		/* RW */ +		unsigned long	force_lock_nop:1;		/* RW */ +		unsigned long	qpi_agent_presence_vector:3;	/* RW */ +		unsigned long	descriptor_fetch_mode:1;	/* RW */ +		unsigned long	enable_intd_soft_ack_mode:1;	/* RW */ +		unsigned long	intd_soft_ack_timeout_period:4;	/* RW */ +		unsigned long	enable_dual_mapping_mode:1;	/* RW */ +		unsigned long	vga_io_port_decode_enable:1;	/* RW */ +		unsigned long	vga_io_port_16_bit_decode:1;	/* RW */ +		unsigned long	suppress_dest_registration:1;	/* RW */ +		unsigned long	programmed_initial_priority:3;	/* RW */ +		unsigned long	use_incoming_priority:1;	/* RW */ +		unsigned long	enable_programmed_initial_priority:1;/* RW */ +		unsigned long	enable_automatic_apic_mode_selection:1;/* RW */ +		unsigned long	apic_mode_status:1;		/* RO */ +		unsigned long	suppress_interrupts_to_self:1;	/* RW */ +		unsigned long	enable_lock_based_system_flush:1;/* RW */ +		unsigned long	enable_extended_sb_status:1;	/* RW */ +		unsigned long	suppress_int_prio_udt_to_self:1;/* RW */ +		unsigned long	use_legacy_descriptor_formats:1;/* RW */ +		unsigned long	rsvd_36_47:12; +		unsigned long	fun:16;				/* RW */ +	} sx;  	struct uv2h_lb_bau_misc_control_s {  		unsigned long	rejection_delay:8;		/* RW */  		unsigned long	apic_mode:1;			/* RW */ @@ -1374,13 +1872,42 @@ union uvh_lb_bau_misc_control_u {  		unsigned long	rsvd_36_47:12;  		unsigned long	fun:16;				/* RW */  	} s2; +	struct uv3h_lb_bau_misc_control_s { +		unsigned long	rejection_delay:8;		/* RW */ +		unsigned long	apic_mode:1;			/* RW */ +		unsigned long	force_broadcast:1;		/* RW */ +		unsigned long	force_lock_nop:1;		/* RW */ +		unsigned long	qpi_agent_presence_vector:3;	/* RW */ +		unsigned long	descriptor_fetch_mode:1;	/* RW */ +		unsigned long	enable_intd_soft_ack_mode:1;	/* RW */ +		unsigned long	intd_soft_ack_timeout_period:4;	/* RW */ +		unsigned long	enable_dual_mapping_mode:1;	/* RW */ +		unsigned long	vga_io_port_decode_enable:1;	/* RW */ +		unsigned long	vga_io_port_16_bit_decode:1;	/* RW */ +		unsigned long	suppress_dest_registration:1;	/* RW */ +		unsigned long	programmed_initial_priority:3;	/* RW */ +		unsigned long	use_incoming_priority:1;	/* RW */ +		unsigned long	enable_programmed_initial_priority:1;/* RW */ +		unsigned long	enable_automatic_apic_mode_selection:1;/* RW */ +		unsigned long	apic_mode_status:1;		/* RO */ +		unsigned long	suppress_interrupts_to_self:1;	/* RW */ +		unsigned long	enable_lock_based_system_flush:1;/* RW */ +		unsigned long	enable_extended_sb_status:1;	/* RW */ +		unsigned long	suppress_int_prio_udt_to_self:1;/* RW */ +		unsigned long	use_legacy_descriptor_formats:1;/* RW */ +		unsigned long	suppress_quiesce_msgs_to_qpi:1;	/* RW */ +		unsigned long	enable_intd_prefetch_hint:1;	/* RW */ +		unsigned long	thread_kill_timebase:8;		/* RW */ +		unsigned long	rsvd_46_47:2; +		unsigned long	fun:16;				/* RW */ +	} s3;  };  /* ========================================================================= */  /*                     UVH_LB_BAU_SB_ACTIVATION_CONTROL                      */  /* ========================================================================= */ -#define UVH_LB_BAU_SB_ACTIVATION_CONTROL		0x320020UL -#define UVH_LB_BAU_SB_ACTIVATION_CONTROL_32		0x9a8 +#define UVH_LB_BAU_SB_ACTIVATION_CONTROL 0x320020UL +#define UVH_LB_BAU_SB_ACTIVATION_CONTROL_32 0x9a8  #define UVH_LB_BAU_SB_ACTIVATION_CONTROL_INDEX_SHFT	0  #define UVH_LB_BAU_SB_ACTIVATION_CONTROL_PUSH_SHFT	62 @@ -1402,8 +1929,8 @@ union uvh_lb_bau_sb_activation_control_u {  /* ========================================================================= */  /*                    UVH_LB_BAU_SB_ACTIVATION_STATUS_0                      */  /* ========================================================================= */ -#define UVH_LB_BAU_SB_ACTIVATION_STATUS_0		0x320030UL -#define UVH_LB_BAU_SB_ACTIVATION_STATUS_0_32		0x9b0 +#define UVH_LB_BAU_SB_ACTIVATION_STATUS_0 0x320030UL +#define UVH_LB_BAU_SB_ACTIVATION_STATUS_0_32 0x9b0  #define UVH_LB_BAU_SB_ACTIVATION_STATUS_0_STATUS_SHFT	0  #define UVH_LB_BAU_SB_ACTIVATION_STATUS_0_STATUS_MASK	0xffffffffffffffffUL @@ -1418,8 +1945,8 @@ union uvh_lb_bau_sb_activation_status_0_u {  /* ========================================================================= */  /*                    UVH_LB_BAU_SB_ACTIVATION_STATUS_1                      */  /* ========================================================================= */ -#define UVH_LB_BAU_SB_ACTIVATION_STATUS_1		0x320040UL -#define UVH_LB_BAU_SB_ACTIVATION_STATUS_1_32		0x9b8 +#define UVH_LB_BAU_SB_ACTIVATION_STATUS_1 0x320040UL +#define UVH_LB_BAU_SB_ACTIVATION_STATUS_1_32 0x9b8  #define UVH_LB_BAU_SB_ACTIVATION_STATUS_1_STATUS_SHFT	0  #define UVH_LB_BAU_SB_ACTIVATION_STATUS_1_STATUS_MASK	0xffffffffffffffffUL @@ -1434,8 +1961,8 @@ union uvh_lb_bau_sb_activation_status_1_u {  /* ========================================================================= */  /*                      UVH_LB_BAU_SB_DESCRIPTOR_BASE                        */  /* ========================================================================= */ -#define UVH_LB_BAU_SB_DESCRIPTOR_BASE			0x320010UL -#define UVH_LB_BAU_SB_DESCRIPTOR_BASE_32		0x9a0 +#define UVH_LB_BAU_SB_DESCRIPTOR_BASE 0x320010UL +#define UVH_LB_BAU_SB_DESCRIPTOR_BASE_32 0x9a0  #define UVH_LB_BAU_SB_DESCRIPTOR_BASE_PAGE_ADDRESS_SHFT	12  #define UVH_LB_BAU_SB_DESCRIPTOR_BASE_NODE_ID_SHFT	49 @@ -1456,7 +1983,10 @@ union uvh_lb_bau_sb_descriptor_base_u {  /* ========================================================================= */  /*                               UVH_NODE_ID                                 */  /* ========================================================================= */ -#define UVH_NODE_ID					0x0UL +#define UVH_NODE_ID 0x0UL +#define UV1H_NODE_ID 0x0UL +#define UV2H_NODE_ID 0x0UL +#define UV3H_NODE_ID 0x0UL  #define UVH_NODE_ID_FORCE1_SHFT				0  #define UVH_NODE_ID_MANUFACTURER_SHFT			1 @@ -1484,6 +2014,21 @@ union uvh_lb_bau_sb_descriptor_base_u {  #define UV1H_NODE_ID_NODES_PER_BIT_MASK			0x007f000000000000UL  #define UV1H_NODE_ID_NI_PORT_MASK			0x0f00000000000000UL +#define UVXH_NODE_ID_FORCE1_SHFT			0 +#define UVXH_NODE_ID_MANUFACTURER_SHFT			1 +#define UVXH_NODE_ID_PART_NUMBER_SHFT			12 +#define UVXH_NODE_ID_REVISION_SHFT			28 +#define UVXH_NODE_ID_NODE_ID_SHFT			32 +#define UVXH_NODE_ID_NODES_PER_BIT_SHFT			50 +#define UVXH_NODE_ID_NI_PORT_SHFT			57 +#define UVXH_NODE_ID_FORCE1_MASK			0x0000000000000001UL +#define UVXH_NODE_ID_MANUFACTURER_MASK			0x0000000000000ffeUL +#define UVXH_NODE_ID_PART_NUMBER_MASK			0x000000000ffff000UL +#define UVXH_NODE_ID_REVISION_MASK			0x00000000f0000000UL +#define UVXH_NODE_ID_NODE_ID_MASK			0x00007fff00000000UL +#define UVXH_NODE_ID_NODES_PER_BIT_MASK			0x01fc000000000000UL +#define UVXH_NODE_ID_NI_PORT_MASK			0x3e00000000000000UL +  #define UV2H_NODE_ID_FORCE1_SHFT			0  #define UV2H_NODE_ID_MANUFACTURER_SHFT			1  #define UV2H_NODE_ID_PART_NUMBER_SHFT			12 @@ -1499,6 +2044,25 @@ union uvh_lb_bau_sb_descriptor_base_u {  #define UV2H_NODE_ID_NODES_PER_BIT_MASK			0x01fc000000000000UL  #define UV2H_NODE_ID_NI_PORT_MASK			0x3e00000000000000UL +#define UV3H_NODE_ID_FORCE1_SHFT			0 +#define UV3H_NODE_ID_MANUFACTURER_SHFT			1 +#define UV3H_NODE_ID_PART_NUMBER_SHFT			12 +#define UV3H_NODE_ID_REVISION_SHFT			28 +#define UV3H_NODE_ID_NODE_ID_SHFT			32 +#define UV3H_NODE_ID_ROUTER_SELECT_SHFT			48 +#define UV3H_NODE_ID_RESERVED_2_SHFT			49 +#define UV3H_NODE_ID_NODES_PER_BIT_SHFT			50 +#define UV3H_NODE_ID_NI_PORT_SHFT			57 +#define UV3H_NODE_ID_FORCE1_MASK			0x0000000000000001UL +#define UV3H_NODE_ID_MANUFACTURER_MASK			0x0000000000000ffeUL +#define UV3H_NODE_ID_PART_NUMBER_MASK			0x000000000ffff000UL +#define UV3H_NODE_ID_REVISION_MASK			0x00000000f0000000UL +#define UV3H_NODE_ID_NODE_ID_MASK			0x00007fff00000000UL +#define UV3H_NODE_ID_ROUTER_SELECT_MASK			0x0001000000000000UL +#define UV3H_NODE_ID_RESERVED_2_MASK			0x0002000000000000UL +#define UV3H_NODE_ID_NODES_PER_BIT_MASK			0x01fc000000000000UL +#define UV3H_NODE_ID_NI_PORT_MASK			0x3e00000000000000UL +  union uvh_node_id_u {  	unsigned long	v;  	struct uvh_node_id_s { @@ -1521,6 +2085,17 @@ union uvh_node_id_u {  		unsigned long	ni_port:4;			/* RO */  		unsigned long	rsvd_60_63:4;  	} s1; +	struct uvxh_node_id_s { +		unsigned long	force1:1;			/* RO */ +		unsigned long	manufacturer:11;		/* RO */ +		unsigned long	part_number:16;			/* RO */ +		unsigned long	revision:4;			/* RO */ +		unsigned long	node_id:15;			/* RW */ +		unsigned long	rsvd_47_49:3; +		unsigned long	nodes_per_bit:7;		/* RO */ +		unsigned long	ni_port:5;			/* RO */ +		unsigned long	rsvd_62_63:2; +	} sx;  	struct uv2h_node_id_s {  		unsigned long	force1:1;			/* RO */  		unsigned long	manufacturer:11;		/* RO */ @@ -1532,13 +2107,26 @@ union uvh_node_id_u {  		unsigned long	ni_port:5;			/* RO */  		unsigned long	rsvd_62_63:2;  	} s2; +	struct uv3h_node_id_s { +		unsigned long	force1:1;			/* RO */ +		unsigned long	manufacturer:11;		/* RO */ +		unsigned long	part_number:16;			/* RO */ +		unsigned long	revision:4;			/* RO */ +		unsigned long	node_id:15;			/* RW */ +		unsigned long	rsvd_47:1; +		unsigned long	router_select:1;		/* RO */ +		unsigned long	rsvd_49:1; +		unsigned long	nodes_per_bit:7;		/* RO */ +		unsigned long	ni_port:5;			/* RO */ +		unsigned long	rsvd_62_63:2; +	} s3;  };  /* ========================================================================= */  /*                          UVH_NODE_PRESENT_TABLE                           */  /* ========================================================================= */ -#define UVH_NODE_PRESENT_TABLE				0x1400UL -#define UVH_NODE_PRESENT_TABLE_DEPTH			16 +#define UVH_NODE_PRESENT_TABLE 0x1400UL +#define UVH_NODE_PRESENT_TABLE_DEPTH 16  #define UVH_NODE_PRESENT_TABLE_NODES_SHFT		0  #define UVH_NODE_PRESENT_TABLE_NODES_MASK		0xffffffffffffffffUL @@ -1553,7 +2141,7 @@ union uvh_node_present_table_u {  /* ========================================================================= */  /*                 UVH_RH_GAM_ALIAS210_OVERLAY_CONFIG_0_MMR                  */  /* ========================================================================= */ -#define UVH_RH_GAM_ALIAS210_OVERLAY_CONFIG_0_MMR	0x16000c8UL +#define UVH_RH_GAM_ALIAS210_OVERLAY_CONFIG_0_MMR 0x16000c8UL  #define UVH_RH_GAM_ALIAS210_OVERLAY_CONFIG_0_MMR_BASE_SHFT 24  #define UVH_RH_GAM_ALIAS210_OVERLAY_CONFIG_0_MMR_M_ALIAS_SHFT 48 @@ -1577,7 +2165,7 @@ union uvh_rh_gam_alias210_overlay_config_0_mmr_u {  /* ========================================================================= */  /*                 UVH_RH_GAM_ALIAS210_OVERLAY_CONFIG_1_MMR                  */  /* ========================================================================= */ -#define UVH_RH_GAM_ALIAS210_OVERLAY_CONFIG_1_MMR	0x16000d8UL +#define UVH_RH_GAM_ALIAS210_OVERLAY_CONFIG_1_MMR 0x16000d8UL  #define UVH_RH_GAM_ALIAS210_OVERLAY_CONFIG_1_MMR_BASE_SHFT 24  #define UVH_RH_GAM_ALIAS210_OVERLAY_CONFIG_1_MMR_M_ALIAS_SHFT 48 @@ -1601,7 +2189,7 @@ union uvh_rh_gam_alias210_overlay_config_1_mmr_u {  /* ========================================================================= */  /*                 UVH_RH_GAM_ALIAS210_OVERLAY_CONFIG_2_MMR                  */  /* ========================================================================= */ -#define UVH_RH_GAM_ALIAS210_OVERLAY_CONFIG_2_MMR	0x16000e8UL +#define UVH_RH_GAM_ALIAS210_OVERLAY_CONFIG_2_MMR 0x16000e8UL  #define UVH_RH_GAM_ALIAS210_OVERLAY_CONFIG_2_MMR_BASE_SHFT 24  #define UVH_RH_GAM_ALIAS210_OVERLAY_CONFIG_2_MMR_M_ALIAS_SHFT 48 @@ -1625,7 +2213,7 @@ union uvh_rh_gam_alias210_overlay_config_2_mmr_u {  /* ========================================================================= */  /*                UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_0_MMR                  */  /* ========================================================================= */ -#define UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_0_MMR	0x16000d0UL +#define UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_0_MMR 0x16000d0UL  #define UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_0_MMR_DEST_BASE_SHFT 24  #define UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_0_MMR_DEST_BASE_MASK 0x00003fffff000000UL @@ -1642,7 +2230,7 @@ union uvh_rh_gam_alias210_redirect_config_0_mmr_u {  /* ========================================================================= */  /*                UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_1_MMR                  */  /* ========================================================================= */ -#define UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_1_MMR	0x16000e0UL +#define UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_1_MMR 0x16000e0UL  #define UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_1_MMR_DEST_BASE_SHFT 24  #define UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_1_MMR_DEST_BASE_MASK 0x00003fffff000000UL @@ -1659,7 +2247,7 @@ union uvh_rh_gam_alias210_redirect_config_1_mmr_u {  /* ========================================================================= */  /*                UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_2_MMR                  */  /* ========================================================================= */ -#define UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_2_MMR	0x16000f0UL +#define UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_2_MMR 0x16000f0UL  #define UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_2_MMR_DEST_BASE_SHFT 24  #define UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_2_MMR_DEST_BASE_MASK 0x00003fffff000000UL @@ -1676,7 +2264,10 @@ union uvh_rh_gam_alias210_redirect_config_2_mmr_u {  /* ========================================================================= */  /*                          UVH_RH_GAM_CONFIG_MMR                            */  /* ========================================================================= */ -#define UVH_RH_GAM_CONFIG_MMR				0x1600000UL +#define UVH_RH_GAM_CONFIG_MMR 0x1600000UL +#define UV1H_RH_GAM_CONFIG_MMR 0x1600000UL +#define UV2H_RH_GAM_CONFIG_MMR 0x1600000UL +#define UV3H_RH_GAM_CONFIG_MMR 0x1600000UL  #define UVH_RH_GAM_CONFIG_MMR_M_SKT_SHFT		0  #define UVH_RH_GAM_CONFIG_MMR_N_SKT_SHFT		6 @@ -1690,11 +2281,21 @@ union uvh_rh_gam_alias210_redirect_config_2_mmr_u {  #define UV1H_RH_GAM_CONFIG_MMR_N_SKT_MASK		0x00000000000003c0UL  #define UV1H_RH_GAM_CONFIG_MMR_MMIOL_CFG_MASK		0x0000000000001000UL +#define UVXH_RH_GAM_CONFIG_MMR_M_SKT_SHFT		0 +#define UVXH_RH_GAM_CONFIG_MMR_N_SKT_SHFT		6 +#define UVXH_RH_GAM_CONFIG_MMR_M_SKT_MASK		0x000000000000003fUL +#define UVXH_RH_GAM_CONFIG_MMR_N_SKT_MASK		0x00000000000003c0UL +  #define UV2H_RH_GAM_CONFIG_MMR_M_SKT_SHFT		0  #define UV2H_RH_GAM_CONFIG_MMR_N_SKT_SHFT		6  #define UV2H_RH_GAM_CONFIG_MMR_M_SKT_MASK		0x000000000000003fUL  #define UV2H_RH_GAM_CONFIG_MMR_N_SKT_MASK		0x00000000000003c0UL +#define UV3H_RH_GAM_CONFIG_MMR_M_SKT_SHFT		0 +#define UV3H_RH_GAM_CONFIG_MMR_N_SKT_SHFT		6 +#define UV3H_RH_GAM_CONFIG_MMR_M_SKT_MASK		0x000000000000003fUL +#define UV3H_RH_GAM_CONFIG_MMR_N_SKT_MASK		0x00000000000003c0UL +  union uvh_rh_gam_config_mmr_u {  	unsigned long	v;  	struct uvh_rh_gam_config_mmr_s { @@ -1709,20 +2310,37 @@ union uvh_rh_gam_config_mmr_u {  		unsigned long	mmiol_cfg:1;			/* RW */  		unsigned long	rsvd_13_63:51;  	} s1; +	struct uvxh_rh_gam_config_mmr_s { +		unsigned long	m_skt:6;			/* RW */ +		unsigned long	n_skt:4;			/* RW */ +		unsigned long	rsvd_10_63:54; +	} sx;  	struct uv2h_rh_gam_config_mmr_s {  		unsigned long	m_skt:6;			/* RW */  		unsigned long	n_skt:4;			/* RW */  		unsigned long	rsvd_10_63:54;  	} s2; +	struct uv3h_rh_gam_config_mmr_s { +		unsigned long	m_skt:6;			/* RW */ +		unsigned long	n_skt:4;			/* RW */ +		unsigned long	rsvd_10_63:54; +	} s3;  };  /* ========================================================================= */  /*                    UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR                      */  /* ========================================================================= */ -#define UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR		0x1600010UL +#define UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR 0x1600010UL +#define UV1H_RH_GAM_GRU_OVERLAY_CONFIG_MMR 0x1600010UL +#define UV2H_RH_GAM_GRU_OVERLAY_CONFIG_MMR 0x1600010UL +#define UV3H_RH_GAM_GRU_OVERLAY_CONFIG_MMR 0x1600010UL  #define UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR_BASE_SHFT	28 +#define UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR_N_GRU_SHFT	52 +#define UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR_ENABLE_SHFT	63  #define UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR_BASE_MASK	0x00003ffff0000000UL +#define UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR_N_GRU_MASK	0x00f0000000000000UL +#define UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR_ENABLE_MASK	0x8000000000000000UL  #define UV1H_RH_GAM_GRU_OVERLAY_CONFIG_MMR_BASE_SHFT	28  #define UV1H_RH_GAM_GRU_OVERLAY_CONFIG_MMR_GR4_SHFT	48 @@ -1733,6 +2351,13 @@ union uvh_rh_gam_config_mmr_u {  #define UV1H_RH_GAM_GRU_OVERLAY_CONFIG_MMR_N_GRU_MASK	0x00f0000000000000UL  #define UV1H_RH_GAM_GRU_OVERLAY_CONFIG_MMR_ENABLE_MASK	0x8000000000000000UL +#define UVXH_RH_GAM_GRU_OVERLAY_CONFIG_MMR_BASE_SHFT	28 +#define UVXH_RH_GAM_GRU_OVERLAY_CONFIG_MMR_N_GRU_SHFT	52 +#define UVXH_RH_GAM_GRU_OVERLAY_CONFIG_MMR_ENABLE_SHFT	63 +#define UVXH_RH_GAM_GRU_OVERLAY_CONFIG_MMR_BASE_MASK	0x00003ffff0000000UL +#define UVXH_RH_GAM_GRU_OVERLAY_CONFIG_MMR_N_GRU_MASK	0x00f0000000000000UL +#define UVXH_RH_GAM_GRU_OVERLAY_CONFIG_MMR_ENABLE_MASK	0x8000000000000000UL +  #define UV2H_RH_GAM_GRU_OVERLAY_CONFIG_MMR_BASE_SHFT	28  #define UV2H_RH_GAM_GRU_OVERLAY_CONFIG_MMR_N_GRU_SHFT	52  #define UV2H_RH_GAM_GRU_OVERLAY_CONFIG_MMR_ENABLE_SHFT	63 @@ -1740,12 +2365,23 @@ union uvh_rh_gam_config_mmr_u {  #define UV2H_RH_GAM_GRU_OVERLAY_CONFIG_MMR_N_GRU_MASK	0x00f0000000000000UL  #define UV2H_RH_GAM_GRU_OVERLAY_CONFIG_MMR_ENABLE_MASK	0x8000000000000000UL +#define UV3H_RH_GAM_GRU_OVERLAY_CONFIG_MMR_BASE_SHFT	28 +#define UV3H_RH_GAM_GRU_OVERLAY_CONFIG_MMR_N_GRU_SHFT	52 +#define UV3H_RH_GAM_GRU_OVERLAY_CONFIG_MMR_MODE_SHFT	62 +#define UV3H_RH_GAM_GRU_OVERLAY_CONFIG_MMR_ENABLE_SHFT	63 +#define UV3H_RH_GAM_GRU_OVERLAY_CONFIG_MMR_BASE_MASK	0x00003ffff0000000UL +#define UV3H_RH_GAM_GRU_OVERLAY_CONFIG_MMR_N_GRU_MASK	0x00f0000000000000UL +#define UV3H_RH_GAM_GRU_OVERLAY_CONFIG_MMR_MODE_MASK	0x4000000000000000UL +#define UV3H_RH_GAM_GRU_OVERLAY_CONFIG_MMR_ENABLE_MASK	0x8000000000000000UL +  union uvh_rh_gam_gru_overlay_config_mmr_u {  	unsigned long	v;  	struct uvh_rh_gam_gru_overlay_config_mmr_s {  		unsigned long	rsvd_0_27:28;  		unsigned long	base:18;			/* RW */ -		unsigned long	rsvd_46_62:17; +		unsigned long	rsvd_46_51:6; +		unsigned long	n_gru:4;			/* RW */ +		unsigned long	rsvd_56_62:7;  		unsigned long	enable:1;			/* RW */  	} s;  	struct uv1h_rh_gam_gru_overlay_config_mmr_s { @@ -1758,6 +2394,14 @@ union uvh_rh_gam_gru_overlay_config_mmr_u {  		unsigned long	rsvd_56_62:7;  		unsigned long	enable:1;			/* RW */  	} s1; +	struct uvxh_rh_gam_gru_overlay_config_mmr_s { +		unsigned long	rsvd_0_27:28; +		unsigned long	base:18;			/* RW */ +		unsigned long	rsvd_46_51:6; +		unsigned long	n_gru:4;			/* RW */ +		unsigned long	rsvd_56_62:7; +		unsigned long	enable:1;			/* RW */ +	} sx;  	struct uv2h_rh_gam_gru_overlay_config_mmr_s {  		unsigned long	rsvd_0_27:28;  		unsigned long	base:18;			/* RW */ @@ -1766,12 +2410,22 @@ union uvh_rh_gam_gru_overlay_config_mmr_u {  		unsigned long	rsvd_56_62:7;  		unsigned long	enable:1;			/* RW */  	} s2; +	struct uv3h_rh_gam_gru_overlay_config_mmr_s { +		unsigned long	rsvd_0_27:28; +		unsigned long	base:18;			/* RW */ +		unsigned long	rsvd_46_51:6; +		unsigned long	n_gru:4;			/* RW */ +		unsigned long	rsvd_56_61:6; +		unsigned long	mode:1;				/* RW */ +		unsigned long	enable:1;			/* RW */ +	} s3;  };  /* ========================================================================= */  /*                   UVH_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR                     */  /* ========================================================================= */ -#define UVH_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR		0x1600030UL +#define UV1H_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR 0x1600030UL +#define UV2H_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR 0x1600030UL  #define UV1H_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR_BASE_SHFT	30  #define UV1H_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR_M_IO_SHFT	46 @@ -1814,10 +2468,15 @@ union uvh_rh_gam_mmioh_overlay_config_mmr_u {  /* ========================================================================= */  /*                    UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR                      */  /* ========================================================================= */ -#define UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR		0x1600028UL +#define UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR 0x1600028UL +#define UV1H_RH_GAM_MMR_OVERLAY_CONFIG_MMR 0x1600028UL +#define UV2H_RH_GAM_MMR_OVERLAY_CONFIG_MMR 0x1600028UL +#define UV3H_RH_GAM_MMR_OVERLAY_CONFIG_MMR 0x1600028UL  #define UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR_BASE_SHFT	26 +#define UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR_ENABLE_SHFT	63  #define UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR_BASE_MASK	0x00003ffffc000000UL +#define UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR_ENABLE_MASK	0x8000000000000000UL  #define UV1H_RH_GAM_MMR_OVERLAY_CONFIG_MMR_BASE_SHFT	26  #define UV1H_RH_GAM_MMR_OVERLAY_CONFIG_MMR_DUAL_HUB_SHFT 46 @@ -1826,11 +2485,21 @@ union uvh_rh_gam_mmioh_overlay_config_mmr_u {  #define UV1H_RH_GAM_MMR_OVERLAY_CONFIG_MMR_DUAL_HUB_MASK 0x0000400000000000UL  #define UV1H_RH_GAM_MMR_OVERLAY_CONFIG_MMR_ENABLE_MASK	0x8000000000000000UL +#define UVXH_RH_GAM_MMR_OVERLAY_CONFIG_MMR_BASE_SHFT	26 +#define UVXH_RH_GAM_MMR_OVERLAY_CONFIG_MMR_ENABLE_SHFT	63 +#define UVXH_RH_GAM_MMR_OVERLAY_CONFIG_MMR_BASE_MASK	0x00003ffffc000000UL +#define UVXH_RH_GAM_MMR_OVERLAY_CONFIG_MMR_ENABLE_MASK	0x8000000000000000UL +  #define UV2H_RH_GAM_MMR_OVERLAY_CONFIG_MMR_BASE_SHFT	26  #define UV2H_RH_GAM_MMR_OVERLAY_CONFIG_MMR_ENABLE_SHFT	63  #define UV2H_RH_GAM_MMR_OVERLAY_CONFIG_MMR_BASE_MASK	0x00003ffffc000000UL  #define UV2H_RH_GAM_MMR_OVERLAY_CONFIG_MMR_ENABLE_MASK	0x8000000000000000UL +#define UV3H_RH_GAM_MMR_OVERLAY_CONFIG_MMR_BASE_SHFT	26 +#define UV3H_RH_GAM_MMR_OVERLAY_CONFIG_MMR_ENABLE_SHFT	63 +#define UV3H_RH_GAM_MMR_OVERLAY_CONFIG_MMR_BASE_MASK	0x00003ffffc000000UL +#define UV3H_RH_GAM_MMR_OVERLAY_CONFIG_MMR_ENABLE_MASK	0x8000000000000000UL +  union uvh_rh_gam_mmr_overlay_config_mmr_u {  	unsigned long	v;  	struct uvh_rh_gam_mmr_overlay_config_mmr_s { @@ -1846,18 +2515,30 @@ union uvh_rh_gam_mmr_overlay_config_mmr_u {  		unsigned long	rsvd_47_62:16;  		unsigned long	enable:1;			/* RW */  	} s1; +	struct uvxh_rh_gam_mmr_overlay_config_mmr_s { +		unsigned long	rsvd_0_25:26; +		unsigned long	base:20;			/* RW */ +		unsigned long	rsvd_46_62:17; +		unsigned long	enable:1;			/* RW */ +	} sx;  	struct uv2h_rh_gam_mmr_overlay_config_mmr_s {  		unsigned long	rsvd_0_25:26;  		unsigned long	base:20;			/* RW */  		unsigned long	rsvd_46_62:17;  		unsigned long	enable:1;			/* RW */  	} s2; +	struct uv3h_rh_gam_mmr_overlay_config_mmr_s { +		unsigned long	rsvd_0_25:26; +		unsigned long	base:20;			/* RW */ +		unsigned long	rsvd_46_62:17; +		unsigned long	enable:1;			/* RW */ +	} s3;  };  /* ========================================================================= */  /*                                 UVH_RTC                                   */  /* ========================================================================= */ -#define UVH_RTC						0x340000UL +#define UVH_RTC 0x340000UL  #define UVH_RTC_REAL_TIME_CLOCK_SHFT			0  #define UVH_RTC_REAL_TIME_CLOCK_MASK			0x00ffffffffffffffUL @@ -1873,7 +2554,7 @@ union uvh_rtc_u {  /* ========================================================================= */  /*                           UVH_RTC1_INT_CONFIG                             */  /* ========================================================================= */ -#define UVH_RTC1_INT_CONFIG				0x615c0UL +#define UVH_RTC1_INT_CONFIG 0x615c0UL  #define UVH_RTC1_INT_CONFIG_VECTOR_SHFT			0  #define UVH_RTC1_INT_CONFIG_DM_SHFT			8 @@ -1911,8 +2592,8 @@ union uvh_rtc1_int_config_u {  /* ========================================================================= */  /*                               UVH_SCRATCH5                                */  /* ========================================================================= */ -#define UVH_SCRATCH5					0x2d0200UL -#define UVH_SCRATCH5_32					0x778 +#define UVH_SCRATCH5 0x2d0200UL +#define UVH_SCRATCH5_32 0x778  #define UVH_SCRATCH5_SCRATCH5_SHFT			0  #define UVH_SCRATCH5_SCRATCH5_MASK			0xffffffffffffffffUL @@ -1925,79 +2606,79 @@ union uvh_scratch5_u {  };  /* ========================================================================= */ -/*                           UV2H_EVENT_OCCURRED2                            */ +/*                          UVXH_EVENT_OCCURRED2                             */  /* ========================================================================= */ -#define UV2H_EVENT_OCCURRED2				0x70100UL -#define UV2H_EVENT_OCCURRED2_32				0xb68 +#define UVXH_EVENT_OCCURRED2 0x70100UL +#define UVXH_EVENT_OCCURRED2_32 0xb68 -#define UV2H_EVENT_OCCURRED2_RTC_0_SHFT			0 -#define UV2H_EVENT_OCCURRED2_RTC_1_SHFT			1 -#define UV2H_EVENT_OCCURRED2_RTC_2_SHFT			2 -#define UV2H_EVENT_OCCURRED2_RTC_3_SHFT			3 -#define UV2H_EVENT_OCCURRED2_RTC_4_SHFT			4 -#define UV2H_EVENT_OCCURRED2_RTC_5_SHFT			5 -#define UV2H_EVENT_OCCURRED2_RTC_6_SHFT			6 -#define UV2H_EVENT_OCCURRED2_RTC_7_SHFT			7 -#define UV2H_EVENT_OCCURRED2_RTC_8_SHFT			8 -#define UV2H_EVENT_OCCURRED2_RTC_9_SHFT			9 -#define UV2H_EVENT_OCCURRED2_RTC_10_SHFT		10 -#define UV2H_EVENT_OCCURRED2_RTC_11_SHFT		11 -#define UV2H_EVENT_OCCURRED2_RTC_12_SHFT		12 -#define UV2H_EVENT_OCCURRED2_RTC_13_SHFT		13 -#define UV2H_EVENT_OCCURRED2_RTC_14_SHFT		14 -#define UV2H_EVENT_OCCURRED2_RTC_15_SHFT		15 -#define UV2H_EVENT_OCCURRED2_RTC_16_SHFT		16 -#define UV2H_EVENT_OCCURRED2_RTC_17_SHFT		17 -#define UV2H_EVENT_OCCURRED2_RTC_18_SHFT		18 -#define UV2H_EVENT_OCCURRED2_RTC_19_SHFT		19 -#define UV2H_EVENT_OCCURRED2_RTC_20_SHFT		20 -#define UV2H_EVENT_OCCURRED2_RTC_21_SHFT		21 -#define UV2H_EVENT_OCCURRED2_RTC_22_SHFT		22 -#define UV2H_EVENT_OCCURRED2_RTC_23_SHFT		23 -#define UV2H_EVENT_OCCURRED2_RTC_24_SHFT		24 -#define UV2H_EVENT_OCCURRED2_RTC_25_SHFT		25 -#define UV2H_EVENT_OCCURRED2_RTC_26_SHFT		26 -#define UV2H_EVENT_OCCURRED2_RTC_27_SHFT		27 -#define UV2H_EVENT_OCCURRED2_RTC_28_SHFT		28 -#define UV2H_EVENT_OCCURRED2_RTC_29_SHFT		29 -#define UV2H_EVENT_OCCURRED2_RTC_30_SHFT		30 -#define UV2H_EVENT_OCCURRED2_RTC_31_SHFT		31 -#define UV2H_EVENT_OCCURRED2_RTC_0_MASK			0x0000000000000001UL -#define UV2H_EVENT_OCCURRED2_RTC_1_MASK			0x0000000000000002UL -#define UV2H_EVENT_OCCURRED2_RTC_2_MASK			0x0000000000000004UL -#define UV2H_EVENT_OCCURRED2_RTC_3_MASK			0x0000000000000008UL -#define UV2H_EVENT_OCCURRED2_RTC_4_MASK			0x0000000000000010UL -#define UV2H_EVENT_OCCURRED2_RTC_5_MASK			0x0000000000000020UL -#define UV2H_EVENT_OCCURRED2_RTC_6_MASK			0x0000000000000040UL -#define UV2H_EVENT_OCCURRED2_RTC_7_MASK			0x0000000000000080UL -#define UV2H_EVENT_OCCURRED2_RTC_8_MASK			0x0000000000000100UL -#define UV2H_EVENT_OCCURRED2_RTC_9_MASK			0x0000000000000200UL -#define UV2H_EVENT_OCCURRED2_RTC_10_MASK		0x0000000000000400UL -#define UV2H_EVENT_OCCURRED2_RTC_11_MASK		0x0000000000000800UL -#define UV2H_EVENT_OCCURRED2_RTC_12_MASK		0x0000000000001000UL -#define UV2H_EVENT_OCCURRED2_RTC_13_MASK		0x0000000000002000UL -#define UV2H_EVENT_OCCURRED2_RTC_14_MASK		0x0000000000004000UL -#define UV2H_EVENT_OCCURRED2_RTC_15_MASK		0x0000000000008000UL -#define UV2H_EVENT_OCCURRED2_RTC_16_MASK		0x0000000000010000UL -#define UV2H_EVENT_OCCURRED2_RTC_17_MASK		0x0000000000020000UL -#define UV2H_EVENT_OCCURRED2_RTC_18_MASK		0x0000000000040000UL -#define UV2H_EVENT_OCCURRED2_RTC_19_MASK		0x0000000000080000UL -#define UV2H_EVENT_OCCURRED2_RTC_20_MASK		0x0000000000100000UL -#define UV2H_EVENT_OCCURRED2_RTC_21_MASK		0x0000000000200000UL -#define UV2H_EVENT_OCCURRED2_RTC_22_MASK		0x0000000000400000UL -#define UV2H_EVENT_OCCURRED2_RTC_23_MASK		0x0000000000800000UL -#define UV2H_EVENT_OCCURRED2_RTC_24_MASK		0x0000000001000000UL -#define UV2H_EVENT_OCCURRED2_RTC_25_MASK		0x0000000002000000UL -#define UV2H_EVENT_OCCURRED2_RTC_26_MASK		0x0000000004000000UL -#define UV2H_EVENT_OCCURRED2_RTC_27_MASK		0x0000000008000000UL -#define UV2H_EVENT_OCCURRED2_RTC_28_MASK		0x0000000010000000UL -#define UV2H_EVENT_OCCURRED2_RTC_29_MASK		0x0000000020000000UL -#define UV2H_EVENT_OCCURRED2_RTC_30_MASK		0x0000000040000000UL -#define UV2H_EVENT_OCCURRED2_RTC_31_MASK		0x0000000080000000UL +#define UVXH_EVENT_OCCURRED2_RTC_0_SHFT			0 +#define UVXH_EVENT_OCCURRED2_RTC_1_SHFT			1 +#define UVXH_EVENT_OCCURRED2_RTC_2_SHFT			2 +#define UVXH_EVENT_OCCURRED2_RTC_3_SHFT			3 +#define UVXH_EVENT_OCCURRED2_RTC_4_SHFT			4 +#define UVXH_EVENT_OCCURRED2_RTC_5_SHFT			5 +#define UVXH_EVENT_OCCURRED2_RTC_6_SHFT			6 +#define UVXH_EVENT_OCCURRED2_RTC_7_SHFT			7 +#define UVXH_EVENT_OCCURRED2_RTC_8_SHFT			8 +#define UVXH_EVENT_OCCURRED2_RTC_9_SHFT			9 +#define UVXH_EVENT_OCCURRED2_RTC_10_SHFT		10 +#define UVXH_EVENT_OCCURRED2_RTC_11_SHFT		11 +#define UVXH_EVENT_OCCURRED2_RTC_12_SHFT		12 +#define UVXH_EVENT_OCCURRED2_RTC_13_SHFT		13 +#define UVXH_EVENT_OCCURRED2_RTC_14_SHFT		14 +#define UVXH_EVENT_OCCURRED2_RTC_15_SHFT		15 +#define UVXH_EVENT_OCCURRED2_RTC_16_SHFT		16 +#define UVXH_EVENT_OCCURRED2_RTC_17_SHFT		17 +#define UVXH_EVENT_OCCURRED2_RTC_18_SHFT		18 +#define UVXH_EVENT_OCCURRED2_RTC_19_SHFT		19 +#define UVXH_EVENT_OCCURRED2_RTC_20_SHFT		20 +#define UVXH_EVENT_OCCURRED2_RTC_21_SHFT		21 +#define UVXH_EVENT_OCCURRED2_RTC_22_SHFT		22 +#define UVXH_EVENT_OCCURRED2_RTC_23_SHFT		23 +#define UVXH_EVENT_OCCURRED2_RTC_24_SHFT		24 +#define UVXH_EVENT_OCCURRED2_RTC_25_SHFT		25 +#define UVXH_EVENT_OCCURRED2_RTC_26_SHFT		26 +#define UVXH_EVENT_OCCURRED2_RTC_27_SHFT		27 +#define UVXH_EVENT_OCCURRED2_RTC_28_SHFT		28 +#define UVXH_EVENT_OCCURRED2_RTC_29_SHFT		29 +#define UVXH_EVENT_OCCURRED2_RTC_30_SHFT		30 +#define UVXH_EVENT_OCCURRED2_RTC_31_SHFT		31 +#define UVXH_EVENT_OCCURRED2_RTC_0_MASK			0x0000000000000001UL +#define UVXH_EVENT_OCCURRED2_RTC_1_MASK			0x0000000000000002UL +#define UVXH_EVENT_OCCURRED2_RTC_2_MASK			0x0000000000000004UL +#define UVXH_EVENT_OCCURRED2_RTC_3_MASK			0x0000000000000008UL +#define UVXH_EVENT_OCCURRED2_RTC_4_MASK			0x0000000000000010UL +#define UVXH_EVENT_OCCURRED2_RTC_5_MASK			0x0000000000000020UL +#define UVXH_EVENT_OCCURRED2_RTC_6_MASK			0x0000000000000040UL +#define UVXH_EVENT_OCCURRED2_RTC_7_MASK			0x0000000000000080UL +#define UVXH_EVENT_OCCURRED2_RTC_8_MASK			0x0000000000000100UL +#define UVXH_EVENT_OCCURRED2_RTC_9_MASK			0x0000000000000200UL +#define UVXH_EVENT_OCCURRED2_RTC_10_MASK		0x0000000000000400UL +#define UVXH_EVENT_OCCURRED2_RTC_11_MASK		0x0000000000000800UL +#define UVXH_EVENT_OCCURRED2_RTC_12_MASK		0x0000000000001000UL +#define UVXH_EVENT_OCCURRED2_RTC_13_MASK		0x0000000000002000UL +#define UVXH_EVENT_OCCURRED2_RTC_14_MASK		0x0000000000004000UL +#define UVXH_EVENT_OCCURRED2_RTC_15_MASK		0x0000000000008000UL +#define UVXH_EVENT_OCCURRED2_RTC_16_MASK		0x0000000000010000UL +#define UVXH_EVENT_OCCURRED2_RTC_17_MASK		0x0000000000020000UL +#define UVXH_EVENT_OCCURRED2_RTC_18_MASK		0x0000000000040000UL +#define UVXH_EVENT_OCCURRED2_RTC_19_MASK		0x0000000000080000UL +#define UVXH_EVENT_OCCURRED2_RTC_20_MASK		0x0000000000100000UL +#define UVXH_EVENT_OCCURRED2_RTC_21_MASK		0x0000000000200000UL +#define UVXH_EVENT_OCCURRED2_RTC_22_MASK		0x0000000000400000UL +#define UVXH_EVENT_OCCURRED2_RTC_23_MASK		0x0000000000800000UL +#define UVXH_EVENT_OCCURRED2_RTC_24_MASK		0x0000000001000000UL +#define UVXH_EVENT_OCCURRED2_RTC_25_MASK		0x0000000002000000UL +#define UVXH_EVENT_OCCURRED2_RTC_26_MASK		0x0000000004000000UL +#define UVXH_EVENT_OCCURRED2_RTC_27_MASK		0x0000000008000000UL +#define UVXH_EVENT_OCCURRED2_RTC_28_MASK		0x0000000010000000UL +#define UVXH_EVENT_OCCURRED2_RTC_29_MASK		0x0000000020000000UL +#define UVXH_EVENT_OCCURRED2_RTC_30_MASK		0x0000000040000000UL +#define UVXH_EVENT_OCCURRED2_RTC_31_MASK		0x0000000080000000UL -union uv2h_event_occurred2_u { +union uvxh_event_occurred2_u {  	unsigned long	v; -	struct uv2h_event_occurred2_s { +	struct uvxh_event_occurred2_s {  		unsigned long	rtc_0:1;			/* RW */  		unsigned long	rtc_1:1;			/* RW */  		unsigned long	rtc_2:1;			/* RW */ @@ -2031,29 +2712,46 @@ union uv2h_event_occurred2_u {  		unsigned long	rtc_30:1;			/* RW */  		unsigned long	rtc_31:1;			/* RW */  		unsigned long	rsvd_32_63:32; -	} s1; +	} sx;  };  /* ========================================================================= */ -/*                        UV2H_EVENT_OCCURRED2_ALIAS                         */ +/*                       UVXH_EVENT_OCCURRED2_ALIAS                          */  /* ========================================================================= */ -#define UV2H_EVENT_OCCURRED2_ALIAS			0x70108UL -#define UV2H_EVENT_OCCURRED2_ALIAS_32			0xb70 +#define UVXH_EVENT_OCCURRED2_ALIAS 0x70108UL +#define UVXH_EVENT_OCCURRED2_ALIAS_32 0xb70 +  /* ========================================================================= */ -/*                    UV2H_LB_BAU_SB_ACTIVATION_STATUS_2                     */ +/*                   UVXH_LB_BAU_SB_ACTIVATION_STATUS_2                      */  /* ========================================================================= */ -#define UV2H_LB_BAU_SB_ACTIVATION_STATUS_2		0x320130UL -#define UV2H_LB_BAU_SB_ACTIVATION_STATUS_2_32		0x9f0 +#define UVXH_LB_BAU_SB_ACTIVATION_STATUS_2 0x320130UL +#define UV2H_LB_BAU_SB_ACTIVATION_STATUS_2 0x320130UL +#define UV3H_LB_BAU_SB_ACTIVATION_STATUS_2 0x320130UL +#define UVXH_LB_BAU_SB_ACTIVATION_STATUS_2_32 0x9f0 +#define UV2H_LB_BAU_SB_ACTIVATION_STATUS_2_32 0x320130UL +#define UV3H_LB_BAU_SB_ACTIVATION_STATUS_2_32 0x320130UL + +#define UVXH_LB_BAU_SB_ACTIVATION_STATUS_2_AUX_ERROR_SHFT 0 +#define UVXH_LB_BAU_SB_ACTIVATION_STATUS_2_AUX_ERROR_MASK 0xffffffffffffffffUL  #define UV2H_LB_BAU_SB_ACTIVATION_STATUS_2_AUX_ERROR_SHFT 0  #define UV2H_LB_BAU_SB_ACTIVATION_STATUS_2_AUX_ERROR_MASK 0xffffffffffffffffUL -union uv2h_lb_bau_sb_activation_status_2_u { +#define UV3H_LB_BAU_SB_ACTIVATION_STATUS_2_AUX_ERROR_SHFT 0 +#define UV3H_LB_BAU_SB_ACTIVATION_STATUS_2_AUX_ERROR_MASK 0xffffffffffffffffUL + +union uvxh_lb_bau_sb_activation_status_2_u {  	unsigned long	v; +	struct uvxh_lb_bau_sb_activation_status_2_s { +		unsigned long	aux_error:64;			/* RW */ +	} sx;  	struct uv2h_lb_bau_sb_activation_status_2_s {  		unsigned long	aux_error:64;			/* RW */ -	} s1; +	} s2; +	struct uv3h_lb_bau_sb_activation_status_2_s { +		unsigned long	aux_error:64;			/* RW */ +	} s3;  };  /* ========================================================================= */ @@ -2073,5 +2771,87 @@ union uv1h_lb_target_physical_apic_id_mask_u {  	} s1;  }; +/* ========================================================================= */ +/*                   UV3H_RH_GAM_MMIOH_OVERLAY_CONFIG0_MMR                   */ +/* ========================================================================= */ +#define UV3H_RH_GAM_MMIOH_OVERLAY_CONFIG0_MMR		0x1603000UL + +#define UV3H_RH_GAM_MMIOH_OVERLAY_CONFIG0_MMR_BASE_SHFT	26 +#define UV3H_RH_GAM_MMIOH_OVERLAY_CONFIG0_MMR_M_IO_SHFT	46 +#define UV3H_RH_GAM_MMIOH_OVERLAY_CONFIG0_MMR_ENABLE_SHFT 63 +#define UV3H_RH_GAM_MMIOH_OVERLAY_CONFIG0_MMR_BASE_MASK	0x00003ffffc000000UL +#define UV3H_RH_GAM_MMIOH_OVERLAY_CONFIG0_MMR_M_IO_MASK	0x000fc00000000000UL +#define UV3H_RH_GAM_MMIOH_OVERLAY_CONFIG0_MMR_ENABLE_MASK 0x8000000000000000UL + +union uv3h_rh_gam_mmioh_overlay_config0_mmr_u { +	unsigned long	v; +	struct uv3h_rh_gam_mmioh_overlay_config0_mmr_s { +		unsigned long	rsvd_0_25:26; +		unsigned long	base:20;			/* RW */ +		unsigned long	m_io:6;				/* RW */ +		unsigned long	n_io:4; +		unsigned long	rsvd_56_62:7; +		unsigned long	enable:1;			/* RW */ +	} s3; +}; + +/* ========================================================================= */ +/*                   UV3H_RH_GAM_MMIOH_OVERLAY_CONFIG1_MMR                   */ +/* ========================================================================= */ +#define UV3H_RH_GAM_MMIOH_OVERLAY_CONFIG1_MMR		0x1604000UL + +#define UV3H_RH_GAM_MMIOH_OVERLAY_CONFIG1_MMR_BASE_SHFT	26 +#define UV3H_RH_GAM_MMIOH_OVERLAY_CONFIG1_MMR_M_IO_SHFT	46 +#define UV3H_RH_GAM_MMIOH_OVERLAY_CONFIG1_MMR_ENABLE_SHFT 63 +#define UV3H_RH_GAM_MMIOH_OVERLAY_CONFIG1_MMR_BASE_MASK	0x00003ffffc000000UL +#define UV3H_RH_GAM_MMIOH_OVERLAY_CONFIG1_MMR_M_IO_MASK	0x000fc00000000000UL +#define UV3H_RH_GAM_MMIOH_OVERLAY_CONFIG1_MMR_ENABLE_MASK 0x8000000000000000UL + +union uv3h_rh_gam_mmioh_overlay_config1_mmr_u { +	unsigned long	v; +	struct uv3h_rh_gam_mmioh_overlay_config1_mmr_s { +		unsigned long	rsvd_0_25:26; +		unsigned long	base:20;			/* RW */ +		unsigned long	m_io:6;				/* RW */ +		unsigned long	n_io:4; +		unsigned long	rsvd_56_62:7; +		unsigned long	enable:1;			/* RW */ +	} s3; +}; + +/* ========================================================================= */ +/*                  UV3H_RH_GAM_MMIOH_REDIRECT_CONFIG0_MMR                   */ +/* ========================================================================= */ +#define UV3H_RH_GAM_MMIOH_REDIRECT_CONFIG0_MMR		0x1603800UL +#define UV3H_RH_GAM_MMIOH_REDIRECT_CONFIG0_MMR_DEPTH	128 + +#define UV3H_RH_GAM_MMIOH_REDIRECT_CONFIG0_MMR_NASID_SHFT 0 +#define UV3H_RH_GAM_MMIOH_REDIRECT_CONFIG0_MMR_NASID_MASK 0x0000000000007fffUL + +union uv3h_rh_gam_mmioh_redirect_config0_mmr_u { +	unsigned long	v; +	struct uv3h_rh_gam_mmioh_redirect_config0_mmr_s { +		unsigned long	nasid:15;			/* RW */ +		unsigned long	rsvd_15_63:49; +	} s3; +}; + +/* ========================================================================= */ +/*                  UV3H_RH_GAM_MMIOH_REDIRECT_CONFIG1_MMR                   */ +/* ========================================================================= */ +#define UV3H_RH_GAM_MMIOH_REDIRECT_CONFIG1_MMR		0x1604800UL +#define UV3H_RH_GAM_MMIOH_REDIRECT_CONFIG1_MMR_DEPTH	128 + +#define UV3H_RH_GAM_MMIOH_REDIRECT_CONFIG1_MMR_NASID_SHFT 0 +#define UV3H_RH_GAM_MMIOH_REDIRECT_CONFIG1_MMR_NASID_MASK 0x0000000000007fffUL + +union uv3h_rh_gam_mmioh_redirect_config1_mmr_u { +	unsigned long	v; +	struct uv3h_rh_gam_mmioh_redirect_config1_mmr_s { +		unsigned long	nasid:15;			/* RW */ +		unsigned long	rsvd_15_63:49; +	} s3; +}; +  #endif /* _ASM_X86_UV_UV_MMRS_H */ diff --git a/arch/x86/include/asm/x86_init.h b/arch/x86/include/asm/x86_init.h index 57693498519..7669941cc9d 100644 --- a/arch/x86/include/asm/x86_init.h +++ b/arch/x86/include/asm/x86_init.h @@ -181,19 +181,38 @@ struct x86_platform_ops {  };  struct pci_dev; +struct msi_msg;  struct x86_msi_ops {  	int (*setup_msi_irqs)(struct pci_dev *dev, int nvec, int type); +	void (*compose_msi_msg)(struct pci_dev *dev, unsigned int irq, +				unsigned int dest, struct msi_msg *msg, +			       u8 hpet_id);  	void (*teardown_msi_irq)(unsigned int irq);  	void (*teardown_msi_irqs)(struct pci_dev *dev);  	void (*restore_msi_irqs)(struct pci_dev *dev, int irq); +	int  (*setup_hpet_msi)(unsigned int irq, unsigned int id);  }; +struct IO_APIC_route_entry; +struct io_apic_irq_attr; +struct irq_data; +struct cpumask; +  struct x86_io_apic_ops { -	void		(*init)  (void); -	unsigned int	(*read)  (unsigned int apic, unsigned int reg); -	void		(*write) (unsigned int apic, unsigned int reg, unsigned int value); -	void		(*modify)(unsigned int apic, unsigned int reg, unsigned int value); +	void		(*init)   (void); +	unsigned int	(*read)   (unsigned int apic, unsigned int reg); +	void		(*write)  (unsigned int apic, unsigned int reg, unsigned int value); +	void		(*modify) (unsigned int apic, unsigned int reg, unsigned int value); +	void		(*disable)(void); +	void		(*print_entries)(unsigned int apic, unsigned int nr_entries); +	int		(*set_affinity)(struct irq_data *data, +					const struct cpumask *mask, +					bool force); +	int		(*setup_entry)(int irq, struct IO_APIC_route_entry *entry, +				       unsigned int destination, int vector, +				       struct io_apic_irq_attr *attr); +	void		(*eoi_ioapic_pin)(int apic, int pin, int vector);  };  extern struct x86_init_ops x86_init; diff --git a/arch/x86/include/asm/xor.h b/arch/x86/include/asm/xor.h index f8fde90bc45..d8829751b3f 100644 --- a/arch/x86/include/asm/xor.h +++ b/arch/x86/include/asm/xor.h @@ -1,10 +1,499 @@  #ifdef CONFIG_KMEMCHECK  /* kmemcheck doesn't handle MMX/SSE/SSE2 instructions */  # include <asm-generic/xor.h> +#elif !defined(_ASM_X86_XOR_H) +#define _ASM_X86_XOR_H + +/* + * Optimized RAID-5 checksumming functions for SSE. + * + * 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, or (at your option) + * any later version. + * + * You should have received a copy of the GNU General Public License + * (for example /usr/src/linux/COPYING); if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +/* + * Cache avoiding checksumming functions utilizing KNI instructions + * Copyright (C) 1999 Zach Brown (with obvious credit due Ingo) + */ + +/* + * Based on + * High-speed RAID5 checksumming functions utilizing SSE instructions. + * Copyright (C) 1998 Ingo Molnar. + */ + +/* + * x86-64 changes / gcc fixes from Andi Kleen. + * Copyright 2002 Andi Kleen, SuSE Labs. + * + * This hasn't been optimized for the hammer yet, but there are likely + * no advantages to be gotten from x86-64 here anyways. + */ + +#include <asm/i387.h> + +#ifdef CONFIG_X86_32 +/* reduce register pressure */ +# define XOR_CONSTANT_CONSTRAINT "i"  #else +# define XOR_CONSTANT_CONSTRAINT "re" +#endif + +#define OFFS(x)		"16*("#x")" +#define PF_OFFS(x)	"256+16*("#x")" +#define PF0(x)		"	prefetchnta "PF_OFFS(x)"(%[p1])		;\n" +#define LD(x, y)	"	movaps "OFFS(x)"(%[p1]), %%xmm"#y"	;\n" +#define ST(x, y)	"	movaps %%xmm"#y", "OFFS(x)"(%[p1])	;\n" +#define PF1(x)		"	prefetchnta "PF_OFFS(x)"(%[p2])		;\n" +#define PF2(x)		"	prefetchnta "PF_OFFS(x)"(%[p3])		;\n" +#define PF3(x)		"	prefetchnta "PF_OFFS(x)"(%[p4])		;\n" +#define PF4(x)		"	prefetchnta "PF_OFFS(x)"(%[p5])		;\n" +#define XO1(x, y)	"	xorps "OFFS(x)"(%[p2]), %%xmm"#y"	;\n" +#define XO2(x, y)	"	xorps "OFFS(x)"(%[p3]), %%xmm"#y"	;\n" +#define XO3(x, y)	"	xorps "OFFS(x)"(%[p4]), %%xmm"#y"	;\n" +#define XO4(x, y)	"	xorps "OFFS(x)"(%[p5]), %%xmm"#y"	;\n" +#define NOP(x) + +#define BLK64(pf, op, i)				\ +		pf(i)					\ +		op(i, 0)				\ +			op(i + 1, 1)			\ +				op(i + 2, 2)		\ +					op(i + 3, 3) + +static void +xor_sse_2(unsigned long bytes, unsigned long *p1, unsigned long *p2) +{ +	unsigned long lines = bytes >> 8; + +	kernel_fpu_begin(); + +	asm volatile( +#undef BLOCK +#define BLOCK(i)					\ +		LD(i, 0)				\ +			LD(i + 1, 1)			\ +		PF1(i)					\ +				PF1(i + 2)		\ +				LD(i + 2, 2)		\ +					LD(i + 3, 3)	\ +		PF0(i + 4)				\ +				PF0(i + 6)		\ +		XO1(i, 0)				\ +			XO1(i + 1, 1)			\ +				XO1(i + 2, 2)		\ +					XO1(i + 3, 3)	\ +		ST(i, 0)				\ +			ST(i + 1, 1)			\ +				ST(i + 2, 2)		\ +					ST(i + 3, 3)	\ + + +		PF0(0) +				PF0(2) + +	" .align 32			;\n" +	" 1:                            ;\n" + +		BLOCK(0) +		BLOCK(4) +		BLOCK(8) +		BLOCK(12) + +	"       add %[inc], %[p1]       ;\n" +	"       add %[inc], %[p2]       ;\n" +	"       dec %[cnt]              ;\n" +	"       jnz 1b                  ;\n" +	: [cnt] "+r" (lines), +	  [p1] "+r" (p1), [p2] "+r" (p2) +	: [inc] XOR_CONSTANT_CONSTRAINT (256UL) +	: "memory"); + +	kernel_fpu_end(); +} + +static void +xor_sse_2_pf64(unsigned long bytes, unsigned long *p1, unsigned long *p2) +{ +	unsigned long lines = bytes >> 8; + +	kernel_fpu_begin(); + +	asm volatile( +#undef BLOCK +#define BLOCK(i)			\ +		BLK64(PF0, LD, i)	\ +		BLK64(PF1, XO1, i)	\ +		BLK64(NOP, ST, i)	\ + +	" .align 32			;\n" +	" 1:                            ;\n" + +		BLOCK(0) +		BLOCK(4) +		BLOCK(8) +		BLOCK(12) + +	"       add %[inc], %[p1]       ;\n" +	"       add %[inc], %[p2]       ;\n" +	"       dec %[cnt]              ;\n" +	"       jnz 1b                  ;\n" +	: [cnt] "+r" (lines), +	  [p1] "+r" (p1), [p2] "+r" (p2) +	: [inc] XOR_CONSTANT_CONSTRAINT (256UL) +	: "memory"); + +	kernel_fpu_end(); +} + +static void +xor_sse_3(unsigned long bytes, unsigned long *p1, unsigned long *p2, +	  unsigned long *p3) +{ +	unsigned long lines = bytes >> 8; + +	kernel_fpu_begin(); + +	asm volatile( +#undef BLOCK +#define BLOCK(i) \ +		PF1(i)					\ +				PF1(i + 2)		\ +		LD(i, 0)				\ +			LD(i + 1, 1)			\ +				LD(i + 2, 2)		\ +					LD(i + 3, 3)	\ +		PF2(i)					\ +				PF2(i + 2)		\ +		PF0(i + 4)				\ +				PF0(i + 6)		\ +		XO1(i, 0)				\ +			XO1(i + 1, 1)			\ +				XO1(i + 2, 2)		\ +					XO1(i + 3, 3)	\ +		XO2(i, 0)				\ +			XO2(i + 1, 1)			\ +				XO2(i + 2, 2)		\ +					XO2(i + 3, 3)	\ +		ST(i, 0)				\ +			ST(i + 1, 1)			\ +				ST(i + 2, 2)		\ +					ST(i + 3, 3)	\ + + +		PF0(0) +				PF0(2) + +	" .align 32			;\n" +	" 1:                            ;\n" + +		BLOCK(0) +		BLOCK(4) +		BLOCK(8) +		BLOCK(12) + +	"       add %[inc], %[p1]       ;\n" +	"       add %[inc], %[p2]       ;\n" +	"       add %[inc], %[p3]       ;\n" +	"       dec %[cnt]              ;\n" +	"       jnz 1b                  ;\n" +	: [cnt] "+r" (lines), +	  [p1] "+r" (p1), [p2] "+r" (p2), [p3] "+r" (p3) +	: [inc] XOR_CONSTANT_CONSTRAINT (256UL) +	: "memory"); + +	kernel_fpu_end(); +} + +static void +xor_sse_3_pf64(unsigned long bytes, unsigned long *p1, unsigned long *p2, +	       unsigned long *p3) +{ +	unsigned long lines = bytes >> 8; + +	kernel_fpu_begin(); + +	asm volatile( +#undef BLOCK +#define BLOCK(i)			\ +		BLK64(PF0, LD, i)	\ +		BLK64(PF1, XO1, i)	\ +		BLK64(PF2, XO2, i)	\ +		BLK64(NOP, ST, i)	\ + +	" .align 32			;\n" +	" 1:                            ;\n" + +		BLOCK(0) +		BLOCK(4) +		BLOCK(8) +		BLOCK(12) + +	"       add %[inc], %[p1]       ;\n" +	"       add %[inc], %[p2]       ;\n" +	"       add %[inc], %[p3]       ;\n" +	"       dec %[cnt]              ;\n" +	"       jnz 1b                  ;\n" +	: [cnt] "+r" (lines), +	  [p1] "+r" (p1), [p2] "+r" (p2), [p3] "+r" (p3) +	: [inc] XOR_CONSTANT_CONSTRAINT (256UL) +	: "memory"); + +	kernel_fpu_end(); +} + +static void +xor_sse_4(unsigned long bytes, unsigned long *p1, unsigned long *p2, +	  unsigned long *p3, unsigned long *p4) +{ +	unsigned long lines = bytes >> 8; + +	kernel_fpu_begin(); + +	asm volatile( +#undef BLOCK +#define BLOCK(i) \ +		PF1(i)					\ +				PF1(i + 2)		\ +		LD(i, 0)				\ +			LD(i + 1, 1)			\ +				LD(i + 2, 2)		\ +					LD(i + 3, 3)	\ +		PF2(i)					\ +				PF2(i + 2)		\ +		XO1(i, 0)				\ +			XO1(i + 1, 1)			\ +				XO1(i + 2, 2)		\ +					XO1(i + 3, 3)	\ +		PF3(i)					\ +				PF3(i + 2)		\ +		PF0(i + 4)				\ +				PF0(i + 6)		\ +		XO2(i, 0)				\ +			XO2(i + 1, 1)			\ +				XO2(i + 2, 2)		\ +					XO2(i + 3, 3)	\ +		XO3(i, 0)				\ +			XO3(i + 1, 1)			\ +				XO3(i + 2, 2)		\ +					XO3(i + 3, 3)	\ +		ST(i, 0)				\ +			ST(i + 1, 1)			\ +				ST(i + 2, 2)		\ +					ST(i + 3, 3)	\ + + +		PF0(0) +				PF0(2) + +	" .align 32			;\n" +	" 1:                            ;\n" + +		BLOCK(0) +		BLOCK(4) +		BLOCK(8) +		BLOCK(12) + +	"       add %[inc], %[p1]       ;\n" +	"       add %[inc], %[p2]       ;\n" +	"       add %[inc], %[p3]       ;\n" +	"       add %[inc], %[p4]       ;\n" +	"       dec %[cnt]              ;\n" +	"       jnz 1b                  ;\n" +	: [cnt] "+r" (lines), [p1] "+r" (p1), +	  [p2] "+r" (p2), [p3] "+r" (p3), [p4] "+r" (p4) +	: [inc] XOR_CONSTANT_CONSTRAINT (256UL) +	: "memory"); + +	kernel_fpu_end(); +} + +static void +xor_sse_4_pf64(unsigned long bytes, unsigned long *p1, unsigned long *p2, +	       unsigned long *p3, unsigned long *p4) +{ +	unsigned long lines = bytes >> 8; + +	kernel_fpu_begin(); + +	asm volatile( +#undef BLOCK +#define BLOCK(i)			\ +		BLK64(PF0, LD, i)	\ +		BLK64(PF1, XO1, i)	\ +		BLK64(PF2, XO2, i)	\ +		BLK64(PF3, XO3, i)	\ +		BLK64(NOP, ST, i)	\ + +	" .align 32			;\n" +	" 1:                            ;\n" + +		BLOCK(0) +		BLOCK(4) +		BLOCK(8) +		BLOCK(12) + +	"       add %[inc], %[p1]       ;\n" +	"       add %[inc], %[p2]       ;\n" +	"       add %[inc], %[p3]       ;\n" +	"       add %[inc], %[p4]       ;\n" +	"       dec %[cnt]              ;\n" +	"       jnz 1b                  ;\n" +	: [cnt] "+r" (lines), [p1] "+r" (p1), +	  [p2] "+r" (p2), [p3] "+r" (p3), [p4] "+r" (p4) +	: [inc] XOR_CONSTANT_CONSTRAINT (256UL) +	: "memory"); + +	kernel_fpu_end(); +} + +static void +xor_sse_5(unsigned long bytes, unsigned long *p1, unsigned long *p2, +	  unsigned long *p3, unsigned long *p4, unsigned long *p5) +{ +	unsigned long lines = bytes >> 8; + +	kernel_fpu_begin(); + +	asm volatile( +#undef BLOCK +#define BLOCK(i) \ +		PF1(i)					\ +				PF1(i + 2)		\ +		LD(i, 0)				\ +			LD(i + 1, 1)			\ +				LD(i + 2, 2)		\ +					LD(i + 3, 3)	\ +		PF2(i)					\ +				PF2(i + 2)		\ +		XO1(i, 0)				\ +			XO1(i + 1, 1)			\ +				XO1(i + 2, 2)		\ +					XO1(i + 3, 3)	\ +		PF3(i)					\ +				PF3(i + 2)		\ +		XO2(i, 0)				\ +			XO2(i + 1, 1)			\ +				XO2(i + 2, 2)		\ +					XO2(i + 3, 3)	\ +		PF4(i)					\ +				PF4(i + 2)		\ +		PF0(i + 4)				\ +				PF0(i + 6)		\ +		XO3(i, 0)				\ +			XO3(i + 1, 1)			\ +				XO3(i + 2, 2)		\ +					XO3(i + 3, 3)	\ +		XO4(i, 0)				\ +			XO4(i + 1, 1)			\ +				XO4(i + 2, 2)		\ +					XO4(i + 3, 3)	\ +		ST(i, 0)				\ +			ST(i + 1, 1)			\ +				ST(i + 2, 2)		\ +					ST(i + 3, 3)	\ + + +		PF0(0) +				PF0(2) + +	" .align 32			;\n" +	" 1:                            ;\n" + +		BLOCK(0) +		BLOCK(4) +		BLOCK(8) +		BLOCK(12) + +	"       add %[inc], %[p1]       ;\n" +	"       add %[inc], %[p2]       ;\n" +	"       add %[inc], %[p3]       ;\n" +	"       add %[inc], %[p4]       ;\n" +	"       add %[inc], %[p5]       ;\n" +	"       dec %[cnt]              ;\n" +	"       jnz 1b                  ;\n" +	: [cnt] "+r" (lines), [p1] "+r" (p1), [p2] "+r" (p2), +	  [p3] "+r" (p3), [p4] "+r" (p4), [p5] "+r" (p5) +	: [inc] XOR_CONSTANT_CONSTRAINT (256UL) +	: "memory"); + +	kernel_fpu_end(); +} + +static void +xor_sse_5_pf64(unsigned long bytes, unsigned long *p1, unsigned long *p2, +	       unsigned long *p3, unsigned long *p4, unsigned long *p5) +{ +	unsigned long lines = bytes >> 8; + +	kernel_fpu_begin(); + +	asm volatile( +#undef BLOCK +#define BLOCK(i)			\ +		BLK64(PF0, LD, i)	\ +		BLK64(PF1, XO1, i)	\ +		BLK64(PF2, XO2, i)	\ +		BLK64(PF3, XO3, i)	\ +		BLK64(PF4, XO4, i)	\ +		BLK64(NOP, ST, i)	\ + +	" .align 32			;\n" +	" 1:                            ;\n" + +		BLOCK(0) +		BLOCK(4) +		BLOCK(8) +		BLOCK(12) + +	"       add %[inc], %[p1]       ;\n" +	"       add %[inc], %[p2]       ;\n" +	"       add %[inc], %[p3]       ;\n" +	"       add %[inc], %[p4]       ;\n" +	"       add %[inc], %[p5]       ;\n" +	"       dec %[cnt]              ;\n" +	"       jnz 1b                  ;\n" +	: [cnt] "+r" (lines), [p1] "+r" (p1), [p2] "+r" (p2), +	  [p3] "+r" (p3), [p4] "+r" (p4), [p5] "+r" (p5) +	: [inc] XOR_CONSTANT_CONSTRAINT (256UL) +	: "memory"); + +	kernel_fpu_end(); +} + +static struct xor_block_template xor_block_sse_pf64 = { +	.name = "prefetch64-sse", +	.do_2 = xor_sse_2_pf64, +	.do_3 = xor_sse_3_pf64, +	.do_4 = xor_sse_4_pf64, +	.do_5 = xor_sse_5_pf64, +}; + +#undef LD +#undef XO1 +#undef XO2 +#undef XO3 +#undef XO4 +#undef ST +#undef NOP +#undef BLK64 +#undef BLOCK + +#undef XOR_CONSTANT_CONSTRAINT +  #ifdef CONFIG_X86_32  # include <asm/xor_32.h>  #else  # include <asm/xor_64.h>  #endif -#endif + +#define XOR_SELECT_TEMPLATE(FASTEST) \ +	AVX_SELECT(FASTEST) + +#endif /* _ASM_X86_XOR_H */ diff --git a/arch/x86/include/asm/xor_32.h b/arch/x86/include/asm/xor_32.h index f79cb7ec0e0..ce05722e3c6 100644 --- a/arch/x86/include/asm/xor_32.h +++ b/arch/x86/include/asm/xor_32.h @@ -2,7 +2,7 @@  #define _ASM_X86_XOR_32_H  /* - * Optimized RAID-5 checksumming functions for MMX and SSE. + * Optimized RAID-5 checksumming functions for MMX.   *   * 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 @@ -529,290 +529,6 @@ static struct xor_block_template xor_block_p5_mmx = {  	.do_5 = xor_p5_mmx_5,  }; -/* - * Cache avoiding checksumming functions utilizing KNI instructions - * Copyright (C) 1999 Zach Brown (with obvious credit due Ingo) - */ - -#define OFFS(x)		"16*("#x")" -#define PF_OFFS(x)	"256+16*("#x")" -#define	PF0(x)		"	prefetchnta "PF_OFFS(x)"(%1)		;\n" -#define LD(x, y)	"       movaps   "OFFS(x)"(%1), %%xmm"#y"	;\n" -#define ST(x, y)	"       movaps %%xmm"#y",   "OFFS(x)"(%1)	;\n" -#define PF1(x)		"	prefetchnta "PF_OFFS(x)"(%2)		;\n" -#define PF2(x)		"	prefetchnta "PF_OFFS(x)"(%3)		;\n" -#define PF3(x)		"	prefetchnta "PF_OFFS(x)"(%4)		;\n" -#define PF4(x)		"	prefetchnta "PF_OFFS(x)"(%5)		;\n" -#define PF5(x)		"	prefetchnta "PF_OFFS(x)"(%6)		;\n" -#define XO1(x, y)	"       xorps   "OFFS(x)"(%2), %%xmm"#y"	;\n" -#define XO2(x, y)	"       xorps   "OFFS(x)"(%3), %%xmm"#y"	;\n" -#define XO3(x, y)	"       xorps   "OFFS(x)"(%4), %%xmm"#y"	;\n" -#define XO4(x, y)	"       xorps   "OFFS(x)"(%5), %%xmm"#y"	;\n" -#define XO5(x, y)	"       xorps   "OFFS(x)"(%6), %%xmm"#y"	;\n" - - -static void -xor_sse_2(unsigned long bytes, unsigned long *p1, unsigned long *p2) -{ -	unsigned long lines = bytes >> 8; - -	kernel_fpu_begin(); - -	asm volatile( -#undef BLOCK -#define BLOCK(i)					\ -		LD(i, 0)				\ -			LD(i + 1, 1)			\ -		PF1(i)					\ -				PF1(i + 2)		\ -				LD(i + 2, 2)		\ -					LD(i + 3, 3)	\ -		PF0(i + 4)				\ -				PF0(i + 6)		\ -		XO1(i, 0)				\ -			XO1(i + 1, 1)			\ -				XO1(i + 2, 2)		\ -					XO1(i + 3, 3)	\ -		ST(i, 0)				\ -			ST(i + 1, 1)			\ -				ST(i + 2, 2)		\ -					ST(i + 3, 3)	\ - - -		PF0(0) -				PF0(2) - -	" .align 32			;\n" -	" 1:                            ;\n" - -		BLOCK(0) -		BLOCK(4) -		BLOCK(8) -		BLOCK(12) - -	"       addl $256, %1           ;\n" -	"       addl $256, %2           ;\n" -	"       decl %0                 ;\n" -	"       jnz 1b                  ;\n" -	: "+r" (lines), -	  "+r" (p1), "+r" (p2) -	: -	: "memory"); - -	kernel_fpu_end(); -} - -static void -xor_sse_3(unsigned long bytes, unsigned long *p1, unsigned long *p2, -	  unsigned long *p3) -{ -	unsigned long lines = bytes >> 8; - -	kernel_fpu_begin(); - -	asm volatile( -#undef BLOCK -#define BLOCK(i) \ -		PF1(i)					\ -				PF1(i + 2)		\ -		LD(i,0)					\ -			LD(i + 1, 1)			\ -				LD(i + 2, 2)		\ -					LD(i + 3, 3)	\ -		PF2(i)					\ -				PF2(i + 2)		\ -		PF0(i + 4)				\ -				PF0(i + 6)		\ -		XO1(i,0)				\ -			XO1(i + 1, 1)			\ -				XO1(i + 2, 2)		\ -					XO1(i + 3, 3)	\ -		XO2(i,0)				\ -			XO2(i + 1, 1)			\ -				XO2(i + 2, 2)		\ -					XO2(i + 3, 3)	\ -		ST(i,0)					\ -			ST(i + 1, 1)			\ -				ST(i + 2, 2)		\ -					ST(i + 3, 3)	\ - - -		PF0(0) -				PF0(2) - -	" .align 32			;\n" -	" 1:                            ;\n" - -		BLOCK(0) -		BLOCK(4) -		BLOCK(8) -		BLOCK(12) - -	"       addl $256, %1           ;\n" -	"       addl $256, %2           ;\n" -	"       addl $256, %3           ;\n" -	"       decl %0                 ;\n" -	"       jnz 1b                  ;\n" -	: "+r" (lines), -	  "+r" (p1), "+r"(p2), "+r"(p3) -	: -	: "memory" ); - -	kernel_fpu_end(); -} - -static void -xor_sse_4(unsigned long bytes, unsigned long *p1, unsigned long *p2, -	  unsigned long *p3, unsigned long *p4) -{ -	unsigned long lines = bytes >> 8; - -	kernel_fpu_begin(); - -	asm volatile( -#undef BLOCK -#define BLOCK(i) \ -		PF1(i)					\ -				PF1(i + 2)		\ -		LD(i,0)					\ -			LD(i + 1, 1)			\ -				LD(i + 2, 2)		\ -					LD(i + 3, 3)	\ -		PF2(i)					\ -				PF2(i + 2)		\ -		XO1(i,0)				\ -			XO1(i + 1, 1)			\ -				XO1(i + 2, 2)		\ -					XO1(i + 3, 3)	\ -		PF3(i)					\ -				PF3(i + 2)		\ -		PF0(i + 4)				\ -				PF0(i + 6)		\ -		XO2(i,0)				\ -			XO2(i + 1, 1)			\ -				XO2(i + 2, 2)		\ -					XO2(i + 3, 3)	\ -		XO3(i,0)				\ -			XO3(i + 1, 1)			\ -				XO3(i + 2, 2)		\ -					XO3(i + 3, 3)	\ -		ST(i,0)					\ -			ST(i + 1, 1)			\ -				ST(i + 2, 2)		\ -					ST(i + 3, 3)	\ - - -		PF0(0) -				PF0(2) - -	" .align 32			;\n" -	" 1:                            ;\n" - -		BLOCK(0) -		BLOCK(4) -		BLOCK(8) -		BLOCK(12) - -	"       addl $256, %1           ;\n" -	"       addl $256, %2           ;\n" -	"       addl $256, %3           ;\n" -	"       addl $256, %4           ;\n" -	"       decl %0                 ;\n" -	"       jnz 1b                  ;\n" -	: "+r" (lines), -	  "+r" (p1), "+r" (p2), "+r" (p3), "+r" (p4) -	: -	: "memory" ); - -	kernel_fpu_end(); -} - -static void -xor_sse_5(unsigned long bytes, unsigned long *p1, unsigned long *p2, -	  unsigned long *p3, unsigned long *p4, unsigned long *p5) -{ -	unsigned long lines = bytes >> 8; - -	kernel_fpu_begin(); - -	/* Make sure GCC forgets anything it knows about p4 or p5, -	   such that it won't pass to the asm volatile below a -	   register that is shared with any other variable.  That's -	   because we modify p4 and p5 there, but we can't mark them -	   as read/write, otherwise we'd overflow the 10-asm-operands -	   limit of GCC < 3.1.  */ -	asm("" : "+r" (p4), "+r" (p5)); - -	asm volatile( -#undef BLOCK -#define BLOCK(i) \ -		PF1(i)					\ -				PF1(i + 2)		\ -		LD(i,0)					\ -			LD(i + 1, 1)			\ -				LD(i + 2, 2)		\ -					LD(i + 3, 3)	\ -		PF2(i)					\ -				PF2(i + 2)		\ -		XO1(i,0)				\ -			XO1(i + 1, 1)			\ -				XO1(i + 2, 2)		\ -					XO1(i + 3, 3)	\ -		PF3(i)					\ -				PF3(i + 2)		\ -		XO2(i,0)				\ -			XO2(i + 1, 1)			\ -				XO2(i + 2, 2)		\ -					XO2(i + 3, 3)	\ -		PF4(i)					\ -				PF4(i + 2)		\ -		PF0(i + 4)				\ -				PF0(i + 6)		\ -		XO3(i,0)				\ -			XO3(i + 1, 1)			\ -				XO3(i + 2, 2)		\ -					XO3(i + 3, 3)	\ -		XO4(i,0)				\ -			XO4(i + 1, 1)			\ -				XO4(i + 2, 2)		\ -					XO4(i + 3, 3)	\ -		ST(i,0)					\ -			ST(i + 1, 1)			\ -				ST(i + 2, 2)		\ -					ST(i + 3, 3)	\ - - -		PF0(0) -				PF0(2) - -	" .align 32			;\n" -	" 1:                            ;\n" - -		BLOCK(0) -		BLOCK(4) -		BLOCK(8) -		BLOCK(12) - -	"       addl $256, %1           ;\n" -	"       addl $256, %2           ;\n" -	"       addl $256, %3           ;\n" -	"       addl $256, %4           ;\n" -	"       addl $256, %5           ;\n" -	"       decl %0                 ;\n" -	"       jnz 1b                  ;\n" -	: "+r" (lines), -	  "+r" (p1), "+r" (p2), "+r" (p3) -	: "r" (p4), "r" (p5) -	: "memory"); - -	/* p4 and p5 were modified, and now the variables are dead. -	   Clobber them just to be sure nobody does something stupid -	   like assuming they have some legal value.  */ -	asm("" : "=r" (p4), "=r" (p5)); - -	kernel_fpu_end(); -} -  static struct xor_block_template xor_block_pIII_sse = {  	.name = "pIII_sse",  	.do_2 = xor_sse_2, @@ -827,26 +543,25 @@ static struct xor_block_template xor_block_pIII_sse = {  /* Also try the generic routines.  */  #include <asm-generic/xor.h> +/* We force the use of the SSE xor block because it can write around L2. +   We may also be able to load into the L1 only depending on how the cpu +   deals with a load to a line that is being prefetched.  */  #undef XOR_TRY_TEMPLATES  #define XOR_TRY_TEMPLATES				\  do {							\ -	xor_speed(&xor_block_8regs);			\ -	xor_speed(&xor_block_8regs_p);			\ -	xor_speed(&xor_block_32regs);			\ -	xor_speed(&xor_block_32regs_p);			\  	AVX_XOR_SPEED;					\ -	if (cpu_has_xmm)				\ +	if (cpu_has_xmm) {				\  		xor_speed(&xor_block_pIII_sse);		\ -	if (cpu_has_mmx) {				\ +		xor_speed(&xor_block_sse_pf64);		\ +	} else if (cpu_has_mmx) {			\  		xor_speed(&xor_block_pII_mmx);		\  		xor_speed(&xor_block_p5_mmx);		\ +	} else {					\ +		xor_speed(&xor_block_8regs);		\ +		xor_speed(&xor_block_8regs_p);		\ +		xor_speed(&xor_block_32regs);		\ +		xor_speed(&xor_block_32regs_p);		\  	}						\  } while (0) -/* We force the use of the SSE xor block because it can write around L2. -   We may also be able to load into the L1 only depending on how the cpu -   deals with a load to a line that is being prefetched.  */ -#define XOR_SELECT_TEMPLATE(FASTEST)			\ -	AVX_SELECT(cpu_has_xmm ? &xor_block_pIII_sse : FASTEST) -  #endif /* _ASM_X86_XOR_32_H */ diff --git a/arch/x86/include/asm/xor_64.h b/arch/x86/include/asm/xor_64.h index 87ac522c4af..546f1e3b87c 100644 --- a/arch/x86/include/asm/xor_64.h +++ b/arch/x86/include/asm/xor_64.h @@ -1,301 +1,6 @@  #ifndef _ASM_X86_XOR_64_H  #define _ASM_X86_XOR_64_H -/* - * Optimized RAID-5 checksumming functions for MMX and SSE. - * - * 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, or (at your option) - * any later version. - * - * You should have received a copy of the GNU General Public License - * (for example /usr/src/linux/COPYING); if not, write to the Free - * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - - -/* - * Cache avoiding checksumming functions utilizing KNI instructions - * Copyright (C) 1999 Zach Brown (with obvious credit due Ingo) - */ - -/* - * Based on - * High-speed RAID5 checksumming functions utilizing SSE instructions. - * Copyright (C) 1998 Ingo Molnar. - */ - -/* - * x86-64 changes / gcc fixes from Andi Kleen. - * Copyright 2002 Andi Kleen, SuSE Labs. - * - * This hasn't been optimized for the hammer yet, but there are likely - * no advantages to be gotten from x86-64 here anyways. - */ - -#include <asm/i387.h> - -#define OFFS(x)		"16*("#x")" -#define PF_OFFS(x)	"256+16*("#x")" -#define	PF0(x)		"	prefetchnta "PF_OFFS(x)"(%[p1])		;\n" -#define LD(x, y)	"       movaps   "OFFS(x)"(%[p1]), %%xmm"#y"	;\n" -#define ST(x, y)	"       movaps %%xmm"#y",   "OFFS(x)"(%[p1])	;\n" -#define PF1(x)		"	prefetchnta "PF_OFFS(x)"(%[p2])		;\n" -#define PF2(x)		"	prefetchnta "PF_OFFS(x)"(%[p3])		;\n" -#define PF3(x)		"	prefetchnta "PF_OFFS(x)"(%[p4])		;\n" -#define PF4(x)		"	prefetchnta "PF_OFFS(x)"(%[p5])		;\n" -#define PF5(x)		"	prefetchnta "PF_OFFS(x)"(%[p6])		;\n" -#define XO1(x, y)	"       xorps   "OFFS(x)"(%[p2]), %%xmm"#y"	;\n" -#define XO2(x, y)	"       xorps   "OFFS(x)"(%[p3]), %%xmm"#y"	;\n" -#define XO3(x, y)	"       xorps   "OFFS(x)"(%[p4]), %%xmm"#y"	;\n" -#define XO4(x, y)	"       xorps   "OFFS(x)"(%[p5]), %%xmm"#y"	;\n" -#define XO5(x, y)	"       xorps   "OFFS(x)"(%[p6]), %%xmm"#y"	;\n" - - -static void -xor_sse_2(unsigned long bytes, unsigned long *p1, unsigned long *p2) -{ -	unsigned int lines = bytes >> 8; - -	kernel_fpu_begin(); - -	asm volatile( -#undef BLOCK -#define BLOCK(i) \ -		LD(i, 0)				\ -			LD(i + 1, 1)			\ -		PF1(i)					\ -				PF1(i + 2)		\ -				LD(i + 2, 2)		\ -					LD(i + 3, 3)	\ -		PF0(i + 4)				\ -				PF0(i + 6)		\ -		XO1(i, 0)				\ -			XO1(i + 1, 1)			\ -				XO1(i + 2, 2)		\ -					XO1(i + 3, 3)	\ -		ST(i, 0)				\ -			ST(i + 1, 1)			\ -				ST(i + 2, 2)		\ -					ST(i + 3, 3)	\ - - -		PF0(0) -				PF0(2) - -	" .align 32			;\n" -	" 1:                            ;\n" - -		BLOCK(0) -		BLOCK(4) -		BLOCK(8) -		BLOCK(12) - -	"       addq %[inc], %[p1]           ;\n" -	"       addq %[inc], %[p2]           ;\n" -		"		decl %[cnt] ; jnz 1b" -	: [p1] "+r" (p1), [p2] "+r" (p2), [cnt] "+r" (lines) -	: [inc] "r" (256UL) -	: "memory"); - -	kernel_fpu_end(); -} - -static void -xor_sse_3(unsigned long bytes, unsigned long *p1, unsigned long *p2, -	  unsigned long *p3) -{ -	unsigned int lines = bytes >> 8; - -	kernel_fpu_begin(); -	asm volatile( -#undef BLOCK -#define BLOCK(i) \ -		PF1(i)					\ -				PF1(i + 2)		\ -		LD(i, 0)					\ -			LD(i + 1, 1)			\ -				LD(i + 2, 2)		\ -					LD(i + 3, 3)	\ -		PF2(i)					\ -				PF2(i + 2)		\ -		PF0(i + 4)				\ -				PF0(i + 6)		\ -		XO1(i, 0)				\ -			XO1(i + 1, 1)			\ -				XO1(i + 2, 2)		\ -					XO1(i + 3, 3)	\ -		XO2(i, 0)				\ -			XO2(i + 1, 1)			\ -				XO2(i + 2, 2)		\ -					XO2(i + 3, 3)	\ -		ST(i, 0)				\ -			ST(i + 1, 1)			\ -				ST(i + 2, 2)		\ -					ST(i + 3, 3)	\ - - -		PF0(0) -				PF0(2) - -	" .align 32			;\n" -	" 1:                            ;\n" - -		BLOCK(0) -		BLOCK(4) -		BLOCK(8) -		BLOCK(12) - -	"       addq %[inc], %[p1]           ;\n" -	"       addq %[inc], %[p2]          ;\n" -	"       addq %[inc], %[p3]           ;\n" -		"		decl %[cnt] ; jnz 1b" -	: [cnt] "+r" (lines), -	  [p1] "+r" (p1), [p2] "+r" (p2), [p3] "+r" (p3) -	: [inc] "r" (256UL) -	: "memory"); -	kernel_fpu_end(); -} - -static void -xor_sse_4(unsigned long bytes, unsigned long *p1, unsigned long *p2, -	  unsigned long *p3, unsigned long *p4) -{ -	unsigned int lines = bytes >> 8; - -	kernel_fpu_begin(); - -	asm volatile( -#undef BLOCK -#define BLOCK(i) \ -		PF1(i)					\ -				PF1(i + 2)		\ -		LD(i, 0)				\ -			LD(i + 1, 1)			\ -				LD(i + 2, 2)		\ -					LD(i + 3, 3)	\ -		PF2(i)					\ -				PF2(i + 2)		\ -		XO1(i, 0)				\ -			XO1(i + 1, 1)			\ -				XO1(i + 2, 2)		\ -					XO1(i + 3, 3)	\ -		PF3(i)					\ -				PF3(i + 2)		\ -		PF0(i + 4)				\ -				PF0(i + 6)		\ -		XO2(i, 0)				\ -			XO2(i + 1, 1)			\ -				XO2(i + 2, 2)		\ -					XO2(i + 3, 3)	\ -		XO3(i, 0)				\ -			XO3(i + 1, 1)			\ -				XO3(i + 2, 2)		\ -					XO3(i + 3, 3)	\ -		ST(i, 0)				\ -			ST(i + 1, 1)			\ -				ST(i + 2, 2)		\ -					ST(i + 3, 3)	\ - - -		PF0(0) -				PF0(2) - -	" .align 32			;\n" -	" 1:                            ;\n" - -		BLOCK(0) -		BLOCK(4) -		BLOCK(8) -		BLOCK(12) - -	"       addq %[inc], %[p1]           ;\n" -	"       addq %[inc], %[p2]           ;\n" -	"       addq %[inc], %[p3]           ;\n" -	"       addq %[inc], %[p4]           ;\n" -	"	decl %[cnt] ; jnz 1b" -	: [cnt] "+c" (lines), -	  [p1] "+r" (p1), [p2] "+r" (p2), [p3] "+r" (p3), [p4] "+r" (p4) -	: [inc] "r" (256UL) -	: "memory" ); - -	kernel_fpu_end(); -} - -static void -xor_sse_5(unsigned long bytes, unsigned long *p1, unsigned long *p2, -	  unsigned long *p3, unsigned long *p4, unsigned long *p5) -{ -	unsigned int lines = bytes >> 8; - -	kernel_fpu_begin(); - -	asm volatile( -#undef BLOCK -#define BLOCK(i) \ -		PF1(i)					\ -				PF1(i + 2)		\ -		LD(i, 0)				\ -			LD(i + 1, 1)			\ -				LD(i + 2, 2)		\ -					LD(i + 3, 3)	\ -		PF2(i)					\ -				PF2(i + 2)		\ -		XO1(i, 0)				\ -			XO1(i + 1, 1)			\ -				XO1(i + 2, 2)		\ -					XO1(i + 3, 3)	\ -		PF3(i)					\ -				PF3(i + 2)		\ -		XO2(i, 0)				\ -			XO2(i + 1, 1)			\ -				XO2(i + 2, 2)		\ -					XO2(i + 3, 3)	\ -		PF4(i)					\ -				PF4(i + 2)		\ -		PF0(i + 4)				\ -				PF0(i + 6)		\ -		XO3(i, 0)				\ -			XO3(i + 1, 1)			\ -				XO3(i + 2, 2)		\ -					XO3(i + 3, 3)	\ -		XO4(i, 0)				\ -			XO4(i + 1, 1)			\ -				XO4(i + 2, 2)		\ -					XO4(i + 3, 3)	\ -		ST(i, 0)				\ -			ST(i + 1, 1)			\ -				ST(i + 2, 2)		\ -					ST(i + 3, 3)	\ - - -		PF0(0) -				PF0(2) - -	" .align 32			;\n" -	" 1:                            ;\n" - -		BLOCK(0) -		BLOCK(4) -		BLOCK(8) -		BLOCK(12) - -	"       addq %[inc], %[p1]           ;\n" -	"       addq %[inc], %[p2]           ;\n" -	"       addq %[inc], %[p3]           ;\n" -	"       addq %[inc], %[p4]           ;\n" -	"       addq %[inc], %[p5]           ;\n" -	"	decl %[cnt] ; jnz 1b" -	: [cnt] "+c" (lines), -	  [p1] "+r" (p1), [p2] "+r" (p2), [p3] "+r" (p3), [p4] "+r" (p4), -	  [p5] "+r" (p5) -	: [inc] "r" (256UL) -	: "memory"); - -	kernel_fpu_end(); -} -  static struct xor_block_template xor_block_sse = {  	.name = "generic_sse",  	.do_2 = xor_sse_2, @@ -308,17 +13,15 @@ static struct xor_block_template xor_block_sse = {  /* Also try the AVX routines */  #include <asm/xor_avx.h> +/* We force the use of the SSE xor block because it can write around L2. +   We may also be able to load into the L1 only depending on how the cpu +   deals with a load to a line that is being prefetched.  */  #undef XOR_TRY_TEMPLATES  #define XOR_TRY_TEMPLATES			\  do {						\  	AVX_XOR_SPEED;				\ +	xor_speed(&xor_block_sse_pf64);		\  	xor_speed(&xor_block_sse);		\  } while (0) -/* We force the use of the SSE xor block because it can write around L2. -   We may also be able to load into the L1 only depending on how the cpu -   deals with a load to a line that is being prefetched.  */ -#define XOR_SELECT_TEMPLATE(FASTEST) \ -	AVX_SELECT(&xor_block_sse) -  #endif /* _ASM_X86_XOR_64_H */ diff --git a/arch/x86/include/uapi/asm/bootparam.h b/arch/x86/include/uapi/asm/bootparam.h index 92862cd9020..c15ddaf9071 100644 --- a/arch/x86/include/uapi/asm/bootparam.h +++ b/arch/x86/include/uapi/asm/bootparam.h @@ -1,6 +1,31 @@  #ifndef _ASM_X86_BOOTPARAM_H  #define _ASM_X86_BOOTPARAM_H +/* setup_data types */ +#define SETUP_NONE			0 +#define SETUP_E820_EXT			1 +#define SETUP_DTB			2 +#define SETUP_PCI			3 + +/* ram_size flags */ +#define RAMDISK_IMAGE_START_MASK	0x07FF +#define RAMDISK_PROMPT_FLAG		0x8000 +#define RAMDISK_LOAD_FLAG		0x4000 + +/* loadflags */ +#define LOADED_HIGH	(1<<0) +#define QUIET_FLAG	(1<<5) +#define KEEP_SEGMENTS	(1<<6) +#define CAN_USE_HEAP	(1<<7) + +/* xloadflags */ +#define XLF_KERNEL_64			(1<<0) +#define XLF_CAN_BE_LOADED_ABOVE_4G	(1<<1) +#define XLF_EFI_HANDOVER_32		(1<<2) +#define XLF_EFI_HANDOVER_64		(1<<3) + +#ifndef __ASSEMBLY__ +  #include <linux/types.h>  #include <linux/screen_info.h>  #include <linux/apm_bios.h> @@ -9,12 +34,6 @@  #include <asm/ist.h>  #include <video/edid.h> -/* setup data types */ -#define SETUP_NONE			0 -#define SETUP_E820_EXT			1 -#define SETUP_DTB			2 -#define SETUP_PCI			3 -  /* extensible setup data list node */  struct setup_data {  	__u64 next; @@ -28,9 +47,6 @@ struct setup_header {  	__u16	root_flags;  	__u32	syssize;  	__u16	ram_size; -#define RAMDISK_IMAGE_START_MASK	0x07FF -#define RAMDISK_PROMPT_FLAG		0x8000 -#define RAMDISK_LOAD_FLAG		0x4000  	__u16	vid_mode;  	__u16	root_dev;  	__u16	boot_flag; @@ -42,10 +58,6 @@ struct setup_header {  	__u16	kernel_version;  	__u8	type_of_loader;  	__u8	loadflags; -#define LOADED_HIGH	(1<<0) -#define QUIET_FLAG	(1<<5) -#define KEEP_SEGMENTS	(1<<6) -#define CAN_USE_HEAP	(1<<7)  	__u16	setup_move_size;  	__u32	code32_start;  	__u32	ramdisk_image; @@ -58,7 +70,8 @@ struct setup_header {  	__u32	initrd_addr_max;  	__u32	kernel_alignment;  	__u8	relocatable_kernel; -	__u8	_pad2[3]; +	__u8	min_alignment; +	__u16	xloadflags;  	__u32	cmdline_size;  	__u32	hardware_subarch;  	__u64	hardware_subarch_data; @@ -106,7 +119,10 @@ struct boot_params {  	__u8  hd1_info[16];	/* obsolete! */		/* 0x090 */  	struct sys_desc_table sys_desc_table;		/* 0x0a0 */  	struct olpc_ofw_header olpc_ofw_header;		/* 0x0b0 */ -	__u8  _pad4[128];				/* 0x0c0 */ +	__u32 ext_ramdisk_image;			/* 0x0c0 */ +	__u32 ext_ramdisk_size;				/* 0x0c4 */ +	__u32 ext_cmd_line_ptr;				/* 0x0c8 */ +	__u8  _pad4[116];				/* 0x0cc */  	struct edid_info edid_info;			/* 0x140 */  	struct efi_info efi_info;			/* 0x1c0 */  	__u32 alt_mem_k;				/* 0x1e0 */ @@ -115,7 +131,20 @@ struct boot_params {  	__u8  eddbuf_entries;				/* 0x1e9 */  	__u8  edd_mbr_sig_buf_entries;			/* 0x1ea */  	__u8  kbd_status;				/* 0x1eb */ -	__u8  _pad6[5];					/* 0x1ec */ +	__u8  _pad5[3];					/* 0x1ec */ +	/* +	 * The sentinel is set to a nonzero value (0xff) in header.S. +	 * +	 * A bootloader is supposed to only take setup_header and put +	 * it into a clean boot_params buffer. If it turns out that +	 * it is clumsy or too generous with the buffer, it most +	 * probably will pick up the sentinel variable too. The fact +	 * that this variable then is still 0xff will let kernel +	 * know that some variables in boot_params are invalid and +	 * kernel should zero out certain portions of boot_params. +	 */ +	__u8  sentinel;					/* 0x1ef */ +	__u8  _pad6[1];					/* 0x1f0 */  	struct setup_header hdr;    /* setup header */	/* 0x1f1 */  	__u8  _pad7[0x290-0x1f1-sizeof(struct setup_header)];  	__u32 edd_mbr_sig_buffer[EDD_MBR_SIG_MAX];	/* 0x290 */ @@ -134,6 +163,6 @@ enum {  	X86_NR_SUBARCHS,  }; - +#endif /* __ASSEMBLY__ */  #endif /* _ASM_X86_BOOTPARAM_H */ diff --git a/arch/x86/include/uapi/asm/mce.h b/arch/x86/include/uapi/asm/mce.h index 58c829871c3..a0eab85ce7b 100644 --- a/arch/x86/include/uapi/asm/mce.h +++ b/arch/x86/include/uapi/asm/mce.h @@ -4,66 +4,6 @@  #include <linux/types.h>  #include <asm/ioctls.h> -/* - * Machine Check support for x86 - */ - -/* MCG_CAP register defines */ -#define MCG_BANKCNT_MASK	0xff         /* Number of Banks */ -#define MCG_CTL_P		(1ULL<<8)    /* MCG_CTL register available */ -#define MCG_EXT_P		(1ULL<<9)    /* Extended registers available */ -#define MCG_CMCI_P		(1ULL<<10)   /* CMCI supported */ -#define MCG_EXT_CNT_MASK	0xff0000     /* Number of Extended registers */ -#define MCG_EXT_CNT_SHIFT	16 -#define MCG_EXT_CNT(c)		(((c) & MCG_EXT_CNT_MASK) >> MCG_EXT_CNT_SHIFT) -#define MCG_SER_P	 	(1ULL<<24)   /* MCA recovery/new status bits */ - -/* MCG_STATUS register defines */ -#define MCG_STATUS_RIPV  (1ULL<<0)   /* restart ip valid */ -#define MCG_STATUS_EIPV  (1ULL<<1)   /* ip points to correct instruction */ -#define MCG_STATUS_MCIP  (1ULL<<2)   /* machine check in progress */ - -/* MCi_STATUS register defines */ -#define MCI_STATUS_VAL   (1ULL<<63)  /* valid error */ -#define MCI_STATUS_OVER  (1ULL<<62)  /* previous errors lost */ -#define MCI_STATUS_UC    (1ULL<<61)  /* uncorrected error */ -#define MCI_STATUS_EN    (1ULL<<60)  /* error enabled */ -#define MCI_STATUS_MISCV (1ULL<<59)  /* misc error reg. valid */ -#define MCI_STATUS_ADDRV (1ULL<<58)  /* addr reg. valid */ -#define MCI_STATUS_PCC   (1ULL<<57)  /* processor context corrupt */ -#define MCI_STATUS_S	 (1ULL<<56)  /* Signaled machine check */ -#define MCI_STATUS_AR	 (1ULL<<55)  /* Action required */ -#define MCACOD		  0xffff     /* MCA Error Code */ - -/* Architecturally defined codes from SDM Vol. 3B Chapter 15 */ -#define MCACOD_SCRUB	0x00C0	/* 0xC0-0xCF Memory Scrubbing */ -#define MCACOD_SCRUBMSK	0xfff0 -#define MCACOD_L3WB	0x017A	/* L3 Explicit Writeback */ -#define MCACOD_DATA	0x0134	/* Data Load */ -#define MCACOD_INSTR	0x0150	/* Instruction Fetch */ - -/* MCi_MISC register defines */ -#define MCI_MISC_ADDR_LSB(m)	((m) & 0x3f) -#define MCI_MISC_ADDR_MODE(m)	(((m) >> 6) & 7) -#define  MCI_MISC_ADDR_SEGOFF	0	/* segment offset */ -#define  MCI_MISC_ADDR_LINEAR	1	/* linear address */ -#define  MCI_MISC_ADDR_PHYS	2	/* physical address */ -#define  MCI_MISC_ADDR_MEM	3	/* memory address */ -#define  MCI_MISC_ADDR_GENERIC	7	/* generic */ - -/* CTL2 register defines */ -#define MCI_CTL2_CMCI_EN		(1ULL << 30) -#define MCI_CTL2_CMCI_THRESHOLD_MASK	0x7fffULL - -#define MCJ_CTX_MASK		3 -#define MCJ_CTX(flags)		((flags) & MCJ_CTX_MASK) -#define MCJ_CTX_RANDOM		0    /* inject context: random */ -#define MCJ_CTX_PROCESS		0x1  /* inject context: process */ -#define MCJ_CTX_IRQ		0x2  /* inject context: IRQ */ -#define MCJ_NMI_BROADCAST	0x4  /* do NMI broadcasting */ -#define MCJ_EXCEPTION		0x8  /* raise as exception */ -#define MCJ_IRQ_BRAODCAST	0x10 /* do IRQ broadcasting */ -  /* Fields are zero when not available */  struct mce {  	__u64 status; @@ -87,35 +27,8 @@ struct mce {  	__u64 mcgcap;	/* MCGCAP MSR: machine check capabilities of CPU */  }; -/* - * This structure contains all data related to the MCE log.  Also - * carries a signature to make it easier to find from external - * debugging tools.  Each entry is only valid when its finished flag - * is set. - */ - -#define MCE_LOG_LEN 32 - -struct mce_log { -	char signature[12]; /* "MACHINECHECK" */ -	unsigned len;	    /* = MCE_LOG_LEN */ -	unsigned next; -	unsigned flags; -	unsigned recordlen;	/* length of struct mce */ -	struct mce entry[MCE_LOG_LEN]; -}; - -#define MCE_OVERFLOW 0		/* bit 0 in flags means overflow */ - -#define MCE_LOG_SIGNATURE	"MACHINECHECK" -  #define MCE_GET_RECORD_LEN   _IOR('M', 1, int)  #define MCE_GET_LOG_LEN      _IOR('M', 2, int)  #define MCE_GETCLEAR_FLAGS   _IOR('M', 3, int) -/* Software defined banks */ -#define MCE_EXTENDED_BANK	128 -#define MCE_THERMAL_BANK	MCE_EXTENDED_BANK + 0 -#define K8_MCE_THRESHOLD_BASE      (MCE_EXTENDED_BANK + 1) -  #endif /* _UAPI_ASM_X86_MCE_H */ diff --git a/arch/x86/include/uapi/asm/msr-index.h b/arch/x86/include/uapi/asm/msr-index.h index 433a59fb1a7..075a4025559 100644 --- a/arch/x86/include/uapi/asm/msr-index.h +++ b/arch/x86/include/uapi/asm/msr-index.h @@ -194,6 +194,8 @@  /* Fam 15h MSRs */  #define MSR_F15H_PERF_CTL		0xc0010200  #define MSR_F15H_PERF_CTR		0xc0010201 +#define MSR_F15H_NB_PERF_CTL		0xc0010240 +#define MSR_F15H_NB_PERF_CTR		0xc0010241  /* Fam 10h MSRs */  #define MSR_FAM10H_MMIO_CONF_BASE	0xc0010058 diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile index 34e923a5376..ac3b3d00283 100644 --- a/arch/x86/kernel/Makefile +++ b/arch/x86/kernel/Makefile @@ -65,8 +65,7 @@ obj-$(CONFIG_X86_TSC)		+= trace_clock.o  obj-$(CONFIG_KEXEC)		+= machine_kexec_$(BITS).o  obj-$(CONFIG_KEXEC)		+= relocate_kernel_$(BITS).o crash.o  obj-$(CONFIG_CRASH_DUMP)	+= crash_dump_$(BITS).o -obj-$(CONFIG_KPROBES)		+= kprobes.o -obj-$(CONFIG_OPTPROBES)		+= kprobes-opt.o +obj-y				+= kprobes/  obj-$(CONFIG_MODULES)		+= module.o  obj-$(CONFIG_DOUBLEFAULT) 	+= doublefault_32.o  obj-$(CONFIG_KGDB)		+= kgdb.o diff --git a/arch/x86/kernel/apb_timer.c b/arch/x86/kernel/apb_timer.c index afdc3f756de..c9876efecaf 100644 --- a/arch/x86/kernel/apb_timer.c +++ b/arch/x86/kernel/apb_timer.c @@ -240,7 +240,7 @@ static int apbt_cpuhp_notify(struct notifier_block *n,  		dw_apb_clockevent_pause(adev->timer);  		if (system_state == SYSTEM_RUNNING) {  			pr_debug("skipping APBT CPU %lu offline\n", cpu); -		} else if (adev) { +		} else {  			pr_debug("APBT clockevent for cpu %lu offline\n", cpu);  			dw_apb_clockevent_stop(adev->timer);  		} @@ -311,7 +311,6 @@ void __init apbt_time_init(void)  #ifdef CONFIG_SMP  	int i;  	struct sfi_timer_table_entry *p_mtmr; -	unsigned int percpu_timer;  	struct apbt_dev *adev;  #endif @@ -346,13 +345,10 @@ void __init apbt_time_init(void)  		return;  	}  	pr_debug("%s: %d CPUs online\n", __func__, num_online_cpus()); -	if (num_possible_cpus() <= sfi_mtimer_num) { -		percpu_timer = 1; +	if (num_possible_cpus() <= sfi_mtimer_num)  		apbt_num_timers_used = num_possible_cpus(); -	} else { -		percpu_timer = 0; +	else  		apbt_num_timers_used = 1; -	}  	pr_debug("%s: %d APB timers used\n", __func__, apbt_num_timers_used);  	/* here we set up per CPU timer data structure */ diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c index b994cc84aa7..a5b4dce1b7a 100644 --- a/arch/x86/kernel/apic/apic.c +++ b/arch/x86/kernel/apic/apic.c @@ -1477,8 +1477,7 @@ void __init bsp_end_local_APIC_setup(void)  	 * Now that local APIC setup is completed for BP, configure the fault  	 * handling for interrupt remapping.  	 */ -	if (irq_remapping_enabled) -		irq_remap_enable_fault_handling(); +	irq_remap_enable_fault_handling();  } @@ -2251,8 +2250,7 @@ static int lapic_suspend(void)  	local_irq_save(flags);  	disable_local_APIC(); -	if (irq_remapping_enabled) -		irq_remapping_disable(); +	irq_remapping_disable();  	local_irq_restore(flags);  	return 0; @@ -2268,16 +2266,15 @@ static void lapic_resume(void)  		return;  	local_irq_save(flags); -	if (irq_remapping_enabled) { -		/* -		 * IO-APIC and PIC have their own resume routines. -		 * We just mask them here to make sure the interrupt -		 * subsystem is completely quiet while we enable x2apic -		 * and interrupt-remapping. -		 */ -		mask_ioapic_entries(); -		legacy_pic->mask_all(); -	} + +	/* +	 * IO-APIC and PIC have their own resume routines. +	 * We just mask them here to make sure the interrupt +	 * subsystem is completely quiet while we enable x2apic +	 * and interrupt-remapping. +	 */ +	mask_ioapic_entries(); +	legacy_pic->mask_all();  	if (x2apic_mode)  		enable_x2apic(); @@ -2320,8 +2317,7 @@ static void lapic_resume(void)  	apic_write(APIC_ESR, 0);  	apic_read(APIC_ESR); -	if (irq_remapping_enabled) -		irq_remapping_reenable(x2apic_mode); +	irq_remapping_reenable(x2apic_mode);  	local_irq_restore(flags);  } diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index b739d398bb2..9ed796ccc32 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c @@ -68,22 +68,6 @@  #define for_each_irq_pin(entry, head) \  	for (entry = head; entry; entry = entry->next) -#ifdef CONFIG_IRQ_REMAP -static void irq_remap_modify_chip_defaults(struct irq_chip *chip); -static inline bool irq_remapped(struct irq_cfg *cfg) -{ -	return cfg->irq_2_iommu.iommu != NULL; -} -#else -static inline bool irq_remapped(struct irq_cfg *cfg) -{ -	return false; -} -static inline void irq_remap_modify_chip_defaults(struct irq_chip *chip) -{ -} -#endif -  /*   *      Is the SiS APIC rmw bug present ?   *      -1 = don't know, 0 = no, 1 = yes @@ -300,9 +284,9 @@ static struct irq_cfg *alloc_irq_and_cfg_at(unsigned int at, int node)  	return cfg;  } -static int alloc_irq_from(unsigned int from, int node) +static int alloc_irqs_from(unsigned int from, unsigned int count, int node)  { -	return irq_alloc_desc_from(from, node); +	return irq_alloc_descs_from(from, count, node);  }  static void free_irq_at(unsigned int at, struct irq_cfg *cfg) @@ -326,7 +310,7 @@ static __attribute_const__ struct io_apic __iomem *io_apic_base(int idx)  		+ (mpc_ioapic_addr(idx) & ~PAGE_MASK);  } -static inline void io_apic_eoi(unsigned int apic, unsigned int vector) +void io_apic_eoi(unsigned int apic, unsigned int vector)  {  	struct io_apic __iomem *io_apic = io_apic_base(apic);  	writel(vector, &io_apic->eoi); @@ -573,19 +557,10 @@ static void unmask_ioapic_irq(struct irq_data *data)   * Otherwise, we simulate the EOI message manually by changing the trigger   * mode to edge and then back to level, with RTE being masked during this.   */ -static void __eoi_ioapic_pin(int apic, int pin, int vector, struct irq_cfg *cfg) +void native_eoi_ioapic_pin(int apic, int pin, int vector)  {  	if (mpc_ioapic_ver(apic) >= 0x20) { -		/* -		 * Intr-remapping uses pin number as the virtual vector -		 * in the RTE. Actual vector is programmed in -		 * intr-remapping table entry. Hence for the io-apic -		 * EOI we use the pin number. -		 */ -		if (cfg && irq_remapped(cfg)) -			io_apic_eoi(apic, pin); -		else -			io_apic_eoi(apic, vector); +		io_apic_eoi(apic, vector);  	} else {  		struct IO_APIC_route_entry entry, entry1; @@ -606,14 +581,15 @@ static void __eoi_ioapic_pin(int apic, int pin, int vector, struct irq_cfg *cfg)  	}  } -static void eoi_ioapic_irq(unsigned int irq, struct irq_cfg *cfg) +void eoi_ioapic_irq(unsigned int irq, struct irq_cfg *cfg)  {  	struct irq_pin_list *entry;  	unsigned long flags;  	raw_spin_lock_irqsave(&ioapic_lock, flags);  	for_each_irq_pin(entry, cfg->irq_2_pin) -		__eoi_ioapic_pin(entry->apic, entry->pin, cfg->vector, cfg); +		x86_io_apic_ops.eoi_ioapic_pin(entry->apic, entry->pin, +					       cfg->vector);  	raw_spin_unlock_irqrestore(&ioapic_lock, flags);  } @@ -650,7 +626,7 @@ static void clear_IO_APIC_pin(unsigned int apic, unsigned int pin)  		}  		raw_spin_lock_irqsave(&ioapic_lock, flags); -		__eoi_ioapic_pin(apic, pin, entry.vector, NULL); +		x86_io_apic_ops.eoi_ioapic_pin(apic, pin, entry.vector);  		raw_spin_unlock_irqrestore(&ioapic_lock, flags);  	} @@ -1304,25 +1280,18 @@ static void ioapic_register_intr(unsigned int irq, struct irq_cfg *cfg,  		fasteoi = false;  	} -	if (irq_remapped(cfg)) { -		irq_set_status_flags(irq, IRQ_MOVE_PCNTXT); -		irq_remap_modify_chip_defaults(chip); +	if (setup_remapped_irq(irq, cfg, chip))  		fasteoi = trigger != 0; -	}  	hdl = fasteoi ? handle_fasteoi_irq : handle_edge_irq;  	irq_set_chip_and_handler_name(irq, chip, hdl,  				      fasteoi ? "fasteoi" : "edge");  } -static int setup_ioapic_entry(int irq, struct IO_APIC_route_entry *entry, -			       unsigned int destination, int vector, -			       struct io_apic_irq_attr *attr) +int native_setup_ioapic_entry(int irq, struct IO_APIC_route_entry *entry, +			      unsigned int destination, int vector, +			      struct io_apic_irq_attr *attr)  { -	if (irq_remapping_enabled) -		return setup_ioapic_remapped_entry(irq, entry, destination, -						   vector, attr); -  	memset(entry, 0, sizeof(*entry));  	entry->delivery_mode = apic->irq_delivery_mode; @@ -1370,8 +1339,8 @@ static void setup_ioapic_irq(unsigned int irq, struct irq_cfg *cfg,  		    attr->ioapic, mpc_ioapic_id(attr->ioapic), attr->ioapic_pin,  		    cfg->vector, irq, attr->trigger, attr->polarity, dest); -	if (setup_ioapic_entry(irq, &entry, dest, cfg->vector, attr)) { -		pr_warn("Failed to setup ioapic entry for ioapic %d, pin %d\n", +	if (x86_io_apic_ops.setup_entry(irq, &entry, dest, cfg->vector, attr)) { +		pr_warn("Failed to setup ioapic entry for ioapic  %d, pin %d\n",  			mpc_ioapic_id(attr->ioapic), attr->ioapic_pin);  		__clear_irq_vector(irq, cfg); @@ -1479,9 +1448,6 @@ static void __init setup_timer_IRQ0_pin(unsigned int ioapic_idx,  	struct IO_APIC_route_entry entry;  	unsigned int dest; -	if (irq_remapping_enabled) -		return; -  	memset(&entry, 0, sizeof(entry));  	/* @@ -1513,9 +1479,63 @@ static void __init setup_timer_IRQ0_pin(unsigned int ioapic_idx,  	ioapic_write_entry(ioapic_idx, pin, entry);  } -__apicdebuginit(void) print_IO_APIC(int ioapic_idx) +void native_io_apic_print_entries(unsigned int apic, unsigned int nr_entries) +{ +	int i; + +	pr_debug(" NR Dst Mask Trig IRR Pol Stat Dmod Deli Vect:\n"); + +	for (i = 0; i <= nr_entries; i++) { +		struct IO_APIC_route_entry entry; + +		entry = ioapic_read_entry(apic, i); + +		pr_debug(" %02x %02X  ", i, entry.dest); +		pr_cont("%1d    %1d    %1d   %1d   %1d    " +			"%1d    %1d    %02X\n", +			entry.mask, +			entry.trigger, +			entry.irr, +			entry.polarity, +			entry.delivery_status, +			entry.dest_mode, +			entry.delivery_mode, +			entry.vector); +	} +} + +void intel_ir_io_apic_print_entries(unsigned int apic, +				    unsigned int nr_entries)  {  	int i; + +	pr_debug(" NR Indx Fmt Mask Trig IRR Pol Stat Indx2 Zero Vect:\n"); + +	for (i = 0; i <= nr_entries; i++) { +		struct IR_IO_APIC_route_entry *ir_entry; +		struct IO_APIC_route_entry entry; + +		entry = ioapic_read_entry(apic, i); + +		ir_entry = (struct IR_IO_APIC_route_entry *)&entry; + +		pr_debug(" %02x %04X ", i, ir_entry->index); +		pr_cont("%1d   %1d    %1d    %1d   %1d   " +			"%1d    %1d     %X    %02X\n", +			ir_entry->format, +			ir_entry->mask, +			ir_entry->trigger, +			ir_entry->irr, +			ir_entry->polarity, +			ir_entry->delivery_status, +			ir_entry->index2, +			ir_entry->zero, +			ir_entry->vector); +	} +} + +__apicdebuginit(void) print_IO_APIC(int ioapic_idx) +{  	union IO_APIC_reg_00 reg_00;  	union IO_APIC_reg_01 reg_01;  	union IO_APIC_reg_02 reg_02; @@ -1568,58 +1588,7 @@ __apicdebuginit(void) print_IO_APIC(int ioapic_idx)  	printk(KERN_DEBUG ".... IRQ redirection table:\n"); -	if (irq_remapping_enabled) { -		printk(KERN_DEBUG " NR Indx Fmt Mask Trig IRR" -			" Pol Stat Indx2 Zero Vect:\n"); -	} else { -		printk(KERN_DEBUG " NR Dst Mask Trig IRR Pol" -			" Stat Dmod Deli Vect:\n"); -	} - -	for (i = 0; i <= reg_01.bits.entries; i++) { -		if (irq_remapping_enabled) { -			struct IO_APIC_route_entry entry; -			struct IR_IO_APIC_route_entry *ir_entry; - -			entry = ioapic_read_entry(ioapic_idx, i); -			ir_entry = (struct IR_IO_APIC_route_entry *) &entry; -			printk(KERN_DEBUG " %02x %04X ", -				i, -				ir_entry->index -			); -			pr_cont("%1d   %1d    %1d    %1d   %1d   " -				"%1d    %1d     %X    %02X\n", -				ir_entry->format, -				ir_entry->mask, -				ir_entry->trigger, -				ir_entry->irr, -				ir_entry->polarity, -				ir_entry->delivery_status, -				ir_entry->index2, -				ir_entry->zero, -				ir_entry->vector -			); -		} else { -			struct IO_APIC_route_entry entry; - -			entry = ioapic_read_entry(ioapic_idx, i); -			printk(KERN_DEBUG " %02x %02X  ", -				i, -				entry.dest -			); -			pr_cont("%1d    %1d    %1d   %1d   %1d    " -				"%1d    %1d    %02X\n", -				entry.mask, -				entry.trigger, -				entry.irr, -				entry.polarity, -				entry.delivery_status, -				entry.dest_mode, -				entry.delivery_mode, -				entry.vector -			); -		} -	} +	x86_io_apic_ops.print_entries(ioapic_idx, reg_01.bits.entries);  }  __apicdebuginit(void) print_IO_APICs(void) @@ -1921,30 +1890,14 @@ void __init enable_IO_APIC(void)  	clear_IO_APIC();  } -/* - * Not an __init, needed by the reboot code - */ -void disable_IO_APIC(void) +void native_disable_io_apic(void)  {  	/* -	 * Clear the IO-APIC before rebooting: -	 */ -	clear_IO_APIC(); - -	if (!legacy_pic->nr_legacy_irqs) -		return; - -	/*  	 * If the i8259 is routed through an IOAPIC  	 * Put that IOAPIC in virtual wire mode  	 * so legacy interrupts can be delivered. -	 * -	 * With interrupt-remapping, for now we will use virtual wire A mode, -	 * as virtual wire B is little complex (need to configure both -	 * IOAPIC RTE as well as interrupt-remapping table entry). -	 * As this gets called during crash dump, keep this simple for now.  	 */ -	if (ioapic_i8259.pin != -1 && !irq_remapping_enabled) { +	if (ioapic_i8259.pin != -1) {  		struct IO_APIC_route_entry entry;  		memset(&entry, 0, sizeof(entry)); @@ -1964,12 +1917,25 @@ void disable_IO_APIC(void)  		ioapic_write_entry(ioapic_i8259.apic, ioapic_i8259.pin, entry);  	} +	if (cpu_has_apic || apic_from_smp_config()) +		disconnect_bsp_APIC(ioapic_i8259.pin != -1); + +} + +/* + * Not an __init, needed by the reboot code + */ +void disable_IO_APIC(void) +{  	/* -	 * Use virtual wire A mode when interrupt remapping is enabled. +	 * Clear the IO-APIC before rebooting:  	 */ -	if (cpu_has_apic || apic_from_smp_config()) -		disconnect_bsp_APIC(!irq_remapping_enabled && -				ioapic_i8259.pin != -1); +	clear_IO_APIC(); + +	if (!legacy_pic->nr_legacy_irqs) +		return; + +	x86_io_apic_ops.disable();  }  #ifdef CONFIG_X86_32 @@ -2322,12 +2288,8 @@ static void __target_IO_APIC_irq(unsigned int irq, unsigned int dest, struct irq  		apic = entry->apic;  		pin = entry->pin; -		/* -		 * With interrupt-remapping, destination information comes -		 * from interrupt-remapping table entry. -		 */ -		if (!irq_remapped(cfg)) -			io_apic_write(apic, 0x11 + pin*2, dest); + +		io_apic_write(apic, 0x11 + pin*2, dest);  		reg = io_apic_read(apic, 0x10 + pin*2);  		reg &= ~IO_APIC_REDIR_VECTOR_MASK;  		reg |= vector; @@ -2369,9 +2331,10 @@ int __ioapic_set_affinity(struct irq_data *data, const struct cpumask *mask,  	return 0;  } -static int -ioapic_set_affinity(struct irq_data *data, const struct cpumask *mask, -		    bool force) + +int native_ioapic_set_affinity(struct irq_data *data, +			       const struct cpumask *mask, +			       bool force)  {  	unsigned int dest, irq = data->irq;  	unsigned long flags; @@ -2548,33 +2511,6 @@ static void ack_apic_level(struct irq_data *data)  	ioapic_irqd_unmask(data, cfg, masked);  } -#ifdef CONFIG_IRQ_REMAP -static void ir_ack_apic_edge(struct irq_data *data) -{ -	ack_APIC_irq(); -} - -static void ir_ack_apic_level(struct irq_data *data) -{ -	ack_APIC_irq(); -	eoi_ioapic_irq(data->irq, data->chip_data); -} - -static void ir_print_prefix(struct irq_data *data, struct seq_file *p) -{ -	seq_printf(p, " IR-%s", data->chip->name); -} - -static void irq_remap_modify_chip_defaults(struct irq_chip *chip) -{ -	chip->irq_print_chip = ir_print_prefix; -	chip->irq_ack = ir_ack_apic_edge; -	chip->irq_eoi = ir_ack_apic_level; - -	chip->irq_set_affinity = set_remapped_irq_affinity; -} -#endif /* CONFIG_IRQ_REMAP */ -  static struct irq_chip ioapic_chip __read_mostly = {  	.name			= "IO-APIC",  	.irq_startup		= startup_ioapic_irq, @@ -2582,7 +2518,7 @@ static struct irq_chip ioapic_chip __read_mostly = {  	.irq_unmask		= unmask_ioapic_irq,  	.irq_ack		= ack_apic_edge,  	.irq_eoi		= ack_apic_level, -	.irq_set_affinity	= ioapic_set_affinity, +	.irq_set_affinity	= native_ioapic_set_affinity,  	.irq_retrigger		= ioapic_retrigger_irq,  }; @@ -2781,8 +2717,7 @@ static inline void __init check_timer(void)  	 * 8259A.  	 */  	if (pin1 == -1) { -		if (irq_remapping_enabled) -			panic("BIOS bug: timer not connected to IO-APIC"); +		panic_if_irq_remap("BIOS bug: timer not connected to IO-APIC");  		pin1 = pin2;  		apic1 = apic2;  		no_pin1 = 1; @@ -2814,8 +2749,7 @@ static inline void __init check_timer(void)  				clear_IO_APIC_pin(0, pin1);  			goto out;  		} -		if (irq_remapping_enabled) -			panic("timer doesn't work through Interrupt-remapped IO-APIC"); +		panic_if_irq_remap("timer doesn't work through Interrupt-remapped IO-APIC");  		local_irq_disable();  		clear_IO_APIC_pin(apic1, pin1);  		if (!no_pin1) @@ -2982,37 +2916,58 @@ device_initcall(ioapic_init_ops);  /*   * Dynamic irq allocate and deallocation   */ -unsigned int create_irq_nr(unsigned int from, int node) +unsigned int __create_irqs(unsigned int from, unsigned int count, int node)  { -	struct irq_cfg *cfg; +	struct irq_cfg **cfg;  	unsigned long flags; -	unsigned int ret = 0; -	int irq; +	int irq, i;  	if (from < nr_irqs_gsi)  		from = nr_irqs_gsi; -	irq = alloc_irq_from(from, node); -	if (irq < 0) -		return 0; -	cfg = alloc_irq_cfg(irq, node); -	if (!cfg) { -		free_irq_at(irq, NULL); +	cfg = kzalloc_node(count * sizeof(cfg[0]), GFP_KERNEL, node); +	if (!cfg)  		return 0; + +	irq = alloc_irqs_from(from, count, node); +	if (irq < 0) +		goto out_cfgs; + +	for (i = 0; i < count; i++) { +		cfg[i] = alloc_irq_cfg(irq + i, node); +		if (!cfg[i]) +			goto out_irqs;  	}  	raw_spin_lock_irqsave(&vector_lock, flags); -	if (!__assign_irq_vector(irq, cfg, apic->target_cpus())) -		ret = irq; +	for (i = 0; i < count; i++) +		if (__assign_irq_vector(irq + i, cfg[i], apic->target_cpus())) +			goto out_vecs;  	raw_spin_unlock_irqrestore(&vector_lock, flags); -	if (ret) { -		irq_set_chip_data(irq, cfg); -		irq_clear_status_flags(irq, IRQ_NOREQUEST); -	} else { -		free_irq_at(irq, cfg); +	for (i = 0; i < count; i++) { +		irq_set_chip_data(irq + i, cfg[i]); +		irq_clear_status_flags(irq + i, IRQ_NOREQUEST);  	} -	return ret; + +	kfree(cfg); +	return irq; + +out_vecs: +	for (i--; i >= 0; i--) +		__clear_irq_vector(irq + i, cfg[i]); +	raw_spin_unlock_irqrestore(&vector_lock, flags); +out_irqs: +	for (i = 0; i < count; i++) +		free_irq_at(irq + i, cfg[i]); +out_cfgs: +	kfree(cfg); +	return 0; +} + +unsigned int create_irq_nr(unsigned int from, int node) +{ +	return __create_irqs(from, 1, node);  }  int create_irq(void) @@ -3037,48 +2992,35 @@ void destroy_irq(unsigned int irq)  	irq_set_status_flags(irq, IRQ_NOREQUEST|IRQ_NOPROBE); -	if (irq_remapped(cfg)) -		free_remapped_irq(irq); +	free_remapped_irq(irq); +  	raw_spin_lock_irqsave(&vector_lock, flags);  	__clear_irq_vector(irq, cfg);  	raw_spin_unlock_irqrestore(&vector_lock, flags);  	free_irq_at(irq, cfg);  } +void destroy_irqs(unsigned int irq, unsigned int count) +{ +	unsigned int i; + +	for (i = 0; i < count; i++) +		destroy_irq(irq + i); +} +  /*   * MSI message composition   */ -#ifdef CONFIG_PCI_MSI -static int msi_compose_msg(struct pci_dev *pdev, unsigned int irq, -			   struct msi_msg *msg, u8 hpet_id) +void native_compose_msi_msg(struct pci_dev *pdev, +			    unsigned int irq, unsigned int dest, +			    struct msi_msg *msg, u8 hpet_id)  { -	struct irq_cfg *cfg; -	int err; -	unsigned dest; - -	if (disable_apic) -		return -ENXIO; - -	cfg = irq_cfg(irq); -	err = assign_irq_vector(irq, cfg, apic->target_cpus()); -	if (err) -		return err; +	struct irq_cfg *cfg = irq_cfg(irq); -	err = apic->cpu_mask_to_apicid_and(cfg->domain, -					   apic->target_cpus(), &dest); -	if (err) -		return err; - -	if (irq_remapped(cfg)) { -		compose_remapped_msi_msg(pdev, irq, dest, msg, hpet_id); -		return err; -	} +	msg->address_hi = MSI_ADDR_BASE_HI;  	if (x2apic_enabled()) -		msg->address_hi = MSI_ADDR_BASE_HI | -				  MSI_ADDR_EXT_DEST_ID(dest); -	else -		msg->address_hi = MSI_ADDR_BASE_HI; +		msg->address_hi |= MSI_ADDR_EXT_DEST_ID(dest);  	msg->address_lo =  		MSI_ADDR_BASE_LO | @@ -3097,8 +3039,32 @@ static int msi_compose_msg(struct pci_dev *pdev, unsigned int irq,  			MSI_DATA_DELIVERY_FIXED:  			MSI_DATA_DELIVERY_LOWPRI) |  		MSI_DATA_VECTOR(cfg->vector); +} -	return err; +#ifdef CONFIG_PCI_MSI +static int msi_compose_msg(struct pci_dev *pdev, unsigned int irq, +			   struct msi_msg *msg, u8 hpet_id) +{ +	struct irq_cfg *cfg; +	int err; +	unsigned dest; + +	if (disable_apic) +		return -ENXIO; + +	cfg = irq_cfg(irq); +	err = assign_irq_vector(irq, cfg, apic->target_cpus()); +	if (err) +		return err; + +	err = apic->cpu_mask_to_apicid_and(cfg->domain, +					   apic->target_cpus(), &dest); +	if (err) +		return err; + +	x86_msi.compose_msi_msg(pdev, irq, dest, msg, hpet_id); + +	return 0;  }  static int @@ -3136,23 +3102,28 @@ static struct irq_chip msi_chip = {  	.irq_retrigger		= ioapic_retrigger_irq,  }; -static int setup_msi_irq(struct pci_dev *dev, struct msi_desc *msidesc, int irq) +int setup_msi_irq(struct pci_dev *dev, struct msi_desc *msidesc, +		  unsigned int irq_base, unsigned int irq_offset)  {  	struct irq_chip *chip = &msi_chip;  	struct msi_msg msg; +	unsigned int irq = irq_base + irq_offset;  	int ret;  	ret = msi_compose_msg(dev, irq, &msg, -1);  	if (ret < 0)  		return ret; -	irq_set_msi_desc(irq, msidesc); -	write_msi_msg(irq, &msg); +	irq_set_msi_desc_off(irq_base, irq_offset, msidesc); -	if (irq_remapped(irq_get_chip_data(irq))) { -		irq_set_status_flags(irq, IRQ_MOVE_PCNTXT); -		irq_remap_modify_chip_defaults(chip); -	} +	/* +	 * MSI-X message is written per-IRQ, the offset is always 0. +	 * MSI message denotes a contiguous group of IRQs, written for 0th IRQ. +	 */ +	if (!irq_offset) +		write_msi_msg(irq, &msg); + +	setup_remapped_irq(irq, irq_get_chip_data(irq), chip);  	irq_set_chip_and_handler_name(irq, chip, handle_edge_irq, "edge"); @@ -3163,46 +3134,26 @@ static int setup_msi_irq(struct pci_dev *dev, struct msi_desc *msidesc, int irq)  int native_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)  { -	int node, ret, sub_handle, index = 0;  	unsigned int irq, irq_want;  	struct msi_desc *msidesc; +	int node, ret; -	/* x86 doesn't support multiple MSI yet */ +	/* Multiple MSI vectors only supported with interrupt remapping */  	if (type == PCI_CAP_ID_MSI && nvec > 1)  		return 1;  	node = dev_to_node(&dev->dev);  	irq_want = nr_irqs_gsi; -	sub_handle = 0;  	list_for_each_entry(msidesc, &dev->msi_list, list) {  		irq = create_irq_nr(irq_want, node);  		if (irq == 0) -			return -1; +			return -ENOSPC; +  		irq_want = irq + 1; -		if (!irq_remapping_enabled) -			goto no_ir; -		if (!sub_handle) { -			/* -			 * allocate the consecutive block of IRTE's -			 * for 'nvec' -			 */ -			index = msi_alloc_remapped_irq(dev, irq, nvec); -			if (index < 0) { -				ret = index; -				goto error; -			} -		} else { -			ret = msi_setup_remapped_irq(dev, irq, index, -						     sub_handle); -			if (ret < 0) -				goto error; -		} -no_ir: -		ret = setup_msi_irq(dev, msidesc, irq); +		ret = setup_msi_irq(dev, msidesc, irq, 0);  		if (ret < 0)  			goto error; -		sub_handle++;  	}  	return 0; @@ -3298,26 +3249,19 @@ static struct irq_chip hpet_msi_type = {  	.irq_retrigger = ioapic_retrigger_irq,  }; -int arch_setup_hpet_msi(unsigned int irq, unsigned int id) +int default_setup_hpet_msi(unsigned int irq, unsigned int id)  {  	struct irq_chip *chip = &hpet_msi_type;  	struct msi_msg msg;  	int ret; -	if (irq_remapping_enabled) { -		ret = setup_hpet_msi_remapped(irq, id); -		if (ret) -			return ret; -	} -  	ret = msi_compose_msg(NULL, irq, &msg, id);  	if (ret < 0)  		return ret;  	hpet_msi_write(irq_get_handler_data(irq), &msg);  	irq_set_status_flags(irq, IRQ_MOVE_PCNTXT); -	if (irq_remapped(irq_get_chip_data(irq))) -		irq_remap_modify_chip_defaults(chip); +	setup_remapped_irq(irq, irq_get_chip_data(irq), chip);  	irq_set_chip_and_handler_name(irq, chip, handle_edge_irq, "edge");  	return 0; @@ -3683,10 +3627,7 @@ void __init setup_ioapic_dest(void)  		else  			mask = apic->target_cpus(); -		if (irq_remapping_enabled) -			set_remapped_irq_affinity(idata, mask, false); -		else -			ioapic_set_affinity(idata, mask, false); +		x86_io_apic_ops.set_affinity(idata, mask, false);  	}  } diff --git a/arch/x86/kernel/apic/ipi.c b/arch/x86/kernel/apic/ipi.c index cce91bf2667..7434d8556d0 100644 --- a/arch/x86/kernel/apic/ipi.c +++ b/arch/x86/kernel/apic/ipi.c @@ -106,7 +106,7 @@ void default_send_IPI_mask_logical(const struct cpumask *cpumask, int vector)  	unsigned long mask = cpumask_bits(cpumask)[0];  	unsigned long flags; -	if (WARN_ONCE(!mask, "empty IPI mask")) +	if (!mask)  		return;  	local_irq_save(flags); diff --git a/arch/x86/kernel/apic/x2apic_phys.c b/arch/x86/kernel/apic/x2apic_phys.c index e03a1e180e8..562a76d433c 100644 --- a/arch/x86/kernel/apic/x2apic_phys.c +++ b/arch/x86/kernel/apic/x2apic_phys.c @@ -20,18 +20,19 @@ static int set_x2apic_phys_mode(char *arg)  }  early_param("x2apic_phys", set_x2apic_phys_mode); -static int x2apic_acpi_madt_oem_check(char *oem_id, char *oem_table_id) +static bool x2apic_fadt_phys(void)  { -	if (x2apic_phys) -		return x2apic_enabled(); -	else if ((acpi_gbl_FADT.header.revision >= FADT2_REVISION_ID) && -		(acpi_gbl_FADT.flags & ACPI_FADT_APIC_PHYSICAL) && -		x2apic_enabled()) { +	if ((acpi_gbl_FADT.header.revision >= FADT2_REVISION_ID) && +		(acpi_gbl_FADT.flags & ACPI_FADT_APIC_PHYSICAL)) {  		printk(KERN_DEBUG "System requires x2apic physical mode\n"); -		return 1; +		return true;  	} -	else -		return 0; +	return false; +} + +static int x2apic_acpi_madt_oem_check(char *oem_id, char *oem_table_id) +{ +	return x2apic_enabled() && (x2apic_phys || x2apic_fadt_phys());  }  static void @@ -82,7 +83,7 @@ static void init_x2apic_ldr(void)  static int x2apic_phys_probe(void)  { -	if (x2apic_mode && x2apic_phys) +	if (x2apic_mode && (x2apic_phys || x2apic_fadt_phys()))  		return 1;  	return apic == &apic_x2apic_phys; diff --git a/arch/x86/kernel/apic/x2apic_uv_x.c b/arch/x86/kernel/apic/x2apic_uv_x.c index 8cfade9510a..794f6eb54cd 100644 --- a/arch/x86/kernel/apic/x2apic_uv_x.c +++ b/arch/x86/kernel/apic/x2apic_uv_x.c @@ -5,7 +5,7 @@   *   * SGI UV APIC functions (note: not an Intel compatible APIC)   * - * Copyright (C) 2007-2010 Silicon Graphics, Inc. All rights reserved. + * Copyright (C) 2007-2013 Silicon Graphics, Inc. All rights reserved.   */  #include <linux/cpumask.h>  #include <linux/hardirq.h> @@ -91,10 +91,16 @@ static int __init early_get_pnodeid(void)  	m_n_config.v = uv_early_read_mmr(UVH_RH_GAM_CONFIG_MMR);  	uv_min_hub_revision_id = node_id.s.revision; -	if (node_id.s.part_number == UV2_HUB_PART_NUMBER) -		uv_min_hub_revision_id += UV2_HUB_REVISION_BASE - 1; -	if (node_id.s.part_number == UV2_HUB_PART_NUMBER_X) +	switch (node_id.s.part_number) { +	case UV2_HUB_PART_NUMBER: +	case UV2_HUB_PART_NUMBER_X:  		uv_min_hub_revision_id += UV2_HUB_REVISION_BASE - 1; +		break; +	case UV3_HUB_PART_NUMBER: +	case UV3_HUB_PART_NUMBER_X: +		uv_min_hub_revision_id += UV3_HUB_REVISION_BASE - 1; +		break; +	}  	uv_hub_info->hub_revision = uv_min_hub_revision_id;  	pnode = (node_id.s.node_id >> 1) & ((1 << m_n_config.s.n_skt) - 1); @@ -130,13 +136,16 @@ static void __init uv_set_apicid_hibit(void)  static int __init uv_acpi_madt_oem_check(char *oem_id, char *oem_table_id)  { -	int pnodeid, is_uv1, is_uv2; +	int pnodeid, is_uv1, is_uv2, is_uv3;  	is_uv1 = !strcmp(oem_id, "SGI");  	is_uv2 = !strcmp(oem_id, "SGI2"); -	if (is_uv1 || is_uv2) { +	is_uv3 = !strncmp(oem_id, "SGI3", 4);	/* there are varieties of UV3 */ +	if (is_uv1 || is_uv2 || is_uv3) {  		uv_hub_info->hub_revision = -			is_uv1 ? UV1_HUB_REVISION_BASE : UV2_HUB_REVISION_BASE; +			(is_uv1 ? UV1_HUB_REVISION_BASE : +			(is_uv2 ? UV2_HUB_REVISION_BASE : +				  UV3_HUB_REVISION_BASE));  		pnodeid = early_get_pnodeid();  		early_get_apic_pnode_shift();  		x86_platform.is_untracked_pat_range =  uv_is_untracked_pat_range; @@ -450,14 +459,17 @@ static __init void map_high(char *id, unsigned long base, int pshift,  	paddr = base << pshift;  	bytes = (1UL << bshift) * (max_pnode + 1); -	printk(KERN_INFO "UV: Map %s_HI 0x%lx - 0x%lx\n", id, paddr, -						paddr + bytes); +	if (!paddr) { +		pr_info("UV: Map %s_HI base address NULL\n", id); +		return; +	} +	pr_info("UV: Map %s_HI 0x%lx - 0x%lx\n", id, paddr, paddr + bytes);  	if (map_type == map_uc)  		init_extra_mapping_uc(paddr, bytes);  	else  		init_extra_mapping_wb(paddr, bytes); -  } +  static __init void map_gru_high(int max_pnode)  {  	union uvh_rh_gam_gru_overlay_config_mmr_u gru; @@ -468,7 +480,8 @@ static __init void map_gru_high(int max_pnode)  		map_high("GRU", gru.s.base, shift, shift, max_pnode, map_wb);  		gru_start_paddr = ((u64)gru.s.base << shift);  		gru_end_paddr = gru_start_paddr + (1UL << shift) * (max_pnode + 1); - +	} else { +		pr_info("UV: GRU disabled\n");  	}  } @@ -480,23 +493,146 @@ static __init void map_mmr_high(int max_pnode)  	mmr.v = uv_read_local_mmr(UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR);  	if (mmr.s.enable)  		map_high("MMR", mmr.s.base, shift, shift, max_pnode, map_uc); +	else +		pr_info("UV: MMR disabled\n"); +} + +/* + * This commonality works because both 0 & 1 versions of the MMIOH OVERLAY + * and REDIRECT MMR regs are exactly the same on UV3. + */ +struct mmioh_config { +	unsigned long overlay; +	unsigned long redirect; +	char *id; +}; + +static __initdata struct mmioh_config mmiohs[] = { +	{ +		UV3H_RH_GAM_MMIOH_OVERLAY_CONFIG0_MMR, +		UV3H_RH_GAM_MMIOH_REDIRECT_CONFIG0_MMR, +		"MMIOH0" +	}, +	{ +		UV3H_RH_GAM_MMIOH_OVERLAY_CONFIG1_MMR, +		UV3H_RH_GAM_MMIOH_REDIRECT_CONFIG1_MMR, +		"MMIOH1" +	}, +}; + +static __init void map_mmioh_high_uv3(int index, int min_pnode, int max_pnode) +{ +	union uv3h_rh_gam_mmioh_overlay_config0_mmr_u overlay; +	unsigned long mmr; +	unsigned long base; +	int i, n, shift, m_io, max_io; +	int nasid, lnasid, fi, li; +	char *id; + +	id = mmiohs[index].id; +	overlay.v = uv_read_local_mmr(mmiohs[index].overlay); +	pr_info("UV: %s overlay 0x%lx base:0x%x m_io:%d\n", +		id, overlay.v, overlay.s3.base, overlay.s3.m_io); +	if (!overlay.s3.enable) { +		pr_info("UV: %s disabled\n", id); +		return; +	} + +	shift = UV3H_RH_GAM_MMIOH_OVERLAY_CONFIG0_MMR_BASE_SHFT; +	base = (unsigned long)overlay.s3.base; +	m_io = overlay.s3.m_io; +	mmr = mmiohs[index].redirect; +	n = UV3H_RH_GAM_MMIOH_REDIRECT_CONFIG0_MMR_DEPTH; +	min_pnode *= 2;				/* convert to NASID */ +	max_pnode *= 2; +	max_io = lnasid = fi = li = -1; + +	for (i = 0; i < n; i++) { +		union uv3h_rh_gam_mmioh_redirect_config0_mmr_u redirect; + +		redirect.v = uv_read_local_mmr(mmr + i * 8); +		nasid = redirect.s3.nasid; +		if (nasid < min_pnode || max_pnode < nasid) +			nasid = -1;		/* invalid NASID */ + +		if (nasid == lnasid) { +			li = i; +			if (i != n-1)		/* last entry check */ +				continue; +		} + +		/* check if we have a cached (or last) redirect to print */ +		if (lnasid != -1 || (i == n-1 && nasid != -1))  { +			unsigned long addr1, addr2; +			int f, l; + +			if (lnasid == -1) { +				f = l = i; +				lnasid = nasid; +			} else { +				f = fi; +				l = li; +			} +			addr1 = (base << shift) + +				f * (unsigned long)(1 << m_io); +			addr2 = (base << shift) + +				(l + 1) * (unsigned long)(1 << m_io); +			pr_info("UV: %s[%03d..%03d] NASID 0x%04x ADDR 0x%016lx - 0x%016lx\n", +				id, fi, li, lnasid, addr1, addr2); +			if (max_io < l) +				max_io = l; +		} +		fi = li = i; +		lnasid = nasid; +	} + +	pr_info("UV: %s base:0x%lx shift:%d M_IO:%d MAX_IO:%d\n", +		id, base, shift, m_io, max_io); + +	if (max_io >= 0) +		map_high(id, base, shift, m_io, max_io, map_uc);  } -static __init void map_mmioh_high(int max_pnode) +static __init void map_mmioh_high(int min_pnode, int max_pnode)  {  	union uvh_rh_gam_mmioh_overlay_config_mmr_u mmioh; -	int shift; +	unsigned long mmr, base; +	int shift, enable, m_io, n_io; -	mmioh.v = uv_read_local_mmr(UVH_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR); -	if (is_uv1_hub() && mmioh.s1.enable) { -		shift = UV1H_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR_BASE_SHFT; -		map_high("MMIOH", mmioh.s1.base, shift, mmioh.s1.m_io, -			max_pnode, map_uc); +	if (is_uv3_hub()) { +		/* Map both MMIOH Regions */ +		map_mmioh_high_uv3(0, min_pnode, max_pnode); +		map_mmioh_high_uv3(1, min_pnode, max_pnode); +		return;  	} -	if (is_uv2_hub() && mmioh.s2.enable) { + +	if (is_uv1_hub()) { +		mmr = UV1H_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR; +		shift = UV1H_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR_BASE_SHFT; +		mmioh.v = uv_read_local_mmr(mmr); +		enable = !!mmioh.s1.enable; +		base = mmioh.s1.base; +		m_io = mmioh.s1.m_io; +		n_io = mmioh.s1.n_io; +	} else if (is_uv2_hub()) { +		mmr = UV2H_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR;  		shift = UV2H_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR_BASE_SHFT; -		map_high("MMIOH", mmioh.s2.base, shift, mmioh.s2.m_io, -			max_pnode, map_uc); +		mmioh.v = uv_read_local_mmr(mmr); +		enable = !!mmioh.s2.enable; +		base = mmioh.s2.base; +		m_io = mmioh.s2.m_io; +		n_io = mmioh.s2.n_io; +	} else +		return; + +	if (enable) { +		max_pnode &= (1 << n_io) - 1; +		pr_info( +		    "UV: base:0x%lx shift:%d N_IO:%d M_IO:%d max_pnode:0x%x\n", +			base, shift, m_io, n_io, max_pnode); +		map_high("MMIOH", base, shift, m_io, max_pnode, map_uc); +	} else { +		pr_info("UV: MMIOH disabled\n");  	}  } @@ -724,42 +860,41 @@ void uv_nmi_init(void)  void __init uv_system_init(void)  {  	union uvh_rh_gam_config_mmr_u  m_n_config; -	union uvh_rh_gam_mmioh_overlay_config_mmr_u mmioh;  	union uvh_node_id_u node_id;  	unsigned long gnode_upper, lowmem_redir_base, lowmem_redir_size; -	int bytes, nid, cpu, lcpu, pnode, blade, i, j, m_val, n_val, n_io; -	int gnode_extra, max_pnode = 0; +	int bytes, nid, cpu, lcpu, pnode, blade, i, j, m_val, n_val; +	int gnode_extra, min_pnode = 999999, max_pnode = -1;  	unsigned long mmr_base, present, paddr; -	unsigned short pnode_mask, pnode_io_mask; +	unsigned short pnode_mask; +	char *hub = (is_uv1_hub() ? "UV1" : +		    (is_uv2_hub() ? "UV2" : +				    "UV3")); -	printk(KERN_INFO "UV: Found %s hub\n", is_uv1_hub() ? "UV1" : "UV2"); +	pr_info("UV: Found %s hub\n", hub);  	map_low_mmrs();  	m_n_config.v = uv_read_local_mmr(UVH_RH_GAM_CONFIG_MMR );  	m_val = m_n_config.s.m_skt;  	n_val = m_n_config.s.n_skt; -	mmioh.v = uv_read_local_mmr(UVH_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR); -	n_io = is_uv1_hub() ? mmioh.s1.n_io : mmioh.s2.n_io; +	pnode_mask = (1 << n_val) - 1;  	mmr_base =  	    uv_read_local_mmr(UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR) &  	    ~UV_MMR_ENABLE; -	pnode_mask = (1 << n_val) - 1; -	pnode_io_mask = (1 << n_io) - 1;  	node_id.v = uv_read_local_mmr(UVH_NODE_ID);  	gnode_extra = (node_id.s.node_id & ~((1 << n_val) - 1)) >> 1;  	gnode_upper = ((unsigned long)gnode_extra  << m_val); -	printk(KERN_INFO "UV: N %d, M %d, N_IO: %d, gnode_upper 0x%lx, gnode_extra 0x%x, pnode_mask 0x%x, pnode_io_mask 0x%x\n", -			n_val, m_val, n_io, gnode_upper, gnode_extra, pnode_mask, pnode_io_mask); +	pr_info("UV: N:%d M:%d pnode_mask:0x%x gnode_upper/extra:0x%lx/0x%x\n", +			n_val, m_val, pnode_mask, gnode_upper, gnode_extra); -	printk(KERN_DEBUG "UV: global MMR base 0x%lx\n", mmr_base); +	pr_info("UV: global MMR base 0x%lx\n", mmr_base);  	for(i = 0; i < UVH_NODE_PRESENT_TABLE_DEPTH; i++)  		uv_possible_blades +=  		  hweight64(uv_read_local_mmr( UVH_NODE_PRESENT_TABLE + i * 8));  	/* uv_num_possible_blades() is really the hub count */ -	printk(KERN_INFO "UV: Found %d blades, %d hubs\n", +	pr_info("UV: Found %d blades, %d hubs\n",  			is_uv1_hub() ? uv_num_possible_blades() :  			(uv_num_possible_blades() + 1) / 2,  			uv_num_possible_blades()); @@ -794,6 +929,7 @@ void __init uv_system_init(void)  			uv_blade_info[blade].nr_possible_cpus = 0;  			uv_blade_info[blade].nr_online_cpus = 0;  			spin_lock_init(&uv_blade_info[blade].nmi_lock); +			min_pnode = min(pnode, min_pnode);  			max_pnode = max(pnode, max_pnode);  			blade++;  		} @@ -856,7 +992,7 @@ void __init uv_system_init(void)  	map_gru_high(max_pnode);  	map_mmr_high(max_pnode); -	map_mmioh_high(max_pnode & pnode_io_mask); +	map_mmioh_high(min_pnode, max_pnode);  	uv_cpu_init();  	uv_scir_register_cpu_notifier(); diff --git a/arch/x86/kernel/apm_32.c b/arch/x86/kernel/apm_32.c index d65464e4350..8d7012b7f40 100644 --- a/arch/x86/kernel/apm_32.c +++ b/arch/x86/kernel/apm_32.c @@ -899,6 +899,7 @@ static void apm_cpu_idle(void)  	static int use_apm_idle; /* = 0 */  	static unsigned int last_jiffies; /* = 0 */  	static unsigned int last_stime; /* = 0 */ +	cputime_t stime;  	int apm_idle_done = 0;  	unsigned int jiffies_since_last_check = jiffies - last_jiffies; @@ -906,23 +907,23 @@ static void apm_cpu_idle(void)  	WARN_ONCE(1, "deprecated apm_cpu_idle will be deleted in 2012");  recalc: +	task_cputime(current, NULL, &stime);  	if (jiffies_since_last_check > IDLE_CALC_LIMIT) {  		use_apm_idle = 0; -		last_jiffies = jiffies; -		last_stime = current->stime;  	} else if (jiffies_since_last_check > idle_period) {  		unsigned int idle_percentage; -		idle_percentage = current->stime - last_stime; +		idle_percentage = stime - last_stime;  		idle_percentage *= 100;  		idle_percentage /= jiffies_since_last_check;  		use_apm_idle = (idle_percentage > idle_threshold);  		if (apm_info.forbid_idle)  			use_apm_idle = 0; -		last_jiffies = jiffies; -		last_stime = current->stime;  	} +	last_jiffies = jiffies; +	last_stime = stime; +  	bucket = IDLE_LEAKY_MAX;  	while (!need_resched()) { diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c index 15239fffd6f..782c456eaa0 100644 --- a/arch/x86/kernel/cpu/amd.c +++ b/arch/x86/kernel/cpu/amd.c @@ -364,9 +364,9 @@ static void __cpuinit amd_detect_cmp(struct cpuinfo_x86 *c)  #endif  } -int amd_get_nb_id(int cpu) +u16 amd_get_nb_id(int cpu)  { -	int id = 0; +	u16 id = 0;  #ifdef CONFIG_SMP  	id = per_cpu(cpu_llc_id, cpu);  #endif diff --git a/arch/x86/kernel/cpu/hypervisor.c b/arch/x86/kernel/cpu/hypervisor.c index a8f8fa9769d..1e7e84a02eb 100644 --- a/arch/x86/kernel/cpu/hypervisor.c +++ b/arch/x86/kernel/cpu/hypervisor.c @@ -79,3 +79,10 @@ void __init init_hypervisor_platform(void)  	if (x86_hyper->init_platform)  		x86_hyper->init_platform();  } + +bool __init hypervisor_x2apic_available(void) +{ +	return x86_hyper                   && +	       x86_hyper->x2apic_available && +	       x86_hyper->x2apic_available(); +} diff --git a/arch/x86/kernel/cpu/intel_cacheinfo.c b/arch/x86/kernel/cpu/intel_cacheinfo.c index fe9edec6698..7c6f7d548c0 100644 --- a/arch/x86/kernel/cpu/intel_cacheinfo.c +++ b/arch/x86/kernel/cpu/intel_cacheinfo.c @@ -298,8 +298,7 @@ struct _cache_attr {  			 unsigned int);  }; -#ifdef CONFIG_AMD_NB - +#if defined(CONFIG_AMD_NB) && defined(CONFIG_SYSFS)  /*   * L3 cache descriptors   */ @@ -524,9 +523,9 @@ store_subcaches(struct _cpuid4_info *this_leaf, const char *buf, size_t count,  static struct _cache_attr subcaches =  	__ATTR(subcaches, 0644, show_subcaches, store_subcaches); -#else	/* CONFIG_AMD_NB */ +#else  #define amd_init_l3_cache(x, y) -#endif /* CONFIG_AMD_NB */ +#endif  /* CONFIG_AMD_NB && CONFIG_SYSFS */  static int  __cpuinit cpuid4_cache_lookup_regs(int index, @@ -1227,7 +1226,7 @@ static struct notifier_block __cpuinitdata cacheinfo_cpu_notifier = {  	.notifier_call = cacheinfo_cpu_callback,  }; -static int __cpuinit cache_sysfs_init(void) +static int __init cache_sysfs_init(void)  {  	int i; diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/mce.c index 80dbda84f1c..fc7608a89d9 100644 --- a/arch/x86/kernel/cpu/mcheck/mce.c +++ b/arch/x86/kernel/cpu/mcheck/mce.c @@ -512,11 +512,8 @@ int mce_available(struct cpuinfo_x86 *c)  static void mce_schedule_work(void)  { -	if (!mce_ring_empty()) { -		struct work_struct *work = &__get_cpu_var(mce_work); -		if (!work_pending(work)) -			schedule_work(work); -	} +	if (!mce_ring_empty()) +		schedule_work(&__get_cpu_var(mce_work));  }  DEFINE_PER_CPU(struct irq_work, mce_irq_work); @@ -1351,12 +1348,7 @@ int mce_notify_irq(void)  		/* wake processes polling /dev/mcelog */  		wake_up_interruptible(&mce_chrdev_wait); -		/* -		 * There is no risk of missing notifications because -		 * work_pending is always cleared before the function is -		 * executed. -		 */ -		if (mce_helper[0] && !work_pending(&mce_trigger_work)) +		if (mce_helper[0])  			schedule_work(&mce_trigger_work);  		if (__ratelimit(&ratelimit)) diff --git a/arch/x86/kernel/cpu/mshyperv.c b/arch/x86/kernel/cpu/mshyperv.c index 0a630dd4b62..a7d26d83fb7 100644 --- a/arch/x86/kernel/cpu/mshyperv.c +++ b/arch/x86/kernel/cpu/mshyperv.c @@ -14,10 +14,15 @@  #include <linux/time.h>  #include <linux/clocksource.h>  #include <linux/module.h> +#include <linux/hardirq.h> +#include <linux/interrupt.h>  #include <asm/processor.h>  #include <asm/hypervisor.h>  #include <asm/hyperv.h>  #include <asm/mshyperv.h> +#include <asm/desc.h> +#include <asm/idle.h> +#include <asm/irq_regs.h>  struct ms_hyperv_info ms_hyperv;  EXPORT_SYMBOL_GPL(ms_hyperv); @@ -30,6 +35,13 @@ static bool __init ms_hyperv_platform(void)  	if (!boot_cpu_has(X86_FEATURE_HYPERVISOR))  		return false; +	/* +	 * Xen emulates Hyper-V to support enlightened Windows. +	 * Check to see first if we are on a Xen Hypervisor. +	 */ +	if (xen_cpuid_base()) +		return false; +  	cpuid(HYPERV_CPUID_VENDOR_AND_MAX_FUNCTIONS,  	      &eax, &hyp_signature[0], &hyp_signature[1], &hyp_signature[2]); @@ -68,7 +80,14 @@ static void __init ms_hyperv_init_platform(void)  	printk(KERN_INFO "HyperV: features 0x%x, hints 0x%x\n",  	       ms_hyperv.features, ms_hyperv.hints); -	clocksource_register_hz(&hyperv_cs, NSEC_PER_SEC/100); +	if (ms_hyperv.features & HV_X64_MSR_TIME_REF_COUNT_AVAILABLE) +		clocksource_register_hz(&hyperv_cs, NSEC_PER_SEC/100); +#if IS_ENABLED(CONFIG_HYPERV) +	/* +	 * Setup the IDT for hypervisor callback. +	 */ +	alloc_intr_gate(HYPERVISOR_CALLBACK_VECTOR, hyperv_callback_vector); +#endif  }  const __refconst struct hypervisor_x86 x86_hyper_ms_hyperv = { @@ -77,3 +96,36 @@ const __refconst struct hypervisor_x86 x86_hyper_ms_hyperv = {  	.init_platform		= ms_hyperv_init_platform,  };  EXPORT_SYMBOL(x86_hyper_ms_hyperv); + +#if IS_ENABLED(CONFIG_HYPERV) +static int vmbus_irq = -1; +static irq_handler_t vmbus_isr; + +void hv_register_vmbus_handler(int irq, irq_handler_t handler) +{ +	vmbus_irq = irq; +	vmbus_isr = handler; +} + +void hyperv_vector_handler(struct pt_regs *regs) +{ +	struct pt_regs *old_regs = set_irq_regs(regs); +	struct irq_desc *desc; + +	irq_enter(); +	exit_idle(); + +	desc = irq_to_desc(vmbus_irq); + +	if (desc) +		generic_handle_irq_desc(vmbus_irq, desc); + +	irq_exit(); +	set_irq_regs(old_regs); +} +#else +void hv_register_vmbus_handler(int irq, irq_handler_t handler) +{ +} +#endif +EXPORT_SYMBOL_GPL(hv_register_vmbus_handler); diff --git a/arch/x86/kernel/cpu/perf_event.c b/arch/x86/kernel/cpu/perf_event.c index 4428fd178bc..bf0f01aea99 100644 --- a/arch/x86/kernel/cpu/perf_event.c +++ b/arch/x86/kernel/cpu/perf_event.c @@ -340,9 +340,6 @@ int x86_setup_perfctr(struct perf_event *event)  		/* BTS is currently only allowed for user-mode. */  		if (!attr->exclude_kernel)  			return -EOPNOTSUPP; - -		if (!attr->exclude_guest) -			return -EOPNOTSUPP;  	}  	hwc->config |= config; @@ -385,9 +382,6 @@ int x86_pmu_hw_config(struct perf_event *event)  	if (event->attr.precise_ip) {  		int precise = 0; -		if (!event->attr.exclude_guest) -			return -EOPNOTSUPP; -  		/* Support for constant skid */  		if (x86_pmu.pebs_active && !x86_pmu.pebs_broken) {  			precise++; @@ -835,7 +829,7 @@ static inline void x86_assign_hw_event(struct perf_event *event,  	} else {  		hwc->config_base = x86_pmu_config_addr(hwc->idx);  		hwc->event_base  = x86_pmu_event_addr(hwc->idx); -		hwc->event_base_rdpmc = hwc->idx; +		hwc->event_base_rdpmc = x86_pmu_rdpmc_index(hwc->idx);  	}  } @@ -1316,11 +1310,6 @@ static struct attribute_group x86_pmu_format_group = {  	.attrs = NULL,  }; -struct perf_pmu_events_attr { -	struct device_attribute attr; -	u64 id; -}; -  /*   * Remove all undefined events (x86_pmu.event_map(id) == 0)   * out of events_attr attributes. @@ -1354,11 +1343,9 @@ static ssize_t events_sysfs_show(struct device *dev, struct device_attribute *at  #define EVENT_VAR(_id)  event_attr_##_id  #define EVENT_PTR(_id) &event_attr_##_id.attr.attr -#define EVENT_ATTR(_name, _id)					\ -static struct perf_pmu_events_attr EVENT_VAR(_id) = {		\ -	.attr = __ATTR(_name, 0444, events_sysfs_show, NULL),	\ -	.id   =  PERF_COUNT_HW_##_id,				\ -}; +#define EVENT_ATTR(_name, _id)						\ +	PMU_EVENT_ATTR(_name, EVENT_VAR(_id), PERF_COUNT_HW_##_id,	\ +			events_sysfs_show)  EVENT_ATTR(cpu-cycles,			CPU_CYCLES		);  EVENT_ATTR(instructions,		INSTRUCTIONS		); diff --git a/arch/x86/kernel/cpu/perf_event.h b/arch/x86/kernel/cpu/perf_event.h index 115c1ea9774..7f5c75c2afd 100644 --- a/arch/x86/kernel/cpu/perf_event.h +++ b/arch/x86/kernel/cpu/perf_event.h @@ -325,6 +325,8 @@ struct x86_pmu {  	int		(*schedule_events)(struct cpu_hw_events *cpuc, int n, int *assign);  	unsigned	eventsel;  	unsigned	perfctr; +	int		(*addr_offset)(int index, bool eventsel); +	int		(*rdpmc_index)(int index);  	u64		(*event_map)(int);  	int		max_events;  	int		num_counters; @@ -446,28 +448,21 @@ extern u64 __read_mostly hw_cache_extra_regs  u64 x86_perf_event_update(struct perf_event *event); -static inline int x86_pmu_addr_offset(int index) +static inline unsigned int x86_pmu_config_addr(int index)  { -	int offset; - -	/* offset = X86_FEATURE_PERFCTR_CORE ? index << 1 : index */ -	alternative_io(ASM_NOP2, -		       "shll $1, %%eax", -		       X86_FEATURE_PERFCTR_CORE, -		       "=a" (offset), -		       "a"  (index)); - -	return offset; +	return x86_pmu.eventsel + (x86_pmu.addr_offset ? +				   x86_pmu.addr_offset(index, true) : index);  } -static inline unsigned int x86_pmu_config_addr(int index) +static inline unsigned int x86_pmu_event_addr(int index)  { -	return x86_pmu.eventsel + x86_pmu_addr_offset(index); +	return x86_pmu.perfctr + (x86_pmu.addr_offset ? +				  x86_pmu.addr_offset(index, false) : index);  } -static inline unsigned int x86_pmu_event_addr(int index) +static inline int x86_pmu_rdpmc_index(int index)  { -	return x86_pmu.perfctr + x86_pmu_addr_offset(index); +	return x86_pmu.rdpmc_index ? x86_pmu.rdpmc_index(index) : index;  }  int x86_setup_perfctr(struct perf_event *event); diff --git a/arch/x86/kernel/cpu/perf_event_amd.c b/arch/x86/kernel/cpu/perf_event_amd.c index c93bc4e813a..dfdab42aed2 100644 --- a/arch/x86/kernel/cpu/perf_event_amd.c +++ b/arch/x86/kernel/cpu/perf_event_amd.c @@ -132,21 +132,102 @@ static u64 amd_pmu_event_map(int hw_event)  	return amd_perfmon_event_map[hw_event];  } -static int amd_pmu_hw_config(struct perf_event *event) +static struct event_constraint *amd_nb_event_constraint; + +/* + * Previously calculated offsets + */ +static unsigned int event_offsets[X86_PMC_IDX_MAX] __read_mostly; +static unsigned int count_offsets[X86_PMC_IDX_MAX] __read_mostly; +static unsigned int rdpmc_indexes[X86_PMC_IDX_MAX] __read_mostly; + +/* + * Legacy CPUs: + *   4 counters starting at 0xc0010000 each offset by 1 + * + * CPUs with core performance counter extensions: + *   6 counters starting at 0xc0010200 each offset by 2 + * + * CPUs with north bridge performance counter extensions: + *   4 additional counters starting at 0xc0010240 each offset by 2 + *   (indexed right above either one of the above core counters) + */ +static inline int amd_pmu_addr_offset(int index, bool eventsel)  { -	int ret; +	int offset, first, base; -	/* pass precise event sampling to ibs: */ -	if (event->attr.precise_ip && get_ibs_caps()) -		return -ENOENT; +	if (!index) +		return index; + +	if (eventsel) +		offset = event_offsets[index]; +	else +		offset = count_offsets[index]; + +	if (offset) +		return offset; + +	if (amd_nb_event_constraint && +	    test_bit(index, amd_nb_event_constraint->idxmsk)) { +		/* +		 * calculate the offset of NB counters with respect to +		 * base eventsel or perfctr +		 */ + +		first = find_first_bit(amd_nb_event_constraint->idxmsk, +				       X86_PMC_IDX_MAX); + +		if (eventsel) +			base = MSR_F15H_NB_PERF_CTL - x86_pmu.eventsel; +		else +			base = MSR_F15H_NB_PERF_CTR - x86_pmu.perfctr; + +		offset = base + ((index - first) << 1); +	} else if (!cpu_has_perfctr_core) +		offset = index; +	else +		offset = index << 1; + +	if (eventsel) +		event_offsets[index] = offset; +	else +		count_offsets[index] = offset; + +	return offset; +} + +static inline int amd_pmu_rdpmc_index(int index) +{ +	int ret, first; + +	if (!index) +		return index; + +	ret = rdpmc_indexes[index]; -	ret = x86_pmu_hw_config(event);  	if (ret)  		return ret; -	if (has_branch_stack(event)) -		return -EOPNOTSUPP; +	if (amd_nb_event_constraint && +	    test_bit(index, amd_nb_event_constraint->idxmsk)) { +		/* +		 * according to the mnual, ECX value of the NB counters is +		 * the index of the NB counter (0, 1, 2 or 3) plus 6 +		 */ + +		first = find_first_bit(amd_nb_event_constraint->idxmsk, +				       X86_PMC_IDX_MAX); +		ret = index - first + 6; +	} else +		ret = index; + +	rdpmc_indexes[index] = ret; + +	return ret; +} +static int amd_core_hw_config(struct perf_event *event) +{  	if (event->attr.exclude_host && event->attr.exclude_guest)  		/*  		 * When HO == GO == 1 the hardware treats that as GO == HO == 0 @@ -156,14 +237,37 @@ static int amd_pmu_hw_config(struct perf_event *event)  		event->hw.config &= ~(ARCH_PERFMON_EVENTSEL_USR |  				      ARCH_PERFMON_EVENTSEL_OS);  	else if (event->attr.exclude_host) -		event->hw.config |= AMD_PERFMON_EVENTSEL_GUESTONLY; +		event->hw.config |= AMD64_EVENTSEL_GUESTONLY;  	else if (event->attr.exclude_guest) -		event->hw.config |= AMD_PERFMON_EVENTSEL_HOSTONLY; +		event->hw.config |= AMD64_EVENTSEL_HOSTONLY; + +	return 0; +} + +/* + * NB counters do not support the following event select bits: + *   Host/Guest only + *   Counter mask + *   Invert counter mask + *   Edge detect + *   OS/User mode + */ +static int amd_nb_hw_config(struct perf_event *event) +{ +	/* for NB, we only allow system wide counting mode */ +	if (is_sampling_event(event) || event->attach_state & PERF_ATTACH_TASK) +		return -EINVAL; + +	if (event->attr.exclude_user || event->attr.exclude_kernel || +	    event->attr.exclude_host || event->attr.exclude_guest) +		return -EINVAL; -	if (event->attr.type != PERF_TYPE_RAW) -		return 0; +	event->hw.config &= ~(ARCH_PERFMON_EVENTSEL_USR | +			      ARCH_PERFMON_EVENTSEL_OS); -	event->hw.config |= event->attr.config & AMD64_RAW_EVENT_MASK; +	if (event->hw.config & ~(AMD64_RAW_EVENT_MASK_NB | +				 ARCH_PERFMON_EVENTSEL_INT)) +		return -EINVAL;  	return 0;  } @@ -181,6 +285,11 @@ static inline int amd_is_nb_event(struct hw_perf_event *hwc)  	return (hwc->config & 0xe0) == 0xe0;  } +static inline int amd_is_perfctr_nb_event(struct hw_perf_event *hwc) +{ +	return amd_nb_event_constraint && amd_is_nb_event(hwc); +} +  static inline int amd_has_nb(struct cpu_hw_events *cpuc)  {  	struct amd_nb *nb = cpuc->amd_nb; @@ -188,20 +297,37 @@ static inline int amd_has_nb(struct cpu_hw_events *cpuc)  	return nb && nb->nb_id != -1;  } -static void amd_put_event_constraints(struct cpu_hw_events *cpuc, -				      struct perf_event *event) +static int amd_pmu_hw_config(struct perf_event *event) +{ +	int ret; + +	/* pass precise event sampling to ibs: */ +	if (event->attr.precise_ip && get_ibs_caps()) +		return -ENOENT; + +	if (has_branch_stack(event)) +		return -EOPNOTSUPP; + +	ret = x86_pmu_hw_config(event); +	if (ret) +		return ret; + +	if (event->attr.type == PERF_TYPE_RAW) +		event->hw.config |= event->attr.config & AMD64_RAW_EVENT_MASK; + +	if (amd_is_perfctr_nb_event(&event->hw)) +		return amd_nb_hw_config(event); + +	return amd_core_hw_config(event); +} + +static void __amd_put_nb_event_constraints(struct cpu_hw_events *cpuc, +					   struct perf_event *event)  { -	struct hw_perf_event *hwc = &event->hw;  	struct amd_nb *nb = cpuc->amd_nb;  	int i;  	/* -	 * only care about NB events -	 */ -	if (!(amd_has_nb(cpuc) && amd_is_nb_event(hwc))) -		return; - -	/*  	 * need to scan whole list because event may not have  	 * been assigned during scheduling  	 * @@ -215,6 +341,19 @@ static void amd_put_event_constraints(struct cpu_hw_events *cpuc,  	}  } +static void amd_nb_interrupt_hw_config(struct hw_perf_event *hwc) +{ +	int core_id = cpu_data(smp_processor_id()).cpu_core_id; + +	/* deliver interrupts only to this core */ +	if (hwc->config & ARCH_PERFMON_EVENTSEL_INT) { +		hwc->config |= AMD64_EVENTSEL_INT_CORE_ENABLE; +		hwc->config &= ~AMD64_EVENTSEL_INT_CORE_SEL_MASK; +		hwc->config |= (u64)(core_id) << +			AMD64_EVENTSEL_INT_CORE_SEL_SHIFT; +	} +} +   /*    * AMD64 NorthBridge events need special treatment because    * counter access needs to be synchronized across all cores @@ -247,24 +386,24 @@ static void amd_put_event_constraints(struct cpu_hw_events *cpuc,    *    * Given that resources are allocated (cmpxchg), they must be    * eventually freed for others to use. This is accomplished by -  * calling amd_put_event_constraints(). +  * calling __amd_put_nb_event_constraints()    *    * Non NB events are not impacted by this restriction.    */  static struct event_constraint * -amd_get_event_constraints(struct cpu_hw_events *cpuc, struct perf_event *event) +__amd_get_nb_event_constraints(struct cpu_hw_events *cpuc, struct perf_event *event, +			       struct event_constraint *c)  {  	struct hw_perf_event *hwc = &event->hw;  	struct amd_nb *nb = cpuc->amd_nb; -	struct perf_event *old = NULL; -	int max = x86_pmu.num_counters; -	int i, j, k = -1; +	struct perf_event *old; +	int idx, new = -1; -	/* -	 * if not NB event or no NB, then no constraints -	 */ -	if (!(amd_has_nb(cpuc) && amd_is_nb_event(hwc))) -		return &unconstrained; +	if (!c) +		c = &unconstrained; + +	if (cpuc->is_fake) +		return c;  	/*  	 * detect if already present, if so reuse @@ -276,48 +415,36 @@ amd_get_event_constraints(struct cpu_hw_events *cpuc, struct perf_event *event)  	 * because of successive calls to x86_schedule_events() from  	 * hw_perf_group_sched_in() without hw_perf_enable()  	 */ -	for (i = 0; i < max; i++) { -		/* -		 * keep track of first free slot -		 */ -		if (k == -1 && !nb->owners[i]) -			k = i; +	for_each_set_bit(idx, c->idxmsk, x86_pmu.num_counters) { +		if (new == -1 || hwc->idx == idx) +			/* assign free slot, prefer hwc->idx */ +			old = cmpxchg(nb->owners + idx, NULL, event); +		else if (nb->owners[idx] == event) +			/* event already present */ +			old = event; +		else +			continue; + +		if (old && old != event) +			continue; + +		/* reassign to this slot */ +		if (new != -1) +			cmpxchg(nb->owners + new, event, NULL); +		new = idx;  		/* already present, reuse */ -		if (nb->owners[i] == event) -			goto done; -	} -	/* -	 * not present, so grab a new slot -	 * starting either at: -	 */ -	if (hwc->idx != -1) { -		/* previous assignment */ -		i = hwc->idx; -	} else if (k != -1) { -		/* start from free slot found */ -		i = k; -	} else { -		/* -		 * event not found, no slot found in -		 * first pass, try again from the -		 * beginning -		 */ -		i = 0; -	} -	j = i; -	do { -		old = cmpxchg(nb->owners+i, NULL, event); -		if (!old) +		if (old == event)  			break; -		if (++i == max) -			i = 0; -	} while (i != j); -done: -	if (!old) -		return &nb->event_constraints[i]; +	} + +	if (new == -1) +		return &emptyconstraint; + +	if (amd_is_perfctr_nb_event(hwc)) +		amd_nb_interrupt_hw_config(hwc); -	return &emptyconstraint; +	return &nb->event_constraints[new];  }  static struct amd_nb *amd_alloc_nb(int cpu) @@ -364,7 +491,7 @@ static void amd_pmu_cpu_starting(int cpu)  	struct amd_nb *nb;  	int i, nb_id; -	cpuc->perf_ctr_virt_mask = AMD_PERFMON_EVENTSEL_HOSTONLY; +	cpuc->perf_ctr_virt_mask = AMD64_EVENTSEL_HOSTONLY;  	if (boot_cpu_data.x86_max_cores < 2)  		return; @@ -407,6 +534,26 @@ static void amd_pmu_cpu_dead(int cpu)  	}  } +static struct event_constraint * +amd_get_event_constraints(struct cpu_hw_events *cpuc, struct perf_event *event) +{ +	/* +	 * if not NB event or no NB, then no constraints +	 */ +	if (!(amd_has_nb(cpuc) && amd_is_nb_event(&event->hw))) +		return &unconstrained; + +	return __amd_get_nb_event_constraints(cpuc, event, +					      amd_nb_event_constraint); +} + +static void amd_put_event_constraints(struct cpu_hw_events *cpuc, +				      struct perf_event *event) +{ +	if (amd_has_nb(cpuc) && amd_is_nb_event(&event->hw)) +		__amd_put_nb_event_constraints(cpuc, event); +} +  PMU_FORMAT_ATTR(event,	"config:0-7,32-35");  PMU_FORMAT_ATTR(umask,	"config:8-15"	);  PMU_FORMAT_ATTR(edge,	"config:18"	); @@ -496,6 +643,9 @@ static struct event_constraint amd_f15_PMC30 = EVENT_CONSTRAINT_OVERLAP(0, 0x09,  static struct event_constraint amd_f15_PMC50 = EVENT_CONSTRAINT(0, 0x3F, 0);  static struct event_constraint amd_f15_PMC53 = EVENT_CONSTRAINT(0, 0x38, 0); +static struct event_constraint amd_NBPMC96 = EVENT_CONSTRAINT(0, 0x3C0, 0); +static struct event_constraint amd_NBPMC74 = EVENT_CONSTRAINT(0, 0xF0, 0); +  static struct event_constraint *  amd_get_event_constraints_f15h(struct cpu_hw_events *cpuc, struct perf_event *event)  { @@ -561,8 +711,8 @@ amd_get_event_constraints_f15h(struct cpu_hw_events *cpuc, struct perf_event *ev  			return &amd_f15_PMC20;  		}  	case AMD_EVENT_NB: -		/* not yet implemented */ -		return &emptyconstraint; +		return __amd_get_nb_event_constraints(cpuc, event, +						      amd_nb_event_constraint);  	default:  		return &emptyconstraint;  	} @@ -587,6 +737,8 @@ static __initconst const struct x86_pmu amd_pmu = {  	.schedule_events	= x86_schedule_events,  	.eventsel		= MSR_K7_EVNTSEL0,  	.perfctr		= MSR_K7_PERFCTR0, +	.addr_offset            = amd_pmu_addr_offset, +	.rdpmc_index		= amd_pmu_rdpmc_index,  	.event_map		= amd_pmu_event_map,  	.max_events		= ARRAY_SIZE(amd_perfmon_event_map),  	.num_counters		= AMD64_NUM_COUNTERS, @@ -608,7 +760,7 @@ static __initconst const struct x86_pmu amd_pmu = {  static int setup_event_constraints(void)  { -	if (boot_cpu_data.x86 >= 0x15) +	if (boot_cpu_data.x86 == 0x15)  		x86_pmu.get_event_constraints = amd_get_event_constraints_f15h;  	return 0;  } @@ -638,6 +790,23 @@ static int setup_perfctr_core(void)  	return 0;  } +static int setup_perfctr_nb(void) +{ +	if (!cpu_has_perfctr_nb) +		return -ENODEV; + +	x86_pmu.num_counters += AMD64_NUM_COUNTERS_NB; + +	if (cpu_has_perfctr_core) +		amd_nb_event_constraint = &amd_NBPMC96; +	else +		amd_nb_event_constraint = &amd_NBPMC74; + +	printk(KERN_INFO "perf: AMD northbridge performance counters detected\n"); + +	return 0; +} +  __init int amd_pmu_init(void)  {  	/* Performance-monitoring supported from K7 and later: */ @@ -648,6 +817,7 @@ __init int amd_pmu_init(void)  	setup_event_constraints();  	setup_perfctr_core(); +	setup_perfctr_nb();  	/* Events are common for all AMDs */  	memcpy(hw_cache_event_ids, amd_hw_cache_event_ids, @@ -678,7 +848,7 @@ void amd_pmu_disable_virt(void)  	 * SVM is disabled the Guest-only bits still gets set and the counter  	 * will not count anything.  	 */ -	cpuc->perf_ctr_virt_mask = AMD_PERFMON_EVENTSEL_HOSTONLY; +	cpuc->perf_ctr_virt_mask = AMD64_EVENTSEL_HOSTONLY;  	/* Reload all events */  	x86_pmu_disable_all(); diff --git a/arch/x86/kernel/cpu/perf_event_intel.c b/arch/x86/kernel/cpu/perf_event_intel.c index 93b9e1181f8..4914e94ad6e 100644 --- a/arch/x86/kernel/cpu/perf_event_intel.c +++ b/arch/x86/kernel/cpu/perf_event_intel.c @@ -2019,7 +2019,10 @@ __init int intel_pmu_init(void)  		break;  	case 28: /* Atom */ -	case 54: /* Cedariew */ +	case 38: /* Lincroft */ +	case 39: /* Penwell */ +	case 53: /* Cloverview */ +	case 54: /* Cedarview */  		memcpy(hw_cache_event_ids, atom_hw_cache_event_ids,  		       sizeof(hw_cache_event_ids)); @@ -2084,6 +2087,7 @@ __init int intel_pmu_init(void)  		pr_cont("SandyBridge events, ");  		break;  	case 58: /* IvyBridge */ +	case 62: /* IvyBridge EP */  		memcpy(hw_cache_event_ids, snb_hw_cache_event_ids,  		       sizeof(hw_cache_event_ids));  		memcpy(hw_cache_extra_regs, snb_hw_cache_extra_regs, diff --git a/arch/x86/kernel/cpu/perf_event_intel_uncore.c b/arch/x86/kernel/cpu/perf_event_intel_uncore.c index 3cf3d97cce3..b43200dbfe7 100644 --- a/arch/x86/kernel/cpu/perf_event_intel_uncore.c +++ b/arch/x86/kernel/cpu/perf_event_intel_uncore.c @@ -2500,7 +2500,7 @@ static bool pcidrv_registered;  /*   * add a pci uncore device   */ -static int __devinit uncore_pci_add(struct intel_uncore_type *type, struct pci_dev *pdev) +static int uncore_pci_add(struct intel_uncore_type *type, struct pci_dev *pdev)  {  	struct intel_uncore_pmu *pmu;  	struct intel_uncore_box *box; @@ -2571,8 +2571,8 @@ static void uncore_pci_remove(struct pci_dev *pdev)  	kfree(box);  } -static int __devinit uncore_pci_probe(struct pci_dev *pdev, -				const struct pci_device_id *id) +static int uncore_pci_probe(struct pci_dev *pdev, +			    const struct pci_device_id *id)  {  	struct intel_uncore_type *type; diff --git a/arch/x86/kernel/cpu/perf_event_p6.c b/arch/x86/kernel/cpu/perf_event_p6.c index f2af39f5dc3..4820c232a0b 100644 --- a/arch/x86/kernel/cpu/perf_event_p6.c +++ b/arch/x86/kernel/cpu/perf_event_p6.c @@ -19,7 +19,7 @@ static const u64 p6_perfmon_event_map[] =  }; -static __initconst u64 p6_hw_cache_event_ids +static u64 p6_hw_cache_event_ids  				[PERF_COUNT_HW_CACHE_MAX]  				[PERF_COUNT_HW_CACHE_OP_MAX]  				[PERF_COUNT_HW_CACHE_RESULT_MAX] = diff --git a/arch/x86/kernel/cpu/vmware.c b/arch/x86/kernel/cpu/vmware.c index d22d0c4edcf..03a36321ec5 100644 --- a/arch/x86/kernel/cpu/vmware.c +++ b/arch/x86/kernel/cpu/vmware.c @@ -33,6 +33,9 @@  #define VMWARE_PORT_CMD_GETVERSION	10  #define VMWARE_PORT_CMD_GETHZ		45 +#define VMWARE_PORT_CMD_GETVCPU_INFO	68 +#define VMWARE_PORT_CMD_LEGACY_X2APIC	3 +#define VMWARE_PORT_CMD_VCPU_RESERVED	31  #define VMWARE_PORT(cmd, eax, ebx, ecx, edx)				\  	__asm__("inl (%%dx)" :						\ @@ -125,10 +128,20 @@ static void __cpuinit vmware_set_cpu_features(struct cpuinfo_x86 *c)  	set_cpu_cap(c, X86_FEATURE_TSC_RELIABLE);  } +/* Checks if hypervisor supports x2apic without VT-D interrupt remapping. */ +static bool __init vmware_legacy_x2apic_available(void) +{ +	uint32_t eax, ebx, ecx, edx; +	VMWARE_PORT(GETVCPU_INFO, eax, ebx, ecx, edx); +	return (eax & (1 << VMWARE_PORT_CMD_VCPU_RESERVED)) == 0 && +	       (eax & (1 << VMWARE_PORT_CMD_LEGACY_X2APIC)) != 0; +} +  const __refconst struct hypervisor_x86 x86_hyper_vmware = {  	.name			= "VMware",  	.detect			= vmware_platform,  	.set_cpu_features	= vmware_set_cpu_features,  	.init_platform		= vmware_platform_setup, +	.x2apic_available	= vmware_legacy_x2apic_available,  };  EXPORT_SYMBOL(x86_hyper_vmware); diff --git a/arch/x86/kernel/entry_32.S b/arch/x86/kernel/entry_32.S index ff84d5469d7..8831176aa5e 100644 --- a/arch/x86/kernel/entry_32.S +++ b/arch/x86/kernel/entry_32.S @@ -1065,7 +1065,6 @@ ENTRY(xen_failsafe_callback)  	lea 16(%esp),%esp  	CFI_ADJUST_CFA_OFFSET -16  	jz 5f -	addl $16,%esp  	jmp iret_exc  5:	pushl_cfi $-1 /* orig_ax = -1 => not a system call */  	SAVE_ALL @@ -1092,11 +1091,18 @@ ENTRY(xen_failsafe_callback)  	_ASM_EXTABLE(4b,9b)  ENDPROC(xen_failsafe_callback) -BUILD_INTERRUPT3(xen_hvm_callback_vector, XEN_HVM_EVTCHN_CALLBACK, +BUILD_INTERRUPT3(xen_hvm_callback_vector, HYPERVISOR_CALLBACK_VECTOR,  		xen_evtchn_do_upcall)  #endif	/* CONFIG_XEN */ +#if IS_ENABLED(CONFIG_HYPERV) + +BUILD_INTERRUPT3(hyperv_callback_vector, HYPERVISOR_CALLBACK_VECTOR, +	hyperv_vector_handler) + +#endif /* CONFIG_HYPERV */ +  #ifdef CONFIG_FUNCTION_TRACER  #ifdef CONFIG_DYNAMIC_FTRACE diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S index 07a7a04529b..048f2240f8e 100644 --- a/arch/x86/kernel/entry_64.S +++ b/arch/x86/kernel/entry_64.S @@ -1454,11 +1454,16 @@ ENTRY(xen_failsafe_callback)  	CFI_ENDPROC  END(xen_failsafe_callback) -apicinterrupt XEN_HVM_EVTCHN_CALLBACK \ +apicinterrupt HYPERVISOR_CALLBACK_VECTOR \  	xen_hvm_callback_vector xen_evtchn_do_upcall  #endif /* CONFIG_XEN */ +#if IS_ENABLED(CONFIG_HYPERV) +apicinterrupt HYPERVISOR_CALLBACK_VECTOR \ +	hyperv_callback_vector hyperv_vector_handler +#endif /* CONFIG_HYPERV */ +  /*   * Some functions should be protected against kprobes   */ @@ -1781,6 +1786,7 @@ first_nmi:  	 * Leave room for the "copied" frame  	 */  	subq $(5*8), %rsp +	CFI_ADJUST_CFA_OFFSET 5*8  	/* Copy the stack frame to the Saved frame */  	.rept 5 @@ -1863,10 +1869,8 @@ end_repeat_nmi:  nmi_swapgs:  	SWAPGS_UNSAFE_STACK  nmi_restore: -	RESTORE_ALL 8 - -	/* Pop the extra iret frame */ -	addq $(5*8), %rsp +	/* Pop the extra iret frame at once */ +	RESTORE_ALL 6*8  	/* Clear the NMI executing stack variable */  	movq $0, 5*8(%rsp) diff --git a/arch/x86/kernel/head32.c b/arch/x86/kernel/head32.c index c18f59d1010..6773c918b8c 100644 --- a/arch/x86/kernel/head32.c +++ b/arch/x86/kernel/head32.c @@ -18,6 +18,7 @@  #include <asm/io_apic.h>  #include <asm/bios_ebda.h>  #include <asm/tlbflush.h> +#include <asm/bootparam_utils.h>  static void __init i386_default_early_setup(void)  { @@ -30,6 +31,8 @@ static void __init i386_default_early_setup(void)  void __init i386_start_kernel(void)  { +	sanitize_boot_params(&boot_params); +  	memblock_reserve(__pa_symbol(&_text),  			 __pa_symbol(&__bss_stop) - __pa_symbol(&_text)); diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c index 037df57a99a..849fc9e63c2 100644 --- a/arch/x86/kernel/head64.c +++ b/arch/x86/kernel/head64.c @@ -25,6 +25,7 @@  #include <asm/kdebug.h>  #include <asm/e820.h>  #include <asm/bios_ebda.h> +#include <asm/bootparam_utils.h>  static void __init zap_identity_mappings(void)  { @@ -46,6 +47,7 @@ static void __init copy_bootdata(char *real_mode_data)  	char * command_line;  	memcpy(&boot_params, real_mode_data, sizeof boot_params); +	sanitize_boot_params(&boot_params);  	if (boot_params.hdr.cmd_line_ptr) {  		command_line = __va(boot_params.hdr.cmd_line_ptr);  		memcpy(boot_command_line, command_line, COMMAND_LINE_SIZE); diff --git a/arch/x86/kernel/head_32.S b/arch/x86/kernel/head_32.S index 8e7f6556028..3c3f58a0808 100644 --- a/arch/x86/kernel/head_32.S +++ b/arch/x86/kernel/head_32.S @@ -300,37 +300,52 @@ ENTRY(startup_32_smp)  	leal -__PAGE_OFFSET(%ecx),%esp  default_entry: +#define CR0_STATE	(X86_CR0_PE | X86_CR0_MP | X86_CR0_ET | \ +			 X86_CR0_NE | X86_CR0_WP | X86_CR0_AM | \ +			 X86_CR0_PG) +	movl $(CR0_STATE & ~X86_CR0_PG),%eax +	movl %eax,%cr0 + +/* + * We want to start out with EFLAGS unambiguously cleared. Some BIOSes leave + * bits like NT set. This would confuse the debugger if this code is traced. So + * initialize them properly now before switching to protected mode. That means + * DF in particular (even though we have cleared it earlier after copying the + * command line) because GCC expects it. + */ +	pushl $0 +	popfl +  /* - *	New page tables may be in 4Mbyte page mode and may - *	be using the global pages.  + * New page tables may be in 4Mbyte page mode and may be using the global pages.   * - *	NOTE! If we are on a 486 we may have no cr4 at all! - *	Specifically, cr4 exists if and only if CPUID exists - *	and has flags other than the FPU flag set. + * NOTE! If we are on a 486 we may have no cr4 at all! Specifically, cr4 exists + * if and only if CPUID exists and has flags other than the FPU flag set.   */ +	movl $-1,pa(X86_CPUID)		# preset CPUID level  	movl $X86_EFLAGS_ID,%ecx  	pushl %ecx -	popfl +	popfl				# set EFLAGS=ID  	pushfl -	popl %eax -	pushl $0 -	popfl -	pushfl -	popl %edx -	xorl %edx,%eax -	testl %ecx,%eax -	jz 6f			# No ID flag = no CPUID = no CR4 +	popl %eax			# get EFLAGS +	testl $X86_EFLAGS_ID,%eax	# did EFLAGS.ID remained set? +	jz enable_paging		# hw disallowed setting of ID bit +					# which means no CPUID and no CR4 + +	xorl %eax,%eax +	cpuid +	movl %eax,pa(X86_CPUID)		# save largest std CPUID function  	movl $1,%eax  	cpuid -	andl $~1,%edx		# Ignore CPUID.FPU -	jz 6f			# No flags or only CPUID.FPU = no CR4 +	andl $~1,%edx			# Ignore CPUID.FPU +	jz enable_paging		# No flags or only CPUID.FPU = no CR4  	movl pa(mmu_cr4_features),%eax  	movl %eax,%cr4  	testb $X86_CR4_PAE, %al		# check if PAE is enabled -	jz 6f +	jz enable_paging  	/* Check if extended functions are implemented */  	movl $0x80000000, %eax @@ -338,7 +353,7 @@ default_entry:  	/* Value must be in the range 0x80000001 to 0x8000ffff */  	subl $0x80000001, %eax  	cmpl $(0x8000ffff-0x80000001), %eax -	ja 6f +	ja enable_paging  	/* Clear bogus XD_DISABLE bits */  	call verify_cpu @@ -347,7 +362,7 @@ default_entry:  	cpuid  	/* Execute Disable bit supported? */  	btl $(X86_FEATURE_NX & 31), %edx -	jnc 6f +	jnc enable_paging  	/* Setup EFER (Extended Feature Enable Register) */  	movl $MSR_EFER, %ecx @@ -357,15 +372,14 @@ default_entry:  	/* Make changes effective */  	wrmsr -6: +enable_paging:  /*   * Enable paging   */  	movl $pa(initial_page_table), %eax  	movl %eax,%cr3		/* set the page table pointer.. */ -	movl %cr0,%eax -	orl  $X86_CR0_PG,%eax +	movl $CR0_STATE,%eax  	movl %eax,%cr0		/* ..and set paging (PG) bit */  	ljmp $__BOOT_CS,$1f	/* Clear prefetch and normalize %eip */  1: @@ -373,14 +387,6 @@ default_entry:  	addl $__PAGE_OFFSET, %esp  /* - * Initialize eflags.  Some BIOS's leave bits like NT set.  This would - * confuse the debugger if this code is traced. - * XXX - best to initialize before switching to protected mode. - */ -	pushl $0 -	popfl - -/*   * start system 32-bit setup. We need to re-do some of the things done   * in 16-bit mode for the "real" operations.   */ @@ -389,31 +395,11 @@ default_entry:  	jz 1f				# Did we do this already?  	call *%eax  1: -	 -/* check if it is 486 or 386. */ +  /* - * XXX - this does a lot of unnecessary setup.  Alignment checks don't - * apply at our cpl of 0 and the stack ought to be aligned already, and - * we don't need to preserve eflags. + * Check if it is 486   */ -	movl $-1,X86_CPUID	# -1 for no CPUID initially -	movb $3,X86		# at least 386 -	pushfl			# push EFLAGS -	popl %eax		# get EFLAGS -	movl %eax,%ecx		# save original EFLAGS -	xorl $0x240000,%eax	# flip AC and ID bits in EFLAGS -	pushl %eax		# copy to EFLAGS -	popfl			# set EFLAGS -	pushfl			# get new EFLAGS -	popl %eax		# put it in eax -	xorl %ecx,%eax		# change in flags -	pushl %ecx		# restore original EFLAGS -	popfl -	testl $0x40000,%eax	# check if AC bit changed -	je is386 - -	movb $4,X86		# at least 486 -	testl $0x200000,%eax	# check if ID bit changed +	cmpl $-1,X86_CPUID  	je is486  	/* get vendor info */ @@ -439,11 +425,10 @@ default_entry:  	movb %cl,X86_MASK  	movl %edx,X86_CAPABILITY -is486:	movl $0x50022,%ecx	# set AM, WP, NE and MP -	jmp 2f - -is386:	movl $2,%ecx		# set MP -2:	movl %cr0,%eax +is486: +	movb $4,X86 +	movl $0x50022,%ecx	# set AM, WP, NE and MP +	movl %cr0,%eax  	andl $0x80000011,%eax	# Save PG,PE,ET  	orl %ecx,%eax  	movl %eax,%cr0 @@ -468,7 +453,6 @@ is386:	movl $2,%ecx		# set MP  	xorl %eax,%eax			# Clear LDT  	lldt %ax -	cld			# gcc2 wants the direction flag cleared at all times  	pushl $0		# fake return address for unwinder  	jmp *(initial_code) diff --git a/arch/x86/kernel/hpet.c b/arch/x86/kernel/hpet.c index e28670f9a58..da85a8e830a 100644 --- a/arch/x86/kernel/hpet.c +++ b/arch/x86/kernel/hpet.c @@ -478,7 +478,7 @@ static int hpet_msi_next_event(unsigned long delta,  static int hpet_setup_msi_irq(unsigned int irq)  { -	if (arch_setup_hpet_msi(irq, hpet_blockid)) { +	if (x86_msi.setup_hpet_msi(irq, hpet_blockid)) {  		destroy_irq(irq);  		return -EINVAL;  	} diff --git a/arch/x86/kernel/kprobes/Makefile b/arch/x86/kernel/kprobes/Makefile new file mode 100644 index 00000000000..0d33169cc1a --- /dev/null +++ b/arch/x86/kernel/kprobes/Makefile @@ -0,0 +1,7 @@ +# +# Makefile for kernel probes +# + +obj-$(CONFIG_KPROBES)		+= core.o +obj-$(CONFIG_OPTPROBES)		+= opt.o +obj-$(CONFIG_KPROBES_ON_FTRACE)	+= ftrace.o diff --git a/arch/x86/kernel/kprobes-common.h b/arch/x86/kernel/kprobes/common.h index 3230b68ef29..2e9d4b5af03 100644 --- a/arch/x86/kernel/kprobes-common.h +++ b/arch/x86/kernel/kprobes/common.h @@ -99,4 +99,15 @@ static inline unsigned long __recover_optprobed_insn(kprobe_opcode_t *buf, unsig  	return addr;  }  #endif + +#ifdef CONFIG_KPROBES_ON_FTRACE +extern int skip_singlestep(struct kprobe *p, struct pt_regs *regs, +			   struct kprobe_ctlblk *kcb); +#else +static inline int skip_singlestep(struct kprobe *p, struct pt_regs *regs, +				  struct kprobe_ctlblk *kcb) +{ +	return 0; +} +#endif  #endif diff --git a/arch/x86/kernel/kprobes.c b/arch/x86/kernel/kprobes/core.c index 57916c0d3cf..e124554598e 100644 --- a/arch/x86/kernel/kprobes.c +++ b/arch/x86/kernel/kprobes/core.c @@ -58,7 +58,7 @@  #include <asm/insn.h>  #include <asm/debugreg.h> -#include "kprobes-common.h" +#include "common.h"  void jprobe_return_end(void); @@ -78,7 +78,7 @@ DEFINE_PER_CPU(struct kprobe_ctlblk, kprobe_ctlblk);  	 * Groups, and some special opcodes can not boost.  	 * This is non-const and volatile to keep gcc from statically  	 * optimizing it out, as variable_test_bit makes gcc think only -	 * *(unsigned long*) is used.  +	 * *(unsigned long*) is used.  	 */  static volatile u32 twobyte_is_boostable[256 / 32] = {  	/*      0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f          */ @@ -117,7 +117,7 @@ static void __kprobes __synthesize_relative_insn(void *from, void *to, u8 op)  	struct __arch_relative_insn {  		u8 op;  		s32 raddr; -	} __attribute__((packed)) *insn; +	} __packed *insn;  	insn = (struct __arch_relative_insn *)from;  	insn->raddr = (s32)((long)(to) - ((long)(from) + 5)); @@ -541,23 +541,6 @@ reenter_kprobe(struct kprobe *p, struct pt_regs *regs, struct kprobe_ctlblk *kcb  	return 1;  } -#ifdef KPROBES_CAN_USE_FTRACE -static void __kprobes skip_singlestep(struct kprobe *p, struct pt_regs *regs, -				      struct kprobe_ctlblk *kcb) -{ -	/* -	 * Emulate singlestep (and also recover regs->ip) -	 * as if there is a 5byte nop -	 */ -	regs->ip = (unsigned long)p->addr + MCOUNT_INSN_SIZE; -	if (unlikely(p->post_handler)) { -		kcb->kprobe_status = KPROBE_HIT_SSDONE; -		p->post_handler(p, regs, 0); -	} -	__this_cpu_write(current_kprobe, NULL); -} -#endif -  /*   * Interrupts are disabled on entry as trap3 is an interrupt gate and they   * remain disabled throughout this function. @@ -616,13 +599,8 @@ static int __kprobes kprobe_handler(struct pt_regs *regs)  	} else if (kprobe_running()) {  		p = __this_cpu_read(current_kprobe);  		if (p->break_handler && p->break_handler(p, regs)) { -#ifdef KPROBES_CAN_USE_FTRACE -			if (kprobe_ftrace(p)) { -				skip_singlestep(p, regs, kcb); -				return 1; -			} -#endif -			setup_singlestep(p, regs, kcb, 0); +			if (!skip_singlestep(p, regs, kcb)) +				setup_singlestep(p, regs, kcb, 0);  			return 1;  		}  	} /* else: not a kprobe fault; let the kernel handle it */ @@ -1075,50 +1053,6 @@ int __kprobes longjmp_break_handler(struct kprobe *p, struct pt_regs *regs)  	return 0;  } -#ifdef KPROBES_CAN_USE_FTRACE -/* Ftrace callback handler for kprobes */ -void __kprobes kprobe_ftrace_handler(unsigned long ip, unsigned long parent_ip, -				     struct ftrace_ops *ops, struct pt_regs *regs) -{ -	struct kprobe *p; -	struct kprobe_ctlblk *kcb; -	unsigned long flags; - -	/* Disable irq for emulating a breakpoint and avoiding preempt */ -	local_irq_save(flags); - -	p = get_kprobe((kprobe_opcode_t *)ip); -	if (unlikely(!p) || kprobe_disabled(p)) -		goto end; - -	kcb = get_kprobe_ctlblk(); -	if (kprobe_running()) { -		kprobes_inc_nmissed_count(p); -	} else { -		/* Kprobe handler expects regs->ip = ip + 1 as breakpoint hit */ -		regs->ip = ip + sizeof(kprobe_opcode_t); - -		__this_cpu_write(current_kprobe, p); -		kcb->kprobe_status = KPROBE_HIT_ACTIVE; -		if (!p->pre_handler || !p->pre_handler(p, regs)) -			skip_singlestep(p, regs, kcb); -		/* -		 * If pre_handler returns !0, it sets regs->ip and -		 * resets current kprobe. -		 */ -	} -end: -	local_irq_restore(flags); -} - -int __kprobes arch_prepare_kprobe_ftrace(struct kprobe *p) -{ -	p->ainsn.insn = NULL; -	p->ainsn.boostable = -1; -	return 0; -} -#endif -  int __init arch_init_kprobes(void)  {  	return arch_init_optprobes(); diff --git a/arch/x86/kernel/kprobes/ftrace.c b/arch/x86/kernel/kprobes/ftrace.c new file mode 100644 index 00000000000..23ef5c556f0 --- /dev/null +++ b/arch/x86/kernel/kprobes/ftrace.c @@ -0,0 +1,93 @@ +/* + * Dynamic Ftrace based Kprobes Optimization + * + * 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Copyright (C) Hitachi Ltd., 2012 + */ +#include <linux/kprobes.h> +#include <linux/ptrace.h> +#include <linux/hardirq.h> +#include <linux/preempt.h> +#include <linux/ftrace.h> + +#include "common.h" + +static int __skip_singlestep(struct kprobe *p, struct pt_regs *regs, +			     struct kprobe_ctlblk *kcb) +{ +	/* +	 * Emulate singlestep (and also recover regs->ip) +	 * as if there is a 5byte nop +	 */ +	regs->ip = (unsigned long)p->addr + MCOUNT_INSN_SIZE; +	if (unlikely(p->post_handler)) { +		kcb->kprobe_status = KPROBE_HIT_SSDONE; +		p->post_handler(p, regs, 0); +	} +	__this_cpu_write(current_kprobe, NULL); +	return 1; +} + +int __kprobes skip_singlestep(struct kprobe *p, struct pt_regs *regs, +			      struct kprobe_ctlblk *kcb) +{ +	if (kprobe_ftrace(p)) +		return __skip_singlestep(p, regs, kcb); +	else +		return 0; +} + +/* Ftrace callback handler for kprobes */ +void __kprobes kprobe_ftrace_handler(unsigned long ip, unsigned long parent_ip, +				     struct ftrace_ops *ops, struct pt_regs *regs) +{ +	struct kprobe *p; +	struct kprobe_ctlblk *kcb; +	unsigned long flags; + +	/* Disable irq for emulating a breakpoint and avoiding preempt */ +	local_irq_save(flags); + +	p = get_kprobe((kprobe_opcode_t *)ip); +	if (unlikely(!p) || kprobe_disabled(p)) +		goto end; + +	kcb = get_kprobe_ctlblk(); +	if (kprobe_running()) { +		kprobes_inc_nmissed_count(p); +	} else { +		/* Kprobe handler expects regs->ip = ip + 1 as breakpoint hit */ +		regs->ip = ip + sizeof(kprobe_opcode_t); + +		__this_cpu_write(current_kprobe, p); +		kcb->kprobe_status = KPROBE_HIT_ACTIVE; +		if (!p->pre_handler || !p->pre_handler(p, regs)) +			__skip_singlestep(p, regs, kcb); +		/* +		 * If pre_handler returns !0, it sets regs->ip and +		 * resets current kprobe. +		 */ +	} +end: +	local_irq_restore(flags); +} + +int __kprobes arch_prepare_kprobe_ftrace(struct kprobe *p) +{ +	p->ainsn.insn = NULL; +	p->ainsn.boostable = -1; +	return 0; +} diff --git a/arch/x86/kernel/kprobes-opt.c b/arch/x86/kernel/kprobes/opt.c index c5e410eed40..76dc6f09572 100644 --- a/arch/x86/kernel/kprobes-opt.c +++ b/arch/x86/kernel/kprobes/opt.c @@ -37,7 +37,7 @@  #include <asm/insn.h>  #include <asm/debugreg.h> -#include "kprobes-common.h" +#include "common.h"  unsigned long __recover_optprobed_insn(kprobe_opcode_t *buf, unsigned long addr)  { diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c index 08b973f6403..2b44ea5f269 100644 --- a/arch/x86/kernel/kvm.c +++ b/arch/x86/kernel/kvm.c @@ -43,6 +43,7 @@  #include <asm/apicdef.h>  #include <asm/hypervisor.h>  #include <asm/kvm_guest.h> +#include <asm/context_tracking.h>  static int kvmapf = 1; @@ -121,6 +122,8 @@ void kvm_async_pf_task_wait(u32 token)  	struct kvm_task_sleep_node n, *e;  	DEFINE_WAIT(wait); +	rcu_irq_enter(); +  	spin_lock(&b->lock);  	e = _find_apf_task(b, token);  	if (e) { @@ -128,6 +131,8 @@ void kvm_async_pf_task_wait(u32 token)  		hlist_del(&e->link);  		kfree(e);  		spin_unlock(&b->lock); + +		rcu_irq_exit();  		return;  	} @@ -152,13 +157,16 @@ void kvm_async_pf_task_wait(u32 token)  			/*  			 * We cannot reschedule. So halt.  			 */ +			rcu_irq_exit();  			native_safe_halt(); +			rcu_irq_enter();  			local_irq_disable();  		}  	}  	if (!n.halted)  		finish_wait(&n.wq, &wait); +	rcu_irq_exit();  	return;  }  EXPORT_SYMBOL_GPL(kvm_async_pf_task_wait); @@ -252,10 +260,10 @@ do_async_page_fault(struct pt_regs *regs, unsigned long error_code)  		break;  	case KVM_PV_REASON_PAGE_NOT_PRESENT:  		/* page is swapped out by the host. */ -		rcu_irq_enter(); +		exception_enter(regs);  		exit_idle();  		kvm_async_pf_task_wait((u32)read_cr2()); -		rcu_irq_exit(); +		exception_exit(regs);  		break;  	case KVM_PV_REASON_PAGE_READY:  		rcu_irq_enter(); @@ -497,6 +505,7 @@ static bool __init kvm_detect(void)  const struct hypervisor_x86 x86_hyper_kvm __refconst = {  	.name			= "KVM",  	.detect			= kvm_detect, +	.x2apic_available	= kvm_para_available,  };  EXPORT_SYMBOL_GPL(x86_hyper_kvm); diff --git a/arch/x86/kernel/msr.c b/arch/x86/kernel/msr.c index a7c5661f849..4929502c137 100644 --- a/arch/x86/kernel/msr.c +++ b/arch/x86/kernel/msr.c @@ -174,6 +174,9 @@ static int msr_open(struct inode *inode, struct file *file)  	unsigned int cpu;  	struct cpuinfo_x86 *c; +	if (!capable(CAP_SYS_RAWIO)) +		return -EPERM; +  	cpu = iminor(file->f_path.dentry->d_inode);  	if (cpu >= nr_cpu_ids || !cpu_online(cpu))  		return -ENXIO;	/* No such CPU */ diff --git a/arch/x86/kernel/pci-dma.c b/arch/x86/kernel/pci-dma.c index de2b7ad7027..872079a67e4 100644 --- a/arch/x86/kernel/pci-dma.c +++ b/arch/x86/kernel/pci-dma.c @@ -56,7 +56,7 @@ struct device x86_dma_fallback_dev = {  EXPORT_SYMBOL(x86_dma_fallback_dev);  /* Number of entries preallocated for DMA-API debugging */ -#define PREALLOC_DMA_DEBUG_ENTRIES       32768 +#define PREALLOC_DMA_DEBUG_ENTRIES       65536  int dma_set_mask(struct device *dev, u64 mask)  { @@ -265,7 +265,7 @@ rootfs_initcall(pci_iommu_init);  #ifdef CONFIG_PCI  /* Many VIA bridges seem to corrupt data for DAC. Disable it here */ -static __devinit void via_no_dac(struct pci_dev *dev) +static void via_no_dac(struct pci_dev *dev)  {  	if (forbid_dac == 0) {  		dev_info(&dev->dev, "disabling DAC on VIA PCI bridge\n"); diff --git a/arch/x86/kernel/ptrace.c b/arch/x86/kernel/ptrace.c index b629bbe0d9b..29a8120e6fe 100644 --- a/arch/x86/kernel/ptrace.c +++ b/arch/x86/kernel/ptrace.c @@ -22,7 +22,7 @@  #include <linux/perf_event.h>  #include <linux/hw_breakpoint.h>  #include <linux/rcupdate.h> -#include <linux/module.h> +#include <linux/export.h>  #include <linux/context_tracking.h>  #include <asm/uaccess.h> diff --git a/arch/x86/kernel/quirks.c b/arch/x86/kernel/quirks.c index 1b27de56356..26ee48a33dc 100644 --- a/arch/x86/kernel/quirks.c +++ b/arch/x86/kernel/quirks.c @@ -8,7 +8,7 @@  #if defined(CONFIG_X86_IO_APIC) && defined(CONFIG_SMP) && defined(CONFIG_PCI) -static void __devinit quirk_intel_irqbalance(struct pci_dev *dev) +static void quirk_intel_irqbalance(struct pci_dev *dev)  {  	u8 config;  	u16 word; @@ -512,7 +512,7 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_SBX00_SMBUS,  #if defined(CONFIG_PCI) && defined(CONFIG_NUMA)  /* Set correct numa_node information for AMD NB functions */ -static void __devinit quirk_amd_nb_node(struct pci_dev *dev) +static void quirk_amd_nb_node(struct pci_dev *dev)  {  	struct pci_dev *nb_ht;  	unsigned int devfn; diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c index 4e8ba39eaf0..76fa1e9a2b3 100644 --- a/arch/x86/kernel/reboot.c +++ b/arch/x86/kernel/reboot.c @@ -584,7 +584,7 @@ static void native_machine_emergency_restart(void)  			break;  		case BOOT_EFI: -			if (efi_enabled) +			if (efi_enabled(EFI_RUNTIME_SERVICES))  				efi.reset_system(reboot_mode ?  						 EFI_RESET_WARM :  						 EFI_RESET_COLD, diff --git a/arch/x86/kernel/rtc.c b/arch/x86/kernel/rtc.c index 801602b5d74..2e8f3d3b564 100644 --- a/arch/x86/kernel/rtc.c +++ b/arch/x86/kernel/rtc.c @@ -149,7 +149,6 @@ unsigned long mach_get_cmos_time(void)  	if (century) {  		century = bcd2bin(century);  		year += century * 100; -		printk(KERN_INFO "Extended CMOS year: %d\n", century * 100);  	} else  		year += CMOS_YEARS_OFFS; diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index 23ddd558fbd..8b24289cc10 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c @@ -610,6 +610,83 @@ static __init void reserve_ibft_region(void)  static unsigned reserve_low = CONFIG_X86_RESERVE_LOW << 10; +static bool __init snb_gfx_workaround_needed(void) +{ +#ifdef CONFIG_PCI +	int i; +	u16 vendor, devid; +	static const __initconst u16 snb_ids[] = { +		0x0102, +		0x0112, +		0x0122, +		0x0106, +		0x0116, +		0x0126, +		0x010a, +	}; + +	/* Assume no if something weird is going on with PCI */ +	if (!early_pci_allowed()) +		return false; + +	vendor = read_pci_config_16(0, 2, 0, PCI_VENDOR_ID); +	if (vendor != 0x8086) +		return false; + +	devid = read_pci_config_16(0, 2, 0, PCI_DEVICE_ID); +	for (i = 0; i < ARRAY_SIZE(snb_ids); i++) +		if (devid == snb_ids[i]) +			return true; +#endif + +	return false; +} + +/* + * Sandy Bridge graphics has trouble with certain ranges, exclude + * them from allocation. + */ +static void __init trim_snb_memory(void) +{ +	static const __initconst unsigned long bad_pages[] = { +		0x20050000, +		0x20110000, +		0x20130000, +		0x20138000, +		0x40004000, +	}; +	int i; + +	if (!snb_gfx_workaround_needed()) +		return; + +	printk(KERN_DEBUG "reserving inaccessible SNB gfx pages\n"); + +	/* +	 * Reserve all memory below the 1 MB mark that has not +	 * already been reserved. +	 */ +	memblock_reserve(0, 1<<20); +	 +	for (i = 0; i < ARRAY_SIZE(bad_pages); i++) { +		if (memblock_reserve(bad_pages[i], PAGE_SIZE)) +			printk(KERN_WARNING "failed to reserve 0x%08lx\n", +			       bad_pages[i]); +	} +} + +/* + * Here we put platform-specific memory range workarounds, i.e. + * memory known to be corrupt or otherwise in need to be reserved on + * specific platforms. + * + * If this gets used more widely it could use a real dispatch mechanism. + */ +static void __init trim_platform_memory_ranges(void) +{ +	trim_snb_memory(); +} +  static void __init trim_bios_range(void)  {  	/* @@ -630,6 +707,7 @@ static void __init trim_bios_range(void)  	 * take them out.  	 */  	e820_remove_range(BIOS_BEGIN, BIOS_END - BIOS_BEGIN, E820_RAM, 1); +  	sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &e820.nr_map);  } @@ -729,15 +807,15 @@ void __init setup_arch(char **cmdline_p)  #ifdef CONFIG_EFI  	if (!strncmp((char *)&boot_params.efi_info.efi_loader_signature,  		     "EL32", 4)) { -		efi_enabled = 1; -		efi_64bit = false; +		set_bit(EFI_BOOT, &x86_efi_facility);  	} else if (!strncmp((char *)&boot_params.efi_info.efi_loader_signature,  		     "EL64", 4)) { -		efi_enabled = 1; -		efi_64bit = true; +		set_bit(EFI_BOOT, &x86_efi_facility); +		set_bit(EFI_64BIT, &x86_efi_facility);  	} -	if (efi_enabled && efi_memblock_x86_reserve_range()) -		efi_enabled = 0; + +	if (efi_enabled(EFI_BOOT)) +		efi_memblock_x86_reserve_range();  #endif  	x86_init.oem.arch_setup(); @@ -810,7 +888,7 @@ void __init setup_arch(char **cmdline_p)  	finish_e820_parsing(); -	if (efi_enabled) +	if (efi_enabled(EFI_BOOT))  		efi_init();  	dmi_scan_machine(); @@ -893,7 +971,7 @@ void __init setup_arch(char **cmdline_p)  	 * The EFI specification says that boot service code won't be called  	 * after ExitBootServices(). This is, in fact, a lie.  	 */ -	if (efi_enabled) +	if (efi_enabled(EFI_MEMMAP))  		efi_reserve_boot_services();  	/* preallocate 4k for mptable mpc */ @@ -908,6 +986,8 @@ void __init setup_arch(char **cmdline_p)  	setup_real_mode(); +	trim_platform_memory_ranges(); +  	init_gbpages();  	/* max_pfn_mapped is updated here */ @@ -1034,7 +1114,7 @@ void __init setup_arch(char **cmdline_p)  #ifdef CONFIG_VT  #if defined(CONFIG_VGA_CONSOLE) -	if (!efi_enabled || (efi_mem_type(0xa0000) != EFI_CONVENTIONAL_MEMORY)) +	if (!efi_enabled(EFI_BOOT) || (efi_mem_type(0xa0000) != EFI_CONVENTIONAL_MEMORY))  		conswitchp = &vga_con;  #elif defined(CONFIG_DUMMY_CONSOLE)  	conswitchp = &dummy_con; @@ -1051,14 +1131,14 @@ void __init setup_arch(char **cmdline_p)  	register_refined_jiffies(CLOCK_TICK_RATE);  #ifdef CONFIG_EFI -	/* Once setup is done above, disable efi_enabled on mismatched -	 * firmware/kernel archtectures since there is no support for -	 * runtime services. +	/* Once setup is done above, unmap the EFI memory map on +	 * mismatched firmware/kernel archtectures since there is no +	 * support for runtime services.  	 */ -	if (efi_enabled && IS_ENABLED(CONFIG_X86_64) != efi_64bit) { +	if (efi_enabled(EFI_BOOT) && +	    IS_ENABLED(CONFIG_X86_64) != efi_enabled(EFI_64BIT)) {  		pr_info("efi: Setup done, disabling due to 32/64-bit mismatch\n");  		efi_unmap_memmap(); -		efi_enabled = 0;  	}  #endif  } diff --git a/arch/x86/kernel/step.c b/arch/x86/kernel/step.c index cd3b2438a98..9b4d51d0c0d 100644 --- a/arch/x86/kernel/step.c +++ b/arch/x86/kernel/step.c @@ -165,10 +165,11 @@ void set_task_blockstep(struct task_struct *task, bool on)  	 * Ensure irq/preemption can't change debugctl in between.  	 * Note also that both TIF_BLOCKSTEP and debugctl should  	 * be changed atomically wrt preemption. -	 * FIXME: this means that set/clear TIF_BLOCKSTEP is simply -	 * wrong if task != current, SIGKILL can wakeup the stopped -	 * tracee and set/clear can play with the running task, this -	 * can confuse the next __switch_to_xtra(). +	 * +	 * NOTE: this means that set/clear TIF_BLOCKSTEP is only safe if +	 * task is current or it can't be running, otherwise we can race +	 * with __switch_to_xtra(). We rely on ptrace_freeze_traced() but +	 * PTRACE_KILL is not safe.  	 */  	local_irq_disable();  	debugctl = get_debugctlmsr(); diff --git a/arch/x86/kernel/sys_x86_64.c b/arch/x86/kernel/sys_x86_64.c index 97ef74b88e0..dbded5aedb8 100644 --- a/arch/x86/kernel/sys_x86_64.c +++ b/arch/x86/kernel/sys_x86_64.c @@ -157,7 +157,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,  	if (flags & MAP_FIXED)  		return addr; -	/* for MAP_32BIT mappings we force the legact mmap base */ +	/* for MAP_32BIT mappings we force the legacy mmap base */  	if (!test_thread_flag(TIF_ADDR32) && (flags & MAP_32BIT))  		goto bottomup; diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c index 06ccb5073a3..4b9ea101fe3 100644 --- a/arch/x86/kernel/tsc.c +++ b/arch/x86/kernel/tsc.c @@ -623,7 +623,8 @@ static void set_cyc2ns_scale(unsigned long cpu_khz, int cpu)  	ns_now = __cycles_2_ns(tsc_now);  	if (cpu_khz) { -		*scale = (NSEC_PER_MSEC << CYC2NS_SCALE_FACTOR)/cpu_khz; +		*scale = ((NSEC_PER_MSEC << CYC2NS_SCALE_FACTOR) + +				cpu_khz / 2) / cpu_khz;  		*offset = ns_now - mult_frac(tsc_now, *scale,  					     (1UL << CYC2NS_SCALE_FACTOR));  	} diff --git a/arch/x86/kernel/uprobes.c b/arch/x86/kernel/uprobes.c index c71025b6746..0ba4cfb4f41 100644 --- a/arch/x86/kernel/uprobes.c +++ b/arch/x86/kernel/uprobes.c @@ -680,8 +680,10 @@ static bool __skip_sstep(struct arch_uprobe *auprobe, struct pt_regs *regs)  		if (auprobe->insn[i] == 0x66)  			continue; -		if (auprobe->insn[i] == 0x90) +		if (auprobe->insn[i] == 0x90) { +			regs->ip += i + 1;  			return true; +		}  		break;  	} diff --git a/arch/x86/kernel/x86_init.c b/arch/x86/kernel/x86_init.c index 7a3d075a814..d065d67c267 100644 --- a/arch/x86/kernel/x86_init.c +++ b/arch/x86/kernel/x86_init.c @@ -19,6 +19,7 @@  #include <asm/time.h>  #include <asm/irq.h>  #include <asm/io_apic.h> +#include <asm/hpet.h>  #include <asm/pat.h>  #include <asm/tsc.h>  #include <asm/iommu.h> @@ -111,15 +112,22 @@ struct x86_platform_ops x86_platform = {  EXPORT_SYMBOL_GPL(x86_platform);  struct x86_msi_ops x86_msi = { -	.setup_msi_irqs = native_setup_msi_irqs, -	.teardown_msi_irq = native_teardown_msi_irq, -	.teardown_msi_irqs = default_teardown_msi_irqs, -	.restore_msi_irqs = default_restore_msi_irqs, +	.setup_msi_irqs		= native_setup_msi_irqs, +	.compose_msi_msg	= native_compose_msi_msg, +	.teardown_msi_irq	= native_teardown_msi_irq, +	.teardown_msi_irqs	= default_teardown_msi_irqs, +	.restore_msi_irqs	= default_restore_msi_irqs, +	.setup_hpet_msi		= default_setup_hpet_msi,  };  struct x86_io_apic_ops x86_io_apic_ops = { -	.init	= native_io_apic_init_mappings, -	.read	= native_io_apic_read, -	.write	= native_io_apic_write, -	.modify	= native_io_apic_modify, +	.init			= native_io_apic_init_mappings, +	.read			= native_io_apic_read, +	.write			= native_io_apic_write, +	.modify			= native_io_apic_modify, +	.disable		= native_disable_io_apic, +	.print_entries		= native_io_apic_print_entries, +	.set_affinity		= native_ioapic_set_affinity, +	.setup_entry		= native_setup_ioapic_entry, +	.eoi_ioapic_pin		= native_eoi_ioapic_pin,  }; diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 76f54461f7c..c243b81e3c7 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -120,7 +120,7 @@ struct kvm_shared_msrs {  };  static struct kvm_shared_msrs_global __read_mostly shared_msrs_global; -static DEFINE_PER_CPU(struct kvm_shared_msrs, shared_msrs); +static struct kvm_shared_msrs __percpu *shared_msrs;  struct kvm_stats_debugfs_item debugfs_entries[] = {  	{ "pf_fixed", VCPU_STAT(pf_fixed) }, @@ -191,10 +191,10 @@ static void kvm_on_user_return(struct user_return_notifier *urn)  static void shared_msr_update(unsigned slot, u32 msr)  { -	struct kvm_shared_msrs *smsr;  	u64 value; +	unsigned int cpu = smp_processor_id(); +	struct kvm_shared_msrs *smsr = per_cpu_ptr(shared_msrs, cpu); -	smsr = &__get_cpu_var(shared_msrs);  	/* only read, and nobody should modify it at this time,  	 * so don't need lock */  	if (slot >= shared_msrs_global.nr) { @@ -226,7 +226,8 @@ static void kvm_shared_msr_cpu_online(void)  void kvm_set_shared_msr(unsigned slot, u64 value, u64 mask)  { -	struct kvm_shared_msrs *smsr = &__get_cpu_var(shared_msrs); +	unsigned int cpu = smp_processor_id(); +	struct kvm_shared_msrs *smsr = per_cpu_ptr(shared_msrs, cpu);  	if (((value ^ smsr->values[slot].curr) & mask) == 0)  		return; @@ -242,7 +243,8 @@ EXPORT_SYMBOL_GPL(kvm_set_shared_msr);  static void drop_user_return_notifiers(void *ignore)  { -	struct kvm_shared_msrs *smsr = &__get_cpu_var(shared_msrs); +	unsigned int cpu = smp_processor_id(); +	struct kvm_shared_msrs *smsr = per_cpu_ptr(shared_msrs, cpu);  	if (smsr->registered)  		kvm_on_user_return(&smsr->urn); @@ -5233,9 +5235,16 @@ int kvm_arch_init(void *opaque)  		goto out;  	} +	r = -ENOMEM; +	shared_msrs = alloc_percpu(struct kvm_shared_msrs); +	if (!shared_msrs) { +		printk(KERN_ERR "kvm: failed to allocate percpu kvm_shared_msrs\n"); +		goto out; +	} +  	r = kvm_mmu_module_init();  	if (r) -		goto out; +		goto out_free_percpu;  	kvm_set_mmio_spte_mask();  	kvm_init_msr_list(); @@ -5258,6 +5267,8 @@ int kvm_arch_init(void *opaque)  	return 0; +out_free_percpu: +	free_percpu(shared_msrs);  out:  	return r;  } @@ -5275,6 +5286,7 @@ void kvm_arch_exit(void)  #endif  	kvm_x86_ops = NULL;  	kvm_mmu_module_exit(); +	free_percpu(shared_msrs);  }  int kvm_emulate_halt(struct kvm_vcpu *vcpu) diff --git a/arch/x86/lib/delay.c b/arch/x86/lib/delay.c index e395693abdb..7c3bee636e2 100644 --- a/arch/x86/lib/delay.c +++ b/arch/x86/lib/delay.c @@ -98,7 +98,7 @@ void use_tsc_delay(void)  	delay_fn = delay_tsc;  } -int __devinit read_current_timer(unsigned long *timer_val) +int read_current_timer(unsigned long *timer_val)  {  	if (delay_fn == delay_tsc) {  		rdtscll(*timer_val); diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c index 027088f2f7d..fb674fd3fc2 100644 --- a/arch/x86/mm/fault.c +++ b/arch/x86/mm/fault.c @@ -748,13 +748,15 @@ __bad_area_nosemaphore(struct pt_regs *regs, unsigned long error_code,  				return;  		}  #endif +		/* Kernel addresses are always protection faults: */ +		if (address >= TASK_SIZE) +			error_code |= PF_PROT; -		if (unlikely(show_unhandled_signals)) +		if (likely(show_unhandled_signals))  			show_signal_msg(regs, error_code, address, tsk); -		/* Kernel addresses are always protection faults: */  		tsk->thread.cr2		= address; -		tsk->thread.error_code	= error_code | (address >= TASK_SIZE); +		tsk->thread.error_code	= error_code;  		tsk->thread.trap_nr	= X86_TRAP_PF;  		force_sig_info_fault(SIGSEGV, si_code, address, tsk, 0); diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c index 2ead3c8a4c8..d6eeead4375 100644 --- a/arch/x86/mm/init_64.c +++ b/arch/x86/mm/init_64.c @@ -605,7 +605,7 @@ kernel_physical_mapping_init(unsigned long start,  	}  	if (pgd_changed) -		sync_global_pgds(addr, end); +		sync_global_pgds(addr, end - 1);  	__flush_tlb_all(); @@ -831,6 +831,9 @@ int kern_addr_valid(unsigned long addr)  	if (pud_none(*pud))  		return 0; +	if (pud_large(*pud)) +		return pfn_valid(pud_pfn(*pud)); +  	pmd = pmd_offset(pud, addr);  	if (pmd_none(*pmd))  		return 0; @@ -981,7 +984,7 @@ vmemmap_populate(struct page *start_page, unsigned long size, int node)  		}  	} -	sync_global_pgds((unsigned long)start_page, end); +	sync_global_pgds((unsigned long)start_page, end - 1);  	return 0;  } diff --git a/arch/x86/mm/memtest.c b/arch/x86/mm/memtest.c index c80b9fb9573..8dabbed409e 100644 --- a/arch/x86/mm/memtest.c +++ b/arch/x86/mm/memtest.c @@ -9,6 +9,7 @@  #include <linux/memblock.h>  static u64 patterns[] __initdata = { +	/* The first entry has to be 0 to leave memtest with zeroed memory */  	0,  	0xffffffffffffffffULL,  	0x5555555555555555ULL, @@ -110,15 +111,8 @@ void __init early_memtest(unsigned long start, unsigned long end)  		return;  	printk(KERN_INFO "early_memtest: # of tests: %d\n", memtest_pattern); -	for (i = 0; i < memtest_pattern; i++) { +	for (i = memtest_pattern-1; i < UINT_MAX; --i) {  		idx = i % ARRAY_SIZE(patterns);  		do_one_pass(patterns[idx], start, end);  	} - -	if (idx > 0) { -		printk(KERN_INFO "early_memtest: wipe out " -		       "test pattern from memory\n"); -		/* additional test with pattern 0 will do this */ -		do_one_pass(0, start, end); -	}  } diff --git a/arch/x86/mm/srat.c b/arch/x86/mm/srat.c index 4ddf497ca65..cdd0da9dd53 100644 --- a/arch/x86/mm/srat.c +++ b/arch/x86/mm/srat.c @@ -149,39 +149,40 @@ acpi_numa_memory_affinity_init(struct acpi_srat_mem_affinity *ma)  	int node, pxm;  	if (srat_disabled()) -		return -1; -	if (ma->header.length != sizeof(struct acpi_srat_mem_affinity)) { -		bad_srat(); -		return -1; -	} +		goto out_err; +	if (ma->header.length != sizeof(struct acpi_srat_mem_affinity)) +		goto out_err_bad_srat;  	if ((ma->flags & ACPI_SRAT_MEM_ENABLED) == 0) -		return -1; - +		goto out_err;  	if ((ma->flags & ACPI_SRAT_MEM_HOT_PLUGGABLE) && !save_add_info()) -		return -1; +		goto out_err; +  	start = ma->base_address;  	end = start + ma->length;  	pxm = ma->proximity_domain;  	if (acpi_srat_revision <= 1)  		pxm &= 0xff; +  	node = setup_node(pxm);  	if (node < 0) {  		printk(KERN_ERR "SRAT: Too many proximity domains.\n"); -		bad_srat(); -		return -1; +		goto out_err_bad_srat;  	} -	if (numa_add_memblk(node, start, end) < 0) { -		bad_srat(); -		return -1; -	} +	if (numa_add_memblk(node, start, end) < 0) +		goto out_err_bad_srat;  	node_set(node, numa_nodes_parsed);  	printk(KERN_INFO "SRAT: Node %u PXM %u [mem %#010Lx-%#010Lx]\n",  	       node, pxm,  	       (unsigned long long) start, (unsigned long long) end - 1); +  	return 0; +out_err_bad_srat: +	bad_srat(); +out_err: +	return -1;  }  void __init acpi_numa_arch_fixup(void) {} diff --git a/arch/x86/mm/tlb.c b/arch/x86/mm/tlb.c index 13a6b29e2e5..282375f13c7 100644 --- a/arch/x86/mm/tlb.c +++ b/arch/x86/mm/tlb.c @@ -335,7 +335,7 @@ static const struct file_operations fops_tlbflush = {  	.llseek = default_llseek,  }; -static int __cpuinit create_tlb_flushall_shift(void) +static int __init create_tlb_flushall_shift(void)  {  	debugfs_create_file("tlb_flushall_shift", S_IRUSR | S_IWUSR,  			    arch_debugfs_dir, NULL, &fops_tlbflush); diff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c index 0c01261fe5a..53ea60458e0 100644 --- a/arch/x86/pci/acpi.c +++ b/arch/x86/pci/acpi.c @@ -145,7 +145,7 @@ void __init pci_acpi_crs_quirks(void)  }  #ifdef	CONFIG_PCI_MMCONFIG -static int __devinit check_segment(u16 seg, struct device *dev, char *estr) +static int check_segment(u16 seg, struct device *dev, char *estr)  {  	if (seg) {  		dev_err(dev, @@ -168,9 +168,8 @@ static int __devinit check_segment(u16 seg, struct device *dev, char *estr)  	return 0;  } -static int __devinit setup_mcfg_map(struct pci_root_info *info, -				    u16 seg, u8 start, u8 end, -				    phys_addr_t addr) +static int setup_mcfg_map(struct pci_root_info *info, u16 seg, u8 start, +			  u8 end, phys_addr_t addr)  {  	int result;  	struct device *dev = &info->bridge->dev; @@ -208,7 +207,7 @@ static void teardown_mcfg_map(struct pci_root_info *info)  	}  }  #else -static int __devinit setup_mcfg_map(struct pci_root_info *info, +static int setup_mcfg_map(struct pci_root_info *info,  				    u16 seg, u8 start, u8 end,  				    phys_addr_t addr)  { @@ -474,7 +473,7 @@ probe_pci_root_info(struct pci_root_info *info, struct acpi_device *device,  				info);  } -struct pci_bus * __devinit pci_acpi_scan_root(struct acpi_pci_root *root) +struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root)  {  	struct acpi_device *device = root->device;  	struct pci_root_info *info = NULL; diff --git a/arch/x86/pci/bus_numa.c b/arch/x86/pci/bus_numa.c index d37e2fec97e..c2735feb250 100644 --- a/arch/x86/pci/bus_numa.c +++ b/arch/x86/pci/bus_numa.c @@ -93,8 +93,8 @@ struct pci_root_info __init *alloc_pci_root_info(int bus_min, int bus_max,  	return info;  } -void __devinit update_res(struct pci_root_info *info, resource_size_t start, -			  resource_size_t end, unsigned long flags, int merge) +void update_res(struct pci_root_info *info, resource_size_t start, +		resource_size_t end, unsigned long flags, int merge)  {  	struct resource *res;  	struct pci_root_res *root_res; diff --git a/arch/x86/pci/common.c b/arch/x86/pci/common.c index 412e1286d1f..ccd0ab3ab89 100644 --- a/arch/x86/pci/common.c +++ b/arch/x86/pci/common.c @@ -81,14 +81,14 @@ struct pci_ops pci_root_ops = {   */  DEFINE_RAW_SPINLOCK(pci_config_lock); -static int __devinit can_skip_ioresource_align(const struct dmi_system_id *d) +static int can_skip_ioresource_align(const struct dmi_system_id *d)  {  	pci_probe |= PCI_CAN_SKIP_ISA_ALIGN;  	printk(KERN_INFO "PCI: %s detected, can skip ISA alignment\n", d->ident);  	return 0;  } -static const struct dmi_system_id can_skip_pciprobe_dmi_table[] __devinitconst = { +static const struct dmi_system_id can_skip_pciprobe_dmi_table[] = {  /*   * Systems where PCI IO resource ISA alignment can be skipped   * when the ISA enable bit in the bridge control is not set @@ -125,7 +125,7 @@ void __init dmi_check_skip_isa_align(void)  	dmi_check_system(can_skip_pciprobe_dmi_table);  } -static void __devinit pcibios_fixup_device_resources(struct pci_dev *dev) +static void pcibios_fixup_device_resources(struct pci_dev *dev)  {  	struct resource *rom_r = &dev->resource[PCI_ROM_RESOURCE];  	struct resource *bar_r; @@ -162,7 +162,7 @@ static void __devinit pcibios_fixup_device_resources(struct pci_dev *dev)   *  are examined.   */ -void __devinit pcibios_fixup_bus(struct pci_bus *b) +void pcibios_fixup_bus(struct pci_bus *b)  {  	struct pci_dev *dev; @@ -176,7 +176,7 @@ void __devinit pcibios_fixup_bus(struct pci_bus *b)   * on the kernel command line (which was parsed earlier).   */ -static int __devinit set_bf_sort(const struct dmi_system_id *d) +static int set_bf_sort(const struct dmi_system_id *d)  {  	if (pci_bf_sort == pci_bf_sort_default) {  		pci_bf_sort = pci_dmi_bf; @@ -185,7 +185,7 @@ static int __devinit set_bf_sort(const struct dmi_system_id *d)  	return 0;  } -static void __devinit read_dmi_type_b1(const struct dmi_header *dm, +static void read_dmi_type_b1(const struct dmi_header *dm,  				       void *private_data)  {  	u8 *d = (u8 *)dm + 4; @@ -207,7 +207,7 @@ static void __devinit read_dmi_type_b1(const struct dmi_header *dm,  	}  } -static int __devinit find_sort_method(const struct dmi_system_id *d) +static int find_sort_method(const struct dmi_system_id *d)  {  	dmi_walk(read_dmi_type_b1, NULL); @@ -222,7 +222,7 @@ static int __devinit find_sort_method(const struct dmi_system_id *d)   * Enable renumbering of PCI bus# ranges to reach all PCI busses (Cardbus)   */  #ifdef __i386__ -static int __devinit assign_all_busses(const struct dmi_system_id *d) +static int assign_all_busses(const struct dmi_system_id *d)  {  	pci_probe |= PCI_ASSIGN_ALL_BUSSES;  	printk(KERN_INFO "%s detected: enabling PCI bus# renumbering" @@ -231,7 +231,7 @@ static int __devinit assign_all_busses(const struct dmi_system_id *d)  }  #endif -static int __devinit set_scan_all(const struct dmi_system_id *d) +static int set_scan_all(const struct dmi_system_id *d)  {  	printk(KERN_INFO "PCI: %s detected, enabling pci=pcie_scan_all\n",  	       d->ident); @@ -239,7 +239,7 @@ static int __devinit set_scan_all(const struct dmi_system_id *d)  	return 0;  } -static const struct dmi_system_id __devinitconst pciprobe_dmi_table[] = { +static const struct dmi_system_id pciprobe_dmi_table[] = {  #ifdef __i386__  /*   * Laptops which need pci=assign-busses to see Cardbus cards @@ -446,7 +446,7 @@ void __init dmi_check_pciprobe(void)  	dmi_check_system(pciprobe_dmi_table);  } -struct pci_bus * __devinit pcibios_scan_root(int busnum) +struct pci_bus *pcibios_scan_root(int busnum)  {  	struct pci_bus *bus = NULL; @@ -665,7 +665,7 @@ int pci_ext_cfg_avail(void)  		return 0;  } -struct pci_bus * __devinit pci_scan_bus_on_node(int busno, struct pci_ops *ops, int node) +struct pci_bus *pci_scan_bus_on_node(int busno, struct pci_ops *ops, int node)  {  	LIST_HEAD(resources);  	struct pci_bus *bus = NULL; @@ -693,7 +693,7 @@ struct pci_bus * __devinit pci_scan_bus_on_node(int busno, struct pci_ops *ops,  	return bus;  } -struct pci_bus * __devinit pci_scan_bus_with_sysdata(int busno) +struct pci_bus *pci_scan_bus_with_sysdata(int busno)  {  	return pci_scan_bus_on_node(busno, &pci_root_ops, -1);  } diff --git a/arch/x86/pci/fixup.c b/arch/x86/pci/fixup.c index af8a224db21..f5809fa2753 100644 --- a/arch/x86/pci/fixup.c +++ b/arch/x86/pci/fixup.c @@ -9,7 +9,7 @@  #include <linux/vgaarb.h>  #include <asm/pci_x86.h> -static void __devinit pci_fixup_i450nx(struct pci_dev *d) +static void pci_fixup_i450nx(struct pci_dev *d)  {  	/*  	 * i450NX -- Find and scan all secondary buses on all PXB's. @@ -34,7 +34,7 @@ static void __devinit pci_fixup_i450nx(struct pci_dev *d)  }  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82451NX, pci_fixup_i450nx); -static void __devinit pci_fixup_i450gx(struct pci_dev *d) +static void pci_fixup_i450gx(struct pci_dev *d)  {  	/*  	 * i450GX and i450KX -- Find and scan all secondary buses. @@ -48,7 +48,7 @@ static void __devinit pci_fixup_i450gx(struct pci_dev *d)  }  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82454GX, pci_fixup_i450gx); -static void __devinit  pci_fixup_umc_ide(struct pci_dev *d) +static void pci_fixup_umc_ide(struct pci_dev *d)  {  	/*  	 * UM8886BF IDE controller sets region type bits incorrectly, @@ -62,7 +62,7 @@ static void __devinit  pci_fixup_umc_ide(struct pci_dev *d)  }  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_UMC, PCI_DEVICE_ID_UMC_UM8886BF, pci_fixup_umc_ide); -static void __devinit  pci_fixup_ncr53c810(struct pci_dev *d) +static void pci_fixup_ncr53c810(struct pci_dev *d)  {  	/*  	 * NCR 53C810 returns class code 0 (at least on some systems). @@ -75,7 +75,7 @@ static void __devinit  pci_fixup_ncr53c810(struct pci_dev *d)  }  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NCR, PCI_DEVICE_ID_NCR_53C810, pci_fixup_ncr53c810); -static void __devinit  pci_fixup_latency(struct pci_dev *d) +static void pci_fixup_latency(struct pci_dev *d)  {  	/*  	 *  SiS 5597 and 5598 chipsets require latency timer set to @@ -87,7 +87,7 @@ static void __devinit  pci_fixup_latency(struct pci_dev *d)  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_5597, pci_fixup_latency);  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_5598, pci_fixup_latency); -static void __devinit pci_fixup_piix4_acpi(struct pci_dev *d) +static void pci_fixup_piix4_acpi(struct pci_dev *d)  {  	/*  	 * PIIX4 ACPI device: hardwired IRQ9 @@ -163,7 +163,7 @@ DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8367_0, pci_fixup_   * system to PCI bus no matter what are their window settings, so they are   * "transparent" (or subtractive decoding) from programmers point of view.   */ -static void __devinit pci_fixup_transparent_bridge(struct pci_dev *dev) +static void pci_fixup_transparent_bridge(struct pci_dev *dev)  {  	if ((dev->device & 0xff00) == 0x2400)  		dev->transparent = 1; @@ -317,7 +317,7 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_MCH_PC1,	pcie_r   * video device at this point.   */ -static void __devinit pci_fixup_video(struct pci_dev *pdev) +static void pci_fixup_video(struct pci_dev *pdev)  {  	struct pci_dev *bridge;  	struct pci_bus *bus; @@ -357,7 +357,7 @@ DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_ANY_ID, PCI_ANY_ID,  				PCI_CLASS_DISPLAY_VGA, 8, pci_fixup_video); -static const struct dmi_system_id __devinitconst msi_k8t_dmi_table[] = { +static const struct dmi_system_id msi_k8t_dmi_table[] = {  	{  		.ident = "MSI-K8T-Neo2Fir",  		.matches = { @@ -378,7 +378,7 @@ static const struct dmi_system_id __devinitconst msi_k8t_dmi_table[] = {   * The soundcard is only enabled, if the mainborad is identified   * via DMI-tables and the soundcard is detected to be off.   */ -static void __devinit pci_fixup_msi_k8t_onboard_sound(struct pci_dev *dev) +static void pci_fixup_msi_k8t_onboard_sound(struct pci_dev *dev)  {  	unsigned char val;  	if (!dmi_check_system(msi_k8t_dmi_table)) @@ -414,7 +414,7 @@ DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8237,   */  static u16 toshiba_line_size; -static const struct dmi_system_id __devinitconst toshiba_ohci1394_dmi_table[] = { +static const struct dmi_system_id toshiba_ohci1394_dmi_table[] = {  	{  		.ident = "Toshiba PS5 based laptop",  		.matches = { @@ -439,7 +439,7 @@ static const struct dmi_system_id __devinitconst toshiba_ohci1394_dmi_table[] =  	{ }  }; -static void __devinit pci_pre_fixup_toshiba_ohci1394(struct pci_dev *dev) +static void pci_pre_fixup_toshiba_ohci1394(struct pci_dev *dev)  {  	if (!dmi_check_system(toshiba_ohci1394_dmi_table))  		return; /* only applies to certain Toshibas (so far) */ @@ -450,7 +450,7 @@ static void __devinit pci_pre_fixup_toshiba_ohci1394(struct pci_dev *dev)  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TI, 0x8032,  			 pci_pre_fixup_toshiba_ohci1394); -static void __devinit pci_post_fixup_toshiba_ohci1394(struct pci_dev *dev) +static void pci_post_fixup_toshiba_ohci1394(struct pci_dev *dev)  {  	if (!dmi_check_system(toshiba_ohci1394_dmi_table))  		return; /* only applies to certain Toshibas (so far) */ @@ -488,7 +488,7 @@ DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5530_LEGACY,   * Siemens Nixdorf AG FSC Multiprocessor Interrupt Controller:   * prevent update of the BAR0, which doesn't look like a normal BAR.   */ -static void __devinit pci_siemens_interrupt_controller(struct pci_dev *dev) +static void pci_siemens_interrupt_controller(struct pci_dev *dev)  {  	dev->resource[0].flags |= IORESOURCE_PCI_FIXED;  } @@ -531,7 +531,7 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_ATI, 0x4385, sb600_disable_hpet_bar);   *   * Match off the LPC and svid/sdid (older kernels lose the bridge subvendor)   */ -static void __devinit twinhead_reserve_killing_zone(struct pci_dev *dev) +static void twinhead_reserve_killing_zone(struct pci_dev *dev)  {          if (dev->subsystem_vendor == 0x14FF && dev->subsystem_device == 0xA003) {                  pr_info("Reserving memory on Twinhead H12Y\n"); diff --git a/arch/x86/pci/legacy.c b/arch/x86/pci/legacy.c index a1df191129d..4a2ab9cb365 100644 --- a/arch/x86/pci/legacy.c +++ b/arch/x86/pci/legacy.c @@ -10,7 +10,7 @@   * Discover remaining PCI buses in case there are peer host bridges.   * We use the number of last PCI bus provided by the PCI BIOS.   */ -static void __devinit pcibios_fixup_peer_bridges(void) +static void pcibios_fixup_peer_bridges(void)  {  	int n; @@ -34,7 +34,7 @@ int __init pci_legacy_init(void)  	return 0;  } -void __devinit pcibios_scan_specific_bus(int busn) +void pcibios_scan_specific_bus(int busn)  {  	int devfn;  	long node; diff --git a/arch/x86/pci/mmconfig-shared.c b/arch/x86/pci/mmconfig-shared.c index 704b9ec043d..082e8812971 100644 --- a/arch/x86/pci/mmconfig-shared.c +++ b/arch/x86/pci/mmconfig-shared.c @@ -49,7 +49,7 @@ static __init void free_all_mmcfg(void)  		pci_mmconfig_remove(cfg);  } -static __devinit void list_add_sorted(struct pci_mmcfg_region *new) +static void list_add_sorted(struct pci_mmcfg_region *new)  {  	struct pci_mmcfg_region *cfg; @@ -65,9 +65,8 @@ static __devinit void list_add_sorted(struct pci_mmcfg_region *new)  	list_add_tail_rcu(&new->list, &pci_mmcfg_list);  } -static __devinit struct pci_mmcfg_region *pci_mmconfig_alloc(int segment, -							     int start, -							     int end, u64 addr) +static struct pci_mmcfg_region *pci_mmconfig_alloc(int segment, int start, +						   int end, u64 addr)  {  	struct pci_mmcfg_region *new;  	struct resource *res; @@ -371,8 +370,7 @@ static int __init pci_mmcfg_check_hostbridge(void)  	return !list_empty(&pci_mmcfg_list);  } -static acpi_status __devinit check_mcfg_resource(struct acpi_resource *res, -						 void *data) +static acpi_status check_mcfg_resource(struct acpi_resource *res, void *data)  {  	struct resource *mcfg_res = data;  	struct acpi_resource_address64 address; @@ -408,8 +406,8 @@ static acpi_status __devinit check_mcfg_resource(struct acpi_resource *res,  	return AE_OK;  } -static acpi_status __devinit find_mboard_resource(acpi_handle handle, u32 lvl, -						  void *context, void **rv) +static acpi_status find_mboard_resource(acpi_handle handle, u32 lvl, +					void *context, void **rv)  {  	struct resource *mcfg_res = context; @@ -422,7 +420,7 @@ static acpi_status __devinit find_mboard_resource(acpi_handle handle, u32 lvl,  	return AE_OK;  } -static int __devinit is_acpi_reserved(u64 start, u64 end, unsigned not_used) +static int is_acpi_reserved(u64 start, u64 end, unsigned not_used)  {  	struct resource mcfg_res; @@ -550,8 +548,7 @@ static int __init acpi_mcfg_check_entry(struct acpi_table_mcfg *mcfg,  	if (cfg->address < 0xFFFFFFFF)  		return 0; -	if (!strcmp(mcfg->header.oem_id, "SGI") || -			!strcmp(mcfg->header.oem_id, "SGI2")) +	if (!strncmp(mcfg->header.oem_id, "SGI", 3))  		return 0;  	if (mcfg->header.revision >= 1) { @@ -693,9 +690,8 @@ static int __init pci_mmcfg_late_insert_resources(void)  late_initcall(pci_mmcfg_late_insert_resources);  /* Add MMCFG information for host bridges */ -int __devinit pci_mmconfig_insert(struct device *dev, -				  u16 seg, u8 start, u8 end, -				  phys_addr_t addr) +int pci_mmconfig_insert(struct device *dev, u16 seg, u8 start, u8 end, +			phys_addr_t addr)  {  	int rc;  	struct resource *tmp = NULL; diff --git a/arch/x86/pci/mmconfig_32.c b/arch/x86/pci/mmconfig_32.c index db63ac23e3d..5c90975cdf0 100644 --- a/arch/x86/pci/mmconfig_32.c +++ b/arch/x86/pci/mmconfig_32.c @@ -142,7 +142,7 @@ void __init pci_mmcfg_arch_free(void)  {  } -int __devinit pci_mmcfg_arch_map(struct pci_mmcfg_region *cfg) +int pci_mmcfg_arch_map(struct pci_mmcfg_region *cfg)  {  	return 0;  } diff --git a/arch/x86/pci/mmconfig_64.c b/arch/x86/pci/mmconfig_64.c index d4ebd07c306..bea52496aea 100644 --- a/arch/x86/pci/mmconfig_64.c +++ b/arch/x86/pci/mmconfig_64.c @@ -95,7 +95,7 @@ const struct pci_raw_ops pci_mmcfg = {  	.write =	pci_mmcfg_write,  }; -static void __iomem * __devinit mcfg_ioremap(struct pci_mmcfg_region *cfg) +static void __iomem *mcfg_ioremap(struct pci_mmcfg_region *cfg)  {  	void __iomem *addr;  	u64 start, size; @@ -133,7 +133,7 @@ void __init pci_mmcfg_arch_free(void)  		pci_mmcfg_arch_unmap(cfg);  } -int __devinit pci_mmcfg_arch_map(struct pci_mmcfg_region *cfg) +int pci_mmcfg_arch_map(struct pci_mmcfg_region *cfg)  {  	cfg->virt = mcfg_ioremap(cfg);  	if (!cfg->virt) { diff --git a/arch/x86/pci/mrst.c b/arch/x86/pci/mrst.c index e14a2ff708b..6eb18c42a28 100644 --- a/arch/x86/pci/mrst.c +++ b/arch/x86/pci/mrst.c @@ -247,7 +247,7 @@ int __init pci_mrst_init(void)  /* Langwell devices are not true pci devices, they are not subject to 10 ms   * d3 to d0 delay required by pci spec.   */ -static void __devinit pci_d3delay_fixup(struct pci_dev *dev) +static void pci_d3delay_fixup(struct pci_dev *dev)  {  	/* PCI fixups are effectively decided compile time. If we have a dual  	   SoC/non-SoC kernel we don't want to mangle d3 on non SoC devices */ @@ -262,7 +262,7 @@ static void __devinit pci_d3delay_fixup(struct pci_dev *dev)  }  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_ANY_ID, pci_d3delay_fixup); -static void __devinit mrst_power_off_unused_dev(struct pci_dev *dev) +static void mrst_power_off_unused_dev(struct pci_dev *dev)  {  	pci_set_power_state(dev, PCI_D3hot);  } @@ -275,7 +275,7 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x0815, mrst_power_off_unused_dev);  /*   * Langwell devices reside at fixed offsets, don't try to move them.   */ -static void __devinit pci_fixed_bar_fixup(struct pci_dev *dev) +static void pci_fixed_bar_fixup(struct pci_dev *dev)  {  	unsigned long offset;  	u32 size; diff --git a/arch/x86/pci/numaq_32.c b/arch/x86/pci/numaq_32.c index 83e125b95ca..b96b14c250b 100644 --- a/arch/x86/pci/numaq_32.c +++ b/arch/x86/pci/numaq_32.c @@ -116,7 +116,7 @@ static const struct pci_raw_ops pci_direct_conf1_mq = {  }; -static void __devinit pci_fixup_i450nx(struct pci_dev *d) +static void pci_fixup_i450nx(struct pci_dev *d)  {  	/*  	 * i450NX -- Find and scan all secondary buses on all PXB's. diff --git a/arch/x86/pci/pcbios.c b/arch/x86/pci/pcbios.c index da8fe0535ff..c77b24a8b2d 100644 --- a/arch/x86/pci/pcbios.c +++ b/arch/x86/pci/pcbios.c @@ -124,7 +124,7 @@ static struct {  static int pci_bios_present; -static int __devinit check_pcibios(void) +static int check_pcibios(void)  {  	u32 signature, eax, ebx, ecx;  	u8 status, major_ver, minor_ver, hw_mech; @@ -312,7 +312,7 @@ static const struct pci_raw_ops pci_bios_access = {   * Try to find PCI BIOS.   */ -static const struct pci_raw_ops * __devinit pci_find_bios(void) +static const struct pci_raw_ops *pci_find_bios(void)  {  	union bios32 *check;  	unsigned char sum; diff --git a/arch/x86/platform/Makefile b/arch/x86/platform/Makefile index 8d874396cb2..01e0231a113 100644 --- a/arch/x86/platform/Makefile +++ b/arch/x86/platform/Makefile @@ -2,10 +2,12 @@  obj-y	+= ce4100/  obj-y	+= efi/  obj-y	+= geode/ +obj-y	+= goldfish/  obj-y	+= iris/  obj-y	+= mrst/  obj-y	+= olpc/  obj-y	+= scx200/  obj-y	+= sfi/ +obj-y	+= ts5500/  obj-y	+= visws/  obj-y	+= uv/ diff --git a/arch/x86/platform/efi/efi-bgrt.c b/arch/x86/platform/efi/efi-bgrt.c index d9c1b95af17..7145ec63c52 100644 --- a/arch/x86/platform/efi/efi-bgrt.c +++ b/arch/x86/platform/efi/efi-bgrt.c @@ -11,20 +11,21 @@   * published by the Free Software Foundation.   */  #include <linux/kernel.h> +#include <linux/init.h>  #include <linux/acpi.h>  #include <linux/efi.h>  #include <linux/efi-bgrt.h>  struct acpi_table_bgrt *bgrt_tab; -void *bgrt_image; -size_t bgrt_image_size; +void *__initdata bgrt_image; +size_t __initdata bgrt_image_size;  struct bmp_header {  	u16 id;  	u32 size;  } __packed; -void efi_bgrt_init(void) +void __init efi_bgrt_init(void)  {  	acpi_status status;  	void __iomem *image; diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c index ad4439145f8..928bf837040 100644 --- a/arch/x86/platform/efi/efi.c +++ b/arch/x86/platform/efi/efi.c @@ -51,9 +51,6 @@  #define EFI_DEBUG	1 -int efi_enabled; -EXPORT_SYMBOL(efi_enabled); -  struct efi __read_mostly efi = {  	.mps        = EFI_INVALID_TABLE_ADDR,  	.acpi       = EFI_INVALID_TABLE_ADDR, @@ -69,19 +66,28 @@ EXPORT_SYMBOL(efi);  struct efi_memory_map memmap; -bool efi_64bit; -  static struct efi efi_phys __initdata;  static efi_system_table_t efi_systab __initdata;  static inline bool efi_is_native(void)  { -	return IS_ENABLED(CONFIG_X86_64) == efi_64bit; +	return IS_ENABLED(CONFIG_X86_64) == efi_enabled(EFI_64BIT); +} + +unsigned long x86_efi_facility; + +/* + * Returns 1 if 'facility' is enabled, 0 otherwise. + */ +int efi_enabled(int facility) +{ +	return test_bit(facility, &x86_efi_facility) != 0;  } +EXPORT_SYMBOL(efi_enabled);  static int __init setup_noefi(char *arg)  { -	efi_enabled = 0; +	clear_bit(EFI_RUNTIME_SERVICES, &x86_efi_facility);  	return 0;  }  early_param("noefi", setup_noefi); @@ -426,6 +432,7 @@ void __init efi_reserve_boot_services(void)  void __init efi_unmap_memmap(void)  { +	clear_bit(EFI_MEMMAP, &x86_efi_facility);  	if (memmap.map) {  		early_iounmap(memmap.map, memmap.nr_map * memmap.desc_size);  		memmap.map = NULL; @@ -460,7 +467,7 @@ void __init efi_free_boot_services(void)  static int __init efi_systab_init(void *phys)  { -	if (efi_64bit) { +	if (efi_enabled(EFI_64BIT)) {  		efi_system_table_64_t *systab64;  		u64 tmp = 0; @@ -552,7 +559,7 @@ static int __init efi_config_init(u64 tables, int nr_tables)  	void *config_tables, *tablep;  	int i, sz; -	if (efi_64bit) +	if (efi_enabled(EFI_64BIT))  		sz = sizeof(efi_config_table_64_t);  	else  		sz = sizeof(efi_config_table_32_t); @@ -572,7 +579,7 @@ static int __init efi_config_init(u64 tables, int nr_tables)  		efi_guid_t guid;  		unsigned long table; -		if (efi_64bit) { +		if (efi_enabled(EFI_64BIT)) {  			u64 table64;  			guid = ((efi_config_table_64_t *)tablep)->guid;  			table64 = ((efi_config_table_64_t *)tablep)->table; @@ -684,7 +691,6 @@ void __init efi_init(void)  	if (boot_params.efi_info.efi_systab_hi ||  	    boot_params.efi_info.efi_memmap_hi) {  		pr_info("Table located above 4GB, disabling EFI.\n"); -		efi_enabled = 0;  		return;  	}  	efi_phys.systab = (efi_system_table_t *)boot_params.efi_info.efi_systab; @@ -694,10 +700,10 @@ void __init efi_init(void)  			  ((__u64)boot_params.efi_info.efi_systab_hi<<32));  #endif -	if (efi_systab_init(efi_phys.systab)) { -		efi_enabled = 0; +	if (efi_systab_init(efi_phys.systab))  		return; -	} + +	set_bit(EFI_SYSTEM_TABLES, &x86_efi_facility);  	/*  	 * Show what we know for posterity @@ -715,10 +721,10 @@ void __init efi_init(void)  		efi.systab->hdr.revision >> 16,  		efi.systab->hdr.revision & 0xffff, vendor); -	if (efi_config_init(efi.systab->tables, efi.systab->nr_tables)) { -		efi_enabled = 0; +	if (efi_config_init(efi.systab->tables, efi.systab->nr_tables))  		return; -	} + +	set_bit(EFI_CONFIG_TABLES, &x86_efi_facility);  	/*  	 * Note: We currently don't support runtime services on an EFI @@ -727,15 +733,17 @@ void __init efi_init(void)  	if (!efi_is_native())  		pr_info("No EFI runtime due to 32/64-bit mismatch with kernel\n"); -	else if (efi_runtime_init()) { -		efi_enabled = 0; -		return; +	else { +		if (efi_runtime_init()) +			return; +		set_bit(EFI_RUNTIME_SERVICES, &x86_efi_facility);  	} -	if (efi_memmap_init()) { -		efi_enabled = 0; +	if (efi_memmap_init())  		return; -	} + +	set_bit(EFI_MEMMAP, &x86_efi_facility); +  #ifdef CONFIG_X86_32  	if (efi_is_native()) {  		x86_platform.get_wallclock = efi_get_time; @@ -941,7 +949,7 @@ void __init efi_enter_virtual_mode(void)  	 *  	 * Call EFI services through wrapper functions.  	 */ -	efi.runtime_version = efi_systab.fw_revision; +	efi.runtime_version = efi_systab.hdr.revision;  	efi.get_time = virt_efi_get_time;  	efi.set_time = virt_efi_set_time;  	efi.get_wakeup_time = virt_efi_get_wakeup_time; @@ -969,6 +977,9 @@ u32 efi_mem_type(unsigned long phys_addr)  	efi_memory_desc_t *md;  	void *p; +	if (!efi_enabled(EFI_MEMMAP)) +		return 0; +  	for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) {  		md = p;  		if ((md->phys_addr <= phys_addr) && diff --git a/arch/x86/platform/efi/efi_64.c b/arch/x86/platform/efi/efi_64.c index 95fd505dfeb..2b200386061 100644 --- a/arch/x86/platform/efi/efi_64.c +++ b/arch/x86/platform/efi/efi_64.c @@ -38,7 +38,7 @@  #include <asm/cacheflush.h>  #include <asm/fixmap.h> -static pgd_t save_pgd __initdata; +static pgd_t *save_pgd __initdata;  static unsigned long efi_flags __initdata;  static void __init early_code_mapping_set_exec(int executable) @@ -61,12 +61,20 @@ static void __init early_code_mapping_set_exec(int executable)  void __init efi_call_phys_prelog(void)  {  	unsigned long vaddress; +	int pgd; +	int n_pgds;  	early_code_mapping_set_exec(1);  	local_irq_save(efi_flags); -	vaddress = (unsigned long)__va(0x0UL); -	save_pgd = *pgd_offset_k(0x0UL); -	set_pgd(pgd_offset_k(0x0UL), *pgd_offset_k(vaddress)); + +	n_pgds = DIV_ROUND_UP((max_pfn << PAGE_SHIFT), PGDIR_SIZE); +	save_pgd = kmalloc(n_pgds * sizeof(pgd_t), GFP_KERNEL); + +	for (pgd = 0; pgd < n_pgds; pgd++) { +		save_pgd[pgd] = *pgd_offset_k(pgd * PGDIR_SIZE); +		vaddress = (unsigned long)__va(pgd * PGDIR_SIZE); +		set_pgd(pgd_offset_k(pgd * PGDIR_SIZE), *pgd_offset_k(vaddress)); +	}  	__flush_tlb_all();  } @@ -75,7 +83,11 @@ void __init efi_call_phys_epilog(void)  	/*  	 * After the lock is released, the original page table is restored.  	 */ -	set_pgd(pgd_offset_k(0x0UL), save_pgd); +	int pgd; +	int n_pgds = DIV_ROUND_UP((max_pfn << PAGE_SHIFT) , PGDIR_SIZE); +	for (pgd = 0; pgd < n_pgds; pgd++) +		set_pgd(pgd_offset_k(pgd * PGDIR_SIZE), save_pgd[pgd]); +	kfree(save_pgd);  	__flush_tlb_all();  	local_irq_restore(efi_flags);  	early_code_mapping_set_exec(0); diff --git a/arch/x86/platform/goldfish/Makefile b/arch/x86/platform/goldfish/Makefile new file mode 100644 index 00000000000..f030b532fdf --- /dev/null +++ b/arch/x86/platform/goldfish/Makefile @@ -0,0 +1 @@ +obj-$(CONFIG_GOLDFISH)	+= goldfish.o diff --git a/arch/x86/platform/goldfish/goldfish.c b/arch/x86/platform/goldfish/goldfish.c new file mode 100644 index 00000000000..1693107a518 --- /dev/null +++ b/arch/x86/platform/goldfish/goldfish.c @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2007 Google, Inc. + * Copyright (C) 2011 Intel, Inc. + * Copyright (C) 2013 Intel, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + */ + +#include <linux/kernel.h> +#include <linux/irq.h> +#include <linux/platform_device.h> + +/* + * Where in virtual device memory the IO devices (timers, system controllers + * and so on) + */ + +#define GOLDFISH_PDEV_BUS_BASE	(0xff001000) +#define GOLDFISH_PDEV_BUS_END	(0xff7fffff) +#define GOLDFISH_PDEV_BUS_IRQ	(4) + +#define GOLDFISH_TTY_BASE	(0x2000) + +static struct resource goldfish_pdev_bus_resources[] = { +	{ +		.start  = GOLDFISH_PDEV_BUS_BASE, +		.end    = GOLDFISH_PDEV_BUS_END, +		.flags  = IORESOURCE_MEM, +	}, +	{ +		.start	= GOLDFISH_PDEV_BUS_IRQ, +		.end	= GOLDFISH_PDEV_BUS_IRQ, +		.flags	= IORESOURCE_IRQ, +	} +}; + +static int __init goldfish_init(void) +{ +	platform_device_register_simple("goldfish_pdev_bus", -1, +						goldfish_pdev_bus_resources, 2); +	return 0; +} +device_initcall(goldfish_init); diff --git a/arch/x86/platform/mrst/mrst.c b/arch/x86/platform/mrst/mrst.c index fd41a9262d6..e31bcd8f2ee 100644 --- a/arch/x86/platform/mrst/mrst.c +++ b/arch/x86/platform/mrst/mrst.c @@ -782,7 +782,7 @@ BLOCKING_NOTIFIER_HEAD(intel_scu_notifier);  EXPORT_SYMBOL_GPL(intel_scu_notifier);  /* Called by IPC driver */ -void __devinit intel_scu_devices_create(void) +void intel_scu_devices_create(void)  {  	int i; diff --git a/arch/x86/platform/olpc/olpc-xo1-pm.c b/arch/x86/platform/olpc/olpc-xo1-pm.c index d75582d1aa5..ff0174dda81 100644 --- a/arch/x86/platform/olpc/olpc-xo1-pm.c +++ b/arch/x86/platform/olpc/olpc-xo1-pm.c @@ -121,7 +121,7 @@ static const struct platform_suspend_ops xo1_suspend_ops = {  	.enter = xo1_power_state_enter,  }; -static int __devinit xo1_pm_probe(struct platform_device *pdev) +static int xo1_pm_probe(struct platform_device *pdev)  {  	struct resource *res;  	int err; @@ -154,7 +154,7 @@ static int __devinit xo1_pm_probe(struct platform_device *pdev)  	return 0;  } -static int __devexit xo1_pm_remove(struct platform_device *pdev) +static int xo1_pm_remove(struct platform_device *pdev)  {  	mfd_cell_disable(pdev); @@ -173,7 +173,7 @@ static struct platform_driver cs5535_pms_driver = {  		.owner = THIS_MODULE,  	},  	.probe = xo1_pm_probe, -	.remove = __devexit_p(xo1_pm_remove), +	.remove = xo1_pm_remove,  };  static struct platform_driver cs5535_acpi_driver = { @@ -182,7 +182,7 @@ static struct platform_driver cs5535_acpi_driver = {  		.owner = THIS_MODULE,  	},  	.probe = xo1_pm_probe, -	.remove = __devexit_p(xo1_pm_remove), +	.remove = xo1_pm_remove,  };  static int __init xo1_pm_init(void) diff --git a/arch/x86/platform/olpc/olpc-xo1-sci.c b/arch/x86/platform/olpc/olpc-xo1-sci.c index 63d4aa40956..74704be7b1f 100644 --- a/arch/x86/platform/olpc/olpc-xo1-sci.c +++ b/arch/x86/platform/olpc/olpc-xo1-sci.c @@ -309,7 +309,7 @@ static int xo1_sci_resume(struct platform_device *pdev)  	return 0;  } -static int __devinit setup_sci_interrupt(struct platform_device *pdev) +static int setup_sci_interrupt(struct platform_device *pdev)  {  	u32 lo, hi;  	u32 sts; @@ -351,7 +351,7 @@ static int __devinit setup_sci_interrupt(struct platform_device *pdev)  	return r;  } -static int __devinit setup_ec_sci(void) +static int setup_ec_sci(void)  {  	int r; @@ -395,7 +395,7 @@ static void free_ec_sci(void)  	gpio_free(OLPC_GPIO_ECSCI);  } -static int __devinit setup_lid_events(void) +static int setup_lid_events(void)  {  	int r; @@ -432,7 +432,7 @@ static void free_lid_events(void)  	gpio_free(OLPC_GPIO_LID);  } -static int __devinit setup_power_button(struct platform_device *pdev) +static int setup_power_button(struct platform_device *pdev)  {  	int r; @@ -463,7 +463,7 @@ static void free_power_button(void)  	input_free_device(power_button_idev);  } -static int __devinit setup_ebook_switch(struct platform_device *pdev) +static int setup_ebook_switch(struct platform_device *pdev)  {  	int r; @@ -494,7 +494,7 @@ static void free_ebook_switch(void)  	input_free_device(ebook_switch_idev);  } -static int __devinit setup_lid_switch(struct platform_device *pdev) +static int setup_lid_switch(struct platform_device *pdev)  {  	int r; @@ -538,7 +538,7 @@ static void free_lid_switch(void)  	input_free_device(lid_switch_idev);  } -static int __devinit xo1_sci_probe(struct platform_device *pdev) +static int xo1_sci_probe(struct platform_device *pdev)  {  	struct resource *res;  	int r; @@ -613,7 +613,7 @@ err_ebook:  	return r;  } -static int __devexit xo1_sci_remove(struct platform_device *pdev) +static int xo1_sci_remove(struct platform_device *pdev)  {  	mfd_cell_disable(pdev);  	free_irq(sci_irq, pdev); @@ -632,7 +632,7 @@ static struct platform_driver xo1_sci_driver = {  		.name = "olpc-xo1-sci-acpi",  	},  	.probe = xo1_sci_probe, -	.remove = __devexit_p(xo1_sci_remove), +	.remove = xo1_sci_remove,  	.suspend = xo1_sci_suspend,  	.resume = xo1_sci_resume,  }; diff --git a/arch/x86/platform/scx200/scx200_32.c b/arch/x86/platform/scx200/scx200_32.c index 7a9ad30d6c9..3dc9aee41d9 100644 --- a/arch/x86/platform/scx200/scx200_32.c +++ b/arch/x86/platform/scx200/scx200_32.c @@ -35,7 +35,7 @@ static struct pci_device_id scx200_tbl[] = {  };  MODULE_DEVICE_TABLE(pci,scx200_tbl); -static int __devinit scx200_probe(struct pci_dev *, const struct pci_device_id *); +static int scx200_probe(struct pci_dev *, const struct pci_device_id *);  static struct pci_driver scx200_pci_driver = {  	.name = "scx200", @@ -45,7 +45,7 @@ static struct pci_driver scx200_pci_driver = {  static DEFINE_MUTEX(scx200_gpio_config_lock); -static void __devinit scx200_init_shadow(void) +static void scx200_init_shadow(void)  {  	int bank; @@ -54,7 +54,7 @@ static void __devinit scx200_init_shadow(void)  		scx200_gpio_shadow[bank] = inl(scx200_gpio_base + 0x10 * bank);  } -static int __devinit scx200_probe(struct pci_dev *pdev, const struct pci_device_id *ent) +static int scx200_probe(struct pci_dev *pdev, const struct pci_device_id *ent)  {  	unsigned base; diff --git a/arch/x86/platform/sfi/sfi.c b/arch/x86/platform/sfi/sfi.c index 7785b72ecc3..bcd1a703e3e 100644 --- a/arch/x86/platform/sfi/sfi.c +++ b/arch/x86/platform/sfi/sfi.c @@ -35,7 +35,7 @@  static unsigned long sfi_lapic_addr __initdata = APIC_DEFAULT_PHYS_BASE;  /* All CPUs enumerated by SFI must be present and enabled */ -static void __cpuinit mp_sfi_register_lapic(u8 id) +static void __init mp_sfi_register_lapic(u8 id)  {  	if (MAX_LOCAL_APIC - id <= 0) {  		pr_warning("Processor #%d invalid (max %d)\n", diff --git a/arch/x86/platform/ts5500/Makefile b/arch/x86/platform/ts5500/Makefile new file mode 100644 index 00000000000..c54e348c96a --- /dev/null +++ b/arch/x86/platform/ts5500/Makefile @@ -0,0 +1 @@ +obj-$(CONFIG_TS5500)	+= ts5500.o diff --git a/arch/x86/platform/ts5500/ts5500.c b/arch/x86/platform/ts5500/ts5500.c new file mode 100644 index 00000000000..39febb214e8 --- /dev/null +++ b/arch/x86/platform/ts5500/ts5500.c @@ -0,0 +1,339 @@ +/* + * Technologic Systems TS-5500 Single Board Computer support + * + * Copyright (C) 2013 Savoir-faire Linux Inc. + *	Vivien Didelot <vivien.didelot@savoirfairelinux.com> + * + * 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. + * + * + * This driver registers the Technologic Systems TS-5500 Single Board Computer + * (SBC) and its devices, and exposes information to userspace such as jumpers' + * state or available options. For further information about sysfs entries, see + * Documentation/ABI/testing/sysfs-platform-ts5500. + * + * This code actually supports the TS-5500 platform, but it may be extended to + * support similar Technologic Systems x86-based platforms, such as the TS-5600. + */ + +#include <linux/delay.h> +#include <linux/io.h> +#include <linux/kernel.h> +#include <linux/leds.h> +#include <linux/module.h> +#include <linux/platform_data/gpio-ts5500.h> +#include <linux/platform_data/max197.h> +#include <linux/platform_device.h> +#include <linux/slab.h> + +/* Product code register */ +#define TS5500_PRODUCT_CODE_ADDR	0x74 +#define TS5500_PRODUCT_CODE		0x60	/* TS-5500 product code */ + +/* SRAM/RS-485/ADC options, and RS-485 RTS/Automatic RS-485 flags register */ +#define TS5500_SRAM_RS485_ADC_ADDR	0x75 +#define TS5500_SRAM			BIT(0)	/* SRAM option */ +#define TS5500_RS485			BIT(1)	/* RS-485 option */ +#define TS5500_ADC			BIT(2)	/* A/D converter option */ +#define TS5500_RS485_RTS		BIT(6)	/* RTS for RS-485 */ +#define TS5500_RS485_AUTO		BIT(7)	/* Automatic RS-485 */ + +/* External Reset/Industrial Temperature Range options register */ +#define TS5500_ERESET_ITR_ADDR		0x76 +#define TS5500_ERESET			BIT(0)	/* External Reset option */ +#define TS5500_ITR			BIT(1)	/* Indust. Temp. Range option */ + +/* LED/Jumpers register */ +#define TS5500_LED_JP_ADDR		0x77 +#define TS5500_LED			BIT(0)	/* LED flag */ +#define TS5500_JP1			BIT(1)	/* Automatic CMOS */ +#define TS5500_JP2			BIT(2)	/* Enable Serial Console */ +#define TS5500_JP3			BIT(3)	/* Write Enable Drive A */ +#define TS5500_JP4			BIT(4)	/* Fast Console (115K baud) */ +#define TS5500_JP5			BIT(5)	/* User Jumper */ +#define TS5500_JP6			BIT(6)	/* Console on COM1 (req. JP2) */ +#define TS5500_JP7			BIT(7)	/* Undocumented (Unused) */ + +/* A/D Converter registers */ +#define TS5500_ADC_CONV_BUSY_ADDR	0x195	/* Conversion state register */ +#define TS5500_ADC_CONV_BUSY		BIT(0) +#define TS5500_ADC_CONV_INIT_LSB_ADDR	0x196	/* Start conv. / LSB register */ +#define TS5500_ADC_CONV_MSB_ADDR	0x197	/* MSB register */ +#define TS5500_ADC_CONV_DELAY		12	/* usec */ + +/** + * struct ts5500_sbc - TS-5500 board description + * @id:		Board product ID. + * @sram:	Flag for SRAM option. + * @rs485:	Flag for RS-485 option. + * @adc:	Flag for Analog/Digital converter option. + * @ereset:	Flag for External Reset option. + * @itr:	Flag for Industrial Temperature Range option. + * @jumpers:	Bitfield for jumpers' state. + */ +struct ts5500_sbc { +	int	id; +	bool	sram; +	bool	rs485; +	bool	adc; +	bool	ereset; +	bool	itr; +	u8	jumpers; +}; + +/* Board signatures in BIOS shadow RAM */ +static const struct { +	const char * const string; +	const ssize_t offset; +} ts5500_signatures[] __initdata = { +	{ "TS-5x00 AMD Elan", 0xb14 }, +}; + +static int __init ts5500_check_signature(void) +{ +	void __iomem *bios; +	int i, ret = -ENODEV; + +	bios = ioremap(0xf0000, 0x10000); +	if (!bios) +		return -ENOMEM; + +	for (i = 0; i < ARRAY_SIZE(ts5500_signatures); i++) { +		if (check_signature(bios + ts5500_signatures[i].offset, +				    ts5500_signatures[i].string, +				    strlen(ts5500_signatures[i].string))) { +			ret = 0; +			break; +		} +	} + +	iounmap(bios); +	return ret; +} + +static int __init ts5500_detect_config(struct ts5500_sbc *sbc) +{ +	u8 tmp; +	int ret = 0; + +	if (!request_region(TS5500_PRODUCT_CODE_ADDR, 4, "ts5500")) +		return -EBUSY; + +	tmp = inb(TS5500_PRODUCT_CODE_ADDR); +	if (tmp != TS5500_PRODUCT_CODE) { +		pr_err("This platform is not a TS-5500 (found ID 0x%x)\n", tmp); +		ret = -ENODEV; +		goto cleanup; +	} +	sbc->id = tmp; + +	tmp = inb(TS5500_SRAM_RS485_ADC_ADDR); +	sbc->sram = tmp & TS5500_SRAM; +	sbc->rs485 = tmp & TS5500_RS485; +	sbc->adc = tmp & TS5500_ADC; + +	tmp = inb(TS5500_ERESET_ITR_ADDR); +	sbc->ereset = tmp & TS5500_ERESET; +	sbc->itr = tmp & TS5500_ITR; + +	tmp = inb(TS5500_LED_JP_ADDR); +	sbc->jumpers = tmp & ~TS5500_LED; + +cleanup: +	release_region(TS5500_PRODUCT_CODE_ADDR, 4); +	return ret; +} + +static ssize_t ts5500_show_id(struct device *dev, +			      struct device_attribute *attr, char *buf) +{ +	struct ts5500_sbc *sbc = dev_get_drvdata(dev); + +	return sprintf(buf, "0x%.2x\n", sbc->id); +} + +static ssize_t ts5500_show_jumpers(struct device *dev, +				   struct device_attribute *attr, +				   char *buf) +{ +	struct ts5500_sbc *sbc = dev_get_drvdata(dev); + +	return sprintf(buf, "0x%.2x\n", sbc->jumpers >> 1); +} + +#define TS5500_SHOW(field)					\ +	static ssize_t ts5500_show_##field(struct device *dev,	\ +			struct device_attribute *attr,		\ +			char *buf)				\ +	{							\ +		struct ts5500_sbc *sbc = dev_get_drvdata(dev);	\ +		return sprintf(buf, "%d\n", sbc->field);	\ +	} + +TS5500_SHOW(sram) +TS5500_SHOW(rs485) +TS5500_SHOW(adc) +TS5500_SHOW(ereset) +TS5500_SHOW(itr) + +static DEVICE_ATTR(id, S_IRUGO, ts5500_show_id, NULL); +static DEVICE_ATTR(jumpers, S_IRUGO, ts5500_show_jumpers, NULL); +static DEVICE_ATTR(sram, S_IRUGO, ts5500_show_sram, NULL); +static DEVICE_ATTR(rs485, S_IRUGO, ts5500_show_rs485, NULL); +static DEVICE_ATTR(adc, S_IRUGO, ts5500_show_adc, NULL); +static DEVICE_ATTR(ereset, S_IRUGO, ts5500_show_ereset, NULL); +static DEVICE_ATTR(itr, S_IRUGO, ts5500_show_itr, NULL); + +static struct attribute *ts5500_attributes[] = { +	&dev_attr_id.attr, +	&dev_attr_jumpers.attr, +	&dev_attr_sram.attr, +	&dev_attr_rs485.attr, +	&dev_attr_adc.attr, +	&dev_attr_ereset.attr, +	&dev_attr_itr.attr, +	NULL +}; + +static const struct attribute_group ts5500_attr_group = { +	.attrs = ts5500_attributes, +}; + +static struct resource ts5500_dio1_resource[] = { +	DEFINE_RES_IRQ_NAMED(7, "DIO1 interrupt"), +}; + +static struct platform_device ts5500_dio1_pdev = { +	.name = "ts5500-dio1", +	.id = -1, +	.resource = ts5500_dio1_resource, +	.num_resources = 1, +}; + +static struct resource ts5500_dio2_resource[] = { +	DEFINE_RES_IRQ_NAMED(6, "DIO2 interrupt"), +}; + +static struct platform_device ts5500_dio2_pdev = { +	.name = "ts5500-dio2", +	.id = -1, +	.resource = ts5500_dio2_resource, +	.num_resources = 1, +}; + +static void ts5500_led_set(struct led_classdev *led_cdev, +			   enum led_brightness brightness) +{ +	outb(!!brightness, TS5500_LED_JP_ADDR); +} + +static enum led_brightness ts5500_led_get(struct led_classdev *led_cdev) +{ +	return (inb(TS5500_LED_JP_ADDR) & TS5500_LED) ? LED_FULL : LED_OFF; +} + +static struct led_classdev ts5500_led_cdev = { +	.name = "ts5500:green:", +	.brightness_set = ts5500_led_set, +	.brightness_get = ts5500_led_get, +}; + +static int ts5500_adc_convert(u8 ctrl) +{ +	u8 lsb, msb; + +	/* Start conversion (ensure the 3 MSB are set to 0) */ +	outb(ctrl & 0x1f, TS5500_ADC_CONV_INIT_LSB_ADDR); + +	/* +	 * The platform has CPLD logic driving the A/D converter. +	 * The conversion must complete within 11 microseconds, +	 * otherwise we have to re-initiate a conversion. +	 */ +	udelay(TS5500_ADC_CONV_DELAY); +	if (inb(TS5500_ADC_CONV_BUSY_ADDR) & TS5500_ADC_CONV_BUSY) +		return -EBUSY; + +	/* Read the raw data */ +	lsb = inb(TS5500_ADC_CONV_INIT_LSB_ADDR); +	msb = inb(TS5500_ADC_CONV_MSB_ADDR); + +	return (msb << 8) | lsb; +} + +static struct max197_platform_data ts5500_adc_pdata = { +	.convert = ts5500_adc_convert, +}; + +static struct platform_device ts5500_adc_pdev = { +	.name = "max197", +	.id = -1, +	.dev = { +		.platform_data = &ts5500_adc_pdata, +	}, +}; + +static int __init ts5500_init(void) +{ +	struct platform_device *pdev; +	struct ts5500_sbc *sbc; +	int err; + +	/* +	 * There is no DMI available or PCI bridge subvendor info, +	 * only the BIOS provides a 16-bit identification call. +	 * It is safer to find a signature in the BIOS shadow RAM. +	 */ +	err = ts5500_check_signature(); +	if (err) +		return err; + +	pdev = platform_device_register_simple("ts5500", -1, NULL, 0); +	if (IS_ERR(pdev)) +		return PTR_ERR(pdev); + +	sbc = devm_kzalloc(&pdev->dev, sizeof(struct ts5500_sbc), GFP_KERNEL); +	if (!sbc) { +		err = -ENOMEM; +		goto error; +	} + +	err = ts5500_detect_config(sbc); +	if (err) +		goto error; + +	platform_set_drvdata(pdev, sbc); + +	err = sysfs_create_group(&pdev->dev.kobj, &ts5500_attr_group); +	if (err) +		goto error; + +	ts5500_dio1_pdev.dev.parent = &pdev->dev; +	if (platform_device_register(&ts5500_dio1_pdev)) +		dev_warn(&pdev->dev, "DIO1 block registration failed\n"); +	ts5500_dio2_pdev.dev.parent = &pdev->dev; +	if (platform_device_register(&ts5500_dio2_pdev)) +		dev_warn(&pdev->dev, "DIO2 block registration failed\n"); + +	if (led_classdev_register(&pdev->dev, &ts5500_led_cdev)) +		dev_warn(&pdev->dev, "LED registration failed\n"); + +	if (sbc->adc) { +		ts5500_adc_pdev.dev.parent = &pdev->dev; +		if (platform_device_register(&ts5500_adc_pdev)) +			dev_warn(&pdev->dev, "ADC registration failed\n"); +	} + +	return 0; +error: +	platform_device_unregister(pdev); +	return err; +} +device_initcall(ts5500_init); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Savoir-faire Linux Inc. <kernel@savoirfairelinux.com>"); +MODULE_DESCRIPTION("Technologic Systems TS-5500 platform driver"); diff --git a/arch/x86/platform/uv/tlb_uv.c b/arch/x86/platform/uv/tlb_uv.c index b8b3a37c80c..0f92173a12b 100644 --- a/arch/x86/platform/uv/tlb_uv.c +++ b/arch/x86/platform/uv/tlb_uv.c @@ -1034,7 +1034,8 @@ static int set_distrib_bits(struct cpumask *flush_mask, struct bau_control *bcp,   * globally purge translation cache of a virtual address or all TLB's   * @cpumask: mask of all cpu's in which the address is to be removed   * @mm: mm_struct containing virtual address range - * @va: virtual address to be removed (or TLB_FLUSH_ALL for all TLB's on cpu) + * @start: start virtual address to be removed from TLB + * @end: end virtual address to be remove from TLB   * @cpu: the current cpu   *   * This is the entry point for initiating any UV global TLB shootdown. @@ -1056,7 +1057,7 @@ static int set_distrib_bits(struct cpumask *flush_mask, struct bau_control *bcp,   */  const struct cpumask *uv_flush_tlb_others(const struct cpumask *cpumask,  				struct mm_struct *mm, unsigned long start, -				unsigned end, unsigned int cpu) +				unsigned long end, unsigned int cpu)  {  	int locals = 0;  	int remotes = 0; @@ -1113,7 +1114,10 @@ const struct cpumask *uv_flush_tlb_others(const struct cpumask *cpumask,  	record_send_statistics(stat, locals, hubs, remotes, bau_desc); -	bau_desc->payload.address = start; +	if (!end || (end - start) <= PAGE_SIZE) +		bau_desc->payload.address = start; +	else +		bau_desc->payload.address = TLB_FLUSH_ALL;  	bau_desc->payload.sending_cpu = cpu;  	/*  	 * uv_flush_send_and_wait returns 0 if all cpu's were messaged, @@ -1463,7 +1467,7 @@ static ssize_t ptc_proc_write(struct file *file, const char __user *user,  	}  	if (input_arg == 0) { -		elements = sizeof(stat_description)/sizeof(*stat_description); +		elements = ARRAY_SIZE(stat_description);  		printk(KERN_DEBUG "# cpu:      cpu number\n");  		printk(KERN_DEBUG "Sender statistics:\n");  		for (i = 0; i < elements; i++) @@ -1504,7 +1508,7 @@ static int parse_tunables_write(struct bau_control *bcp, char *instr,  	char *q;  	int cnt = 0;  	int val; -	int e = sizeof(tunables) / sizeof(*tunables); +	int e = ARRAY_SIZE(tunables);  	p = instr + strspn(instr, WHITESPACE);  	q = p; diff --git a/arch/x86/platform/uv/uv_time.c b/arch/x86/platform/uv/uv_time.c index 5032e0d19b8..98718f604eb 100644 --- a/arch/x86/platform/uv/uv_time.c +++ b/arch/x86/platform/uv/uv_time.c @@ -15,7 +15,7 @@   *  along with this program; if not, write to the Free Software   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA   * - *  Copyright (c) 2009 Silicon Graphics, Inc.  All Rights Reserved. + *  Copyright (c) 2009-2013 Silicon Graphics, Inc.  All Rights Reserved.   *  Copyright (c) Dimitri Sivanich   */  #include <linux/clockchips.h> @@ -102,9 +102,10 @@ static int uv_intr_pending(int pnode)  	if (is_uv1_hub())  		return uv_read_global_mmr64(pnode, UVH_EVENT_OCCURRED0) &  			UV1H_EVENT_OCCURRED0_RTC1_MASK; -	else -		return uv_read_global_mmr64(pnode, UV2H_EVENT_OCCURRED2) & -			UV2H_EVENT_OCCURRED2_RTC_1_MASK; +	else if (is_uvx_hub()) +		return uv_read_global_mmr64(pnode, UVXH_EVENT_OCCURRED2) & +			UVXH_EVENT_OCCURRED2_RTC_1_MASK; +	return 0;  }  /* Setup interrupt and return non-zero if early expiration occurred. */ @@ -122,8 +123,8 @@ static int uv_setup_intr(int cpu, u64 expires)  		uv_write_global_mmr64(pnode, UVH_EVENT_OCCURRED0_ALIAS,  				UV1H_EVENT_OCCURRED0_RTC1_MASK);  	else -		uv_write_global_mmr64(pnode, UV2H_EVENT_OCCURRED2_ALIAS, -				UV2H_EVENT_OCCURRED2_RTC_1_MASK); +		uv_write_global_mmr64(pnode, UVXH_EVENT_OCCURRED2_ALIAS, +				UVXH_EVENT_OCCURRED2_RTC_1_MASK);  	val = (X86_PLATFORM_IPI_VECTOR << UVH_RTC1_INT_CONFIG_VECTOR_SHFT) |  		((u64)apicid << UVH_RTC1_INT_CONFIG_APIC_ID_SHFT); diff --git a/arch/x86/tools/insn_sanity.c b/arch/x86/tools/insn_sanity.c index cc2f8c13128..872eb60e780 100644 --- a/arch/x86/tools/insn_sanity.c +++ b/arch/x86/tools/insn_sanity.c @@ -55,7 +55,7 @@ static FILE		*input_file;	/* Input file name */  static void usage(const char *err)  {  	if (err) -		fprintf(stderr, "Error: %s\n\n", err); +		fprintf(stderr, "%s: Error: %s\n\n", prog, err);  	fprintf(stderr, "Usage: %s [-y|-n|-v] [-s seed[,no]] [-m max] [-i input]\n", prog);  	fprintf(stderr, "\t-y	64bit mode\n");  	fprintf(stderr, "\t-n	32bit mode\n"); @@ -269,7 +269,13 @@ int main(int argc, char **argv)  		insns++;  	} -	fprintf(stdout, "%s: decoded and checked %d %s instructions with %d errors (seed:0x%x)\n", (errors) ? "Failure" : "Success", insns, (input_file) ? "given" : "random", errors, seed); +	fprintf(stdout, "%s: %s: decoded and checked %d %s instructions with %d errors (seed:0x%x)\n", +		prog, +		(errors) ? "Failure" : "Success", +		insns, +		(input_file) ? "given" : "random", +		errors, +		seed);  	return errors ? 1 : 0;  } diff --git a/arch/x86/tools/relocs.c b/arch/x86/tools/relocs.c index 5a1847d6193..79d67bd507f 100644 --- a/arch/x86/tools/relocs.c +++ b/arch/x86/tools/relocs.c @@ -814,12 +814,14 @@ int main(int argc, char **argv)  	read_relocs(fp);  	if (show_absolute_syms) {  		print_absolute_symbols(); -		return 0; +		goto out;  	}  	if (show_absolute_relocs) {  		print_absolute_relocs(); -		return 0; +		goto out;  	}  	emit_relocs(as_text, use_real_mode); +out: +	fclose(fp);  	return 0;  } diff --git a/arch/x86/um/fault.c b/arch/x86/um/fault.c index 8784ab30d91..84ac7f7b025 100644 --- a/arch/x86/um/fault.c +++ b/arch/x86/um/fault.c @@ -20,7 +20,7 @@ int arch_fixup(unsigned long address, struct uml_pt_regs *regs)  	const struct exception_table_entry *fixup;  	fixup = search_exception_tables(address); -	if (fixup != 0) { +	if (fixup) {  		UPT_IP(regs) = fixup->fixup;  		return 1;  	} diff --git a/arch/x86/vdso/vclock_gettime.c b/arch/x86/vdso/vclock_gettime.c index 205ad328aa5..c74436e687b 100644 --- a/arch/x86/vdso/vclock_gettime.c +++ b/arch/x86/vdso/vclock_gettime.c @@ -60,7 +60,7 @@ notrace static cycle_t vread_tsc(void)  static notrace cycle_t vread_hpet(void)  { -	return readl((const void __iomem *)fix_to_virt(VSYSCALL_HPET) + 0xf0); +	return readl((const void __iomem *)fix_to_virt(VSYSCALL_HPET) + HPET_COUNTER);  }  #ifdef CONFIG_PARAVIRT_CLOCK diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c index 138e5667409..39928d16be3 100644 --- a/arch/x86/xen/enlighten.c +++ b/arch/x86/xen/enlighten.c @@ -1517,72 +1517,51 @@ asmlinkage void __init xen_start_kernel(void)  #endif  } -#ifdef CONFIG_XEN_PVHVM -#define HVM_SHARED_INFO_ADDR 0xFE700000UL -static struct shared_info *xen_hvm_shared_info; -static unsigned long xen_hvm_sip_phys; -static int xen_major, xen_minor; - -static void xen_hvm_connect_shared_info(unsigned long pfn) +void __ref xen_hvm_init_shared_info(void)  { +	int cpu;  	struct xen_add_to_physmap xatp; +	static struct shared_info *shared_info_page = 0; +	if (!shared_info_page) +		shared_info_page = (struct shared_info *) +			extend_brk(PAGE_SIZE, PAGE_SIZE);  	xatp.domid = DOMID_SELF;  	xatp.idx = 0;  	xatp.space = XENMAPSPACE_shared_info; -	xatp.gpfn = pfn; +	xatp.gpfn = __pa(shared_info_page) >> PAGE_SHIFT;  	if (HYPERVISOR_memory_op(XENMEM_add_to_physmap, &xatp))  		BUG(); -} -static void __init xen_hvm_set_shared_info(struct shared_info *sip) -{ -	int cpu; - -	HYPERVISOR_shared_info = sip; +	HYPERVISOR_shared_info = (struct shared_info *)shared_info_page;  	/* xen_vcpu is a pointer to the vcpu_info struct in the shared_info  	 * page, we use it in the event channel upcall and in some pvclock  	 * related functions. We don't need the vcpu_info placement  	 * optimizations because we don't use any pv_mmu or pv_irq op on -	 * HVM. */ -	for_each_online_cpu(cpu) +	 * HVM. +	 * When xen_hvm_init_shared_info is run at boot time only vcpu 0 is +	 * online but xen_hvm_init_shared_info is run at resume time too and +	 * in that case multiple vcpus might be online. */ +	for_each_online_cpu(cpu) {  		per_cpu(xen_vcpu, cpu) = &HYPERVISOR_shared_info->vcpu_info[cpu]; -} - -/* Reconnect the shared_info pfn to a (new) mfn */ -void xen_hvm_resume_shared_info(void) -{ -	xen_hvm_connect_shared_info(xen_hvm_sip_phys >> PAGE_SHIFT); -} - -/* Xen tools prior to Xen 4 do not provide a E820_Reserved area for guest usage. - * On these old tools the shared info page will be placed in E820_Ram. - * Xen 4 provides a E820_Reserved area at 0xFC000000, and this code expects - * that nothing is mapped up to HVM_SHARED_INFO_ADDR. - * Xen 4.3+ provides an explicit 1MB area at HVM_SHARED_INFO_ADDR which is used - * here for the shared info page. */ -static void __init xen_hvm_init_shared_info(void) -{ -	if (xen_major < 4) { -		xen_hvm_shared_info = extend_brk(PAGE_SIZE, PAGE_SIZE); -		xen_hvm_sip_phys = __pa(xen_hvm_shared_info); -	} else { -		xen_hvm_sip_phys = HVM_SHARED_INFO_ADDR; -		set_fixmap(FIX_PARAVIRT_BOOTMAP, xen_hvm_sip_phys); -		xen_hvm_shared_info = -		(struct shared_info *)fix_to_virt(FIX_PARAVIRT_BOOTMAP);  	} -	xen_hvm_connect_shared_info(xen_hvm_sip_phys >> PAGE_SHIFT); -	xen_hvm_set_shared_info(xen_hvm_shared_info);  } +#ifdef CONFIG_XEN_PVHVM  static void __init init_hvm_pv_info(void)  { -	uint32_t ecx, edx, pages, msr, base; +	int major, minor; +	uint32_t eax, ebx, ecx, edx, pages, msr, base;  	u64 pfn;  	base = xen_cpuid_base(); +	cpuid(base + 1, &eax, &ebx, &ecx, &edx); + +	major = eax >> 16; +	minor = eax & 0xffff; +	printk(KERN_INFO "Xen version %d.%d.\n", major, minor); +  	cpuid(base + 2, &pages, &msr, &ecx, &edx);  	pfn = __pa(hypercall_page); @@ -1633,22 +1612,12 @@ static void __init xen_hvm_guest_init(void)  static bool __init xen_hvm_platform(void)  { -	uint32_t eax, ebx, ecx, edx, base; -  	if (xen_pv_domain())  		return false; -	base = xen_cpuid_base(); -	if (!base) +	if (!xen_cpuid_base())  		return false; -	cpuid(base + 1, &eax, &ebx, &ecx, &edx); - -	xen_major = eax >> 16; -	xen_minor = eax & 0xffff; - -	printk(KERN_INFO "Xen version %d.%d.\n", xen_major, xen_minor); -  	return true;  } @@ -1668,6 +1637,7 @@ const struct hypervisor_x86 x86_hyper_xen_hvm __refconst = {  	.name			= "Xen HVM",  	.detect			= xen_hvm_platform,  	.init_platform		= xen_hvm_guest_init, +	.x2apic_available	= xen_x2apic_para_available,  };  EXPORT_SYMBOL(x86_hyper_xen_hvm);  #endif diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c index 4f7d2599b48..34bc4cee888 100644 --- a/arch/x86/xen/smp.c +++ b/arch/x86/xen/smp.c @@ -432,13 +432,6 @@ static void __cpuinit xen_play_dead(void) /* used only with HOTPLUG_CPU */  	play_dead_common();  	HYPERVISOR_vcpu_op(VCPUOP_down, smp_processor_id(), NULL);  	cpu_bringup(); -	/* -	 * Balance out the preempt calls - as we are running in cpu_idle -	 * loop which has been called at bootup from cpu_bringup_and_idle. -	 * The cpucpu_bringup_and_idle called cpu_bringup which made a -	 * preempt_disable() So this preempt_enable will balance it out. -	 */ -	preempt_enable();  }  #else /* !CONFIG_HOTPLUG_CPU */ diff --git a/arch/x86/xen/suspend.c b/arch/x86/xen/suspend.c index ae8a00c39de..45329c8c226 100644 --- a/arch/x86/xen/suspend.c +++ b/arch/x86/xen/suspend.c @@ -30,7 +30,7 @@ void xen_arch_hvm_post_suspend(int suspend_cancelled)  {  #ifdef CONFIG_XEN_PVHVM  	int cpu; -	xen_hvm_resume_shared_info(); +	xen_hvm_init_shared_info();  	xen_callback_vector();  	xen_unplug_emulated_devices();  	if (xen_feature(XENFEAT_hvm_safe_pvclock)) { diff --git a/arch/x86/xen/xen-asm_32.S b/arch/x86/xen/xen-asm_32.S index f9643fc50de..33ca6e42a4c 100644 --- a/arch/x86/xen/xen-asm_32.S +++ b/arch/x86/xen/xen-asm_32.S @@ -89,11 +89,11 @@ ENTRY(xen_iret)  	 */  #ifdef CONFIG_SMP  	GET_THREAD_INFO(%eax) -	movl TI_cpu(%eax), %eax -	movl __per_cpu_offset(,%eax,4), %eax -	mov xen_vcpu(%eax), %eax +	movl %ss:TI_cpu(%eax), %eax +	movl %ss:__per_cpu_offset(,%eax,4), %eax +	mov %ss:xen_vcpu(%eax), %eax  #else -	movl xen_vcpu, %eax +	movl %ss:xen_vcpu, %eax  #endif  	/* check IF state we're restoring */ @@ -106,11 +106,11 @@ ENTRY(xen_iret)  	 * resuming the code, so we don't have to be worried about  	 * being preempted to another CPU.  	 */ -	setz XEN_vcpu_info_mask(%eax) +	setz %ss:XEN_vcpu_info_mask(%eax)  xen_iret_start_crit:  	/* check for unmasked and pending */ -	cmpw $0x0001, XEN_vcpu_info_pending(%eax) +	cmpw $0x0001, %ss:XEN_vcpu_info_pending(%eax)  	/*  	 * If there's something pending, mask events again so we can @@ -118,7 +118,7 @@ xen_iret_start_crit:  	 * touch XEN_vcpu_info_mask.  	 */  	jne 1f -	movb $1, XEN_vcpu_info_mask(%eax) +	movb $1, %ss:XEN_vcpu_info_mask(%eax)  1:	popl %eax diff --git a/arch/x86/xen/xen-ops.h b/arch/x86/xen/xen-ops.h index d2e73d19d36..a95b41744ad 100644 --- a/arch/x86/xen/xen-ops.h +++ b/arch/x86/xen/xen-ops.h @@ -40,7 +40,7 @@ void xen_enable_syscall(void);  void xen_vcpu_restore(void);  void xen_callback_vector(void); -void xen_hvm_resume_shared_info(void); +void xen_hvm_init_shared_info(void);  void xen_unplug_emulated_devices(void);  void __init xen_build_dynamic_phys_to_machine(void); diff --git a/arch/xtensa/include/asm/dma-mapping.h b/arch/xtensa/include/asm/dma-mapping.h index 4acb5feba1f..172a02a6ad1 100644 --- a/arch/xtensa/include/asm/dma-mapping.h +++ b/arch/xtensa/include/asm/dma-mapping.h @@ -170,4 +170,19 @@ dma_cache_sync(struct device *dev, void *vaddr, size_t size,  	consistent_sync(vaddr, size, direction);  } +/* Not supported for now */ +static inline int dma_mmap_coherent(struct device *dev, +				    struct vm_area_struct *vma, void *cpu_addr, +				    dma_addr_t dma_addr, size_t size) +{ +	return -EINVAL; +} + +static inline int dma_get_sgtable(struct device *dev, struct sg_table *sgt, +				  void *cpu_addr, dma_addr_t dma_addr, +				  size_t size) +{ +	return -EINVAL; +} +  #endif	/* _XTENSA_DMA_MAPPING_H */  |