Updated PCI IDs to latest snapshot.
[tangerine.git] / arch / common / boot / grub2 / kern / i386 / coreboot / mmap.c
blobb15369ee595b2312d9965ef2156951d893fc933d
1 /*
2 * GRUB -- GRand Unified Bootloader
3 * Copyright (C) 2007,2008 Free Software Foundation, Inc.
5 * GRUB is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
10 * GRUB is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
19 #include <grub/machine/memory.h>
20 #include <grub/types.h>
21 #include <grub/err.h>
22 #include <grub/misc.h>
24 static grub_err_t
25 grub_linuxbios_table_iterate (int (*hook) (grub_linuxbios_table_item_t))
27 grub_linuxbios_table_header_t table_header;
28 grub_linuxbios_table_item_t table_item;
30 auto int check_signature (grub_linuxbios_table_header_t);
31 int check_signature (grub_linuxbios_table_header_t tbl_header)
33 if (! grub_memcmp (tbl_header->signature, "LBIO", 4))
34 return 1;
36 return 0;
39 /* Assuming table_header is aligned to its size (8 bytes). */
41 for (table_header = (grub_linuxbios_table_header_t) 0x500;
42 table_header < (grub_linuxbios_table_header_t) 0x1000; table_header++)
43 if (check_signature (table_header))
44 goto signature_found;
46 for (table_header = (grub_linuxbios_table_header_t) 0xf0000;
47 table_header < (grub_linuxbios_table_header_t) 0x100000; table_header++)
48 if (check_signature (table_header))
49 goto signature_found;
51 grub_fatal ("Could not find coreboot table\n");
53 signature_found:
55 table_item =
56 (grub_linuxbios_table_item_t) ((long) table_header +
57 (long) table_header->size);
58 for (; table_item->size;
59 table_item = (grub_linuxbios_table_item_t) ((long) table_item + (long) table_item->size))
60 if (hook (table_item))
61 return 1;
63 return 0;
66 void
67 grub_machine_mmap_iterate (int NESTED_FUNC_ATTR (*hook) (grub_uint64_t, grub_uint64_t, grub_uint32_t))
69 mem_region_t mem_region;
71 auto int iterate_linuxbios_table (grub_linuxbios_table_item_t);
72 int iterate_linuxbios_table (grub_linuxbios_table_item_t table_item)
74 if (table_item->tag != GRUB_LINUXBIOS_MEMBER_MEMORY)
75 return 0;
77 mem_region =
78 (mem_region_t) ((long) table_item +
79 sizeof (struct grub_linuxbios_table_item));
80 while ((long) mem_region < (long) table_item + (long) table_item->size)
82 if (hook (mem_region->addr, mem_region->size,
83 /* Multiboot mmaps match with the coreboot mmap definition.
84 Therefore, we can just pass type through. */
85 mem_region->type))
86 return 1;
88 mem_region++;
91 return 0;
94 grub_linuxbios_table_iterate (iterate_linuxbios_table);
96 return 0;