xref: /freebsd/sys/dev/ufshci/ufshci_ctrlr_cmd.c (revision 2be8ce8405ed8e9a9417ca5c3198bbc9a67a825b)
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
ufshci_ctrlr_cmd_send_task_mgmt_request(struct ufshci_controller * ctrlr,ufshci_cb_fn_t cb_fn,void * cb_arg,uint8_t function,uint8_t lun,uint8_t task_tag,uint8_t iid)11 ufshci_ctrlr_cmd_send_task_mgmt_request(struct ufshci_controller *ctrlr,
12     ufshci_cb_fn_t cb_fn, void *cb_arg, uint8_t function, uint8_t lun,
13     uint8_t task_tag, uint8_t iid)
14 {
15 	struct ufshci_request *req;
16 	struct ufshci_task_mgmt_request_upiu *upiu;
17 
18 	req = ufshci_allocate_request_vaddr(NULL, 0, M_WAITOK, cb_fn, cb_arg);
19 
20 	req->request_size = sizeof(struct ufshci_task_mgmt_request_upiu);
21 	req->response_size = sizeof(struct ufshci_task_mgmt_response_upiu);
22 
23 	upiu = (struct ufshci_task_mgmt_request_upiu *)&req->request_upiu;
24 	memset(upiu, 0, req->request_size);
25 	upiu->header.trans_type =
26 	    UFSHCI_UPIU_TRANSACTION_CODE_TASK_MANAGEMENT_REQUEST;
27 	upiu->header.lun = lun;
28 	upiu->header.ext_iid_or_function = function;
29 	upiu->input_param1 = lun;
30 	upiu->input_param2 = task_tag;
31 	upiu->input_param3 = iid;
32 
33 	ufshci_ctrlr_submit_task_mgmt_request(ctrlr, req);
34 }
35 
36 void
ufshci_ctrlr_cmd_send_nop(struct ufshci_controller * ctrlr,ufshci_cb_fn_t cb_fn,void * cb_arg)37 ufshci_ctrlr_cmd_send_nop(struct ufshci_controller *ctrlr, ufshci_cb_fn_t cb_fn,
38     void *cb_arg)
39 {
40 	struct ufshci_request *req;
41 	struct ufshci_nop_out_upiu *upiu;
42 
43 	req = ufshci_allocate_request_vaddr(NULL, 0, M_WAITOK, cb_fn, cb_arg);
44 
45 	req->request_size = sizeof(struct ufshci_nop_out_upiu);
46 	req->response_size = sizeof(struct ufshci_nop_in_upiu);
47 
48 	upiu = (struct ufshci_nop_out_upiu *)&req->request_upiu;
49 	memset(upiu, 0, req->request_size);
50 	upiu->header.trans_type = UFSHCI_UPIU_TRANSACTION_CODE_NOP_OUT;
51 
52 	ufshci_ctrlr_submit_admin_request(ctrlr, req);
53 }
54 
55 void
ufshci_ctrlr_cmd_send_query_request(struct ufshci_controller * ctrlr,ufshci_cb_fn_t cb_fn,void * cb_arg,struct ufshci_query_param param)56 ufshci_ctrlr_cmd_send_query_request(struct ufshci_controller *ctrlr,
57     ufshci_cb_fn_t cb_fn, void *cb_arg, struct ufshci_query_param param)
58 {
59 	struct ufshci_request *req;
60 	struct ufshci_query_request_upiu *upiu;
61 
62 	req = ufshci_allocate_request_vaddr(NULL, 0, M_WAITOK, cb_fn, cb_arg);
63 
64 	req->request_size = sizeof(struct ufshci_query_request_upiu);
65 	req->response_size = sizeof(struct ufshci_query_response_upiu);
66 
67 	upiu = (struct ufshci_query_request_upiu *)&req->request_upiu;
68 	memset(upiu, 0, req->request_size);
69 	upiu->header.trans_type = UFSHCI_UPIU_TRANSACTION_CODE_QUERY_REQUEST;
70 	upiu->header.ext_iid_or_function = param.function;
71 	upiu->opcode = param.opcode;
72 	upiu->idn = param.type;
73 	upiu->index = param.index;
74 	upiu->selector = param.selector;
75 	upiu->value_64 = param.value;
76 	upiu->length = param.desc_size;
77 
78 	ufshci_ctrlr_submit_admin_request(ctrlr, req);
79 }
80