RTEMS  5.1
cpuIdent.h
1 /*
2  * Copyright (C) 1999 Eric Valette (valette@crf.canon.fr)
3  * Canon Centre Recherche France.
4  *
5  * Added MPC8260 Andy Dachs <a.dachs@sstl.co.uk>
6  * Surrey Satellite Technology Limited
7  *
8  *
9  * The license and distribution terms for this file may be
10  * found in the file LICENSE in this distribution or at
11  * http://www.rtems.org/license/LICENSE.
12  */
13 
14 #ifndef _LIBCPU_CPUIDENT_H
15 #define _LIBCPU_CPUIDENT_H
16 
17 #include <stdbool.h>
18 
19 #ifdef __cplusplus
20 extern "C" {
21 #endif
22 
23 #ifndef ASM
24 typedef enum
25 {
26  PPC_601 = 0x1,
27  PPC_5XX = 0x2,
28  PPC_603 = 0x3,
29  PPC_604 = 0x4,
30  PPC_603e = 0x6,
31  PPC_603ev = 0x7,
32  PPC_750 = 0x8,
33  PPC_750_IBM = 0x7000,
34  PPC_604e = 0x9,
35  PPC_604r = 0xA,
36  PPC_7400 = 0xC,
37  PPC_405 = 0x2001, /* Xilinx Virtex-II Pro or -4 */
38  PPC_405EX = 0x1291, /* + 405EXr */
39  PPC_405GP = 0x4011, /* + 405CR */
40  PPC_405GPr = 0x5091,
41  PPC_405EZ = 0x4151,
42  PPC_405EP = 0x5121,
43  PPC_440 = 0x7ff2, /* Xilinx Virtex-5*/
44  PPC_7455 = 0x8001, /* Kate Feng */
45  PPC_7457 = 0x8002,
46  PPC_620 = 0x16,
47  PPC_860 = 0x50,
48  PPC_821 = PPC_860,
49  PPC_823 = PPC_860,
50  PPC_8260 = 0x81,
51  PPC_8240 = PPC_8260,
52  PPC_8245 = 0x8081,
53  PPC_8540 = 0x8020,
54  PPC_e500v2 = 0x8021,
55  PPC_e6500 = 0x8040,
56  PPC_603le = 0x8082, /* 603le core, in MGT5100 and MPC5200 */
57  PPC_e300c1 = 0x8083, /* e300c1 core, in MPC83xx*/
58  PPC_e300c2 = 0x8084, /* e300c2 core */
59  PPC_e300c3 = 0x8085, /* e300c3 core */
60  PPC_e200z0 = 0x8170,
61  PPC_e200z1 = 0x8140,
62  PPC_e200z4 = 0x8150,
63  PPC_e200z6 = 0x8110,
64  PPC_e200z7 = 0x8160,
65  PPC_PSIM = 0xfffe, /* GDB PowerPC simulator -- fake version */
66  PPC_UNKNOWN = 0xffff
67 } ppc_cpu_id_t;
68 
69 /* Bitfield of for identifying features or groups of cpu flavors.
70  * DO NOT USE DIRECTLY (as implementation may change)
71  * only use the 'ppc_is_xxx() / ppc_has_xxx()' macros/inlines
72  * below.
73  */
74 
75 typedef struct {
76  unsigned has_altivec : 1;
77  unsigned has_fpu : 1;
78  unsigned has_hw_ptbl_lkup : 1;
79 #define PPC_BOOKE_405 1 /* almost like booke but with some significant differences */
80 #define PPC_BOOKE_STD 2
81 #define PPC_BOOKE_E500 3 /* bookE with extensions */
82  unsigned is_bookE : 2;
83  unsigned has_16byte_clne : 1;
84  unsigned is_60x : 1;
85  unsigned has_8_bats : 1;
86  unsigned has_epic : 1;
87  unsigned has_shadowed_gprs : 1;
89 
90 extern ppc_feature_t current_ppc_features;
91 extern ppc_cpu_id_t current_ppc_cpu;
92 
93 typedef unsigned short ppc_cpu_revision_t;
94 
95 extern ppc_cpu_id_t get_ppc_cpu_type (void);
96 extern const char *get_ppc_cpu_type_name(ppc_cpu_id_t cpu);
97 extern ppc_cpu_revision_t get_ppc_cpu_revision (void);
98 extern ppc_cpu_revision_t current_ppc_revision;
99 
100 /* PUBLIC ACCESS ROUTINES */
101 #define _PPC_FEAT_DECL(x) \
102 static inline unsigned ppc_cpu_##x(void) { \
103  if ( PPC_UNKNOWN == current_ppc_cpu ) \
104  get_ppc_cpu_type(); \
105  return current_ppc_features.x; \
106 }
107 
108 _PPC_FEAT_DECL(has_altivec)
109 /* has_fpu not implemented yet */
110 _PPC_FEAT_DECL(has_hw_ptbl_lkup)
111 _PPC_FEAT_DECL(is_bookE)
112 _PPC_FEAT_DECL(is_60x)
113 _PPC_FEAT_DECL(has_8_bats)
114 _PPC_FEAT_DECL(has_epic)
115 _PPC_FEAT_DECL(has_shadowed_gprs)
116 
117 #undef _PPC_FEAT_DECL
118 
119 static inline ppc_cpu_id_t ppc_cpu_current(void)
120 {
121  return current_ppc_cpu;
122 }
123 
124 static inline bool ppc_cpu_is_e200(void)
125 {
126  return (ppc_cpu_current() & 0xff80) == 0x8100;
127 }
128 
129 static inline bool ppc_cpu_is_specific_e200(ppc_cpu_id_t id)
130 {
131  return (ppc_cpu_current() & 0xfff0) == id;
132 }
133 
134 static inline bool ppc_cpu_is_e300(void)
135 {
136  return ppc_cpu_current() == PPC_e300c1
137  || ppc_cpu_current() == PPC_e300c2
138  || ppc_cpu_current() == PPC_e300c3;
139 }
140 
141 static inline bool ppc_cpu_is_e500(void)
142 {
143  return ppc_cpu_current() == PPC_8540
144  || ppc_cpu_current() == PPC_e500v2;
145 }
146 
147 static inline bool ppc_cpu_is(ppc_cpu_id_t cpu)
148 {
149  return ppc_cpu_current() == cpu;
150 }
151 
152 #endif /* ASM */
153 
154 #ifdef __cplusplus
155 }
156 #endif
157 
158 #endif
Definition: cpuIdent.h:75