linux-acpi.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v5 0/5] acpi: Store _PLD information and convert users
@ 2021-12-23  8:16 Heikki Krogerus
  2021-12-23  8:16 ` [PATCH v5 1/5] acpi: Export acpi_bus_type Heikki Krogerus
                   ` (5 more replies)
  0 siblings, 6 replies; 13+ messages in thread
From: Heikki Krogerus @ 2021-12-23  8:16 UTC (permalink / raw)
  To: Rafael J. Wysocki, Greg Kroah-Hartman
  Cc: Andy Shevchenko, Sakari Ailus, Prashant Malani, linux-acpi,
	linux-usb, linux-kernel

Hi,

The last version (v4) was not properly cleaned up. Should be now OK.


v4 cover letter:

Now only storing the crc hash to a new member in struct acpi_device,
just like proposed by Rafael. In port-mapper.c I'm then scanning the
acpi bus separately with every port in order to find the matching
devices.


v3 cover letter:

The _PLD buffer is no longer stored as requested by Rafael, so the
drivers will need to continue to evaluate the _PLD if they need it.

The stored locations will therefore only contain the list of other
devices that share the location, but that is most important, and in
practice the main goal of the series in any case.


v2 cover letter:

I'm now using the helpers device_match_acpi_dev() and
device_match_fwnode() like Andy suggested. No other changes.


The original cover letter:

This removes the need for the drivers to always separately evaluate
the _PLD. With the USB Type-C connector and USB port mapping this
allows us to start using the component framework and remove the custom
APIs.

So far the only users of the _PLD information have been the USB
drivers, but it seems it will be used also at least in some camera
drivers later. These nevertheless touch mostly USB drivers.

thanks,

Heikki Krogerus (5):
  acpi: Export acpi_bus_type
  acpi: Store CRC-32 hash of the _PLD in struct acpi_device
  usb: Link the ports to the connectors they are attached to
  usb: typec: port-mapper: Convert to the component framework
  usb: Remove usb_for_each_port()

 Documentation/ABI/testing/sysfs-bus-usb |   9 +
 drivers/acpi/bus.c                      |   1 +
 drivers/acpi/scan.c                     |  16 ++
 drivers/usb/core/port.c                 |  32 +++
 drivers/usb/core/usb.c                  |  46 ----
 drivers/usb/typec/Makefile              |   3 +-
 drivers/usb/typec/class.c               |   2 -
 drivers/usb/typec/class.h               |  10 +-
 drivers/usb/typec/port-mapper.c         | 279 ++++--------------------
 include/acpi/acpi_bus.h                 |   1 +
 include/linux/usb.h                     |   9 -
 include/linux/usb/typec.h               |  12 -
 12 files changed, 105 insertions(+), 315 deletions(-)

-- 
2.34.1


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

* [PATCH v5 1/5] acpi: Export acpi_bus_type
  2021-12-23  8:16 [PATCH v5 0/5] acpi: Store _PLD information and convert users Heikki Krogerus
@ 2021-12-23  8:16 ` Heikki Krogerus
  2021-12-23  8:16 ` [PATCH v5 2/5] acpi: Store CRC-32 hash of the _PLD in struct acpi_device Heikki Krogerus
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 13+ messages in thread
From: Heikki Krogerus @ 2021-12-23  8:16 UTC (permalink / raw)
  To: Rafael J. Wysocki, Greg Kroah-Hartman
  Cc: Andy Shevchenko, Sakari Ailus, Prashant Malani, linux-acpi,
	linux-usb, linux-kernel

So we can use bus_for_each_dev() and others from modules.

Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
---
 drivers/acpi/bus.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c
index dd535b4b9a160..572588bc6ede0 100644
--- a/drivers/acpi/bus.c
+++ b/drivers/acpi/bus.c
@@ -1043,6 +1043,7 @@ struct bus_type acpi_bus_type = {
 	.remove		= acpi_device_remove,
 	.uevent		= acpi_device_uevent,
 };
+EXPORT_SYMBOL_GPL(acpi_bus_type);
 
 /* --------------------------------------------------------------------------
                              Initialization/Cleanup
-- 
2.34.1


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

* [PATCH v5 2/5] acpi: Store CRC-32 hash of the _PLD in struct acpi_device
  2021-12-23  8:16 [PATCH v5 0/5] acpi: Store _PLD information and convert users Heikki Krogerus
  2021-12-23  8:16 ` [PATCH v5 1/5] acpi: Export acpi_bus_type Heikki Krogerus
@ 2021-12-23  8:16 ` Heikki Krogerus
  2022-01-30 16:41   ` Guenter Roeck
  2021-12-23  8:23 ` [PATCH v5 3/5] usb: Link the ports to the connectors they are attached to Heikki Krogerus
                   ` (3 subsequent siblings)
  5 siblings, 1 reply; 13+ messages in thread
From: Heikki Krogerus @ 2021-12-23  8:16 UTC (permalink / raw)
  To: Rafael J. Wysocki, Greg Kroah-Hartman
  Cc: Andy Shevchenko, Sakari Ailus, Prashant Malani, linux-acpi,
	linux-usb, linux-kernel

Storing CRC-32 hash of the Physical Location of Device
object (_PLD) with devices that have it. The hash is stored
to a new struct acpi_device member "pld_crc".

The hash makes it easier to find devices that share a
location, as there is no need to evaluate the entire object
every time. Knowledge about devices that share a location
can be used in device drivers that need to know the
connections to other components inside a system. USB3 ports
will for example always share their location with a USB2
port.

Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
---
 drivers/acpi/scan.c     | 16 ++++++++++++++++
 include/acpi/acpi_bus.h |  1 +
 2 files changed, 17 insertions(+)

diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
index 7ff55a197a583..113414c46b713 100644
--- a/drivers/acpi/scan.c
+++ b/drivers/acpi/scan.c
@@ -19,6 +19,7 @@
 #include <linux/dma-map-ops.h>
 #include <linux/platform_data/x86/apple.h>
 #include <linux/pgtable.h>
+#include <linux/crc32.h>
 
 #include "internal.h"
 
@@ -667,6 +668,19 @@ static int acpi_tie_acpi_dev(struct acpi_device *adev)
 	return 0;
 }
 
+static void acpi_store_pld_crc(struct acpi_device *adev)
+{
+	struct acpi_pld_info *pld;
+	acpi_status status;
+
+	status = acpi_get_physical_device_location(adev->handle, &pld);
+	if (ACPI_FAILURE(status))
+		return;
+
+	adev->pld_crc = crc32(~0, pld, sizeof(*pld));
+	ACPI_FREE(pld);
+}
+
 static int __acpi_device_add(struct acpi_device *device,
 			     void (*release)(struct device *))
 {
@@ -725,6 +739,8 @@ static int __acpi_device_add(struct acpi_device *device,
 	if (device->wakeup.flags.valid)
 		list_add_tail(&device->wakeup_list, &acpi_wakeup_device_list);
 
+	acpi_store_pld_crc(device);
+
 	mutex_unlock(&acpi_device_lock);
 
 	if (device->parent)
diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h
index 8e87ead2af341..f8c945418df23 100644
--- a/include/acpi/acpi_bus.h
+++ b/include/acpi/acpi_bus.h
@@ -360,6 +360,7 @@ struct acpi_gpio_mapping;
 
 /* Device */
 struct acpi_device {
+	u32 pld_crc;
 	int device_type;
 	acpi_handle handle;		/* no handle for fixed hardware */
 	struct fwnode_handle fwnode;
-- 
2.34.1


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

* [PATCH v5 3/5] usb: Link the ports to the connectors they are attached to
  2021-12-23  8:16 [PATCH v5 0/5] acpi: Store _PLD information and convert users Heikki Krogerus
  2021-12-23  8:16 ` [PATCH v5 1/5] acpi: Export acpi_bus_type Heikki Krogerus
  2021-12-23  8:16 ` [PATCH v5 2/5] acpi: Store CRC-32 hash of the _PLD in struct acpi_device Heikki Krogerus
@ 2021-12-23  8:23 ` Heikki Krogerus
  2021-12-23  8:24 ` [PATCH v5 4/5] usb: typec: port-mapper: Convert to the component framework Heikki Krogerus
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 13+ messages in thread
From: Heikki Krogerus @ 2021-12-23  8:23 UTC (permalink / raw)
  To: Rafael J. Wysocki, Greg Kroah-Hartman
  Cc: Andy Shevchenko, Sakari Ailus, Prashant Malani, linux-acpi,
	linux-usb, linux-kernel

Creating link to the USB Type-C connector for every new port
that is added when possible.

Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
---
 Documentation/ABI/testing/sysfs-bus-usb |  9 +++++++
 drivers/usb/core/port.c                 | 32 +++++++++++++++++++++++++
 2 files changed, 41 insertions(+)

diff --git a/Documentation/ABI/testing/sysfs-bus-usb b/Documentation/ABI/testing/sysfs-bus-usb
index 2ebe5708b4bc0..7efe31ed3a25c 100644
--- a/Documentation/ABI/testing/sysfs-bus-usb
+++ b/Documentation/ABI/testing/sysfs-bus-usb
@@ -244,6 +244,15 @@ Description:
 		is permitted, "u2" if only u2 is permitted, "u1_u2" if both u1 and
 		u2 are permitted.
 
+What:		/sys/bus/usb/devices/.../<hub_interface>/port<X>/connector
+Date:		December 2021
+Contact:	Heikki Krogerus <heikki.krogerus@linux.intel.com>
+Description:
+		Link to the USB Type-C connector when available. This link is
+		only created when USB Type-C Connector Class is enabled, and
+		only if the system firmware is capable of describing the
+		connection between a port and its connector.
+
 What:		/sys/bus/usb/devices/.../power/usb2_lpm_l1_timeout
 Date:		May 2013
 Contact:	Mathias Nyman <mathias.nyman@linux.intel.com>
diff --git a/drivers/usb/core/port.c b/drivers/usb/core/port.c
index dfcca9c876c73..c2bbf97a79bec 100644
--- a/drivers/usb/core/port.c
+++ b/drivers/usb/core/port.c
@@ -9,6 +9,7 @@
 
 #include <linux/slab.h>
 #include <linux/pm_qos.h>
+#include <linux/component.h>
 
 #include "hub.h"
 
@@ -528,6 +529,32 @@ static void find_and_link_peer(struct usb_hub *hub, int port1)
 		link_peers_report(port_dev, peer);
 }
 
+static int connector_bind(struct device *dev, struct device *connector, void *data)
+{
+	int ret;
+
+	ret = sysfs_create_link(&dev->kobj, &connector->kobj, "connector");
+	if (ret)
+		return ret;
+
+	ret = sysfs_create_link(&connector->kobj, &dev->kobj, dev_name(dev));
+	if (ret)
+		sysfs_remove_link(&dev->kobj, "connector");
+
+	return ret;
+}
+
+static void connector_unbind(struct device *dev, struct device *connector, void *data)
+{
+	sysfs_remove_link(&connector->kobj, dev_name(dev));
+	sysfs_remove_link(&dev->kobj, "connector");
+}
+
+static const struct component_ops connector_ops = {
+	.bind = connector_bind,
+	.unbind = connector_unbind,
+};
+
 int usb_hub_create_port_device(struct usb_hub *hub, int port1)
 {
 	struct usb_port *port_dev;
@@ -577,6 +604,10 @@ int usb_hub_create_port_device(struct usb_hub *hub, int port1)
 
 	find_and_link_peer(hub, port1);
 
+	retval = component_add(&port_dev->dev, &connector_ops);
+	if (retval)
+		dev_warn(&port_dev->dev, "failed to add component\n");
+
 	/*
 	 * Enable runtime pm and hold a refernce that hub_configure()
 	 * will drop once the PM_QOS_NO_POWER_OFF flag state has been set
@@ -619,5 +650,6 @@ void usb_hub_remove_port_device(struct usb_hub *hub, int port1)
 	peer = port_dev->peer;
 	if (peer)
 		unlink_peers(port_dev, peer);
+	component_del(&port_dev->dev, &connector_ops);
 	device_unregister(&port_dev->dev);
 }
-- 
2.34.1


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

* [PATCH v5 4/5] usb: typec: port-mapper: Convert to the component framework
  2021-12-23  8:16 [PATCH v5 0/5] acpi: Store _PLD information and convert users Heikki Krogerus
                   ` (2 preceding siblings ...)
  2021-12-23  8:23 ` [PATCH v5 3/5] usb: Link the ports to the connectors they are attached to Heikki Krogerus
@ 2021-12-23  8:24 ` Heikki Krogerus
  2022-01-25 14:00   ` 'Re: [PATCH v5 4/5] usb: typec: port-mapper: Convert to the component framework' Mike Lothian
  2021-12-23  8:24 ` [PATCH v5 5/5] usb: Remove usb_for_each_port() Heikki Krogerus
  2021-12-27 16:18 ` [PATCH v5 0/5] acpi: Store _PLD information and convert users Rafael J. Wysocki
  5 siblings, 1 reply; 13+ messages in thread
From: Heikki Krogerus @ 2021-12-23  8:24 UTC (permalink / raw)
  To: Rafael J. Wysocki, Greg Kroah-Hartman
  Cc: Andy Shevchenko, Sakari Ailus, Prashant Malani, linux-acpi,
	linux-usb, linux-kernel

Instead of trying to keep track of the connections to the
USB Type-C connectors separately, letting the component
framework take care of that.

From now on every USB Type-C connector will register itself
as "aggregate" - component master - and anything that can be
connected to it inside the system can then simply register
itself as a generic component.

The matching of the components and the connector shall rely
on ACPI _PLD initially. Before registering itself as the
aggregate, the connector will find all other ACPI devices
that have matching _PLD crc hash with it (matching value in
the pld_crc member of struct acpi_device), and add a
component match entry for each one of them. Because only
ACPI is supported for now, the driver shall only be build
when ACPI is supported.

This removes the need for the custom API that the driver
exposed. The components and the connector can therefore
exist completely independently of each other. The order in
which they are registered, as well as are they modules or
not, is now irrelevant.

Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
---
 drivers/usb/typec/Makefile      |   3 +-
 drivers/usb/typec/class.c       |   2 -
 drivers/usb/typec/class.h       |  10 +-
 drivers/usb/typec/port-mapper.c | 279 +++++---------------------------
 include/linux/usb/typec.h       |  12 --
 5 files changed, 46 insertions(+), 260 deletions(-)

diff --git a/drivers/usb/typec/Makefile b/drivers/usb/typec/Makefile
index a0adb8947a301..57870a2bd7873 100644
--- a/drivers/usb/typec/Makefile
+++ b/drivers/usb/typec/Makefile
@@ -1,6 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
 obj-$(CONFIG_TYPEC)		+= typec.o
-typec-y				:= class.o mux.o bus.o port-mapper.o
+typec-y				:= class.o mux.o bus.o
+typec-$(CONFIG_ACPI)		+= port-mapper.o
 obj-$(CONFIG_TYPEC)		+= altmodes/
 obj-$(CONFIG_TYPEC_TCPM)	+= tcpm/
 obj-$(CONFIG_TYPEC_UCSI)	+= ucsi/
diff --git a/drivers/usb/typec/class.c b/drivers/usb/typec/class.c
index aeef453aa6585..45a6f0c807cb5 100644
--- a/drivers/usb/typec/class.c
+++ b/drivers/usb/typec/class.c
@@ -2039,8 +2039,6 @@ struct typec_port *typec_register_port(struct device *parent,
 
 	ida_init(&port->mode_ids);
 	mutex_init(&port->port_type_lock);
-	mutex_init(&port->port_list_lock);
-	INIT_LIST_HEAD(&port->port_list);
 
 	port->id = id;
 	port->ops = cap->ops;
diff --git a/drivers/usb/typec/class.h b/drivers/usb/typec/class.h
index aef03eb7e1523..0f1bd6d19d67e 100644
--- a/drivers/usb/typec/class.h
+++ b/drivers/usb/typec/class.h
@@ -54,11 +54,6 @@ struct typec_port {
 
 	const struct typec_capability	*cap;
 	const struct typec_operations   *ops;
-
-	struct list_head		port_list;
-	struct mutex			port_list_lock; /* Port list lock */
-
-	void				*pld;
 };
 
 #define to_typec_port(_dev_) container_of(_dev_, struct typec_port, dev)
@@ -79,7 +74,12 @@ extern const struct device_type typec_port_dev_type;
 extern struct class typec_mux_class;
 extern struct class typec_class;
 
+#if defined(CONFIG_ACPI)
 int typec_link_ports(struct typec_port *connector);
 void typec_unlink_ports(struct typec_port *connector);
+#else
+static inline int typec_link_ports(struct typec_port *connector) { return 0; }
+static inline void typec_unlink_ports(struct typec_port *connector) { }
+#endif
 
 #endif /* __USB_TYPEC_CLASS__ */
diff --git a/drivers/usb/typec/port-mapper.c b/drivers/usb/typec/port-mapper.c
index 9b0991bdf391a..07d307418b470 100644
--- a/drivers/usb/typec/port-mapper.c
+++ b/drivers/usb/typec/port-mapper.c
@@ -7,273 +7,72 @@
  */
 
 #include <linux/acpi.h>
-#include <linux/usb.h>
-#include <linux/usb/typec.h>
+#include <linux/component.h>
 
 #include "class.h"
 
-struct port_node {
-	struct list_head list;
-	struct device *dev;
-	void *pld;
-};
-
-static int acpi_pld_match(const struct acpi_pld_info *pld1,
-			  const struct acpi_pld_info *pld2)
-{
-	if (!pld1 || !pld2)
-		return 0;
-
-	/*
-	 * To speed things up, first checking only the group_position. It seems
-	 * to often have the first unique value in the _PLD.
-	 */
-	if (pld1->group_position == pld2->group_position)
-		return !memcmp(pld1, pld2, sizeof(struct acpi_pld_info));
-
-	return 0;
-}
-
-static void *get_pld(struct device *dev)
+static int typec_aggregate_bind(struct device *dev)
 {
-#ifdef CONFIG_ACPI
-	struct acpi_pld_info *pld;
-	acpi_status status;
-
-	if (!has_acpi_companion(dev))
-		return NULL;
-
-	status = acpi_get_physical_device_location(ACPI_HANDLE(dev), &pld);
-	if (ACPI_FAILURE(status))
-		return NULL;
-
-	return pld;
-#else
-	return NULL;
-#endif
-}
-
-static void free_pld(void *pld)
-{
-#ifdef CONFIG_ACPI
-	ACPI_FREE(pld);
-#endif
+	return component_bind_all(dev, NULL);
 }
 
-static int __link_port(struct typec_port *con, struct port_node *node)
+static void typec_aggregate_unbind(struct device *dev)
 {
-	int ret;
-
-	ret = sysfs_create_link(&node->dev->kobj, &con->dev.kobj, "connector");
-	if (ret)
-		return ret;
-
-	ret = sysfs_create_link(&con->dev.kobj, &node->dev->kobj,
-				dev_name(node->dev));
-	if (ret) {
-		sysfs_remove_link(&node->dev->kobj, "connector");
-		return ret;
-	}
-
-	list_add_tail(&node->list, &con->port_list);
-
-	return 0;
+	component_unbind_all(dev, NULL);
 }
 
-static int link_port(struct typec_port *con, struct port_node *node)
-{
-	int ret;
-
-	mutex_lock(&con->port_list_lock);
-	ret = __link_port(con, node);
-	mutex_unlock(&con->port_list_lock);
-
-	return ret;
-}
-
-static void __unlink_port(struct typec_port *con, struct port_node *node)
-{
-	sysfs_remove_link(&con->dev.kobj, dev_name(node->dev));
-	sysfs_remove_link(&node->dev->kobj, "connector");
-	list_del(&node->list);
-}
-
-static void unlink_port(struct typec_port *con, struct port_node *node)
-{
-	mutex_lock(&con->port_list_lock);
-	__unlink_port(con, node);
-	mutex_unlock(&con->port_list_lock);
-}
-
-static struct port_node *create_port_node(struct device *port)
-{
-	struct port_node *node;
-
-	node = kzalloc(sizeof(*node), GFP_KERNEL);
-	if (!node)
-		return ERR_PTR(-ENOMEM);
-
-	node->dev = get_device(port);
-	node->pld = get_pld(port);
-
-	return node;
-}
-
-static void remove_port_node(struct port_node *node)
-{
-	put_device(node->dev);
-	free_pld(node->pld);
-	kfree(node);
-}
-
-static int connector_match(struct device *dev, const void *data)
-{
-	const struct port_node *node = data;
-
-	if (!is_typec_port(dev))
-		return 0;
-
-	return acpi_pld_match(to_typec_port(dev)->pld, node->pld);
-}
-
-static struct device *find_connector(struct port_node *node)
-{
-	if (!node->pld)
-		return NULL;
-
-	return class_find_device(&typec_class, NULL, node, connector_match);
-}
-
-/**
- * typec_link_port - Link a port to its connector
- * @port: The port device
- *
- * Find the connector of @port and create symlink named "connector" for it.
- * Returns 0 on success, or errno in case of a failure.
- *
- * NOTE. The function increments the reference count of @port on success.
- */
-int typec_link_port(struct device *port)
-{
-	struct device *connector;
-	struct port_node *node;
-	int ret;
-
-	node = create_port_node(port);
-	if (IS_ERR(node))
-		return PTR_ERR(node);
-
-	connector = find_connector(node);
-	if (!connector) {
-		ret = 0;
-		goto remove_node;
-	}
-
-	ret = link_port(to_typec_port(connector), node);
-	if (ret)
-		goto put_connector;
-
-	return 0;
-
-put_connector:
-	put_device(connector);
-remove_node:
-	remove_port_node(node);
-
-	return ret;
-}
-EXPORT_SYMBOL_GPL(typec_link_port);
-
-static int port_match_and_unlink(struct device *connector, void *port)
-{
-	struct port_node *node;
-	struct port_node *tmp;
-	int ret = 0;
-
-	if (!is_typec_port(connector))
-		return 0;
-
-	mutex_lock(&to_typec_port(connector)->port_list_lock);
-	list_for_each_entry_safe(node, tmp, &to_typec_port(connector)->port_list, list) {
-		ret = node->dev == port;
-		if (ret) {
-			unlink_port(to_typec_port(connector), node);
-			remove_port_node(node);
-			put_device(connector);
-			break;
-		}
-	}
-	mutex_unlock(&to_typec_port(connector)->port_list_lock);
+static const struct component_master_ops typec_aggregate_ops = {
+	.bind = typec_aggregate_bind,
+	.unbind = typec_aggregate_unbind,
+};
 
-	return ret;
-}
+struct each_port_arg {
+	struct typec_port *port;
+	struct component_match *match;
+};
 
-/**
- * typec_unlink_port - Unlink port from its connector
- * @port: The port device
- *
- * Removes the symlink "connector" and decrements the reference count of @port.
- */
-void typec_unlink_port(struct device *port)
+static int typec_port_compare(struct device *dev, void *fwnode)
 {
-	class_for_each_device(&typec_class, NULL, port, port_match_and_unlink);
+	return device_match_fwnode(dev, fwnode);
 }
-EXPORT_SYMBOL_GPL(typec_unlink_port);
 
-static int each_port(struct device *port, void *connector)
+static int typec_port_match(struct device *dev, void *data)
 {
-	struct port_node *node;
-	int ret;
-
-	node = create_port_node(port);
-	if (IS_ERR(node))
-		return PTR_ERR(node);
+	struct acpi_device *adev = to_acpi_device(dev);
+	struct each_port_arg *arg = data;
+	struct acpi_device *con_adev;
 
-	if (!connector_match(connector, node)) {
-		remove_port_node(node);
+	con_adev = ACPI_COMPANION(&arg->port->dev);
+	if (con_adev == adev)
 		return 0;
-	}
-
-	ret = link_port(to_typec_port(connector), node);
-	if (ret) {
-		remove_port_node(node->pld);
-		return ret;
-	}
-
-	get_device(connector);
 
+	if (con_adev->pld_crc == adev->pld_crc)
+		component_match_add(&arg->port->dev, &arg->match, typec_port_compare,
+				    acpi_fwnode_handle(adev));
 	return 0;
 }
 
 int typec_link_ports(struct typec_port *con)
 {
-	int ret = 0;
+	struct each_port_arg arg = { .port = con, .match = NULL };
 
-	con->pld = get_pld(&con->dev);
-	if (!con->pld)
-		return 0;
+	bus_for_each_dev(&acpi_bus_type, NULL, &arg, typec_port_match);
 
-	ret = usb_for_each_port(&con->dev, each_port);
-	if (ret)
-		typec_unlink_ports(con);
-
-	return ret;
+	/*
+	 * REVISIT: Now each connector can have only a single component master.
+	 * So far only the USB ports connected to the USB Type-C connector share
+	 * the _PLD with it, but if there one day is something else (like maybe
+	 * the DisplayPort ACPI device object) that also shares the _PLD with
+	 * the connector, every one of those needs to have its own component
+	 * master, because each different type of component needs to be bind to
+	 * the connector independently of the other components. That requires
+	 * improvements to the component framework. Right now you can only have
+	 * one master per device.
+	 */
+	return component_master_add_with_match(&con->dev, &typec_aggregate_ops, arg.match);
 }
 
 void typec_unlink_ports(struct typec_port *con)
 {
-	struct port_node *node;
-	struct port_node *tmp;
-
-	mutex_lock(&con->port_list_lock);
-
-	list_for_each_entry_safe(node, tmp, &con->port_list, list) {
-		__unlink_port(con, node);
-		remove_port_node(node);
-		put_device(&con->dev);
-	}
-
-	mutex_unlock(&con->port_list_lock);
-
-	free_pld(con->pld);
+	component_master_del(&con->dev, &typec_aggregate_ops);
 }
diff --git a/include/linux/usb/typec.h b/include/linux/usb/typec.h
index e2e44bb1dad85..7ba45a97eeae3 100644
--- a/include/linux/usb/typec.h
+++ b/include/linux/usb/typec.h
@@ -305,16 +305,4 @@ void typec_partner_set_svdm_version(struct typec_partner *partner,
 				    enum usb_pd_svdm_ver svdm_version);
 int typec_get_negotiated_svdm_version(struct typec_port *port);
 
-#if IS_REACHABLE(CONFIG_TYPEC)
-int typec_link_port(struct device *port);
-void typec_unlink_port(struct device *port);
-#else
-static inline int typec_link_port(struct device *port)
-{
-	return 0;
-}
-
-static inline void typec_unlink_port(struct device *port) { }
-#endif
-
 #endif /* __LINUX_USB_TYPEC_H */
-- 
2.34.1


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

* [PATCH v5 5/5] usb: Remove usb_for_each_port()
  2021-12-23  8:16 [PATCH v5 0/5] acpi: Store _PLD information and convert users Heikki Krogerus
                   ` (3 preceding siblings ...)
  2021-12-23  8:24 ` [PATCH v5 4/5] usb: typec: port-mapper: Convert to the component framework Heikki Krogerus
@ 2021-12-23  8:24 ` Heikki Krogerus
  2021-12-27 16:18 ` [PATCH v5 0/5] acpi: Store _PLD information and convert users Rafael J. Wysocki
  5 siblings, 0 replies; 13+ messages in thread
From: Heikki Krogerus @ 2021-12-23  8:24 UTC (permalink / raw)
  To: Rafael J. Wysocki, Greg Kroah-Hartman
  Cc: Andy Shevchenko, Sakari Ailus, Prashant Malani, linux-acpi,
	linux-usb, linux-kernel

There are no more users for the function.

Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
---
 drivers/usb/core/usb.c | 46 ------------------------------------------
 include/linux/usb.h    |  9 ---------
 2 files changed, 55 deletions(-)

diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c
index 62368c4ed37af..2ce3667ec6fae 100644
--- a/drivers/usb/core/usb.c
+++ b/drivers/usb/core/usb.c
@@ -398,52 +398,6 @@ int usb_for_each_dev(void *data, int (*fn)(struct usb_device *, void *))
 }
 EXPORT_SYMBOL_GPL(usb_for_each_dev);
 
-struct each_hub_arg {
-	void *data;
-	int (*fn)(struct device *, void *);
-};
-
-static int __each_hub(struct usb_device *hdev, void *data)
-{
-	struct each_hub_arg *arg = (struct each_hub_arg *)data;
-	struct usb_hub *hub;
-	int ret = 0;
-	int i;
-
-	hub = usb_hub_to_struct_hub(hdev);
-	if (!hub)
-		return 0;
-
-	mutex_lock(&usb_port_peer_mutex);
-
-	for (i = 0; i < hdev->maxchild; i++) {
-		ret = arg->fn(&hub->ports[i]->dev, arg->data);
-		if (ret)
-			break;
-	}
-
-	mutex_unlock(&usb_port_peer_mutex);
-
-	return ret;
-}
-
-/**
- * usb_for_each_port - interate over all USB ports in the system
- * @data: data pointer that will be handed to the callback function
- * @fn: callback function to be called for each USB port
- *
- * Iterate over all USB ports and call @fn for each, passing it @data. If it
- * returns anything other than 0, we break the iteration prematurely and return
- * that value.
- */
-int usb_for_each_port(void *data, int (*fn)(struct device *, void *))
-{
-	struct each_hub_arg arg = {data, fn};
-
-	return usb_for_each_dev(&arg, __each_hub);
-}
-EXPORT_SYMBOL_GPL(usb_for_each_port);
-
 /**
  * usb_release_dev - free a usb device structure when all users of it are finished.
  * @dev: device that's been disconnected
diff --git a/include/linux/usb.h b/include/linux/usb.h
index 7ccaa76a9a968..200b7b79acb56 100644
--- a/include/linux/usb.h
+++ b/include/linux/usb.h
@@ -875,15 +875,6 @@ extern struct usb_host_interface *usb_find_alt_setting(
 		unsigned int iface_num,
 		unsigned int alt_num);
 
-#if IS_REACHABLE(CONFIG_USB)
-int usb_for_each_port(void *data, int (*fn)(struct device *, void *));
-#else
-static inline int usb_for_each_port(void *data, int (*fn)(struct device *, void *))
-{
-	return 0;
-}
-#endif
-
 /* port claiming functions */
 int usb_hub_claim_port(struct usb_device *hdev, unsigned port1,
 		struct usb_dev_state *owner);
-- 
2.34.1


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

* Re: [PATCH v5 0/5] acpi: Store _PLD information and convert users
  2021-12-23  8:16 [PATCH v5 0/5] acpi: Store _PLD information and convert users Heikki Krogerus
                   ` (4 preceding siblings ...)
  2021-12-23  8:24 ` [PATCH v5 5/5] usb: Remove usb_for_each_port() Heikki Krogerus
@ 2021-12-27 16:18 ` Rafael J. Wysocki
  2021-12-30 11:11   ` Greg Kroah-Hartman
  5 siblings, 1 reply; 13+ messages in thread
From: Rafael J. Wysocki @ 2021-12-27 16:18 UTC (permalink / raw)
  To: Heikki Krogerus
  Cc: Rafael J. Wysocki, Greg Kroah-Hartman, Andy Shevchenko,
	Sakari Ailus, Prashant Malani, ACPI Devel Maling List,
	open list:ULTRA-WIDEBAND (UWB) SUBSYSTEM:,
	Linux Kernel Mailing List

On Thu, Dec 23, 2021 at 9:16 AM Heikki Krogerus
<heikki.krogerus@linux.intel.com> wrote:
>
> Hi,
>
> The last version (v4) was not properly cleaned up. Should be now OK.

It looks good to me, so

Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>

for the ACPI-related changes in this series and please feel free to
route it through the USB tree if that's preferred.

Thanks!

> v4 cover letter:
>
> Now only storing the crc hash to a new member in struct acpi_device,
> just like proposed by Rafael. In port-mapper.c I'm then scanning the
> acpi bus separately with every port in order to find the matching
> devices.
>
>
> v3 cover letter:
>
> The _PLD buffer is no longer stored as requested by Rafael, so the
> drivers will need to continue to evaluate the _PLD if they need it.
>
> The stored locations will therefore only contain the list of other
> devices that share the location, but that is most important, and in
> practice the main goal of the series in any case.
>
>
> v2 cover letter:
>
> I'm now using the helpers device_match_acpi_dev() and
> device_match_fwnode() like Andy suggested. No other changes.
>
>
> The original cover letter:
>
> This removes the need for the drivers to always separately evaluate
> the _PLD. With the USB Type-C connector and USB port mapping this
> allows us to start using the component framework and remove the custom
> APIs.
>
> So far the only users of the _PLD information have been the USB
> drivers, but it seems it will be used also at least in some camera
> drivers later. These nevertheless touch mostly USB drivers.
>
> thanks,
>
> Heikki Krogerus (5):
>   acpi: Export acpi_bus_type
>   acpi: Store CRC-32 hash of the _PLD in struct acpi_device
>   usb: Link the ports to the connectors they are attached to
>   usb: typec: port-mapper: Convert to the component framework
>   usb: Remove usb_for_each_port()
>
>  Documentation/ABI/testing/sysfs-bus-usb |   9 +
>  drivers/acpi/bus.c                      |   1 +
>  drivers/acpi/scan.c                     |  16 ++
>  drivers/usb/core/port.c                 |  32 +++
>  drivers/usb/core/usb.c                  |  46 ----
>  drivers/usb/typec/Makefile              |   3 +-
>  drivers/usb/typec/class.c               |   2 -
>  drivers/usb/typec/class.h               |  10 +-
>  drivers/usb/typec/port-mapper.c         | 279 ++++--------------------
>  include/acpi/acpi_bus.h                 |   1 +
>  include/linux/usb.h                     |   9 -
>  include/linux/usb/typec.h               |  12 -
>  12 files changed, 105 insertions(+), 315 deletions(-)
>
> --
> 2.34.1
>

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

* Re: [PATCH v5 0/5] acpi: Store _PLD information and convert users
  2021-12-27 16:18 ` [PATCH v5 0/5] acpi: Store _PLD information and convert users Rafael J. Wysocki
@ 2021-12-30 11:11   ` Greg Kroah-Hartman
  0 siblings, 0 replies; 13+ messages in thread
From: Greg Kroah-Hartman @ 2021-12-30 11:11 UTC (permalink / raw)
  To: Rafael J. Wysocki
  Cc: Heikki Krogerus, Andy Shevchenko, Sakari Ailus, Prashant Malani,
	ACPI Devel Maling List, open list:ULTRA-WIDEBAND (UWB) SUBSYSTEM:,
	Linux Kernel Mailing List

On Mon, Dec 27, 2021 at 05:18:16PM +0100, Rafael J. Wysocki wrote:
> On Thu, Dec 23, 2021 at 9:16 AM Heikki Krogerus
> <heikki.krogerus@linux.intel.com> wrote:
> >
> > Hi,
> >
> > The last version (v4) was not properly cleaned up. Should be now OK.
> 
> It looks good to me, so
> 
> Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
> 
> for the ACPI-related changes in this series and please feel free to
> route it through the USB tree if that's preferred.

Thanks, I'll take this through the USB tree now.

greg k-h

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

* 'Re: [PATCH v5 4/5] usb: typec: port-mapper: Convert to the component framework'
  2021-12-23  8:24 ` [PATCH v5 4/5] usb: typec: port-mapper: Convert to the component framework Heikki Krogerus
@ 2022-01-25 14:00   ` Mike Lothian
  2022-01-25 14:10     ` Mike Lothian
  2022-01-25 14:32     ` Heikki Krogerus
  0 siblings, 2 replies; 13+ messages in thread
From: Mike Lothian @ 2022-01-25 14:00 UTC (permalink / raw)
  To: heikki.krogerus
  Cc: andriy.shevchenko, gregkh, linux-acpi, linux-kernel, linux-usb,
	pmalani, rafael, sakari.ailus

Hi

This patch is stopping my ASUS G513QY from booting correctly

BUG: kernel NULL pointer dereference, address: 0000000000000008
#PF: supervisor read access in kernel mode
#PF: error_code(0x0000) - not-present page
PGD 0 P4D 0 
Oops: 0000 [#1] PREEMPT SMP NOPTI
CPU: 1 PID: 116 Comm: kworker/1:1 Not tainted 5.16.0-rc6-tip+ #2991
Hardware name: ASUSTeK COMPUTER INC. ROG Strix G513QY_G513QY/G513QY, BIOS G513QY.316 11/29/2021
Workqueue: events_long ucsi_init_work
RIP: 0010:component_master_add_with_match+0x11/0x190
Code: cc cc 00 00 cc cc 00 00 cc 49 89 c9 49 89 d0 31 d2 31 c9 e9 c1 fe ff ff 00 55 41 57 41 56 41 54 53 48 89 d3 49 89 f4 49 89 ff <48> 8b 72 08 48 89 d7 e8 73 01 00 00 89 c5 85 c0 0f 85 55 01 00 00
RSP: 0018:ffff8881029f7d48 EFLAGS: 00010282
RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000001
RDX: 0000000000000000 RSI: ffffffff83095658 RDI: ffff888117658c08
RBP: 0000000000000000 R08: ffff88810158e258 R09: ffffea00045d9e00
R10: 0000001000000000 R11: ffffffff81be3720 R12: ffffffff83095658
R13: ffff888117630a68 R14: ffff888117658c08 R15: ffff888117658c08
FS:  0000000000000000(0000) GS:ffff888fde440000(0000) knlGS:0000000000000000
CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 0000000000000008 CR3: 00000000ac20c000 CR4: 0000000000150ee0
Call Trace:
 <TASK>
 ? typec_link_ports+0x45/0x50
 ? typec_register_port+0x20f/0x260
 ? ucsi_register_port+0x33c/0x700
 ? __kmalloc+0x14e/0x2a0
 ? ucsi_init_work+0x15a/0x330
 ? process_one_work+0x1dd/0x380
 ? worker_thread+0x26d/0x4a0
 ? kthread+0x182/0x1a0
 ? worker_clr_flags+0x40/0x40
 ? kthread_blkcg+0x30/0x30
 ? ret_from_fork+0x22/0x30
 </TASK>
Modules linked in:
CR2: 0000000000000008
---[ end trace 9c7dfbb7c9eaa418 ]---
RIP: 0010:component_master_add_with_match+0x11/0x190
Code: cc cc 00 00 cc cc 00 00 cc 49 89 c9 49 89 d0 31 d2 31 c9 e9 c1 fe ff ff 00 55 41 57 41 56 41 54 53 48 89 d3 49 89 f4 49 89 ff <48> 8b 72 08 48 89 d7 e8 73 01 00 00 89 c5 85 c0 0f 85 55 01 00 00
RSP: 0018:ffff8881029f7d48 EFLAGS: 00010282
RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000001
RDX: 0000000000000000 RSI: ffffffff83095658 RDI: ffff888117658c08
RBP: 0000000000000000 R08: ffff88810158e258 R09: ffffea00045d9e00
R10: 0000001000000000 R11: ffffffff81be3720 R12: ffffffff83095658
R13: ffff888117630a68 R14: ffff888117658c08 R15: ffff888117658c08
FS:  0000000000000000(0000) GS:ffff888fde440000(0000) knlGS:0000000000000000
CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 0000000000000008 CR3: 00000000ac20c000 CR4: 0000000000150ee0

Is it due to the USB-C port on the Radeon 6800M?

Thanks

Mike

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

* Re: 'Re: [PATCH v5 4/5] usb: typec: port-mapper: Convert to the component framework'
  2022-01-25 14:00   ` 'Re: [PATCH v5 4/5] usb: typec: port-mapper: Convert to the component framework' Mike Lothian
@ 2022-01-25 14:10     ` Mike Lothian
  2022-01-25 14:32     ` Heikki Krogerus
  1 sibling, 0 replies; 13+ messages in thread
From: Mike Lothian @ 2022-01-25 14:10 UTC (permalink / raw)
  To: heikki.krogerus
  Cc: andriy.shevchenko, gregkh, linux-acpi, linux-kernel, linux-usb,
	pmalani, rafael, sakari.ailus

On Tue, 25 Jan 2022 at 14:00, Mike Lothian <mike@fireburn.co.uk> wrote:
>
> Hi
>
> This patch is stopping my ASUS G513QY from booting correctly
>
> BUG: kernel NULL pointer dereference, address: 0000000000000008
> #PF: supervisor read access in kernel mode
> #PF: error_code(0x0000) - not-present page
> PGD 0 P4D 0
> Oops: 0000 [#1] PREEMPT SMP NOPTI
> CPU: 1 PID: 116 Comm: kworker/1:1 Not tainted 5.16.0-rc6-tip+ #2991
> Hardware name: ASUSTeK COMPUTER INC. ROG Strix G513QY_G513QY/G513QY, BIOS G513QY.316 11/29/2021
> Workqueue: events_long ucsi_init_work
> RIP: 0010:component_master_add_with_match+0x11/0x190
> Code: cc cc 00 00 cc cc 00 00 cc 49 89 c9 49 89 d0 31 d2 31 c9 e9 c1 fe ff ff 00 55 41 57 41 56 41 54 53 48 89 d3 49 89 f4 49 89 ff <48> 8b 72 08 48 89 d7 e8 73 01 00 00 89 c5 85 c0 0f 85 55 01 00 00
> RSP: 0018:ffff8881029f7d48 EFLAGS: 00010282
> RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000001
> RDX: 0000000000000000 RSI: ffffffff83095658 RDI: ffff888117658c08
> RBP: 0000000000000000 R08: ffff88810158e258 R09: ffffea00045d9e00
> R10: 0000001000000000 R11: ffffffff81be3720 R12: ffffffff83095658
> R13: ffff888117630a68 R14: ffff888117658c08 R15: ffff888117658c08
> FS:  0000000000000000(0000) GS:ffff888fde440000(0000) knlGS:0000000000000000
> CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> CR2: 0000000000000008 CR3: 00000000ac20c000 CR4: 0000000000150ee0
> Call Trace:
>  <TASK>
>  ? typec_link_ports+0x45/0x50
>  ? typec_register_port+0x20f/0x260
>  ? ucsi_register_port+0x33c/0x700
>  ? __kmalloc+0x14e/0x2a0
>  ? ucsi_init_work+0x15a/0x330
>  ? process_one_work+0x1dd/0x380
>  ? worker_thread+0x26d/0x4a0
>  ? kthread+0x182/0x1a0
>  ? worker_clr_flags+0x40/0x40
>  ? kthread_blkcg+0x30/0x30
>  ? ret_from_fork+0x22/0x30
>  </TASK>
> Modules linked in:
> CR2: 0000000000000008
> ---[ end trace 9c7dfbb7c9eaa418 ]---
> RIP: 0010:component_master_add_with_match+0x11/0x190
> Code: cc cc 00 00 cc cc 00 00 cc 49 89 c9 49 89 d0 31 d2 31 c9 e9 c1 fe ff ff 00 55 41 57 41 56 41 54 53 48 89 d3 49 89 f4 49 89 ff <48> 8b 72 08 48 89 d7 e8 73 01 00 00 89 c5 85 c0 0f 85 55 01 00 00
> RSP: 0018:ffff8881029f7d48 EFLAGS: 00010282
> RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000001
> RDX: 0000000000000000 RSI: ffffffff83095658 RDI: ffff888117658c08
> RBP: 0000000000000000 R08: ffff88810158e258 R09: ffffea00045d9e00
> R10: 0000001000000000 R11: ffffffff81be3720 R12: ffffffff83095658
> R13: ffff888117630a68 R14: ffff888117658c08 R15: ffff888117658c08
> FS:  0000000000000000(0000) GS:ffff888fde440000(0000) knlGS:0000000000000000
> CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> CR2: 0000000000000008 CR3: 00000000ac20c000 CR4: 0000000000150ee0
>
> Is it due to the USB-C port on the Radeon 6800M?
>
> Thanks
>
> Mike

Reverting both 730b49aac426e1e8016d3c2dd6b407e500423821 and
510a0bdb2bfcff8d7be822c72adc3add7a97d559 allows it to boot again

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

* Re: 'Re: [PATCH v5 4/5] usb: typec: port-mapper: Convert to the component framework'
  2022-01-25 14:00   ` 'Re: [PATCH v5 4/5] usb: typec: port-mapper: Convert to the component framework' Mike Lothian
  2022-01-25 14:10     ` Mike Lothian
@ 2022-01-25 14:32     ` Heikki Krogerus
  2022-01-25 15:11       ` Mike Lothian
  1 sibling, 1 reply; 13+ messages in thread
From: Heikki Krogerus @ 2022-01-25 14:32 UTC (permalink / raw)
  To: Mike Lothian
  Cc: andriy.shevchenko, gregkh, linux-acpi, linux-kernel, linux-usb,
	pmalani, rafael, sakari.ailus

On Tue, Jan 25, 2022 at 02:00:33PM +0000, Mike Lothian wrote:
> Hi
> 
> This patch is stopping my ASUS G513QY from booting correctly
> 
> BUG: kernel NULL pointer dereference, address: 0000000000000008
> #PF: supervisor read access in kernel mode
> #PF: error_code(0x0000) - not-present page
> PGD 0 P4D 0 
> Oops: 0000 [#1] PREEMPT SMP NOPTI
> CPU: 1 PID: 116 Comm: kworker/1:1 Not tainted 5.16.0-rc6-tip+ #2991
> Hardware name: ASUSTeK COMPUTER INC. ROG Strix G513QY_G513QY/G513QY, BIOS G513QY.316 11/29/2021
> Workqueue: events_long ucsi_init_work
> RIP: 0010:component_master_add_with_match+0x11/0x190
> Code: cc cc 00 00 cc cc 00 00 cc 49 89 c9 49 89 d0 31 d2 31 c9 e9 c1 fe ff ff 00 55 41 57 41 56 41 54 53 48 89 d3 49 89 f4 49 89 ff <48> 8b 72 08 48 89 d7 e8 73 01 00 00 89 c5 85 c0 0f 85 55 01 00 00
> RSP: 0018:ffff8881029f7d48 EFLAGS: 00010282
> RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000001
> RDX: 0000000000000000 RSI: ffffffff83095658 RDI: ffff888117658c08
> RBP: 0000000000000000 R08: ffff88810158e258 R09: ffffea00045d9e00
> R10: 0000001000000000 R11: ffffffff81be3720 R12: ffffffff83095658
> R13: ffff888117630a68 R14: ffff888117658c08 R15: ffff888117658c08
> FS:  0000000000000000(0000) GS:ffff888fde440000(0000) knlGS:0000000000000000
> CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> CR2: 0000000000000008 CR3: 00000000ac20c000 CR4: 0000000000150ee0
> Call Trace:
>  <TASK>
>  ? typec_link_ports+0x45/0x50
>  ? typec_register_port+0x20f/0x260
>  ? ucsi_register_port+0x33c/0x700
>  ? __kmalloc+0x14e/0x2a0
>  ? ucsi_init_work+0x15a/0x330
>  ? process_one_work+0x1dd/0x380
>  ? worker_thread+0x26d/0x4a0
>  ? kthread+0x182/0x1a0
>  ? worker_clr_flags+0x40/0x40
>  ? kthread_blkcg+0x30/0x30
>  ? ret_from_fork+0x22/0x30
>  </TASK>
> Modules linked in:
> CR2: 0000000000000008
> ---[ end trace 9c7dfbb7c9eaa418 ]---
> RIP: 0010:component_master_add_with_match+0x11/0x190
> Code: cc cc 00 00 cc cc 00 00 cc 49 89 c9 49 89 d0 31 d2 31 c9 e9 c1 fe ff ff 00 55 41 57 41 56 41 54 53 48 89 d3 49 89 f4 49 89 ff <48> 8b 72 08 48 89 d7 e8 73 01 00 00 89 c5 85 c0 0f 85 55 01 00 00
> RSP: 0018:ffff8881029f7d48 EFLAGS: 00010282
> RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000001
> RDX: 0000000000000000 RSI: ffffffff83095658 RDI: ffff888117658c08
> RBP: 0000000000000000 R08: ffff88810158e258 R09: ffffea00045d9e00
> R10: 0000001000000000 R11: ffffffff81be3720 R12: ffffffff83095658
> R13: ffff888117630a68 R14: ffff888117658c08 R15: ffff888117658c08
> FS:  0000000000000000(0000) GS:ffff888fde440000(0000) knlGS:0000000000000000
> CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> CR2: 0000000000000008 CR3: 00000000ac20c000 CR4: 0000000000150ee0
> 
> Is it due to the USB-C port on the Radeon 6800M?

No. There is a fix pending:
https://lore.kernel.org/linux-usb/20220124090228.41396-3-heikki.krogerus@linux.intel.com/

-- 
heikki

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

* Re: 'Re: [PATCH v5 4/5] usb: typec: port-mapper: Convert to the component framework'
  2022-01-25 14:32     ` Heikki Krogerus
@ 2022-01-25 15:11       ` Mike Lothian
  0 siblings, 0 replies; 13+ messages in thread
From: Mike Lothian @ 2022-01-25 15:11 UTC (permalink / raw)
  To: Heikki Krogerus
  Cc: andriy.shevchenko, gregkh, linux-acpi, linux-kernel, linux-usb,
	pmalani, rafael, sakari.ailus

On Tue, 25 Jan 2022 at 14:32, Heikki Krogerus
<heikki.krogerus@linux.intel.com> wrote:
>
> On Tue, Jan 25, 2022 at 02:00:33PM +0000, Mike Lothian wrote:
> > Hi
> >
> > This patch is stopping my ASUS G513QY from booting correctly
> >
> > BUG: kernel NULL pointer dereference, address: 0000000000000008
> > #PF: supervisor read access in kernel mode
> > #PF: error_code(0x0000) - not-present page
> > PGD 0 P4D 0
> > Oops: 0000 [#1] PREEMPT SMP NOPTI
> > CPU: 1 PID: 116 Comm: kworker/1:1 Not tainted 5.16.0-rc6-tip+ #2991
> > Hardware name: ASUSTeK COMPUTER INC. ROG Strix G513QY_G513QY/G513QY, BIOS G513QY.316 11/29/2021
> > Workqueue: events_long ucsi_init_work
> > RIP: 0010:component_master_add_with_match+0x11/0x190
> > Code: cc cc 00 00 cc cc 00 00 cc 49 89 c9 49 89 d0 31 d2 31 c9 e9 c1 fe ff ff 00 55 41 57 41 56 41 54 53 48 89 d3 49 89 f4 49 89 ff <48> 8b 72 08 48 89 d7 e8 73 01 00 00 89 c5 85 c0 0f 85 55 01 00 00
> > RSP: 0018:ffff8881029f7d48 EFLAGS: 00010282
> > RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000001
> > RDX: 0000000000000000 RSI: ffffffff83095658 RDI: ffff888117658c08
> > RBP: 0000000000000000 R08: ffff88810158e258 R09: ffffea00045d9e00
> > R10: 0000001000000000 R11: ffffffff81be3720 R12: ffffffff83095658
> > R13: ffff888117630a68 R14: ffff888117658c08 R15: ffff888117658c08
> > FS:  0000000000000000(0000) GS:ffff888fde440000(0000) knlGS:0000000000000000
> > CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> > CR2: 0000000000000008 CR3: 00000000ac20c000 CR4: 0000000000150ee0
> > Call Trace:
> >  <TASK>
> >  ? typec_link_ports+0x45/0x50
> >  ? typec_register_port+0x20f/0x260
> >  ? ucsi_register_port+0x33c/0x700
> >  ? __kmalloc+0x14e/0x2a0
> >  ? ucsi_init_work+0x15a/0x330
> >  ? process_one_work+0x1dd/0x380
> >  ? worker_thread+0x26d/0x4a0
> >  ? kthread+0x182/0x1a0
> >  ? worker_clr_flags+0x40/0x40
> >  ? kthread_blkcg+0x30/0x30
> >  ? ret_from_fork+0x22/0x30
> >  </TASK>
> > Modules linked in:
> > CR2: 0000000000000008
> > ---[ end trace 9c7dfbb7c9eaa418 ]---
> > RIP: 0010:component_master_add_with_match+0x11/0x190
> > Code: cc cc 00 00 cc cc 00 00 cc 49 89 c9 49 89 d0 31 d2 31 c9 e9 c1 fe ff ff 00 55 41 57 41 56 41 54 53 48 89 d3 49 89 f4 49 89 ff <48> 8b 72 08 48 89 d7 e8 73 01 00 00 89 c5 85 c0 0f 85 55 01 00 00
> > RSP: 0018:ffff8881029f7d48 EFLAGS: 00010282
> > RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000001
> > RDX: 0000000000000000 RSI: ffffffff83095658 RDI: ffff888117658c08
> > RBP: 0000000000000000 R08: ffff88810158e258 R09: ffffea00045d9e00
> > R10: 0000001000000000 R11: ffffffff81be3720 R12: ffffffff83095658
> > R13: ffff888117630a68 R14: ffff888117658c08 R15: ffff888117658c08
> > FS:  0000000000000000(0000) GS:ffff888fde440000(0000) knlGS:0000000000000000
> > CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> > CR2: 0000000000000008 CR3: 00000000ac20c000 CR4: 0000000000150ee0
> >
> > Is it due to the USB-C port on the Radeon 6800M?
>
> No. There is a fix pending:
> https://lore.kernel.org/linux-usb/20220124090228.41396-3-heikki.krogerus@linux.intel.com/
>
> --
> heikki

Thanks Heilkki

I've found your patches on
https://patchwork.kernel.org/project/linux-usb/patch/20220124090228.41396-2-heikki.krogerus@linux.intel.com/
which work a treat

Cheers

Mike

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

* Re: [PATCH v5 2/5] acpi: Store CRC-32 hash of the _PLD in struct acpi_device
  2021-12-23  8:16 ` [PATCH v5 2/5] acpi: Store CRC-32 hash of the _PLD in struct acpi_device Heikki Krogerus
@ 2022-01-30 16:41   ` Guenter Roeck
  0 siblings, 0 replies; 13+ messages in thread
From: Guenter Roeck @ 2022-01-30 16:41 UTC (permalink / raw)
  To: Heikki Krogerus
  Cc: Rafael J. Wysocki, Greg Kroah-Hartman, Andy Shevchenko,
	Sakari Ailus, Prashant Malani, linux-acpi, linux-usb,
	linux-kernel

On Thu, Dec 23, 2021 at 11:16:17AM +0300, Heikki Krogerus wrote:
> Storing CRC-32 hash of the Physical Location of Device
> object (_PLD) with devices that have it. The hash is stored
> to a new struct acpi_device member "pld_crc".
> 
> The hash makes it easier to find devices that share a
> location, as there is no need to evaluate the entire object
> every time. Knowledge about devices that share a location
> can be used in device drivers that need to know the
> connections to other components inside a system. USB3 ports
> will for example always share their location with a USB2
> port.
> 
> Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>

Building ia64:tinyconfig ... failed

ia64-linux-ld: drivers/acpi/scan.o: in function `__acpi_device_add':
scan.c:(.text+0x27e2): undefined reference to `crc32_le'

ACPI now depends on CRC32.

#regzbot introduced: 882c982dada4d5

Guenter

> ---
>  drivers/acpi/scan.c     | 16 ++++++++++++++++
>  include/acpi/acpi_bus.h |  1 +
>  2 files changed, 17 insertions(+)
> 
> diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
> index 7ff55a197a583..113414c46b713 100644
> --- a/drivers/acpi/scan.c
> +++ b/drivers/acpi/scan.c
> @@ -19,6 +19,7 @@
>  #include <linux/dma-map-ops.h>
>  #include <linux/platform_data/x86/apple.h>
>  #include <linux/pgtable.h>
> +#include <linux/crc32.h>
>  
>  #include "internal.h"
>  
> @@ -667,6 +668,19 @@ static int acpi_tie_acpi_dev(struct acpi_device *adev)
>  	return 0;
>  }
>  
> +static void acpi_store_pld_crc(struct acpi_device *adev)
> +{
> +	struct acpi_pld_info *pld;
> +	acpi_status status;
> +
> +	status = acpi_get_physical_device_location(adev->handle, &pld);
> +	if (ACPI_FAILURE(status))
> +		return;
> +
> +	adev->pld_crc = crc32(~0, pld, sizeof(*pld));
> +	ACPI_FREE(pld);
> +}
> +
>  static int __acpi_device_add(struct acpi_device *device,
>  			     void (*release)(struct device *))
>  {
> @@ -725,6 +739,8 @@ static int __acpi_device_add(struct acpi_device *device,
>  	if (device->wakeup.flags.valid)
>  		list_add_tail(&device->wakeup_list, &acpi_wakeup_device_list);
>  
> +	acpi_store_pld_crc(device);
> +
>  	mutex_unlock(&acpi_device_lock);
>  
>  	if (device->parent)
> diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h
> index 8e87ead2af341..f8c945418df23 100644
> --- a/include/acpi/acpi_bus.h
> +++ b/include/acpi/acpi_bus.h
> @@ -360,6 +360,7 @@ struct acpi_gpio_mapping;
>  
>  /* Device */
>  struct acpi_device {
> +	u32 pld_crc;
>  	int device_type;
>  	acpi_handle handle;		/* no handle for fixed hardware */
>  	struct fwnode_handle fwnode;

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

end of thread, other threads:[~2022-01-30 16:41 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-12-23  8:16 [PATCH v5 0/5] acpi: Store _PLD information and convert users Heikki Krogerus
2021-12-23  8:16 ` [PATCH v5 1/5] acpi: Export acpi_bus_type Heikki Krogerus
2021-12-23  8:16 ` [PATCH v5 2/5] acpi: Store CRC-32 hash of the _PLD in struct acpi_device Heikki Krogerus
2022-01-30 16:41   ` Guenter Roeck
2021-12-23  8:23 ` [PATCH v5 3/5] usb: Link the ports to the connectors they are attached to Heikki Krogerus
2021-12-23  8:24 ` [PATCH v5 4/5] usb: typec: port-mapper: Convert to the component framework Heikki Krogerus
2022-01-25 14:00   ` 'Re: [PATCH v5 4/5] usb: typec: port-mapper: Convert to the component framework' Mike Lothian
2022-01-25 14:10     ` Mike Lothian
2022-01-25 14:32     ` Heikki Krogerus
2022-01-25 15:11       ` Mike Lothian
2021-12-23  8:24 ` [PATCH v5 5/5] usb: Remove usb_for_each_port() Heikki Krogerus
2021-12-27 16:18 ` [PATCH v5 0/5] acpi: Store _PLD information and convert users Rafael J. Wysocki
2021-12-30 11:11   ` Greg Kroah-Hartman

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).