1 // SPDX-License-Identifier: GPL-2.0 1 2 /* 3 * ranges.c: Handle ranges in newer proms for 4 * 5 * Copyright (C) 1995 David S. Miller (davem@c 6 * Copyright (C) 1997 Jakub Jelinek (jj@sunsit 7 */ 8 9 #include <linux/init.h> 10 #include <linux/module.h> 11 12 #include <asm/openprom.h> 13 #include <asm/oplib.h> 14 #include <asm/types.h> 15 16 static struct linux_prom_ranges promlib_obio_r 17 static int num_obio_ranges; 18 19 /* Adjust register values based upon the range 20 static void prom_adjust_regs(struct linux_prom 21 struct linux_prom 22 { 23 int regc, rngc; 24 25 for (regc = 0; regc < nregs; regc++) { 26 for (rngc = 0; rngc < nranges; 27 if (regp[regc].which_i 28 break; /* Foun 29 if (rngc == nranges) /* oops * 30 prom_printf("adjust_re 31 regp[regc].which_io = rangep[r 32 regp[regc].phys_addr -= rangep 33 regp[regc].phys_addr += rangep 34 } 35 } 36 37 static void prom_adjust_ranges(struct linux_pr 38 struct linux_pr 39 { 40 int rng1c, rng2c; 41 42 for (rng1c = 0; rng1c < nranges1; rng1 43 for (rng2c = 0; rng2c < nrange 44 if (ranges1[rng1c].ot_ 45 ranges1[rng1c].ot_p 46 ranges2[rng2c].ot_c 47 break; 48 if (rng2c == nranges2) /* oops 49 prom_printf("adjust_ra 50 else if (ranges1[rng1c].ot_par 51 ranges1[rng1c].or_size 52 ranges1[rng1c].ot_parent_space 53 ranges1[rng1c].ot_parent_base 54 } 55 } 56 57 /* Apply probed obio ranges to registers passe 58 void prom_apply_obio_ranges(struct linux_prom_ 59 { 60 if (num_obio_ranges) 61 prom_adjust_regs(regs, nregs, 62 } 63 EXPORT_SYMBOL(prom_apply_obio_ranges); 64 65 void __init prom_ranges_init(void) 66 { 67 phandle node, obio_node; 68 int success; 69 70 num_obio_ranges = 0; 71 72 /* Check for obio and sbus ranges. */ 73 node = prom_getchild(prom_root_node); 74 obio_node = prom_searchsiblings(node, 75 76 if (obio_node) { 77 success = prom_getproperty(obi 78 (ch 79 siz 80 if (success != -1) 81 num_obio_ranges = (suc 82 } 83 84 if (num_obio_ranges) 85 prom_printf("PROMLIB: obio_ran 86 } 87 88 void prom_apply_generic_ranges(phandle node, p 89 struct linux_pr 90 { 91 int success; 92 int num_ranges; 93 struct linux_prom_ranges ranges[PROMRE 94 95 success = prom_getproperty(node, "rang 96 (char *) ra 97 sizeof(rang 98 if (success != -1) { 99 num_ranges = (success / sizeof 100 if (parent) { 101 struct linux_prom_rang 102 int num_parent_ranges; 103 104 success = prom_getprop 105 106 107 if (success != -1) { 108 num_parent_ran 109 prom_adjust_ra 110 } 111 } 112 prom_adjust_regs(regs, nregs, 113 } 114 } 115
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.