static void lb_boot_media_params(struct lb_header *header) { struct lb_boot_media_params *bmp; struct cbfs_props props; const struct region_device *boot_dev; struct region_device fmrd; boot_device_init(); if (cbfs_boot_region_properties(&props)) return; boot_dev = boot_device_ro(); if (boot_dev == NULL) return; bmp = (struct lb_boot_media_params *)lb_new_record(header); bmp->tag = LB_TAG_BOOT_MEDIA_PARAMS; bmp->size = sizeof(*bmp); bmp->cbfs_offset = props.offset; bmp->cbfs_size = props.size; bmp->boot_media_size = region_device_sz(boot_dev); bmp->fmap_offset = ~(uint64_t)0; if (find_fmap_directory(&fmrd) == 0) { bmp->fmap_offset = region_device_offset(&fmrd); } }
static int cbfs_master_header_props(struct cbfs_props *props) { struct cbfs_header header; int32_t offset; const struct region_device *bdev; bdev = boot_device_ro(); rdev_readat(bdev, &offset, CONFIG_ROM_SIZE - sizeof(offset), sizeof(offset)); /* The offset is relative to the end of the media. */ offset += CONFIG_ROM_SIZE; rdev_readat(bdev, &header , offset, sizeof(header)); header.magic = ntohl(header.magic); header.romsize = ntohl(header.romsize); header.bootblocksize = ntohl(header.bootblocksize); header.offset = ntohl(header.offset); if (header.magic != CBFS_HEADER_MAGIC) return -1; props->offset = header.offset; if (CONFIG_ROM_SIZE != header.romsize) props->size = CONFIG_ROM_SIZE; else props->size = header.romsize; props->size -= props->offset; props->size -= header.bootblocksize; props->size = ALIGN_DOWN(props->size, 64); return 0; }
static int init_emu_rom_cbfs_media(struct cbfs_media *media) { boot_device_init(); media->context = (void *)boot_device_ro(); media->open = emu_rom_open; media->close = emu_rom_close; media->map = emu_rom_map; media->unmap = emu_rom_unmap; media->read = emu_rom_read; return 0; }
/* here is a simple SPI debug test, known to fid trouble */ static void simple_spi_test(void) { const struct region_device *boot_dev; int i, amt = 4 * MiB, errors = 0; //u32 *data = (void *)0x40000000; u32 data[1024]; u32 in; boot_device_init(); boot_dev = boot_device_ro(); amt = sizeof(data); if (boot_dev == NULL) { printk(BIOS_SPEW, "Failed to initialize default media.\n"); return; } if (rdev_readat(boot_dev, data, 0, amt) < amt) { printk(BIOS_SPEW, "simple_spi_test fails\n"); return; } for(i = 0; i < amt; i += 4){ if (rdev_readat(boot_dev, &in, i, 4) < 4) { printk(BIOS_SPEW, "simple_spi_test fails at %d\n", i); return; } if (data[i/4] != in){ errors++; printk(BIOS_SPEW, "BAD at %d(%p):\nRAM %08lx\nSPI %08lx\n", i, &data[i/4], (unsigned long)data[i/4], (unsigned long)in); /* reread it to see which is wrong. */ if (rdev_readat(boot_dev, &in, i, 4) < 4) { printk(BIOS_SPEW, "simple_spi_test fails at %d\n", i); return; } printk(BIOS_SPEW, "RTRY at %d(%p):\nRAM %08lx\nSPI %08lx\n", i, &data[i/4], (unsigned long)data[i/4], (unsigned long)in); } } printk(BIOS_SPEW, "%d errors\n", errors); }
int cbfs_boot_locate(struct cbfsf *fh, const char *name, uint32_t *type) { struct region_device rdev; const struct region_device *boot_dev; struct cbfs_props props; if (cbfs_boot_region_properties(&props)) return -1; /* All boot CBFS operations are performed using the RO devie. */ boot_dev = boot_device_ro(); if (boot_dev == NULL) return -1; if (rdev_chain(&rdev, boot_dev, props.offset, props.size)) return -1; return cbfs_locate(fh, &rdev, name, type); }