forked from mirrors/linux
		
	ARM: 7680/1: Detect support for SDIV/UDIV from ISAR0 register
The ISAR0 register indicates support for the SDIV and UDIV instructions in both the Thumb and ARM instruction set. Read the register to detect the supported instructions and update the elf_hwcap mask as appropriate. This is better than adding more and more cpuid checks in proc-v7.S for each new cpu variant that supports these instructions. Acked-by: Will Deacon <will.deacon@arm.com> Cc: Stepan Moskovchenko <stepanm@codeaurora.org> Signed-off-by: Stephen Boyd <sboyd@codeaurora.org> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
		
							parent
							
								
									c40e364167
								
							
						
					
					
						commit
						8164f7af88
					
				
					 2 changed files with 22 additions and 2 deletions
				
			
		| 
						 | 
					@ -353,6 +353,23 @@ void __init early_print(const char *str, ...)
 | 
				
			||||||
	printk("%s", buf);
 | 
						printk("%s", buf);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void __init cpuid_init_hwcaps(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						unsigned int divide_instrs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (cpu_architecture() < CPU_ARCH_ARMv7)
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						divide_instrs = (read_cpuid_ext(CPUID_EXT_ISAR0) & 0x0f000000) >> 24;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						switch (divide_instrs) {
 | 
				
			||||||
 | 
						case 2:
 | 
				
			||||||
 | 
							elf_hwcap |= HWCAP_IDIVA;
 | 
				
			||||||
 | 
						case 1:
 | 
				
			||||||
 | 
							elf_hwcap |= HWCAP_IDIVT;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void __init feat_v6_fixup(void)
 | 
					static void __init feat_v6_fixup(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int id = read_cpuid_id();
 | 
						int id = read_cpuid_id();
 | 
				
			||||||
| 
						 | 
					@ -483,6 +500,9 @@ static void __init setup_processor(void)
 | 
				
			||||||
	snprintf(elf_platform, ELF_PLATFORM_SIZE, "%s%c",
 | 
						snprintf(elf_platform, ELF_PLATFORM_SIZE, "%s%c",
 | 
				
			||||||
		 list->elf_name, ENDIANNESS);
 | 
							 list->elf_name, ENDIANNESS);
 | 
				
			||||||
	elf_hwcap = list->elf_hwcap;
 | 
						elf_hwcap = list->elf_hwcap;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cpuid_init_hwcaps();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef CONFIG_ARM_THUMB
 | 
					#ifndef CONFIG_ARM_THUMB
 | 
				
			||||||
	elf_hwcap &= ~(HWCAP_THUMB | HWCAP_IDIVT);
 | 
						elf_hwcap &= ~(HWCAP_THUMB | HWCAP_IDIVT);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -420,7 +420,7 @@ __v7_pj4b_proc_info:
 | 
				
			||||||
__v7_ca7mp_proc_info:
 | 
					__v7_ca7mp_proc_info:
 | 
				
			||||||
	.long	0x410fc070
 | 
						.long	0x410fc070
 | 
				
			||||||
	.long	0xff0ffff0
 | 
						.long	0xff0ffff0
 | 
				
			||||||
	__v7_proc __v7_ca7mp_setup, hwcaps = HWCAP_IDIV
 | 
						__v7_proc __v7_ca7mp_setup
 | 
				
			||||||
	.size	__v7_ca7mp_proc_info, . - __v7_ca7mp_proc_info
 | 
						.size	__v7_ca7mp_proc_info, . - __v7_ca7mp_proc_info
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
| 
						 | 
					@ -430,7 +430,7 @@ __v7_ca7mp_proc_info:
 | 
				
			||||||
__v7_ca15mp_proc_info:
 | 
					__v7_ca15mp_proc_info:
 | 
				
			||||||
	.long	0x410fc0f0
 | 
						.long	0x410fc0f0
 | 
				
			||||||
	.long	0xff0ffff0
 | 
						.long	0xff0ffff0
 | 
				
			||||||
	__v7_proc __v7_ca15mp_setup, hwcaps = HWCAP_IDIV
 | 
						__v7_proc __v7_ca15mp_setup
 | 
				
			||||||
	.size	__v7_ca15mp_proc_info, . - __v7_ca15mp_proc_info
 | 
						.size	__v7_ca15mp_proc_info, . - __v7_ca15mp_proc_info
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue