xref: /openbsd/sys/arch/mips64/include/loongson3.h (revision 4cfece93)
1 /*	$OpenBSD: loongson3.h,v 1.3 2017/05/10 16:04:21 visa Exp $	*/
2 
3 /*
4  * Copyright (c) 2016 Visa Hankala
5  *
6  * Permission to use, copy, modify, and distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 #ifndef _MIPS64_LOONGSON3_H_
20 #define _MIPS64_LOONGSON3_H_
21 
22 /*
23  * Definitions for Loongson 3A.
24  */
25 
26 #define LS3_CFG_BASE(node)		(0x100000004000ull*(node) + 0x3ff00000)
27 #define LS3_MEM_BASE(node)		(0x100000000000ull*(node))
28 
29 #define LS3_IPI_BASE(n, c)		(LS3_CFG_BASE(n) + 0x1000 + 0x100*(c))
30 #define LS3_IPI_ISR			0x00
31 #define LS3_IPI_IMR			0x04
32 #define LS3_IPI_SET			0x08
33 #define LS3_IPI_CLEAR			0x0c
34 #define LS3_IPI_MBOX0			0x20
35 #define LS3_IPI_MBOX1			0x28
36 #define LS3_IPI_MBOX2			0x30
37 #define LS3_IPI_MBOX3			0x38
38 
39 static inline uint32_t
40 loongson3_get_cpuid(void)
41 {
42 	uint32_t tmp;
43 
44 	asm volatile (
45 	"	.set push\n"
46 	"	.set mips64\n"
47 	"	mfc0 %0, $15, 1\n"	/* EBase */
48 	"	.set pop\n"
49 	: "=r" (tmp));
50 
51 	return tmp & 0xf;
52 }
53 
54 #define LS3_COREID(cpuid) ((cpuid) & 3)
55 #define LS3_NODEID(cpuid) ((cpuid) >> 2)
56 
57 /*
58  * Interrupt router registers
59  */
60 
61 #define LS3_IRT_ENTRY(node, irq)	(LS3_CFG_BASE(node) + 0x1400 + (irq))
62 #define LS3_IRT_INTISR(node)		(LS3_CFG_BASE(node) + 0x1420)
63 #define LS3_IRT_INTEN(node)		(LS3_CFG_BASE(node) + 0x1424)
64 #define LS3_IRT_INTENSET(node)		(LS3_CFG_BASE(node) + 0x1428)
65 #define LS3_IRT_INTENCLR(node)		(LS3_CFG_BASE(node) + 0x142c)
66 #define LS3_IRT_INTISR_CORE(node, cpu)	(LS3_CFG_BASE(node) + 0x1440 + (cpu)*8)
67 
68 /* sys int 0-3 */
69 #define LS3_IRT_ENTRY_INT(node, x)	LS3_IRT_ENTRY((node), (x))
70 /* PCI int 0-3 */
71 #define LS3_IRT_ENTRY_PCI(node, x)	LS3_IRT_ENTRY((node), 0x04+(x))
72 /* LPC int */
73 #define LS3_IRT_ENTRY_LPC(node)		LS3_IRT_ENTRY((node), 0x0a)
74 /* HT0 int 0-7 */
75 #define LS3_IRT_ENTRY_HT0(node, x)	LS3_IRT_ENTRY((node), 0x10+(x))
76 /* HT1 int 0-7 */
77 #define LS3_IRT_ENTRY_HT1(node, x)	LS3_IRT_ENTRY((node), 0x18+(x))
78 
79 #define LS3_IRT_ROUTE(core, intr)	((0x01 << (core)) | (0x10 << (intr)))
80 
81 #define LS3_IRQ_INT(x)			(x)		/* sys int 0-3 */
82 #define LS3_IRQ_PCI(x)			((x) + 0x04)	/* PCI int 0-3 */
83 #define LS3_IRQ_LPC			0x0a		/* LPC int */
84 #define LS3_IRQ_HT0(x)			((x) + 0x10)	/* HT0 int 0-7 */
85 #define LS3_IRQ_HT1(x)			((x) + 0x18)	/* HT1 int 0-7 */
86 #define LS3_IRQ_NUM			32
87 
88 #define LS3_IRQ_IS_HT(irq)		((irq) >= 0x10)
89 
90 #define LS3_IRQ_HT_MASK			0xffff0000u
91 
92 /*
93  * Number of HyperTransport interrupt vectors. In reality, each HT interface
94  * has 256 vectors, but the interrupt code uses only a subset of them.
95  */
96 #define LS3_HT_IRQ_NUM			32
97 
98 /*
99  * HyperTransport registers
100  */
101 
102 #define LS3_HT1_MEM_BASE(n)		(LS3_MEM_BASE(n)+0x00000e0000000000ull)
103 #define LS3_HT1_CFG_BASE(n)		(LS3_MEM_BASE(n)+0x00000efdfb000000ull)
104 
105 #define LS3_HT_ISR_OFFSET(x)		(0x80 + (x) * 4)
106 #define LS3_HT_IMR_OFFSET(x)		(0xa0 + (x) * 4)
107 
108 #endif	/* _MIPS64_LOONGSON3_H_ */
109