[PATCH 14/16] arm: rmobile: Support RZ/G2L memory map

Marek Vasut marek.vasut at mailbox.org
Wed Oct 4 14:30:53 CEST 2023


On 10/4/23 11:18, Paul Barker wrote:

[...]

>>> +static struct mm_region rzg2l_mem_map[RZG2L_NR_REGIONS] = {
>>> +	{
>>> +		.virt = 0x0UL,
>>> +		.phys = 0x0UL,
>>> +		.size = 0x40000000UL,
>>> +		.attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
>>> +			 PTE_BLOCK_NON_SHARE |
>>> +			 PTE_BLOCK_PXN | PTE_BLOCK_UXN
>>> +	}, {
>>> +		.virt = 0x40000000UL,
>>> +		.phys = 0x40000000UL,
>>> +		.size = 0x03F00000UL,
>>> +		.attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
>>> +			 PTE_BLOCK_INNER_SHARE
>>> +	}, {
>>> +		.virt = 0x47E00000UL,
>>
>> What's this part about ?
> 
> This is copied from the RCar Gen3 memory map.

I suspected as much. Please recheck the memory map instead of copy-paste 
and make sure it is really matching the hardware.

>>> +		.phys = 0x47E00000UL,
>>> +		.size = 0xF8200000UL,
>>> +		.attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
>>> +			 PTE_BLOCK_INNER_SHARE
>>> +	}, {
>>> +		/* List terminator */
>>> +		0,
>>> +	}
>>> +};
>>> +
>>> +struct mm_region *mem_map = rzg2l_mem_map;
>>> +
>>> +DECLARE_GLOBAL_DATA_PTR;
>>> +
>>> +#define debug_memmap(i, map) \
>>> +	debug("memmap %d: virt 0x%llx -> phys 0x%llx, size=0x%llx, attrs=0x%llx\n", \
>>> +	      i, map[i].virt, map[i].phys, map[i].size, map[i].attrs)
>>> +
>>> +void enable_caches(void)
>>> +{
>>> +	unsigned int bank, i = 0;
>>> +	u64 start, size;
>>> +
>>> +	/* Create map for register access */
>>> +	rzg2l_mem_map[i].virt = 0x0ULL;
>>> +	rzg2l_mem_map[i].phys = 0x0ULL;
>>> +	rzg2l_mem_map[i].size = 0x40000000ULL;
>>> +	rzg2l_mem_map[i].attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
>>> +				 PTE_BLOCK_NON_SHARE |
>>> +				 PTE_BLOCK_PXN | PTE_BLOCK_UXN;
>>> +	debug_memmap(i, rzg2l_mem_map);
>>> +	i++;
>>> +
>>> +	/* Generate entries for DRAM in 32bit address space */
>>> +	for (bank = 0; bank < CONFIG_NR_DRAM_BANKS; bank++) {
>>> +		start = gd->bd->bi_dram[bank].start;
>>> +		size = gd->bd->bi_dram[bank].size;
>>> +
>>> +		/* Skip empty DRAM banks */
>>> +		if (!size)
>>> +			continue;
>>> +
>>> +		/* Mark memory reserved by ATF as cacheable too. */
>>> +		if (start == 0x48000000) {
>>> +			/* Unmark protection area (0x43F00000 to 0x47DFFFFF) */
>>> +			rzg2l_mem_map[i].virt = 0x40000000ULL;
>>> +			rzg2l_mem_map[i].phys = 0x40000000ULL;
>>> +			rzg2l_mem_map[i].size = 0x03F00000ULL;
>>> +			rzg2l_mem_map[i].attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
>>> +						 PTE_BLOCK_INNER_SHARE;
>>> +			debug_memmap(i, rzg2l_mem_map);
>>> +			i++;
>>> +
>>> +			start = 0x47E00000ULL;
>>> +			size += 0x00200000ULL;
>>> +		}
>>> +
>>> +		rzg2l_mem_map[i].virt = start;
>>> +		rzg2l_mem_map[i].phys = start;
>>> +		rzg2l_mem_map[i].size = size;
>>> +		rzg2l_mem_map[i].attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
>>> +					 PTE_BLOCK_INNER_SHARE;
>>> +		debug_memmap(i, rzg2l_mem_map);
>>> +		i++;
>>> +	}
>>
>> Is this somehow copied from R-Car ? Can this be deduplicated ?
> 
> This is based on the R-Car memory map. We discussed internally whether
> to modify memmap-gen3.c or create a separate memmap-rzg2l.c and decided
> that it was safer not to change the known working code for R-Car systems.
> 
> To merge the two, we'll need to add a few if(IS_ENABLED(CONFIG_RZG2L))
> conditionals to memmap-gen3.c. I'm happy to do that if that's the
> approach you'd prefer.

I suspect if you really align the memmap with your hardware, there will 
be even more differences. All right, lets stick with this setup for now.


More information about the U-Boot mailing list