xref: /netbsd-src/sys/arch/mips/rmi/rmixlvar.h (revision 56d2939512f1e0840ea0c8437370d39c9d395bd6)
1*56d29395Smrg /*	$NetBSD: rmixlvar.h,v 1.7 2014/03/11 08:19:45 mrg Exp $	*/
2290a34a0Smatt 
3290a34a0Smatt /*
4290a34a0Smatt  * Copyright 2002 Wasabi Systems, Inc.
5290a34a0Smatt  * All rights reserved.
6290a34a0Smatt  *
7290a34a0Smatt  * Written by Simon Burge for Wasabi Systems, Inc.
8290a34a0Smatt  *
9290a34a0Smatt  * Redistribution and use in source and binary forms, with or without
10290a34a0Smatt  * modification, are permitted provided that the following conditions
11290a34a0Smatt  * are met:
12290a34a0Smatt  * 1. Redistributions of source code must retain the above copyright
13290a34a0Smatt  *    notice, this list of conditions and the following disclaimer.
14290a34a0Smatt  * 2. Redistributions in binary form must reproduce the above copyright
15290a34a0Smatt  *    notice, this list of conditions and the following disclaimer in the
16290a34a0Smatt  *    documentation and/or other materials provided with the distribution.
17290a34a0Smatt  * 3. All advertising materials mentioning features or use of this software
18290a34a0Smatt  *    must display the following acknowledgement:
19290a34a0Smatt  *      This product includes software developed for the NetBSD Project by
20290a34a0Smatt  *      Wasabi Systems, Inc.
21290a34a0Smatt  * 4. The name of Wasabi Systems, Inc. may not be used to endorse
22290a34a0Smatt  *    or promote products derived from this software without specific prior
23290a34a0Smatt  *    written permission.
24290a34a0Smatt  *
25290a34a0Smatt  * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
26290a34a0Smatt  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
27290a34a0Smatt  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28290a34a0Smatt  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL WASABI SYSTEMS, INC
29290a34a0Smatt  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
30290a34a0Smatt  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
31290a34a0Smatt  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32290a34a0Smatt  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
33290a34a0Smatt  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34290a34a0Smatt  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35290a34a0Smatt  * POSSIBILITY OF SUCH DAMAGE.
36290a34a0Smatt  */
37290a34a0Smatt 
38290a34a0Smatt #ifndef _MIPS_RMI_RMIXLVAR_H_
39290a34a0Smatt #define _MIPS_RMI_RMIXLVAR_H_
40290a34a0Smatt 
41290a34a0Smatt #include <mips/cpu.h>
423e67b512Smatt #include <mips/locore.h>
433e67b512Smatt #include <mips/rmi/rmixl_firmware.h>
443e67b512Smatt 
45cf10107dSdyoung #include <sys/bus.h>
46290a34a0Smatt 
473e67b512Smatt #include <dev/pci/pcivar.h>
483e67b512Smatt 
493e67b512Smatt extern void rmixl_pcr_init_core(void);
503e67b512Smatt 
51290a34a0Smatt static inline bool
cpu_rmixl(const struct pridtab * ct)52290a34a0Smatt cpu_rmixl(const struct pridtab *ct)
53290a34a0Smatt {
54290a34a0Smatt 	if (ct->cpu_cid == MIPS_PRID_CID_RMI)
55290a34a0Smatt 		return true;
56290a34a0Smatt 	return false;
57290a34a0Smatt }
58290a34a0Smatt 
59290a34a0Smatt static inline bool
cpu_rmixlr(const struct pridtab * ct)60290a34a0Smatt cpu_rmixlr(const struct pridtab *ct)
61290a34a0Smatt {
62290a34a0Smatt 	u_int type = ct->cpu_cidflags & MIPS_CIDFL_RMI_TYPE;
63290a34a0Smatt 	if (cpu_rmixl(ct) && type == CIDFL_RMI_TYPE_XLR)
64290a34a0Smatt 		return true;
65290a34a0Smatt 	return false;
66290a34a0Smatt }
67290a34a0Smatt 
68290a34a0Smatt static inline bool
cpu_rmixls(const struct pridtab * ct)69290a34a0Smatt cpu_rmixls(const struct pridtab *ct)
70290a34a0Smatt {
71290a34a0Smatt 	u_int type = ct->cpu_cidflags & MIPS_CIDFL_RMI_TYPE;
72290a34a0Smatt 	if (cpu_rmixl(ct) && type == CIDFL_RMI_TYPE_XLS)
73290a34a0Smatt 		return true;
74290a34a0Smatt 	return false;
75290a34a0Smatt }
76290a34a0Smatt 
77290a34a0Smatt static inline bool
cpu_rmixlp(const struct pridtab * ct)78290a34a0Smatt cpu_rmixlp(const struct pridtab *ct)
79290a34a0Smatt {
80290a34a0Smatt 	u_int type = ct->cpu_cidflags & MIPS_CIDFL_RMI_TYPE;
81290a34a0Smatt 	if (cpu_rmixl(ct) && type == CIDFL_RMI_TYPE_XLP)
82290a34a0Smatt 		return true;
83290a34a0Smatt 	return false;
84290a34a0Smatt }
85290a34a0Smatt 
863e67b512Smatt static inline int
cpu_rmixl_chip_type(const struct pridtab * ct)873e67b512Smatt cpu_rmixl_chip_type(const struct pridtab *ct)
883e67b512Smatt {
893e67b512Smatt 	return ct->cpu_cidflags & MIPS_CIDFL_RMI_TYPE;
903e67b512Smatt }
91290a34a0Smatt 
92290a34a0Smatt typedef enum {
933e67b512Smatt 	PSB_TYPE_UNKNOWN=0,
943e67b512Smatt 	PSB_TYPE_RMI,
953e67b512Smatt 	PSB_TYPE_DELL,
963e67b512Smatt } rmixlfw_psb_type_t;
97290a34a0Smatt 
983e67b512Smatt static inline const char *
rmixlfw_psb_type_name(rmixlfw_psb_type_t type)993e67b512Smatt rmixlfw_psb_type_name(rmixlfw_psb_type_t type)
1003e67b512Smatt {
1013e67b512Smatt 	switch(type) {
1023e67b512Smatt 	case PSB_TYPE_UNKNOWN:
1033e67b512Smatt 		return "unknown";
1043e67b512Smatt 	case PSB_TYPE_RMI:
1053e67b512Smatt 		return "RMI";
1063e67b512Smatt 	case PSB_TYPE_DELL:
1073e67b512Smatt 		return "DELL";
1083e67b512Smatt 	default:
1093e67b512Smatt 		return "undefined";
1103e67b512Smatt 	}
1113e67b512Smatt }
112290a34a0Smatt 
113290a34a0Smatt struct rmixl_config {
114290a34a0Smatt 	uint64_t		 rc_io_pbase;
115aa20fcddScliff 	uint64_t		 rc_flash_pbase;	/* FLASH_BAR */
116aa20fcddScliff 	uint64_t		 rc_flash_mask;		/* FLASH_BAR */
1173e67b512Smatt 	bus_addr_t		 rc_pci_cfg_pbase;
1183e67b512Smatt 	bus_size_t		 rc_pci_cfg_size;
1193e67b512Smatt 	bus_addr_t		 rc_pci_ecfg_pbase;
1203e67b512Smatt 	bus_size_t		 rc_pci_ecfg_size;
121290a34a0Smatt 	bus_addr_t		 rc_pci_mem_pbase;
122290a34a0Smatt 	bus_size_t		 rc_pci_mem_size;
123290a34a0Smatt 	bus_addr_t		 rc_pci_io_pbase;
124290a34a0Smatt 	bus_size_t		 rc_pci_io_size;
1253e67b512Smatt 	struct mips_bus_space	 rc_obio_eb_memt; 	/* DEVIO -eb */
1263e67b512Smatt 	struct mips_bus_space	 rc_obio_el_memt; 	/* DEVIO -el */
127aa20fcddScliff 	struct mips_bus_space	 rc_iobus_memt; 	/* Peripherals IO Bus */
1283e67b512Smatt 	struct mips_bus_space	 rc_pci_cfg_memt; 	/* PCI CFG  */
1293e67b512Smatt 	struct mips_bus_space	 rc_pci_ecfg_memt; 	/* PCI ECFG */
130290a34a0Smatt 	struct mips_bus_space	 rc_pci_memt; 		/* PCI MEM */
131290a34a0Smatt 	struct mips_bus_space	 rc_pci_iot; 		/* PCI IO  */
1323e67b512Smatt 	struct mips_bus_dma_tag	 rc_dma_tag;
1333e67b512Smatt 	bus_dma_tag_t		 rc_64bit_dmat;
1343e67b512Smatt 	bus_dma_tag_t		 rc_32bit_dmat;
1353e67b512Smatt 	bus_dma_tag_t		 rc_29bit_dmat;
136290a34a0Smatt 	struct extent		*rc_phys_ex;	/* Note: MB units */
1373e67b512Smatt 	struct extent		*rc_obio_eb_ex;
1383e67b512Smatt 	struct extent		*rc_obio_el_ex;
139aa20fcddScliff 	struct extent		*rc_iobus_ex;
1403e67b512Smatt 	struct extent		*rc_pci_cfg_ex;
1413e67b512Smatt 	struct extent		*rc_pci_ecfg_ex;
1423e67b512Smatt 	struct extent		*rc_pci_mem_ex;
1433e67b512Smatt 	struct extent		*rc_pci_io_ex;
144290a34a0Smatt 	int			 rc_mallocsafe;
1453e67b512Smatt 	rmixlfw_info_t 		 rc_psb_info;
1463e67b512Smatt 	rmixlfw_psb_type_t	 rc_psb_type;
1473e67b512Smatt 	volatile struct rmixlfw_cpu_wakeup_info
1483e67b512Smatt 				*rc_cpu_wakeup_info;
1493e67b512Smatt 	const void		*rc_cpu_wakeup_end;
150290a34a0Smatt };
151290a34a0Smatt 
152290a34a0Smatt extern struct rmixl_config rmixl_configuration;
153290a34a0Smatt 
1543e67b512Smatt extern void rmixl_obio_eb_bus_mem_init(bus_space_tag_t, void *);
1553e67b512Smatt extern void rmixl_obio_el_bus_mem_init(bus_space_tag_t, void *);
156aa20fcddScliff extern void rmixl_iobus_bus_mem_init(bus_space_tag_t, void *);
1573e67b512Smatt extern void rmixl_pci_cfg_bus_mem_init(bus_space_tag_t, void *);
1583e67b512Smatt extern void rmixl_pci_ecfg_bus_mem_init(bus_space_tag_t, void *);
1593e67b512Smatt extern void rmixl_pci_bus_mem_init(bus_space_tag_t, void *);
1603e67b512Smatt extern void rmixl_pci_bus_io_init(bus_space_tag_t, void *);
161290a34a0Smatt 
162290a34a0Smatt extern void rmixl_addr_error_init(void);
163290a34a0Smatt extern int  rmixl_addr_error_check(void);
164290a34a0Smatt 
165290a34a0Smatt extern uint64_t rmixl_mfcr(u_int);
166290a34a0Smatt extern void rmixl_mtcr(uint64_t, u_int);
1679f7dc766Scliff extern void rmixl_eirr_ack(uint64_t, uint64_t, uint64_t);
168290a34a0Smatt 
1693e67b512Smatt 
1703e67b512Smatt /*
1713e67b512Smatt  * rmixl_cache_err_dis:
1723e67b512Smatt  * - disable Cache, Data ECC, Snoop Tag Parity, Tag Parity errors
1733e67b512Smatt  * - clear the cache error log
1743e67b512Smatt  * - return previous value from RMIXL_PCR_L1D_CONFIG0
1753e67b512Smatt  */
1763e67b512Smatt static inline uint64_t
rmixl_cache_err_dis(void)1773e67b512Smatt rmixl_cache_err_dis(void)
1783e67b512Smatt {
1793e67b512Smatt 	uint64_t r;
1803e67b512Smatt 
1813e67b512Smatt 	r = rmixl_mfcr(RMIXL_PCR_L1D_CONFIG0);
1823e67b512Smatt 	rmixl_mtcr(RMIXL_PCR_L1D_CONFIG0, r & ~0x2e);
1833e67b512Smatt 	rmixl_mtcr(RMIXL_PCR_L1D_CACHE_ERROR_LOG, 0);
1843e67b512Smatt 	return r;
1853e67b512Smatt }
1863e67b512Smatt 
1873e67b512Smatt /*
1883e67b512Smatt  * rmixl_cache_err_restore:
1893e67b512Smatt  * - clear the cache error log, cache error overflow log,
1903e67b512Smatt  *   and cache interrupt registers
1913e67b512Smatt  * - restore previous value to RMIXL_PCR_L1D_CONFIG0
1923e67b512Smatt  */
1933e67b512Smatt static inline void
rmixl_cache_err_restore(uint64_t r)1943e67b512Smatt rmixl_cache_err_restore(uint64_t r)
1953e67b512Smatt {
1963e67b512Smatt 	rmixl_mtcr(RMIXL_PCR_L1D_CACHE_ERROR_LOG, 0);
1973e67b512Smatt 	rmixl_mtcr(RMIXL_PCR_L1D_CACHE_ERROR_OVF_LO, 0);
1983e67b512Smatt 	rmixl_mtcr(RMIXL_PCR_L1D_CACHE_INTERRUPT, 0);
1993e67b512Smatt 	rmixl_mtcr(RMIXL_PCR_L1D_CONFIG0, r);
2003e67b512Smatt }
2013e67b512Smatt 
2023e67b512Smatt static inline uint64_t
rmixl_cache_err_check(void)2033e67b512Smatt rmixl_cache_err_check(void)
2043e67b512Smatt {
2053e67b512Smatt 	return rmixl_mfcr(RMIXL_PCR_L1D_CACHE_ERROR_LOG);
2063e67b512Smatt }
2073e67b512Smatt 
2083e67b512Smatt static inline int
rmixl_probe_4(volatile uint32_t * va)2093e67b512Smatt rmixl_probe_4(volatile uint32_t *va)
2103e67b512Smatt {
2113e67b512Smatt 	uint32_t r;
2123e67b512Smatt 	int err;
2133e67b512Smatt 	int s;
2143e67b512Smatt 
2153e67b512Smatt 	s = splhigh();
2163e67b512Smatt 	r = rmixl_cache_err_dis();
217*56d29395Smrg 	(void)*va;			/* probe */
2183e67b512Smatt 	err = rmixl_cache_err_check();
2193e67b512Smatt 	rmixl_cache_err_restore(r);
2203e67b512Smatt 	splx(s);
2213e67b512Smatt 
2223e67b512Smatt 	return (err == 0);
2233e67b512Smatt }
2243e67b512Smatt 
225290a34a0Smatt #endif	/* _MIPS_RMI_RMIXLVAR_H_ */
226