xref: /openbsd-src/sys/arch/octeon/dev/octpip.c (revision ef1f2cdcbf719afc80ccde37b040451b90e99902)
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