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