Home | History | Annotate | Line # | Download | only in dev
      1  1.20   thorpej /* $NetBSD: sbscd.c,v 1.20 2021/08/07 16:18:59 thorpej Exp $ */
      2   1.1    simonb 
      3   1.1    simonb /*
      4   1.1    simonb  * Copyright 2000, 2001
      5   1.1    simonb  * Broadcom Corporation. All rights reserved.
      6   1.1    simonb  *
      7   1.1    simonb  * This software is furnished under license and may be used and copied only
      8   1.1    simonb  * in accordance with the following terms and conditions.  Subject to these
      9   1.1    simonb  * conditions, you may download, copy, install, use, modify and distribute
     10   1.1    simonb  * modified or unmodified copies of this software in source and/or binary
     11   1.1    simonb  * form. No title or ownership is transferred hereby.
     12   1.1    simonb  *
     13   1.1    simonb  * 1) Any source code used, modified or distributed must reproduce and
     14   1.1    simonb  *    retain this copyright notice and list of conditions as they appear in
     15   1.1    simonb  *    the source file.
     16   1.1    simonb  *
     17   1.1    simonb  * 2) No right is granted to use any trade name, trademark, or logo of
     18   1.7       cgd  *    Broadcom Corporation.  The "Broadcom Corporation" name may not be
     19   1.7       cgd  *    used to endorse or promote products derived from this software
     20   1.7       cgd  *    without the prior written permission of Broadcom Corporation.
     21   1.1    simonb  *
     22   1.1    simonb  * 3) THIS SOFTWARE IS PROVIDED "AS-IS" AND ANY EXPRESS OR IMPLIED
     23   1.1    simonb  *    WARRANTIES, INCLUDING BUT NOT LIMITED TO, ANY IMPLIED WARRANTIES OF
     24   1.1    simonb  *    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
     25   1.1    simonb  *    NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL BROADCOM BE LIABLE
     26   1.1    simonb  *    FOR ANY DAMAGES WHATSOEVER, AND IN PARTICULAR, BROADCOM SHALL NOT BE
     27   1.1    simonb  *    LIABLE FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     28   1.1    simonb  *    CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     29   1.1    simonb  *    SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
     30   1.1    simonb  *    BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     31   1.1    simonb  *    WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
     32   1.1    simonb  *    OR OTHERWISE), EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     33   1.1    simonb  */
     34   1.8     lukem 
     35   1.8     lukem #include <sys/cdefs.h>
     36  1.20   thorpej __KERNEL_RCSID(0, "$NetBSD: sbscd.c,v 1.20 2021/08/07 16:18:59 thorpej Exp $");
     37   1.1    simonb 
     38   1.1    simonb #include <sys/param.h>
     39   1.1    simonb #include <sys/device.h>
     40   1.1    simonb #include <sys/systm.h>
     41   1.1    simonb 
     42  1.15    simonb #include <mips/sibyte/include/sb1250_int.h>
     43  1.15    simonb #include <mips/sibyte/include/sb1250_regs.h>
     44  1.15    simonb #include <mips/sibyte/include/sb1250_scd.h>
     45   1.1    simonb #include <mips/sibyte/include/zbbusvar.h>
     46   1.1    simonb #include <mips/sibyte/dev/sbscdvar.h>
     47   1.1    simonb 
     48   1.1    simonb #include "locators.h"
     49   1.1    simonb 
     50  1.16      matt static int	sbscd_match(device_t, cfdata_t, void *);
     51  1.16      matt static void	sbscd_attach(device_t, device_t, void *);
     52   1.1    simonb 
     53  1.16      matt CFATTACH_DECL_NEW(sbscd, 0,
     54   1.5   thorpej     sbscd_match, sbscd_attach, NULL, NULL);
     55   1.1    simonb 
     56   1.1    simonb static int	sbscd_print(void *, const char *);
     57   1.1    simonb static const char *sbscd_device_type_name(enum sbscd_device_type type);
     58   1.1    simonb 
     59   1.1    simonb static const struct sbscd_attach_locs sb1250_sbscd_devs[] = {
     60   1.1    simonb #if 0
     61  1.15    simonb 	{ A_IMR_CPU0_BASE,
     62  1.15    simonb 	  { -1, -1 },
     63  1.15    simonb 	  SBSCD_DEVTYPE_ICU },
     64   1.1    simonb #endif
     65  1.15    simonb 	{ A_SCD_WDOG_0,
     66  1.15    simonb 	  { K_INT_WATCHDOG_TIMER_0, -1 },
     67  1.15    simonb 	  SBSCD_DEVTYPE_WDOG },
     68  1.15    simonb 	{ A_SCD_WDOG_1,
     69  1.15    simonb 	  { K_INT_WATCHDOG_TIMER_1, -1 },
     70  1.15    simonb 	  SBSCD_DEVTYPE_WDOG },
     71  1.15    simonb 	{ A_SCD_TIMER_0,
     72  1.15    simonb 	  { K_INT_TIMER_0, -1 },
     73  1.15    simonb 	  SBSCD_DEVTYPE_TIMER },
     74  1.15    simonb 	{ A_SCD_TIMER_1,
     75  1.15    simonb 	  { K_INT_TIMER_1, -1 },
     76  1.15    simonb 	  SBSCD_DEVTYPE_TIMER },
     77  1.15    simonb 	{ A_SCD_TIMER_2,
     78  1.15    simonb 	  { K_INT_TIMER_2, -1 },
     79  1.15    simonb 	  SBSCD_DEVTYPE_TIMER },
     80  1.15    simonb 	{ A_SCD_TIMER_3,
     81  1.15    simonb 	  { K_INT_TIMER_3, -1 },
     82  1.15    simonb 	  SBSCD_DEVTYPE_TIMER },
     83  1.15    simonb 	{ A_SCD_JTAG_BASE + 0x1FFA0, 	/* XXX magic number for jtag addr */
     84  1.15    simonb 	  { -1, -1 },
     85  1.15    simonb 	  SBSCD_DEVTYPE_JTAGCONS },
     86   1.1    simonb 	/* XXX others */
     87   1.1    simonb };
     88  1.14    cegger static const int sb1250_sbscd_dev_count = __arraycount(sb1250_sbscd_devs);
     89   1.1    simonb 
     90   1.1    simonb static int
     91  1.16      matt sbscd_match(device_t parent, cfdata_t match, void *aux)
     92   1.1    simonb {
     93   1.1    simonb 	struct zbbus_attach_args *zap = aux;
     94   1.1    simonb 
     95   1.1    simonb 	if (zap->za_locs.za_type != ZBBUS_ENTTYPE_SCD)
     96   1.1    simonb 		return (0);
     97   1.1    simonb 
     98   1.1    simonb 	return 1;
     99   1.1    simonb }
    100   1.1    simonb 
    101   1.1    simonb static void
    102  1.16      matt sbscd_attach(device_t parent, device_t self, void *aux)
    103   1.1    simonb {
    104   1.1    simonb 	struct sbscd_attach_args sa;
    105   1.1    simonb 	int i;
    106  1.10  drochner 	int locs[SBSCDCF_NLOCS];
    107   1.1    simonb 
    108  1.17      matt 	aprint_normal("\n");
    109   1.1    simonb 
    110   1.1    simonb 	for (i = 0; i < sb1250_sbscd_dev_count; i++) {
    111   1.1    simonb 		memset(&sa, 0, sizeof sa);
    112   1.1    simonb 		sa.sa_locs = sb1250_sbscd_devs[i];
    113   1.9  drochner 
    114  1.18      matt 		locs[SBSCDCF_OFFSET] = sb1250_sbscd_devs[i].sa_offset;
    115  1.10  drochner 		locs[SBSCDCF_INTR + 0] =
    116   1.9  drochner 			sb1250_sbscd_devs[i].sa_intr[0];
    117  1.10  drochner 		locs[SBSCDCF_INTR + 1] =
    118   1.9  drochner 			sb1250_sbscd_devs[i].sa_intr[1];
    119   1.9  drochner 
    120  1.19   thorpej 		config_found(self, &sa, sbscd_print,
    121  1.20   thorpej 		    CFARGS(.submatch = config_stdsubmatch,
    122  1.20   thorpej 			   .locators = locs));
    123   1.1    simonb 	}
    124   1.1    simonb 	return;
    125   1.1    simonb }
    126   1.1    simonb 
    127   1.1    simonb int
    128   1.1    simonb sbscd_print(void *aux, const char *pnp)
    129   1.1    simonb {
    130   1.1    simonb 	struct sbscd_attach_args *sap = aux;
    131   1.1    simonb 	int i;
    132   1.1    simonb 
    133   1.1    simonb 	if (pnp)
    134   1.6   thorpej 		aprint_normal("%s at %s",
    135   1.1    simonb 		    sbscd_device_type_name(sap->sa_locs.sa_type), pnp);
    136  1.18      matt 	aprint_normal(" offset 0x%lx", sap->sa_locs.sa_offset);
    137   1.1    simonb 	for (i = 0; i < 2; i++) {
    138   1.1    simonb 		if (sap->sa_locs.sa_intr[i] != -1)
    139  1.15    simonb 			aprint_normal("%s%d", i == 0 ? " intr " : ",",
    140  1.15    simonb 			    sap->sa_locs.sa_intr[i]);
    141   1.1    simonb 	}
    142   1.1    simonb 	return (UNCONF);
    143   1.1    simonb }
    144   1.1    simonb 
    145   1.1    simonb static const char *
    146   1.1    simonb sbscd_device_type_name(enum sbscd_device_type type)
    147   1.1    simonb {
    148   1.1    simonb 
    149   1.1    simonb 	switch (type) {
    150   1.1    simonb 	case SBSCD_DEVTYPE_ICU:
    151   1.1    simonb 		return ("sbicu");
    152   1.1    simonb 	case SBSCD_DEVTYPE_WDOG:
    153   1.1    simonb 		return ("sbwdog");
    154   1.1    simonb 	case SBSCD_DEVTYPE_TIMER:
    155   1.1    simonb 		return ("sbtimer");
    156   1.1    simonb 	case SBSCD_DEVTYPE_JTAGCONS:
    157   1.1    simonb 		return ("sbjcn");
    158   1.1    simonb 
    159   1.1    simonb 	}
    160   1.1    simonb 	panic("sbscd_device_type_name");
    161   1.1    simonb 	return ("panic");
    162   1.1    simonb }
    163