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