mirror of
https://source.denx.de/u-boot/u-boot.git
synced 2025-08-26 17:11:36 +02:00
Fix pylibfdt warnings and use setuptools to build
Various minor changes to core dm and sandbox -----BEGIN PGP SIGNATURE----- iQFFBAABCgAvFiEEslwAIq+Gp8wWVbYnfxc6PpAIreYFAmNdrCIRHHNqZ0BjaHJv bWl1bS5vcmcACgkQfxc6PpAIreYdDQgAgCbj2sRZaQkYLeXh37EUcvLpJjwIUAyv GFkiPhCEEJ37ll89aRNac8lSJ6ZMG71HDouDfNFdWKJY50TJ35C5Dg4fS8AYudM9 T3n9iRCPdL8KMmmQgznlSXhQ2Na18gy4FSBwGQnZwbggmABtlvkYE5AYHzKunR4+ DehAOdpN6yHtMj0PMaJPM53atjGO2WqftD/96sGJT2RLCnXeBrwjI4zZJYFzXdw3 dDKQN6qE121Jn9YjxysCQQKE+QgVC3hR5B5mFscox+8pAB87CTR9FfIBenqoZ2dg wDHWJcPMq8rEgdKdK2aXtKbLY/Rj4kMxEZCsjPWt2v1U3AoVZx+0/g== =VbI+ -----END PGP SIGNATURE----- Merge tag 'dm-pull-29oct22' of https://source.denx.de/u-boot/custodians/u-boot-dm Fix pylibfdt warnings and use setuptools to build Various minor changes to core dm and sandbox
This commit is contained in:
commit
6f02819cce
@ -13,7 +13,7 @@ config SYS_CPU
|
|||||||
config SANDBOX64
|
config SANDBOX64
|
||||||
bool "Use 64-bit addresses"
|
bool "Use 64-bit addresses"
|
||||||
select PHYS_64BIT
|
select PHYS_64BIT
|
||||||
select HOST_64BIT
|
depends on HOST_64BIT
|
||||||
|
|
||||||
config SANDBOX_RAM_SIZE_MB
|
config SANDBOX_RAM_SIZE_MB
|
||||||
int "RAM size in MiB"
|
int "RAM size in MiB"
|
||||||
@ -41,23 +41,11 @@ config SYS_CONFIG_NAME
|
|||||||
default "sandbox_spl" if SANDBOX_SPL
|
default "sandbox_spl" if SANDBOX_SPL
|
||||||
default "sandbox" if !SANDBOX_SPL
|
default "sandbox" if !SANDBOX_SPL
|
||||||
|
|
||||||
choice
|
|
||||||
prompt "Run sandbox on 32/64-bit host"
|
|
||||||
default HOST_64BIT
|
|
||||||
help
|
|
||||||
Sandbox can be built on 32-bit and 64-bit hosts.
|
|
||||||
The default is to build on a 64-bit host and run
|
|
||||||
on a 64-bit host. If you want to run sandbox on
|
|
||||||
a 32-bit host, change it here.
|
|
||||||
|
|
||||||
config HOST_32BIT
|
config HOST_32BIT
|
||||||
bool "32-bit host"
|
def_bool ! $(cc-define,_LP64)
|
||||||
depends on !PHYS_64BIT
|
|
||||||
|
|
||||||
config HOST_64BIT
|
config HOST_64BIT
|
||||||
bool "64-bit host"
|
def_bool $(cc-define,_LP64)
|
||||||
|
|
||||||
endchoice
|
|
||||||
|
|
||||||
config SANDBOX_CRASH_RESET
|
config SANDBOX_CRASH_RESET
|
||||||
bool "Reset on crash"
|
bool "Reset on crash"
|
||||||
|
@ -49,12 +49,17 @@ longjmp:
|
|||||||
xchgl %eax, %edx
|
xchgl %eax, %edx
|
||||||
#else
|
#else
|
||||||
movl 4(%esp), %edx /* jmp_ptr address */
|
movl 4(%esp), %edx /* jmp_ptr address */
|
||||||
|
movl 8(%esp), %eax /* Return value */
|
||||||
#endif
|
#endif
|
||||||
movl (%edx), %ebx
|
movl (%edx), %ebx
|
||||||
movl 4(%edx), %esp
|
movl 4(%edx), %esp
|
||||||
movl 8(%edx), %ebp
|
movl 8(%edx), %ebp
|
||||||
movl 12(%edx), %esi
|
movl 12(%edx), %esi
|
||||||
movl 16(%edx), %edi
|
movl 16(%edx), %edi
|
||||||
|
test %eax, %eax
|
||||||
|
jnz nz
|
||||||
|
inc %eax
|
||||||
|
nz:
|
||||||
jmp *20(%edx)
|
jmp *20(%edx)
|
||||||
|
|
||||||
.size longjmp, .-longjmp
|
.size longjmp, .-longjmp
|
||||||
|
@ -34,7 +34,9 @@ struct jmp_buf_data {
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int setjmp(struct jmp_buf_data *jmp_buf);
|
typedef struct jmp_buf_data jmp_buf[1];
|
||||||
void longjmp(struct jmp_buf_data *jmp_buf, int val);
|
|
||||||
|
int setjmp(jmp_buf env);
|
||||||
|
void longjmp(jmp_buf env, int val);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -129,7 +129,7 @@ int extension_board_scan(struct list_head *extension_list)
|
|||||||
snprintf(extension->name, sizeof(extension->name), "extension board %d", i);
|
snprintf(extension->name, sizeof(extension->name), "extension board %d", i);
|
||||||
snprintf(extension->owner, sizeof(extension->owner), "sandbox");
|
snprintf(extension->owner, sizeof(extension->owner), "sandbox");
|
||||||
snprintf(extension->version, sizeof(extension->version), "1.1");
|
snprintf(extension->version, sizeof(extension->version), "1.1");
|
||||||
snprintf(extension->other, sizeof(extension->other), "Fictionnal extension board");
|
snprintf(extension->other, sizeof(extension->other), "Fictional extension board");
|
||||||
list_add_tail(&extension->list, extension_list);
|
list_add_tail(&extension->list, extension_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -23,18 +23,15 @@ static int do_virtio(struct cmd_tbl *cmdtp, int flag, int argc,
|
|||||||
* device_probe() for children (i.e. virtio devices)
|
* device_probe() for children (i.e. virtio devices)
|
||||||
*/
|
*/
|
||||||
struct udevice *bus, *child;
|
struct udevice *bus, *child;
|
||||||
int ret;
|
|
||||||
|
|
||||||
ret = uclass_first_device(UCLASS_VIRTIO, &bus);
|
uclass_first_device(UCLASS_VIRTIO, &bus);
|
||||||
if (ret)
|
if (!bus)
|
||||||
return CMD_RET_FAILURE;
|
return CMD_RET_FAILURE;
|
||||||
|
|
||||||
while (bus) {
|
while (bus) {
|
||||||
device_foreach_child_probe(child, bus)
|
device_foreach_child_probe(child, bus)
|
||||||
;
|
;
|
||||||
ret = uclass_next_device(&bus);
|
uclass_next_device(&bus);
|
||||||
if (ret)
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return CMD_RET_SUCCESS;
|
return CMD_RET_SUCCESS;
|
||||||
|
@ -54,6 +54,7 @@ CONFIG_CMD_PCI=y
|
|||||||
CONFIG_CMD_READ=y
|
CONFIG_CMD_READ=y
|
||||||
CONFIG_CMD_REMOTEPROC=y
|
CONFIG_CMD_REMOTEPROC=y
|
||||||
CONFIG_CMD_SPI=y
|
CONFIG_CMD_SPI=y
|
||||||
|
CONFIG_CMD_TEMPERATURE=y
|
||||||
CONFIG_CMD_USB=y
|
CONFIG_CMD_USB=y
|
||||||
CONFIG_CMD_CAT=y
|
CONFIG_CMD_CAT=y
|
||||||
CONFIG_CMD_WDT=y
|
CONFIG_CMD_WDT=y
|
||||||
@ -220,6 +221,7 @@ CONFIG_SYSINFO=y
|
|||||||
CONFIG_SYSINFO_SANDBOX=y
|
CONFIG_SYSINFO_SANDBOX=y
|
||||||
CONFIG_SYSINFO_GPIO=y
|
CONFIG_SYSINFO_GPIO=y
|
||||||
CONFIG_SYSRESET=y
|
CONFIG_SYSRESET=y
|
||||||
|
CONFIG_DM_THERMAL=y
|
||||||
CONFIG_TIMER=y
|
CONFIG_TIMER=y
|
||||||
CONFIG_TIMER_EARLY=y
|
CONFIG_TIMER_EARLY=y
|
||||||
CONFIG_SANDBOX_TIMER=y
|
CONFIG_SANDBOX_TIMER=y
|
||||||
|
@ -62,7 +62,7 @@ what you need. U-Boot automatically includes these files: see :ref:`dttweaks`.
|
|||||||
Here are some things you might need to consider:
|
Here are some things you might need to consider:
|
||||||
|
|
||||||
1. The serial driver itself needs to be present before relocation, so that the
|
1. The serial driver itself needs to be present before relocation, so that the
|
||||||
U-Boot banner appears. Make sure it has a u-boot,pre-reloc tag in the device
|
U-Boot banner appears. Make sure it has a u-boot,dm-pre-reloc tag in the device
|
||||||
tree, so that the serial driver is bound when U-Boot starts.
|
tree, so that the serial driver is bound when U-Boot starts.
|
||||||
|
|
||||||
For example, on iMX8::
|
For example, on iMX8::
|
||||||
@ -79,7 +79,7 @@ Here are some things you might need to consider:
|
|||||||
};
|
};
|
||||||
|
|
||||||
2. If your serial port requires a particular pinmux configuration, you may need
|
2. If your serial port requires a particular pinmux configuration, you may need
|
||||||
a pinctrl driver. This needs to have a u-boot,pre-reloc tag also. Take care
|
a pinctrl driver. This needs to have a u-boot,dm-pre-reloc tag also. Take care
|
||||||
that any subnodes have the same tag, if they are needed to make the correct
|
that any subnodes have the same tag, if they are needed to make the correct
|
||||||
pinctrl available.
|
pinctrl available.
|
||||||
|
|
||||||
|
@ -350,6 +350,20 @@ config SPL_OF_TRANSLATE
|
|||||||
used for the address translation. This function is faster and
|
used for the address translation. This function is faster and
|
||||||
smaller in size than fdt_translate_address().
|
smaller in size than fdt_translate_address().
|
||||||
|
|
||||||
|
config TPL_OF_TRANSLATE
|
||||||
|
bool "Translate addresses using fdt_translate_address in TPL"
|
||||||
|
depends on TPL_DM && TPL_OF_CONTROL
|
||||||
|
help
|
||||||
|
If this option is enabled, the reg property will be translated
|
||||||
|
using the fdt_translate_address() function. This is necessary
|
||||||
|
on some platforms (e.g. MVEBU) using complex "ranges"
|
||||||
|
properties in many nodes. As this translation is not handled
|
||||||
|
correctly in the default simple_bus_translate() function.
|
||||||
|
|
||||||
|
If this option is not enabled, simple_bus_translate() will be
|
||||||
|
used for the address translation. This function is faster and
|
||||||
|
smaller in size than fdt_translate_address()
|
||||||
|
|
||||||
config VPL_OF_TRANSLATE
|
config VPL_OF_TRANSLATE
|
||||||
bool "Translate addresses using fdt_translate_address in SPL"
|
bool "Translate addresses using fdt_translate_address in SPL"
|
||||||
depends on SPL_DM && VPL_OF_CONTROL
|
depends on SPL_DM && VPL_OF_CONTROL
|
||||||
|
@ -222,6 +222,7 @@ int lists_bind_fdt(struct udevice *parent, ofnode node, struct udevice **devp,
|
|||||||
log_debug(" - attempt to match compatible string '%s'\n",
|
log_debug(" - attempt to match compatible string '%s'\n",
|
||||||
compat);
|
compat);
|
||||||
|
|
||||||
|
id = NULL;
|
||||||
for (entry = driver; entry != driver + n_ents; entry++) {
|
for (entry = driver; entry != driver + n_ents; entry++) {
|
||||||
if (drv) {
|
if (drv) {
|
||||||
if (drv != entry)
|
if (drv != entry)
|
||||||
@ -250,7 +251,8 @@ int lists_bind_fdt(struct udevice *parent, ofnode node, struct udevice **devp,
|
|||||||
entry->name, entry->of_match->compatible,
|
entry->name, entry->of_match->compatible,
|
||||||
id->compatible);
|
id->compatible);
|
||||||
ret = device_bind_with_driver_data(parent, entry, name,
|
ret = device_bind_with_driver_data(parent, entry, name,
|
||||||
id->data, node, &dev);
|
id ? id->data : 0, node,
|
||||||
|
&dev);
|
||||||
if (ret == -ENODEV) {
|
if (ret == -ENODEV) {
|
||||||
log_debug("Driver '%s' refuses to bind\n", entry->name);
|
log_debug("Driver '%s' refuses to bind\n", entry->name);
|
||||||
continue;
|
continue;
|
||||||
|
@ -574,28 +574,34 @@ int uclass_get_device_by_phandle(enum uclass_id id, struct udevice *parent,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int uclass_first_device(enum uclass_id id, struct udevice **devp)
|
/*
|
||||||
|
* Starting from the given device @dev, return pointer to the first device in
|
||||||
|
* the uclass that probes successfully in @devp.
|
||||||
|
*/
|
||||||
|
static void _uclass_next_device(struct udevice *dev, struct udevice **devp)
|
||||||
|
{
|
||||||
|
for (; dev; uclass_find_next_device(&dev)) {
|
||||||
|
if (!device_probe(dev))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
*devp = dev;
|
||||||
|
}
|
||||||
|
|
||||||
|
void uclass_first_device(enum uclass_id id, struct udevice **devp)
|
||||||
{
|
{
|
||||||
struct udevice *dev;
|
struct udevice *dev;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
*devp = NULL;
|
|
||||||
ret = uclass_find_first_device(id, &dev);
|
ret = uclass_find_first_device(id, &dev);
|
||||||
if (!dev)
|
_uclass_next_device(dev, devp);
|
||||||
return 0;
|
|
||||||
return uclass_get_device_tail(dev, ret, devp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int uclass_next_device(struct udevice **devp)
|
void uclass_next_device(struct udevice **devp)
|
||||||
{
|
{
|
||||||
struct udevice *dev = *devp;
|
struct udevice *dev = *devp;
|
||||||
int ret;
|
|
||||||
|
|
||||||
*devp = NULL;
|
uclass_find_next_device(&dev);
|
||||||
ret = uclass_find_next_device(&dev);
|
_uclass_next_device(dev, devp);
|
||||||
if (!dev)
|
|
||||||
return 0;
|
|
||||||
return uclass_get_device_tail(dev, ret, devp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int uclass_first_device_err(enum uclass_id id, struct udevice **devp)
|
int uclass_first_device_err(enum uclass_id id, struct udevice **devp)
|
||||||
|
@ -210,10 +210,9 @@ int dma_get_cfg(struct dma *dma, u32 cfg_id, void **cfg_data)
|
|||||||
int dma_get_device(u32 transfer_type, struct udevice **devp)
|
int dma_get_device(u32 transfer_type, struct udevice **devp)
|
||||||
{
|
{
|
||||||
struct udevice *dev;
|
struct udevice *dev;
|
||||||
int ret;
|
|
||||||
|
|
||||||
for (ret = uclass_first_device(UCLASS_DMA, &dev); dev && !ret;
|
for (uclass_first_device(UCLASS_DMA, &dev); dev;
|
||||||
ret = uclass_next_device(&dev)) {
|
uclass_next_device(&dev)) {
|
||||||
struct dma_dev_priv *uc_priv;
|
struct dma_dev_priv *uc_priv;
|
||||||
|
|
||||||
uc_priv = dev_get_uclass_priv(dev);
|
uc_priv = dev_get_uclass_priv(dev);
|
||||||
@ -229,7 +228,7 @@ int dma_get_device(u32 transfer_type, struct udevice **devp)
|
|||||||
|
|
||||||
*devp = dev;
|
*devp = dev;
|
||||||
|
|
||||||
return ret;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int dma_memcpy(void *dst, void *src, size_t len)
|
int dma_memcpy(void *dst, void *src, size_t len)
|
||||||
|
@ -59,11 +59,10 @@ static int gpio_to_device(unsigned int gpio, struct gpio_desc *desc)
|
|||||||
{
|
{
|
||||||
struct gpio_dev_priv *uc_priv;
|
struct gpio_dev_priv *uc_priv;
|
||||||
struct udevice *dev;
|
struct udevice *dev;
|
||||||
int ret;
|
|
||||||
|
|
||||||
for (ret = uclass_first_device(UCLASS_GPIO, &dev);
|
for (uclass_first_device(UCLASS_GPIO, &dev);
|
||||||
dev;
|
dev;
|
||||||
ret = uclass_next_device(&dev)) {
|
uclass_next_device(&dev)) {
|
||||||
uc_priv = dev_get_uclass_priv(dev);
|
uc_priv = dev_get_uclass_priv(dev);
|
||||||
if (gpio >= uc_priv->gpio_base &&
|
if (gpio >= uc_priv->gpio_base &&
|
||||||
gpio < uc_priv->gpio_base + uc_priv->gpio_count) {
|
gpio < uc_priv->gpio_base + uc_priv->gpio_count) {
|
||||||
@ -73,7 +72,7 @@ static int gpio_to_device(unsigned int gpio, struct gpio_desc *desc)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* No such GPIO */
|
/* No such GPIO */
|
||||||
return ret ? ret : -ENOENT;
|
return -ENOENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if CONFIG_IS_ENABLED(DM_GPIO_LOOKUP_LABEL)
|
#if CONFIG_IS_ENABLED(DM_GPIO_LOOKUP_LABEL)
|
||||||
@ -91,15 +90,13 @@ static int gpio_to_device(unsigned int gpio, struct gpio_desc *desc)
|
|||||||
static int dm_gpio_lookup_label(const char *name,
|
static int dm_gpio_lookup_label(const char *name,
|
||||||
struct gpio_dev_priv *uc_priv, ulong *offset)
|
struct gpio_dev_priv *uc_priv, ulong *offset)
|
||||||
{
|
{
|
||||||
int len;
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
*offset = -1;
|
*offset = -1;
|
||||||
len = strlen(name);
|
|
||||||
for (i = 0; i < uc_priv->gpio_count; i++) {
|
for (i = 0; i < uc_priv->gpio_count; i++) {
|
||||||
if (!uc_priv->name[i])
|
if (!uc_priv->name[i])
|
||||||
continue;
|
continue;
|
||||||
if (!strncmp(name, uc_priv->name[i], len)) {
|
if (!strcmp(name, uc_priv->name[i])) {
|
||||||
*offset = i;
|
*offset = i;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -121,12 +118,11 @@ int dm_gpio_lookup_name(const char *name, struct gpio_desc *desc)
|
|||||||
struct udevice *dev;
|
struct udevice *dev;
|
||||||
ulong offset;
|
ulong offset;
|
||||||
int numeric;
|
int numeric;
|
||||||
int ret;
|
|
||||||
|
|
||||||
numeric = isdigit(*name) ? dectoul(name, NULL) : -1;
|
numeric = isdigit(*name) ? dectoul(name, NULL) : -1;
|
||||||
for (ret = uclass_first_device(UCLASS_GPIO, &dev);
|
for (uclass_first_device(UCLASS_GPIO, &dev);
|
||||||
dev;
|
dev;
|
||||||
ret = uclass_next_device(&dev)) {
|
uclass_next_device(&dev)) {
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
uc_priv = dev_get_uclass_priv(dev);
|
uc_priv = dev_get_uclass_priv(dev);
|
||||||
@ -154,7 +150,7 @@ int dm_gpio_lookup_name(const char *name, struct gpio_desc *desc)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!dev)
|
if (!dev)
|
||||||
return ret ? ret : -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
gpio_desc_init(desc, dev, offset);
|
gpio_desc_init(desc, dev, offset);
|
||||||
|
|
||||||
|
@ -1211,7 +1211,6 @@ static int pci_bridge_write_config(struct udevice *bus, pci_dev_t bdf,
|
|||||||
static int skip_to_next_device(struct udevice *bus, struct udevice **devp)
|
static int skip_to_next_device(struct udevice *bus, struct udevice **devp)
|
||||||
{
|
{
|
||||||
struct udevice *dev;
|
struct udevice *dev;
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Scan through all the PCI controllers. On x86 there will only be one
|
* Scan through all the PCI controllers. On x86 there will only be one
|
||||||
@ -1223,9 +1222,7 @@ static int skip_to_next_device(struct udevice *bus, struct udevice **devp)
|
|||||||
*devp = dev;
|
*devp = dev;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
ret = uclass_next_device(&bus);
|
uclass_next_device(&bus);
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -1235,7 +1232,6 @@ int pci_find_next_device(struct udevice **devp)
|
|||||||
{
|
{
|
||||||
struct udevice *child = *devp;
|
struct udevice *child = *devp;
|
||||||
struct udevice *bus = child->parent;
|
struct udevice *bus = child->parent;
|
||||||
int ret;
|
|
||||||
|
|
||||||
/* First try all the siblings */
|
/* First try all the siblings */
|
||||||
*devp = NULL;
|
*devp = NULL;
|
||||||
@ -1248,9 +1244,7 @@ int pci_find_next_device(struct udevice **devp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* We ran out of siblings. Try the next bus */
|
/* We ran out of siblings. Try the next bus */
|
||||||
ret = uclass_next_device(&bus);
|
uclass_next_device(&bus);
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
return bus ? skip_to_next_device(bus, devp) : 0;
|
return bus ? skip_to_next_device(bus, devp) : 0;
|
||||||
}
|
}
|
||||||
@ -1258,12 +1252,9 @@ int pci_find_next_device(struct udevice **devp)
|
|||||||
int pci_find_first_device(struct udevice **devp)
|
int pci_find_first_device(struct udevice **devp)
|
||||||
{
|
{
|
||||||
struct udevice *bus;
|
struct udevice *bus;
|
||||||
int ret;
|
|
||||||
|
|
||||||
*devp = NULL;
|
*devp = NULL;
|
||||||
ret = uclass_first_device(UCLASS_PCI, &bus);
|
uclass_first_device(UCLASS_PCI, &bus);
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
return skip_to_next_device(bus, devp);
|
return skip_to_next_device(bus, devp);
|
||||||
}
|
}
|
||||||
@ -1777,10 +1768,9 @@ int pci_sriov_init(struct udevice *pdev, int vf_en)
|
|||||||
|
|
||||||
bdf = dm_pci_get_bdf(pdev);
|
bdf = dm_pci_get_bdf(pdev);
|
||||||
|
|
||||||
pci_get_bus(PCI_BUS(bdf), &bus);
|
ret = pci_get_bus(PCI_BUS(bdf), &bus);
|
||||||
|
if (ret)
|
||||||
if (!bus)
|
return ret;
|
||||||
return -ENODEV;
|
|
||||||
|
|
||||||
bdf += PCI_BDF(0, 0, vf_offset);
|
bdf += PCI_BDF(0, 0, vf_offset);
|
||||||
|
|
||||||
|
@ -16,7 +16,15 @@ struct sysinfo_priv {
|
|||||||
|
|
||||||
int sysinfo_get(struct udevice **devp)
|
int sysinfo_get(struct udevice **devp)
|
||||||
{
|
{
|
||||||
return uclass_first_device_err(UCLASS_SYSINFO, devp);
|
int ret = uclass_first_device_err(UCLASS_SYSINFO, devp);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* There is some very dodgy error handling in gazerbeam,
|
||||||
|
* do not return a device on error.
|
||||||
|
*/
|
||||||
|
if (ret)
|
||||||
|
*devp = NULL;
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int sysinfo_detect(struct udevice *dev)
|
int sysinfo_detect(struct udevice *dev)
|
||||||
|
@ -36,15 +36,10 @@ int w1_bus_find_dev(const struct udevice *bus, u64 id, struct udevice
|
|||||||
{
|
{
|
||||||
struct udevice *dev;
|
struct udevice *dev;
|
||||||
u8 family = id & 0xff;
|
u8 family = id & 0xff;
|
||||||
int ret;
|
|
||||||
|
|
||||||
for (ret = uclass_first_device(UCLASS_W1_EEPROM, &dev);
|
for (uclass_first_device(UCLASS_W1_EEPROM, &dev);
|
||||||
!ret && dev;
|
dev;
|
||||||
uclass_next_device(&dev)) {
|
uclass_next_device(&dev)) {
|
||||||
if (ret || !dev) {
|
|
||||||
debug("cannot find w1 eeprom dev\n");
|
|
||||||
return -ENODEV;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dev_get_driver_data(dev) == family) {
|
if (dev_get_driver_data(dev) == family) {
|
||||||
*devp = dev;
|
*devp = dev;
|
||||||
|
@ -184,8 +184,8 @@ int device_of_to_plat(struct udevice *dev);
|
|||||||
/**
|
/**
|
||||||
* device_probe() - Probe a device, activating it
|
* device_probe() - Probe a device, activating it
|
||||||
*
|
*
|
||||||
* Activate a device so that it is ready for use. All its parents are probed
|
* Activate a device (if not yet activated) so that it is ready for use.
|
||||||
* first.
|
* All its parents are probed first.
|
||||||
*
|
*
|
||||||
* @dev: Pointer to device to probe
|
* @dev: Pointer to device to probe
|
||||||
* Return: 0 if OK, -ve on error
|
* Return: 0 if OK, -ve on error
|
||||||
|
@ -73,6 +73,7 @@ int lists_bind_fdt(struct udevice *parent, ofnode node, struct udevice **devp,
|
|||||||
* @drv_name: Name of driver to attach to this parent
|
* @drv_name: Name of driver to attach to this parent
|
||||||
* @dev_name: Name of the new device thus created
|
* @dev_name: Name of the new device thus created
|
||||||
* @devp: If non-NULL, returns the newly bound device
|
* @devp: If non-NULL, returns the newly bound device
|
||||||
|
* Return: 0 if OK, -ve on error
|
||||||
*/
|
*/
|
||||||
int device_bind_driver(struct udevice *parent, const char *drv_name,
|
int device_bind_driver(struct udevice *parent, const char *drv_name,
|
||||||
const char *dev_name, struct udevice **devp);
|
const char *dev_name, struct udevice **devp);
|
||||||
@ -88,6 +89,7 @@ int device_bind_driver(struct udevice *parent, const char *drv_name,
|
|||||||
* @dev_name: Name of the new device thus created
|
* @dev_name: Name of the new device thus created
|
||||||
* @node: Device tree node
|
* @node: Device tree node
|
||||||
* @devp: If non-NULL, returns the newly bound device
|
* @devp: If non-NULL, returns the newly bound device
|
||||||
|
* Return: 0 if OK, -ve on error
|
||||||
*/
|
*/
|
||||||
int device_bind_driver_to_node(struct udevice *parent, const char *drv_name,
|
int device_bind_driver_to_node(struct udevice *parent, const char *drv_name,
|
||||||
const char *dev_name, ofnode node,
|
const char *dev_name, ofnode node,
|
||||||
|
@ -320,37 +320,37 @@ int uclass_get_device_by_driver(enum uclass_id id, const struct driver *drv,
|
|||||||
* uclass_first_device() - Get the first device in a uclass
|
* uclass_first_device() - Get the first device in a uclass
|
||||||
*
|
*
|
||||||
* The device returned is probed if necessary, and ready for use
|
* The device returned is probed if necessary, and ready for use
|
||||||
|
* Devices that fail to probe are skipped
|
||||||
*
|
*
|
||||||
* This function is useful to start iterating through a list of devices which
|
* This function is useful to start iterating through a list of devices which
|
||||||
* are functioning correctly and can be probed.
|
* are functioning correctly and can be probed.
|
||||||
*
|
*
|
||||||
* @id: Uclass ID to look up
|
* @id: Uclass ID to look up
|
||||||
* @devp: Returns pointer to the first device in that uclass if no error
|
* @devp: Returns pointer to the first device in that uclass if no error
|
||||||
* occurred, or NULL if there is no first device, or an error occurred with
|
* occurred, or NULL if there is no usable device
|
||||||
* that device.
|
|
||||||
* Return: 0 if OK (found or not found), other -ve on error
|
|
||||||
*/
|
*/
|
||||||
int uclass_first_device(enum uclass_id id, struct udevice **devp);
|
void uclass_first_device(enum uclass_id id, struct udevice **devp);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* uclass_next_device() - Get the next device in a uclass
|
* uclass_next_device() - Get the next device in a uclass
|
||||||
*
|
*
|
||||||
* The device returned is probed if necessary, and ready for use
|
* The device returned is probed if necessary, and ready for use
|
||||||
|
* Devices that fail to probe are skipped
|
||||||
*
|
*
|
||||||
* This function is useful to iterate through a list of devices which
|
* This function is useful to iterate through a list of devices which
|
||||||
* are functioning correctly and can be probed.
|
* are functioning correctly and can be probed.
|
||||||
*
|
*
|
||||||
* @devp: On entry, pointer to device to lookup. On exit, returns pointer
|
* @devp: On entry, pointer to device to lookup. On exit, returns pointer
|
||||||
* to the next device in the uclass if no error occurred, or NULL if there is
|
* to the next device in the uclass if no error occurred, or NULL if there is
|
||||||
* no next device, or an error occurred with that next device.
|
* no next device
|
||||||
* Return: 0 if OK (found or not found), other -ve on error
|
|
||||||
*/
|
*/
|
||||||
int uclass_next_device(struct udevice **devp);
|
void uclass_next_device(struct udevice **devp);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* uclass_first_device_err() - Get the first device in a uclass
|
* uclass_first_device_err() - Get the first device in a uclass
|
||||||
*
|
*
|
||||||
* The device returned is probed if necessary, and ready for use
|
* The device returned is probed if necessary, and ready for use if no error is
|
||||||
|
* returned
|
||||||
*
|
*
|
||||||
* @id: Uclass ID to look up
|
* @id: Uclass ID to look up
|
||||||
* @devp: Returns pointer to the first device in that uclass, or NULL if none
|
* @devp: Returns pointer to the first device in that uclass, or NULL if none
|
||||||
@ -361,7 +361,8 @@ int uclass_first_device_err(enum uclass_id id, struct udevice **devp);
|
|||||||
/**
|
/**
|
||||||
* uclass_next_device_err() - Get the next device in a uclass
|
* uclass_next_device_err() - Get the next device in a uclass
|
||||||
*
|
*
|
||||||
* The device returned is probed if necessary, and ready for use
|
* The device returned is probed if necessary, and ready for use if no error is
|
||||||
|
* returned
|
||||||
*
|
*
|
||||||
* @devp: On entry, pointer to device to lookup. On exit, returns pointer
|
* @devp: On entry, pointer to device to lookup. On exit, returns pointer
|
||||||
* to the next device in the uclass if no error occurred, or NULL if
|
* to the next device in the uclass if no error occurred, or NULL if
|
||||||
@ -373,7 +374,8 @@ int uclass_next_device_err(struct udevice **devp);
|
|||||||
/**
|
/**
|
||||||
* uclass_first_device_check() - Get the first device in a uclass
|
* uclass_first_device_check() - Get the first device in a uclass
|
||||||
*
|
*
|
||||||
* The device returned is probed if necessary, and ready for use
|
* The device returned is probed if necessary, and ready for use if no error is
|
||||||
|
* returned
|
||||||
*
|
*
|
||||||
* This function is useful to start iterating through a list of devices which
|
* This function is useful to start iterating through a list of devices which
|
||||||
* are functioning correctly and can be probed.
|
* are functioning correctly and can be probed.
|
||||||
@ -389,7 +391,8 @@ int uclass_first_device_check(enum uclass_id id, struct udevice **devp);
|
|||||||
/**
|
/**
|
||||||
* uclass_next_device_check() - Get the next device in a uclass
|
* uclass_next_device_check() - Get the next device in a uclass
|
||||||
*
|
*
|
||||||
* The device returned is probed if necessary, and ready for use
|
* The device returned is probed if necessary, and ready for use if no error is
|
||||||
|
* returned
|
||||||
*
|
*
|
||||||
* This function is useful to start iterating through a list of devices which
|
* This function is useful to start iterating through a list of devices which
|
||||||
* are functioning correctly and can be probed.
|
* are functioning correctly and can be probed.
|
||||||
|
@ -243,8 +243,6 @@ int fdt_increase_size(void *fdt, int add_len);
|
|||||||
|
|
||||||
int fdt_delete_disabled_nodes(void *blob);
|
int fdt_delete_disabled_nodes(void *blob);
|
||||||
|
|
||||||
int fdt_fixup_nor_flash_size(void *blob);
|
|
||||||
|
|
||||||
struct node_info;
|
struct node_info;
|
||||||
#if defined(CONFIG_FDT_FIXUP_PARTITIONS)
|
#if defined(CONFIG_FDT_FIXUP_PARTITIONS)
|
||||||
void fdt_fixup_mtdparts(void *fdt, const struct node_info *node_info,
|
void fdt_fixup_mtdparts(void *fdt, const struct node_info *node_info,
|
||||||
|
@ -957,7 +957,7 @@ int pci_bus_find_devfn(const struct udevice *bus, pci_dev_t find_devfn,
|
|||||||
/**
|
/**
|
||||||
* pci_find_first_device() - return the first available PCI device
|
* pci_find_first_device() - return the first available PCI device
|
||||||
*
|
*
|
||||||
* This function and pci_find_first_device() allow iteration through all
|
* This function and pci_find_next_device() allow iteration through all
|
||||||
* available PCI devices on all buses. Assuming there are any, this will
|
* available PCI devices on all buses. Assuming there are any, this will
|
||||||
* return the first one.
|
* return the first one.
|
||||||
*
|
*
|
||||||
|
@ -22,6 +22,10 @@ success = $(if-success,$(1),y,n)
|
|||||||
# Return y if the compiler supports <flag>, n otherwise
|
# Return y if the compiler supports <flag>, n otherwise
|
||||||
cc-option = $(success,$(CC) -Werror $(1) -E -x c /dev/null -o /dev/null)
|
cc-option = $(success,$(CC) -Werror $(1) -E -x c /dev/null -o /dev/null)
|
||||||
|
|
||||||
|
# $(cc-define,<macro>)
|
||||||
|
# Return y if the compiler defines <macro>, n otherwise
|
||||||
|
cc-define = $(success,$(CC) -dM -E -x c /dev/null | grep -q '^#define \<$(1)\>')
|
||||||
|
|
||||||
# $(ld-option,<flag>)
|
# $(ld-option,<flag>)
|
||||||
# Return y if the linker supports <flag>, n otherwise
|
# Return y if the linker supports <flag>, n otherwise
|
||||||
ld-option = $(success,$(LD) -v $(1))
|
ld-option = $(success,$(LD) -v $(1))
|
||||||
|
106
scripts/dtc/README
Normal file
106
scripts/dtc/README
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
The source tree contains the Device Tree Compiler (dtc) toolchain for
|
||||||
|
working with device tree source and binary files and also libfdt, a
|
||||||
|
utility library for reading and manipulating the binary format.
|
||||||
|
|
||||||
|
DTC and LIBFDT are maintained by:
|
||||||
|
|
||||||
|
David Gibson <david@gibson.dropbear.id.au>
|
||||||
|
Jon Loeliger <loeliger@gmail.com>
|
||||||
|
|
||||||
|
|
||||||
|
Python library
|
||||||
|
--------------
|
||||||
|
|
||||||
|
A Python library is also available. To build this you will need to install
|
||||||
|
swig and Python development files. On Debian distributions:
|
||||||
|
|
||||||
|
sudo apt-get install swig python3-dev
|
||||||
|
|
||||||
|
The library provides an Fdt class which you can use like this:
|
||||||
|
|
||||||
|
$ PYTHONPATH=../pylibfdt python3
|
||||||
|
>>> import libfdt
|
||||||
|
>>> fdt = libfdt.Fdt(open('test_tree1.dtb', mode='rb').read())
|
||||||
|
>>> node = fdt.path_offset('/subnode@1')
|
||||||
|
>>> print(node)
|
||||||
|
124
|
||||||
|
>>> prop_offset = fdt.first_property_offset(node)
|
||||||
|
>>> prop = fdt.get_property_by_offset(prop_offset)
|
||||||
|
>>> print('%s=%s' % (prop.name, prop.as_str()))
|
||||||
|
compatible=subnode1
|
||||||
|
>>> node2 = fdt.path_offset('/')
|
||||||
|
>>> print(fdt.getprop(node2, 'compatible').as_str())
|
||||||
|
test_tree1
|
||||||
|
|
||||||
|
You will find tests in tests/pylibfdt_tests.py showing how to use each
|
||||||
|
method. Help is available using the Python help command, e.g.:
|
||||||
|
|
||||||
|
$ cd pylibfdt
|
||||||
|
$ python3 -c "import libfdt; help(libfdt)"
|
||||||
|
|
||||||
|
If you add new features, please check code coverage:
|
||||||
|
|
||||||
|
$ sudo apt-get install python3-coverage
|
||||||
|
$ cd tests
|
||||||
|
# It's just 'coverage' on most other distributions
|
||||||
|
$ python3-coverage run pylibfdt_tests.py
|
||||||
|
$ python3-coverage html
|
||||||
|
# Open 'htmlcov/index.html' in your browser
|
||||||
|
|
||||||
|
|
||||||
|
The library can be installed with pip from a local source tree:
|
||||||
|
|
||||||
|
pip install . [--user|--prefix=/path/to/install_dir]
|
||||||
|
|
||||||
|
Or directly from a remote git repo:
|
||||||
|
|
||||||
|
pip install git+git://git.kernel.org/pub/scm/utils/dtc/dtc.git@main
|
||||||
|
|
||||||
|
The install depends on libfdt shared library being installed on the host system
|
||||||
|
first. Generally, using --user or --prefix is not necessary and pip will use the
|
||||||
|
default location for the Python installation which varies if the user is root or
|
||||||
|
not.
|
||||||
|
|
||||||
|
You can also install everything via make if you like, but pip is recommended.
|
||||||
|
|
||||||
|
To install both libfdt and pylibfdt you can use:
|
||||||
|
|
||||||
|
make install [PREFIX=/path/to/install_dir]
|
||||||
|
|
||||||
|
To disable building the python library, even if swig and Python are available,
|
||||||
|
use:
|
||||||
|
|
||||||
|
make NO_PYTHON=1
|
||||||
|
|
||||||
|
|
||||||
|
More work remains to support all of libfdt, including access to numeric
|
||||||
|
values.
|
||||||
|
|
||||||
|
|
||||||
|
Adding a new function to libfdt.h
|
||||||
|
---------------------------------
|
||||||
|
|
||||||
|
The shared library uses libfdt/version.lds to list the exported functions, so
|
||||||
|
add your new function there. Check that your function works with pylibfdt. If
|
||||||
|
it cannot be supported, put the declaration in libfdt.h behind #ifndef SWIG so
|
||||||
|
that swig ignores it.
|
||||||
|
|
||||||
|
|
||||||
|
Tests
|
||||||
|
-----
|
||||||
|
|
||||||
|
Test files are kept in the tests/ directory. Use 'make check' to build and run
|
||||||
|
all tests.
|
||||||
|
|
||||||
|
If you want to adjust a test file, be aware that tree_tree1.dts is compiled
|
||||||
|
and checked against a binary tree from assembler macros in trees.S. So
|
||||||
|
if you change that file you must change tree.S also.
|
||||||
|
|
||||||
|
|
||||||
|
Mailing list
|
||||||
|
------------
|
||||||
|
The following list is for discussion about dtc and libfdt implementation
|
||||||
|
mailto:devicetree-compiler@vger.kernel.org
|
||||||
|
|
||||||
|
Core device tree bindings are discussed on the devicetree-spec list:
|
||||||
|
mailto:devicetree-spec@vger.kernel.org
|
@ -13,11 +13,14 @@ include $(LIBFDT_srcdir)/Makefile.libfdt
|
|||||||
PYLIBFDT_srcs = $(addprefix $(LIBFDT_srcdir)/,$(LIBFDT_SRCS)) \
|
PYLIBFDT_srcs = $(addprefix $(LIBFDT_srcdir)/,$(LIBFDT_SRCS)) \
|
||||||
$(obj)/libfdt.i
|
$(obj)/libfdt.i
|
||||||
|
|
||||||
|
# create a version string compliant with PEP 440
|
||||||
|
PEP_VERSION = $(VERSION)$(if $(PATCHLEVEL),.$(PATCHLEVEL)$(if $(SUBLEVEL),.$(SUBLEVEL)))$(subst -,,$(EXTRAVERSION))
|
||||||
|
|
||||||
quiet_cmd_pymod = PYMOD $@
|
quiet_cmd_pymod = PYMOD $@
|
||||||
cmd_pymod = unset CROSS_COMPILE; unset CFLAGS; \
|
cmd_pymod = unset CROSS_COMPILE; unset CFLAGS; \
|
||||||
CC="$(HOSTCC)" LDSHARED="$(HOSTCC) -shared " \
|
CC="$(HOSTCC)" LDSHARED="$(HOSTCC) -shared " \
|
||||||
LDFLAGS="$(HOSTLDFLAGS)" \
|
LDFLAGS="$(HOSTLDFLAGS)" \
|
||||||
VERSION="u-boot-$(UBOOTVERSION)" \
|
VERSION="$(PEP_VERSION)" \
|
||||||
CPPFLAGS="$(HOSTCFLAGS) -I$(LIBFDT_srcdir)" OBJDIR=$(obj) \
|
CPPFLAGS="$(HOSTCFLAGS) -I$(LIBFDT_srcdir)" OBJDIR=$(obj) \
|
||||||
SOURCES="$(PYLIBFDT_srcs)" \
|
SOURCES="$(PYLIBFDT_srcs)" \
|
||||||
SWIG_OPTS="-I$(LIBFDT_srcdir) -I$(LIBFDT_srcdir)/.." \
|
SWIG_OPTS="-I$(LIBFDT_srcdir) -I$(LIBFDT_srcdir)/.." \
|
||||||
|
@ -7,6 +7,10 @@
|
|||||||
|
|
||||||
%module libfdt
|
%module libfdt
|
||||||
|
|
||||||
|
%begin %{
|
||||||
|
#define PY_SSIZE_T_CLEAN
|
||||||
|
%}
|
||||||
|
|
||||||
%include <stdint.i>
|
%include <stdint.i>
|
||||||
|
|
||||||
%{
|
%{
|
||||||
|
@ -1,11 +1,13 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
|
# SPDX-License-Identifier: (GPL-2.0-or-later OR BSD-2-Clause)
|
||||||
|
|
||||||
"""
|
"""
|
||||||
setup.py file for SWIG libfdt
|
setup.py file for SWIG libfdt
|
||||||
Copyright (C) 2017 Google, Inc.
|
Copyright (C) 2017 Google, Inc.
|
||||||
Written by Simon Glass <sjg@chromium.org>
|
Written by Simon Glass <sjg@chromium.org>
|
||||||
|
|
||||||
SPDX-License-Identifier: GPL-2.0+ BSD-2-Clause
|
This script is modified from the upstream version, to fit in with the U-Boot
|
||||||
|
build system.
|
||||||
|
|
||||||
Files to be built into the extension are provided in SOURCES
|
Files to be built into the extension are provided in SOURCES
|
||||||
C flags to use are provided in CPPFLAGS
|
C flags to use are provided in CPPFLAGS
|
||||||
@ -18,14 +20,29 @@ allows this script to be run stand-alone, e.g.:
|
|||||||
./pylibfdt/setup.py install [--prefix=...]
|
./pylibfdt/setup.py install [--prefix=...]
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from distutils.core import setup, Extension
|
from setuptools import setup, Extension
|
||||||
|
from setuptools.command.build_py import build_py as _build_py
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
srcdir = os.path.dirname(__file__)
|
||||||
|
|
||||||
|
with open(os.path.join(srcdir, "../README"), "r") as fh:
|
||||||
|
long_description = fh.read()
|
||||||
|
|
||||||
# Decodes a Makefile assignment line into key and value (and plus for +=)
|
# Decodes a Makefile assignment line into key and value (and plus for +=)
|
||||||
RE_KEY_VALUE = re.compile('(?P<key>\w+) *(?P<plus>[+])?= *(?P<value>.*)$')
|
RE_KEY_VALUE = re.compile('(?P<key>\w+) *(?P<plus>[+])?= *(?P<value>.*)$')
|
||||||
|
|
||||||
|
def get_top_builddir():
|
||||||
|
if '--top-builddir' in sys.argv:
|
||||||
|
index = sys.argv.index('--top-builddir')
|
||||||
|
sys.argv.pop(index)
|
||||||
|
return sys.argv.pop(index)
|
||||||
|
else:
|
||||||
|
return os.path.join(srcdir, '..')
|
||||||
|
|
||||||
|
top_builddir = get_top_builddir()
|
||||||
|
|
||||||
def ParseMakefile(fname):
|
def ParseMakefile(fname):
|
||||||
"""Parse a Makefile to obtain its variables.
|
"""Parse a Makefile to obtain its variables.
|
||||||
@ -86,7 +103,7 @@ def GetEnvFromMakefiles():
|
|||||||
makevars = ParseMakefile(os.path.join(basedir, 'libfdt', 'Makefile.libfdt'))
|
makevars = ParseMakefile(os.path.join(basedir, 'libfdt', 'Makefile.libfdt'))
|
||||||
files = makevars['LIBFDT_SRCS'].split()
|
files = makevars['LIBFDT_SRCS'].split()
|
||||||
files = [os.path.join(basedir, 'libfdt', fname) for fname in files]
|
files = [os.path.join(basedir, 'libfdt', fname) for fname in files]
|
||||||
files.append('pylibfdt/libfdt.i')
|
files.append('libfdt.i')
|
||||||
cflags = ['-I%s' % basedir, '-I%s/libfdt' % basedir]
|
cflags = ['-I%s' % basedir, '-I%s/libfdt' % basedir]
|
||||||
objdir = ''
|
objdir = ''
|
||||||
return swig_opts, version, files, cflags, objdir
|
return swig_opts, version, files, cflags, objdir
|
||||||
@ -107,17 +124,39 @@ if not all((swig_opts, version, files, cflags, objdir)):
|
|||||||
|
|
||||||
libfdt_module = Extension(
|
libfdt_module = Extension(
|
||||||
'_libfdt',
|
'_libfdt',
|
||||||
sources = files,
|
sources=files,
|
||||||
extra_compile_args = cflags,
|
include_dirs=[os.path.join(srcdir, 'libfdt')],
|
||||||
swig_opts = swig_opts,
|
library_dirs=[os.path.join(top_builddir, 'libfdt')],
|
||||||
|
swig_opts=swig_opts,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
class build_py(_build_py):
|
||||||
|
def run(self):
|
||||||
|
self.run_command("build_ext")
|
||||||
|
return super().run()
|
||||||
|
|
||||||
setup(
|
setup(
|
||||||
name='libfdt',
|
name='libfdt',
|
||||||
version= version,
|
version=version,
|
||||||
author='Simon Glass <sjg@chromium.org>',
|
cmdclass = {'build_py' : build_py},
|
||||||
|
author='Simon Glass',
|
||||||
|
author_email='sjg@chromium.org',
|
||||||
description='Python binding for libfdt',
|
description='Python binding for libfdt',
|
||||||
ext_modules=[libfdt_module],
|
ext_modules=[libfdt_module],
|
||||||
package_dir={'': objdir},
|
package_dir={'': objdir},
|
||||||
py_modules=['pylibfdt/libfdt'],
|
py_modules=['libfdt'],
|
||||||
|
|
||||||
|
long_description=long_description,
|
||||||
|
long_description_content_type="text/plain",
|
||||||
|
url="https://git.kernel.org/pub/scm/utils/dtc/dtc.git",
|
||||||
|
license="BSD",
|
||||||
|
license_files=["GPL", "BSD-2-Clause"],
|
||||||
|
|
||||||
|
classifiers=[
|
||||||
|
"Programming Language :: Python :: 3",
|
||||||
|
"License :: OSI Approved :: BSD License",
|
||||||
|
"License :: OSI Approved :: GNU General Public License v2 or later (GPLv2+)",
|
||||||
|
"Operating System :: OS Independent",
|
||||||
|
],
|
||||||
|
|
||||||
)
|
)
|
||||||
|
@ -108,8 +108,6 @@ def main(argv):
|
|||||||
parser.add_argument('elf', type=str, help='ELF file to decode')
|
parser.add_argument('elf', type=str, help='ELF file to decode')
|
||||||
parser.add_argument('-e', '--endian', type=str, default='auto',
|
parser.add_argument('-e', '--endian', type=str, default='auto',
|
||||||
help='Big-endian image')
|
help='Big-endian image')
|
||||||
parser.add_argument('-t', '--test', action='store_true',
|
|
||||||
help='Big-endian image')
|
|
||||||
args = parser.parse_args(argv)
|
args = parser.parse_args(argv)
|
||||||
show_event_spy_list(args.elf, args.endian)
|
show_event_spy_list(args.elf, args.endian)
|
||||||
|
|
||||||
|
@ -1078,11 +1078,10 @@ static int dm_test_uclass_devices_get(struct unit_test_state *uts)
|
|||||||
struct udevice *dev;
|
struct udevice *dev;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
for (ret = uclass_first_device(UCLASS_TEST, &dev);
|
for (ret = uclass_first_device_check(UCLASS_TEST, &dev);
|
||||||
dev;
|
dev;
|
||||||
ret = uclass_next_device(&dev)) {
|
ret = uclass_next_device_check(&dev)) {
|
||||||
ut_assert(!ret);
|
ut_assert(!ret);
|
||||||
ut_assert(dev);
|
|
||||||
ut_assert(device_active(dev));
|
ut_assert(device_active(dev));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1112,11 +1111,10 @@ static int dm_test_uclass_devices_get_by_name(struct unit_test_state *uts)
|
|||||||
* this will fail on checking condition: testdev == finddev, since the
|
* this will fail on checking condition: testdev == finddev, since the
|
||||||
* uclass_get_device_by_name(), returns the first device by given name.
|
* uclass_get_device_by_name(), returns the first device by given name.
|
||||||
*/
|
*/
|
||||||
for (ret = uclass_first_device(UCLASS_TEST_FDT, &testdev);
|
for (ret = uclass_first_device_check(UCLASS_TEST_FDT, &testdev);
|
||||||
testdev;
|
testdev;
|
||||||
ret = uclass_next_device(&testdev)) {
|
ret = uclass_next_device_check(&testdev)) {
|
||||||
ut_assertok(ret);
|
ut_assertok(ret);
|
||||||
ut_assert(testdev);
|
|
||||||
ut_assert(device_active(testdev));
|
ut_assert(device_active(testdev));
|
||||||
|
|
||||||
findret = uclass_get_device_by_name(UCLASS_TEST_FDT,
|
findret = uclass_get_device_by_name(UCLASS_TEST_FDT,
|
||||||
|
@ -403,13 +403,12 @@ static int dm_test_first_next_device_probeall(struct unit_test_state *uts)
|
|||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
/* There should be 4 devices */
|
/* There should be 4 devices */
|
||||||
for (ret = uclass_first_device(UCLASS_TEST_PROBE, &dev), count = 0;
|
for (uclass_first_device(UCLASS_TEST_PROBE, &dev), count = 0;
|
||||||
dev;
|
dev;
|
||||||
ret = uclass_next_device(&dev)) {
|
uclass_next_device(&dev)) {
|
||||||
count++;
|
count++;
|
||||||
parent = dev_get_parent(dev);
|
parent = dev_get_parent(dev);
|
||||||
}
|
}
|
||||||
ut_assertok(ret);
|
|
||||||
ut_asserteq(4, count);
|
ut_asserteq(4, count);
|
||||||
|
|
||||||
/* Remove them and try again, with an error on the second one */
|
/* Remove them and try again, with an error on the second one */
|
||||||
@ -417,16 +416,30 @@ static int dm_test_first_next_device_probeall(struct unit_test_state *uts)
|
|||||||
pdata = dev_get_plat(dev);
|
pdata = dev_get_plat(dev);
|
||||||
pdata->probe_err = -ENOMEM;
|
pdata->probe_err = -ENOMEM;
|
||||||
device_remove(parent, DM_REMOVE_NORMAL);
|
device_remove(parent, DM_REMOVE_NORMAL);
|
||||||
ut_assertok(uclass_first_device(UCLASS_TEST_PROBE, &dev));
|
for (ret = uclass_first_device_check(UCLASS_TEST_PROBE, &dev),
|
||||||
ut_asserteq(-ENOMEM, uclass_next_device(&dev));
|
count = 0;
|
||||||
ut_asserteq_ptr(dev, NULL);
|
dev;
|
||||||
|
ret = uclass_next_device_check(&dev)) {
|
||||||
|
if (!ret)
|
||||||
|
count++;
|
||||||
|
else
|
||||||
|
ut_asserteq(-ENOMEM, ret);
|
||||||
|
parent = dev_get_parent(dev);
|
||||||
|
}
|
||||||
|
ut_asserteq(3, count);
|
||||||
|
|
||||||
/* Now an error on the first one */
|
/* Now an error on the first one */
|
||||||
ut_assertok(uclass_get_device(UCLASS_TEST_PROBE, 0, &dev));
|
ut_assertok(uclass_get_device(UCLASS_TEST_PROBE, 0, &dev));
|
||||||
pdata = dev_get_plat(dev);
|
pdata = dev_get_plat(dev);
|
||||||
pdata->probe_err = -ENOENT;
|
pdata->probe_err = -ENOENT;
|
||||||
device_remove(parent, DM_REMOVE_NORMAL);
|
device_remove(parent, DM_REMOVE_NORMAL);
|
||||||
ut_asserteq(-ENOENT, uclass_first_device(UCLASS_TEST_PROBE, &dev));
|
for (uclass_first_device(UCLASS_TEST_PROBE, &dev), count = 0;
|
||||||
|
dev;
|
||||||
|
uclass_next_device(&dev)) {
|
||||||
|
count++;
|
||||||
|
parent = dev_get_parent(dev);
|
||||||
|
}
|
||||||
|
ut_asserteq(2, count);
|
||||||
|
|
||||||
/* Now that broken devices are set up test probe_all */
|
/* Now that broken devices are set up test probe_all */
|
||||||
device_remove(parent, DM_REMOVE_NORMAL);
|
device_remove(parent, DM_REMOVE_NORMAL);
|
||||||
|
@ -16,7 +16,7 @@ def test_event_dump(u_boot_console):
|
|||||||
out = util.run_and_log(cons, ['scripts/event_dump.py', sandbox])
|
out = util.run_and_log(cons, ['scripts/event_dump.py', sandbox])
|
||||||
expect = '''.*Event type Id Source location
|
expect = '''.*Event type Id Source location
|
||||||
-------------------- ------------------------------ ------------------------------
|
-------------------- ------------------------------ ------------------------------
|
||||||
EVT_FT_FIXUP bootmeth_vbe_ft_fixup .*boot/vbe_fixup.c:.*
|
EVT_FT_FIXUP bootmeth_vbe_ft_fixup .*vbe_fixup.c:.*
|
||||||
EVT_FT_FIXUP bootmeth_vbe_simple_ft_fixup .*boot/vbe_simple.c:.*
|
EVT_FT_FIXUP bootmeth_vbe_simple_ft_fixup .*vbe_simple.c:.*
|
||||||
EVT_MISC_INIT_F sandbox_misc_init_f .*arch/sandbox/cpu/start.c:'''
|
EVT_MISC_INIT_F sandbox_misc_init_f .*start.c:'''
|
||||||
assert re.match(expect, out, re.MULTILINE) is not None
|
assert re.match(expect, out, re.MULTILINE) is not None
|
||||||
|
@ -780,6 +780,9 @@ align-default:
|
|||||||
This means that each section must specify its own default alignment, if
|
This means that each section must specify its own default alignment, if
|
||||||
required.
|
required.
|
||||||
|
|
||||||
|
symlink:
|
||||||
|
Adds a symlink to the image with string given in the symlink property.
|
||||||
|
|
||||||
Examples of the above options can be found in the tests. See the
|
Examples of the above options can be found in the tests. See the
|
||||||
tools/binman/test directory.
|
tools/binman/test directory.
|
||||||
|
|
||||||
|
@ -5995,6 +5995,15 @@ fdt fdtmap Extract the devicetree blob from the fdtmap
|
|||||||
self.assertIn('Expected __bss_size symbol in vpl/u-boot-vpl',
|
self.assertIn('Expected __bss_size symbol in vpl/u-boot-vpl',
|
||||||
str(e.exception))
|
str(e.exception))
|
||||||
|
|
||||||
|
def testSymlink(self):
|
||||||
|
"""Test that image files can be named"""
|
||||||
|
retcode = self._DoTestFile('259_symlink.dts', debug=True, map=True)
|
||||||
|
self.assertEqual(0, retcode)
|
||||||
|
image = control.images['test_image']
|
||||||
|
fname = tools.get_output_filename('test_image.bin')
|
||||||
|
sname = tools.get_output_filename('symlink_to_test.bin')
|
||||||
|
self.assertTrue(os.path.islink(sname))
|
||||||
|
self.assertEqual(os.readlink(sname), fname)
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
@ -38,6 +38,7 @@ class Image(section.Entry_section):
|
|||||||
repacked later
|
repacked later
|
||||||
test_section_timeout: Use a zero timeout for section multi-threading
|
test_section_timeout: Use a zero timeout for section multi-threading
|
||||||
(for testing)
|
(for testing)
|
||||||
|
symlink: Name of symlink to image
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
copy_to_orig: Copy offset/size to orig_offset/orig_size after reading
|
copy_to_orig: Copy offset/size to orig_offset/orig_size after reading
|
||||||
@ -97,6 +98,7 @@ class Image(section.Entry_section):
|
|||||||
if filename:
|
if filename:
|
||||||
self._filename = filename
|
self._filename = filename
|
||||||
self.allow_repack = fdt_util.GetBool(self._node, 'allow-repack')
|
self.allow_repack = fdt_util.GetBool(self._node, 'allow-repack')
|
||||||
|
self._symlink = fdt_util.GetString(self._node, 'symlink')
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def FromFile(cls, fname):
|
def FromFile(cls, fname):
|
||||||
@ -180,6 +182,10 @@ class Image(section.Entry_section):
|
|||||||
data = self.GetPaddedData()
|
data = self.GetPaddedData()
|
||||||
fd.write(data)
|
fd.write(data)
|
||||||
tout.info("Wrote %#x bytes" % len(data))
|
tout.info("Wrote %#x bytes" % len(data))
|
||||||
|
# Create symlink to file if symlink given
|
||||||
|
if self._symlink is not None:
|
||||||
|
sname = tools.get_output_filename(self._symlink)
|
||||||
|
os.symlink(fname, sname)
|
||||||
|
|
||||||
def WriteMap(self):
|
def WriteMap(self):
|
||||||
"""Write a map of the image to a .map file
|
"""Write a map of the image to a .map file
|
||||||
|
16
tools/binman/test/259_symlink.dts
Normal file
16
tools/binman/test/259_symlink.dts
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
/dts-v1/;
|
||||||
|
|
||||||
|
/ {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
|
||||||
|
binman {
|
||||||
|
multiple-images;
|
||||||
|
test_image {
|
||||||
|
filename = "test_image.bin";
|
||||||
|
symlink = "symlink_to_test.bin";
|
||||||
|
u-boot {
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
Loading…
x
Reference in New Issue
Block a user