Changeset 6b781c0 in mainline for kernel/arch/arm32/src/cpu/cpu.c


Ignore:
Timestamp:
2007-06-08T15:02:49Z (18 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
c03ee1c
Parents:
3ee8a075
Message:

Merge arm32 into trunk.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/arm32/src/cpu/cpu.c

    r3ee8a075 r6b781c0  
    11/*
    2  * Copyright (c) 2003-2004 Jakub Jermar
     2 * Copyright (c) 2007 Michal Kebrt
    33 * All rights reserved.
    44 *
     
    3131 */
    3232/** @file
     33 *  @brief CPU identification.
    3334 */
    3435
     36#include <arch/cpu.h>
    3537#include <cpu.h>
     38#include <arch.h>
    3639#include <print.h>     
    3740
     41/** Number of indexes left out in the #imp_data array */
     42#define IMP_DATA_START_OFFSET 0x40
     43
     44/** Implementators (vendor) names */
     45static 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 */
     59static int imp_data_length = sizeof(imp_data) / sizeof(char *);
     60
     61/** Architecture names */
     62static 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 */
     74static 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 */
     81static 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. */
    3897void cpu_arch_init(void)
    3998{
    4099}
    41100
    42 void cpu_identify(void)
     101/** Retrieves processor identification and stores it to #CPU.arch */
     102void cpu_identify(void)
    43103{
    44         /* TODO */
     104        arch_cpu_identify(&CPU->arch);
    45105}
    46106
     107/** Prints CPU identification. */
    47108void cpu_print_report(cpu_t *m)
    48109{
    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);
    50128}
    51129
Note: See TracChangeset for help on using the changeset viewer.