/* PALcode and C runtime functions for the CLIPPER system emulation.

   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/>.  */

#include "pal.h"
#include SYSTEM_H

/*
 * Sys_Setup
 *
 * Do any system specific setup necessary.
 *
 * INPUT PARAMETERS
 *
 *	a0 = whami
 *	p7 = return address
 */
	.globl	Sys_Setup
	.ent	Sys_Setup
Sys_Setup:
	.frame	$sp, 0, p7, 0
	LOAD_PHYS_CCHIP	t0
	lda		t0, TYPHOON_CCHIP_DIR0(t0)
	// DIR[23] differ from DIR[01] by 0x400
	// DIR[13] differ from DIR[02] by 0x40
	and		a0, 2, t4
	and		a0, 1, t3
	sll		t4, 9, t4
	sll		t3, 6, t3
	addq		t0, t4, t0
	addq		t0, t3, t0
	// IIC[0-4] differ from DIR[0-4] by 0x100
	lda		t2, 0x100(t0)
	mtpr		t0, ptCpuDIR
	mtpr		t2, ptCpuIIC
	ret
	.end	Sys_Setup

/*
 * Sys_Dev_Vector
 *
 * Load the SRM interrupt vector for the system.
 *
 * INPUT PARAMETERS
 *
 *	p7 = return address
 *
 * OUTPUT PARAMETERS
 *
 *	a1 = interrupt vector
 */

	.globl	Sys_Dev_Vector
	.ent	Sys_Dev_Vector
Sys_Dev_Vector:
	.frame	$sp, 0, p7, 0
	mfpr	a1, ptCpuDIR		// Load int mask for this CPU
	ldq_p	a1, 0(a1)
	beq	a1, CallPal_Rti		// No interrupts asserted?

	cttz	a1, a1			// Find the first asserted interrupt.

	cmpeq	a1, 55, a0		// Is this an ISA interrupt?
	addq	a1, 16, a1		// PCI interrupt numbers start at 16
	beq	a0, 1f

	LOAD_PHYS_PCHIP0_IACK a1	// IACK results in the ISA irq
	ldl_p	a1, 0(a1)

1:	sll	a1, 4, a1
	lda	a1, 0x800(a1)
	ret	$31, (p7), 0
	.end Sys_Dev_Vector

/*
 * Cserve_Ena
 *
 * Unmask a PCI interrupt
 */
	.globl	Cserve_Ena
Cserve_Ena:
	// FIXME
	hw_rei
ENDFN	Cserve_Ena

/*
 * Cserve_Dis
 *
 * Mask a PCI interrupt
 */
	.globl	Cserve_Dis
Cserve_Dis:
	// FIXME
	hw_rei
ENDFN	Cserve_Dis

/*
 * PCI parameters
 */

	.section .sdata

	.align	3
	.globl	pci_io_base
	.type	pci_io_base, @object
	.size	pci_io_base, 8
pci_io_base:
	.quad	PIO_KSEG_ADDR + TYPHOON_PCHIP0_PCI_IO

	.globl	pci_conf_base
	.type	pci_conf_base, @object
	.size	pci_conf_base, 8
pci_conf_base:
	.quad	PIO_KSEG_ADDR + TYPHOON_PCHIP0_PCI_CONF

	.align	3
	.globl	pci_mem_base
	.type	pci_mem_base, @object
	.size	pci_mem_base, 8
pci_mem_base:
	.quad	PIO_KSEG_ADDR + TYPHOON_PCHIP0_PCI_MEM

