151 lines
4.7 KiB
C
151 lines
4.7 KiB
C
|
/* Copyright (c) 2013-2014, The Linux Foundation. All rights reserved.
|
||
|
*
|
||
|
* Redistribution and use in source and binary forms, with or without
|
||
|
* modification, are permitted provided that the following conditions are
|
||
|
* met:
|
||
|
* * Redistributions of source code must retain the above copyright
|
||
|
* notice, this list of conditions and the following disclaimer.
|
||
|
* * Redistributions in binary form must reproduce the above
|
||
|
* copyright notice, this list of conditions and the following
|
||
|
* disclaimer in the documentation and/or other materials provided
|
||
|
* with the distribution.
|
||
|
* * Neither the name of The Linux Foundation nor the names of its
|
||
|
* contributors may be used to endorse or promote products derived
|
||
|
* from this software without specific prior written permission.
|
||
|
*
|
||
|
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
|
||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
|
||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
|
||
|
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||
|
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||
|
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||
|
*/
|
||
|
|
||
|
#ifndef _UTP_H_
|
||
|
#define _UTP_H_
|
||
|
|
||
|
#include <ufs_hci.h>
|
||
|
#include <upiu.h>
|
||
|
#include <ucs.h>
|
||
|
#include <dme.h>
|
||
|
|
||
|
/* UPIU general header length without the extra segments. */
|
||
|
#define UPIU_HDR_LEN 0x20
|
||
|
|
||
|
#define UTP_MAX_PRD_DATA_BYTE_CNT 0x40000
|
||
|
#define UTP_MAX_PRD_DATA_BYTE_CNT_BYTE_SHIFT 18
|
||
|
#define UTP_MAX_PRD_TABLE_ENTRIES 1024
|
||
|
|
||
|
#define UTP_CMD_DESC_BASE_ALIGNMENT_SIZE 128
|
||
|
#define UTP_REQ_BUILD_CMD_DD_IRQ_FIELD(cmd, dd, irq) ((cmd << 4) | (dd << 1) | irq)
|
||
|
|
||
|
#define UTP_MUTEX_ACQUIRE_TIMEOUT 0x100000
|
||
|
|
||
|
#define UTP_GENERIC_CMD_TIMEOUT 40000
|
||
|
#define UTP_MAX_COMMAND_RETRY 5000000
|
||
|
|
||
|
struct utp_prdt_entry
|
||
|
{
|
||
|
uint32_t data_base_addr;
|
||
|
uint32_t data_upper_addr;
|
||
|
uint8_t resv_0[4];
|
||
|
uint32_t data_byte_cnt;
|
||
|
}__PACKED;
|
||
|
|
||
|
struct utp_trans_req_desc
|
||
|
{
|
||
|
uint8_t resv_0[3];
|
||
|
uint8_t cmd_type_dd_irq;
|
||
|
uint8_t resv_1[4];
|
||
|
uint8_t overall_cmd_status;
|
||
|
uint8_t resv_2[7];
|
||
|
uint8_t cmd_desc_base_addr[4];
|
||
|
uint8_t cmd_desc_base_addr_upper[4];
|
||
|
uint16_t resp_upiu_len;
|
||
|
uint16_t resp_upiu_offset;
|
||
|
uint16_t prdt_len;
|
||
|
uint16_t prdt_offset;
|
||
|
}__PACKED;
|
||
|
|
||
|
enum utp_utrd_irq_type
|
||
|
{
|
||
|
UTRD_REGULAR_CMD = 0,
|
||
|
UTRD_IRQ_CMD = 1,
|
||
|
};
|
||
|
|
||
|
enum utp_utrd_overall_status_type
|
||
|
{
|
||
|
UTRD_OCS_SUCCESS = 0x0,
|
||
|
UTRD_OCS_INVALID_COM_TABLE_ATTR = 0x1,
|
||
|
UTRD_OCS_INVALID_PRDT_ATTR = 0x2,
|
||
|
UTRD_OCS_MISMATCH_DATA_BUFFER_SIZE = 0x3,
|
||
|
UTRD_OCS_MISMATCH_RESPONSE_UPIU_SIZE = 0x4,
|
||
|
UTRD_OCS_COMMUNICATION_FAILURE = 0x5,
|
||
|
UTRD_OCS_ABORTED = 0x6,
|
||
|
UTRD_OCS_INVALID_OCS_VALUE = 0xf,
|
||
|
};
|
||
|
|
||
|
struct utp_utrd_req_build_type
|
||
|
{
|
||
|
struct upiu_basic_hdr *req_upiu;
|
||
|
uint32_t req_upiu_len;
|
||
|
uint32_t resp_upiu_len;
|
||
|
enum upiu_cmd_type cmd_type;
|
||
|
enum upiu_dd_type dd;
|
||
|
enum utp_utrd_irq_type irq;
|
||
|
enum utp_utrd_overall_status_type ocs;
|
||
|
uint32_t prdt_offset;
|
||
|
uint32_t prdt_len;
|
||
|
uint32_t timeout;
|
||
|
};
|
||
|
|
||
|
struct utp_task_mgmt_req_desc
|
||
|
{
|
||
|
uint8_t resv_0[3];
|
||
|
uint8_t irq;
|
||
|
uint8_t resv_1[4];
|
||
|
uint8_t overall_cmd_status;
|
||
|
uint8_t resv_2[7];
|
||
|
}__PACKED;
|
||
|
|
||
|
enum utp_utmrd_irq_type
|
||
|
{
|
||
|
NO_IRQ = 0,
|
||
|
ENABLE_IRQ = 1,
|
||
|
};
|
||
|
|
||
|
enum utp_utmrd_overall_status_type
|
||
|
{
|
||
|
UTMRD_OCS_SUCCESS = 0x0,
|
||
|
UTMRD_OCS_TASK_MGMT_FUNC_ATTR = 0x1,
|
||
|
UTMRD_OCS_MISMATCH_TASK_MGMT_REQ_SIZE = 0x2,
|
||
|
UTMRD_OCS_MISMATCH_TASK_MGMT_RES_SIZE = 0x3,
|
||
|
UTMRD_OCS_PEER_COMM_FAILURE = 0x4,
|
||
|
UTMRD_OCS_ABORTED = 0x5,
|
||
|
UTMRD_OCS_FATAL_ERR = 0x6,
|
||
|
};
|
||
|
|
||
|
struct utrd_cmd_desc
|
||
|
{
|
||
|
struct upiu_gen_hdr *req_upiu;
|
||
|
uint32_t resp_upiu_len;
|
||
|
uint32_t num_prdt;
|
||
|
};
|
||
|
|
||
|
struct utp_bitmap_access_type
|
||
|
{
|
||
|
uint32_t *bitmap;
|
||
|
uint32_t door_bell_bit;
|
||
|
mutex_t *mutx;
|
||
|
};
|
||
|
|
||
|
int utp_enqueue_upiu(struct ufs_dev *dev, struct upiu_req_build_type *upiu_data);
|
||
|
void utp_process_req_completion(struct ufs_req_irq_type *irq);
|
||
|
int utp_poll_utrd_complete(struct ufs_dev *dev);
|
||
|
#endif
|