Changeset 6b781c0 in mainline for kernel/arch/arm32/src/cpu/cpu.c
- Timestamp:
- 2007-06-08T15:02:49Z (18 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- c03ee1c
- Parents:
- 3ee8a075
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/arm32/src/cpu/cpu.c
r3ee8a075 r6b781c0 1 1 /* 2 * Copyright (c) 200 3-2004 Jakub Jermar2 * Copyright (c) 2007 Michal Kebrt 3 3 * All rights reserved. 4 4 * … … 31 31 */ 32 32 /** @file 33 * @brief CPU identification. 33 34 */ 34 35 36 #include <arch/cpu.h> 35 37 #include <cpu.h> 38 #include <arch.h> 36 39 #include <print.h> 37 40 41 /** Number of indexes left out in the #imp_data array */ 42 #define IMP_DATA_START_OFFSET 0x40 43 44 /** Implementators (vendor) names */ 45 static char *imp_data[] = { 46 "?", /* IMP_DATA_START_OFFSET */ 47 "ARM Ltd", /* 0x41 */ 48 "", /* 0x42 */ 49 "", /* 0x43 */ 50 "Digital Equipment Corporation", /* 0x44 */ 51 "", "", "", "", "", "", "", "", "", "", /* 0x45 - 0x4e */ 52 "", "", "", "", "", "", "", "", "", "", /* 0x4f - 0x58 */ 53 "", "", "", "", "", "", "", "", "", "", /* 0x59 - 0x62 */ 54 "", "", "", "", "", "", /* 0x63 - 0x68 */ 55 "Intel Corporation" /* 0x69 */ 56 }; 57 58 /** Length of the #imp_data array */ 59 static int imp_data_length = sizeof(imp_data) / sizeof(char *); 60 61 /** Architecture names */ 62 static char *arch_data[] = { 63 "?", /* 0x0 */ 64 "4", /* 0x1 */ 65 "4T", /* 0x2 */ 66 "5", /* 0x3 */ 67 "5T", /* 0x4 */ 68 "5TE", /* 0x5 */ 69 "5TEJ", /* 0x6 */ 70 "6" /* 0x7 */ 71 }; 72 73 /** Length of the #arch_data array */ 74 static int arch_data_length = sizeof(arch_data) / sizeof(char *); 75 76 77 /** Retrieves processor identification from CP15 register 0. 78 * 79 * @param cpu Structure for storing CPU identification. 80 */ 81 static void arch_cpu_identify(cpu_arch_t *cpu) 82 { 83 uint32_t ident; 84 asm volatile ( 85 "mrc p15, 0, %0, c0, c0, 0\n" 86 : "=r" (ident) 87 ); 88 89 cpu->imp_num = ident >> 24; 90 cpu->variant_num = (ident << 8) >> 28; 91 cpu->arch_num = (ident << 12) >> 28; 92 cpu->prim_part_num = (ident << 16) >> 20; 93 cpu->rev_num = (ident << 28) >> 28; 94 } 95 96 /** Does nothing on ARM. */ 38 97 void cpu_arch_init(void) 39 98 { 40 99 } 41 100 42 void cpu_identify(void) 101 /** Retrieves processor identification and stores it to #CPU.arch */ 102 void cpu_identify(void) 43 103 { 44 /* TODO */104 arch_cpu_identify(&CPU->arch); 45 105 } 46 106 107 /** Prints CPU identification. */ 47 108 void cpu_print_report(cpu_t *m) 48 109 { 49 /* TODO */ 110 char * vendor = imp_data[0]; 111 char * architecture = arch_data[0]; 112 cpu_arch_t * cpu_arch = &m->arch; 113 114 if ((cpu_arch->imp_num) > 0 && 115 (cpu_arch->imp_num < (imp_data_length + IMP_DATA_START_OFFSET))) { 116 vendor = imp_data[cpu_arch->imp_num - IMP_DATA_START_OFFSET]; 117 } 118 119 if ((cpu_arch->arch_num) > 0 && 120 (cpu_arch->arch_num < arch_data_length)) { 121 architecture = arch_data[cpu_arch->arch_num]; 122 } 123 124 printf("cpu%d: vendor=%s, architecture=ARM%s, part number=%x, " 125 "variant=%x, revision=%x\n", 126 m->id, vendor, architecture, cpu_arch->prim_part_num, 127 cpu_arch->variant_num, cpu_arch->rev_num); 50 128 } 51 129
Note:
See TracChangeset
for help on using the changeset viewer.