1*3a3d566bSjsg /* $OpenBSD: ahci_acpi.c,v 1.6 2024/10/09 00:38:25 jsg Exp $ */ 24acbabfbSkettenis /* 34acbabfbSkettenis * Copyright (c) 2018 Mark Kettenis 44acbabfbSkettenis * 54acbabfbSkettenis * Permission to use, copy, modify, and distribute this software for any 64acbabfbSkettenis * purpose with or without fee is hereby granted, provided that the above 74acbabfbSkettenis * copyright notice and this permission notice appear in all copies. 84acbabfbSkettenis * 94acbabfbSkettenis * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 104acbabfbSkettenis * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 114acbabfbSkettenis * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 124acbabfbSkettenis * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 134acbabfbSkettenis * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 144acbabfbSkettenis * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 154acbabfbSkettenis * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 164acbabfbSkettenis */ 174acbabfbSkettenis 184acbabfbSkettenis #include <sys/param.h> 194acbabfbSkettenis #include <sys/malloc.h> 204acbabfbSkettenis #include <sys/systm.h> 214acbabfbSkettenis 224acbabfbSkettenis #include <dev/acpi/acpireg.h> 234acbabfbSkettenis #include <dev/acpi/acpivar.h> 244acbabfbSkettenis #include <dev/acpi/acpidev.h> 254acbabfbSkettenis #include <dev/acpi/amltypes.h> 264acbabfbSkettenis #include <dev/acpi/dsdt.h> 274acbabfbSkettenis 284acbabfbSkettenis #undef DEVNAME 294acbabfbSkettenis #include <dev/ic/ahcireg.h> 304acbabfbSkettenis #include <dev/ic/ahcivar.h> 314acbabfbSkettenis 324acbabfbSkettenis struct ahci_acpi_softc { 334acbabfbSkettenis struct ahci_softc sc; 344acbabfbSkettenis struct acpi_softc *sc_acpi; 354acbabfbSkettenis struct aml_node *sc_node; 364acbabfbSkettenis void *sc_ih; 374acbabfbSkettenis }; 384acbabfbSkettenis 394acbabfbSkettenis int ahci_acpi_match(struct device *, void *, void *); 404acbabfbSkettenis void ahci_acpi_attach(struct device *, struct device *, void *); 414acbabfbSkettenis 42471aeecfSnaddy const struct cfattach ahci_acpi_ca = { 43*3a3d566bSjsg sizeof(struct ahci_acpi_softc), ahci_acpi_match, ahci_acpi_attach, 44*3a3d566bSjsg NULL, ahci_activate 454acbabfbSkettenis }; 464acbabfbSkettenis 474acbabfbSkettenis int 484acbabfbSkettenis ahci_acpi_match(struct device *parent, void *match, void *aux) 494acbabfbSkettenis { 504acbabfbSkettenis struct acpi_attach_args *aaa = aux; 514acbabfbSkettenis 5257ec0946Skettenis if (aaa->aaa_naddr < 1 || aaa->aaa_nirq < 1) 5357ec0946Skettenis return 0; 54e3ba7f78Skettenis return acpi_matchcls(aaa, PCI_CLASS_MASS_STORAGE, 55e3ba7f78Skettenis PCI_SUBCLASS_MASS_STORAGE_SATA, PCI_INTERFACE_SATA_AHCI10); 564acbabfbSkettenis } 574acbabfbSkettenis 584acbabfbSkettenis void 594acbabfbSkettenis ahci_acpi_attach(struct device *parent, struct device *self, void *aux) 604acbabfbSkettenis { 614acbabfbSkettenis struct ahci_acpi_softc *sc = (struct ahci_acpi_softc *)self; 62f09f3dbfSkettenis struct acpi_attach_args *aaa = aux; 634acbabfbSkettenis 644acbabfbSkettenis sc->sc_acpi = (struct acpi_softc *)parent; 654acbabfbSkettenis sc->sc_node = aaa->aaa_node; 664acbabfbSkettenis printf(" %s", sc->sc_node->name); 674acbabfbSkettenis 68f09f3dbfSkettenis printf(" addr 0x%llx/0x%llx", aaa->aaa_addr[0], aaa->aaa_size[0]); 69f09f3dbfSkettenis printf(" irq %d", aaa->aaa_irq[0]); 704acbabfbSkettenis 71f09f3dbfSkettenis sc->sc.sc_iot = aaa->aaa_bst[0]; 72f09f3dbfSkettenis sc->sc.sc_ios = aaa->aaa_size[0]; 734acbabfbSkettenis sc->sc.sc_dmat = aaa->aaa_dmat; 744acbabfbSkettenis 75f09f3dbfSkettenis if (bus_space_map(sc->sc.sc_iot, aaa->aaa_addr[0], aaa->aaa_size[0], 76f09f3dbfSkettenis 0, &sc->sc.sc_ioh)) { 774acbabfbSkettenis printf(": can't map registers\n"); 784acbabfbSkettenis return; 794acbabfbSkettenis } 804acbabfbSkettenis 81f09f3dbfSkettenis sc->sc_ih = acpi_intr_establish(aaa->aaa_irq[0], aaa->aaa_irq_flags[0], 82f09f3dbfSkettenis IPL_BIO, ahci_intr, sc, sc->sc.sc_dev.dv_xname); 834acbabfbSkettenis if (sc->sc_ih == NULL) { 844acbabfbSkettenis printf(": can't establish interrupt\n"); 854acbabfbSkettenis return; 864acbabfbSkettenis } 874acbabfbSkettenis 884acbabfbSkettenis printf(":"); 894acbabfbSkettenis 904acbabfbSkettenis if (ahci_attach(&sc->sc) != 0) { 914acbabfbSkettenis /* error printed by ahci_attach */ 924acbabfbSkettenis goto irq; 934acbabfbSkettenis } 944acbabfbSkettenis 954acbabfbSkettenis return; 964acbabfbSkettenis 974acbabfbSkettenis irq: 984acbabfbSkettenis return; 994acbabfbSkettenis } 100