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.com/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_604e = 0x9, |
---|
34 | PPC_604r = 0xA, |
---|
35 | PPC_7400 = 0xC, |
---|
36 | PPC_405 = 0x2001, /* Xilinx Virtex-II Pro or -4 */ |
---|
37 | PPC_405EX = 0x1291, /* + 405EXr */ |
---|
38 | PPC_405GP = 0x4011, /* + 405CR */ |
---|
39 | PPC_405GPr = 0x5091, |
---|
40 | PPC_405EZ = 0x4151, |
---|
41 | PPC_405EP = 0x5121, |
---|
42 | PPC_440 = 0x7ff2, /* Xilinx Virtex-5*/ |
---|
43 | PPC_7455 = 0x8001, /* Kate Feng */ |
---|
44 | PPC_7457 = 0x8002, |
---|
45 | PPC_620 = 0x16, |
---|
46 | PPC_860 = 0x50, |
---|
47 | PPC_821 = PPC_860, |
---|
48 | PPC_823 = PPC_860, |
---|
49 | PPC_8260 = 0x81, |
---|
50 | PPC_8240 = PPC_8260, |
---|
51 | PPC_8245 = 0x8081, |
---|
52 | PPC_8540 = 0x8020, |
---|
53 | PPC_e500v2 = 0x8021, |
---|
54 | PPC_603le = 0x8082, /* 603le core, in MGT5100 and MPC5200 */ |
---|
55 | PPC_e300c1 = 0x8083, /* e300c1 core, in MPC83xx*/ |
---|
56 | PPC_e300c2 = 0x8084, /* e300c2 core */ |
---|
57 | PPC_e300c3 = 0x8085, /* e300c3 core */ |
---|
58 | PPC_e200z0 = 0x8170, |
---|
59 | PPC_e200z1 = 0x8140, |
---|
60 | PPC_e200z4 = 0x8150, |
---|
61 | PPC_e200z6 = 0x8110, |
---|
62 | PPC_e200z7 = 0x8160, |
---|
63 | PPC_PSIM = 0xfffe, /* GDB PowerPC simulator -- fake version */ |
---|
64 | PPC_UNKNOWN = 0xffff |
---|
65 | } ppc_cpu_id_t; |
---|
66 | |
---|
67 | /* Bitfield of for identifying features or groups of cpu flavors. |
---|
68 | * DO NOT USE DIRECTLY (as implementation may change) |
---|
69 | * only use the 'ppc_is_xxx() / ppc_has_xxx()' macros/inlines |
---|
70 | * below. |
---|
71 | */ |
---|
72 | |
---|
73 | typedef struct { |
---|
74 | unsigned has_altivec : 1; |
---|
75 | unsigned has_fpu : 1; |
---|
76 | unsigned has_hw_ptbl_lkup : 1; |
---|
77 | #define PPC_BOOKE_405 1 /* almost like booke but with some significant differences */ |
---|
78 | #define PPC_BOOKE_STD 2 |
---|
79 | #define PPC_BOOKE_E500 3 /* bookE with extensions */ |
---|
80 | unsigned is_bookE : 2; |
---|
81 | unsigned has_16byte_clne : 1; |
---|
82 | unsigned is_60x : 1; |
---|
83 | unsigned has_8_bats : 1; |
---|
84 | unsigned has_epic : 1; |
---|
85 | unsigned has_shadowed_gprs : 1; |
---|
86 | } ppc_feature_t; |
---|
87 | |
---|
88 | extern ppc_feature_t current_ppc_features; |
---|
89 | extern ppc_cpu_id_t current_ppc_cpu; |
---|
90 | |
---|
91 | typedef unsigned short ppc_cpu_revision_t; |
---|
92 | |
---|
93 | extern ppc_cpu_id_t get_ppc_cpu_type (void); |
---|
94 | extern const char *get_ppc_cpu_type_name(ppc_cpu_id_t cpu); |
---|
95 | extern ppc_cpu_revision_t get_ppc_cpu_revision (void); |
---|
96 | extern ppc_cpu_revision_t current_ppc_revision; |
---|
97 | |
---|
98 | /* PUBLIC ACCESS ROUTINES */ |
---|
99 | #define _PPC_FEAT_DECL(x) \ |
---|
100 | static inline unsigned ppc_cpu_##x(void) { \ |
---|
101 | if ( PPC_UNKNOWN == current_ppc_cpu ) \ |
---|
102 | get_ppc_cpu_type(); \ |
---|
103 | return current_ppc_features.x; \ |
---|
104 | } |
---|
105 | |
---|
106 | _PPC_FEAT_DECL(has_altivec) |
---|
107 | /* has_fpu not implemented yet */ |
---|
108 | _PPC_FEAT_DECL(has_hw_ptbl_lkup) |
---|
109 | _PPC_FEAT_DECL(is_bookE) |
---|
110 | _PPC_FEAT_DECL(is_60x) |
---|
111 | _PPC_FEAT_DECL(has_8_bats) |
---|
112 | _PPC_FEAT_DECL(has_epic) |
---|
113 | _PPC_FEAT_DECL(has_shadowed_gprs) |
---|
114 | |
---|
115 | #undef _PPC_FEAT_DECL |
---|
116 | |
---|
117 | static inline ppc_cpu_id_t ppc_cpu_current(void) |
---|
118 | { |
---|
119 | return current_ppc_cpu; |
---|
120 | } |
---|
121 | |
---|
122 | static inline bool ppc_cpu_is_e200(void) |
---|
123 | { |
---|
124 | return (ppc_cpu_current() & 0xff80) == 0x8100; |
---|
125 | } |
---|
126 | |
---|
127 | static inline bool ppc_cpu_is_specific_e200(ppc_cpu_id_t id) |
---|
128 | { |
---|
129 | return (ppc_cpu_current() & 0xfff0) == id; |
---|
130 | } |
---|
131 | |
---|
132 | static inline bool ppc_cpu_is_e300(void) |
---|
133 | { |
---|
134 | return ppc_cpu_current() == PPC_e300c1 |
---|
135 | || ppc_cpu_current() == PPC_e300c2 |
---|
136 | || ppc_cpu_current() == PPC_e300c3; |
---|
137 | } |
---|
138 | |
---|
139 | static inline bool ppc_cpu_is_e500(void) |
---|
140 | { |
---|
141 | return ppc_cpu_current() == PPC_8540 |
---|
142 | || ppc_cpu_current() == PPC_e500v2; |
---|
143 | } |
---|
144 | |
---|
145 | static inline bool ppc_cpu_is(ppc_cpu_id_t cpu) |
---|
146 | { |
---|
147 | return ppc_cpu_current() == cpu; |
---|
148 | } |
---|
149 | |
---|
150 | #endif /* ASM */ |
---|
151 | |
---|
152 | #ifdef __cplusplus |
---|
153 | } |
---|
154 | #endif |
---|
155 | |
---|
156 | #endif |
---|