• Michael Ellerman's avatar
    of: Fix comparison of reserved memory regions · 9eb8cd2b
    Michael Ellerman authored
    In order to check for overlapping reserved memory regions, we first need
    to sort the array of memory regions. This is implemented using sort(),
    and a custom comparison function __rmem_cmp().
    
    Unfortunatley __rmem_cmp() doesn't work in all cases. Because the two
    base values are phys_addr_t, they may be u64 on some platforms, in which
    case subtracting one from the other and then (implicitly) casting to int
    does not give us the -ve/0/+ve value we need.
    
    This leads to incorrect reports about overlaps, eg:
    
      ibm,slw-image@1ffe600000 (0x0000001ffe600000--0x0000001ffe700000) overlaps with
      ibm,firmware-allocs-memory@1000000000 (0x0000001000000000--0x0000001000dc0200)
    
    Fix it by just doing the standard double if and return 0 logic.
    
    Fixes: ae1add24 ("of: Check for overlap in reserved memory regions")
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Signed-off-by: default avatarRob Herring <robh@kernel.org>
    9eb8cd2b
of_reserved_mem.c 8.66 KB