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.
123 lines
2.2 KiB
123 lines
2.2 KiB
//++
|
|
//
|
|
// Copyright (c) 1993 IBM Corporation
|
|
//
|
|
// Module Name:
|
|
//
|
|
// pxpower.s
|
|
//
|
|
// Abstract:
|
|
//
|
|
// This module implements the routines to set Doze mode and Dynamic Power management
|
|
// mode on the PowerPC.
|
|
//
|
|
// Author:
|
|
//
|
|
// N. Yoshiyama ( [email protected] )
|
|
//
|
|
// Environment:
|
|
//
|
|
// Kernel mode only.
|
|
//
|
|
// Revision History:
|
|
//
|
|
//--
|
|
|
|
#include "kxppc.h"
|
|
|
|
|
|
.set HID0, 1008 // SPR # for HID0
|
|
|
|
|
|
//++
|
|
//
|
|
// VOID
|
|
// HalpProcessorIdle (
|
|
// VOID
|
|
// )
|
|
//
|
|
// Routine Description:
|
|
//
|
|
// This function sets CPU into Doze mode if it is PowerPC 603 and
|
|
// enable External interrupts.
|
|
//
|
|
// Arguments:
|
|
//
|
|
// None.
|
|
//
|
|
// Return Value:
|
|
//
|
|
// None.
|
|
//
|
|
//--
|
|
|
|
LEAF_ENTRY(HalpProcessorIdle)
|
|
|
|
mfmsr r.4 // Read MSR
|
|
ori r.4, r.4, 0x8000 // Enable External/Decrementer interrupts
|
|
|
|
mfpvr r.3 // Read PVR
|
|
rlwinm r.3, r.3, 16, 16, 31
|
|
cmpwi cr.0, r.3, 6 // Is it a 603e ?
|
|
cmpwi cr.1, r.3, 7 // Is it a 603ev ?
|
|
cmpwi cr.7, r.3, 3 // Is it a 603 ?
|
|
beq cr.0, SetDozeMode //
|
|
beq cr.1, SetDozeMode //
|
|
bne cr.7, EnableInterrupts // If not, just enable interrupts
|
|
|
|
SetDozeMode:
|
|
mfspr r.3, HID0 // Set Doze mode in HID0 (bit 8)
|
|
oris r.3, r.3, 0x0080
|
|
mtspr HID0, r.3
|
|
|
|
oris r.4, r.4, 0x0004 // Set POW in MSR (bit 13)
|
|
sync
|
|
|
|
EnableInterrupts:
|
|
mtmsr r.4
|
|
isync
|
|
|
|
LEAF_EXIT(HalpProcessorIdle)
|
|
|
|
|
|
//++
|
|
//
|
|
// VOID
|
|
// HalpSetDpm (
|
|
// VOID
|
|
// )
|
|
//
|
|
// Routine Description:
|
|
//
|
|
// This function enables Dynamic Power Management if the CPU is PowerPC 603.
|
|
//
|
|
// Arguments:
|
|
//
|
|
// None.
|
|
//
|
|
// Return Value:
|
|
//
|
|
// None.
|
|
//
|
|
//--
|
|
|
|
LEAF_ENTRY(HalpSetDpm)
|
|
|
|
mfpvr r.3 // Read PVR
|
|
rlwinm r.3, r.3, 16, 16, 31
|
|
cmpwi cr.0, r.3, 6 // Is it a 603e ?
|
|
cmpwi cr.1, r.3, 7 // Is it a 603ev ?
|
|
cmpwi cr.7, r.3, 3 // Is it a 603 ?
|
|
beq cr.0, EnableDpm //
|
|
beq cr.1, EnableDpm // If so, enable DPM
|
|
beq cr.7, EnableDpm //
|
|
ALTERNATE_EXIT(HalpSetDpm) // If not, just return
|
|
|
|
EnableDpm:
|
|
mfspr r.3, HID0 // Load r.3 from HID0
|
|
oris r3, r3, 0x0010 // Set DPM bit
|
|
mtspr HID0, r3 // Update HID0
|
|
sync
|
|
|
|
LEAF_EXIT(HalpSetDpm)
|
|
|