diff mbox series

[3/7] MIPS: fw: Record prom memory

Message ID 20190808075013.4852-4-jiaxun.yang@flygoat.com (mailing list archive)
State Superseded
Headers show
Series [1/7] MIPS: init: Drop boot_mem_map | expand

Commit Message

Jiaxun Yang Aug. 8, 2019, 7:50 a.m. UTC
boot_mem_map is nolonger exist so we need to maintain a list
of prom memory by ourselves.

Signed-off-by: Jiaxun Yang <jiaxun.yang@flygoat.com>
---
 arch/mips/fw/arc/memory.c | 20 ++++++++++++++------
 1 file changed, 14 insertions(+), 6 deletions(-)

Comments

Serge Semin Aug. 14, 2019, 12:03 p.m. UTC | #1
On Thu, Aug 08, 2019 at 03:50:09PM +0800, Jiaxun Yang wrote:
> boot_mem_map is nolonger exist so we need to maintain a list
> of prom memory by ourselves.
> 
> Signed-off-by: Jiaxun Yang <jiaxun.yang@flygoat.com>
> ---
>  arch/mips/fw/arc/memory.c | 20 ++++++++++++++------
>  1 file changed, 14 insertions(+), 6 deletions(-)
> 
> diff --git a/arch/mips/fw/arc/memory.c b/arch/mips/fw/arc/memory.c
> index 429b7f8d2aeb..02e954b3700e 100644
> --- a/arch/mips/fw/arc/memory.c
> +++ b/arch/mips/fw/arc/memory.c
> @@ -27,6 +27,11 @@
>  
>  #undef DEBUG
>  
> +#define MAX_PROM_MEM 5
> +static phys_addr_t prom_mem_base[MAX_PROM_MEM] __initdata;
> +static phys_addr_t prom_mem_size[MAX_PROM_MEM] __initdata;
> +static unsigned int nr_prom_mem __initdata;
> +
>  /*
>   * For ARC firmware memory functions the unit of meassuring memory is always
>   * a 4k page of memory
> @@ -129,6 +134,7 @@ void __init prom_meminit(void)
>  	}
>  #endif
>  
> +	nr_prom_mem = 0;
>  	p = PROM_NULL_MDESC;
>  	while ((p = ArcGetMemoryDescriptor(p))) {
>  		unsigned long base, size;
> @@ -139,6 +145,12 @@ void __init prom_meminit(void)
>  		type = prom_memtype_classify(p->type);
>  
>  		add_memory_region(base, size, type);
> +
> +		if (type == BOOT_MEM_ROM_DATA) {
> +			prom_mem_base[nr_prom_mem] = base;
> +			prom_mem_size[nr_prom_mem] = size;
> +			nr_prom_mem++;

Are you sure, that five prom-mem regions is enough? What about adding
a sanity check here so no to exceed the array size?

-Sergey

> +		}
>  	}
>  }
>  
> @@ -150,12 +162,8 @@ void __init prom_free_prom_memory(void)
>  	if (prom_flags & PROM_FLAG_DONT_FREE_TEMP)
>  		return;
>  
> -	for (i = 0; i < boot_mem_map.nr_map; i++) {
> -		if (boot_mem_map.map[i].type != BOOT_MEM_ROM_DATA)
> -			continue;
> -
> -		addr = boot_mem_map.map[i].addr;
> +	for (i = 0; i < nr_prom_mem; i++) {
>  		free_init_pages("prom memory",
> -				addr, addr + boot_mem_map.map[i].size);
> +			prom_mem_base[i], prom_mem_base[i] + prom_mem_size[i]);
>  	}
>  }
> -- 
> 2.22.0
>
Thomas Bogendoerfer Aug. 14, 2019, 12:50 p.m. UTC | #2
On Wed, Aug 14, 2019 at 03:03:41PM +0300, Serge Semin wrote:
> On Thu, Aug 08, 2019 at 03:50:09PM +0800, Jiaxun Yang wrote:
> > boot_mem_map is nolonger exist so we need to maintain a list
> > of prom memory by ourselves.
> > 
> > Signed-off-by: Jiaxun Yang <jiaxun.yang@flygoat.com>
> > ---
> >  arch/mips/fw/arc/memory.c | 20 ++++++++++++++------
> >  1 file changed, 14 insertions(+), 6 deletions(-)
> > 
> > diff --git a/arch/mips/fw/arc/memory.c b/arch/mips/fw/arc/memory.c
> > index 429b7f8d2aeb..02e954b3700e 100644
> > --- a/arch/mips/fw/arc/memory.c
> > +++ b/arch/mips/fw/arc/memory.c
> > @@ -27,6 +27,11 @@
> >  
> >  #undef DEBUG
> >  
> > +#define MAX_PROM_MEM 5
> > +static phys_addr_t prom_mem_base[MAX_PROM_MEM] __initdata;
> > +static phys_addr_t prom_mem_size[MAX_PROM_MEM] __initdata;
> > +static unsigned int nr_prom_mem __initdata;
> > +
> >  /*
> >   * For ARC firmware memory functions the unit of meassuring memory is always
> >   * a 4k page of memory
> > @@ -129,6 +134,7 @@ void __init prom_meminit(void)
> >  	}
> >  #endif
> >  
> > +	nr_prom_mem = 0;
> >  	p = PROM_NULL_MDESC;
> >  	while ((p = ArcGetMemoryDescriptor(p))) {
> >  		unsigned long base, size;
> > @@ -139,6 +145,12 @@ void __init prom_meminit(void)
> >  		type = prom_memtype_classify(p->type);
> >  
> >  		add_memory_region(base, size, type);
> > +
> > +		if (type == BOOT_MEM_ROM_DATA) {
> > +			prom_mem_base[nr_prom_mem] = base;
> > +			prom_mem_size[nr_prom_mem] = size;
> > +			nr_prom_mem++;
> 
> Are you sure, that five prom-mem regions is enough?

it's not enough:

ARCH: Microsoft-Jazz
PROMLIB: ARC firmware Version 1 Revision 1
CPU revision is: 00000430
FPU revision is: 00000500
Determined physical RAM map:
 memory: 00054000 @ 00000000 (reserved)
 memory: 0002c000 @ 00054000 (usable)
 memory: 0001f000 @ 007e0000 (ROM data)
 memory: 007b2000 @ 007ff000 (usable)
 memory: 0004f000 @ 00fb1000 (ROM data)
 memory: 01000000 @ 01000000 (usable)
 memory: 00323000 @ 00080000 (reserved)
 memory: 0043d000 @ 003a3000 (usable)

that's from a Olivetti M700 system.

Thomas.
Jiaxun Yang Aug. 14, 2019, 1:45 p.m. UTC | #3
On 2019/8/14 下午8:03, Serge Semin wrote:
> On Thu, Aug 08, 2019 at 03:50:09PM +0800, Jiaxun Yang wrote:
>> boot_mem_map is nolonger exist so we need to maintain a list
>> of prom memory by ourselves.
>>
>> Signed-off-by: Jiaxun Yang <jiaxun.yang@flygoat.com>
>> ---
>>   arch/mips/fw/arc/memory.c | 20 ++++++++++++++------
>>   1 file changed, 14 insertions(+), 6 deletions(-)
>>
>> diff --git a/arch/mips/fw/arc/memory.c b/arch/mips/fw/arc/memory.c
>> index 429b7f8d2aeb..02e954b3700e 100644
>> --- a/arch/mips/fw/arc/memory.c
>> +++ b/arch/mips/fw/arc/memory.c
>> @@ -27,6 +27,11 @@
>>   
>>   #undef DEBUG
>>   
>> +#define MAX_PROM_MEM 5
>> +static phys_addr_t prom_mem_base[MAX_PROM_MEM] __initdata;
>> +static phys_addr_t prom_mem_size[MAX_PROM_MEM] __initdata;
>> +static unsigned int nr_prom_mem __initdata;
>> +
>>   /*
>>    * For ARC firmware memory functions the unit of meassuring memory is always
>>    * a 4k page of memory
>> @@ -129,6 +134,7 @@ void __init prom_meminit(void)
>>   	}
>>   #endif
>>   
>> +	nr_prom_mem = 0;
>>   	p = PROM_NULL_MDESC;
>>   	while ((p = ArcGetMemoryDescriptor(p))) {
>>   		unsigned long base, size;
>> @@ -139,6 +145,12 @@ void __init prom_meminit(void)
>>   		type = prom_memtype_classify(p->type);
>>   
>>   		add_memory_region(base, size, type);
>> +
>> +		if (type == BOOT_MEM_ROM_DATA) {
>> +			prom_mem_base[nr_prom_mem] = base;
>> +			prom_mem_size[nr_prom_mem] = size;
>> +			nr_prom_mem++;
> Are you sure, that five prom-mem regions is enough? What about adding
> a sanity check here so no to exceed the array size?

Five should be enough, as far as I know yamon will only allocate one or two.

But you are right, add a sanity check would be better.

- Jiaxun

>
> -Sergey
>
>> +		}
>>   	}
>>   }
>>   
>> @@ -150,12 +162,8 @@ void __init prom_free_prom_memory(void)
>>   	if (prom_flags & PROM_FLAG_DONT_FREE_TEMP)
>>   		return;
>>   
>> -	for (i = 0; i < boot_mem_map.nr_map; i++) {
>> -		if (boot_mem_map.map[i].type != BOOT_MEM_ROM_DATA)
>> -			continue;
>> -
>> -		addr = boot_mem_map.map[i].addr;
>> +	for (i = 0; i < nr_prom_mem; i++) {
>>   		free_init_pages("prom memory",
>> -				addr, addr + boot_mem_map.map[i].size);
>> +			prom_mem_base[i], prom_mem_base[i] + prom_mem_size[i]);
>>   	}
>>   }
>> -- 
>> 2.22.0
>>
diff mbox series

Patch

diff --git a/arch/mips/fw/arc/memory.c b/arch/mips/fw/arc/memory.c
index 429b7f8d2aeb..02e954b3700e 100644
--- a/arch/mips/fw/arc/memory.c
+++ b/arch/mips/fw/arc/memory.c
@@ -27,6 +27,11 @@ 
 
 #undef DEBUG
 
+#define MAX_PROM_MEM 5
+static phys_addr_t prom_mem_base[MAX_PROM_MEM] __initdata;
+static phys_addr_t prom_mem_size[MAX_PROM_MEM] __initdata;
+static unsigned int nr_prom_mem __initdata;
+
 /*
  * For ARC firmware memory functions the unit of meassuring memory is always
  * a 4k page of memory
@@ -129,6 +134,7 @@  void __init prom_meminit(void)
 	}
 #endif
 
+	nr_prom_mem = 0;
 	p = PROM_NULL_MDESC;
 	while ((p = ArcGetMemoryDescriptor(p))) {
 		unsigned long base, size;
@@ -139,6 +145,12 @@  void __init prom_meminit(void)
 		type = prom_memtype_classify(p->type);
 
 		add_memory_region(base, size, type);
+
+		if (type == BOOT_MEM_ROM_DATA) {
+			prom_mem_base[nr_prom_mem] = base;
+			prom_mem_size[nr_prom_mem] = size;
+			nr_prom_mem++;
+		}
 	}
 }
 
@@ -150,12 +162,8 @@  void __init prom_free_prom_memory(void)
 	if (prom_flags & PROM_FLAG_DONT_FREE_TEMP)
 		return;
 
-	for (i = 0; i < boot_mem_map.nr_map; i++) {
-		if (boot_mem_map.map[i].type != BOOT_MEM_ROM_DATA)
-			continue;
-
-		addr = boot_mem_map.map[i].addr;
+	for (i = 0; i < nr_prom_mem; i++) {
 		free_init_pages("prom memory",
-				addr, addr + boot_mem_map.map[i].size);
+			prom_mem_base[i], prom_mem_base[i] + prom_mem_size[i]);
 	}
 }