linux/arch/x86/kernel/cpu/transmeta.c
<<
>>
Prefs
   1#include <linux/kernel.h>
   2#include <linux/mm.h>
   3#include <asm/processor.h>
   4#include <asm/msr.h>
   5#include "cpu.h"
   6
   7static void early_init_transmeta(struct cpuinfo_x86 *c)
   8{
   9        u32 xlvl;
  10
  11        /* Transmeta-defined flags: level 0x80860001 */
  12        xlvl = cpuid_eax(0x80860000);
  13        if ((xlvl & 0xffff0000) == 0x80860000) {
  14                if (xlvl >= 0x80860001)
  15                        c->x86_capability[2] = cpuid_edx(0x80860001);
  16        }
  17}
  18
  19static void init_transmeta(struct cpuinfo_x86 *c)
  20{
  21        unsigned int cap_mask, uk, max, dummy;
  22        unsigned int cms_rev1, cms_rev2;
  23        unsigned int cpu_rev, cpu_freq = 0, cpu_flags, new_cpu_rev;
  24        char cpu_info[65];
  25
  26        early_init_transmeta(c);
  27
  28        cpu_detect_cache_sizes(c);
  29
  30        /* Print CMS and CPU revision */
  31        max = cpuid_eax(0x80860000);
  32        cpu_rev = 0;
  33        if (max >= 0x80860001) {
  34                cpuid(0x80860001, &dummy, &cpu_rev, &cpu_freq, &cpu_flags);
  35                if (cpu_rev != 0x02000000) {
  36                        printk(KERN_INFO "CPU: Processor revision %u.%u.%u.%u, %u MHz\n",
  37                                (cpu_rev >> 24) & 0xff,
  38                                (cpu_rev >> 16) & 0xff,
  39                                (cpu_rev >> 8) & 0xff,
  40                                cpu_rev & 0xff,
  41                                cpu_freq);
  42                }
  43        }
  44        if (max >= 0x80860002) {
  45                cpuid(0x80860002, &new_cpu_rev, &cms_rev1, &cms_rev2, &dummy);
  46                if (cpu_rev == 0x02000000) {
  47                        printk(KERN_INFO "CPU: Processor revision %08X, %u MHz\n",
  48                                new_cpu_rev, cpu_freq);
  49                }
  50                printk(KERN_INFO "CPU: Code Morphing Software revision %u.%u.%u-%u-%u\n",
  51                       (cms_rev1 >> 24) & 0xff,
  52                       (cms_rev1 >> 16) & 0xff,
  53                       (cms_rev1 >> 8) & 0xff,
  54                       cms_rev1 & 0xff,
  55                       cms_rev2);
  56        }
  57        if (max >= 0x80860006) {
  58                cpuid(0x80860003,
  59                      (void *)&cpu_info[0],
  60                      (void *)&cpu_info[4],
  61                      (void *)&cpu_info[8],
  62                      (void *)&cpu_info[12]);
  63                cpuid(0x80860004,
  64                      (void *)&cpu_info[16],
  65                      (void *)&cpu_info[20],
  66                      (void *)&cpu_info[24],
  67                      (void *)&cpu_info[28]);
  68                cpuid(0x80860005,
  69                      (void *)&cpu_info[32],
  70                      (void *)&cpu_info[36],
  71                      (void *)&cpu_info[40],
  72                      (void *)&cpu_info[44]);
  73                cpuid(0x80860006,
  74                      (void *)&cpu_info[48],
  75                      (void *)&cpu_info[52],
  76                      (void *)&cpu_info[56],
  77                      (void *)&cpu_info[60]);
  78                cpu_info[64] = '\0';
  79                printk(KERN_INFO "CPU: %s\n", cpu_info);
  80        }
  81
  82        /* Unhide possibly hidden capability flags */
  83        rdmsr(0x80860004, cap_mask, uk);
  84        wrmsr(0x80860004, ~0, uk);
  85        c->x86_capability[0] = cpuid_edx(0x00000001);
  86        wrmsr(0x80860004, cap_mask, uk);
  87
  88        /* All Transmeta CPUs have a constant TSC */
  89        set_cpu_cap(c, X86_FEATURE_CONSTANT_TSC);
  90
  91#ifdef CONFIG_SYSCTL
  92        /*
  93         * randomize_va_space slows us down enormously;
  94         * it probably triggers retranslation of x86->native bytecode
  95         */
  96        randomize_va_space = 0;
  97#endif
  98}
  99
 100static const struct cpu_dev transmeta_cpu_dev = {
 101        .c_vendor       = "Transmeta",
 102        .c_ident        = { "GenuineTMx86", "TransmetaCPU" },
 103        .c_early_init   = early_init_transmeta,
 104        .c_init         = init_transmeta,
 105        .c_x86_vendor   = X86_VENDOR_TRANSMETA,
 106};
 107
 108cpu_dev_register(transmeta_cpu_dev);
 109