/* SPDX-License-Identifier: GPL-2.0 */
/*
 * Cadence CDNSP DRD Driver.
 *
 * Copyright (C) 2020 Cadence.
 *
 * Author: Pawel Laszczak <pawell@cadence.com>
 *
 */
#ifndef __LINUX_CDNSP_DEBUG
#define __LINUX_CDNSP_DEBUG

static inline const char *cdnsp_trb_comp_code_string(u8 status)
{
	switch (status) {
	case COMP_INVALID:
		return "Invalid";
	case COMP_SUCCESS:
		return "Success";
	case COMP_DATA_BUFFER_ERROR:
		return "Data Buffer Error";
	case COMP_BABBLE_DETECTED_ERROR:
		return "Babble Detected";
	case COMP_TRB_ERROR:
		return "TRB Error";
	case COMP_RESOURCE_ERROR:
		return "Resource Error";
	case COMP_NO_SLOTS_AVAILABLE_ERROR:
		return "No Slots Available Error";
	case COMP_INVALID_STREAM_TYPE_ERROR:
		return "Invalid Stream Type Error";
	case COMP_SLOT_NOT_ENABLED_ERROR:
		return "Slot Not Enabled Error";
	case COMP_ENDPOINT_NOT_ENABLED_ERROR:
		return "Endpoint Not Enabled Error";
	case COMP_SHORT_PACKET:
		return "Short Packet";
	case COMP_RING_UNDERRUN:
		return "Ring Underrun";
	case COMP_RING_OVERRUN:
		return "Ring Overrun";
	case COMP_VF_EVENT_RING_FULL_ERROR:
		return "VF Event Ring Full Error";
	case COMP_PARAMETER_ERROR:
		return "Parameter Error";
	case COMP_CONTEXT_STATE_ERROR:
		return "Context State Error";
	case COMP_EVENT_RING_FULL_ERROR:
		return "Event Ring Full Error";
	case COMP_INCOMPATIBLE_DEVICE_ERROR:
		return "Incompatible Device Error";
	case COMP_MISSED_SERVICE_ERROR:
		return "Missed Service Error";
	case COMP_COMMAND_RING_STOPPED:
		return "Command Ring Stopped";
	case COMP_COMMAND_ABORTED:
		return "Command Aborted";
	case COMP_STOPPED:
		return "Stopped";
	case COMP_STOPPED_LENGTH_INVALID:
		return "Stopped - Length Invalid";
	case COMP_STOPPED_SHORT_PACKET:
		return "Stopped - Short Packet";
	case COMP_MAX_EXIT_LATENCY_TOO_LARGE_ERROR:
		return "Max Exit Latency Too Large Error";
	case COMP_ISOCH_BUFFER_OVERRUN:
		return "Isoch Buffer Overrun";
	case COMP_EVENT_LOST_ERROR:
		return "Event Lost Error";
	case COMP_UNDEFINED_ERROR:
		return "Undefined Error";
	case COMP_INVALID_STREAM_ID_ERROR:
		return "Invalid Stream ID Error";
	default:
		return "Unknown!!";
	}
}

static inline const char *cdnsp_trb_type_string(u8 type)
{
	switch (type) {
	case TRB_NORMAL:
		return "Normal";
	case TRB_SETUP:
		return "Setup Stage";
	case TRB_DATA:
		return "Data Stage";
	case TRB_STATUS:
		return "Status Stage";
	case TRB_ISOC:
		return "Isoch";
	case TRB_LINK:
		return "Link";
	case TRB_EVENT_DATA:
		return "Event Data";
	case TRB_TR_NOOP:
		return "No-Op";
	case TRB_ENABLE_SLOT:
		return "Enable Slot Command";
	case TRB_DISABLE_SLOT:
		return "Disable Slot Command";
	case TRB_ADDR_DEV:
		return "Address Device Command";
	case TRB_CONFIG_EP:
		return "Configure Endpoint Command";
	case TRB_EVAL_CONTEXT:
		return "Evaluate Context Command";
	case TRB_RESET_EP:
		return "Reset Endpoint Command";
	case TRB_STOP_RING:
		return "Stop Ring Command";
	case TRB_SET_DEQ:
		return "Set TR Dequeue Pointer Command";
	case TRB_RESET_DEV:
		return "Reset Device Command";
	case TRB_FORCE_HEADER:
		return "Force Header Command";
	case TRB_CMD_NOOP:
		return "No-Op Command";
	case TRB_TRANSFER:
		return "Transfer Event";
	case TRB_COMPLETION:
		return "Command Completion Event";
	case TRB_PORT_STATUS:
		return "Port Status Change Event";
	case TRB_HC_EVENT:
		return "Device Controller Event";
	case TRB_MFINDEX_WRAP:
		return "MFINDEX Wrap Event";
	case TRB_ENDPOINT_NRDY:
		return "Endpoint Not ready";
	case TRB_HALT_ENDPOINT:
		return "Halt Endpoint";
	default:
		return "UNKNOWN";
	}
}

static inline const char *cdnsp_ring_type_string(enum cdnsp_ring_type type)
{
	switch (type) {
	case TYPE_CTRL:
		return "CTRL";
	case TYPE_ISOC:
		return "ISOC";
	case TYPE_BULK:
		return "BULK";
	case TYPE_INTR:
		return "INTR";
	case TYPE_STREAM:
		return "STREAM";
	case TYPE_COMMAND:
		return "CMD";
	case TYPE_EVENT:
		return "EVENT";
	}

	return "UNKNOWN";
}

static inline char *cdnsp_slot_state_string(u32 state)
{
	switch (state) {
	case SLOT_STATE_ENABLED:
		return "enabled/disabled";
	case SLOT_STATE_DEFAULT:
		return "default";
	case SLOT_STATE_ADDRESSED:
		return "addressed";
	case SLOT_STATE_CONFIGURED:
		return "configured";
	default:
		return "reserved";
	}
}

static inline const char *cdnsp_decode_trb(char *str, size_t size, u32 field0,
					   u32 field1, u32 field2, u32 field3)
{
	int ep_id = TRB_TO_EP_INDEX(field3) - 1;
	int type = TRB_FIELD_TO_TYPE(field3);
	unsigned int ep_num;
	int ret;
	u32 temp;

	ep_num = DIV_ROUND_UP(ep_id, 2);

	switch (type) {
	case TRB_LINK:
		ret = snprintf(str, size,
			       "LINK %08x%08x intr %ld type '%s' flags %c:%c:%c:%c",
			       field1, field0, GET_INTR_TARGET(field2),
			       cdnsp_trb_type_string(type),
			       field3 & TRB_IOC ? 'I' : 'i',
			       field3 & TRB_CHAIN ? 'C' : 'c',
			       field3 & TRB_TC ? 'T' : 't',
			       field3 & TRB_CYCLE ? 'C' : 'c');
		break;
	case TRB_TRANSFER:
	case TRB_COMPLETION:
	case TRB_PORT_STATUS:
	case TRB_HC_EVENT:
		ret = snprintf(str, size,
			       "ep%d%s(%d) type '%s' TRB %08x%08x status '%s'"
			       " len %ld slot %ld flags %c:%c",
			       ep_num, ep_id % 2 ? "out" : "in",
			       TRB_TO_EP_INDEX(field3),
			       cdnsp_trb_type_string(type), field1, field0,
			       cdnsp_trb_comp_code_string(GET_COMP_CODE(field2)),
			       EVENT_TRB_LEN(field2), TRB_TO_SLOT_ID(field3),
			       field3 & EVENT_DATA ? 'E' : 'e',
			       field3 & TRB_CYCLE ? 'C' : 'c');
		break;
	case TRB_MFINDEX_WRAP:
		ret = snprintf(str, size, "%s: flags %c",
			       cdnsp_trb_type_string(type),
			       field3 & TRB_CYCLE ? 'C' : 'c');
		break;
	case TRB_SETUP:
		ret = snprintf(str, size,
			       "type '%s' bRequestType %02x bRequest %02x "
			       "wValue %02x%02x wIndex %02x%02x wLength %d "
			       "length %ld TD size %ld intr %ld Setup ID %ld "
			       "flags %c:%c:%c",
			       cdnsp_trb_type_string(type),
			       field0 & 0xff,
			       (field0 & 0xff00) >> 8,
			       (field0 & 0xff000000) >> 24,
			       (field0 & 0xff0000) >> 16,
			       (field1 & 0xff00) >> 8,
			       field1 & 0xff,
			       (field1 & 0xff000000) >> 16 |
			       (field1 & 0xff0000) >> 16,
			       TRB_LEN(field2), GET_TD_SIZE(field2),
			       GET_INTR_TARGET(field2),
			       TRB_SETUPID_TO_TYPE(field3),
			       field3 & TRB_IDT ? 'D' : 'd',
			       field3 & TRB_IOC ? 'I' : 'i',
			       field3 & TRB_CYCLE ? 'C' : 'c');
		break;
	case TRB_DATA:
		ret = snprintf(str, size,
			       "type '%s' Buffer %08x%08x length %ld TD size %ld "
			       "intr %ld flags %c:%c:%c:%c:%c:%c:%c",
			       cdnsp_trb_type_string(type),
			       field1, field0, TRB_LEN(field2),
			       GET_TD_SIZE(field2),
			       GET_INTR_TARGET(field2),
			       field3 & TRB_IDT ? 'D' : 'i',
			       field3 & TRB_IOC ? 'I' : 'i',
			       field3 & TRB_CHAIN ? 'C' : 'c',
			       field3 & TRB_NO_SNOOP ? 'S' : 's',
			       field3 & TRB_ISP ? 'I' : 'i',
			       field3 & TRB_ENT ? 'E' : 'e',
			       field3 & TRB_CYCLE ? 'C' : 'c');
		break;
	case TRB_STATUS:
		ret = snprintf(str, size,
			       "Buffer %08x%08x length %ld TD size %ld intr"
			       "%ld type '%s' flags %c:%c:%c:%c",
			       field1, field0, TRB_LEN(field2),
			       GET_TD_SIZE(field2),
			       GET_INTR_TARGET(field2),
			       cdnsp_trb_type_string(type),
			       field3 & TRB_IOC ? 'I' : 'i',
			       field3 & TRB_CHAIN ? 'C' : 'c',
			       field3 & TRB_ENT ? 'E' : 'e',
			       field3 & TRB_CYCLE ? 'C' : 'c');
		break;
	case TRB_NORMAL:
	case TRB_ISOC:
	case TRB_EVENT_DATA:
	case TRB_TR_NOOP:
		ret = snprintf(str, size,
			       "type '%s' Buffer %08x%08x length %ld "
			       "TD size %ld intr %ld "
			       "flags %c:%c:%c:%c:%c:%c:%c:%c:%c",
			       cdnsp_trb_type_string(type),
			       field1, field0, TRB_LEN(field2),
			       GET_TD_SIZE(field2),
			       GET_INTR_TARGET(field2),
			       field3 & TRB_BEI ? 'B' : 'b',
			       field3 & TRB_IDT ? 'T' : 't',
			       field3 & TRB_IOC ? 'I' : 'i',
			       field3 & TRB_CHAIN ? 'C' : 'c',
			       field3 & TRB_NO_SNOOP ? 'S' : 's',
			       field3 & TRB_ISP ? 'I' : 'i',
			       field3 & TRB_ENT ? 'E' : 'e',
			       field3 & TRB_CYCLE ? 'C' : 'c',
			       !(field3 & TRB_EVENT_INVALIDATE) ? 'V' : 'v');
		break;
	case TRB_CMD_NOOP:
	case TRB_ENABLE_SLOT:
		ret = snprintf(str, size, "%s: flags %c",
			       cdnsp_trb_type_string(type),
			       field3 & TRB_CYCLE ? 'C' : 'c');
		break;
	case TRB_DISABLE_SLOT:
		ret = snprintf(str, size, "%s: slot %ld flags %c",
			       cdnsp_trb_type_string(type),
			       TRB_TO_SLOT_ID(field3),
			       field3 & TRB_CYCLE ? 'C' : 'c');
		break;
	case TRB_ADDR_DEV:
		ret = snprintf(str, size,
			       "%s: ctx %08x%08x slot %ld flags %c:%c",
			       cdnsp_trb_type_string(type), field1, field0,
			       TRB_TO_SLOT_ID(field3),
			       field3 & TRB_BSR ? 'B' : 'b',
			       field3 & TRB_CYCLE ? 'C' : 'c');
		break;
	case TRB_CONFIG_EP:
		ret = snprintf(str, size,
			       "%s: ctx %08x%08x slot %ld flags %c:%c",
			       cdnsp_trb_type_string(type), field1, field0,
			       TRB_TO_SLOT_ID(field3),
			       field3 & TRB_DC ? 'D' : 'd',
			       field3 & TRB_CYCLE ? 'C' : 'c');
		break;
	case TRB_EVAL_CONTEXT:
		ret = snprintf(str, size,
			       "%s: ctx %08x%08x slot %ld flags %c",
			       cdnsp_trb_type_string(type), field1, field0,
			       TRB_TO_SLOT_ID(field3),
			       field3 & TRB_CYCLE ? 'C' : 'c');
		break;
	case TRB_RESET_EP:
	case TRB_HALT_ENDPOINT:
		ret = snprintf(str, size,
			       "%s: ep%d%s(%d) ctx %08x%08x slot %ld flags %c",
			       cdnsp_trb_type_string(type),
			       ep_num, ep_id % 2 ? "out" : "in",
			       TRB_TO_EP_INDEX(field3), field1, field0,
			       TRB_TO_SLOT_ID(field3),
			       field3 & TRB_CYCLE ? 'C' : 'c');
		break;
	case TRB_STOP_RING:
		ret = snprintf(str, size,
			       "%s: ep%d%s(%d) slot %ld sp %d flags %c",
			       cdnsp_trb_type_string(type),
			       ep_num, ep_id % 2 ? "out" : "in",
			       TRB_TO_EP_INDEX(field3),
			       TRB_TO_SLOT_ID(field3),
			       TRB_TO_SUSPEND_PORT(field3),
			       field3 & TRB_CYCLE ? 'C' : 'c');
		break;
	case TRB_SET_DEQ:
		ret = snprintf(str, size,
			       "%s: ep%d%s(%d) deq %08x%08x stream %ld slot %ld  flags %c",
			       cdnsp_trb_type_string(type),
			       ep_num, ep_id % 2 ? "out" : "in",
			       TRB_TO_EP_INDEX(field3), field1, field0,
			       TRB_TO_STREAM_ID(field2),
			       TRB_TO_SLOT_ID(field3),
			       field3 & TRB_CYCLE ? 'C' : 'c');
		break;
	case TRB_RESET_DEV:
		ret = snprintf(str, size, "%s: slot %ld flags %c",
			       cdnsp_trb_type_string(type),
			       TRB_TO_SLOT_ID(field3),
			       field3 & TRB_CYCLE ? 'C' : 'c');
		break;
	case TRB_ENDPOINT_NRDY:
		temp = TRB_TO_HOST_STREAM(field2);

		ret = snprintf(str, size,
			       "%s: ep%d%s(%d) H_SID %x%s%s D_SID %lx flags %c:%c",
			       cdnsp_trb_type_string(type),
			       ep_num, ep_id % 2 ? "out" : "in",
			       TRB_TO_EP_INDEX(field3), temp,
			       temp == STREAM_PRIME_ACK ? "(PRIME)" : "",
			       temp == STREAM_REJECTED ? "(REJECTED)" : "",
			       TRB_TO_DEV_STREAM(field0),
			       field3 & TRB_STAT ? 'S' : 's',
			       field3 & TRB_CYCLE ? 'C' : 'c');
		break;
	default:
		ret = snprintf(str, size,
			       "type '%s' -> raw %08x %08x %08x %08x",
			       cdnsp_trb_type_string(type),
			       field0, field1, field2, field3);
	}

	if (ret >= size)
		pr_info("CDNSP: buffer overflowed.\n");

	return str;
}

static inline const char *cdnsp_decode_slot_context(u32 info, u32 info2,
						    u32 int_target, u32 state)
{
	static char str[1024];
	int ret = 0;
	u32 speed;
	char *s;

	speed = info & DEV_SPEED;

	switch (speed) {
	case SLOT_SPEED_FS:
		s = "full-speed";
		break;
	case SLOT_SPEED_HS:
		s = "high-speed";
		break;
	case SLOT_SPEED_SS:
		s = "super-speed";
		break;
	case SLOT_SPEED_SSP:
		s = "super-speed plus";
		break;
	default:
		s = "UNKNOWN speed";
	}

	ret = sprintf(str, "%s Ctx Entries %d",
		      s, (info & LAST_CTX_MASK) >> 27);

	ret += sprintf(str + ret, " [Intr %ld] Addr %ld State %s",
		       GET_INTR_TARGET(int_target), state & DEV_ADDR_MASK,
		       cdnsp_slot_state_string(GET_SLOT_STATE(state)));

	return str;
}

static inline const char *cdnsp_portsc_link_state_string(u32 portsc)
{
	switch (portsc & PORT_PLS_MASK) {
	case XDEV_U0:
		return "U0";
	case XDEV_U1:
		return "U1";
	case XDEV_U2:
		return "U2";
	case XDEV_U3:
		return "U3";
	case XDEV_DISABLED:
		return "Disabled";
	case XDEV_RXDETECT:
		return "RxDetect";
	case XDEV_INACTIVE:
		return "Inactive";
	case XDEV_POLLING:
		return "Polling";
	case XDEV_RECOVERY:
		return "Recovery";
	case XDEV_HOT_RESET:
		return "Hot Reset";
	case XDEV_COMP_MODE:
		return "Compliance mode";
	case XDEV_TEST_MODE:
		return "Test mode";
	case XDEV_RESUME:
		return "Resume";
	default:
		break;
	}

	return "Unknown";
}

static inline const char *cdnsp_decode_portsc(char *str, size_t size,
					      u32 portsc)
{
	int ret;

	ret = snprintf(str, size, "%s %s %s Link:%s PortSpeed:%d ",
		       portsc & PORT_POWER ? "Powered" : "Powered-off",
		       portsc & PORT_CONNECT ? "Connected" : "Not-connected",
		       portsc & PORT_PED ? "Enabled" : "Disabled",
		       cdnsp_portsc_link_state_string(portsc),
		       DEV_PORT_SPEED(portsc));

	if (portsc & PORT_RESET)
		ret += snprintf(str + ret, size - ret, "In-Reset ");

	ret += snprintf(str + ret, size - ret, "Change: ");
	if (portsc & PORT_CSC)
		ret += snprintf(str + ret, size - ret, "CSC ");
	if (portsc & PORT_WRC)
		ret += snprintf(str + ret, size - ret, "WRC ");
	if (portsc & PORT_RC)
		ret += snprintf(str + ret, size - ret, "PRC ");
	if (portsc & PORT_PLC)
		ret += snprintf(str + ret, size - ret, "PLC ");
	if (portsc & PORT_CEC)
		ret += snprintf(str + ret, size - ret, "CEC ");
	ret += snprintf(str + ret, size - ret, "Wake: ");
	if (portsc & PORT_WKCONN_E)
		ret += snprintf(str + ret, size - ret, "WCE ");
	if (portsc & PORT_WKDISC_E)
		ret += snprintf(str + ret, size - ret, "WDE ");

	return str;
}

static inline const char *cdnsp_ep_state_string(u8 state)
{
	switch (state) {
	case EP_STATE_DISABLED:
		return "disabled";
	case EP_STATE_RUNNING:
		return "running";
	case EP_STATE_HALTED:
		return "halted";
	case EP_STATE_STOPPED:
		return "stopped";
	case EP_STATE_ERROR:
		return "error";
	default:
		return "INVALID";
	}
}

static inline const char *cdnsp_ep_type_string(u8 type)
{
	switch (type) {
	case ISOC_OUT_EP:
		return "Isoc OUT";
	case BULK_OUT_EP:
		return "Bulk OUT";
	case INT_OUT_EP:
		return "Int OUT";
	case CTRL_EP:
		return "Ctrl";
	case ISOC_IN_EP:
		return "Isoc IN";
	case BULK_IN_EP:
		return "Bulk IN";
	case INT_IN_EP:
		return "Int IN";
	default:
		return "INVALID";
	}
}

static inline const char *cdnsp_decode_ep_context(char *str, size_t size,
						  u32 info, u32 info2,
						  u64 deq, u32 tx_info)
{
	u8 max_pstr, ep_state, interval, ep_type, burst, cerr, mult;
	bool lsa, hid;
	u16 maxp, avg;
	u32 esit;
	int ret;

	esit = CTX_TO_MAX_ESIT_PAYLOAD_HI(info) << 16 |
	       CTX_TO_MAX_ESIT_PAYLOAD_LO(tx_info);

	ep_state = info & EP_STATE_MASK;
	max_pstr = CTX_TO_EP_MAXPSTREAMS(info);
	interval = CTX_TO_EP_INTERVAL(info);
	mult = CTX_TO_EP_MULT(info) + 1;
	lsa = !!(info & EP_HAS_LSA);

	cerr = (info2 & (3 << 1)) >> 1;
	ep_type = CTX_TO_EP_TYPE(info2);
	hid = !!(info2 & (1 << 7));
	burst = CTX_TO_MAX_BURST(info2);
	maxp = MAX_PACKET_DECODED(info2);

	avg = EP_AVG_TRB_LENGTH(tx_info);

	ret = snprintf(str, size, "State %s mult %d max P. Streams %d %s",
		       cdnsp_ep_state_string(ep_state), mult,
		       max_pstr, lsa ? "LSA " : "");

	ret += snprintf(str + ret, size - ret,
			"interval %d us max ESIT payload %d CErr %d ",
			(1 << interval) * 125, esit, cerr);

	ret += snprintf(str + ret, size - ret,
			"Type %s %sburst %d maxp %d deq %016llx ",
			cdnsp_ep_type_string(ep_type), hid ? "HID" : "",
			burst, maxp, deq);

	ret += snprintf(str + ret, size - ret, "avg trb len %d", avg);

	return str;
}

#endif /*__LINUX_CDNSP_DEBUG*/
