From: Kim Phillips <kim.phillips@linaro.org>
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 <julien.grall@linaro.org>,
Ian Campbell <ian.campbell@citrix.com>,
Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
Alexander Graf <agraf@suse.de>
Subject: [RFC PATCH v5_v2 01/11] driver core: platform: add device binding path 'driver_override'
Date: Tue, 20 May 2014 19:25:37 -0500 [thread overview]
Message-ID: <20140520192537.bab9fa2088c1cd5da3f92639@linaro.org> (raw)
In-Reply-To: <1398700371-20096-2-git-send-email-a.motakis@virtualopensystems.com>
From: Kim Phillips <kim.phillips@freescale.com>
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 <alex.williamson@redhat.com>
Signed-off-by: Kim Phillips <kim.phillips@freescale.com>
---
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 <kim.phillips@freescale.com>
+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 <linux/pm_runtime.h>
#include <linux/idr.h>
#include <linux/acpi.h>
+#include <linux/limits.h>
#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;
--
1.9.3
next prev parent reply other threads:[~2014-05-21 0:25 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <1398700371-20096-1-git-send-email-a.motakis@virtualopensystems.com>
2014-04-28 15:52 ` [RFC PATCH v5 " Antonios Motakis
2014-05-21 0:25 ` Kim Phillips [this message]
2014-05-29 19:43 ` [RFC PATCH v5_v2 " Alex Williamson
2014-05-29 21:24 ` Alexander Graf
2014-06-03 0:42 ` [PATCH] " Kim Phillips
2014-06-03 4:28 ` Greg KH
2014-06-26 1:08 ` Kim Phillips
2014-07-07 21:19 ` Kim Phillips
2014-07-08 22:37 ` Greg KH
2014-04-28 15:52 ` [RFC PATCH v5 02/11] ARM SMMU: Add capability IOMMU_CAP_DMA_EXEC Antonios Motakis
2014-04-28 19:37 ` Will Deacon
2014-04-28 20:20 ` Alex Williamson
2014-04-29 9:52 ` Antonios Motakis
2014-04-28 15:52 ` [RFC PATCH v5 03/11] VFIO_IOMMU_TYPE1 for platform bus devices on ARM Antonios Motakis
2014-04-28 16:43 ` Alex Williamson
2014-04-28 19:19 ` Will Deacon
2014-04-28 20:08 ` Alex Williamson
2014-04-30 13:08 ` Will Deacon
2014-04-28 15:52 ` [RFC PATCH v5 04/11] VFIO_IOMMU_TYPE1: Introduce the VFIO_DMA_MAP_FLAG_EXEC flag Antonios Motakis
[not found] ` <1398704036.24318.269.camel@ul30vt.home>
2014-04-29 13:16 ` Antonios Motakis
2014-04-28 15:52 ` [RFC PATCH v5 05/11] VFIO_PLATFORM: Initial skeleton of VFIO support for platform devices Antonios Motakis
[not found] ` <1398704642.24318.273.camel@ul30vt.home>
2014-04-29 13:23 ` Antonios Motakis
2014-04-28 15:52 ` [RFC PATCH v5 06/11] VFIO_PLATFORM: Return info for device and its memory mapped IO regions Antonios Motakis
2014-04-28 17:16 ` Alex Williamson
2014-04-28 15:52 ` [RFC PATCH v5 07/11] VFIO_PLATFORM: Read and write support for the device fd Antonios Motakis
2014-04-28 17:24 ` Alex Williamson
2014-04-29 13:27 ` Antonios Motakis
2014-04-28 15:52 ` [RFC PATCH v5 08/11] VFIO_PLATFORM: Support MMAP of MMIO regions Antonios Motakis
2014-04-28 17:27 ` Alex Williamson
2014-04-29 13:28 ` Antonios Motakis
2014-04-28 15:52 ` [RFC PATCH v5 09/11] VFIO_PLATFORM: Return IRQ info Antonios Motakis
2014-04-28 17:33 ` Alex Williamson
2014-04-28 15:52 ` [RFC PATCH v5 10/11] VFIO_PLATFORM: Initial interrupts support Antonios Motakis
2014-04-28 15:52 ` [RFC PATCH v5 11/11] VFIO_PLATFORM: Support for maskable and automasked interrupts Antonios Motakis
2014-04-28 17:46 ` Alex Williamson
2014-05-02 17:25 ` Antonios Motakis
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20140520192537.bab9fa2088c1cd5da3f92639@linaro.org \
--to=kim.phillips@linaro.org \
--cc=a.motakis@virtualopensystems.com \
--cc=a.rigo@virtualopensystems.com \
--cc=agraf@suse.de \
--cc=alex.williamson@redhat.com \
--cc=christoffer.dall@linaro.org \
--cc=clbchenlibo.chen@huawei.com \
--cc=eric.auger@linaro.org \
--cc=grant.likely@linaro.org \
--cc=gregkh@linuxfoundation.org \
--cc=ian.campbell@citrix.com \
--cc=iommu@lists.linux-foundation.org \
--cc=jhovold@gmail.com \
--cc=julien.grall@linaro.org \
--cc=kvm@vger.kernel.org \
--cc=kvmarm@lists.cs.columbia.edu \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=rob.herring@calxeda.com \
--cc=rob@landley.net \
--cc=stefano.stabellini@eu.citrix.com \
--cc=stuart.yoder@freescale.com \
--cc=tech@virtualopensystems.com \
--cc=will.deacon@arm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®