[PATCH 11/18] thunderbolt: Add tb_switch_find_by_route()

2018-02-13 Thread Mika Westerberg
From: Radion Mirchevsky 

With the new ICM messaging there is need for find switch by route string
instead of link and depth. Add new function that makes it possible.

Signed-off-by: Radion Mirchevsky 
Signed-off-by: Mika Westerberg 
---
 drivers/thunderbolt/switch.c | 33 +
 drivers/thunderbolt/tb.h |  1 +
 2 files changed, 34 insertions(+)

diff --git a/drivers/thunderbolt/switch.c b/drivers/thunderbolt/switch.c
index 2a0bded44922..4e2b2097bbfc 100644
--- a/drivers/thunderbolt/switch.c
+++ b/drivers/thunderbolt/switch.c
@@ -1479,6 +1479,7 @@ struct tb_sw_lookup {
u8 link;
u8 depth;
const uuid_t *uuid;
+   u64 route;
 };
 
 static int tb_switch_match(struct device *dev, void *data)
@@ -1494,6 +1495,11 @@ static int tb_switch_match(struct device *dev, void 
*data)
if (lookup->uuid)
return !memcmp(sw->uuid, lookup->uuid, sizeof(*lookup->uuid));
 
+   if (lookup->route) {
+   return sw->config.route_lo == lower_32_bits(lookup->route) &&
+  sw->config.route_hi == upper_32_bits(lookup->route);
+   }
+
/* Root switch is matched only by depth */
if (!lookup->depth)
return !sw->depth;
@@ -1551,6 +1557,33 @@ struct tb_switch *tb_switch_find_by_uuid(struct tb *tb, 
const uuid_t *uuid)
return NULL;
 }
 
+/**
+ * tb_switch_find_by_route() - Find switch by route string
+ * @tb: Domain the switch belongs
+ * @route: Route string to look for
+ *
+ * Returned switch has reference count increased so the caller needs to
+ * call tb_switch_put() when done with the switch.
+ */
+struct tb_switch *tb_switch_find_by_route(struct tb *tb, u64 route)
+{
+   struct tb_sw_lookup lookup;
+   struct device *dev;
+
+   if (!route)
+   return tb_switch_get(tb->root_switch);
+
+   memset(, 0, sizeof(lookup));
+   lookup.tb = tb;
+   lookup.route = route;
+
+   dev = bus_find_device(_bus_type, NULL, , tb_switch_match);
+   if (dev)
+   return tb_to_switch(dev);
+
+   return NULL;
+}
+
 void tb_switch_exit(void)
 {
ida_destroy(_ida);
diff --git a/drivers/thunderbolt/tb.h b/drivers/thunderbolt/tb.h
index c7bd77e9c2c3..2cd6085a6e10 100644
--- a/drivers/thunderbolt/tb.h
+++ b/drivers/thunderbolt/tb.h
@@ -386,6 +386,7 @@ struct tb_switch *get_switch_at_route(struct tb_switch *sw, 
u64 route);
 struct tb_switch *tb_switch_find_by_link_depth(struct tb *tb, u8 link,
   u8 depth);
 struct tb_switch *tb_switch_find_by_uuid(struct tb *tb, const uuid_t *uuid);
+struct tb_switch *tb_switch_find_by_route(struct tb *tb, u64 route);
 
 static inline struct tb_switch *tb_switch_get(struct tb_switch *sw)
 {
-- 
2.15.1



[PATCH 11/18] thunderbolt: Add tb_switch_find_by_route()

2018-02-13 Thread Mika Westerberg
From: Radion Mirchevsky 

With the new ICM messaging there is need for find switch by route string
instead of link and depth. Add new function that makes it possible.

Signed-off-by: Radion Mirchevsky 
Signed-off-by: Mika Westerberg 
---
 drivers/thunderbolt/switch.c | 33 +
 drivers/thunderbolt/tb.h |  1 +
 2 files changed, 34 insertions(+)

diff --git a/drivers/thunderbolt/switch.c b/drivers/thunderbolt/switch.c
index 2a0bded44922..4e2b2097bbfc 100644
--- a/drivers/thunderbolt/switch.c
+++ b/drivers/thunderbolt/switch.c
@@ -1479,6 +1479,7 @@ struct tb_sw_lookup {
u8 link;
u8 depth;
const uuid_t *uuid;
+   u64 route;
 };
 
 static int tb_switch_match(struct device *dev, void *data)
@@ -1494,6 +1495,11 @@ static int tb_switch_match(struct device *dev, void 
*data)
if (lookup->uuid)
return !memcmp(sw->uuid, lookup->uuid, sizeof(*lookup->uuid));
 
+   if (lookup->route) {
+   return sw->config.route_lo == lower_32_bits(lookup->route) &&
+  sw->config.route_hi == upper_32_bits(lookup->route);
+   }
+
/* Root switch is matched only by depth */
if (!lookup->depth)
return !sw->depth;
@@ -1551,6 +1557,33 @@ struct tb_switch *tb_switch_find_by_uuid(struct tb *tb, 
const uuid_t *uuid)
return NULL;
 }
 
+/**
+ * tb_switch_find_by_route() - Find switch by route string
+ * @tb: Domain the switch belongs
+ * @route: Route string to look for
+ *
+ * Returned switch has reference count increased so the caller needs to
+ * call tb_switch_put() when done with the switch.
+ */
+struct tb_switch *tb_switch_find_by_route(struct tb *tb, u64 route)
+{
+   struct tb_sw_lookup lookup;
+   struct device *dev;
+
+   if (!route)
+   return tb_switch_get(tb->root_switch);
+
+   memset(, 0, sizeof(lookup));
+   lookup.tb = tb;
+   lookup.route = route;
+
+   dev = bus_find_device(_bus_type, NULL, , tb_switch_match);
+   if (dev)
+   return tb_to_switch(dev);
+
+   return NULL;
+}
+
 void tb_switch_exit(void)
 {
ida_destroy(_ida);
diff --git a/drivers/thunderbolt/tb.h b/drivers/thunderbolt/tb.h
index c7bd77e9c2c3..2cd6085a6e10 100644
--- a/drivers/thunderbolt/tb.h
+++ b/drivers/thunderbolt/tb.h
@@ -386,6 +386,7 @@ struct tb_switch *get_switch_at_route(struct tb_switch *sw, 
u64 route);
 struct tb_switch *tb_switch_find_by_link_depth(struct tb *tb, u8 link,
   u8 depth);
 struct tb_switch *tb_switch_find_by_uuid(struct tb *tb, const uuid_t *uuid);
+struct tb_switch *tb_switch_find_by_route(struct tb *tb, u64 route);
 
 static inline struct tb_switch *tb_switch_get(struct tb_switch *sw)
 {
-- 
2.15.1