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
next prev 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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.