diff options
Diffstat (limited to 'drivers/cdx')
-rw-r--r-- | drivers/cdx/cdx.c | 18 | ||||
-rw-r--r-- | drivers/cdx/controller/Kconfig | 10 | ||||
-rw-r--r-- | drivers/cdx/controller/mcdi.c | 86 | ||||
-rw-r--r-- | drivers/cdx/controller/mcdi.h | 6 |
4 files changed, 27 insertions, 93 deletions
diff --git a/drivers/cdx/cdx.c b/drivers/cdx/cdx.c index 38511fd36325..d2cad4c670a0 100644 --- a/drivers/cdx/cdx.c +++ b/drivers/cdx/cdx.c @@ -62,6 +62,8 @@ #include <linux/mm.h> #include <linux/xarray.h> #include <linux/cdx/cdx_bus.h> +#include <linux/iommu.h> +#include <linux/dma-map-ops.h> #include "cdx.h" /* Default DMA mask for devices on a CDX bus */ @@ -257,6 +259,7 @@ static void cdx_shutdown(struct device *dev) static int cdx_dma_configure(struct device *dev) { + struct cdx_driver *cdx_drv = to_cdx_driver(dev->driver); struct cdx_device *cdx_dev = to_cdx_device(dev); u32 input_id = cdx_dev->req_id; int ret; @@ -267,9 +270,23 @@ static int cdx_dma_configure(struct device *dev) return ret; } + if (!ret && !cdx_drv->driver_managed_dma) { + ret = iommu_device_use_default_domain(dev); + if (ret) + arch_teardown_dma_ops(dev); + } + return 0; } +static void cdx_dma_cleanup(struct device *dev) +{ + struct cdx_driver *cdx_drv = to_cdx_driver(dev->driver); + + if (!cdx_drv->driver_managed_dma) + iommu_device_unuse_default_domain(dev); +} + /* show configuration fields */ #define cdx_config_attr(field, format_string) \ static ssize_t \ @@ -405,6 +422,7 @@ struct bus_type cdx_bus_type = { .remove = cdx_remove, .shutdown = cdx_shutdown, .dma_configure = cdx_dma_configure, + .dma_cleanup = cdx_dma_cleanup, .bus_groups = cdx_bus_groups, .dev_groups = cdx_dev_groups, }; diff --git a/drivers/cdx/controller/Kconfig b/drivers/cdx/controller/Kconfig index c3e3b9ff8dfe..61bf17fbe433 100644 --- a/drivers/cdx/controller/Kconfig +++ b/drivers/cdx/controller/Kconfig @@ -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 diff --git a/drivers/cdx/controller/mcdi.c b/drivers/cdx/controller/mcdi.c index a211a2ca762e..1eedc5eeb315 100644 --- a/drivers/cdx/controller/mcdi.c +++ b/drivers/cdx/controller/mcdi.c @@ -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 */ diff --git a/drivers/cdx/controller/mcdi.h b/drivers/cdx/controller/mcdi.h index 0bfbeab04e43..54a65e9760ae 100644 --- a/drivers/cdx/controller/mcdi.h +++ b/drivers/cdx/controller/mcdi.h @@ -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 }; /** |