1
From bb8ef158bceca3c63f701277b7c495312248d391 Mon Sep 17 00:00:00 2001
2
From: Peter Maydell <peter.maydell@linaro.org>
3
Date: Fri, 22 Nov 2013 17:17:12 +0000
4
Subject: [PATCH 06/49] target-arm: Add ARMCPU field for Linux device-tree
7
Linux requires device tree CPU nodes to include a 'compatible'
8
string describing the CPU. Add a field in the ARMCPU struct for
9
this so that boards which construct a device tree can insert
10
the correct CPU nodes.
12
Note that there is currently no officially specified 'compatible'
13
string for the TI925T, Cortex-M3 or SA1110 CPUs.
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
Reviewed-by: Christoffer Dall <christoffer.dall@linaro.org>
17
Message-id: 1385140638-10444-6-git-send-email-peter.maydell@linaro.org
19
target-arm/cpu-qom.h | 3 +++
20
target-arm/cpu.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
21
2 files changed, 53 insertions(+)
23
diff --git a/target-arm/cpu-qom.h b/target-arm/cpu-qom.h
24
index b55306a..cbb9eec 100644
25
--- a/target-arm/cpu-qom.h
26
+++ b/target-arm/cpu-qom.h
27
@@ -91,6 +91,9 @@ typedef struct ARMCPU {
28
/* GPIO outputs for generic timer */
29
qemu_irq gt_timer_outputs[NUM_GTIMERS];
31
+ /* 'compatible' string for this CPU for Linux device trees */
32
+ const char *dtb_compatible;
34
/* The instance init functions for implementation-specific subclasses
35
* set these fields to specify the implementation-dependent values of
36
* various constant registers and reset values of non-constant
37
diff --git a/target-arm/cpu.c b/target-arm/cpu.c
38
index d40f2a7..4c8d9c7 100644
39
--- a/target-arm/cpu.c
40
+++ b/target-arm/cpu.c
41
@@ -217,6 +217,12 @@ static void arm_cpu_initfn(Object *obj)
42
ARRAY_SIZE(cpu->gt_timer_outputs));
45
+ /* DTB consumers generally don't in fact care what the 'compatible'
46
+ * string is, so always provide some string and trust that a hypothetical
47
+ * picky DTB consumer will also provide a helpful error message.
49
+ cpu->dtb_compatible = "qemu,unknown";
51
if (tcg_enabled() && !inited) {
54
@@ -318,6 +324,8 @@ static ObjectClass *arm_cpu_class_by_name(const char *cpu_model)
55
static void arm926_initfn(Object *obj)
57
ARMCPU *cpu = ARM_CPU(obj);
59
+ cpu->dtb_compatible = "arm,arm926";
60
set_feature(&cpu->env, ARM_FEATURE_V5);
61
set_feature(&cpu->env, ARM_FEATURE_VFP);
62
set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS);
63
@@ -331,6 +339,8 @@ static void arm926_initfn(Object *obj)
64
static void arm946_initfn(Object *obj)
66
ARMCPU *cpu = ARM_CPU(obj);
68
+ cpu->dtb_compatible = "arm,arm946";
69
set_feature(&cpu->env, ARM_FEATURE_V5);
70
set_feature(&cpu->env, ARM_FEATURE_MPU);
71
set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS);
72
@@ -342,6 +352,8 @@ static void arm946_initfn(Object *obj)
73
static void arm1026_initfn(Object *obj)
75
ARMCPU *cpu = ARM_CPU(obj);
77
+ cpu->dtb_compatible = "arm,arm1026";
78
set_feature(&cpu->env, ARM_FEATURE_V5);
79
set_feature(&cpu->env, ARM_FEATURE_VFP);
80
set_feature(&cpu->env, ARM_FEATURE_AUXCR);
81
@@ -374,6 +386,8 @@ static void arm1136_r2_initfn(Object *obj)
82
* for 1136_r2 (in particular r0p2 does not actually implement most
83
* of the ID registers).
86
+ cpu->dtb_compatible = "arm,arm1136";
87
set_feature(&cpu->env, ARM_FEATURE_V6);
88
set_feature(&cpu->env, ARM_FEATURE_VFP);
89
set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS);
90
@@ -403,6 +417,8 @@ static void arm1136_r2_initfn(Object *obj)
91
static void arm1136_initfn(Object *obj)
93
ARMCPU *cpu = ARM_CPU(obj);
95
+ cpu->dtb_compatible = "arm,arm1136";
96
set_feature(&cpu->env, ARM_FEATURE_V6K);
97
set_feature(&cpu->env, ARM_FEATURE_V6);
98
set_feature(&cpu->env, ARM_FEATURE_VFP);
99
@@ -433,6 +449,8 @@ static void arm1136_initfn(Object *obj)
100
static void arm1176_initfn(Object *obj)
102
ARMCPU *cpu = ARM_CPU(obj);
104
+ cpu->dtb_compatible = "arm,arm1176";
105
set_feature(&cpu->env, ARM_FEATURE_V6K);
106
set_feature(&cpu->env, ARM_FEATURE_VFP);
107
set_feature(&cpu->env, ARM_FEATURE_VAPA);
108
@@ -463,6 +481,8 @@ static void arm1176_initfn(Object *obj)
109
static void arm11mpcore_initfn(Object *obj)
111
ARMCPU *cpu = ARM_CPU(obj);
113
+ cpu->dtb_compatible = "arm,arm11mpcore";
114
set_feature(&cpu->env, ARM_FEATURE_V6K);
115
set_feature(&cpu->env, ARM_FEATURE_VFP);
116
set_feature(&cpu->env, ARM_FEATURE_VAPA);
117
@@ -516,6 +536,8 @@ static const ARMCPRegInfo cortexa8_cp_reginfo[] = {
118
static void cortex_a8_initfn(Object *obj)
120
ARMCPU *cpu = ARM_CPU(obj);
122
+ cpu->dtb_compatible = "arm,cortex-a8";
123
set_feature(&cpu->env, ARM_FEATURE_V7);
124
set_feature(&cpu->env, ARM_FEATURE_VFP3);
125
set_feature(&cpu->env, ARM_FEATURE_NEON);
126
@@ -580,6 +602,8 @@ static const ARMCPRegInfo cortexa9_cp_reginfo[] = {
127
static void cortex_a9_initfn(Object *obj)
129
ARMCPU *cpu = ARM_CPU(obj);
131
+ cpu->dtb_compatible = "arm,cortex-a9";
132
set_feature(&cpu->env, ARM_FEATURE_V7);
133
set_feature(&cpu->env, ARM_FEATURE_VFP3);
134
set_feature(&cpu->env, ARM_FEATURE_VFP_FP16);
135
@@ -649,6 +673,8 @@ static const ARMCPRegInfo cortexa15_cp_reginfo[] = {
136
static void cortex_a15_initfn(Object *obj)
138
ARMCPU *cpu = ARM_CPU(obj);
140
+ cpu->dtb_compatible = "arm,cortex-a15";
141
set_feature(&cpu->env, ARM_FEATURE_V7);
142
set_feature(&cpu->env, ARM_FEATURE_VFP4);
143
set_feature(&cpu->env, ARM_FEATURE_VFP_FP16);
144
@@ -697,6 +723,8 @@ static void ti925t_initfn(Object *obj)
145
static void sa1100_initfn(Object *obj)
147
ARMCPU *cpu = ARM_CPU(obj);
149
+ cpu->dtb_compatible = "intel,sa1100";
150
set_feature(&cpu->env, ARM_FEATURE_STRONGARM);
151
set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS);
152
cpu->midr = 0x4401A11B;
153
@@ -715,6 +743,8 @@ static void sa1110_initfn(Object *obj)
154
static void pxa250_initfn(Object *obj)
156
ARMCPU *cpu = ARM_CPU(obj);
158
+ cpu->dtb_compatible = "marvell,xscale";
159
set_feature(&cpu->env, ARM_FEATURE_V5);
160
set_feature(&cpu->env, ARM_FEATURE_XSCALE);
161
cpu->midr = 0x69052100;
162
@@ -725,6 +755,8 @@ static void pxa250_initfn(Object *obj)
163
static void pxa255_initfn(Object *obj)
165
ARMCPU *cpu = ARM_CPU(obj);
167
+ cpu->dtb_compatible = "marvell,xscale";
168
set_feature(&cpu->env, ARM_FEATURE_V5);
169
set_feature(&cpu->env, ARM_FEATURE_XSCALE);
170
cpu->midr = 0x69052d00;
171
@@ -735,6 +767,8 @@ static void pxa255_initfn(Object *obj)
172
static void pxa260_initfn(Object *obj)
174
ARMCPU *cpu = ARM_CPU(obj);
176
+ cpu->dtb_compatible = "marvell,xscale";
177
set_feature(&cpu->env, ARM_FEATURE_V5);
178
set_feature(&cpu->env, ARM_FEATURE_XSCALE);
179
cpu->midr = 0x69052903;
180
@@ -745,6 +779,8 @@ static void pxa260_initfn(Object *obj)
181
static void pxa261_initfn(Object *obj)
183
ARMCPU *cpu = ARM_CPU(obj);
185
+ cpu->dtb_compatible = "marvell,xscale";
186
set_feature(&cpu->env, ARM_FEATURE_V5);
187
set_feature(&cpu->env, ARM_FEATURE_XSCALE);
188
cpu->midr = 0x69052d05;
189
@@ -755,6 +791,8 @@ static void pxa261_initfn(Object *obj)
190
static void pxa262_initfn(Object *obj)
192
ARMCPU *cpu = ARM_CPU(obj);
194
+ cpu->dtb_compatible = "marvell,xscale";
195
set_feature(&cpu->env, ARM_FEATURE_V5);
196
set_feature(&cpu->env, ARM_FEATURE_XSCALE);
197
cpu->midr = 0x69052d06;
198
@@ -765,6 +803,8 @@ static void pxa262_initfn(Object *obj)
199
static void pxa270a0_initfn(Object *obj)
201
ARMCPU *cpu = ARM_CPU(obj);
203
+ cpu->dtb_compatible = "marvell,xscale";
204
set_feature(&cpu->env, ARM_FEATURE_V5);
205
set_feature(&cpu->env, ARM_FEATURE_XSCALE);
206
set_feature(&cpu->env, ARM_FEATURE_IWMMXT);
207
@@ -776,6 +816,8 @@ static void pxa270a0_initfn(Object *obj)
208
static void pxa270a1_initfn(Object *obj)
210
ARMCPU *cpu = ARM_CPU(obj);
212
+ cpu->dtb_compatible = "marvell,xscale";
213
set_feature(&cpu->env, ARM_FEATURE_V5);
214
set_feature(&cpu->env, ARM_FEATURE_XSCALE);
215
set_feature(&cpu->env, ARM_FEATURE_IWMMXT);
216
@@ -787,6 +829,8 @@ static void pxa270a1_initfn(Object *obj)
217
static void pxa270b0_initfn(Object *obj)
219
ARMCPU *cpu = ARM_CPU(obj);
221
+ cpu->dtb_compatible = "marvell,xscale";
222
set_feature(&cpu->env, ARM_FEATURE_V5);
223
set_feature(&cpu->env, ARM_FEATURE_XSCALE);
224
set_feature(&cpu->env, ARM_FEATURE_IWMMXT);
225
@@ -798,6 +842,8 @@ static void pxa270b0_initfn(Object *obj)
226
static void pxa270b1_initfn(Object *obj)
228
ARMCPU *cpu = ARM_CPU(obj);
230
+ cpu->dtb_compatible = "marvell,xscale";
231
set_feature(&cpu->env, ARM_FEATURE_V5);
232
set_feature(&cpu->env, ARM_FEATURE_XSCALE);
233
set_feature(&cpu->env, ARM_FEATURE_IWMMXT);
234
@@ -809,6 +855,8 @@ static void pxa270b1_initfn(Object *obj)
235
static void pxa270c0_initfn(Object *obj)
237
ARMCPU *cpu = ARM_CPU(obj);
239
+ cpu->dtb_compatible = "marvell,xscale";
240
set_feature(&cpu->env, ARM_FEATURE_V5);
241
set_feature(&cpu->env, ARM_FEATURE_XSCALE);
242
set_feature(&cpu->env, ARM_FEATURE_IWMMXT);
243
@@ -820,6 +868,8 @@ static void pxa270c0_initfn(Object *obj)
244
static void pxa270c5_initfn(Object *obj)
246
ARMCPU *cpu = ARM_CPU(obj);
248
+ cpu->dtb_compatible = "marvell,xscale";
249
set_feature(&cpu->env, ARM_FEATURE_V5);
250
set_feature(&cpu->env, ARM_FEATURE_XSCALE);
251
set_feature(&cpu->env, ARM_FEATURE_IWMMXT);