xref: /freebsd/sys/dev/ufshci/ufshci_ctrlr_cmd.c (revision 4b15965daa99044daf184221b7c283bf7f2d7e66)
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 "ufshci_private.h"
9 
10 void
11 ufshci_ctrlr_cmd_send_nop(struct ufshci_controller *ctrlr, ufshci_cb_fn_t cb_fn,
12     void *cb_arg)
13 {
14 	struct ufshci_request *req;
15 	struct ufshci_nop_out_upiu *upiu;
16 
17 	req = ufshci_allocate_request_vaddr(NULL, 0, M_WAITOK, cb_fn, cb_arg);
18 
19 	req->request_size = sizeof(struct ufshci_nop_out_upiu);
20 	req->response_size = sizeof(struct ufshci_nop_in_upiu);
21 
22 	upiu = (struct ufshci_nop_out_upiu *)&req->request_upiu;
23 	memset(upiu, 0, req->request_size);
24 	upiu->header.trans_type = UFSHCI_UPIU_TRANSACTION_CODE_NOP_OUT;
25 
26 	ufshci_ctrlr_submit_admin_request(ctrlr, req);
27 }
28 
29 void
30 ufshci_ctrlr_cmd_send_query_request(struct ufshci_controller *ctrlr,
31     ufshci_cb_fn_t cb_fn, void *cb_arg, struct ufshci_query_param param)
32 {
33 	struct ufshci_request *req;
34 	struct ufshci_query_request_upiu *upiu;
35 
36 	req = ufshci_allocate_request_vaddr(NULL, 0, M_WAITOK, cb_fn, cb_arg);
37 
38 	req->request_size = sizeof(struct ufshci_query_request_upiu);
39 	req->response_size = sizeof(struct ufshci_query_response_upiu);
40 
41 	upiu = (struct ufshci_query_request_upiu *)&req->request_upiu;
42 	memset(upiu, 0, req->request_size);
43 	upiu->header.trans_type = UFSHCI_UPIU_TRANSACTION_CODE_QUERY_REQUEST;
44 	upiu->header.ext_iid_or_function = param.function;
45 	upiu->opcode = param.opcode;
46 	upiu->idn = param.type;
47 	upiu->index = param.index;
48 	upiu->selector = param.selector;
49 	upiu->value_64 = param.value;
50 	upiu->length = param.desc_size;
51 
52 	ufshci_ctrlr_submit_admin_request(ctrlr, req);
53 }
54