Home | History | Annotate | Line # | Download | only in rmi
rmixlvar.h revision 1.1.2.13
      1  1.1.2.13  cliff /*	$NetBSD: rmixlvar.h,v 1.1.2.13 2010/01/29 00:22:06 cliff Exp $	*/
      2   1.1.2.1  cliff 
      3   1.1.2.1  cliff /*
      4   1.1.2.1  cliff  * Copyright 2002 Wasabi Systems, Inc.
      5   1.1.2.1  cliff  * All rights reserved.
      6   1.1.2.1  cliff  *
      7   1.1.2.1  cliff  * Written by Simon Burge for Wasabi Systems, Inc.
      8   1.1.2.1  cliff  *
      9   1.1.2.1  cliff  * Redistribution and use in source and binary forms, with or without
     10   1.1.2.1  cliff  * modification, are permitted provided that the following conditions
     11   1.1.2.1  cliff  * are met:
     12   1.1.2.1  cliff  * 1. Redistributions of source code must retain the above copyright
     13   1.1.2.1  cliff  *    notice, this list of conditions and the following disclaimer.
     14   1.1.2.1  cliff  * 2. Redistributions in binary form must reproduce the above copyright
     15   1.1.2.1  cliff  *    notice, this list of conditions and the following disclaimer in the
     16   1.1.2.1  cliff  *    documentation and/or other materials provided with the distribution.
     17   1.1.2.1  cliff  * 3. All advertising materials mentioning features or use of this software
     18   1.1.2.1  cliff  *    must display the following acknowledgement:
     19   1.1.2.1  cliff  *      This product includes software developed for the NetBSD Project by
     20   1.1.2.1  cliff  *      Wasabi Systems, Inc.
     21   1.1.2.1  cliff  * 4. The name of Wasabi Systems, Inc. may not be used to endorse
     22   1.1.2.1  cliff  *    or promote products derived from this software without specific prior
     23   1.1.2.1  cliff  *    written permission.
     24   1.1.2.1  cliff  *
     25   1.1.2.1  cliff  * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
     26   1.1.2.1  cliff  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     27   1.1.2.1  cliff  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     28   1.1.2.1  cliff  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL WASABI SYSTEMS, INC
     29   1.1.2.1  cliff  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     30   1.1.2.1  cliff  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     31   1.1.2.1  cliff  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     32   1.1.2.1  cliff  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     33   1.1.2.1  cliff  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     34   1.1.2.1  cliff  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     35   1.1.2.1  cliff  * POSSIBILITY OF SUCH DAMAGE.
     36   1.1.2.1  cliff  */
     37   1.1.2.1  cliff 
     38   1.1.2.6  cliff #ifndef _MIPS_RMI_RMIXLVAR_H_
     39   1.1.2.6  cliff #define _MIPS_RMI_RMIXLVAR_H_
     40   1.1.2.6  cliff 
     41   1.1.2.6  cliff #include <mips/cpu.h>
     42   1.1.2.1  cliff #include <dev/pci/pcivar.h>
     43   1.1.2.1  cliff #include <machine/bus.h>
     44  1.1.2.11  cliff #include <mips/rmi/rmixl_firmware.h>
     45   1.1.2.1  cliff 
     46   1.1.2.6  cliff static inline bool
     47   1.1.2.6  cliff cpu_rmixl(const struct pridtab *ct)
     48   1.1.2.6  cliff {
     49   1.1.2.6  cliff 	if (ct->cpu_cid == MIPS_PRID_CID_RMI)
     50   1.1.2.6  cliff 		return true;
     51   1.1.2.6  cliff 	return false;
     52   1.1.2.6  cliff }
     53   1.1.2.6  cliff 
     54   1.1.2.6  cliff static inline bool
     55   1.1.2.6  cliff cpu_rmixlr(const struct pridtab *ct)
     56   1.1.2.6  cliff {
     57   1.1.2.6  cliff 	u_int type = ct->cpu_cidflags & MIPS_CIDFL_RMI_TYPE;
     58   1.1.2.6  cliff 	if (cpu_rmixl(ct) && type == CIDFL_RMI_TYPE_XLR)
     59   1.1.2.6  cliff 		return true;
     60   1.1.2.6  cliff 	return false;
     61   1.1.2.6  cliff }
     62   1.1.2.6  cliff 
     63   1.1.2.6  cliff static inline bool
     64   1.1.2.6  cliff cpu_rmixls(const struct pridtab *ct)
     65   1.1.2.6  cliff {
     66   1.1.2.6  cliff 	u_int type = ct->cpu_cidflags & MIPS_CIDFL_RMI_TYPE;
     67   1.1.2.6  cliff 	if (cpu_rmixl(ct) && type == CIDFL_RMI_TYPE_XLS)
     68   1.1.2.6  cliff 		return true;
     69   1.1.2.6  cliff 	return false;
     70   1.1.2.6  cliff }
     71   1.1.2.6  cliff 
     72   1.1.2.6  cliff static inline bool
     73   1.1.2.6  cliff cpu_rmixlp(const struct pridtab *ct)
     74   1.1.2.6  cliff {
     75   1.1.2.6  cliff 	u_int type = ct->cpu_cidflags & MIPS_CIDFL_RMI_TYPE;
     76   1.1.2.6  cliff 	if (cpu_rmixl(ct) && type == CIDFL_RMI_TYPE_XLP)
     77   1.1.2.6  cliff 		return true;
     78   1.1.2.6  cliff 	return false;
     79   1.1.2.6  cliff }
     80   1.1.2.6  cliff 
     81   1.1.2.6  cliff 
     82   1.1.2.4  cliff typedef enum {
     83   1.1.2.4  cliff 	RMIXL_INTR_EDGE=0,
     84   1.1.2.4  cliff 	RMIXL_INTR_LEVEL,
     85   1.1.2.4  cliff } rmixl_intr_trigger_t;
     86   1.1.2.4  cliff 
     87   1.1.2.4  cliff typedef enum {
     88   1.1.2.4  cliff 	RMIXL_INTR_RISING=0,
     89   1.1.2.4  cliff 	RMIXL_INTR_HIGH,
     90   1.1.2.4  cliff 	RMIXL_INTR_FALLING,
     91   1.1.2.4  cliff 	RMIXL_INTR_LOW,
     92   1.1.2.4  cliff } rmixl_intr_polarity_t;
     93   1.1.2.4  cliff 
     94  1.1.2.13  cliff typedef enum {
     95  1.1.2.13  cliff 	PSB_TYPE_UNKNOWN=0,
     96  1.1.2.13  cliff 	PSB_TYPE_RMI,
     97  1.1.2.13  cliff 	PSB_TYPE_DELL,
     98  1.1.2.13  cliff } rmixlfw_psb_type_t;
     99  1.1.2.13  cliff 
    100  1.1.2.13  cliff static inline const char *
    101  1.1.2.13  cliff rmixlfw_psb_type_name(rmixlfw_psb_type_t type)
    102  1.1.2.13  cliff {
    103  1.1.2.13  cliff 	switch(type) {
    104  1.1.2.13  cliff 	case PSB_TYPE_UNKNOWN:
    105  1.1.2.13  cliff 		return "unknown";
    106  1.1.2.13  cliff 	case PSB_TYPE_RMI:
    107  1.1.2.13  cliff 		return "RMI";
    108  1.1.2.13  cliff 	case PSB_TYPE_DELL:
    109  1.1.2.13  cliff 		return "DELL";
    110  1.1.2.13  cliff 	default:
    111  1.1.2.13  cliff 		return "undefined";
    112  1.1.2.13  cliff 	}
    113  1.1.2.13  cliff }
    114  1.1.2.13  cliff 
    115   1.1.2.1  cliff struct rmixl_config {
    116   1.1.2.2  cliff 	uint64_t		 rc_io_pbase;
    117   1.1.2.7  cliff 	bus_addr_t		 rc_pcie_cfg_pbase;
    118   1.1.2.7  cliff 	bus_size_t		 rc_pcie_cfg_size;
    119   1.1.2.7  cliff 	bus_addr_t		 rc_pcie_ecfg_pbase;
    120   1.1.2.7  cliff 	bus_size_t		 rc_pcie_ecfg_size;
    121   1.1.2.5  cliff 	bus_addr_t		 rc_pci_mem_pbase;
    122   1.1.2.5  cliff 	bus_size_t		 rc_pci_mem_size;
    123   1.1.2.5  cliff 	bus_addr_t		 rc_pci_io_pbase;
    124   1.1.2.5  cliff 	bus_size_t		 rc_pci_io_size;
    125   1.1.2.9  cliff 	struct mips_bus_space	 rc_obio_eb_memt; 	/* DEVIO -eb */
    126   1.1.2.9  cliff 	struct mips_bus_space	 rc_obio_el_memt; 	/* DEVIO -el */
    127   1.1.2.7  cliff 	struct mips_bus_space	 rc_pcie_cfg_memt; 	/* PCI CFG  */
    128   1.1.2.7  cliff 	struct mips_bus_space	 rc_pcie_ecfg_memt; 	/* PCI ECFG */
    129   1.1.2.7  cliff 	struct mips_bus_space	 rc_pci_memt; 		/* PCI MEM */
    130   1.1.2.7  cliff 	struct mips_bus_space	 rc_pci_iot; 		/* PCI IO  */
    131   1.1.2.5  cliff 	struct mips_bus_dma_tag	 rc_64bit_dmat;
    132  1.1.2.12  cliff 	bus_dma_tag_t		 rc_32bit_dmat;
    133  1.1.2.12  cliff 	bus_dma_tag_t		 rc_29bit_dmat;
    134   1.1.2.5  cliff 	struct extent		*rc_phys_ex;	/* Note: MB units */
    135   1.1.2.9  cliff 	struct extent		*rc_obio_eb_ex;
    136   1.1.2.9  cliff 	struct extent		*rc_obio_el_ex;
    137   1.1.2.8  cliff 	struct extent		*rc_pcie_cfg_ex;
    138   1.1.2.8  cliff 	struct extent		*rc_pcie_ecfg_ex;
    139   1.1.2.8  cliff 	struct extent		*rc_pcie_mem_ex;
    140   1.1.2.8  cliff 	struct extent		*rc_pcie_io_ex;
    141   1.1.2.1  cliff 	int			 rc_mallocsafe;
    142  1.1.2.12  cliff 	rmixlfw_info_t 		 rc_psb_info;
    143  1.1.2.13  cliff 	rmixlfw_psb_type_t	 rc_psb_type;
    144  1.1.2.11  cliff 	volatile struct rmixlfw_cpu_wakeup_info
    145  1.1.2.11  cliff 				*rc_cpu_wakeup_info;
    146  1.1.2.11  cliff 	const void		*rc_cpu_wakeup_end;
    147   1.1.2.1  cliff };
    148   1.1.2.1  cliff 
    149   1.1.2.1  cliff extern struct rmixl_config rmixl_configuration;
    150   1.1.2.1  cliff 
    151   1.1.2.9  cliff extern void rmixl_obio_eb_bus_mem_init(bus_space_tag_t, void *);
    152   1.1.2.9  cliff extern void rmixl_obio_el_bus_mem_init(bus_space_tag_t, void *);
    153   1.1.2.7  cliff extern void rmixl_pcie_cfg_bus_mem_init(bus_space_tag_t, void *);
    154   1.1.2.7  cliff extern void rmixl_pcie_ecfg_bus_mem_init(bus_space_tag_t, void *);
    155   1.1.2.5  cliff extern void rmixl_pcie_bus_mem_init(bus_space_tag_t, void *);
    156   1.1.2.5  cliff extern void rmixl_pcie_bus_io_init(bus_space_tag_t, void *);
    157   1.1.2.1  cliff 
    158   1.1.2.5  cliff extern const char *rmixl_intr_string(int);
    159   1.1.2.4  cliff extern void *rmixl_intr_establish(int, int,
    160   1.1.2.4  cliff 	rmixl_intr_trigger_t, rmixl_intr_polarity_t,
    161   1.1.2.4  cliff 	int (*)(void *), void *);
    162   1.1.2.1  cliff extern void  rmixl_intr_disestablish(void *);
    163   1.1.2.5  cliff 
    164   1.1.2.5  cliff extern void rmixl_addr_error_init(void);
    165   1.1.2.5  cliff extern int  rmixl_addr_error_check(void);
    166   1.1.2.5  cliff 
    167   1.1.2.6  cliff extern uint64_t rmixl_mfcr(u_int);
    168   1.1.2.6  cliff extern void rmixl_mtcr(uint64_t, u_int);
    169   1.1.2.5  cliff 
    170  1.1.2.13  cliff 
    171  1.1.2.13  cliff /*
    172  1.1.2.13  cliff  * rmixl_cache_err_dis:
    173  1.1.2.13  cliff  * - disable Cache, Data ECC, Snoop Tag Parity, Tag Parity errors
    174  1.1.2.13  cliff  * - clear the cache error log
    175  1.1.2.13  cliff  * - return previous value from RMIXL_PCR_L1D_CONFIG0
    176  1.1.2.13  cliff  */
    177  1.1.2.13  cliff static inline uint64_t
    178  1.1.2.13  cliff rmixl_cache_err_dis(void)
    179  1.1.2.13  cliff {
    180  1.1.2.13  cliff 	uint64_t r;
    181  1.1.2.13  cliff 
    182  1.1.2.13  cliff 	r = rmixl_mfcr(RMIXL_PCR_L1D_CONFIG0);
    183  1.1.2.13  cliff 	rmixl_mtcr(RMIXL_PCR_L1D_CONFIG0, r & ~0x2e);
    184  1.1.2.13  cliff 	rmixl_mtcr(RMIXL_PCR_L1D_CACHE_ERROR_LOG, 0);
    185  1.1.2.13  cliff 	return r;
    186  1.1.2.13  cliff }
    187  1.1.2.13  cliff 
    188  1.1.2.13  cliff /*
    189  1.1.2.13  cliff  * rmixl_cache_err_restore:
    190  1.1.2.13  cliff  * - clear the cache error log, cache error overflow log,
    191  1.1.2.13  cliff  *   and cache interrupt registers
    192  1.1.2.13  cliff  * - restore previous value to RMIXL_PCR_L1D_CONFIG0
    193  1.1.2.13  cliff  */
    194  1.1.2.13  cliff static inline void
    195  1.1.2.13  cliff rmixl_cache_err_restore(uint64_t r)
    196  1.1.2.13  cliff {
    197  1.1.2.13  cliff 	rmixl_mtcr(RMIXL_PCR_L1D_CACHE_ERROR_LOG, 0);
    198  1.1.2.13  cliff 	rmixl_mtcr(RMIXL_PCR_L1D_CACHE_ERROR_OVF_LO, 0);
    199  1.1.2.13  cliff 	rmixl_mtcr(RMIXL_PCR_L1D_CACHE_INTERRUPT, 0);
    200  1.1.2.13  cliff 	rmixl_mtcr(RMIXL_PCR_L1D_CONFIG0, r);
    201  1.1.2.13  cliff }
    202  1.1.2.13  cliff 
    203  1.1.2.13  cliff static inline uint64_t
    204  1.1.2.13  cliff rmixl_cache_err_check(void)
    205  1.1.2.13  cliff {
    206  1.1.2.13  cliff 	return rmixl_mfcr(RMIXL_PCR_L1D_CACHE_ERROR_LOG);
    207  1.1.2.13  cliff }
    208  1.1.2.13  cliff 
    209  1.1.2.13  cliff static inline int
    210  1.1.2.13  cliff rmixl_probe_4(volatile uint32_t *va)
    211  1.1.2.13  cliff {
    212  1.1.2.13  cliff 	uint32_t tmp;
    213  1.1.2.13  cliff 	uint32_t r;
    214  1.1.2.13  cliff 	int err;
    215  1.1.2.13  cliff 	int s;
    216  1.1.2.13  cliff 
    217  1.1.2.13  cliff 	s = splhigh();
    218  1.1.2.13  cliff 	r = rmixl_cache_err_dis();
    219  1.1.2.13  cliff 	tmp = *va;			/* probe */
    220  1.1.2.13  cliff 	err = rmixl_cache_err_check();
    221  1.1.2.13  cliff 	rmixl_cache_err_restore(r);
    222  1.1.2.13  cliff 	splx(s);
    223  1.1.2.13  cliff 
    224  1.1.2.13  cliff 	return (err == 0);
    225  1.1.2.13  cliff }
    226  1.1.2.13  cliff 
    227   1.1.2.6  cliff #endif	/* _MIPS_RMI_RMIXLVAR_H_ */
    228