phys_addr_t *res_base)
{
phys_addr_t base;
+
+ /* check if the region has been alredy reserved by the bootloader */
+ if (start && end && memblock_is_region_reserved(start, end - start)) {
+ pr_info("OF: region (%pa--%pa) is reserved both in /memreserve/ and /reserved-memory, fixing\n",
+ &start, &end);
+ memblock_unreserve(start, end - start);
+ }
+
/*
* We use __memblock_alloc_base() because memblock_alloc_base()
* panic()s on allocation failure.
int memblock_remove(phys_addr_t base, phys_addr_t size);
int memblock_free(phys_addr_t base, phys_addr_t size);
int memblock_reserve(phys_addr_t base, phys_addr_t size);
+int memblock_unreserve(phys_addr_t base, phys_addr_t size);
void memblock_trim_memory(phys_addr_t align);
bool memblock_overlaps_region(struct memblock_type *type,
phys_addr_t base, phys_addr_t size);
return memblock_add_range(&memblock.reserved, base, size, MAX_NUMNODES, 0);
}
+int __init_memblock memblock_unreserve(phys_addr_t base, phys_addr_t size)
+{
+ memblock_dbg(" memblock_unreserve: [%#016llx-%#016llx] %pF\n",
+ (unsigned long long)base,
+ (unsigned long long)base + size - 1,
+ (void *)_RET_IP_);
+
+ return memblock_remove_range(&memblock.reserved, base, size);
+}
+
/**
*
* This function isolates region [@base, @base + @size), and sets/clears flag