xref: /linux/drivers/misc/mei/bus.c (revision c27e360545373b7aee9862a5beef3b9fb3df0c25)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (c) 2012-2023, Intel Corporation. All rights reserved.
4  * Intel Management Engine Interface (Intel MEI) Linux driver
5  */
6 
7 #include <linux/cleanup.h>
8 #include <linux/module.h>
9 #include <linux/device.h>
10 #include <linux/kernel.h>
11 #include <linux/sched/signal.h>
12 #include <linux/init.h>
13 #include <linux/errno.h>
14 #include <linux/slab.h>
15 #include <linux/mutex.h>
16 #include <linux/interrupt.h>
17 #include <linux/scatterlist.h>
18 #include <linux/mei_cl_bus.h>
19 
20 #include "mei_dev.h"
21 #include "client.h"
22 
23 #define to_mei_cl_driver(d) container_of_const(d, struct mei_cl_driver, driver)
24 
25 /**
26  * __mei_cl_send - internal client send (write)
27  *
28  * @cl: host client
29  * @buf: buffer to send
30  * @length: buffer length
31  * @vtag: virtual tag
32  * @mode: sending mode
33  *
34  * Return: written size bytes or < 0 on error
35  */
36 ssize_t __mei_cl_send(struct mei_cl *cl, const u8 *buf, size_t length, u8 vtag,
37 		      unsigned int mode)
38 {
39 	return __mei_cl_send_timeout(cl, buf, length, vtag, mode, MAX_SCHEDULE_TIMEOUT);
40 }
41 
42 /**
43  * __mei_cl_send_timeout - internal client send (write)
44  *
45  * @cl: host client
46  * @buf: buffer to send
47  * @length: buffer length
48  * @vtag: virtual tag
49  * @mode: sending mode
50  * @timeout: send timeout in milliseconds.
51  *           effective only for blocking writes: the MEI_CL_IO_TX_BLOCKING mode bit is set.
52  *           set timeout to the MAX_SCHEDULE_TIMEOUT to maixum allowed wait.
53  *
54  * Return: written size bytes or < 0 on error
55  */
56 ssize_t __mei_cl_send_timeout(struct mei_cl *cl, const u8 *buf, size_t length, u8 vtag,
57 			      unsigned int mode, unsigned long timeout)
58 {
59 	struct mei_device *bus;
60 	struct mei_cl_cb *cb;
61 	ssize_t rets;
62 
63 	if (WARN_ON(!cl || !cl->dev))
64 		return -ENODEV;
65 
66 	bus = cl->dev;
67 
68 	mutex_lock(&bus->device_lock);
69 	if (bus->dev_state != MEI_DEV_ENABLED &&
70 	    bus->dev_state != MEI_DEV_POWERING_DOWN) {
71 		rets = -ENODEV;
72 		goto out;
73 	}
74 
75 	if (!mei_cl_is_connected(cl)) {
76 		rets = -ENODEV;
77 		goto out;
78 	}
79 
80 	/* Check if we have an ME client device */
81 	if (!mei_me_cl_is_active(cl->me_cl)) {
82 		rets = -ENOTTY;
83 		goto out;
84 	}
85 
86 	if (vtag) {
87 		/* Check if vtag is supported by client */
88 		rets = mei_cl_vt_support_check(cl);
89 		if (rets)
90 			goto out;
91 	}
92 
93 	if (length > mei_cl_mtu(cl)) {
94 		rets = -EFBIG;
95 		goto out;
96 	}
97 
98 	while (cl->tx_cb_queued >= bus->tx_queue_limit) {
99 		mutex_unlock(&bus->device_lock);
100 		rets = wait_event_interruptible(cl->tx_wait,
101 				cl->writing_state == MEI_WRITE_COMPLETE ||
102 				(!mei_cl_is_connected(cl)));
103 		mutex_lock(&bus->device_lock);
104 		if (rets) {
105 			if (signal_pending(current))
106 				rets = -EINTR;
107 			goto out;
108 		}
109 		if (!mei_cl_is_connected(cl)) {
110 			rets = -ENODEV;
111 			goto out;
112 		}
113 	}
114 
115 	cb = mei_cl_alloc_cb(cl, length, MEI_FOP_WRITE, NULL);
116 	if (!cb) {
117 		rets = -ENOMEM;
118 		goto out;
119 	}
120 	cb->vtag = vtag;
121 
122 	cb->internal = !!(mode & MEI_CL_IO_TX_INTERNAL);
123 	cb->blocking = !!(mode & MEI_CL_IO_TX_BLOCKING);
124 	memcpy(cb->buf.data, buf, length);
125 	/* hack we point data to header */
126 	if (mode & MEI_CL_IO_SGL) {
127 		cb->ext_hdr = (struct mei_ext_hdr *)cb->buf.data;
128 		cb->buf.data = NULL;
129 		cb->buf.size = 0;
130 	}
131 
132 	rets = mei_cl_write(cl, cb, timeout);
133 
134 	if (mode & MEI_CL_IO_SGL && rets == 0)
135 		rets = length;
136 
137 out:
138 	mutex_unlock(&bus->device_lock);
139 
140 	return rets;
141 }
142 
143 /**
144  * __mei_cl_recv - internal client receive (read)
145  *
146  * @cl: host client
147  * @buf: buffer to receive
148  * @length: buffer length
149  * @vtag: virtual tag
150  * @mode: io mode
151  * @timeout: recv timeout, 0 for infinite timeout
152  *
153  * Return: read size in bytes of < 0 on error
154  */
155 ssize_t __mei_cl_recv(struct mei_cl *cl, u8 *buf, size_t length, u8 *vtag,
156 		      unsigned int mode, unsigned long timeout)
157 {
158 	struct mei_device *bus;
159 	struct mei_cl_cb *cb;
160 	size_t r_length;
161 	ssize_t rets;
162 	bool nonblock = !!(mode & MEI_CL_IO_RX_NONBLOCK);
163 
164 	if (WARN_ON(!cl || !cl->dev))
165 		return -ENODEV;
166 
167 	bus = cl->dev;
168 
169 	mutex_lock(&bus->device_lock);
170 	if (bus->dev_state != MEI_DEV_ENABLED &&
171 	    bus->dev_state != MEI_DEV_POWERING_DOWN) {
172 		rets = -ENODEV;
173 		goto out;
174 	}
175 
176 	cb = mei_cl_read_cb(cl, NULL);
177 	if (cb)
178 		goto copy;
179 
180 	rets = mei_cl_read_start(cl, length, NULL);
181 	if (rets && rets != -EBUSY)
182 		goto out;
183 
184 	if (nonblock) {
185 		rets = -EAGAIN;
186 		goto out;
187 	}
188 
189 	/* wait on event only if there is no other waiter */
190 	/* synchronized under device mutex */
191 	if (!waitqueue_active(&cl->rx_wait)) {
192 
193 		mutex_unlock(&bus->device_lock);
194 
195 		if (timeout) {
196 			rets = wait_event_interruptible_timeout
197 					(cl->rx_wait,
198 					mei_cl_read_cb(cl, NULL) ||
199 					(!mei_cl_is_connected(cl)),
200 					msecs_to_jiffies(timeout));
201 			if (rets == 0)
202 				return -ETIME;
203 			if (rets < 0) {
204 				if (signal_pending(current))
205 					return -EINTR;
206 				return -ERESTARTSYS;
207 			}
208 		} else {
209 			if (wait_event_interruptible
210 					(cl->rx_wait,
211 					mei_cl_read_cb(cl, NULL) ||
212 					(!mei_cl_is_connected(cl)))) {
213 				if (signal_pending(current))
214 					return -EINTR;
215 				return -ERESTARTSYS;
216 			}
217 		}
218 
219 		mutex_lock(&bus->device_lock);
220 
221 		if (!mei_cl_is_connected(cl)) {
222 			rets = -ENODEV;
223 			goto out;
224 		}
225 	}
226 
227 	cb = mei_cl_read_cb(cl, NULL);
228 	if (!cb) {
229 		rets = 0;
230 		goto out;
231 	}
232 
233 copy:
234 	if (cb->status) {
235 		rets = cb->status;
236 		goto free;
237 	}
238 
239 	/* for the GSC type - copy the extended header to the buffer */
240 	if (cb->ext_hdr && cb->ext_hdr->type == MEI_EXT_HDR_GSC) {
241 		r_length = min_t(size_t, length, cb->ext_hdr->length * sizeof(u32));
242 		memcpy(buf, cb->ext_hdr, r_length);
243 	} else {
244 		r_length = min_t(size_t, length, cb->buf_idx);
245 		memcpy(buf, cb->buf.data, r_length);
246 	}
247 	rets = r_length;
248 
249 	if (vtag)
250 		*vtag = cb->vtag;
251 
252 free:
253 	mei_cl_del_rd_completed(cl, cb);
254 out:
255 	mutex_unlock(&bus->device_lock);
256 
257 	return rets;
258 }
259 
260 /**
261  * mei_cldev_send_vtag - me device send with vtag (write)
262  *
263  * @cldev: me client device
264  * @buf: buffer to send
265  * @length: buffer length
266  * @vtag: virtual tag
267  *
268  * Return:
269  *  * written size in bytes
270  *  * < 0 on error
271  */
272 
273 ssize_t mei_cldev_send_vtag(struct mei_cl_device *cldev, const u8 *buf,
274 			    size_t length, u8 vtag)
275 {
276 	struct mei_cl *cl = cldev->cl;
277 
278 	return __mei_cl_send(cl, buf, length, vtag, MEI_CL_IO_TX_BLOCKING);
279 }
280 EXPORT_SYMBOL_GPL(mei_cldev_send_vtag);
281 
282 /**
283  * mei_cldev_send_vtag_timeout - me device send with vtag and timeout (write)
284  *
285  * @cldev: me client device
286  * @buf: buffer to send
287  * @length: buffer length
288  * @vtag: virtual tag
289  * @timeout: send timeout in milliseconds, 0 for infinite timeout
290  *
291  * Return:
292  *  * written size in bytes
293  *  * < 0 on error
294  */
295 
296 ssize_t mei_cldev_send_vtag_timeout(struct mei_cl_device *cldev, const u8 *buf,
297 				    size_t length, u8 vtag, unsigned long timeout)
298 {
299 	struct mei_cl *cl = cldev->cl;
300 
301 	return __mei_cl_send_timeout(cl, buf, length, vtag, MEI_CL_IO_TX_BLOCKING, timeout);
302 }
303 EXPORT_SYMBOL_GPL(mei_cldev_send_vtag_timeout);
304 
305 /**
306  * mei_cldev_recv_vtag - client receive with vtag (read)
307  *
308  * @cldev: me client device
309  * @buf: buffer to receive
310  * @length: buffer length
311  * @vtag: virtual tag
312  *
313  * Return:
314  * * read size in bytes
315  * *  < 0 on error
316  */
317 
318 ssize_t mei_cldev_recv_vtag(struct mei_cl_device *cldev, u8 *buf, size_t length,
319 			    u8 *vtag)
320 {
321 	struct mei_cl *cl = cldev->cl;
322 
323 	return __mei_cl_recv(cl, buf, length, vtag, 0, 0);
324 }
325 EXPORT_SYMBOL_GPL(mei_cldev_recv_vtag);
326 
327 /**
328  * mei_cldev_recv_timeout - client receive with timeout (read)
329  *
330  * @cldev: me client device
331  * @buf: buffer to receive
332  * @length: buffer length
333  * @timeout: send timeout in milliseconds, 0 for infinite timeout
334  *
335  * Return:
336  * * read size in bytes
337  * *  < 0 on error
338  */
339 ssize_t mei_cldev_recv_timeout(struct mei_cl_device *cldev, u8 *buf, size_t length,
340 			       unsigned long timeout)
341 {
342 	return mei_cldev_recv_vtag_timeout(cldev, buf, length, NULL, timeout);
343 }
344 EXPORT_SYMBOL_GPL(mei_cldev_recv_timeout);
345 
346 /**
347  * mei_cldev_recv_vtag_timeout - client receive with vtag (read)
348  *
349  * @cldev: me client device
350  * @buf: buffer to receive
351  * @length: buffer length
352  * @vtag: virtual tag
353  * @timeout: recv timeout in milliseconds, 0 for infinite timeout
354  *
355  * Return:
356  * * read size in bytes
357  * *  < 0 on error
358  */
359 
360 ssize_t mei_cldev_recv_vtag_timeout(struct mei_cl_device *cldev, u8 *buf, size_t length,
361 				    u8 *vtag, unsigned long timeout)
362 {
363 	struct mei_cl *cl = cldev->cl;
364 
365 	return __mei_cl_recv(cl, buf, length, vtag, 0, timeout);
366 }
367 EXPORT_SYMBOL_GPL(mei_cldev_recv_vtag_timeout);
368 
369 /**
370  * mei_cldev_send - me device send (write)
371  *
372  * @cldev: me client device
373  * @buf: buffer to send
374  * @length: buffer length
375  *
376  * Return:
377  *  * written size in bytes
378  *  * < 0 on error
379  */
380 ssize_t mei_cldev_send(struct mei_cl_device *cldev, const u8 *buf, size_t length)
381 {
382 	return mei_cldev_send_vtag(cldev, buf, length, 0);
383 }
384 EXPORT_SYMBOL_GPL(mei_cldev_send);
385 
386 /**
387  * mei_cldev_send_timeout - me device send with timeout (write)
388  *
389  * @cldev: me client device
390  * @buf: buffer to send
391  * @length: buffer length
392  * @timeout: send timeout in milliseconds, 0 for infinite timeout
393  *
394  * Return:
395  *  * written size in bytes
396  *  * < 0 on error
397  */
398 ssize_t mei_cldev_send_timeout(struct mei_cl_device *cldev, const u8 *buf, size_t length,
399 			       unsigned long timeout)
400 {
401 	return mei_cldev_send_vtag_timeout(cldev, buf, length, 0, timeout);
402 }
403 EXPORT_SYMBOL_GPL(mei_cldev_send_timeout);
404 
405 /**
406  * mei_cldev_recv - client receive (read)
407  *
408  * @cldev: me client device
409  * @buf: buffer to receive
410  * @length: buffer length
411  *
412  * Return: read size in bytes of < 0 on error
413  */
414 ssize_t mei_cldev_recv(struct mei_cl_device *cldev, u8 *buf, size_t length)
415 {
416 	return mei_cldev_recv_vtag(cldev, buf, length, NULL);
417 }
418 EXPORT_SYMBOL_GPL(mei_cldev_recv);
419 
420 /**
421  * mei_cl_bus_rx_work - dispatch rx event for a bus device
422  *
423  * @work: work
424  */
425 static void mei_cl_bus_rx_work(struct work_struct *work)
426 {
427 	struct mei_cl_device *cldev;
428 	struct mei_device *bus;
429 
430 	cldev = container_of(work, struct mei_cl_device, rx_work);
431 
432 	bus = cldev->bus;
433 
434 	if (cldev->rx_cb)
435 		cldev->rx_cb(cldev);
436 
437 	mutex_lock(&bus->device_lock);
438 	if (mei_cl_is_connected(cldev->cl))
439 		mei_cl_read_start(cldev->cl, mei_cl_mtu(cldev->cl), NULL);
440 	mutex_unlock(&bus->device_lock);
441 }
442 
443 /**
444  * mei_cl_bus_notif_work - dispatch FW notif event for a bus device
445  *
446  * @work: work
447  */
448 static void mei_cl_bus_notif_work(struct work_struct *work)
449 {
450 	struct mei_cl_device *cldev;
451 
452 	cldev = container_of(work, struct mei_cl_device, notif_work);
453 
454 	if (cldev->notif_cb)
455 		cldev->notif_cb(cldev);
456 }
457 
458 /**
459  * mei_cl_bus_notify_event - schedule notify cb on bus client
460  *
461  * @cl: host client
462  *
463  * Return: true if event was scheduled
464  *         false if the client is not waiting for event
465  */
466 bool mei_cl_bus_notify_event(struct mei_cl *cl)
467 {
468 	struct mei_cl_device *cldev = cl->cldev;
469 
470 	if (!cldev || !cldev->notif_cb)
471 		return false;
472 
473 	if (!cl->notify_ev)
474 		return false;
475 
476 	schedule_work(&cldev->notif_work);
477 
478 	cl->notify_ev = false;
479 
480 	return true;
481 }
482 
483 /**
484  * mei_cl_bus_rx_event - schedule rx event
485  *
486  * @cl: host client
487  *
488  * Return: true if event was scheduled
489  *         false if the client is not waiting for event
490  */
491 bool mei_cl_bus_rx_event(struct mei_cl *cl)
492 {
493 	struct mei_cl_device *cldev = cl->cldev;
494 
495 	if (!cldev || !cldev->rx_cb)
496 		return false;
497 
498 	schedule_work(&cldev->rx_work);
499 
500 	return true;
501 }
502 
503 /**
504  * mei_cldev_register_rx_cb - register Rx event callback
505  *
506  * @cldev: me client devices
507  * @rx_cb: callback function
508  *
509  * Return: 0 on success
510  *         -EALREADY if an callback is already registered
511  *         <0 on other errors
512  */
513 int mei_cldev_register_rx_cb(struct mei_cl_device *cldev, mei_cldev_cb_t rx_cb)
514 {
515 	struct mei_device *bus = cldev->bus;
516 	int ret;
517 
518 	if (!rx_cb)
519 		return -EINVAL;
520 	if (cldev->rx_cb)
521 		return -EALREADY;
522 
523 	cldev->rx_cb = rx_cb;
524 	INIT_WORK(&cldev->rx_work, mei_cl_bus_rx_work);
525 
526 	mutex_lock(&bus->device_lock);
527 	if (mei_cl_is_connected(cldev->cl))
528 		ret = mei_cl_read_start(cldev->cl, mei_cl_mtu(cldev->cl), NULL);
529 	else
530 		ret = -ENODEV;
531 	mutex_unlock(&bus->device_lock);
532 	if (ret && ret != -EBUSY) {
533 		cancel_work_sync(&cldev->rx_work);
534 		cldev->rx_cb = NULL;
535 		return ret;
536 	}
537 
538 	return 0;
539 }
540 EXPORT_SYMBOL_GPL(mei_cldev_register_rx_cb);
541 
542 /**
543  * mei_cldev_register_notif_cb - register FW notification event callback
544  *
545  * @cldev: me client devices
546  * @notif_cb: callback function
547  *
548  * Return: 0 on success
549  *         -EALREADY if an callback is already registered
550  *         <0 on other errors
551  */
552 int mei_cldev_register_notif_cb(struct mei_cl_device *cldev,
553 				mei_cldev_cb_t notif_cb)
554 {
555 	struct mei_device *bus = cldev->bus;
556 	int ret;
557 
558 	if (!notif_cb)
559 		return -EINVAL;
560 
561 	if (cldev->notif_cb)
562 		return -EALREADY;
563 
564 	cldev->notif_cb = notif_cb;
565 	INIT_WORK(&cldev->notif_work, mei_cl_bus_notif_work);
566 
567 	mutex_lock(&bus->device_lock);
568 	ret = mei_cl_notify_request(cldev->cl, NULL, 1);
569 	mutex_unlock(&bus->device_lock);
570 	if (ret) {
571 		cancel_work_sync(&cldev->notif_work);
572 		cldev->notif_cb = NULL;
573 		return ret;
574 	}
575 
576 	return 0;
577 }
578 EXPORT_SYMBOL_GPL(mei_cldev_register_notif_cb);
579 
580 /**
581  * mei_cldev_get_drvdata - driver data getter
582  *
583  * @cldev: mei client device
584  *
585  * Return: driver private data
586  */
587 void *mei_cldev_get_drvdata(const struct mei_cl_device *cldev)
588 {
589 	return dev_get_drvdata(&cldev->dev);
590 }
591 EXPORT_SYMBOL_GPL(mei_cldev_get_drvdata);
592 
593 /**
594  * mei_cldev_set_drvdata - driver data setter
595  *
596  * @cldev: mei client device
597  * @data: data to store
598  */
599 void mei_cldev_set_drvdata(struct mei_cl_device *cldev, void *data)
600 {
601 	dev_set_drvdata(&cldev->dev, data);
602 }
603 EXPORT_SYMBOL_GPL(mei_cldev_set_drvdata);
604 
605 /**
606  * mei_cldev_uuid - return uuid of the underlying me client
607  *
608  * @cldev: mei client device
609  *
610  * Return: me client uuid
611  */
612 const uuid_le *mei_cldev_uuid(const struct mei_cl_device *cldev)
613 {
614 	return mei_me_cl_uuid(cldev->me_cl);
615 }
616 EXPORT_SYMBOL_GPL(mei_cldev_uuid);
617 
618 /**
619  * mei_cldev_ver - return protocol version of the underlying me client
620  *
621  * @cldev: mei client device
622  *
623  * Return: me client protocol version
624  */
625 u8 mei_cldev_ver(const struct mei_cl_device *cldev)
626 {
627 	return mei_me_cl_ver(cldev->me_cl);
628 }
629 EXPORT_SYMBOL_GPL(mei_cldev_ver);
630 
631 /**
632  * mei_cldev_mtu - max message that client can send and receive
633  *
634  * @cldev: mei client device
635  *
636  * Return: mtu or 0 if client is not connected
637  */
638 size_t mei_cldev_mtu(const struct mei_cl_device *cldev)
639 {
640 	return mei_cl_mtu(cldev->cl);
641 }
642 EXPORT_SYMBOL_GPL(mei_cldev_mtu);
643 
644 /**
645  * mei_cldev_enabled - check whether the device is enabled
646  *
647  * @cldev: mei client device
648  *
649  * Return: true if me client is initialized and connected
650  */
651 bool mei_cldev_enabled(const struct mei_cl_device *cldev)
652 {
653 	return mei_cl_is_connected(cldev->cl);
654 }
655 EXPORT_SYMBOL_GPL(mei_cldev_enabled);
656 
657 /**
658  * mei_cl_bus_module_get - acquire module of the underlying
659  *    hw driver.
660  *
661  * @cldev: mei client device
662  *
663  * Return: true on success; false if the module was removed.
664  */
665 static bool mei_cl_bus_module_get(struct mei_cl_device *cldev)
666 {
667 	return try_module_get(cldev->bus->parent->driver->owner);
668 }
669 
670 /**
671  * mei_cl_bus_module_put -  release the underlying hw module.
672  *
673  * @cldev: mei client device
674  */
675 static void mei_cl_bus_module_put(struct mei_cl_device *cldev)
676 {
677 	module_put(cldev->bus->parent->driver->owner);
678 }
679 
680 /**
681  * mei_cl_bus_vtag - get bus vtag entry wrapper
682  *     The tag for bus client is always first.
683  *
684  * @cl: host client
685  *
686  * Return: bus vtag or NULL
687  */
688 static inline struct mei_cl_vtag *mei_cl_bus_vtag(struct mei_cl *cl)
689 {
690 	return list_first_entry_or_null(&cl->vtag_map,
691 					struct mei_cl_vtag, list);
692 }
693 
694 /**
695  * mei_cl_bus_vtag_alloc - add bus client entry to vtag map
696  *
697  * @cldev: me client device
698  *
699  * Return:
700  * * 0 on success
701  * * -ENOMEM if memory allocation failed
702  */
703 static int mei_cl_bus_vtag_alloc(struct mei_cl_device *cldev)
704 {
705 	struct mei_cl *cl = cldev->cl;
706 	struct mei_cl_vtag *cl_vtag;
707 
708 	/*
709 	 * Bail out if the client does not supports vtags
710 	 * or has already allocated one
711 	 */
712 	if (mei_cl_vt_support_check(cl) || mei_cl_bus_vtag(cl))
713 		return 0;
714 
715 	cl_vtag = mei_cl_vtag_alloc(NULL, 0);
716 	if (IS_ERR(cl_vtag))
717 		return -ENOMEM;
718 
719 	list_add_tail(&cl_vtag->list, &cl->vtag_map);
720 
721 	return 0;
722 }
723 
724 /**
725  * mei_cl_bus_vtag_free - remove the bus entry from vtag map
726  *
727  * @cldev: me client device
728  */
729 static void mei_cl_bus_vtag_free(struct mei_cl_device *cldev)
730 {
731 	struct mei_cl *cl = cldev->cl;
732 	struct mei_cl_vtag *cl_vtag;
733 
734 	cl_vtag = mei_cl_bus_vtag(cl);
735 	if (!cl_vtag)
736 		return;
737 
738 	list_del(&cl_vtag->list);
739 	kfree(cl_vtag);
740 }
741 
742 void *mei_cldev_dma_map(struct mei_cl_device *cldev, u8 buffer_id, size_t size)
743 {
744 	struct mei_device *bus;
745 	struct mei_cl *cl;
746 	int ret;
747 
748 	if (!cldev || !buffer_id || !size)
749 		return ERR_PTR(-EINVAL);
750 
751 	if (!IS_ALIGNED(size, MEI_FW_PAGE_SIZE)) {
752 		dev_err(&cldev->dev, "Map size should be aligned to %lu\n",
753 			MEI_FW_PAGE_SIZE);
754 		return ERR_PTR(-EINVAL);
755 	}
756 
757 	cl = cldev->cl;
758 	bus = cldev->bus;
759 
760 	mutex_lock(&bus->device_lock);
761 	if (cl->state == MEI_FILE_UNINITIALIZED) {
762 		ret = mei_cl_link(cl);
763 		if (ret)
764 			goto notlinked;
765 		/* update pointers */
766 		cl->cldev = cldev;
767 	}
768 
769 	ret = mei_cl_dma_alloc_and_map(cl, NULL, buffer_id, size);
770 	if (ret)
771 		mei_cl_unlink(cl);
772 notlinked:
773 	mutex_unlock(&bus->device_lock);
774 	if (ret)
775 		return ERR_PTR(ret);
776 	return cl->dma.vaddr;
777 }
778 EXPORT_SYMBOL_GPL(mei_cldev_dma_map);
779 
780 int mei_cldev_dma_unmap(struct mei_cl_device *cldev)
781 {
782 	struct mei_device *bus;
783 	struct mei_cl *cl;
784 	int ret;
785 
786 	if (!cldev)
787 		return -EINVAL;
788 
789 	cl = cldev->cl;
790 	bus = cldev->bus;
791 
792 	mutex_lock(&bus->device_lock);
793 	ret = mei_cl_dma_unmap(cl, NULL);
794 
795 	mei_cl_flush_queues(cl, NULL);
796 	mei_cl_unlink(cl);
797 	mutex_unlock(&bus->device_lock);
798 	return ret;
799 }
800 EXPORT_SYMBOL_GPL(mei_cldev_dma_unmap);
801 
802 /**
803  * mei_cldev_enable - enable me client device
804  *     create connection with me client
805  *
806  * @cldev: me client device
807  *
808  * Return: 0 on success and < 0 on error
809  */
810 int mei_cldev_enable(struct mei_cl_device *cldev)
811 {
812 	struct mei_device *bus = cldev->bus;
813 	struct mei_cl *cl;
814 	int ret;
815 
816 	cl = cldev->cl;
817 
818 	mutex_lock(&bus->device_lock);
819 	if (cl->state == MEI_FILE_UNINITIALIZED) {
820 		ret = mei_cl_link(cl);
821 		if (ret)
822 			goto notlinked;
823 		/* update pointers */
824 		cl->cldev = cldev;
825 	}
826 
827 	if (mei_cl_is_connected(cl)) {
828 		ret = 0;
829 		goto out;
830 	}
831 
832 	if (!mei_me_cl_is_active(cldev->me_cl)) {
833 		dev_err(&cldev->dev, "me client is not active\n");
834 		ret = -ENOTTY;
835 		goto out;
836 	}
837 
838 	ret = mei_cl_bus_vtag_alloc(cldev);
839 	if (ret)
840 		goto out;
841 
842 	ret = mei_cl_connect(cl, cldev->me_cl, NULL);
843 	if (ret < 0) {
844 		dev_dbg(&cldev->dev, "cannot connect\n");
845 		mei_cl_bus_vtag_free(cldev);
846 	}
847 
848 out:
849 	if (ret)
850 		mei_cl_unlink(cl);
851 notlinked:
852 	mutex_unlock(&bus->device_lock);
853 
854 	return ret;
855 }
856 EXPORT_SYMBOL_GPL(mei_cldev_enable);
857 
858 /**
859  * mei_cldev_unregister_callbacks - internal wrapper for unregistering
860  *  callbacks.
861  *
862  * @cldev: client device
863  */
864 static void mei_cldev_unregister_callbacks(struct mei_cl_device *cldev)
865 {
866 	if (cldev->rx_cb) {
867 		cancel_work_sync(&cldev->rx_work);
868 		cldev->rx_cb = NULL;
869 	}
870 
871 	if (cldev->notif_cb) {
872 		cancel_work_sync(&cldev->notif_work);
873 		cldev->notif_cb = NULL;
874 	}
875 }
876 
877 /**
878  * mei_cldev_disable - disable me client device
879  *     disconnect form the me client
880  *
881  * @cldev: me client device
882  *
883  * Return: 0 on success and < 0 on error
884  */
885 int mei_cldev_disable(struct mei_cl_device *cldev)
886 {
887 	struct mei_device *bus;
888 	struct mei_cl *cl;
889 	int err;
890 
891 	if (!cldev)
892 		return -ENODEV;
893 
894 	cl = cldev->cl;
895 
896 	bus = cldev->bus;
897 
898 	mei_cldev_unregister_callbacks(cldev);
899 
900 	mutex_lock(&bus->device_lock);
901 
902 	mei_cl_bus_vtag_free(cldev);
903 
904 	if (!mei_cl_is_connected(cl)) {
905 		dev_dbg(&cldev->dev, "Already disconnected\n");
906 		err = 0;
907 		goto out;
908 	}
909 
910 	err = mei_cl_disconnect(cl);
911 	if (err < 0)
912 		dev_err(&cldev->dev, "Could not disconnect from the ME client\n");
913 
914 out:
915 	/* Flush queues and remove any pending read unless we have mapped DMA */
916 	if (!cl->dma_mapped) {
917 		mei_cl_flush_queues(cl, NULL);
918 		mei_cl_unlink(cl);
919 	}
920 
921 	mutex_unlock(&bus->device_lock);
922 	return err;
923 }
924 EXPORT_SYMBOL_GPL(mei_cldev_disable);
925 
926 /**
927  * mei_cldev_send_gsc_command - sends a gsc command, by sending
928  * a gsl mei message to gsc and receiving reply from gsc
929  *
930  * @cldev: me client device
931  * @client_id: client id to send the command to
932  * @fence_id: fence id to send the command to
933  * @sg_in: scatter gather list containing addresses for rx message buffer
934  * @total_in_len: total length of data in 'in' sg, can be less than the sum of buffers sizes
935  * @sg_out: scatter gather list containing addresses for tx message buffer
936  *
937  * Return:
938  *  * written size in bytes
939  *  * < 0 on error
940  */
941 ssize_t mei_cldev_send_gsc_command(struct mei_cl_device *cldev,
942 				   u8 client_id, u32 fence_id,
943 				   struct scatterlist *sg_in,
944 				   size_t total_in_len,
945 				   struct scatterlist *sg_out)
946 {
947 	struct mei_cl *cl;
948 	struct mei_device *bus;
949 	ssize_t ret = 0;
950 
951 	struct mei_ext_hdr_gsc_h2f *ext_hdr;
952 	size_t buf_sz = sizeof(struct mei_ext_hdr_gsc_h2f);
953 	int sg_out_nents, sg_in_nents;
954 	int i;
955 	struct scatterlist *sg;
956 	struct mei_ext_hdr_gsc_f2h rx_msg;
957 	unsigned int sg_len;
958 
959 	if (!cldev || !sg_in || !sg_out)
960 		return -EINVAL;
961 
962 	cl = cldev->cl;
963 	bus = cldev->bus;
964 
965 	dev_dbg(&cldev->dev, "client_id %u, fence_id %u\n", client_id, fence_id);
966 
967 	if (!bus->hbm_f_gsc_supported)
968 		return -EOPNOTSUPP;
969 
970 	sg_out_nents = sg_nents(sg_out);
971 	sg_in_nents = sg_nents(sg_in);
972 	/* at least one entry in tx and rx sgls must be present */
973 	if (sg_out_nents <= 0 || sg_in_nents <= 0)
974 		return -EINVAL;
975 
976 	buf_sz += (sg_out_nents + sg_in_nents) * sizeof(struct mei_gsc_sgl);
977 	ext_hdr = kzalloc(buf_sz, GFP_KERNEL);
978 	if (!ext_hdr)
979 		return -ENOMEM;
980 
981 	/* construct the GSC message */
982 	ext_hdr->hdr.type = MEI_EXT_HDR_GSC;
983 	ext_hdr->hdr.length = buf_sz / sizeof(u32); /* length is in dw */
984 
985 	ext_hdr->client_id = client_id;
986 	ext_hdr->addr_type = GSC_ADDRESS_TYPE_PHYSICAL_SGL;
987 	ext_hdr->fence_id = fence_id;
988 	ext_hdr->input_address_count = sg_in_nents;
989 	ext_hdr->output_address_count = sg_out_nents;
990 	ext_hdr->reserved[0] = 0;
991 	ext_hdr->reserved[1] = 0;
992 
993 	/* copy in-sgl to the message */
994 	for (i = 0, sg = sg_in; i < sg_in_nents; i++, sg++) {
995 		ext_hdr->sgl[i].low = lower_32_bits(sg_dma_address(sg));
996 		ext_hdr->sgl[i].high = upper_32_bits(sg_dma_address(sg));
997 		sg_len = min_t(unsigned int, sg_dma_len(sg), PAGE_SIZE);
998 		ext_hdr->sgl[i].length = (sg_len <= total_in_len) ? sg_len : total_in_len;
999 		total_in_len -= ext_hdr->sgl[i].length;
1000 	}
1001 
1002 	/* copy out-sgl to the message */
1003 	for (i = sg_in_nents, sg = sg_out; i < sg_in_nents + sg_out_nents; i++, sg++) {
1004 		ext_hdr->sgl[i].low = lower_32_bits(sg_dma_address(sg));
1005 		ext_hdr->sgl[i].high = upper_32_bits(sg_dma_address(sg));
1006 		sg_len = min_t(unsigned int, sg_dma_len(sg), PAGE_SIZE);
1007 		ext_hdr->sgl[i].length = sg_len;
1008 	}
1009 
1010 	/* send the message to GSC */
1011 	ret = __mei_cl_send(cl, (u8 *)ext_hdr, buf_sz, 0, MEI_CL_IO_SGL);
1012 	if (ret < 0) {
1013 		dev_err(&cldev->dev, "__mei_cl_send failed, returned %zd\n", ret);
1014 		goto end;
1015 	}
1016 	if (ret != buf_sz) {
1017 		dev_err(&cldev->dev, "__mei_cl_send returned %zd instead of expected %zd\n",
1018 			ret, buf_sz);
1019 		ret = -EIO;
1020 		goto end;
1021 	}
1022 
1023 	/* receive the reply from GSC, note that at this point sg_in should contain the reply */
1024 	ret = __mei_cl_recv(cl, (u8 *)&rx_msg, sizeof(rx_msg), NULL, MEI_CL_IO_SGL, 0);
1025 
1026 	if (ret != sizeof(rx_msg)) {
1027 		dev_err(&cldev->dev, "__mei_cl_recv returned %zd instead of expected %zd\n",
1028 			ret, sizeof(rx_msg));
1029 		if (ret >= 0)
1030 			ret = -EIO;
1031 		goto end;
1032 	}
1033 
1034 	/* check rx_msg.client_id and rx_msg.fence_id match the ones we send */
1035 	if (rx_msg.client_id != client_id || rx_msg.fence_id != fence_id) {
1036 		dev_err(&cldev->dev, "received client_id/fence_id  %u/%u  instead of %u/%u sent\n",
1037 			rx_msg.client_id, rx_msg.fence_id, client_id, fence_id);
1038 		ret = -EFAULT;
1039 		goto end;
1040 	}
1041 
1042 	dev_dbg(&cldev->dev, "gsc command: successfully written %u bytes\n", rx_msg.written);
1043 	ret = rx_msg.written;
1044 
1045 end:
1046 	kfree(ext_hdr);
1047 	return ret;
1048 }
1049 EXPORT_SYMBOL_GPL(mei_cldev_send_gsc_command);
1050 
1051 /**
1052  * mei_cl_device_find - find matching entry in the driver id table
1053  *
1054  * @cldev: me client device
1055  * @cldrv: me client driver
1056  *
1057  * Return: id on success; NULL if no id is matching
1058  */
1059 static const
1060 struct mei_cl_device_id *mei_cl_device_find(const struct mei_cl_device *cldev,
1061 					    const struct mei_cl_driver *cldrv)
1062 {
1063 	const struct mei_cl_device_id *id;
1064 	const uuid_le *uuid;
1065 	u8 version;
1066 	bool match;
1067 
1068 	uuid = mei_me_cl_uuid(cldev->me_cl);
1069 	version = mei_me_cl_ver(cldev->me_cl);
1070 
1071 	id = cldrv->id_table;
1072 	while (uuid_le_cmp(NULL_UUID_LE, id->uuid)) {
1073 		if (!uuid_le_cmp(*uuid, id->uuid)) {
1074 			match = true;
1075 
1076 			if (cldev->name[0])
1077 				if (strncmp(cldev->name, id->name,
1078 					    sizeof(id->name)))
1079 					match = false;
1080 
1081 			if (id->version != MEI_CL_VERSION_ANY)
1082 				if (id->version != version)
1083 					match = false;
1084 			if (match)
1085 				return id;
1086 		}
1087 
1088 		id++;
1089 	}
1090 
1091 	return NULL;
1092 }
1093 
1094 /**
1095  * mei_cl_device_match  - device match function
1096  *
1097  * @dev: device
1098  * @drv: driver
1099  *
1100  * Return:  1 if matching device was found 0 otherwise
1101  */
1102 static int mei_cl_device_match(struct device *dev, const struct device_driver *drv)
1103 {
1104 	const struct mei_cl_device *cldev = to_mei_cl_device(dev);
1105 	const struct mei_cl_driver *cldrv = to_mei_cl_driver(drv);
1106 	const struct mei_cl_device_id *found_id;
1107 
1108 	if (!cldev->do_match)
1109 		return 0;
1110 
1111 	if (!cldrv || !cldrv->id_table)
1112 		return 0;
1113 
1114 	found_id = mei_cl_device_find(cldev, cldrv);
1115 	if (found_id)
1116 		return 1;
1117 
1118 	return 0;
1119 }
1120 
1121 /**
1122  * mei_cl_device_probe - bus probe function
1123  *
1124  * @dev: device
1125  *
1126  * Return:  0 on success; < 0 otherwise
1127  */
1128 static int mei_cl_device_probe(struct device *dev)
1129 {
1130 	struct mei_cl_device *cldev;
1131 	struct mei_cl_driver *cldrv;
1132 	const struct mei_cl_device_id *id;
1133 	int ret;
1134 
1135 	cldev = to_mei_cl_device(dev);
1136 	cldrv = to_mei_cl_driver(dev->driver);
1137 
1138 	if (!cldrv || !cldrv->probe)
1139 		return -ENODEV;
1140 
1141 	id = mei_cl_device_find(cldev, cldrv);
1142 	if (!id)
1143 		return -ENODEV;
1144 
1145 	if (!mei_cl_bus_module_get(cldev)) {
1146 		dev_err(&cldev->dev, "get hw module failed");
1147 		return -ENODEV;
1148 	}
1149 
1150 	ret = cldrv->probe(cldev, id);
1151 	if (ret) {
1152 		mei_cl_bus_module_put(cldev);
1153 		return ret;
1154 	}
1155 
1156 	__module_get(THIS_MODULE);
1157 	return 0;
1158 }
1159 
1160 /**
1161  * mei_cl_device_remove - remove device from the bus
1162  *
1163  * @dev: device
1164  *
1165  * Return:  0 on success; < 0 otherwise
1166  */
1167 static void mei_cl_device_remove(struct device *dev)
1168 {
1169 	struct mei_cl_device *cldev = to_mei_cl_device(dev);
1170 	struct mei_cl_driver *cldrv = to_mei_cl_driver(dev->driver);
1171 
1172 	if (cldrv->remove)
1173 		cldrv->remove(cldev);
1174 
1175 	mei_cldev_unregister_callbacks(cldev);
1176 
1177 	mei_cl_bus_module_put(cldev);
1178 	module_put(THIS_MODULE);
1179 }
1180 
1181 static ssize_t name_show(struct device *dev, struct device_attribute *a,
1182 			     char *buf)
1183 {
1184 	struct mei_cl_device *cldev = to_mei_cl_device(dev);
1185 
1186 	return sysfs_emit(buf, "%s", cldev->name);
1187 }
1188 static DEVICE_ATTR_RO(name);
1189 
1190 static ssize_t uuid_show(struct device *dev, struct device_attribute *a,
1191 			     char *buf)
1192 {
1193 	struct mei_cl_device *cldev = to_mei_cl_device(dev);
1194 	const uuid_le *uuid = mei_me_cl_uuid(cldev->me_cl);
1195 
1196 	return sysfs_emit(buf, "%pUl", uuid);
1197 }
1198 static DEVICE_ATTR_RO(uuid);
1199 
1200 static ssize_t version_show(struct device *dev, struct device_attribute *a,
1201 			     char *buf)
1202 {
1203 	struct mei_cl_device *cldev = to_mei_cl_device(dev);
1204 	u8 version = mei_me_cl_ver(cldev->me_cl);
1205 
1206 	return sysfs_emit(buf, "%02X", version);
1207 }
1208 static DEVICE_ATTR_RO(version);
1209 
1210 static ssize_t modalias_show(struct device *dev, struct device_attribute *a,
1211 			     char *buf)
1212 {
1213 	struct mei_cl_device *cldev = to_mei_cl_device(dev);
1214 	const uuid_le *uuid = mei_me_cl_uuid(cldev->me_cl);
1215 	u8 version = mei_me_cl_ver(cldev->me_cl);
1216 
1217 	return sysfs_emit(buf, "mei:%s:%pUl:%02X:", cldev->name, uuid, version);
1218 }
1219 static DEVICE_ATTR_RO(modalias);
1220 
1221 static ssize_t max_conn_show(struct device *dev, struct device_attribute *a,
1222 			     char *buf)
1223 {
1224 	struct mei_cl_device *cldev = to_mei_cl_device(dev);
1225 	u8 maxconn = mei_me_cl_max_conn(cldev->me_cl);
1226 
1227 	return sysfs_emit(buf, "%d", maxconn);
1228 }
1229 static DEVICE_ATTR_RO(max_conn);
1230 
1231 static ssize_t fixed_show(struct device *dev, struct device_attribute *a,
1232 			  char *buf)
1233 {
1234 	struct mei_cl_device *cldev = to_mei_cl_device(dev);
1235 	u8 fixed = mei_me_cl_fixed(cldev->me_cl);
1236 
1237 	return sysfs_emit(buf, "%d", fixed);
1238 }
1239 static DEVICE_ATTR_RO(fixed);
1240 
1241 static ssize_t vtag_show(struct device *dev, struct device_attribute *a,
1242 			 char *buf)
1243 {
1244 	struct mei_cl_device *cldev = to_mei_cl_device(dev);
1245 	bool vt = mei_me_cl_vt(cldev->me_cl);
1246 
1247 	return sysfs_emit(buf, "%d", vt);
1248 }
1249 static DEVICE_ATTR_RO(vtag);
1250 
1251 static ssize_t max_len_show(struct device *dev, struct device_attribute *a,
1252 			    char *buf)
1253 {
1254 	struct mei_cl_device *cldev = to_mei_cl_device(dev);
1255 	u32 maxlen = mei_me_cl_max_len(cldev->me_cl);
1256 
1257 	return sysfs_emit(buf, "%u", maxlen);
1258 }
1259 static DEVICE_ATTR_RO(max_len);
1260 
1261 static struct attribute *mei_cldev_attrs[] = {
1262 	&dev_attr_name.attr,
1263 	&dev_attr_uuid.attr,
1264 	&dev_attr_version.attr,
1265 	&dev_attr_modalias.attr,
1266 	&dev_attr_max_conn.attr,
1267 	&dev_attr_fixed.attr,
1268 	&dev_attr_vtag.attr,
1269 	&dev_attr_max_len.attr,
1270 	NULL,
1271 };
1272 ATTRIBUTE_GROUPS(mei_cldev);
1273 
1274 /**
1275  * mei_cl_device_uevent - me client bus uevent handler
1276  *
1277  * @dev: device
1278  * @env: uevent kobject
1279  *
1280  * Return: 0 on success -ENOMEM on when add_uevent_var fails
1281  */
1282 static int mei_cl_device_uevent(const struct device *dev, struct kobj_uevent_env *env)
1283 {
1284 	const struct mei_cl_device *cldev = to_mei_cl_device(dev);
1285 	const uuid_le *uuid = mei_me_cl_uuid(cldev->me_cl);
1286 	u8 version = mei_me_cl_ver(cldev->me_cl);
1287 
1288 	if (add_uevent_var(env, "MEI_CL_VERSION=%d", version))
1289 		return -ENOMEM;
1290 
1291 	if (add_uevent_var(env, "MEI_CL_UUID=%pUl", uuid))
1292 		return -ENOMEM;
1293 
1294 	if (add_uevent_var(env, "MEI_CL_NAME=%s", cldev->name))
1295 		return -ENOMEM;
1296 
1297 	if (add_uevent_var(env, "MODALIAS=mei:%s:%pUl:%02X:",
1298 			   cldev->name, uuid, version))
1299 		return -ENOMEM;
1300 
1301 	return 0;
1302 }
1303 
1304 static const struct bus_type mei_cl_bus_type = {
1305 	.name		= "mei",
1306 	.dev_groups	= mei_cldev_groups,
1307 	.match		= mei_cl_device_match,
1308 	.probe		= mei_cl_device_probe,
1309 	.remove		= mei_cl_device_remove,
1310 	.uevent		= mei_cl_device_uevent,
1311 };
1312 
1313 static struct mei_device *mei_dev_bus_get(struct mei_device *bus)
1314 {
1315 	if (bus) {
1316 		get_device(&bus->dev);
1317 		get_device(bus->parent);
1318 	}
1319 
1320 	return bus;
1321 }
1322 
1323 static void mei_dev_bus_put(struct mei_device *bus)
1324 {
1325 	if (bus) {
1326 		put_device(bus->parent);
1327 		put_device(&bus->dev);
1328 	}
1329 }
1330 
1331 static void mei_cl_bus_dev_release(struct device *dev)
1332 {
1333 	struct mei_cl_device *cldev = to_mei_cl_device(dev);
1334 	struct mei_device *bus = cldev->bus;
1335 	struct mei_cl *cl;
1336 
1337 	scoped_guard(mutex, &bus->device_lock) {
1338 		mei_cl_flush_queues(cldev->cl, NULL);
1339 		mei_me_cl_put(cldev->me_cl);
1340 		list_for_each_entry(cl, &bus->file_list, link)
1341 			WARN_ON(cl == cldev->cl);
1342 	}
1343 	mei_dev_bus_put(bus);
1344 
1345 	kfree(cldev->cl);
1346 	kfree(cldev);
1347 }
1348 
1349 static const struct device_type mei_cl_device_type = {
1350 	.release = mei_cl_bus_dev_release,
1351 };
1352 
1353 /**
1354  * mei_cl_bus_set_name - set device name for me client device
1355  *  <controller>-<client device>
1356  *  Example: 0000:00:16.0-55213584-9a29-4916-badf-0fb7ed682aeb
1357  *
1358  * @cldev: me client device
1359  */
1360 static inline void mei_cl_bus_set_name(struct mei_cl_device *cldev)
1361 {
1362 	dev_set_name(&cldev->dev, "%s-%pUl",
1363 		     dev_name(cldev->bus->parent),
1364 		     mei_me_cl_uuid(cldev->me_cl));
1365 }
1366 
1367 /**
1368  * mei_cl_bus_dev_alloc - initialize and allocate mei client device
1369  *
1370  * @bus: mei device
1371  * @me_cl: me client
1372  *
1373  * Return: allocated device structure or NULL on allocation failure
1374  */
1375 static struct mei_cl_device *mei_cl_bus_dev_alloc(struct mei_device *bus,
1376 						  struct mei_me_client *me_cl)
1377 {
1378 	struct mei_cl_device *cldev;
1379 	struct mei_cl *cl;
1380 
1381 	cldev = kzalloc_obj(*cldev);
1382 	if (!cldev)
1383 		return NULL;
1384 
1385 	cl = mei_cl_allocate(bus);
1386 	if (!cl) {
1387 		kfree(cldev);
1388 		return NULL;
1389 	}
1390 
1391 	device_initialize(&cldev->dev);
1392 	cldev->dev.parent = bus->parent;
1393 	cldev->dev.bus    = &mei_cl_bus_type;
1394 	cldev->dev.type   = &mei_cl_device_type;
1395 	cldev->bus        = mei_dev_bus_get(bus);
1396 	cldev->me_cl      = mei_me_cl_get(me_cl);
1397 	cldev->cl         = cl;
1398 	mei_cl_bus_set_name(cldev);
1399 	cldev->is_added   = 0;
1400 	INIT_LIST_HEAD(&cldev->bus_list);
1401 	device_enable_async_suspend(&cldev->dev);
1402 
1403 	return cldev;
1404 }
1405 
1406 /**
1407  * mei_cl_bus_dev_setup - setup me client device
1408  *    run fix up routines and set the device name
1409  *
1410  * @bus: mei device
1411  * @cldev: me client device
1412  *
1413  * Return: true if the device is eligible for enumeration
1414  */
1415 static bool mei_cl_bus_dev_setup(struct mei_device *bus,
1416 				 struct mei_cl_device *cldev)
1417 {
1418 	cldev->do_match = 1;
1419 	mei_cl_bus_dev_fixup(cldev);
1420 
1421 	/* the device name can change during fix up */
1422 	if (cldev->do_match)
1423 		mei_cl_bus_set_name(cldev);
1424 
1425 	return cldev->do_match == 1;
1426 }
1427 
1428 /**
1429  * mei_cl_bus_dev_add - add me client devices
1430  *
1431  * @cldev: me client device
1432  *
1433  * Return: 0 on success; < 0 on failure
1434  */
1435 static int mei_cl_bus_dev_add(struct mei_cl_device *cldev)
1436 {
1437 	int ret;
1438 
1439 	dev_dbg(&cldev->dev, "adding %pUL:%02X\n",
1440 		mei_me_cl_uuid(cldev->me_cl),
1441 		mei_me_cl_ver(cldev->me_cl));
1442 	ret = device_add(&cldev->dev);
1443 	if (!ret)
1444 		cldev->is_added = 1;
1445 
1446 	return ret;
1447 }
1448 
1449 /**
1450  * mei_cl_bus_dev_stop - stop the driver
1451  *
1452  * @cldev: me client device
1453  */
1454 static void mei_cl_bus_dev_stop(struct mei_cl_device *cldev)
1455 {
1456 	cldev->do_match = 0;
1457 	if (cldev->is_added)
1458 		device_release_driver(&cldev->dev);
1459 }
1460 
1461 /**
1462  * mei_cl_bus_dev_destroy - destroy me client devices object
1463  *
1464  * @cldev: me client device
1465  *
1466  * Locking: called under "dev->cl_bus_lock" lock
1467  */
1468 static void mei_cl_bus_dev_destroy(struct mei_cl_device *cldev)
1469 {
1470 
1471 	WARN_ON(!mutex_is_locked(&cldev->bus->cl_bus_lock));
1472 
1473 	if (!cldev->is_added)
1474 		return;
1475 
1476 	device_del(&cldev->dev);
1477 
1478 	list_del_init(&cldev->bus_list);
1479 
1480 	cldev->is_added = 0;
1481 	put_device(&cldev->dev);
1482 }
1483 
1484 /**
1485  * mei_cl_bus_remove_device - remove a devices form the bus
1486  *
1487  * @cldev: me client device
1488  */
1489 static void mei_cl_bus_remove_device(struct mei_cl_device *cldev)
1490 {
1491 	mei_cl_bus_dev_stop(cldev);
1492 	mei_cl_bus_dev_destroy(cldev);
1493 }
1494 
1495 /**
1496  * mei_cl_bus_remove_devices - remove all devices form the bus
1497  *
1498  * @bus: mei device
1499  */
1500 void mei_cl_bus_remove_devices(struct mei_device *bus)
1501 {
1502 	struct mei_cl_device *cldev, *next;
1503 
1504 	mutex_lock(&bus->cl_bus_lock);
1505 	list_for_each_entry_safe(cldev, next, &bus->device_list, bus_list)
1506 		mei_cl_bus_remove_device(cldev);
1507 	mutex_unlock(&bus->cl_bus_lock);
1508 }
1509 
1510 
1511 /**
1512  * mei_cl_bus_dev_init - allocate and initializes an mei client devices
1513  *     based on me client
1514  *
1515  * @bus: mei device
1516  * @me_cl: me client
1517  *
1518  * Locking: called under "dev->cl_bus_lock" lock
1519  */
1520 static void mei_cl_bus_dev_init(struct mei_device *bus,
1521 				struct mei_me_client *me_cl)
1522 {
1523 	struct mei_cl_device *cldev;
1524 
1525 	WARN_ON(!mutex_is_locked(&bus->cl_bus_lock));
1526 
1527 	dev_dbg(&bus->dev, "initializing %pUl", mei_me_cl_uuid(me_cl));
1528 
1529 	if (me_cl->bus_added)
1530 		return;
1531 
1532 	cldev = mei_cl_bus_dev_alloc(bus, me_cl);
1533 	if (!cldev)
1534 		return;
1535 
1536 	me_cl->bus_added = true;
1537 	list_add_tail(&cldev->bus_list, &bus->device_list);
1538 
1539 }
1540 
1541 /**
1542  * mei_cl_bus_rescan - scan me clients list and add create
1543  *    devices for eligible clients
1544  *
1545  * @bus: mei device
1546  */
1547 static void mei_cl_bus_rescan(struct mei_device *bus)
1548 {
1549 	struct mei_cl_device *cldev, *n;
1550 	struct mei_me_client *me_cl;
1551 
1552 	mutex_lock(&bus->cl_bus_lock);
1553 
1554 	down_read(&bus->me_clients_rwsem);
1555 	list_for_each_entry(me_cl, &bus->me_clients, list)
1556 		mei_cl_bus_dev_init(bus, me_cl);
1557 	up_read(&bus->me_clients_rwsem);
1558 
1559 	list_for_each_entry_safe(cldev, n, &bus->device_list, bus_list) {
1560 
1561 		if (!mei_me_cl_is_active(cldev->me_cl)) {
1562 			mei_cl_bus_remove_device(cldev);
1563 			continue;
1564 		}
1565 
1566 		if (cldev->is_added)
1567 			continue;
1568 
1569 		if (mei_cl_bus_dev_setup(bus, cldev))
1570 			mei_cl_bus_dev_add(cldev);
1571 		else {
1572 			list_del_init(&cldev->bus_list);
1573 			put_device(&cldev->dev);
1574 		}
1575 	}
1576 	mutex_unlock(&bus->cl_bus_lock);
1577 
1578 	dev_dbg(&bus->dev, "rescan end");
1579 }
1580 
1581 void mei_cl_bus_rescan_work(struct work_struct *work)
1582 {
1583 	struct mei_device *bus =
1584 		container_of(work, struct mei_device, bus_rescan_work);
1585 
1586 	mei_cl_bus_rescan(bus);
1587 }
1588 
1589 int __mei_cldev_driver_register(struct mei_cl_driver *cldrv,
1590 				struct module *owner)
1591 {
1592 	int err;
1593 
1594 	cldrv->driver.name = cldrv->name;
1595 	cldrv->driver.owner = owner;
1596 	cldrv->driver.bus = &mei_cl_bus_type;
1597 
1598 	err = driver_register(&cldrv->driver);
1599 	if (err)
1600 		return err;
1601 
1602 	pr_debug("mei: driver [%s] registered\n", cldrv->driver.name);
1603 
1604 	return 0;
1605 }
1606 EXPORT_SYMBOL_GPL(__mei_cldev_driver_register);
1607 
1608 void mei_cldev_driver_unregister(struct mei_cl_driver *cldrv)
1609 {
1610 	driver_unregister(&cldrv->driver);
1611 
1612 	pr_debug("mei: driver [%s] unregistered\n", cldrv->driver.name);
1613 }
1614 EXPORT_SYMBOL_GPL(mei_cldev_driver_unregister);
1615 
1616 
1617 int __init mei_cl_bus_init(void)
1618 {
1619 	return bus_register(&mei_cl_bus_type);
1620 }
1621 
1622 void __exit mei_cl_bus_exit(void)
1623 {
1624 	bus_unregister(&mei_cl_bus_type);
1625 }
1626