Home | History | Annotate | Line # | Download | only in dev
plb.c revision 1.14.78.1
      1  1.14.78.1      yamt /* $NetBSD: plb.c,v 1.14.78.1 2010/08/11 22:52:33 yamt 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.14.78.1      yamt __KERNEL_RCSID(0, "$NetBSD: plb.c,v 1.14.78.1 2010/08/11 22:52:33 yamt Exp $");
     70        1.1    simonb 
     71        1.1    simonb #include "locators.h"
     72  1.14.78.1      yamt #include "emac.h"
     73        1.1    simonb 
     74        1.1    simonb #include <sys/param.h>
     75        1.1    simonb #include <sys/systm.h>
     76        1.1    simonb #include <sys/device.h>
     77        1.1    simonb #include <sys/extent.h>
     78        1.1    simonb #include <sys/malloc.h>
     79        1.1    simonb 
     80       1.10       scw #define _POWERPC_BUS_DMA_PRIVATE
     81       1.10       scw #include <machine/bus.h>
     82       1.10       scw 
     83  1.14.78.1      yamt #include <powerpc/cpu.h>
     84  1.14.78.1      yamt #include <powerpc/ibm4xx/dev/malvar.h>
     85        1.1    simonb #include <powerpc/ibm4xx/dev/plbvar.h>
     86  1.14.78.1      yamt #include <powerpc/ibm4xx/spr.h>
     87        1.1    simonb 
     88        1.1    simonb /*
     89       1.12       wiz  * The devices that attach to the processor local bus on the 405GP CPU.
     90        1.1    simonb  */
     91        1.1    simonb const struct plb_dev plb_devs [] = {
     92  1.14.78.1      yamt 	/* IBM 405GP */
     93  1.14.78.1      yamt 	{ IBM405GP,	"cpu", },
     94  1.14.78.1      yamt 	{ IBM405GP,	"ecc", },
     95  1.14.78.1      yamt 	{ IBM405GP,	"opb", },
     96  1.14.78.1      yamt 	{ IBM405GP,	"pchb", },
     97  1.14.78.1      yamt 
     98  1.14.78.1      yamt 	/* IBM 405GPr */
     99  1.14.78.1      yamt 	{ IBM405GPR,	"cpu", },
    100  1.14.78.1      yamt 	{ IBM405GPR,	"ecc", },
    101  1.14.78.1      yamt 	{ IBM405GPR,	"opb", },
    102  1.14.78.1      yamt 	{ IBM405GPR,	"pchb", },
    103  1.14.78.1      yamt 
    104  1.14.78.1      yamt 	/* AMCC 405EX / EXR */
    105  1.14.78.1      yamt 	{ AMCC405EX,	"cpu", },
    106  1.14.78.1      yamt 	{ AMCC405EX,	"ecc", },
    107  1.14.78.1      yamt 	{ AMCC405EX,	"opb", },
    108  1.14.78.1      yamt 	{ AMCC405EX,	"pchb", },
    109  1.14.78.1      yamt 
    110  1.14.78.1      yamt 	{ 0,		NULL }
    111        1.1    simonb };
    112        1.1    simonb 
    113        1.1    simonb static int	plb_match(struct device *, struct cfdata *, void *);
    114        1.1    simonb static void	plb_attach(struct device *, struct device *, void *);
    115        1.1    simonb static int	plb_print(void *, const char *);
    116        1.1    simonb 
    117  1.14.78.1      yamt CFATTACH_DECL(plb, sizeof(struct device), plb_match, plb_attach, NULL, NULL);
    118        1.1    simonb 
    119        1.1    simonb /*
    120       1.10       scw  * "generic" DMA struct, nothing special.
    121       1.10       scw  */
    122       1.10       scw struct powerpc_bus_dma_tag ibm4xx_default_bus_dma_tag = {
    123       1.10       scw 	0,			/* _bounce_thresh */
    124  1.14.78.1      yamt 	_bus_dmamap_create,
    125       1.10       scw 	_bus_dmamap_destroy,
    126       1.10       scw 	_bus_dmamap_load,
    127       1.10       scw 	_bus_dmamap_load_mbuf,
    128       1.10       scw 	_bus_dmamap_load_uio,
    129       1.10       scw 	_bus_dmamap_load_raw,
    130       1.10       scw 	_bus_dmamap_unload,
    131       1.10       scw 	_bus_dmamap_sync,
    132       1.10       scw 	_bus_dmamem_alloc,
    133       1.10       scw 	_bus_dmamem_free,
    134       1.10       scw 	_bus_dmamem_map,
    135       1.10       scw 	_bus_dmamem_unmap,
    136       1.10       scw 	_bus_dmamem_mmap,
    137       1.10       scw 	_bus_dma_phys_to_bus_mem_generic,
    138       1.10       scw 	_bus_dma_bus_mem_to_phys_generic,
    139       1.10       scw };
    140       1.10       scw 
    141       1.10       scw /*
    142        1.1    simonb  * Probe for the plb; always succeeds.
    143        1.1    simonb  */
    144        1.1    simonb static int
    145        1.1    simonb plb_match(struct device *parent, struct cfdata *cf, void *aux)
    146        1.1    simonb {
    147        1.1    simonb 
    148  1.14.78.1      yamt 	return 1;
    149        1.1    simonb }
    150        1.1    simonb 
    151        1.1    simonb /*
    152        1.1    simonb  * Attach the processor local bus.
    153        1.1    simonb  */
    154        1.1    simonb static void
    155        1.1    simonb plb_attach(struct device *parent, struct device *self, void *aux)
    156        1.1    simonb {
    157        1.1    simonb 	struct plb_attach_args paa;
    158        1.1    simonb 	struct plb_dev *local_plb_devs = aux;
    159  1.14.78.1      yamt 	int pvr, i;
    160  1.14.78.1      yamt 
    161  1.14.78.1      yamt 	aprint_naive("\n");
    162  1.14.78.1      yamt 	aprint_normal("\n");
    163  1.14.78.1      yamt 
    164  1.14.78.1      yamt 	pvr = mfpvr() >> 16;
    165        1.1    simonb 
    166  1.14.78.1      yamt #if NEMAC > 0
    167  1.14.78.1      yamt 	mal_attach(pvr);
    168  1.14.78.1      yamt #endif
    169        1.1    simonb 
    170        1.1    simonb 	for (i = 0; plb_devs[i].plb_name != NULL; i++) {
    171  1.14.78.1      yamt 		if (plb_devs[i].plb_pvr != pvr)
    172  1.14.78.1      yamt 			continue;
    173  1.14.78.1      yamt 
    174        1.1    simonb 		paa.plb_name = plb_devs[i].plb_name;
    175        1.2    simonb 		paa.plb_dmat = &ibm4xx_default_bus_dma_tag;
    176        1.3       scw 		paa.plb_irq = PLBCF_IRQ_DEFAULT;
    177        1.1    simonb 
    178       1.13  drochner 		(void) config_found_ia(self, "plb", &paa, plb_print);
    179        1.1    simonb 	}
    180        1.1    simonb 
    181        1.1    simonb 	while (local_plb_devs && local_plb_devs->plb_name != NULL) {
    182  1.14.78.1      yamt 		if (plb_devs[i].plb_pvr != pvr)
    183  1.14.78.1      yamt 			continue;
    184  1.14.78.1      yamt 
    185        1.1    simonb 		paa.plb_name = local_plb_devs->plb_name;
    186        1.2    simonb 		paa.plb_dmat = &ibm4xx_default_bus_dma_tag;
    187        1.3       scw 		paa.plb_irq = PLBCF_IRQ_DEFAULT;
    188        1.1    simonb 
    189       1.13  drochner 		(void) config_found_ia(self, "plb", &paa, plb_print);
    190        1.1    simonb 		local_plb_devs++;
    191        1.1    simonb 	}
    192        1.1    simonb }
    193        1.1    simonb 
    194        1.1    simonb static int
    195        1.1    simonb plb_print(void *aux, const char *pnp)
    196        1.1    simonb {
    197        1.1    simonb 	struct plb_attach_args *paa = aux;
    198        1.1    simonb 
    199        1.1    simonb 	if (pnp)
    200        1.8   thorpej 		aprint_normal("%s at %s", paa->plb_name, pnp);
    201        1.3       scw 	if (paa->plb_irq != PLBCF_IRQ_DEFAULT)
    202        1.8   thorpej 		aprint_normal(" irq %d", paa->plb_irq);
    203        1.1    simonb 
    204  1.14.78.1      yamt 	return UNCONF;
    205        1.1    simonb }
    206