xref: /openbmc/qemu/hw/ufs/ufs.h (revision 329f16624499cf7ee7640a7addb2dc51c1e6f030)
1bc4e68d3SJeuk Kim /*
2bc4e68d3SJeuk Kim  * QEMU UFS
3bc4e68d3SJeuk Kim  *
4bc4e68d3SJeuk Kim  * Copyright (c) 2023 Samsung Electronics Co., Ltd. All rights reserved.
5bc4e68d3SJeuk Kim  *
6bc4e68d3SJeuk Kim  * Written by Jeuk Kim <jeuk20.kim@samsung.com>
7bc4e68d3SJeuk Kim  *
8bc4e68d3SJeuk Kim  * SPDX-License-Identifier: GPL-2.0-or-later
9bc4e68d3SJeuk Kim  */
10bc4e68d3SJeuk Kim 
11bc4e68d3SJeuk Kim #ifndef HW_UFS_UFS_H
12bc4e68d3SJeuk Kim #define HW_UFS_UFS_H
13bc4e68d3SJeuk Kim 
14bc4e68d3SJeuk Kim #include "hw/pci/pci_device.h"
15bc4e68d3SJeuk Kim #include "hw/scsi/scsi.h"
16bc4e68d3SJeuk Kim #include "block/ufs.h"
17bc4e68d3SJeuk Kim 
18bc4e68d3SJeuk Kim #define UFS_MAX_LUS 32
19bc4e68d3SJeuk Kim #define UFS_BLOCK_SIZE 4096
20bc4e68d3SJeuk Kim 
21*329f1662SJeuk Kim typedef enum UfsRequestState {
22*329f1662SJeuk Kim     UFS_REQUEST_IDLE = 0,
23*329f1662SJeuk Kim     UFS_REQUEST_READY = 1,
24*329f1662SJeuk Kim     UFS_REQUEST_RUNNING = 2,
25*329f1662SJeuk Kim     UFS_REQUEST_COMPLETE = 3,
26*329f1662SJeuk Kim     UFS_REQUEST_ERROR = 4,
27*329f1662SJeuk Kim } UfsRequestState;
28*329f1662SJeuk Kim 
29*329f1662SJeuk Kim typedef enum UfsReqResult {
30*329f1662SJeuk Kim     UFS_REQUEST_SUCCESS = 0,
31*329f1662SJeuk Kim     UFS_REQUEST_FAIL = 1,
32*329f1662SJeuk Kim } UfsReqResult;
33*329f1662SJeuk Kim 
34*329f1662SJeuk Kim typedef struct UfsRequest {
35*329f1662SJeuk Kim     struct UfsHc *hc;
36*329f1662SJeuk Kim     UfsRequestState state;
37*329f1662SJeuk Kim     int slot;
38*329f1662SJeuk Kim 
39*329f1662SJeuk Kim     UtpTransferReqDesc utrd;
40*329f1662SJeuk Kim     UtpUpiuReq req_upiu;
41*329f1662SJeuk Kim     UtpUpiuRsp rsp_upiu;
42*329f1662SJeuk Kim 
43*329f1662SJeuk Kim     /* for scsi command */
44*329f1662SJeuk Kim     QEMUSGList *sg;
45*329f1662SJeuk Kim } UfsRequest;
46*329f1662SJeuk Kim 
47bc4e68d3SJeuk Kim typedef struct UfsParams {
48bc4e68d3SJeuk Kim     char *serial;
49bc4e68d3SJeuk Kim     uint8_t nutrs; /* Number of UTP Transfer Request Slots */
50bc4e68d3SJeuk Kim     uint8_t nutmrs; /* Number of UTP Task Management Request Slots */
51bc4e68d3SJeuk Kim } UfsParams;
52bc4e68d3SJeuk Kim 
53bc4e68d3SJeuk Kim typedef struct UfsHc {
54bc4e68d3SJeuk Kim     PCIDevice parent_obj;
55bc4e68d3SJeuk Kim     MemoryRegion iomem;
56bc4e68d3SJeuk Kim     UfsReg reg;
57bc4e68d3SJeuk Kim     UfsParams params;
58bc4e68d3SJeuk Kim     uint32_t reg_size;
59*329f1662SJeuk Kim     UfsRequest *req_list;
60*329f1662SJeuk Kim 
61*329f1662SJeuk Kim     DeviceDescriptor device_desc;
62*329f1662SJeuk Kim     GeometryDescriptor geometry_desc;
63*329f1662SJeuk Kim     Attributes attributes;
64*329f1662SJeuk Kim     Flags flags;
65bc4e68d3SJeuk Kim 
66bc4e68d3SJeuk Kim     qemu_irq irq;
67bc4e68d3SJeuk Kim     QEMUBH *doorbell_bh;
68bc4e68d3SJeuk Kim     QEMUBH *complete_bh;
69bc4e68d3SJeuk Kim } UfsHc;
70bc4e68d3SJeuk Kim 
71bc4e68d3SJeuk Kim #define TYPE_UFS "ufs"
72bc4e68d3SJeuk Kim #define UFS(obj) OBJECT_CHECK(UfsHc, (obj), TYPE_UFS)
73bc4e68d3SJeuk Kim 
74*329f1662SJeuk Kim typedef enum UfsQueryFlagPerm {
75*329f1662SJeuk Kim     UFS_QUERY_FLAG_NONE = 0x0,
76*329f1662SJeuk Kim     UFS_QUERY_FLAG_READ = 0x1,
77*329f1662SJeuk Kim     UFS_QUERY_FLAG_SET = 0x2,
78*329f1662SJeuk Kim     UFS_QUERY_FLAG_CLEAR = 0x4,
79*329f1662SJeuk Kim     UFS_QUERY_FLAG_TOGGLE = 0x8,
80*329f1662SJeuk Kim } UfsQueryFlagPerm;
81*329f1662SJeuk Kim 
82*329f1662SJeuk Kim typedef enum UfsQueryAttrPerm {
83*329f1662SJeuk Kim     UFS_QUERY_ATTR_NONE = 0x0,
84*329f1662SJeuk Kim     UFS_QUERY_ATTR_READ = 0x1,
85*329f1662SJeuk Kim     UFS_QUERY_ATTR_WRITE = 0x2,
86*329f1662SJeuk Kim } UfsQueryAttrPerm;
87*329f1662SJeuk Kim 
88bc4e68d3SJeuk Kim #endif /* HW_UFS_UFS_H */
89