18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Copyright (C) 1999, 2000 Ralf Baechle (ralf@gnu.org)
48c2ecf20Sopenharmony_ci * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
58c2ecf20Sopenharmony_ci */
68c2ecf20Sopenharmony_ci#include <linux/kernel.h>
78c2ecf20Sopenharmony_ci#include <linux/sched.h>
88c2ecf20Sopenharmony_ci#include <linux/interrupt.h>
98c2ecf20Sopenharmony_ci#include <linux/kernel_stat.h>
108c2ecf20Sopenharmony_ci#include <linux/param.h>
118c2ecf20Sopenharmony_ci#include <linux/timex.h>
128c2ecf20Sopenharmony_ci#include <linux/mm.h>
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ci#include <asm/sn/klconfig.h>
158c2ecf20Sopenharmony_ci#include <asm/sn/arch.h>
168c2ecf20Sopenharmony_ci#include <asm/sn/gda.h>
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_ciklinfo_t *find_component(lboard_t *brd, klinfo_t *kli, unsigned char struct_type)
198c2ecf20Sopenharmony_ci{
208c2ecf20Sopenharmony_ci	int index, j;
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_ci	if (kli == (klinfo_t *)NULL) {
238c2ecf20Sopenharmony_ci		index = 0;
248c2ecf20Sopenharmony_ci	} else {
258c2ecf20Sopenharmony_ci		for (j = 0; j < KLCF_NUM_COMPS(brd); j++)
268c2ecf20Sopenharmony_ci			if (kli == KLCF_COMP(brd, j))
278c2ecf20Sopenharmony_ci				break;
288c2ecf20Sopenharmony_ci		index = j;
298c2ecf20Sopenharmony_ci		if (index == KLCF_NUM_COMPS(brd)) {
308c2ecf20Sopenharmony_ci			printk("find_component: Bad pointer: 0x%p\n", kli);
318c2ecf20Sopenharmony_ci			return (klinfo_t *)NULL;
328c2ecf20Sopenharmony_ci		}
338c2ecf20Sopenharmony_ci		index++;		/* next component */
348c2ecf20Sopenharmony_ci	}
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_ci	for (; index < KLCF_NUM_COMPS(brd); index++) {
378c2ecf20Sopenharmony_ci		kli = KLCF_COMP(brd, index);
388c2ecf20Sopenharmony_ci		if (KLCF_COMP_TYPE(kli) == struct_type)
398c2ecf20Sopenharmony_ci			return kli;
408c2ecf20Sopenharmony_ci	}
418c2ecf20Sopenharmony_ci
428c2ecf20Sopenharmony_ci	/* Didn't find it. */
438c2ecf20Sopenharmony_ci	return (klinfo_t *)NULL;
448c2ecf20Sopenharmony_ci}
458c2ecf20Sopenharmony_ci
468c2ecf20Sopenharmony_ciklinfo_t *find_first_component(lboard_t *brd, unsigned char struct_type)
478c2ecf20Sopenharmony_ci{
488c2ecf20Sopenharmony_ci	return find_component(brd, (klinfo_t *)NULL, struct_type);
498c2ecf20Sopenharmony_ci}
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_cilboard_t *find_lboard(lboard_t *start, unsigned char brd_type)
528c2ecf20Sopenharmony_ci{
538c2ecf20Sopenharmony_ci	/* Search all boards stored on this node. */
548c2ecf20Sopenharmony_ci	while (start) {
558c2ecf20Sopenharmony_ci		if (start->brd_type == brd_type)
568c2ecf20Sopenharmony_ci			return start;
578c2ecf20Sopenharmony_ci		start = KLCF_NEXT(start);
588c2ecf20Sopenharmony_ci	}
598c2ecf20Sopenharmony_ci	/* Didn't find it. */
608c2ecf20Sopenharmony_ci	return (lboard_t *)NULL;
618c2ecf20Sopenharmony_ci}
628c2ecf20Sopenharmony_ci
638c2ecf20Sopenharmony_cilboard_t *find_lboard_class(lboard_t *start, unsigned char brd_type)
648c2ecf20Sopenharmony_ci{
658c2ecf20Sopenharmony_ci	/* Search all boards stored on this node. */
668c2ecf20Sopenharmony_ci	while (start) {
678c2ecf20Sopenharmony_ci		if (KLCLASS(start->brd_type) == KLCLASS(brd_type))
688c2ecf20Sopenharmony_ci			return start;
698c2ecf20Sopenharmony_ci		start = KLCF_NEXT(start);
708c2ecf20Sopenharmony_ci	}
718c2ecf20Sopenharmony_ci
728c2ecf20Sopenharmony_ci	/* Didn't find it. */
738c2ecf20Sopenharmony_ci	return (lboard_t *)NULL;
748c2ecf20Sopenharmony_ci}
75