/* hw.c - U-Boot hardware discovery */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2013 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #include #include grub_addr_t start_of_ram; /* * grub_uboot_probe_memory(): * Queries U-Boot for available memory regions. * * Sets up heap near the image in memory and sets up "start_of_ram". */ void grub_uboot_mm_init (void) { struct sys_info *si = grub_uboot_get_sys_info (); grub_mm_init_region ((void *) (grub_modules_get_end () + GRUB_KERNEL_MACHINE_STACK_SIZE), GRUB_KERNEL_MACHINE_HEAP_SIZE); if (si && (si->mr_no != 0)) { int i; start_of_ram = GRUB_UINT_MAX; for (i = 0; i < si->mr_no; i++) if ((si->mr[i].flags & MR_ATTR_MASK) == MR_ATTR_DRAM) if (si->mr[i].start < start_of_ram) start_of_ram = si->mr[i].start; } } /* * grub_uboot_probe_hardware(): */ grub_err_t grub_uboot_probe_hardware (void) { int devcount, i; devcount = grub_uboot_dev_enum (); grub_dprintf ("init", "%d devices found\n", devcount); for (i = 0; i < devcount; i++) { struct device_info *devinfo = grub_uboot_dev_get (i); grub_dprintf ("init", "device handle: %d\n", i); grub_dprintf ("init", " cookie\t= 0x%08x\n", (grub_uint32_t) devinfo->cookie); if (devinfo->type & DEV_TYP_STOR) { grub_dprintf ("init", " type\t\t= DISK\n"); grub_ubootdisk_register (devinfo); } else if (devinfo->type & DEV_TYP_NET) { /* Dealt with in ubootnet module. */ grub_dprintf ("init", " type\t\t= NET (not supported yet)\n"); } else { grub_dprintf ("init", "%s: unknown device type", __FUNCTION__); } } return GRUB_ERR_NONE; } grub_err_t grub_machine_mmap_iterate (grub_memory_hook_t hook, void *hook_data) { int i; struct sys_info *si = grub_uboot_get_sys_info (); if (!si || (si->mr_no < 1)) return GRUB_ERR_BUG; /* Iterate and call `hook'. */ for (i = 0; i < si->mr_no; i++) if ((si->mr[i].flags & MR_ATTR_MASK) == MR_ATTR_DRAM) hook (si->mr[i].start, si->mr[i].size, GRUB_MEMORY_AVAILABLE, hook_data); return GRUB_ERR_NONE; }