1#include <linux/kernel.h> 2#include <linux/init.h> 3#include <linux/string.h> 4#include <asm/processor.h> 5 6#include "cpu.h" 7 8/* 9 * Detect a NexGen CPU running without BIOS hypercode new enough 10 * to have CPUID. (Thanks to Herbert Oppmann) 11 */ 12 13static int __cpuinit deep_magic_nexgen_probe(void) 14{ 15 int ret; 16 17 __asm__ __volatile__ ( 18 " movw $0x5555, %%ax\n" 19 " xorw %%dx,%%dx\n" 20 " movw $2, %%cx\n" 21 " divw %%cx\n" 22 " movl $0, %%eax\n" 23 " jnz 1f\n" 24 " movl $1, %%eax\n" 25 "1:\n" 26 : "=a" (ret) : : "cx", "dx" ); 27 return ret; 28} 29 30static void __cpuinit init_nexgen(struct cpuinfo_x86 * c) 31{ 32 c->x86_cache_size = 256; /* A few had 1 MB... */ 33} 34 35static void __cpuinit nexgen_identify(struct cpuinfo_x86 * c) 36{ 37 /* Detect NexGen with old hypercode */ 38 if ( deep_magic_nexgen_probe() ) { 39 strcpy(c->x86_vendor_id, "NexGenDriven"); 40 } 41} 42 43static struct cpu_dev nexgen_cpu_dev __cpuinitdata = { 44 .c_vendor = "Nexgen", 45 .c_ident = { "NexGenDriven" }, 46 .c_models = { 47 { .vendor = X86_VENDOR_NEXGEN, 48 .family = 5, 49 .model_names = { [1] = "Nx586" } 50 }, 51 }, 52 .c_init = init_nexgen, 53 .c_identify = nexgen_identify, 54}; 55 56int __init nexgen_init_cpu(void) 57{ 58 cpu_devs[X86_VENDOR_NEXGEN] = &nexgen_cpu_dev; 59 return 0; 60} 61