On Mon, 30 Dec 2013 02:50:22 +0200
Siarhei Siamashka <[email protected]> wrote:

> These macros are used to convert between physical addresses (as
> seen by the CPU) and bus addresses (as seen by various peripherals
> such as the display controller, cedar, g2d, mali, ...).
> 
> The difference between physical and bus addresses is 0x40000000,
> because that's the physical address of SDRAM (and PHYS_OFFSET
> define in the kernel).
> 
> Huang Benn has provided an explanation earlier:
>     http://thread.gmane.org/gmane.comp.hardware.netbook.arm.sunxi/2827
> But some additional demystification might be useful.
> 
> Basically, when we write an address to some hardware register of
> the display controller, it is expected to be a bus address.
> However as long as the size of RAM is just 1 GiB or less, adding
> or subtracting a multiple of PHYS_OFFSET (which happens to be
> 1 GiB) to this address does not have any adverse effects. We just
> get some garbage in the high address lines on the memory interface,
> but these high address lines are not connected anywhere and have
> no effect. So using either bus addresses or just physical
> addresses was fine for the systems with 1 GiB of RAM or less.
> 
> But when having 2 GiB of RAM, using proper bus addresses becomes
> really important. A failure to do so and an incorrect value in
> the high address bit results in memory accesses going to a low
> or high 1 GiB part of DRAM based on the value of this bit.
> 
> This behaviour is expected to be the same for all sunxi hardware
> with 2 GiB of RAM. There is nothing sun7i specific in it and it
> makes sense to treat sun4i/sun5i/sun7i in the same way. Also the
> conversion between bus and physical addresses is a simple addition
> or subtraction of PHYS_OFFSET without any need for convoluted logic.
> 
> Signed-off-by: Siarhei Siamashka <[email protected]>
> ---
>  arch/arm/plat-sunxi/include/plat/memory.h | 10 ++--------
>  1 file changed, 2 insertions(+), 8 deletions(-)
> 
> diff --git a/arch/arm/plat-sunxi/include/plat/memory.h 
> b/arch/arm/plat-sunxi/include/plat/memory.h
> index 20c27bd..42a4afa 100644
> --- a/arch/arm/plat-sunxi/include/plat/memory.h
> +++ b/arch/arm/plat-sunxi/include/plat/memory.h
> @@ -30,13 +30,7 @@
>  /* default ATAG_MEM size */
>  #define MEM_SIZE     (512*1024*1024)
>  
> -#ifdef CONFIG_ARCH_SUN7I
> -#define __phys_to_bus(x) (((x)>=PLAT_PHYS_OFFSET)?(x)-PLAT_PHYS_OFFSET:(x))
> -#define __bus_to_phys(x) (((x)<PLAT_PHYS_OFFSET)?(x)+PLAT_PHYS_OFFSET:(x))
> -#else
> -#define __phys_to_bus(x) (x)
> -#define __bus_to_phys(x) (x)
> -#endif
> -
> +#define __phys_to_bus(x) ((x) - PLAT_PHYS_OFFSET)
> +#define __bus_to_phys(x) ((x) + PLAT_PHYS_OFFSET)
>  
>  #endif

Appears that this has caused regressions for some (already broken)
userland CedarX code. And not very surprisingly, it has been discovered
only after promoting the patch to sunxi-3.4 branch ;-(

    http://www.cubieforums.com/index.php/topic,1692.msg11098.html#msg11098


-- 
Best regards,
Siarhei Siamashka

-- 
You received this message because you are subscribed to the Google Groups 
"linux-sunxi" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to