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