1 // SPDX-License-Identifier: GPL-2.0
3 * Thunderbolt/USB4 retimer support.
5 * Copyright (C) 2020, Intel Corporation
6 * Authors: Kranthi Kuntala <kranthi.kuntala@intel.com>
7 * Mika Westerberg <mika.westerberg@linux.intel.com>
10 #include <linux/delay.h>
11 #include <linux/pm_runtime.h>
12 #include <linux/sched/signal.h>
17 #define TB_MAX_RETIMER_INDEX 6
19 static int tb_retimer_nvm_read(void *priv
, unsigned int offset
, void *val
,
22 struct tb_nvm
*nvm
= priv
;
23 struct tb_retimer
*rt
= tb_to_retimer(nvm
->dev
);
26 pm_runtime_get_sync(&rt
->dev
);
28 if (!mutex_trylock(&rt
->tb
->lock
)) {
29 ret
= restart_syscall();
33 ret
= usb4_port_retimer_nvm_read(rt
->port
, rt
->index
, offset
, val
, bytes
);
34 mutex_unlock(&rt
->tb
->lock
);
37 pm_runtime_mark_last_busy(&rt
->dev
);
38 pm_runtime_put_autosuspend(&rt
->dev
);
43 static int tb_retimer_nvm_write(void *priv
, unsigned int offset
, void *val
,
46 struct tb_nvm
*nvm
= priv
;
47 struct tb_retimer
*rt
= tb_to_retimer(nvm
->dev
);
50 if (!mutex_trylock(&rt
->tb
->lock
))
51 return restart_syscall();
53 ret
= tb_nvm_write_buf(nvm
, offset
, val
, bytes
);
54 mutex_unlock(&rt
->tb
->lock
);
59 static int tb_retimer_nvm_add(struct tb_retimer
*rt
)
65 nvm
= tb_nvm_alloc(&rt
->dev
);
69 ret
= usb4_port_retimer_nvm_read(rt
->port
, rt
->index
, NVM_VERSION
, &val
,
74 nvm
->major
= val
>> 16;
75 nvm
->minor
= val
>> 8;
77 ret
= usb4_port_retimer_nvm_read(rt
->port
, rt
->index
, NVM_FLASH_SIZE
,
82 nvm_size
= (SZ_1M
<< (val
& 7)) / 8;
83 nvm_size
= (nvm_size
- SZ_16K
) / 2;
85 ret
= tb_nvm_add_active(nvm
, nvm_size
, tb_retimer_nvm_read
);
89 ret
= tb_nvm_add_non_active(nvm
, NVM_MAX_SIZE
, tb_retimer_nvm_write
);
101 static int tb_retimer_nvm_validate_and_write(struct tb_retimer
*rt
)
103 unsigned int image_size
, hdr_size
;
104 const u8
*buf
= rt
->nvm
->buf
;
107 image_size
= rt
->nvm
->buf_data_size
;
108 if (image_size
< NVM_MIN_SIZE
|| image_size
> NVM_MAX_SIZE
)
112 * FARB pointer must point inside the image and must at least
113 * contain parts of the digital section we will be reading here.
115 hdr_size
= (*(u32
*)buf
) & 0xffffff;
116 if (hdr_size
+ NVM_DEVID
+ 2 >= image_size
)
119 /* Digital section start should be aligned to 4k page */
120 if (!IS_ALIGNED(hdr_size
, SZ_4K
))
124 * Read digital section size and check that it also fits inside
127 ds_size
= *(u16
*)(buf
+ hdr_size
);
128 if (ds_size
>= image_size
)
132 * Make sure the device ID in the image matches the retimer
135 device
= *(u16
*)(buf
+ hdr_size
+ NVM_DEVID
);
136 if (device
!= rt
->device
)
139 /* Skip headers in the image */
141 image_size
-= hdr_size
;
143 return usb4_port_retimer_nvm_write(rt
->port
, rt
->index
, 0, buf
,
147 static ssize_t
device_show(struct device
*dev
, struct device_attribute
*attr
,
150 struct tb_retimer
*rt
= tb_to_retimer(dev
);
152 return sprintf(buf
, "%#x\n", rt
->device
);
154 static DEVICE_ATTR_RO(device
);
156 static ssize_t
nvm_authenticate_show(struct device
*dev
,
157 struct device_attribute
*attr
, char *buf
)
159 struct tb_retimer
*rt
= tb_to_retimer(dev
);
162 if (!mutex_trylock(&rt
->tb
->lock
))
163 return restart_syscall();
168 ret
= sprintf(buf
, "%#x\n", rt
->auth_status
);
170 mutex_unlock(&rt
->tb
->lock
);
175 static ssize_t
nvm_authenticate_store(struct device
*dev
,
176 struct device_attribute
*attr
, const char *buf
, size_t count
)
178 struct tb_retimer
*rt
= tb_to_retimer(dev
);
182 pm_runtime_get_sync(&rt
->dev
);
184 if (!mutex_trylock(&rt
->tb
->lock
)) {
185 ret
= restart_syscall();
194 ret
= kstrtobool(buf
, &val
);
198 /* Always clear status */
207 ret
= tb_retimer_nvm_validate_and_write(rt
);
211 ret
= usb4_port_retimer_nvm_authenticate(rt
->port
, rt
->index
);
215 mutex_unlock(&rt
->tb
->lock
);
217 pm_runtime_mark_last_busy(&rt
->dev
);
218 pm_runtime_put_autosuspend(&rt
->dev
);
224 static DEVICE_ATTR_RW(nvm_authenticate
);
226 static ssize_t
nvm_version_show(struct device
*dev
,
227 struct device_attribute
*attr
, char *buf
)
229 struct tb_retimer
*rt
= tb_to_retimer(dev
);
232 if (!mutex_trylock(&rt
->tb
->lock
))
233 return restart_syscall();
238 ret
= sprintf(buf
, "%x.%x\n", rt
->nvm
->major
, rt
->nvm
->minor
);
240 mutex_unlock(&rt
->tb
->lock
);
243 static DEVICE_ATTR_RO(nvm_version
);
245 static ssize_t
vendor_show(struct device
*dev
, struct device_attribute
*attr
,
248 struct tb_retimer
*rt
= tb_to_retimer(dev
);
250 return sprintf(buf
, "%#x\n", rt
->vendor
);
252 static DEVICE_ATTR_RO(vendor
);
254 static struct attribute
*retimer_attrs
[] = {
255 &dev_attr_device
.attr
,
256 &dev_attr_nvm_authenticate
.attr
,
257 &dev_attr_nvm_version
.attr
,
258 &dev_attr_vendor
.attr
,
262 static const struct attribute_group retimer_group
= {
263 .attrs
= retimer_attrs
,
266 static const struct attribute_group
*retimer_groups
[] = {
271 static void tb_retimer_release(struct device
*dev
)
273 struct tb_retimer
*rt
= tb_to_retimer(dev
);
278 struct device_type tb_retimer_type
= {
279 .name
= "thunderbolt_retimer",
280 .groups
= retimer_groups
,
281 .release
= tb_retimer_release
,
284 static int tb_retimer_add(struct tb_port
*port
, u8 index
, u32 auth_status
)
286 struct tb_retimer
*rt
;
293 ret
= usb4_port_retimer_read(port
, index
, USB4_SB_VENDOR_ID
, &vendor
,
297 tb_port_warn(port
, "failed read retimer VendorId: %d\n", ret
);
301 ret
= usb4_port_retimer_read(port
, index
, USB4_SB_PRODUCT_ID
, &device
,
305 tb_port_warn(port
, "failed read retimer ProductId: %d\n", ret
);
309 if (vendor
!= PCI_VENDOR_ID_INTEL
&& vendor
!= 0x8087) {
310 tb_port_info(port
, "retimer NVM format of vendor %#x is not supported\n",
316 * Check that it supports NVM operations. If not then don't add
319 ret
= usb4_port_retimer_nvm_sector_size(port
, index
);
323 rt
= kzalloc(sizeof(*rt
), GFP_KERNEL
);
330 rt
->auth_status
= auth_status
;
332 rt
->tb
= port
->sw
->tb
;
334 rt
->dev
.parent
= &port
->sw
->dev
;
335 rt
->dev
.bus
= &tb_bus_type
;
336 rt
->dev
.type
= &tb_retimer_type
;
337 dev_set_name(&rt
->dev
, "%s:%u.%u", dev_name(&port
->sw
->dev
),
340 ret
= device_register(&rt
->dev
);
342 dev_err(&rt
->dev
, "failed to register retimer: %d\n", ret
);
343 put_device(&rt
->dev
);
347 ret
= tb_retimer_nvm_add(rt
);
349 dev_err(&rt
->dev
, "failed to add NVM devices: %d\n", ret
);
350 device_del(&rt
->dev
);
354 dev_info(&rt
->dev
, "new retimer found, vendor=%#x device=%#x\n",
355 rt
->vendor
, rt
->device
);
357 pm_runtime_no_callbacks(&rt
->dev
);
358 pm_runtime_set_active(&rt
->dev
);
359 pm_runtime_enable(&rt
->dev
);
360 pm_runtime_set_autosuspend_delay(&rt
->dev
, TB_AUTOSUSPEND_DELAY
);
361 pm_runtime_mark_last_busy(&rt
->dev
);
362 pm_runtime_use_autosuspend(&rt
->dev
);
367 static void tb_retimer_remove(struct tb_retimer
*rt
)
369 dev_info(&rt
->dev
, "retimer disconnected\n");
370 tb_nvm_free(rt
->nvm
);
371 device_unregister(&rt
->dev
);
374 struct tb_retimer_lookup
{
375 const struct tb_port
*port
;
379 static int retimer_match(struct device
*dev
, void *data
)
381 const struct tb_retimer_lookup
*lookup
= data
;
382 struct tb_retimer
*rt
= tb_to_retimer(dev
);
384 return rt
&& rt
->port
== lookup
->port
&& rt
->index
== lookup
->index
;
387 static struct tb_retimer
*tb_port_find_retimer(struct tb_port
*port
, u8 index
)
389 struct tb_retimer_lookup lookup
= { .port
= port
, .index
= index
};
392 dev
= device_find_child(&port
->sw
->dev
, &lookup
, retimer_match
);
394 return tb_to_retimer(dev
);
400 * tb_retimer_scan() - Scan for on-board retimers under port
401 * @port: USB4 port to scan
403 * Tries to enumerate on-board retimers connected to @port. Found
404 * retimers are registered as children of @port. Does not scan for cable
407 int tb_retimer_scan(struct tb_port
*port
)
409 u32 status
[TB_MAX_RETIMER_INDEX
] = {};
410 int ret
, i
, last_idx
= 0;
416 * Send broadcast RT to make sure retimer indices facing this
419 ret
= usb4_port_enumerate_retimers(port
);
424 * Before doing anything else, read the authentication status.
425 * If the retimer has it set, store it for the new retimer
428 for (i
= 1; i
<= TB_MAX_RETIMER_INDEX
; i
++)
429 usb4_port_retimer_nvm_authenticate_status(port
, i
, &status
[i
]);
431 for (i
= 1; i
<= TB_MAX_RETIMER_INDEX
; i
++) {
433 * Last retimer is true only for the last on-board
434 * retimer (the one connected directly to the Type-C
437 ret
= usb4_port_retimer_is_last(port
, i
);
447 /* Add on-board retimers if they do not exist already */
448 for (i
= 1; i
<= last_idx
; i
++) {
449 struct tb_retimer
*rt
;
451 rt
= tb_port_find_retimer(port
, i
);
453 put_device(&rt
->dev
);
455 ret
= tb_retimer_add(port
, i
, status
[i
]);
456 if (ret
&& ret
!= -EOPNOTSUPP
)
464 static int remove_retimer(struct device
*dev
, void *data
)
466 struct tb_retimer
*rt
= tb_to_retimer(dev
);
467 struct tb_port
*port
= data
;
469 if (rt
&& rt
->port
== port
)
470 tb_retimer_remove(rt
);
475 * tb_retimer_remove_all() - Remove all retimers under port
476 * @port: USB4 port whose retimers to remove
478 * This removes all previously added retimers under @port.
480 void tb_retimer_remove_all(struct tb_port
*port
)
483 device_for_each_child_reverse(&port
->sw
->dev
, port
,