497 lines
8.6 KiB
C
497 lines
8.6 KiB
C
/*++
|
||
|
||
Copyright (c) 1991 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
jzmake.c
|
||
|
||
Abstract:
|
||
|
||
This module contains the code to make the configuration and environment
|
||
variable data structures in the Jazz NVRAM.
|
||
|
||
|
||
Author:
|
||
|
||
David M. Robinson (davidro) 25-Oct-1991
|
||
|
||
Revision History:
|
||
|
||
--*/
|
||
|
||
#include "jzsetup.h"
|
||
|
||
//
|
||
// Routine prototypes.
|
||
//
|
||
|
||
VOID
|
||
JzMakeConfiguration (
|
||
ULONG Monitor,
|
||
ULONG Floppy,
|
||
ULONG Floppy2
|
||
);
|
||
|
||
BOOLEAN
|
||
JzMatchComponent(
|
||
IN PCHAR Value1,
|
||
IN PCHAR Value2
|
||
);
|
||
|
||
ULONG
|
||
JzGetYesNo (
|
||
IN PULONG CurrentLine,
|
||
IN PCHAR PromptString,
|
||
IN BOOLEAN YesIsDefault
|
||
);
|
||
|
||
#ifdef DUO
|
||
ULONG
|
||
JzGetScsiBus (
|
||
IN PULONG CurrentLine,
|
||
IN ULONG InitialValue
|
||
);
|
||
#endif // DUO
|
||
|
||
ULONG
|
||
JzGetScsiId (
|
||
IN PULONG CurrentLine,
|
||
IN PCHAR Prompt,
|
||
IN ULONG InitialValue
|
||
);
|
||
|
||
ULONG
|
||
JzGetDevice (
|
||
IN PULONG CurrentLine
|
||
);
|
||
|
||
ULONG
|
||
JzGetPartition (
|
||
IN PULONG CurrentLine,
|
||
IN BOOLEAN MustBeFat
|
||
);
|
||
|
||
|
||
VOID
|
||
JzMakeEnvironment (
|
||
ULONG BusNumber,
|
||
ULONG Device,
|
||
ULONG DeviceId,
|
||
ULONG DevicePartition
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This routine initializes the environment variables.
|
||
|
||
Arguments:
|
||
|
||
None.
|
||
|
||
Return Value:
|
||
|
||
None.
|
||
|
||
--*/
|
||
{
|
||
ARC_STATUS Status;
|
||
CHAR TempString[80];
|
||
|
||
switch (Device) {
|
||
#ifdef DUO
|
||
case 0:
|
||
sprintf( TempString,
|
||
"scsi(%1d)disk(%1d)rdisk()partition(%1d)",
|
||
BusNumber,
|
||
DeviceId,
|
||
DevicePartition);
|
||
break;
|
||
case 1:
|
||
sprintf( TempString,
|
||
"scsi(%1d)disk(%1d)fdisk()",
|
||
BusNumber,
|
||
DeviceId);
|
||
break;
|
||
default:
|
||
sprintf( TempString,
|
||
"scsi(%1d)cdrom(%1d)fdisk()",
|
||
BusNumber,
|
||
DeviceId);
|
||
break;
|
||
#else
|
||
case 0:
|
||
sprintf( TempString,
|
||
"scsi()disk(%1d)rdisk()partition(%1d)",
|
||
DeviceId,
|
||
DevicePartition);
|
||
break;
|
||
case 1:
|
||
sprintf( TempString,
|
||
"scsi()disk(%1d)fdisk()",
|
||
DeviceId);
|
||
break;
|
||
default:
|
||
sprintf( TempString,
|
||
"scsi()cdrom(%1d)fdisk()",
|
||
DeviceId);
|
||
break;
|
||
#endif // DUO
|
||
}
|
||
|
||
Status = ArcSetEnvironmentVariable("CONSOLEIN",
|
||
"multi()key()keyboard()console()");
|
||
|
||
if (Status != ESUCCESS) {
|
||
goto TestError;
|
||
}
|
||
|
||
Status = ArcSetEnvironmentVariable("CONSOLEOUT",
|
||
"multi()video()monitor()console()");
|
||
|
||
if (Status != ESUCCESS) {
|
||
goto TestError;
|
||
}
|
||
|
||
Status = ArcSetEnvironmentVariable("FWSEARCHPATH",
|
||
TempString);
|
||
|
||
if (Status != ESUCCESS) {
|
||
goto TestError;
|
||
}
|
||
|
||
// TEMPTEMP
|
||
Status = ArcSetEnvironmentVariable("SYSTEMPARTITION",
|
||
TempString);
|
||
|
||
if (Status != ESUCCESS) {
|
||
goto TestError;
|
||
}
|
||
// TEMPTEMP
|
||
|
||
// Status = ArcSetEnvironmentVariable("TIMEZONE",
|
||
// "PST8PDT");
|
||
|
||
// if (Status != ESUCCESS) {
|
||
// goto TestError;
|
||
// }
|
||
|
||
#ifndef DUO
|
||
Status = ArcSetEnvironmentVariable("A:",
|
||
"multi()disk()fdisk()");
|
||
#endif // DUO
|
||
|
||
if (Status != ESUCCESS) {
|
||
goto TestError;
|
||
}
|
||
|
||
return;
|
||
|
||
TestError:
|
||
|
||
JzPrint(JZ_CANT_SET_VARIABLE_MSG);
|
||
return;
|
||
}
|
||
|
||
|
||
ULONG
|
||
JzGetMonitor (
|
||
IN PULONG CurrentLine
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Arguments:
|
||
|
||
None.
|
||
|
||
Return Value:
|
||
|
||
None.
|
||
|
||
--*/
|
||
{
|
||
ULONG Line;
|
||
ULONG ReturnValue;
|
||
|
||
Line = *CurrentLine;
|
||
*CurrentLine += NUMBER_OF_RESOLUTIONS + 2;
|
||
|
||
JzSetPosition( Line, 0);
|
||
JzPrint(JZ_MONITOR_RES_MSG);
|
||
|
||
ReturnValue = JxDisplayMenu( ResolutionChoices,
|
||
NUMBER_OF_RESOLUTIONS,
|
||
0,
|
||
Line + 1);
|
||
|
||
JzSetPosition( *CurrentLine, 0);
|
||
return ReturnValue;
|
||
}
|
||
|
||
|
||
ULONG
|
||
JzGetFloppy (
|
||
IN PULONG CurrentLine
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Arguments:
|
||
|
||
None.
|
||
|
||
Return Value:
|
||
|
||
None.
|
||
|
||
--*/
|
||
{
|
||
ULONG Line;
|
||
ULONG ReturnValue;
|
||
|
||
Line = *CurrentLine;
|
||
*CurrentLine += NUMBER_OF_FLOPPIES + 2;
|
||
|
||
JzSetPosition( Line, 0);
|
||
JzPrint(JZ_FLOPPY_SIZE_MSG);
|
||
|
||
ReturnValue = JxDisplayMenu( FloppyChoices,
|
||
NUMBER_OF_FLOPPIES,
|
||
1,
|
||
Line + 1);
|
||
|
||
JzSetPosition( *CurrentLine, 0);
|
||
return ReturnValue;
|
||
}
|
||
|
||
|
||
BOOLEAN
|
||
JzMakeDefaultConfiguration (
|
||
VOID
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Arguments:
|
||
|
||
None.
|
||
|
||
Return Value:
|
||
|
||
Returns TRUE if the configuration was modified, otherwise returns FALSE.
|
||
|
||
--*/
|
||
{
|
||
ARC_STATUS Status;
|
||
ULONG Index;
|
||
UCHAR Character;
|
||
ULONG Count;
|
||
PUCHAR Nvram;
|
||
ULONG CurrentLine;
|
||
LONG Monitor;
|
||
LONG Floppy;
|
||
LONG Floppy2;
|
||
ULONG OldScsiHostId;
|
||
|
||
JzClearScreen();
|
||
JzShowTime(TRUE);
|
||
CurrentLine = 2;
|
||
|
||
Monitor = JzGetMonitor(&CurrentLine);
|
||
if (Monitor == -1) {
|
||
return(FALSE);
|
||
}
|
||
|
||
Floppy = JzGetFloppy(&CurrentLine);
|
||
if (Floppy == -1) {
|
||
return(FALSE);
|
||
}
|
||
|
||
Floppy2 = JzGetYesNo(&CurrentLine, JZ_2ND_FLOPPY_MSG, FALSE);
|
||
if (Floppy2 == -1) {
|
||
return(FALSE);
|
||
}
|
||
|
||
if (Floppy2 == 0) {
|
||
Floppy2 = JzGetFloppy(&CurrentLine);
|
||
if (Floppy == -1) {
|
||
return(FALSE);
|
||
}
|
||
} else {
|
||
Floppy2 = -1;
|
||
}
|
||
|
||
//
|
||
// Save the current scsi host id, and then change ScsiHostId to an invalid
|
||
// value so that the user can select the current id (see JzGetScsiId).
|
||
//
|
||
|
||
OldScsiHostId = ScsiHostId;
|
||
ScsiHostId = 8;
|
||
ScsiHostId = JzGetScsiId(&CurrentLine, JZ_SCSI_HOST_MSG, OldScsiHostId);
|
||
if (ScsiHostId == -1) {
|
||
ScsiHostId = OldScsiHostId;
|
||
return(FALSE);
|
||
}
|
||
|
||
//
|
||
// Clear the configuration information.
|
||
//
|
||
|
||
JzPrint(JZ_CLEAR_CONFIG_MSG);
|
||
|
||
//
|
||
// Zero all of the configuration read/write NVRAM, note that the checksum is
|
||
// also zero in this case.
|
||
//
|
||
|
||
for ( Nvram = (PUCHAR)(NVRAM_CONFIGURATION);
|
||
Nvram < (PUCHAR)(NVRAM_CONFIGURATION +
|
||
sizeof(COMPRESSED_CONFIGURATION_PACKET) * NUMBER_OF_ENTRIES +
|
||
LENGTH_OF_IDENTIFIER +
|
||
LENGTH_OF_DATA +
|
||
4) ;
|
||
Nvram++ ) {
|
||
WRITE_REGISTER_UCHAR( Nvram, 0 );
|
||
}
|
||
|
||
//
|
||
// Clear the EISA space.
|
||
//
|
||
|
||
Nvram = (PUCHAR)((PNV_CONFIGURATION)NVRAM_CONFIGURATION)->EisaData;
|
||
for ( Index = 0;
|
||
Index < LENGTH_OF_EISA_DATA + 4;
|
||
Index++ ) {
|
||
WRITE_REGISTER_UCHAR( &Nvram[Index], 0 );
|
||
}
|
||
|
||
//
|
||
// Add components.
|
||
//
|
||
|
||
JzPrint(JZ_ADD_CONFIG_MSG);
|
||
JzMakeConfiguration(Monitor, Floppy, Floppy2);
|
||
|
||
//
|
||
// Save configuration in Nvram.
|
||
//
|
||
|
||
JzPrint(JZ_SAVE_CONFIG_MSG);
|
||
ArcSaveConfiguration();
|
||
|
||
JzPrint(JZ_DONE_CONFIG_MSG);
|
||
FwWaitForKeypress();
|
||
|
||
return(TRUE);
|
||
}
|
||
|
||
|
||
VOID
|
||
JzMakeDefaultEnvironment (
|
||
VOID
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Arguments:
|
||
|
||
None.
|
||
|
||
Return Value:
|
||
|
||
None.
|
||
|
||
--*/
|
||
{
|
||
ARC_STATUS Status;
|
||
ULONG Index;
|
||
UCHAR Character;
|
||
ULONG Count;
|
||
PUCHAR Nvram;
|
||
ULONG CurrentLine;
|
||
LONG BusNumber;
|
||
LONG Device;
|
||
LONG DeviceId;
|
||
LONG DevicePartition;
|
||
|
||
|
||
JzClearScreen();
|
||
JzShowTime(TRUE);
|
||
CurrentLine = 2;
|
||
JzSetPosition( CurrentLine, 0);
|
||
|
||
JzPrint(JZ_DEFAULT_SYS_PART_MSG);
|
||
CurrentLine += 1;
|
||
JzSetPosition( CurrentLine, 0);
|
||
|
||
#ifdef DUO
|
||
BusNumber = JzGetScsiBus(&CurrentLine, 0);
|
||
if (BusNumber == -1) {
|
||
return;
|
||
}
|
||
#endif // DUO
|
||
|
||
Device = JzGetDevice(&CurrentLine);
|
||
if (Device == -1) {
|
||
return;
|
||
}
|
||
|
||
DeviceId = JzGetScsiId(&CurrentLine, " Enter SCSI ID: ", 0);
|
||
if (DeviceId == -1) {
|
||
return;
|
||
}
|
||
|
||
//
|
||
// If the media is scsi disk, get the partition.
|
||
//
|
||
|
||
if (Device == 0) {
|
||
DevicePartition = JzGetPartition(&CurrentLine, TRUE);
|
||
if (DevicePartition == -1) {
|
||
return;
|
||
}
|
||
|
||
}
|
||
|
||
//
|
||
// Clear the environment information.
|
||
//
|
||
|
||
JzPrint(JZ_CLEAR_CONFIG_MSG);
|
||
|
||
//
|
||
// Zero all of the environment read/write NVRAM, note that the checksum is
|
||
// also zero in this case.
|
||
//
|
||
|
||
Nvram = (PUCHAR)((PNV_CONFIGURATION)NVRAM_CONFIGURATION)->Environment;
|
||
for ( Index = 0;
|
||
Index < LENGTH_OF_ENVIRONMENT + 4;
|
||
Index++ ) {
|
||
WRITE_REGISTER_UCHAR( &Nvram[Index], 0 );
|
||
}
|
||
|
||
//
|
||
// Add environment variables.
|
||
//
|
||
|
||
JzPrint(JZ_ADD_ENVIR_MSG);
|
||
JzMakeEnvironment(BusNumber, Device, DeviceId, DevicePartition);
|
||
FwWaitForKeypress();
|
||
|
||
return;
|
||
}
|
||
|