Skip to content

Commit 553cf5d

Browse files
committed
Merge remote-tracking branch 'remotes/pmaydell/tags/pull-target-arm-20200626' into staging
target-arm queue: * hw/arm/aspeed: improve QOM usage * hw/misc/pca9552: trace GPIO change events * target/arm: Implement ARMv8.5-MemTag for system emulation # gpg: Signature made Fri 26 Jun 2020 16:13:27 BST # gpg: using RSA key E1A5C593CD419DE28E8315CF3C2525ED14360CDE # gpg: issuer "[email protected]" # gpg: Good signature from "Peter Maydell <[email protected]>" [ultimate] # gpg: aka "Peter Maydell <[email protected]>" [ultimate] # gpg: aka "Peter Maydell <[email protected]>" [ultimate] # Primary key fingerprint: E1A5 C593 CD41 9DE2 8E83 15CF 3C25 25ED 1436 0CDE * remotes/pmaydell/tags/pull-target-arm-20200626: (57 commits) target/arm: Enable MTE target/arm: Add allocation tag storage for system mode target/arm: Create tagged ram when MTE is enabled target/arm: Cache the Tagged bit for a page in MemTxAttrs target/arm: Always pass cacheattr to get_phys_addr target/arm: Set PSTATE.TCO on exception entry target/arm: Implement data cache set allocation tags target/arm: Complete TBI clearing for user-only for SVE target/arm: Add mte helpers for sve scatter/gather memory ops target/arm: Handle TBI for sve scalar + int memory ops target/arm: Add mte helpers for sve scalar + int ff/nf loads target/arm: Add mte helpers for sve scalar + int stores target/arm: Add mte helpers for sve scalar + int loads target/arm: Add arm_tlb_bti_gp target/arm: Tidy trans_LD1R_zpri target/arm: Use mte_check1 for sve LD1R target/arm: Use mte_checkN for sve unpredicated stores target/arm: Use mte_checkN for sve unpredicated loads target/arm: Add helper_mte_check_zva target/arm: Implement helper_mte_checkN ... Signed-off-by: Peter Maydell <[email protected]>
2 parents 3591ddd + c745963 commit 553cf5d

29 files changed

+4417
-950
lines changed

hw/arm/aspeed.c

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,15 @@ static struct arm_boot_info aspeed_board_binfo = {
3232
.board_id = -1, /* device-tree-only board */
3333
};
3434

35-
struct AspeedBoardState {
35+
struct AspeedMachineState {
36+
/* Private */
37+
MachineState parent_obj;
38+
/* Public */
39+
3640
AspeedSoCState soc;
3741
MemoryRegion ram_container;
3842
MemoryRegion max_ram;
43+
bool mmio_exec;
3944
};
4045

4146
/* Palmetto hardware value: 0x120CE416 */
@@ -253,16 +258,14 @@ static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo)
253258

254259
static void aspeed_machine_init(MachineState *machine)
255260
{
256-
AspeedBoardState *bmc;
261+
AspeedMachineState *bmc = ASPEED_MACHINE(machine);
257262
AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
258263
AspeedSoCClass *sc;
259264
DriveInfo *drive0 = drive_get(IF_MTD, 0, 0);
260265
ram_addr_t max_ram_size;
261266
int i;
262267
NICInfo *nd = &nd_table[0];
263268

264-
bmc = g_new0(AspeedBoardState, 1);
265-
266269
memory_region_init(&bmc->ram_container, NULL, "aspeed-ram-container",
267270
4 * GiB);
268271
memory_region_add_subregion(&bmc->ram_container, 0, machine->ram);
@@ -329,12 +332,12 @@ static void aspeed_machine_init(MachineState *machine)
329332
* needed by the flash modules of the Aspeed machines.
330333
*/
331334
if (ASPEED_MACHINE(machine)->mmio_exec) {
332-
memory_region_init_alias(boot_rom, OBJECT(bmc), "aspeed.boot_rom",
335+
memory_region_init_alias(boot_rom, NULL, "aspeed.boot_rom",
333336
&fl->mmio, 0, fl->size);
334337
memory_region_add_subregion(get_system_memory(), FIRMWARE_ADDR,
335338
boot_rom);
336339
} else {
337-
memory_region_init_rom(boot_rom, OBJECT(bmc), "aspeed.boot_rom",
340+
memory_region_init_rom(boot_rom, NULL, "aspeed.boot_rom",
338341
fl->size, &error_abort);
339342
memory_region_add_subregion(get_system_memory(), FIRMWARE_ADDR,
340343
boot_rom);
@@ -345,7 +348,7 @@ static void aspeed_machine_init(MachineState *machine)
345348
if (machine->kernel_filename && sc->num_cpus > 1) {
346349
/* With no u-boot we must set up a boot stub for the secondary CPU */
347350
MemoryRegion *smpboot = g_new(MemoryRegion, 1);
348-
memory_region_init_ram(smpboot, OBJECT(bmc), "aspeed.smpboot",
351+
memory_region_init_ram(smpboot, NULL, "aspeed.smpboot",
349352
0x80, &error_abort);
350353
memory_region_add_subregion(get_system_memory(),
351354
AST_SMP_MAILBOX_BASE, smpboot);
@@ -374,7 +377,7 @@ static void aspeed_machine_init(MachineState *machine)
374377
arm_load_kernel(ARM_CPU(first_cpu), machine, &aspeed_board_binfo);
375378
}
376379

377-
static void palmetto_bmc_i2c_init(AspeedBoardState *bmc)
380+
static void palmetto_bmc_i2c_init(AspeedMachineState *bmc)
378381
{
379382
AspeedSoCState *soc = &bmc->soc;
380383
DeviceState *dev;
@@ -396,7 +399,7 @@ static void palmetto_bmc_i2c_init(AspeedBoardState *bmc)
396399
object_property_set_int(OBJECT(dev), 110000, "temperature3", &error_abort);
397400
}
398401

399-
static void ast2500_evb_i2c_init(AspeedBoardState *bmc)
402+
static void ast2500_evb_i2c_init(AspeedMachineState *bmc)
400403
{
401404
AspeedSoCState *soc = &bmc->soc;
402405
uint8_t *eeprom_buf = g_malloc0(8 * 1024);
@@ -413,13 +416,13 @@ static void ast2500_evb_i2c_init(AspeedBoardState *bmc)
413416
i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 11), "ds1338", 0x32);
414417
}
415418

416-
static void ast2600_evb_i2c_init(AspeedBoardState *bmc)
419+
static void ast2600_evb_i2c_init(AspeedMachineState *bmc)
417420
{
418421
/* Start with some devices on our I2C busses */
419422
ast2500_evb_i2c_init(bmc);
420423
}
421424

422-
static void romulus_bmc_i2c_init(AspeedBoardState *bmc)
425+
static void romulus_bmc_i2c_init(AspeedMachineState *bmc)
423426
{
424427
AspeedSoCState *soc = &bmc->soc;
425428

@@ -428,7 +431,7 @@ static void romulus_bmc_i2c_init(AspeedBoardState *bmc)
428431
i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 11), "ds1338", 0x32);
429432
}
430433

431-
static void swift_bmc_i2c_init(AspeedBoardState *bmc)
434+
static void swift_bmc_i2c_init(AspeedMachineState *bmc)
432435
{
433436
AspeedSoCState *soc = &bmc->soc;
434437

@@ -457,7 +460,7 @@ static void swift_bmc_i2c_init(AspeedBoardState *bmc)
457460
i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 12), "tmp105", 0x4a);
458461
}
459462

460-
static void sonorapass_bmc_i2c_init(AspeedBoardState *bmc)
463+
static void sonorapass_bmc_i2c_init(AspeedMachineState *bmc)
461464
{
462465
AspeedSoCState *soc = &bmc->soc;
463466

@@ -501,16 +504,19 @@ static void sonorapass_bmc_i2c_init(AspeedBoardState *bmc)
501504

502505
}
503506

504-
static void witherspoon_bmc_i2c_init(AspeedBoardState *bmc)
507+
static void witherspoon_bmc_i2c_init(AspeedMachineState *bmc)
505508
{
506509
AspeedSoCState *soc = &bmc->soc;
507510
uint8_t *eeprom_buf = g_malloc0(8 * 1024);
511+
DeviceState *dev;
508512

509513
/* Bus 3: TODO bmp280@77 */
510514
/* Bus 3: TODO max31785@52 */
511515
/* Bus 3: TODO dps310@76 */
512-
i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 3), TYPE_PCA9552,
513-
0x60);
516+
dev = i2c_try_create_slave(TYPE_PCA9552, 0x60);
517+
qdev_prop_set_string(dev, "description", "pca1");
518+
i2c_realize_and_unref(dev, aspeed_i2c_get_bus(DEVICE(&soc->i2c), 3),
519+
&error_fatal);
514520

515521
i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 4), "tmp423", 0x4c);
516522
i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 5), "tmp423", 0x4c);
@@ -525,8 +531,10 @@ static void witherspoon_bmc_i2c_init(AspeedBoardState *bmc)
525531

526532
smbus_eeprom_init_one(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 11), 0x51,
527533
eeprom_buf);
528-
i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 11), TYPE_PCA9552,
529-
0x60);
534+
dev = i2c_try_create_slave(TYPE_PCA9552, 0x60);
535+
qdev_prop_set_string(dev, "description", "pca0");
536+
i2c_realize_and_unref(dev, aspeed_i2c_get_bus(DEVICE(&soc->i2c), 11),
537+
&error_fatal);
530538
/* Bus 11: TODO ucd90160@64 */
531539
}
532540

@@ -751,7 +759,7 @@ static const TypeInfo aspeed_machine_types[] = {
751759
}, {
752760
.name = TYPE_ASPEED_MACHINE,
753761
.parent = TYPE_MACHINE,
754-
.instance_size = sizeof(AspeedMachine),
762+
.instance_size = sizeof(AspeedMachineState),
755763
.instance_init = aspeed_machine_instance_init,
756764
.class_size = sizeof(AspeedMachineClass),
757765
.class_init = aspeed_machine_class_init,

hw/arm/virt.c

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1390,8 +1390,19 @@ static void create_platform_bus(VirtMachineState *vms)
13901390
sysbus_mmio_get_region(s, 0));
13911391
}
13921392

1393+
static void create_tag_ram(MemoryRegion *tag_sysmem,
1394+
hwaddr base, hwaddr size,
1395+
const char *name)
1396+
{
1397+
MemoryRegion *tagram = g_new(MemoryRegion, 1);
1398+
1399+
memory_region_init_ram(tagram, NULL, name, size / 32, &error_fatal);
1400+
memory_region_add_subregion(tag_sysmem, base / 32, tagram);
1401+
}
1402+
13931403
static void create_secure_ram(VirtMachineState *vms,
1394-
MemoryRegion *secure_sysmem)
1404+
MemoryRegion *secure_sysmem,
1405+
MemoryRegion *secure_tag_sysmem)
13951406
{
13961407
MemoryRegion *secram = g_new(MemoryRegion, 1);
13971408
char *nodename;
@@ -1409,6 +1420,10 @@ static void create_secure_ram(VirtMachineState *vms,
14091420
qemu_fdt_setprop_string(vms->fdt, nodename, "status", "disabled");
14101421
qemu_fdt_setprop_string(vms->fdt, nodename, "secure-status", "okay");
14111422

1423+
if (secure_tag_sysmem) {
1424+
create_tag_ram(secure_tag_sysmem, base, size, "mach-virt.secure-tag");
1425+
}
1426+
14121427
g_free(nodename);
14131428
}
14141429

@@ -1665,6 +1680,8 @@ static void machvirt_init(MachineState *machine)
16651680
const CPUArchIdList *possible_cpus;
16661681
MemoryRegion *sysmem = get_system_memory();
16671682
MemoryRegion *secure_sysmem = NULL;
1683+
MemoryRegion *tag_sysmem = NULL;
1684+
MemoryRegion *secure_tag_sysmem = NULL;
16681685
int n, virt_max_cpus;
16691686
bool firmware_loaded;
16701687
bool aarch64 = true;
@@ -1819,6 +1836,35 @@ static void machvirt_init(MachineState *machine)
18191836
"secure-memory", &error_abort);
18201837
}
18211838

1839+
/*
1840+
* The cpu adds the property if and only if MemTag is supported.
1841+
* If it is, we must allocate the ram to back that up.
1842+
*/
1843+
if (object_property_find(cpuobj, "tag-memory", NULL)) {
1844+
if (!tag_sysmem) {
1845+
tag_sysmem = g_new(MemoryRegion, 1);
1846+
memory_region_init(tag_sysmem, OBJECT(machine),
1847+
"tag-memory", UINT64_MAX / 32);
1848+
1849+
if (vms->secure) {
1850+
secure_tag_sysmem = g_new(MemoryRegion, 1);
1851+
memory_region_init(secure_tag_sysmem, OBJECT(machine),
1852+
"secure-tag-memory", UINT64_MAX / 32);
1853+
1854+
/* As with ram, secure-tag takes precedence over tag. */
1855+
memory_region_add_subregion_overlap(secure_tag_sysmem, 0,
1856+
tag_sysmem, -1);
1857+
}
1858+
}
1859+
1860+
object_property_set_link(cpuobj, OBJECT(tag_sysmem),
1861+
"tag-memory", &error_abort);
1862+
if (vms->secure) {
1863+
object_property_set_link(cpuobj, OBJECT(secure_tag_sysmem),
1864+
"secure-tag-memory", &error_abort);
1865+
}
1866+
}
1867+
18221868
qdev_realize(DEVICE(cpuobj), NULL, &error_fatal);
18231869
object_unref(cpuobj);
18241870
}
@@ -1857,10 +1903,15 @@ static void machvirt_init(MachineState *machine)
18571903
create_uart(vms, VIRT_UART, sysmem, serial_hd(0));
18581904

18591905
if (vms->secure) {
1860-
create_secure_ram(vms, secure_sysmem);
1906+
create_secure_ram(vms, secure_sysmem, secure_tag_sysmem);
18611907
create_uart(vms, VIRT_SECURE_UART, secure_sysmem, serial_hd(1));
18621908
}
18631909

1910+
if (tag_sysmem) {
1911+
create_tag_ram(tag_sysmem, vms->memmap[VIRT_MEM].base,
1912+
machine->ram_size, "mach-virt.tag");
1913+
}
1914+
18641915
vms->highmem_ecam &= vms->highmem && (!firmware_loaded || aarch64);
18651916

18661917
create_rtc(vms);

hw/i2c/core.c

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -267,13 +267,27 @@ const VMStateDescription vmstate_i2c_slave = {
267267
}
268268
};
269269

270-
DeviceState *i2c_create_slave(I2CBus *bus, const char *name, uint8_t addr)
270+
DeviceState *i2c_try_create_slave(const char *name, uint8_t addr)
271271
{
272272
DeviceState *dev;
273273

274274
dev = qdev_new(name);
275275
qdev_prop_set_uint8(dev, "address", addr);
276-
qdev_realize_and_unref(dev, &bus->qbus, &error_fatal);
276+
return dev;
277+
}
278+
279+
bool i2c_realize_and_unref(DeviceState *dev, I2CBus *bus, Error **errp)
280+
{
281+
return qdev_realize_and_unref(dev, &bus->qbus, errp);
282+
}
283+
284+
DeviceState *i2c_create_slave(I2CBus *bus, const char *name, uint8_t addr)
285+
{
286+
DeviceState *dev;
287+
288+
dev = i2c_try_create_slave(name, addr);
289+
i2c_realize_and_unref(dev, bus, &error_fatal);
290+
277291
return dev;
278292
}
279293

0 commit comments

Comments
 (0)