1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * linux/arch/alpha/kernel/gct.c 4 */ 5 6 #include <linux/kernel.h> 7 #include <linux/types.h> 8 #include <linux/errno.h> 9 10 #include <asm/hwrpb.h> 11 #include <asm/gct.h> 12 13 int 14 gct6_find_nodes(gct6_node *node, gct6_search_struct *search) 15 { 16 gct6_search_struct *wanted; 17 int status = 0; 18 19 /* First check the magic number. */ 20 if (node->magic != GCT_NODE_MAGIC) { 21 printk(KERN_ERR "GCT Node MAGIC incorrect - GCT invalid\n"); 22 return -EINVAL; 23 } 24 25 /* Check against the search struct. */ 26 for (wanted = search; 27 wanted && (wanted->type | wanted->subtype); 28 wanted++) { 29 if (node->type != wanted->type) 30 continue; 31 if (node->subtype != wanted->subtype) 32 continue; 33 34 /* Found it -- call out. */ 35 if (wanted->callout) 36 wanted->callout(node); 37 } 38 39 /* Now walk the tree, siblings first. */ 40 if (node->next) 41 status |= gct6_find_nodes(GCT_NODE_PTR(node->next), search); 42 43 /* Then the children. */ 44 if (node->child) 45 status |= gct6_find_nodes(GCT_NODE_PTR(node->child), search); 46 47 return status; 48 } 49