162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 1999, 2000 Ralf Baechle (ralf@gnu.org)
462306a36Sopenharmony_ci * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
562306a36Sopenharmony_ci */
662306a36Sopenharmony_ci#include <linux/kernel.h>
762306a36Sopenharmony_ci#include <linux/sched.h>
862306a36Sopenharmony_ci#include <linux/interrupt.h>
962306a36Sopenharmony_ci#include <linux/kernel_stat.h>
1062306a36Sopenharmony_ci#include <linux/param.h>
1162306a36Sopenharmony_ci#include <linux/timex.h>
1262306a36Sopenharmony_ci#include <linux/mm.h>
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#include <asm/sn/klconfig.h>
1562306a36Sopenharmony_ci#include <asm/sn/arch.h>
1662306a36Sopenharmony_ci#include <asm/sn/gda.h>
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ciklinfo_t *find_component(lboard_t *brd, klinfo_t *kli, unsigned char struct_type)
1962306a36Sopenharmony_ci{
2062306a36Sopenharmony_ci	int index, j;
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci	if (kli == (klinfo_t *)NULL) {
2362306a36Sopenharmony_ci		index = 0;
2462306a36Sopenharmony_ci	} else {
2562306a36Sopenharmony_ci		for (j = 0; j < KLCF_NUM_COMPS(brd); j++)
2662306a36Sopenharmony_ci			if (kli == KLCF_COMP(brd, j))
2762306a36Sopenharmony_ci				break;
2862306a36Sopenharmony_ci		index = j;
2962306a36Sopenharmony_ci		if (index == KLCF_NUM_COMPS(brd)) {
3062306a36Sopenharmony_ci			printk("find_component: Bad pointer: 0x%p\n", kli);
3162306a36Sopenharmony_ci			return (klinfo_t *)NULL;
3262306a36Sopenharmony_ci		}
3362306a36Sopenharmony_ci		index++;		/* next component */
3462306a36Sopenharmony_ci	}
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci	for (; index < KLCF_NUM_COMPS(brd); index++) {
3762306a36Sopenharmony_ci		kli = KLCF_COMP(brd, index);
3862306a36Sopenharmony_ci		if (KLCF_COMP_TYPE(kli) == struct_type)
3962306a36Sopenharmony_ci			return kli;
4062306a36Sopenharmony_ci	}
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci	/* Didn't find it. */
4362306a36Sopenharmony_ci	return (klinfo_t *)NULL;
4462306a36Sopenharmony_ci}
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ciklinfo_t *find_first_component(lboard_t *brd, unsigned char struct_type)
4762306a36Sopenharmony_ci{
4862306a36Sopenharmony_ci	return find_component(brd, (klinfo_t *)NULL, struct_type);
4962306a36Sopenharmony_ci}
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_cilboard_t *find_lboard(lboard_t *start, unsigned char brd_type)
5262306a36Sopenharmony_ci{
5362306a36Sopenharmony_ci	/* Search all boards stored on this node. */
5462306a36Sopenharmony_ci	while (start) {
5562306a36Sopenharmony_ci		if (start->brd_type == brd_type)
5662306a36Sopenharmony_ci			return start;
5762306a36Sopenharmony_ci		start = KLCF_NEXT(start);
5862306a36Sopenharmony_ci	}
5962306a36Sopenharmony_ci	/* Didn't find it. */
6062306a36Sopenharmony_ci	return (lboard_t *)NULL;
6162306a36Sopenharmony_ci}
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_cilboard_t *find_lboard_class(lboard_t *start, unsigned char brd_type)
6462306a36Sopenharmony_ci{
6562306a36Sopenharmony_ci	/* Search all boards stored on this node. */
6662306a36Sopenharmony_ci	while (start) {
6762306a36Sopenharmony_ci		if (KLCLASS(start->brd_type) == KLCLASS(brd_type))
6862306a36Sopenharmony_ci			return start;
6962306a36Sopenharmony_ci		start = KLCF_NEXT(start);
7062306a36Sopenharmony_ci	}
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci	/* Didn't find it. */
7362306a36Sopenharmony_ci	return (lboard_t *)NULL;
7462306a36Sopenharmony_ci}
75