Ranges - Intended use case

Kyle Bonnici
2026-02-12T13:14:36Z

Hi

I have been trying to understand how ranges should/should not be used.

Looking at the spec

> The ranges property provides a means of defining a mapping or translation between the address space of the
bus (the child address space) and the address space of the bus node’s parent (the parent address space).

This to me the spec leave some space for interpretation on if ranges should be used on just buses or not. Below are some examples to try to get a better understanding.

```
/ {
foo { // not a bus
#address-cells = <1>;
#size-cells = <1>;
ranges; // does this ranges have any meaning?

bar@10 {
reg<0x10 …>
};
};
};
```

```
/ {
foo { // not a bus
#address-cells = <1>;
#size-cells = <1>;
reg = <0x100 0x50>;
ranges = <0x0 0x100 0x50>; // is this an intended use case?

bar@10 {
reg<0x10 …> // hence abs address is 0x110.
};
};
};
```

```
/ {
foo { // bus
compatible = <simple-bus>;
#address-cells = <1>;
#size-cells = <1>;
ranges; // this I understand to declare that children will have direct mapping

bar {
ranges; // is this needed? Or is it implied that the foobar is in the same address space of bar?
foobar@10 {
reg<0x10 …> // hence abs address is 0x10.
};
};
};
};
```

```
/ {
soc { // bus
compatible = <simple-bus>;
#address-cells = <1>;
#size-cells = <1>;
ranges; // this I understand to declare that children will have direct mapping

flash@1000 {
reg<0x1000 …>
ranges = <0x0 0x1000 …>;

partitions {
ranges; // is this needed? Or is it implied that the partition1 is in the same address space of partitions?

partition1@10 {
reg<0x10 …> // hence abs address is 0x1010.
};
};
};
};
};
```

Looking forward to explanations on this topic to extend my understanding of devicetree

Regards
Kyle