summaryrefslogblamecommitdiffstats
path: root/private/ntos/nthals/halsable/alpha/sbmapio.c
blob: f902b150688f7e51aaaf4c87eebfa3b83860b098 (plain) (tree)












































































































































































































                                                                               
/*++

Copyright (c) 1993  Digital Equipment Corporation

Module Name:

    ebmapio.c

Abstract:

    This module contains the functions to map HAL-accessed I/O addresses
    on the Sable system.

Author:

    Joe Notarangelo  25-Oct-1993

Environment:

    Kernel mode

Revision History:


--*/

#include "halp.h"
#include "isaaddr.h"


//
// Define global data used to locate the EISA control space.
//

PVOID HalpEisaControlBase;
PVOID HalpEisaIntAckBase;
PVOID HalpCMOSRamBase;

//
// Define the array that maps logical processor numbers to the corresponding
// QVA for that processor's CPU CSRs.
//

PSABLE_CPU_CSRS HalpSableCpuCsrs[HAL_MAXIMUM_PROCESSOR+1];


BOOLEAN
HalpMapIoSpace (
    VOID
    )

/*++

Routine Description:

    This routine maps the HAL I/O space for a Sable
    system using the Quasi VA.

Arguments:

    None.

Return Value:

    If the initialization is successfully completed, then a value of TRUE
    is returned. Otherwise, a value of FALSE is returned.

--*/

{
    PVOID PciIoSpaceBase;

#if !defined(AXP_FIRMWARE)

    PKPRCB Prcb;
    extern HalpLogicalToPhysicalProcessor[HAL_MAXIMUM_PROCESSOR+1];

    Prcb = PCR->Prcb;

    //
    //  Assign CPU specific CSR address
    //

    switch( HalpLogicalToPhysicalProcessor[Prcb->Number] ) {

    case SABLE_CPU0:
        HAL_PCR->IpirSva = SABLE_CPU0_IPIR_PHYSICAL | SUPERPAGE_ENABLE;
        HAL_PCR->CpuCsrsQva = SABLE_CPU0_CSRS_QVA;
        HalpSableCpuCsrs[Prcb->Number] = SABLE_CPU0_CSRS_QVA;
        break;

    case SABLE_CPU1:
        HAL_PCR->IpirSva = SABLE_CPU1_IPIR_PHYSICAL | SUPERPAGE_ENABLE;
        HAL_PCR->CpuCsrsQva = SABLE_CPU1_CSRS_QVA;
        HalpSableCpuCsrs[Prcb->Number] = SABLE_CPU1_CSRS_QVA;
        break;

    case SABLE_CPU2:
        HAL_PCR->IpirSva = SABLE_CPU2_IPIR_PHYSICAL | SUPERPAGE_ENABLE;
        HAL_PCR->CpuCsrsQva = SABLE_CPU2_CSRS_QVA;
        HalpSableCpuCsrs[Prcb->Number] = SABLE_CPU2_CSRS_QVA;
        break;

    case SABLE_CPU3:
        HAL_PCR->IpirSva = SABLE_CPU3_IPIR_PHYSICAL | SUPERPAGE_ENABLE;
        HAL_PCR->CpuCsrsQva = SABLE_CPU3_CSRS_QVA;
        HalpSableCpuCsrs[Prcb->Number] = SABLE_CPU3_CSRS_QVA;
        break;

    default:
#ifdef HALDBG
        DbgPrint("HalpMapIoSpace: Invalid Cpu number %d\n", Prcb->Number);
        DbgBreakPoint();
#else
        ;
#endif // HALDBG
    }

#endif // AXP_FIRMWARE

    //
    // Map EISA control space.
    //

    PciIoSpaceBase = HAL_MAKE_QVA( SABLE_PCI0_SPARSE_IO_PHYSICAL );
    HalpEisaControlBase = PciIoSpaceBase;

    HalpCMOSRamBase = (PVOID)
                      ( (ULONG)HAL_MAKE_QVA( SABLE_PCI0_SPARSE_IO_PHYSICAL ) +
                        CMOS_ISA_PORT_ADDRESS );

    //
    // Map the real-time clock registers.
    //

    HalpRtcAddressPort = (PVOID)((ULONG)PciIoSpaceBase + RTC_ISA_ADDRESS_PORT);
    HalpRtcDataPort = (PVOID)((ULONG)PciIoSpaceBase + RTC_ISA_DATA_PORT);

    return TRUE;

}

ULONG
HalpMapDebugPort(
    IN ULONG ComPort,
    OUT PULONG ReadQva,
    OUT PULONG WriteQva
    )
/*++

Routine Description:

    This routine maps the debug com port so that the kernel debugger
    may function - if called it is called very earlier in the boot sequence.

Arguments:

    ComPort - Supplies the number of the com port to use as the debug port.

    ReadQva - Receives the QVA used to access the read registers of the debug
              port.

    WriteQva - Receives the QVA used to access the write registers of the
               debug port.

Return Value:

    Returns the base bus address of the device used as the debug port.

--*/
{
    ULONG ComPortAddress;
    ULONG PortQva;

    //
    // Compute the port address, based on the desired com port.
    //

    switch( ComPort ){

    case 1:

        ComPortAddress = COM1_ISA_PORT_ADDRESS;
	break;

    case 2:
    default:

        ComPortAddress = COM2_ISA_PORT_ADDRESS;

    }

    //
    // Return the QVAs for read and write access.
    //

    PortQva = (ULONG)HAL_MAKE_QVA(SABLE_PCI0_SPARSE_IO_PHYSICAL) +
              ComPortAddress;

    *ReadQva = PortQva;
    *WriteQva = PortQva;

    return ComPortAddress;

}