1*ef1f2cdcSvisa /* $OpenBSD: octpip.c,v 1.3 2020/09/08 13:54:48 visa Exp $ */
24c424640Svisa
34c424640Svisa /*
44c424640Svisa * Copyright (c) 2019 Visa Hankala
54c424640Svisa *
64c424640Svisa * Permission to use, copy, modify, and/or distribute this software for any
74c424640Svisa * purpose with or without fee is hereby granted, provided that the above
84c424640Svisa * copyright notice and this permission notice appear in all copies.
94c424640Svisa *
104c424640Svisa * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
114c424640Svisa * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
124c424640Svisa * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
134c424640Svisa * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
144c424640Svisa * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
154c424640Svisa * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
164c424640Svisa * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
174c424640Svisa */
184c424640Svisa
194c424640Svisa #include <sys/param.h>
204c424640Svisa #include <sys/systm.h>
214c424640Svisa #include <sys/device.h>
224c424640Svisa
234c424640Svisa #include <dev/ofw/fdt.h>
244c424640Svisa #include <dev/ofw/openfirm.h>
254c424640Svisa
264c424640Svisa #include <machine/fdt.h>
274c424640Svisa
284c424640Svisa #include <octeon/dev/iobusvar.h>
294c424640Svisa #include <octeon/dev/cn30xxgmxreg.h>
304c424640Svisa
314c424640Svisa struct octpip_softc {
324c424640Svisa struct device sc_dev;
334c424640Svisa };
344c424640Svisa
354c424640Svisa int octpip_match(struct device *, void *, void *);
364c424640Svisa void octpip_attach(struct device *, struct device *, void *);
374c424640Svisa int octpip_print(void *, const char *);
384c424640Svisa
394c424640Svisa const struct cfattach octpip_ca = {
404c424640Svisa sizeof(struct octpip_softc), octpip_match, octpip_attach
414c424640Svisa };
424c424640Svisa
434c424640Svisa struct cfdriver octpip_cd = {
444c424640Svisa NULL, "octpip", DV_DULL
454c424640Svisa };
464c424640Svisa
474c424640Svisa int
octpip_match(struct device * parent,void * match,void * aux)484c424640Svisa octpip_match(struct device *parent, void *match, void *aux)
494c424640Svisa {
504c424640Svisa struct fdt_attach_args *faa = aux;
514c424640Svisa
524c424640Svisa return OF_is_compatible(faa->fa_node, "cavium,octeon-3860-pip");
534c424640Svisa }
544c424640Svisa
554c424640Svisa void
octpip_attach(struct device * parent,struct device * self,void * aux)564c424640Svisa octpip_attach(struct device *parent, struct device *self, void *aux)
574c424640Svisa {
584c424640Svisa struct iobus_attach_args iaa;
594c424640Svisa struct fdt_attach_args *faa = aux;
60*ef1f2cdcSvisa paddr_t addr;
614c424640Svisa uint32_t ifindex;
624c424640Svisa int node;
634c424640Svisa
644c424640Svisa printf("\n");
654c424640Svisa
664c424640Svisa for (node = OF_child(faa->fa_node); node != 0; node = OF_peer(node)) {
674c424640Svisa if (!OF_is_compatible(node, "cavium,octeon-3860-pip-interface"))
684c424640Svisa continue;
69*ef1f2cdcSvisa
704c424640Svisa ifindex = OF_getpropint(node, "reg", (uint32_t)-1);
71*ef1f2cdcSvisa if (ifindex < 2)
72*ef1f2cdcSvisa addr = GMX0_BASE_PORT0 + GMX_BLOCK_SIZE * ifindex;
73*ef1f2cdcSvisa else if (ifindex == 4)
74*ef1f2cdcSvisa addr = AGL_BASE;
75*ef1f2cdcSvisa else
764c424640Svisa continue;
77*ef1f2cdcSvisa
784c424640Svisa memset(&iaa, 0, sizeof(iaa));
79874cea07Sderaadt iaa.aa_name = "octgmx";
804c424640Svisa iaa.aa_bust = faa->fa_iot;
814c424640Svisa iaa.aa_dmat = faa->fa_dmat;
82*ef1f2cdcSvisa iaa.aa_addr = addr;
834c424640Svisa iaa.aa_irq = -1;
844c424640Svisa iaa.aa_unitno = ifindex;
854c424640Svisa config_found(self, &iaa, octpip_print);
864c424640Svisa }
874c424640Svisa }
884c424640Svisa
894c424640Svisa int
octpip_print(void * aux,const char * parentname)904c424640Svisa octpip_print(void *aux, const char *parentname)
914c424640Svisa {
924c424640Svisa struct iobus_attach_args *iaa = aux;
934c424640Svisa
944c424640Svisa if (parentname != NULL)
954c424640Svisa printf("%s at %s", iaa->aa_name, parentname);
964c424640Svisa printf(" interface %d", iaa->aa_unitno);
974c424640Svisa
984c424640Svisa return UNCONF;
994c424640Svisa }
100