Skip to content

Commit 73ae308

Browse files
committed
of: address: Consolidate bus .map() functions
The bus .map() functions vary only by checking the flag cells values and skipping over any flag cells to read the addresses. Otherwise they all do the same reading 'ranges' address and size and returning the address's offset if it is within the 'ranges' entry. Refactor all the .map() functions to pass in the flag cell size so that each bus can check the bus specific flags and then call a common function to do everything else. Acked-by: Herve Codina <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Rob Herring <[email protected]>
1 parent 88696db commit 73ae308

File tree

1 file changed

+11
-43
lines changed

1 file changed

+11
-43
lines changed

drivers/of/address.c

Lines changed: 11 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ struct of_bus {
4343
void (*count_cells)(struct device_node *child,
4444
int *addrc, int *sizec);
4545
u64 (*map)(__be32 *addr, const __be32 *range,
46-
int na, int ns, int pna);
46+
int na, int ns, int pna, int fna);
4747
int (*translate)(__be32 *addr, u64 offset, int na);
4848
int flag_cells;
4949
unsigned int (*get_flags)(const __be32 *addr);
@@ -63,13 +63,13 @@ static void of_bus_default_count_cells(struct device_node *dev,
6363
}
6464

6565
static u64 of_bus_default_map(__be32 *addr, const __be32 *range,
66-
int na, int ns, int pna)
66+
int na, int ns, int pna, int fna)
6767
{
6868
u64 cp, s, da;
6969

70-
cp = of_read_number(range, na);
70+
cp = of_read_number(range + fna, na - fna);
7171
s = of_read_number(range + na + pna, ns);
72-
da = of_read_number(addr, na);
72+
da = of_read_number(addr + fna, na - fna);
7373

7474
pr_debug("default map, cp=%llx, s=%llx, da=%llx\n", cp, s, da);
7575

@@ -101,24 +101,13 @@ static unsigned int of_bus_default_get_flags(const __be32 *addr)
101101
}
102102

103103
static u64 of_bus_default_flags_map(__be32 *addr, const __be32 *range, int na,
104-
int ns, int pna)
104+
int ns, int pna, int fna)
105105
{
106-
u64 cp, s, da;
107-
108106
/* Check that flags match */
109107
if (*addr != *range)
110108
return OF_BAD_ADDR;
111109

112-
/* Read address values, skipping high cell */
113-
cp = of_read_number(range + 1, na - 1);
114-
s = of_read_number(range + na + pna, ns);
115-
da = of_read_number(addr + 1, na - 1);
116-
117-
pr_debug("default flags map, cp=%llx, s=%llx, da=%llx\n", cp, s, da);
118-
119-
if (da < cp || da >= (cp + s))
120-
return OF_BAD_ADDR;
121-
return da - cp;
110+
return of_bus_default_map(addr, range, na, ns, pna, fna);
122111
}
123112

124113
static int of_bus_default_flags_translate(__be32 *addr, u64 offset, int na)
@@ -192,9 +181,8 @@ static void of_bus_pci_count_cells(struct device_node *np,
192181
}
193182

194183
static u64 of_bus_pci_map(__be32 *addr, const __be32 *range, int na, int ns,
195-
int pna)
184+
int pna, int fna)
196185
{
197-
u64 cp, s, da;
198186
unsigned int af, rf;
199187

200188
af = of_bus_pci_get_flags(addr);
@@ -204,16 +192,7 @@ static u64 of_bus_pci_map(__be32 *addr, const __be32 *range, int na, int ns,
204192
if ((af ^ rf) & (IORESOURCE_MEM | IORESOURCE_IO))
205193
return OF_BAD_ADDR;
206194

207-
/* Read address values, skipping high cell */
208-
cp = of_read_number(range + 1, na - 1);
209-
s = of_read_number(range + na + pna, ns);
210-
da = of_read_number(addr + 1, na - 1);
211-
212-
pr_debug("PCI map, cp=%llx, s=%llx, da=%llx\n", cp, s, da);
213-
214-
if (da < cp || da >= (cp + s))
215-
return OF_BAD_ADDR;
216-
return da - cp;
195+
return of_bus_default_map(addr, range, na, ns, pna, fna);
217196
}
218197

219198
#endif /* CONFIG_PCI */
@@ -319,24 +298,13 @@ static void of_bus_isa_count_cells(struct device_node *child,
319298
}
320299

321300
static u64 of_bus_isa_map(__be32 *addr, const __be32 *range, int na, int ns,
322-
int pna)
301+
int pna, int fna)
323302
{
324-
u64 cp, s, da;
325-
326303
/* Check address type match */
327304
if ((addr[0] ^ range[0]) & cpu_to_be32(1))
328305
return OF_BAD_ADDR;
329306

330-
/* Read address values, skipping high cell */
331-
cp = of_read_number(range + 1, na - 1);
332-
s = of_read_number(range + na + pna, ns);
333-
da = of_read_number(addr + 1, na - 1);
334-
335-
pr_debug("ISA map, cp=%llx, s=%llx, da=%llx\n", cp, s, da);
336-
337-
if (da < cp || da >= (cp + s))
338-
return OF_BAD_ADDR;
339-
return da - cp;
307+
return of_bus_default_map(addr, range, na, ns, pna, fna);
340308
}
341309

342310
static unsigned int of_bus_isa_get_flags(const __be32 *addr)
@@ -486,7 +454,7 @@ static int of_translate_one(struct device_node *parent, struct of_bus *bus,
486454
rlen /= 4;
487455
rone = na + pna + ns;
488456
for (; rlen >= rone; rlen -= rone, ranges += rone) {
489-
offset = bus->map(addr, ranges, na, ns, pna);
457+
offset = bus->map(addr, ranges, na, ns, pna, bus->flag_cells);
490458
if (offset != OF_BAD_ADDR)
491459
break;
492460
}

0 commit comments

Comments
 (0)