sprintf(name, "%s%c%d", devtype, 'a' + dev_desc->devnum, part_num);
}
+
+int part_get_bootable(struct blk_desc *desc)
+{
+ struct disk_partition info;
+ int p;
+
+ for (p = 1; p <= MAX_SEARCH_PARTITIONS; p++) {
+ int ret;
+
+ ret = part_get_info(desc, p, &info);
+ if (!ret && info.bootable)
+ return p;
+ }
+
+ return 0;
+}
}
#endif
+/**
+ * part_get_bootable() - Find the first bootable partition
+ *
+ * @desc: Block-device descriptor
+ * @return first bootable partition, or 0 if there is none
+ */
+int part_get_bootable(struct blk_desc *desc);
+
struct udevice;
/**
* part_create_block_devices - Create block devices for disk partitions
ut_asserteq(BOOTFLOWST_FS, bflow.state);
bootflow_free(&bflow);
- /* Then more to partition 2 which doesn't exist */
- ut_asserteq(-ENOENT, bootflow_scan_next(&iter, &bflow));
+ /* Then more to partition 2 which exists but is not bootable */
+ ut_asserteq(-EPERM, bootflow_scan_next(&iter, &bflow));
ut_asserteq(2, iter.num_methods);
ut_asserteq(0, iter.cur_method);
ut_asserteq(2, iter.part);
ut_asserteq(0x1e, iter.max_part);
ut_asserteq_str("syslinux", iter.method->name);
ut_asserteq(0, bflow.err);
- ut_asserteq(BOOTFLOWST_MEDIA, bflow.state);
+ ut_asserteq(BOOTFLOWST_PART, bflow.state);
bootflow_free(&bflow);
bootflow_iter_uninit(&iter);
return ret;
}
DM_TEST(dm_test_part, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
+
+static int dm_test_part_bootable(struct unit_test_state *uts)
+{
+ struct blk_desc *desc;
+ struct udevice *dev;
+
+ ut_assertok(uclass_get_device_by_name(UCLASS_BLK, "mmc1.blk", &dev));
+ desc = dev_get_uclass_plat(dev);
+ ut_asserteq(1, part_get_bootable(desc));
+
+ return 0;
+}
+DM_TEST(dm_test_part_bootable, UT_TESTF_SCAN_FDT);
if not os.path.exists(dirname):
os.mkdir(dirname)
-def setup_image(cons, mmc_dev, part_type):
+def setup_image(cons, mmc_dev, part_type, second_part=False):
"""Create a 20MB disk image with a single partition
Args:
cons (ConsoleBase): Console to use
mmc_dev (int): MMC device number to use, e.g. 1
part_type (int): Partition type, e.g. 0xc for FAT32
+ second_part (bool): True to contain a small second partition
Returns:
tuple:
mnt = os.path.join(cons.config.persistent_data_dir, 'mnt')
mkdir_cond(mnt)
+ spec = f'type={part_type:x}, size=18M, bootable'
+ if second_part:
+ spec += '\ntype=c'
+
u_boot_utils.run_and_log(cons, 'qemu-img create %s 20M' % fname)
u_boot_utils.run_and_log(cons, 'sudo sfdisk %s' % fname,
- stdin=f'type={part_type:x}'.encode('utf-8'))
+ stdin=spec.encode('utf-8'))
return fname, mnt
def mount_image(cons, fname, mnt, fstype):
u_boot_utils.run_and_log(cons, f'sudo mkfs.{fstype} {part}')
opts = ''
if fstype == 'vfat':
- opts += ' -o uid={os.getuid()},gid={os.getgid()}'
+ opts += f' -o uid={os.getuid()},gid={os.getgid()}'
u_boot_utils.run_and_log(cons, f'sudo mount -o loop {part} {mnt}{opts}')
u_boot_utils.run_and_log(cons, f'sudo chown {getpass.getuser()} {mnt}')
return loop
def setup_bootflow_image(cons):
"""Create a 20MB disk image with a single FAT partition"""
mmc_dev = 1
- fname, mnt = setup_image(cons, mmc_dev, 0xc)
+ fname, mnt = setup_image(cons, mmc_dev, 0xc, second_part=True)
loop = None
mounted = False