[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [EXTERNAL][PATCH] mips/mips_malta: Allow more than 2G RAM
From: |
Igor Mammedov |
Subject: |
Re: [EXTERNAL][PATCH] mips/mips_malta: Allow more than 2G RAM |
Date: |
Tue, 3 Mar 2020 08:57:57 +0100 |
On Tue, 3 Mar 2020 00:59:26 +0100
Philippe Mathieu-Daudé <address@hidden> wrote:
> On 3/2/20 10:22 PM, Aleksandar Markovic wrote:
> > Forwarding this to Igor. Can you please give us your opinion, Igor, on this
> > proposal?
>
> I'm not sure it is Igor area.
true,
as far as board consumes all machine->ram and works fine when
user specifies insane -m value there, it would be fine with me.
> What need to be reviewed here is the GT64120 north bridge, which works
> very well with the default config, but is fragile when modifying it.
>
> I'd be more confident with an acceptance test running memtester.
>
> > ________________________________________
> > From: Jiaxun Yang <address@hidden>
> > Sent: Friday, February 28, 2020 4:26 AM
> > To: address@hidden
> > Cc: address@hidden; Aleksandar Markovic; Jiaxun Yang; Yunqiang Su
> > Subject: [EXTERNAL][PATCH] mips/mips_malta: Allow more than 2G RAM
> >
> > When malta is coupled with MIPS64 cpu which have 64bit
> > address space, it is possible to have more than 2G RAM.
> >
> > So we removed ram_size check and overwrite memory
> > layout for these targets.
> >
> > Signed-off-by: Jiaxun Yang <address@hidden>
> > Suggested-by: Yunqiang Su <address@hidden>
> > ---
> > hw/mips/mips_malta.c | 24 ++++++++++++++++++------
> > 1 file changed, 18 insertions(+), 6 deletions(-)
> >
> > diff --git a/hw/mips/mips_malta.c b/hw/mips/mips_malta.c
> > index 6e7ba9235d..de89cdcfc1 100644
> > --- a/hw/mips/mips_malta.c
> > +++ b/hw/mips/mips_malta.c
> > @@ -98,7 +98,8 @@ typedef struct {
> > } MaltaState;
> >
> > static struct _loaderparams {
> > - int ram_size, ram_low_size;
> > + unsigned int ram_low_size;
> > + ram_addr_t ram_size;
> > const char *kernel_filename;
> > const char *kernel_cmdline;
> > const char *initrd_filename;
> > @@ -1023,6 +1024,7 @@ static int64_t load_kernel(void)
> > {
> > int64_t kernel_entry, kernel_high, initrd_size;
> > long kernel_size;
> > + char mem_cmdline[128];
> > ram_addr_t initrd_offset;
> > int big_endian;
> > uint32_t *prom_buf;
> > @@ -1099,20 +1101,28 @@ static int64_t load_kernel(void)
> > prom_buf = g_malloc(prom_size);
> >
> > prom_set(prom_buf, prom_index++, "%s", loaderparams.kernel_filename);
> > +
> > + /*
> > + * Always use cmdline to overwrite mem layout
> > + * as kernel may reject large emesize.
> > + */
> > + sprintf(&mem_cmdline[0],
> > + "mem=0x10000000@0x00000000 mem=0x%" PRIx64 "@0x90000000",
> > + loaderparams.ram_size - 0x10000000);
> > if (initrd_size > 0) {
> > prom_set(prom_buf, prom_index++,
> > - "rd_start=0x%" PRIx64 " rd_size=%" PRId64 " %s",
> > - xlate_to_kseg0(NULL, initrd_offset),
> > + "%s rd_start=0x%" PRIx64 " rd_size=%" PRId64 " %s",
> > + &mem_cmdline[0], xlate_to_kseg0(NULL, initrd_offset),
> > initrd_size, loaderparams.kernel_cmdline);
> > } else {
> > - prom_set(prom_buf, prom_index++, "%s",
> > loaderparams.kernel_cmdline);
> > + prom_set(prom_buf, prom_index++, "%s %s",&mem_cmdline[0]
> > ,loaderparams.kernel_cmdline);
> > }
> >
> > prom_set(prom_buf, prom_index++, "memsize");
> > prom_set(prom_buf, prom_index++, "%u", loaderparams.ram_low_size);
> >
> > prom_set(prom_buf, prom_index++, "ememsize");
> > - prom_set(prom_buf, prom_index++, "%u", loaderparams.ram_size);
> > + prom_set(prom_buf, prom_index++, "%lu", loaderparams.ram_size);
> >
> > prom_set(prom_buf, prom_index++, "modetty0");
> > prom_set(prom_buf, prom_index++, "38400n8r");
> > @@ -1253,12 +1263,14 @@ void mips_malta_init(MachineState *machine)
> > /* create CPU */
> > mips_create_cpu(machine, s, &cbus_irq, &i8259_irq);
> >
> > - /* allocate RAM */
> > +#ifdef TARGET_MIPS32
> > + /* MIPS32 won't accept more than 2GiB RAM due to limited address space
> > */
> > if (ram_size > 2 * GiB) {
> > error_report("Too much memory for this machine: %" PRId64 "MB,"
> > " maximum 2048MB", ram_size / MiB);
> > exit(1);
> > }
> > +#endif
> >
> > /* register RAM at high address where it is undisturbed by IO */
> > memory_region_add_subregion(system_memory, 0x80000000, machine->ram);
> > --
> > 2.25.1
> >
> >
> >
> >
>