mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Mika Westerberg <mika.westerberg@linux.intel.com>
To: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Andreas Noever <andreas.noever@gmail.com>,
	Michael Jamet <michael.jamet@intel.com>,
	Yehezkel Bernat <yehezkel.bernat@intel.com>,
	Lukas Wunner <lukas@wunner.de>,
	Amir Levy <amir.jer.levy@intel.com>,
	Andy Lutomirski <luto@kernel.org>,
	Mario.Limonciello@dell.com, Jared.Dominguez@dell.com,
	Andy Shevchenko <andriy.shevchenko@linux.intel.com>,
	Mika Westerberg <mika.westerberg@linux.intel.com>,
	linux-kernel@vger.kernel.org
Subject: [PATCH v4 13/27] thunderbolt: Read vendor and device name from DROM
Date: Tue,  6 Jun 2017 15:25:05 +0300	[thread overview]
Message-ID: <20170606122519.35401-14-mika.westerberg@linux.intel.com> (raw)
In-Reply-To: <20170606122519.35401-1-mika.westerberg@linux.intel.com>

The device DROM contains name of the vendor and device among other
things. Extract this information and expose it to the userspace via two
new attributes.

Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Reviewed-by: Yehezkel Bernat <yehezkel.bernat@intel.com>
Reviewed-by: Michael Jamet <michael.jamet@intel.com>
Signed-off-by: Andreas Noever <andreas.noever@gmail.com>
---
 Documentation/ABI/testing/sysfs-bus-thunderbolt | 14 +++++++++++
 drivers/thunderbolt/eeprom.c                    | 32 +++++++++++++++++++++++++
 drivers/thunderbolt/switch.c                    | 22 +++++++++++++++++
 drivers/thunderbolt/tb.h                        |  4 ++++
 4 files changed, 72 insertions(+)

diff --git a/Documentation/ABI/testing/sysfs-bus-thunderbolt b/Documentation/ABI/testing/sysfs-bus-thunderbolt
index 9f1bd0086938..29a516f53d2c 100644
--- a/Documentation/ABI/testing/sysfs-bus-thunderbolt
+++ b/Documentation/ABI/testing/sysfs-bus-thunderbolt
@@ -5,6 +5,13 @@ Contact:	thunderbolt-software@lists.01.org
 Description:	This attribute contains id of this device extracted from
 		the device DROM.
 
+What:		/sys/bus/thunderbolt/devices/.../device_name
+Date:		Sep 2017
+KernelVersion:	4.13
+Contact:	thunderbolt-software@lists.01.org
+Description:	This attribute contains name of this device extracted from
+		the device DROM.
+
 What:		/sys/bus/thunderbolt/devices/.../vendor
 Date:		Sep 2017
 KernelVersion:	4.13
@@ -12,6 +19,13 @@ Contact:	thunderbolt-software@lists.01.org
 Description:	This attribute contains vendor id of this device extracted
 		from the device DROM.
 
+What:		/sys/bus/thunderbolt/devices/.../vendor_name
+Date:		Sep 2017
+KernelVersion:	4.13
+Contact:	thunderbolt-software@lists.01.org
+Description:	This attribute contains vendor name of this device extracted
+		from the device DROM.
+
 What:		/sys/bus/thunderbolt/devices/.../unique_id
 Date:		Sep 2017
 KernelVersion:	4.13
diff --git a/drivers/thunderbolt/eeprom.c b/drivers/thunderbolt/eeprom.c
index 5c7d80a109b1..d40a5f07fc4c 100644
--- a/drivers/thunderbolt/eeprom.c
+++ b/drivers/thunderbolt/eeprom.c
@@ -204,6 +204,11 @@ struct tb_drom_entry_header {
 	enum tb_drom_entry_type type:1;
 } __packed;
 
+struct tb_drom_entry_generic {
+	struct tb_drom_entry_header header;
+	u8 data[0];
+} __packed;
+
 struct tb_drom_entry_port {
 	/* BYTES 0-1 */
 	struct tb_drom_entry_header header;
@@ -295,6 +300,32 @@ int tb_drom_read_uid_only(struct tb_switch *sw, u64 *uid)
 	return 0;
 }
 
+static int tb_drom_parse_entry_generic(struct tb_switch *sw,
+		struct tb_drom_entry_header *header)
+{
+	const struct tb_drom_entry_generic *entry =
+		(const struct tb_drom_entry_generic *)header;
+
+	switch (header->index) {
+	case 1:
+		/* Length includes 2 bytes header so remove it before copy */
+		sw->vendor_name = kstrndup(entry->data,
+			header->len - sizeof(*header), GFP_KERNEL);
+		if (!sw->vendor_name)
+			return -ENOMEM;
+		break;
+
+	case 2:
+		sw->device_name = kstrndup(entry->data,
+			header->len - sizeof(*header), GFP_KERNEL);
+		if (!sw->device_name)
+			return -ENOMEM;
+		break;
+	}
+
+	return 0;
+}
+
 static int tb_drom_parse_entry_port(struct tb_switch *sw,
 				    struct tb_drom_entry_header *header)
 {
@@ -350,6 +381,7 @@ static int tb_drom_parse_entries(struct tb_switch *sw)
 
 		switch (entry->type) {
 		case TB_DROM_ENTRY_GENERIC:
+			res = tb_drom_parse_entry_generic(sw, entry);
 			break;
 		case TB_DROM_ENTRY_PORT:
 			res = tb_drom_parse_entry_port(sw, entry);
diff --git a/drivers/thunderbolt/switch.c b/drivers/thunderbolt/switch.c
index 2390f08b94da..11f16a141686 100644
--- a/drivers/thunderbolt/switch.c
+++ b/drivers/thunderbolt/switch.c
@@ -319,6 +319,15 @@ static ssize_t device_show(struct device *dev, struct device_attribute *attr,
 }
 static DEVICE_ATTR_RO(device);
 
+static ssize_t
+device_name_show(struct device *dev, struct device_attribute *attr, char *buf)
+{
+	struct tb_switch *sw = tb_to_switch(dev);
+
+	return sprintf(buf, "%s\n", sw->device_name ? sw->device_name : "");
+}
+static DEVICE_ATTR_RO(device_name);
+
 static ssize_t vendor_show(struct device *dev, struct device_attribute *attr,
 			   char *buf)
 {
@@ -328,6 +337,15 @@ static ssize_t vendor_show(struct device *dev, struct device_attribute *attr,
 }
 static DEVICE_ATTR_RO(vendor);
 
+static ssize_t
+vendor_name_show(struct device *dev, struct device_attribute *attr, char *buf)
+{
+	struct tb_switch *sw = tb_to_switch(dev);
+
+	return sprintf(buf, "%s\n", sw->vendor_name ? sw->vendor_name : "");
+}
+static DEVICE_ATTR_RO(vendor_name);
+
 static ssize_t unique_id_show(struct device *dev, struct device_attribute *attr,
 			      char *buf)
 {
@@ -339,7 +357,9 @@ static DEVICE_ATTR_RO(unique_id);
 
 static struct attribute *switch_attrs[] = {
 	&dev_attr_device.attr,
+	&dev_attr_device_name.attr,
 	&dev_attr_vendor.attr,
+	&dev_attr_vendor_name.attr,
 	&dev_attr_unique_id.attr,
 	NULL,
 };
@@ -358,6 +378,8 @@ static void tb_switch_release(struct device *dev)
 	struct tb_switch *sw = tb_to_switch(dev);
 
 	kfree(sw->uuid);
+	kfree(sw->device_name);
+	kfree(sw->vendor_name);
 	kfree(sw->ports);
 	kfree(sw->drom);
 	kfree(sw);
diff --git a/drivers/thunderbolt/tb.h b/drivers/thunderbolt/tb.h
index f7dfe733d71a..6d4910ef2eb9 100644
--- a/drivers/thunderbolt/tb.h
+++ b/drivers/thunderbolt/tb.h
@@ -23,6 +23,8 @@
  * @uuid: UUID of the switch (or %NULL if not supported)
  * @vendor: Vendor ID of the switch
  * @device: Device ID of the switch
+ * @vendor_name: Name of the vendor (or %NULL if not known)
+ * @device_name: Name of the device (or %NULL if not known)
  * @cap_plug_events: Offset to the plug events capability (%0 if not found)
  * @is_unplugged: The switch is going away
  * @drom: DROM of the switch (%NULL if not found)
@@ -36,6 +38,8 @@ struct tb_switch {
 	uuid_be *uuid;
 	u16 vendor;
 	u16 device;
+	const char *vendor_name;
+	const char *device_name;
 	int cap_plug_events;
 	bool is_unplugged;
 	u8 *drom;
-- 
2.11.0

  parent reply	other threads:[~2017-06-06 12:31 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-06-06 12:24 [PATCH v4 00/27] Thunderbolt security levels and NVM firmware upgrade Mika Westerberg
2017-06-06 12:24 ` [PATCH v4 01/27] thunderbolt: Use const buffer pointer in write operations Mika Westerberg
2017-06-06 12:24 ` [PATCH v4 02/27] thunderbolt: No need to read UID of the root switch on resume Mika Westerberg
2017-06-06 13:07   ` Andy Shevchenko
2017-06-06 12:24 ` [PATCH v4 03/27] thunderbolt: Do not try to read UID if DROM offset is read as 0 Mika Westerberg
2017-06-06 12:24 ` [PATCH v4 04/27] thunderbolt: Do not warn about newer DROM versions Mika Westerberg
2017-06-06 12:24 ` [PATCH v4 05/27] thunderbolt: Add MSI-X support Mika Westerberg
2017-06-06 12:24 ` [PATCH v4 06/27] thunderbolt: Rework capability handling Mika Westerberg
2017-06-06 12:24 ` [PATCH v4 07/27] thunderbolt: Allow passing NULL to tb_ctl_free() Mika Westerberg
2017-06-06 12:25 ` [PATCH v4 08/27] thunderbolt: Introduce thunderbolt bus and connection manager Mika Westerberg
2017-06-06 12:25 ` [PATCH v4 09/27] thunderbolt: Convert switch to a device Mika Westerberg
2017-06-06 12:25 ` [PATCH v4 10/27] thunderbolt: Fail switch adding operation if reading DROM fails Mika Westerberg
2017-06-06 12:25 ` [PATCH v4 11/27] thunderbolt: Do not fail if DROM data CRC32 is invalid Mika Westerberg
2017-06-06 12:25 ` [PATCH v4 12/27] thunderbolt: Refactor and fix parsing of port drom entries Mika Westerberg
2017-06-06 12:25 ` Mika Westerberg [this message]
2017-06-06 12:25 ` [PATCH v4 14/27] thunderbolt: Move control channel messages to tb_msgs.h Mika Westerberg
2017-06-06 12:25 ` [PATCH v4 15/27] thunderbolt: Expose get_route() to other files Mika Westerberg
2017-06-06 12:25 ` [PATCH v4 16/27] thunderbolt: Expose make_header() " Mika Westerberg
2017-06-06 12:25 ` [PATCH v4 17/27] thunderbolt: Let the connection manager handle all notifications Mika Westerberg
2017-06-06 12:25 ` [PATCH v4 18/27] thunderbolt: Rework control channel to be more reliable Mika Westerberg
2017-06-06 12:25 ` [PATCH v4 19/27] thunderbolt: Add new Thunderbolt PCI IDs Mika Westerberg
2017-06-06 12:25 ` [PATCH v4 20/27] thunderbolt: Add support for NHI mailbox Mika Westerberg
2017-06-06 12:25 ` [PATCH v4 21/27] thunderbolt: Store Thunderbolt generation in the switch structure Mika Westerberg
2017-06-06 12:25 ` [PATCH v4 22/27] thunderbolt: Add support for DMA configuration based mailbox Mika Westerberg
2017-06-06 12:25 ` [PATCH v4 23/27] thunderbolt: Do not touch the hardware if the NHI is gone on resume Mika Westerberg
2017-06-06 12:25 ` [PATCH v4 24/27] thunderbolt: Add support for Internal Connection Manager (ICM) Mika Westerberg
2017-06-06 12:25 ` [PATCH v4 25/27] thunderbolt: Add support for host and device NVM firmware upgrade Mika Westerberg
2017-06-06 12:25 ` [PATCH v4 26/27] thunderbolt: Add documentation how Thunderbolt bus can be used Mika Westerberg
2017-06-06 12:25 ` [PATCH v4 27/27] MAINTAINERS: Add maintainers for Thunderbolt driver Mika Westerberg
2017-06-09  9:44 ` [PATCH v4 00/27] Thunderbolt security levels and NVM firmware upgrade Greg Kroah-Hartman
2017-06-09 12:33   ` Mika Westerberg
2017-07-20 16:11 ` Christian Kellner
2017-07-20 16:15   ` Mario.Limonciello
2017-07-20 16:47     ` Christian Kellner
2017-07-24  6:52   ` Mika Westerberg
2017-07-25  9:11     ` Christian Kellner
2017-07-25  9:17       ` Mika Westerberg

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=20170606122519.35401-14-mika.westerberg@linux.intel.com \
    --to=mika.westerberg@linux.intel.com \
    --cc=Jared.Dominguez@dell.com \
    --cc=Mario.Limonciello@dell.com \
    --cc=amir.jer.levy@intel.com \
    --cc=andreas.noever@gmail.com \
    --cc=andriy.shevchenko@linux.intel.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lukas@wunner.de \
    --cc=luto@kernel.org \
    --cc=michael.jamet@intel.com \
    --cc=yehezkel.bernat@intel.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

Powered by JetHome