xref: /netbsd-src/sys/arch/evbmips/loongson/dev/gcscpcib_pci.c (revision c865d5f42312d1ee2f6e7c6b7c4369aabae2f95d)
1*c865d5f4Sandvar /* $NetBSD: gcscpcib_pci.c,v 1.3 2024/02/02 22:14:04 andvar Exp $ */
2ccb3b2f2Sbouyer /* $OpenBSD: gcscpcib.c,v 1.6 2007/11/17 17:02:47 mbalmer Exp $	*/
3ccb3b2f2Sbouyer 
4ccb3b2f2Sbouyer /*
5ccb3b2f2Sbouyer  * Copyright (c) 2008 Yojiro UO <yuo@nui.org>
6ccb3b2f2Sbouyer  * Copyright (c) 2007 Marc Balmer <mbalmer@openbsd.org>
7ccb3b2f2Sbouyer  * Copyright (c) 2007 Michael Shalayeff
8ccb3b2f2Sbouyer  * All rights reserved.
9ccb3b2f2Sbouyer  *
10ccb3b2f2Sbouyer  * Permission to use, copy, modify, and distribute this software for any
11ccb3b2f2Sbouyer  * purpose with or without fee is hereby granted, provided that the above
12ccb3b2f2Sbouyer  * copyright notice and this permission notice appear in all copies.
13ccb3b2f2Sbouyer  *
14ccb3b2f2Sbouyer  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
15ccb3b2f2Sbouyer  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
16ccb3b2f2Sbouyer  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
17ccb3b2f2Sbouyer  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
18ccb3b2f2Sbouyer  * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER IN
19ccb3b2f2Sbouyer  * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
20ccb3b2f2Sbouyer  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
21ccb3b2f2Sbouyer  */
22ccb3b2f2Sbouyer 
23ccb3b2f2Sbouyer /*
24ccb3b2f2Sbouyer  * AMD CS5535/CS5536 series LPC bridge also containing timer, watchdog and GPIO.
25*c865d5f4Sandvar  * machine-dependent attachment.
26ccb3b2f2Sbouyer  */
27ccb3b2f2Sbouyer #include <sys/cdefs.h>
28*c865d5f4Sandvar __KERNEL_RCSID(0, "$NetBSD: gcscpcib_pci.c,v 1.3 2024/02/02 22:14:04 andvar Exp $");
29ccb3b2f2Sbouyer 
30ccb3b2f2Sbouyer 
31ccb3b2f2Sbouyer #include <sys/param.h>
32ccb3b2f2Sbouyer #include <sys/systm.h>
33ccb3b2f2Sbouyer #include <sys/device.h>
34ccb3b2f2Sbouyer #include <sys/gpio.h>
35ccb3b2f2Sbouyer #include <sys/timetc.h>
36ccb3b2f2Sbouyer #include <sys/wdog.h>
37ccb3b2f2Sbouyer 
38ccb3b2f2Sbouyer #include <sys/bus.h>
39ccb3b2f2Sbouyer 
40ccb3b2f2Sbouyer #include <dev/pci/pcireg.h>
41ccb3b2f2Sbouyer #include <dev/pci/pcivar.h>
42ccb3b2f2Sbouyer #include <dev/pci/pcidevs.h>
43ccb3b2f2Sbouyer 
44ccb3b2f2Sbouyer #include <dev/gpio/gpiovar.h>
45ccb3b2f2Sbouyer #include <dev/sysmon/sysmonvar.h>
46ccb3b2f2Sbouyer #include <dev/ic/gcscpcibreg.h>
47ccb3b2f2Sbouyer #include <dev/ic/gcscpcibvar.h>
48ccb3b2f2Sbouyer 
49ccb3b2f2Sbouyer #include <evbmips/loongson/dev/glxvar.h>
50ccb3b2f2Sbouyer #include <evbmips/loongson/dev/pcibvar.h>
51ccb3b2f2Sbouyer 
52ccb3b2f2Sbouyer struct gcscpcib_pci_softc {
53ccb3b2f2Sbouyer         /* we call pcibattach() which assumes softc starts like this: */
54ccb3b2f2Sbouyer 	struct pcib_softc       sc_pcib;
55ccb3b2f2Sbouyer 	/* MI gcscpcib datas */
56ccb3b2f2Sbouyer 	struct gcscpcib_softc	sc_gcscpcib;
57ccb3b2f2Sbouyer };
58ccb3b2f2Sbouyer 
59ccb3b2f2Sbouyer static int      gcscpcib_pci_match(device_t, cfdata_t, void *);
60ccb3b2f2Sbouyer static void     gcscpcib_pci_attach(device_t, device_t, void *);
61ccb3b2f2Sbouyer 
62ccb3b2f2Sbouyer CFATTACH_DECL_NEW(gcscpcib_pci, sizeof(struct gcscpcib_pci_softc),
63ccb3b2f2Sbouyer         gcscpcib_pci_match, gcscpcib_pci_attach, NULL, NULL);
64ccb3b2f2Sbouyer 
65ccb3b2f2Sbouyer 
66ccb3b2f2Sbouyer static int
gcscpcib_pci_match(device_t parent,cfdata_t match,void * aux)67ccb3b2f2Sbouyer gcscpcib_pci_match(device_t parent, cfdata_t match, void *aux)
68ccb3b2f2Sbouyer {
69ccb3b2f2Sbouyer 	struct pci_attach_args *pa = aux;
70ccb3b2f2Sbouyer 
71ccb3b2f2Sbouyer 	if (PCI_CLASS(pa->pa_class) != PCI_CLASS_BRIDGE ||
72ccb3b2f2Sbouyer 	    PCI_SUBCLASS(pa->pa_class) != PCI_SUBCLASS_BRIDGE_ISA)
73ccb3b2f2Sbouyer 		return 0;
74ccb3b2f2Sbouyer 
75ccb3b2f2Sbouyer 	switch (PCI_PRODUCT(pa->pa_id)) {
76ccb3b2f2Sbouyer 	case PCI_PRODUCT_NS_CS5535_ISA:
77ccb3b2f2Sbouyer 	case PCI_PRODUCT_AMD_CS5536_PCIB:
78ccb3b2f2Sbouyer 		return 2;	/* supersede pcib(4) */
79ccb3b2f2Sbouyer 	}
80ccb3b2f2Sbouyer 
81ccb3b2f2Sbouyer 	return 0;
82ccb3b2f2Sbouyer }
83ccb3b2f2Sbouyer 
84ccb3b2f2Sbouyer static void
gcscpcib_pci_attach(device_t parent,device_t self,void * aux)85ccb3b2f2Sbouyer gcscpcib_pci_attach(device_t parent, device_t self, void *aux)
86ccb3b2f2Sbouyer {
87ccb3b2f2Sbouyer 	struct gcscpcib_pci_softc *sc = device_private(self);
88ccb3b2f2Sbouyer 	struct pci_attach_args *pa = (struct pci_attach_args *)aux;
89ccb3b2f2Sbouyer 
90ccb3b2f2Sbouyer 	sc->sc_pcib.sc_pc = pa->pa_pc;
91ccb3b2f2Sbouyer 	sc->sc_pcib.sc_tag = pa->pa_tag;
92ccb3b2f2Sbouyer 	/* Attach the PCI-ISA bridge at first */
93ccb3b2f2Sbouyer 	pcibattach(parent, self, aux);
94ccb3b2f2Sbouyer 	/* then attach gcscpcib itself */
952fba875aSbouyer 	gcscpcib_attach(self, &sc->sc_gcscpcib, pa->pa_iot, GCSCATTACH_NO_WDT);
96ccb3b2f2Sbouyer }
97ccb3b2f2Sbouyer 
98ccb3b2f2Sbouyer uint64_t
gcsc_rdmsr(uint msr)99ccb3b2f2Sbouyer gcsc_rdmsr(uint msr)
100ccb3b2f2Sbouyer {
101ccb3b2f2Sbouyer 	return rdmsr(msr);
102ccb3b2f2Sbouyer }
103ccb3b2f2Sbouyer 
104ccb3b2f2Sbouyer void
gcsc_wrmsr(uint msr,uint64_t v)105ccb3b2f2Sbouyer gcsc_wrmsr(uint msr, uint64_t v)
106ccb3b2f2Sbouyer {
107ccb3b2f2Sbouyer 	wrmsr(msr, v);
108ccb3b2f2Sbouyer }
109