1
Not very much here, but several people have fallen over
1
A grab-bag of minor stuff for the end of the year. My to-review
2
the vector operation segfault bug, so let's get the fix
2
queue is not empty, but it it at least in single figures...
3
into master.
4
3
5
thanks
6
-- PMM
4
-- PMM
7
5
8
The following changes since commit d418238dca7b4e0b124135827ead3076233052b1:
6
The following changes since commit 5bfbd8170ce7acb98a1834ff49ed7340b0837144:
9
7
10
Merge remote-tracking branch 'remotes/rth/tags/pull-rng-20190522' into staging (2019-05-23 12:57:17 +0100)
8
Merge remote-tracking branch 'remotes/vivier2/tags/trivial-branch-for-6.0-pull-request' into staging (2020-12-14 20:32:38 +0000)
11
9
12
are available in the Git repository at:
10
are available in the Git repository at:
13
11
14
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20190523
12
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20201215
15
13
16
for you to fetch changes up to 98e4f4fdb8ea05d840f51f47125924c2bb9df2df:
14
for you to fetch changes up to 23af268566069183285bebbdf95b1b37cb7c0942:
17
15
18
hw/arm/exynos4210: QOM'ify the Exynos4210 SoC (2019-05-23 14:47:44 +0100)
16
hw/block/m25p80: Fix Numonyx fast read dummy cycle count (2020-12-15 13:39:30 +0000)
19
17
20
----------------------------------------------------------------
18
----------------------------------------------------------------
21
target-arm queue:
19
target-arm queue:
22
* exynos4210: QOM'ify the Exynos4210 SoC
20
* gdbstub: Correct misparsing of vCont C/S requests
23
* exynos4210: Add DMA support for the Exynos4210
21
* openrisc: Move pic_cpu code into CPU object proper
24
* arm_gicv3: Fix writes to ICC_CTLR_EL3
22
* nios2: Move IIC code into CPU object proper
25
* arm_gicv3: Fix write of ICH_VMCR_EL2.{VBPR0, VBPR1}
23
* Improve reporting of ROM overlap errors
26
* target/arm: Fix vector operation segfault
24
* xlnx-versal: Add USB support
27
* target/arm: Minor improvements to BFXIL, EXTR
25
* hw/misc/zynq_slcr: Avoid #DIV/0! error
26
* Numonyx: Fix dummy cycles and check for SPI mode on cmds
28
27
29
----------------------------------------------------------------
28
----------------------------------------------------------------
30
Alistair Francis (1):
29
Joe Komlodi (4):
31
target/arm: Fix vector operation segfault
30
hw/block/m25p80: Make Numonyx config field names more accurate
31
hw/block/m25p80: Fix when VCFG XIP bit is set for Numonyx
32
hw/block/m25p80: Check SPI mode before running some Numonyx commands
33
hw/block/m25p80: Fix Numonyx fast read dummy cycle count
32
34
33
Guenter Roeck (1):
35
Peter Maydell (11):
34
hw/arm/exynos4210: Add DMA support for the Exynos4210
36
gdbstub: Correct misparsing of vCont C/S requests
37
hw/openrisc/openrisc_sim: Use IRQ splitter when connecting IRQ to multiple CPUs
38
hw/openrisc/openrisc_sim: Abstract out "get IRQ x of CPU y"
39
target/openrisc: Move pic_cpu code into CPU object proper
40
target/nios2: Move IIC code into CPU object proper
41
target/nios2: Move nios2_check_interrupts() into target/nios2
42
target/nios2: Use deposit32() to update ipending register
43
hw/core/loader.c: Track last-seen ROM in rom_check_and_register_reset()
44
hw/core/loader.c: Improve reporting of ROM overlap errors
45
elf_ops.h: Don't truncate name of the ROM blobs we create
46
elf_ops.h: Be more verbose with ROM blob names
35
47
36
Peter Maydell (5):
48
Philippe Mathieu-Daudé (1):
37
arm: Move system_clock_scale to armv7m_systick.h
49
hw/misc/zynq_slcr: Avoid #DIV/0! error
38
arm: Remove unnecessary includes of hw/arm/arm.h
39
arm: Rename hw/arm/arm.h to hw/arm/boot.h
40
hw/intc/arm_gicv3: Fix write of ICH_VMCR_EL2.{VBPR0, VBPR1}
41
hw/intc/arm_gicv3: Fix writes to ICC_CTLR_EL3
42
50
43
Philippe Mathieu-Daudé (3):
51
Sai Pavan Boddu (2):
44
hw/arm/exynos4: Remove unuseful debug code
52
usb: Add versal-usb2-ctrl-regs module
45
hw/arm/exynos4: Use the IEC binary prefix definitions
53
usb: xlnx-usb-subsystem: Add xilinx usb subsystem
46
hw/arm/exynos4210: QOM'ify the Exynos4210 SoC
47
54
48
Richard Henderson (2):
55
Vikram Garhwal (2):
49
target/arm: Use extract2 for EXTR
56
usb: Add DWC3 model
50
target/arm: Simplify BFXIL expansion
57
arm: xlnx-versal: Connect usb to virt-versal
51
58
52
include/hw/arm/allwinner-a10.h | 2 +-
59
include/hw/arm/xlnx-versal.h | 9 +
53
include/hw/arm/aspeed_soc.h | 1 -
60
include/hw/elf_ops.h | 5 +-
54
include/hw/arm/bcm2836.h | 1 -
61
include/hw/usb/hcd-dwc3.h | 55 +++
55
include/hw/arm/{arm.h => boot.h} | 12 +++------
62
include/hw/usb/xlnx-usb-subsystem.h | 45 ++
56
include/hw/arm/exynos4210.h | 9 +++++--
63
include/hw/usb/xlnx-versal-usb2-ctrl-regs.h | 45 ++
57
include/hw/arm/fsl-imx25.h | 2 +-
64
target/nios2/cpu.h | 3 -
58
include/hw/arm/fsl-imx31.h | 2 +-
65
target/openrisc/cpu.h | 1 -
59
include/hw/arm/fsl-imx6.h | 2 +-
66
gdbstub.c | 2 +-
60
include/hw/arm/fsl-imx6ul.h | 2 +-
67
hw/arm/xlnx-versal-virt.c | 55 +++
61
include/hw/arm/fsl-imx7.h | 2 +-
68
hw/arm/xlnx-versal.c | 26 ++
62
include/hw/arm/virt.h | 2 +-
69
hw/block/m25p80.c | 158 +++++--
63
include/hw/arm/xlnx-versal.h | 2 +-
70
hw/core/loader.c | 67 ++-
64
include/hw/arm/xlnx-zynqmp.h | 2 +-
71
hw/intc/nios2_iic.c | 95 ----
65
include/hw/timer/armv7m_systick.h | 22 ++++++++++++++++
72
hw/misc/zynq_slcr.c | 5 +
66
hw/arm/armsse.c | 2 +-
73
hw/nios2/10m50_devboard.c | 13 +-
67
hw/arm/armv7m.c | 2 +-
74
hw/nios2/cpu_pic.c | 67 ---
68
hw/arm/aspeed.c | 2 +-
75
hw/openrisc/openrisc_sim.c | 46 +-
69
hw/arm/boot.c | 2 +-
76
hw/openrisc/pic_cpu.c | 61 ---
70
hw/arm/collie.c | 2 +-
77
hw/usb/hcd-dwc3.c | 689 ++++++++++++++++++++++++++++
71
hw/arm/exynos4210.c | 54 ++++++++++++++++++++++++++++++++++++---
78
hw/usb/xlnx-usb-subsystem.c | 94 ++++
72
hw/arm/exynos4_boards.c | 40 ++++++++---------------------
79
hw/usb/xlnx-versal-usb2-ctrl-regs.c | 229 +++++++++
73
hw/arm/highbank.c | 2 +-
80
softmmu/vl.c | 1 -
74
hw/arm/integratorcp.c | 2 +-
81
target/nios2/cpu.c | 29 ++
75
hw/arm/mainstone.c | 2 +-
82
target/nios2/op_helper.c | 9 +
76
hw/arm/microbit.c | 2 +-
83
target/openrisc/cpu.c | 32 ++
77
hw/arm/mps2-tz.c | 2 +-
84
MAINTAINERS | 1 -
78
hw/arm/mps2.c | 2 +-
85
hw/intc/meson.build | 1 -
79
hw/arm/msf2-soc.c | 1 -
86
hw/nios2/meson.build | 2 +-
80
hw/arm/msf2-som.c | 2 +-
87
hw/openrisc/Kconfig | 1 +
81
hw/arm/musca.c | 2 +-
88
hw/openrisc/meson.build | 2 +-
82
hw/arm/musicpal.c | 2 +-
89
hw/usb/Kconfig | 10 +
83
hw/arm/netduino2.c | 2 +-
90
hw/usb/meson.build | 3 +
84
hw/arm/nrf51_soc.c | 2 +-
91
32 files changed, 1557 insertions(+), 304 deletions(-)
85
hw/arm/nseries.c | 2 +-
92
create mode 100644 include/hw/usb/hcd-dwc3.h
86
hw/arm/omap1.c | 2 +-
93
create mode 100644 include/hw/usb/xlnx-usb-subsystem.h
87
hw/arm/omap2.c | 2 +-
94
create mode 100644 include/hw/usb/xlnx-versal-usb2-ctrl-regs.h
88
hw/arm/omap_sx1.c | 2 +-
95
delete mode 100644 hw/intc/nios2_iic.c
89
hw/arm/palm.c | 2 +-
96
delete mode 100644 hw/nios2/cpu_pic.c
90
hw/arm/raspi.c | 2 +-
97
delete mode 100644 hw/openrisc/pic_cpu.c
91
hw/arm/realview.c | 2 +-
98
create mode 100644 hw/usb/hcd-dwc3.c
92
hw/arm/spitz.c | 2 +-
99
create mode 100644 hw/usb/xlnx-usb-subsystem.c
93
hw/arm/stellaris.c | 2 +-
100
create mode 100644 hw/usb/xlnx-versal-usb2-ctrl-regs.c
94
hw/arm/stm32f205_soc.c | 2 +-
95
hw/arm/strongarm.c | 2 +-
96
hw/arm/tosa.c | 2 +-
97
hw/arm/versatilepb.c | 2 +-
98
hw/arm/vexpress.c | 2 +-
99
hw/arm/virt.c | 2 +-
100
hw/arm/xilinx_zynq.c | 2 +-
101
hw/arm/xlnx-versal.c | 2 +-
102
hw/arm/z2.c | 2 +-
103
hw/intc/arm_gicv3_cpuif.c | 6 ++---
104
hw/intc/armv7m_nvic.c | 1 -
105
target/arm/arm-semi.c | 1 -
106
target/arm/cpu.c | 1 -
107
target/arm/cpu64.c | 1 -
108
target/arm/kvm.c | 1 -
109
target/arm/kvm32.c | 1 -
110
target/arm/kvm64.c | 1 -
111
target/arm/translate-a64.c | 44 ++++++++++++++++---------------
112
target/arm/translate.c | 4 +--
113
61 files changed, 164 insertions(+), 123 deletions(-)
114
rename include/hw/arm/{arm.h => boot.h} (96%)
115
101
diff view generated by jsdifflib
1
In ich_vmcr_write() we enforce "writes of BPR fields to less than
1
In the vCont packet, two of the command actions (C and S) take an
2
their minimum sets them to the minimum" by doing a "read vbpr and
2
argument specifying the signal to be sent to the process/thread, which is
3
write it back" operation. A typo here meant that we weren't handling
3
sent as an ASCII string of two hex digits which immediately follow the
4
writes to these fields correctly, because we were reading from VBPR0
4
'C' or 'S' character.
5
but writing to VBPR1.
6
5
6
Our code for parsing this packet accidentally skipped the first of the
7
two bytes of the signal value, because it started parsing the hex string
8
at 'p + 1' when the preceding code had already moved past the 'C' or
9
'S' with "cur_action = *p++".
10
11
This meant that we would only do the right thing for signals below
12
10, and would misinterpret the rest. For instance, when the debugger
13
wants to send the process a SIGPROF (27 on x86-64) we mangle this into
14
a SIGSEGV (11).
15
16
Remove the accidental double increment.
17
18
Fixes: https://bugs.launchpad.net/qemu/+bug/1773743
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
20
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Message-id: 20190520162809.2677-4-peter.maydell@linaro.org
21
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
22
Message-id: 20201121210342.10089-1-peter.maydell@linaro.org
10
---
23
---
11
hw/intc/arm_gicv3_cpuif.c | 2 +-
24
gdbstub.c | 2 +-
12
1 file changed, 1 insertion(+), 1 deletion(-)
25
1 file changed, 1 insertion(+), 1 deletion(-)
13
26
14
diff --git a/hw/intc/arm_gicv3_cpuif.c b/hw/intc/arm_gicv3_cpuif.c
27
diff --git a/gdbstub.c b/gdbstub.c
15
index XXXXXXX..XXXXXXX 100644
28
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/intc/arm_gicv3_cpuif.c
29
--- a/gdbstub.c
17
+++ b/hw/intc/arm_gicv3_cpuif.c
30
+++ b/gdbstub.c
18
@@ -XXX,XX +XXX,XX @@ static void ich_vmcr_write(CPUARMState *env, const ARMCPRegInfo *ri,
31
@@ -XXX,XX +XXX,XX @@ static int gdb_handle_vcont(const char *p)
19
/* Enforce "writing BPRs to less than minimum sets them to the minimum"
32
cur_action = *p++;
20
* by reading and writing back the fields.
33
if (cur_action == 'C' || cur_action == 'S') {
21
*/
34
cur_action = qemu_tolower(cur_action);
22
- write_vbpr(cs, GICV3_G1, read_vbpr(cs, GICV3_G0));
35
- res = qemu_strtoul(p + 1, &p, 16, &tmp);
23
+ write_vbpr(cs, GICV3_G0, read_vbpr(cs, GICV3_G0));
36
+ res = qemu_strtoul(p, &p, 16, &tmp);
24
write_vbpr(cs, GICV3_G1, read_vbpr(cs, GICV3_G1));
37
if (res) {
25
38
goto out;
26
gicv3_cpuif_virt_update(cs);
39
}
27
--
40
--
28
2.20.1
41
2.20.1
29
42
30
43
diff view generated by jsdifflib
New patch
1
openrisc_sim_net_init() attempts to connect the IRQ line from the
2
ethernet device to both CPUs in an SMP configuration by simply caling
3
sysbus_connect_irq() for it twice. This doesn't work, because the
4
second connection simply overrides the first.
1
5
6
Fix this by creating a TYPE_SPLIT_IRQ to split the IRQ in the SMP
7
case.
8
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Reviewed-by: Stafford Horne <shorne@gmail.com>
11
Message-id: 20201127225127.14770-2-peter.maydell@linaro.org
12
---
13
hw/openrisc/openrisc_sim.c | 13 +++++++++++--
14
hw/openrisc/Kconfig | 1 +
15
2 files changed, 12 insertions(+), 2 deletions(-)
16
17
diff --git a/hw/openrisc/openrisc_sim.c b/hw/openrisc/openrisc_sim.c
18
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/openrisc/openrisc_sim.c
20
+++ b/hw/openrisc/openrisc_sim.c
21
@@ -XXX,XX +XXX,XX @@
22
#include "hw/sysbus.h"
23
#include "sysemu/qtest.h"
24
#include "sysemu/reset.h"
25
+#include "hw/core/split-irq.h"
26
27
#define KERNEL_LOAD_ADDR 0x100
28
29
@@ -XXX,XX +XXX,XX @@ static void openrisc_sim_net_init(hwaddr base, hwaddr descriptors,
30
31
s = SYS_BUS_DEVICE(dev);
32
sysbus_realize_and_unref(s, &error_fatal);
33
- for (i = 0; i < num_cpus; i++) {
34
- sysbus_connect_irq(s, 0, cpu_irqs[i][irq_pin]);
35
+ if (num_cpus > 1) {
36
+ DeviceState *splitter = qdev_new(TYPE_SPLIT_IRQ);
37
+ qdev_prop_set_uint32(splitter, "num-lines", num_cpus);
38
+ qdev_realize_and_unref(splitter, NULL, &error_fatal);
39
+ for (i = 0; i < num_cpus; i++) {
40
+ qdev_connect_gpio_out(splitter, i, cpu_irqs[i][irq_pin]);
41
+ }
42
+ sysbus_connect_irq(s, 0, qdev_get_gpio_in(splitter, 0));
43
+ } else {
44
+ sysbus_connect_irq(s, 0, cpu_irqs[0][irq_pin]);
45
}
46
sysbus_mmio_map(s, 0, base);
47
sysbus_mmio_map(s, 1, descriptors);
48
diff --git a/hw/openrisc/Kconfig b/hw/openrisc/Kconfig
49
index XXXXXXX..XXXXXXX 100644
50
--- a/hw/openrisc/Kconfig
51
+++ b/hw/openrisc/Kconfig
52
@@ -XXX,XX +XXX,XX @@ config OR1K_SIM
53
select SERIAL
54
select OPENCORES_ETH
55
select OMPIC
56
+ select SPLIT_IRQ
57
--
58
2.20.1
59
60
diff view generated by jsdifflib
New patch
1
We're about to refactor the OpenRISC pic_cpu code in a way that means
2
that just grabbing the whole qemu_irq[] array of inbound IRQs for a
3
CPU won't be possible any more. Abstract out a function for "return
4
the qemu_irq for IRQ x input of CPU y" so we can more easily replace
5
the implementation.
1
6
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Stafford Horne <shorne@gmail.com>
9
Message-id: 20201127225127.14770-3-peter.maydell@linaro.org
10
---
11
hw/openrisc/openrisc_sim.c | 38 +++++++++++++++++++++-----------------
12
1 file changed, 21 insertions(+), 17 deletions(-)
13
14
diff --git a/hw/openrisc/openrisc_sim.c b/hw/openrisc/openrisc_sim.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/openrisc/openrisc_sim.c
17
+++ b/hw/openrisc/openrisc_sim.c
18
@@ -XXX,XX +XXX,XX @@ static void main_cpu_reset(void *opaque)
19
cpu_set_pc(cs, boot_info.bootstrap_pc);
20
}
21
22
+static qemu_irq get_cpu_irq(OpenRISCCPU *cpus[], int cpunum, int irq_pin)
23
+{
24
+ return cpus[cpunum]->env.irq[irq_pin];
25
+}
26
+
27
static void openrisc_sim_net_init(hwaddr base, hwaddr descriptors,
28
- int num_cpus, qemu_irq **cpu_irqs,
29
+ int num_cpus, OpenRISCCPU *cpus[],
30
int irq_pin, NICInfo *nd)
31
{
32
DeviceState *dev;
33
@@ -XXX,XX +XXX,XX @@ static void openrisc_sim_net_init(hwaddr base, hwaddr descriptors,
34
qdev_prop_set_uint32(splitter, "num-lines", num_cpus);
35
qdev_realize_and_unref(splitter, NULL, &error_fatal);
36
for (i = 0; i < num_cpus; i++) {
37
- qdev_connect_gpio_out(splitter, i, cpu_irqs[i][irq_pin]);
38
+ qdev_connect_gpio_out(splitter, i, get_cpu_irq(cpus, i, irq_pin));
39
}
40
sysbus_connect_irq(s, 0, qdev_get_gpio_in(splitter, 0));
41
} else {
42
- sysbus_connect_irq(s, 0, cpu_irqs[0][irq_pin]);
43
+ sysbus_connect_irq(s, 0, get_cpu_irq(cpus, 0, irq_pin));
44
}
45
sysbus_mmio_map(s, 0, base);
46
sysbus_mmio_map(s, 1, descriptors);
47
}
48
49
static void openrisc_sim_ompic_init(hwaddr base, int num_cpus,
50
- qemu_irq **cpu_irqs, int irq_pin)
51
+ OpenRISCCPU *cpus[], int irq_pin)
52
{
53
DeviceState *dev;
54
SysBusDevice *s;
55
@@ -XXX,XX +XXX,XX @@ static void openrisc_sim_ompic_init(hwaddr base, int num_cpus,
56
s = SYS_BUS_DEVICE(dev);
57
sysbus_realize_and_unref(s, &error_fatal);
58
for (i = 0; i < num_cpus; i++) {
59
- sysbus_connect_irq(s, i, cpu_irqs[i][irq_pin]);
60
+ sysbus_connect_irq(s, i, get_cpu_irq(cpus, i, irq_pin));
61
}
62
sysbus_mmio_map(s, 0, base);
63
}
64
@@ -XXX,XX +XXX,XX @@ static void openrisc_sim_init(MachineState *machine)
65
{
66
ram_addr_t ram_size = machine->ram_size;
67
const char *kernel_filename = machine->kernel_filename;
68
- OpenRISCCPU *cpu = NULL;
69
+ OpenRISCCPU *cpus[2] = {};
70
MemoryRegion *ram;
71
- qemu_irq *cpu_irqs[2];
72
qemu_irq serial_irq;
73
int n;
74
unsigned int smp_cpus = machine->smp.cpus;
75
76
assert(smp_cpus >= 1 && smp_cpus <= 2);
77
for (n = 0; n < smp_cpus; n++) {
78
- cpu = OPENRISC_CPU(cpu_create(machine->cpu_type));
79
- if (cpu == NULL) {
80
+ cpus[n] = OPENRISC_CPU(cpu_create(machine->cpu_type));
81
+ if (cpus[n] == NULL) {
82
fprintf(stderr, "Unable to find CPU definition!\n");
83
exit(1);
84
}
85
- cpu_openrisc_pic_init(cpu);
86
- cpu_irqs[n] = (qemu_irq *) cpu->env.irq;
87
+ cpu_openrisc_pic_init(cpus[n]);
88
89
- cpu_openrisc_clock_init(cpu);
90
+ cpu_openrisc_clock_init(cpus[n]);
91
92
- qemu_register_reset(main_cpu_reset, cpu);
93
+ qemu_register_reset(main_cpu_reset, cpus[n]);
94
}
95
96
ram = g_malloc(sizeof(*ram));
97
@@ -XXX,XX +XXX,XX @@ static void openrisc_sim_init(MachineState *machine)
98
99
if (nd_table[0].used) {
100
openrisc_sim_net_init(0x92000000, 0x92000400, smp_cpus,
101
- cpu_irqs, 4, nd_table);
102
+ cpus, 4, nd_table);
103
}
104
105
if (smp_cpus > 1) {
106
- openrisc_sim_ompic_init(0x98000000, smp_cpus, cpu_irqs, 1);
107
+ openrisc_sim_ompic_init(0x98000000, smp_cpus, cpus, 1);
108
109
- serial_irq = qemu_irq_split(cpu_irqs[0][2], cpu_irqs[1][2]);
110
+ serial_irq = qemu_irq_split(get_cpu_irq(cpus, 0, 2),
111
+ get_cpu_irq(cpus, 1, 2));
112
} else {
113
- serial_irq = cpu_irqs[0][2];
114
+ serial_irq = get_cpu_irq(cpus, 0, 2);
115
}
116
117
serial_mm_init(get_system_memory(), 0x90000000, 0, serial_irq,
118
--
119
2.20.1
120
121
diff view generated by jsdifflib
New patch
1
The openrisc code uses an old style of interrupt handling, where a
2
separate standalone set of qemu_irqs invoke a function
3
openrisc_pic_cpu_handler() which signals the interrupt to the CPU
4
proper by directly calling cpu_interrupt() and cpu_reset_interrupt().
5
Because CPU objects now inherit (indirectly) from TYPE_DEVICE, they
6
can have GPIO input lines themselves, and the neater modern way to
7
implement this is to simply have the CPU object itself provide the
8
input IRQ lines.
1
9
10
Create GPIO inputs to the OpenRISC CPU object, and make the only user
11
of cpu_openrisc_pic_init() wire up directly to those instead.
12
13
This allows us to delete the hw/openrisc/pic_cpu.c file entirely.
14
15
This fixes a trivial memory leak reported by Coverity of the IRQs
16
allocated in cpu_openrisc_pic_init().
17
18
Fixes: Coverity CID 1421934
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
20
Reviewed-by: Stafford Horne <shorne@gmail.com>
21
Message-id: 20201127225127.14770-4-peter.maydell@linaro.org
22
---
23
target/openrisc/cpu.h | 1 -
24
hw/openrisc/openrisc_sim.c | 3 +-
25
hw/openrisc/pic_cpu.c | 61 --------------------------------------
26
target/openrisc/cpu.c | 32 ++++++++++++++++++++
27
hw/openrisc/meson.build | 2 +-
28
5 files changed, 34 insertions(+), 65 deletions(-)
29
delete mode 100644 hw/openrisc/pic_cpu.c
30
31
diff --git a/target/openrisc/cpu.h b/target/openrisc/cpu.h
32
index XXXXXXX..XXXXXXX 100644
33
--- a/target/openrisc/cpu.h
34
+++ b/target/openrisc/cpu.h
35
@@ -XXX,XX +XXX,XX @@ typedef struct CPUOpenRISCState {
36
uint32_t picmr; /* Interrupt mask register */
37
uint32_t picsr; /* Interrupt contrl register*/
38
#endif
39
- void *irq[32]; /* Interrupt irq input */
40
} CPUOpenRISCState;
41
42
/**
43
diff --git a/hw/openrisc/openrisc_sim.c b/hw/openrisc/openrisc_sim.c
44
index XXXXXXX..XXXXXXX 100644
45
--- a/hw/openrisc/openrisc_sim.c
46
+++ b/hw/openrisc/openrisc_sim.c
47
@@ -XXX,XX +XXX,XX @@ static void main_cpu_reset(void *opaque)
48
49
static qemu_irq get_cpu_irq(OpenRISCCPU *cpus[], int cpunum, int irq_pin)
50
{
51
- return cpus[cpunum]->env.irq[irq_pin];
52
+ return qdev_get_gpio_in_named(DEVICE(cpus[cpunum]), "IRQ", irq_pin);
53
}
54
55
static void openrisc_sim_net_init(hwaddr base, hwaddr descriptors,
56
@@ -XXX,XX +XXX,XX @@ static void openrisc_sim_init(MachineState *machine)
57
fprintf(stderr, "Unable to find CPU definition!\n");
58
exit(1);
59
}
60
- cpu_openrisc_pic_init(cpus[n]);
61
62
cpu_openrisc_clock_init(cpus[n]);
63
64
diff --git a/hw/openrisc/pic_cpu.c b/hw/openrisc/pic_cpu.c
65
deleted file mode 100644
66
index XXXXXXX..XXXXXXX
67
--- a/hw/openrisc/pic_cpu.c
68
+++ /dev/null
69
@@ -XXX,XX +XXX,XX @@
70
-/*
71
- * OpenRISC Programmable Interrupt Controller support.
72
- *
73
- * Copyright (c) 2011-2012 Jia Liu <proljc@gmail.com>
74
- * Feng Gao <gf91597@gmail.com>
75
- *
76
- * This library is free software; you can redistribute it and/or
77
- * modify it under the terms of the GNU Lesser General Public
78
- * License as published by the Free Software Foundation; either
79
- * version 2.1 of the License, or (at your option) any later version.
80
- *
81
- * This library is distributed in the hope that it will be useful,
82
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
83
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
84
- * Lesser General Public License for more details.
85
- *
86
- * You should have received a copy of the GNU Lesser General Public
87
- * License along with this library; if not, see <http://www.gnu.org/licenses/>.
88
- */
89
-
90
-#include "qemu/osdep.h"
91
-#include "hw/irq.h"
92
-#include "cpu.h"
93
-
94
-/* OpenRISC pic handler */
95
-static void openrisc_pic_cpu_handler(void *opaque, int irq, int level)
96
-{
97
- OpenRISCCPU *cpu = (OpenRISCCPU *)opaque;
98
- CPUState *cs = CPU(cpu);
99
- uint32_t irq_bit;
100
-
101
- if (irq > 31 || irq < 0) {
102
- return;
103
- }
104
-
105
- irq_bit = 1U << irq;
106
-
107
- if (level) {
108
- cpu->env.picsr |= irq_bit;
109
- } else {
110
- cpu->env.picsr &= ~irq_bit;
111
- }
112
-
113
- if (cpu->env.picsr & cpu->env.picmr) {
114
- cpu_interrupt(cs, CPU_INTERRUPT_HARD);
115
- } else {
116
- cpu_reset_interrupt(cs, CPU_INTERRUPT_HARD);
117
- cpu->env.picsr = 0;
118
- }
119
-}
120
-
121
-void cpu_openrisc_pic_init(OpenRISCCPU *cpu)
122
-{
123
- int i;
124
- qemu_irq *qi;
125
- qi = qemu_allocate_irqs(openrisc_pic_cpu_handler, cpu, NR_IRQS);
126
-
127
- for (i = 0; i < NR_IRQS; i++) {
128
- cpu->env.irq[i] = qi[i];
129
- }
130
-}
131
diff --git a/target/openrisc/cpu.c b/target/openrisc/cpu.c
132
index XXXXXXX..XXXXXXX 100644
133
--- a/target/openrisc/cpu.c
134
+++ b/target/openrisc/cpu.c
135
@@ -XXX,XX +XXX,XX @@ static void openrisc_cpu_reset(DeviceState *dev)
136
#endif
137
}
138
139
+#ifndef CONFIG_USER_ONLY
140
+static void openrisc_cpu_set_irq(void *opaque, int irq, int level)
141
+{
142
+ OpenRISCCPU *cpu = (OpenRISCCPU *)opaque;
143
+ CPUState *cs = CPU(cpu);
144
+ uint32_t irq_bit;
145
+
146
+ if (irq > 31 || irq < 0) {
147
+ return;
148
+ }
149
+
150
+ irq_bit = 1U << irq;
151
+
152
+ if (level) {
153
+ cpu->env.picsr |= irq_bit;
154
+ } else {
155
+ cpu->env.picsr &= ~irq_bit;
156
+ }
157
+
158
+ if (cpu->env.picsr & cpu->env.picmr) {
159
+ cpu_interrupt(cs, CPU_INTERRUPT_HARD);
160
+ } else {
161
+ cpu_reset_interrupt(cs, CPU_INTERRUPT_HARD);
162
+ cpu->env.picsr = 0;
163
+ }
164
+}
165
+#endif
166
+
167
static void openrisc_cpu_realizefn(DeviceState *dev, Error **errp)
168
{
169
CPUState *cs = CPU(dev);
170
@@ -XXX,XX +XXX,XX @@ static void openrisc_cpu_initfn(Object *obj)
171
OpenRISCCPU *cpu = OPENRISC_CPU(obj);
172
173
cpu_set_cpustate_pointers(cpu);
174
+
175
+#ifndef CONFIG_USER_ONLY
176
+ qdev_init_gpio_in_named(DEVICE(cpu), openrisc_cpu_set_irq, "IRQ", NR_IRQS);
177
+#endif
178
}
179
180
/* CPU models */
181
diff --git a/hw/openrisc/meson.build b/hw/openrisc/meson.build
182
index XXXXXXX..XXXXXXX 100644
183
--- a/hw/openrisc/meson.build
184
+++ b/hw/openrisc/meson.build
185
@@ -XXX,XX +XXX,XX @@
186
openrisc_ss = ss.source_set()
187
-openrisc_ss.add(files('pic_cpu.c', 'cputimer.c'))
188
+openrisc_ss.add(files('cputimer.c'))
189
openrisc_ss.add(when: 'CONFIG_OR1K_SIM', if_true: files('openrisc_sim.c'))
190
191
hw_arch += {'openrisc': openrisc_ss}
192
--
193
2.20.1
194
195
diff view generated by jsdifflib
New patch
1
1
The Nios2 architecture supports two different interrupt controller
2
options:
3
4
* The IIC (Internal Interrupt Controller) is part of the CPU itself;
5
it has 32 IRQ input lines and no NMI support. Interrupt status is
6
queried and controlled via the CPU's ipending and istatus
7
registers.
8
9
* The EIC (External Interrupt Controller) interface allows the CPU
10
to connect to an external interrupt controller. The interface
11
allows the interrupt controller to present a packet of information
12
containing:
13
- handler address
14
- interrupt level
15
- register set
16
- NMI mode
17
18
QEMU does not model an EIC currently. We do model the IIC, but its
19
implementation is split across code in hw/nios2/cpu_pic.c and
20
hw/intc/nios2_iic.c. The code in those two files has no state of its
21
own -- the IIC state is in the Nios2CPU state struct.
22
23
Because CPU objects now inherit (indirectly) from TYPE_DEVICE, they
24
can have GPIO input lines themselves, so we can implement the IIC
25
directly in the CPU object the same way that real hardware does.
26
27
Create named "IRQ" GPIO inputs to the Nios2 CPU object, and make the
28
only user of the IIC wire up directly to those instead.
29
30
Note that the old code had an "NMI" concept which was entirely unused
31
and also as far as I can see not architecturally correct, since only
32
the EIC has a concept of an NMI.
33
34
This fixes a Coverity-reported trivial memory leak of the IRQ array
35
allocated in nios2_cpu_pic_init().
36
37
Fixes: Coverity CID 1421916
38
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
39
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
40
Message-id: 20201129174022.26530-2-peter.maydell@linaro.org
41
Reviewed-by: Wentong Wu <wentong.wu@intel.com>
42
Tested-by: Wentong Wu <wentong.wu@intel.com>
43
---
44
target/nios2/cpu.h | 1 -
45
hw/intc/nios2_iic.c | 95 ---------------------------------------
46
hw/nios2/10m50_devboard.c | 13 +-----
47
hw/nios2/cpu_pic.c | 31 -------------
48
target/nios2/cpu.c | 30 +++++++++++++
49
MAINTAINERS | 1 -
50
hw/intc/meson.build | 1 -
51
7 files changed, 32 insertions(+), 140 deletions(-)
52
delete mode 100644 hw/intc/nios2_iic.c
53
54
diff --git a/target/nios2/cpu.h b/target/nios2/cpu.h
55
index XXXXXXX..XXXXXXX 100644
56
--- a/target/nios2/cpu.h
57
+++ b/target/nios2/cpu.h
58
@@ -XXX,XX +XXX,XX @@ void nios2_cpu_do_unaligned_access(CPUState *cpu, vaddr addr,
59
MMUAccessType access_type,
60
int mmu_idx, uintptr_t retaddr);
61
62
-qemu_irq *nios2_cpu_pic_init(Nios2CPU *cpu);
63
void nios2_check_interrupts(CPUNios2State *env);
64
65
void do_nios2_semihosting(CPUNios2State *env);
66
diff --git a/hw/intc/nios2_iic.c b/hw/intc/nios2_iic.c
67
deleted file mode 100644
68
index XXXXXXX..XXXXXXX
69
--- a/hw/intc/nios2_iic.c
70
+++ /dev/null
71
@@ -XXX,XX +XXX,XX @@
72
-/*
73
- * QEMU Altera Internal Interrupt Controller.
74
- *
75
- * Copyright (c) 2012 Chris Wulff <crwulff@gmail.com>
76
- *
77
- * This library is free software; you can redistribute it and/or
78
- * modify it under the terms of the GNU Lesser General Public
79
- * License as published by the Free Software Foundation; either
80
- * version 2.1 of the License, or (at your option) any later version.
81
- *
82
- * This library is distributed in the hope that it will be useful,
83
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
84
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
85
- * Lesser General Public License for more details.
86
- *
87
- * You should have received a copy of the GNU Lesser General Public
88
- * License along with this library; if not, see
89
- * <http://www.gnu.org/licenses/lgpl-2.1.html>
90
- */
91
-
92
-#include "qemu/osdep.h"
93
-#include "qemu/module.h"
94
-#include "qapi/error.h"
95
-
96
-#include "hw/irq.h"
97
-#include "hw/sysbus.h"
98
-#include "cpu.h"
99
-#include "qom/object.h"
100
-
101
-#define TYPE_ALTERA_IIC "altera,iic"
102
-OBJECT_DECLARE_SIMPLE_TYPE(AlteraIIC, ALTERA_IIC)
103
-
104
-struct AlteraIIC {
105
- SysBusDevice parent_obj;
106
- void *cpu;
107
- qemu_irq parent_irq;
108
-};
109
-
110
-static void update_irq(AlteraIIC *pv)
111
-{
112
- CPUNios2State *env = &((Nios2CPU *)(pv->cpu))->env;
113
-
114
- qemu_set_irq(pv->parent_irq,
115
- env->regs[CR_IPENDING] & env->regs[CR_IENABLE]);
116
-}
117
-
118
-static void irq_handler(void *opaque, int irq, int level)
119
-{
120
- AlteraIIC *pv = opaque;
121
- CPUNios2State *env = &((Nios2CPU *)(pv->cpu))->env;
122
-
123
- env->regs[CR_IPENDING] &= ~(1 << irq);
124
- env->regs[CR_IPENDING] |= !!level << irq;
125
-
126
- update_irq(pv);
127
-}
128
-
129
-static void altera_iic_init(Object *obj)
130
-{
131
- AlteraIIC *pv = ALTERA_IIC(obj);
132
-
133
- qdev_init_gpio_in(DEVICE(pv), irq_handler, 32);
134
- sysbus_init_irq(SYS_BUS_DEVICE(obj), &pv->parent_irq);
135
-}
136
-
137
-static void altera_iic_realize(DeviceState *dev, Error **errp)
138
-{
139
- struct AlteraIIC *pv = ALTERA_IIC(dev);
140
-
141
- pv->cpu = object_property_get_link(OBJECT(dev), "cpu", &error_abort);
142
-}
143
-
144
-static void altera_iic_class_init(ObjectClass *klass, void *data)
145
-{
146
- DeviceClass *dc = DEVICE_CLASS(klass);
147
-
148
- /* Reason: needs to be wired up, e.g. by nios2_10m50_ghrd_init() */
149
- dc->user_creatable = false;
150
- dc->realize = altera_iic_realize;
151
-}
152
-
153
-static TypeInfo altera_iic_info = {
154
- .name = TYPE_ALTERA_IIC,
155
- .parent = TYPE_SYS_BUS_DEVICE,
156
- .instance_size = sizeof(AlteraIIC),
157
- .instance_init = altera_iic_init,
158
- .class_init = altera_iic_class_init,
159
-};
160
-
161
-static void altera_iic_register(void)
162
-{
163
- type_register_static(&altera_iic_info);
164
-}
165
-
166
-type_init(altera_iic_register)
167
diff --git a/hw/nios2/10m50_devboard.c b/hw/nios2/10m50_devboard.c
168
index XXXXXXX..XXXXXXX 100644
169
--- a/hw/nios2/10m50_devboard.c
170
+++ b/hw/nios2/10m50_devboard.c
171
@@ -XXX,XX +XXX,XX @@ static void nios2_10m50_ghrd_init(MachineState *machine)
172
ram_addr_t tcm_size = 0x1000; /* 1 kiB, but QEMU limit is 4 kiB */
173
ram_addr_t ram_base = 0x08000000;
174
ram_addr_t ram_size = 0x08000000;
175
- qemu_irq *cpu_irq, irq[32];
176
+ qemu_irq irq[32];
177
int i;
178
179
/* Physical TCM (tb_ram_1k) with alias at 0xc0000000 */
180
@@ -XXX,XX +XXX,XX @@ static void nios2_10m50_ghrd_init(MachineState *machine)
181
182
/* Create CPU -- FIXME */
183
cpu = NIOS2_CPU(cpu_create(TYPE_NIOS2_CPU));
184
-
185
- /* Register: CPU interrupt controller (PIC) */
186
- cpu_irq = nios2_cpu_pic_init(cpu);
187
-
188
- /* Register: Internal Interrupt Controller (IIC) */
189
- dev = qdev_new("altera,iic");
190
- object_property_add_const_link(OBJECT(dev), "cpu", OBJECT(cpu));
191
- sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
192
- sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, cpu_irq[0]);
193
for (i = 0; i < 32; i++) {
194
- irq[i] = qdev_get_gpio_in(dev, i);
195
+ irq[i] = qdev_get_gpio_in_named(DEVICE(cpu), "IRQ", i);
196
}
197
198
/* Register: Altera 16550 UART */
199
diff --git a/hw/nios2/cpu_pic.c b/hw/nios2/cpu_pic.c
200
index XXXXXXX..XXXXXXX 100644
201
--- a/hw/nios2/cpu_pic.c
202
+++ b/hw/nios2/cpu_pic.c
203
@@ -XXX,XX +XXX,XX @@
204
205
#include "boot.h"
206
207
-static void nios2_pic_cpu_handler(void *opaque, int irq, int level)
208
-{
209
- Nios2CPU *cpu = opaque;
210
- CPUNios2State *env = &cpu->env;
211
- CPUState *cs = CPU(cpu);
212
- int type = irq ? CPU_INTERRUPT_NMI : CPU_INTERRUPT_HARD;
213
-
214
- if (type == CPU_INTERRUPT_HARD) {
215
- env->irq_pending = level;
216
-
217
- if (level && (env->regs[CR_STATUS] & CR_STATUS_PIE)) {
218
- env->irq_pending = 0;
219
- cpu_interrupt(cs, type);
220
- } else if (!level) {
221
- env->irq_pending = 0;
222
- cpu_reset_interrupt(cs, type);
223
- }
224
- } else {
225
- if (level) {
226
- cpu_interrupt(cs, type);
227
- } else {
228
- cpu_reset_interrupt(cs, type);
229
- }
230
- }
231
-}
232
-
233
void nios2_check_interrupts(CPUNios2State *env)
234
{
235
if (env->irq_pending &&
236
@@ -XXX,XX +XXX,XX @@ void nios2_check_interrupts(CPUNios2State *env)
237
cpu_interrupt(env_cpu(env), CPU_INTERRUPT_HARD);
238
}
239
}
240
-
241
-qemu_irq *nios2_cpu_pic_init(Nios2CPU *cpu)
242
-{
243
- return qemu_allocate_irqs(nios2_pic_cpu_handler, cpu, 2);
244
-}
245
diff --git a/target/nios2/cpu.c b/target/nios2/cpu.c
246
index XXXXXXX..XXXXXXX 100644
247
--- a/target/nios2/cpu.c
248
+++ b/target/nios2/cpu.c
249
@@ -XXX,XX +XXX,XX @@ static void nios2_cpu_reset(DeviceState *dev)
250
#endif
251
}
252
253
+#ifndef CONFIG_USER_ONLY
254
+static void nios2_cpu_set_irq(void *opaque, int irq, int level)
255
+{
256
+ Nios2CPU *cpu = opaque;
257
+ CPUNios2State *env = &cpu->env;
258
+ CPUState *cs = CPU(cpu);
259
+
260
+ env->regs[CR_IPENDING] &= ~(1 << irq);
261
+ env->regs[CR_IPENDING] |= !!level << irq;
262
+
263
+ env->irq_pending = env->regs[CR_IPENDING] & env->regs[CR_IENABLE];
264
+
265
+ if (env->irq_pending && (env->regs[CR_STATUS] & CR_STATUS_PIE)) {
266
+ env->irq_pending = 0;
267
+ cpu_interrupt(cs, CPU_INTERRUPT_HARD);
268
+ } else if (!env->irq_pending) {
269
+ cpu_reset_interrupt(cs, CPU_INTERRUPT_HARD);
270
+ }
271
+}
272
+#endif
273
+
274
static void nios2_cpu_initfn(Object *obj)
275
{
276
Nios2CPU *cpu = NIOS2_CPU(obj);
277
@@ -XXX,XX +XXX,XX @@ static void nios2_cpu_initfn(Object *obj)
278
279
#if !defined(CONFIG_USER_ONLY)
280
mmu_init(&cpu->env);
281
+
282
+ /*
283
+ * These interrupt lines model the IIC (internal interrupt
284
+ * controller). QEMU does not currently support the EIC
285
+ * (external interrupt controller) -- if we did it would be
286
+ * a separate device in hw/intc with a custom interface to
287
+ * the CPU, and boards using it would not wire up these IRQ lines.
288
+ */
289
+ qdev_init_gpio_in_named(DEVICE(cpu), nios2_cpu_set_irq, "IRQ", 32);
290
#endif
291
}
292
293
diff --git a/MAINTAINERS b/MAINTAINERS
294
index XXXXXXX..XXXXXXX 100644
295
--- a/MAINTAINERS
296
+++ b/MAINTAINERS
297
@@ -XXX,XX +XXX,XX @@ M: Marek Vasut <marex@denx.de>
298
S: Maintained
299
F: target/nios2/
300
F: hw/nios2/
301
-F: hw/intc/nios2_iic.c
302
F: disas/nios2.c
303
F: default-configs/nios2-softmmu.mak
304
305
diff --git a/hw/intc/meson.build b/hw/intc/meson.build
306
index XXXXXXX..XXXXXXX 100644
307
--- a/hw/intc/meson.build
308
+++ b/hw/intc/meson.build
309
@@ -XXX,XX +XXX,XX @@ specific_ss.add(when: 'CONFIG_IBEX', if_true: files('ibex_plic.c'))
310
specific_ss.add(when: 'CONFIG_IOAPIC', if_true: files('ioapic.c'))
311
specific_ss.add(when: 'CONFIG_LOONGSON_LIOINTC', if_true: files('loongson_liointc.c'))
312
specific_ss.add(when: 'CONFIG_MIPS_CPS', if_true: files('mips_gic.c'))
313
-specific_ss.add(when: 'CONFIG_NIOS2', if_true: files('nios2_iic.c'))
314
specific_ss.add(when: 'CONFIG_OMAP', if_true: files('omap_intc.c'))
315
specific_ss.add(when: 'CONFIG_OMPIC', if_true: files('ompic.c'))
316
specific_ss.add(when: 'CONFIG_OPENPIC_KVM', if_true: files('openpic_kvm.c'))
317
--
318
2.20.1
319
320
diff view generated by jsdifflib
New patch
1
The function nios2_check_interrupts)() looks only at CPU-internal
2
state; it belongs in target/nios2, not hw/nios2. Move it into the
3
same file as its only caller, so it can just be local to that file.
1
4
5
This removes the only remaining code from cpu_pic.c, so we can delete
6
that file entirely.
7
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
10
Message-id: 20201129174022.26530-3-peter.maydell@linaro.org
11
Reviewed-by: Wentong Wu <wentong.wu@intel.com>
12
Tested-by: Wentong Wu <wentong.wu@intel.com>
13
---
14
target/nios2/cpu.h | 2 --
15
hw/nios2/cpu_pic.c | 36 ------------------------------------
16
target/nios2/op_helper.c | 9 +++++++++
17
hw/nios2/meson.build | 2 +-
18
4 files changed, 10 insertions(+), 39 deletions(-)
19
delete mode 100644 hw/nios2/cpu_pic.c
20
21
diff --git a/target/nios2/cpu.h b/target/nios2/cpu.h
22
index XXXXXXX..XXXXXXX 100644
23
--- a/target/nios2/cpu.h
24
+++ b/target/nios2/cpu.h
25
@@ -XXX,XX +XXX,XX @@ void nios2_cpu_do_unaligned_access(CPUState *cpu, vaddr addr,
26
MMUAccessType access_type,
27
int mmu_idx, uintptr_t retaddr);
28
29
-void nios2_check_interrupts(CPUNios2State *env);
30
-
31
void do_nios2_semihosting(CPUNios2State *env);
32
33
#define CPU_RESOLVING_TYPE TYPE_NIOS2_CPU
34
diff --git a/hw/nios2/cpu_pic.c b/hw/nios2/cpu_pic.c
35
deleted file mode 100644
36
index XXXXXXX..XXXXXXX
37
--- a/hw/nios2/cpu_pic.c
38
+++ /dev/null
39
@@ -XXX,XX +XXX,XX @@
40
-/*
41
- * Altera Nios2 CPU PIC
42
- *
43
- * Copyright (c) 2016 Marek Vasut <marek.vasut@gmail.com>
44
- *
45
- * This library is free software; you can redistribute it and/or
46
- * modify it under the terms of the GNU Lesser General Public
47
- * License as published by the Free Software Foundation; either
48
- * version 2.1 of the License, or (at your option) any later version.
49
- *
50
- * This library is distributed in the hope that it will be useful,
51
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
52
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
53
- * Lesser General Public License for more details.
54
- *
55
- * You should have received a copy of the GNU Lesser General Public
56
- * License along with this library; if not, see
57
- * <http://www.gnu.org/licenses/lgpl-2.1.html>
58
- */
59
-
60
-#include "qemu/osdep.h"
61
-#include "cpu.h"
62
-#include "hw/irq.h"
63
-
64
-#include "qemu/config-file.h"
65
-
66
-#include "boot.h"
67
-
68
-void nios2_check_interrupts(CPUNios2State *env)
69
-{
70
- if (env->irq_pending &&
71
- (env->regs[CR_STATUS] & CR_STATUS_PIE)) {
72
- env->irq_pending = 0;
73
- cpu_interrupt(env_cpu(env), CPU_INTERRUPT_HARD);
74
- }
75
-}
76
diff --git a/target/nios2/op_helper.c b/target/nios2/op_helper.c
77
index XXXXXXX..XXXXXXX 100644
78
--- a/target/nios2/op_helper.c
79
+++ b/target/nios2/op_helper.c
80
@@ -XXX,XX +XXX,XX @@ void helper_mmu_write(CPUNios2State *env, uint32_t rn, uint32_t v)
81
mmu_write(env, rn, v);
82
}
83
84
+static void nios2_check_interrupts(CPUNios2State *env)
85
+{
86
+ if (env->irq_pending &&
87
+ (env->regs[CR_STATUS] & CR_STATUS_PIE)) {
88
+ env->irq_pending = 0;
89
+ cpu_interrupt(env_cpu(env), CPU_INTERRUPT_HARD);
90
+ }
91
+}
92
+
93
void helper_check_interrupts(CPUNios2State *env)
94
{
95
qemu_mutex_lock_iothread();
96
diff --git a/hw/nios2/meson.build b/hw/nios2/meson.build
97
index XXXXXXX..XXXXXXX 100644
98
--- a/hw/nios2/meson.build
99
+++ b/hw/nios2/meson.build
100
@@ -XXX,XX +XXX,XX @@
101
nios2_ss = ss.source_set()
102
-nios2_ss.add(files('boot.c', 'cpu_pic.c'))
103
+nios2_ss.add(files('boot.c'))
104
nios2_ss.add(when: 'CONFIG_NIOS2_10M50', if_true: files('10m50_devboard.c'))
105
nios2_ss.add(when: 'CONFIG_NIOS2_GENERIC_NOMMU', if_true: files('generic_nommu.c'))
106
107
--
108
2.20.1
109
110
diff view generated by jsdifflib
New patch
1
In nios2_cpu_set_irq(), use deposit32() rather than raw shift-and-mask
2
operations to set the appropriate bit in the ipending register.
1
3
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
Message-id: 20201129174022.26530-4-peter.maydell@linaro.org
7
---
8
target/nios2/cpu.c | 3 +--
9
1 file changed, 1 insertion(+), 2 deletions(-)
10
11
diff --git a/target/nios2/cpu.c b/target/nios2/cpu.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/nios2/cpu.c
14
+++ b/target/nios2/cpu.c
15
@@ -XXX,XX +XXX,XX @@ static void nios2_cpu_set_irq(void *opaque, int irq, int level)
16
CPUNios2State *env = &cpu->env;
17
CPUState *cs = CPU(cpu);
18
19
- env->regs[CR_IPENDING] &= ~(1 << irq);
20
- env->regs[CR_IPENDING] |= !!level << irq;
21
+ env->regs[CR_IPENDING] = deposit32(env->regs[CR_IPENDING], irq, 1, !!level);
22
23
env->irq_pending = env->regs[CR_IPENDING] & env->regs[CR_IENABLE];
24
25
--
26
2.20.1
27
28
diff view generated by jsdifflib
New patch
1
In rom_check_and_register_reset() we detect overlaps by looking at
2
whether the ROM blob we're currently examining is in the same address
3
space and starts before the previous ROM blob ends. (This works
4
because the ROM list is kept sorted in order by AddressSpace and then
5
by address.)
1
6
7
Instead of keeping the AddressSpace and last address of the previous ROM
8
blob in local variables, just keep a pointer to it.
9
10
This will allow us to print more useful information when we do detect
11
an overlap.
12
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
15
Message-id: 20201129203923.10622-2-peter.maydell@linaro.org
16
---
17
hw/core/loader.c | 23 +++++++++++++++--------
18
1 file changed, 15 insertions(+), 8 deletions(-)
19
20
diff --git a/hw/core/loader.c b/hw/core/loader.c
21
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/core/loader.c
23
+++ b/hw/core/loader.c
24
@@ -XXX,XX +XXX,XX @@ static void rom_reset(void *unused)
25
}
26
}
27
28
+/* Return true if two consecutive ROMs in the ROM list overlap */
29
+static bool roms_overlap(Rom *last_rom, Rom *this_rom)
30
+{
31
+ if (!last_rom) {
32
+ return false;
33
+ }
34
+ return last_rom->as == this_rom->as &&
35
+ last_rom->addr + last_rom->romsize > this_rom->addr;
36
+}
37
+
38
int rom_check_and_register_reset(void)
39
{
40
- hwaddr addr = 0;
41
MemoryRegionSection section;
42
- Rom *rom;
43
- AddressSpace *as = NULL;
44
+ Rom *rom, *last_rom = NULL;
45
46
QTAILQ_FOREACH(rom, &roms, next) {
47
if (rom->fw_file) {
48
continue;
49
}
50
if (!rom->mr) {
51
- if ((addr > rom->addr) && (as == rom->as)) {
52
+ if (roms_overlap(last_rom, rom)) {
53
fprintf(stderr, "rom: requested regions overlap "
54
"(rom %s. free=0x" TARGET_FMT_plx
55
", addr=0x" TARGET_FMT_plx ")\n",
56
- rom->name, addr, rom->addr);
57
+ rom->name, last_rom->addr + last_rom->romsize,
58
+ rom->addr);
59
return -1;
60
}
61
- addr = rom->addr;
62
- addr += rom->romsize;
63
- as = rom->as;
64
+ last_rom = rom;
65
}
66
section = memory_region_find(rom->mr ? rom->mr : get_system_memory(),
67
rom->addr, 1);
68
--
69
2.20.1
70
71
diff view generated by jsdifflib
1
The hw/arm/arm.h header now only includes declarations relating
1
In rom_check_and_register_reset() we report to the user if there is
2
to boot.c code, so it is only needed by Arm board or SoC code.
2
a "ROM region overlap". This has a couple of problems:
3
Remove some unnecessary inclusions of it from target/arm files
3
* the reported information is not very easy to intepret
4
and from hw/intc/armv7m_nvic.c.
4
* the function just prints the overlap to stderr (and relies on
5
its single callsite in vl.c to do an error_report() and exit)
6
* only the first overlap encountered is diagnosed
7
8
Make this function use error_report() and error_printf() and
9
report a more user-friendly report with all the overlaps
10
diagnosed.
11
12
Sample old output:
13
14
rom: requested regions overlap (rom dtb. free=0x0000000000008000, addr=0x0000000000000000)
15
qemu-system-aarch64: rom check and register reset failed
16
17
Sample new output:
18
19
qemu-system-aarch64: Some ROM regions are overlapping
20
These ROM regions might have been loaded by direct user request or by default.
21
They could be BIOS/firmware images, a guest kernel, initrd or some other file loaded into guest memory.
22
Check whether you intended to load all this guest code, and whether it has been built to load to the correct addresses.
23
24
The following two regions overlap (in the cpu-memory-0 address space):
25
phdr #0: /home/petmay01/linaro/qemu-misc-tests/ldmia-fault.axf (addresses 0x0000000000000000 - 0x0000000000008000)
26
dtb (addresses 0x0000000000000000 - 0x0000000000100000)
27
28
The following two regions overlap (in the cpu-memory-0 address space):
29
phdr #1: /home/petmay01/linaro/qemu-misc-tests/bad-psci-call.axf (addresses 0x0000000040000000 - 0x0000000040000010)
30
phdr #0: /home/petmay01/linaro/qemu-misc-tests/bp-test.elf (addresses 0x0000000040000000 - 0x0000000040000020)
5
31
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
32
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
33
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
34
Message-id: 20201129203923.10622-3-peter.maydell@linaro.org
9
Message-id: 20190516163857.6430-3-peter.maydell@linaro.org
10
---
35
---
11
hw/intc/armv7m_nvic.c | 1 -
36
hw/core/loader.c | 48 ++++++++++++++++++++++++++++++++++++++++++------
12
target/arm/arm-semi.c | 1 -
37
softmmu/vl.c | 1 -
13
target/arm/cpu.c | 1 -
38
2 files changed, 42 insertions(+), 7 deletions(-)
14
target/arm/cpu64.c | 1 -
15
target/arm/kvm.c | 1 -
16
target/arm/kvm32.c | 1 -
17
target/arm/kvm64.c | 1 -
18
7 files changed, 7 deletions(-)
19
39
20
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
40
diff --git a/hw/core/loader.c b/hw/core/loader.c
21
index XXXXXXX..XXXXXXX 100644
41
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/intc/armv7m_nvic.c
42
--- a/hw/core/loader.c
23
+++ b/hw/intc/armv7m_nvic.c
43
+++ b/hw/core/loader.c
24
@@ -XXX,XX +XXX,XX @@
44
@@ -XXX,XX +XXX,XX @@ static bool roms_overlap(Rom *last_rom, Rom *this_rom)
25
#include "cpu.h"
45
last_rom->addr + last_rom->romsize > this_rom->addr;
26
#include "hw/sysbus.h"
46
}
27
#include "qemu/timer.h"
47
28
-#include "hw/arm/arm.h"
48
+static const char *rom_as_name(Rom *rom)
29
#include "hw/intc/armv7m_nvic.h"
49
+{
30
#include "target/arm/cpu.h"
50
+ const char *name = rom->as ? rom->as->name : NULL;
31
#include "exec/exec-all.h"
51
+ return name ?: "anonymous";
32
diff --git a/target/arm/arm-semi.c b/target/arm/arm-semi.c
52
+}
53
+
54
+static void rom_print_overlap_error_header(void)
55
+{
56
+ error_report("Some ROM regions are overlapping");
57
+ error_printf(
58
+ "These ROM regions might have been loaded by "
59
+ "direct user request or by default.\n"
60
+ "They could be BIOS/firmware images, a guest kernel, "
61
+ "initrd or some other file loaded into guest memory.\n"
62
+ "Check whether you intended to load all this guest code, and "
63
+ "whether it has been built to load to the correct addresses.\n");
64
+}
65
+
66
+static void rom_print_one_overlap_error(Rom *last_rom, Rom *rom)
67
+{
68
+ error_printf(
69
+ "\nThe following two regions overlap (in the %s address space):\n",
70
+ rom_as_name(rom));
71
+ error_printf(
72
+ " %s (addresses 0x" TARGET_FMT_plx " - 0x" TARGET_FMT_plx ")\n",
73
+ last_rom->name, last_rom->addr, last_rom->addr + last_rom->romsize);
74
+ error_printf(
75
+ " %s (addresses 0x" TARGET_FMT_plx " - 0x" TARGET_FMT_plx ")\n",
76
+ rom->name, rom->addr, rom->addr + rom->romsize);
77
+}
78
+
79
int rom_check_and_register_reset(void)
80
{
81
MemoryRegionSection section;
82
Rom *rom, *last_rom = NULL;
83
+ bool found_overlap = false;
84
85
QTAILQ_FOREACH(rom, &roms, next) {
86
if (rom->fw_file) {
87
@@ -XXX,XX +XXX,XX @@ int rom_check_and_register_reset(void)
88
}
89
if (!rom->mr) {
90
if (roms_overlap(last_rom, rom)) {
91
- fprintf(stderr, "rom: requested regions overlap "
92
- "(rom %s. free=0x" TARGET_FMT_plx
93
- ", addr=0x" TARGET_FMT_plx ")\n",
94
- rom->name, last_rom->addr + last_rom->romsize,
95
- rom->addr);
96
- return -1;
97
+ if (!found_overlap) {
98
+ found_overlap = true;
99
+ rom_print_overlap_error_header();
100
+ }
101
+ rom_print_one_overlap_error(last_rom, rom);
102
+ /* Keep going through the list so we report all overlaps */
103
}
104
last_rom = rom;
105
}
106
@@ -XXX,XX +XXX,XX @@ int rom_check_and_register_reset(void)
107
rom->isrom = int128_nz(section.size) && memory_region_is_rom(section.mr);
108
memory_region_unref(section.mr);
109
}
110
+ if (found_overlap) {
111
+ return -1;
112
+ }
113
+
114
qemu_register_reset(rom_reset, NULL);
115
roms_loaded = 1;
116
return 0;
117
diff --git a/softmmu/vl.c b/softmmu/vl.c
33
index XXXXXXX..XXXXXXX 100644
118
index XXXXXXX..XXXXXXX 100644
34
--- a/target/arm/arm-semi.c
119
--- a/softmmu/vl.c
35
+++ b/target/arm/arm-semi.c
120
+++ b/softmmu/vl.c
36
@@ -XXX,XX +XXX,XX @@
121
@@ -XXX,XX +XXX,XX @@ static void qemu_machine_creation_done(void)
37
#else
122
qemu_run_machine_init_done_notifiers();
38
#include "qemu-common.h"
123
39
#include "exec/gdbstub.h"
124
if (rom_check_and_register_reset() != 0) {
40
-#include "hw/arm/arm.h"
125
- error_report("rom check and register reset failed");
41
#include "qemu/cutils.h"
126
exit(1);
42
#endif
127
}
43
44
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
45
index XXXXXXX..XXXXXXX 100644
46
--- a/target/arm/cpu.c
47
+++ b/target/arm/cpu.c
48
@@ -XXX,XX +XXX,XX @@
49
#if !defined(CONFIG_USER_ONLY)
50
#include "hw/loader.h"
51
#endif
52
-#include "hw/arm/arm.h"
53
#include "sysemu/sysemu.h"
54
#include "sysemu/hw_accel.h"
55
#include "kvm_arm.h"
56
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
57
index XXXXXXX..XXXXXXX 100644
58
--- a/target/arm/cpu64.c
59
+++ b/target/arm/cpu64.c
60
@@ -XXX,XX +XXX,XX @@
61
#if !defined(CONFIG_USER_ONLY)
62
#include "hw/loader.h"
63
#endif
64
-#include "hw/arm/arm.h"
65
#include "sysemu/sysemu.h"
66
#include "sysemu/kvm.h"
67
#include "kvm_arm.h"
68
diff --git a/target/arm/kvm.c b/target/arm/kvm.c
69
index XXXXXXX..XXXXXXX 100644
70
--- a/target/arm/kvm.c
71
+++ b/target/arm/kvm.c
72
@@ -XXX,XX +XXX,XX @@
73
#include "cpu.h"
74
#include "trace.h"
75
#include "internals.h"
76
-#include "hw/arm/arm.h"
77
#include "hw/pci/pci.h"
78
#include "exec/memattrs.h"
79
#include "exec/address-spaces.h"
80
diff --git a/target/arm/kvm32.c b/target/arm/kvm32.c
81
index XXXXXXX..XXXXXXX 100644
82
--- a/target/arm/kvm32.c
83
+++ b/target/arm/kvm32.c
84
@@ -XXX,XX +XXX,XX @@
85
#include "sysemu/kvm.h"
86
#include "kvm_arm.h"
87
#include "internals.h"
88
-#include "hw/arm/arm.h"
89
#include "qemu/log.h"
90
91
static inline void set_feature(uint64_t *features, int feature)
92
diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c
93
index XXXXXXX..XXXXXXX 100644
94
--- a/target/arm/kvm64.c
95
+++ b/target/arm/kvm64.c
96
@@ -XXX,XX +XXX,XX @@
97
#include "sysemu/kvm.h"
98
#include "kvm_arm.h"
99
#include "internals.h"
100
-#include "hw/arm/arm.h"
101
102
static bool have_guest_debug;
103
128
104
--
129
--
105
2.20.1
130
2.20.1
106
131
107
132
diff view generated by jsdifflib
1
The ICC_CTLR_EL3 register includes some bits which are aliases
1
Currently the load_elf code assembles the ROM blob name into a
2
of bits in the ICC_CTLR_EL1(S) and (NS) registers. QEMU chooses
2
local 128 byte fixed-size array. Use g_strdup_printf() instead so
3
to keep those bits in the cs->icc_ctlr_el1[] struct fields.
3
that we don't truncate the pathname if it happens to be long.
4
Unfortunately a missing '~' in the code to update the bits
4
(This matters mostly for monitor 'info roms' output and for the
5
in those fields meant that writing to ICC_CTLR_EL3 would corrupt
5
error messages if ROM blobs overlap.)
6
the ICC_CLTR_EL1 register values.
7
6
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Message-id: 20190520162809.2677-5-peter.maydell@linaro.org
9
Message-id: 20201129203923.10622-4-peter.maydell@linaro.org
11
---
10
---
12
hw/intc/arm_gicv3_cpuif.c | 4 ++--
11
include/hw/elf_ops.h | 4 ++--
13
1 file changed, 2 insertions(+), 2 deletions(-)
12
1 file changed, 2 insertions(+), 2 deletions(-)
14
13
15
diff --git a/hw/intc/arm_gicv3_cpuif.c b/hw/intc/arm_gicv3_cpuif.c
14
diff --git a/include/hw/elf_ops.h b/include/hw/elf_ops.h
16
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/intc/arm_gicv3_cpuif.c
16
--- a/include/hw/elf_ops.h
18
+++ b/hw/intc/arm_gicv3_cpuif.c
17
+++ b/include/hw/elf_ops.h
19
@@ -XXX,XX +XXX,XX @@ static void icc_ctlr_el3_write(CPUARMState *env, const ARMCPRegInfo *ri,
18
@@ -XXX,XX +XXX,XX @@ static int glue(load_elf, SZ)(const char *name, int fd,
20
trace_gicv3_icc_ctlr_el3_write(gicv3_redist_affid(cs), value);
19
uint64_t addr, low = (uint64_t)-1, high = 0;
21
20
GMappedFile *mapped_file = NULL;
22
/* *_EL1NS and *_EL1S bits are aliases into the ICC_CTLR_EL1 bits. */
21
uint8_t *data = NULL;
23
- cs->icc_ctlr_el1[GICV3_NS] &= (ICC_CTLR_EL1_CBPR | ICC_CTLR_EL1_EOIMODE);
22
- char label[128];
24
+ cs->icc_ctlr_el1[GICV3_NS] &= ~(ICC_CTLR_EL1_CBPR | ICC_CTLR_EL1_EOIMODE);
23
int ret = ELF_LOAD_FAILED;
25
if (value & ICC_CTLR_EL3_EOIMODE_EL1NS) {
24
26
cs->icc_ctlr_el1[GICV3_NS] |= ICC_CTLR_EL1_EOIMODE;
25
if (read(fd, &ehdr, sizeof(ehdr)) != sizeof(ehdr))
27
}
26
@@ -XXX,XX +XXX,XX @@ static int glue(load_elf, SZ)(const char *name, int fd,
28
@@ -XXX,XX +XXX,XX @@ static void icc_ctlr_el3_write(CPUARMState *env, const ARMCPRegInfo *ri,
27
*/
29
cs->icc_ctlr_el1[GICV3_NS] |= ICC_CTLR_EL1_CBPR;
28
if (mem_size != 0) {
30
}
29
if (load_rom) {
31
30
- snprintf(label, sizeof(label), "phdr #%d: %s", i, name);
32
- cs->icc_ctlr_el1[GICV3_S] &= (ICC_CTLR_EL1_CBPR | ICC_CTLR_EL1_EOIMODE);
31
+ g_autofree char *label =
33
+ cs->icc_ctlr_el1[GICV3_S] &= ~(ICC_CTLR_EL1_CBPR | ICC_CTLR_EL1_EOIMODE);
32
+ g_strdup_printf("phdr #%d: %s", i, name);
34
if (value & ICC_CTLR_EL3_EOIMODE_EL1S) {
33
35
cs->icc_ctlr_el1[GICV3_S] |= ICC_CTLR_EL1_EOIMODE;
34
/*
36
}
35
* rom_add_elf_program() takes its own reference to
37
--
36
--
38
2.20.1
37
2.20.1
39
38
40
39
diff view generated by jsdifflib
1
The system_clock_scale global is used only by the armv7m systick
1
Instead of making the ROM blob name something like:
2
device; move the extern declaration to the armv7m_systick.h header,
2
phdr #0: /home/petmay01/linaro/qemu-misc-tests/ldmia-fault.axf
3
and expand the comment to explain what it is and that it should
3
make it a little more self-explanatory for people who don't know
4
ideally be replaced with a different approach.
4
ELF format details:
5
/home/petmay01/linaro/qemu-misc-tests/ldmia-fault.axf ELF program header segment 0
5
6
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Message-id: 20201129203923.10622-5-peter.maydell@linaro.org
9
Message-id: 20190516163857.6430-2-peter.maydell@linaro.org
10
---
10
---
11
include/hw/arm/arm.h | 4 ----
11
include/hw/elf_ops.h | 3 ++-
12
include/hw/timer/armv7m_systick.h | 22 ++++++++++++++++++++++
12
1 file changed, 2 insertions(+), 1 deletion(-)
13
2 files changed, 22 insertions(+), 4 deletions(-)
14
13
15
diff --git a/include/hw/arm/arm.h b/include/hw/arm/arm.h
14
diff --git a/include/hw/elf_ops.h b/include/hw/elf_ops.h
16
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
17
--- a/include/hw/arm/arm.h
16
--- a/include/hw/elf_ops.h
18
+++ b/include/hw/arm/arm.h
17
+++ b/include/hw/elf_ops.h
19
@@ -XXX,XX +XXX,XX @@ void arm_write_secure_board_setup_dummy_smc(ARMCPU *cpu,
18
@@ -XXX,XX +XXX,XX @@ static int glue(load_elf, SZ)(const char *name, int fd,
20
const struct arm_boot_info *info,
19
if (mem_size != 0) {
21
hwaddr mvbar_addr);
20
if (load_rom) {
22
21
g_autofree char *label =
23
-/* Multiplication factor to convert from system clock ticks to qemu timer
22
- g_strdup_printf("phdr #%d: %s", i, name);
24
- ticks. */
23
+ g_strdup_printf("%s ELF program header segment %d",
25
-extern int system_clock_scale;
24
+ name, i);
26
-
25
27
#endif /* HW_ARM_H */
26
/*
28
diff --git a/include/hw/timer/armv7m_systick.h b/include/hw/timer/armv7m_systick.h
27
* rom_add_elf_program() takes its own reference to
29
index XXXXXXX..XXXXXXX 100644
30
--- a/include/hw/timer/armv7m_systick.h
31
+++ b/include/hw/timer/armv7m_systick.h
32
@@ -XXX,XX +XXX,XX @@ typedef struct SysTickState {
33
qemu_irq irq;
34
} SysTickState;
35
36
+/*
37
+ * Multiplication factor to convert from system clock ticks to qemu timer
38
+ * ticks. This should be set (by board code, usually) to a value
39
+ * equal to NANOSECONDS_PER_SECOND / frq, where frq is the clock frequency
40
+ * in Hz of the CPU.
41
+ *
42
+ * This value is used by the systick device when it is running in
43
+ * its "use the CPU clock" mode (ie when SYST_CSR.CLKSOURCE == 1) to
44
+ * set how fast the timer should tick.
45
+ *
46
+ * TODO: we should refactor this so that rather than using a global
47
+ * we use a device property or something similar. This is complicated
48
+ * because (a) the property would need to be plumbed through from the
49
+ * board code down through various layers to the systick device
50
+ * and (b) the property needs to be modifiable after realize, because
51
+ * the stellaris board uses this to implement the behaviour where the
52
+ * guest can reprogram the PLL registers to downclock the CPU, and the
53
+ * systick device needs to react accordingly. Possibly this should
54
+ * be deferred until we have a good API for modelling clock trees.
55
+ */
56
+extern int system_clock_scale;
57
+
58
#endif
59
--
28
--
60
2.20.1
29
2.20.1
61
30
62
31
diff view generated by jsdifflib
New patch
1
1
From: Sai Pavan Boddu <sai.pavan.boddu@xilinx.com>
2
3
This module emulates control registers of versal usb2 controller, this is added
4
just to make guest happy. In general this module would control the phy-reset
5
signal from usb controller, data coherency of the transactions, signals
6
the host system errors received from controller.
7
8
Signed-off-by: Sai Pavan Boddu <sai.pavan.boddu@xilinx.com>
9
Signed-off-by: Vikram Garhwal <fnu.vikram@xilinx.com>
10
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
11
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
12
Message-id: 1607023357-5096-2-git-send-email-sai.pavan.boddu@xilinx.com
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
15
include/hw/usb/xlnx-versal-usb2-ctrl-regs.h | 45 ++++
16
hw/usb/xlnx-versal-usb2-ctrl-regs.c | 229 ++++++++++++++++++++
17
hw/usb/meson.build | 1 +
18
3 files changed, 275 insertions(+)
19
create mode 100644 include/hw/usb/xlnx-versal-usb2-ctrl-regs.h
20
create mode 100644 hw/usb/xlnx-versal-usb2-ctrl-regs.c
21
22
diff --git a/include/hw/usb/xlnx-versal-usb2-ctrl-regs.h b/include/hw/usb/xlnx-versal-usb2-ctrl-regs.h
23
new file mode 100644
24
index XXXXXXX..XXXXXXX
25
--- /dev/null
26
+++ b/include/hw/usb/xlnx-versal-usb2-ctrl-regs.h
27
@@ -XXX,XX +XXX,XX @@
28
+/*
29
+ * QEMU model of the VersalUsb2CtrlRegs Register control/Status block for
30
+ * USB2.0 controller
31
+ *
32
+ * Copyright (c) 2020 Xilinx Inc. Vikram Garhwal <fnu.vikram@xilinx.com>
33
+ *
34
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
35
+ * of this software and associated documentation files (the "Software"), to deal
36
+ * in the Software without restriction, including without limitation the rights
37
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
38
+ * copies of the Software, and to permit persons to whom the Software is
39
+ * furnished to do so, subject to the following conditions:
40
+ *
41
+ * The above copyright notice and this permission notice shall be included in
42
+ * all copies or substantial portions of the Software.
43
+ *
44
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
45
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
46
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
47
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
48
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
49
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
50
+ * THE SOFTWARE.
51
+ */
52
+
53
+#ifndef _XLNX_USB2_REGS_H_
54
+#define _XLNX_USB2_REGS_H_
55
+
56
+#define TYPE_XILINX_VERSAL_USB2_CTRL_REGS "xlnx.versal-usb2-ctrl-regs"
57
+
58
+#define XILINX_VERSAL_USB2_CTRL_REGS(obj) \
59
+ OBJECT_CHECK(VersalUsb2CtrlRegs, (obj), TYPE_XILINX_VERSAL_USB2_CTRL_REGS)
60
+
61
+#define USB2_REGS_R_MAX ((0x78 / 4) + 1)
62
+
63
+typedef struct VersalUsb2CtrlRegs {
64
+ SysBusDevice parent_obj;
65
+ MemoryRegion iomem;
66
+ qemu_irq irq_ir;
67
+
68
+ uint32_t regs[USB2_REGS_R_MAX];
69
+ RegisterInfo regs_info[USB2_REGS_R_MAX];
70
+} VersalUsb2CtrlRegs;
71
+
72
+#endif
73
diff --git a/hw/usb/xlnx-versal-usb2-ctrl-regs.c b/hw/usb/xlnx-versal-usb2-ctrl-regs.c
74
new file mode 100644
75
index XXXXXXX..XXXXXXX
76
--- /dev/null
77
+++ b/hw/usb/xlnx-versal-usb2-ctrl-regs.c
78
@@ -XXX,XX +XXX,XX @@
79
+/*
80
+ * QEMU model of the VersalUsb2CtrlRegs Register control/Status block for
81
+ * USB2.0 controller
82
+ *
83
+ * This module should control phy_reset, permanent device plugs, frame length
84
+ * time adjust & setting of coherency paths. None of which are emulated in
85
+ * present model.
86
+ *
87
+ * Copyright (c) 2020 Xilinx Inc. Vikram Garhwal <fnu.vikram@xilinx.com>
88
+ *
89
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
90
+ * of this software and associated documentation files (the "Software"), to deal
91
+ * in the Software without restriction, including without limitation the rights
92
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
93
+ * copies of the Software, and to permit persons to whom the Software is
94
+ * furnished to do so, subject to the following conditions:
95
+ *
96
+ * The above copyright notice and this permission notice shall be included in
97
+ * all copies or substantial portions of the Software.
98
+ *
99
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
100
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
101
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
102
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
103
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
104
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
105
+ * THE SOFTWARE.
106
+ */
107
+
108
+#include "qemu/osdep.h"
109
+#include "hw/sysbus.h"
110
+#include "hw/irq.h"
111
+#include "hw/register.h"
112
+#include "qemu/bitops.h"
113
+#include "qemu/log.h"
114
+#include "qom/object.h"
115
+#include "migration/vmstate.h"
116
+#include "hw/usb/xlnx-versal-usb2-ctrl-regs.h"
117
+
118
+#ifndef XILINX_VERSAL_USB2_CTRL_REGS_ERR_DEBUG
119
+#define XILINX_VERSAL_USB2_CTRL_REGS_ERR_DEBUG 0
120
+#endif
121
+
122
+REG32(BUS_FILTER, 0x30)
123
+ FIELD(BUS_FILTER, BYPASS, 0, 4)
124
+REG32(PORT, 0x34)
125
+ FIELD(PORT, HOST_SMI_BAR_WR, 4, 1)
126
+ FIELD(PORT, HOST_SMI_PCI_CMD_REG_WR, 3, 1)
127
+ FIELD(PORT, HOST_MSI_ENABLE, 2, 1)
128
+ FIELD(PORT, PWR_CTRL_PRSNT, 1, 1)
129
+ FIELD(PORT, HUB_PERM_ATTACH, 0, 1)
130
+REG32(JITTER_ADJUST, 0x38)
131
+ FIELD(JITTER_ADJUST, FLADJ, 0, 6)
132
+REG32(BIGENDIAN, 0x40)
133
+ FIELD(BIGENDIAN, ENDIAN_GS, 0, 1)
134
+REG32(COHERENCY, 0x44)
135
+ FIELD(COHERENCY, USB_COHERENCY, 0, 1)
136
+REG32(XHC_BME, 0x48)
137
+ FIELD(XHC_BME, XHC_BME, 0, 1)
138
+REG32(REG_CTRL, 0x60)
139
+ FIELD(REG_CTRL, SLVERR_ENABLE, 0, 1)
140
+REG32(IR_STATUS, 0x64)
141
+ FIELD(IR_STATUS, HOST_SYS_ERR, 1, 1)
142
+ FIELD(IR_STATUS, ADDR_DEC_ERR, 0, 1)
143
+REG32(IR_MASK, 0x68)
144
+ FIELD(IR_MASK, HOST_SYS_ERR, 1, 1)
145
+ FIELD(IR_MASK, ADDR_DEC_ERR, 0, 1)
146
+REG32(IR_ENABLE, 0x6c)
147
+ FIELD(IR_ENABLE, HOST_SYS_ERR, 1, 1)
148
+ FIELD(IR_ENABLE, ADDR_DEC_ERR, 0, 1)
149
+REG32(IR_DISABLE, 0x70)
150
+ FIELD(IR_DISABLE, HOST_SYS_ERR, 1, 1)
151
+ FIELD(IR_DISABLE, ADDR_DEC_ERR, 0, 1)
152
+REG32(USB3, 0x78)
153
+
154
+static void ir_update_irq(VersalUsb2CtrlRegs *s)
155
+{
156
+ bool pending = s->regs[R_IR_STATUS] & ~s->regs[R_IR_MASK];
157
+ qemu_set_irq(s->irq_ir, pending);
158
+}
159
+
160
+static void ir_status_postw(RegisterInfo *reg, uint64_t val64)
161
+{
162
+ VersalUsb2CtrlRegs *s = XILINX_VERSAL_USB2_CTRL_REGS(reg->opaque);
163
+ /*
164
+ * TODO: This should also clear USBSTS.HSE field in USB XHCI register.
165
+ * May be combine both the modules.
166
+ */
167
+ ir_update_irq(s);
168
+}
169
+
170
+static uint64_t ir_enable_prew(RegisterInfo *reg, uint64_t val64)
171
+{
172
+ VersalUsb2CtrlRegs *s = XILINX_VERSAL_USB2_CTRL_REGS(reg->opaque);
173
+ uint32_t val = val64;
174
+
175
+ s->regs[R_IR_MASK] &= ~val;
176
+ ir_update_irq(s);
177
+ return 0;
178
+}
179
+
180
+static uint64_t ir_disable_prew(RegisterInfo *reg, uint64_t val64)
181
+{
182
+ VersalUsb2CtrlRegs *s = XILINX_VERSAL_USB2_CTRL_REGS(reg->opaque);
183
+ uint32_t val = val64;
184
+
185
+ s->regs[R_IR_MASK] |= val;
186
+ ir_update_irq(s);
187
+ return 0;
188
+}
189
+
190
+static const RegisterAccessInfo usb2_ctrl_regs_regs_info[] = {
191
+ { .name = "BUS_FILTER", .addr = A_BUS_FILTER,
192
+ .rsvd = 0xfffffff0,
193
+ },{ .name = "PORT", .addr = A_PORT,
194
+ .rsvd = 0xffffffe0,
195
+ },{ .name = "JITTER_ADJUST", .addr = A_JITTER_ADJUST,
196
+ .reset = 0x20,
197
+ .rsvd = 0xffffffc0,
198
+ },{ .name = "BIGENDIAN", .addr = A_BIGENDIAN,
199
+ .rsvd = 0xfffffffe,
200
+ },{ .name = "COHERENCY", .addr = A_COHERENCY,
201
+ .rsvd = 0xfffffffe,
202
+ },{ .name = "XHC_BME", .addr = A_XHC_BME,
203
+ .reset = 0x1,
204
+ .rsvd = 0xfffffffe,
205
+ },{ .name = "REG_CTRL", .addr = A_REG_CTRL,
206
+ .rsvd = 0xfffffffe,
207
+ },{ .name = "IR_STATUS", .addr = A_IR_STATUS,
208
+ .rsvd = 0xfffffffc,
209
+ .w1c = 0x3,
210
+ .post_write = ir_status_postw,
211
+ },{ .name = "IR_MASK", .addr = A_IR_MASK,
212
+ .reset = 0x3,
213
+ .rsvd = 0xfffffffc,
214
+ .ro = 0x3,
215
+ },{ .name = "IR_ENABLE", .addr = A_IR_ENABLE,
216
+ .rsvd = 0xfffffffc,
217
+ .pre_write = ir_enable_prew,
218
+ },{ .name = "IR_DISABLE", .addr = A_IR_DISABLE,
219
+ .rsvd = 0xfffffffc,
220
+ .pre_write = ir_disable_prew,
221
+ },{ .name = "USB3", .addr = A_USB3,
222
+ }
223
+};
224
+
225
+static void usb2_ctrl_regs_reset_init(Object *obj, ResetType type)
226
+{
227
+ VersalUsb2CtrlRegs *s = XILINX_VERSAL_USB2_CTRL_REGS(obj);
228
+ unsigned int i;
229
+
230
+ for (i = 0; i < ARRAY_SIZE(s->regs_info); ++i) {
231
+ register_reset(&s->regs_info[i]);
232
+ }
233
+}
234
+
235
+static void usb2_ctrl_regs_reset_hold(Object *obj)
236
+{
237
+ VersalUsb2CtrlRegs *s = XILINX_VERSAL_USB2_CTRL_REGS(obj);
238
+
239
+ ir_update_irq(s);
240
+}
241
+
242
+static const MemoryRegionOps usb2_ctrl_regs_ops = {
243
+ .read = register_read_memory,
244
+ .write = register_write_memory,
245
+ .endianness = DEVICE_LITTLE_ENDIAN,
246
+ .valid = {
247
+ .min_access_size = 4,
248
+ .max_access_size = 4,
249
+ },
250
+};
251
+
252
+static void usb2_ctrl_regs_init(Object *obj)
253
+{
254
+ VersalUsb2CtrlRegs *s = XILINX_VERSAL_USB2_CTRL_REGS(obj);
255
+ SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
256
+ RegisterInfoArray *reg_array;
257
+
258
+ memory_region_init(&s->iomem, obj, TYPE_XILINX_VERSAL_USB2_CTRL_REGS,
259
+ USB2_REGS_R_MAX * 4);
260
+ reg_array =
261
+ register_init_block32(DEVICE(obj), usb2_ctrl_regs_regs_info,
262
+ ARRAY_SIZE(usb2_ctrl_regs_regs_info),
263
+ s->regs_info, s->regs,
264
+ &usb2_ctrl_regs_ops,
265
+ XILINX_VERSAL_USB2_CTRL_REGS_ERR_DEBUG,
266
+ USB2_REGS_R_MAX * 4);
267
+ memory_region_add_subregion(&s->iomem,
268
+ 0x0,
269
+ &reg_array->mem);
270
+ sysbus_init_mmio(sbd, &s->iomem);
271
+ sysbus_init_irq(sbd, &s->irq_ir);
272
+}
273
+
274
+static const VMStateDescription vmstate_usb2_ctrl_regs = {
275
+ .name = TYPE_XILINX_VERSAL_USB2_CTRL_REGS,
276
+ .version_id = 1,
277
+ .minimum_version_id = 1,
278
+ .fields = (VMStateField[]) {
279
+ VMSTATE_UINT32_ARRAY(regs, VersalUsb2CtrlRegs, USB2_REGS_R_MAX),
280
+ VMSTATE_END_OF_LIST(),
281
+ }
282
+};
283
+
284
+static void usb2_ctrl_regs_class_init(ObjectClass *klass, void *data)
285
+{
286
+ DeviceClass *dc = DEVICE_CLASS(klass);
287
+ ResettableClass *rc = RESETTABLE_CLASS(klass);
288
+
289
+ rc->phases.enter = usb2_ctrl_regs_reset_init;
290
+ rc->phases.hold = usb2_ctrl_regs_reset_hold;
291
+ dc->vmsd = &vmstate_usb2_ctrl_regs;
292
+}
293
+
294
+static const TypeInfo usb2_ctrl_regs_info = {
295
+ .name = TYPE_XILINX_VERSAL_USB2_CTRL_REGS,
296
+ .parent = TYPE_SYS_BUS_DEVICE,
297
+ .instance_size = sizeof(VersalUsb2CtrlRegs),
298
+ .class_init = usb2_ctrl_regs_class_init,
299
+ .instance_init = usb2_ctrl_regs_init,
300
+};
301
+
302
+static void usb2_ctrl_regs_register_types(void)
303
+{
304
+ type_register_static(&usb2_ctrl_regs_info);
305
+}
306
+
307
+type_init(usb2_ctrl_regs_register_types)
308
diff --git a/hw/usb/meson.build b/hw/usb/meson.build
309
index XXXXXXX..XXXXXXX 100644
310
--- a/hw/usb/meson.build
311
+++ b/hw/usb/meson.build
312
@@ -XXX,XX +XXX,XX @@ softmmu_ss.add(when: 'CONFIG_USB_DWC2', if_true: files('hcd-dwc2.c'))
313
softmmu_ss.add(when: 'CONFIG_TUSB6010', if_true: files('tusb6010.c'))
314
softmmu_ss.add(when: 'CONFIG_IMX', if_true: files('chipidea.c'))
315
softmmu_ss.add(when: 'CONFIG_IMX_USBPHY', if_true: files('imx-usb-phy.c'))
316
+specific_ss.add(when: 'CONFIG_XLNX_VERSAL', if_true: files('xlnx-versal-usb2-ctrl-regs.c'))
317
318
# emulated usb devices
319
softmmu_ss.add(when: 'CONFIG_USB', if_true: files('dev-hub.c'))
320
--
321
2.20.1
322
323
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
1
From: Vikram Garhwal <fnu.vikram@xilinx.com>
2
2
3
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
3
This patch adds skeleton model of dwc3 usb controller attached to
4
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
4
xhci-sysbus device. It defines global register space of DWC3 controller,
5
Message-id: 20190520214342.13709-5-philmd@redhat.com
5
global registers control the AXI/AHB interfaces properties, external FIFO
6
support and event count support. All of which are unimplemented at
7
present,we are only supporting core reset and read of ID register.
8
9
Signed-off-by: Vikram Garhwal <fnu.vikram@xilinx.com>
10
Signed-off-by: Sai Pavan Boddu <sai.pavan.boddu@xilinx.com>
11
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
12
Message-id: 1607023357-5096-3-git-send-email-sai.pavan.boddu@xilinx.com
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
14
---
8
include/hw/arm/exynos4210.h | 9 +++++++--
15
include/hw/usb/hcd-dwc3.h | 55 +++
9
hw/arm/exynos4210.c | 28 ++++++++++++++++++++++++----
16
hw/usb/hcd-dwc3.c | 689 ++++++++++++++++++++++++++++++++++++++
10
hw/arm/exynos4_boards.c | 9 ++++++---
17
hw/usb/Kconfig | 5 +
11
3 files changed, 37 insertions(+), 9 deletions(-)
18
hw/usb/meson.build | 1 +
19
4 files changed, 750 insertions(+)
20
create mode 100644 include/hw/usb/hcd-dwc3.h
21
create mode 100644 hw/usb/hcd-dwc3.c
12
22
13
diff --git a/include/hw/arm/exynos4210.h b/include/hw/arm/exynos4210.h
23
diff --git a/include/hw/usb/hcd-dwc3.h b/include/hw/usb/hcd-dwc3.h
14
index XXXXXXX..XXXXXXX 100644
24
new file mode 100644
15
--- a/include/hw/arm/exynos4210.h
25
index XXXXXXX..XXXXXXX
16
+++ b/include/hw/arm/exynos4210.h
26
--- /dev/null
17
@@ -XXX,XX +XXX,XX @@ typedef struct Exynos4210Irq {
27
+++ b/include/hw/usb/hcd-dwc3.h
18
} Exynos4210Irq;
28
@@ -XXX,XX +XXX,XX @@
19
29
+/*
20
typedef struct Exynos4210State {
30
+ * QEMU model of the USB DWC3 host controller emulation.
21
+ /*< private >*/
31
+ *
32
+ * Copyright (c) 2020 Xilinx Inc.
33
+ *
34
+ * Written by Vikram Garhwal<fnu.vikram@xilinx.com>
35
+ *
36
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
37
+ * of this software and associated documentation files (the "Software"), to deal
38
+ * in the Software without restriction, including without limitation the rights
39
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
40
+ * copies of the Software, and to permit persons to whom the Software is
41
+ * furnished to do so, subject to the following conditions:
42
+ *
43
+ * The above copyright notice and this permission notice shall be included in
44
+ * all copies or substantial portions of the Software.
45
+ *
46
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
47
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
48
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
49
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
50
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
51
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
52
+ * THE SOFTWARE.
53
+ */
54
+#ifndef HCD_DWC3_H
55
+#define HCD_DWC3_H
56
+
57
+#include "hw/usb/hcd-xhci.h"
58
+#include "hw/usb/hcd-xhci-sysbus.h"
59
+
60
+#define TYPE_USB_DWC3 "usb_dwc3"
61
+
62
+#define USB_DWC3(obj) \
63
+ OBJECT_CHECK(USBDWC3, (obj), TYPE_USB_DWC3)
64
+
65
+#define USB_DWC3_R_MAX ((0x530 / 4) + 1)
66
+#define DWC3_SIZE 0x10000
67
+
68
+typedef struct USBDWC3 {
22
+ SysBusDevice parent_obj;
69
+ SysBusDevice parent_obj;
23
+ /*< public >*/
70
+ MemoryRegion iomem;
24
ARMCPU *cpu[EXYNOS4210_NCPUS];
71
+ XHCISysbusState sysbus_xhci;
25
Exynos4210Irq irqs;
72
+
26
qemu_irq *irq_table;
73
+ uint32_t regs[USB_DWC3_R_MAX];
27
@@ -XXX,XX +XXX,XX @@ typedef struct Exynos4210State {
74
+ RegisterInfo regs_info[USB_DWC3_R_MAX];
28
I2CBus *i2c_if[EXYNOS4210_I2C_NUMBER];
75
+
29
} Exynos4210State;
76
+ struct {
30
77
+ uint8_t mode;
31
+#define TYPE_EXYNOS4210_SOC "exynos4210"
78
+ uint32_t dwc_usb3_user;
32
+#define EXYNOS4210_SOC(obj) \
79
+ } cfg;
33
+ OBJECT_CHECK(Exynos4210State, obj, TYPE_EXYNOS4210_SOC)
80
+
34
+
81
+} USBDWC3;
35
void exynos4210_write_secondary(ARMCPU *cpu,
82
+
36
const struct arm_boot_info *info);
83
+#endif
37
84
diff --git a/hw/usb/hcd-dwc3.c b/hw/usb/hcd-dwc3.c
38
-Exynos4210State *exynos4210_init(MemoryRegion *system_mem);
85
new file mode 100644
39
-
86
index XXXXXXX..XXXXXXX
40
/* Initialize exynos4210 IRQ subsystem stub */
87
--- /dev/null
41
qemu_irq *exynos4210_init_irq(Exynos4210Irq *env);
88
+++ b/hw/usb/hcd-dwc3.c
42
89
@@ -XXX,XX +XXX,XX @@
43
diff --git a/hw/arm/exynos4210.c b/hw/arm/exynos4210.c
90
+/*
44
index XXXXXXX..XXXXXXX 100644
91
+ * QEMU model of the USB DWC3 host controller emulation.
45
--- a/hw/arm/exynos4210.c
92
+ *
46
+++ b/hw/arm/exynos4210.c
93
+ * This model defines global register space of DWC3 controller. Global
47
@@ -XXX,XX +XXX,XX @@ static void pl330_create(uint32_t base, qemu_irq irq, int nreq)
94
+ * registers control the AXI/AHB interfaces properties, external FIFO support
48
sysbus_connect_irq(busdev, 0, irq);
95
+ * and event count support. All of which are unimplemented at present. We are
49
}
96
+ * only supporting core reset and read of ID register.
50
97
+ *
51
-Exynos4210State *exynos4210_init(MemoryRegion *system_mem)
98
+ * Copyright (c) 2020 Xilinx Inc. Vikram Garhwal<fnu.vikram@xilinx.com>
52
+static void exynos4210_realize(DeviceState *socdev, Error **errp)
99
+ *
53
{
100
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
54
- Exynos4210State *s = g_new0(Exynos4210State, 1);
101
+ * of this software and associated documentation files (the "Software"), to deal
55
+ Exynos4210State *s = EXYNOS4210_SOC(socdev);
102
+ * in the Software without restriction, including without limitation the rights
56
+ MemoryRegion *system_mem = get_system_memory();
103
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
57
qemu_irq gate_irq[EXYNOS4210_NCPUS][EXYNOS4210_IRQ_GATE_NINPUTS];
104
+ * copies of the Software, and to permit persons to whom the Software is
58
SysBusDevice *busdev;
105
+ * furnished to do so, subject to the following conditions:
59
DeviceState *dev;
106
+ *
60
@@ -XXX,XX +XXX,XX @@ Exynos4210State *exynos4210_init(MemoryRegion *system_mem)
107
+ * The above copyright notice and this permission notice shall be included in
61
qemu_irq_invert(s->irq_table[exynos4210_get_irq(36, 1)]), 32);
108
+ * all copies or substantial portions of the Software.
62
pl330_create(EXYNOS4210_PL330_BASE2_ADDR,
109
+ *
63
qemu_irq_invert(s->irq_table[exynos4210_get_irq(34, 1)]), 1);
110
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
64
-
111
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
65
- return s;
112
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
66
}
113
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
67
+
114
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
68
+static void exynos4210_class_init(ObjectClass *klass, void *data)
115
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
116
+ * THE SOFTWARE.
117
+ */
118
+
119
+#include "qemu/osdep.h"
120
+#include "hw/sysbus.h"
121
+#include "hw/register.h"
122
+#include "qemu/bitops.h"
123
+#include "qemu/log.h"
124
+#include "qom/object.h"
125
+#include "migration/vmstate.h"
126
+#include "hw/qdev-properties.h"
127
+#include "hw/usb/hcd-dwc3.h"
128
+#include "qapi/error.h"
129
+
130
+#ifndef USB_DWC3_ERR_DEBUG
131
+#define USB_DWC3_ERR_DEBUG 0
132
+#endif
133
+
134
+#define HOST_MODE 1
135
+#define FIFO_LEN 0x1000
136
+
137
+REG32(GSBUSCFG0, 0x00)
138
+ FIELD(GSBUSCFG0, DATRDREQINFO, 28, 4)
139
+ FIELD(GSBUSCFG0, DESRDREQINFO, 24, 4)
140
+ FIELD(GSBUSCFG0, DATWRREQINFO, 20, 4)
141
+ FIELD(GSBUSCFG0, DESWRREQINFO, 16, 4)
142
+ FIELD(GSBUSCFG0, RESERVED_15_12, 12, 4)
143
+ FIELD(GSBUSCFG0, DATBIGEND, 11, 1)
144
+ FIELD(GSBUSCFG0, DESBIGEND, 10, 1)
145
+ FIELD(GSBUSCFG0, RESERVED_9_8, 8, 2)
146
+ FIELD(GSBUSCFG0, INCR256BRSTENA, 7, 1)
147
+ FIELD(GSBUSCFG0, INCR128BRSTENA, 6, 1)
148
+ FIELD(GSBUSCFG0, INCR64BRSTENA, 5, 1)
149
+ FIELD(GSBUSCFG0, INCR32BRSTENA, 4, 1)
150
+ FIELD(GSBUSCFG0, INCR16BRSTENA, 3, 1)
151
+ FIELD(GSBUSCFG0, INCR8BRSTENA, 2, 1)
152
+ FIELD(GSBUSCFG0, INCR4BRSTENA, 1, 1)
153
+ FIELD(GSBUSCFG0, INCRBRSTENA, 0, 1)
154
+REG32(GSBUSCFG1, 0x04)
155
+ FIELD(GSBUSCFG1, RESERVED_31_13, 13, 19)
156
+ FIELD(GSBUSCFG1, EN1KPAGE, 12, 1)
157
+ FIELD(GSBUSCFG1, PIPETRANSLIMIT, 8, 4)
158
+ FIELD(GSBUSCFG1, RESERVED_7_0, 0, 8)
159
+REG32(GTXTHRCFG, 0x08)
160
+ FIELD(GTXTHRCFG, RESERVED_31, 31, 1)
161
+ FIELD(GTXTHRCFG, RESERVED_30, 30, 1)
162
+ FIELD(GTXTHRCFG, USBTXPKTCNTSEL, 29, 1)
163
+ FIELD(GTXTHRCFG, RESERVED_28, 28, 1)
164
+ FIELD(GTXTHRCFG, USBTXPKTCNT, 24, 4)
165
+ FIELD(GTXTHRCFG, USBMAXTXBURSTSIZE, 16, 8)
166
+ FIELD(GTXTHRCFG, RESERVED_15, 15, 1)
167
+ FIELD(GTXTHRCFG, RESERVED_14, 14, 1)
168
+ FIELD(GTXTHRCFG, RESERVED_13_11, 11, 3)
169
+ FIELD(GTXTHRCFG, RESERVED_10_0, 0, 11)
170
+REG32(GRXTHRCFG, 0x0c)
171
+ FIELD(GRXTHRCFG, RESERVED_31_30, 30, 2)
172
+ FIELD(GRXTHRCFG, USBRXPKTCNTSEL, 29, 1)
173
+ FIELD(GRXTHRCFG, RESERVED_28, 28, 1)
174
+ FIELD(GRXTHRCFG, USBRXPKTCNT, 24, 4)
175
+ FIELD(GRXTHRCFG, USBMAXRXBURSTSIZE, 19, 5)
176
+ FIELD(GRXTHRCFG, RESERVED_18_16, 16, 3)
177
+ FIELD(GRXTHRCFG, RESERVED_15, 15, 1)
178
+ FIELD(GRXTHRCFG, RESERVED_14_13, 13, 2)
179
+ FIELD(GRXTHRCFG, RESVISOCOUTSPC, 0, 13)
180
+REG32(GCTL, 0x10)
181
+ FIELD(GCTL, PWRDNSCALE, 19, 13)
182
+ FIELD(GCTL, MASTERFILTBYPASS, 18, 1)
183
+ FIELD(GCTL, BYPSSETADDR, 17, 1)
184
+ FIELD(GCTL, U2RSTECN, 16, 1)
185
+ FIELD(GCTL, FRMSCLDWN, 14, 2)
186
+ FIELD(GCTL, PRTCAPDIR, 12, 2)
187
+ FIELD(GCTL, CORESOFTRESET, 11, 1)
188
+ FIELD(GCTL, U1U2TIMERSCALE, 9, 1)
189
+ FIELD(GCTL, DEBUGATTACH, 8, 1)
190
+ FIELD(GCTL, RAMCLKSEL, 6, 2)
191
+ FIELD(GCTL, SCALEDOWN, 4, 2)
192
+ FIELD(GCTL, DISSCRAMBLE, 3, 1)
193
+ FIELD(GCTL, U2EXIT_LFPS, 2, 1)
194
+ FIELD(GCTL, GBLHIBERNATIONEN, 1, 1)
195
+ FIELD(GCTL, DSBLCLKGTNG, 0, 1)
196
+REG32(GPMSTS, 0x14)
197
+REG32(GSTS, 0x18)
198
+ FIELD(GSTS, CBELT, 20, 12)
199
+ FIELD(GSTS, RESERVED_19_12, 12, 8)
200
+ FIELD(GSTS, SSIC_IP, 11, 1)
201
+ FIELD(GSTS, OTG_IP, 10, 1)
202
+ FIELD(GSTS, BC_IP, 9, 1)
203
+ FIELD(GSTS, ADP_IP, 8, 1)
204
+ FIELD(GSTS, HOST_IP, 7, 1)
205
+ FIELD(GSTS, DEVICE_IP, 6, 1)
206
+ FIELD(GSTS, CSRTIMEOUT, 5, 1)
207
+ FIELD(GSTS, BUSERRADDRVLD, 4, 1)
208
+ FIELD(GSTS, RESERVED_3_2, 2, 2)
209
+ FIELD(GSTS, CURMOD, 0, 2)
210
+REG32(GUCTL1, 0x1c)
211
+ FIELD(GUCTL1, RESUME_OPMODE_HS_HOST, 10, 1)
212
+REG32(GSNPSID, 0x20)
213
+REG32(GGPIO, 0x24)
214
+ FIELD(GGPIO, GPO, 16, 16)
215
+ FIELD(GGPIO, GPI, 0, 16)
216
+REG32(GUID, 0x28)
217
+REG32(GUCTL, 0x2c)
218
+ FIELD(GUCTL, REFCLKPER, 22, 10)
219
+ FIELD(GUCTL, NOEXTRDL, 21, 1)
220
+ FIELD(GUCTL, RESERVED_20_18, 18, 3)
221
+ FIELD(GUCTL, SPRSCTRLTRANSEN, 17, 1)
222
+ FIELD(GUCTL, RESBWHSEPS, 16, 1)
223
+ FIELD(GUCTL, RESERVED_15, 15, 1)
224
+ FIELD(GUCTL, USBHSTINAUTORETRYEN, 14, 1)
225
+ FIELD(GUCTL, ENOVERLAPCHK, 13, 1)
226
+ FIELD(GUCTL, EXTCAPSUPPTEN, 12, 1)
227
+ FIELD(GUCTL, INSRTEXTRFSBODI, 11, 1)
228
+ FIELD(GUCTL, DTCT, 9, 2)
229
+ FIELD(GUCTL, DTFT, 0, 9)
230
+REG32(GBUSERRADDRLO, 0x30)
231
+REG32(GBUSERRADDRHI, 0x34)
232
+REG32(GHWPARAMS0, 0x40)
233
+ FIELD(GHWPARAMS0, GHWPARAMS0_31_24, 24, 8)
234
+ FIELD(GHWPARAMS0, GHWPARAMS0_23_16, 16, 8)
235
+ FIELD(GHWPARAMS0, GHWPARAMS0_15_8, 8, 8)
236
+ FIELD(GHWPARAMS0, GHWPARAMS0_7_6, 6, 2)
237
+ FIELD(GHWPARAMS0, GHWPARAMS0_5_3, 3, 3)
238
+ FIELD(GHWPARAMS0, GHWPARAMS0_2_0, 0, 3)
239
+REG32(GHWPARAMS1, 0x44)
240
+ FIELD(GHWPARAMS1, GHWPARAMS1_31, 31, 1)
241
+ FIELD(GHWPARAMS1, GHWPARAMS1_30, 30, 1)
242
+ FIELD(GHWPARAMS1, GHWPARAMS1_29, 29, 1)
243
+ FIELD(GHWPARAMS1, GHWPARAMS1_28, 28, 1)
244
+ FIELD(GHWPARAMS1, GHWPARAMS1_27, 27, 1)
245
+ FIELD(GHWPARAMS1, GHWPARAMS1_26, 26, 1)
246
+ FIELD(GHWPARAMS1, GHWPARAMS1_25_24, 24, 2)
247
+ FIELD(GHWPARAMS1, GHWPARAMS1_23, 23, 1)
248
+ FIELD(GHWPARAMS1, GHWPARAMS1_22_21, 21, 2)
249
+ FIELD(GHWPARAMS1, GHWPARAMS1_20_15, 15, 6)
250
+ FIELD(GHWPARAMS1, GHWPARAMS1_14_12, 12, 3)
251
+ FIELD(GHWPARAMS1, GHWPARAMS1_11_9, 9, 3)
252
+ FIELD(GHWPARAMS1, GHWPARAMS1_8_6, 6, 3)
253
+ FIELD(GHWPARAMS1, GHWPARAMS1_5_3, 3, 3)
254
+ FIELD(GHWPARAMS1, GHWPARAMS1_2_0, 0, 3)
255
+REG32(GHWPARAMS2, 0x48)
256
+REG32(GHWPARAMS3, 0x4c)
257
+ FIELD(GHWPARAMS3, GHWPARAMS3_31, 31, 1)
258
+ FIELD(GHWPARAMS3, GHWPARAMS3_30_23, 23, 8)
259
+ FIELD(GHWPARAMS3, GHWPARAMS3_22_18, 18, 5)
260
+ FIELD(GHWPARAMS3, GHWPARAMS3_17_12, 12, 6)
261
+ FIELD(GHWPARAMS3, GHWPARAMS3_11, 11, 1)
262
+ FIELD(GHWPARAMS3, GHWPARAMS3_10, 10, 1)
263
+ FIELD(GHWPARAMS3, GHWPARAMS3_9_8, 8, 2)
264
+ FIELD(GHWPARAMS3, GHWPARAMS3_7_6, 6, 2)
265
+ FIELD(GHWPARAMS3, GHWPARAMS3_5_4, 4, 2)
266
+ FIELD(GHWPARAMS3, GHWPARAMS3_3_2, 2, 2)
267
+ FIELD(GHWPARAMS3, GHWPARAMS3_1_0, 0, 2)
268
+REG32(GHWPARAMS4, 0x50)
269
+ FIELD(GHWPARAMS4, GHWPARAMS4_31_28, 28, 4)
270
+ FIELD(GHWPARAMS4, GHWPARAMS4_27_24, 24, 4)
271
+ FIELD(GHWPARAMS4, GHWPARAMS4_23, 23, 1)
272
+ FIELD(GHWPARAMS4, GHWPARAMS4_22, 22, 1)
273
+ FIELD(GHWPARAMS4, GHWPARAMS4_21, 21, 1)
274
+ FIELD(GHWPARAMS4, GHWPARAMS4_20_17, 17, 4)
275
+ FIELD(GHWPARAMS4, GHWPARAMS4_16_13, 13, 4)
276
+ FIELD(GHWPARAMS4, GHWPARAMS4_12, 12, 1)
277
+ FIELD(GHWPARAMS4, GHWPARAMS4_11, 11, 1)
278
+ FIELD(GHWPARAMS4, GHWPARAMS4_10_9, 9, 2)
279
+ FIELD(GHWPARAMS4, GHWPARAMS4_8_7, 7, 2)
280
+ FIELD(GHWPARAMS4, GHWPARAMS4_6, 6, 1)
281
+ FIELD(GHWPARAMS4, GHWPARAMS4_5_0, 0, 6)
282
+REG32(GHWPARAMS5, 0x54)
283
+ FIELD(GHWPARAMS5, GHWPARAMS5_31_28, 28, 4)
284
+ FIELD(GHWPARAMS5, GHWPARAMS5_27_22, 22, 6)
285
+ FIELD(GHWPARAMS5, GHWPARAMS5_21_16, 16, 6)
286
+ FIELD(GHWPARAMS5, GHWPARAMS5_15_10, 10, 6)
287
+ FIELD(GHWPARAMS5, GHWPARAMS5_9_4, 4, 6)
288
+ FIELD(GHWPARAMS5, GHWPARAMS5_3_0, 0, 4)
289
+REG32(GHWPARAMS6, 0x58)
290
+ FIELD(GHWPARAMS6, GHWPARAMS6_31_16, 16, 16)
291
+ FIELD(GHWPARAMS6, BUSFLTRSSUPPORT, 15, 1)
292
+ FIELD(GHWPARAMS6, BCSUPPORT, 14, 1)
293
+ FIELD(GHWPARAMS6, OTG_SS_SUPPORT, 13, 1)
294
+ FIELD(GHWPARAMS6, ADPSUPPORT, 12, 1)
295
+ FIELD(GHWPARAMS6, HNPSUPPORT, 11, 1)
296
+ FIELD(GHWPARAMS6, SRPSUPPORT, 10, 1)
297
+ FIELD(GHWPARAMS6, GHWPARAMS6_9_8, 8, 2)
298
+ FIELD(GHWPARAMS6, GHWPARAMS6_7, 7, 1)
299
+ FIELD(GHWPARAMS6, GHWPARAMS6_6, 6, 1)
300
+ FIELD(GHWPARAMS6, GHWPARAMS6_5_0, 0, 6)
301
+REG32(GHWPARAMS7, 0x5c)
302
+ FIELD(GHWPARAMS7, GHWPARAMS7_31_16, 16, 16)
303
+ FIELD(GHWPARAMS7, GHWPARAMS7_15_0, 0, 16)
304
+REG32(GDBGFIFOSPACE, 0x60)
305
+ FIELD(GDBGFIFOSPACE, SPACE_AVAILABLE, 16, 16)
306
+ FIELD(GDBGFIFOSPACE, RESERVED_15_9, 9, 7)
307
+ FIELD(GDBGFIFOSPACE, FIFO_QUEUE_SELECT, 0, 9)
308
+REG32(GUCTL2, 0x9c)
309
+ FIELD(GUCTL2, RESERVED_31_26, 26, 6)
310
+ FIELD(GUCTL2, EN_HP_PM_TIMER, 19, 7)
311
+ FIELD(GUCTL2, NOLOWPWRDUR, 15, 4)
312
+ FIELD(GUCTL2, RST_ACTBITLATER, 14, 1)
313
+ FIELD(GUCTL2, RESERVED_13, 13, 1)
314
+ FIELD(GUCTL2, DISABLECFC, 11, 1)
315
+REG32(GUSB2PHYCFG, 0x100)
316
+ FIELD(GUSB2PHYCFG, U2_FREECLK_EXISTS, 30, 1)
317
+ FIELD(GUSB2PHYCFG, ULPI_LPM_WITH_OPMODE_CHK, 29, 1)
318
+ FIELD(GUSB2PHYCFG, RESERVED_25, 25, 1)
319
+ FIELD(GUSB2PHYCFG, LSTRD, 22, 3)
320
+ FIELD(GUSB2PHYCFG, LSIPD, 19, 3)
321
+ FIELD(GUSB2PHYCFG, ULPIEXTVBUSINDIACTOR, 18, 1)
322
+ FIELD(GUSB2PHYCFG, ULPIEXTVBUSDRV, 17, 1)
323
+ FIELD(GUSB2PHYCFG, RESERVED_16, 16, 1)
324
+ FIELD(GUSB2PHYCFG, ULPIAUTORES, 15, 1)
325
+ FIELD(GUSB2PHYCFG, RESERVED_14, 14, 1)
326
+ FIELD(GUSB2PHYCFG, USBTRDTIM, 10, 4)
327
+ FIELD(GUSB2PHYCFG, XCVRDLY, 9, 1)
328
+ FIELD(GUSB2PHYCFG, ENBLSLPM, 8, 1)
329
+ FIELD(GUSB2PHYCFG, PHYSEL, 7, 1)
330
+ FIELD(GUSB2PHYCFG, SUSPENDUSB20, 6, 1)
331
+ FIELD(GUSB2PHYCFG, FSINTF, 5, 1)
332
+ FIELD(GUSB2PHYCFG, ULPI_UTMI_SEL, 4, 1)
333
+ FIELD(GUSB2PHYCFG, PHYIF, 3, 1)
334
+ FIELD(GUSB2PHYCFG, TOUTCAL, 0, 3)
335
+REG32(GUSB2I2CCTL, 0x140)
336
+REG32(GUSB2PHYACC_ULPI, 0x180)
337
+ FIELD(GUSB2PHYACC_ULPI, RESERVED_31_27, 27, 5)
338
+ FIELD(GUSB2PHYACC_ULPI, DISUIPIDRVR, 26, 1)
339
+ FIELD(GUSB2PHYACC_ULPI, NEWREGREQ, 25, 1)
340
+ FIELD(GUSB2PHYACC_ULPI, VSTSDONE, 24, 1)
341
+ FIELD(GUSB2PHYACC_ULPI, VSTSBSY, 23, 1)
342
+ FIELD(GUSB2PHYACC_ULPI, REGWR, 22, 1)
343
+ FIELD(GUSB2PHYACC_ULPI, REGADDR, 16, 6)
344
+ FIELD(GUSB2PHYACC_ULPI, EXTREGADDR, 8, 8)
345
+ FIELD(GUSB2PHYACC_ULPI, REGDATA, 0, 8)
346
+REG32(GTXFIFOSIZ0, 0x200)
347
+ FIELD(GTXFIFOSIZ0, TXFSTADDR_N, 16, 16)
348
+ FIELD(GTXFIFOSIZ0, TXFDEP_N, 0, 16)
349
+REG32(GTXFIFOSIZ1, 0x204)
350
+ FIELD(GTXFIFOSIZ1, TXFSTADDR_N, 16, 16)
351
+ FIELD(GTXFIFOSIZ1, TXFDEP_N, 0, 16)
352
+REG32(GTXFIFOSIZ2, 0x208)
353
+ FIELD(GTXFIFOSIZ2, TXFSTADDR_N, 16, 16)
354
+ FIELD(GTXFIFOSIZ2, TXFDEP_N, 0, 16)
355
+REG32(GTXFIFOSIZ3, 0x20c)
356
+ FIELD(GTXFIFOSIZ3, TXFSTADDR_N, 16, 16)
357
+ FIELD(GTXFIFOSIZ3, TXFDEP_N, 0, 16)
358
+REG32(GTXFIFOSIZ4, 0x210)
359
+ FIELD(GTXFIFOSIZ4, TXFSTADDR_N, 16, 16)
360
+ FIELD(GTXFIFOSIZ4, TXFDEP_N, 0, 16)
361
+REG32(GTXFIFOSIZ5, 0x214)
362
+ FIELD(GTXFIFOSIZ5, TXFSTADDR_N, 16, 16)
363
+ FIELD(GTXFIFOSIZ5, TXFDEP_N, 0, 16)
364
+REG32(GRXFIFOSIZ0, 0x280)
365
+ FIELD(GRXFIFOSIZ0, RXFSTADDR_N, 16, 16)
366
+ FIELD(GRXFIFOSIZ0, RXFDEP_N, 0, 16)
367
+REG32(GRXFIFOSIZ1, 0x284)
368
+ FIELD(GRXFIFOSIZ1, RXFSTADDR_N, 16, 16)
369
+ FIELD(GRXFIFOSIZ1, RXFDEP_N, 0, 16)
370
+REG32(GRXFIFOSIZ2, 0x288)
371
+ FIELD(GRXFIFOSIZ2, RXFSTADDR_N, 16, 16)
372
+ FIELD(GRXFIFOSIZ2, RXFDEP_N, 0, 16)
373
+REG32(GEVNTADRLO_0, 0x300)
374
+REG32(GEVNTADRHI_0, 0x304)
375
+REG32(GEVNTSIZ_0, 0x308)
376
+ FIELD(GEVNTSIZ_0, EVNTINTRPTMASK, 31, 1)
377
+ FIELD(GEVNTSIZ_0, RESERVED_30_16, 16, 15)
378
+ FIELD(GEVNTSIZ_0, EVENTSIZ, 0, 16)
379
+REG32(GEVNTCOUNT_0, 0x30c)
380
+ FIELD(GEVNTCOUNT_0, EVNT_HANDLER_BUSY, 31, 1)
381
+ FIELD(GEVNTCOUNT_0, RESERVED_30_16, 16, 15)
382
+ FIELD(GEVNTCOUNT_0, EVNTCOUNT, 0, 16)
383
+REG32(GEVNTADRLO_1, 0x310)
384
+REG32(GEVNTADRHI_1, 0x314)
385
+REG32(GEVNTSIZ_1, 0x318)
386
+ FIELD(GEVNTSIZ_1, EVNTINTRPTMASK, 31, 1)
387
+ FIELD(GEVNTSIZ_1, RESERVED_30_16, 16, 15)
388
+ FIELD(GEVNTSIZ_1, EVENTSIZ, 0, 16)
389
+REG32(GEVNTCOUNT_1, 0x31c)
390
+ FIELD(GEVNTCOUNT_1, EVNT_HANDLER_BUSY, 31, 1)
391
+ FIELD(GEVNTCOUNT_1, RESERVED_30_16, 16, 15)
392
+ FIELD(GEVNTCOUNT_1, EVNTCOUNT, 0, 16)
393
+REG32(GEVNTADRLO_2, 0x320)
394
+REG32(GEVNTADRHI_2, 0x324)
395
+REG32(GEVNTSIZ_2, 0x328)
396
+ FIELD(GEVNTSIZ_2, EVNTINTRPTMASK, 31, 1)
397
+ FIELD(GEVNTSIZ_2, RESERVED_30_16, 16, 15)
398
+ FIELD(GEVNTSIZ_2, EVENTSIZ, 0, 16)
399
+REG32(GEVNTCOUNT_2, 0x32c)
400
+ FIELD(GEVNTCOUNT_2, EVNT_HANDLER_BUSY, 31, 1)
401
+ FIELD(GEVNTCOUNT_2, RESERVED_30_16, 16, 15)
402
+ FIELD(GEVNTCOUNT_2, EVNTCOUNT, 0, 16)
403
+REG32(GEVNTADRLO_3, 0x330)
404
+REG32(GEVNTADRHI_3, 0x334)
405
+REG32(GEVNTSIZ_3, 0x338)
406
+ FIELD(GEVNTSIZ_3, EVNTINTRPTMASK, 31, 1)
407
+ FIELD(GEVNTSIZ_3, RESERVED_30_16, 16, 15)
408
+ FIELD(GEVNTSIZ_3, EVENTSIZ, 0, 16)
409
+REG32(GEVNTCOUNT_3, 0x33c)
410
+ FIELD(GEVNTCOUNT_3, EVNT_HANDLER_BUSY, 31, 1)
411
+ FIELD(GEVNTCOUNT_3, RESERVED_30_16, 16, 15)
412
+ FIELD(GEVNTCOUNT_3, EVNTCOUNT, 0, 16)
413
+REG32(GHWPARAMS8, 0x500)
414
+REG32(GTXFIFOPRIDEV, 0x510)
415
+ FIELD(GTXFIFOPRIDEV, RESERVED_31_N, 6, 26)
416
+ FIELD(GTXFIFOPRIDEV, GTXFIFOPRIDEV, 0, 6)
417
+REG32(GTXFIFOPRIHST, 0x518)
418
+ FIELD(GTXFIFOPRIHST, RESERVED_31_16, 3, 29)
419
+ FIELD(GTXFIFOPRIHST, GTXFIFOPRIHST, 0, 3)
420
+REG32(GRXFIFOPRIHST, 0x51c)
421
+ FIELD(GRXFIFOPRIHST, RESERVED_31_16, 3, 29)
422
+ FIELD(GRXFIFOPRIHST, GRXFIFOPRIHST, 0, 3)
423
+REG32(GDMAHLRATIO, 0x524)
424
+ FIELD(GDMAHLRATIO, RESERVED_31_13, 13, 19)
425
+ FIELD(GDMAHLRATIO, HSTRXFIFO, 8, 5)
426
+ FIELD(GDMAHLRATIO, RESERVED_7_5, 5, 3)
427
+ FIELD(GDMAHLRATIO, HSTTXFIFO, 0, 5)
428
+REG32(GFLADJ, 0x530)
429
+ FIELD(GFLADJ, GFLADJ_REFCLK_240MHZDECR_PLS1, 31, 1)
430
+ FIELD(GFLADJ, GFLADJ_REFCLK_240MHZ_DECR, 24, 7)
431
+ FIELD(GFLADJ, GFLADJ_REFCLK_LPM_SEL, 23, 1)
432
+ FIELD(GFLADJ, RESERVED_22, 22, 1)
433
+ FIELD(GFLADJ, GFLADJ_REFCLK_FLADJ, 8, 14)
434
+ FIELD(GFLADJ, GFLADJ_30MHZ_SDBND_SEL, 7, 1)
435
+ FIELD(GFLADJ, GFLADJ_30MHZ, 0, 6)
436
+
437
+#define DWC3_GLOBAL_OFFSET 0xC100
438
+static void reset_csr(USBDWC3 * s)
439
+{
440
+ int i = 0;
441
+ /*
442
+ * We reset all CSR regs except GCTL, GUCTL, GSTS, GSNPSID, GGPIO, GUID,
443
+ * GUSB2PHYCFGn registers and GUSB3PIPECTLn registers. We will skip PHY
444
+ * register as we don't implement them.
445
+ */
446
+ for (i = 0; i < USB_DWC3_R_MAX; i++) {
447
+ switch (i) {
448
+ case R_GCTL:
449
+ break;
450
+ case R_GSTS:
451
+ break;
452
+ case R_GSNPSID:
453
+ break;
454
+ case R_GGPIO:
455
+ break;
456
+ case R_GUID:
457
+ break;
458
+ case R_GUCTL:
459
+ break;
460
+ case R_GHWPARAMS0...R_GHWPARAMS7:
461
+ break;
462
+ case R_GHWPARAMS8:
463
+ break;
464
+ default:
465
+ register_reset(&s->regs_info[i]);
466
+ break;
467
+ }
468
+ }
469
+
470
+ xhci_sysbus_reset(DEVICE(&s->sysbus_xhci));
471
+}
472
+
473
+static void usb_dwc3_gctl_postw(RegisterInfo *reg, uint64_t val64)
474
+{
475
+ USBDWC3 *s = USB_DWC3(reg->opaque);
476
+
477
+ if (ARRAY_FIELD_EX32(s->regs, GCTL, CORESOFTRESET)) {
478
+ reset_csr(s);
479
+ }
480
+}
481
+
482
+static void usb_dwc3_guid_postw(RegisterInfo *reg, uint64_t val64)
483
+{
484
+ USBDWC3 *s = USB_DWC3(reg->opaque);
485
+
486
+ s->regs[R_GUID] = s->cfg.dwc_usb3_user;
487
+}
488
+
489
+static const RegisterAccessInfo usb_dwc3_regs_info[] = {
490
+ { .name = "GSBUSCFG0", .addr = A_GSBUSCFG0,
491
+ .ro = 0xf300,
492
+ .unimp = 0xffffffff,
493
+ },{ .name = "GSBUSCFG1", .addr = A_GSBUSCFG1,
494
+ .reset = 0x300,
495
+ .ro = 0xffffe0ff,
496
+ .unimp = 0xffffffff,
497
+ },{ .name = "GTXTHRCFG", .addr = A_GTXTHRCFG,
498
+ .ro = 0xd000ffff,
499
+ .unimp = 0xffffffff,
500
+ },{ .name = "GRXTHRCFG", .addr = A_GRXTHRCFG,
501
+ .ro = 0xd007e000,
502
+ .unimp = 0xffffffff,
503
+ },{ .name = "GCTL", .addr = A_GCTL,
504
+ .reset = 0x30c13004, .post_write = usb_dwc3_gctl_postw,
505
+ },{ .name = "GPMSTS", .addr = A_GPMSTS,
506
+ .ro = 0xfffffff,
507
+ .unimp = 0xffffffff,
508
+ },{ .name = "GSTS", .addr = A_GSTS,
509
+ .reset = 0x7e800000,
510
+ .ro = 0xffffffcf,
511
+ .w1c = 0x30,
512
+ .unimp = 0xffffffff,
513
+ },{ .name = "GUCTL1", .addr = A_GUCTL1,
514
+ .reset = 0x198a,
515
+ .ro = 0x7800,
516
+ .unimp = 0xffffffff,
517
+ },{ .name = "GSNPSID", .addr = A_GSNPSID,
518
+ .reset = 0x5533330a,
519
+ .ro = 0xffffffff,
520
+ },{ .name = "GGPIO", .addr = A_GGPIO,
521
+ .ro = 0xffff,
522
+ .unimp = 0xffffffff,
523
+ },{ .name = "GUID", .addr = A_GUID,
524
+ .reset = 0x12345678, .post_write = usb_dwc3_guid_postw,
525
+ },{ .name = "GUCTL", .addr = A_GUCTL,
526
+ .reset = 0x0c808010,
527
+ .ro = 0x1c8000,
528
+ .unimp = 0xffffffff,
529
+ },{ .name = "GBUSERRADDRLO", .addr = A_GBUSERRADDRLO,
530
+ .ro = 0xffffffff,
531
+ },{ .name = "GBUSERRADDRHI", .addr = A_GBUSERRADDRHI,
532
+ .ro = 0xffffffff,
533
+ },{ .name = "GHWPARAMS0", .addr = A_GHWPARAMS0,
534
+ .ro = 0xffffffff,
535
+ },{ .name = "GHWPARAMS1", .addr = A_GHWPARAMS1,
536
+ .ro = 0xffffffff,
537
+ },{ .name = "GHWPARAMS2", .addr = A_GHWPARAMS2,
538
+ .ro = 0xffffffff,
539
+ },{ .name = "GHWPARAMS3", .addr = A_GHWPARAMS3,
540
+ .ro = 0xffffffff,
541
+ },{ .name = "GHWPARAMS4", .addr = A_GHWPARAMS4,
542
+ .ro = 0xffffffff,
543
+ },{ .name = "GHWPARAMS5", .addr = A_GHWPARAMS5,
544
+ .ro = 0xffffffff,
545
+ },{ .name = "GHWPARAMS6", .addr = A_GHWPARAMS6,
546
+ .ro = 0xffffffff,
547
+ },{ .name = "GHWPARAMS7", .addr = A_GHWPARAMS7,
548
+ .ro = 0xffffffff,
549
+ },{ .name = "GDBGFIFOSPACE", .addr = A_GDBGFIFOSPACE,
550
+ .reset = 0xa0000,
551
+ .ro = 0xfffffe00,
552
+ .unimp = 0xffffffff,
553
+ },{ .name = "GUCTL2", .addr = A_GUCTL2,
554
+ .reset = 0x40d,
555
+ .ro = 0x2000,
556
+ .unimp = 0xffffffff,
557
+ },{ .name = "GUSB2PHYCFG", .addr = A_GUSB2PHYCFG,
558
+ .reset = 0x40102410,
559
+ .ro = 0x1e014030,
560
+ .unimp = 0xffffffff,
561
+ },{ .name = "GUSB2I2CCTL", .addr = A_GUSB2I2CCTL,
562
+ .ro = 0xffffffff,
563
+ .unimp = 0xffffffff,
564
+ },{ .name = "GUSB2PHYACC_ULPI", .addr = A_GUSB2PHYACC_ULPI,
565
+ .ro = 0xfd000000,
566
+ .unimp = 0xffffffff,
567
+ },{ .name = "GTXFIFOSIZ0", .addr = A_GTXFIFOSIZ0,
568
+ .reset = 0x2c7000a,
569
+ .unimp = 0xffffffff,
570
+ },{ .name = "GTXFIFOSIZ1", .addr = A_GTXFIFOSIZ1,
571
+ .reset = 0x2d10103,
572
+ .unimp = 0xffffffff,
573
+ },{ .name = "GTXFIFOSIZ2", .addr = A_GTXFIFOSIZ2,
574
+ .reset = 0x3d40103,
575
+ .unimp = 0xffffffff,
576
+ },{ .name = "GTXFIFOSIZ3", .addr = A_GTXFIFOSIZ3,
577
+ .reset = 0x4d70083,
578
+ .unimp = 0xffffffff,
579
+ },{ .name = "GTXFIFOSIZ4", .addr = A_GTXFIFOSIZ4,
580
+ .reset = 0x55a0083,
581
+ .unimp = 0xffffffff,
582
+ },{ .name = "GTXFIFOSIZ5", .addr = A_GTXFIFOSIZ5,
583
+ .reset = 0x5dd0083,
584
+ .unimp = 0xffffffff,
585
+ },{ .name = "GRXFIFOSIZ0", .addr = A_GRXFIFOSIZ0,
586
+ .reset = 0x1c20105,
587
+ .unimp = 0xffffffff,
588
+ },{ .name = "GRXFIFOSIZ1", .addr = A_GRXFIFOSIZ1,
589
+ .reset = 0x2c70000,
590
+ .unimp = 0xffffffff,
591
+ },{ .name = "GRXFIFOSIZ2", .addr = A_GRXFIFOSIZ2,
592
+ .reset = 0x2c70000,
593
+ .unimp = 0xffffffff,
594
+ },{ .name = "GEVNTADRLO_0", .addr = A_GEVNTADRLO_0,
595
+ .unimp = 0xffffffff,
596
+ },{ .name = "GEVNTADRHI_0", .addr = A_GEVNTADRHI_0,
597
+ .unimp = 0xffffffff,
598
+ },{ .name = "GEVNTSIZ_0", .addr = A_GEVNTSIZ_0,
599
+ .ro = 0x7fff0000,
600
+ .unimp = 0xffffffff,
601
+ },{ .name = "GEVNTCOUNT_0", .addr = A_GEVNTCOUNT_0,
602
+ .ro = 0x7fff0000,
603
+ .unimp = 0xffffffff,
604
+ },{ .name = "GEVNTADRLO_1", .addr = A_GEVNTADRLO_1,
605
+ .unimp = 0xffffffff,
606
+ },{ .name = "GEVNTADRHI_1", .addr = A_GEVNTADRHI_1,
607
+ .unimp = 0xffffffff,
608
+ },{ .name = "GEVNTSIZ_1", .addr = A_GEVNTSIZ_1,
609
+ .ro = 0x7fff0000,
610
+ .unimp = 0xffffffff,
611
+ },{ .name = "GEVNTCOUNT_1", .addr = A_GEVNTCOUNT_1,
612
+ .ro = 0x7fff0000,
613
+ .unimp = 0xffffffff,
614
+ },{ .name = "GEVNTADRLO_2", .addr = A_GEVNTADRLO_2,
615
+ .unimp = 0xffffffff,
616
+ },{ .name = "GEVNTADRHI_2", .addr = A_GEVNTADRHI_2,
617
+ .unimp = 0xffffffff,
618
+ },{ .name = "GEVNTSIZ_2", .addr = A_GEVNTSIZ_2,
619
+ .ro = 0x7fff0000,
620
+ .unimp = 0xffffffff,
621
+ },{ .name = "GEVNTCOUNT_2", .addr = A_GEVNTCOUNT_2,
622
+ .ro = 0x7fff0000,
623
+ .unimp = 0xffffffff,
624
+ },{ .name = "GEVNTADRLO_3", .addr = A_GEVNTADRLO_3,
625
+ .unimp = 0xffffffff,
626
+ },{ .name = "GEVNTADRHI_3", .addr = A_GEVNTADRHI_3,
627
+ .unimp = 0xffffffff,
628
+ },{ .name = "GEVNTSIZ_3", .addr = A_GEVNTSIZ_3,
629
+ .ro = 0x7fff0000,
630
+ .unimp = 0xffffffff,
631
+ },{ .name = "GEVNTCOUNT_3", .addr = A_GEVNTCOUNT_3,
632
+ .ro = 0x7fff0000,
633
+ .unimp = 0xffffffff,
634
+ },{ .name = "GHWPARAMS8", .addr = A_GHWPARAMS8,
635
+ .ro = 0xffffffff,
636
+ },{ .name = "GTXFIFOPRIDEV", .addr = A_GTXFIFOPRIDEV,
637
+ .ro = 0xffffffc0,
638
+ .unimp = 0xffffffff,
639
+ },{ .name = "GTXFIFOPRIHST", .addr = A_GTXFIFOPRIHST,
640
+ .ro = 0xfffffff8,
641
+ .unimp = 0xffffffff,
642
+ },{ .name = "GRXFIFOPRIHST", .addr = A_GRXFIFOPRIHST,
643
+ .ro = 0xfffffff8,
644
+ .unimp = 0xffffffff,
645
+ },{ .name = "GDMAHLRATIO", .addr = A_GDMAHLRATIO,
646
+ .ro = 0xffffe0e0,
647
+ .unimp = 0xffffffff,
648
+ },{ .name = "GFLADJ", .addr = A_GFLADJ,
649
+ .reset = 0xc83f020,
650
+ .rsvd = 0x40,
651
+ .ro = 0x400040,
652
+ .unimp = 0xffffffff,
653
+ }
654
+};
655
+
656
+static void usb_dwc3_reset(DeviceState *dev)
657
+{
658
+ USBDWC3 *s = USB_DWC3(dev);
659
+ unsigned int i;
660
+
661
+ for (i = 0; i < ARRAY_SIZE(s->regs_info); ++i) {
662
+ switch (i) {
663
+ case R_GHWPARAMS0...R_GHWPARAMS7:
664
+ break;
665
+ case R_GHWPARAMS8:
666
+ break;
667
+ default:
668
+ register_reset(&s->regs_info[i]);
669
+ };
670
+ }
671
+
672
+ xhci_sysbus_reset(DEVICE(&s->sysbus_xhci));
673
+}
674
+
675
+static const MemoryRegionOps usb_dwc3_ops = {
676
+ .read = register_read_memory,
677
+ .write = register_write_memory,
678
+ .endianness = DEVICE_LITTLE_ENDIAN,
679
+ .valid = {
680
+ .min_access_size = 4,
681
+ .max_access_size = 4,
682
+ },
683
+};
684
+
685
+static void usb_dwc3_realize(DeviceState *dev, Error **errp)
686
+{
687
+ USBDWC3 *s = USB_DWC3(dev);
688
+ SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
689
+ Error *err = NULL;
690
+
691
+ sysbus_realize(SYS_BUS_DEVICE(&s->sysbus_xhci), &err);
692
+ if (err) {
693
+ error_propagate(errp, err);
694
+ return;
695
+ }
696
+
697
+ memory_region_add_subregion(&s->iomem, 0,
698
+ sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->sysbus_xhci), 0));
699
+ sysbus_init_mmio(sbd, &s->iomem);
700
+
701
+ /*
702
+ * Device Configuration
703
+ */
704
+ s->regs[R_GHWPARAMS0] = 0x40204048 | s->cfg.mode;
705
+ s->regs[R_GHWPARAMS1] = 0x222493b;
706
+ s->regs[R_GHWPARAMS2] = 0x12345678;
707
+ s->regs[R_GHWPARAMS3] = 0x618c088;
708
+ s->regs[R_GHWPARAMS4] = 0x47822004;
709
+ s->regs[R_GHWPARAMS5] = 0x4202088;
710
+ s->regs[R_GHWPARAMS6] = 0x7850c20;
711
+ s->regs[R_GHWPARAMS7] = 0x0;
712
+ s->regs[R_GHWPARAMS8] = 0x478;
713
+}
714
+
715
+static void usb_dwc3_init(Object *obj)
716
+{
717
+ USBDWC3 *s = USB_DWC3(obj);
718
+ RegisterInfoArray *reg_array;
719
+
720
+ memory_region_init(&s->iomem, obj, TYPE_USB_DWC3, DWC3_SIZE);
721
+ reg_array =
722
+ register_init_block32(DEVICE(obj), usb_dwc3_regs_info,
723
+ ARRAY_SIZE(usb_dwc3_regs_info),
724
+ s->regs_info, s->regs,
725
+ &usb_dwc3_ops,
726
+ USB_DWC3_ERR_DEBUG,
727
+ USB_DWC3_R_MAX * 4);
728
+ memory_region_add_subregion(&s->iomem,
729
+ DWC3_GLOBAL_OFFSET,
730
+ &reg_array->mem);
731
+ object_initialize_child(obj, "dwc3-xhci", &s->sysbus_xhci,
732
+ TYPE_XHCI_SYSBUS);
733
+ qdev_alias_all_properties(DEVICE(&s->sysbus_xhci), obj);
734
+
735
+ s->cfg.mode = HOST_MODE;
736
+}
737
+
738
+static const VMStateDescription vmstate_usb_dwc3 = {
739
+ .name = "usb-dwc3",
740
+ .version_id = 1,
741
+ .fields = (VMStateField[]) {
742
+ VMSTATE_UINT32_ARRAY(regs, USBDWC3, USB_DWC3_R_MAX),
743
+ VMSTATE_UINT8(cfg.mode, USBDWC3),
744
+ VMSTATE_UINT32(cfg.dwc_usb3_user, USBDWC3),
745
+ VMSTATE_END_OF_LIST()
746
+ }
747
+};
748
+
749
+static Property usb_dwc3_properties[] = {
750
+ DEFINE_PROP_UINT32("DWC_USB3_USERID", USBDWC3, cfg.dwc_usb3_user,
751
+ 0x12345678),
752
+ DEFINE_PROP_END_OF_LIST(),
753
+};
754
+
755
+static void usb_dwc3_class_init(ObjectClass *klass, void *data)
69
+{
756
+{
70
+ DeviceClass *dc = DEVICE_CLASS(klass);
757
+ DeviceClass *dc = DEVICE_CLASS(klass);
71
+
758
+
72
+ dc->realize = exynos4210_realize;
759
+ dc->reset = usb_dwc3_reset;
760
+ dc->realize = usb_dwc3_realize;
761
+ dc->vmsd = &vmstate_usb_dwc3;
762
+ device_class_set_props(dc, usb_dwc3_properties);
73
+}
763
+}
74
+
764
+
75
+static const TypeInfo exynos4210_info = {
765
+static const TypeInfo usb_dwc3_info = {
76
+ .name = TYPE_EXYNOS4210_SOC,
766
+ .name = TYPE_USB_DWC3,
77
+ .parent = TYPE_SYS_BUS_DEVICE,
767
+ .parent = TYPE_SYS_BUS_DEVICE,
78
+ .instance_size = sizeof(Exynos4210State),
768
+ .instance_size = sizeof(USBDWC3),
79
+ .class_init = exynos4210_class_init,
769
+ .class_init = usb_dwc3_class_init,
770
+ .instance_init = usb_dwc3_init,
80
+};
771
+};
81
+
772
+
82
+static void exynos4210_register_types(void)
773
+static void usb_dwc3_register_types(void)
83
+{
774
+{
84
+ type_register_static(&exynos4210_info);
775
+ type_register_static(&usb_dwc3_info);
85
+}
776
+}
86
+
777
+
87
+type_init(exynos4210_register_types)
778
+type_init(usb_dwc3_register_types)
88
diff --git a/hw/arm/exynos4_boards.c b/hw/arm/exynos4_boards.c
779
diff --git a/hw/usb/Kconfig b/hw/usb/Kconfig
89
index XXXXXXX..XXXXXXX 100644
780
index XXXXXXX..XXXXXXX 100644
90
--- a/hw/arm/exynos4_boards.c
781
--- a/hw/usb/Kconfig
91
+++ b/hw/arm/exynos4_boards.c
782
+++ b/hw/usb/Kconfig
92
@@ -XXX,XX +XXX,XX @@ typedef enum Exynos4BoardType {
783
@@ -XXX,XX +XXX,XX @@ config IMX_USBPHY
93
} Exynos4BoardType;
784
bool
94
785
default y
95
typedef struct Exynos4BoardState {
786
depends on USB
96
- Exynos4210State *soc;
787
+
97
+ Exynos4210State soc;
788
+config USB_DWC3
98
MemoryRegion dram0_mem;
789
+ bool
99
MemoryRegion dram1_mem;
790
+ select USB_XHCI_SYSBUS
100
} Exynos4BoardState;
791
+ select REGISTER
101
@@ -XXX,XX +XXX,XX @@ exynos4_boards_init_common(MachineState *machine,
792
diff --git a/hw/usb/meson.build b/hw/usb/meson.build
102
exynos4_boards_init_ram(s, get_system_memory(),
793
index XXXXXXX..XXXXXXX 100644
103
exynos4_board_ram_size[board_type]);
794
--- a/hw/usb/meson.build
104
795
+++ b/hw/usb/meson.build
105
- s->soc = exynos4210_init(get_system_memory());
796
@@ -XXX,XX +XXX,XX @@ softmmu_ss.add(when: 'CONFIG_USB_XHCI_SYSBUS', if_true: files('hcd-xhci-sysbus.c
106
+ object_initialize(&s->soc, sizeof(s->soc), TYPE_EXYNOS4210_SOC);
797
softmmu_ss.add(when: 'CONFIG_USB_XHCI_NEC', if_true: files('hcd-xhci-nec.c'))
107
+ qdev_set_parent_bus(DEVICE(&s->soc), sysbus_get_default());
798
softmmu_ss.add(when: 'CONFIG_USB_MUSB', if_true: files('hcd-musb.c'))
108
+ object_property_set_bool(OBJECT(&s->soc), true, "realized",
799
softmmu_ss.add(when: 'CONFIG_USB_DWC2', if_true: files('hcd-dwc2.c'))
109
+ &error_fatal);
800
+softmmu_ss.add(when: 'CONFIG_USB_DWC3', if_true: files('hcd-dwc3.c'))
110
801
111
return s;
802
softmmu_ss.add(when: 'CONFIG_TUSB6010', if_true: files('tusb6010.c'))
112
}
803
softmmu_ss.add(when: 'CONFIG_IMX', if_true: files('chipidea.c'))
113
@@ -XXX,XX +XXX,XX @@ static void smdkc210_init(MachineState *machine)
114
EXYNOS4_BOARD_SMDKC210);
115
116
lan9215_init(SMDK_LAN9118_BASE_ADDR,
117
- qemu_irq_invert(s->soc->irq_table[exynos4210_get_irq(37, 1)]));
118
+ qemu_irq_invert(s->soc.irq_table[exynos4210_get_irq(37, 1)]));
119
arm_load_kernel(ARM_CPU(first_cpu), &exynos4_board_binfo);
120
}
121
122
--
804
--
123
2.20.1
805
2.20.1
124
806
125
807
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
1
From: Sai Pavan Boddu <sai.pavan.boddu@xilinx.com>
2
2
3
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
3
This model is a top level integration wrapper for hcd-dwc3 and
4
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
4
versal-usb2-ctrl-regs modules, this is used by xilinx versal soc's and
5
Message-id: 20190520214342.13709-2-philmd@redhat.com
5
future xilinx usb subsystems would also be part of it.
6
7
Signed-off-by: Sai Pavan Boddu <sai.pavan.boddu@xilinx.com>
8
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Message-id: 1607023357-5096-4-git-send-email-sai.pavan.boddu@xilinx.com
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
12
---
8
hw/arm/exynos4_boards.c | 24 ------------------------
13
include/hw/usb/xlnx-usb-subsystem.h | 45 ++++++++++++++
9
1 file changed, 24 deletions(-)
14
hw/usb/xlnx-usb-subsystem.c | 94 +++++++++++++++++++++++++++++
10
15
hw/usb/Kconfig | 5 ++
11
diff --git a/hw/arm/exynos4_boards.c b/hw/arm/exynos4_boards.c
16
hw/usb/meson.build | 1 +
17
4 files changed, 145 insertions(+)
18
create mode 100644 include/hw/usb/xlnx-usb-subsystem.h
19
create mode 100644 hw/usb/xlnx-usb-subsystem.c
20
21
diff --git a/include/hw/usb/xlnx-usb-subsystem.h b/include/hw/usb/xlnx-usb-subsystem.h
22
new file mode 100644
23
index XXXXXXX..XXXXXXX
24
--- /dev/null
25
+++ b/include/hw/usb/xlnx-usb-subsystem.h
26
@@ -XXX,XX +XXX,XX @@
27
+/*
28
+ * QEMU model of the Xilinx usb subsystem
29
+ *
30
+ * Copyright (c) 2020 Xilinx Inc. Sai Pavan Boddu <sai.pavan.boddu@xilinx.com>
31
+ *
32
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
33
+ * of this software and associated documentation files (the "Software"), to deal
34
+ * in the Software without restriction, including without limitation the rights
35
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
36
+ * copies of the Software, and to permit persons to whom the Software is
37
+ * furnished to do so, subject to the following conditions:
38
+ *
39
+ * The above copyright notice and this permission notice shall be included in
40
+ * all copies or substantial portions of the Software.
41
+ *
42
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
43
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
44
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
45
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
46
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
47
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
48
+ * THE SOFTWARE.
49
+ */
50
+
51
+#ifndef _XLNX_VERSAL_USB_SUBSYSTEM_H_
52
+#define _XLNX_VERSAL_USB_SUBSYSTEM_H_
53
+
54
+#include "hw/usb/xlnx-versal-usb2-ctrl-regs.h"
55
+#include "hw/usb/hcd-dwc3.h"
56
+
57
+#define TYPE_XILINX_VERSAL_USB2 "xlnx.versal-usb2"
58
+
59
+#define VERSAL_USB2(obj) \
60
+ OBJECT_CHECK(VersalUsb2, (obj), TYPE_XILINX_VERSAL_USB2)
61
+
62
+typedef struct VersalUsb2 {
63
+ SysBusDevice parent_obj;
64
+ MemoryRegion dwc3_mr;
65
+ MemoryRegion usb2Ctrl_mr;
66
+
67
+ VersalUsb2CtrlRegs usb2Ctrl;
68
+ USBDWC3 dwc3;
69
+} VersalUsb2;
70
+
71
+#endif
72
diff --git a/hw/usb/xlnx-usb-subsystem.c b/hw/usb/xlnx-usb-subsystem.c
73
new file mode 100644
74
index XXXXXXX..XXXXXXX
75
--- /dev/null
76
+++ b/hw/usb/xlnx-usb-subsystem.c
77
@@ -XXX,XX +XXX,XX @@
78
+/*
79
+ * QEMU model of the Xilinx usb subsystem
80
+ *
81
+ * Copyright (c) 2020 Xilinx Inc. Sai Pavan Boddu <sai.pava.boddu@xilinx.com>
82
+ *
83
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
84
+ * of this software and associated documentation files (the "Software"), to deal
85
+ * in the Software without restriction, including without limitation the rights
86
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
87
+ * copies of the Software, and to permit persons to whom the Software is
88
+ * furnished to do so, subject to the following conditions:
89
+ *
90
+ * The above copyright notice and this permission notice shall be included in
91
+ * all copies or substantial portions of the Software.
92
+ *
93
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
94
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
95
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
96
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
97
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
98
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
99
+ * THE SOFTWARE.
100
+ */
101
+
102
+#include "qemu/osdep.h"
103
+#include "hw/sysbus.h"
104
+#include "hw/irq.h"
105
+#include "hw/register.h"
106
+#include "qemu/bitops.h"
107
+#include "qemu/log.h"
108
+#include "qom/object.h"
109
+#include "qapi/error.h"
110
+#include "hw/qdev-properties.h"
111
+#include "hw/usb/xlnx-usb-subsystem.h"
112
+
113
+static void versal_usb2_realize(DeviceState *dev, Error **errp)
114
+{
115
+ VersalUsb2 *s = VERSAL_USB2(dev);
116
+ SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
117
+ Error *err = NULL;
118
+
119
+ sysbus_realize(SYS_BUS_DEVICE(&s->dwc3), &err);
120
+ if (err) {
121
+ error_propagate(errp, err);
122
+ return;
123
+ }
124
+ sysbus_realize(SYS_BUS_DEVICE(&s->usb2Ctrl), &err);
125
+ if (err) {
126
+ error_propagate(errp, err);
127
+ return;
128
+ }
129
+ sysbus_init_mmio(sbd, &s->dwc3_mr);
130
+ sysbus_init_mmio(sbd, &s->usb2Ctrl_mr);
131
+ qdev_pass_gpios(DEVICE(&s->dwc3.sysbus_xhci), dev, SYSBUS_DEVICE_GPIO_IRQ);
132
+}
133
+
134
+static void versal_usb2_init(Object *obj)
135
+{
136
+ VersalUsb2 *s = VERSAL_USB2(obj);
137
+
138
+ object_initialize_child(obj, "versal.dwc3", &s->dwc3,
139
+ TYPE_USB_DWC3);
140
+ object_initialize_child(obj, "versal.usb2-ctrl", &s->usb2Ctrl,
141
+ TYPE_XILINX_VERSAL_USB2_CTRL_REGS);
142
+ memory_region_init_alias(&s->dwc3_mr, obj, "versal.dwc3_alias",
143
+ &s->dwc3.iomem, 0, DWC3_SIZE);
144
+ memory_region_init_alias(&s->usb2Ctrl_mr, obj, "versal.usb2Ctrl_alias",
145
+ &s->usb2Ctrl.iomem, 0, USB2_REGS_R_MAX * 4);
146
+ qdev_alias_all_properties(DEVICE(&s->dwc3), obj);
147
+ qdev_alias_all_properties(DEVICE(&s->dwc3.sysbus_xhci), obj);
148
+ object_property_add_alias(obj, "dma", OBJECT(&s->dwc3.sysbus_xhci), "dma");
149
+}
150
+
151
+static void versal_usb2_class_init(ObjectClass *klass, void *data)
152
+{
153
+ DeviceClass *dc = DEVICE_CLASS(klass);
154
+
155
+ dc->realize = versal_usb2_realize;
156
+}
157
+
158
+static const TypeInfo versal_usb2_info = {
159
+ .name = TYPE_XILINX_VERSAL_USB2,
160
+ .parent = TYPE_SYS_BUS_DEVICE,
161
+ .instance_size = sizeof(VersalUsb2),
162
+ .class_init = versal_usb2_class_init,
163
+ .instance_init = versal_usb2_init,
164
+};
165
+
166
+static void versal_usb_types(void)
167
+{
168
+ type_register_static(&versal_usb2_info);
169
+}
170
+
171
+type_init(versal_usb_types)
172
diff --git a/hw/usb/Kconfig b/hw/usb/Kconfig
12
index XXXXXXX..XXXXXXX 100644
173
index XXXXXXX..XXXXXXX 100644
13
--- a/hw/arm/exynos4_boards.c
174
--- a/hw/usb/Kconfig
14
+++ b/hw/arm/exynos4_boards.c
175
+++ b/hw/usb/Kconfig
15
@@ -XXX,XX +XXX,XX @@
176
@@ -XXX,XX +XXX,XX @@ config USB_DWC3
16
#include "hw/net/lan9118.h"
177
bool
17
#include "hw/boards.h"
178
select USB_XHCI_SYSBUS
18
179
select REGISTER
19
-#undef DEBUG
180
+
20
-
181
+config XLNX_USB_SUBSYS
21
-//#define DEBUG
182
+ bool
22
-
183
+ default y if XLNX_VERSAL
23
-#ifdef DEBUG
184
+ select USB_DWC3
24
- #undef PRINT_DEBUG
185
diff --git a/hw/usb/meson.build b/hw/usb/meson.build
25
- #define PRINT_DEBUG(fmt, args...) \
186
index XXXXXXX..XXXXXXX 100644
26
- do { \
187
--- a/hw/usb/meson.build
27
- fprintf(stderr, " [%s:%d] "fmt, __func__, __LINE__, ##args); \
188
+++ b/hw/usb/meson.build
28
- } while (0)
189
@@ -XXX,XX +XXX,XX @@ softmmu_ss.add(when: 'CONFIG_TUSB6010', if_true: files('tusb6010.c'))
29
-#else
190
softmmu_ss.add(when: 'CONFIG_IMX', if_true: files('chipidea.c'))
30
- #define PRINT_DEBUG(fmt, args...) do {} while (0)
191
softmmu_ss.add(when: 'CONFIG_IMX_USBPHY', if_true: files('imx-usb-phy.c'))
31
-#endif
192
specific_ss.add(when: 'CONFIG_XLNX_VERSAL', if_true: files('xlnx-versal-usb2-ctrl-regs.c'))
32
-
193
+specific_ss.add(when: 'CONFIG_XLNX_USB_SUBSYS', if_true: files('xlnx-usb-subsystem.c'))
33
#define SMDK_LAN9118_BASE_ADDR 0x05000000
194
34
195
# emulated usb devices
35
typedef enum Exynos4BoardType {
196
softmmu_ss.add(when: 'CONFIG_USB', if_true: files('dev-hub.c'))
36
@@ -XXX,XX +XXX,XX @@ exynos4_boards_init_common(MachineState *machine,
37
exynos4_board_binfo.gic_cpu_if_addr =
38
EXYNOS4210_SMP_PRIVATE_BASE_ADDR + 0x100;
39
40
- PRINT_DEBUG("\n ram_size: %luMiB [0x%08lx]\n"
41
- " kernel_filename: %s\n"
42
- " kernel_cmdline: %s\n"
43
- " initrd_filename: %s\n",
44
- exynos4_board_ram_size[board_type] / 1048576,
45
- exynos4_board_ram_size[board_type],
46
- machine->kernel_filename,
47
- machine->kernel_cmdline,
48
- machine->initrd_filename);
49
-
50
exynos4_boards_init_ram(s, get_system_memory(),
51
exynos4_board_ram_size[board_type]);
52
53
--
197
--
54
2.20.1
198
2.20.1
55
199
56
200
diff view generated by jsdifflib
1
The header file hw/arm/arm.h now includes only declarations
1
From: Vikram Garhwal <fnu.vikram@xilinx.com>
2
relating to hw/arm/boot.c functionality. Rename it accordingly,
3
and adjust its header comment.
4
2
5
The bulk of this commit was created via
3
Connect VersalUsb2 subsystem to xlnx-versal SOC, its placed
6
perl -pi -e 's|hw/arm/arm.h|hw/arm/boot.h|' hw/arm/*.c include/hw/arm/*.h
4
in iou of lpd domain and configure it as dual port host controller.
5
Add the respective guest dts nodes for "xlnx-versal-virt" machine.
7
6
8
In a few cases we can just delete the #include:
7
Signed-off-by: Vikram Garhwal <fnu.vikram@xilinx.com>
9
hw/arm/msf2-soc.c, include/hw/arm/aspeed_soc.h and
8
Signed-off-by: Sai Pavan Boddu <sai.pavan.boddu@xilinx.com>
10
include/hw/arm/bcm2836.h did not require it.
9
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
10
Message-id: 1607023357-5096-5-git-send-email-sai.pavan.boddu@xilinx.com
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
13
include/hw/arm/xlnx-versal.h | 9 ++++++
14
hw/arm/xlnx-versal-virt.c | 55 ++++++++++++++++++++++++++++++++++++
15
hw/arm/xlnx-versal.c | 26 +++++++++++++++++
16
3 files changed, 90 insertions(+)
11
17
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
14
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
15
Message-id: 20190516163857.6430-4-peter.maydell@linaro.org
16
---
17
include/hw/arm/allwinner-a10.h | 2 +-
18
include/hw/arm/aspeed_soc.h | 1 -
19
include/hw/arm/bcm2836.h | 1 -
20
include/hw/arm/{arm.h => boot.h} | 8 ++++----
21
include/hw/arm/fsl-imx25.h | 2 +-
22
include/hw/arm/fsl-imx31.h | 2 +-
23
include/hw/arm/fsl-imx6.h | 2 +-
24
include/hw/arm/fsl-imx6ul.h | 2 +-
25
include/hw/arm/fsl-imx7.h | 2 +-
26
include/hw/arm/virt.h | 2 +-
27
include/hw/arm/xlnx-versal.h | 2 +-
28
include/hw/arm/xlnx-zynqmp.h | 2 +-
29
hw/arm/armsse.c | 2 +-
30
hw/arm/armv7m.c | 2 +-
31
hw/arm/aspeed.c | 2 +-
32
hw/arm/boot.c | 2 +-
33
hw/arm/collie.c | 2 +-
34
hw/arm/exynos4210.c | 2 +-
35
hw/arm/exynos4_boards.c | 2 +-
36
hw/arm/highbank.c | 2 +-
37
hw/arm/integratorcp.c | 2 +-
38
hw/arm/mainstone.c | 2 +-
39
hw/arm/microbit.c | 2 +-
40
hw/arm/mps2-tz.c | 2 +-
41
hw/arm/mps2.c | 2 +-
42
hw/arm/msf2-soc.c | 1 -
43
hw/arm/msf2-som.c | 2 +-
44
hw/arm/musca.c | 2 +-
45
hw/arm/musicpal.c | 2 +-
46
hw/arm/netduino2.c | 2 +-
47
hw/arm/nrf51_soc.c | 2 +-
48
hw/arm/nseries.c | 2 +-
49
hw/arm/omap1.c | 2 +-
50
hw/arm/omap2.c | 2 +-
51
hw/arm/omap_sx1.c | 2 +-
52
hw/arm/palm.c | 2 +-
53
hw/arm/raspi.c | 2 +-
54
hw/arm/realview.c | 2 +-
55
hw/arm/spitz.c | 2 +-
56
hw/arm/stellaris.c | 2 +-
57
hw/arm/stm32f205_soc.c | 2 +-
58
hw/arm/strongarm.c | 2 +-
59
hw/arm/tosa.c | 2 +-
60
hw/arm/versatilepb.c | 2 +-
61
hw/arm/vexpress.c | 2 +-
62
hw/arm/virt.c | 2 +-
63
hw/arm/xilinx_zynq.c | 2 +-
64
hw/arm/xlnx-versal.c | 2 +-
65
hw/arm/z2.c | 2 +-
66
49 files changed, 49 insertions(+), 52 deletions(-)
67
rename include/hw/arm/{arm.h => boot.h} (98%)
68
69
diff --git a/include/hw/arm/allwinner-a10.h b/include/hw/arm/allwinner-a10.h
70
index XXXXXXX..XXXXXXX 100644
71
--- a/include/hw/arm/allwinner-a10.h
72
+++ b/include/hw/arm/allwinner-a10.h
73
@@ -XXX,XX +XXX,XX @@
74
#include "qemu-common.h"
75
#include "qemu/error-report.h"
76
#include "hw/char/serial.h"
77
-#include "hw/arm/arm.h"
78
+#include "hw/arm/boot.h"
79
#include "hw/timer/allwinner-a10-pit.h"
80
#include "hw/intc/allwinner-a10-pic.h"
81
#include "hw/net/allwinner_emac.h"
82
diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h
83
index XXXXXXX..XXXXXXX 100644
84
--- a/include/hw/arm/aspeed_soc.h
85
+++ b/include/hw/arm/aspeed_soc.h
86
@@ -XXX,XX +XXX,XX @@
87
#ifndef ASPEED_SOC_H
88
#define ASPEED_SOC_H
89
90
-#include "hw/arm/arm.h"
91
#include "hw/intc/aspeed_vic.h"
92
#include "hw/misc/aspeed_scu.h"
93
#include "hw/misc/aspeed_sdmc.h"
94
diff --git a/include/hw/arm/bcm2836.h b/include/hw/arm/bcm2836.h
95
index XXXXXXX..XXXXXXX 100644
96
--- a/include/hw/arm/bcm2836.h
97
+++ b/include/hw/arm/bcm2836.h
98
@@ -XXX,XX +XXX,XX @@
99
#ifndef BCM2836_H
100
#define BCM2836_H
101
102
-#include "hw/arm/arm.h"
103
#include "hw/arm/bcm2835_peripherals.h"
104
#include "hw/intc/bcm2836_control.h"
105
106
diff --git a/include/hw/arm/arm.h b/include/hw/arm/boot.h
107
similarity index 98%
108
rename from include/hw/arm/arm.h
109
rename to include/hw/arm/boot.h
110
index XXXXXXX..XXXXXXX 100644
111
--- a/include/hw/arm/arm.h
112
+++ b/include/hw/arm/boot.h
113
@@ -XXX,XX +XXX,XX @@
114
/*
115
- * Misc ARM declarations
116
+ * ARM kernel loader.
117
*
118
* Copyright (c) 2006 CodeSourcery.
119
* Written by Paul Brook
120
@@ -XXX,XX +XXX,XX @@
121
*
122
*/
123
124
-#ifndef HW_ARM_H
125
-#define HW_ARM_H
126
+#ifndef HW_ARM_BOOT_H
127
+#define HW_ARM_BOOT_H
128
129
#include "exec/memory.h"
130
#include "target/arm/cpu-qom.h"
131
@@ -XXX,XX +XXX,XX @@ void arm_write_secure_board_setup_dummy_smc(ARMCPU *cpu,
132
const struct arm_boot_info *info,
133
hwaddr mvbar_addr);
134
135
-#endif /* HW_ARM_H */
136
+#endif /* HW_ARM_BOOT_H */
137
diff --git a/include/hw/arm/fsl-imx25.h b/include/hw/arm/fsl-imx25.h
138
index XXXXXXX..XXXXXXX 100644
139
--- a/include/hw/arm/fsl-imx25.h
140
+++ b/include/hw/arm/fsl-imx25.h
141
@@ -XXX,XX +XXX,XX @@
142
#ifndef FSL_IMX25_H
143
#define FSL_IMX25_H
144
145
-#include "hw/arm/arm.h"
146
+#include "hw/arm/boot.h"
147
#include "hw/intc/imx_avic.h"
148
#include "hw/misc/imx25_ccm.h"
149
#include "hw/char/imx_serial.h"
150
diff --git a/include/hw/arm/fsl-imx31.h b/include/hw/arm/fsl-imx31.h
151
index XXXXXXX..XXXXXXX 100644
152
--- a/include/hw/arm/fsl-imx31.h
153
+++ b/include/hw/arm/fsl-imx31.h
154
@@ -XXX,XX +XXX,XX @@
155
#ifndef FSL_IMX31_H
156
#define FSL_IMX31_H
157
158
-#include "hw/arm/arm.h"
159
+#include "hw/arm/boot.h"
160
#include "hw/intc/imx_avic.h"
161
#include "hw/misc/imx31_ccm.h"
162
#include "hw/char/imx_serial.h"
163
diff --git a/include/hw/arm/fsl-imx6.h b/include/hw/arm/fsl-imx6.h
164
index XXXXXXX..XXXXXXX 100644
165
--- a/include/hw/arm/fsl-imx6.h
166
+++ b/include/hw/arm/fsl-imx6.h
167
@@ -XXX,XX +XXX,XX @@
168
#ifndef FSL_IMX6_H
169
#define FSL_IMX6_H
170
171
-#include "hw/arm/arm.h"
172
+#include "hw/arm/boot.h"
173
#include "hw/cpu/a9mpcore.h"
174
#include "hw/misc/imx6_ccm.h"
175
#include "hw/misc/imx6_src.h"
176
diff --git a/include/hw/arm/fsl-imx6ul.h b/include/hw/arm/fsl-imx6ul.h
177
index XXXXXXX..XXXXXXX 100644
178
--- a/include/hw/arm/fsl-imx6ul.h
179
+++ b/include/hw/arm/fsl-imx6ul.h
180
@@ -XXX,XX +XXX,XX @@
181
#ifndef FSL_IMX6UL_H
182
#define FSL_IMX6UL_H
183
184
-#include "hw/arm/arm.h"
185
+#include "hw/arm/boot.h"
186
#include "hw/cpu/a15mpcore.h"
187
#include "hw/misc/imx6ul_ccm.h"
188
#include "hw/misc/imx6_src.h"
189
diff --git a/include/hw/arm/fsl-imx7.h b/include/hw/arm/fsl-imx7.h
190
index XXXXXXX..XXXXXXX 100644
191
--- a/include/hw/arm/fsl-imx7.h
192
+++ b/include/hw/arm/fsl-imx7.h
193
@@ -XXX,XX +XXX,XX @@
194
#ifndef FSL_IMX7_H
195
#define FSL_IMX7_H
196
197
-#include "hw/arm/arm.h"
198
+#include "hw/arm/boot.h"
199
#include "hw/cpu/a15mpcore.h"
200
#include "hw/intc/imx_gpcv2.h"
201
#include "hw/misc/imx7_ccm.h"
202
diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
203
index XXXXXXX..XXXXXXX 100644
204
--- a/include/hw/arm/virt.h
205
+++ b/include/hw/arm/virt.h
206
@@ -XXX,XX +XXX,XX @@
207
#include "exec/hwaddr.h"
208
#include "qemu/notify.h"
209
#include "hw/boards.h"
210
-#include "hw/arm/arm.h"
211
+#include "hw/arm/boot.h"
212
#include "hw/block/flash.h"
213
#include "sysemu/kvm.h"
214
#include "hw/intc/arm_gicv3_common.h"
215
diff --git a/include/hw/arm/xlnx-versal.h b/include/hw/arm/xlnx-versal.h
18
diff --git a/include/hw/arm/xlnx-versal.h b/include/hw/arm/xlnx-versal.h
216
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
217
--- a/include/hw/arm/xlnx-versal.h
20
--- a/include/hw/arm/xlnx-versal.h
218
+++ b/include/hw/arm/xlnx-versal.h
21
+++ b/include/hw/arm/xlnx-versal.h
219
@@ -XXX,XX +XXX,XX @@
22
@@ -XXX,XX +XXX,XX @@
220
#define XLNX_VERSAL_H
23
#include "hw/net/cadence_gem.h"
221
24
#include "hw/rtc/xlnx-zynqmp-rtc.h"
222
#include "hw/sysbus.h"
25
#include "qom/object.h"
223
-#include "hw/arm/arm.h"
26
+#include "hw/usb/xlnx-usb-subsystem.h"
224
+#include "hw/arm/boot.h"
225
#include "hw/intc/arm_gicv3.h"
226
27
227
#define TYPE_XLNX_VERSAL "xlnx-versal"
28
#define TYPE_XLNX_VERSAL "xlnx-versal"
228
diff --git a/include/hw/arm/xlnx-zynqmp.h b/include/hw/arm/xlnx-zynqmp.h
29
OBJECT_DECLARE_SIMPLE_TYPE(Versal, XLNX_VERSAL)
30
@@ -XXX,XX +XXX,XX @@ struct Versal {
31
PL011State uart[XLNX_VERSAL_NR_UARTS];
32
CadenceGEMState gem[XLNX_VERSAL_NR_GEMS];
33
XlnxZDMA adma[XLNX_VERSAL_NR_ADMAS];
34
+ VersalUsb2 usb;
35
} iou;
36
} lpd;
37
38
@@ -XXX,XX +XXX,XX @@ struct Versal {
39
40
#define VERSAL_UART0_IRQ_0 18
41
#define VERSAL_UART1_IRQ_0 19
42
+#define VERSAL_USB0_IRQ_0 22
43
#define VERSAL_GEM0_IRQ_0 56
44
#define VERSAL_GEM0_WAKE_IRQ_0 57
45
#define VERSAL_GEM1_IRQ_0 58
46
@@ -XXX,XX +XXX,XX @@ struct Versal {
47
#define MM_OCM 0xfffc0000U
48
#define MM_OCM_SIZE 0x40000
49
50
+#define MM_USB2_CTRL_REGS 0xFF9D0000
51
+#define MM_USB2_CTRL_REGS_SIZE 0x10000
52
+
53
+#define MM_USB_0 0xFE200000
54
+#define MM_USB_0_SIZE 0x10000
55
+
56
#define MM_TOP_DDR 0x0
57
#define MM_TOP_DDR_SIZE 0x80000000U
58
#define MM_TOP_DDR_2 0x800000000ULL
59
diff --git a/hw/arm/xlnx-versal-virt.c b/hw/arm/xlnx-versal-virt.c
229
index XXXXXXX..XXXXXXX 100644
60
index XXXXXXX..XXXXXXX 100644
230
--- a/include/hw/arm/xlnx-zynqmp.h
61
--- a/hw/arm/xlnx-versal-virt.c
231
+++ b/include/hw/arm/xlnx-zynqmp.h
62
+++ b/hw/arm/xlnx-versal-virt.c
232
@@ -XXX,XX +XXX,XX @@
63
@@ -XXX,XX +XXX,XX @@ struct VersalVirt {
233
#ifndef XLNX_ZYNQMP_H
64
uint32_t ethernet_phy[2];
234
65
uint32_t clk_125Mhz;
235
#include "qemu-common.h"
66
uint32_t clk_25Mhz;
236
-#include "hw/arm/arm.h"
67
+ uint32_t usb;
237
+#include "hw/arm/boot.h"
68
+ uint32_t dwc;
238
#include "hw/intc/arm_gic.h"
69
} phandle;
239
#include "hw/net/cadence_gem.h"
70
struct arm_boot_info binfo;
240
#include "hw/char/cadence_uart.h"
71
241
diff --git a/hw/arm/armsse.c b/hw/arm/armsse.c
72
@@ -XXX,XX +XXX,XX @@ static void fdt_create(VersalVirt *s)
242
index XXXXXXX..XXXXXXX 100644
73
s->phandle.clk_25Mhz = qemu_fdt_alloc_phandle(s->fdt);
243
--- a/hw/arm/armsse.c
74
s->phandle.clk_125Mhz = qemu_fdt_alloc_phandle(s->fdt);
244
+++ b/hw/arm/armsse.c
75
245
@@ -XXX,XX +XXX,XX @@
76
+ s->phandle.usb = qemu_fdt_alloc_phandle(s->fdt);
246
#include "hw/sysbus.h"
77
+ s->phandle.dwc = qemu_fdt_alloc_phandle(s->fdt);
247
#include "hw/registerfields.h"
78
/* Create /chosen node for load_dtb. */
248
#include "hw/arm/armsse.h"
79
qemu_fdt_add_subnode(s->fdt, "/chosen");
249
-#include "hw/arm/arm.h"
80
250
+#include "hw/arm/boot.h"
81
@@ -XXX,XX +XXX,XX @@ static void fdt_add_timer_nodes(VersalVirt *s)
251
82
compat, sizeof(compat));
252
/* Format of the System Information block SYS_CONFIG register */
83
}
253
typedef enum SysConfigFormat {
84
254
diff --git a/hw/arm/armv7m.c b/hw/arm/armv7m.c
85
+static void fdt_add_usb_xhci_nodes(VersalVirt *s)
255
index XXXXXXX..XXXXXXX 100644
86
+{
256
--- a/hw/arm/armv7m.c
87
+ const char clocknames[] = "bus_clk\0ref_clk";
257
+++ b/hw/arm/armv7m.c
88
+ const char irq_name[] = "dwc_usb3";
258
@@ -XXX,XX +XXX,XX @@
89
+ const char compatVersalDWC3[] = "xlnx,versal-dwc3";
259
#include "qemu-common.h"
90
+ const char compatDWC3[] = "snps,dwc3";
260
#include "cpu.h"
91
+ char *name = g_strdup_printf("/usb@%" PRIx32, MM_USB2_CTRL_REGS);
261
#include "hw/sysbus.h"
92
+
262
-#include "hw/arm/arm.h"
93
+ qemu_fdt_add_subnode(s->fdt, name);
263
+#include "hw/arm/boot.h"
94
+ qemu_fdt_setprop(s->fdt, name, "compatible",
264
#include "hw/loader.h"
95
+ compatVersalDWC3, sizeof(compatVersalDWC3));
265
#include "elf.h"
96
+ qemu_fdt_setprop_sized_cells(s->fdt, name, "reg",
266
#include "sysemu/qtest.h"
97
+ 2, MM_USB2_CTRL_REGS,
267
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
98
+ 2, MM_USB2_CTRL_REGS_SIZE);
268
index XXXXXXX..XXXXXXX 100644
99
+ qemu_fdt_setprop(s->fdt, name, "clock-names",
269
--- a/hw/arm/aspeed.c
100
+ clocknames, sizeof(clocknames));
270
+++ b/hw/arm/aspeed.c
101
+ qemu_fdt_setprop_cells(s->fdt, name, "clocks",
271
@@ -XXX,XX +XXX,XX @@
102
+ s->phandle.clk_25Mhz, s->phandle.clk_125Mhz);
272
#include "qemu-common.h"
103
+ qemu_fdt_setprop(s->fdt, name, "ranges", NULL, 0);
273
#include "cpu.h"
104
+ qemu_fdt_setprop_cell(s->fdt, name, "#address-cells", 2);
274
#include "exec/address-spaces.h"
105
+ qemu_fdt_setprop_cell(s->fdt, name, "#size-cells", 2);
275
-#include "hw/arm/arm.h"
106
+ qemu_fdt_setprop_cell(s->fdt, name, "phandle", s->phandle.usb);
276
+#include "hw/arm/boot.h"
107
+ g_free(name);
277
#include "hw/arm/aspeed.h"
108
+
278
#include "hw/arm/aspeed_soc.h"
109
+ name = g_strdup_printf("/usb@%" PRIx32 "/dwc3@%" PRIx32,
279
#include "hw/boards.h"
110
+ MM_USB2_CTRL_REGS, MM_USB_0);
280
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
111
+ qemu_fdt_add_subnode(s->fdt, name);
281
index XXXXXXX..XXXXXXX 100644
112
+ qemu_fdt_setprop(s->fdt, name, "compatible",
282
--- a/hw/arm/boot.c
113
+ compatDWC3, sizeof(compatDWC3));
283
+++ b/hw/arm/boot.c
114
+ qemu_fdt_setprop_sized_cells(s->fdt, name, "reg",
284
@@ -XXX,XX +XXX,XX @@
115
+ 2, MM_USB_0, 2, MM_USB_0_SIZE);
285
#include "qapi/error.h"
116
+ qemu_fdt_setprop(s->fdt, name, "interrupt-names",
286
#include <libfdt.h>
117
+ irq_name, sizeof(irq_name));
287
#include "hw/hw.h"
118
+ qemu_fdt_setprop_cells(s->fdt, name, "interrupts",
288
-#include "hw/arm/arm.h"
119
+ GIC_FDT_IRQ_TYPE_SPI, VERSAL_USB0_IRQ_0,
289
+#include "hw/arm/boot.h"
120
+ GIC_FDT_IRQ_FLAGS_LEVEL_HI);
290
#include "hw/arm/linux-boot-if.h"
121
+ qemu_fdt_setprop_cell(s->fdt, name,
291
#include "sysemu/kvm.h"
122
+ "snps,quirk-frame-length-adjustment", 0x20);
292
#include "sysemu/sysemu.h"
123
+ qemu_fdt_setprop_cells(s->fdt, name, "#stream-id-cells", 1);
293
diff --git a/hw/arm/collie.c b/hw/arm/collie.c
124
+ qemu_fdt_setprop_string(s->fdt, name, "dr_mode", "host");
294
index XXXXXXX..XXXXXXX 100644
125
+ qemu_fdt_setprop_string(s->fdt, name, "phy-names", "usb3-phy");
295
--- a/hw/arm/collie.c
126
+ qemu_fdt_setprop(s->fdt, name, "snps,dis_u2_susphy_quirk", NULL, 0);
296
+++ b/hw/arm/collie.c
127
+ qemu_fdt_setprop(s->fdt, name, "snps,dis_u3_susphy_quirk", NULL, 0);
297
@@ -XXX,XX +XXX,XX @@
128
+ qemu_fdt_setprop(s->fdt, name, "snps,refclk_fladj", NULL, 0);
298
#include "hw/sysbus.h"
129
+ qemu_fdt_setprop(s->fdt, name, "snps,mask_phy_reset", NULL, 0);
299
#include "hw/boards.h"
130
+ qemu_fdt_setprop_cell(s->fdt, name, "phandle", s->phandle.dwc);
300
#include "strongarm.h"
131
+ qemu_fdt_setprop_string(s->fdt, name, "maximum-speed", "high-speed");
301
-#include "hw/arm/arm.h"
132
+ g_free(name);
302
+#include "hw/arm/boot.h"
133
+}
303
#include "hw/block/flash.h"
134
+
304
#include "exec/address-spaces.h"
135
static void fdt_add_uart_nodes(VersalVirt *s)
305
#include "cpu.h"
306
diff --git a/hw/arm/exynos4210.c b/hw/arm/exynos4210.c
307
index XXXXXXX..XXXXXXX 100644
308
--- a/hw/arm/exynos4210.c
309
+++ b/hw/arm/exynos4210.c
310
@@ -XXX,XX +XXX,XX @@
311
#include "hw/boards.h"
312
#include "sysemu/sysemu.h"
313
#include "hw/sysbus.h"
314
-#include "hw/arm/arm.h"
315
+#include "hw/arm/boot.h"
316
#include "hw/loader.h"
317
#include "hw/arm/exynos4210.h"
318
#include "hw/sd/sdhci.h"
319
diff --git a/hw/arm/exynos4_boards.c b/hw/arm/exynos4_boards.c
320
index XXXXXXX..XXXXXXX 100644
321
--- a/hw/arm/exynos4_boards.c
322
+++ b/hw/arm/exynos4_boards.c
323
@@ -XXX,XX +XXX,XX @@
324
#include "sysemu/sysemu.h"
325
#include "hw/sysbus.h"
326
#include "net/net.h"
327
-#include "hw/arm/arm.h"
328
+#include "hw/arm/boot.h"
329
#include "exec/address-spaces.h"
330
#include "hw/arm/exynos4210.h"
331
#include "hw/net/lan9118.h"
332
diff --git a/hw/arm/highbank.c b/hw/arm/highbank.c
333
index XXXXXXX..XXXXXXX 100644
334
--- a/hw/arm/highbank.c
335
+++ b/hw/arm/highbank.c
336
@@ -XXX,XX +XXX,XX @@
337
#include "qemu/osdep.h"
338
#include "qapi/error.h"
339
#include "hw/sysbus.h"
340
-#include "hw/arm/arm.h"
341
+#include "hw/arm/boot.h"
342
#include "hw/loader.h"
343
#include "net/net.h"
344
#include "sysemu/kvm.h"
345
diff --git a/hw/arm/integratorcp.c b/hw/arm/integratorcp.c
346
index XXXXXXX..XXXXXXX 100644
347
--- a/hw/arm/integratorcp.c
348
+++ b/hw/arm/integratorcp.c
349
@@ -XXX,XX +XXX,XX @@
350
#include "cpu.h"
351
#include "hw/sysbus.h"
352
#include "hw/boards.h"
353
-#include "hw/arm/arm.h"
354
+#include "hw/arm/boot.h"
355
#include "hw/misc/arm_integrator_debug.h"
356
#include "hw/net/smc91c111.h"
357
#include "net/net.h"
358
diff --git a/hw/arm/mainstone.c b/hw/arm/mainstone.c
359
index XXXXXXX..XXXXXXX 100644
360
--- a/hw/arm/mainstone.c
361
+++ b/hw/arm/mainstone.c
362
@@ -XXX,XX +XXX,XX @@
363
#include "qapi/error.h"
364
#include "hw/hw.h"
365
#include "hw/arm/pxa.h"
366
-#include "hw/arm/arm.h"
367
+#include "hw/arm/boot.h"
368
#include "net/net.h"
369
#include "hw/net/smc91c111.h"
370
#include "hw/boards.h"
371
diff --git a/hw/arm/microbit.c b/hw/arm/microbit.c
372
index XXXXXXX..XXXXXXX 100644
373
--- a/hw/arm/microbit.c
374
+++ b/hw/arm/microbit.c
375
@@ -XXX,XX +XXX,XX @@
376
#include "qemu/osdep.h"
377
#include "qapi/error.h"
378
#include "hw/boards.h"
379
-#include "hw/arm/arm.h"
380
+#include "hw/arm/boot.h"
381
#include "sysemu/sysemu.h"
382
#include "exec/address-spaces.h"
383
384
diff --git a/hw/arm/mps2-tz.c b/hw/arm/mps2-tz.c
385
index XXXXXXX..XXXXXXX 100644
386
--- a/hw/arm/mps2-tz.c
387
+++ b/hw/arm/mps2-tz.c
388
@@ -XXX,XX +XXX,XX @@
389
#include "qemu/osdep.h"
390
#include "qapi/error.h"
391
#include "qemu/error-report.h"
392
-#include "hw/arm/arm.h"
393
+#include "hw/arm/boot.h"
394
#include "hw/arm/armv7m.h"
395
#include "hw/or-irq.h"
396
#include "hw/boards.h"
397
diff --git a/hw/arm/mps2.c b/hw/arm/mps2.c
398
index XXXXXXX..XXXXXXX 100644
399
--- a/hw/arm/mps2.c
400
+++ b/hw/arm/mps2.c
401
@@ -XXX,XX +XXX,XX @@
402
#include "qemu/osdep.h"
403
#include "qapi/error.h"
404
#include "qemu/error-report.h"
405
-#include "hw/arm/arm.h"
406
+#include "hw/arm/boot.h"
407
#include "hw/arm/armv7m.h"
408
#include "hw/or-irq.h"
409
#include "hw/boards.h"
410
diff --git a/hw/arm/msf2-soc.c b/hw/arm/msf2-soc.c
411
index XXXXXXX..XXXXXXX 100644
412
--- a/hw/arm/msf2-soc.c
413
+++ b/hw/arm/msf2-soc.c
414
@@ -XXX,XX +XXX,XX @@
415
#include "qemu/units.h"
416
#include "qapi/error.h"
417
#include "qemu-common.h"
418
-#include "hw/arm/arm.h"
419
#include "exec/address-spaces.h"
420
#include "hw/char/serial.h"
421
#include "hw/boards.h"
422
diff --git a/hw/arm/msf2-som.c b/hw/arm/msf2-som.c
423
index XXXXXXX..XXXXXXX 100644
424
--- a/hw/arm/msf2-som.c
425
+++ b/hw/arm/msf2-som.c
426
@@ -XXX,XX +XXX,XX @@
427
#include "qapi/error.h"
428
#include "qemu/error-report.h"
429
#include "hw/boards.h"
430
-#include "hw/arm/arm.h"
431
+#include "hw/arm/boot.h"
432
#include "exec/address-spaces.h"
433
#include "hw/arm/msf2-soc.h"
434
#include "cpu.h"
435
diff --git a/hw/arm/musca.c b/hw/arm/musca.c
436
index XXXXXXX..XXXXXXX 100644
437
--- a/hw/arm/musca.c
438
+++ b/hw/arm/musca.c
439
@@ -XXX,XX +XXX,XX @@
440
#include "qapi/error.h"
441
#include "exec/address-spaces.h"
442
#include "sysemu/sysemu.h"
443
-#include "hw/arm/arm.h"
444
+#include "hw/arm/boot.h"
445
#include "hw/arm/armsse.h"
446
#include "hw/boards.h"
447
#include "hw/char/pl011.h"
448
diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c
449
index XXXXXXX..XXXXXXX 100644
450
--- a/hw/arm/musicpal.c
451
+++ b/hw/arm/musicpal.c
452
@@ -XXX,XX +XXX,XX @@
453
#include "qemu-common.h"
454
#include "cpu.h"
455
#include "hw/sysbus.h"
456
-#include "hw/arm/arm.h"
457
+#include "hw/arm/boot.h"
458
#include "net/net.h"
459
#include "sysemu/sysemu.h"
460
#include "hw/boards.h"
461
diff --git a/hw/arm/netduino2.c b/hw/arm/netduino2.c
462
index XXXXXXX..XXXXXXX 100644
463
--- a/hw/arm/netduino2.c
464
+++ b/hw/arm/netduino2.c
465
@@ -XXX,XX +XXX,XX @@
466
#include "hw/boards.h"
467
#include "qemu/error-report.h"
468
#include "hw/arm/stm32f205_soc.h"
469
-#include "hw/arm/arm.h"
470
+#include "hw/arm/boot.h"
471
472
static void netduino2_init(MachineState *machine)
473
{
136
{
474
diff --git a/hw/arm/nrf51_soc.c b/hw/arm/nrf51_soc.c
137
uint64_t addrs[] = { MM_UART1, MM_UART0 };
475
index XXXXXXX..XXXXXXX 100644
138
@@ -XXX,XX +XXX,XX @@ static void versal_virt_init(MachineState *machine)
476
--- a/hw/arm/nrf51_soc.c
139
fdt_add_gic_nodes(s);
477
+++ b/hw/arm/nrf51_soc.c
140
fdt_add_timer_nodes(s);
478
@@ -XXX,XX +XXX,XX @@
141
fdt_add_zdma_nodes(s);
479
#include "qemu/osdep.h"
142
+ fdt_add_usb_xhci_nodes(s);
480
#include "qapi/error.h"
143
fdt_add_sd_nodes(s);
481
#include "qemu-common.h"
144
fdt_add_rtc_node(s);
482
-#include "hw/arm/arm.h"
145
fdt_add_cpu_nodes(s, psci_conduit);
483
+#include "hw/arm/boot.h"
484
#include "hw/sysbus.h"
485
#include "hw/boards.h"
486
#include "hw/misc/unimp.h"
487
diff --git a/hw/arm/nseries.c b/hw/arm/nseries.c
488
index XXXXXXX..XXXXXXX 100644
489
--- a/hw/arm/nseries.c
490
+++ b/hw/arm/nseries.c
491
@@ -XXX,XX +XXX,XX @@
492
#include "qemu/bswap.h"
493
#include "sysemu/sysemu.h"
494
#include "hw/arm/omap.h"
495
-#include "hw/arm/arm.h"
496
+#include "hw/arm/boot.h"
497
#include "hw/irq.h"
498
#include "ui/console.h"
499
#include "hw/boards.h"
500
diff --git a/hw/arm/omap1.c b/hw/arm/omap1.c
501
index XXXXXXX..XXXXXXX 100644
502
--- a/hw/arm/omap1.c
503
+++ b/hw/arm/omap1.c
504
@@ -XXX,XX +XXX,XX @@
505
#include "cpu.h"
506
#include "hw/boards.h"
507
#include "hw/hw.h"
508
-#include "hw/arm/arm.h"
509
+#include "hw/arm/boot.h"
510
#include "hw/arm/omap.h"
511
#include "sysemu/sysemu.h"
512
#include "hw/arm/soc_dma.h"
513
diff --git a/hw/arm/omap2.c b/hw/arm/omap2.c
514
index XXXXXXX..XXXXXXX 100644
515
--- a/hw/arm/omap2.c
516
+++ b/hw/arm/omap2.c
517
@@ -XXX,XX +XXX,XX @@
518
#include "sysemu/qtest.h"
519
#include "hw/boards.h"
520
#include "hw/hw.h"
521
-#include "hw/arm/arm.h"
522
+#include "hw/arm/boot.h"
523
#include "hw/arm/omap.h"
524
#include "sysemu/sysemu.h"
525
#include "qemu/timer.h"
526
diff --git a/hw/arm/omap_sx1.c b/hw/arm/omap_sx1.c
527
index XXXXXXX..XXXXXXX 100644
528
--- a/hw/arm/omap_sx1.c
529
+++ b/hw/arm/omap_sx1.c
530
@@ -XXX,XX +XXX,XX @@
531
#include "ui/console.h"
532
#include "hw/arm/omap.h"
533
#include "hw/boards.h"
534
-#include "hw/arm/arm.h"
535
+#include "hw/arm/boot.h"
536
#include "hw/block/flash.h"
537
#include "sysemu/qtest.h"
538
#include "exec/address-spaces.h"
539
diff --git a/hw/arm/palm.c b/hw/arm/palm.c
540
index XXXXXXX..XXXXXXX 100644
541
--- a/hw/arm/palm.c
542
+++ b/hw/arm/palm.c
543
@@ -XXX,XX +XXX,XX @@
544
#include "ui/console.h"
545
#include "hw/arm/omap.h"
546
#include "hw/boards.h"
547
-#include "hw/arm/arm.h"
548
+#include "hw/arm/boot.h"
549
#include "hw/input/tsc2xxx.h"
550
#include "hw/loader.h"
551
#include "exec/address-spaces.h"
552
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
553
index XXXXXXX..XXXXXXX 100644
554
--- a/hw/arm/raspi.c
555
+++ b/hw/arm/raspi.c
556
@@ -XXX,XX +XXX,XX @@
557
#include "qemu/error-report.h"
558
#include "hw/boards.h"
559
#include "hw/loader.h"
560
-#include "hw/arm/arm.h"
561
+#include "hw/arm/boot.h"
562
#include "sysemu/sysemu.h"
563
564
#define SMPBOOT_ADDR 0x300 /* this should leave enough space for ATAGS */
565
diff --git a/hw/arm/realview.c b/hw/arm/realview.c
566
index XXXXXXX..XXXXXXX 100644
567
--- a/hw/arm/realview.c
568
+++ b/hw/arm/realview.c
569
@@ -XXX,XX +XXX,XX @@
570
#include "qemu-common.h"
571
#include "cpu.h"
572
#include "hw/sysbus.h"
573
-#include "hw/arm/arm.h"
574
+#include "hw/arm/boot.h"
575
#include "hw/arm/primecell.h"
576
#include "hw/net/lan9118.h"
577
#include "hw/net/smc91c111.h"
578
diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
579
index XXXXXXX..XXXXXXX 100644
580
--- a/hw/arm/spitz.c
581
+++ b/hw/arm/spitz.c
582
@@ -XXX,XX +XXX,XX @@
583
#include "qapi/error.h"
584
#include "hw/hw.h"
585
#include "hw/arm/pxa.h"
586
-#include "hw/arm/arm.h"
587
+#include "hw/arm/boot.h"
588
#include "sysemu/sysemu.h"
589
#include "hw/pcmcia.h"
590
#include "hw/i2c/i2c.h"
591
diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
592
index XXXXXXX..XXXXXXX 100644
593
--- a/hw/arm/stellaris.c
594
+++ b/hw/arm/stellaris.c
595
@@ -XXX,XX +XXX,XX @@
596
#include "qapi/error.h"
597
#include "hw/sysbus.h"
598
#include "hw/ssi/ssi.h"
599
-#include "hw/arm/arm.h"
600
+#include "hw/arm/boot.h"
601
#include "qemu/timer.h"
602
#include "hw/i2c/i2c.h"
603
#include "net/net.h"
604
diff --git a/hw/arm/stm32f205_soc.c b/hw/arm/stm32f205_soc.c
605
index XXXXXXX..XXXXXXX 100644
606
--- a/hw/arm/stm32f205_soc.c
607
+++ b/hw/arm/stm32f205_soc.c
608
@@ -XXX,XX +XXX,XX @@
609
#include "qemu/osdep.h"
610
#include "qapi/error.h"
611
#include "qemu-common.h"
612
-#include "hw/arm/arm.h"
613
+#include "hw/arm/boot.h"
614
#include "exec/address-spaces.h"
615
#include "hw/arm/stm32f205_soc.h"
616
617
diff --git a/hw/arm/strongarm.c b/hw/arm/strongarm.c
618
index XXXXXXX..XXXXXXX 100644
619
--- a/hw/arm/strongarm.c
620
+++ b/hw/arm/strongarm.c
621
@@ -XXX,XX +XXX,XX @@
622
#include "hw/sysbus.h"
623
#include "strongarm.h"
624
#include "qemu/error-report.h"
625
-#include "hw/arm/arm.h"
626
+#include "hw/arm/boot.h"
627
#include "chardev/char-fe.h"
628
#include "chardev/char-serial.h"
629
#include "sysemu/sysemu.h"
630
diff --git a/hw/arm/tosa.c b/hw/arm/tosa.c
631
index XXXXXXX..XXXXXXX 100644
632
--- a/hw/arm/tosa.c
633
+++ b/hw/arm/tosa.c
634
@@ -XXX,XX +XXX,XX @@
635
#include "qapi/error.h"
636
#include "hw/hw.h"
637
#include "hw/arm/pxa.h"
638
-#include "hw/arm/arm.h"
639
+#include "hw/arm/boot.h"
640
#include "hw/arm/sharpsl.h"
641
#include "hw/pcmcia.h"
642
#include "hw/boards.h"
643
diff --git a/hw/arm/versatilepb.c b/hw/arm/versatilepb.c
644
index XXXXXXX..XXXXXXX 100644
645
--- a/hw/arm/versatilepb.c
646
+++ b/hw/arm/versatilepb.c
647
@@ -XXX,XX +XXX,XX @@
648
#include "qemu-common.h"
649
#include "cpu.h"
650
#include "hw/sysbus.h"
651
-#include "hw/arm/arm.h"
652
+#include "hw/arm/boot.h"
653
#include "hw/net/smc91c111.h"
654
#include "net/net.h"
655
#include "sysemu/sysemu.h"
656
diff --git a/hw/arm/vexpress.c b/hw/arm/vexpress.c
657
index XXXXXXX..XXXXXXX 100644
658
--- a/hw/arm/vexpress.c
659
+++ b/hw/arm/vexpress.c
660
@@ -XXX,XX +XXX,XX @@
661
#include "qemu-common.h"
662
#include "cpu.h"
663
#include "hw/sysbus.h"
664
-#include "hw/arm/arm.h"
665
+#include "hw/arm/boot.h"
666
#include "hw/arm/primecell.h"
667
#include "hw/net/lan9118.h"
668
#include "hw/i2c/i2c.h"
669
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
670
index XXXXXXX..XXXXXXX 100644
671
--- a/hw/arm/virt.c
672
+++ b/hw/arm/virt.c
673
@@ -XXX,XX +XXX,XX @@
674
#include "qemu/option.h"
675
#include "qapi/error.h"
676
#include "hw/sysbus.h"
677
-#include "hw/arm/arm.h"
678
+#include "hw/arm/boot.h"
679
#include "hw/arm/primecell.h"
680
#include "hw/arm/virt.h"
681
#include "hw/block/flash.h"
682
diff --git a/hw/arm/xilinx_zynq.c b/hw/arm/xilinx_zynq.c
683
index XXXXXXX..XXXXXXX 100644
684
--- a/hw/arm/xilinx_zynq.c
685
+++ b/hw/arm/xilinx_zynq.c
686
@@ -XXX,XX +XXX,XX @@
687
#include "qemu-common.h"
688
#include "cpu.h"
689
#include "hw/sysbus.h"
690
-#include "hw/arm/arm.h"
691
+#include "hw/arm/boot.h"
692
#include "net/net.h"
693
#include "exec/address-spaces.h"
694
#include "sysemu/sysemu.h"
695
diff --git a/hw/arm/xlnx-versal.c b/hw/arm/xlnx-versal.c
146
diff --git a/hw/arm/xlnx-versal.c b/hw/arm/xlnx-versal.c
696
index XXXXXXX..XXXXXXX 100644
147
index XXXXXXX..XXXXXXX 100644
697
--- a/hw/arm/xlnx-versal.c
148
--- a/hw/arm/xlnx-versal.c
698
+++ b/hw/arm/xlnx-versal.c
149
+++ b/hw/arm/xlnx-versal.c
699
@@ -XXX,XX +XXX,XX @@
150
@@ -XXX,XX +XXX,XX @@ static void versal_create_uarts(Versal *s, qemu_irq *pic)
700
#include "net/net.h"
151
}
701
#include "sysemu/sysemu.h"
152
}
702
#include "sysemu/kvm.h"
153
703
-#include "hw/arm/arm.h"
154
+static void versal_create_usbs(Versal *s, qemu_irq *pic)
704
+#include "hw/arm/boot.h"
155
+{
705
#include "kvm_arm.h"
156
+ DeviceState *dev;
706
#include "hw/misc/unimp.h"
157
+ MemoryRegion *mr;
707
#include "hw/intc/arm_gicv3_common.h"
158
+
708
diff --git a/hw/arm/z2.c b/hw/arm/z2.c
159
+ object_initialize_child(OBJECT(s), "usb2", &s->lpd.iou.usb,
709
index XXXXXXX..XXXXXXX 100644
160
+ TYPE_XILINX_VERSAL_USB2);
710
--- a/hw/arm/z2.c
161
+ dev = DEVICE(&s->lpd.iou.usb);
711
+++ b/hw/arm/z2.c
162
+
712
@@ -XXX,XX +XXX,XX @@
163
+ object_property_set_link(OBJECT(dev), "dma", OBJECT(&s->mr_ps),
713
#include "qemu/osdep.h"
164
+ &error_abort);
714
#include "hw/hw.h"
165
+ qdev_prop_set_uint32(dev, "intrs", 1);
715
#include "hw/arm/pxa.h"
166
+ qdev_prop_set_uint32(dev, "slots", 2);
716
-#include "hw/arm/arm.h"
167
+
717
+#include "hw/arm/boot.h"
168
+ sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
718
#include "hw/i2c/i2c.h"
169
+
719
#include "hw/ssi/ssi.h"
170
+ mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0);
720
#include "hw/boards.h"
171
+ memory_region_add_subregion(&s->mr_ps, MM_USB_0, mr);
172
+
173
+ sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, pic[VERSAL_USB0_IRQ_0]);
174
+
175
+ mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 1);
176
+ memory_region_add_subregion(&s->mr_ps, MM_USB2_CTRL_REGS, mr);
177
+}
178
+
179
static void versal_create_gems(Versal *s, qemu_irq *pic)
180
{
181
int i;
182
@@ -XXX,XX +XXX,XX @@ static void versal_realize(DeviceState *dev, Error **errp)
183
versal_create_apu_cpus(s);
184
versal_create_apu_gic(s, pic);
185
versal_create_uarts(s, pic);
186
+ versal_create_usbs(s, pic);
187
versal_create_gems(s, pic);
188
versal_create_admas(s, pic);
189
versal_create_sds(s, pic);
721
--
190
--
722
2.20.1
191
2.20.1
723
192
724
193
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
2
3
The mask implied by the extract is redundant with the one
3
Malicious user can set the feedback divisor for the PLLs
4
implied by the deposit. Also, fix spelling of BFXIL.
4
to zero, triggering a floating-point exception (SIGFPE).
5
5
6
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
As the datasheet [*] is not clear how hardware behaves
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
when these bits are zeroes, use the maximum divisor
8
Message-id: 20190514011129.11330-3-richard.henderson@linaro.org
8
possible (128) to avoid the software FPE.
9
10
[*] Zynq-7000 TRM, UG585 (v1.12.2)
11
B.28 System Level Control Registers (slcr)
12
-> "Register (slcr) ARM_PLL_CTRL"
13
25.10.4 PLLs
14
-> "Software-Controlled PLL Update"
15
16
Fixes: 38867cb7ec9 ("hw/misc/zynq_slcr: add clock generation for uarts")
17
Reported-by: Gaoning Pan <pgn@zju.edu.cn>
18
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
19
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
20
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
21
Reviewed-by: Damien Hedde <damien.hedde@greensocs.com>
22
Message-id: 20201210141610.884600-1-f4bug@amsat.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
23
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
24
---
11
target/arm/translate-a64.c | 6 +++---
25
hw/misc/zynq_slcr.c | 5 +++++
12
1 file changed, 3 insertions(+), 3 deletions(-)
26
1 file changed, 5 insertions(+)
13
27
14
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
28
diff --git a/hw/misc/zynq_slcr.c b/hw/misc/zynq_slcr.c
15
index XXXXXXX..XXXXXXX 100644
29
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-a64.c
30
--- a/hw/misc/zynq_slcr.c
17
+++ b/target/arm/translate-a64.c
31
+++ b/hw/misc/zynq_slcr.c
18
@@ -XXX,XX +XXX,XX @@ static void disas_bitfield(DisasContext *s, uint32_t insn)
32
@@ -XXX,XX +XXX,XX @@ static uint64_t zynq_slcr_compute_pll(uint64_t input, uint32_t ctrl_reg)
19
tcg_gen_extract_i64(tcg_rd, tcg_tmp, ri, len);
33
return 0;
20
return;
21
}
22
- /* opc == 1, BXFIL fall through to deposit */
23
- tcg_gen_extract_i64(tcg_tmp, tcg_tmp, ri, len);
24
+ /* opc == 1, BFXIL fall through to deposit */
25
+ tcg_gen_shri_i64(tcg_tmp, tcg_tmp, ri);
26
pos = 0;
27
} else {
28
/* Handle the ri > si case with a deposit
29
@@ -XXX,XX +XXX,XX @@ static void disas_bitfield(DisasContext *s, uint32_t insn)
30
len = ri;
31
}
34
}
32
35
33
- if (opc == 1) { /* BFM, BXFIL */
36
+ /* Consider zero feedback as maximum divide ratio possible */
34
+ if (opc == 1) { /* BFM, BFXIL */
37
+ if (!mult) {
35
tcg_gen_deposit_i64(tcg_rd, tcg_rd, tcg_tmp, pos, len);
38
+ mult = 1 << R_xxx_PLL_CTRL_PLL_FPDIV_LENGTH;
36
} else {
39
+ }
37
/* SBFM or UBFM: We start with zero, and we haven't modified
40
+
41
/* frequency multiplier -> period division */
42
return input / mult;
43
}
38
--
44
--
39
2.20.1
45
2.20.1
40
46
41
47
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
1
From: Joe Komlodi <joe.komlodi@xilinx.com>
2
2
3
It eases code review, unit is explicit.
3
The previous naming of the configuration registers made it sound like that if
4
the bits were set the settings would be enabled, while the opposite is true.
4
5
5
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
6
Signed-off-by: Joe Komlodi <komlodi@xilinx.com>
6
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
7
Reviewed-by: Francisco Iglesias <francisco.iglesias@xilinx.com>
7
Message-id: 20190520214342.13709-3-philmd@redhat.com
8
Message-id: 1605568264-26376-2-git-send-email-komlodi@xilinx.com
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
10
---
10
hw/arm/exynos4_boards.c | 5 +++--
11
hw/block/m25p80.c | 12 ++++++------
11
1 file changed, 3 insertions(+), 2 deletions(-)
12
1 file changed, 6 insertions(+), 6 deletions(-)
12
13
13
diff --git a/hw/arm/exynos4_boards.c b/hw/arm/exynos4_boards.c
14
diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
14
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/arm/exynos4_boards.c
16
--- a/hw/block/m25p80.c
16
+++ b/hw/arm/exynos4_boards.c
17
+++ b/hw/block/m25p80.c
17
@@ -XXX,XX +XXX,XX @@
18
@@ -XXX,XX +XXX,XX @@ typedef struct FlashPartInfo {
18
*/
19
#define VCFG_WRAP_SEQUENTIAL 0x2
19
20
#define NVCFG_XIP_MODE_DISABLED (7 << 9)
20
#include "qemu/osdep.h"
21
#define NVCFG_XIP_MODE_MASK (7 << 9)
21
+#include "qemu/units.h"
22
-#define VCFG_XIP_MODE_ENABLED (1 << 3)
22
#include "qapi/error.h"
23
+#define VCFG_XIP_MODE_DISABLED (1 << 3)
23
#include "qemu/error-report.h"
24
#define CFG_DUMMY_CLK_LEN 4
24
#include "qemu-common.h"
25
#define NVCFG_DUMMY_CLK_POS 12
25
@@ -XXX,XX +XXX,XX @@ static int exynos4_board_smp_bootreg_addr[EXYNOS4_NUM_OF_BOARDS] = {
26
#define VCFG_DUMMY_CLK_POS 4
26
};
27
@@ -XXX,XX +XXX,XX @@ typedef struct FlashPartInfo {
27
28
#define EVCFG_VPP_ACCELERATOR (1 << 3)
28
static unsigned long exynos4_board_ram_size[EXYNOS4_NUM_OF_BOARDS] = {
29
#define EVCFG_RESET_HOLD_ENABLED (1 << 4)
29
- [EXYNOS4_BOARD_NURI] = 0x40000000,
30
#define NVCFG_DUAL_IO_MASK (1 << 2)
30
- [EXYNOS4_BOARD_SMDKC210] = 0x40000000,
31
-#define EVCFG_DUAL_IO_ENABLED (1 << 6)
31
+ [EXYNOS4_BOARD_NURI] = 1 * GiB,
32
+#define EVCFG_DUAL_IO_DISABLED (1 << 6)
32
+ [EXYNOS4_BOARD_SMDKC210] = 1 * GiB,
33
#define NVCFG_QUAD_IO_MASK (1 << 3)
33
};
34
-#define EVCFG_QUAD_IO_ENABLED (1 << 7)
34
35
+#define EVCFG_QUAD_IO_DISABLED (1 << 7)
35
static struct arm_boot_info exynos4_board_binfo = {
36
#define NVCFG_4BYTE_ADDR_MASK (1 << 0)
37
#define NVCFG_LOWER_SEGMENT_MASK (1 << 1)
38
39
@@ -XXX,XX +XXX,XX @@ static void reset_memory(Flash *s)
40
s->volatile_cfg |= VCFG_WRAP_SEQUENTIAL;
41
if ((s->nonvolatile_cfg & NVCFG_XIP_MODE_MASK)
42
!= NVCFG_XIP_MODE_DISABLED) {
43
- s->volatile_cfg |= VCFG_XIP_MODE_ENABLED;
44
+ s->volatile_cfg |= VCFG_XIP_MODE_DISABLED;
45
}
46
s->volatile_cfg |= deposit32(s->volatile_cfg,
47
VCFG_DUMMY_CLK_POS,
48
@@ -XXX,XX +XXX,XX @@ static void reset_memory(Flash *s)
49
s->enh_volatile_cfg |= EVCFG_VPP_ACCELERATOR;
50
s->enh_volatile_cfg |= EVCFG_RESET_HOLD_ENABLED;
51
if (s->nonvolatile_cfg & NVCFG_DUAL_IO_MASK) {
52
- s->enh_volatile_cfg |= EVCFG_DUAL_IO_ENABLED;
53
+ s->enh_volatile_cfg |= EVCFG_DUAL_IO_DISABLED;
54
}
55
if (s->nonvolatile_cfg & NVCFG_QUAD_IO_MASK) {
56
- s->enh_volatile_cfg |= EVCFG_QUAD_IO_ENABLED;
57
+ s->enh_volatile_cfg |= EVCFG_QUAD_IO_DISABLED;
58
}
59
if (!(s->nonvolatile_cfg & NVCFG_4BYTE_ADDR_MASK)) {
60
s->four_bytes_address_mode = true;
36
--
61
--
37
2.20.1
62
2.20.1
38
63
39
64
diff view generated by jsdifflib
1
From: Alistair Francis <alistair.francis@wdc.com>
1
From: Joe Komlodi <joe.komlodi@xilinx.com>
2
2
3
Commit 89e68b575 "target/arm: Use vector operations for saturation"
3
VCFG XIP is set (disabled) when the NVCFG XIP bits are all set (disabled).
4
causes this abort() when booting QEMU ARM with a Cortex-A15:
5
4
6
0 0x00007ffff4c2382f in raise () at /usr/lib/libc.so.6
5
Signed-off-by: Joe Komlodi <komlodi@xilinx.com>
7
1 0x00007ffff4c0e672 in abort () at /usr/lib/libc.so.6
6
Reviewed-by: Francisco Iglesias <francisco.iglesias@xilinx.com>
8
2 0x00005555559c1839 in disas_neon_data_insn (insn=<optimized out>, s=<optimized out>) at ./target/arm/translate.c:6673
7
Message-id: 1605568264-26376-3-git-send-email-komlodi@xilinx.com
9
3 0x00005555559c1839 in disas_neon_data_insn (s=<optimized out>, insn=<optimized out>) at ./target/arm/translate.c:6386
10
4 0x00005555559cd8a4 in disas_arm_insn (insn=4081107068, s=0x7fffe59a9510) at ./target/arm/translate.c:9289
11
5 0x00005555559cd8a4 in arm_tr_translate_insn (dcbase=0x7fffe59a9510, cpu=<optimized out>) at ./target/arm/translate.c:13612
12
6 0x00005555558d1d39 in translator_loop (ops=0x5555561cc580 <arm_translator_ops>, db=0x7fffe59a9510, cpu=0x55555686a2f0, tb=<optimized out>, max_insns=<optimized out>) at ./accel/tcg/translator.c:96
13
7 0x00005555559d10d4 in gen_intermediate_code (cpu=cpu@entry=0x55555686a2f0, tb=tb@entry=0x7fffd7840080 <code_gen_buffer+126091347>, max_insns=max_insns@entry=512) at ./target/arm/translate.c:13901
14
8 0x00005555558d06b9 in tb_gen_code (cpu=cpu@entry=0x55555686a2f0, pc=3067096216, cs_base=0, flags=192, cflags=-16252928, cflags@entry=524288) at ./accel/tcg/translate-all.c:1736
15
9 0x00005555558ce467 in tb_find (cf_mask=524288, tb_exit=1, last_tb=0x7fffd783e640 <code_gen_buffer+126084627>, cpu=0x1) at ./accel/tcg/cpu-exec.c:407
16
10 0x00005555558ce467 in cpu_exec (cpu=cpu@entry=0x55555686a2f0) at ./accel/tcg/cpu-exec.c:728
17
11 0x000055555588b0cf in tcg_cpu_exec (cpu=0x55555686a2f0) at ./cpus.c:1431
18
12 0x000055555588d223 in qemu_tcg_cpu_thread_fn (arg=0x55555686a2f0) at ./cpus.c:1735
19
13 0x000055555588d223 in qemu_tcg_cpu_thread_fn (arg=arg@entry=0x55555686a2f0) at ./cpus.c:1709
20
14 0x0000555555d2629a in qemu_thread_start (args=<optimized out>) at ./util/qemu-thread-posix.c:502
21
15 0x00007ffff4db8a92 in start_thread () at /usr/lib/libpthread.
22
23
This patch ensures that we don't hit the abort() in the second switch
24
case in disas_neon_data_insn() as we will return from the first case.
25
26
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
27
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
28
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
29
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
30
Tested-by: Alex Bennée <alex.bennee@linaro.org>
31
Message-id: ad91b397f360b2fc7f4087e476f7df5b04d42ddb.1558021877.git.alistair.francis@wdc.com
32
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
33
---
9
---
34
target/arm/translate.c | 4 ++--
10
hw/block/m25p80.c | 2 +-
35
1 file changed, 2 insertions(+), 2 deletions(-)
11
1 file changed, 1 insertion(+), 1 deletion(-)
36
12
37
diff --git a/target/arm/translate.c b/target/arm/translate.c
13
diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
38
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
39
--- a/target/arm/translate.c
15
--- a/hw/block/m25p80.c
40
+++ b/target/arm/translate.c
16
+++ b/hw/block/m25p80.c
41
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
17
@@ -XXX,XX +XXX,XX @@ static void reset_memory(Flash *s)
42
tcg_gen_gvec_4(rd_ofs, offsetof(CPUARMState, vfp.qc),
18
s->volatile_cfg |= VCFG_DUMMY;
43
rn_ofs, rm_ofs, vec_size, vec_size,
19
s->volatile_cfg |= VCFG_WRAP_SEQUENTIAL;
44
(u ? uqadd_op : sqadd_op) + size);
20
if ((s->nonvolatile_cfg & NVCFG_XIP_MODE_MASK)
45
- break;
21
- != NVCFG_XIP_MODE_DISABLED) {
46
+ return 0;
22
+ == NVCFG_XIP_MODE_DISABLED) {
47
23
s->volatile_cfg |= VCFG_XIP_MODE_DISABLED;
48
case NEON_3R_VQSUB:
24
}
49
tcg_gen_gvec_4(rd_ofs, offsetof(CPUARMState, vfp.qc),
25
s->volatile_cfg |= deposit32(s->volatile_cfg,
50
rn_ofs, rm_ofs, vec_size, vec_size,
51
(u ? uqsub_op : sqsub_op) + size);
52
- break;
53
+ return 0;
54
55
case NEON_3R_VMUL: /* VMUL */
56
if (u) {
57
--
26
--
58
2.20.1
27
2.20.1
59
28
60
29
diff view generated by jsdifflib
1
From: Guenter Roeck <linux@roeck-us.net>
1
From: Joe Komlodi <joe.komlodi@xilinx.com>
2
2
3
QEMU already supports pl330. Instantiate it for Exynos4210.
3
Some Numonyx flash commands cannot be executed in DIO and QIO mode, such as
4
trying to do DPP or DOR when in QIO mode.
4
5
5
Relevant part of Linux arch/arm/boot/dts/exynos4.dtsi:
6
Signed-off-by: Joe Komlodi <komlodi@xilinx.com>
6
7
Reviewed-by: Francisco Iglesias <francisco.iglesias@xilinx.com>
7
/ {
8
Message-id: 1605568264-26376-4-git-send-email-komlodi@xilinx.com
8
soc: soc {
9
amba {
10
pdma0: pdma@12680000 {
11
compatible = "arm,pl330", "arm,primecell";
12
reg = <0x12680000 0x1000>;
13
interrupts = <GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>;
14
clocks = <&clock CLK_PDMA0>;
15
clock-names = "apb_pclk";
16
#dma-cells = <1>;
17
#dma-channels = <8>;
18
#dma-requests = <32>;
19
};
20
pdma1: pdma@12690000 {
21
compatible = "arm,pl330", "arm,primecell";
22
reg = <0x12690000 0x1000>;
23
interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
24
clocks = <&clock CLK_PDMA1>;
25
clock-names = "apb_pclk";
26
#dma-cells = <1>;
27
#dma-channels = <8>;
28
#dma-requests = <32>;
29
};
30
mdma1: mdma@12850000 {
31
compatible = "arm,pl330", "arm,primecell";
32
reg = <0x12850000 0x1000>;
33
interrupts = <GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>;
34
clocks = <&clock CLK_MDMA>;
35
clock-names = "apb_pclk";
36
#dma-cells = <1>;
37
#dma-channels = <8>;
38
#dma-requests = <1>;
39
};
40
};
41
};
42
};
43
44
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
45
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
46
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
47
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
48
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
49
Message-id: 20190520214342.13709-4-philmd@redhat.com
50
[PMD: Do not set default qdev properties, create the controllers in the SoC
51
rather than the board (Peter Maydell), add dtsi in commit message]
52
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
53
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
54
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
55
---
10
---
56
hw/arm/exynos4210.c | 26 ++++++++++++++++++++++++++
11
hw/block/m25p80.c | 114 ++++++++++++++++++++++++++++++++++++++--------
57
1 file changed, 26 insertions(+)
12
1 file changed, 95 insertions(+), 19 deletions(-)
58
13
59
diff --git a/hw/arm/exynos4210.c b/hw/arm/exynos4210.c
14
diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
60
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
61
--- a/hw/arm/exynos4210.c
16
--- a/hw/block/m25p80.c
62
+++ b/hw/arm/exynos4210.c
17
+++ b/hw/block/m25p80.c
63
@@ -XXX,XX +XXX,XX @@
18
@@ -XXX,XX +XXX,XX @@ typedef enum {
64
/* EHCI */
19
MAN_GENERIC,
65
#define EXYNOS4210_EHCI_BASE_ADDR 0x12580000
20
} Manufacturer;
66
21
67
+/* DMA */
22
+typedef enum {
68
+#define EXYNOS4210_PL330_BASE0_ADDR 0x12680000
23
+ MODE_STD = 0,
69
+#define EXYNOS4210_PL330_BASE1_ADDR 0x12690000
24
+ MODE_DIO = 1,
70
+#define EXYNOS4210_PL330_BASE2_ADDR 0x12850000
25
+ MODE_QIO = 2
26
+} SPIMode;
71
+
27
+
72
static uint8_t chipid_and_omr[] = { 0x11, 0x02, 0x21, 0x43,
28
#define M25P80_INTERNAL_DATA_BUFFER_SZ 16
73
0x09, 0x00, 0x00, 0x00 };
29
74
30
struct Flash {
75
@@ -XXX,XX +XXX,XX @@ static uint64_t exynos4210_calc_affinity(int cpu)
31
@@ -XXX,XX +XXX,XX @@ static void reset_memory(Flash *s)
76
return (0x9 << ARM_AFF1_SHIFT) | cpu;
32
trace_m25p80_reset_done(s);
77
}
33
}
78
34
79
+static void pl330_create(uint32_t base, qemu_irq irq, int nreq)
35
+static uint8_t numonyx_mode(Flash *s)
80
+{
36
+{
81
+ SysBusDevice *busdev;
37
+ if (!(s->enh_volatile_cfg & EVCFG_QUAD_IO_DISABLED)) {
82
+ DeviceState *dev;
38
+ return MODE_QIO;
83
+
39
+ } else if (!(s->enh_volatile_cfg & EVCFG_DUAL_IO_DISABLED)) {
84
+ dev = qdev_create(NULL, "pl330");
40
+ return MODE_DIO;
85
+ qdev_prop_set_uint8(dev, "num_periph_req", nreq);
41
+ } else {
86
+ qdev_init_nofail(dev);
42
+ return MODE_STD;
87
+ busdev = SYS_BUS_DEVICE(dev);
43
+ }
88
+ sysbus_mmio_map(busdev, 0, base);
89
+ sysbus_connect_irq(busdev, 0, irq);
90
+}
44
+}
91
+
45
+
92
Exynos4210State *exynos4210_init(MemoryRegion *system_mem)
46
static void decode_fast_read_cmd(Flash *s)
93
{
47
{
94
Exynos4210State *s = g_new0(Exynos4210State, 1);
48
s->needed_bytes = get_addr_length(s);
95
@@ -XXX,XX +XXX,XX @@ Exynos4210State *exynos4210_init(MemoryRegion *system_mem)
49
@@ -XXX,XX +XXX,XX @@ static void decode_new_cmd(Flash *s, uint32_t value)
96
sysbus_create_simple(TYPE_EXYNOS4210_EHCI, EXYNOS4210_EHCI_BASE_ADDR,
50
case ERASE4_32K:
97
s->irq_table[exynos4210_get_irq(28, 3)]);
51
case ERASE_SECTOR:
98
52
case ERASE4_SECTOR:
99
+ /*** DMA controllers ***/
53
- case READ:
100
+ pl330_create(EXYNOS4210_PL330_BASE0_ADDR,
54
- case READ4:
101
+ qemu_irq_invert(s->irq_table[exynos4210_get_irq(35, 1)]), 32);
55
- case DPP:
102
+ pl330_create(EXYNOS4210_PL330_BASE1_ADDR,
56
- case QPP:
103
+ qemu_irq_invert(s->irq_table[exynos4210_get_irq(36, 1)]), 32);
57
- case QPP_4:
104
+ pl330_create(EXYNOS4210_PL330_BASE2_ADDR,
58
case PP:
105
+ qemu_irq_invert(s->irq_table[exynos4210_get_irq(34, 1)]), 1);
59
case PP4:
106
+
60
- case PP4_4:
107
return s;
61
case DIE_ERASE:
108
}
62
case RDID_90:
63
case RDID_AB:
64
@@ -XXX,XX +XXX,XX @@ static void decode_new_cmd(Flash *s, uint32_t value)
65
s->len = 0;
66
s->state = STATE_COLLECTING_DATA;
67
break;
68
+ case READ:
69
+ case READ4:
70
+ if (get_man(s) != MAN_NUMONYX || numonyx_mode(s) == MODE_STD) {
71
+ s->needed_bytes = get_addr_length(s);
72
+ s->pos = 0;
73
+ s->len = 0;
74
+ s->state = STATE_COLLECTING_DATA;
75
+ } else {
76
+ qemu_log_mask(LOG_GUEST_ERROR, "M25P80: Cannot execute cmd %x in "
77
+ "DIO or QIO mode\n", s->cmd_in_progress);
78
+ }
79
+ break;
80
+ case DPP:
81
+ if (get_man(s) != MAN_NUMONYX || numonyx_mode(s) != MODE_QIO) {
82
+ s->needed_bytes = get_addr_length(s);
83
+ s->pos = 0;
84
+ s->len = 0;
85
+ s->state = STATE_COLLECTING_DATA;
86
+ } else {
87
+ qemu_log_mask(LOG_GUEST_ERROR, "M25P80: Cannot execute cmd %x in "
88
+ "QIO mode\n", s->cmd_in_progress);
89
+ }
90
+ break;
91
+ case QPP:
92
+ case QPP_4:
93
+ case PP4_4:
94
+ if (get_man(s) != MAN_NUMONYX || numonyx_mode(s) != MODE_DIO) {
95
+ s->needed_bytes = get_addr_length(s);
96
+ s->pos = 0;
97
+ s->len = 0;
98
+ s->state = STATE_COLLECTING_DATA;
99
+ } else {
100
+ qemu_log_mask(LOG_GUEST_ERROR, "M25P80: Cannot execute cmd %x in "
101
+ "DIO mode\n", s->cmd_in_progress);
102
+ }
103
+ break;
104
105
case FAST_READ:
106
case FAST_READ4:
107
+ decode_fast_read_cmd(s);
108
+ break;
109
case DOR:
110
case DOR4:
111
+ if (get_man(s) != MAN_NUMONYX || numonyx_mode(s) != MODE_QIO) {
112
+ decode_fast_read_cmd(s);
113
+ } else {
114
+ qemu_log_mask(LOG_GUEST_ERROR, "M25P80: Cannot execute cmd %x in "
115
+ "QIO mode\n", s->cmd_in_progress);
116
+ }
117
+ break;
118
case QOR:
119
case QOR4:
120
- decode_fast_read_cmd(s);
121
+ if (get_man(s) != MAN_NUMONYX || numonyx_mode(s) != MODE_DIO) {
122
+ decode_fast_read_cmd(s);
123
+ } else {
124
+ qemu_log_mask(LOG_GUEST_ERROR, "M25P80: Cannot execute cmd %x in "
125
+ "DIO mode\n", s->cmd_in_progress);
126
+ }
127
break;
128
129
case DIOR:
130
case DIOR4:
131
- decode_dio_read_cmd(s);
132
+ if (get_man(s) != MAN_NUMONYX || numonyx_mode(s) != MODE_QIO) {
133
+ decode_dio_read_cmd(s);
134
+ } else {
135
+ qemu_log_mask(LOG_GUEST_ERROR, "M25P80: Cannot execute cmd %x in "
136
+ "QIO mode\n", s->cmd_in_progress);
137
+ }
138
break;
139
140
case QIOR:
141
case QIOR4:
142
- decode_qio_read_cmd(s);
143
+ if (get_man(s) != MAN_NUMONYX || numonyx_mode(s) != MODE_DIO) {
144
+ decode_qio_read_cmd(s);
145
+ } else {
146
+ qemu_log_mask(LOG_GUEST_ERROR, "M25P80: Cannot execute cmd %x in "
147
+ "DIO mode\n", s->cmd_in_progress);
148
+ }
149
break;
150
151
case WRSR:
152
@@ -XXX,XX +XXX,XX @@ static void decode_new_cmd(Flash *s, uint32_t value)
153
break;
154
155
case JEDEC_READ:
156
- trace_m25p80_populated_jedec(s);
157
- for (i = 0; i < s->pi->id_len; i++) {
158
- s->data[i] = s->pi->id[i];
159
- }
160
- for (; i < SPI_NOR_MAX_ID_LEN; i++) {
161
- s->data[i] = 0;
162
- }
163
+ if (get_man(s) != MAN_NUMONYX || numonyx_mode(s) == MODE_STD) {
164
+ trace_m25p80_populated_jedec(s);
165
+ for (i = 0; i < s->pi->id_len; i++) {
166
+ s->data[i] = s->pi->id[i];
167
+ }
168
+ for (; i < SPI_NOR_MAX_ID_LEN; i++) {
169
+ s->data[i] = 0;
170
+ }
171
172
- s->len = SPI_NOR_MAX_ID_LEN;
173
- s->pos = 0;
174
- s->state = STATE_READING_DATA;
175
+ s->len = SPI_NOR_MAX_ID_LEN;
176
+ s->pos = 0;
177
+ s->state = STATE_READING_DATA;
178
+ } else {
179
+ qemu_log_mask(LOG_GUEST_ERROR, "M25P80: Cannot execute JEDEC read "
180
+ "in DIO or QIO mode\n");
181
+ }
182
break;
183
184
case RDCR:
109
--
185
--
110
2.20.1
186
2.20.1
111
187
112
188
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Joe Komlodi <joe.komlodi@xilinx.com>
2
2
3
This is, after all, how we implement extract2 in tcg/aarch64.
3
Numonyx chips determine the number of cycles to wait based on bits 7:4
4
in the volatile configuration register.
4
5
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
However, if these bits are 0x0 or 0xF, the number of dummy cycles to
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
wait is 10 for QIOR and QIOR4 commands or when in QIO mode, and otherwise 8 for
7
Message-id: 20190514011129.11330-2-richard.henderson@linaro.org
8
the currently supported fast read commands. [1]
9
10
[1]
11
https://www.micron.com/-/media/client/global/documents/products/data-sheet/nor-flash/serial-nor/mt25q/die-rev-b/mt25q_qlkt_u_02g_cbb_0.pdf?rev=9b167fbf2b3645efba6385949a72e453
12
13
Signed-off-by: Joe Komlodi <komlodi@xilinx.com>
14
Reviewed-by: Francisco Iglesias <francisco.iglesias@xilinx.com>
15
Message-id: 1605568264-26376-5-git-send-email-komlodi@xilinx.com
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
17
---
10
target/arm/translate-a64.c | 38 ++++++++++++++++++++------------------
18
hw/block/m25p80.c | 30 +++++++++++++++++++++++++++---
11
1 file changed, 20 insertions(+), 18 deletions(-)
19
1 file changed, 27 insertions(+), 3 deletions(-)
12
20
13
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
21
diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
14
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/translate-a64.c
23
--- a/hw/block/m25p80.c
16
+++ b/target/arm/translate-a64.c
24
+++ b/hw/block/m25p80.c
17
@@ -XXX,XX +XXX,XX @@ static void disas_extract(DisasContext *s, uint32_t insn)
25
@@ -XXX,XX +XXX,XX @@ static uint8_t numonyx_mode(Flash *s)
18
} else {
26
}
19
tcg_gen_ext32u_i64(tcg_rd, cpu_reg(s, rm));
27
}
20
}
28
21
- } else if (rm == rn) { /* ROR */
29
+static uint8_t numonyx_extract_cfg_num_dummies(Flash *s)
22
- tcg_rm = cpu_reg(s, rm);
30
+{
23
- if (sf) {
31
+ uint8_t num_dummies;
24
- tcg_gen_rotri_i64(tcg_rd, tcg_rm, imm);
32
+ uint8_t mode;
25
- } else {
33
+ assert(get_man(s) == MAN_NUMONYX);
26
- TCGv_i32 tmp = tcg_temp_new_i32();
27
- tcg_gen_extrl_i64_i32(tmp, tcg_rm);
28
- tcg_gen_rotri_i32(tmp, tmp, imm);
29
- tcg_gen_extu_i32_i64(tcg_rd, tmp);
30
- tcg_temp_free_i32(tmp);
31
- }
32
} else {
33
- tcg_rm = read_cpu_reg(s, rm, sf);
34
- tcg_rn = read_cpu_reg(s, rn, sf);
35
- tcg_gen_shri_i64(tcg_rm, tcg_rm, imm);
36
- tcg_gen_shli_i64(tcg_rn, tcg_rn, bitsize - imm);
37
- tcg_gen_or_i64(tcg_rd, tcg_rm, tcg_rn);
38
- if (!sf) {
39
- tcg_gen_ext32u_i64(tcg_rd, tcg_rd);
40
+ tcg_rm = cpu_reg(s, rm);
41
+ tcg_rn = cpu_reg(s, rn);
42
+
34
+
43
+ if (sf) {
35
+ mode = numonyx_mode(s);
44
+ /* Specialization to ROR happens in EXTRACT2. */
36
+ num_dummies = extract32(s->volatile_cfg, 4, 4);
45
+ tcg_gen_extract2_i64(tcg_rd, tcg_rm, tcg_rn, imm);
46
+ } else {
47
+ TCGv_i32 t0 = tcg_temp_new_i32();
48
+
37
+
49
+ tcg_gen_extrl_i64_i32(t0, tcg_rm);
38
+ if (num_dummies == 0x0 || num_dummies == 0xf) {
50
+ if (rm == rn) {
39
+ switch (s->cmd_in_progress) {
51
+ tcg_gen_rotri_i32(t0, t0, imm);
40
+ case QIOR:
52
+ } else {
41
+ case QIOR4:
53
+ TCGv_i32 t1 = tcg_temp_new_i32();
42
+ num_dummies = 10;
54
+ tcg_gen_extrl_i64_i32(t1, tcg_rn);
43
+ break;
55
+ tcg_gen_extract2_i32(t0, t0, t1, imm);
44
+ default:
56
+ tcg_temp_free_i32(t1);
45
+ num_dummies = (mode == MODE_QIO) ? 10 : 8;
57
+ }
46
+ break;
58
+ tcg_gen_extu_i32_i64(tcg_rd, t0);
47
+ }
59
+ tcg_temp_free_i32(t0);
48
+ }
60
}
49
+
61
}
50
+ return num_dummies;
62
}
51
+}
52
+
53
static void decode_fast_read_cmd(Flash *s)
54
{
55
s->needed_bytes = get_addr_length(s);
56
@@ -XXX,XX +XXX,XX @@ static void decode_fast_read_cmd(Flash *s)
57
s->needed_bytes += 8;
58
break;
59
case MAN_NUMONYX:
60
- s->needed_bytes += extract32(s->volatile_cfg, 4, 4);
61
+ s->needed_bytes += numonyx_extract_cfg_num_dummies(s);
62
break;
63
case MAN_MACRONIX:
64
if (extract32(s->volatile_cfg, 6, 2) == 1) {
65
@@ -XXX,XX +XXX,XX @@ static void decode_dio_read_cmd(Flash *s)
66
);
67
break;
68
case MAN_NUMONYX:
69
- s->needed_bytes += extract32(s->volatile_cfg, 4, 4);
70
+ s->needed_bytes += numonyx_extract_cfg_num_dummies(s);
71
break;
72
case MAN_MACRONIX:
73
switch (extract32(s->volatile_cfg, 6, 2)) {
74
@@ -XXX,XX +XXX,XX @@ static void decode_qio_read_cmd(Flash *s)
75
);
76
break;
77
case MAN_NUMONYX:
78
- s->needed_bytes += extract32(s->volatile_cfg, 4, 4);
79
+ s->needed_bytes += numonyx_extract_cfg_num_dummies(s);
80
break;
81
case MAN_MACRONIX:
82
switch (extract32(s->volatile_cfg, 6, 2)) {
63
--
83
--
64
2.20.1
84
2.20.1
65
85
66
86
diff view generated by jsdifflib