Home | History | Annotate | Line # | Download | only in dev
plb.c revision 1.20.12.1
      1  1.20.12.1       tls /* $NetBSD: plb.c,v 1.20.12.1 2014/08/20 00:03:19 tls Exp $ */
      2        1.1    simonb 
      3        1.1    simonb /*
      4        1.1    simonb  * Copyright 2001 Wasabi Systems, Inc.
      5        1.1    simonb  * All rights reserved.
      6        1.1    simonb  *
      7        1.1    simonb  * Written by Eduardo Horvath and Simon Burge for Wasabi Systems, Inc.
      8        1.1    simonb  *
      9        1.1    simonb  * Redistribution and use in source and binary forms, with or without
     10        1.1    simonb  * modification, are permitted provided that the following conditions
     11        1.1    simonb  * are met:
     12        1.1    simonb  * 1. Redistributions of source code must retain the above copyright
     13        1.1    simonb  *    notice, this list of conditions and the following disclaimer.
     14        1.1    simonb  * 2. Redistributions in binary form must reproduce the above copyright
     15        1.1    simonb  *    notice, this list of conditions and the following disclaimer in the
     16        1.1    simonb  *    documentation and/or other materials provided with the distribution.
     17        1.1    simonb  * 3. All advertising materials mentioning features or use of this software
     18        1.1    simonb  *    must display the following acknowledgement:
     19        1.1    simonb  *      This product includes software developed for the NetBSD Project by
     20        1.1    simonb  *      Wasabi Systems, Inc.
     21        1.1    simonb  * 4. The name of Wasabi Systems, Inc. may not be used to endorse
     22        1.1    simonb  *    or promote products derived from this software without specific prior
     23        1.1    simonb  *    written permission.
     24        1.1    simonb  *
     25        1.1    simonb  * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
     26        1.1    simonb  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     27        1.1    simonb  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     28        1.1    simonb  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL WASABI SYSTEMS, INC
     29        1.1    simonb  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     30        1.1    simonb  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     31        1.1    simonb  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     32        1.1    simonb  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     33        1.1    simonb  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     34        1.1    simonb  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     35        1.1    simonb  * POSSIBILITY OF SUCH DAMAGE.
     36        1.1    simonb  */
     37        1.1    simonb 
     38        1.1    simonb /*
     39        1.1    simonb  * Copyright (c) 1996 Christopher G. Demetriou.  All rights reserved.
     40        1.1    simonb  *
     41        1.1    simonb  * Redistribution and use in source and binary forms, with or without
     42        1.1    simonb  * modification, are permitted provided that the following conditions
     43        1.1    simonb  * are met:
     44        1.1    simonb  * 1. Redistributions of source code must retain the above copyright
     45        1.1    simonb  *    notice, this list of conditions and the following disclaimer.
     46        1.1    simonb  * 2. Redistributions in binary form must reproduce the above copyright
     47        1.1    simonb  *    notice, this list of conditions and the following disclaimer in the
     48        1.1    simonb  *    documentation and/or other materials provided with the distribution.
     49        1.1    simonb  * 3. All advertising materials mentioning features or use of this software
     50        1.1    simonb  *    must display the following acknowledgement:
     51        1.1    simonb  *      This product includes software developed by Christopher G. Demetriou
     52        1.1    simonb  *	for the NetBSD Project.
     53        1.1    simonb  * 4. The name of the author may not be used to endorse or promote products
     54        1.1    simonb  *    derived from this software without specific prior written permission
     55        1.1    simonb  *
     56        1.1    simonb  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     57        1.1    simonb  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     58        1.1    simonb  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     59        1.1    simonb  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     60        1.1    simonb  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     61        1.1    simonb  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     62        1.1    simonb  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     63        1.1    simonb  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     64        1.1    simonb  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     65        1.1    simonb  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     66        1.1    simonb  */
     67        1.9     lukem 
     68        1.9     lukem #include <sys/cdefs.h>
     69  1.20.12.1       tls __KERNEL_RCSID(0, "$NetBSD: plb.c,v 1.20.12.1 2014/08/20 00:03:19 tls Exp $");
     70        1.1    simonb 
     71        1.1    simonb #include "locators.h"
     72       1.15  kiyohara #include "emac.h"
     73        1.1    simonb 
     74       1.20      matt #define _POWERPC_BUS_DMA_PRIVATE
     75       1.20      matt 
     76        1.1    simonb #include <sys/param.h>
     77        1.1    simonb #include <sys/systm.h>
     78        1.1    simonb #include <sys/device.h>
     79        1.1    simonb #include <sys/extent.h>
     80        1.1    simonb #include <sys/malloc.h>
     81       1.20      matt #include <sys/bus.h>
     82       1.20      matt #include <sys/cpu.h>
     83        1.1    simonb 
     84       1.20      matt #include <powerpc/ibm4xx/cpu.h>
     85       1.20      matt #include <powerpc/ibm4xx/spr.h>
     86       1.15  kiyohara #include <powerpc/ibm4xx/dev/malvar.h>
     87        1.1    simonb #include <powerpc/ibm4xx/dev/plbvar.h>
     88        1.1    simonb 
     89        1.1    simonb /*
     90       1.12       wiz  * The devices that attach to the processor local bus on the 405GP CPU.
     91        1.1    simonb  */
     92        1.1    simonb const struct plb_dev plb_devs [] = {
     93       1.15  kiyohara 	/* IBM 405GP */
     94       1.15  kiyohara 	{ IBM405GP,	"cpu", },
     95       1.15  kiyohara 	{ IBM405GP,	"ecc", },
     96       1.15  kiyohara 	{ IBM405GP,	"opb", },
     97       1.15  kiyohara 	{ IBM405GP,	"pchb", },
     98       1.15  kiyohara 
     99       1.15  kiyohara 	/* IBM 405GPr */
    100       1.15  kiyohara 	{ IBM405GPR,	"cpu", },
    101       1.15  kiyohara 	{ IBM405GPR,	"ecc", },
    102       1.15  kiyohara 	{ IBM405GPR,	"opb", },
    103       1.15  kiyohara 	{ IBM405GPR,	"pchb", },
    104       1.17  uebayasi 	{ IBM405GPR,	"exb", },
    105       1.15  kiyohara 
    106       1.15  kiyohara 	/* AMCC 405EX / EXR */
    107       1.15  kiyohara 	{ AMCC405EX,	"cpu", },
    108       1.15  kiyohara 	{ AMCC405EX,	"ecc", },
    109       1.15  kiyohara 	{ AMCC405EX,	"opb", },
    110  1.20.12.1       tls 	{ AMCC405EX,	"dwctwo", },
    111       1.15  kiyohara 
    112       1.15  kiyohara 	{ 0,		NULL }
    113        1.1    simonb };
    114        1.1    simonb 
    115       1.19      matt static int	plb_match(device_t, cfdata_t, void *);
    116       1.19      matt static void	plb_attach(device_t, device_t, void *);
    117        1.1    simonb static int	plb_print(void *, const char *);
    118        1.1    simonb 
    119       1.19      matt CFATTACH_DECL_NEW(plb, 0, plb_match, plb_attach, NULL, NULL);
    120        1.1    simonb 
    121        1.1    simonb /*
    122       1.10       scw  * "generic" DMA struct, nothing special.
    123       1.10       scw  */
    124       1.10       scw struct powerpc_bus_dma_tag ibm4xx_default_bus_dma_tag = {
    125       1.10       scw 	0,			/* _bounce_thresh */
    126       1.15  kiyohara 	_bus_dmamap_create,
    127       1.10       scw 	_bus_dmamap_destroy,
    128       1.10       scw 	_bus_dmamap_load,
    129       1.10       scw 	_bus_dmamap_load_mbuf,
    130       1.10       scw 	_bus_dmamap_load_uio,
    131       1.10       scw 	_bus_dmamap_load_raw,
    132       1.10       scw 	_bus_dmamap_unload,
    133       1.10       scw 	_bus_dmamap_sync,
    134       1.10       scw 	_bus_dmamem_alloc,
    135       1.10       scw 	_bus_dmamem_free,
    136       1.10       scw 	_bus_dmamem_map,
    137       1.10       scw 	_bus_dmamem_unmap,
    138       1.10       scw 	_bus_dmamem_mmap,
    139       1.10       scw 	_bus_dma_phys_to_bus_mem_generic,
    140       1.10       scw 	_bus_dma_bus_mem_to_phys_generic,
    141       1.10       scw };
    142       1.10       scw 
    143       1.10       scw /*
    144        1.1    simonb  * Probe for the plb; always succeeds.
    145        1.1    simonb  */
    146        1.1    simonb static int
    147       1.19      matt plb_match(device_t parent, cfdata_t cf, void *aux)
    148        1.1    simonb {
    149        1.1    simonb 
    150       1.15  kiyohara 	return 1;
    151        1.1    simonb }
    152        1.1    simonb 
    153        1.1    simonb /*
    154        1.1    simonb  * Attach the processor local bus.
    155        1.1    simonb  */
    156        1.1    simonb static void
    157       1.19      matt plb_attach(device_t parent, device_t self, void *aux)
    158        1.1    simonb {
    159        1.1    simonb 	struct plb_attach_args paa;
    160        1.1    simonb 	struct plb_dev *local_plb_devs = aux;
    161       1.15  kiyohara 	int pvr, i;
    162       1.15  kiyohara 
    163       1.15  kiyohara 	aprint_naive("\n");
    164       1.15  kiyohara 	aprint_normal("\n");
    165       1.15  kiyohara 
    166       1.15  kiyohara 	pvr = mfpvr() >> 16;
    167        1.1    simonb 
    168       1.15  kiyohara #if NEMAC > 0
    169       1.15  kiyohara 	mal_attach(pvr);
    170       1.15  kiyohara #endif
    171        1.1    simonb 
    172        1.1    simonb 	for (i = 0; plb_devs[i].plb_name != NULL; i++) {
    173       1.15  kiyohara 		if (plb_devs[i].plb_pvr != pvr)
    174       1.15  kiyohara 			continue;
    175       1.15  kiyohara 
    176        1.1    simonb 		paa.plb_name = plb_devs[i].plb_name;
    177  1.20.12.1       tls 		paa.plb_addr = PLBCF_ADDR_DEFAULT;
    178        1.2    simonb 		paa.plb_dmat = &ibm4xx_default_bus_dma_tag;
    179        1.3       scw 		paa.plb_irq = PLBCF_IRQ_DEFAULT;
    180        1.1    simonb 
    181       1.13  drochner 		(void) config_found_ia(self, "plb", &paa, plb_print);
    182        1.1    simonb 	}
    183        1.1    simonb 
    184        1.1    simonb 	while (local_plb_devs && local_plb_devs->plb_name != NULL) {
    185       1.18  kiyohara 		if (local_plb_devs->plb_pvr != pvr)
    186       1.15  kiyohara 			continue;
    187       1.15  kiyohara 
    188        1.1    simonb 		paa.plb_name = local_plb_devs->plb_name;
    189  1.20.12.1       tls 		paa.plb_addr = PLBCF_ADDR_DEFAULT;
    190        1.2    simonb 		paa.plb_dmat = &ibm4xx_default_bus_dma_tag;
    191        1.3       scw 		paa.plb_irq = PLBCF_IRQ_DEFAULT;
    192        1.1    simonb 
    193       1.13  drochner 		(void) config_found_ia(self, "plb", &paa, plb_print);
    194        1.1    simonb 		local_plb_devs++;
    195        1.1    simonb 	}
    196        1.1    simonb }
    197        1.1    simonb 
    198        1.1    simonb static int
    199        1.1    simonb plb_print(void *aux, const char *pnp)
    200        1.1    simonb {
    201        1.1    simonb 	struct plb_attach_args *paa = aux;
    202        1.1    simonb 
    203        1.1    simonb 	if (pnp)
    204        1.8   thorpej 		aprint_normal("%s at %s", paa->plb_name, pnp);
    205  1.20.12.1       tls 	if (paa->plb_addr != PLBCF_ADDR_DEFAULT)
    206  1.20.12.1       tls 		aprint_normal(" address 0x%08x", paa->plb_addr);
    207        1.3       scw 	if (paa->plb_irq != PLBCF_IRQ_DEFAULT)
    208        1.8   thorpej 		aprint_normal(" irq %d", paa->plb_irq);
    209        1.1    simonb 
    210       1.15  kiyohara 	return UNCONF;
    211        1.1    simonb }
    212