mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1613 lines
57 KiB
1613 lines
57 KiB
/*++
|
|
|
|
Copyright (c) 1991 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
jzconfig.c
|
|
|
|
Abstract:
|
|
|
|
This module contains the code to make the configuration
|
|
data structures in the Jazz NVRAM.
|
|
|
|
|
|
Author:
|
|
|
|
David M. Robinson (davidro) 25-Oct-1991
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "jzsetup.h"
|
|
#include "jxvideo.h"
|
|
#include "oli2msft.h"
|
|
#include "inc.h"
|
|
|
|
#define MAXIMUM_DEVICE_SPECIFIC_DATA 32
|
|
|
|
|
|
VOID
|
|
JzMakeComponent (
|
|
PCONFIGURATION_COMPONENT Component,
|
|
CONFIGURATION_CLASS Class,
|
|
CONFIGURATION_TYPE Type,
|
|
BOOLEAN ReadOnly,
|
|
BOOLEAN Removable,
|
|
BOOLEAN ConsoleIn,
|
|
BOOLEAN ConsoleOut,
|
|
BOOLEAN Input,
|
|
BOOLEAN Output,
|
|
ULONG Key,
|
|
ULONG ConfigurationDataLength,
|
|
PCHAR Identifier
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine fills in a configuration component structure.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
{
|
|
//
|
|
// Set values that are constant for all entries.
|
|
//
|
|
|
|
Component->Version = ARC_VERSION;
|
|
Component->Revision = ARC_REVISION;
|
|
Component->AffinityMask = 0xffffffff;
|
|
Component->Flags.Failed = 0;
|
|
|
|
//
|
|
// Fill out the structure.
|
|
//
|
|
|
|
Component->Class = Class;
|
|
Component->Type = Type;
|
|
Component->Flags.ReadOnly = ReadOnly ? 1 : 0;
|
|
Component->Flags.Removable = Removable ? 1 : 0;
|
|
Component->Flags.ConsoleIn = ConsoleIn ? 1 : 0;
|
|
Component->Flags.ConsoleOut = ConsoleOut ? 1 : 0;
|
|
Component->Flags.Input = Input ? 1 : 0;
|
|
Component->Flags.Output = Output ? 1 : 0;
|
|
Component->Key = Key;
|
|
Component->ConfigurationDataLength = ConfigurationDataLength;
|
|
if (Identifier != NULL) {
|
|
Component->IdentifierLength = strlen(Identifier) + 1;
|
|
} else {
|
|
Component->IdentifierLength = 0;
|
|
}
|
|
Component->Identifier = Identifier;
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
ULONG
|
|
JzMakeDescriptor (
|
|
PCM_PARTIAL_RESOURCE_LIST Descriptor,
|
|
BOOLEAN Port,
|
|
ULONG PortStart,
|
|
ULONG PortSize,
|
|
BOOLEAN Interrupt,
|
|
USHORT InterruptFlags,
|
|
ULONG Level,
|
|
ULONG Vector,
|
|
BOOLEAN Memory,
|
|
ULONG MemoryStart,
|
|
ULONG MemorySize,
|
|
BOOLEAN Dma,
|
|
ULONG Channel,
|
|
BOOLEAN SecondChannel, // Hack for sound
|
|
BOOLEAN DeviceSpecificData,
|
|
ULONG Size,
|
|
PVOID Data
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine creates a resource descriptor structure.
|
|
|
|
Arguments:
|
|
|
|
|
|
Return Value:
|
|
|
|
Returns the size of the structure.
|
|
|
|
--*/
|
|
{
|
|
ULONG Index;
|
|
PCM_PARTIAL_RESOURCE_DESCRIPTOR Partial;
|
|
|
|
Index = 0;
|
|
|
|
if (Port) {
|
|
Partial = &Descriptor->PartialDescriptors[Index];
|
|
Partial->Type = CmResourceTypePort;
|
|
Partial->ShareDisposition = CmResourceShareDeviceExclusive;
|
|
Partial->Flags = 0;
|
|
Partial->u.Port.Start.LowPart = PortStart;
|
|
Partial->u.Port.Start.HighPart = 0;
|
|
Partial->u.Port.Length = PortSize;
|
|
Index++;
|
|
}
|
|
|
|
if (Interrupt) {
|
|
Partial = &Descriptor->PartialDescriptors[Index];
|
|
Partial->Type = CmResourceTypeInterrupt;
|
|
Partial->ShareDisposition = CmResourceShareDeviceExclusive;
|
|
Partial->Flags = InterruptFlags;
|
|
Partial->u.Interrupt.Level = Level;
|
|
Partial->u.Interrupt.Vector = Vector;
|
|
Partial->u.Interrupt.Affinity = 0;
|
|
Index++;
|
|
}
|
|
|
|
if (Memory) {
|
|
Partial = &Descriptor->PartialDescriptors[Index];
|
|
Partial->Type = CmResourceTypeMemory;
|
|
Partial->ShareDisposition = CmResourceShareDeviceExclusive;
|
|
Partial->Flags = 0;
|
|
Partial->u.Memory.Start.LowPart = MemoryStart;
|
|
Partial->u.Memory.Start.HighPart = 0;
|
|
Partial->u.Memory.Length = MemorySize;
|
|
Index++;
|
|
}
|
|
|
|
if (Dma) {
|
|
Partial = &Descriptor->PartialDescriptors[Index];
|
|
Partial->Type = CmResourceTypeDma;
|
|
Partial->ShareDisposition = CmResourceShareDeviceExclusive;
|
|
Partial->Flags = 0;
|
|
Partial->u.Dma.Channel = Channel;
|
|
Partial->u.Dma.Port = 0;
|
|
Partial->u.Dma.Reserved1 = 0;
|
|
Index++;
|
|
if (SecondChannel) {
|
|
Partial = &Descriptor->PartialDescriptors[Index];
|
|
Partial->Type = CmResourceTypeDma;
|
|
Partial->ShareDisposition = CmResourceShareDeviceExclusive;
|
|
Partial->Flags = 0;
|
|
Partial->u.Dma.Channel = Channel + 1;
|
|
Partial->u.Dma.Port = 0;
|
|
Partial->u.Dma.Reserved1 = 0;
|
|
Index++;
|
|
}
|
|
}
|
|
|
|
if (DeviceSpecificData) {
|
|
// Should add a check for maximum size of data.
|
|
Partial = &Descriptor->PartialDescriptors[Index];
|
|
Partial->Type = CmResourceTypeDeviceSpecific;
|
|
Partial->ShareDisposition = CmResourceShareDeviceExclusive;
|
|
Partial->Flags = 0;
|
|
Partial->u.DeviceSpecificData.DataSize = Size;
|
|
Partial->u.DeviceSpecificData.Reserved1 = 0;
|
|
Partial->u.DeviceSpecificData.Reserved2 = 0;
|
|
Index++;
|
|
RtlMoveMemory((PVOID)&Descriptor->PartialDescriptors[Index], Data, Size);
|
|
}
|
|
|
|
Descriptor->Count = Index;
|
|
Descriptor->Version = ARC_VERSION;
|
|
Descriptor->Revision = ARC_REVISION;
|
|
return(sizeof(CM_PARTIAL_RESOURCE_LIST) +
|
|
(Index ? ((Index - 1) * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR)) : 0) +
|
|
Size);
|
|
|
|
}
|
|
|
|
|
|
ARC_STATUS
|
|
JzAddProcessor (
|
|
IN ULONG ProcessorNumber
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine adds processor and associated cache entries to the
|
|
configuration structure.
|
|
|
|
Arguments:
|
|
|
|
ProcessorNumber - Supplies the processor number.
|
|
|
|
Return Value:
|
|
|
|
Returns ESSUCESS if the entries were successfully added, otherwise returns
|
|
an error message.
|
|
|
|
--*/
|
|
{
|
|
CONFIGURATION_COMPONENT Component;
|
|
PCHAR ProcessorName;
|
|
CHAR Identifier[40];
|
|
PCONFIGURATION_COMPONENT Root, Level1;
|
|
ULONG DcacheLineSize, DcacheSize, IcacheLineSize, IcacheSize;
|
|
ULONG ScacheLineSize, ScacheSize;
|
|
ULONG Temp;
|
|
ULONG FloatingId;
|
|
ULONG ProcessorId;
|
|
|
|
//
|
|
// Determine cache parameters.
|
|
//
|
|
|
|
IcacheLineSize = 0;
|
|
Temp = PCR->FirstLevelIcacheFillSize >> 1;
|
|
while (Temp) {
|
|
IcacheLineSize++;
|
|
Temp = Temp >> 1;
|
|
}
|
|
IcacheSize = 0;
|
|
Temp = (PCR->FirstLevelIcacheSize >> PAGE_SHIFT) >> 1;
|
|
while (Temp) {
|
|
IcacheSize++;
|
|
Temp = Temp >> 1;
|
|
}
|
|
DcacheLineSize = 0;
|
|
Temp = PCR->FirstLevelDcacheFillSize >> 1;
|
|
while (Temp) {
|
|
DcacheLineSize++;
|
|
Temp = Temp >> 1;
|
|
}
|
|
DcacheSize = 0;
|
|
Temp = (PCR->FirstLevelDcacheSize >> PAGE_SHIFT) >> 1;
|
|
while (Temp) {
|
|
DcacheSize++;
|
|
Temp = Temp >> 1;
|
|
}
|
|
|
|
ScacheLineSize = 0;
|
|
Temp = PCR->SecondLevelDcacheFillSize >> 1;
|
|
while (Temp) {
|
|
ScacheLineSize++;
|
|
Temp = Temp >> 1;
|
|
}
|
|
ScacheSize = 0;
|
|
Temp = (PCR->SecondLevelDcacheSize >> PAGE_SHIFT) >> 1;
|
|
while (Temp) {
|
|
ScacheSize++;
|
|
Temp = Temp >> 1;
|
|
}
|
|
|
|
//
|
|
// Get root component.
|
|
//
|
|
|
|
Root = ArcGetChild(NULL);
|
|
|
|
if (Root == NULL) {
|
|
return(EINVAL);
|
|
}
|
|
|
|
//
|
|
// Determine Identifier; cache size is units of log2(4 KByte pages).
|
|
//
|
|
|
|
switch (IcacheSize) {
|
|
|
|
case 1:
|
|
ProcessorName = "R4000";
|
|
break;
|
|
|
|
case 2:
|
|
ProcessorName = "R4400";
|
|
break;
|
|
|
|
default:
|
|
ProcessorName = "Unknown";
|
|
break;
|
|
}
|
|
|
|
//
|
|
// Add processor and floating point revision, but only for systems with
|
|
// restart parameter blocks (i.e. DUO).
|
|
//
|
|
|
|
#ifdef DUO
|
|
BlQueryImplementationAndRevision(&ProcessorId, &FloatingId);
|
|
sprintf(&Identifier[0],
|
|
"MIPS-%s - Pr %d/%d.%d, Fp %d/%d",
|
|
ProcessorName,
|
|
(ProcessorId >> 8) & 0xff,
|
|
(ProcessorId >> 4) & 0xf,
|
|
ProcessorId & 0xf,
|
|
(FloatingId >> 8) & 0xff,
|
|
FloatingId & 0xff);
|
|
#else
|
|
sprintf(&Identifier[0],
|
|
"MIPS-%s",
|
|
ProcessorName);
|
|
#endif
|
|
|
|
|
|
JzMakeComponent(&Component,
|
|
ProcessorClass, // Class
|
|
CentralProcessor, // Type
|
|
FALSE, // Readonly
|
|
FALSE, // Removeable
|
|
FALSE, // ConsoleIn
|
|
FALSE, // ConsoleOut
|
|
FALSE, // Input
|
|
FALSE, // Output
|
|
ProcessorNumber, // Key
|
|
0, // ConfigurationDataLength
|
|
Identifier // Identifier
|
|
);
|
|
|
|
if ((Level1 = ArcAddChild( Root, &Component, NULL )) == NULL) {
|
|
return(EINVAL);
|
|
}
|
|
|
|
//
|
|
// Add caches as child of processor.
|
|
//
|
|
|
|
JzMakeComponent(&Component,
|
|
CacheClass, // Class
|
|
PrimaryIcache, // Type
|
|
FALSE, // Readonly
|
|
FALSE, // Removeable
|
|
FALSE, // ConsoleIn
|
|
FALSE, // ConsoleOut
|
|
FALSE, // Input
|
|
FALSE, // Output
|
|
1 << 24 |
|
|
IcacheLineSize << 16 |
|
|
IcacheSize, // Key
|
|
0, // ConfigurationDataLength
|
|
NULL // Identifier
|
|
);
|
|
|
|
if ((ArcAddChild( Level1, &Component, NULL )) == NULL) {
|
|
return(EINVAL);
|
|
}
|
|
|
|
JzMakeComponent(&Component,
|
|
CacheClass, // Class
|
|
PrimaryDcache, // Type
|
|
FALSE, // Readonly
|
|
FALSE, // Removeable
|
|
FALSE, // ConsoleIn
|
|
FALSE, // ConsoleOut
|
|
FALSE, // Input
|
|
FALSE, // Output
|
|
1 << 24 |
|
|
DcacheLineSize << 16 |
|
|
DcacheSize, // Key
|
|
0, // ConfigurationDataLength
|
|
NULL // Identifier
|
|
);
|
|
|
|
if ((ArcAddChild( Level1, &Component, NULL )) == NULL) {
|
|
return(EINVAL);
|
|
}
|
|
|
|
//
|
|
// Add a secondary cache if present
|
|
//
|
|
|
|
if (ScacheSize != 0) {
|
|
JzMakeComponent(&Component,
|
|
CacheClass, // Class
|
|
SecondaryDcache, // Type
|
|
FALSE, // Readonly
|
|
FALSE, // Removeable
|
|
FALSE, // ConsoleIn
|
|
FALSE, // ConsoleOut
|
|
FALSE, // Input
|
|
FALSE, // Output
|
|
1 << 24 |
|
|
ScacheLineSize << 16 |
|
|
ScacheSize, // Key
|
|
0, // ConfigurationDataLength
|
|
NULL // Identifier
|
|
);
|
|
|
|
if ((ArcAddChild( Level1, &Component, NULL )) == NULL) {
|
|
return(EINVAL);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
VOID
|
|
JzMakeConfiguration (
|
|
ULONG Monitor,
|
|
ULONG Floppy,
|
|
ULONG Floppy2
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine initializes the configuration entries by calling the firmware
|
|
add child routine.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
{
|
|
CONFIGURATION_COMPONENT Component;
|
|
PCHAR Identifier;
|
|
PCONFIGURATION_COMPONENT Root, Level1, Level2, Level3;
|
|
UCHAR Buffer[sizeof(CM_PARTIAL_RESOURCE_LIST) +
|
|
(sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR) * 5) +
|
|
MAXIMUM_DEVICE_SPECIFIC_DATA];
|
|
PCM_PARTIAL_RESOURCE_LIST Descriptor = (PCM_PARTIAL_RESOURCE_LIST)&Buffer;
|
|
ULONG DescriptorSize;
|
|
JAZZ_VIDEO_TYPE VideoType;
|
|
CM_VIDEO_DEVICE_DATA VideoDeviceData;
|
|
MONITOR_CONFIGURATION_DATA MonitorData; // TEMPTEMP
|
|
JAZZ_G300_CONFIGURATION_DATA VideoData; // TEMPTEMP
|
|
CM_MONITOR_DEVICE_DATA MonitorDeviceData;
|
|
CM_SCSI_DEVICE_DATA ScsiDeviceData;
|
|
CM_FLOPPY_DEVICE_DATA FloppyDeviceData;
|
|
CM_SERIAL_DEVICE_DATA SerialDeviceData;
|
|
ULONG Temp;
|
|
UCHAR VideoIdentifier[32];
|
|
EISA_ADAPTER_DETAILS EisaAdapterDetails;
|
|
BOOLEAN OldProm;
|
|
|
|
//
|
|
// Add root.
|
|
//
|
|
|
|
JzMakeComponent(&Component,
|
|
SystemClass, // Class
|
|
ArcSystem, // Type
|
|
FALSE, // Readonly
|
|
FALSE, // Removeable
|
|
FALSE, // ConsoleIn
|
|
FALSE, // ConsoleOut
|
|
FALSE, // Input
|
|
FALSE, // Output
|
|
0, // Key
|
|
0, // ConfigurationDataLength
|
|
#ifdef DUO
|
|
"Microsoft-Duo" // Identifier
|
|
#else
|
|
"Microsoft-Jazz" // Identifier
|
|
#endif
|
|
);
|
|
|
|
if ((Root = ArcAddChild( NULL, &Component, NULL )) == NULL) {
|
|
return;
|
|
}
|
|
|
|
//
|
|
// Add the jazz local bus as a child of root.
|
|
//
|
|
|
|
JzMakeComponent(&Component,
|
|
AdapterClass, // Class
|
|
MultiFunctionAdapter, // Type
|
|
FALSE, // Readonly
|
|
FALSE, // Removeable
|
|
FALSE, // ConsoleIn
|
|
FALSE, // ConsoleOut
|
|
FALSE, // Input
|
|
FALSE, // Output
|
|
0, // Key
|
|
0, // ConfigurationDataLength
|
|
"Jazz-Internal Bus" // Identifier
|
|
);
|
|
|
|
if ((Level1 = ArcAddChild( Root, &Component, NULL )) == NULL) {
|
|
return;
|
|
}
|
|
|
|
#if 0
|
|
//
|
|
// Add graphics board as a child of the local bus.
|
|
//
|
|
|
|
//
|
|
// Determine which video board is installed.
|
|
//
|
|
|
|
VideoType = READ_REGISTER_UCHAR((PUCHAR)0xe0200000);
|
|
|
|
if (VideoType == JazzVideoG300) {
|
|
VideoDeviceData.VideoClock = 8125000;
|
|
Identifier = "Jazz G300";
|
|
} else {
|
|
if (ValidVideoProm()) {
|
|
|
|
//
|
|
// Read the identifier string from the video prom
|
|
//
|
|
ReadVideoPromData(8+sizeof(VIDEO_PROM_CONFIGURATION),(ULONG)VideoIdentifier,32);
|
|
Identifier = VideoIdentifier;
|
|
|
|
//
|
|
// Init the clock stuff
|
|
//
|
|
|
|
switch (VideoType) {
|
|
case JazzVideoG364:
|
|
VideoDeviceData.VideoClock = 8125000;
|
|
break;
|
|
case MipsVideoG364:
|
|
VideoDeviceData.VideoClock = 5000000;
|
|
break;
|
|
}
|
|
} else {
|
|
|
|
//
|
|
// TEMPTEMP For know still check for g364 without code in the
|
|
// video prom.
|
|
//
|
|
|
|
switch (VideoType) {
|
|
case JazzVideoG364:
|
|
Identifier = "Jazz G364";
|
|
VideoDeviceData.VideoClock = 8125000;
|
|
break;
|
|
case MipsVideoG364:
|
|
Identifier = "Mips G364";
|
|
VideoDeviceData.VideoClock = 5000000;
|
|
break;
|
|
default:
|
|
Identifier = "Unknown";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
VideoDeviceData.Version = 0;
|
|
VideoDeviceData.Revision = 0;
|
|
|
|
DescriptorSize =
|
|
JzMakeDescriptor (Descriptor, // Descriptor
|
|
TRUE, // Port
|
|
VIDEO_CONTROL_PHYSICAL_BASE, // PortStart
|
|
(PAGE_SIZE << 9), // PortSize
|
|
TRUE, // Interrupt
|
|
0, // InterruptFlags
|
|
DEVICE_LEVEL, // Level
|
|
VIDEO_VECTOR, // Vector
|
|
TRUE, // Memory
|
|
VIDEO_MEMORY_PHYSICAL_BASE, // MemoryStart
|
|
(PAGE_SIZE << 9), // MemorySize
|
|
FALSE, // Dma
|
|
0, // Channel
|
|
FALSE, // SecondChannel
|
|
TRUE, // DeviceSpecificData
|
|
sizeof(CM_VIDEO_DEVICE_DATA), // Size
|
|
(PVOID)&VideoDeviceData // Data
|
|
);
|
|
|
|
//
|
|
// Add graphics board as a child of the local bus.
|
|
//
|
|
|
|
JzMakeComponent(&Component,
|
|
ControllerClass, // Class
|
|
DisplayController, // Type
|
|
FALSE, // Readonly
|
|
FALSE, // Removeable
|
|
FALSE, // ConsoleIn
|
|
TRUE, // ConsoleOut
|
|
FALSE, // Input
|
|
TRUE, // Output
|
|
0, // Key
|
|
DescriptorSize, // ConfigurationDataLength
|
|
Identifier // Identifier
|
|
);
|
|
|
|
|
|
if ((Level2 = ArcAddChild( Level1, &Component, Descriptor )) == NULL) {
|
|
return;
|
|
}
|
|
#endif
|
|
|
|
//
|
|
// Add graphics board as a child of the local bus.
|
|
//
|
|
|
|
VideoData.Irql = DEVICE_LEVEL;
|
|
VideoData.Vector = VIDEO_VECTOR;
|
|
VideoData.Version = 1;
|
|
VideoData.Revision = 0;
|
|
VideoData.ControlBase = VIDEO_CONTROL_PHYSICAL_BASE;
|
|
VideoData.ControlSize = PAGE_SIZE << 9;
|
|
VideoData.CursorBase = CURSOR_CONTROL_PHYSICAL_BASE;
|
|
VideoData.CursorSize = PAGE_SIZE;
|
|
VideoData.FrameBase = VIDEO_MEMORY_PHYSICAL_BASE;
|
|
VideoData.FrameSize = PAGE_SIZE << 9;
|
|
|
|
//
|
|
// Determine which video board is installed.
|
|
//
|
|
|
|
VideoType = READ_REGISTER_UCHAR((PUCHAR)0xe0200000);
|
|
|
|
if (VideoType == JazzVideoG300) {
|
|
Identifier = "Jazz G300";
|
|
} else {
|
|
if (ValidVideoProm()) {
|
|
|
|
//
|
|
// Read the identifier string from the video prom
|
|
//
|
|
ReadVideoPromData(8+sizeof(VIDEO_PROM_CONFIGURATION),(ULONG)VideoIdentifier,32);
|
|
Identifier = VideoIdentifier;
|
|
|
|
} else {
|
|
|
|
//
|
|
// For now still check for g364 without code in the
|
|
// video prom.
|
|
//
|
|
|
|
switch (VideoType) {
|
|
case JazzVideoG364:
|
|
Identifier = "Jazz G364";
|
|
break;
|
|
case MipsVideoG364:
|
|
Identifier = "Mips G364";
|
|
break;
|
|
default:
|
|
Identifier = "Unknown";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
JzMakeComponent(&Component,
|
|
ControllerClass, // Class
|
|
DisplayController, // Type
|
|
FALSE, // Readonly
|
|
FALSE, // Removeable
|
|
FALSE, // ConsoleIn
|
|
TRUE, // ConsoleOut
|
|
FALSE, // Input
|
|
TRUE, // Output
|
|
0, // Key
|
|
sizeof(JAZZ_G300_CONFIGURATION_DATA), // ConfigurationDataLength
|
|
Identifier // Identifier
|
|
);
|
|
|
|
if ((Level2 = ArcAddChild( Level1, &Component, &VideoData )) == NULL) {
|
|
return;
|
|
}
|
|
|
|
//
|
|
// Add the monitor as a child of the graphics board.
|
|
//
|
|
|
|
JzMakeComponent(&Component,
|
|
PeripheralClass, // Class
|
|
MonitorPeripheral, // Type
|
|
FALSE, // Readonly
|
|
FALSE, // Removeable
|
|
FALSE, // ConsoleIn
|
|
TRUE, // ConsoleOut
|
|
FALSE, // Input
|
|
TRUE, // Output
|
|
0, // Key
|
|
sizeof(MONITOR_CONFIGURATION_DATA), // ConfigurationDataLength
|
|
NULL // Identifier
|
|
);
|
|
|
|
MonitorData.Version = 1;
|
|
MonitorData.Revision = 0;
|
|
|
|
//
|
|
// Check to see if this is version 1.1 or greater.
|
|
//
|
|
|
|
if ((SYSTEM_BLOCK->Version * 100 + SYSTEM_BLOCK->Revision) >= 101) {
|
|
OldProm = FALSE;
|
|
} else {
|
|
OldProm = TRUE;
|
|
}
|
|
|
|
switch (Monitor) {
|
|
|
|
case 0:
|
|
Component.IdentifierLength = sizeof("1280x1024");
|
|
Component.Identifier = "1280x1024";
|
|
|
|
MonitorData.HorizontalResolution = 1280;
|
|
MonitorData.HorizontalDisplayTime = 11832; // Mips uses 11636
|
|
// MonitorData.HorizontalBackPorch = 1746;
|
|
// MonitorData.HorizontalFrontPorch = 437;
|
|
MonitorData.HorizontalBackPorch = 1596; // Mips uses 2070
|
|
MonitorData.HorizontalFrontPorch = 587; // Mips uses 407
|
|
MonitorData.HorizontalSync = 1745; // Mips uses 1701
|
|
MonitorData.VerticalResolution = 1024;
|
|
MonitorData.VerticalBackPorch = 28; // Mips uses 32
|
|
MonitorData.VerticalFrontPorch = 1;
|
|
MonitorData.VerticalSync = 3;
|
|
MonitorData.HorizontalScreenSize = 343;
|
|
MonitorData.VerticalScreenSize = 274;
|
|
|
|
if (OldProm) {
|
|
MonitorData.HorizontalBackPorch = 1849;
|
|
MonitorData.HorizontalFrontPorch = 407;
|
|
MonitorData.VerticalFrontPorch = 3;
|
|
}
|
|
|
|
break;
|
|
|
|
case 1:
|
|
Component.IdentifierLength = sizeof("1024x768");
|
|
Component.Identifier = "1024x768";
|
|
|
|
MonitorData.HorizontalResolution = 1024;
|
|
MonitorData.HorizontalDisplayTime = 16000; // Mips uses 15754
|
|
MonitorData.HorizontalBackPorch = 2000; // Mips uses 2462
|
|
MonitorData.HorizontalFrontPorch = 1000; // Mips uses 369
|
|
MonitorData.HorizontalSync = 1500; // Mips uses 2092
|
|
MonitorData.VerticalResolution = 768;
|
|
MonitorData.VerticalBackPorch = 39; // Mips uses 35
|
|
MonitorData.VerticalFrontPorch = 1;
|
|
MonitorData.VerticalSync = 1; // Mips uses 3
|
|
MonitorData.HorizontalScreenSize = 343;
|
|
MonitorData.VerticalScreenSize = 274;
|
|
|
|
if (OldProm) {
|
|
MonitorData.VerticalFrontPorch = 3;
|
|
}
|
|
|
|
break;
|
|
|
|
case 2:
|
|
Component.IdentifierLength = sizeof("800x600");
|
|
Component.Identifier = "800x600";
|
|
|
|
MonitorData.HorizontalResolution = 800;
|
|
MonitorData.HorizontalDisplayTime = 14130;
|
|
MonitorData.HorizontalBackPorch = 2670;
|
|
MonitorData.HorizontalFrontPorch = 440;
|
|
MonitorData.HorizontalSync = 3110;
|
|
MonitorData.VerticalResolution = 600;
|
|
// MonitorData.VerticalBackPorch = 7;
|
|
MonitorData.VerticalBackPorch = 18;
|
|
MonitorData.VerticalFrontPorch = 1;
|
|
// MonitorData.VerticalSync = 14;
|
|
MonitorData.VerticalSync = 3;
|
|
MonitorData.HorizontalScreenSize = 343;
|
|
MonitorData.VerticalScreenSize = 274;
|
|
|
|
if (OldProm) {
|
|
MonitorData.VerticalFrontPorch = 7;
|
|
}
|
|
|
|
break;
|
|
|
|
case 3:
|
|
Component.IdentifierLength = sizeof("640x480");
|
|
Component.Identifier = "640x480";
|
|
|
|
MonitorData.HorizontalResolution = 640;
|
|
MonitorData.HorizontalDisplayTime = 25422;
|
|
MonitorData.HorizontalBackPorch = 1907;
|
|
MonitorData.HorizontalFrontPorch = 636;
|
|
MonitorData.HorizontalSync = 3814;
|
|
MonitorData.VerticalResolution = 480;
|
|
MonitorData.VerticalBackPorch = 33;
|
|
MonitorData.VerticalFrontPorch = 10;
|
|
MonitorData.VerticalSync = 2;
|
|
MonitorData.HorizontalScreenSize = 350;
|
|
MonitorData.VerticalScreenSize = 270;
|
|
|
|
if (OldProm) {
|
|
MonitorData.VerticalBackPorch = 33;
|
|
MonitorData.VerticalFrontPorch = 10;
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
|
|
}
|
|
|
|
if ((Level3 = ArcAddChild( Level2, &Component, &MonitorData )) == NULL) {
|
|
return;
|
|
}
|
|
|
|
//
|
|
// Add the network adapter as a child of the local bus.
|
|
//
|
|
|
|
JzAddNetwork( Level1 );
|
|
|
|
#ifndef DUO
|
|
//
|
|
// Add the floppy disk controller as a child of the local bus.
|
|
//
|
|
|
|
DescriptorSize =
|
|
JzMakeDescriptor (Descriptor, // Descriptor
|
|
TRUE, // Port
|
|
FLOPPY_PHYSICAL_BASE, // PortStart
|
|
PAGE_SIZE, // PortSize
|
|
TRUE, // Interrupt
|
|
0, // InterruptFlags
|
|
DEVICE_LEVEL, // Level
|
|
FLOPPY_VECTOR, // Vector
|
|
FALSE, // Memory
|
|
0, // MemoryStart
|
|
0, // MemorySize
|
|
TRUE, // Dma
|
|
FLOPPY_CHANNEL, // Channel
|
|
FALSE, // SecondChannel
|
|
FALSE, // DeviceSpecificData
|
|
0, // Size
|
|
NULL // Data
|
|
);
|
|
|
|
JzMakeComponent(&Component,
|
|
ControllerClass, // Class
|
|
DiskController, // Type
|
|
FALSE, // Readonly
|
|
FALSE, // Removeable
|
|
FALSE, // ConsoleIn
|
|
FALSE, // ConsoleOut
|
|
TRUE, // Input
|
|
TRUE, // Output
|
|
0, // Key
|
|
DescriptorSize, // ConfigurationDataLength
|
|
"I82077" // Identifier
|
|
);
|
|
|
|
if ((Level2 = ArcAddChild( Level1, &Component, Descriptor )) == NULL) {
|
|
return;
|
|
}
|
|
|
|
//
|
|
// Add the floppy disk itself as a child of the floppy disk controller.
|
|
//
|
|
|
|
FloppyDeviceData.Version = ARC_VERSION;
|
|
FloppyDeviceData.Revision = ARC_REVISION;
|
|
|
|
switch (Floppy) {
|
|
|
|
case 0:
|
|
FloppyDeviceData.Size[0] = '5';
|
|
FloppyDeviceData.Size[1] = '.';
|
|
FloppyDeviceData.Size[2] = '2';
|
|
FloppyDeviceData.Size[3] = '5';
|
|
FloppyDeviceData.Size[4] = 0;
|
|
FloppyDeviceData.Size[5] = 0;
|
|
FloppyDeviceData.Size[6] = 0;
|
|
FloppyDeviceData.Size[7] = 0;
|
|
FloppyDeviceData.MaxDensity = 1200;
|
|
FloppyDeviceData.MountDensity = 0;
|
|
break;
|
|
|
|
case 1:
|
|
case 2:
|
|
FloppyDeviceData.Size[0] = '3';
|
|
FloppyDeviceData.Size[1] = '.';
|
|
FloppyDeviceData.Size[2] = '5';
|
|
FloppyDeviceData.Size[3] = 0;
|
|
FloppyDeviceData.Size[4] = 0;
|
|
FloppyDeviceData.Size[5] = 0;
|
|
FloppyDeviceData.Size[6] = 0;
|
|
FloppyDeviceData.Size[7] = 0;
|
|
if (Floppy == 1) {
|
|
FloppyDeviceData.MaxDensity = 1440;
|
|
} else {
|
|
FloppyDeviceData.MaxDensity = 2880;
|
|
}
|
|
FloppyDeviceData.MountDensity = 0;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
DescriptorSize =
|
|
JzMakeDescriptor (Descriptor, // Descriptor
|
|
FALSE, // Port
|
|
0, // PortStart
|
|
0, // PortSize
|
|
FALSE, // Interrupt
|
|
0, // InterruptFlags
|
|
0, // Level
|
|
0, // Vector
|
|
FALSE, // Memory
|
|
0, // MemoryStart
|
|
0, // MemorySize
|
|
FALSE, // Dma
|
|
0, // Channel
|
|
FALSE, // SecondChannel
|
|
TRUE, // DeviceSpecificData
|
|
sizeof(CM_FLOPPY_DEVICE_DATA), // Size
|
|
(PVOID)&FloppyDeviceData // Data
|
|
);
|
|
|
|
JzMakeComponent(&Component,
|
|
PeripheralClass, // Class
|
|
FloppyDiskPeripheral, // Type
|
|
FALSE, // Readonly
|
|
TRUE, // Removeable
|
|
FALSE, // ConsoleIn
|
|
FALSE, // ConsoleOut
|
|
TRUE, // Input
|
|
TRUE, // Output
|
|
0, // Key
|
|
DescriptorSize, // ConfigurationDataLength
|
|
NULL // Identifier
|
|
);
|
|
|
|
if ((ArcAddChild( Level2, &Component, Descriptor )) == NULL) {
|
|
return;
|
|
}
|
|
|
|
//
|
|
// Add a second floppy disk as a child of the floppy disk controller.
|
|
//
|
|
|
|
if (Floppy2 != -1) {
|
|
|
|
FloppyDeviceData.Version = ARC_VERSION;
|
|
FloppyDeviceData.Revision = ARC_REVISION;
|
|
|
|
switch (Floppy2) {
|
|
|
|
case 0:
|
|
FloppyDeviceData.Size[0] = '5';
|
|
FloppyDeviceData.Size[1] = '.';
|
|
FloppyDeviceData.Size[2] = '2';
|
|
FloppyDeviceData.Size[3] = '5';
|
|
FloppyDeviceData.Size[4] = 0;
|
|
FloppyDeviceData.Size[5] = 0;
|
|
FloppyDeviceData.Size[6] = 0;
|
|
FloppyDeviceData.Size[7] = 0;
|
|
FloppyDeviceData.MaxDensity = 1200;
|
|
FloppyDeviceData.MountDensity = 0;
|
|
break;
|
|
|
|
case 1:
|
|
case 2:
|
|
FloppyDeviceData.Size[0] = '3';
|
|
FloppyDeviceData.Size[1] = '.';
|
|
FloppyDeviceData.Size[2] = '5';
|
|
FloppyDeviceData.Size[3] = 0;
|
|
FloppyDeviceData.Size[4] = 0;
|
|
FloppyDeviceData.Size[5] = 0;
|
|
FloppyDeviceData.Size[6] = 0;
|
|
FloppyDeviceData.Size[7] = 0;
|
|
if (Floppy == 1) {
|
|
FloppyDeviceData.MaxDensity = 1440;
|
|
} else {
|
|
FloppyDeviceData.MaxDensity = 2880;
|
|
}
|
|
FloppyDeviceData.MountDensity = 0;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
DescriptorSize =
|
|
JzMakeDescriptor (Descriptor, // Descriptor
|
|
FALSE, // Port
|
|
0, // PortStart
|
|
0, // PortSize
|
|
FALSE, // Interrupt
|
|
0, // InterruptFlags
|
|
0, // Level
|
|
0, // Vector
|
|
FALSE, // Memory
|
|
0, // MemoryStart
|
|
0, // MemorySize
|
|
FALSE, // Dma
|
|
0, // Channel
|
|
FALSE, // SecondChannel
|
|
TRUE, // DeviceSpecificData
|
|
sizeof(CM_FLOPPY_DEVICE_DATA), // Size
|
|
(PVOID)&FloppyDeviceData // Data
|
|
);
|
|
|
|
JzMakeComponent(&Component,
|
|
PeripheralClass, // Class
|
|
FloppyDiskPeripheral, // Type
|
|
FALSE, // Readonly
|
|
TRUE, // Removeable
|
|
FALSE, // ConsoleIn
|
|
FALSE, // ConsoleOut
|
|
TRUE, // Input
|
|
TRUE, // Output
|
|
1, // Key
|
|
DescriptorSize, // ConfigurationDataLength
|
|
NULL // Identifier
|
|
);
|
|
|
|
if ((ArcAddChild( Level2, &Component, Descriptor )) == NULL) {
|
|
return;
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
//
|
|
// Add the keyboard controller as a child of the local bus.
|
|
//
|
|
|
|
DescriptorSize =
|
|
JzMakeDescriptor (Descriptor, // Descriptor
|
|
TRUE, // Port
|
|
KEYBOARD_PHYSICAL_BASE, // PortStart
|
|
PAGE_SIZE, // PortSize
|
|
TRUE, // Interrupt
|
|
0, // InterruptFlags
|
|
DEVICE_LEVEL, // Level
|
|
KEYBOARD_VECTOR, // Vector
|
|
FALSE, // Memory
|
|
0, // MemoryStart
|
|
0, // MemorySize
|
|
FALSE, // Dma
|
|
0, // Channel
|
|
FALSE, // SecondChannel
|
|
FALSE, // DeviceSpecificData
|
|
0, // Size
|
|
NULL // Data
|
|
);
|
|
|
|
JzMakeComponent(&Component,
|
|
ControllerClass, // Class
|
|
KeyboardController, // Type
|
|
FALSE, // Readonly
|
|
FALSE, // Removeable
|
|
TRUE, // ConsoleIn
|
|
FALSE, // ConsoleOut
|
|
TRUE, // Input
|
|
FALSE, // Output
|
|
0, // Key
|
|
DescriptorSize, // ConfigurationDataLength
|
|
"I8742" // Identifier
|
|
);
|
|
|
|
if ((Level2 = ArcAddChild( Level1, &Component, Descriptor )) == NULL) {
|
|
return;
|
|
}
|
|
|
|
//
|
|
// Add the keyboard itself as a child of the keyboard controller.
|
|
//
|
|
|
|
JzMakeComponent(&Component,
|
|
PeripheralClass, // Class
|
|
KeyboardPeripheral, // Type
|
|
FALSE, // Readonly
|
|
FALSE, // Removeable
|
|
TRUE, // ConsoleIn
|
|
FALSE, // ConsoleOut
|
|
TRUE, // Input
|
|
FALSE, // Output
|
|
0, // Key
|
|
0, // ConfigurationDataLength
|
|
"PCAT_ENHANCED" // Identifier
|
|
);
|
|
|
|
if ((ArcAddChild( Level2, &Component, NULL )) == NULL) {
|
|
return;
|
|
}
|
|
|
|
//
|
|
// Add the mouse controller as a child of the local bus.
|
|
//
|
|
|
|
DescriptorSize =
|
|
JzMakeDescriptor (Descriptor, // Descriptor
|
|
TRUE, // Port
|
|
MOUSE_PHYSICAL_BASE, // PortStart
|
|
PAGE_SIZE, // PortSize
|
|
TRUE, // Interrupt
|
|
0, // InterruptFlags
|
|
DEVICE_LEVEL, // Level
|
|
MOUSE_VECTOR, // Vector
|
|
FALSE, // Memory
|
|
0, // MemoryStart
|
|
0, // MemorySize
|
|
FALSE, // Dma
|
|
0, // Channel
|
|
FALSE, // SecondChannel
|
|
FALSE, // DeviceSpecificData
|
|
0, // Size
|
|
NULL // Data
|
|
);
|
|
|
|
JzMakeComponent(&Component,
|
|
ControllerClass, // Class
|
|
PointerController, // Type
|
|
FALSE, // Readonly
|
|
FALSE, // Removeable
|
|
FALSE, // ConsoleIn
|
|
FALSE, // ConsoleOut
|
|
TRUE, // Input
|
|
FALSE, // Output
|
|
0, // Key
|
|
DescriptorSize, // ConfigurationDataLength
|
|
"I8742" // Identifier
|
|
);
|
|
|
|
if ((Level2 = ArcAddChild( Level1, &Component, Descriptor )) == NULL) {
|
|
return;
|
|
}
|
|
|
|
//
|
|
// Add the mouse itself as a child of the mouse controller.
|
|
//
|
|
|
|
JzMakeComponent(&Component,
|
|
PeripheralClass, // Class
|
|
PointerPeripheral, // Type
|
|
FALSE, // Readonly
|
|
FALSE, // Removeable
|
|
FALSE, // ConsoleIn
|
|
FALSE, // ConsoleOut
|
|
TRUE, // Input
|
|
FALSE, // Output
|
|
0, // Key
|
|
0, // ConfigurationDataLength
|
|
"PS2 MOUSE" // Identifier
|
|
);
|
|
|
|
if ((ArcAddChild( Level2, &Component, NULL )) == NULL) {
|
|
return;
|
|
}
|
|
|
|
//
|
|
// Add the serial, parallel, and audio controllers as children of the
|
|
// local bus.
|
|
//
|
|
|
|
#ifdef DUO
|
|
SerialDeviceData.BaudClock = 8000000;
|
|
#else
|
|
|
|
//
|
|
// If this is Jazz, set the baud clock to 4 MHz, otherwise to 8 MHz.
|
|
// If the revision register is 2 or above, this is a Fusion or Fission
|
|
// machine.
|
|
//
|
|
|
|
Temp = READ_REGISTER_ULONG(&DMA_CONTROL->RevisionLevel.Long);
|
|
|
|
if (Temp > 1) {
|
|
SerialDeviceData.BaudClock = 8000000;
|
|
} else {
|
|
SerialDeviceData.BaudClock = 4233600;
|
|
}
|
|
#endif
|
|
|
|
SerialDeviceData.Version = ARC_VERSION;
|
|
SerialDeviceData.Revision = ARC_REVISION;
|
|
|
|
DescriptorSize =
|
|
JzMakeDescriptor (Descriptor, // Descriptor
|
|
TRUE, // Port
|
|
SERIAL0_PHYSICAL_BASE, // PortStart
|
|
PAGE_SIZE, // PortSize
|
|
TRUE, // Interrupt
|
|
0, // InterruptFlags
|
|
DEVICE_LEVEL, // Level
|
|
SERIAL0_VECTOR, // Vector
|
|
FALSE, // Memory
|
|
0, // MemoryStart
|
|
0, // MemorySize
|
|
FALSE, // Dma
|
|
0, // Channel
|
|
FALSE, // SecondChannel
|
|
TRUE, // DeviceSpecificData
|
|
sizeof(CM_SERIAL_DEVICE_DATA), // Size
|
|
(PVOID)&SerialDeviceData // Data
|
|
);
|
|
|
|
JzMakeComponent(&Component,
|
|
ControllerClass, // Class
|
|
SerialController, // Type
|
|
FALSE, // Readonly
|
|
FALSE, // Removeable
|
|
FALSE, // ConsoleIn
|
|
FALSE, // ConsoleOut
|
|
TRUE, // Input
|
|
TRUE, // Output
|
|
0, // Key
|
|
DescriptorSize, // ConfigurationDataLength
|
|
"COM1" // Identifier
|
|
);
|
|
|
|
if ((ArcAddChild( Level1, &Component, Descriptor )) == NULL) {
|
|
return;
|
|
}
|
|
|
|
DescriptorSize =
|
|
JzMakeDescriptor (Descriptor, // Descriptor
|
|
TRUE, // Port
|
|
SERIAL1_PHYSICAL_BASE, // PortStart
|
|
PAGE_SIZE, // PortSize
|
|
TRUE, // Interrupt
|
|
0, // InterruptFlags
|
|
DEVICE_LEVEL, // Level
|
|
SERIAL1_VECTOR, // Vector
|
|
FALSE, // Memory
|
|
0, // MemoryStart
|
|
0, // MemorySize
|
|
FALSE, // Dma
|
|
0, // Channel
|
|
FALSE, // SecondChannel
|
|
TRUE, // DeviceSpecificData
|
|
sizeof(CM_SERIAL_DEVICE_DATA), // Size
|
|
(PVOID)&SerialDeviceData // Data
|
|
);
|
|
|
|
JzMakeComponent(&Component,
|
|
ControllerClass, // Class
|
|
SerialController, // Type
|
|
FALSE, // Readonly
|
|
FALSE, // Removeable
|
|
FALSE, // ConsoleIn
|
|
FALSE, // ConsoleOut
|
|
TRUE, // Input
|
|
TRUE, // Output
|
|
0, // Key
|
|
DescriptorSize, // ConfigurationDataLength
|
|
"COM2" // Identifier
|
|
);
|
|
|
|
if ((ArcAddChild( Level1, &Component, Descriptor )) == NULL) {
|
|
return;
|
|
}
|
|
|
|
DescriptorSize =
|
|
JzMakeDescriptor (Descriptor, // Descriptor
|
|
TRUE, // Port
|
|
PARALLEL_PHYSICAL_BASE, // PortStart
|
|
PAGE_SIZE, // PortSize
|
|
TRUE, // Interrupt
|
|
0, // InterruptFlags
|
|
DEVICE_LEVEL, // Level
|
|
PARALLEL_VECTOR, // Vector
|
|
FALSE, // Memory
|
|
0, // MemoryStart
|
|
0, // MemorySize
|
|
FALSE, // Dma
|
|
0, // Channel
|
|
FALSE, // SecondChannel
|
|
FALSE, // DeviceSpecificData
|
|
0, // Size
|
|
NULL // Data
|
|
);
|
|
|
|
JzMakeComponent(&Component,
|
|
ControllerClass, // Class
|
|
ParallelController, // Type
|
|
FALSE, // Readonly
|
|
FALSE, // Removeable
|
|
FALSE, // ConsoleIn
|
|
FALSE, // ConsoleOut
|
|
TRUE, // Input
|
|
TRUE, // Output
|
|
0, // Key
|
|
DescriptorSize, // ConfigurationDataLength
|
|
"LPT1" // Identifier
|
|
);
|
|
|
|
if ((ArcAddChild( Level1, &Component, Descriptor )) == NULL) {
|
|
return;
|
|
}
|
|
|
|
#ifndef DUO
|
|
DescriptorSize =
|
|
JzMakeDescriptor (Descriptor, // Descriptor
|
|
TRUE, // Port
|
|
SOUND_PHYSICAL_BASE, // PortStart
|
|
PAGE_SIZE, // PortSize
|
|
TRUE, // Interrupt
|
|
0, // InterruptFlags
|
|
DEVICE_LEVEL, // Level
|
|
SOUND_VECTOR, // Vector
|
|
FALSE, // Memory
|
|
0, // MemoryStart
|
|
0, // MemorySize
|
|
TRUE, // Dma
|
|
SOUND_CHANNEL_A, // Channel
|
|
TRUE, // SecondChannel
|
|
FALSE, // DeviceSpecificData
|
|
0, // Size
|
|
NULL // Data
|
|
);
|
|
|
|
JzMakeComponent(&Component,
|
|
ControllerClass, // Class
|
|
AudioController, // Type
|
|
FALSE, // Readonly
|
|
FALSE, // Removeable
|
|
FALSE, // ConsoleIn
|
|
FALSE, // ConsoleOut
|
|
TRUE, // Input
|
|
TRUE, // Output
|
|
0, // Key
|
|
DescriptorSize, // ConfigurationDataLength
|
|
"MAGNUM" // Identifier
|
|
);
|
|
|
|
if ((ArcAddChild( Level1, &Component, Descriptor )) == NULL) {
|
|
return;
|
|
}
|
|
|
|
#endif
|
|
|
|
//
|
|
// Add the eisa adapter as a child of root.
|
|
//
|
|
|
|
EisaAdapterDetails.NumberOfSlots = VIR_0_SLOTS ? VIR_0_SLOTS + 16 : PHYS_0_SLOTS;
|
|
EisaAdapterDetails.IoStart = (PVOID)EISA_EXTERNAL_IO_VIRTUAL_BASE;
|
|
EisaAdapterDetails.IoSize = PHYS_0_SLOTS * 0x1000;
|
|
|
|
EisaAdapterDetails.ConfigDataHeader.Version = ARC_VERSION;
|
|
EisaAdapterDetails.ConfigDataHeader.Revision = ARC_REVISION;
|
|
EisaAdapterDetails.ConfigDataHeader.Type = NULL;
|
|
EisaAdapterDetails.ConfigDataHeader.Vendor = NULL;
|
|
EisaAdapterDetails.ConfigDataHeader.ProductName = NULL;
|
|
EisaAdapterDetails.ConfigDataHeader.SerialNumber = NULL;
|
|
|
|
JzMakeComponent(&Component,
|
|
AdapterClass, // Class
|
|
EisaAdapter, // Type
|
|
FALSE, // Readonly
|
|
FALSE, // Removeable
|
|
FALSE, // ConsoleIn
|
|
FALSE, // ConsoleOut
|
|
FALSE, // Input
|
|
FALSE, // Output
|
|
0, // Key
|
|
sizeof(EISA_ADAPTER_DETAILS), // ConfigurationDataLength
|
|
"EISA" // Identifier
|
|
);
|
|
|
|
if ((Level1 = ArcAddChild( Root, &Component, &EisaAdapterDetails )) == NULL) {
|
|
return;
|
|
}
|
|
|
|
#ifndef DUO
|
|
//
|
|
// Add the scsi adapter as a child of the root.
|
|
//
|
|
|
|
ScsiDeviceData.Version = ARC_VERSION;
|
|
ScsiDeviceData.Revision = ARC_REVISION;
|
|
ScsiDeviceData.HostIdentifier = ScsiHostId;
|
|
|
|
DescriptorSize =
|
|
JzMakeDescriptor (Descriptor, // Descriptor
|
|
FALSE, // Port
|
|
0, // PortStart
|
|
0, // PortSize
|
|
TRUE, // Interrupt
|
|
0, // InterruptFlags
|
|
DEVICE_LEVEL, // Level
|
|
SCSI_VECTOR, // Vector
|
|
TRUE, // Memory
|
|
SCSI_PHYSICAL_BASE, // MemoryStart
|
|
PAGE_SIZE, // MemorySize
|
|
TRUE, // Dma
|
|
SCSI_CHANNEL, // Channel
|
|
FALSE, // SecondChannel
|
|
TRUE, // DeviceSpecificData
|
|
sizeof(CM_SCSI_DEVICE_DATA), // Size
|
|
(PVOID)&ScsiDeviceData // Data
|
|
);
|
|
|
|
JzMakeComponent(&Component,
|
|
AdapterClass, // Class
|
|
ScsiAdapter, // Type
|
|
FALSE, // Readonly
|
|
FALSE, // Removeable
|
|
FALSE, // ConsoleIn
|
|
FALSE, // ConsoleOut
|
|
FALSE, // Input
|
|
FALSE, // Output
|
|
0, // Key
|
|
DescriptorSize, // ConfigurationDataLength
|
|
"ESP216" // Identifier
|
|
);
|
|
|
|
if ((Level1 = ArcAddChild( Root, &Component, Descriptor )) == NULL) {
|
|
return;
|
|
}
|
|
|
|
#else
|
|
//
|
|
// Add the two scsi adapters as children of the root. NOTE: Add the
|
|
// second one first so they will be the right way around for setupldr.
|
|
//
|
|
|
|
ScsiDeviceData.Version = ARC_VERSION;
|
|
ScsiDeviceData.Revision = ARC_REVISION;
|
|
ScsiDeviceData.HostIdentifier = ScsiHostId;
|
|
|
|
DescriptorSize =
|
|
JzMakeDescriptor (Descriptor, // Descriptor
|
|
FALSE, // Port
|
|
0, // PortStart
|
|
0, // PortSize
|
|
TRUE, // Interrupt
|
|
0, // InterruptFlags
|
|
DEVICE_LEVEL, // Level
|
|
SCSI1_VECTOR, // Vector
|
|
TRUE, // Memory
|
|
SCSI1_PHYSICAL_BASE, // MemoryStart
|
|
PAGE_SIZE, // MemorySize
|
|
FALSE, // Dma
|
|
0, // Channel
|
|
FALSE, // SecondChannel
|
|
TRUE, // DeviceSpecificData
|
|
sizeof(CM_SCSI_DEVICE_DATA), // Size
|
|
(PVOID)&ScsiDeviceData // Data
|
|
);
|
|
|
|
JzMakeComponent(&Component,
|
|
AdapterClass, // Class
|
|
ScsiAdapter, // Type
|
|
FALSE, // Readonly
|
|
FALSE, // Removeable
|
|
FALSE, // ConsoleIn
|
|
FALSE, // ConsoleOut
|
|
FALSE, // Input
|
|
FALSE, // Output
|
|
0, // Key
|
|
DescriptorSize, // ConfigurationDataLength
|
|
"NCRC700" // Identifier
|
|
);
|
|
|
|
if ((Level1 = ArcAddChild( Root, &Component, Descriptor )) == NULL) {
|
|
return;
|
|
}
|
|
|
|
DescriptorSize =
|
|
JzMakeDescriptor (Descriptor, // Descriptor
|
|
FALSE, // Port
|
|
0, // PortStart
|
|
0, // PortSize
|
|
TRUE, // Interrupt
|
|
0, // InterruptFlags
|
|
DEVICE_LEVEL, // Level
|
|
SCSI2_VECTOR, // Vector
|
|
TRUE, // Memory
|
|
SCSI2_PHYSICAL_BASE, // MemoryStart
|
|
PAGE_SIZE, // MemorySize
|
|
FALSE, // Dma
|
|
0, // Channel
|
|
FALSE, // SecondChannel
|
|
TRUE, // DeviceSpecificData
|
|
sizeof(CM_SCSI_DEVICE_DATA), // Size
|
|
(PVOID)&ScsiDeviceData // Data
|
|
);
|
|
|
|
JzMakeComponent(&Component,
|
|
AdapterClass, // Class
|
|
ScsiAdapter, // Type
|
|
FALSE, // Readonly
|
|
FALSE, // Removeable
|
|
FALSE, // ConsoleIn
|
|
FALSE, // ConsoleOut
|
|
FALSE, // Input
|
|
FALSE, // Output
|
|
1, // Key
|
|
DescriptorSize, // ConfigurationDataLength
|
|
"NCRC700" // Identifier
|
|
);
|
|
|
|
if ((Level1 = ArcAddChild( Root, &Component, Descriptor )) == NULL) {
|
|
return;
|
|
}
|
|
|
|
#endif
|
|
|
|
return;
|
|
}
|
|
|
|
VOID
|
|
JzAddNetwork (
|
|
PCONFIGURATION_COMPONENT Parent
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine adds the network component to the tree.
|
|
|
|
Arguments:
|
|
|
|
Parent - The parent for the network component.
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
{
|
|
CM_SONIC_DEVICE_DATA SonicDeviceData;
|
|
ULONG Index;
|
|
PUCHAR NvramAddress = (PUCHAR)NVRAM_SYSTEM_ID;
|
|
CONFIGURATION_COMPONENT Component;
|
|
UCHAR Buffer[sizeof(CM_PARTIAL_RESOURCE_LIST) +
|
|
(sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR) * 5) +
|
|
MAXIMUM_DEVICE_SPECIFIC_DATA];
|
|
PCM_PARTIAL_RESOURCE_LIST Descriptor = (PCM_PARTIAL_RESOURCE_LIST)&Buffer;
|
|
ULONG DescriptorSize;
|
|
|
|
SonicDeviceData.Version = ARC_VERSION;
|
|
SonicDeviceData.Revision = ARC_REVISION;
|
|
SonicDeviceData.DataConfigurationRegister = 0x2423;
|
|
for (Index = 0; Index < 8 ; Index++ ) {
|
|
SonicDeviceData.EthernetAddress[Index] =
|
|
READ_REGISTER_UCHAR(&NvramAddress[Index]);
|
|
}
|
|
|
|
DescriptorSize =
|
|
JzMakeDescriptor (Descriptor, // Descriptor
|
|
TRUE, // Port
|
|
NET_PHYSICAL_BASE, // PortStart
|
|
PAGE_SIZE, // PortSize
|
|
TRUE, // Interrupt
|
|
0, // InterruptFlags
|
|
DEVICE_LEVEL, // Level
|
|
NET_VECTOR, // Vector
|
|
FALSE, // Memory
|
|
0, // MemoryStart
|
|
0, // MemorySize
|
|
FALSE, // Dma
|
|
0, // Channel
|
|
FALSE, // SecondChannel
|
|
TRUE, // DeviceSpecificData
|
|
sizeof(CM_SONIC_DEVICE_DATA), // Size
|
|
(PVOID)&SonicDeviceData // Data
|
|
);
|
|
|
|
JzMakeComponent(&Component,
|
|
ControllerClass, // Class
|
|
NetworkController, // Type
|
|
FALSE, // Readonly
|
|
FALSE, // Removeable
|
|
FALSE, // ConsoleIn
|
|
FALSE, // ConsoleOut
|
|
TRUE, // Input
|
|
TRUE, // Output
|
|
0, // Key
|
|
DescriptorSize, // ConfigurationDataLength
|
|
"SONIC" // Identifier
|
|
);
|
|
|
|
ArcAddChild( Parent, &Component, Descriptor );
|
|
|
|
return;
|
|
}
|