| /* Memory layout and register descriptions for the TSUNAMI/TYPHOON chipset. |
| |
| Copyright (C) 2011 Richard Henderson |
| |
| This file is part of QEMU PALcode. |
| |
| This program is free software; you can redistribute it and/or modify |
| it under the terms of the GNU General Public License as published by |
| the Free Software Foundation; either version 2 of the License or |
| (at your option) any later version. |
| |
| This program is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the text |
| of the GNU General Public License for more details. |
| |
| You should have received a copy of the GNU General Public License |
| along with this program; see the file COPYING. If not see |
| <http://www.gnu.org/licenses/>. */ |
| |
| #ifndef TYPHOON_H |
| #define TYPHOON_H 1 |
| |
| /* Assume a 43-bit KSEG for now. */ |
| #define PIO_PHYS_ADDR 0x80000000000 |
| #define PIO_KSEG_ADDR (0xfffffc0000000000 + 0x10000000000) |
| |
| /* CCHIP REGISTERS */ |
| |
| #define TYPHOON_CCHIP 0x1a0000000 |
| |
| #define TYPHOON_CCHIP_CSC 0x0000 |
| #define TYPHOON_CCHIP_MTR 0x0040 |
| #define TYPHOON_CCHIP_MISC 0x0080 |
| #define TYPHOON_CCHIP_MPD 0x00c0 |
| #define TYPHOON_CCHIP_AAR0 0x0100 |
| #define TYPHOON_CCHIP_AAR1 0x0140 |
| #define TYPHOON_CCHIP_AAR2 0x0180 |
| #define TYPHOON_CCHIP_AAR3 0x01c0 |
| #define TYPHOON_CCHIP_DIM0 0x0200 |
| #define TYPHOON_CCHIP_DIM1 0x0240 |
| #define TYPHOON_CCHIP_DIR0 0x0280 |
| #define TYPHOON_CCHIP_DIR1 0x02c0 |
| #define TYPHOON_CCHIP_DRIR 0x0300 |
| #define TYPHOON_CCHIP_PRBEN 0x0340 |
| #define TYPHOON_CCHIP_IIC0 0x0380 |
| #define TYPHOON_CCHIP_IIC1 0x03c0 |
| #define TYPHOON_CCHIP_MPR0 0x0400 |
| #define TYPHOON_CCHIP_MPR1 0x0440 |
| #define TYPHOON_CCHIP_MPR2 0x0480 |
| #define TYPHOON_CCHIP_MPR3 0x04c0 |
| #define TYPHOON_CCHIP_TTR 0x0580 |
| #define TYPHOON_CCHIP_TDR 0x05c0 |
| #define TYPHOON_CCHIP_DIM2 0x0600 |
| #define TYPHOON_CCHIP_DIM3 0x0640 |
| #define TYPHOON_CCHIP_DIR2 0x0680 |
| #define TYPHOON_CCHIP_DIR3 0x06c0 |
| #define TYPHOON_CCHIP_IIC2 0x0700 |
| #define TYPHOON_CCHIP_IIC3 0x0740 |
| #define TYPHOON_CCHIP_PWR 0x0780 |
| #define TYPHOON_CCHIP_CMONCTLA 0x0c00 |
| #define TYPHOON_CCHIP_CMONCTLB 0x0c40 |
| #define TYPHOON_CCHIP_CMONCNT01 0x0c80 |
| #define TYPHOON_CCHIP_CMONCNT23 0x0cc0 |
| |
| /* DCHIP REGISTERS */ |
| |
| #define TYPHOON_DCHIP 0x1b0000000 |
| |
| #define TYPHOON_DCHIP_DSC 0x0800 |
| #define TYPHOON_DCHIP_STR 0x0840 |
| #define TYPHOON_DCHIP_DREV 0x0880 |
| #define TYPHOON_DCHIP_DSC2 0x08c0 |
| |
| /* PCHIP REGISTERS */ |
| |
| #define TYPHOON_PCHIP0 0x180000000 |
| #define TYPHOON_PCHIP1 0x380000000 |
| |
| #define TYPHOON_PCHIP_WSBA0 0x0000 |
| #define TYPHOON_PCHIP_WSBA1 0x0040 |
| #define TYPHOON_PCHIP_WSBA2 0x0080 |
| #define TYPHOON_PCHIP_WSBA3 0x00c0 |
| #define TYPHOON_PCHIP_WSM0 0x0100 |
| #define TYPHOON_PCHIP_WSM1 0x0140 |
| #define TYPHOON_PCHIP_WSM2 0x0180 |
| #define TYPHOON_PCHIP_WSM3 0x01c0 |
| #define TYPHOON_PCHIP_TBA0 0x0200 |
| #define TYPHOON_PCHIP_TBA1 0x0240 |
| #define TYPHOON_PCHIP_TBA2 0x0280 |
| #define TYPHOON_PCHIP_TBA3 0x02c0 |
| #define TYPHOON_PCHIP_PCTL 0x0300 |
| #define TYPHOON_PCHIP_PLAT 0x0340 |
| #define TYPHOON_PCHIP_PERROR 0x03c0 |
| #define TYPHOON_PCHIP_PERRMASK 0x0400 |
| #define TYPHOON_PCHIP_PERRSET 0x0440 |
| #define TYPHOON_PCHIP_TLBIV 0x0480 |
| #define TYPHOON_PCHIP_TLBIA 0x04c0 |
| #define TYPHOON_PCHIP_PMONCTL 0x0500 |
| #define TYPHOON_PCHIP_PMONCNT 0x0540 |
| #define TYPHOON_PCHIP_SPRST 0x0800 |
| |
| /* PCI ADDRESSES */ |
| |
| #define TYPHOON_PCHIP0_PCI_MEM 0 |
| #define TYPHOON_PCHIP0_PCI_IO 0x1fc000000 |
| #define TYPHOON_PCHIP0_PCI_CONF 0x1fe000000 |
| #define TYPHOON_PCHIP0_PCI_IACK 0x1f8000000 |
| |
| #ifdef __ASSEMBLER__ |
| |
| #include "pal.h" |
| |
| #define ptCpuDIR ptSys0 |
| #define ptCpuIIC ptSys1 |
| |
| /* Unfortunately, GAS doesn't attempt any interesting constructions of |
| 64-bit constants, dropping them all into the .lit8 section. It is |
| better for us to build these by hand. */ |
| .macro LOAD_PHYS_CCHIP ret |
| lda \ret, (PIO_PHYS_ADDR + TYPHOON_CCHIP) >> 29 |
| sll \ret, 29, \ret |
| .endm |
| |
| .macro LOAD_PHYS_PCHIP0 ret |
| lda \ret, (PIO_PHYS_ADDR + TYPHOON_PCHIP0) >> 29 |
| sll \ret, 29, \ret |
| .endm |
| |
| .macro LOAD_PHYS_PCHIP0_IACK ret |
| .set macro |
| lda \ret, (PIO_PHYS_ADDR + TYPHOON_PCHIP0_PCI_IACK) >> 24 |
| .set nomacro |
| sll \ret, 24, \ret |
| .endm |
| |
| .macro LOAD_KSEG_PCI_IO ret |
| .set macro |
| // Note that GAS shifts are logical. Force arithmetic shift style |
| // results by negating before and after the shift. |
| lda \ret, -(-(PIO_KSEG_ADDR + TYPHOON_PCHIP0_PCI_IO) >> 20) |
| .set nomacro |
| sll \ret, 20, \ret |
| .endm |
| |
| .macro LOAD_KSEG_PCI_CONF ret |
| .set macro |
| // Note that GAS shifts are logical. Force arithmetic shift style |
| // results by negating before and after the shift. |
| lda \ret, -(-(PIO_KSEG_ADDR + TYPHOON_PCHIP0_PCI_CONF) >> 20) |
| .set nomacro |
| sll \ret, 20, \ret |
| .endm |
| |
| .macro SYS_WHAMI ret |
| LOAD_PHYS_CCHIP \ret |
| ldq_p \ret, TYPHOON_CCHIP_MISC(\ret) |
| and \ret, 3, \ret |
| .endm |
| |
| /* ACK the Interprocessor Interrupt. */ |
| .macro SYS_ACK_SMP t0, t1, t2 |
| LOAD_PHYS_CCHIP \t0 |
| ldq_p \t1, TYPHOON_CCHIP_MISC(\t0) |
| and \t1, 3, \t1 |
| addq \t1, 8, \t1 |
| lda \t2, 1 |
| sll \t2, \t1, \t2 |
| stq_p \t2, TYPHOON_CCHIP_MISC(\t0) |
| .endm |
| |
| /* ACK the Clock Interrupt. */ |
| .macro SYS_ACK_CLK t0, t1, t2 |
| LOAD_PHYS_CCHIP \t0 |
| ldq_p \t1, TYPHOON_CCHIP_MISC(\t0) |
| and \t1, 3, \t1 |
| addq \t1, 4, \t1 |
| lda \t2, 1 |
| sll \t2, \t1, \t2 |
| stq_p \t2, TYPHOON_CCHIP_MISC(\t0) |
| .endm |
| |
| /* Interrupt another CPU. */ |
| .macro SYS_WRIPIR target, t0, t1, t2 |
| LOAD_PHYS_CCHIP \t0 |
| mov 1, \t1 |
| and \target, 3, \t2 |
| addq \t2, 12, \t2 |
| sll \t1, \t2, \t1 |
| stq_p \t1, TYPHOON_CCHIP_MISC(\t0) |
| .endm |
| |
| #endif /* ASSEMBLER */ |
| #endif /* TYPHOON_H */ |