/* * We' call this early before loadmmu(). If we do the other way around * the firmware will crash and burn. */ void __init sgi_sysinit(void) { pcomponent *p, *toplev, *cpup = 0; int cputype = -1; long cnt; char c; /* The root component tells us what machine architecture we * have here. */ p = ArcGetChild(PROM_NULL_COMPONENT); /* Now scan for cpu(s). */ toplev = p = ArcGetChild(p); while(p) { int ncpus = 0; if(p->type == Cpu) { if(++ncpus > 1) { prom_printf("\nYeee, SGI MP not ready yet\n"); prom_printf("press a key to reboot\n"); ArcRead(0, &c, 1, &cnt); ArcEnterInteractiveMode(); } printk("CPU: %s ", p->iname); cpup = p; cputype = string_to_cpu(cpup->iname); } p = ArcGetPeer(p); } if (cputype == -1) { prom_printf("\nYeee, could not find cpu ARCS component\n"); prom_printf("press a key to reboot\n"); ArcRead(0, &c, 1, &cnt); ArcEnterInteractiveMode(); } p = ArcGetChild(cpup); while(p) { switch(p->class) { case processor: switch(p->type) { case Fpu: printk("FPU<%s> ", p->iname); break; default: break; }; break; case cache: switch(p->type) { case picache: printk("ICACHE "); break; case pdcache: printk("DCACHE "); break; case sccache: printk("SCACHE "); break; default: break; }; break; default: break; }; p = ArcGetPeer(p); } printk("\n"); }
ARC_STATUS BlConfigurationInitialize ( IN PCONFIGURATION_COMPONENT Parent, IN PCONFIGURATION_COMPONENT_DATA ParentEntry ) /*++ Routine Description: This routine traverses the firmware configuration tree from the specified parent entry and constructs the corresponding NT configuration tree. Arguments: None. Return Value: ESUCCESS is returned if the initialization is successful. Otherwise, an unsuccessful status that describes the error is returned. --*/ { PCONFIGURATION_COMPONENT Child; PCONFIGURATION_COMPONENT_DATA ChildEntry; PCHAR ConfigurationData; PCONFIGURATION_COMPONENT_DATA PreviousSibling; PCONFIGURATION_COMPONENT Sibling; PCONFIGURATION_COMPONENT_DATA SiblingEntry; ARC_STATUS Status; // // Traverse the child configuration tree and allocate, initialize, and // construct the corresponding NT configuration tree. // Child = ArcGetChild(Parent); while (Child != NULL) { // // Allocate an entry of the appropriate size to hold the child // configuration information. // ChildEntry = (PCONFIGURATION_COMPONENT_DATA)BlAllocateHeap( sizeof(CONFIGURATION_COMPONENT_DATA) + Child->IdentifierLength + Child->ConfigurationDataLength); if (ChildEntry == NULL) { return ENOMEM; } // // Initialize the tree pointers and copy the component data. // if (ParentEntry == NULL) { BlLoaderBlock->ConfigurationRoot = ChildEntry; } else { ParentEntry->Child = ChildEntry; } ChildEntry->Parent = ParentEntry; ChildEntry->Sibling = NULL; ChildEntry->Child = NULL; RtlMoveMemory((PVOID)&ChildEntry->ComponentEntry, (PVOID)Child, sizeof(CONFIGURATION_COMPONENT)); ConfigurationData = (PCHAR)(ChildEntry + 1); // // If configuration data is specified, then copy the configuration // data. // if (Child->ConfigurationDataLength != 0) { ChildEntry->ConfigurationData = (PVOID)ConfigurationData; Status = ArcGetConfigurationData((PVOID)ConfigurationData, Child); if (Status != ESUCCESS) { return Status; } ConfigurationData += Child->ConfigurationDataLength; } else { ChildEntry->ConfigurationData = NULL; } // // If identifier data is specified, then copy the identifier data. // if (Child->IdentifierLength !=0) { ChildEntry->ComponentEntry.Identifier = ConfigurationData; RtlMoveMemory((PVOID)ConfigurationData, (PVOID)Child->Identifier, Child->IdentifierLength); } else { ChildEntry->ComponentEntry.Identifier = NULL; } // // Traverse the sibling configuration tree and allocate, initialize, // and construct the corresponding NT configuration tree. // PreviousSibling = ChildEntry; Sibling = ArcGetPeer(Child); while (Sibling != NULL) { // // Allocate an entry of the appropriate size to hold the sibling // configuration information. // SiblingEntry = (PCONFIGURATION_COMPONENT_DATA)BlAllocateHeap( sizeof(CONFIGURATION_COMPONENT_DATA) + Sibling->IdentifierLength + Sibling->ConfigurationDataLength); if (SiblingEntry == NULL) { return ENOMEM; } // // Initialize the tree pointers and copy the component data. // SiblingEntry->Parent = ParentEntry; SiblingEntry->Sibling = NULL; ChildEntry->Child = NULL; RtlMoveMemory((PVOID)&SiblingEntry->ComponentEntry, (PVOID)Sibling, sizeof(CONFIGURATION_COMPONENT)); ConfigurationData = (PCHAR)(SiblingEntry + 1); // // If configuration data is specified, then copy the configuration // data. // if (Sibling->ConfigurationDataLength != 0) { SiblingEntry->ConfigurationData = (PVOID)ConfigurationData; Status = ArcGetConfigurationData((PVOID)ConfigurationData, Sibling); if (Status != ESUCCESS) { return Status; } ConfigurationData += Sibling->ConfigurationDataLength; } else { SiblingEntry->ConfigurationData = NULL; } // // If identifier data is specified, then copy the identifier data. // if (Sibling->IdentifierLength !=0) { SiblingEntry->ComponentEntry.Identifier = ConfigurationData; RtlMoveMemory((PVOID)ConfigurationData, (PVOID)Sibling->Identifier, Sibling->IdentifierLength); } else { SiblingEntry->ComponentEntry.Identifier = NULL; } // // If the sibling has a child, then generate the tree for the // child. // if (ArcGetChild(Sibling) != NULL) { Status = BlConfigurationInitialize(Sibling, SiblingEntry); if (Status != ESUCCESS) { return Status; } } // // Set new sibling pointers and get the next sibling tree entry. // PreviousSibling->Sibling = SiblingEntry; PreviousSibling = SiblingEntry; Sibling = ArcGetPeer(Sibling); } // // Set new parent pointers and get the next child tree entry. // Parent = Child; ParentEntry = ChildEntry; Child = ArcGetChild(Child); } return ESUCCESS; }