From mboxrd@z Thu Jan 1 00:00:00 1970 From: Yijing Wang Subject: Re: [Patch Part3 V5 4/8] iommu/vt-d: Search for ACPI _DSM method for DMAR hotplug Date: Mon, 15 Sep 2014 09:53:29 +0800 Message-ID: <54164699.9020906@huawei.com> References: <1410487848-6027-1-git-send-email-jiang.liu@linux.intel.com> <1410487848-6027-5-git-send-email-jiang.liu@linux.intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1410487848-6027-5-git-send-email-jiang.liu-VuQAYsv1563Yd54FQh9/CA@public.gmane.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: iommu-bounces-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org Errors-To: iommu-bounces-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org To: Jiang Liu , Joerg Roedel , David Woodhouse , Yinghai Lu , Bjorn Helgaas , Dan Williams , Vinod Koul , "Rafael J . Wysocki" Cc: Tony Luck , linux-pci-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-hotplug-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org, dmaengine-u79uwXL29TY76Z2rM5mHXA@public.gmane.org List-Id: iommu@lists.linux-foundation.org On 2014/9/12 10:10, Jiang Liu wrote: > According to Intel VT-d specification, _DSM method to support DMAR > hotplug should exist directly under corresponding ACPI object > representing PCI host bridge. But some BIOSes doesn't conform to > this, so search for _DSM method in the subtree starting from the > ACPI object representing the PCI host bridge. Reviewed-by: Yijing Wang > > Signed-off-by: Jiang Liu > --- > drivers/iommu/dmar.c | 35 +++++++++++++++++++++++++++++++---- > 1 file changed, 31 insertions(+), 4 deletions(-) > > diff --git a/drivers/iommu/dmar.c b/drivers/iommu/dmar.c > index e77b5d3f2f5c..df2c2591c1a6 100644 > --- a/drivers/iommu/dmar.c > +++ b/drivers/iommu/dmar.c > @@ -1926,21 +1926,48 @@ static int dmar_hotplug_remove(acpi_handle handle) > return ret; > } > > -static int dmar_device_hotplug(acpi_handle handle, bool insert) > +static acpi_status dmar_get_dsm_handle(acpi_handle handle, u32 lvl, > + void *context, void **retval) > +{ > + acpi_handle *phdl = retval; > + > + if (dmar_detect_dsm(handle, DMAR_DSM_FUNC_DRHD)) { > + *phdl = handle; > + return AE_CTRL_TERMINATE; > + } > + > + return AE_OK; > +} > + > +int dmar_device_hotplug(acpi_handle handle, bool insert) > { > int ret; > + acpi_handle tmp = NULL; > + acpi_status status; > > if (!dmar_in_use()) > return 0; > > - if (!dmar_detect_dsm(handle, DMAR_DSM_FUNC_DRHD)) > + if (dmar_detect_dsm(handle, DMAR_DSM_FUNC_DRHD)) { > + tmp = handle; > + } else { > + status = acpi_walk_namespace(ACPI_TYPE_DEVICE, handle, > + ACPI_UINT32_MAX, > + dmar_get_dsm_handle, > + NULL, NULL, &tmp); > + if (ACPI_FAILURE(status)) { > + pr_warn("Failed to locate _DSM method.\n"); > + return -ENXIO; > + } > + } > + if (tmp == NULL) > return 0; > > down_write(&dmar_global_lock); > if (insert) > - ret = dmar_hotplug_insert(handle); > + ret = dmar_hotplug_insert(tmp); > else > - ret = dmar_hotplug_remove(handle); > + ret = dmar_hotplug_remove(tmp); > up_write(&dmar_global_lock); > > return ret; > -- Thanks! Yijing