From patchwork Wed May 21 00:25:37 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: kim-phillips X-Patchwork-Id: 30502 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-ie0-f197.google.com (mail-ie0-f197.google.com [209.85.223.197]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id C1D25202FE for ; Wed, 21 May 2014 00:25:58 +0000 (UTC) Received: by mail-ie0-f197.google.com with SMTP id rd18sf5609493iec.8 for ; Tue, 20 May 2014 17:25:58 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:delivered-to:date:from:to:cc:subject:message-id :in-reply-to:references:mime-version:sender:precedence:list-id :x-original-sender:x-original-authentication-results:mailing-list :list-post:list-help:list-archive:list-unsubscribe:content-type :content-transfer-encoding; bh=reZdMlc4+Ad0910fIqeOLGHrfZHlud3cSnUxljZD0xc=; b=m+/JCXb1CnTQZ+mObjWjb4zXGxHA1jg6gfonsSVVLclUQkynQrsZGakw/Hs3C7pm5M LQ4BV63XyzoXIBHnTV66BFZMEJRxepKSx7U1N85VYNyCmOqtQZ9ZJI18UQDSInP74FzR T+uWBaj9IcN4s0/xTAUY+G5PQjhWoqQg4Uw3S2u/PSDEGTXgQ9yd64RTPKRRrrHuXcOI PGa54WBr8X5yzGHSxtCGWzohK4Nx0uV2PTbxh1kbk449hm8e4k50BnMe0eqFSbgQJYwt U//5ai3w3ECikaZPdh9teGST0tepir/FhnBk1ZVghR/znUL7mJgf+kUDS5gGKeSobot4 B6aA== X-Gm-Message-State: ALoCoQnGPE4LUrGMiA9ukJcjQOROJ+a1AfUfTNU1YUrh1aq5e2AmZvJssu3L+5lLeNRfazzzZwLB X-Received: by 10.50.141.161 with SMTP id rp1mr3344268igb.2.1400631958159; Tue, 20 May 2014 17:25:58 -0700 (PDT) X-BeenThere: patchwork-forward@linaro.org Received: by 10.140.107.97 with SMTP id g88ls588087qgf.40.gmail; Tue, 20 May 2014 17:25:58 -0700 (PDT) X-Received: by 10.58.112.8 with SMTP id im8mr4970003veb.35.1400631958046; Tue, 20 May 2014 17:25:58 -0700 (PDT) Received: from mail-ve0-f170.google.com (mail-ve0-f170.google.com [209.85.128.170]) by mx.google.com with ESMTPS id is3si5540555vec.207.2014.05.20.17.25.58 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Tue, 20 May 2014 17:25:58 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.128.170 as permitted sender) client-ip=209.85.128.170; Received: by mail-ve0-f170.google.com with SMTP id db11so1593883veb.15 for ; Tue, 20 May 2014 17:25:58 -0700 (PDT) X-Received: by 10.58.169.97 with SMTP id ad1mr98572vec.45.1400631957919; Tue, 20 May 2014 17:25:57 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.220.221.72 with SMTP id ib8csp70269vcb; Tue, 20 May 2014 17:25:57 -0700 (PDT) X-Received: by 10.68.102.34 with SMTP id fl2mr53861039pbb.2.1400631956815; Tue, 20 May 2014 17:25:56 -0700 (PDT) Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id xt10si26796622pab.8.2014.05.20.17.25.56; Tue, 20 May 2014 17:25:56 -0700 (PDT) Received-SPF: none (google.com: linux-kernel-owner@vger.kernel.org does not designate permitted sender hosts) client-ip=209.132.180.67; Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751501AbaEUAZn (ORCPT + 27 others); Tue, 20 May 2014 20:25:43 -0400 Received: from mail-ob0-f180.google.com ([209.85.214.180]:37676 "EHLO mail-ob0-f180.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751429AbaEUAZk (ORCPT ); Tue, 20 May 2014 20:25:40 -0400 Received: by mail-ob0-f180.google.com with SMTP id va2so1379046obc.39 for ; Tue, 20 May 2014 17:25:39 -0700 (PDT) X-Received: by 10.182.200.131 with SMTP id js3mr48143250obc.0.1400631939647; Tue, 20 May 2014 17:25:39 -0700 (PDT) Received: from ntel (gate-tx3.freescale.com. [192.88.168.1]) by mx.google.com with ESMTPSA id qg1sm17277090obc.13.2014.05.20.17.25.38 for (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Tue, 20 May 2014 17:25:38 -0700 (PDT) Date: Tue, 20 May 2014 19:25:37 -0500 From: Kim Phillips To: a.motakis@virtualopensystems.com Cc: alex.williamson@redhat.com, kvmarm@lists.cs.columbia.edu, iommu@lists.linux-foundation.org, linux-kernel@vger.kernel.org, kvm@vger.kernel.org, linux-doc@vger.kernel.org, gregkh@linuxfoundation.org, jhovold@gmail.com, will.deacon@arm.com, a.rigo@virtualopensystems.com, rob.herring@calxeda.com, stuart.yoder@freescale.com, rob@landley.net, grant.likely@linaro.org, tech@virtualopensystems.com, clbchenlibo.chen@huawei.com, christoffer.dall@linaro.org, eric.auger@linaro.org, Julien Grall , Ian Campbell , Stefano Stabellini , Alexander Graf Subject: [RFC PATCH v5_v2 01/11] driver core: platform: add device binding path 'driver_override' Message-Id: <20140520192537.bab9fa2088c1cd5da3f92639@linaro.org> In-Reply-To: <1398700371-20096-2-git-send-email-a.motakis@virtualopensystems.com> References: <1398700371-20096-1-git-send-email-a.motakis@virtualopensystems.com> <1398700371-20096-2-git-send-email-a.motakis@virtualopensystems.com> X-Mailer: Sylpheed 3.4.0beta5 (GTK+ 2.24.20; x86_64-pc-linux-gnu) Mime-Version: 1.0 Sender: linux-kernel-owner@vger.kernel.org Precedence: list List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: kim.phillips@linaro.org X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.128.170 as permitted sender) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org X-Google-Group-Id: 836684582541 List-Post: , List-Help: , List-Archive: List-Unsubscribe: , From: Kim Phillips Needed by platform device drivers, such as the vfio-platform driver later in series, in order to bypass the existing OF, ACPI, id_table and name string matches, and successfully be able to be bound to any device, like so: echo vfio-platform > /sys/bus/platform/devices/fff51000.ethernet/driver_override echo fff51000.ethernet > /sys/bus/platform/devices/fff51000.ethernet/driver/unbind echo fff51000.ethernet > /sys/bus/platform/drivers_probe This mimics "PCI: Introduce new device binding path using pci_dev.driver_override" [1], which is an interface enhancement for more deterministic PCI device binding, e.g., when in the presence of hotplug. [1] https://lists.cs.columbia.edu/pipermail/kvmarm/2014-May/009527.html Suggested-by: Alex Williamson Signed-off-by: Kim Phillips Reviewed-by: Alex Williamson Reviewed-by: Alexander Graf --- changes in v2 patch of v5 of this patchseries: - rebased onto today's Linus' ToT - added kfree to match PCI counterpart fix, as Alex Williamson just posted a v3 of the patch (thanks Christoffer for the notification) - in the commit text, replaced vfio platform driver reference with 'later in series', and updated the PCI version mailing list reference to the v3 version. Is it safe to assume this patch will continue to as part of the VFIO platform driver patchseries, and be submitted by Antonis? If so, can we start collecting some {Reviewed,Acked}-bys? Thanks, Kim. Documentation/ABI/testing/sysfs-bus-platform | 20 ++++++++++++ drivers/base/platform.c | 47 ++++++++++++++++++++++++++++ include/linux/platform_device.h | 1 + 3 files changed, 68 insertions(+) create mode 100644 Documentation/ABI/testing/sysfs-bus-platform diff --git a/Documentation/ABI/testing/sysfs-bus-platform b/Documentation/ABI/testing/sysfs-bus-platform new file mode 100644 index 0000000..5172a61 --- /dev/null +++ b/Documentation/ABI/testing/sysfs-bus-platform @@ -0,0 +1,20 @@ +What: /sys/bus/platform/devices/.../driver_override +Date: April 2014 +Contact: Kim Phillips +Description: + This file allows the driver for a device to be specified which + will override standard OF, ACPI, ID table, and name matching. + When specified, only a driver with a name matching the value + written to driver_override will have an opportunity to bind + to the device. The override is specified by writing a string + to the driver_override file (echo vfio-platform > \ + driver_override) and may be cleared with an empty string + (echo > driver_override). This returns the device to standard + matching rules binding. Writing to driver_override does not + automatically unbind the device from its current driver or make + any attempt to automatically load the specified driver. If no + driver with a matching name is currently loaded in the kernel, + the device will not bind to any driver. This also allows + devices to opt-out of driver binding using a driver_override + name such as "none". Only a single driver may be specified in + the override, there is no support for parsing delimiters. diff --git a/drivers/base/platform.c b/drivers/base/platform.c index 5b47210..4f47563 100644 --- a/drivers/base/platform.c +++ b/drivers/base/platform.c @@ -23,6 +23,7 @@ #include #include #include +#include #include "base.h" #include "power/power.h" @@ -188,6 +189,7 @@ static void platform_device_release(struct device *dev) kfree(pa->pdev.dev.platform_data); kfree(pa->pdev.mfd_cell); kfree(pa->pdev.resource); + kfree(pa->pdev.driver_override); kfree(pa); } @@ -695,8 +697,49 @@ static ssize_t modalias_show(struct device *dev, struct device_attribute *a, } static DEVICE_ATTR_RO(modalias); +static ssize_t driver_override_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct platform_device *pdev = to_platform_device(dev); + char *driver_override, *old = pdev->driver_override, *cp; + + if (count > PATH_MAX) + return -EINVAL; + + driver_override = kstrndup(buf, count, GFP_KERNEL); + if (!driver_override) + return -ENOMEM; + + cp = strchr(driver_override, '\n'); + if (cp) + *cp = '\0'; + + if (strlen(driver_override)) { + pdev->driver_override = driver_override; + } else { + kfree(driver_override); + pdev->driver_override = NULL; + } + + kfree(old); + + return count; +} + +static ssize_t driver_override_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct platform_device *pdev = to_platform_device(dev); + + return sprintf(buf, "%s\n", pdev->driver_override); +} +static DEVICE_ATTR_RW(driver_override); + + static struct attribute *platform_dev_attrs[] = { &dev_attr_modalias.attr, + &dev_attr_driver_override.attr, NULL, }; ATTRIBUTE_GROUPS(platform_dev); @@ -752,6 +795,10 @@ static int platform_match(struct device *dev, struct device_driver *drv) struct platform_device *pdev = to_platform_device(dev); struct platform_driver *pdrv = to_platform_driver(drv); + /* When driver_override is set, only bind to the matching driver */ + if (pdev->driver_override) + return !strcmp(pdev->driver_override, drv->name); + /* Attempt an OF style match first */ if (of_driver_match_device(dev, drv)) return 1; diff --git a/include/linux/platform_device.h b/include/linux/platform_device.h index 16f6654..153d303 100644 --- a/include/linux/platform_device.h +++ b/include/linux/platform_device.h @@ -28,6 +28,7 @@ struct platform_device { struct resource *resource; const struct platform_device_id *id_entry; + char *driver_override; /* Driver name to force a match */ /* MFD cell pointer */ struct mfd_cell *mfd_cell;