Merge branch 'fix/wm8962' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into asoc-wm8962
Conflicts: sound/soc/codecs/wm8962.c
This commit is contained in:
		
				commit
				
					
						384b834558
					
				
			
		
					 293 changed files with 2922 additions and 1429 deletions
				
			
		|  | @ -34,7 +34,7 @@ command: | |||
| After a while you will start to get messages about current status or error like | ||||
| in the original code. | ||||
| 
 | ||||
| Note that running a new test will stop any in progress test. | ||||
| Note that running a new test will not stop any in progress test. | ||||
| 
 | ||||
| The following command should return actual state of the test. | ||||
| 	% cat /sys/kernel/debug/dmatest/run | ||||
|  | @ -52,8 +52,8 @@ To wait for test done the user may perform a busy loop that checks the state. | |||
| 
 | ||||
| The module parameters that is supplied to the kernel command line will be used | ||||
| for the first performed test. After user gets a control, the test could be | ||||
| interrupted or re-run with same or different parameters. For the details see | ||||
| the above section "Part 2 - When dmatest is built as a module..." | ||||
| re-run with the same or different parameters. For the details see the above | ||||
| section "Part 2 - When dmatest is built as a module..." | ||||
| 
 | ||||
| In both cases the module parameters are used as initial values for the test case. | ||||
| You always could check them at run-time by running | ||||
|  |  | |||
|  | @ -33,6 +33,9 @@ When mounting an XFS filesystem, the following options are accepted. | |||
| 	removing extended attributes) the on-disk superblock feature | ||||
| 	bit field will be updated to reflect this format being in use. | ||||
| 
 | ||||
| 	CRC enabled filesystems always use the attr2 format, and so | ||||
| 	will reject the noattr2 mount option if it is set. | ||||
| 
 | ||||
|   barrier | ||||
| 	Enables the use of block layer write barriers for writes into | ||||
| 	the journal and unwritten extent conversion.  This allows for | ||||
|  |  | |||
							
								
								
									
										12
									
								
								MAINTAINERS
									
										
									
									
									
								
							
							
						
						
									
										12
									
								
								MAINTAINERS
									
										
									
									
									
								
							|  | @ -2890,8 +2890,8 @@ F:	drivers/media/dvb-frontends/ec100* | |||
| 
 | ||||
| ECRYPT FILE SYSTEM | ||||
| M:	Tyler Hicks <tyhicks@canonical.com> | ||||
| M:	Dustin Kirkland <dustin.kirkland@gazzang.com> | ||||
| L:	ecryptfs@vger.kernel.org | ||||
| W:	http://ecryptfs.org | ||||
| W:	https://launchpad.net/ecryptfs | ||||
| S:	Supported | ||||
| F:	Documentation/filesystems/ecryptfs.txt | ||||
|  | @ -4448,6 +4448,16 @@ S:	Maintained | |||
| F:	drivers/scsi/*iscsi* | ||||
| F:	include/scsi/*iscsi* | ||||
| 
 | ||||
| ISCSI EXTENSIONS FOR RDMA (ISER) INITIATOR | ||||
| M:	Or Gerlitz <ogerlitz@mellanox.com> | ||||
| M:	Roi Dayan <roid@mellanox.com> | ||||
| L:	linux-rdma@vger.kernel.org | ||||
| S:	Supported | ||||
| W:	http://www.openfabrics.org | ||||
| W:	www.open-iscsi.org | ||||
| Q:	http://patchwork.kernel.org/project/linux-rdma/list/ | ||||
| F:	drivers/infiniband/ulp/iser | ||||
| 
 | ||||
| ISDN SUBSYSTEM | ||||
| M:	Karsten Keil <isdn@linux-pingi.de> | ||||
| L:	isdn4linux@listserv.isdn4linux.de (subscribers-only) | ||||
|  |  | |||
							
								
								
									
										2
									
								
								Makefile
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								Makefile
									
										
									
									
									
								
							|  | @ -1,7 +1,7 @@ | |||
| VERSION = 3 | ||||
| PATCHLEVEL = 10 | ||||
| SUBLEVEL = 0 | ||||
| EXTRAVERSION = -rc4 | ||||
| EXTRAVERSION = -rc5 | ||||
| NAME = Unicycling Gorilla | ||||
| 
 | ||||
| # *DOCUMENTATION*
 | ||||
|  |  | |||
|  | @ -44,6 +44,7 @@ | |||
| 			reg = <0x7e201000 0x1000>; | ||||
| 			interrupts = <2 25>; | ||||
| 			clock-frequency = <3000000>; | ||||
| 			arm,primecell-periphid = <0x00241011>; | ||||
| 		}; | ||||
| 
 | ||||
| 		gpio: gpio { | ||||
|  |  | |||
|  | @ -141,8 +141,8 @@ | |||
| 				#size-cells = <0>; | ||||
| 				compatible = "fsl,imx25-cspi", "fsl,imx35-cspi"; | ||||
| 				reg = <0x43fa4000 0x4000>; | ||||
| 				clocks = <&clks 62>; | ||||
| 				clock-names = "ipg"; | ||||
| 				clocks = <&clks 62>, <&clks 62>; | ||||
| 				clock-names = "ipg", "per"; | ||||
| 				interrupts = <14>; | ||||
| 				status = "disabled"; | ||||
| 			}; | ||||
|  | @ -182,8 +182,8 @@ | |||
| 				compatible = "fsl,imx25-cspi", "fsl,imx35-cspi"; | ||||
| 				reg = <0x50004000 0x4000>; | ||||
| 				interrupts = <0>; | ||||
| 				clocks = <&clks 80>; | ||||
| 				clock-names = "ipg"; | ||||
| 				clocks = <&clks 80>, <&clks 80>; | ||||
| 				clock-names = "ipg", "per"; | ||||
| 				status = "disabled"; | ||||
| 			}; | ||||
| 
 | ||||
|  | @ -210,8 +210,8 @@ | |||
| 				#size-cells = <0>; | ||||
| 				compatible = "fsl,imx25-cspi", "fsl,imx35-cspi"; | ||||
| 				reg = <0x50010000 0x4000>; | ||||
| 				clocks = <&clks 79>; | ||||
| 				clock-names = "ipg"; | ||||
| 				clocks = <&clks 79>, <&clks 79>; | ||||
| 				clock-names = "ipg", "per"; | ||||
| 				interrupts = <13>; | ||||
| 				status = "disabled"; | ||||
| 			}; | ||||
|  |  | |||
|  | @ -131,7 +131,7 @@ | |||
| 				compatible = "fsl,imx27-cspi"; | ||||
| 				reg = <0x1000e000 0x1000>; | ||||
| 				interrupts = <16>; | ||||
| 				clocks = <&clks 53>, <&clks 0>; | ||||
| 				clocks = <&clks 53>, <&clks 53>; | ||||
| 				clock-names = "ipg", "per"; | ||||
| 				status = "disabled"; | ||||
| 			}; | ||||
|  | @ -142,7 +142,7 @@ | |||
| 				compatible = "fsl,imx27-cspi"; | ||||
| 				reg = <0x1000f000 0x1000>; | ||||
| 				interrupts = <15>; | ||||
| 				clocks = <&clks 52>, <&clks 0>; | ||||
| 				clocks = <&clks 52>, <&clks 52>; | ||||
| 				clock-names = "ipg", "per"; | ||||
| 				status = "disabled"; | ||||
| 			}; | ||||
|  | @ -223,7 +223,7 @@ | |||
| 				compatible = "fsl,imx27-cspi"; | ||||
| 				reg = <0x10017000 0x1000>; | ||||
| 				interrupts = <6>; | ||||
| 				clocks = <&clks 51>, <&clks 0>; | ||||
| 				clocks = <&clks 51>, <&clks 51>; | ||||
| 				clock-names = "ipg", "per"; | ||||
| 				status = "disabled"; | ||||
| 			}; | ||||
|  |  | |||
|  | @ -631,7 +631,7 @@ | |||
| 				compatible = "fsl,imx51-cspi", "fsl,imx35-cspi"; | ||||
| 				reg = <0x83fc0000 0x4000>; | ||||
| 				interrupts = <38>; | ||||
| 				clocks = <&clks 55>, <&clks 0>; | ||||
| 				clocks = <&clks 55>, <&clks 55>; | ||||
| 				clock-names = "ipg", "per"; | ||||
| 				status = "disabled"; | ||||
| 			}; | ||||
|  |  | |||
|  | @ -714,7 +714,7 @@ | |||
| 				compatible = "fsl,imx53-cspi", "fsl,imx35-cspi"; | ||||
| 				reg = <0x63fc0000 0x4000>; | ||||
| 				interrupts = <38>; | ||||
| 				clocks = <&clks 55>, <&clks 0>; | ||||
| 				clocks = <&clks 55>, <&clks 55>; | ||||
| 				clock-names = "ipg", "per"; | ||||
| 				status = "disabled"; | ||||
| 			}; | ||||
|  |  | |||
|  | @ -33,18 +33,6 @@ | |||
| #include <asm/pgalloc.h> | ||||
| #include <asm/tlbflush.h> | ||||
| 
 | ||||
| /*
 | ||||
|  * We need to delay page freeing for SMP as other CPUs can access pages | ||||
|  * which have been removed but not yet had their TLB entries invalidated. | ||||
|  * Also, as ARMv7 speculative prefetch can drag new entries into the TLB, | ||||
|  * we need to apply this same delaying tactic to ensure correct operation. | ||||
|  */ | ||||
| #if defined(CONFIG_SMP) || defined(CONFIG_CPU_32v7) | ||||
| #define tlb_fast_mode(tlb)	0 | ||||
| #else | ||||
| #define tlb_fast_mode(tlb)	1 | ||||
| #endif | ||||
| 
 | ||||
| #define MMU_GATHER_BUNDLE	8 | ||||
| 
 | ||||
| /*
 | ||||
|  | @ -112,12 +100,10 @@ static inline void __tlb_alloc_page(struct mmu_gather *tlb) | |||
| static inline void tlb_flush_mmu(struct mmu_gather *tlb) | ||||
| { | ||||
| 	tlb_flush(tlb); | ||||
| 	if (!tlb_fast_mode(tlb)) { | ||||
| 		free_pages_and_swap_cache(tlb->pages, tlb->nr); | ||||
| 		tlb->nr = 0; | ||||
| 		if (tlb->pages == tlb->local) | ||||
| 			__tlb_alloc_page(tlb); | ||||
| 	} | ||||
| 	free_pages_and_swap_cache(tlb->pages, tlb->nr); | ||||
| 	tlb->nr = 0; | ||||
| 	if (tlb->pages == tlb->local) | ||||
| 		__tlb_alloc_page(tlb); | ||||
| } | ||||
| 
 | ||||
| static inline void | ||||
|  | @ -178,11 +164,6 @@ tlb_end_vma(struct mmu_gather *tlb, struct vm_area_struct *vma) | |||
| 
 | ||||
| static inline int __tlb_remove_page(struct mmu_gather *tlb, struct page *page) | ||||
| { | ||||
| 	if (tlb_fast_mode(tlb)) { | ||||
| 		free_page_and_swap_cache(page); | ||||
| 		return 1; /* avoid calling tlb_flush_mmu */ | ||||
| 	} | ||||
| 
 | ||||
| 	tlb->pages[tlb->nr++] = page; | ||||
| 	VM_BUG_ON(tlb->nr > tlb->max); | ||||
| 	return tlb->max - tlb->nr; | ||||
|  |  | |||
|  | @ -492,6 +492,11 @@ static void vcpu_pause(struct kvm_vcpu *vcpu) | |||
| 	wait_event_interruptible(*wq, !vcpu->arch.pause); | ||||
| } | ||||
| 
 | ||||
| static int kvm_vcpu_initialized(struct kvm_vcpu *vcpu) | ||||
| { | ||||
| 	return vcpu->arch.target >= 0; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * kvm_arch_vcpu_ioctl_run - the main VCPU run function to execute guest code | ||||
|  * @vcpu:	The VCPU pointer | ||||
|  | @ -508,8 +513,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run) | |||
| 	int ret; | ||||
| 	sigset_t sigsaved; | ||||
| 
 | ||||
| 	/* Make sure they initialize the vcpu with KVM_ARM_VCPU_INIT */ | ||||
| 	if (unlikely(vcpu->arch.target < 0)) | ||||
| 	if (unlikely(!kvm_vcpu_initialized(vcpu))) | ||||
| 		return -ENOEXEC; | ||||
| 
 | ||||
| 	ret = kvm_vcpu_first_run_init(vcpu); | ||||
|  | @ -710,6 +714,10 @@ long kvm_arch_vcpu_ioctl(struct file *filp, | |||
| 	case KVM_SET_ONE_REG: | ||||
| 	case KVM_GET_ONE_REG: { | ||||
| 		struct kvm_one_reg reg; | ||||
| 
 | ||||
| 		if (unlikely(!kvm_vcpu_initialized(vcpu))) | ||||
| 			return -ENOEXEC; | ||||
| 
 | ||||
| 		if (copy_from_user(®, argp, sizeof(reg))) | ||||
| 			return -EFAULT; | ||||
| 		if (ioctl == KVM_SET_ONE_REG) | ||||
|  | @ -722,6 +730,9 @@ long kvm_arch_vcpu_ioctl(struct file *filp, | |||
| 		struct kvm_reg_list reg_list; | ||||
| 		unsigned n; | ||||
| 
 | ||||
| 		if (unlikely(!kvm_vcpu_initialized(vcpu))) | ||||
| 			return -ENOEXEC; | ||||
| 
 | ||||
| 		if (copy_from_user(®_list, user_list, sizeof(reg_list))) | ||||
| 			return -EFAULT; | ||||
| 		n = reg_list.n; | ||||
|  |  | |||
|  | @ -43,7 +43,14 @@ static phys_addr_t hyp_idmap_vector; | |||
| 
 | ||||
| static void kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa) | ||||
| { | ||||
| 	kvm_call_hyp(__kvm_tlb_flush_vmid_ipa, kvm, ipa); | ||||
| 	/*
 | ||||
| 	 * This function also gets called when dealing with HYP page | ||||
| 	 * tables. As HYP doesn't have an associated struct kvm (and | ||||
| 	 * the HYP page tables are fairly static), we don't do | ||||
| 	 * anything there. | ||||
| 	 */ | ||||
| 	if (kvm) | ||||
| 		kvm_call_hyp(__kvm_tlb_flush_vmid_ipa, kvm, ipa); | ||||
| } | ||||
| 
 | ||||
| static int mmu_topup_memory_cache(struct kvm_mmu_memory_cache *cache, | ||||
|  | @ -78,18 +85,20 @@ static void *mmu_memory_cache_alloc(struct kvm_mmu_memory_cache *mc) | |||
| 	return p; | ||||
| } | ||||
| 
 | ||||
| static void clear_pud_entry(pud_t *pud) | ||||
| static void clear_pud_entry(struct kvm *kvm, pud_t *pud, phys_addr_t addr) | ||||
| { | ||||
| 	pmd_t *pmd_table = pmd_offset(pud, 0); | ||||
| 	pud_clear(pud); | ||||
| 	kvm_tlb_flush_vmid_ipa(kvm, addr); | ||||
| 	pmd_free(NULL, pmd_table); | ||||
| 	put_page(virt_to_page(pud)); | ||||
| } | ||||
| 
 | ||||
| static void clear_pmd_entry(pmd_t *pmd) | ||||
| static void clear_pmd_entry(struct kvm *kvm, pmd_t *pmd, phys_addr_t addr) | ||||
| { | ||||
| 	pte_t *pte_table = pte_offset_kernel(pmd, 0); | ||||
| 	pmd_clear(pmd); | ||||
| 	kvm_tlb_flush_vmid_ipa(kvm, addr); | ||||
| 	pte_free_kernel(NULL, pte_table); | ||||
| 	put_page(virt_to_page(pmd)); | ||||
| } | ||||
|  | @ -100,11 +109,12 @@ static bool pmd_empty(pmd_t *pmd) | |||
| 	return page_count(pmd_page) == 1; | ||||
| } | ||||
| 
 | ||||
| static void clear_pte_entry(pte_t *pte) | ||||
| static void clear_pte_entry(struct kvm *kvm, pte_t *pte, phys_addr_t addr) | ||||
| { | ||||
| 	if (pte_present(*pte)) { | ||||
| 		kvm_set_pte(pte, __pte(0)); | ||||
| 		put_page(virt_to_page(pte)); | ||||
| 		kvm_tlb_flush_vmid_ipa(kvm, addr); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
|  | @ -114,7 +124,8 @@ static bool pte_empty(pte_t *pte) | |||
| 	return page_count(pte_page) == 1; | ||||
| } | ||||
| 
 | ||||
| static void unmap_range(pgd_t *pgdp, unsigned long long start, u64 size) | ||||
| static void unmap_range(struct kvm *kvm, pgd_t *pgdp, | ||||
| 			unsigned long long start, u64 size) | ||||
| { | ||||
| 	pgd_t *pgd; | ||||
| 	pud_t *pud; | ||||
|  | @ -138,15 +149,15 @@ static void unmap_range(pgd_t *pgdp, unsigned long long start, u64 size) | |||
| 		} | ||||
| 
 | ||||
| 		pte = pte_offset_kernel(pmd, addr); | ||||
| 		clear_pte_entry(pte); | ||||
| 		clear_pte_entry(kvm, pte, addr); | ||||
| 		range = PAGE_SIZE; | ||||
| 
 | ||||
| 		/* If we emptied the pte, walk back up the ladder */ | ||||
| 		if (pte_empty(pte)) { | ||||
| 			clear_pmd_entry(pmd); | ||||
| 			clear_pmd_entry(kvm, pmd, addr); | ||||
| 			range = PMD_SIZE; | ||||
| 			if (pmd_empty(pmd)) { | ||||
| 				clear_pud_entry(pud); | ||||
| 				clear_pud_entry(kvm, pud, addr); | ||||
| 				range = PUD_SIZE; | ||||
| 			} | ||||
| 		} | ||||
|  | @ -165,14 +176,14 @@ void free_boot_hyp_pgd(void) | |||
| 	mutex_lock(&kvm_hyp_pgd_mutex); | ||||
| 
 | ||||
| 	if (boot_hyp_pgd) { | ||||
| 		unmap_range(boot_hyp_pgd, hyp_idmap_start, PAGE_SIZE); | ||||
| 		unmap_range(boot_hyp_pgd, TRAMPOLINE_VA, PAGE_SIZE); | ||||
| 		unmap_range(NULL, boot_hyp_pgd, hyp_idmap_start, PAGE_SIZE); | ||||
| 		unmap_range(NULL, boot_hyp_pgd, TRAMPOLINE_VA, PAGE_SIZE); | ||||
| 		kfree(boot_hyp_pgd); | ||||
| 		boot_hyp_pgd = NULL; | ||||
| 	} | ||||
| 
 | ||||
| 	if (hyp_pgd) | ||||
| 		unmap_range(hyp_pgd, TRAMPOLINE_VA, PAGE_SIZE); | ||||
| 		unmap_range(NULL, hyp_pgd, TRAMPOLINE_VA, PAGE_SIZE); | ||||
| 
 | ||||
| 	kfree(init_bounce_page); | ||||
| 	init_bounce_page = NULL; | ||||
|  | @ -200,9 +211,10 @@ void free_hyp_pgds(void) | |||
| 
 | ||||
| 	if (hyp_pgd) { | ||||
| 		for (addr = PAGE_OFFSET; virt_addr_valid(addr); addr += PGDIR_SIZE) | ||||
| 			unmap_range(hyp_pgd, KERN_TO_HYP(addr), PGDIR_SIZE); | ||||
| 			unmap_range(NULL, hyp_pgd, KERN_TO_HYP(addr), PGDIR_SIZE); | ||||
| 		for (addr = VMALLOC_START; is_vmalloc_addr((void*)addr); addr += PGDIR_SIZE) | ||||
| 			unmap_range(hyp_pgd, KERN_TO_HYP(addr), PGDIR_SIZE); | ||||
| 			unmap_range(NULL, hyp_pgd, KERN_TO_HYP(addr), PGDIR_SIZE); | ||||
| 
 | ||||
| 		kfree(hyp_pgd); | ||||
| 		hyp_pgd = NULL; | ||||
| 	} | ||||
|  | @ -393,7 +405,7 @@ int kvm_alloc_stage2_pgd(struct kvm *kvm) | |||
|  */ | ||||
| static void unmap_stage2_range(struct kvm *kvm, phys_addr_t start, u64 size) | ||||
| { | ||||
| 	unmap_range(kvm->arch.pgd, start, size); | ||||
| 	unmap_range(kvm, kvm->arch.pgd, start, size); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  | @ -675,7 +687,6 @@ static void handle_hva_to_gpa(struct kvm *kvm, | |||
| static void kvm_unmap_hva_handler(struct kvm *kvm, gpa_t gpa, void *data) | ||||
| { | ||||
| 	unmap_stage2_range(kvm, gpa, PAGE_SIZE); | ||||
| 	kvm_tlb_flush_vmid_ipa(kvm, gpa); | ||||
| } | ||||
| 
 | ||||
| int kvm_unmap_hva(struct kvm *kvm, unsigned long hva) | ||||
|  |  | |||
|  | @ -386,6 +386,8 @@ int __init exynos_fdt_map_chipid(unsigned long node, const char *uname, | |||
| 
 | ||||
| void __init exynos_init_io(struct map_desc *mach_desc, int size) | ||||
| { | ||||
| 	debug_ll_io_init(); | ||||
| 
 | ||||
| #ifdef CONFIG_OF | ||||
| 	if (initial_boot_params) | ||||
| 		of_scan_flat_dt(exynos_fdt_map_chipid, NULL); | ||||
|  |  | |||
|  | @ -181,14 +181,14 @@ static const char *periph_clk2_sels[]	= { "pll3_usb_otg", "osc", "osc", "dummy", | |||
| static const char *periph2_clk2_sels[]	= { "pll3_usb_otg", "pll2_bus", }; | ||||
| static const char *periph_sels[]	= { "periph_pre", "periph_clk2", }; | ||||
| static const char *periph2_sels[]	= { "periph2_pre", "periph2_clk2", }; | ||||
| static const char *axi_sels[]		= { "periph", "pll2_pfd2_396m", "pll3_pfd1_540m", }; | ||||
| static const char *axi_sels[]		= { "periph", "pll2_pfd2_396m", "periph", "pll3_pfd1_540m", }; | ||||
| static const char *audio_sels[]	= { "pll4_post_div", "pll3_pfd2_508m", "pll3_pfd3_454m", "pll3_usb_otg", }; | ||||
| static const char *gpu_axi_sels[]	= { "axi", "ahb", }; | ||||
| static const char *gpu2d_core_sels[]	= { "axi", "pll3_usb_otg", "pll2_pfd0_352m", "pll2_pfd2_396m", }; | ||||
| static const char *gpu3d_core_sels[]	= { "mmdc_ch0_axi", "pll3_usb_otg", "pll2_pfd1_594m", "pll2_pfd2_396m", }; | ||||
| static const char *gpu3d_shader_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll2_pfd1_594m", "pll3_pfd0_720m", }; | ||||
| static const char *ipu_sels[]		= { "mmdc_ch0_axi", "pll2_pfd2_396m", "pll3_120m", "pll3_pfd1_540m", }; | ||||
| static const char *ldb_di_sels[]	= { "pll5_video", "pll2_pfd0_352m", "pll2_pfd2_396m", "mmdc_ch1_axi", "pll3_usb_otg", }; | ||||
| static const char *ldb_di_sels[]	= { "pll5_video_div", "pll2_pfd0_352m", "pll2_pfd2_396m", "mmdc_ch1_axi", "pll3_usb_otg", }; | ||||
| static const char *ipu_di_pre_sels[]	= { "mmdc_ch0_axi", "pll3_usb_otg", "pll5_video_div", "pll2_pfd0_352m", "pll2_pfd2_396m", "pll3_pfd1_540m", }; | ||||
| static const char *ipu1_di0_sels[]	= { "ipu1_di0_pre", "dummy", "dummy", "ldb_di0", "ldb_di1", }; | ||||
| static const char *ipu1_di1_sels[]	= { "ipu1_di1_pre", "dummy", "dummy", "ldb_di0", "ldb_di1", }; | ||||
|  |  | |||
|  | @ -41,13 +41,3 @@ void __init qnap_dt_ts219_init(void) | |||
| 
 | ||||
| 	pm_power_off = qnap_tsx1x_power_off; | ||||
| } | ||||
| 
 | ||||
| /* FIXME: Will not work with DT. Maybe use MPP40_GPIO? */ | ||||
| static int __init ts219_pci_init(void) | ||||
| { | ||||
| 	if (machine_is_ts219()) | ||||
| 		kirkwood_pcie_init(KW_PCIE0); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| subsys_initcall(ts219_pci_init); | ||||
|  |  | |||
|  | @ -32,15 +32,21 @@ ENTRY(ll_set_cpu_coherent) | |||
| 
 | ||||
| 	/* Add CPU to SMP group - Atomic */ | ||||
| 	add	r3, r0, #ARMADA_XP_CFB_CTL_REG_OFFSET | ||||
| 	ldr	r2, [r3] | ||||
| 1: | ||||
| 	ldrex	r2, [r3] | ||||
| 	orr	r2, r2, r1 | ||||
| 	str	r2, [r3] | ||||
| 	strex 	r0, r2, [r3] | ||||
| 	cmp	r0, #0 | ||||
| 	bne 1b | ||||
| 
 | ||||
| 	/* Enable coherency on CPU - Atomic */ | ||||
| 	add	r3, r0, #ARMADA_XP_CFB_CFG_REG_OFFSET | ||||
| 	ldr	r2, [r3] | ||||
| 	add	r3, r3, #ARMADA_XP_CFB_CFG_REG_OFFSET | ||||
| 1: | ||||
| 	ldrex	r2, [r3] | ||||
| 	orr	r2, r2, r1 | ||||
| 	str	r2, [r3] | ||||
| 	strex	r0, r2, [r3] | ||||
| 	cmp	r0, #0 | ||||
| 	bne 1b | ||||
| 
 | ||||
| 	dsb | ||||
| 
 | ||||
|  |  | |||
|  | @ -252,7 +252,7 @@ static struct sh_timer_config cmt10_platform_data = { | |||
| 	.name = "CMT10", | ||||
| 	.channel_offset = 0x10, | ||||
| 	.timer_bit = 0, | ||||
| 	.clockevent_rating = 125, | ||||
| 	.clockevent_rating = 80, | ||||
| 	.clocksource_rating = 125, | ||||
| }; | ||||
| 
 | ||||
|  |  | |||
|  | @ -374,6 +374,7 @@ static struct ab8500_regulator_reg_init ab8500_reg_init[] = { | |||
| static struct regulator_init_data ab8500_regulators[AB8500_NUM_REGULATORS] = { | ||||
| 	/* supplies to the display/camera */ | ||||
| 	[AB8500_LDO_AUX1] = { | ||||
| 		.supply_regulator = "ab8500-ext-supply3", | ||||
| 		.constraints = { | ||||
| 			.name = "V-DISPLAY", | ||||
| 			.min_uV = 2800000, | ||||
|  | @ -387,6 +388,7 @@ static struct regulator_init_data ab8500_regulators[AB8500_NUM_REGULATORS] = { | |||
| 	}, | ||||
| 	/* supplies to the on-board eMMC */ | ||||
| 	[AB8500_LDO_AUX2] = { | ||||
| 		.supply_regulator = "ab8500-ext-supply3", | ||||
| 		.constraints = { | ||||
| 			.name = "V-eMMC1", | ||||
| 			.min_uV = 1100000, | ||||
|  | @ -402,6 +404,7 @@ static struct regulator_init_data ab8500_regulators[AB8500_NUM_REGULATORS] = { | |||
| 	}, | ||||
| 	/* supply for VAUX3, supplies to SDcard slots */ | ||||
| 	[AB8500_LDO_AUX3] = { | ||||
| 		.supply_regulator = "ab8500-ext-supply3", | ||||
| 		.constraints = { | ||||
| 			.name = "V-MMC-SD", | ||||
| 			.min_uV = 1100000, | ||||
|  |  | |||
|  | @ -21,6 +21,7 @@ | |||
| #include <asm/proc-fns.h> | ||||
| 
 | ||||
| #include "db8500-regs.h" | ||||
| #include "id.h" | ||||
| 
 | ||||
| static atomic_t master = ATOMIC_INIT(0); | ||||
| static DEFINE_SPINLOCK(master_lock); | ||||
|  | @ -114,6 +115,9 @@ static struct cpuidle_driver ux500_idle_driver = { | |||
| 
 | ||||
| int __init ux500_idle_init(void) | ||||
| { | ||||
| 	if (!(cpu_is_u8500_family() || cpu_is_ux540_family())) | ||||
| 		return -ENODEV; | ||||
| 
 | ||||
| 	/* Configure wake up reasons */ | ||||
| 	prcmu_enable_wakeups(PRCMU_WAKEUP(ARM) | PRCMU_WAKEUP(RTC) | | ||||
| 			     PRCMU_WAKEUP(ABB)); | ||||
|  |  | |||
|  | @ -66,6 +66,9 @@ uart_rd(unsigned int reg) | |||
| 
 | ||||
| static void putc(int ch) | ||||
| { | ||||
| 	if (!config_enabled(CONFIG_DEBUG_LL)) | ||||
| 		return; | ||||
| 
 | ||||
| 	if (uart_rd(S3C2410_UFCON) & S3C2410_UFCON_FIFOMODE) { | ||||
| 		int level; | ||||
| 
 | ||||
|  | @ -118,7 +121,12 @@ static void arch_decomp_error(const char *x) | |||
| #ifdef CONFIG_S3C_BOOT_UART_FORCE_FIFO | ||||
| static inline void arch_enable_uart_fifo(void) | ||||
| { | ||||
| 	u32 fifocon = uart_rd(S3C2410_UFCON); | ||||
| 	u32 fifocon; | ||||
| 
 | ||||
| 	if (!config_enabled(CONFIG_DEBUG_LL)) | ||||
| 		return; | ||||
| 
 | ||||
| 	fifocon = uart_rd(S3C2410_UFCON); | ||||
| 
 | ||||
| 	if (!(fifocon & S3C2410_UFCON_FIFOMODE)) { | ||||
| 		fifocon |= S3C2410_UFCON_RESETBOTH; | ||||
|  |  | |||
|  | @ -46,12 +46,6 @@ | |||
| #include <asm/tlbflush.h> | ||||
| #include <asm/machvec.h> | ||||
| 
 | ||||
| #ifdef CONFIG_SMP | ||||
| # define tlb_fast_mode(tlb)	((tlb)->nr == ~0U) | ||||
| #else | ||||
| # define tlb_fast_mode(tlb)	(1) | ||||
| #endif | ||||
| 
 | ||||
| /*
 | ||||
|  * If we can't allocate a page to make a big batch of page pointers | ||||
|  * to work on, then just handle a few from the on-stack structure. | ||||
|  | @ -60,7 +54,7 @@ | |||
| 
 | ||||
| struct mmu_gather { | ||||
| 	struct mm_struct	*mm; | ||||
| 	unsigned int		nr;		/* == ~0U => fast mode */ | ||||
| 	unsigned int		nr; | ||||
| 	unsigned int		max; | ||||
| 	unsigned char		fullmm;		/* non-zero means full mm flush */ | ||||
| 	unsigned char		need_flush;	/* really unmapped some PTEs? */ | ||||
|  | @ -103,6 +97,7 @@ extern struct ia64_tr_entry *ia64_idtrs[NR_CPUS]; | |||
| static inline void | ||||
| ia64_tlb_flush_mmu (struct mmu_gather *tlb, unsigned long start, unsigned long end) | ||||
| { | ||||
| 	unsigned long i; | ||||
| 	unsigned int nr; | ||||
| 
 | ||||
| 	if (!tlb->need_flush) | ||||
|  | @ -141,13 +136,11 @@ ia64_tlb_flush_mmu (struct mmu_gather *tlb, unsigned long start, unsigned long e | |||
| 
 | ||||
| 	/* lastly, release the freed pages */ | ||||
| 	nr = tlb->nr; | ||||
| 	if (!tlb_fast_mode(tlb)) { | ||||
| 		unsigned long i; | ||||
| 		tlb->nr = 0; | ||||
| 		tlb->start_addr = ~0UL; | ||||
| 		for (i = 0; i < nr; ++i) | ||||
| 			free_page_and_swap_cache(tlb->pages[i]); | ||||
| 	} | ||||
| 
 | ||||
| 	tlb->nr = 0; | ||||
| 	tlb->start_addr = ~0UL; | ||||
| 	for (i = 0; i < nr; ++i) | ||||
| 		free_page_and_swap_cache(tlb->pages[i]); | ||||
| } | ||||
| 
 | ||||
| static inline void __tlb_alloc_page(struct mmu_gather *tlb) | ||||
|  | @ -167,20 +160,7 @@ tlb_gather_mmu(struct mmu_gather *tlb, struct mm_struct *mm, unsigned int full_m | |||
| 	tlb->mm = mm; | ||||
| 	tlb->max = ARRAY_SIZE(tlb->local); | ||||
| 	tlb->pages = tlb->local; | ||||
| 	/*
 | ||||
| 	 * Use fast mode if only 1 CPU is online. | ||||
| 	 * | ||||
| 	 * It would be tempting to turn on fast-mode for full_mm_flush as well.  But this | ||||
| 	 * doesn't work because of speculative accesses and software prefetching: the page | ||||
| 	 * table of "mm" may (and usually is) the currently active page table and even | ||||
| 	 * though the kernel won't do any user-space accesses during the TLB shoot down, a | ||||
| 	 * compiler might use speculation or lfetch.fault on what happens to be a valid | ||||
| 	 * user-space address.  This in turn could trigger a TLB miss fault (or a VHPT | ||||
| 	 * walk) and re-insert a TLB entry we just removed.  Slow mode avoids such | ||||
| 	 * problems.  (We could make fast-mode work by switching the current task to a | ||||
| 	 * different "mm" during the shootdown.) --davidm 08/02/2002 | ||||
| 	 */ | ||||
| 	tlb->nr = (num_online_cpus() == 1) ? ~0U : 0; | ||||
| 	tlb->nr = 0; | ||||
| 	tlb->fullmm = full_mm_flush; | ||||
| 	tlb->start_addr = ~0UL; | ||||
| } | ||||
|  | @ -214,11 +194,6 @@ static inline int __tlb_remove_page(struct mmu_gather *tlb, struct page *page) | |||
| { | ||||
| 	tlb->need_flush = 1; | ||||
| 
 | ||||
| 	if (tlb_fast_mode(tlb)) { | ||||
| 		free_page_and_swap_cache(page); | ||||
| 		return 1; /* avoid calling tlb_flush_mmu */ | ||||
| 	} | ||||
| 
 | ||||
| 	if (!tlb->nr && tlb->pages == tlb->local) | ||||
| 		__tlb_alloc_page(tlb); | ||||
| 
 | ||||
|  |  | |||
|  | @ -86,6 +86,7 @@ static inline int gpio_cansleep(unsigned gpio) | |||
| 	return gpio < MCFGPIO_PIN_MAX ? 0 : __gpio_cansleep(gpio); | ||||
| } | ||||
| 
 | ||||
| #ifndef CONFIG_GPIOLIB | ||||
| static inline int gpio_request_one(unsigned gpio, unsigned long flags, const char *label) | ||||
| { | ||||
| 	int err; | ||||
|  | @ -105,5 +106,5 @@ static inline int gpio_request_one(unsigned gpio, unsigned long flags, const cha | |||
| 
 | ||||
| 	return err; | ||||
| } | ||||
| 
 | ||||
| #endif /* !CONFIG_GPIOLIB */ | ||||
| #endif | ||||
|  |  | |||
|  | @ -2752,11 +2752,9 @@ func_return	get_new_page | |||
| #ifdef CONFIG_MAC | ||||
| 
 | ||||
| L(scc_initable_mac): | ||||
| 	.byte	9,12		/* Reset */ | ||||
| 	.byte	4,0x44		/* x16, 1 stopbit, no parity */ | ||||
| 	.byte	3,0xc0		/* receiver: 8 bpc */ | ||||
| 	.byte	5,0xe2		/* transmitter: 8 bpc, assert dtr/rts */ | ||||
| 	.byte	9,0		/* no interrupts */ | ||||
| 	.byte	10,0		/* NRZ */ | ||||
| 	.byte	11,0x50		/* use baud rate generator */ | ||||
| 	.byte	12,1,13,0	/* 38400 baud */ | ||||
|  | @ -2899,6 +2897,7 @@ func_start	serial_init,%d0/%d1/%a0/%a1 | |||
| 	is_not_mac(L(serial_init_not_mac)) | ||||
| 
 | ||||
| #ifdef SERIAL_DEBUG | ||||
| 
 | ||||
| /* You may define either or both of these. */ | ||||
| #define MAC_USE_SCC_A /* Modem port */ | ||||
| #define MAC_USE_SCC_B /* Printer port */ | ||||
|  | @ -2908,9 +2907,21 @@ func_start	serial_init,%d0/%d1/%a0/%a1 | |||
| #define mac_scc_cha_b_data_offset	0x4 | ||||
| #define mac_scc_cha_a_data_offset	0x6 | ||||
| 
 | ||||
| #if defined(MAC_USE_SCC_A) || defined(MAC_USE_SCC_B) | ||||
| 	movel	%pc@(L(mac_sccbase)),%a0
 | ||||
| 	/* Reset SCC device */ | ||||
| 	moveb	#9,%a0@(mac_scc_cha_a_ctrl_offset)
 | ||||
| 	moveb	#0xc0,%a0@(mac_scc_cha_a_ctrl_offset)
 | ||||
| 	/* Wait for 5 PCLK cycles, which is about 68 CPU cycles */ | ||||
| 	/* 5 / 3.6864 MHz = approx. 1.36 us = 68 / 50 MHz */ | ||||
| 	movel	#35,%d0 | ||||
| 5: | ||||
| 	subq	#1,%d0 | ||||
| 	jne	5b | ||||
| #endif | ||||
| 
 | ||||
| #ifdef MAC_USE_SCC_A | ||||
| 	/* Initialize channel A */ | ||||
| 	movel	%pc@(L(mac_sccbase)),%a0
 | ||||
| 	lea	%pc@(L(scc_initable_mac)),%a1
 | ||||
| 5:	moveb	%a1@+,%d0
 | ||||
| 	jmi	6f | ||||
|  | @ -2922,9 +2933,6 @@ func_start	serial_init,%d0/%d1/%a0/%a1 | |||
| 
 | ||||
| #ifdef MAC_USE_SCC_B | ||||
| 	/* Initialize channel B */ | ||||
| #ifndef MAC_USE_SCC_A	/* Load mac_sccbase only if needed */ | ||||
| 	movel	%pc@(L(mac_sccbase)),%a0
 | ||||
| #endif	/* MAC_USE_SCC_A */ | ||||
| 	lea	%pc@(L(scc_initable_mac)),%a1
 | ||||
| 7:	moveb	%a1@+,%d0
 | ||||
| 	jmi	8f | ||||
|  | @ -2933,6 +2941,7 @@ func_start	serial_init,%d0/%d1/%a0/%a1 | |||
| 	jra	7b | ||||
| 8: | ||||
| #endif	/* MAC_USE_SCC_B */ | ||||
| 
 | ||||
| #endif	/* SERIAL_DEBUG */ | ||||
| 
 | ||||
| 	jra	L(serial_init_done) | ||||
|  | @ -3006,17 +3015,17 @@ func_start	serial_putc,%d0/%d1/%a0/%a1 | |||
| 
 | ||||
| #ifdef SERIAL_DEBUG | ||||
| 
 | ||||
| #ifdef MAC_USE_SCC_A | ||||
| #if defined(MAC_USE_SCC_A) || defined(MAC_USE_SCC_B) | ||||
| 	movel	%pc@(L(mac_sccbase)),%a1
 | ||||
| #endif | ||||
| 
 | ||||
| #ifdef MAC_USE_SCC_A | ||||
| 3:	btst	#2,%a1@(mac_scc_cha_a_ctrl_offset)
 | ||||
| 	jeq	3b | ||||
| 	moveb	%d0,%a1@(mac_scc_cha_a_data_offset)
 | ||||
| #endif	/* MAC_USE_SCC_A */ | ||||
| 
 | ||||
| #ifdef MAC_USE_SCC_B | ||||
| #ifndef MAC_USE_SCC_A	/* Load mac_sccbase only if needed */ | ||||
| 	movel	%pc@(L(mac_sccbase)),%a1
 | ||||
| #endif	/* MAC_USE_SCC_A */ | ||||
| 4:	btst	#2,%a1@(mac_scc_cha_b_ctrl_offset)
 | ||||
| 	jeq	4b | ||||
| 	moveb	%d0,%a1@(mac_scc_cha_b_data_offset)
 | ||||
|  |  | |||
|  | @ -102,21 +102,23 @@ do { \ | |||
| 
 | ||||
| #define flush_cache_range(vma, start, len) do { } while (0) | ||||
| 
 | ||||
| #define copy_to_user_page(vma, page, vaddr, dst, src, len)		\ | ||||
| do {									\ | ||||
| 	u32 addr = virt_to_phys(dst);					\ | ||||
| 	memcpy((dst), (src), (len));					\ | ||||
| 	if (vma->vm_flags & VM_EXEC) {					\ | ||||
| 		invalidate_icache_range((unsigned) (addr),		\ | ||||
| 					(unsigned) (addr) + PAGE_SIZE);	\ | ||||
| 		flush_dcache_range((unsigned) (addr),			\ | ||||
| 					(unsigned) (addr) + PAGE_SIZE);	\ | ||||
| 	}								\ | ||||
| } while (0) | ||||
| static inline void copy_to_user_page(struct vm_area_struct *vma, | ||||
| 				     struct page *page, unsigned long vaddr, | ||||
| 				     void *dst, void *src, int len) | ||||
| { | ||||
| 	u32 addr = virt_to_phys(dst); | ||||
| 	memcpy(dst, src, len); | ||||
| 	if (vma->vm_flags & VM_EXEC) { | ||||
| 		invalidate_icache_range(addr, addr + PAGE_SIZE); | ||||
| 		flush_dcache_range(addr, addr + PAGE_SIZE); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| #define copy_from_user_page(vma, page, vaddr, dst, src, len)		\ | ||||
| do {									\ | ||||
| 	memcpy((dst), (src), (len));					\ | ||||
| } while (0) | ||||
| static inline void copy_from_user_page(struct vm_area_struct *vma, | ||||
| 				       struct page *page, unsigned long vaddr, | ||||
| 				       void *dst, void *src, int len) | ||||
| { | ||||
| 	memcpy(dst, src, len); | ||||
| } | ||||
| 
 | ||||
| #endif /* _ASM_MICROBLAZE_CACHEFLUSH_H */ | ||||
|  |  | |||
|  | @ -99,13 +99,13 @@ static inline int access_ok(int type, const void __user *addr, | |||
| 	if ((get_fs().seg < ((unsigned long)addr)) || | ||||
| 			(get_fs().seg < ((unsigned long)addr + size - 1))) { | ||||
| 		pr_debug("ACCESS fail: %s at 0x%08x (size 0x%x), seg 0x%08x\n", | ||||
| 			type ? "WRITE" : "READ ", (u32)addr, (u32)size, | ||||
| 			type ? "WRITE" : "READ ", (__force u32)addr, (u32)size, | ||||
| 			(u32)get_fs().seg); | ||||
| 		return 0; | ||||
| 	} | ||||
| ok: | ||||
| 	pr_debug("ACCESS OK: %s at 0x%08x (size 0x%x), seg 0x%08x\n", | ||||
| 			type ? "WRITE" : "READ ", (u32)addr, (u32)size, | ||||
| 			type ? "WRITE" : "READ ", (__force u32)addr, (u32)size, | ||||
| 			(u32)get_fs().seg); | ||||
| 	return 1; | ||||
| } | ||||
|  |  | |||
|  | @ -428,13 +428,16 @@ static void octeon_restart(char *command) | |||
|  */ | ||||
| static void octeon_kill_core(void *arg) | ||||
| { | ||||
| 	mb(); | ||||
| 	if (octeon_is_simulation()) { | ||||
| 		/* The simulator needs the watchdog to stop for dead cores */ | ||||
| 		cvmx_write_csr(CVMX_CIU_WDOGX(cvmx_get_core_num()), 0); | ||||
| 	if (octeon_is_simulation()) | ||||
| 		/* A break instruction causes the simulator stop a core */ | ||||
| 		asm volatile ("sync\nbreak"); | ||||
| 	} | ||||
| 		asm volatile ("break" ::: "memory"); | ||||
| 
 | ||||
| 	local_irq_disable(); | ||||
| 	/* Disable watchdog on this core. */ | ||||
| 	cvmx_write_csr(CVMX_CIU_WDOGX(cvmx_get_core_num()), 0); | ||||
| 	/* Spin in a low power mode. */ | ||||
| 	while (true) | ||||
| 		asm volatile ("wait" ::: "memory"); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -496,10 +496,6 @@ struct kvm_mips_callbacks { | |||
| 			    uint32_t cause); | ||||
| 	int (*irq_clear) (struct kvm_vcpu *vcpu, unsigned int priority, | ||||
| 			  uint32_t cause); | ||||
| 	int (*vcpu_ioctl_get_regs) (struct kvm_vcpu *vcpu, | ||||
| 				    struct kvm_regs *regs); | ||||
| 	int (*vcpu_ioctl_set_regs) (struct kvm_vcpu *vcpu, | ||||
| 				    struct kvm_regs *regs); | ||||
| }; | ||||
| extern struct kvm_mips_callbacks *kvm_mips_callbacks; | ||||
| int kvm_mips_emulation_init(struct kvm_mips_callbacks **install_callbacks); | ||||
|  |  | |||
|  | @ -16,6 +16,38 @@ | |||
| #include <asm/isadep.h> | ||||
| #include <uapi/asm/ptrace.h> | ||||
| 
 | ||||
| /*
 | ||||
|  * This struct defines the way the registers are stored on the stack during a | ||||
|  * system call/exception. As usual the registers k0/k1 aren't being saved. | ||||
|  */ | ||||
| struct pt_regs { | ||||
| #ifdef CONFIG_32BIT | ||||
| 	/* Pad bytes for argument save space on the stack. */ | ||||
| 	unsigned long pad0[6]; | ||||
| #endif | ||||
| 
 | ||||
| 	/* Saved main processor registers. */ | ||||
| 	unsigned long regs[32]; | ||||
| 
 | ||||
| 	/* Saved special registers. */ | ||||
| 	unsigned long cp0_status; | ||||
| 	unsigned long hi; | ||||
| 	unsigned long lo; | ||||
| #ifdef CONFIG_CPU_HAS_SMARTMIPS | ||||
| 	unsigned long acx; | ||||
| #endif | ||||
| 	unsigned long cp0_badvaddr; | ||||
| 	unsigned long cp0_cause; | ||||
| 	unsigned long cp0_epc; | ||||
| #ifdef CONFIG_MIPS_MT_SMTC | ||||
| 	unsigned long cp0_tcstatus; | ||||
| #endif /* CONFIG_MIPS_MT_SMTC */ | ||||
| #ifdef CONFIG_CPU_CAVIUM_OCTEON | ||||
| 	unsigned long long mpl[3];	  /* MTM{0,1,2} */ | ||||
| 	unsigned long long mtp[3];	  /* MTP{0,1,2} */ | ||||
| #endif | ||||
| } __aligned(8); | ||||
| 
 | ||||
| struct task_struct; | ||||
| 
 | ||||
| extern int ptrace_getregs(struct task_struct *child, __s64 __user *data); | ||||
|  |  | |||
|  | @ -1,55 +1,138 @@ | |||
| /*
 | ||||
| * This file is subject to the terms and conditions of the GNU General Public | ||||
| * License.  See the file "COPYING" in the main directory of this archive | ||||
| * for more details. | ||||
| * | ||||
| * Copyright (C) 2012  MIPS Technologies, Inc.  All rights reserved. | ||||
| * Authors: Sanjay Lal <sanjayl@kymasys.com> | ||||
| */ | ||||
|  * This file is subject to the terms and conditions of the GNU General Public | ||||
|  * License.  See the file "COPYING" in the main directory of this archive | ||||
|  * for more details. | ||||
|  * | ||||
|  * Copyright (C) 2012  MIPS Technologies, Inc.  All rights reserved. | ||||
|  * Copyright (C) 2013 Cavium, Inc. | ||||
|  * Authors: Sanjay Lal <sanjayl@kymasys.com> | ||||
|  */ | ||||
| 
 | ||||
| #ifndef __LINUX_KVM_MIPS_H | ||||
| #define __LINUX_KVM_MIPS_H | ||||
| 
 | ||||
| #include <linux/types.h> | ||||
| 
 | ||||
| #define __KVM_MIPS | ||||
| /*
 | ||||
|  * KVM MIPS specific structures and definitions. | ||||
|  * | ||||
|  * Some parts derived from the x86 version of this file. | ||||
|  */ | ||||
| 
 | ||||
| #define N_MIPS_COPROC_REGS      32 | ||||
| #define N_MIPS_COPROC_SEL   	8 | ||||
| 
 | ||||
| /* for KVM_GET_REGS and KVM_SET_REGS */ | ||||
| /*
 | ||||
|  * for KVM_GET_REGS and KVM_SET_REGS | ||||
|  * | ||||
|  * If Config[AT] is zero (32-bit CPU), the register contents are | ||||
|  * stored in the lower 32-bits of the struct kvm_regs fields and sign | ||||
|  * extended to 64-bits. | ||||
|  */ | ||||
| struct kvm_regs { | ||||
| 	__u32 gprs[32]; | ||||
| 	__u32 hi; | ||||
| 	__u32 lo; | ||||
| 	__u32 pc; | ||||
| 
 | ||||
| 	__u32 cp0reg[N_MIPS_COPROC_REGS][N_MIPS_COPROC_SEL]; | ||||
| 	/* out (KVM_GET_REGS) / in (KVM_SET_REGS) */ | ||||
| 	__u64 gpr[32]; | ||||
| 	__u64 hi; | ||||
| 	__u64 lo; | ||||
| 	__u64 pc; | ||||
| }; | ||||
| 
 | ||||
| /* for KVM_GET_SREGS and KVM_SET_SREGS */ | ||||
| struct kvm_sregs { | ||||
| }; | ||||
| 
 | ||||
| /* for KVM_GET_FPU and KVM_SET_FPU */ | ||||
| /*
 | ||||
|  * for KVM_GET_FPU and KVM_SET_FPU | ||||
|  * | ||||
|  * If Status[FR] is zero (32-bit FPU), the upper 32-bits of the FPRs | ||||
|  * are zero filled. | ||||
|  */ | ||||
| struct kvm_fpu { | ||||
| 	__u64 fpr[32]; | ||||
| 	__u32 fir; | ||||
| 	__u32 fccr; | ||||
| 	__u32 fexr; | ||||
| 	__u32 fenr; | ||||
| 	__u32 fcsr; | ||||
| 	__u32 pad; | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| /*
 | ||||
|  * For MIPS, we use KVM_SET_ONE_REG and KVM_GET_ONE_REG to access CP0 | ||||
|  * registers.  The id field is broken down as follows: | ||||
|  * | ||||
|  *  bits[2..0]   - Register 'sel' index. | ||||
|  *  bits[7..3]   - Register 'rd'  index. | ||||
|  *  bits[15..8]  - Must be zero. | ||||
|  *  bits[63..16] - 1 -> CP0 registers. | ||||
|  * | ||||
|  * Other sets registers may be added in the future.  Each set would | ||||
|  * have its own identifier in bits[63..16]. | ||||
|  * | ||||
|  * The addr field of struct kvm_one_reg must point to an aligned | ||||
|  * 64-bit wide location.  For registers that are narrower than | ||||
|  * 64-bits, the value is stored in the low order bits of the location, | ||||
|  * and sign extended to 64-bits. | ||||
|  * | ||||
|  * The registers defined in struct kvm_regs are also accessible, the | ||||
|  * id values for these are below. | ||||
|  */ | ||||
| 
 | ||||
| #define KVM_REG_MIPS_R0 0 | ||||
| #define KVM_REG_MIPS_R1 1 | ||||
| #define KVM_REG_MIPS_R2 2 | ||||
| #define KVM_REG_MIPS_R3 3 | ||||
| #define KVM_REG_MIPS_R4 4 | ||||
| #define KVM_REG_MIPS_R5 5 | ||||
| #define KVM_REG_MIPS_R6 6 | ||||
| #define KVM_REG_MIPS_R7 7 | ||||
| #define KVM_REG_MIPS_R8 8 | ||||
| #define KVM_REG_MIPS_R9 9 | ||||
| #define KVM_REG_MIPS_R10 10 | ||||
| #define KVM_REG_MIPS_R11 11 | ||||
| #define KVM_REG_MIPS_R12 12 | ||||
| #define KVM_REG_MIPS_R13 13 | ||||
| #define KVM_REG_MIPS_R14 14 | ||||
| #define KVM_REG_MIPS_R15 15 | ||||
| #define KVM_REG_MIPS_R16 16 | ||||
| #define KVM_REG_MIPS_R17 17 | ||||
| #define KVM_REG_MIPS_R18 18 | ||||
| #define KVM_REG_MIPS_R19 19 | ||||
| #define KVM_REG_MIPS_R20 20 | ||||
| #define KVM_REG_MIPS_R21 21 | ||||
| #define KVM_REG_MIPS_R22 22 | ||||
| #define KVM_REG_MIPS_R23 23 | ||||
| #define KVM_REG_MIPS_R24 24 | ||||
| #define KVM_REG_MIPS_R25 25 | ||||
| #define KVM_REG_MIPS_R26 26 | ||||
| #define KVM_REG_MIPS_R27 27 | ||||
| #define KVM_REG_MIPS_R28 28 | ||||
| #define KVM_REG_MIPS_R29 29 | ||||
| #define KVM_REG_MIPS_R30 30 | ||||
| #define KVM_REG_MIPS_R31 31 | ||||
| 
 | ||||
| #define KVM_REG_MIPS_HI 32 | ||||
| #define KVM_REG_MIPS_LO 33 | ||||
| #define KVM_REG_MIPS_PC 34 | ||||
| 
 | ||||
| /*
 | ||||
|  * KVM MIPS specific structures and definitions | ||||
|  * | ||||
|  */ | ||||
| struct kvm_debug_exit_arch { | ||||
| 	__u64 epc; | ||||
| }; | ||||
| 
 | ||||
| /* for KVM_SET_GUEST_DEBUG */ | ||||
| struct kvm_guest_debug_arch { | ||||
| }; | ||||
| 
 | ||||
| /* definition of registers in kvm_run */ | ||||
| struct kvm_sync_regs { | ||||
| }; | ||||
| 
 | ||||
| /* dummy definition */ | ||||
| struct kvm_sregs { | ||||
| }; | ||||
| 
 | ||||
| struct kvm_mips_interrupt { | ||||
| 	/* in */ | ||||
| 	__u32 cpu; | ||||
| 	__u32 irq; | ||||
| }; | ||||
| 
 | ||||
| /* definition of registers in kvm_run */ | ||||
| struct kvm_sync_regs { | ||||
| }; | ||||
| 
 | ||||
| #endif /* __LINUX_KVM_MIPS_H */ | ||||
|  |  | |||
|  | @ -22,16 +22,12 @@ | |||
| #define DSP_CONTROL	77 | ||||
| #define ACX		78 | ||||
| 
 | ||||
| #ifndef __KERNEL__ | ||||
| /*
 | ||||
|  * This struct defines the way the registers are stored on the stack during a | ||||
|  * system call/exception. As usual the registers k0/k1 aren't being saved. | ||||
|  */ | ||||
| struct pt_regs { | ||||
| #ifdef CONFIG_32BIT | ||||
| 	/* Pad bytes for argument save space on the stack. */ | ||||
| 	unsigned long pad0[6]; | ||||
| #endif | ||||
| 
 | ||||
| 	/* Saved main processor registers. */ | ||||
| 	unsigned long regs[32]; | ||||
| 
 | ||||
|  | @ -39,20 +35,11 @@ struct pt_regs { | |||
| 	unsigned long cp0_status; | ||||
| 	unsigned long hi; | ||||
| 	unsigned long lo; | ||||
| #ifdef CONFIG_CPU_HAS_SMARTMIPS | ||||
| 	unsigned long acx; | ||||
| #endif | ||||
| 	unsigned long cp0_badvaddr; | ||||
| 	unsigned long cp0_cause; | ||||
| 	unsigned long cp0_epc; | ||||
| #ifdef CONFIG_MIPS_MT_SMTC | ||||
| 	unsigned long cp0_tcstatus; | ||||
| #endif /* CONFIG_MIPS_MT_SMTC */ | ||||
| #ifdef CONFIG_CPU_CAVIUM_OCTEON | ||||
| 	unsigned long long mpl[3];	  /* MTM{0,1,2} */ | ||||
| 	unsigned long long mtp[3];	  /* MTP{0,1,2} */ | ||||
| #endif | ||||
| } __attribute__ ((aligned (8))); | ||||
| #endif /* __KERNEL__ */ | ||||
| 
 | ||||
| /* Arbitrarily choose the same ptrace numbers as used by the Sparc code. */ | ||||
| #define PTRACE_GETREGS		12 | ||||
|  |  | |||
|  | @ -119,4 +119,15 @@ MODULE_AUTHOR("Ralf Baechle (ralf@linux-mips.org)"); | |||
| #undef TASK_SIZE | ||||
| #define TASK_SIZE TASK_SIZE32 | ||||
| 
 | ||||
| #undef cputime_to_timeval | ||||
| #define cputime_to_timeval cputime_to_compat_timeval | ||||
| static __inline__ void | ||||
| cputime_to_compat_timeval(const cputime_t cputime, struct compat_timeval *value) | ||||
| { | ||||
| 	unsigned long jiffies = cputime_to_jiffies(cputime); | ||||
| 
 | ||||
| 	value->tv_usec = (jiffies % HZ) * (1000000L / HZ); | ||||
| 	value->tv_sec = jiffies / HZ; | ||||
| } | ||||
| 
 | ||||
| #include "../../../fs/binfmt_elf.c" | ||||
|  |  | |||
|  | @ -162,4 +162,15 @@ MODULE_AUTHOR("Ralf Baechle (ralf@linux-mips.org)"); | |||
| #undef TASK_SIZE | ||||
| #define TASK_SIZE TASK_SIZE32 | ||||
| 
 | ||||
| #undef cputime_to_timeval | ||||
| #define cputime_to_timeval cputime_to_compat_timeval | ||||
| static __inline__ void | ||||
| cputime_to_compat_timeval(const cputime_t cputime, struct compat_timeval *value) | ||||
| { | ||||
| 	unsigned long jiffies = cputime_to_jiffies(cputime); | ||||
| 
 | ||||
| 	value->tv_usec = (jiffies % HZ) * (1000000L / HZ); | ||||
| 	value->tv_sec = jiffies / HZ; | ||||
| } | ||||
| 
 | ||||
| #include "../../../fs/binfmt_elf.c" | ||||
|  |  | |||
|  | @ -40,6 +40,7 @@ | |||
| #include <asm/processor.h> | ||||
| #include <asm/vpe.h> | ||||
| #include <asm/rtlx.h> | ||||
| #include <asm/setup.h> | ||||
| 
 | ||||
| static struct rtlx_info *rtlx; | ||||
| static int major; | ||||
|  |  | |||
|  | @ -897,22 +897,24 @@ out_sigsegv: | |||
| 
 | ||||
| asmlinkage void do_tr(struct pt_regs *regs) | ||||
| { | ||||
| 	unsigned int opcode, tcode = 0; | ||||
| 	u32 opcode, tcode = 0; | ||||
| 	u16 instr[2]; | ||||
| 	unsigned long epc = exception_epc(regs); | ||||
| 	unsigned long epc = msk_isa16_mode(exception_epc(regs)); | ||||
| 
 | ||||
| 	if ((__get_user(instr[0], (u16 __user *)msk_isa16_mode(epc))) || | ||||
| 		(__get_user(instr[1], (u16 __user *)msk_isa16_mode(epc + 2)))) | ||||
| 	if (get_isa16_mode(regs->cp0_epc)) { | ||||
| 		if (__get_user(instr[0], (u16 __user *)(epc + 0)) || | ||||
| 		    __get_user(instr[1], (u16 __user *)(epc + 2))) | ||||
| 			goto out_sigsegv; | ||||
| 	opcode = (instr[0] << 16) | instr[1]; | ||||
| 
 | ||||
| 	/* Immediate versions don't provide a code.  */ | ||||
| 	if (!(opcode & OPCODE)) { | ||||
| 		if (get_isa16_mode(regs->cp0_epc)) | ||||
| 			/* microMIPS */ | ||||
| 			tcode = (opcode >> 12) & 0x1f; | ||||
| 		else | ||||
| 			tcode = ((opcode >> 6) & ((1 << 10) - 1)); | ||||
| 		opcode = (instr[0] << 16) | instr[1]; | ||||
| 		/* Immediate versions don't provide a code.  */ | ||||
| 		if (!(opcode & OPCODE)) | ||||
| 			tcode = (opcode >> 12) & ((1 << 4) - 1); | ||||
| 	} else { | ||||
| 		if (__get_user(opcode, (u32 __user *)epc)) | ||||
| 			goto out_sigsegv; | ||||
| 		/* Immediate versions don't provide a code.  */ | ||||
| 		if (!(opcode & OPCODE)) | ||||
| 			tcode = (opcode >> 6) & ((1 << 10) - 1); | ||||
| 	} | ||||
| 
 | ||||
| 	do_trap_or_bp(regs, tcode, "Trap"); | ||||
|  |  | |||
|  | @ -195,7 +195,7 @@ void kvm_arch_destroy_vm(struct kvm *kvm) | |||
| long | ||||
| kvm_arch_dev_ioctl(struct file *filp, unsigned int ioctl, unsigned long arg) | ||||
| { | ||||
| 	return -EINVAL; | ||||
| 	return -ENOIOCTLCMD; | ||||
| } | ||||
| 
 | ||||
| void kvm_arch_free_memslot(struct kvm_memory_slot *free, | ||||
|  | @ -401,7 +401,7 @@ int | |||
| kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu, | ||||
| 				    struct kvm_guest_debug *dbg) | ||||
| { | ||||
| 	return -EINVAL; | ||||
| 	return -ENOIOCTLCMD; | ||||
| } | ||||
| 
 | ||||
| int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run) | ||||
|  | @ -475,14 +475,223 @@ int | |||
| kvm_arch_vcpu_ioctl_get_mpstate(struct kvm_vcpu *vcpu, | ||||
| 				struct kvm_mp_state *mp_state) | ||||
| { | ||||
| 	return -EINVAL; | ||||
| 	return -ENOIOCTLCMD; | ||||
| } | ||||
| 
 | ||||
| int | ||||
| kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu, | ||||
| 				struct kvm_mp_state *mp_state) | ||||
| { | ||||
| 	return -EINVAL; | ||||
| 	return -ENOIOCTLCMD; | ||||
| } | ||||
| 
 | ||||
| #define KVM_REG_MIPS_CP0_INDEX (0x10000 + 8 * 0 + 0) | ||||
| #define KVM_REG_MIPS_CP0_ENTRYLO0 (0x10000 + 8 * 2 + 0) | ||||
| #define KVM_REG_MIPS_CP0_ENTRYLO1 (0x10000 + 8 * 3 + 0) | ||||
| #define KVM_REG_MIPS_CP0_CONTEXT (0x10000 + 8 * 4 + 0) | ||||
| #define KVM_REG_MIPS_CP0_USERLOCAL (0x10000 + 8 * 4 + 2) | ||||
| #define KVM_REG_MIPS_CP0_PAGEMASK (0x10000 + 8 * 5 + 0) | ||||
| #define KVM_REG_MIPS_CP0_PAGEGRAIN (0x10000 + 8 * 5 + 1) | ||||
| #define KVM_REG_MIPS_CP0_WIRED (0x10000 + 8 * 6 + 0) | ||||
| #define KVM_REG_MIPS_CP0_HWRENA (0x10000 + 8 * 7 + 0) | ||||
| #define KVM_REG_MIPS_CP0_BADVADDR (0x10000 + 8 * 8 + 0) | ||||
| #define KVM_REG_MIPS_CP0_COUNT (0x10000 + 8 * 9 + 0) | ||||
| #define KVM_REG_MIPS_CP0_ENTRYHI (0x10000 + 8 * 10 + 0) | ||||
| #define KVM_REG_MIPS_CP0_COMPARE (0x10000 + 8 * 11 + 0) | ||||
| #define KVM_REG_MIPS_CP0_STATUS (0x10000 + 8 * 12 + 0) | ||||
| #define KVM_REG_MIPS_CP0_CAUSE (0x10000 + 8 * 13 + 0) | ||||
| #define KVM_REG_MIPS_CP0_EBASE (0x10000 + 8 * 15 + 1) | ||||
| #define KVM_REG_MIPS_CP0_CONFIG (0x10000 + 8 * 16 + 0) | ||||
| #define KVM_REG_MIPS_CP0_CONFIG1 (0x10000 + 8 * 16 + 1) | ||||
| #define KVM_REG_MIPS_CP0_CONFIG2 (0x10000 + 8 * 16 + 2) | ||||
| #define KVM_REG_MIPS_CP0_CONFIG3 (0x10000 + 8 * 16 + 3) | ||||
| #define KVM_REG_MIPS_CP0_CONFIG7 (0x10000 + 8 * 16 + 7) | ||||
| #define KVM_REG_MIPS_CP0_XCONTEXT (0x10000 + 8 * 20 + 0) | ||||
| #define KVM_REG_MIPS_CP0_ERROREPC (0x10000 + 8 * 30 + 0) | ||||
| 
 | ||||
| static u64 kvm_mips_get_one_regs[] = { | ||||
| 	KVM_REG_MIPS_R0, | ||||
| 	KVM_REG_MIPS_R1, | ||||
| 	KVM_REG_MIPS_R2, | ||||
| 	KVM_REG_MIPS_R3, | ||||
| 	KVM_REG_MIPS_R4, | ||||
| 	KVM_REG_MIPS_R5, | ||||
| 	KVM_REG_MIPS_R6, | ||||
| 	KVM_REG_MIPS_R7, | ||||
| 	KVM_REG_MIPS_R8, | ||||
| 	KVM_REG_MIPS_R9, | ||||
| 	KVM_REG_MIPS_R10, | ||||
| 	KVM_REG_MIPS_R11, | ||||
| 	KVM_REG_MIPS_R12, | ||||
| 	KVM_REG_MIPS_R13, | ||||
| 	KVM_REG_MIPS_R14, | ||||
| 	KVM_REG_MIPS_R15, | ||||
| 	KVM_REG_MIPS_R16, | ||||
| 	KVM_REG_MIPS_R17, | ||||
| 	KVM_REG_MIPS_R18, | ||||
| 	KVM_REG_MIPS_R19, | ||||
| 	KVM_REG_MIPS_R20, | ||||
| 	KVM_REG_MIPS_R21, | ||||
| 	KVM_REG_MIPS_R22, | ||||
| 	KVM_REG_MIPS_R23, | ||||
| 	KVM_REG_MIPS_R24, | ||||
| 	KVM_REG_MIPS_R25, | ||||
| 	KVM_REG_MIPS_R26, | ||||
| 	KVM_REG_MIPS_R27, | ||||
| 	KVM_REG_MIPS_R28, | ||||
| 	KVM_REG_MIPS_R29, | ||||
| 	KVM_REG_MIPS_R30, | ||||
| 	KVM_REG_MIPS_R31, | ||||
| 
 | ||||
| 	KVM_REG_MIPS_HI, | ||||
| 	KVM_REG_MIPS_LO, | ||||
| 	KVM_REG_MIPS_PC, | ||||
| 
 | ||||
| 	KVM_REG_MIPS_CP0_INDEX, | ||||
| 	KVM_REG_MIPS_CP0_CONTEXT, | ||||
| 	KVM_REG_MIPS_CP0_PAGEMASK, | ||||
| 	KVM_REG_MIPS_CP0_WIRED, | ||||
| 	KVM_REG_MIPS_CP0_BADVADDR, | ||||
| 	KVM_REG_MIPS_CP0_ENTRYHI, | ||||
| 	KVM_REG_MIPS_CP0_STATUS, | ||||
| 	KVM_REG_MIPS_CP0_CAUSE, | ||||
| 	/* EPC set via kvm_regs, et al. */ | ||||
| 	KVM_REG_MIPS_CP0_CONFIG, | ||||
| 	KVM_REG_MIPS_CP0_CONFIG1, | ||||
| 	KVM_REG_MIPS_CP0_CONFIG2, | ||||
| 	KVM_REG_MIPS_CP0_CONFIG3, | ||||
| 	KVM_REG_MIPS_CP0_CONFIG7, | ||||
| 	KVM_REG_MIPS_CP0_ERROREPC | ||||
| }; | ||||
| 
 | ||||
| static int kvm_mips_get_reg(struct kvm_vcpu *vcpu, | ||||
| 			    const struct kvm_one_reg *reg) | ||||
| { | ||||
| 	u64 __user *uaddr = (u64 __user *)(long)reg->addr; | ||||
| 
 | ||||
| 	struct mips_coproc *cop0 = vcpu->arch.cop0; | ||||
| 	s64 v; | ||||
| 
 | ||||
| 	switch (reg->id) { | ||||
| 	case KVM_REG_MIPS_R0 ... KVM_REG_MIPS_R31: | ||||
| 		v = (long)vcpu->arch.gprs[reg->id - KVM_REG_MIPS_R0]; | ||||
| 		break; | ||||
| 	case KVM_REG_MIPS_HI: | ||||
| 		v = (long)vcpu->arch.hi; | ||||
| 		break; | ||||
| 	case KVM_REG_MIPS_LO: | ||||
| 		v = (long)vcpu->arch.lo; | ||||
| 		break; | ||||
| 	case KVM_REG_MIPS_PC: | ||||
| 		v = (long)vcpu->arch.pc; | ||||
| 		break; | ||||
| 
 | ||||
| 	case KVM_REG_MIPS_CP0_INDEX: | ||||
| 		v = (long)kvm_read_c0_guest_index(cop0); | ||||
| 		break; | ||||
| 	case KVM_REG_MIPS_CP0_CONTEXT: | ||||
| 		v = (long)kvm_read_c0_guest_context(cop0); | ||||
| 		break; | ||||
| 	case KVM_REG_MIPS_CP0_PAGEMASK: | ||||
| 		v = (long)kvm_read_c0_guest_pagemask(cop0); | ||||
| 		break; | ||||
| 	case KVM_REG_MIPS_CP0_WIRED: | ||||
| 		v = (long)kvm_read_c0_guest_wired(cop0); | ||||
| 		break; | ||||
| 	case KVM_REG_MIPS_CP0_BADVADDR: | ||||
| 		v = (long)kvm_read_c0_guest_badvaddr(cop0); | ||||
| 		break; | ||||
| 	case KVM_REG_MIPS_CP0_ENTRYHI: | ||||
| 		v = (long)kvm_read_c0_guest_entryhi(cop0); | ||||
| 		break; | ||||
| 	case KVM_REG_MIPS_CP0_STATUS: | ||||
| 		v = (long)kvm_read_c0_guest_status(cop0); | ||||
| 		break; | ||||
| 	case KVM_REG_MIPS_CP0_CAUSE: | ||||
| 		v = (long)kvm_read_c0_guest_cause(cop0); | ||||
| 		break; | ||||
| 	case KVM_REG_MIPS_CP0_ERROREPC: | ||||
| 		v = (long)kvm_read_c0_guest_errorepc(cop0); | ||||
| 		break; | ||||
| 	case KVM_REG_MIPS_CP0_CONFIG: | ||||
| 		v = (long)kvm_read_c0_guest_config(cop0); | ||||
| 		break; | ||||
| 	case KVM_REG_MIPS_CP0_CONFIG1: | ||||
| 		v = (long)kvm_read_c0_guest_config1(cop0); | ||||
| 		break; | ||||
| 	case KVM_REG_MIPS_CP0_CONFIG2: | ||||
| 		v = (long)kvm_read_c0_guest_config2(cop0); | ||||
| 		break; | ||||
| 	case KVM_REG_MIPS_CP0_CONFIG3: | ||||
| 		v = (long)kvm_read_c0_guest_config3(cop0); | ||||
| 		break; | ||||
| 	case KVM_REG_MIPS_CP0_CONFIG7: | ||||
| 		v = (long)kvm_read_c0_guest_config7(cop0); | ||||
| 		break; | ||||
| 	default: | ||||
| 		return -EINVAL; | ||||
| 	} | ||||
| 	return put_user(v, uaddr); | ||||
| } | ||||
| 
 | ||||
| static int kvm_mips_set_reg(struct kvm_vcpu *vcpu, | ||||
| 			    const struct kvm_one_reg *reg) | ||||
| { | ||||
| 	u64 __user *uaddr = (u64 __user *)(long)reg->addr; | ||||
| 	struct mips_coproc *cop0 = vcpu->arch.cop0; | ||||
| 	u64 v; | ||||
| 
 | ||||
| 	if (get_user(v, uaddr) != 0) | ||||
| 		return -EFAULT; | ||||
| 
 | ||||
| 	switch (reg->id) { | ||||
| 	case KVM_REG_MIPS_R0: | ||||
| 		/* Silently ignore requests to set $0 */ | ||||
| 		break; | ||||
| 	case KVM_REG_MIPS_R1 ... KVM_REG_MIPS_R31: | ||||
| 		vcpu->arch.gprs[reg->id - KVM_REG_MIPS_R0] = v; | ||||
| 		break; | ||||
| 	case KVM_REG_MIPS_HI: | ||||
| 		vcpu->arch.hi = v; | ||||
| 		break; | ||||
| 	case KVM_REG_MIPS_LO: | ||||
| 		vcpu->arch.lo = v; | ||||
| 		break; | ||||
| 	case KVM_REG_MIPS_PC: | ||||
| 		vcpu->arch.pc = v; | ||||
| 		break; | ||||
| 
 | ||||
| 	case KVM_REG_MIPS_CP0_INDEX: | ||||
| 		kvm_write_c0_guest_index(cop0, v); | ||||
| 		break; | ||||
| 	case KVM_REG_MIPS_CP0_CONTEXT: | ||||
| 		kvm_write_c0_guest_context(cop0, v); | ||||
| 		break; | ||||
| 	case KVM_REG_MIPS_CP0_PAGEMASK: | ||||
| 		kvm_write_c0_guest_pagemask(cop0, v); | ||||
| 		break; | ||||
| 	case KVM_REG_MIPS_CP0_WIRED: | ||||
| 		kvm_write_c0_guest_wired(cop0, v); | ||||
| 		break; | ||||
| 	case KVM_REG_MIPS_CP0_BADVADDR: | ||||
| 		kvm_write_c0_guest_badvaddr(cop0, v); | ||||
| 		break; | ||||
| 	case KVM_REG_MIPS_CP0_ENTRYHI: | ||||
| 		kvm_write_c0_guest_entryhi(cop0, v); | ||||
| 		break; | ||||
| 	case KVM_REG_MIPS_CP0_STATUS: | ||||
| 		kvm_write_c0_guest_status(cop0, v); | ||||
| 		break; | ||||
| 	case KVM_REG_MIPS_CP0_CAUSE: | ||||
| 		kvm_write_c0_guest_cause(cop0, v); | ||||
| 		break; | ||||
| 	case KVM_REG_MIPS_CP0_ERROREPC: | ||||
| 		kvm_write_c0_guest_errorepc(cop0, v); | ||||
| 		break; | ||||
| 	default: | ||||
| 		return -EINVAL; | ||||
| 	} | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| long | ||||
|  | @ -491,9 +700,38 @@ kvm_arch_vcpu_ioctl(struct file *filp, unsigned int ioctl, unsigned long arg) | |||
| 	struct kvm_vcpu *vcpu = filp->private_data; | ||||
| 	void __user *argp = (void __user *)arg; | ||||
| 	long r; | ||||
| 	int intr; | ||||
| 
 | ||||
| 	switch (ioctl) { | ||||
| 	case KVM_SET_ONE_REG: | ||||
| 	case KVM_GET_ONE_REG: { | ||||
| 		struct kvm_one_reg reg; | ||||
| 		if (copy_from_user(®, argp, sizeof(reg))) | ||||
| 			return -EFAULT; | ||||
| 		if (ioctl == KVM_SET_ONE_REG) | ||||
| 			return kvm_mips_set_reg(vcpu, ®); | ||||
| 		else | ||||
| 			return kvm_mips_get_reg(vcpu, ®); | ||||
| 	} | ||||
| 	case KVM_GET_REG_LIST: { | ||||
| 		struct kvm_reg_list __user *user_list = argp; | ||||
| 		u64 __user *reg_dest; | ||||
| 		struct kvm_reg_list reg_list; | ||||
| 		unsigned n; | ||||
| 
 | ||||
| 		if (copy_from_user(®_list, user_list, sizeof(reg_list))) | ||||
| 			return -EFAULT; | ||||
| 		n = reg_list.n; | ||||
| 		reg_list.n = ARRAY_SIZE(kvm_mips_get_one_regs); | ||||
| 		if (copy_to_user(user_list, ®_list, sizeof(reg_list))) | ||||
| 			return -EFAULT; | ||||
| 		if (n < reg_list.n) | ||||
| 			return -E2BIG; | ||||
| 		reg_dest = user_list->reg; | ||||
| 		if (copy_to_user(reg_dest, kvm_mips_get_one_regs, | ||||
| 				 sizeof(kvm_mips_get_one_regs))) | ||||
| 			return -EFAULT; | ||||
| 		return 0; | ||||
| 	} | ||||
| 	case KVM_NMI: | ||||
| 		/* Treat the NMI as a CPU reset */ | ||||
| 		r = kvm_mips_reset_vcpu(vcpu); | ||||
|  | @ -505,8 +743,6 @@ kvm_arch_vcpu_ioctl(struct file *filp, unsigned int ioctl, unsigned long arg) | |||
| 			if (copy_from_user(&irq, argp, sizeof(irq))) | ||||
| 				goto out; | ||||
| 
 | ||||
| 			intr = (int)irq.irq; | ||||
| 
 | ||||
| 			kvm_debug("[%d] %s: irq: %d\n", vcpu->vcpu_id, __func__, | ||||
| 				  irq.irq); | ||||
| 
 | ||||
|  | @ -514,7 +750,7 @@ kvm_arch_vcpu_ioctl(struct file *filp, unsigned int ioctl, unsigned long arg) | |||
| 			break; | ||||
| 		} | ||||
| 	default: | ||||
| 		r = -EINVAL; | ||||
| 		r = -ENOIOCTLCMD; | ||||
| 	} | ||||
| 
 | ||||
| out: | ||||
|  | @ -565,7 +801,7 @@ long kvm_arch_vm_ioctl(struct file *filp, unsigned int ioctl, unsigned long arg) | |||
| 
 | ||||
| 	switch (ioctl) { | ||||
| 	default: | ||||
| 		r = -EINVAL; | ||||
| 		r = -ENOIOCTLCMD; | ||||
| 	} | ||||
| 
 | ||||
| 	return r; | ||||
|  | @ -593,13 +829,13 @@ void kvm_arch_exit(void) | |||
| int | ||||
| kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu, struct kvm_sregs *sregs) | ||||
| { | ||||
| 	return -ENOTSUPP; | ||||
| 	return -ENOIOCTLCMD; | ||||
| } | ||||
| 
 | ||||
| int | ||||
| kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu, struct kvm_sregs *sregs) | ||||
| { | ||||
| 	return -ENOTSUPP; | ||||
| 	return -ENOIOCTLCMD; | ||||
| } | ||||
| 
 | ||||
| int kvm_arch_vcpu_postcreate(struct kvm_vcpu *vcpu) | ||||
|  | @ -609,12 +845,12 @@ int kvm_arch_vcpu_postcreate(struct kvm_vcpu *vcpu) | |||
| 
 | ||||
| int kvm_arch_vcpu_ioctl_get_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu) | ||||
| { | ||||
| 	return -ENOTSUPP; | ||||
| 	return -ENOIOCTLCMD; | ||||
| } | ||||
| 
 | ||||
| int kvm_arch_vcpu_ioctl_set_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu) | ||||
| { | ||||
| 	return -ENOTSUPP; | ||||
| 	return -ENOIOCTLCMD; | ||||
| } | ||||
| 
 | ||||
| int kvm_arch_vcpu_fault(struct kvm_vcpu *vcpu, struct vm_fault *vmf) | ||||
|  | @ -627,6 +863,9 @@ int kvm_dev_ioctl_check_extension(long ext) | |||
| 	int r; | ||||
| 
 | ||||
| 	switch (ext) { | ||||
| 	case KVM_CAP_ONE_REG: | ||||
| 		r = 1; | ||||
| 		break; | ||||
| 	case KVM_CAP_COALESCED_MMIO: | ||||
| 		r = KVM_COALESCED_MMIO_PAGE_OFFSET; | ||||
| 		break; | ||||
|  | @ -635,7 +874,6 @@ int kvm_dev_ioctl_check_extension(long ext) | |||
| 		break; | ||||
| 	} | ||||
| 	return r; | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu) | ||||
|  | @ -677,28 +915,28 @@ int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs) | |||
| { | ||||
| 	int i; | ||||
| 
 | ||||
| 	for (i = 0; i < 32; i++) | ||||
| 		vcpu->arch.gprs[i] = regs->gprs[i]; | ||||
| 
 | ||||
| 	for (i = 1; i < ARRAY_SIZE(vcpu->arch.gprs); i++) | ||||
| 		vcpu->arch.gprs[i] = regs->gpr[i]; | ||||
| 	vcpu->arch.gprs[0] = 0; /* zero is special, and cannot be set. */ | ||||
| 	vcpu->arch.hi = regs->hi; | ||||
| 	vcpu->arch.lo = regs->lo; | ||||
| 	vcpu->arch.pc = regs->pc; | ||||
| 
 | ||||
| 	return kvm_mips_callbacks->vcpu_ioctl_set_regs(vcpu, regs); | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs) | ||||
| { | ||||
| 	int i; | ||||
| 
 | ||||
| 	for (i = 0; i < 32; i++) | ||||
| 		regs->gprs[i] = vcpu->arch.gprs[i]; | ||||
| 	for (i = 0; i < ARRAY_SIZE(vcpu->arch.gprs); i++) | ||||
| 		regs->gpr[i] = vcpu->arch.gprs[i]; | ||||
| 
 | ||||
| 	regs->hi = vcpu->arch.hi; | ||||
| 	regs->lo = vcpu->arch.lo; | ||||
| 	regs->pc = vcpu->arch.pc; | ||||
| 
 | ||||
| 	return kvm_mips_callbacks->vcpu_ioctl_get_regs(vcpu, regs); | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| void kvm_mips_comparecount_func(unsigned long data) | ||||
|  |  | |||
|  | @ -345,54 +345,6 @@ static int kvm_trap_emul_handle_break(struct kvm_vcpu *vcpu) | |||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| static int | ||||
| kvm_trap_emul_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs) | ||||
| { | ||||
| 	struct mips_coproc *cop0 = vcpu->arch.cop0; | ||||
| 
 | ||||
| 	kvm_write_c0_guest_index(cop0, regs->cp0reg[MIPS_CP0_TLB_INDEX][0]); | ||||
| 	kvm_write_c0_guest_context(cop0, regs->cp0reg[MIPS_CP0_TLB_CONTEXT][0]); | ||||
| 	kvm_write_c0_guest_badvaddr(cop0, regs->cp0reg[MIPS_CP0_BAD_VADDR][0]); | ||||
| 	kvm_write_c0_guest_entryhi(cop0, regs->cp0reg[MIPS_CP0_TLB_HI][0]); | ||||
| 	kvm_write_c0_guest_epc(cop0, regs->cp0reg[MIPS_CP0_EXC_PC][0]); | ||||
| 
 | ||||
| 	kvm_write_c0_guest_status(cop0, regs->cp0reg[MIPS_CP0_STATUS][0]); | ||||
| 	kvm_write_c0_guest_cause(cop0, regs->cp0reg[MIPS_CP0_CAUSE][0]); | ||||
| 	kvm_write_c0_guest_pagemask(cop0, | ||||
| 				    regs->cp0reg[MIPS_CP0_TLB_PG_MASK][0]); | ||||
| 	kvm_write_c0_guest_wired(cop0, regs->cp0reg[MIPS_CP0_TLB_WIRED][0]); | ||||
| 	kvm_write_c0_guest_errorepc(cop0, regs->cp0reg[MIPS_CP0_ERROR_PC][0]); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int | ||||
| kvm_trap_emul_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs) | ||||
| { | ||||
| 	struct mips_coproc *cop0 = vcpu->arch.cop0; | ||||
| 
 | ||||
| 	regs->cp0reg[MIPS_CP0_TLB_INDEX][0] = kvm_read_c0_guest_index(cop0); | ||||
| 	regs->cp0reg[MIPS_CP0_TLB_CONTEXT][0] = kvm_read_c0_guest_context(cop0); | ||||
| 	regs->cp0reg[MIPS_CP0_BAD_VADDR][0] = kvm_read_c0_guest_badvaddr(cop0); | ||||
| 	regs->cp0reg[MIPS_CP0_TLB_HI][0] = kvm_read_c0_guest_entryhi(cop0); | ||||
| 	regs->cp0reg[MIPS_CP0_EXC_PC][0] = kvm_read_c0_guest_epc(cop0); | ||||
| 
 | ||||
| 	regs->cp0reg[MIPS_CP0_STATUS][0] = kvm_read_c0_guest_status(cop0); | ||||
| 	regs->cp0reg[MIPS_CP0_CAUSE][0] = kvm_read_c0_guest_cause(cop0); | ||||
| 	regs->cp0reg[MIPS_CP0_TLB_PG_MASK][0] = | ||||
| 	    kvm_read_c0_guest_pagemask(cop0); | ||||
| 	regs->cp0reg[MIPS_CP0_TLB_WIRED][0] = kvm_read_c0_guest_wired(cop0); | ||||
| 	regs->cp0reg[MIPS_CP0_ERROR_PC][0] = kvm_read_c0_guest_errorepc(cop0); | ||||
| 
 | ||||
| 	regs->cp0reg[MIPS_CP0_CONFIG][0] = kvm_read_c0_guest_config(cop0); | ||||
| 	regs->cp0reg[MIPS_CP0_CONFIG][1] = kvm_read_c0_guest_config1(cop0); | ||||
| 	regs->cp0reg[MIPS_CP0_CONFIG][2] = kvm_read_c0_guest_config2(cop0); | ||||
| 	regs->cp0reg[MIPS_CP0_CONFIG][3] = kvm_read_c0_guest_config3(cop0); | ||||
| 	regs->cp0reg[MIPS_CP0_CONFIG][7] = kvm_read_c0_guest_config7(cop0); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int kvm_trap_emul_vm_init(struct kvm *kvm) | ||||
| { | ||||
| 	return 0; | ||||
|  | @ -471,8 +423,6 @@ static struct kvm_mips_callbacks kvm_trap_emul_callbacks = { | |||
| 	.dequeue_io_int = kvm_mips_dequeue_io_int_cb, | ||||
| 	.irq_deliver = kvm_mips_irq_deliver_cb, | ||||
| 	.irq_clear = kvm_mips_irq_clear_cb, | ||||
| 	.vcpu_ioctl_get_regs = kvm_trap_emul_ioctl_get_regs, | ||||
| 	.vcpu_ioctl_set_regs = kvm_trap_emul_ioctl_set_regs, | ||||
| }; | ||||
| 
 | ||||
| int kvm_mips_emulation_init(struct kvm_mips_callbacks **install_callbacks) | ||||
|  |  | |||
|  | @ -301,10 +301,6 @@ static u32 tlb_handler[128] __cpuinitdata; | |||
| static struct uasm_label labels[128] __cpuinitdata; | ||||
| static struct uasm_reloc relocs[128] __cpuinitdata; | ||||
| 
 | ||||
| #ifdef CONFIG_64BIT | ||||
| static int check_for_high_segbits __cpuinitdata; | ||||
| #endif | ||||
| 
 | ||||
| static int check_for_high_segbits __cpuinitdata; | ||||
| 
 | ||||
| static unsigned int kscratch_used_mask __cpuinitdata; | ||||
|  |  | |||
|  | @ -88,7 +88,7 @@ void __init plat_mem_setup(void) | |||
| 	__dt_setup_arch(&__dtb_start); | ||||
| 
 | ||||
| 	if (soc_info.mem_size) | ||||
| 		add_memory_region(soc_info.mem_base, soc_info.mem_size, | ||||
| 		add_memory_region(soc_info.mem_base, soc_info.mem_size * SZ_1M, | ||||
| 				  BOOT_MEM_RAM); | ||||
| 	else | ||||
| 		detect_memory_region(soc_info.mem_base, | ||||
|  |  | |||
|  | @ -212,7 +212,9 @@ appldata_timer_handler(ctl_table *ctl, int write, | |||
| 		return 0; | ||||
| 	} | ||||
| 	if (!write) { | ||||
| 		len = sprintf(buf, appldata_timer_active ? "1\n" : "0\n"); | ||||
| 		strncpy(buf, appldata_timer_active ? "1\n" : "0\n", | ||||
| 			ARRAY_SIZE(buf)); | ||||
| 		len = strnlen(buf, ARRAY_SIZE(buf)); | ||||
| 		if (len > *lenp) | ||||
| 			len = *lenp; | ||||
| 		if (copy_to_user(buffer, buf, len)) | ||||
|  | @ -317,7 +319,8 @@ appldata_generic_handler(ctl_table *ctl, int write, | |||
| 		return 0; | ||||
| 	} | ||||
| 	if (!write) { | ||||
| 		len = sprintf(buf, ops->active ? "1\n" : "0\n"); | ||||
| 		strncpy(buf, ops->active ? "1\n" : "0\n", ARRAY_SIZE(buf)); | ||||
| 		len = strnlen(buf, ARRAY_SIZE(buf)); | ||||
| 		if (len > *lenp) | ||||
| 			len = *lenp; | ||||
| 		if (copy_to_user(buffer, buf, len)) { | ||||
|  |  | |||
|  | @ -71,8 +71,8 @@ static inline void dma_free_coherent(struct device *dev, size_t size, | |||
| { | ||||
| 	struct dma_map_ops *dma_ops = get_dma_ops(dev); | ||||
| 
 | ||||
| 	dma_ops->free(dev, size, cpu_addr, dma_handle, NULL); | ||||
| 	debug_dma_free_coherent(dev, size, cpu_addr, dma_handle); | ||||
| 	dma_ops->free(dev, size, cpu_addr, dma_handle, NULL); | ||||
| } | ||||
| 
 | ||||
| #endif /* _ASM_S390_DMA_MAPPING_H */ | ||||
|  |  | |||
|  | @ -36,6 +36,7 @@ static inline void * phys_to_virt(unsigned long address) | |||
| } | ||||
| 
 | ||||
| void *xlate_dev_mem_ptr(unsigned long phys); | ||||
| #define xlate_dev_mem_ptr xlate_dev_mem_ptr | ||||
| void unxlate_dev_mem_ptr(unsigned long phys, void *addr); | ||||
| 
 | ||||
| /*
 | ||||
|  |  | |||
|  | @ -646,7 +646,7 @@ static inline pgste_t pgste_update_all(pte_t *ptep, pgste_t pgste) | |||
| 	unsigned long address, bits; | ||||
| 	unsigned char skey; | ||||
| 
 | ||||
| 	if (!pte_present(*ptep)) | ||||
| 	if (pte_val(*ptep) & _PAGE_INVALID) | ||||
| 		return pgste; | ||||
| 	address = pte_val(*ptep) & PAGE_MASK; | ||||
| 	skey = page_get_storage_key(address); | ||||
|  | @ -680,7 +680,7 @@ static inline pgste_t pgste_update_young(pte_t *ptep, pgste_t pgste) | |||
| #ifdef CONFIG_PGSTE | ||||
| 	int young; | ||||
| 
 | ||||
| 	if (!pte_present(*ptep)) | ||||
| 	if (pte_val(*ptep) & _PAGE_INVALID) | ||||
| 		return pgste; | ||||
| 	/* Get referenced bit from storage key */ | ||||
| 	young = page_reset_referenced(pte_val(*ptep) & PAGE_MASK); | ||||
|  | @ -706,7 +706,7 @@ static inline void pgste_set_key(pte_t *ptep, pgste_t pgste, pte_t entry) | |||
| 	unsigned long address; | ||||
| 	unsigned long okey, nkey; | ||||
| 
 | ||||
| 	if (!pte_present(entry)) | ||||
| 	if (pte_val(entry) & _PAGE_INVALID) | ||||
| 		return; | ||||
| 	address = pte_val(entry) & PAGE_MASK; | ||||
| 	okey = nkey = page_get_storage_key(address); | ||||
|  | @ -1098,6 +1098,9 @@ static inline pte_t ptep_modify_prot_start(struct mm_struct *mm, | |||
| 	pte = *ptep; | ||||
| 	if (!mm_exclusive(mm)) | ||||
| 		__ptep_ipte(address, ptep); | ||||
| 
 | ||||
| 	if (mm_has_pgste(mm)) | ||||
| 		pgste = pgste_update_all(&pte, pgste); | ||||
| 	return pte; | ||||
| } | ||||
| 
 | ||||
|  | @ -1105,9 +1108,13 @@ static inline void ptep_modify_prot_commit(struct mm_struct *mm, | |||
| 					   unsigned long address, | ||||
| 					   pte_t *ptep, pte_t pte) | ||||
| { | ||||
| 	pgste_t pgste; | ||||
| 
 | ||||
| 	if (mm_has_pgste(mm)) { | ||||
| 		pgste = *(pgste_t *)(ptep + PTRS_PER_PTE); | ||||
| 		pgste_set_key(ptep, pgste, pte); | ||||
| 		pgste_set_pte(ptep, pte); | ||||
| 		pgste_set_unlock(ptep, *(pgste_t *)(ptep + PTRS_PER_PTE)); | ||||
| 		pgste_set_unlock(ptep, pgste); | ||||
| 	} else | ||||
| 		*ptep = pte; | ||||
| } | ||||
|  |  | |||
|  | @ -428,34 +428,27 @@ void smp_stop_cpu(void) | |||
|  * This is the main routine where commands issued by other | ||||
|  * cpus are handled. | ||||
|  */ | ||||
| static void smp_handle_ext_call(void) | ||||
| { | ||||
| 	unsigned long bits; | ||||
| 
 | ||||
| 	/* handle bit signal external calls */ | ||||
| 	bits = xchg(&pcpu_devices[smp_processor_id()].ec_mask, 0); | ||||
| 	if (test_bit(ec_stop_cpu, &bits)) | ||||
| 		smp_stop_cpu(); | ||||
| 	if (test_bit(ec_schedule, &bits)) | ||||
| 		scheduler_ipi(); | ||||
| 	if (test_bit(ec_call_function, &bits)) | ||||
| 		generic_smp_call_function_interrupt(); | ||||
| 	if (test_bit(ec_call_function_single, &bits)) | ||||
| 		generic_smp_call_function_single_interrupt(); | ||||
| } | ||||
| 
 | ||||
| static void do_ext_call_interrupt(struct ext_code ext_code, | ||||
| 				  unsigned int param32, unsigned long param64) | ||||
| { | ||||
| 	unsigned long bits; | ||||
| 	int cpu; | ||||
| 
 | ||||
| 	cpu = smp_processor_id(); | ||||
| 	if (ext_code.code == 0x1202) | ||||
| 		inc_irq_stat(IRQEXT_EXC); | ||||
| 	else | ||||
| 		inc_irq_stat(IRQEXT_EMS); | ||||
| 	/*
 | ||||
| 	 * handle bit signal external calls | ||||
| 	 */ | ||||
| 	bits = xchg(&pcpu_devices[cpu].ec_mask, 0); | ||||
| 
 | ||||
| 	if (test_bit(ec_stop_cpu, &bits)) | ||||
| 		smp_stop_cpu(); | ||||
| 
 | ||||
| 	if (test_bit(ec_schedule, &bits)) | ||||
| 		scheduler_ipi(); | ||||
| 
 | ||||
| 	if (test_bit(ec_call_function, &bits)) | ||||
| 		generic_smp_call_function_interrupt(); | ||||
| 
 | ||||
| 	if (test_bit(ec_call_function_single, &bits)) | ||||
| 		generic_smp_call_function_single_interrupt(); | ||||
| 
 | ||||
| 	inc_irq_stat(ext_code.code == 0x1202 ? IRQEXT_EXC : IRQEXT_EMS); | ||||
| 	smp_handle_ext_call(); | ||||
| } | ||||
| 
 | ||||
| void arch_send_call_function_ipi_mask(const struct cpumask *mask) | ||||
|  | @ -760,6 +753,8 @@ int __cpu_disable(void) | |||
| { | ||||
| 	unsigned long cregs[16]; | ||||
| 
 | ||||
| 	/* Handle possible pending IPIs */ | ||||
| 	smp_handle_ext_call(); | ||||
| 	set_cpu_online(smp_processor_id(), false); | ||||
| 	/* Disable pseudo page faults on this cpu. */ | ||||
| 	pfault_fini(); | ||||
|  |  | |||
|  | @ -492,7 +492,7 @@ static int gmap_connect_pgtable(unsigned long address, unsigned long segment, | |||
| 	mp = (struct gmap_pgtable *) page->index; | ||||
| 	rmap->gmap = gmap; | ||||
| 	rmap->entry = segment_ptr; | ||||
| 	rmap->vmaddr = address; | ||||
| 	rmap->vmaddr = address & PMD_MASK; | ||||
| 	spin_lock(&mm->page_table_lock); | ||||
| 	if (*segment_ptr == segment) { | ||||
| 		list_add(&rmap->list, &mp->mapper); | ||||
|  |  | |||
|  | @ -1240,9 +1240,12 @@ static int decode_modrm(struct x86_emulate_ctxt *ctxt, | |||
| 	ctxt->modrm_seg = VCPU_SREG_DS; | ||||
| 
 | ||||
| 	if (ctxt->modrm_mod == 3) { | ||||
| 		int highbyte_regs = ctxt->rex_prefix == 0; | ||||
| 
 | ||||
| 		op->type = OP_REG; | ||||
| 		op->bytes = (ctxt->d & ByteOp) ? 1 : ctxt->op_bytes; | ||||
| 		op->addr.reg = decode_register(ctxt, ctxt->modrm_rm, ctxt->d & ByteOp); | ||||
| 		op->addr.reg = decode_register(ctxt, ctxt->modrm_rm, | ||||
| 					       highbyte_regs && (ctxt->d & ByteOp)); | ||||
| 		if (ctxt->d & Sse) { | ||||
| 			op->type = OP_XMM; | ||||
| 			op->bytes = 16; | ||||
|  | @ -3997,7 +4000,8 @@ static const struct opcode twobyte_table[256] = { | |||
| 	DI(ImplicitOps | Priv, invd), DI(ImplicitOps | Priv, wbinvd), N, N, | ||||
| 	N, D(ImplicitOps | ModRM), N, N, | ||||
| 	/* 0x10 - 0x1F */ | ||||
| 	N, N, N, N, N, N, N, N, D(ImplicitOps | ModRM), N, N, N, N, N, N, N, | ||||
| 	N, N, N, N, N, N, N, N, | ||||
| 	D(ImplicitOps | ModRM), N, N, N, N, N, N, D(ImplicitOps | ModRM), | ||||
| 	/* 0x20 - 0x2F */ | ||||
| 	DIP(ModRM | DstMem | Priv | Op3264, cr_read, check_cr_read), | ||||
| 	DIP(ModRM | DstMem | Priv | Op3264, dr_read, check_dr_read), | ||||
|  | @ -4836,6 +4840,7 @@ twobyte_insn: | |||
| 	case 0x08:		/* invd */ | ||||
| 	case 0x0d:		/* GrpP (prefetch) */ | ||||
| 	case 0x18:		/* Grp16 (prefetch/nop) */ | ||||
| 	case 0x1f:		/* nop */ | ||||
| 		break; | ||||
| 	case 0x20: /* mov cr, reg */ | ||||
| 		ctxt->dst.val = ops->get_cr(ctxt, ctxt->modrm_reg); | ||||
|  |  | |||
|  | @ -1861,11 +1861,14 @@ void kvm_apic_accept_events(struct kvm_vcpu *vcpu) | |||
| { | ||||
| 	struct kvm_lapic *apic = vcpu->arch.apic; | ||||
| 	unsigned int sipi_vector; | ||||
| 	unsigned long pe; | ||||
| 
 | ||||
| 	if (!kvm_vcpu_has_lapic(vcpu)) | ||||
| 	if (!kvm_vcpu_has_lapic(vcpu) || !apic->pending_events) | ||||
| 		return; | ||||
| 
 | ||||
| 	if (test_and_clear_bit(KVM_APIC_INIT, &apic->pending_events)) { | ||||
| 	pe = xchg(&apic->pending_events, 0); | ||||
| 
 | ||||
| 	if (test_bit(KVM_APIC_INIT, &pe)) { | ||||
| 		kvm_lapic_reset(vcpu); | ||||
| 		kvm_vcpu_reset(vcpu); | ||||
| 		if (kvm_vcpu_is_bsp(apic->vcpu)) | ||||
|  | @ -1873,7 +1876,7 @@ void kvm_apic_accept_events(struct kvm_vcpu *vcpu) | |||
| 		else | ||||
| 			vcpu->arch.mp_state = KVM_MP_STATE_INIT_RECEIVED; | ||||
| 	} | ||||
| 	if (test_and_clear_bit(KVM_APIC_SIPI, &apic->pending_events) && | ||||
| 	if (test_bit(KVM_APIC_SIPI, &pe) && | ||||
| 	    vcpu->arch.mp_state == KVM_MP_STATE_INIT_RECEIVED) { | ||||
| 		/* evaluate pending_events before reading the vector */ | ||||
| 		smp_rmb(); | ||||
|  |  | |||
|  | @ -628,7 +628,9 @@ int pcibios_add_device(struct pci_dev *dev) | |||
| 
 | ||||
| 	pa_data = boot_params.hdr.setup_data; | ||||
| 	while (pa_data) { | ||||
| 		data = phys_to_virt(pa_data); | ||||
| 		data = ioremap(pa_data, sizeof(*rom)); | ||||
| 		if (!data) | ||||
| 			return -ENOMEM; | ||||
| 
 | ||||
| 		if (data->type == SETUP_PCI) { | ||||
| 			rom = (struct pci_setup_rom *)data; | ||||
|  | @ -645,6 +647,7 @@ int pcibios_add_device(struct pci_dev *dev) | |||
| 			} | ||||
| 		} | ||||
| 		pa_data = data->next; | ||||
| 		iounmap(data); | ||||
| 	} | ||||
| 	return 0; | ||||
| } | ||||
|  |  | |||
|  | @ -919,13 +919,14 @@ static int ghes_probe(struct platform_device *ghes_dev) | |||
| 		break; | ||||
| 	case ACPI_HEST_NOTIFY_EXTERNAL: | ||||
| 		/* External interrupt vector is GSI */ | ||||
| 		if (acpi_gsi_to_irq(generic->notify.vector, &ghes->irq)) { | ||||
| 		rc = acpi_gsi_to_irq(generic->notify.vector, &ghes->irq); | ||||
| 		if (rc) { | ||||
| 			pr_err(GHES_PFX "Failed to map GSI to IRQ for generic hardware error source: %d\n", | ||||
| 			       generic->header.source_id); | ||||
| 			goto err_edac_unreg; | ||||
| 		} | ||||
| 		if (request_irq(ghes->irq, ghes_irq_func, | ||||
| 				0, "GHES IRQ", ghes)) { | ||||
| 		rc = request_irq(ghes->irq, ghes_irq_func, 0, "GHES IRQ", ghes); | ||||
| 		if (rc) { | ||||
| 			pr_err(GHES_PFX "Failed to register IRQ for generic hardware error source: %d\n", | ||||
| 			       generic->header.source_id); | ||||
| 			goto err_edac_unreg; | ||||
|  |  | |||
|  | @ -278,11 +278,13 @@ int acpi_bus_init_power(struct acpi_device *device) | |||
| 		if (result) | ||||
| 			return result; | ||||
| 	} else if (state == ACPI_STATE_UNKNOWN) { | ||||
| 		/* No power resources and missing _PSC? Try to force D0. */ | ||||
| 		/*
 | ||||
| 		 * No power resources and missing _PSC?  Cross fingers and make | ||||
| 		 * it D0 in hope that this is what the BIOS put the device into. | ||||
| 		 * [We tried to force D0 here by executing _PS0, but that broke | ||||
| 		 * Toshiba P870-303 in a nasty way.] | ||||
| 		 */ | ||||
| 		state = ACPI_STATE_D0; | ||||
| 		result = acpi_dev_pm_explicit_set(device, state); | ||||
| 		if (result) | ||||
| 			return result; | ||||
| 	} | ||||
| 	device->power.state = state; | ||||
| 	return 0; | ||||
|  |  | |||
|  | @ -456,6 +456,14 @@ static struct dmi_system_id video_dmi_table[] __initdata = { | |||
| 		DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dm4 Notebook PC"), | ||||
| 		}, | ||||
| 	}, | ||||
| 	{ | ||||
| 	 .callback = video_ignore_initial_backlight, | ||||
| 	 .ident = "HP Pavilion g6 Notebook PC", | ||||
| 	 .matches = { | ||||
| 		 DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), | ||||
| 		 DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion g6 Notebook PC"), | ||||
| 		}, | ||||
| 	}, | ||||
| 	{ | ||||
| 	 .callback = video_ignore_initial_backlight, | ||||
| 	 .ident = "HP 1000 Notebook PC", | ||||
|  | @ -464,6 +472,14 @@ static struct dmi_system_id video_dmi_table[] __initdata = { | |||
| 		DMI_MATCH(DMI_PRODUCT_NAME, "HP 1000 Notebook PC"), | ||||
| 		}, | ||||
| 	}, | ||||
| 	{ | ||||
| 	 .callback = video_ignore_initial_backlight, | ||||
| 	 .ident = "HP Pavilion m4", | ||||
| 	 .matches = { | ||||
| 		DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), | ||||
| 		DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion m4 Notebook PC"), | ||||
| 		}, | ||||
| 	}, | ||||
| 	{} | ||||
| }; | ||||
| 
 | ||||
|  |  | |||
|  | @ -2,7 +2,7 @@ | |||
| /*
 | ||||
|  *  acard-ahci.c - ACard AHCI SATA support | ||||
|  * | ||||
|  *  Maintained by:  Jeff Garzik <jgarzik@pobox.com> | ||||
|  *  Maintained by:  Tejun Heo <tj@kernel.org> | ||||
|  *		    Please ALWAYS copy linux-ide@vger.kernel.org | ||||
|  *		    on emails. | ||||
|  * | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| /*
 | ||||
|  *  ahci.c - AHCI SATA support | ||||
|  * | ||||
|  *  Maintained by:  Jeff Garzik <jgarzik@pobox.com> | ||||
|  *  Maintained by:  Tejun Heo <tj@kernel.org> | ||||
|  *    		    Please ALWAYS copy linux-ide@vger.kernel.org | ||||
|  *		    on emails. | ||||
|  * | ||||
|  | @ -423,6 +423,8 @@ static const struct pci_device_id ahci_pci_tbl[] = { | |||
| 	  .driver_data = board_ahci_yes_fbs },			/* 88se9125 */ | ||||
| 	{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x917a), | ||||
| 	  .driver_data = board_ahci_yes_fbs },			/* 88se9172 */ | ||||
| 	{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9172), | ||||
| 	  .driver_data = board_ahci_yes_fbs },			/* 88se9172 */ | ||||
| 	{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9192), | ||||
| 	  .driver_data = board_ahci_yes_fbs },			/* 88se9172 on some Gigabyte */ | ||||
| 	{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x91a3), | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| /*
 | ||||
|  *  ahci.h - Common AHCI SATA definitions and declarations | ||||
|  * | ||||
|  *  Maintained by:  Jeff Garzik <jgarzik@pobox.com> | ||||
|  *  Maintained by:  Tejun Heo <tj@kernel.org> | ||||
|  *    		    Please ALWAYS copy linux-ide@vger.kernel.org | ||||
|  *		    on emails. | ||||
|  * | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| /*
 | ||||
|  *    ata_piix.c - Intel PATA/SATA controllers | ||||
|  * | ||||
|  *    Maintained by:  Jeff Garzik <jgarzik@pobox.com> | ||||
|  *    Maintained by:  Tejun Heo <tj@kernel.org> | ||||
|  *    		    Please ALWAYS copy linux-ide@vger.kernel.org | ||||
|  *		    on emails. | ||||
|  * | ||||
|  | @ -151,6 +151,7 @@ enum piix_controller_ids { | |||
| 	piix_pata_vmw,			/* PIIX4 for VMware, spurious DMA_ERR */ | ||||
| 	ich8_sata_snb, | ||||
| 	ich8_2port_sata_snb, | ||||
| 	ich8_2port_sata_byt, | ||||
| }; | ||||
| 
 | ||||
| struct piix_map_db { | ||||
|  | @ -334,6 +335,9 @@ static const struct pci_device_id piix_pci_tbl[] = { | |||
| 	{ 0x8086, 0x8d60, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb }, | ||||
| 	/* SATA Controller IDE (Wellsburg) */ | ||||
| 	{ 0x8086, 0x8d68, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, | ||||
| 	/* SATA Controller IDE (BayTrail) */ | ||||
| 	{ 0x8086, 0x0F20, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata_byt }, | ||||
| 	{ 0x8086, 0x0F21, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata_byt }, | ||||
| 
 | ||||
| 	{ }	/* terminate list */ | ||||
| }; | ||||
|  | @ -441,6 +445,7 @@ static const struct piix_map_db *piix_map_db_table[] = { | |||
| 	[tolapai_sata]		= &tolapai_map_db, | ||||
| 	[ich8_sata_snb]		= &ich8_map_db, | ||||
| 	[ich8_2port_sata_snb]	= &ich8_2port_map_db, | ||||
| 	[ich8_2port_sata_byt]	= &ich8_2port_map_db, | ||||
| }; | ||||
| 
 | ||||
| static struct pci_bits piix_enable_bits[] = { | ||||
|  | @ -1254,6 +1259,16 @@ static struct ata_port_info piix_port_info[] = { | |||
| 		.udma_mask	= ATA_UDMA6, | ||||
| 		.port_ops	= &piix_sata_ops, | ||||
| 	}, | ||||
| 
 | ||||
| 	[ich8_2port_sata_byt] = | ||||
| 	{ | ||||
| 		.flags          = PIIX_SATA_FLAGS | PIIX_FLAG_SIDPR | PIIX_FLAG_PIO16, | ||||
| 		.pio_mask       = ATA_PIO4, | ||||
| 		.mwdma_mask     = ATA_MWDMA2, | ||||
| 		.udma_mask      = ATA_UDMA6, | ||||
| 		.port_ops       = &piix_sata_ops, | ||||
| 	}, | ||||
| 
 | ||||
| }; | ||||
| 
 | ||||
| #define AHCI_PCI_BAR 5 | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| /*
 | ||||
|  *  libahci.c - Common AHCI SATA low-level routines | ||||
|  * | ||||
|  *  Maintained by:  Jeff Garzik <jgarzik@pobox.com> | ||||
|  *  Maintained by:  Tejun Heo <tj@kernel.org> | ||||
|  *    		    Please ALWAYS copy linux-ide@vger.kernel.org | ||||
|  *		    on emails. | ||||
|  * | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| /*
 | ||||
|  *  libata-core.c - helper library for ATA | ||||
|  * | ||||
|  *  Maintained by:  Jeff Garzik <jgarzik@pobox.com> | ||||
|  *  Maintained by:  Tejun Heo <tj@kernel.org> | ||||
|  *    		    Please ALWAYS copy linux-ide@vger.kernel.org | ||||
|  *		    on emails. | ||||
|  * | ||||
|  | @ -1602,6 +1602,12 @@ unsigned ata_exec_internal_sg(struct ata_device *dev, | |||
| 	qc->tf = *tf; | ||||
| 	if (cdb) | ||||
| 		memcpy(qc->cdb, cdb, ATAPI_CDB_LEN); | ||||
| 
 | ||||
| 	/* some SATA bridges need us to indicate data xfer direction */ | ||||
| 	if (tf->protocol == ATAPI_PROT_DMA && (dev->flags & ATA_DFLAG_DMADIR) && | ||||
| 	    dma_dir == DMA_FROM_DEVICE) | ||||
| 		qc->tf.feature |= ATAPI_DMADIR; | ||||
| 
 | ||||
| 	qc->flags |= ATA_QCFLAG_RESULT_TF; | ||||
| 	qc->dma_dir = dma_dir; | ||||
| 	if (dma_dir != DMA_NONE) { | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| /*
 | ||||
|  *  libata-eh.c - libata error handling | ||||
|  * | ||||
|  *  Maintained by:  Jeff Garzik <jgarzik@pobox.com> | ||||
|  *  Maintained by:  Tejun Heo <tj@kernel.org> | ||||
|  *    		    Please ALWAYS copy linux-ide@vger.kernel.org | ||||
|  *		    on emails. | ||||
|  * | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| /*
 | ||||
|  *  libata-scsi.c - helper library for ATA | ||||
|  * | ||||
|  *  Maintained by:  Jeff Garzik <jgarzik@pobox.com> | ||||
|  *  Maintained by:  Tejun Heo <tj@kernel.org> | ||||
|  *    		    Please ALWAYS copy linux-ide@vger.kernel.org | ||||
|  *		    on emails. | ||||
|  * | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| /*
 | ||||
|  *  libata-sff.c - helper library for PCI IDE BMDMA | ||||
|  * | ||||
|  *  Maintained by:  Jeff Garzik <jgarzik@pobox.com> | ||||
|  *  Maintained by:  Tejun Heo <tj@kernel.org> | ||||
|  *    		    Please ALWAYS copy linux-ide@vger.kernel.org | ||||
|  *		    on emails. | ||||
|  * | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| /*
 | ||||
|  *  pdc_adma.c - Pacific Digital Corporation ADMA | ||||
|  * | ||||
|  *  Maintained by:  Mark Lord <mlord@pobox.com> | ||||
|  *  Maintained by:  Tejun Heo <tj@kernel.org> | ||||
|  * | ||||
|  *  Copyright 2005 Mark Lord | ||||
|  * | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| /*
 | ||||
|  *  sata_promise.c - Promise SATA | ||||
|  * | ||||
|  *  Maintained by:  Jeff Garzik <jgarzik@pobox.com> | ||||
|  *  Maintained by:  Tejun Heo <tj@kernel.org> | ||||
|  *		    Mikael Pettersson <mikpe@it.uu.se> | ||||
|  *  		    Please ALWAYS copy linux-ide@vger.kernel.org | ||||
|  *		    on emails. | ||||
|  |  | |||
|  | @ -549,6 +549,7 @@ static void sata_rcar_bmdma_start(struct ata_queued_cmd *qc) | |||
| 
 | ||||
| 	/* start host DMA transaction */ | ||||
| 	dmactl = ioread32(priv->base + ATAPI_CONTROL1_REG); | ||||
| 	dmactl &= ~ATAPI_CONTROL1_STOP; | ||||
| 	dmactl |= ATAPI_CONTROL1_START; | ||||
| 	iowrite32(dmactl, priv->base + ATAPI_CONTROL1_REG); | ||||
| } | ||||
|  | @ -618,17 +619,16 @@ static struct ata_port_operations sata_rcar_port_ops = { | |||
| 	.bmdma_status		= sata_rcar_bmdma_status, | ||||
| }; | ||||
| 
 | ||||
| static int sata_rcar_serr_interrupt(struct ata_port *ap) | ||||
| static void sata_rcar_serr_interrupt(struct ata_port *ap) | ||||
| { | ||||
| 	struct sata_rcar_priv *priv = ap->host->private_data; | ||||
| 	struct ata_eh_info *ehi = &ap->link.eh_info; | ||||
| 	int freeze = 0; | ||||
| 	int handled = 0; | ||||
| 	u32 serror; | ||||
| 
 | ||||
| 	serror = ioread32(priv->base + SCRSERR_REG); | ||||
| 	if (!serror) | ||||
| 		return 0; | ||||
| 		return; | ||||
| 
 | ||||
| 	DPRINTK("SError @host_intr: 0x%x\n", serror); | ||||
| 
 | ||||
|  | @ -641,7 +641,6 @@ static int sata_rcar_serr_interrupt(struct ata_port *ap) | |||
| 		ata_ehi_push_desc(ehi, "%s", "hotplug"); | ||||
| 
 | ||||
| 		freeze = serror & SERR_COMM_WAKE ? 0 : 1; | ||||
| 		handled = 1; | ||||
| 	} | ||||
| 
 | ||||
| 	/* freeze or abort */ | ||||
|  | @ -649,11 +648,9 @@ static int sata_rcar_serr_interrupt(struct ata_port *ap) | |||
| 		ata_port_freeze(ap); | ||||
| 	else | ||||
| 		ata_port_abort(ap); | ||||
| 
 | ||||
| 	return handled; | ||||
| } | ||||
| 
 | ||||
| static int sata_rcar_ata_interrupt(struct ata_port *ap) | ||||
| static void sata_rcar_ata_interrupt(struct ata_port *ap) | ||||
| { | ||||
| 	struct ata_queued_cmd *qc; | ||||
| 	int handled = 0; | ||||
|  | @ -662,7 +659,9 @@ static int sata_rcar_ata_interrupt(struct ata_port *ap) | |||
| 	if (qc) | ||||
| 		handled |= ata_bmdma_port_intr(ap, qc); | ||||
| 
 | ||||
| 	return handled; | ||||
| 	/* be sure to clear ATA interrupt */ | ||||
| 	if (!handled) | ||||
| 		sata_rcar_check_status(ap); | ||||
| } | ||||
| 
 | ||||
| static irqreturn_t sata_rcar_interrupt(int irq, void *dev_instance) | ||||
|  | @ -677,20 +676,21 @@ static irqreturn_t sata_rcar_interrupt(int irq, void *dev_instance) | |||
| 	spin_lock_irqsave(&host->lock, flags); | ||||
| 
 | ||||
| 	sataintstat = ioread32(priv->base + SATAINTSTAT_REG); | ||||
| 	sataintstat &= SATA_RCAR_INT_MASK; | ||||
| 	if (!sataintstat) | ||||
| 		goto done; | ||||
| 	/* ack */ | ||||
| 	iowrite32(sataintstat & ~SATA_RCAR_INT_MASK, | ||||
| 		 priv->base + SATAINTSTAT_REG); | ||||
| 	iowrite32(~sataintstat & 0x7ff, priv->base + SATAINTSTAT_REG); | ||||
| 
 | ||||
| 	ap = host->ports[0]; | ||||
| 
 | ||||
| 	if (sataintstat & SATAINTSTAT_ATA) | ||||
| 		handled |= sata_rcar_ata_interrupt(ap); | ||||
| 		sata_rcar_ata_interrupt(ap); | ||||
| 
 | ||||
| 	if (sataintstat & SATAINTSTAT_SERR) | ||||
| 		handled |= sata_rcar_serr_interrupt(ap); | ||||
| 		sata_rcar_serr_interrupt(ap); | ||||
| 
 | ||||
| 	handled = 1; | ||||
| done: | ||||
| 	spin_unlock_irqrestore(&host->lock, flags); | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| /*
 | ||||
|  *  sata_sil.c - Silicon Image SATA | ||||
|  * | ||||
|  *  Maintained by:  Jeff Garzik <jgarzik@pobox.com> | ||||
|  *  Maintained by:  Tejun Heo <tj@kernel.org> | ||||
|  *  		    Please ALWAYS copy linux-ide@vger.kernel.org | ||||
|  *		    on emails. | ||||
|  * | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| /*
 | ||||
|  *  sata_sx4.c - Promise SATA | ||||
|  * | ||||
|  *  Maintained by:  Jeff Garzik <jgarzik@pobox.com> | ||||
|  *  Maintained by:  Tejun Heo <tj@kernel.org> | ||||
|  *  		    Please ALWAYS copy linux-ide@vger.kernel.org | ||||
|  *		    on emails. | ||||
|  * | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| /*
 | ||||
|  *  sata_via.c - VIA Serial ATA controllers | ||||
|  * | ||||
|  *  Maintained by:  Jeff Garzik <jgarzik@pobox.com> | ||||
|  *  Maintained by:  Tejun Heo <tj@kernel.org> | ||||
|  * 		   Please ALWAYS copy linux-ide@vger.kernel.org | ||||
|  *		   on emails. | ||||
|  * | ||||
|  |  | |||
|  | @ -347,11 +347,11 @@ static u32 get_cur_val(const struct cpumask *mask) | |||
| 	switch (per_cpu(acfreq_data, cpumask_first(mask))->cpu_feature) { | ||||
| 	case SYSTEM_INTEL_MSR_CAPABLE: | ||||
| 		cmd.type = SYSTEM_INTEL_MSR_CAPABLE; | ||||
| 		cmd.addr.msr.reg = MSR_IA32_PERF_STATUS; | ||||
| 		cmd.addr.msr.reg = MSR_IA32_PERF_CTL; | ||||
| 		break; | ||||
| 	case SYSTEM_AMD_MSR_CAPABLE: | ||||
| 		cmd.type = SYSTEM_AMD_MSR_CAPABLE; | ||||
| 		cmd.addr.msr.reg = MSR_AMD_PERF_STATUS; | ||||
| 		cmd.addr.msr.reg = MSR_AMD_PERF_CTL; | ||||
| 		break; | ||||
| 	case SYSTEM_IO_CAPABLE: | ||||
| 		cmd.type = SYSTEM_IO_CAPABLE; | ||||
|  |  | |||
|  | @ -45,7 +45,7 @@ static int cpu0_set_target(struct cpufreq_policy *policy, | |||
| 	struct cpufreq_freqs freqs; | ||||
| 	struct opp *opp; | ||||
| 	unsigned long volt = 0, volt_old = 0, tol = 0; | ||||
| 	long freq_Hz; | ||||
| 	long freq_Hz, freq_exact; | ||||
| 	unsigned int index; | ||||
| 	int ret; | ||||
| 
 | ||||
|  | @ -60,6 +60,7 @@ static int cpu0_set_target(struct cpufreq_policy *policy, | |||
| 	freq_Hz = clk_round_rate(cpu_clk, freq_table[index].frequency * 1000); | ||||
| 	if (freq_Hz < 0) | ||||
| 		freq_Hz = freq_table[index].frequency * 1000; | ||||
| 	freq_exact = freq_Hz; | ||||
| 	freqs.new = freq_Hz / 1000; | ||||
| 	freqs.old = clk_get_rate(cpu_clk) / 1000; | ||||
| 
 | ||||
|  | @ -98,7 +99,7 @@ static int cpu0_set_target(struct cpufreq_policy *policy, | |||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	ret = clk_set_rate(cpu_clk, freqs.new * 1000); | ||||
| 	ret = clk_set_rate(cpu_clk, freq_exact); | ||||
| 	if (ret) { | ||||
| 		pr_err("failed to set clock rate: %d\n", ret); | ||||
| 		if (cpu_reg) | ||||
|  |  | |||
|  | @ -26,6 +26,7 @@ | |||
| #include <linux/tick.h> | ||||
| #include <linux/types.h> | ||||
| #include <linux/workqueue.h> | ||||
| #include <linux/cpu.h> | ||||
| 
 | ||||
| #include "cpufreq_governor.h" | ||||
| 
 | ||||
|  | @ -180,8 +181,10 @@ void gov_queue_work(struct dbs_data *dbs_data, struct cpufreq_policy *policy, | |||
| 	if (!all_cpus) { | ||||
| 		__gov_queue_work(smp_processor_id(), dbs_data, delay); | ||||
| 	} else { | ||||
| 		get_online_cpus(); | ||||
| 		for_each_cpu(i, policy->cpus) | ||||
| 			__gov_queue_work(i, dbs_data, delay); | ||||
| 		put_online_cpus(); | ||||
| 	} | ||||
| } | ||||
| EXPORT_SYMBOL_GPL(gov_queue_work); | ||||
|  |  | |||
|  | @ -716,8 +716,7 @@ static int dmatest_func(void *data) | |||
| 		} | ||||
| 		dma_async_issue_pending(chan); | ||||
| 
 | ||||
| 		wait_event_freezable_timeout(done_wait, | ||||
| 					     done.done || kthread_should_stop(), | ||||
| 		wait_event_freezable_timeout(done_wait, done.done, | ||||
| 					     msecs_to_jiffies(params->timeout)); | ||||
| 
 | ||||
| 		status = dma_async_is_tx_complete(chan, cookie, NULL, NULL); | ||||
|  | @ -997,7 +996,6 @@ static void stop_threaded_test(struct dmatest_info *info) | |||
| static int __restart_threaded_test(struct dmatest_info *info, bool run) | ||||
| { | ||||
| 	struct dmatest_params *params = &info->params; | ||||
| 	int ret; | ||||
| 
 | ||||
| 	/* Stop any running test first */ | ||||
| 	__stop_threaded_test(info); | ||||
|  | @ -1012,13 +1010,23 @@ static int __restart_threaded_test(struct dmatest_info *info, bool run) | |||
| 	memcpy(params, &info->dbgfs_params, sizeof(*params)); | ||||
| 
 | ||||
| 	/* Run test with new parameters */ | ||||
| 	ret = __run_threaded_test(info); | ||||
| 	if (ret) { | ||||
| 		__stop_threaded_test(info); | ||||
| 		pr_err("dmatest: Can't run test\n"); | ||||
| 	return __run_threaded_test(info); | ||||
| } | ||||
| 
 | ||||
| static bool __is_threaded_test_run(struct dmatest_info *info) | ||||
| { | ||||
| 	struct dmatest_chan *dtc; | ||||
| 
 | ||||
| 	list_for_each_entry(dtc, &info->channels, node) { | ||||
| 		struct dmatest_thread *thread; | ||||
| 
 | ||||
| 		list_for_each_entry(thread, &dtc->threads, node) { | ||||
| 			if (!thread->done) | ||||
| 				return true; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return ret; | ||||
| 	return false; | ||||
| } | ||||
| 
 | ||||
| static ssize_t dtf_write_string(void *to, size_t available, loff_t *ppos, | ||||
|  | @ -1091,22 +1099,10 @@ static ssize_t dtf_read_run(struct file *file, char __user *user_buf, | |||
| { | ||||
| 	struct dmatest_info *info = file->private_data; | ||||
| 	char buf[3]; | ||||
| 	struct dmatest_chan *dtc; | ||||
| 	bool alive = false; | ||||
| 
 | ||||
| 	mutex_lock(&info->lock); | ||||
| 	list_for_each_entry(dtc, &info->channels, node) { | ||||
| 		struct dmatest_thread *thread; | ||||
| 
 | ||||
| 		list_for_each_entry(thread, &dtc->threads, node) { | ||||
| 			if (!thread->done) { | ||||
| 				alive = true; | ||||
| 				break; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if (alive) { | ||||
| 	if (__is_threaded_test_run(info)) { | ||||
| 		buf[0] = 'Y'; | ||||
| 	} else { | ||||
| 		__stop_threaded_test(info); | ||||
|  | @ -1132,7 +1128,12 @@ static ssize_t dtf_write_run(struct file *file, const char __user *user_buf, | |||
| 
 | ||||
| 	if (strtobool(buf, &bv) == 0) { | ||||
| 		mutex_lock(&info->lock); | ||||
| 		ret = __restart_threaded_test(info, bv); | ||||
| 
 | ||||
| 		if (__is_threaded_test_run(info)) | ||||
| 			ret = -EBUSY; | ||||
| 		else | ||||
| 			ret = __restart_threaded_test(info, bv); | ||||
| 
 | ||||
| 		mutex_unlock(&info->lock); | ||||
| 	} | ||||
| 
 | ||||
|  |  | |||
|  | @ -1566,10 +1566,12 @@ static void dma_tc_handle(struct d40_chan *d40c) | |||
| 			return; | ||||
| 		} | ||||
| 
 | ||||
| 		if (d40_queue_start(d40c) == NULL) | ||||
| 		if (d40_queue_start(d40c) == NULL) { | ||||
| 			d40c->busy = false; | ||||
| 		pm_runtime_mark_last_busy(d40c->base->dev); | ||||
| 		pm_runtime_put_autosuspend(d40c->base->dev); | ||||
| 
 | ||||
| 			pm_runtime_mark_last_busy(d40c->base->dev); | ||||
| 			pm_runtime_put_autosuspend(d40c->base->dev); | ||||
| 		} | ||||
| 
 | ||||
| 		d40_desc_remove(d40d); | ||||
| 		d40_desc_done(d40c, d40d); | ||||
|  |  | |||
|  | @ -1054,7 +1054,7 @@ EXPORT_SYMBOL(drm_vblank_off); | |||
|  */ | ||||
| void drm_vblank_pre_modeset(struct drm_device *dev, int crtc) | ||||
| { | ||||
| 	/* vblank is not initialized (IRQ not installed ?) */ | ||||
| 	/* vblank is not initialized (IRQ not installed ?), or has been freed */ | ||||
| 	if (!dev->num_crtcs) | ||||
| 		return; | ||||
| 	/*
 | ||||
|  | @ -1076,6 +1076,10 @@ void drm_vblank_post_modeset(struct drm_device *dev, int crtc) | |||
| { | ||||
| 	unsigned long irqflags; | ||||
| 
 | ||||
| 	/* vblank is not initialized (IRQ not installed ?), or has been freed */ | ||||
| 	if (!dev->num_crtcs) | ||||
| 		return; | ||||
| 
 | ||||
| 	if (dev->vblank_inmodeset[crtc]) { | ||||
| 		spin_lock_irqsave(&dev->vbl_lock, irqflags); | ||||
| 		dev->vblank_disable_allowed = 1; | ||||
|  |  | |||
|  | @ -91,14 +91,11 @@ i915_gem_wait_for_error(struct i915_gpu_error *error) | |||
| { | ||||
| 	int ret; | ||||
| 
 | ||||
| #define EXIT_COND (!i915_reset_in_progress(error)) | ||||
| #define EXIT_COND (!i915_reset_in_progress(error) || \ | ||||
| 		   i915_terminally_wedged(error)) | ||||
| 	if (EXIT_COND) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	/* GPU is already declared terminally dead, give up. */ | ||||
| 	if (i915_terminally_wedged(error)) | ||||
| 		return -EIO; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * Only wait 10 seconds for the gpu reset to complete to avoid hanging | ||||
| 	 * userspace. If it takes that long something really bad is going on and | ||||
|  |  | |||
|  | @ -7937,6 +7937,11 @@ intel_modeset_check_state(struct drm_device *dev) | |||
| 		memset(&pipe_config, 0, sizeof(pipe_config)); | ||||
| 		active = dev_priv->display.get_pipe_config(crtc, | ||||
| 							   &pipe_config); | ||||
| 
 | ||||
| 		/* hw state is inconsistent with the pipe A quirk */ | ||||
| 		if (crtc->pipe == PIPE_A && dev_priv->quirks & QUIRK_PIPEA_FORCE) | ||||
| 			active = crtc->active; | ||||
| 
 | ||||
| 		WARN(crtc->active != active, | ||||
| 		     "crtc active state doesn't match with hw state " | ||||
| 		     "(expected %i, found %i)\n", crtc->active, active); | ||||
|  |  | |||
|  | @ -815,10 +815,10 @@ static const struct dmi_system_id intel_no_lvds[] = { | |||
| 	}, | ||||
| 	{ | ||||
| 		.callback = intel_no_lvds_dmi_callback, | ||||
| 		.ident = "Hewlett-Packard HP t5740e Thin Client", | ||||
| 		.ident = "Hewlett-Packard HP t5740", | ||||
| 		.matches = { | ||||
| 			DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), | ||||
| 			DMI_MATCH(DMI_PRODUCT_NAME, "HP t5740e Thin Client"), | ||||
| 			DMI_MATCH(DMI_PRODUCT_NAME, " t5740"), | ||||
| 		}, | ||||
| 	}, | ||||
| 	{ | ||||
|  |  | |||
|  | @ -1776,7 +1776,7 @@ static void intel_sdvo_get_lvds_modes(struct drm_connector *connector) | |||
| 	 * Assume that the preferred modes are | ||||
| 	 * arranged in priority order. | ||||
| 	 */ | ||||
| 	intel_ddc_get_modes(connector, intel_sdvo->i2c); | ||||
| 	intel_ddc_get_modes(connector, &intel_sdvo->ddc); | ||||
| 	if (list_empty(&connector->probed_modes) == false) | ||||
| 		goto end; | ||||
| 
 | ||||
|  |  | |||
|  | @ -1034,13 +1034,14 @@ static int mga_crtc_mode_set(struct drm_crtc *crtc, | |||
| 			else | ||||
| 				hi_pri_lvl = 5; | ||||
| 
 | ||||
| 			WREG8(0x1fde, 0x06); | ||||
| 			WREG8(0x1fdf, hi_pri_lvl); | ||||
| 			WREG8(MGAREG_CRTCEXT_INDEX, 0x06); | ||||
| 			WREG8(MGAREG_CRTCEXT_DATA, hi_pri_lvl); | ||||
| 		} else { | ||||
| 			WREG8(MGAREG_CRTCEXT_INDEX, 0x06); | ||||
| 			if (mdev->reg_1e24 >= 0x01) | ||||
| 				WREG8(0x1fdf, 0x03); | ||||
| 				WREG8(MGAREG_CRTCEXT_DATA, 0x03); | ||||
| 			else | ||||
| 				WREG8(0x1fdf, 0x04); | ||||
| 				WREG8(MGAREG_CRTCEXT_DATA, 0x04); | ||||
| 		} | ||||
| 	} | ||||
| 	return 0; | ||||
|  |  | |||
|  | @ -50,11 +50,16 @@ nv50_dac_sense(struct nv50_disp_priv *priv, int or, u32 loadval) | |||
| { | ||||
| 	const u32 doff = (or * 0x800); | ||||
| 	int load = -EINVAL; | ||||
| 	nv_mask(priv, 0x61a004 + doff, 0x807f0000, 0x80150000); | ||||
| 	nv_wait(priv, 0x61a004 + doff, 0x80000000, 0x00000000); | ||||
| 	nv_wr32(priv, 0x61a00c + doff, 0x00100000 | loadval); | ||||
| 	udelay(9500); | ||||
| 	mdelay(9); | ||||
| 	udelay(500); | ||||
| 	nv_wr32(priv, 0x61a00c + doff, 0x80000000); | ||||
| 	load = (nv_rd32(priv, 0x61a00c + doff) & 0x38000000) >> 27; | ||||
| 	nv_wr32(priv, 0x61a00c + doff, 0x00000000); | ||||
| 	nv_mask(priv, 0x61a004 + doff, 0x807f0000, 0x80550000); | ||||
| 	nv_wait(priv, 0x61a004 + doff, 0x80000000, 0x00000000); | ||||
| 	return load; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -55,6 +55,10 @@ nv84_hdmi_ctrl(struct nv50_disp_priv *priv, int head, int or, u32 data) | |||
| 	nv_wr32(priv, 0x616510 + hoff, 0x00000000); | ||||
| 	nv_mask(priv, 0x616500 + hoff, 0x00000001, 0x00000001); | ||||
| 
 | ||||
| 	nv_mask(priv, 0x6165d0 + hoff, 0x00070001, 0x00010001); /* SPARE, HW_CTS */ | ||||
| 	nv_mask(priv, 0x616568 + hoff, 0x00010101, 0x00000000); /* ACR_CTRL, ?? */ | ||||
| 	nv_mask(priv, 0x616578 + hoff, 0x80000000, 0x80000000); /* ACR_0441_ENABLE */ | ||||
| 
 | ||||
| 	/* ??? */ | ||||
| 	nv_mask(priv, 0x61733c, 0x00100000, 0x00100000); /* RESETF */ | ||||
| 	nv_mask(priv, 0x61733c, 0x10000000, 0x10000000); /* LOOKUP_EN */ | ||||
|  |  | |||
|  | @ -40,14 +40,13 @@ | |||
|  * FIFO channel objects | ||||
|  ******************************************************************************/ | ||||
| 
 | ||||
| void | ||||
| nv50_fifo_playlist_update(struct nv50_fifo_priv *priv) | ||||
| static void | ||||
| nv50_fifo_playlist_update_locked(struct nv50_fifo_priv *priv) | ||||
| { | ||||
| 	struct nouveau_bar *bar = nouveau_bar(priv); | ||||
| 	struct nouveau_gpuobj *cur; | ||||
| 	int i, p; | ||||
| 
 | ||||
| 	mutex_lock(&nv_subdev(priv)->mutex); | ||||
| 	cur = priv->playlist[priv->cur_playlist]; | ||||
| 	priv->cur_playlist = !priv->cur_playlist; | ||||
| 
 | ||||
|  | @ -61,6 +60,13 @@ nv50_fifo_playlist_update(struct nv50_fifo_priv *priv) | |||
| 	nv_wr32(priv, 0x0032f4, cur->addr >> 12); | ||||
| 	nv_wr32(priv, 0x0032ec, p); | ||||
| 	nv_wr32(priv, 0x002500, 0x00000101); | ||||
| } | ||||
| 
 | ||||
| void | ||||
| nv50_fifo_playlist_update(struct nv50_fifo_priv *priv) | ||||
| { | ||||
| 	mutex_lock(&nv_subdev(priv)->mutex); | ||||
| 	nv50_fifo_playlist_update_locked(priv); | ||||
| 	mutex_unlock(&nv_subdev(priv)->mutex); | ||||
| } | ||||
| 
 | ||||
|  | @ -489,7 +495,7 @@ nv50_fifo_init(struct nouveau_object *object) | |||
| 
 | ||||
| 	for (i = 0; i < 128; i++) | ||||
| 		nv_wr32(priv, 0x002600 + (i * 4), 0x00000000); | ||||
| 	nv50_fifo_playlist_update(priv); | ||||
| 	nv50_fifo_playlist_update_locked(priv); | ||||
| 
 | ||||
| 	nv_wr32(priv, 0x003200, 0x00000001); | ||||
| 	nv_wr32(priv, 0x003250, 0x00000001); | ||||
|  |  | |||
|  | @ -218,7 +218,7 @@ struct nv04_display_class { | |||
| #define NV50_DISP_DAC_PWR_STATE                                      0x00000040 | ||||
| #define NV50_DISP_DAC_PWR_STATE_ON                                   0x00000000 | ||||
| #define NV50_DISP_DAC_PWR_STATE_OFF                                  0x00000040 | ||||
| #define NV50_DISP_DAC_LOAD                                           0x0002000c | ||||
| #define NV50_DISP_DAC_LOAD                                           0x00020100 | ||||
| #define NV50_DISP_DAC_LOAD_VALUE                                     0x00000007 | ||||
| 
 | ||||
| #define NV50_DISP_PIOR_MTHD                                          0x00030000 | ||||
|  |  | |||
|  | @ -1554,7 +1554,9 @@ nv50_dac_detect(struct drm_encoder *encoder, struct drm_connector *connector) | |||
| { | ||||
| 	struct nv50_disp *disp = nv50_disp(encoder->dev); | ||||
| 	int ret, or = nouveau_encoder(encoder)->or; | ||||
| 	u32 load = 0; | ||||
| 	u32 load = nouveau_drm(encoder->dev)->vbios.dactestval; | ||||
| 	if (load == 0) | ||||
| 		load = 340; | ||||
| 
 | ||||
| 	ret = nv_exec(disp->core, NV50_DISP_DAC_LOAD + or, &load, sizeof(load)); | ||||
| 	if (ret || load != 7) | ||||
|  |  | |||
|  | @ -667,6 +667,8 @@ atombios_digital_setup(struct drm_encoder *encoder, int action) | |||
| int | ||||
| atombios_get_encoder_mode(struct drm_encoder *encoder) | ||||
| { | ||||
| 	struct drm_device *dev = encoder->dev; | ||||
| 	struct radeon_device *rdev = dev->dev_private; | ||||
| 	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | ||||
| 	struct drm_connector *connector; | ||||
| 	struct radeon_connector *radeon_connector; | ||||
|  | @ -693,7 +695,8 @@ atombios_get_encoder_mode(struct drm_encoder *encoder) | |||
| 	case DRM_MODE_CONNECTOR_DVII: | ||||
| 	case DRM_MODE_CONNECTOR_HDMIB: /* HDMI-B is basically DL-DVI; analog works fine */ | ||||
| 		if (drm_detect_hdmi_monitor(radeon_connector->edid) && | ||||
| 		    radeon_audio) | ||||
| 		    radeon_audio && | ||||
| 		    !ASIC_IS_DCE6(rdev)) /* remove once we support DCE6 */ | ||||
| 			return ATOM_ENCODER_MODE_HDMI; | ||||
| 		else if (radeon_connector->use_digital) | ||||
| 			return ATOM_ENCODER_MODE_DVI; | ||||
|  | @ -704,7 +707,8 @@ atombios_get_encoder_mode(struct drm_encoder *encoder) | |||
| 	case DRM_MODE_CONNECTOR_HDMIA: | ||||
| 	default: | ||||
| 		if (drm_detect_hdmi_monitor(radeon_connector->edid) && | ||||
| 		    radeon_audio) | ||||
| 		    radeon_audio && | ||||
| 		    !ASIC_IS_DCE6(rdev)) /* remove once we support DCE6 */ | ||||
| 			return ATOM_ENCODER_MODE_HDMI; | ||||
| 		else | ||||
| 			return ATOM_ENCODER_MODE_DVI; | ||||
|  | @ -718,7 +722,8 @@ atombios_get_encoder_mode(struct drm_encoder *encoder) | |||
| 		    (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP)) | ||||
| 			return ATOM_ENCODER_MODE_DP; | ||||
| 		else if (drm_detect_hdmi_monitor(radeon_connector->edid) && | ||||
| 			 radeon_audio) | ||||
| 			 radeon_audio && | ||||
| 			 !ASIC_IS_DCE6(rdev)) /* remove once we support DCE6 */ | ||||
| 			return ATOM_ENCODER_MODE_HDMI; | ||||
| 		else | ||||
| 			return ATOM_ENCODER_MODE_DVI; | ||||
|  |  | |||
|  | @ -4754,6 +4754,12 @@ static int evergreen_startup(struct radeon_device *rdev) | |||
| 		rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0; | ||||
| 
 | ||||
| 	/* Enable IRQ */ | ||||
| 	if (!rdev->irq.installed) { | ||||
| 		r = radeon_irq_kms_init(rdev); | ||||
| 		if (r) | ||||
| 			return r; | ||||
| 	} | ||||
| 
 | ||||
| 	r = r600_irq_init(rdev); | ||||
| 	if (r) { | ||||
| 		DRM_ERROR("radeon: IH init failed (%d).\n", r); | ||||
|  | @ -4923,10 +4929,6 @@ int evergreen_init(struct radeon_device *rdev) | |||
| 	if (r) | ||||
| 		return r; | ||||
| 
 | ||||
| 	r = radeon_irq_kms_init(rdev); | ||||
| 	if (r) | ||||
| 		return r; | ||||
| 
 | ||||
| 	rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL; | ||||
| 	r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024); | ||||
| 
 | ||||
|  |  | |||
|  | @ -2025,6 +2025,12 @@ static int cayman_startup(struct radeon_device *rdev) | |||
| 	} | ||||
| 
 | ||||
| 	/* Enable IRQ */ | ||||
| 	if (!rdev->irq.installed) { | ||||
| 		r = radeon_irq_kms_init(rdev); | ||||
| 		if (r) | ||||
| 			return r; | ||||
| 	} | ||||
| 
 | ||||
| 	r = r600_irq_init(rdev); | ||||
| 	if (r) { | ||||
| 		DRM_ERROR("radeon: IH init failed (%d).\n", r); | ||||
|  | @ -2190,10 +2196,6 @@ int cayman_init(struct radeon_device *rdev) | |||
| 	if (r) | ||||
| 		return r; | ||||
| 
 | ||||
| 	r = radeon_irq_kms_init(rdev); | ||||
| 	if (r) | ||||
| 		return r; | ||||
| 
 | ||||
| 	ring->ring_obj = NULL; | ||||
| 	r600_ring_init(rdev, ring, 1024 * 1024); | ||||
| 
 | ||||
|  |  | |||
|  | @ -3869,6 +3869,12 @@ static int r100_startup(struct radeon_device *rdev) | |||
| 	} | ||||
| 
 | ||||
| 	/* Enable IRQ */ | ||||
| 	if (!rdev->irq.installed) { | ||||
| 		r = radeon_irq_kms_init(rdev); | ||||
| 		if (r) | ||||
| 			return r; | ||||
| 	} | ||||
| 
 | ||||
| 	r100_irq_set(rdev); | ||||
| 	rdev->config.r100.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); | ||||
| 	/* 1M ring buffer */ | ||||
|  | @ -4022,9 +4028,6 @@ int r100_init(struct radeon_device *rdev) | |||
| 	r100_mc_init(rdev); | ||||
| 	/* Fence driver */ | ||||
| 	r = radeon_fence_driver_init(rdev); | ||||
| 	if (r) | ||||
| 		return r; | ||||
| 	r = radeon_irq_kms_init(rdev); | ||||
| 	if (r) | ||||
| 		return r; | ||||
| 	/* Memory manager */ | ||||
|  |  | |||
|  | @ -1382,6 +1382,12 @@ static int r300_startup(struct radeon_device *rdev) | |||
| 	} | ||||
| 
 | ||||
| 	/* Enable IRQ */ | ||||
| 	if (!rdev->irq.installed) { | ||||
| 		r = radeon_irq_kms_init(rdev); | ||||
| 		if (r) | ||||
| 			return r; | ||||
| 	} | ||||
| 
 | ||||
| 	r100_irq_set(rdev); | ||||
| 	rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); | ||||
| 	/* 1M ring buffer */ | ||||
|  | @ -1514,9 +1520,6 @@ int r300_init(struct radeon_device *rdev) | |||
| 	r300_mc_init(rdev); | ||||
| 	/* Fence driver */ | ||||
| 	r = radeon_fence_driver_init(rdev); | ||||
| 	if (r) | ||||
| 		return r; | ||||
| 	r = radeon_irq_kms_init(rdev); | ||||
| 	if (r) | ||||
| 		return r; | ||||
| 	/* Memory manager */ | ||||
|  |  | |||
|  | @ -265,6 +265,12 @@ static int r420_startup(struct radeon_device *rdev) | |||
| 	} | ||||
| 
 | ||||
| 	/* Enable IRQ */ | ||||
| 	if (!rdev->irq.installed) { | ||||
| 		r = radeon_irq_kms_init(rdev); | ||||
| 		if (r) | ||||
| 			return r; | ||||
| 	} | ||||
| 
 | ||||
| 	r100_irq_set(rdev); | ||||
| 	rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); | ||||
| 	/* 1M ring buffer */ | ||||
|  | @ -411,10 +417,6 @@ int r420_init(struct radeon_device *rdev) | |||
| 	if (r) { | ||||
| 		return r; | ||||
| 	} | ||||
| 	r = radeon_irq_kms_init(rdev); | ||||
| 	if (r) { | ||||
| 		return r; | ||||
| 	} | ||||
| 	/* Memory manager */ | ||||
| 	r = radeon_bo_init(rdev); | ||||
| 	if (r) { | ||||
|  |  | |||
|  | @ -194,6 +194,12 @@ static int r520_startup(struct radeon_device *rdev) | |||
| 	} | ||||
| 
 | ||||
| 	/* Enable IRQ */ | ||||
| 	if (!rdev->irq.installed) { | ||||
| 		r = radeon_irq_kms_init(rdev); | ||||
| 		if (r) | ||||
| 			return r; | ||||
| 	} | ||||
| 
 | ||||
| 	rs600_irq_set(rdev); | ||||
| 	rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); | ||||
| 	/* 1M ring buffer */ | ||||
|  | @ -295,9 +301,6 @@ int r520_init(struct radeon_device *rdev) | |||
| 	rv515_debugfs(rdev); | ||||
| 	/* Fence driver */ | ||||
| 	r = radeon_fence_driver_init(rdev); | ||||
| 	if (r) | ||||
| 		return r; | ||||
| 	r = radeon_irq_kms_init(rdev); | ||||
| 	if (r) | ||||
| 		return r; | ||||
| 	/* Memory manager */ | ||||
|  |  | |||
|  | @ -1046,6 +1046,24 @@ int r600_mc_wait_for_idle(struct radeon_device *rdev) | |||
| 	return -1; | ||||
| } | ||||
| 
 | ||||
| uint32_t rs780_mc_rreg(struct radeon_device *rdev, uint32_t reg) | ||||
| { | ||||
| 	uint32_t r; | ||||
| 
 | ||||
| 	WREG32(R_0028F8_MC_INDEX, S_0028F8_MC_IND_ADDR(reg)); | ||||
| 	r = RREG32(R_0028FC_MC_DATA); | ||||
| 	WREG32(R_0028F8_MC_INDEX, ~C_0028F8_MC_IND_ADDR); | ||||
| 	return r; | ||||
| } | ||||
| 
 | ||||
| void rs780_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v) | ||||
| { | ||||
| 	WREG32(R_0028F8_MC_INDEX, S_0028F8_MC_IND_ADDR(reg) | | ||||
| 		S_0028F8_MC_IND_WR_EN(1)); | ||||
| 	WREG32(R_0028FC_MC_DATA, v); | ||||
| 	WREG32(R_0028F8_MC_INDEX, 0x7F); | ||||
| } | ||||
| 
 | ||||
| static void r600_mc_program(struct radeon_device *rdev) | ||||
| { | ||||
| 	struct rv515_mc_save save; | ||||
|  | @ -1181,6 +1199,8 @@ static int r600_mc_init(struct radeon_device *rdev) | |||
| { | ||||
| 	u32 tmp; | ||||
| 	int chansize, numchan; | ||||
| 	uint32_t h_addr, l_addr; | ||||
| 	unsigned long long k8_addr; | ||||
| 
 | ||||
| 	/* Get VRAM informations */ | ||||
| 	rdev->mc.vram_is_ddr = true; | ||||
|  | @ -1221,7 +1241,30 @@ static int r600_mc_init(struct radeon_device *rdev) | |||
| 	if (rdev->flags & RADEON_IS_IGP) { | ||||
| 		rs690_pm_info(rdev); | ||||
| 		rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev); | ||||
| 
 | ||||
| 		if (rdev->family == CHIP_RS780 || rdev->family == CHIP_RS880) { | ||||
| 			/* Use K8 direct mapping for fast fb access. */ | ||||
| 			rdev->fastfb_working = false; | ||||
| 			h_addr = G_000012_K8_ADDR_EXT(RREG32_MC(R_000012_MC_MISC_UMA_CNTL)); | ||||
| 			l_addr = RREG32_MC(R_000011_K8_FB_LOCATION); | ||||
| 			k8_addr = ((unsigned long long)h_addr) << 32 | l_addr; | ||||
| #if defined(CONFIG_X86_32) && !defined(CONFIG_X86_PAE) | ||||
| 			if (k8_addr + rdev->mc.visible_vram_size < 0x100000000ULL) | ||||
| #endif | ||||
| 			{ | ||||
| 				/* FastFB shall be used with UMA memory. Here it is simply disabled when sideport
 | ||||
| 		 		* memory is present. | ||||
| 		 		*/ | ||||
| 				if (rdev->mc.igp_sideport_enabled == false && radeon_fastfb == 1) { | ||||
| 					DRM_INFO("Direct mapping: aper base at 0x%llx, replaced by direct mapping base 0x%llx.\n", | ||||
| 						(unsigned long long)rdev->mc.aper_base, k8_addr); | ||||
| 					rdev->mc.aper_base = (resource_size_t)k8_addr; | ||||
| 					rdev->fastfb_working = true; | ||||
| 				} | ||||
| 			} | ||||
|   		} | ||||
| 	} | ||||
| 
 | ||||
| 	radeon_update_bandwidth_info(rdev); | ||||
| 	return 0; | ||||
| } | ||||
|  | @ -3202,6 +3245,12 @@ static int r600_startup(struct radeon_device *rdev) | |||
| 	} | ||||
| 
 | ||||
| 	/* Enable IRQ */ | ||||
| 	if (!rdev->irq.installed) { | ||||
| 		r = radeon_irq_kms_init(rdev); | ||||
| 		if (r) | ||||
| 			return r; | ||||
| 	} | ||||
| 
 | ||||
| 	r = r600_irq_init(rdev); | ||||
| 	if (r) { | ||||
| 		DRM_ERROR("radeon: IH init failed (%d).\n", r); | ||||
|  | @ -3356,10 +3405,6 @@ int r600_init(struct radeon_device *rdev) | |||
| 	if (r) | ||||
| 		return r; | ||||
| 
 | ||||
| 	r = radeon_irq_kms_init(rdev); | ||||
| 	if (r) | ||||
| 		return r; | ||||
| 
 | ||||
| 	rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL; | ||||
| 	r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024); | ||||
| 
 | ||||
|  |  | |||
|  | @ -1342,6 +1342,14 @@ | |||
| #define	PACKET3_STRMOUT_BASE_UPDATE			0x72 /* r7xx */ | ||||
| #define	PACKET3_SURFACE_BASE_UPDATE			0x73 | ||||
| 
 | ||||
| #define R_000011_K8_FB_LOCATION                 0x11 | ||||
| #define R_000012_MC_MISC_UMA_CNTL               0x12 | ||||
| #define   G_000012_K8_ADDR_EXT(x)               (((x) >> 0) & 0xFF) | ||||
| #define R_0028F8_MC_INDEX			0x28F8 | ||||
| #define   	S_0028F8_MC_IND_ADDR(x)                 (((x) & 0x1FF) << 0) | ||||
| #define   	C_0028F8_MC_IND_ADDR                    0xFFFFFE00 | ||||
| #define   	S_0028F8_MC_IND_WR_EN(x)                (((x) & 0x1) << 9) | ||||
| #define R_0028FC_MC_DATA                        0x28FC | ||||
| 
 | ||||
| #define	R_008020_GRBM_SOFT_RESET		0x8020 | ||||
| #define		S_008020_SOFT_RESET_CP(x)		(((x) & 1) << 0) | ||||
|  |  | |||
|  | @ -122,6 +122,10 @@ static void radeon_register_accessor_init(struct radeon_device *rdev) | |||
| 		rdev->mc_rreg = &rs600_mc_rreg; | ||||
| 		rdev->mc_wreg = &rs600_mc_wreg; | ||||
| 	} | ||||
| 	if (rdev->family == CHIP_RS780 || rdev->family == CHIP_RS880) { | ||||
| 		rdev->mc_rreg = &rs780_mc_rreg; | ||||
| 		rdev->mc_wreg = &rs780_mc_wreg; | ||||
| 	} | ||||
| 	if (rdev->family >= CHIP_R600) { | ||||
| 		rdev->pciep_rreg = &r600_pciep_rreg; | ||||
| 		rdev->pciep_wreg = &r600_pciep_wreg; | ||||
|  |  | |||
|  | @ -347,6 +347,8 @@ extern bool r600_gui_idle(struct radeon_device *rdev); | |||
| extern void r600_pm_misc(struct radeon_device *rdev); | ||||
| extern void r600_pm_init_profile(struct radeon_device *rdev); | ||||
| extern void rs780_pm_init_profile(struct radeon_device *rdev); | ||||
| extern uint32_t rs780_mc_rreg(struct radeon_device *rdev, uint32_t reg); | ||||
| extern void rs780_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); | ||||
| extern void r600_pm_get_dynpm_state(struct radeon_device *rdev); | ||||
| extern void r600_set_pcie_lanes(struct radeon_device *rdev, int lanes); | ||||
| extern int r600_get_pcie_lanes(struct radeon_device *rdev); | ||||
|  |  | |||
|  | @ -417,6 +417,12 @@ static int rs400_startup(struct radeon_device *rdev) | |||
| 	} | ||||
| 
 | ||||
| 	/* Enable IRQ */ | ||||
| 	if (!rdev->irq.installed) { | ||||
| 		r = radeon_irq_kms_init(rdev); | ||||
| 		if (r) | ||||
| 			return r; | ||||
| 	} | ||||
| 
 | ||||
| 	r100_irq_set(rdev); | ||||
| 	rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); | ||||
| 	/* 1M ring buffer */ | ||||
|  | @ -533,9 +539,6 @@ int rs400_init(struct radeon_device *rdev) | |||
| 	rs400_mc_init(rdev); | ||||
| 	/* Fence driver */ | ||||
| 	r = radeon_fence_driver_init(rdev); | ||||
| 	if (r) | ||||
| 		return r; | ||||
| 	r = radeon_irq_kms_init(rdev); | ||||
| 	if (r) | ||||
| 		return r; | ||||
| 	/* Memory manager */ | ||||
|  |  | |||
|  | @ -923,6 +923,12 @@ static int rs600_startup(struct radeon_device *rdev) | |||
| 	} | ||||
| 
 | ||||
| 	/* Enable IRQ */ | ||||
| 	if (!rdev->irq.installed) { | ||||
| 		r = radeon_irq_kms_init(rdev); | ||||
| 		if (r) | ||||
| 			return r; | ||||
| 	} | ||||
| 
 | ||||
| 	rs600_irq_set(rdev); | ||||
| 	rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); | ||||
| 	/* 1M ring buffer */ | ||||
|  | @ -1045,9 +1051,6 @@ int rs600_init(struct radeon_device *rdev) | |||
| 	rs600_debugfs(rdev); | ||||
| 	/* Fence driver */ | ||||
| 	r = radeon_fence_driver_init(rdev); | ||||
| 	if (r) | ||||
| 		return r; | ||||
| 	r = radeon_irq_kms_init(rdev); | ||||
| 	if (r) | ||||
| 		return r; | ||||
| 	/* Memory manager */ | ||||
|  |  | |||
|  | @ -651,6 +651,12 @@ static int rs690_startup(struct radeon_device *rdev) | |||
| 	} | ||||
| 
 | ||||
| 	/* Enable IRQ */ | ||||
| 	if (!rdev->irq.installed) { | ||||
| 		r = radeon_irq_kms_init(rdev); | ||||
| 		if (r) | ||||
| 			return r; | ||||
| 	} | ||||
| 
 | ||||
| 	rs600_irq_set(rdev); | ||||
| 	rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); | ||||
| 	/* 1M ring buffer */ | ||||
|  | @ -774,9 +780,6 @@ int rs690_init(struct radeon_device *rdev) | |||
| 	rv515_debugfs(rdev); | ||||
| 	/* Fence driver */ | ||||
| 	r = radeon_fence_driver_init(rdev); | ||||
| 	if (r) | ||||
| 		return r; | ||||
| 	r = radeon_irq_kms_init(rdev); | ||||
| 	if (r) | ||||
| 		return r; | ||||
| 	/* Memory manager */ | ||||
|  |  | |||
|  | @ -532,6 +532,12 @@ static int rv515_startup(struct radeon_device *rdev) | |||
| 	} | ||||
| 
 | ||||
| 	/* Enable IRQ */ | ||||
| 	if (!rdev->irq.installed) { | ||||
| 		r = radeon_irq_kms_init(rdev); | ||||
| 		if (r) | ||||
| 			return r; | ||||
| 	} | ||||
| 
 | ||||
| 	rs600_irq_set(rdev); | ||||
| 	rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); | ||||
| 	/* 1M ring buffer */ | ||||
|  | @ -660,9 +666,6 @@ int rv515_init(struct radeon_device *rdev) | |||
| 	rv515_debugfs(rdev); | ||||
| 	/* Fence driver */ | ||||
| 	r = radeon_fence_driver_init(rdev); | ||||
| 	if (r) | ||||
| 		return r; | ||||
| 	r = radeon_irq_kms_init(rdev); | ||||
| 	if (r) | ||||
| 		return r; | ||||
| 	/* Memory manager */ | ||||
|  |  | |||
|  | @ -1887,6 +1887,12 @@ static int rv770_startup(struct radeon_device *rdev) | |||
| 		rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0; | ||||
| 
 | ||||
| 	/* Enable IRQ */ | ||||
| 	if (!rdev->irq.installed) { | ||||
| 		r = radeon_irq_kms_init(rdev); | ||||
| 		if (r) | ||||
| 			return r; | ||||
| 	} | ||||
| 
 | ||||
| 	r = r600_irq_init(rdev); | ||||
| 	if (r) { | ||||
| 		DRM_ERROR("radeon: IH init failed (%d).\n", r); | ||||
|  | @ -2045,10 +2051,6 @@ int rv770_init(struct radeon_device *rdev) | |||
| 	if (r) | ||||
| 		return r; | ||||
| 
 | ||||
| 	r = radeon_irq_kms_init(rdev); | ||||
| 	if (r) | ||||
| 		return r; | ||||
| 
 | ||||
| 	rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL; | ||||
| 	r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024); | ||||
| 
 | ||||
|  |  | |||
|  | @ -5350,6 +5350,12 @@ static int si_startup(struct radeon_device *rdev) | |||
| 	} | ||||
| 
 | ||||
| 	/* Enable IRQ */ | ||||
| 	if (!rdev->irq.installed) { | ||||
| 		r = radeon_irq_kms_init(rdev); | ||||
| 		if (r) | ||||
| 			return r; | ||||
| 	} | ||||
| 
 | ||||
| 	r = si_irq_init(rdev); | ||||
| 	if (r) { | ||||
| 		DRM_ERROR("radeon: IH init failed (%d).\n", r); | ||||
|  | @ -5533,10 +5539,6 @@ int si_init(struct radeon_device *rdev) | |||
| 	if (r) | ||||
| 		return r; | ||||
| 
 | ||||
| 	r = radeon_irq_kms_init(rdev); | ||||
| 	if (r) | ||||
| 		return r; | ||||
| 
 | ||||
| 	ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; | ||||
| 	ring->ring_obj = NULL; | ||||
| 	r600_ring_init(rdev, ring, 1024 * 1024); | ||||
|  |  | |||
|  | @ -6,6 +6,7 @@ config DRM_TILCDC | |||
| 	select DRM_GEM_CMA_HELPER | ||||
| 	select VIDEOMODE_HELPERS | ||||
| 	select BACKLIGHT_CLASS_DEVICE | ||||
| 	select BACKLIGHT_LCD_SUPPORT | ||||
| 	help | ||||
| 	  Choose this option if you have an TI SoC with LCDC display | ||||
| 	  controller, for example AM33xx in beagle-bone, DA8xx, or | ||||
|  |  | |||
|  | @ -64,7 +64,7 @@ struct iio_cb_buffer *iio_channel_get_all_cb(struct device *dev, | |||
| 	while (chan->indio_dev) { | ||||
| 		if (chan->indio_dev != indio_dev) { | ||||
| 			ret = -EINVAL; | ||||
| 			goto error_release_channels; | ||||
| 			goto error_free_scan_mask; | ||||
| 		} | ||||
| 		set_bit(chan->channel->scan_index, | ||||
| 			cb_buff->buffer.scan_mask); | ||||
|  | @ -73,6 +73,8 @@ struct iio_cb_buffer *iio_channel_get_all_cb(struct device *dev, | |||
| 
 | ||||
| 	return cb_buff; | ||||
| 
 | ||||
| error_free_scan_mask: | ||||
| 	kfree(cb_buff->buffer.scan_mask); | ||||
| error_release_channels: | ||||
| 	iio_channel_release_all(cb_buff->channels); | ||||
| error_free_cb_buff: | ||||
|  | @ -100,6 +102,7 @@ EXPORT_SYMBOL_GPL(iio_channel_stop_all_cb); | |||
| 
 | ||||
| void iio_channel_release_all_cb(struct iio_cb_buffer *cb_buff) | ||||
| { | ||||
| 	kfree(cb_buff->buffer.scan_mask); | ||||
| 	iio_channel_release_all(cb_buff->channels); | ||||
| 	kfree(cb_buff); | ||||
| } | ||||
|  |  | |||
Some files were not shown because too many files have changed in this diff Show more
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Mark Brown
				Mark Brown