xref: /freebsd/sys/dev/ufshci/ufshci.c (revision 1349a733cf2828e0040cabef89eeadc3ff00c40b)
1 /*-
2  * Copyright (c) 2025, Samsung Electronics Co., Ltd.
3  * Written by Jaeyoon Choi
4  *
5  * SPDX-License-Identifier: BSD-2-Clause
6  */
7 
8 #include <sys/param.h>
9 #include <sys/bus.h>
10 #include <sys/conf.h>
11 #include <sys/module.h>
12 
13 #include "ufshci_private.h"
14 
15 MALLOC_DEFINE(M_UFSHCI, "ufshci", "ufshci(4) memory allocations");
16 
17 int
ufshci_attach(device_t dev)18 ufshci_attach(device_t dev)
19 {
20 	struct ufshci_controller *ctrlr = device_get_softc(dev);
21 	int status;
22 
23 	status = ufshci_ctrlr_construct(ctrlr, dev);
24 	if (status != 0) {
25 		ufshci_ctrlr_destruct(ctrlr, dev);
26 		return (status);
27 	}
28 
29 	ctrlr->config_hook.ich_func = ufshci_ctrlr_start_config_hook;
30 	ctrlr->config_hook.ich_arg = ctrlr;
31 
32 	if (config_intrhook_establish(&ctrlr->config_hook) != 0)
33 		return (ENOMEM);
34 
35 	return (0);
36 }
37 
38 int
ufshci_detach(device_t dev)39 ufshci_detach(device_t dev)
40 {
41 	struct ufshci_controller *ctrlr = device_get_softc(dev);
42 
43 	config_intrhook_drain(&ctrlr->config_hook);
44 
45 	ufshci_ctrlr_destruct(ctrlr, dev);
46 
47 	return (0);
48 }
49 
50 void
ufshci_completion_poll_cb(void * arg,const struct ufshci_completion * cpl,bool error)51 ufshci_completion_poll_cb(void *arg, const struct ufshci_completion *cpl,
52     bool error)
53 {
54 	struct ufshci_completion_poll_status *status = arg;
55 
56 	/*
57 	 * Copy status into the argument passed by the caller, so that the
58 	 * caller can check the status to determine if the the request passed
59 	 * or failed.
60 	 */
61 	memcpy(&status->cpl.response_upiu, &cpl->response_upiu, cpl->size);
62 	status->error = error;
63 	atomic_store_rel_int(&status->done, 1);
64 }
65 
66 static int
ufshci_modevent(module_t mod __unused,int type __unused,void * argp __unused)67 ufshci_modevent(module_t mod __unused, int type __unused, void *argp __unused)
68 {
69 	return (0);
70 }
71 
72 static moduledata_t ufshci_mod = { "ufshci", ufshci_modevent, 0 };
73 
74 DECLARE_MODULE(ufshci, ufshci_mod, SI_SUB_DRIVERS, SI_ORDER_FIRST);
75 MODULE_VERSION(ufshci, 1);
76 MODULE_DEPEND(ufshci, cam, 1, 1, 1);
77