Skip to content

Commit

Permalink
Merge tag 'hw-misc-20241105' of https://github.com/philmd/qemu into s…
Browse files Browse the repository at this point in the history
…taging

Misc HW patch queue

- Deprecate a pair of untested microblaze big-endian machines (Philippe)
- Arch-agnostic CPU topology checks at machine level (Zhao)
- Cleanups on PPC E500 (Bernhard)
- Various conversions to DEFINE_TYPES() macro (Bernhard)
- Fix RISC-V _pext_u64() name clashing (Pierrick)

# -----BEGIN PGP SIGNATURE-----
#
# iQIzBAABCAAdFiEE+qvnXhKRciHc/Wuy4+MsLN6twN4FAmcqqycACgkQ4+MsLN6t
# wN7TfhAAkAjpWxFGptNw28LPpnZY/NTGKyXQrIEHu3XnJsZ28c/KZeCAYUUC6/q7
# tAnBMb5GIn2VTyt+ElORseFtHStThoR8WMrcQSlGvCZei9lRNKCW0pVIEUgLZEtT
# u8lChpaVAn8gXb885xlaCBBP4SuFHEpASSfWy0mYDIqZL3oRhr9AQ/KwzHFqenbK
# Uva4BCWRVnYju6MhfA/pmVP011SUTdCu/fsBTIJT3Xn7Sp7fRNShIzt+1rbmPnR2
# hhRl5bMKUgDUjX5GxeP0LOj/XdX9svlqL42imNQT5FFUMIR6qbrwj4U841mt0uuI
# FcthAoILvA2XUJoTESq0iXUoN4FQLtc01onY6k06EoZAnn8WRZRp2dNdu8fYmHMX
# y3pcXBK6wEhBVZ2DcGVf1txmieUc4TZohOridU1Xfckp+XVl6J3LtTKJIE56Eh68
# S9OJW1Sz2Io/8FJFvKStX0bhV0nBUyUXmi5PjV4vurS6Gy1aVodiiq3ls6baX05z
# /Y8DJGpPByA+GI2prdwq9oTIhEIU2bJDDz32NkwHM99SE25h+iyh21Ap5Ojkegm7
# 1squIskxX3QLtEMxBCe+XIKzEZ51kzNZxmLXvCFW5YetypNdhyULqH/UDWt7hIDN
# BSh2w1g/lSw9n6DtEN3rURYAR/uV7/7IMEP8Td2wvcDX4o95Fkw=
# =q0cF
# -----END PGP SIGNATURE-----
# gpg: Signature made Tue 05 Nov 2024 23:32:55 GMT
# gpg:                using RSA key FAABE75E12917221DCFD6BB2E3E32C2CDEADC0DE
# gpg: Good signature from "Philippe Mathieu-Daudé (F4BUG) <[email protected]>" [full]
# Primary key fingerprint: FAAB E75E 1291 7221 DCFD  6BB2 E3E3 2C2C DEAD C0DE

* tag 'hw-misc-20241105' of https://github.com/philmd/qemu: (29 commits)
  hw/riscv/iommu: fix build error with clang
  hw/usb/hcd-ehci-sysbus: Prefer DEFINE_TYPES() macro
  hw/rtc/ds1338: Prefer DEFINE_TYPES() macro
  hw/i2c/smbus_eeprom: Prefer DEFINE_TYPES() macro
  hw/block/pflash_cfi01: Prefer DEFINE_TYPES() macro
  hw/sd/sdhci: Prefer DEFINE_TYPES() macro
  hw/ppc/mpc8544_guts: Prefer DEFINE_TYPES() macro
  hw/gpio/mpc8xxx: Prefer DEFINE_TYPES() macro
  hw/net/fsl_etsec/etsec: Prefer DEFINE_TYPES() macro
  hw/net/fsl_etsec/miim: Reuse MII constants
  hw/pci-host/ppce500: Prefer DEFINE_TYPES() macro
  hw/pci-host/ppce500: Reuse TYPE_PPC_E500_PCI_BRIDGE define
  hw/i2c/mpc_i2c: Prefer DEFINE_TYPES() macro
  hw/i2c/mpc_i2c: Convert DPRINTF to trace events for register access
  hw/ppc/mpc8544_guts: Populate POR PLL ratio status register
  hw/ppc/e500: Add missing device tree properties to i2c controller node
  hw/ppc/e500: Remove unused "irqs" parameter
  hw/ppc/e500: Prefer QOM cast
  hw/core: Add a helper to check the cache topology level
  hw/core: Check smp cache topology support for machine
  ...

Signed-off-by: Peter Maydell <[email protected]>
  • Loading branch information
pm215 committed Nov 6, 2024
2 parents 731d58b + d37eede commit 63dc369
Show file tree
Hide file tree
Showing 29 changed files with 625 additions and 347 deletions.
2 changes: 0 additions & 2 deletions configs/devices/microblaze-softmmu/default.mak
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,3 @@

# Boards are selected by default, uncomment to keep out of the build.
# CONFIG_PETALOGIX_S3ADSP1800=n
# CONFIG_PETALOGIX_ML605=n
# CONFIG_XLNX_ZYNQMP_PMU=n
5 changes: 4 additions & 1 deletion configs/devices/microblazeel-softmmu/default.mak
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
# Default configuration for microblazeel-softmmu

include ../microblaze-softmmu/default.mak
# Boards are selected by default, uncomment to keep out of the build.
# CONFIG_PETALOGIX_S3ADSP1800=n
# CONFIG_PETALOGIX_ML605=n
# CONFIG_XLNX_ZYNQMP_PMU=n
6 changes: 6 additions & 0 deletions docs/about/deprecated.rst
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,12 @@ BMC and a witherspoon like OpenPOWER system. It was used for bring up
of the AST2600 SoC in labs. It can be easily replaced by the
``rainier-bmc`` machine which is a real product.

Big-Endian variants of MicroBlaze ``petalogix-ml605`` and ``xlnx-zynqmp-pmu`` machines (since 9.2)
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Both ``petalogix-ml605`` and ``xlnx-zynqmp-pmu`` were added for little endian
CPUs. Big endian support is not tested.

Backend options
---------------

Expand Down
21 changes: 8 additions & 13 deletions hw/block/pflash_cfi01.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,6 @@
#include "qemu/bitops.h"
#include "qemu/host-utils.h"
#include "qemu/log.h"
#include "qemu/module.h"
#include "qemu/option.h"
#include "hw/sysbus.h"
#include "migration/vmstate.h"
Expand Down Expand Up @@ -947,20 +946,16 @@ static void pflash_cfi01_class_init(ObjectClass *klass, void *data)
set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
}


static const TypeInfo pflash_cfi01_info = {
.name = TYPE_PFLASH_CFI01,
.parent = TYPE_SYS_BUS_DEVICE,
.instance_size = sizeof(PFlashCFI01),
.class_init = pflash_cfi01_class_init,
static const TypeInfo pflash_cfi01_types[] = {
{
.name = TYPE_PFLASH_CFI01,
.parent = TYPE_SYS_BUS_DEVICE,
.instance_size = sizeof(PFlashCFI01),
.class_init = pflash_cfi01_class_init,
},
};

static void pflash_cfi01_register_types(void)
{
type_register_static(&pflash_cfi01_info);
}

type_init(pflash_cfi01_register_types)
DEFINE_TYPES(pflash_cfi01_types)

PFlashCFI01 *pflash_cfi01_register(hwaddr base,
const char *name,
Expand Down
126 changes: 126 additions & 0 deletions hw/core/machine-smp.c
Original file line number Diff line number Diff line change
Expand Up @@ -261,6 +261,72 @@ void machine_parse_smp_config(MachineState *ms,
}
}

static bool machine_check_topo_support(MachineState *ms,
CpuTopologyLevel topo,
Error **errp)
{
MachineClass *mc = MACHINE_GET_CLASS(ms);

if ((topo == CPU_TOPOLOGY_LEVEL_MODULE && !mc->smp_props.modules_supported) ||
(topo == CPU_TOPOLOGY_LEVEL_CLUSTER && !mc->smp_props.clusters_supported) ||
(topo == CPU_TOPOLOGY_LEVEL_DIE && !mc->smp_props.dies_supported) ||
(topo == CPU_TOPOLOGY_LEVEL_BOOK && !mc->smp_props.books_supported) ||
(topo == CPU_TOPOLOGY_LEVEL_DRAWER && !mc->smp_props.drawers_supported)) {
error_setg(errp,
"Invalid topology level: %s. "
"The topology level is not supported by this machine",
CpuTopologyLevel_str(topo));
return false;
}

return true;
}

bool machine_parse_smp_cache(MachineState *ms,
const SmpCachePropertiesList *caches,
Error **errp)
{
MachineClass *mc = MACHINE_GET_CLASS(ms);
const SmpCachePropertiesList *node;
DECLARE_BITMAP(caches_bitmap, CACHE_LEVEL_AND_TYPE__MAX);

for (node = caches; node; node = node->next) {
/* Prohibit users from repeating settings. */
if (test_bit(node->value->cache, caches_bitmap)) {
error_setg(errp,
"Invalid cache properties: %s. "
"The cache properties are duplicated",
CacheLevelAndType_str(node->value->cache));
return false;
}

machine_set_cache_topo_level(ms, node->value->cache,
node->value->topology);
set_bit(node->value->cache, caches_bitmap);
}

for (int i = 0; i < CACHE_LEVEL_AND_TYPE__MAX; i++) {
const SmpCacheProperties *props = &ms->smp_cache.props[i];

/*
* Reject non "default" topology level if the cache isn't
* supported by the machine.
*/
if (props->topology != CPU_TOPOLOGY_LEVEL_DEFAULT &&
!mc->smp_props.cache_supported[props->cache]) {
error_setg(errp,
"%s cache topology not supported by this machine",
CacheLevelAndType_str(node->value->cache));
return false;
}

if (!machine_check_topo_support(ms, props->topology, errp)) {
return false;
}
}
return true;
}

unsigned int machine_topo_get_cores_per_socket(const MachineState *ms)
{
return ms->smp.cores * ms->smp.modules * ms->smp.clusters * ms->smp.dies;
Expand All @@ -270,3 +336,63 @@ unsigned int machine_topo_get_threads_per_socket(const MachineState *ms)
{
return ms->smp.threads * machine_topo_get_cores_per_socket(ms);
}

CpuTopologyLevel machine_get_cache_topo_level(const MachineState *ms,
CacheLevelAndType cache)
{
return ms->smp_cache.props[cache].topology;
}

void machine_set_cache_topo_level(MachineState *ms, CacheLevelAndType cache,
CpuTopologyLevel level)
{
ms->smp_cache.props[cache].topology = level;
}

/*
* When both cache1 and cache2 are configured with specific topology levels
* (not default level), is cache1's topology level higher than cache2?
*/
static bool smp_cache_topo_cmp(const SmpCache *smp_cache,
CacheLevelAndType cache1,
CacheLevelAndType cache2)
{
/*
* Before comparing, the "default" topology level should be replaced
* with the specific level.
*/
assert(smp_cache->props[cache1].topology != CPU_TOPOLOGY_LEVEL_DEFAULT);

return smp_cache->props[cache1].topology > smp_cache->props[cache2].topology;
}

/*
* Currently, we have no way to expose the arch-specific default cache model
* because the cache model is sometimes related to the CPU model (e.g., i386).
*
* We can only check the correctness of the cache topology after the arch loads
* the user-configured cache model from MachineState and consumes the special
* "default" level by replacing it with the specific level.
*/
bool machine_check_smp_cache(const MachineState *ms, Error **errp)
{
if (smp_cache_topo_cmp(&ms->smp_cache, CACHE_LEVEL_AND_TYPE_L1D,
CACHE_LEVEL_AND_TYPE_L2) ||
smp_cache_topo_cmp(&ms->smp_cache, CACHE_LEVEL_AND_TYPE_L1I,
CACHE_LEVEL_AND_TYPE_L2)) {
error_setg(errp,
"Invalid smp cache topology. "
"L2 cache topology level shouldn't be lower than L1 cache");
return false;
}

if (smp_cache_topo_cmp(&ms->smp_cache, CACHE_LEVEL_AND_TYPE_L2,
CACHE_LEVEL_AND_TYPE_L3)) {
error_setg(errp,
"Invalid smp cache topology. "
"L3 cache topology level shouldn't be lower than L2 cache");
return false;
}

return true;
}
46 changes: 46 additions & 0 deletions hw/core/machine.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,12 @@
*/

#include "qemu/osdep.h"
#include "qemu/units.h"
#include "qemu/accel.h"
#include "sysemu/replay.h"
#include "hw/boards.h"
#include "hw/loader.h"
#include "qemu/error-report.h"
#include "qapi/error.h"
#include "qapi/qapi-visit-machine.h"
#include "qemu/madvise.h"
Expand Down Expand Up @@ -907,6 +909,40 @@ static void machine_set_smp(Object *obj, Visitor *v, const char *name,
machine_parse_smp_config(ms, config, errp);
}

static void machine_get_smp_cache(Object *obj, Visitor *v, const char *name,
void *opaque, Error **errp)
{
MachineState *ms = MACHINE(obj);
SmpCache *cache = &ms->smp_cache;
SmpCachePropertiesList *head = NULL;
SmpCachePropertiesList **tail = &head;

for (int i = 0; i < CACHE_LEVEL_AND_TYPE__MAX; i++) {
SmpCacheProperties *node = g_new(SmpCacheProperties, 1);

node->cache = cache->props[i].cache;
node->topology = cache->props[i].topology;
QAPI_LIST_APPEND(tail, node);
}

visit_type_SmpCachePropertiesList(v, name, &head, errp);
qapi_free_SmpCachePropertiesList(head);
}

static void machine_set_smp_cache(Object *obj, Visitor *v, const char *name,
void *opaque, Error **errp)
{
MachineState *ms = MACHINE(obj);
SmpCachePropertiesList *caches;

if (!visit_type_SmpCachePropertiesList(v, name, &caches, errp)) {
return;
}

machine_parse_smp_cache(ms, caches, errp);
qapi_free_SmpCachePropertiesList(caches);
}

static void machine_get_boot(Object *obj, Visitor *v, const char *name,
void *opaque, Error **errp)
{
Expand Down Expand Up @@ -1067,6 +1103,11 @@ static void machine_class_init(ObjectClass *oc, void *data)
object_class_property_set_description(oc, "smp",
"CPU topology");

object_class_property_add(oc, "smp-cache", "SmpCachePropertiesWrapper",
machine_get_smp_cache, machine_set_smp_cache, NULL, NULL);
object_class_property_set_description(oc, "smp-cache",
"Cache properties list for SMP machine");

object_class_property_add(oc, "phandle-start", "int",
machine_get_phandle_start, machine_set_phandle_start,
NULL, NULL);
Expand Down Expand Up @@ -1205,6 +1246,11 @@ static void machine_initfn(Object *obj)
ms->smp.cores = 1;
ms->smp.threads = 1;

for (int i = 0; i < CACHE_LEVEL_AND_TYPE__MAX; i++) {
ms->smp_cache.props[i].cache = (CacheLevelAndType)i;
ms->smp_cache.props[i].topology = CPU_TOPOLOGY_LEVEL_DEFAULT;
}

machine_copy_boot_config(ms, &(BootConfiguration){ 0 });
}

Expand Down
22 changes: 9 additions & 13 deletions hw/gpio/mpc8xxx.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@
#include "hw/irq.h"
#include "hw/sysbus.h"
#include "migration/vmstate.h"
#include "qemu/module.h"
#include "qom/object.h"

#define TYPE_MPC8XXX_GPIO "mpc8xxx_gpio"
Expand Down Expand Up @@ -208,17 +207,14 @@ static void mpc8xxx_gpio_class_init(ObjectClass *klass, void *data)
device_class_set_legacy_reset(dc, mpc8xxx_gpio_reset);
}

static const TypeInfo mpc8xxx_gpio_info = {
.name = TYPE_MPC8XXX_GPIO,
.parent = TYPE_SYS_BUS_DEVICE,
.instance_size = sizeof(MPC8XXXGPIOState),
.instance_init = mpc8xxx_gpio_initfn,
.class_init = mpc8xxx_gpio_class_init,
static const TypeInfo mpc8xxx_gpio_types[] = {
{
.name = TYPE_MPC8XXX_GPIO,
.parent = TYPE_SYS_BUS_DEVICE,
.instance_size = sizeof(MPC8XXXGPIOState),
.instance_init = mpc8xxx_gpio_initfn,
.class_init = mpc8xxx_gpio_class_init,
},
};

static void mpc8xxx_gpio_register_types(void)
{
type_register_static(&mpc8xxx_gpio_info);
}

type_init(mpc8xxx_gpio_register_types)
DEFINE_TYPES(mpc8xxx_gpio_types)
29 changes: 13 additions & 16 deletions hw/i2c/mpc_i2c.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,10 @@
#include "qemu/osdep.h"
#include "hw/i2c/i2c.h"
#include "hw/irq.h"
#include "qemu/module.h"
#include "hw/sysbus.h"
#include "migration/vmstate.h"
#include "qom/object.h"
#include "trace.h"

/* #define DEBUG_I2C */

Expand Down Expand Up @@ -224,8 +224,8 @@ static uint64_t mpc_i2c_read(void *opaque, hwaddr addr, unsigned size)
break;
}

DPRINTF("%s: addr " HWADDR_FMT_plx " %02" PRIx32 "\n", __func__,
addr, value);
trace_mpc_i2c_read(addr, value);

return (uint64_t)value;
}

Expand All @@ -234,8 +234,8 @@ static void mpc_i2c_write(void *opaque, hwaddr addr,
{
MPCI2CState *s = opaque;

DPRINTF("%s: addr " HWADDR_FMT_plx " val %08" PRIx64 "\n", __func__,
addr, value);
trace_mpc_i2c_write(addr, value);

switch (addr) {
case MPC_I2C_ADR:
s->adr = value & CADR_MASK;
Expand Down Expand Up @@ -344,16 +344,13 @@ static void mpc_i2c_class_init(ObjectClass *klass, void *data)
dc->desc = "MPC I2C Controller";
}

static const TypeInfo mpc_i2c_type_info = {
.name = TYPE_MPC_I2C,
.parent = TYPE_SYS_BUS_DEVICE,
.instance_size = sizeof(MPCI2CState),
.class_init = mpc_i2c_class_init,
static const TypeInfo mpc_i2c_types[] = {
{
.name = TYPE_MPC_I2C,
.parent = TYPE_SYS_BUS_DEVICE,
.instance_size = sizeof(MPCI2CState),
.class_init = mpc_i2c_class_init,
},
};

static void mpc_i2c_register_types(void)
{
type_register_static(&mpc_i2c_type_info);
}

type_init(mpc_i2c_register_types)
DEFINE_TYPES(mpc_i2c_types)
Loading

0 comments on commit 63dc369

Please sign in to comment.