Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 14 Nov 2015 09:25:28 +0100
From:      Michal Meloun <mmel@freebsd.org>
To:        John Baldwin <jhb@FreeBSD.org>, src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   Re: svn commit: r290809 - in stable: 10/share/man/man9 10/sys/dev/pci 9/share/man/man9 9/sys/dev/pci
Message-ID:  <5646EFF8.1080207@freebsd.org>
In-Reply-To: <201511140106.tAE16j5Q097967@repo.freebsd.org>
References:  <201511140106.tAE16j5Q097967@repo.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
This commit breaks installworld.

Index: share/man/man9/Makefile
===================================================================
--- share/man/man9/Makefile     (revision 290818)
+++ share/man/man9/Makefile     (working copy)
@@ -1032,7 +1032,7 @@
        pci.9 pci_write_config.9 \
        pci.9 pcie_adjust_config.9 \
        pci.9 pcie_read_config.9 \
-       pci.9 pcie_write_config.9 \
+       pci.9 pcie_write_config.9
 MLINKS+=pfil.9 pfil_add_hook.9 \
        pfil.9 pfil_hook_get.9 \
        pfil.9 pfil_remove_hook.9


Dne 14.11.2015 v 2:06 John Baldwin napsal(a):
> Author: jhb
> Date: Sat Nov 14 01:06:45 2015
> New Revision: 290809
> URL: https://svnweb.freebsd.org/changeset/base/290809
> 
> Log:
>   MFC 290414,290415:
>   Additional PCI helper functions.
>   
>   290414:
>   Add helper routines for PCI device drivers to read, write, and modify
>   PCI-Express capability registers (that is, PCI config registers in the
>   standard PCI config space belonging to the PCI-Express capability
>   register set).
>   
>   Note that all of the current PCI-e registers are either 16 or 32-bits,
>   so only widths of 2 or 4 bytes are supported.
>   
>   290415:
>   Add a new helper function for PCI devices to locate the upstream
>   PCI-express root port of a given PCI device.
> 
> Modified:
>   stable/10/share/man/man9/Makefile
>   stable/10/share/man/man9/pci.9
>   stable/10/sys/dev/pci/pci.c
>   stable/10/sys/dev/pci/pcivar.h
> Directory Properties:
>   stable/10/   (props changed)
> 
> Changes in other areas also in this revision:
> Modified:
>   stable/9/share/man/man9/Makefile
>   stable/9/share/man/man9/pci.9
>   stable/9/sys/dev/pci/pci.c
>   stable/9/sys/dev/pci/pcivar.h
> Directory Properties:
>   stable/9/share/man/man9/   (props changed)
>   stable/9/sys/   (props changed)
>   stable/9/sys/dev/   (props changed)
> 
> Modified: stable/10/share/man/man9/Makefile
> ==============================================================================
> --- stable/10/share/man/man9/Makefile	Sat Nov 14 00:04:42 2015	(r290808)
> +++ stable/10/share/man/man9/Makefile	Sat Nov 14 01:06:45 2015	(r290809)
> @@ -1014,6 +1014,7 @@ MLINKS+=pci.9 pci_alloc_msi.9 \
>  	pci.9 pci_find_device.9 \
>  	pci.9 pci_find_extcap.9 \
>  	pci.9 pci_find_htcap.9 \
> +	pci.9 pci_find_pcie_root_port.9 \
>  	pci.9 pci_get_max_read_req.9 \
>  	pci.9 pci_get_powerstate.9 \
>  	pci.9 pci_get_vpd_ident.9 \
> @@ -1028,7 +1029,10 @@ MLINKS+=pci.9 pci_alloc_msi.9 \
>  	pci.9 pci_save_state.9 \
>  	pci.9 pci_set_powerstate.9 \
>  	pci.9 pci_set_max_read_req.9 \
> -	pci.9 pci_write_config.9
> +	pci.9 pci_write_config.9 \
> +	pci.9 pcie_adjust_config.9 \
> +	pci.9 pcie_read_config.9 \
> +	pci.9 pcie_write_config.9 \
>  MLINKS+=pfil.9 pfil_add_hook.9 \
>  	pfil.9 pfil_hook_get.9 \
>  	pfil.9 pfil_remove_hook.9
> 
> Modified: stable/10/share/man/man9/pci.9
> ==============================================================================
> --- stable/10/share/man/man9/pci.9	Sat Nov 14 00:04:42 2015	(r290808)
> +++ stable/10/share/man/man9/pci.9	Sat Nov 14 01:06:45 2015	(r290809)
> @@ -25,7 +25,7 @@
>  .\"
>  .\" $FreeBSD$
>  .\"
> -.Dd March 5, 2012
> +.Dd November 5, 2015
>  .Dt PCI 9
>  .Os
>  .Sh NAME
> @@ -42,6 +42,7 @@
>  .Nm pci_find_device ,
>  .Nm pci_find_extcap ,
>  .Nm pci_find_htcap ,
> +.Nm pci_find_pcie_root_port ,
>  .Nm pci_get_max_read_req ,
>  .Nm pci_get_powerstate ,
>  .Nm pci_get_vpd_ident ,
> @@ -56,7 +57,10 @@
>  .Nm pci_save_state ,
>  .Nm pci_set_max_read_req ,
>  .Nm pci_set_powerstate ,
> -.Nm pci_write_config
> +.Nm pci_write_config ,
> +.Nm pcie_adjust_config ,
> +.Nm pcie_read_config ,
> +.Nm pcie_write_config
>  .Nd PCI bus interface
>  .Sh SYNOPSIS
>  .In sys/bus.h
> @@ -86,6 +90,8 @@
>  .Fn pci_find_extcap "device_t dev" "int capability" "int *capreg"
>  .Ft int
>  .Fn pci_find_htcap "device_t dev" "int capability" "int *capreg"
> +.Ft device_t
> +.Fn pci_find_pcie_root_port "device_t dev"
>  .Ft int
>  .Fn pci_get_max_read_req "device_t dev"
>  .Ft int
> @@ -116,6 +122,18 @@
>  .Fn pci_set_powerstate "device_t dev" "int state"
>  .Ft void
>  .Fn pci_write_config "device_t dev" "int reg" "uint32_t val" "int width"
> +.Ft uint32_t
> +.Fo pcie_adjust_config
> +.Fa "device_t dev"
> +.Fa "int reg"
> +.Fa "uint32_t mask"
> +.Fa "uint32_t val"
> +.Fa "int width"
> +.Fc
> +.Ft uint32_t
> +.Fn pcie_read_config "device_t dev" "int reg" "int width"
> +.Ft void
> +.Fn pcie_write_config "device_t dev" "int reg" "uint32_t val" "int width"
>  .Sh DESCRIPTION
>  The
>  .Nm
> @@ -152,6 +170,48 @@ with
>  .Fa width
>  specifying the size of the access.
>  .Pp
> +The
> +.Fn pcie_adjust_config
> +function is used to modify the value of a register in the PCI-express
> +capability register set of device
> +.Fa dev .
> +The offset
> +.Fa reg
> +specifies a relative offset in the register set with
> +.Fa width
> +specifying the size of the access.
> +The new value of the register is computed by modifying bits set in
> +.Fa mask
> +to the value in
> +.Fa val .
> +Any bits not specified in
> +.Fa mask
> +are preserved.
> +The previous value of the register is returned.
> +.Pp
> +The
> +.Fn pcie_read_config
> +function is used to read the value of a register in the PCI-express
> +capability register set of device
> +.Fa dev .
> +The offset
> +.Fa reg
> +specifies a relative offset in the register set with
> +.Fa width
> +specifying the size of the access.
> +.Pp
> +The
> +.Fn pcie_write_config
> +function is used to write the value
> +.Fa val
> +to a register in the PCI-express capability register set of device
> +.Fa dev .
> +The offset
> +.Fa reg
> +specifies a relative offset in the register set with
> +.Fa width
> +specifying the size of the access.
> +.Pp
>  .Em NOTE :
>  Device drivers should only use these functions for functionality that
>  is not available via another
> @@ -274,6 +334,16 @@ If the capability is not found or the de
>  returns an error.
>  .Pp
>  The
> +.Fn pci_find_pcie_root_port
> +function walks up the PCI device hierarchy to locate the PCI-express root
> +port upstream of
> +.Fa dev .
> +If a root port is not found,
> +.Fn pci_find_pcie_root_port
> +returns
> +.Dv NULL .
> +.Pp
> +The
>  .Fn pci_get_vpd_ident
>  function is used to fetch a device's Vital Product Data
>  .Pq VPD
> 
> Modified: stable/10/sys/dev/pci/pci.c
> ==============================================================================
> --- stable/10/sys/dev/pci/pci.c	Sat Nov 14 00:04:42 2015	(r290808)
> +++ stable/10/sys/dev/pci/pci.c	Sat Nov 14 01:06:45 2015	(r290809)
> @@ -1895,6 +1895,63 @@ pci_set_max_read_req(device_t dev, int s
>  	return (size);
>  }
>  
> +uint32_t
> +pcie_read_config(device_t dev, int reg, int width)
> +{
> +	struct pci_devinfo *dinfo = device_get_ivars(dev);
> +	int cap;
> +
> +	cap = dinfo->cfg.pcie.pcie_location;
> +	if (cap == 0) {
> +		if (width == 2)
> +			return (0xffff);
> +		return (0xffffffff);
> +	}
> +
> +	return (pci_read_config(dev, cap + reg, width));
> +}
> +
> +void
> +pcie_write_config(device_t dev, int reg, uint32_t value, int width)
> +{
> +	struct pci_devinfo *dinfo = device_get_ivars(dev);
> +	int cap;
> +
> +	cap = dinfo->cfg.pcie.pcie_location;
> +	if (cap == 0)
> +		return;
> +	pci_write_config(dev, cap + reg, value, width);
> +}
> +
> +/*
> + * Adjusts a PCI-e capability register by clearing the bits in mask
> + * and setting the bits in (value & mask).  Bits not set in mask are
> + * not adjusted.
> + *
> + * Returns the old value on success or all ones on failure.
> + */
> +uint32_t
> +pcie_adjust_config(device_t dev, int reg, uint32_t mask, uint32_t value,
> +    int width)
> +{
> +	struct pci_devinfo *dinfo = device_get_ivars(dev);
> +	uint32_t old, new;
> +	int cap;
> +
> +	cap = dinfo->cfg.pcie.pcie_location;
> +	if (cap == 0) {
> +		if (width == 2)
> +			return (0xffff);
> +		return (0xffffffff);
> +	}
> +
> +	old = pci_read_config(dev, cap + reg, width);
> +	new = old & ~mask;
> +	new |= (value & mask);
> +	pci_write_config(dev, cap + reg, new, width);
> +	return (old);
> +}
> +
>  /*
>   * Support for MSI message signalled interrupts.
>   */
> @@ -5139,3 +5196,44 @@ pci_get_rid_method(device_t dev, device_
>  
>  	return (PCIB_GET_RID(device_get_parent(dev), child));
>  }
> +
> +/* Find the upstream port of a given PCI device in a root complex. */
> +device_t
> +pci_find_pcie_root_port(device_t dev)
> +{
> +	struct pci_devinfo *dinfo;
> +	devclass_t pci_class;
> +	device_t pcib, bus;
> +
> +	pci_class = devclass_find("pci");
> +	KASSERT(device_get_devclass(device_get_parent(dev)) == pci_class,
> +	    ("%s: non-pci device %s", __func__, device_get_nameunit(dev)));
> +
> +	/*
> +	 * Walk the bridge hierarchy until we find a PCI-e root
> +	 * port or a non-PCI device.
> +	 */
> +	for (;;) {
> +		bus = device_get_parent(dev);
> +		KASSERT(bus != NULL, ("%s: null parent of %s", __func__,
> +		    device_get_nameunit(dev)));
> +
> +		pcib = device_get_parent(bus);
> +		KASSERT(pcib != NULL, ("%s: null bridge of %s", __func__,
> +		    device_get_nameunit(bus)));
> +
> +		/*
> +		 * pcib's parent must be a PCI bus for this to be a
> +		 * PCI-PCI bridge.
> +		 */
> +		if (device_get_devclass(device_get_parent(pcib)) != pci_class)
> +			return (NULL);
> +
> +		dinfo = device_get_ivars(pcib);
> +		if (dinfo->cfg.pcie.pcie_location != 0 &&
> +		    dinfo->cfg.pcie.pcie_type == PCIEM_TYPE_ROOT_PORT)
> +			return (pcib);
> +
> +		dev = pcib;
> +	}
> +}
> 
> Modified: stable/10/sys/dev/pci/pcivar.h
> ==============================================================================
> --- stable/10/sys/dev/pci/pcivar.h	Sat Nov 14 00:04:42 2015	(r290808)
> +++ stable/10/sys/dev/pci/pcivar.h	Sat Nov 14 01:06:45 2015	(r290809)
> @@ -501,10 +501,15 @@ int	pci_msix_device_blacklisted(device_t
>  
>  void	pci_ht_map_msi(device_t dev, uint64_t addr);
>  
> +device_t pci_find_pcie_root_port(device_t dev);
>  int	pci_get_max_read_req(device_t dev);
>  void	pci_restore_state(device_t dev);
>  void	pci_save_state(device_t dev);
>  int	pci_set_max_read_req(device_t dev, int size);
> +uint32_t pcie_read_config(device_t dev, int reg, int width);
> +void	pcie_write_config(device_t dev, int reg, uint32_t value, int width);
> +uint32_t pcie_adjust_config(device_t dev, int reg, uint32_t mask,
> +	    uint32_t value, int width);
>  
>  
>  #ifdef BUS_SPACE_MAXADDR
> 




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?5646EFF8.1080207>