blob: 4c7bf21ec700b6a24e3820ec50eae0d8e94bcaed [file] [log] [blame]
/* Prom ranges
Copyright (C) 1996 David Miller
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
USA. */
#include <silo.h>
struct linux_prom_ranges promlib_obio_ranges[PROMREG_MAX];
int num_obio_ranges;
/* Adjust register values based upon the ranges parameters. */
void prom_adjust_regs (struct linux_prom_registers *regp, int nregs,
struct linux_prom_ranges *rangep, int nranges)
{
int regc, rngc;
for (regc = 0; regc < nregs; regc++) {
for (rngc = 0; rngc < nranges; rngc++)
if (regp[regc].which_io == rangep[rngc].ot_child_space)
break; /* Found it */
if (rngc == nranges) /* oops */
printf ("adjust_regs: Could not find range with matching bus type...\n");
regp[regc].which_io = rangep[rngc].ot_parent_space;
regp[regc].phys_addr += rangep[rngc].ot_parent_base;
}
}
/* Apply probed obio ranges to registers passed, if no ranges return. */
void prom_apply_obio_ranges (struct linux_prom_registers *regs, int nregs)
{
if (!num_obio_ranges)
return;
prom_adjust_regs (regs, nregs, promlib_obio_ranges, num_obio_ranges);
}
void prom_ranges_init (void)
{
int node, obio_node;
int success;
num_obio_ranges = 0;
/* Check for obio and sbus ranges. */
node = prom_getchild (prom_root_node);
obio_node = prom_searchsiblings (node, "obio");
if (obio_node) {
success = prom_getproperty (obio_node, "ranges",
(char *) promlib_obio_ranges,
sizeof (promlib_obio_ranges));
if (success != -1)
num_obio_ranges = (success / sizeof (struct linux_prom_ranges));
}
}