Merge branch '2021-04-22-assorted-updates'

- Move LMB to Kconfig, improve functionality
- Add partlabel support to more fs cmds
This commit is contained in:
Tom Rini 2021-04-23 12:21:37 -04:00
commit 84baa65dff
29 changed files with 289 additions and 82 deletions

View File

@ -26,6 +26,9 @@
# addresses are __aligned(2)".
--ignore PREFER_ETHER_ADDR_COPY
# ENOSYS is a conventionally used error, even though U-Boot lacks system calls.
--ignore ENOSYS
# A bit shorter of a description is OK with us.
--min-conf-desc-length=2

View File

@ -8,6 +8,4 @@
#define CONFIG_SYS_BOOT_RAMDISK_HIGH
#define CONFIG_LMB
#endif /*__ASM_ARC_CONFIG_H_ */

View File

@ -6,7 +6,6 @@
#ifndef _ASM_CONFIG_H_
#define _ASM_CONFIG_H_
#define CONFIG_LMB
#define CONFIG_SYS_BOOT_RAMDISK_HIGH
#if defined(CONFIG_ARCH_LS1021A) || \

View File

@ -6,7 +6,6 @@
#ifndef _ASM_CONFIG_H_
#define _ASM_CONFIG_H_
#define CONFIG_LMB
#define CONFIG_SYS_BOOT_RAMDISK_HIGH
#endif

View File

@ -6,8 +6,6 @@
#ifndef _ASM_CONFIG_H_
#define _ASM_CONFIG_H_
#define CONFIG_LMB
#define CONFIG_SYS_BOOT_RAMDISK_HIGH
#endif

View File

@ -6,7 +6,6 @@
#ifndef _ASM_CONFIG_H_
#define _ASM_CONFIG_H_
#define CONFIG_LMB
#define CONFIG_SYS_BOOT_RAMDISK_HIGH
#endif

View File

@ -7,6 +7,5 @@
#ifndef _ASM_CONFIG_H_
#define _ASM_CONFIG_H_
#define CONFIG_LMB
#endif

View File

@ -18,7 +18,6 @@
#define HWCONFIG_BUFFER_SIZE 256
#endif
#define CONFIG_LMB
#define CONFIG_SYS_BOOT_RAMDISK_HIGH
#ifndef CONFIG_MAX_MEM_MAPPED

View File

@ -7,7 +7,6 @@
#ifndef _ASM_CONFIG_H_
#define _ASM_CONFIG_H_
#define CONFIG_LMB
#define CONFIG_SYS_BOOT_RAMDISK_HIGH
#endif

View File

@ -8,8 +8,6 @@
#include <asm/processor.h>
#define CONFIG_LMB
/* Timer */
#define CONFIG_SYS_TIMER_COUNTS_DOWN
#define CONFIG_SYS_TIMER_COUNTER (TMU_BASE + 0xc) /* TCNT0 */

View File

@ -6,7 +6,6 @@
#ifndef _ASM_CONFIG_H_
#define _ASM_CONFIG_H_
#define CONFIG_LMB
#define CONFIG_SYS_BOOT_RAMDISK_HIGH
#endif

View File

@ -9,8 +9,6 @@
#include <asm/arch/core.h>
#define CONFIG_LMB
/*
* Make boot parameters available in the MMUv2 virtual memory layout by
* restricting used physical memory to the first 128MB.

View File

@ -170,3 +170,6 @@ CONFIG_WDT_STM32MP=y
CONFIG_ERRNO_STR=y
# CONFIG_HEXDUMP is not set
CONFIG_FDT_FIXUP_PARTITIONS=y
# CONFIG_LMB_USE_MAX_REGIONS is not set
CONFIG_LMB_MEMORY_REGIONS=2
CONFIG_LMB_RESERVED_REGIONS=16

View File

@ -152,3 +152,6 @@ CONFIG_WDT_STM32MP=y
CONFIG_ERRNO_STR=y
# CONFIG_HEXDUMP is not set
CONFIG_FDT_FIXUP_PARTITIONS=y
# CONFIG_LMB_USE_MAX_REGIONS is not set
CONFIG_LMB_MEMORY_REGIONS=2
CONFIG_LMB_RESERVED_REGIONS=16

View File

@ -725,7 +725,7 @@ static int part_get_info_by_dev_and_name(const char *dev_iface,
}
ret = blk_get_device_by_str(dev_iface, dev_str, dev_desc);
if (ret)
if (ret < 0)
goto cleanup;
ret = part_get_info_by_name(*dev_desc, part_str, part_info);

View File

@ -385,7 +385,7 @@ int fs_set_blk_dev(const char *ifname, const char *dev_part_str, int fstype)
}
#endif
part = blk_get_device_part_str(ifname, dev_part_str, &fs_dev_desc,
part = part_get_info_by_dev_and_name_or_num(ifname, dev_part_str, &fs_dev_desc,
&fs_partition, 1);
if (part < 0)
return -1;

View File

@ -34,11 +34,6 @@
*/
#define CONFIG_BOOTP_BOOTFILESIZE
/*
* FDT options
*/
#define CONFIG_LMB
/*
* MEMORY ORGANIZATION
* -Monitor at top of sdram.

View File

@ -34,11 +34,6 @@
*/
#define CONFIG_BOOTP_BOOTFILESIZE
/*
* FDT options
*/
#define CONFIG_LMB
/*
* MEMORY ORGANIZATION
* -Monitor at top of sdram.

View File

@ -22,8 +22,6 @@
#define CONFIG_SYS_TIMER_RATE 1000000
#endif
#define CONFIG_LMB
#define CONFIG_HOST_MAX_DEVICES 4
/*

View File

@ -16,8 +16,6 @@
*/
#define CONFIG_PHYSMEM
#define CONFIG_LMB
#define CONFIG_SYS_BOOTM_LEN (16 << 20)
/* SATA AHCI storage */

View File

@ -434,7 +434,7 @@ typedef struct bootm_headers {
#define BOOTM_STATE_OS_GO (0x00000400)
int state;
#ifdef CONFIG_LMB
#if defined(CONFIG_LMB) && !defined(USE_HOSTCC)
struct lmb lmb; /* for memory mgmt */
#endif
} bootm_headers_t;

View File

@ -12,22 +12,54 @@
* Copyright (C) 2001 Peter Bergner, IBM Corp.
*/
#define MAX_LMB_REGIONS 8
/**
* struct lmb_property - Description of one region.
*
* @base: Base address of the region.
* @size: Size of the region
*/
struct lmb_property {
phys_addr_t base;
phys_size_t size;
};
/**
* struct lmb_region - Description of a set of region.
*
* @cnt: Number of regions.
* @max: Size of the region array, max value of cnt.
* @region: Array of the region properties
*/
struct lmb_region {
unsigned long cnt;
phys_size_t size;
struct lmb_property region[MAX_LMB_REGIONS+1];
unsigned long max;
#if IS_ENABLED(CONFIG_LMB_USE_MAX_REGIONS)
struct lmb_property region[CONFIG_LMB_MAX_REGIONS];
#else
struct lmb_property *region;
#endif
};
/**
* struct lmb - Logical memory block handle.
*
* Clients provide storage for Logical memory block (lmb) handles.
* The content of the structure is managed by the lmb library.
* A lmb struct is initialized by lmb_init() functions.
* The lmb struct is passed to all other lmb APIs.
*
* @memory: Description of memory regions.
* @reserved: Description of reserved regions.
* @memory_regions: Array of the memory regions (statically allocated)
* @reserved_regions: Array of the reserved regions (statically allocated)
*/
struct lmb {
struct lmb_region memory;
struct lmb_region reserved;
#if !IS_ENABLED(CONFIG_LMB_USE_MAX_REGIONS)
struct lmb_property memory_regions[CONFIG_LMB_MEMORY_REGIONS];
struct lmb_property reserved_regions[CONFIG_LMB_RESERVED_REGIONS];
#endif
};
extern void lmb_init(struct lmb *lmb);

View File

@ -230,7 +230,7 @@ int part_get_info_by_name(struct blk_desc *dev_desc,
* @param[in] allow_whole_dev true to allow the user to select partition 0
* (which means the whole device), false to require a valid
* partition number >= 1
* @return 0 on success, or a negative on error
* @return the partition number on success, or negative errno on error
*/
int part_get_info_by_dev_and_name_or_num(const char *dev_iface,
const char *dev_part_str,
@ -275,6 +275,16 @@ static inline int blk_get_device_part_str(const char *ifname,
struct disk_partition *info,
int allow_whole_dev)
{ *dev_desc = NULL; return -1; }
static inline int
part_get_info_by_dev_and_name_or_num(const char *dev_iface,
const char *dev_part_str,
struct blk_desc **dev_desc,
struct disk_partition *part_info,
int allow_whole_dev)
{
*dev_desc = NULL;
return -ENOSYS;
}
#endif
/*

View File

@ -700,6 +700,48 @@ config LIB_ELF
Support basic elf loading/validating functions.
This supports for 32 bit and 64 bit versions.
config LMB
bool "Enable the logical memory blocks library (lmb)"
default y if ARC || ARM || M68K || MICROBLAZE || MIPS || NDS32 || \
NIOS2 || PPC || RISCV || SANDBOX || SH || X86 || XTENSA
help
Support the library logical memory blocks.
config LMB_USE_MAX_REGIONS
bool "Use a commun number of memory and reserved regions in lmb lib"
depends on LMB
default y
help
Define the number of supported memory regions in the library logical
memory blocks.
This feature allow to reduce the lmb library size by using compiler
optimization when LMB_MEMORY_REGIONS == LMB_RESERVED_REGIONS.
config LMB_MAX_REGIONS
int "Number of memory and reserved regions in lmb lib"
depends on LMB && LMB_USE_MAX_REGIONS
default 8
help
Define the number of supported regions, memory and reserved, in the
library logical memory blocks.
config LMB_MEMORY_REGIONS
int "Number of memory regions in lmb lib"
depends on LMB && !LMB_USE_MAX_REGIONS
default 8
help
Define the number of supported memory regions in the library logical
memory blocks.
The minimal value is CONFIG_NR_DRAM_BANKS.
config LMB_RESERVED_REGIONS
int "Number of reserved regions in lmb lib"
depends on LMB && !LMB_USE_MAX_REGIONS
default 8
help
Define the number of supported reserved regions in the library logical
memory blocks.
endmenu
config PHANDLE_CHECK_SEQ

View File

@ -20,8 +20,6 @@ void lmb_dump_all_force(struct lmb *lmb)
printf("lmb_dump_all:\n");
printf(" memory.cnt = 0x%lx\n", lmb->memory.cnt);
printf(" memory.size = 0x%llx\n",
(unsigned long long)lmb->memory.size);
for (i = 0; i < lmb->memory.cnt; i++) {
printf(" memory.reg[0x%lx].base = 0x%llx\n", i,
(unsigned long long)lmb->memory.region[i].base);
@ -30,8 +28,6 @@ void lmb_dump_all_force(struct lmb *lmb)
}
printf("\n reserved.cnt = 0x%lx\n", lmb->reserved.cnt);
printf(" reserved.size = 0x%llx\n",
(unsigned long long)lmb->reserved.size);
for (i = 0; i < lmb->reserved.cnt; i++) {
printf(" reserved.reg[0x%lx].base = 0x%llx\n", i,
(unsigned long long)lmb->reserved.region[i].base);
@ -99,10 +95,17 @@ static void lmb_coalesce_regions(struct lmb_region *rgn, unsigned long r1,
void lmb_init(struct lmb *lmb)
{
#if IS_ENABLED(CONFIG_LMB_USE_MAX_REGIONS)
lmb->memory.max = CONFIG_LMB_MAX_REGIONS;
lmb->reserved.max = CONFIG_LMB_MAX_REGIONS;
#else
lmb->memory.max = CONFIG_LMB_MEMORY_REGIONS;
lmb->reserved.max = CONFIG_LMB_RESERVED_REGIONS;
lmb->memory.region = lmb->memory_regions;
lmb->reserved.region = lmb->reserved_regions;
#endif
lmb->memory.cnt = 0;
lmb->memory.size = 0;
lmb->reserved.cnt = 0;
lmb->reserved.size = 0;
}
static void lmb_reserve_common(struct lmb *lmb, void *fdt_blob)
@ -185,7 +188,7 @@ static long lmb_add_region(struct lmb_region *rgn, phys_addr_t base, phys_size_t
if (coalesced)
return coalesced;
if (rgn->cnt >= MAX_LMB_REGIONS)
if (rgn->cnt >= rgn->max)
return -1;
/* Couldn't coalesce the LMB, so add it to the sorted table. */

View File

@ -948,7 +948,6 @@ CONFIG_LEGACY_BOOTCMD_ENV
CONFIG_LINUX
CONFIG_LINUX_RESET_VEC
CONFIG_LITTLETON_LCD
CONFIG_LMB
CONFIG_LMS283GF05
CONFIG_LOADADDR
CONFIG_LOADCMD

View File

@ -21,26 +21,39 @@ ifneq ($(CONFIG_SANDBOX),)
obj-$(CONFIG_ACPIGEN) += acpi.o
obj-$(CONFIG_ACPIGEN) += acpigen.o
obj-$(CONFIG_ACPIGEN) += acpi_dp.o
obj-$(CONFIG_ADC) += adc.o
obj-$(CONFIG_SOUND) += audio.o
obj-$(CONFIG_AXI) += axi.o
obj-$(CONFIG_BLK) += blk.o
obj-$(CONFIG_BUTTON) += button.o
obj-$(CONFIG_DM_BOOTCOUNT) += bootcount.o
obj-$(CONFIG_CLK) += clk.o clk_ccf.o
obj-$(CONFIG_CPU) += cpu.o
obj-$(CONFIG_CROS_EC) += cros_ec.o
obj-$(CONFIG_DEVRES) += devres.o
obj-$(CONFIG_DMA) += dma.o
obj-$(CONFIG_VIDEO_MIPI_DSI) += dsi_host.o
obj-$(CONFIG_DM_DSA) += dsa.o
obj-$(CONFIG_DM_ETH) += eth.o
ifneq ($(CONFIG_EFI_PARTITION),)
obj-$(CONFIG_FASTBOOT_FLASH_MMC) += fastboot.o
endif
obj-$(CONFIG_FIRMWARE) += firmware.o
obj-$(CONFIG_DM_GPIO) += gpio.o
obj-$(CONFIG_DM_HWSPINLOCK) += hwspinlock.o
obj-$(CONFIG_DM_I2C) += i2c.o
obj-$(CONFIG_SOUND) += i2s.o
obj-y += irq.o
obj-$(CONFIG_CLK_K210_SET_RATE) += k210_pll.o
obj-$(CONFIG_LED) += led.o
obj-$(CONFIG_DM_MAILBOX) += mailbox.o
obj-$(CONFIG_DM_MDIO) += mdio.o
obj-$(CONFIG_DM_MDIO_MUX) += mdio_mux.o
obj-$(CONFIG_MISC) += misc.o
obj-$(CONFIG_DM_MMC) += mmc.o
obj-$(CONFIG_CMD_MUX) += mux-cmd.o
obj-$(CONFIG_MULTIPLEXER) += mux-emul.o
obj-$(CONFIG_MUX_MMIO) += mux-mmio.o
obj-y += fdtdec.o
obj-$(CONFIG_UT_DM) += nop.o
obj-y += ofnode.o
@ -48,58 +61,46 @@ obj-y += ofread.o
obj-y += of_extra.o
obj-$(CONFIG_OSD) += osd.o
obj-$(CONFIG_DM_VIDEO) += panel.o
obj-$(CONFIG_EFI_PARTITION) += part.o
obj-$(CONFIG_DM_PCI) += pci.o
obj-$(CONFIG_P2SB) += p2sb.o
obj-$(CONFIG_PCI_ENDPOINT) += pci_ep.o
obj-$(CONFIG_PCH) += pch.o
obj-$(CONFIG_PHY) += phy.o
ifneq ($(CONFIG_PINMUX),)
obj-$(CONFIG_PINCONF) += pinmux.o
endif
obj-$(CONFIG_POWER_DOMAIN) += power-domain.o
obj-$(CONFIG_ACPI_PMC) += pmc.o
obj-$(CONFIG_DM_PMIC) += pmic.o
obj-$(CONFIG_DM_PWM) += pwm.o
obj-$(CONFIG_QFW) += qfw.o
obj-$(CONFIG_RAM) += ram.o
obj-y += regmap.o
obj-$(CONFIG_REMOTEPROC) += remoteproc.o
obj-$(CONFIG_DM_RESET) += reset.o
obj-$(CONFIG_SYSRESET) += sysreset.o
obj-$(CONFIG_DM_RTC) += rtc.o
obj-$(CONFIG_DM_SPI_FLASH) += sf.o
obj-$(CONFIG_SMEM) += smem.o
obj-$(CONFIG_DM_SPI) += spi.o
obj-y += syscon.o
obj-$(CONFIG_MUX_MMIO) += mux-mmio.o
obj-$(CONFIG_MULTIPLEXER) += mux-emul.o
obj-$(CONFIG_DM_USB) += usb.o
obj-$(CONFIG_DM_PMIC) += pmic.o
obj-$(CONFIG_DM_REGULATOR) += regulator.o
obj-$(CONFIG_TIMER) += timer.o
obj-$(CONFIG_DM_VIDEO) += video.o
obj-$(CONFIG_ADC) += adc.o
obj-$(CONFIG_SPMI) += spmi.o
obj-$(CONFIG_WDT) += wdt.o
obj-$(CONFIG_AXI) += axi.o
obj-$(CONFIG_MISC) += misc.o
obj-$(CONFIG_DM_SERIAL) += serial.o
obj-$(CONFIG_CPU) += cpu.o
obj-$(CONFIG_SOC_DEVICE) += soc.o
obj-$(CONFIG_SOUND) += sound.o
obj-$(CONFIG_SYSINFO) += sysinfo.o
obj-$(CONFIG_TEE) += tee.o
obj-$(CONFIG_VIRTIO_SANDBOX) += virtio.o
obj-$(CONFIG_DMA) += dma.o
obj-$(CONFIG_DM_MDIO) += mdio.o
obj-$(CONFIG_DM_MDIO_MUX) += mdio_mux.o
obj-$(CONFIG_DM_RNG) += rng.o
obj-$(CONFIG_CLK_K210_SET_RATE) += k210_pll.o
obj-$(CONFIG_DM_RTC) += rtc.o
obj-$(CONFIG_SCMI_FIRMWARE) += scmi.o
obj-$(CONFIG_DM_SERIAL) += serial.o
obj-$(CONFIG_DM_SPI_FLASH) += sf.o
obj-$(CONFIG_SIMPLE_BUS) += simple-bus.o
obj-$(CONFIG_SIMPLE_PM_BUS) += simple-pm-bus.o
obj-$(CONFIG_SMEM) += smem.o
obj-$(CONFIG_SOC_DEVICE) += soc.o
obj-$(CONFIG_SOUND) += sound.o
obj-$(CONFIG_DM_SPI) += spi.o
obj-$(CONFIG_SPMI) += spmi.o
obj-y += syscon.o
obj-$(CONFIG_RESET_SYSCON) += syscon-reset.o
obj-$(CONFIG_SCMI_FIRMWARE) += scmi.o
ifneq ($(CONFIG_PINMUX),)
obj-$(CONFIG_PINCONF) += pinmux.o
endif
ifneq ($(CONFIG_EFI_PARTITION),)
obj-$(CONFIG_FASTBOOT_FLASH_MMC) += fastboot.o
endif
obj-$(CONFIG_QFW) += qfw.o
obj-$(CONFIG_SYSINFO) += sysinfo.o
obj-$(CONFIG_TEE) += tee.o
obj-$(CONFIG_TIMER) += timer.o
obj-$(CONFIG_DM_USB) += usb.o
obj-$(CONFIG_DM_VIDEO) += video.o
obj-$(CONFIG_VIRTIO_SANDBOX) += virtio.o
obj-$(CONFIG_WDT) += wdt.o
endif
endif # !SPL

76
test/dm/part.c Normal file
View File

@ -0,0 +1,76 @@
// SPDX-License-Identifier: GPL-2.0+
/*
* Copyright (C) 2020 Sean Anderson <sean.anderson@seco.com>
*/
#include <common.h>
#include <dm.h>
#include <mmc.h>
#include <part.h>
#include <part_efi.h>
#include <dm/test.h>
#include <test/ut.h>
static int dm_test_part(struct unit_test_state *uts)
{
char str_disk_guid[UUID_STR_LEN + 1];
struct blk_desc *mmc_dev_desc;
struct disk_partition part_info;
struct disk_partition parts[2] = {
{
.start = 48, /* GPT data takes up the first 34 blocks or so */
.size = 1,
.name = "test1",
},
{
.start = 49,
.size = 1,
.name = "test2",
},
};
ut_asserteq(1, blk_get_device_by_str("mmc", "1", &mmc_dev_desc));
if (CONFIG_IS_ENABLED(RANDOM_UUID)) {
gen_rand_uuid_str(parts[0].uuid, UUID_STR_FORMAT_STD);
gen_rand_uuid_str(parts[1].uuid, UUID_STR_FORMAT_STD);
gen_rand_uuid_str(str_disk_guid, UUID_STR_FORMAT_STD);
}
ut_assertok(gpt_restore(mmc_dev_desc, str_disk_guid, parts,
ARRAY_SIZE(parts)));
#define test(expected, part_str, whole) \
ut_asserteq(expected, \
part_get_info_by_dev_and_name_or_num("mmc", part_str, \
&mmc_dev_desc, \
&part_info, whole))
test(-ENODEV, "", true);
env_set("bootdevice", "0");
test(0, "", true);
env_set("bootdevice", "1");
test(1, "", false);
test(1, "-", false);
env_set("bootdevice", "");
test(-EPROTONOSUPPORT, "0", false);
test(0, "0", true);
test(0, ":0", true);
test(0, ".0", true);
test(0, ".0:0", true);
test(-EINVAL, "#test1", true);
test(1, "1", false);
test(1, "1", true);
test(-ENOENT, "1:0", false);
test(0, "1:0", true);
test(1, "1:1", false);
test(2, "1:2", false);
test(1, "1.0", false);
test(0, "1.0:0", true);
test(1, "1.0:1", false);
test(2, "1.0:2", false);
test(-EINVAL, "1#bogus", false);
test(1, "1#test1", false);
test(2, "1#test2", false);
return 0;
}
DM_TEST(dm_test_part, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);

View File

@ -659,3 +659,67 @@ static int lib_test_lmb_get_free_size(struct unit_test_state *uts)
DM_TEST(lib_test_lmb_get_free_size,
UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
static int lib_test_lmb_max_regions(struct unit_test_state *uts)
{
const phys_addr_t ram = 0x00000000;
const phys_size_t ram_size = 0x8000000;
const phys_size_t blk_size = 0x10000;
phys_addr_t offset;
struct lmb lmb;
int ret, i;
lmb_init(&lmb);
ut_asserteq(lmb.memory.cnt, 0);
ut_asserteq(lmb.memory.max, 8);
ut_asserteq(lmb.reserved.cnt, 0);
ut_asserteq(lmb.reserved.max, 8);
/* Add 8 memory regions */
for (i = 0; i < 8; i++) {
offset = ram + 2 * i * ram_size;
ret = lmb_add(&lmb, offset, ram_size);
ut_asserteq(ret, 0);
}
ut_asserteq(lmb.memory.cnt, 8);
ut_asserteq(lmb.reserved.cnt, 0);
/* error for the 9th memory regions */
offset = ram + 2 * 8 * ram_size;
ret = lmb_add(&lmb, offset, ram_size);
ut_asserteq(ret, -1);
ut_asserteq(lmb.memory.cnt, 8);
ut_asserteq(lmb.reserved.cnt, 0);
/* reserve 8 regions */
for (i = 0; i < 8; i++) {
offset = ram + 2 * i * blk_size;
ret = lmb_reserve(&lmb, offset, blk_size);
ut_asserteq(ret, 0);
}
ut_asserteq(lmb.memory.cnt, 8);
ut_asserteq(lmb.reserved.cnt, 8);
/* error for the 9th reserved blocks */
offset = ram + 2 * 8 * blk_size;
ret = lmb_reserve(&lmb, offset, blk_size);
ut_asserteq(ret, -1);
ut_asserteq(lmb.memory.cnt, 8);
ut_asserteq(lmb.reserved.cnt, 8);
/* check each regions */
for (i = 0; i < 8; i++)
ut_asserteq(lmb.memory.region[i].base, ram + 2 * i * ram_size);
for (i = 0; i < 8; i++)
ut_asserteq(lmb.reserved.region[i].base, ram + 2 * i * blk_size);
return 0;
}
DM_TEST(lib_test_lmb_max_regions,
UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);