From owner-svn-src-head@freebsd.org Sat Feb 25 06:11:38 2017 Return-Path: Delivered-To: svn-src-head@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 1D481CEC19D; Sat, 25 Feb 2017 06:11:38 +0000 (UTC) (envelope-from imp@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id C2A34F8F; Sat, 25 Feb 2017 06:11:37 +0000 (UTC) (envelope-from imp@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v1P6Ba8H080855; Sat, 25 Feb 2017 06:11:36 GMT (envelope-from imp@FreeBSD.org) Received: (from imp@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id v1P6Bamt080852; Sat, 25 Feb 2017 06:11:36 GMT (envelope-from imp@FreeBSD.org) Message-Id: <201702250611.v1P6Bamt080852@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: imp set sender to imp@FreeBSD.org using -f From: Warner Losh Date: Sat, 25 Feb 2017 06:11:36 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r314248 - head/sys/dev/pci X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 25 Feb 2017 06:11:38 -0000 Author: imp Date: Sat Feb 25 06:11:36 2017 New Revision: 314248 URL: https://svnweb.freebsd.org/changeset/base/314248 Log: Create pcib_request_feature. pcib_request_feature allows drivers to request the firmware (ACPI) release certain features it may be using. ACPI normally manages things like hot plug, advanced error reporting and other features until the OS requests ACPI to relenquish control since it is taking over. Sponsored by: Netflix Modified: head/sys/dev/pci/pci_if.m head/sys/dev/pci/pci_pci.c head/sys/dev/pci/pcib_if.m Modified: head/sys/dev/pci/pci_if.m ============================================================================== --- head/sys/dev/pci/pci_if.m Sat Feb 25 04:24:51 2017 (r314247) +++ head/sys/dev/pci/pci_if.m Sat Feb 25 06:11:36 2017 (r314248) @@ -60,6 +60,11 @@ HEADER { PCI_ID_RID, PCI_ID_MSI, }; + + enum pci_feature { + PCI_FEATURE_HP, /* Hot Plug feature */ + PCI_FEATURE_AER, /* Advanced Error Reporting */ + }; } Modified: head/sys/dev/pci/pci_pci.c ============================================================================== --- head/sys/dev/pci/pci_pci.c Sat Feb 25 04:24:51 2017 (r314247) +++ head/sys/dev/pci/pci_pci.c Sat Feb 25 06:11:36 2017 (r314248) @@ -76,6 +76,8 @@ static void pcib_pcie_ab_timeout(void * static void pcib_pcie_cc_timeout(void *arg); static void pcib_pcie_dll_timeout(void *arg); #endif +static int pcib_request_feature(device_t pcib, device_t dev, + enum pci_feature feature); static device_method_t pcib_methods[] = { /* Device interface */ @@ -119,6 +121,7 @@ static device_method_t pcib_methods[] = DEVMETHOD(pcib_try_enable_ari, pcib_try_enable_ari), DEVMETHOD(pcib_ari_enabled, pcib_ari_enabled), DEVMETHOD(pcib_decode_rid, pcib_ari_decode_rid), + DEVMETHOD(pcib_request_feature, pcib_request_feature), DEVMETHOD_END }; @@ -2829,3 +2832,24 @@ pcib_try_enable_ari(device_t pcib, devic return (0); } + +/* + * Pass the request to use this PCI feature up the tree. Either there's a + * firmware like ACPI that's using this feature that will approve (or deny) the + * request to take it over, or the platform has no such firmware, in which case + * the request will be approved. If the request is approved, the OS is expected + * to make use of the feature or render it harmless. + */ +static int +pcib_request_feature(device_t pcib, device_t dev, enum pci_feature feature) +{ + device_t bus; + + /* + * Our parent is necessarily a pci bus. Its parent will either be + * another pci bridge (which passes it up) or a host bridge that can + * approve or reject the request. + */ + bus = device_get_parent(pcib); + return (PCIB_REQUEST_FEATURE(device_get_parent(bus), dev, feature)); +} Modified: head/sys/dev/pci/pcib_if.m ============================================================================== --- head/sys/dev/pci/pcib_if.m Sat Feb 25 04:24:51 2017 (r314247) +++ head/sys/dev/pci/pcib_if.m Sat Feb 25 06:11:36 2017 (r314248) @@ -212,3 +212,12 @@ METHOD void decode_rid { int *slot; int *func; } DEFAULT pcib_decode_rid; + +# +# Request control of PCI features from host firmware, if any. +# +METHOD int request_feature { + device_t pcib; + device_t dev; + enum pci_feature feature; +};