xref: /openbmc/linux/arch/alpha/kernel/gct.c (revision b2441318)
1b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds  *	linux/arch/alpha/kernel/gct.c
41da177e4SLinus Torvalds  */
51da177e4SLinus Torvalds 
61da177e4SLinus Torvalds #include <linux/kernel.h>
71da177e4SLinus Torvalds #include <linux/types.h>
81da177e4SLinus Torvalds #include <linux/errno.h>
91da177e4SLinus Torvalds 
101da177e4SLinus Torvalds #include <asm/hwrpb.h>
111da177e4SLinus Torvalds #include <asm/gct.h>
121da177e4SLinus Torvalds 
131da177e4SLinus Torvalds int
gct6_find_nodes(gct6_node * node,gct6_search_struct * search)141da177e4SLinus Torvalds gct6_find_nodes(gct6_node *node, gct6_search_struct *search)
151da177e4SLinus Torvalds {
161da177e4SLinus Torvalds 	gct6_search_struct *wanted;
171da177e4SLinus Torvalds 	int status = 0;
181da177e4SLinus Torvalds 
191da177e4SLinus Torvalds 	/* First check the magic number.  */
201da177e4SLinus Torvalds 	if (node->magic != GCT_NODE_MAGIC) {
211da177e4SLinus Torvalds 		printk(KERN_ERR "GCT Node MAGIC incorrect - GCT invalid\n");
221da177e4SLinus Torvalds 		return -EINVAL;
231da177e4SLinus Torvalds 	}
241da177e4SLinus Torvalds 
251da177e4SLinus Torvalds 	/* Check against the search struct.  */
261da177e4SLinus Torvalds 	for (wanted = search;
271da177e4SLinus Torvalds 	     wanted && (wanted->type | wanted->subtype);
281da177e4SLinus Torvalds 	     wanted++) {
291da177e4SLinus Torvalds 		if (node->type != wanted->type)
301da177e4SLinus Torvalds 			continue;
311da177e4SLinus Torvalds 		if (node->subtype != wanted->subtype)
321da177e4SLinus Torvalds 			continue;
331da177e4SLinus Torvalds 
341da177e4SLinus Torvalds 		/* Found it -- call out.  */
351da177e4SLinus Torvalds 		if (wanted->callout)
361da177e4SLinus Torvalds 			wanted->callout(node);
371da177e4SLinus Torvalds 	}
381da177e4SLinus Torvalds 
391da177e4SLinus Torvalds 	/* Now walk the tree, siblings first.  */
401da177e4SLinus Torvalds 	if (node->next)
411da177e4SLinus Torvalds 		status |= gct6_find_nodes(GCT_NODE_PTR(node->next), search);
421da177e4SLinus Torvalds 
431da177e4SLinus Torvalds 	/* Then the children.  */
441da177e4SLinus Torvalds 	if (node->child)
451da177e4SLinus Torvalds 		status |= gct6_find_nodes(GCT_NODE_PTR(node->child), search);
461da177e4SLinus Torvalds 
471da177e4SLinus Torvalds 	return status;
481da177e4SLinus Torvalds }
49