cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

stm32-timers.c (7875B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * Copyright (C) STMicroelectronics 2016
      4 * Author: Benjamin Gaignard <benjamin.gaignard@st.com>
      5 */
      6
      7#include <linux/bitfield.h>
      8#include <linux/mfd/stm32-timers.h>
      9#include <linux/module.h>
     10#include <linux/of_platform.h>
     11#include <linux/reset.h>
     12
     13#define STM32_TIMERS_MAX_REGISTERS	0x3fc
     14
     15/* DIER register DMA enable bits */
     16static const u32 stm32_timers_dier_dmaen[STM32_TIMERS_MAX_DMAS] = {
     17	TIM_DIER_CC1DE,
     18	TIM_DIER_CC2DE,
     19	TIM_DIER_CC3DE,
     20	TIM_DIER_CC4DE,
     21	TIM_DIER_UIE,
     22	TIM_DIER_TDE,
     23	TIM_DIER_COMDE
     24};
     25
     26static void stm32_timers_dma_done(void *p)
     27{
     28	struct stm32_timers_dma *dma = p;
     29	struct dma_tx_state state;
     30	enum dma_status status;
     31
     32	status = dmaengine_tx_status(dma->chan, dma->chan->cookie, &state);
     33	if (status == DMA_COMPLETE)
     34		complete(&dma->completion);
     35}
     36
     37/**
     38 * stm32_timers_dma_burst_read - Read from timers registers using DMA.
     39 *
     40 * Read from STM32 timers registers using DMA on a single event.
     41 * @dev: reference to stm32_timers MFD device
     42 * @buf: DMA'able destination buffer
     43 * @id: stm32_timers_dmas event identifier (ch[1..4], up, trig or com)
     44 * @reg: registers start offset for DMA to read from (like CCRx for capture)
     45 * @num_reg: number of registers to read upon each DMA request, starting @reg.
     46 * @bursts: number of bursts to read (e.g. like two for pwm period capture)
     47 * @tmo_ms: timeout (milliseconds)
     48 */
     49int stm32_timers_dma_burst_read(struct device *dev, u32 *buf,
     50				enum stm32_timers_dmas id, u32 reg,
     51				unsigned int num_reg, unsigned int bursts,
     52				unsigned long tmo_ms)
     53{
     54	struct stm32_timers *ddata = dev_get_drvdata(dev);
     55	unsigned long timeout = msecs_to_jiffies(tmo_ms);
     56	struct regmap *regmap = ddata->regmap;
     57	struct stm32_timers_dma *dma = &ddata->dma;
     58	size_t len = num_reg * bursts * sizeof(u32);
     59	struct dma_async_tx_descriptor *desc;
     60	struct dma_slave_config config;
     61	dma_cookie_t cookie;
     62	dma_addr_t dma_buf;
     63	u32 dbl, dba;
     64	long err;
     65	int ret;
     66
     67	/* Sanity check */
     68	if (id < STM32_TIMERS_DMA_CH1 || id >= STM32_TIMERS_MAX_DMAS)
     69		return -EINVAL;
     70
     71	if (!num_reg || !bursts || reg > STM32_TIMERS_MAX_REGISTERS ||
     72	    (reg + num_reg * sizeof(u32)) > STM32_TIMERS_MAX_REGISTERS)
     73		return -EINVAL;
     74
     75	if (!dma->chans[id])
     76		return -ENODEV;
     77	mutex_lock(&dma->lock);
     78
     79	/* Select DMA channel in use */
     80	dma->chan = dma->chans[id];
     81	dma_buf = dma_map_single(dev, buf, len, DMA_FROM_DEVICE);
     82	if (dma_mapping_error(dev, dma_buf)) {
     83		ret = -ENOMEM;
     84		goto unlock;
     85	}
     86
     87	/* Prepare DMA read from timer registers, using DMA burst mode */
     88	memset(&config, 0, sizeof(config));
     89	config.src_addr = (dma_addr_t)dma->phys_base + TIM_DMAR;
     90	config.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
     91	ret = dmaengine_slave_config(dma->chan, &config);
     92	if (ret)
     93		goto unmap;
     94
     95	desc = dmaengine_prep_slave_single(dma->chan, dma_buf, len,
     96					   DMA_DEV_TO_MEM, DMA_PREP_INTERRUPT);
     97	if (!desc) {
     98		ret = -EBUSY;
     99		goto unmap;
    100	}
    101
    102	desc->callback = stm32_timers_dma_done;
    103	desc->callback_param = dma;
    104	cookie = dmaengine_submit(desc);
    105	ret = dma_submit_error(cookie);
    106	if (ret)
    107		goto dma_term;
    108
    109	reinit_completion(&dma->completion);
    110	dma_async_issue_pending(dma->chan);
    111
    112	/* Setup and enable timer DMA burst mode */
    113	dbl = FIELD_PREP(TIM_DCR_DBL, bursts - 1);
    114	dba = FIELD_PREP(TIM_DCR_DBA, reg >> 2);
    115	ret = regmap_write(regmap, TIM_DCR, dbl | dba);
    116	if (ret)
    117		goto dma_term;
    118
    119	/* Clear pending flags before enabling DMA request */
    120	ret = regmap_write(regmap, TIM_SR, 0);
    121	if (ret)
    122		goto dcr_clr;
    123
    124	ret = regmap_update_bits(regmap, TIM_DIER, stm32_timers_dier_dmaen[id],
    125				 stm32_timers_dier_dmaen[id]);
    126	if (ret)
    127		goto dcr_clr;
    128
    129	err = wait_for_completion_interruptible_timeout(&dma->completion,
    130							timeout);
    131	if (err == 0)
    132		ret = -ETIMEDOUT;
    133	else if (err < 0)
    134		ret = err;
    135
    136	regmap_update_bits(regmap, TIM_DIER, stm32_timers_dier_dmaen[id], 0);
    137	regmap_write(regmap, TIM_SR, 0);
    138dcr_clr:
    139	regmap_write(regmap, TIM_DCR, 0);
    140dma_term:
    141	dmaengine_terminate_all(dma->chan);
    142unmap:
    143	dma_unmap_single(dev, dma_buf, len, DMA_FROM_DEVICE);
    144unlock:
    145	dma->chan = NULL;
    146	mutex_unlock(&dma->lock);
    147
    148	return ret;
    149}
    150EXPORT_SYMBOL_GPL(stm32_timers_dma_burst_read);
    151
    152static const struct regmap_config stm32_timers_regmap_cfg = {
    153	.reg_bits = 32,
    154	.val_bits = 32,
    155	.reg_stride = sizeof(u32),
    156	.max_register = STM32_TIMERS_MAX_REGISTERS,
    157};
    158
    159static void stm32_timers_get_arr_size(struct stm32_timers *ddata)
    160{
    161	u32 arr;
    162
    163	/* Backup ARR to restore it after getting the maximum value */
    164	regmap_read(ddata->regmap, TIM_ARR, &arr);
    165
    166	/*
    167	 * Only the available bits will be written so when readback
    168	 * we get the maximum value of auto reload register
    169	 */
    170	regmap_write(ddata->regmap, TIM_ARR, ~0L);
    171	regmap_read(ddata->regmap, TIM_ARR, &ddata->max_arr);
    172	regmap_write(ddata->regmap, TIM_ARR, arr);
    173}
    174
    175static int stm32_timers_dma_probe(struct device *dev,
    176				   struct stm32_timers *ddata)
    177{
    178	int i;
    179	int ret = 0;
    180	char name[4];
    181
    182	init_completion(&ddata->dma.completion);
    183	mutex_init(&ddata->dma.lock);
    184
    185	/* Optional DMA support: get valid DMA channel(s) or NULL */
    186	for (i = STM32_TIMERS_DMA_CH1; i <= STM32_TIMERS_DMA_CH4; i++) {
    187		snprintf(name, ARRAY_SIZE(name), "ch%1d", i + 1);
    188		ddata->dma.chans[i] = dma_request_chan(dev, name);
    189	}
    190	ddata->dma.chans[STM32_TIMERS_DMA_UP] = dma_request_chan(dev, "up");
    191	ddata->dma.chans[STM32_TIMERS_DMA_TRIG] = dma_request_chan(dev, "trig");
    192	ddata->dma.chans[STM32_TIMERS_DMA_COM] = dma_request_chan(dev, "com");
    193
    194	for (i = STM32_TIMERS_DMA_CH1; i < STM32_TIMERS_MAX_DMAS; i++) {
    195		if (IS_ERR(ddata->dma.chans[i])) {
    196			/* Save the first error code to return */
    197			if (PTR_ERR(ddata->dma.chans[i]) != -ENODEV && !ret)
    198				ret = PTR_ERR(ddata->dma.chans[i]);
    199
    200			ddata->dma.chans[i] = NULL;
    201		}
    202	}
    203
    204	return ret;
    205}
    206
    207static void stm32_timers_dma_remove(struct device *dev,
    208				    struct stm32_timers *ddata)
    209{
    210	int i;
    211
    212	for (i = STM32_TIMERS_DMA_CH1; i < STM32_TIMERS_MAX_DMAS; i++)
    213		if (ddata->dma.chans[i])
    214			dma_release_channel(ddata->dma.chans[i]);
    215}
    216
    217static int stm32_timers_probe(struct platform_device *pdev)
    218{
    219	struct device *dev = &pdev->dev;
    220	struct stm32_timers *ddata;
    221	struct resource *res;
    222	void __iomem *mmio;
    223	int ret;
    224
    225	ddata = devm_kzalloc(dev, sizeof(*ddata), GFP_KERNEL);
    226	if (!ddata)
    227		return -ENOMEM;
    228
    229	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
    230	mmio = devm_ioremap_resource(dev, res);
    231	if (IS_ERR(mmio))
    232		return PTR_ERR(mmio);
    233
    234	/* Timer physical addr for DMA */
    235	ddata->dma.phys_base = res->start;
    236
    237	ddata->regmap = devm_regmap_init_mmio_clk(dev, "int", mmio,
    238						  &stm32_timers_regmap_cfg);
    239	if (IS_ERR(ddata->regmap))
    240		return PTR_ERR(ddata->regmap);
    241
    242	ddata->clk = devm_clk_get(dev, NULL);
    243	if (IS_ERR(ddata->clk))
    244		return PTR_ERR(ddata->clk);
    245
    246	stm32_timers_get_arr_size(ddata);
    247
    248	ret = stm32_timers_dma_probe(dev, ddata);
    249	if (ret) {
    250		stm32_timers_dma_remove(dev, ddata);
    251		return ret;
    252	}
    253
    254	platform_set_drvdata(pdev, ddata);
    255
    256	ret = of_platform_populate(pdev->dev.of_node, NULL, NULL, &pdev->dev);
    257	if (ret)
    258		stm32_timers_dma_remove(dev, ddata);
    259
    260	return ret;
    261}
    262
    263static int stm32_timers_remove(struct platform_device *pdev)
    264{
    265	struct stm32_timers *ddata = platform_get_drvdata(pdev);
    266
    267	/*
    268	 * Don't use devm_ here: enfore of_platform_depopulate() happens before
    269	 * DMA are released, to avoid race on DMA.
    270	 */
    271	of_platform_depopulate(&pdev->dev);
    272	stm32_timers_dma_remove(&pdev->dev, ddata);
    273
    274	return 0;
    275}
    276
    277static const struct of_device_id stm32_timers_of_match[] = {
    278	{ .compatible = "st,stm32-timers", },
    279	{ /* end node */ },
    280};
    281MODULE_DEVICE_TABLE(of, stm32_timers_of_match);
    282
    283static struct platform_driver stm32_timers_driver = {
    284	.probe = stm32_timers_probe,
    285	.remove = stm32_timers_remove,
    286	.driver	= {
    287		.name = "stm32-timers",
    288		.of_match_table = stm32_timers_of_match,
    289	},
    290};
    291module_platform_driver(stm32_timers_driver);
    292
    293MODULE_DESCRIPTION("STMicroelectronics STM32 Timers");
    294MODULE_LICENSE("GPL v2");