xref: /openbsd-src/sys/dev/pci/gcu.c (revision 0f9e9ec23bb2b65cc62a3d17df12827a45dae80c)
1*0f9e9ec2Sjsg /*	$OpenBSD: gcu.c,v 1.7 2024/05/13 01:15:51 jsg Exp $	*/
2391fd4d0Sdms 
3391fd4d0Sdms /*
4391fd4d0Sdms  * Copyright (c) 2009 Dariusz Swiderski <sfires@sfires.net>
5391fd4d0Sdms  *
6391fd4d0Sdms  * Permission to use, copy, modify, and distribute this software for any
7391fd4d0Sdms  * purpose with or without fee is hereby granted, provided that the above
8391fd4d0Sdms  * copyright notice and this permission notice appear in all copies.
9391fd4d0Sdms  *
10391fd4d0Sdms  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11391fd4d0Sdms  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12391fd4d0Sdms  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13391fd4d0Sdms  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14391fd4d0Sdms  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15391fd4d0Sdms  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16391fd4d0Sdms  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17391fd4d0Sdms  */
18391fd4d0Sdms 
19391fd4d0Sdms /*
204b1a56afSjsg  * Driver for a GCU device that appears on embedded intel systems, like 80579
21391fd4d0Sdms  */
22391fd4d0Sdms 
23391fd4d0Sdms #include <sys/param.h>
24391fd4d0Sdms #include <sys/systm.h>
25391fd4d0Sdms #include <sys/device.h>
26391fd4d0Sdms 
27391fd4d0Sdms #include <dev/pci/pcireg.h>
28391fd4d0Sdms #include <dev/pci/pcivar.h>
29391fd4d0Sdms 
30391fd4d0Sdms #include <dev/pci/pcidevs.h>
319a3b8ae2Sderaadt #include <dev/pci/gcu_var.h>
32391fd4d0Sdms 
33391fd4d0Sdms int gcu_probe(struct device *, void *, void *);
34391fd4d0Sdms void gcu_attach(struct device *, struct device *, void *);
35391fd4d0Sdms 
36391fd4d0Sdms const struct pci_matchid gcu_devices[] = {
37391fd4d0Sdms 	{ PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_EP80579_GCU }
38391fd4d0Sdms };
39391fd4d0Sdms 
40391fd4d0Sdms struct cfdriver gcu_cd = {
41391fd4d0Sdms 	NULL, "gcu", DV_IFNET
42391fd4d0Sdms };
43391fd4d0Sdms 
448d2c75e4Smpi const struct cfattach gcu_ca = {
45391fd4d0Sdms 	sizeof(struct gcu_softc), gcu_probe, gcu_attach
46391fd4d0Sdms };
47391fd4d0Sdms 
48391fd4d0Sdms int
gcu_probe(struct device * parent,void * match,void * aux)49391fd4d0Sdms gcu_probe(struct device *parent, void *match, void *aux)
50391fd4d0Sdms {
51391fd4d0Sdms 	return (pci_matchbyid((struct pci_attach_args *)aux, gcu_devices,
52299fb045Sjasper 	    nitems(gcu_devices)));
53391fd4d0Sdms }
54391fd4d0Sdms 
55391fd4d0Sdms void
gcu_attach(struct device * parent,struct device * self,void * aux)56391fd4d0Sdms gcu_attach(struct device *parent, struct device *self, void *aux)
57391fd4d0Sdms {
58391fd4d0Sdms 	struct gcu_softc *sc = (struct gcu_softc *)self;
59391fd4d0Sdms 	struct pci_attach_args *pa = aux;
60391fd4d0Sdms 	int val;
61391fd4d0Sdms 
621caedb58Sdms 	val = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_MAPREG_START);
63391fd4d0Sdms 	if (PCI_MAPREG_TYPE(val) != PCI_MAPREG_TYPE_MEM) {
64391fd4d0Sdms 		printf(": mmba is not mem space\n");
65391fd4d0Sdms 		return;
66391fd4d0Sdms 	}
67391fd4d0Sdms 
68391fd4d0Sdms 	if (pci_mapreg_map(pa, 0x10, PCI_MAPREG_MEM_TYPE(val), 0, &sc->tag,
69391fd4d0Sdms 	    &sc->handle, &sc->addr, &sc->size, 0)) {
70391fd4d0Sdms 		printf(": cannot find mem space\n");
71391fd4d0Sdms 		return;
72391fd4d0Sdms 	}
73391fd4d0Sdms 
74391fd4d0Sdms 	mtx_init(&sc->mdio_mtx, IPL_NET);
75391fd4d0Sdms 
76391fd4d0Sdms 	printf("\n");
77391fd4d0Sdms }
78