Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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 <herve.codina@bootlin.com>
Link: https://lore.kernel.org/r/20231026135358.3564307-3-robh@kernel.org
Signed-off-by: Rob Herring <robh@kernel.org>

+11 -43
+11 -43
drivers/of/address.c
··· 43 43 void (*count_cells)(struct device_node *child, 44 44 int *addrc, int *sizec); 45 45 u64 (*map)(__be32 *addr, const __be32 *range, 46 - int na, int ns, int pna); 46 + int na, int ns, int pna, int fna); 47 47 int (*translate)(__be32 *addr, u64 offset, int na); 48 48 int flag_cells; 49 49 unsigned int (*get_flags)(const __be32 *addr); ··· 63 63 } 64 64 65 65 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) 67 67 { 68 68 u64 cp, s, da; 69 69 70 - cp = of_read_number(range, na); 70 + cp = of_read_number(range + fna, na - fna); 71 71 s = of_read_number(range + na + pna, ns); 72 - da = of_read_number(addr, na); 72 + da = of_read_number(addr + fna, na - fna); 73 73 74 74 pr_debug("default map, cp=%llx, s=%llx, da=%llx\n", cp, s, da); 75 75 ··· 101 101 } 102 102 103 103 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) 105 105 { 106 - u64 cp, s, da; 107 - 108 106 /* Check that flags match */ 109 107 if (*addr != *range) 110 108 return OF_BAD_ADDR; 111 109 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); 122 111 } 123 112 124 113 static int of_bus_default_flags_translate(__be32 *addr, u64 offset, int na) ··· 181 192 } 182 193 183 194 static u64 of_bus_pci_map(__be32 *addr, const __be32 *range, int na, int ns, 184 - int pna) 195 + int pna, int fna) 185 196 { 186 - u64 cp, s, da; 187 197 unsigned int af, rf; 188 198 189 199 af = of_bus_pci_get_flags(addr); ··· 192 204 if ((af ^ rf) & (IORESOURCE_MEM | IORESOURCE_IO)) 193 205 return OF_BAD_ADDR; 194 206 195 - /* Read address values, skipping high cell */ 196 - cp = of_read_number(range + 1, na - 1); 197 - s = of_read_number(range + na + pna, ns); 198 - da = of_read_number(addr + 1, na - 1); 199 - 200 - pr_debug("PCI map, cp=%llx, s=%llx, da=%llx\n", cp, s, da); 201 - 202 - if (da < cp || da >= (cp + s)) 203 - return OF_BAD_ADDR; 204 - return da - cp; 207 + return of_bus_default_map(addr, range, na, ns, pna, fna); 205 208 } 206 209 207 210 #endif /* CONFIG_PCI */ ··· 298 319 } 299 320 300 321 static u64 of_bus_isa_map(__be32 *addr, const __be32 *range, int na, int ns, 301 - int pna) 322 + int pna, int fna) 302 323 { 303 - u64 cp, s, da; 304 - 305 324 /* Check address type match */ 306 325 if ((addr[0] ^ range[0]) & cpu_to_be32(1)) 307 326 return OF_BAD_ADDR; 308 327 309 - /* Read address values, skipping high cell */ 310 - cp = of_read_number(range + 1, na - 1); 311 - s = of_read_number(range + na + pna, ns); 312 - da = of_read_number(addr + 1, na - 1); 313 - 314 - pr_debug("ISA map, cp=%llx, s=%llx, da=%llx\n", cp, s, da); 315 - 316 - if (da < cp || da >= (cp + s)) 317 - return OF_BAD_ADDR; 318 - return da - cp; 328 + return of_bus_default_map(addr, range, na, ns, pna, fna); 319 329 } 320 330 321 331 static unsigned int of_bus_isa_get_flags(const __be32 *addr) ··· 454 486 rlen /= 4; 455 487 rone = na + pna + ns; 456 488 for (; rlen >= rone; rlen -= rone, ranges += rone) { 457 - offset = bus->map(addr, ranges, na, ns, pna); 489 + offset = bus->map(addr, ranges, na, ns, pna, bus->flag_cells); 458 490 if (offset != OF_BAD_ADDR) 459 491 break; 460 492 }