1 // SPDX-License-Identifier: GPL-2.0
2 #include <linux/ioport.h>
3 #include <asm/e820/api.h>
5 static void resource_clip(struct resource
*res
, resource_size_t start
,
8 resource_size_t low
= 0, high
= 0;
10 if (res
->end
< start
|| res
->start
> end
)
11 return; /* no conflict */
13 if (res
->start
< start
)
14 low
= start
- res
->start
;
17 high
= res
->end
- end
;
19 /* Keep the area above or below the conflict, whichever is larger */
26 static void remove_e820_regions(struct resource
*avail
)
29 struct e820_entry
*entry
;
31 for (i
= 0; i
< e820_table
->nr_entries
; i
++) {
32 entry
= &e820_table
->entries
[i
];
34 resource_clip(avail
, entry
->addr
,
35 entry
->addr
+ entry
->size
- 1);
39 void arch_remove_reservations(struct resource
*avail
)
42 * Trim out BIOS area (high 2MB) and E820 regions. We do not remove
43 * the low 1MB unconditionally, as this area is needed for some ISA
44 * cards requiring a memory range, e.g. the i82365 PCMCIA controller.
46 if (avail
->flags
& IORESOURCE_MEM
) {
47 resource_clip(avail
, BIOS_ROM_BASE
, BIOS_ROM_END
);
49 remove_e820_regions(avail
);