1*644e9cbbSAndi Kleen #include <asm/cpu_device_id.h> 2*644e9cbbSAndi Kleen #include <asm/processor.h> 3*644e9cbbSAndi Kleen #include <linux/cpu.h> 4*644e9cbbSAndi Kleen #include <linux/module.h> 5*644e9cbbSAndi Kleen 6*644e9cbbSAndi Kleen /** 7*644e9cbbSAndi Kleen * x86_match_cpu - match current CPU again an array of x86_cpu_ids 8*644e9cbbSAndi Kleen * @match: Pointer to array of x86_cpu_ids. Last entry terminated with 9*644e9cbbSAndi Kleen * {}. 10*644e9cbbSAndi Kleen * 11*644e9cbbSAndi Kleen * Return the entry if the current CPU matches the entries in the 12*644e9cbbSAndi Kleen * passed x86_cpu_id match table. Otherwise NULL. The match table 13*644e9cbbSAndi Kleen * contains vendor (X86_VENDOR_*), family, model and feature bits or 14*644e9cbbSAndi Kleen * respective wildcard entries. 15*644e9cbbSAndi Kleen * 16*644e9cbbSAndi Kleen * A typical table entry would be to match a specific CPU 17*644e9cbbSAndi Kleen * { X86_VENDOR_INTEL, 6, 0x12 } 18*644e9cbbSAndi Kleen * or to match a specific CPU feature 19*644e9cbbSAndi Kleen * { X86_FEATURE_MATCH(X86_FEATURE_FOOBAR) } 20*644e9cbbSAndi Kleen * 21*644e9cbbSAndi Kleen * Fields can be wildcarded with %X86_VENDOR_ANY, %X86_FAMILY_ANY, 22*644e9cbbSAndi Kleen * %X86_MODEL_ANY, %X86_FEATURE_ANY or 0 (except for vendor) 23*644e9cbbSAndi Kleen * 24*644e9cbbSAndi Kleen * Arrays used to match for this should also be declared using 25*644e9cbbSAndi Kleen * MODULE_DEVICE_TABLE(x86_cpu, ...) 26*644e9cbbSAndi Kleen * 27*644e9cbbSAndi Kleen * This always matches against the boot cpu, assuming models and features are 28*644e9cbbSAndi Kleen * consistent over all CPUs. 29*644e9cbbSAndi Kleen */ 30*644e9cbbSAndi Kleen const struct x86_cpu_id *x86_match_cpu(const struct x86_cpu_id *match) 31*644e9cbbSAndi Kleen { 32*644e9cbbSAndi Kleen const struct x86_cpu_id *m; 33*644e9cbbSAndi Kleen struct cpuinfo_x86 *c = &boot_cpu_data; 34*644e9cbbSAndi Kleen 35*644e9cbbSAndi Kleen for (m = match; m->vendor | m->family | m->model | m->feature; m++) { 36*644e9cbbSAndi Kleen if (m->vendor != X86_VENDOR_ANY && c->x86_vendor != m->vendor) 37*644e9cbbSAndi Kleen continue; 38*644e9cbbSAndi Kleen if (m->family != X86_FAMILY_ANY && c->x86 != m->family) 39*644e9cbbSAndi Kleen continue; 40*644e9cbbSAndi Kleen if (m->model != X86_MODEL_ANY && c->x86_model != m->model) 41*644e9cbbSAndi Kleen continue; 42*644e9cbbSAndi Kleen if (m->feature != X86_FEATURE_ANY && !cpu_has(c, m->feature)) 43*644e9cbbSAndi Kleen continue; 44*644e9cbbSAndi Kleen return m; 45*644e9cbbSAndi Kleen } 46*644e9cbbSAndi Kleen return NULL; 47*644e9cbbSAndi Kleen } 48*644e9cbbSAndi Kleen EXPORT_SYMBOL(x86_match_cpu); 49