/*++

Copyright (c) 1990  Microsoft Corporation

Module Name:

    selfmap.h

Abstract:

    This module defines various memory addresses for the ROM self-test.

Author:

    Lluis Abello (lluis) 10-Jan-1991

Revision History:

--*/

#ifndef _SELFMAP_
#define _SELFMAP_


#define PROM256

#ifdef PROM64
#define ROM_SIZE 0x10000
#endif
#ifdef PROM128
#define ROM_SIZE 0x20000
#endif
#ifdef PROM256
#define ROM_SIZE 0x40000
#endif

//
// TTable points to 2Mb
//
#define TT_BASE_ADDRESS     0x200000

#define MEMTEST_SIZE                0x2000          // Size of memory tested first
#define STACK_SIZE                  0xA000          // 40Kb of stack
#define RAM_TEST_STACK_ADDRESS      0x8000BFF0      // Stack for code copied to memory
#define RAM_TEST_STACK_ADDRESS_B    0x80005FF0      // stack for processor B

#ifdef R3000
#define INSTRUCTION_CACHE_SIZE  0x10000             // 64Kb of I Cache
#define DATA_CACHE_SIZE         0x10000             // 64Kb of D Cache
#define SIZE_OF_CACHES              0x10000             // 64Kb bigest cache.
#define ROM_TLB_ENTRIES (ROM_SIZE >> 12)
#define DEVICE_TLB_ENTRIES 16
#define FIRST_UNUSED_TLB_ENTRY ROM_TLB_ENTRIES+DEVICE_TLB_ENTRIES
#endif  // R3000

//
// Define firmware size.
// Firmware size includes code and stack.
//
// FW_TOP_ADDRESS must be a 64K aligned address.
// The upper 64Kb (0x50000 to 0x60000) are reserved for the video prom code.
// Note that the firmware size is 0x40000, it is loaded starting
// at address 0xC000, and the fonts are unpacked at 0x4C000.
//
// N.B. If any of these numbers change, adjust the are of memory zero'd by
// j4start.s.
//

#define FW_BOTTOM_ADDRESS 0xC000
#define FW_SIZE           0x40000
#define FW_FONT_SIZE      (0x50000 - FW_SIZE - FW_BOTTOM_ADDRESS)
#define VIDEO_PROM_SIZE   0x10000
#define FW_TOP_ADDRESS    (FW_BOTTOM_ADDRESS + FW_SIZE + FW_FONT_SIZE + VIDEO_PROM_SIZE)

#define FW_PAGES    ((FW_TOP_ADDRESS) >> PAGE_SHIFT)
#define FW_PAGES_OLD (FW_SIZE >> PAGE_SHIFT)

#define VIDEO_PROM_CODE_VIRTUAL_BASE  0x10000000     // Link address of video prom code
#define VIDEO_PROM_CODE_PHYSICAL_BASE (FW_TOP_ADDRESS - VIDEO_PROM_SIZE)  // phys address of video prom code
#define VIDEO_PROM_CODE_UNCACHED_BASE (KSEG1_BASE + VIDEO_PROM_CODE_PHYSICAL_BASE)  // uncached address where video prom code is copied

#define FW_FONT_ADDRESS (PVOID)(KSEG0_BASE + FW_BOTTOM_ADDRESS + FW_SIZE)

//
// Address definitions for the SelftTests written in C.
// The code is copied to RAM_TEST_LINK_ADDRESS from RAM_TEST_ROM_ADDRESS
// so that it runs at the address it was linked.
//

#define RAM_TEST_DESTINATION_ADDRESS 0xA000c000      // uncached link address
#define RAM_TEST_LINK_ADDRESS        0x8000c000      // Link Address of code

//
//       FW_TOP_ADDRESS  ___________
//                      | Video rom |
//                      | code      |
//                      |___________|
//       FW_SIZE        |   Code    |
//                      |     &     |
//                      |   Data    |
//                      |           |
//                      |___________|
//                      | Stack ||  |
//                      |_______\/__|
//       MEMTEST_SIZE   |PutLed     | Memory tested from ROM
//                      |ZeroMem    |
//                      |MemoryTest |
//                   0  |___________|
//

#ifdef DUO
#define LINK_ADDRESS 0xE1040000
#else
#define LINK_ADDRESS 0xE1000000
#endif
#define RESET_VECTOR 0xBFC00000

//
// Virtual - Physiscal base address pairs
//
#define TLB_TEST_PHYS 0x0           // To test the tlb
#define TLB_TEST_VIRT 0x20000000    //
#define RESV_VIRT     0xE4000000

//
// Entry LO - HI pairs
//
#ifdef R4000
#define PROM_HI ((PROM_VIRTUAL_BASE >> 13) << ENTRYHI_VPN2)
#define PROM_LO0  ((PROM_PHYSICAL_BASE >> 12) << ENTRYLO_PFN) + (1 << ENTRYLO_G) + (1 << ENTRYLO_V) + (2 << ENTRYLO_C)
#ifdef PROM256
#define PROM_LO1  (1 << ENTRYLO_G)
#define PROM_MASK (PAGEMASK_256KB << PAGEMASK_PAGEMASK)
#endif
#ifdef PROM128                              //
#define PROM_LO1 (((PROM_PHYSICAL_BASE+0x10000) >> 12) << ENTRYLO_PFN) + (1 << ENTRYLO_G) + \
                   (1 << ENTRYLO_V) + (2 << ENTRYLO_C)
#define PROM_MASK (PAGEMASK_64KB << PAGEMASK_PAGEMASK)
#endif
#ifdef PROM64
#define PROM_LO1 (1 << ENTRYLO_G)         // If odd page not used
#define PROM_MASK (PAGEMASK_64KB << PAGEMASK_PAGEMASK)
#endif
#define TLB_TEST_LO ((1 << ENTRYLO_G) + (1 << ENTRYLO_V) + \
                    (1 << ENTRYLO_D) + (2 << ENTRYLO_C) + TLB_TEST_PHYS)

#define TLB_TEST_HI TLB_TEST_VIRT

#define TLB_KSEG_PHYS       0x0
#define TLB_KSEG_LO ((1 << ENTRYLO_G) + (1 << ENTRYLO_V) + \
            (1 << ENTRYLO_D) + (3 << ENTRYLO_C) + TLB_KSEG_PHYS)
#define TLB_KSEG_VIRT       0x10000000
#define TLB_KSEG_HI         TLB_KSEG_VIRT
#define TLB_KSEG_MASK       (PAGEMASK_64KB << PAGEMASK_PAGEMASK)
#endif // R4000

#ifdef R3000
//
// Entry LO - HI pairs
//
#define DIAGNOSTIC_PHYSICAL_BASE 0x8000F000

#define LED_LO ((1 << ENTRYLO_G) | (1 << ENTRYLO_V) | \
                    (1 << ENTRYLO_N) | (1 << ENTRYLO_D) | \
                    DIAGNOSTIC_PHYSICAL_BASE)
#define LED_HI DIAGNOSTIC_VIRTUAL_BASE

#define TLB_TEST_LO ((1 << ENTRYLO_G) | (1 << ENTRYLO_V) | \
                    (1 << ENTRYLO_N) | (1 << ENTRYLO_D) | \
                    TLB_TEST_PHYS)
#define TLB_TEST_HI TLB_TEST_VIRT

#define ROM_LO    ((1 << ENTRYLO_G) | (1 << ENTRYLO_V) | \
                    (1 << ENTRYLO_N) | \
                    PROM_PHYSICAL_BASE)
#define ROM_HI PROM_VIRTUAL_BASE

#define DEVICE_LO ((1 << ENTRYLO_G) | (1 << ENTRYLO_V) | \
                    (1 << ENTRYLO_N) | (1 << ENTRYLO_D) | \
                    DEVICE_PHYSICAL_BASE)
#define DEVICE_HI   DEVICE_VIRTUAL_BASE

#define PROC_LO    ((1 << ENTRYLO_G) | (1 << ENTRYLO_V) | \
                    (1 << ENTRYLO_N) | \
                    INTERRUPT_PHYSICAL_BASE)
#define PROC_HI     INTERRUPT_VIRTUAL_BASE

#define VID_LO ((1 << ENTRYLO_G) | (1 << ENTRYLO_V) | \
                    (1 << ENTRYLO_N) | (1 << ENTRYLO_D) | \
                    VIDEO_CONTROL_PHYSICAL_BASE)
#define VID_HI   VIDEO_CONTROL_VIRTUAL_BASE

#define VIDMEM_LO ((1 << ENTRYLO_G) | (1 << ENTRYLO_V) | \
                    (1 << ENTRYLO_N) | (1 << ENTRYLO_D) | \
                    VIDEO_MEMORY_PHYSICAL_BASE)
#define VIDMEM_HI   VIDEO_MEMORY_PHYSICAL_BASE


#define CURSOR_LO ((1 << ENTRYLO_G) | (1 << ENTRYLO_V) | \
                    (1 << ENTRYLO_N) | (1 << ENTRYLO_D) | \
                    VIDEO_CURSOR_PHYSICAL_BASE)
#define CURSOR_HI   VIDEO_CURSOR_VIRTUAL_BASE

#define RESV_LO ((1 << ENTRYLO_G) | (1 << ENTRYLO_N))
#define RESV_HI   RESV_VIRT

#endif  //R3000
//
// Trap handling definitions.
//
#define COMMON_EXCEPTION    0
#define NMI_EXCEPTION       1
#define CACHE_EXCEPTION     2


//
//  Define offsets from Register Table.
//  Must match the definiton in monitor.h
//
#define zeroRegTable        0x0
#define atRegTable          0x4
#define v0RegTable          0x8
#define v1RegTable          0xC
#define a0RegTable          0x10
#define a1RegTable          0x14
#define a2RegTable          0x18
#define a3RegTable          0x1C
#define t0RegTable          0x20
#define t1RegTable          0x24
#define t2RegTable          0x28
#define t3RegTable          0x2C
#define t4RegTable          0x30
#define t5RegTable          0x34
#define t6RegTable          0x38
#define t7RegTable          0x3C
#define s0RegTable          0x40
#define s1RegTable          0x44
#define s2RegTable          0x48
#define s3RegTable          0x4C
#define s4RegTable          0x50
#define s5RegTable          0x54
#define s6RegTable          0x58
#define s7RegTable          0x5C
#define t8RegTable          0x60
#define t9RegTable          0x64
#define k0RegTable          0x68
#define k1RegTable          0x6C
#define gpRegTable          0x70
#define spRegTable          0x74
#define s8RegTable          0x78
#define raRegTable          0x7C
#define f0RegTable          0x80
#define f1RegTable          0x84
#define f2RegTable          0x88
#define f3RegTable          0x8C
#define f4RegTable          0x90
#define f5RegTable          0x94
#define f6RegTable          0x98
#define f7RegTable          0x9C
#define f8RegTable          0xA0
#define f9RegTable          0xA4
#define f10RegTable         0xA8
#define f11RegTable         0xAC
#define f12RegTable         0xB0
#define f13RegTable         0xB4
#define f14RegTable         0xB8
#define f15RegTable         0xBC
#define f16RegTable         0xC0
#define f17RegTable         0xC4
#define f18RegTable         0xC8
#define f19RegTable         0xCC
#define f20RegTable         0xD0
#define f21RegTable         0xD4
#define f22RegTable         0xD8
#define f23RegTable         0xDC
#define f24RegTable         0xE0
#define f25RegTable         0xE4
#define f26RegTable         0xE8
#define f27RegTable         0xEC
#define f28RegTable         0xF0
#define f29RegTable         0xF4
#define f30RegTable         0xF8
#define f31RegTable         0xFC
#define fsrRegTable         0x100
#define indexRegTable       0x104
#define randomRegTable      0x108
#define entrylo0RegTable    0x10C
#define entrylo1RegTable    0x110
#define contextRegTable     0x114
#define pagemaskRegTable    0x118
#define wiredRegTable       0x11C
#define badvaddrRegTable    0x120
#define countRegTable       0x124
#define entryhiRegTable     0x128
#define compareRegTable     0x12C
#define psrRegTable         0x130
#define causeRegTable       0x134
#define epcRegTable         0x138
#define pridRegTable        0x13C
#define configRegTable      0x140
#define lladdrRegTable      0x144
#define watchloRegTable     0x148
#define watchhiRegTable     0x14C
#define eccRegTable         0x150
#define cacheerrorRegTable  0x154
#define tagloRegTable       0x158
#define taghiRegTable       0x15C
#define errorepcRegTable    0x160
#define RegisterTableSize   0x164

//
//  Define Fw exception frame offsets.
//

#define FwFrameK1       0x4
#define FwFrameRa       0x8
#define FwFrameA0       0xC
#define FwFrameA1       0x10
#define FwFrameA2       0x14
#define FwFrameA3       0x18
#define FwFrameV0       0x1C
#define FwFrameV1       0x20
#define FwFrameT0       0x24
#define FwFrameT1       0x28
#define FwFrameT2       0x2C
#define FwFrameT3       0x30
#define FwFrameT4       0x34
#define FwFrameT5       0x38
#define FwFrameT6       0x3C
#define FwFrameT7       0x40
#define FwFrameT8       0x44
#define FwFrameT9       0x48
#define FwFrameAT       0x4C
#define FwFrameSize     0x50

#endif  // _SELFMAP_
