The dma-ranges property is a set 3 cells of #address-size, so don't treat it like the ranges property when generating warnings. Signed-off-by: Ben Dooks <ben.dooks@xxxxxxxxxx> --- scripts/dtc/checks.c | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/scripts/dtc/checks.c b/scripts/dtc/checks.c index 781ba1129a8e..791b93e8e02a 100644 --- a/scripts/dtc/checks.c +++ b/scripts/dtc/checks.c @@ -823,7 +823,36 @@ static void check_ranges_format(struct check *c, struct dt_info *dti, } } WARNING(ranges_format, check_ranges_format, "ranges", &addr_size_cells); -WARNING(dma_ranges_format, check_ranges_format, "dma-ranges", &addr_size_cells); + +static void check_dma_ranges_format(struct check *c, struct dt_info *dti, + struct node *node) +{ + struct property *prop; + int c_size_cells, p_size_cells, entrylen; + const char *ranges = c->data; + + prop = get_property(node, ranges); + if (!prop) + return; + + if (!node->parent) { + FAIL_PROP(c, dti, node, prop, "Root node has a \"%s\" property", + ranges); + return; + } + + c_size_cells = node_size_cells(node); + p_size_cells = node_size_cells(node->parent); + entrylen = (p_size_cells + 2 * c_size_cells) * sizeof(cell_t); + + if (!is_multiple_of(prop->val.len, entrylen)) { + FAIL_PROP(c, dti, node, prop, "\"%s\" property has invalid length (%d bytes) " + "(parent #address-cells == %d, " + "child #address-cells == %d)", ranges, prop->val.len, + p_size_cells, c_size_cells); + } +} +WARNING(dma_ranges_format, check_dma_ranges_format, "dma-ranges", &addr_size_cells); static const struct bus_type pci_bus = { .name = "PCI", -- 2.35.1