@@ -43,7 +43,7 @@ struct of_bus {
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,13 +63,13 @@ static void of_bus_default_count_cells(struct device_node *dev,
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,24 +101,13 @@ static unsigned int of_bus_default_get_flags(const __be32 *addr)
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 )
@@ -192,9 +181,8 @@ static void of_bus_pci_count_cells(struct device_node *np,
192
181
}
193
182
194
183
static u64 of_bus_pci_map (__be32 * addr , const __be32 * range , int na , int ns ,
195
- int pna )
184
+ int pna , int fna )
196
185
{
197
- u64 cp , s , da ;
198
186
unsigned int af , rf ;
199
187
200
188
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,
204
192
if ((af ^ rf ) & (IORESOURCE_MEM | IORESOURCE_IO ))
205
193
return OF_BAD_ADDR ;
206
194
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 );
217
196
}
218
197
219
198
#endif /* CONFIG_PCI */
@@ -319,24 +298,13 @@ static void of_bus_isa_count_cells(struct device_node *child,
319
298
}
320
299
321
300
static u64 of_bus_isa_map (__be32 * addr , const __be32 * range , int na , int ns ,
322
- int pna )
301
+ int pna , int fna )
323
302
{
324
- u64 cp , s , da ;
325
-
326
303
/* Check address type match */
327
304
if ((addr [0 ] ^ range [0 ]) & cpu_to_be32 (1 ))
328
305
return OF_BAD_ADDR ;
329
306
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 );
340
308
}
341
309
342
310
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,
486
454
rlen /= 4 ;
487
455
rone = na + pna + ns ;
488
456
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 );
490
458
if (offset != OF_BAD_ADDR )
491
459
break ;
492
460
}
0 commit comments