Re: [PATCH 26/31] nds32: Build infrastructure

From: Greentime Hu
Date: Fri Nov 10 2017 - 03:27:47 EST


2017-11-09 18:33 GMT+08:00 Arnd Bergmann <arnd@xxxxxxxx>:
> On Thu, Nov 9, 2017 at 10:02 AM, Greentime Hu <green.hu@xxxxxxxxx> wrote:
>> 2017-11-08 18:16 GMT+08:00 Arnd Bergmann <arnd@xxxxxxxx>:
>>> On Wed, Nov 8, 2017 at 6:55 AM, Greentime Hu <green.hu@xxxxxxxxx> wrote:
>
>>>> +config GENERIC_CALIBRATE_DELAY
>>>> + def_bool y
>>>
>>> It's better to avoid the delay loop completely and skip the calibration,
>>> if your hardware allows.
>>
>> Thanks.
>> Do you mean that this config should be def_bool n?
>> why? Almost all arch enable it.
>
> It depends on what your hardware can do. If you have a way to see how much
> time has passed that is guaranteed to be reliable on all machines, then
> use that instead.
>
> On a lot of architectures, it's not possible, so they have to fall back to using
> the delay loop.

I get it. I will discuss it with our HW colleagues.
We may get these informations in some registers.

>>>> +config ALIGNMENT_TRAP
>>>> + tristate "Kernel support unaligned access handling"
>>>> + default y
>>>> + help
>>>> + Andes processors cannot fetch/store information which is not
>>>> + naturally aligned on the bus, i.e., a 4 byte fetch must start at an
>>>> + address divisible by 4. On 32-bit Andes processors, these non-aligned
>>>> + fetch/store instructions will be emulated in software if you say
>>>> + here, which has a severe performance impact. This is necessary for
>>>> + correct operation of some network protocols. With an IP-only
>>>> + configuration it is safe to say N, otherwise say Y.
>>>
>>> Which network protocols are you referring to?
>>
>> I will modify these descriptions. It was written by someone I don't know. :p
>> This case only happened when I found is compiler code gen issue or
>> wrong pointer usage.
>
> Ok, should it also be 'default n' then?

Yup. I will use 'default n' in the next version patch.

>>>> +config HIGHMEM
>>>> + bool "High Memory Support"
>>>> + depends on MMU && CPU_CACHE_NONALIASING
>>>> + help
>>>> + The address space of Andes processors is only 4 Gigabytes large
>>>> + and it has to accommodate user address space, kernel address
>>>> + space as well as some memory mapped IO. That means that, if you
>>>> + have a large amount of physical memory and/or IO, not all of the
>>>> + memory can be "permanently mapped" by the kernel. The physical
>>>> + memory that is not permanently mapped is called "high memory".
>>>> +
>>>> + Depending on the selected kernel/user memory split, minimum
>>>> + vmalloc space and actual amount of RAM, you may not need this
>>>> + option which should result in a slightly faster kernel.
>>>> +
>>>> + If unsure, say N.
>>>
>>> Generally speaking, highmem support is a mess, and it's better to avoid it.
>>>
>>> I see that the two device tree files you have list 1GB of memory. Do you think
>>> that is a common configuration for actual products? Do you expect any to
>>> have more than 1GB (or more than 4GB) in the future, or is that the upper
>>> end of the scale?
>>>
>>> If 1GB is a reasonable upper bound, then you could change the vmsplit
>>> to give slightly less address space to user space and have 1GB of direct-mapped
>>> kernel memory plus 256MB of vmalloc space reserved for the kernel,
>>> and completely avoid highmem.
>>
>> Thanks.
>> We do realy use 1GB ram in some products.
>> We also verify CONFIG_HIGHMEM with LTP too.
>> It seems fine but I will study vmsplit to see if we should use it.
>
> For the 1GB configuration, something like ARM's CONFIG_VMSPLIT_3G_OPT
> should be optimal, it will result in better performance because it allows you
> to completely turn off CONFIG_HIGHMEM. The reason we don't always
> use it on ARM is that traditionally we had the 3GB vmsplit, and some
> applications
> might rely on having the exact amount of available address space that they
> expect. For a new architecture that should be less of a problem.
>
> The interesting case is what happens if you have machines with 1.5GB or
> or more physical RAM. You can obviously have another vmsplit configuration
> for those, but at some point going to highmem is better than limiting the
> user address space.
>
> Ideally 1.5GB is the point where you start using a 64-bit CPU, but of course
> that is not something you have available at the moment.



>>>> +config MEMORY_START
>>>> + hex "Physical memory start address"
>>>> + default "0x00000000"
>>>> + help
>>>> + Physical memory start address, you may modify it if it is porting to
>>>> + a new SoC with different start address.
>>>> +endmenu
>>>
>>> On ARM, we found options like this to be rather problematic since it prevents
>>> you from running the same kernel on boards that are otherwise compatible.
>>>
>>> If the architecture easily allows the memory to start at address 0, could
>>> you require this address for all SoCs that want to run Linux, and get
>>> rid of the compile-time option?
>>
>> Thanks.
>> The reason we need this config is because we need to define PHYS_OFFSET.
>> #define PHYS_OFFSET (CONFIG_MEMORY_START)
>>
>> It needs to be set in compile-time. I don't know how to get rid of it.
>
> PHYS_OFFSET doesn't have to be a constant, a lot of architectures make
> the __va()/__pa() and related functions use a variable for the offset.
> This is also useful to implement KASLR, and booting the kernel from
> a random physical address.
>
> My actual suggestion however was to just mandate that PHYS_OFFSET
> is always zero for your architecture, and not support any other value.
> This is easy as long as you don't have existing hardware that would
> break.

Thanks.
I will check how other architectures do.
I can mandate that PHYS_OFFSET is zero but our customers(SoC company)
may not use 0x0 as default DRAM starting address.
This assumption is a little bit too strong.