Commit b1c8ea3c authored by Abhijit Gangurde's avatar Abhijit Gangurde Committed by Greg Kroah-Hartman
Browse files

cdx: Replace custom mcdi logging with print_hex_dump_debug()



Replace custom mcdi logging for send and receive requests
with dynamic debug method print_hex_dump_debug().

Signed-off-by: default avatarAbhijit Gangurde <abhijit.gangurde@amd.com>
Message-ID: <20230613084318.27996-1-abhijit.gangurde@amd.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent b8c5ff76
Loading
Loading
Loading
Loading
+0 −10
Original line number Diff line number Diff line
@@ -18,14 +18,4 @@ config CDX_CONTROLLER

	  If unsure, say N.

config MCDI_LOGGING
	bool "MCDI Logging for the CDX controller"
	depends on CDX_CONTROLLER
	help
	  Enable MCDI Logging for
	  the CDX Controller for debug
	  purpose.

	  If unsure, say N.

endif
+9 −77
Original line number Diff line number Diff line
@@ -31,10 +31,6 @@ struct cdx_mcdi_copy_buffer {
	struct cdx_dword buffer[DIV_ROUND_UP(MCDI_CTL_SDU_LEN_MAX, 4)];
};

#ifdef CONFIG_MCDI_LOGGING
#define LOG_LINE_MAX		(1024 - 32)
#endif

static void cdx_mcdi_cancel_cmd(struct cdx_mcdi *cdx, struct cdx_mcdi_cmd *cmd);
static void cdx_mcdi_wait_for_cleanup(struct cdx_mcdi *cdx);
static int cdx_mcdi_rpc_async_internal(struct cdx_mcdi *cdx,
@@ -119,14 +115,9 @@ int cdx_mcdi_init(struct cdx_mcdi *cdx)
	mcdi = cdx_mcdi_if(cdx);
	mcdi->cdx = cdx;

#ifdef CONFIG_MCDI_LOGGING
	mcdi->logging_buffer = kmalloc(LOG_LINE_MAX, GFP_KERNEL);
	if (!mcdi->logging_buffer)
		goto fail2;
#endif
	mcdi->workqueue = alloc_ordered_workqueue("mcdi_wq", 0);
	if (!mcdi->workqueue)
		goto fail3;
		goto fail2;
	mutex_init(&mcdi->iface_lock);
	mcdi->mode = MCDI_MODE_EVENTS;
	INIT_LIST_HEAD(&mcdi->cmd_list);
@@ -135,11 +126,7 @@ int cdx_mcdi_init(struct cdx_mcdi *cdx)
	mcdi->new_epoch = true;

	return 0;
fail3:
#ifdef CONFIG_MCDI_LOGGING
	kfree(mcdi->logging_buffer);
fail2:
#endif
	kfree(cdx->mcdi);
	cdx->mcdi = NULL;
fail:
@@ -156,10 +143,6 @@ void cdx_mcdi_finish(struct cdx_mcdi *cdx)

	cdx_mcdi_wait_for_cleanup(cdx);

#ifdef CONFIG_MCDI_LOGGING
	kfree(mcdi->logging_buffer);
#endif

	destroy_workqueue(mcdi->workqueue);
	kfree(cdx->mcdi);
	cdx->mcdi = NULL;
@@ -246,15 +229,9 @@ static void cdx_mcdi_send_request(struct cdx_mcdi *cdx,
	size_t hdr_len;
	bool not_epoch;
	u32 xflags;
#ifdef CONFIG_MCDI_LOGGING
	char *buf;
#endif

	if (!mcdi)
		return;
#ifdef CONFIG_MCDI_LOGGING
	buf = mcdi->logging_buffer; /* page-sized */
#endif

	mcdi->prev_seq = cmd->seq;
	mcdi->seq_held_by[cmd->seq] = cmd;
@@ -281,39 +258,12 @@ static void cdx_mcdi_send_request(struct cdx_mcdi *cdx,
			     MC_CMD_V2_EXTN_IN_MCDI_MESSAGE_TYPE_PLATFORM);
	hdr_len = 8;

#ifdef CONFIG_MCDI_LOGGING
	if (!WARN_ON_ONCE(!buf)) {
		const struct cdx_dword *frags[] = { hdr, inbuf };
		const size_t frag_len[] = { hdr_len, round_up(inlen, 4) };
		int bytes = 0;
		int i, j;

		for (j = 0; j < ARRAY_SIZE(frags); j++) {
			const struct cdx_dword *frag;

			frag = frags[j];
			for (i = 0;
			     i < frag_len[j] / 4;
			     i++) {
				/*
				 * Do not exceed the internal printk limit.
				 * The string before that is just over 70 bytes.
				 */
				if ((bytes + 75) > LOG_LINE_MAX) {
					pr_info("MCDI RPC REQ:%s \\\n", buf);
					bytes = 0;
				}
				bytes += snprintf(buf + bytes,
						  LOG_LINE_MAX - bytes, " %08x",
						  le32_to_cpu(frag[i].cdx_u32));
			}
		}

		pr_info("MCDI RPC REQ:%s\n", buf);
	}
#endif
	hdr[0].cdx_u32 |= (__force __le32)(cdx_mcdi_payload_csum(hdr, hdr_len, inbuf, inlen) <<
			 MCDI_HEADER_XFLAGS_LBN);

	print_hex_dump_debug("MCDI REQ HEADER: ", DUMP_PREFIX_NONE, 32, 4, hdr, hdr_len, false);
	print_hex_dump_debug("MCDI REQ PAYLOAD: ", DUMP_PREFIX_NONE, 32, 4, inbuf, inlen, false);

	cdx->mcdi_ops->mcdi_request(cdx, hdr, hdr_len, inbuf, inlen);

	mcdi->new_epoch = false;
@@ -700,28 +650,10 @@ static bool cdx_mcdi_complete_cmd(struct cdx_mcdi_iface *mcdi,
		resp_data_len = 0;
	}

#ifdef CONFIG_MCDI_LOGGING
	if (!WARN_ON_ONCE(!mcdi->logging_buffer)) {
		char *log = mcdi->logging_buffer;
		int i, bytes = 0;
		size_t rlen;

		WARN_ON_ONCE(resp_hdr_len % 4);

		rlen = resp_hdr_len / 4 + DIV_ROUND_UP(resp_data_len, 4);

		for (i = 0; i < rlen; i++) {
			if ((bytes + 75) > LOG_LINE_MAX) {
				pr_info("MCDI RPC RESP:%s \\\n", log);
				bytes = 0;
			}
			bytes += snprintf(log + bytes, LOG_LINE_MAX - bytes,
					  " %08x", le32_to_cpu(outbuf[i].cdx_u32));
		}

		pr_info("MCDI RPC RESP:%s\n", log);
	}
#endif
	print_hex_dump_debug("MCDI RESP HEADER: ", DUMP_PREFIX_NONE, 32, 4,
			     outbuf, resp_hdr_len, false);
	print_hex_dump_debug("MCDI RESP PAYLOAD: ", DUMP_PREFIX_NONE, 32, 4,
			     outbuf + (resp_hdr_len / 4), resp_data_len, false);

	if (error && resp_data_len == 0) {
		/* MC rebooted during command */
+0 −6
Original line number Diff line number Diff line
@@ -153,8 +153,6 @@ struct cdx_mcdi_cmd {
 * @mode: Poll for mcdi completion, or wait for an mcdi_event
 * @prev_seq: The last used sequence number
 * @new_epoch: Indicates start of day or start of MC reboot recovery
 * @logging_buffer: Buffer that may be used to build MCDI tracing messages
 * @logging_enabled: Whether to trace MCDI
 */
struct cdx_mcdi_iface {
	struct cdx_mcdi *cdx;
@@ -170,10 +168,6 @@ struct cdx_mcdi_iface {
	enum cdx_mcdi_mode mode;
	u8 prev_seq;
	bool new_epoch;
#ifdef CONFIG_MCDI_LOGGING
	bool logging_enabled;
	char *logging_buffer;
#endif
};

/**