of/fdt: memblock_reserve /memreserve/ regions in the case of partial overlap
authorIan Campbell <ian.campbell@citrix.com>
Tue, 25 Nov 2014 15:05:13 +0000 (15:05 +0000)
committerGrant Likely <grant.likely@linaro.org>
Wed, 26 Nov 2014 12:35:52 +0000 (12:35 +0000)
commit094cb98179f19b75acf9ff471daabf3948ce98e6
treee8247e4e359e94789cf18b1e197439fa825c8d9e
parent5d01410fe4d92081f349b013a2e7a95429e4f2c9
of/fdt: memblock_reserve /memreserve/ regions in the case of partial overlap

memblock_is_region_reserved() returns true in the case of a partial
overlap, meaning that the current code fails to reserve the
non-overlapping portion.

This call was introduced as part of d1552ce449eb "of/fdt: move
memreserve and dtb memory reservations into core" which went into
v3.16.

I observed this causing a Midway system with a buggy fdt (the header
declares itself to be larger than it really is) failing to boot
because the over-inflated size of the fdt was causing it to seem to
run into the swapper_pg_dir region, meaning the DT wasn't reserved.
The symptoms were failing to find an disks or network and failing to
boot.

However given the ambiguity of whether things like the initrd are
covered by /memreserve/ and similar I think it is best to also
register the region rather than just ignoring it.

Since memblock_reserve() handles overlaps just fine lets just warn and
carry on.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Signed-off-by: Grant Likely <grant.likely@linaro.org>
Cc: Rob Herring <robh+dt@kernel.org>
Cc: stable@vger.kernel.org # v3.16+
drivers/of/fdt.c