forked from mirrors/linux
		
	Merge commit '67dd8f35c2d8ed80f26c9654b474cffc11c6674d' into patchwork
* .: (268 commits) Linux 3.16-rc6 um: segv: Save regs only in case of a kernel mode fault um: Fix hung task in fix_range_common() um: Ensure that a stub page cannot get unmapped Revert "um: Fix wait_stub_done() error handling" btrfs: test for valid bdev before kobj removal in btrfs_rm_device Btrfs: fix abnormal long waiting in fsync random: check for increase of entropy_count because of signed conversion ARM: EXYNOS: Fix core ID used by platsmp and hotplug code ahci: add support for the Promise FastTrak TX8660 SATA HBA (ahci mode) ARM: at91/dt: add missing clocks property to pwm node in sam9x5.dtsi ARM: at91/dt: fix usb0 clocks definition in sam9n12 dtsi ARM: at91: at91sam9x5: correct typo error for ohci clock irqchip: gic: Fix core ID calculation when topology is read from DT GFS2: fs/gfs2/rgrp.c: kernel-doc warning fixes GFS2: memcontrol: Spelling s/invlidate/invalidate/ GFS2: Allow caching of glocks for flock GFS2: Allow flocks to use normal glock dq rather than dq_wait GFS2: replace count*size kzalloc by kcalloc GFS2: Use GFP_NOFS when allocating glocks ... Conflicts: drivers/media/dvb-frontends/si2168.c drivers/media/dvb-frontends/si2168_priv.h drivers/media/tuners/si2157.c
This commit is contained in:
		
						commit
						a733291d69
					
				
					 277 changed files with 2448 additions and 1574 deletions
				
			
		| 
						 | 
					@ -60,12 +60,6 @@ If the driver needs to perform more complex initialization like getting and
 | 
				
			||||||
configuring GPIOs it can get its ACPI handle and extract this information
 | 
					configuring GPIOs it can get its ACPI handle and extract this information
 | 
				
			||||||
from ACPI tables.
 | 
					from ACPI tables.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Currently the kernel is not able to automatically determine from which ACPI
 | 
					 | 
				
			||||||
device it should make the corresponding platform device so we need to add
 | 
					 | 
				
			||||||
the ACPI device explicitly to acpi_platform_device_ids list defined in
 | 
					 | 
				
			||||||
drivers/acpi/acpi_platform.c. This limitation is only for the platform
 | 
					 | 
				
			||||||
devices, SPI and I2C devices are created automatically as described below.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
DMA support
 | 
					DMA support
 | 
				
			||||||
~~~~~~~~~~~
 | 
					~~~~~~~~~~~
 | 
				
			||||||
DMA controllers enumerated via ACPI should be registered in the system to
 | 
					DMA controllers enumerated via ACPI should be registered in the system to
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,10 +8,12 @@ Both required and optional properties listed below must be defined
 | 
				
			||||||
under node /cpus/cpu@0.
 | 
					under node /cpus/cpu@0.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Required properties:
 | 
					Required properties:
 | 
				
			||||||
- operating-points: Refer to Documentation/devicetree/bindings/power/opp.txt
 | 
					- None
 | 
				
			||||||
  for details
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
Optional properties:
 | 
					Optional properties:
 | 
				
			||||||
 | 
					- operating-points: Refer to Documentation/devicetree/bindings/power/opp.txt for
 | 
				
			||||||
 | 
					  details. OPPs *must* be supplied either via DT, i.e. this property, or
 | 
				
			||||||
 | 
					  populated at runtime.
 | 
				
			||||||
- clock-latency: Specify the possible maximum transition latency for clock,
 | 
					- clock-latency: Specify the possible maximum transition latency for clock,
 | 
				
			||||||
  in unit of nanoseconds.
 | 
					  in unit of nanoseconds.
 | 
				
			||||||
- voltage-tolerance: Specify the CPU voltage tolerance in percentage.
 | 
					- voltage-tolerance: Specify the CPU voltage tolerance in percentage.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2790,6 +2790,12 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
 | 
				
			||||||
			leaf rcu_node structure.  Useful for very large
 | 
								leaf rcu_node structure.  Useful for very large
 | 
				
			||||||
			systems.
 | 
								systems.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						rcutree.jiffies_till_sched_qs= [KNL]
 | 
				
			||||||
 | 
								Set required age in jiffies for a
 | 
				
			||||||
 | 
								given grace period before RCU starts
 | 
				
			||||||
 | 
								soliciting quiescent-state help from
 | 
				
			||||||
 | 
								rcu_note_context_switch().
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	rcutree.jiffies_till_first_fqs= [KNL]
 | 
						rcutree.jiffies_till_first_fqs= [KNL]
 | 
				
			||||||
			Set delay from grace-period initialization to
 | 
								Set delay from grace-period initialization to
 | 
				
			||||||
			first attempt to force quiescent states.
 | 
								first attempt to force quiescent states.
 | 
				
			||||||
| 
						 | 
					@ -3526,7 +3532,7 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
 | 
				
			||||||
			the allocated input device; If set to 0, video driver
 | 
								the allocated input device; If set to 0, video driver
 | 
				
			||||||
			will only send out the event without touching backlight
 | 
								will only send out the event without touching backlight
 | 
				
			||||||
			brightness level.
 | 
								brightness level.
 | 
				
			||||||
			default: 0
 | 
								default: 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	virtio_mmio.device=
 | 
						virtio_mmio.device=
 | 
				
			||||||
			[VMMIO] Memory mapped virtio (platform) device.
 | 
								[VMMIO] Memory mapped virtio (platform) device.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										14
									
								
								MAINTAINERS
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								MAINTAINERS
									
									
									
									
									
								
							| 
						 | 
					@ -156,7 +156,6 @@ F:	drivers/net/hamradio/6pack.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
8169 10/100/1000 GIGABIT ETHERNET DRIVER
 | 
					8169 10/100/1000 GIGABIT ETHERNET DRIVER
 | 
				
			||||||
M:	Realtek linux nic maintainers <nic_swsd@realtek.com>
 | 
					M:	Realtek linux nic maintainers <nic_swsd@realtek.com>
 | 
				
			||||||
M:	Francois Romieu <romieu@fr.zoreil.com>
 | 
					 | 
				
			||||||
L:	netdev@vger.kernel.org
 | 
					L:	netdev@vger.kernel.org
 | 
				
			||||||
S:	Maintained
 | 
					S:	Maintained
 | 
				
			||||||
F:	drivers/net/ethernet/realtek/r8169.c
 | 
					F:	drivers/net/ethernet/realtek/r8169.c
 | 
				
			||||||
| 
						 | 
					@ -4521,8 +4520,7 @@ S:	Supported
 | 
				
			||||||
F:	drivers/idle/i7300_idle.c
 | 
					F:	drivers/idle/i7300_idle.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
IEEE 802.15.4 SUBSYSTEM
 | 
					IEEE 802.15.4 SUBSYSTEM
 | 
				
			||||||
M:	Alexander Smirnov <alex.bluesman.smirnov@gmail.com>
 | 
					M:	Alexander Aring <alex.aring@gmail.com>
 | 
				
			||||||
M:	Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
 | 
					 | 
				
			||||||
L:	linux-zigbee-devel@lists.sourceforge.net (moderated for non-subscribers)
 | 
					L:	linux-zigbee-devel@lists.sourceforge.net (moderated for non-subscribers)
 | 
				
			||||||
W:	http://apps.sourceforge.net/trac/linux-zigbee
 | 
					W:	http://apps.sourceforge.net/trac/linux-zigbee
 | 
				
			||||||
T:	git git://git.kernel.org/pub/scm/linux/kernel/git/lowpan/lowpan.git
 | 
					T:	git git://git.kernel.org/pub/scm/linux/kernel/git/lowpan/lowpan.git
 | 
				
			||||||
| 
						 | 
					@ -8032,6 +8030,16 @@ F:	drivers/ata/
 | 
				
			||||||
F:	include/linux/ata.h
 | 
					F:	include/linux/ata.h
 | 
				
			||||||
F:	include/linux/libata.h
 | 
					F:	include/linux/libata.h
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SERIAL ATA AHCI PLATFORM devices support
 | 
				
			||||||
 | 
					M:	Hans de Goede <hdegoede@redhat.com>
 | 
				
			||||||
 | 
					M:	Tejun Heo <tj@kernel.org>
 | 
				
			||||||
 | 
					L:	linux-ide@vger.kernel.org
 | 
				
			||||||
 | 
					T:	git git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata.git
 | 
				
			||||||
 | 
					S:	Supported
 | 
				
			||||||
 | 
					F:	drivers/ata/ahci_platform.c
 | 
				
			||||||
 | 
					F:	drivers/ata/libahci_platform.c
 | 
				
			||||||
 | 
					F:	include/linux/ahci_platform.h
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SERVER ENGINES 10Gbps iSCSI - BladeEngine 2 DRIVER
 | 
					SERVER ENGINES 10Gbps iSCSI - BladeEngine 2 DRIVER
 | 
				
			||||||
M:	Jayamohan Kallickal <jayamohan.kallickal@emulex.com>
 | 
					M:	Jayamohan Kallickal <jayamohan.kallickal@emulex.com>
 | 
				
			||||||
L:	linux-scsi@vger.kernel.org
 | 
					L:	linux-scsi@vger.kernel.org
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										2
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								Makefile
									
									
									
									
									
								
							| 
						 | 
					@ -1,7 +1,7 @@
 | 
				
			||||||
VERSION = 3
 | 
					VERSION = 3
 | 
				
			||||||
PATCHLEVEL = 16
 | 
					PATCHLEVEL = 16
 | 
				
			||||||
SUBLEVEL = 0
 | 
					SUBLEVEL = 0
 | 
				
			||||||
EXTRAVERSION = -rc5
 | 
					EXTRAVERSION = -rc6
 | 
				
			||||||
NAME = Shuffling Zombie Juror
 | 
					NAME = Shuffling Zombie Juror
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# *DOCUMENTATION*
 | 
					# *DOCUMENTATION*
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6,6 +6,7 @@ config ARM
 | 
				
			||||||
	select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST
 | 
						select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST
 | 
				
			||||||
	select ARCH_HAVE_CUSTOM_GPIO_H
 | 
						select ARCH_HAVE_CUSTOM_GPIO_H
 | 
				
			||||||
	select ARCH_MIGHT_HAVE_PC_PARPORT
 | 
						select ARCH_MIGHT_HAVE_PC_PARPORT
 | 
				
			||||||
 | 
						select ARCH_SUPPORTS_ATOMIC_RMW
 | 
				
			||||||
	select ARCH_USE_BUILTIN_BSWAP
 | 
						select ARCH_USE_BUILTIN_BSWAP
 | 
				
			||||||
	select ARCH_USE_CMPXCHG_LOCKREF
 | 
						select ARCH_USE_CMPXCHG_LOCKREF
 | 
				
			||||||
	select ARCH_WANT_IPC_PARSE_VERSION
 | 
						select ARCH_WANT_IPC_PARSE_VERSION
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -925,7 +925,7 @@ usb0: ohci@00500000 {
 | 
				
			||||||
			compatible = "atmel,at91rm9200-ohci", "usb-ohci";
 | 
								compatible = "atmel,at91rm9200-ohci", "usb-ohci";
 | 
				
			||||||
			reg = <0x00500000 0x00100000>;
 | 
								reg = <0x00500000 0x00100000>;
 | 
				
			||||||
			interrupts = <22 IRQ_TYPE_LEVEL_HIGH 2>;
 | 
								interrupts = <22 IRQ_TYPE_LEVEL_HIGH 2>;
 | 
				
			||||||
			clocks = <&usb>, <&uhphs_clk>, <&udphs_clk>,
 | 
								clocks = <&usb>, <&uhphs_clk>, <&uhphs_clk>,
 | 
				
			||||||
				 <&uhpck>;
 | 
									 <&uhpck>;
 | 
				
			||||||
			clock-names = "usb_clk", "ohci_clk", "hclk", "uhpck";
 | 
								clock-names = "usb_clk", "ohci_clk", "hclk", "uhpck";
 | 
				
			||||||
			status = "disabled";
 | 
								status = "disabled";
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1124,6 +1124,7 @@ pwm0: pwm@f8034000 {
 | 
				
			||||||
				compatible = "atmel,at91sam9rl-pwm";
 | 
									compatible = "atmel,at91sam9rl-pwm";
 | 
				
			||||||
				reg = <0xf8034000 0x300>;
 | 
									reg = <0xf8034000 0x300>;
 | 
				
			||||||
				interrupts = <18 IRQ_TYPE_LEVEL_HIGH 4>;
 | 
									interrupts = <18 IRQ_TYPE_LEVEL_HIGH 4>;
 | 
				
			||||||
 | 
									clocks = <&pwm_clk>;
 | 
				
			||||||
				#pwm-cells = <3>;
 | 
									#pwm-cells = <3>;
 | 
				
			||||||
				status = "disabled";
 | 
									status = "disabled";
 | 
				
			||||||
			};
 | 
								};
 | 
				
			||||||
| 
						 | 
					@ -1155,8 +1156,7 @@ usb0: ohci@00600000 {
 | 
				
			||||||
			compatible = "atmel,at91rm9200-ohci", "usb-ohci";
 | 
								compatible = "atmel,at91rm9200-ohci", "usb-ohci";
 | 
				
			||||||
			reg = <0x00600000 0x100000>;
 | 
								reg = <0x00600000 0x100000>;
 | 
				
			||||||
			interrupts = <22 IRQ_TYPE_LEVEL_HIGH 2>;
 | 
								interrupts = <22 IRQ_TYPE_LEVEL_HIGH 2>;
 | 
				
			||||||
			clocks = <&usb>, <&uhphs_clk>, <&udphs_clk>,
 | 
								clocks = <&usb>, <&uhphs_clk>, <&uhphs_clk>, <&uhpck>;
 | 
				
			||||||
				 <&uhpck>;
 | 
					 | 
				
			||||||
			clock-names = "usb_clk", "ohci_clk", "hclk", "uhpck";
 | 
								clock-names = "usb_clk", "ohci_clk", "hclk", "uhpck";
 | 
				
			||||||
			status = "disabled";
 | 
								status = "disabled";
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -40,15 +40,17 @@ static inline void cpu_leave_lowpower(void)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline void platform_do_lowpower(unsigned int cpu, int *spurious)
 | 
					static inline void platform_do_lowpower(unsigned int cpu, int *spurious)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						u32 mpidr = cpu_logical_map(cpu);
 | 
				
			||||||
 | 
						u32 core_id = MPIDR_AFFINITY_LEVEL(mpidr, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (;;) {
 | 
						for (;;) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* make cpu1 to be turned off at next WFI command */
 | 
							/* Turn the CPU off on next WFI instruction. */
 | 
				
			||||||
		if (cpu == 1)
 | 
							exynos_cpu_power_down(core_id);
 | 
				
			||||||
			exynos_cpu_power_down(cpu);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		wfi();
 | 
							wfi();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (pen_release == cpu_logical_map(cpu)) {
 | 
							if (pen_release == core_id) {
 | 
				
			||||||
			/*
 | 
								/*
 | 
				
			||||||
			 * OK, proper wakeup, we're done
 | 
								 * OK, proper wakeup, we're done
 | 
				
			||||||
			 */
 | 
								 */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -90,7 +90,8 @@ static void exynos_secondary_init(unsigned int cpu)
 | 
				
			||||||
static int exynos_boot_secondary(unsigned int cpu, struct task_struct *idle)
 | 
					static int exynos_boot_secondary(unsigned int cpu, struct task_struct *idle)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	unsigned long timeout;
 | 
						unsigned long timeout;
 | 
				
			||||||
	unsigned long phys_cpu = cpu_logical_map(cpu);
 | 
						u32 mpidr = cpu_logical_map(cpu);
 | 
				
			||||||
 | 
						u32 core_id = MPIDR_AFFINITY_LEVEL(mpidr, 0);
 | 
				
			||||||
	int ret = -ENOSYS;
 | 
						int ret = -ENOSYS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
| 
						 | 
					@ -104,17 +105,18 @@ static int exynos_boot_secondary(unsigned int cpu, struct task_struct *idle)
 | 
				
			||||||
	 * the holding pen - release it, then wait for it to flag
 | 
						 * the holding pen - release it, then wait for it to flag
 | 
				
			||||||
	 * that it has been released by resetting pen_release.
 | 
						 * that it has been released by resetting pen_release.
 | 
				
			||||||
	 *
 | 
						 *
 | 
				
			||||||
	 * Note that "pen_release" is the hardware CPU ID, whereas
 | 
						 * Note that "pen_release" is the hardware CPU core ID, whereas
 | 
				
			||||||
	 * "cpu" is Linux's internal ID.
 | 
						 * "cpu" is Linux's internal ID.
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	write_pen_release(phys_cpu);
 | 
						write_pen_release(core_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!exynos_cpu_power_state(cpu)) {
 | 
						if (!exynos_cpu_power_state(core_id)) {
 | 
				
			||||||
		exynos_cpu_power_up(cpu);
 | 
							exynos_cpu_power_up(core_id);
 | 
				
			||||||
		timeout = 10;
 | 
							timeout = 10;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* wait max 10 ms until cpu1 is on */
 | 
							/* wait max 10 ms until cpu1 is on */
 | 
				
			||||||
		while (exynos_cpu_power_state(cpu) != S5P_CORE_LOCAL_PWR_EN) {
 | 
							while (exynos_cpu_power_state(core_id)
 | 
				
			||||||
 | 
							       != S5P_CORE_LOCAL_PWR_EN) {
 | 
				
			||||||
			if (timeout-- == 0)
 | 
								if (timeout-- == 0)
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -145,20 +147,20 @@ static int exynos_boot_secondary(unsigned int cpu, struct task_struct *idle)
 | 
				
			||||||
		 * Try to set boot address using firmware first
 | 
							 * Try to set boot address using firmware first
 | 
				
			||||||
		 * and fall back to boot register if it fails.
 | 
							 * and fall back to boot register if it fails.
 | 
				
			||||||
		 */
 | 
							 */
 | 
				
			||||||
		ret = call_firmware_op(set_cpu_boot_addr, phys_cpu, boot_addr);
 | 
							ret = call_firmware_op(set_cpu_boot_addr, core_id, boot_addr);
 | 
				
			||||||
		if (ret && ret != -ENOSYS)
 | 
							if (ret && ret != -ENOSYS)
 | 
				
			||||||
			goto fail;
 | 
								goto fail;
 | 
				
			||||||
		if (ret == -ENOSYS) {
 | 
							if (ret == -ENOSYS) {
 | 
				
			||||||
			void __iomem *boot_reg = cpu_boot_reg(phys_cpu);
 | 
								void __iomem *boot_reg = cpu_boot_reg(core_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (IS_ERR(boot_reg)) {
 | 
								if (IS_ERR(boot_reg)) {
 | 
				
			||||||
				ret = PTR_ERR(boot_reg);
 | 
									ret = PTR_ERR(boot_reg);
 | 
				
			||||||
				goto fail;
 | 
									goto fail;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			__raw_writel(boot_addr, cpu_boot_reg(phys_cpu));
 | 
								__raw_writel(boot_addr, cpu_boot_reg(core_id));
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		call_firmware_op(cpu_boot, phys_cpu);
 | 
							call_firmware_op(cpu_boot, core_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		arch_send_wakeup_ipi_mask(cpumask_of(cpu));
 | 
							arch_send_wakeup_ipi_mask(cpumask_of(cpu));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -227,22 +229,24 @@ static void __init exynos_smp_prepare_cpus(unsigned int max_cpus)
 | 
				
			||||||
	 * boot register if it fails.
 | 
						 * boot register if it fails.
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	for (i = 1; i < max_cpus; ++i) {
 | 
						for (i = 1; i < max_cpus; ++i) {
 | 
				
			||||||
		unsigned long phys_cpu;
 | 
					 | 
				
			||||||
		unsigned long boot_addr;
 | 
							unsigned long boot_addr;
 | 
				
			||||||
 | 
							u32 mpidr;
 | 
				
			||||||
 | 
							u32 core_id;
 | 
				
			||||||
		int ret;
 | 
							int ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		phys_cpu = cpu_logical_map(i);
 | 
							mpidr = cpu_logical_map(i);
 | 
				
			||||||
 | 
							core_id = MPIDR_AFFINITY_LEVEL(mpidr, 0);
 | 
				
			||||||
		boot_addr = virt_to_phys(exynos4_secondary_startup);
 | 
							boot_addr = virt_to_phys(exynos4_secondary_startup);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		ret = call_firmware_op(set_cpu_boot_addr, phys_cpu, boot_addr);
 | 
							ret = call_firmware_op(set_cpu_boot_addr, core_id, boot_addr);
 | 
				
			||||||
		if (ret && ret != -ENOSYS)
 | 
							if (ret && ret != -ENOSYS)
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		if (ret == -ENOSYS) {
 | 
							if (ret == -ENOSYS) {
 | 
				
			||||||
			void __iomem *boot_reg = cpu_boot_reg(phys_cpu);
 | 
								void __iomem *boot_reg = cpu_boot_reg(core_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (IS_ERR(boot_reg))
 | 
								if (IS_ERR(boot_reg))
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
			__raw_writel(boot_addr, cpu_boot_reg(phys_cpu));
 | 
								__raw_writel(boot_addr, cpu_boot_reg(core_id));
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -70,7 +70,7 @@ static const char *cko_sels[] = { "cko1", "cko2", };
 | 
				
			||||||
static const char *lvds_sels[] = {
 | 
					static const char *lvds_sels[] = {
 | 
				
			||||||
	"dummy", "dummy", "dummy", "dummy", "dummy", "dummy",
 | 
						"dummy", "dummy", "dummy", "dummy", "dummy", "dummy",
 | 
				
			||||||
	"pll4_audio", "pll5_video", "pll8_mlb", "enet_ref",
 | 
						"pll4_audio", "pll5_video", "pll8_mlb", "enet_ref",
 | 
				
			||||||
	"pcie_ref", "sata_ref",
 | 
						"pcie_ref_125m", "sata_ref_100m",
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum mx6q_clks {
 | 
					enum mx6q_clks {
 | 
				
			||||||
| 
						 | 
					@ -491,7 +491,7 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* All existing boards with PCIe use LVDS1 */
 | 
						/* All existing boards with PCIe use LVDS1 */
 | 
				
			||||||
	if (IS_ENABLED(CONFIG_PCI_IMX6))
 | 
						if (IS_ENABLED(CONFIG_PCI_IMX6))
 | 
				
			||||||
		clk_set_parent(clk[lvds1_sel], clk[sata_ref]);
 | 
							clk_set_parent(clk[lvds1_sel], clk[sata_ref_100m]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Set initial power mode */
 | 
						/* Set initial power mode */
 | 
				
			||||||
	imx6q_set_lpm(WAIT_CLOCKED);
 | 
						imx6q_set_lpm(WAIT_CLOCKED);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -292,6 +292,10 @@ static struct notifier_block mvebu_hwcc_nb = {
 | 
				
			||||||
	.notifier_call = mvebu_hwcc_notifier,
 | 
						.notifier_call = mvebu_hwcc_notifier,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static struct notifier_block mvebu_hwcc_pci_nb = {
 | 
				
			||||||
 | 
						.notifier_call = mvebu_hwcc_notifier,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void __init armada_370_coherency_init(struct device_node *np)
 | 
					static void __init armada_370_coherency_init(struct device_node *np)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct resource res;
 | 
						struct resource res;
 | 
				
			||||||
| 
						 | 
					@ -427,7 +431,7 @@ static int __init coherency_pci_init(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (coherency_available())
 | 
						if (coherency_available())
 | 
				
			||||||
		bus_register_notifier(&pci_bus_type,
 | 
							bus_register_notifier(&pci_bus_type,
 | 
				
			||||||
				       &mvebu_hwcc_nb);
 | 
									       &mvebu_hwcc_pci_nb);
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,6 +15,8 @@
 | 
				
			||||||
#include <linux/linkage.h>
 | 
					#include <linux/linkage.h>
 | 
				
			||||||
#include <linux/init.h>
 | 
					#include <linux/init.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <asm/assembler.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	__CPUINIT
 | 
						__CPUINIT
 | 
				
			||||||
#define CPU_RESUME_ADDR_REG 0xf10182d4
 | 
					#define CPU_RESUME_ADDR_REG 0xf10182d4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -22,13 +24,18 @@
 | 
				
			||||||
.global armada_375_smp_cpu1_enable_code_end
 | 
					.global armada_375_smp_cpu1_enable_code_end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
armada_375_smp_cpu1_enable_code_start:
 | 
					armada_375_smp_cpu1_enable_code_start:
 | 
				
			||||||
	ldr     r0, [pc, #4]
 | 
					ARM_BE8(setend	be)
 | 
				
			||||||
 | 
						adr     r0, 1f
 | 
				
			||||||
 | 
						ldr	r0, [r0]
 | 
				
			||||||
	ldr     r1, [r0]
 | 
						ldr     r1, [r0]
 | 
				
			||||||
 | 
					ARM_BE8(rev	r1, r1)
 | 
				
			||||||
	mov     pc, r1
 | 
						mov     pc, r1
 | 
				
			||||||
 | 
					1:
 | 
				
			||||||
	.word   CPU_RESUME_ADDR_REG
 | 
						.word   CPU_RESUME_ADDR_REG
 | 
				
			||||||
armada_375_smp_cpu1_enable_code_end:
 | 
					armada_375_smp_cpu1_enable_code_end:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ENTRY(mvebu_cortex_a9_secondary_startup)
 | 
					ENTRY(mvebu_cortex_a9_secondary_startup)
 | 
				
			||||||
 | 
					ARM_BE8(setend	be)
 | 
				
			||||||
	bl      v7_invalidate_l1
 | 
						bl      v7_invalidate_l1
 | 
				
			||||||
	b	secondary_startup
 | 
						b	secondary_startup
 | 
				
			||||||
ENDPROC(mvebu_cortex_a9_secondary_startup)
 | 
					ENDPROC(mvebu_cortex_a9_secondary_startup)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -201,12 +201,12 @@ static noinline int do_armada_370_xp_cpu_suspend(unsigned long deepidle)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Test the CR_C bit and set it if it was cleared */
 | 
						/* Test the CR_C bit and set it if it was cleared */
 | 
				
			||||||
	asm volatile(
 | 
						asm volatile(
 | 
				
			||||||
	"mrc	p15, 0, %0, c1, c0, 0 \n\t"
 | 
						"mrc	p15, 0, r0, c1, c0, 0 \n\t"
 | 
				
			||||||
	"tst	%0, #(1 << 2) \n\t"
 | 
						"tst	r0, #(1 << 2) \n\t"
 | 
				
			||||||
	"orreq	%0, %0, #(1 << 2) \n\t"
 | 
						"orreq	r0, r0, #(1 << 2) \n\t"
 | 
				
			||||||
	"mcreq	p15, 0, %0, c1, c0, 0 \n\t"
 | 
						"mcreq	p15, 0, r0, c1, c0, 0 \n\t"
 | 
				
			||||||
	"isb	"
 | 
						"isb	"
 | 
				
			||||||
	: : "r" (0));
 | 
						: : : "r0");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pr_warn("Failed to suspend the system\n");
 | 
						pr_warn("Failed to suspend the system\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,6 +4,7 @@ config ARM64
 | 
				
			||||||
	select ARCH_HAS_OPP
 | 
						select ARCH_HAS_OPP
 | 
				
			||||||
	select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST
 | 
						select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST
 | 
				
			||||||
	select ARCH_USE_CMPXCHG_LOCKREF
 | 
						select ARCH_USE_CMPXCHG_LOCKREF
 | 
				
			||||||
 | 
						select ARCH_SUPPORTS_ATOMIC_RMW
 | 
				
			||||||
	select ARCH_WANT_OPTIONAL_GPIOLIB
 | 
						select ARCH_WANT_OPTIONAL_GPIOLIB
 | 
				
			||||||
	select ARCH_WANT_COMPAT_IPC_PARSE_VERSION
 | 
						select ARCH_WANT_COMPAT_IPC_PARSE_VERSION
 | 
				
			||||||
	select ARCH_WANT_FRAME_POINTERS
 | 
						select ARCH_WANT_FRAME_POINTERS
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -12,8 +12,6 @@
 | 
				
			||||||
#include <linux/efi.h>
 | 
					#include <linux/efi.h>
 | 
				
			||||||
#include <linux/libfdt.h>
 | 
					#include <linux/libfdt.h>
 | 
				
			||||||
#include <asm/sections.h>
 | 
					#include <asm/sections.h>
 | 
				
			||||||
#include <generated/compile.h>
 | 
					 | 
				
			||||||
#include <generated/utsrelease.h>
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * AArch64 requires the DTB to be 8-byte aligned in the first 512MiB from
 | 
					 * AArch64 requires the DTB to be 8-byte aligned in the first 512MiB from
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -145,6 +145,7 @@ config PPC
 | 
				
			||||||
	select HAVE_IRQ_EXIT_ON_IRQ_STACK
 | 
						select HAVE_IRQ_EXIT_ON_IRQ_STACK
 | 
				
			||||||
	select ARCH_USE_CMPXCHG_LOCKREF if PPC64
 | 
						select ARCH_USE_CMPXCHG_LOCKREF if PPC64
 | 
				
			||||||
	select HAVE_ARCH_AUDITSYSCALL
 | 
						select HAVE_ARCH_AUDITSYSCALL
 | 
				
			||||||
 | 
						select ARCH_SUPPORTS_ATOMIC_RMW
 | 
				
			||||||
 | 
					
 | 
				
			||||||
config GENERIC_CSUM
 | 
					config GENERIC_CSUM
 | 
				
			||||||
	def_bool CPU_LITTLE_ENDIAN
 | 
						def_bool CPU_LITTLE_ENDIAN
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -198,8 +198,10 @@ static inline unsigned long compute_tlbie_rb(unsigned long v, unsigned long r,
 | 
				
			||||||
	return rb;
 | 
						return rb;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline unsigned long hpte_page_size(unsigned long h, unsigned long l)
 | 
					static inline unsigned long __hpte_page_size(unsigned long h, unsigned long l,
 | 
				
			||||||
 | 
										     bool is_base_size)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	int size, a_psize;
 | 
						int size, a_psize;
 | 
				
			||||||
	/* Look at the 8 bit LP value */
 | 
						/* Look at the 8 bit LP value */
 | 
				
			||||||
	unsigned int lp = (l >> LP_SHIFT) & ((1 << LP_BITS) - 1);
 | 
						unsigned int lp = (l >> LP_SHIFT) & ((1 << LP_BITS) - 1);
 | 
				
			||||||
| 
						 | 
					@ -214,14 +216,27 @@ static inline unsigned long hpte_page_size(unsigned long h, unsigned long l)
 | 
				
			||||||
				continue;
 | 
									continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			a_psize = __hpte_actual_psize(lp, size);
 | 
								a_psize = __hpte_actual_psize(lp, size);
 | 
				
			||||||
			if (a_psize != -1)
 | 
								if (a_psize != -1) {
 | 
				
			||||||
 | 
									if (is_base_size)
 | 
				
			||||||
 | 
										return 1ul << mmu_psize_defs[size].shift;
 | 
				
			||||||
				return 1ul << mmu_psize_defs[a_psize].shift;
 | 
									return 1ul << mmu_psize_defs[a_psize].shift;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline unsigned long hpte_page_size(unsigned long h, unsigned long l)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return __hpte_page_size(h, l, 0);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline unsigned long hpte_base_page_size(unsigned long h, unsigned long l)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return __hpte_page_size(h, l, 1);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline unsigned long hpte_rpn(unsigned long ptel, unsigned long psize)
 | 
					static inline unsigned long hpte_rpn(unsigned long ptel, unsigned long psize)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return ((ptel & HPTE_R_RPN) & ~(psize - 1)) >> PAGE_SHIFT;
 | 
						return ((ptel & HPTE_R_RPN) & ~(psize - 1)) >> PAGE_SHIFT;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -277,6 +277,8 @@ GLUE(.,name):
 | 
				
			||||||
	.globl n;	\
 | 
						.globl n;	\
 | 
				
			||||||
n:
 | 
					n:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define _GLOBAL_TOC(name) _GLOBAL(name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define _KPROBE(n)	\
 | 
					#define _KPROBE(n)	\
 | 
				
			||||||
	.section ".kprobes.text","a";	\
 | 
						.section ".kprobes.text","a";	\
 | 
				
			||||||
	.globl	n;	\
 | 
						.globl	n;	\
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1562,7 +1562,7 @@ static ssize_t kvm_htab_write(struct file *file, const char __user *buf,
 | 
				
			||||||
				goto out;
 | 
									goto out;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			if (!rma_setup && is_vrma_hpte(v)) {
 | 
								if (!rma_setup && is_vrma_hpte(v)) {
 | 
				
			||||||
				unsigned long psize = hpte_page_size(v, r);
 | 
									unsigned long psize = hpte_base_page_size(v, r);
 | 
				
			||||||
				unsigned long senc = slb_pgsize_encoding(psize);
 | 
									unsigned long senc = slb_pgsize_encoding(psize);
 | 
				
			||||||
				unsigned long lpcr;
 | 
									unsigned long lpcr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -814,13 +814,10 @@ long kvmppc_hv_find_lock_hpte(struct kvm *kvm, gva_t eaddr, unsigned long slb_v,
 | 
				
			||||||
			r = hpte[i+1];
 | 
								r = hpte[i+1];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			/*
 | 
								/*
 | 
				
			||||||
			 * Check the HPTE again, including large page size
 | 
								 * Check the HPTE again, including base page size
 | 
				
			||||||
			 * Since we don't currently allow any MPSS (mixed
 | 
					 | 
				
			||||||
			 * page-size segment) page sizes, it is sufficient
 | 
					 | 
				
			||||||
			 * to check against the actual page size.
 | 
					 | 
				
			||||||
			 */
 | 
								 */
 | 
				
			||||||
			if ((v & valid) && (v & mask) == val &&
 | 
								if ((v & valid) && (v & mask) == val &&
 | 
				
			||||||
			    hpte_page_size(v, r) == (1ul << pshift))
 | 
								    hpte_base_page_size(v, r) == (1ul << pshift))
 | 
				
			||||||
				/* Return with the HPTE still locked */
 | 
									/* Return with the HPTE still locked */
 | 
				
			||||||
				return (hash << 3) + (i >> 1);
 | 
									return (hash << 3) + (i >> 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -48,7 +48,7 @@
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * LR = return address to continue at after eventually re-enabling MMU
 | 
					 * LR = return address to continue at after eventually re-enabling MMU
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
_GLOBAL(kvmppc_hv_entry_trampoline)
 | 
					_GLOBAL_TOC(kvmppc_hv_entry_trampoline)
 | 
				
			||||||
	mflr	r0
 | 
						mflr	r0
 | 
				
			||||||
	std	r0, PPC_LR_STKOFF(r1)
 | 
						std	r0, PPC_LR_STKOFF(r1)
 | 
				
			||||||
	stdu	r1, -112(r1)
 | 
						stdu	r1, -112(r1)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -25,7 +25,11 @@
 | 
				
			||||||
#include <asm/exception-64s.h>
 | 
					#include <asm/exception-64s.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(CONFIG_PPC_BOOK3S_64)
 | 
					#if defined(CONFIG_PPC_BOOK3S_64)
 | 
				
			||||||
 | 
					#if defined(_CALL_ELF) && _CALL_ELF == 2
 | 
				
			||||||
 | 
					#define FUNC(name) 		name
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
#define FUNC(name) 		GLUE(.,name)
 | 
					#define FUNC(name) 		GLUE(.,name)
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
#define GET_SHADOW_VCPU(reg)    addi	reg, r13, PACA_SVCPU
 | 
					#define GET_SHADOW_VCPU(reg)    addi	reg, r13, PACA_SVCPU
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#elif defined(CONFIG_PPC_BOOK3S_32)
 | 
					#elif defined(CONFIG_PPC_BOOK3S_32)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -36,7 +36,11 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(CONFIG_PPC_BOOK3S_64)
 | 
					#if defined(CONFIG_PPC_BOOK3S_64)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(_CALL_ELF) && _CALL_ELF == 2
 | 
				
			||||||
 | 
					#define FUNC(name) 		name
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
#define FUNC(name) 		GLUE(.,name)
 | 
					#define FUNC(name) 		GLUE(.,name)
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#elif defined(CONFIG_PPC_BOOK3S_32)
 | 
					#elif defined(CONFIG_PPC_BOOK3S_32)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -146,7 +150,7 @@ kvmppc_handler_skip_ins:
 | 
				
			||||||
 * On entry, r4 contains the guest shadow MSR
 | 
					 * On entry, r4 contains the guest shadow MSR
 | 
				
			||||||
 * MSR.EE has to be 0 when calling this function
 | 
					 * MSR.EE has to be 0 when calling this function
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
_GLOBAL(kvmppc_entry_trampoline)
 | 
					_GLOBAL_TOC(kvmppc_entry_trampoline)
 | 
				
			||||||
	mfmsr	r5
 | 
						mfmsr	r5
 | 
				
			||||||
	LOAD_REG_ADDR(r7, kvmppc_handler_trampoline_enter)
 | 
						LOAD_REG_ADDR(r7, kvmppc_handler_trampoline_enter)
 | 
				
			||||||
	toreal(r7)
 | 
						toreal(r7)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -23,20 +23,20 @@ static void kvm_rtas_set_xive(struct kvm_vcpu *vcpu, struct rtas_args *args)
 | 
				
			||||||
	u32 irq, server, priority;
 | 
						u32 irq, server, priority;
 | 
				
			||||||
	int rc;
 | 
						int rc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (args->nargs != 3 || args->nret != 1) {
 | 
						if (be32_to_cpu(args->nargs) != 3 || be32_to_cpu(args->nret) != 1) {
 | 
				
			||||||
		rc = -3;
 | 
							rc = -3;
 | 
				
			||||||
		goto out;
 | 
							goto out;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	irq = args->args[0];
 | 
						irq = be32_to_cpu(args->args[0]);
 | 
				
			||||||
	server = args->args[1];
 | 
						server = be32_to_cpu(args->args[1]);
 | 
				
			||||||
	priority = args->args[2];
 | 
						priority = be32_to_cpu(args->args[2]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	rc = kvmppc_xics_set_xive(vcpu->kvm, irq, server, priority);
 | 
						rc = kvmppc_xics_set_xive(vcpu->kvm, irq, server, priority);
 | 
				
			||||||
	if (rc)
 | 
						if (rc)
 | 
				
			||||||
		rc = -3;
 | 
							rc = -3;
 | 
				
			||||||
out:
 | 
					out:
 | 
				
			||||||
	args->rets[0] = rc;
 | 
						args->rets[0] = cpu_to_be32(rc);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void kvm_rtas_get_xive(struct kvm_vcpu *vcpu, struct rtas_args *args)
 | 
					static void kvm_rtas_get_xive(struct kvm_vcpu *vcpu, struct rtas_args *args)
 | 
				
			||||||
| 
						 | 
					@ -44,12 +44,12 @@ static void kvm_rtas_get_xive(struct kvm_vcpu *vcpu, struct rtas_args *args)
 | 
				
			||||||
	u32 irq, server, priority;
 | 
						u32 irq, server, priority;
 | 
				
			||||||
	int rc;
 | 
						int rc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (args->nargs != 1 || args->nret != 3) {
 | 
						if (be32_to_cpu(args->nargs) != 1 || be32_to_cpu(args->nret) != 3) {
 | 
				
			||||||
		rc = -3;
 | 
							rc = -3;
 | 
				
			||||||
		goto out;
 | 
							goto out;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	irq = args->args[0];
 | 
						irq = be32_to_cpu(args->args[0]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	server = priority = 0;
 | 
						server = priority = 0;
 | 
				
			||||||
	rc = kvmppc_xics_get_xive(vcpu->kvm, irq, &server, &priority);
 | 
						rc = kvmppc_xics_get_xive(vcpu->kvm, irq, &server, &priority);
 | 
				
			||||||
| 
						 | 
					@ -58,10 +58,10 @@ static void kvm_rtas_get_xive(struct kvm_vcpu *vcpu, struct rtas_args *args)
 | 
				
			||||||
		goto out;
 | 
							goto out;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	args->rets[1] = server;
 | 
						args->rets[1] = cpu_to_be32(server);
 | 
				
			||||||
	args->rets[2] = priority;
 | 
						args->rets[2] = cpu_to_be32(priority);
 | 
				
			||||||
out:
 | 
					out:
 | 
				
			||||||
	args->rets[0] = rc;
 | 
						args->rets[0] = cpu_to_be32(rc);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void kvm_rtas_int_off(struct kvm_vcpu *vcpu, struct rtas_args *args)
 | 
					static void kvm_rtas_int_off(struct kvm_vcpu *vcpu, struct rtas_args *args)
 | 
				
			||||||
| 
						 | 
					@ -69,18 +69,18 @@ static void kvm_rtas_int_off(struct kvm_vcpu *vcpu, struct rtas_args *args)
 | 
				
			||||||
	u32 irq;
 | 
						u32 irq;
 | 
				
			||||||
	int rc;
 | 
						int rc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (args->nargs != 1 || args->nret != 1) {
 | 
						if (be32_to_cpu(args->nargs) != 1 || be32_to_cpu(args->nret) != 1) {
 | 
				
			||||||
		rc = -3;
 | 
							rc = -3;
 | 
				
			||||||
		goto out;
 | 
							goto out;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	irq = args->args[0];
 | 
						irq = be32_to_cpu(args->args[0]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	rc = kvmppc_xics_int_off(vcpu->kvm, irq);
 | 
						rc = kvmppc_xics_int_off(vcpu->kvm, irq);
 | 
				
			||||||
	if (rc)
 | 
						if (rc)
 | 
				
			||||||
		rc = -3;
 | 
							rc = -3;
 | 
				
			||||||
out:
 | 
					out:
 | 
				
			||||||
	args->rets[0] = rc;
 | 
						args->rets[0] = cpu_to_be32(rc);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void kvm_rtas_int_on(struct kvm_vcpu *vcpu, struct rtas_args *args)
 | 
					static void kvm_rtas_int_on(struct kvm_vcpu *vcpu, struct rtas_args *args)
 | 
				
			||||||
| 
						 | 
					@ -88,18 +88,18 @@ static void kvm_rtas_int_on(struct kvm_vcpu *vcpu, struct rtas_args *args)
 | 
				
			||||||
	u32 irq;
 | 
						u32 irq;
 | 
				
			||||||
	int rc;
 | 
						int rc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (args->nargs != 1 || args->nret != 1) {
 | 
						if (be32_to_cpu(args->nargs) != 1 || be32_to_cpu(args->nret) != 1) {
 | 
				
			||||||
		rc = -3;
 | 
							rc = -3;
 | 
				
			||||||
		goto out;
 | 
							goto out;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	irq = args->args[0];
 | 
						irq = be32_to_cpu(args->args[0]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	rc = kvmppc_xics_int_on(vcpu->kvm, irq);
 | 
						rc = kvmppc_xics_int_on(vcpu->kvm, irq);
 | 
				
			||||||
	if (rc)
 | 
						if (rc)
 | 
				
			||||||
		rc = -3;
 | 
							rc = -3;
 | 
				
			||||||
out:
 | 
					out:
 | 
				
			||||||
	args->rets[0] = rc;
 | 
						args->rets[0] = cpu_to_be32(rc);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif /* CONFIG_KVM_XICS */
 | 
					#endif /* CONFIG_KVM_XICS */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -205,32 +205,6 @@ int kvm_vm_ioctl_rtas_define_token(struct kvm *kvm, void __user *argp)
 | 
				
			||||||
	return rc;
 | 
						return rc;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void kvmppc_rtas_swap_endian_in(struct rtas_args *args)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
#ifdef __LITTLE_ENDIAN__
 | 
					 | 
				
			||||||
	int i;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	args->token = be32_to_cpu(args->token);
 | 
					 | 
				
			||||||
	args->nargs = be32_to_cpu(args->nargs);
 | 
					 | 
				
			||||||
	args->nret = be32_to_cpu(args->nret);
 | 
					 | 
				
			||||||
	for (i = 0; i < args->nargs; i++)
 | 
					 | 
				
			||||||
		args->args[i] = be32_to_cpu(args->args[i]);
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void kvmppc_rtas_swap_endian_out(struct rtas_args *args)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
#ifdef __LITTLE_ENDIAN__
 | 
					 | 
				
			||||||
	int i;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	for (i = 0; i < args->nret; i++)
 | 
					 | 
				
			||||||
		args->args[i] = cpu_to_be32(args->args[i]);
 | 
					 | 
				
			||||||
	args->token = cpu_to_be32(args->token);
 | 
					 | 
				
			||||||
	args->nargs = cpu_to_be32(args->nargs);
 | 
					 | 
				
			||||||
	args->nret = cpu_to_be32(args->nret);
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int kvmppc_rtas_hcall(struct kvm_vcpu *vcpu)
 | 
					int kvmppc_rtas_hcall(struct kvm_vcpu *vcpu)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct rtas_token_definition *d;
 | 
						struct rtas_token_definition *d;
 | 
				
			||||||
| 
						 | 
					@ -249,8 +223,6 @@ int kvmppc_rtas_hcall(struct kvm_vcpu *vcpu)
 | 
				
			||||||
	if (rc)
 | 
						if (rc)
 | 
				
			||||||
		goto fail;
 | 
							goto fail;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	kvmppc_rtas_swap_endian_in(&args);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * args->rets is a pointer into args->args. Now that we've
 | 
						 * args->rets is a pointer into args->args. Now that we've
 | 
				
			||||||
	 * copied args we need to fix it up to point into our copy,
 | 
						 * copied args we need to fix it up to point into our copy,
 | 
				
			||||||
| 
						 | 
					@ -258,13 +230,13 @@ int kvmppc_rtas_hcall(struct kvm_vcpu *vcpu)
 | 
				
			||||||
	 * value so we can restore it on the way out.
 | 
						 * value so we can restore it on the way out.
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	orig_rets = args.rets;
 | 
						orig_rets = args.rets;
 | 
				
			||||||
	args.rets = &args.args[args.nargs];
 | 
						args.rets = &args.args[be32_to_cpu(args.nargs)];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mutex_lock(&vcpu->kvm->lock);
 | 
						mutex_lock(&vcpu->kvm->lock);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	rc = -ENOENT;
 | 
						rc = -ENOENT;
 | 
				
			||||||
	list_for_each_entry(d, &vcpu->kvm->arch.rtas_tokens, list) {
 | 
						list_for_each_entry(d, &vcpu->kvm->arch.rtas_tokens, list) {
 | 
				
			||||||
		if (d->token == args.token) {
 | 
							if (d->token == be32_to_cpu(args.token)) {
 | 
				
			||||||
			d->handler->handler(vcpu, &args);
 | 
								d->handler->handler(vcpu, &args);
 | 
				
			||||||
			rc = 0;
 | 
								rc = 0;
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
| 
						 | 
					@ -275,7 +247,6 @@ int kvmppc_rtas_hcall(struct kvm_vcpu *vcpu)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (rc == 0) {
 | 
						if (rc == 0) {
 | 
				
			||||||
		args.rets = orig_rets;
 | 
							args.rets = orig_rets;
 | 
				
			||||||
		kvmppc_rtas_swap_endian_out(&args);
 | 
					 | 
				
			||||||
		rc = kvm_write_guest(vcpu->kvm, args_phys, &args, sizeof(args));
 | 
							rc = kvm_write_guest(vcpu->kvm, args_phys, &args, sizeof(args));
 | 
				
			||||||
		if (rc)
 | 
							if (rc)
 | 
				
			||||||
			goto fail;
 | 
								goto fail;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -473,7 +473,8 @@ static inline int kvmppc_e500_shadow_map(struct kvmppc_vcpu_e500 *vcpu_e500,
 | 
				
			||||||
		if (printk_ratelimit())
 | 
							if (printk_ratelimit())
 | 
				
			||||||
			pr_err("%s: pte not present: gfn %lx, pfn %lx\n",
 | 
								pr_err("%s: pte not present: gfn %lx, pfn %lx\n",
 | 
				
			||||||
				__func__, (long)gfn, pfn);
 | 
									__func__, (long)gfn, pfn);
 | 
				
			||||||
		return -EINVAL;
 | 
							ret = -EINVAL;
 | 
				
			||||||
 | 
							goto out;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	kvmppc_e500_ref_setup(ref, gtlbe, pfn, wimg);
 | 
						kvmppc_e500_ref_setup(ref, gtlbe, pfn, wimg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -390,12 +390,16 @@ static int bpf_jit_build_body(struct sk_filter *fp, u32 *image,
 | 
				
			||||||
		case BPF_ANC | SKF_AD_VLAN_TAG:
 | 
							case BPF_ANC | SKF_AD_VLAN_TAG:
 | 
				
			||||||
		case BPF_ANC | SKF_AD_VLAN_TAG_PRESENT:
 | 
							case BPF_ANC | SKF_AD_VLAN_TAG_PRESENT:
 | 
				
			||||||
			BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, vlan_tci) != 2);
 | 
								BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, vlan_tci) != 2);
 | 
				
			||||||
 | 
								BUILD_BUG_ON(VLAN_TAG_PRESENT != 0x1000);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			PPC_LHZ_OFFS(r_A, r_skb, offsetof(struct sk_buff,
 | 
								PPC_LHZ_OFFS(r_A, r_skb, offsetof(struct sk_buff,
 | 
				
			||||||
							  vlan_tci));
 | 
												  vlan_tci));
 | 
				
			||||||
			if (code == (BPF_ANC | SKF_AD_VLAN_TAG))
 | 
								if (code == (BPF_ANC | SKF_AD_VLAN_TAG)) {
 | 
				
			||||||
				PPC_ANDI(r_A, r_A, VLAN_VID_MASK);
 | 
									PPC_ANDI(r_A, r_A, ~VLAN_TAG_PRESENT);
 | 
				
			||||||
			else
 | 
								} else {
 | 
				
			||||||
				PPC_ANDI(r_A, r_A, VLAN_TAG_PRESENT);
 | 
									PPC_ANDI(r_A, r_A, VLAN_TAG_PRESENT);
 | 
				
			||||||
 | 
									PPC_SRWI(r_A, r_A, 12);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		case BPF_ANC | SKF_AD_QUEUE:
 | 
							case BPF_ANC | SKF_AD_QUEUE:
 | 
				
			||||||
			BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff,
 | 
								BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -51,8 +51,8 @@ static inline int restore_fp_ctl(u32 *fpc)
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	asm volatile(
 | 
						asm volatile(
 | 
				
			||||||
		"0:	lfpc    %1\n"
 | 
							"	lfpc    %1\n"
 | 
				
			||||||
		"	la	%0,0\n"
 | 
							"0:	la	%0,0\n"
 | 
				
			||||||
		"1:\n"
 | 
							"1:\n"
 | 
				
			||||||
		EX_TABLE(0b,1b)
 | 
							EX_TABLE(0b,1b)
 | 
				
			||||||
		: "=d" (rc) : "Q" (*fpc), "0" (-EINVAL));
 | 
							: "=d" (rc) : "Q" (*fpc), "0" (-EINVAL));
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -437,11 +437,11 @@ ENTRY(startup_kdump)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(CONFIG_64BIT)
 | 
					#if defined(CONFIG_64BIT)
 | 
				
			||||||
#if defined(CONFIG_MARCH_ZEC12)
 | 
					#if defined(CONFIG_MARCH_ZEC12)
 | 
				
			||||||
	.long 3, 0xc100efea, 0xf46ce800, 0x00400000
 | 
						.long 3, 0xc100eff2, 0xf46ce800, 0x00400000
 | 
				
			||||||
#elif defined(CONFIG_MARCH_Z196)
 | 
					#elif defined(CONFIG_MARCH_Z196)
 | 
				
			||||||
	.long 2, 0xc100efea, 0xf46c0000
 | 
						.long 2, 0xc100eff2, 0xf46c0000
 | 
				
			||||||
#elif defined(CONFIG_MARCH_Z10)
 | 
					#elif defined(CONFIG_MARCH_Z10)
 | 
				
			||||||
	.long 2, 0xc100efea, 0xf0680000
 | 
						.long 2, 0xc100eff2, 0xf0680000
 | 
				
			||||||
#elif defined(CONFIG_MARCH_Z9_109)
 | 
					#elif defined(CONFIG_MARCH_Z9_109)
 | 
				
			||||||
	.long 1, 0xc100efc2
 | 
						.long 1, 0xc100efc2
 | 
				
			||||||
#elif defined(CONFIG_MARCH_Z990)
 | 
					#elif defined(CONFIG_MARCH_Z990)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -334,9 +334,14 @@ static int __poke_user(struct task_struct *child, addr_t addr, addr_t data)
 | 
				
			||||||
			unsigned long mask = PSW_MASK_USER;
 | 
								unsigned long mask = PSW_MASK_USER;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			mask |= is_ri_task(child) ? PSW_MASK_RI : 0;
 | 
								mask |= is_ri_task(child) ? PSW_MASK_RI : 0;
 | 
				
			||||||
			if ((data & ~mask) != PSW_USER_BITS)
 | 
								if ((data ^ PSW_USER_BITS) & ~mask)
 | 
				
			||||||
 | 
									/* Invalid psw mask. */
 | 
				
			||||||
 | 
									return -EINVAL;
 | 
				
			||||||
 | 
								if ((data & PSW_MASK_ASC) == PSW_ASC_HOME)
 | 
				
			||||||
 | 
									/* Invalid address-space-control bits */
 | 
				
			||||||
				return -EINVAL;
 | 
									return -EINVAL;
 | 
				
			||||||
			if ((data & PSW_MASK_EA) && !(data & PSW_MASK_BA))
 | 
								if ((data & PSW_MASK_EA) && !(data & PSW_MASK_BA))
 | 
				
			||||||
 | 
									/* Invalid addressing mode bits */
 | 
				
			||||||
				return -EINVAL;
 | 
									return -EINVAL;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		*(addr_t *)((addr_t) &task_pt_regs(child)->psw + addr) = data;
 | 
							*(addr_t *)((addr_t) &task_pt_regs(child)->psw + addr) = data;
 | 
				
			||||||
| 
						 | 
					@ -672,9 +677,12 @@ static int __poke_user_compat(struct task_struct *child,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			mask |= is_ri_task(child) ? PSW32_MASK_RI : 0;
 | 
								mask |= is_ri_task(child) ? PSW32_MASK_RI : 0;
 | 
				
			||||||
			/* Build a 64 bit psw mask from 31 bit mask. */
 | 
								/* Build a 64 bit psw mask from 31 bit mask. */
 | 
				
			||||||
			if ((tmp & ~mask) != PSW32_USER_BITS)
 | 
								if ((tmp ^ PSW32_USER_BITS) & ~mask)
 | 
				
			||||||
				/* Invalid psw mask. */
 | 
									/* Invalid psw mask. */
 | 
				
			||||||
				return -EINVAL;
 | 
									return -EINVAL;
 | 
				
			||||||
 | 
								if ((data & PSW32_MASK_ASC) == PSW32_ASC_HOME)
 | 
				
			||||||
 | 
									/* Invalid address-space-control bits */
 | 
				
			||||||
 | 
									return -EINVAL;
 | 
				
			||||||
			regs->psw.mask = (regs->psw.mask & ~PSW_MASK_USER) |
 | 
								regs->psw.mask = (regs->psw.mask & ~PSW_MASK_USER) |
 | 
				
			||||||
				(regs->psw.mask & PSW_MASK_BA) |
 | 
									(regs->psw.mask & PSW_MASK_BA) |
 | 
				
			||||||
				(__u64)(tmp & mask) << 32;
 | 
									(__u64)(tmp & mask) << 32;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -48,13 +48,10 @@
 | 
				
			||||||
static LIST_HEAD(zpci_list);
 | 
					static LIST_HEAD(zpci_list);
 | 
				
			||||||
static DEFINE_SPINLOCK(zpci_list_lock);
 | 
					static DEFINE_SPINLOCK(zpci_list_lock);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void zpci_enable_irq(struct irq_data *data);
 | 
					 | 
				
			||||||
static void zpci_disable_irq(struct irq_data *data);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static struct irq_chip zpci_irq_chip = {
 | 
					static struct irq_chip zpci_irq_chip = {
 | 
				
			||||||
	.name = "zPCI",
 | 
						.name = "zPCI",
 | 
				
			||||||
	.irq_unmask = zpci_enable_irq,
 | 
						.irq_unmask = unmask_msi_irq,
 | 
				
			||||||
	.irq_mask = zpci_disable_irq,
 | 
						.irq_mask = mask_msi_irq,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static DECLARE_BITMAP(zpci_domain, ZPCI_NR_DEVICES);
 | 
					static DECLARE_BITMAP(zpci_domain, ZPCI_NR_DEVICES);
 | 
				
			||||||
| 
						 | 
					@ -244,43 +241,6 @@ static int zpci_cfg_store(struct zpci_dev *zdev, int offset, u32 val, u8 len)
 | 
				
			||||||
	return rc;
 | 
						return rc;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int zpci_msi_set_mask_bits(struct msi_desc *msi, u32 mask, u32 flag)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	int offset, pos;
 | 
					 | 
				
			||||||
	u32 mask_bits;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (msi->msi_attrib.is_msix) {
 | 
					 | 
				
			||||||
		offset = msi->msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE +
 | 
					 | 
				
			||||||
			PCI_MSIX_ENTRY_VECTOR_CTRL;
 | 
					 | 
				
			||||||
		msi->masked = readl(msi->mask_base + offset);
 | 
					 | 
				
			||||||
		writel(flag, msi->mask_base + offset);
 | 
					 | 
				
			||||||
	} else if (msi->msi_attrib.maskbit) {
 | 
					 | 
				
			||||||
		pos = (long) msi->mask_base;
 | 
					 | 
				
			||||||
		pci_read_config_dword(msi->dev, pos, &mask_bits);
 | 
					 | 
				
			||||||
		mask_bits &= ~(mask);
 | 
					 | 
				
			||||||
		mask_bits |= flag & mask;
 | 
					 | 
				
			||||||
		pci_write_config_dword(msi->dev, pos, mask_bits);
 | 
					 | 
				
			||||||
	} else
 | 
					 | 
				
			||||||
		return 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	msi->msi_attrib.maskbit = !!flag;
 | 
					 | 
				
			||||||
	return 1;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void zpci_enable_irq(struct irq_data *data)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	struct msi_desc *msi = irq_get_msi_desc(data->irq);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	zpci_msi_set_mask_bits(msi, 1, 0);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void zpci_disable_irq(struct irq_data *data)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	struct msi_desc *msi = irq_get_msi_desc(data->irq);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	zpci_msi_set_mask_bits(msi, 1, 1);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void pcibios_fixup_bus(struct pci_bus *bus)
 | 
					void pcibios_fixup_bus(struct pci_bus *bus)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -487,7 +447,10 @@ void arch_teardown_msi_irqs(struct pci_dev *pdev)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Release MSI interrupts */
 | 
						/* Release MSI interrupts */
 | 
				
			||||||
	list_for_each_entry(msi, &pdev->msi_list, list) {
 | 
						list_for_each_entry(msi, &pdev->msi_list, list) {
 | 
				
			||||||
		zpci_msi_set_mask_bits(msi, 1, 1);
 | 
							if (msi->msi_attrib.is_msix)
 | 
				
			||||||
 | 
								default_msix_mask_irq(msi, 1);
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
								default_msi_mask_irq(msi, 1, 1);
 | 
				
			||||||
		irq_set_msi_desc(msi->irq, NULL);
 | 
							irq_set_msi_desc(msi->irq, NULL);
 | 
				
			||||||
		irq_free_desc(msi->irq);
 | 
							irq_free_desc(msi->irq);
 | 
				
			||||||
		msi->msg.address_lo = 0;
 | 
							msi->msg.address_lo = 0;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -78,6 +78,7 @@ config SPARC64
 | 
				
			||||||
	select HAVE_C_RECORDMCOUNT
 | 
						select HAVE_C_RECORDMCOUNT
 | 
				
			||||||
	select NO_BOOTMEM
 | 
						select NO_BOOTMEM
 | 
				
			||||||
	select HAVE_ARCH_AUDITSYSCALL
 | 
						select HAVE_ARCH_AUDITSYSCALL
 | 
				
			||||||
 | 
						select ARCH_SUPPORTS_ATOMIC_RMW
 | 
				
			||||||
 | 
					
 | 
				
			||||||
config ARCH_DEFCONFIG
 | 
					config ARCH_DEFCONFIG
 | 
				
			||||||
	string
 | 
						string
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -12,6 +12,7 @@
 | 
				
			||||||
#include <mem_user.h>
 | 
					#include <mem_user.h>
 | 
				
			||||||
#include <os.h>
 | 
					#include <os.h>
 | 
				
			||||||
#include <skas.h>
 | 
					#include <skas.h>
 | 
				
			||||||
 | 
					#include <kern_util.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct host_vm_change {
 | 
					struct host_vm_change {
 | 
				
			||||||
	struct host_vm_op {
 | 
						struct host_vm_op {
 | 
				
			||||||
| 
						 | 
					@ -124,6 +125,9 @@ static int add_munmap(unsigned long addr, unsigned long len,
 | 
				
			||||||
	struct host_vm_op *last;
 | 
						struct host_vm_op *last;
 | 
				
			||||||
	int ret = 0;
 | 
						int ret = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if ((addr >= STUB_START) && (addr < STUB_END))
 | 
				
			||||||
 | 
							return -EINVAL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (hvc->index != 0) {
 | 
						if (hvc->index != 0) {
 | 
				
			||||||
		last = &hvc->ops[hvc->index - 1];
 | 
							last = &hvc->ops[hvc->index - 1];
 | 
				
			||||||
		if ((last->type == MUNMAP) &&
 | 
							if ((last->type == MUNMAP) &&
 | 
				
			||||||
| 
						 | 
					@ -283,8 +287,11 @@ void fix_range_common(struct mm_struct *mm, unsigned long start_addr,
 | 
				
			||||||
	/* This is not an else because ret is modified above */
 | 
						/* This is not an else because ret is modified above */
 | 
				
			||||||
	if (ret) {
 | 
						if (ret) {
 | 
				
			||||||
		printk(KERN_ERR "fix_range_common: failed, killing current "
 | 
							printk(KERN_ERR "fix_range_common: failed, killing current "
 | 
				
			||||||
		       "process\n");
 | 
							       "process: %d\n", task_tgid_vnr(current));
 | 
				
			||||||
 | 
							/* We are under mmap_sem, release it such that current can terminate */
 | 
				
			||||||
 | 
							up_write(¤t->mm->mmap_sem);
 | 
				
			||||||
		force_sig(SIGKILL, current);
 | 
							force_sig(SIGKILL, current);
 | 
				
			||||||
 | 
							do_signal();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -206,7 +206,7 @@ unsigned long segv(struct faultinfo fi, unsigned long ip, int is_user,
 | 
				
			||||||
	int is_write = FAULT_WRITE(fi);
 | 
						int is_write = FAULT_WRITE(fi);
 | 
				
			||||||
	unsigned long address = FAULT_ADDRESS(fi);
 | 
						unsigned long address = FAULT_ADDRESS(fi);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (regs)
 | 
						if (!is_user && regs)
 | 
				
			||||||
		current->thread.segv_regs = container_of(regs, struct pt_regs, regs);
 | 
							current->thread.segv_regs = container_of(regs, struct pt_regs, regs);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!is_user && (address >= start_vm) && (address < end_vm)) {
 | 
						if (!is_user && (address >= start_vm) && (address < end_vm)) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -54,7 +54,7 @@ static int ptrace_dump_regs(int pid)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void wait_stub_done(int pid)
 | 
					void wait_stub_done(int pid)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int n, status, err, bad_stop = 0;
 | 
						int n, status, err;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	while (1) {
 | 
						while (1) {
 | 
				
			||||||
		CATCH_EINTR(n = waitpid(pid, &status, WUNTRACED | __WALL));
 | 
							CATCH_EINTR(n = waitpid(pid, &status, WUNTRACED | __WALL));
 | 
				
			||||||
| 
						 | 
					@ -74,8 +74,6 @@ void wait_stub_done(int pid)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (((1 << WSTOPSIG(status)) & STUB_DONE_MASK) != 0)
 | 
						if (((1 << WSTOPSIG(status)) & STUB_DONE_MASK) != 0)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	else
 | 
					 | 
				
			||||||
		bad_stop = 1;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
bad_wait:
 | 
					bad_wait:
 | 
				
			||||||
	err = ptrace_dump_regs(pid);
 | 
						err = ptrace_dump_regs(pid);
 | 
				
			||||||
| 
						 | 
					@ -85,9 +83,6 @@ void wait_stub_done(int pid)
 | 
				
			||||||
	printk(UM_KERN_ERR "wait_stub_done : failed to wait for SIGTRAP, "
 | 
						printk(UM_KERN_ERR "wait_stub_done : failed to wait for SIGTRAP, "
 | 
				
			||||||
	       "pid = %d, n = %d, errno = %d, status = 0x%x\n", pid, n, errno,
 | 
						       "pid = %d, n = %d, errno = %d, status = 0x%x\n", pid, n, errno,
 | 
				
			||||||
	       status);
 | 
						       status);
 | 
				
			||||||
	if (bad_stop)
 | 
					 | 
				
			||||||
		kill(pid, SIGKILL);
 | 
					 | 
				
			||||||
	else
 | 
					 | 
				
			||||||
	fatal_sigsegv();
 | 
						fatal_sigsegv();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -131,6 +131,7 @@ config X86
 | 
				
			||||||
	select HAVE_CC_STACKPROTECTOR
 | 
						select HAVE_CC_STACKPROTECTOR
 | 
				
			||||||
	select GENERIC_CPU_AUTOPROBE
 | 
						select GENERIC_CPU_AUTOPROBE
 | 
				
			||||||
	select HAVE_ARCH_AUDITSYSCALL
 | 
						select HAVE_ARCH_AUDITSYSCALL
 | 
				
			||||||
 | 
						select ARCH_SUPPORTS_ATOMIC_RMW
 | 
				
			||||||
 | 
					
 | 
				
			||||||
config INSTRUCTION_DECODER
 | 
					config INSTRUCTION_DECODER
 | 
				
			||||||
	def_bool y
 | 
						def_bool y
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -91,8 +91,7 @@ bs_die:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	.section ".bsdata", "a"
 | 
						.section ".bsdata", "a"
 | 
				
			||||||
bugger_off_msg:
 | 
					bugger_off_msg:
 | 
				
			||||||
	.ascii	"Direct floppy boot is not supported. "
 | 
						.ascii	"Use a boot loader.\r\n"
 | 
				
			||||||
	.ascii	"Use a boot loader program instead.\r\n"
 | 
					 | 
				
			||||||
	.ascii	"\n"
 | 
						.ascii	"\n"
 | 
				
			||||||
	.ascii	"Remove disk and press any key to reboot...\r\n"
 | 
						.ascii	"Remove disk and press any key to reboot...\r\n"
 | 
				
			||||||
	.byte	0
 | 
						.byte	0
 | 
				
			||||||
| 
						 | 
					@ -108,7 +107,7 @@ coff_header:
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
	.word	0x8664				# x86-64
 | 
						.word	0x8664				# x86-64
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
	.word	3				# nr_sections
 | 
						.word	4				# nr_sections
 | 
				
			||||||
	.long	0 				# TimeDateStamp
 | 
						.long	0 				# TimeDateStamp
 | 
				
			||||||
	.long	0				# PointerToSymbolTable
 | 
						.long	0				# PointerToSymbolTable
 | 
				
			||||||
	.long	1				# NumberOfSymbols
 | 
						.long	1				# NumberOfSymbols
 | 
				
			||||||
| 
						 | 
					@ -250,6 +249,25 @@ section_table:
 | 
				
			||||||
	.word	0				# NumberOfLineNumbers
 | 
						.word	0				# NumberOfLineNumbers
 | 
				
			||||||
	.long	0x60500020			# Characteristics (section flags)
 | 
						.long	0x60500020			# Characteristics (section flags)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						# The offset & size fields are filled in by build.c.
 | 
				
			||||||
 | 
						#
 | 
				
			||||||
 | 
						.ascii	".bss"
 | 
				
			||||||
 | 
						.byte	0
 | 
				
			||||||
 | 
						.byte	0
 | 
				
			||||||
 | 
						.byte	0
 | 
				
			||||||
 | 
						.byte	0
 | 
				
			||||||
 | 
						.long	0
 | 
				
			||||||
 | 
						.long	0x0
 | 
				
			||||||
 | 
						.long	0				# Size of initialized data
 | 
				
			||||||
 | 
											# on disk
 | 
				
			||||||
 | 
						.long	0x0
 | 
				
			||||||
 | 
						.long	0				# PointerToRelocations
 | 
				
			||||||
 | 
						.long	0				# PointerToLineNumbers
 | 
				
			||||||
 | 
						.word	0				# NumberOfRelocations
 | 
				
			||||||
 | 
						.word	0				# NumberOfLineNumbers
 | 
				
			||||||
 | 
						.long	0xc8000080			# Characteristics (section flags)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* CONFIG_EFI_STUB */
 | 
					#endif /* CONFIG_EFI_STUB */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	# Kernel attributes; used by setup.  This is part 1 of the
 | 
						# Kernel attributes; used by setup.  This is part 1 of the
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -143,7 +143,7 @@ static void usage(void)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONFIG_EFI_STUB
 | 
					#ifdef CONFIG_EFI_STUB
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void update_pecoff_section_header(char *section_name, u32 offset, u32 size)
 | 
					static void update_pecoff_section_header_fields(char *section_name, u32 vma, u32 size, u32 datasz, u32 offset)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	unsigned int pe_header;
 | 
						unsigned int pe_header;
 | 
				
			||||||
	unsigned short num_sections;
 | 
						unsigned short num_sections;
 | 
				
			||||||
| 
						 | 
					@ -164,10 +164,10 @@ static void update_pecoff_section_header(char *section_name, u32 offset, u32 siz
 | 
				
			||||||
			put_unaligned_le32(size, section + 0x8);
 | 
								put_unaligned_le32(size, section + 0x8);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			/* section header vma field */
 | 
								/* section header vma field */
 | 
				
			||||||
			put_unaligned_le32(offset, section + 0xc);
 | 
								put_unaligned_le32(vma, section + 0xc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			/* section header 'size of initialised data' field */
 | 
								/* section header 'size of initialised data' field */
 | 
				
			||||||
			put_unaligned_le32(size, section + 0x10);
 | 
								put_unaligned_le32(datasz, section + 0x10);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			/* section header 'file offset' field */
 | 
								/* section header 'file offset' field */
 | 
				
			||||||
			put_unaligned_le32(offset, section + 0x14);
 | 
								put_unaligned_le32(offset, section + 0x14);
 | 
				
			||||||
| 
						 | 
					@ -179,6 +179,11 @@ static void update_pecoff_section_header(char *section_name, u32 offset, u32 siz
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void update_pecoff_section_header(char *section_name, u32 offset, u32 size)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						update_pecoff_section_header_fields(section_name, offset, size, size, offset);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void update_pecoff_setup_and_reloc(unsigned int size)
 | 
					static void update_pecoff_setup_and_reloc(unsigned int size)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	u32 setup_offset = 0x200;
 | 
						u32 setup_offset = 0x200;
 | 
				
			||||||
| 
						 | 
					@ -203,9 +208,6 @@ static void update_pecoff_text(unsigned int text_start, unsigned int file_sz)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pe_header = get_unaligned_le32(&buf[0x3c]);
 | 
						pe_header = get_unaligned_le32(&buf[0x3c]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Size of image */
 | 
					 | 
				
			||||||
	put_unaligned_le32(file_sz, &buf[pe_header + 0x50]);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * Size of code: Subtract the size of the first sector (512 bytes)
 | 
						 * Size of code: Subtract the size of the first sector (512 bytes)
 | 
				
			||||||
	 * which includes the header.
 | 
						 * which includes the header.
 | 
				
			||||||
| 
						 | 
					@ -220,6 +222,22 @@ static void update_pecoff_text(unsigned int text_start, unsigned int file_sz)
 | 
				
			||||||
	update_pecoff_section_header(".text", text_start, text_sz);
 | 
						update_pecoff_section_header(".text", text_start, text_sz);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void update_pecoff_bss(unsigned int file_sz, unsigned int init_sz)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						unsigned int pe_header;
 | 
				
			||||||
 | 
						unsigned int bss_sz = init_sz - file_sz;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pe_header = get_unaligned_le32(&buf[0x3c]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Size of uninitialized data */
 | 
				
			||||||
 | 
						put_unaligned_le32(bss_sz, &buf[pe_header + 0x24]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Size of image */
 | 
				
			||||||
 | 
						put_unaligned_le32(init_sz, &buf[pe_header + 0x50]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						update_pecoff_section_header_fields(".bss", file_sz, bss_sz, 0, 0);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int reserve_pecoff_reloc_section(int c)
 | 
					static int reserve_pecoff_reloc_section(int c)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* Reserve 0x20 bytes for .reloc section */
 | 
						/* Reserve 0x20 bytes for .reloc section */
 | 
				
			||||||
| 
						 | 
					@ -259,6 +277,8 @@ static void efi_stub_entry_update(void)
 | 
				
			||||||
static inline void update_pecoff_setup_and_reloc(unsigned int size) {}
 | 
					static inline void update_pecoff_setup_and_reloc(unsigned int size) {}
 | 
				
			||||||
static inline void update_pecoff_text(unsigned int text_start,
 | 
					static inline void update_pecoff_text(unsigned int text_start,
 | 
				
			||||||
				      unsigned int file_sz) {}
 | 
									      unsigned int file_sz) {}
 | 
				
			||||||
 | 
					static inline void update_pecoff_bss(unsigned int file_sz,
 | 
				
			||||||
 | 
									     unsigned int init_sz) {}
 | 
				
			||||||
static inline void efi_stub_defaults(void) {}
 | 
					static inline void efi_stub_defaults(void) {}
 | 
				
			||||||
static inline void efi_stub_entry_update(void) {}
 | 
					static inline void efi_stub_entry_update(void) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -310,7 +330,7 @@ static void parse_zoffset(char *fname)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int main(int argc, char ** argv)
 | 
					int main(int argc, char ** argv)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	unsigned int i, sz, setup_sectors;
 | 
						unsigned int i, sz, setup_sectors, init_sz;
 | 
				
			||||||
	int c;
 | 
						int c;
 | 
				
			||||||
	u32 sys_size;
 | 
						u32 sys_size;
 | 
				
			||||||
	struct stat sb;
 | 
						struct stat sb;
 | 
				
			||||||
| 
						 | 
					@ -376,7 +396,9 @@ int main(int argc, char ** argv)
 | 
				
			||||||
	buf[0x1f1] = setup_sectors-1;
 | 
						buf[0x1f1] = setup_sectors-1;
 | 
				
			||||||
	put_unaligned_le32(sys_size, &buf[0x1f4]);
 | 
						put_unaligned_le32(sys_size, &buf[0x1f4]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	update_pecoff_text(setup_sectors * 512, sz + i + ((sys_size * 16) - sz));
 | 
						update_pecoff_text(setup_sectors * 512, i + (sys_size * 16));
 | 
				
			||||||
 | 
						init_sz = get_unaligned_le32(&buf[0x260]);
 | 
				
			||||||
 | 
						update_pecoff_bss(i + (sys_size * 16), init_sz);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	efi_stub_entry_update();
 | 
						efi_stub_entry_update();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -841,7 +841,6 @@ static int apm_do_idle(void)
 | 
				
			||||||
	u32 eax;
 | 
						u32 eax;
 | 
				
			||||||
	u8 ret = 0;
 | 
						u8 ret = 0;
 | 
				
			||||||
	int idled = 0;
 | 
						int idled = 0;
 | 
				
			||||||
	int polling;
 | 
					 | 
				
			||||||
	int err = 0;
 | 
						int err = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!need_resched()) {
 | 
						if (!need_resched()) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1381,6 +1381,15 @@ static int intel_pmu_handle_irq(struct pt_regs *regs)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	intel_pmu_lbr_read();
 | 
						intel_pmu_lbr_read();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * CondChgd bit 63 doesn't mean any overflow status. Ignore
 | 
				
			||||||
 | 
						 * and clear the bit.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						if (__test_and_clear_bit(63, (unsigned long *)&status)) {
 | 
				
			||||||
 | 
							if (!status)
 | 
				
			||||||
 | 
								goto done;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * PEBS overflow sets bit 62 in the global status register
 | 
						 * PEBS overflow sets bit 62 in the global status register
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -175,7 +175,7 @@ void init_espfix_ap(void)
 | 
				
			||||||
	if (!pud_present(pud)) {
 | 
						if (!pud_present(pud)) {
 | 
				
			||||||
		pmd_p = (pmd_t *)__get_free_page(PGALLOC_GFP);
 | 
							pmd_p = (pmd_t *)__get_free_page(PGALLOC_GFP);
 | 
				
			||||||
		pud = __pud(__pa(pmd_p) | (PGTABLE_PROT & ptemask));
 | 
							pud = __pud(__pa(pmd_p) | (PGTABLE_PROT & ptemask));
 | 
				
			||||||
		paravirt_alloc_pud(&init_mm, __pa(pmd_p) >> PAGE_SHIFT);
 | 
							paravirt_alloc_pmd(&init_mm, __pa(pmd_p) >> PAGE_SHIFT);
 | 
				
			||||||
		for (n = 0; n < ESPFIX_PUD_CLONES; n++)
 | 
							for (n = 0; n < ESPFIX_PUD_CLONES; n++)
 | 
				
			||||||
			set_pud(&pud_p[n], pud);
 | 
								set_pud(&pud_p[n], pud);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -185,7 +185,7 @@ void init_espfix_ap(void)
 | 
				
			||||||
	if (!pmd_present(pmd)) {
 | 
						if (!pmd_present(pmd)) {
 | 
				
			||||||
		pte_p = (pte_t *)__get_free_page(PGALLOC_GFP);
 | 
							pte_p = (pte_t *)__get_free_page(PGALLOC_GFP);
 | 
				
			||||||
		pmd = __pmd(__pa(pte_p) | (PGTABLE_PROT & ptemask));
 | 
							pmd = __pmd(__pa(pte_p) | (PGTABLE_PROT & ptemask));
 | 
				
			||||||
		paravirt_alloc_pmd(&init_mm, __pa(pte_p) >> PAGE_SHIFT);
 | 
							paravirt_alloc_pte(&init_mm, __pa(pte_p) >> PAGE_SHIFT);
 | 
				
			||||||
		for (n = 0; n < ESPFIX_PMD_CLONES; n++)
 | 
							for (n = 0; n < ESPFIX_PMD_CLONES; n++)
 | 
				
			||||||
			set_pmd(&pmd_p[n], pmd);
 | 
								set_pmd(&pmd_p[n], pmd);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -193,7 +193,6 @@ void init_espfix_ap(void)
 | 
				
			||||||
	pte_p = pte_offset_kernel(&pmd, addr);
 | 
						pte_p = pte_offset_kernel(&pmd, addr);
 | 
				
			||||||
	stack_page = (void *)__get_free_page(GFP_KERNEL);
 | 
						stack_page = (void *)__get_free_page(GFP_KERNEL);
 | 
				
			||||||
	pte = __pte(__pa(stack_page) | (__PAGE_KERNEL_RO & ptemask));
 | 
						pte = __pte(__pa(stack_page) | (__PAGE_KERNEL_RO & ptemask));
 | 
				
			||||||
	paravirt_alloc_pte(&init_mm, __pa(stack_page) >> PAGE_SHIFT);
 | 
					 | 
				
			||||||
	for (n = 0; n < ESPFIX_PTE_CLONES; n++)
 | 
						for (n = 0; n < ESPFIX_PTE_CLONES; n++)
 | 
				
			||||||
		set_pte(&pte_p[n*PTE_STRIDE], pte);
 | 
							set_pte(&pte_p[n*PTE_STRIDE], pte);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5887,6 +5887,18 @@ static int inject_pending_event(struct kvm_vcpu *vcpu, bool req_int_win)
 | 
				
			||||||
			kvm_x86_ops->set_nmi(vcpu);
 | 
								kvm_x86_ops->set_nmi(vcpu);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	} else if (kvm_cpu_has_injectable_intr(vcpu)) {
 | 
						} else if (kvm_cpu_has_injectable_intr(vcpu)) {
 | 
				
			||||||
 | 
							/*
 | 
				
			||||||
 | 
							 * Because interrupts can be injected asynchronously, we are
 | 
				
			||||||
 | 
							 * calling check_nested_events again here to avoid a race condition.
 | 
				
			||||||
 | 
							 * See https://lkml.org/lkml/2014/7/2/60 for discussion about this
 | 
				
			||||||
 | 
							 * proposal and current concerns.  Perhaps we should be setting
 | 
				
			||||||
 | 
							 * KVM_REQ_EVENT only on certain events and not unconditionally?
 | 
				
			||||||
 | 
							 */
 | 
				
			||||||
 | 
							if (is_guest_mode(vcpu) && kvm_x86_ops->check_nested_events) {
 | 
				
			||||||
 | 
								r = kvm_x86_ops->check_nested_events(vcpu, req_int_win);
 | 
				
			||||||
 | 
								if (r != 0)
 | 
				
			||||||
 | 
									return r;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		if (kvm_x86_ops->interrupt_allowed(vcpu)) {
 | 
							if (kvm_x86_ops->interrupt_allowed(vcpu)) {
 | 
				
			||||||
			kvm_queue_interrupt(vcpu, kvm_cpu_get_interrupt(vcpu),
 | 
								kvm_queue_interrupt(vcpu, kvm_cpu_get_interrupt(vcpu),
 | 
				
			||||||
					    false);
 | 
										    false);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -872,6 +872,13 @@ void blkcg_drain_queue(struct request_queue *q)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	lockdep_assert_held(q->queue_lock);
 | 
						lockdep_assert_held(q->queue_lock);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * @q could be exiting and already have destroyed all blkgs as
 | 
				
			||||||
 | 
						 * indicated by NULL root_blkg.  If so, don't confuse policies.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						if (!q->root_blkg)
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	blk_throtl_drain(q);
 | 
						blk_throtl_drain(q);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -27,18 +27,15 @@ struct request *blk_queue_find_tag(struct request_queue *q, int tag)
 | 
				
			||||||
EXPORT_SYMBOL(blk_queue_find_tag);
 | 
					EXPORT_SYMBOL(blk_queue_find_tag);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * __blk_free_tags - release a given set of tag maintenance info
 | 
					 * blk_free_tags - release a given set of tag maintenance info
 | 
				
			||||||
 * @bqt:	the tag map to free
 | 
					 * @bqt:	the tag map to free
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * Tries to free the specified @bqt.  Returns true if it was
 | 
					 * Drop the reference count on @bqt and frees it when the last reference
 | 
				
			||||||
 * actually freed and false if there are still references using it
 | 
					 * is dropped.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
static int __blk_free_tags(struct blk_queue_tag *bqt)
 | 
					void blk_free_tags(struct blk_queue_tag *bqt)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int retval;
 | 
						if (atomic_dec_and_test(&bqt->refcnt)) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
	retval = atomic_dec_and_test(&bqt->refcnt);
 | 
					 | 
				
			||||||
	if (retval) {
 | 
					 | 
				
			||||||
		BUG_ON(find_first_bit(bqt->tag_map, bqt->max_depth) <
 | 
							BUG_ON(find_first_bit(bqt->tag_map, bqt->max_depth) <
 | 
				
			||||||
							bqt->max_depth);
 | 
												bqt->max_depth);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -50,9 +47,8 @@ static int __blk_free_tags(struct blk_queue_tag *bqt)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		kfree(bqt);
 | 
							kfree(bqt);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					 | 
				
			||||||
	return retval;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					EXPORT_SYMBOL(blk_free_tags);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * __blk_queue_free_tags - release tag maintenance info
 | 
					 * __blk_queue_free_tags - release tag maintenance info
 | 
				
			||||||
| 
						 | 
					@ -69,27 +65,12 @@ void __blk_queue_free_tags(struct request_queue *q)
 | 
				
			||||||
	if (!bqt)
 | 
						if (!bqt)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	__blk_free_tags(bqt);
 | 
						blk_free_tags(bqt);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	q->queue_tags = NULL;
 | 
						q->queue_tags = NULL;
 | 
				
			||||||
	queue_flag_clear_unlocked(QUEUE_FLAG_QUEUED, q);
 | 
						queue_flag_clear_unlocked(QUEUE_FLAG_QUEUED, q);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * blk_free_tags - release a given set of tag maintenance info
 | 
					 | 
				
			||||||
 * @bqt:	the tag map to free
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * For externally managed @bqt frees the map.  Callers of this
 | 
					 | 
				
			||||||
 * function must guarantee to have released all the queues that
 | 
					 | 
				
			||||||
 * might have been using this tag map.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
void blk_free_tags(struct blk_queue_tag *bqt)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	if (unlikely(!__blk_free_tags(bqt)))
 | 
					 | 
				
			||||||
		BUG();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
EXPORT_SYMBOL(blk_free_tags);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * blk_queue_free_tags - release tag maintenance info
 | 
					 * blk_queue_free_tags - release tag maintenance info
 | 
				
			||||||
 * @q:  the request queue for the device
 | 
					 * @q:  the request queue for the device
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -690,6 +690,7 @@ long compat_blkdev_ioctl(struct file *file, unsigned cmd, unsigned long arg)
 | 
				
			||||||
	case BLKROSET:
 | 
						case BLKROSET:
 | 
				
			||||||
	case BLKDISCARD:
 | 
						case BLKDISCARD:
 | 
				
			||||||
	case BLKSECDISCARD:
 | 
						case BLKSECDISCARD:
 | 
				
			||||||
 | 
						case BLKZEROOUT:
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * the ones below are implemented in blkdev_locked_ioctl,
 | 
						 * the ones below are implemented in blkdev_locked_ioctl,
 | 
				
			||||||
	 * but we call blkdev_ioctl, which gets the lock for us
 | 
						 * but we call blkdev_ioctl, which gets the lock for us
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -68,7 +68,7 @@ MODULE_AUTHOR("Bruno Ducrot");
 | 
				
			||||||
MODULE_DESCRIPTION("ACPI Video Driver");
 | 
					MODULE_DESCRIPTION("ACPI Video Driver");
 | 
				
			||||||
MODULE_LICENSE("GPL");
 | 
					MODULE_LICENSE("GPL");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static bool brightness_switch_enabled;
 | 
					static bool brightness_switch_enabled = 1;
 | 
				
			||||||
module_param(brightness_switch_enabled, bool, 0644);
 | 
					module_param(brightness_switch_enabled, bool, 0644);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
| 
						 | 
					@ -581,6 +581,14 @@ static struct dmi_system_id video_dmi_table[] __initdata = {
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
	.callback = video_set_use_native_backlight,
 | 
						.callback = video_set_use_native_backlight,
 | 
				
			||||||
 | 
						.ident = "HP ProBook 4540s",
 | 
				
			||||||
 | 
						.matches = {
 | 
				
			||||||
 | 
							DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
 | 
				
			||||||
 | 
							DMI_MATCH(DMI_PRODUCT_VERSION, "HP ProBook 4540s"),
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
						.callback = video_set_use_native_backlight,
 | 
				
			||||||
	.ident = "HP ProBook 2013 models",
 | 
						.ident = "HP ProBook 2013 models",
 | 
				
			||||||
	.matches = {
 | 
						.matches = {
 | 
				
			||||||
		DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
 | 
							DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -456,6 +456,7 @@ static const struct pci_device_id ahci_pci_tbl[] = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Promise */
 | 
						/* Promise */
 | 
				
			||||||
	{ PCI_VDEVICE(PROMISE, 0x3f20), board_ahci },	/* PDC42819 */
 | 
						{ PCI_VDEVICE(PROMISE, 0x3f20), board_ahci },	/* PDC42819 */
 | 
				
			||||||
 | 
						{ PCI_VDEVICE(PROMISE, 0x3781), board_ahci },   /* FastTrak TX8660 ahci-mode */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Asmedia */
 | 
						/* Asmedia */
 | 
				
			||||||
	{ PCI_VDEVICE(ASMEDIA, 0x0601), board_ahci },	/* ASM1060 */
 | 
						{ PCI_VDEVICE(ASMEDIA, 0x0601), board_ahci },	/* ASM1060 */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4787,6 +4787,10 @@ void swap_buf_le16(u16 *buf, unsigned int buf_words)
 | 
				
			||||||
 *	ata_qc_new - Request an available ATA command, for queueing
 | 
					 *	ata_qc_new - Request an available ATA command, for queueing
 | 
				
			||||||
 *	@ap: target port
 | 
					 *	@ap: target port
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 | 
					 *	Some ATA host controllers may implement a queue depth which is less
 | 
				
			||||||
 | 
					 *	than ATA_MAX_QUEUE. So we shouldn't allocate a tag which is beyond
 | 
				
			||||||
 | 
					 *	the hardware limitation.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 *	LOCKING:
 | 
					 *	LOCKING:
 | 
				
			||||||
 *	None.
 | 
					 *	None.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
| 
						 | 
					@ -4794,14 +4798,16 @@ void swap_buf_le16(u16 *buf, unsigned int buf_words)
 | 
				
			||||||
static struct ata_queued_cmd *ata_qc_new(struct ata_port *ap)
 | 
					static struct ata_queued_cmd *ata_qc_new(struct ata_port *ap)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct ata_queued_cmd *qc = NULL;
 | 
						struct ata_queued_cmd *qc = NULL;
 | 
				
			||||||
	unsigned int i, tag;
 | 
						unsigned int i, tag, max_queue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						max_queue = ap->scsi_host->can_queue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* no command while frozen */
 | 
						/* no command while frozen */
 | 
				
			||||||
	if (unlikely(ap->pflags & ATA_PFLAG_FROZEN))
 | 
						if (unlikely(ap->pflags & ATA_PFLAG_FROZEN))
 | 
				
			||||||
		return NULL;
 | 
							return NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (i = 0; i < ATA_MAX_QUEUE; i++) {
 | 
						for (i = 0, tag = ap->last_tag + 1; i < max_queue; i++, tag++) {
 | 
				
			||||||
		tag = (i + ap->last_tag + 1) % ATA_MAX_QUEUE;
 | 
							tag = tag < max_queue ? tag : 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* the last tag is reserved for internal command. */
 | 
							/* the last tag is reserved for internal command. */
 | 
				
			||||||
		if (tag == ATA_TAG_INTERNAL)
 | 
							if (tag == ATA_TAG_INTERNAL)
 | 
				
			||||||
| 
						 | 
					@ -6169,6 +6175,16 @@ int ata_host_register(struct ata_host *host, struct scsi_host_template *sht)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int i, rc;
 | 
						int i, rc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * The max queue supported by hardware must not be greater than
 | 
				
			||||||
 | 
						 * ATA_MAX_QUEUE.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						if (sht->can_queue > ATA_MAX_QUEUE) {
 | 
				
			||||||
 | 
							dev_err(host->dev, "BUG: the hardware max queue is too large\n");
 | 
				
			||||||
 | 
							WARN_ON(1);
 | 
				
			||||||
 | 
							return -EINVAL;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* host must have been started */
 | 
						/* host must have been started */
 | 
				
			||||||
	if (!(host->flags & ATA_HOST_STARTED)) {
 | 
						if (!(host->flags & ATA_HOST_STARTED)) {
 | 
				
			||||||
		dev_err(host->dev, "BUG: trying to register unstarted host\n");
 | 
							dev_err(host->dev, "BUG: trying to register unstarted host\n");
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1811,7 +1811,7 @@ static unsigned int ata_eh_analyze_tf(struct ata_queued_cmd *qc,
 | 
				
			||||||
	case ATA_DEV_ATA:
 | 
						case ATA_DEV_ATA:
 | 
				
			||||||
		if (err & ATA_ICRC)
 | 
							if (err & ATA_ICRC)
 | 
				
			||||||
			qc->err_mask |= AC_ERR_ATA_BUS;
 | 
								qc->err_mask |= AC_ERR_ATA_BUS;
 | 
				
			||||||
		if (err & ATA_UNC)
 | 
							if (err & (ATA_UNC | ATA_AMNF))
 | 
				
			||||||
			qc->err_mask |= AC_ERR_MEDIA;
 | 
								qc->err_mask |= AC_ERR_MEDIA;
 | 
				
			||||||
		if (err & ATA_IDNF)
 | 
							if (err & ATA_IDNF)
 | 
				
			||||||
			qc->err_mask |= AC_ERR_INVALID;
 | 
								qc->err_mask |= AC_ERR_INVALID;
 | 
				
			||||||
| 
						 | 
					@ -2556,11 +2556,12 @@ static void ata_eh_link_report(struct ata_link *link)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (cmd->command != ATA_CMD_PACKET &&
 | 
							if (cmd->command != ATA_CMD_PACKET &&
 | 
				
			||||||
		    (res->feature & (ATA_ICRC | ATA_UNC | ATA_IDNF |
 | 
							    (res->feature & (ATA_ICRC | ATA_UNC | ATA_AMNF |
 | 
				
			||||||
				     ATA_ABORTED)))
 | 
									     ATA_IDNF | ATA_ABORTED)))
 | 
				
			||||||
			ata_dev_err(qc->dev, "error: { %s%s%s%s}\n",
 | 
								ata_dev_err(qc->dev, "error: { %s%s%s%s%s}\n",
 | 
				
			||||||
			  res->feature & ATA_ICRC ? "ICRC " : "",
 | 
								  res->feature & ATA_ICRC ? "ICRC " : "",
 | 
				
			||||||
			  res->feature & ATA_UNC ? "UNC " : "",
 | 
								  res->feature & ATA_UNC ? "UNC " : "",
 | 
				
			||||||
 | 
								  res->feature & ATA_AMNF ? "AMNF " : "",
 | 
				
			||||||
			  res->feature & ATA_IDNF ? "IDNF " : "",
 | 
								  res->feature & ATA_IDNF ? "IDNF " : "",
 | 
				
			||||||
			  res->feature & ATA_ABORTED ? "ABRT " : "");
 | 
								  res->feature & ATA_ABORTED ? "ABRT " : "");
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -915,7 +915,7 @@ static int ep93xx_pata_probe(struct platform_device *pdev)
 | 
				
			||||||
	struct ep93xx_pata_data *drv_data;
 | 
						struct ep93xx_pata_data *drv_data;
 | 
				
			||||||
	struct ata_host *host;
 | 
						struct ata_host *host;
 | 
				
			||||||
	struct ata_port *ap;
 | 
						struct ata_port *ap;
 | 
				
			||||||
	unsigned int irq;
 | 
						int irq;
 | 
				
			||||||
	struct resource *mem_res;
 | 
						struct resource *mem_res;
 | 
				
			||||||
	void __iomem *ide_base;
 | 
						void __iomem *ide_base;
 | 
				
			||||||
	int err;
 | 
						int err;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -89,8 +89,13 @@ int platform_get_irq(struct platform_device *dev, unsigned int num)
 | 
				
			||||||
	return dev->archdata.irqs[num];
 | 
						return dev->archdata.irqs[num];
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
	struct resource *r;
 | 
						struct resource *r;
 | 
				
			||||||
	if (IS_ENABLED(CONFIG_OF_IRQ) && dev->dev.of_node)
 | 
						if (IS_ENABLED(CONFIG_OF_IRQ) && dev->dev.of_node) {
 | 
				
			||||||
		return of_irq_get(dev->dev.of_node, num);
 | 
							int ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							ret = of_irq_get(dev->dev.of_node, num);
 | 
				
			||||||
 | 
							if (ret >= 0 || ret == -EPROBE_DEFER)
 | 
				
			||||||
 | 
								return ret;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	r = platform_get_resource(dev, IORESOURCE_IRQ, num);
 | 
						r = platform_get_resource(dev, IORESOURCE_IRQ, num);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -133,8 +138,13 @@ int platform_get_irq_byname(struct platform_device *dev, const char *name)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct resource *r;
 | 
						struct resource *r;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (IS_ENABLED(CONFIG_OF_IRQ) && dev->dev.of_node)
 | 
						if (IS_ENABLED(CONFIG_OF_IRQ) && dev->dev.of_node) {
 | 
				
			||||||
		return of_irq_get_byname(dev->dev.of_node, name);
 | 
							int ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							ret = of_irq_get_byname(dev->dev.of_node, name);
 | 
				
			||||||
 | 
							if (ret >= 0 || ret == -EPROBE_DEFER)
 | 
				
			||||||
 | 
								return ret;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	r = platform_get_resource_byname(dev, IORESOURCE_IRQ, name);
 | 
						r = platform_get_resource_byname(dev, IORESOURCE_IRQ, name);
 | 
				
			||||||
	return r ? r->start : -ENXIO;
 | 
						return r ? r->start : -ENXIO;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -544,6 +544,12 @@ void conn_try_outdate_peer_async(struct drbd_connection *connection)
 | 
				
			||||||
	struct task_struct *opa;
 | 
						struct task_struct *opa;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	kref_get(&connection->kref);
 | 
						kref_get(&connection->kref);
 | 
				
			||||||
 | 
						/* We may just have force_sig()'ed this thread
 | 
				
			||||||
 | 
						 * to get it out of some blocking network function.
 | 
				
			||||||
 | 
						 * Clear signals; otherwise kthread_run(), which internally uses
 | 
				
			||||||
 | 
						 * wait_on_completion_killable(), will mistake our pending signal
 | 
				
			||||||
 | 
						 * for a new fatal signal and fail. */
 | 
				
			||||||
 | 
						flush_signals(current);
 | 
				
			||||||
	opa = kthread_run(_try_outdate_peer_async, connection, "drbd_async_h");
 | 
						opa = kthread_run(_try_outdate_peer_async, connection, "drbd_async_h");
 | 
				
			||||||
	if (IS_ERR(opa)) {
 | 
						if (IS_ERR(opa)) {
 | 
				
			||||||
		drbd_err(connection, "out of mem, failed to invoke fence-peer helper\n");
 | 
							drbd_err(connection, "out of mem, failed to invoke fence-peer helper\n");
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -90,7 +90,6 @@ static const struct usb_device_id ath3k_table[] = {
 | 
				
			||||||
	{ USB_DEVICE(0x0b05, 0x17d0) },
 | 
						{ USB_DEVICE(0x0b05, 0x17d0) },
 | 
				
			||||||
	{ USB_DEVICE(0x0CF3, 0x0036) },
 | 
						{ USB_DEVICE(0x0CF3, 0x0036) },
 | 
				
			||||||
	{ USB_DEVICE(0x0CF3, 0x3004) },
 | 
						{ USB_DEVICE(0x0CF3, 0x3004) },
 | 
				
			||||||
	{ USB_DEVICE(0x0CF3, 0x3005) },
 | 
					 | 
				
			||||||
	{ USB_DEVICE(0x0CF3, 0x3008) },
 | 
						{ USB_DEVICE(0x0CF3, 0x3008) },
 | 
				
			||||||
	{ USB_DEVICE(0x0CF3, 0x311D) },
 | 
						{ USB_DEVICE(0x0CF3, 0x311D) },
 | 
				
			||||||
	{ USB_DEVICE(0x0CF3, 0x311E) },
 | 
						{ USB_DEVICE(0x0CF3, 0x311E) },
 | 
				
			||||||
| 
						 | 
					@ -140,7 +139,6 @@ static const struct usb_device_id ath3k_blist_tbl[] = {
 | 
				
			||||||
	{ USB_DEVICE(0x0b05, 0x17d0), .driver_info = BTUSB_ATH3012 },
 | 
						{ USB_DEVICE(0x0b05, 0x17d0), .driver_info = BTUSB_ATH3012 },
 | 
				
			||||||
	{ USB_DEVICE(0x0CF3, 0x0036), .driver_info = BTUSB_ATH3012 },
 | 
						{ USB_DEVICE(0x0CF3, 0x0036), .driver_info = BTUSB_ATH3012 },
 | 
				
			||||||
	{ USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_ATH3012 },
 | 
						{ USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_ATH3012 },
 | 
				
			||||||
	{ USB_DEVICE(0x0cf3, 0x3005), .driver_info = BTUSB_ATH3012 },
 | 
					 | 
				
			||||||
	{ USB_DEVICE(0x0cf3, 0x3008), .driver_info = BTUSB_ATH3012 },
 | 
						{ USB_DEVICE(0x0cf3, 0x3008), .driver_info = BTUSB_ATH3012 },
 | 
				
			||||||
	{ USB_DEVICE(0x0cf3, 0x311D), .driver_info = BTUSB_ATH3012 },
 | 
						{ USB_DEVICE(0x0cf3, 0x311D), .driver_info = BTUSB_ATH3012 },
 | 
				
			||||||
	{ USB_DEVICE(0x0cf3, 0x311E), .driver_info = BTUSB_ATH3012 },
 | 
						{ USB_DEVICE(0x0cf3, 0x311E), .driver_info = BTUSB_ATH3012 },
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -162,7 +162,6 @@ static const struct usb_device_id blacklist_table[] = {
 | 
				
			||||||
	{ USB_DEVICE(0x0b05, 0x17d0), .driver_info = BTUSB_ATH3012 },
 | 
						{ USB_DEVICE(0x0b05, 0x17d0), .driver_info = BTUSB_ATH3012 },
 | 
				
			||||||
	{ USB_DEVICE(0x0cf3, 0x0036), .driver_info = BTUSB_ATH3012 },
 | 
						{ USB_DEVICE(0x0cf3, 0x0036), .driver_info = BTUSB_ATH3012 },
 | 
				
			||||||
	{ USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_ATH3012 },
 | 
						{ USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_ATH3012 },
 | 
				
			||||||
	{ USB_DEVICE(0x0cf3, 0x3005), .driver_info = BTUSB_ATH3012 },
 | 
					 | 
				
			||||||
	{ USB_DEVICE(0x0cf3, 0x3008), .driver_info = BTUSB_ATH3012 },
 | 
						{ USB_DEVICE(0x0cf3, 0x3008), .driver_info = BTUSB_ATH3012 },
 | 
				
			||||||
	{ USB_DEVICE(0x0cf3, 0x311d), .driver_info = BTUSB_ATH3012 },
 | 
						{ USB_DEVICE(0x0cf3, 0x311d), .driver_info = BTUSB_ATH3012 },
 | 
				
			||||||
	{ USB_DEVICE(0x0cf3, 0x311e), .driver_info = BTUSB_ATH3012 },
 | 
						{ USB_DEVICE(0x0cf3, 0x311e), .driver_info = BTUSB_ATH3012 },
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -406,6 +406,7 @@ static int h5_rx_3wire_hdr(struct hci_uart *hu, unsigned char c)
 | 
				
			||||||
	    H5_HDR_PKT_TYPE(hdr) != HCI_3WIRE_LINK_PKT) {
 | 
						    H5_HDR_PKT_TYPE(hdr) != HCI_3WIRE_LINK_PKT) {
 | 
				
			||||||
		BT_ERR("Non-link packet received in non-active state");
 | 
							BT_ERR("Non-link packet received in non-active state");
 | 
				
			||||||
		h5_reset_rx(h5);
 | 
							h5_reset_rx(h5);
 | 
				
			||||||
 | 
							return 0;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	h5->rx_func = h5_rx_payload;
 | 
						h5->rx_func = h5_rx_payload;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -55,16 +55,41 @@ static DEFINE_MUTEX(rng_mutex);
 | 
				
			||||||
static int data_avail;
 | 
					static int data_avail;
 | 
				
			||||||
static u8 *rng_buffer;
 | 
					static u8 *rng_buffer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline int rng_get_data(struct hwrng *rng, u8 *buffer, size_t size,
 | 
				
			||||||
 | 
								       int wait);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static size_t rng_buffer_size(void)
 | 
					static size_t rng_buffer_size(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return SMP_CACHE_BYTES < 32 ? 32 : SMP_CACHE_BYTES;
 | 
						return SMP_CACHE_BYTES < 32 ? 32 : SMP_CACHE_BYTES;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void add_early_randomness(struct hwrng *rng)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						unsigned char bytes[16];
 | 
				
			||||||
 | 
						int bytes_read;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * Currently only virtio-rng cannot return data during device
 | 
				
			||||||
 | 
						 * probe, and that's handled in virtio-rng.c itself.  If there
 | 
				
			||||||
 | 
						 * are more such devices, this call to rng_get_data can be
 | 
				
			||||||
 | 
						 * made conditional here instead of doing it per-device.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						bytes_read = rng_get_data(rng, bytes, sizeof(bytes), 1);
 | 
				
			||||||
 | 
						if (bytes_read > 0)
 | 
				
			||||||
 | 
							add_device_randomness(bytes, bytes_read);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline int hwrng_init(struct hwrng *rng)
 | 
					static inline int hwrng_init(struct hwrng *rng)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (!rng->init)
 | 
						if (rng->init) {
 | 
				
			||||||
 | 
							int ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							ret =  rng->init(rng);
 | 
				
			||||||
 | 
							if (ret)
 | 
				
			||||||
 | 
								return ret;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						add_early_randomness(rng);
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
	return rng->init(rng);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline void hwrng_cleanup(struct hwrng *rng)
 | 
					static inline void hwrng_cleanup(struct hwrng *rng)
 | 
				
			||||||
| 
						 | 
					@ -304,8 +329,6 @@ int hwrng_register(struct hwrng *rng)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int err = -EINVAL;
 | 
						int err = -EINVAL;
 | 
				
			||||||
	struct hwrng *old_rng, *tmp;
 | 
						struct hwrng *old_rng, *tmp;
 | 
				
			||||||
	unsigned char bytes[16];
 | 
					 | 
				
			||||||
	int bytes_read;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (rng->name == NULL ||
 | 
						if (rng->name == NULL ||
 | 
				
			||||||
	    (rng->data_read == NULL && rng->read == NULL))
 | 
						    (rng->data_read == NULL && rng->read == NULL))
 | 
				
			||||||
| 
						 | 
					@ -347,9 +370,17 @@ int hwrng_register(struct hwrng *rng)
 | 
				
			||||||
	INIT_LIST_HEAD(&rng->list);
 | 
						INIT_LIST_HEAD(&rng->list);
 | 
				
			||||||
	list_add_tail(&rng->list, &rng_list);
 | 
						list_add_tail(&rng->list, &rng_list);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bytes_read = rng_get_data(rng, bytes, sizeof(bytes), 1);
 | 
						if (old_rng && !rng->init) {
 | 
				
			||||||
	if (bytes_read > 0)
 | 
							/*
 | 
				
			||||||
		add_device_randomness(bytes, bytes_read);
 | 
							 * Use a new device's input to add some randomness to
 | 
				
			||||||
 | 
							 * the system.  If this rng device isn't going to be
 | 
				
			||||||
 | 
							 * used right away, its init function hasn't been
 | 
				
			||||||
 | 
							 * called yet; so only use the randomness from devices
 | 
				
			||||||
 | 
							 * that don't need an init callback.
 | 
				
			||||||
 | 
							 */
 | 
				
			||||||
 | 
							add_early_randomness(rng);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
out_unlock:
 | 
					out_unlock:
 | 
				
			||||||
	mutex_unlock(&rng_mutex);
 | 
						mutex_unlock(&rng_mutex);
 | 
				
			||||||
out:
 | 
					out:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -38,6 +38,8 @@ struct virtrng_info {
 | 
				
			||||||
	int index;
 | 
						int index;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static bool probe_done;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void random_recv_done(struct virtqueue *vq)
 | 
					static void random_recv_done(struct virtqueue *vq)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct virtrng_info *vi = vq->vdev->priv;
 | 
						struct virtrng_info *vi = vq->vdev->priv;
 | 
				
			||||||
| 
						 | 
					@ -67,6 +69,13 @@ static int virtio_read(struct hwrng *rng, void *buf, size_t size, bool wait)
 | 
				
			||||||
	int ret;
 | 
						int ret;
 | 
				
			||||||
	struct virtrng_info *vi = (struct virtrng_info *)rng->priv;
 | 
						struct virtrng_info *vi = (struct virtrng_info *)rng->priv;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * Don't ask host for data till we're setup.  This call can
 | 
				
			||||||
 | 
						 * happen during hwrng_register(), after commit d9e7972619.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						if (unlikely(!probe_done))
 | 
				
			||||||
 | 
							return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!vi->busy) {
 | 
						if (!vi->busy) {
 | 
				
			||||||
		vi->busy = true;
 | 
							vi->busy = true;
 | 
				
			||||||
		init_completion(&vi->have_data);
 | 
							init_completion(&vi->have_data);
 | 
				
			||||||
| 
						 | 
					@ -137,6 +146,7 @@ static int probe_common(struct virtio_device *vdev)
 | 
				
			||||||
		return err;
 | 
							return err;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						probe_done = true;
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -641,7 +641,7 @@ static void credit_entropy_bits(struct entropy_store *r, int nbits)
 | 
				
			||||||
		} while (unlikely(entropy_count < pool_size-2 && pnfrac));
 | 
							} while (unlikely(entropy_count < pool_size-2 && pnfrac));
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (entropy_count < 0) {
 | 
						if (unlikely(entropy_count < 0)) {
 | 
				
			||||||
		pr_warn("random: negative entropy/overflow: pool %s count %d\n",
 | 
							pr_warn("random: negative entropy/overflow: pool %s count %d\n",
 | 
				
			||||||
			r->name, entropy_count);
 | 
								r->name, entropy_count);
 | 
				
			||||||
		WARN_ON(1);
 | 
							WARN_ON(1);
 | 
				
			||||||
| 
						 | 
					@ -981,7 +981,7 @@ static size_t account(struct entropy_store *r, size_t nbytes, int min,
 | 
				
			||||||
		      int reserved)
 | 
							      int reserved)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int entropy_count, orig;
 | 
						int entropy_count, orig;
 | 
				
			||||||
	size_t ibytes;
 | 
						size_t ibytes, nfrac;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	BUG_ON(r->entropy_count > r->poolinfo->poolfracbits);
 | 
						BUG_ON(r->entropy_count > r->poolinfo->poolfracbits);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -999,7 +999,17 @@ static size_t account(struct entropy_store *r, size_t nbytes, int min,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if (ibytes < min)
 | 
						if (ibytes < min)
 | 
				
			||||||
		ibytes = 0;
 | 
							ibytes = 0;
 | 
				
			||||||
	if ((entropy_count -= ibytes << (ENTROPY_SHIFT + 3)) < 0)
 | 
					
 | 
				
			||||||
 | 
						if (unlikely(entropy_count < 0)) {
 | 
				
			||||||
 | 
							pr_warn("random: negative entropy count: pool %s count %d\n",
 | 
				
			||||||
 | 
								r->name, entropy_count);
 | 
				
			||||||
 | 
							WARN_ON(1);
 | 
				
			||||||
 | 
							entropy_count = 0;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						nfrac = ibytes << (ENTROPY_SHIFT + 3);
 | 
				
			||||||
 | 
						if ((size_t) entropy_count > nfrac)
 | 
				
			||||||
 | 
							entropy_count -= nfrac;
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
		entropy_count = 0;
 | 
							entropy_count = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (cmpxchg(&r->entropy_count, orig, entropy_count) != orig)
 | 
						if (cmpxchg(&r->entropy_count, orig, entropy_count) != orig)
 | 
				
			||||||
| 
						 | 
					@ -1376,6 +1386,7 @@ urandom_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos)
 | 
				
			||||||
			    "with %d bits of entropy available\n",
 | 
								    "with %d bits of entropy available\n",
 | 
				
			||||||
			    current->comm, nonblocking_pool.entropy_total);
 | 
								    current->comm, nonblocking_pool.entropy_total);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						nbytes = min_t(size_t, nbytes, INT_MAX >> (ENTROPY_SHIFT + 3));
 | 
				
			||||||
	ret = extract_entropy_user(&nonblocking_pool, buf, nbytes);
 | 
						ret = extract_entropy_user(&nonblocking_pool, buf, nbytes);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	trace_urandom_read(8 * nbytes, ENTROPY_BITS(&nonblocking_pool),
 | 
						trace_urandom_read(8 * nbytes, ENTROPY_BITS(&nonblocking_pool),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -104,6 +104,7 @@ config ARM_IMX6Q_CPUFREQ
 | 
				
			||||||
	tristate "Freescale i.MX6 cpufreq support"
 | 
						tristate "Freescale i.MX6 cpufreq support"
 | 
				
			||||||
	depends on ARCH_MXC
 | 
						depends on ARCH_MXC
 | 
				
			||||||
	depends on REGULATOR_ANATOP
 | 
						depends on REGULATOR_ANATOP
 | 
				
			||||||
 | 
						select PM_OPP
 | 
				
			||||||
	help
 | 
						help
 | 
				
			||||||
	  This adds cpufreq driver support for Freescale i.MX6 series SoCs.
 | 
						  This adds cpufreq driver support for Freescale i.MX6 series SoCs.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -118,7 +119,7 @@ config ARM_INTEGRATOR
 | 
				
			||||||
	  If in doubt, say Y.
 | 
						  If in doubt, say Y.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
config ARM_KIRKWOOD_CPUFREQ
 | 
					config ARM_KIRKWOOD_CPUFREQ
 | 
				
			||||||
	def_bool MACH_KIRKWOOD
 | 
						def_bool ARCH_KIRKWOOD || MACH_KIRKWOOD
 | 
				
			||||||
	help
 | 
						help
 | 
				
			||||||
	  This adds the CPUFreq driver for Marvell Kirkwood
 | 
						  This adds the CPUFreq driver for Marvell Kirkwood
 | 
				
			||||||
	  SoCs.
 | 
						  SoCs.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -152,11 +152,8 @@ static int cpu0_cpufreq_probe(struct platform_device *pdev)
 | 
				
			||||||
		goto out_put_reg;
 | 
							goto out_put_reg;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ret = of_init_opp_table(cpu_dev);
 | 
						/* OPPs might be populated at runtime, don't check for error here */
 | 
				
			||||||
	if (ret) {
 | 
						of_init_opp_table(cpu_dev);
 | 
				
			||||||
		pr_err("failed to init OPP table: %d\n", ret);
 | 
					 | 
				
			||||||
		goto out_put_clk;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ret = dev_pm_opp_init_cpufreq_table(cpu_dev, &freq_table);
 | 
						ret = dev_pm_opp_init_cpufreq_table(cpu_dev, &freq_table);
 | 
				
			||||||
	if (ret) {
 | 
						if (ret) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1153,10 +1153,12 @@ static int __cpufreq_add_dev(struct device *dev, struct subsys_interface *sif)
 | 
				
			||||||
	 * the creation of a brand new one. So we need to perform this update
 | 
						 * the creation of a brand new one. So we need to perform this update
 | 
				
			||||||
	 * by invoking update_policy_cpu().
 | 
						 * by invoking update_policy_cpu().
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	if (recover_policy && cpu != policy->cpu)
 | 
						if (recover_policy && cpu != policy->cpu) {
 | 
				
			||||||
		update_policy_cpu(policy, cpu);
 | 
							update_policy_cpu(policy, cpu);
 | 
				
			||||||
	else
 | 
							WARN_ON(kobject_move(&policy->kobj, &dev->kobj));
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
		policy->cpu = cpu;
 | 
							policy->cpu = cpu;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cpumask_copy(policy->cpus, cpumask_of(cpu));
 | 
						cpumask_copy(policy->cpus, cpumask_of(cpu));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -349,7 +349,7 @@ static int __init sa1110_clk_init(void)
 | 
				
			||||||
			name = "K4S641632D";
 | 
								name = "K4S641632D";
 | 
				
			||||||
		if (machine_is_h3100())
 | 
							if (machine_is_h3100())
 | 
				
			||||||
			name = "KM416S4030CT";
 | 
								name = "KM416S4030CT";
 | 
				
			||||||
		if (machine_is_jornada720())
 | 
							if (machine_is_jornada720() || machine_is_h3600())
 | 
				
			||||||
			name = "K4S281632B-1H";
 | 
								name = "K4S281632B-1H";
 | 
				
			||||||
		if (machine_is_nanoengine())
 | 
							if (machine_is_nanoengine())
 | 
				
			||||||
			name = "MT48LC8M16A2TG-75";
 | 
								name = "MT48LC8M16A2TG-75";
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,4 +1,5 @@
 | 
				
			||||||
menu "IEEE 1394 (FireWire) support"
 | 
					menu "IEEE 1394 (FireWire) support"
 | 
				
			||||||
 | 
						depends on HAS_DMA
 | 
				
			||||||
	depends on PCI || COMPILE_TEST
 | 
						depends on PCI || COMPILE_TEST
 | 
				
			||||||
	# firewire-core does not depend on PCI but is
 | 
						# firewire-core does not depend on PCI but is
 | 
				
			||||||
	# not useful without PCI controller driver
 | 
						# not useful without PCI controller driver
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -346,6 +346,7 @@ static __initdata struct {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct param_info {
 | 
					struct param_info {
 | 
				
			||||||
	int verbose;
 | 
						int verbose;
 | 
				
			||||||
 | 
						int found;
 | 
				
			||||||
	void *params;
 | 
						void *params;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -362,16 +363,12 @@ static int __init fdt_find_uefi_params(unsigned long node, const char *uname,
 | 
				
			||||||
	    (strcmp(uname, "chosen") != 0 && strcmp(uname, "chosen@0") != 0))
 | 
						    (strcmp(uname, "chosen") != 0 && strcmp(uname, "chosen@0") != 0))
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pr_info("Getting parameters from FDT:\n");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	for (i = 0; i < ARRAY_SIZE(dt_params); i++) {
 | 
						for (i = 0; i < ARRAY_SIZE(dt_params); i++) {
 | 
				
			||||||
		prop = of_get_flat_dt_prop(node, dt_params[i].propname, &len);
 | 
							prop = of_get_flat_dt_prop(node, dt_params[i].propname, &len);
 | 
				
			||||||
		if (!prop) {
 | 
							if (!prop)
 | 
				
			||||||
			pr_err("Can't find %s in device tree!\n",
 | 
					 | 
				
			||||||
			       dt_params[i].name);
 | 
					 | 
				
			||||||
			return 0;
 | 
								return 0;
 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		dest = info->params + dt_params[i].offset;
 | 
							dest = info->params + dt_params[i].offset;
 | 
				
			||||||
 | 
							info->found++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		val = of_read_number(prop, len / sizeof(u32));
 | 
							val = of_read_number(prop, len / sizeof(u32));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -390,10 +387,21 @@ static int __init fdt_find_uefi_params(unsigned long node, const char *uname,
 | 
				
			||||||
int __init efi_get_fdt_params(struct efi_fdt_params *params, int verbose)
 | 
					int __init efi_get_fdt_params(struct efi_fdt_params *params, int verbose)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct param_info info;
 | 
						struct param_info info;
 | 
				
			||||||
 | 
						int ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pr_info("Getting EFI parameters from FDT:\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	info.verbose = verbose;
 | 
						info.verbose = verbose;
 | 
				
			||||||
 | 
						info.found = 0;
 | 
				
			||||||
	info.params = params;
 | 
						info.params = params;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return of_scan_flat_dt(fdt_find_uefi_params, &info);
 | 
						ret = of_scan_flat_dt(fdt_find_uefi_params, &info);
 | 
				
			||||||
 | 
						if (!info.found)
 | 
				
			||||||
 | 
							pr_info("UEFI not found.\n");
 | 
				
			||||||
 | 
						else if (!ret)
 | 
				
			||||||
 | 
							pr_err("Can't find '%s' in device tree!\n",
 | 
				
			||||||
 | 
							       dt_params[info.found].name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif /* CONFIG_EFI_PARAMS_FROM_FDT */
 | 
					#endif /* CONFIG_EFI_PARAMS_FROM_FDT */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -23,16 +23,6 @@ static efi_status_t update_fdt(efi_system_table_t *sys_table, void *orig_fdt,
 | 
				
			||||||
	u32 fdt_val32;
 | 
						u32 fdt_val32;
 | 
				
			||||||
	u64 fdt_val64;
 | 
						u64 fdt_val64;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*
 | 
					 | 
				
			||||||
	 * Copy definition of linux_banner here.  Since this code is
 | 
					 | 
				
			||||||
	 * built as part of the decompressor for ARM v7, pulling
 | 
					 | 
				
			||||||
	 * in version.c where linux_banner is defined for the
 | 
					 | 
				
			||||||
	 * kernel brings other kernel dependencies with it.
 | 
					 | 
				
			||||||
	 */
 | 
					 | 
				
			||||||
	const char linux_banner[] =
 | 
					 | 
				
			||||||
	    "Linux version " UTS_RELEASE " (" LINUX_COMPILE_BY "@"
 | 
					 | 
				
			||||||
	    LINUX_COMPILE_HOST ") (" LINUX_COMPILER ") " UTS_VERSION "\n";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* Do some checks on provided FDT, if it exists*/
 | 
						/* Do some checks on provided FDT, if it exists*/
 | 
				
			||||||
	if (orig_fdt) {
 | 
						if (orig_fdt) {
 | 
				
			||||||
		if (fdt_check_header(orig_fdt)) {
 | 
							if (fdt_check_header(orig_fdt)) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -900,8 +900,6 @@ static int mcp23s08_probe(struct spi_device *spi)
 | 
				
			||||||
			if (spi_present_mask & (1 << addr))
 | 
								if (spi_present_mask & (1 << addr))
 | 
				
			||||||
				chips++;
 | 
									chips++;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if (!chips)
 | 
					 | 
				
			||||||
			return -ENODEV;
 | 
					 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		type = spi_get_device_id(spi)->driver_data;
 | 
							type = spi_get_device_id(spi)->driver_data;
 | 
				
			||||||
		pdata = dev_get_platdata(&spi->dev);
 | 
							pdata = dev_get_platdata(&spi->dev);
 | 
				
			||||||
| 
						 | 
					@ -940,10 +938,6 @@ static int mcp23s08_probe(struct spi_device *spi)
 | 
				
			||||||
		if (!(spi_present_mask & (1 << addr)))
 | 
							if (!(spi_present_mask & (1 << addr)))
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
		chips--;
 | 
							chips--;
 | 
				
			||||||
		if (chips < 0) {
 | 
					 | 
				
			||||||
			dev_err(&spi->dev, "FATAL: invalid negative chip id\n");
 | 
					 | 
				
			||||||
			goto fail;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		data->mcp[addr] = &data->chip[chips];
 | 
							data->mcp[addr] = &data->chip[chips];
 | 
				
			||||||
		status = mcp23s08_probe_one(data->mcp[addr], &spi->dev, spi,
 | 
							status = mcp23s08_probe_one(data->mcp[addr], &spi->dev, spi,
 | 
				
			||||||
					    0x40 | (addr << 1), type, base,
 | 
										    0x40 | (addr << 1), type, base,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -11673,6 +11673,9 @@ static struct intel_quirk intel_quirks[] = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Toshiba CB35 Chromebook (Celeron 2955U) */
 | 
						/* Toshiba CB35 Chromebook (Celeron 2955U) */
 | 
				
			||||||
	{ 0x0a06, 0x1179, 0x0a88, quirk_backlight_present },
 | 
						{ 0x0a06, 0x1179, 0x0a88, quirk_backlight_present },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* HP Chromebook 14 (Celeron 2955U) */
 | 
				
			||||||
 | 
						{ 0x0a06, 0x103c, 0x21ed, quirk_backlight_present },
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void intel_init_quirks(struct drm_device *dev)
 | 
					static void intel_init_quirks(struct drm_device *dev)
 | 
				
			||||||
| 
						 | 
					@ -11911,6 +11914,7 @@ static void intel_sanitize_crtc(struct intel_crtc *crtc)
 | 
				
			||||||
		 * ...  */
 | 
							 * ...  */
 | 
				
			||||||
		plane = crtc->plane;
 | 
							plane = crtc->plane;
 | 
				
			||||||
		crtc->plane = !plane;
 | 
							crtc->plane = !plane;
 | 
				
			||||||
 | 
							crtc->primary_enabled = true;
 | 
				
			||||||
		dev_priv->display.crtc_disable(&crtc->base);
 | 
							dev_priv->display.crtc_disable(&crtc->base);
 | 
				
			||||||
		crtc->plane = plane;
 | 
							crtc->plane = plane;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -906,8 +906,8 @@ intel_dp_compute_config(struct intel_encoder *encoder,
 | 
				
			||||||
		mode_rate = intel_dp_link_required(adjusted_mode->crtc_clock,
 | 
							mode_rate = intel_dp_link_required(adjusted_mode->crtc_clock,
 | 
				
			||||||
						   bpp);
 | 
											   bpp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		for (lane_count = min_lane_count; lane_count <= max_lane_count; lane_count <<= 1) {
 | 
					 | 
				
			||||||
		for (clock = min_clock; clock <= max_clock; clock++) {
 | 
							for (clock = min_clock; clock <= max_clock; clock++) {
 | 
				
			||||||
 | 
								for (lane_count = min_lane_count; lane_count <= max_lane_count; lane_count <<= 1) {
 | 
				
			||||||
				link_clock = drm_dp_bw_code_to_link_rate(bws[clock]);
 | 
									link_clock = drm_dp_bw_code_to_link_rate(bws[clock]);
 | 
				
			||||||
				link_avail = intel_dp_max_data_rate(link_clock,
 | 
									link_avail = intel_dp_max_data_rate(link_clock,
 | 
				
			||||||
								    lane_count);
 | 
													    lane_count);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -111,6 +111,13 @@ static void intel_lvds_get_config(struct intel_encoder *encoder,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pipe_config->adjusted_mode.flags |= flags;
 | 
						pipe_config->adjusted_mode.flags |= flags;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* gen2/3 store dither state in pfit control, needs to match */
 | 
				
			||||||
 | 
						if (INTEL_INFO(dev)->gen < 4) {
 | 
				
			||||||
 | 
							tmp = I915_READ(PFIT_CONTROL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							pipe_config->gmch_pfit.control |= tmp & PANEL_8TO6_DITHER_ENABLE;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	dotclock = pipe_config->port_clock;
 | 
						dotclock = pipe_config->port_clock;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (HAS_PCH_SPLIT(dev_priv->dev))
 | 
						if (HAS_PCH_SPLIT(dev_priv->dev))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -361,16 +361,16 @@ void intel_gmch_panel_fitting(struct intel_crtc *intel_crtc,
 | 
				
			||||||
		pfit_control |= ((intel_crtc->pipe << PFIT_PIPE_SHIFT) |
 | 
							pfit_control |= ((intel_crtc->pipe << PFIT_PIPE_SHIFT) |
 | 
				
			||||||
				 PFIT_FILTER_FUZZY);
 | 
									 PFIT_FILTER_FUZZY);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Make sure pre-965 set dither correctly for 18bpp panels. */
 | 
					 | 
				
			||||||
	if (INTEL_INFO(dev)->gen < 4 && pipe_config->pipe_bpp == 18)
 | 
					 | 
				
			||||||
		pfit_control |= PANEL_8TO6_DITHER_ENABLE;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
out:
 | 
					out:
 | 
				
			||||||
	if ((pfit_control & PFIT_ENABLE) == 0) {
 | 
						if ((pfit_control & PFIT_ENABLE) == 0) {
 | 
				
			||||||
		pfit_control = 0;
 | 
							pfit_control = 0;
 | 
				
			||||||
		pfit_pgm_ratios = 0;
 | 
							pfit_pgm_ratios = 0;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Make sure pre-965 set dither correctly for 18bpp panels. */
 | 
				
			||||||
 | 
						if (INTEL_INFO(dev)->gen < 4 && pipe_config->pipe_bpp == 18)
 | 
				
			||||||
 | 
							pfit_control |= PANEL_8TO6_DITHER_ENABLE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pipe_config->gmch_pfit.control = pfit_control;
 | 
						pipe_config->gmch_pfit.control = pfit_control;
 | 
				
			||||||
	pipe_config->gmch_pfit.pgm_ratios = pfit_pgm_ratios;
 | 
						pipe_config->gmch_pfit.pgm_ratios = pfit_pgm_ratios;
 | 
				
			||||||
	pipe_config->gmch_pfit.lvds_border_bits = border;
 | 
						pipe_config->gmch_pfit.lvds_border_bits = border;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -192,11 +192,11 @@ alarm_timer_callback(struct nouveau_alarm *alarm)
 | 
				
			||||||
	nouveau_therm_threshold_hyst_polling(therm, &sensor->thrs_shutdown,
 | 
						nouveau_therm_threshold_hyst_polling(therm, &sensor->thrs_shutdown,
 | 
				
			||||||
					     NOUVEAU_THERM_THRS_SHUTDOWN);
 | 
										     NOUVEAU_THERM_THRS_SHUTDOWN);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						spin_unlock_irqrestore(&priv->sensor.alarm_program_lock, flags);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* schedule the next poll in one second */
 | 
						/* schedule the next poll in one second */
 | 
				
			||||||
	if (therm->temp_get(therm) >= 0 && list_empty(&alarm->head))
 | 
						if (therm->temp_get(therm) >= 0 && list_empty(&alarm->head))
 | 
				
			||||||
		ptimer->alarm(ptimer, 1000 * 1000 * 1000, alarm);
 | 
							ptimer->alarm(ptimer, 1000000000ULL, alarm);
 | 
				
			||||||
 | 
					 | 
				
			||||||
	spin_unlock_irqrestore(&priv->sensor.alarm_program_lock, flags);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -33,6 +33,9 @@ irqreturn_t qxl_irq_handler(int irq, void *arg)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pending = xchg(&qdev->ram_header->int_pending, 0);
 | 
						pending = xchg(&qdev->ram_header->int_pending, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!pending)
 | 
				
			||||||
 | 
							return IRQ_NONE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	atomic_inc(&qdev->irq_received);
 | 
						atomic_inc(&qdev->irq_received);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (pending & QXL_INTERRUPT_DISPLAY) {
 | 
						if (pending & QXL_INTERRUPT_DISPLAY) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1414,8 +1414,8 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc,
 | 
				
			||||||
	tmp &= ~EVERGREEN_GRPH_SURFACE_UPDATE_H_RETRACE_EN;
 | 
						tmp &= ~EVERGREEN_GRPH_SURFACE_UPDATE_H_RETRACE_EN;
 | 
				
			||||||
	WREG32(EVERGREEN_GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset, tmp);
 | 
						WREG32(EVERGREEN_GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset, tmp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* set pageflip to happen anywhere in vblank interval */
 | 
						/* set pageflip to happen only at start of vblank interval (front porch) */
 | 
				
			||||||
	WREG32(EVERGREEN_MASTER_UPDATE_MODE + radeon_crtc->crtc_offset, 0);
 | 
						WREG32(EVERGREEN_MASTER_UPDATE_MODE + radeon_crtc->crtc_offset, 3);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!atomic && fb && fb != crtc->primary->fb) {
 | 
						if (!atomic && fb && fb != crtc->primary->fb) {
 | 
				
			||||||
		radeon_fb = to_radeon_framebuffer(fb);
 | 
							radeon_fb = to_radeon_framebuffer(fb);
 | 
				
			||||||
| 
						 | 
					@ -1614,8 +1614,8 @@ static int avivo_crtc_do_set_base(struct drm_crtc *crtc,
 | 
				
			||||||
	tmp &= ~AVIVO_D1GRPH_SURFACE_UPDATE_H_RETRACE_EN;
 | 
						tmp &= ~AVIVO_D1GRPH_SURFACE_UPDATE_H_RETRACE_EN;
 | 
				
			||||||
	WREG32(AVIVO_D1GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset, tmp);
 | 
						WREG32(AVIVO_D1GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset, tmp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* set pageflip to happen anywhere in vblank interval */
 | 
						/* set pageflip to happen only at start of vblank interval (front porch) */
 | 
				
			||||||
	WREG32(AVIVO_D1MODE_MASTER_UPDATE_MODE + radeon_crtc->crtc_offset, 0);
 | 
						WREG32(AVIVO_D1MODE_MASTER_UPDATE_MODE + radeon_crtc->crtc_offset, 3);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!atomic && fb && fb != crtc->primary->fb) {
 | 
						if (!atomic && fb && fb != crtc->primary->fb) {
 | 
				
			||||||
		radeon_fb = to_radeon_framebuffer(fb);
 | 
							radeon_fb = to_radeon_framebuffer(fb);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -183,7 +183,6 @@ void radeon_atom_backlight_init(struct radeon_encoder *radeon_encoder,
 | 
				
			||||||
	struct backlight_properties props;
 | 
						struct backlight_properties props;
 | 
				
			||||||
	struct radeon_backlight_privdata *pdata;
 | 
						struct radeon_backlight_privdata *pdata;
 | 
				
			||||||
	struct radeon_encoder_atom_dig *dig;
 | 
						struct radeon_encoder_atom_dig *dig;
 | 
				
			||||||
	u8 backlight_level;
 | 
					 | 
				
			||||||
	char bl_name[16];
 | 
						char bl_name[16];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Mac laptops with multiple GPUs use the gmux driver for backlight
 | 
						/* Mac laptops with multiple GPUs use the gmux driver for backlight
 | 
				
			||||||
| 
						 | 
					@ -222,12 +221,17 @@ void radeon_atom_backlight_init(struct radeon_encoder *radeon_encoder,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pdata->encoder = radeon_encoder;
 | 
						pdata->encoder = radeon_encoder;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	backlight_level = radeon_atom_get_backlight_level_from_reg(rdev);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	dig = radeon_encoder->enc_priv;
 | 
						dig = radeon_encoder->enc_priv;
 | 
				
			||||||
	dig->bl_dev = bd;
 | 
						dig->bl_dev = bd;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bd->props.brightness = radeon_atom_backlight_get_brightness(bd);
 | 
						bd->props.brightness = radeon_atom_backlight_get_brightness(bd);
 | 
				
			||||||
 | 
						/* Set a reasonable default here if the level is 0 otherwise
 | 
				
			||||||
 | 
						 * fbdev will attempt to turn the backlight on after console
 | 
				
			||||||
 | 
						 * unblanking and it will try and restore 0 which turns the backlight
 | 
				
			||||||
 | 
						 * off again.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						if (bd->props.brightness == 0)
 | 
				
			||||||
 | 
							bd->props.brightness = RADEON_MAX_BL_LEVEL;
 | 
				
			||||||
	bd->props.power = FB_BLANK_UNBLANK;
 | 
						bd->props.power = FB_BLANK_UNBLANK;
 | 
				
			||||||
	backlight_update_status(bd);
 | 
						backlight_update_status(bd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2642,8 +2642,9 @@ void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *s
 | 
				
			||||||
	for (i = 0; i < rdev->num_crtc; i++) {
 | 
						for (i = 0; i < rdev->num_crtc; i++) {
 | 
				
			||||||
		if (save->crtc_enabled[i]) {
 | 
							if (save->crtc_enabled[i]) {
 | 
				
			||||||
			tmp = RREG32(EVERGREEN_MASTER_UPDATE_MODE + crtc_offsets[i]);
 | 
								tmp = RREG32(EVERGREEN_MASTER_UPDATE_MODE + crtc_offsets[i]);
 | 
				
			||||||
			if ((tmp & 0x3) != 0) {
 | 
								if ((tmp & 0x7) != 3) {
 | 
				
			||||||
				tmp &= ~0x3;
 | 
									tmp &= ~0x7;
 | 
				
			||||||
 | 
									tmp |= 0x3;
 | 
				
			||||||
				WREG32(EVERGREEN_MASTER_UPDATE_MODE + crtc_offsets[i], tmp);
 | 
									WREG32(EVERGREEN_MASTER_UPDATE_MODE + crtc_offsets[i], tmp);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			tmp = RREG32(EVERGREEN_GRPH_UPDATE + crtc_offsets[i]);
 | 
								tmp = RREG32(EVERGREEN_GRPH_UPDATE + crtc_offsets[i]);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -239,7 +239,6 @@
 | 
				
			||||||
#       define EVERGREEN_CRTC_V_BLANK                   (1 << 0)
 | 
					#       define EVERGREEN_CRTC_V_BLANK                   (1 << 0)
 | 
				
			||||||
#define EVERGREEN_CRTC_STATUS_POSITION                  0x6e90
 | 
					#define EVERGREEN_CRTC_STATUS_POSITION                  0x6e90
 | 
				
			||||||
#define EVERGREEN_CRTC_STATUS_HV_COUNT                  0x6ea0
 | 
					#define EVERGREEN_CRTC_STATUS_HV_COUNT                  0x6ea0
 | 
				
			||||||
#define EVERGREEN_MASTER_UPDATE_MODE                    0x6ef8
 | 
					 | 
				
			||||||
#define EVERGREEN_CRTC_UPDATE_LOCK                      0x6ed4
 | 
					#define EVERGREEN_CRTC_UPDATE_LOCK                      0x6ed4
 | 
				
			||||||
#define EVERGREEN_MASTER_UPDATE_LOCK                    0x6ef4
 | 
					#define EVERGREEN_MASTER_UPDATE_LOCK                    0x6ef4
 | 
				
			||||||
#define EVERGREEN_MASTER_UPDATE_MODE                    0x6ef8
 | 
					#define EVERGREEN_MASTER_UPDATE_MODE                    0x6ef8
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -684,10 +684,9 @@ struct radeon_flip_work {
 | 
				
			||||||
	struct work_struct		unpin_work;
 | 
						struct work_struct		unpin_work;
 | 
				
			||||||
	struct radeon_device		*rdev;
 | 
						struct radeon_device		*rdev;
 | 
				
			||||||
	int				crtc_id;
 | 
						int				crtc_id;
 | 
				
			||||||
	struct drm_framebuffer		*fb;
 | 
						uint64_t			base;
 | 
				
			||||||
	struct drm_pending_vblank_event *event;
 | 
						struct drm_pending_vblank_event *event;
 | 
				
			||||||
	struct radeon_bo		*old_rbo;
 | 
						struct radeon_bo		*old_rbo;
 | 
				
			||||||
	struct radeon_bo		*new_rbo;
 | 
					 | 
				
			||||||
	struct radeon_fence		*fence;
 | 
						struct radeon_fence		*fence;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -366,7 +366,6 @@ void radeon_crtc_handle_flip(struct radeon_device *rdev, int crtc_id)
 | 
				
			||||||
	spin_unlock_irqrestore(&rdev->ddev->event_lock, flags);
 | 
						spin_unlock_irqrestore(&rdev->ddev->event_lock, flags);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	drm_vblank_put(rdev->ddev, radeon_crtc->crtc_id);
 | 
						drm_vblank_put(rdev->ddev, radeon_crtc->crtc_id);
 | 
				
			||||||
	radeon_fence_unref(&work->fence);
 | 
					 | 
				
			||||||
	radeon_irq_kms_pflip_irq_put(rdev, work->crtc_id);
 | 
						radeon_irq_kms_pflip_irq_put(rdev, work->crtc_id);
 | 
				
			||||||
	queue_work(radeon_crtc->flip_queue, &work->unpin_work);
 | 
						queue_work(radeon_crtc->flip_queue, &work->unpin_work);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -386,51 +385,108 @@ static void radeon_flip_work_func(struct work_struct *__work)
 | 
				
			||||||
	struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[work->crtc_id];
 | 
						struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[work->crtc_id];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct drm_crtc *crtc = &radeon_crtc->base;
 | 
						struct drm_crtc *crtc = &radeon_crtc->base;
 | 
				
			||||||
	struct drm_framebuffer *fb = work->fb;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	uint32_t tiling_flags, pitch_pixels;
 | 
					 | 
				
			||||||
	uint64_t base;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	unsigned long flags;
 | 
						unsigned long flags;
 | 
				
			||||||
	int r;
 | 
						int r;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        down_read(&rdev->exclusive_lock);
 | 
					        down_read(&rdev->exclusive_lock);
 | 
				
			||||||
	while (work->fence) {
 | 
						if (work->fence) {
 | 
				
			||||||
		r = radeon_fence_wait(work->fence, false);
 | 
							r = radeon_fence_wait(work->fence, false);
 | 
				
			||||||
		if (r == -EDEADLK) {
 | 
							if (r == -EDEADLK) {
 | 
				
			||||||
			up_read(&rdev->exclusive_lock);
 | 
								up_read(&rdev->exclusive_lock);
 | 
				
			||||||
			r = radeon_gpu_reset(rdev);
 | 
								r = radeon_gpu_reset(rdev);
 | 
				
			||||||
			down_read(&rdev->exclusive_lock);
 | 
								down_read(&rdev->exclusive_lock);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							if (r)
 | 
				
			||||||
 | 
								DRM_ERROR("failed to wait on page flip fence (%d)!\n", r);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/* We continue with the page flip even if we failed to wait on
 | 
				
			||||||
 | 
							 * the fence, otherwise the DRM core and userspace will be
 | 
				
			||||||
 | 
							 * confused about which BO the CRTC is scanning out
 | 
				
			||||||
 | 
							 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (r) {
 | 
					 | 
				
			||||||
			DRM_ERROR("failed to wait on page flip fence (%d)!\n",
 | 
					 | 
				
			||||||
				  r);
 | 
					 | 
				
			||||||
			goto cleanup;
 | 
					 | 
				
			||||||
		} else
 | 
					 | 
				
			||||||
		radeon_fence_unref(&work->fence);
 | 
							radeon_fence_unref(&work->fence);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* pin the new buffer */
 | 
						/* We borrow the event spin lock for protecting flip_status */
 | 
				
			||||||
	DRM_DEBUG_DRIVER("flip-ioctl() cur_fbo = %p, cur_bbo = %p\n",
 | 
						spin_lock_irqsave(&crtc->dev->event_lock, flags);
 | 
				
			||||||
			 work->old_rbo, work->new_rbo);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	r = radeon_bo_reserve(work->new_rbo, false);
 | 
						/* set the proper interrupt */
 | 
				
			||||||
 | 
						radeon_irq_kms_pflip_irq_get(rdev, radeon_crtc->crtc_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* do the flip (mmio) */
 | 
				
			||||||
 | 
						radeon_page_flip(rdev, radeon_crtc->crtc_id, work->base);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						radeon_crtc->flip_status = RADEON_FLIP_SUBMITTED;
 | 
				
			||||||
 | 
						spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
 | 
				
			||||||
 | 
						up_read(&rdev->exclusive_lock);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int radeon_crtc_page_flip(struct drm_crtc *crtc,
 | 
				
			||||||
 | 
									 struct drm_framebuffer *fb,
 | 
				
			||||||
 | 
									 struct drm_pending_vblank_event *event,
 | 
				
			||||||
 | 
									 uint32_t page_flip_flags)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct drm_device *dev = crtc->dev;
 | 
				
			||||||
 | 
						struct radeon_device *rdev = dev->dev_private;
 | 
				
			||||||
 | 
						struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
 | 
				
			||||||
 | 
						struct radeon_framebuffer *old_radeon_fb;
 | 
				
			||||||
 | 
						struct radeon_framebuffer *new_radeon_fb;
 | 
				
			||||||
 | 
						struct drm_gem_object *obj;
 | 
				
			||||||
 | 
						struct radeon_flip_work *work;
 | 
				
			||||||
 | 
						struct radeon_bo *new_rbo;
 | 
				
			||||||
 | 
						uint32_t tiling_flags, pitch_pixels;
 | 
				
			||||||
 | 
						uint64_t base;
 | 
				
			||||||
 | 
						unsigned long flags;
 | 
				
			||||||
 | 
						int r;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						work = kzalloc(sizeof *work, GFP_KERNEL);
 | 
				
			||||||
 | 
						if (work == NULL)
 | 
				
			||||||
 | 
							return -ENOMEM;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						INIT_WORK(&work->flip_work, radeon_flip_work_func);
 | 
				
			||||||
 | 
						INIT_WORK(&work->unpin_work, radeon_unpin_work_func);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						work->rdev = rdev;
 | 
				
			||||||
 | 
						work->crtc_id = radeon_crtc->crtc_id;
 | 
				
			||||||
 | 
						work->event = event;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* schedule unpin of the old buffer */
 | 
				
			||||||
 | 
						old_radeon_fb = to_radeon_framebuffer(crtc->primary->fb);
 | 
				
			||||||
 | 
						obj = old_radeon_fb->obj;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* take a reference to the old object */
 | 
				
			||||||
 | 
						drm_gem_object_reference(obj);
 | 
				
			||||||
 | 
						work->old_rbo = gem_to_radeon_bo(obj);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						new_radeon_fb = to_radeon_framebuffer(fb);
 | 
				
			||||||
 | 
						obj = new_radeon_fb->obj;
 | 
				
			||||||
 | 
						new_rbo = gem_to_radeon_bo(obj);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						spin_lock(&new_rbo->tbo.bdev->fence_lock);
 | 
				
			||||||
 | 
						if (new_rbo->tbo.sync_obj)
 | 
				
			||||||
 | 
							work->fence = radeon_fence_ref(new_rbo->tbo.sync_obj);
 | 
				
			||||||
 | 
						spin_unlock(&new_rbo->tbo.bdev->fence_lock);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* pin the new buffer */
 | 
				
			||||||
 | 
						DRM_DEBUG_DRIVER("flip-ioctl() cur_rbo = %p, new_rbo = %p\n",
 | 
				
			||||||
 | 
								 work->old_rbo, new_rbo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						r = radeon_bo_reserve(new_rbo, false);
 | 
				
			||||||
	if (unlikely(r != 0)) {
 | 
						if (unlikely(r != 0)) {
 | 
				
			||||||
		DRM_ERROR("failed to reserve new rbo buffer before flip\n");
 | 
							DRM_ERROR("failed to reserve new rbo buffer before flip\n");
 | 
				
			||||||
		goto cleanup;
 | 
							goto cleanup;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	/* Only 27 bit offset for legacy CRTC */
 | 
						/* Only 27 bit offset for legacy CRTC */
 | 
				
			||||||
	r = radeon_bo_pin_restricted(work->new_rbo, RADEON_GEM_DOMAIN_VRAM,
 | 
						r = radeon_bo_pin_restricted(new_rbo, RADEON_GEM_DOMAIN_VRAM,
 | 
				
			||||||
				     ASIC_IS_AVIVO(rdev) ? 0 : 1 << 27, &base);
 | 
									     ASIC_IS_AVIVO(rdev) ? 0 : 1 << 27, &base);
 | 
				
			||||||
	if (unlikely(r != 0)) {
 | 
						if (unlikely(r != 0)) {
 | 
				
			||||||
		radeon_bo_unreserve(work->new_rbo);
 | 
							radeon_bo_unreserve(new_rbo);
 | 
				
			||||||
		r = -EINVAL;
 | 
							r = -EINVAL;
 | 
				
			||||||
		DRM_ERROR("failed to pin new rbo buffer before flip\n");
 | 
							DRM_ERROR("failed to pin new rbo buffer before flip\n");
 | 
				
			||||||
		goto cleanup;
 | 
							goto cleanup;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	radeon_bo_get_tiling_flags(work->new_rbo, &tiling_flags, NULL);
 | 
						radeon_bo_get_tiling_flags(new_rbo, &tiling_flags, NULL);
 | 
				
			||||||
	radeon_bo_unreserve(work->new_rbo);
 | 
						radeon_bo_unreserve(new_rbo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!ASIC_IS_AVIVO(rdev)) {
 | 
						if (!ASIC_IS_AVIVO(rdev)) {
 | 
				
			||||||
		/* crtc offset is from display base addr not FB location */
 | 
							/* crtc offset is from display base addr not FB location */
 | 
				
			||||||
| 
						 | 
					@ -467,6 +523,7 @@ static void radeon_flip_work_func(struct work_struct *__work)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		base &= ~7;
 | 
							base &= ~7;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						work->base = base;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	r = drm_vblank_get(crtc->dev, radeon_crtc->crtc_id);
 | 
						r = drm_vblank_get(crtc->dev, radeon_crtc->crtc_id);
 | 
				
			||||||
	if (r) {
 | 
						if (r) {
 | 
				
			||||||
| 
						 | 
					@ -477,88 +534,11 @@ static void radeon_flip_work_func(struct work_struct *__work)
 | 
				
			||||||
	/* We borrow the event spin lock for protecting flip_work */
 | 
						/* We borrow the event spin lock for protecting flip_work */
 | 
				
			||||||
	spin_lock_irqsave(&crtc->dev->event_lock, flags);
 | 
						spin_lock_irqsave(&crtc->dev->event_lock, flags);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* set the proper interrupt */
 | 
					 | 
				
			||||||
	radeon_irq_kms_pflip_irq_get(rdev, radeon_crtc->crtc_id);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* do the flip (mmio) */
 | 
					 | 
				
			||||||
	radeon_page_flip(rdev, radeon_crtc->crtc_id, base);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	radeon_crtc->flip_status = RADEON_FLIP_SUBMITTED;
 | 
					 | 
				
			||||||
	spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
 | 
					 | 
				
			||||||
	up_read(&rdev->exclusive_lock);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pflip_cleanup:
 | 
					 | 
				
			||||||
	if (unlikely(radeon_bo_reserve(work->new_rbo, false) != 0)) {
 | 
					 | 
				
			||||||
		DRM_ERROR("failed to reserve new rbo in error path\n");
 | 
					 | 
				
			||||||
		goto cleanup;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if (unlikely(radeon_bo_unpin(work->new_rbo) != 0)) {
 | 
					 | 
				
			||||||
		DRM_ERROR("failed to unpin new rbo in error path\n");
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	radeon_bo_unreserve(work->new_rbo);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
cleanup:
 | 
					 | 
				
			||||||
	drm_gem_object_unreference_unlocked(&work->old_rbo->gem_base);
 | 
					 | 
				
			||||||
	radeon_fence_unref(&work->fence);
 | 
					 | 
				
			||||||
	kfree(work);
 | 
					 | 
				
			||||||
	up_read(&rdev->exclusive_lock);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static int radeon_crtc_page_flip(struct drm_crtc *crtc,
 | 
					 | 
				
			||||||
				 struct drm_framebuffer *fb,
 | 
					 | 
				
			||||||
				 struct drm_pending_vblank_event *event,
 | 
					 | 
				
			||||||
				 uint32_t page_flip_flags)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	struct drm_device *dev = crtc->dev;
 | 
					 | 
				
			||||||
	struct radeon_device *rdev = dev->dev_private;
 | 
					 | 
				
			||||||
	struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
 | 
					 | 
				
			||||||
	struct radeon_framebuffer *old_radeon_fb;
 | 
					 | 
				
			||||||
	struct radeon_framebuffer *new_radeon_fb;
 | 
					 | 
				
			||||||
	struct drm_gem_object *obj;
 | 
					 | 
				
			||||||
	struct radeon_flip_work *work;
 | 
					 | 
				
			||||||
	unsigned long flags;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	work = kzalloc(sizeof *work, GFP_KERNEL);
 | 
					 | 
				
			||||||
	if (work == NULL)
 | 
					 | 
				
			||||||
		return -ENOMEM;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	INIT_WORK(&work->flip_work, radeon_flip_work_func);
 | 
					 | 
				
			||||||
	INIT_WORK(&work->unpin_work, radeon_unpin_work_func);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	work->rdev = rdev;
 | 
					 | 
				
			||||||
	work->crtc_id = radeon_crtc->crtc_id;
 | 
					 | 
				
			||||||
	work->fb = fb;
 | 
					 | 
				
			||||||
	work->event = event;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* schedule unpin of the old buffer */
 | 
					 | 
				
			||||||
	old_radeon_fb = to_radeon_framebuffer(crtc->primary->fb);
 | 
					 | 
				
			||||||
	obj = old_radeon_fb->obj;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* take a reference to the old object */
 | 
					 | 
				
			||||||
	drm_gem_object_reference(obj);
 | 
					 | 
				
			||||||
	work->old_rbo = gem_to_radeon_bo(obj);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	new_radeon_fb = to_radeon_framebuffer(fb);
 | 
					 | 
				
			||||||
	obj = new_radeon_fb->obj;
 | 
					 | 
				
			||||||
	work->new_rbo = gem_to_radeon_bo(obj);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	spin_lock(&work->new_rbo->tbo.bdev->fence_lock);
 | 
					 | 
				
			||||||
	if (work->new_rbo->tbo.sync_obj)
 | 
					 | 
				
			||||||
		work->fence = radeon_fence_ref(work->new_rbo->tbo.sync_obj);
 | 
					 | 
				
			||||||
	spin_unlock(&work->new_rbo->tbo.bdev->fence_lock);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* We borrow the event spin lock for protecting flip_work */
 | 
					 | 
				
			||||||
	spin_lock_irqsave(&crtc->dev->event_lock, flags);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (radeon_crtc->flip_status != RADEON_FLIP_NONE) {
 | 
						if (radeon_crtc->flip_status != RADEON_FLIP_NONE) {
 | 
				
			||||||
		DRM_DEBUG_DRIVER("flip queue: crtc already busy\n");
 | 
							DRM_DEBUG_DRIVER("flip queue: crtc already busy\n");
 | 
				
			||||||
		spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
 | 
							spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
 | 
				
			||||||
		drm_gem_object_unreference_unlocked(&work->old_rbo->gem_base);
 | 
							r = -EBUSY;
 | 
				
			||||||
		radeon_fence_unref(&work->fence);
 | 
							goto vblank_cleanup;
 | 
				
			||||||
		kfree(work);
 | 
					 | 
				
			||||||
		return -EBUSY;
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	radeon_crtc->flip_status = RADEON_FLIP_PENDING;
 | 
						radeon_crtc->flip_status = RADEON_FLIP_PENDING;
 | 
				
			||||||
	radeon_crtc->flip_work = work;
 | 
						radeon_crtc->flip_work = work;
 | 
				
			||||||
| 
						 | 
					@ -569,8 +549,27 @@ static int radeon_crtc_page_flip(struct drm_crtc *crtc,
 | 
				
			||||||
	spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
 | 
						spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	queue_work(radeon_crtc->flip_queue, &work->flip_work);
 | 
						queue_work(radeon_crtc->flip_queue, &work->flip_work);
 | 
				
			||||||
 | 
					 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					vblank_cleanup:
 | 
				
			||||||
 | 
						drm_vblank_put(crtc->dev, radeon_crtc->crtc_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pflip_cleanup:
 | 
				
			||||||
 | 
						if (unlikely(radeon_bo_reserve(new_rbo, false) != 0)) {
 | 
				
			||||||
 | 
							DRM_ERROR("failed to reserve new rbo in error path\n");
 | 
				
			||||||
 | 
							goto cleanup;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if (unlikely(radeon_bo_unpin(new_rbo) != 0)) {
 | 
				
			||||||
 | 
							DRM_ERROR("failed to unpin new rbo in error path\n");
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						radeon_bo_unreserve(new_rbo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					cleanup:
 | 
				
			||||||
 | 
						drm_gem_object_unreference_unlocked(&work->old_rbo->gem_base);
 | 
				
			||||||
 | 
						radeon_fence_unref(&work->fence);
 | 
				
			||||||
 | 
						kfree(work);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return r;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int
 | 
					static int
 | 
				
			||||||
| 
						 | 
					@ -830,6 +829,10 @@ int radeon_ddc_get_modes(struct radeon_connector *radeon_connector)
 | 
				
			||||||
	struct radeon_device *rdev = dev->dev_private;
 | 
						struct radeon_device *rdev = dev->dev_private;
 | 
				
			||||||
	int ret = 0;
 | 
						int ret = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* don't leak the edid if we already fetched it in detect() */
 | 
				
			||||||
 | 
						if (radeon_connector->edid)
 | 
				
			||||||
 | 
							goto got_edid;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* on hw with routers, select right port */
 | 
						/* on hw with routers, select right port */
 | 
				
			||||||
	if (radeon_connector->router.ddc_valid)
 | 
						if (radeon_connector->router.ddc_valid)
 | 
				
			||||||
		radeon_router_select_ddc_port(radeon_connector);
 | 
							radeon_router_select_ddc_port(radeon_connector);
 | 
				
			||||||
| 
						 | 
					@ -868,6 +871,7 @@ int radeon_ddc_get_modes(struct radeon_connector *radeon_connector)
 | 
				
			||||||
			radeon_connector->edid = radeon_bios_get_hardcoded_edid(rdev);
 | 
								radeon_connector->edid = radeon_bios_get_hardcoded_edid(rdev);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if (radeon_connector->edid) {
 | 
						if (radeon_connector->edid) {
 | 
				
			||||||
 | 
					got_edid:
 | 
				
			||||||
		drm_mode_connector_update_edid_property(&radeon_connector->base, radeon_connector->edid);
 | 
							drm_mode_connector_update_edid_property(&radeon_connector->base, radeon_connector->edid);
 | 
				
			||||||
		ret = drm_add_edid_modes(&radeon_connector->base, radeon_connector->edid);
 | 
							ret = drm_add_edid_modes(&radeon_connector->base, radeon_connector->edid);
 | 
				
			||||||
		drm_edid_to_eld(&radeon_connector->base, radeon_connector->edid);
 | 
							drm_edid_to_eld(&radeon_connector->base, radeon_connector->edid);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -406,8 +406,9 @@ void rv515_mc_resume(struct radeon_device *rdev, struct rv515_mc_save *save)
 | 
				
			||||||
	for (i = 0; i < rdev->num_crtc; i++) {
 | 
						for (i = 0; i < rdev->num_crtc; i++) {
 | 
				
			||||||
		if (save->crtc_enabled[i]) {
 | 
							if (save->crtc_enabled[i]) {
 | 
				
			||||||
			tmp = RREG32(AVIVO_D1MODE_MASTER_UPDATE_MODE + crtc_offsets[i]);
 | 
								tmp = RREG32(AVIVO_D1MODE_MASTER_UPDATE_MODE + crtc_offsets[i]);
 | 
				
			||||||
			if ((tmp & 0x3) != 0) {
 | 
								if ((tmp & 0x7) != 3) {
 | 
				
			||||||
				tmp &= ~0x3;
 | 
									tmp &= ~0x7;
 | 
				
			||||||
 | 
									tmp |= 0x3;
 | 
				
			||||||
				WREG32(AVIVO_D1MODE_MASTER_UPDATE_MODE + crtc_offsets[i], tmp);
 | 
									WREG32(AVIVO_D1MODE_MASTER_UPDATE_MODE + crtc_offsets[i], tmp);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			tmp = RREG32(AVIVO_D1GRPH_UPDATE + crtc_offsets[i]);
 | 
								tmp = RREG32(AVIVO_D1GRPH_UPDATE + crtc_offsets[i]);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -246,8 +246,8 @@ void hv_fcopy_onchannelcallback(void *context)
 | 
				
			||||||
		/*
 | 
							/*
 | 
				
			||||||
		 * Send the information to the user-level daemon.
 | 
							 * Send the information to the user-level daemon.
 | 
				
			||||||
		 */
 | 
							 */
 | 
				
			||||||
		fcopy_send_data();
 | 
					 | 
				
			||||||
		schedule_delayed_work(&fcopy_work, 5*HZ);
 | 
							schedule_delayed_work(&fcopy_work, 5*HZ);
 | 
				
			||||||
 | 
							fcopy_send_data();
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	icmsghdr->icflags = ICMSGHDRFLAG_TRANSACTION | ICMSGHDRFLAG_RESPONSE;
 | 
						icmsghdr->icflags = ICMSGHDRFLAG_TRANSACTION | ICMSGHDRFLAG_RESPONSE;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -515,7 +515,7 @@ static ssize_t set_temp_min(struct device *dev,
 | 
				
			||||||
		return -EINVAL;
 | 
							return -EINVAL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	temp = DIV_ROUND_CLOSEST(temp, 1000);
 | 
						temp = DIV_ROUND_CLOSEST(temp, 1000);
 | 
				
			||||||
	temp = clamp_val(temp, 0, 255);
 | 
						temp = clamp_val(temp, -128, 127);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mutex_lock(&data->lock);
 | 
						mutex_lock(&data->lock);
 | 
				
			||||||
	data->temp_min[attr->index] = temp;
 | 
						data->temp_min[attr->index] = temp;
 | 
				
			||||||
| 
						 | 
					@ -549,7 +549,7 @@ static ssize_t set_temp_max(struct device *dev,
 | 
				
			||||||
		return -EINVAL;
 | 
							return -EINVAL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	temp = DIV_ROUND_CLOSEST(temp, 1000);
 | 
						temp = DIV_ROUND_CLOSEST(temp, 1000);
 | 
				
			||||||
	temp = clamp_val(temp, 0, 255);
 | 
						temp = clamp_val(temp, -128, 127);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mutex_lock(&data->lock);
 | 
						mutex_lock(&data->lock);
 | 
				
			||||||
	data->temp_max[attr->index] = temp;
 | 
						data->temp_max[attr->index] = temp;
 | 
				
			||||||
| 
						 | 
					@ -826,7 +826,7 @@ static ssize_t set_pwm_tmin(struct device *dev,
 | 
				
			||||||
		return -EINVAL;
 | 
							return -EINVAL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	temp = DIV_ROUND_CLOSEST(temp, 1000);
 | 
						temp = DIV_ROUND_CLOSEST(temp, 1000);
 | 
				
			||||||
	temp = clamp_val(temp, 0, 255);
 | 
						temp = clamp_val(temp, -128, 127);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mutex_lock(&data->lock);
 | 
						mutex_lock(&data->lock);
 | 
				
			||||||
	data->pwm_tmin[attr->index] = temp;
 | 
						data->pwm_tmin[attr->index] = temp;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -194,7 +194,7 @@ static ssize_t da9052_hwmon_show_name(struct device *dev,
 | 
				
			||||||
				      struct device_attribute *devattr,
 | 
									      struct device_attribute *devattr,
 | 
				
			||||||
				      char *buf)
 | 
									      char *buf)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return sprintf(buf, "da9052-hwmon\n");
 | 
						return sprintf(buf, "da9052\n");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static ssize_t show_label(struct device *dev,
 | 
					static ssize_t show_label(struct device *dev,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -204,7 +204,7 @@ static ssize_t da9055_hwmon_show_name(struct device *dev,
 | 
				
			||||||
				      struct device_attribute *devattr,
 | 
									      struct device_attribute *devattr,
 | 
				
			||||||
				      char *buf)
 | 
									      char *buf)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return sprintf(buf, "da9055-hwmon\n");
 | 
						return sprintf(buf, "da9055\n");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static ssize_t show_label(struct device *dev,
 | 
					static ssize_t show_label(struct device *dev,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -111,8 +111,14 @@ static const int mma8452_samp_freq[8][2] = {
 | 
				
			||||||
	{6, 250000}, {1, 560000}
 | 
						{6, 250000}, {1, 560000}
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* 
 | 
				
			||||||
 | 
					 * Hardware has fullscale of -2G, -4G, -8G corresponding to raw value -2048
 | 
				
			||||||
 | 
					 * The userspace interface uses m/s^2 and we declare micro units
 | 
				
			||||||
 | 
					 * So scale factor is given by:
 | 
				
			||||||
 | 
					 * 	g * N * 1000000 / 2048 for N = 2, 4, 8 and g=9.80665
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
static const int mma8452_scales[3][2] = {
 | 
					static const int mma8452_scales[3][2] = {
 | 
				
			||||||
	{0, 977}, {0, 1953}, {0, 3906}
 | 
						{0, 9577}, {0, 19154}, {0, 38307}
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static ssize_t mma8452_show_samp_freq_avail(struct device *dev,
 | 
					static ssize_t mma8452_show_samp_freq_avail(struct device *dev,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -345,6 +345,9 @@ static int iio_device_add_event(struct iio_dev *indio_dev,
 | 
				
			||||||
			&indio_dev->event_interface->dev_attr_list);
 | 
								&indio_dev->event_interface->dev_attr_list);
 | 
				
			||||||
		kfree(postfix);
 | 
							kfree(postfix);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if ((ret == -EBUSY) && (shared_by != IIO_SEPARATE))
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (ret)
 | 
							if (ret)
 | 
				
			||||||
			return ret;
 | 
								return ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -432,8 +432,17 @@ static void arp_failure_discard(void *handle, struct sk_buff *skb)
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
static void act_open_req_arp_failure(void *handle, struct sk_buff *skb)
 | 
					static void act_open_req_arp_failure(void *handle, struct sk_buff *skb)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						struct c4iw_ep *ep = handle;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	printk(KERN_ERR MOD "ARP failure duing connect\n");
 | 
						printk(KERN_ERR MOD "ARP failure duing connect\n");
 | 
				
			||||||
	kfree_skb(skb);
 | 
						kfree_skb(skb);
 | 
				
			||||||
 | 
						connect_reply_upcall(ep, -EHOSTUNREACH);
 | 
				
			||||||
 | 
						state_set(&ep->com, DEAD);
 | 
				
			||||||
 | 
						remove_handle(ep->com.dev, &ep->com.dev->atid_idr, ep->atid);
 | 
				
			||||||
 | 
						cxgb4_free_atid(ep->com.dev->rdev.lldi.tids, ep->atid);
 | 
				
			||||||
 | 
						dst_release(ep->dst);
 | 
				
			||||||
 | 
						cxgb4_l2t_release(ep->l2t);
 | 
				
			||||||
 | 
						c4iw_put_ep(&ep->com);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
| 
						 | 
					@ -658,7 +667,7 @@ static int send_connect(struct c4iw_ep *ep)
 | 
				
			||||||
		opt2 |= T5_OPT_2_VALID;
 | 
							opt2 |= T5_OPT_2_VALID;
 | 
				
			||||||
		opt2 |= V_CONG_CNTRL(CONG_ALG_TAHOE);
 | 
							opt2 |= V_CONG_CNTRL(CONG_ALG_TAHOE);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	t4_set_arp_err_handler(skb, NULL, act_open_req_arp_failure);
 | 
						t4_set_arp_err_handler(skb, ep, act_open_req_arp_failure);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (is_t4(ep->com.dev->rdev.lldi.adapter_type)) {
 | 
						if (is_t4(ep->com.dev->rdev.lldi.adapter_type)) {
 | 
				
			||||||
		if (ep->com.remote_addr.ss_family == AF_INET) {
 | 
							if (ep->com.remote_addr.ss_family == AF_INET) {
 | 
				
			||||||
| 
						 | 
					@ -2180,7 +2189,6 @@ static void reject_cr(struct c4iw_dev *dev, u32 hwtid, struct sk_buff *skb)
 | 
				
			||||||
	PDBG("%s c4iw_dev %p tid %u\n", __func__, dev, hwtid);
 | 
						PDBG("%s c4iw_dev %p tid %u\n", __func__, dev, hwtid);
 | 
				
			||||||
	BUG_ON(skb_cloned(skb));
 | 
						BUG_ON(skb_cloned(skb));
 | 
				
			||||||
	skb_trim(skb, sizeof(struct cpl_tid_release));
 | 
						skb_trim(skb, sizeof(struct cpl_tid_release));
 | 
				
			||||||
	skb_get(skb);
 | 
					 | 
				
			||||||
	release_tid(&dev->rdev, hwtid, skb);
 | 
						release_tid(&dev->rdev, hwtid, skb);
 | 
				
			||||||
	return;
 | 
						return;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -3917,7 +3925,7 @@ int __init c4iw_cm_init(void)
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void __exit c4iw_cm_term(void)
 | 
					void c4iw_cm_term(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	WARN_ON(!list_empty(&timeout_list));
 | 
						WARN_ON(!list_empty(&timeout_list));
 | 
				
			||||||
	flush_workqueue(workq);
 | 
						flush_workqueue(workq);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -696,6 +696,7 @@ static int c4iw_rdev_open(struct c4iw_rdev *rdev)
 | 
				
			||||||
		pr_err(MOD "error allocating status page\n");
 | 
							pr_err(MOD "error allocating status page\n");
 | 
				
			||||||
		goto err4;
 | 
							goto err4;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						rdev->status_page->db_off = 0;
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
err4:
 | 
					err4:
 | 
				
			||||||
	c4iw_rqtpool_destroy(rdev);
 | 
						c4iw_rqtpool_destroy(rdev);
 | 
				
			||||||
| 
						 | 
					@ -729,7 +730,6 @@ static void c4iw_dealloc(struct uld_ctx *ctx)
 | 
				
			||||||
	if (ctx->dev->rdev.oc_mw_kva)
 | 
						if (ctx->dev->rdev.oc_mw_kva)
 | 
				
			||||||
		iounmap(ctx->dev->rdev.oc_mw_kva);
 | 
							iounmap(ctx->dev->rdev.oc_mw_kva);
 | 
				
			||||||
	ib_dealloc_device(&ctx->dev->ibdev);
 | 
						ib_dealloc_device(&ctx->dev->ibdev);
 | 
				
			||||||
	iwpm_exit(RDMA_NL_C4IW);
 | 
					 | 
				
			||||||
	ctx->dev = NULL;
 | 
						ctx->dev = NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -826,12 +826,6 @@ static struct c4iw_dev *c4iw_alloc(const struct cxgb4_lld_info *infop)
 | 
				
			||||||
		setup_debugfs(devp);
 | 
							setup_debugfs(devp);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ret = iwpm_init(RDMA_NL_C4IW);
 | 
					 | 
				
			||||||
	if (ret) {
 | 
					 | 
				
			||||||
		pr_err("port mapper initialization failed with %d\n", ret);
 | 
					 | 
				
			||||||
		ib_dealloc_device(&devp->ibdev);
 | 
					 | 
				
			||||||
		return ERR_PTR(ret);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return devp;
 | 
						return devp;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -1332,6 +1326,15 @@ static int __init c4iw_init_module(void)
 | 
				
			||||||
		pr_err("%s[%u]: Failed to add netlink callback\n"
 | 
							pr_err("%s[%u]: Failed to add netlink callback\n"
 | 
				
			||||||
		       , __func__, __LINE__);
 | 
							       , __func__, __LINE__);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err = iwpm_init(RDMA_NL_C4IW);
 | 
				
			||||||
 | 
						if (err) {
 | 
				
			||||||
 | 
							pr_err("port mapper initialization failed with %d\n", err);
 | 
				
			||||||
 | 
							ibnl_remove_client(RDMA_NL_C4IW);
 | 
				
			||||||
 | 
							c4iw_cm_term();
 | 
				
			||||||
 | 
							debugfs_remove_recursive(c4iw_debugfs_root);
 | 
				
			||||||
 | 
							return err;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cxgb4_register_uld(CXGB4_ULD_RDMA, &c4iw_uld_info);
 | 
						cxgb4_register_uld(CXGB4_ULD_RDMA, &c4iw_uld_info);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
| 
						 | 
					@ -1349,6 +1352,7 @@ static void __exit c4iw_exit_module(void)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	mutex_unlock(&dev_mutex);
 | 
						mutex_unlock(&dev_mutex);
 | 
				
			||||||
	cxgb4_unregister_uld(CXGB4_ULD_RDMA);
 | 
						cxgb4_unregister_uld(CXGB4_ULD_RDMA);
 | 
				
			||||||
 | 
						iwpm_exit(RDMA_NL_C4IW);
 | 
				
			||||||
	ibnl_remove_client(RDMA_NL_C4IW);
 | 
						ibnl_remove_client(RDMA_NL_C4IW);
 | 
				
			||||||
	c4iw_cm_term();
 | 
						c4iw_cm_term();
 | 
				
			||||||
	debugfs_remove_recursive(c4iw_debugfs_root);
 | 
						debugfs_remove_recursive(c4iw_debugfs_root);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -908,7 +908,7 @@ int c4iw_destroy_ctrl_qp(struct c4iw_rdev *rdev);
 | 
				
			||||||
int c4iw_register_device(struct c4iw_dev *dev);
 | 
					int c4iw_register_device(struct c4iw_dev *dev);
 | 
				
			||||||
void c4iw_unregister_device(struct c4iw_dev *dev);
 | 
					void c4iw_unregister_device(struct c4iw_dev *dev);
 | 
				
			||||||
int __init c4iw_cm_init(void);
 | 
					int __init c4iw_cm_init(void);
 | 
				
			||||||
void __exit c4iw_cm_term(void);
 | 
					void c4iw_cm_term(void);
 | 
				
			||||||
void c4iw_release_dev_ucontext(struct c4iw_rdev *rdev,
 | 
					void c4iw_release_dev_ucontext(struct c4iw_rdev *rdev,
 | 
				
			||||||
			       struct c4iw_dev_ucontext *uctx);
 | 
								       struct c4iw_dev_ucontext *uctx);
 | 
				
			||||||
void c4iw_init_dev_ucontext(struct c4iw_rdev *rdev,
 | 
					void c4iw_init_dev_ucontext(struct c4iw_rdev *rdev,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -675,7 +675,7 @@ static int create_kernel_qp(struct mlx5_ib_dev *dev,
 | 
				
			||||||
	int err;
 | 
						int err;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	uuari = &dev->mdev.priv.uuari;
 | 
						uuari = &dev->mdev.priv.uuari;
 | 
				
			||||||
	if (init_attr->create_flags & ~IB_QP_CREATE_SIGNATURE_EN)
 | 
						if (init_attr->create_flags & ~(IB_QP_CREATE_SIGNATURE_EN | IB_QP_CREATE_BLOCK_MULTICAST_LOOPBACK))
 | 
				
			||||||
		return -EINVAL;
 | 
							return -EINVAL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (init_attr->qp_type == MLX5_IB_QPT_REG_UMR)
 | 
						if (init_attr->qp_type == MLX5_IB_QPT_REG_UMR)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -170,10 +170,10 @@ int pamu_disable_liodn(int liodn)
 | 
				
			||||||
static unsigned int map_addrspace_size_to_wse(phys_addr_t addrspace_size)
 | 
					static unsigned int map_addrspace_size_to_wse(phys_addr_t addrspace_size)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* Bug if not a power of 2 */
 | 
						/* Bug if not a power of 2 */
 | 
				
			||||||
	BUG_ON(!is_power_of_2(addrspace_size));
 | 
						BUG_ON((addrspace_size & (addrspace_size - 1)));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* window size is 2^(WSE+1) bytes */
 | 
						/* window size is 2^(WSE+1) bytes */
 | 
				
			||||||
	return __ffs(addrspace_size) - 1;
 | 
						return fls64(addrspace_size) - 2;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Derive the PAACE window count encoding for the subwindow count */
 | 
					/* Derive the PAACE window count encoding for the subwindow count */
 | 
				
			||||||
| 
						 | 
					@ -351,7 +351,7 @@ int pamu_config_ppaace(int liodn, phys_addr_t win_addr, phys_addr_t win_size,
 | 
				
			||||||
	struct paace *ppaace;
 | 
						struct paace *ppaace;
 | 
				
			||||||
	unsigned long fspi;
 | 
						unsigned long fspi;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!is_power_of_2(win_size) || win_size < PAMU_PAGE_SIZE) {
 | 
						if ((win_size & (win_size - 1)) || win_size < PAMU_PAGE_SIZE) {
 | 
				
			||||||
		pr_debug("window size too small or not a power of two %llx\n", win_size);
 | 
							pr_debug("window size too small or not a power of two %llx\n", win_size);
 | 
				
			||||||
		return -EINVAL;
 | 
							return -EINVAL;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -464,7 +464,7 @@ int pamu_config_spaace(int liodn, u32 subwin_cnt, u32 subwin,
 | 
				
			||||||
		return -ENOENT;
 | 
							return -ENOENT;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!is_power_of_2(subwin_size) || subwin_size < PAMU_PAGE_SIZE) {
 | 
						if ((subwin_size & (subwin_size - 1)) || subwin_size < PAMU_PAGE_SIZE) {
 | 
				
			||||||
		pr_debug("subwindow size out of range, or not a power of 2\n");
 | 
							pr_debug("subwindow size out of range, or not a power of 2\n");
 | 
				
			||||||
		return -EINVAL;
 | 
							return -EINVAL;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -301,7 +301,7 @@ static int check_size(u64 size, dma_addr_t iova)
 | 
				
			||||||
	 * Size must be a power of two and at least be equal
 | 
						 * Size must be a power of two and at least be equal
 | 
				
			||||||
	 * to PAMU page size.
 | 
						 * to PAMU page size.
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	if (!is_power_of_2(size) || size < PAMU_PAGE_SIZE) {
 | 
						if ((size & (size - 1)) || size < PAMU_PAGE_SIZE) {
 | 
				
			||||||
		pr_debug("%s: size too small or not a power of two\n", __func__);
 | 
							pr_debug("%s: size too small or not a power of two\n", __func__);
 | 
				
			||||||
		return -EINVAL;
 | 
							return -EINVAL;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -335,11 +335,6 @@ static struct fsl_dma_domain *iommu_alloc_dma_domain(void)
 | 
				
			||||||
	return domain;
 | 
						return domain;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline struct device_domain_info *find_domain(struct device *dev)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	return dev->archdata.iommu_domain;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void remove_device_ref(struct device_domain_info *info, u32 win_cnt)
 | 
					static void remove_device_ref(struct device_domain_info *info, u32 win_cnt)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	unsigned long flags;
 | 
						unsigned long flags;
 | 
				
			||||||
| 
						 | 
					@ -380,7 +375,7 @@ static void attach_device(struct fsl_dma_domain *dma_domain, int liodn, struct d
 | 
				
			||||||
	 * Check here if the device is already attached to domain or not.
 | 
						 * Check here if the device is already attached to domain or not.
 | 
				
			||||||
	 * If the device is already attached to a domain detach it.
 | 
						 * If the device is already attached to a domain detach it.
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	old_domain_info = find_domain(dev);
 | 
						old_domain_info = dev->archdata.iommu_domain;
 | 
				
			||||||
	if (old_domain_info && old_domain_info->domain != dma_domain) {
 | 
						if (old_domain_info && old_domain_info->domain != dma_domain) {
 | 
				
			||||||
		spin_unlock_irqrestore(&device_domain_lock, flags);
 | 
							spin_unlock_irqrestore(&device_domain_lock, flags);
 | 
				
			||||||
		detach_device(dev, old_domain_info->domain);
 | 
							detach_device(dev, old_domain_info->domain);
 | 
				
			||||||
| 
						 | 
					@ -399,7 +394,7 @@ static void attach_device(struct fsl_dma_domain *dma_domain, int liodn, struct d
 | 
				
			||||||
	 * the info for the first LIODN as all
 | 
						 * the info for the first LIODN as all
 | 
				
			||||||
	 * LIODNs share the same domain
 | 
						 * LIODNs share the same domain
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	if (!old_domain_info)
 | 
						if (!dev->archdata.iommu_domain)
 | 
				
			||||||
		dev->archdata.iommu_domain = info;
 | 
							dev->archdata.iommu_domain = info;
 | 
				
			||||||
	spin_unlock_irqrestore(&device_domain_lock, flags);
 | 
						spin_unlock_irqrestore(&device_domain_lock, flags);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1042,12 +1037,15 @@ static struct iommu_group *get_pci_device_group(struct pci_dev *pdev)
 | 
				
			||||||
			group = get_shared_pci_device_group(pdev);
 | 
								group = get_shared_pci_device_group(pdev);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!group)
 | 
				
			||||||
 | 
							group = ERR_PTR(-ENODEV);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return group;
 | 
						return group;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int fsl_pamu_add_device(struct device *dev)
 | 
					static int fsl_pamu_add_device(struct device *dev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct iommu_group *group = NULL;
 | 
						struct iommu_group *group = ERR_PTR(-ENODEV);
 | 
				
			||||||
	struct pci_dev *pdev;
 | 
						struct pci_dev *pdev;
 | 
				
			||||||
	const u32 *prop;
 | 
						const u32 *prop;
 | 
				
			||||||
	int ret, len;
 | 
						int ret, len;
 | 
				
			||||||
| 
						 | 
					@ -1070,7 +1068,7 @@ static int fsl_pamu_add_device(struct device *dev)
 | 
				
			||||||
			group = get_device_iommu_group(dev);
 | 
								group = get_device_iommu_group(dev);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!group || IS_ERR(group))
 | 
						if (IS_ERR(group))
 | 
				
			||||||
		return PTR_ERR(group);
 | 
							return PTR_ERR(group);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ret = iommu_group_add_device(group, dev);
 | 
						ret = iommu_group_add_device(group, dev);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -42,6 +42,7 @@
 | 
				
			||||||
#include <linux/irqchip/chained_irq.h>
 | 
					#include <linux/irqchip/chained_irq.h>
 | 
				
			||||||
#include <linux/irqchip/arm-gic.h>
 | 
					#include <linux/irqchip/arm-gic.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <asm/cputype.h>
 | 
				
			||||||
#include <asm/irq.h>
 | 
					#include <asm/irq.h>
 | 
				
			||||||
#include <asm/exception.h>
 | 
					#include <asm/exception.h>
 | 
				
			||||||
#include <asm/smp_plat.h>
 | 
					#include <asm/smp_plat.h>
 | 
				
			||||||
| 
						 | 
					@ -954,7 +955,9 @@ void __init gic_init_bases(unsigned int gic_nr, int irq_start,
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		for_each_possible_cpu(cpu) {
 | 
							for_each_possible_cpu(cpu) {
 | 
				
			||||||
			unsigned long offset = percpu_offset * cpu_logical_map(cpu);
 | 
								u32 mpidr = cpu_logical_map(cpu);
 | 
				
			||||||
 | 
								u32 core_id = MPIDR_AFFINITY_LEVEL(mpidr, 0);
 | 
				
			||||||
 | 
								unsigned long offset = percpu_offset * core_id;
 | 
				
			||||||
			*per_cpu_ptr(gic->dist_base.percpu_base, cpu) = dist_base + offset;
 | 
								*per_cpu_ptr(gic->dist_base.percpu_base, cpu) = dist_base + offset;
 | 
				
			||||||
			*per_cpu_ptr(gic->cpu_base.percpu_base, cpu) = cpu_base + offset;
 | 
								*per_cpu_ptr(gic->cpu_base.percpu_base, cpu) = cpu_base + offset;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					@ -1071,8 +1074,10 @@ gic_of_init(struct device_node *node, struct device_node *parent)
 | 
				
			||||||
	gic_cnt++;
 | 
						gic_cnt++;
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					IRQCHIP_DECLARE(gic_400, "arm,gic-400", gic_of_init);
 | 
				
			||||||
IRQCHIP_DECLARE(cortex_a15_gic, "arm,cortex-a15-gic", gic_of_init);
 | 
					IRQCHIP_DECLARE(cortex_a15_gic, "arm,cortex-a15-gic", gic_of_init);
 | 
				
			||||||
IRQCHIP_DECLARE(cortex_a9_gic, "arm,cortex-a9-gic", gic_of_init);
 | 
					IRQCHIP_DECLARE(cortex_a9_gic, "arm,cortex-a9-gic", gic_of_init);
 | 
				
			||||||
 | 
					IRQCHIP_DECLARE(cortex_a7_gic, "arm,cortex-a7-gic", gic_of_init);
 | 
				
			||||||
IRQCHIP_DECLARE(msm_8660_qgic, "qcom,msm-8660-qgic", gic_of_init);
 | 
					IRQCHIP_DECLARE(msm_8660_qgic, "qcom,msm-8660-qgic", gic_of_init);
 | 
				
			||||||
IRQCHIP_DECLARE(msm_qgic2, "qcom,msm-qgic2", gic_of_init);
 | 
					IRQCHIP_DECLARE(msm_qgic2, "qcom,msm-qgic2", gic_of_init);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2059,13 +2059,17 @@ static int l3ni1_cmd_global(struct PStack *st, isdn_ctrl *ic)
 | 
				
			||||||
			memcpy(p, ic->parm.ni1_io.data, ic->parm.ni1_io.datalen); /* copy data */
 | 
								memcpy(p, ic->parm.ni1_io.data, ic->parm.ni1_io.datalen); /* copy data */
 | 
				
			||||||
			l = (p - temp) + ic->parm.ni1_io.datalen; /* total length */
 | 
								l = (p - temp) + ic->parm.ni1_io.datalen; /* total length */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (ic->parm.ni1_io.timeout > 0)
 | 
								if (ic->parm.ni1_io.timeout > 0) {
 | 
				
			||||||
				if (!(pc = ni1_new_l3_process(st, -1)))
 | 
									pc = ni1_new_l3_process(st, -1);
 | 
				
			||||||
				{ free_invoke_id(st, id);
 | 
									if (!pc) {
 | 
				
			||||||
 | 
										free_invoke_id(st, id);
 | 
				
			||||||
					return (-2);
 | 
										return (-2);
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			pc->prot.ni1.ll_id = ic->parm.ni1_io.ll_id; /* remember id */
 | 
									/* remember id */
 | 
				
			||||||
			pc->prot.ni1.proc = ic->parm.ni1_io.proc; /* and procedure */
 | 
									pc->prot.ni1.ll_id = ic->parm.ni1_io.ll_id;
 | 
				
			||||||
 | 
									/* and procedure */
 | 
				
			||||||
 | 
									pc->prot.ni1.proc = ic->parm.ni1_io.proc;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (!(skb = l3_alloc_skb(l)))
 | 
								if (!(skb = l3_alloc_skb(l)))
 | 
				
			||||||
			{ free_invoke_id(st, id);
 | 
								{ free_invoke_id(st, id);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -442,7 +442,7 @@ static int get_filter(void __user *arg, struct sock_filter **p)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct sock_fprog uprog;
 | 
						struct sock_fprog uprog;
 | 
				
			||||||
	struct sock_filter *code = NULL;
 | 
						struct sock_filter *code = NULL;
 | 
				
			||||||
	int len, err;
 | 
						int len;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (copy_from_user(&uprog, arg, sizeof(uprog)))
 | 
						if (copy_from_user(&uprog, arg, sizeof(uprog)))
 | 
				
			||||||
		return -EFAULT;
 | 
							return -EFAULT;
 | 
				
			||||||
| 
						 | 
					@ -458,12 +458,6 @@ static int get_filter(void __user *arg, struct sock_filter **p)
 | 
				
			||||||
	if (IS_ERR(code))
 | 
						if (IS_ERR(code))
 | 
				
			||||||
		return PTR_ERR(code);
 | 
							return PTR_ERR(code);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err = sk_chk_filter(code, uprog.len);
 | 
					 | 
				
			||||||
	if (err) {
 | 
					 | 
				
			||||||
		kfree(code);
 | 
					 | 
				
			||||||
		return err;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	*p = code;
 | 
						*p = code;
 | 
				
			||||||
	return uprog.len;
 | 
						return uprog.len;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -425,6 +425,15 @@ static int __open_metadata(struct dm_cache_metadata *cmd)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	disk_super = dm_block_data(sblock);
 | 
						disk_super = dm_block_data(sblock);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Verify the data block size hasn't changed */
 | 
				
			||||||
 | 
						if (le32_to_cpu(disk_super->data_block_size) != cmd->data_block_size) {
 | 
				
			||||||
 | 
							DMERR("changing the data block size (from %u to %llu) is not supported",
 | 
				
			||||||
 | 
							      le32_to_cpu(disk_super->data_block_size),
 | 
				
			||||||
 | 
							      (unsigned long long)cmd->data_block_size);
 | 
				
			||||||
 | 
							r = -EINVAL;
 | 
				
			||||||
 | 
							goto bad;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	r = __check_incompat_features(disk_super, cmd);
 | 
						r = __check_incompat_features(disk_super, cmd);
 | 
				
			||||||
	if (r < 0)
 | 
						if (r < 0)
 | 
				
			||||||
		goto bad;
 | 
							goto bad;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -613,6 +613,15 @@ static int __open_metadata(struct dm_pool_metadata *pmd)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	disk_super = dm_block_data(sblock);
 | 
						disk_super = dm_block_data(sblock);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Verify the data block size hasn't changed */
 | 
				
			||||||
 | 
						if (le32_to_cpu(disk_super->data_block_size) != pmd->data_block_size) {
 | 
				
			||||||
 | 
							DMERR("changing the data block size (from %u to %llu) is not supported",
 | 
				
			||||||
 | 
							      le32_to_cpu(disk_super->data_block_size),
 | 
				
			||||||
 | 
							      (unsigned long long)pmd->data_block_size);
 | 
				
			||||||
 | 
							r = -EINVAL;
 | 
				
			||||||
 | 
							goto bad_unlock_sblock;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	r = __check_incompat_features(disk_super, pmd);
 | 
						r = __check_incompat_features(disk_super, pmd);
 | 
				
			||||||
	if (r < 0)
 | 
						if (r < 0)
 | 
				
			||||||
		goto bad_unlock_sblock;
 | 
							goto bad_unlock_sblock;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -60,7 +60,7 @@ static int si2168_cmd_execute(struct si2168 *s, struct si2168_cmd *cmd)
 | 
				
			||||||
				jiffies_to_msecs(jiffies) -
 | 
									jiffies_to_msecs(jiffies) -
 | 
				
			||||||
				(jiffies_to_msecs(timeout) - TIMEOUT));
 | 
									(jiffies_to_msecs(timeout) - TIMEOUT));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (!(cmd->args[0] >> 7) & 0x01) {
 | 
							if (!((cmd->args[0] >> 7) & 0x01)) {
 | 
				
			||||||
			ret = -ETIMEDOUT;
 | 
								ret = -ETIMEDOUT;
 | 
				
			||||||
			goto err_mutex_unlock;
 | 
								goto err_mutex_unlock;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -25,7 +25,7 @@
 | 
				
			||||||
#define SI2168_A20_FIRMWARE "dvb-demod-si2168-a20-01.fw"
 | 
					#define SI2168_A20_FIRMWARE "dvb-demod-si2168-a20-01.fw"
 | 
				
			||||||
#define SI2168_A30_FIRMWARE "dvb-demod-si2168-a30-01.fw"
 | 
					#define SI2168_A30_FIRMWARE "dvb-demod-si2168-a30-01.fw"
 | 
				
			||||||
#define SI2168_B40_FIRMWARE "dvb-demod-si2168-b40-01.fw"
 | 
					#define SI2168_B40_FIRMWARE "dvb-demod-si2168-b40-01.fw"
 | 
				
			||||||
#define SI2168_B40_FIRMWARE_FALLBACK "dvb-demod-si2168-01.fw"
 | 
					#define SI2168_B40_FIRMWARE_FALLBACK "dvb-demod-si2168-02.fw"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* state struct */
 | 
					/* state struct */
 | 
				
			||||||
struct si2168 {
 | 
					struct si2168 {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -668,6 +668,7 @@ static int tda10071_set_frontend(struct dvb_frontend *fe)
 | 
				
			||||||
	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
 | 
						struct dtv_frontend_properties *c = &fe->dtv_property_cache;
 | 
				
			||||||
	int ret, i;
 | 
						int ret, i;
 | 
				
			||||||
	u8 mode, rolloff, pilot, inversion, div;
 | 
						u8 mode, rolloff, pilot, inversion, div;
 | 
				
			||||||
 | 
						fe_modulation_t modulation;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	dev_dbg(&priv->i2c->dev,
 | 
						dev_dbg(&priv->i2c->dev,
 | 
				
			||||||
			"%s: delivery_system=%d modulation=%d frequency=%d symbol_rate=%d inversion=%d pilot=%d rolloff=%d\n",
 | 
								"%s: delivery_system=%d modulation=%d frequency=%d symbol_rate=%d inversion=%d pilot=%d rolloff=%d\n",
 | 
				
			||||||
| 
						 | 
					@ -702,10 +703,13 @@ static int tda10071_set_frontend(struct dvb_frontend *fe)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	switch (c->delivery_system) {
 | 
						switch (c->delivery_system) {
 | 
				
			||||||
	case SYS_DVBS:
 | 
						case SYS_DVBS:
 | 
				
			||||||
 | 
							modulation = QPSK;
 | 
				
			||||||
		rolloff = 0;
 | 
							rolloff = 0;
 | 
				
			||||||
		pilot = 2;
 | 
							pilot = 2;
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	case SYS_DVBS2:
 | 
						case SYS_DVBS2:
 | 
				
			||||||
 | 
							modulation = c->modulation;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		switch (c->rolloff) {
 | 
							switch (c->rolloff) {
 | 
				
			||||||
		case ROLLOFF_20:
 | 
							case ROLLOFF_20:
 | 
				
			||||||
			rolloff = 2;
 | 
								rolloff = 2;
 | 
				
			||||||
| 
						 | 
					@ -750,7 +754,7 @@ static int tda10071_set_frontend(struct dvb_frontend *fe)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (i = 0, mode = 0xff; i < ARRAY_SIZE(TDA10071_MODCOD); i++) {
 | 
						for (i = 0, mode = 0xff; i < ARRAY_SIZE(TDA10071_MODCOD); i++) {
 | 
				
			||||||
		if (c->delivery_system == TDA10071_MODCOD[i].delivery_system &&
 | 
							if (c->delivery_system == TDA10071_MODCOD[i].delivery_system &&
 | 
				
			||||||
			c->modulation == TDA10071_MODCOD[i].modulation &&
 | 
								modulation == TDA10071_MODCOD[i].modulation &&
 | 
				
			||||||
			c->fec_inner == TDA10071_MODCOD[i].fec) {
 | 
								c->fec_inner == TDA10071_MODCOD[i].fec) {
 | 
				
			||||||
			mode = TDA10071_MODCOD[i].val;
 | 
								mode = TDA10071_MODCOD[i].val;
 | 
				
			||||||
			dev_dbg(&priv->i2c->dev, "%s: mode found=%02x\n",
 | 
								dev_dbg(&priv->i2c->dev, "%s: mode found=%02x\n",
 | 
				
			||||||
| 
						 | 
					@ -834,10 +838,10 @@ static int tda10071_get_frontend(struct dvb_frontend *fe)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	switch ((buf[1] >> 0) & 0x01) {
 | 
						switch ((buf[1] >> 0) & 0x01) {
 | 
				
			||||||
	case 0:
 | 
						case 0:
 | 
				
			||||||
		c->inversion = INVERSION_OFF;
 | 
							c->inversion = INVERSION_ON;
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	case 1:
 | 
						case 1:
 | 
				
			||||||
		c->inversion = INVERSION_ON;
 | 
							c->inversion = INVERSION_OFF;
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -856,7 +860,7 @@ static int tda10071_get_frontend(struct dvb_frontend *fe)
 | 
				
			||||||
	if (ret)
 | 
						if (ret)
 | 
				
			||||||
		goto error;
 | 
							goto error;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	c->symbol_rate = (buf[0] << 16) | (buf[1] << 8) | (buf[2] << 0);
 | 
						c->symbol_rate = ((buf[0] << 16) | (buf[1] << 8) | (buf[2] << 0)) * 1000;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return ret;
 | 
						return ret;
 | 
				
			||||||
error:
 | 
					error:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -55,6 +55,7 @@ static struct tda10071_modcod {
 | 
				
			||||||
	{ SYS_DVBS2, QPSK,  FEC_8_9,  0x0a },
 | 
						{ SYS_DVBS2, QPSK,  FEC_8_9,  0x0a },
 | 
				
			||||||
	{ SYS_DVBS2, QPSK,  FEC_9_10, 0x0b },
 | 
						{ SYS_DVBS2, QPSK,  FEC_9_10, 0x0b },
 | 
				
			||||||
	/* 8PSK */
 | 
						/* 8PSK */
 | 
				
			||||||
 | 
						{ SYS_DVBS2, PSK_8, FEC_AUTO, 0x00 },
 | 
				
			||||||
	{ SYS_DVBS2, PSK_8, FEC_3_5,  0x0c },
 | 
						{ SYS_DVBS2, PSK_8, FEC_3_5,  0x0c },
 | 
				
			||||||
	{ SYS_DVBS2, PSK_8, FEC_2_3,  0x0d },
 | 
						{ SYS_DVBS2, PSK_8, FEC_2_3,  0x0d },
 | 
				
			||||||
	{ SYS_DVBS2, PSK_8, FEC_3_4,  0x0e },
 | 
						{ SYS_DVBS2, PSK_8, FEC_3_4,  0x0e },
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
Some files were not shown because too many files have changed in this diff Show more
		Loading…
	
		Reference in a new issue