Linux-EFI Archive on lore.kernel.org
 help / color / Atom feed
* [PATCH v1 0/5] Add fw_devlink kernel commandline option
@ 2020-02-22  1:40 Saravana Kannan
  2020-02-22  1:40 ` [PATCH v1 1/5] driver core: Reevaluate dev->links.need_for_probe as suppliers are added Saravana Kannan
                   ` (4 more replies)
  0 siblings, 5 replies; 10+ messages in thread
From: Saravana Kannan @ 2020-02-22  1:40 UTC (permalink / raw)
  To: Jonathan Corbet, Greg Kroah-Hartman, Rafael J. Wysocki,
	Ard Biesheuvel, Rob Herring, Frank Rowand, Len Brown
  Cc: Saravana Kannan, kernel-team, linux-doc, linux-kernel, linux-efi,
	devicetree, linux-acpi

1/5 isn't really related to adding fw_devlink, but I'm just rolling it
into this series.

The rest of the series is about adding fw_devlink kernel commandline
that can be set to off|permissive|on|rpm which are in increasing order
of enforcement by device links.

2/5 is the most "interesting" part.

The hope is that once this series merges, we'll consider enabling
fw_devlink=permissive by default and at a later point in time ideally
"on".

Thanks,
Saravana

Saravana Kannan (5):
  driver core: Reevaluate dev->links.need_for_probe as suppliers are
    added
  driver core: Add fw_devlink kernel commandline option
  efi/arm: Start using fw_devlink_get_flags()
  of: property: Start using fw_devlink_get_flags()
  of: property: Delete of_devlink kernel commandline option

 .../admin-guide/kernel-parameters.txt         | 24 +++++++++----
 drivers/base/core.c                           | 35 +++++++++++++++++--
 drivers/firmware/efi/arm-init.c               |  2 +-
 drivers/of/property.c                         |  8 +----
 include/linux/fwnode.h                        |  2 ++
 5 files changed, 54 insertions(+), 17 deletions(-)

-- 
2.25.0.265.gbab2e86ba0-goog


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH v1 1/5] driver core: Reevaluate dev->links.need_for_probe as suppliers are added
  2020-02-22  1:40 [PATCH v1 0/5] Add fw_devlink kernel commandline option Saravana Kannan
@ 2020-02-22  1:40 ` Saravana Kannan
  2020-02-22  1:40 ` [PATCH v1 2/5] driver core: Add fw_devlink kernel commandline option Saravana Kannan
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 10+ messages in thread
From: Saravana Kannan @ 2020-02-22  1:40 UTC (permalink / raw)
  To: Jonathan Corbet, Greg Kroah-Hartman, Rafael J. Wysocki,
	Ard Biesheuvel, Rob Herring, Frank Rowand, Len Brown,
	Saravana Kannan
  Cc: kernel-team, linux-doc, linux-kernel, linux-efi, devicetree, linux-acpi

A previous patch 03324507e66c ("driver core: Allow
fwnode_operations.add_links to differentiate errors") forgot to update
all call sites to fwnode_operations.add_links. This patch fixes that.

Legend:
-> Denotes RHS is an optional/potential supplier for LHS
=> Denotes RHS is a mandatory supplier for LHS

Example:

Device A => Device X
Device A -> Device Y

Before this patch:
1. Device A is added.
2. Device A is marked as waiting for mandatory suppliers
3. Device X is added
4. Device A is left marked as waiting for mandatory suppliers

Step 4 is wrong since all mandatory suppliers of Device A have been
added.

After this patch:
1. Device A is added.
2. Device A is marked as waiting for mandatory suppliers
3. Device X is added
4. Device A is no longer considered as waiting for mandatory suppliers

This is the correct behavior.

Fixes: 03324507e66c ("driver core: Allow fwnode_operations.add_links to differentiate errors")
Signed-off-by: Saravana Kannan <saravanak@google.com>
---
 drivers/base/core.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/drivers/base/core.c b/drivers/base/core.c
index dbb0f9130f42..d32a3aefff32 100644
--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -523,9 +523,13 @@ static void device_link_add_missing_supplier_links(void)
 
 	mutex_lock(&wfs_lock);
 	list_for_each_entry_safe(dev, tmp, &wait_for_suppliers,
-				 links.needs_suppliers)
-		if (!fwnode_call_int_op(dev->fwnode, add_links, dev))
+				 links.needs_suppliers) {
+		int ret = fwnode_call_int_op(dev->fwnode, add_links, dev);
+		if (!ret)
 			list_del_init(&dev->links.needs_suppliers);
+		else if (ret != -ENODEV)
+			dev->links.need_for_probe = false;
+	}
 	mutex_unlock(&wfs_lock);
 }
 
-- 
2.25.0.265.gbab2e86ba0-goog


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH v1 2/5] driver core: Add fw_devlink kernel commandline option
  2020-02-22  1:40 [PATCH v1 0/5] Add fw_devlink kernel commandline option Saravana Kannan
  2020-02-22  1:40 ` [PATCH v1 1/5] driver core: Reevaluate dev->links.need_for_probe as suppliers are added Saravana Kannan
@ 2020-02-22  1:40 ` Saravana Kannan
  2020-02-28  3:27   ` Saravana Kannan
  2020-02-22  1:40 ` [PATCH v1 3/5] efi/arm: Start using fw_devlink_get_flags() Saravana Kannan
                   ` (2 subsequent siblings)
  4 siblings, 1 reply; 10+ messages in thread
From: Saravana Kannan @ 2020-02-22  1:40 UTC (permalink / raw)
  To: Jonathan Corbet, Greg Kroah-Hartman, Rafael J. Wysocki,
	Ard Biesheuvel, Rob Herring, Frank Rowand, Len Brown
  Cc: Saravana Kannan, kernel-team, linux-doc, linux-kernel, linux-efi,
	devicetree, linux-acpi

fwnode_operations.add_links allows creating device links from
information provided by firmware.

fwnode_operations.add_links is currently implemented only by
OF/devicetree code and a specific case of efi. However, there's nothing
preventing ACPI or other firmware types from implementing it.

The OF implementation is currently controlled by a kernel commandline
parameter called of_devlink.

Since this feature is generic isn't limited to OF, add a generic
fw_devlink kernel commandline parameter to control this feature across
firmware types.

Signed-off-by: Saravana Kannan <saravanak@google.com>
---
 .../admin-guide/kernel-parameters.txt         | 18 +++++++++++++
 drivers/base/core.c                           | 27 ++++++++++++++++++-
 include/linux/fwnode.h                        |  2 ++
 3 files changed, 46 insertions(+), 1 deletion(-)

diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
index dbc22d684627..29985152b66d 100644
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
@@ -1350,6 +1350,24 @@
 			can be changed at run time by the max_graph_depth file
 			in the tracefs tracing directory. default: 0 (no limit)
 
+	fw_devlink=	[KNL] Create device links between consumer and supplier
+			devices by scanning the firmware to infer the
+			consumer/supplier relationships. This feature is
+			especially useful when drivers are loaded as modules as
+			it ensures proper ordering of tasks like device probing
+			(suppliers first, then consumers), supplier boot state
+			clean up (only after all consumers have probed),
+			suspend/resume & runtime PM (consumers first, then
+			suppliers).
+			Format: { off | permissive | on | rpm }
+			off --	Don't create device links from firmware info.
+			permissive -- Create device links from firmware info
+				but use it only for ordering boot state clean
+				up (sync_state() calls).
+			on -- 	Create device links from firmware info and use it
+				to enforce probe and suspend/resume ordering.
+			rpm --	Like "on", but also use to order runtime PM.
+
 	gamecon.map[2|3]=
 			[HW,JOY] Multisystem joystick and NES/SNES/PSX pad
 			support via parallel port (up to 5 devices per port)
diff --git a/drivers/base/core.c b/drivers/base/core.c
index d32a3aefff32..aeaca8a3aad9 100644
--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -2345,6 +2345,31 @@ static int device_private_init(struct device *dev)
 	return 0;
 }
 
+u32 fw_devlink_flags;
+static int __init fw_devlink_setup(char *arg)
+{
+	if (!arg)
+		return -EINVAL;
+
+	if (strcmp(arg, "off") == 0) {
+		fw_devlink_flags = 0;
+	} else if (strcmp(arg, "permissive") == 0) {
+		fw_devlink_flags = DL_FLAG_SYNC_STATE_ONLY;
+	} else if (strcmp(arg, "on") == 0) {
+		fw_devlink_flags = DL_FLAG_AUTOPROBE_CONSUMER;
+	} else if (strcmp(arg, "rpm") == 0) {
+		fw_devlink_flags = DL_FLAG_AUTOPROBE_CONSUMER |
+				   DL_FLAG_PM_RUNTIME;
+	}
+	return 0;
+}
+early_param("fw_devlink", fw_devlink_setup);
+
+u32 fw_devlink_get_flags(void)
+{
+	return fw_devlink_flags;
+}
+
 /**
  * device_add - add device to device hierarchy.
  * @dev: device.
@@ -2493,7 +2518,7 @@ int device_add(struct device *dev)
 	 */
 	device_link_add_missing_supplier_links();
 
-	if (fwnode_has_op(dev->fwnode, add_links)) {
+	if (fw_devlink_flags && fwnode_has_op(dev->fwnode, add_links)) {
 		fw_ret = fwnode_call_int_op(dev->fwnode, add_links, dev);
 		if (fw_ret == -ENODEV)
 			device_link_wait_for_mandatory_supplier(dev);
diff --git a/include/linux/fwnode.h b/include/linux/fwnode.h
index 8feeb94b8acc..e0abafbb17f8 100644
--- a/include/linux/fwnode.h
+++ b/include/linux/fwnode.h
@@ -170,4 +170,6 @@ struct fwnode_operations {
 	} while (false)
 #define get_dev_from_fwnode(fwnode)	get_device((fwnode)->dev)
 
+extern u32 fw_devlink_get_flags(void);
+
 #endif
-- 
2.25.0.265.gbab2e86ba0-goog


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH v1 3/5] efi/arm: Start using fw_devlink_get_flags()
  2020-02-22  1:40 [PATCH v1 0/5] Add fw_devlink kernel commandline option Saravana Kannan
  2020-02-22  1:40 ` [PATCH v1 1/5] driver core: Reevaluate dev->links.need_for_probe as suppliers are added Saravana Kannan
  2020-02-22  1:40 ` [PATCH v1 2/5] driver core: Add fw_devlink kernel commandline option Saravana Kannan
@ 2020-02-22  1:40 ` Saravana Kannan
  2020-02-22  7:37   ` Ard Biesheuvel
  2020-02-22  1:40 ` [PATCH v1 4/5] of: property: " Saravana Kannan
  2020-02-22  1:40 ` [PATCH v1 5/5] of: property: Delete of_devlink kernel commandline option Saravana Kannan
  4 siblings, 1 reply; 10+ messages in thread
From: Saravana Kannan @ 2020-02-22  1:40 UTC (permalink / raw)
  To: Jonathan Corbet, Greg Kroah-Hartman, Rafael J. Wysocki,
	Ard Biesheuvel, Rob Herring, Frank Rowand, Len Brown
  Cc: Saravana Kannan, kernel-team, linux-doc, linux-kernel, linux-efi,
	devicetree, linux-acpi

The fw_devlink_get_flags() provides the right flags to use when creating
mandatory device links derived from information provided by the
firmware. So, use that.

Signed-off-by: Saravana Kannan <saravanak@google.com>
---
 drivers/firmware/efi/arm-init.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/firmware/efi/arm-init.c b/drivers/firmware/efi/arm-init.c
index d99f5b0c8a09..6703bedfa9e1 100644
--- a/drivers/firmware/efi/arm-init.c
+++ b/drivers/firmware/efi/arm-init.c
@@ -349,7 +349,7 @@ static int efifb_add_links(const struct fwnode_handle *fwnode,
 	 * If this fails, retrying this function at a later point won't
 	 * change anything. So, don't return an error after this.
 	 */
-	if (!device_link_add(dev, sup_dev, 0))
+	if (!device_link_add(dev, sup_dev, fw_devlink_get_flags()))
 		dev_warn(dev, "device_link_add() failed\n");
 
 	put_device(sup_dev);
-- 
2.25.0.265.gbab2e86ba0-goog


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH v1 4/5] of: property: Start using fw_devlink_get_flags()
  2020-02-22  1:40 [PATCH v1 0/5] Add fw_devlink kernel commandline option Saravana Kannan
                   ` (2 preceding siblings ...)
  2020-02-22  1:40 ` [PATCH v1 3/5] efi/arm: Start using fw_devlink_get_flags() Saravana Kannan
@ 2020-02-22  1:40 ` " Saravana Kannan
  2020-02-26 21:40   ` Rob Herring
  2020-02-22  1:40 ` [PATCH v1 5/5] of: property: Delete of_devlink kernel commandline option Saravana Kannan
  4 siblings, 1 reply; 10+ messages in thread
From: Saravana Kannan @ 2020-02-22  1:40 UTC (permalink / raw)
  To: Jonathan Corbet, Greg Kroah-Hartman, Rafael J. Wysocki,
	Ard Biesheuvel, Rob Herring, Frank Rowand, Len Brown
  Cc: Saravana Kannan, kernel-team, linux-doc, linux-kernel, linux-efi,
	devicetree, linux-acpi

The fw_devlink_get_flags() provides the right flags to use when creating
mandatory device links derived from information provided by the
firmware. So, use that.

Signed-off-by: Saravana Kannan <saravanak@google.com>
---
 drivers/of/property.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/of/property.c b/drivers/of/property.c
index e851c57a15b0..15fc9315f1a7 100644
--- a/drivers/of/property.c
+++ b/drivers/of/property.c
@@ -1262,7 +1262,7 @@ static int of_link_property(struct device *dev, struct device_node *con_np,
 	u32 dl_flags;
 
 	if (dev->of_node == con_np)
-		dl_flags = DL_FLAG_AUTOPROBE_CONSUMER;
+		dl_flags = fw_devlink_get_flags();
 	else
 		dl_flags = DL_FLAG_SYNC_STATE_ONLY;
 
-- 
2.25.0.265.gbab2e86ba0-goog


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH v1 5/5] of: property: Delete of_devlink kernel commandline option
  2020-02-22  1:40 [PATCH v1 0/5] Add fw_devlink kernel commandline option Saravana Kannan
                   ` (3 preceding siblings ...)
  2020-02-22  1:40 ` [PATCH v1 4/5] of: property: " Saravana Kannan
@ 2020-02-22  1:40 ` Saravana Kannan
  2020-02-26 21:41   ` Rob Herring
  4 siblings, 1 reply; 10+ messages in thread
From: Saravana Kannan @ 2020-02-22  1:40 UTC (permalink / raw)
  To: Jonathan Corbet, Greg Kroah-Hartman, Rafael J. Wysocki,
	Ard Biesheuvel, Rob Herring, Frank Rowand, Len Brown
  Cc: Saravana Kannan, kernel-team, linux-doc, linux-kernel, linux-efi,
	devicetree, linux-acpi

With the addition of fw_devlink kernel commandline option, of_devlink is
redundant and not useful anymore. So, delete it.

Signed-off-by: Saravana Kannan <saravanak@google.com>
---
 Documentation/admin-guide/kernel-parameters.txt | 6 ------
 drivers/of/property.c                           | 6 ------
 2 files changed, 12 deletions(-)

diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
index 29985152b66d..6692b2aa6140 100644
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
@@ -3299,12 +3299,6 @@
 			This can be set from sysctl after boot.
 			See Documentation/admin-guide/sysctl/vm.rst for details.
 
-	of_devlink	[OF, KNL] Create device links between consumer and
-			supplier devices by scanning the devictree to infer the
-			consumer/supplier relationships.  A consumer device
-			will not be probed until all the supplier devices have
-			probed successfully.
-
 	ohci1394_dma=early	[HW] enable debugging via the ohci1394 driver.
 			See Documentation/debugging-via-ohci1394.txt for more
 			info.
diff --git a/drivers/of/property.c b/drivers/of/property.c
index 15fc9315f1a7..f104f15b57fb 100644
--- a/drivers/of/property.c
+++ b/drivers/of/property.c
@@ -1299,15 +1299,9 @@ static int of_link_to_suppliers(struct device *dev,
 	return ret;
 }
 
-static bool of_devlink;
-core_param(of_devlink, of_devlink, bool, 0);
-
 static int of_fwnode_add_links(const struct fwnode_handle *fwnode,
 			       struct device *dev)
 {
-	if (!of_devlink)
-		return 0;
-
 	if (unlikely(!is_of_node(fwnode)))
 		return 0;
 
-- 
2.25.0.265.gbab2e86ba0-goog


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v1 3/5] efi/arm: Start using fw_devlink_get_flags()
  2020-02-22  1:40 ` [PATCH v1 3/5] efi/arm: Start using fw_devlink_get_flags() Saravana Kannan
@ 2020-02-22  7:37   ` Ard Biesheuvel
  0 siblings, 0 replies; 10+ messages in thread
From: Ard Biesheuvel @ 2020-02-22  7:37 UTC (permalink / raw)
  To: Saravana Kannan
  Cc: Jonathan Corbet, Greg Kroah-Hartman, Rafael J. Wysocki,
	Rob Herring, Frank Rowand, Len Brown, Android Kernel Team,
	Linux Doc Mailing List, Linux Kernel Mailing List, linux-efi,
	Devicetree List, ACPI Devel Maling List

On Sat, 22 Feb 2020 at 02:40, Saravana Kannan <saravanak@google.com> wrote:
>
> The fw_devlink_get_flags() provides the right flags to use when creating
> mandatory device links derived from information provided by the
> firmware. So, use that.
>
> Signed-off-by: Saravana Kannan <saravanak@google.com>
> ---

Acked-by: Ard Biesheuvel <ardb@kernel.org>

>  drivers/firmware/efi/arm-init.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/firmware/efi/arm-init.c b/drivers/firmware/efi/arm-init.c
> index d99f5b0c8a09..6703bedfa9e1 100644
> --- a/drivers/firmware/efi/arm-init.c
> +++ b/drivers/firmware/efi/arm-init.c
> @@ -349,7 +349,7 @@ static int efifb_add_links(const struct fwnode_handle *fwnode,
>          * If this fails, retrying this function at a later point won't
>          * change anything. So, don't return an error after this.
>          */
> -       if (!device_link_add(dev, sup_dev, 0))
> +       if (!device_link_add(dev, sup_dev, fw_devlink_get_flags()))
>                 dev_warn(dev, "device_link_add() failed\n");
>
>         put_device(sup_dev);
> --
> 2.25.0.265.gbab2e86ba0-goog
>

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v1 4/5] of: property: Start using fw_devlink_get_flags()
  2020-02-22  1:40 ` [PATCH v1 4/5] of: property: " Saravana Kannan
@ 2020-02-26 21:40   ` Rob Herring
  0 siblings, 0 replies; 10+ messages in thread
From: Rob Herring @ 2020-02-26 21:40 UTC (permalink / raw)
  To: Saravana Kannan
  Cc: Jonathan Corbet, Greg Kroah-Hartman, Rafael J. Wysocki,
	Ard Biesheuvel, Saravana Kannan, kernel-team, linux-doc,
	linux-kernel, linux-efi, devicetree, linux-acpi

On Fri, 21 Feb 2020 17:40:37 -0800, Saravana Kannan wrote:
> The fw_devlink_get_flags() provides the right flags to use when creating
> mandatory device links derived from information provided by the
> firmware. So, use that.
> 
> Signed-off-by: Saravana Kannan <saravanak@google.com>
> ---
>  drivers/of/property.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 

Acked-by: Rob Herring <robh@kernel.org>

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v1 5/5] of: property: Delete of_devlink kernel commandline option
  2020-02-22  1:40 ` [PATCH v1 5/5] of: property: Delete of_devlink kernel commandline option Saravana Kannan
@ 2020-02-26 21:41   ` Rob Herring
  0 siblings, 0 replies; 10+ messages in thread
From: Rob Herring @ 2020-02-26 21:41 UTC (permalink / raw)
  To: Saravana Kannan
  Cc: Jonathan Corbet, Greg Kroah-Hartman, Rafael J. Wysocki,
	Ard Biesheuvel, Saravana Kannan, kernel-team, linux-doc,
	linux-kernel, linux-efi, devicetree, linux-acpi

On Fri, 21 Feb 2020 17:40:38 -0800, Saravana Kannan wrote:
> With the addition of fw_devlink kernel commandline option, of_devlink is
> redundant and not useful anymore. So, delete it.
> 
> Signed-off-by: Saravana Kannan <saravanak@google.com>
> ---
>  Documentation/admin-guide/kernel-parameters.txt | 6 ------
>  drivers/of/property.c                           | 6 ------
>  2 files changed, 12 deletions(-)
> 

Acked-by: Rob Herring <robh@kernel.org>

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v1 2/5] driver core: Add fw_devlink kernel commandline option
  2020-02-22  1:40 ` [PATCH v1 2/5] driver core: Add fw_devlink kernel commandline option Saravana Kannan
@ 2020-02-28  3:27   ` Saravana Kannan
  0 siblings, 0 replies; 10+ messages in thread
From: Saravana Kannan @ 2020-02-28  3:27 UTC (permalink / raw)
  To: Jonathan Corbet, Greg Kroah-Hartman, Rafael J. Wysocki,
	Ard Biesheuvel, Rob Herring, Frank Rowand, Len Brown
  Cc: Android Kernel Team, Linux Doc Mailing List, LKML, linux-efi,
	open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS,
	ACPI Devel Maling List

On Fri, Feb 21, 2020 at 5:40 PM Saravana Kannan <saravanak@google.com> wrote:
>
> fwnode_operations.add_links allows creating device links from
> information provided by firmware.
>
> fwnode_operations.add_links is currently implemented only by
> OF/devicetree code and a specific case of efi. However, there's nothing
> preventing ACPI or other firmware types from implementing it.
>
> The OF implementation is currently controlled by a kernel commandline
> parameter called of_devlink.
>
> Since this feature is generic isn't limited to OF, add a generic
> fw_devlink kernel commandline parameter to control this feature across
> firmware types.
>
> Signed-off-by: Saravana Kannan <saravanak@google.com>
> ---
>  .../admin-guide/kernel-parameters.txt         | 18 +++++++++++++
>  drivers/base/core.c                           | 27 ++++++++++++++++++-
>  include/linux/fwnode.h                        |  2 ++
>  3 files changed, 46 insertions(+), 1 deletion(-)
>
> diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
> index dbc22d684627..29985152b66d 100644
> --- a/Documentation/admin-guide/kernel-parameters.txt
> +++ b/Documentation/admin-guide/kernel-parameters.txt
> @@ -1350,6 +1350,24 @@
>                         can be changed at run time by the max_graph_depth file
>                         in the tracefs tracing directory. default: 0 (no limit)
>
> +       fw_devlink=     [KNL] Create device links between consumer and supplier
> +                       devices by scanning the firmware to infer the
> +                       consumer/supplier relationships. This feature is
> +                       especially useful when drivers are loaded as modules as
> +                       it ensures proper ordering of tasks like device probing
> +                       (suppliers first, then consumers), supplier boot state
> +                       clean up (only after all consumers have probed),
> +                       suspend/resume & runtime PM (consumers first, then
> +                       suppliers).
> +                       Format: { off | permissive | on | rpm }
> +                       off --  Don't create device links from firmware info.
> +                       permissive -- Create device links from firmware info
> +                               but use it only for ordering boot state clean
> +                               up (sync_state() calls).
> +                       on --   Create device links from firmware info and use it
> +                               to enforce probe and suspend/resume ordering.
> +                       rpm --  Like "on", but also use to order runtime PM.
> +

A bit of bikeshedding myself: I could rename "on" to "enforce" and
"rpm" to "enforce-rpm".

Let me know if any of you have a strong preference on these two options.

-Saravana

>         gamecon.map[2|3]=
>                         [HW,JOY] Multisystem joystick and NES/SNES/PSX pad
>                         support via parallel port (up to 5 devices per port)
> diff --git a/drivers/base/core.c b/drivers/base/core.c
> index d32a3aefff32..aeaca8a3aad9 100644
> --- a/drivers/base/core.c
> +++ b/drivers/base/core.c
> @@ -2345,6 +2345,31 @@ static int device_private_init(struct device *dev)
>         return 0;
>  }
>
> +u32 fw_devlink_flags;
> +static int __init fw_devlink_setup(char *arg)
> +{
> +       if (!arg)
> +               return -EINVAL;
> +
> +       if (strcmp(arg, "off") == 0) {
> +               fw_devlink_flags = 0;
> +       } else if (strcmp(arg, "permissive") == 0) {
> +               fw_devlink_flags = DL_FLAG_SYNC_STATE_ONLY;
> +       } else if (strcmp(arg, "on") == 0) {
> +               fw_devlink_flags = DL_FLAG_AUTOPROBE_CONSUMER;
> +       } else if (strcmp(arg, "rpm") == 0) {
> +               fw_devlink_flags = DL_FLAG_AUTOPROBE_CONSUMER |
> +                                  DL_FLAG_PM_RUNTIME;
> +       }
> +       return 0;
> +}
> +early_param("fw_devlink", fw_devlink_setup);
> +
> +u32 fw_devlink_get_flags(void)
> +{
> +       return fw_devlink_flags;
> +}
> +
>  /**
>   * device_add - add device to device hierarchy.
>   * @dev: device.
> @@ -2493,7 +2518,7 @@ int device_add(struct device *dev)
>          */
>         device_link_add_missing_supplier_links();
>
> -       if (fwnode_has_op(dev->fwnode, add_links)) {
> +       if (fw_devlink_flags && fwnode_has_op(dev->fwnode, add_links)) {
>                 fw_ret = fwnode_call_int_op(dev->fwnode, add_links, dev);
>                 if (fw_ret == -ENODEV)
>                         device_link_wait_for_mandatory_supplier(dev);
> diff --git a/include/linux/fwnode.h b/include/linux/fwnode.h
> index 8feeb94b8acc..e0abafbb17f8 100644
> --- a/include/linux/fwnode.h
> +++ b/include/linux/fwnode.h
> @@ -170,4 +170,6 @@ struct fwnode_operations {
>         } while (false)
>  #define get_dev_from_fwnode(fwnode)    get_device((fwnode)->dev)
>
> +extern u32 fw_devlink_get_flags(void);
> +
>  #endif
> --
> 2.25.0.265.gbab2e86ba0-goog
>

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, back to index

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-02-22  1:40 [PATCH v1 0/5] Add fw_devlink kernel commandline option Saravana Kannan
2020-02-22  1:40 ` [PATCH v1 1/5] driver core: Reevaluate dev->links.need_for_probe as suppliers are added Saravana Kannan
2020-02-22  1:40 ` [PATCH v1 2/5] driver core: Add fw_devlink kernel commandline option Saravana Kannan
2020-02-28  3:27   ` Saravana Kannan
2020-02-22  1:40 ` [PATCH v1 3/5] efi/arm: Start using fw_devlink_get_flags() Saravana Kannan
2020-02-22  7:37   ` Ard Biesheuvel
2020-02-22  1:40 ` [PATCH v1 4/5] of: property: " Saravana Kannan
2020-02-26 21:40   ` Rob Herring
2020-02-22  1:40 ` [PATCH v1 5/5] of: property: Delete of_devlink kernel commandline option Saravana Kannan
2020-02-26 21:41   ` Rob Herring

Linux-EFI Archive on lore.kernel.org

Archives are clonable:
	git clone --mirror https://lore.kernel.org/linux-efi/0 linux-efi/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 linux-efi linux-efi/ https://lore.kernel.org/linux-efi \
		linux-efi@vger.kernel.org
	public-inbox-index linux-efi

Example config snippet for mirrors

Newsgroup available over NNTP:
	nntp://nntp.lore.kernel.org/org.kernel.vger.linux-efi


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git