Home | History | Annotate | Line # | Download | only in marvell
pci_machdep.c revision 1.12.10.1
      1  1.12.10.1  pgoyette /*	$NetBSD: pci_machdep.c,v 1.12.10.1 2018/11/26 01:52:19 pgoyette Exp $	*/
      2        1.1  kiyohara /*
      3        1.1  kiyohara  * Copyright (c) 2008 KIYOHARA Takashi
      4        1.1  kiyohara  * All rights reserved.
      5        1.1  kiyohara  *
      6        1.1  kiyohara  * Redistribution and use in source and binary forms, with or without
      7        1.1  kiyohara  * modification, are permitted provided that the following conditions
      8        1.1  kiyohara  * are met:
      9        1.1  kiyohara  * 1. Redistributions of source code must retain the above copyright
     10        1.1  kiyohara  *    notice, this list of conditions and the following disclaimer.
     11        1.1  kiyohara  * 2. Redistributions in binary form must reproduce the above copyright
     12        1.1  kiyohara  *    notice, this list of conditions and the following disclaimer in the
     13        1.1  kiyohara  *    documentation and/or other materials provided with the distribution.
     14        1.1  kiyohara  *
     15        1.1  kiyohara  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     16        1.1  kiyohara  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     17        1.1  kiyohara  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     18        1.1  kiyohara  * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
     19        1.1  kiyohara  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     20        1.1  kiyohara  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
     21        1.1  kiyohara  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     22        1.1  kiyohara  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     23        1.1  kiyohara  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
     24        1.1  kiyohara  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     25        1.1  kiyohara  * POSSIBILITY OF SUCH DAMAGE.
     26        1.1  kiyohara  */
     27        1.1  kiyohara 
     28        1.1  kiyohara #include <sys/cdefs.h>
     29  1.12.10.1  pgoyette __KERNEL_RCSID(0, "$NetBSD: pci_machdep.c,v 1.12.10.1 2018/11/26 01:52:19 pgoyette Exp $");
     30        1.1  kiyohara 
     31        1.1  kiyohara #include "opt_mvsoc.h"
     32        1.1  kiyohara #include "gtpci.h"
     33        1.1  kiyohara #include "mvpex.h"
     34        1.1  kiyohara #include "pci.h"
     35        1.1  kiyohara 
     36        1.1  kiyohara #include <sys/param.h>
     37        1.1  kiyohara #include <sys/device.h>
     38        1.1  kiyohara #include <sys/extent.h>
     39        1.1  kiyohara 
     40        1.1  kiyohara #include <dev/pci/pcivar.h>
     41        1.1  kiyohara #include <dev/pci/pciconf.h>
     42        1.1  kiyohara 
     43        1.1  kiyohara #include <arm/marvell/mvsocreg.h>
     44        1.1  kiyohara #include <arm/marvell/mvsocvar.h>
     45        1.1  kiyohara #include <arm/marvell/mvsocgppvar.h>
     46        1.1  kiyohara #if NGTPCI > 0
     47        1.1  kiyohara #include <dev/marvell/gtpcireg.h>
     48        1.1  kiyohara #include <dev/marvell/gtpcivar.h>
     49        1.1  kiyohara #endif
     50        1.1  kiyohara #if NMVPEX > 0
     51        1.1  kiyohara #include <dev/marvell/mvpexreg.h>
     52        1.1  kiyohara #include <dev/marvell/mvpexvar.h>
     53        1.1  kiyohara #endif
     54        1.1  kiyohara 
     55        1.1  kiyohara #include <machine/pci_machdep.h>
     56        1.1  kiyohara 
     57        1.1  kiyohara #if defined(ORION)
     58        1.1  kiyohara #include <arm/marvell/orionreg.h>
     59        1.1  kiyohara #endif
     60        1.1  kiyohara #if defined(KIRKWOOD)
     61        1.1  kiyohara #include <arm/marvell/kirkwoodreg.h>
     62        1.1  kiyohara #endif
     63        1.1  kiyohara #include <dev/marvell/marvellreg.h>
     64        1.1  kiyohara 
     65        1.1  kiyohara 
     66        1.1  kiyohara #if NGTPCI > 0
     67        1.1  kiyohara #if NGTPCI_MBUS > 0
     68        1.1  kiyohara static pcireg_t gtpci_mbus_conf_read(void *, pcitag_t, int);
     69        1.1  kiyohara static void gtpci_mbus_conf_write(void *, pcitag_t, int, pcireg_t);
     70        1.1  kiyohara #endif
     71        1.2    dyoung static int gtpci_gpp_intr_map(const struct pci_attach_args *,
     72        1.2    dyoung     pci_intr_handle_t *);
     73        1.8  christos static const char *gtpci_gpp_intr_string(void *, pci_intr_handle_t,
     74        1.8  christos     char *, size_t);
     75        1.1  kiyohara static const struct evcnt *gtpci_gpp_intr_evcnt(void *, pci_intr_handle_t);
     76  1.12.10.1  pgoyette static void *gtpci_gpp_intr_establish(void *, pci_intr_handle_t, int, int (*)(void *), void *, const char *);
     77        1.1  kiyohara static void gtpci_gpp_intr_disestablish(void *, void *);
     78        1.1  kiyohara 
     79        1.1  kiyohara struct arm32_pci_chipset arm32_gtpci_chipset = {
     80        1.1  kiyohara 	NULL,	/* conf_v */
     81        1.1  kiyohara 	gtpci_attach_hook,
     82        1.1  kiyohara 	gtpci_bus_maxdevs,
     83        1.1  kiyohara 	gtpci_make_tag,
     84        1.1  kiyohara 	gtpci_decompose_tag,
     85  1.12.10.1  pgoyette 	NULL,	/* get_segment */
     86        1.1  kiyohara #if NGTPCI_MBUS > 0
     87        1.1  kiyohara 	gtpci_mbus_conf_read,		/* XXXX: always this functions */
     88        1.1  kiyohara 	gtpci_mbus_conf_write,
     89        1.1  kiyohara #else
     90        1.1  kiyohara 	gtpci_conf_read,
     91        1.1  kiyohara 	gtpci_conf_write,
     92        1.1  kiyohara #endif
     93        1.1  kiyohara 	NULL,	/* intr_v */
     94        1.1  kiyohara 	gtpci_gpp_intr_map,
     95        1.1  kiyohara 	gtpci_gpp_intr_string,
     96        1.1  kiyohara 	gtpci_gpp_intr_evcnt,
     97       1.12  jmcneill 	NULL,	/* intr_setattr */
     98        1.1  kiyohara 	gtpci_gpp_intr_establish,
     99        1.1  kiyohara 	gtpci_gpp_intr_disestablish,
    100        1.1  kiyohara #ifdef __HAVE_PCI_CONF_HOOK
    101        1.1  kiyohara 	gtpci_conf_hook,
    102        1.1  kiyohara #endif
    103        1.3      matt 	gtpci_conf_interrupt,
    104        1.1  kiyohara };
    105        1.1  kiyohara #endif
    106        1.1  kiyohara 
    107        1.1  kiyohara #if NMVPEX > 0
    108        1.1  kiyohara #if NMVPEX_MBUS > 0
    109        1.1  kiyohara static pcireg_t mvpex_mbus_conf_read(void *, pcitag_t, int);
    110        1.1  kiyohara #endif
    111        1.1  kiyohara 
    112        1.1  kiyohara struct arm32_pci_chipset arm32_mvpex0_chipset = {
    113        1.1  kiyohara 	NULL,	/* conf_v */
    114        1.1  kiyohara 	mvpex_attach_hook,
    115        1.1  kiyohara 	mvpex_bus_maxdevs,
    116        1.1  kiyohara 	mvpex_make_tag,
    117        1.1  kiyohara 	mvpex_decompose_tag,
    118  1.12.10.1  pgoyette 	NULL,	/* get_segment */
    119        1.1  kiyohara #if NMVPEX_MBUS > 0
    120        1.1  kiyohara 	mvpex_mbus_conf_read,		/* XXXX: always this functions */
    121        1.1  kiyohara #else
    122        1.1  kiyohara 	mvpex_conf_read,
    123        1.1  kiyohara #endif
    124        1.1  kiyohara 	mvpex_conf_write,
    125        1.1  kiyohara 	NULL,	/* intr_v */
    126        1.1  kiyohara 	mvpex_intr_map,
    127        1.1  kiyohara 	mvpex_intr_string,
    128        1.1  kiyohara 	mvpex_intr_evcnt,
    129       1.12  jmcneill 	NULL,	/* intr_setattr */
    130        1.1  kiyohara 	mvpex_intr_establish,
    131        1.1  kiyohara 	mvpex_intr_disestablish,
    132        1.1  kiyohara #ifdef __HAVE_PCI_CONF_HOOK
    133        1.1  kiyohara 	mvpex_conf_hook,
    134        1.1  kiyohara #endif
    135        1.5   rkujawa 	mvpex_conf_interrupt,
    136        1.1  kiyohara };
    137        1.1  kiyohara struct arm32_pci_chipset arm32_mvpex1_chipset = {
    138        1.1  kiyohara 	NULL,	/* conf_v */
    139        1.1  kiyohara 	mvpex_attach_hook,
    140        1.1  kiyohara 	mvpex_bus_maxdevs,
    141        1.1  kiyohara 	mvpex_make_tag,
    142        1.1  kiyohara 	mvpex_decompose_tag,
    143  1.12.10.1  pgoyette 	NULL,	/* get_segment */
    144        1.1  kiyohara #if NMVPEX_MBUS > 0
    145        1.1  kiyohara 	mvpex_mbus_conf_read,		/* XXXX: always this functions */
    146        1.1  kiyohara #else
    147        1.1  kiyohara 	mvpex_conf_read,
    148        1.1  kiyohara #endif
    149        1.1  kiyohara 	mvpex_conf_write,
    150        1.1  kiyohara 	NULL,	/* intr_v */
    151        1.1  kiyohara 	mvpex_intr_map,
    152        1.1  kiyohara 	mvpex_intr_string,
    153        1.1  kiyohara 	mvpex_intr_evcnt,
    154       1.12  jmcneill 	NULL,	/* intr_setattr */
    155        1.1  kiyohara 	mvpex_intr_establish,
    156        1.1  kiyohara 	mvpex_intr_disestablish,
    157        1.1  kiyohara #ifdef __HAVE_PCI_CONF_HOOK
    158        1.1  kiyohara 	mvpex_conf_hook,
    159        1.1  kiyohara #endif
    160        1.3      matt 	mvpex_conf_interrupt,
    161        1.1  kiyohara };
    162        1.5   rkujawa struct arm32_pci_chipset arm32_mvpex2_chipset = {
    163        1.5   rkujawa 	NULL,	/* conf_v */
    164        1.5   rkujawa 	mvpex_attach_hook,
    165        1.5   rkujawa 	mvpex_bus_maxdevs,
    166        1.5   rkujawa 	mvpex_make_tag,
    167        1.5   rkujawa 	mvpex_decompose_tag,
    168  1.12.10.1  pgoyette 	NULL,	/* get_segment */
    169        1.5   rkujawa #if NMVPEX_MBUS > 0
    170        1.5   rkujawa 	mvpex_mbus_conf_read,		/* XXXX: always this functions */
    171        1.5   rkujawa #else
    172        1.5   rkujawa 	mvpex_conf_read,
    173        1.1  kiyohara #endif
    174        1.5   rkujawa 	mvpex_conf_write,
    175        1.5   rkujawa 	NULL,	/* intr_v */
    176        1.5   rkujawa 	mvpex_intr_map,
    177        1.5   rkujawa 	mvpex_intr_string,
    178        1.5   rkujawa 	mvpex_intr_evcnt,
    179       1.12  jmcneill 	NULL,	/* intr_setattr */
    180        1.5   rkujawa 	mvpex_intr_establish,
    181        1.5   rkujawa 	mvpex_intr_disestablish,
    182        1.5   rkujawa #ifdef __HAVE_PCI_CONF_HOOK
    183        1.5   rkujawa 	mvpex_conf_hook,
    184        1.5   rkujawa #endif
    185        1.5   rkujawa 	mvpex_conf_interrupt,
    186        1.5   rkujawa };
    187        1.5   rkujawa struct arm32_pci_chipset arm32_mvpex3_chipset = {
    188        1.5   rkujawa 	NULL,	/* conf_v */
    189        1.5   rkujawa 	mvpex_attach_hook,
    190        1.5   rkujawa 	mvpex_bus_maxdevs,
    191        1.5   rkujawa 	mvpex_make_tag,
    192        1.5   rkujawa 	mvpex_decompose_tag,
    193  1.12.10.1  pgoyette 	NULL,	/* get_segment */
    194        1.5   rkujawa #if NMVPEX_MBUS > 0
    195        1.5   rkujawa 	mvpex_mbus_conf_read,		/* XXXX: always this functions */
    196        1.5   rkujawa #else
    197        1.5   rkujawa 	mvpex_conf_read,
    198        1.5   rkujawa #endif
    199        1.5   rkujawa 	mvpex_conf_write,
    200        1.5   rkujawa 	NULL,	/* intr_v */
    201        1.5   rkujawa 	mvpex_intr_map,
    202        1.5   rkujawa 	mvpex_intr_string,
    203        1.5   rkujawa 	mvpex_intr_evcnt,
    204       1.12  jmcneill 	NULL,	/* intr_setattr */
    205        1.5   rkujawa 	mvpex_intr_establish,
    206        1.5   rkujawa 	mvpex_intr_disestablish,
    207        1.5   rkujawa #ifdef __HAVE_PCI_CONF_HOOK
    208        1.5   rkujawa 	mvpex_conf_hook,
    209        1.5   rkujawa #endif
    210        1.5   rkujawa 	mvpex_conf_interrupt,
    211        1.5   rkujawa };
    212        1.5   rkujawa struct arm32_pci_chipset arm32_mvpex4_chipset = {
    213        1.5   rkujawa 	NULL,	/* conf_v */
    214        1.5   rkujawa 	mvpex_attach_hook,
    215        1.5   rkujawa 	mvpex_bus_maxdevs,
    216        1.5   rkujawa 	mvpex_make_tag,
    217        1.5   rkujawa 	mvpex_decompose_tag,
    218  1.12.10.1  pgoyette 	NULL,	/* get_segment */
    219        1.5   rkujawa #if NMVPEX_MBUS > 0
    220        1.5   rkujawa 	mvpex_mbus_conf_read,		/* XXXX: always this functions */
    221        1.5   rkujawa #else
    222        1.5   rkujawa 	mvpex_conf_read,
    223        1.5   rkujawa #endif
    224        1.5   rkujawa 	mvpex_conf_write,
    225        1.5   rkujawa 	NULL,	/* intr_v */
    226        1.5   rkujawa 	mvpex_intr_map,
    227        1.5   rkujawa 	mvpex_intr_string,
    228        1.5   rkujawa 	mvpex_intr_evcnt,
    229       1.12  jmcneill 	NULL,	/* intr_setattr */
    230        1.5   rkujawa 	mvpex_intr_establish,
    231        1.5   rkujawa 	mvpex_intr_disestablish,
    232        1.5   rkujawa #ifdef __HAVE_PCI_CONF_HOOK
    233        1.5   rkujawa 	mvpex_conf_hook,
    234        1.5   rkujawa #endif
    235        1.5   rkujawa 	mvpex_conf_interrupt,
    236        1.5   rkujawa };
    237        1.5   rkujawa struct arm32_pci_chipset arm32_mvpex5_chipset = {
    238        1.5   rkujawa 	NULL,	/* conf_v */
    239        1.5   rkujawa 	mvpex_attach_hook,
    240        1.5   rkujawa 	mvpex_bus_maxdevs,
    241        1.5   rkujawa 	mvpex_make_tag,
    242        1.5   rkujawa 	mvpex_decompose_tag,
    243  1.12.10.1  pgoyette 	NULL,	/* get_segment */
    244        1.5   rkujawa #if NMVPEX_MBUS > 0
    245        1.5   rkujawa 	mvpex_mbus_conf_read,		/* XXXX: always this functions */
    246        1.5   rkujawa #else
    247        1.5   rkujawa 	mvpex_conf_read,
    248        1.5   rkujawa #endif
    249        1.5   rkujawa 	mvpex_conf_write,
    250        1.5   rkujawa 	NULL,	/* intr_v */
    251        1.5   rkujawa 	mvpex_intr_map,
    252        1.5   rkujawa 	mvpex_intr_string,
    253        1.5   rkujawa 	mvpex_intr_evcnt,
    254       1.12  jmcneill 	NULL,	/* intr_setattr */
    255        1.5   rkujawa 	mvpex_intr_establish,
    256        1.5   rkujawa 	mvpex_intr_disestablish,
    257        1.5   rkujawa #ifdef __HAVE_PCI_CONF_HOOK
    258        1.5   rkujawa 	mvpex_conf_hook,
    259        1.5   rkujawa #endif
    260        1.5   rkujawa 	mvpex_conf_interrupt,
    261        1.5   rkujawa };
    262       1.11     skrll struct arm32_pci_chipset arm32_mvpex6_chipset = {
    263       1.11     skrll 	NULL,	/* conf_v */
    264       1.11     skrll 	mvpex_attach_hook,
    265       1.11     skrll 	mvpex_bus_maxdevs,
    266       1.11     skrll 	mvpex_make_tag,
    267       1.11     skrll 	mvpex_decompose_tag,
    268  1.12.10.1  pgoyette 	NULL,	/* get_segment */
    269       1.11     skrll #if NMVPEX_MBUS > 0
    270       1.11     skrll 	mvpex_mbus_conf_read,		/* XXXX: always this functions */
    271       1.11     skrll #else
    272       1.11     skrll 	mvpex_conf_read,
    273       1.11     skrll #endif
    274       1.11     skrll 	mvpex_conf_write,
    275       1.11     skrll 	NULL,	/* intr_v */
    276       1.11     skrll 	mvpex_intr_map,
    277       1.11     skrll 	mvpex_intr_string,
    278       1.11     skrll 	mvpex_intr_evcnt,
    279       1.12  jmcneill 	NULL,	/* intr_setattr */
    280       1.11     skrll 	mvpex_intr_establish,
    281       1.11     skrll 	mvpex_intr_disestablish,
    282       1.11     skrll #ifdef __HAVE_PCI_CONF_HOOK
    283       1.11     skrll 	mvpex_conf_hook,
    284       1.11     skrll #endif
    285       1.11     skrll 	mvpex_conf_interrupt,
    286       1.11     skrll };
    287        1.5   rkujawa #endif /* NMVPEX > 0 */
    288        1.1  kiyohara 
    289        1.4      matt #if NGTPCI > 0
    290        1.4      matt /* ARGSUSED */
    291        1.1  kiyohara void
    292        1.3      matt gtpci_conf_interrupt(void *v, int bus, int dev, int pin, int swiz, int *iline)
    293        1.1  kiyohara {
    294        1.1  kiyohara 
    295        1.1  kiyohara 	/* nothing */
    296        1.1  kiyohara }
    297        1.1  kiyohara 
    298        1.1  kiyohara #if NGTPCI_MBUS > 0
    299        1.1  kiyohara #define GTPCI_MBUS_CA		0x0c78	/* Configuration Address */
    300        1.1  kiyohara #define GTPCI_MBUS_CD		0x0c7c	/* Configuration Data */
    301        1.1  kiyohara 
    302        1.1  kiyohara static pcireg_t
    303        1.1  kiyohara gtpci_mbus_conf_read(void *v, pcitag_t tag, int reg)
    304        1.1  kiyohara {
    305        1.1  kiyohara 	struct gtpci_softc *sc = v;
    306        1.1  kiyohara 	const pcireg_t addr = tag | reg;
    307        1.1  kiyohara 
    308        1.9   msaitoh 	if ((unsigned int)reg >= PCI_CONF_SIZE)
    309        1.9   msaitoh 		return -1;
    310        1.9   msaitoh 
    311        1.1  kiyohara 	bus_space_write_4(sc->sc_iot, sc->sc_ioh, GTPCI_MBUS_CA,
    312        1.1  kiyohara 	    addr | GTPCI_CA_CONFIGEN);
    313        1.1  kiyohara 	if ((addr | GTPCI_CA_CONFIGEN) !=
    314        1.1  kiyohara 	    bus_space_read_4(sc->sc_iot, sc->sc_ioh, GTPCI_MBUS_CA))
    315        1.1  kiyohara 		return -1;
    316        1.1  kiyohara 
    317        1.1  kiyohara 	return bus_space_read_4(sc->sc_iot, sc->sc_ioh, GTPCI_MBUS_CD);
    318        1.1  kiyohara }
    319        1.1  kiyohara 
    320        1.1  kiyohara static void
    321        1.1  kiyohara gtpci_mbus_conf_write(void *v, pcitag_t tag, int reg, pcireg_t data)
    322        1.1  kiyohara {
    323        1.1  kiyohara 	struct gtpci_softc *sc = v;
    324        1.1  kiyohara 	pcireg_t addr = tag | (reg & 0xfc);
    325        1.1  kiyohara 
    326        1.9   msaitoh 	if ((unsigned int)reg >= PCI_CONF_SIZE)
    327        1.9   msaitoh 		return;
    328        1.9   msaitoh 
    329        1.1  kiyohara 	bus_space_write_4(sc->sc_iot, sc->sc_ioh, GTPCI_MBUS_CA,
    330        1.1  kiyohara 	    addr | GTPCI_CA_CONFIGEN);
    331        1.1  kiyohara 	if ((addr | GTPCI_CA_CONFIGEN) !=
    332        1.1  kiyohara 	    bus_space_read_4(sc->sc_iot, sc->sc_ioh, GTPCI_MBUS_CA))
    333        1.1  kiyohara 		return;
    334        1.1  kiyohara 
    335        1.1  kiyohara 	bus_space_write_4(sc->sc_iot, sc->sc_ioh, GTPCI_MBUS_CD, data);
    336        1.1  kiyohara }
    337        1.1  kiyohara #endif	/* NGTPCI_MBUS */
    338        1.1  kiyohara 
    339        1.1  kiyohara /*
    340        1.1  kiyohara  * We assume to use GPP interrupt as PCI interrupts.
    341        1.1  kiyohara  *   pci_intr_map() shall returns number of GPP between 0 and 31.  However
    342        1.1  kiyohara  *   returns 0xff, because we do not know the connected pin number for GPP
    343        1.1  kiyohara  *   of your board.
    344        1.1  kiyohara  *   pci_intr_string() shall returns string "gpp <num>".
    345        1.1  kiyohara  *   pci_intr_establish() established interrupt in the pin of all GPP.
    346        1.1  kiyohara  *   Moreover, the return value will be disregarded.  For instance, the
    347        1.1  kiyohara  *   setting for interrupt is not done.
    348        1.1  kiyohara  */
    349        1.1  kiyohara 
    350        1.1  kiyohara /* ARGSUSED */
    351        1.1  kiyohara static int
    352        1.2    dyoung gtpci_gpp_intr_map(const struct pci_attach_args *pa, pci_intr_handle_t *ihp)
    353        1.1  kiyohara {
    354        1.1  kiyohara 
    355        1.1  kiyohara 	*ihp = pa->pa_intrpin;
    356        1.1  kiyohara 	return 0;
    357        1.1  kiyohara }
    358        1.1  kiyohara 
    359        1.1  kiyohara /* ARGSUSED */
    360        1.1  kiyohara static const char *
    361        1.7  christos gtpci_gpp_intr_string(void *v, pci_intr_handle_t pin, char *buf, size_t len)
    362        1.1  kiyohara {
    363        1.1  kiyohara 	struct gtpci_softc *sc = v;
    364        1.1  kiyohara 	prop_array_t int2gpp;
    365        1.1  kiyohara 	prop_object_t gpp;
    366        1.1  kiyohara 
    367        1.1  kiyohara 	int2gpp = prop_dictionary_get(device_properties(sc->sc_dev), "int2gpp");
    368        1.1  kiyohara 	gpp = prop_array_get(int2gpp, pin);
    369        1.7  christos 	snprintf(buf, len, "gpp %d", (int)prop_number_integer_value(gpp));
    370        1.1  kiyohara 
    371        1.7  christos 	return buf;
    372        1.1  kiyohara }
    373        1.1  kiyohara 
    374        1.1  kiyohara /* ARGSUSED */
    375        1.1  kiyohara static const struct evcnt *
    376        1.1  kiyohara gtpci_gpp_intr_evcnt(void *v, pci_intr_handle_t pin)
    377        1.1  kiyohara {
    378        1.1  kiyohara 
    379        1.1  kiyohara 	return NULL;
    380        1.1  kiyohara }
    381        1.1  kiyohara 
    382        1.1  kiyohara static void *
    383        1.1  kiyohara gtpci_gpp_intr_establish(void *v, pci_intr_handle_t int_pin, int ipl,
    384  1.12.10.1  pgoyette 		         int (*intrhand)(void *), void *intrarg, const char *xname)
    385        1.1  kiyohara {
    386        1.1  kiyohara 	struct gtpci_softc *sc = v;
    387        1.1  kiyohara 	prop_array_t int2gpp;
    388        1.1  kiyohara 	prop_object_t gpp;
    389        1.1  kiyohara 	int gpp_pin;
    390        1.1  kiyohara 
    391        1.1  kiyohara 	int2gpp = prop_dictionary_get(device_properties(sc->sc_dev), "int2gpp");
    392        1.1  kiyohara 	gpp = prop_array_get(int2gpp, int_pin);
    393        1.1  kiyohara 	gpp_pin = prop_number_integer_value(gpp);
    394       1.10  kiyohara 	return mvsocgpp_intr_establish(gpp_pin, ipl, IST_LEVEL_LOW, intrhand,
    395       1.10  kiyohara 	    intrarg);
    396        1.1  kiyohara }
    397        1.1  kiyohara 
    398        1.1  kiyohara static void
    399        1.1  kiyohara gtpci_gpp_intr_disestablish(void *v, void *ih)
    400        1.1  kiyohara {
    401        1.1  kiyohara 
    402        1.1  kiyohara 	mvsocgpp_intr_disestablish(ih);
    403        1.1  kiyohara }
    404        1.1  kiyohara #endif
    405        1.1  kiyohara 
    406        1.1  kiyohara #if NMVPEX_MBUS > 0
    407        1.4      matt /* ARGSUSED */
    408        1.4      matt void
    409        1.4      matt mvpex_conf_interrupt(void *v, int bus, int dev, int ipin, int swiz, int *ilinep)
    410        1.4      matt {
    411        1.4      matt 
    412        1.4      matt 	/* nothing */
    413        1.4      matt }
    414        1.4      matt 
    415        1.1  kiyohara static pcireg_t
    416        1.1  kiyohara mvpex_mbus_conf_read(void *v, pcitag_t tag, int reg)
    417        1.1  kiyohara {
    418        1.1  kiyohara 	struct mvpex_softc *sc = v;
    419        1.1  kiyohara 	pcireg_t addr, data, pci_cs;
    420        1.1  kiyohara 	uint32_t stat;
    421        1.1  kiyohara 	int bus, dev, func, pexbus, pexdev;
    422        1.1  kiyohara 
    423        1.9   msaitoh 	if ((unsigned int)reg >= PCI_CONF_SIZE)
    424        1.9   msaitoh 		return -1;
    425        1.9   msaitoh 
    426        1.1  kiyohara 	mvpex_decompose_tag(v, tag, &bus, &dev, &func);
    427        1.1  kiyohara 
    428        1.1  kiyohara 	stat = bus_space_read_4(sc->sc_iot, sc->sc_ioh, MVPEX_STAT);
    429        1.1  kiyohara 	pexbus = MVPEX_STAT_PEXBUSNUM(stat);
    430        1.1  kiyohara 	pexdev = MVPEX_STAT_PEXDEVNUM(stat);
    431        1.1  kiyohara 	if (bus != pexbus || dev != pexdev)
    432        1.1  kiyohara 		if (stat & MVPEX_STAT_DLDOWN)
    433        1.1  kiyohara 			return -1;
    434        1.1  kiyohara 
    435        1.1  kiyohara 	if (bus == pexbus) {
    436        1.1  kiyohara 		if (pexdev == 0) {
    437        1.1  kiyohara 			if (dev != 1 && dev != pexdev)
    438        1.1  kiyohara 				return -1;
    439        1.1  kiyohara 		} else {
    440        1.1  kiyohara 			if (dev != 0 && dev != pexdev)
    441        1.1  kiyohara 				return -1;
    442        1.1  kiyohara 		}
    443        1.1  kiyohara 		if (func != 0)
    444        1.1  kiyohara 			return -1;
    445        1.1  kiyohara 	}
    446        1.1  kiyohara 
    447        1.1  kiyohara 	addr = ((reg & 0xf00) << 24)  | tag | (reg & 0xfc);
    448        1.1  kiyohara 
    449        1.1  kiyohara #if defined(ORION)
    450        1.1  kiyohara 	/*
    451        1.1  kiyohara 	 * Guideline (GL# PCI Express-1) Erroneous Read Data on Configuration
    452        1.1  kiyohara 	 * This guideline is relevant for all devices except of the following
    453        1.1  kiyohara 	 * devices:
    454        1.1  kiyohara 	 *     88F5281-BO and above, and 88F5181L-A0 and above
    455        1.1  kiyohara 	 */
    456        1.1  kiyohara 	if ((bus != pexbus || dev != pexdev) &&
    457        1.1  kiyohara 	    !(sc->sc_model == MARVELL_ORION_2_88F5281 && sc->sc_rev == 1) &&
    458        1.1  kiyohara 	    !(sc->sc_model == MARVELL_ORION_1_88F5181 && sc->sc_rev == 8)) {
    459        1.1  kiyohara 
    460        1.1  kiyohara 		/* PCI-Express configuration read work-around */
    461        1.1  kiyohara 		/*
    462        1.1  kiyohara 		 * We will use one of the Punit (AHBToMbus) windows to
    463        1.1  kiyohara 		 * access the xbar and read the data from there
    464        1.1  kiyohara 		 *
    465        1.1  kiyohara 		 * Need to configure the 2 free Punit (AHB to MBus bridge)
    466        1.1  kiyohara 		 * address decoding windows:
    467        1.1  kiyohara 		 * Configure the flash Window to handle Configuration space
    468        1.1  kiyohara 		 * requests for PEX0/1:
    469        1.1  kiyohara 		 *
    470        1.1  kiyohara 		 * Configuration transactions from the CPU should write/read
    471        1.1  kiyohara 		 * the data to/from address of the form:
    472        1.1  kiyohara 		 *	addr[31:28]: 0x5 (for PEX0) or 0x6 (for PEX1)
    473        1.1  kiyohara 		 *	addr[27:24]: extended register number
    474        1.1  kiyohara 		 *	addr[23:16]: bus number
    475        1.1  kiyohara 		 *	addr[15:11]: device number
    476        1.1  kiyohara 		 *	addr[10: 8]: function number
    477        1.1  kiyohara 		 *	addr[ 7: 0]: register number
    478        1.1  kiyohara 		 */
    479        1.1  kiyohara 
    480        1.1  kiyohara 		struct mvsoc_softc *soc =
    481        1.1  kiyohara 		    device_private(device_parent(sc->sc_dev));;
    482        1.1  kiyohara 		bus_space_handle_t pcicfg_ioh;
    483        1.1  kiyohara 		uint32_t remapl, remaph, wc, pcicfg_addr, pcicfg_size;
    484        1.1  kiyohara 		int window, target, attr, base, size, s;
    485        1.1  kiyohara 		const int pex_pcicfg_tag =
    486        1.1  kiyohara 		    (sc->sc_model == MARVELL_ORION_1_88F1181) ?
    487        1.1  kiyohara 		    ORION_TAG_FLASH_CS : ORION_TAG_PEX0_MEM;
    488        1.1  kiyohara 
    489        1.1  kiyohara 		window = mvsoc_target(pex_pcicfg_tag,
    490        1.1  kiyohara 		    &target, &attr, &base, &size);
    491        1.1  kiyohara 		if (window >= nwindow) {
    492        1.1  kiyohara 			aprint_error_dev(sc->sc_dev,
    493        1.1  kiyohara 			    "can't read pcicfg space\n");
    494        1.1  kiyohara 			return -1;
    495        1.1  kiyohara 		}
    496        1.1  kiyohara 
    497        1.1  kiyohara 		s = splhigh();
    498        1.1  kiyohara 
    499        1.1  kiyohara 		remapl = remaph = 0;
    500        1.1  kiyohara 		if (window == 0 || window == 1) {
    501        1.1  kiyohara 			remapl = read_mlmbreg(MVSOC_MLMB_WRLR(window));
    502        1.1  kiyohara 			remaph = read_mlmbreg(MVSOC_MLMB_WRHR(window));
    503        1.1  kiyohara 		}
    504        1.1  kiyohara 
    505        1.1  kiyohara 		wc =
    506        1.1  kiyohara 		    MVSOC_MLMB_WCR_WINEN			|
    507        1.1  kiyohara 		    MVSOC_MLMB_WCR_ATTR(ORION_ATTR_PEX_CFG)	|
    508        1.1  kiyohara 		    MVSOC_MLMB_WCR_TARGET((soc->sc_addr + sc->sc_offset) >> 16);
    509        1.1  kiyohara 		if (sc->sc_model == MARVELL_ORION_1_88F1181) {
    510        1.1  kiyohara 			pcicfg_addr = base;
    511        1.1  kiyohara 			pcicfg_size = size;
    512        1.1  kiyohara 		} else if (sc->sc_model == MARVELL_ORION_1_88F5182) {
    513        1.1  kiyohara #define PEX_PCICFG_RW_WA_BASE		0x50000000
    514        1.1  kiyohara #define PEX_PCICFG_RW_WA_5182_BASE	0xf0000000
    515        1.1  kiyohara #define PEX_PCICFG_RW_WA_SIZE		(16 * 1024 * 1024)
    516        1.1  kiyohara 			pcicfg_addr = PEX_PCICFG_RW_WA_5182_BASE;
    517        1.1  kiyohara 			pcicfg_size = PEX_PCICFG_RW_WA_SIZE;
    518        1.1  kiyohara 		} else {
    519        1.1  kiyohara 			pcicfg_addr = PEX_PCICFG_RW_WA_BASE;
    520        1.1  kiyohara 			pcicfg_size = PEX_PCICFG_RW_WA_SIZE;
    521        1.1  kiyohara 		}
    522        1.1  kiyohara 		write_mlmbreg(MVSOC_MLMB_WCR(window),
    523        1.1  kiyohara 		    wc | MVSOC_MLMB_WCR_SIZE(pcicfg_size));
    524        1.1  kiyohara 		write_mlmbreg(MVSOC_MLMB_WBR(window), pcicfg_addr);
    525        1.1  kiyohara 
    526        1.1  kiyohara 		if (window == 0 || window == 1) {
    527        1.1  kiyohara 			write_mlmbreg(MVSOC_MLMB_WRLR(window), pcicfg_addr);
    528        1.1  kiyohara 			write_mlmbreg(MVSOC_MLMB_WRHR(window), 0);
    529        1.1  kiyohara 		}
    530        1.1  kiyohara 
    531        1.1  kiyohara 		if (bus_space_map(sc->sc_iot, pcicfg_addr, pcicfg_size, 0,
    532        1.1  kiyohara 		    &pcicfg_ioh) == 0) {
    533        1.1  kiyohara 			data = bus_space_read_4(sc->sc_iot, pcicfg_ioh, addr);
    534        1.1  kiyohara 			bus_space_unmap(sc->sc_iot, pcicfg_ioh, pcicfg_size);
    535        1.1  kiyohara 		} else
    536        1.1  kiyohara 			data = -1;
    537        1.1  kiyohara 
    538        1.1  kiyohara 		write_mlmbreg(MVSOC_MLMB_WCR(window),
    539        1.1  kiyohara 		    MVSOC_MLMB_WCR_WINEN		|
    540        1.1  kiyohara 		    MVSOC_MLMB_WCR_ATTR(attr)		|
    541        1.1  kiyohara 		    MVSOC_MLMB_WCR_TARGET(target)	|
    542        1.1  kiyohara 		    MVSOC_MLMB_WCR_SIZE(size));
    543        1.1  kiyohara 		write_mlmbreg(MVSOC_MLMB_WBR(window), base);
    544        1.1  kiyohara 		if (window == 0 || window == 1) {
    545        1.1  kiyohara 			write_mlmbreg(MVSOC_MLMB_WRLR(window), remapl);
    546        1.1  kiyohara 			write_mlmbreg(MVSOC_MLMB_WRHR(window), remaph);
    547        1.1  kiyohara 		}
    548        1.1  kiyohara 
    549        1.1  kiyohara 		splx(s);
    550        1.1  kiyohara #else
    551        1.1  kiyohara 	if (0) {
    552        1.1  kiyohara #endif
    553        1.1  kiyohara 	} else {
    554        1.1  kiyohara 		bus_space_write_4(sc->sc_iot, sc->sc_ioh, MVPEX_CA,
    555        1.1  kiyohara 		    addr | MVPEX_CA_CONFIGEN);
    556        1.1  kiyohara 		if ((addr | MVPEX_CA_CONFIGEN) !=
    557        1.1  kiyohara 		    bus_space_read_4(sc->sc_iot, sc->sc_ioh, MVPEX_CA))
    558        1.1  kiyohara 			return -1;
    559        1.1  kiyohara 
    560        1.1  kiyohara 		pci_cs = bus_space_read_4(sc->sc_iot, sc->sc_ioh,
    561        1.1  kiyohara 		    PCI_COMMAND_STATUS_REG);
    562        1.1  kiyohara 		bus_space_write_4(sc->sc_iot, sc->sc_ioh,
    563        1.1  kiyohara 		    PCI_COMMAND_STATUS_REG, pci_cs | PCI_STATUS_MASTER_ABORT);
    564        1.1  kiyohara 
    565        1.1  kiyohara 		data = bus_space_read_4(sc->sc_iot, sc->sc_ioh, MVPEX_CD);
    566        1.1  kiyohara 	}
    567        1.1  kiyohara 
    568        1.1  kiyohara 	return data;
    569        1.1  kiyohara }
    570        1.1  kiyohara #endif
    571