pci: Pass cookie through pci_find_device, pci_enumerate_bus.
New functions pci_find_device1 and pci_enumerate_bus1 have the cookie argument. Existing symbols pci_find_device and pci_enumerate_bus are now wrappers for the cookieless version. This drops the symbol pci_probe_device, in favour of a new pci_probe_device1 with the cookie argument. But I don't think that requires a revbump because it's only called by MD pci_enumerate_bus1 implementations, which don't live in modules anyway.
This commit is contained in:
parent
ddb7e40487
commit
7ac6f056bb
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: pci_machdep.c,v 1.80 2023/12/20 05:33:58 thorpej Exp $ */
|
||||
/* $NetBSD: pci_machdep.c,v 1.81 2024/05/20 11:34:18 riastradh Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1999, 2000 Matthew R. Green
|
||||
|
@ -31,7 +31,7 @@
|
|||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: pci_machdep.c,v 1.80 2023/12/20 05:33:58 thorpej Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: pci_machdep.c,v 1.81 2024/05/20 11:34:18 riastradh Exp $");
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/param.h>
|
||||
|
@ -244,8 +244,9 @@ pci_decompose_tag(pci_chipset_tag_t pc, pcitag_t tag, int *bp, int *dp, int *fp)
|
|||
}
|
||||
|
||||
int
|
||||
sparc64_pci_enumerate_bus(struct pci_softc *sc, const int *locators,
|
||||
int (*match)(const struct pci_attach_args *), struct pci_attach_args *pap)
|
||||
sparc64_pci_enumerate_bus1(struct pci_softc *sc, const int *locators,
|
||||
int (*match)(void *, const struct pci_attach_args *), void *cookie,
|
||||
struct pci_attach_args *pap)
|
||||
{
|
||||
struct ofw_pci_register reg;
|
||||
pci_chipset_tag_t pc = sc->sc_pc;
|
||||
|
@ -307,8 +308,10 @@ sparc64_pci_enumerate_bus(struct pci_softc *sc, const int *locators,
|
|||
if (OF_getprop(node, "class-code", &class, sizeof(class)) !=
|
||||
sizeof(class))
|
||||
continue;
|
||||
if (OF_getprop(node, "reg", ®, sizeof(reg)) < sizeof(reg))
|
||||
panic("pci_enumerate_bus: \"%s\" regs too small", name);
|
||||
if (OF_getprop(node, "reg", ®, sizeof(reg)) < sizeof(reg)) {
|
||||
panic("pci_enumerate_bus1: \"%s\" regs too small",
|
||||
name);
|
||||
}
|
||||
|
||||
b = OFW_PCI_PHYS_HI_BUS(reg.phys_hi);
|
||||
d = OFW_PCI_PHYS_HI_DEVICE(reg.phys_hi);
|
||||
|
@ -361,7 +364,7 @@ sparc64_pci_enumerate_bus(struct pci_softc *sc, const int *locators,
|
|||
(cl << PCI_CACHELINE_SHIFT);
|
||||
pci_conf_write(pc, tag, PCI_BHLC_REG, bhlc);
|
||||
|
||||
ret = pci_probe_device(sc, tag, match, pap);
|
||||
ret = pci_probe_device1(sc, tag, match, cookie, pap);
|
||||
if (match != NULL && ret != 0)
|
||||
return (ret);
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: pci_machdep.h,v 1.28 2016/07/07 06:55:38 msaitoh Exp $ */
|
||||
/* $NetBSD: pci_machdep.h,v 1.29 2024/05/20 11:34:18 riastradh Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1999 Matthew R. Green
|
||||
|
@ -95,10 +95,10 @@ int pci_intr_map(const struct pci_attach_args *,
|
|||
pci_intr_handle_t *);
|
||||
void pci_intr_disestablish(pci_chipset_tag_t, void *);
|
||||
|
||||
int sparc64_pci_enumerate_bus(struct pci_softc *, const int *,
|
||||
int (*)(const struct pci_attach_args *),
|
||||
int sparc64_pci_enumerate_bus1(struct pci_softc *, const int *,
|
||||
int (*)(void *, const struct pci_attach_args *), void *,
|
||||
struct pci_attach_args *);
|
||||
#define PCI_MACHDEP_ENUMERATE_BUS sparc64_pci_enumerate_bus
|
||||
#define PCI_MACHDEP_ENUMERATE_BUS1 sparc64_pci_enumerate_bus1
|
||||
|
||||
#define pci_conf_read(pc, tag, reg) \
|
||||
((pc)->spc_conf_read(pc, tag, reg))
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: pci_machdep.h,v 1.21 2022/05/23 15:03:05 bouyer Exp $ */
|
||||
/* $NetBSD: pci_machdep.h,v 1.22 2024/05/20 11:34:18 riastradh Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2006 Manuel Bouyer.
|
||||
|
@ -67,20 +67,14 @@ typedef intr_handle_t pci_intr_handle_t;
|
|||
#include "opt_xen.h"
|
||||
|
||||
#if !defined(DOM0OPS) && defined(XENPV)
|
||||
int xpci_enumerate_bus(struct pci_softc *, const int *,
|
||||
int (*)(const struct pci_attach_args *),
|
||||
int xpci_enumerate_bus1(struct pci_softc *, const int *,
|
||||
int (*)(void *, const struct pci_attach_args *), void *,
|
||||
struct pci_attach_args *);
|
||||
#define PCI_MACHDEP_ENUMERATE_BUS xpci_enumerate_bus
|
||||
#define PCI_MACHDEP_ENUMERATE_BUS1 xpci_enumerate_bus1
|
||||
#endif
|
||||
|
||||
#ifdef XENPV
|
||||
void pci_conf_write16(pci_chipset_tag_t, pcitag_t, int, uint16_t);
|
||||
#endif
|
||||
|
||||
/* functions provided to MI PCI */
|
||||
|
||||
int xen_pci_enumerate_bus(struct pci_softc *, const int *,
|
||||
int (*)(const struct pci_attach_args *),
|
||||
struct pci_attach_args *);
|
||||
|
||||
#endif /* _XEN_PCI_MACHDEP_H_ */
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: xpci_xenbus.c,v 1.26 2024/02/09 22:08:33 andvar Exp $ */
|
||||
/* $NetBSD: xpci_xenbus.c,v 1.27 2024/05/20 11:34:18 riastradh Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2009 Manuel Bouyer.
|
||||
|
@ -25,7 +25,7 @@
|
|||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: xpci_xenbus.c,v 1.26 2024/02/09 22:08:33 andvar Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: xpci_xenbus.c,v 1.27 2024/05/20 11:34:18 riastradh Exp $");
|
||||
|
||||
#include "opt_xen.h"
|
||||
|
||||
|
@ -491,8 +491,9 @@ pci_conf_write(pci_chipset_tag_t pc, pcitag_t tag, int reg, pcireg_t data)
|
|||
}
|
||||
|
||||
int
|
||||
xpci_enumerate_bus(struct pci_softc *sc, const int *locators,
|
||||
int (*match)(const struct pci_attach_args *), struct pci_attach_args *pap)
|
||||
xpci_enumerate_bus1(struct pci_softc *sc, const int *locators,
|
||||
int (*match)(void *, const struct pci_attach_args *), void *cookie,
|
||||
struct pci_attach_args *pap)
|
||||
{
|
||||
#if 0
|
||||
char *string;
|
||||
|
@ -550,7 +551,7 @@ xpci_enumerate_bus(struct pci_softc *sc, const int *locators,
|
|||
if (busn != sc->sc_bus)
|
||||
goto endfor;
|
||||
tag = pci_make_tag(pc, busn, devn, funcn);
|
||||
err = pci_probe_device(sc, tag, match, pap);
|
||||
err = pci_probe_device1(sc, tag, match, pap);
|
||||
if (match != NULL && err != 0)
|
||||
return (err);
|
||||
}
|
||||
|
@ -619,7 +620,7 @@ endfor:
|
|||
goto next;
|
||||
}
|
||||
}
|
||||
err = pci_probe_device(sc, tag, match, pap);
|
||||
err = pci_probe_device1(sc, tag, match, pap);
|
||||
if (match != NULL && err != 0)
|
||||
return (err);
|
||||
next:
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: acpi_mcfg.c,v 1.26 2022/10/14 22:10:15 jmcneill Exp $ */
|
||||
/* $NetBSD: acpi_mcfg.c,v 1.27 2024/05/20 11:34:19 riastradh Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (C) 2015 NONAKA Kimihiro <nonaka@NetBSD.org>
|
||||
|
@ -28,7 +28,7 @@
|
|||
#include "opt_pci.h"
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: acpi_mcfg.c,v 1.26 2022/10/14 22:10:15 jmcneill Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: acpi_mcfg.c,v 1.27 2024/05/20 11:34:19 riastradh Exp $");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/device.h>
|
||||
|
@ -524,10 +524,6 @@ acpimcfg_device_probe(const struct pci_attach_args *pa)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#ifdef PCI_MACHDEP_ENUMERATE_BUS
|
||||
#define pci_enumerate_bus PCI_MACHDEP_ENUMERATE_BUS
|
||||
#endif
|
||||
|
||||
static void
|
||||
acpimcfg_scan_bus(struct pci_softc *sc, pci_chipset_tag_t pc, int bus)
|
||||
{
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: pci.c,v 1.165 2022/08/24 11:19:25 riastradh Exp $ */
|
||||
/* $NetBSD: pci.c,v 1.166 2024/05/20 11:34:19 riastradh Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1995, 1996, 1997, 1998
|
||||
|
@ -36,7 +36,7 @@
|
|||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: pci.c,v 1.165 2022/08/24 11:19:25 riastradh Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: pci.c,v 1.166 2024/05/20 11:34:19 riastradh Exp $");
|
||||
|
||||
#ifdef _KERNEL_OPT
|
||||
#include "opt_pci.h"
|
||||
|
@ -69,8 +69,8 @@ int pci_config_dump = 0;
|
|||
|
||||
int pciprint(void *, const char *);
|
||||
|
||||
#ifdef PCI_MACHDEP_ENUMERATE_BUS
|
||||
#define pci_enumerate_bus PCI_MACHDEP_ENUMERATE_BUS
|
||||
#ifdef PCI_MACHDEP_ENUMERATE_BUS1
|
||||
#define pci_enumerate_bus1 PCI_MACHDEP_ENUMERATE_BUS1
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
@ -290,8 +290,8 @@ pci_bus_get_child_devhandle(struct pci_softc *sc, pcitag_t tag)
|
|||
}
|
||||
|
||||
int
|
||||
pci_probe_device(struct pci_softc *sc, pcitag_t tag,
|
||||
int (*match)(const struct pci_attach_args *),
|
||||
pci_probe_device1(struct pci_softc *sc, pcitag_t tag,
|
||||
int (*match)(void *, const struct pci_attach_args *), void *cookie,
|
||||
struct pci_attach_args *pap)
|
||||
{
|
||||
pci_chipset_tag_t pc = sc->sc_pc;
|
||||
|
@ -470,7 +470,7 @@ pci_probe_device(struct pci_softc *sc, pcitag_t tag,
|
|||
#endif
|
||||
|
||||
if (match != NULL) {
|
||||
ret = (*match)(&pa);
|
||||
ret = (*match)(cookie, &pa);
|
||||
if (ret != 0 && pap != NULL)
|
||||
*pap = pa;
|
||||
} else {
|
||||
|
@ -681,9 +681,26 @@ pci_get_ext_capability(pci_chipset_tag_t pc, pcitag_t tag, int capid,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
pci_match_cookieless(void *cookie, const struct pci_attach_args *pa)
|
||||
{
|
||||
int (*match)(const struct pci_attach_args *) = cookie;
|
||||
|
||||
return (*match)(pa);
|
||||
}
|
||||
|
||||
int
|
||||
pci_find_device(struct pci_attach_args *pa,
|
||||
int (*match)(const struct pci_attach_args *))
|
||||
int (*match)(const struct pci_attach_args *))
|
||||
{
|
||||
void *cookie = match;
|
||||
|
||||
return pci_find_device1(pa, &pci_match_cookieless, cookie);
|
||||
}
|
||||
|
||||
int
|
||||
pci_find_device1(struct pci_attach_args *pa,
|
||||
int (*match)(void *, const struct pci_attach_args *), void *cookie)
|
||||
{
|
||||
extern struct cfdriver pci_cd;
|
||||
device_t pcidev;
|
||||
|
@ -696,21 +713,32 @@ pci_find_device(struct pci_attach_args *pa,
|
|||
for (i = 0; i < pci_cd.cd_ndevs; i++) {
|
||||
pcidev = device_lookup(&pci_cd, i);
|
||||
if (pcidev != NULL &&
|
||||
pci_enumerate_bus(device_private(pcidev), wildcard,
|
||||
match, pa) != 0)
|
||||
pci_enumerate_bus1(device_private(pcidev), wildcard,
|
||||
match, cookie, pa) != 0)
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifndef PCI_MACHDEP_ENUMERATE_BUS
|
||||
int
|
||||
pci_enumerate_bus(struct pci_softc *sc, const int *locators,
|
||||
int (*match)(const struct pci_attach_args *), struct pci_attach_args *pap)
|
||||
{
|
||||
void *cookie = match;
|
||||
|
||||
return pci_enumerate_bus1(sc, locators, &pci_match_cookieless, cookie,
|
||||
pap);
|
||||
}
|
||||
|
||||
#ifndef PCI_MACHDEP_ENUMERATE_BUS1
|
||||
/*
|
||||
* Generic PCI bus enumeration routine. Used unless machine-dependent
|
||||
* code needs to provide something else.
|
||||
*/
|
||||
int
|
||||
pci_enumerate_bus(struct pci_softc *sc, const int *locators,
|
||||
int (*match)(const struct pci_attach_args *), struct pci_attach_args *pap)
|
||||
pci_enumerate_bus1(struct pci_softc *sc, const int *locators,
|
||||
int (*match)(void *, const struct pci_attach_args *), void *cookie,
|
||||
struct pci_attach_args *pap)
|
||||
{
|
||||
pci_chipset_tag_t pc = sc->sc_pc;
|
||||
int device, function, nfunctions, ret;
|
||||
|
@ -816,14 +844,14 @@ pci_enumerate_bus(struct pci_softc *sc, const int *locators,
|
|||
(qd->quirks & PCI_QUIRK_SKIP_FUNC(function)) != 0)
|
||||
continue;
|
||||
tag = pci_make_tag(pc, sc->sc_bus, device, function);
|
||||
ret = pci_probe_device(sc, tag, match, pap);
|
||||
ret = pci_probe_device1(sc, tag, match, cookie, pap);
|
||||
if (match != NULL && ret != 0)
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#endif /* PCI_MACHDEP_ENUMERATE_BUS */
|
||||
#endif /* PCI_MACHDEP_ENUMERATE_BUS1 */
|
||||
|
||||
|
||||
/*
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: pcivar.h,v 1.117 2022/02/27 14:18:52 riastradh Exp $ */
|
||||
/* $NetBSD: pcivar.h,v 1.118 2024/05/20 11:34:19 riastradh Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1996, 1997 Christopher G. Demetriou. All rights reserved.
|
||||
|
@ -339,12 +339,15 @@ const struct device_compatible_entry *
|
|||
const struct device_compatible_entry *);
|
||||
int pci_compatible_match_subsys(const struct pci_attach_args *,
|
||||
const struct device_compatible_entry *);
|
||||
#ifndef PCI_MACHDEP_ENUMERATE_BUS
|
||||
int pci_enumerate_bus(struct pci_softc *, const int *,
|
||||
int (*)(const struct pci_attach_args *), struct pci_attach_args *);
|
||||
#ifndef PCI_MACHDEP_ENUMERATE_BUS1
|
||||
int pci_enumerate_bus1(struct pci_softc *, const int *,
|
||||
int (*)(void *, const struct pci_attach_args *), void *,
|
||||
struct pci_attach_args *);
|
||||
#endif
|
||||
int pci_probe_device(struct pci_softc *, pcitag_t tag,
|
||||
int (*)(const struct pci_attach_args *),
|
||||
int pci_probe_device1(struct pci_softc *, pcitag_t tag,
|
||||
int (*)(void *, const struct pci_attach_args *), void *,
|
||||
struct pci_attach_args *);
|
||||
void pci_devinfo(pcireg_t, pcireg_t, int, char *, size_t);
|
||||
void pci_aprint_devinfo_fancy(const struct pci_attach_args *,
|
||||
|
@ -382,8 +385,10 @@ int pci_vpd_write(pci_chipset_tag_t, pcitag_t, int, int, pcireg_t *);
|
|||
/*
|
||||
* Misc.
|
||||
*/
|
||||
int pci_find_device(struct pci_attach_args *pa,
|
||||
int (*match)(const struct pci_attach_args *));
|
||||
int pci_find_device(struct pci_attach_args *,
|
||||
int (*match)(const struct pci_attach_args *));
|
||||
int pci_find_device1(struct pci_attach_args *,
|
||||
int (*match)(void *, const struct pci_attach_args *), void *);
|
||||
int pci_dma64_available(const struct pci_attach_args *);
|
||||
void pci_conf_capture(pci_chipset_tag_t, pcitag_t, struct pci_conf_state *);
|
||||
void pci_conf_restore(pci_chipset_tag_t, pcitag_t, struct pci_conf_state *);
|
||||
|
|
Loading…
Reference in New Issue