summaryrefslogtreecommitdiffstats
path: root/private/ntos/nthals/halps/ppc/pxl2.s
diff options
context:
space:
mode:
Diffstat (limited to 'private/ntos/nthals/halps/ppc/pxl2.s')
-rw-r--r--private/ntos/nthals/halps/ppc/pxl2.s183
1 files changed, 183 insertions, 0 deletions
diff --git a/private/ntos/nthals/halps/ppc/pxl2.s b/private/ntos/nthals/halps/ppc/pxl2.s
new file mode 100644
index 000000000..a45f5dd6f
--- /dev/null
+++ b/private/ntos/nthals/halps/ppc/pxl2.s
@@ -0,0 +1,183 @@
+//
+//
+// Copyright (c) 1993 IBM Corporation
+//
+// Copyright (c) 1994 MOTOROLA, INC. All Rights Reserved. This file
+// contains copyrighted material. Use of this file is restricted
+// by the provisions of a Motorola Software License Agreement.
+//
+// Module Name:
+//
+// PXL2.S
+//
+// Abstract:
+//
+// This module implements the routines to size the L2 cache
+// on PowerStack based system.
+//
+// Author:
+//
+// Karl Rusnock (karl_rusnock@phx.mcd.mot.com)
+//
+// Environment:
+//
+// Kernel mode only.
+//
+// Revision History:
+// 08-Dec-95 kjr Created this file for MCG PowerStack 2 Systems.
+//
+
+#include "kxppc.h"
+#include "halppc.h"
+
+ .extern HalpIoControlBase
+ .set HID0, 1008
+//
+// L2 cache sizes:
+//
+ .set L2_SIZE, 0x3 // Bits 1..0 (LE bit order)
+ .set L2_1M, 0x2
+ .set L2_512K, 0x0
+ .set L2_256K, 0x1
+ .set L2_LINE_SIZE, 32
+
+ .set CacheSize, r.3 // Return value
+ .set L2CONFIG, r.9
+ .set ISA, r.10 // Pointer to ISA I/O space
+
+//***********************************************************************
+//
+// Synopsis:
+// ULONG HalpSizeL2(VOID)
+//
+// Purpose:
+// Sizes the L2 cache.
+//
+// Returns:
+// Size of L2 cache or zero if not installed.
+// Valid sizes are 256, 512, and 1024.
+//
+// Global Variables Referenced:
+// HalpIoControlBase
+//
+// NOTE: Interrupts are assumed to be disabled upon entry.
+//***********************************************************************
+
+
+ LEAF_ENTRY(HalpSizeL2)
+
+//
+// Get ptr to Bridge I/O (ISA bus)
+//
+ lwz ISA,[toc]HalpIoControlBase(r.toc) // Get base of ISA I/O
+ lwz ISA,0(ISA)
+
+ lbz r.0, 0x823(ISA) // Cache Configuration Register.
+
+ andi. r.0, r.0, L2_SIZE // Isolate L2 size field
+ cmpi 0,0, r.0, L2_SIZE // L2 Cache Not Present?
+ li CacheSize, 0
+ beq L2_Exit
+
+ li CacheSize, 256
+ cmpi 0,0,r.0, L2_256K
+ beq L2_Exit
+
+ li CacheSize, 512
+ cmpi 0,0,r.0, L2_512K
+ beq L2_Exit
+
+ li CacheSize, 1024
+
+L2_Exit:
+
+//
+// r.3 = cache size in KB
+//
+ LEAF_EXIT(HalpSizeL2)
+
+
+//***********************************************************************
+//
+// Synopsis:
+// VOID HalpFlushAndDisableL2(VOID)
+//
+// Purpose:
+// Assumes that the L2 is enabled and in WRITE-THROUGH mode.
+// The L2 is invalidated and disabled.
+//
+// Returns:
+// nothing
+//
+// Global Variables Referenced:
+// HalpIoControlBase
+//
+// NOTE: Interrupts are assumed to be disabled upon entry.
+//***********************************************************************
+
+
+ LEAF_ENTRY(HalpFlushAndDisableL2)
+
+ mfspr r.9, HID0 // Lock the Icache
+ ori r.0, r.9, 0x2000
+ mtspr HID0, r.0
+ isync
+
+ li r.3, 0xC0 // Bits controlling L2
+ lwz ISA, [toc]HalpIoControlBase(r.toc) // Get base of ISA I/O
+ lwz ISA, 0(ISA)
+
+ lbz r.5, 0x81C(ISA) // Read System Control Register.
+ andc r.5, r.5, r.3 // Set bits to disable L2.
+ stb r.5, 0x814(ISA) // Invalidate L2 first.
+ stb r.5, 0x81C(ISA) // Disable L2 second.
+ stb r.5, 0x814(ISA) // Invalidate L2 again, to be safe.
+ lbz r.5, 0x81C(ISA) // Synchronize with I/O.
+ sync
+
+ mtspr HID0, r.9 // Unlock the Icache
+
+ LEAF_EXIT(HalpFlushAndDisableL2)
+
+
+//***********************************************************************
+//
+// Synopsis:
+// VOID HalpFlushAndEnableL2(VOID)
+//
+// Purpose:
+// Assumes that the L2 is Disabled.
+// The L2 is invalidated and enabled.
+//
+// Returns:
+// nothing
+//
+// Global Variables Referenced:
+// HalpIoControlBase
+//
+// NOTE: Interrupts are assumed to be disabled upon entry.
+//***********************************************************************
+
+
+ LEAF_ENTRY(HalpFlushAndEnableL2)
+
+ mfspr r.9, HID0 // Lock the Icache
+ ori r.0, r.9, 0x2000
+ mtspr HID0, r.0
+ isync
+
+ li r.3, 0xC0 // Bits controlling L2
+ lwz ISA, [toc]HalpIoControlBase(r.toc) // Get base of ISA I/O
+ lwz ISA, 0(ISA)
+
+ lbz r.5, 0x81C(ISA) // Read System Control Register.
+ or r.5, r.5, r.3 // Set bits to disable L2.
+ stb r.5, 0x814(ISA) // Invalidate L2 first.
+ stb r.5, 0x81C(ISA) // Enable L2 second.
+ lbz r.5, 0x81C(ISA) // Synchronize with I/O.
+ sync
+
+ mtspr HID0, r.9 // Unlock the Icache
+
+ LEAF_EXIT(HalpFlushAndEnableL2)
+