From: Helge Deller <deller@gmx.de>
The physical hardware allows DIMMs of 4 MB size and above, allowing up
to 3840 MB of memory, but is restricted by setup code to 3 GB.
Increase the limit to allow up to the maximum amount of memory.
Btw. the memory area from 0xf000.0000 to 0xffff.ffff is reserved by
the architecture for firmware and I/O memory and can not be used for
standard memory.
Signed-off-by: Helge Deller <deller@gmx.de>
Noticed-by: Nelson H. F. Beebe <beebe@math.utah.edu>
Fixes: b7746b1194c8 ("hw/hppa/machine: Restrict the total memory size to 3GB")
---
hw/hppa/machine.c | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
index c8da7c18d5..6181f4b747 100644
--- a/hw/hppa/machine.c
+++ b/hw/hppa/machine.c
@@ -276,6 +276,7 @@ static TranslateFn *machine_HP_common_init_cpus(MachineState *machine)
unsigned int smp_cpus = machine->smp.cpus;
TranslateFn *translate;
MemoryRegion *cpu_region;
+ ram_addr_t ram_max;
/* Create CPUs. */
for (unsigned int i = 0; i < smp_cpus; i++) {
@@ -288,8 +289,10 @@ static TranslateFn *machine_HP_common_init_cpus(MachineState *machine)
*/
if (hppa_is_pa20(&cpu[0]->env)) {
translate = translate_pa20;
+ ram_max = 0xf0000000; /* 3.75 GB (limited by 32-bit firmware) */
} else {
translate = translate_pa10;
+ ram_max = 0xf0000000; /* 3.75 GB (32-bit CPU) */
}
for (unsigned int i = 0; i < smp_cpus; i++) {
@@ -311,9 +314,9 @@ static TranslateFn *machine_HP_common_init_cpus(MachineState *machine)
cpu_region);
/* Main memory region. */
- if (machine->ram_size > 3 * GiB) {
- error_report("RAM size is currently restricted to 3GB");
- exit(EXIT_FAILURE);
+ if (machine->ram_size > ram_max) {
+ info_report("Max RAM size limited to %ld MB", ram_max / MiB);
+ machine->ram_size = ram_max;
}
memory_region_add_subregion_overlap(addr_space, 0, machine->ram, -1);
--
2.43.0
On 1/4/24 19:36, deller@kernel.org wrote: > From: Helge Deller <deller@gmx.de> > > The physical hardware allows DIMMs of 4 MB size and above, allowing up > to 3840 MB of memory, but is restricted by setup code to 3 GB. > Increase the limit to allow up to the maximum amount of memory. > > Btw. the memory area from 0xf000.0000 to 0xffff.ffff is reserved by > the architecture for firmware and I/O memory and can not be used for > standard memory. > > Signed-off-by: Helge Deller <deller@gmx.de> > Noticed-by: Nelson H. F. Beebe <beebe@math.utah.edu> > Fixes: b7746b1194c8 ("hw/hppa/machine: Restrict the total memory size to 3GB") > --- > hw/hppa/machine.c | 9 ++++++--- > 1 file changed, 6 insertions(+), 3 deletions(-) > > diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c > index c8da7c18d5..6181f4b747 100644 > --- a/hw/hppa/machine.c > +++ b/hw/hppa/machine.c > @@ -276,6 +276,7 @@ static TranslateFn *machine_HP_common_init_cpus(MachineState *machine) > unsigned int smp_cpus = machine->smp.cpus; > TranslateFn *translate; > MemoryRegion *cpu_region; > + ram_addr_t ram_max; > > /* Create CPUs. */ > for (unsigned int i = 0; i < smp_cpus; i++) { > @@ -288,8 +289,10 @@ static TranslateFn *machine_HP_common_init_cpus(MachineState *machine) > */ > if (hppa_is_pa20(&cpu[0]->env)) { > translate = translate_pa20; > + ram_max = 0xf0000000; /* 3.75 GB (limited by 32-bit firmware) */ > } else { > translate = translate_pa10; > + ram_max = 0xf0000000; /* 3.75 GB (32-bit CPU) */ > } > > for (unsigned int i = 0; i < smp_cpus; i++) { > @@ -311,9 +314,9 @@ static TranslateFn *machine_HP_common_init_cpus(MachineState *machine) > cpu_region); > > /* Main memory region. */ > - if (machine->ram_size > 3 * GiB) { > - error_report("RAM size is currently restricted to 3GB"); > - exit(EXIT_FAILURE); > + if (machine->ram_size > ram_max) { > + info_report("Max RAM size limited to %ld MB", ram_max / MiB); Need to use RAM_ADDR_FMT instead of "%ld" here. Will fix in v2. Helge > + machine->ram_size = ram_max; > } > memory_region_add_subregion_overlap(addr_space, 0, machine->ram, -1); >
On Thu, 4 Jan 2024, deller@kernel.org wrote: > From: Helge Deller <deller@gmx.de> > > The physical hardware allows DIMMs of 4 MB size and above, allowing up > to 3840 MB of memory, but is restricted by setup code to 3 GB. > Increase the limit to allow up to the maximum amount of memory. > > Btw. the memory area from 0xf000.0000 to 0xffff.ffff is reserved by > the architecture for firmware and I/O memory and can not be used for > standard memory. > > Signed-off-by: Helge Deller <deller@gmx.de> > Noticed-by: Nelson H. F. Beebe <beebe@math.utah.edu> > Fixes: b7746b1194c8 ("hw/hppa/machine: Restrict the total memory size to 3GB") > --- > hw/hppa/machine.c | 9 ++++++--- > 1 file changed, 6 insertions(+), 3 deletions(-) > > diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c > index c8da7c18d5..6181f4b747 100644 > --- a/hw/hppa/machine.c > +++ b/hw/hppa/machine.c > @@ -276,6 +276,7 @@ static TranslateFn *machine_HP_common_init_cpus(MachineState *machine) > unsigned int smp_cpus = machine->smp.cpus; > TranslateFn *translate; > MemoryRegion *cpu_region; > + ram_addr_t ram_max; > > /* Create CPUs. */ > for (unsigned int i = 0; i < smp_cpus; i++) { > @@ -288,8 +289,10 @@ static TranslateFn *machine_HP_common_init_cpus(MachineState *machine) > */ > if (hppa_is_pa20(&cpu[0]->env)) { > translate = translate_pa20; > + ram_max = 0xf0000000; /* 3.75 GB (limited by 32-bit firmware) */ > } else { > translate = translate_pa10; > + ram_max = 0xf0000000; /* 3.75 GB (32-bit CPU) */ If the value is the same what's the point of setting it here and not once above at definition? It is's only the different comment then you could have a comment saying "3.75 GB, limited by 32-bit firmware on 64 bit CPU" or similar there. Regards, BALATON Zoltan > } > > for (unsigned int i = 0; i < smp_cpus; i++) { > @@ -311,9 +314,9 @@ static TranslateFn *machine_HP_common_init_cpus(MachineState *machine) > cpu_region); > > /* Main memory region. */ > - if (machine->ram_size > 3 * GiB) { > - error_report("RAM size is currently restricted to 3GB"); > - exit(EXIT_FAILURE); > + if (machine->ram_size > ram_max) { > + info_report("Max RAM size limited to %ld MB", ram_max / MiB); > + machine->ram_size = ram_max; > } > memory_region_add_subregion_overlap(addr_space, 0, machine->ram, -1); > > -- > 2.43.0 > > >
On 1/4/24 20:58, BALATON Zoltan wrote: > On Thu, 4 Jan 2024, deller@kernel.org wrote: >> From: Helge Deller <deller@gmx.de> >> >> The physical hardware allows DIMMs of 4 MB size and above, allowing up >> to 3840 MB of memory, but is restricted by setup code to 3 GB. >> Increase the limit to allow up to the maximum amount of memory. >> >> Btw. the memory area from 0xf000.0000 to 0xffff.ffff is reserved by >> the architecture for firmware and I/O memory and can not be used for >> standard memory. >> >> Signed-off-by: Helge Deller <deller@gmx.de> >> Noticed-by: Nelson H. F. Beebe <beebe@math.utah.edu> >> Fixes: b7746b1194c8 ("hw/hppa/machine: Restrict the total memory size to 3GB") >> --- >> hw/hppa/machine.c | 9 ++++++--- >> 1 file changed, 6 insertions(+), 3 deletions(-) >> >> diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c >> index c8da7c18d5..6181f4b747 100644 >> --- a/hw/hppa/machine.c >> +++ b/hw/hppa/machine.c >> @@ -276,6 +276,7 @@ static TranslateFn *machine_HP_common_init_cpus(MachineState *machine) >> unsigned int smp_cpus = machine->smp.cpus; >> TranslateFn *translate; >> MemoryRegion *cpu_region; >> + ram_addr_t ram_max; >> >> /* Create CPUs. */ >> for (unsigned int i = 0; i < smp_cpus; i++) { >> @@ -288,8 +289,10 @@ static TranslateFn *machine_HP_common_init_cpus(MachineState *machine) >> */ >> if (hppa_is_pa20(&cpu[0]->env)) { >> translate = translate_pa20; >> + ram_max = 0xf0000000; /* 3.75 GB (limited by 32-bit firmware) */ >> } else { >> translate = translate_pa10; >> + ram_max = 0xf0000000; /* 3.75 GB (32-bit CPU) */ > > If the value is the same what's the point of setting it here and not > once above at definition? It is's only the different comment then you > could have a comment saying "3.75 GB, limited by 32-bit firmware on > 64 bit CPU" or similar there. Oh, sorry, I missed to explain it... qemu already supports the 64-bit CPU (hppa64), but using more than 3.75 GB of RAM is limited because the 32-bit firmware (which is currently shipped) only supports up to max. 4GB. For more than 4GB, a 64-bit SeaBIOS-hppa firmware is needed. The current SeaBIOS-hppa git tree already contains the code to build the firmware with 64-bit support. It already boots up, but I still need some more bug-fixing until it can be used. So, keeping two different lines here helps to more easily test the 64-bit firmware and the final commit to allow more than 4GB will become a one-liner with an upcoming patch. Helge
© 2016 - 2024 Red Hat, Inc.