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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome