📄 klconflib.c
字号:
/* $Id$ * * This file is subject to the terms and conditions of the GNU General Public * License. See the file "COPYING" in the main directory of this archive * for more details. * * Copyright (C) 1992 - 1997, 2000-2003 Silicon Graphics, Inc. All rights reserved. */#include <linux/types.h>#include <linux/ctype.h>#include <asm/sn/sgi.h>#include <asm/sn/sn_sal.h>#include <asm/sn/io.h>#include <asm/sn/sn_cpuid.h>#include <asm/sn/iograph.h>#include <asm/sn/invent.h>#include <asm/sn/hcl.h>#include <asm/sn/labelcl.h>#include <asm/sn/klconfig.h>#include <asm/sn/nodepda.h>#include <asm/sn/module.h>#include <asm/sn/router.h>#include <asm/sn/xtalk/xbow.h>#define LDEBUG 0#define NIC_UNKNOWN ((nic_t) -1)#undef DEBUG_KLGRAPH#ifdef DEBUG_KLGRAPH#define DBG(x...) printk(x)#else#define DBG(x...)#endif /* DEBUG_KLGRAPH */u64 klgraph_addr[MAX_COMPACT_NODES];static int hasmetarouter;char brick_types[MAX_BRICK_TYPES + 1] = "crikxdpn%#=vo2345";lboard_t *find_lboard(lboard_t *start, unsigned char brd_type){ /* Search all boards stored on this node. */ while (start) { if (start->brd_type == brd_type) return start; start = KLCF_NEXT(start); } /* Didn't find it. */ return (lboard_t *)NULL;}lboard_t *find_lboard_class(lboard_t *start, unsigned char brd_type){ /* Search all boards stored on this node. */ while (start) { if (KLCLASS(start->brd_type) == KLCLASS(brd_type)) return start; start = KLCF_NEXT(start); } /* Didn't find it. */ return (lboard_t *)NULL;}klinfo_t *find_component(lboard_t *brd, klinfo_t *kli, unsigned char struct_type){ int index, j; if (kli == (klinfo_t *)NULL) { index = 0; } else { for (j = 0; j < KLCF_NUM_COMPS(brd); j++) { if (kli == KLCF_COMP(brd, j)) break; } index = j; if (index == KLCF_NUM_COMPS(brd)) { DBG("find_component: Bad pointer: 0x%p\n", kli); return (klinfo_t *)NULL; } index++; /* next component */ } for (; index < KLCF_NUM_COMPS(brd); index++) { kli = KLCF_COMP(brd, index); DBG("find_component: brd %p kli %p request type = 0x%x kli type 0x%x\n", brd, kli, kli->struct_type, KLCF_COMP_TYPE(kli)); if (KLCF_COMP_TYPE(kli) == struct_type) return kli; } /* Didn't find it. */ return (klinfo_t *)NULL;}klinfo_t *find_first_component(lboard_t *brd, unsigned char struct_type){ return find_component(brd, (klinfo_t *)NULL, struct_type);}lboard_t *find_lboard_modslot(lboard_t *start, geoid_t geoid){ /* Search all boards stored on this node. */ while (start) { if (geo_cmp(start->brd_geoid, geoid)) return start; start = KLCF_NEXT(start); } /* Didn't find it. */ return (lboard_t *)NULL;}lboard_t *find_lboard_module(lboard_t *start, geoid_t geoid){ /* Search all boards stored on this node. */ while (start) { if (geo_cmp(start->brd_geoid, geoid)) return start; start = KLCF_NEXT(start); } /* Didn't find it. */ return (lboard_t *)NULL;}/* * Convert a NIC name to a name for use in the hardware graph. */voidnic_name_convert(char *old_name, char *new_name){ int i; char c; char *compare_ptr; if ((old_name[0] == '\0') || (old_name[1] == '\0')) { strcpy(new_name, EDGE_LBL_XWIDGET); } else { for (i = 0; i < strlen(old_name); i++) { c = old_name[i]; if (isalpha(c)) new_name[i] = tolower(c); else if (isdigit(c)) new_name[i] = c; else new_name[i] = '_'; } new_name[i] = '\0'; } /* XXX - * Since a bunch of boards made it out with weird names like * IO6-fibbbed and IO6P2, we need to look for IO6 in a name and * replace it with "baseio" to avoid confusion in the field. * We also have to make sure we don't report media_io instead of * baseio. */ /* Skip underscores at the beginning of the name */ for (compare_ptr = new_name; (*compare_ptr) == '_'; compare_ptr++) ; /* * Check for some names we need to replace. Early boards * had junk following the name so check only the first * characters. */ if (!strncmp(new_name, "io6", 3) || !strncmp(new_name, "mio", 3) || !strncmp(new_name, "media_io", 8)) strcpy(new_name, "baseio"); else if (!strncmp(new_name, "divo", 4)) strcpy(new_name, "divo") ;}/* * get_actual_nasid * * Completely disabled brds have their klconfig on * some other nasid as they have no memory. But their * actual nasid is hidden in the klconfig. Use this * routine to get it. Works for normal boards too. */nasid_tget_actual_nasid(lboard_t *brd){ klhub_t *hub ; if (!brd) return INVALID_NASID ; /* find out if we are a completely disabled brd. */ hub = (klhub_t *)find_first_component(brd, KLSTRUCT_HUB); if (!hub) return INVALID_NASID ; if (!(hub->hub_info.flags & KLINFO_ENABLE)) /* disabled node brd */ return hub->hub_info.physid ; else return brd->brd_nasid ;}intxbow_port_io_enabled(nasid_t nasid, int link){ lboard_t *brd; klxbow_t *xbow_p; /* * look for boards that might contain an xbow or xbridge */ brd = find_lboard((lboard_t *)KL_CONFIG_INFO(nasid), KLTYPE_IOBRICK_XBOW); if (brd == NULL) return 0; if ((xbow_p = (klxbow_t *)find_component(brd, NULL, KLSTRUCT_XBOW)) == NULL) return 0; if (!XBOW_PORT_TYPE_IO(xbow_p, link) || !XBOW_PORT_IS_ENABLED(xbow_p, link)) return 0; return 1;}voidboard_to_path(lboard_t *brd, char *path){ moduleid_t modnum; char *board_name; char buffer[16]; ASSERT(brd); switch (KLCLASS(brd->brd_type)) { case KLCLASS_NODE: board_name = EDGE_LBL_NODE; break; case KLCLASS_ROUTER: if (brd->brd_type == KLTYPE_META_ROUTER) { board_name = EDGE_LBL_META_ROUTER; hasmetarouter++; } else if (brd->brd_type == KLTYPE_REPEATER_ROUTER) { board_name = EDGE_LBL_REPEATER_ROUTER; hasmetarouter++; } else board_name = EDGE_LBL_ROUTER; break; case KLCLASS_MIDPLANE: board_name = EDGE_LBL_MIDPLANE; break; case KLCLASS_IO: board_name = EDGE_LBL_IO; break; case KLCLASS_IOBRICK: if (brd->brd_type == KLTYPE_PXBRICK) board_name = EDGE_LBL_PXBRICK; else if (brd->brd_type == KLTYPE_IXBRICK) board_name = EDGE_LBL_IXBRICK; else if (brd->brd_type == KLTYPE_PBRICK) board_name = EDGE_LBL_PBRICK; else if (brd->brd_type == KLTYPE_IBRICK) board_name = EDGE_LBL_IBRICK; else if (brd->brd_type == KLTYPE_XBRICK) board_name = EDGE_LBL_XBRICK; else if (brd->brd_type == KLTYPE_PEBRICK) board_name = EDGE_LBL_PEBRICK; else if (brd->brd_type == KLTYPE_OPUSBRICK) board_name = EDGE_LBL_OPUSBRICK; else if (brd->brd_type == KLTYPE_CGBRICK) board_name = EDGE_LBL_CGBRICK; else board_name = EDGE_LBL_IOBRICK; break; default: board_name = EDGE_LBL_UNKNOWN; } modnum = geo_module(brd->brd_geoid); memset(buffer, 0, 16); format_module_id(buffer, modnum, MODULE_FORMAT_BRIEF); sprintf(path, EDGE_LBL_MODULE "/%s/" EDGE_LBL_SLAB "/%d/%s", buffer, geo_slab(brd->brd_geoid), board_name);}#define MHZ 1000000/* Get the canonical hardware graph name for the given pci component * on the given io board. */voiddevice_component_canonical_name_get(lboard_t *brd, klinfo_t *component, char *name){ slotid_t slot; char board_name[20]; ASSERT(brd); /* Convert the [ CLASS | TYPE ] kind of slotid * into a string */ slot = brd->brd_slot; /* Get the io board name */ if (!brd || (brd->brd_sversion < 2)) { strcpy(name, EDGE_LBL_XWIDGET); } else { nic_name_convert(brd->brd_name, board_name); } /* Give out the canonical name of the pci device*/ sprintf(name, "/dev/hw/"EDGE_LBL_MODULE "/%x/"EDGE_LBL_SLAB"/%d/" EDGE_LBL_SLOT"/%s/"EDGE_LBL_PCI"/%d", geo_module(brd->brd_geoid), geo_slab(brd->brd_geoid), board_name, KLCF_BRIDGE_W_ID(component));}/* * Get the serial number of the main component of a board * Returns 0 if a valid serial number is found * 1 otherwise. * Assumptions: Nic manufacturing string has the following format * *Serial:<serial_number>;* */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -