All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 00/86] refactor main RAM allocation to use hostmem backend
@ 2019-12-31 13:02 Igor Mammedov
  2019-12-31 13:02 ` [PATCH 01/86] numa: remove not needed check Igor Mammedov
                   ` (86 more replies)
  0 siblings, 87 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:02 UTC (permalink / raw)
  To: qemu-devel

Series removes ad hoc RAM allocation API (memory_region_allocate_system_memory)
and consolidates it around hostmem backend. It allows to
 * resolve conflicts between global -mem-prealloc and hostmem's "policy" option
   fixing premature allocation before binding policy is applied
 * simplify complicated memory allocation routines which had to deal with 2 ways
   to allocate RAM.
 * it allows to reuse hostmem backends of a choice for main RAM without adding
   extra CLI options to duplicate hostmem features.
   Recent case was -mem-shared, to enable vhost-user on targets that don't
   support hostmem backends [1] (ex: s390)
 * move RAM allocation from individual boards into generic machine code and
   provide them with prepared MemoryRegion.
 * clean up deprecated NUMA features which were tied to the old API (see patches)
    - "numa: remove deprecated -mem-path fallback to anonymous RAM"
    - "numa: remove deprecated implicit RAM distribution between nodes"
    - "forbid '-numa node,mem' for 5.0 and newer machine types"

Conversion introduces a new machine.ram-memdev property and wrapper code that
aliases global -mem-path and -mem-alloc into automatically created hostmem
backend properties (provided ram-memdev was not set explicitly by user).
And then follows bulk of trivial patches that incrementally convert individual
boards to using machine.ram-memdev provided MemoryRegion.

Board conversion typically involves:
 * providing MachineClass::default_ram_size and MachineClass::default_ram_id
   so generic code could create default backend if user didn't explicitly provide
   ram-memdev or -m options
 * dropping memory_region_allocate_system_memory() call
 * using covinience MachineState::ram MemoryRegion, which points to MemoryRegion
   allocated by ram-memdev
On top of that for some boards:
 * added missing ram_size checks (typically it were boards with fixed ram size)
 * ram_size fixups were replaced by checks and hard errors, forcing user to
   provide correct "-m" values instead of ignoring it and continuing running.
   
After all boards are converted the old API is removed and memory allocation
routines are cleaned up.

git tree for testing:
  https://github.com/imammedo/qemu convert_main_ram_to_memdev_v1

Igor Mammedov (86):
  numa: remove not needed check
  numa: properly check if numa is supported
  numa: remove deprecated -mem-path fallback to anonymous RAM
  machine: introduce ram-memdev property
  machine: alias -mem-path and -mem-prealloc into memory-foo backend
  machine: introduce convenience MachineState::ram
  initialize MachineState::ram in NUMA case
  alpha:dp264: use memdev for RAM
  arm:aspeed: convert valid RAM sizes to data
  arm:aspeed: actually check RAM size
  hw:aspeed: drop warning and bogus ram_size fixup
  arm:aspeed: use memdev for RAM
  arm:collie: use memdev for RAM
  arm:cubieboard: use memdev for RAM
  arm:digic_boards: use memdev for RAM
  arm:highbank: use memdev for RAM
  arm:imx25_pdk: drop RAM size fixup
  arm:imx25_pdk: use memdev for RAM
  arm:integratorcp: use memdev for RAM
  arm:kzm: drop RAM size fixup
  arm:kzm: use memdev for RAM
  arm:mcimx6ul-evk: use memdev for RAM
  arm:mcimx7d-sabre: use memdev for RAM
  arm:mps2-tz: use memdev for RAM
  arm:mps2: use memdev for RAM
  arm:musicpal: use memdev for RAM
  arm:nseries: use memdev for RAM
  arm:omap_sx1: use memdev for RAM
  arm:palm: use memdev for RAM
  arm:raspi: use memdev for RAM
  arm:sabrelite: use memdev for RAM
  arm:sbsa-ref: use memdev for RAM
  arm:versatilepb: use memdev for RAM
  arm:vexpress: use memdev for RAM
  arm:virt: use memdev for RAM
  arm:xilinx_zynq: drop RAM size fixup
  arm:xilinx_zynq: use memdev for RAM
  arm:xlnx-versal-virt: use memdev for RAM
  arm:xlnx-zcu102: use memdev for RAM
  s390x:s390-virtio-ccw: use memdev for RAM
  null-machine: use memdev for RAM
  cris:axis_dev88: use memdev for RAM
  hppa: drop RAM size fixup
  hppa: use memdev for RAM
  x86:microvm: use memdev for RAM
  x86:pc: use memdev for RAM
  lm32:lm32_boards: use memdev for RAM
  lm32:milkymist: use memdev for RAM
  m68k:an5206: use memdev for RAM
  m68k:mcf5208: use memdev for RAM
  m68k:next-cube: use memdev for RAM
  mips:boston-cube: use memdev for RAM
  mips:mips_fulong2e: drop RAM size fixup
  mips:mips_fulong2e: use memdev for RAM
  mips:mips_jazz: use memdev for RAM
  mips:mips_malta: use memdev for RAM
  mips:mips_mipssim: use memdev for RAM
  mips:mips_r4k: use memdev for RAM
  ppc:e500: drop RAM size fixup
  ppc:e500: use memdev for RAM
  ppc:mac_newworld: use memdev for RAM
  ppc:mac_oldworld: use memdev for RAM
  ppc:pnv: use memdev for RAM
  ppc:ppc405_boards: add RAM size checks
  ppc:ppc405_boards: use memdev for RAM
  ppc:ppc440_bamboo/sam460ex: drop RAM size fixup
  ppc:ppc440_bamboo/sam460ex: use memdev for RAM
  ppc:prep: use memdev for RAM
  ppc:spapr: use memdev for RAM
  ppc:virtex_ml507: remove unused arguments
  ppc:virtex_ml507: use memdev for RAM
  sparc:leon3: use memdev for RAM
  sparc:sun4m: use memdev for RAM
  sparc:niagara: use memdev for RAM
  remove no longer used memory_region_allocate_system_memory()
  post conversion default_ram_id cleanup
  exec: cleanup qemu_minrampagesize()/qemu_maxrampagesize()
  exec: drop bogus mem_path from qemu_ram_alloc_from_fd()
  make mem_path local variable
  hostmem: introduce "prealloc-threads" property
  hostmem: fix strict bind policy
  numa: forbid '-numa node,mem' for 5.0 and newer machine types
  tests:numa-test: make top level args dynamic and g_autofree(cli)
    cleanups
  tests:numa-test: use explicit memdev to specify node RAM
  numa: make exit() usage consistent
  numa: remove deprecated implicit RAM distribution between nodes

 hw/alpha/alpha_sys.h          |   2 +-
 include/hw/boards.h           |  51 ++++---------
 include/hw/misc/aspeed_sdmc.h |   2 +
 include/hw/ppc/ppc4xx.h       |   9 +--
 include/sysemu/hostmem.h      |  20 ++++-
 include/sysemu/numa.h         |   5 +-
 include/sysemu/sysemu.h       |   2 -
 backends/hostmem-file.c       |   8 --
 backends/hostmem-memfd.c      |   1 -
 backends/hostmem-ram.c        |   2 -
 backends/hostmem.c            |  53 ++++++++++----
 exec.c                        |  66 ++---------------
 hw/alpha/dp264.c              |   2 +-
 hw/alpha/typhoon.c            |   8 +-
 hw/arm/aspeed.c               |  13 +---
 hw/arm/collie.c               |  15 ++--
 hw/arm/cubieboard.c           |  25 ++-----
 hw/arm/digic_boards.c         |  35 +++++----
 hw/arm/highbank.c             |  10 +--
 hw/arm/imx25_pdk.c            |  13 ++--
 hw/arm/integratorcp.c         |   9 +--
 hw/arm/kzm.c                  |  13 ++--
 hw/arm/mcimx6ul-evk.c         |  25 +++----
 hw/arm/mcimx7d-sabre.c        |  25 +++----
 hw/arm/mps2-tz.c              |  13 +++-
 hw/arm/mps2.c                 |  13 +++-
 hw/arm/musicpal.c             |  16 ++--
 hw/arm/nseries.c              |  31 ++++----
 hw/arm/omap_sx1.c             |  18 +++--
 hw/arm/palm.c                 |  18 +++--
 hw/arm/raspi.c                |  32 +++-----
 hw/arm/sabrelite.c            |  23 ++----
 hw/arm/sbsa-ref.c             |   8 +-
 hw/arm/versatilepb.c          |   7 +-
 hw/arm/vexpress.c             |  14 ++--
 hw/arm/virt.c                 |   9 +--
 hw/arm/xilinx_zynq.c          |  20 +++--
 hw/arm/xlnx-versal-virt.c     |   7 +-
 hw/arm/xlnx-zcu102.c          |   7 +-
 hw/core/machine.c             |  41 +++++++++--
 hw/core/null-machine.c        |   7 +-
 hw/core/numa.c                | 167 +++++++++---------------------------------
 hw/cris/axis_dev88.c          |   8 +-
 hw/hppa/machine.c             |  10 +--
 hw/i386/microvm.c             |  12 ++-
 hw/i386/pc.c                  |  20 +++--
 hw/i386/pc_piix.c             |   2 +-
 hw/i386/pc_q35.c              |   2 +-
 hw/lm32/lm32_boards.c         |  36 +++++----
 hw/lm32/milkymist.c           |  19 +++--
 hw/m68k/an5206.c              |   5 +-
 hw/m68k/mcf5208.c             |   5 +-
 hw/m68k/next-cube.c           |   5 +-
 hw/mips/boston.c              |  11 ++-
 hw/mips/mips_fulong2e.c       |  15 ++--
 hw/mips/mips_jazz.c           |   7 +-
 hw/mips/mips_malta.c          |  10 +--
 hw/mips/mips_mipssim.c        |   9 +--
 hw/mips/mips_r4k.c            |  12 +--
 hw/misc/aspeed_sdmc.c         | 112 +++++++++++-----------------
 hw/ppc/e500.c                 |  17 ++---
 hw/ppc/e500plat.c             |   1 +
 hw/ppc/mac_newworld.c         |   6 +-
 hw/ppc/mac_oldworld.c         |   6 +-
 hw/ppc/mpc8544ds.c            |   1 +
 hw/ppc/pnv.c                  |   8 +-
 hw/ppc/ppc405_boards.c        |  45 +++++++-----
 hw/ppc/ppc440_bamboo.c        |  12 ++-
 hw/ppc/ppc4xx_devs.c          |  30 ++++----
 hw/ppc/prep.c                 |  15 ++--
 hw/ppc/sam460ex.c             |   6 +-
 hw/ppc/spapr.c                |  17 +----
 hw/ppc/virtex_ml507.c         |  18 ++---
 hw/s390x/s390-virtio-ccw.c    |   7 +-
 hw/sparc/leon3.c              |   6 +-
 hw/sparc/sun4m.c              |  73 +++++++++---------
 hw/sparc64/niagara.c          |   7 +-
 qemu-deprecated.texi          |  33 ---------
 qemu-options.hx               |  20 ++---
 tests/numa-test.c             |  90 +++++++++++++----------
 vl.c                          |  37 +++++++++-
 81 files changed, 713 insertions(+), 907 deletions(-)

-- 
2.7.4



^ permalink raw reply	[flat|nested] 148+ messages in thread

* [PATCH 01/86] numa: remove not needed check
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
@ 2019-12-31 13:02 ` Igor Mammedov
  2019-12-31 13:02 ` [PATCH 02/86] numa: properly check if numa is supported Igor Mammedov
                   ` (85 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:02 UTC (permalink / raw)
  To: qemu-devel

Currently parse_numa_node() is always called from already numa
enabled context.
Drop unnecessary check if numa is supported.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
Reviewed-by: Eduardo Habkost <ehabkost@redhat.com>
---
 hw/core/numa.c | 7 +------
 1 file changed, 1 insertion(+), 6 deletions(-)

diff --git a/hw/core/numa.c b/hw/core/numa.c
index e3332a9..19f082d 100644
--- a/hw/core/numa.c
+++ b/hw/core/numa.c
@@ -83,10 +83,6 @@ static void parse_numa_node(MachineState *ms, NumaNodeOptions *node,
         return;
     }
 
-    if (!mc->cpu_index_to_instance_props || !mc->get_default_cpu_node_id) {
-        error_setg(errp, "NUMA is not supported by this machine-type");
-        return;
-    }
     for (cpus = node->cpus; cpus; cpus = cpus->next) {
         CpuInstanceProperties props;
         if (cpus->value >= max_cpus) {
@@ -178,9 +174,8 @@ void parse_numa_distance(MachineState *ms, NumaDistOptions *dist, Error **errp)
 void set_numa_options(MachineState *ms, NumaOptions *object, Error **errp)
 {
     Error *err = NULL;
-    MachineClass *mc = MACHINE_GET_CLASS(ms);
 
-    if (!mc->numa_mem_supported) {
+    if (!ms->numa_state) {
         error_setg(errp, "NUMA is not supported by this machine-type");
         goto end;
     }
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 02/86] numa: properly check if numa is supported
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
  2019-12-31 13:02 ` [PATCH 01/86] numa: remove not needed check Igor Mammedov
@ 2019-12-31 13:02 ` Igor Mammedov
  2019-12-31 13:02 ` [PATCH 03/86] numa: remove deprecated -mem-path fallback to anonymous RAM Igor Mammedov
                   ` (84 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:02 UTC (permalink / raw)
  To: qemu-devel

Commit aa57020774b, by mistake used MachineClass::numa_mem_supported
to check if NUMA is supported by machine and also as unrelated change
set it to true for sbsa-ref board.

Luckily change didn't break machines that support NUMA, as the field
is set to true for them.

But the field is not intended for checking if NUMA is supported and
will be flipped to false within this release for new machine types.

Fix it:
 - by using previously used condition
      !mc->cpu_index_to_instance_props || !mc->get_default_cpu_node_id
   the first time and then use MachineState::numa_state down the road
   to check if NUMA is supported
 - dropping stray sbsa-ref chunk

Fixes: aa57020774b690a22be72453b8e91c9b5a68c516
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
Reviewed-by: Eduardo Habkost <ehabkost@redhat.com>
---
 hw/arm/sbsa-ref.c | 1 -
 hw/core/machine.c | 4 ++--
 2 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/hw/arm/sbsa-ref.c b/hw/arm/sbsa-ref.c
index 5853bde..9b5bcb5 100644
--- a/hw/arm/sbsa-ref.c
+++ b/hw/arm/sbsa-ref.c
@@ -789,7 +789,6 @@ static void sbsa_ref_class_init(ObjectClass *oc, void *data)
     mc->possible_cpu_arch_ids = sbsa_ref_possible_cpu_arch_ids;
     mc->cpu_index_to_instance_props = sbsa_ref_cpu_index_to_props;
     mc->get_default_cpu_node_id = sbsa_ref_get_default_cpu_node_id;
-    mc->numa_mem_supported = true;
 }
 
 static const TypeInfo sbsa_ref_info = {
diff --git a/hw/core/machine.c b/hw/core/machine.c
index 56137e9..73bf1f8 100644
--- a/hw/core/machine.c
+++ b/hw/core/machine.c
@@ -843,7 +843,7 @@ static void machine_initfn(Object *obj)
                                         NULL);
     }
 
-    if (mc->numa_mem_supported) {
+    if (mc->cpu_index_to_instance_props && mc->get_default_cpu_node_id) {
         ms->numa_state = g_new0(NumaState, 1);
     }
 
@@ -966,7 +966,7 @@ void machine_run_board_init(MachineState *machine)
 {
     MachineClass *machine_class = MACHINE_GET_CLASS(machine);
 
-    if (machine_class->numa_mem_supported) {
+    if (machine->numa_state) {
         numa_complete_configuration(machine);
         if (machine->numa_state->num_nodes) {
             machine_numa_finish_cpu_init(machine);
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 03/86] numa: remove deprecated -mem-path fallback to anonymous RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
  2019-12-31 13:02 ` [PATCH 01/86] numa: remove not needed check Igor Mammedov
  2019-12-31 13:02 ` [PATCH 02/86] numa: properly check if numa is supported Igor Mammedov
@ 2019-12-31 13:02 ` Igor Mammedov
  2019-12-31 13:02 ` [PATCH 04/86] machine: introduce ram-memdev property Igor Mammedov
                   ` (83 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:02 UTC (permalink / raw)
  To: qemu-devel

it was deprecated since 4.0 by commit
 cb79224b7 (deprecate -mem-path fallback to anonymous RAM)
Deprecation period ran ont and it's time to remove it
so it won't get in a way of switching to using hostmem
backend for RAM.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/core/numa.c       | 18 +-----------------
 qemu-deprecated.texi |  9 ---------
 2 files changed, 1 insertion(+), 26 deletions(-)

diff --git a/hw/core/numa.c b/hw/core/numa.c
index 19f082d..e0c6a69 100644
--- a/hw/core/numa.c
+++ b/hw/core/numa.c
@@ -487,24 +487,8 @@ static void allocate_system_memory_nonnuma(MemoryRegion *mr, Object *owner,
 {
     if (mem_path) {
 #ifdef __linux__
-        Error *err = NULL;
         memory_region_init_ram_from_file(mr, owner, name, ram_size, 0, 0,
-                                         mem_path, &err);
-        if (err) {
-            error_report_err(err);
-            if (mem_prealloc) {
-                exit(1);
-            }
-            warn_report("falling back to regular RAM allocation");
-            error_printf("This is deprecated. Make sure that -mem-path "
-                         " specified path has sufficient resources to allocate"
-                         " -m specified RAM amount\n");
-            /* Legacy behavior: if allocation failed, fall back to
-             * regular RAM allocation.
-             */
-            mem_path = NULL;
-            memory_region_init_ram_nomigrate(mr, owner, name, ram_size, &error_fatal);
-        }
+                                         mem_path, &error_fatal);
 #else
         fprintf(stderr, "-mem-path not supported on this host\n");
         exit(1);
diff --git a/qemu-deprecated.texi b/qemu-deprecated.texi
index 97ba3cb..5178905 100644
--- a/qemu-deprecated.texi
+++ b/qemu-deprecated.texi
@@ -113,15 +113,6 @@ QEMU using implicit generic or board specific splitting rule.
 Use @option{memdev} with @var{memory-backend-ram} backend or @option{mem} (if
 it's supported by used machine type) to define mapping explictly instead.
 
-@subsection -mem-path fallback to RAM (since 4.1)
-Currently if guest RAM allocation from file pointed by @option{mem-path}
-fails, QEMU falls back to allocating from RAM, which might result
-in unpredictable behavior since the backing file specified by the user
-is ignored. In the future, users will be responsible for making sure
-the backing storage specified with @option{-mem-path} can actually provide
-the guest RAM configured with @option{-m} and QEMU will fail to start up if
-RAM allocation is unsuccessful.
-
 @subsection RISC-V -bios (since 4.1)
 
 QEMU 4.1 introduced support for the -bios option in QEMU for RISC-V for the
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 04/86] machine: introduce ram-memdev property
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (2 preceding siblings ...)
  2019-12-31 13:02 ` [PATCH 03/86] numa: remove deprecated -mem-path fallback to anonymous RAM Igor Mammedov
@ 2019-12-31 13:02 ` Igor Mammedov
  2019-12-31 13:02 ` [PATCH 05/86] machine: alias -mem-path and -mem-prealloc into memory-foo backend Igor Mammedov
                   ` (82 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:02 UTC (permalink / raw)
  To: qemu-devel

Property will contain link to memory backend that will be
used for backing initial RAM.
Follow up commit will alias -mem-path and -mem-prealloc
CLI options into memory backend options to make memory
handling consistent (using only hostmem backend family
for guest RAM allocation).

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 include/hw/boards.h | 2 ++
 hw/core/machine.c   | 9 +++++++++
 2 files changed, 11 insertions(+)

diff --git a/include/hw/boards.h b/include/hw/boards.h
index 61f8bb8..8e2bf2b 100644
--- a/include/hw/boards.h
+++ b/include/hw/boards.h
@@ -4,6 +4,7 @@
 #define HW_BOARDS_H
 
 #include "exec/memory.h"
+#include "sysemu/hostmem.h"
 #include "sysemu/blockdev.h"
 #include "sysemu/accel.h"
 #include "qapi/qapi-types-machine.h"
@@ -288,6 +289,7 @@ struct MachineState {
     bool enforce_config_section;
     bool enable_graphics;
     char *memory_encryption;
+    HostMemoryBackend *ram_memdev;
     DeviceMemoryState *device_memory;
 
     ram_addr_t ram_size;
diff --git a/hw/core/machine.c b/hw/core/machine.c
index 73bf1f8..4a5cd0d 100644
--- a/hw/core/machine.c
+++ b/hw/core/machine.c
@@ -847,6 +847,15 @@ static void machine_initfn(Object *obj)
         ms->numa_state = g_new0(NumaState, 1);
     }
 
+    object_property_add_link(obj, "ram-memdev", TYPE_MEMORY_BACKEND,
+                             (Object **)&ms->ram_memdev,
+                             object_property_allow_set_link,
+                             OBJ_PROP_LINK_STRONG, &error_abort);
+    object_property_set_description(obj, "ram-memdev",
+                                    "Set RAM backend"
+                                    "Valid value is ID of hostmem based backend",
+                                     &error_abort);
+
     /* Register notifier when init is done for sysbus sanity checks */
     ms->sysbus_notifier.notify = machine_init_notify;
     qemu_add_machine_init_done_notifier(&ms->sysbus_notifier);
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 05/86] machine: alias -mem-path and -mem-prealloc into memory-foo backend
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (3 preceding siblings ...)
  2019-12-31 13:02 ` [PATCH 04/86] machine: introduce ram-memdev property Igor Mammedov
@ 2019-12-31 13:02 ` Igor Mammedov
  2019-12-31 13:02 ` [PATCH 06/86] machine: introduce convenience MachineState::ram Igor Mammedov
                   ` (81 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:02 UTC (permalink / raw)
  To: qemu-devel

Allow a machine to opt in for hostmem backend based initial
RAM even if user used old -mem-path/prealloc options by providing
  MachineClass::default_ram_id
Follow up patches will incrementally convert machines to new API,
by dropping memory_region_allocate_system_memory() and setting
default_ram_id that board used to use before conversion to keep
migration stream the same.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 include/hw/boards.h      |  5 +++++
 include/sysemu/hostmem.h | 16 ++++++++++++++++
 backends/hostmem-file.c  |  7 -------
 backends/hostmem-ram.c   |  2 --
 vl.c                     | 25 +++++++++++++++++++++++++
 5 files changed, 46 insertions(+), 9 deletions(-)

diff --git a/include/hw/boards.h b/include/hw/boards.h
index 8e2bf2b..65da7f0 100644
--- a/include/hw/boards.h
+++ b/include/hw/boards.h
@@ -170,6 +170,10 @@ typedef struct {
  *    false is returned, an error must be set to show the reason of
  *    the rejection.  If the hook is not provided, all hotplug will be
  *    allowed.
+ * @default_ram_id:
+ *    Specifies inital RAM MemoryRegion name to be used for default backend
+ *    creation if user explicitly hasn't specified backend with "ram-memdev"
+ *    property.
  */
 struct MachineClass {
     /*< private >*/
@@ -226,6 +230,7 @@ struct MachineClass {
     bool nvdimm_supported;
     bool numa_mem_supported;
     bool auto_enable_numa;
+    const char *default_ram_id;
 
     HotplugHandler *(*get_hotplug_handler)(MachineState *machine,
                                            DeviceState *dev);
diff --git a/include/sysemu/hostmem.h b/include/sysemu/hostmem.h
index 4dbdadd..5db0d66 100644
--- a/include/sysemu/hostmem.h
+++ b/include/sysemu/hostmem.h
@@ -27,6 +27,22 @@
 #define MEMORY_BACKEND_CLASS(klass) \
     OBJECT_CLASS_CHECK(HostMemoryBackendClass, (klass), TYPE_MEMORY_BACKEND)
 
+/* hostmem-ram.c */
+/**
+ * @TYPE_MEMORY_BACKEND_RAM:
+ * name of backend that uses mmap on the anonymous RAM
+ */
+
+#define TYPE_MEMORY_BACKEND_RAM "memory-backend-ram"
+
+/* hostmem-file.c */
+/**
+ * @TYPE_MEMORY_BACKEND_FILE:
+ * name of backend that uses mmap on a file descriptor
+ */
+#define TYPE_MEMORY_BACKEND_FILE "memory-backend-file"
+
+typedef struct HostMemoryBackend HostMemoryBackend;
 typedef struct HostMemoryBackendClass HostMemoryBackendClass;
 
 /**
diff --git a/backends/hostmem-file.c b/backends/hostmem-file.c
index be64020..cb319a9 100644
--- a/backends/hostmem-file.c
+++ b/backends/hostmem-file.c
@@ -18,13 +18,6 @@
 #include "sysemu/sysemu.h"
 #include "qom/object_interfaces.h"
 
-/* hostmem-file.c */
-/**
- * @TYPE_MEMORY_BACKEND_FILE:
- * name of backend that uses mmap on a file descriptor
- */
-#define TYPE_MEMORY_BACKEND_FILE "memory-backend-file"
-
 #define MEMORY_BACKEND_FILE(obj) \
     OBJECT_CHECK(HostMemoryBackendFile, (obj), TYPE_MEMORY_BACKEND_FILE)
 
diff --git a/backends/hostmem-ram.c b/backends/hostmem-ram.c
index 6aab8d3..5cc53e7 100644
--- a/backends/hostmem-ram.c
+++ b/backends/hostmem-ram.c
@@ -16,8 +16,6 @@
 #include "qemu/module.h"
 #include "qom/object_interfaces.h"
 
-#define TYPE_MEMORY_BACKEND_RAM "memory-backend-ram"
-
 static void
 ram_backend_memory_alloc(HostMemoryBackend *backend, Error **errp)
 {
diff --git a/vl.c b/vl.c
index 86474a5..579ae44 100644
--- a/vl.c
+++ b/vl.c
@@ -75,6 +75,7 @@ int main(int argc, char **argv)
 #include "ui/input.h"
 #include "sysemu/sysemu.h"
 #include "sysemu/numa.h"
+#include "sysemu/hostmem.h"
 #include "exec/gdbstub.h"
 #include "qemu/timer.h"
 #include "chardev/char.h"
@@ -2814,6 +2815,25 @@ static void configure_accelerators(const char *progname)
     }
 }
 
+static void create_default_memdev(MachineState *ms, const char *path,
+                                  bool prealloc)
+{
+    Object *obj;
+    MachineClass *mc = MACHINE_GET_CLASS(ms);
+
+    obj = object_new(path ? TYPE_MEMORY_BACKEND_FILE : TYPE_MEMORY_BACKEND_RAM);
+    if (path) {
+        object_property_set_str(obj, path, "mem-path", &error_fatal);
+    }
+    object_property_set_bool(obj, prealloc, "prealloc", &error_fatal);
+    object_property_set_int(obj, ms->ram_size, "size", &error_fatal);
+    object_property_add_child(object_get_objects_root(), mc->default_ram_id,
+                              obj, &error_fatal);
+    user_creatable_complete(USER_CREATABLE(obj), &error_fatal);
+    object_unref(obj);
+    object_property_set_link(OBJECT(ms), obj, "ram-memdev", &error_fatal);
+}
+
 int main(int argc, char **argv, char **envp)
 {
     int i;
@@ -4274,6 +4294,11 @@ int main(int argc, char **argv, char **envp)
     }
     parse_numa_opts(current_machine);
 
+    if (!current_machine->ram_memdev &&
+         machine_class->default_ram_size &&
+         machine_class->default_ram_id) {
+        create_default_memdev(current_machine, mem_path, mem_prealloc);
+    }
     /* do monitor/qmp handling at preconfig state if requested */
     main_loop();
 
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 06/86] machine: introduce convenience MachineState::ram
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (4 preceding siblings ...)
  2019-12-31 13:02 ` [PATCH 05/86] machine: alias -mem-path and -mem-prealloc into memory-foo backend Igor Mammedov
@ 2019-12-31 13:02 ` Igor Mammedov
  2019-12-31 13:02 ` [PATCH 07/86] initialize MachineState::ram in NUMA case Igor Mammedov
                   ` (80 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:02 UTC (permalink / raw)
  To: qemu-devel

the new field will be used by boards to get access to main
RAM memory region and will help to save boiler plate in
boards which often add a field or variable just for this
purpose.

Memory region will be equivalent to what currently used
memory_region_allocate_system_memory() is returning apart
from that it will come from hostmem backend.
Followup patches will incrementally switch boards to using
RAM from MachineState::ram.

Patch takes care of non-NUMA case and follow up patch will
initialize MachineState::ram for NUMA case.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 include/hw/boards.h |  9 ++++++++-
 hw/core/machine.c   | 21 +++++++++++++++++++++
 hw/core/numa.c      | 14 +-------------
 3 files changed, 30 insertions(+), 14 deletions(-)

diff --git a/include/hw/boards.h b/include/hw/boards.h
index 65da7f0..70491c1 100644
--- a/include/hw/boards.h
+++ b/include/hw/boards.h
@@ -73,7 +73,12 @@ void machine_set_cpu_numa_node(MachineState *machine,
                                Error **errp);
 
 void machine_class_allow_dynamic_sysbus_dev(MachineClass *mc, const char *type);
-
+/*
+ * Checks that backend isn't used, preps it for exclusive usage and
+ * returns migratable MemoryRegion provided by backend.
+ */
+MemoryRegion *machine_consume_memdev(MachineState *machine,
+                                     HostMemoryBackend *backend);
 
 /**
  * CPUArchId:
@@ -295,6 +300,8 @@ struct MachineState {
     bool enable_graphics;
     char *memory_encryption;
     HostMemoryBackend *ram_memdev;
+    /* convenience alias to ram_memdev memory region or numa container */
+    MemoryRegion *ram;
     DeviceMemoryState *device_memory;
 
     ram_addr_t ram_size;
diff --git a/hw/core/machine.c b/hw/core/machine.c
index 4a5cd0d..080ce57 100644
--- a/hw/core/machine.c
+++ b/hw/core/machine.c
@@ -26,6 +26,7 @@
 #include "sysemu/qtest.h"
 #include "hw/pci/pci.h"
 #include "hw/mem/nvdimm.h"
+#include "migration/vmstate.h"
 
 GlobalProperty hw_compat_4_2[] = {
     { "virtio-blk-device", "x-enable-wce-if-config-wce", "off" },
@@ -971,10 +972,30 @@ static void machine_numa_finish_cpu_init(MachineState *machine)
     g_string_free(s, true);
 }
 
+MemoryRegion *machine_consume_memdev(MachineState *machine,
+                                     HostMemoryBackend *backend)
+{
+    MemoryRegion *ret = host_memory_backend_get_memory(backend);
+
+    if (memory_region_is_mapped(ret)) {
+        char *path = object_get_canonical_path_component(OBJECT(backend));
+        error_report("memory backend %s can't be used multiple times.", path);
+        g_free(path);
+        exit(EXIT_FAILURE);
+    }
+    host_memory_backend_set_mapped(backend, true);
+    vmstate_register_ram_global(ret);
+    return ret;
+}
+
 void machine_run_board_init(MachineState *machine)
 {
     MachineClass *machine_class = MACHINE_GET_CLASS(machine);
 
+    if (machine->ram_memdev) {
+        machine->ram = machine_consume_memdev(machine, machine->ram_memdev);
+    }
+
     if (machine->numa_state) {
         numa_complete_configuration(machine);
         if (machine->numa_state->num_nodes) {
diff --git a/hw/core/numa.c b/hw/core/numa.c
index e0c6a69..ee655b0 100644
--- a/hw/core/numa.c
+++ b/hw/core/numa.c
@@ -520,20 +520,8 @@ void memory_region_allocate_system_memory(MemoryRegion *mr, Object *owner,
         if (!backend) {
             continue;
         }
-        MemoryRegion *seg = host_memory_backend_get_memory(backend);
-
-        if (memory_region_is_mapped(seg)) {
-            char *path = object_get_canonical_path_component(OBJECT(backend));
-            error_report("memory backend %s is used multiple times. Each "
-                         "-numa option must use a different memdev value.",
-                         path);
-            g_free(path);
-            exit(1);
-        }
-
-        host_memory_backend_set_mapped(backend, true);
+        MemoryRegion *seg = machine_consume_memdev(ms, backend);
         memory_region_add_subregion(mr, addr, seg);
-        vmstate_register_ram_global(seg);
         addr += size;
     }
 }
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 07/86] initialize MachineState::ram in NUMA case
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (5 preceding siblings ...)
  2019-12-31 13:02 ` [PATCH 06/86] machine: introduce convenience MachineState::ram Igor Mammedov
@ 2019-12-31 13:02 ` Igor Mammedov
  2019-12-31 13:02 ` [PATCH 08/86] alpha:dp264: use memdev for RAM Igor Mammedov
                   ` (79 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:02 UTC (permalink / raw)
  To: qemu-devel

In case of NUMA there are 2 cases to consider:
 1. '-numa node,memdev', the only one that will be available
    for 5.0 and newer machine types.

    In this case reuse current behavior, with only difference
    memdevs are put into MachineState::ram container +
    a temporary glue to keep memory_region_allocate_system_memory()
    working until all boards converted.

 2. fake NUMA ("-numa node mem" and default RAM splitting)
    the later has been deprecated and will be removed but the former
    is going to stay available for compat reasons for 4.2 and
    older machine types (libvirt was heavy user of this)

    it takes allocate_system_memory_nonnuma() path, like non-NUMA
    case and falls under conversion to memdev.  So extend non-NUMA
    MachineState::ram initialization introduced in previous patch
    to take care of fake NUMA case.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 include/sysemu/numa.h |  1 +
 hw/core/numa.c        | 43 ++++++++++++++++++++++++++++++-------------
 vl.c                  |  7 ++++---
 3 files changed, 35 insertions(+), 16 deletions(-)

diff --git a/include/sysemu/numa.h b/include/sysemu/numa.h
index ae9c41d..21f6a5a 100644
--- a/include/sysemu/numa.h
+++ b/include/sysemu/numa.h
@@ -49,5 +49,6 @@ void numa_default_auto_assign_ram(MachineClass *mc, NodeInfo *nodes,
                                   int nb_nodes, ram_addr_t size);
 void numa_cpu_pre_plug(const struct CPUArchId *slot, DeviceState *dev,
                        Error **errp);
+bool numa_uses_legacy_mem(void);
 
 #endif
diff --git a/hw/core/numa.c b/hw/core/numa.c
index ee655b0..a752866 100644
--- a/hw/core/numa.c
+++ b/hw/core/numa.c
@@ -51,6 +51,11 @@ QemuOptsList qemu_numa_opts = {
 };
 
 static int have_memdevs;
+bool numa_uses_legacy_mem(void)
+{
+    return !have_memdevs;
+}
+
 static int have_mem;
 static int max_numa_nodeid; /* Highest specified NUMA node ID, plus one.
                              * For all nodes, nodeid < max_numa_nodeid
@@ -355,6 +360,23 @@ void numa_default_auto_assign_ram(MachineClass *mc, NodeInfo *nodes,
     nodes[i].node_mem = size - usedmem;
 }
 
+static void numa_init_memdev_container(MachineState *ms, MemoryRegion *ram)
+{
+    int i;
+    uint64_t addr = 0;
+
+    for (i = 0; i < ms->numa_state->num_nodes; i++) {
+        uint64_t size = ms->numa_state->nodes[i].node_mem;
+        HostMemoryBackend *backend = ms->numa_state->nodes[i].node_memdev;
+        if (!backend) {
+            continue;
+        }
+        MemoryRegion *seg = machine_consume_memdev(ms, backend);
+        memory_region_add_subregion(ram, addr, seg);
+        addr += size;
+    }
+}
+
 void numa_complete_configuration(MachineState *ms)
 {
     int i;
@@ -437,6 +459,12 @@ void numa_complete_configuration(MachineState *ms)
             exit(1);
         }
 
+        if (!numa_uses_legacy_mem() && mc->default_ram_id) {
+            ms->ram = g_new(MemoryRegion, 1);
+            memory_region_init(ms->ram, OBJECT(ms), mc->default_ram_id,
+                               ram_size);
+            numa_init_memdev_container(ms, ms->ram);
+        }
         /* QEMU needs at least all unique node pair distances to build
          * the whole NUMA distance table. QEMU treats the distance table
          * as symmetric by default, i.e. distance A->B == distance B->A.
@@ -503,27 +531,16 @@ void memory_region_allocate_system_memory(MemoryRegion *mr, Object *owner,
                                           const char *name,
                                           uint64_t ram_size)
 {
-    uint64_t addr = 0;
-    int i;
     MachineState *ms = MACHINE(qdev_get_machine());
 
     if (ms->numa_state == NULL ||
-        ms->numa_state->num_nodes == 0 || !have_memdevs) {
+        ms->numa_state->num_nodes == 0 || numa_uses_legacy_mem()) {
         allocate_system_memory_nonnuma(mr, owner, name, ram_size);
         return;
     }
 
     memory_region_init(mr, owner, name, ram_size);
-    for (i = 0; i < ms->numa_state->num_nodes; i++) {
-        uint64_t size = ms->numa_state->nodes[i].node_mem;
-        HostMemoryBackend *backend = ms->numa_state->nodes[i].node_memdev;
-        if (!backend) {
-            continue;
-        }
-        MemoryRegion *seg = machine_consume_memdev(ms, backend);
-        memory_region_add_subregion(mr, addr, seg);
-        addr += size;
-    }
+    numa_init_memdev_container(ms, mr);
 }
 
 static void numa_stat_memory_devices(NumaNodeMem node_mem[])
diff --git a/vl.c b/vl.c
index 579ae44..b89e76c 100644
--- a/vl.c
+++ b/vl.c
@@ -4294,9 +4294,10 @@ int main(int argc, char **argv, char **envp)
     }
     parse_numa_opts(current_machine);
 
-    if (!current_machine->ram_memdev &&
-         machine_class->default_ram_size &&
-         machine_class->default_ram_id) {
+    if (numa_uses_legacy_mem() &&
+        machine_class->default_ram_size &&
+        machine_class->default_ram_id &&
+        !current_machine->ram_memdev) {
         create_default_memdev(current_machine, mem_path, mem_prealloc);
     }
     /* do monitor/qmp handling at preconfig state if requested */
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 08/86] alpha:dp264: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (6 preceding siblings ...)
  2019-12-31 13:02 ` [PATCH 07/86] initialize MachineState::ram in NUMA case Igor Mammedov
@ 2019-12-31 13:02 ` Igor Mammedov
  2019-12-31 16:11   ` Philippe Mathieu-Daudé
  2020-01-06  0:37   ` Richard Henderson
  2019-12-31 13:02 ` [PATCH 09/86] arm:aspeed: convert valid RAM sizes to data Igor Mammedov
                   ` (78 subsequent siblings)
  86 siblings, 2 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:02 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/alpha/alpha_sys.h | 2 +-
 hw/alpha/dp264.c     | 3 ++-
 hw/alpha/typhoon.c   | 8 ++------
 3 files changed, 5 insertions(+), 8 deletions(-)

diff --git a/hw/alpha/alpha_sys.h b/hw/alpha/alpha_sys.h
index 95033d7..bc0a286 100644
--- a/hw/alpha/alpha_sys.h
+++ b/hw/alpha/alpha_sys.h
@@ -11,7 +11,7 @@
 #include "hw/intc/i8259.h"
 
 
-PCIBus *typhoon_init(ram_addr_t, ISABus **, qemu_irq *, AlphaCPU *[4],
+PCIBus *typhoon_init(MemoryRegion *, ISABus **, qemu_irq *, AlphaCPU *[4],
                      pci_map_irq_fn);
 
 /* alpha_pci.c.  */
diff --git a/hw/alpha/dp264.c b/hw/alpha/dp264.c
index f2026fd..29439c7 100644
--- a/hw/alpha/dp264.c
+++ b/hw/alpha/dp264.c
@@ -75,7 +75,7 @@ static void clipper_init(MachineState *machine)
     cpus[0]->env.trap_arg2 = smp_cpus;
 
     /* Init the chipset.  */
-    pci_bus = typhoon_init(ram_size, &isa_bus, &rtc_irq, cpus,
+    pci_bus = typhoon_init(machine->ram, &isa_bus, &rtc_irq, cpus,
                            clipper_pci_map_irq);
 
     /* Since we have an SRM-compatible PALcode, use the SRM epoch.  */
@@ -183,6 +183,7 @@ static void clipper_machine_init(MachineClass *mc)
     mc->max_cpus = 4;
     mc->is_default = 1;
     mc->default_cpu_type = ALPHA_CPU_TYPE_NAME("ev67");
+    mc->default_ram_id = "ram";
 }
 
 DEFINE_MACHINE("clipper", clipper_machine_init)
diff --git a/hw/alpha/typhoon.c b/hw/alpha/typhoon.c
index 179e1f7..1795e2f 100644
--- a/hw/alpha/typhoon.c
+++ b/hw/alpha/typhoon.c
@@ -58,7 +58,6 @@ typedef struct TyphoonState {
     TyphoonCchip cchip;
     TyphoonPchip pchip;
     MemoryRegion dchip_region;
-    MemoryRegion ram_region;
 } TyphoonState;
 
 /* Called when one of DRIR or DIM changes.  */
@@ -817,8 +816,7 @@ static void typhoon_alarm_timer(void *opaque)
     cpu_interrupt(CPU(s->cchip.cpu[cpu]), CPU_INTERRUPT_TIMER);
 }
 
-PCIBus *typhoon_init(ram_addr_t ram_size, ISABus **isa_bus,
-                     qemu_irq *p_rtc_irq,
+PCIBus *typhoon_init(MemoryRegion *ram, ISABus **isa_bus, qemu_irq *p_rtc_irq,
                      AlphaCPU *cpus[4], pci_map_irq_fn sys_map_irq)
 {
     MemoryRegion *addr_space = get_system_memory();
@@ -851,9 +849,7 @@ PCIBus *typhoon_init(ram_addr_t ram_size, ISABus **isa_bus,
 
     /* Main memory region, 0x00.0000.0000.  Real hardware supports 32GB,
        but the address space hole reserved at this point is 8TB.  */
-    memory_region_allocate_system_memory(&s->ram_region, OBJECT(s), "ram",
-                                         ram_size);
-    memory_region_add_subregion(addr_space, 0, &s->ram_region);
+    memory_region_add_subregion(addr_space, 0, ram);
 
     /* TIGbus, 0x801.0000.0000, 1GB.  */
     /* ??? The TIGbus is used for delivering interrupts, and access to
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 09/86] arm:aspeed: convert valid RAM sizes to data
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (7 preceding siblings ...)
  2019-12-31 13:02 ` [PATCH 08/86] alpha:dp264: use memdev for RAM Igor Mammedov
@ 2019-12-31 13:02 ` Igor Mammedov
  2019-12-31 13:02 ` [PATCH 10/86] arm:aspeed: actually check RAM size Igor Mammedov
                   ` (77 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:02 UTC (permalink / raw)
  To: qemu-devel

various foo_rambits() hardcode mapping of RAM sizes to RAM feature bits,
which is hard to reuse and repeats over and over.

Convert maps into GLib's hash tables and perform mapping using
common mapping function.

Follow up patch will reuse tables for actually checking ram-size
property.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 include/hw/misc/aspeed_sdmc.h |   2 +
 hw/misc/aspeed_sdmc.c         | 116 ++++++++++++++++--------------------------
 2 files changed, 47 insertions(+), 71 deletions(-)

diff --git a/include/hw/misc/aspeed_sdmc.h b/include/hw/misc/aspeed_sdmc.h
index 5dbde59..de1501f 100644
--- a/include/hw/misc/aspeed_sdmc.h
+++ b/include/hw/misc/aspeed_sdmc.h
@@ -39,6 +39,8 @@ typedef struct AspeedSDMCState {
 typedef struct AspeedSDMCClass {
     SysBusDeviceClass parent_class;
 
+    GHashTable *ram2feat;
+    int fallback_ram_size;
     uint64_t max_ram_size;
     uint32_t (*compute_conf)(AspeedSDMCState *s, uint32_t data);
     void (*write)(AspeedSDMCState *s, uint32_t reg, uint32_t data);
diff --git a/hw/misc/aspeed_sdmc.c b/hw/misc/aspeed_sdmc.c
index 2df3244..3fc80f0 100644
--- a/hw/misc/aspeed_sdmc.c
+++ b/hw/misc/aspeed_sdmc.c
@@ -148,72 +148,6 @@ static const MemoryRegionOps aspeed_sdmc_ops = {
     .valid.max_access_size = 4,
 };
 
-static int ast2400_rambits(AspeedSDMCState *s)
-{
-    switch (s->ram_size >> 20) {
-    case 64:
-        return ASPEED_SDMC_DRAM_64MB;
-    case 128:
-        return ASPEED_SDMC_DRAM_128MB;
-    case 256:
-        return ASPEED_SDMC_DRAM_256MB;
-    case 512:
-        return ASPEED_SDMC_DRAM_512MB;
-    default:
-        break;
-    }
-
-    /* use a common default */
-    warn_report("Invalid RAM size 0x%" PRIx64 ". Using default 256M",
-                s->ram_size);
-    s->ram_size = 256 << 20;
-    return ASPEED_SDMC_DRAM_256MB;
-}
-
-static int ast2500_rambits(AspeedSDMCState *s)
-{
-    switch (s->ram_size >> 20) {
-    case 128:
-        return ASPEED_SDMC_AST2500_128MB;
-    case 256:
-        return ASPEED_SDMC_AST2500_256MB;
-    case 512:
-        return ASPEED_SDMC_AST2500_512MB;
-    case 1024:
-        return ASPEED_SDMC_AST2500_1024MB;
-    default:
-        break;
-    }
-
-    /* use a common default */
-    warn_report("Invalid RAM size 0x%" PRIx64 ". Using default 512M",
-                s->ram_size);
-    s->ram_size = 512 << 20;
-    return ASPEED_SDMC_AST2500_512MB;
-}
-
-static int ast2600_rambits(AspeedSDMCState *s)
-{
-    switch (s->ram_size >> 20) {
-    case 256:
-        return ASPEED_SDMC_AST2600_256MB;
-    case 512:
-        return ASPEED_SDMC_AST2600_512MB;
-    case 1024:
-        return ASPEED_SDMC_AST2600_1024MB;
-    case 2048:
-        return ASPEED_SDMC_AST2600_2048MB;
-    default:
-        break;
-    }
-
-    /* use a common default */
-    warn_report("Invalid RAM size 0x%" PRIx64 ". Using default 1024M",
-                s->ram_size);
-    s->ram_size = 1024 << 20;
-    return ASPEED_SDMC_AST2600_1024MB;
-}
-
 static void aspeed_sdmc_reset(DeviceState *dev)
 {
     AspeedSDMCState *s = ASPEED_SDMC(dev);
@@ -257,11 +191,14 @@ static Property aspeed_sdmc_properties[] = {
 static void aspeed_sdmc_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
+    AspeedSDMCClass *asc = ASPEED_SDMC_CLASS(klass);
+
     dc->realize = aspeed_sdmc_realize;
     dc->reset = aspeed_sdmc_reset;
     dc->desc = "ASPEED SDRAM Memory Controller";
     dc->vmsd = &vmstate_aspeed_sdmc;
     dc->props = aspeed_sdmc_properties;
+    asc->ram2feat = g_hash_table_new(g_direct_hash, g_direct_equal);
 }
 
 static const TypeInfo aspeed_sdmc_info = {
@@ -273,10 +210,28 @@ static const TypeInfo aspeed_sdmc_info = {
     .abstract   = true,
 };
 
+static int aspeed_get_ram_feat(AspeedSDMCState *s)
+{
+    AspeedSDMCClass *asc = ASPEED_SDMC_GET_CLASS(s);
+    int ram_mb = s->ram_size >> 20;
+    gpointer val;
+
+    if (g_hash_table_contains(asc->ram2feat, GINT_TO_POINTER(ram_mb))) {
+        val = g_hash_table_lookup(asc->ram2feat, GINT_TO_POINTER(ram_mb));
+        return GPOINTER_TO_INT(val);
+    }
+
+    warn_report("Invalid RAM size 0x%" PRIx64 ". Using default %dM",
+                 s->ram_size, asc->fallback_ram_size);
+    s->ram_size = asc->fallback_ram_size << 20;
+    val = g_hash_table_lookup(asc->ram2feat, &asc->fallback_ram_size);
+    return GPOINTER_TO_INT(val);
+}
+
 static uint32_t aspeed_2400_sdmc_compute_conf(AspeedSDMCState *s, uint32_t data)
 {
-    uint32_t fixed_conf = ASPEED_SDMC_VGA_COMPAT |
-        ASPEED_SDMC_DRAM_SIZE(ast2400_rambits(s));
+    int ram_f = aspeed_get_ram_feat(s);
+    uint32_t fixed_conf = ASPEED_SDMC_VGA_COMPAT | ASPEED_SDMC_DRAM_SIZE(ram_f);
 
     /* Make sure readonly bits are kept */
     data &= ~ASPEED_SDMC_READONLY_MASK;
@@ -298,6 +253,9 @@ static void aspeed_2400_sdmc_write(AspeedSDMCState *s, uint32_t reg,
     s->regs[reg] = data;
 }
 
+#define REGISTER_RAM_SIZE(h, k, v) \
+    g_hash_table_insert(h->ram2feat, GINT_TO_POINTER(k), GINT_TO_POINTER(v))
+
 static void aspeed_2400_sdmc_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
@@ -307,6 +265,11 @@ static void aspeed_2400_sdmc_class_init(ObjectClass *klass, void *data)
     asc->max_ram_size = 512 << 20;
     asc->compute_conf = aspeed_2400_sdmc_compute_conf;
     asc->write = aspeed_2400_sdmc_write;
+    asc->fallback_ram_size = 256;
+    REGISTER_RAM_SIZE(asc, 64, ASPEED_SDMC_DRAM_64MB);
+    REGISTER_RAM_SIZE(asc, 128, ASPEED_SDMC_DRAM_128MB);
+    REGISTER_RAM_SIZE(asc, 256, ASPEED_SDMC_DRAM_256MB);
+    REGISTER_RAM_SIZE(asc, 512, ASPEED_SDMC_DRAM_512MB);
 }
 
 static const TypeInfo aspeed_2400_sdmc_info = {
@@ -317,10 +280,10 @@ static const TypeInfo aspeed_2400_sdmc_info = {
 
 static uint32_t aspeed_2500_sdmc_compute_conf(AspeedSDMCState *s, uint32_t data)
 {
+    int ram_f = aspeed_get_ram_feat(s);
     uint32_t fixed_conf = ASPEED_SDMC_HW_VERSION(1) |
         ASPEED_SDMC_VGA_APERTURE(ASPEED_SDMC_VGA_64MB) |
-        ASPEED_SDMC_CACHE_INITIAL_DONE |
-        ASPEED_SDMC_DRAM_SIZE(ast2500_rambits(s));
+        ASPEED_SDMC_CACHE_INITIAL_DONE | ASPEED_SDMC_DRAM_SIZE(ram_f);
 
     /* Make sure readonly bits are kept */
     data &= ~ASPEED_SDMC_AST2500_READONLY_MASK;
@@ -360,6 +323,11 @@ static void aspeed_2500_sdmc_class_init(ObjectClass *klass, void *data)
     asc->max_ram_size = 1024 << 20;
     asc->compute_conf = aspeed_2500_sdmc_compute_conf;
     asc->write = aspeed_2500_sdmc_write;
+    asc->fallback_ram_size = 512;
+    REGISTER_RAM_SIZE(asc, 128, ASPEED_SDMC_AST2500_128MB);
+    REGISTER_RAM_SIZE(asc, 256, ASPEED_SDMC_AST2500_256MB);
+    REGISTER_RAM_SIZE(asc, 512, ASPEED_SDMC_AST2500_512MB);
+    REGISTER_RAM_SIZE(asc, 1024, ASPEED_SDMC_AST2500_1024MB);
 }
 
 static const TypeInfo aspeed_2500_sdmc_info = {
@@ -370,9 +338,10 @@ static const TypeInfo aspeed_2500_sdmc_info = {
 
 static uint32_t aspeed_2600_sdmc_compute_conf(AspeedSDMCState *s, uint32_t data)
 {
+    int ram_f = aspeed_get_ram_feat(s);
     uint32_t fixed_conf = ASPEED_SDMC_HW_VERSION(3) |
         ASPEED_SDMC_VGA_APERTURE(ASPEED_SDMC_VGA_64MB) |
-        ASPEED_SDMC_DRAM_SIZE(ast2600_rambits(s));
+        ASPEED_SDMC_DRAM_SIZE(ram_f);
 
     /* Make sure readonly bits are kept (use ast2500 mask) */
     data &= ~ASPEED_SDMC_AST2500_READONLY_MASK;
@@ -413,6 +382,11 @@ static void aspeed_2600_sdmc_class_init(ObjectClass *klass, void *data)
     asc->max_ram_size = 2048 << 20;
     asc->compute_conf = aspeed_2600_sdmc_compute_conf;
     asc->write = aspeed_2600_sdmc_write;
+    asc->fallback_ram_size = 512;
+    REGISTER_RAM_SIZE(asc, 256, ASPEED_SDMC_AST2600_256MB);
+    REGISTER_RAM_SIZE(asc, 512, ASPEED_SDMC_AST2600_512MB);
+    REGISTER_RAM_SIZE(asc, 1024, ASPEED_SDMC_AST2600_1024MB);
+    REGISTER_RAM_SIZE(asc, 2048, ASPEED_SDMC_AST2600_2048MB);
 }
 
 static const TypeInfo aspeed_2600_sdmc_info = {
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 10/86] arm:aspeed: actually check RAM size
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (8 preceding siblings ...)
  2019-12-31 13:02 ` [PATCH 09/86] arm:aspeed: convert valid RAM sizes to data Igor Mammedov
@ 2019-12-31 13:02 ` Igor Mammedov
  2019-12-31 13:02 ` [PATCH 11/86] hw:aspeed: drop warning and bogus ram_size fixup Igor Mammedov
                   ` (76 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:02 UTC (permalink / raw)
  To: qemu-devel

It's supposed that SOC will check if "-m" provided
RAM size is valid by setting "ram-size" property and
then board would read back valid (possibly corrected
value) to allocate/map RAM MemoryRegion with valid size.
Well it isn't doing so, since check is called too late
indirectly from
  aspeed_sdmc_reset()->asc->compute_conf()
or much later when guest writes to configuration
register.

So depending on "-m" value QEMU end-ups with a warning
and an invalid MemoryRegion size allocated and mapped.
(examples:
 -M ast2500-evb -m 1M
    0000000080000000-000000017ffffffe (prio 0, i/o): aspeed-ram-container
      0000000080000000-00000000800fffff (prio 0, ram): ram
      0000000080100000-00000000bfffffff (prio 0, i/o): max_ram
 -M ast2500-evb -m 3G
    0000000080000000-000000017ffffffe (prio 0, i/o): aspeed-ram-container
      0000000080000000-000000013fffffff (prio 0, ram): ram
      [DETECTED OVERFLOW!] 0000000140000000-00000000bfffffff (prio 0, i/o): max_ram
)
On top of that sdmc falls back and reports to guest
"default" size, it thinks machine should have.

For CLI side machine should honor whatever user configured
or error out to make user fix CLI.

This patch makes ram-size check actually work and
changes behavior from a warning later on during
machine reset to error_fatal at the moment SOC is
realized so user will have to fix RAM size on CLI
to start machine.

It also gets out of the way mutable ram-size logic,
so we could consolidate RAM allocation logic around
pre-allocated hostmem backend (supplied by user or
auto created by generic machine code depending on
supplied -m/mem-path/mem-prealloc options.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/arm/aspeed.c       | 9 +--------
 hw/misc/aspeed_sdmc.c | 5 +++++
 2 files changed, 6 insertions(+), 8 deletions(-)

diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
index cc06af4..525c547 100644
--- a/hw/arm/aspeed.c
+++ b/hw/arm/aspeed.c
@@ -213,14 +213,7 @@ static void aspeed_machine_init(MachineState *machine)
                                 "hw-prot-key", &error_abort);
     }
     object_property_set_bool(OBJECT(&bmc->soc), true, "realized",
-                             &error_abort);
-
-    /*
-     * Allocate RAM after the memory controller has checked the size
-     * was valid. If not, a default value is used.
-     */
-    ram_size = object_property_get_uint(OBJECT(&bmc->soc), "ram-size",
-                                        &error_abort);
+                             &error_fatal);
 
     memory_region_allocate_system_memory(&bmc->ram, NULL, "ram", ram_size);
     memory_region_add_subregion(&bmc->ram_container, 0, &bmc->ram);
diff --git a/hw/misc/aspeed_sdmc.c b/hw/misc/aspeed_sdmc.c
index 3fc80f0..b398e36 100644
--- a/hw/misc/aspeed_sdmc.c
+++ b/hw/misc/aspeed_sdmc.c
@@ -165,6 +165,11 @@ static void aspeed_sdmc_realize(DeviceState *dev, Error **errp)
     AspeedSDMCState *s = ASPEED_SDMC(dev);
     AspeedSDMCClass *asc = ASPEED_SDMC_GET_CLASS(s);
 
+    if (!g_hash_table_contains(asc->ram2feat,
+                               GINT_TO_POINTER(s->ram_size >> 20))) {
+        error_setg(errp, "Invalid RAM size 0x%" PRIx64, s->ram_size);
+        return;
+    }
     s->max_ram_size = asc->max_ram_size;
 
     memory_region_init_io(&s->iomem, OBJECT(s), &aspeed_sdmc_ops, s,
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 11/86] hw:aspeed: drop warning and bogus ram_size fixup
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (9 preceding siblings ...)
  2019-12-31 13:02 ` [PATCH 10/86] arm:aspeed: actually check RAM size Igor Mammedov
@ 2019-12-31 13:02 ` Igor Mammedov
  2019-12-31 13:02 ` [PATCH 12/86] arm:aspeed: use memdev for RAM Igor Mammedov
                   ` (75 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:02 UTC (permalink / raw)
  To: qemu-devel

It was useless to try fixup ram_size and print warning
on guest access to config register to begin with.

Now previous patch made sure that SDMC can not be realized
with invalid RAM size, so there is no case where warning
and not used ram_size fixup could be triggered.

So remove now dead code.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/misc/aspeed_sdmc.c | 11 +----------
 1 file changed, 1 insertion(+), 10 deletions(-)

diff --git a/hw/misc/aspeed_sdmc.c b/hw/misc/aspeed_sdmc.c
index b398e36..942b27a 100644
--- a/hw/misc/aspeed_sdmc.c
+++ b/hw/misc/aspeed_sdmc.c
@@ -219,17 +219,8 @@ static int aspeed_get_ram_feat(AspeedSDMCState *s)
 {
     AspeedSDMCClass *asc = ASPEED_SDMC_GET_CLASS(s);
     int ram_mb = s->ram_size >> 20;
-    gpointer val;
+    gpointer val = g_hash_table_lookup(asc->ram2feat, GINT_TO_POINTER(ram_mb));
 
-    if (g_hash_table_contains(asc->ram2feat, GINT_TO_POINTER(ram_mb))) {
-        val = g_hash_table_lookup(asc->ram2feat, GINT_TO_POINTER(ram_mb));
-        return GPOINTER_TO_INT(val);
-    }
-
-    warn_report("Invalid RAM size 0x%" PRIx64 ". Using default %dM",
-                 s->ram_size, asc->fallback_ram_size);
-    s->ram_size = asc->fallback_ram_size << 20;
-    val = g_hash_table_lookup(asc->ram2feat, &asc->fallback_ram_size);
     return GPOINTER_TO_INT(val);
 }
 
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 12/86] arm:aspeed: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (10 preceding siblings ...)
  2019-12-31 13:02 ` [PATCH 11/86] hw:aspeed: drop warning and bogus ram_size fixup Igor Mammedov
@ 2019-12-31 13:02 ` Igor Mammedov
  2019-12-31 13:02 ` [PATCH 13/86] arm:collie: " Igor Mammedov
                   ` (74 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:02 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/arm/aspeed.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
index 525c547..330254b 100644
--- a/hw/arm/aspeed.c
+++ b/hw/arm/aspeed.c
@@ -35,7 +35,6 @@ static struct arm_boot_info aspeed_board_binfo = {
 struct AspeedBoardState {
     AspeedSoCState soc;
     MemoryRegion ram_container;
-    MemoryRegion ram;
     MemoryRegion max_ram;
 };
 
@@ -184,6 +183,7 @@ static void aspeed_machine_init(MachineState *machine)
 
     memory_region_init(&bmc->ram_container, NULL, "aspeed-ram-container",
                        UINT32_MAX);
+    memory_region_add_subregion(&bmc->ram_container, 0, machine->ram);
 
     object_initialize_child(OBJECT(machine), "soc", &bmc->soc,
                             (sizeof(bmc->soc)), amc->soc_name, &error_abort,
@@ -215,8 +215,6 @@ static void aspeed_machine_init(MachineState *machine)
     object_property_set_bool(OBJECT(&bmc->soc), true, "realized",
                              &error_fatal);
 
-    memory_region_allocate_system_memory(&bmc->ram, NULL, "ram", ram_size);
-    memory_region_add_subregion(&bmc->ram_container, 0, &bmc->ram);
     memory_region_add_subregion(get_system_memory(),
                                 sc->memmap[ASPEED_SDRAM],
                                 &bmc->ram_container);
@@ -393,6 +391,7 @@ static void aspeed_machine_class_init(ObjectClass *oc, void *data)
     mc->no_floppy = 1;
     mc->no_cdrom = 1;
     mc->no_parallel = 1;
+    mc->default_ram_id = "ram";
 }
 
 static void aspeed_machine_palmetto_class_init(ObjectClass *oc, void *data)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 13/86] arm:collie: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (11 preceding siblings ...)
  2019-12-31 13:02 ` [PATCH 12/86] arm:aspeed: use memdev for RAM Igor Mammedov
@ 2019-12-31 13:02 ` Igor Mammedov
  2019-12-31 13:02 ` [PATCH 14/86] arm:cubieboard: " Igor Mammedov
                   ` (73 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:02 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

PS:
 while at it add check for user supplied RAM size and error
 out if it mismatches board expected value.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/arm/collie.c | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/hw/arm/collie.c b/hw/arm/collie.c
index 970a440..a67bb1f 100644
--- a/hw/arm/collie.c
+++ b/hw/arm/collie.c
@@ -20,20 +20,23 @@
 
 static struct arm_boot_info collie_binfo = {
     .loader_start = SA_SDCS0,
-    .ram_size = 0x20000000,
 };
 
 static void collie_init(MachineState *machine)
 {
     StrongARMState *s;
     DriveInfo *dinfo;
-    MemoryRegion *sdram = g_new(MemoryRegion, 1);
+    MachineClass *mc = MACHINE_GET_CLASS(machine);
+
+    if (machine->ram_size != mc->default_ram_size) {
+        error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
+                     mc->default_ram_size);
+        exit(EXIT_FAILURE);
+    }
 
     s = sa1110_init(machine->cpu_type);
 
-    memory_region_allocate_system_memory(sdram, NULL, "strongarm.sdram",
-                                         collie_binfo.ram_size);
-    memory_region_add_subregion(get_system_memory(), SA_SDCS0, sdram);
+    memory_region_add_subregion(get_system_memory(), SA_SDCS0, machine->ram);
 
     dinfo = drive_get(IF_PFLASH, 0, 0);
     pflash_cfi01_register(SA_CS0, "collie.fl1", 0x02000000,
@@ -57,6 +60,8 @@ static void collie_machine_init(MachineClass *mc)
     mc->init = collie_init;
     mc->ignore_memory_transaction_failures = true;
     mc->default_cpu_type = ARM_CPU_TYPE_NAME("sa1110");
+    mc->default_ram_size = 0x20000000;
+    mc->default_ram_id = "strongarm.sdram";
 }
 
 DEFINE_MACHINE("collie", collie_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 14/86] arm:cubieboard: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (12 preceding siblings ...)
  2019-12-31 13:02 ` [PATCH 13/86] arm:collie: " Igor Mammedov
@ 2019-12-31 13:02 ` Igor Mammedov
  2019-12-31 13:02 ` [PATCH 15/86] arm:digic_boards: " Igor Mammedov
                   ` (72 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:02 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

PS:
While at it, get rid of no longer needed CubieBoardState wrapper.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/arm/cubieboard.c | 25 ++++++++-----------------
 1 file changed, 8 insertions(+), 17 deletions(-)

diff --git a/hw/arm/cubieboard.c b/hw/arm/cubieboard.c
index 6dc2f1d..089f9a3 100644
--- a/hw/arm/cubieboard.c
+++ b/hw/arm/cubieboard.c
@@ -28,52 +28,42 @@ static struct arm_boot_info cubieboard_binfo = {
     .board_id = 0x1008,
 };
 
-typedef struct CubieBoardState {
-    AwA10State *a10;
-    MemoryRegion sdram;
-} CubieBoardState;
-
 static void cubieboard_init(MachineState *machine)
 {
-    CubieBoardState *s = g_new(CubieBoardState, 1);
+    AwA10State *a10 = AW_A10(object_new(TYPE_AW_A10));
     Error *err = NULL;
 
-    s->a10 = AW_A10(object_new(TYPE_AW_A10));
-
-    object_property_set_int(OBJECT(&s->a10->emac), 1, "phy-addr", &err);
+    object_property_set_int(OBJECT(&a10->emac), 1, "phy-addr", &err);
     if (err != NULL) {
         error_reportf_err(err, "Couldn't set phy address: ");
         exit(1);
     }
 
-    object_property_set_int(OBJECT(&s->a10->timer), 32768, "clk0-freq", &err);
+    object_property_set_int(OBJECT(&a10->timer), 32768, "clk0-freq", &err);
     if (err != NULL) {
         error_reportf_err(err, "Couldn't set clk0 frequency: ");
         exit(1);
     }
 
-    object_property_set_int(OBJECT(&s->a10->timer), 24000000, "clk1-freq",
-                            &err);
+    object_property_set_int(OBJECT(&a10->timer), 24000000, "clk1-freq", &err);
     if (err != NULL) {
         error_reportf_err(err, "Couldn't set clk1 frequency: ");
         exit(1);
     }
 
-    object_property_set_bool(OBJECT(s->a10), true, "realized", &err);
+    object_property_set_bool(OBJECT(a10), true, "realized", &err);
     if (err != NULL) {
         error_reportf_err(err, "Couldn't realize Allwinner A10: ");
         exit(1);
     }
 
-    memory_region_allocate_system_memory(&s->sdram, NULL, "cubieboard.ram",
-                                         machine->ram_size);
     memory_region_add_subregion(get_system_memory(), AW_A10_SDRAM_BASE,
-                                &s->sdram);
+                                machine->ram);
 
     /* TODO create and connect IDE devices for ide_drive_get() */
 
     cubieboard_binfo.ram_size = machine->ram_size;
-    arm_load_kernel(&s->a10->cpu, machine, &cubieboard_binfo);
+    arm_load_kernel(&a10->cpu, machine, &cubieboard_binfo);
 }
 
 static void cubieboard_machine_init(MachineClass *mc)
@@ -84,6 +74,7 @@ static void cubieboard_machine_init(MachineClass *mc)
     mc->block_default_type = IF_IDE;
     mc->units_per_default_bus = 1;
     mc->ignore_memory_transaction_failures = true;
+    mc->default_ram_id = "cubieboard.ram";
 }
 
 DEFINE_MACHINE("cubieboard", cubieboard_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 15/86] arm:digic_boards: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (13 preceding siblings ...)
  2019-12-31 13:02 ` [PATCH 14/86] arm:cubieboard: " Igor Mammedov
@ 2019-12-31 13:02 ` Igor Mammedov
  2019-12-31 13:03 ` [PATCH 16/86] arm:highbank: " Igor Mammedov
                   ` (71 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:02 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

PS:
 remove no longer needed DigicBoardState

PS2:
 while at it add check for user supplied RAM size and error
 out if it mismatches board expected value.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/arm/digic_boards.c | 36 ++++++++++++++++++------------------
 1 file changed, 18 insertions(+), 18 deletions(-)

diff --git a/hw/arm/digic_boards.c b/hw/arm/digic_boards.c
index ef3fc2b..c3bc5cb 100644
--- a/hw/arm/digic_boards.c
+++ b/hw/arm/digic_boards.c
@@ -35,39 +35,38 @@
 #include "hw/loader.h"
 #include "sysemu/sysemu.h"
 #include "sysemu/qtest.h"
+#include "qemu/units.h"
 
 #define DIGIC4_ROM0_BASE      0xf0000000
 #define DIGIC4_ROM1_BASE      0xf8000000
 #define DIGIC4_ROM_MAX_SIZE   0x08000000
 
-typedef struct DigicBoardState {
-    DigicState *digic;
-    MemoryRegion ram;
-} DigicBoardState;
-
 typedef struct DigicBoard {
-    hwaddr ram_size;
-    void (*add_rom0)(DigicBoardState *, hwaddr, const char *);
+    void (*add_rom0)(DigicState *, hwaddr, const char *);
     const char *rom0_def_filename;
-    void (*add_rom1)(DigicBoardState *, hwaddr, const char *);
+    void (*add_rom1)(DigicState *, hwaddr, const char *);
     const char *rom1_def_filename;
 } DigicBoard;
 
-static void digic4_board_init(DigicBoard *board)
+static void digic4_board_init(MachineState *machine, DigicBoard *board)
 {
     Error *err = NULL;
+    MachineClass *mc = MACHINE_GET_CLASS(machine);
 
-    DigicBoardState *s = g_new(DigicBoardState, 1);
+    if (machine->ram_size != mc->default_ram_size) {
+        error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
+                      mc->default_ram_size);
+        exit(EXIT_FAILURE);
+    }
 
-    s->digic = DIGIC(object_new(TYPE_DIGIC));
-    object_property_set_bool(OBJECT(s->digic), true, "realized", &err);
+    DigicState *s = DIGIC(object_new(TYPE_DIGIC));
+    object_property_set_bool(OBJECT(s), true, "realized", &err);
     if (err != NULL) {
         error_reportf_err(err, "Couldn't realize DIGIC SoC: ");
         exit(1);
     }
 
-    memory_region_allocate_system_memory(&s->ram, NULL, "ram", board->ram_size);
-    memory_region_add_subregion(get_system_memory(), 0, &s->ram);
+    memory_region_add_subregion(get_system_memory(), 0, machine->ram);
 
     if (board->add_rom0) {
         board->add_rom0(s, DIGIC4_ROM0_BASE, board->rom0_def_filename);
@@ -78,7 +77,7 @@ static void digic4_board_init(DigicBoard *board)
     }
 }
 
-static void digic_load_rom(DigicBoardState *s, hwaddr addr,
+static void digic_load_rom(DigicState *s, hwaddr addr,
                            hwaddr max_size, const char *def_filename)
 {
     target_long rom_size;
@@ -118,7 +117,7 @@ static void digic_load_rom(DigicBoardState *s, hwaddr addr,
  * Samsung K8P3215UQB
  * 64M Bit (4Mx16) Page Mode / Multi-Bank NOR Flash Memory
  */
-static void digic4_add_k8p3215uqb_rom(DigicBoardState *s, hwaddr addr,
+static void digic4_add_k8p3215uqb_rom(DigicState *s, hwaddr addr,
                                       const char *def_filename)
 {
 #define FLASH_K8P3215UQB_SIZE (4 * 1024 * 1024)
@@ -135,14 +134,13 @@ static void digic4_add_k8p3215uqb_rom(DigicBoardState *s, hwaddr addr,
 }
 
 static DigicBoard digic4_board_canon_a1100 = {
-    .ram_size = 64 * 1024 * 1024,
     .add_rom1 = digic4_add_k8p3215uqb_rom,
     .rom1_def_filename = "canon-a1100-rom1.bin",
 };
 
 static void canon_a1100_init(MachineState *machine)
 {
-    digic4_board_init(&digic4_board_canon_a1100);
+    digic4_board_init(machine, &digic4_board_canon_a1100);
 }
 
 static void canon_a1100_machine_init(MachineClass *mc)
@@ -150,6 +148,8 @@ static void canon_a1100_machine_init(MachineClass *mc)
     mc->desc = "Canon PowerShot A1100 IS";
     mc->init = &canon_a1100_init;
     mc->ignore_memory_transaction_failures = true;
+    mc->default_ram_size = 64 * MiB;
+    mc->default_ram_id = "ram";
 }
 
 DEFINE_MACHINE("canon-a1100", canon_a1100_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 16/86] arm:highbank: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (14 preceding siblings ...)
  2019-12-31 13:02 ` [PATCH 15/86] arm:digic_boards: " Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 13:03 ` [PATCH 17/86] arm:imx25_pdk: drop RAM size fixup Igor Mammedov
                   ` (70 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/arm/highbank.c | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)

diff --git a/hw/arm/highbank.c b/hw/arm/highbank.c
index 518d935..ac9de94 100644
--- a/hw/arm/highbank.c
+++ b/hw/arm/highbank.c
@@ -236,7 +236,6 @@ enum cxmachines {
  */
 static void calxeda_init(MachineState *machine, enum cxmachines machine_id)
 {
-    ram_addr_t ram_size = machine->ram_size;
     DeviceState *dev = NULL;
     SysBusDevice *busdev;
     qemu_irq pic[128];
@@ -247,7 +246,6 @@ static void calxeda_init(MachineState *machine, enum cxmachines machine_id)
     qemu_irq cpu_virq[4];
     qemu_irq cpu_vfiq[4];
     MemoryRegion *sysram;
-    MemoryRegion *dram;
     MemoryRegion *sysmem;
     char *sysboot_filename;
 
@@ -290,10 +288,8 @@ static void calxeda_init(MachineState *machine, enum cxmachines machine_id)
     }
 
     sysmem = get_system_memory();
-    dram = g_new(MemoryRegion, 1);
-    memory_region_allocate_system_memory(dram, NULL, "highbank.dram", ram_size);
     /* SDRAM at address zero.  */
-    memory_region_add_subregion(sysmem, 0, dram);
+    memory_region_add_subregion(sysmem, 0, machine->ram);
 
     sysram = g_new(MemoryRegion, 1);
     memory_region_init_ram(sysram, NULL, "highbank.sysram", 0x8000,
@@ -387,7 +383,7 @@ static void calxeda_init(MachineState *machine, enum cxmachines machine_id)
 
     /* TODO create and connect IDE devices for ide_drive_get() */
 
-    highbank_binfo.ram_size = ram_size;
+    highbank_binfo.ram_size = machine->ram_size;
     /* highbank requires a dtb in order to boot, and the dtb will override
      * the board ID. The following value is ignored, so set it to -1 to be
      * clear that the value is meaningless.
@@ -430,6 +426,7 @@ static void highbank_class_init(ObjectClass *oc, void *data)
     mc->units_per_default_bus = 1;
     mc->max_cpus = 4;
     mc->ignore_memory_transaction_failures = true;
+    mc->default_ram_id = "highbank.dram";
 }
 
 static const TypeInfo highbank_type = {
@@ -448,6 +445,7 @@ static void midway_class_init(ObjectClass *oc, void *data)
     mc->units_per_default_bus = 1;
     mc->max_cpus = 4;
     mc->ignore_memory_transaction_failures = true;
+    mc->default_ram_id = "highbank.dram";
 }
 
 static const TypeInfo midway_type = {
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 17/86] arm:imx25_pdk: drop RAM size fixup
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (15 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 16/86] arm:highbank: " Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 13:03 ` [PATCH 18/86] arm:imx25_pdk: use memdev for RAM Igor Mammedov
                   ` (69 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

If user provided non-sense RAM size, board will complain and
continue running with max RAM size supported.
Also RAM is going to be allocated by generic code, so it won't be
possible for board to fix things up for user.

Make it error message and exit to force user fix CLI,
instead of accepting non-sense CLI values.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/arm/imx25_pdk.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/hw/arm/imx25_pdk.c b/hw/arm/imx25_pdk.c
index c76fc2b..a2b7b35 100644
--- a/hw/arm/imx25_pdk.c
+++ b/hw/arm/imx25_pdk.c
@@ -78,10 +78,10 @@ static void imx25_pdk_init(MachineState *machine)
 
     /* We need to initialize our memory */
     if (machine->ram_size > (FSL_IMX25_SDRAM0_SIZE + FSL_IMX25_SDRAM1_SIZE)) {
-        warn_report("RAM size " RAM_ADDR_FMT " above max supported, "
+        error_report("RAM size " RAM_ADDR_FMT " above max supported, "
                     "reduced to %x", machine->ram_size,
                     FSL_IMX25_SDRAM0_SIZE + FSL_IMX25_SDRAM1_SIZE);
-        machine->ram_size = FSL_IMX25_SDRAM0_SIZE + FSL_IMX25_SDRAM1_SIZE;
+        exit(EXIT_FAILURE);
     }
 
     memory_region_allocate_system_memory(&s->ram, NULL, "imx25.ram",
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 18/86] arm:imx25_pdk: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (16 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 17/86] arm:imx25_pdk: drop RAM size fixup Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 13:03 ` [PATCH 19/86] arm:integratorcp: " Igor Mammedov
                   ` (68 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/arm/imx25_pdk.c | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/hw/arm/imx25_pdk.c b/hw/arm/imx25_pdk.c
index a2b7b35..9087fcb 100644
--- a/hw/arm/imx25_pdk.c
+++ b/hw/arm/imx25_pdk.c
@@ -58,7 +58,6 @@
 
 typedef struct IMX25PDK {
     FslIMX25State soc;
-    MemoryRegion ram;
     MemoryRegion ram_alias;
 } IMX25PDK;
 
@@ -84,10 +83,8 @@ static void imx25_pdk_init(MachineState *machine)
         exit(EXIT_FAILURE);
     }
 
-    memory_region_allocate_system_memory(&s->ram, NULL, "imx25.ram",
-                                         machine->ram_size);
     memory_region_add_subregion(get_system_memory(), FSL_IMX25_SDRAM0_ADDR,
-                                &s->ram);
+                                machine->ram);
 
     /* initialize the alias memory if any */
     for (i = 0, ram_size = machine->ram_size, alias_offset = 0;
@@ -107,7 +104,8 @@ static void imx25_pdk_init(MachineState *machine)
 
         if (size < ram[i].size) {
             memory_region_init_alias(&s->ram_alias, NULL, "ram.alias",
-                                     &s->ram, alias_offset, ram[i].size - size);
+                                     machine->ram,
+                                     alias_offset, ram[i].size - size);
             memory_region_add_subregion(get_system_memory(),
                                         ram[i].addr + size, &s->ram_alias);
         }
@@ -135,6 +133,7 @@ static void imx25_pdk_machine_init(MachineClass *mc)
     mc->desc = "ARM i.MX25 PDK board (ARM926)";
     mc->init = imx25_pdk_init;
     mc->ignore_memory_transaction_failures = true;
+    mc->default_ram_id = "imx25.ram";
 }
 
 DEFINE_MACHINE("imx25-pdk", imx25_pdk_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 19/86] arm:integratorcp: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (17 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 18/86] arm:imx25_pdk: use memdev for RAM Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 13:03 ` [PATCH 20/86] arm:kzm: drop RAM size fixup Igor Mammedov
                   ` (67 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/arm/integratorcp.c | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/hw/arm/integratorcp.c b/hw/arm/integratorcp.c
index 5249708..89c223b 100644
--- a/hw/arm/integratorcp.c
+++ b/hw/arm/integratorcp.c
@@ -585,7 +585,6 @@ static void integratorcp_init(MachineState *machine)
     Object *cpuobj;
     ARMCPU *cpu;
     MemoryRegion *address_space_mem = get_system_memory();
-    MemoryRegion *ram = g_new(MemoryRegion, 1);
     MemoryRegion *ram_alias = g_new(MemoryRegion, 1);
     qemu_irq pic[32];
     DeviceState *dev, *sic, *icp;
@@ -605,14 +604,13 @@ static void integratorcp_init(MachineState *machine)
 
     cpu = ARM_CPU(cpuobj);
 
-    memory_region_allocate_system_memory(ram, NULL, "integrator.ram",
-                                         ram_size);
     /* ??? On a real system the first 1Mb is mapped as SSRAM or boot flash.  */
     /* ??? RAM should repeat to fill physical memory space.  */
     /* SDRAM at address zero*/
-    memory_region_add_subregion(address_space_mem, 0, ram);
+    memory_region_add_subregion(address_space_mem, 0, machine->ram);
     /* And again at address 0x80000000 */
-    memory_region_init_alias(ram_alias, NULL, "ram.alias", ram, 0, ram_size);
+    memory_region_init_alias(ram_alias, NULL, "ram.alias", machine->ram,
+                             0, ram_size);
     memory_region_add_subregion(address_space_mem, 0x80000000, ram_alias);
 
     dev = qdev_create(NULL, TYPE_INTEGRATOR_CM);
@@ -660,6 +658,7 @@ static void integratorcp_machine_init(MachineClass *mc)
     mc->init = integratorcp_init;
     mc->ignore_memory_transaction_failures = true;
     mc->default_cpu_type = ARM_CPU_TYPE_NAME("arm926");
+    mc->default_ram_id = "integrator.ram";
 }
 
 DEFINE_MACHINE("integratorcp", integratorcp_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 20/86] arm:kzm: drop RAM size fixup
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (18 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 19/86] arm:integratorcp: " Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 13:03 ` [PATCH 21/86] arm:kzm: use memdev for RAM Igor Mammedov
                   ` (66 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

If user provided non-sense RAM size, board will complain and
continue running with max RAM size supported.
Also RAM is going to be allocated by generic code, so it won't be
possible for board to fix things up for user.

Make it error message and exit to force user fix CLI,
instead of accepting non-sense CLI values.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/arm/kzm.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/hw/arm/kzm.c b/hw/arm/kzm.c
index 1d5ef28..27800c5 100644
--- a/hw/arm/kzm.c
+++ b/hw/arm/kzm.c
@@ -78,10 +78,10 @@ static void kzm_init(MachineState *machine)
 
     /* Check the amount of memory is compatible with the SOC */
     if (machine->ram_size > (FSL_IMX31_SDRAM0_SIZE + FSL_IMX31_SDRAM1_SIZE)) {
-        warn_report("RAM size " RAM_ADDR_FMT " above max supported, "
+        error_report("RAM size " RAM_ADDR_FMT " above max supported, "
                     "reduced to %x", machine->ram_size,
                     FSL_IMX31_SDRAM0_SIZE + FSL_IMX31_SDRAM1_SIZE);
-        machine->ram_size = FSL_IMX31_SDRAM0_SIZE + FSL_IMX31_SDRAM1_SIZE;
+        exit(EXIT_FAILURE);
     }
 
     memory_region_allocate_system_memory(&s->ram, NULL, "kzm.ram",
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 21/86] arm:kzm: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (19 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 20/86] arm:kzm: drop RAM size fixup Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 16:10   ` Philippe Mathieu-Daudé
  2019-12-31 13:03 ` [PATCH 22/86] arm:mcimx6ul-evk: " Igor Mammedov
                   ` (65 subsequent siblings)
  86 siblings, 1 reply; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/arm/kzm.c | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/hw/arm/kzm.c b/hw/arm/kzm.c
index 27800c5..f63902e 100644
--- a/hw/arm/kzm.c
+++ b/hw/arm/kzm.c
@@ -51,7 +51,6 @@
 
 typedef struct IMX31KZM {
     FslIMX31State soc;
-    MemoryRegion ram;
     MemoryRegion ram_alias;
 } IMX31KZM;
 
@@ -84,10 +83,8 @@ static void kzm_init(MachineState *machine)
         exit(EXIT_FAILURE);
     }
 
-    memory_region_allocate_system_memory(&s->ram, NULL, "kzm.ram",
-                                         machine->ram_size);
     memory_region_add_subregion(get_system_memory(), FSL_IMX31_SDRAM0_ADDR,
-                                &s->ram);
+                                machine->ram);
 
     /* initialize the alias memory if any */
     for (i = 0, ram_size = machine->ram_size, alias_offset = 0;
@@ -107,7 +104,8 @@ static void kzm_init(MachineState *machine)
 
         if (size < ram[i].size) {
             memory_region_init_alias(&s->ram_alias, NULL, "ram.alias",
-                                     &s->ram, alias_offset, ram[i].size - size);
+                                     machine->ram,
+                                     alias_offset, ram[i].size - size);
             memory_region_add_subregion(get_system_memory(),
                                         ram[i].addr + size, &s->ram_alias);
         }
@@ -139,6 +137,7 @@ static void kzm_machine_init(MachineClass *mc)
     mc->desc = "ARM KZM Emulation Baseboard (ARM1136)";
     mc->init = kzm_init;
     mc->ignore_memory_transaction_failures = true;
+    mc->default_ram_id = "kzm.ram";
 }
 
 DEFINE_MACHINE("kzm", kzm_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 22/86] arm:mcimx6ul-evk: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (20 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 21/86] arm:kzm: use memdev for RAM Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 13:03 ` [PATCH 23/86] arm:mcimx7d-sabre: " Igor Mammedov
                   ` (64 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

PS:
  remove no longer needed MCIMX6ULEVK

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/arm/mcimx6ul-evk.c | 25 +++++++++----------------
 1 file changed, 9 insertions(+), 16 deletions(-)

diff --git a/hw/arm/mcimx6ul-evk.c b/hw/arm/mcimx6ul-evk.c
index e90b393..23a71ed 100644
--- a/hw/arm/mcimx6ul-evk.c
+++ b/hw/arm/mcimx6ul-evk.c
@@ -19,15 +19,10 @@
 #include "qemu/error-report.h"
 #include "sysemu/qtest.h"
 
-typedef struct {
-    FslIMX6ULState soc;
-    MemoryRegion ram;
-} MCIMX6ULEVK;
-
 static void mcimx6ul_evk_init(MachineState *machine)
 {
     static struct arm_boot_info boot_info;
-    MCIMX6ULEVK *s = g_new0(MCIMX6ULEVK, 1);
+    FslIMX6ULState *s;
     int i;
 
     if (machine->ram_size > FSL_IMX6UL_MMDC_SIZE) {
@@ -43,15 +38,12 @@ static void mcimx6ul_evk_init(MachineState *machine)
         .nb_cpus = machine->smp.cpus,
     };
 
-    object_initialize_child(OBJECT(machine), "soc", &s->soc,  sizeof(s->soc),
-                            TYPE_FSL_IMX6UL, &error_fatal, NULL);
-
-    object_property_set_bool(OBJECT(&s->soc), true, "realized", &error_fatal);
+    s = FSL_IMX6UL(object_new(TYPE_FSL_IMX6UL));
+    object_property_add_child(OBJECT(machine), "soc", OBJECT(s), &error_fatal);
+    object_property_set_bool(OBJECT(s), true, "realized", &error_fatal);
 
-    memory_region_allocate_system_memory(&s->ram, NULL, "mcimx6ul-evk.ram",
-                                         machine->ram_size);
-    memory_region_add_subregion(get_system_memory(),
-                                FSL_IMX6UL_MMDC_ADDR, &s->ram);
+    memory_region_add_subregion(get_system_memory(), FSL_IMX6UL_MMDC_ADDR,
+                                machine->ram);
 
     for (i = 0; i < FSL_IMX6UL_NUM_USDHCS; i++) {
         BusState *bus;
@@ -61,7 +53,7 @@ static void mcimx6ul_evk_init(MachineState *machine)
 
         di = drive_get_next(IF_SD);
         blk = di ? blk_by_legacy_dinfo(di) : NULL;
-        bus = qdev_get_child_bus(DEVICE(&s->soc.usdhc[i]), "sd-bus");
+        bus = qdev_get_child_bus(DEVICE(&s->usdhc[i]), "sd-bus");
         carddev = qdev_create(bus, TYPE_SD_CARD);
         qdev_prop_set_drive(carddev, "drive", blk, &error_fatal);
         object_property_set_bool(OBJECT(carddev), true,
@@ -69,7 +61,7 @@ static void mcimx6ul_evk_init(MachineState *machine)
     }
 
     if (!qtest_enabled()) {
-        arm_load_kernel(&s->soc.cpu, machine, &boot_info);
+        arm_load_kernel(&s->cpu, machine, &boot_info);
     }
 }
 
@@ -78,5 +70,6 @@ static void mcimx6ul_evk_machine_init(MachineClass *mc)
     mc->desc = "Freescale i.MX6UL Evaluation Kit (Cortex A7)";
     mc->init = mcimx6ul_evk_init;
     mc->max_cpus = FSL_IMX6UL_NUM_CPUS;
+    mc->default_ram_id = "mcimx6ul-evk.ram";
 }
 DEFINE_MACHINE("mcimx6ul-evk", mcimx6ul_evk_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 23/86] arm:mcimx7d-sabre: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (21 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 22/86] arm:mcimx6ul-evk: " Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 13:03 ` [PATCH 24/86] arm:mps2-tz: " Igor Mammedov
                   ` (63 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

PS:
 remove no longer needed MCIMX7Sabre

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/arm/mcimx7d-sabre.c | 25 +++++++++----------------
 1 file changed, 9 insertions(+), 16 deletions(-)

diff --git a/hw/arm/mcimx7d-sabre.c b/hw/arm/mcimx7d-sabre.c
index 0d1f62d..de1e264 100644
--- a/hw/arm/mcimx7d-sabre.c
+++ b/hw/arm/mcimx7d-sabre.c
@@ -21,15 +21,10 @@
 #include "qemu/error-report.h"
 #include "sysemu/qtest.h"
 
-typedef struct {
-    FslIMX7State soc;
-    MemoryRegion ram;
-} MCIMX7Sabre;
-
 static void mcimx7d_sabre_init(MachineState *machine)
 {
     static struct arm_boot_info boot_info;
-    MCIMX7Sabre *s = g_new0(MCIMX7Sabre, 1);
+    FslIMX7State *s;
     int i;
 
     if (machine->ram_size > FSL_IMX7_MMDC_SIZE) {
@@ -45,15 +40,12 @@ static void mcimx7d_sabre_init(MachineState *machine)
         .nb_cpus = machine->smp.cpus,
     };
 
-    object_initialize_child(OBJECT(machine), "soc",
-                            &s->soc, sizeof(s->soc),
-                            TYPE_FSL_IMX7, &error_fatal, NULL);
-    object_property_set_bool(OBJECT(&s->soc), true, "realized", &error_fatal);
+    s = FSL_IMX7(object_new(TYPE_FSL_IMX7));
+    object_property_add_child(OBJECT(machine), "soc", OBJECT(s), &error_fatal);
+    object_property_set_bool(OBJECT(s), true, "realized", &error_fatal);
 
-    memory_region_allocate_system_memory(&s->ram, NULL, "mcimx7d-sabre.ram",
-                                         machine->ram_size);
-    memory_region_add_subregion(get_system_memory(),
-                                FSL_IMX7_MMDC_ADDR, &s->ram);
+    memory_region_add_subregion(get_system_memory(), FSL_IMX7_MMDC_ADDR,
+                                machine->ram);
 
     for (i = 0; i < FSL_IMX7_NUM_USDHCS; i++) {
         BusState *bus;
@@ -63,7 +55,7 @@ static void mcimx7d_sabre_init(MachineState *machine)
 
         di = drive_get_next(IF_SD);
         blk = di ? blk_by_legacy_dinfo(di) : NULL;
-        bus = qdev_get_child_bus(DEVICE(&s->soc.usdhc[i]), "sd-bus");
+        bus = qdev_get_child_bus(DEVICE(&s->usdhc[i]), "sd-bus");
         carddev = qdev_create(bus, TYPE_SD_CARD);
         qdev_prop_set_drive(carddev, "drive", blk, &error_fatal);
         object_property_set_bool(OBJECT(carddev), true,
@@ -71,7 +63,7 @@ static void mcimx7d_sabre_init(MachineState *machine)
     }
 
     if (!qtest_enabled()) {
-        arm_load_kernel(&s->soc.cpu[0], machine, &boot_info);
+        arm_load_kernel(&s->cpu[0], machine, &boot_info);
     }
 }
 
@@ -80,5 +72,6 @@ static void mcimx7d_sabre_machine_init(MachineClass *mc)
     mc->desc = "Freescale i.MX7 DUAL SABRE (Cortex A7)";
     mc->init = mcimx7d_sabre_init;
     mc->max_cpus = FSL_IMX7_NUM_CPUS;
+    mc->default_ram_id = "mcimx7d-sabre.ram";
 }
 DEFINE_MACHINE("mcimx7d-sabre", mcimx7d_sabre_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 24/86] arm:mps2-tz: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (22 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 23/86] arm:mcimx7d-sabre: " Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 13:03 ` [PATCH 25/86] arm:mps2: " Igor Mammedov
                   ` (62 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

PS:
 while at it add check for user supplied RAM size and error
 out if it mismatches board expected value.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/arm/mps2-tz.c | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/hw/arm/mps2-tz.c b/hw/arm/mps2-tz.c
index f8b620b..8e2ba59 100644
--- a/hw/arm/mps2-tz.c
+++ b/hw/arm/mps2-tz.c
@@ -79,7 +79,6 @@ typedef struct {
     MachineState parent;
 
     ARMSSE iotkit;
-    MemoryRegion psram;
     MemoryRegion ssram[3];
     MemoryRegion ssram1_m;
     MPS2SCC scc;
@@ -388,6 +387,12 @@ static void mps2tz_common_init(MachineState *machine)
         exit(1);
     }
 
+    if (machine->ram_size != mc->default_ram_size) {
+        error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
+                     mc->default_ram_size);
+        exit(EXIT_FAILURE);
+    }
+
     sysbus_init_child_obj(OBJECT(machine), "iotkit", &mms->iotkit,
                           sizeof(mms->iotkit), mmc->armsse_type);
     iotkitdev = DEVICE(&mms->iotkit);
@@ -458,9 +463,7 @@ static void mps2tz_common_init(MachineState *machine)
      * tradeoffs. For QEMU they're all just RAM, though. We arbitrarily
      * call the 16MB our "system memory", as it's the largest lump.
      */
-    memory_region_allocate_system_memory(&mms->psram,
-                                         NULL, "mps.ram", 16 * MiB);
-    memory_region_add_subregion(system_memory, 0x80000000, &mms->psram);
+    memory_region_add_subregion(system_memory, 0x80000000, machine->ram);
 
     /* The overflow IRQs for all UARTs are ORed together.
      * Tx, Rx and "combined" IRQs are sent to the NVIC separately.
@@ -642,6 +645,7 @@ static void mps2tz_class_init(ObjectClass *oc, void *data)
 
     mc->init = mps2tz_common_init;
     iic->check = mps2_tz_idau_check;
+    mc->default_ram_id = "mps.ram";
 }
 
 static void mps2tz_an505_class_init(ObjectClass *oc, void *data)
@@ -657,6 +661,7 @@ static void mps2tz_an505_class_init(ObjectClass *oc, void *data)
     mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-m33");
     mmc->scc_id = 0x41045050;
     mmc->armsse_type = TYPE_IOTKIT;
+    mc->default_ram_size = 16 * MiB;
 }
 
 static void mps2tz_an521_class_init(ObjectClass *oc, void *data)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 25/86] arm:mps2: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (23 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 24/86] arm:mps2-tz: " Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 13:03 ` [PATCH 26/86] arm:musicpal: " Igor Mammedov
                   ` (61 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

PS:
 while at it add check for user supplied RAM size and error
 out if it mismatches board expected value.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/arm/mps2.c | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/hw/arm/mps2.c b/hw/arm/mps2.c
index d002b12..930124d 100644
--- a/hw/arm/mps2.c
+++ b/hw/arm/mps2.c
@@ -55,7 +55,6 @@ typedef struct {
     MachineState parent;
 
     ARMv7MState armv7m;
-    MemoryRegion psram;
     MemoryRegion ssram1;
     MemoryRegion ssram1_m;
     MemoryRegion ssram23;
@@ -118,6 +117,12 @@ static void mps2_common_init(MachineState *machine)
         exit(1);
     }
 
+    if (machine->ram_size != mc->default_ram_size) {
+        error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
+                     mc->default_ram_size);
+        exit(EXIT_FAILURE);
+    }
+
     /* The FPGA images have an odd combination of different RAMs,
      * because in hardware they are different implementations and
      * connected to different buses, giving varying performance/size
@@ -146,9 +151,7 @@ static void mps2_common_init(MachineState *machine)
      * This is of no use for QEMU so we don't implement it (as if
      * zbt_boot_ctrl is always zero).
      */
-    memory_region_allocate_system_memory(&mms->psram,
-                                         NULL, "mps.ram", 16 * MiB);
-    memory_region_add_subregion(system_memory, 0x21000000, &mms->psram);
+    memory_region_add_subregion(system_memory, 0x21000000, machine->ram);
 
     switch (mmc->fpga_type) {
     case FPGA_AN385:
@@ -338,6 +341,8 @@ static void mps2_class_init(ObjectClass *oc, void *data)
 
     mc->init = mps2_common_init;
     mc->max_cpus = 1;
+    mc->default_ram_size = 16 * MiB;
+    mc->default_ram_id = "mps.ram";
 }
 
 static void mps2_an385_class_init(ObjectClass *oc, void *data)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 26/86] arm:musicpal: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (24 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 25/86] arm:mps2: " Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 13:03 ` [PATCH 27/86] arm:nseries: " Igor Mammedov
                   ` (60 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

PS:
 while at it add check for user supplied RAM size and error
 out if it mismatches board expected value.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/arm/musicpal.c | 16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c
index f68a399..5bcb144 100644
--- a/hw/arm/musicpal.c
+++ b/hw/arm/musicpal.c
@@ -1589,16 +1589,20 @@ static void musicpal_init(MachineState *machine)
     int i;
     unsigned long flash_size;
     DriveInfo *dinfo;
+    MachineClass *mc = MACHINE_GET_CLASS(machine);
     MemoryRegion *address_space_mem = get_system_memory();
-    MemoryRegion *ram = g_new(MemoryRegion, 1);
     MemoryRegion *sram = g_new(MemoryRegion, 1);
 
+    /* For now we use a fixed - the original - RAM size */
+    if (machine->ram_size != mc->default_ram_size) {
+        error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
+                     mc->default_ram_size);
+        exit(EXIT_FAILURE);
+    }
+
     cpu = ARM_CPU(cpu_create(machine->cpu_type));
 
-    /* For now we use a fixed - the original - RAM size */
-    memory_region_allocate_system_memory(ram, NULL, "musicpal.ram",
-                                         MP_RAM_DEFAULT_SIZE);
-    memory_region_add_subregion(address_space_mem, 0, ram);
+    memory_region_add_subregion(address_space_mem, 0, machine->ram);
 
     memory_region_init_ram(sram, NULL, "musicpal.sram", MP_SRAM_SIZE,
                            &error_fatal);
@@ -1714,6 +1718,8 @@ static void musicpal_machine_init(MachineClass *mc)
     mc->init = musicpal_init;
     mc->ignore_memory_transaction_failures = true;
     mc->default_cpu_type = ARM_CPU_TYPE_NAME("arm926");
+    mc->default_ram_size = MP_RAM_DEFAULT_SIZE;
+    mc->default_ram_id = "musicpal.ram";
 }
 
 DEFINE_MACHINE("musicpal", musicpal_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 27/86] arm:nseries: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (25 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 26/86] arm:musicpal: " Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 13:03 ` [PATCH 28/86] arm:omap_sx1: " Igor Mammedov
                   ` (59 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

PS:
 while at it add check for user supplied RAM size and error
 out if it mismatches board expected value.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/arm/nseries.c | 31 ++++++++++++++++++-------------
 1 file changed, 18 insertions(+), 13 deletions(-)

diff --git a/hw/arm/nseries.c b/hw/arm/nseries.c
index 3fd196f..89e4627 100644
--- a/hw/arm/nseries.c
+++ b/hw/arm/nseries.c
@@ -47,7 +47,6 @@
 
 /* Nokia N8x0 support */
 struct n800_s {
-    MemoryRegion sdram;
     struct omap_mpu_state_s *mpu;
 
     struct rfbi_chip_s blizzard;
@@ -1311,13 +1310,18 @@ static void n8x0_init(MachineState *machine,
                       struct arm_boot_info *binfo, int model)
 {
     struct n800_s *s = (struct n800_s *) g_malloc0(sizeof(*s));
-    uint64_t sdram_size = binfo->ram_size;
+    MachineClass *mc = MACHINE_GET_CLASS(machine);
 
-    memory_region_allocate_system_memory(&s->sdram, NULL, "omap2.dram",
-                                         sdram_size);
-    memory_region_add_subregion(get_system_memory(), OMAP2_Q2_BASE, &s->sdram);
+    if (machine->ram_size != mc->default_ram_size) {
+        error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
+                     mc->default_ram_size);
+        exit(EXIT_FAILURE);
+    }
+
+    memory_region_add_subregion(get_system_memory(), OMAP2_Q2_BASE,
+                                machine->ram);
 
-    s->mpu = omap2420_mpu_init(&s->sdram, machine->cpu_type);
+    s->mpu = omap2420_mpu_init(machine->ram, machine->cpu_type);
 
     /* Setup peripherals
      *
@@ -1383,9 +1387,8 @@ static void n8x0_init(MachineState *machine,
          *
          * The code above is for loading the `zImage' file from Nokia
          * images.  */
-        load_image_targphys(option_rom[0].name,
-                            OMAP2_Q2_BASE + 0x400000,
-                            sdram_size - 0x400000);
+        load_image_targphys(option_rom[0].name, OMAP2_Q2_BASE + 0x400000,
+                            machine->ram_size - 0x400000);
 
         n800_setup_nolo_tags(nolo_tags);
         cpu_physical_memory_write(OMAP2_SRAM_BASE, nolo_tags, 0x10000);
@@ -1395,16 +1398,12 @@ static void n8x0_init(MachineState *machine,
 
 static struct arm_boot_info n800_binfo = {
     .loader_start = OMAP2_Q2_BASE,
-    /* Actually two chips of 0x4000000 bytes each */
-    .ram_size = 0x08000000,
     .board_id = 0x4f7,
     .atag_board = n800_atag_setup,
 };
 
 static struct arm_boot_info n810_binfo = {
     .loader_start = OMAP2_Q2_BASE,
-    /* Actually two chips of 0x4000000 bytes each */
-    .ram_size = 0x08000000,
     /* 0x60c and 0x6bf (WiMAX Edition) have been assigned but are not
      * used by some older versions of the bootloader and 5555 is used
      * instead (including versions that shipped with many devices).  */
@@ -1431,6 +1430,9 @@ static void n800_class_init(ObjectClass *oc, void *data)
     mc->default_boot_order = "";
     mc->ignore_memory_transaction_failures = true;
     mc->default_cpu_type = ARM_CPU_TYPE_NAME("arm1136-r2");
+    /* Actually two chips of 0x4000000 bytes each */
+    mc->default_ram_size = 0x08000000;
+    mc->default_ram_id = "omap2.dram";
 }
 
 static const TypeInfo n800_type = {
@@ -1448,6 +1450,9 @@ static void n810_class_init(ObjectClass *oc, void *data)
     mc->default_boot_order = "";
     mc->ignore_memory_transaction_failures = true;
     mc->default_cpu_type = ARM_CPU_TYPE_NAME("arm1136-r2");
+    /* Actually two chips of 0x4000000 bytes each */
+    mc->default_ram_size = 0x08000000;
+    mc->default_ram_id = "omap2.dram";
 }
 
 static const TypeInfo n810_type = {
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 28/86] arm:omap_sx1: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (26 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 27/86] arm:nseries: " Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 13:03 ` [PATCH 29/86] arm:palm: " Igor Mammedov
                   ` (58 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

PS:
 while at it add check for user supplied RAM size and error
 out if it mismatches board expected value.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/arm/omap_sx1.c | 18 +++++++++++++-----
 1 file changed, 13 insertions(+), 5 deletions(-)

diff --git a/hw/arm/omap_sx1.c b/hw/arm/omap_sx1.c
index be24571..d97225b 100644
--- a/hw/arm/omap_sx1.c
+++ b/hw/arm/omap_sx1.c
@@ -102,8 +102,8 @@ static struct arm_boot_info sx1_binfo = {
 static void sx1_init(MachineState *machine, const int version)
 {
     struct omap_mpu_state_s *mpu;
+    MachineClass *mc = MACHINE_GET_CLASS(machine);
     MemoryRegion *address_space = get_system_memory();
-    MemoryRegion *dram = g_new(MemoryRegion, 1);
     MemoryRegion *flash = g_new(MemoryRegion, 1);
     MemoryRegion *cs = g_new(MemoryRegion, 4);
     static uint32_t cs0val = 0x00213090;
@@ -115,15 +115,19 @@ static void sx1_init(MachineState *machine, const int version)
     uint32_t flash_size = flash0_size;
     int be;
 
+    if (machine->ram_size != mc->default_ram_size) {
+        error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
+                     mc->default_ram_size);
+        exit(EXIT_FAILURE);
+    }
+
     if (version == 2) {
         flash_size = flash2_size;
     }
 
-    memory_region_allocate_system_memory(dram, NULL, "omap1.dram",
-                                         sx1_binfo.ram_size);
-    memory_region_add_subregion(address_space, OMAP_EMIFF_BASE, dram);
+    memory_region_add_subregion(address_space, OMAP_EMIFF_BASE, machine->ram);
 
-    mpu = omap310_mpu_init(dram, machine->cpu_type);
+    mpu = omap310_mpu_init(machine->ram, machine->cpu_type);
 
     /* External Flash (EMIFS) */
     memory_region_init_ram(flash, NULL, "omap_sx1.flash0-0", flash_size,
@@ -223,6 +227,8 @@ static void sx1_machine_v2_class_init(ObjectClass *oc, void *data)
     mc->init = sx1_init_v2;
     mc->ignore_memory_transaction_failures = true;
     mc->default_cpu_type = ARM_CPU_TYPE_NAME("ti925t");
+    mc->default_ram_size = sdram_size;
+    mc->default_ram_id = "omap1.dram";
 }
 
 static const TypeInfo sx1_machine_v2_type = {
@@ -239,6 +245,8 @@ static void sx1_machine_v1_class_init(ObjectClass *oc, void *data)
     mc->init = sx1_init_v1;
     mc->ignore_memory_transaction_failures = true;
     mc->default_cpu_type = ARM_CPU_TYPE_NAME("ti925t");
+    mc->default_ram_size = sdram_size;
+    mc->default_ram_id = "omap1.dram";
 }
 
 static const TypeInfo sx1_machine_v1_type = {
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 29/86] arm:palm: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (27 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 28/86] arm:omap_sx1: " Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 13:03 ` [PATCH 30/86] arm:raspi: " Igor Mammedov
                   ` (57 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

PS:
 while at it add check for user supplied RAM size and error
 out if it mismatches board expected value.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/arm/palm.c | 18 ++++++++++++------
 1 file changed, 12 insertions(+), 6 deletions(-)

diff --git a/hw/arm/palm.c b/hw/arm/palm.c
index 72eca8c..56c6e67 100644
--- a/hw/arm/palm.c
+++ b/hw/arm/palm.c
@@ -181,7 +181,6 @@ static void palmte_gpio_setup(struct omap_mpu_state_s *cpu)
 
 static struct arm_boot_info palmte_binfo = {
     .loader_start = OMAP_EMIFF_BASE,
-    .ram_size = 0x02000000,
     .board_id = 0x331,
 };
 
@@ -195,15 +194,20 @@ static void palmte_init(MachineState *machine)
     static uint32_t cs2val = 0x0000e1a0;
     static uint32_t cs3val = 0xe1a0e1a0;
     int rom_size, rom_loaded = 0;
-    MemoryRegion *dram = g_new(MemoryRegion, 1);
+    MachineClass *mc = MACHINE_GET_CLASS(machine);
     MemoryRegion *flash = g_new(MemoryRegion, 1);
     MemoryRegion *cs = g_new(MemoryRegion, 4);
 
-    memory_region_allocate_system_memory(dram, NULL, "omap1.dram",
-                                         palmte_binfo.ram_size);
-    memory_region_add_subregion(address_space_mem, OMAP_EMIFF_BASE, dram);
+    if (machine->ram_size != mc->default_ram_size) {
+        error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
+                     mc->default_ram_size);
+        exit(EXIT_FAILURE);
+    }
+
+    memory_region_add_subregion(address_space_mem, OMAP_EMIFF_BASE,
+                                machine->ram);
 
-    mpu = omap310_mpu_init(dram, machine->cpu_type);
+    mpu = omap310_mpu_init(machine->ram, machine->cpu_type);
 
     /* External Flash (EMIFS) */
     memory_region_init_ram(flash, NULL, "palmte.flash", flash_size,
@@ -265,6 +269,8 @@ static void palmte_machine_init(MachineClass *mc)
     mc->init = palmte_init;
     mc->ignore_memory_transaction_failures = true;
     mc->default_cpu_type = ARM_CPU_TYPE_NAME("ti925t");
+    mc->default_ram_size = 0x02000000;
+    mc->default_ram_id = "omap1.dram";
 }
 
 DEFINE_MACHINE("cheetah", palmte_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 30/86] arm:raspi: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (28 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 29/86] arm:palm: " Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 13:03 ` [PATCH 31/86] arm:sabrelite: " Igor Mammedov
                   ` (56 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

PS:
 remove no longer needed RasPiState

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/arm/raspi.c | 34 +++++++++++++---------------------
 1 file changed, 13 insertions(+), 21 deletions(-)

diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
index 6a510aa..33ace66 100644
--- a/hw/arm/raspi.c
+++ b/hw/arm/raspi.c
@@ -32,11 +32,6 @@
 /* Table of Linux board IDs for different Pi versions */
 static const int raspi_boardid[] = {[1] = 0xc42, [2] = 0xc43, [3] = 0xc44};
 
-typedef struct RasPiState {
-    BCM283XState soc;
-    MemoryRegion ram;
-} RasPiState;
-
 static void write_smpboot(ARMCPU *cpu, const struct arm_boot_info *info)
 {
     static const uint32_t smpboot[] = {
@@ -166,7 +161,7 @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
 
 static void raspi_init(MachineState *machine, int version)
 {
-    RasPiState *s = g_new0(RasPiState, 1);
+    Object *soc;
     uint32_t vcram_size;
     DriveInfo *di;
     BlockBackend *blk;
@@ -179,30 +174,26 @@ static void raspi_init(MachineState *machine, int version)
         exit(1);
     }
 
-    object_initialize_child(OBJECT(machine), "soc", &s->soc, sizeof(s->soc),
-                            version == 3 ? TYPE_BCM2837 : TYPE_BCM2836,
-                            &error_abort, NULL);
+    soc = object_new(version == 3 ? TYPE_BCM2837 : TYPE_BCM2836);
+    object_property_add_child(OBJECT(machine), "soc", soc, &error_fatal);
 
-    /* Allocate and map RAM */
-    memory_region_allocate_system_memory(&s->ram, OBJECT(machine), "ram",
-                                         machine->ram_size);
     /* FIXME: Remove when we have custom CPU address space support */
-    memory_region_add_subregion_overlap(get_system_memory(), 0, &s->ram, 0);
+    memory_region_add_subregion_overlap(get_system_memory(), 0,
+                                        machine->ram, 0);
 
     /* Setup the SOC */
-    object_property_add_const_link(OBJECT(&s->soc), "ram", OBJECT(&s->ram),
+    object_property_add_const_link(soc, "ram", OBJECT(machine->ram),
                                    &error_abort);
-    object_property_set_int(OBJECT(&s->soc), machine->smp.cpus, "enabled-cpus",
+    object_property_set_int(soc, machine->smp.cpus, "enabled-cpus",
                             &error_abort);
     int board_rev = version == 3 ? 0xa02082 : 0xa21041;
-    object_property_set_int(OBJECT(&s->soc), board_rev, "board-rev",
-                            &error_abort);
-    object_property_set_bool(OBJECT(&s->soc), true, "realized", &error_abort);
+    object_property_set_int(soc, board_rev, "board-rev", &error_abort);
+    object_property_set_bool(soc, true, "realized", &error_abort);
 
     /* Create and plug in the SD cards */
     di = drive_get_next(IF_SD);
     blk = di ? blk_by_legacy_dinfo(di) : NULL;
-    bus = qdev_get_child_bus(DEVICE(&s->soc), "sd-bus");
+    bus = qdev_get_child_bus(DEVICE(soc), "sd-bus");
     if (bus == NULL) {
         error_report("No SD bus found in SOC object");
         exit(1);
@@ -211,8 +202,7 @@ static void raspi_init(MachineState *machine, int version)
     qdev_prop_set_drive(carddev, "drive", blk, &error_fatal);
     object_property_set_bool(OBJECT(carddev), true, "realized", &error_fatal);
 
-    vcram_size = object_property_get_uint(OBJECT(&s->soc), "vcram-size",
-                                          &error_abort);
+    vcram_size = object_property_get_uint(soc, "vcram-size", &error_abort);
     setup_boot(machine, version, machine->ram_size - vcram_size);
 }
 
@@ -233,6 +223,7 @@ static void raspi2_machine_init(MachineClass *mc)
     mc->min_cpus = BCM283X_NCPUS;
     mc->default_cpus = BCM283X_NCPUS;
     mc->default_ram_size = 1 * GiB;
+    mc->default_ram_id = "ram";
     mc->ignore_memory_transaction_failures = true;
 };
 DEFINE_MACHINE("raspi2", raspi2_machine_init)
@@ -255,6 +246,7 @@ static void raspi3_machine_init(MachineClass *mc)
     mc->min_cpus = BCM283X_NCPUS;
     mc->default_cpus = BCM283X_NCPUS;
     mc->default_ram_size = 1 * GiB;
+    mc->default_ram_id = "ram";
 }
 DEFINE_MACHINE("raspi3", raspi3_machine_init)
 #endif
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 31/86] arm:sabrelite: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (29 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 30/86] arm:raspi: " Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 13:03 ` [PATCH 32/86] arm:sbsa-ref: " Igor Mammedov
                   ` (55 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

PS:
 remove no longer needed IMX6Sabrelite

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/arm/sabrelite.c | 23 ++++++++---------------
 1 file changed, 8 insertions(+), 15 deletions(-)

diff --git a/hw/arm/sabrelite.c b/hw/arm/sabrelite.c
index 96cc455..e31694b 100644
--- a/hw/arm/sabrelite.c
+++ b/hw/arm/sabrelite.c
@@ -19,11 +19,6 @@
 #include "qemu/error-report.h"
 #include "sysemu/qtest.h"
 
-typedef struct IMX6Sabrelite {
-    FslIMX6State soc;
-    MemoryRegion ram;
-} IMX6Sabrelite;
-
 static struct arm_boot_info sabrelite_binfo = {
     /* DDR memory start */
     .loader_start = FSL_IMX6_MMDC_ADDR,
@@ -45,7 +40,7 @@ static void sabrelite_reset_secondary(ARMCPU *cpu,
 
 static void sabrelite_init(MachineState *machine)
 {
-    IMX6Sabrelite *s = g_new0(IMX6Sabrelite, 1);
+    FslIMX6State *s;
     Error *err = NULL;
 
     /* Check the amount of memory is compatible with the SOC */
@@ -55,19 +50,16 @@ static void sabrelite_init(MachineState *machine)
         exit(1);
     }
 
-    object_initialize_child(OBJECT(machine), "soc", &s->soc, sizeof(s->soc),
-                            TYPE_FSL_IMX6, &error_abort, NULL);
-
-    object_property_set_bool(OBJECT(&s->soc), true, "realized", &err);
+    s = FSL_IMX6(object_new(TYPE_FSL_IMX6));
+    object_property_add_child(OBJECT(machine), "soc", OBJECT(s), &error_fatal);
+    object_property_set_bool(OBJECT(s), true, "realized", &err);
     if (err != NULL) {
         error_report("%s", error_get_pretty(err));
         exit(1);
     }
 
-    memory_region_allocate_system_memory(&s->ram, NULL, "sabrelite.ram",
-                                         machine->ram_size);
     memory_region_add_subregion(get_system_memory(), FSL_IMX6_MMDC_ADDR,
-                                &s->ram);
+                                machine->ram);
 
     {
         /*
@@ -78,7 +70,7 @@ static void sabrelite_init(MachineState *machine)
         /* Add the sst25vf016b NOR FLASH memory to first SPI */
         Object *spi_dev;
 
-        spi_dev = object_resolve_path_component(OBJECT(&s->soc), "spi1");
+        spi_dev = object_resolve_path_component(OBJECT(s), "spi1");
         if (spi_dev) {
             SSIBus *spi_bus;
 
@@ -109,7 +101,7 @@ static void sabrelite_init(MachineState *machine)
     sabrelite_binfo.secondary_cpu_reset_hook = sabrelite_reset_secondary;
 
     if (!qtest_enabled()) {
-        arm_load_kernel(&s->soc.cpu[0], machine, &sabrelite_binfo);
+        arm_load_kernel(&s->cpu[0], machine, &sabrelite_binfo);
     }
 }
 
@@ -119,6 +111,7 @@ static void sabrelite_machine_init(MachineClass *mc)
     mc->init = sabrelite_init;
     mc->max_cpus = FSL_IMX6_NUM_CPUS;
     mc->ignore_memory_transaction_failures = true;
+    mc->default_ram_id = "sabrelite.ram";
 }
 
 DEFINE_MACHINE("sabrelite", sabrelite_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 32/86] arm:sbsa-ref: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (30 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 31/86] arm:sabrelite: " Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 13:03 ` [PATCH 33/86] arm:versatilepb: " Igor Mammedov
                   ` (54 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/arm/sbsa-ref.c | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/hw/arm/sbsa-ref.c b/hw/arm/sbsa-ref.c
index 9b5bcb5..1cba9fc 100644
--- a/hw/arm/sbsa-ref.c
+++ b/hw/arm/sbsa-ref.c
@@ -593,7 +593,6 @@ static void sbsa_ref_init(MachineState *machine)
     MachineClass *mc = MACHINE_GET_CLASS(machine);
     MemoryRegion *sysmem = get_system_memory();
     MemoryRegion *secure_sysmem = g_new(MemoryRegion, 1);
-    MemoryRegion *ram = g_new(MemoryRegion, 1);
     bool firmware_loaded;
     const CPUArchIdList *possible_cpus;
     int n, sbsa_max_cpus;
@@ -685,9 +684,8 @@ static void sbsa_ref_init(MachineState *machine)
         object_unref(cpuobj);
     }
 
-    memory_region_allocate_system_memory(ram, NULL, "sbsa-ref.ram",
-                                         machine->ram_size);
-    memory_region_add_subregion(sysmem, sbsa_ref_memmap[SBSA_MEM].base, ram);
+    memory_region_add_subregion(sysmem, sbsa_ref_memmap[SBSA_MEM].base,
+                                machine->ram);
 
     create_fdt(sms);
 
@@ -785,6 +783,7 @@ static void sbsa_ref_class_init(ObjectClass *oc, void *data)
     mc->block_default_type = IF_IDE;
     mc->no_cdrom = 1;
     mc->default_ram_size = 1 * GiB;
+    mc->default_ram_id = "sbsa-ref.ram";
     mc->default_cpus = 4;
     mc->possible_cpu_arch_ids = sbsa_ref_possible_cpu_arch_ids;
     mc->cpu_index_to_instance_props = sbsa_ref_cpu_index_to_props;
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 33/86] arm:versatilepb: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (31 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 32/86] arm:sbsa-ref: " Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 13:03 ` [PATCH 34/86] arm:vexpress: " Igor Mammedov
                   ` (53 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/arm/versatilepb.c | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/hw/arm/versatilepb.c b/hw/arm/versatilepb.c
index e86af01..f3c4a50 100644
--- a/hw/arm/versatilepb.c
+++ b/hw/arm/versatilepb.c
@@ -184,7 +184,6 @@ static void versatile_init(MachineState *machine, int board_id)
     Object *cpuobj;
     ARMCPU *cpu;
     MemoryRegion *sysmem = get_system_memory();
-    MemoryRegion *ram = g_new(MemoryRegion, 1);
     qemu_irq pic[32];
     qemu_irq sic[32];
     DeviceState *dev, *sysctl;
@@ -220,11 +219,9 @@ static void versatile_init(MachineState *machine, int board_id)
 
     cpu = ARM_CPU(cpuobj);
 
-    memory_region_allocate_system_memory(ram, NULL, "versatile.ram",
-                                         machine->ram_size);
     /* ??? RAM should repeat to fill physical memory space.  */
     /* SDRAM at address zero.  */
-    memory_region_add_subregion(sysmem, 0, ram);
+    memory_region_add_subregion(sysmem, 0, machine->ram);
 
     sysctl = qdev_create(NULL, "realview_sysctl");
     qdev_prop_set_uint32(sysctl, "sys_id", 0x41007004);
@@ -398,6 +395,7 @@ static void versatilepb_class_init(ObjectClass *oc, void *data)
     mc->block_default_type = IF_SCSI;
     mc->ignore_memory_transaction_failures = true;
     mc->default_cpu_type = ARM_CPU_TYPE_NAME("arm926");
+    mc->default_ram_id = "versatile.ram";
 }
 
 static const TypeInfo versatilepb_type = {
@@ -415,6 +413,7 @@ static void versatileab_class_init(ObjectClass *oc, void *data)
     mc->block_default_type = IF_SCSI;
     mc->ignore_memory_transaction_failures = true;
     mc->default_cpu_type = ARM_CPU_TYPE_NAME("arm926");
+    mc->default_ram_id = "versatile.ram";
 }
 
 static const TypeInfo versatileab_type = {
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 34/86] arm:vexpress: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (32 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 33/86] arm:versatilepb: " Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 13:03 ` [PATCH 35/86] arm:virt: " Igor Mammedov
                   ` (52 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/arm/vexpress.c | 14 +++++---------
 1 file changed, 5 insertions(+), 9 deletions(-)

diff --git a/hw/arm/vexpress.c b/hw/arm/vexpress.c
index 4673a88..ed683ee 100644
--- a/hw/arm/vexpress.c
+++ b/hw/arm/vexpress.c
@@ -273,7 +273,6 @@ static void a9_daughterboard_init(const VexpressMachineState *vms,
 {
     MachineState *machine = MACHINE(vms);
     MemoryRegion *sysmem = get_system_memory();
-    MemoryRegion *ram = g_new(MemoryRegion, 1);
     MemoryRegion *lowram = g_new(MemoryRegion, 1);
     ram_addr_t low_ram_size;
 
@@ -283,8 +282,6 @@ static void a9_daughterboard_init(const VexpressMachineState *vms,
         exit(1);
     }
 
-    memory_region_allocate_system_memory(ram, NULL, "vexpress.highmem",
-                                         ram_size);
     low_ram_size = ram_size;
     if (low_ram_size > 0x4000000) {
         low_ram_size = 0x4000000;
@@ -293,9 +290,10 @@ static void a9_daughterboard_init(const VexpressMachineState *vms,
      * address space should in theory be remappable to various
      * things including ROM or RAM; we always map the RAM there.
      */
-    memory_region_init_alias(lowram, NULL, "vexpress.lowmem", ram, 0, low_ram_size);
+    memory_region_init_alias(lowram, NULL, "vexpress.lowmem", machine->ram,
+                             0, low_ram_size);
     memory_region_add_subregion(sysmem, 0x0, lowram);
-    memory_region_add_subregion(sysmem, 0x60000000, ram);
+    memory_region_add_subregion(sysmem, 0x60000000, machine->ram);
 
     /* 0x1e000000 A9MPCore (SCU) private memory region */
     init_cpus(machine, cpu_type, TYPE_A9MPCORE_PRIV, 0x1e000000, pic,
@@ -360,7 +358,6 @@ static void a15_daughterboard_init(const VexpressMachineState *vms,
 {
     MachineState *machine = MACHINE(vms);
     MemoryRegion *sysmem = get_system_memory();
-    MemoryRegion *ram = g_new(MemoryRegion, 1);
     MemoryRegion *sram = g_new(MemoryRegion, 1);
 
     {
@@ -375,10 +372,8 @@ static void a15_daughterboard_init(const VexpressMachineState *vms,
         }
     }
 
-    memory_region_allocate_system_memory(ram, NULL, "vexpress.highmem",
-                                         ram_size);
     /* RAM is from 0x80000000 upwards; there is no low-memory alias for it. */
-    memory_region_add_subregion(sysmem, 0x80000000, ram);
+    memory_region_add_subregion(sysmem, 0x80000000, machine->ram);
 
     /* 0x2c000000 A15MPCore private memory region (GIC) */
     init_cpus(machine, cpu_type, TYPE_A15MPCORE_PRIV,
@@ -795,6 +790,7 @@ static void vexpress_class_init(ObjectClass *oc, void *data)
     mc->init = vexpress_common_init;
     mc->max_cpus = 4;
     mc->ignore_memory_transaction_failures = true;
+    mc->default_ram_id = "vexpress.highmem";
 }
 
 static void vexpress_a9_class_init(ObjectClass *oc, void *data)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 35/86] arm:virt: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (33 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 34/86] arm:vexpress: " Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 13:03 ` [PATCH 36/86] arm:xilinx_zynq: drop RAM size fixup Igor Mammedov
                   ` (51 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away,
so replace it with memdev allocated MemoryRegion.
The later is initialized by generic code, so board only
needs to opt in to memdev scheme by providing
  MachineClass::default_ram_id
and then map memory region provided by
  MachineState::ram_memdev

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/arm/virt.c | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index 39ab5f4..e2fbca3 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -1512,7 +1512,6 @@ static void machvirt_init(MachineState *machine)
     MemoryRegion *sysmem = get_system_memory();
     MemoryRegion *secure_sysmem = NULL;
     int n, virt_max_cpus;
-    MemoryRegion *ram = g_new(MemoryRegion, 1);
     bool firmware_loaded;
     bool aarch64 = true;
     bool has_ged = !vmc->no_ged;
@@ -1701,9 +1700,8 @@ static void machvirt_init(MachineState *machine)
         }
     }
 
-    memory_region_allocate_system_memory(ram, NULL, "mach-virt.ram",
-                                         machine->ram_size);
-    memory_region_add_subregion(sysmem, vms->memmap[VIRT_MEM].base, ram);
+    memory_region_add_subregion(sysmem, vms->memmap[VIRT_MEM].base,
+                                machine->ram);
     if (machine->device_memory) {
         memory_region_add_subregion(sysmem, machine->device_memory->base,
                                     &machine->device_memory->mr);
@@ -2053,6 +2051,7 @@ static void virt_machine_class_init(ObjectClass *oc, void *data)
     hc->unplug_request = virt_machine_device_unplug_request_cb;
     mc->numa_mem_supported = true;
     mc->auto_enable_numa_with_memhp = true;
+    mc->default_ram_id = "mach-virt.ram";
 }
 
 static void virt_instance_init(Object *obj)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 36/86] arm:xilinx_zynq: drop RAM size fixup
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (34 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 35/86] arm:virt: " Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 13:03 ` [PATCH 37/86] arm:xilinx_zynq: use memdev for RAM Igor Mammedov
                   ` (50 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

If user provided non-sense RAM size, board will complain and
continue running with max RAM size supported.
Also RAM is going to be allocated by generic code, so it won't be
possible for board to fix things up for user.

Make it error message and exit to force user fix CLI,
instead of accepting non-sense CLI values.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/arm/xilinx_zynq.c | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/hw/arm/xilinx_zynq.c b/hw/arm/xilinx_zynq.c
index 3a0fa5b..df950fc 100644
--- a/hw/arm/xilinx_zynq.c
+++ b/hw/arm/xilinx_zynq.c
@@ -158,7 +158,6 @@ static inline void zynq_init_spi_flashes(uint32_t base_addr, qemu_irq irq,
 
 static void zynq_init(MachineState *machine)
 {
-    ram_addr_t ram_size = machine->ram_size;
     ARMCPU *cpu;
     MemoryRegion *address_space_mem = get_system_memory();
     MemoryRegion *ext_ram = g_new(MemoryRegion, 1);
@@ -168,6 +167,12 @@ static void zynq_init(MachineState *machine)
     qemu_irq pic[64];
     int n;
 
+    /* max 2GB ram */
+    if (machine->ram_size > 0x80000000) {
+        error_report("RAM size more than %d is not supported", 0x80000000);
+        exit(EXIT_FAILURE);
+    }
+
     cpu = ARM_CPU(object_new(machine->cpu_type));
 
     /* By default A9 CPUs have EL3 enabled.  This board does not
@@ -184,14 +189,9 @@ static void zynq_init(MachineState *machine)
                             &error_fatal);
     object_property_set_bool(OBJECT(cpu), true, "realized", &error_fatal);
 
-    /* max 2GB ram */
-    if (ram_size > 0x80000000) {
-        ram_size = 0x80000000;
-    }
-
     /* DDR remapped to address zero.  */
     memory_region_allocate_system_memory(ext_ram, NULL, "zynq.ext_ram",
-                                         ram_size);
+                                         machine->ram_size);
     memory_region_add_subregion(address_space_mem, 0, ext_ram);
 
     /* 256K of on-chip memory */
@@ -300,7 +300,7 @@ static void zynq_init(MachineState *machine)
     sysbus_connect_irq(busdev, 0, pic[40 - IRQ_OFFSET]);
     sysbus_mmio_map(busdev, 0, 0xF8007000);
 
-    zynq_binfo.ram_size = ram_size;
+    zynq_binfo.ram_size = machine->ram_size;
     zynq_binfo.nb_cpus = 1;
     zynq_binfo.board_id = 0xd32;
     zynq_binfo.loader_start = 0;
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 37/86] arm:xilinx_zynq: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (35 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 36/86] arm:xilinx_zynq: drop RAM size fixup Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 13:03 ` [PATCH 38/86] arm:xlnx-versal-virt: " Igor Mammedov
                   ` (49 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/arm/xilinx_zynq.c | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/hw/arm/xilinx_zynq.c b/hw/arm/xilinx_zynq.c
index df950fc..0ef9688 100644
--- a/hw/arm/xilinx_zynq.c
+++ b/hw/arm/xilinx_zynq.c
@@ -160,7 +160,6 @@ static void zynq_init(MachineState *machine)
 {
     ARMCPU *cpu;
     MemoryRegion *address_space_mem = get_system_memory();
-    MemoryRegion *ext_ram = g_new(MemoryRegion, 1);
     MemoryRegion *ocm_ram = g_new(MemoryRegion, 1);
     DeviceState *dev;
     SysBusDevice *busdev;
@@ -190,9 +189,7 @@ static void zynq_init(MachineState *machine)
     object_property_set_bool(OBJECT(cpu), true, "realized", &error_fatal);
 
     /* DDR remapped to address zero.  */
-    memory_region_allocate_system_memory(ext_ram, NULL, "zynq.ext_ram",
-                                         machine->ram_size);
-    memory_region_add_subregion(address_space_mem, 0, ext_ram);
+    memory_region_add_subregion(address_space_mem, 0, machine->ram);
 
     /* 256K of on-chip memory */
     memory_region_init_ram(ocm_ram, NULL, "zynq.ocm_ram", 256 * KiB,
@@ -318,6 +315,7 @@ static void zynq_machine_init(MachineClass *mc)
     mc->no_sdcard = 1;
     mc->ignore_memory_transaction_failures = true;
     mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a9");
+    mc->default_ram_id = "zynq.ext_ram";
 }
 
 DEFINE_MACHINE("xilinx-zynq-a9", zynq_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 38/86] arm:xlnx-versal-virt: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (36 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 37/86] arm:xilinx_zynq: use memdev for RAM Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 16:05   ` Philippe Mathieu-Daudé
  2019-12-31 13:03 ` [PATCH 39/86] arm:xlnx-zcu102: " Igor Mammedov
                   ` (48 subsequent siblings)
  86 siblings, 1 reply; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/arm/xlnx-versal-virt.c | 7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/hw/arm/xlnx-versal-virt.c b/hw/arm/xlnx-versal-virt.c
index 462493c..c137ff4 100644
--- a/hw/arm/xlnx-versal-virt.c
+++ b/hw/arm/xlnx-versal-virt.c
@@ -30,7 +30,6 @@ typedef struct VersalVirt {
     MachineState parent_obj;
 
     Versal soc;
-    MemoryRegion mr_ddr;
 
     void *fdt;
     int fdt_size;
@@ -414,12 +413,9 @@ static void versal_virt_init(MachineState *machine)
         psci_conduit = QEMU_PSCI_CONDUIT_SMC;
     }
 
-    memory_region_allocate_system_memory(&s->mr_ddr, NULL, "ddr",
-                                         machine->ram_size);
-
     sysbus_init_child_obj(OBJECT(machine), "xlnx-ve", &s->soc,
                           sizeof(s->soc), TYPE_XLNX_VERSAL);
-    object_property_set_link(OBJECT(&s->soc), OBJECT(&s->mr_ddr),
+    object_property_set_link(OBJECT(&s->soc), OBJECT(machine->ram),
                              "ddr", &error_abort);
     object_property_set_int(OBJECT(&s->soc), psci_conduit,
                             "psci-conduit", &error_abort);
@@ -473,6 +469,7 @@ static void versal_virt_machine_class_init(ObjectClass *oc, void *data)
     mc->max_cpus = XLNX_VERSAL_NR_ACPUS;
     mc->default_cpus = XLNX_VERSAL_NR_ACPUS;
     mc->no_cdrom = true;
+    mc->default_ram_id = "ddr";
 }
 
 static const TypeInfo versal_virt_machine_init_typeinfo = {
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 39/86] arm:xlnx-zcu102: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (37 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 38/86] arm:xlnx-versal-virt: " Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 13:03 ` [PATCH 40/86] s390x:s390-virtio-ccw: " Igor Mammedov
                   ` (47 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/arm/xlnx-zcu102.c | 7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/hw/arm/xlnx-zcu102.c b/hw/arm/xlnx-zcu102.c
index 53cfe7c..bd645ad 100644
--- a/hw/arm/xlnx-zcu102.c
+++ b/hw/arm/xlnx-zcu102.c
@@ -28,7 +28,6 @@ typedef struct XlnxZCU102 {
     MachineState parent_obj;
 
     XlnxZynqMPState soc;
-    MemoryRegion ddr_ram;
 
     bool secure;
     bool virt;
@@ -87,13 +86,10 @@ static void xlnx_zcu102_init(MachineState *machine)
                  ram_size);
     }
 
-    memory_region_allocate_system_memory(&s->ddr_ram, NULL, "ddr-ram",
-                                         ram_size);
-
     object_initialize_child(OBJECT(machine), "soc", &s->soc, sizeof(s->soc),
                             TYPE_XLNX_ZYNQMP, &error_abort, NULL);
 
-    object_property_set_link(OBJECT(&s->soc), OBJECT(&s->ddr_ram),
+    object_property_set_link(OBJECT(&s->soc), OBJECT(machine->ram),
                          "ddr-ram", &error_abort);
     object_property_set_bool(OBJECT(&s->soc), s->secure, "secure",
                              &error_fatal);
@@ -211,6 +207,7 @@ static void xlnx_zcu102_machine_class_init(ObjectClass *oc, void *data)
     mc->ignore_memory_transaction_failures = true;
     mc->max_cpus = XLNX_ZYNQMP_NUM_APU_CPUS + XLNX_ZYNQMP_NUM_RPU_CPUS;
     mc->default_cpus = XLNX_ZYNQMP_NUM_APU_CPUS;
+    mc->default_ram_id = "ddr-ram";
 }
 
 static const TypeInfo xlnx_zcu102_machine_init_typeinfo = {
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 40/86] s390x:s390-virtio-ccw: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (38 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 39/86] arm:xlnx-zcu102: " Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 13:03 ` [PATCH 41/86] null-machine: " Igor Mammedov
                   ` (46 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/s390x/s390-virtio-ccw.c | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index e0e2813..cbdd4ba 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -154,14 +154,12 @@ static void virtio_ccw_register_hcalls(void)
                                    virtio_ccw_hcall_early_printk);
 }
 
-static void s390_memory_init(ram_addr_t mem_size)
+static void s390_memory_init(MemoryRegion *ram)
 {
     MemoryRegion *sysmem = get_system_memory();
-    MemoryRegion *ram = g_new(MemoryRegion, 1);
     Error *local_err = NULL;
 
     /* allocate RAM for core */
-    memory_region_allocate_system_memory(ram, NULL, "s390.ram", mem_size);
     memory_region_add_subregion(sysmem, 0, ram);
 
     /*
@@ -245,7 +243,7 @@ static void ccw_init(MachineState *machine)
 
     s390_sclp_init();
     /* init memory + setup max page size. Required for the CPU model */
-    s390_memory_init(machine->ram_size);
+    s390_memory_init(machine->ram);
 
     /* init CPUs (incl. CPU model) early so s390_has_feature() works */
     s390_init_cpus(machine);
@@ -471,6 +469,7 @@ static void ccw_machine_class_init(ObjectClass *oc, void *data)
     hc->plug = s390_machine_device_plug;
     hc->unplug_request = s390_machine_device_unplug_request;
     nc->nmi_monitor_handler = s390_nmi;
+    mc->default_ram_id = "s390.ram";
 }
 
 static inline bool machine_get_aes_key_wrap(Object *obj, Error **errp)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 41/86] null-machine: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (39 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 40/86] s390x:s390-virtio-ccw: " Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 15:32   ` Philippe Mathieu-Daudé
  2019-12-31 13:03 ` [PATCH 42/86] cris:axis_dev88: " Igor Mammedov
                   ` (45 subsequent siblings)
  86 siblings, 1 reply; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/core/null-machine.c | 8 +++-----
 1 file changed, 3 insertions(+), 5 deletions(-)

diff --git a/hw/core/null-machine.c b/hw/core/null-machine.c
index 1aa0a9a..cb47d9d 100644
--- a/hw/core/null-machine.c
+++ b/hw/core/null-machine.c
@@ -32,11 +32,8 @@ static void machine_none_init(MachineState *mch)
     }
 
     /* RAM at address zero */
-    if (mch->ram_size) {
-        MemoryRegion *ram = g_new(MemoryRegion, 1);
-
-        memory_region_allocate_system_memory(ram, NULL, "ram", mch->ram_size);
-        memory_region_add_subregion(get_system_memory(), 0, ram);
+    if (mch->ram) {
+        memory_region_add_subregion(get_system_memory(), 0, mch->ram);
     }
 
     if (mch->kernel_filename) {
@@ -52,6 +49,7 @@ static void machine_none_machine_init(MachineClass *mc)
     mc->init = machine_none_init;
     mc->max_cpus = 1;
     mc->default_ram_size = 0;
+    mc->default_ram_id = "ram";
 }
 
 DEFINE_MACHINE("none", machine_none_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 42/86] cris:axis_dev88: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (40 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 41/86] null-machine: " Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 13:03 ` [PATCH 43/86] hppa: drop RAM size fixup Igor Mammedov
                   ` (44 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/cris/axis_dev88.c | 8 ++------
 1 file changed, 2 insertions(+), 6 deletions(-)

diff --git a/hw/cris/axis_dev88.c b/hw/cris/axis_dev88.c
index 940c7dd..82e9bcb 100644
--- a/hw/cris/axis_dev88.c
+++ b/hw/cris/axis_dev88.c
@@ -249,7 +249,6 @@ static struct cris_load_info li;
 static
 void axisdev88_init(MachineState *machine)
 {
-    ram_addr_t ram_size = machine->ram_size;
     const char *kernel_filename = machine->kernel_filename;
     const char *kernel_cmdline = machine->kernel_cmdline;
     CRISCPU *cpu;
@@ -262,17 +261,13 @@ void axisdev88_init(MachineState *machine)
     struct etraxfs_dma_client *dma_eth;
     int i;
     MemoryRegion *address_space_mem = get_system_memory();
-    MemoryRegion *phys_ram = g_new(MemoryRegion, 1);
     MemoryRegion *phys_intmem = g_new(MemoryRegion, 1);
 
     /* init CPUs */
     cpu = CRIS_CPU(cpu_create(machine->cpu_type));
     env = &cpu->env;
 
-    /* allocate RAM */
-    memory_region_allocate_system_memory(phys_ram, NULL, "axisdev88.ram",
-                                         ram_size);
-    memory_region_add_subregion(address_space_mem, 0x40000000, phys_ram);
+    memory_region_add_subregion(address_space_mem, 0x40000000, machine->ram);
 
     /* The ETRAX-FS has 128Kb on chip ram, the docs refer to it as the 
        internal memory.  */
@@ -355,6 +350,7 @@ static void axisdev88_machine_init(MachineClass *mc)
     mc->init = axisdev88_init;
     mc->is_default = 1;
     mc->default_cpu_type = CRIS_CPU_TYPE_NAME("crisv32");
+    mc->default_ram_id = "axisdev88.ram";
 }
 
 DEFINE_MACHINE("axis-dev88", axisdev88_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 43/86] hppa: drop RAM size fixup
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (41 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 42/86] cris:axis_dev88: " Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 15:44   ` Philippe Mathieu-Daudé
                     ` (2 more replies)
  2019-12-31 13:03 ` [PATCH 44/86] hppa: use memdev for RAM Igor Mammedov
                   ` (43 subsequent siblings)
  86 siblings, 3 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

If user provided non-sense RAM size, board will complain and
continue running with max RAM size supported.
Also RAM is going to be allocated by generic code, so it won't be
possible for board to fix things up for user.

Make it error message and exit to force user fix CLI,
instead of accepting non-sense CLI values.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/hppa/machine.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
index 5d0de26..25f5afc 100644
--- a/hw/hppa/machine.c
+++ b/hw/hppa/machine.c
@@ -92,7 +92,8 @@ static void machine_hppa_init(MachineState *machine)
 
     /* Limit main memory. */
     if (ram_size > FIRMWARE_START) {
-        machine->ram_size = ram_size = FIRMWARE_START;
+        error_report("RAM size more than %d is not supported", FIRMWARE_START);
+        exit(EXIT_FAILURE);
     }
 
     /* Main memory region. */
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 44/86] hppa: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (42 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 43/86] hppa: drop RAM size fixup Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 15:45   ` Philippe Mathieu-Daudé
  2019-12-31 13:03 ` [PATCH 45/86] x86:microvm: " Igor Mammedov
                   ` (42 subsequent siblings)
  86 siblings, 1 reply; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/hppa/machine.c | 8 ++------
 1 file changed, 2 insertions(+), 6 deletions(-)

diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
index 25f5afc..b2f7bc5 100644
--- a/hw/hppa/machine.c
+++ b/hw/hppa/machine.c
@@ -70,7 +70,6 @@ static void machine_hppa_init(MachineState *machine)
     uint64_t kernel_entry = 0, kernel_low, kernel_high;
     MemoryRegion *addr_space = get_system_memory();
     MemoryRegion *rom_region;
-    MemoryRegion *ram_region;
     MemoryRegion *cpu_region;
     long i;
     unsigned int smp_cpus = machine->smp.cpus;
@@ -96,11 +95,7 @@ static void machine_hppa_init(MachineState *machine)
         exit(EXIT_FAILURE);
     }
 
-    /* Main memory region. */
-    ram_region = g_new(MemoryRegion, 1);
-    memory_region_allocate_system_memory(ram_region, OBJECT(machine),
-                                         "ram", ram_size);
-    memory_region_add_subregion(addr_space, 0, ram_region);
+    memory_region_add_subregion(addr_space, 0, machine->ram);
 
     /* Init Dino (PCI host bus chip).  */
     pci_bus = dino_init(addr_space, &rtc_irq, &serial_irq);
@@ -284,6 +279,7 @@ static void machine_hppa_machine_init(MachineClass *mc)
     mc->is_default = 1;
     mc->default_ram_size = 512 * MiB;
     mc->default_boot_order = "cd";
+    mc->default_ram_id = "ram";
 }
 
 DEFINE_MACHINE("hppa", machine_hppa_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 45/86] x86:microvm: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (43 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 44/86] hppa: use memdev for RAM Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 13:03 ` [PATCH 46/86] x86:pc: " Igor Mammedov
                   ` (41 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/i386/microvm.c | 12 +++++-------
 1 file changed, 5 insertions(+), 7 deletions(-)

diff --git a/hw/i386/microvm.c b/hw/i386/microvm.c
index 827ce29..7d78b99 100644
--- a/hw/i386/microvm.c
+++ b/hw/i386/microvm.c
@@ -167,7 +167,7 @@ static void microvm_memory_init(MicrovmMachineState *mms)
 {
     MachineState *machine = MACHINE(mms);
     X86MachineState *x86ms = X86_MACHINE(mms);
-    MemoryRegion *ram, *ram_below_4g, *ram_above_4g;
+    MemoryRegion *ram_below_4g, *ram_above_4g;
     MemoryRegion *system_memory = get_system_memory();
     FWCfgState *fw_cfg;
     ram_addr_t lowmem;
@@ -214,12 +214,8 @@ static void microvm_memory_init(MicrovmMachineState *mms)
         x86ms->below_4g_mem_size = machine->ram_size;
     }
 
-    ram = g_malloc(sizeof(*ram));
-    memory_region_allocate_system_memory(ram, NULL, "microvm.ram",
-                                         machine->ram_size);
-
     ram_below_4g = g_malloc(sizeof(*ram_below_4g));
-    memory_region_init_alias(ram_below_4g, NULL, "ram-below-4g", ram,
+    memory_region_init_alias(ram_below_4g, NULL, "ram-below-4g", machine->ram,
                              0, x86ms->below_4g_mem_size);
     memory_region_add_subregion(system_memory, 0, ram_below_4g);
 
@@ -227,7 +223,8 @@ static void microvm_memory_init(MicrovmMachineState *mms)
 
     if (x86ms->above_4g_mem_size > 0) {
         ram_above_4g = g_malloc(sizeof(*ram_above_4g));
-        memory_region_init_alias(ram_above_4g, NULL, "ram-above-4g", ram,
+        memory_region_init_alias(ram_above_4g, NULL, "ram-above-4g",
+                                 machine->ram,
                                  x86ms->below_4g_mem_size,
                                  x86ms->above_4g_mem_size);
         memory_region_add_subregion(system_memory, 0x100000000ULL,
@@ -502,6 +499,7 @@ static void microvm_class_init(ObjectClass *oc, void *data)
     mc->auto_enable_numa_with_memhp = false;
     mc->default_cpu_type = TARGET_DEFAULT_CPU_TYPE;
     mc->nvdimm_supported = false;
+    mc->default_ram_id = "microvm.ram";
 
     /* Avoid relying too much on kernel components */
     mc->default_kernel_irqchip_split = true;
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 46/86] x86:pc: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (44 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 45/86] x86:microvm: " Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 13:03 ` [PATCH 47/86] lm32:lm32_boards: " Igor Mammedov
                   ` (40 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/i386/pc.c | 19 +++++++++----------
 1 file changed, 9 insertions(+), 10 deletions(-)

diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index 42014b0..aa956aa 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -935,7 +935,7 @@ void pc_memory_init(PCMachineState *pcms,
                     MemoryRegion **ram_memory)
 {
     int linux_boot, i;
-    MemoryRegion *ram, *option_rom_mr;
+    MemoryRegion *option_rom_mr;
     MemoryRegion *ram_below_4g, *ram_above_4g;
     FWCfgState *fw_cfg;
     MachineState *machine = MACHINE(pcms);
@@ -948,22 +948,20 @@ void pc_memory_init(PCMachineState *pcms,
 
     linux_boot = (machine->kernel_filename != NULL);
 
-    /* Allocate RAM.  We allocate it as a single memory region and use
-     * aliases to address portions of it, mostly for backwards compatibility
-     * with older qemus that used qemu_ram_alloc().
+    /*
+     * Split single memory region and use aliases to address portions of it,
+     * done for backwards compatibility with older qemus.
      */
-    ram = g_malloc(sizeof(*ram));
-    memory_region_allocate_system_memory(ram, NULL, "pc.ram",
-                                         machine->ram_size);
-    *ram_memory = ram;
+    *ram_memory = machine->ram;
     ram_below_4g = g_malloc(sizeof(*ram_below_4g));
-    memory_region_init_alias(ram_below_4g, NULL, "ram-below-4g", ram,
+    memory_region_init_alias(ram_below_4g, NULL, "ram-below-4g", machine->ram,
                              0, x86ms->below_4g_mem_size);
     memory_region_add_subregion(system_memory, 0, ram_below_4g);
     e820_add_entry(0, x86ms->below_4g_mem_size, E820_RAM);
     if (x86ms->above_4g_mem_size > 0) {
         ram_above_4g = g_malloc(sizeof(*ram_above_4g));
-        memory_region_init_alias(ram_above_4g, NULL, "ram-above-4g", ram,
+        memory_region_init_alias(ram_above_4g, NULL, "ram-above-4g",
+                                 machine->ram,
                                  x86ms->below_4g_mem_size,
                                  x86ms->above_4g_mem_size);
         memory_region_add_subregion(system_memory, 0x100000000ULL,
@@ -1951,6 +1949,7 @@ static void pc_machine_class_init(ObjectClass *oc, void *data)
     mc->default_cpu_type = TARGET_DEFAULT_CPU_TYPE;
     mc->nvdimm_supported = true;
     mc->numa_mem_supported = true;
+    mc->default_ram_id = "pc.ram";
 
     object_class_property_add(oc, PC_MACHINE_DEVMEM_REGION_SIZE, "int",
         pc_machine_get_device_memory_region_size, NULL,
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 47/86] lm32:lm32_boards: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (45 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 46/86] x86:pc: " Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 13:03 ` [PATCH 48/86] lm32:milkymist: " Igor Mammedov
                   ` (39 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

PS:
 while at it add check for user supplied RAM size and error
 out if it mismatches board expected value.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/lm32/lm32_boards.c | 36 +++++++++++++++++++++++-------------
 1 file changed, 23 insertions(+), 13 deletions(-)

diff --git a/hw/lm32/lm32_boards.c b/hw/lm32/lm32_boards.c
index 5ae308b..0d3771b 100644
--- a/hw/lm32/lm32_boards.c
+++ b/hw/lm32/lm32_boards.c
@@ -75,22 +75,27 @@ static void main_cpu_reset(void *opaque)
 
 static void lm32_evr_init(MachineState *machine)
 {
+    MachineClass *mc = MACHINE_GET_CLASS(machine);
     const char *kernel_filename = machine->kernel_filename;
     LM32CPU *cpu;
     CPULM32State *env;
     DriveInfo *dinfo;
     MemoryRegion *address_space_mem =  get_system_memory();
-    MemoryRegion *phys_ram = g_new(MemoryRegion, 1);
     qemu_irq irq[32];
     ResetInfo *reset_info;
     int i;
 
+    if (machine->ram_size != mc->default_ram_size) {
+        error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
+                     mc->default_ram_size);
+        exit(EXIT_FAILURE);
+    }
+
     /* memory map */
     hwaddr flash_base  = 0x04000000;
     size_t flash_sector_size       = 256 * KiB;
     size_t flash_size              = 32 * MiB;
     hwaddr ram_base    = 0x08000000;
-    size_t ram_size                = 64 * MiB;
     hwaddr timer0_base = 0x80002000;
     hwaddr uart0_base  = 0x80006000;
     hwaddr timer1_base = 0x8000a000;
@@ -107,9 +112,7 @@ static void lm32_evr_init(MachineState *machine)
 
     reset_info->flash_base = flash_base;
 
-    memory_region_allocate_system_memory(phys_ram, NULL, "lm32_evr.sdram",
-                                         ram_size);
-    memory_region_add_subregion(address_space_mem, ram_base, phys_ram);
+    memory_region_add_subregion(address_space_mem, ram_base, machine->ram);
 
     dinfo = drive_get(IF_PFLASH, 0, 0);
     /* Spansion S29NS128P */
@@ -144,7 +147,7 @@ static void lm32_evr_init(MachineState *machine)
 
         if (kernel_size < 0) {
             kernel_size = load_image_targphys(kernel_filename, ram_base,
-                                              ram_size);
+                                              machine->ram_size);
             reset_info->bootstrap_pc = ram_base;
         }
 
@@ -159,6 +162,7 @@ static void lm32_evr_init(MachineState *machine)
 
 static void lm32_uclinux_init(MachineState *machine)
 {
+    MachineClass *mc = MACHINE_GET_CLASS(machine);
     const char *kernel_filename = machine->kernel_filename;
     const char *kernel_cmdline = machine->kernel_cmdline;
     const char *initrd_filename = machine->initrd_filename;
@@ -166,18 +170,22 @@ static void lm32_uclinux_init(MachineState *machine)
     CPULM32State *env;
     DriveInfo *dinfo;
     MemoryRegion *address_space_mem =  get_system_memory();
-    MemoryRegion *phys_ram = g_new(MemoryRegion, 1);
     qemu_irq irq[32];
     HWSetup *hw;
     ResetInfo *reset_info;
     int i;
 
+    if (machine->ram_size != mc->default_ram_size) {
+        error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
+                     mc->default_ram_size);
+        exit(EXIT_FAILURE);
+    }
+
     /* memory map */
     hwaddr flash_base   = 0x04000000;
     size_t flash_sector_size        = 256 * KiB;
     size_t flash_size               = 32 * MiB;
     hwaddr ram_base     = 0x08000000;
-    size_t ram_size                 = 64 * MiB;
     hwaddr uart0_base   = 0x80000000;
     hwaddr timer0_base  = 0x80002000;
     hwaddr timer1_base  = 0x80010000;
@@ -200,9 +208,7 @@ static void lm32_uclinux_init(MachineState *machine)
 
     reset_info->flash_base = flash_base;
 
-    memory_region_allocate_system_memory(phys_ram, NULL,
-                                         "lm32_uclinux.sdram", ram_size);
-    memory_region_add_subregion(address_space_mem, ram_base, phys_ram);
+    memory_region_add_subregion(address_space_mem, ram_base, machine->ram);
 
     dinfo = drive_get(IF_PFLASH, 0, 0);
     /* Spansion S29NS128P */
@@ -238,7 +244,7 @@ static void lm32_uclinux_init(MachineState *machine)
 
         if (kernel_size < 0) {
             kernel_size = load_image_targphys(kernel_filename, ram_base,
-                                              ram_size);
+                                              machine->ram_size);
             reset_info->bootstrap_pc = ram_base;
         }
 
@@ -252,7 +258,7 @@ static void lm32_uclinux_init(MachineState *machine)
     hw = hwsetup_init();
     hwsetup_add_cpu(hw, "LM32", 75000000);
     hwsetup_add_flash(hw, "flash", flash_base, flash_size);
-    hwsetup_add_ddr_sdram(hw, "ddr_sdram", ram_base, ram_size);
+    hwsetup_add_ddr_sdram(hw, "ddr_sdram", ram_base, machine->ram_size);
     hwsetup_add_timer(hw, "timer0", timer0_base, timer0_irq);
     hwsetup_add_timer(hw, "timer1_dev_only", timer1_base, timer1_irq);
     hwsetup_add_timer(hw, "timer2_dev_only", timer2_base, timer2_irq);
@@ -288,6 +294,8 @@ static void lm32_evr_class_init(ObjectClass *oc, void *data)
     mc->init = lm32_evr_init;
     mc->is_default = 1;
     mc->default_cpu_type = LM32_CPU_TYPE_NAME("lm32-full");
+    mc->default_ram_size = 64 * MiB;
+    mc->default_ram_id = "lm32_evr.sdram";
 }
 
 static const TypeInfo lm32_evr_type = {
@@ -304,6 +312,8 @@ static void lm32_uclinux_class_init(ObjectClass *oc, void *data)
     mc->init = lm32_uclinux_init;
     mc->is_default = 0;
     mc->default_cpu_type = LM32_CPU_TYPE_NAME("lm32-full");
+    mc->default_ram_size = 64 * MiB;
+    mc->default_ram_id = "lm32_uclinux.sdram";
 }
 
 static const TypeInfo lm32_uclinux_type = {
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 48/86] lm32:milkymist: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (46 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 47/86] lm32:lm32_boards: " Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 13:03 ` [PATCH 49/86] m68k:an5206: " Igor Mammedov
                   ` (38 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

PS:
 while at it add check for user supplied RAM size and error
 out if it mismatches board expected value.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/lm32/milkymist.c | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)

diff --git a/hw/lm32/milkymist.c b/hw/lm32/milkymist.c
index 460d322..cc9db7d 100644
--- a/hw/lm32/milkymist.c
+++ b/hw/lm32/milkymist.c
@@ -82,6 +82,7 @@ static void main_cpu_reset(void *opaque)
 static void
 milkymist_init(MachineState *machine)
 {
+    MachineClass *mc = MACHINE_GET_CLASS(machine);
     const char *kernel_filename = machine->kernel_filename;
     const char *kernel_cmdline = machine->kernel_cmdline;
     const char *initrd_filename = machine->initrd_filename;
@@ -90,22 +91,26 @@ milkymist_init(MachineState *machine)
     int kernel_size;
     DriveInfo *dinfo;
     MemoryRegion *address_space_mem = get_system_memory();
-    MemoryRegion *phys_sdram = g_new(MemoryRegion, 1);
     qemu_irq irq[32];
     int i;
     char *bios_filename;
     ResetInfo *reset_info;
 
+    if (machine->ram_size != mc->default_ram_size) {
+        error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
+                     mc->default_ram_size);
+        exit(EXIT_FAILURE);
+    }
+
     /* memory map */
     hwaddr flash_base   = 0x00000000;
     size_t flash_sector_size        = 128 * KiB;
     size_t flash_size               = 32 * MiB;
     hwaddr sdram_base   = 0x40000000;
-    size_t sdram_size               = 128 * MiB;
 
     hwaddr initrd_base  = sdram_base + 0x1002000;
     hwaddr cmdline_base = sdram_base + 0x1000000;
-    size_t initrd_max = sdram_size - 0x1002000;
+    size_t initrd_max = machine->ram_size - 0x1002000;
 
     reset_info = g_malloc0(sizeof(ResetInfo));
 
@@ -116,9 +121,7 @@ milkymist_init(MachineState *machine)
 
     cpu_lm32_set_phys_msb_ignore(env, 1);
 
-    memory_region_allocate_system_memory(phys_sdram, NULL, "milkymist.sdram",
-                                         sdram_size);
-    memory_region_add_subregion(address_space_mem, sdram_base, phys_sdram);
+    memory_region_add_subregion(address_space_mem, sdram_base, machine->ram);
 
     dinfo = drive_get(IF_PFLASH, 0, 0);
     /* Numonyx JS28F256J3F105 */
@@ -183,7 +186,7 @@ milkymist_init(MachineState *machine)
 
         if (kernel_size < 0) {
             kernel_size = load_image_targphys(kernel_filename, sdram_base,
-                                              sdram_size);
+                                              machine->ram_size);
             reset_info->bootstrap_pc = sdram_base;
         }
 
@@ -216,6 +219,8 @@ static void milkymist_machine_init(MachineClass *mc)
     mc->init = milkymist_init;
     mc->is_default = 0;
     mc->default_cpu_type = LM32_CPU_TYPE_NAME("lm32-full");
+    mc->default_ram_size = 128 * MiB;
+    mc->default_ram_id = "milkymist.sdram";
 }
 
 DEFINE_MACHINE("milkymist", milkymist_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 49/86] m68k:an5206: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (47 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 48/86] lm32:milkymist: " Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2020-01-07 16:11   ` Thomas Huth
  2019-12-31 13:03 ` [PATCH 50/86] m68k:mcf5208: " Igor Mammedov
                   ` (37 subsequent siblings)
  86 siblings, 1 reply; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/m68k/an5206.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/hw/m68k/an5206.c b/hw/m68k/an5206.c
index 54ccbe1..69a8ffa 100644
--- a/hw/m68k/an5206.c
+++ b/hw/m68k/an5206.c
@@ -33,7 +33,6 @@ static void an5206_init(MachineState *machine)
     uint64_t elf_entry;
     hwaddr entry;
     MemoryRegion *address_space_mem = get_system_memory();
-    MemoryRegion *ram = g_new(MemoryRegion, 1);
     MemoryRegion *sram = g_new(MemoryRegion, 1);
 
     cpu = M68K_CPU(cpu_create(machine->cpu_type));
@@ -46,8 +45,7 @@ static void an5206_init(MachineState *machine)
     env->rambar0 = AN5206_RAMBAR_ADDR | 1;
 
     /* DRAM at address zero */
-    memory_region_allocate_system_memory(ram, NULL, "an5206.ram", ram_size);
-    memory_region_add_subregion(address_space_mem, 0, ram);
+    memory_region_add_subregion(address_space_mem, 0, machine->ram);
 
     /* Internal SRAM.  */
     memory_region_init_ram(sram, NULL, "an5206.sram", 512, &error_fatal);
@@ -89,6 +87,7 @@ static void an5206_machine_init(MachineClass *mc)
     mc->desc = "Arnewsh 5206";
     mc->init = an5206_init;
     mc->default_cpu_type = M68K_CPU_TYPE_NAME("m5206");
+    mc->default_ram_id = "an5206.ram";
 }
 
 DEFINE_MACHINE("an5206", an5206_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 50/86] m68k:mcf5208: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (48 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 49/86] m68k:an5206: " Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2020-01-07 16:11   ` Thomas Huth
  2019-12-31 13:03 ` [PATCH 51/86] m68k:next-cube: " Igor Mammedov
                   ` (36 subsequent siblings)
  86 siblings, 1 reply; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/m68k/mcf5208.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/hw/m68k/mcf5208.c b/hw/m68k/mcf5208.c
index 158c5e4..d050cb7 100644
--- a/hw/m68k/mcf5208.c
+++ b/hw/m68k/mcf5208.c
@@ -234,7 +234,6 @@ static void mcf5208evb_init(MachineState *machine)
     qemu_irq *pic;
     MemoryRegion *address_space_mem = get_system_memory();
     MemoryRegion *rom = g_new(MemoryRegion, 1);
-    MemoryRegion *ram = g_new(MemoryRegion, 1);
     MemoryRegion *sram = g_new(MemoryRegion, 1);
 
     cpu = M68K_CPU(cpu_create(machine->cpu_type));
@@ -249,8 +248,7 @@ static void mcf5208evb_init(MachineState *machine)
     memory_region_add_subregion(address_space_mem, 0x00000000, rom);
 
     /* DRAM at 0x40000000 */
-    memory_region_allocate_system_memory(ram, NULL, "mcf5208.ram", ram_size);
-    memory_region_add_subregion(address_space_mem, 0x40000000, ram);
+    memory_region_add_subregion(address_space_mem, 0x40000000, machine->ram);
 
     /* Internal SRAM.  */
     memory_region_init_ram(sram, NULL, "mcf5208.sram", 16 * KiB, &error_fatal);
@@ -354,6 +352,7 @@ static void mcf5208evb_machine_init(MachineClass *mc)
     mc->init = mcf5208evb_init;
     mc->is_default = 1;
     mc->default_cpu_type = M68K_CPU_TYPE_NAME("m5208");
+    mc->default_ram_id = "mcf5208.ram";
 }
 
 DEFINE_MACHINE("mcf5208evb", mcf5208evb_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 51/86] m68k:next-cube: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (49 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 50/86] m68k:mcf5208: " Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2020-01-07 16:12   ` Thomas Huth
  2019-12-31 13:03 ` [PATCH 52/86] mips:boston-cube: " Igor Mammedov
                   ` (35 subsequent siblings)
  86 siblings, 1 reply; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/m68k/next-cube.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/hw/m68k/next-cube.c b/hw/m68k/next-cube.c
index e534334..cd93d9e 100644
--- a/hw/m68k/next-cube.c
+++ b/hw/m68k/next-cube.c
@@ -860,7 +860,6 @@ static void next_cube_init(MachineState *machine)
 {
     M68kCPU *cpu;
     CPUM68KState *env;
-    MemoryRegion *ram = g_new(MemoryRegion, 1);
     MemoryRegion *rom = g_new(MemoryRegion, 1);
     MemoryRegion *mmiomem = g_new(MemoryRegion, 1);
     MemoryRegion *scrmem = g_new(MemoryRegion, 1);
@@ -893,8 +892,7 @@ static void next_cube_init(MachineState *machine)
     memcpy(ns->rtc.ram, rtc_ram2, 32);
 
     /* 64MB RAM starting at 0x04000000  */
-    memory_region_allocate_system_memory(ram, NULL, "next.ram", ram_size);
-    memory_region_add_subregion(sysmem, 0x04000000, ram);
+    memory_region_add_subregion(sysmem, 0x04000000, machine->ram);
 
     /* Framebuffer */
     dev = qdev_create(NULL, TYPE_NEXTFB);
@@ -967,6 +965,7 @@ static void next_machine_class_init(ObjectClass *oc, void *data)
     mc->desc = "NeXT Cube";
     mc->init = next_cube_init;
     mc->default_ram_size = RAM_SIZE;
+    mc->default_ram_id = "next.ram";
     mc->default_cpu_type = M68K_CPU_TYPE_NAME("m68040");
 }
 
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 52/86] mips:boston-cube: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (50 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 51/86] m68k:next-cube: " Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 16:08   ` Philippe Mathieu-Daudé
  2019-12-31 13:03 ` [PATCH 53/86] mips:mips_fulong2e: drop RAM size fixup Igor Mammedov
                   ` (34 subsequent siblings)
  86 siblings, 1 reply; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/mips/boston.c | 11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/hw/mips/boston.c b/hw/mips/boston.c
index ca7d813..466054e 100644
--- a/hw/mips/boston.c
+++ b/hw/mips/boston.c
@@ -427,7 +427,7 @@ static void boston_mach_init(MachineState *machine)
     DeviceState *dev;
     BostonState *s;
     Error *err = NULL;
-    MemoryRegion *flash, *ddr, *ddr_low_alias, *lcd, *platreg;
+    MemoryRegion *flash, *ddr_low_alias, *lcd, *platreg;
     MemoryRegion *sys_mem = get_system_memory();
     XilinxPCIEHost *pcie2;
     PCIDevice *ahci;
@@ -473,14 +473,12 @@ static void boston_mach_init(MachineState *machine)
     memory_region_init_rom(flash, NULL, "boston.flash", 128 * MiB, &err);
     memory_region_add_subregion_overlap(sys_mem, 0x18000000, flash, 0);
 
-    ddr = g_new(MemoryRegion, 1);
-    memory_region_allocate_system_memory(ddr, NULL, "boston.ddr",
-                                         machine->ram_size);
-    memory_region_add_subregion_overlap(sys_mem, 0x80000000, ddr, 0);
+    memory_region_add_subregion_overlap(sys_mem, 0x80000000, machine->ram, 0);
 
     ddr_low_alias = g_new(MemoryRegion, 1);
     memory_region_init_alias(ddr_low_alias, NULL, "boston_low.ddr",
-                             ddr, 0, MIN(machine->ram_size, (256 * MiB)));
+                             machine->ram, 0,
+                             MIN(machine->ram_size, (256 * MiB)));
     memory_region_add_subregion_overlap(sys_mem, 0, ddr_low_alias, 0);
 
     xilinx_pcie_init(sys_mem, 0,
@@ -552,6 +550,7 @@ static void boston_mach_class_init(MachineClass *mc)
     mc->init = boston_mach_init;
     mc->block_default_type = IF_IDE;
     mc->default_ram_size = 1 * GiB;
+    mc->default_ram_id = "boston.ddr";
     mc->max_cpus = 16;
     mc->default_cpu_type = MIPS_CPU_TYPE_NAME("I6400");
 }
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 53/86] mips:mips_fulong2e: drop RAM size fixup
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (51 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 52/86] mips:boston-cube: " Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 13:03 ` [PATCH 54/86] mips:mips_fulong2e: use memdev for RAM Igor Mammedov
                   ` (33 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

If user provided non-sense RAM size, board will complain and
continue running with max RAM size supported.
Also RAM is going to be allocated by generic code, so it won't be
possible for board to fix things up for user.

Make it error message and exit to force user fix CLI,
instead of accepting non-sense CLI values.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/mips/mips_fulong2e.c | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/hw/mips/mips_fulong2e.c b/hw/mips/mips_fulong2e.c
index 9eaa6e2..4a5e5b4 100644
--- a/hw/mips/mips_fulong2e.c
+++ b/hw/mips/mips_fulong2e.c
@@ -296,7 +296,6 @@ static void mips_fulong2e_init(MachineState *machine)
     MemoryRegion *address_space_mem = get_system_memory();
     MemoryRegion *ram = g_new(MemoryRegion, 1);
     MemoryRegion *bios = g_new(MemoryRegion, 1);
-    ram_addr_t ram_size = machine->ram_size;
     long bios_size;
     uint8_t *spd_data;
     Error *err = NULL;
@@ -315,10 +314,14 @@ static void mips_fulong2e_init(MachineState *machine)
     qemu_register_reset(main_cpu_reset, cpu);
 
     /* TODO: support more than 256M RAM as highmem */
-    ram_size = 256 * MiB;
+    if (machine->ram_size != 256 * MiB) {
+        error_report("Invalid RAM size, should be %ld", 256 * MiB);
+        exit(EXIT_FAILURE);
+    }
 
     /* allocate RAM */
-    memory_region_allocate_system_memory(ram, NULL, "fulong2e.ram", ram_size);
+    memory_region_allocate_system_memory(ram, NULL, "fulong2e.ram",
+                                         machine->ram_size);
     memory_region_init_ram(bios, NULL, "fulong2e.bios", BIOS_SIZE,
                            &error_fatal);
     memory_region_set_readonly(bios, true);
@@ -332,7 +335,7 @@ static void mips_fulong2e_init(MachineState *machine)
      */
 
     if (kernel_filename) {
-        loaderparams.ram_size = ram_size;
+        loaderparams.ram_size = machine->ram_size;
         loaderparams.kernel_filename = kernel_filename;
         loaderparams.kernel_cmdline = kernel_cmdline;
         loaderparams.initrd_filename = initrd_filename;
@@ -378,7 +381,7 @@ static void mips_fulong2e_init(MachineState *machine)
     }
 
     /* Populate SPD eeprom data */
-    spd_data = spd_data_generate(DDR, ram_size, &err);
+    spd_data = spd_data_generate(DDR, machine->ram_size, &err);
     if (err) {
         warn_report_err(err);
     }
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 54/86] mips:mips_fulong2e: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (52 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 53/86] mips:mips_fulong2e: drop RAM size fixup Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 13:03 ` [PATCH 55/86] mips:mips_jazz: " Igor Mammedov
                   ` (32 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/mips/mips_fulong2e.c | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/hw/mips/mips_fulong2e.c b/hw/mips/mips_fulong2e.c
index 4a5e5b4..f3fe68a 100644
--- a/hw/mips/mips_fulong2e.c
+++ b/hw/mips/mips_fulong2e.c
@@ -294,7 +294,6 @@ static void mips_fulong2e_init(MachineState *machine)
     const char *initrd_filename = machine->initrd_filename;
     char *filename;
     MemoryRegion *address_space_mem = get_system_memory();
-    MemoryRegion *ram = g_new(MemoryRegion, 1);
     MemoryRegion *bios = g_new(MemoryRegion, 1);
     long bios_size;
     uint8_t *spd_data;
@@ -320,13 +319,11 @@ static void mips_fulong2e_init(MachineState *machine)
     }
 
     /* allocate RAM */
-    memory_region_allocate_system_memory(ram, NULL, "fulong2e.ram",
-                                         machine->ram_size);
     memory_region_init_ram(bios, NULL, "fulong2e.bios", BIOS_SIZE,
                            &error_fatal);
     memory_region_set_readonly(bios, true);
 
-    memory_region_add_subregion(address_space_mem, 0, ram);
+    memory_region_add_subregion(address_space_mem, 0, machine->ram);
     memory_region_add_subregion(address_space_mem, 0x1fc00000LL, bios);
 
     /*
@@ -402,6 +399,7 @@ static void mips_fulong2e_machine_init(MachineClass *mc)
     mc->block_default_type = IF_IDE;
     mc->default_cpu_type = MIPS_CPU_TYPE_NAME("Loongson-2E");
     mc->default_ram_size = 256 * MiB;
+    mc->default_ram_id = "fulong2e.ram";
 }
 
 DEFINE_MACHINE("fulong2e", mips_fulong2e_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 55/86] mips:mips_jazz: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (53 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 54/86] mips:mips_fulong2e: use memdev for RAM Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 16:06   ` Philippe Mathieu-Daudé
  2019-12-31 13:03 ` [PATCH 56/86] mips:mips_malta: " Igor Mammedov
                   ` (31 subsequent siblings)
  86 siblings, 1 reply; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/mips/mips_jazz.c | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/hw/mips/mips_jazz.c b/hw/mips/mips_jazz.c
index 291fd6c..5136388 100644
--- a/hw/mips/mips_jazz.c
+++ b/hw/mips/mips_jazz.c
@@ -159,7 +159,6 @@ static void mips_jazz_init(MachineState *machine,
     ISABus *isa_bus;
     ISADevice *pit;
     DriveInfo *fds[MAX_FD];
-    MemoryRegion *ram = g_new(MemoryRegion, 1);
     MemoryRegion *bios = g_new(MemoryRegion, 1);
     MemoryRegion *bios2 = g_new(MemoryRegion, 1);
     SysBusESPState *sysbus_esp;
@@ -191,9 +190,7 @@ static void mips_jazz_init(MachineState *machine,
     cc->do_transaction_failed = mips_jazz_do_transaction_failed;
 
     /* allocate RAM */
-    memory_region_allocate_system_memory(ram, NULL, "mips_jazz.ram",
-                                         machine->ram_size);
-    memory_region_add_subregion(address_space, 0, ram);
+    memory_region_add_subregion(address_space, 0, machine->ram);
 
     memory_region_init_ram(bios, NULL, "mips_jazz.bios", MAGNUM_BIOS_SIZE,
                            &error_fatal);
@@ -392,6 +389,7 @@ static void mips_magnum_class_init(ObjectClass *oc, void *data)
     mc->init = mips_magnum_init;
     mc->block_default_type = IF_SCSI;
     mc->default_cpu_type = MIPS_CPU_TYPE_NAME("R4000");
+    mc->default_ram_id = "mips_jazz.ram";
 }
 
 static const TypeInfo mips_magnum_type = {
@@ -408,6 +406,7 @@ static void mips_pica61_class_init(ObjectClass *oc, void *data)
     mc->init = mips_pica61_init;
     mc->block_default_type = IF_SCSI;
     mc->default_cpu_type = MIPS_CPU_TYPE_NAME("R4000");
+    mc->default_ram_id = "mips_jazz.ram";
 }
 
 static const TypeInfo mips_pica61_type = {
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 56/86] mips:mips_malta: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (54 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 55/86] mips:mips_jazz: " Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 16:07   ` Philippe Mathieu-Daudé
  2019-12-31 13:03 ` [PATCH 57/86] mips:mips_mipssim: " Igor Mammedov
                   ` (30 subsequent siblings)
  86 siblings, 1 reply; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/mips/mips_malta.c | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)

diff --git a/hw/mips/mips_malta.c b/hw/mips/mips_malta.c
index 783cd99..adffa3a 100644
--- a/hw/mips/mips_malta.c
+++ b/hw/mips/mips_malta.c
@@ -1223,7 +1223,6 @@ void mips_malta_init(MachineState *machine)
     char *filename;
     PFlashCFI01 *fl;
     MemoryRegion *system_memory = get_system_memory();
-    MemoryRegion *ram_high = g_new(MemoryRegion, 1);
     MemoryRegion *ram_low_preio = g_new(MemoryRegion, 1);
     MemoryRegion *ram_low_postio;
     MemoryRegion *bios, *bios_copy = g_new(MemoryRegion, 1);
@@ -1261,13 +1260,11 @@ void mips_malta_init(MachineState *machine)
     }
 
     /* register RAM at high address where it is undisturbed by IO */
-    memory_region_allocate_system_memory(ram_high, NULL, "mips_malta.ram",
-                                         ram_size);
-    memory_region_add_subregion(system_memory, 0x80000000, ram_high);
+    memory_region_add_subregion(system_memory, 0x80000000, machine->ram);
 
     /* alias for pre IO hole access */
     memory_region_init_alias(ram_low_preio, NULL, "mips_malta_low_preio.ram",
-                             ram_high, 0, MIN(ram_size, 256 * MiB));
+                             machine->ram, 0, MIN(ram_size, 256 * MiB));
     memory_region_add_subregion(system_memory, 0, ram_low_preio);
 
     /* alias for post IO hole access, if there is enough RAM */
@@ -1275,7 +1272,7 @@ void mips_malta_init(MachineState *machine)
         ram_low_postio = g_new(MemoryRegion, 1);
         memory_region_init_alias(ram_low_postio, NULL,
                                  "mips_malta_low_postio.ram",
-                                 ram_high, 512 * MiB,
+                                 machine->ram, 512 * MiB,
                                  ram_size - 512 * MiB);
         memory_region_add_subregion(system_memory, 512 * MiB,
                                     ram_low_postio);
@@ -1447,6 +1444,7 @@ static void mips_malta_machine_init(MachineClass *mc)
 #else
     mc->default_cpu_type = MIPS_CPU_TYPE_NAME("24Kf");
 #endif
+    mc->default_ram_id = "mips_malta.ram";
 }
 
 DEFINE_MACHINE("malta", mips_malta_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 57/86] mips:mips_mipssim: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (55 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 56/86] mips:mips_malta: " Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 16:07   ` Philippe Mathieu-Daudé
  2019-12-31 13:03 ` [PATCH 58/86] mips:mips_r4k: " Igor Mammedov
                   ` (29 subsequent siblings)
  86 siblings, 1 reply; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/mips/mips_mipssim.c | 9 +++------
 1 file changed, 3 insertions(+), 6 deletions(-)

diff --git a/hw/mips/mips_mipssim.c b/hw/mips/mips_mipssim.c
index 282bbec..be3972f 100644
--- a/hw/mips/mips_mipssim.c
+++ b/hw/mips/mips_mipssim.c
@@ -142,14 +142,12 @@ static void mipsnet_init(int base, qemu_irq irq, NICInfo *nd)
 static void
 mips_mipssim_init(MachineState *machine)
 {
-    ram_addr_t ram_size = machine->ram_size;
     const char *kernel_filename = machine->kernel_filename;
     const char *kernel_cmdline = machine->kernel_cmdline;
     const char *initrd_filename = machine->initrd_filename;
     char *filename;
     MemoryRegion *address_space_mem = get_system_memory();
     MemoryRegion *isa = g_new(MemoryRegion, 1);
-    MemoryRegion *ram = g_new(MemoryRegion, 1);
     MemoryRegion *bios = g_new(MemoryRegion, 1);
     MIPSCPU *cpu;
     CPUMIPSState *env;
@@ -166,13 +164,11 @@ mips_mipssim_init(MachineState *machine)
     qemu_register_reset(main_cpu_reset, reset_info);
 
     /* Allocate RAM. */
-    memory_region_allocate_system_memory(ram, NULL, "mips_mipssim.ram",
-                                         ram_size);
     memory_region_init_ram(bios, NULL, "mips_mipssim.bios", BIOS_SIZE,
                            &error_fatal);
     memory_region_set_readonly(bios, true);
 
-    memory_region_add_subregion(address_space_mem, 0, ram);
+    memory_region_add_subregion(address_space_mem, 0, machine->ram);
 
     /* Map the BIOS / boot exception handler. */
     memory_region_add_subregion(address_space_mem, 0x1fc00000LL, bios);
@@ -199,7 +195,7 @@ mips_mipssim_init(MachineState *machine)
     }
 
     if (kernel_filename) {
-        loaderparams.ram_size = ram_size;
+        loaderparams.ram_size = machine->ram_size;
         loaderparams.kernel_filename = kernel_filename;
         loaderparams.kernel_cmdline = kernel_cmdline;
         loaderparams.initrd_filename = initrd_filename;
@@ -237,6 +233,7 @@ static void mips_mipssim_machine_init(MachineClass *mc)
 #else
     mc->default_cpu_type = MIPS_CPU_TYPE_NAME("24Kf");
 #endif
+    mc->default_ram_id = "mips_mipssim.ram";
 }
 
 DEFINE_MACHINE("mipssim", mips_mipssim_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 58/86] mips:mips_r4k: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (56 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 57/86] mips:mips_mipssim: " Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 16:08   ` Philippe Mathieu-Daudé
  2019-12-31 13:03 ` [PATCH 59/86] ppc:e500: drop RAM size fixup Igor Mammedov
                   ` (28 subsequent siblings)
  86 siblings, 1 reply; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/mips/mips_r4k.c | 12 ++++--------
 1 file changed, 4 insertions(+), 8 deletions(-)

diff --git a/hw/mips/mips_r4k.c b/hw/mips/mips_r4k.c
index fd926a3..69b6549 100644
--- a/hw/mips/mips_r4k.c
+++ b/hw/mips/mips_r4k.c
@@ -171,13 +171,11 @@ static const int sector_len = 32 * KiB;
 static
 void mips_r4k_init(MachineState *machine)
 {
-    ram_addr_t ram_size = machine->ram_size;
     const char *kernel_filename = machine->kernel_filename;
     const char *kernel_cmdline = machine->kernel_cmdline;
     const char *initrd_filename = machine->initrd_filename;
     char *filename;
     MemoryRegion *address_space_mem = get_system_memory();
-    MemoryRegion *ram = g_new(MemoryRegion, 1);
     MemoryRegion *bios;
     MemoryRegion *iomem = g_new(MemoryRegion, 1);
     MemoryRegion *isa_io = g_new(MemoryRegion, 1);
@@ -203,14 +201,12 @@ void mips_r4k_init(MachineState *machine)
     qemu_register_reset(main_cpu_reset, reset_info);
 
     /* allocate RAM */
-    if (ram_size > 256 * MiB) {
+    if (machine->ram_size > 256 * MiB) {
         error_report("Too much memory for this machine: %" PRId64 "MB,"
                      " maximum 256MB", ram_size / MiB);
         exit(1);
     }
-    memory_region_allocate_system_memory(ram, NULL, "mips_r4k.ram", ram_size);
-
-    memory_region_add_subregion(address_space_mem, 0, ram);
+    memory_region_add_subregion(address_space_mem, 0, machine->ram);
 
     memory_region_init_io(iomem, NULL, &mips_qemu_ops,
                           NULL, "mips-qemu", 0x10000);
@@ -261,7 +257,7 @@ void mips_r4k_init(MachineState *machine)
     g_free(filename);
 
     if (kernel_filename) {
-        loaderparams.ram_size = ram_size;
+        loaderparams.ram_size = machine->ram_size;
         loaderparams.kernel_filename = kernel_filename;
         loaderparams.kernel_cmdline = kernel_cmdline;
         loaderparams.initrd_filename = initrd_filename;
@@ -316,7 +312,7 @@ static void mips_machine_init(MachineClass *mc)
 #else
     mc->default_cpu_type = MIPS_CPU_TYPE_NAME("24Kf");
 #endif
-
+    mc->default_ram_id = "mips_r4k.ram";
 }
 
 DEFINE_MACHINE("mips", mips_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 59/86] ppc:e500: drop RAM size fixup
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (57 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 58/86] mips:mips_r4k: " Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 13:03 ` [PATCH 60/86] ppc:e500: use memdev for RAM Igor Mammedov
                   ` (27 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

If user provided non-sense RAM size, board will complain and
continue running with max RAM size supported.
Also RAM is going to be allocated by generic code, so it won't be
possible for board to fix things up for user.

Make it error message and exit to force user fix CLI,
instead of accepting non-sense CLI values.

While at it, replace usage of global ram_size with
machine->ram_size

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/ppc/e500.c | 16 +++++++++-------
 1 file changed, 9 insertions(+), 7 deletions(-)

diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c
index 12b6a5b..aac4aba 100644
--- a/hw/ppc/e500.c
+++ b/hw/ppc/e500.c
@@ -906,12 +906,14 @@ void ppce500_init(MachineState *machine)
 
     env = firstenv;
 
-    /* Fixup Memory size on a alignment boundary */
-    ram_size &= ~(RAM_SIZES_ALIGN - 1);
-    machine->ram_size = ram_size;
+    if (!QEMU_IS_ALIGNED(machine->ram_size, RAM_SIZES_ALIGN)) {
+        error_report("RAM size must be multiple of %ld", RAM_SIZES_ALIGN);
+        exit(EXIT_FAILURE);
+    }
 
     /* Register Memory */
-    memory_region_allocate_system_memory(ram, NULL, "mpc8544ds.ram", ram_size);
+    memory_region_allocate_system_memory(ram, NULL, "mpc8544ds.ram",
+                                         machine->ram_size);
     memory_region_add_subregion(address_space_mem, 0, ram);
 
     dev = qdev_create(NULL, "e500-ccsr");
@@ -1083,7 +1085,7 @@ void ppce500_init(MachineState *machine)
         kernel_base = cur_base;
         kernel_size = load_image_targphys(machine->kernel_filename,
                                           cur_base,
-                                          ram_size - cur_base);
+                                          machine->ram_size - cur_base);
         if (kernel_size < 0) {
             error_report("could not load kernel '%s'",
                          machine->kernel_filename);
@@ -1097,7 +1099,7 @@ void ppce500_init(MachineState *machine)
     if (machine->initrd_filename) {
         initrd_base = (cur_base + INITRD_LOAD_PAD) & ~INITRD_PAD_MASK;
         initrd_size = load_image_targphys(machine->initrd_filename, initrd_base,
-                                          ram_size - initrd_base);
+                                          machine->ram_size - initrd_base);
 
         if (initrd_size < 0) {
             error_report("could not load initial ram disk '%s'",
@@ -1115,7 +1117,7 @@ void ppce500_init(MachineState *machine)
      * ensures enough space between kernel and initrd.
      */
     dt_base = (loadaddr + payload_size + DTC_LOAD_PAD) & ~DTC_PAD_MASK;
-    if (dt_base + DTB_MAX_SIZE > ram_size) {
+    if (dt_base + DTB_MAX_SIZE > machine->ram_size) {
             error_report("not enough memory for device tree");
             exit(1);
     }
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 60/86] ppc:e500: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (58 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 59/86] ppc:e500: drop RAM size fixup Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 13:03 ` [PATCH 61/86] ppc:mac_newworld: " Igor Mammedov
                   ` (26 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/ppc/e500.c      | 5 +----
 hw/ppc/e500plat.c  | 1 +
 hw/ppc/mpc8544ds.c | 1 +
 3 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c
index aac4aba..432feae 100644
--- a/hw/ppc/e500.c
+++ b/hw/ppc/e500.c
@@ -831,7 +831,6 @@ static void ppce500_power_off(void *opaque, int line, int on)
 void ppce500_init(MachineState *machine)
 {
     MemoryRegion *address_space_mem = get_system_memory();
-    MemoryRegion *ram = g_new(MemoryRegion, 1);
     PPCE500MachineState *pms = PPCE500_MACHINE(machine);
     const PPCE500MachineClass *pmc = PPCE500_MACHINE_GET_CLASS(machine);
     PCIBus *pci_bus;
@@ -912,9 +911,7 @@ void ppce500_init(MachineState *machine)
     }
 
     /* Register Memory */
-    memory_region_allocate_system_memory(ram, NULL, "mpc8544ds.ram",
-                                         machine->ram_size);
-    memory_region_add_subregion(address_space_mem, 0, ram);
+    memory_region_add_subregion(address_space_mem, 0, machine->ram);
 
     dev = qdev_create(NULL, "e500-ccsr");
     object_property_add_child(qdev_get_machine(), "e500-ccsr",
diff --git a/hw/ppc/e500plat.c b/hw/ppc/e500plat.c
index 7078386..bddd5e7 100644
--- a/hw/ppc/e500plat.c
+++ b/hw/ppc/e500plat.c
@@ -97,6 +97,7 @@ static void e500plat_machine_class_init(ObjectClass *oc, void *data)
     mc->init = e500plat_init;
     mc->max_cpus = 32;
     mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("e500v2_v30");
+    mc->default_ram_id = "mpc8544ds.ram";
     machine_class_allow_dynamic_sysbus_dev(mc, TYPE_ETSEC_COMMON);
  }
 
diff --git a/hw/ppc/mpc8544ds.c b/hw/ppc/mpc8544ds.c
index c2c5e11..8117750 100644
--- a/hw/ppc/mpc8544ds.c
+++ b/hw/ppc/mpc8544ds.c
@@ -55,6 +55,7 @@ static void e500plat_machine_class_init(ObjectClass *oc, void *data)
     mc->init = mpc8544ds_init;
     mc->max_cpus = 15;
     mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("e500v2_v30");
+    mc->default_ram_id = "mpc8544ds.ram";
 }
 
 #define TYPE_MPC8544DS_MACHINE  MACHINE_TYPE_NAME("mpc8544ds")
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 61/86] ppc:mac_newworld: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (59 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 60/86] ppc:e500: use memdev for RAM Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 13:03 ` [PATCH 62/86] ppc:mac_oldworld: " Igor Mammedov
                   ` (25 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/ppc/mac_newworld.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/hw/ppc/mac_newworld.c b/hw/ppc/mac_newworld.c
index 3594517..2546d33 100644
--- a/hw/ppc/mac_newworld.c
+++ b/hw/ppc/mac_newworld.c
@@ -118,7 +118,7 @@ static void ppc_core99_init(MachineState *machine)
     char *filename;
     IrqLines *openpic_irqs;
     int linux_boot, i, j, k;
-    MemoryRegion *ram = g_new(MemoryRegion, 1), *bios = g_new(MemoryRegion, 1);
+    MemoryRegion *bios = g_new(MemoryRegion, 1);
     hwaddr kernel_base, initrd_base, cmdline_base = 0;
     long kernel_size, initrd_size;
     UNINHostState *uninorth_pci;
@@ -152,8 +152,7 @@ static void ppc_core99_init(MachineState *machine)
     }
 
     /* allocate RAM */
-    memory_region_allocate_system_memory(ram, NULL, "ppc_core99.ram", ram_size);
-    memory_region_add_subregion(get_system_memory(), 0, ram);
+    memory_region_add_subregion(get_system_memory(), 0, machine->ram);
 
     /* allocate and load BIOS */
     memory_region_init_ram(bios, NULL, "ppc_core99.bios", BIOS_SIZE,
@@ -586,6 +585,7 @@ static void core99_machine_class_init(ObjectClass *oc, void *data)
 #else
     mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("7400_v2.9");
 #endif
+    mc->default_ram_id = "ppc_core99.ram";
     mc->ignore_boot_device_suffixes = true;
     fwc->get_dev_path = core99_fw_dev_path;
 }
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 62/86] ppc:mac_oldworld: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (60 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 61/86] ppc:mac_newworld: " Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 13:03 ` [PATCH 63/86] ppc:pnv: " Igor Mammedov
                   ` (24 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/ppc/mac_oldworld.c | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/hw/ppc/mac_oldworld.c b/hw/ppc/mac_oldworld.c
index 0fa680b..2be0602 100644
--- a/hw/ppc/mac_oldworld.c
+++ b/hw/ppc/mac_oldworld.c
@@ -91,7 +91,6 @@ static void ppc_heathrow_init(MachineState *machine)
     CPUPPCState *env = NULL;
     char *filename;
     int linux_boot, i;
-    MemoryRegion *ram = g_new(MemoryRegion, 1);
     MemoryRegion *bios = g_new(MemoryRegion, 1);
     uint32_t kernel_base, initrd_base, cmdline_base = 0;
     int32_t kernel_size, initrd_size;
@@ -127,9 +126,7 @@ static void ppc_heathrow_init(MachineState *machine)
         exit(1);
     }
 
-    memory_region_allocate_system_memory(ram, NULL, "ppc_heathrow.ram",
-                                         ram_size);
-    memory_region_add_subregion(sysmem, 0, ram);
+    memory_region_add_subregion(sysmem, 0, machine->ram);
 
     /* allocate and load BIOS */
     memory_region_init_ram(bios, NULL, "ppc_heathrow.bios", BIOS_SIZE,
@@ -446,6 +443,7 @@ static void heathrow_class_init(ObjectClass *oc, void *data)
     mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("750_v3.1");
     mc->default_display = "std";
     mc->ignore_boot_device_suffixes = true;
+    mc->default_ram_id = "ppc_heathrow.ram";
     fwc->get_dev_path = heathrow_fw_dev_path;
 }
 
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 63/86] ppc:pnv: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (61 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 62/86] ppc:mac_oldworld: " Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 13:03 ` [PATCH 64/86] ppc:ppc405_boards: add RAM size checks Igor Mammedov
                   ` (23 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/ppc/pnv.c | 8 ++------
 1 file changed, 2 insertions(+), 6 deletions(-)

diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
index f77e7ca..8eaa7de 100644
--- a/hw/ppc/pnv.c
+++ b/hw/ppc/pnv.c
@@ -676,7 +676,6 @@ static void pnv_init(MachineState *machine)
 {
     PnvMachineState *pnv = PNV_MACHINE(machine);
     MachineClass *mc = MACHINE_GET_CLASS(machine);
-    MemoryRegion *ram;
     char *fw_filename;
     long fw_size;
     int i;
@@ -688,11 +687,7 @@ static void pnv_init(MachineState *machine)
     if (machine->ram_size < (1 * GiB)) {
         warn_report("skiboot may not work with < 1GB of RAM");
     }
-
-    ram = g_new(MemoryRegion, 1);
-    memory_region_allocate_system_memory(ram, NULL, "pnv.ram",
-                                         machine->ram_size);
-    memory_region_add_subregion(get_system_memory(), 0, ram);
+    memory_region_add_subregion(get_system_memory(), 0, machine->ram);
 
     /*
      * Create our simple PNOR device
@@ -1811,6 +1806,7 @@ static void pnv_machine_class_init(ObjectClass *oc, void *data)
      * enough to fit the maximum initrd size at it's load address
      */
     mc->default_ram_size = INITRD_LOAD_ADDR + INITRD_MAX_SIZE;
+    mc->default_ram_id = "pnv.ram";
     ispc->print_info = pnv_pic_print_info;
 
     pnv_machine_class_props_init(oc);
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 64/86] ppc:ppc405_boards: add RAM size checks
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (62 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 63/86] ppc:pnv: " Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 13:03 ` [PATCH 65/86] ppc:ppc405_boards: use memdev for RAM Igor Mammedov
                   ` (22 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

If user provided non-sense RAM size, board will ignore it
and continue running with fixed RAM size.

Also RAM is going to be allocated by generic code, so it
won't be possible for board to fix CLI.

Make it error message and exit to force user fix CLI,
instead of accepting non-sense CLI values.

PS:
move fixed RAM size into mc->default_ram_size, so that
generic code will know how much to allocate.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/ppc/ppc405_boards.c | 36 +++++++++++++++++++++++-------------
 1 file changed, 23 insertions(+), 13 deletions(-)

diff --git a/hw/ppc/ppc405_boards.c b/hw/ppc/ppc405_boards.c
index 1f721fe..41aebbc 100644
--- a/hw/ppc/ppc405_boards.c
+++ b/hw/ppc/ppc405_boards.c
@@ -137,7 +137,7 @@ static void ref405ep_fpga_init(MemoryRegion *sysmem, uint32_t base)
 
 static void ref405ep_init(MachineState *machine)
 {
-    ram_addr_t ram_size = machine->ram_size;
+    MachineClass *mc = MACHINE_GET_CLASS(machine);
     const char *kernel_filename = machine->kernel_filename;
     const char *kernel_cmdline = machine->kernel_cmdline;
     const char *initrd_filename = machine->initrd_filename;
@@ -161,15 +161,20 @@ static void ref405ep_init(MachineState *machine)
     DriveInfo *dinfo;
     MemoryRegion *sysmem = get_system_memory();
 
+    if (machine->ram_size != mc->default_ram_size) {
+        error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
+                     mc->default_ram_size);
+        exit(EXIT_FAILURE);
+    }
+
     /* XXX: fix this */
     memory_region_allocate_system_memory(&ram_memories[0], NULL, "ef405ep.ram",
-                                         0x08000000);
+                                         machine->ram_size);
     ram_bases[0] = 0;
-    ram_sizes[0] = 0x08000000;
+    ram_sizes[0] = machine->ram_size;
     memory_region_init(&ram_memories[1], NULL, "ef405ep.ram1", 0);
     ram_bases[1] = 0x00000000;
     ram_sizes[1] = 0x00000000;
-    ram_size = 128 * MiB;
     env = ppc405ep_init(sysmem, ram_memories, ram_bases, ram_sizes,
                         33333333, &pic, kernel_filename == NULL ? 0 : 1);
     /* allocate SRAM */
@@ -227,7 +232,7 @@ static void ref405ep_init(MachineState *machine)
     if (linux_boot) {
         memset(&bd, 0, sizeof(bd));
         bd.bi_memstart = 0x00000000;
-        bd.bi_memsize = ram_size;
+        bd.bi_memsize = machine->ram_size;
         bd.bi_flashstart = -bios_size;
         bd.bi_flashsize = -bios_size;
         bd.bi_flashoffset = 0;
@@ -255,7 +260,7 @@ static void ref405ep_init(MachineState *machine)
         kernel_base = KERNEL_LOAD_ADDR;
         /* now we can load the kernel */
         kernel_size = load_image_targphys(kernel_filename, kernel_base,
-                                          ram_size - kernel_base);
+                                          machine->ram_size - kernel_base);
         if (kernel_size < 0) {
             error_report("could not load kernel '%s'", kernel_filename);
             exit(1);
@@ -266,7 +271,7 @@ static void ref405ep_init(MachineState *machine)
         if (initrd_filename) {
             initrd_base = INITRD_LOAD_ADDR;
             initrd_size = load_image_targphys(initrd_filename, initrd_base,
-                                              ram_size - initrd_base);
+                                              machine->ram_size - initrd_base);
             if (initrd_size < 0) {
                 error_report("could not load initial ram disk '%s'",
                              initrd_filename);
@@ -304,6 +309,7 @@ static void ref405ep_class_init(ObjectClass *oc, void *data)
 
     mc->desc = "ref405ep";
     mc->init = ref405ep_init;
+    mc->default_ram_size = 0x08000000;
 }
 
 static const TypeInfo ref405ep_type = {
@@ -408,7 +414,7 @@ static void taihu_cpld_init(MemoryRegion *sysmem, uint32_t base)
 
 static void taihu_405ep_init(MachineState *machine)
 {
-    ram_addr_t ram_size = machine->ram_size;
+    MachineClass *mc = MACHINE_GET_CLASS(machine);
     const char *kernel_filename = machine->kernel_filename;
     const char *initrd_filename = machine->initrd_filename;
     char *filename;
@@ -425,10 +431,13 @@ static void taihu_405ep_init(MachineState *machine)
     int fl_idx;
     DriveInfo *dinfo;
 
-    /* RAM is soldered to the board so the size cannot be changed */
-    ram_size = 0x08000000;
+    if (machine->ram_size != mc->default_ram_size) {
+        error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
+                     mc->default_ram_size);
+        exit(EXIT_FAILURE);
+    }
     memory_region_allocate_system_memory(ram, NULL, "taihu_405ep.ram",
-                                         ram_size);
+                                         machine->ram_size);
 
     ram_bases[0] = 0;
     ram_sizes[0] = 0x04000000;
@@ -500,7 +509,7 @@ static void taihu_405ep_init(MachineState *machine)
         kernel_base = KERNEL_LOAD_ADDR;
         /* now we can load the kernel */
         kernel_size = load_image_targphys(kernel_filename, kernel_base,
-                                          ram_size - kernel_base);
+                                          machine->ram_size - kernel_base);
         if (kernel_size < 0) {
             error_report("could not load kernel '%s'", kernel_filename);
             exit(1);
@@ -509,7 +518,7 @@ static void taihu_405ep_init(MachineState *machine)
         if (initrd_filename) {
             initrd_base = INITRD_LOAD_ADDR;
             initrd_size = load_image_targphys(initrd_filename, initrd_base,
-                                              ram_size - initrd_base);
+                                              machine->ram_size - initrd_base);
             if (initrd_size < 0) {
                 error_report("could not load initial ram disk '%s'",
                              initrd_filename);
@@ -533,6 +542,7 @@ static void taihu_class_init(ObjectClass *oc, void *data)
 
     mc->desc = "taihu";
     mc->init = taihu_405ep_init;
+    mc->default_ram_size = 0x08000000;
 }
 
 static const TypeInfo taihu_type = {
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 65/86] ppc:ppc405_boards: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (63 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 64/86] ppc:ppc405_boards: add RAM size checks Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 13:03 ` [PATCH 66/86] ppc:ppc440_bamboo/sam460ex: drop RAM size fixup Igor Mammedov
                   ` (21 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

PS:
in ref405ep alias RAM into ram_memories[] to avoid re-factoring
its user ppc405ep_init(), which would be invasive and out of
scope this patch.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/ppc/ppc405_boards.c | 13 ++++++-------
 1 file changed, 6 insertions(+), 7 deletions(-)

diff --git a/hw/ppc/ppc405_boards.c b/hw/ppc/ppc405_boards.c
index 41aebbc..dd5a61f 100644
--- a/hw/ppc/ppc405_boards.c
+++ b/hw/ppc/ppc405_boards.c
@@ -168,8 +168,8 @@ static void ref405ep_init(MachineState *machine)
     }
 
     /* XXX: fix this */
-    memory_region_allocate_system_memory(&ram_memories[0], NULL, "ef405ep.ram",
-                                         machine->ram_size);
+    memory_region_init_alias(&ram_memories[0], NULL, "ef405ep.ram.alias",
+                             machine->ram, 0, machine->ram_size);
     ram_bases[0] = 0;
     ram_sizes[0] = machine->ram_size;
     memory_region_init(&ram_memories[1], NULL, "ef405ep.ram1", 0);
@@ -310,6 +310,7 @@ static void ref405ep_class_init(ObjectClass *oc, void *data)
     mc->desc = "ref405ep";
     mc->init = ref405ep_init;
     mc->default_ram_size = 0x08000000;
+    mc->default_ram_id = "ef405ep.ram";
 }
 
 static const TypeInfo ref405ep_type = {
@@ -422,7 +423,6 @@ static void taihu_405ep_init(MachineState *machine)
     MemoryRegion *sysmem = get_system_memory();
     MemoryRegion *bios;
     MemoryRegion *ram_memories = g_new(MemoryRegion, 2);
-    MemoryRegion *ram = g_malloc0(sizeof(*ram));
     hwaddr ram_bases[2], ram_sizes[2];
     long bios_size;
     target_ulong kernel_base, initrd_base;
@@ -436,18 +436,16 @@ static void taihu_405ep_init(MachineState *machine)
                      mc->default_ram_size);
         exit(EXIT_FAILURE);
     }
-    memory_region_allocate_system_memory(ram, NULL, "taihu_405ep.ram",
-                                         machine->ram_size);
 
     ram_bases[0] = 0;
     ram_sizes[0] = 0x04000000;
     memory_region_init_alias(&ram_memories[0], NULL,
-                             "taihu_405ep.ram-0", ram, ram_bases[0],
+                             "taihu_405ep.ram-0", machine->ram, ram_bases[0],
                              ram_sizes[0]);
     ram_bases[1] = 0x04000000;
     ram_sizes[1] = 0x04000000;
     memory_region_init_alias(&ram_memories[1], NULL,
-                             "taihu_405ep.ram-1", ram, ram_bases[1],
+                             "taihu_405ep.ram-1", machine->ram, ram_bases[1],
                              ram_sizes[1]);
     ppc405ep_init(sysmem, ram_memories, ram_bases, ram_sizes,
                   33333333, &pic, kernel_filename == NULL ? 0 : 1);
@@ -543,6 +541,7 @@ static void taihu_class_init(ObjectClass *oc, void *data)
     mc->desc = "taihu";
     mc->init = taihu_405ep_init;
     mc->default_ram_size = 0x08000000;
+    mc->default_ram_id = "ef405ep.ram";
 }
 
 static const TypeInfo taihu_type = {
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 66/86] ppc:ppc440_bamboo/sam460ex: drop RAM size fixup
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (64 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 65/86] ppc:ppc405_boards: use memdev for RAM Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2020-01-01 11:54   ` BALATON Zoltan
  2019-12-31 13:03 ` [PATCH 67/86] ppc:ppc440_bamboo/sam460ex: use memdev for RAM Igor Mammedov
                   ` (20 subsequent siblings)
  86 siblings, 1 reply; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

If user provided non-sense RAM size, board will complain and
continue running with max RAM size supported.
Also RAM is going to be allocated by generic code, so it won't be
possible for board to fix things up for user.

Make it error message and exit to force user fix CLI,
instead of accepting non-sense CLI values.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 include/hw/ppc/ppc4xx.h |  9 ++++-----
 hw/ppc/ppc440_bamboo.c  | 11 ++++-------
 hw/ppc/ppc4xx_devs.c    | 26 ++++++++++++++++----------
 hw/ppc/sam460ex.c       |  5 ++---
 4 files changed, 26 insertions(+), 25 deletions(-)

diff --git a/include/hw/ppc/ppc4xx.h b/include/hw/ppc/ppc4xx.h
index 7d82259..1a28127 100644
--- a/include/hw/ppc/ppc4xx.h
+++ b/include/hw/ppc/ppc4xx.h
@@ -42,11 +42,10 @@ enum {
 qemu_irq *ppcuic_init (CPUPPCState *env, qemu_irq *irqs,
                        uint32_t dcr_base, int has_ssr, int has_vr);
 
-ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
-                               MemoryRegion ram_memories[],
-                               hwaddr ram_bases[],
-                               hwaddr ram_sizes[],
-                               const ram_addr_t sdram_bank_sizes[]);
+void ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
+                         MemoryRegion ram_memories[],
+                         hwaddr ram_bases[], hwaddr ram_sizes[],
+                         const ram_addr_t sdram_bank_sizes[]);
 
 void ppc4xx_sdram_init (CPUPPCState *env, qemu_irq irq, int nbanks,
                         MemoryRegion ram_memories[],
diff --git a/hw/ppc/ppc440_bamboo.c b/hw/ppc/ppc440_bamboo.c
index 4d95c0f..66dee89 100644
--- a/hw/ppc/ppc440_bamboo.c
+++ b/hw/ppc/ppc440_bamboo.c
@@ -162,7 +162,6 @@ static void main_cpu_reset(void *opaque)
 
 static void bamboo_init(MachineState *machine)
 {
-    ram_addr_t ram_size = machine->ram_size;
     const char *kernel_filename = machine->kernel_filename;
     const char *kernel_cmdline = machine->kernel_cmdline;
     const char *initrd_filename = machine->initrd_filename;
@@ -207,10 +206,8 @@ static void bamboo_init(MachineState *machine)
     /* SDRAM controller */
     memset(ram_bases, 0, sizeof(ram_bases));
     memset(ram_sizes, 0, sizeof(ram_sizes));
-    ram_size = ppc4xx_sdram_adjust(ram_size, PPC440EP_SDRAM_NR_BANKS,
-                                   ram_memories,
-                                   ram_bases, ram_sizes,
-                                   ppc440ep_sdram_bank_sizes);
+    ppc4xx_sdram_adjust(ram_size, PPC440EP_SDRAM_NR_BANKS, ram_memories,
+                        ram_bases, ram_sizes, ppc440ep_sdram_bank_sizes);
     /* XXX 440EP's ECC interrupts are on UIC1, but we've only created UIC0. */
     ppc4xx_sdram_init(env, pic[14], PPC440EP_SDRAM_NR_BANKS, ram_memories,
                       ram_bases, ram_sizes, 1);
@@ -272,7 +269,7 @@ static void bamboo_init(MachineState *machine)
     /* Load initrd. */
     if (initrd_filename) {
         initrd_size = load_image_targphys(initrd_filename, RAMDISK_ADDR,
-                                          ram_size - RAMDISK_ADDR);
+                                          machine->ram_size - RAMDISK_ADDR);
 
         if (initrd_size < 0) {
             error_report("could not load ram disk '%s' at %x",
@@ -283,7 +280,7 @@ static void bamboo_init(MachineState *machine)
 
     /* If we're loading a kernel directly, we must load the device tree too. */
     if (kernel_filename) {
-        if (bamboo_load_device_tree(FDT_ADDR, ram_size, RAMDISK_ADDR,
+        if (bamboo_load_device_tree(FDT_ADDR, machine->ram_size, RAMDISK_ADDR,
                                     initrd_size, kernel_cmdline) < 0) {
             error_report("couldn't load device tree");
             exit(1);
diff --git a/hw/ppc/ppc4xx_devs.c b/hw/ppc/ppc4xx_devs.c
index c2e5013..54af296 100644
--- a/hw/ppc/ppc4xx_devs.c
+++ b/hw/ppc/ppc4xx_devs.c
@@ -673,11 +673,10 @@ void ppc4xx_sdram_init (CPUPPCState *env, qemu_irq irq, int nbanks,
  * The 4xx SDRAM controller supports a small number of banks, and each bank
  * must be one of a small set of sizes. The number of banks and the supported
  * sizes varies by SoC. */
-ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
-                               MemoryRegion ram_memories[],
-                               hwaddr ram_bases[],
-                               hwaddr ram_sizes[],
-                               const ram_addr_t sdram_bank_sizes[])
+void ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
+                         MemoryRegion ram_memories[],
+                         hwaddr ram_bases[], hwaddr ram_sizes[],
+                         const ram_addr_t sdram_bank_sizes[])
 {
     MemoryRegion *ram = g_malloc0(sizeof(*ram));
     ram_addr_t size_left = ram_size;
@@ -699,10 +698,19 @@ ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
         }
     }
 
-    ram_size -= size_left;
     if (size_left) {
-        error_report("Truncating memory to %" PRId64 " MiB to fit SDRAM"
-                     " controller limits", ram_size / MiB);
+        char *s = g_strdup("");
+        for (i = 0; sdram_bank_sizes[i]; i++) {
+            char *t = g_strdup_printf("%s%" PRIi64 "%s", s, sdram_bank_sizes[i],
+                                      sdram_bank_sizes[i + 1] ? " ," : "");
+            g_free(s);
+            s = t;
+        }
+        error_report("Invalid RAM size, unable to fit all RAM into RAM banks"
+                     " (unassigned RAM: %" PRIi64 ")",  size_left);
+        error_report("Supported: %d banks and sizes/bank: %s", nr_banks, s);
+        g_free(s);
+        exit(EXIT_FAILURE);
     }
 
     memory_region_allocate_system_memory(ram, NULL, "ppc4xx.sdram", ram_size);
@@ -725,8 +733,6 @@ ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
             }
         }
     }
-
-    return ram_size;
 }
 
 /*****************************************************************************/
diff --git a/hw/ppc/sam460ex.c b/hw/ppc/sam460ex.c
index 437e214..f592816 100644
--- a/hw/ppc/sam460ex.c
+++ b/hw/ppc/sam460ex.c
@@ -324,9 +324,8 @@ static void sam460ex_init(MachineState *machine)
     /* SDRAM controller */
     /* put all RAM on first bank because board has one slot
      * and firmware only checks that */
-    machine->ram_size = ppc4xx_sdram_adjust(machine->ram_size, 1,
-                                   ram_memories, ram_bases, ram_sizes,
-                                   ppc460ex_sdram_bank_sizes);
+    ppc4xx_sdram_adjust(machine->ram_size, 1, ram_memories, ram_bases,
+                        ram_sizes, ppc460ex_sdram_bank_sizes);
 
     /* FIXME: does 460EX have ECC interrupts? */
     ppc440_sdram_init(env, SDRAM_NR_BANKS, ram_memories,
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 67/86] ppc:ppc440_bamboo/sam460ex: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (65 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 66/86] ppc:ppc440_bamboo/sam460ex: drop RAM size fixup Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 13:03 ` [PATCH 68/86] ppc:prep: " Igor Mammedov
                   ` (19 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 include/hw/ppc/ppc4xx.h | 2 +-
 hw/ppc/ppc440_bamboo.c  | 3 ++-
 hw/ppc/ppc4xx_devs.c    | 6 ++----
 hw/ppc/sam460ex.c       | 3 ++-
 4 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/include/hw/ppc/ppc4xx.h b/include/hw/ppc/ppc4xx.h
index 1a28127..896b1b1 100644
--- a/include/hw/ppc/ppc4xx.h
+++ b/include/hw/ppc/ppc4xx.h
@@ -42,7 +42,7 @@ enum {
 qemu_irq *ppcuic_init (CPUPPCState *env, qemu_irq *irqs,
                        uint32_t dcr_base, int has_ssr, int has_vr);
 
-void ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
+void ppc4xx_sdram_adjust(MemoryRegion *ram, int nr_banks,
                          MemoryRegion ram_memories[],
                          hwaddr ram_bases[], hwaddr ram_sizes[],
                          const ram_addr_t sdram_bank_sizes[]);
diff --git a/hw/ppc/ppc440_bamboo.c b/hw/ppc/ppc440_bamboo.c
index 66dee89..73e5b23 100644
--- a/hw/ppc/ppc440_bamboo.c
+++ b/hw/ppc/ppc440_bamboo.c
@@ -206,7 +206,7 @@ static void bamboo_init(MachineState *machine)
     /* SDRAM controller */
     memset(ram_bases, 0, sizeof(ram_bases));
     memset(ram_sizes, 0, sizeof(ram_sizes));
-    ppc4xx_sdram_adjust(ram_size, PPC440EP_SDRAM_NR_BANKS, ram_memories,
+    ppc4xx_sdram_adjust(machine->ram, PPC440EP_SDRAM_NR_BANKS, ram_memories,
                         ram_bases, ram_sizes, ppc440ep_sdram_bank_sizes);
     /* XXX 440EP's ECC interrupts are on UIC1, but we've only created UIC0. */
     ppc4xx_sdram_init(env, pic[14], PPC440EP_SDRAM_NR_BANKS, ram_memories,
@@ -293,6 +293,7 @@ static void bamboo_machine_init(MachineClass *mc)
     mc->desc = "bamboo";
     mc->init = bamboo_init;
     mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("440epb");
+    mc->default_ram_id = "ppc4xx.sdram";
 }
 
 DEFINE_MACHINE("bamboo", bamboo_machine_init)
diff --git a/hw/ppc/ppc4xx_devs.c b/hw/ppc/ppc4xx_devs.c
index 54af296..515e462 100644
--- a/hw/ppc/ppc4xx_devs.c
+++ b/hw/ppc/ppc4xx_devs.c
@@ -673,12 +673,12 @@ void ppc4xx_sdram_init (CPUPPCState *env, qemu_irq irq, int nbanks,
  * The 4xx SDRAM controller supports a small number of banks, and each bank
  * must be one of a small set of sizes. The number of banks and the supported
  * sizes varies by SoC. */
-void ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
+void ppc4xx_sdram_adjust(MemoryRegion *ram, int nr_banks,
                          MemoryRegion ram_memories[],
                          hwaddr ram_bases[], hwaddr ram_sizes[],
                          const ram_addr_t sdram_bank_sizes[])
 {
-    MemoryRegion *ram = g_malloc0(sizeof(*ram));
+    ram_addr_t ram_size = memory_region_size(ram);
     ram_addr_t size_left = ram_size;
     ram_addr_t base = 0;
     ram_addr_t bank_size;
@@ -713,8 +713,6 @@ void ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
         exit(EXIT_FAILURE);
     }
 
-    memory_region_allocate_system_memory(ram, NULL, "ppc4xx.sdram", ram_size);
-
     size_left = ram_size;
     for (i = 0; i < nr_banks && size_left; i++) {
         for (j = 0; sdram_bank_sizes[j] != 0; j++) {
diff --git a/hw/ppc/sam460ex.c b/hw/ppc/sam460ex.c
index f592816..2d75719 100644
--- a/hw/ppc/sam460ex.c
+++ b/hw/ppc/sam460ex.c
@@ -324,7 +324,7 @@ static void sam460ex_init(MachineState *machine)
     /* SDRAM controller */
     /* put all RAM on first bank because board has one slot
      * and firmware only checks that */
-    ppc4xx_sdram_adjust(machine->ram_size, 1, ram_memories, ram_bases,
+    ppc4xx_sdram_adjust(machine->ram, 1, ram_memories, ram_bases,
                         ram_sizes, ppc460ex_sdram_bank_sizes);
 
     /* FIXME: does 460EX have ECC interrupts? */
@@ -483,6 +483,7 @@ static void sam460ex_machine_init(MachineClass *mc)
     mc->init = sam460ex_init;
     mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("460exb");
     mc->default_ram_size = 512 * MiB;
+    mc->default_ram_id = "ppc4xx.sdram";
 }
 
 DEFINE_MACHINE("sam460ex", sam460ex_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 68/86] ppc:prep: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (66 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 67/86] ppc:ppc440_bamboo/sam460ex: use memdev for RAM Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 13:03 ` [PATCH 69/86] ppc:spapr: " Igor Mammedov
                   ` (18 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/ppc/prep.c | 15 +++++++--------
 1 file changed, 7 insertions(+), 8 deletions(-)

diff --git a/hw/ppc/prep.c b/hw/ppc/prep.c
index 862345c..bf75dde 100644
--- a/hw/ppc/prep.c
+++ b/hw/ppc/prep.c
@@ -400,7 +400,6 @@ static int PPC_NVRAM_set_params (Nvram *nvram, uint16_t NVRAM_size,
 /* PowerPC PREP hardware initialisation */
 static void ppc_prep_init(MachineState *machine)
 {
-    ram_addr_t ram_size = machine->ram_size;
     const char *kernel_filename = machine->kernel_filename;
     const char *kernel_cmdline = machine->kernel_cmdline;
     const char *initrd_filename = machine->initrd_filename;
@@ -413,7 +412,6 @@ static void ppc_prep_init(MachineState *machine)
     MemoryRegion *xcsr = g_new(MemoryRegion, 1);
 #endif
     int linux_boot, i, nb_nics1;
-    MemoryRegion *ram = g_new(MemoryRegion, 1);
     uint32_t kernel_base, initrd_base;
     long kernel_size, initrd_size;
     DeviceState *dev;
@@ -444,15 +442,14 @@ static void ppc_prep_init(MachineState *machine)
         qemu_register_reset(ppc_prep_reset, cpu);
     }
 
-    /* allocate RAM */
-    memory_region_allocate_system_memory(ram, NULL, "ppc_prep.ram", ram_size);
-    memory_region_add_subregion(sysmem, 0, ram);
+    /* map RAM */
+    memory_region_add_subregion(sysmem, 0, machine->ram);
 
     if (linux_boot) {
         kernel_base = KERNEL_LOAD_ADDR;
         /* now we can load the kernel */
         kernel_size = load_image_targphys(kernel_filename, kernel_base,
-                                          ram_size - kernel_base);
+                                          machine->ram_size - kernel_base);
         if (kernel_size < 0) {
             error_report("could not load kernel '%s'", kernel_filename);
             exit(1);
@@ -461,7 +458,7 @@ static void ppc_prep_init(MachineState *machine)
         if (initrd_filename) {
             initrd_base = INITRD_LOAD_ADDR;
             initrd_size = load_image_targphys(initrd_filename, initrd_base,
-                                              ram_size - initrd_base);
+                                              machine->ram_size - initrd_base);
             if (initrd_size < 0) {
                 error_report("could not load initial ram disk '%s'",
                              initrd_filename);
@@ -576,7 +573,7 @@ static void ppc_prep_init(MachineState *machine)
     sysctrl->nvram = m48t59;
 
     /* Initialise NVRAM */
-    PPC_NVRAM_set_params(m48t59, NVRAM_SIZE, "PREP", ram_size,
+    PPC_NVRAM_set_params(m48t59, NVRAM_SIZE, "PREP", machine->ram_size,
                          ppc_boot_device,
                          kernel_base, kernel_size,
                          kernel_cmdline,
@@ -596,6 +593,7 @@ static void prep_machine_init(MachineClass *mc)
     mc->default_boot_order = "cad";
     mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("602");
     mc->default_display = "std";
+    mc->default_ram_id = "ppc_prep.ram";
 }
 
 static int prep_set_cmos_checksum(DeviceState *dev, void *opaque)
@@ -814,6 +812,7 @@ static void ibm_40p_machine_init(MachineClass *mc)
     mc->init = ibm_40p_init;
     mc->max_cpus = 1;
     mc->default_ram_size = 128 * MiB;
+    mc->default_ram_id = "ppc_prep.ram";
     mc->block_default_type = IF_SCSI;
     mc->default_boot_order = "c";
     mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("604");
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 69/86] ppc:spapr: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (67 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 68/86] ppc:prep: " Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 13:03 ` [PATCH 70/86] ppc:virtex_ml507: remove unused arguments Igor Mammedov
                   ` (17 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/ppc/spapr.c | 8 +++-----
 1 file changed, 3 insertions(+), 5 deletions(-)

diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index f11422f..915e36a 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -2589,7 +2589,6 @@ static void spapr_machine_init(MachineState *machine)
     PCIHostState *phb;
     int i;
     MemoryRegion *sysmem = get_system_memory();
-    MemoryRegion *ram = g_new(MemoryRegion, 1);
     hwaddr node0_size = spapr_node0_size(machine);
     long load_limit, fw_size;
     char *filename;
@@ -2768,10 +2767,8 @@ static void spapr_machine_init(MachineState *machine)
         kvmppc_enable_h_page_init();
     }
 
-    /* allocate RAM */
-    memory_region_allocate_system_memory(ram, NULL, "ppc_spapr.ram",
-                                         machine->ram_size);
-    memory_region_add_subregion(sysmem, 0, ram);
+    /* map RAM */
+    memory_region_add_subregion(sysmem, 0, machine->ram);
 
     /* always allocate the device memory information */
     machine->device_memory = g_malloc0(sizeof(*machine->device_memory));
@@ -4346,6 +4343,7 @@ static void spapr_machine_class_init(ObjectClass *oc, void *data)
     mc->no_parallel = 1;
     mc->default_boot_order = "";
     mc->default_ram_size = 512 * MiB;
+    mc->default_ram_id = "ppc_spapr.ram";
     mc->default_display = "std";
     mc->kvm_type = spapr_kvm_type;
     machine_class_allow_dynamic_sysbus_dev(mc, TYPE_SPAPR_PCI_HOST_BRIDGE);
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 70/86] ppc:virtex_ml507: remove unused arguments
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (68 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 69/86] ppc:spapr: " Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 13:03 ` [PATCH 71/86] ppc:virtex_ml507: use memdev for RAM Igor Mammedov
                   ` (16 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/ppc/virtex_ml507.c | 7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/hw/ppc/virtex_ml507.c b/hw/ppc/virtex_ml507.c
index 6862552..651d8db 100644
--- a/hw/ppc/virtex_ml507.c
+++ b/hw/ppc/virtex_ml507.c
@@ -89,10 +89,7 @@ static void mmubooke_create_initial_mapping(CPUPPCState *env,
     tlb->PID = 0;
 }
 
-static PowerPCCPU *ppc440_init_xilinx(ram_addr_t *ram_size,
-                                      int do_init,
-                                      const char *cpu_type,
-                                      uint32_t sysclk)
+static PowerPCCPU *ppc440_init_xilinx(const char *cpu_type, uint32_t sysclk)
 {
     PowerPCCPU *cpu;
     CPUPPCState *env;
@@ -213,7 +210,7 @@ static void virtex_init(MachineState *machine)
     int i;
 
     /* init CPUs */
-    cpu = ppc440_init_xilinx(&ram_size, 1, machine->cpu_type, 400000000);
+    cpu = ppc440_init_xilinx(machine->cpu_type, 400000000);
     env = &cpu->env;
 
     if (env->mmu_model != POWERPC_MMU_BOOKE) {
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 71/86] ppc:virtex_ml507: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (69 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 70/86] ppc:virtex_ml507: remove unused arguments Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 13:03 ` [PATCH 72/86] sparc:leon3: " Igor Mammedov
                   ` (15 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/ppc/virtex_ml507.c | 12 +++++-------
 1 file changed, 5 insertions(+), 7 deletions(-)

diff --git a/hw/ppc/virtex_ml507.c b/hw/ppc/virtex_ml507.c
index 651d8db..b74a269 100644
--- a/hw/ppc/virtex_ml507.c
+++ b/hw/ppc/virtex_ml507.c
@@ -193,7 +193,6 @@ static int xilinx_load_device_tree(hwaddr addr,
 
 static void virtex_init(MachineState *machine)
 {
-    ram_addr_t ram_size = machine->ram_size;
     const char *kernel_filename = machine->kernel_filename;
     const char *kernel_cmdline = machine->kernel_cmdline;
     hwaddr initrd_base = 0;
@@ -204,7 +203,6 @@ static void virtex_init(MachineState *machine)
     CPUPPCState *env;
     hwaddr ram_base = 0;
     DriveInfo *dinfo;
-    MemoryRegion *phys_ram = g_new(MemoryRegion, 1);
     qemu_irq irq[32], *cpu_irq;
     int kernel_size;
     int i;
@@ -221,8 +219,7 @@ static void virtex_init(MachineState *machine)
 
     qemu_register_reset(main_cpu_reset, cpu);
 
-    memory_region_allocate_system_memory(phys_ram, NULL, "ram", ram_size);
-    memory_region_add_subregion(address_space_mem, ram_base, phys_ram);
+    memory_region_add_subregion(address_space_mem, ram_base, machine->ram);
 
     dinfo = drive_get(IF_PFLASH, 0, 0);
     pflash_cfi01_register(PFLASH_BASEADDR, "virtex.flash", FLASH_SIZE,
@@ -265,7 +262,7 @@ static void virtex_init(MachineState *machine)
             /* If we failed loading ELF's try a raw image.  */
             kernel_size = load_image_targphys(kernel_filename,
                                               boot_offset,
-                                              ram_size);
+                                              machine->ram_size);
             boot_info.bootstrap_pc = boot_offset;
             high = boot_info.bootstrap_pc + kernel_size + 8192;
         }
@@ -276,7 +273,7 @@ static void virtex_init(MachineState *machine)
         if (machine->initrd_filename) {
             initrd_base = high = ROUND_UP(high, 4);
             initrd_size = load_image_targphys(machine->initrd_filename,
-                                              high, ram_size - high);
+                                              high, machine->ram_size - high);
 
             if (initrd_size < 0) {
                 error_report("couldn't load ram disk '%s'",
@@ -290,7 +287,7 @@ static void virtex_init(MachineState *machine)
         boot_info.fdt = high + (8192 * 2);
         boot_info.fdt &= ~8191;
 
-        xilinx_load_device_tree(boot_info.fdt, ram_size,
+        xilinx_load_device_tree(boot_info.fdt, machine->ram_size,
                                 initrd_base, initrd_size,
                                 kernel_cmdline);
     }
@@ -302,6 +299,7 @@ static void virtex_machine_init(MachineClass *mc)
     mc->desc = "Xilinx Virtex ML507 reference design";
     mc->init = virtex_init;
     mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("440-xilinx");
+    mc->default_ram_id = "ram";
 }
 
 DEFINE_MACHINE("virtex-ml507", virtex_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 72/86] sparc:leon3: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (70 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 71/86] ppc:virtex_ml507: use memdev for RAM Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 16:02   ` Philippe Mathieu-Daudé
  2019-12-31 13:03 ` [PATCH 73/86] sparc:sun4m: " Igor Mammedov
                   ` (14 subsequent siblings)
  86 siblings, 1 reply; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/sparc/leon3.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/hw/sparc/leon3.c b/hw/sparc/leon3.c
index c5f1b1e..19927d1 100644
--- a/hw/sparc/leon3.c
+++ b/hw/sparc/leon3.c
@@ -184,7 +184,6 @@ static void leon3_generic_hw_init(MachineState *machine)
     SPARCCPU *cpu;
     CPUSPARCState   *env;
     MemoryRegion *address_space_mem = get_system_memory();
-    MemoryRegion *ram = g_new(MemoryRegion, 1);
     MemoryRegion *prom = g_new(MemoryRegion, 1);
     int         ret;
     char       *filename;
@@ -244,8 +243,8 @@ static void leon3_generic_hw_init(MachineState *machine)
         exit(1);
     }
 
-    memory_region_allocate_system_memory(ram, NULL, "leon3.ram", ram_size);
-    memory_region_add_subregion(address_space_mem, LEON3_RAM_OFFSET, ram);
+    memory_region_add_subregion(address_space_mem, LEON3_RAM_OFFSET,
+                                machine->ram);
 
     /* Allocate BIOS */
     prom_size = 8 * MiB;
@@ -351,6 +350,7 @@ static void leon3_generic_machine_init(MachineClass *mc)
     mc->desc = "Leon-3 generic";
     mc->init = leon3_generic_hw_init;
     mc->default_cpu_type = SPARC_CPU_TYPE_NAME("LEON3");
+    mc->default_ram_id = "leon3.ram";
 }
 
 DEFINE_MACHINE("leon3_generic", leon3_generic_machine_init)
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 73/86] sparc:sun4m: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (71 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 72/86] sparc:leon3: " Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 13:03 ` [PATCH 74/86] sparc:niagara: " Igor Mammedov
                   ` (13 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Patch moves ram size check into sun4m_hw_init() and drops
ram_init() moving remainder to sun4m_hw_init() as well,
as it was the only place that called it.

Also it rewrites impl. of RamDevice a little bit, which
could serve as an example of frontend device for RAM backend.
(Caveats are:
  1. it doesn't check for memdev backend being mapped
     since it's been  usurped by generic machine to handle
     majority of machines which don't have RAM frontend device
  2. it still lacks 'addr' property and still has hardcoded
     sysbus_mmio_map() in board init. If done right, board should
     set 'addr' property and bus/machine plug handler should map
     it during device realize time.
)
Further improvements were left as exercise for the future,
since frontends are out scope of RAM conversion to memdev.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/sparc/sun4m.c | 73 ++++++++++++++++++++++++++++----------------------------
 1 file changed, 36 insertions(+), 37 deletions(-)

diff --git a/hw/sparc/sun4m.c b/hw/sparc/sun4m.c
index 2aaa5bf..834ad2a 100644
--- a/hw/sparc/sun4m.c
+++ b/hw/sparc/sun4m.c
@@ -777,63 +777,42 @@ static const TypeInfo prom_info = {
 
 typedef struct RamDevice {
     SysBusDevice parent_obj;
-
-    MemoryRegion ram;
-    uint64_t size;
+    HostMemoryBackend *memdev;
 } RamDevice;
 
 /* System RAM */
 static void ram_realize(DeviceState *dev, Error **errp)
 {
     RamDevice *d = SUN4M_RAM(dev);
-    SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
+    MemoryRegion *ram = host_memory_backend_get_memory(d->memdev);
 
-    memory_region_allocate_system_memory(&d->ram, OBJECT(d), "sun4m.ram",
-                                         d->size);
-    sysbus_init_mmio(sbd, &d->ram);
+    sysbus_init_mmio(SYS_BUS_DEVICE(dev), ram);
 }
 
-static void ram_init(hwaddr addr, ram_addr_t RAM_size,
-                     uint64_t max_mem)
+static void ram_initfn(Object *obj)
 {
-    DeviceState *dev;
-    SysBusDevice *s;
-    RamDevice *d;
-
-    /* allocate RAM */
-    if ((uint64_t)RAM_size > max_mem) {
-        error_report("Too much memory for this machine: %" PRId64 ","
-                     " maximum %" PRId64,
-                     RAM_size / MiB, max_mem / MiB);
-        exit(1);
-    }
-    dev = qdev_create(NULL, "memory");
-    s = SYS_BUS_DEVICE(dev);
-
-    d = SUN4M_RAM(dev);
-    d->size = RAM_size;
-    qdev_init_nofail(dev);
-
-    sysbus_mmio_map(s, 0, addr);
+    RamDevice *d = SUN4M_RAM(obj);
+    object_property_add_link(obj, "memdev", TYPE_MEMORY_BACKEND,
+                             (Object **)&d->memdev,
+                             object_property_allow_set_link,
+                             OBJ_PROP_LINK_STRONG, &error_abort);
+    object_property_set_description(obj, "memdev", "Set RAM backend"
+                                    "Valid value is ID of a hostmem backend",
+                                     &error_abort);
 }
 
-static Property ram_properties[] = {
-    DEFINE_PROP_UINT64("size", RamDevice, size, 0),
-    DEFINE_PROP_END_OF_LIST(),
-};
-
 static void ram_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->realize = ram_realize;
-    dc->props = ram_properties;
 }
 
 static const TypeInfo ram_info = {
     .name          = TYPE_SUN4M_MEMORY,
     .parent        = TYPE_SYS_BUS_DEVICE,
     .instance_size = sizeof(RamDevice),
+    .instance_init = ram_initfn,
     .class_init    = ram_class_init,
 };
 
@@ -880,6 +859,13 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef,
     unsigned int smp_cpus = machine->smp.cpus;
     unsigned int max_cpus = machine->smp.max_cpus;
 
+    if (machine->ram_size > hwdef->max_mem) {
+        error_report("Too much memory for this machine: %" PRId64 ","
+                     " maximum %" PRId64,
+                     machine->ram_size / MiB, hwdef->max_mem / MiB);
+        exit(1);
+    }
+
     /* init CPUs */
     for(i = 0; i < smp_cpus; i++) {
         cpu_devinit(machine->cpu_type, i, hwdef->slavio_base, &cpu_irqs[i]);
@@ -888,9 +874,13 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef,
     for (i = smp_cpus; i < MAX_CPUS; i++)
         cpu_irqs[i] = qemu_allocate_irqs(dummy_cpu_set_irq, NULL, MAX_PILS);
 
+    /* Create and map RAM frontend */
+    dev = qdev_create(NULL, "memory");
+    object_property_set_link(OBJECT(dev), OBJECT(machine->ram_memdev),
+                             "memdev", &error_fatal);
+    qdev_init_nofail(dev);
+    sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, 0);
 
-    /* set up devices */
-    ram_init(0, machine->ram_size, hwdef->max_mem);
     /* models without ECC don't trap when missing ram is accessed */
     if (!hwdef->ecc_base) {
         empty_slot_init(machine->ram_size, hwdef->max_mem - machine->ram_size);
@@ -1078,7 +1068,7 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef,
 
     fw_cfg_add_i16(fw_cfg, FW_CFG_NB_CPUS, (uint16_t)smp_cpus);
     fw_cfg_add_i16(fw_cfg, FW_CFG_MAX_CPUS, (uint16_t)max_cpus);
-    fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)ram_size);
+    fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)machine->ram_size);
     fw_cfg_add_i16(fw_cfg, FW_CFG_MACHINE_ID, hwdef->machine_id);
     fw_cfg_add_i16(fw_cfg, FW_CFG_SUN4M_DEPTH, graphic_depth);
     fw_cfg_add_i16(fw_cfg, FW_CFG_SUN4M_WIDTH, graphic_width);
@@ -1415,6 +1405,7 @@ static void ss5_class_init(ObjectClass *oc, void *data)
     mc->default_boot_order = "c";
     mc->default_cpu_type = SPARC_CPU_TYPE_NAME("Fujitsu-MB86904");
     mc->default_display = "tcx";
+    mc->default_ram_id = "sun4m.ram";
 }
 
 static const TypeInfo ss5_type = {
@@ -1434,6 +1425,7 @@ static void ss10_class_init(ObjectClass *oc, void *data)
     mc->default_boot_order = "c";
     mc->default_cpu_type = SPARC_CPU_TYPE_NAME("TI-SuperSparc-II");
     mc->default_display = "tcx";
+    mc->default_ram_id = "sun4m.ram";
 }
 
 static const TypeInfo ss10_type = {
@@ -1453,6 +1445,7 @@ static void ss600mp_class_init(ObjectClass *oc, void *data)
     mc->default_boot_order = "c";
     mc->default_cpu_type = SPARC_CPU_TYPE_NAME("TI-SuperSparc-II");
     mc->default_display = "tcx";
+    mc->default_ram_id = "sun4m.ram";
 }
 
 static const TypeInfo ss600mp_type = {
@@ -1472,6 +1465,7 @@ static void ss20_class_init(ObjectClass *oc, void *data)
     mc->default_boot_order = "c";
     mc->default_cpu_type = SPARC_CPU_TYPE_NAME("TI-SuperSparc-II");
     mc->default_display = "tcx";
+    mc->default_ram_id = "sun4m.ram";
 }
 
 static const TypeInfo ss20_type = {
@@ -1490,6 +1484,7 @@ static void voyager_class_init(ObjectClass *oc, void *data)
     mc->default_boot_order = "c";
     mc->default_cpu_type = SPARC_CPU_TYPE_NAME("Fujitsu-MB86904");
     mc->default_display = "tcx";
+    mc->default_ram_id = "sun4m.ram";
 }
 
 static const TypeInfo voyager_type = {
@@ -1508,6 +1503,7 @@ static void ss_lx_class_init(ObjectClass *oc, void *data)
     mc->default_boot_order = "c";
     mc->default_cpu_type = SPARC_CPU_TYPE_NAME("TI-MicroSparc-I");
     mc->default_display = "tcx";
+    mc->default_ram_id = "sun4m.ram";
 }
 
 static const TypeInfo ss_lx_type = {
@@ -1526,6 +1522,7 @@ static void ss4_class_init(ObjectClass *oc, void *data)
     mc->default_boot_order = "c";
     mc->default_cpu_type = SPARC_CPU_TYPE_NAME("Fujitsu-MB86904");
     mc->default_display = "tcx";
+    mc->default_ram_id = "sun4m.ram";
 }
 
 static const TypeInfo ss4_type = {
@@ -1544,6 +1541,7 @@ static void scls_class_init(ObjectClass *oc, void *data)
     mc->default_boot_order = "c";
     mc->default_cpu_type = SPARC_CPU_TYPE_NAME("TI-MicroSparc-I");
     mc->default_display = "tcx";
+    mc->default_ram_id = "sun4m.ram";
 }
 
 static const TypeInfo scls_type = {
@@ -1562,6 +1560,7 @@ static void sbook_class_init(ObjectClass *oc, void *data)
     mc->default_boot_order = "c";
     mc->default_cpu_type = SPARC_CPU_TYPE_NAME("TI-MicroSparc-I");
     mc->default_display = "tcx";
+    mc->default_ram_id = "sun4m.ram";
 }
 
 static const TypeInfo sbook_type = {
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 74/86] sparc:niagara: use memdev for RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (72 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 73/86] sparc:sun4m: " Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 16:02   ` Philippe Mathieu-Daudé
  2019-12-31 13:03 ` [PATCH 75/86] remove no longer used memory_region_allocate_system_memory() Igor Mammedov
                   ` (12 subsequent siblings)
  86 siblings, 1 reply; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

memory_region_allocate_system_memory() API is going away, so
replace it with memdev allocated MemoryRegion. The later is
initialized by generic code, so board only needs to opt in
to memdev scheme by providing
  MachineClass::default_ram_id
and using MachineState::ram instead of manually initializing
RAM memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/sparc64/niagara.c | 7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/hw/sparc64/niagara.c b/hw/sparc64/niagara.c
index 5eb2d09..ab5ef8c 100644
--- a/hw/sparc64/niagara.c
+++ b/hw/sparc64/niagara.c
@@ -40,7 +40,6 @@
 
 typedef struct NiagaraBoardState {
     MemoryRegion hv_ram;
-    MemoryRegion partition_ram;
     MemoryRegion nvram;
     MemoryRegion md_rom;
     MemoryRegion hv_rom;
@@ -111,11 +110,8 @@ static void niagara_init(MachineState *machine)
                            NIAGARA_HV_RAM_SIZE, &error_fatal);
     memory_region_add_subregion(sysmem, NIAGARA_HV_RAM_BASE, &s->hv_ram);
 
-    memory_region_allocate_system_memory(&s->partition_ram, NULL,
-                                         "sun4v-partition.ram",
-                                         machine->ram_size);
     memory_region_add_subregion(sysmem, NIAGARA_PARTITION_RAM_BASE,
-                                &s->partition_ram);
+                                machine->ram);
 
     memory_region_init_ram(&s->nvram, NULL, "sun4v.nvram", NIAGARA_NVRAM_SIZE,
                            &error_fatal);
@@ -173,6 +169,7 @@ static void niagara_class_init(ObjectClass *oc, void *data)
     mc->max_cpus = 1; /* XXX for now */
     mc->default_boot_order = "c";
     mc->default_cpu_type = SPARC_CPU_TYPE_NAME("Sun-UltraSparc-T1");
+    mc->default_ram_id = "sun4v-partition.ram";
 }
 
 static const TypeInfo niagara_type = {
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 75/86] remove no longer used memory_region_allocate_system_memory()
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (73 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 74/86] sparc:niagara: " Igor Mammedov
@ 2019-12-31 13:03 ` Igor Mammedov
  2019-12-31 13:04 ` [PATCH 76/86] post conversion default_ram_id cleanup Igor Mammedov
                   ` (11 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:03 UTC (permalink / raw)
  To: qemu-devel

all boards were switched to using memdev backend for main RAM,
so we can drop no longer used memory_region_allocate_system_memory()

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 include/hw/boards.h | 32 --------------------------------
 hw/core/numa.c      | 34 ----------------------------------
 2 files changed, 66 deletions(-)

diff --git a/include/hw/boards.h b/include/hw/boards.h
index 70491c1..9f69883 100644
--- a/include/hw/boards.h
+++ b/include/hw/boards.h
@@ -12,38 +12,6 @@
 #include "qom/object.h"
 #include "hw/core/cpu.h"
 
-/**
- * memory_region_allocate_system_memory - Allocate a board's main memory
- * @mr: the #MemoryRegion to be initialized
- * @owner: the object that tracks the region's reference count
- * @name: name of the memory region
- * @ram_size: size of the region in bytes
- *
- * This function allocates the main memory for a board model, and
- * initializes @mr appropriately. It also arranges for the memory
- * to be migrated (by calling vmstate_register_ram_global()).
- *
- * Memory allocated via this function will be backed with the memory
- * backend the user provided using "-mem-path" or "-numa node,memdev=..."
- * if appropriate; this is typically used to cause host huge pages to be
- * used. This function should therefore be called by a board exactly once,
- * for the primary or largest RAM area it implements.
- *
- * For boards where the major RAM is split into two parts in the memory
- * map, you can deal with this by calling memory_region_allocate_system_memory()
- * once to get a MemoryRegion with enough RAM for both parts, and then
- * creating alias MemoryRegions via memory_region_init_alias() which
- * alias into different parts of the RAM MemoryRegion and can be mapped
- * into the memory map in the appropriate places.
- *
- * Smaller pieces of memory (display RAM, static RAMs, etc) don't need
- * to be backed via the -mem-path memory backend and can simply
- * be created via memory_region_init_ram().
- */
-void memory_region_allocate_system_memory(MemoryRegion *mr, Object *owner,
-                                          const char *name,
-                                          uint64_t ram_size);
-
 #define TYPE_MACHINE_SUFFIX "-machine"
 
 /* Machine class name that needs to be used for class-name-based machine
diff --git a/hw/core/numa.c b/hw/core/numa.c
index a752866..623b307 100644
--- a/hw/core/numa.c
+++ b/hw/core/numa.c
@@ -509,40 +509,6 @@ void numa_cpu_pre_plug(const CPUArchId *slot, DeviceState *dev, Error **errp)
     }
 }
 
-static void allocate_system_memory_nonnuma(MemoryRegion *mr, Object *owner,
-                                           const char *name,
-                                           uint64_t ram_size)
-{
-    if (mem_path) {
-#ifdef __linux__
-        memory_region_init_ram_from_file(mr, owner, name, ram_size, 0, 0,
-                                         mem_path, &error_fatal);
-#else
-        fprintf(stderr, "-mem-path not supported on this host\n");
-        exit(1);
-#endif
-    } else {
-        memory_region_init_ram_nomigrate(mr, owner, name, ram_size, &error_fatal);
-    }
-    vmstate_register_ram_global(mr);
-}
-
-void memory_region_allocate_system_memory(MemoryRegion *mr, Object *owner,
-                                          const char *name,
-                                          uint64_t ram_size)
-{
-    MachineState *ms = MACHINE(qdev_get_machine());
-
-    if (ms->numa_state == NULL ||
-        ms->numa_state->num_nodes == 0 || numa_uses_legacy_mem()) {
-        allocate_system_memory_nonnuma(mr, owner, name, ram_size);
-        return;
-    }
-
-    memory_region_init(mr, owner, name, ram_size);
-    numa_init_memdev_container(ms, mr);
-}
-
 static void numa_stat_memory_devices(NumaNodeMem node_mem[])
 {
     MemoryDeviceInfoList *info_list = qmp_memory_device_list();
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 76/86] post conversion default_ram_id cleanup
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (74 preceding siblings ...)
  2019-12-31 13:03 ` [PATCH 75/86] remove no longer used memory_region_allocate_system_memory() Igor Mammedov
@ 2019-12-31 13:04 ` Igor Mammedov
  2019-12-31 16:04   ` Philippe Mathieu-Daudé
  2019-12-31 13:04 ` [PATCH 77/86] exec: cleanup qemu_minrampagesize()/qemu_maxrampagesize() Igor Mammedov
                   ` (10 subsequent siblings)
  86 siblings, 1 reply; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:04 UTC (permalink / raw)
  To: qemu-devel

With default_ram_id is always defined, simplify
'if' conditions in vl.c and numa.c

while at it set
  MachineClass::default_ram_id = "ram"
and clean up several boards that use "ram" id

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/alpha/dp264.c       | 1 -
 hw/arm/aspeed.c        | 1 -
 hw/arm/digic_boards.c  | 1 -
 hw/arm/raspi.c         | 2 --
 hw/core/machine.c      | 1 +
 hw/core/null-machine.c | 1 -
 hw/core/numa.c         | 2 +-
 hw/hppa/machine.c      | 1 -
 hw/ppc/virtex_ml507.c  | 1 -
 vl.c                   | 1 -
 10 files changed, 2 insertions(+), 10 deletions(-)

diff --git a/hw/alpha/dp264.c b/hw/alpha/dp264.c
index 29439c7..f6b9e50 100644
--- a/hw/alpha/dp264.c
+++ b/hw/alpha/dp264.c
@@ -183,7 +183,6 @@ static void clipper_machine_init(MachineClass *mc)
     mc->max_cpus = 4;
     mc->is_default = 1;
     mc->default_cpu_type = ALPHA_CPU_TYPE_NAME("ev67");
-    mc->default_ram_id = "ram";
 }
 
 DEFINE_MACHINE("clipper", clipper_machine_init)
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
index 330254b..188d42f 100644
--- a/hw/arm/aspeed.c
+++ b/hw/arm/aspeed.c
@@ -391,7 +391,6 @@ static void aspeed_machine_class_init(ObjectClass *oc, void *data)
     mc->no_floppy = 1;
     mc->no_cdrom = 1;
     mc->no_parallel = 1;
-    mc->default_ram_id = "ram";
 }
 
 static void aspeed_machine_palmetto_class_init(ObjectClass *oc, void *data)
diff --git a/hw/arm/digic_boards.c b/hw/arm/digic_boards.c
index c3bc5cb..c3cffb3 100644
--- a/hw/arm/digic_boards.c
+++ b/hw/arm/digic_boards.c
@@ -149,7 +149,6 @@ static void canon_a1100_machine_init(MachineClass *mc)
     mc->init = &canon_a1100_init;
     mc->ignore_memory_transaction_failures = true;
     mc->default_ram_size = 64 * MiB;
-    mc->default_ram_id = "ram";
 }
 
 DEFINE_MACHINE("canon-a1100", canon_a1100_machine_init)
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
index 33ace66..3d49dcc 100644
--- a/hw/arm/raspi.c
+++ b/hw/arm/raspi.c
@@ -223,7 +223,6 @@ static void raspi2_machine_init(MachineClass *mc)
     mc->min_cpus = BCM283X_NCPUS;
     mc->default_cpus = BCM283X_NCPUS;
     mc->default_ram_size = 1 * GiB;
-    mc->default_ram_id = "ram";
     mc->ignore_memory_transaction_failures = true;
 };
 DEFINE_MACHINE("raspi2", raspi2_machine_init)
@@ -246,7 +245,6 @@ static void raspi3_machine_init(MachineClass *mc)
     mc->min_cpus = BCM283X_NCPUS;
     mc->default_cpus = BCM283X_NCPUS;
     mc->default_ram_size = 1 * GiB;
-    mc->default_ram_id = "ram";
 }
 DEFINE_MACHINE("raspi3", raspi3_machine_init)
 #endif
diff --git a/hw/core/machine.c b/hw/core/machine.c
index 080ce57..a938052 100644
--- a/hw/core/machine.c
+++ b/hw/core/machine.c
@@ -711,6 +711,7 @@ static void machine_class_init(ObjectClass *oc, void *data)
 
     /* Default 128 MB as guest ram size */
     mc->default_ram_size = 128 * MiB;
+    mc->default_ram_id = "ram";
     mc->rom_file_has_mr = true;
     mc->smp_parse = smp_parse;
 
diff --git a/hw/core/null-machine.c b/hw/core/null-machine.c
index cb47d9d..08c6109 100644
--- a/hw/core/null-machine.c
+++ b/hw/core/null-machine.c
@@ -49,7 +49,6 @@ static void machine_none_machine_init(MachineClass *mc)
     mc->init = machine_none_init;
     mc->max_cpus = 1;
     mc->default_ram_size = 0;
-    mc->default_ram_id = "ram";
 }
 
 DEFINE_MACHINE("none", machine_none_machine_init)
diff --git a/hw/core/numa.c b/hw/core/numa.c
index 623b307..6a1711d 100644
--- a/hw/core/numa.c
+++ b/hw/core/numa.c
@@ -459,7 +459,7 @@ void numa_complete_configuration(MachineState *ms)
             exit(1);
         }
 
-        if (!numa_uses_legacy_mem() && mc->default_ram_id) {
+        if (!numa_uses_legacy_mem()) {
             ms->ram = g_new(MemoryRegion, 1);
             memory_region_init(ms->ram, OBJECT(ms), mc->default_ram_id,
                                ram_size);
diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
index b2f7bc5..ebbf44f 100644
--- a/hw/hppa/machine.c
+++ b/hw/hppa/machine.c
@@ -279,7 +279,6 @@ static void machine_hppa_machine_init(MachineClass *mc)
     mc->is_default = 1;
     mc->default_ram_size = 512 * MiB;
     mc->default_boot_order = "cd";
-    mc->default_ram_id = "ram";
 }
 
 DEFINE_MACHINE("hppa", machine_hppa_machine_init)
diff --git a/hw/ppc/virtex_ml507.c b/hw/ppc/virtex_ml507.c
index b74a269..b31f1cf 100644
--- a/hw/ppc/virtex_ml507.c
+++ b/hw/ppc/virtex_ml507.c
@@ -299,7 +299,6 @@ static void virtex_machine_init(MachineClass *mc)
     mc->desc = "Xilinx Virtex ML507 reference design";
     mc->init = virtex_init;
     mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("440-xilinx");
-    mc->default_ram_id = "ram";
 }
 
 DEFINE_MACHINE("virtex-ml507", virtex_machine_init)
diff --git a/vl.c b/vl.c
index b89e76c..60dffb4 100644
--- a/vl.c
+++ b/vl.c
@@ -4296,7 +4296,6 @@ int main(int argc, char **argv, char **envp)
 
     if (numa_uses_legacy_mem() &&
         machine_class->default_ram_size &&
-        machine_class->default_ram_id &&
         !current_machine->ram_memdev) {
         create_default_memdev(current_machine, mem_path, mem_prealloc);
     }
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 77/86] exec: cleanup qemu_minrampagesize()/qemu_maxrampagesize()
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (75 preceding siblings ...)
  2019-12-31 13:04 ` [PATCH 76/86] post conversion default_ram_id cleanup Igor Mammedov
@ 2019-12-31 13:04 ` Igor Mammedov
  2019-12-31 13:04 ` [PATCH 78/86] exec: drop bogus mem_path from qemu_ram_alloc_from_fd() Igor Mammedov
                   ` (9 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:04 UTC (permalink / raw)
  To: qemu-devel

Since all RAM is backed by hostmem backends, drop
global -mem-path invariant and simplify code.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 exec.c | 51 +++++----------------------------------------------
 1 file changed, 5 insertions(+), 46 deletions(-)

diff --git a/exec.c b/exec.c
index d4b769d..7b6e376 100644
--- a/exec.c
+++ b/exec.c
@@ -1667,60 +1667,19 @@ static int find_max_backend_pagesize(Object *obj, void *opaque)
  */
 long qemu_minrampagesize(void)
 {
-    long hpsize = LONG_MAX;
-    long mainrampagesize;
-    Object *memdev_root;
-    MachineState *ms = MACHINE(qdev_get_machine());
-
-    mainrampagesize = qemu_mempath_getpagesize(mem_path);
-
-    /* it's possible we have memory-backend objects with
-     * hugepage-backed RAM. these may get mapped into system
-     * address space via -numa parameters or memory hotplug
-     * hooks. we want to take these into account, but we
-     * also want to make sure these supported hugepage
-     * sizes are applicable across the entire range of memory
-     * we may boot from, so we take the min across all
-     * backends, and assume normal pages in cases where a
-     * backend isn't backed by hugepages.
-     */
-    memdev_root = object_resolve_path("/objects", NULL);
-    if (memdev_root) {
-        object_child_foreach(memdev_root, find_min_backend_pagesize, &hpsize);
-    }
-    if (hpsize == LONG_MAX) {
-        /* No additional memory regions found ==> Report main RAM page size */
-        return mainrampagesize;
-    }
-
-    /* If NUMA is disabled or the NUMA nodes are not backed with a
-     * memory-backend, then there is at least one node using "normal" RAM,
-     * so if its page size is smaller we have got to report that size instead.
-     */
-    if (hpsize > mainrampagesize &&
-        (ms->numa_state == NULL ||
-         ms->numa_state->num_nodes == 0 ||
-         ms->numa_state->nodes[0].node_memdev == NULL)) {
-        static bool warned;
-        if (!warned) {
-            error_report("Huge page support disabled (n/a for main memory).");
-            warned = true;
-        }
-        return mainrampagesize;
-    }
+    long hpsize;
+    Object *memdev_root = object_resolve_path("/objects", NULL);
 
+    object_child_foreach(memdev_root, find_min_backend_pagesize, &hpsize);
     return hpsize;
 }
 
 long qemu_maxrampagesize(void)
 {
-    long pagesize = qemu_mempath_getpagesize(mem_path);
+    long pagesize;
     Object *memdev_root = object_resolve_path("/objects", NULL);
 
-    if (memdev_root) {
-        object_child_foreach(memdev_root, find_max_backend_pagesize,
-                             &pagesize);
-    }
+    object_child_foreach(memdev_root, find_max_backend_pagesize, &pagesize);
     return pagesize;
 }
 #else
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 78/86] exec: drop bogus mem_path from qemu_ram_alloc_from_fd()
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (76 preceding siblings ...)
  2019-12-31 13:04 ` [PATCH 77/86] exec: cleanup qemu_minrampagesize()/qemu_maxrampagesize() Igor Mammedov
@ 2019-12-31 13:04 ` Igor Mammedov
  2019-12-31 13:04 ` [PATCH 79/86] make mem_path local variable Igor Mammedov
                   ` (8 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:04 UTC (permalink / raw)
  To: qemu-devel

Function will report error that will mention global mem_path,
which was valid the only if legacy -mem-path was used and
only in case of main RAM.

However it doesn't work with hostmem backends
(for example:
"
  qemu: -object memory-backend-file,id=ram0,size=128M,mem-path=foo:
    backing store (null) size 0x200000 does not match 'size' option 0x8000000
")
and couldn't possibly work in general FD case the function
is supposed to handle.

Taking in account that main RAM was converted into
memory-backend-foo object, there is no point in printing
file name (from inappropriate place) as failing path is
a part of backend's error message.

Hence drop bogus mem_path usage from qemu_ram_alloc_from_fd(),
it's a job of its user to add file name to error message if applicable.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 exec.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/exec.c b/exec.c
index 7b6e376..d0a7e7e 100644
--- a/exec.c
+++ b/exec.c
@@ -2308,9 +2308,9 @@ RAMBlock *qemu_ram_alloc_from_fd(ram_addr_t size, MemoryRegion *mr,
     size = HOST_PAGE_ALIGN(size);
     file_size = get_file_size(fd);
     if (file_size > 0 && file_size < size) {
-        error_setg(errp, "backing store %s size 0x%" PRIx64
+        error_setg(errp, "backing store size 0x%" PRIx64
                    " does not match 'size' option 0x" RAM_ADDR_FMT,
-                   mem_path, file_size, size);
+                   file_size, size);
         return NULL;
     }
 
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 79/86] make mem_path local variable
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (77 preceding siblings ...)
  2019-12-31 13:04 ` [PATCH 78/86] exec: drop bogus mem_path from qemu_ram_alloc_from_fd() Igor Mammedov
@ 2019-12-31 13:04 ` Igor Mammedov
  2019-12-31 13:04 ` [PATCH 80/86] hostmem: introduce "prealloc-threads" property Igor Mammedov
                   ` (7 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:04 UTC (permalink / raw)
  To: qemu-devel

It's no longer used anywhere beside main(),
so make it local variable that is used for CLI compat
purposes to keep -mem-path option working.

Under hood QEMU will use it to create
  memory-backend-file,mem-path=...
backend and use its MemoryRegion as main RAM.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 include/sysemu/sysemu.h | 1 -
 vl.c                    | 2 +-
 2 files changed, 1 insertion(+), 2 deletions(-)

diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h
index 80c57fd..8de9065 100644
--- a/include/sysemu/sysemu.h
+++ b/include/sysemu/sysemu.h
@@ -53,7 +53,6 @@ extern uint8_t *boot_splash_filedata;
 extern bool enable_mlock;
 extern bool enable_cpu_pm;
 extern QEMUClockType rtc_clock;
-extern const char *mem_path;
 extern int mem_prealloc;
 
 #define MAX_OPTION_ROMS 16
diff --git a/vl.c b/vl.c
index 60dffb4..4ee14f6 100644
--- a/vl.c
+++ b/vl.c
@@ -140,7 +140,6 @@ enum vga_retrace_method vga_retrace_method = VGA_RETRACE_DUMB;
 int display_opengl;
 const char* keyboard_layout = NULL;
 ram_addr_t ram_size;
-const char *mem_path = NULL;
 int mem_prealloc = 0; /* force preallocation of physical target memory */
 bool enable_mlock = false;
 bool enable_cpu_pm = false;
@@ -2868,6 +2867,7 @@ int main(int argc, char **argv, char **envp)
     Error *err = NULL;
     bool list_data_dirs = false;
     char *dir, **dirs;
+    const char *mem_path = NULL;
     BlockdevOptionsQueue bdo_queue = QSIMPLEQ_HEAD_INITIALIZER(bdo_queue);
     QemuPluginList plugin_list = QTAILQ_HEAD_INITIALIZER(plugin_list);
 
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 80/86] hostmem: introduce "prealloc-threads" property
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (78 preceding siblings ...)
  2019-12-31 13:04 ` [PATCH 79/86] make mem_path local variable Igor Mammedov
@ 2019-12-31 13:04 ` Igor Mammedov
  2019-12-31 13:04 ` [PATCH 81/86] hostmem: fix strict bind policy Igor Mammedov
                   ` (6 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:04 UTC (permalink / raw)
  To: qemu-devel

the property will allow user to specify number of threads to use
in pre-allocation stage. It also will allow to reduce implicit
hostmem dependency on current_machine.
On object creation it will default to 1, but via machine
compat property it will be updated to MachineState::smp::cpus
to keep current behavior for hostmem and main RAM (which is
now also hostmem based).

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 include/sysemu/hostmem.h |  2 ++
 backends/hostmem.c       | 43 +++++++++++++++++++++++++++++++++++++++----
 vl.c                     | 15 +++++++++++----
 3 files changed, 52 insertions(+), 8 deletions(-)

diff --git a/include/sysemu/hostmem.h b/include/sysemu/hostmem.h
index 5db0d66..bdf8666 100644
--- a/include/sysemu/hostmem.h
+++ b/include/sysemu/hostmem.h
@@ -61,6 +61,7 @@ struct HostMemoryBackendClass {
  * @parent: opaque parent object container
  * @size: amount of memory backend provides
  * @mr: MemoryRegion representing host memory belonging to backend
+ * @prealloc_threads: number of threads to be used for preallocatining RAM
  */
 struct HostMemoryBackend {
     /* private */
@@ -70,6 +71,7 @@ struct HostMemoryBackend {
     uint64_t size;
     bool merge, dump, use_canonical_path;
     bool prealloc, force_prealloc, is_mapped, share;
+    uint32_t prealloc_threads;
     DECLARE_BITMAP(host_nodes, MAX_NODES + 1);
     HostMemPolicy policy;
 
diff --git a/backends/hostmem.c b/backends/hostmem.c
index e773bdf..4c23c77 100644
--- a/backends/hostmem.c
+++ b/backends/hostmem.c
@@ -223,7 +223,6 @@ static void host_memory_backend_set_prealloc(Object *obj, bool value,
 {
     Error *local_err = NULL;
     HostMemoryBackend *backend = MEMORY_BACKEND(obj);
-    MachineState *ms = MACHINE(qdev_get_machine());
 
     if (backend->force_prealloc) {
         if (value) {
@@ -243,7 +242,7 @@ static void host_memory_backend_set_prealloc(Object *obj, bool value,
         void *ptr = memory_region_get_ram_ptr(&backend->mr);
         uint64_t sz = memory_region_size(&backend->mr);
 
-        os_mem_prealloc(fd, ptr, sz, ms->smp.cpus, &local_err);
+        os_mem_prealloc(fd, ptr, sz, backend->prealloc_threads, &local_err);
         if (local_err) {
             error_propagate(errp, local_err);
             return;
@@ -252,14 +251,45 @@ static void host_memory_backend_set_prealloc(Object *obj, bool value,
     }
 }
 
+static void host_memory_backend_get_prealloc_threads(Object *obj, Visitor *v,
+    const char *name, void *opaque, Error **errp)
+{
+    HostMemoryBackend *backend = MEMORY_BACKEND(obj);
+    visit_type_uint32(v, name, &backend->prealloc_threads, errp);
+}
+
+static void host_memory_backend_set_prealloc_threads(Object *obj, Visitor *v,
+    const char *name, void *opaque, Error **errp)
+{
+    HostMemoryBackend *backend = MEMORY_BACKEND(obj);
+    Error *local_err = NULL;
+    uint32_t value;
+
+    visit_type_uint32(v, name, &value, &local_err);
+    if (local_err) {
+        goto out;
+    }
+    if (value <= 0) {
+        error_setg(&local_err,
+                   "property '%s' of %s doesn't take value '%d'",
+                   name, object_get_typename(obj), value);
+        goto out;
+    }
+    backend->prealloc_threads = value;
+out:
+    error_propagate(errp, local_err);
+}
+
 static void host_memory_backend_init(Object *obj)
 {
     HostMemoryBackend *backend = MEMORY_BACKEND(obj);
     MachineState *machine = MACHINE(qdev_get_machine());
 
+    /* TODO: convert this compat properties */
     backend->merge = machine_mem_merge(machine);
     backend->dump = machine_dump_guest_core(machine);
     backend->prealloc = mem_prealloc;
+    backend->prealloc_threads = 1;
 }
 
 static void host_memory_backend_post_init(Object *obj)
@@ -313,7 +343,6 @@ host_memory_backend_memory_complete(UserCreatable *uc, Error **errp)
 {
     HostMemoryBackend *backend = MEMORY_BACKEND(uc);
     HostMemoryBackendClass *bc = MEMORY_BACKEND_GET_CLASS(uc);
-    MachineState *ms = MACHINE(qdev_get_machine());
     Error *local_err = NULL;
     void *ptr;
     uint64_t sz;
@@ -378,7 +407,7 @@ host_memory_backend_memory_complete(UserCreatable *uc, Error **errp)
          */
         if (backend->prealloc) {
             os_mem_prealloc(memory_region_get_fd(&backend->mr), ptr, sz,
-                            ms->smp.cpus, &local_err);
+                            backend->prealloc_threads, &local_err);
             if (local_err) {
                 goto out;
             }
@@ -456,6 +485,12 @@ host_memory_backend_class_init(ObjectClass *oc, void *data)
         host_memory_backend_set_prealloc, &error_abort);
     object_class_property_set_description(oc, "prealloc",
         "Preallocate memory", &error_abort);
+    object_class_property_add(oc, "prealloc-threads", "int",
+        host_memory_backend_get_prealloc_threads,
+        host_memory_backend_set_prealloc_threads,
+        NULL, NULL, &error_abort);
+    object_class_property_set_description(oc, "prealloc-threads",
+        "Number of CPU threads to use for prealloc", &error_abort);
     object_class_property_add(oc, "size", "int",
         host_memory_backend_get_size,
         host_memory_backend_set_size,
diff --git a/vl.c b/vl.c
index 4ee14f6..61501cc 100644
--- a/vl.c
+++ b/vl.c
@@ -2814,8 +2814,7 @@ static void configure_accelerators(const char *progname)
     }
 }
 
-static void create_default_memdev(MachineState *ms, const char *path,
-                                  bool prealloc)
+static void create_default_memdev(MachineState *ms, const char *path)
 {
     Object *obj;
     MachineClass *mc = MACHINE_GET_CLASS(ms);
@@ -2824,7 +2823,6 @@ static void create_default_memdev(MachineState *ms, const char *path,
     if (path) {
         object_property_set_str(obj, path, "mem-path", &error_fatal);
     }
-    object_property_set_bool(obj, prealloc, "prealloc", &error_fatal);
     object_property_set_int(obj, ms->ram_size, "size", &error_fatal);
     object_property_add_child(object_get_objects_root(), mc->default_ram_id,
                               obj, &error_fatal);
@@ -3967,6 +3965,15 @@ int main(int argc, char **argv, char **envp)
         exit(1);
     }
 
+    if (mem_prealloc) {
+        static GlobalProperty p[] = {
+            {"memory-backend", "prealloc-threads", NULL},
+        };
+
+        p[0].value = g_strdup_printf("%d", current_machine->smp.cpus);
+        compat_props_add(machine_class->compat_props, p, G_N_ELEMENTS(p));
+    }
+
     /*
      * Get the default machine options from the machine if it is not already
      * specified either by the configuration file or by the command line.
@@ -4297,7 +4304,7 @@ int main(int argc, char **argv, char **envp)
     if (numa_uses_legacy_mem() &&
         machine_class->default_ram_size &&
         !current_machine->ram_memdev) {
-        create_default_memdev(current_machine, mem_path, mem_prealloc);
+        create_default_memdev(current_machine, mem_path);
     }
     /* do monitor/qmp handling at preconfig state if requested */
     main_loop();
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 81/86] hostmem: fix strict bind policy
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (79 preceding siblings ...)
  2019-12-31 13:04 ` [PATCH 80/86] hostmem: introduce "prealloc-threads" property Igor Mammedov
@ 2019-12-31 13:04 ` Igor Mammedov
  2019-12-31 13:04 ` [PATCH 82/86] numa: forbid '-numa node, mem' for 5.0 and newer machine types Igor Mammedov
                   ` (5 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:04 UTC (permalink / raw)
  To: qemu-devel

When option -mem-prealloc is used with one or more memory-backend
objects, created backends may not obey configured bind policy or
creation may fail after kernel attempts to move pages according
to bind policy.
Reason is in file_ram_alloc(), which will pre-allocate
any descriptor based RAM if global mem_prealloc != 0 and that
happens way before bind policy is applied to memory range.

One way to fix it would be to extend memory_region_foo() API
and add more invariants that could broken later due implicit
dependencies that's hard to track.

Another approach is to drop adhoc main RAM allocation and
consolidate it around memory-backend. That allows to have
single place that allocates guest RAM (main and memdev)
in the same way and then global mem_prealloc could be
replaced by backend's property[s] that will affect created
memory-backend objects but only in correct order this time.

With main RAM now converted to hostmem backends, there is no
point in keeping global mem_prealloc around, so alias
 -mem-prealloc to "memory-backend.prealloc=on"
machine compat[*] property and make mem_prealloc a local
variable to only stir registration of compat property.

*) currently user accessible -global works only with DEVICE
   based objects and extra work is needed to make it work
   with hostmem backends. But that is convenience option
   and out of scope of this already huge refactoring.
   Hence machine compat properties were used.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 include/sysemu/hostmem.h |  2 +-
 include/sysemu/sysemu.h  |  1 -
 backends/hostmem-file.c  |  1 -
 backends/hostmem-memfd.c |  1 -
 backends/hostmem.c       | 12 +-----------
 exec.c                   | 11 -----------
 vl.c                     |  3 ++-
 7 files changed, 4 insertions(+), 27 deletions(-)

diff --git a/include/sysemu/hostmem.h b/include/sysemu/hostmem.h
index bdf8666..8276e53 100644
--- a/include/sysemu/hostmem.h
+++ b/include/sysemu/hostmem.h
@@ -70,7 +70,7 @@ struct HostMemoryBackend {
     /* protected */
     uint64_t size;
     bool merge, dump, use_canonical_path;
-    bool prealloc, force_prealloc, is_mapped, share;
+    bool prealloc, is_mapped, share;
     uint32_t prealloc_threads;
     DECLARE_BITMAP(host_nodes, MAX_NODES + 1);
     HostMemPolicy policy;
diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h
index 8de9065..b72c773 100644
--- a/include/sysemu/sysemu.h
+++ b/include/sysemu/sysemu.h
@@ -53,7 +53,6 @@ extern uint8_t *boot_splash_filedata;
 extern bool enable_mlock;
 extern bool enable_cpu_pm;
 extern QEMUClockType rtc_clock;
-extern int mem_prealloc;
 
 #define MAX_OPTION_ROMS 16
 typedef struct QEMUOptionRom {
diff --git a/backends/hostmem-file.c b/backends/hostmem-file.c
index cb319a9..c8c355f 100644
--- a/backends/hostmem-file.c
+++ b/backends/hostmem-file.c
@@ -51,7 +51,6 @@ file_backend_memory_alloc(HostMemoryBackend *backend, Error **errp)
         return;
     }
 
-    backend->force_prealloc = mem_prealloc;
     name = host_memory_backend_get_name(backend);
     memory_region_init_ram_from_file(&backend->mr, OBJECT(backend),
                                      name,
diff --git a/backends/hostmem-memfd.c b/backends/hostmem-memfd.c
index 26070b4..74ba987 100644
--- a/backends/hostmem-memfd.c
+++ b/backends/hostmem-memfd.c
@@ -45,7 +45,6 @@ memfd_backend_memory_alloc(HostMemoryBackend *backend, Error **errp)
         return;
     }
 
-    backend->force_prealloc = mem_prealloc;
     fd = qemu_memfd_create(TYPE_MEMORY_BACKEND_MEMFD, backend->size,
                            m->hugetlb, m->hugetlbsize, m->seal ?
                            F_SEAL_GROW | F_SEAL_SHRINK | F_SEAL_SEAL : 0,
diff --git a/backends/hostmem.c b/backends/hostmem.c
index 4c23c77..1f09ade 100644
--- a/backends/hostmem.c
+++ b/backends/hostmem.c
@@ -215,7 +215,7 @@ static bool host_memory_backend_get_prealloc(Object *obj, Error **errp)
 {
     HostMemoryBackend *backend = MEMORY_BACKEND(obj);
 
-    return backend->prealloc || backend->force_prealloc;
+    return backend->prealloc;
 }
 
 static void host_memory_backend_set_prealloc(Object *obj, bool value,
@@ -224,14 +224,6 @@ static void host_memory_backend_set_prealloc(Object *obj, bool value,
     Error *local_err = NULL;
     HostMemoryBackend *backend = MEMORY_BACKEND(obj);
 
-    if (backend->force_prealloc) {
-        if (value) {
-            error_setg(errp,
-                       "remove -mem-prealloc to use the prealloc property");
-            return;
-        }
-    }
-
     if (!host_memory_backend_mr_inited(backend)) {
         backend->prealloc = value;
         return;
@@ -288,8 +280,6 @@ static void host_memory_backend_init(Object *obj)
     /* TODO: convert this compat properties */
     backend->merge = machine_mem_merge(machine);
     backend->dump = machine_dump_guest_core(machine);
-    backend->prealloc = mem_prealloc;
-    backend->prealloc_threads = 1;
 }
 
 static void host_memory_backend_post_init(Object *obj)
diff --git a/exec.c b/exec.c
index d0a7e7e..cbe5bc5 100644
--- a/exec.c
+++ b/exec.c
@@ -1802,8 +1802,6 @@ static void *file_ram_alloc(RAMBlock *block,
                             bool truncate,
                             Error **errp)
 {
-    Error *err = NULL;
-    MachineState *ms = MACHINE(qdev_get_machine());
     void *area;
 
     block->page_size = qemu_fd_getpagesize(fd);
@@ -1859,15 +1857,6 @@ static void *file_ram_alloc(RAMBlock *block,
         return NULL;
     }
 
-    if (mem_prealloc) {
-        os_mem_prealloc(fd, area, memory, ms->smp.cpus, &err);
-        if (err) {
-            error_propagate(errp, err);
-            qemu_ram_munmap(fd, area, memory);
-            return NULL;
-        }
-    }
-
     block->fd = fd;
     return area;
 }
diff --git a/vl.c b/vl.c
index 61501cc..e0ec743 100644
--- a/vl.c
+++ b/vl.c
@@ -140,7 +140,6 @@ enum vga_retrace_method vga_retrace_method = VGA_RETRACE_DUMB;
 int display_opengl;
 const char* keyboard_layout = NULL;
 ram_addr_t ram_size;
-int mem_prealloc = 0; /* force preallocation of physical target memory */
 bool enable_mlock = false;
 bool enable_cpu_pm = false;
 int nb_nics;
@@ -2868,6 +2867,7 @@ int main(int argc, char **argv, char **envp)
     const char *mem_path = NULL;
     BlockdevOptionsQueue bdo_queue = QSIMPLEQ_HEAD_INITIALIZER(bdo_queue);
     QemuPluginList plugin_list = QTAILQ_HEAD_INITIALIZER(plugin_list);
+    int mem_prealloc = 0; /* force preallocation of physical target memory */
 
     os_set_line_buffering();
 
@@ -3968,6 +3968,7 @@ int main(int argc, char **argv, char **envp)
     if (mem_prealloc) {
         static GlobalProperty p[] = {
             {"memory-backend", "prealloc-threads", NULL},
+            {"memory-backend", "prealloc", "on"},
         };
 
         p[0].value = g_strdup_printf("%d", current_machine->smp.cpus);
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 82/86] numa: forbid '-numa node, mem' for 5.0 and newer machine types
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (80 preceding siblings ...)
  2019-12-31 13:04 ` [PATCH 81/86] hostmem: fix strict bind policy Igor Mammedov
@ 2019-12-31 13:04 ` Igor Mammedov
  2019-12-31 13:04 ` [PATCH 83/86] tests:numa-test: make top level args dynamic and g_autofree(cli) cleanups Igor Mammedov
                   ` (4 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:04 UTC (permalink / raw)
  To: qemu-devel

Deprecation period is ran out and it's a time to flip the switch
introduced by cd5ff8333a.
Disable legacy option for new machine types and amend documentation.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/arm/virt.c        |  2 +-
 hw/core/numa.c       |  6 ++++++
 hw/i386/pc.c         |  1 -
 hw/i386/pc_piix.c    |  1 +
 hw/i386/pc_q35.c     |  1 +
 hw/ppc/spapr.c       |  2 +-
 qemu-deprecated.texi | 16 ----------------
 qemu-options.hx      |  8 ++++----
 8 files changed, 14 insertions(+), 23 deletions(-)

diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index e2fbca3..49de0d8 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -2049,7 +2049,6 @@ static void virt_machine_class_init(ObjectClass *oc, void *data)
     hc->pre_plug = virt_machine_device_pre_plug_cb;
     hc->plug = virt_machine_device_plug_cb;
     hc->unplug_request = virt_machine_device_unplug_request_cb;
-    mc->numa_mem_supported = true;
     mc->auto_enable_numa_with_memhp = true;
     mc->default_ram_id = "mach-virt.ram";
 }
@@ -2153,6 +2152,7 @@ DEFINE_VIRT_MACHINE_AS_LATEST(5, 0)
 static void virt_machine_4_2_options(MachineClass *mc)
 {
     compat_props_add(mc->compat_props, hw_compat_4_2, hw_compat_4_2_len);
+    mc->numa_mem_supported = true;
 }
 DEFINE_VIRT_MACHINE(4, 2)
 
diff --git a/hw/core/numa.c b/hw/core/numa.c
index 6a1711d..beb6d2e 100644
--- a/hw/core/numa.c
+++ b/hw/core/numa.c
@@ -116,6 +116,12 @@ static void parse_numa_node(MachineState *ms, NumaNodeOptions *node,
     }
 
     if (node->has_mem) {
+        if (!mc->numa_mem_supported) {
+            error_setg(errp, "Parameter -numa node,mem is not supported by this"
+                      " machine type. Use -numa node,memdev instead");
+            return;
+        }
+
         numa_info[nodenr].node_mem = node->mem;
         if (!qtest_enabled()) {
             warn_report("Parameter -numa node,mem is deprecated,"
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index aa956aa..80cd971 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -1948,7 +1948,6 @@ static void pc_machine_class_init(ObjectClass *oc, void *data)
     hc->unplug = pc_machine_device_unplug_cb;
     mc->default_cpu_type = TARGET_DEFAULT_CPU_TYPE;
     mc->nvdimm_supported = true;
-    mc->numa_mem_supported = true;
     mc->default_ram_id = "pc.ram";
 
     object_class_property_add(oc, PC_MACHINE_DEVMEM_REGION_SIZE, "int",
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index 721c7aa..b2805fe 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -436,6 +436,7 @@ static void pc_i440fx_4_2_machine_options(MachineClass *m)
     pc_i440fx_5_0_machine_options(m);
     m->alias = NULL;
     m->is_default = 0;
+    m->numa_mem_supported = true;
     compat_props_add(m->compat_props, hw_compat_4_2, hw_compat_4_2_len);
     compat_props_add(m->compat_props, pc_compat_4_2, pc_compat_4_2_len);
 }
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
index 52f4573..f15711b 100644
--- a/hw/i386/pc_q35.c
+++ b/hw/i386/pc_q35.c
@@ -364,6 +364,7 @@ static void pc_q35_4_2_machine_options(MachineClass *m)
 {
     pc_q35_5_0_machine_options(m);
     m->alias = NULL;
+    m->numa_mem_supported = true;
     compat_props_add(m->compat_props, hw_compat_4_2, hw_compat_4_2_len);
     compat_props_add(m->compat_props, pc_compat_4_2, pc_compat_4_2_len);
 }
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index 915e36a..6527962 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -4385,7 +4385,6 @@ static void spapr_machine_class_init(ObjectClass *oc, void *data)
      * in which LMBs are represented and hot-added
      */
     mc->numa_mem_align_shift = 28;
-    mc->numa_mem_supported = true;
     mc->auto_enable_numa = true;
 
     smc->default_caps.caps[SPAPR_CAP_HTM] = SPAPR_CAP_OFF;
@@ -4467,6 +4466,7 @@ static void spapr_machine_4_2_class_options(MachineClass *mc)
 {
     spapr_machine_5_0_class_options(mc);
     compat_props_add(mc->compat_props, hw_compat_4_2, hw_compat_4_2_len);
+    mc->numa_mem_supported = true;
 }
 
 DEFINE_SPAPR_MACHINE(4_2, "4.2", false);
diff --git a/qemu-deprecated.texi b/qemu-deprecated.texi
index 5178905..d9b07ba 100644
--- a/qemu-deprecated.texi
+++ b/qemu-deprecated.texi
@@ -89,22 +89,6 @@ error in the future.
 The @code{-realtime mlock=on|off} argument has been replaced by the
 @code{-overcommit mem-lock=on|off} argument.
 
-@subsection -numa node,mem=@var{size} (since 4.1)
-
-The parameter @option{mem} of @option{-numa node} is used to assign a part of
-guest RAM to a NUMA node. But when using it, it's impossible to manage specified
-RAM chunk on the host side (like bind it to a host node, setting bind policy, ...),
-so guest end-ups with the fake NUMA configuration with suboptiomal performance.
-However since 2014 there is an alternative way to assign RAM to a NUMA node
-using parameter @option{memdev}, which does the same as @option{mem} and adds
-means to actualy manage node RAM on the host side. Use parameter @option{memdev}
-with @var{memory-backend-ram} backend as an replacement for parameter @option{mem}
-to achieve the same fake NUMA effect or a properly configured
-@var{memory-backend-file} backend to actually benefit from NUMA configuration.
-In future new machine versions will not accept the option but it will still
-work with old machine types. User can check QAPI schema to see if the legacy
-option is supported by looking at MachineInfo::numa-mem-supported property.
-
 @subsection -numa node (without memory specified) (since 4.1)
 
 Splitting RAM by default between NUMA nodes has the same issues as @option{mem}
diff --git a/qemu-options.hx b/qemu-options.hx
index e9d6231..088dd32 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -214,10 +214,10 @@ For example:
 -numa cpu,node-id=0,socket-id=0 -numa cpu,node-id=1,socket-id=1
 @end example
 
-@samp{mem} assigns a given RAM amount to a node. @samp{memdev}
-assigns RAM from a given memory backend device to a node. If
-@samp{mem} and @samp{memdev} are omitted in all nodes, RAM is
-split equally between them.
+Legacy @samp{mem} assigns a given RAM amount to a node (not supported for 5.0
+and newer machine types). @samp{memdev} assigns RAM from a given memory backend
+device to a node. If @samp{mem} and @samp{memdev} are omitted in all nodes, RAM
+is split equally between them.
 
 @samp{mem} and @samp{memdev} are mutually exclusive. Furthermore,
 if one node uses @samp{memdev}, all of them have to use it.
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 83/86] tests:numa-test: make top level args dynamic and g_autofree(cli) cleanups
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (81 preceding siblings ...)
  2019-12-31 13:04 ` [PATCH 82/86] numa: forbid '-numa node, mem' for 5.0 and newer machine types Igor Mammedov
@ 2019-12-31 13:04 ` Igor Mammedov
  2019-12-31 13:04 ` [PATCH 84/86] tests:numa-test: use explicit memdev to specify node RAM Igor Mammedov
                   ` (3 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:04 UTC (permalink / raw)
  To: qemu-devel

Use GString to pass argument to make_cli() so that it would be easy
to dynamically change test case arguments from main(). The follow up
patch will use it to change RAM size options depending on target.

While at it cleanup 'cli' freeing, using g_autofree annotation.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
PS:
  make as separate patch so it won't clutter follow up testcase changes.
---
 tests/numa-test.c | 38 ++++++++++++++------------------------
 1 file changed, 14 insertions(+), 24 deletions(-)

diff --git a/tests/numa-test.c b/tests/numa-test.c
index 8de8581..6f7aab9 100644
--- a/tests/numa-test.c
+++ b/tests/numa-test.c
@@ -14,16 +14,16 @@
 #include "qapi/qmp/qdict.h"
 #include "qapi/qmp/qlist.h"
 
-static char *make_cli(const char *generic_cli, const char *test_cli)
+static char *make_cli(const GString *generic_cli, const char *test_cli)
 {
-    return g_strdup_printf("%s %s", generic_cli ? generic_cli : "", test_cli);
+    return g_strdup_printf("%s %s", generic_cli->str, test_cli);
 }
 
 static void test_mon_explicit(const void *data)
 {
-    char *s;
-    char *cli;
     QTestState *qts;
+    g_autofree char *s = NULL;
+    g_autofree char *cli = NULL;
 
     cli = make_cli(data, "-smp 8 "
                    "-numa node,nodeid=0,cpus=0-3 "
@@ -33,17 +33,15 @@ static void test_mon_explicit(const void *data)
     s = qtest_hmp(qts, "info numa");
     g_assert(strstr(s, "node 0 cpus: 0 1 2 3"));
     g_assert(strstr(s, "node 1 cpus: 4 5 6 7"));
-    g_free(s);
 
     qtest_quit(qts);
-    g_free(cli);
 }
 
 static void test_mon_default(const void *data)
 {
-    char *s;
-    char *cli;
     QTestState *qts;
+    g_autofree char *s = NULL;
+    g_autofree char *cli = NULL;
 
     cli = make_cli(data, "-smp 8 -numa node -numa node");
     qts = qtest_init(cli);
@@ -51,17 +49,15 @@ static void test_mon_default(const void *data)
     s = qtest_hmp(qts, "info numa");
     g_assert(strstr(s, "node 0 cpus: 0 2 4 6"));
     g_assert(strstr(s, "node 1 cpus: 1 3 5 7"));
-    g_free(s);
 
     qtest_quit(qts);
-    g_free(cli);
 }
 
 static void test_mon_partial(const void *data)
 {
-    char *s;
-    char *cli;
     QTestState *qts;
+    g_autofree char *s = NULL;
+    g_autofree char *cli = NULL;
 
     cli = make_cli(data, "-smp 8 "
                    "-numa node,nodeid=0,cpus=0-1 "
@@ -71,10 +67,8 @@ static void test_mon_partial(const void *data)
     s = qtest_hmp(qts, "info numa");
     g_assert(strstr(s, "node 0 cpus: 0 1 2 3 6 7"));
     g_assert(strstr(s, "node 1 cpus: 4 5"));
-    g_free(s);
 
     qtest_quit(qts);
-    g_free(cli);
 }
 
 static QList *get_cpus(QTestState *qts, QDict **resp)
@@ -87,11 +81,11 @@ static QList *get_cpus(QTestState *qts, QDict **resp)
 
 static void test_query_cpus(const void *data)
 {
-    char *cli;
     QDict *resp;
     QList *cpus;
     QObject *e;
     QTestState *qts;
+    g_autofree char *cli = NULL;
 
     cli = make_cli(data, "-smp 8 -numa node,cpus=0-3 -numa node,cpus=4-7");
     qts = qtest_init(cli);
@@ -120,16 +114,15 @@ static void test_query_cpus(const void *data)
 
     qobject_unref(resp);
     qtest_quit(qts);
-    g_free(cli);
 }
 
 static void pc_numa_cpu(const void *data)
 {
-    char *cli;
     QDict *resp;
     QList *cpus;
     QObject *e;
     QTestState *qts;
+    g_autofree char *cli = NULL;
 
     cli = make_cli(data, "-cpu pentium -smp 8,sockets=2,cores=2,threads=2 "
         "-numa node,nodeid=0 -numa node,nodeid=1 "
@@ -174,16 +167,15 @@ static void pc_numa_cpu(const void *data)
 
     qobject_unref(resp);
     qtest_quit(qts);
-    g_free(cli);
 }
 
 static void spapr_numa_cpu(const void *data)
 {
-    char *cli;
     QDict *resp;
     QList *cpus;
     QObject *e;
     QTestState *qts;
+    g_autofree char *cli = NULL;
 
     cli = make_cli(data, "-smp 4,cores=4 "
         "-numa node,nodeid=0 -numa node,nodeid=1 "
@@ -220,16 +212,15 @@ static void spapr_numa_cpu(const void *data)
 
     qobject_unref(resp);
     qtest_quit(qts);
-    g_free(cli);
 }
 
 static void aarch64_numa_cpu(const void *data)
 {
-    char *cli;
     QDict *resp;
     QList *cpus;
     QObject *e;
     QTestState *qts;
+    g_autofree char *cli = NULL;
 
     cli = make_cli(data, "-smp 2 "
         "-numa node,nodeid=0 -numa node,nodeid=1 "
@@ -264,7 +255,6 @@ static void aarch64_numa_cpu(const void *data)
 
     qobject_unref(resp);
     qtest_quit(qts);
-    g_free(cli);
 }
 
 static void pc_dynamic_cpu_cfg(const void *data)
@@ -329,11 +319,11 @@ static void pc_dynamic_cpu_cfg(const void *data)
 
 int main(int argc, char **argv)
 {
-    const char *args = NULL;
+    g_autoptr(GString) args = g_string_new("");
     const char *arch = qtest_get_arch();
 
     if (strcmp(arch, "aarch64") == 0) {
-        args = "-machine virt";
+        g_string_append(args, " -machine virt");
     }
 
     g_test_init(&argc, &argv, NULL);
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 84/86] tests:numa-test: use explicit memdev to specify node RAM
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (82 preceding siblings ...)
  2019-12-31 13:04 ` [PATCH 83/86] tests:numa-test: make top level args dynamic and g_autofree(cli) cleanups Igor Mammedov
@ 2019-12-31 13:04 ` Igor Mammedov
  2019-12-31 13:04 ` [PATCH 85/86] numa: make exit() usage consistent Igor Mammedov
                   ` (2 subsequent siblings)
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:04 UTC (permalink / raw)
  To: qemu-devel

Follow up patches will remove automatic RAM distribution
between nodes and will make default machine types require
"memdev" option instead of legacy "mem" option.

Make tests to follow new rules and add an additional test
for legacy "mem" option on old machine type, to make sure
it won't regress in the future.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 tests/numa-test.c | 52 ++++++++++++++++++++++++++++++++++++++--------------
 1 file changed, 38 insertions(+), 14 deletions(-)

diff --git a/tests/numa-test.c b/tests/numa-test.c
index 6f7aab9..4d27220 100644
--- a/tests/numa-test.c
+++ b/tests/numa-test.c
@@ -25,9 +25,8 @@ static void test_mon_explicit(const void *data)
     g_autofree char *s = NULL;
     g_autofree char *cli = NULL;
 
-    cli = make_cli(data, "-smp 8 "
-                   "-numa node,nodeid=0,cpus=0-3 "
-                   "-numa node,nodeid=1,cpus=4-7 ");
+    cli = make_cli(data, "-smp 8 -numa node,nodeid=0,memdev=ram,cpus=0-3 "
+                         "-numa node,nodeid=1,cpus=4-7");
     qts = qtest_init(cli);
 
     s = qtest_hmp(qts, "info numa");
@@ -37,13 +36,13 @@ static void test_mon_explicit(const void *data)
     qtest_quit(qts);
 }
 
-static void test_mon_default(const void *data)
+static void test_def_cpu_split(const void *data)
 {
     QTestState *qts;
     g_autofree char *s = NULL;
     g_autofree char *cli = NULL;
 
-    cli = make_cli(data, "-smp 8 -numa node -numa node");
+    cli = make_cli(data, "-smp 8 -numa node,memdev=ram -numa node");
     qts = qtest_init(cli);
 
     s = qtest_hmp(qts, "info numa");
@@ -53,6 +52,23 @@ static void test_mon_default(const void *data)
     qtest_quit(qts);
 }
 
+static void test_pc_legacy_mem(const void *data)
+{
+    QTestState *qts;
+    g_autofree char *s = NULL;
+    g_autofree char *cli = NULL;
+
+    cli = make_cli(data, "-M pc-i440fx-4.2 -smp 8 "
+                         "-numa node,mem=64M -numa node,mem=64M");
+    qts = qtest_init(cli);
+
+    s = qtest_hmp(qts, "info numa");
+    g_assert(strstr(s, "node 0 size: 64 MB"));
+    g_assert(strstr(s, "node 1 size: 64 MB"));
+
+    qtest_quit(qts);
+}
+
 static void test_mon_partial(const void *data)
 {
     QTestState *qts;
@@ -60,7 +76,7 @@ static void test_mon_partial(const void *data)
     g_autofree char *cli = NULL;
 
     cli = make_cli(data, "-smp 8 "
-                   "-numa node,nodeid=0,cpus=0-1 "
+                   "-numa node,nodeid=0,memdev=ram,cpus=0-1 "
                    "-numa node,nodeid=1,cpus=4-5 ");
     qts = qtest_init(cli);
 
@@ -87,7 +103,8 @@ static void test_query_cpus(const void *data)
     QTestState *qts;
     g_autofree char *cli = NULL;
 
-    cli = make_cli(data, "-smp 8 -numa node,cpus=0-3 -numa node,cpus=4-7");
+    cli = make_cli(data, "-smp 8 -numa node,memdev=ram,cpus=0-3 "
+                         "-numa node,cpus=4-7");
     qts = qtest_init(cli);
     cpus = get_cpus(qts, &resp);
     g_assert(cpus);
@@ -125,7 +142,7 @@ static void pc_numa_cpu(const void *data)
     g_autofree char *cli = NULL;
 
     cli = make_cli(data, "-cpu pentium -smp 8,sockets=2,cores=2,threads=2 "
-        "-numa node,nodeid=0 -numa node,nodeid=1 "
+        "-numa node,nodeid=0,memdev=ram -numa node,nodeid=1 "
         "-numa cpu,node-id=1,socket-id=0 "
         "-numa cpu,node-id=0,socket-id=1,core-id=0 "
         "-numa cpu,node-id=0,socket-id=1,core-id=1,thread-id=0 "
@@ -178,7 +195,7 @@ static void spapr_numa_cpu(const void *data)
     g_autofree char *cli = NULL;
 
     cli = make_cli(data, "-smp 4,cores=4 "
-        "-numa node,nodeid=0 -numa node,nodeid=1 "
+        "-numa node,nodeid=0,memdev=ram -numa node,nodeid=1 "
         "-numa cpu,node-id=0,core-id=0 "
         "-numa cpu,node-id=0,core-id=1 "
         "-numa cpu,node-id=0,core-id=2 "
@@ -223,7 +240,7 @@ static void aarch64_numa_cpu(const void *data)
     g_autofree char *cli = NULL;
 
     cli = make_cli(data, "-smp 2 "
-        "-numa node,nodeid=0 -numa node,nodeid=1 "
+        "-numa node,nodeid=0,memdev=ram -numa node,nodeid=1 "
         "-numa cpu,node-id=1,thread-id=0 "
         "-numa cpu,node-id=0,thread-id=1");
     qts = qtest_init(cli);
@@ -263,13 +280,14 @@ static void pc_dynamic_cpu_cfg(const void *data)
     QDict *resp;
     QList *cpus;
     QTestState *qs;
+    g_autofree char *cli = NULL;
 
-    qs = qtest_initf("%s -nodefaults --preconfig -smp 2",
-                     data ? (char *)data : "");
+    cli = make_cli(data, "-nodefaults --preconfig -smp 2");
+    qs = qtest_init(cli);
 
     /* create 2 numa nodes */
     g_assert(!qmp_rsp_is_err(qtest_qmp(qs, "{ 'execute': 'set-numa-node',"
-        " 'arguments': { 'type': 'node', 'nodeid': 0 } }")));
+        " 'arguments': { 'type': 'node', 'nodeid': 0, 'memdev': 'ram' } }")));
     g_assert(!qmp_rsp_is_err(qtest_qmp(qs, "{ 'execute': 'set-numa-node',"
         " 'arguments': { 'type': 'node', 'nodeid': 1 } }")));
 
@@ -325,10 +343,15 @@ int main(int argc, char **argv)
     if (strcmp(arch, "aarch64") == 0) {
         g_string_append(args, " -machine virt");
     }
+    if (!strcmp(arch, "ppc64")) {
+        g_string_append(args, " -object memory-backend-ram,id=ram,size=512M");
+    } else {
+        g_string_append(args, " -object memory-backend-ram,id=ram,size=128M");
+    }
 
     g_test_init(&argc, &argv, NULL);
 
-    qtest_add_data_func("/numa/mon/default", args, test_mon_default);
+    qtest_add_data_func("/numa/mon/cpus/default", args, test_def_cpu_split);
     qtest_add_data_func("/numa/mon/cpus/explicit", args, test_mon_explicit);
     qtest_add_data_func("/numa/mon/cpus/partial", args, test_mon_partial);
     qtest_add_data_func("/numa/qmp/cpus/query-cpus", args, test_query_cpus);
@@ -336,6 +359,7 @@ int main(int argc, char **argv)
     if (!strcmp(arch, "i386") || !strcmp(arch, "x86_64")) {
         qtest_add_data_func("/numa/pc/cpu/explicit", args, pc_numa_cpu);
         qtest_add_data_func("/numa/pc/dynamic/cpu", args, pc_dynamic_cpu_cfg);
+        qtest_add_data_func("/numa/pc/legacy/mem", args, test_pc_legacy_mem);
     }
 
     if (!strcmp(arch, "ppc64")) {
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 85/86] numa: make exit() usage consistent
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (83 preceding siblings ...)
  2019-12-31 13:04 ` [PATCH 84/86] tests:numa-test: use explicit memdev to specify node RAM Igor Mammedov
@ 2019-12-31 13:04 ` Igor Mammedov
  2019-12-31 13:04 ` [PATCH 86/86] numa: remove deprecated implicit RAM distribution between nodes Igor Mammedov
  2019-12-31 15:58 ` [PATCH 00/86] refactor main RAM allocation to use hostmem backend Philippe Mathieu-Daudé
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:04 UTC (permalink / raw)
  To: qemu-devel

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/core/numa.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/hw/core/numa.c b/hw/core/numa.c
index beb6d2e..96776ff 100644
--- a/hw/core/numa.c
+++ b/hw/core/numa.c
@@ -421,7 +421,7 @@ void numa_complete_configuration(MachineState *ms)
         /* Report large node IDs first, to make mistakes easier to spot */
         if (!numa_info[i].present) {
             error_report("numa: Node ID missing: %d", i);
-            exit(1);
+            exit(EXIT_FAILURE);
         }
     }
 
@@ -462,7 +462,7 @@ void numa_complete_configuration(MachineState *ms)
             error_report("total memory for NUMA nodes (0x%" PRIx64 ")"
                          " should equal RAM size (0x" RAM_ADDR_FMT ")",
                          numa_total, ram_size);
-            exit(1);
+            exit(EXIT_FAILURE);
         }
 
         if (!numa_uses_legacy_mem()) {
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* [PATCH 86/86] numa: remove deprecated implicit RAM distribution between nodes
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (84 preceding siblings ...)
  2019-12-31 13:04 ` [PATCH 85/86] numa: make exit() usage consistent Igor Mammedov
@ 2019-12-31 13:04 ` Igor Mammedov
  2019-12-31 15:58 ` [PATCH 00/86] refactor main RAM allocation to use hostmem backend Philippe Mathieu-Daudé
  86 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 13:04 UTC (permalink / raw)
  To: qemu-devel

Feature has been deprecated since 4.1 (4bb4a273),
remove it.

As result if RAM distribution wasn't specified explicitly,
the machine won't start and CLI should be changed to explicitly
assign RAM to nodes using options:
  -node node,memdev  (5.0 and newer machine types)
  -node node,mem     (4.2 and older machine types)
It's recommended to use "memdev" variant for new virtual machines
and use "mem" only when it's necessary to migrate already existing
virtual machine started with implicit RAM distribution.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 include/hw/boards.h   |  3 ---
 include/sysemu/numa.h |  4 ----
 hw/core/machine.c     |  6 -----
 hw/core/numa.c        | 61 +++++----------------------------------------------
 hw/i386/pc_piix.c     |  1 -
 hw/i386/pc_q35.c      |  1 -
 hw/ppc/spapr.c        |  7 ------
 qemu-deprecated.texi  |  8 -------
 qemu-options.hx       | 16 +++++++-------
 9 files changed, 13 insertions(+), 94 deletions(-)

diff --git a/include/hw/boards.h b/include/hw/boards.h
index 9f69883..aadc9af 100644
--- a/include/hw/boards.h
+++ b/include/hw/boards.h
@@ -192,12 +192,9 @@ struct MachineClass {
     int minimum_page_bits;
     bool has_hotpluggable_cpus;
     bool ignore_memory_transaction_failures;
-    int numa_mem_align_shift;
     const char **valid_cpu_types;
     strList *allowed_dynamic_sysbus_devices;
     bool auto_enable_numa_with_memhp;
-    void (*numa_auto_assign_ram)(MachineClass *mc, NodeInfo *nodes,
-                                 int nb_nodes, ram_addr_t size);
     bool ignore_boot_device_suffixes;
     bool smbus_no_migration_support;
     bool nvdimm_supported;
diff --git a/include/sysemu/numa.h b/include/sysemu/numa.h
index 21f6a5a..5470238 100644
--- a/include/sysemu/numa.h
+++ b/include/sysemu/numa.h
@@ -43,10 +43,6 @@ void parse_numa_opts(MachineState *ms);
 void numa_complete_configuration(MachineState *ms);
 void query_numa_node_mem(NumaNodeMem node_mem[], MachineState *ms);
 extern QemuOptsList qemu_numa_opts;
-void numa_legacy_auto_assign_ram(MachineClass *mc, NodeInfo *nodes,
-                                 int nb_nodes, ram_addr_t size);
-void numa_default_auto_assign_ram(MachineClass *mc, NodeInfo *nodes,
-                                  int nb_nodes, ram_addr_t size);
 void numa_cpu_pre_plug(const struct CPUArchId *slot, DeviceState *dev,
                        Error **errp);
 bool numa_uses_legacy_mem(void);
diff --git a/hw/core/machine.c b/hw/core/machine.c
index a938052..b1ce8c5 100644
--- a/hw/core/machine.c
+++ b/hw/core/machine.c
@@ -715,12 +715,6 @@ static void machine_class_init(ObjectClass *oc, void *data)
     mc->rom_file_has_mr = true;
     mc->smp_parse = smp_parse;
 
-    /* numa node memory size aligned on 8MB by default.
-     * On Linux, each node's border has to be 8MB aligned
-     */
-    mc->numa_mem_align_shift = 23;
-    mc->numa_auto_assign_ram = numa_default_auto_assign_ram;
-
     object_class_property_add_str(oc, "kernel",
         machine_get_kernel, machine_set_kernel, &error_abort);
     object_class_property_set_description(oc, "kernel",
diff --git a/hw/core/numa.c b/hw/core/numa.c
index 96776ff..522e689 100644
--- a/hw/core/numa.c
+++ b/hw/core/numa.c
@@ -330,42 +330,6 @@ static void complete_init_numa_distance(MachineState *ms)
     }
 }
 
-void numa_legacy_auto_assign_ram(MachineClass *mc, NodeInfo *nodes,
-                                 int nb_nodes, ram_addr_t size)
-{
-    int i;
-    uint64_t usedmem = 0;
-
-    /* Align each node according to the alignment
-     * requirements of the machine class
-     */
-
-    for (i = 0; i < nb_nodes - 1; i++) {
-        nodes[i].node_mem = (size / nb_nodes) &
-                            ~((1 << mc->numa_mem_align_shift) - 1);
-        usedmem += nodes[i].node_mem;
-    }
-    nodes[i].node_mem = size - usedmem;
-}
-
-void numa_default_auto_assign_ram(MachineClass *mc, NodeInfo *nodes,
-                                  int nb_nodes, ram_addr_t size)
-{
-    int i;
-    uint64_t usedmem = 0, node_mem;
-    uint64_t granularity = size / nb_nodes;
-    uint64_t propagate = 0;
-
-    for (i = 0; i < nb_nodes - 1; i++) {
-        node_mem = (granularity + propagate) &
-                   ~((1 << mc->numa_mem_align_shift) - 1);
-        propagate = granularity + propagate - node_mem;
-        nodes[i].node_mem = node_mem;
-        usedmem += node_mem;
-    }
-    nodes[i].node_mem = size - usedmem;
-}
-
 static void numa_init_memdev_container(MachineState *ms, MemoryRegion *ram)
 {
     int i;
@@ -435,30 +399,15 @@ void numa_complete_configuration(MachineState *ms)
             ms->numa_state->num_nodes = MAX_NODES;
         }
 
-        /* If no memory size is given for any node, assume the default case
-         * and distribute the available memory equally across all nodes
-         */
-        for (i = 0; i < ms->numa_state->num_nodes; i++) {
-            if (numa_info[i].node_mem != 0) {
-                break;
-            }
-        }
-        if (i == ms->numa_state->num_nodes) {
-            assert(mc->numa_auto_assign_ram);
-            mc->numa_auto_assign_ram(mc, numa_info,
-                                     ms->numa_state->num_nodes, ram_size);
-            if (!qtest_enabled()) {
-                warn_report("Default splitting of RAM between nodes is deprecated,"
-                            " Use '-numa node,memdev' to explictly define RAM"
-                            " allocation per node");
-            }
-        }
-
         numa_total = 0;
         for (i = 0; i < ms->numa_state->num_nodes; i++) {
             numa_total += numa_info[i].node_mem;
         }
-        if (numa_total != ram_size) {
+        if (numa_total == 0) {
+            error_report(" Use '-numa node,memdev' to explictly assign RAM"
+                         " to node");
+            exit(EXIT_FAILURE);
+        } else if (numa_total != ram_size) {
             error_report("total memory for NUMA nodes (0x%" PRIx64 ")"
                          " should equal RAM size (0x" RAM_ADDR_FMT ")",
                          numa_total, ram_size);
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index b2805fe..3a1edba 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -533,7 +533,6 @@ static void pc_i440fx_2_9_machine_options(MachineClass *m)
     pc_i440fx_2_10_machine_options(m);
     compat_props_add(m->compat_props, hw_compat_2_9, hw_compat_2_9_len);
     compat_props_add(m->compat_props, pc_compat_2_9, pc_compat_2_9_len);
-    m->numa_auto_assign_ram = numa_legacy_auto_assign_ram;
 }
 
 DEFINE_I440FX_MACHINE(v2_9, "pc-i440fx-2.9", NULL,
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
index f15711b..ed6c7be 100644
--- a/hw/i386/pc_q35.c
+++ b/hw/i386/pc_q35.c
@@ -467,7 +467,6 @@ static void pc_q35_2_10_machine_options(MachineClass *m)
     pc_q35_2_11_machine_options(m);
     compat_props_add(m->compat_props, hw_compat_2_10, hw_compat_2_10_len);
     compat_props_add(m->compat_props, pc_compat_2_10, pc_compat_2_10_len);
-    m->numa_auto_assign_ram = numa_legacy_auto_assign_ram;
     m->auto_enable_numa_with_memhp = false;
 }
 
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index 6527962..1cc7407 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -4380,11 +4380,6 @@ static void spapr_machine_class_init(ObjectClass *oc, void *data)
     xic->ics_resend = spapr_ics_resend;
     xic->icp_get = spapr_icp_get;
     ispc->print_info = spapr_pic_print_info;
-    /* Force NUMA node memory size to be a multiple of
-     * SPAPR_MEMORY_BLOCK_SIZE (256M) since that's the granularity
-     * in which LMBs are represented and hot-added
-     */
-    mc->numa_mem_align_shift = 28;
     mc->auto_enable_numa = true;
 
     smc->default_caps.caps[SPAPR_CAP_HTM] = SPAPR_CAP_OFF;
@@ -4637,7 +4632,6 @@ static void spapr_machine_2_9_class_options(MachineClass *mc)
     spapr_machine_2_10_class_options(mc);
     compat_props_add(mc->compat_props, hw_compat_2_9, hw_compat_2_9_len);
     compat_props_add(mc->compat_props, compat, G_N_ELEMENTS(compat));
-    mc->numa_auto_assign_ram = numa_legacy_auto_assign_ram;
     smc->pre_2_10_has_unused_icps = true;
     smc->resize_hpt_default = SPAPR_RESIZE_HPT_DISABLED;
 }
@@ -4657,7 +4651,6 @@ static void spapr_machine_2_8_class_options(MachineClass *mc)
     spapr_machine_2_9_class_options(mc);
     compat_props_add(mc->compat_props, hw_compat_2_8, hw_compat_2_8_len);
     compat_props_add(mc->compat_props, compat, G_N_ELEMENTS(compat));
-    mc->numa_mem_align_shift = 23;
 }
 
 DEFINE_SPAPR_MACHINE(2_8, "2.8", false);
diff --git a/qemu-deprecated.texi b/qemu-deprecated.texi
index d9b07ba..05e6082 100644
--- a/qemu-deprecated.texi
+++ b/qemu-deprecated.texi
@@ -89,14 +89,6 @@ error in the future.
 The @code{-realtime mlock=on|off} argument has been replaced by the
 @code{-overcommit mem-lock=on|off} argument.
 
-@subsection -numa node (without memory specified) (since 4.1)
-
-Splitting RAM by default between NUMA nodes has the same issues as @option{mem}
-parameter described above with the difference that the role of the user plays
-QEMU using implicit generic or board specific splitting rule.
-Use @option{memdev} with @var{memory-backend-ram} backend or @option{mem} (if
-it's supported by used machine type) to define mapping explictly instead.
-
 @subsection RISC-V -bios (since 4.1)
 
 QEMU 4.1 introduced support for the -bios option in QEMU for RISC-V for the
diff --git a/qemu-options.hx b/qemu-options.hx
index 088dd32..4872f11 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -168,14 +168,14 @@ If any on the three values is given, the total number of CPUs @var{n} can be omi
 ETEXI
 
 DEF("numa", HAS_ARG, QEMU_OPTION_numa,
-    "-numa node[,mem=size][,cpus=firstcpu[-lastcpu]][,nodeid=node]\n"
-    "-numa node[,memdev=id][,cpus=firstcpu[-lastcpu]][,nodeid=node]\n"
+    "-numa node,mem=size[,cpus=firstcpu[-lastcpu]][,nodeid=node]\n"
+    "-numa node,memdev=id[,cpus=firstcpu[-lastcpu]][,nodeid=node]\n"
     "-numa dist,src=source,dst=destination,val=distance\n"
     "-numa cpu,node-id=node[,socket-id=x][,core-id=y][,thread-id=z]\n",
     QEMU_ARCH_ALL)
 STEXI
-@item -numa node[,mem=@var{size}][,cpus=@var{firstcpu}[-@var{lastcpu}]][,nodeid=@var{node}]
-@itemx -numa node[,memdev=@var{id}][,cpus=@var{firstcpu}[-@var{lastcpu}]][,nodeid=@var{node}]
+@item -numa node,mem=@var{size}[,cpus=@var{firstcpu}[-@var{lastcpu}]][,nodeid=@var{node}]
+@itemx -numa node,memdev=@var{id}[,cpus=@var{firstcpu}[-@var{lastcpu}]][,nodeid=@var{node}]
 @itemx -numa dist,src=@var{source},dst=@var{destination},val=@var{distance}
 @itemx -numa cpu,node-id=@var{node}[,socket-id=@var{x}][,core-id=@var{y}][,thread-id=@var{z}]
 @findex -numa
@@ -193,7 +193,7 @@ split between them.
 For example, the following option assigns VCPUs 0, 1, 2 and 5 to
 a NUMA node:
 @example
--numa node,cpus=0-2,cpus=5
+-numa node,cpus=0-2,cpus=5,memdev=ram-backend-id
 @end example
 
 @samp{cpu} option is a new alternative to @samp{cpus} option
@@ -210,14 +210,14 @@ For example:
 @example
 -M pc \
 -smp 1,sockets=2,maxcpus=2 \
--numa node,nodeid=0 -numa node,nodeid=1 \
+-m 512M -object memory-backend-ram,id=mem,size=512M \
+-numa node,nodeid=0,memdev=mem -numa node,nodeid=1 \
 -numa cpu,node-id=0,socket-id=0 -numa cpu,node-id=1,socket-id=1
 @end example
 
 Legacy @samp{mem} assigns a given RAM amount to a node (not supported for 5.0
 and newer machine types). @samp{memdev} assigns RAM from a given memory backend
-device to a node. If @samp{mem} and @samp{memdev} are omitted in all nodes, RAM
-is split equally between them.
+device to a node.
 
 @samp{mem} and @samp{memdev} are mutually exclusive. Furthermore,
 if one node uses @samp{memdev}, all of them have to use it.
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* Re: [PATCH 41/86] null-machine: use memdev for RAM
  2019-12-31 13:03 ` [PATCH 41/86] null-machine: " Igor Mammedov
@ 2019-12-31 15:32   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 148+ messages in thread
From: Philippe Mathieu-Daudé @ 2019-12-31 15:32 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel

On 12/31/19 2:03 PM, Igor Mammedov wrote:
> memory_region_allocate_system_memory() API is going away, so
> replace it with memdev allocated MemoryRegion. The later is
> initialized by generic code, so board only needs to opt in
> to memdev scheme by providing
>    MachineClass::default_ram_id
> and using MachineState::ram instead of manually initializing
> RAM memory region.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>

> ---
>   hw/core/null-machine.c | 8 +++-----
>   1 file changed, 3 insertions(+), 5 deletions(-)
> 
> diff --git a/hw/core/null-machine.c b/hw/core/null-machine.c
> index 1aa0a9a..cb47d9d 100644
> --- a/hw/core/null-machine.c
> +++ b/hw/core/null-machine.c
> @@ -32,11 +32,8 @@ static void machine_none_init(MachineState *mch)
>       }
>   
>       /* RAM at address zero */
> -    if (mch->ram_size) {
> -        MemoryRegion *ram = g_new(MemoryRegion, 1);
> -
> -        memory_region_allocate_system_memory(ram, NULL, "ram", mch->ram_size);
> -        memory_region_add_subregion(get_system_memory(), 0, ram);
> +    if (mch->ram) {
> +        memory_region_add_subregion(get_system_memory(), 0, mch->ram);
>       }
>   
>       if (mch->kernel_filename) {
> @@ -52,6 +49,7 @@ static void machine_none_machine_init(MachineClass *mc)
>       mc->init = machine_none_init;
>       mc->max_cpus = 1;
>       mc->default_ram_size = 0;
> +    mc->default_ram_id = "ram";
>   }
>   
>   DEFINE_MACHINE("none", machine_none_machine_init)
> 



^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH 43/86] hppa: drop RAM size fixup
  2019-12-31 13:03 ` [PATCH 43/86] hppa: drop RAM size fixup Igor Mammedov
@ 2019-12-31 15:44   ` Philippe Mathieu-Daudé
  2020-01-02 11:31     ` Helge Deller
  2020-01-02 17:08   ` [PATCH] hppa: allow max ram size upto 4Gb Igor Mammedov
  2020-01-07 15:34   ` [PATCH v3 43/86] " Igor Mammedov
  2 siblings, 1 reply; 148+ messages in thread
From: Philippe Mathieu-Daudé @ 2019-12-31 15:44 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel, Helge Deller, Richard Henderson

On 12/31/19 2:03 PM, Igor Mammedov wrote:
> If user provided non-sense RAM size, board will complain and
> continue running with max RAM size supported.
> Also RAM is going to be allocated by generic code, so it won't be
> possible for board to fix things up for user.
> 
> Make it error message and exit to force user fix CLI,
> instead of accepting non-sense CLI values.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
>   hw/hppa/machine.c | 3 ++-
>   1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
> index 5d0de26..25f5afc 100644
> --- a/hw/hppa/machine.c
> +++ b/hw/hppa/machine.c
> @@ -92,7 +92,8 @@ static void machine_hppa_init(MachineState *machine)
>   
>       /* Limit main memory. */
>       if (ram_size > FIRMWARE_START) {
> -        machine->ram_size = ram_size = FIRMWARE_START;
> +        error_report("RAM size more than %d is not supported", FIRMWARE_START);

$ qemu-system-hppa -m 3841m
qemu-system-hppa: invalid accelerator kvm
qemu-system-hppa: falling back to tcg
qemu-system-hppa: RAM size more than -268435456 is not supported

Instead of using qemu_strtosz_MiB on FIRMWARE_START or unsigned format, 
we can simply use "RAM size more than 3840m is not supported". Is that 
OK with you?

Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>

With correct output:
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>

> +        exit(EXIT_FAILURE);
>       }
>   
>       /* Main memory region. */
> 



^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH 44/86] hppa: use memdev for RAM
  2019-12-31 13:03 ` [PATCH 44/86] hppa: use memdev for RAM Igor Mammedov
@ 2019-12-31 15:45   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 148+ messages in thread
From: Philippe Mathieu-Daudé @ 2019-12-31 15:45 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel

On 12/31/19 2:03 PM, Igor Mammedov wrote:
> memory_region_allocate_system_memory() API is going away, so
> replace it with memdev allocated MemoryRegion. The later is
> initialized by generic code, so board only needs to opt in
> to memdev scheme by providing
>    MachineClass::default_ram_id
> and using MachineState::ram instead of manually initializing
> RAM memory region.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>

> ---
>   hw/hppa/machine.c | 8 ++------
>   1 file changed, 2 insertions(+), 6 deletions(-)
> 
> diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
> index 25f5afc..b2f7bc5 100644
> --- a/hw/hppa/machine.c
> +++ b/hw/hppa/machine.c
> @@ -70,7 +70,6 @@ static void machine_hppa_init(MachineState *machine)
>       uint64_t kernel_entry = 0, kernel_low, kernel_high;
>       MemoryRegion *addr_space = get_system_memory();
>       MemoryRegion *rom_region;
> -    MemoryRegion *ram_region;
>       MemoryRegion *cpu_region;
>       long i;
>       unsigned int smp_cpus = machine->smp.cpus;
> @@ -96,11 +95,7 @@ static void machine_hppa_init(MachineState *machine)
>           exit(EXIT_FAILURE);
>       }
>   
> -    /* Main memory region. */
> -    ram_region = g_new(MemoryRegion, 1);
> -    memory_region_allocate_system_memory(ram_region, OBJECT(machine),
> -                                         "ram", ram_size);
> -    memory_region_add_subregion(addr_space, 0, ram_region);
> +    memory_region_add_subregion(addr_space, 0, machine->ram);
>   
>       /* Init Dino (PCI host bus chip).  */
>       pci_bus = dino_init(addr_space, &rtc_irq, &serial_irq);
> @@ -284,6 +279,7 @@ static void machine_hppa_machine_init(MachineClass *mc)
>       mc->is_default = 1;
>       mc->default_ram_size = 512 * MiB;
>       mc->default_boot_order = "cd";
> +    mc->default_ram_id = "ram";
>   }
>   
>   DEFINE_MACHINE("hppa", machine_hppa_machine_init)
> 



^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH 00/86] refactor main RAM allocation to use hostmem backend
  2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
                   ` (85 preceding siblings ...)
  2019-12-31 13:04 ` [PATCH 86/86] numa: remove deprecated implicit RAM distribution between nodes Igor Mammedov
@ 2019-12-31 15:58 ` Philippe Mathieu-Daudé
  2019-12-31 16:22   ` Igor Mammedov
  2020-01-03 13:06   ` Igor Mammedov
  86 siblings, 2 replies; 148+ messages in thread
From: Philippe Mathieu-Daudé @ 2019-12-31 15:58 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel

Hi Igor,

On 12/31/19 2:02 PM, Igor Mammedov wrote:
> Series removes ad hoc RAM allocation API (memory_region_allocate_system_memory)
> and consolidates it around hostmem backend. It allows to
>   * resolve conflicts between global -mem-prealloc and hostmem's "policy" option
>     fixing premature allocation before binding policy is applied
>   * simplify complicated memory allocation routines which had to deal with 2 ways
>     to allocate RAM.
>   * it allows to reuse hostmem backends of a choice for main RAM without adding
>     extra CLI options to duplicate hostmem features.
>     Recent case was -mem-shared, to enable vhost-user on targets that don't
>     support hostmem backends [1] (ex: s390)
>   * move RAM allocation from individual boards into generic machine code and
>     provide them with prepared MemoryRegion.
>   * clean up deprecated NUMA features which were tied to the old API (see patches)
>      - "numa: remove deprecated -mem-path fallback to anonymous RAM"
>      - "numa: remove deprecated implicit RAM distribution between nodes"
>      - "forbid '-numa node,mem' for 5.0 and newer machine types"
> 
> Conversion introduces a new machine.ram-memdev property and wrapper code that
> aliases global -mem-path and -mem-alloc into automatically created hostmem
> backend properties (provided ram-memdev was not set explicitly by user).
> And then follows bulk of trivial patches that incrementally convert individual
> boards to using machine.ram-memdev provided MemoryRegion.
> 
> Board conversion typically involves:
>   * providing MachineClass::default_ram_size and MachineClass::default_ram_id
>     so generic code could create default backend if user didn't explicitly provide
>     ram-memdev or -m options
>   * dropping memory_region_allocate_system_memory() call
>   * using covinience MachineState::ram MemoryRegion, which points to MemoryRegion
>     allocated by ram-memdev
> On top of that for some boards:
>   * added missing ram_size checks (typically it were boards with fixed ram size)
>   * ram_size fixups were replaced by checks and hard errors, forcing user to
>     provide correct "-m" values instead of ignoring it and continuing running.
>     
> After all boards are converted the old API is removed and memory allocation
> routines are cleaned up.

I'm replying to the cover because multiple patches are concerned.

Compiling arm/lm32/mips64el/ppc on 32-bit host I get:

   CC      hw/arm/digic_boards.o
hw/arm/digic_boards.c: In function 'digic4_board_init':
hw/arm/digic_boards.c:57:22: error: format '%lli' expects argument of 
type 'long long int', but argument 2 has type 'ram_addr_t {aka unsigned 
int}' [-Werror=format=]
          error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
                       ^
cc1: all warnings being treated as errors
rules.mak:69: recipe for target 'hw/arm/digic_boards.o' failed
make: *** [hw/arm/digic_boards.o] Error 1
   CC      hw/arm/musicpal.o
hw/arm/musicpal.c: In function 'musicpal_init':
hw/arm/musicpal.c:1598:22: error: format '%lli' expects argument of type 
'long long int', but argument 2 has type 'ram_addr_t {aka unsigned int}' 
[-Werror=format=]
          error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
                       ^
cc1: all warnings being treated as errors
rules.mak:69: recipe for target 'hw/arm/musicpal.o' failed
make: *** [hw/arm/musicpal.o] Error 1
   CC      hw/arm/nseries.o
hw/arm/nseries.c: In function 'n8x0_init':
hw/arm/nseries.c:1316:22: error: format '%lli' expects argument of type 
'long long int', but argument 2 has type 'ram_addr_t {aka unsigned int}' 
[-Werror=format=]
          error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
                       ^
cc1: all warnings being treated as errors
rules.mak:69: recipe for target 'hw/arm/nseries.o' failed
make: *** [hw/arm/nseries.o] Error 1
   CC      hw/arm/omap_sx1.o
hw/arm/omap_sx1.c: In function 'sx1_init':
hw/arm/omap_sx1.c:119:22: error: format '%lli' expects argument of type 
'long long int', but argument 2 has type 'ram_addr_t {aka unsigned int}' 
[-Werror=format=]
          error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
                       ^
cc1: all warnings being treated as errors
rules.mak:69: recipe for target 'hw/arm/omap_sx1.o' failed
make: *** [hw/arm/omap_sx1.o] Error 1
   CC      hw/arm/palm.o
hw/arm/palm.c: In function 'palmte_init':
hw/arm/palm.c:202:22: error: format '%lli' expects argument of type 
'long long int', but argument 2 has type 'ram_addr_t {aka unsigned int}' 
[-Werror=format=]
          error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
                       ^
cc1: all warnings being treated as errors
rules.mak:69: recipe for target 'hw/arm/palm.o' failed
make: *** [hw/arm/palm.o] Error 1
   CC      hw/arm/collie.o
hw/arm/collie.c: In function 'collie_init':
hw/arm/collie.c:32:22: error: format '%lli' expects argument of type 
'long long int', but argument 2 has type 'ram_addr_t {aka unsigned int}' 
[-Werror=format=]
          error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
                       ^
cc1: all warnings being treated as errors
rules.mak:69: recipe for target 'hw/arm/collie.o' failed
make: *** [hw/arm/collie.o] Error 1
   CC      hw/arm/mps2.o
hw/arm/mps2.c: In function 'mps2_common_init':
hw/arm/mps2.c:121:22: error: format '%lli' expects argument of type 
'long long int', but argument 2 has type 'ram_addr_t {aka unsigned int}' 
[-Werror=format=]
          error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
                       ^
cc1: all warnings being treated as errors
rules.mak:69: recipe for target 'hw/arm/mps2.o' failed
make: *** [hw/arm/mps2.o] Error 1
   CC      hw/arm/mps2-tz.o
hw/arm/mps2-tz.c: In function 'mps2tz_common_init':
hw/arm/mps2-tz.c:391:22: error: format '%lli' expects argument of type 
'long long int', but argument 2 has type 'ram_addr_t {aka unsigned int}' 
[-Werror=format=]
          error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
                       ^
cc1: all warnings being treated as errors
rules.mak:69: recipe for target 'hw/arm/mps2-tz.o' failed
make: *** [hw/arm/mps2-tz.o] Error 1
   CC      hw/lm32/lm32_boards.o
hw/lm32/lm32_boards.c: In function 'lm32_evr_init':
hw/lm32/lm32_boards.c:89:22: error: format '%lli' expects argument of 
type 'long long int', but argument 2 has type 'ram_addr_t {aka unsigned 
int}' [-Werror=format=]
          error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
                       ^
hw/lm32/lm32_boards.c: In function 'lm32_uclinux_init':
hw/lm32/lm32_boards.c:179:22: error: format '%lli' expects argument of 
type 'long long int', but argument 2 has type 'ram_addr_t {aka unsigned 
int}' [-Werror=format=]
          error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
                       ^
cc1: all warnings being treated as errors
rules.mak:69: recipe for target 'hw/lm32/lm32_boards.o' failed
make: *** [hw/lm32/lm32_boards.o] Error 1
   CC      hw/lm32/milkymist.o
hw/lm32/milkymist.c: In function 'milkymist_init':
hw/lm32/milkymist.c:100:22: error: format '%lli' expects argument of 
type 'long long int', but argument 2 has type 'ram_addr_t {aka unsigned 
int}' [-Werror=format=]
          error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
                       ^
cc1: all warnings being treated as errors
   CC      hw/mips/mips_fulong2e.o
hw/mips/mips_fulong2e.c: In function 'mips_fulong2e_init':
hw/mips/mips_fulong2e.c:317:22: error: format '%ld' expects argument of 
type 'long int', but argument 2 has type 'long long int' [-Werror=format=]
          error_report("Invalid RAM size, should be %ld", 256 * MiB);
                       ^
cc1: all warnings being treated as errors
   CC      hw/ppc/ppc405_boards.o
hw/ppc/ppc405_boards.c: In function 'ref405ep_init':
hw/ppc/ppc405_boards.c:165:22: error: format '%lli' expects argument of 
type 'long long int', but argument 2 has type 'ram_addr_t {aka unsigned 
int}' [-Werror=format=]
          error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
                       ^
hw/ppc/ppc405_boards.c: In function 'taihu_405ep_init':
hw/ppc/ppc405_boards.c:435:22: error: format '%lli' expects argument of 
type 'long long int', but argument 2 has type 'ram_addr_t {aka unsigned 
int}' [-Werror=format=]
          error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
                       ^
cc1: all warnings being treated as errors
rules.mak:69: recipe for target 'hw/ppc/ppc405_boards.o' failed
make: *** [hw/ppc/ppc405_boards.o] Error 1
   CC      hw/ppc/ppc4xx_devs.o
hw/ppc/ppc4xx_devs.c: In function 'ppc4xx_sdram_adjust':
hw/ppc/ppc4xx_devs.c:704:39: error: format '%lli' expects argument of 
type 'long long int', but argument 3 has type 'ram_addr_t {aka const 
unsigned int}' [-Werror=format=]
              char *t = g_strdup_printf("%s%" PRIi64 "%s", s, 
sdram_bank_sizes[i],
                                        ^
hw/ppc/ppc4xx_devs.c:709:22: error: format '%lli' expects argument of 
type 'long long int', but argument 2 has type 'ram_addr_t {aka unsigned 
int}' [-Werror=format=]
          error_report("Invalid RAM size, unable to fit all RAM into RAM 
banks"
                       ^
cc1: all warnings being treated as errors
rules.mak:69: recipe for target 'hw/ppc/ppc4xx_devs.o' failed
make: *** [hw/ppc/ppc4xx_devs.o] Error 1
   CC      hw/ppc/e500.o
hw/ppc/e500.c: In function 'ppce500_init':
hw/ppc/e500.c:909:22: error: format '%ld' expects argument of type 'long 
int', but argument 2 has type 'long long int' [-Werror=format=]
          error_report("RAM size must be multiple of %ld", RAM_SIZES_ALIGN);
                       ^
cc1: all warnings being treated as errors



^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH 72/86] sparc:leon3: use memdev for RAM
  2019-12-31 13:03 ` [PATCH 72/86] sparc:leon3: " Igor Mammedov
@ 2019-12-31 16:02   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 148+ messages in thread
From: Philippe Mathieu-Daudé @ 2019-12-31 16:02 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel

On 12/31/19 2:03 PM, Igor Mammedov wrote:
> memory_region_allocate_system_memory() API is going away, so
> replace it with memdev allocated MemoryRegion. The later is
> initialized by generic code, so board only needs to opt in
> to memdev scheme by providing
>    MachineClass::default_ram_id
> and using MachineState::ram instead of manually initializing
> RAM memory region.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>

> ---
>   hw/sparc/leon3.c | 6 +++---
>   1 file changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/hw/sparc/leon3.c b/hw/sparc/leon3.c
> index c5f1b1e..19927d1 100644
> --- a/hw/sparc/leon3.c
> +++ b/hw/sparc/leon3.c
> @@ -184,7 +184,6 @@ static void leon3_generic_hw_init(MachineState *machine)
>       SPARCCPU *cpu;
>       CPUSPARCState   *env;
>       MemoryRegion *address_space_mem = get_system_memory();
> -    MemoryRegion *ram = g_new(MemoryRegion, 1);
>       MemoryRegion *prom = g_new(MemoryRegion, 1);
>       int         ret;
>       char       *filename;
> @@ -244,8 +243,8 @@ static void leon3_generic_hw_init(MachineState *machine)
>           exit(1);
>       }
>   
> -    memory_region_allocate_system_memory(ram, NULL, "leon3.ram", ram_size);
> -    memory_region_add_subregion(address_space_mem, LEON3_RAM_OFFSET, ram);
> +    memory_region_add_subregion(address_space_mem, LEON3_RAM_OFFSET,
> +                                machine->ram);
>   
>       /* Allocate BIOS */
>       prom_size = 8 * MiB;
> @@ -351,6 +350,7 @@ static void leon3_generic_machine_init(MachineClass *mc)
>       mc->desc = "Leon-3 generic";
>       mc->init = leon3_generic_hw_init;
>       mc->default_cpu_type = SPARC_CPU_TYPE_NAME("LEON3");
> +    mc->default_ram_id = "leon3.ram";
>   }
>   
>   DEFINE_MACHINE("leon3_generic", leon3_generic_machine_init)
> 



^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH 74/86] sparc:niagara: use memdev for RAM
  2019-12-31 13:03 ` [PATCH 74/86] sparc:niagara: " Igor Mammedov
@ 2019-12-31 16:02   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 148+ messages in thread
From: Philippe Mathieu-Daudé @ 2019-12-31 16:02 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel

On 12/31/19 2:03 PM, Igor Mammedov wrote:
> memory_region_allocate_system_memory() API is going away, so
> replace it with memdev allocated MemoryRegion. The later is
> initialized by generic code, so board only needs to opt in
> to memdev scheme by providing
>    MachineClass::default_ram_id
> and using MachineState::ram instead of manually initializing
> RAM memory region.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>

> ---
>   hw/sparc64/niagara.c | 7 ++-----
>   1 file changed, 2 insertions(+), 5 deletions(-)
> 
> diff --git a/hw/sparc64/niagara.c b/hw/sparc64/niagara.c
> index 5eb2d09..ab5ef8c 100644
> --- a/hw/sparc64/niagara.c
> +++ b/hw/sparc64/niagara.c
> @@ -40,7 +40,6 @@
>   
>   typedef struct NiagaraBoardState {
>       MemoryRegion hv_ram;
> -    MemoryRegion partition_ram;
>       MemoryRegion nvram;
>       MemoryRegion md_rom;
>       MemoryRegion hv_rom;
> @@ -111,11 +110,8 @@ static void niagara_init(MachineState *machine)
>                              NIAGARA_HV_RAM_SIZE, &error_fatal);
>       memory_region_add_subregion(sysmem, NIAGARA_HV_RAM_BASE, &s->hv_ram);
>   
> -    memory_region_allocate_system_memory(&s->partition_ram, NULL,
> -                                         "sun4v-partition.ram",
> -                                         machine->ram_size);
>       memory_region_add_subregion(sysmem, NIAGARA_PARTITION_RAM_BASE,
> -                                &s->partition_ram);
> +                                machine->ram);
>   
>       memory_region_init_ram(&s->nvram, NULL, "sun4v.nvram", NIAGARA_NVRAM_SIZE,
>                              &error_fatal);
> @@ -173,6 +169,7 @@ static void niagara_class_init(ObjectClass *oc, void *data)
>       mc->max_cpus = 1; /* XXX for now */
>       mc->default_boot_order = "c";
>       mc->default_cpu_type = SPARC_CPU_TYPE_NAME("Sun-UltraSparc-T1");
> +    mc->default_ram_id = "sun4v-partition.ram";
>   }
>   
>   static const TypeInfo niagara_type = {
> 



^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH 76/86] post conversion default_ram_id cleanup
  2019-12-31 13:04 ` [PATCH 76/86] post conversion default_ram_id cleanup Igor Mammedov
@ 2019-12-31 16:04   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 148+ messages in thread
From: Philippe Mathieu-Daudé @ 2019-12-31 16:04 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel

On 12/31/19 2:04 PM, Igor Mammedov wrote:
> With default_ram_id is always defined, simplify
> 'if' conditions in vl.c and numa.c
> 
> while at it set
>    MachineClass::default_ram_id = "ram"
> and clean up several boards that use "ram" id
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>

> ---
>   hw/alpha/dp264.c       | 1 -
>   hw/arm/aspeed.c        | 1 -
>   hw/arm/digic_boards.c  | 1 -
>   hw/arm/raspi.c         | 2 --
>   hw/core/machine.c      | 1 +
>   hw/core/null-machine.c | 1 -
>   hw/core/numa.c         | 2 +-
>   hw/hppa/machine.c      | 1 -
>   hw/ppc/virtex_ml507.c  | 1 -
>   vl.c                   | 1 -
>   10 files changed, 2 insertions(+), 10 deletions(-)
> 
> diff --git a/hw/alpha/dp264.c b/hw/alpha/dp264.c
> index 29439c7..f6b9e50 100644
> --- a/hw/alpha/dp264.c
> +++ b/hw/alpha/dp264.c
> @@ -183,7 +183,6 @@ static void clipper_machine_init(MachineClass *mc)
>       mc->max_cpus = 4;
>       mc->is_default = 1;
>       mc->default_cpu_type = ALPHA_CPU_TYPE_NAME("ev67");
> -    mc->default_ram_id = "ram";
>   }
>   
>   DEFINE_MACHINE("clipper", clipper_machine_init)
> diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
> index 330254b..188d42f 100644
> --- a/hw/arm/aspeed.c
> +++ b/hw/arm/aspeed.c
> @@ -391,7 +391,6 @@ static void aspeed_machine_class_init(ObjectClass *oc, void *data)
>       mc->no_floppy = 1;
>       mc->no_cdrom = 1;
>       mc->no_parallel = 1;
> -    mc->default_ram_id = "ram";
>   }
>   
>   static void aspeed_machine_palmetto_class_init(ObjectClass *oc, void *data)
> diff --git a/hw/arm/digic_boards.c b/hw/arm/digic_boards.c
> index c3bc5cb..c3cffb3 100644
> --- a/hw/arm/digic_boards.c
> +++ b/hw/arm/digic_boards.c
> @@ -149,7 +149,6 @@ static void canon_a1100_machine_init(MachineClass *mc)
>       mc->init = &canon_a1100_init;
>       mc->ignore_memory_transaction_failures = true;
>       mc->default_ram_size = 64 * MiB;
> -    mc->default_ram_id = "ram";
>   }
>   
>   DEFINE_MACHINE("canon-a1100", canon_a1100_machine_init)
> diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
> index 33ace66..3d49dcc 100644
> --- a/hw/arm/raspi.c
> +++ b/hw/arm/raspi.c
> @@ -223,7 +223,6 @@ static void raspi2_machine_init(MachineClass *mc)
>       mc->min_cpus = BCM283X_NCPUS;
>       mc->default_cpus = BCM283X_NCPUS;
>       mc->default_ram_size = 1 * GiB;
> -    mc->default_ram_id = "ram";
>       mc->ignore_memory_transaction_failures = true;
>   };
>   DEFINE_MACHINE("raspi2", raspi2_machine_init)
> @@ -246,7 +245,6 @@ static void raspi3_machine_init(MachineClass *mc)
>       mc->min_cpus = BCM283X_NCPUS;
>       mc->default_cpus = BCM283X_NCPUS;
>       mc->default_ram_size = 1 * GiB;
> -    mc->default_ram_id = "ram";
>   }
>   DEFINE_MACHINE("raspi3", raspi3_machine_init)
>   #endif
> diff --git a/hw/core/machine.c b/hw/core/machine.c
> index 080ce57..a938052 100644
> --- a/hw/core/machine.c
> +++ b/hw/core/machine.c
> @@ -711,6 +711,7 @@ static void machine_class_init(ObjectClass *oc, void *data)
>   
>       /* Default 128 MB as guest ram size */
>       mc->default_ram_size = 128 * MiB;
> +    mc->default_ram_id = "ram";
>       mc->rom_file_has_mr = true;
>       mc->smp_parse = smp_parse;
>   
> diff --git a/hw/core/null-machine.c b/hw/core/null-machine.c
> index cb47d9d..08c6109 100644
> --- a/hw/core/null-machine.c
> +++ b/hw/core/null-machine.c
> @@ -49,7 +49,6 @@ static void machine_none_machine_init(MachineClass *mc)
>       mc->init = machine_none_init;
>       mc->max_cpus = 1;
>       mc->default_ram_size = 0;
> -    mc->default_ram_id = "ram";
>   }
>   
>   DEFINE_MACHINE("none", machine_none_machine_init)
> diff --git a/hw/core/numa.c b/hw/core/numa.c
> index 623b307..6a1711d 100644
> --- a/hw/core/numa.c
> +++ b/hw/core/numa.c
> @@ -459,7 +459,7 @@ void numa_complete_configuration(MachineState *ms)
>               exit(1);
>           }
>   
> -        if (!numa_uses_legacy_mem() && mc->default_ram_id) {
> +        if (!numa_uses_legacy_mem()) {
>               ms->ram = g_new(MemoryRegion, 1);
>               memory_region_init(ms->ram, OBJECT(ms), mc->default_ram_id,
>                                  ram_size);
> diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
> index b2f7bc5..ebbf44f 100644
> --- a/hw/hppa/machine.c
> +++ b/hw/hppa/machine.c
> @@ -279,7 +279,6 @@ static void machine_hppa_machine_init(MachineClass *mc)
>       mc->is_default = 1;
>       mc->default_ram_size = 512 * MiB;
>       mc->default_boot_order = "cd";
> -    mc->default_ram_id = "ram";
>   }
>   
>   DEFINE_MACHINE("hppa", machine_hppa_machine_init)
> diff --git a/hw/ppc/virtex_ml507.c b/hw/ppc/virtex_ml507.c
> index b74a269..b31f1cf 100644
> --- a/hw/ppc/virtex_ml507.c
> +++ b/hw/ppc/virtex_ml507.c
> @@ -299,7 +299,6 @@ static void virtex_machine_init(MachineClass *mc)
>       mc->desc = "Xilinx Virtex ML507 reference design";
>       mc->init = virtex_init;
>       mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("440-xilinx");
> -    mc->default_ram_id = "ram";
>   }
>   
>   DEFINE_MACHINE("virtex-ml507", virtex_machine_init)
> diff --git a/vl.c b/vl.c
> index b89e76c..60dffb4 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -4296,7 +4296,6 @@ int main(int argc, char **argv, char **envp)
>   
>       if (numa_uses_legacy_mem() &&
>           machine_class->default_ram_size &&
> -        machine_class->default_ram_id &&
>           !current_machine->ram_memdev) {
>           create_default_memdev(current_machine, mem_path, mem_prealloc);
>       }
> 



^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH 38/86] arm:xlnx-versal-virt: use memdev for RAM
  2019-12-31 13:03 ` [PATCH 38/86] arm:xlnx-versal-virt: " Igor Mammedov
@ 2019-12-31 16:05   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 148+ messages in thread
From: Philippe Mathieu-Daudé @ 2019-12-31 16:05 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel

On 12/31/19 2:03 PM, Igor Mammedov wrote:
> memory_region_allocate_system_memory() API is going away, so
> replace it with memdev allocated MemoryRegion. The later is
> initialized by generic code, so board only needs to opt in
> to memdev scheme by providing
>    MachineClass::default_ram_id
> and using MachineState::ram instead of manually initializing
> RAM memory region.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>

> ---
>   hw/arm/xlnx-versal-virt.c | 7 ++-----
>   1 file changed, 2 insertions(+), 5 deletions(-)
> 
> diff --git a/hw/arm/xlnx-versal-virt.c b/hw/arm/xlnx-versal-virt.c
> index 462493c..c137ff4 100644
> --- a/hw/arm/xlnx-versal-virt.c
> +++ b/hw/arm/xlnx-versal-virt.c
> @@ -30,7 +30,6 @@ typedef struct VersalVirt {
>       MachineState parent_obj;
>   
>       Versal soc;
> -    MemoryRegion mr_ddr;
>   
>       void *fdt;
>       int fdt_size;
> @@ -414,12 +413,9 @@ static void versal_virt_init(MachineState *machine)
>           psci_conduit = QEMU_PSCI_CONDUIT_SMC;
>       }
>   
> -    memory_region_allocate_system_memory(&s->mr_ddr, NULL, "ddr",
> -                                         machine->ram_size);
> -
>       sysbus_init_child_obj(OBJECT(machine), "xlnx-ve", &s->soc,
>                             sizeof(s->soc), TYPE_XLNX_VERSAL);
> -    object_property_set_link(OBJECT(&s->soc), OBJECT(&s->mr_ddr),
> +    object_property_set_link(OBJECT(&s->soc), OBJECT(machine->ram),
>                                "ddr", &error_abort);
>       object_property_set_int(OBJECT(&s->soc), psci_conduit,
>                               "psci-conduit", &error_abort);
> @@ -473,6 +469,7 @@ static void versal_virt_machine_class_init(ObjectClass *oc, void *data)
>       mc->max_cpus = XLNX_VERSAL_NR_ACPUS;
>       mc->default_cpus = XLNX_VERSAL_NR_ACPUS;
>       mc->no_cdrom = true;
> +    mc->default_ram_id = "ddr";
>   }
>   
>   static const TypeInfo versal_virt_machine_init_typeinfo = {
> 



^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH 55/86] mips:mips_jazz: use memdev for RAM
  2019-12-31 13:03 ` [PATCH 55/86] mips:mips_jazz: " Igor Mammedov
@ 2019-12-31 16:06   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 148+ messages in thread
From: Philippe Mathieu-Daudé @ 2019-12-31 16:06 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel

On 12/31/19 2:03 PM, Igor Mammedov wrote:
> memory_region_allocate_system_memory() API is going away, so
> replace it with memdev allocated MemoryRegion. The later is
> initialized by generic code, so board only needs to opt in
> to memdev scheme by providing
>    MachineClass::default_ram_id
> and using MachineState::ram instead of manually initializing
> RAM memory region.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>

> ---
>   hw/mips/mips_jazz.c | 7 +++----
>   1 file changed, 3 insertions(+), 4 deletions(-)
> 
> diff --git a/hw/mips/mips_jazz.c b/hw/mips/mips_jazz.c
> index 291fd6c..5136388 100644
> --- a/hw/mips/mips_jazz.c
> +++ b/hw/mips/mips_jazz.c
> @@ -159,7 +159,6 @@ static void mips_jazz_init(MachineState *machine,
>       ISABus *isa_bus;
>       ISADevice *pit;
>       DriveInfo *fds[MAX_FD];
> -    MemoryRegion *ram = g_new(MemoryRegion, 1);
>       MemoryRegion *bios = g_new(MemoryRegion, 1);
>       MemoryRegion *bios2 = g_new(MemoryRegion, 1);
>       SysBusESPState *sysbus_esp;
> @@ -191,9 +190,7 @@ static void mips_jazz_init(MachineState *machine,
>       cc->do_transaction_failed = mips_jazz_do_transaction_failed;
>   
>       /* allocate RAM */
> -    memory_region_allocate_system_memory(ram, NULL, "mips_jazz.ram",
> -                                         machine->ram_size);
> -    memory_region_add_subregion(address_space, 0, ram);
> +    memory_region_add_subregion(address_space, 0, machine->ram);
>   
>       memory_region_init_ram(bios, NULL, "mips_jazz.bios", MAGNUM_BIOS_SIZE,
>                              &error_fatal);
> @@ -392,6 +389,7 @@ static void mips_magnum_class_init(ObjectClass *oc, void *data)
>       mc->init = mips_magnum_init;
>       mc->block_default_type = IF_SCSI;
>       mc->default_cpu_type = MIPS_CPU_TYPE_NAME("R4000");
> +    mc->default_ram_id = "mips_jazz.ram";
>   }
>   
>   static const TypeInfo mips_magnum_type = {
> @@ -408,6 +406,7 @@ static void mips_pica61_class_init(ObjectClass *oc, void *data)
>       mc->init = mips_pica61_init;
>       mc->block_default_type = IF_SCSI;
>       mc->default_cpu_type = MIPS_CPU_TYPE_NAME("R4000");
> +    mc->default_ram_id = "mips_jazz.ram";
>   }
>   
>   static const TypeInfo mips_pica61_type = {
> 



^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH 56/86] mips:mips_malta: use memdev for RAM
  2019-12-31 13:03 ` [PATCH 56/86] mips:mips_malta: " Igor Mammedov
@ 2019-12-31 16:07   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 148+ messages in thread
From: Philippe Mathieu-Daudé @ 2019-12-31 16:07 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel

On 12/31/19 2:03 PM, Igor Mammedov wrote:
> memory_region_allocate_system_memory() API is going away, so
> replace it with memdev allocated MemoryRegion. The later is
> initialized by generic code, so board only needs to opt in
> to memdev scheme by providing
>    MachineClass::default_ram_id
> and using MachineState::ram instead of manually initializing
> RAM memory region.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>

> ---
>   hw/mips/mips_malta.c | 10 ++++------
>   1 file changed, 4 insertions(+), 6 deletions(-)
> 
> diff --git a/hw/mips/mips_malta.c b/hw/mips/mips_malta.c
> index 783cd99..adffa3a 100644
> --- a/hw/mips/mips_malta.c
> +++ b/hw/mips/mips_malta.c
> @@ -1223,7 +1223,6 @@ void mips_malta_init(MachineState *machine)
>       char *filename;
>       PFlashCFI01 *fl;
>       MemoryRegion *system_memory = get_system_memory();
> -    MemoryRegion *ram_high = g_new(MemoryRegion, 1);
>       MemoryRegion *ram_low_preio = g_new(MemoryRegion, 1);
>       MemoryRegion *ram_low_postio;
>       MemoryRegion *bios, *bios_copy = g_new(MemoryRegion, 1);
> @@ -1261,13 +1260,11 @@ void mips_malta_init(MachineState *machine)
>       }
>   
>       /* register RAM at high address where it is undisturbed by IO */
> -    memory_region_allocate_system_memory(ram_high, NULL, "mips_malta.ram",
> -                                         ram_size);
> -    memory_region_add_subregion(system_memory, 0x80000000, ram_high);
> +    memory_region_add_subregion(system_memory, 0x80000000, machine->ram);
>   
>       /* alias for pre IO hole access */
>       memory_region_init_alias(ram_low_preio, NULL, "mips_malta_low_preio.ram",
> -                             ram_high, 0, MIN(ram_size, 256 * MiB));
> +                             machine->ram, 0, MIN(ram_size, 256 * MiB));
>       memory_region_add_subregion(system_memory, 0, ram_low_preio);
>   
>       /* alias for post IO hole access, if there is enough RAM */
> @@ -1275,7 +1272,7 @@ void mips_malta_init(MachineState *machine)
>           ram_low_postio = g_new(MemoryRegion, 1);
>           memory_region_init_alias(ram_low_postio, NULL,
>                                    "mips_malta_low_postio.ram",
> -                                 ram_high, 512 * MiB,
> +                                 machine->ram, 512 * MiB,
>                                    ram_size - 512 * MiB);
>           memory_region_add_subregion(system_memory, 512 * MiB,
>                                       ram_low_postio);
> @@ -1447,6 +1444,7 @@ static void mips_malta_machine_init(MachineClass *mc)
>   #else
>       mc->default_cpu_type = MIPS_CPU_TYPE_NAME("24Kf");
>   #endif
> +    mc->default_ram_id = "mips_malta.ram";
>   }
>   
>   DEFINE_MACHINE("malta", mips_malta_machine_init)
> 



^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH 57/86] mips:mips_mipssim: use memdev for RAM
  2019-12-31 13:03 ` [PATCH 57/86] mips:mips_mipssim: " Igor Mammedov
@ 2019-12-31 16:07   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 148+ messages in thread
From: Philippe Mathieu-Daudé @ 2019-12-31 16:07 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel

On 12/31/19 2:03 PM, Igor Mammedov wrote:
> memory_region_allocate_system_memory() API is going away, so
> replace it with memdev allocated MemoryRegion. The later is
> initialized by generic code, so board only needs to opt in
> to memdev scheme by providing
>    MachineClass::default_ram_id
> and using MachineState::ram instead of manually initializing
> RAM memory region.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>

> ---
>   hw/mips/mips_mipssim.c | 9 +++------
>   1 file changed, 3 insertions(+), 6 deletions(-)
> 
> diff --git a/hw/mips/mips_mipssim.c b/hw/mips/mips_mipssim.c
> index 282bbec..be3972f 100644
> --- a/hw/mips/mips_mipssim.c
> +++ b/hw/mips/mips_mipssim.c
> @@ -142,14 +142,12 @@ static void mipsnet_init(int base, qemu_irq irq, NICInfo *nd)
>   static void
>   mips_mipssim_init(MachineState *machine)
>   {
> -    ram_addr_t ram_size = machine->ram_size;
>       const char *kernel_filename = machine->kernel_filename;
>       const char *kernel_cmdline = machine->kernel_cmdline;
>       const char *initrd_filename = machine->initrd_filename;
>       char *filename;
>       MemoryRegion *address_space_mem = get_system_memory();
>       MemoryRegion *isa = g_new(MemoryRegion, 1);
> -    MemoryRegion *ram = g_new(MemoryRegion, 1);
>       MemoryRegion *bios = g_new(MemoryRegion, 1);
>       MIPSCPU *cpu;
>       CPUMIPSState *env;
> @@ -166,13 +164,11 @@ mips_mipssim_init(MachineState *machine)
>       qemu_register_reset(main_cpu_reset, reset_info);
>   
>       /* Allocate RAM. */
> -    memory_region_allocate_system_memory(ram, NULL, "mips_mipssim.ram",
> -                                         ram_size);
>       memory_region_init_ram(bios, NULL, "mips_mipssim.bios", BIOS_SIZE,
>                              &error_fatal);
>       memory_region_set_readonly(bios, true);
>   
> -    memory_region_add_subregion(address_space_mem, 0, ram);
> +    memory_region_add_subregion(address_space_mem, 0, machine->ram);
>   
>       /* Map the BIOS / boot exception handler. */
>       memory_region_add_subregion(address_space_mem, 0x1fc00000LL, bios);
> @@ -199,7 +195,7 @@ mips_mipssim_init(MachineState *machine)
>       }
>   
>       if (kernel_filename) {
> -        loaderparams.ram_size = ram_size;
> +        loaderparams.ram_size = machine->ram_size;
>           loaderparams.kernel_filename = kernel_filename;
>           loaderparams.kernel_cmdline = kernel_cmdline;
>           loaderparams.initrd_filename = initrd_filename;
> @@ -237,6 +233,7 @@ static void mips_mipssim_machine_init(MachineClass *mc)
>   #else
>       mc->default_cpu_type = MIPS_CPU_TYPE_NAME("24Kf");
>   #endif
> +    mc->default_ram_id = "mips_mipssim.ram";
>   }
>   
>   DEFINE_MACHINE("mipssim", mips_mipssim_machine_init)
> 



^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH 58/86] mips:mips_r4k: use memdev for RAM
  2019-12-31 13:03 ` [PATCH 58/86] mips:mips_r4k: " Igor Mammedov
@ 2019-12-31 16:08   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 148+ messages in thread
From: Philippe Mathieu-Daudé @ 2019-12-31 16:08 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel

On 12/31/19 2:03 PM, Igor Mammedov wrote:
> memory_region_allocate_system_memory() API is going away, so
> replace it with memdev allocated MemoryRegion. The later is
> initialized by generic code, so board only needs to opt in
> to memdev scheme by providing
>    MachineClass::default_ram_id
> and using MachineState::ram instead of manually initializing
> RAM memory region.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>

> ---
>   hw/mips/mips_r4k.c | 12 ++++--------
>   1 file changed, 4 insertions(+), 8 deletions(-)
> 
> diff --git a/hw/mips/mips_r4k.c b/hw/mips/mips_r4k.c
> index fd926a3..69b6549 100644
> --- a/hw/mips/mips_r4k.c
> +++ b/hw/mips/mips_r4k.c
> @@ -171,13 +171,11 @@ static const int sector_len = 32 * KiB;
>   static
>   void mips_r4k_init(MachineState *machine)
>   {
> -    ram_addr_t ram_size = machine->ram_size;
>       const char *kernel_filename = machine->kernel_filename;
>       const char *kernel_cmdline = machine->kernel_cmdline;
>       const char *initrd_filename = machine->initrd_filename;
>       char *filename;
>       MemoryRegion *address_space_mem = get_system_memory();
> -    MemoryRegion *ram = g_new(MemoryRegion, 1);
>       MemoryRegion *bios;
>       MemoryRegion *iomem = g_new(MemoryRegion, 1);
>       MemoryRegion *isa_io = g_new(MemoryRegion, 1);
> @@ -203,14 +201,12 @@ void mips_r4k_init(MachineState *machine)
>       qemu_register_reset(main_cpu_reset, reset_info);
>   
>       /* allocate RAM */
> -    if (ram_size > 256 * MiB) {
> +    if (machine->ram_size > 256 * MiB) {
>           error_report("Too much memory for this machine: %" PRId64 "MB,"
>                        " maximum 256MB", ram_size / MiB);
>           exit(1);
>       }
> -    memory_region_allocate_system_memory(ram, NULL, "mips_r4k.ram", ram_size);
> -
> -    memory_region_add_subregion(address_space_mem, 0, ram);
> +    memory_region_add_subregion(address_space_mem, 0, machine->ram);
>   
>       memory_region_init_io(iomem, NULL, &mips_qemu_ops,
>                             NULL, "mips-qemu", 0x10000);
> @@ -261,7 +257,7 @@ void mips_r4k_init(MachineState *machine)
>       g_free(filename);
>   
>       if (kernel_filename) {
> -        loaderparams.ram_size = ram_size;
> +        loaderparams.ram_size = machine->ram_size;
>           loaderparams.kernel_filename = kernel_filename;
>           loaderparams.kernel_cmdline = kernel_cmdline;
>           loaderparams.initrd_filename = initrd_filename;
> @@ -316,7 +312,7 @@ static void mips_machine_init(MachineClass *mc)
>   #else
>       mc->default_cpu_type = MIPS_CPU_TYPE_NAME("24Kf");
>   #endif
> -
> +    mc->default_ram_id = "mips_r4k.ram";
>   }
>   
>   DEFINE_MACHINE("mips", mips_machine_init)
> 



^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH 52/86] mips:boston-cube: use memdev for RAM
  2019-12-31 13:03 ` [PATCH 52/86] mips:boston-cube: " Igor Mammedov
@ 2019-12-31 16:08   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 148+ messages in thread
From: Philippe Mathieu-Daudé @ 2019-12-31 16:08 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel

On 12/31/19 2:03 PM, Igor Mammedov wrote:
> memory_region_allocate_system_memory() API is going away, so
> replace it with memdev allocated MemoryRegion. The later is
> initialized by generic code, so board only needs to opt in
> to memdev scheme by providing
>    MachineClass::default_ram_id
> and using MachineState::ram instead of manually initializing
> RAM memory region.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>

> ---
>   hw/mips/boston.c | 11 +++++------
>   1 file changed, 5 insertions(+), 6 deletions(-)
> 
> diff --git a/hw/mips/boston.c b/hw/mips/boston.c
> index ca7d813..466054e 100644
> --- a/hw/mips/boston.c
> +++ b/hw/mips/boston.c
> @@ -427,7 +427,7 @@ static void boston_mach_init(MachineState *machine)
>       DeviceState *dev;
>       BostonState *s;
>       Error *err = NULL;
> -    MemoryRegion *flash, *ddr, *ddr_low_alias, *lcd, *platreg;
> +    MemoryRegion *flash, *ddr_low_alias, *lcd, *platreg;
>       MemoryRegion *sys_mem = get_system_memory();
>       XilinxPCIEHost *pcie2;
>       PCIDevice *ahci;
> @@ -473,14 +473,12 @@ static void boston_mach_init(MachineState *machine)
>       memory_region_init_rom(flash, NULL, "boston.flash", 128 * MiB, &err);
>       memory_region_add_subregion_overlap(sys_mem, 0x18000000, flash, 0);
>   
> -    ddr = g_new(MemoryRegion, 1);
> -    memory_region_allocate_system_memory(ddr, NULL, "boston.ddr",
> -                                         machine->ram_size);
> -    memory_region_add_subregion_overlap(sys_mem, 0x80000000, ddr, 0);
> +    memory_region_add_subregion_overlap(sys_mem, 0x80000000, machine->ram, 0);
>   
>       ddr_low_alias = g_new(MemoryRegion, 1);
>       memory_region_init_alias(ddr_low_alias, NULL, "boston_low.ddr",
> -                             ddr, 0, MIN(machine->ram_size, (256 * MiB)));
> +                             machine->ram, 0,
> +                             MIN(machine->ram_size, (256 * MiB)));
>       memory_region_add_subregion_overlap(sys_mem, 0, ddr_low_alias, 0);
>   
>       xilinx_pcie_init(sys_mem, 0,
> @@ -552,6 +550,7 @@ static void boston_mach_class_init(MachineClass *mc)
>       mc->init = boston_mach_init;
>       mc->block_default_type = IF_IDE;
>       mc->default_ram_size = 1 * GiB;
> +    mc->default_ram_id = "boston.ddr";
>       mc->max_cpus = 16;
>       mc->default_cpu_type = MIPS_CPU_TYPE_NAME("I6400");
>   }
> 



^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH 21/86] arm:kzm: use memdev for RAM
  2019-12-31 13:03 ` [PATCH 21/86] arm:kzm: use memdev for RAM Igor Mammedov
@ 2019-12-31 16:10   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 148+ messages in thread
From: Philippe Mathieu-Daudé @ 2019-12-31 16:10 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel

On 12/31/19 2:03 PM, Igor Mammedov wrote:
> memory_region_allocate_system_memory() API is going away, so
> replace it with memdev allocated MemoryRegion. The later is
> initialized by generic code, so board only needs to opt in
> to memdev scheme by providing
>    MachineClass::default_ram_id
> and using MachineState::ram instead of manually initializing
> RAM memory region.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>

> ---
>   hw/arm/kzm.c | 9 ++++-----
>   1 file changed, 4 insertions(+), 5 deletions(-)
> 
> diff --git a/hw/arm/kzm.c b/hw/arm/kzm.c
> index 27800c5..f63902e 100644
> --- a/hw/arm/kzm.c
> +++ b/hw/arm/kzm.c
> @@ -51,7 +51,6 @@
>   
>   typedef struct IMX31KZM {
>       FslIMX31State soc;
> -    MemoryRegion ram;
>       MemoryRegion ram_alias;
>   } IMX31KZM;
>   
> @@ -84,10 +83,8 @@ static void kzm_init(MachineState *machine)
>           exit(EXIT_FAILURE);
>       }
>   
> -    memory_region_allocate_system_memory(&s->ram, NULL, "kzm.ram",
> -                                         machine->ram_size);
>       memory_region_add_subregion(get_system_memory(), FSL_IMX31_SDRAM0_ADDR,
> -                                &s->ram);
> +                                machine->ram);
>   
>       /* initialize the alias memory if any */
>       for (i = 0, ram_size = machine->ram_size, alias_offset = 0;
> @@ -107,7 +104,8 @@ static void kzm_init(MachineState *machine)
>   
>           if (size < ram[i].size) {
>               memory_region_init_alias(&s->ram_alias, NULL, "ram.alias",
> -                                     &s->ram, alias_offset, ram[i].size - size);
> +                                     machine->ram,
> +                                     alias_offset, ram[i].size - size);
>               memory_region_add_subregion(get_system_memory(),
>                                           ram[i].addr + size, &s->ram_alias);
>           }
> @@ -139,6 +137,7 @@ static void kzm_machine_init(MachineClass *mc)
>       mc->desc = "ARM KZM Emulation Baseboard (ARM1136)";
>       mc->init = kzm_init;
>       mc->ignore_memory_transaction_failures = true;
> +    mc->default_ram_id = "kzm.ram";
>   }
>   
>   DEFINE_MACHINE("kzm", kzm_machine_init)
> 



^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH 08/86] alpha:dp264: use memdev for RAM
  2019-12-31 13:02 ` [PATCH 08/86] alpha:dp264: use memdev for RAM Igor Mammedov
@ 2019-12-31 16:11   ` Philippe Mathieu-Daudé
  2020-01-06  0:37   ` Richard Henderson
  1 sibling, 0 replies; 148+ messages in thread
From: Philippe Mathieu-Daudé @ 2019-12-31 16:11 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel

On 12/31/19 2:02 PM, Igor Mammedov wrote:
> memory_region_allocate_system_memory() API is going away, so
> replace it with memdev allocated MemoryRegion. The later is
> initialized by generic code, so board only needs to opt in
> to memdev scheme by providing
>    MachineClass::default_ram_id
> and using MachineState::ram instead of manually initializing
> RAM memory region.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>

> ---
>   hw/alpha/alpha_sys.h | 2 +-
>   hw/alpha/dp264.c     | 3 ++-
>   hw/alpha/typhoon.c   | 8 ++------
>   3 files changed, 5 insertions(+), 8 deletions(-)
> 
> diff --git a/hw/alpha/alpha_sys.h b/hw/alpha/alpha_sys.h
> index 95033d7..bc0a286 100644
> --- a/hw/alpha/alpha_sys.h
> +++ b/hw/alpha/alpha_sys.h
> @@ -11,7 +11,7 @@
>   #include "hw/intc/i8259.h"
>   
>   
> -PCIBus *typhoon_init(ram_addr_t, ISABus **, qemu_irq *, AlphaCPU *[4],
> +PCIBus *typhoon_init(MemoryRegion *, ISABus **, qemu_irq *, AlphaCPU *[4],
>                        pci_map_irq_fn);
>   
>   /* alpha_pci.c.  */
> diff --git a/hw/alpha/dp264.c b/hw/alpha/dp264.c
> index f2026fd..29439c7 100644
> --- a/hw/alpha/dp264.c
> +++ b/hw/alpha/dp264.c
> @@ -75,7 +75,7 @@ static void clipper_init(MachineState *machine)
>       cpus[0]->env.trap_arg2 = smp_cpus;
>   
>       /* Init the chipset.  */
> -    pci_bus = typhoon_init(ram_size, &isa_bus, &rtc_irq, cpus,
> +    pci_bus = typhoon_init(machine->ram, &isa_bus, &rtc_irq, cpus,
>                              clipper_pci_map_irq);
>   
>       /* Since we have an SRM-compatible PALcode, use the SRM epoch.  */
> @@ -183,6 +183,7 @@ static void clipper_machine_init(MachineClass *mc)
>       mc->max_cpus = 4;
>       mc->is_default = 1;
>       mc->default_cpu_type = ALPHA_CPU_TYPE_NAME("ev67");
> +    mc->default_ram_id = "ram";
>   }
>   
>   DEFINE_MACHINE("clipper", clipper_machine_init)
> diff --git a/hw/alpha/typhoon.c b/hw/alpha/typhoon.c
> index 179e1f7..1795e2f 100644
> --- a/hw/alpha/typhoon.c
> +++ b/hw/alpha/typhoon.c
> @@ -58,7 +58,6 @@ typedef struct TyphoonState {
>       TyphoonCchip cchip;
>       TyphoonPchip pchip;
>       MemoryRegion dchip_region;
> -    MemoryRegion ram_region;
>   } TyphoonState;
>   
>   /* Called when one of DRIR or DIM changes.  */
> @@ -817,8 +816,7 @@ static void typhoon_alarm_timer(void *opaque)
>       cpu_interrupt(CPU(s->cchip.cpu[cpu]), CPU_INTERRUPT_TIMER);
>   }
>   
> -PCIBus *typhoon_init(ram_addr_t ram_size, ISABus **isa_bus,
> -                     qemu_irq *p_rtc_irq,
> +PCIBus *typhoon_init(MemoryRegion *ram, ISABus **isa_bus, qemu_irq *p_rtc_irq,
>                        AlphaCPU *cpus[4], pci_map_irq_fn sys_map_irq)
>   {
>       MemoryRegion *addr_space = get_system_memory();
> @@ -851,9 +849,7 @@ PCIBus *typhoon_init(ram_addr_t ram_size, ISABus **isa_bus,
>   
>       /* Main memory region, 0x00.0000.0000.  Real hardware supports 32GB,
>          but the address space hole reserved at this point is 8TB.  */
> -    memory_region_allocate_system_memory(&s->ram_region, OBJECT(s), "ram",
> -                                         ram_size);
> -    memory_region_add_subregion(addr_space, 0, &s->ram_region);
> +    memory_region_add_subregion(addr_space, 0, ram);
>   
>       /* TIGbus, 0x801.0000.0000, 1GB.  */
>       /* ??? The TIGbus is used for delivering interrupts, and access to
> 



^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH 00/86] refactor main RAM allocation to use hostmem backend
  2019-12-31 15:58 ` [PATCH 00/86] refactor main RAM allocation to use hostmem backend Philippe Mathieu-Daudé
@ 2019-12-31 16:22   ` Igor Mammedov
  2020-01-03 13:06   ` Igor Mammedov
  1 sibling, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2019-12-31 16:22 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé; +Cc: qemu-devel

On Tue, 31 Dec 2019 16:58:10 +0100
Philippe Mathieu-Daudé <philmd@redhat.com> wrote:

> Hi Igor,
> 
> On 12/31/19 2:02 PM, Igor Mammedov wrote:
> > Series removes ad hoc RAM allocation API (memory_region_allocate_system_memory)
> > and consolidates it around hostmem backend. It allows to
> >   * resolve conflicts between global -mem-prealloc and hostmem's "policy" option
> >     fixing premature allocation before binding policy is applied
> >   * simplify complicated memory allocation routines which had to deal with 2 ways
> >     to allocate RAM.
> >   * it allows to reuse hostmem backends of a choice for main RAM without adding
> >     extra CLI options to duplicate hostmem features.
> >     Recent case was -mem-shared, to enable vhost-user on targets that don't
> >     support hostmem backends [1] (ex: s390)
> >   * move RAM allocation from individual boards into generic machine code and
> >     provide them with prepared MemoryRegion.
> >   * clean up deprecated NUMA features which were tied to the old API (see patches)
> >      - "numa: remove deprecated -mem-path fallback to anonymous RAM"
> >      - "numa: remove deprecated implicit RAM distribution between nodes"
> >      - "forbid '-numa node,mem' for 5.0 and newer machine types"
> > 
> > Conversion introduces a new machine.ram-memdev property and wrapper code that
> > aliases global -mem-path and -mem-alloc into automatically created hostmem
> > backend properties (provided ram-memdev was not set explicitly by user).
> > And then follows bulk of trivial patches that incrementally convert individual
> > boards to using machine.ram-memdev provided MemoryRegion.
> > 
> > Board conversion typically involves:
> >   * providing MachineClass::default_ram_size and MachineClass::default_ram_id
> >     so generic code could create default backend if user didn't explicitly provide
> >     ram-memdev or -m options
> >   * dropping memory_region_allocate_system_memory() call
> >   * using covinience MachineState::ram MemoryRegion, which points to MemoryRegion
> >     allocated by ram-memdev
> > On top of that for some boards:
> >   * added missing ram_size checks (typically it were boards with fixed ram size)
> >   * ram_size fixups were replaced by checks and hard errors, forcing user to
> >     provide correct "-m" values instead of ignoring it and continuing running.
> >     
> > After all boards are converted the old API is removed and memory allocation
> > routines are cleaned up.
> 
> I'm replying to the cover because multiple patches are concerned.
> 
> Compiling arm/lm32/mips64el/ppc on 32-bit host I get:
Thanks for spotting it.
I was thinking that travis-ci did 32-bit builds (I was wrong).
I'll dig up 32-bit machine and try to fix build issues.

> 
>    CC      hw/arm/digic_boards.o
> hw/arm/digic_boards.c: In function 'digic4_board_init':
> hw/arm/digic_boards.c:57:22: error: format '%lli' expects argument of 
> type 'long long int', but argument 2 has type 'ram_addr_t {aka unsigned 
> int}' [-Werror=format=]
>           error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
>                        ^
> cc1: all warnings being treated as errors
> rules.mak:69: recipe for target 'hw/arm/digic_boards.o' failed
> make: *** [hw/arm/digic_boards.o] Error 1
>    CC      hw/arm/musicpal.o
> hw/arm/musicpal.c: In function 'musicpal_init':
> hw/arm/musicpal.c:1598:22: error: format '%lli' expects argument of type 
> 'long long int', but argument 2 has type 'ram_addr_t {aka unsigned int}' 
> [-Werror=format=]
>           error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
>                        ^
> cc1: all warnings being treated as errors
> rules.mak:69: recipe for target 'hw/arm/musicpal.o' failed
> make: *** [hw/arm/musicpal.o] Error 1
>    CC      hw/arm/nseries.o
> hw/arm/nseries.c: In function 'n8x0_init':
> hw/arm/nseries.c:1316:22: error: format '%lli' expects argument of type 
> 'long long int', but argument 2 has type 'ram_addr_t {aka unsigned int}' 
> [-Werror=format=]
>           error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
>                        ^
> cc1: all warnings being treated as errors
> rules.mak:69: recipe for target 'hw/arm/nseries.o' failed
> make: *** [hw/arm/nseries.o] Error 1
>    CC      hw/arm/omap_sx1.o
> hw/arm/omap_sx1.c: In function 'sx1_init':
> hw/arm/omap_sx1.c:119:22: error: format '%lli' expects argument of type 
> 'long long int', but argument 2 has type 'ram_addr_t {aka unsigned int}' 
> [-Werror=format=]
>           error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
>                        ^
> cc1: all warnings being treated as errors
> rules.mak:69: recipe for target 'hw/arm/omap_sx1.o' failed
> make: *** [hw/arm/omap_sx1.o] Error 1
>    CC      hw/arm/palm.o
> hw/arm/palm.c: In function 'palmte_init':
> hw/arm/palm.c:202:22: error: format '%lli' expects argument of type 
> 'long long int', but argument 2 has type 'ram_addr_t {aka unsigned int}' 
> [-Werror=format=]
>           error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
>                        ^
> cc1: all warnings being treated as errors
> rules.mak:69: recipe for target 'hw/arm/palm.o' failed
> make: *** [hw/arm/palm.o] Error 1
>    CC      hw/arm/collie.o
> hw/arm/collie.c: In function 'collie_init':
> hw/arm/collie.c:32:22: error: format '%lli' expects argument of type 
> 'long long int', but argument 2 has type 'ram_addr_t {aka unsigned int}' 
> [-Werror=format=]
>           error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
>                        ^
> cc1: all warnings being treated as errors
> rules.mak:69: recipe for target 'hw/arm/collie.o' failed
> make: *** [hw/arm/collie.o] Error 1
>    CC      hw/arm/mps2.o
> hw/arm/mps2.c: In function 'mps2_common_init':
> hw/arm/mps2.c:121:22: error: format '%lli' expects argument of type 
> 'long long int', but argument 2 has type 'ram_addr_t {aka unsigned int}' 
> [-Werror=format=]
>           error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
>                        ^
> cc1: all warnings being treated as errors
> rules.mak:69: recipe for target 'hw/arm/mps2.o' failed
> make: *** [hw/arm/mps2.o] Error 1
>    CC      hw/arm/mps2-tz.o
> hw/arm/mps2-tz.c: In function 'mps2tz_common_init':
> hw/arm/mps2-tz.c:391:22: error: format '%lli' expects argument of type 
> 'long long int', but argument 2 has type 'ram_addr_t {aka unsigned int}' 
> [-Werror=format=]
>           error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
>                        ^
> cc1: all warnings being treated as errors
> rules.mak:69: recipe for target 'hw/arm/mps2-tz.o' failed
> make: *** [hw/arm/mps2-tz.o] Error 1
>    CC      hw/lm32/lm32_boards.o
> hw/lm32/lm32_boards.c: In function 'lm32_evr_init':
> hw/lm32/lm32_boards.c:89:22: error: format '%lli' expects argument of 
> type 'long long int', but argument 2 has type 'ram_addr_t {aka unsigned 
> int}' [-Werror=format=]
>           error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
>                        ^
> hw/lm32/lm32_boards.c: In function 'lm32_uclinux_init':
> hw/lm32/lm32_boards.c:179:22: error: format '%lli' expects argument of 
> type 'long long int', but argument 2 has type 'ram_addr_t {aka unsigned 
> int}' [-Werror=format=]
>           error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
>                        ^
> cc1: all warnings being treated as errors
> rules.mak:69: recipe for target 'hw/lm32/lm32_boards.o' failed
> make: *** [hw/lm32/lm32_boards.o] Error 1
>    CC      hw/lm32/milkymist.o
> hw/lm32/milkymist.c: In function 'milkymist_init':
> hw/lm32/milkymist.c:100:22: error: format '%lli' expects argument of 
> type 'long long int', but argument 2 has type 'ram_addr_t {aka unsigned 
> int}' [-Werror=format=]
>           error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
>                        ^
> cc1: all warnings being treated as errors
>    CC      hw/mips/mips_fulong2e.o
> hw/mips/mips_fulong2e.c: In function 'mips_fulong2e_init':
> hw/mips/mips_fulong2e.c:317:22: error: format '%ld' expects argument of 
> type 'long int', but argument 2 has type 'long long int' [-Werror=format=]
>           error_report("Invalid RAM size, should be %ld", 256 * MiB);
>                        ^
> cc1: all warnings being treated as errors
>    CC      hw/ppc/ppc405_boards.o
> hw/ppc/ppc405_boards.c: In function 'ref405ep_init':
> hw/ppc/ppc405_boards.c:165:22: error: format '%lli' expects argument of 
> type 'long long int', but argument 2 has type 'ram_addr_t {aka unsigned 
> int}' [-Werror=format=]
>           error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
>                        ^
> hw/ppc/ppc405_boards.c: In function 'taihu_405ep_init':
> hw/ppc/ppc405_boards.c:435:22: error: format '%lli' expects argument of 
> type 'long long int', but argument 2 has type 'ram_addr_t {aka unsigned 
> int}' [-Werror=format=]
>           error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
>                        ^
> cc1: all warnings being treated as errors
> rules.mak:69: recipe for target 'hw/ppc/ppc405_boards.o' failed
> make: *** [hw/ppc/ppc405_boards.o] Error 1
>    CC      hw/ppc/ppc4xx_devs.o
> hw/ppc/ppc4xx_devs.c: In function 'ppc4xx_sdram_adjust':
> hw/ppc/ppc4xx_devs.c:704:39: error: format '%lli' expects argument of 
> type 'long long int', but argument 3 has type 'ram_addr_t {aka const 
> unsigned int}' [-Werror=format=]
>               char *t = g_strdup_printf("%s%" PRIi64 "%s", s, 
> sdram_bank_sizes[i],
>                                         ^
> hw/ppc/ppc4xx_devs.c:709:22: error: format '%lli' expects argument of 
> type 'long long int', but argument 2 has type 'ram_addr_t {aka unsigned 
> int}' [-Werror=format=]
>           error_report("Invalid RAM size, unable to fit all RAM into RAM 
> banks"
>                        ^
> cc1: all warnings being treated as errors
> rules.mak:69: recipe for target 'hw/ppc/ppc4xx_devs.o' failed
> make: *** [hw/ppc/ppc4xx_devs.o] Error 1
>    CC      hw/ppc/e500.o
> hw/ppc/e500.c: In function 'ppce500_init':
> hw/ppc/e500.c:909:22: error: format '%ld' expects argument of type 'long 
> int', but argument 2 has type 'long long int' [-Werror=format=]
>           error_report("RAM size must be multiple of %ld", RAM_SIZES_ALIGN);
>                        ^
> cc1: all warnings being treated as errors
> 



^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH 66/86] ppc:ppc440_bamboo/sam460ex: drop RAM size fixup
  2019-12-31 13:03 ` [PATCH 66/86] ppc:ppc440_bamboo/sam460ex: drop RAM size fixup Igor Mammedov
@ 2020-01-01 11:54   ` BALATON Zoltan
  2020-01-01 15:39     ` Philippe Mathieu-Daudé
  2020-01-02 11:47     ` Igor Mammedov
  0 siblings, 2 replies; 148+ messages in thread
From: BALATON Zoltan @ 2020-01-01 11:54 UTC (permalink / raw)
  To: Igor Mammedov; +Cc: qemu-devel

On Tue, 31 Dec 2019, Igor Mammedov wrote:
> If user provided non-sense RAM size, board will complain and
> continue running with max RAM size supported.
> Also RAM is going to be allocated by generic code, so it won't be
> possible for board to fix things up for user.
>
> Make it error message and exit to force user fix CLI,
> instead of accepting non-sense CLI values.
>
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
> include/hw/ppc/ppc4xx.h |  9 ++++-----
> hw/ppc/ppc440_bamboo.c  | 11 ++++-------
> hw/ppc/ppc4xx_devs.c    | 26 ++++++++++++++++----------
> hw/ppc/sam460ex.c       |  5 ++---
> 4 files changed, 26 insertions(+), 25 deletions(-)
>
> diff --git a/include/hw/ppc/ppc4xx.h b/include/hw/ppc/ppc4xx.h
> index 7d82259..1a28127 100644
> --- a/include/hw/ppc/ppc4xx.h
> +++ b/include/hw/ppc/ppc4xx.h
> @@ -42,11 +42,10 @@ enum {
> qemu_irq *ppcuic_init (CPUPPCState *env, qemu_irq *irqs,
>                        uint32_t dcr_base, int has_ssr, int has_vr);
>
> -ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
> -                               MemoryRegion ram_memories[],
> -                               hwaddr ram_bases[],
> -                               hwaddr ram_sizes[],
> -                               const ram_addr_t sdram_bank_sizes[]);
> +void ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
> +                         MemoryRegion ram_memories[],
> +                         hwaddr ram_bases[], hwaddr ram_sizes[],
> +                         const ram_addr_t sdram_bank_sizes[]);

With this change this function does not adjust ram size any more so it may 
need to be renamed, e.g. ppc4xx_sdram_banks or something else.

A better patch title may be

ppc/{ppc440_bamboo,sam460x}: drop RAM size fixup

(or without curly braces at your preference).

This is inconvenient for the user because it worked whatever number 
they've given but now they have to do the math. So it suggests that what 
you're replacing this with may not support all the existing use cases. If 
that can't be fixed to allow checking and changing ram size (maybe via a 
callback in board code similar to above adjust function returning adjusted 
size) it may be OK to drop this convenience for the sake of cleaning up 
code elsewhere.

Regards,
BALATON Zoltan

> void ppc4xx_sdram_init (CPUPPCState *env, qemu_irq irq, int nbanks,
>                         MemoryRegion ram_memories[],
> diff --git a/hw/ppc/ppc440_bamboo.c b/hw/ppc/ppc440_bamboo.c
> index 4d95c0f..66dee89 100644
> --- a/hw/ppc/ppc440_bamboo.c
> +++ b/hw/ppc/ppc440_bamboo.c
> @@ -162,7 +162,6 @@ static void main_cpu_reset(void *opaque)
>
> static void bamboo_init(MachineState *machine)
> {
> -    ram_addr_t ram_size = machine->ram_size;
>     const char *kernel_filename = machine->kernel_filename;
>     const char *kernel_cmdline = machine->kernel_cmdline;
>     const char *initrd_filename = machine->initrd_filename;
> @@ -207,10 +206,8 @@ static void bamboo_init(MachineState *machine)
>     /* SDRAM controller */
>     memset(ram_bases, 0, sizeof(ram_bases));
>     memset(ram_sizes, 0, sizeof(ram_sizes));
> -    ram_size = ppc4xx_sdram_adjust(ram_size, PPC440EP_SDRAM_NR_BANKS,
> -                                   ram_memories,
> -                                   ram_bases, ram_sizes,
> -                                   ppc440ep_sdram_bank_sizes);
> +    ppc4xx_sdram_adjust(ram_size, PPC440EP_SDRAM_NR_BANKS, ram_memories,
> +                        ram_bases, ram_sizes, ppc440ep_sdram_bank_sizes);
>     /* XXX 440EP's ECC interrupts are on UIC1, but we've only created UIC0. */
>     ppc4xx_sdram_init(env, pic[14], PPC440EP_SDRAM_NR_BANKS, ram_memories,
>                       ram_bases, ram_sizes, 1);
> @@ -272,7 +269,7 @@ static void bamboo_init(MachineState *machine)
>     /* Load initrd. */
>     if (initrd_filename) {
>         initrd_size = load_image_targphys(initrd_filename, RAMDISK_ADDR,
> -                                          ram_size - RAMDISK_ADDR);
> +                                          machine->ram_size - RAMDISK_ADDR);
>
>         if (initrd_size < 0) {
>             error_report("could not load ram disk '%s' at %x",
> @@ -283,7 +280,7 @@ static void bamboo_init(MachineState *machine)
>
>     /* If we're loading a kernel directly, we must load the device tree too. */
>     if (kernel_filename) {
> -        if (bamboo_load_device_tree(FDT_ADDR, ram_size, RAMDISK_ADDR,
> +        if (bamboo_load_device_tree(FDT_ADDR, machine->ram_size, RAMDISK_ADDR,
>                                     initrd_size, kernel_cmdline) < 0) {
>             error_report("couldn't load device tree");
>             exit(1);
> diff --git a/hw/ppc/ppc4xx_devs.c b/hw/ppc/ppc4xx_devs.c
> index c2e5013..54af296 100644
> --- a/hw/ppc/ppc4xx_devs.c
> +++ b/hw/ppc/ppc4xx_devs.c
> @@ -673,11 +673,10 @@ void ppc4xx_sdram_init (CPUPPCState *env, qemu_irq irq, int nbanks,
>  * The 4xx SDRAM controller supports a small number of banks, and each bank
>  * must be one of a small set of sizes. The number of banks and the supported
>  * sizes varies by SoC. */
> -ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
> -                               MemoryRegion ram_memories[],
> -                               hwaddr ram_bases[],
> -                               hwaddr ram_sizes[],
> -                               const ram_addr_t sdram_bank_sizes[])
> +void ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
> +                         MemoryRegion ram_memories[],
> +                         hwaddr ram_bases[], hwaddr ram_sizes[],
> +                         const ram_addr_t sdram_bank_sizes[])
> {
>     MemoryRegion *ram = g_malloc0(sizeof(*ram));
>     ram_addr_t size_left = ram_size;
> @@ -699,10 +698,19 @@ ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
>         }
>     }
>
> -    ram_size -= size_left;
>     if (size_left) {
> -        error_report("Truncating memory to %" PRId64 " MiB to fit SDRAM"
> -                     " controller limits", ram_size / MiB);
> +        char *s = g_strdup("");
> +        for (i = 0; sdram_bank_sizes[i]; i++) {
> +            char *t = g_strdup_printf("%s%" PRIi64 "%s", s, sdram_bank_sizes[i],
> +                                      sdram_bank_sizes[i + 1] ? " ," : "");
> +            g_free(s);
> +            s = t;
> +        }
> +        error_report("Invalid RAM size, unable to fit all RAM into RAM banks"
> +                     " (unassigned RAM: %" PRIi64 ")",  size_left);
> +        error_report("Supported: %d banks and sizes/bank: %s", nr_banks, s);
> +        g_free(s);
> +        exit(EXIT_FAILURE);
>     }
>
>     memory_region_allocate_system_memory(ram, NULL, "ppc4xx.sdram", ram_size);
> @@ -725,8 +733,6 @@ ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
>             }
>         }
>     }
> -
> -    return ram_size;
> }
>
> /*****************************************************************************/
> diff --git a/hw/ppc/sam460ex.c b/hw/ppc/sam460ex.c
> index 437e214..f592816 100644
> --- a/hw/ppc/sam460ex.c
> +++ b/hw/ppc/sam460ex.c
> @@ -324,9 +324,8 @@ static void sam460ex_init(MachineState *machine)
>     /* SDRAM controller */
>     /* put all RAM on first bank because board has one slot
>      * and firmware only checks that */
> -    machine->ram_size = ppc4xx_sdram_adjust(machine->ram_size, 1,
> -                                   ram_memories, ram_bases, ram_sizes,
> -                                   ppc460ex_sdram_bank_sizes);
> +    ppc4xx_sdram_adjust(machine->ram_size, 1, ram_memories, ram_bases,
> +                        ram_sizes, ppc460ex_sdram_bank_sizes);
>
>     /* FIXME: does 460EX have ECC interrupts? */
>     ppc440_sdram_init(env, SDRAM_NR_BANKS, ram_memories,
>


^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH 66/86] ppc:ppc440_bamboo/sam460ex: drop RAM size fixup
  2020-01-01 11:54   ` BALATON Zoltan
@ 2020-01-01 15:39     ` Philippe Mathieu-Daudé
  2020-01-01 18:45       ` BALATON Zoltan
  2020-01-02 11:47     ` Igor Mammedov
  1 sibling, 1 reply; 148+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-01-01 15:39 UTC (permalink / raw)
  To: BALATON Zoltan, Igor Mammedov; +Cc: qemu-devel

On 1/1/20 12:54 PM, BALATON Zoltan wrote:
> On Tue, 31 Dec 2019, Igor Mammedov wrote:
>> If user provided non-sense RAM size, board will complain and
>> continue running with max RAM size supported.
>> Also RAM is going to be allocated by generic code, so it won't be
>> possible for board to fix things up for user.
>>
>> Make it error message and exit to force user fix CLI,
>> instead of accepting non-sense CLI values.
>>
>> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
>> ---
>> include/hw/ppc/ppc4xx.h |  9 ++++-----
>> hw/ppc/ppc440_bamboo.c  | 11 ++++-------
>> hw/ppc/ppc4xx_devs.c    | 26 ++++++++++++++++----------
>> hw/ppc/sam460ex.c       |  5 ++---
>> 4 files changed, 26 insertions(+), 25 deletions(-)
>>
>> diff --git a/include/hw/ppc/ppc4xx.h b/include/hw/ppc/ppc4xx.h
>> index 7d82259..1a28127 100644
>> --- a/include/hw/ppc/ppc4xx.h
>> +++ b/include/hw/ppc/ppc4xx.h
>> @@ -42,11 +42,10 @@ enum {
>> qemu_irq *ppcuic_init (CPUPPCState *env, qemu_irq *irqs,
>>                        uint32_t dcr_base, int has_ssr, int has_vr);
>>
>> -ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
>> -                               MemoryRegion ram_memories[],
>> -                               hwaddr ram_bases[],
>> -                               hwaddr ram_sizes[],
>> -                               const ram_addr_t sdram_bank_sizes[]);
>> +void ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
>> +                         MemoryRegion ram_memories[],
>> +                         hwaddr ram_bases[], hwaddr ram_sizes[],
>> +                         const ram_addr_t sdram_bank_sizes[]);
> 
> With this change this function does not adjust ram size any more so it 
> may need to be renamed, e.g. ppc4xx_sdram_banks or something else.
> 
> A better patch title may be
> 
> ppc/{ppc440_bamboo,sam460x}: drop RAM size fixup

Or split in 2 patches.



^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH 66/86] ppc:ppc440_bamboo/sam460ex: drop RAM size fixup
  2020-01-01 15:39     ` Philippe Mathieu-Daudé
@ 2020-01-01 18:45       ` BALATON Zoltan
  0 siblings, 0 replies; 148+ messages in thread
From: BALATON Zoltan @ 2020-01-01 18:45 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé; +Cc: Igor Mammedov, qemu-devel

[-- Attachment #1: Type: text/plain, Size: 2158 bytes --]

On Wed, 1 Jan 2020, Philippe Mathieu-Daudé wrote:
> On 1/1/20 12:54 PM, BALATON Zoltan wrote:
>> On Tue, 31 Dec 2019, Igor Mammedov wrote:
>>> If user provided non-sense RAM size, board will complain and
>>> continue running with max RAM size supported.
>>> Also RAM is going to be allocated by generic code, so it won't be
>>> possible for board to fix things up for user.
>>> 
>>> Make it error message and exit to force user fix CLI,
>>> instead of accepting non-sense CLI values.
>>> 
>>> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
>>> ---
>>> include/hw/ppc/ppc4xx.h |  9 ++++-----
>>> hw/ppc/ppc440_bamboo.c  | 11 ++++-------
>>> hw/ppc/ppc4xx_devs.c    | 26 ++++++++++++++++----------
>>> hw/ppc/sam460ex.c       |  5 ++---
>>> 4 files changed, 26 insertions(+), 25 deletions(-)
>>> 
>>> diff --git a/include/hw/ppc/ppc4xx.h b/include/hw/ppc/ppc4xx.h
>>> index 7d82259..1a28127 100644
>>> --- a/include/hw/ppc/ppc4xx.h
>>> +++ b/include/hw/ppc/ppc4xx.h
>>> @@ -42,11 +42,10 @@ enum {
>>> qemu_irq *ppcuic_init (CPUPPCState *env, qemu_irq *irqs,
>>>                        uint32_t dcr_base, int has_ssr, int has_vr);
>>> 
>>> -ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
>>> -                               MemoryRegion ram_memories[],
>>> -                               hwaddr ram_bases[],
>>> -                               hwaddr ram_sizes[],
>>> -                               const ram_addr_t sdram_bank_sizes[]);
>>> +void ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
>>> +                         MemoryRegion ram_memories[],
>>> +                         hwaddr ram_bases[], hwaddr ram_sizes[],
>>> +                         const ram_addr_t sdram_bank_sizes[]);
>> 
>> With this change this function does not adjust ram size any more so it may 
>> need to be renamed, e.g. ppc4xx_sdram_banks or something else.
>> 
>> A better patch title may be
>> 
>> ppc/{ppc440_bamboo,sam460x}: drop RAM size fixup
>
> Or split in 2 patches.

This is mainly patching a common function used by both so I think it's OK 
to do in one patch.

Regards,
BALATON Zoltan

^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH 43/86] hppa: drop RAM size fixup
  2019-12-31 15:44   ` Philippe Mathieu-Daudé
@ 2020-01-02 11:31     ` Helge Deller
  2020-01-02 12:06       ` Philippe Mathieu-Daudé
  2020-01-02 14:41       ` Igor Mammedov
  0 siblings, 2 replies; 148+ messages in thread
From: Helge Deller @ 2020-01-02 11:31 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé,
	Igor Mammedov, qemu-devel, Richard Henderson

On 31.12.19 16:44, Philippe Mathieu-Daudé wrote:
> On 12/31/19 2:03 PM, Igor Mammedov wrote:
>> If user provided non-sense RAM size, board will complain and
>> continue running with max RAM size supported.
>> Also RAM is going to be allocated by generic code, so it won't be
>> possible for board to fix things up for user.
>>
>> Make it error message and exit to force user fix CLI,
>> instead of accepting non-sense CLI values.
>>
>> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
>> ---
>>   hw/hppa/machine.c | 3 ++-
>>   1 file changed, 2 insertions(+), 1 deletion(-)
>>
>> diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
>> index 5d0de26..25f5afc 100644
>> --- a/hw/hppa/machine.c
>> +++ b/hw/hppa/machine.c
>> @@ -92,7 +92,8 @@ static void machine_hppa_init(MachineState *machine)
>>         /* Limit main memory. */
>>       if (ram_size > FIRMWARE_START) {
>> -        machine->ram_size = ram_size = FIRMWARE_START;
>> +        error_report("RAM size more than %d is not supported", FIRMWARE_START);
>> +        exit(EXIT_FAILURE);
>
> $ qemu-system-hppa -m 3841m
> qemu-system-hppa: invalid accelerator kvm
> qemu-system-hppa: falling back to tcg
> qemu-system-hppa: RAM size more than -268435456 is not supported
>
> Instead of using qemu_strtosz_MiB on FIRMWARE_START or unsigned format, we can simply use "RAM size more than 3840m is not supported". Is that OK with you?

I don't really like that change.

We currently only emulate a 32-bit system, and for those 4GB is the maximum.
So, if I start my machine with "qemu-system-hppa -m 4G", the current code
then automatically uses the maximum possible of 3841MB (which is limited by
firmware start address).
I don't expect users to know the excact 3841MB number.
Even on a phyiscal machine you can only add DIMMs of sizes 2GB, 3GB or 4GB,
but not "3841MB".

So, I think that patch is - although it's more correct - not a
benefit for the end user.

Helge


^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH 66/86] ppc:ppc440_bamboo/sam460ex: drop RAM size fixup
  2020-01-01 11:54   ` BALATON Zoltan
  2020-01-01 15:39     ` Philippe Mathieu-Daudé
@ 2020-01-02 11:47     ` Igor Mammedov
  2020-01-02 15:52       ` BALATON Zoltan
  1 sibling, 1 reply; 148+ messages in thread
From: Igor Mammedov @ 2020-01-02 11:47 UTC (permalink / raw)
  To: BALATON Zoltan; +Cc: qemu-devel

On Wed, 1 Jan 2020 12:54:37 +0100 (CET)
BALATON Zoltan <balaton@eik.bme.hu> wrote:

> On Tue, 31 Dec 2019, Igor Mammedov wrote:
> > If user provided non-sense RAM size, board will complain and
> > continue running with max RAM size supported.
> > Also RAM is going to be allocated by generic code, so it won't be
> > possible for board to fix things up for user.
> >
> > Make it error message and exit to force user fix CLI,
> > instead of accepting non-sense CLI values.
> >
> > Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> > ---
> > include/hw/ppc/ppc4xx.h |  9 ++++-----
> > hw/ppc/ppc440_bamboo.c  | 11 ++++-------
> > hw/ppc/ppc4xx_devs.c    | 26 ++++++++++++++++----------
> > hw/ppc/sam460ex.c       |  5 ++---
> > 4 files changed, 26 insertions(+), 25 deletions(-)
> >
> > diff --git a/include/hw/ppc/ppc4xx.h b/include/hw/ppc/ppc4xx.h
> > index 7d82259..1a28127 100644
> > --- a/include/hw/ppc/ppc4xx.h
> > +++ b/include/hw/ppc/ppc4xx.h
> > @@ -42,11 +42,10 @@ enum {
> > qemu_irq *ppcuic_init (CPUPPCState *env, qemu_irq *irqs,
> >                        uint32_t dcr_base, int has_ssr, int has_vr);
> >
> > -ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
> > -                               MemoryRegion ram_memories[],
> > -                               hwaddr ram_bases[],
> > -                               hwaddr ram_sizes[],
> > -                               const ram_addr_t sdram_bank_sizes[]);
> > +void ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
> > +                         MemoryRegion ram_memories[],
> > +                         hwaddr ram_bases[], hwaddr ram_sizes[],
> > +                         const ram_addr_t sdram_bank_sizes[]);  
> 
> With this change this function does not adjust ram size any more so it may 
> need to be renamed, e.g. ppc4xx_sdram_banks or something else.
> 
> A better patch title may be
> 
> ppc/{ppc440_bamboo,sam460x}: drop RAM size fixup
> 
> (or without curly braces at your preference).
I'll rename and use this subj as you suggest on v2.

> This is inconvenient for the user because it worked whatever number 
> they've given but now they have to do the math. So it suggests that what 
> you're replacing this with may not support all the existing use cases. If 
> that can't be fixed to allow checking and changing ram size (maybe via a 
> callback in board code similar to above adjust function returning adjusted 
> size) it may be OK to drop this convenience for the sake of cleaning up 
> code elsewhere.

There were few boards that did fix up and in all cases it was to cover up
invalid CLI input.
Creating callback for fixing user mistake doesn't seems to me justified,
I'd much prefer to have a hard error and consistent behavior across all
the boards versus being lax on error checking.

[...]


> > @@ -699,10 +698,19 @@ ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
> >         }
> >     }
> >
> > -    ram_size -= size_left;
> >     if (size_left) {
> > -        error_report("Truncating memory to %" PRId64 " MiB to fit SDRAM"
> > -                     " controller limits", ram_size / MiB);
> > +        char *s = g_strdup("");
> > +        for (i = 0; sdram_bank_sizes[i]; i++) {
> > +            char *t = g_strdup_printf("%s%" PRIi64 "%s", s, sdram_bank_sizes[i],
> > +                                      sdram_bank_sizes[i + 1] ? " ," : "");
> > +            g_free(s);
> > +            s = t;
> > +        }
> > +        error_report("Invalid RAM size, unable to fit all RAM into RAM banks"
> > +                     " (unassigned RAM: %" PRIi64 ")",  size_left);
> > +        error_report("Supported: %d banks and sizes/bank: %s", nr_banks, s);

Do you have any suggestions how to make error message better?
(maybe do calculation here and dump all valid -m variants instead of "#bank,size/bank")

> > +        g_free(s);
> > +        exit(EXIT_FAILURE);
> >     }
> >
> >     memory_region_allocate_system_memory(ram, NULL, "ppc4xx.sdram", ram_size);
> > @@ -725,8 +733,6 @@ ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
> >             }
> >         }
> >     }
> > -
> > -    return ram_size;
> > }
> >
> > /*****************************************************************************/
> > diff --git a/hw/ppc/sam460ex.c b/hw/ppc/sam460ex.c
> > index 437e214..f592816 100644
> > --- a/hw/ppc/sam460ex.c
> > +++ b/hw/ppc/sam460ex.c
> > @@ -324,9 +324,8 @@ static void sam460ex_init(MachineState *machine)
> >     /* SDRAM controller */
> >     /* put all RAM on first bank because board has one slot
> >      * and firmware only checks that */
> > -    machine->ram_size = ppc4xx_sdram_adjust(machine->ram_size, 1,
> > -                                   ram_memories, ram_bases, ram_sizes,
> > -                                   ppc460ex_sdram_bank_sizes);
> > +    ppc4xx_sdram_adjust(machine->ram_size, 1, ram_memories, ram_bases,
> > +                        ram_sizes, ppc460ex_sdram_bank_sizes);
> >
> >     /* FIXME: does 460EX have ECC interrupts? */
> >     ppc440_sdram_init(env, SDRAM_NR_BANKS, ram_memories,
> >  
> 



^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH 43/86] hppa: drop RAM size fixup
  2020-01-02 11:31     ` Helge Deller
@ 2020-01-02 12:06       ` Philippe Mathieu-Daudé
  2020-01-02 13:02         ` Helge Deller
  2020-01-02 14:12         ` Igor Mammedov
  2020-01-02 14:41       ` Igor Mammedov
  1 sibling, 2 replies; 148+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-01-02 12:06 UTC (permalink / raw)
  To: Helge Deller, Igor Mammedov, qemu-devel, Richard Henderson

On 1/2/20 12:31 PM, Helge Deller wrote:
> On 31.12.19 16:44, Philippe Mathieu-Daudé wrote:
>> On 12/31/19 2:03 PM, Igor Mammedov wrote:
>>> If user provided non-sense RAM size, board will complain and
>>> continue running with max RAM size supported.
>>> Also RAM is going to be allocated by generic code, so it won't be
>>> possible for board to fix things up for user.
>>>
>>> Make it error message and exit to force user fix CLI,
>>> instead of accepting non-sense CLI values.
>>>
>>> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
>>> ---
>>>    hw/hppa/machine.c | 3 ++-
>>>    1 file changed, 2 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
>>> index 5d0de26..25f5afc 100644
>>> --- a/hw/hppa/machine.c
>>> +++ b/hw/hppa/machine.c
>>> @@ -92,7 +92,8 @@ static void machine_hppa_init(MachineState *machine)
>>>          /* Limit main memory. */
>>>        if (ram_size > FIRMWARE_START) {
>>> -        machine->ram_size = ram_size = FIRMWARE_START;
>>> +        error_report("RAM size more than %d is not supported", FIRMWARE_START);
>>> +        exit(EXIT_FAILURE);
>>
>> $ qemu-system-hppa -m 3841m
>> qemu-system-hppa: invalid accelerator kvm
>> qemu-system-hppa: falling back to tcg
>> qemu-system-hppa: RAM size more than -268435456 is not supported
>>
>> Instead of using qemu_strtosz_MiB on FIRMWARE_START or unsigned format, we can simply use "RAM size more than 3840m is not supported". Is that OK with you?
> 
> I don't really like that change.
> 
> We currently only emulate a 32-bit system, and for those 4GB is the maximum.
> So, if I start my machine with "qemu-system-hppa -m 4G", the current code
> then automatically uses the maximum possible of 3841MB (which is limited by
> firmware start address).
> I don't expect users to know the excact 3841MB number.
> Even on a phyiscal machine you can only add DIMMs of sizes 2GB, 3GB or 4GB,
> but not "3841MB".

Thanks for the explanation. This deserves a comment in the source file 
IMHO (and displaying a warning to the user that the behavior is changed).

I understand the CPU can't access this DRAM area because the ROM is 
mapped there. What about other devices, can they do DMA access to it?

Igor: If this complicates your series too much, I think we can directly 
allocate up-to 4GiB and not worry about the 256MiB lost.

> So, I think that patch is - although it's more correct - not a
> benefit for the end user.
> 
> Helge
> 



^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH 43/86] hppa: drop RAM size fixup
  2020-01-02 12:06       ` Philippe Mathieu-Daudé
@ 2020-01-02 13:02         ` Helge Deller
  2020-01-02 14:47           ` Igor Mammedov
  2020-01-02 14:12         ` Igor Mammedov
  1 sibling, 1 reply; 148+ messages in thread
From: Helge Deller @ 2020-01-02 13:02 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé,
	Igor Mammedov, qemu-devel, Richard Henderson

On 02.01.20 13:06, Philippe Mathieu-Daudé wrote:
> On 1/2/20 12:31 PM, Helge Deller wrote:
>> On 31.12.19 16:44, Philippe Mathieu-Daudé wrote:
>>> On 12/31/19 2:03 PM, Igor Mammedov wrote:
>>>> If user provided non-sense RAM size, board will complain and
>>>> continue running with max RAM size supported.
>>>> Also RAM is going to be allocated by generic code, so it won't be
>>>> possible for board to fix things up for user.
>>>>
>>>> Make it error message and exit to force user fix CLI,
>>>> instead of accepting non-sense CLI values.
>>>>
>>>> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
>>>> ---
>>>>    hw/hppa/machine.c | 3 ++-
>>>>    1 file changed, 2 insertions(+), 1 deletion(-)
>>>>
>>>> diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
>>>> index 5d0de26..25f5afc 100644
>>>> --- a/hw/hppa/machine.c
>>>> +++ b/hw/hppa/machine.c
>>>> @@ -92,7 +92,8 @@ static void machine_hppa_init(MachineState *machine)
>>>>          /* Limit main memory. */
>>>>        if (ram_size > FIRMWARE_START) {
>>>> -        machine->ram_size = ram_size = FIRMWARE_START;
>>>> +        error_report("RAM size more than %d is not supported", FIRMWARE_START);
>>>> +        exit(EXIT_FAILURE);
>>>
>>> $ qemu-system-hppa -m 3841m
>>> qemu-system-hppa: invalid accelerator kvm
>>> qemu-system-hppa: falling back to tcg
>>> qemu-system-hppa: RAM size more than -268435456 is not supported
>>>
>>> Instead of using qemu_strtosz_MiB on FIRMWARE_START or unsigned format, we can simply use "RAM size more than 3840m is not supported". Is that OK with you?
>>
>> I don't really like that change.
>>
>> We currently only emulate a 32-bit system, and for those 4GB is the maximum.
>> So, if I start my machine with "qemu-system-hppa -m 4G", the current code
>> then automatically uses the maximum possible of 3841MB (which is limited by
>> firmware start address).
>> I don't expect users to know the excact 3841MB number.
>> Even on a phyiscal machine you can only add DIMMs of sizes 2GB, 3GB or 4GB,
>> but not "3841MB".
>
> Thanks for the explanation. This deserves a comment in the source
> file IMHO (and displaying a warning to the user that the behavior is
> changed).

If you put 4GB physically in the box, you wouldn't get a warning either...
It will simply use just 3841MB.

> I understand the CPU can't access this DRAM area because the ROM is
> mapped there. What about other devices, can they do DMA access to
> it?

Yes, I think so.

> Igor: If this complicates your series too much, I think we can
> directly allocate up-to 4GiB and not worry about the 256MiB lost.

Sounds like the best solution.

Helge


^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH 43/86] hppa: drop RAM size fixup
  2020-01-02 12:06       ` Philippe Mathieu-Daudé
  2020-01-02 13:02         ` Helge Deller
@ 2020-01-02 14:12         ` Igor Mammedov
  2020-01-02 14:17           ` Philippe Mathieu-Daudé
  1 sibling, 1 reply; 148+ messages in thread
From: Igor Mammedov @ 2020-01-02 14:12 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé; +Cc: Helge Deller, qemu-devel, Richard Henderson

On Thu, 2 Jan 2020 13:06:33 +0100
Philippe Mathieu-Daudé <philmd@redhat.com> wrote:

> On 1/2/20 12:31 PM, Helge Deller wrote:
> > On 31.12.19 16:44, Philippe Mathieu-Daudé wrote:  
> >> On 12/31/19 2:03 PM, Igor Mammedov wrote:  
> >>> If user provided non-sense RAM size, board will complain and
> >>> continue running with max RAM size supported.
> >>> Also RAM is going to be allocated by generic code, so it won't be
> >>> possible for board to fix things up for user.
> >>>
> >>> Make it error message and exit to force user fix CLI,
> >>> instead of accepting non-sense CLI values.
> >>>
> >>> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> >>> ---
> >>>    hw/hppa/machine.c | 3 ++-
> >>>    1 file changed, 2 insertions(+), 1 deletion(-)
> >>>
> >>> diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
> >>> index 5d0de26..25f5afc 100644
> >>> --- a/hw/hppa/machine.c
> >>> +++ b/hw/hppa/machine.c
> >>> @@ -92,7 +92,8 @@ static void machine_hppa_init(MachineState *machine)
> >>>          /* Limit main memory. */
> >>>        if (ram_size > FIRMWARE_START) {
> >>> -        machine->ram_size = ram_size = FIRMWARE_START;
> >>> +        error_report("RAM size more than %d is not supported", FIRMWARE_START);
> >>> +        exit(EXIT_FAILURE);  
> >>
> >> $ qemu-system-hppa -m 3841m
> >> qemu-system-hppa: invalid accelerator kvm
> >> qemu-system-hppa: falling back to tcg
> >> qemu-system-hppa: RAM size more than -268435456 is not supported
> >>
> >> Instead of using qemu_strtosz_MiB on FIRMWARE_START or unsigned format, we can simply use "RAM size more than 3840m is not supported". Is that OK with you?  
> > 
> > I don't really like that change.
> > 
> > We currently only emulate a 32-bit system, and for those 4GB is the maximum.
> > So, if I start my machine with "qemu-system-hppa -m 4G", the current code
> > then automatically uses the maximum possible of 3841MB (which is limited by
> > firmware start address).
> > I don't expect users to know the excact 3841MB number.
> > Even on a phyiscal machine you can only add DIMMs of sizes 2GB, 3GB or 4GB,
> > but not "3841MB".  
> 
> Thanks for the explanation. This deserves a comment in the source file 
> IMHO (and displaying a warning to the user that the behavior is changed).
> 
> I understand the CPU can't access this DRAM area because the ROM is 
> mapped there. What about other devices, can they do DMA access to it?
> 
> Igor: If this complicates your series too much, I think we can directly 
> allocate up-to 4GiB and not worry about the 256MiB lost.

Do you mean
s/"RAM size more than %d is not supported"/"RAM size more than 4Gb is not supported"/

> > So, I think that patch is - although it's more correct - not a
> > benefit for the end user.
> > 
> > Helge
> >   
> 
> 



^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH 43/86] hppa: drop RAM size fixup
  2020-01-02 14:12         ` Igor Mammedov
@ 2020-01-02 14:17           ` Philippe Mathieu-Daudé
  2020-01-02 15:08             ` Igor Mammedov
  0 siblings, 1 reply; 148+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-01-02 14:17 UTC (permalink / raw)
  To: Igor Mammedov; +Cc: Helge Deller, qemu-devel, Richard Henderson

On 1/2/20 3:12 PM, Igor Mammedov wrote:
> On Thu, 2 Jan 2020 13:06:33 +0100
> Philippe Mathieu-Daudé <philmd@redhat.com> wrote:
> 
>> On 1/2/20 12:31 PM, Helge Deller wrote:
>>> On 31.12.19 16:44, Philippe Mathieu-Daudé wrote:
>>>> On 12/31/19 2:03 PM, Igor Mammedov wrote:
>>>>> If user provided non-sense RAM size, board will complain and
>>>>> continue running with max RAM size supported.
>>>>> Also RAM is going to be allocated by generic code, so it won't be
>>>>> possible for board to fix things up for user.
>>>>>
>>>>> Make it error message and exit to force user fix CLI,
>>>>> instead of accepting non-sense CLI values.
>>>>>
>>>>> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
>>>>> ---
>>>>>     hw/hppa/machine.c | 3 ++-
>>>>>     1 file changed, 2 insertions(+), 1 deletion(-)
>>>>>
>>>>> diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
>>>>> index 5d0de26..25f5afc 100644
>>>>> --- a/hw/hppa/machine.c
>>>>> +++ b/hw/hppa/machine.c
>>>>> @@ -92,7 +92,8 @@ static void machine_hppa_init(MachineState *machine)
>>>>>           /* Limit main memory. */
>>>>>         if (ram_size > FIRMWARE_START) {
>>>>> -        machine->ram_size = ram_size = FIRMWARE_START;
>>>>> +        error_report("RAM size more than %d is not supported", FIRMWARE_START);
>>>>> +        exit(EXIT_FAILURE);
>>>>
>>>> $ qemu-system-hppa -m 3841m
>>>> qemu-system-hppa: invalid accelerator kvm
>>>> qemu-system-hppa: falling back to tcg
>>>> qemu-system-hppa: RAM size more than -268435456 is not supported
>>>>
>>>> Instead of using qemu_strtosz_MiB on FIRMWARE_START or unsigned format, we can simply use "RAM size more than 3840m is not supported". Is that OK with you?
>>>
>>> I don't really like that change.
>>>
>>> We currently only emulate a 32-bit system, and for those 4GB is the maximum.
>>> So, if I start my machine with "qemu-system-hppa -m 4G", the current code
>>> then automatically uses the maximum possible of 3841MB (which is limited by
>>> firmware start address).
>>> I don't expect users to know the excact 3841MB number.
>>> Even on a phyiscal machine you can only add DIMMs of sizes 2GB, 3GB or 4GB,
>>> but not "3841MB".
>>
>> Thanks for the explanation. This deserves a comment in the source file
>> IMHO (and displaying a warning to the user that the behavior is changed).
>>
>> I understand the CPU can't access this DRAM area because the ROM is
>> mapped there. What about other devices, can they do DMA access to it?
>>
>> Igor: If this complicates your series too much, I think we can directly
>> allocate up-to 4GiB and not worry about the 256MiB lost.
> 
> Do you mean
> s/"RAM size more than %d is not supported"/"RAM size more than 4Gb is not supported"/

Works for me! You can keep my R-b with this change, thanks.

>>> So, I think that patch is - although it's more correct - not a
>>> benefit for the end user.
>>>
>>> Helge
>>>    
>>
>>
> 



^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH 43/86] hppa: drop RAM size fixup
  2020-01-02 11:31     ` Helge Deller
  2020-01-02 12:06       ` Philippe Mathieu-Daudé
@ 2020-01-02 14:41       ` Igor Mammedov
  2020-01-02 14:45         ` Philippe Mathieu-Daudé
  1 sibling, 1 reply; 148+ messages in thread
From: Igor Mammedov @ 2020-01-02 14:41 UTC (permalink / raw)
  To: Helge Deller; +Cc: Philippe Mathieu-Daudé, qemu-devel, Richard Henderson

On Thu, 2 Jan 2020 12:31:58 +0100
Helge Deller <deller@gmx.de> wrote:

> On 31.12.19 16:44, Philippe Mathieu-Daudé wrote:
> > On 12/31/19 2:03 PM, Igor Mammedov wrote:  
> >> If user provided non-sense RAM size, board will complain and
> >> continue running with max RAM size supported.
> >> Also RAM is going to be allocated by generic code, so it won't be
> >> possible for board to fix things up for user.
> >>
> >> Make it error message and exit to force user fix CLI,
> >> instead of accepting non-sense CLI values.
> >>
> >> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> >> ---
> >>   hw/hppa/machine.c | 3 ++-
> >>   1 file changed, 2 insertions(+), 1 deletion(-)
> >>
> >> diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
> >> index 5d0de26..25f5afc 100644
> >> --- a/hw/hppa/machine.c
> >> +++ b/hw/hppa/machine.c
> >> @@ -92,7 +92,8 @@ static void machine_hppa_init(MachineState *machine)
> >>         /* Limit main memory. */
> >>       if (ram_size > FIRMWARE_START) {
> >> -        machine->ram_size = ram_size = FIRMWARE_START;
> >> +        error_report("RAM size more than %d is not supported", FIRMWARE_START);
> >> +        exit(EXIT_FAILURE);  
> >
> > $ qemu-system-hppa -m 3841m
> > qemu-system-hppa: invalid accelerator kvm
> > qemu-system-hppa: falling back to tcg
> > qemu-system-hppa: RAM size more than -268435456 is not supported
> >
> > Instead of using qemu_strtosz_MiB on FIRMWARE_START or unsigned format, we can simply use "RAM size more than 3840m is not supported". Is that OK with you?  
> 
> I don't really like that change.
> 
> We currently only emulate a 32-bit system, and for those 4GB is the maximum.
> So, if I start my machine with "qemu-system-hppa -m 4G", the current code
> then automatically uses the maximum possible of 3841MB (which is limited by
> firmware start address).
> I don't expect users to know the excact 3841MB number.
It's annoying to see a error where it used to work before
with no matter what -m value user have used.

But error message tells exact max size one could use,
so user doesn't have to know max, just fix CLI with provided value.

> Even on a phyiscal machine you can only add DIMMs of sizes 2GB, 3GB or 4GB,
> but not "3841MB".
> 
> So, I think that patch is - although it's more correct - not a
> benefit for the end user.
Sure thing that users dislike when we do breaking changes (removing legacy CLI
options, fixups or adding error checks that weren't there before).
But I'd choose correctness (and consistent codebase) vs convenience.
(it's no like we are hiding max from user)


> Helge
> 



^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH 43/86] hppa: drop RAM size fixup
  2020-01-02 14:41       ` Igor Mammedov
@ 2020-01-02 14:45         ` Philippe Mathieu-Daudé
  2020-01-02 15:35           ` Igor Mammedov
  0 siblings, 1 reply; 148+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-01-02 14:45 UTC (permalink / raw)
  To: Igor Mammedov, Helge Deller; +Cc: qemu-devel, Richard Henderson

On 1/2/20 3:41 PM, Igor Mammedov wrote:
> On Thu, 2 Jan 2020 12:31:58 +0100
> Helge Deller <deller@gmx.de> wrote:
> 
>> On 31.12.19 16:44, Philippe Mathieu-Daudé wrote:
>>> On 12/31/19 2:03 PM, Igor Mammedov wrote:
>>>> If user provided non-sense RAM size, board will complain and
>>>> continue running with max RAM size supported.
>>>> Also RAM is going to be allocated by generic code, so it won't be
>>>> possible for board to fix things up for user.
>>>>
>>>> Make it error message and exit to force user fix CLI,
>>>> instead of accepting non-sense CLI values.
>>>>
>>>> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
>>>> ---
>>>>    hw/hppa/machine.c | 3 ++-
>>>>    1 file changed, 2 insertions(+), 1 deletion(-)
>>>>
>>>> diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
>>>> index 5d0de26..25f5afc 100644
>>>> --- a/hw/hppa/machine.c
>>>> +++ b/hw/hppa/machine.c
>>>> @@ -92,7 +92,8 @@ static void machine_hppa_init(MachineState *machine)
>>>>          /* Limit main memory. */
>>>>        if (ram_size > FIRMWARE_START) {
>>>> -        machine->ram_size = ram_size = FIRMWARE_START;
>>>> +        error_report("RAM size more than %d is not supported", FIRMWARE_START);
>>>> +        exit(EXIT_FAILURE);
>>>
>>> $ qemu-system-hppa -m 3841m
>>> qemu-system-hppa: invalid accelerator kvm
>>> qemu-system-hppa: falling back to tcg
>>> qemu-system-hppa: RAM size more than -268435456 is not supported
>>>
>>> Instead of using qemu_strtosz_MiB on FIRMWARE_START or unsigned format, we can simply use "RAM size more than 3840m is not supported". Is that OK with you?
>>
>> I don't really like that change.
>>
>> We currently only emulate a 32-bit system, and for those 4GB is the maximum.
>> So, if I start my machine with "qemu-system-hppa -m 4G", the current code
>> then automatically uses the maximum possible of 3841MB (which is limited by
>> firmware start address).
>> I don't expect users to know the excact 3841MB number.
> It's annoying to see a error where it used to work before
> with no matter what -m value user have used.
> 
> But error message tells exact max size one could use,
> so user doesn't have to know max, just fix CLI with provided value.
> 
>> Even on a phyiscal machine you can only add DIMMs of sizes 2GB, 3GB or 4GB,
>> but not "3841MB".
>>
>> So, I think that patch is - although it's more correct - not a
>> benefit for the end user.
> Sure thing that users dislike when we do breaking changes (removing legacy CLI
> options, fixups or adding error checks that weren't there before).
> But I'd choose correctness (and consistent codebase) vs convenience.
> (it's no like we are hiding max from user)

Going from 3841MB to 4GB is not a breaking change, and 4GB is correct I 
think. The Raspberry Pi machines do the same (allocate more RAM than the 
CPU is able to access, and DMA is able to use this extra RAM).



^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH 43/86] hppa: drop RAM size fixup
  2020-01-02 13:02         ` Helge Deller
@ 2020-01-02 14:47           ` Igor Mammedov
  0 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2020-01-02 14:47 UTC (permalink / raw)
  To: Helge Deller; +Cc: Philippe Mathieu-Daudé, qemu-devel, Richard Henderson

On Thu, 2 Jan 2020 14:02:01 +0100
Helge Deller <deller@gmx.de> wrote:

> On 02.01.20 13:06, Philippe Mathieu-Daudé wrote:
> > On 1/2/20 12:31 PM, Helge Deller wrote:  
> >> On 31.12.19 16:44, Philippe Mathieu-Daudé wrote:  
> >>> On 12/31/19 2:03 PM, Igor Mammedov wrote:  
> >>>> If user provided non-sense RAM size, board will complain and
> >>>> continue running with max RAM size supported.
> >>>> Also RAM is going to be allocated by generic code, so it won't be
> >>>> possible for board to fix things up for user.
> >>>>
> >>>> Make it error message and exit to force user fix CLI,
> >>>> instead of accepting non-sense CLI values.
> >>>>
> >>>> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> >>>> ---
> >>>>    hw/hppa/machine.c | 3 ++-
> >>>>    1 file changed, 2 insertions(+), 1 deletion(-)
> >>>>
> >>>> diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
> >>>> index 5d0de26..25f5afc 100644
> >>>> --- a/hw/hppa/machine.c
> >>>> +++ b/hw/hppa/machine.c
> >>>> @@ -92,7 +92,8 @@ static void machine_hppa_init(MachineState *machine)
> >>>>          /* Limit main memory. */
> >>>>        if (ram_size > FIRMWARE_START) {
> >>>> -        machine->ram_size = ram_size = FIRMWARE_START;
> >>>> +        error_report("RAM size more than %d is not supported", FIRMWARE_START);
> >>>> +        exit(EXIT_FAILURE);  
> >>>
> >>> $ qemu-system-hppa -m 3841m
> >>> qemu-system-hppa: invalid accelerator kvm
> >>> qemu-system-hppa: falling back to tcg
> >>> qemu-system-hppa: RAM size more than -268435456 is not supported
> >>>
> >>> Instead of using qemu_strtosz_MiB on FIRMWARE_START or unsigned format, we can simply use "RAM size more than 3840m is not supported". Is that OK with you?  
> >>
> >> I don't really like that change.
> >>
> >> We currently only emulate a 32-bit system, and for those 4GB is the maximum.
> >> So, if I start my machine with "qemu-system-hppa -m 4G", the current code
> >> then automatically uses the maximum possible of 3841MB (which is limited by
> >> firmware start address).
> >> I don't expect users to know the excact 3841MB number.
> >> Even on a phyiscal machine you can only add DIMMs of sizes 2GB, 3GB or 4GB,
> >> but not "3841MB".  
> >
> > Thanks for the explanation. This deserves a comment in the source
> > file IMHO (and displaying a warning to the user that the behavior is
> > changed).  
> 
> If you put 4GB physically in the box, you wouldn't get a warning either...
> It will simply use just 3841MB.
> 
> > I understand the CPU can't access this DRAM area because the ROM is
> > mapped there. What about other devices, can they do DMA access to
> > it?  
> 
> Yes, I think so.

Question is if is it supported/used in current impl?

If it's not then lets keep a hard error providing the exact max value,
instead of complicating code for unclear benefit.

> 
> > Igor: If this complicates your series too much, I think we can
> > directly allocate up-to 4GiB and not worry about the 256MiB lost.  
> 
> Sounds like the best solution.
> 
> Helge
> 



^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH 43/86] hppa: drop RAM size fixup
  2020-01-02 14:17           ` Philippe Mathieu-Daudé
@ 2020-01-02 15:08             ` Igor Mammedov
  2020-01-02 15:49               ` Philippe Mathieu-Daudé
  0 siblings, 1 reply; 148+ messages in thread
From: Igor Mammedov @ 2020-01-02 15:08 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé; +Cc: Helge Deller, qemu-devel, Richard Henderson

On Thu, 2 Jan 2020 15:17:14 +0100
Philippe Mathieu-Daudé <philmd@redhat.com> wrote:

> On 1/2/20 3:12 PM, Igor Mammedov wrote:
> > On Thu, 2 Jan 2020 13:06:33 +0100
> > Philippe Mathieu-Daudé <philmd@redhat.com> wrote:
> >   
> >> On 1/2/20 12:31 PM, Helge Deller wrote:  
> >>> On 31.12.19 16:44, Philippe Mathieu-Daudé wrote:  
> >>>> On 12/31/19 2:03 PM, Igor Mammedov wrote:  
> >>>>> If user provided non-sense RAM size, board will complain and
> >>>>> continue running with max RAM size supported.
> >>>>> Also RAM is going to be allocated by generic code, so it won't be
> >>>>> possible for board to fix things up for user.
> >>>>>
> >>>>> Make it error message and exit to force user fix CLI,
> >>>>> instead of accepting non-sense CLI values.
> >>>>>
> >>>>> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> >>>>> ---
> >>>>>     hw/hppa/machine.c | 3 ++-
> >>>>>     1 file changed, 2 insertions(+), 1 deletion(-)
> >>>>>
> >>>>> diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
> >>>>> index 5d0de26..25f5afc 100644
> >>>>> --- a/hw/hppa/machine.c
> >>>>> +++ b/hw/hppa/machine.c
> >>>>> @@ -92,7 +92,8 @@ static void machine_hppa_init(MachineState *machine)
> >>>>>           /* Limit main memory. */
> >>>>>         if (ram_size > FIRMWARE_START) {
> >>>>> -        machine->ram_size = ram_size = FIRMWARE_START;
> >>>>> +        error_report("RAM size more than %d is not supported", FIRMWARE_START);
> >>>>> +        exit(EXIT_FAILURE);  
> >>>>
> >>>> $ qemu-system-hppa -m 3841m
> >>>> qemu-system-hppa: invalid accelerator kvm
> >>>> qemu-system-hppa: falling back to tcg
> >>>> qemu-system-hppa: RAM size more than -268435456 is not supported
> >>>>
> >>>> Instead of using qemu_strtosz_MiB on FIRMWARE_START or unsigned format, we can simply use "RAM size more than 3840m is not supported". Is that OK with you?  
> >>>
> >>> I don't really like that change.
> >>>
> >>> We currently only emulate a 32-bit system, and for those 4GB is the maximum.
> >>> So, if I start my machine with "qemu-system-hppa -m 4G", the current code
> >>> then automatically uses the maximum possible of 3841MB (which is limited by
> >>> firmware start address).
> >>> I don't expect users to know the excact 3841MB number.
> >>> Even on a phyiscal machine you can only add DIMMs of sizes 2GB, 3GB or 4GB,
> >>> but not "3841MB".  
> >>
> >> Thanks for the explanation. This deserves a comment in the source file
> >> IMHO (and displaying a warning to the user that the behavior is changed).
> >>
> >> I understand the CPU can't access this DRAM area because the ROM is
> >> mapped there. What about other devices, can they do DMA access to it?
> >>
> >> Igor: If this complicates your series too much, I think we can directly
> >> allocate up-to 4GiB and not worry about the 256MiB lost.  
> > 
> > Do you mean
> > s/"RAM size more than %d is not supported"/"RAM size more than 4Gb is not supported"/  
> 
> Works for me! You can keep my R-b with this change, thanks.

Well, it's not that simple.
Do we map whole 4G in address space, if yes then we have to "unbreak"
firmware mapping and use overlap mapping or do we map only portion of it?
Both would make code more confusing and all for the sake of user convenience
so they won't have to change their CLI?


> >>> So, I think that patch is - although it's more correct - not a
> >>> benefit for the end user.
> >>>
> >>> Helge
> >>>      
> >>
> >>  
> >   
> 



^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH 43/86] hppa: drop RAM size fixup
  2020-01-02 14:45         ` Philippe Mathieu-Daudé
@ 2020-01-02 15:35           ` Igor Mammedov
  2020-01-02 15:40             ` Philippe Mathieu-Daudé
  0 siblings, 1 reply; 148+ messages in thread
From: Igor Mammedov @ 2020-01-02 15:35 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé; +Cc: Helge Deller, qemu-devel, Richard Henderson

On Thu, 2 Jan 2020 15:45:55 +0100
Philippe Mathieu-Daudé <philmd@redhat.com> wrote:

> On 1/2/20 3:41 PM, Igor Mammedov wrote:
> > On Thu, 2 Jan 2020 12:31:58 +0100
> > Helge Deller <deller@gmx.de> wrote:
> >   
> >> On 31.12.19 16:44, Philippe Mathieu-Daudé wrote:  
> >>> On 12/31/19 2:03 PM, Igor Mammedov wrote:  
> >>>> If user provided non-sense RAM size, board will complain and
> >>>> continue running with max RAM size supported.
> >>>> Also RAM is going to be allocated by generic code, so it won't be
> >>>> possible for board to fix things up for user.
> >>>>
> >>>> Make it error message and exit to force user fix CLI,
> >>>> instead of accepting non-sense CLI values.
> >>>>
> >>>> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> >>>> ---
> >>>>    hw/hppa/machine.c | 3 ++-
> >>>>    1 file changed, 2 insertions(+), 1 deletion(-)
> >>>>
> >>>> diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
> >>>> index 5d0de26..25f5afc 100644
> >>>> --- a/hw/hppa/machine.c
> >>>> +++ b/hw/hppa/machine.c
> >>>> @@ -92,7 +92,8 @@ static void machine_hppa_init(MachineState *machine)
> >>>>          /* Limit main memory. */
> >>>>        if (ram_size > FIRMWARE_START) {
> >>>> -        machine->ram_size = ram_size = FIRMWARE_START;
> >>>> +        error_report("RAM size more than %d is not supported", FIRMWARE_START);
> >>>> +        exit(EXIT_FAILURE);  
> >>>
> >>> $ qemu-system-hppa -m 3841m
> >>> qemu-system-hppa: invalid accelerator kvm
> >>> qemu-system-hppa: falling back to tcg
> >>> qemu-system-hppa: RAM size more than -268435456 is not supported
> >>>
> >>> Instead of using qemu_strtosz_MiB on FIRMWARE_START or unsigned format, we can simply use "RAM size more than 3840m is not supported". Is that OK with you?  
> >>
> >> I don't really like that change.
> >>
> >> We currently only emulate a 32-bit system, and for those 4GB is the maximum.
> >> So, if I start my machine with "qemu-system-hppa -m 4G", the current code
> >> then automatically uses the maximum possible of 3841MB (which is limited by
> >> firmware start address).
> >> I don't expect users to know the excact 3841MB number.  
> > It's annoying to see a error where it used to work before
> > with no matter what -m value user have used.
> > 
> > But error message tells exact max size one could use,
> > so user doesn't have to know max, just fix CLI with provided value.
> >   
> >> Even on a phyiscal machine you can only add DIMMs of sizes 2GB, 3GB or 4GB,
> >> but not "3841MB".
> >>
> >> So, I think that patch is - although it's more correct - not a
> >> benefit for the end user.  
> > Sure thing that users dislike when we do breaking changes (removing legacy CLI
> > options, fixups or adding error checks that weren't there before).
> > But I'd choose correctness (and consistent codebase) vs convenience.
> > (it's no like we are hiding max from user)  
> 
> Going from 3841MB to 4GB is not a breaking change, and 4GB is correct I 
under breaking change, I've meant exit with error when it used to work with
any values.

But the point in removing fixups to make user aware of valid input and
make clear what's going on when someone reads the code.

QEMU code is already too complex to read, so I'd avoid supporting values
that are not really supported by current impl. just for the sake of convenience.
(a wrapper script could do that RAM size clamping if it is really necessary)

> think. The Raspberry Pi machines do the same (allocate more RAM than the
> CPU is able to access, and DMA is able to use this extra RAM).
In current impl. raspi accepts RAM upto 1Gb maps all of it and reports
that size to the guest. QEMU doesn't mask or waste anything.
If we where to rise limit upto 4Gb, then there should be the code that
would inform and allow guest utilize that.




^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH 43/86] hppa: drop RAM size fixup
  2020-01-02 15:35           ` Igor Mammedov
@ 2020-01-02 15:40             ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 148+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-01-02 15:40 UTC (permalink / raw)
  To: Igor Mammedov; +Cc: Helge Deller, qemu-devel, Richard Henderson

On 1/2/20 4:35 PM, Igor Mammedov wrote:
> On Thu, 2 Jan 2020 15:45:55 +0100
> Philippe Mathieu-Daudé <philmd@redhat.com> wrote:
> 
>> On 1/2/20 3:41 PM, Igor Mammedov wrote:
>>> On Thu, 2 Jan 2020 12:31:58 +0100
>>> Helge Deller <deller@gmx.de> wrote:
>>>    
>>>> On 31.12.19 16:44, Philippe Mathieu-Daudé wrote:
>>>>> On 12/31/19 2:03 PM, Igor Mammedov wrote:
>>>>>> If user provided non-sense RAM size, board will complain and
>>>>>> continue running with max RAM size supported.
>>>>>> Also RAM is going to be allocated by generic code, so it won't be
>>>>>> possible for board to fix things up for user.
>>>>>>
>>>>>> Make it error message and exit to force user fix CLI,
>>>>>> instead of accepting non-sense CLI values.
>>>>>>
>>>>>> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
>>>>>> ---
>>>>>>     hw/hppa/machine.c | 3 ++-
>>>>>>     1 file changed, 2 insertions(+), 1 deletion(-)
>>>>>>
>>>>>> diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
>>>>>> index 5d0de26..25f5afc 100644
>>>>>> --- a/hw/hppa/machine.c
>>>>>> +++ b/hw/hppa/machine.c
>>>>>> @@ -92,7 +92,8 @@ static void machine_hppa_init(MachineState *machine)
>>>>>>           /* Limit main memory. */
>>>>>>         if (ram_size > FIRMWARE_START) {
>>>>>> -        machine->ram_size = ram_size = FIRMWARE_START;
>>>>>> +        error_report("RAM size more than %d is not supported", FIRMWARE_START);
>>>>>> +        exit(EXIT_FAILURE);
>>>>>
>>>>> $ qemu-system-hppa -m 3841m
>>>>> qemu-system-hppa: invalid accelerator kvm
>>>>> qemu-system-hppa: falling back to tcg
>>>>> qemu-system-hppa: RAM size more than -268435456 is not supported
>>>>>
>>>>> Instead of using qemu_strtosz_MiB on FIRMWARE_START or unsigned format, we can simply use "RAM size more than 3840m is not supported". Is that OK with you?
>>>>
>>>> I don't really like that change.
>>>>
>>>> We currently only emulate a 32-bit system, and for those 4GB is the maximum.
>>>> So, if I start my machine with "qemu-system-hppa -m 4G", the current code
>>>> then automatically uses the maximum possible of 3841MB (which is limited by
>>>> firmware start address).
>>>> I don't expect users to know the excact 3841MB number.
>>> It's annoying to see a error where it used to work before
>>> with no matter what -m value user have used.
>>>
>>> But error message tells exact max size one could use,
>>> so user doesn't have to know max, just fix CLI with provided value.
>>>    
>>>> Even on a phyiscal machine you can only add DIMMs of sizes 2GB, 3GB or 4GB,
>>>> but not "3841MB".
>>>>
>>>> So, I think that patch is - although it's more correct - not a
>>>> benefit for the end user.
>>> Sure thing that users dislike when we do breaking changes (removing legacy CLI
>>> options, fixups or adding error checks that weren't there before).
>>> But I'd choose correctness (and consistent codebase) vs convenience.
>>> (it's no like we are hiding max from user)
>>
>> Going from 3841MB to 4GB is not a breaking change, and 4GB is correct I
> under breaking change, I've meant exit with error when it used to work with
> any values.
> 
> But the point in removing fixups to make user aware of valid input and
> make clear what's going on when someone reads the code.
> 
> QEMU code is already too complex to read, so I'd avoid supporting values
> that are not really supported by current impl. just for the sake of convenience.
> (a wrapper script could do that RAM size clamping if it is really necessary)
> 
>> think. The Raspberry Pi machines do the same (allocate more RAM than the
>> CPU is able to access, and DMA is able to use this extra RAM).
> In current impl. raspi accepts RAM upto 1Gb maps all of it and reports
> that size to the guest. QEMU doesn't mask or waste anything.
> If we where to rise limit upto 4Gb, then there should be the code that
> would inform and allow guest utilize that.

For the raspi2/3, 16MB are lost and we don't complain neither change the 
ram_size, see the bcm2835-peripherals block overmapping the ram:

$ qemu-system-aarch64 -M raspi3 -monitor stdio -S
QEMU 3.1.1 monitor - type 'help' for more information
(qemu) info mtree
address-space: memory
   0000000000000000-ffffffffffffffff (prio 0, i/o): system
     0000000000000000-000000003fffffff (prio 0, ram): ram
     000000003f000000-000000003fffffff (prio 1, i/o): bcm2835-peripherals
       000000003f007000-000000003f007fff (prio 0, i/o): bcm2835-dma
       000000003f00b200-000000003f00b3ff (prio 0, i/o): bcm2835-ic
       000000003f00b800-000000003f00bbff (prio 0, i/o): bcm2835-mbox
       000000003f104000-000000003f10400f (prio 0, i/o): bcm2835-rng
       000000003f200000-000000003f200fff (prio 0, i/o): bcm2835_gpio
       000000003f201000-000000003f201fff (prio 0, i/o): pl011
       000000003f202000-000000003f202fff (prio 0, i/o): bcm2835-sdhost
       000000003f215000-000000003f2150ff (prio 0, i/o): bcm2835-aux
       000000003f300000-000000003f3000ff (prio 0, i/o): sdhci
       000000003fe05000-000000003fe050ff (prio 0, i/o): bcm2835-dma-chan15
     0000000040000000-00000000400000ff (prio 0, i/o): bcm2836-control



^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH 43/86] hppa: drop RAM size fixup
  2020-01-02 15:08             ` Igor Mammedov
@ 2020-01-02 15:49               ` Philippe Mathieu-Daudé
  2020-01-02 16:50                 ` Igor Mammedov
  2020-01-02 20:09                 ` Helge Deller
  0 siblings, 2 replies; 148+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-01-02 15:49 UTC (permalink / raw)
  To: Igor Mammedov; +Cc: Helge Deller, qemu-devel, Richard Henderson

On 1/2/20 4:08 PM, Igor Mammedov wrote:
> On Thu, 2 Jan 2020 15:17:14 +0100
> Philippe Mathieu-Daudé <philmd@redhat.com> wrote:
> 
>> On 1/2/20 3:12 PM, Igor Mammedov wrote:
>>> On Thu, 2 Jan 2020 13:06:33 +0100
>>> Philippe Mathieu-Daudé <philmd@redhat.com> wrote:
>>>    
>>>> On 1/2/20 12:31 PM, Helge Deller wrote:
>>>>> On 31.12.19 16:44, Philippe Mathieu-Daudé wrote:
>>>>>> On 12/31/19 2:03 PM, Igor Mammedov wrote:
>>>>>>> If user provided non-sense RAM size, board will complain and
>>>>>>> continue running with max RAM size supported.
>>>>>>> Also RAM is going to be allocated by generic code, so it won't be
>>>>>>> possible for board to fix things up for user.
>>>>>>>
>>>>>>> Make it error message and exit to force user fix CLI,
>>>>>>> instead of accepting non-sense CLI values.
>>>>>>>
>>>>>>> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
>>>>>>> ---
>>>>>>>      hw/hppa/machine.c | 3 ++-
>>>>>>>      1 file changed, 2 insertions(+), 1 deletion(-)
>>>>>>>
>>>>>>> diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
>>>>>>> index 5d0de26..25f5afc 100644
>>>>>>> --- a/hw/hppa/machine.c
>>>>>>> +++ b/hw/hppa/machine.c
>>>>>>> @@ -92,7 +92,8 @@ static void machine_hppa_init(MachineState *machine)
>>>>>>>            /* Limit main memory. */
>>>>>>>          if (ram_size > FIRMWARE_START) {
>>>>>>> -        machine->ram_size = ram_size = FIRMWARE_START;
>>>>>>> +        error_report("RAM size more than %d is not supported", FIRMWARE_START);
>>>>>>> +        exit(EXIT_FAILURE);
>>>>>>
>>>>>> $ qemu-system-hppa -m 3841m
>>>>>> qemu-system-hppa: invalid accelerator kvm
>>>>>> qemu-system-hppa: falling back to tcg
>>>>>> qemu-system-hppa: RAM size more than -268435456 is not supported
>>>>>>
>>>>>> Instead of using qemu_strtosz_MiB on FIRMWARE_START or unsigned format, we can simply use "RAM size more than 3840m is not supported". Is that OK with you?
>>>>>
>>>>> I don't really like that change.
>>>>>
>>>>> We currently only emulate a 32-bit system, and for those 4GB is the maximum.
>>>>> So, if I start my machine with "qemu-system-hppa -m 4G", the current code
>>>>> then automatically uses the maximum possible of 3841MB (which is limited by
>>>>> firmware start address).
>>>>> I don't expect users to know the excact 3841MB number.
>>>>> Even on a phyiscal machine you can only add DIMMs of sizes 2GB, 3GB or 4GB,
>>>>> but not "3841MB".
>>>>
>>>> Thanks for the explanation. This deserves a comment in the source file
>>>> IMHO (and displaying a warning to the user that the behavior is changed).
>>>>
>>>> I understand the CPU can't access this DRAM area because the ROM is
>>>> mapped there. What about other devices, can they do DMA access to it?
>>>>
>>>> Igor: If this complicates your series too much, I think we can directly
>>>> allocate up-to 4GiB and not worry about the 256MiB lost.
>>>
>>> Do you mean
>>> s/"RAM size more than %d is not supported"/"RAM size more than 4Gb is not supported"/
>>
>> Works for me! You can keep my R-b with this change, thanks.
> 
> Well, it's not that simple.
> Do we map whole 4G in address space, if yes then we have to "unbreak"
> firmware mapping and use overlap mapping or do we map only portion of it?
> Both would make code more confusing and all for the sake of user convenience
> so they won't have to change their CLI?

I was thinking about this patch:

-- >8 --
diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
index 5d0de26140..fa0b6a9536 100644
--- a/hw/hppa/machine.c
+++ b/hw/hppa/machine.c
@@ -91,15 +91,16 @@ static void machine_hppa_init(MachineState *machine)
      }

      /* Limit main memory. */
-    if (ram_size > FIRMWARE_START) {
-        machine->ram_size = ram_size = FIRMWARE_START;
+    if (ram_size > 4 * GiB) {
+        error_report("Can not model more than 4GB of RAM");
+        exit(EXIT_FAILURE);
      }

      /* Main memory region. */
      ram_region = g_new(MemoryRegion, 1);
      memory_region_allocate_system_memory(ram_region, OBJECT(machine),
                                           "ram", ram_size);
-    memory_region_add_subregion(addr_space, 0, ram_region);
+    memory_region_add_subregion_overlap(addr_space, 0, ram_region, -1);

      /* Init Dino (PCI host bus chip).  */
      pci_bus = dino_init(addr_space, &rtc_irq, &serial_irq);
---

$ hppa-softmmu/qemu-system-hppa -m 3840m -S -monitor stdio
QEMU 4.2.50 monitor - type 'help' for more information
(qemu) info mtree
address-space: memory
   0000000000000000-ffffffffffffffff (prio 0, i/o): system
     0000000000000000-00000000efffffff (prio -1, ram): ram
     00000000f0000000-00000000f07fffff (prio 0, ram): firmware
     00000000f9000000-00000000f90007ff (prio 0, i/o): isa-io
       00000000f9000020-00000000f9000021 (prio 0, i/o): pic
       00000000f9000070-00000000f9000071 (prio 0, i/o): rtc
         00000000f9000070-00000000f9000070 (prio 0, i/o): rtc-index
       00000000f90000a0-00000000f90000a1 (prio 0, i/o): pic
       00000000f90004d0-00000000f90004d0 (prio 0, i/o): elcr
       00000000f90004d1-00000000f90004d1 (prio 0, i/o): elcr
     00000000fff80000-00000000fff80fff (prio 0, i/o): dino
       00000000fff80064-00000000fff80067 (prio 0, i/o): pci-conf-idx
       00000000fff80068-00000000fff8006b (prio 0, i/o): pci-conf-data
     00000000fff83800-00000000fff83807 (prio 0, i/o): serial
     00000000fffb0000-00000000fffb0003 (prio 0, i/o): cpu0-io-eir



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* Re: [PATCH 66/86] ppc:ppc440_bamboo/sam460ex: drop RAM size fixup
  2020-01-02 11:47     ` Igor Mammedov
@ 2020-01-02 15:52       ` BALATON Zoltan
  2020-01-02 17:19         ` Igor Mammedov
  2020-01-10 17:14         ` Igor Mammedov
  0 siblings, 2 replies; 148+ messages in thread
From: BALATON Zoltan @ 2020-01-02 15:52 UTC (permalink / raw)
  To: Igor Mammedov; +Cc: qemu-devel

On Thu, 2 Jan 2020, Igor Mammedov wrote:
> On Wed, 1 Jan 2020 12:54:37 +0100 (CET)
> BALATON Zoltan <balaton@eik.bme.hu> wrote:
>> On Tue, 31 Dec 2019, Igor Mammedov wrote:
>>> If user provided non-sense RAM size, board will complain and
>>> continue running with max RAM size supported.
>>> Also RAM is going to be allocated by generic code, so it won't be
>>> possible for board to fix things up for user.
>>>
>>> Make it error message and exit to force user fix CLI,
>>> instead of accepting non-sense CLI values.
>>>
>>> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
>>> ---
>>> include/hw/ppc/ppc4xx.h |  9 ++++-----
>>> hw/ppc/ppc440_bamboo.c  | 11 ++++-------
>>> hw/ppc/ppc4xx_devs.c    | 26 ++++++++++++++++----------
>>> hw/ppc/sam460ex.c       |  5 ++---
>>> 4 files changed, 26 insertions(+), 25 deletions(-)
>>>
>>> diff --git a/include/hw/ppc/ppc4xx.h b/include/hw/ppc/ppc4xx.h
>>> index 7d82259..1a28127 100644
>>> --- a/include/hw/ppc/ppc4xx.h
>>> +++ b/include/hw/ppc/ppc4xx.h
>>> @@ -42,11 +42,10 @@ enum {
>>> qemu_irq *ppcuic_init (CPUPPCState *env, qemu_irq *irqs,
>>>                        uint32_t dcr_base, int has_ssr, int has_vr);
>>>
>>> -ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
>>> -                               MemoryRegion ram_memories[],
>>> -                               hwaddr ram_bases[],
>>> -                               hwaddr ram_sizes[],
>>> -                               const ram_addr_t sdram_bank_sizes[]);
>>> +void ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
>>> +                         MemoryRegion ram_memories[],
>>> +                         hwaddr ram_bases[], hwaddr ram_sizes[],
>>> +                         const ram_addr_t sdram_bank_sizes[]);
>>
>> With this change this function does not adjust ram size any more so it may
>> need to be renamed, e.g. ppc4xx_sdram_banks or something else.
>>
>> A better patch title may be
>>
>> ppc/{ppc440_bamboo,sam460x}: drop RAM size fixup
>>
>> (or without curly braces at your preference).
> I'll rename and use this subj as you suggest on v2.
>
>> This is inconvenient for the user because it worked whatever number
>> they've given but now they have to do the math. So it suggests that what
>> you're replacing this with may not support all the existing use cases. If
>> that can't be fixed to allow checking and changing ram size (maybe via a
>> callback in board code similar to above adjust function returning adjusted
>> size) it may be OK to drop this convenience for the sake of cleaning up
>> code elsewhere.
>
> There were few boards that did fix up and in all cases it was to cover up
> invalid CLI input.
> Creating callback for fixing user mistake doesn't seems to me justified,
> I'd much prefer to have a hard error and consistent behavior across all
> the boards versus being lax on error checking.
>
> [...]
>
>
>>> @@ -699,10 +698,19 @@ ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
>>>         }
>>>     }
>>>
>>> -    ram_size -= size_left;
>>>     if (size_left) {
>>> -        error_report("Truncating memory to %" PRId64 " MiB to fit SDRAM"
>>> -                     " controller limits", ram_size / MiB);
>>> +        char *s = g_strdup("");
>>> +        for (i = 0; sdram_bank_sizes[i]; i++) {
>>> +            char *t = g_strdup_printf("%s%" PRIi64 "%s", s, sdram_bank_sizes[i],
>>> +                                      sdram_bank_sizes[i + 1] ? " ," : "");
>>> +            g_free(s);
>>> +            s = t;
>>> +        }
>>> +        error_report("Invalid RAM size, unable to fit all RAM into RAM banks"
>>> +                     " (unassigned RAM: %" PRIi64 ")",  size_left);
>>> +        error_report("Supported: %d banks and sizes/bank: %s", nr_banks, s);
>
> Do you have any suggestions how to make error message better?
> (maybe do calculation here and dump all valid -m variants instead of "#bank,size/bank")

Listing the valid values would certainly help users who don't know what 
the constraints of the SoC or SPD ROMs are (which I think most users don't 
have a clue about and we should not expect them to know). I've also seen 
similar concerns in another response for hppa machines so maybe having a 
callback to allow adjusting user input to board constraints is not a bad 
idea. It's not lax error checking but convenience for the average user 
where board has specific constraints and cannot handle any mem size.

Regards,
BALATON Zoltan


^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH 43/86] hppa: drop RAM size fixup
  2020-01-02 15:49               ` Philippe Mathieu-Daudé
@ 2020-01-02 16:50                 ` Igor Mammedov
  2020-01-02 17:14                   ` Philippe Mathieu-Daudé
  2020-01-02 20:09                 ` Helge Deller
  1 sibling, 1 reply; 148+ messages in thread
From: Igor Mammedov @ 2020-01-02 16:50 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé; +Cc: Helge Deller, qemu-devel, Richard Henderson

On Thu, 2 Jan 2020 16:49:00 +0100
Philippe Mathieu-Daudé <philmd@redhat.com> wrote:

> On 1/2/20 4:08 PM, Igor Mammedov wrote:
> > On Thu, 2 Jan 2020 15:17:14 +0100
> > Philippe Mathieu-Daudé <philmd@redhat.com> wrote:
> >   
> >> On 1/2/20 3:12 PM, Igor Mammedov wrote:  
> >>> On Thu, 2 Jan 2020 13:06:33 +0100
> >>> Philippe Mathieu-Daudé <philmd@redhat.com> wrote:
> >>>      
> >>>> On 1/2/20 12:31 PM, Helge Deller wrote:  
> >>>>> On 31.12.19 16:44, Philippe Mathieu-Daudé wrote:  
> >>>>>> On 12/31/19 2:03 PM, Igor Mammedov wrote:  
> >>>>>>> If user provided non-sense RAM size, board will complain and
> >>>>>>> continue running with max RAM size supported.
> >>>>>>> Also RAM is going to be allocated by generic code, so it won't be
> >>>>>>> possible for board to fix things up for user.
> >>>>>>>
> >>>>>>> Make it error message and exit to force user fix CLI,
> >>>>>>> instead of accepting non-sense CLI values.
> >>>>>>>
> >>>>>>> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> >>>>>>> ---
> >>>>>>>      hw/hppa/machine.c | 3 ++-
> >>>>>>>      1 file changed, 2 insertions(+), 1 deletion(-)
> >>>>>>>
> >>>>>>> diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
> >>>>>>> index 5d0de26..25f5afc 100644
> >>>>>>> --- a/hw/hppa/machine.c
> >>>>>>> +++ b/hw/hppa/machine.c
> >>>>>>> @@ -92,7 +92,8 @@ static void machine_hppa_init(MachineState *machine)
> >>>>>>>            /* Limit main memory. */
> >>>>>>>          if (ram_size > FIRMWARE_START) {
> >>>>>>> -        machine->ram_size = ram_size = FIRMWARE_START;
> >>>>>>> +        error_report("RAM size more than %d is not supported", FIRMWARE_START);
> >>>>>>> +        exit(EXIT_FAILURE);  
> >>>>>>
> >>>>>> $ qemu-system-hppa -m 3841m
> >>>>>> qemu-system-hppa: invalid accelerator kvm
> >>>>>> qemu-system-hppa: falling back to tcg
> >>>>>> qemu-system-hppa: RAM size more than -268435456 is not supported
> >>>>>>
> >>>>>> Instead of using qemu_strtosz_MiB on FIRMWARE_START or unsigned format, we can simply use "RAM size more than 3840m is not supported". Is that OK with you?  
> >>>>>
> >>>>> I don't really like that change.
> >>>>>
> >>>>> We currently only emulate a 32-bit system, and for those 4GB is the maximum.
> >>>>> So, if I start my machine with "qemu-system-hppa -m 4G", the current code
> >>>>> then automatically uses the maximum possible of 3841MB (which is limited by
> >>>>> firmware start address).
> >>>>> I don't expect users to know the excact 3841MB number.
> >>>>> Even on a phyiscal machine you can only add DIMMs of sizes 2GB, 3GB or 4GB,
> >>>>> but not "3841MB".  
> >>>>
> >>>> Thanks for the explanation. This deserves a comment in the source file
> >>>> IMHO (and displaying a warning to the user that the behavior is changed).
> >>>>
> >>>> I understand the CPU can't access this DRAM area because the ROM is
> >>>> mapped there. What about other devices, can they do DMA access to it?
> >>>>
> >>>> Igor: If this complicates your series too much, I think we can directly
> >>>> allocate up-to 4GiB and not worry about the 256MiB lost.  
> >>>
> >>> Do you mean
> >>> s/"RAM size more than %d is not supported"/"RAM size more than 4Gb is not supported"/  
> >>
> >> Works for me! You can keep my R-b with this change, thanks.  
> > 
> > Well, it's not that simple.
> > Do we map whole 4G in address space, if yes then we have to "unbreak"
> > firmware mapping and use overlap mapping or do we map only portion of it?
> > Both would make code more confusing and all for the sake of user convenience
> > so they won't have to change their CLI?  
> 
> I was thinking about this patch:
it probably should be a bit more complicated.

> 
> -- >8 --  
> diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
> index 5d0de26140..fa0b6a9536 100644
> --- a/hw/hppa/machine.c
> +++ b/hw/hppa/machine.c
> @@ -91,15 +91,16 @@ static void machine_hppa_init(MachineState *machine)
>       }
> 
>       /* Limit main memory. */
> -    if (ram_size > FIRMWARE_START) {
> -        machine->ram_size = ram_size = FIRMWARE_START;
> +    if (ram_size > 4 * GiB) {
> +        error_report("Can not model more than 4GB of RAM");
> +        exit(EXIT_FAILURE);
>       }
> 
>       /* Main memory region. */
>       ram_region = g_new(MemoryRegion, 1);
>       memory_region_allocate_system_memory(ram_region, OBJECT(machine),
>                                            "ram", ram_size);
> -    memory_region_add_subregion(addr_space, 0, ram_region);
> +    memory_region_add_subregion_overlap(addr_space, 0, ram_region, -1);
> 
>       /* Init Dino (PCI host bus chip).  */
>       pci_bus = dino_init(addr_space, &rtc_irq, &serial_irq);

Ok, I give up on trying to convince you to avoid relaxing error check
but I'd make it an extra patch on top of "[PATCH 43/86] hppa: drop RAM size fixup"
as it's a separate change.

> ---
> 
> $ hppa-softmmu/qemu-system-hppa -m 3840m -S -monitor stdio
> QEMU 4.2.50 monitor - type 'help' for more information
> (qemu) info mtree
> address-space: memory
>    0000000000000000-ffffffffffffffff (prio 0, i/o): system
>      0000000000000000-00000000efffffff (prio -1, ram): ram
>      00000000f0000000-00000000f07fffff (prio 0, ram): firmware
>      00000000f9000000-00000000f90007ff (prio 0, i/o): isa-io
>        00000000f9000020-00000000f9000021 (prio 0, i/o): pic
>        00000000f9000070-00000000f9000071 (prio 0, i/o): rtc
>          00000000f9000070-00000000f9000070 (prio 0, i/o): rtc-index
>        00000000f90000a0-00000000f90000a1 (prio 0, i/o): pic
>        00000000f90004d0-00000000f90004d0 (prio 0, i/o): elcr
>        00000000f90004d1-00000000f90004d1 (prio 0, i/o): elcr
>      00000000fff80000-00000000fff80fff (prio 0, i/o): dino
>        00000000fff80064-00000000fff80067 (prio 0, i/o): pci-conf-idx
>        00000000fff80068-00000000fff8006b (prio 0, i/o): pci-conf-data
>      00000000fff83800-00000000fff83807 (prio 0, i/o): serial
>      00000000fffb0000-00000000fffb0003 (prio 0, i/o): cpu0-io-eir
> 



^ permalink raw reply	[flat|nested] 148+ messages in thread

* [PATCH] hppa: allow max ram size upto 4Gb
  2019-12-31 13:03 ` [PATCH 43/86] hppa: drop RAM size fixup Igor Mammedov
  2019-12-31 15:44   ` Philippe Mathieu-Daudé
@ 2020-01-02 17:08   ` Igor Mammedov
  2020-01-02 17:15     ` Philippe Mathieu-Daudé
  2020-01-07 15:34   ` [PATCH v3 43/86] " Igor Mammedov
  2 siblings, 1 reply; 148+ messages in thread
From: Igor Mammedov @ 2020-01-02 17:08 UTC (permalink / raw)
  To: qemu-devel; +Cc: deller, philmd

Previous patch drops silent ram_size fixup and makes
QEMU error out with:

 "RAM size more than 3840m is not supported"

when user specified -m X more than supported value.

User shouldn't be bothered with starting QEMU with valid CLI,
so for the sake of user convenience to allow using -m 4G vs -m 3840M.

Requested-by: Helge Deller <deller@gmx.de>
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
I dislike it but if you feel it's really necessary feel free to ack it.

should be applied on top of:
  "hppa: drop RAM size fixup"
---
 hw/hppa/machine.c | 22 ++++++++++++----------
 1 file changed, 12 insertions(+), 10 deletions(-)

diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
index ebbf44f..7f8c92f 100644
--- a/hw/hppa/machine.c
+++ b/hw/hppa/machine.c
@@ -54,6 +54,7 @@ static uint64_t cpu_hppa_to_phys(void *opaque, uint64_t addr)
 
 static HPPACPU *cpu[HPPA_MAX_CPUS];
 static uint64_t firmware_entry;
+static ram_addr_t clamped_ram_size;
 
 static void machine_hppa_init(MachineState *machine)
 {
@@ -74,8 +75,6 @@ static void machine_hppa_init(MachineState *machine)
     long i;
     unsigned int smp_cpus = machine->smp.cpus;
 
-    ram_size = machine->ram_size;
-
     /* Create CPUs.  */
     for (i = 0; i < smp_cpus; i++) {
         char *name = g_strdup_printf("cpu%ld-io-eir", i);
@@ -90,10 +89,12 @@ static void machine_hppa_init(MachineState *machine)
     }
 
     /* Limit main memory. */
-    if (ram_size > FIRMWARE_START) {
-        error_report("RAM size more than %d is not supported", FIRMWARE_START);
+    if (machine->ram_size > 4 * GiB) {
+        error_report("RAM size more than 4Gb is not supported");
         exit(EXIT_FAILURE);
     }
+    clamped_ram_size = machine->ram_size > FIRMWARE_START ?
+        FIRMWARE_START : machine->ram_size;
 
     memory_region_add_subregion(addr_space, 0, machine->ram);
 
@@ -151,7 +152,7 @@ static void machine_hppa_init(MachineState *machine)
     qemu_log_mask(CPU_LOG_PAGE, "Firmware loaded at 0x%08" PRIx64
                   "-0x%08" PRIx64 ", entry at 0x%08" PRIx64 ".\n",
                   firmware_low, firmware_high, firmware_entry);
-    if (firmware_low < ram_size || firmware_high >= FIRMWARE_END) {
+    if (firmware_low < clamped_ram_size || firmware_high >= FIRMWARE_END) {
         error_report("Firmware overlaps with memory or IO space");
         exit(1);
     }
@@ -160,7 +161,8 @@ static void machine_hppa_init(MachineState *machine)
     rom_region = g_new(MemoryRegion, 1);
     memory_region_init_ram(rom_region, NULL, "firmware",
                            (FIRMWARE_END - FIRMWARE_START), &error_fatal);
-    memory_region_add_subregion(addr_space, FIRMWARE_START, rom_region);
+    memory_region_add_subregion_overlap(addr_space, FIRMWARE_START, rom_region,
+                                        1);
 
     /* Load kernel */
     if (kernel_filename) {
@@ -204,7 +206,7 @@ static void machine_hppa_init(MachineState *machine)
                (1) Due to sign-extension problems and PDC,
                put the initrd no higher than 1G.
                (2) Reserve 64k for stack.  */
-            initrd_base = MIN(ram_size, 1 * GiB);
+            initrd_base = MIN(clamped_ram_size, 1 * GiB);
             initrd_base = initrd_base - 64 * KiB;
             initrd_base = (initrd_base - initrd_size) & TARGET_PAGE_MASK;
 
@@ -232,7 +234,7 @@ static void machine_hppa_init(MachineState *machine)
      * various parameters in registers. After firmware initialization,
      * firmware will start the Linux kernel with ramdisk and cmdline.
      */
-    cpu[0]->env.gr[26] = ram_size;
+    cpu[0]->env.gr[26] = clamped_ram_size;
     cpu[0]->env.gr[25] = kernel_entry;
 
     /* tell firmware how many SMP CPUs to present in inventory table */
@@ -255,11 +257,11 @@ static void hppa_machine_reset(MachineState *ms)
     }
 
     /* already initialized by machine_hppa_init()? */
-    if (cpu[0]->env.gr[26] == ram_size) {
+    if (cpu[0]->env.gr[26] == clamped_ram_size) {
         return;
     }
 
-    cpu[0]->env.gr[26] = ram_size;
+    cpu[0]->env.gr[26] = clamped_ram_size;
     cpu[0]->env.gr[25] = 0; /* no firmware boot menu */
     cpu[0]->env.gr[24] = 'c';
     /* gr22/gr23 unused, no initrd while reboot. */
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* Re: [PATCH 43/86] hppa: drop RAM size fixup
  2020-01-02 16:50                 ` Igor Mammedov
@ 2020-01-02 17:14                   ` Philippe Mathieu-Daudé
  2020-01-02 17:32                     ` Igor Mammedov
  0 siblings, 1 reply; 148+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-01-02 17:14 UTC (permalink / raw)
  To: Igor Mammedov; +Cc: Helge Deller, qemu-devel, Richard Henderson

On 1/2/20 5:50 PM, Igor Mammedov wrote:
> On Thu, 2 Jan 2020 16:49:00 +0100
> Philippe Mathieu-Daudé <philmd@redhat.com> wrote:
> 
>> On 1/2/20 4:08 PM, Igor Mammedov wrote:
>>> On Thu, 2 Jan 2020 15:17:14 +0100
>>> Philippe Mathieu-Daudé <philmd@redhat.com> wrote:
>>>    
>>>> On 1/2/20 3:12 PM, Igor Mammedov wrote:
>>>>> On Thu, 2 Jan 2020 13:06:33 +0100
>>>>> Philippe Mathieu-Daudé <philmd@redhat.com> wrote:
>>>>>       
>>>>>> On 1/2/20 12:31 PM, Helge Deller wrote:
>>>>>>> On 31.12.19 16:44, Philippe Mathieu-Daudé wrote:
>>>>>>>> On 12/31/19 2:03 PM, Igor Mammedov wrote:
>>>>>>>>> If user provided non-sense RAM size, board will complain and
>>>>>>>>> continue running with max RAM size supported.
>>>>>>>>> Also RAM is going to be allocated by generic code, so it won't be
>>>>>>>>> possible for board to fix things up for user.
>>>>>>>>>
>>>>>>>>> Make it error message and exit to force user fix CLI,
>>>>>>>>> instead of accepting non-sense CLI values.
>>>>>>>>>
>>>>>>>>> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
>>>>>>>>> ---
>>>>>>>>>       hw/hppa/machine.c | 3 ++-
>>>>>>>>>       1 file changed, 2 insertions(+), 1 deletion(-)
>>>>>>>>>
>>>>>>>>> diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
>>>>>>>>> index 5d0de26..25f5afc 100644
>>>>>>>>> --- a/hw/hppa/machine.c
>>>>>>>>> +++ b/hw/hppa/machine.c
>>>>>>>>> @@ -92,7 +92,8 @@ static void machine_hppa_init(MachineState *machine)
>>>>>>>>>             /* Limit main memory. */
>>>>>>>>>           if (ram_size > FIRMWARE_START) {
>>>>>>>>> -        machine->ram_size = ram_size = FIRMWARE_START;
>>>>>>>>> +        error_report("RAM size more than %d is not supported", FIRMWARE_START);
>>>>>>>>> +        exit(EXIT_FAILURE);
>>>>>>>>
>>>>>>>> $ qemu-system-hppa -m 3841m
>>>>>>>> qemu-system-hppa: invalid accelerator kvm
>>>>>>>> qemu-system-hppa: falling back to tcg
>>>>>>>> qemu-system-hppa: RAM size more than -268435456 is not supported
>>>>>>>>
>>>>>>>> Instead of using qemu_strtosz_MiB on FIRMWARE_START or unsigned format, we can simply use "RAM size more than 3840m is not supported". Is that OK with you?
>>>>>>>
>>>>>>> I don't really like that change.
>>>>>>>
>>>>>>> We currently only emulate a 32-bit system, and for those 4GB is the maximum.
>>>>>>> So, if I start my machine with "qemu-system-hppa -m 4G", the current code
>>>>>>> then automatically uses the maximum possible of 3841MB (which is limited by
>>>>>>> firmware start address).
>>>>>>> I don't expect users to know the excact 3841MB number.
>>>>>>> Even on a phyiscal machine you can only add DIMMs of sizes 2GB, 3GB or 4GB,
>>>>>>> but not "3841MB".
>>>>>>
>>>>>> Thanks for the explanation. This deserves a comment in the source file
>>>>>> IMHO (and displaying a warning to the user that the behavior is changed).
>>>>>>
>>>>>> I understand the CPU can't access this DRAM area because the ROM is
>>>>>> mapped there. What about other devices, can they do DMA access to it?
>>>>>>
>>>>>> Igor: If this complicates your series too much, I think we can directly
>>>>>> allocate up-to 4GiB and not worry about the 256MiB lost.
>>>>>
>>>>> Do you mean
>>>>> s/"RAM size more than %d is not supported"/"RAM size more than 4Gb is not supported"/
>>>>
>>>> Works for me! You can keep my R-b with this change, thanks.
>>>
>>> Well, it's not that simple.
>>> Do we map whole 4G in address space, if yes then we have to "unbreak"
>>> firmware mapping and use overlap mapping or do we map only portion of it?
>>> Both would make code more confusing and all for the sake of user convenience
>>> so they won't have to change their CLI?
>>
>> I was thinking about this patch:
> it probably should be a bit more complicated.
> 
>>
>> -- >8 --
>> diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
>> index 5d0de26140..fa0b6a9536 100644
>> --- a/hw/hppa/machine.c
>> +++ b/hw/hppa/machine.c
>> @@ -91,15 +91,16 @@ static void machine_hppa_init(MachineState *machine)
>>        }
>>
>>        /* Limit main memory. */
>> -    if (ram_size > FIRMWARE_START) {
>> -        machine->ram_size = ram_size = FIRMWARE_START;
>> +    if (ram_size > 4 * GiB) {
>> +        error_report("Can not model more than 4GB of RAM");
>> +        exit(EXIT_FAILURE);
>>        }
>>
>>        /* Main memory region. */
>>        ram_region = g_new(MemoryRegion, 1);
>>        memory_region_allocate_system_memory(ram_region, OBJECT(machine),
>>                                             "ram", ram_size);
>> -    memory_region_add_subregion(addr_space, 0, ram_region);
>> +    memory_region_add_subregion_overlap(addr_space, 0, ram_region, -1);
>>
>>        /* Init Dino (PCI host bus chip).  */
>>        pci_bus = dino_init(addr_space, &rtc_irq, &serial_irq);
> 
> Ok, I give up on trying to convince you to avoid relaxing error check
> but I'd make it an extra patch on top of "[PATCH 43/86] hppa: drop RAM size fixup"
> as it's a separate change.

I am simply not understanding what you are suggesting...
Can you share a diff snippet of what you would prefer?



^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH] hppa: allow max ram size upto 4Gb
  2020-01-02 17:08   ` [PATCH] hppa: allow max ram size upto 4Gb Igor Mammedov
@ 2020-01-02 17:15     ` Philippe Mathieu-Daudé
  2020-01-02 17:36       ` Igor Mammedov
  2020-01-02 17:46       ` [PATCH v2] " Igor Mammedov
  0 siblings, 2 replies; 148+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-01-02 17:15 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel; +Cc: deller

On 1/2/20 6:08 PM, Igor Mammedov wrote:
> Previous patch drops silent ram_size fixup and makes
> QEMU error out with:
> 
>   "RAM size more than 3840m is not supported"
> 
> when user specified -m X more than supported value.
> 
> User shouldn't be bothered with starting QEMU with valid CLI,
> so for the sake of user convenience to allow using -m 4G vs -m 3840M.
> 
> Requested-by: Helge Deller <deller@gmx.de>
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
> I dislike it but if you feel it's really necessary feel free to ack it.
> 
> should be applied on top of:
>    "hppa: drop RAM size fixup"
> ---
>   hw/hppa/machine.c | 22 ++++++++++++----------
>   1 file changed, 12 insertions(+), 10 deletions(-)
> 
> diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
> index ebbf44f..7f8c92f 100644
> --- a/hw/hppa/machine.c
> +++ b/hw/hppa/machine.c
> @@ -54,6 +54,7 @@ static uint64_t cpu_hppa_to_phys(void *opaque, uint64_t addr)
>   
>   static HPPACPU *cpu[HPPA_MAX_CPUS];
>   static uint64_t firmware_entry;
> +static ram_addr_t clamped_ram_size;
>   
>   static void machine_hppa_init(MachineState *machine)
>   {
> @@ -74,8 +75,6 @@ static void machine_hppa_init(MachineState *machine)
>       long i;
>       unsigned int smp_cpus = machine->smp.cpus;
>   
> -    ram_size = machine->ram_size;
> -
>       /* Create CPUs.  */
>       for (i = 0; i < smp_cpus; i++) {
>           char *name = g_strdup_printf("cpu%ld-io-eir", i);
> @@ -90,10 +89,12 @@ static void machine_hppa_init(MachineState *machine)
>       }
>   
>       /* Limit main memory. */
> -    if (ram_size > FIRMWARE_START) {
> -        error_report("RAM size more than %d is not supported", FIRMWARE_START);
> +    if (machine->ram_size > 4 * GiB) {
> +        error_report("RAM size more than 4Gb is not supported");
>           exit(EXIT_FAILURE);
>       }
> +    clamped_ram_size = machine->ram_size > FIRMWARE_START ?
> +        FIRMWARE_START : machine->ram_size;
>   
>       memory_region_add_subregion(addr_space, 0, machine->ram);
>   
> @@ -151,7 +152,7 @@ static void machine_hppa_init(MachineState *machine)
>       qemu_log_mask(CPU_LOG_PAGE, "Firmware loaded at 0x%08" PRIx64
>                     "-0x%08" PRIx64 ", entry at 0x%08" PRIx64 ".\n",
>                     firmware_low, firmware_high, firmware_entry);
> -    if (firmware_low < ram_size || firmware_high >= FIRMWARE_END) {
> +    if (firmware_low < clamped_ram_size || firmware_high >= FIRMWARE_END) {
>           error_report("Firmware overlaps with memory or IO space");
>           exit(1);
>       }
> @@ -160,7 +161,8 @@ static void machine_hppa_init(MachineState *machine)
>       rom_region = g_new(MemoryRegion, 1);
>       memory_region_init_ram(rom_region, NULL, "firmware",
>                              (FIRMWARE_END - FIRMWARE_START), &error_fatal);
> -    memory_region_add_subregion(addr_space, FIRMWARE_START, rom_region);
> +    memory_region_add_subregion_overlap(addr_space, FIRMWARE_START, rom_region,
> +                                        1);

I don't think this is enough because we also have:

(qemu) info mtree
address-space: memory
   00000000f9000000-00000000f90007ff (prio 0, i/o): isa-io
   00000000fff80000-00000000fff80fff (prio 0, i/o): dino
   00000000fff83800-00000000fff83807 (prio 0, i/o): serial
   00000000fffb0000-00000000fffb0003 (prio 0, i/o): cpu0-io-eir

Which is why I went the other way around, using prio=-1 for the ram.

>   
>       /* Load kernel */
>       if (kernel_filename) {
> @@ -204,7 +206,7 @@ static void machine_hppa_init(MachineState *machine)
>                  (1) Due to sign-extension problems and PDC,
>                  put the initrd no higher than 1G.
>                  (2) Reserve 64k for stack.  */
> -            initrd_base = MIN(ram_size, 1 * GiB);
> +            initrd_base = MIN(clamped_ram_size, 1 * GiB);
>               initrd_base = initrd_base - 64 * KiB;
>               initrd_base = (initrd_base - initrd_size) & TARGET_PAGE_MASK;
>   
> @@ -232,7 +234,7 @@ static void machine_hppa_init(MachineState *machine)
>        * various parameters in registers. After firmware initialization,
>        * firmware will start the Linux kernel with ramdisk and cmdline.
>        */
> -    cpu[0]->env.gr[26] = ram_size;
> +    cpu[0]->env.gr[26] = clamped_ram_size;
>       cpu[0]->env.gr[25] = kernel_entry;
>   
>       /* tell firmware how many SMP CPUs to present in inventory table */
> @@ -255,11 +257,11 @@ static void hppa_machine_reset(MachineState *ms)
>       }
>   
>       /* already initialized by machine_hppa_init()? */
> -    if (cpu[0]->env.gr[26] == ram_size) {
> +    if (cpu[0]->env.gr[26] == clamped_ram_size) {
>           return;
>       }
>   
> -    cpu[0]->env.gr[26] = ram_size;
> +    cpu[0]->env.gr[26] = clamped_ram_size;
>       cpu[0]->env.gr[25] = 0; /* no firmware boot menu */
>       cpu[0]->env.gr[24] = 'c';
>       /* gr22/gr23 unused, no initrd while reboot. */
> 



^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH 66/86] ppc:ppc440_bamboo/sam460ex: drop RAM size fixup
  2020-01-02 15:52       ` BALATON Zoltan
@ 2020-01-02 17:19         ` Igor Mammedov
  2020-01-10 17:14         ` Igor Mammedov
  1 sibling, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2020-01-02 17:19 UTC (permalink / raw)
  To: BALATON Zoltan; +Cc: qemu-devel

On Thu, 2 Jan 2020 16:52:50 +0100 (CET)
BALATON Zoltan <balaton@eik.bme.hu> wrote:

> On Thu, 2 Jan 2020, Igor Mammedov wrote:
> > On Wed, 1 Jan 2020 12:54:37 +0100 (CET)
> > BALATON Zoltan <balaton@eik.bme.hu> wrote:  
> >> On Tue, 31 Dec 2019, Igor Mammedov wrote:  
> >>> If user provided non-sense RAM size, board will complain and
> >>> continue running with max RAM size supported.
> >>> Also RAM is going to be allocated by generic code, so it won't be
> >>> possible for board to fix things up for user.
> >>>
> >>> Make it error message and exit to force user fix CLI,
> >>> instead of accepting non-sense CLI values.
> >>>
> >>> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> >>> ---
> >>> include/hw/ppc/ppc4xx.h |  9 ++++-----
> >>> hw/ppc/ppc440_bamboo.c  | 11 ++++-------
> >>> hw/ppc/ppc4xx_devs.c    | 26 ++++++++++++++++----------
> >>> hw/ppc/sam460ex.c       |  5 ++---
> >>> 4 files changed, 26 insertions(+), 25 deletions(-)
> >>>
> >>> diff --git a/include/hw/ppc/ppc4xx.h b/include/hw/ppc/ppc4xx.h
> >>> index 7d82259..1a28127 100644
> >>> --- a/include/hw/ppc/ppc4xx.h
> >>> +++ b/include/hw/ppc/ppc4xx.h
> >>> @@ -42,11 +42,10 @@ enum {
> >>> qemu_irq *ppcuic_init (CPUPPCState *env, qemu_irq *irqs,
> >>>                        uint32_t dcr_base, int has_ssr, int has_vr);
> >>>
> >>> -ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
> >>> -                               MemoryRegion ram_memories[],
> >>> -                               hwaddr ram_bases[],
> >>> -                               hwaddr ram_sizes[],
> >>> -                               const ram_addr_t sdram_bank_sizes[]);
> >>> +void ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
> >>> +                         MemoryRegion ram_memories[],
> >>> +                         hwaddr ram_bases[], hwaddr ram_sizes[],
> >>> +                         const ram_addr_t sdram_bank_sizes[]);  
> >>
> >> With this change this function does not adjust ram size any more so it may
> >> need to be renamed, e.g. ppc4xx_sdram_banks or something else.
> >>
> >> A better patch title may be
> >>
> >> ppc/{ppc440_bamboo,sam460x}: drop RAM size fixup
> >>
> >> (or without curly braces at your preference).  
> > I'll rename and use this subj as you suggest on v2.
> >  
> >> This is inconvenient for the user because it worked whatever number
> >> they've given but now they have to do the math. So it suggests that what
> >> you're replacing this with may not support all the existing use cases. If
> >> that can't be fixed to allow checking and changing ram size (maybe via a
> >> callback in board code similar to above adjust function returning adjusted
> >> size) it may be OK to drop this convenience for the sake of cleaning up
> >> code elsewhere.  
> >
> > There were few boards that did fix up and in all cases it was to cover up
> > invalid CLI input.
> > Creating callback for fixing user mistake doesn't seems to me justified,
> > I'd much prefer to have a hard error and consistent behavior across all
> > the boards versus being lax on error checking.
> >
> > [...]
> >
> >  
> >>> @@ -699,10 +698,19 @@ ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
> >>>         }
> >>>     }
> >>>
> >>> -    ram_size -= size_left;
> >>>     if (size_left) {
> >>> -        error_report("Truncating memory to %" PRId64 " MiB to fit SDRAM"
> >>> -                     " controller limits", ram_size / MiB);
> >>> +        char *s = g_strdup("");
> >>> +        for (i = 0; sdram_bank_sizes[i]; i++) {
> >>> +            char *t = g_strdup_printf("%s%" PRIi64 "%s", s, sdram_bank_sizes[i],
> >>> +                                      sdram_bank_sizes[i + 1] ? " ," : "");
> >>> +            g_free(s);
> >>> +            s = t;
> >>> +        }
> >>> +        error_report("Invalid RAM size, unable to fit all RAM into RAM banks"
> >>> +                     " (unassigned RAM: %" PRIi64 ")",  size_left);
> >>> +        error_report("Supported: %d banks and sizes/bank: %s", nr_banks, s);  
> >
> > Do you have any suggestions how to make error message better?
> > (maybe do calculation here and dump all valid -m variants instead of "#bank,size/bank")  
> 
> Listing the valid values would certainly help users who don't know what 
> the constraints of the SoC or SPD ROMs are (which I think most users don't 
> have a clue about and we should not expect them to know). I've also seen 
ok, I'll go ahead with it.

> similar concerns in another response for hppa machines so maybe having a 
> callback to allow adjusting user input to board constraints is not a bad 
> idea. It's not lax error checking but convenience for the average user 
> where board has specific constraints and cannot handle any mem size.
It could be usefull to generalize and probably introspect valid/supported
RAM sizes but I doubt it would be easy to sell a callback for fixing up
invalid user input vs just a hard error.
Anyways it looks out of scope of this series and could be done on top if
there is demand for that.

> Regards,
> BALATON Zoltan
> 



^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH 43/86] hppa: drop RAM size fixup
  2020-01-02 17:14                   ` Philippe Mathieu-Daudé
@ 2020-01-02 17:32                     ` Igor Mammedov
  0 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2020-01-02 17:32 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé; +Cc: Helge Deller, qemu-devel, Richard Henderson

On Thu, 2 Jan 2020 18:14:32 +0100
Philippe Mathieu-Daudé <philmd@redhat.com> wrote:

> On 1/2/20 5:50 PM, Igor Mammedov wrote:
> > On Thu, 2 Jan 2020 16:49:00 +0100
> > Philippe Mathieu-Daudé <philmd@redhat.com> wrote:
> >   
> >> On 1/2/20 4:08 PM, Igor Mammedov wrote:  
> >>> On Thu, 2 Jan 2020 15:17:14 +0100
> >>> Philippe Mathieu-Daudé <philmd@redhat.com> wrote:
> >>>      
> >>>> On 1/2/20 3:12 PM, Igor Mammedov wrote:  
> >>>>> On Thu, 2 Jan 2020 13:06:33 +0100
> >>>>> Philippe Mathieu-Daudé <philmd@redhat.com> wrote:
> >>>>>         
> >>>>>> On 1/2/20 12:31 PM, Helge Deller wrote:  
> >>>>>>> On 31.12.19 16:44, Philippe Mathieu-Daudé wrote:  
> >>>>>>>> On 12/31/19 2:03 PM, Igor Mammedov wrote:  
> >>>>>>>>> If user provided non-sense RAM size, board will complain and
> >>>>>>>>> continue running with max RAM size supported.
> >>>>>>>>> Also RAM is going to be allocated by generic code, so it won't be
> >>>>>>>>> possible for board to fix things up for user.
> >>>>>>>>>
> >>>>>>>>> Make it error message and exit to force user fix CLI,
> >>>>>>>>> instead of accepting non-sense CLI values.
> >>>>>>>>>
> >>>>>>>>> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> >>>>>>>>> ---
> >>>>>>>>>       hw/hppa/machine.c | 3 ++-
> >>>>>>>>>       1 file changed, 2 insertions(+), 1 deletion(-)
> >>>>>>>>>
> >>>>>>>>> diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
> >>>>>>>>> index 5d0de26..25f5afc 100644
> >>>>>>>>> --- a/hw/hppa/machine.c
> >>>>>>>>> +++ b/hw/hppa/machine.c
> >>>>>>>>> @@ -92,7 +92,8 @@ static void machine_hppa_init(MachineState *machine)
> >>>>>>>>>             /* Limit main memory. */
> >>>>>>>>>           if (ram_size > FIRMWARE_START) {
> >>>>>>>>> -        machine->ram_size = ram_size = FIRMWARE_START;
> >>>>>>>>> +        error_report("RAM size more than %d is not supported", FIRMWARE_START);
> >>>>>>>>> +        exit(EXIT_FAILURE);  
> >>>>>>>>
> >>>>>>>> $ qemu-system-hppa -m 3841m
> >>>>>>>> qemu-system-hppa: invalid accelerator kvm
> >>>>>>>> qemu-system-hppa: falling back to tcg
> >>>>>>>> qemu-system-hppa: RAM size more than -268435456 is not supported
> >>>>>>>>
> >>>>>>>> Instead of using qemu_strtosz_MiB on FIRMWARE_START or unsigned format, we can simply use "RAM size more than 3840m is not supported". Is that OK with you?  
> >>>>>>>
> >>>>>>> I don't really like that change.
> >>>>>>>
> >>>>>>> We currently only emulate a 32-bit system, and for those 4GB is the maximum.
> >>>>>>> So, if I start my machine with "qemu-system-hppa -m 4G", the current code
> >>>>>>> then automatically uses the maximum possible of 3841MB (which is limited by
> >>>>>>> firmware start address).
> >>>>>>> I don't expect users to know the excact 3841MB number.
> >>>>>>> Even on a phyiscal machine you can only add DIMMs of sizes 2GB, 3GB or 4GB,
> >>>>>>> but not "3841MB".  
> >>>>>>
> >>>>>> Thanks for the explanation. This deserves a comment in the source file
> >>>>>> IMHO (and displaying a warning to the user that the behavior is changed).
> >>>>>>
> >>>>>> I understand the CPU can't access this DRAM area because the ROM is
> >>>>>> mapped there. What about other devices, can they do DMA access to it?
> >>>>>>
> >>>>>> Igor: If this complicates your series too much, I think we can directly
> >>>>>> allocate up-to 4GiB and not worry about the 256MiB lost.  
> >>>>>
> >>>>> Do you mean
> >>>>> s/"RAM size more than %d is not supported"/"RAM size more than 4Gb is not supported"/  
> >>>>
> >>>> Works for me! You can keep my R-b with this change, thanks.  
> >>>
> >>> Well, it's not that simple.
> >>> Do we map whole 4G in address space, if yes then we have to "unbreak"
> >>> firmware mapping and use overlap mapping or do we map only portion of it?
> >>> Both would make code more confusing and all for the sake of user convenience
> >>> so they won't have to change their CLI?  
> >>
> >> I was thinking about this patch:  
> > it probably should be a bit more complicated.
> >   
> >>  
> >> -- >8 --  
> >> diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
> >> index 5d0de26140..fa0b6a9536 100644
> >> --- a/hw/hppa/machine.c
> >> +++ b/hw/hppa/machine.c
> >> @@ -91,15 +91,16 @@ static void machine_hppa_init(MachineState *machine)
> >>        }
> >>
> >>        /* Limit main memory. */
> >> -    if (ram_size > FIRMWARE_START) {
> >> -        machine->ram_size = ram_size = FIRMWARE_START;
> >> +    if (ram_size > 4 * GiB) {
> >> +        error_report("Can not model more than 4GB of RAM");
> >> +        exit(EXIT_FAILURE);
> >>        }
> >>
> >>        /* Main memory region. */
> >>        ram_region = g_new(MemoryRegion, 1);
> >>        memory_region_allocate_system_memory(ram_region, OBJECT(machine),
> >>                                             "ram", ram_size);
> >> -    memory_region_add_subregion(addr_space, 0, ram_region);
> >> +    memory_region_add_subregion_overlap(addr_space, 0, ram_region, -1);
> >>
> >>        /* Init Dino (PCI host bus chip).  */
> >>        pci_bus = dino_init(addr_space, &rtc_irq, &serial_irq);  
> > 
> > Ok, I give up on trying to convince you to avoid relaxing error check
> > but I'd make it an extra patch on top of "[PATCH 43/86] hppa: drop RAM size fixup"
> > as it's a separate change.  
> 
> I am simply not understanding what you are suggesting...
> Can you share a diff snippet of what you would prefer?
> 

My preference is to error out with:
  "RAM size more than 3840m is not supported"
and let user fix their CLI



^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH] hppa: allow max ram size upto 4Gb
  2020-01-02 17:15     ` Philippe Mathieu-Daudé
@ 2020-01-02 17:36       ` Igor Mammedov
  2020-01-02 17:46       ` [PATCH v2] " Igor Mammedov
  1 sibling, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2020-01-02 17:36 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé; +Cc: deller, qemu-devel

On Thu, 2 Jan 2020 18:15:02 +0100
Philippe Mathieu-Daudé <philmd@redhat.com> wrote:

> On 1/2/20 6:08 PM, Igor Mammedov wrote:
> > Previous patch drops silent ram_size fixup and makes
> > QEMU error out with:
> > 
> >   "RAM size more than 3840m is not supported"
> > 
> > when user specified -m X more than supported value.
> > 
> > User shouldn't be bothered with starting QEMU with valid CLI,
> > so for the sake of user convenience to allow using -m 4G vs -m 3840M.
> > 
> > Requested-by: Helge Deller <deller@gmx.de>
> > Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> > ---
> > I dislike it but if you feel it's really necessary feel free to ack it.
> > 
> > should be applied on top of:
> >    "hppa: drop RAM size fixup"
> > ---
> >   hw/hppa/machine.c | 22 ++++++++++++----------
> >   1 file changed, 12 insertions(+), 10 deletions(-)
> > 
> > diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
> > index ebbf44f..7f8c92f 100644
> > --- a/hw/hppa/machine.c
> > +++ b/hw/hppa/machine.c
> > @@ -54,6 +54,7 @@ static uint64_t cpu_hppa_to_phys(void *opaque, uint64_t addr)
> >   
> >   static HPPACPU *cpu[HPPA_MAX_CPUS];
> >   static uint64_t firmware_entry;
> > +static ram_addr_t clamped_ram_size;
> >   
> >   static void machine_hppa_init(MachineState *machine)
> >   {
> > @@ -74,8 +75,6 @@ static void machine_hppa_init(MachineState *machine)
> >       long i;
> >       unsigned int smp_cpus = machine->smp.cpus;
> >   
> > -    ram_size = machine->ram_size;
> > -
> >       /* Create CPUs.  */
> >       for (i = 0; i < smp_cpus; i++) {
> >           char *name = g_strdup_printf("cpu%ld-io-eir", i);
> > @@ -90,10 +89,12 @@ static void machine_hppa_init(MachineState *machine)
> >       }
> >   
> >       /* Limit main memory. */
> > -    if (ram_size > FIRMWARE_START) {
> > -        error_report("RAM size more than %d is not supported", FIRMWARE_START);
> > +    if (machine->ram_size > 4 * GiB) {
> > +        error_report("RAM size more than 4Gb is not supported");
> >           exit(EXIT_FAILURE);
> >       }
> > +    clamped_ram_size = machine->ram_size > FIRMWARE_START ?
> > +        FIRMWARE_START : machine->ram_size;
> >   
> >       memory_region_add_subregion(addr_space, 0, machine->ram);
> >   
> > @@ -151,7 +152,7 @@ static void machine_hppa_init(MachineState *machine)
> >       qemu_log_mask(CPU_LOG_PAGE, "Firmware loaded at 0x%08" PRIx64
> >                     "-0x%08" PRIx64 ", entry at 0x%08" PRIx64 ".\n",
> >                     firmware_low, firmware_high, firmware_entry);
> > -    if (firmware_low < ram_size || firmware_high >= FIRMWARE_END) {
> > +    if (firmware_low < clamped_ram_size || firmware_high >= FIRMWARE_END) {
> >           error_report("Firmware overlaps with memory or IO space");
> >           exit(1);
> >       }
> > @@ -160,7 +161,8 @@ static void machine_hppa_init(MachineState *machine)
> >       rom_region = g_new(MemoryRegion, 1);
> >       memory_region_init_ram(rom_region, NULL, "firmware",
> >                              (FIRMWARE_END - FIRMWARE_START), &error_fatal);
> > -    memory_region_add_subregion(addr_space, FIRMWARE_START, rom_region);
> > +    memory_region_add_subregion_overlap(addr_space, FIRMWARE_START, rom_region,
> > +                                        1);  
> 
> I don't think this is enough because we also have:
> 
> (qemu) info mtree
> address-space: memory
>    00000000f9000000-00000000f90007ff (prio 0, i/o): isa-io
>    00000000fff80000-00000000fff80fff (prio 0, i/o): dino
>    00000000fff83800-00000000fff83807 (prio 0, i/o): serial
>    00000000fffb0000-00000000fffb0003 (prio 0, i/o): cpu0-io-eir
> 
> Which is why I went the other way around, using prio=-1 for the ram.

True
(you see it just snowball of un-obvious changes for user convenience)

> 
> >   
> >       /* Load kernel */
> >       if (kernel_filename) {
> > @@ -204,7 +206,7 @@ static void machine_hppa_init(MachineState *machine)
> >                  (1) Due to sign-extension problems and PDC,
> >                  put the initrd no higher than 1G.
> >                  (2) Reserve 64k for stack.  */
> > -            initrd_base = MIN(ram_size, 1 * GiB);
> > +            initrd_base = MIN(clamped_ram_size, 1 * GiB);
> >               initrd_base = initrd_base - 64 * KiB;
> >               initrd_base = (initrd_base - initrd_size) & TARGET_PAGE_MASK;
> >   
> > @@ -232,7 +234,7 @@ static void machine_hppa_init(MachineState *machine)
> >        * various parameters in registers. After firmware initialization,
> >        * firmware will start the Linux kernel with ramdisk and cmdline.
> >        */
> > -    cpu[0]->env.gr[26] = ram_size;
> > +    cpu[0]->env.gr[26] = clamped_ram_size;
> >       cpu[0]->env.gr[25] = kernel_entry;
> >   
> >       /* tell firmware how many SMP CPUs to present in inventory table */
> > @@ -255,11 +257,11 @@ static void hppa_machine_reset(MachineState *ms)
> >       }
> >   
> >       /* already initialized by machine_hppa_init()? */
> > -    if (cpu[0]->env.gr[26] == ram_size) {
> > +    if (cpu[0]->env.gr[26] == clamped_ram_size) {
> >           return;
> >       }
> >   
> > -    cpu[0]->env.gr[26] = ram_size;
> > +    cpu[0]->env.gr[26] = clamped_ram_size;
> >       cpu[0]->env.gr[25] = 0; /* no firmware boot menu */
> >       cpu[0]->env.gr[24] = 'c';
> >       /* gr22/gr23 unused, no initrd while reboot. */
> >   
> 
> 



^ permalink raw reply	[flat|nested] 148+ messages in thread

* [PATCH v2] hppa: allow max ram size upto 4Gb
  2020-01-02 17:15     ` Philippe Mathieu-Daudé
  2020-01-02 17:36       ` Igor Mammedov
@ 2020-01-02 17:46       ` Igor Mammedov
  2020-01-02 20:22         ` Helge Deller
  1 sibling, 1 reply; 148+ messages in thread
From: Igor Mammedov @ 2020-01-02 17:46 UTC (permalink / raw)
  To: qemu-devel; +Cc: deller, philmd

Previous patch drops silent ram_size fixup and makes
QEMU error out with:

 "RAM size more than 3840m is not supported"

when user specified -m X more than supported value.

User shouldn't be bothered with starting QEMU with valid CLI,
so for the sake of user convenience allow using -m 4G vs -m 3840M.

Requested-by: Helge Deller <deller@gmx.de>
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
v2:
  - make main ram -1 prio, so it wouldn't conflict with other regions
    starting from 0xf9000000

I dislike it but if you feel it's really necessary feel free to ack it.

should be applied on top of:
  "hppa: drop RAM size fixup"
---
 hw/hppa/machine.c | 21 +++++++++++----------
 1 file changed, 11 insertions(+), 10 deletions(-)

diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
index ebbf44f..0302983 100644
--- a/hw/hppa/machine.c
+++ b/hw/hppa/machine.c
@@ -54,6 +54,7 @@ static uint64_t cpu_hppa_to_phys(void *opaque, uint64_t addr)
 
 static HPPACPU *cpu[HPPA_MAX_CPUS];
 static uint64_t firmware_entry;
+static ram_addr_t clamped_ram_size;
 
 static void machine_hppa_init(MachineState *machine)
 {
@@ -74,8 +75,6 @@ static void machine_hppa_init(MachineState *machine)
     long i;
     unsigned int smp_cpus = machine->smp.cpus;
 
-    ram_size = machine->ram_size;
-
     /* Create CPUs.  */
     for (i = 0; i < smp_cpus; i++) {
         char *name = g_strdup_printf("cpu%ld-io-eir", i);
@@ -90,12 +89,14 @@ static void machine_hppa_init(MachineState *machine)
     }
 
     /* Limit main memory. */
-    if (ram_size > FIRMWARE_START) {
-        error_report("RAM size more than %d is not supported", FIRMWARE_START);
+    if (machine->ram_size > 4 * GiB) {
+        error_report("RAM size more than 4Gb is not supported");
         exit(EXIT_FAILURE);
     }
+    clamped_ram_size = machine->ram_size > FIRMWARE_START ?
+        FIRMWARE_START : machine->ram_size;
 
-    memory_region_add_subregion(addr_space, 0, machine->ram);
+    memory_region_add_subregion_overlap(addr_space, 0, machine->ram, -1);
 
     /* Init Dino (PCI host bus chip).  */
     pci_bus = dino_init(addr_space, &rtc_irq, &serial_irq);
@@ -151,7 +152,7 @@ static void machine_hppa_init(MachineState *machine)
     qemu_log_mask(CPU_LOG_PAGE, "Firmware loaded at 0x%08" PRIx64
                   "-0x%08" PRIx64 ", entry at 0x%08" PRIx64 ".\n",
                   firmware_low, firmware_high, firmware_entry);
-    if (firmware_low < ram_size || firmware_high >= FIRMWARE_END) {
+    if (firmware_low < clamped_ram_size || firmware_high >= FIRMWARE_END) {
         error_report("Firmware overlaps with memory or IO space");
         exit(1);
     }
@@ -204,7 +205,7 @@ static void machine_hppa_init(MachineState *machine)
                (1) Due to sign-extension problems and PDC,
                put the initrd no higher than 1G.
                (2) Reserve 64k for stack.  */
-            initrd_base = MIN(ram_size, 1 * GiB);
+            initrd_base = MIN(clamped_ram_size, 1 * GiB);
             initrd_base = initrd_base - 64 * KiB;
             initrd_base = (initrd_base - initrd_size) & TARGET_PAGE_MASK;
 
@@ -232,7 +233,7 @@ static void machine_hppa_init(MachineState *machine)
      * various parameters in registers. After firmware initialization,
      * firmware will start the Linux kernel with ramdisk and cmdline.
      */
-    cpu[0]->env.gr[26] = ram_size;
+    cpu[0]->env.gr[26] = clamped_ram_size;
     cpu[0]->env.gr[25] = kernel_entry;
 
     /* tell firmware how many SMP CPUs to present in inventory table */
@@ -255,11 +256,11 @@ static void hppa_machine_reset(MachineState *ms)
     }
 
     /* already initialized by machine_hppa_init()? */
-    if (cpu[0]->env.gr[26] == ram_size) {
+    if (cpu[0]->env.gr[26] == clamped_ram_size) {
         return;
     }
 
-    cpu[0]->env.gr[26] = ram_size;
+    cpu[0]->env.gr[26] = clamped_ram_size;
     cpu[0]->env.gr[25] = 0; /* no firmware boot menu */
     cpu[0]->env.gr[24] = 'c';
     /* gr22/gr23 unused, no initrd while reboot. */
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* Re: [PATCH 43/86] hppa: drop RAM size fixup
  2020-01-02 15:49               ` Philippe Mathieu-Daudé
  2020-01-02 16:50                 ` Igor Mammedov
@ 2020-01-02 20:09                 ` Helge Deller
  1 sibling, 0 replies; 148+ messages in thread
From: Helge Deller @ 2020-01-02 20:09 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé, Igor Mammedov; +Cc: qemu-devel, Richard Henderson

On 02.01.20 16:49, Philippe Mathieu-Daudé wrote:
> On 1/2/20 4:08 PM, Igor Mammedov wrote:
>> On Thu, 2 Jan 2020 15:17:14 +0100
>> Philippe Mathieu-Daudé <philmd@redhat.com> wrote:
>>
>>> On 1/2/20 3:12 PM, Igor Mammedov wrote:
>>>> On Thu, 2 Jan 2020 13:06:33 +0100
>>>> Philippe Mathieu-Daudé <philmd@redhat.com> wrote:
>>>>   
>>>>> On 1/2/20 12:31 PM, Helge Deller wrote:
>>>>>> On 31.12.19 16:44, Philippe Mathieu-Daudé wrote:
>>>>>>> On 12/31/19 2:03 PM, Igor Mammedov wrote:
>>>>>>>> If user provided non-sense RAM size, board will complain and
>>>>>>>> continue running with max RAM size supported.
>>>>>>>> Also RAM is going to be allocated by generic code, so it won't be
>>>>>>>> possible for board to fix things up for user.
>>>>>>>>
>>>>>>>> Make it error message and exit to force user fix CLI,
>>>>>>>> instead of accepting non-sense CLI values.
>>>>>>>>
>>>>>>>> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
>>>>>>>> ---
>>>>>>>>      hw/hppa/machine.c | 3 ++-
>>>>>>>>      1 file changed, 2 insertions(+), 1 deletion(-)
>>>>>>>>
>>>>>>>> diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
>>>>>>>> index 5d0de26..25f5afc 100644
>>>>>>>> --- a/hw/hppa/machine.c
>>>>>>>> +++ b/hw/hppa/machine.c
>>>>>>>> @@ -92,7 +92,8 @@ static void machine_hppa_init(MachineState *machine)
>>>>>>>>            /* Limit main memory. */
>>>>>>>>          if (ram_size > FIRMWARE_START) {
>>>>>>>> -        machine->ram_size = ram_size = FIRMWARE_START;
>>>>>>>> +        error_report("RAM size more than %d is not supported", FIRMWARE_START);
>>>>>>>> +        exit(EXIT_FAILURE);
>>>>>>>
>>>>>>> $ qemu-system-hppa -m 3841m
>>>>>>> qemu-system-hppa: invalid accelerator kvm
>>>>>>> qemu-system-hppa: falling back to tcg
>>>>>>> qemu-system-hppa: RAM size more than -268435456 is not supported
>>>>>>>
>>>>>>> Instead of using qemu_strtosz_MiB on FIRMWARE_START or unsigned format, we can simply use "RAM size more than 3840m is not supported". Is that OK with you?
>>>>>>
>>>>>> I don't really like that change.
>>>>>>
>>>>>> We currently only emulate a 32-bit system, and for those 4GB is the maximum.
>>>>>> So, if I start my machine with "qemu-system-hppa -m 4G", the current code
>>>>>> then automatically uses the maximum possible of 3841MB (which is limited by
>>>>>> firmware start address).
>>>>>> I don't expect users to know the excact 3841MB number.
>>>>>> Even on a phyiscal machine you can only add DIMMs of sizes 2GB, 3GB or 4GB,
>>>>>> but not "3841MB".
>>>>>
>>>>> Thanks for the explanation. This deserves a comment in the source file
>>>>> IMHO (and displaying a warning to the user that the behavior is changed).
>>>>>
>>>>> I understand the CPU can't access this DRAM area because the ROM is
>>>>> mapped there. What about other devices, can they do DMA access to it?
>>>>>
>>>>> Igor: If this complicates your series too much, I think we can directly
>>>>> allocate up-to 4GiB and not worry about the 256MiB lost.
>>>>
>>>> Do you mean
>>>> s/"RAM size more than %d is not supported"/"RAM size more than 4Gb is not supported"/
>>>
>>> Works for me! You can keep my R-b with this change, thanks.
>>
>> Well, it's not that simple.
>> Do we map whole 4G in address space, if yes then we have to "unbreak"
>> firmware mapping and use overlap mapping or do we map only portion of it?
>> Both would make code more confusing and all for the sake of user convenience
>> so they won't have to change their CLI?
>
> I was thinking about this patch:
>
> -- >8 --
> diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
> index 5d0de26140..fa0b6a9536 100644
> --- a/hw/hppa/machine.c
> +++ b/hw/hppa/machine.c
> @@ -91,15 +91,16 @@ static void machine_hppa_init(MachineState *machine)
>      }
>
>      /* Limit main memory. */
> -    if (ram_size > FIRMWARE_START) {
> -        machine->ram_size = ram_size = FIRMWARE_START;
> +    if (ram_size > 4 * GiB) {
> +        error_report("Can not model more than 4GB of RAM");
> +        exit(EXIT_FAILURE);
>      }
>
>      /* Main memory region. */
>      ram_region = g_new(MemoryRegion, 1);
>      memory_region_allocate_system_memory(ram_region, OBJECT(machine),
>                                           "ram", ram_size);
> -    memory_region_add_subregion(addr_space, 0, ram_region);
> +    memory_region_add_subregion_overlap(addr_space, 0, ram_region, -1);
>
>      /* Init Dino (PCI host bus chip).  */
>      pci_bus = dino_init(addr_space, &rtc_irq, &serial_irq);


I haven't tested this patch, but that one seems good.

Helge


> ---
>
> $ hppa-softmmu/qemu-system-hppa -m 3840m -S -monitor stdio
> QEMU 4.2.50 monitor - type 'help' for more information
> (qemu) info mtree
> address-space: memory
>   0000000000000000-ffffffffffffffff (prio 0, i/o): system
>     0000000000000000-00000000efffffff (prio -1, ram): ram
>     00000000f0000000-00000000f07fffff (prio 0, ram): firmware
>     00000000f9000000-00000000f90007ff (prio 0, i/o): isa-io
>       00000000f9000020-00000000f9000021 (prio 0, i/o): pic
>       00000000f9000070-00000000f9000071 (prio 0, i/o): rtc
>         00000000f9000070-00000000f9000070 (prio 0, i/o): rtc-index
>       00000000f90000a0-00000000f90000a1 (prio 0, i/o): pic
>       00000000f90004d0-00000000f90004d0 (prio 0, i/o): elcr
>       00000000f90004d1-00000000f90004d1 (prio 0, i/o): elcr
>     00000000fff80000-00000000fff80fff (prio 0, i/o): dino
>       00000000fff80064-00000000fff80067 (prio 0, i/o): pci-conf-idx
>       00000000fff80068-00000000fff8006b (prio 0, i/o): pci-conf-data
>     00000000fff83800-00000000fff83807 (prio 0, i/o): serial
>     00000000fffb0000-00000000fffb0003 (prio 0, i/o): cpu0-io-eir
>



^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH v2] hppa: allow max ram size upto 4Gb
  2020-01-02 17:46       ` [PATCH v2] " Igor Mammedov
@ 2020-01-02 20:22         ` Helge Deller
  2020-01-03  9:54           ` Igor Mammedov
  0 siblings, 1 reply; 148+ messages in thread
From: Helge Deller @ 2020-01-02 20:22 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel; +Cc: philmd

On 02.01.20 18:46, Igor Mammedov wrote:
> Previous patch drops silent ram_size fixup and makes
> QEMU error out with:
>
>  "RAM size more than 3840m is not supported"
>
> when user specified -m X more than supported value.
>
> User shouldn't be bothered with starting QEMU with valid CLI,
> so for the sake of user convenience allow using -m 4G vs -m 3840M.
>
> Requested-by: Helge Deller <deller@gmx.de>
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
> v2:
>   - make main ram -1 prio, so it wouldn't conflict with other regions
>     starting from 0xf9000000
>
> I dislike it but if you feel it's really necessary feel free to ack it.
>
> should be applied on top of:
>   "hppa: drop RAM size fixup"

Hello Igor,
I appreciate that you are trying to make it more cleaner.
But, can't you merge both of your patches to one patch?
Right now you have one patch "hppa: drop RAM size fixup", which is
what I think is wrong. Then you add another one which somehow
fixes it up again and adds other stuff.
Having everything in one single patch makes your full change more
understandable.

Is it necessary to introduce clamped_ram_size and not continue with
ram_size (even if you would add it as static local variable)?

Helge


> ---
>  hw/hppa/machine.c | 21 +++++++++++----------
>  1 file changed, 11 insertions(+), 10 deletions(-)
>
> diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
> index ebbf44f..0302983 100644
> --- a/hw/hppa/machine.c
> +++ b/hw/hppa/machine.c
> @@ -54,6 +54,7 @@ static uint64_t cpu_hppa_to_phys(void *opaque, uint64_t addr)
>
>  static HPPACPU *cpu[HPPA_MAX_CPUS];
>  static uint64_t firmware_entry;
> +static ram_addr_t clamped_ram_size;
>
>  static void machine_hppa_init(MachineState *machine)
>  {
> @@ -74,8 +75,6 @@ static void machine_hppa_init(MachineState *machine)
>      long i;
>      unsigned int smp_cpus = machine->smp.cpus;
>
> -    ram_size = machine->ram_size;
> -
>      /* Create CPUs.  */
>      for (i = 0; i < smp_cpus; i++) {
>          char *name = g_strdup_printf("cpu%ld-io-eir", i);
> @@ -90,12 +89,14 @@ static void machine_hppa_init(MachineState *machine)
>      }
>
>      /* Limit main memory. */
> -    if (ram_size > FIRMWARE_START) {
> -        error_report("RAM size more than %d is not supported", FIRMWARE_START);
> +    if (machine->ram_size > 4 * GiB) {
> +        error_report("RAM size more than 4Gb is not supported");
>          exit(EXIT_FAILURE);
>      }
> +    clamped_ram_size = machine->ram_size > FIRMWARE_START ?
> +        FIRMWARE_START : machine->ram_size;
>
> -    memory_region_add_subregion(addr_space, 0, machine->ram);
> +    memory_region_add_subregion_overlap(addr_space, 0, machine->ram, -1);
>
>      /* Init Dino (PCI host bus chip).  */
>      pci_bus = dino_init(addr_space, &rtc_irq, &serial_irq);
> @@ -151,7 +152,7 @@ static void machine_hppa_init(MachineState *machine)
>      qemu_log_mask(CPU_LOG_PAGE, "Firmware loaded at 0x%08" PRIx64
>                    "-0x%08" PRIx64 ", entry at 0x%08" PRIx64 ".\n",
>                    firmware_low, firmware_high, firmware_entry);
> -    if (firmware_low < ram_size || firmware_high >= FIRMWARE_END) {
> +    if (firmware_low < clamped_ram_size || firmware_high >= FIRMWARE_END) {
>          error_report("Firmware overlaps with memory or IO space");
>          exit(1);
>      }
> @@ -204,7 +205,7 @@ static void machine_hppa_init(MachineState *machine)
>                 (1) Due to sign-extension problems and PDC,
>                 put the initrd no higher than 1G.
>                 (2) Reserve 64k for stack.  */
> -            initrd_base = MIN(ram_size, 1 * GiB);
> +            initrd_base = MIN(clamped_ram_size, 1 * GiB);
>              initrd_base = initrd_base - 64 * KiB;
>              initrd_base = (initrd_base - initrd_size) & TARGET_PAGE_MASK;
>
> @@ -232,7 +233,7 @@ static void machine_hppa_init(MachineState *machine)
>       * various parameters in registers. After firmware initialization,
>       * firmware will start the Linux kernel with ramdisk and cmdline.
>       */
> -    cpu[0]->env.gr[26] = ram_size;
> +    cpu[0]->env.gr[26] = clamped_ram_size;
>      cpu[0]->env.gr[25] = kernel_entry;
>
>      /* tell firmware how many SMP CPUs to present in inventory table */
> @@ -255,11 +256,11 @@ static void hppa_machine_reset(MachineState *ms)
>      }
>
>      /* already initialized by machine_hppa_init()? */
> -    if (cpu[0]->env.gr[26] == ram_size) {
> +    if (cpu[0]->env.gr[26] == clamped_ram_size) {
>          return;
>      }
>
> -    cpu[0]->env.gr[26] = ram_size;
> +    cpu[0]->env.gr[26] = clamped_ram_size;
>      cpu[0]->env.gr[25] = 0; /* no firmware boot menu */
>      cpu[0]->env.gr[24] = 'c';
>      /* gr22/gr23 unused, no initrd while reboot. */
>



^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH v2] hppa: allow max ram size upto 4Gb
  2020-01-02 20:22         ` Helge Deller
@ 2020-01-03  9:54           ` Igor Mammedov
  2020-01-04 15:00             ` Philippe Mathieu-Daudé
  0 siblings, 1 reply; 148+ messages in thread
From: Igor Mammedov @ 2020-01-03  9:54 UTC (permalink / raw)
  To: Helge Deller; +Cc: philmd, qemu-devel

On Thu, 2 Jan 2020 21:22:12 +0100
Helge Deller <deller@gmx.de> wrote:

> On 02.01.20 18:46, Igor Mammedov wrote:
> > Previous patch drops silent ram_size fixup and makes
> > QEMU error out with:
> >
> >  "RAM size more than 3840m is not supported"
> >
> > when user specified -m X more than supported value.
> >
> > User shouldn't be bothered with starting QEMU with valid CLI,
> > so for the sake of user convenience allow using -m 4G vs -m 3840M.
> >
> > Requested-by: Helge Deller <deller@gmx.de>
> > Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> > ---
> > v2:
> >   - make main ram -1 prio, so it wouldn't conflict with other regions
> >     starting from 0xf9000000
> >
> > I dislike it but if you feel it's really necessary feel free to ack it.
> >
> > should be applied on top of:
> >   "hppa: drop RAM size fixup"  
> 
> Hello Igor,
> I appreciate that you are trying to make it more cleaner.
> But, can't you merge both of your patches to one patch?
> Right now you have one patch "hppa: drop RAM size fixup", which is
> what I think is wrong. Then you add another one which somehow
> fixes it up again and adds other stuff.
1st patch bring it in line with other boards adding
proper error check but without changing RAM size.
While 2nd is changing device model (mapped RAM size) and
clearly documents that it's a hack for user convenience,
Hence I'd prefer to keep both separated.

> Having everything in one single patch makes your full change more
> understandable.
> 
> Is it necessary to introduce clamped_ram_size and not continue with
> ram_size (even if you would add it as static local variable)?
it's necessary since ram_size is global which should be kept == MachineState::ram_size.
Later on I plan to remove the former altogether and maybe
MachineState::ram_size aa well, since it could be read with
memory_region_size(MachineState::ram).

> Helge
> 
> 
> > ---
> >  hw/hppa/machine.c | 21 +++++++++++----------
> >  1 file changed, 11 insertions(+), 10 deletions(-)
> >
> > diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
> > index ebbf44f..0302983 100644
> > --- a/hw/hppa/machine.c
> > +++ b/hw/hppa/machine.c
> > @@ -54,6 +54,7 @@ static uint64_t cpu_hppa_to_phys(void *opaque, uint64_t addr)
> >
> >  static HPPACPU *cpu[HPPA_MAX_CPUS];
> >  static uint64_t firmware_entry;
> > +static ram_addr_t clamped_ram_size;
> >
> >  static void machine_hppa_init(MachineState *machine)
> >  {
> > @@ -74,8 +75,6 @@ static void machine_hppa_init(MachineState *machine)
> >      long i;
> >      unsigned int smp_cpus = machine->smp.cpus;
> >
> > -    ram_size = machine->ram_size;
> > -
> >      /* Create CPUs.  */
> >      for (i = 0; i < smp_cpus; i++) {
> >          char *name = g_strdup_printf("cpu%ld-io-eir", i);
> > @@ -90,12 +89,14 @@ static void machine_hppa_init(MachineState *machine)
> >      }
> >
> >      /* Limit main memory. */
> > -    if (ram_size > FIRMWARE_START) {
> > -        error_report("RAM size more than %d is not supported", FIRMWARE_START);
> > +    if (machine->ram_size > 4 * GiB) {
> > +        error_report("RAM size more than 4Gb is not supported");
> >          exit(EXIT_FAILURE);
> >      }
> > +    clamped_ram_size = machine->ram_size > FIRMWARE_START ?
> > +        FIRMWARE_START : machine->ram_size;
> >
> > -    memory_region_add_subregion(addr_space, 0, machine->ram);
> > +    memory_region_add_subregion_overlap(addr_space, 0, machine->ram, -1);
> >
> >      /* Init Dino (PCI host bus chip).  */
> >      pci_bus = dino_init(addr_space, &rtc_irq, &serial_irq);
> > @@ -151,7 +152,7 @@ static void machine_hppa_init(MachineState *machine)
> >      qemu_log_mask(CPU_LOG_PAGE, "Firmware loaded at 0x%08" PRIx64
> >                    "-0x%08" PRIx64 ", entry at 0x%08" PRIx64 ".\n",
> >                    firmware_low, firmware_high, firmware_entry);
> > -    if (firmware_low < ram_size || firmware_high >= FIRMWARE_END) {
> > +    if (firmware_low < clamped_ram_size || firmware_high >= FIRMWARE_END) {
> >          error_report("Firmware overlaps with memory or IO space");
> >          exit(1);
> >      }
> > @@ -204,7 +205,7 @@ static void machine_hppa_init(MachineState *machine)
> >                 (1) Due to sign-extension problems and PDC,
> >                 put the initrd no higher than 1G.
> >                 (2) Reserve 64k for stack.  */
> > -            initrd_base = MIN(ram_size, 1 * GiB);
> > +            initrd_base = MIN(clamped_ram_size, 1 * GiB);
> >              initrd_base = initrd_base - 64 * KiB;
> >              initrd_base = (initrd_base - initrd_size) & TARGET_PAGE_MASK;
> >
> > @@ -232,7 +233,7 @@ static void machine_hppa_init(MachineState *machine)
> >       * various parameters in registers. After firmware initialization,
> >       * firmware will start the Linux kernel with ramdisk and cmdline.
> >       */
> > -    cpu[0]->env.gr[26] = ram_size;
> > +    cpu[0]->env.gr[26] = clamped_ram_size;
> >      cpu[0]->env.gr[25] = kernel_entry;
> >
> >      /* tell firmware how many SMP CPUs to present in inventory table */
> > @@ -255,11 +256,11 @@ static void hppa_machine_reset(MachineState *ms)
> >      }
> >
> >      /* already initialized by machine_hppa_init()? */
> > -    if (cpu[0]->env.gr[26] == ram_size) {
> > +    if (cpu[0]->env.gr[26] == clamped_ram_size) {
> >          return;
> >      }
> >
> > -    cpu[0]->env.gr[26] = ram_size;
> > +    cpu[0]->env.gr[26] = clamped_ram_size;
> >      cpu[0]->env.gr[25] = 0; /* no firmware boot menu */
> >      cpu[0]->env.gr[24] = 'c';
> >      /* gr22/gr23 unused, no initrd while reboot. */
> >  
> 



^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH 00/86] refactor main RAM allocation to use hostmem backend
  2019-12-31 15:58 ` [PATCH 00/86] refactor main RAM allocation to use hostmem backend Philippe Mathieu-Daudé
  2019-12-31 16:22   ` Igor Mammedov
@ 2020-01-03 13:06   ` Igor Mammedov
  2020-01-03 13:15     ` Philippe Mathieu-Daudé
  1 sibling, 1 reply; 148+ messages in thread
From: Igor Mammedov @ 2020-01-03 13:06 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé; +Cc: qemu-devel

On Tue, 31 Dec 2019 16:58:10 +0100
Philippe Mathieu-Daudé <philmd@redhat.com> wrote:

> Hi Igor,
> 
> On 12/31/19 2:02 PM, Igor Mammedov wrote:
> > Series removes ad hoc RAM allocation API (memory_region_allocate_system_memory)
> > and consolidates it around hostmem backend. It allows to
> >   * resolve conflicts between global -mem-prealloc and hostmem's "policy" option
> >     fixing premature allocation before binding policy is applied
> >   * simplify complicated memory allocation routines which had to deal with 2 ways
> >     to allocate RAM.
> >   * it allows to reuse hostmem backends of a choice for main RAM without adding
> >     extra CLI options to duplicate hostmem features.
> >     Recent case was -mem-shared, to enable vhost-user on targets that don't
> >     support hostmem backends [1] (ex: s390)
> >   * move RAM allocation from individual boards into generic machine code and
> >     provide them with prepared MemoryRegion.
> >   * clean up deprecated NUMA features which were tied to the old API (see patches)
> >      - "numa: remove deprecated -mem-path fallback to anonymous RAM"
> >      - "numa: remove deprecated implicit RAM distribution between nodes"
> >      - "forbid '-numa node,mem' for 5.0 and newer machine types"
> > 
> > Conversion introduces a new machine.ram-memdev property and wrapper code that
> > aliases global -mem-path and -mem-alloc into automatically created hostmem
> > backend properties (provided ram-memdev was not set explicitly by user).
> > And then follows bulk of trivial patches that incrementally convert individual
> > boards to using machine.ram-memdev provided MemoryRegion.
> > 
> > Board conversion typically involves:
> >   * providing MachineClass::default_ram_size and MachineClass::default_ram_id
> >     so generic code could create default backend if user didn't explicitly provide
> >     ram-memdev or -m options
> >   * dropping memory_region_allocate_system_memory() call
> >   * using covinience MachineState::ram MemoryRegion, which points to MemoryRegion
> >     allocated by ram-memdev
> > On top of that for some boards:
> >   * added missing ram_size checks (typically it were boards with fixed ram size)
> >   * ram_size fixups were replaced by checks and hard errors, forcing user to
> >     provide correct "-m" values instead of ignoring it and continuing running.
> >     
> > After all boards are converted the old API is removed and memory allocation
> > routines are cleaned up.  
> 
> I'm replying to the cover because multiple patches are concerned.
> 
> Compiling arm/lm32/mips64el/ppc on 32-bit host I get:
what host/gcc version are you building on,
my fedora 30-32bit setup I did reproduce only a couple of errors.

> 
>    CC      hw/arm/digic_boards.o
> hw/arm/digic_boards.c: In function 'digic4_board_init':
> hw/arm/digic_boards.c:57:22: error: format '%lli' expects argument of 
> type 'long long int', but argument 2 has type 'ram_addr_t {aka unsigned 
> int}' [-Werror=format=]
>           error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
>                        ^
> cc1: all warnings being treated as errors
> rules.mak:69: recipe for target 'hw/arm/digic_boards.o' failed
> make: *** [hw/arm/digic_boards.o] Error 1
>    CC      hw/arm/musicpal.o
> hw/arm/musicpal.c: In function 'musicpal_init':
> hw/arm/musicpal.c:1598:22: error: format '%lli' expects argument of type 
> 'long long int', but argument 2 has type 'ram_addr_t {aka unsigned int}' 
> [-Werror=format=]
>           error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
>                        ^
> cc1: all warnings being treated as errors
> rules.mak:69: recipe for target 'hw/arm/musicpal.o' failed
> make: *** [hw/arm/musicpal.o] Error 1
>    CC      hw/arm/nseries.o
> hw/arm/nseries.c: In function 'n8x0_init':
> hw/arm/nseries.c:1316:22: error: format '%lli' expects argument of type 
> 'long long int', but argument 2 has type 'ram_addr_t {aka unsigned int}' 
> [-Werror=format=]
>           error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
>                        ^
> cc1: all warnings being treated as errors
> rules.mak:69: recipe for target 'hw/arm/nseries.o' failed
> make: *** [hw/arm/nseries.o] Error 1
>    CC      hw/arm/omap_sx1.o
> hw/arm/omap_sx1.c: In function 'sx1_init':
> hw/arm/omap_sx1.c:119:22: error: format '%lli' expects argument of type 
> 'long long int', but argument 2 has type 'ram_addr_t {aka unsigned int}' 
> [-Werror=format=]
>           error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
>                        ^
> cc1: all warnings being treated as errors
> rules.mak:69: recipe for target 'hw/arm/omap_sx1.o' failed
> make: *** [hw/arm/omap_sx1.o] Error 1
>    CC      hw/arm/palm.o
> hw/arm/palm.c: In function 'palmte_init':
> hw/arm/palm.c:202:22: error: format '%lli' expects argument of type 
> 'long long int', but argument 2 has type 'ram_addr_t {aka unsigned int}' 
> [-Werror=format=]
>           error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
>                        ^
> cc1: all warnings being treated as errors
> rules.mak:69: recipe for target 'hw/arm/palm.o' failed
> make: *** [hw/arm/palm.o] Error 1
>    CC      hw/arm/collie.o
> hw/arm/collie.c: In function 'collie_init':
> hw/arm/collie.c:32:22: error: format '%lli' expects argument of type 
> 'long long int', but argument 2 has type 'ram_addr_t {aka unsigned int}' 
> [-Werror=format=]
>           error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
>                        ^
> cc1: all warnings being treated as errors
> rules.mak:69: recipe for target 'hw/arm/collie.o' failed
> make: *** [hw/arm/collie.o] Error 1
>    CC      hw/arm/mps2.o
> hw/arm/mps2.c: In function 'mps2_common_init':
> hw/arm/mps2.c:121:22: error: format '%lli' expects argument of type 
> 'long long int', but argument 2 has type 'ram_addr_t {aka unsigned int}' 
> [-Werror=format=]
>           error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
>                        ^
> cc1: all warnings being treated as errors
> rules.mak:69: recipe for target 'hw/arm/mps2.o' failed
> make: *** [hw/arm/mps2.o] Error 1
>    CC      hw/arm/mps2-tz.o
> hw/arm/mps2-tz.c: In function 'mps2tz_common_init':
> hw/arm/mps2-tz.c:391:22: error: format '%lli' expects argument of type 
> 'long long int', but argument 2 has type 'ram_addr_t {aka unsigned int}' 
> [-Werror=format=]
>           error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
>                        ^
> cc1: all warnings being treated as errors
> rules.mak:69: recipe for target 'hw/arm/mps2-tz.o' failed
> make: *** [hw/arm/mps2-tz.o] Error 1
>    CC      hw/lm32/lm32_boards.o
> hw/lm32/lm32_boards.c: In function 'lm32_evr_init':
> hw/lm32/lm32_boards.c:89:22: error: format '%lli' expects argument of 
> type 'long long int', but argument 2 has type 'ram_addr_t {aka unsigned 
> int}' [-Werror=format=]
>           error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
>                        ^
> hw/lm32/lm32_boards.c: In function 'lm32_uclinux_init':
> hw/lm32/lm32_boards.c:179:22: error: format '%lli' expects argument of 
> type 'long long int', but argument 2 has type 'ram_addr_t {aka unsigned 
> int}' [-Werror=format=]
>           error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
>                        ^
> cc1: all warnings being treated as errors
> rules.mak:69: recipe for target 'hw/lm32/lm32_boards.o' failed
> make: *** [hw/lm32/lm32_boards.o] Error 1
>    CC      hw/lm32/milkymist.o
> hw/lm32/milkymist.c: In function 'milkymist_init':
> hw/lm32/milkymist.c:100:22: error: format '%lli' expects argument of 
> type 'long long int', but argument 2 has type 'ram_addr_t {aka unsigned 
> int}' [-Werror=format=]
>           error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
>                        ^
> cc1: all warnings being treated as errors
>    CC      hw/mips/mips_fulong2e.o
> hw/mips/mips_fulong2e.c: In function 'mips_fulong2e_init':
> hw/mips/mips_fulong2e.c:317:22: error: format '%ld' expects argument of 
> type 'long int', but argument 2 has type 'long long int' [-Werror=format=]
>           error_report("Invalid RAM size, should be %ld", 256 * MiB);
>                        ^
> cc1: all warnings being treated as errors
>    CC      hw/ppc/ppc405_boards.o
> hw/ppc/ppc405_boards.c: In function 'ref405ep_init':
> hw/ppc/ppc405_boards.c:165:22: error: format '%lli' expects argument of 
> type 'long long int', but argument 2 has type 'ram_addr_t {aka unsigned 
> int}' [-Werror=format=]
>           error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
>                        ^
> hw/ppc/ppc405_boards.c: In function 'taihu_405ep_init':
> hw/ppc/ppc405_boards.c:435:22: error: format '%lli' expects argument of 
> type 'long long int', but argument 2 has type 'ram_addr_t {aka unsigned 
> int}' [-Werror=format=]
>           error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
>                        ^
> cc1: all warnings being treated as errors
> rules.mak:69: recipe for target 'hw/ppc/ppc405_boards.o' failed
> make: *** [hw/ppc/ppc405_boards.o] Error 1
>    CC      hw/ppc/ppc4xx_devs.o
> hw/ppc/ppc4xx_devs.c: In function 'ppc4xx_sdram_adjust':
> hw/ppc/ppc4xx_devs.c:704:39: error: format '%lli' expects argument of 
> type 'long long int', but argument 3 has type 'ram_addr_t {aka const 
> unsigned int}' [-Werror=format=]
>               char *t = g_strdup_printf("%s%" PRIi64 "%s", s, 
> sdram_bank_sizes[i],
>                                         ^
> hw/ppc/ppc4xx_devs.c:709:22: error: format '%lli' expects argument of 
> type 'long long int', but argument 2 has type 'ram_addr_t {aka unsigned 
> int}' [-Werror=format=]
>           error_report("Invalid RAM size, unable to fit all RAM into RAM 
> banks"
>                        ^
> cc1: all warnings being treated as errors
> rules.mak:69: recipe for target 'hw/ppc/ppc4xx_devs.o' failed
> make: *** [hw/ppc/ppc4xx_devs.o] Error 1
>    CC      hw/ppc/e500.o
> hw/ppc/e500.c: In function 'ppce500_init':
> hw/ppc/e500.c:909:22: error: format '%ld' expects argument of type 'long 
> int', but argument 2 has type 'long long int' [-Werror=format=]
>           error_report("RAM size must be multiple of %ld", RAM_SIZES_ALIGN);
>                        ^
> cc1: all warnings being treated as errors
> 
> 



^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH 00/86] refactor main RAM allocation to use hostmem backend
  2020-01-03 13:06   ` Igor Mammedov
@ 2020-01-03 13:15     ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 148+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-01-03 13:15 UTC (permalink / raw)
  To: Igor Mammedov; +Cc: qemu-devel

On 1/3/20 2:06 PM, Igor Mammedov wrote:
> On Tue, 31 Dec 2019 16:58:10 +0100
> Philippe Mathieu-Daudé <philmd@redhat.com> wrote:
> 
>> Hi Igor,
>>
>> On 12/31/19 2:02 PM, Igor Mammedov wrote:
>>> Series removes ad hoc RAM allocation API (memory_region_allocate_system_memory)
>>> and consolidates it around hostmem backend. It allows to
>>>    * resolve conflicts between global -mem-prealloc and hostmem's "policy" option
>>>      fixing premature allocation before binding policy is applied
>>>    * simplify complicated memory allocation routines which had to deal with 2 ways
>>>      to allocate RAM.
>>>    * it allows to reuse hostmem backends of a choice for main RAM without adding
>>>      extra CLI options to duplicate hostmem features.
>>>      Recent case was -mem-shared, to enable vhost-user on targets that don't
>>>      support hostmem backends [1] (ex: s390)
>>>    * move RAM allocation from individual boards into generic machine code and
>>>      provide them with prepared MemoryRegion.
>>>    * clean up deprecated NUMA features which were tied to the old API (see patches)
>>>       - "numa: remove deprecated -mem-path fallback to anonymous RAM"
>>>       - "numa: remove deprecated implicit RAM distribution between nodes"
>>>       - "forbid '-numa node,mem' for 5.0 and newer machine types"
>>>
>>> Conversion introduces a new machine.ram-memdev property and wrapper code that
>>> aliases global -mem-path and -mem-alloc into automatically created hostmem
>>> backend properties (provided ram-memdev was not set explicitly by user).
>>> And then follows bulk of trivial patches that incrementally convert individual
>>> boards to using machine.ram-memdev provided MemoryRegion.
>>>
>>> Board conversion typically involves:
>>>    * providing MachineClass::default_ram_size and MachineClass::default_ram_id
>>>      so generic code could create default backend if user didn't explicitly provide
>>>      ram-memdev or -m options
>>>    * dropping memory_region_allocate_system_memory() call
>>>    * using covinience MachineState::ram MemoryRegion, which points to MemoryRegion
>>>      allocated by ram-memdev
>>> On top of that for some boards:
>>>    * added missing ram_size checks (typically it were boards with fixed ram size)
>>>    * ram_size fixups were replaced by checks and hard errors, forcing user to
>>>      provide correct "-m" values instead of ignoring it and continuing running.
>>>      
>>> After all boards are converted the old API is removed and memory allocation
>>> routines are cleaned up.
>>
>> I'm replying to the cover because multiple patches are concerned.
>>
>> Compiling arm/lm32/mips64el/ppc on 32-bit host I get:
> what host/gcc version are you building on,
> my fedora 30-32bit setup I did reproduce only a couple of errors.

I'm using the qemu:debian-win32-cross docker image from 
tests/docker/dockerfiles/debian-win32-cross.docker:

$ i686-w64-mingw32.shared-gcc --version
i686-w64-mingw32.shared-gcc (GCC) 5.5.0

You can build the image running:

$ make docker-image-debian-win32-cross

>>
>>     CC      hw/arm/digic_boards.o
>> hw/arm/digic_boards.c: In function 'digic4_board_init':
>> hw/arm/digic_boards.c:57:22: error: format '%lli' expects argument of
>> type 'long long int', but argument 2 has type 'ram_addr_t {aka unsigned
>> int}' [-Werror=format=]
>>            error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
>>                         ^
>> cc1: all warnings being treated as errors
>> rules.mak:69: recipe for target 'hw/arm/digic_boards.o' failed
>> make: *** [hw/arm/digic_boards.o] Error 1
>>     CC      hw/arm/musicpal.o
>> hw/arm/musicpal.c: In function 'musicpal_init':
>> hw/arm/musicpal.c:1598:22: error: format '%lli' expects argument of type
>> 'long long int', but argument 2 has type 'ram_addr_t {aka unsigned int}'
>> [-Werror=format=]
>>            error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
>>                         ^
>> cc1: all warnings being treated as errors
>> rules.mak:69: recipe for target 'hw/arm/musicpal.o' failed
>> make: *** [hw/arm/musicpal.o] Error 1
>>     CC      hw/arm/nseries.o
>> hw/arm/nseries.c: In function 'n8x0_init':
>> hw/arm/nseries.c:1316:22: error: format '%lli' expects argument of type
>> 'long long int', but argument 2 has type 'ram_addr_t {aka unsigned int}'
>> [-Werror=format=]
>>            error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
>>                         ^
>> cc1: all warnings being treated as errors
>> rules.mak:69: recipe for target 'hw/arm/nseries.o' failed
>> make: *** [hw/arm/nseries.o] Error 1
>>     CC      hw/arm/omap_sx1.o
>> hw/arm/omap_sx1.c: In function 'sx1_init':
>> hw/arm/omap_sx1.c:119:22: error: format '%lli' expects argument of type
>> 'long long int', but argument 2 has type 'ram_addr_t {aka unsigned int}'
>> [-Werror=format=]
>>            error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
>>                         ^
>> cc1: all warnings being treated as errors
>> rules.mak:69: recipe for target 'hw/arm/omap_sx1.o' failed
>> make: *** [hw/arm/omap_sx1.o] Error 1
>>     CC      hw/arm/palm.o
>> hw/arm/palm.c: In function 'palmte_init':
>> hw/arm/palm.c:202:22: error: format '%lli' expects argument of type
>> 'long long int', but argument 2 has type 'ram_addr_t {aka unsigned int}'
>> [-Werror=format=]
>>            error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
>>                         ^
>> cc1: all warnings being treated as errors
>> rules.mak:69: recipe for target 'hw/arm/palm.o' failed
>> make: *** [hw/arm/palm.o] Error 1
>>     CC      hw/arm/collie.o
>> hw/arm/collie.c: In function 'collie_init':
>> hw/arm/collie.c:32:22: error: format '%lli' expects argument of type
>> 'long long int', but argument 2 has type 'ram_addr_t {aka unsigned int}'
>> [-Werror=format=]
>>            error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
>>                         ^
>> cc1: all warnings being treated as errors
>> rules.mak:69: recipe for target 'hw/arm/collie.o' failed
>> make: *** [hw/arm/collie.o] Error 1
>>     CC      hw/arm/mps2.o
>> hw/arm/mps2.c: In function 'mps2_common_init':
>> hw/arm/mps2.c:121:22: error: format '%lli' expects argument of type
>> 'long long int', but argument 2 has type 'ram_addr_t {aka unsigned int}'
>> [-Werror=format=]
>>            error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
>>                         ^
>> cc1: all warnings being treated as errors
>> rules.mak:69: recipe for target 'hw/arm/mps2.o' failed
>> make: *** [hw/arm/mps2.o] Error 1
>>     CC      hw/arm/mps2-tz.o
>> hw/arm/mps2-tz.c: In function 'mps2tz_common_init':
>> hw/arm/mps2-tz.c:391:22: error: format '%lli' expects argument of type
>> 'long long int', but argument 2 has type 'ram_addr_t {aka unsigned int}'
>> [-Werror=format=]
>>            error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
>>                         ^
>> cc1: all warnings being treated as errors
>> rules.mak:69: recipe for target 'hw/arm/mps2-tz.o' failed
>> make: *** [hw/arm/mps2-tz.o] Error 1
>>     CC      hw/lm32/lm32_boards.o
>> hw/lm32/lm32_boards.c: In function 'lm32_evr_init':
>> hw/lm32/lm32_boards.c:89:22: error: format '%lli' expects argument of
>> type 'long long int', but argument 2 has type 'ram_addr_t {aka unsigned
>> int}' [-Werror=format=]
>>            error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
>>                         ^
>> hw/lm32/lm32_boards.c: In function 'lm32_uclinux_init':
>> hw/lm32/lm32_boards.c:179:22: error: format '%lli' expects argument of
>> type 'long long int', but argument 2 has type 'ram_addr_t {aka unsigned
>> int}' [-Werror=format=]
>>            error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
>>                         ^
>> cc1: all warnings being treated as errors
>> rules.mak:69: recipe for target 'hw/lm32/lm32_boards.o' failed
>> make: *** [hw/lm32/lm32_boards.o] Error 1
>>     CC      hw/lm32/milkymist.o
>> hw/lm32/milkymist.c: In function 'milkymist_init':
>> hw/lm32/milkymist.c:100:22: error: format '%lli' expects argument of
>> type 'long long int', but argument 2 has type 'ram_addr_t {aka unsigned
>> int}' [-Werror=format=]
>>            error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
>>                         ^
>> cc1: all warnings being treated as errors
>>     CC      hw/mips/mips_fulong2e.o
>> hw/mips/mips_fulong2e.c: In function 'mips_fulong2e_init':
>> hw/mips/mips_fulong2e.c:317:22: error: format '%ld' expects argument of
>> type 'long int', but argument 2 has type 'long long int' [-Werror=format=]
>>            error_report("Invalid RAM size, should be %ld", 256 * MiB);
>>                         ^
>> cc1: all warnings being treated as errors
>>     CC      hw/ppc/ppc405_boards.o
>> hw/ppc/ppc405_boards.c: In function 'ref405ep_init':
>> hw/ppc/ppc405_boards.c:165:22: error: format '%lli' expects argument of
>> type 'long long int', but argument 2 has type 'ram_addr_t {aka unsigned
>> int}' [-Werror=format=]
>>            error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
>>                         ^
>> hw/ppc/ppc405_boards.c: In function 'taihu_405ep_init':
>> hw/ppc/ppc405_boards.c:435:22: error: format '%lli' expects argument of
>> type 'long long int', but argument 2 has type 'ram_addr_t {aka unsigned
>> int}' [-Werror=format=]
>>            error_report("Invalid RAM size, should be %" PRIi64 " Bytes",
>>                         ^
>> cc1: all warnings being treated as errors
>> rules.mak:69: recipe for target 'hw/ppc/ppc405_boards.o' failed
>> make: *** [hw/ppc/ppc405_boards.o] Error 1
>>     CC      hw/ppc/ppc4xx_devs.o
>> hw/ppc/ppc4xx_devs.c: In function 'ppc4xx_sdram_adjust':
>> hw/ppc/ppc4xx_devs.c:704:39: error: format '%lli' expects argument of
>> type 'long long int', but argument 3 has type 'ram_addr_t {aka const
>> unsigned int}' [-Werror=format=]
>>                char *t = g_strdup_printf("%s%" PRIi64 "%s", s,
>> sdram_bank_sizes[i],
>>                                          ^
>> hw/ppc/ppc4xx_devs.c:709:22: error: format '%lli' expects argument of
>> type 'long long int', but argument 2 has type 'ram_addr_t {aka unsigned
>> int}' [-Werror=format=]
>>            error_report("Invalid RAM size, unable to fit all RAM into RAM
>> banks"
>>                         ^
>> cc1: all warnings being treated as errors
>> rules.mak:69: recipe for target 'hw/ppc/ppc4xx_devs.o' failed
>> make: *** [hw/ppc/ppc4xx_devs.o] Error 1
>>     CC      hw/ppc/e500.o
>> hw/ppc/e500.c: In function 'ppce500_init':
>> hw/ppc/e500.c:909:22: error: format '%ld' expects argument of type 'long
>> int', but argument 2 has type 'long long int' [-Werror=format=]
>>            error_report("RAM size must be multiple of %ld", RAM_SIZES_ALIGN);
>>                         ^
>> cc1: all warnings being treated as errors
>>
>>
> 



^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH v2] hppa: allow max ram size upto 4Gb
  2020-01-03  9:54           ` Igor Mammedov
@ 2020-01-04 15:00             ` Philippe Mathieu-Daudé
  2020-01-06 10:48               ` Igor Mammedov
  0 siblings, 1 reply; 148+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-01-04 15:00 UTC (permalink / raw)
  To: Igor Mammedov, Helge Deller; +Cc: Sven Schnelle, qemu-devel

On 1/3/20 10:54 AM, Igor Mammedov wrote:
> On Thu, 2 Jan 2020 21:22:12 +0100
> Helge Deller <deller@gmx.de> wrote:
> 
>> On 02.01.20 18:46, Igor Mammedov wrote:
>>> Previous patch drops silent ram_size fixup and makes
>>> QEMU error out with:
>>>
>>>   "RAM size more than 3840m is not supported"
>>>
>>> when user specified -m X more than supported value.
>>>
>>> User shouldn't be bothered with starting QEMU with valid CLI,
>>> so for the sake of user convenience allow using -m 4G vs -m 3840M.
>>>
>>> Requested-by: Helge Deller <deller@gmx.de>
>>> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
>>> ---
>>> v2:
>>>    - make main ram -1 prio, so it wouldn't conflict with other regions
>>>      starting from 0xf9000000
>>>
>>> I dislike it but if you feel it's really necessary feel free to ack it.

Hard to find the v2 buried in the other series with my email client.

>>>
>>> should be applied on top of:
>>>    "hppa: drop RAM size fixup"
>>
>> Hello Igor,
>> I appreciate that you are trying to make it more cleaner.
>> But, can't you merge both of your patches to one patch?
>> Right now you have one patch "hppa: drop RAM size fixup", which is
>> what I think is wrong. Then you add another one which somehow
>> fixes it up again and adds other stuff.
> 1st patch bring it in line with other boards adding
> proper error check but without changing RAM size.
> While 2nd is changing device model (mapped RAM size) and
> clearly documents that it's a hack for user convenience,
> Hence I'd prefer to keep both separated.
> 
>> Having everything in one single patch makes your full change more
>> understandable.
>>
>> Is it necessary to introduce clamped_ram_size and not continue with
>> ram_size (even if you would add it as static local variable)?
> it's necessary since ram_size is global which should be kept == MachineState::ram_size.
> Later on I plan to remove the former altogether and maybe
> MachineState::ram_size aa well, since it could be read with
> memory_region_size(MachineState::ram).

Why insist on clamping the ram? We recommend to model what the hardware 
does, and the hardware uses a full DIMM of DRAM, so 4GB, not less.

What are the new problem introduced by using 4GB? I only see advantages 
doing so. This doesn't break your series. This doesn't break the CLI.
Am I missing something?

>>> ---
>>>   hw/hppa/machine.c | 21 +++++++++++----------
>>>   1 file changed, 11 insertions(+), 10 deletions(-)
>>>
>>> diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
>>> index ebbf44f..0302983 100644
>>> --- a/hw/hppa/machine.c
>>> +++ b/hw/hppa/machine.c
>>> @@ -54,6 +54,7 @@ static uint64_t cpu_hppa_to_phys(void *opaque, uint64_t addr)
>>>
>>>   static HPPACPU *cpu[HPPA_MAX_CPUS];
>>>   static uint64_t firmware_entry;
>>> +static ram_addr_t clamped_ram_size;
>>>
>>>   static void machine_hppa_init(MachineState *machine)
>>>   {
>>> @@ -74,8 +75,6 @@ static void machine_hppa_init(MachineState *machine)
>>>       long i;
>>>       unsigned int smp_cpus = machine->smp.cpus;
>>>
>>> -    ram_size = machine->ram_size;
>>> -
>>>       /* Create CPUs.  */
>>>       for (i = 0; i < smp_cpus; i++) {
>>>           char *name = g_strdup_printf("cpu%ld-io-eir", i);
>>> @@ -90,12 +89,14 @@ static void machine_hppa_init(MachineState *machine)
>>>       }
>>>
>>>       /* Limit main memory. */
>>> -    if (ram_size > FIRMWARE_START) {
>>> -        error_report("RAM size more than %d is not supported", FIRMWARE_START);
>>> +    if (machine->ram_size > 4 * GiB) {
>>> +        error_report("RAM size more than 4Gb is not supported");
>>>           exit(EXIT_FAILURE);
>>>       }
>>> +    clamped_ram_size = machine->ram_size > FIRMWARE_START ?
>>> +        FIRMWARE_START : machine->ram_size;
>>>
>>> -    memory_region_add_subregion(addr_space, 0, machine->ram);
>>> +    memory_region_add_subregion_overlap(addr_space, 0, machine->ram, -1);
>>>
>>>       /* Init Dino (PCI host bus chip).  */
>>>       pci_bus = dino_init(addr_space, &rtc_irq, &serial_irq);
>>> @@ -151,7 +152,7 @@ static void machine_hppa_init(MachineState *machine)
>>>       qemu_log_mask(CPU_LOG_PAGE, "Firmware loaded at 0x%08" PRIx64
>>>                     "-0x%08" PRIx64 ", entry at 0x%08" PRIx64 ".\n",
>>>                     firmware_low, firmware_high, firmware_entry);
>>> -    if (firmware_low < ram_size || firmware_high >= FIRMWARE_END) {
>>> +    if (firmware_low < clamped_ram_size || firmware_high >= FIRMWARE_END) {
>>>           error_report("Firmware overlaps with memory or IO space");
>>>           exit(1);
>>>       }
>>> @@ -204,7 +205,7 @@ static void machine_hppa_init(MachineState *machine)
>>>                  (1) Due to sign-extension problems and PDC,
>>>                  put the initrd no higher than 1G.
>>>                  (2) Reserve 64k for stack.  */
>>> -            initrd_base = MIN(ram_size, 1 * GiB);
>>> +            initrd_base = MIN(clamped_ram_size, 1 * GiB);
>>>               initrd_base = initrd_base - 64 * KiB;
>>>               initrd_base = (initrd_base - initrd_size) & TARGET_PAGE_MASK;
>>>
>>> @@ -232,7 +233,7 @@ static void machine_hppa_init(MachineState *machine)
>>>        * various parameters in registers. After firmware initialization,
>>>        * firmware will start the Linux kernel with ramdisk and cmdline.
>>>        */
>>> -    cpu[0]->env.gr[26] = ram_size;
>>> +    cpu[0]->env.gr[26] = clamped_ram_size;

Helge, is this the code using this register?

https://github.com/hdeller/seabios-hppa/blob/parisc-qemu-5.0/src/parisc/head.S#L139

>>>       cpu[0]->env.gr[25] = kernel_entry;
>>>
>>>       /* tell firmware how many SMP CPUs to present in inventory table */
>>> @@ -255,11 +256,11 @@ static void hppa_machine_reset(MachineState *ms)
>>>       }
>>>
>>>       /* already initialized by machine_hppa_init()? */
>>> -    if (cpu[0]->env.gr[26] == ram_size) {
>>> +    if (cpu[0]->env.gr[26] == clamped_ram_size) {
>>>           return;
>>>       }
>>>
>>> -    cpu[0]->env.gr[26] = ram_size;
>>> +    cpu[0]->env.gr[26] = clamped_ram_size;
>>>       cpu[0]->env.gr[25] = 0; /* no firmware boot menu */
>>>       cpu[0]->env.gr[24] = 'c';
>>>       /* gr22/gr23 unused, no initrd while reboot. */
>>>   
>>
> 



^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH 08/86] alpha:dp264: use memdev for RAM
  2019-12-31 13:02 ` [PATCH 08/86] alpha:dp264: use memdev for RAM Igor Mammedov
  2019-12-31 16:11   ` Philippe Mathieu-Daudé
@ 2020-01-06  0:37   ` Richard Henderson
  1 sibling, 0 replies; 148+ messages in thread
From: Richard Henderson @ 2020-01-06  0:37 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel

On 12/31/19 11:02 PM, Igor Mammedov wrote:
> memory_region_allocate_system_memory() API is going away, so
> replace it with memdev allocated MemoryRegion. The later is
> initialized by generic code, so board only needs to opt in
> to memdev scheme by providing
>   MachineClass::default_ram_id
> and using MachineState::ram instead of manually initializing
> RAM memory region.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
>  hw/alpha/alpha_sys.h | 2 +-
>  hw/alpha/dp264.c     | 3 ++-
>  hw/alpha/typhoon.c   | 8 ++------
>  3 files changed, 5 insertions(+), 8 deletions(-)

Acked-by: Richard Henderson <richard.henderson@linaro.org>


r~


^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH v2] hppa: allow max ram size upto 4Gb
  2020-01-04 15:00             ` Philippe Mathieu-Daudé
@ 2020-01-06 10:48               ` Igor Mammedov
  2020-01-06 11:05                 ` Philippe Mathieu-Daudé
  2020-01-06 11:28                 ` Helge Deller
  0 siblings, 2 replies; 148+ messages in thread
From: Igor Mammedov @ 2020-01-06 10:48 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé; +Cc: Helge Deller, Sven Schnelle, qemu-devel

On Sat, 4 Jan 2020 16:00:19 +0100
Philippe Mathieu-Daudé <philmd@redhat.com> wrote:

> On 1/3/20 10:54 AM, Igor Mammedov wrote:
> > On Thu, 2 Jan 2020 21:22:12 +0100
> > Helge Deller <deller@gmx.de> wrote:
> >   
> >> On 02.01.20 18:46, Igor Mammedov wrote:  
> >>> Previous patch drops silent ram_size fixup and makes
> >>> QEMU error out with:
> >>>
> >>>   "RAM size more than 3840m is not supported"
> >>>
> >>> when user specified -m X more than supported value.
> >>>
> >>> User shouldn't be bothered with starting QEMU with valid CLI,
> >>> so for the sake of user convenience allow using -m 4G vs -m 3840M.
> >>>
> >>> Requested-by: Helge Deller <deller@gmx.de>
> >>> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> >>> ---
> >>> v2:
> >>>    - make main ram -1 prio, so it wouldn't conflict with other regions
> >>>      starting from 0xf9000000
> >>>
> >>> I dislike it but if you feel it's really necessary feel free to ack it.  
> 
> Hard to find the v2 buried in the other series with my email client.
> 
> >>>
> >>> should be applied on top of:
> >>>    "hppa: drop RAM size fixup"  
> >>
> >> Hello Igor,
> >> I appreciate that you are trying to make it more cleaner.
> >> But, can't you merge both of your patches to one patch?
> >> Right now you have one patch "hppa: drop RAM size fixup", which is
> >> what I think is wrong. Then you add another one which somehow
> >> fixes it up again and adds other stuff.  
> > 1st patch bring it in line with other boards adding
> > proper error check but without changing RAM size.
> > While 2nd is changing device model (mapped RAM size) and
> > clearly documents that it's a hack for user convenience,
> > Hence I'd prefer to keep both separated.
> >   
> >> Having everything in one single patch makes your full change more
> >> understandable.
> >>
> >> Is it necessary to introduce clamped_ram_size and not continue with
> >> ram_size (even if you would add it as static local variable)?  
> > it's necessary since ram_size is global which should be kept == MachineState::ram_size.
> > Later on I plan to remove the former altogether and maybe
> > MachineState::ram_size aa well, since it could be read with
> > memory_region_size(MachineState::ram).  
> 
> Why insist on clamping the ram? We recommend to model what the hardware 
> does, and the hardware uses a full DIMM of DRAM, so 4GB, not less.
I'm not adding 4Gb support here (it's out of scope of this series),
all this patch does is making pre-existing global ram_size fixup,
this board only business and naming it clamped_ram_size to match
its current usage (along with explicitly documenting the deviation from
other boards why it was requested to keep fixup 'for user convenience'
instead of going for correct and simpler error message telling
how much RAM user could specify on CLI).

> What are the new problem introduced by using 4GB? I only see advantages 
> doing so. This doesn't break your series. This doesn't break the CLI.
> Am I missing something?

Well, board was fixing up global ram_size and then used it to
 - pass clamped value to guest via register
 - pass it to load load_image_targphys()
 - perform various checks
 - affects reset sequence

This patch keeps all of that in the same state
(I'd suspect changing above points, would break guest)

If you have an alternative patch that enables to use full 4Gb,
I'd include on respin as far as it doesn't change user supplied
global ram_size && ms->ram_size && uses generic ms->ram &&
preferably on top of
 "[PATCH 44/86] hppa: use memdev for RAM"
so it would be easier to drop it if there would opposition to it
without affecting series.

> >>> ---
> >>>   hw/hppa/machine.c | 21 +++++++++++----------
> >>>   1 file changed, 11 insertions(+), 10 deletions(-)
> >>>
> >>> diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
> >>> index ebbf44f..0302983 100644
> >>> --- a/hw/hppa/machine.c
> >>> +++ b/hw/hppa/machine.c
> >>> @@ -54,6 +54,7 @@ static uint64_t cpu_hppa_to_phys(void *opaque, uint64_t addr)
> >>>
> >>>   static HPPACPU *cpu[HPPA_MAX_CPUS];
> >>>   static uint64_t firmware_entry;
> >>> +static ram_addr_t clamped_ram_size;
> >>>
> >>>   static void machine_hppa_init(MachineState *machine)
> >>>   {
> >>> @@ -74,8 +75,6 @@ static void machine_hppa_init(MachineState *machine)
> >>>       long i;
> >>>       unsigned int smp_cpus = machine->smp.cpus;
> >>>
> >>> -    ram_size = machine->ram_size;
> >>> -
> >>>       /* Create CPUs.  */
> >>>       for (i = 0; i < smp_cpus; i++) {
> >>>           char *name = g_strdup_printf("cpu%ld-io-eir", i);
> >>> @@ -90,12 +89,14 @@ static void machine_hppa_init(MachineState *machine)
> >>>       }
> >>>
> >>>       /* Limit main memory. */
> >>> -    if (ram_size > FIRMWARE_START) {
> >>> -        error_report("RAM size more than %d is not supported", FIRMWARE_START);
> >>> +    if (machine->ram_size > 4 * GiB) {
> >>> +        error_report("RAM size more than 4Gb is not supported");
> >>>           exit(EXIT_FAILURE);
> >>>       }
> >>> +    clamped_ram_size = machine->ram_size > FIRMWARE_START ?
> >>> +        FIRMWARE_START : machine->ram_size;
> >>>
> >>> -    memory_region_add_subregion(addr_space, 0, machine->ram);
> >>> +    memory_region_add_subregion_overlap(addr_space, 0, machine->ram, -1);
> >>>
> >>>       /* Init Dino (PCI host bus chip).  */
> >>>       pci_bus = dino_init(addr_space, &rtc_irq, &serial_irq);
> >>> @@ -151,7 +152,7 @@ static void machine_hppa_init(MachineState *machine)
> >>>       qemu_log_mask(CPU_LOG_PAGE, "Firmware loaded at 0x%08" PRIx64
> >>>                     "-0x%08" PRIx64 ", entry at 0x%08" PRIx64 ".\n",
> >>>                     firmware_low, firmware_high, firmware_entry);
> >>> -    if (firmware_low < ram_size || firmware_high >= FIRMWARE_END) {
> >>> +    if (firmware_low < clamped_ram_size || firmware_high >= FIRMWARE_END) {
> >>>           error_report("Firmware overlaps with memory or IO space");
> >>>           exit(1);
> >>>       }
> >>> @@ -204,7 +205,7 @@ static void machine_hppa_init(MachineState *machine)
> >>>                  (1) Due to sign-extension problems and PDC,
> >>>                  put the initrd no higher than 1G.
> >>>                  (2) Reserve 64k for stack.  */
> >>> -            initrd_base = MIN(ram_size, 1 * GiB);
> >>> +            initrd_base = MIN(clamped_ram_size, 1 * GiB);
> >>>               initrd_base = initrd_base - 64 * KiB;
> >>>               initrd_base = (initrd_base - initrd_size) & TARGET_PAGE_MASK;
> >>>
> >>> @@ -232,7 +233,7 @@ static void machine_hppa_init(MachineState *machine)
> >>>        * various parameters in registers. After firmware initialization,
> >>>        * firmware will start the Linux kernel with ramdisk and cmdline.
> >>>        */
> >>> -    cpu[0]->env.gr[26] = ram_size;
> >>> +    cpu[0]->env.gr[26] = clamped_ram_size;  
> 
> Helge, is this the code using this register?
> 
> https://github.com/hdeller/seabios-hppa/blob/parisc-qemu-5.0/src/parisc/head.S#L139
> 
> >>>       cpu[0]->env.gr[25] = kernel_entry;
> >>>
> >>>       /* tell firmware how many SMP CPUs to present in inventory table */
> >>> @@ -255,11 +256,11 @@ static void hppa_machine_reset(MachineState *ms)
> >>>       }
> >>>
> >>>       /* already initialized by machine_hppa_init()? */
> >>> -    if (cpu[0]->env.gr[26] == ram_size) {
> >>> +    if (cpu[0]->env.gr[26] == clamped_ram_size) {
> >>>           return;
> >>>       }
> >>>
> >>> -    cpu[0]->env.gr[26] = ram_size;
> >>> +    cpu[0]->env.gr[26] = clamped_ram_size;
> >>>       cpu[0]->env.gr[25] = 0; /* no firmware boot menu */
> >>>       cpu[0]->env.gr[24] = 'c';
> >>>       /* gr22/gr23 unused, no initrd while reboot. */
> >>>     
> >>  
> >   
> 



^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH v2] hppa: allow max ram size upto 4Gb
  2020-01-06 10:48               ` Igor Mammedov
@ 2020-01-06 11:05                 ` Philippe Mathieu-Daudé
  2020-01-06 11:28                 ` Helge Deller
  1 sibling, 0 replies; 148+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-01-06 11:05 UTC (permalink / raw)
  To: Igor Mammedov; +Cc: Helge Deller, Sven Schnelle, qemu-devel

On 1/6/20 11:48 AM, Igor Mammedov wrote:
> On Sat, 4 Jan 2020 16:00:19 +0100
> Philippe Mathieu-Daudé <philmd@redhat.com> wrote:
> 
>> On 1/3/20 10:54 AM, Igor Mammedov wrote:
>>> On Thu, 2 Jan 2020 21:22:12 +0100
>>> Helge Deller <deller@gmx.de> wrote:
>>>    
>>>> On 02.01.20 18:46, Igor Mammedov wrote:
>>>>> Previous patch drops silent ram_size fixup and makes
>>>>> QEMU error out with:
>>>>>
>>>>>    "RAM size more than 3840m is not supported"
>>>>>
>>>>> when user specified -m X more than supported value.
>>>>>
>>>>> User shouldn't be bothered with starting QEMU with valid CLI,
>>>>> so for the sake of user convenience allow using -m 4G vs -m 3840M.
>>>>>
>>>>> Requested-by: Helge Deller <deller@gmx.de>
>>>>> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
>>>>> ---
>>>>> v2:
>>>>>     - make main ram -1 prio, so it wouldn't conflict with other regions
>>>>>       starting from 0xf9000000
>>>>>
>>>>> I dislike it but if you feel it's really necessary feel free to ack it.
>>
>> Hard to find the v2 buried in the other series with my email client.
>>
>>>>>
>>>>> should be applied on top of:
>>>>>     "hppa: drop RAM size fixup"
>>>>
>>>> Hello Igor,
>>>> I appreciate that you are trying to make it more cleaner.
>>>> But, can't you merge both of your patches to one patch?
>>>> Right now you have one patch "hppa: drop RAM size fixup", which is
>>>> what I think is wrong. Then you add another one which somehow
>>>> fixes it up again and adds other stuff.
>>> 1st patch bring it in line with other boards adding
>>> proper error check but without changing RAM size.
>>> While 2nd is changing device model (mapped RAM size) and
>>> clearly documents that it's a hack for user convenience,
>>> Hence I'd prefer to keep both separated.
>>>    
>>>> Having everything in one single patch makes your full change more
>>>> understandable.
>>>>
>>>> Is it necessary to introduce clamped_ram_size and not continue with
>>>> ram_size (even if you would add it as static local variable)?
>>> it's necessary since ram_size is global which should be kept == MachineState::ram_size.
>>> Later on I plan to remove the former altogether and maybe
>>> MachineState::ram_size aa well, since it could be read with
>>> memory_region_size(MachineState::ram).
>>
>> Why insist on clamping the ram? We recommend to model what the hardware
>> does, and the hardware uses a full DIMM of DRAM, so 4GB, not less.
> I'm not adding 4Gb support here (it's out of scope of this series),
> all this patch does is making pre-existing global ram_size fixup,
> this board only business and naming it clamped_ram_size to match
> its current usage (along with explicitly documenting the deviation from
> other boards why it was requested to keep fixup 'for user convenience'
> instead of going for correct and simpler error message telling
> how much RAM user could specify on CLI).
> 
>> What are the new problem introduced by using 4GB? I only see advantages
>> doing so. This doesn't break your series. This doesn't break the CLI.
>> Am I missing something?
> 
> Well, board was fixing up global ram_size and then used it to
>   - pass clamped value to guest via register
>   - pass it to load load_image_targphys()
>   - perform various checks
>   - affects reset sequence

You are correct. 'clamped_ram_size' is a good name.

> This patch keeps all of that in the same state
> (I'd suspect changing above points, would break guest)

It makes sense.

> If you have an alternative patch that enables to use full 4Gb,
> I'd include on respin as far as it doesn't change user supplied
> global ram_size && ms->ram_size && uses generic ms->ram &&
> preferably on top of
>   "[PATCH 44/86] hppa: use memdev for RAM"
> so it would be easier to drop it if there would opposition to it
> without affecting series.

No, now than I understood your explication:

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>

Thanks for insisting :)

>>>>> ---
>>>>>    hw/hppa/machine.c | 21 +++++++++++----------
>>>>>    1 file changed, 11 insertions(+), 10 deletions(-)
>>>>>
>>>>> diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
>>>>> index ebbf44f..0302983 100644
>>>>> --- a/hw/hppa/machine.c
>>>>> +++ b/hw/hppa/machine.c
>>>>> @@ -54,6 +54,7 @@ static uint64_t cpu_hppa_to_phys(void *opaque, uint64_t addr)
>>>>>
>>>>>    static HPPACPU *cpu[HPPA_MAX_CPUS];
>>>>>    static uint64_t firmware_entry;
>>>>> +static ram_addr_t clamped_ram_size;
>>>>>
>>>>>    static void machine_hppa_init(MachineState *machine)
>>>>>    {
>>>>> @@ -74,8 +75,6 @@ static void machine_hppa_init(MachineState *machine)
>>>>>        long i;
>>>>>        unsigned int smp_cpus = machine->smp.cpus;
>>>>>
>>>>> -    ram_size = machine->ram_size;
>>>>> -
>>>>>        /* Create CPUs.  */
>>>>>        for (i = 0; i < smp_cpus; i++) {
>>>>>            char *name = g_strdup_printf("cpu%ld-io-eir", i);
>>>>> @@ -90,12 +89,14 @@ static void machine_hppa_init(MachineState *machine)
>>>>>        }
>>>>>
>>>>>        /* Limit main memory. */
>>>>> -    if (ram_size > FIRMWARE_START) {
>>>>> -        error_report("RAM size more than %d is not supported", FIRMWARE_START);
>>>>> +    if (machine->ram_size > 4 * GiB) {
>>>>> +        error_report("RAM size more than 4Gb is not supported");
>>>>>            exit(EXIT_FAILURE);
>>>>>        }
>>>>> +    clamped_ram_size = machine->ram_size > FIRMWARE_START ?
>>>>> +        FIRMWARE_START : machine->ram_size;
>>>>>
>>>>> -    memory_region_add_subregion(addr_space, 0, machine->ram);
>>>>> +    memory_region_add_subregion_overlap(addr_space, 0, machine->ram, -1);
>>>>>
>>>>>        /* Init Dino (PCI host bus chip).  */
>>>>>        pci_bus = dino_init(addr_space, &rtc_irq, &serial_irq);
>>>>> @@ -151,7 +152,7 @@ static void machine_hppa_init(MachineState *machine)
>>>>>        qemu_log_mask(CPU_LOG_PAGE, "Firmware loaded at 0x%08" PRIx64
>>>>>                      "-0x%08" PRIx64 ", entry at 0x%08" PRIx64 ".\n",
>>>>>                      firmware_low, firmware_high, firmware_entry);
>>>>> -    if (firmware_low < ram_size || firmware_high >= FIRMWARE_END) {
>>>>> +    if (firmware_low < clamped_ram_size || firmware_high >= FIRMWARE_END) {
>>>>>            error_report("Firmware overlaps with memory or IO space");
>>>>>            exit(1);
>>>>>        }
>>>>> @@ -204,7 +205,7 @@ static void machine_hppa_init(MachineState *machine)
>>>>>                   (1) Due to sign-extension problems and PDC,
>>>>>                   put the initrd no higher than 1G.
>>>>>                   (2) Reserve 64k for stack.  */
>>>>> -            initrd_base = MIN(ram_size, 1 * GiB);
>>>>> +            initrd_base = MIN(clamped_ram_size, 1 * GiB);
>>>>>                initrd_base = initrd_base - 64 * KiB;
>>>>>                initrd_base = (initrd_base - initrd_size) & TARGET_PAGE_MASK;
>>>>>
>>>>> @@ -232,7 +233,7 @@ static void machine_hppa_init(MachineState *machine)
>>>>>         * various parameters in registers. After firmware initialization,
>>>>>         * firmware will start the Linux kernel with ramdisk and cmdline.
>>>>>         */
>>>>> -    cpu[0]->env.gr[26] = ram_size;
>>>>> +    cpu[0]->env.gr[26] = clamped_ram_size;
>>
>> Helge, is this the code using this register?
>>
>> https://github.com/hdeller/seabios-hppa/blob/parisc-qemu-5.0/src/parisc/head.S#L139
>>
>>>>>        cpu[0]->env.gr[25] = kernel_entry;
>>>>>
>>>>>        /* tell firmware how many SMP CPUs to present in inventory table */
>>>>> @@ -255,11 +256,11 @@ static void hppa_machine_reset(MachineState *ms)
>>>>>        }
>>>>>
>>>>>        /* already initialized by machine_hppa_init()? */
>>>>> -    if (cpu[0]->env.gr[26] == ram_size) {
>>>>> +    if (cpu[0]->env.gr[26] == clamped_ram_size) {
>>>>>            return;
>>>>>        }
>>>>>
>>>>> -    cpu[0]->env.gr[26] = ram_size;
>>>>> +    cpu[0]->env.gr[26] = clamped_ram_size;
>>>>>        cpu[0]->env.gr[25] = 0; /* no firmware boot menu */
>>>>>        cpu[0]->env.gr[24] = 'c';
>>>>>        /* gr22/gr23 unused, no initrd while reboot. */
>>>>>      
>>>>   
>>>    
>>
> 



^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH v2] hppa: allow max ram size upto 4Gb
  2020-01-06 10:48               ` Igor Mammedov
  2020-01-06 11:05                 ` Philippe Mathieu-Daudé
@ 2020-01-06 11:28                 ` Helge Deller
  2020-01-06 16:24                   ` Igor Mammedov
  1 sibling, 1 reply; 148+ messages in thread
From: Helge Deller @ 2020-01-06 11:28 UTC (permalink / raw)
  To: Igor Mammedov, Philippe Mathieu-Daudé; +Cc: Sven Schnelle, qemu-devel

On 06.01.20 11:48, Igor Mammedov wrote:
> On Sat, 4 Jan 2020 16:00:19 +0100
> Philippe Mathieu-Daudé <philmd@redhat.com> wrote:
>
>> On 1/3/20 10:54 AM, Igor Mammedov wrote:
>>> On Thu, 2 Jan 2020 21:22:12 +0100
>>> Helge Deller <deller@gmx.de> wrote:
>>>
>>>> On 02.01.20 18:46, Igor Mammedov wrote:
>>>>> Previous patch drops silent ram_size fixup and makes
>>>>> QEMU error out with:
>>>>>
>>>>>   "RAM size more than 3840m is not supported"
>>>>>
>>>>> when user specified -m X more than supported value.
>>>>>
>>>>> User shouldn't be bothered with starting QEMU with valid CLI,
>>>>> so for the sake of user convenience allow using -m 4G vs -m 3840M.
>>>>>
>>>>> Requested-by: Helge Deller <deller@gmx.de>
>>>>> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
>>>>> ---
>>>>> v2:
>>>>>    - make main ram -1 prio, so it wouldn't conflict with other regions
>>>>>      starting from 0xf9000000
>>>>>
>>>>> I dislike it but if you feel it's really necessary feel free to ack it.
>>
>> Hard to find the v2 buried in the other series with my email client.
>>
>>>>>
>>>>> should be applied on top of:
>>>>>    "hppa: drop RAM size fixup"
>>>>
>>>> Hello Igor,
>>>> I appreciate that you are trying to make it more cleaner.
>>>> But, can't you merge both of your patches to one patch?
>>>> Right now you have one patch "hppa: drop RAM size fixup", which is
>>>> what I think is wrong. Then you add another one which somehow
>>>> fixes it up again and adds other stuff.
>>> 1st patch bring it in line with other boards adding
>>> proper error check but without changing RAM size.
>>> While 2nd is changing device model (mapped RAM size) and
>>> clearly documents that it's a hack for user convenience,
>>> Hence I'd prefer to keep both separated.
>>>
>>>> Having everything in one single patch makes your full change more
>>>> understandable.
>>>>
>>>> Is it necessary to introduce clamped_ram_size and not continue with
>>>> ram_size (even if you would add it as static local variable)?
>>> it's necessary since ram_size is global which should be kept == MachineState::ram_size.
>>> Later on I plan to remove the former altogether and maybe
>>> MachineState::ram_size aa well, since it could be read with
>>> memory_region_size(MachineState::ram).
>>
>> Why insist on clamping the ram? We recommend to model what the hardware
>> does, and the hardware uses a full DIMM of DRAM, so 4GB, not less.
> I'm not adding 4Gb support here (it's out of scope of this series),
> all this patch does is making pre-existing global ram_size fixup,
> this board only business and naming it clamped_ram_size to match
> its current usage

Ok.

> (along with explicitly documenting the deviation from
> other boards why it was requested to keep fixup 'for user convenience'
> instead of going for correct and simpler error message telling
> how much RAM user could specify on CLI).

No, here you are wrong.
This machine, same as all 32-bit x86 based machines, expect users
to insert memory modules of e.g. 1GB, 2GB and so on.
And ROM memory and other regions overlap the RAM in some regions
if required.
So, it's not "user convenience", but it's correct behaviour of the
code to simply allow 4GB and then don't blend in the memory which can't
be accessed.
Giving a error message that "you can only insert 3841MB" would be WRONG.

>> What are the new problem introduced by using 4GB? I only see advantages
>> doing so. This doesn't break your series. This doesn't break the CLI.
>> Am I missing something?
>
> Well, board was fixing up global ram_size and then used it to
>  - pass clamped value to guest via register
>  - pass it to load load_image_targphys()
>  - perform various checks
>  - affects reset sequence

... which is all OK, because it mimics the real hardware.

> This patch keeps all of that in the same state
> (I'd suspect changing above points, would break guest)

Yep (unless I change the SeaBIOS ROM code).

Anyway, I'm tired to discuss this.
Your patch isn't wrong by itself, I just think it's changing unnecessary
too much code and uses wrong wording for the commit message.
But just apply it as long as it doesn't break anything.

Helge

> If you have an alternative patch that enables to use full 4Gb,
> I'd include on respin as far as it doesn't change user supplied
> global ram_size && ms->ram_size && uses generic ms->ram &&
> preferably on top of
>  "[PATCH 44/86] hppa: use memdev for RAM"
> so it would be easier to drop it if there would opposition to it
> without affecting series.
>
>>>>> ---
>>>>>   hw/hppa/machine.c | 21 +++++++++++----------
>>>>>   1 file changed, 11 insertions(+), 10 deletions(-)
>>>>>
>>>>> diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
>>>>> index ebbf44f..0302983 100644
>>>>> --- a/hw/hppa/machine.c
>>>>> +++ b/hw/hppa/machine.c
>>>>> @@ -54,6 +54,7 @@ static uint64_t cpu_hppa_to_phys(void *opaque, uint64_t addr)
>>>>>
>>>>>   static HPPACPU *cpu[HPPA_MAX_CPUS];
>>>>>   static uint64_t firmware_entry;
>>>>> +static ram_addr_t clamped_ram_size;
>>>>>
>>>>>   static void machine_hppa_init(MachineState *machine)
>>>>>   {
>>>>> @@ -74,8 +75,6 @@ static void machine_hppa_init(MachineState *machine)
>>>>>       long i;
>>>>>       unsigned int smp_cpus = machine->smp.cpus;
>>>>>
>>>>> -    ram_size = machine->ram_size;
>>>>> -
>>>>>       /* Create CPUs.  */
>>>>>       for (i = 0; i < smp_cpus; i++) {
>>>>>           char *name = g_strdup_printf("cpu%ld-io-eir", i);
>>>>> @@ -90,12 +89,14 @@ static void machine_hppa_init(MachineState *machine)
>>>>>       }
>>>>>
>>>>>       /* Limit main memory. */
>>>>> -    if (ram_size > FIRMWARE_START) {
>>>>> -        error_report("RAM size more than %d is not supported", FIRMWARE_START);
>>>>> +    if (machine->ram_size > 4 * GiB) {
>>>>> +        error_report("RAM size more than 4Gb is not supported");
>>>>>           exit(EXIT_FAILURE);
>>>>>       }
>>>>> +    clamped_ram_size = machine->ram_size > FIRMWARE_START ?
>>>>> +        FIRMWARE_START : machine->ram_size;
>>>>>
>>>>> -    memory_region_add_subregion(addr_space, 0, machine->ram);
>>>>> +    memory_region_add_subregion_overlap(addr_space, 0, machine->ram, -1);
>>>>>
>>>>>       /* Init Dino (PCI host bus chip).  */
>>>>>       pci_bus = dino_init(addr_space, &rtc_irq, &serial_irq);
>>>>> @@ -151,7 +152,7 @@ static void machine_hppa_init(MachineState *machine)
>>>>>       qemu_log_mask(CPU_LOG_PAGE, "Firmware loaded at 0x%08" PRIx64
>>>>>                     "-0x%08" PRIx64 ", entry at 0x%08" PRIx64 ".\n",
>>>>>                     firmware_low, firmware_high, firmware_entry);
>>>>> -    if (firmware_low < ram_size || firmware_high >= FIRMWARE_END) {
>>>>> +    if (firmware_low < clamped_ram_size || firmware_high >= FIRMWARE_END) {
>>>>>           error_report("Firmware overlaps with memory or IO space");
>>>>>           exit(1);
>>>>>       }
>>>>> @@ -204,7 +205,7 @@ static void machine_hppa_init(MachineState *machine)
>>>>>                  (1) Due to sign-extension problems and PDC,
>>>>>                  put the initrd no higher than 1G.
>>>>>                  (2) Reserve 64k for stack.  */
>>>>> -            initrd_base = MIN(ram_size, 1 * GiB);
>>>>> +            initrd_base = MIN(clamped_ram_size, 1 * GiB);
>>>>>               initrd_base = initrd_base - 64 * KiB;
>>>>>               initrd_base = (initrd_base - initrd_size) & TARGET_PAGE_MASK;
>>>>>
>>>>> @@ -232,7 +233,7 @@ static void machine_hppa_init(MachineState *machine)
>>>>>        * various parameters in registers. After firmware initialization,
>>>>>        * firmware will start the Linux kernel with ramdisk and cmdline.
>>>>>        */
>>>>> -    cpu[0]->env.gr[26] = ram_size;
>>>>> +    cpu[0]->env.gr[26] = clamped_ram_size;
>>
>> Helge, is this the code using this register?
>>
>> https://github.com/hdeller/seabios-hppa/blob/parisc-qemu-5.0/src/parisc/head.S#L139
>>
>>>>>       cpu[0]->env.gr[25] = kernel_entry;
>>>>>
>>>>>       /* tell firmware how many SMP CPUs to present in inventory table */
>>>>> @@ -255,11 +256,11 @@ static void hppa_machine_reset(MachineState *ms)
>>>>>       }
>>>>>
>>>>>       /* already initialized by machine_hppa_init()? */
>>>>> -    if (cpu[0]->env.gr[26] == ram_size) {
>>>>> +    if (cpu[0]->env.gr[26] == clamped_ram_size) {
>>>>>           return;
>>>>>       }
>>>>>
>>>>> -    cpu[0]->env.gr[26] = ram_size;
>>>>> +    cpu[0]->env.gr[26] = clamped_ram_size;
>>>>>       cpu[0]->env.gr[25] = 0; /* no firmware boot menu */
>>>>>       cpu[0]->env.gr[24] = 'c';
>>>>>       /* gr22/gr23 unused, no initrd while reboot. */
>>>>>
>>>>
>>>
>>
>



^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH v2] hppa: allow max ram size upto 4Gb
  2020-01-06 11:28                 ` Helge Deller
@ 2020-01-06 16:24                   ` Igor Mammedov
  2020-01-06 17:03                     ` Helge Deller
  0 siblings, 1 reply; 148+ messages in thread
From: Igor Mammedov @ 2020-01-06 16:24 UTC (permalink / raw)
  To: Helge Deller; +Cc: Sven Schnelle, Philippe Mathieu-Daudé, qemu-devel

On Mon, 6 Jan 2020 12:28:51 +0100
Helge Deller <deller@gmx.de> wrote:

> On 06.01.20 11:48, Igor Mammedov wrote:
> > On Sat, 4 Jan 2020 16:00:19 +0100
> > Philippe Mathieu-Daudé <philmd@redhat.com> wrote:
> >  
> >> On 1/3/20 10:54 AM, Igor Mammedov wrote:  
> >>> On Thu, 2 Jan 2020 21:22:12 +0100
> >>> Helge Deller <deller@gmx.de> wrote:
> >>>  
> >>>> On 02.01.20 18:46, Igor Mammedov wrote:  
> >>>>> Previous patch drops silent ram_size fixup and makes
> >>>>> QEMU error out with:
> >>>>>
> >>>>>   "RAM size more than 3840m is not supported"
> >>>>>
> >>>>> when user specified -m X more than supported value.
> >>>>>
> >>>>> User shouldn't be bothered with starting QEMU with valid CLI,
> >>>>> so for the sake of user convenience allow using -m 4G vs -m 3840M.
> >>>>>
> >>>>> Requested-by: Helge Deller <deller@gmx.de>
> >>>>> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> >>>>> ---
> >>>>> v2:
> >>>>>    - make main ram -1 prio, so it wouldn't conflict with other regions
> >>>>>      starting from 0xf9000000
> >>>>>
> >>>>> I dislike it but if you feel it's really necessary feel free to ack it.  
> >>
> >> Hard to find the v2 buried in the other series with my email client.
> >>  
> >>>>>
> >>>>> should be applied on top of:
> >>>>>    "hppa: drop RAM size fixup"  
> >>>>
> >>>> Hello Igor,
> >>>> I appreciate that you are trying to make it more cleaner.
> >>>> But, can't you merge both of your patches to one patch?
> >>>> Right now you have one patch "hppa: drop RAM size fixup", which is
> >>>> what I think is wrong. Then you add another one which somehow
> >>>> fixes it up again and adds other stuff.  
> >>> 1st patch bring it in line with other boards adding
> >>> proper error check but without changing RAM size.
> >>> While 2nd is changing device model (mapped RAM size) and
> >>> clearly documents that it's a hack for user convenience,
> >>> Hence I'd prefer to keep both separated.
> >>>  
> >>>> Having everything in one single patch makes your full change more
> >>>> understandable.
> >>>>
> >>>> Is it necessary to introduce clamped_ram_size and not continue with
> >>>> ram_size (even if you would add it as static local variable)?  
> >>> it's necessary since ram_size is global which should be kept == MachineState::ram_size.
> >>> Later on I plan to remove the former altogether and maybe
> >>> MachineState::ram_size aa well, since it could be read with
> >>> memory_region_size(MachineState::ram).  
> >>
> >> Why insist on clamping the ram? We recommend to model what the hardware
> >> does, and the hardware uses a full DIMM of DRAM, so 4GB, not less.  
> > I'm not adding 4Gb support here (it's out of scope of this series),
> > all this patch does is making pre-existing global ram_size fixup,
> > this board only business and naming it clamped_ram_size to match
> > its current usage  
> 
> Ok.
> 
> > (along with explicitly documenting the deviation from
> > other boards why it was requested to keep fixup 'for user convenience'
> > instead of going for correct and simpler error message telling
> > how much RAM user could specify on CLI).  
> 
> No, here you are wrong.
> This machine, same as all 32-bit x86 based machines, expect users
> to insert memory modules of e.g. 1GB, 2GB and so on.
> And ROM memory and other regions overlap the RAM in some regions
> if required.
> So, it's not "user convenience", but it's correct behaviour of the
> code to simply allow 4GB and then don't blend in the memory which can't
> be accessed.
> Giving a error message that "you can only insert 3841MB" would be WRONG.
> 
> >> What are the new problem introduced by using 4GB? I only see advantages
> >> doing so. This doesn't break your series. This doesn't break the CLI.
> >> Am I missing something?  
> >
> > Well, board was fixing up global ram_size and then used it to
> >  - pass clamped value to guest via register
> >  - pass it to load load_image_targphys()
> >  - perform various checks
> >  - affects reset sequence  
> 
> ... which is all OK, because it mimics the real hardware.
> 
> > This patch keeps all of that in the same state
> > (I'd suspect changing above points, would break guest)  
> 
> Yep (unless I change the SeaBIOS ROM code).
Does real HW pass in cpu[0]->env.gr[26] full 4Gb or clamped size?


> Anyway, I'm tired to discuss this.
> Your patch isn't wrong by itself, I just think it's changing unnecessary
> too much code aram_sizend uses wrong wording for the commit message.
Let me prepare v3 which hopefully will make is smaller and
with commit message corrected.
How about following wording:
"
    hppa: allow max ram size upto 4Gb
    
    Previous patch drops silent ram_size fixup and makes
    QEMU error out with:
    
     "RAM size more than 3840m is not supported"
    
    when user specified -m X more than currently supported
    value.

    However real hardware allows to plug in up to 4Gb RAM
    into memory slots. So allow user specify up to 4Gb and
    map all of it into guest address space.

PS:
    guest will still see 3840m being reported in
    cpu[0]->env.gr[26] and loose ~248Mb, as it doesn't
    have other means to discover RAM above firmware ROM.
"

> But just apply it as long as it doesn't break anything.
> 
> Helge
> 
> > If you have an alternative patch that enables to use full 4Gb,
> > I'd include on respin as far as it doesn't change user supplied
> > global ram_size && ms->ram_size && uses generic ms->ram &&
> > preferably on top of
> >  "[PATCH 44/86] hppa: use memdev for RAM"
> > so it would be easier to drop it if there would opposition to it
> > without affecting series.
> >  
> >>>>> ---
> >>>>>   hw/hppa/machine.c | 21 +++++++++++----------
> >>>>>   1 file changed, 11 insertions(+), 10 deletions(-)
> >>>>>
> >>>>> diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
> >>>>> index ebbf44f..0302983 100644
> >>>>> --- a/hw/hppa/machine.c
> >>>>> +++ b/hw/hppa/machine.c
> >>>>> @@ -54,6 +54,7 @@ static uint64_t cpu_hppa_to_phys(void *opaque, uint64_t addr)
> >>>>>
> >>>>>   static HPPACPU *cpu[HPPA_MAX_CPUS];
> >>>>>   static uint64_t firmware_entry;
> >>>>> +static ram_addr_t clamped_ram_size;
> >>>>>
> >>>>>   static void machine_hppa_init(MachineState *machine)
> >>>>>   {
> >>>>> @@ -74,8 +75,6 @@ static void machine_hppa_init(MachineState *machine)
> >>>>>       long i;
> >>>>>       unsigned int smp_cpus = machine->smp.cpus;
> >>>>>
> >>>>> -    ram_size = machine->ram_size;
> >>>>> -
> >>>>>       /* Create CPUs.  */
> >>>>>       for (i = 0; i < smp_cpus; i++) {
> >>>>>           char *name = g_strdup_printf("cpu%ld-io-eir", i);
> >>>>> @@ -90,12 +89,14 @@ static void machine_hppa_init(MachineState *machine)
> >>>>>       }
> >>>>>
> >>>>>       /* Limit main memory. */
> >>>>> -    if (ram_size > FIRMWARE_START) {
> >>>>> -        error_report("RAM size more than %d is not supported", FIRMWARE_START);
> >>>>> +    if (machine->ram_size > 4 * GiB) {
> >>>>> +        error_report("RAM size more than 4Gb is not supported");
> >>>>>           exit(EXIT_FAILURE);
> >>>>>       }
> >>>>> +    clamped_ram_size = machine->ram_size > FIRMWARE_START ?
> >>>>> +        FIRMWARE_START : machine->ram_size;
> >>>>>
> >>>>> -    memory_region_add_subregion(addr_space, 0, machine->ram);
> >>>>> +    memory_region_add_subregion_overlap(addr_space, 0, machine->ram, -1);
> >>>>>
> >>>>>       /* Init Dino (PCI host bus chip).  */
> >>>>>       pci_bus = dino_init(addr_space, &rtc_irq, &serial_irq);
> >>>>> @@ -151,7 +152,7 @@ static void machine_hppa_init(MachineState *machine)
> >>>>>       qemu_log_mask(CPU_LOG_PAGE, "Firmware loaded at 0x%08" PRIx64
> >>>>>                     "-0x%08" PRIx64 ", entry at 0x%08" PRIx64 ".\n",
> >>>>>                     firmware_low, firmware_high, firmware_entry);
> >>>>> -    if (firmware_low < ram_size || firmware_high >= FIRMWARE_END) {
> >>>>> +    if (firmware_low < clamped_ram_size || firmware_high >= FIRMWARE_END) {
> >>>>>           error_report("Firmware overlaps with memory or IO space");
> >>>>>           exit(1);
> >>>>>       }
> >>>>> @@ -204,7 +205,7 @@ static void machine_hppa_init(MachineState *machine)
> >>>>>                  (1) Due to sign-extension problems and PDC,
> >>>>>                  put the initrd no higher than 1G.
> >>>>>                  (2) Reserve 64k for stack.  */
> >>>>> -            initrd_base = MIN(ram_size, 1 * GiB);
> >>>>> +            initrd_base = MIN(clamped_ram_size, 1 * GiB);
> >>>>>               initrd_base = initrd_base - 64 * KiB;
> >>>>>               initrd_base = (initrd_base - initrd_size) & TARGET_PAGE_MASK;
> >>>>>
> >>>>> @@ -232,7 +233,7 @@ static void machine_hppa_init(MachineState *machine)
> >>>>>        * various parameters in registers. After firmware initialization,
> >>>>>        * firmware will start the Linux kernel with ramdisk and cmdline.
> >>>>>        */
> >>>>> -    cpu[0]->env.gr[26] = ram_size;
> >>>>> +    cpu[0]->env.gr[26] = clamped_ram_size;  
> >>
> >> Helge, is this the code using this register?
> >>
> >> https://github.com/hdeller/seabios-hppa/blob/parisc-qemu-5.0/src/parisc/head.S#L139
> >>  
> >>>>>       cpu[0]->env.gr[25] = kernel_entry;
> >>>>>
> >>>>>       /* tell firmware how many SMP CPUs to present in inventory table */
> >>>>> @@ -255,11 +256,11 @@ static void hppa_machine_reset(MachineState *ms)
> >>>>>       }
> >>>>>
> >>>>>       /* already initialized by machine_hppa_init()? */
> >>>>> -    if (cpu[0]->env.gr[26] == ram_size) {
> >>>>> +    if (cpu[0]->env.gr[26] == clamped_ram_size) {
> >>>>>           return;
> >>>>>       }
> >>>>>
> >>>>> -    cpu[0]->env.gr[26] = ram_size;
> >>>>> +    cpu[0]->env.gr[26] = clamped_ram_size;
> >>>>>       cpu[0]->env.gr[25] = 0; /* no firmware boot menu */
> >>>>>       cpu[0]->env.gr[24] = 'c';
> >>>>>       /* gr22/gr23 unused, no initrd while reboot. */
> >>>>>  
> >>>>  
> >>>  
> >>  
> >  
> 
> 



^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH v2] hppa: allow max ram size upto 4Gb
  2020-01-06 16:24                   ` Igor Mammedov
@ 2020-01-06 17:03                     ` Helge Deller
  2020-01-07 11:21                       ` Igor Mammedov
  0 siblings, 1 reply; 148+ messages in thread
From: Helge Deller @ 2020-01-06 17:03 UTC (permalink / raw)
  To: Igor Mammedov; +Cc: Sven Schnelle, Philippe Mathieu-Daudé, qemu-devel

On 06.01.20 17:24, Igor Mammedov wrote:
> On Mon, 6 Jan 2020 12:28:51 +0100
> Helge Deller <deller@gmx.de> wrote:
>
>> On 06.01.20 11:48, Igor Mammedov wrote:
>>> On Sat, 4 Jan 2020 16:00:19 +0100
>>> Philippe Mathieu-Daudé <philmd@redhat.com> wrote:
>>>
>>>> On 1/3/20 10:54 AM, Igor Mammedov wrote:
>>>>> On Thu, 2 Jan 2020 21:22:12 +0100
>>>>> Helge Deller <deller@gmx.de> wrote:
>>>>>
>>>>>> On 02.01.20 18:46, Igor Mammedov wrote:
>>>>>>> Previous patch drops silent ram_size fixup and makes
>>>>>>> QEMU error out with:
>>>>>>>
>>>>>>>   "RAM size more than 3840m is not supported"
>>>>>>>
>>>>>>> when user specified -m X more than supported value.
>>>>>>>
>>>>>>> User shouldn't be bothered with starting QEMU with valid CLI,
>>>>>>> so for the sake of user convenience allow using -m 4G vs -m 3840M.
>>>>>>>
>>>>>>> Requested-by: Helge Deller <deller@gmx.de>
>>>>>>> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
>>>>>>> ---
>>>>>>> v2:
>>>>>>>    - make main ram -1 prio, so it wouldn't conflict with other regions
>>>>>>>      starting from 0xf9000000
>>>>>>>
>>>>>>> I dislike it but if you feel it's really necessary feel free to ack it.
>>>>
>>>> Hard to find the v2 buried in the other series with my email client.
>>>>
>>>>>>>
>>>>>>> should be applied on top of:
>>>>>>>    "hppa: drop RAM size fixup"
>>>>>>
>>>>>> Hello Igor,
>>>>>> I appreciate that you are trying to make it more cleaner.
>>>>>> But, can't you merge both of your patches to one patch?
>>>>>> Right now you have one patch "hppa: drop RAM size fixup", which is
>>>>>> what I think is wrong. Then you add another one which somehow
>>>>>> fixes it up again and adds other stuff.
>>>>> 1st patch bring it in line with other boards adding
>>>>> proper error check but without changing RAM size.
>>>>> While 2nd is changing device model (mapped RAM size) and
>>>>> clearly documents that it's a hack for user convenience,
>>>>> Hence I'd prefer to keep both separated.
>>>>>
>>>>>> Having everything in one single patch makes your full change more
>>>>>> understandable.
>>>>>>
>>>>>> Is it necessary to introduce clamped_ram_size and not continue with
>>>>>> ram_size (even if you would add it as static local variable)?
>>>>> it's necessary since ram_size is global which should be kept == MachineState::ram_size.
>>>>> Later on I plan to remove the former altogether and maybe
>>>>> MachineState::ram_size aa well, since it could be read with
>>>>> memory_region_size(MachineState::ram).
>>>>
>>>> Why insist on clamping the ram? We recommend to model what the hardware
>>>> does, and the hardware uses a full DIMM of DRAM, so 4GB, not less.
>>> I'm not adding 4Gb support here (it's out of scope of this series),
>>> all this patch does is making pre-existing global ram_size fixup,
>>> this board only business and naming it clamped_ram_size to match
>>> its current usage
>>
>> Ok.
>>
>>> (along with explicitly documenting the deviation from
>>> other boards why it was requested to keep fixup 'for user convenience'
>>> instead of going for correct and simpler error message telling
>>> how much RAM user could specify on CLI).
>>
>> No, here you are wrong.
>> This machine, same as all 32-bit x86 based machines, expect users
>> to insert memory modules of e.g. 1GB, 2GB and so on.
>> And ROM memory and other regions overlap the RAM in some regions
>> if required.
>> So, it's not "user convenience", but it's correct behaviour of the
>> code to simply allow 4GB and then don't blend in the memory which can't
>> be accessed.
>> Giving a error message that "you can only insert 3841MB" would be WRONG.
>>
>>>> What are the new problem introduced by using 4GB? I only see advantages
>>>> doing so. This doesn't break your series. This doesn't break the CLI.
>>>> Am I missing something?
>>>
>>> Well, board was fixing up global ram_size and then used it to
>>>  - pass clamped value to guest via register
>>>  - pass it to load load_image_targphys()
>>>  - perform various checks
>>>  - affects reset sequence
>>
>> ... which is all OK, because it mimics the real hardware.
>>
>>> This patch keeps all of that in the same state
>>> (I'd suspect changing above points, would break guest)
>>
>> Yep (unless I change the SeaBIOS ROM code).

> Does real HW pass in cpu[0]->env.gr[26] full 4Gb or clamped size?

No, because of the simple reason that real hardware uses a
propriatary HP Firmware, and that it's not started from some emulation
layer like qemu. So it has to find way itself to detect how much RAM
was plugged into the machine.

The functionality of giving the ram size in %r26 was done by me,
otherwise I don't know how SeaBIOS should detect how much RAM the
user wanted the machine to have. That's changeable if you have another
idea. Doesn't on x86 the ram size is given in some emulated RTC register?

>> Anyway, I'm tired to discuss this.
>> Your patch isn't wrong by itself, I just think it's changing unnecessary
>> too much code and uses wrong wording for the commit message.

> Let me prepare v3 which hopefully will make is smaller and
> with commit message corrected.
> How about following wording:
> "
>     hppa: allow max ram size upto 4Gb
>
>     Previous patch drops silent ram_size fixup and makes
>     QEMU error out with:
>
>      "RAM size more than 3840m is not supported"
>
>     when user specified -m X more than currently supported
>     value.
>
>     However real hardware allows to plug in up to 4Gb RAM
>     into memory slots. So allow user specify up to 4Gb and
>     map all of it into guest address space.
>
> PS:
>     guest will still see 3840m being reported in
>     cpu[0]->env.gr[26] and loose ~248Mb, as it doesn't
>     have other means to discover RAM above firmware ROM.
> "

Why make it so complicated?

I see:
+    if (machine->ram_size > 4 * GiB) {
+        error_report("RAM size more than 4Gb is not supported");

what type is machine->ram_size?
If it's a 32bit unsigned integer this check is useless, and if it's a 64bit
integer it would be too big for a 32bit-only platform anyway.

So, I'd suggest to drop your wrong patch #43.

If you don't want to drop it, my suggestion for a commit message is:

hppa: Revert last wrong patch and give warning if user specified > 4GB RAM


Helge

>
>> But just apply it as long as it doesn't break anything.
>>
>> Helge
>>
>>> If you have an alternative patch that enables to use full 4Gb,
>>> I'd include on respin as far as it doesn't change user supplied
>>> global ram_size && ms->ram_size && uses generic ms->ram &&
>>> preferably on top of
>>>  "[PATCH 44/86] hppa: use memdev for RAM"
>>> so it would be easier to drop it if there would opposition to it
>>> without affecting series.
>>>
>>>>>>> ---
>>>>>>>   hw/hppa/machine.c | 21 +++++++++++----------
>>>>>>>   1 file changed, 11 insertions(+), 10 deletions(-)
>>>>>>>
>>>>>>> diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
>>>>>>> index ebbf44f..0302983 100644
>>>>>>> --- a/hw/hppa/machine.c
>>>>>>> +++ b/hw/hppa/machine.c
>>>>>>> @@ -54,6 +54,7 @@ static uint64_t cpu_hppa_to_phys(void *opaque, uint64_t addr)
>>>>>>>
>>>>>>>   static HPPACPU *cpu[HPPA_MAX_CPUS];
>>>>>>>   static uint64_t firmware_entry;
>>>>>>> +static ram_addr_t clamped_ram_size;
>>>>>>>
>>>>>>>   static void machine_hppa_init(MachineState *machine)
>>>>>>>   {
>>>>>>> @@ -74,8 +75,6 @@ static void machine_hppa_init(MachineState *machine)
>>>>>>>       long i;
>>>>>>>       unsigned int smp_cpus = machine->smp.cpus;
>>>>>>>
>>>>>>> -    ram_size = machine->ram_size;
>>>>>>> -
>>>>>>>       /* Create CPUs.  */
>>>>>>>       for (i = 0; i < smp_cpus; i++) {
>>>>>>>           char *name = g_strdup_printf("cpu%ld-io-eir", i);
>>>>>>> @@ -90,12 +89,14 @@ static void machine_hppa_init(MachineState *machine)
>>>>>>>       }
>>>>>>>
>>>>>>>       /* Limit main memory. */
>>>>>>> -    if (ram_size > FIRMWARE_START) {
>>>>>>> -        error_report("RAM size more than %d is not supported", FIRMWARE_START);
>>>>>>> +    if (machine->ram_size > 4 * GiB) {
>>>>>>> +        error_report("RAM size more than 4Gb is not supported");
>>>>>>>           exit(EXIT_FAILURE);
>>>>>>>       }
>>>>>>> +    clamped_ram_size = machine->ram_size > FIRMWARE_START ?
>>>>>>> +        FIRMWARE_START : machine->ram_size;
>>>>>>>
>>>>>>> -    memory_region_add_subregion(addr_space, 0, machine->ram);
>>>>>>> +    memory_region_add_subregion_overlap(addr_space, 0, machine->ram, -1);
>>>>>>>
>>>>>>>       /* Init Dino (PCI host bus chip).  */
>>>>>>>       pci_bus = dino_init(addr_space, &rtc_irq, &serial_irq);
>>>>>>> @@ -151,7 +152,7 @@ static void machine_hppa_init(MachineState *machine)
>>>>>>>       qemu_log_mask(CPU_LOG_PAGE, "Firmware loaded at 0x%08" PRIx64
>>>>>>>                     "-0x%08" PRIx64 ", entry at 0x%08" PRIx64 ".\n",
>>>>>>>                     firmware_low, firmware_high, firmware_entry);
>>>>>>> -    if (firmware_low < ram_size || firmware_high >= FIRMWARE_END) {
>>>>>>> +    if (firmware_low < clamped_ram_size || firmware_high >= FIRMWARE_END) {
>>>>>>>           error_report("Firmware overlaps with memory or IO space");
>>>>>>>           exit(1);
>>>>>>>       }
>>>>>>> @@ -204,7 +205,7 @@ static void machine_hppa_init(MachineState *machine)
>>>>>>>                  (1) Due to sign-extension problems and PDC,
>>>>>>>                  put the initrd no higher than 1G.
>>>>>>>                  (2) Reserve 64k for stack.  */
>>>>>>> -            initrd_base = MIN(ram_size, 1 * GiB);
>>>>>>> +            initrd_base = MIN(clamped_ram_size, 1 * GiB);
>>>>>>>               initrd_base = initrd_base - 64 * KiB;
>>>>>>>               initrd_base = (initrd_base - initrd_size) & TARGET_PAGE_MASK;
>>>>>>>
>>>>>>> @@ -232,7 +233,7 @@ static void machine_hppa_init(MachineState *machine)
>>>>>>>        * various parameters in registers. After firmware initialization,
>>>>>>>        * firmware will start the Linux kernel with ramdisk and cmdline.
>>>>>>>        */
>>>>>>> -    cpu[0]->env.gr[26] = ram_size;
>>>>>>> +    cpu[0]->env.gr[26] = clamped_ram_size;
>>>>
>>>> Helge, is this the code using this register?
>>>>
>>>> https://github.com/hdeller/seabios-hppa/blob/parisc-qemu-5.0/src/parisc/head.S#L139
>>>>
>>>>>>>       cpu[0]->env.gr[25] = kernel_entry;
>>>>>>>
>>>>>>>       /* tell firmware how many SMP CPUs to present in inventory table */
>>>>>>> @@ -255,11 +256,11 @@ static void hppa_machine_reset(MachineState *ms)
>>>>>>>       }
>>>>>>>
>>>>>>>       /* already initialized by machine_hppa_init()? */
>>>>>>> -    if (cpu[0]->env.gr[26] == ram_size) {
>>>>>>> +    if (cpu[0]->env.gr[26] == clamped_ram_size) {
>>>>>>>           return;
>>>>>>>       }
>>>>>>>
>>>>>>> -    cpu[0]->env.gr[26] = ram_size;
>>>>>>> +    cpu[0]->env.gr[26] = clamped_ram_size;
>>>>>>>       cpu[0]->env.gr[25] = 0; /* no firmware boot menu */
>>>>>>>       cpu[0]->env.gr[24] = 'c';
>>>>>>>       /* gr22/gr23 unused, no initrd while reboot. */
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>>
>



^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH v2] hppa: allow max ram size upto 4Gb
  2020-01-06 17:03                     ` Helge Deller
@ 2020-01-07 11:21                       ` Igor Mammedov
  2020-01-07 11:53                         ` Helge Deller
  0 siblings, 1 reply; 148+ messages in thread
From: Igor Mammedov @ 2020-01-07 11:21 UTC (permalink / raw)
  To: Helge Deller; +Cc: Sven Schnelle, Philippe Mathieu-Daudé, qemu-devel

On Mon, 6 Jan 2020 18:03:49 +0100
Helge Deller <deller@gmx.de> wrote:

> On 06.01.20 17:24, Igor Mammedov wrote:
> > On Mon, 6 Jan 2020 12:28:51 +0100
> > Helge Deller <deller@gmx.de> wrote:
> >  
> >> On 06.01.20 11:48, Igor Mammedov wrote:  
> >>> On Sat, 4 Jan 2020 16:00:19 +0100
> >>> Philippe Mathieu-Daudé <philmd@redhat.com> wrote:
> >>>  
> >>>> On 1/3/20 10:54 AM, Igor Mammedov wrote:  
> >>>>> On Thu, 2 Jan 2020 21:22:12 +0100
> >>>>> Helge Deller <deller@gmx.de> wrote:
> >>>>>  
> >>>>>> On 02.01.20 18:46, Igor Mammedov wrote:  
> >>>>>>> Previous patch drops silent ram_size fixup and makes
> >>>>>>> QEMU error out with:
> >>>>>>>
> >>>>>>>   "RAM size more than 3840m is not supported"
> >>>>>>>
> >>>>>>> when user specified -m X more than supported value.
> >>>>>>>
> >>>>>>> User shouldn't be bothered with starting QEMU with valid CLI,
> >>>>>>> so for the sake of user convenience allow using -m 4G vs -m 3840M.
> >>>>>>>
> >>>>>>> Requested-by: Helge Deller <deller@gmx.de>
> >>>>>>> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> >>>>>>> ---
> >>>>>>> v2:
> >>>>>>>    - make main ram -1 prio, so it wouldn't conflict with other regions
> >>>>>>>      starting from 0xf9000000
> >>>>>>>
> >>>>>>> I dislike it but if you feel it's really necessary feel free to ack it.  
> >>>>
> >>>> Hard to find the v2 buried in the other series with my email client.
> >>>>  
> >>>>>>>
> >>>>>>> should be applied on top of:
> >>>>>>>    "hppa: drop RAM size fixup"  
> >>>>>>
> >>>>>> Hello Igor,
> >>>>>> I appreciate that you are trying to make it more cleaner.
> >>>>>> But, can't you merge both of your patches to one patch?
> >>>>>> Right now you have one patch "hppa: drop RAM size fixup", which is
> >>>>>> what I think is wrong. Then you add another one which somehow
> >>>>>> fixes it up again and adds other stuff.  
> >>>>> 1st patch bring it in line with other boards adding
> >>>>> proper error check but without changing RAM size.
> >>>>> While 2nd is changing device model (mapped RAM size) and
> >>>>> clearly documents that it's a hack for user convenience,
> >>>>> Hence I'd prefer to keep both separated.
> >>>>>  
> >>>>>> Having everything in one single patch makes your full change more
> >>>>>> understandable.
> >>>>>>
> >>>>>> Is it necessary to introduce clamped_ram_size and not continue with
> >>>>>> ram_size (even if you would add it as static local variable)?  
> >>>>> it's necessary since ram_size is global which should be kept == MachineState::ram_size.
> >>>>> Later on I plan to remove the former altogether and maybe
> >>>>> MachineState::ram_size aa well, since it could be read with
> >>>>> memory_region_size(MachineState::ram).  
> >>>>
> >>>> Why insist on clamping the ram? We recommend to model what the hardware
> >>>> does, and the hardware uses a full DIMM of DRAM, so 4GB, not less.  
> >>> I'm not adding 4Gb support here (it's out of scope of this series),
> >>> all this patch does is making pre-existing global ram_size fixup,
> >>> this board only business and naming it clamped_ram_size to match
> >>> its current usage  
> >>
> >> Ok.
> >>  
> >>> (along with explicitly documenting the deviation from
> >>> other boards why it was requested to keep fixup 'for user convenience'
> >>> instead of going for correct and simpler error message telling
> >>> how much RAM user could specify on CLI).  
> >>
> >> No, here you are wrong.
> >> This machine, same as all 32-bit x86 based machines, expect users
> >> to insert memory modules of e.g. 1GB, 2GB and so on.
> >> And ROM memory and other regions overlap the RAM in some regions
> >> if required.
> >> So, it's not "user convenience", but it's correct behaviour of the
> >> code to simply allow 4GB and then don't blend in the memory which can't
> >> be accessed.
> >> Giving a error message that "you can only insert 3841MB" would be WRONG.
> >>  
> >>>> What are the new problem introduced by using 4GB? I only see advantages
> >>>> doing so. This doesn't break your series. This doesn't break the CLI.
> >>>> Am I missing something?  
> >>>
> >>> Well, board was fixing up global ram_size and then used it to
> >>>  - pass clamped value to guest via register
> >>>  - pass it to load load_image_targphys()
> >>>  - perform various checks
> >>>  - affects reset sequence  
> >>
> >> ... which is all OK, because it mimics the real hardware.
> >>  
> >>> This patch keeps all of that in the same state
> >>> (I'd suspect changing above points, would break guest)  
> >>
> >> Yep (unless I change the SeaBIOS ROM code).  
> 
> > Does real HW pass in cpu[0]->env.gr[26] full 4Gb or clamped size?  
> 
> No, because of the simple reason that real hardware uses a
> propriatary HP Firmware, and that it's not started from some emulation
> layer like qemu. So it has to find way itself to detect how much RAM
> was plugged into the machine.
> 
> The functionality of giving the ram size in %r26 was done by me,
> otherwise I don't know how SeaBIOS should detect how much RAM the
> user wanted the machine to have. That's changeable if you have another
> idea. Doesn't on x86 the ram size is given in some emulated RTC register?

In x86 case, there is RTC value and there is memory map provided via
paravirt fwcfg.

Using register is fine for passing total RAM size and
Since it's QEMU invention, we could pass full 4Gb in register as
a starting point to support 4Gb of RAM (which removes fixup) and
let SeaBIOS to deduce memory map from that.

Then this patch cloud be amended to:
"
hpp: support 4G of RAM

Real hardware allows to plug in up to 4Gb of RAM
into memory slots, add support for this.
"

> >> Anyway, I'm tired to discuss this.
> >> Your patch isn't wrong by itself, I just think it's changing unnecessary
> >> too much code and uses wrong wording for the commit message.  
> 
> > Let me prepare v3 which hopefully will make is smaller and
> > with commit message corrected.
> > How about following wording:
> > "
> >     hppa: allow max ram size upto 4Gb
> >
> >     Previous patch drops silent ram_size fixup and makes
> >     QEMU error out with:
> >
> >      "RAM size more than 3840m is not supported"
> >
> >     when user specified -m X more than currently supported
> >     value.
> >
> >     However real hardware allows to plug in up to 4Gb RAM
> >     into memory slots. So allow user specify up to 4Gb and
> >     map all of it into guest address space.
> >
> > PS:
> >     guest will still see 3840m being reported in
> >     cpu[0]->env.gr[26] and loose ~248Mb, as it doesn't
> >     have other means to discover RAM above firmware ROM.
> > "  
> 
> Why make it so complicated?

It describes what exactly patch does without masking any
consequences of used approach (since we are not really telling
guest that it has more RAM and guest has other means to discover
it).

If you are asking why I'm making it hard error, see cover letter.
(in short main RAM allocation is total mess and series fixes
that by consolidating, de-duplicating and replacing ad hoc allocation
with a centralized approach that allows user to specify used
RAM backend in generic case).

> I see:
> +    if (machine->ram_size > 4 * GiB) {
> +        error_report("RAM size more than 4Gb is not supported");
> 
> what type is machine->ram_size?
> If it's a 32bit unsigned integer this check is useless, and if it's a 64bit
> integer it would be too big for a 32bit-only platform anyway.

it's ram_addr_t, which is mutable depending on the host
it could be 32-bit or 64-bit.

Currently QEMU doesn't have a generic code to do such
checks and QEMU accumulated a whole zoo where some boards
do checks, some mask incorrect -m values and some do don't
do any checks. But cleaning up that is out of scope of
this already big enough re-factoring.
Hence I'm adding checks/removing fixups where they were
missing/present as it's a minimum effort needed to generalize
main RAM allocation.

> So, I'd suggest to drop your wrong patch #43.
As you noted in your first reply, patch is correct.
All it's doing is validating user input versus RAM size
actually supported by the current code, telling user
current supported limit and enforcing it.

I agree it's inconvenience for the users since they
won't be able to specify non-sense values and still
get board running, but that's clear user error and
should be corrected on user side and not by QEMU
magically masking wrong CLI values.
Since it could be fixed on user side, I care less
about user convenience when it comes to correctness
and unified code.
 
> If you don't want to drop it, my suggestion for a commit message is:
> 
> hppa: Revert last wrong patch and give warning if user specified > 4GB RAM

I have to disagree on definition of wrong here,
in my opinion covering up user errors is wrong especially
when all users have to do is to adapt their CLI.

Supporting 4Gb is another story, which is extending current
impl. and could be done on top of the ram_size check.

> Helge
> 
> >  
> >> But just apply it as long as it doesn't break anything.
> >>
> >> Helge
> >>  
> >>> If you have an alternative patch that enables to use full 4Gb,
> >>> I'd include on respin as far as it doesn't change user supplied
> >>> global ram_size && ms->ram_size && uses generic ms->ram &&
> >>> preferably on top of
> >>>  "[PATCH 44/86] hppa: use memdev for RAM"
> >>> so it would be easier to drop it if there would opposition to it
> >>> without affecting series.
> >>>  
> >>>>>>> ---
> >>>>>>>   hw/hppa/machine.c | 21 +++++++++++----------
> >>>>>>>   1 file changed, 11 insertions(+), 10 deletions(-)
> >>>>>>>
> >>>>>>> diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
> >>>>>>> index ebbf44f..0302983 100644
> >>>>>>> --- a/hw/hppa/machine.c
> >>>>>>> +++ b/hw/hppa/machine.c
> >>>>>>> @@ -54,6 +54,7 @@ static uint64_t cpu_hppa_to_phys(void *opaque, uint64_t addr)
> >>>>>>>
> >>>>>>>   static HPPACPU *cpu[HPPA_MAX_CPUS];
> >>>>>>>   static uint64_t firmware_entry;
> >>>>>>> +static ram_addr_t clamped_ram_size;
> >>>>>>>
> >>>>>>>   static void machine_hppa_init(MachineState *machine)
> >>>>>>>   {
> >>>>>>> @@ -74,8 +75,6 @@ static void machine_hppa_init(MachineState *machine)
> >>>>>>>       long i;
> >>>>>>>       unsigned int smp_cpus = machine->smp.cpus;
> >>>>>>>
> >>>>>>> -    ram_size = machine->ram_size;
> >>>>>>> -
> >>>>>>>       /* Create CPUs.  */
> >>>>>>>       for (i = 0; i < smp_cpus; i++) {
> >>>>>>>           char *name = g_strdup_printf("cpu%ld-io-eir", i);
> >>>>>>> @@ -90,12 +89,14 @@ static void machine_hppa_init(MachineState *machine)
> >>>>>>>       }
> >>>>>>>
> >>>>>>>       /* Limit main memory. */
> >>>>>>> -    if (ram_size > FIRMWARE_START) {
> >>>>>>> -        error_report("RAM size more than %d is not supported", FIRMWARE_START);
> >>>>>>> +    if (machine->ram_size > 4 * GiB) {
> >>>>>>> +        error_report("RAM size more than 4Gb is not supported");
> >>>>>>>           exit(EXIT_FAILURE);
> >>>>>>>       }
> >>>>>>> +    clamped_ram_size = machine->ram_size > FIRMWARE_START ?
> >>>>>>> +        FIRMWARE_START : machine->ram_size;
> >>>>>>>
> >>>>>>> -    memory_region_add_subregion(addr_space, 0, machine->ram);
> >>>>>>> +    memory_region_add_subregion_overlap(addr_space, 0, machine->ram, -1);
> >>>>>>>
> >>>>>>>       /* Init Dino (PCI host bus chip).  */
> >>>>>>>       pci_bus = dino_init(addr_space, &rtc_irq, &serial_irq);
> >>>>>>> @@ -151,7 +152,7 @@ static void machine_hppa_init(MachineState *machine)
> >>>>>>>       qemu_log_mask(CPU_LOG_PAGE, "Firmware loaded at 0x%08" PRIx64
> >>>>>>>                     "-0x%08" PRIx64 ", entry at 0x%08" PRIx64 ".\n",
> >>>>>>>                     firmware_low, firmware_high, firmware_entry);
> >>>>>>> -    if (firmware_low < ram_size || firmware_high >= FIRMWARE_END) {
> >>>>>>> +    if (firmware_low < clamped_ram_size || firmware_high >= FIRMWARE_END) {
> >>>>>>>           error_report("Firmware overlaps with memory or IO space");
> >>>>>>>           exit(1);
> >>>>>>>       }
> >>>>>>> @@ -204,7 +205,7 @@ static void machine_hppa_init(MachineState *machine)
> >>>>>>>                  (1) Due to sign-extension problems and PDC,
> >>>>>>>                  put the initrd no higher than 1G.
> >>>>>>>                  (2) Reserve 64k for stack.  */
> >>>>>>> -            initrd_base = MIN(ram_size, 1 * GiB);
> >>>>>>> +            initrd_base = MIN(clamped_ram_size, 1 * GiB);
> >>>>>>>               initrd_base = initrd_base - 64 * KiB;
> >>>>>>>               initrd_base = (initrd_base - initrd_size) & TARGET_PAGE_MASK;
> >>>>>>>
> >>>>>>> @@ -232,7 +233,7 @@ static void machine_hppa_init(MachineState *machine)
> >>>>>>>        * various parameters in registers. After firmware initialization,
> >>>>>>>        * firmware will start the Linux kernel with ramdisk and cmdline.
> >>>>>>>        */
> >>>>>>> -    cpu[0]->env.gr[26] = ram_size;
> >>>>>>> +    cpu[0]->env.gr[26] = clamped_ram_size;  
> >>>>
> >>>> Helge, is this the code using this register?
> >>>>
> >>>> https://github.com/hdeller/seabios-hppa/blob/parisc-qemu-5.0/src/parisc/head.S#L139
> >>>>  
> >>>>>>>       cpu[0]->env.gr[25] = kernel_entry;
> >>>>>>>
> >>>>>>>       /* tell firmware how many SMP CPUs to present in inventory table */
> >>>>>>> @@ -255,11 +256,11 @@ static void hppa_machine_reset(MachineState *ms)
> >>>>>>>       }
> >>>>>>>
> >>>>>>>       /* already initialized by machine_hppa_init()? */
> >>>>>>> -    if (cpu[0]->env.gr[26] == ram_size) {
> >>>>>>> +    if (cpu[0]->env.gr[26] == clamped_ram_size) {
> >>>>>>>           return;
> >>>>>>>       }
> >>>>>>>
> >>>>>>> -    cpu[0]->env.gr[26] = ram_size;
> >>>>>>> +    cpu[0]->env.gr[26] = clamped_ram_size;
> >>>>>>>       cpu[0]->env.gr[25] = 0; /* no firmware boot menu */
> >>>>>>>       cpu[0]->env.gr[24] = 'c';
> >>>>>>>       /* gr22/gr23 unused, no initrd while reboot. */
> >>>>>>>  
> >>>>>>  
> >>>>>  
> >>>>  
> >>>  
> >>
> >>  
> >  
> 



^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH v2] hppa: allow max ram size upto 4Gb
  2020-01-07 11:21                       ` Igor Mammedov
@ 2020-01-07 11:53                         ` Helge Deller
  2020-01-07 15:17                           ` Igor Mammedov
  0 siblings, 1 reply; 148+ messages in thread
From: Helge Deller @ 2020-01-07 11:53 UTC (permalink / raw)
  To: Igor Mammedov; +Cc: Sven Schnelle, Philippe Mathieu-Daudé, qemu-devel

On 07.01.20 12:21, Igor Mammedov wrote:
> On Mon, 6 Jan 2020 18:03:49 +0100
>> So, I'd suggest to drop your wrong patch #43.
> As you noted in your first reply, patch is correct.

You probably got me wrong.
Your patch #43 is wrong, and your fixup patch to some degree reverts it back again.

In patch #43 you error out and stop, which real hardware wouldn't do.
Real hardware simply ignores the memory which wouldn't be used.

> All it's doing is validating user input versus RAM size
> actually supported by the current code, telling user> current supported limit and enforcing it.

Real hardware would not tell user.

> I agree it's inconvenience for the users since they
> won't be able to specify non-sense values and still
> get board running, but that's clear user error and
> should be corrected on user side and not by QEMU
> magically masking wrong CLI values.

I disagree.
Everything worked as expected before, but with *your* change now people
might need to modify their CLI.
4GB is a valid amount of memory which can be plugged into
the virtual and physical machine.
It's not magic, it's how the architecture works and you changed it.

> Since it could be fixed on user side, I care less
> about user convenience when it comes to correctness
> and unified code.

IMHO, you should care about that the emulation works the same
way as physical machine. Not, how you want to educate end users.

>> If you don't want to drop it, my suggestion for a commit message is:
>>
>> hppa: Revert last wrong patch and give warning if user specified > 4GB RAM
>
> I have to disagree on definition of wrong here,
> in my opinion covering up user errors is wrong especially
> when all users have to do is to adapt their CLI.

See above. Nobody ever needs to adapt anything unless your patches gets applied.

Helge


^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH v2] hppa: allow max ram size upto 4Gb
  2020-01-07 11:53                         ` Helge Deller
@ 2020-01-07 15:17                           ` Igor Mammedov
  0 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2020-01-07 15:17 UTC (permalink / raw)
  To: Helge Deller; +Cc: Sven Schnelle, Philippe Mathieu-Daudé, qemu-devel

On Tue, 7 Jan 2020 12:53:32 +0100
Helge Deller <deller@gmx.de> wrote:

Even though I disagree and it would waste ~256Mb 4Gb of RAM,
I think I should be able to replace #43 with
  "hppa: allow max ram size upto 4Gb"
as it still removes fix up at mapped address space level,
removes fix up of global ram_size variable and adds max size check,

which lets hppa board get out of the way of re-factoring
generic RAM allocation and making what board does with
provided RAM its own business.

> On 07.01.20 12:21, Igor Mammedov wrote:
> > On Mon, 6 Jan 2020 18:03:49 +0100  
> >> So, I'd suggest to drop your wrong patch #43.  
> > As you noted in your first reply, patch is correct.  
> 
> You probably got me wrong.
whichever way I read it
https://www.mail-archive.com/qemu-devel@nongnu.org/msg667855.html
states user convenience as a reason.

> Your patch #43 is wrong, and your fixup patch to some degree reverts it back again.
>
> 
> In patch #43 you error out and stop, which real hardware wouldn't do.
> Real hardware simply ignores the memory which wouldn't be used.
> > All it's doing is validating user input versus RAM size
> > actually supported by the current code, telling user> current supported limit and enforcing it.  
> 
> Real hardware would not tell user.
>
> > I agree it's inconvenience for the users since they
> > won't be able to specify non-sense values and still
> > get board running, but that's clear user error and
> > should be corrected on user side and not by QEMU
> > magically masking wrong CLI values.  
> 
> I disagree.
> Everything worked as expected before, but with *your* change now people
> might need to modify their CLI.
> 4GB is a valid amount of memory which can be plugged into
> the virtual and physical machine.
> It's not magic, it's how the architecture works and you changed it.
>
> > Since it could be fixed on user side, I care less
> > about user convenience when it comes to correctness
> > and unified code.  
> 
> IMHO, you should care about that the emulation works the same
> way as physical machine. 

As for correctness wrt real hardware questions are:
 * is one able to stuff hardware with unsupported 4Gb or more DIMMs,
   will system even work?
 * what real hardware does with top 256Gb of 4Gb RAM if present?
   Is it addressable/accessible in some way by CPUs or devices?
 * how does real firmware discovers amount of installed RAM

[...]



^ permalink raw reply	[flat|nested] 148+ messages in thread

* [PATCH v3 43/86] hppa: allow max ram size upto 4Gb
  2019-12-31 13:03 ` [PATCH 43/86] hppa: drop RAM size fixup Igor Mammedov
  2019-12-31 15:44   ` Philippe Mathieu-Daudé
  2020-01-02 17:08   ` [PATCH] hppa: allow max ram size upto 4Gb Igor Mammedov
@ 2020-01-07 15:34   ` Igor Mammedov
  2 siblings, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2020-01-07 15:34 UTC (permalink / raw)
  To: qemu-devel; +Cc: svens, deller, philmd

Real hardware allows to plug in up to 4Gb RAM into memory slots.
So allow user specify up to 4Gb and map all of it into guest
address space.

PS:
  * guest will still see 3840m being reported in
    cpu[0]->env.gr[26] and won't be avare of remaining
    ~248Mb, as it doesn't have other means to discover
    RAM above firmware ROM.
  * use local ram_size to avoid changing global one
    which shouldn't be changed boards and will be removed
    in the future

Requested-by: Helge Deller <deller@gmx.de>
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
v2:
  - make main ram -1 prio, so it wouldn't conflict with other regions
    starting from 0xf9000000
    (Philippe Mathieu-Daudé <philmd@redhat.com>)
  - avoid type size comparision error on migw32 host with ram_addr_t
  - simplify code a bit using local ram_size var.
  - rewrite commit message
v3:
  - drop "hppa: drop RAM size fixup"
  - rewrite commit message
  - use 64-bit local ram_size to workaround always false
    condition "if (ram_size > 4 * GiB)" when building on
    32-bit host (mingw-32) as it's preffered over ifdefs.
---
 hw/hppa/machine.c | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
index 5d0de26..d63b61e 100644
--- a/hw/hppa/machine.c
+++ b/hw/hppa/machine.c
@@ -73,10 +73,9 @@ static void machine_hppa_init(MachineState *machine)
     MemoryRegion *ram_region;
     MemoryRegion *cpu_region;
     long i;
+    uint64_t ram_size = machine->ram_size;
     unsigned int smp_cpus = machine->smp.cpus;
 
-    ram_size = machine->ram_size;
-
     /* Create CPUs.  */
     for (i = 0; i < smp_cpus; i++) {
         char *name = g_strdup_printf("cpu%ld-io-eir", i);
@@ -91,15 +90,17 @@ static void machine_hppa_init(MachineState *machine)
     }
 
     /* Limit main memory. */
-    if (ram_size > FIRMWARE_START) {
-        machine->ram_size = ram_size = FIRMWARE_START;
+    if (ram_size > 4 * GiB) {
+        error_report("RAM size more than 4Gb is not supported");
+        exit(EXIT_FAILURE);
     }
+    ram_size = ram_size > FIRMWARE_START ? FIRMWARE_START : ram_size;
 
     /* Main memory region. */
     ram_region = g_new(MemoryRegion, 1);
     memory_region_allocate_system_memory(ram_region, OBJECT(machine),
                                          "ram", ram_size);
-    memory_region_add_subregion(addr_space, 0, ram_region);
+    memory_region_add_subregion_overlap(addr_space, 0, ram_region, -1);
 
     /* Init Dino (PCI host bus chip).  */
     pci_bus = dino_init(addr_space, &rtc_irq, &serial_irq);
@@ -246,6 +247,8 @@ static void machine_hppa_init(MachineState *machine)
 static void hppa_machine_reset(MachineState *ms)
 {
     unsigned int smp_cpus = ms->smp.cpus;
+    uint64_t ram_size = ms->ram_size > FIRMWARE_START ? FIRMWARE_START :
+                                                        ms->ram_size;
     int i;
 
     qemu_devices_reset();
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 148+ messages in thread

* Re: [PATCH 49/86] m68k:an5206: use memdev for RAM
  2019-12-31 13:03 ` [PATCH 49/86] m68k:an5206: " Igor Mammedov
@ 2020-01-07 16:11   ` Thomas Huth
  0 siblings, 0 replies; 148+ messages in thread
From: Thomas Huth @ 2020-01-07 16:11 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel

On 31/12/2019 14.03, Igor Mammedov wrote:
> memory_region_allocate_system_memory() API is going away, so
> replace it with memdev allocated MemoryRegion. The later is
> initialized by generic code, so board only needs to opt in
> to memdev scheme by providing
>   MachineClass::default_ram_id
> and using MachineState::ram instead of manually initializing
> RAM memory region.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
>  hw/m68k/an5206.c | 5 ++---
>  1 file changed, 2 insertions(+), 3 deletions(-)
> 
> diff --git a/hw/m68k/an5206.c b/hw/m68k/an5206.c
> index 54ccbe1..69a8ffa 100644
> --- a/hw/m68k/an5206.c
> +++ b/hw/m68k/an5206.c
> @@ -33,7 +33,6 @@ static void an5206_init(MachineState *machine)
>      uint64_t elf_entry;
>      hwaddr entry;
>      MemoryRegion *address_space_mem = get_system_memory();
> -    MemoryRegion *ram = g_new(MemoryRegion, 1);
>      MemoryRegion *sram = g_new(MemoryRegion, 1);
>  
>      cpu = M68K_CPU(cpu_create(machine->cpu_type));
> @@ -46,8 +45,7 @@ static void an5206_init(MachineState *machine)
>      env->rambar0 = AN5206_RAMBAR_ADDR | 1;
>  
>      /* DRAM at address zero */
> -    memory_region_allocate_system_memory(ram, NULL, "an5206.ram", ram_size);
> -    memory_region_add_subregion(address_space_mem, 0, ram);
> +    memory_region_add_subregion(address_space_mem, 0, machine->ram);
>  
>      /* Internal SRAM.  */
>      memory_region_init_ram(sram, NULL, "an5206.sram", 512, &error_fatal);
> @@ -89,6 +87,7 @@ static void an5206_machine_init(MachineClass *mc)
>      mc->desc = "Arnewsh 5206";
>      mc->init = an5206_init;
>      mc->default_cpu_type = M68K_CPU_TYPE_NAME("m5206");
> +    mc->default_ram_id = "an5206.ram";
>  }
>  
>  DEFINE_MACHINE("an5206", an5206_machine_init)
> 

Acked-by: Thomas Huth <thuth@redhat.com>



^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH 50/86] m68k:mcf5208: use memdev for RAM
  2019-12-31 13:03 ` [PATCH 50/86] m68k:mcf5208: " Igor Mammedov
@ 2020-01-07 16:11   ` Thomas Huth
  0 siblings, 0 replies; 148+ messages in thread
From: Thomas Huth @ 2020-01-07 16:11 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel

On 31/12/2019 14.03, Igor Mammedov wrote:
> memory_region_allocate_system_memory() API is going away, so
> replace it with memdev allocated MemoryRegion. The later is
> initialized by generic code, so board only needs to opt in
> to memdev scheme by providing
>   MachineClass::default_ram_id
> and using MachineState::ram instead of manually initializing
> RAM memory region.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
>  hw/m68k/mcf5208.c | 5 ++---
>  1 file changed, 2 insertions(+), 3 deletions(-)
> 
> diff --git a/hw/m68k/mcf5208.c b/hw/m68k/mcf5208.c
> index 158c5e4..d050cb7 100644
> --- a/hw/m68k/mcf5208.c
> +++ b/hw/m68k/mcf5208.c
> @@ -234,7 +234,6 @@ static void mcf5208evb_init(MachineState *machine)
>      qemu_irq *pic;
>      MemoryRegion *address_space_mem = get_system_memory();
>      MemoryRegion *rom = g_new(MemoryRegion, 1);
> -    MemoryRegion *ram = g_new(MemoryRegion, 1);
>      MemoryRegion *sram = g_new(MemoryRegion, 1);
>  
>      cpu = M68K_CPU(cpu_create(machine->cpu_type));
> @@ -249,8 +248,7 @@ static void mcf5208evb_init(MachineState *machine)
>      memory_region_add_subregion(address_space_mem, 0x00000000, rom);
>  
>      /* DRAM at 0x40000000 */
> -    memory_region_allocate_system_memory(ram, NULL, "mcf5208.ram", ram_size);
> -    memory_region_add_subregion(address_space_mem, 0x40000000, ram);
> +    memory_region_add_subregion(address_space_mem, 0x40000000, machine->ram);
>  
>      /* Internal SRAM.  */
>      memory_region_init_ram(sram, NULL, "mcf5208.sram", 16 * KiB, &error_fatal);
> @@ -354,6 +352,7 @@ static void mcf5208evb_machine_init(MachineClass *mc)
>      mc->init = mcf5208evb_init;
>      mc->is_default = 1;
>      mc->default_cpu_type = M68K_CPU_TYPE_NAME("m5208");
> +    mc->default_ram_id = "mcf5208.ram";
>  }
>  
>  DEFINE_MACHINE("mcf5208evb", mcf5208evb_machine_init)
> 

Acked-by: Thomas Huth <thuth@redhat.com>



^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH 51/86] m68k:next-cube: use memdev for RAM
  2019-12-31 13:03 ` [PATCH 51/86] m68k:next-cube: " Igor Mammedov
@ 2020-01-07 16:12   ` Thomas Huth
  0 siblings, 0 replies; 148+ messages in thread
From: Thomas Huth @ 2020-01-07 16:12 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel

On 31/12/2019 14.03, Igor Mammedov wrote:
> memory_region_allocate_system_memory() API is going away, so
> replace it with memdev allocated MemoryRegion. The later is
> initialized by generic code, so board only needs to opt in
> to memdev scheme by providing
>   MachineClass::default_ram_id
> and using MachineState::ram instead of manually initializing
> RAM memory region.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
>  hw/m68k/next-cube.c | 5 ++---
>  1 file changed, 2 insertions(+), 3 deletions(-)
> 
> diff --git a/hw/m68k/next-cube.c b/hw/m68k/next-cube.c
> index e534334..cd93d9e 100644
> --- a/hw/m68k/next-cube.c
> +++ b/hw/m68k/next-cube.c
> @@ -860,7 +860,6 @@ static void next_cube_init(MachineState *machine)
>  {
>      M68kCPU *cpu;
>      CPUM68KState *env;
> -    MemoryRegion *ram = g_new(MemoryRegion, 1);
>      MemoryRegion *rom = g_new(MemoryRegion, 1);
>      MemoryRegion *mmiomem = g_new(MemoryRegion, 1);
>      MemoryRegion *scrmem = g_new(MemoryRegion, 1);
> @@ -893,8 +892,7 @@ static void next_cube_init(MachineState *machine)
>      memcpy(ns->rtc.ram, rtc_ram2, 32);
>  
>      /* 64MB RAM starting at 0x04000000  */
> -    memory_region_allocate_system_memory(ram, NULL, "next.ram", ram_size);
> -    memory_region_add_subregion(sysmem, 0x04000000, ram);
> +    memory_region_add_subregion(sysmem, 0x04000000, machine->ram);
>  
>      /* Framebuffer */
>      dev = qdev_create(NULL, TYPE_NEXTFB);
> @@ -967,6 +965,7 @@ static void next_machine_class_init(ObjectClass *oc, void *data)
>      mc->desc = "NeXT Cube";
>      mc->init = next_cube_init;
>      mc->default_ram_size = RAM_SIZE;
> +    mc->default_ram_id = "next.ram";
>      mc->default_cpu_type = M68K_CPU_TYPE_NAME("m68040");
>  }
>  
> 

Acked-by: Thomas Huth <thuth@redhat.com>



^ permalink raw reply	[flat|nested] 148+ messages in thread

* Re: [PATCH 66/86] ppc:ppc440_bamboo/sam460ex: drop RAM size fixup
  2020-01-02 15:52       ` BALATON Zoltan
  2020-01-02 17:19         ` Igor Mammedov
@ 2020-01-10 17:14         ` Igor Mammedov
  1 sibling, 0 replies; 148+ messages in thread
From: Igor Mammedov @ 2020-01-10 17:14 UTC (permalink / raw)
  To: BALATON Zoltan; +Cc: qemu-devel

On Thu, 2 Jan 2020 16:52:50 +0100 (CET)
BALATON Zoltan <balaton@eik.bme.hu> wrote:

> On Thu, 2 Jan 2020, Igor Mammedov wrote:
> > On Wed, 1 Jan 2020 12:54:37 +0100 (CET)
> > BALATON Zoltan <balaton@eik.bme.hu> wrote:  
> >> On Tue, 31 Dec 2019, Igor Mammedov wrote:  
> >>> If user provided non-sense RAM size, board will complain and
> >>> continue running with max RAM size supported.
> >>> Also RAM is going to be allocated by generic code, so it won't be
> >>> possible for board to fix things up for user.
> >>>
> >>> Make it error message and exit to force user fix CLI,
> >>> instead of accepting non-sense CLI values.
> >>>
> >>> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> >>> ---
> >>> include/hw/ppc/ppc4xx.h |  9 ++++-----
> >>> hw/ppc/ppc440_bamboo.c  | 11 ++++-------
> >>> hw/ppc/ppc4xx_devs.c    | 26 ++++++++++++++++----------
> >>> hw/ppc/sam460ex.c       |  5 ++---
> >>> 4 files changed, 26 insertions(+), 25 deletions(-)
> >>>
> >>> diff --git a/include/hw/ppc/ppc4xx.h b/include/hw/ppc/ppc4xx.h
> >>> index 7d82259..1a28127 100644
> >>> --- a/include/hw/ppc/ppc4xx.h
> >>> +++ b/include/hw/ppc/ppc4xx.h
> >>> @@ -42,11 +42,10 @@ enum {
> >>> qemu_irq *ppcuic_init (CPUPPCState *env, qemu_irq *irqs,
> >>>                        uint32_t dcr_base, int has_ssr, int has_vr);
> >>>
> >>> -ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
> >>> -                               MemoryRegion ram_memories[],
> >>> -                               hwaddr ram_bases[],
> >>> -                               hwaddr ram_sizes[],
> >>> -                               const ram_addr_t sdram_bank_sizes[]);
> >>> +void ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
> >>> +                         MemoryRegion ram_memories[],
> >>> +                         hwaddr ram_bases[], hwaddr ram_sizes[],
> >>> +                         const ram_addr_t sdram_bank_sizes[]);  
> >>
> >> With this change this function does not adjust ram size any more so it may
> >> need to be renamed, e.g. ppc4xx_sdram_banks or something else.
> >>
> >> A better patch title may be
> >>
> >> ppc/{ppc440_bamboo,sam460x}: drop RAM size fixup
> >>
> >> (or without curly braces at your preference).  
> > I'll rename and use this subj as you suggest on v2.
> >  
> >> This is inconvenient for the user because it worked whatever number
> >> they've given but now they have to do the math. So it suggests that what
> >> you're replacing this with may not support all the existing use cases. If
> >> that can't be fixed to allow checking and changing ram size (maybe via a
> >> callback in board code similar to above adjust function returning adjusted
> >> size) it may be OK to drop this convenience for the sake of cleaning up
> >> code elsewhere.  
> >
> > There were few boards that did fix up and in all cases it was to cover up
> > invalid CLI input.
> > Creating callback for fixing user mistake doesn't seems to me justified,
> > I'd much prefer to have a hard error and consistent behavior across all
> > the boards versus being lax on error checking.
> >
> > [...]
> >
> >  
> >>> @@ -699,10 +698,19 @@ ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
> >>>         }
> >>>     }
> >>>
> >>> -    ram_size -= size_left;
> >>>     if (size_left) {
> >>> -        error_report("Truncating memory to %" PRId64 " MiB to fit SDRAM"
> >>> -                     " controller limits", ram_size / MiB);
> >>> +        char *s = g_strdup("");
> >>> +        for (i = 0; sdram_bank_sizes[i]; i++) {
> >>> +            char *t = g_strdup_printf("%s%" PRIi64 "%s", s, sdram_bank_sizes[i],
> >>> +                                      sdram_bank_sizes[i + 1] ? " ," : "");
> >>> +            g_free(s);
> >>> +            s = t;
> >>> +        }
> >>> +        error_report("Invalid RAM size, unable to fit all RAM into RAM banks"
> >>> +                     " (unassigned RAM: %" PRIi64 ")",  size_left);
> >>> +        error_report("Supported: %d banks and sizes/bank: %s", nr_banks, s);  
> >
> > Do you have any suggestions how to make error message better?
> > (maybe do calculation here and dump all valid -m variants instead of "#bank,size/bank")  
> 
> Listing the valid values would certainly help users who don't know what 
> the constraints of the SoC or SPD ROMs are (which I think most users don't 
> have a clue about and we should not expect them to know).
I gave it a shot, in case of bamboo board it ends up with huge ~80 entries list,

Perhaps it might be better to avoid combinatorial explosion and keep managable

       error_report("Supported: %d banks and sizes/bank: %s", nr_banks, s);
       error_report("Invalid RAM size, unable to fit all RAM into RAM banks"
                    " (unassigned RAM: %" PRIi64 ")",  size_left);

   maybe also print relative to user provided value, nearest valid "above" and "below" sizes,
   instead of remainder.


[...]
> 
> Regards,
> BALATON Zoltan
> 



^ permalink raw reply	[flat|nested] 148+ messages in thread

end of thread, other threads:[~2020-01-10 17:16 UTC | newest]

Thread overview: 148+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-12-31 13:02 [PATCH 00/86] refactor main RAM allocation to use hostmem backend Igor Mammedov
2019-12-31 13:02 ` [PATCH 01/86] numa: remove not needed check Igor Mammedov
2019-12-31 13:02 ` [PATCH 02/86] numa: properly check if numa is supported Igor Mammedov
2019-12-31 13:02 ` [PATCH 03/86] numa: remove deprecated -mem-path fallback to anonymous RAM Igor Mammedov
2019-12-31 13:02 ` [PATCH 04/86] machine: introduce ram-memdev property Igor Mammedov
2019-12-31 13:02 ` [PATCH 05/86] machine: alias -mem-path and -mem-prealloc into memory-foo backend Igor Mammedov
2019-12-31 13:02 ` [PATCH 06/86] machine: introduce convenience MachineState::ram Igor Mammedov
2019-12-31 13:02 ` [PATCH 07/86] initialize MachineState::ram in NUMA case Igor Mammedov
2019-12-31 13:02 ` [PATCH 08/86] alpha:dp264: use memdev for RAM Igor Mammedov
2019-12-31 16:11   ` Philippe Mathieu-Daudé
2020-01-06  0:37   ` Richard Henderson
2019-12-31 13:02 ` [PATCH 09/86] arm:aspeed: convert valid RAM sizes to data Igor Mammedov
2019-12-31 13:02 ` [PATCH 10/86] arm:aspeed: actually check RAM size Igor Mammedov
2019-12-31 13:02 ` [PATCH 11/86] hw:aspeed: drop warning and bogus ram_size fixup Igor Mammedov
2019-12-31 13:02 ` [PATCH 12/86] arm:aspeed: use memdev for RAM Igor Mammedov
2019-12-31 13:02 ` [PATCH 13/86] arm:collie: " Igor Mammedov
2019-12-31 13:02 ` [PATCH 14/86] arm:cubieboard: " Igor Mammedov
2019-12-31 13:02 ` [PATCH 15/86] arm:digic_boards: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 16/86] arm:highbank: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 17/86] arm:imx25_pdk: drop RAM size fixup Igor Mammedov
2019-12-31 13:03 ` [PATCH 18/86] arm:imx25_pdk: use memdev for RAM Igor Mammedov
2019-12-31 13:03 ` [PATCH 19/86] arm:integratorcp: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 20/86] arm:kzm: drop RAM size fixup Igor Mammedov
2019-12-31 13:03 ` [PATCH 21/86] arm:kzm: use memdev for RAM Igor Mammedov
2019-12-31 16:10   ` Philippe Mathieu-Daudé
2019-12-31 13:03 ` [PATCH 22/86] arm:mcimx6ul-evk: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 23/86] arm:mcimx7d-sabre: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 24/86] arm:mps2-tz: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 25/86] arm:mps2: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 26/86] arm:musicpal: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 27/86] arm:nseries: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 28/86] arm:omap_sx1: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 29/86] arm:palm: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 30/86] arm:raspi: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 31/86] arm:sabrelite: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 32/86] arm:sbsa-ref: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 33/86] arm:versatilepb: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 34/86] arm:vexpress: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 35/86] arm:virt: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 36/86] arm:xilinx_zynq: drop RAM size fixup Igor Mammedov
2019-12-31 13:03 ` [PATCH 37/86] arm:xilinx_zynq: use memdev for RAM Igor Mammedov
2019-12-31 13:03 ` [PATCH 38/86] arm:xlnx-versal-virt: " Igor Mammedov
2019-12-31 16:05   ` Philippe Mathieu-Daudé
2019-12-31 13:03 ` [PATCH 39/86] arm:xlnx-zcu102: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 40/86] s390x:s390-virtio-ccw: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 41/86] null-machine: " Igor Mammedov
2019-12-31 15:32   ` Philippe Mathieu-Daudé
2019-12-31 13:03 ` [PATCH 42/86] cris:axis_dev88: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 43/86] hppa: drop RAM size fixup Igor Mammedov
2019-12-31 15:44   ` Philippe Mathieu-Daudé
2020-01-02 11:31     ` Helge Deller
2020-01-02 12:06       ` Philippe Mathieu-Daudé
2020-01-02 13:02         ` Helge Deller
2020-01-02 14:47           ` Igor Mammedov
2020-01-02 14:12         ` Igor Mammedov
2020-01-02 14:17           ` Philippe Mathieu-Daudé
2020-01-02 15:08             ` Igor Mammedov
2020-01-02 15:49               ` Philippe Mathieu-Daudé
2020-01-02 16:50                 ` Igor Mammedov
2020-01-02 17:14                   ` Philippe Mathieu-Daudé
2020-01-02 17:32                     ` Igor Mammedov
2020-01-02 20:09                 ` Helge Deller
2020-01-02 14:41       ` Igor Mammedov
2020-01-02 14:45         ` Philippe Mathieu-Daudé
2020-01-02 15:35           ` Igor Mammedov
2020-01-02 15:40             ` Philippe Mathieu-Daudé
2020-01-02 17:08   ` [PATCH] hppa: allow max ram size upto 4Gb Igor Mammedov
2020-01-02 17:15     ` Philippe Mathieu-Daudé
2020-01-02 17:36       ` Igor Mammedov
2020-01-02 17:46       ` [PATCH v2] " Igor Mammedov
2020-01-02 20:22         ` Helge Deller
2020-01-03  9:54           ` Igor Mammedov
2020-01-04 15:00             ` Philippe Mathieu-Daudé
2020-01-06 10:48               ` Igor Mammedov
2020-01-06 11:05                 ` Philippe Mathieu-Daudé
2020-01-06 11:28                 ` Helge Deller
2020-01-06 16:24                   ` Igor Mammedov
2020-01-06 17:03                     ` Helge Deller
2020-01-07 11:21                       ` Igor Mammedov
2020-01-07 11:53                         ` Helge Deller
2020-01-07 15:17                           ` Igor Mammedov
2020-01-07 15:34   ` [PATCH v3 43/86] " Igor Mammedov
2019-12-31 13:03 ` [PATCH 44/86] hppa: use memdev for RAM Igor Mammedov
2019-12-31 15:45   ` Philippe Mathieu-Daudé
2019-12-31 13:03 ` [PATCH 45/86] x86:microvm: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 46/86] x86:pc: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 47/86] lm32:lm32_boards: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 48/86] lm32:milkymist: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 49/86] m68k:an5206: " Igor Mammedov
2020-01-07 16:11   ` Thomas Huth
2019-12-31 13:03 ` [PATCH 50/86] m68k:mcf5208: " Igor Mammedov
2020-01-07 16:11   ` Thomas Huth
2019-12-31 13:03 ` [PATCH 51/86] m68k:next-cube: " Igor Mammedov
2020-01-07 16:12   ` Thomas Huth
2019-12-31 13:03 ` [PATCH 52/86] mips:boston-cube: " Igor Mammedov
2019-12-31 16:08   ` Philippe Mathieu-Daudé
2019-12-31 13:03 ` [PATCH 53/86] mips:mips_fulong2e: drop RAM size fixup Igor Mammedov
2019-12-31 13:03 ` [PATCH 54/86] mips:mips_fulong2e: use memdev for RAM Igor Mammedov
2019-12-31 13:03 ` [PATCH 55/86] mips:mips_jazz: " Igor Mammedov
2019-12-31 16:06   ` Philippe Mathieu-Daudé
2019-12-31 13:03 ` [PATCH 56/86] mips:mips_malta: " Igor Mammedov
2019-12-31 16:07   ` Philippe Mathieu-Daudé
2019-12-31 13:03 ` [PATCH 57/86] mips:mips_mipssim: " Igor Mammedov
2019-12-31 16:07   ` Philippe Mathieu-Daudé
2019-12-31 13:03 ` [PATCH 58/86] mips:mips_r4k: " Igor Mammedov
2019-12-31 16:08   ` Philippe Mathieu-Daudé
2019-12-31 13:03 ` [PATCH 59/86] ppc:e500: drop RAM size fixup Igor Mammedov
2019-12-31 13:03 ` [PATCH 60/86] ppc:e500: use memdev for RAM Igor Mammedov
2019-12-31 13:03 ` [PATCH 61/86] ppc:mac_newworld: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 62/86] ppc:mac_oldworld: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 63/86] ppc:pnv: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 64/86] ppc:ppc405_boards: add RAM size checks Igor Mammedov
2019-12-31 13:03 ` [PATCH 65/86] ppc:ppc405_boards: use memdev for RAM Igor Mammedov
2019-12-31 13:03 ` [PATCH 66/86] ppc:ppc440_bamboo/sam460ex: drop RAM size fixup Igor Mammedov
2020-01-01 11:54   ` BALATON Zoltan
2020-01-01 15:39     ` Philippe Mathieu-Daudé
2020-01-01 18:45       ` BALATON Zoltan
2020-01-02 11:47     ` Igor Mammedov
2020-01-02 15:52       ` BALATON Zoltan
2020-01-02 17:19         ` Igor Mammedov
2020-01-10 17:14         ` Igor Mammedov
2019-12-31 13:03 ` [PATCH 67/86] ppc:ppc440_bamboo/sam460ex: use memdev for RAM Igor Mammedov
2019-12-31 13:03 ` [PATCH 68/86] ppc:prep: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 69/86] ppc:spapr: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 70/86] ppc:virtex_ml507: remove unused arguments Igor Mammedov
2019-12-31 13:03 ` [PATCH 71/86] ppc:virtex_ml507: use memdev for RAM Igor Mammedov
2019-12-31 13:03 ` [PATCH 72/86] sparc:leon3: " Igor Mammedov
2019-12-31 16:02   ` Philippe Mathieu-Daudé
2019-12-31 13:03 ` [PATCH 73/86] sparc:sun4m: " Igor Mammedov
2019-12-31 13:03 ` [PATCH 74/86] sparc:niagara: " Igor Mammedov
2019-12-31 16:02   ` Philippe Mathieu-Daudé
2019-12-31 13:03 ` [PATCH 75/86] remove no longer used memory_region_allocate_system_memory() Igor Mammedov
2019-12-31 13:04 ` [PATCH 76/86] post conversion default_ram_id cleanup Igor Mammedov
2019-12-31 16:04   ` Philippe Mathieu-Daudé
2019-12-31 13:04 ` [PATCH 77/86] exec: cleanup qemu_minrampagesize()/qemu_maxrampagesize() Igor Mammedov
2019-12-31 13:04 ` [PATCH 78/86] exec: drop bogus mem_path from qemu_ram_alloc_from_fd() Igor Mammedov
2019-12-31 13:04 ` [PATCH 79/86] make mem_path local variable Igor Mammedov
2019-12-31 13:04 ` [PATCH 80/86] hostmem: introduce "prealloc-threads" property Igor Mammedov
2019-12-31 13:04 ` [PATCH 81/86] hostmem: fix strict bind policy Igor Mammedov
2019-12-31 13:04 ` [PATCH 82/86] numa: forbid '-numa node, mem' for 5.0 and newer machine types Igor Mammedov
2019-12-31 13:04 ` [PATCH 83/86] tests:numa-test: make top level args dynamic and g_autofree(cli) cleanups Igor Mammedov
2019-12-31 13:04 ` [PATCH 84/86] tests:numa-test: use explicit memdev to specify node RAM Igor Mammedov
2019-12-31 13:04 ` [PATCH 85/86] numa: make exit() usage consistent Igor Mammedov
2019-12-31 13:04 ` [PATCH 86/86] numa: remove deprecated implicit RAM distribution between nodes Igor Mammedov
2019-12-31 15:58 ` [PATCH 00/86] refactor main RAM allocation to use hostmem backend Philippe Mathieu-Daudé
2019-12-31 16:22   ` Igor Mammedov
2020-01-03 13:06   ` Igor Mammedov
2020-01-03 13:15     ` Philippe Mathieu-Daudé

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.