1
First target-arm pullreq of the 4.0 series; most of this
1
Less than a day of post-3.0 code review and already enough
2
is Mao's cleanups that finally let us drop sysbus::init;
2
patches for another pullreq :-)
3
the most interesting user-visible feature is RTH's patches
4
adding some v8.1 and v8.2 architecture features.
5
3
6
thanks
4
thanks
7
-- PMM
5
-- PMM
8
6
9
The following changes since commit 6145a6d84b3bf0f25935b88543febe076c61b0f4:
7
The following changes since commit c542a9f9794ec8e0bc3fcf5956d3cc8bce667789:
10
8
11
Merge remote-tracking branch 'remotes/cohuck/tags/s390x-20181212' into staging (2018-12-13 13:06:09 +0000)
9
Merge remote-tracking branch 'remotes/armbru/tags/pull-tests-2018-08-16' into staging (2018-08-16 09:50:54 +0100)
12
10
13
are available in the Git repository at:
11
are available in the Git repository at:
14
12
15
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20181213
13
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20180816
16
14
17
for you to fetch changes up to 2d7137c10fafefe40a0a049ff8a7bd78b66e661f:
15
for you to fetch changes up to fcf13ca556f462b52956059bf8fa622bc8575edb:
18
16
19
target/arm: Implement the ARMv8.1-LOR extension (2018-12-13 14:41:24 +0000)
17
hw/arm/mps2-tz: Replace init_sysbus_child() with sysbus_init_child_obj() (2018-08-16 14:29:58 +0100)
20
18
21
----------------------------------------------------------------
19
----------------------------------------------------------------
22
target-arm queue:
20
target-arm queue:
23
* Convert various devices from sysbus init to instance_init
21
* Fixes for various bugs in SVE instructions
24
* Remove the now unused sysbus init support entirely
22
* Add model of Freescale i.MX6 UltraLite 14x14 EVK Board
25
* Allow AArch64 processors to boot from a kernel placed over 4GB
23
* hw/arm: make bitbanded IO optional on ARMv7-M
26
* hw: arm: musicpal: drop TYPE_WM8750 in object_property_set_link()
24
* Add model of Cortex-M0 CPU
27
* versal: minor fixes to virtio-mmio instantation
25
* Add support for loading Intel HEX files to the generic loader
28
* arm: Implement the ARMv8.1-HPD extension
26
* imx_spi: Unset XCH when TX FIFO becomes empty
29
* arm: Implement the ARMv8.2-AA32HPD extension
27
* aspeed_sdmc: fix various bugs
30
* arm: Implement the ARMv8.1-LOR extension (as the trivial
28
* Fix bugs in Arm FP16 instruction support
31
"no limited ordering regions provided" minimum)
29
* Fix aa64 FCADD and FCMLA decode
30
* softfloat: Fix missing inexact for floating-point add
31
* hw/arm/mps2-tz: Replace init_sysbus_child() with sysbus_init_child_obj()
32
32
33
----------------------------------------------------------------
33
----------------------------------------------------------------
34
Edgar E. Iglesias (4):
34
Cédric Le Goater (1):
35
hw/arm: versal: Remove bogus virtio-mmio creation
35
aspeed: add a max_ram_size property to the memory controller
36
hw/arm: versal: Reduce number of virtio-mmio instances
37
hw/arm: versal: Use IRQs 111 - 118 for virtio-mmio
38
hw/arm: versal: Correct the nr of IRQs to 192
39
36
40
Li Qiang (1):
37
Jean-Christophe Dubois (3):
41
hw: arm: musicpal: drop TYPE_WM8750 in object_property_set_link()
38
i.MX6UL: Add i.MX6UL specific CCM device
39
i.MX6UL: Add i.MX6UL SOC
40
i.MX6UL: Add Freescale i.MX6 UltraLite 14x14 EVK Board
42
41
43
Mao Zhongyi (21):
42
Joel Stanley (5):
44
musicpal: Convert sysbus init function to realize function
43
aspeed_sdmc: Extend number of valid registers
45
block/noenand: Convert sysbus init function to realize function
44
aspeed_sdmc: Fix saved values
46
char/grlib_apbuart: Convert sysbus init function to realize function
45
aspeed_sdmc: Set 'cache initial sequence' always true
47
core/empty_slot: Convert sysbus init function to realize function
46
aspeed_sdmc: Init status always idle
48
display/g364fb: Convert sysbus init function to realize function
47
aspeed_sdmc: Handle ECC training
49
dma/puv3_dma: Convert sysbus init function to realize function
50
gpio/puv3_gpio: Convert sysbus init function to realize function
51
milkymist-softusb: Convert sysbus init function to realize function
52
input/pl050: Convert sysbus init function to realize function
53
intc/puv3_intc: Convert sysbus init function to realize function
54
milkymist-hpdmc: Convert sysbus init function to realize function
55
milkymist-pfpu: Convert sysbus init function to realize function
56
puv3_pm.c: Convert sysbus init function to realize function
57
nvram/ds1225y: Convert sysbus init function to realize function
58
pci-bridge/dec: Convert sysbus init function to realize function
59
timer/etraxfs_timer: Convert sysbus init function to realize function
60
timer/grlib_gptimer: Convert sysbus init function to realize function
61
timer/puv3_ost: Convert sysbus init function to realize function
62
usb/tusb6010: Convert sysbus init function to realize function
63
xen_backend: remove xen_sysdev_init() function
64
core/sysbus: remove the SysBusDeviceClass::init path
65
48
66
Peter Maydell (1):
49
Richard Henderson (13):
67
target/arm: Move id_aa64mmfr* to ARMISARegisters
50
target/arm: Fix typo in helper_sve_ld1hss_r
51
target/arm: Fix sign-extension in sve do_ldr/do_str
52
target/arm: Fix offset for LD1R instructions
53
target/arm: Fix offset scaling for LD_zprr and ST_zprr
54
target/arm: Reformat integer register dump
55
target/arm: Dump SVE state if enabled
56
target/arm: Add sve-max-vq cpu property to -cpu max
57
target/arm: Adjust FPCR_MASK for FZ16
58
target/arm: Ignore float_flag_input_denormal from fp_status_f16
59
target/arm: Use fp_status_fp16 for do_fmpa_zpzzz_h
60
target/arm: Use FZ not FZ16 for SVE FCVT single-half and double-half
61
target/arm: Fix aa64 FCADD and FCMLA decode
62
softfloat: Fix missing inexact for floating-point add
68
63
69
Ricardo Perez Blanco (1):
64
Stefan Hajnoczi (4):
70
Allow AArch64 processors to boot from a kernel placed over 4GB
65
hw/arm: make bitbanded IO optional on ARMv7-M
66
target/arm: add "cortex-m0" CPU model
67
loader: extract rom_free() function
68
loader: add rom transaction API
71
69
72
Richard Henderson (9):
70
Su Hang (2):
73
target/arm: Add HCR_EL2 bits up to ARMv8.5
71
loader: Implement .hex file loader
74
target/arm: Add SCR_EL3 bits up to ARMv8.5
72
Add QTest testcase for the Intel Hexadecimal
75
target/arm: Fix HCR_EL2.TGE check in arm_phys_excp_target_el
76
target/arm: Tidy scr_write
77
target/arm: Implement the ARMv8.1-HPD extension
78
target/arm: Implement the ARMv8.2-AA32HPD extension
79
target/arm: Introduce arm_hcr_el2_eff
80
target/arm: Use arm_hcr_el2_eff more places
81
target/arm: Implement the ARMv8.1-LOR extension
82
73
83
include/hw/arm/xlnx-versal.h | 8 +-
74
Thomas Huth (1):
84
include/hw/sysbus.h | 3 -
75
hw/arm/mps2-tz: Replace init_sysbus_child() with sysbus_init_child_obj()
85
target/arm/cpu.h | 141 ++++++++++++++++-----------
86
target/arm/internals.h | 3 +-
87
hw/arm/boot.c | 35 ++++---
88
hw/arm/musicpal.c | 11 +--
89
hw/arm/xlnx-versal-virt.c | 7 +-
90
hw/block/onenand.c | 16 ++--
91
hw/char/grlib_apbuart.c | 12 +--
92
hw/core/empty_slot.c | 9 +-
93
hw/core/sysbus.c | 15 +--
94
hw/display/g364fb.c | 9 +-
95
hw/dma/puv3_dma.c | 10 +-
96
hw/gpio/puv3_gpio.c | 29 +++---
97
hw/input/milkymist-softusb.c | 16 ++--
98
hw/input/pl050.c | 11 +--
99
hw/intc/arm_gicv3_cpuif.c | 21 ++--
100
hw/intc/puv3_intc.c | 11 +--
101
hw/misc/milkymist-hpdmc.c | 9 +-
102
hw/misc/milkymist-pfpu.c | 12 +--
103
hw/misc/puv3_pm.c | 10 +-
104
hw/nvram/ds1225y.c | 12 +--
105
hw/pci-bridge/dec.c | 12 +--
106
hw/timer/etraxfs_timer.c | 14 +--
107
hw/timer/grlib_gptimer.c | 11 +--
108
hw/timer/puv3_ost.c | 13 ++-
109
hw/usb/tusb6010.c | 8 +-
110
hw/xen/xen_backend.c | 7 --
111
target/arm/cpu.c | 4 +
112
target/arm/cpu64.c | 11 ++-
113
target/arm/helper.c | 222 ++++++++++++++++++++++++++++++++++++-------
114
target/arm/kvm64.c | 4 +
115
target/arm/op_helper.c | 14 ++-
116
target/arm/translate-a64.c | 12 +++
117
34 files changed, 456 insertions(+), 286 deletions(-)
118
76
77
Trent Piepho (1):
78
imx_spi: Unset XCH when TX FIFO becomes empty
79
80
configure | 4 +
81
hw/arm/Makefile.objs | 1 +
82
hw/misc/Makefile.objs | 1 +
83
tests/Makefile.include | 2 +
84
include/hw/arm/armv7m.h | 2 +
85
include/hw/arm/fsl-imx6ul.h | 339 ++++++++++++++
86
include/hw/loader.h | 31 ++
87
include/hw/misc/aspeed_sdmc.h | 4 +-
88
include/hw/misc/imx6ul_ccm.h | 226 +++++++++
89
target/arm/cpu.h | 5 +-
90
fpu/softfloat.c | 2 +-
91
hw/arm/armv7m.c | 37 +-
92
hw/arm/aspeed.c | 31 ++
93
hw/arm/aspeed_soc.c | 2 +
94
hw/arm/fsl-imx6ul.c | 617 ++++++++++++++++++++++++
95
hw/arm/mcimx6ul-evk.c | 85 ++++
96
hw/arm/mps2-tz.c | 32 +-
97
hw/arm/mps2.c | 1 +
98
hw/arm/msf2-soc.c | 1 +
99
hw/arm/stellaris.c | 1 +
100
hw/arm/stm32f205_soc.c | 1 +
101
hw/core/generic-loader.c | 4 +
102
hw/core/loader.c | 302 +++++++++++-
103
hw/misc/aspeed_sdmc.c | 55 ++-
104
hw/misc/imx6ul_ccm.c | 886 +++++++++++++++++++++++++++++++++++
105
hw/ssi/imx_spi.c | 3 +-
106
linux-user/syscall.c | 19 +-
107
target/arm/cpu.c | 17 +-
108
target/arm/cpu64.c | 29 ++
109
target/arm/helper.c | 18 +-
110
target/arm/sve_helper.c | 4 +-
111
target/arm/translate-a64.c | 120 ++++-
112
target/arm/translate-sve.c | 30 +-
113
tests/hexloader-test.c | 45 ++
114
MAINTAINERS | 6 +
115
default-configs/arm-softmmu.mak | 1 +
116
hw/misc/trace-events | 7 +
117
tests/hex-loader-check-data/test.hex | 18 +
118
38 files changed, 2863 insertions(+), 126 deletions(-)
119
create mode 100644 include/hw/arm/fsl-imx6ul.h
120
create mode 100644 include/hw/misc/imx6ul_ccm.h
121
create mode 100644 hw/arm/fsl-imx6ul.c
122
create mode 100644 hw/arm/mcimx6ul-evk.c
123
create mode 100644 hw/misc/imx6ul_ccm.c
124
create mode 100644 tests/hexloader-test.c
125
create mode 100644 tests/hex-loader-check-data/test.hex
126
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Since arm_hcr_el2_eff includes a check against
3
Cc: qemu-stable@nongnu.org (3.0.1)
4
arm_is_secure_below_el3, we can often remove a
5
nearby check against secure state.
6
7
In some cases, sort the call to arm_hcr_el2_eff
8
to the end of a short-circuit logical sequence.
9
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
12
Message-id: 20181210150501.7990-3-richard.henderson@linaro.org
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
7
---
15
target/arm/helper.c | 12 +++++-------
8
target/arm/sve_helper.c | 2 +-
16
target/arm/op_helper.c | 14 ++++++--------
9
1 file changed, 1 insertion(+), 1 deletion(-)
17
2 files changed, 11 insertions(+), 15 deletions(-)
18
10
19
diff --git a/target/arm/helper.c b/target/arm/helper.c
11
diff --git a/target/arm/sve_helper.c b/target/arm/sve_helper.c
20
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
21
--- a/target/arm/helper.c
13
--- a/target/arm/sve_helper.c
22
+++ b/target/arm/helper.c
14
+++ b/target/arm/sve_helper.c
23
@@ -XXX,XX +XXX,XX @@ static CPAccessResult access_tdosa(CPUARMState *env, const ARMCPRegInfo *ri,
15
@@ -XXX,XX +XXX,XX @@ DO_LD1(sve_ld1bdu_r, cpu_ldub_data_ra, uint64_t, uint8_t, )
24
int el = arm_current_el(env);
16
DO_LD1(sve_ld1bds_r, cpu_ldsb_data_ra, uint64_t, int8_t, )
25
bool mdcr_el2_tdosa = (env->cp15.mdcr_el2 & MDCR_TDOSA) ||
17
26
(env->cp15.mdcr_el2 & MDCR_TDE) ||
18
DO_LD1(sve_ld1hsu_r, cpu_lduw_data_ra, uint32_t, uint16_t, H1_4)
27
- (env->cp15.hcr_el2 & HCR_TGE);
19
-DO_LD1(sve_ld1hss_r, cpu_ldsw_data_ra, uint32_t, int8_t, H1_4)
28
+ (arm_hcr_el2_eff(env) & HCR_TGE);
20
+DO_LD1(sve_ld1hss_r, cpu_ldsw_data_ra, uint32_t, int16_t, H1_4)
29
21
DO_LD1(sve_ld1hdu_r, cpu_lduw_data_ra, uint64_t, uint16_t, )
30
if (el < 2 && mdcr_el2_tdosa && !arm_is_secure_below_el3(env)) {
22
DO_LD1(sve_ld1hds_r, cpu_ldsw_data_ra, uint64_t, int16_t, )
31
return CP_ACCESS_TRAP_EL2;
32
@@ -XXX,XX +XXX,XX @@ static CPAccessResult access_tdra(CPUARMState *env, const ARMCPRegInfo *ri,
33
int el = arm_current_el(env);
34
bool mdcr_el2_tdra = (env->cp15.mdcr_el2 & MDCR_TDRA) ||
35
(env->cp15.mdcr_el2 & MDCR_TDE) ||
36
- (env->cp15.hcr_el2 & HCR_TGE);
37
+ (arm_hcr_el2_eff(env) & HCR_TGE);
38
39
if (el < 2 && mdcr_el2_tdra && !arm_is_secure_below_el3(env)) {
40
return CP_ACCESS_TRAP_EL2;
41
@@ -XXX,XX +XXX,XX @@ static CPAccessResult access_tda(CPUARMState *env, const ARMCPRegInfo *ri,
42
int el = arm_current_el(env);
43
bool mdcr_el2_tda = (env->cp15.mdcr_el2 & MDCR_TDA) ||
44
(env->cp15.mdcr_el2 & MDCR_TDE) ||
45
- (env->cp15.hcr_el2 & HCR_TGE);
46
+ (arm_hcr_el2_eff(env) & HCR_TGE);
47
48
if (el < 2 && mdcr_el2_tda && !arm_is_secure_below_el3(env)) {
49
return CP_ACCESS_TRAP_EL2;
50
@@ -XXX,XX +XXX,XX @@ int sve_exception_el(CPUARMState *env, int el)
51
if (disabled) {
52
/* route_to_el2 */
53
return (arm_feature(env, ARM_FEATURE_EL2)
54
- && !arm_is_secure(env)
55
- && (env->cp15.hcr_el2 & HCR_TGE) ? 2 : 1);
56
+ && (arm_hcr_el2_eff(env) & HCR_TGE) ? 2 : 1);
57
}
58
59
/* Check CPACR.FPEN. */
60
@@ -XXX,XX +XXX,XX @@ static int bad_mode_switch(CPUARMState *env, int mode, CPSRWriteType write_type)
61
* and CPS are treated as illegal mode changes.
62
*/
63
if (write_type == CPSRWriteByInstr &&
64
- (env->cp15.hcr_el2 & HCR_TGE) &&
65
(env->uncached_cpsr & CPSR_M) == ARM_CPU_MODE_MON &&
66
- !arm_is_secure_below_el3(env)) {
67
+ (arm_hcr_el2_eff(env) & HCR_TGE)) {
68
return 1;
69
}
70
return 0;
71
diff --git a/target/arm/op_helper.c b/target/arm/op_helper.c
72
index XXXXXXX..XXXXXXX 100644
73
--- a/target/arm/op_helper.c
74
+++ b/target/arm/op_helper.c
75
@@ -XXX,XX +XXX,XX @@ void raise_exception(CPUARMState *env, uint32_t excp,
76
{
77
CPUState *cs = CPU(arm_env_get_cpu(env));
78
79
- if ((env->cp15.hcr_el2 & HCR_TGE) &&
80
- target_el == 1 && !arm_is_secure(env)) {
81
+ if (target_el == 1 && (arm_hcr_el2_eff(env) & HCR_TGE)) {
82
/*
83
* Redirect NS EL1 exceptions to NS EL2. These are reported with
84
* their original syndrome register value, with the exception of
85
@@ -XXX,XX +XXX,XX @@ static inline int check_wfx_trap(CPUARMState *env, bool is_wfe)
86
* No need for ARM_FEATURE check as if HCR_EL2 doesn't exist the
87
* bits will be zero indicating no trap.
88
*/
89
- if (cur_el < 2 && !arm_is_secure(env)) {
90
- mask = (is_wfe) ? HCR_TWE : HCR_TWI;
91
- if (env->cp15.hcr_el2 & mask) {
92
+ if (cur_el < 2) {
93
+ mask = is_wfe ? HCR_TWE : HCR_TWI;
94
+ if (arm_hcr_el2_eff(env) & mask) {
95
return 2;
96
}
97
}
98
@@ -XXX,XX +XXX,XX @@ void HELPER(pre_smc)(CPUARMState *env, uint32_t syndrome)
99
exception_target_el(env));
100
}
101
102
- if (!secure && cur_el == 1 && (env->cp15.hcr_el2 & HCR_TSC)) {
103
+ if (cur_el == 1 && (arm_hcr_el2_eff(env) & HCR_TSC)) {
104
/* In NS EL1, HCR controlled routing to EL2 has priority over SMD.
105
* We also want an EL2 guest to be able to forbid its EL1 from
106
* making PSCI calls into QEMU's "firmware" via HCR.TSC.
107
@@ -XXX,XX +XXX,XX @@ void HELPER(exception_return)(CPUARMState *env)
108
goto illegal_return;
109
}
110
111
- if (new_el == 1 && (env->cp15.hcr_el2 & HCR_TGE)
112
- && !arm_is_secure_below_el3(env)) {
113
+ if (new_el == 1 && (arm_hcr_el2_eff(env) & HCR_TGE)) {
114
goto illegal_return;
115
}
116
23
117
--
24
--
118
2.19.2
25
2.18.0
119
26
120
27
diff view generated by jsdifflib
1
From: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Use DeviceClass rather than SysBusDeviceClass in
3
The expression (int) imm + (uint32_t) len_align turns into uint32_t
4
tusb6010_class_init().
4
and thus with negative imm produces a memory operation at the wrong
5
offset. None of the numbers involved are particularly large, so
6
change everything to use int.
5
7
6
Cc: kraxel@redhat.com
8
Cc: qemu-stable@nongnu.org (3.0.1)
7
9
Reported-by: Laurent Desnogues <laurent.desnogues@gmail.com>
8
Signed-off-by: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
10
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Signed-off-by: Zhang Shengju <zhangshengju@cmss.chinamobile.com>
11
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
10
Message-id: 20181130093852.20739-20-maozhongyi@cmss.chinamobile.com
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
13
---
13
hw/usb/tusb6010.c | 8 +++-----
14
target/arm/translate-sve.c | 18 ++++++++----------
14
1 file changed, 3 insertions(+), 5 deletions(-)
15
1 file changed, 8 insertions(+), 10 deletions(-)
15
16
16
diff --git a/hw/usb/tusb6010.c b/hw/usb/tusb6010.c
17
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
17
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/usb/tusb6010.c
19
--- a/target/arm/translate-sve.c
19
+++ b/hw/usb/tusb6010.c
20
+++ b/target/arm/translate-sve.c
20
@@ -XXX,XX +XXX,XX @@ static void tusb6010_reset(DeviceState *dev)
21
@@ -XXX,XX +XXX,XX @@ static bool trans_UCVTF_dd(DisasContext *s, arg_rpr_esz *a, uint32_t insn)
21
musb_reset(s->musb);
22
* The load should begin at the address Rn + IMM.
23
*/
24
25
-static void do_ldr(DisasContext *s, uint32_t vofs, uint32_t len,
26
- int rn, int imm)
27
+static void do_ldr(DisasContext *s, uint32_t vofs, int len, int rn, int imm)
28
{
29
- uint32_t len_align = QEMU_ALIGN_DOWN(len, 8);
30
- uint32_t len_remain = len % 8;
31
- uint32_t nparts = len / 8 + ctpop8(len_remain);
32
+ int len_align = QEMU_ALIGN_DOWN(len, 8);
33
+ int len_remain = len % 8;
34
+ int nparts = len / 8 + ctpop8(len_remain);
35
int midx = get_mem_index(s);
36
TCGv_i64 addr, t0, t1;
37
38
@@ -XXX,XX +XXX,XX @@ static void do_ldr(DisasContext *s, uint32_t vofs, uint32_t len,
22
}
39
}
23
40
24
-static int tusb6010_init(SysBusDevice *sbd)
41
/* Similarly for stores. */
25
+static void tusb6010_realize(DeviceState *dev, Error **errp)
42
-static void do_str(DisasContext *s, uint32_t vofs, uint32_t len,
43
- int rn, int imm)
44
+static void do_str(DisasContext *s, uint32_t vofs, int len, int rn, int imm)
26
{
45
{
27
- DeviceState *dev = DEVICE(sbd);
46
- uint32_t len_align = QEMU_ALIGN_DOWN(len, 8);
28
TUSBState *s = TUSB(dev);
47
- uint32_t len_remain = len % 8;
29
+ SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
48
- uint32_t nparts = len / 8 + ctpop8(len_remain);
30
49
+ int len_align = QEMU_ALIGN_DOWN(len, 8);
31
s->otg_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, tusb_otg_tick, s);
50
+ int len_remain = len % 8;
32
s->pwr_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, tusb_power_tick, s);
51
+ int nparts = len / 8 + ctpop8(len_remain);
33
@@ -XXX,XX +XXX,XX @@ static int tusb6010_init(SysBusDevice *sbd)
52
int midx = get_mem_index(s);
34
sysbus_init_irq(sbd, &s->irq);
53
TCGv_i64 addr, t0;
35
qdev_init_gpio_in(dev, tusb6010_irq, musb_irq_max + 1);
36
s->musb = musb_init(dev, 1);
37
- return 0;
38
}
39
40
static void tusb6010_class_init(ObjectClass *klass, void *data)
41
{
42
DeviceClass *dc = DEVICE_CLASS(klass);
43
- SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
44
45
- k->init = tusb6010_init;
46
+ dc->realize = tusb6010_realize;
47
dc->reset = tusb6010_reset;
48
}
49
54
50
--
55
--
51
2.19.2
56
2.18.0
52
57
53
58
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Post v8.4 bits taken from SysReg_v85_xml-00bet8.
3
The immediate should be scaled by the size of the memory reference,
4
not the size of the elements into which it is loaded.
4
5
6
Cc: qemu-stable@nongnu.org (3.0.1)
7
Reported-by: Laurent Desnogues <laurent.desnogues@gmail.com>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-id: 20181203203839.757-4-richard.henderson@linaro.org
9
Tested-by: Laurent Desnogues <laurent.desnogues@gmail.com>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Reviewed-by: Laurent Desnogues <laurent.desnogues@gmail.com>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
12
---
10
target/arm/cpu.h | 10 ++++++++++
13
target/arm/translate-sve.c | 3 ++-
11
1 file changed, 10 insertions(+)
14
1 file changed, 2 insertions(+), 1 deletion(-)
12
15
13
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
16
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
14
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/cpu.h
18
--- a/target/arm/translate-sve.c
16
+++ b/target/arm/cpu.h
19
+++ b/target/arm/translate-sve.c
17
@@ -XXX,XX +XXX,XX @@ static inline void xpsr_write(CPUARMState *env, uint32_t val, uint32_t mask)
20
@@ -XXX,XX +XXX,XX @@ static bool trans_LD1R_zpri(DisasContext *s, arg_rpri_load *a, uint32_t insn)
18
#define SCR_ST (1U << 11)
21
unsigned vsz = vec_full_reg_size(s);
19
#define SCR_TWI (1U << 12)
22
unsigned psz = pred_full_reg_size(s);
20
#define SCR_TWE (1U << 13)
23
unsigned esz = dtype_esz[a->dtype];
21
+#define SCR_TLOR (1U << 14)
24
+ unsigned msz = dtype_msz(a->dtype);
22
+#define SCR_TERR (1U << 15)
25
TCGLabel *over = gen_new_label();
23
+#define SCR_APK (1U << 16)
26
TCGv_i64 temp;
24
+#define SCR_API (1U << 17)
27
25
+#define SCR_EEL2 (1U << 18)
28
@@ -XXX,XX +XXX,XX @@ static bool trans_LD1R_zpri(DisasContext *s, arg_rpri_load *a, uint32_t insn)
26
+#define SCR_EASE (1U << 19)
29
27
+#define SCR_NMEA (1U << 20)
30
/* Load the data. */
28
+#define SCR_FIEN (1U << 21)
31
temp = tcg_temp_new_i64();
29
+#define SCR_ENSCXT (1U << 25)
32
- tcg_gen_addi_i64(temp, cpu_reg_sp(s, a->rn), a->imm << esz);
30
+#define SCR_ATA (1U << 26)
33
+ tcg_gen_addi_i64(temp, cpu_reg_sp(s, a->rn), a->imm << msz);
31
#define SCR_AARCH32_MASK (0x3fff & ~(SCR_RW | SCR_ST))
34
tcg_gen_qemu_ld_i64(temp, temp, get_mem_index(s),
32
#define SCR_AARCH64_MASK (0x3fff & ~SCR_NET)
35
s->be_data | dtype_mop[a->dtype]);
33
36
34
--
37
--
35
2.19.2
38
2.18.0
36
39
37
40
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Since the TCR_*.HPD bits were RES0 in ARMv8.0, we can simply
3
The scaling should be solely on the memory operation size; the number
4
interpret the bits as if ARMv8.1-HPD is present without checking.
4
of registers being loaded does not come in to the initial computation.
5
We will need a slightly different check for hpd for aarch32.
6
5
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Cc: qemu-stable@nongnu.org (3.0.1)
7
Reported-by: Laurent Desnogues <laurent.desnogues@gmail.com>
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20181203203839.757-10-richard.henderson@linaro.org
9
Tested-by: Laurent Desnogues <laurent.desnogues@gmail.com>
10
Reviewed-by: Laurent Desnogues <laurent.desnogues@gmail.com>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
---
12
target/arm/cpu64.c | 4 ++++
13
target/arm/translate-sve.c | 5 ++---
13
target/arm/helper.c | 27 ++++++++++++++++++++-------
14
1 file changed, 2 insertions(+), 3 deletions(-)
14
2 files changed, 24 insertions(+), 7 deletions(-)
15
15
16
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
16
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
17
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/cpu64.c
18
--- a/target/arm/translate-sve.c
19
+++ b/target/arm/cpu64.c
19
+++ b/target/arm/translate-sve.c
20
@@ -XXX,XX +XXX,XX @@ static void aarch64_max_initfn(Object *obj)
20
@@ -XXX,XX +XXX,XX @@ static bool trans_LD_zprr(DisasContext *s, arg_rprr_load *a, uint32_t insn)
21
t = FIELD_DP64(t, ID_AA64PFR0, ADVSIMD, 1);
22
cpu->isar.id_aa64pfr0 = t;
23
24
+ t = cpu->isar.id_aa64mmfr1;
25
+ t = FIELD_DP64(t, ID_AA64MMFR1, HPDS, 1); /* HPD */
26
+ cpu->isar.id_aa64mmfr1 = t;
27
+
28
/* Replicate the same data to the 32-bit id registers. */
29
u = cpu->isar.id_isar5;
30
u = FIELD_DP32(u, ID_ISAR5, AES, 2); /* AES + PMULL */
31
diff --git a/target/arm/helper.c b/target/arm/helper.c
32
index XXXXXXX..XXXXXXX 100644
33
--- a/target/arm/helper.c
34
+++ b/target/arm/helper.c
35
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_lpae(CPUARMState *env, target_ulong address,
36
bool ttbr1_valid = true;
37
uint64_t descaddrmask;
38
bool aarch64 = arm_el_is_aa64(env, el);
39
+ bool hpd = false;
40
41
/* TODO:
42
* This code does not handle the different format TCR for VTCR_EL2.
43
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_lpae(CPUARMState *env, target_ulong address,
44
if (tg == 2) { /* 16KB pages */
45
stride = 11;
46
}
47
+ if (aarch64) {
48
+ if (el > 1) {
49
+ hpd = extract64(tcr->raw_tcr, 24, 1);
50
+ } else {
51
+ hpd = extract64(tcr->raw_tcr, 41, 1);
52
+ }
53
+ }
54
} else {
55
/* We should only be here if TTBR1 is valid */
56
assert(ttbr1_valid);
57
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_lpae(CPUARMState *env, target_ulong address,
58
if (tg == 1) { /* 16KB pages */
59
stride = 11;
60
}
61
+ if (aarch64) {
62
+ hpd = extract64(tcr->raw_tcr, 42, 1);
63
+ }
64
}
21
}
65
22
if (sve_access_check(s)) {
66
/* Here we should have set up all the parameters for the translation:
23
TCGv_i64 addr = new_tmp_a64(s);
67
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_lpae(CPUARMState *env, target_ulong address,
24
- tcg_gen_muli_i64(addr, cpu_reg(s, a->rm),
68
descaddr = descriptor & descaddrmask;
25
- (a->nreg + 1) << dtype_msz(a->dtype));
69
26
+ tcg_gen_shli_i64(addr, cpu_reg(s, a->rm), dtype_msz(a->dtype));
70
if ((descriptor & 2) && (level < 3)) {
27
tcg_gen_add_i64(addr, addr, cpu_reg_sp(s, a->rn));
71
- /* Table entry. The top five bits are attributes which may
28
do_ld_zpa(s, a->rd, a->pg, addr, a->dtype, a->nreg);
72
+ /* Table entry. The top five bits are attributes which may
73
* propagate down through lower levels of the table (and
74
* which are all arranged so that 0 means "no effect", so
75
* we can gather them up by ORing in the bits at each level).
76
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_lpae(CPUARMState *env, target_ulong address,
77
break;
78
}
79
/* Merge in attributes from table descriptors */
80
- attrs |= extract32(tableattrs, 0, 2) << 11; /* XN, PXN */
81
- attrs |= extract32(tableattrs, 3, 1) << 5; /* APTable[1] => AP[2] */
82
+ attrs |= nstable << 3; /* NS */
83
+ if (hpd) {
84
+ /* HPD disables all the table attributes except NSTable. */
85
+ break;
86
+ }
87
+ attrs |= extract32(tableattrs, 0, 2) << 11; /* XN, PXN */
88
/* The sense of AP[1] vs APTable[0] is reversed, as APTable[0] == 1
89
* means "force PL1 access only", which means forcing AP[1] to 0.
90
*/
91
- if (extract32(tableattrs, 2, 1)) {
92
- attrs &= ~(1 << 4);
93
- }
94
- attrs |= nstable << 3; /* NS */
95
+ attrs &= ~(extract32(tableattrs, 2, 1) << 4); /* !APT[0] => AP[1] */
96
+ attrs |= extract32(tableattrs, 3, 1) << 5; /* APT[1] => AP[2] */
97
break;
98
}
29
}
99
/* Here descaddr is the final physical address, and attributes
30
@@ -XXX,XX +XXX,XX @@ static bool trans_ST_zprr(DisasContext *s, arg_rprr_store *a, uint32_t insn)
31
}
32
if (sve_access_check(s)) {
33
TCGv_i64 addr = new_tmp_a64(s);
34
- tcg_gen_muli_i64(addr, cpu_reg(s, a->rm), (a->nreg + 1) << a->msz);
35
+ tcg_gen_shli_i64(addr, cpu_reg(s, a->rm), a->msz);
36
tcg_gen_add_i64(addr, addr, cpu_reg_sp(s, a->rn));
37
do_st_zpa(s, a->rd, a->pg, addr, a->msz, a->esz, a->nreg);
38
}
100
--
39
--
101
2.19.2
40
2.18.0
102
41
103
42
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
The bulk of the work here, beyond base HPD, is defining the
3
With PC, there are 33 registers. Three per line lines up nicely
4
TTBCR2 register. In addition we must check TTBCR.T2E, which
4
without overflowing 80 columns.
5
is not present (RES0) for AArch64.
6
5
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Cc: qemu-stable@nongnu.org (3.0.1)
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20181203203839.757-11-richard.henderson@linaro.org
8
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
10
---
12
target/arm/cpu.h | 9 +++++++++
11
target/arm/translate-a64.c | 13 ++++++-------
13
target/arm/cpu.c | 4 ++++
12
1 file changed, 6 insertions(+), 7 deletions(-)
14
target/arm/helper.c | 37 +++++++++++++++++++++++++++++--------
15
3 files changed, 42 insertions(+), 8 deletions(-)
16
13
17
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
14
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
18
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
19
--- a/target/arm/cpu.h
16
--- a/target/arm/translate-a64.c
20
+++ b/target/arm/cpu.h
17
+++ b/target/arm/translate-a64.c
21
@@ -XXX,XX +XXX,XX @@ FIELD(ID_ISAR6, FHM, 8, 4)
18
@@ -XXX,XX +XXX,XX @@ void aarch64_cpu_dump_state(CPUState *cs, FILE *f,
22
FIELD(ID_ISAR6, SB, 12, 4)
19
int el = arm_current_el(env);
23
FIELD(ID_ISAR6, SPECRES, 16, 4)
20
const char *ns_status;
24
21
25
+FIELD(ID_MMFR4, SPECSEI, 0, 4)
22
- cpu_fprintf(f, "PC=%016"PRIx64" SP=%016"PRIx64"\n",
26
+FIELD(ID_MMFR4, AC2, 4, 4)
23
- env->pc, env->xregs[31]);
27
+FIELD(ID_MMFR4, XNX, 8, 4)
24
- for (i = 0; i < 31; i++) {
28
+FIELD(ID_MMFR4, CNP, 12, 4)
25
- cpu_fprintf(f, "X%02d=%016"PRIx64, i, env->xregs[i]);
29
+FIELD(ID_MMFR4, HPDS, 16, 4)
26
- if ((i % 4) == 3) {
30
+FIELD(ID_MMFR4, LSM, 20, 4)
27
- cpu_fprintf(f, "\n");
31
+FIELD(ID_MMFR4, CCIDX, 24, 4)
28
+ cpu_fprintf(f, " PC=%016" PRIx64 " ", env->pc);
32
+FIELD(ID_MMFR4, EVT, 28, 4)
29
+ for (i = 0; i < 32; i++) {
33
+
30
+ if (i == 31) {
34
FIELD(ID_AA64ISAR0, AES, 4, 4)
31
+ cpu_fprintf(f, " SP=%016" PRIx64 "\n", env->xregs[i]);
35
FIELD(ID_AA64ISAR0, SHA1, 8, 4)
32
} else {
36
FIELD(ID_AA64ISAR0, SHA2, 12, 4)
33
- cpu_fprintf(f, " ");
37
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
34
+ cpu_fprintf(f, "X%02d=%016" PRIx64 "%s", i, env->xregs[i],
38
index XXXXXXX..XXXXXXX 100644
35
+ (i + 2) % 3 ? " " : "\n");
39
--- a/target/arm/cpu.c
40
+++ b/target/arm/cpu.c
41
@@ -XXX,XX +XXX,XX @@ static void arm_max_initfn(Object *obj)
42
t = cpu->isar.id_isar6;
43
t = FIELD_DP32(t, ID_ISAR6, DP, 1);
44
cpu->isar.id_isar6 = t;
45
+
46
+ t = cpu->id_mmfr4;
47
+ t = FIELD_DP32(t, ID_MMFR4, HPDS, 1); /* AA32HPD */
48
+ cpu->id_mmfr4 = t;
49
}
50
#endif
51
}
52
diff --git a/target/arm/helper.c b/target/arm/helper.c
53
index XXXXXXX..XXXXXXX 100644
54
--- a/target/arm/helper.c
55
+++ b/target/arm/helper.c
56
@@ -XXX,XX +XXX,XX @@ static void vmsa_ttbcr_write(CPUARMState *env, const ARMCPRegInfo *ri,
57
uint64_t value)
58
{
59
ARMCPU *cpu = arm_env_get_cpu(env);
60
+ TCR *tcr = raw_ptr(env, ri);
61
62
if (arm_feature(env, ARM_FEATURE_LPAE)) {
63
/* With LPAE the TTBCR could result in a change of ASID
64
@@ -XXX,XX +XXX,XX @@ static void vmsa_ttbcr_write(CPUARMState *env, const ARMCPRegInfo *ri,
65
*/
66
tlb_flush(CPU(cpu));
67
}
68
+ /* Preserve the high half of TCR_EL1, set via TTBCR2. */
69
+ value = deposit64(tcr->raw_tcr, 0, 32, value);
70
vmsa_ttbcr_raw_write(env, ri, value);
71
}
72
73
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo vmsa_cp_reginfo[] = {
74
REGINFO_SENTINEL
75
};
76
77
+/* Note that unlike TTBCR, writing to TTBCR2 does not require flushing
78
+ * qemu tlbs nor adjusting cached masks.
79
+ */
80
+static const ARMCPRegInfo ttbcr2_reginfo = {
81
+ .name = "TTBCR2", .cp = 15, .opc1 = 0, .crn = 2, .crm = 0, .opc2 = 3,
82
+ .access = PL1_RW, .type = ARM_CP_ALIAS,
83
+ .bank_fieldoffsets = { offsetofhigh32(CPUARMState, cp15.tcr_el[3]),
84
+ offsetofhigh32(CPUARMState, cp15.tcr_el[1]) },
85
+};
86
+
87
static void omap_ticonfig_write(CPUARMState *env, const ARMCPRegInfo *ri,
88
uint64_t value)
89
{
90
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
91
} else {
92
define_arm_cp_regs(cpu, vmsa_pmsa_cp_reginfo);
93
define_arm_cp_regs(cpu, vmsa_cp_reginfo);
94
+ /* TTCBR2 is introduced with ARMv8.2-A32HPD. */
95
+ if (FIELD_EX32(cpu->id_mmfr4, ID_MMFR4, HPDS) != 0) {
96
+ define_one_arm_cp_reg(cpu, &ttbcr2_reginfo);
97
+ }
98
}
99
if (arm_feature(env, ARM_FEATURE_THUMB2EE)) {
100
define_arm_cp_regs(cpu, t2ee_cp_reginfo);
101
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_lpae(CPUARMState *env, target_ulong address,
102
if (tg == 2) { /* 16KB pages */
103
stride = 11;
104
}
105
- if (aarch64) {
106
- if (el > 1) {
107
- hpd = extract64(tcr->raw_tcr, 24, 1);
108
- } else {
109
- hpd = extract64(tcr->raw_tcr, 41, 1);
110
- }
111
+ if (aarch64 && el > 1) {
112
+ hpd = extract64(tcr->raw_tcr, 24, 1);
113
+ } else {
114
+ hpd = extract64(tcr->raw_tcr, 41, 1);
115
+ }
116
+ if (!aarch64) {
117
+ /* For aarch32, hpd0 is not enabled without t2e as well. */
118
+ hpd &= extract64(tcr->raw_tcr, 6, 1);
119
}
120
} else {
121
/* We should only be here if TTBR1 is valid */
122
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_lpae(CPUARMState *env, target_ulong address,
123
if (tg == 1) { /* 16KB pages */
124
stride = 11;
125
}
126
- if (aarch64) {
127
- hpd = extract64(tcr->raw_tcr, 42, 1);
128
+ hpd = extract64(tcr->raw_tcr, 42, 1);
129
+ if (!aarch64) {
130
+ /* For aarch32, hpd1 is not enabled without t2e as well. */
131
+ hpd &= extract64(tcr->raw_tcr, 6, 1);
132
}
36
}
133
}
37
}
134
38
135
--
39
--
136
2.19.2
40
2.18.0
137
41
138
42
diff view generated by jsdifflib
1
From: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Use DeviceClass rather than SysBusDeviceClass in
3
Also fold the FPCR/FPSR state onto the same line as PSTATE,
4
puv3_ost_class_init().
4
and mention but do not dump disabled FPU state.
5
5
6
Cc: gxt@mprc.pku.edu.cn
6
Cc: qemu-stable@nongnu.org (3.0.1)
7
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Signed-off-by: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
8
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
9
Signed-off-by: Zhang Shengju <zhangshengju@cmss.chinamobile.com>
9
Tested-by: Alex Bennée <alex.bennee@linaro.org>
10
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
11
Message-id: 20181130093852.20739-19-maozhongyi@cmss.chinamobile.com
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
11
---
14
hw/timer/puv3_ost.c | 13 ++++++-------
12
target/arm/translate-a64.c | 95 +++++++++++++++++++++++++++++++++-----
15
1 file changed, 6 insertions(+), 7 deletions(-)
13
1 file changed, 83 insertions(+), 12 deletions(-)
16
14
17
diff --git a/hw/timer/puv3_ost.c b/hw/timer/puv3_ost.c
15
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
18
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/timer/puv3_ost.c
17
--- a/target/arm/translate-a64.c
20
+++ b/hw/timer/puv3_ost.c
18
+++ b/target/arm/translate-a64.c
21
@@ -XXX,XX +XXX,XX @@ static void puv3_ost_tick(void *opaque)
19
@@ -XXX,XX +XXX,XX @@ void aarch64_cpu_dump_state(CPUState *cs, FILE *f,
20
} else {
21
ns_status = "";
22
}
23
-
24
- cpu_fprintf(f, "\nPSTATE=%08x %c%c%c%c %sEL%d%c\n",
25
+ cpu_fprintf(f, "PSTATE=%08x %c%c%c%c %sEL%d%c",
26
psr,
27
psr & PSTATE_N ? 'N' : '-',
28
psr & PSTATE_Z ? 'Z' : '-',
29
@@ -XXX,XX +XXX,XX @@ void aarch64_cpu_dump_state(CPUState *cs, FILE *f,
30
el,
31
psr & PSTATE_SP ? 'h' : 't');
32
33
- if (flags & CPU_DUMP_FPU) {
34
- int numvfpregs = 32;
35
- for (i = 0; i < numvfpregs; i++) {
36
- uint64_t *q = aa64_vfp_qreg(env, i);
37
- uint64_t vlo = q[0];
38
- uint64_t vhi = q[1];
39
- cpu_fprintf(f, "q%02d=%016" PRIx64 ":%016" PRIx64 "%c",
40
- i, vhi, vlo, (i & 1 ? '\n' : ' '));
41
+ if (!(flags & CPU_DUMP_FPU)) {
42
+ cpu_fprintf(f, "\n");
43
+ return;
44
+ }
45
+ cpu_fprintf(f, " FPCR=%08x FPSR=%08x\n",
46
+ vfp_get_fpcr(env), vfp_get_fpsr(env));
47
+
48
+ if (arm_feature(env, ARM_FEATURE_SVE)) {
49
+ int j, zcr_len = env->vfp.zcr_el[1] & 0xf; /* fix for system mode */
50
+
51
+ for (i = 0; i <= FFR_PRED_NUM; i++) {
52
+ bool eol;
53
+ if (i == FFR_PRED_NUM) {
54
+ cpu_fprintf(f, "FFR=");
55
+ /* It's last, so end the line. */
56
+ eol = true;
57
+ } else {
58
+ cpu_fprintf(f, "P%02d=", i);
59
+ switch (zcr_len) {
60
+ case 0:
61
+ eol = i % 8 == 7;
62
+ break;
63
+ case 1:
64
+ eol = i % 6 == 5;
65
+ break;
66
+ case 2:
67
+ case 3:
68
+ eol = i % 3 == 2;
69
+ break;
70
+ default:
71
+ /* More than one quadword per predicate. */
72
+ eol = true;
73
+ break;
74
+ }
75
+ }
76
+ for (j = zcr_len / 4; j >= 0; j--) {
77
+ int digits;
78
+ if (j * 4 + 4 <= zcr_len + 1) {
79
+ digits = 16;
80
+ } else {
81
+ digits = (zcr_len % 4 + 1) * 4;
82
+ }
83
+ cpu_fprintf(f, "%0*" PRIx64 "%s", digits,
84
+ env->vfp.pregs[i].p[j],
85
+ j ? ":" : eol ? "\n" : " ");
86
+ }
87
+ }
88
+
89
+ for (i = 0; i < 32; i++) {
90
+ if (zcr_len == 0) {
91
+ cpu_fprintf(f, "Z%02d=%016" PRIx64 ":%016" PRIx64 "%s",
92
+ i, env->vfp.zregs[i].d[1],
93
+ env->vfp.zregs[i].d[0], i & 1 ? "\n" : " ");
94
+ } else if (zcr_len == 1) {
95
+ cpu_fprintf(f, "Z%02d=%016" PRIx64 ":%016" PRIx64
96
+ ":%016" PRIx64 ":%016" PRIx64 "\n",
97
+ i, env->vfp.zregs[i].d[3], env->vfp.zregs[i].d[2],
98
+ env->vfp.zregs[i].d[1], env->vfp.zregs[i].d[0]);
99
+ } else {
100
+ for (j = zcr_len; j >= 0; j--) {
101
+ bool odd = (zcr_len - j) % 2 != 0;
102
+ if (j == zcr_len) {
103
+ cpu_fprintf(f, "Z%02d[%x-%x]=", i, j, j - 1);
104
+ } else if (!odd) {
105
+ if (j > 0) {
106
+ cpu_fprintf(f, " [%x-%x]=", j, j - 1);
107
+ } else {
108
+ cpu_fprintf(f, " [%x]=", j);
109
+ }
110
+ }
111
+ cpu_fprintf(f, "%016" PRIx64 ":%016" PRIx64 "%s",
112
+ env->vfp.zregs[i].d[j * 2 + 1],
113
+ env->vfp.zregs[i].d[j * 2],
114
+ odd || j == 0 ? "\n" : ":");
115
+ }
116
+ }
117
+ }
118
+ } else {
119
+ for (i = 0; i < 32; i++) {
120
+ uint64_t *q = aa64_vfp_qreg(env, i);
121
+ cpu_fprintf(f, "Q%02d=%016" PRIx64 ":%016" PRIx64 "%s",
122
+ i, q[1], q[0], (i & 1 ? "\n" : " "));
123
}
124
- cpu_fprintf(f, "FPCR: %08x FPSR: %08x\n",
125
- vfp_get_fpcr(env), vfp_get_fpsr(env));
22
}
126
}
23
}
127
}
24
128
25
-static int puv3_ost_init(SysBusDevice *dev)
26
+static void puv3_ost_realize(DeviceState *dev, Error **errp)
27
{
28
PUV3OSTState *s = PUV3_OST(dev);
29
+ SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
30
31
s->reg_OIER = 0;
32
s->reg_OSSR = 0;
33
s->reg_OSMR0 = 0;
34
s->reg_OSCR = 0;
35
36
- sysbus_init_irq(dev, &s->irq);
37
+ sysbus_init_irq(sbd, &s->irq);
38
39
s->bh = qemu_bh_new(puv3_ost_tick, s);
40
s->ptimer = ptimer_init(s->bh, PTIMER_POLICY_DEFAULT);
41
@@ -XXX,XX +XXX,XX @@ static int puv3_ost_init(SysBusDevice *dev)
42
43
memory_region_init_io(&s->iomem, OBJECT(s), &puv3_ost_ops, s, "puv3_ost",
44
PUV3_REGS_OFFSET);
45
- sysbus_init_mmio(dev, &s->iomem);
46
-
47
- return 0;
48
+ sysbus_init_mmio(sbd, &s->iomem);
49
}
50
51
static void puv3_ost_class_init(ObjectClass *klass, void *data)
52
{
53
- SysBusDeviceClass *sdc = SYS_BUS_DEVICE_CLASS(klass);
54
+ DeviceClass *dc = DEVICE_CLASS(klass);
55
56
- sdc->init = puv3_ost_init;
57
+ dc->realize = puv3_ost_realize;
58
}
59
60
static const TypeInfo puv3_ost_info = {
61
--
129
--
62
2.19.2
130
2.18.0
63
131
64
132
diff view generated by jsdifflib
1
At the same time, define the fields for these registers,
1
From: Richard Henderson <richard.henderson@linaro.org>
2
and use those defines in arm_pamax().
3
2
3
This allows the default (and maximum) vector length to be set
4
from the command-line. Which is extraordinarily helpful in
5
debugging problems depending on vector length without having to
6
bake knowledge of PR_SET_SVE_VL into every guest binary.
7
8
Cc: qemu-stable@nongnu.org (3.0.1)
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Message-id: 20181203203839.757-2-richard.henderson@linaro.org
10
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Tested-by: Alex Bennée <alex.bennee@linaro.org>
7
[PMM: fixed up typo (s/achf/ahcf/) belatedly spotted by RTH]
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
13
---
10
target/arm/cpu.h | 26 ++++++++++++++++++++++++--
14
target/arm/cpu.h | 3 +++
11
target/arm/internals.h | 3 ++-
15
linux-user/syscall.c | 19 +++++++++++++------
12
target/arm/cpu64.c | 6 +++---
16
target/arm/cpu.c | 6 +++---
13
target/arm/helper.c | 4 ++--
17
target/arm/cpu64.c | 29 +++++++++++++++++++++++++++++
14
target/arm/kvm64.c | 4 ++++
18
target/arm/helper.c | 7 +++++--
15
5 files changed, 35 insertions(+), 8 deletions(-)
19
5 files changed, 53 insertions(+), 11 deletions(-)
16
20
17
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
21
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
18
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
19
--- a/target/arm/cpu.h
23
--- a/target/arm/cpu.h
20
+++ b/target/arm/cpu.h
24
+++ b/target/arm/cpu.h
21
@@ -XXX,XX +XXX,XX @@ struct ARMCPU {
25
@@ -XXX,XX +XXX,XX @@ struct ARMCPU {
22
uint64_t id_aa64isar1;
26
23
uint64_t id_aa64pfr0;
27
/* Used to synchronize KVM and QEMU in-kernel device levels */
24
uint64_t id_aa64pfr1;
28
uint8_t device_irq_level;
25
+ uint64_t id_aa64mmfr0;
26
+ uint64_t id_aa64mmfr1;
27
} isar;
28
uint32_t midr;
29
uint32_t revidr;
30
@@ -XXX,XX +XXX,XX @@ struct ARMCPU {
31
uint64_t id_aa64dfr1;
32
uint64_t id_aa64afr0;
33
uint64_t id_aa64afr1;
34
- uint64_t id_aa64mmfr0;
35
- uint64_t id_aa64mmfr1;
36
uint32_t dbgdidr;
37
uint32_t clidr;
38
uint64_t mp_affinity; /* MP ID without feature bits */
39
@@ -XXX,XX +XXX,XX @@ FIELD(ID_AA64PFR0, GIC, 24, 4)
40
FIELD(ID_AA64PFR0, RAS, 28, 4)
41
FIELD(ID_AA64PFR0, SVE, 32, 4)
42
43
+FIELD(ID_AA64MMFR0, PARANGE, 0, 4)
44
+FIELD(ID_AA64MMFR0, ASIDBITS, 4, 4)
45
+FIELD(ID_AA64MMFR0, BIGEND, 8, 4)
46
+FIELD(ID_AA64MMFR0, SNSMEM, 12, 4)
47
+FIELD(ID_AA64MMFR0, BIGENDEL0, 16, 4)
48
+FIELD(ID_AA64MMFR0, TGRAN16, 20, 4)
49
+FIELD(ID_AA64MMFR0, TGRAN64, 24, 4)
50
+FIELD(ID_AA64MMFR0, TGRAN4, 28, 4)
51
+FIELD(ID_AA64MMFR0, TGRAN16_2, 32, 4)
52
+FIELD(ID_AA64MMFR0, TGRAN64_2, 36, 4)
53
+FIELD(ID_AA64MMFR0, TGRAN4_2, 40, 4)
54
+FIELD(ID_AA64MMFR0, EXS, 44, 4)
55
+
29
+
56
+FIELD(ID_AA64MMFR1, HAFDBS, 0, 4)
30
+ /* Used to set the maximum vector length the cpu will support. */
57
+FIELD(ID_AA64MMFR1, VMIDBITS, 4, 4)
31
+ uint32_t sve_max_vq;
58
+FIELD(ID_AA64MMFR1, VH, 8, 4)
32
};
59
+FIELD(ID_AA64MMFR1, HPDS, 12, 4)
33
60
+FIELD(ID_AA64MMFR1, LO, 16, 4)
34
static inline ARMCPU *arm_env_get_cpu(CPUARMState *env)
61
+FIELD(ID_AA64MMFR1, PAN, 20, 4)
35
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
62
+FIELD(ID_AA64MMFR1, SPECSEI, 24, 4)
36
index XXXXXXX..XXXXXXX 100644
63
+FIELD(ID_AA64MMFR1, XNX, 28, 4)
37
--- a/linux-user/syscall.c
38
+++ b/linux-user/syscall.c
39
@@ -XXX,XX +XXX,XX @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
40
#endif
41
#ifdef TARGET_AARCH64
42
case TARGET_PR_SVE_SET_VL:
43
- /* We cannot support either PR_SVE_SET_VL_ONEXEC
44
- or PR_SVE_VL_INHERIT. Therefore, anything above
45
- ARM_MAX_VQ results in EINVAL. */
46
+ /*
47
+ * We cannot support either PR_SVE_SET_VL_ONEXEC or
48
+ * PR_SVE_VL_INHERIT. Note the kernel definition
49
+ * of sve_vl_valid allows for VQ=512, i.e. VL=8192,
50
+ * even though the current architectural maximum is VQ=16.
51
+ */
52
ret = -TARGET_EINVAL;
53
if (arm_feature(cpu_env, ARM_FEATURE_SVE)
54
- && arg2 >= 0 && arg2 <= ARM_MAX_VQ * 16 && !(arg2 & 15)) {
55
+ && arg2 >= 0 && arg2 <= 512 * 16 && !(arg2 & 15)) {
56
CPUARMState *env = cpu_env;
57
- int old_vq = (env->vfp.zcr_el[1] & 0xf) + 1;
58
- int vq = MAX(arg2 / 16, 1);
59
+ ARMCPU *cpu = arm_env_get_cpu(env);
60
+ uint32_t vq, old_vq;
64
+
61
+
65
QEMU_BUILD_BUG_ON(ARRAY_SIZE(((ARMCPU *)0)->ccsidr) <= R_V7M_CSSELR_INDEX_MASK);
62
+ old_vq = (env->vfp.zcr_el[1] & 0xf) + 1;
66
63
+ vq = MAX(arg2 / 16, 1);
67
/* If adding a feature bit which corresponds to a Linux ELF
64
+ vq = MIN(vq, cpu->sve_max_vq);
68
diff --git a/target/arm/internals.h b/target/arm/internals.h
65
66
if (vq < old_vq) {
67
aarch64_sve_narrow_vq(env, vq);
68
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
69
index XXXXXXX..XXXXXXX 100644
69
index XXXXXXX..XXXXXXX 100644
70
--- a/target/arm/internals.h
70
--- a/target/arm/cpu.c
71
+++ b/target/arm/internals.h
71
+++ b/target/arm/cpu.c
72
@@ -XXX,XX +XXX,XX @@ static inline unsigned int arm_pamax(ARMCPU *cpu)
72
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_reset(CPUState *s)
73
[4] = 44,
73
env->cp15.cpacr_el1 = deposit64(env->cp15.cpacr_el1, 16, 2, 3);
74
[5] = 48,
74
env->cp15.cptr_el[3] |= CPTR_EZ;
75
};
75
/* with maximum vector length */
76
- unsigned int parange = extract32(cpu->id_aa64mmfr0, 0, 4);
76
- env->vfp.zcr_el[1] = ARM_MAX_VQ - 1;
77
+ unsigned int parange =
77
- env->vfp.zcr_el[2] = ARM_MAX_VQ - 1;
78
+ FIELD_EX64(cpu->isar.id_aa64mmfr0, ID_AA64MMFR0, PARANGE);
78
- env->vfp.zcr_el[3] = ARM_MAX_VQ - 1;
79
79
+ env->vfp.zcr_el[1] = cpu->sve_max_vq - 1;
80
/* id_aa64mmfr0 is a read-only register so values outside of the
80
+ env->vfp.zcr_el[2] = env->vfp.zcr_el[1];
81
* supported mappings can be considered an implementation error. */
81
+ env->vfp.zcr_el[3] = env->vfp.zcr_el[1];
82
#else
83
/* Reset into the highest available EL */
84
if (arm_feature(env, ARM_FEATURE_EL3)) {
82
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
85
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
83
index XXXXXXX..XXXXXXX 100644
86
index XXXXXXX..XXXXXXX 100644
84
--- a/target/arm/cpu64.c
87
--- a/target/arm/cpu64.c
85
+++ b/target/arm/cpu64.c
88
+++ b/target/arm/cpu64.c
86
@@ -XXX,XX +XXX,XX @@ static void aarch64_a57_initfn(Object *obj)
89
@@ -XXX,XX +XXX,XX @@
87
cpu->pmceid0 = 0x00000000;
90
#include "sysemu/sysemu.h"
88
cpu->pmceid1 = 0x00000000;
91
#include "sysemu/kvm.h"
89
cpu->isar.id_aa64isar0 = 0x00011120;
92
#include "kvm_arm.h"
90
- cpu->id_aa64mmfr0 = 0x00001124;
93
+#include "qapi/visitor.h"
91
+ cpu->isar.id_aa64mmfr0 = 0x00001124;
94
92
cpu->dbgdidr = 0x3516d000;
95
static inline void set_feature(CPUARMState *env, int feature)
93
cpu->clidr = 0x0a200023;
96
{
94
cpu->ccsidr[0] = 0x701fe00a; /* 32KB L1 dcache */
95
@@ -XXX,XX +XXX,XX @@ static void aarch64_a53_initfn(Object *obj)
97
@@ -XXX,XX +XXX,XX @@ static void aarch64_a53_initfn(Object *obj)
96
cpu->isar.id_aa64pfr0 = 0x00002222;
98
define_arm_cp_regs(cpu, cortex_a57_a53_cp_reginfo);
97
cpu->id_aa64dfr0 = 0x10305106;
99
}
98
cpu->isar.id_aa64isar0 = 0x00011120;
100
99
- cpu->id_aa64mmfr0 = 0x00001122; /* 40 bit physical addr */
101
+static void cpu_max_get_sve_vq(Object *obj, Visitor *v, const char *name,
100
+ cpu->isar.id_aa64mmfr0 = 0x00001122; /* 40 bit physical addr */
102
+ void *opaque, Error **errp)
101
cpu->dbgdidr = 0x3516d000;
103
+{
102
cpu->clidr = 0x0a200023;
104
+ ARMCPU *cpu = ARM_CPU(obj);
103
cpu->ccsidr[0] = 0x700fe01a; /* 32KB L1 dcache */
105
+ visit_type_uint32(v, name, &cpu->sve_max_vq, errp);
104
@@ -XXX,XX +XXX,XX @@ static void aarch64_a72_initfn(Object *obj)
106
+}
105
cpu->pmceid0 = 0x00000000;
107
+
106
cpu->pmceid1 = 0x00000000;
108
+static void cpu_max_set_sve_vq(Object *obj, Visitor *v, const char *name,
107
cpu->isar.id_aa64isar0 = 0x00011120;
109
+ void *opaque, Error **errp)
108
- cpu->id_aa64mmfr0 = 0x00001124;
110
+{
109
+ cpu->isar.id_aa64mmfr0 = 0x00001124;
111
+ ARMCPU *cpu = ARM_CPU(obj);
110
cpu->dbgdidr = 0x3516d000;
112
+ Error *err = NULL;
111
cpu->clidr = 0x0a200023;
113
+
112
cpu->ccsidr[0] = 0x701fe00a; /* 32KB L1 dcache */
114
+ visit_type_uint32(v, name, &cpu->sve_max_vq, &err);
115
+
116
+ if (!err && (cpu->sve_max_vq == 0 || cpu->sve_max_vq > ARM_MAX_VQ)) {
117
+ error_setg(&err, "unsupported SVE vector length");
118
+ error_append_hint(&err, "Valid sve-max-vq in range [1-%d]\n",
119
+ ARM_MAX_VQ);
120
+ }
121
+ error_propagate(errp, err);
122
+}
123
+
124
/* -cpu max: if KVM is enabled, like -cpu host (best possible with this host);
125
* otherwise, a CPU with as many features enabled as our emulation supports.
126
* The version of '-cpu max' for qemu-system-arm is defined in cpu.c;
127
@@ -XXX,XX +XXX,XX @@ static void aarch64_max_initfn(Object *obj)
128
cpu->ctr = 0x80038003; /* 32 byte I and D cacheline size, VIPT icache */
129
cpu->dcz_blocksize = 7; /* 512 bytes */
130
#endif
131
+
132
+ cpu->sve_max_vq = ARM_MAX_VQ;
133
+ object_property_add(obj, "sve-max-vq", "uint32", cpu_max_get_sve_vq,
134
+ cpu_max_set_sve_vq, NULL, NULL, &error_fatal);
135
}
136
}
137
138
@@ -XXX,XX +XXX,XX @@ void aarch64_sve_narrow_vq(CPUARMState *env, unsigned vq)
139
uint64_t pmask;
140
141
assert(vq >= 1 && vq <= ARM_MAX_VQ);
142
+ assert(vq <= arm_env_get_cpu(env)->sve_max_vq);
143
144
/* Zap the high bits of the zregs. */
145
for (i = 0; i < 32; i++) {
113
diff --git a/target/arm/helper.c b/target/arm/helper.c
146
diff --git a/target/arm/helper.c b/target/arm/helper.c
114
index XXXXXXX..XXXXXXX 100644
147
index XXXXXXX..XXXXXXX 100644
115
--- a/target/arm/helper.c
148
--- a/target/arm/helper.c
116
+++ b/target/arm/helper.c
149
+++ b/target/arm/helper.c
117
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
150
@@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc,
118
{ .name = "ID_AA64MMFR0_EL1", .state = ARM_CP_STATE_AA64,
151
zcr_len = 0;
119
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 7, .opc2 = 0,
152
} else {
120
.access = PL1_R, .type = ARM_CP_CONST,
153
int current_el = arm_current_el(env);
121
- .resetvalue = cpu->id_aa64mmfr0 },
154
+ ARMCPU *cpu = arm_env_get_cpu(env);
122
+ .resetvalue = cpu->isar.id_aa64mmfr0 },
155
123
{ .name = "ID_AA64MMFR1_EL1", .state = ARM_CP_STATE_AA64,
156
- zcr_len = env->vfp.zcr_el[current_el <= 1 ? 1 : current_el];
124
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 7, .opc2 = 1,
157
- zcr_len &= 0xf;
125
.access = PL1_R, .type = ARM_CP_CONST,
158
+ zcr_len = cpu->sve_max_vq - 1;
126
- .resetvalue = cpu->id_aa64mmfr1 },
159
+ if (current_el <= 1) {
127
+ .resetvalue = cpu->isar.id_aa64mmfr1 },
160
+ zcr_len = MIN(zcr_len, 0xf & (uint32_t)env->vfp.zcr_el[1]);
128
{ .name = "ID_AA64MMFR2_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
161
+ }
129
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 7, .opc2 = 2,
162
if (current_el < 2 && arm_feature(env, ARM_FEATURE_EL2)) {
130
.access = PL1_R, .type = ARM_CP_CONST,
163
zcr_len = MIN(zcr_len, 0xf & (uint32_t)env->vfp.zcr_el[2]);
131
diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c
164
}
132
index XXXXXXX..XXXXXXX 100644
133
--- a/target/arm/kvm64.c
134
+++ b/target/arm/kvm64.c
135
@@ -XXX,XX +XXX,XX @@ bool kvm_arm_get_host_cpu_features(ARMHostCPUFeatures *ahcf)
136
ARM64_SYS_REG(3, 0, 0, 6, 0));
137
err |= read_sys_reg64(fdarray[2], &ahcf->isar.id_aa64isar1,
138
ARM64_SYS_REG(3, 0, 0, 6, 1));
139
+ err |= read_sys_reg64(fdarray[2], &ahcf->isar.id_aa64mmfr0,
140
+ ARM64_SYS_REG(3, 0, 0, 7, 0));
141
+ err |= read_sys_reg64(fdarray[2], &ahcf->isar.id_aa64mmfr1,
142
+ ARM64_SYS_REG(3, 0, 0, 7, 1));
143
144
/*
145
* Note that if AArch32 support is not present in the host,
146
--
165
--
147
2.19.2
166
2.18.0
148
167
149
168
diff view generated by jsdifflib
1
From: Li Qiang <liq3ea@gmail.com>
1
From: Jean-Christophe Dubois <jcd@tribudubois.net>
2
2
3
The third argument of object_property_set_link() is the name of
3
Signed-off-by: Jean-Christophe Dubois <jcd@tribudubois.net>
4
property, not related with the QOM type name, using the constant
4
Message-id: 34b6704ceb81b49e35ce1ad162bf758e5141ff87.1532984236.git.jcd@tribudubois.net
5
string instead.
5
[PMM: fixed some comment typos etc]
6
7
Signed-off-by: Li Qiang <liq3ea@gmail.com>
8
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Message-id: 1542880825-2604-1-git-send-email-liq3ea@gmail.com
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
8
---
13
hw/arm/musicpal.c | 2 +-
9
hw/misc/Makefile.objs | 1 +
14
1 file changed, 1 insertion(+), 1 deletion(-)
10
include/hw/misc/imx6ul_ccm.h | 226 +++++++++
11
hw/misc/imx6ul_ccm.c | 886 +++++++++++++++++++++++++++++++++++
12
hw/misc/trace-events | 7 +
13
4 files changed, 1120 insertions(+)
14
create mode 100644 include/hw/misc/imx6ul_ccm.h
15
create mode 100644 hw/misc/imx6ul_ccm.c
15
16
16
diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c
17
diff --git a/hw/misc/Makefile.objs b/hw/misc/Makefile.objs
17
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/arm/musicpal.c
19
--- a/hw/misc/Makefile.objs
19
+++ b/hw/arm/musicpal.c
20
+++ b/hw/misc/Makefile.objs
20
@@ -XXX,XX +XXX,XX @@ static void musicpal_init(MachineState *machine)
21
@@ -XXX,XX +XXX,XX @@ obj-$(CONFIG_IMX) += imx_ccm.o
21
dev = qdev_create(NULL, TYPE_MV88W8618_AUDIO);
22
obj-$(CONFIG_IMX) += imx31_ccm.o
22
s = SYS_BUS_DEVICE(dev);
23
obj-$(CONFIG_IMX) += imx25_ccm.o
23
object_property_set_link(OBJECT(dev), OBJECT(wm8750_dev),
24
obj-$(CONFIG_IMX) += imx6_ccm.o
24
- TYPE_WM8750, NULL);
25
+obj-$(CONFIG_IMX) += imx6ul_ccm.o
25
+ "wm8750", NULL);
26
obj-$(CONFIG_IMX) += imx6_src.o
26
qdev_init_nofail(dev);
27
obj-$(CONFIG_IMX) += imx7_ccm.o
27
sysbus_mmio_map(s, 0, MP_AUDIO_BASE);
28
obj-$(CONFIG_IMX) += imx2_wdt.o
28
sysbus_connect_irq(s, 0, pic[MP_AUDIO_IRQ]);
29
diff --git a/include/hw/misc/imx6ul_ccm.h b/include/hw/misc/imx6ul_ccm.h
30
new file mode 100644
31
index XXXXXXX..XXXXXXX
32
--- /dev/null
33
+++ b/include/hw/misc/imx6ul_ccm.h
34
@@ -XXX,XX +XXX,XX @@
35
+/*
36
+ * IMX6UL Clock Control Module
37
+ *
38
+ * Copyright (C) 2018 by Jean-Christophe Dubois <jcd@tribudubois.net>
39
+ *
40
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
41
+ * See the COPYING file in the top-level directory.
42
+ */
43
+
44
+#ifndef IMX6UL_CCM_H
45
+#define IMX6UL_CCM_H
46
+
47
+#include "hw/misc/imx_ccm.h"
48
+#include "qemu/bitops.h"
49
+
50
+#define CCM_CCR 0
51
+#define CCM_CCDR 1
52
+#define CCM_CSR 2
53
+#define CCM_CCSR 3
54
+#define CCM_CACRR 4
55
+#define CCM_CBCDR 5
56
+#define CCM_CBCMR 6
57
+#define CCM_CSCMR1 7
58
+#define CCM_CSCMR2 8
59
+#define CCM_CSCDR1 9
60
+#define CCM_CS1CDR 10
61
+#define CCM_CS2CDR 11
62
+#define CCM_CDCDR 12
63
+#define CCM_CHSCCDR 13
64
+#define CCM_CSCDR2 14
65
+#define CCM_CSCDR3 15
66
+#define CCM_CDHIPR 18
67
+#define CCM_CTOR 20
68
+#define CCM_CLPCR 21
69
+#define CCM_CISR 22
70
+#define CCM_CIMR 23
71
+#define CCM_CCOSR 24
72
+#define CCM_CGPR 25
73
+#define CCM_CCGR0 26
74
+#define CCM_CCGR1 27
75
+#define CCM_CCGR2 28
76
+#define CCM_CCGR3 29
77
+#define CCM_CCGR4 30
78
+#define CCM_CCGR5 31
79
+#define CCM_CCGR6 32
80
+#define CCM_CMEOR 34
81
+#define CCM_MAX 35
82
+
83
+#define CCM_ANALOG_PLL_ARM 0
84
+#define CCM_ANALOG_PLL_ARM_SET 1
85
+#define CCM_ANALOG_PLL_ARM_CLR 2
86
+#define CCM_ANALOG_PLL_ARM_TOG 3
87
+#define CCM_ANALOG_PLL_USB1 4
88
+#define CCM_ANALOG_PLL_USB1_SET 5
89
+#define CCM_ANALOG_PLL_USB1_CLR 6
90
+#define CCM_ANALOG_PLL_USB1_TOG 7
91
+#define CCM_ANALOG_PLL_USB2 8
92
+#define CCM_ANALOG_PLL_USB2_SET 9
93
+#define CCM_ANALOG_PLL_USB2_CLR 10
94
+#define CCM_ANALOG_PLL_USB2_TOG 11
95
+#define CCM_ANALOG_PLL_SYS 12
96
+#define CCM_ANALOG_PLL_SYS_SET 13
97
+#define CCM_ANALOG_PLL_SYS_CLR 14
98
+#define CCM_ANALOG_PLL_SYS_TOG 15
99
+#define CCM_ANALOG_PLL_SYS_SS 16
100
+#define CCM_ANALOG_PLL_SYS_NUM 20
101
+#define CCM_ANALOG_PLL_SYS_DENOM 24
102
+#define CCM_ANALOG_PLL_AUDIO 28
103
+#define CCM_ANALOG_PLL_AUDIO_SET 29
104
+#define CCM_ANALOG_PLL_AUDIO_CLR 30
105
+#define CCM_ANALOG_PLL_AUDIO_TOG 31
106
+#define CCM_ANALOG_PLL_AUDIO_NUM 32
107
+#define CCM_ANALOG_PLL_AUDIO_DENOM 36
108
+#define CCM_ANALOG_PLL_VIDEO 40
109
+#define CCM_ANALOG_PLL_VIDEO_SET 41
110
+#define CCM_ANALOG_PLL_VIDEO_CLR 42
111
+#define CCM_ANALOG_PLL_VIDEO_TOG 44
112
+#define CCM_ANALOG_PLL_VIDEO_NUM 46
113
+#define CCM_ANALOG_PLL_VIDEO_DENOM 48
114
+#define CCM_ANALOG_PLL_ENET 56
115
+#define CCM_ANALOG_PLL_ENET_SET 57
116
+#define CCM_ANALOG_PLL_ENET_CLR 58
117
+#define CCM_ANALOG_PLL_ENET_TOG 59
118
+#define CCM_ANALOG_PFD_480 60
119
+#define CCM_ANALOG_PFD_480_SET 61
120
+#define CCM_ANALOG_PFD_480_CLR 62
121
+#define CCM_ANALOG_PFD_480_TOG 63
122
+#define CCM_ANALOG_PFD_528 64
123
+#define CCM_ANALOG_PFD_528_SET 65
124
+#define CCM_ANALOG_PFD_528_CLR 66
125
+#define CCM_ANALOG_PFD_528_TOG 67
126
+
127
+/* PMU registers */
128
+#define PMU_REG_1P1 68
129
+#define PMU_REG_3P0 72
130
+#define PMU_REG_2P5 76
131
+#define PMU_REG_CORE 80
132
+
133
+#define CCM_ANALOG_MISC0 84
134
+#define PMU_MISC0 CCM_ANALOG_MISC0
135
+#define CCM_ANALOG_MISC0_SET 85
136
+#define PMU_MISC0_SET CCM_ANALOG_MISC0_SET
137
+#define CCM_ANALOG_MISC0_CLR 86
138
+#define PMU_MISC0_CLR CCM_ANALOG_MISC0_CLR
139
+#define CCM_ANALOG_MISC0_TOG 87
140
+#define PMU_MISC0_TOG CCM_ANALOG_MISC0_TOG
141
+
142
+#define CCM_ANALOG_MISC1 88
143
+#define PMU_MISC1 CCM_ANALOG_MISC1
144
+#define CCM_ANALOG_MISC1_SET 89
145
+#define PMU_MISC1_SET CCM_ANALOG_MISC1_SET
146
+#define CCM_ANALOG_MISC1_CLR 90
147
+#define PMU_MISC1_CLR CCM_ANALOG_MISC1_CLR
148
+#define CCM_ANALOG_MISC1_TOG 91
149
+#define PMU_MISC1_TOG CCM_ANALOG_MISC1_TOG
150
+
151
+#define CCM_ANALOG_MISC2 92
152
+#define PMU_MISC2 CCM_ANALOG_MISC2
153
+#define CCM_ANALOG_MISC2_SET 93
154
+#define PMU_MISC2_SET CCM_ANALOG_MISC2_SET
155
+#define CCM_ANALOG_MISC2_CLR 94
156
+#define PMU_MISC2_CLR CCM_ANALOG_MISC2_CLR
157
+#define CCM_ANALOG_MISC2_TOG 95
158
+#define PMU_MISC2_TOG CCM_ANALOG_MISC2_TOG
159
+
160
+#define TEMPMON_TEMPSENSE0 96
161
+#define TEMPMON_TEMPSENSE0_SET 97
162
+#define TEMPMON_TEMPSENSE0_CLR 98
163
+#define TEMPMON_TEMPSENSE0_TOG 99
164
+#define TEMPMON_TEMPSENSE1 100
165
+#define TEMPMON_TEMPSENSE1_SET 101
166
+#define TEMPMON_TEMPSENSE1_CLR 102
167
+#define TEMPMON_TEMPSENSE1_TOG 103
168
+#define TEMPMON_TEMPSENSE2 164
169
+#define TEMPMON_TEMPSENSE2_SET 165
170
+#define TEMPMON_TEMPSENSE2_CLR 166
171
+#define TEMPMON_TEMPSENSE2_TOG 167
172
+
173
+#define PMU_LOWPWR_CTRL 155
174
+#define PMU_LOWPWR_CTRL_SET 156
175
+#define PMU_LOWPWR_CTRL_CLR 157
176
+#define PMU_LOWPWR_CTRL_TOG 158
177
+
178
+#define USB_ANALOG_USB1_VBUS_DETECT 104
179
+#define USB_ANALOG_USB1_VBUS_DETECT_SET 105
180
+#define USB_ANALOG_USB1_VBUS_DETECT_CLR 106
181
+#define USB_ANALOG_USB1_VBUS_DETECT_TOG 107
182
+#define USB_ANALOG_USB1_CHRG_DETECT 108
183
+#define USB_ANALOG_USB1_CHRG_DETECT_SET 109
184
+#define USB_ANALOG_USB1_CHRG_DETECT_CLR 110
185
+#define USB_ANALOG_USB1_CHRG_DETECT_TOG 111
186
+#define USB_ANALOG_USB1_VBUS_DETECT_STAT 112
187
+#define USB_ANALOG_USB1_CHRG_DETECT_STAT 116
188
+#define USB_ANALOG_USB1_MISC 124
189
+#define USB_ANALOG_USB1_MISC_SET 125
190
+#define USB_ANALOG_USB1_MISC_CLR 126
191
+#define USB_ANALOG_USB1_MISC_TOG 127
192
+#define USB_ANALOG_USB2_VBUS_DETECT 128
193
+#define USB_ANALOG_USB2_VBUS_DETECT_SET 129
194
+#define USB_ANALOG_USB2_VBUS_DETECT_CLR 130
195
+#define USB_ANALOG_USB2_VBUS_DETECT_TOG 131
196
+#define USB_ANALOG_USB2_CHRG_DETECT 132
197
+#define USB_ANALOG_USB2_CHRG_DETECT_SET 133
198
+#define USB_ANALOG_USB2_CHRG_DETECT_CLR 134
199
+#define USB_ANALOG_USB2_CHRG_DETECT_TOG 135
200
+#define USB_ANALOG_USB2_VBUS_DETECT_STAT 136
201
+#define USB_ANALOG_USB2_CHRG_DETECT_STAT 140
202
+#define USB_ANALOG_USB2_MISC 148
203
+#define USB_ANALOG_USB2_MISC_SET 149
204
+#define USB_ANALOG_USB2_MISC_CLR 150
205
+#define USB_ANALOG_USB2_MISC_TOG 151
206
+#define USB_ANALOG_DIGPROG 152
207
+#define CCM_ANALOG_MAX 4096
208
+
209
+/* CCM_CBCMR */
210
+#define R_CBCMR_PRE_PERIPH_CLK_SEL_SHIFT (18)
211
+#define R_CBCMR_PRE_PERIPH_CLK_SEL_LENGTH (2)
212
+#define R_CBCMR_PERIPH_CLK2_SEL_SHIFT (12)
213
+#define R_CBCMR_PERIPH_CLK2_SEL_LENGTH (2)
214
+
215
+/* CCM_CBCDR */
216
+#define R_CBCDR_AHB_PODF_SHIFT (10)
217
+#define R_CBCDR_AHB_PODF_LENGTH (3)
218
+#define R_CBCDR_IPG_PODF_SHIFT (8)
219
+#define R_CBCDR_IPG_PODF_LENGTH (2)
220
+#define R_CBCDR_PERIPH_CLK_SEL_SHIFT (25)
221
+#define R_CBCDR_PERIPH_CLK_SEL_LENGTH (1)
222
+#define R_CBCDR_PERIPH_CLK2_PODF_SHIFT (27)
223
+#define R_CBCDR_PERIPH_CLK2_PODF_LENGTH (3)
224
+
225
+/* CCM_CSCMR1 */
226
+#define R_CSCMR1_PERCLK_PODF_SHIFT (0)
227
+#define R_CSCMR1_PERCLK_PODF_LENGTH (6)
228
+#define R_CSCMR1_PERCLK_CLK_SEL_SHIFT (6)
229
+#define R_CSCMR1_PERCLK_CLK_SEL_LENGTH (1)
230
+
231
+/* CCM_ANALOG_PFD_528 */
232
+#define R_ANALOG_PFD_528_PFD0_FRAC_SHIFT (0)
233
+#define R_ANALOG_PFD_528_PFD0_FRAC_LENGTH (6)
234
+#define R_ANALOG_PFD_528_PFD2_FRAC_SHIFT (16)
235
+#define R_ANALOG_PFD_528_PFD2_FRAC_LENGTH (6)
236
+
237
+/* CCM_ANALOG_PLL_SYS */
238
+#define R_ANALOG_PLL_SYS_DIV_SELECT_SHIFT (0)
239
+#define R_ANALOG_PLL_SYS_DIV_SELECT_LENGTH (1)
240
+
241
+#define CCM_ANALOG_PLL_LOCK (1 << 31);
242
+
243
+#define TYPE_IMX6UL_CCM "imx6ul.ccm"
244
+#define IMX6UL_CCM(obj) OBJECT_CHECK(IMX6ULCCMState, (obj), TYPE_IMX6UL_CCM)
245
+
246
+typedef struct IMX6ULCCMState {
247
+ /* <private> */
248
+ IMXCCMState parent_obj;
249
+
250
+ /* <public> */
251
+ MemoryRegion container;
252
+ MemoryRegion ioccm;
253
+ MemoryRegion ioanalog;
254
+
255
+ uint32_t ccm[CCM_MAX];
256
+ uint32_t analog[CCM_ANALOG_MAX];
257
+
258
+} IMX6ULCCMState;
259
+
260
+#endif /* IMX6UL_CCM_H */
261
diff --git a/hw/misc/imx6ul_ccm.c b/hw/misc/imx6ul_ccm.c
262
new file mode 100644
263
index XXXXXXX..XXXXXXX
264
--- /dev/null
265
+++ b/hw/misc/imx6ul_ccm.c
266
@@ -XXX,XX +XXX,XX @@
267
+/*
268
+ * IMX6UL Clock Control Module
269
+ *
270
+ * Copyright (c) 2018 Jean-Christophe Dubois <jcd@tribudubois.net>
271
+ *
272
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
273
+ * See the COPYING file in the top-level directory.
274
+ *
275
+ * To get the timer frequencies right, we need to emulate at least part of
276
+ * the CCM.
277
+ */
278
+
279
+#include "qemu/osdep.h"
280
+#include "hw/registerfields.h"
281
+#include "hw/misc/imx6ul_ccm.h"
282
+#include "qemu/log.h"
283
+
284
+#include "trace.h"
285
+
286
+static const char *imx6ul_ccm_reg_name(uint32_t reg)
287
+{
288
+ static char unknown[20];
289
+
290
+ switch (reg) {
291
+ case CCM_CCR:
292
+ return "CCR";
293
+ case CCM_CCDR:
294
+ return "CCDR";
295
+ case CCM_CSR:
296
+ return "CSR";
297
+ case CCM_CCSR:
298
+ return "CCSR";
299
+ case CCM_CACRR:
300
+ return "CACRR";
301
+ case CCM_CBCDR:
302
+ return "CBCDR";
303
+ case CCM_CBCMR:
304
+ return "CBCMR";
305
+ case CCM_CSCMR1:
306
+ return "CSCMR1";
307
+ case CCM_CSCMR2:
308
+ return "CSCMR2";
309
+ case CCM_CSCDR1:
310
+ return "CSCDR1";
311
+ case CCM_CS1CDR:
312
+ return "CS1CDR";
313
+ case CCM_CS2CDR:
314
+ return "CS2CDR";
315
+ case CCM_CDCDR:
316
+ return "CDCDR";
317
+ case CCM_CHSCCDR:
318
+ return "CHSCCDR";
319
+ case CCM_CSCDR2:
320
+ return "CSCDR2";
321
+ case CCM_CSCDR3:
322
+ return "CSCDR3";
323
+ case CCM_CDHIPR:
324
+ return "CDHIPR";
325
+ case CCM_CTOR:
326
+ return "CTOR";
327
+ case CCM_CLPCR:
328
+ return "CLPCR";
329
+ case CCM_CISR:
330
+ return "CISR";
331
+ case CCM_CIMR:
332
+ return "CIMR";
333
+ case CCM_CCOSR:
334
+ return "CCOSR";
335
+ case CCM_CGPR:
336
+ return "CGPR";
337
+ case CCM_CCGR0:
338
+ return "CCGR0";
339
+ case CCM_CCGR1:
340
+ return "CCGR1";
341
+ case CCM_CCGR2:
342
+ return "CCGR2";
343
+ case CCM_CCGR3:
344
+ return "CCGR3";
345
+ case CCM_CCGR4:
346
+ return "CCGR4";
347
+ case CCM_CCGR5:
348
+ return "CCGR5";
349
+ case CCM_CCGR6:
350
+ return "CCGR6";
351
+ case CCM_CMEOR:
352
+ return "CMEOR";
353
+ default:
354
+ sprintf(unknown, "%d ?", reg);
355
+ return unknown;
356
+ }
357
+}
358
+
359
+static const char *imx6ul_analog_reg_name(uint32_t reg)
360
+{
361
+ static char unknown[20];
362
+
363
+ switch (reg) {
364
+ case CCM_ANALOG_PLL_ARM:
365
+ return "PLL_ARM";
366
+ case CCM_ANALOG_PLL_ARM_SET:
367
+ return "PLL_ARM_SET";
368
+ case CCM_ANALOG_PLL_ARM_CLR:
369
+ return "PLL_ARM_CLR";
370
+ case CCM_ANALOG_PLL_ARM_TOG:
371
+ return "PLL_ARM_TOG";
372
+ case CCM_ANALOG_PLL_USB1:
373
+ return "PLL_USB1";
374
+ case CCM_ANALOG_PLL_USB1_SET:
375
+ return "PLL_USB1_SET";
376
+ case CCM_ANALOG_PLL_USB1_CLR:
377
+ return "PLL_USB1_CLR";
378
+ case CCM_ANALOG_PLL_USB1_TOG:
379
+ return "PLL_USB1_TOG";
380
+ case CCM_ANALOG_PLL_USB2:
381
+ return "PLL_USB2";
382
+ case CCM_ANALOG_PLL_USB2_SET:
383
+ return "PLL_USB2_SET";
384
+ case CCM_ANALOG_PLL_USB2_CLR:
385
+ return "PLL_USB2_CLR";
386
+ case CCM_ANALOG_PLL_USB2_TOG:
387
+ return "PLL_USB2_TOG";
388
+ case CCM_ANALOG_PLL_SYS:
389
+ return "PLL_SYS";
390
+ case CCM_ANALOG_PLL_SYS_SET:
391
+ return "PLL_SYS_SET";
392
+ case CCM_ANALOG_PLL_SYS_CLR:
393
+ return "PLL_SYS_CLR";
394
+ case CCM_ANALOG_PLL_SYS_TOG:
395
+ return "PLL_SYS_TOG";
396
+ case CCM_ANALOG_PLL_SYS_SS:
397
+ return "PLL_SYS_SS";
398
+ case CCM_ANALOG_PLL_SYS_NUM:
399
+ return "PLL_SYS_NUM";
400
+ case CCM_ANALOG_PLL_SYS_DENOM:
401
+ return "PLL_SYS_DENOM";
402
+ case CCM_ANALOG_PLL_AUDIO:
403
+ return "PLL_AUDIO";
404
+ case CCM_ANALOG_PLL_AUDIO_SET:
405
+ return "PLL_AUDIO_SET";
406
+ case CCM_ANALOG_PLL_AUDIO_CLR:
407
+ return "PLL_AUDIO_CLR";
408
+ case CCM_ANALOG_PLL_AUDIO_TOG:
409
+ return "PLL_AUDIO_TOG";
410
+ case CCM_ANALOG_PLL_AUDIO_NUM:
411
+ return "PLL_AUDIO_NUM";
412
+ case CCM_ANALOG_PLL_AUDIO_DENOM:
413
+ return "PLL_AUDIO_DENOM";
414
+ case CCM_ANALOG_PLL_VIDEO:
415
+ return "PLL_VIDEO";
416
+ case CCM_ANALOG_PLL_VIDEO_SET:
417
+ return "PLL_VIDEO_SET";
418
+ case CCM_ANALOG_PLL_VIDEO_CLR:
419
+ return "PLL_VIDEO_CLR";
420
+ case CCM_ANALOG_PLL_VIDEO_TOG:
421
+ return "PLL_VIDEO_TOG";
422
+ case CCM_ANALOG_PLL_VIDEO_NUM:
423
+ return "PLL_VIDEO_NUM";
424
+ case CCM_ANALOG_PLL_VIDEO_DENOM:
425
+ return "PLL_VIDEO_DENOM";
426
+ case CCM_ANALOG_PLL_ENET:
427
+ return "PLL_ENET";
428
+ case CCM_ANALOG_PLL_ENET_SET:
429
+ return "PLL_ENET_SET";
430
+ case CCM_ANALOG_PLL_ENET_CLR:
431
+ return "PLL_ENET_CLR";
432
+ case CCM_ANALOG_PLL_ENET_TOG:
433
+ return "PLL_ENET_TOG";
434
+ case CCM_ANALOG_PFD_480:
435
+ return "PFD_480";
436
+ case CCM_ANALOG_PFD_480_SET:
437
+ return "PFD_480_SET";
438
+ case CCM_ANALOG_PFD_480_CLR:
439
+ return "PFD_480_CLR";
440
+ case CCM_ANALOG_PFD_480_TOG:
441
+ return "PFD_480_TOG";
442
+ case CCM_ANALOG_PFD_528:
443
+ return "PFD_528";
444
+ case CCM_ANALOG_PFD_528_SET:
445
+ return "PFD_528_SET";
446
+ case CCM_ANALOG_PFD_528_CLR:
447
+ return "PFD_528_CLR";
448
+ case CCM_ANALOG_PFD_528_TOG:
449
+ return "PFD_528_TOG";
450
+ case CCM_ANALOG_MISC0:
451
+ return "MISC0";
452
+ case CCM_ANALOG_MISC0_SET:
453
+ return "MISC0_SET";
454
+ case CCM_ANALOG_MISC0_CLR:
455
+ return "MISC0_CLR";
456
+ case CCM_ANALOG_MISC0_TOG:
457
+ return "MISC0_TOG";
458
+ case CCM_ANALOG_MISC2:
459
+ return "MISC2";
460
+ case CCM_ANALOG_MISC2_SET:
461
+ return "MISC2_SET";
462
+ case CCM_ANALOG_MISC2_CLR:
463
+ return "MISC2_CLR";
464
+ case CCM_ANALOG_MISC2_TOG:
465
+ return "MISC2_TOG";
466
+ case PMU_REG_1P1:
467
+ return "PMU_REG_1P1";
468
+ case PMU_REG_3P0:
469
+ return "PMU_REG_3P0";
470
+ case PMU_REG_2P5:
471
+ return "PMU_REG_2P5";
472
+ case PMU_REG_CORE:
473
+ return "PMU_REG_CORE";
474
+ case PMU_MISC1:
475
+ return "PMU_MISC1";
476
+ case PMU_MISC1_SET:
477
+ return "PMU_MISC1_SET";
478
+ case PMU_MISC1_CLR:
479
+ return "PMU_MISC1_CLR";
480
+ case PMU_MISC1_TOG:
481
+ return "PMU_MISC1_TOG";
482
+ case USB_ANALOG_DIGPROG:
483
+ return "USB_ANALOG_DIGPROG";
484
+ default:
485
+ sprintf(unknown, "%d ?", reg);
486
+ return unknown;
487
+ }
488
+}
489
+
490
+#define CKIH_FREQ 24000000 /* 24MHz crystal input */
491
+
492
+static const VMStateDescription vmstate_imx6ul_ccm = {
493
+ .name = TYPE_IMX6UL_CCM,
494
+ .version_id = 1,
495
+ .minimum_version_id = 1,
496
+ .fields = (VMStateField[]) {
497
+ VMSTATE_UINT32_ARRAY(ccm, IMX6ULCCMState, CCM_MAX),
498
+ VMSTATE_UINT32_ARRAY(analog, IMX6ULCCMState, CCM_ANALOG_MAX),
499
+ VMSTATE_END_OF_LIST()
500
+ },
501
+};
502
+
503
+static uint64_t imx6ul_analog_get_osc_clk(IMX6ULCCMState *dev)
504
+{
505
+ uint64_t freq = CKIH_FREQ;
506
+
507
+ trace_ccm_freq((uint32_t)freq);
508
+
509
+ return freq;
510
+}
511
+
512
+static uint64_t imx6ul_analog_get_pll2_clk(IMX6ULCCMState *dev)
513
+{
514
+ uint64_t freq = imx6ul_analog_get_osc_clk(dev);
515
+
516
+ if (FIELD_EX32(dev->analog[CCM_ANALOG_PLL_SYS],
517
+ ANALOG_PLL_SYS, DIV_SELECT)) {
518
+ freq *= 22;
519
+ } else {
520
+ freq *= 20;
521
+ }
522
+
523
+ trace_ccm_freq((uint32_t)freq);
524
+
525
+ return freq;
526
+}
527
+
528
+static uint64_t imx6ul_analog_get_pll3_clk(IMX6ULCCMState *dev)
529
+{
530
+ uint64_t freq = imx6ul_analog_get_osc_clk(dev) * 20;
531
+
532
+ trace_ccm_freq((uint32_t)freq);
533
+
534
+ return freq;
535
+}
536
+
537
+static uint64_t imx6ul_analog_get_pll2_pfd0_clk(IMX6ULCCMState *dev)
538
+{
539
+ uint64_t freq = 0;
540
+
541
+ freq = imx6ul_analog_get_pll2_clk(dev) * 18
542
+ / FIELD_EX32(dev->analog[CCM_ANALOG_PFD_528],
543
+ ANALOG_PFD_528, PFD0_FRAC);
544
+
545
+ trace_ccm_freq((uint32_t)freq);
546
+
547
+ return freq;
548
+}
549
+
550
+static uint64_t imx6ul_analog_get_pll2_pfd2_clk(IMX6ULCCMState *dev)
551
+{
552
+ uint64_t freq = 0;
553
+
554
+ freq = imx6ul_analog_get_pll2_clk(dev) * 18
555
+ / FIELD_EX32(dev->analog[CCM_ANALOG_PFD_528],
556
+ ANALOG_PFD_528, PFD2_FRAC);
557
+
558
+ trace_ccm_freq((uint32_t)freq);
559
+
560
+ return freq;
561
+}
562
+
563
+static uint64_t imx6ul_analog_pll2_bypass_clk(IMX6ULCCMState *dev)
564
+{
565
+ uint64_t freq = 0;
566
+
567
+ trace_ccm_freq((uint32_t)freq);
568
+
569
+ return freq;
570
+}
571
+
572
+static uint64_t imx6ul_ccm_get_periph_clk2_sel_clk(IMX6ULCCMState *dev)
573
+{
574
+ uint64_t freq = 0;
575
+
576
+ switch (FIELD_EX32(dev->ccm[CCM_CBCMR], CBCMR, PERIPH_CLK2_SEL)) {
577
+ case 0:
578
+ freq = imx6ul_analog_get_pll3_clk(dev);
579
+ break;
580
+ case 1:
581
+ freq = imx6ul_analog_get_osc_clk(dev);
582
+ break;
583
+ case 2:
584
+ freq = imx6ul_analog_pll2_bypass_clk(dev);
585
+ break;
586
+ case 3:
587
+ /* We should never get there as 3 is a reserved value */
588
+ qemu_log_mask(LOG_GUEST_ERROR,
589
+ "[%s]%s: unsupported PERIPH_CLK2_SEL value 3\n",
590
+ TYPE_IMX6UL_CCM, __func__);
591
+ /* freq is set to 0 as we don't know what it should be */
592
+ break;
593
+ default:
594
+ g_assert_not_reached();
595
+ }
596
+
597
+ trace_ccm_freq((uint32_t)freq);
598
+
599
+ return freq;
600
+}
601
+
602
+static uint64_t imx6ul_ccm_get_periph_clk_sel_clk(IMX6ULCCMState *dev)
603
+{
604
+ uint64_t freq = 0;
605
+
606
+ switch (FIELD_EX32(dev->ccm[CCM_CBCMR], CBCMR, PRE_PERIPH_CLK_SEL)) {
607
+ case 0:
608
+ freq = imx6ul_analog_get_pll2_clk(dev);
609
+ break;
610
+ case 1:
611
+ freq = imx6ul_analog_get_pll2_pfd2_clk(dev);
612
+ break;
613
+ case 2:
614
+ freq = imx6ul_analog_get_pll2_pfd0_clk(dev);
615
+ break;
616
+ case 3:
617
+ freq = imx6ul_analog_get_pll2_pfd2_clk(dev) / 2;
618
+ break;
619
+ default:
620
+ g_assert_not_reached();
621
+ }
622
+
623
+ trace_ccm_freq((uint32_t)freq);
624
+
625
+ return freq;
626
+}
627
+
628
+static uint64_t imx6ul_ccm_get_periph_clk2_clk(IMX6ULCCMState *dev)
629
+{
630
+ uint64_t freq = 0;
631
+
632
+ freq = imx6ul_ccm_get_periph_clk2_sel_clk(dev)
633
+ / (1 + FIELD_EX32(dev->ccm[CCM_CBCDR], CBCDR, PERIPH_CLK2_PODF));
634
+
635
+ trace_ccm_freq((uint32_t)freq);
636
+
637
+ return freq;
638
+}
639
+
640
+static uint64_t imx6ul_ccm_get_periph_sel_clk(IMX6ULCCMState *dev)
641
+{
642
+ uint64_t freq = 0;
643
+
644
+ switch (FIELD_EX32(dev->ccm[CCM_CBCDR], CBCDR, PERIPH_CLK_SEL)) {
645
+ case 0:
646
+ freq = imx6ul_ccm_get_periph_clk_sel_clk(dev);
647
+ break;
648
+ case 1:
649
+ freq = imx6ul_ccm_get_periph_clk2_clk(dev);
650
+ break;
651
+ default:
652
+ g_assert_not_reached();
653
+ }
654
+
655
+ trace_ccm_freq((uint32_t)freq);
656
+
657
+ return freq;
658
+}
659
+
660
+static uint64_t imx6ul_ccm_get_ahb_clk(IMX6ULCCMState *dev)
661
+{
662
+ uint64_t freq = 0;
663
+
664
+ freq = imx6ul_ccm_get_periph_sel_clk(dev)
665
+ / (1 + FIELD_EX32(dev->ccm[CCM_CBCDR], CBCDR, AHB_PODF));
666
+
667
+ trace_ccm_freq((uint32_t)freq);
668
+
669
+ return freq;
670
+}
671
+
672
+static uint64_t imx6ul_ccm_get_ipg_clk(IMX6ULCCMState *dev)
673
+{
674
+ uint64_t freq = 0;
675
+
676
+ freq = imx6ul_ccm_get_ahb_clk(dev)
677
+ / (1 + FIELD_EX32(dev->ccm[CCM_CBCDR], CBCDR, IPG_PODF));
678
+
679
+ trace_ccm_freq((uint32_t)freq);
680
+
681
+ return freq;
682
+}
683
+
684
+static uint64_t imx6ul_ccm_get_per_sel_clk(IMX6ULCCMState *dev)
685
+{
686
+ uint64_t freq = 0;
687
+
688
+ switch (FIELD_EX32(dev->ccm[CCM_CSCMR1], CSCMR1, PERCLK_CLK_SEL)) {
689
+ case 0:
690
+ freq = imx6ul_ccm_get_ipg_clk(dev);
691
+ break;
692
+ case 1:
693
+ freq = imx6ul_analog_get_osc_clk(dev);
694
+ break;
695
+ default:
696
+ g_assert_not_reached();
697
+ }
698
+
699
+ trace_ccm_freq((uint32_t)freq);
700
+
701
+ return freq;
702
+}
703
+
704
+static uint64_t imx6ul_ccm_get_per_clk(IMX6ULCCMState *dev)
705
+{
706
+ uint64_t freq = 0;
707
+
708
+ freq = imx6ul_ccm_get_per_sel_clk(dev)
709
+ / (1 + FIELD_EX32(dev->ccm[CCM_CSCMR1], CSCMR1, PERCLK_PODF));
710
+
711
+ trace_ccm_freq((uint32_t)freq);
712
+
713
+ return freq;
714
+}
715
+
716
+static uint32_t imx6ul_ccm_get_clock_frequency(IMXCCMState *dev, IMXClk clock)
717
+{
718
+ uint32_t freq = 0;
719
+ IMX6ULCCMState *s = IMX6UL_CCM(dev);
720
+
721
+ switch (clock) {
722
+ case CLK_NONE:
723
+ break;
724
+ case CLK_IPG:
725
+ freq = imx6ul_ccm_get_ipg_clk(s);
726
+ break;
727
+ case CLK_IPG_HIGH:
728
+ freq = imx6ul_ccm_get_per_clk(s);
729
+ break;
730
+ case CLK_32k:
731
+ freq = CKIL_FREQ;
732
+ break;
733
+ case CLK_HIGH:
734
+ freq = CKIH_FREQ;
735
+ break;
736
+ case CLK_HIGH_DIV:
737
+ freq = CKIH_FREQ / 8;
738
+ break;
739
+ default:
740
+ qemu_log_mask(LOG_GUEST_ERROR, "[%s]%s: unsupported clock %d\n",
741
+ TYPE_IMX6UL_CCM, __func__, clock);
742
+ break;
743
+ }
744
+
745
+ trace_ccm_clock_freq(clock, freq);
746
+
747
+ return freq;
748
+}
749
+
750
+static void imx6ul_ccm_reset(DeviceState *dev)
751
+{
752
+ IMX6ULCCMState *s = IMX6UL_CCM(dev);
753
+
754
+ trace_ccm_entry();
755
+
756
+ s->ccm[CCM_CCR] = 0x0401167F;
757
+ s->ccm[CCM_CCDR] = 0x00000000;
758
+ s->ccm[CCM_CSR] = 0x00000010;
759
+ s->ccm[CCM_CCSR] = 0x00000100;
760
+ s->ccm[CCM_CACRR] = 0x00000000;
761
+ s->ccm[CCM_CBCDR] = 0x00018D00;
762
+ s->ccm[CCM_CBCMR] = 0x24860324;
763
+ s->ccm[CCM_CSCMR1] = 0x04900080;
764
+ s->ccm[CCM_CSCMR2] = 0x03192F06;
765
+ s->ccm[CCM_CSCDR1] = 0x00490B00;
766
+ s->ccm[CCM_CS1CDR] = 0x0EC102C1;
767
+ s->ccm[CCM_CS2CDR] = 0x000336C1;
768
+ s->ccm[CCM_CDCDR] = 0x33F71F92;
769
+ s->ccm[CCM_CHSCCDR] = 0x000248A4;
770
+ s->ccm[CCM_CSCDR2] = 0x00029B48;
771
+ s->ccm[CCM_CSCDR3] = 0x00014841;
772
+ s->ccm[CCM_CDHIPR] = 0x00000000;
773
+ s->ccm[CCM_CTOR] = 0x00000000;
774
+ s->ccm[CCM_CLPCR] = 0x00000079;
775
+ s->ccm[CCM_CISR] = 0x00000000;
776
+ s->ccm[CCM_CIMR] = 0xFFFFFFFF;
777
+ s->ccm[CCM_CCOSR] = 0x000A0001;
778
+ s->ccm[CCM_CGPR] = 0x0000FE62;
779
+ s->ccm[CCM_CCGR0] = 0xFFFFFFFF;
780
+ s->ccm[CCM_CCGR1] = 0xFFFFFFFF;
781
+ s->ccm[CCM_CCGR2] = 0xFC3FFFFF;
782
+ s->ccm[CCM_CCGR3] = 0xFFFFFFFF;
783
+ s->ccm[CCM_CCGR4] = 0xFFFFFFFF;
784
+ s->ccm[CCM_CCGR5] = 0xFFFFFFFF;
785
+ s->ccm[CCM_CCGR6] = 0xFFFFFFFF;
786
+ s->ccm[CCM_CMEOR] = 0xFFFFFFFF;
787
+
788
+ s->analog[CCM_ANALOG_PLL_ARM] = 0x00013063;
789
+ s->analog[CCM_ANALOG_PLL_USB1] = 0x00012000;
790
+ s->analog[CCM_ANALOG_PLL_USB2] = 0x00012000;
791
+ s->analog[CCM_ANALOG_PLL_SYS] = 0x00013001;
792
+ s->analog[CCM_ANALOG_PLL_SYS_SS] = 0x00000000;
793
+ s->analog[CCM_ANALOG_PLL_SYS_NUM] = 0x00000000;
794
+ s->analog[CCM_ANALOG_PLL_SYS_DENOM] = 0x00000012;
795
+ s->analog[CCM_ANALOG_PLL_AUDIO] = 0x00011006;
796
+ s->analog[CCM_ANALOG_PLL_AUDIO_NUM] = 0x05F5E100;
797
+ s->analog[CCM_ANALOG_PLL_AUDIO_DENOM] = 0x2964619C;
798
+ s->analog[CCM_ANALOG_PLL_VIDEO] = 0x0001100C;
799
+ s->analog[CCM_ANALOG_PLL_VIDEO_NUM] = 0x05F5E100;
800
+ s->analog[CCM_ANALOG_PLL_VIDEO_DENOM] = 0x10A24447;
801
+ s->analog[CCM_ANALOG_PLL_ENET] = 0x00011001;
802
+ s->analog[CCM_ANALOG_PFD_480] = 0x1311100C;
803
+ s->analog[CCM_ANALOG_PFD_528] = 0x1018101B;
804
+
805
+ s->analog[PMU_REG_1P1] = 0x00001073;
806
+ s->analog[PMU_REG_3P0] = 0x00000F74;
807
+ s->analog[PMU_REG_2P5] = 0x00001073;
808
+ s->analog[PMU_REG_CORE] = 0x00482012;
809
+ s->analog[PMU_MISC0] = 0x04000000;
810
+ s->analog[PMU_MISC1] = 0x00000000;
811
+ s->analog[PMU_MISC2] = 0x00272727;
812
+ s->analog[PMU_LOWPWR_CTRL] = 0x00004009;
813
+
814
+ s->analog[USB_ANALOG_USB1_VBUS_DETECT] = 0x01000004;
815
+ s->analog[USB_ANALOG_USB1_CHRG_DETECT] = 0x00000000;
816
+ s->analog[USB_ANALOG_USB1_VBUS_DETECT_STAT] = 0x00000000;
817
+ s->analog[USB_ANALOG_USB1_CHRG_DETECT_STAT] = 0x00000000;
818
+ s->analog[USB_ANALOG_USB1_MISC] = 0x00000002;
819
+ s->analog[USB_ANALOG_USB2_VBUS_DETECT] = 0x01000004;
820
+ s->analog[USB_ANALOG_USB2_CHRG_DETECT] = 0x00000000;
821
+ s->analog[USB_ANALOG_USB2_MISC] = 0x00000002;
822
+ s->analog[USB_ANALOG_DIGPROG] = 0x00640000;
823
+
824
+ /* all PLLs need to be locked */
825
+ s->analog[CCM_ANALOG_PLL_ARM] |= CCM_ANALOG_PLL_LOCK;
826
+ s->analog[CCM_ANALOG_PLL_USB1] |= CCM_ANALOG_PLL_LOCK;
827
+ s->analog[CCM_ANALOG_PLL_USB2] |= CCM_ANALOG_PLL_LOCK;
828
+ s->analog[CCM_ANALOG_PLL_SYS] |= CCM_ANALOG_PLL_LOCK;
829
+ s->analog[CCM_ANALOG_PLL_AUDIO] |= CCM_ANALOG_PLL_LOCK;
830
+ s->analog[CCM_ANALOG_PLL_VIDEO] |= CCM_ANALOG_PLL_LOCK;
831
+ s->analog[CCM_ANALOG_PLL_ENET] |= CCM_ANALOG_PLL_LOCK;
832
+
833
+ s->analog[TEMPMON_TEMPSENSE0] = 0x00000001;
834
+ s->analog[TEMPMON_TEMPSENSE1] = 0x00000001;
835
+ s->analog[TEMPMON_TEMPSENSE2] = 0x00000000;
836
+}
837
+
838
+static uint64_t imx6ul_ccm_read(void *opaque, hwaddr offset, unsigned size)
839
+{
840
+ uint32_t value = 0;
841
+ uint32_t index = offset >> 2;
842
+ IMX6ULCCMState *s = (IMX6ULCCMState *)opaque;
843
+
844
+ assert(index < CCM_MAX);
845
+
846
+ value = s->ccm[index];
847
+
848
+ trace_ccm_read_reg(imx6ul_ccm_reg_name(index), (uint32_t)value);
849
+
850
+ return (uint64_t)value;
851
+}
852
+
853
+static void imx6ul_ccm_write(void *opaque, hwaddr offset, uint64_t value,
854
+ unsigned size)
855
+{
856
+ uint32_t index = offset >> 2;
857
+ IMX6ULCCMState *s = (IMX6ULCCMState *)opaque;
858
+
859
+ assert(index < CCM_MAX);
860
+
861
+ trace_ccm_write_reg(imx6ul_ccm_reg_name(index), (uint32_t)value);
862
+
863
+ /*
864
+ * We will do a better implementation later. In particular some bits
865
+ * cannot be written to.
866
+ */
867
+ s->ccm[index] = (uint32_t)value;
868
+}
869
+
870
+static uint64_t imx6ul_analog_read(void *opaque, hwaddr offset, unsigned size)
871
+{
872
+ uint32_t value;
873
+ uint32_t index = offset >> 2;
874
+ IMX6ULCCMState *s = (IMX6ULCCMState *)opaque;
875
+
876
+ assert(index < CCM_ANALOG_MAX);
877
+
878
+ switch (index) {
879
+ case CCM_ANALOG_PLL_ARM_SET:
880
+ case CCM_ANALOG_PLL_USB1_SET:
881
+ case CCM_ANALOG_PLL_USB2_SET:
882
+ case CCM_ANALOG_PLL_SYS_SET:
883
+ case CCM_ANALOG_PLL_AUDIO_SET:
884
+ case CCM_ANALOG_PLL_VIDEO_SET:
885
+ case CCM_ANALOG_PLL_ENET_SET:
886
+ case CCM_ANALOG_PFD_480_SET:
887
+ case CCM_ANALOG_PFD_528_SET:
888
+ case CCM_ANALOG_MISC0_SET:
889
+ case PMU_MISC1_SET:
890
+ case CCM_ANALOG_MISC2_SET:
891
+ case USB_ANALOG_USB1_VBUS_DETECT_SET:
892
+ case USB_ANALOG_USB1_CHRG_DETECT_SET:
893
+ case USB_ANALOG_USB1_MISC_SET:
894
+ case USB_ANALOG_USB2_VBUS_DETECT_SET:
895
+ case USB_ANALOG_USB2_CHRG_DETECT_SET:
896
+ case USB_ANALOG_USB2_MISC_SET:
897
+ case TEMPMON_TEMPSENSE0_SET:
898
+ case TEMPMON_TEMPSENSE1_SET:
899
+ case TEMPMON_TEMPSENSE2_SET:
900
+ /*
901
+ * All REG_NAME_SET register access are in fact targeting
902
+ * the REG_NAME register.
903
+ */
904
+ value = s->analog[index - 1];
905
+ break;
906
+ case CCM_ANALOG_PLL_ARM_CLR:
907
+ case CCM_ANALOG_PLL_USB1_CLR:
908
+ case CCM_ANALOG_PLL_USB2_CLR:
909
+ case CCM_ANALOG_PLL_SYS_CLR:
910
+ case CCM_ANALOG_PLL_AUDIO_CLR:
911
+ case CCM_ANALOG_PLL_VIDEO_CLR:
912
+ case CCM_ANALOG_PLL_ENET_CLR:
913
+ case CCM_ANALOG_PFD_480_CLR:
914
+ case CCM_ANALOG_PFD_528_CLR:
915
+ case CCM_ANALOG_MISC0_CLR:
916
+ case PMU_MISC1_CLR:
917
+ case CCM_ANALOG_MISC2_CLR:
918
+ case USB_ANALOG_USB1_VBUS_DETECT_CLR:
919
+ case USB_ANALOG_USB1_CHRG_DETECT_CLR:
920
+ case USB_ANALOG_USB1_MISC_CLR:
921
+ case USB_ANALOG_USB2_VBUS_DETECT_CLR:
922
+ case USB_ANALOG_USB2_CHRG_DETECT_CLR:
923
+ case USB_ANALOG_USB2_MISC_CLR:
924
+ case TEMPMON_TEMPSENSE0_CLR:
925
+ case TEMPMON_TEMPSENSE1_CLR:
926
+ case TEMPMON_TEMPSENSE2_CLR:
927
+ /*
928
+ * All REG_NAME_CLR register access are in fact targeting
929
+ * the REG_NAME register.
930
+ */
931
+ value = s->analog[index - 2];
932
+ break;
933
+ case CCM_ANALOG_PLL_ARM_TOG:
934
+ case CCM_ANALOG_PLL_USB1_TOG:
935
+ case CCM_ANALOG_PLL_USB2_TOG:
936
+ case CCM_ANALOG_PLL_SYS_TOG:
937
+ case CCM_ANALOG_PLL_AUDIO_TOG:
938
+ case CCM_ANALOG_PLL_VIDEO_TOG:
939
+ case CCM_ANALOG_PLL_ENET_TOG:
940
+ case CCM_ANALOG_PFD_480_TOG:
941
+ case CCM_ANALOG_PFD_528_TOG:
942
+ case CCM_ANALOG_MISC0_TOG:
943
+ case PMU_MISC1_TOG:
944
+ case CCM_ANALOG_MISC2_TOG:
945
+ case USB_ANALOG_USB1_VBUS_DETECT_TOG:
946
+ case USB_ANALOG_USB1_CHRG_DETECT_TOG:
947
+ case USB_ANALOG_USB1_MISC_TOG:
948
+ case USB_ANALOG_USB2_VBUS_DETECT_TOG:
949
+ case USB_ANALOG_USB2_CHRG_DETECT_TOG:
950
+ case USB_ANALOG_USB2_MISC_TOG:
951
+ case TEMPMON_TEMPSENSE0_TOG:
952
+ case TEMPMON_TEMPSENSE1_TOG:
953
+ case TEMPMON_TEMPSENSE2_TOG:
954
+ /*
955
+ * All REG_NAME_TOG register access are in fact targeting
956
+ * the REG_NAME register.
957
+ */
958
+ value = s->analog[index - 3];
959
+ break;
960
+ default:
961
+ value = s->analog[index];
962
+ break;
963
+ }
964
+
965
+ trace_ccm_read_reg(imx6ul_analog_reg_name(index), (uint32_t)value);
966
+
967
+ return (uint64_t)value;
968
+}
969
+
970
+static void imx6ul_analog_write(void *opaque, hwaddr offset, uint64_t value,
971
+ unsigned size)
972
+{
973
+ uint32_t index = offset >> 2;
974
+ IMX6ULCCMState *s = (IMX6ULCCMState *)opaque;
975
+
976
+ assert(index < CCM_ANALOG_MAX);
977
+
978
+ trace_ccm_write_reg(imx6ul_analog_reg_name(index), (uint32_t)value);
979
+
980
+ switch (index) {
981
+ case CCM_ANALOG_PLL_ARM_SET:
982
+ case CCM_ANALOG_PLL_USB1_SET:
983
+ case CCM_ANALOG_PLL_USB2_SET:
984
+ case CCM_ANALOG_PLL_SYS_SET:
985
+ case CCM_ANALOG_PLL_AUDIO_SET:
986
+ case CCM_ANALOG_PLL_VIDEO_SET:
987
+ case CCM_ANALOG_PLL_ENET_SET:
988
+ case CCM_ANALOG_PFD_480_SET:
989
+ case CCM_ANALOG_PFD_528_SET:
990
+ case CCM_ANALOG_MISC0_SET:
991
+ case PMU_MISC1_SET:
992
+ case CCM_ANALOG_MISC2_SET:
993
+ case USB_ANALOG_USB1_VBUS_DETECT_SET:
994
+ case USB_ANALOG_USB1_CHRG_DETECT_SET:
995
+ case USB_ANALOG_USB1_MISC_SET:
996
+ case USB_ANALOG_USB2_VBUS_DETECT_SET:
997
+ case USB_ANALOG_USB2_CHRG_DETECT_SET:
998
+ case USB_ANALOG_USB2_MISC_SET:
999
+ /*
1000
+ * All REG_NAME_SET register access are in fact targeting
1001
+ * the REG_NAME register. So we change the value of the
1002
+ * REG_NAME register, setting bits passed in the value.
1003
+ */
1004
+ s->analog[index - 1] |= value;
1005
+ break;
1006
+ case CCM_ANALOG_PLL_ARM_CLR:
1007
+ case CCM_ANALOG_PLL_USB1_CLR:
1008
+ case CCM_ANALOG_PLL_USB2_CLR:
1009
+ case CCM_ANALOG_PLL_SYS_CLR:
1010
+ case CCM_ANALOG_PLL_AUDIO_CLR:
1011
+ case CCM_ANALOG_PLL_VIDEO_CLR:
1012
+ case CCM_ANALOG_PLL_ENET_CLR:
1013
+ case CCM_ANALOG_PFD_480_CLR:
1014
+ case CCM_ANALOG_PFD_528_CLR:
1015
+ case CCM_ANALOG_MISC0_CLR:
1016
+ case PMU_MISC1_CLR:
1017
+ case CCM_ANALOG_MISC2_CLR:
1018
+ case USB_ANALOG_USB1_VBUS_DETECT_CLR:
1019
+ case USB_ANALOG_USB1_CHRG_DETECT_CLR:
1020
+ case USB_ANALOG_USB1_MISC_CLR:
1021
+ case USB_ANALOG_USB2_VBUS_DETECT_CLR:
1022
+ case USB_ANALOG_USB2_CHRG_DETECT_CLR:
1023
+ case USB_ANALOG_USB2_MISC_CLR:
1024
+ /*
1025
+ * All REG_NAME_CLR register access are in fact targeting
1026
+ * the REG_NAME register. So we change the value of the
1027
+ * REG_NAME register, unsetting bits passed in the value.
1028
+ */
1029
+ s->analog[index - 2] &= ~value;
1030
+ break;
1031
+ case CCM_ANALOG_PLL_ARM_TOG:
1032
+ case CCM_ANALOG_PLL_USB1_TOG:
1033
+ case CCM_ANALOG_PLL_USB2_TOG:
1034
+ case CCM_ANALOG_PLL_SYS_TOG:
1035
+ case CCM_ANALOG_PLL_AUDIO_TOG:
1036
+ case CCM_ANALOG_PLL_VIDEO_TOG:
1037
+ case CCM_ANALOG_PLL_ENET_TOG:
1038
+ case CCM_ANALOG_PFD_480_TOG:
1039
+ case CCM_ANALOG_PFD_528_TOG:
1040
+ case CCM_ANALOG_MISC0_TOG:
1041
+ case PMU_MISC1_TOG:
1042
+ case CCM_ANALOG_MISC2_TOG:
1043
+ case USB_ANALOG_USB1_VBUS_DETECT_TOG:
1044
+ case USB_ANALOG_USB1_CHRG_DETECT_TOG:
1045
+ case USB_ANALOG_USB1_MISC_TOG:
1046
+ case USB_ANALOG_USB2_VBUS_DETECT_TOG:
1047
+ case USB_ANALOG_USB2_CHRG_DETECT_TOG:
1048
+ case USB_ANALOG_USB2_MISC_TOG:
1049
+ /*
1050
+ * All REG_NAME_TOG register access are in fact targeting
1051
+ * the REG_NAME register. So we change the value of the
1052
+ * REG_NAME register, toggling bits passed in the value.
1053
+ */
1054
+ s->analog[index - 3] ^= value;
1055
+ break;
1056
+ default:
1057
+ /*
1058
+ * We will do a better implementation later. In particular some bits
1059
+ * cannot be written to.
1060
+ */
1061
+ s->analog[index] = value;
1062
+ break;
1063
+ }
1064
+}
1065
+
1066
+static const struct MemoryRegionOps imx6ul_ccm_ops = {
1067
+ .read = imx6ul_ccm_read,
1068
+ .write = imx6ul_ccm_write,
1069
+ .endianness = DEVICE_NATIVE_ENDIAN,
1070
+ .valid = {
1071
+ /*
1072
+ * Our device would not work correctly if the guest was doing
1073
+ * unaligned access. This might not be a limitation on the real
1074
+ * device but in practice there is no reason for a guest to access
1075
+ * this device unaligned.
1076
+ */
1077
+ .min_access_size = 4,
1078
+ .max_access_size = 4,
1079
+ .unaligned = false,
1080
+ },
1081
+};
1082
+
1083
+static const struct MemoryRegionOps imx6ul_analog_ops = {
1084
+ .read = imx6ul_analog_read,
1085
+ .write = imx6ul_analog_write,
1086
+ .endianness = DEVICE_NATIVE_ENDIAN,
1087
+ .valid = {
1088
+ /*
1089
+ * Our device would not work correctly if the guest was doing
1090
+ * unaligned access. This might not be a limitation on the real
1091
+ * device but in practice there is no reason for a guest to access
1092
+ * this device unaligned.
1093
+ */
1094
+ .min_access_size = 4,
1095
+ .max_access_size = 4,
1096
+ .unaligned = false,
1097
+ },
1098
+};
1099
+
1100
+static void imx6ul_ccm_init(Object *obj)
1101
+{
1102
+ DeviceState *dev = DEVICE(obj);
1103
+ SysBusDevice *sd = SYS_BUS_DEVICE(obj);
1104
+ IMX6ULCCMState *s = IMX6UL_CCM(obj);
1105
+
1106
+ /* initialize a container for the all memory range */
1107
+ memory_region_init(&s->container, OBJECT(dev), TYPE_IMX6UL_CCM, 0x8000);
1108
+
1109
+ /* We initialize an IO memory region for the CCM part */
1110
+ memory_region_init_io(&s->ioccm, OBJECT(dev), &imx6ul_ccm_ops, s,
1111
+ TYPE_IMX6UL_CCM ".ccm", CCM_MAX * sizeof(uint32_t));
1112
+
1113
+ /* Add the CCM as a subregion at offset 0 */
1114
+ memory_region_add_subregion(&s->container, 0, &s->ioccm);
1115
+
1116
+ /* We initialize an IO memory region for the ANALOG part */
1117
+ memory_region_init_io(&s->ioanalog, OBJECT(dev), &imx6ul_analog_ops, s,
1118
+ TYPE_IMX6UL_CCM ".analog",
1119
+ CCM_ANALOG_MAX * sizeof(uint32_t));
1120
+
1121
+ /* Add the ANALOG as a subregion at offset 0x4000 */
1122
+ memory_region_add_subregion(&s->container, 0x4000, &s->ioanalog);
1123
+
1124
+ sysbus_init_mmio(sd, &s->container);
1125
+}
1126
+
1127
+static void imx6ul_ccm_class_init(ObjectClass *klass, void *data)
1128
+{
1129
+ DeviceClass *dc = DEVICE_CLASS(klass);
1130
+ IMXCCMClass *ccm = IMX_CCM_CLASS(klass);
1131
+
1132
+ dc->reset = imx6ul_ccm_reset;
1133
+ dc->vmsd = &vmstate_imx6ul_ccm;
1134
+ dc->desc = "i.MX6UL Clock Control Module";
1135
+
1136
+ ccm->get_clock_frequency = imx6ul_ccm_get_clock_frequency;
1137
+}
1138
+
1139
+static const TypeInfo imx6ul_ccm_info = {
1140
+ .name = TYPE_IMX6UL_CCM,
1141
+ .parent = TYPE_IMX_CCM,
1142
+ .instance_size = sizeof(IMX6ULCCMState),
1143
+ .instance_init = imx6ul_ccm_init,
1144
+ .class_init = imx6ul_ccm_class_init,
1145
+};
1146
+
1147
+static void imx6ul_ccm_register_types(void)
1148
+{
1149
+ type_register_static(&imx6ul_ccm_info);
1150
+}
1151
+
1152
+type_init(imx6ul_ccm_register_types)
1153
diff --git a/hw/misc/trace-events b/hw/misc/trace-events
1154
index XXXXXXX..XXXXXXX 100644
1155
--- a/hw/misc/trace-events
1156
+++ b/hw/misc/trace-events
1157
@@ -XXX,XX +XXX,XX @@ iotkit_secctl_s_write(uint32_t offset, uint64_t data, unsigned size) "IoTKit Sec
1158
iotkit_secctl_ns_read(uint32_t offset, uint64_t data, unsigned size) "IoTKit SecCtl NS regs read: offset 0x%x data 0x%" PRIx64 " size %u"
1159
iotkit_secctl_ns_write(uint32_t offset, uint64_t data, unsigned size) "IoTKit SecCtl NS regs write: offset 0x%x data 0x%" PRIx64 " size %u"
1160
iotkit_secctl_reset(void) "IoTKit SecCtl: reset"
1161
+
1162
+# hw/misc/imx6ul_ccm.c
1163
+ccm_entry(void) "\n"
1164
+ccm_freq(uint32_t freq) "freq = %d\n"
1165
+ccm_clock_freq(uint32_t clock, uint32_t freq) "(Clock = %d) = %d\n"
1166
+ccm_read_reg(const char *reg_name, uint32_t value) "reg[%s] <= 0x%" PRIx32 "\n"
1167
+ccm_write_reg(const char *reg_name, uint32_t value) "reg[%s] => 0x%" PRIx32 "\n"
29
--
1168
--
30
2.19.2
1169
2.18.0
31
1170
32
1171
diff view generated by jsdifflib
1
From: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
1
From: Jean-Christophe Dubois <jcd@tribudubois.net>
2
2
3
Use DeviceClass rather than SysBusDeviceClass in
3
Signed-off-by: Jean-Christophe Dubois <jcd@tribudubois.net>
4
pl050_class_init().
4
Message-id: 3853ec555d68e7e25d726170833b775796151a07.1532984236.git.jcd@tribudubois.net
5
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Cc: peter.maydell@linaro.org
7
Cc: qemu-arm@nongnu.org
8
9
Signed-off-by: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
10
Signed-off-by: Zhang Shengju <zhangshengju@cmss.chinamobile.com>
11
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
12
Message-id: 20181130093852.20739-10-maozhongyi@cmss.chinamobile.com
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
7
---
15
hw/input/pl050.c | 11 +++++------
8
hw/arm/Makefile.objs | 1 +
16
1 file changed, 5 insertions(+), 6 deletions(-)
9
include/hw/arm/fsl-imx6ul.h | 339 ++++++++++++++++++
10
hw/arm/fsl-imx6ul.c | 617 ++++++++++++++++++++++++++++++++
11
default-configs/arm-softmmu.mak | 1 +
12
4 files changed, 958 insertions(+)
13
create mode 100644 include/hw/arm/fsl-imx6ul.h
14
create mode 100644 hw/arm/fsl-imx6ul.c
17
15
18
diff --git a/hw/input/pl050.c b/hw/input/pl050.c
16
diff --git a/hw/arm/Makefile.objs b/hw/arm/Makefile.objs
19
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/input/pl050.c
18
--- a/hw/arm/Makefile.objs
21
+++ b/hw/input/pl050.c
19
+++ b/hw/arm/Makefile.objs
22
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps pl050_ops = {
20
@@ -XXX,XX +XXX,XX @@ obj-$(CONFIG_MSF2) += msf2-soc.o msf2-som.o
23
.endianness = DEVICE_NATIVE_ENDIAN,
21
obj-$(CONFIG_IOTKIT) += iotkit.o
24
};
22
obj-$(CONFIG_FSL_IMX7) += fsl-imx7.o mcimx7d-sabre.o
25
23
obj-$(CONFIG_ARM_SMMUV3) += smmu-common.o smmuv3.o
26
-static int pl050_initfn(SysBusDevice *dev)
24
+obj-$(CONFIG_FSL_IMX6UL) += fsl-imx6ul.o
27
+static void pl050_realize(DeviceState *dev, Error **errp)
25
diff --git a/include/hw/arm/fsl-imx6ul.h b/include/hw/arm/fsl-imx6ul.h
28
{
26
new file mode 100644
29
PL050State *s = PL050(dev);
27
index XXXXXXX..XXXXXXX
30
+ SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
28
--- /dev/null
31
29
+++ b/include/hw/arm/fsl-imx6ul.h
32
memory_region_init_io(&s->iomem, OBJECT(s), &pl050_ops, s, "pl050", 0x1000);
30
@@ -XXX,XX +XXX,XX @@
33
- sysbus_init_mmio(dev, &s->iomem);
31
+/*
34
- sysbus_init_irq(dev, &s->irq);
32
+ * Copyright (c) 2018 Jean-Christophe Dubois <jcd@tribudubois.net>
35
+ sysbus_init_mmio(sbd, &s->iomem);
33
+ *
36
+ sysbus_init_irq(sbd, &s->irq);
34
+ * i.MX6ul SoC definitions
37
if (s->is_mouse) {
35
+ *
38
s->dev = ps2_mouse_init(pl050_update, s);
36
+ * This program is free software; you can redistribute it and/or modify
39
} else {
37
+ * it under the terms of the GNU General Public License as published by
40
s->dev = ps2_kbd_init(pl050_update, s);
38
+ * the Free Software Foundation; either version 2 of the License, or
41
}
39
+ * (at your option) any later version.
42
- return 0;
40
+ *
43
}
41
+ * This program is distributed in the hope that it will be useful,
44
42
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
45
static void pl050_keyboard_init(Object *obj)
43
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
46
@@ -XXX,XX +XXX,XX @@ static const TypeInfo pl050_mouse_info = {
44
+ * GNU General Public License for more details.
47
static void pl050_class_init(ObjectClass *oc, void *data)
45
+ */
48
{
46
+
49
DeviceClass *dc = DEVICE_CLASS(oc);
47
+#ifndef FSL_IMX6UL_H
50
- SysBusDeviceClass *sdc = SYS_BUS_DEVICE_CLASS(oc);
48
+#define FSL_IMX6UL_H
51
49
+
52
- sdc->init = pl050_initfn;
50
+#include "hw/arm/arm.h"
53
+ dc->realize = pl050_realize;
51
+#include "hw/cpu/a15mpcore.h"
54
dc->vmsd = &vmstate_pl050;
52
+#include "hw/misc/imx6ul_ccm.h"
55
}
53
+#include "hw/misc/imx6_src.h"
54
+#include "hw/misc/imx7_snvs.h"
55
+#include "hw/misc/imx7_gpr.h"
56
+#include "hw/intc/imx_gpcv2.h"
57
+#include "hw/misc/imx2_wdt.h"
58
+#include "hw/gpio/imx_gpio.h"
59
+#include "hw/char/imx_serial.h"
60
+#include "hw/timer/imx_gpt.h"
61
+#include "hw/timer/imx_epit.h"
62
+#include "hw/i2c/imx_i2c.h"
63
+#include "hw/gpio/imx_gpio.h"
64
+#include "hw/sd/sdhci.h"
65
+#include "hw/ssi/imx_spi.h"
66
+#include "hw/net/imx_fec.h"
67
+#include "exec/memory.h"
68
+#include "cpu.h"
69
+
70
+#define TYPE_FSL_IMX6UL "fsl,imx6ul"
71
+#define FSL_IMX6UL(obj) OBJECT_CHECK(FslIMX6ULState, (obj), TYPE_FSL_IMX6UL)
72
+
73
+enum FslIMX6ULConfiguration {
74
+ FSL_IMX6UL_NUM_CPUS = 1,
75
+ FSL_IMX6UL_NUM_UARTS = 8,
76
+ FSL_IMX6UL_NUM_ETHS = 2,
77
+ FSL_IMX6UL_ETH_NUM_TX_RINGS = 2,
78
+ FSL_IMX6UL_NUM_USDHCS = 2,
79
+ FSL_IMX6UL_NUM_WDTS = 3,
80
+ FSL_IMX6UL_NUM_GPTS = 2,
81
+ FSL_IMX6UL_NUM_EPITS = 2,
82
+ FSL_IMX6UL_NUM_IOMUXCS = 2,
83
+ FSL_IMX6UL_NUM_GPIOS = 5,
84
+ FSL_IMX6UL_NUM_I2CS = 4,
85
+ FSL_IMX6UL_NUM_ECSPIS = 4,
86
+ FSL_IMX6UL_NUM_ADCS = 2,
87
+};
88
+
89
+typedef struct FslIMX6ULState {
90
+ /*< private >*/
91
+ DeviceState parent_obj;
92
+
93
+ /*< public >*/
94
+ ARMCPU cpu[FSL_IMX6UL_NUM_CPUS];
95
+ A15MPPrivState a7mpcore;
96
+ IMXGPTState gpt[FSL_IMX6UL_NUM_GPTS];
97
+ IMXEPITState epit[FSL_IMX6UL_NUM_EPITS];
98
+ IMXGPIOState gpio[FSL_IMX6UL_NUM_GPIOS];
99
+ IMX6ULCCMState ccm;
100
+ IMX6SRCState src;
101
+ IMX7SNVSState snvs;
102
+ IMXGPCv2State gpcv2;
103
+ IMX7GPRState gpr;
104
+ IMXSPIState spi[FSL_IMX6UL_NUM_ECSPIS];
105
+ IMXI2CState i2c[FSL_IMX6UL_NUM_I2CS];
106
+ IMXSerialState uart[FSL_IMX6UL_NUM_UARTS];
107
+ IMXFECState eth[FSL_IMX6UL_NUM_ETHS];
108
+ SDHCIState usdhc[FSL_IMX6UL_NUM_USDHCS];
109
+ IMX2WdtState wdt[FSL_IMX6UL_NUM_WDTS];
110
+ MemoryRegion rom;
111
+ MemoryRegion caam;
112
+ MemoryRegion ocram;
113
+ MemoryRegion ocram_alias;
114
+} FslIMX6ULState;
115
+
116
+enum FslIMX6ULMemoryMap {
117
+ FSL_IMX6UL_MMDC_ADDR = 0x80000000,
118
+ FSL_IMX6UL_MMDC_SIZE = 2 * 1024 * 1024 * 1024UL,
119
+
120
+ FSL_IMX6UL_QSPI1_MEM_ADDR = 0x60000000,
121
+ FSL_IMX6UL_EIM_ALIAS_ADDR = 0x58000000,
122
+ FSL_IMX6UL_EIM_CS_ADDR = 0x50000000,
123
+ FSL_IMX6UL_AES_ENCRYPT_ADDR = 0x10000000,
124
+ FSL_IMX6UL_QSPI1_RX_ADDR = 0x0C000000,
125
+
126
+ /* AIPS-2 */
127
+ FSL_IMX6UL_UART6_ADDR = 0x021FC000,
128
+ FSL_IMX6UL_I2C4_ADDR = 0x021F8000,
129
+ FSL_IMX6UL_UART5_ADDR = 0x021F4000,
130
+ FSL_IMX6UL_UART4_ADDR = 0x021F0000,
131
+ FSL_IMX6UL_UART3_ADDR = 0x021EC000,
132
+ FSL_IMX6UL_UART2_ADDR = 0x021E8000,
133
+ FSL_IMX6UL_WDOG3_ADDR = 0x021E4000,
134
+ FSL_IMX6UL_QSPI_ADDR = 0x021E0000,
135
+ FSL_IMX6UL_SYS_CNT_CTRL_ADDR = 0x021DC000,
136
+ FSL_IMX6UL_SYS_CNT_CMP_ADDR = 0x021D8000,
137
+ FSL_IMX6UL_SYS_CNT_RD_ADDR = 0x021D4000,
138
+ FSL_IMX6UL_TZASC_ADDR = 0x021D0000,
139
+ FSL_IMX6UL_PXP_ADDR = 0x021CC000,
140
+ FSL_IMX6UL_LCDIF_ADDR = 0x021C8000,
141
+ FSL_IMX6UL_CSI_ADDR = 0x021C4000,
142
+ FSL_IMX6UL_CSU_ADDR = 0x021C0000,
143
+ FSL_IMX6UL_OCOTP_CTRL_ADDR = 0x021BC000,
144
+ FSL_IMX6UL_EIM_ADDR = 0x021B8000,
145
+ FSL_IMX6UL_SIM2_ADDR = 0x021B4000,
146
+ FSL_IMX6UL_MMDC_CFG_ADDR = 0x021B0000,
147
+ FSL_IMX6UL_ROMCP_ADDR = 0x021AC000,
148
+ FSL_IMX6UL_I2C3_ADDR = 0x021A8000,
149
+ FSL_IMX6UL_I2C2_ADDR = 0x021A4000,
150
+ FSL_IMX6UL_I2C1_ADDR = 0x021A0000,
151
+ FSL_IMX6UL_ADC2_ADDR = 0x0219C000,
152
+ FSL_IMX6UL_ADC1_ADDR = 0x02198000,
153
+ FSL_IMX6UL_USDHC2_ADDR = 0x02194000,
154
+ FSL_IMX6UL_USDHC1_ADDR = 0x02190000,
155
+ FSL_IMX6UL_SIM1_ADDR = 0x0218C000,
156
+ FSL_IMX6UL_ENET1_ADDR = 0x02188000,
157
+ FSL_IMX6UL_USBO2_USBMISC_ADDR = 0x02184800,
158
+ FSL_IMX6UL_USBO2_USB_ADDR = 0x02184000,
159
+ FSL_IMX6UL_USBO2_PL301_ADDR = 0x02180000,
160
+ FSL_IMX6UL_AIPS2_CFG_ADDR = 0x0217C000,
161
+ FSL_IMX6UL_CAAM_ADDR = 0x02140000,
162
+ FSL_IMX6UL_A7MPCORE_DAP_ADDR = 0x02100000,
163
+
164
+ /* AIPS-1 */
165
+ FSL_IMX6UL_PWM8_ADDR = 0x020FC000,
166
+ FSL_IMX6UL_PWM7_ADDR = 0x020F8000,
167
+ FSL_IMX6UL_PWM6_ADDR = 0x020F4000,
168
+ FSL_IMX6UL_PWM5_ADDR = 0x020F0000,
169
+ FSL_IMX6UL_SDMA_ADDR = 0x020EC000,
170
+ FSL_IMX6UL_GPT2_ADDR = 0x020E8000,
171
+ FSL_IMX6UL_IOMUXC_GPR_ADDR = 0x020E4000,
172
+ FSL_IMX6UL_IOMUXC_ADDR = 0x020E0000,
173
+ FSL_IMX6UL_GPC_ADDR = 0x020DC000,
174
+ FSL_IMX6UL_SRC_ADDR = 0x020D8000,
175
+ FSL_IMX6UL_EPIT2_ADDR = 0x020D4000,
176
+ FSL_IMX6UL_EPIT1_ADDR = 0x020D0000,
177
+ FSL_IMX6UL_SNVS_HP_ADDR = 0x020CC000,
178
+ FSL_IMX6UL_ANALOG_ADDR = 0x020C8000,
179
+ FSL_IMX6UL_CCM_ADDR = 0x020C4000,
180
+ FSL_IMX6UL_WDOG2_ADDR = 0x020C0000,
181
+ FSL_IMX6UL_WDOG1_ADDR = 0x020BC000,
182
+ FSL_IMX6UL_KPP_ADDR = 0x020B8000,
183
+ FSL_IMX6UL_ENET2_ADDR = 0x020B4000,
184
+ FSL_IMX6UL_SNVS_LP_ADDR = 0x020B0000,
185
+ FSL_IMX6UL_GPIO5_ADDR = 0x020AC000,
186
+ FSL_IMX6UL_GPIO4_ADDR = 0x020A8000,
187
+ FSL_IMX6UL_GPIO3_ADDR = 0x020A4000,
188
+ FSL_IMX6UL_GPIO2_ADDR = 0x020A0000,
189
+ FSL_IMX6UL_GPIO1_ADDR = 0x0209C000,
190
+ FSL_IMX6UL_GPT1_ADDR = 0x02098000,
191
+ FSL_IMX6UL_CAN2_ADDR = 0x02094000,
192
+ FSL_IMX6UL_CAN1_ADDR = 0x02090000,
193
+ FSL_IMX6UL_PWM4_ADDR = 0x0208C000,
194
+ FSL_IMX6UL_PWM3_ADDR = 0x02088000,
195
+ FSL_IMX6UL_PWM2_ADDR = 0x02084000,
196
+ FSL_IMX6UL_PWM1_ADDR = 0x02080000,
197
+ FSL_IMX6UL_AIPS1_CFG_ADDR = 0x0207C000,
198
+ FSL_IMX6UL_BEE_ADDR = 0x02044000,
199
+ FSL_IMX6UL_TOUCH_CTRL_ADDR = 0x02040000,
200
+ FSL_IMX6UL_SPBA_ADDR = 0x0203C000,
201
+ FSL_IMX6UL_ASRC_ADDR = 0x02034000,
202
+ FSL_IMX6UL_SAI3_ADDR = 0x02030000,
203
+ FSL_IMX6UL_SAI2_ADDR = 0x0202C000,
204
+ FSL_IMX6UL_SAI1_ADDR = 0x02028000,
205
+ FSL_IMX6UL_UART8_ADDR = 0x02024000,
206
+ FSL_IMX6UL_UART1_ADDR = 0x02020000,
207
+ FSL_IMX6UL_UART7_ADDR = 0x02018000,
208
+ FSL_IMX6UL_ECSPI4_ADDR = 0x02014000,
209
+ FSL_IMX6UL_ECSPI3_ADDR = 0x02010000,
210
+ FSL_IMX6UL_ECSPI2_ADDR = 0x0200C000,
211
+ FSL_IMX6UL_ECSPI1_ADDR = 0x02008000,
212
+ FSL_IMX6UL_SPDIF_ADDR = 0x02004000,
213
+
214
+ FSL_IMX6UL_APBH_DMA_ADDR = 0x01804000,
215
+ FSL_IMX6UL_APBH_DMA_SIZE = (32 * 1024),
216
+
217
+ FSL_IMX6UL_A7MPCORE_ADDR = 0x00A00000,
218
+
219
+ FSL_IMX6UL_OCRAM_ALIAS_ADDR = 0x00920000,
220
+ FSL_IMX6UL_OCRAM_ALIAS_SIZE = 0x00060000,
221
+ FSL_IMX6UL_OCRAM_MEM_ADDR = 0x00900000,
222
+ FSL_IMX6UL_OCRAM_MEM_SIZE = 0x00020000,
223
+ FSL_IMX6UL_CAAM_MEM_ADDR = 0x00100000,
224
+ FSL_IMX6UL_CAAM_MEM_SIZE = 0x00008000,
225
+ FSL_IMX6UL_ROM_ADDR = 0x00000000,
226
+ FSL_IMX6UL_ROM_SIZE = 0x00018000,
227
+};
228
+
229
+enum FslIMX6ULIRQs {
230
+ FSL_IMX6UL_IOMUXC_IRQ = 0,
231
+ FSL_IMX6UL_DAP_IRQ = 1,
232
+ FSL_IMX6UL_SDMA_IRQ = 2,
233
+ FSL_IMX6UL_TSC_IRQ = 3,
234
+ FSL_IMX6UL_SNVS_IRQ = 4,
235
+ FSL_IMX6UL_LCDIF_IRQ = 5,
236
+ FSL_IMX6UL_BEE_IRQ = 6,
237
+ FSL_IMX6UL_CSI_IRQ = 7,
238
+ FSL_IMX6UL_PXP_IRQ = 8,
239
+ FSL_IMX6UL_SCTR1_IRQ = 9,
240
+ FSL_IMX6UL_SCTR2_IRQ = 10,
241
+ FSL_IMX6UL_WDOG3_IRQ = 11,
242
+ FSL_IMX6UL_APBH_DMA_IRQ = 13,
243
+ FSL_IMX6UL_WEIM_IRQ = 14,
244
+ FSL_IMX6UL_RAWNAND1_IRQ = 15,
245
+ FSL_IMX6UL_RAWNAND2_IRQ = 16,
246
+ FSL_IMX6UL_UART6_IRQ = 17,
247
+ FSL_IMX6UL_SRTC_IRQ = 19,
248
+ FSL_IMX6UL_SRTC_SEC_IRQ = 20,
249
+ FSL_IMX6UL_CSU_IRQ = 21,
250
+ FSL_IMX6UL_USDHC1_IRQ = 22,
251
+ FSL_IMX6UL_USDHC2_IRQ = 23,
252
+ FSL_IMX6UL_SAI3_IRQ = 24,
253
+ FSL_IMX6UL_SAI32_IRQ = 25,
254
+
255
+ FSL_IMX6UL_UART1_IRQ = 26,
256
+ FSL_IMX6UL_UART2_IRQ = 27,
257
+ FSL_IMX6UL_UART3_IRQ = 28,
258
+ FSL_IMX6UL_UART4_IRQ = 29,
259
+ FSL_IMX6UL_UART5_IRQ = 30,
260
+
261
+ FSL_IMX6UL_ECSPI1_IRQ = 31,
262
+ FSL_IMX6UL_ECSPI2_IRQ = 32,
263
+ FSL_IMX6UL_ECSPI3_IRQ = 33,
264
+ FSL_IMX6UL_ECSPI4_IRQ = 34,
265
+
266
+ FSL_IMX6UL_I2C4_IRQ = 35,
267
+ FSL_IMX6UL_I2C1_IRQ = 36,
268
+ FSL_IMX6UL_I2C2_IRQ = 37,
269
+ FSL_IMX6UL_I2C3_IRQ = 38,
270
+
271
+ FSL_IMX6UL_UART7_IRQ = 39,
272
+ FSL_IMX6UL_UART8_IRQ = 40,
273
+
274
+ FSL_IMX6UL_USB1_IRQ = 42,
275
+ FSL_IMX6UL_USB2_IRQ = 43,
276
+ FSL_IMX6UL_USB_PHY1_IRQ = 44,
277
+ FSL_IMX6UL_USB_PHY2_IRQ = 44,
278
+
279
+ FSL_IMX6UL_CAAM_JQ2_IRQ = 46,
280
+ FSL_IMX6UL_CAAM_ERR_IRQ = 47,
281
+ FSL_IMX6UL_CAAM_RTIC_IRQ = 48,
282
+ FSL_IMX6UL_TEMP_IRQ = 49,
283
+ FSL_IMX6UL_ASRC_IRQ = 50,
284
+ FSL_IMX6UL_SPDIF_IRQ = 52,
285
+ FSL_IMX6UL_PMU_REG_IRQ = 54,
286
+ FSL_IMX6UL_GPT1_IRQ = 55,
287
+
288
+ FSL_IMX6UL_EPIT1_IRQ = 56,
289
+ FSL_IMX6UL_EPIT2_IRQ = 57,
290
+
291
+ FSL_IMX6UL_GPIO1_INT7_IRQ = 58,
292
+ FSL_IMX6UL_GPIO1_INT6_IRQ = 59,
293
+ FSL_IMX6UL_GPIO1_INT5_IRQ = 60,
294
+ FSL_IMX6UL_GPIO1_INT4_IRQ = 61,
295
+ FSL_IMX6UL_GPIO1_INT3_IRQ = 62,
296
+ FSL_IMX6UL_GPIO1_INT2_IRQ = 63,
297
+ FSL_IMX6UL_GPIO1_INT1_IRQ = 64,
298
+ FSL_IMX6UL_GPIO1_INT0_IRQ = 65,
299
+ FSL_IMX6UL_GPIO1_LOW_IRQ = 66,
300
+ FSL_IMX6UL_GPIO1_HIGH_IRQ = 67,
301
+ FSL_IMX6UL_GPIO2_LOW_IRQ = 68,
302
+ FSL_IMX6UL_GPIO2_HIGH_IRQ = 69,
303
+ FSL_IMX6UL_GPIO3_LOW_IRQ = 70,
304
+ FSL_IMX6UL_GPIO3_HIGH_IRQ = 71,
305
+ FSL_IMX6UL_GPIO4_LOW_IRQ = 72,
306
+ FSL_IMX6UL_GPIO4_HIGH_IRQ = 73,
307
+ FSL_IMX6UL_GPIO5_LOW_IRQ = 74,
308
+ FSL_IMX6UL_GPIO5_HIGH_IRQ = 75,
309
+
310
+ FSL_IMX6UL_WDOG1_IRQ = 80,
311
+ FSL_IMX6UL_WDOG2_IRQ = 81,
312
+
313
+ FSL_IMX6UL_KPP_IRQ = 82,
314
+
315
+ FSL_IMX6UL_PWM1_IRQ = 83,
316
+ FSL_IMX6UL_PWM2_IRQ = 84,
317
+ FSL_IMX6UL_PWM3_IRQ = 85,
318
+ FSL_IMX6UL_PWM4_IRQ = 86,
319
+
320
+ FSL_IMX6UL_CCM1_IRQ = 87,
321
+ FSL_IMX6UL_CCM2_IRQ = 88,
322
+
323
+ FSL_IMX6UL_GPC_IRQ = 89,
324
+
325
+ FSL_IMX6UL_SRC_IRQ = 91,
326
+
327
+ FSL_IMX6UL_CPU_PERF_IRQ = 94,
328
+ FSL_IMX6UL_CPU_CTI_IRQ = 95,
329
+
330
+ FSL_IMX6UL_SRC_WDOG_IRQ = 96,
331
+
332
+ FSL_IMX6UL_SAI1_IRQ = 97,
333
+ FSL_IMX6UL_SAI2_IRQ = 98,
334
+
335
+ FSL_IMX6UL_ADC1_IRQ = 100,
336
+ FSL_IMX6UL_ADC2_IRQ = 101,
337
+
338
+ FSL_IMX6UL_SJC_IRQ = 104,
339
+
340
+ FSL_IMX6UL_CAAM_RING0_IRQ = 105,
341
+ FSL_IMX6UL_CAAM_RING1_IRQ = 106,
342
+
343
+ FSL_IMX6UL_QSPI_IRQ = 107,
344
+
345
+ FSL_IMX6UL_TZASC_IRQ = 108,
346
+
347
+ FSL_IMX6UL_GPT2_IRQ = 109,
348
+
349
+ FSL_IMX6UL_CAN1_IRQ = 110,
350
+ FSL_IMX6UL_CAN2_IRQ = 111,
351
+
352
+ FSL_IMX6UL_SIM1_IRQ = 112,
353
+ FSL_IMX6UL_SIM2_IRQ = 113,
354
+
355
+ FSL_IMX6UL_PWM5_IRQ = 114,
356
+ FSL_IMX6UL_PWM6_IRQ = 115,
357
+ FSL_IMX6UL_PWM7_IRQ = 116,
358
+ FSL_IMX6UL_PWM8_IRQ = 117,
359
+
360
+ FSL_IMX6UL_ENET1_IRQ = 118,
361
+ FSL_IMX6UL_ENET1_TIMER_IRQ = 119,
362
+ FSL_IMX6UL_ENET2_IRQ = 120,
363
+ FSL_IMX6UL_ENET2_TIMER_IRQ = 121,
364
+
365
+ FSL_IMX6UL_PMU_CORE_IRQ = 127,
366
+ FSL_IMX6UL_MAX_IRQ = 128,
367
+};
368
+
369
+#endif /* FSL_IMX6UL_H */
370
diff --git a/hw/arm/fsl-imx6ul.c b/hw/arm/fsl-imx6ul.c
371
new file mode 100644
372
index XXXXXXX..XXXXXXX
373
--- /dev/null
374
+++ b/hw/arm/fsl-imx6ul.c
375
@@ -XXX,XX +XXX,XX @@
376
+/*
377
+ * Copyright (c) 2018 Jean-Christophe Dubois <jcd@tribudubois.net>
378
+ *
379
+ * i.MX6UL SOC emulation.
380
+ *
381
+ * Based on hw/arm/fsl-imx7.c
382
+ *
383
+ * This program is free software; you can redistribute it and/or modify
384
+ * it under the terms of the GNU General Public License as published by
385
+ * the Free Software Foundation; either version 2 of the License, or
386
+ * (at your option) any later version.
387
+ *
388
+ * This program is distributed in the hope that it will be useful,
389
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
390
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
391
+ * GNU General Public License for more details.
392
+ */
393
+
394
+#include "qemu/osdep.h"
395
+#include "qapi/error.h"
396
+#include "qemu-common.h"
397
+#include "hw/arm/fsl-imx6ul.h"
398
+#include "hw/misc/unimp.h"
399
+#include "sysemu/sysemu.h"
400
+#include "qemu/error-report.h"
401
+
402
+#define NAME_SIZE 20
403
+
404
+static void fsl_imx6ul_init(Object *obj)
405
+{
406
+ FslIMX6ULState *s = FSL_IMX6UL(obj);
407
+ char name[NAME_SIZE];
408
+ int i;
409
+
410
+ for (i = 0; i < MIN(smp_cpus, FSL_IMX6UL_NUM_CPUS); i++) {
411
+ snprintf(name, NAME_SIZE, "cpu%d", i);
412
+ object_initialize_child(obj, name, &s->cpu[i], sizeof(s->cpu[i]),
413
+ "cortex-a7-" TYPE_ARM_CPU, &error_abort, NULL);
414
+ }
415
+
416
+ /*
417
+ * A7MPCORE
418
+ */
419
+ sysbus_init_child_obj(obj, "a7mpcore", &s->a7mpcore, sizeof(s->a7mpcore),
420
+ TYPE_A15MPCORE_PRIV);
421
+
422
+ /*
423
+ * CCM
424
+ */
425
+ sysbus_init_child_obj(obj, "ccm", &s->ccm, sizeof(s->ccm), TYPE_IMX6UL_CCM);
426
+
427
+ /*
428
+ * SRC
429
+ */
430
+ sysbus_init_child_obj(obj, "src", &s->src, sizeof(s->src), TYPE_IMX6_SRC);
431
+
432
+ /*
433
+ * GPCv2
434
+ */
435
+ sysbus_init_child_obj(obj, "gpcv2", &s->gpcv2, sizeof(s->gpcv2),
436
+ TYPE_IMX_GPCV2);
437
+
438
+ /*
439
+ * SNVS
440
+ */
441
+ sysbus_init_child_obj(obj, "snvs", &s->snvs, sizeof(s->snvs),
442
+ TYPE_IMX7_SNVS);
443
+
444
+ /*
445
+ * GPR
446
+ */
447
+ sysbus_init_child_obj(obj, "gpr", &s->gpr, sizeof(s->gpr),
448
+ TYPE_IMX7_GPR);
449
+
450
+ /*
451
+ * GPIOs 1 to 5
452
+ */
453
+ for (i = 0; i < FSL_IMX6UL_NUM_GPIOS; i++) {
454
+ snprintf(name, NAME_SIZE, "gpio%d", i);
455
+ sysbus_init_child_obj(obj, name, &s->gpio[i], sizeof(s->gpio[i]),
456
+ TYPE_IMX_GPIO);
457
+ }
458
+
459
+ /*
460
+ * GPT 1, 2
461
+ */
462
+ for (i = 0; i < FSL_IMX6UL_NUM_GPTS; i++) {
463
+ snprintf(name, NAME_SIZE, "gpt%d", i);
464
+ sysbus_init_child_obj(obj, name, &s->gpt[i], sizeof(s->gpt[i]),
465
+ TYPE_IMX7_GPT);
466
+ }
467
+
468
+ /*
469
+ * EPIT 1, 2
470
+ */
471
+ for (i = 0; i < FSL_IMX6UL_NUM_EPITS; i++) {
472
+ snprintf(name, NAME_SIZE, "epit%d", i + 1);
473
+ sysbus_init_child_obj(obj, name, &s->epit[i], sizeof(s->epit[i]),
474
+ TYPE_IMX_EPIT);
475
+ }
476
+
477
+ /*
478
+ * eCSPI
479
+ */
480
+ for (i = 0; i < FSL_IMX6UL_NUM_ECSPIS; i++) {
481
+ snprintf(name, NAME_SIZE, "spi%d", i + 1);
482
+ sysbus_init_child_obj(obj, name, &s->spi[i], sizeof(s->spi[i]),
483
+ TYPE_IMX_SPI);
484
+ }
485
+
486
+ /*
487
+ * I2C
488
+ */
489
+ for (i = 0; i < FSL_IMX6UL_NUM_I2CS; i++) {
490
+ snprintf(name, NAME_SIZE, "i2c%d", i + 1);
491
+ sysbus_init_child_obj(obj, name, &s->i2c[i], sizeof(s->i2c[i]),
492
+ TYPE_IMX_I2C);
493
+ }
494
+
495
+ /*
496
+ * UART
497
+ */
498
+ for (i = 0; i < FSL_IMX6UL_NUM_UARTS; i++) {
499
+ snprintf(name, NAME_SIZE, "uart%d", i);
500
+ sysbus_init_child_obj(obj, name, &s->uart[i], sizeof(s->uart[i]),
501
+ TYPE_IMX_SERIAL);
502
+ }
503
+
504
+ /*
505
+ * Ethernet
506
+ */
507
+ for (i = 0; i < FSL_IMX6UL_NUM_ETHS; i++) {
508
+ snprintf(name, NAME_SIZE, "eth%d", i);
509
+ sysbus_init_child_obj(obj, name, &s->eth[i], sizeof(s->eth[i]),
510
+ TYPE_IMX_ENET);
511
+ }
512
+
513
+ /*
514
+ * SDHCI
515
+ */
516
+ for (i = 0; i < FSL_IMX6UL_NUM_USDHCS; i++) {
517
+ snprintf(name, NAME_SIZE, "usdhc%d", i);
518
+ sysbus_init_child_obj(obj, name, &s->usdhc[i], sizeof(s->usdhc[i]),
519
+ TYPE_IMX_USDHC);
520
+ }
521
+
522
+ /*
523
+ * Watchdog
524
+ */
525
+ for (i = 0; i < FSL_IMX6UL_NUM_WDTS; i++) {
526
+ snprintf(name, NAME_SIZE, "wdt%d", i);
527
+ sysbus_init_child_obj(obj, name, &s->wdt[i], sizeof(s->wdt[i]),
528
+ TYPE_IMX2_WDT);
529
+ }
530
+}
531
+
532
+static void fsl_imx6ul_realize(DeviceState *dev, Error **errp)
533
+{
534
+ FslIMX6ULState *s = FSL_IMX6UL(dev);
535
+ int i;
536
+ qemu_irq irq;
537
+ char name[NAME_SIZE];
538
+
539
+ if (smp_cpus > FSL_IMX6UL_NUM_CPUS) {
540
+ error_setg(errp, "%s: Only %d CPUs are supported (%d requested)",
541
+ TYPE_FSL_IMX6UL, FSL_IMX6UL_NUM_CPUS, smp_cpus);
542
+ return;
543
+ }
544
+
545
+ for (i = 0; i < smp_cpus; i++) {
546
+ Object *o = OBJECT(&s->cpu[i]);
547
+
548
+ object_property_set_int(o, QEMU_PSCI_CONDUIT_SMC,
549
+ "psci-conduit", &error_abort);
550
+
551
+ /* On uniprocessor, the CBAR is set to 0 */
552
+ if (smp_cpus > 1) {
553
+ object_property_set_int(o, FSL_IMX6UL_A7MPCORE_ADDR,
554
+ "reset-cbar", &error_abort);
555
+ }
556
+
557
+ if (i) {
558
+ /* Secondary CPUs start in PSCI powered-down state */
559
+ object_property_set_bool(o, true,
560
+ "start-powered-off", &error_abort);
561
+ }
562
+
563
+ object_property_set_bool(o, true, "realized", &error_abort);
564
+ }
565
+
566
+ /*
567
+ * A7MPCORE
568
+ */
569
+ object_property_set_int(OBJECT(&s->a7mpcore), smp_cpus, "num-cpu",
570
+ &error_abort);
571
+ object_property_set_int(OBJECT(&s->a7mpcore),
572
+ FSL_IMX6UL_MAX_IRQ + GIC_INTERNAL,
573
+ "num-irq", &error_abort);
574
+ object_property_set_bool(OBJECT(&s->a7mpcore), true, "realized",
575
+ &error_abort);
576
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->a7mpcore), 0, FSL_IMX6UL_A7MPCORE_ADDR);
577
+
578
+ for (i = 0; i < smp_cpus; i++) {
579
+ SysBusDevice *sbd = SYS_BUS_DEVICE(&s->a7mpcore);
580
+ DeviceState *d = DEVICE(qemu_get_cpu(i));
581
+
582
+ irq = qdev_get_gpio_in(d, ARM_CPU_IRQ);
583
+ sysbus_connect_irq(sbd, i, irq);
584
+ sysbus_connect_irq(sbd, i + smp_cpus, qdev_get_gpio_in(d, ARM_CPU_FIQ));
585
+ }
586
+
587
+ /*
588
+ * A7MPCORE DAP
589
+ */
590
+ create_unimplemented_device("a7mpcore-dap", FSL_IMX6UL_A7MPCORE_DAP_ADDR,
591
+ 0x100000);
592
+
593
+ /*
594
+ * GPT 1, 2
595
+ */
596
+ for (i = 0; i < FSL_IMX6UL_NUM_GPTS; i++) {
597
+ static const hwaddr FSL_IMX6UL_GPTn_ADDR[FSL_IMX6UL_NUM_GPTS] = {
598
+ FSL_IMX6UL_GPT1_ADDR,
599
+ FSL_IMX6UL_GPT2_ADDR,
600
+ };
601
+
602
+ static const int FSL_IMX6UL_GPTn_IRQ[FSL_IMX6UL_NUM_GPTS] = {
603
+ FSL_IMX6UL_GPT1_IRQ,
604
+ FSL_IMX6UL_GPT2_IRQ,
605
+ };
606
+
607
+ s->gpt[i].ccm = IMX_CCM(&s->ccm);
608
+ object_property_set_bool(OBJECT(&s->gpt[i]), true, "realized",
609
+ &error_abort);
610
+
611
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->gpt[i]), 0,
612
+ FSL_IMX6UL_GPTn_ADDR[i]);
613
+
614
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->gpt[i]), 0,
615
+ qdev_get_gpio_in(DEVICE(&s->a7mpcore),
616
+ FSL_IMX6UL_GPTn_IRQ[i]));
617
+ }
618
+
619
+ /*
620
+ * EPIT 1, 2
621
+ */
622
+ for (i = 0; i < FSL_IMX6UL_NUM_EPITS; i++) {
623
+ static const hwaddr FSL_IMX6UL_EPITn_ADDR[FSL_IMX6UL_NUM_EPITS] = {
624
+ FSL_IMX6UL_EPIT1_ADDR,
625
+ FSL_IMX6UL_EPIT2_ADDR,
626
+ };
627
+
628
+ static const int FSL_IMX6UL_EPITn_IRQ[FSL_IMX6UL_NUM_EPITS] = {
629
+ FSL_IMX6UL_EPIT1_IRQ,
630
+ FSL_IMX6UL_EPIT2_IRQ,
631
+ };
632
+
633
+ s->epit[i].ccm = IMX_CCM(&s->ccm);
634
+ object_property_set_bool(OBJECT(&s->epit[i]), true, "realized",
635
+ &error_abort);
636
+
637
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->epit[i]), 0,
638
+ FSL_IMX6UL_EPITn_ADDR[i]);
639
+
640
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->epit[i]), 0,
641
+ qdev_get_gpio_in(DEVICE(&s->a7mpcore),
642
+ FSL_IMX6UL_EPITn_IRQ[i]));
643
+ }
644
+
645
+ /*
646
+ * GPIO
647
+ */
648
+ for (i = 0; i < FSL_IMX6UL_NUM_GPIOS; i++) {
649
+ static const hwaddr FSL_IMX6UL_GPIOn_ADDR[FSL_IMX6UL_NUM_GPIOS] = {
650
+ FSL_IMX6UL_GPIO1_ADDR,
651
+ FSL_IMX6UL_GPIO2_ADDR,
652
+ FSL_IMX6UL_GPIO3_ADDR,
653
+ FSL_IMX6UL_GPIO4_ADDR,
654
+ FSL_IMX6UL_GPIO5_ADDR,
655
+ };
656
+
657
+ static const int FSL_IMX6UL_GPIOn_LOW_IRQ[FSL_IMX6UL_NUM_GPIOS] = {
658
+ FSL_IMX6UL_GPIO1_LOW_IRQ,
659
+ FSL_IMX6UL_GPIO2_LOW_IRQ,
660
+ FSL_IMX6UL_GPIO3_LOW_IRQ,
661
+ FSL_IMX6UL_GPIO4_LOW_IRQ,
662
+ FSL_IMX6UL_GPIO5_LOW_IRQ,
663
+ };
664
+
665
+ static const int FSL_IMX6UL_GPIOn_HIGH_IRQ[FSL_IMX6UL_NUM_GPIOS] = {
666
+ FSL_IMX6UL_GPIO1_HIGH_IRQ,
667
+ FSL_IMX6UL_GPIO2_HIGH_IRQ,
668
+ FSL_IMX6UL_GPIO3_HIGH_IRQ,
669
+ FSL_IMX6UL_GPIO4_HIGH_IRQ,
670
+ FSL_IMX6UL_GPIO5_HIGH_IRQ,
671
+ };
672
+
673
+ object_property_set_bool(OBJECT(&s->gpio[i]), true, "realized",
674
+ &error_abort);
675
+
676
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->gpio[i]), 0,
677
+ FSL_IMX6UL_GPIOn_ADDR[i]);
678
+
679
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->gpio[i]), 0,
680
+ qdev_get_gpio_in(DEVICE(&s->a7mpcore),
681
+ FSL_IMX6UL_GPIOn_LOW_IRQ[i]));
682
+
683
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->gpio[i]), 1,
684
+ qdev_get_gpio_in(DEVICE(&s->a7mpcore),
685
+ FSL_IMX6UL_GPIOn_HIGH_IRQ[i]));
686
+ }
687
+
688
+ /*
689
+ * IOMUXC and IOMUXC_GPR
690
+ */
691
+ for (i = 0; i < 1; i++) {
692
+ static const hwaddr FSL_IMX6UL_IOMUXCn_ADDR[FSL_IMX6UL_NUM_IOMUXCS] = {
693
+ FSL_IMX6UL_IOMUXC_ADDR,
694
+ FSL_IMX6UL_IOMUXC_GPR_ADDR,
695
+ };
696
+
697
+ snprintf(name, NAME_SIZE, "iomuxc%d", i);
698
+ create_unimplemented_device(name, FSL_IMX6UL_IOMUXCn_ADDR[i], 0x4000);
699
+ }
700
+
701
+ /*
702
+ * CCM
703
+ */
704
+ object_property_set_bool(OBJECT(&s->ccm), true, "realized", &error_abort);
705
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->ccm), 0, FSL_IMX6UL_CCM_ADDR);
706
+
707
+ /*
708
+ * SRC
709
+ */
710
+ object_property_set_bool(OBJECT(&s->src), true, "realized", &error_abort);
711
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->src), 0, FSL_IMX6UL_SRC_ADDR);
712
+
713
+ /*
714
+ * GPCv2
715
+ */
716
+ object_property_set_bool(OBJECT(&s->gpcv2), true,
717
+ "realized", &error_abort);
718
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->gpcv2), 0, FSL_IMX6UL_GPC_ADDR);
719
+
720
+ /* Initialize all ECSPI */
721
+ for (i = 0; i < FSL_IMX6UL_NUM_ECSPIS; i++) {
722
+ static const hwaddr FSL_IMX6UL_SPIn_ADDR[FSL_IMX6UL_NUM_ECSPIS] = {
723
+ FSL_IMX6UL_ECSPI1_ADDR,
724
+ FSL_IMX6UL_ECSPI2_ADDR,
725
+ FSL_IMX6UL_ECSPI3_ADDR,
726
+ FSL_IMX6UL_ECSPI4_ADDR,
727
+ };
728
+
729
+ static const int FSL_IMX6UL_SPIn_IRQ[FSL_IMX6UL_NUM_ECSPIS] = {
730
+ FSL_IMX6UL_ECSPI1_IRQ,
731
+ FSL_IMX6UL_ECSPI2_IRQ,
732
+ FSL_IMX6UL_ECSPI3_IRQ,
733
+ FSL_IMX6UL_ECSPI4_IRQ,
734
+ };
735
+
736
+ /* Initialize the SPI */
737
+ object_property_set_bool(OBJECT(&s->spi[i]), true, "realized",
738
+ &error_abort);
739
+
740
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->spi[i]), 0,
741
+ FSL_IMX6UL_SPIn_ADDR[i]);
742
+
743
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->spi[i]), 0,
744
+ qdev_get_gpio_in(DEVICE(&s->a7mpcore),
745
+ FSL_IMX6UL_SPIn_IRQ[i]));
746
+ }
747
+
748
+ /*
749
+ * I2C
750
+ */
751
+ for (i = 0; i < FSL_IMX6UL_NUM_I2CS; i++) {
752
+ static const hwaddr FSL_IMX6UL_I2Cn_ADDR[FSL_IMX6UL_NUM_I2CS] = {
753
+ FSL_IMX6UL_I2C1_ADDR,
754
+ FSL_IMX6UL_I2C2_ADDR,
755
+ FSL_IMX6UL_I2C3_ADDR,
756
+ FSL_IMX6UL_I2C4_ADDR,
757
+ };
758
+
759
+ static const int FSL_IMX6UL_I2Cn_IRQ[FSL_IMX6UL_NUM_I2CS] = {
760
+ FSL_IMX6UL_I2C1_IRQ,
761
+ FSL_IMX6UL_I2C2_IRQ,
762
+ FSL_IMX6UL_I2C3_IRQ,
763
+ FSL_IMX6UL_I2C4_IRQ,
764
+ };
765
+
766
+ object_property_set_bool(OBJECT(&s->i2c[i]), true, "realized",
767
+ &error_abort);
768
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->i2c[i]), 0, FSL_IMX6UL_I2Cn_ADDR[i]);
769
+
770
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->i2c[i]), 0,
771
+ qdev_get_gpio_in(DEVICE(&s->a7mpcore),
772
+ FSL_IMX6UL_I2Cn_IRQ[i]));
773
+ }
774
+
775
+ /*
776
+ * UART
777
+ */
778
+ for (i = 0; i < FSL_IMX6UL_NUM_UARTS; i++) {
779
+ static const hwaddr FSL_IMX6UL_UARTn_ADDR[FSL_IMX6UL_NUM_UARTS] = {
780
+ FSL_IMX6UL_UART1_ADDR,
781
+ FSL_IMX6UL_UART2_ADDR,
782
+ FSL_IMX6UL_UART3_ADDR,
783
+ FSL_IMX6UL_UART4_ADDR,
784
+ FSL_IMX6UL_UART5_ADDR,
785
+ FSL_IMX6UL_UART6_ADDR,
786
+ FSL_IMX6UL_UART7_ADDR,
787
+ FSL_IMX6UL_UART8_ADDR,
788
+ };
789
+
790
+ static const int FSL_IMX6UL_UARTn_IRQ[FSL_IMX6UL_NUM_UARTS] = {
791
+ FSL_IMX6UL_UART1_IRQ,
792
+ FSL_IMX6UL_UART2_IRQ,
793
+ FSL_IMX6UL_UART3_IRQ,
794
+ FSL_IMX6UL_UART4_IRQ,
795
+ FSL_IMX6UL_UART5_IRQ,
796
+ FSL_IMX6UL_UART6_IRQ,
797
+ FSL_IMX6UL_UART7_IRQ,
798
+ FSL_IMX6UL_UART8_IRQ,
799
+ };
800
+
801
+ qdev_prop_set_chr(DEVICE(&s->uart[i]), "chardev", serial_hd(i));
802
+
803
+ object_property_set_bool(OBJECT(&s->uart[i]), true, "realized",
804
+ &error_abort);
805
+
806
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->uart[i]), 0,
807
+ FSL_IMX6UL_UARTn_ADDR[i]);
808
+
809
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->uart[i]), 0,
810
+ qdev_get_gpio_in(DEVICE(&s->a7mpcore),
811
+ FSL_IMX6UL_UARTn_IRQ[i]));
812
+ }
813
+
814
+ /*
815
+ * Ethernet
816
+ */
817
+ for (i = 0; i < FSL_IMX6UL_NUM_ETHS; i++) {
818
+ static const hwaddr FSL_IMX6UL_ENETn_ADDR[FSL_IMX6UL_NUM_ETHS] = {
819
+ FSL_IMX6UL_ENET1_ADDR,
820
+ FSL_IMX6UL_ENET2_ADDR,
821
+ };
822
+
823
+ static const int FSL_IMX6UL_ENETn_IRQ[FSL_IMX6UL_NUM_ETHS] = {
824
+ FSL_IMX6UL_ENET1_IRQ,
825
+ FSL_IMX6UL_ENET2_IRQ,
826
+ };
827
+
828
+ static const int FSL_IMX6UL_ENETn_TIMER_IRQ[FSL_IMX6UL_NUM_ETHS] = {
829
+ FSL_IMX6UL_ENET1_TIMER_IRQ,
830
+ FSL_IMX6UL_ENET2_TIMER_IRQ,
831
+ };
832
+
833
+ object_property_set_uint(OBJECT(&s->eth[i]),
834
+ FSL_IMX6UL_ETH_NUM_TX_RINGS,
835
+ "tx-ring-num", &error_abort);
836
+ qdev_set_nic_properties(DEVICE(&s->eth[i]), &nd_table[i]);
837
+ object_property_set_bool(OBJECT(&s->eth[i]), true, "realized",
838
+ &error_abort);
839
+
840
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->eth[i]), 0,
841
+ FSL_IMX6UL_ENETn_ADDR[i]);
842
+
843
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->eth[i]), 0,
844
+ qdev_get_gpio_in(DEVICE(&s->a7mpcore),
845
+ FSL_IMX6UL_ENETn_IRQ[i]));
846
+
847
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->eth[i]), 1,
848
+ qdev_get_gpio_in(DEVICE(&s->a7mpcore),
849
+ FSL_IMX6UL_ENETn_TIMER_IRQ[i]));
850
+ }
851
+
852
+ /*
853
+ * USDHC
854
+ */
855
+ for (i = 0; i < FSL_IMX6UL_NUM_USDHCS; i++) {
856
+ static const hwaddr FSL_IMX6UL_USDHCn_ADDR[FSL_IMX6UL_NUM_USDHCS] = {
857
+ FSL_IMX6UL_USDHC1_ADDR,
858
+ FSL_IMX6UL_USDHC2_ADDR,
859
+ };
860
+
861
+ static const int FSL_IMX6UL_USDHCn_IRQ[FSL_IMX6UL_NUM_USDHCS] = {
862
+ FSL_IMX6UL_USDHC1_IRQ,
863
+ FSL_IMX6UL_USDHC2_IRQ,
864
+ };
865
+
866
+ object_property_set_bool(OBJECT(&s->usdhc[i]), true, "realized",
867
+ &error_abort);
868
+
869
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->usdhc[i]), 0,
870
+ FSL_IMX6UL_USDHCn_ADDR[i]);
871
+
872
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->usdhc[i]), 0,
873
+ qdev_get_gpio_in(DEVICE(&s->a7mpcore),
874
+ FSL_IMX6UL_USDHCn_IRQ[i]));
875
+ }
876
+
877
+ /*
878
+ * SNVS
879
+ */
880
+ object_property_set_bool(OBJECT(&s->snvs), true, "realized", &error_abort);
881
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->snvs), 0, FSL_IMX6UL_SNVS_HP_ADDR);
882
+
883
+ /*
884
+ * Watchdog
885
+ */
886
+ for (i = 0; i < FSL_IMX6UL_NUM_WDTS; i++) {
887
+ static const hwaddr FSL_IMX6UL_WDOGn_ADDR[FSL_IMX6UL_NUM_WDTS] = {
888
+ FSL_IMX6UL_WDOG1_ADDR,
889
+ FSL_IMX6UL_WDOG2_ADDR,
890
+ FSL_IMX6UL_WDOG3_ADDR,
891
+ };
892
+
893
+ object_property_set_bool(OBJECT(&s->wdt[i]), true, "realized",
894
+ &error_abort);
895
+
896
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->wdt[i]), 0,
897
+ FSL_IMX6UL_WDOGn_ADDR[i]);
898
+ }
899
+
900
+ /*
901
+ * GPR
902
+ */
903
+ object_property_set_bool(OBJECT(&s->gpr), true, "realized",
904
+ &error_abort);
905
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->gpr), 0, FSL_IMX6UL_IOMUXC_GPR_ADDR);
906
+
907
+ /*
908
+ * SDMA
909
+ */
910
+ create_unimplemented_device("sdma", FSL_IMX6UL_SDMA_ADDR, 0x4000);
911
+
912
+ /*
913
+ * APHB_DMA
914
+ */
915
+ create_unimplemented_device("aphb_dma", FSL_IMX6UL_APBH_DMA_ADDR,
916
+ FSL_IMX6UL_APBH_DMA_SIZE);
917
+
918
+ /*
919
+ * ADCs
920
+ */
921
+ for (i = 0; i < FSL_IMX6UL_NUM_ADCS; i++) {
922
+ static const hwaddr FSL_IMX6UL_ADCn_ADDR[FSL_IMX6UL_NUM_ADCS] = {
923
+ FSL_IMX6UL_ADC1_ADDR,
924
+ FSL_IMX6UL_ADC2_ADDR,
925
+ };
926
+
927
+ snprintf(name, NAME_SIZE, "adc%d", i);
928
+ create_unimplemented_device(name, FSL_IMX6UL_ADCn_ADDR[i], 0x4000);
929
+ }
930
+
931
+ /*
932
+ * LCD
933
+ */
934
+ create_unimplemented_device("lcdif", FSL_IMX6UL_LCDIF_ADDR, 0x4000);
935
+
936
+ /*
937
+ * ROM memory
938
+ */
939
+ memory_region_init_rom(&s->rom, NULL, "imx6ul.rom",
940
+ FSL_IMX6UL_ROM_SIZE, &error_abort);
941
+ memory_region_add_subregion(get_system_memory(), FSL_IMX6UL_ROM_ADDR,
942
+ &s->rom);
943
+
944
+ /*
945
+ * CAAM memory
946
+ */
947
+ memory_region_init_rom(&s->caam, NULL, "imx6ul.caam",
948
+ FSL_IMX6UL_CAAM_MEM_SIZE, &error_abort);
949
+ memory_region_add_subregion(get_system_memory(), FSL_IMX6UL_CAAM_MEM_ADDR,
950
+ &s->caam);
951
+
952
+ /*
953
+ * OCRAM memory
954
+ */
955
+ memory_region_init_ram(&s->ocram, NULL, "imx6ul.ocram",
956
+ FSL_IMX6UL_OCRAM_MEM_SIZE,
957
+ &error_abort);
958
+ memory_region_add_subregion(get_system_memory(), FSL_IMX6UL_OCRAM_MEM_ADDR,
959
+ &s->ocram);
960
+
961
+ /*
962
+ * internal OCRAM (128 KB) is aliased over 512 KB
963
+ */
964
+ memory_region_init_alias(&s->ocram_alias, NULL, "imx6ul.ocram_alias",
965
+ &s->ocram, 0, FSL_IMX6UL_OCRAM_ALIAS_SIZE);
966
+ memory_region_add_subregion(get_system_memory(),
967
+ FSL_IMX6UL_OCRAM_ALIAS_ADDR, &s->ocram_alias);
968
+}
969
+
970
+static void fsl_imx6ul_class_init(ObjectClass *oc, void *data)
971
+{
972
+ DeviceClass *dc = DEVICE_CLASS(oc);
973
+
974
+ dc->realize = fsl_imx6ul_realize;
975
+ dc->desc = "i.MX6UL SOC";
976
+ /* Reason: Uses serial_hds and nd_table in realize() directly */
977
+ dc->user_creatable = false;
978
+}
979
+
980
+static const TypeInfo fsl_imx6ul_type_info = {
981
+ .name = TYPE_FSL_IMX6UL,
982
+ .parent = TYPE_DEVICE,
983
+ .instance_size = sizeof(FslIMX6ULState),
984
+ .instance_init = fsl_imx6ul_init,
985
+ .class_init = fsl_imx6ul_class_init,
986
+};
987
+
988
+static void fsl_imx6ul_register_types(void)
989
+{
990
+ type_register_static(&fsl_imx6ul_type_info);
991
+}
992
+type_init(fsl_imx6ul_register_types)
993
diff --git a/default-configs/arm-softmmu.mak b/default-configs/arm-softmmu.mak
994
index XXXXXXX..XXXXXXX 100644
995
--- a/default-configs/arm-softmmu.mak
996
+++ b/default-configs/arm-softmmu.mak
997
@@ -XXX,XX +XXX,XX @@ CONFIG_FSL_IMX6=y
998
CONFIG_FSL_IMX31=y
999
CONFIG_FSL_IMX25=y
1000
CONFIG_FSL_IMX7=y
1001
+CONFIG_FSL_IMX6UL=y
1002
1003
CONFIG_IMX_I2C=y
56
1004
57
--
1005
--
58
2.19.2
1006
2.18.0
59
1007
60
1008
diff view generated by jsdifflib
1
From: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
1
From: Jean-Christophe Dubois <jcd@tribudubois.net>
2
2
3
Currently, all sysbus devices have been converted to realize(),
3
Tested by booting linux 4.18 (built using imx_v6_v7_defconfig) on the
4
so remove this path.
4
emulated board.
5
5
6
Cc: ehabkost@redhat.com
6
Signed-off-by: Jean-Christophe Dubois <jcd@tribudubois.net>
7
Cc: thuth@redhat.com
7
Message-id: 3f8eb4300206634dc01e04b12f65b73c0ad2f955.1532984236.git.jcd@tribudubois.net
8
Cc: pbonzini@redhat.com
9
Cc: armbru@redhat.com
10
Cc: peter.maydell@linaro.org
11
Cc: richard.henderson@linaro.org
12
Cc: alistair.francis@wdc.com
13
14
Signed-off-by: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
15
Signed-off-by: Zhang Shengju <zhangshengju@cmss.chinamobile.com>
16
Message-id: 20181130093852.20739-22-maozhongyi@cmss.chinamobile.com
17
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
---
10
---
20
include/hw/sysbus.h | 3 ---
11
hw/arm/Makefile.objs | 2 +-
21
hw/core/sysbus.c | 15 +++++----------
12
hw/arm/mcimx6ul-evk.c | 85 +++++++++++++++++++++++++++++++++++++++++++
22
2 files changed, 5 insertions(+), 13 deletions(-)
13
2 files changed, 86 insertions(+), 1 deletion(-)
14
create mode 100644 hw/arm/mcimx6ul-evk.c
23
15
24
diff --git a/include/hw/sysbus.h b/include/hw/sysbus.h
16
diff --git a/hw/arm/Makefile.objs b/hw/arm/Makefile.objs
25
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
26
--- a/include/hw/sysbus.h
18
--- a/hw/arm/Makefile.objs
27
+++ b/include/hw/sysbus.h
19
+++ b/hw/arm/Makefile.objs
28
@@ -XXX,XX +XXX,XX @@ typedef struct SysBusDevice SysBusDevice;
20
@@ -XXX,XX +XXX,XX @@ obj-$(CONFIG_MSF2) += msf2-soc.o msf2-som.o
29
typedef struct SysBusDeviceClass {
21
obj-$(CONFIG_IOTKIT) += iotkit.o
30
/*< private >*/
22
obj-$(CONFIG_FSL_IMX7) += fsl-imx7.o mcimx7d-sabre.o
31
DeviceClass parent_class;
23
obj-$(CONFIG_ARM_SMMUV3) += smmu-common.o smmuv3.o
32
- /*< public >*/
24
-obj-$(CONFIG_FSL_IMX6UL) += fsl-imx6ul.o
33
-
25
+obj-$(CONFIG_FSL_IMX6UL) += fsl-imx6ul.o mcimx6ul-evk.o
34
- int (*init)(SysBusDevice *dev);
26
diff --git a/hw/arm/mcimx6ul-evk.c b/hw/arm/mcimx6ul-evk.c
35
27
new file mode 100644
36
/*
28
index XXXXXXX..XXXXXXX
37
* Let the sysbus device format its own non-PIO, non-MMIO unit address.
29
--- /dev/null
38
diff --git a/hw/core/sysbus.c b/hw/core/sysbus.c
30
+++ b/hw/arm/mcimx6ul-evk.c
39
index XXXXXXX..XXXXXXX 100644
31
@@ -XXX,XX +XXX,XX @@
40
--- a/hw/core/sysbus.c
32
+/*
41
+++ b/hw/core/sysbus.c
33
+ * Copyright (c) 2018 Jean-Christophe Dubois <jcd@tribudubois.net>
42
@@ -XXX,XX +XXX,XX @@ void sysbus_init_ioports(SysBusDevice *dev, uint32_t ioport, uint32_t size)
34
+ *
43
}
35
+ * MCIMX6UL_EVK Board System emulation.
44
}
36
+ *
45
37
+ * This code is licensed under the GPL, version 2 or later.
46
-/* TODO remove once all sysbus devices have been converted to realize */
38
+ * See the file `COPYING' in the top level directory.
47
+/* The purpose of preserving this empty realize function
39
+ *
48
+ * is to prevent the parent_realize field of some subclasses
40
+ * It (partially) emulates a mcimx6ul_evk board, with a Freescale
49
+ * from being set to NULL to break the normal init/realize
41
+ * i.MX6ul SoC
50
+ * of some devices.
51
+ */
42
+ */
52
static void sysbus_realize(DeviceState *dev, Error **errp)
43
+
53
{
44
+#include "qemu/osdep.h"
54
- SysBusDevice *sd = SYS_BUS_DEVICE(dev);
45
+#include "qapi/error.h"
55
- SysBusDeviceClass *sbc = SYS_BUS_DEVICE_GET_CLASS(sd);
46
+#include "qemu-common.h"
56
-
47
+#include "hw/arm/fsl-imx6ul.h"
57
- if (!sbc->init) {
48
+#include "hw/boards.h"
58
- return;
49
+#include "sysemu/sysemu.h"
59
- }
50
+#include "qemu/error-report.h"
60
- if (sbc->init(sd) < 0) {
51
+#include "sysemu/qtest.h"
61
- error_setg(errp, "Device initialization failed");
52
+
62
- }
53
+typedef struct {
63
}
54
+ FslIMX6ULState soc;
64
55
+ MemoryRegion ram;
65
DeviceState *sysbus_create_varargs(const char *name,
56
+} MCIMX6ULEVK;
57
+
58
+static void mcimx6ul_evk_init(MachineState *machine)
59
+{
60
+ static struct arm_boot_info boot_info;
61
+ MCIMX6ULEVK *s = g_new0(MCIMX6ULEVK, 1);
62
+ int i;
63
+
64
+ if (machine->ram_size > FSL_IMX6UL_MMDC_SIZE) {
65
+ error_report("RAM size " RAM_ADDR_FMT " above max supported (%08x)",
66
+ machine->ram_size, FSL_IMX6UL_MMDC_SIZE);
67
+ exit(1);
68
+ }
69
+
70
+ boot_info = (struct arm_boot_info) {
71
+ .loader_start = FSL_IMX6UL_MMDC_ADDR,
72
+ .board_id = -1,
73
+ .ram_size = machine->ram_size,
74
+ .kernel_filename = machine->kernel_filename,
75
+ .kernel_cmdline = machine->kernel_cmdline,
76
+ .initrd_filename = machine->initrd_filename,
77
+ .nb_cpus = smp_cpus,
78
+ };
79
+
80
+ object_initialize_child(OBJECT(machine), "soc", &s->soc, sizeof(s->soc),
81
+ TYPE_FSL_IMX6UL, &error_fatal, NULL);
82
+
83
+ object_property_set_bool(OBJECT(&s->soc), true, "realized", &error_fatal);
84
+
85
+ memory_region_allocate_system_memory(&s->ram, NULL, "mcimx6ul-evk.ram",
86
+ machine->ram_size);
87
+ memory_region_add_subregion(get_system_memory(),
88
+ FSL_IMX6UL_MMDC_ADDR, &s->ram);
89
+
90
+ for (i = 0; i < FSL_IMX6UL_NUM_USDHCS; i++) {
91
+ BusState *bus;
92
+ DeviceState *carddev;
93
+ DriveInfo *di;
94
+ BlockBackend *blk;
95
+
96
+ di = drive_get_next(IF_SD);
97
+ blk = di ? blk_by_legacy_dinfo(di) : NULL;
98
+ bus = qdev_get_child_bus(DEVICE(&s->soc.usdhc[i]), "sd-bus");
99
+ carddev = qdev_create(bus, TYPE_SD_CARD);
100
+ qdev_prop_set_drive(carddev, "drive", blk, &error_fatal);
101
+ object_property_set_bool(OBJECT(carddev), true,
102
+ "realized", &error_fatal);
103
+ }
104
+
105
+ if (!qtest_enabled()) {
106
+ arm_load_kernel(&s->soc.cpu[0], &boot_info);
107
+ }
108
+}
109
+
110
+static void mcimx6ul_evk_machine_init(MachineClass *mc)
111
+{
112
+ mc->desc = "Freescale i.MX6UL Evaluation Kit (Cortex A7)";
113
+ mc->init = mcimx6ul_evk_init;
114
+ mc->max_cpus = FSL_IMX6UL_NUM_CPUS;
115
+}
116
+DEFINE_MACHINE("mcimx6ul-evk", mcimx6ul_evk_machine_init)
66
--
117
--
67
2.19.2
118
2.18.0
68
119
69
120
diff view generated by jsdifflib
1
From: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
1
From: Stefan Hajnoczi <stefanha@redhat.com>
2
2
3
Use DeviceClass rather than SysBusDeviceClass in
3
Some ARM CPUs have bitbanded IO, a memory region that allows convenient
4
grlib_gptimer_class_init().
4
bit access via 32-bit memory loads/stores. This eliminates the need for
5
read-modify-update instruction sequences.
5
6
6
Cc: chouteau@adacore.com
7
This patch makes this optional feature an ARMv7MState qdev property,
8
allowing boards to choose whether they want bitbanding or not.
7
9
8
Signed-off-by: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
10
Status of boards:
9
Signed-off-by: Zhang Shengju <zhangshengju@cmss.chinamobile.com>
11
* iotkit (Cortex M33), no bitband
10
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
12
* mps2 (Cortex M3), bitband
11
Message-id: 20181130093852.20739-18-maozhongyi@cmss.chinamobile.com
13
* msf2 (Cortex M3), bitband
14
* stellaris (Cortex M3), bitband
15
* stm32f205 (Cortex M3), bitband
16
17
As a side-effect of this patch, Peter Maydell noted that the Ethernet
18
controller on mps2 board is now accessible. Previously they were hidden
19
by the bitband region (which does not exist on the real board).
20
21
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
22
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
23
Message-id: 20180814162739.11814-2-stefanha@redhat.com
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
24
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
25
---
14
hw/timer/grlib_gptimer.c | 11 +++++------
26
include/hw/arm/armv7m.h | 2 ++
15
1 file changed, 5 insertions(+), 6 deletions(-)
27
hw/arm/armv7m.c | 37 ++++++++++++++++++++-----------------
28
hw/arm/mps2.c | 1 +
29
hw/arm/msf2-soc.c | 1 +
30
hw/arm/stellaris.c | 1 +
31
hw/arm/stm32f205_soc.c | 1 +
32
6 files changed, 26 insertions(+), 17 deletions(-)
16
33
17
diff --git a/hw/timer/grlib_gptimer.c b/hw/timer/grlib_gptimer.c
34
diff --git a/include/hw/arm/armv7m.h b/include/hw/arm/armv7m.h
18
index XXXXXXX..XXXXXXX 100644
35
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/timer/grlib_gptimer.c
36
--- a/include/hw/arm/armv7m.h
20
+++ b/hw/timer/grlib_gptimer.c
37
+++ b/include/hw/arm/armv7m.h
21
@@ -XXX,XX +XXX,XX @@ static void grlib_gptimer_reset(DeviceState *d)
38
@@ -XXX,XX +XXX,XX @@ typedef struct {
39
* devices will be automatically layered on top of this view.)
40
* + Property "idau": IDAU interface (forwarded to CPU object)
41
* + Property "init-svtor": secure VTOR reset value (forwarded to CPU object)
42
+ * + Property "enable-bitband": expose bitbanded IO
43
*/
44
typedef struct ARMv7MState {
45
/*< private >*/
46
@@ -XXX,XX +XXX,XX @@ typedef struct ARMv7MState {
47
MemoryRegion *board_memory;
48
Object *idau;
49
uint32_t init_svtor;
50
+ bool enable_bitband;
51
} ARMv7MState;
52
53
#endif
54
diff --git a/hw/arm/armv7m.c b/hw/arm/armv7m.c
55
index XXXXXXX..XXXXXXX 100644
56
--- a/hw/arm/armv7m.c
57
+++ b/hw/arm/armv7m.c
58
@@ -XXX,XX +XXX,XX @@ static void armv7m_realize(DeviceState *dev, Error **errp)
59
memory_region_add_subregion(&s->container, 0xe000e000,
60
sysbus_mmio_get_region(sbd, 0));
61
62
- for (i = 0; i < ARRAY_SIZE(s->bitband); i++) {
63
- Object *obj = OBJECT(&s->bitband[i]);
64
- SysBusDevice *sbd = SYS_BUS_DEVICE(&s->bitband[i]);
65
+ if (s->enable_bitband) {
66
+ for (i = 0; i < ARRAY_SIZE(s->bitband); i++) {
67
+ Object *obj = OBJECT(&s->bitband[i]);
68
+ SysBusDevice *sbd = SYS_BUS_DEVICE(&s->bitband[i]);
69
70
- object_property_set_int(obj, bitband_input_addr[i], "base", &err);
71
- if (err != NULL) {
72
- error_propagate(errp, err);
73
- return;
74
- }
75
- object_property_set_link(obj, OBJECT(s->board_memory),
76
- "source-memory", &error_abort);
77
- object_property_set_bool(obj, true, "realized", &err);
78
- if (err != NULL) {
79
- error_propagate(errp, err);
80
- return;
81
- }
82
+ object_property_set_int(obj, bitband_input_addr[i], "base", &err);
83
+ if (err != NULL) {
84
+ error_propagate(errp, err);
85
+ return;
86
+ }
87
+ object_property_set_link(obj, OBJECT(s->board_memory),
88
+ "source-memory", &error_abort);
89
+ object_property_set_bool(obj, true, "realized", &err);
90
+ if (err != NULL) {
91
+ error_propagate(errp, err);
92
+ return;
93
+ }
94
95
- memory_region_add_subregion(&s->container, bitband_output_addr[i],
96
- sysbus_mmio_get_region(sbd, 0));
97
+ memory_region_add_subregion(&s->container, bitband_output_addr[i],
98
+ sysbus_mmio_get_region(sbd, 0));
99
+ }
22
}
100
}
23
}
101
}
24
102
25
-static int grlib_gptimer_init(SysBusDevice *dev)
103
@@ -XXX,XX +XXX,XX @@ static Property armv7m_properties[] = {
26
+static void grlib_gptimer_realize(DeviceState *dev, Error **errp)
104
MemoryRegion *),
27
{
105
DEFINE_PROP_LINK("idau", ARMv7MState, idau, TYPE_IDAU_INTERFACE, Object *),
28
GPTimerUnit *unit = GRLIB_GPTIMER(dev);
106
DEFINE_PROP_UINT32("init-svtor", ARMv7MState, init_svtor, 0),
29
unsigned int i;
107
+ DEFINE_PROP_BOOL("enable-bitband", ARMv7MState, enable_bitband, false),
30
+ SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
108
DEFINE_PROP_END_OF_LIST(),
31
109
};
32
assert(unit->nr_timers > 0);
110
33
assert(unit->nr_timers <= GPTIMER_MAX_TIMERS);
111
diff --git a/hw/arm/mps2.c b/hw/arm/mps2.c
34
@@ -XXX,XX +XXX,XX @@ static int grlib_gptimer_init(SysBusDevice *dev)
112
index XXXXXXX..XXXXXXX 100644
35
timer->id = i;
113
--- a/hw/arm/mps2.c
36
114
+++ b/hw/arm/mps2.c
37
/* One IRQ line for each timer */
115
@@ -XXX,XX +XXX,XX @@ static void mps2_common_init(MachineState *machine)
38
- sysbus_init_irq(dev, &timer->irq);
116
g_assert_not_reached();
39
+ sysbus_init_irq(sbd, &timer->irq);
40
41
ptimer_set_freq(timer->ptimer, unit->freq_hz);
42
}
117
}
43
@@ -XXX,XX +XXX,XX @@ static int grlib_gptimer_init(SysBusDevice *dev)
118
qdev_prop_set_string(armv7m, "cpu-type", machine->cpu_type);
44
unit, "gptimer",
119
+ qdev_prop_set_bit(armv7m, "enable-bitband", true);
45
UNIT_REG_SIZE + GPTIMER_REG_SIZE * unit->nr_timers);
120
object_property_set_link(OBJECT(&mms->armv7m), OBJECT(system_memory),
46
121
"memory", &error_abort);
47
- sysbus_init_mmio(dev, &unit->iomem);
122
object_property_set_bool(OBJECT(&mms->armv7m), true, "realized",
48
- return 0;
123
diff --git a/hw/arm/msf2-soc.c b/hw/arm/msf2-soc.c
49
+ sysbus_init_mmio(sbd, &unit->iomem);
124
index XXXXXXX..XXXXXXX 100644
50
}
125
--- a/hw/arm/msf2-soc.c
51
126
+++ b/hw/arm/msf2-soc.c
52
static Property grlib_gptimer_properties[] = {
127
@@ -XXX,XX +XXX,XX @@ static void m2sxxx_soc_realize(DeviceState *dev_soc, Error **errp)
53
@@ -XXX,XX +XXX,XX @@ static Property grlib_gptimer_properties[] = {
128
armv7m = DEVICE(&s->armv7m);
54
static void grlib_gptimer_class_init(ObjectClass *klass, void *data)
129
qdev_prop_set_uint32(armv7m, "num-irq", 81);
55
{
130
qdev_prop_set_string(armv7m, "cpu-type", s->cpu_type);
56
DeviceClass *dc = DEVICE_CLASS(klass);
131
+ qdev_prop_set_bit(armv7m, "enable-bitband", true);
57
- SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
132
object_property_set_link(OBJECT(&s->armv7m), OBJECT(get_system_memory()),
58
133
"memory", &error_abort);
59
- k->init = grlib_gptimer_init;
134
object_property_set_bool(OBJECT(&s->armv7m), true, "realized", &err);
60
+ dc->realize = grlib_gptimer_realize;
135
diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
61
dc->reset = grlib_gptimer_reset;
136
index XXXXXXX..XXXXXXX 100644
62
dc->props = grlib_gptimer_properties;
137
--- a/hw/arm/stellaris.c
63
}
138
+++ b/hw/arm/stellaris.c
139
@@ -XXX,XX +XXX,XX @@ static void stellaris_init(MachineState *ms, stellaris_board_info *board)
140
nvic = qdev_create(NULL, TYPE_ARMV7M);
141
qdev_prop_set_uint32(nvic, "num-irq", NUM_IRQ_LINES);
142
qdev_prop_set_string(nvic, "cpu-type", ms->cpu_type);
143
+ qdev_prop_set_bit(nvic, "enable-bitband", true);
144
object_property_set_link(OBJECT(nvic), OBJECT(get_system_memory()),
145
"memory", &error_abort);
146
/* This will exit with an error if the user passed us a bad cpu_type */
147
diff --git a/hw/arm/stm32f205_soc.c b/hw/arm/stm32f205_soc.c
148
index XXXXXXX..XXXXXXX 100644
149
--- a/hw/arm/stm32f205_soc.c
150
+++ b/hw/arm/stm32f205_soc.c
151
@@ -XXX,XX +XXX,XX @@ static void stm32f205_soc_realize(DeviceState *dev_soc, Error **errp)
152
armv7m = DEVICE(&s->armv7m);
153
qdev_prop_set_uint32(armv7m, "num-irq", 96);
154
qdev_prop_set_string(armv7m, "cpu-type", s->cpu_type);
155
+ qdev_prop_set_bit(armv7m, "enable-bitband", true);
156
object_property_set_link(OBJECT(&s->armv7m), OBJECT(get_system_memory()),
157
"memory", &error_abort);
158
object_property_set_bool(OBJECT(&s->armv7m), true, "realized", &err);
64
--
159
--
65
2.19.2
160
2.18.0
66
161
67
162
diff view generated by jsdifflib
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
1
From: Stefan Hajnoczi <stefanha@redhat.com>
2
2
3
Reduce number of virtio-mmio instances. This is in preparation
3
Define a "cortex-m0" ARMv6-M CPU model.
4
for correcting the interrupt setup for Versal.
5
4
6
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
5
Most of the register reset values set by other CPU models are not
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
relevant for the cut-down ARMv6-M architecture.
8
Message-id: 20181129163655.20370-3-edgar.iglesias@gmail.com
7
8
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
Message-id: 20180814162739.11814-3-stefanha@redhat.com
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
13
---
11
hw/arm/xlnx-versal-virt.c | 2 +-
14
target/arm/cpu.c | 11 +++++++++++
12
1 file changed, 1 insertion(+), 1 deletion(-)
15
1 file changed, 11 insertions(+)
13
16
14
diff --git a/hw/arm/xlnx-versal-virt.c b/hw/arm/xlnx-versal-virt.c
17
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
15
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/arm/xlnx-versal-virt.c
19
--- a/target/arm/cpu.c
17
+++ b/hw/arm/xlnx-versal-virt.c
20
+++ b/target/arm/cpu.c
18
@@ -XXX,XX +XXX,XX @@ static void *versal_virt_get_dtb(const struct arm_boot_info *binfo,
21
@@ -XXX,XX +XXX,XX @@ static void arm11mpcore_initfn(Object *obj)
19
return board->fdt;
22
cpu->reset_auxcr = 1;
20
}
23
}
21
24
22
-#define NUM_VIRTIO_TRANSPORT 32
25
+static void cortex_m0_initfn(Object *obj)
23
+#define NUM_VIRTIO_TRANSPORT 8
26
+{
24
static void create_virtio_regions(VersalVirt *s)
27
+ ARMCPU *cpu = ARM_CPU(obj);
28
+ set_feature(&cpu->env, ARM_FEATURE_V6);
29
+ set_feature(&cpu->env, ARM_FEATURE_M);
30
+
31
+ cpu->midr = 0x410cc200;
32
+}
33
+
34
static void cortex_m3_initfn(Object *obj)
25
{
35
{
26
int virtio_mmio_size = 0x200;
36
ARMCPU *cpu = ARM_CPU(obj);
37
@@ -XXX,XX +XXX,XX @@ static const ARMCPUInfo arm_cpus[] = {
38
{ .name = "arm1136", .initfn = arm1136_initfn },
39
{ .name = "arm1176", .initfn = arm1176_initfn },
40
{ .name = "arm11mpcore", .initfn = arm11mpcore_initfn },
41
+ { .name = "cortex-m0", .initfn = cortex_m0_initfn,
42
+ .class_init = arm_v7m_class_init },
43
{ .name = "cortex-m3", .initfn = cortex_m3_initfn,
44
.class_init = arm_v7m_class_init },
45
{ .name = "cortex-m4", .initfn = cortex_m4_initfn,
27
--
46
--
28
2.19.2
47
2.18.0
29
48
30
49
diff view generated by jsdifflib
1
From: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
1
From: Stefan Hajnoczi <stefanha@redhat.com>
2
2
3
Use DeviceClass rather than SysBusDeviceClass in
3
The next patch will need to free a rom. There is already code to do
4
etraxfs_timer_class_init().
4
this in rom_add_file().
5
5
6
Cc: edgar.iglesias@gmail.com
6
Note that rom_add_file() uses:
7
7
8
Signed-off-by: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
8
rom = g_malloc0(sizeof(*rom));
9
Signed-off-by: Zhang Shengju <zhangshengju@cmss.chinamobile.com>
9
...
10
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
10
if (rom->fw_dir) {
11
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
11
g_free(rom->fw_dir);
12
Message-id: 20181130093852.20739-17-maozhongyi@cmss.chinamobile.com
12
g_free(rom->fw_file);
13
}
14
15
The conditional is unnecessary since g_free(NULL) is a no-op.
16
17
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
18
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
19
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
20
Message-id: 20180814162739.11814-4-stefanha@redhat.com
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
21
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
22
---
15
hw/timer/etraxfs_timer.c | 14 +++++++-------
23
hw/core/loader.c | 21 ++++++++++++---------
16
1 file changed, 7 insertions(+), 7 deletions(-)
24
1 file changed, 12 insertions(+), 9 deletions(-)
17
25
18
diff --git a/hw/timer/etraxfs_timer.c b/hw/timer/etraxfs_timer.c
26
diff --git a/hw/core/loader.c b/hw/core/loader.c
19
index XXXXXXX..XXXXXXX 100644
27
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/timer/etraxfs_timer.c
28
--- a/hw/core/loader.c
21
+++ b/hw/timer/etraxfs_timer.c
29
+++ b/hw/core/loader.c
22
@@ -XXX,XX +XXX,XX @@ static void etraxfs_timer_reset(void *opaque)
30
@@ -XXX,XX +XXX,XX @@ struct Rom {
23
qemu_irq_lower(t->irq);
31
static FWCfgState *fw_cfg;
32
static QTAILQ_HEAD(, Rom) roms = QTAILQ_HEAD_INITIALIZER(roms);
33
34
+/* rom->data must be heap-allocated (do not use with rom_add_elf_program()) */
35
+static void rom_free(Rom *rom)
36
+{
37
+ g_free(rom->data);
38
+ g_free(rom->path);
39
+ g_free(rom->name);
40
+ g_free(rom->fw_dir);
41
+ g_free(rom->fw_file);
42
+ g_free(rom);
43
+}
44
+
45
static inline bool rom_order_compare(Rom *rom, Rom *item)
46
{
47
return ((uintptr_t)(void *)rom->as > (uintptr_t)(void *)item->as) ||
48
@@ -XXX,XX +XXX,XX @@ err:
49
if (fd != -1)
50
close(fd);
51
52
- g_free(rom->data);
53
- g_free(rom->path);
54
- g_free(rom->name);
55
- if (fw_dir) {
56
- g_free(rom->fw_dir);
57
- g_free(rom->fw_file);
58
- }
59
- g_free(rom);
60
-
61
+ rom_free(rom);
62
return -1;
24
}
63
}
25
64
26
-static int etraxfs_timer_init(SysBusDevice *dev)
27
+static void etraxfs_timer_realize(DeviceState *dev, Error **errp)
28
{
29
ETRAXTimerState *t = ETRAX_TIMER(dev);
30
+ SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
31
32
t->bh_t0 = qemu_bh_new(timer0_hit, t);
33
t->bh_t1 = qemu_bh_new(timer1_hit, t);
34
@@ -XXX,XX +XXX,XX @@ static int etraxfs_timer_init(SysBusDevice *dev)
35
t->ptimer_t1 = ptimer_init(t->bh_t1, PTIMER_POLICY_DEFAULT);
36
t->ptimer_wd = ptimer_init(t->bh_wd, PTIMER_POLICY_DEFAULT);
37
38
- sysbus_init_irq(dev, &t->irq);
39
- sysbus_init_irq(dev, &t->nmi);
40
+ sysbus_init_irq(sbd, &t->irq);
41
+ sysbus_init_irq(sbd, &t->nmi);
42
43
memory_region_init_io(&t->mmio, OBJECT(t), &timer_ops, t,
44
"etraxfs-timer", 0x5c);
45
- sysbus_init_mmio(dev, &t->mmio);
46
+ sysbus_init_mmio(sbd, &t->mmio);
47
qemu_register_reset(etraxfs_timer_reset, t);
48
- return 0;
49
}
50
51
static void etraxfs_timer_class_init(ObjectClass *klass, void *data)
52
{
53
- SysBusDeviceClass *sdc = SYS_BUS_DEVICE_CLASS(klass);
54
+ DeviceClass *dc = DEVICE_CLASS(klass);
55
56
- sdc->init = etraxfs_timer_init;
57
+ dc->realize = etraxfs_timer_realize;
58
}
59
60
static const TypeInfo etraxfs_timer_info = {
61
--
65
--
62
2.19.2
66
2.18.0
63
67
64
68
diff view generated by jsdifflib
1
From: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
1
From: Stefan Hajnoczi <stefanha@redhat.com>
2
2
3
Use DeviceClass rather than SysBusDeviceClass in
3
Image file loaders may add a series of roms. If an error occurs partway
4
milkymist_hpdmc_class_init().
4
through loading there is no easy way to drop previously added roms.
5
5
6
Cc: gxt@mprc.pku.edu.cn
6
This patch adds a transaction mechanism that works like this:
7
Cc: michael@walle.cc
8
7
9
Signed-off-by: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
8
rom_transaction_begin();
10
Signed-off-by: Zhang Shengju <zhangshengju@cmss.chinamobile.com>
9
...call rom_add_*()...
11
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
10
rom_transaction_end(ok);
12
Message-id: 20181130093852.20739-12-maozhongyi@cmss.chinamobile.com
11
12
If ok is false then roms added in this transaction are dropped.
13
14
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
15
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
16
Message-id: 20180814162739.11814-5-stefanha@redhat.com
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
18
---
15
hw/misc/milkymist-hpdmc.c | 9 +++------
19
include/hw/loader.h | 19 +++++++++++++++++++
16
1 file changed, 3 insertions(+), 6 deletions(-)
20
hw/core/loader.c | 32 ++++++++++++++++++++++++++++++++
21
2 files changed, 51 insertions(+)
17
22
18
diff --git a/hw/misc/milkymist-hpdmc.c b/hw/misc/milkymist-hpdmc.c
23
diff --git a/include/hw/loader.h b/include/hw/loader.h
19
index XXXXXXX..XXXXXXX 100644
24
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/misc/milkymist-hpdmc.c
25
--- a/include/hw/loader.h
21
+++ b/hw/misc/milkymist-hpdmc.c
26
+++ b/include/hw/loader.h
22
@@ -XXX,XX +XXX,XX @@ static void milkymist_hpdmc_reset(DeviceState *d)
27
@@ -XXX,XX +XXX,XX @@ int rom_check_and_register_reset(void);
23
| IODELAY_PLL2_LOCKED;
28
void rom_set_fw(FWCfgState *f);
29
void rom_set_order_override(int order);
30
void rom_reset_order_override(void);
31
+
32
+/**
33
+ * rom_transaction_begin:
34
+ *
35
+ * Call this before of a series of rom_add_*() calls. Call
36
+ * rom_transaction_end() afterwards to commit or abort. These functions are
37
+ * useful for undoing a series of rom_add_*() calls if image file loading fails
38
+ * partway through.
39
+ */
40
+void rom_transaction_begin(void);
41
+
42
+/**
43
+ * rom_transaction_end:
44
+ * @commit: true to commit added roms, false to drop added roms
45
+ *
46
+ * Call this after a series of rom_add_*() calls. See rom_transaction_begin().
47
+ */
48
+void rom_transaction_end(bool commit);
49
+
50
int rom_copy(uint8_t *dest, hwaddr addr, size_t size);
51
void *rom_ptr(hwaddr addr, size_t size);
52
void hmp_info_roms(Monitor *mon, const QDict *qdict);
53
diff --git a/hw/core/loader.c b/hw/core/loader.c
54
index XXXXXXX..XXXXXXX 100644
55
--- a/hw/core/loader.c
56
+++ b/hw/core/loader.c
57
@@ -XXX,XX +XXX,XX @@ struct Rom {
58
char *fw_dir;
59
char *fw_file;
60
61
+ bool committed;
62
+
63
hwaddr addr;
64
QTAILQ_ENTRY(Rom) next;
65
};
66
@@ -XXX,XX +XXX,XX @@ static void rom_insert(Rom *rom)
67
rom->as = &address_space_memory;
68
}
69
70
+ rom->committed = false;
71
+
72
/* List is ordered by load address in the same address space */
73
QTAILQ_FOREACH(item, &roms, next) {
74
if (rom_order_compare(rom, item)) {
75
@@ -XXX,XX +XXX,XX @@ void rom_reset_order_override(void)
76
fw_cfg_reset_order_override(fw_cfg);
24
}
77
}
25
78
26
-static int milkymist_hpdmc_init(SysBusDevice *dev)
79
+void rom_transaction_begin(void)
27
+static void milkymist_hpdmc_realize(DeviceState *dev, Error **errp)
80
+{
81
+ Rom *rom;
82
+
83
+ /* Ignore ROMs added without the transaction API */
84
+ QTAILQ_FOREACH(rom, &roms, next) {
85
+ rom->committed = true;
86
+ }
87
+}
88
+
89
+void rom_transaction_end(bool commit)
90
+{
91
+ Rom *rom;
92
+ Rom *tmp;
93
+
94
+ QTAILQ_FOREACH_SAFE(rom, &roms, next, tmp) {
95
+ if (rom->committed) {
96
+ continue;
97
+ }
98
+ if (commit) {
99
+ rom->committed = true;
100
+ } else {
101
+ QTAILQ_REMOVE(&roms, rom, next);
102
+ rom_free(rom);
103
+ }
104
+ }
105
+}
106
+
107
static Rom *find_rom(hwaddr addr, size_t size)
28
{
108
{
29
MilkymistHpdmcState *s = MILKYMIST_HPDMC(dev);
109
Rom *rom;
30
31
memory_region_init_io(&s->regs_region, OBJECT(dev), &hpdmc_mmio_ops, s,
32
"milkymist-hpdmc", R_MAX * 4);
33
- sysbus_init_mmio(dev, &s->regs_region);
34
-
35
- return 0;
36
+ sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->regs_region);
37
}
38
39
static const VMStateDescription vmstate_milkymist_hpdmc = {
40
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_milkymist_hpdmc = {
41
static void milkymist_hpdmc_class_init(ObjectClass *klass, void *data)
42
{
43
DeviceClass *dc = DEVICE_CLASS(klass);
44
- SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
45
46
- k->init = milkymist_hpdmc_init;
47
+ dc->realize = milkymist_hpdmc_realize;
48
dc->reset = milkymist_hpdmc_reset;
49
dc->vmsd = &vmstate_milkymist_hpdmc;
50
}
51
--
110
--
52
2.19.2
111
2.18.0
53
112
54
113
diff view generated by jsdifflib
1
From: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
1
From: Su Hang <suhang16@mails.ucas.ac.cn>
2
2
3
Use DeviceClass rather than SysBusDeviceClass in
3
This patch adds Intel Hexadecimal Object File format support to the
4
milkymist_pfpu_class_init().
4
generic loader device. The file format specification is available here:
5
5
http://www.piclist.com/techref/fileext/hex/intel.htm
6
Cc: michael@walle.cc
6
7
7
This file format is often used with microcontrollers such as the
8
Signed-off-by: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
8
micro:bit, Arduino, STM32, etc. Users expect to be able to run .hex
9
Signed-off-by: Zhang Shengju <zhangshengju@cmss.chinamobile.com>
9
files directly with without first converting them to ELF. Most
10
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
10
micro:bit code is developed in web-based IDEs without direct user access
11
Message-id: 20181130093852.20739-13-maozhongyi@cmss.chinamobile.com
11
to binutils so it is important for QEMU to handle this file format
12
natively.
13
14
Signed-off-by: Su Hang <suhang16@mails.ucas.ac.cn>
15
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
16
Acked-by: Alistair Francis <alistair.francis@wdc.com>
17
Message-id: 20180814162739.11814-6-stefanha@redhat.com
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
19
---
14
hw/misc/milkymist-pfpu.c | 12 +++++-------
20
include/hw/loader.h | 12 ++
15
1 file changed, 5 insertions(+), 7 deletions(-)
21
hw/core/generic-loader.c | 4 +
16
22
hw/core/loader.c | 249 +++++++++++++++++++++++++++++++++++++++
17
diff --git a/hw/misc/milkymist-pfpu.c b/hw/misc/milkymist-pfpu.c
23
3 files changed, 265 insertions(+)
24
25
diff --git a/include/hw/loader.h b/include/hw/loader.h
18
index XXXXXXX..XXXXXXX 100644
26
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/misc/milkymist-pfpu.c
27
--- a/include/hw/loader.h
20
+++ b/hw/misc/milkymist-pfpu.c
28
+++ b/include/hw/loader.h
21
@@ -XXX,XX +XXX,XX @@ static void milkymist_pfpu_reset(DeviceState *d)
29
@@ -XXX,XX +XXX,XX @@ ssize_t load_image_size(const char *filename, void *addr, size_t size);
30
int load_image_targphys_as(const char *filename,
31
hwaddr addr, uint64_t max_sz, AddressSpace *as);
32
33
+/**load_targphys_hex_as:
34
+ * @filename: Path to the .hex file
35
+ * @entry: Store the entry point given by the .hex file
36
+ * @as: The AddressSpace to load the .hex file to. The value of
37
+ * address_space_memory is used if nothing is supplied here.
38
+ *
39
+ * Load a fixed .hex file into memory.
40
+ *
41
+ * Returns the size of the loaded .hex file on success, -1 otherwise.
42
+ */
43
+int load_targphys_hex_as(const char *filename, hwaddr *entry, AddressSpace *as);
44
+
45
/** load_image_targphys:
46
* Same as load_image_targphys_as(), but doesn't allow the caller to specify
47
* an AddressSpace.
48
diff --git a/hw/core/generic-loader.c b/hw/core/generic-loader.c
49
index XXXXXXX..XXXXXXX 100644
50
--- a/hw/core/generic-loader.c
51
+++ b/hw/core/generic-loader.c
52
@@ -XXX,XX +XXX,XX @@ static void generic_loader_realize(DeviceState *dev, Error **errp)
53
size = load_uimage_as(s->file, &entry, NULL, NULL, NULL, NULL,
54
as);
55
}
56
+
57
+ if (size < 0) {
58
+ size = load_targphys_hex_as(s->file, &entry, as);
59
+ }
60
}
61
62
if (size < 0 || s->force_raw) {
63
diff --git a/hw/core/loader.c b/hw/core/loader.c
64
index XXXXXXX..XXXXXXX 100644
65
--- a/hw/core/loader.c
66
+++ b/hw/core/loader.c
67
@@ -XXX,XX +XXX,XX @@ void hmp_info_roms(Monitor *mon, const QDict *qdict)
68
}
22
}
69
}
23
}
70
}
24
71
+
25
-static int milkymist_pfpu_init(SysBusDevice *dev)
72
+typedef enum HexRecord HexRecord;
26
+static void milkymist_pfpu_realize(DeviceState *dev, Error **errp)
73
+enum HexRecord {
27
{
74
+ DATA_RECORD = 0,
28
MilkymistPFPUState *s = MILKYMIST_PFPU(dev);
75
+ EOF_RECORD,
29
+ SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
76
+ EXT_SEG_ADDR_RECORD,
30
77
+ START_SEG_ADDR_RECORD,
31
- sysbus_init_irq(dev, &s->irq);
78
+ EXT_LINEAR_ADDR_RECORD,
32
+ sysbus_init_irq(sbd, &s->irq);
79
+ START_LINEAR_ADDR_RECORD,
33
80
+};
34
memory_region_init_io(&s->regs_region, OBJECT(dev), &pfpu_mmio_ops, s,
81
+
35
"milkymist-pfpu", MICROCODE_END * 4);
82
+/* Each record contains a 16-bit address which is combined with the upper 16
36
- sysbus_init_mmio(dev, &s->regs_region);
83
+ * bits of the implicit "next address" to form a 32-bit address.
37
-
84
+ */
38
- return 0;
85
+#define NEXT_ADDR_MASK 0xffff0000
39
+ sysbus_init_mmio(sbd, &s->regs_region);
86
+
40
}
87
+#define DATA_FIELD_MAX_LEN 0xff
41
88
+#define LEN_EXCEPT_DATA 0x5
42
static const VMStateDescription vmstate_milkymist_pfpu = {
89
+/* 0x5 = sizeof(byte_count) + sizeof(address) + sizeof(record_type) +
43
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_milkymist_pfpu = {
90
+ * sizeof(checksum) */
44
static void milkymist_pfpu_class_init(ObjectClass *klass, void *data)
91
+typedef struct {
45
{
92
+ uint8_t byte_count;
46
DeviceClass *dc = DEVICE_CLASS(klass);
93
+ uint16_t address;
47
- SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
94
+ uint8_t record_type;
48
95
+ uint8_t data[DATA_FIELD_MAX_LEN];
49
- k->init = milkymist_pfpu_init;
96
+ uint8_t checksum;
50
+ dc->realize = milkymist_pfpu_realize;
97
+} HexLine;
51
dc->reset = milkymist_pfpu_reset;
98
+
52
dc->vmsd = &vmstate_milkymist_pfpu;
99
+/* return 0 or -1 if error */
53
}
100
+static bool parse_record(HexLine *line, uint8_t *our_checksum, const uint8_t c,
101
+ uint32_t *index, const bool in_process)
102
+{
103
+ /* +-------+---------------+-------+---------------------+--------+
104
+ * | byte | |record | | |
105
+ * | count | address | type | data |checksum|
106
+ * +-------+---------------+-------+---------------------+--------+
107
+ * ^ ^ ^ ^ ^ ^
108
+ * |1 byte | 2 bytes |1 byte | 0-255 bytes | 1 byte |
109
+ */
110
+ uint8_t value = 0;
111
+ uint32_t idx = *index;
112
+ /* ignore space */
113
+ if (g_ascii_isspace(c)) {
114
+ return true;
115
+ }
116
+ if (!g_ascii_isxdigit(c) || !in_process) {
117
+ return false;
118
+ }
119
+ value = g_ascii_xdigit_value(c);
120
+ value = (idx & 0x1) ? (value & 0xf) : (value << 4);
121
+ if (idx < 2) {
122
+ line->byte_count |= value;
123
+ } else if (2 <= idx && idx < 6) {
124
+ line->address <<= 4;
125
+ line->address += g_ascii_xdigit_value(c);
126
+ } else if (6 <= idx && idx < 8) {
127
+ line->record_type |= value;
128
+ } else if (8 <= idx && idx < 8 + 2 * line->byte_count) {
129
+ line->data[(idx - 8) >> 1] |= value;
130
+ } else if (8 + 2 * line->byte_count <= idx &&
131
+ idx < 10 + 2 * line->byte_count) {
132
+ line->checksum |= value;
133
+ } else {
134
+ return false;
135
+ }
136
+ *our_checksum += value;
137
+ ++(*index);
138
+ return true;
139
+}
140
+
141
+typedef struct {
142
+ const char *filename;
143
+ HexLine line;
144
+ uint8_t *bin_buf;
145
+ hwaddr *start_addr;
146
+ int total_size;
147
+ uint32_t next_address_to_write;
148
+ uint32_t current_address;
149
+ uint32_t current_rom_index;
150
+ uint32_t rom_start_address;
151
+ AddressSpace *as;
152
+} HexParser;
153
+
154
+/* return size or -1 if error */
155
+static int handle_record_type(HexParser *parser)
156
+{
157
+ HexLine *line = &(parser->line);
158
+ switch (line->record_type) {
159
+ case DATA_RECORD:
160
+ parser->current_address =
161
+ (parser->next_address_to_write & NEXT_ADDR_MASK) | line->address;
162
+ /* verify this is a contiguous block of memory */
163
+ if (parser->current_address != parser->next_address_to_write) {
164
+ if (parser->current_rom_index != 0) {
165
+ rom_add_blob_fixed_as(parser->filename, parser->bin_buf,
166
+ parser->current_rom_index,
167
+ parser->rom_start_address, parser->as);
168
+ }
169
+ parser->rom_start_address = parser->current_address;
170
+ parser->current_rom_index = 0;
171
+ }
172
+
173
+ /* copy from line buffer to output bin_buf */
174
+ memcpy(parser->bin_buf + parser->current_rom_index, line->data,
175
+ line->byte_count);
176
+ parser->current_rom_index += line->byte_count;
177
+ parser->total_size += line->byte_count;
178
+ /* save next address to write */
179
+ parser->next_address_to_write =
180
+ parser->current_address + line->byte_count;
181
+ break;
182
+
183
+ case EOF_RECORD:
184
+ if (parser->current_rom_index != 0) {
185
+ rom_add_blob_fixed_as(parser->filename, parser->bin_buf,
186
+ parser->current_rom_index,
187
+ parser->rom_start_address, parser->as);
188
+ }
189
+ return parser->total_size;
190
+ case EXT_SEG_ADDR_RECORD:
191
+ case EXT_LINEAR_ADDR_RECORD:
192
+ if (line->byte_count != 2 && line->address != 0) {
193
+ return -1;
194
+ }
195
+
196
+ if (parser->current_rom_index != 0) {
197
+ rom_add_blob_fixed_as(parser->filename, parser->bin_buf,
198
+ parser->current_rom_index,
199
+ parser->rom_start_address, parser->as);
200
+ }
201
+
202
+ /* save next address to write,
203
+ * in case of non-contiguous block of memory */
204
+ parser->next_address_to_write = (line->data[0] << 12) |
205
+ (line->data[1] << 4);
206
+ if (line->record_type == EXT_LINEAR_ADDR_RECORD) {
207
+ parser->next_address_to_write <<= 12;
208
+ }
209
+
210
+ parser->rom_start_address = parser->next_address_to_write;
211
+ parser->current_rom_index = 0;
212
+ break;
213
+
214
+ case START_SEG_ADDR_RECORD:
215
+ if (line->byte_count != 4 && line->address != 0) {
216
+ return -1;
217
+ }
218
+
219
+ /* x86 16-bit CS:IP segmented addressing */
220
+ *(parser->start_addr) = (((line->data[0] << 8) | line->data[1]) << 4) +
221
+ ((line->data[2] << 8) | line->data[3]);
222
+ break;
223
+
224
+ case START_LINEAR_ADDR_RECORD:
225
+ if (line->byte_count != 4 && line->address != 0) {
226
+ return -1;
227
+ }
228
+
229
+ *(parser->start_addr) = ldl_be_p(line->data);
230
+ break;
231
+
232
+ default:
233
+ return -1;
234
+ }
235
+
236
+ return parser->total_size;
237
+}
238
+
239
+/* return size or -1 if error */
240
+static int parse_hex_blob(const char *filename, hwaddr *addr, uint8_t *hex_blob,
241
+ size_t hex_blob_size, AddressSpace *as)
242
+{
243
+ bool in_process = false; /* avoid re-enter and
244
+ * check whether record begin with ':' */
245
+ uint8_t *end = hex_blob + hex_blob_size;
246
+ uint8_t our_checksum = 0;
247
+ uint32_t record_index = 0;
248
+ HexParser parser = {
249
+ .filename = filename,
250
+ .bin_buf = g_malloc(hex_blob_size),
251
+ .start_addr = addr,
252
+ .as = as,
253
+ };
254
+
255
+ rom_transaction_begin();
256
+
257
+ for (; hex_blob < end; ++hex_blob) {
258
+ switch (*hex_blob) {
259
+ case '\r':
260
+ case '\n':
261
+ if (!in_process) {
262
+ break;
263
+ }
264
+
265
+ in_process = false;
266
+ if ((LEN_EXCEPT_DATA + parser.line.byte_count) * 2 !=
267
+ record_index ||
268
+ our_checksum != 0) {
269
+ parser.total_size = -1;
270
+ goto out;
271
+ }
272
+
273
+ if (handle_record_type(&parser) == -1) {
274
+ parser.total_size = -1;
275
+ goto out;
276
+ }
277
+ break;
278
+
279
+ /* start of a new record. */
280
+ case ':':
281
+ memset(&parser.line, 0, sizeof(HexLine));
282
+ in_process = true;
283
+ record_index = 0;
284
+ break;
285
+
286
+ /* decoding lines */
287
+ default:
288
+ if (!parse_record(&parser.line, &our_checksum, *hex_blob,
289
+ &record_index, in_process)) {
290
+ parser.total_size = -1;
291
+ goto out;
292
+ }
293
+ break;
294
+ }
295
+ }
296
+
297
+out:
298
+ g_free(parser.bin_buf);
299
+ rom_transaction_end(parser.total_size != -1);
300
+ return parser.total_size;
301
+}
302
+
303
+/* return size or -1 if error */
304
+int load_targphys_hex_as(const char *filename, hwaddr *entry, AddressSpace *as)
305
+{
306
+ gsize hex_blob_size;
307
+ gchar *hex_blob;
308
+ int total_size = 0;
309
+
310
+ if (!g_file_get_contents(filename, &hex_blob, &hex_blob_size, NULL)) {
311
+ return -1;
312
+ }
313
+
314
+ total_size = parse_hex_blob(filename, entry, (uint8_t *)hex_blob,
315
+ hex_blob_size, as);
316
+
317
+ g_free(hex_blob);
318
+ return total_size;
319
+}
54
--
320
--
55
2.19.2
321
2.18.0
56
322
57
323
diff view generated by jsdifflib
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
1
From: Su Hang <suhang16@mails.ucas.ac.cn>
2
2
3
Use IRQs 111 - 118 for virtio-mmio. The interrupts we're currently
3
'test.hex' file is a memory test pattern stored in Hexadecimal Object
4
using 160+ are not available in the Versal GIC.
4
Format. It loads at 0x10000 in RAM and contains values from 0 through
5
255.
5
6
6
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
7
The test case verifies that the expected memory test pattern was loaded.
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
8
Message-id: 20181129163655.20370-4-edgar.iglesias@gmail.com
9
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
10
Suggested-by: Steffen Gortz <qemu.ml@steffen-goertz.de>
11
Suggested-by: Stefan Hajnoczi <stefanha@redhat.com>
12
Signed-off-by: Su Hang <suhang16@mails.ucas.ac.cn>
13
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
14
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
15
[PMM: changed qtest_startf() to qtest_initf() to work with
16
current master after the refactoring in commit 88b988c895e3c2]
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
18
---
11
include/hw/arm/xlnx-versal.h | 6 +++---
19
configure | 4 +++
12
hw/arm/xlnx-versal-virt.c | 4 ++--
20
tests/Makefile.include | 2 ++
13
2 files changed, 5 insertions(+), 5 deletions(-)
21
tests/hexloader-test.c | 45 ++++++++++++++++++++++++++++
22
MAINTAINERS | 6 ++++
23
tests/hex-loader-check-data/test.hex | 18 +++++++++++
24
5 files changed, 75 insertions(+)
25
create mode 100644 tests/hexloader-test.c
26
create mode 100644 tests/hex-loader-check-data/test.hex
14
27
15
diff --git a/include/hw/arm/xlnx-versal.h b/include/hw/arm/xlnx-versal.h
28
diff --git a/configure b/configure
29
index XXXXXXX..XXXXXXX 100755
30
--- a/configure
31
+++ b/configure
32
@@ -XXX,XX +XXX,XX @@ for test_file in $(find $source_path/tests/acpi-test-data -type f)
33
do
34
FILES="$FILES tests/acpi-test-data$(echo $test_file | sed -e 's/.*acpi-test-data//')"
35
done
36
+for test_file in $(find $source_path/tests/hex-loader-check-data -type f)
37
+do
38
+ FILES="$FILES tests/hex-loader-check-data$(echo $test_file | sed -e 's/.*hex-loader-check-data//')"
39
+done
40
mkdir -p $DIRS
41
for f in $FILES ; do
42
if [ -e "$source_path/$f" ] && [ "$pwd_is_source_path" != "y" ]; then
43
diff --git a/tests/Makefile.include b/tests/Makefile.include
16
index XXXXXXX..XXXXXXX 100644
44
index XXXXXXX..XXXXXXX 100644
17
--- a/include/hw/arm/xlnx-versal.h
45
--- a/tests/Makefile.include
18
+++ b/include/hw/arm/xlnx-versal.h
46
+++ b/tests/Makefile.include
19
@@ -XXX,XX +XXX,XX @@ typedef struct Versal {
47
@@ -XXX,XX +XXX,XX @@ check-qtest-arm-y += tests/test-arm-mptimer$(EXESUF)
20
#define VERSAL_GEM1_IRQ_0 58
48
gcov-files-arm-y += hw/timer/arm_mptimer.c
21
#define VERSAL_GEM1_WAKE_IRQ_0 59
49
check-qtest-arm-y += tests/boot-serial-test$(EXESUF)
22
50
check-qtest-arm-y += tests/sdhci-test$(EXESUF)
23
-/* Architecturally eserved IRQs suitable for virtualization. */
51
+check-qtest-arm-y += tests/hexloader-test$(EXESUF)
24
-#define VERSAL_RSVD_HIGH_IRQ_FIRST 160
52
25
-#define VERSAL_RSVD_HIGH_IRQ_LAST 255
53
check-qtest-aarch64-y = tests/numa-test$(EXESUF)
26
+/* Architecturally reserved IRQs suitable for virtualization. */
54
check-qtest-aarch64-y += tests/sdhci-test$(EXESUF)
27
+#define VERSAL_RSVD_IRQ_FIRST 111
55
@@ -XXX,XX +XXX,XX @@ tests/qmp-test$(EXESUF): tests/qmp-test.o
28
+#define VERSAL_RSVD_IRQ_LAST 118
56
tests/device-introspect-test$(EXESUF): tests/device-introspect-test.o
29
57
tests/rtc-test$(EXESUF): tests/rtc-test.o
30
#define MM_TOP_RSVD 0xa0000000U
58
tests/m48t59-test$(EXESUF): tests/m48t59-test.o
31
#define MM_TOP_RSVD_SIZE 0x4000000
59
+tests/hexloader-test$(EXESUF): tests/hexloader-test.o
32
diff --git a/hw/arm/xlnx-versal-virt.c b/hw/arm/xlnx-versal-virt.c
60
tests/endianness-test$(EXESUF): tests/endianness-test.o
61
tests/spapr-phb-test$(EXESUF): tests/spapr-phb-test.o $(libqos-obj-y)
62
tests/prom-env-test$(EXESUF): tests/prom-env-test.o $(libqos-obj-y)
63
diff --git a/tests/hexloader-test.c b/tests/hexloader-test.c
64
new file mode 100644
65
index XXXXXXX..XXXXXXX
66
--- /dev/null
67
+++ b/tests/hexloader-test.c
68
@@ -XXX,XX +XXX,XX @@
69
+/*
70
+ * QTest testcase for the Intel Hexadecimal Object File Loader
71
+ *
72
+ * Authors:
73
+ * Su Hang <suhang16@mails.ucas.ac.cn> 2018
74
+ *
75
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
76
+ * See the COPYING file in the top-level directory.
77
+ *
78
+ */
79
+
80
+#include "qemu/osdep.h"
81
+#include "libqtest.h"
82
+
83
+/* Load 'test.hex' and verify that the in-memory contents are as expected.
84
+ * 'test.hex' is a memory test pattern stored in Hexadecimal Object
85
+ * format. It loads at 0x10000 in RAM and contains values from 0 through
86
+ * 255.
87
+ */
88
+static void hex_loader_test(void)
89
+{
90
+ unsigned int i;
91
+ const unsigned int base_addr = 0x00010000;
92
+
93
+ QTestState *s = qtest_initf(
94
+ "-M vexpress-a9 -nographic -device loader,file=tests/hex-loader-check-data/test.hex");
95
+
96
+ for (i = 0; i < 256; ++i) {
97
+ uint8_t val = qtest_readb(s, base_addr + i);
98
+ g_assert_cmpuint(i, ==, val);
99
+ }
100
+ qtest_quit(s);
101
+}
102
+
103
+int main(int argc, char **argv)
104
+{
105
+ int ret;
106
+
107
+ g_test_init(&argc, &argv, NULL);
108
+
109
+ qtest_add_func("/tmp/hex_loader", hex_loader_test);
110
+ ret = g_test_run();
111
+
112
+ return ret;
113
+}
114
diff --git a/MAINTAINERS b/MAINTAINERS
33
index XXXXXXX..XXXXXXX 100644
115
index XXXXXXX..XXXXXXX 100644
34
--- a/hw/arm/xlnx-versal-virt.c
116
--- a/MAINTAINERS
35
+++ b/hw/arm/xlnx-versal-virt.c
117
+++ b/MAINTAINERS
36
@@ -XXX,XX +XXX,XX @@ static void create_virtio_regions(VersalVirt *s)
118
@@ -XXX,XX +XXX,XX @@ F: hw/core/generic-loader.c
37
for (i = 0; i < NUM_VIRTIO_TRANSPORT; i++) {
119
F: include/hw/core/generic-loader.h
38
char *name = g_strdup_printf("virtio%d", i);;
120
F: docs/generic-loader.txt
39
hwaddr base = MM_TOP_RSVD + i * virtio_mmio_size;
121
40
- int irq = VERSAL_RSVD_HIGH_IRQ_FIRST + i;
122
+Intel Hexadecimal Object File Loader
41
+ int irq = VERSAL_RSVD_IRQ_FIRST + i;
123
+M: Su Hang <suhang16@mails.ucas.ac.cn>
42
MemoryRegion *mr;
124
+S: Maintained
43
DeviceState *dev;
125
+F: tests/hexloader-test.c
44
qemu_irq pic_irq;
126
+F: tests/hex-loader-check-data/test.hex
45
@@ -XXX,XX +XXX,XX @@ static void create_virtio_regions(VersalVirt *s)
127
+
46
128
CHRP NVRAM
47
for (i = 0; i < NUM_VIRTIO_TRANSPORT; i++) {
129
M: Thomas Huth <thuth@redhat.com>
48
hwaddr base = MM_TOP_RSVD + i * virtio_mmio_size;
130
S: Maintained
49
- int irq = VERSAL_RSVD_HIGH_IRQ_FIRST + i;
131
diff --git a/tests/hex-loader-check-data/test.hex b/tests/hex-loader-check-data/test.hex
50
+ int irq = VERSAL_RSVD_IRQ_FIRST + i;
132
new file mode 100644
51
char *name = g_strdup_printf("/virtio_mmio@%" PRIx64, base);
133
index XXXXXXX..XXXXXXX
52
134
--- /dev/null
53
qemu_fdt_add_subnode(s->fdt, name);
135
+++ b/tests/hex-loader-check-data/test.hex
136
@@ -XXX,XX +XXX,XX @@
137
+:020000040001F9
138
+:10000000000102030405060708090a0b0c0d0e0f78
139
+:10001000101112131415161718191a1b1c1d1e1f68
140
+:10002000202122232425262728292a2b2c2d2e2f58
141
+:10003000303132333435363738393a3b3c3d3e3f48
142
+:10004000404142434445464748494a4b4c4d4e4f38
143
+:10005000505152535455565758595a5b5c5d5e5f28
144
+:10006000606162636465666768696a6b6c6d6e6f18
145
+:10007000707172737475767778797a7b7c7d7e7f08
146
+:10008000808182838485868788898a8b8c8d8e8ff8
147
+:10009000909192939495969798999a9b9c9d9e9fe8
148
+:1000a000a0a1a2a3a4a5a6a7a8a9aaabacadaeafd8
149
+:1000b000b0b1b2b3b4b5b6b7b8b9babbbcbdbebfc8
150
+:1000c000c0c1c2c3c4c5c6c7c8c9cacbcccdcecfb8
151
+:1000d000d0d1d2d3d4d5d6d7d8d9dadbdcdddedfa8
152
+:1000e000e0e1e2e3e4e5e6e7e8e9eaebecedeeef98
153
+:1000f000f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff88
154
+:00000001FF
54
--
155
--
55
2.19.2
156
2.18.0
56
157
57
158
diff view generated by jsdifflib
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
1
From: Trent Piepho <tpiepho@impinj.com>
2
2
3
Remove bogus virtio-mmio creation. This was an accidental
3
The current emulation will clear the XCH bit when a burst finishes.
4
left-over an experiment.
4
This is not quite correct. According to the i.MX7d referemce manual,
5
Rev 0.1, §10.1.7.3:
5
6
6
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
7
This bit [XCH] is cleared automatically when all data in the TXFIFO
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
and the shift register has been shifted out.
8
Reviewed-by: Luc Michel <luc.michel@greensocs.com>
9
9
Message-id: 20181129163655.20370-2-edgar.iglesias@gmail.com
10
So XCH should be cleared when the FIFO empties, not on completion of a
11
burst. The FIFO is 64 x 32 bits = 2048 bits, while the max burst size
12
is larger at 4096 bits. So it's possible that the burst is not finished
13
after the TXFIFO empties.
14
15
Sending a large block (> 2048 bits) with the Linux driver will use a
16
burst that is larger than the TXFIFO. After the TXFIFO has emptied XCH
17
does not become unset, as the burst is not yet finished.
18
19
What should happen after the TXFIFO empties is the driver will refill it
20
and set XCH. The rising edge of XCH will trigger another transfer to
21
begin. However, since the emulation does not set XCH to 0, there is no
22
rising edge and the next trasfer never begins.
23
24
Signed-off-by: Trent Piepho <tpiepho@impinj.com>
25
Message-id: 20180731201056.29257-1-tpiepho@impinj.com
26
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
27
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
28
---
12
hw/arm/xlnx-versal-virt.c | 1 -
29
hw/ssi/imx_spi.c | 3 +--
13
1 file changed, 1 deletion(-)
30
1 file changed, 1 insertion(+), 2 deletions(-)
14
31
15
diff --git a/hw/arm/xlnx-versal-virt.c b/hw/arm/xlnx-versal-virt.c
32
diff --git a/hw/ssi/imx_spi.c b/hw/ssi/imx_spi.c
16
index XXXXXXX..XXXXXXX 100644
33
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/xlnx-versal-virt.c
34
--- a/hw/ssi/imx_spi.c
18
+++ b/hw/arm/xlnx-versal-virt.c
35
+++ b/hw/ssi/imx_spi.c
19
@@ -XXX,XX +XXX,XX @@ static void create_virtio_regions(VersalVirt *s)
36
@@ -XXX,XX +XXX,XX @@ static void imx_spi_flush_txfifo(IMXSPIState *s)
20
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, pic_irq);
37
}
21
mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0);
38
22
memory_region_add_subregion(&s->soc.mr_ps, base, mr);
39
if (s->burst_length <= 0) {
23
- sysbus_create_simple("virtio-mmio", base, pic_irq);
40
- s->regs[ECSPI_CONREG] &= ~ECSPI_CONREG_XCH;
41
-
42
if (!imx_spi_is_multiple_master_burst(s)) {
43
s->regs[ECSPI_STATREG] |= ECSPI_STATREG_TC;
44
break;
45
@@ -XXX,XX +XXX,XX @@ static void imx_spi_flush_txfifo(IMXSPIState *s)
46
47
if (fifo32_is_empty(&s->tx_fifo)) {
48
s->regs[ECSPI_STATREG] |= ECSPI_STATREG_TC;
49
+ s->regs[ECSPI_CONREG] &= ~ECSPI_CONREG_XCH;
24
}
50
}
25
51
26
for (i = 0; i < NUM_VIRTIO_TRANSPORT; i++) {
52
/* TODO: We should also use TDR and RDR bits */
27
--
53
--
28
2.19.2
54
2.18.0
29
55
30
56
diff view generated by jsdifflib
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
1
From: Joel Stanley <joel@jms.id.au>
2
2
3
Correct the nr of IRQs to 192.
3
The SDMC on the ast2500 has 170 registers.
4
4
5
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
5
Signed-off-by: Joel Stanley <joel@jms.id.au>
6
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
Reviewed-by: Cédric Le Goater <clg@kaod.org>
7
Message-id: 20181129163655.20370-5-edgar.iglesias@gmail.com
7
Tested-by: Cédric Le Goater <clg@kaod.org>
8
Message-id: 20180807075757.7242-2-joel@jms.id.au
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
10
---
10
include/hw/arm/xlnx-versal.h | 2 +-
11
include/hw/misc/aspeed_sdmc.h | 2 +-
11
1 file changed, 1 insertion(+), 1 deletion(-)
12
1 file changed, 1 insertion(+), 1 deletion(-)
12
13
13
diff --git a/include/hw/arm/xlnx-versal.h b/include/hw/arm/xlnx-versal.h
14
diff --git a/include/hw/misc/aspeed_sdmc.h b/include/hw/misc/aspeed_sdmc.h
14
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
15
--- a/include/hw/arm/xlnx-versal.h
16
--- a/include/hw/misc/aspeed_sdmc.h
16
+++ b/include/hw/arm/xlnx-versal.h
17
+++ b/include/hw/misc/aspeed_sdmc.h
17
@@ -XXX,XX +XXX,XX @@
18
@@ -XXX,XX +XXX,XX @@
18
#define XLNX_VERSAL_NR_ACPUS 2
19
#define TYPE_ASPEED_SDMC "aspeed.sdmc"
19
#define XLNX_VERSAL_NR_UARTS 2
20
#define ASPEED_SDMC(obj) OBJECT_CHECK(AspeedSDMCState, (obj), TYPE_ASPEED_SDMC)
20
#define XLNX_VERSAL_NR_GEMS 2
21
21
-#define XLNX_VERSAL_NR_IRQS 256
22
-#define ASPEED_SDMC_NR_REGS (0x8 >> 2)
22
+#define XLNX_VERSAL_NR_IRQS 192
23
+#define ASPEED_SDMC_NR_REGS (0x174 >> 2)
23
24
24
typedef struct Versal {
25
typedef struct AspeedSDMCState {
25
/*< private >*/
26
/*< private >*/
26
--
27
--
27
2.19.2
28
2.18.0
28
29
29
30
diff view generated by jsdifflib
1
From: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
1
From: Joel Stanley <joel@jms.id.au>
2
2
3
Use DeviceClass rather than SysBusDeviceClass in
3
This fixes the intended protection of read-only values in the
4
pci_dec_21154_device_class_init().
4
configuration register. They were being always set to zero by mistake.
5
5
6
Cc: david@gibson.dropbear.id.au
6
The read-only fields depend on the configured memory size of the system,
7
Cc: mst@redhat.com
7
so they cannot be fixed at compile time. The most straight forward
8
Cc: marcel.apfelbaum@gmail.com
8
option was to store them in the state structure.
9
Cc: qemu-ppc@nongnu.org
10
9
11
Signed-off-by: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
10
Signed-off-by: Joel Stanley <joel@jms.id.au>
12
Signed-off-by: Zhang Shengju <zhangshengju@cmss.chinamobile.com>
11
Reviewed-by: Cédric Le Goater <clg@kaod.org>
13
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
12
Tested-by: Cédric Le Goater <clg@kaod.org>
14
Acked-by: David Gibson <david@gibson.dropbear.id.au>
13
Message-id: 20180807075757.7242-3-joel@jms.id.au
15
Message-id: 20181130093852.20739-16-maozhongyi@cmss.chinamobile.com
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
---
15
---
18
hw/pci-bridge/dec.c | 12 ++++++------
16
include/hw/misc/aspeed_sdmc.h | 1 +
19
1 file changed, 6 insertions(+), 6 deletions(-)
17
hw/misc/aspeed_sdmc.c | 27 ++++++++-------------------
18
2 files changed, 9 insertions(+), 19 deletions(-)
20
19
21
diff --git a/hw/pci-bridge/dec.c b/hw/pci-bridge/dec.c
20
diff --git a/include/hw/misc/aspeed_sdmc.h b/include/hw/misc/aspeed_sdmc.h
22
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
23
--- a/hw/pci-bridge/dec.c
22
--- a/include/hw/misc/aspeed_sdmc.h
24
+++ b/hw/pci-bridge/dec.c
23
+++ b/include/hw/misc/aspeed_sdmc.h
25
@@ -XXX,XX +XXX,XX @@ PCIBus *pci_dec_21154_init(PCIBus *parent_bus, int devfn)
24
@@ -XXX,XX +XXX,XX @@ typedef struct AspeedSDMCState {
26
return pci_bridge_get_sec_bus(br);
25
uint32_t silicon_rev;
26
uint32_t ram_bits;
27
uint64_t ram_size;
28
+ uint32_t fixed_conf;
29
30
} AspeedSDMCState;
31
32
diff --git a/hw/misc/aspeed_sdmc.c b/hw/misc/aspeed_sdmc.c
33
index XXXXXXX..XXXXXXX 100644
34
--- a/hw/misc/aspeed_sdmc.c
35
+++ b/hw/misc/aspeed_sdmc.c
36
@@ -XXX,XX +XXX,XX @@ static void aspeed_sdmc_write(void *opaque, hwaddr addr, uint64_t data,
37
case AST2400_A0_SILICON_REV:
38
case AST2400_A1_SILICON_REV:
39
data &= ~ASPEED_SDMC_READONLY_MASK;
40
+ data |= s->fixed_conf;
41
break;
42
case AST2500_A0_SILICON_REV:
43
case AST2500_A1_SILICON_REV:
44
data &= ~ASPEED_SDMC_AST2500_READONLY_MASK;
45
+ data |= s->fixed_conf;
46
break;
47
default:
48
g_assert_not_reached();
49
@@ -XXX,XX +XXX,XX @@ static void aspeed_sdmc_reset(DeviceState *dev)
50
memset(s->regs, 0, sizeof(s->regs));
51
52
/* Set ram size bit and defaults values */
53
- switch (s->silicon_rev) {
54
- case AST2400_A0_SILICON_REV:
55
- case AST2400_A1_SILICON_REV:
56
- s->regs[R_CONF] |=
57
- ASPEED_SDMC_VGA_COMPAT |
58
- ASPEED_SDMC_DRAM_SIZE(s->ram_bits);
59
- break;
60
-
61
- case AST2500_A0_SILICON_REV:
62
- case AST2500_A1_SILICON_REV:
63
- s->regs[R_CONF] |=
64
- ASPEED_SDMC_HW_VERSION(1) |
65
- ASPEED_SDMC_VGA_APERTURE(ASPEED_SDMC_VGA_64MB) |
66
- ASPEED_SDMC_DRAM_SIZE(s->ram_bits);
67
- break;
68
-
69
- default:
70
- g_assert_not_reached();
71
- }
72
+ s->regs[R_CONF] = s->fixed_conf;
27
}
73
}
28
74
29
-static int pci_dec_21154_device_init(SysBusDevice *dev)
75
static void aspeed_sdmc_realize(DeviceState *dev, Error **errp)
30
+static void pci_dec_21154_device_realize(DeviceState *dev, Error **errp)
76
@@ -XXX,XX +XXX,XX @@ static void aspeed_sdmc_realize(DeviceState *dev, Error **errp)
31
{
77
case AST2400_A0_SILICON_REV:
32
PCIHostState *phb;
78
case AST2400_A1_SILICON_REV:
33
+ SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
79
s->ram_bits = ast2400_rambits(s);
34
80
+ s->fixed_conf = ASPEED_SDMC_VGA_COMPAT |
35
phb = PCI_HOST_BRIDGE(dev);
81
+ ASPEED_SDMC_DRAM_SIZE(s->ram_bits);
36
82
break;
37
@@ -XXX,XX +XXX,XX @@ static int pci_dec_21154_device_init(SysBusDevice *dev)
83
case AST2500_A0_SILICON_REV:
38
dev, "pci-conf-idx", 0x1000);
84
case AST2500_A1_SILICON_REV:
39
memory_region_init_io(&phb->data_mem, OBJECT(dev), &pci_host_data_le_ops,
85
s->ram_bits = ast2500_rambits(s);
40
dev, "pci-data-idx", 0x1000);
86
+ s->fixed_conf = ASPEED_SDMC_HW_VERSION(1) |
41
- sysbus_init_mmio(dev, &phb->conf_mem);
87
+ ASPEED_SDMC_VGA_APERTURE(ASPEED_SDMC_VGA_64MB) |
42
- sysbus_init_mmio(dev, &phb->data_mem);
88
+ ASPEED_SDMC_DRAM_SIZE(s->ram_bits);
43
- return 0;
89
break;
44
+ sysbus_init_mmio(sbd, &phb->conf_mem);
90
default:
45
+ sysbus_init_mmio(sbd, &phb->data_mem);
91
g_assert_not_reached();
46
}
47
48
static void dec_21154_pci_host_realize(PCIDevice *d, Error **errp)
49
@@ -XXX,XX +XXX,XX @@ static const TypeInfo dec_21154_pci_host_info = {
50
51
static void pci_dec_21154_device_class_init(ObjectClass *klass, void *data)
52
{
53
- SysBusDeviceClass *sdc = SYS_BUS_DEVICE_CLASS(klass);
54
+ DeviceClass *dc = DEVICE_CLASS(klass);
55
56
- sdc->init = pci_dec_21154_device_init;
57
+ dc->realize = pci_dec_21154_device_realize;
58
}
59
60
static const TypeInfo pci_dec_21154_device_info = {
61
--
92
--
62
2.19.2
93
2.18.0
63
94
64
95
diff view generated by jsdifflib
1
From: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
1
From: Joel Stanley <joel@jms.id.au>
2
2
3
The init function doesn't do anything at all, so we
3
The SDRAM training routine sets the 'Enable cache initial' bit, and then
4
just omit it.
4
waits for the 'cache initial sequence' to be done.
5
5
6
Cc: sstabellini@kernel.org
6
Have it always return done, as there is no other side effects that the
7
Cc: anthony.perard@citrix.com
7
model needs to implement. This allows the upstream u-boot training to
8
Cc: xen-devel@lists.xenproject.org
8
proceed on the ast2500-evb board.
9
Cc: peter.maydell@linaro.org
10
9
11
Signed-off-by: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
10
Signed-off-by: Joel Stanley <joel@jms.id.au>
12
Signed-off-by: Zhang Shengju <zhangshengju@cmss.chinamobile.com>
11
Reviewed-by: Cédric Le Goater <clg@kaod.org>
13
Acked-by: Anthony PERARD <anthony.perard@citrix.com>
12
Tested-by: Cédric Le Goater <clg@kaod.org>
14
Message-id: 20181130093852.20739-21-maozhongyi@cmss.chinamobile.com
13
Message-id: 20180807075757.7242-4-joel@jms.id.au
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
---
15
---
17
hw/xen/xen_backend.c | 7 -------
16
hw/misc/aspeed_sdmc.c | 1 +
18
1 file changed, 7 deletions(-)
17
1 file changed, 1 insertion(+)
19
18
20
diff --git a/hw/xen/xen_backend.c b/hw/xen/xen_backend.c
19
diff --git a/hw/misc/aspeed_sdmc.c b/hw/misc/aspeed_sdmc.c
21
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/xen/xen_backend.c
21
--- a/hw/misc/aspeed_sdmc.c
23
+++ b/hw/xen/xen_backend.c
22
+++ b/hw/misc/aspeed_sdmc.c
24
@@ -XXX,XX +XXX,XX @@ static const TypeInfo xensysbus_info = {
23
@@ -XXX,XX +XXX,XX @@ static void aspeed_sdmc_realize(DeviceState *dev, Error **errp)
25
}
24
s->ram_bits = ast2500_rambits(s);
26
};
25
s->fixed_conf = ASPEED_SDMC_HW_VERSION(1) |
27
26
ASPEED_SDMC_VGA_APERTURE(ASPEED_SDMC_VGA_64MB) |
28
-static int xen_sysdev_init(SysBusDevice *dev)
27
+ ASPEED_SDMC_CACHE_INITIAL_DONE |
29
-{
28
ASPEED_SDMC_DRAM_SIZE(s->ram_bits);
30
- return 0;
29
break;
31
-}
30
default:
32
-
33
static Property xen_sysdev_properties[] = {
34
{/* end of property list */},
35
};
36
@@ -XXX,XX +XXX,XX @@ static Property xen_sysdev_properties[] = {
37
static void xen_sysdev_class_init(ObjectClass *klass, void *data)
38
{
39
DeviceClass *dc = DEVICE_CLASS(klass);
40
- SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
41
42
- k->init = xen_sysdev_init;
43
dc->props = xen_sysdev_properties;
44
dc->bus_type = TYPE_XENSYSBUS;
45
}
46
--
31
--
47
2.19.2
32
2.18.0
48
33
49
34
diff view generated by jsdifflib
1
From: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
1
From: Joel Stanley <joel@jms.id.au>
2
2
3
Use DeviceClass rather than SysBusDeviceClass in
3
The ast2500 SDRAM training routine busy waits on the 'init cycle busy
4
nvram_sysbus_class_init().
4
state' bit in DDR PHY Control/Status register #1 (MCR60).
5
5
6
Cc: pbonzini@redhat.com
6
This ensures the bit always reads zero, and allows training to
7
Cc: marcandre.lureau@redhat.com
7
complete with upstream u-boot on the ast2500-evb.
8
8
9
Signed-off-by: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
9
Signed-off-by: Joel Stanley <joel@jms.id.au>
10
Signed-off-by: Zhang Shengju <zhangshengju@cmss.chinamobile.com>
10
Reviewed-by: Cédric Le Goater <clg@kaod.org>
11
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
11
Tested-by: Cédric Le Goater <clg@kaod.org>
12
Message-id: 20181130093852.20739-15-maozhongyi@cmss.chinamobile.com
12
Message-id: 20180807075757.7242-5-joel@jms.id.au
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
14
---
15
hw/nvram/ds1225y.c | 12 +++++-------
15
hw/misc/aspeed_sdmc.c | 15 +++++++++++++++
16
1 file changed, 5 insertions(+), 7 deletions(-)
16
1 file changed, 15 insertions(+)
17
17
18
diff --git a/hw/nvram/ds1225y.c b/hw/nvram/ds1225y.c
18
diff --git a/hw/misc/aspeed_sdmc.c b/hw/misc/aspeed_sdmc.c
19
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/nvram/ds1225y.c
20
--- a/hw/misc/aspeed_sdmc.c
21
+++ b/hw/nvram/ds1225y.c
21
+++ b/hw/misc/aspeed_sdmc.c
22
@@ -XXX,XX +XXX,XX @@
22
@@ -XXX,XX +XXX,XX @@
23
#include "qemu/osdep.h"
23
/* Configuration Register */
24
#include "hw/sysbus.h"
24
#define R_CONF (0x04 / 4)
25
#include "trace.h"
25
26
+#include "qemu/error-report.h"
26
+/* Control/Status Register #1 (ast2500) */
27
27
+#define R_STATUS1 (0x60 / 4)
28
typedef struct {
28
+#define PHY_BUSY_STATE BIT(0)
29
MemoryRegion iomem;
29
+
30
@@ -XXX,XX +XXX,XX @@ typedef struct {
30
/*
31
NvRamState nvram;
31
* Configuration register Ox4 (for Aspeed AST2400 SOC)
32
} SysBusNvRamState;
32
*
33
33
@@ -XXX,XX +XXX,XX @@ static void aspeed_sdmc_write(void *opaque, hwaddr addr, uint64_t data,
34
-static int nvram_sysbus_initfn(SysBusDevice *dev)
34
g_assert_not_reached();
35
+static void nvram_sysbus_realize(DeviceState *dev, Error **errp)
36
{
37
SysBusNvRamState *sys = DS1225Y(dev);
38
NvRamState *s = &sys->nvram;
39
@@ -XXX,XX +XXX,XX @@ static int nvram_sysbus_initfn(SysBusDevice *dev)
40
41
memory_region_init_io(&s->iomem, OBJECT(s), &nvram_ops, s,
42
"nvram", s->chip_size);
43
- sysbus_init_mmio(dev, &s->iomem);
44
+ sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->iomem);
45
46
/* Read current file */
47
file = s->filename ? fopen(s->filename, "rb") : NULL;
48
if (file) {
49
/* Read nvram contents */
50
if (fread(s->contents, s->chip_size, 1, file) != 1) {
51
- printf("nvram_sysbus_initfn: short read\n");
52
+ error_report("nvram_sysbus_realize: short read");
53
}
35
}
54
fclose(file);
55
}
36
}
56
nvram_post_load(s, 0);
37
+ if (s->silicon_rev == AST2500_A0_SILICON_REV ||
57
-
38
+ s->silicon_rev == AST2500_A1_SILICON_REV) {
58
- return 0;
39
+ switch (addr) {
59
}
40
+ case R_STATUS1:
60
41
+ /* Will never return 'busy' */
61
static Property nvram_sysbus_properties[] = {
42
+ data &= ~PHY_BUSY_STATE;
62
@@ -XXX,XX +XXX,XX @@ static Property nvram_sysbus_properties[] = {
43
+ break;
63
static void nvram_sysbus_class_init(ObjectClass *klass, void *data)
44
+ default:
64
{
45
+ break;
65
DeviceClass *dc = DEVICE_CLASS(klass);
46
+ }
66
- SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
47
+ }
67
48
68
- k->init = nvram_sysbus_initfn;
49
s->regs[addr] = data;
69
+ dc->realize = nvram_sysbus_realize;
70
dc->vmsd = &vmstate_nvram;
71
dc->props = nvram_sysbus_properties;
72
}
50
}
73
--
51
--
74
2.19.2
52
2.18.0
75
53
76
54
diff view generated by jsdifflib
1
From: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
1
From: Joel Stanley <joel@jms.id.au>
2
2
3
Use DeviceClass rather than SysBusDeviceClass in
3
This is required to ensure u-boot SDRAM training completes.
4
puv3_pm_class_init().
5
4
6
Cc: gxt@mprc.pku.edu.cn
5
Signed-off-by: Joel Stanley <joel@jms.id.au>
7
6
Reviewed-by: Cédric Le Goater <clg@kaod.org>
8
Signed-off-by: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
7
Tested-by: Cédric Le Goater <clg@kaod.org>
9
Signed-off-by: Zhang Shengju <zhangshengju@cmss.chinamobile.com>
8
Message-id: 20180807075757.7242-6-joel@jms.id.au
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
12
Message-id: 20181130093852.20739-14-maozhongyi@cmss.chinamobile.com
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
10
---
15
hw/misc/puv3_pm.c | 10 ++++------
11
hw/misc/aspeed_sdmc.c | 9 +++++++++
16
1 file changed, 4 insertions(+), 6 deletions(-)
12
1 file changed, 9 insertions(+)
17
13
18
diff --git a/hw/misc/puv3_pm.c b/hw/misc/puv3_pm.c
14
diff --git a/hw/misc/aspeed_sdmc.c b/hw/misc/aspeed_sdmc.c
19
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/misc/puv3_pm.c
16
--- a/hw/misc/aspeed_sdmc.c
21
+++ b/hw/misc/puv3_pm.c
17
+++ b/hw/misc/aspeed_sdmc.c
22
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps puv3_pm_ops = {
18
@@ -XXX,XX +XXX,XX @@
23
.endianness = DEVICE_NATIVE_ENDIAN,
19
#define R_STATUS1 (0x60 / 4)
24
};
20
#define PHY_BUSY_STATE BIT(0)
25
21
26
-static int puv3_pm_init(SysBusDevice *dev)
22
+#define R_ECC_TEST_CTRL (0x70 / 4)
27
+static void puv3_pm_realize(DeviceState *dev, Error **errp)
23
+#define ECC_TEST_FINISHED BIT(12)
28
{
24
+#define ECC_TEST_FAIL BIT(13)
29
PUV3PMState *s = PUV3_PM(dev);
25
+
30
26
/*
31
@@ -XXX,XX +XXX,XX @@ static int puv3_pm_init(SysBusDevice *dev)
27
* Configuration register Ox4 (for Aspeed AST2400 SOC)
32
28
*
33
memory_region_init_io(&s->iomem, OBJECT(s), &puv3_pm_ops, s, "puv3_pm",
29
@@ -XXX,XX +XXX,XX @@ static void aspeed_sdmc_write(void *opaque, hwaddr addr, uint64_t data,
34
PUV3_REGS_OFFSET);
30
/* Will never return 'busy' */
35
- sysbus_init_mmio(dev, &s->iomem);
31
data &= ~PHY_BUSY_STATE;
36
-
32
break;
37
- return 0;
33
+ case R_ECC_TEST_CTRL:
38
+ sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->iomem);
34
+ /* Always done, always happy */
39
}
35
+ data |= ECC_TEST_FINISHED;
40
36
+ data &= ~ECC_TEST_FAIL;
41
static void puv3_pm_class_init(ObjectClass *klass, void *data)
37
+ break;
42
{
38
default:
43
- SysBusDeviceClass *sdc = SYS_BUS_DEVICE_CLASS(klass);
39
break;
44
+ DeviceClass *dc = DEVICE_CLASS(klass);
40
}
45
46
- sdc->init = puv3_pm_init;
47
+ dc->realize = puv3_pm_realize;
48
}
49
50
static const TypeInfo puv3_pm_info = {
51
--
41
--
52
2.19.2
42
2.18.0
53
43
54
44
diff view generated by jsdifflib
1
From: Ricardo Perez Blanco <ricardo.perez_blanco@nokia.com>
1
From: Cédric Le Goater <clg@kaod.org>
2
2
3
Architecturally, it's possible for an AArch64 machine to have
3
This will be used to construct a memory region beyond the RAM region
4
all of its RAM over the 4GB mark, but our kernel/initrd loading
4
to let firmwares scan the address space with load/store to guess how
5
code in boot.c assumes that the upper half of the addresses
5
much RAM the SoC has.
6
to load these images to is always zero. Write the whole 64 bit
7
address into the bootloader code fragment, not just the low half.
8
6
9
Note that, currently, none of the existing QEMU machines have
7
Signed-off-by: Cédric Le Goater <clg@kaod.org>
10
their main memory over 4GBs, so this was not a user-visible bug.
8
Signed-off-by: Joel Stanley <joel@jms.id.au>
11
9
Tested-by: Cédric Le Goater <clg@kaod.org>
12
Signed-off-by: Ricardo Perez Blanco <ricardo.perez_blanco@nokia.com>
10
Message-id: 20180807075757.7242-7-joel@jms.id.au
13
[PMM: revised commit message and tweaked some long lines]
14
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
---
13
---
17
hw/arm/boot.c | 35 ++++++++++++++++++++++-------------
14
include/hw/misc/aspeed_sdmc.h | 1 +
18
1 file changed, 22 insertions(+), 13 deletions(-)
15
hw/arm/aspeed.c | 31 +++++++++++++++++++++++++++++++
16
hw/arm/aspeed_soc.c | 2 ++
17
hw/misc/aspeed_sdmc.c | 3 +++
18
4 files changed, 37 insertions(+)
19
19
20
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
20
diff --git a/include/hw/misc/aspeed_sdmc.h b/include/hw/misc/aspeed_sdmc.h
21
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/arm/boot.c
22
--- a/include/hw/misc/aspeed_sdmc.h
23
+++ b/hw/arm/boot.c
23
+++ b/include/hw/misc/aspeed_sdmc.h
24
@@ -XXX,XX +XXX,XX @@ typedef enum {
24
@@ -XXX,XX +XXX,XX @@ typedef struct AspeedSDMCState {
25
FIXUP_TERMINATOR, /* end of insns */
25
uint32_t silicon_rev;
26
FIXUP_BOARDID, /* overwrite with board ID number */
26
uint32_t ram_bits;
27
FIXUP_BOARD_SETUP, /* overwrite with board specific setup code address */
27
uint64_t ram_size;
28
- FIXUP_ARGPTR, /* overwrite with pointer to kernel args */
28
+ uint64_t max_ram_size;
29
- FIXUP_ENTRYPOINT, /* overwrite with kernel entry point */
29
uint32_t fixed_conf;
30
+ FIXUP_ARGPTR_LO, /* overwrite with pointer to kernel args */
30
31
+ FIXUP_ARGPTR_HI, /* overwrite with pointer to kernel args (high half) */
31
} AspeedSDMCState;
32
+ FIXUP_ENTRYPOINT_LO, /* overwrite with kernel entry point */
32
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
33
+ FIXUP_ENTRYPOINT_HI, /* overwrite with kernel entry point (high half) */
33
index XXXXXXX..XXXXXXX 100644
34
FIXUP_GIC_CPU_IF, /* overwrite with GIC CPU interface address */
34
--- a/hw/arm/aspeed.c
35
FIXUP_BOOTREG, /* overwrite with boot register address */
35
+++ b/hw/arm/aspeed.c
36
FIXUP_DSB, /* overwrite with correct DSB insn for cpu */
36
@@ -XXX,XX +XXX,XX @@ static struct arm_boot_info aspeed_board_binfo = {
37
@@ -XXX,XX +XXX,XX @@ static const ARMInsnFixup bootloader_aarch64[] = {
37
typedef struct AspeedBoardState {
38
{ 0xaa1f03e3 }, /* mov x3, xzr */
38
AspeedSoCState soc;
39
{ 0x58000084 }, /* ldr x4, entry ; Load the lower 32-bits of kernel entry */
39
MemoryRegion ram;
40
{ 0xd61f0080 }, /* br x4 ; Jump to the kernel entry point */
40
+ MemoryRegion max_ram;
41
- { 0, FIXUP_ARGPTR }, /* arg: .word @DTB Lower 32-bits */
41
} AspeedBoardState;
42
- { 0 }, /* .word @DTB Higher 32-bits */
42
43
- { 0, FIXUP_ENTRYPOINT }, /* entry: .word @Kernel Entry Lower 32-bits */
43
typedef struct AspeedBoardConfig {
44
- { 0 }, /* .word @Kernel Entry Higher 32-bits */
44
@@ -XXX,XX +XXX,XX @@ static const AspeedBoardConfig aspeed_boards[] = {
45
+ { 0, FIXUP_ARGPTR_LO }, /* arg: .word @DTB Lower 32-bits */
45
},
46
+ { 0, FIXUP_ARGPTR_HI}, /* .word @DTB Higher 32-bits */
47
+ { 0, FIXUP_ENTRYPOINT_LO }, /* entry: .word @Kernel Entry Lower 32-bits */
48
+ { 0, FIXUP_ENTRYPOINT_HI }, /* .word @Kernel Entry Higher 32-bits */
49
{ 0, FIXUP_TERMINATOR }
50
};
46
};
51
47
52
@@ -XXX,XX +XXX,XX @@ static const ARMInsnFixup bootloader[] = {
48
+/*
53
{ 0xe59f2004 }, /* ldr r2, [pc, #4] */
49
+ * The max ram region is for firmwares that scan the address space
54
{ 0xe59ff004 }, /* ldr pc, [pc, #4] */
50
+ * with load/store to guess how much RAM the SoC has.
55
{ 0, FIXUP_BOARDID },
51
+ */
56
- { 0, FIXUP_ARGPTR },
52
+static uint64_t max_ram_read(void *opaque, hwaddr offset, unsigned size)
57
- { 0, FIXUP_ENTRYPOINT },
53
+{
58
+ { 0, FIXUP_ARGPTR_LO },
54
+ return 0;
59
+ { 0, FIXUP_ENTRYPOINT_LO },
55
+}
60
{ 0, FIXUP_TERMINATOR }
56
+
57
+static void max_ram_write(void *opaque, hwaddr offset, uint64_t value,
58
+ unsigned size)
59
+{
60
+ /* Discard writes */
61
+}
62
+
63
+static const MemoryRegionOps max_ram_ops = {
64
+ .read = max_ram_read,
65
+ .write = max_ram_write,
66
+ .endianness = DEVICE_NATIVE_ENDIAN,
67
+};
68
+
69
#define FIRMWARE_ADDR 0x0
70
71
static void write_boot_rom(DriveInfo *dinfo, hwaddr addr, size_t rom_size,
72
@@ -XXX,XX +XXX,XX @@ static void aspeed_board_init(MachineState *machine,
73
AspeedBoardState *bmc;
74
AspeedSoCClass *sc;
75
DriveInfo *drive0 = drive_get(IF_MTD, 0, 0);
76
+ ram_addr_t max_ram_size;
77
78
bmc = g_new0(AspeedBoardState, 1);
79
object_initialize(&bmc->soc, (sizeof(bmc->soc)), cfg->soc_name);
80
@@ -XXX,XX +XXX,XX @@ static void aspeed_board_init(MachineState *machine,
81
object_property_add_const_link(OBJECT(&bmc->soc), "ram", OBJECT(&bmc->ram),
82
&error_abort);
83
84
+ max_ram_size = object_property_get_uint(OBJECT(&bmc->soc), "max-ram-size",
85
+ &error_abort);
86
+ memory_region_init_io(&bmc->max_ram, NULL, &max_ram_ops, NULL,
87
+ "max_ram", max_ram_size - ram_size);
88
+ memory_region_add_subregion(get_system_memory(),
89
+ sc->info->sdram_base + ram_size,
90
+ &bmc->max_ram);
91
+
92
aspeed_board_init_flashes(&bmc->soc.fmc, cfg->fmc_model, &error_abort);
93
aspeed_board_init_flashes(&bmc->soc.spi[0], cfg->spi_model, &error_abort);
94
95
diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c
96
index XXXXXXX..XXXXXXX 100644
97
--- a/hw/arm/aspeed_soc.c
98
+++ b/hw/arm/aspeed_soc.c
99
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_init(Object *obj)
100
sc->info->silicon_rev);
101
object_property_add_alias(obj, "ram-size", OBJECT(&s->sdmc),
102
"ram-size", &error_abort);
103
+ object_property_add_alias(obj, "max-ram-size", OBJECT(&s->sdmc),
104
+ "max-ram-size", &error_abort);
105
106
for (i = 0; i < sc->info->wdts_num; i++) {
107
object_initialize(&s->wdt[i], sizeof(s->wdt[i]), TYPE_ASPEED_WDT);
108
diff --git a/hw/misc/aspeed_sdmc.c b/hw/misc/aspeed_sdmc.c
109
index XXXXXXX..XXXXXXX 100644
110
--- a/hw/misc/aspeed_sdmc.c
111
+++ b/hw/misc/aspeed_sdmc.c
112
@@ -XXX,XX +XXX,XX @@ static void aspeed_sdmc_realize(DeviceState *dev, Error **errp)
113
case AST2400_A0_SILICON_REV:
114
case AST2400_A1_SILICON_REV:
115
s->ram_bits = ast2400_rambits(s);
116
+ s->max_ram_size = 512 << 20;
117
s->fixed_conf = ASPEED_SDMC_VGA_COMPAT |
118
ASPEED_SDMC_DRAM_SIZE(s->ram_bits);
119
break;
120
case AST2500_A0_SILICON_REV:
121
case AST2500_A1_SILICON_REV:
122
s->ram_bits = ast2500_rambits(s);
123
+ s->max_ram_size = 1024 << 20;
124
s->fixed_conf = ASPEED_SDMC_HW_VERSION(1) |
125
ASPEED_SDMC_VGA_APERTURE(ASPEED_SDMC_VGA_64MB) |
126
ASPEED_SDMC_CACHE_INITIAL_DONE |
127
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_aspeed_sdmc = {
128
static Property aspeed_sdmc_properties[] = {
129
DEFINE_PROP_UINT32("silicon-rev", AspeedSDMCState, silicon_rev, 0),
130
DEFINE_PROP_UINT64("ram-size", AspeedSDMCState, ram_size, 0),
131
+ DEFINE_PROP_UINT64("max-ram-size", AspeedSDMCState, max_ram_size, 0),
132
DEFINE_PROP_END_OF_LIST(),
61
};
133
};
62
134
63
@@ -XXX,XX +XXX,XX @@ static void write_bootloader(const char *name, hwaddr addr,
64
break;
65
case FIXUP_BOARDID:
66
case FIXUP_BOARD_SETUP:
67
- case FIXUP_ARGPTR:
68
- case FIXUP_ENTRYPOINT:
69
+ case FIXUP_ARGPTR_LO:
70
+ case FIXUP_ARGPTR_HI:
71
+ case FIXUP_ENTRYPOINT_LO:
72
+ case FIXUP_ENTRYPOINT_HI:
73
case FIXUP_GIC_CPU_IF:
74
case FIXUP_BOOTREG:
75
case FIXUP_DSB:
76
@@ -XXX,XX +XXX,XX @@ void arm_load_kernel(ARMCPU *cpu, struct arm_boot_info *info)
77
/* Place the DTB after the initrd in memory with alignment. */
78
info->dtb_start = QEMU_ALIGN_UP(info->initrd_start + initrd_size,
79
align);
80
- fixupcontext[FIXUP_ARGPTR] = info->dtb_start;
81
+ fixupcontext[FIXUP_ARGPTR_LO] = info->dtb_start;
82
+ fixupcontext[FIXUP_ARGPTR_HI] = info->dtb_start >> 32;
83
} else {
84
- fixupcontext[FIXUP_ARGPTR] = info->loader_start + KERNEL_ARGS_ADDR;
85
+ fixupcontext[FIXUP_ARGPTR_LO] =
86
+ info->loader_start + KERNEL_ARGS_ADDR;
87
+ fixupcontext[FIXUP_ARGPTR_HI] =
88
+ (info->loader_start + KERNEL_ARGS_ADDR) >> 32;
89
if (info->ram_size >= (1ULL << 32)) {
90
error_report("RAM size must be less than 4GB to boot"
91
" Linux kernel using ATAGS (try passing a device tree"
92
@@ -XXX,XX +XXX,XX @@ void arm_load_kernel(ARMCPU *cpu, struct arm_boot_info *info)
93
exit(1);
94
}
95
}
96
- fixupcontext[FIXUP_ENTRYPOINT] = entry;
97
+ fixupcontext[FIXUP_ENTRYPOINT_LO] = entry;
98
+ fixupcontext[FIXUP_ENTRYPOINT_HI] = entry >> 32;
99
100
write_bootloader("bootloader", info->loader_start,
101
primary_loader, fixupcontext, as);
102
--
135
--
103
2.19.2
136
2.18.0
104
137
105
138
diff view generated by jsdifflib
Deleted patch
1
From: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
2
1
3
Use DeviceClass rather than SysBusDeviceClass in
4
mv88w8618_wlan_class_init().
5
6
Cc: jan.kiszka@web.de
7
Cc: peter.maydell@linaro.org
8
Cc: qemu-arm@nongnu.org
9
10
Signed-off-by: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
11
Signed-off-by: Zhang Shengju <zhangshengju@cmss.chinamobile.com>
12
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
13
Message-id: 20181130093852.20739-2-maozhongyi@cmss.chinamobile.com
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
---
16
hw/arm/musicpal.c | 9 ++++-----
17
1 file changed, 4 insertions(+), 5 deletions(-)
18
19
diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c
20
index XXXXXXX..XXXXXXX 100644
21
--- a/hw/arm/musicpal.c
22
+++ b/hw/arm/musicpal.c
23
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps mv88w8618_wlan_ops = {
24
.endianness = DEVICE_NATIVE_ENDIAN,
25
};
26
27
-static int mv88w8618_wlan_init(SysBusDevice *dev)
28
+static void mv88w8618_wlan_realize(DeviceState *dev, Error **errp)
29
{
30
MemoryRegion *iomem = g_new(MemoryRegion, 1);
31
32
memory_region_init_io(iomem, OBJECT(dev), &mv88w8618_wlan_ops, NULL,
33
"musicpal-wlan", MP_WLAN_SIZE);
34
- sysbus_init_mmio(dev, iomem);
35
- return 0;
36
+ sysbus_init_mmio(SYS_BUS_DEVICE(dev), iomem);
37
}
38
39
/* GPIO register offsets */
40
@@ -XXX,XX +XXX,XX @@ DEFINE_MACHINE("musicpal", musicpal_machine_init)
41
42
static void mv88w8618_wlan_class_init(ObjectClass *klass, void *data)
43
{
44
- SysBusDeviceClass *sdc = SYS_BUS_DEVICE_CLASS(klass);
45
+ DeviceClass *dc = DEVICE_CLASS(klass);
46
47
- sdc->init = mv88w8618_wlan_init;
48
+ dc->realize = mv88w8618_wlan_realize;
49
}
50
51
static const TypeInfo mv88w8618_wlan_info = {
52
--
53
2.19.2
54
55
diff view generated by jsdifflib
Deleted patch
1
From: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
2
1
3
Use DeviceClass rather than SysBusDeviceClass in
4
onenand_class_init().
5
6
Cc: kwolf@redhat.com
7
Cc: mreitz@redhat.com
8
Cc: qemu-block@nongnu.org
9
10
Signed-off-by: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
11
Signed-off-by: Zhang Shengju <zhangshengju@cmss.chinamobile.com>
12
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
13
Message-id: 20181130093852.20739-3-maozhongyi@cmss.chinamobile.com
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
---
16
hw/block/onenand.c | 16 +++++++---------
17
1 file changed, 7 insertions(+), 9 deletions(-)
18
19
diff --git a/hw/block/onenand.c b/hw/block/onenand.c
20
index XXXXXXX..XXXXXXX 100644
21
--- a/hw/block/onenand.c
22
+++ b/hw/block/onenand.c
23
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps onenand_ops = {
24
.endianness = DEVICE_NATIVE_ENDIAN,
25
};
26
27
-static int onenand_initfn(SysBusDevice *sbd)
28
+static void onenand_realize(DeviceState *dev, Error **errp)
29
{
30
- DeviceState *dev = DEVICE(sbd);
31
+ SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
32
OneNANDState *s = ONE_NAND(dev);
33
uint32_t size = 1 << (24 + ((s->id.dev >> 4) & 7));
34
void *ram;
35
@@ -XXX,XX +XXX,XX @@ static int onenand_initfn(SysBusDevice *sbd)
36
0xff, size + (size >> 5));
37
} else {
38
if (blk_is_read_only(s->blk)) {
39
- error_report("Can't use a read-only drive");
40
- return -1;
41
+ error_setg(errp, "Can't use a read-only drive");
42
+ return;
43
}
44
blk_set_perm(s->blk, BLK_PERM_CONSISTENT_READ | BLK_PERM_WRITE,
45
BLK_PERM_ALL, &local_err);
46
if (local_err) {
47
- error_report_err(local_err);
48
- return -1;
49
+ error_propagate(errp, local_err);
50
+ return;
51
}
52
s->blk_cur = s->blk;
53
}
54
@@ -XXX,XX +XXX,XX @@ static int onenand_initfn(SysBusDevice *sbd)
55
| ((s->id.dev & 0xff) << 8)
56
| (s->id.ver & 0xff),
57
&vmstate_onenand, s);
58
- return 0;
59
}
60
61
static Property onenand_properties[] = {
62
@@ -XXX,XX +XXX,XX @@ static Property onenand_properties[] = {
63
static void onenand_class_init(ObjectClass *klass, void *data)
64
{
65
DeviceClass *dc = DEVICE_CLASS(klass);
66
- SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
67
68
- k->init = onenand_initfn;
69
+ dc->realize = onenand_realize;
70
dc->reset = onenand_system_reset;
71
dc->props = onenand_properties;
72
}
73
--
74
2.19.2
75
76
diff view generated by jsdifflib
Deleted patch
1
From: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
2
1
3
Use DeviceClass rather than SysBusDeviceClass in
4
grlib_apbuart_class_init().
5
6
Cc: chouteau@adacore.com
7
Cc: marcandre.lureau@redhat.com
8
Cc: pbonzini@redhat.com
9
10
Signed-off-by: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
11
Signed-off-by: Zhang Shengju <zhangshengju@cmss.chinamobile.com>
12
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
13
Message-id: 20181130093852.20739-4-maozhongyi@cmss.chinamobile.com
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
---
16
hw/char/grlib_apbuart.c | 12 +++++-------
17
1 file changed, 5 insertions(+), 7 deletions(-)
18
19
diff --git a/hw/char/grlib_apbuart.c b/hw/char/grlib_apbuart.c
20
index XXXXXXX..XXXXXXX 100644
21
--- a/hw/char/grlib_apbuart.c
22
+++ b/hw/char/grlib_apbuart.c
23
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps grlib_apbuart_ops = {
24
.endianness = DEVICE_NATIVE_ENDIAN,
25
};
26
27
-static int grlib_apbuart_init(SysBusDevice *dev)
28
+static void grlib_apbuart_realize(DeviceState *dev, Error **errp)
29
{
30
UART *uart = GRLIB_APB_UART(dev);
31
+ SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
32
33
qemu_chr_fe_set_handlers(&uart->chr,
34
grlib_apbuart_can_receive,
35
@@ -XXX,XX +XXX,XX @@ static int grlib_apbuart_init(SysBusDevice *dev)
36
grlib_apbuart_event,
37
NULL, uart, NULL, true);
38
39
- sysbus_init_irq(dev, &uart->irq);
40
+ sysbus_init_irq(sbd, &uart->irq);
41
42
memory_region_init_io(&uart->iomem, OBJECT(uart), &grlib_apbuart_ops, uart,
43
"uart", UART_REG_SIZE);
44
45
- sysbus_init_mmio(dev, &uart->iomem);
46
-
47
- return 0;
48
+ sysbus_init_mmio(sbd, &uart->iomem);
49
}
50
51
static void grlib_apbuart_reset(DeviceState *d)
52
@@ -XXX,XX +XXX,XX @@ static Property grlib_apbuart_properties[] = {
53
static void grlib_apbuart_class_init(ObjectClass *klass, void *data)
54
{
55
DeviceClass *dc = DEVICE_CLASS(klass);
56
- SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
57
58
- k->init = grlib_apbuart_init;
59
+ dc->realize = grlib_apbuart_realize;
60
dc->reset = grlib_apbuart_reset;
61
dc->props = grlib_apbuart_properties;
62
}
63
--
64
2.19.2
65
66
diff view generated by jsdifflib
Deleted patch
1
From: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
2
1
3
Use DeviceClass rather than SysBusDeviceClass in
4
empty_slot_class_init().
5
6
Signed-off-by: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
7
Signed-off-by: Zhang Shengju <zhangshengju@cmss.chinamobile.com>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
10
Message-id: 20181130093852.20739-5-maozhongyi@cmss.chinamobile.com
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
13
hw/core/empty_slot.c | 9 ++++-----
14
1 file changed, 4 insertions(+), 5 deletions(-)
15
16
diff --git a/hw/core/empty_slot.c b/hw/core/empty_slot.c
17
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/core/empty_slot.c
19
+++ b/hw/core/empty_slot.c
20
@@ -XXX,XX +XXX,XX @@ void empty_slot_init(hwaddr addr, uint64_t slot_size)
21
}
22
}
23
24
-static int empty_slot_init1(SysBusDevice *dev)
25
+static void empty_slot_realize(DeviceState *dev, Error **errp)
26
{
27
EmptySlot *s = EMPTY_SLOT(dev);
28
29
memory_region_init_io(&s->iomem, OBJECT(s), &empty_slot_ops, s,
30
"empty-slot", s->size);
31
- sysbus_init_mmio(dev, &s->iomem);
32
- return 0;
33
+ sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->iomem);
34
}
35
36
static void empty_slot_class_init(ObjectClass *klass, void *data)
37
{
38
- SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
39
+ DeviceClass *dc = DEVICE_CLASS(klass);
40
41
- k->init = empty_slot_init1;
42
+ dc->realize = empty_slot_realize;
43
}
44
45
static const TypeInfo empty_slot_info = {
46
--
47
2.19.2
48
49
diff view generated by jsdifflib
Deleted patch
1
From: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
2
1
3
Use DeviceClass rather than SysBusDeviceClass in
4
g364fb_sysbus_class_init().
5
6
Cc: pbonzini@redhat.com
7
Cc: kraxel@redhat.com
8
Cc: f4bug@amsat.org
9
Cc: alistair.francis@wdc.com
10
11
Signed-off-by: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
12
Signed-off-by: Zhang Shengju <zhangshengju@cmss.chinamobile.com>
13
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
14
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
15
Message-id: 20181130093852.20739-6-maozhongyi@cmss.chinamobile.com
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
---
18
hw/display/g364fb.c | 9 +++------
19
1 file changed, 3 insertions(+), 6 deletions(-)
20
21
diff --git a/hw/display/g364fb.c b/hw/display/g364fb.c
22
index XXXXXXX..XXXXXXX 100644
23
--- a/hw/display/g364fb.c
24
+++ b/hw/display/g364fb.c
25
@@ -XXX,XX +XXX,XX @@ typedef struct {
26
G364State g364;
27
} G364SysBusState;
28
29
-static int g364fb_sysbus_init(SysBusDevice *sbd)
30
+static void g364fb_sysbus_realize(DeviceState *dev, Error **errp)
31
{
32
- DeviceState *dev = DEVICE(sbd);
33
G364SysBusState *sbs = G364(dev);
34
G364State *s = &sbs->g364;
35
+ SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
36
37
g364fb_init(dev, s);
38
sysbus_init_irq(sbd, &s->irq);
39
sysbus_init_mmio(sbd, &s->mem_ctrl);
40
sysbus_init_mmio(sbd, &s->mem_vram);
41
-
42
- return 0;
43
}
44
45
static void g364fb_sysbus_reset(DeviceState *d)
46
@@ -XXX,XX +XXX,XX @@ static Property g364fb_sysbus_properties[] = {
47
static void g364fb_sysbus_class_init(ObjectClass *klass, void *data)
48
{
49
DeviceClass *dc = DEVICE_CLASS(klass);
50
- SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
51
52
- k->init = g364fb_sysbus_init;
53
+ dc->realize = g364fb_sysbus_realize;
54
set_bit(DEVICE_CATEGORY_DISPLAY, dc->categories);
55
dc->desc = "G364 framebuffer";
56
dc->reset = g364fb_sysbus_reset;
57
--
58
2.19.2
59
60
diff view generated by jsdifflib
Deleted patch
1
From: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
2
1
3
Use DeviceClass rather than SysBusDeviceClass in
4
puv3_dma_class_init().
5
6
Cc: gxt@mprc.pku.edu.cn
7
8
Signed-off-by: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
9
Signed-off-by: Zhang Shengju <zhangshengju@cmss.chinamobile.com>
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
12
Message-id: 20181130093852.20739-7-maozhongyi@cmss.chinamobile.com
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
15
hw/dma/puv3_dma.c | 10 ++++------
16
1 file changed, 4 insertions(+), 6 deletions(-)
17
18
diff --git a/hw/dma/puv3_dma.c b/hw/dma/puv3_dma.c
19
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/dma/puv3_dma.c
21
+++ b/hw/dma/puv3_dma.c
22
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps puv3_dma_ops = {
23
.endianness = DEVICE_NATIVE_ENDIAN,
24
};
25
26
-static int puv3_dma_init(SysBusDevice *dev)
27
+static void puv3_dma_realize(DeviceState *dev, Error **errp)
28
{
29
PUV3DMAState *s = PUV3_DMA(dev);
30
int i;
31
@@ -XXX,XX +XXX,XX @@ static int puv3_dma_init(SysBusDevice *dev)
32
33
memory_region_init_io(&s->iomem, OBJECT(s), &puv3_dma_ops, s, "puv3_dma",
34
PUV3_REGS_OFFSET);
35
- sysbus_init_mmio(dev, &s->iomem);
36
-
37
- return 0;
38
+ sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->iomem);
39
}
40
41
static void puv3_dma_class_init(ObjectClass *klass, void *data)
42
{
43
- SysBusDeviceClass *sdc = SYS_BUS_DEVICE_CLASS(klass);
44
+ DeviceClass *dc = DEVICE_CLASS(klass);
45
46
- sdc->init = puv3_dma_init;
47
+ dc->realize = puv3_dma_realize;
48
}
49
50
static const TypeInfo puv3_dma_info = {
51
--
52
2.19.2
53
54
diff view generated by jsdifflib
Deleted patch
1
From: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
2
1
3
Use DeviceClass rather than SysBusDeviceClass in
4
puv3_gpio_class_init().
5
6
Cc: gxt@mprc.pku.edu.cn
7
Cc: peter.maydell@linaro.org
8
9
Signed-off-by: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
10
Signed-off-by: Zhang Shengju <zhangshengju@cmss.chinamobile.com>
11
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
12
Message-id: 20181130093852.20739-8-maozhongyi@cmss.chinamobile.com
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
15
hw/gpio/puv3_gpio.c | 29 ++++++++++++++---------------
16
1 file changed, 14 insertions(+), 15 deletions(-)
17
18
diff --git a/hw/gpio/puv3_gpio.c b/hw/gpio/puv3_gpio.c
19
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/gpio/puv3_gpio.c
21
+++ b/hw/gpio/puv3_gpio.c
22
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps puv3_gpio_ops = {
23
.endianness = DEVICE_NATIVE_ENDIAN,
24
};
25
26
-static int puv3_gpio_init(SysBusDevice *dev)
27
+static void puv3_gpio_realize(DeviceState *dev, Error **errp)
28
{
29
PUV3GPIOState *s = PUV3_GPIO(dev);
30
+ SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
31
32
s->reg_GPLR = 0;
33
s->reg_GPDR = 0;
34
35
/* FIXME: these irqs not handled yet */
36
- sysbus_init_irq(dev, &s->irq[PUV3_IRQS_GPIOLOW0]);
37
- sysbus_init_irq(dev, &s->irq[PUV3_IRQS_GPIOLOW1]);
38
- sysbus_init_irq(dev, &s->irq[PUV3_IRQS_GPIOLOW2]);
39
- sysbus_init_irq(dev, &s->irq[PUV3_IRQS_GPIOLOW3]);
40
- sysbus_init_irq(dev, &s->irq[PUV3_IRQS_GPIOLOW4]);
41
- sysbus_init_irq(dev, &s->irq[PUV3_IRQS_GPIOLOW5]);
42
- sysbus_init_irq(dev, &s->irq[PUV3_IRQS_GPIOLOW6]);
43
- sysbus_init_irq(dev, &s->irq[PUV3_IRQS_GPIOLOW7]);
44
- sysbus_init_irq(dev, &s->irq[PUV3_IRQS_GPIOHIGH]);
45
+ sysbus_init_irq(sbd, &s->irq[PUV3_IRQS_GPIOLOW0]);
46
+ sysbus_init_irq(sbd, &s->irq[PUV3_IRQS_GPIOLOW1]);
47
+ sysbus_init_irq(sbd, &s->irq[PUV3_IRQS_GPIOLOW2]);
48
+ sysbus_init_irq(sbd, &s->irq[PUV3_IRQS_GPIOLOW3]);
49
+ sysbus_init_irq(sbd, &s->irq[PUV3_IRQS_GPIOLOW4]);
50
+ sysbus_init_irq(sbd, &s->irq[PUV3_IRQS_GPIOLOW5]);
51
+ sysbus_init_irq(sbd, &s->irq[PUV3_IRQS_GPIOLOW6]);
52
+ sysbus_init_irq(sbd, &s->irq[PUV3_IRQS_GPIOLOW7]);
53
+ sysbus_init_irq(sbd, &s->irq[PUV3_IRQS_GPIOHIGH]);
54
55
memory_region_init_io(&s->iomem, OBJECT(s), &puv3_gpio_ops, s, "puv3_gpio",
56
PUV3_REGS_OFFSET);
57
- sysbus_init_mmio(dev, &s->iomem);
58
-
59
- return 0;
60
+ sysbus_init_mmio(sbd, &s->iomem);
61
}
62
63
static void puv3_gpio_class_init(ObjectClass *klass, void *data)
64
{
65
- SysBusDeviceClass *sdc = SYS_BUS_DEVICE_CLASS(klass);
66
+ DeviceClass *dc = DEVICE_CLASS(klass);
67
68
- sdc->init = puv3_gpio_init;
69
+ dc->realize = puv3_gpio_realize;
70
}
71
72
static const TypeInfo puv3_gpio_info = {
73
--
74
2.19.2
75
76
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Replace arm_hcr_el2_{fmo,imo,amo} with a more general routine
3
When support for FZ16 was added, we failed to include the bit
4
that also takes SCR_EL3.NS (aka arm_is_secure_below_el3) into
4
within FPCR_MASK, which means that it could never be set.
5
account, as documented for the plethora of bits in HCR_EL2.
5
Continue to zero FZ16 when ARMv8.2-FP16 is not enabled.
6
6
7
Fixes: d81ce0ef2c4
8
Cc: qemu-stable@nongnu.org (3.0.1)
9
Reported-by: Laurent Desnogues <laurent.desnogues@gmail.com>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20181210150501.7990-2-richard.henderson@linaro.org
11
Reviewed-by: Laurent Desnogues <laurent.desnogues@gmail.com>
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
12
Tested-by: Laurent Desnogues <laurent.desnogues@gmail.com>
13
Message-id: 20180810193129.1556-2-richard.henderson@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
15
---
12
target/arm/cpu.h | 67 +++++++++------------------------------
16
target/arm/cpu.h | 2 +-
13
hw/intc/arm_gicv3_cpuif.c | 21 ++++++------
17
target/arm/helper.c | 5 +++++
14
target/arm/helper.c | 66 ++++++++++++++++++++++++++++++++------
18
2 files changed, 6 insertions(+), 1 deletion(-)
15
3 files changed, 83 insertions(+), 71 deletions(-)
16
19
17
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
20
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
18
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
19
--- a/target/arm/cpu.h
22
--- a/target/arm/cpu.h
20
+++ b/target/arm/cpu.h
23
+++ b/target/arm/cpu.h
21
@@ -XXX,XX +XXX,XX @@ static inline bool arm_is_secure(CPUARMState *env)
24
@@ -XXX,XX +XXX,XX @@ void vfp_set_fpscr(CPUARMState *env, uint32_t val);
22
}
25
* we store the underlying state in fpscr and just mask on read/write.
23
#endif
26
*/
24
27
#define FPSR_MASK 0xf800009f
25
+/**
28
-#define FPCR_MASK 0x07f79f00
26
+ * arm_hcr_el2_eff(): Return the effective value of HCR_EL2.
29
+#define FPCR_MASK 0x07ff9f00
27
+ * E.g. when in secure state, fields in HCR_EL2 are suppressed,
30
28
+ * "for all purposes other than a direct read or write access of HCR_EL2."
31
#define FPCR_FZ16 (1 << 19) /* ARMv8.2+, FP16 flush-to-zero */
29
+ * Not included here is HCR_RW.
32
#define FPCR_FZ (1 << 24) /* Flush-to-zero enable bit */
30
+ */
31
+uint64_t arm_hcr_el2_eff(CPUARMState *env);
32
+
33
/* Return true if the specified exception level is running in AArch64 state. */
34
static inline bool arm_el_is_aa64(CPUARMState *env, int el)
35
{
36
@@ -XXX,XX +XXX,XX @@ bool write_cpustate_to_list(ARMCPU *cpu);
37
# define TARGET_VIRT_ADDR_SPACE_BITS 32
38
#endif
39
40
-/**
41
- * arm_hcr_el2_imo(): Return the effective value of HCR_EL2.IMO.
42
- * Depending on the values of HCR_EL2.E2H and TGE, this may be
43
- * "behaves as 1 for all purposes other than direct read/write" or
44
- * "behaves as 0 for all purposes other than direct read/write"
45
- */
46
-static inline bool arm_hcr_el2_imo(CPUARMState *env)
47
-{
48
- switch (env->cp15.hcr_el2 & (HCR_TGE | HCR_E2H)) {
49
- case HCR_TGE:
50
- return true;
51
- case HCR_TGE | HCR_E2H:
52
- return false;
53
- default:
54
- return env->cp15.hcr_el2 & HCR_IMO;
55
- }
56
-}
57
-
58
-/**
59
- * arm_hcr_el2_fmo(): Return the effective value of HCR_EL2.FMO.
60
- */
61
-static inline bool arm_hcr_el2_fmo(CPUARMState *env)
62
-{
63
- switch (env->cp15.hcr_el2 & (HCR_TGE | HCR_E2H)) {
64
- case HCR_TGE:
65
- return true;
66
- case HCR_TGE | HCR_E2H:
67
- return false;
68
- default:
69
- return env->cp15.hcr_el2 & HCR_FMO;
70
- }
71
-}
72
-
73
-/**
74
- * arm_hcr_el2_amo(): Return the effective value of HCR_EL2.AMO.
75
- */
76
-static inline bool arm_hcr_el2_amo(CPUARMState *env)
77
-{
78
- switch (env->cp15.hcr_el2 & (HCR_TGE | HCR_E2H)) {
79
- case HCR_TGE:
80
- return true;
81
- case HCR_TGE | HCR_E2H:
82
- return false;
83
- default:
84
- return env->cp15.hcr_el2 & HCR_AMO;
85
- }
86
-}
87
-
88
static inline bool arm_excp_unmasked(CPUState *cs, unsigned int excp_idx,
89
unsigned int target_el)
90
{
91
@@ -XXX,XX +XXX,XX @@ static inline bool arm_excp_unmasked(CPUState *cs, unsigned int excp_idx,
92
bool secure = arm_is_secure(env);
93
bool pstate_unmasked;
94
int8_t unmasked = 0;
95
+ uint64_t hcr_el2;
96
97
/* Don't take exceptions if they target a lower EL.
98
* This check should catch any exceptions that would not be taken but left
99
@@ -XXX,XX +XXX,XX @@ static inline bool arm_excp_unmasked(CPUState *cs, unsigned int excp_idx,
100
return false;
101
}
102
103
+ hcr_el2 = arm_hcr_el2_eff(env);
104
+
105
switch (excp_idx) {
106
case EXCP_FIQ:
107
pstate_unmasked = !(env->daif & PSTATE_F);
108
@@ -XXX,XX +XXX,XX @@ static inline bool arm_excp_unmasked(CPUState *cs, unsigned int excp_idx,
109
break;
110
111
case EXCP_VFIQ:
112
- if (secure || !arm_hcr_el2_fmo(env) || (env->cp15.hcr_el2 & HCR_TGE)) {
113
+ if (secure || !(hcr_el2 & HCR_FMO) || (hcr_el2 & HCR_TGE)) {
114
/* VFIQs are only taken when hypervized and non-secure. */
115
return false;
116
}
117
return !(env->daif & PSTATE_F);
118
case EXCP_VIRQ:
119
- if (secure || !arm_hcr_el2_imo(env) || (env->cp15.hcr_el2 & HCR_TGE)) {
120
+ if (secure || !(hcr_el2 & HCR_IMO) || (hcr_el2 & HCR_TGE)) {
121
/* VIRQs are only taken when hypervized and non-secure. */
122
return false;
123
}
124
@@ -XXX,XX +XXX,XX @@ static inline bool arm_excp_unmasked(CPUState *cs, unsigned int excp_idx,
125
* to the CPSR.F setting otherwise we further assess the state
126
* below.
127
*/
128
- hcr = arm_hcr_el2_fmo(env);
129
+ hcr = hcr_el2 & HCR_FMO;
130
scr = (env->cp15.scr_el3 & SCR_FIQ);
131
132
/* When EL3 is 32-bit, the SCR.FW bit controls whether the
133
@@ -XXX,XX +XXX,XX @@ static inline bool arm_excp_unmasked(CPUState *cs, unsigned int excp_idx,
134
* when setting the target EL, so it does not have a further
135
* affect here.
136
*/
137
- hcr = arm_hcr_el2_imo(env);
138
+ hcr = hcr_el2 & HCR_IMO;
139
scr = false;
140
break;
141
default:
142
diff --git a/hw/intc/arm_gicv3_cpuif.c b/hw/intc/arm_gicv3_cpuif.c
143
index XXXXXXX..XXXXXXX 100644
144
--- a/hw/intc/arm_gicv3_cpuif.c
145
+++ b/hw/intc/arm_gicv3_cpuif.c
146
@@ -XXX,XX +XXX,XX @@ static bool icv_access(CPUARMState *env, int hcr_flags)
147
* * access if NS EL1 and either IMO or FMO == 1:
148
* CTLR, DIR, PMR, RPR
149
*/
150
- bool flagmatch = ((hcr_flags & HCR_IMO) && arm_hcr_el2_imo(env)) ||
151
- ((hcr_flags & HCR_FMO) && arm_hcr_el2_fmo(env));
152
+ uint64_t hcr_el2 = arm_hcr_el2_eff(env);
153
+ bool flagmatch = hcr_el2 & hcr_flags & (HCR_IMO | HCR_FMO);
154
155
return flagmatch && arm_current_el(env) == 1
156
&& !arm_is_secure_below_el3(env);
157
@@ -XXX,XX +XXX,XX @@ static void icc_dir_write(CPUARMState *env, const ARMCPRegInfo *ri,
158
/* No need to include !IsSecure in route_*_to_el2 as it's only
159
* tested in cases where we know !IsSecure is true.
160
*/
161
- route_fiq_to_el2 = arm_hcr_el2_fmo(env);
162
- route_irq_to_el2 = arm_hcr_el2_imo(env);
163
+ uint64_t hcr_el2 = arm_hcr_el2_eff(env);
164
+ route_fiq_to_el2 = hcr_el2 & HCR_FMO;
165
+ route_irq_to_el2 = hcr_el2 & HCR_IMO;
166
167
switch (arm_current_el(env)) {
168
case 3:
169
@@ -XXX,XX +XXX,XX @@ static CPAccessResult gicv3_irqfiq_access(CPUARMState *env,
170
if ((env->cp15.scr_el3 & (SCR_FIQ | SCR_IRQ)) == (SCR_FIQ | SCR_IRQ)) {
171
switch (el) {
172
case 1:
173
- if (arm_is_secure_below_el3(env) ||
174
- (arm_hcr_el2_imo(env) == 0 && arm_hcr_el2_fmo(env) == 0)) {
175
+ /* Note that arm_hcr_el2_eff takes secure state into account. */
176
+ if ((arm_hcr_el2_eff(env) & (HCR_IMO | HCR_FMO)) == 0) {
177
r = CP_ACCESS_TRAP_EL3;
178
}
179
break;
180
@@ -XXX,XX +XXX,XX @@ static CPAccessResult gicv3_dir_access(CPUARMState *env,
181
static CPAccessResult gicv3_sgi_access(CPUARMState *env,
182
const ARMCPRegInfo *ri, bool isread)
183
{
184
- if ((arm_hcr_el2_imo(env) || arm_hcr_el2_fmo(env)) &&
185
- arm_current_el(env) == 1 && !arm_is_secure_below_el3(env)) {
186
+ if (arm_current_el(env) == 1 &&
187
+ (arm_hcr_el2_eff(env) & (HCR_IMO | HCR_FMO)) != 0) {
188
/* Takes priority over a possible EL3 trap */
189
return CP_ACCESS_TRAP_EL2;
190
}
191
@@ -XXX,XX +XXX,XX @@ static CPAccessResult gicv3_fiq_access(CPUARMState *env,
192
if (env->cp15.scr_el3 & SCR_FIQ) {
193
switch (el) {
194
case 1:
195
- if (arm_is_secure_below_el3(env) || !arm_hcr_el2_fmo(env)) {
196
+ if ((arm_hcr_el2_eff(env) & HCR_FMO) == 0) {
197
r = CP_ACCESS_TRAP_EL3;
198
}
199
break;
200
@@ -XXX,XX +XXX,XX @@ static CPAccessResult gicv3_irq_access(CPUARMState *env,
201
if (env->cp15.scr_el3 & SCR_IRQ) {
202
switch (el) {
203
case 1:
204
- if (arm_is_secure_below_el3(env) || !arm_hcr_el2_imo(env)) {
205
+ if ((arm_hcr_el2_eff(env) & HCR_IMO) == 0) {
206
r = CP_ACCESS_TRAP_EL3;
207
}
208
break;
209
diff --git a/target/arm/helper.c b/target/arm/helper.c
33
diff --git a/target/arm/helper.c b/target/arm/helper.c
210
index XXXXXXX..XXXXXXX 100644
34
index XXXXXXX..XXXXXXX 100644
211
--- a/target/arm/helper.c
35
--- a/target/arm/helper.c
212
+++ b/target/arm/helper.c
36
+++ b/target/arm/helper.c
213
@@ -XXX,XX +XXX,XX @@ static void csselr_write(CPUARMState *env, const ARMCPRegInfo *ri,
37
@@ -XXX,XX +XXX,XX @@ void HELPER(vfp_set_fpscr)(CPUARMState *env, uint32_t val)
214
static uint64_t isr_read(CPUARMState *env, const ARMCPRegInfo *ri)
38
int i;
215
{
39
uint32_t changed;
216
CPUState *cs = ENV_GET_CPU(env);
40
217
+ uint64_t hcr_el2 = arm_hcr_el2_eff(env);
41
+ /* When ARMv8.2-FP16 is not supported, FZ16 is RES0. */
218
uint64_t ret = 0;
42
+ if (!arm_feature(env, ARM_FEATURE_V8_FP16)) {
219
43
+ val &= ~FPCR_FZ16;
220
- if (arm_hcr_el2_imo(env)) {
221
+ if (hcr_el2 & HCR_IMO) {
222
if (cs->interrupt_request & CPU_INTERRUPT_VIRQ) {
223
ret |= CPSR_I;
224
}
225
@@ -XXX,XX +XXX,XX @@ static uint64_t isr_read(CPUARMState *env, const ARMCPRegInfo *ri)
226
}
227
}
228
229
- if (arm_hcr_el2_fmo(env)) {
230
+ if (hcr_el2 & HCR_FMO) {
231
if (cs->interrupt_request & CPU_INTERRUPT_VFIQ) {
232
ret |= CPSR_F;
233
}
234
@@ -XXX,XX +XXX,XX @@ static void hcr_writelow(CPUARMState *env, const ARMCPRegInfo *ri,
235
hcr_write(env, NULL, value);
236
}
237
238
+/*
239
+ * Return the effective value of HCR_EL2.
240
+ * Bits that are not included here:
241
+ * RW (read from SCR_EL3.RW as needed)
242
+ */
243
+uint64_t arm_hcr_el2_eff(CPUARMState *env)
244
+{
245
+ uint64_t ret = env->cp15.hcr_el2;
246
+
247
+ if (arm_is_secure_below_el3(env)) {
248
+ /*
249
+ * "This register has no effect if EL2 is not enabled in the
250
+ * current Security state". This is ARMv8.4-SecEL2 speak for
251
+ * !(SCR_EL3.NS==1 || SCR_EL3.EEL2==1).
252
+ *
253
+ * Prior to that, the language was "In an implementation that
254
+ * includes EL3, when the value of SCR_EL3.NS is 0 the PE behaves
255
+ * as if this field is 0 for all purposes other than a direct
256
+ * read or write access of HCR_EL2". With lots of enumeration
257
+ * on a per-field basis. In current QEMU, this is condition
258
+ * is arm_is_secure_below_el3.
259
+ *
260
+ * Since the v8.4 language applies to the entire register, and
261
+ * appears to be backward compatible, use that.
262
+ */
263
+ ret = 0;
264
+ } else if (ret & HCR_TGE) {
265
+ /* These bits are up-to-date as of ARMv8.4. */
266
+ if (ret & HCR_E2H) {
267
+ ret &= ~(HCR_VM | HCR_FMO | HCR_IMO | HCR_AMO |
268
+ HCR_BSU_MASK | HCR_DC | HCR_TWI | HCR_TWE |
269
+ HCR_TID0 | HCR_TID2 | HCR_TPCP | HCR_TPU |
270
+ HCR_TDZ | HCR_CD | HCR_ID | HCR_MIOCNCE);
271
+ } else {
272
+ ret |= HCR_FMO | HCR_IMO | HCR_AMO;
273
+ }
274
+ ret &= ~(HCR_SWIO | HCR_PTW | HCR_VF | HCR_VI | HCR_VSE |
275
+ HCR_FB | HCR_TID1 | HCR_TID3 | HCR_TSC | HCR_TACR |
276
+ HCR_TSW | HCR_TTLB | HCR_TVM | HCR_HCD | HCR_TRVM |
277
+ HCR_TLOR);
278
+ }
44
+ }
279
+
45
+
280
+ return ret;
46
changed = env->vfp.xregs[ARM_VFP_FPSCR];
281
+}
47
env->vfp.xregs[ARM_VFP_FPSCR] = (val & 0xffc8ffff);
282
+
48
env->vfp.vec_len = (val >> 16) & 7;
283
static const ARMCPRegInfo el2_cp_reginfo[] = {
284
{ .name = "HCR_EL2", .state = ARM_CP_STATE_AA64,
285
.type = ARM_CP_IO,
286
@@ -XXX,XX +XXX,XX @@ uint32_t arm_phys_excp_target_el(CPUState *cs, uint32_t excp_idx,
287
uint32_t cur_el, bool secure)
288
{
289
CPUARMState *env = cs->env_ptr;
290
- int rw;
291
- int scr;
292
- int hcr;
293
+ bool rw;
294
+ bool scr;
295
+ bool hcr;
296
int target_el;
297
/* Is the highest EL AArch64? */
298
- int is64 = arm_feature(env, ARM_FEATURE_AARCH64);
299
+ bool is64 = arm_feature(env, ARM_FEATURE_AARCH64);
300
+ uint64_t hcr_el2;
301
302
if (arm_feature(env, ARM_FEATURE_EL3)) {
303
rw = ((env->cp15.scr_el3 & SCR_RW) == SCR_RW);
304
@@ -XXX,XX +XXX,XX @@ uint32_t arm_phys_excp_target_el(CPUState *cs, uint32_t excp_idx,
305
rw = is64;
306
}
307
308
+ hcr_el2 = arm_hcr_el2_eff(env);
309
switch (excp_idx) {
310
case EXCP_IRQ:
311
scr = ((env->cp15.scr_el3 & SCR_IRQ) == SCR_IRQ);
312
- hcr = arm_hcr_el2_imo(env);
313
+ hcr = hcr_el2 & HCR_IMO;
314
break;
315
case EXCP_FIQ:
316
scr = ((env->cp15.scr_el3 & SCR_FIQ) == SCR_FIQ);
317
- hcr = arm_hcr_el2_fmo(env);
318
+ hcr = hcr_el2 & HCR_FMO;
319
break;
320
default:
321
scr = ((env->cp15.scr_el3 & SCR_EA) == SCR_EA);
322
- hcr = arm_hcr_el2_amo(env);
323
+ hcr = hcr_el2 & HCR_AMO;
324
break;
325
};
326
327
--
49
--
328
2.19.2
50
2.18.0
329
51
330
52
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
The enable for TGE has already occurred within arm_hcr_el2_amo
3
When FZ is set, input_denormal exceptions are recognized, but this does
4
and friends. Moreover, when E2H is also set, the sense is
4
not happen with FZ16. The softfloat code has no way to distinguish
5
supposed to be reversed, which has also already occurred within
5
these bits and will raise such exceptions into fp_status_f16.flags,
6
the helpers.
6
so ignore them when computing the accumulated flags.
7
7
8
Cc: qemu-stable@nongnu.org (3.0.1)
9
Reported-by: Laurent Desnogues <laurent.desnogues@gmail.com>
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20181203203839.757-5-richard.henderson@linaro.org
11
Reviewed-by: Laurent Desnogues <laurent.desnogues@gmail.com>
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
12
Tested-by: Laurent Desnogues <laurent.desnogues@gmail.com>
13
Message-id: 20180810193129.1556-3-richard.henderson@linaro.org
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
15
---
13
target/arm/helper.c | 3 ---
16
target/arm/helper.c | 6 +++++-
14
1 file changed, 3 deletions(-)
17
1 file changed, 5 insertions(+), 1 deletion(-)
15
18
16
diff --git a/target/arm/helper.c b/target/arm/helper.c
19
diff --git a/target/arm/helper.c b/target/arm/helper.c
17
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/helper.c
21
--- a/target/arm/helper.c
19
+++ b/target/arm/helper.c
22
+++ b/target/arm/helper.c
20
@@ -XXX,XX +XXX,XX @@ uint32_t arm_phys_excp_target_el(CPUState *cs, uint32_t excp_idx,
23
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(vfp_get_fpscr)(CPUARMState *env)
21
break;
24
fpscr = (env->vfp.xregs[ARM_VFP_FPSCR] & 0xffc8ffff)
22
};
25
| (env->vfp.vec_len << 16)
23
26
| (env->vfp.vec_stride << 20);
24
- /* If HCR.TGE is set then HCR is treated as being 1 */
27
+
25
- hcr |= ((env->cp15.hcr_el2 & HCR_TGE) == HCR_TGE);
28
i = get_float_exception_flags(&env->vfp.fp_status);
26
-
29
i |= get_float_exception_flags(&env->vfp.standard_fp_status);
27
/* Perform a table-lookup for the target EL given the current state */
30
- i |= get_float_exception_flags(&env->vfp.fp_status_f16);
28
target_el = target_el_table[is64][scr][rw][hcr][secure][cur_el];
31
+ /* FZ16 does not generate an input denormal exception. */
29
32
+ i |= (get_float_exception_flags(&env->vfp.fp_status_f16)
33
+ & ~float_flag_input_denormal);
34
+
35
fpscr |= vfp_exceptbits_from_host(i);
36
return fpscr;
37
}
30
--
38
--
31
2.19.2
39
2.18.0
32
40
33
41
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Because EL3 has a fixed execution mode, we can properly decide
3
This makes float16_muladd correctly use FZ16 not FZ.
4
which of the bits are RES{0,1}.
5
4
5
Fixes: 6ceabaad110
6
Cc: qemu-stable@nongnu.org (3.0.1)
7
Reported-by: Laurent Desnogues <laurent.desnogues@gmail.com>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20181203203839.757-8-richard.henderson@linaro.org
9
Reviewed-by: Laurent Desnogues <laurent.desnogues@gmail.com>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Tested-by: Laurent Desnogues <laurent.desnogues@gmail.com>
11
Message-id: 20180810193129.1556-4-richard.henderson@linaro.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
13
---
11
target/arm/cpu.h | 2 --
14
target/arm/sve_helper.c | 2 +-
12
target/arm/helper.c | 14 +++++++++-----
15
1 file changed, 1 insertion(+), 1 deletion(-)
13
2 files changed, 9 insertions(+), 7 deletions(-)
14
16
15
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
17
diff --git a/target/arm/sve_helper.c b/target/arm/sve_helper.c
16
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/cpu.h
19
--- a/target/arm/sve_helper.c
18
+++ b/target/arm/cpu.h
20
+++ b/target/arm/sve_helper.c
19
@@ -XXX,XX +XXX,XX @@ static inline void xpsr_write(CPUARMState *env, uint32_t val, uint32_t mask)
21
@@ -XXX,XX +XXX,XX @@ static void do_fmla_zpzzz_h(CPUARMState *env, void *vg, uint32_t desc,
20
#define SCR_FIEN (1U << 21)
22
e1 = *(uint16_t *)(vn + H1_2(i)) ^ neg1;
21
#define SCR_ENSCXT (1U << 25)
23
e2 = *(uint16_t *)(vm + H1_2(i));
22
#define SCR_ATA (1U << 26)
24
e3 = *(uint16_t *)(va + H1_2(i)) ^ neg3;
23
-#define SCR_AARCH32_MASK (0x3fff & ~(SCR_RW | SCR_ST))
25
- r = float16_muladd(e1, e2, e3, 0, &env->vfp.fp_status);
24
-#define SCR_AARCH64_MASK (0x3fff & ~SCR_NET)
26
+ r = float16_muladd(e1, e2, e3, 0, &env->vfp.fp_status_f16);
25
27
*(uint16_t *)(vd + H1_2(i)) = r;
26
/* Return the current FPSCR value. */
28
}
27
uint32_t vfp_get_fpscr(CPUARMState *env);
29
} while (i & 63);
28
diff --git a/target/arm/helper.c b/target/arm/helper.c
29
index XXXXXXX..XXXXXXX 100644
30
--- a/target/arm/helper.c
31
+++ b/target/arm/helper.c
32
@@ -XXX,XX +XXX,XX @@ static void vbar_write(CPUARMState *env, const ARMCPRegInfo *ri,
33
34
static void scr_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value)
35
{
36
- /* We only mask off bits that are RES0 both for AArch64 and AArch32.
37
- * For bits that vary between AArch32/64, code needs to check the
38
- * current execution mode before directly using the feature bit.
39
- */
40
- uint32_t valid_mask = SCR_AARCH64_MASK | SCR_AARCH32_MASK;
41
+ /* Begin with base v8.0 state. */
42
+ uint32_t valid_mask = 0x3fff;
43
+
44
+ if (arm_el_is_aa64(env, 3)) {
45
+ value |= SCR_FW | SCR_AW; /* these two bits are RES1. */
46
+ valid_mask &= ~SCR_NET;
47
+ } else {
48
+ valid_mask &= ~(SCR_RW | SCR_ST);
49
+ }
50
51
if (!arm_feature(env, ARM_FEATURE_EL2)) {
52
valid_mask &= ~SCR_HCE;
53
--
30
--
54
2.19.2
31
2.18.0
55
32
56
33
diff view generated by jsdifflib
1
From: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Use DeviceClass rather than SysBusDeviceClass in
3
We were using the wrong flush-to-zero bit for the non-half input.
4
puv3_intc_class_init().
5
4
6
Cc: gxt@mprc.pku.edu.cn
5
Fixes: 46d33d1e3c9
7
6
Cc: qemu-stable@nongnu.org (3.0.1)
8
Signed-off-by: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
7
Reported-by: Laurent Desnogues <laurent.desnogues@gmail.com>
9
Signed-off-by: Zhang Shengju <zhangshengju@cmss.chinamobile.com>
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Reviewed-by: Laurent Desnogues <laurent.desnogues@gmail.com>
11
Message-id: 20181130093852.20739-11-maozhongyi@cmss.chinamobile.com
10
Tested-by: Laurent Desnogues <laurent.desnogues@gmail.com>
11
Message-id: 20180810193129.1556-5-richard.henderson@linaro.org
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
13
---
14
hw/intc/puv3_intc.c | 11 ++++-------
14
target/arm/translate-sve.c | 4 ++--
15
1 file changed, 4 insertions(+), 7 deletions(-)
15
1 file changed, 2 insertions(+), 2 deletions(-)
16
16
17
diff --git a/hw/intc/puv3_intc.c b/hw/intc/puv3_intc.c
17
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
18
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/intc/puv3_intc.c
19
--- a/target/arm/translate-sve.c
20
+++ b/hw/intc/puv3_intc.c
20
+++ b/target/arm/translate-sve.c
21
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps puv3_intc_ops = {
21
@@ -XXX,XX +XXX,XX @@ static bool do_zpz_ptr(DisasContext *s, int rd, int rn, int pg,
22
.endianness = DEVICE_NATIVE_ENDIAN,
22
23
};
23
static bool trans_FCVT_sh(DisasContext *s, arg_rpr_esz *a, uint32_t insn)
24
25
-static int puv3_intc_init(SysBusDevice *sbd)
26
+static void puv3_intc_realize(DeviceState *dev, Error **errp)
27
{
24
{
28
- DeviceState *dev = DEVICE(sbd);
25
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, true, gen_helper_sve_fcvt_sh);
29
PUV3INTCState *s = PUV3_INTC(dev);
26
+ return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_fcvt_sh);
30
+ SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
31
32
qdev_init_gpio_in(dev, puv3_intc_handler, PUV3_IRQS_NR);
33
sysbus_init_irq(sbd, &s->parent_irq);
34
@@ -XXX,XX +XXX,XX @@ static int puv3_intc_init(SysBusDevice *sbd)
35
memory_region_init_io(&s->iomem, OBJECT(s), &puv3_intc_ops, s, "puv3_intc",
36
PUV3_REGS_OFFSET);
37
sysbus_init_mmio(sbd, &s->iomem);
38
-
39
- return 0;
40
}
27
}
41
28
42
static void puv3_intc_class_init(ObjectClass *klass, void *data)
29
static bool trans_FCVT_hs(DisasContext *s, arg_rpr_esz *a, uint32_t insn)
30
@@ -XXX,XX +XXX,XX @@ static bool trans_FCVT_hs(DisasContext *s, arg_rpr_esz *a, uint32_t insn)
31
32
static bool trans_FCVT_dh(DisasContext *s, arg_rpr_esz *a, uint32_t insn)
43
{
33
{
44
- SysBusDeviceClass *sdc = SYS_BUS_DEVICE_CLASS(klass);
34
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, true, gen_helper_sve_fcvt_dh);
45
-
35
+ return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_fcvt_dh);
46
- sdc->init = puv3_intc_init;
47
+ DeviceClass *dc = DEVICE_CLASS(klass);
48
+ dc->realize = puv3_intc_realize;
49
}
36
}
50
37
51
static const TypeInfo puv3_intc_info = {
38
static bool trans_FCVT_hd(DisasContext *s, arg_rpr_esz *a, uint32_t insn)
52
--
39
--
53
2.19.2
40
2.18.0
54
41
55
42
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Provide a trivial implementation with zero limited ordering regions,
3
These insns require u=1; failed to include that in the switch
4
which causes the LDLAR and STLLR instructions to devolve into the
4
cases. This probably happened during one of the rebases just
5
LDAR and STLR instructions from the base ARMv8.0 instruction set.
5
before final commit.
6
6
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Fixes: d17b7cdcf4e
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20181210150501.7990-4-richard.henderson@linaro.org
9
Reviewed-by: Laurent Desnogues <laurent.desnogues@gmail.com>
10
Message-id: 20180810193129.1556-6-richard.henderson@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
---
12
target/arm/cpu.h | 5 +++
13
target/arm/translate-a64.c | 12 ++++++------
13
target/arm/cpu64.c | 1 +
14
1 file changed, 6 insertions(+), 6 deletions(-)
14
target/arm/helper.c | 75 ++++++++++++++++++++++++++++++++++++++
15
target/arm/translate-a64.c | 12 ++++++
16
4 files changed, 93 insertions(+)
17
15
18
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
19
index XXXXXXX..XXXXXXX 100644
20
--- a/target/arm/cpu.h
21
+++ b/target/arm/cpu.h
22
@@ -XXX,XX +XXX,XX @@ static inline bool isar_feature_aa64_sve(const ARMISARegisters *id)
23
return FIELD_EX64(id->id_aa64pfr0, ID_AA64PFR0, SVE) != 0;
24
}
25
26
+static inline bool isar_feature_aa64_lor(const ARMISARegisters *id)
27
+{
28
+ return FIELD_EX64(id->id_aa64mmfr1, ID_AA64MMFR1, LO) != 0;
29
+}
30
+
31
/*
32
* Forward to the above feature tests given an ARMCPU pointer.
33
*/
34
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
35
index XXXXXXX..XXXXXXX 100644
36
--- a/target/arm/cpu64.c
37
+++ b/target/arm/cpu64.c
38
@@ -XXX,XX +XXX,XX @@ static void aarch64_max_initfn(Object *obj)
39
40
t = cpu->isar.id_aa64mmfr1;
41
t = FIELD_DP64(t, ID_AA64MMFR1, HPDS, 1); /* HPD */
42
+ t = FIELD_DP64(t, ID_AA64MMFR1, LO, 1);
43
cpu->isar.id_aa64mmfr1 = t;
44
45
/* Replicate the same data to the 32-bit id registers. */
46
diff --git a/target/arm/helper.c b/target/arm/helper.c
47
index XXXXXXX..XXXXXXX 100644
48
--- a/target/arm/helper.c
49
+++ b/target/arm/helper.c
50
@@ -XXX,XX +XXX,XX @@ static void scr_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value)
51
{
52
/* Begin with base v8.0 state. */
53
uint32_t valid_mask = 0x3fff;
54
+ ARMCPU *cpu = arm_env_get_cpu(env);
55
56
if (arm_el_is_aa64(env, 3)) {
57
value |= SCR_FW | SCR_AW; /* these two bits are RES1. */
58
@@ -XXX,XX +XXX,XX @@ static void scr_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value)
59
valid_mask &= ~SCR_SMD;
60
}
61
}
62
+ if (cpu_isar_feature(aa64_lor, cpu)) {
63
+ valid_mask |= SCR_TLOR;
64
+ }
65
66
/* Clear all-context RES0 bits. */
67
value &= valid_mask;
68
@@ -XXX,XX +XXX,XX @@ static void hcr_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value)
69
*/
70
valid_mask &= ~HCR_TSC;
71
}
72
+ if (cpu_isar_feature(aa64_lor, cpu)) {
73
+ valid_mask |= HCR_TLOR;
74
+ }
75
76
/* Clear RES0 bits. */
77
value &= valid_mask;
78
@@ -XXX,XX +XXX,XX @@ static uint64_t id_aa64pfr0_read(CPUARMState *env, const ARMCPRegInfo *ri)
79
return pfr0;
80
}
81
82
+/* Shared logic between LORID and the rest of the LOR* registers.
83
+ * Secure state has already been delt with.
84
+ */
85
+static CPAccessResult access_lor_ns(CPUARMState *env)
86
+{
87
+ int el = arm_current_el(env);
88
+
89
+ if (el < 2 && (arm_hcr_el2_eff(env) & HCR_TLOR)) {
90
+ return CP_ACCESS_TRAP_EL2;
91
+ }
92
+ if (el < 3 && (env->cp15.scr_el3 & SCR_TLOR)) {
93
+ return CP_ACCESS_TRAP_EL3;
94
+ }
95
+ return CP_ACCESS_OK;
96
+}
97
+
98
+static CPAccessResult access_lorid(CPUARMState *env, const ARMCPRegInfo *ri,
99
+ bool isread)
100
+{
101
+ if (arm_is_secure_below_el3(env)) {
102
+ /* Access ok in secure mode. */
103
+ return CP_ACCESS_OK;
104
+ }
105
+ return access_lor_ns(env);
106
+}
107
+
108
+static CPAccessResult access_lor_other(CPUARMState *env,
109
+ const ARMCPRegInfo *ri, bool isread)
110
+{
111
+ if (arm_is_secure_below_el3(env)) {
112
+ /* Access denied in secure mode. */
113
+ return CP_ACCESS_TRAP;
114
+ }
115
+ return access_lor_ns(env);
116
+}
117
+
118
void register_cp_regs_for_features(ARMCPU *cpu)
119
{
120
/* Register all the coprocessor registers based on feature bits */
121
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
122
define_one_arm_cp_reg(cpu, &sctlr);
123
}
124
125
+ if (cpu_isar_feature(aa64_lor, cpu)) {
126
+ /*
127
+ * A trivial implementation of ARMv8.1-LOR leaves all of these
128
+ * registers fixed at 0, which indicates that there are zero
129
+ * supported Limited Ordering regions.
130
+ */
131
+ static const ARMCPRegInfo lor_reginfo[] = {
132
+ { .name = "LORSA_EL1", .state = ARM_CP_STATE_AA64,
133
+ .opc0 = 3, .opc1 = 0, .crn = 10, .crm = 4, .opc2 = 0,
134
+ .access = PL1_RW, .accessfn = access_lor_other,
135
+ .type = ARM_CP_CONST, .resetvalue = 0 },
136
+ { .name = "LOREA_EL1", .state = ARM_CP_STATE_AA64,
137
+ .opc0 = 3, .opc1 = 0, .crn = 10, .crm = 4, .opc2 = 1,
138
+ .access = PL1_RW, .accessfn = access_lor_other,
139
+ .type = ARM_CP_CONST, .resetvalue = 0 },
140
+ { .name = "LORN_EL1", .state = ARM_CP_STATE_AA64,
141
+ .opc0 = 3, .opc1 = 0, .crn = 10, .crm = 4, .opc2 = 2,
142
+ .access = PL1_RW, .accessfn = access_lor_other,
143
+ .type = ARM_CP_CONST, .resetvalue = 0 },
144
+ { .name = "LORC_EL1", .state = ARM_CP_STATE_AA64,
145
+ .opc0 = 3, .opc1 = 0, .crn = 10, .crm = 4, .opc2 = 3,
146
+ .access = PL1_RW, .accessfn = access_lor_other,
147
+ .type = ARM_CP_CONST, .resetvalue = 0 },
148
+ { .name = "LORID_EL1", .state = ARM_CP_STATE_AA64,
149
+ .opc0 = 3, .opc1 = 0, .crn = 10, .crm = 4, .opc2 = 7,
150
+ .access = PL1_R, .accessfn = access_lorid,
151
+ .type = ARM_CP_CONST, .resetvalue = 0 },
152
+ REGINFO_SENTINEL
153
+ };
154
+ define_arm_cp_regs(cpu, lor_reginfo);
155
+ }
156
+
157
if (cpu_isar_feature(aa64_sve, cpu)) {
158
define_one_arm_cp_reg(cpu, &zcr_el1_reginfo);
159
if (arm_feature(env, ARM_FEATURE_EL2)) {
160
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
16
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
161
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
162
--- a/target/arm/translate-a64.c
18
--- a/target/arm/translate-a64.c
163
+++ b/target/arm/translate-a64.c
19
+++ b/target/arm/translate-a64.c
164
@@ -XXX,XX +XXX,XX @@ static void disas_ldst_excl(DisasContext *s, uint32_t insn)
20
@@ -XXX,XX +XXX,XX @@ static void disas_simd_three_reg_same_extra(DisasContext *s, uint32_t insn)
165
}
21
}
166
return;
22
feature = ARM_FEATURE_V8_DOTPROD;
167
23
break;
168
+ case 0x8: /* STLLR */
24
- case 0x8: /* FCMLA, #0 */
169
+ if (!dc_isar_feature(aa64_lor, s)) {
25
- case 0x9: /* FCMLA, #90 */
170
+ break;
26
- case 0xa: /* FCMLA, #180 */
171
+ }
27
- case 0xb: /* FCMLA, #270 */
172
+ /* StoreLORelease is the same as Store-Release for QEMU. */
28
- case 0xc: /* FCADD, #90 */
173
+ /* fall through */
29
- case 0xe: /* FCADD, #270 */
174
case 0x9: /* STLR */
30
+ case 0x18: /* FCMLA, #0 */
175
/* Generate ISS for non-exclusive accesses including LASR. */
31
+ case 0x19: /* FCMLA, #90 */
176
if (rn == 31) {
32
+ case 0x1a: /* FCMLA, #180 */
177
@@ -XXX,XX +XXX,XX @@ static void disas_ldst_excl(DisasContext *s, uint32_t insn)
33
+ case 0x1b: /* FCMLA, #270 */
178
disas_ldst_compute_iss_sf(size, false, 0), is_lasr);
34
+ case 0x1c: /* FCADD, #90 */
179
return;
35
+ case 0x1e: /* FCADD, #270 */
180
36
if (size == 0
181
+ case 0xc: /* LDLAR */
37
|| (size == 1 && !arm_dc_feature(s, ARM_FEATURE_V8_FP16))
182
+ if (!dc_isar_feature(aa64_lor, s)) {
38
|| (size == 3 && !is_q)) {
183
+ break;
184
+ }
185
+ /* LoadLOAcquire is the same as Load-Acquire for QEMU. */
186
+ /* fall through */
187
case 0xd: /* LDAR */
188
/* Generate ISS for non-exclusive accesses including LASR. */
189
if (rn == 31) {
190
--
39
--
191
2.19.2
40
2.18.0
192
41
193
42
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Post v8.3 bits taken from SysReg_v85_xml-00bet8.
3
For 0x1.0000000000003p+0 + 0x1.ffffffep+14 = 0x1.0001fffp+15
4
we dropped the sticky bit and so failed to raise inexact.
4
5
6
Reported-by: Laurent Desnogues <laurent.desnogues@gmail.com>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-id: 20181203203839.757-3-richard.henderson@linaro.org
8
Reviewed-by: Laurent Desnogues <laurent.desnogues@gmail.com>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Tested-by: Laurent Desnogues <laurent.desnogues@gmail.com>
10
Message-id: 20180810193129.1556-7-richard.henderson@linaro.org
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
12
---
10
target/arm/cpu.h | 22 +++++++++++++++++++++-
13
fpu/softfloat.c | 2 +-
11
1 file changed, 21 insertions(+), 1 deletion(-)
14
1 file changed, 1 insertion(+), 1 deletion(-)
12
15
13
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
16
diff --git a/fpu/softfloat.c b/fpu/softfloat.c
14
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/cpu.h
18
--- a/fpu/softfloat.c
16
+++ b/target/arm/cpu.h
19
+++ b/fpu/softfloat.c
17
@@ -XXX,XX +XXX,XX @@ static inline void xpsr_write(CPUARMState *env, uint32_t val, uint32_t mask)
20
@@ -XXX,XX +XXX,XX @@ static FloatParts addsub_floats(FloatParts a, FloatParts b, bool subtract,
18
#define HCR_TIDCP (1ULL << 20)
21
}
19
#define HCR_TACR (1ULL << 21)
22
a.frac += b.frac;
20
#define HCR_TSW (1ULL << 22)
23
if (a.frac & DECOMPOSED_OVERFLOW_BIT) {
21
-#define HCR_TPC (1ULL << 23)
24
- a.frac >>= 1;
22
+#define HCR_TPCP (1ULL << 23)
25
+ shift64RightJamming(a.frac, 1, &a.frac);
23
#define HCR_TPU (1ULL << 24)
26
a.exp += 1;
24
#define HCR_TTLB (1ULL << 25)
27
}
25
#define HCR_TVM (1ULL << 26)
28
return a;
26
@@ -XXX,XX +XXX,XX @@ static inline void xpsr_write(CPUARMState *env, uint32_t val, uint32_t mask)
27
#define HCR_CD (1ULL << 32)
28
#define HCR_ID (1ULL << 33)
29
#define HCR_E2H (1ULL << 34)
30
+#define HCR_TLOR (1ULL << 35)
31
+#define HCR_TERR (1ULL << 36)
32
+#define HCR_TEA (1ULL << 37)
33
+#define HCR_MIOCNCE (1ULL << 38)
34
+#define HCR_APK (1ULL << 40)
35
+#define HCR_API (1ULL << 41)
36
+#define HCR_NV (1ULL << 42)
37
+#define HCR_NV1 (1ULL << 43)
38
+#define HCR_AT (1ULL << 44)
39
+#define HCR_NV2 (1ULL << 45)
40
+#define HCR_FWB (1ULL << 46)
41
+#define HCR_FIEN (1ULL << 47)
42
+#define HCR_TID4 (1ULL << 49)
43
+#define HCR_TICAB (1ULL << 50)
44
+#define HCR_TOCU (1ULL << 52)
45
+#define HCR_TTLBIS (1ULL << 54)
46
+#define HCR_TTLBOS (1ULL << 55)
47
+#define HCR_ATA (1ULL << 56)
48
+#define HCR_DCT (1ULL << 57)
49
+
50
/*
51
* When we actually implement ARMv8.1-VHE we should add HCR_E2H to
52
* HCR_MASK and then clear it again if the feature bit is not set in
53
--
29
--
54
2.19.2
30
2.18.0
55
31
56
32
diff view generated by jsdifflib
1
From: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
1
From: Thomas Huth <thuth@redhat.com>
2
2
3
Use DeviceClass rather than SysBusDeviceClass in
3
Now that we've got the common sysbus_init_child_obj() function, we do
4
milkymist_softusb_class_init().
4
not need the local init_sysbus_child() anymore.
5
5
6
Cc: michael@walle.cc
6
Signed-off-by: Thomas Huth <thuth@redhat.com>
7
7
Message-id: 1534420566-15799-1-git-send-email-thuth@redhat.com
8
Signed-off-by: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Zhang Shengju <zhangshengju@cmss.chinamobile.com>
10
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
11
Message-id: 20181130093852.20739-9-maozhongyi@cmss.chinamobile.com
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
10
---
14
hw/input/milkymist-softusb.c | 16 +++++++---------
11
hw/arm/mps2-tz.c | 32 +++++++++++---------------------
15
1 file changed, 7 insertions(+), 9 deletions(-)
12
1 file changed, 11 insertions(+), 21 deletions(-)
16
13
17
diff --git a/hw/input/milkymist-softusb.c b/hw/input/milkymist-softusb.c
14
diff --git a/hw/arm/mps2-tz.c b/hw/arm/mps2-tz.c
18
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/input/milkymist-softusb.c
16
--- a/hw/arm/mps2-tz.c
20
+++ b/hw/input/milkymist-softusb.c
17
+++ b/hw/arm/mps2-tz.c
21
@@ -XXX,XX +XXX,XX @@ static void milkymist_softusb_reset(DeviceState *d)
18
@@ -XXX,XX +XXX,XX @@ static void make_ram_alias(MemoryRegion *mr, const char *name,
22
s->regs[R_CTRL] = CTRL_RESET;
19
memory_region_add_subregion(get_system_memory(), base, mr);
23
}
20
}
24
21
25
-static int milkymist_softusb_init(SysBusDevice *dev)
22
-static void init_sysbus_child(Object *parent, const char *childname,
26
+static void milkymist_softusb_realize(DeviceState *dev, Error **errp)
23
- void *child, size_t childsize,
27
{
24
- const char *childtype)
28
MilkymistSoftUsbState *s = MILKYMIST_SOFTUSB(dev);
25
-{
29
+ SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
26
- object_initialize(child, childsize, childtype);
30
27
- object_property_add_child(parent, childname, OBJECT(child), &error_abort);
31
- sysbus_init_irq(dev, &s->irq);
28
- qdev_set_parent_bus(DEVICE(child), sysbus_get_default());
32
+ sysbus_init_irq(sbd, &s->irq);
33
34
memory_region_init_io(&s->regs_region, OBJECT(s), &softusb_mmio_ops, s,
35
"milkymist-softusb", R_MAX * 4);
36
- sysbus_init_mmio(dev, &s->regs_region);
37
+ sysbus_init_mmio(sbd, &s->regs_region);
38
39
/* register pmem and dmem */
40
memory_region_init_ram_nomigrate(&s->pmem, OBJECT(s), "milkymist-softusb.pmem",
41
s->pmem_size, &error_fatal);
42
vmstate_register_ram_global(&s->pmem);
43
s->pmem_ptr = memory_region_get_ram_ptr(&s->pmem);
44
- sysbus_init_mmio(dev, &s->pmem);
45
+ sysbus_init_mmio(sbd, &s->pmem);
46
memory_region_init_ram_nomigrate(&s->dmem, OBJECT(s), "milkymist-softusb.dmem",
47
s->dmem_size, &error_fatal);
48
vmstate_register_ram_global(&s->dmem);
49
s->dmem_ptr = memory_region_get_ram_ptr(&s->dmem);
50
- sysbus_init_mmio(dev, &s->dmem);
51
+ sysbus_init_mmio(sbd, &s->dmem);
52
53
hid_init(&s->hid_kbd, HID_KEYBOARD, softusb_kbd_hid_datain);
54
hid_init(&s->hid_mouse, HID_MOUSE, softusb_mouse_hid_datain);
55
-
29
-
56
- return 0;
30
-}
57
}
31
-
58
32
/* Most of the devices in the AN505 FPGA image sit behind
59
static const VMStateDescription vmstate_milkymist_softusb = {
33
* Peripheral Protection Controllers. These data structures
60
@@ -XXX,XX +XXX,XX @@ static Property milkymist_softusb_properties[] = {
34
* define the layout of which devices sit behind which PPCs.
61
static void milkymist_softusb_class_init(ObjectClass *klass, void *data)
35
@@ -XXX,XX +XXX,XX @@ static MemoryRegion *make_unimp_dev(MPS2TZMachineState *mms,
62
{
36
*/
63
DeviceClass *dc = DEVICE_CLASS(klass);
37
UnimplementedDeviceState *uds = opaque;
64
- SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
38
65
39
- init_sysbus_child(OBJECT(mms), name, uds,
66
- k->init = milkymist_softusb_init;
40
- sizeof(UnimplementedDeviceState),
67
+ dc->realize = milkymist_softusb_realize;
41
- TYPE_UNIMPLEMENTED_DEVICE);
68
dc->reset = milkymist_softusb_reset;
42
+ sysbus_init_child_obj(OBJECT(mms), name, uds,
69
dc->vmsd = &vmstate_milkymist_softusb;
43
+ sizeof(UnimplementedDeviceState),
70
dc->props = milkymist_softusb_properties;
44
+ TYPE_UNIMPLEMENTED_DEVICE);
45
qdev_prop_set_string(DEVICE(uds), "name", name);
46
qdev_prop_set_uint64(DEVICE(uds), "size", size);
47
object_property_set_bool(OBJECT(uds), true, "realized", &error_fatal);
48
@@ -XXX,XX +XXX,XX @@ static MemoryRegion *make_uart(MPS2TZMachineState *mms, void *opaque,
49
DeviceState *iotkitdev = DEVICE(&mms->iotkit);
50
DeviceState *orgate_dev = DEVICE(&mms->uart_irq_orgate);
51
52
- init_sysbus_child(OBJECT(mms), name, uart,
53
- sizeof(mms->uart[0]), TYPE_CMSDK_APB_UART);
54
+ sysbus_init_child_obj(OBJECT(mms), name, uart, sizeof(mms->uart[0]),
55
+ TYPE_CMSDK_APB_UART);
56
qdev_prop_set_chr(DEVICE(uart), "chardev", serial_hd(i));
57
qdev_prop_set_uint32(DEVICE(uart), "pclk-frq", SYSCLK_FRQ);
58
object_property_set_bool(OBJECT(uart), true, "realized", &error_fatal);
59
@@ -XXX,XX +XXX,XX @@ static MemoryRegion *make_mpc(MPS2TZMachineState *mms, void *opaque,
60
61
memory_region_init_ram(ssram, NULL, name, ramsize[i], &error_fatal);
62
63
- init_sysbus_child(OBJECT(mms), mpcname, mpc,
64
- sizeof(mms->ssram_mpc[0]), TYPE_TZ_MPC);
65
+ sysbus_init_child_obj(OBJECT(mms), mpcname, mpc, sizeof(mms->ssram_mpc[0]),
66
+ TYPE_TZ_MPC);
67
object_property_set_link(OBJECT(mpc), OBJECT(ssram),
68
"downstream", &error_fatal);
69
object_property_set_bool(OBJECT(mpc), true, "realized", &error_fatal);
70
@@ -XXX,XX +XXX,XX @@ static void mps2tz_common_init(MachineState *machine)
71
exit(1);
72
}
73
74
- init_sysbus_child(OBJECT(machine), "iotkit", &mms->iotkit,
75
- sizeof(mms->iotkit), TYPE_IOTKIT);
76
+ sysbus_init_child_obj(OBJECT(machine), "iotkit", &mms->iotkit,
77
+ sizeof(mms->iotkit), TYPE_IOTKIT);
78
iotkitdev = DEVICE(&mms->iotkit);
79
object_property_set_link(OBJECT(&mms->iotkit), OBJECT(system_memory),
80
"memory", &error_abort);
81
@@ -XXX,XX +XXX,XX @@ static void mps2tz_common_init(MachineState *machine)
82
int port;
83
char *gpioname;
84
85
- init_sysbus_child(OBJECT(machine), ppcinfo->name, ppc,
86
- sizeof(TZPPC), TYPE_TZ_PPC);
87
+ sysbus_init_child_obj(OBJECT(machine), ppcinfo->name, ppc,
88
+ sizeof(TZPPC), TYPE_TZ_PPC);
89
ppcdev = DEVICE(ppc);
90
91
for (port = 0; port < TZ_NUM_PORTS; port++) {
71
--
92
--
72
2.19.2
93
2.18.0
73
94
74
95
diff view generated by jsdifflib