/*	$OpenBSD: octeonreg.h,v 1.11 2020/07/11 15:18:08 visa Exp $	*/

/*
 * Copyright (c) 2003-2004 Opsycon AB (www.opsycon.com).
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 */

#ifndef _MACHINE_OCTEONREG_H_
#define _MACHINE_OCTEONREG_H_

#define OCTEON_CF_BASE		0x1D000800ULL
#define OCTEON_CIU3_BASE	0x1010000000000ULL
#define OCTEON_CIU_BASE		0x1070000000000ULL
#define OCTEON_CIU_SIZE		0x7000
#define OCTEON_MIO_BOOT_BASE	0x1180000000000ULL
#define OCTEON_UART0_BASE	0x1180000000800ULL
#define OCTEON_UART1_BASE	0x1180000000C00ULL
#define OCTEON_RNG_BASE		0x1400000000000ULL
#define OCTEON_AMDCF_BASE	0x1dc00000ULL

#define MIO_BOOT_REG_CFG0	0x0
#define MIO_BOOT_REG_CFG(x)	(MIO_BOOT_REG_CFG0+((x)*8))
#define BOOT_CFG_BASE_MASK	0xFFFF
#define BOOT_CFG_BASE_SHIFT	16
#define BOOT_CFG_WIDTH_MASK	0x10000000
#define BOOT_CFG_WIDTH_SHIFT	28

#define CIU_INT_WORKQ0		0
#define CIU_INT_WORKQ1		1
#define CIU_INT_WORKQ2		2
#define CIU_INT_WORKQ3		3
#define CIU_INT_WORKQ4		4
#define CIU_INT_WORKQ5		5
#define CIU_INT_WORKQ6		6
#define CIU_INT_WORKQ7		7
#define CIU_INT_WORKQ8		8
#define CIU_INT_WORKQ9		9
#define CIU_INT_WORKQ10		10
#define CIU_INT_WORKQ11		11
#define CIU_INT_WORKQ12		12
#define CIU_INT_WORKQ13		13
#define CIU_INT_WORKQ14		14
#define CIU_INT_WORKQ15		15
#define CIU_INT_GPIO0		16
#define CIU_INT_GPIO1		17
#define CIU_INT_GPIO2		18
#define CIU_INT_GPIO3		19
#define CIU_INT_GPIO4		20
#define CIU_INT_GPIO5		21
#define CIU_INT_GPIO6		22
#define CIU_INT_GPIO7		23
#define CIU_INT_GPIO8		24
#define CIU_INT_GPIO9		25
#define CIU_INT_GPIO10		26
#define CIU_INT_GPIO11		27
#define CIU_INT_GPIO12		28
#define CIU_INT_GPIO13		29
#define CIU_INT_GPIO14		30
#define CIU_INT_GPIO15		31
#define CIU_INT_MBOX0		32
#define CIU_INT_MBOX1		33
#define CIU_INT_MBOX(x)		(CIU_INT_MBOX0+(x))
#define CIU_INT_UART0		34
#define CIU_INT_UART1		35
#define CIU_INT_PCI_INTA	36
#define CIU_INT_PCI_INTB	37
#define CIU_INT_PCI_INTC	38
#define CIU_INT_PCI_INTD	39
#define CIU_INT_PCI_MSIA	40
#define CIU_INT_PCI_MSIB	41
#define CIU_INT_PCI_MSIC	42
#define CIU_INT_PCI_MSID	43
#define CIU_INT_44		44
#define CIU_INT_TWSI		45
#define CIU_INT_RML		46
#define CIU_INT_TRACE		47
#define CIU_INT_GMX_DRP0	48
#define CIU_INT_GMX_DRP1        49
#define CIU_INT_IPD_DRP		50
#define CIU_INT_KEY_ZERO	51
#define CIU_INT_TIMER0		52
#define CIU_INT_TIMER1		53
#define CIU_INT_TIMER2		54
#define CIU_INT_TIMER3		55
#define CIU_INT_USB		56
#define CIU_INT_PCM		57
#define CIU_INT_MPI		58
#define CIU_INT_TWSI2		59
#define CIU_INT_POWIQ		60
#define CIU_INT_IPDPPTHR	61
#define CIU_INT_MII0		62
#define CIU_INT_BOOTDMA		63

#define CIU_INT0_SUM0		0x00000000
#define CIU_INT1_SUM0		0x00000008
#define CIU_INT2_SUM0		0x00000010
#define CIU_INT3_SUM0		0x00000018
#define CIU_IP2_SUM0(x)		(CIU_INT0_SUM0+(0x10 * (x)))
#define CIU_IP3_SUM0(x)		(CIU_INT1_SUM0+(0x10 * (x)))
#define CIU_INT32_SUM0		0x00000100
#define CIU_INT32_SUM1		0x00000108
#define CIU_INT0_EN0		0x00000200
#define CIU_INT1_EN0		0x00000210
#define CIU_INT2_EN0		0x00000220
#define CIU_INT3_EN0		0x00000230
#define CIU_IP2_EN0(x)		(CIU_INT0_EN0+(0x20 * (x)))
#define CIU_IP3_EN0(x)		(CIU_INT1_EN0+(0x20 * (x)))
#define CIU_INT32_EN0		0x00000400
#define CIU_INT0_EN1		0x00000208
#define CIU_INT1_EN1		0x00000218
#define CIU_INT2_EN1		0x00000228
#define CIU_INT3_EN1		0x00000238
#define CIU_INT32_EN1		0x00000408
#define CIU_IP2_EN1(x)		(CIU_INT0_EN1+(0x20 * (x)))
#define CIU_IP3_EN1(x)		(CIU_INT1_EN1+(0x20 * (x)))
#define CIU_TIM0                0x00000480
#define CIU_TIM1                0x00000488
#define CIU_TIM2                0x00000490
#define CIU_TIM3                0x00000498
#define CIU_WDOG0               0x00000500
#define CIU_WDOG1               0x00000508
#define CIU_PP_POKE0            0x00000580
#define CIU_PP_POKE1            0x00000588
#define CIU_MBOX_SET0           0x00000600
#define CIU_MBOX_SET1           0x00000608
#define CIU_MBOX_SET(x)		(CIU_MBOX_SET0+(0x08 * (x)))
#define CIU_MBOX_CLR0           0x00000680
#define CIU_MBOX_CLR1           0x00000688
#define CIU_MBOX_CLR(x)		(CIU_MBOX_CLR0+(0x08 * (x)))
#define CIU_PP_RST              0x00000700
#define CIU_PP_DBG              0x00000708
#define CIU_GSTOP               0x00000710
#define CIU_NMI                 0x00000718
#define CIU_DINT                0x00000720
#define CIU_FUSE                0x00000728
#define CIU_BIST                0x00000730
#define CIU_SOFT_BIST           0x00000738
#define CIU_SOFT_RST            0x00000740
#define CIU_SOFT_PRST           0x00000748
#define CIU_PCI_INTA            0x00000750
#define CIU_INT0_SUM4           0x00000C00
#define CIU_INT1_SUM4           0x00000C08
#define CIU_INT0_EN4_0          0x00000C80
#define CIU_INT1_EN4_0          0x00000C90
#define CIU_INT0_EN4_1          0x00000C88
#define CIU_INT1_EN4_1          0x00000C98
#define CIU_IP4_SUM2(x)		(0x00008c00 + 8 * (x))
#define CIU_IP4_EN2(x)		(0x0000a400 + 8 * (x))

#define CIU3_FUSE		0x000001a0

#define FPA3_CLK_COUNT		0x12800000000f0ULL

/* OCTEON II */
#define MIO_RST_BOOT		0x1180000001600ULL
#define MIO_RST_BOOT_C_MUL_SHIFT	30
#define MIO_RST_BOOT_C_MUL_MASK		0x7f
#define MIO_RST_BOOT_PNR_MUL_SHIFT	24
#define MIO_RST_BOOT_PNR_MUL_MASK	0x3f

#define MIO_RST_CTL(x)		(0x1180000001618ULL + 8 * (x))
#define MIO_RST_CTL_PRTMODE		0x0000000000000030ULL

/* OCTEON III */
#define RST_BOOT		0x1180006001600ULL
#define RST_BOOT_C_MUL_SHIFT		30
#define RST_BOOT_C_MUL_MASK		0x7f
#define RST_BOOT_PNR_MUL_SHIFT		24
#define RST_BOOT_PNR_MUL_MASK		0x3f
#define RST_CTL(x)		(0x1180006001640ULL + 8 * (x))
#define RST_CTL_RST_DONE		0x0000000000000100ULL
#define RST_CTL_HOST_MODE		0x0000000000000040ULL
#define RST_SOFT_RST		0x1180006001680ULL

#define OCTEON_IO_REF_CLOCK	50000000	/* 50MHz */

#endif /* !_MACHINE_OCTEONREG_H_ */