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

spi-mpc512x-psc.c (16000B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * MPC512x PSC in SPI mode driver.
      4 *
      5 * Copyright (C) 2007,2008 Freescale Semiconductor Inc.
      6 * Original port from 52xx driver:
      7 *	Hongjun Chen <hong-jun.chen@freescale.com>
      8 *
      9 * Fork of mpc52xx_psc_spi.c:
     10 *	Copyright (C) 2006 TOPTICA Photonics AG., Dragos Carp
     11 */
     12
     13#include <linux/module.h>
     14#include <linux/kernel.h>
     15#include <linux/errno.h>
     16#include <linux/interrupt.h>
     17#include <linux/of_address.h>
     18#include <linux/of_irq.h>
     19#include <linux/of_platform.h>
     20#include <linux/completion.h>
     21#include <linux/io.h>
     22#include <linux/delay.h>
     23#include <linux/clk.h>
     24#include <linux/spi/spi.h>
     25#include <linux/fsl_devices.h>
     26#include <asm/mpc52xx_psc.h>
     27
     28enum {
     29	TYPE_MPC5121,
     30	TYPE_MPC5125,
     31};
     32
     33/*
     34 * This macro abstracts the differences in the PSC register layout between
     35 * MPC5121 (which uses a struct mpc52xx_psc) and MPC5125 (using mpc5125_psc).
     36 */
     37#define psc_addr(mps, regname) ({					\
     38	void *__ret = NULL;						\
     39	switch (mps->type) {						\
     40	case TYPE_MPC5121: {						\
     41			struct mpc52xx_psc __iomem *psc = mps->psc;	\
     42			__ret = &psc->regname;				\
     43		};							\
     44		break;							\
     45	case TYPE_MPC5125: {						\
     46			struct mpc5125_psc __iomem *psc = mps->psc;	\
     47			__ret = &psc->regname;				\
     48		};							\
     49		break;							\
     50	}								\
     51	__ret; })
     52
     53struct mpc512x_psc_spi {
     54	void (*cs_control)(struct spi_device *spi, bool on);
     55
     56	/* driver internal data */
     57	int type;
     58	void __iomem *psc;
     59	struct mpc512x_psc_fifo __iomem *fifo;
     60	unsigned int irq;
     61	u8 bits_per_word;
     62	struct clk *clk_mclk;
     63	struct clk *clk_ipg;
     64	u32 mclk_rate;
     65
     66	struct completion txisrdone;
     67};
     68
     69/* controller state */
     70struct mpc512x_psc_spi_cs {
     71	int bits_per_word;
     72	int speed_hz;
     73};
     74
     75/* set clock freq, clock ramp, bits per work
     76 * if t is NULL then reset the values to the default values
     77 */
     78static int mpc512x_psc_spi_transfer_setup(struct spi_device *spi,
     79					  struct spi_transfer *t)
     80{
     81	struct mpc512x_psc_spi_cs *cs = spi->controller_state;
     82
     83	cs->speed_hz = (t && t->speed_hz)
     84	    ? t->speed_hz : spi->max_speed_hz;
     85	cs->bits_per_word = (t && t->bits_per_word)
     86	    ? t->bits_per_word : spi->bits_per_word;
     87	cs->bits_per_word = ((cs->bits_per_word + 7) / 8) * 8;
     88	return 0;
     89}
     90
     91static void mpc512x_psc_spi_activate_cs(struct spi_device *spi)
     92{
     93	struct mpc512x_psc_spi_cs *cs = spi->controller_state;
     94	struct mpc512x_psc_spi *mps = spi_master_get_devdata(spi->master);
     95	u32 sicr;
     96	u32 ccr;
     97	int speed;
     98	u16 bclkdiv;
     99
    100	sicr = in_be32(psc_addr(mps, sicr));
    101
    102	/* Set clock phase and polarity */
    103	if (spi->mode & SPI_CPHA)
    104		sicr |= 0x00001000;
    105	else
    106		sicr &= ~0x00001000;
    107
    108	if (spi->mode & SPI_CPOL)
    109		sicr |= 0x00002000;
    110	else
    111		sicr &= ~0x00002000;
    112
    113	if (spi->mode & SPI_LSB_FIRST)
    114		sicr |= 0x10000000;
    115	else
    116		sicr &= ~0x10000000;
    117	out_be32(psc_addr(mps, sicr), sicr);
    118
    119	ccr = in_be32(psc_addr(mps, ccr));
    120	ccr &= 0xFF000000;
    121	speed = cs->speed_hz;
    122	if (!speed)
    123		speed = 1000000;	/* default 1MHz */
    124	bclkdiv = (mps->mclk_rate / speed) - 1;
    125
    126	ccr |= (((bclkdiv & 0xff) << 16) | (((bclkdiv >> 8) & 0xff) << 8));
    127	out_be32(psc_addr(mps, ccr), ccr);
    128	mps->bits_per_word = cs->bits_per_word;
    129
    130	if (spi->cs_gpiod) {
    131		if (mps->cs_control)
    132			/* boardfile override */
    133			mps->cs_control(spi, (spi->mode & SPI_CS_HIGH) ? 1 : 0);
    134		else
    135			/* gpiolib will deal with the inversion */
    136			gpiod_set_value(spi->cs_gpiod, 1);
    137	}
    138}
    139
    140static void mpc512x_psc_spi_deactivate_cs(struct spi_device *spi)
    141{
    142	struct mpc512x_psc_spi *mps = spi_master_get_devdata(spi->master);
    143
    144	if (spi->cs_gpiod) {
    145		if (mps->cs_control)
    146			/* boardfile override */
    147			mps->cs_control(spi, (spi->mode & SPI_CS_HIGH) ? 0 : 1);
    148		else
    149			/* gpiolib will deal with the inversion */
    150			gpiod_set_value(spi->cs_gpiod, 0);
    151	}
    152}
    153
    154/* extract and scale size field in txsz or rxsz */
    155#define MPC512x_PSC_FIFO_SZ(sz) ((sz & 0x7ff) << 2);
    156
    157#define EOFBYTE 1
    158
    159static int mpc512x_psc_spi_transfer_rxtx(struct spi_device *spi,
    160					 struct spi_transfer *t)
    161{
    162	struct mpc512x_psc_spi *mps = spi_master_get_devdata(spi->master);
    163	struct mpc512x_psc_fifo __iomem *fifo = mps->fifo;
    164	size_t tx_len = t->len;
    165	size_t rx_len = t->len;
    166	u8 *tx_buf = (u8 *)t->tx_buf;
    167	u8 *rx_buf = (u8 *)t->rx_buf;
    168
    169	if (!tx_buf && !rx_buf && t->len)
    170		return -EINVAL;
    171
    172	while (rx_len || tx_len) {
    173		size_t txcount;
    174		u8 data;
    175		size_t fifosz;
    176		size_t rxcount;
    177		int rxtries;
    178
    179		/*
    180		 * send the TX bytes in as large a chunk as possible
    181		 * but neither exceed the TX nor the RX FIFOs
    182		 */
    183		fifosz = MPC512x_PSC_FIFO_SZ(in_be32(&fifo->txsz));
    184		txcount = min(fifosz, tx_len);
    185		fifosz = MPC512x_PSC_FIFO_SZ(in_be32(&fifo->rxsz));
    186		fifosz -= in_be32(&fifo->rxcnt) + 1;
    187		txcount = min(fifosz, txcount);
    188		if (txcount) {
    189
    190			/* fill the TX FIFO */
    191			while (txcount-- > 0) {
    192				data = tx_buf ? *tx_buf++ : 0;
    193				if (tx_len == EOFBYTE && t->cs_change)
    194					setbits32(&fifo->txcmd,
    195						  MPC512x_PSC_FIFO_EOF);
    196				out_8(&fifo->txdata_8, data);
    197				tx_len--;
    198			}
    199
    200			/* have the ISR trigger when the TX FIFO is empty */
    201			reinit_completion(&mps->txisrdone);
    202			out_be32(&fifo->txisr, MPC512x_PSC_FIFO_EMPTY);
    203			out_be32(&fifo->tximr, MPC512x_PSC_FIFO_EMPTY);
    204			wait_for_completion(&mps->txisrdone);
    205		}
    206
    207		/*
    208		 * consume as much RX data as the FIFO holds, while we
    209		 * iterate over the transfer's TX data length
    210		 *
    211		 * only insist in draining all the remaining RX bytes
    212		 * when the TX bytes were exhausted (that's at the very
    213		 * end of this transfer, not when still iterating over
    214		 * the transfer's chunks)
    215		 */
    216		rxtries = 50;
    217		do {
    218
    219			/*
    220			 * grab whatever was in the FIFO when we started
    221			 * looking, don't bother fetching what was added to
    222			 * the FIFO while we read from it -- we'll return
    223			 * here eventually and prefer sending out remaining
    224			 * TX data
    225			 */
    226			fifosz = in_be32(&fifo->rxcnt);
    227			rxcount = min(fifosz, rx_len);
    228			while (rxcount-- > 0) {
    229				data = in_8(&fifo->rxdata_8);
    230				if (rx_buf)
    231					*rx_buf++ = data;
    232				rx_len--;
    233			}
    234
    235			/*
    236			 * come back later if there still is TX data to send,
    237			 * bail out of the RX drain loop if all of the TX data
    238			 * was sent and all of the RX data was received (i.e.
    239			 * when the transmission has completed)
    240			 */
    241			if (tx_len)
    242				break;
    243			if (!rx_len)
    244				break;
    245
    246			/*
    247			 * TX data transmission has completed while RX data
    248			 * is still pending -- that's a transient situation
    249			 * which depends on wire speed and specific
    250			 * hardware implementation details (buffering) yet
    251			 * should resolve very quickly
    252			 *
    253			 * just yield for a moment to not hog the CPU for
    254			 * too long when running SPI at low speed
    255			 *
    256			 * the timeout range is rather arbitrary and tries
    257			 * to balance throughput against system load; the
    258			 * chosen values result in a minimal timeout of 50
    259			 * times 10us and thus work at speeds as low as
    260			 * some 20kbps, while the maximum timeout at the
    261			 * transfer's end could be 5ms _if_ nothing else
    262			 * ticks in the system _and_ RX data still wasn't
    263			 * received, which only occurs in situations that
    264			 * are exceptional; removing the unpredictability
    265			 * of the timeout either decreases throughput
    266			 * (longer timeouts), or puts more load on the
    267			 * system (fixed short timeouts) or requires the
    268			 * use of a timeout API instead of a counter and an
    269			 * unknown inner delay
    270			 */
    271			usleep_range(10, 100);
    272
    273		} while (--rxtries > 0);
    274		if (!tx_len && rx_len && !rxtries) {
    275			/*
    276			 * not enough RX bytes even after several retries
    277			 * and the resulting rather long timeout?
    278			 */
    279			rxcount = in_be32(&fifo->rxcnt);
    280			dev_warn(&spi->dev,
    281				 "short xfer, missing %zd RX bytes, FIFO level %zd\n",
    282				 rx_len, rxcount);
    283		}
    284
    285		/*
    286		 * drain and drop RX data which "should not be there" in
    287		 * the first place, for undisturbed transmission this turns
    288		 * into a NOP (except for the FIFO level fetch)
    289		 */
    290		if (!tx_len && !rx_len) {
    291			while (in_be32(&fifo->rxcnt))
    292				in_8(&fifo->rxdata_8);
    293		}
    294
    295	}
    296	return 0;
    297}
    298
    299static int mpc512x_psc_spi_msg_xfer(struct spi_master *master,
    300				    struct spi_message *m)
    301{
    302	struct spi_device *spi;
    303	unsigned cs_change;
    304	int status;
    305	struct spi_transfer *t;
    306
    307	spi = m->spi;
    308	cs_change = 1;
    309	status = 0;
    310	list_for_each_entry(t, &m->transfers, transfer_list) {
    311		status = mpc512x_psc_spi_transfer_setup(spi, t);
    312		if (status < 0)
    313			break;
    314
    315		if (cs_change)
    316			mpc512x_psc_spi_activate_cs(spi);
    317		cs_change = t->cs_change;
    318
    319		status = mpc512x_psc_spi_transfer_rxtx(spi, t);
    320		if (status)
    321			break;
    322		m->actual_length += t->len;
    323
    324		spi_transfer_delay_exec(t);
    325
    326		if (cs_change)
    327			mpc512x_psc_spi_deactivate_cs(spi);
    328	}
    329
    330	m->status = status;
    331	if (m->complete)
    332		m->complete(m->context);
    333
    334	if (status || !cs_change)
    335		mpc512x_psc_spi_deactivate_cs(spi);
    336
    337	mpc512x_psc_spi_transfer_setup(spi, NULL);
    338
    339	spi_finalize_current_message(master);
    340	return status;
    341}
    342
    343static int mpc512x_psc_spi_prep_xfer_hw(struct spi_master *master)
    344{
    345	struct mpc512x_psc_spi *mps = spi_master_get_devdata(master);
    346
    347	dev_dbg(&master->dev, "%s()\n", __func__);
    348
    349	/* Zero MR2 */
    350	in_8(psc_addr(mps, mr2));
    351	out_8(psc_addr(mps, mr2), 0x0);
    352
    353	/* enable transmitter/receiver */
    354	out_8(psc_addr(mps, command), MPC52xx_PSC_TX_ENABLE | MPC52xx_PSC_RX_ENABLE);
    355
    356	return 0;
    357}
    358
    359static int mpc512x_psc_spi_unprep_xfer_hw(struct spi_master *master)
    360{
    361	struct mpc512x_psc_spi *mps = spi_master_get_devdata(master);
    362	struct mpc512x_psc_fifo __iomem *fifo = mps->fifo;
    363
    364	dev_dbg(&master->dev, "%s()\n", __func__);
    365
    366	/* disable transmitter/receiver and fifo interrupt */
    367	out_8(psc_addr(mps, command), MPC52xx_PSC_TX_DISABLE | MPC52xx_PSC_RX_DISABLE);
    368	out_be32(&fifo->tximr, 0);
    369
    370	return 0;
    371}
    372
    373static int mpc512x_psc_spi_setup(struct spi_device *spi)
    374{
    375	struct mpc512x_psc_spi_cs *cs = spi->controller_state;
    376
    377	if (spi->bits_per_word % 8)
    378		return -EINVAL;
    379
    380	if (!cs) {
    381		cs = kzalloc(sizeof(*cs), GFP_KERNEL);
    382		if (!cs)
    383			return -ENOMEM;
    384
    385		spi->controller_state = cs;
    386	}
    387
    388	cs->bits_per_word = spi->bits_per_word;
    389	cs->speed_hz = spi->max_speed_hz;
    390
    391	return 0;
    392}
    393
    394static void mpc512x_psc_spi_cleanup(struct spi_device *spi)
    395{
    396	kfree(spi->controller_state);
    397}
    398
    399static int mpc512x_psc_spi_port_config(struct spi_master *master,
    400				       struct mpc512x_psc_spi *mps)
    401{
    402	struct mpc512x_psc_fifo __iomem *fifo = mps->fifo;
    403	u32 sicr;
    404	u32 ccr;
    405	int speed;
    406	u16 bclkdiv;
    407
    408	/* Reset the PSC into a known state */
    409	out_8(psc_addr(mps, command), MPC52xx_PSC_RST_RX);
    410	out_8(psc_addr(mps, command), MPC52xx_PSC_RST_TX);
    411	out_8(psc_addr(mps, command), MPC52xx_PSC_TX_DISABLE | MPC52xx_PSC_RX_DISABLE);
    412
    413	/* Disable psc interrupts all useful interrupts are in fifo */
    414	out_be16(psc_addr(mps, isr_imr.imr), 0);
    415
    416	/* Disable fifo interrupts, will be enabled later */
    417	out_be32(&fifo->tximr, 0);
    418	out_be32(&fifo->rximr, 0);
    419
    420	/* Setup fifo slice address and size */
    421	/*out_be32(&fifo->txsz, 0x0fe00004);*/
    422	/*out_be32(&fifo->rxsz, 0x0ff00004);*/
    423
    424	sicr =	0x01000000 |	/* SIM = 0001 -- 8 bit */
    425		0x00800000 |	/* GenClk = 1 -- internal clk */
    426		0x00008000 |	/* SPI = 1 */
    427		0x00004000 |	/* MSTR = 1   -- SPI master */
    428		0x00000800;	/* UseEOF = 1 -- SS low until EOF */
    429
    430	out_be32(psc_addr(mps, sicr), sicr);
    431
    432	ccr = in_be32(psc_addr(mps, ccr));
    433	ccr &= 0xFF000000;
    434	speed = 1000000;	/* default 1MHz */
    435	bclkdiv = (mps->mclk_rate / speed) - 1;
    436	ccr |= (((bclkdiv & 0xff) << 16) | (((bclkdiv >> 8) & 0xff) << 8));
    437	out_be32(psc_addr(mps, ccr), ccr);
    438
    439	/* Set 2ms DTL delay */
    440	out_8(psc_addr(mps, ctur), 0x00);
    441	out_8(psc_addr(mps, ctlr), 0x82);
    442
    443	/* we don't use the alarms */
    444	out_be32(&fifo->rxalarm, 0xfff);
    445	out_be32(&fifo->txalarm, 0);
    446
    447	/* Enable FIFO slices for Rx/Tx */
    448	out_be32(&fifo->rxcmd,
    449		 MPC512x_PSC_FIFO_ENABLE_SLICE | MPC512x_PSC_FIFO_ENABLE_DMA);
    450	out_be32(&fifo->txcmd,
    451		 MPC512x_PSC_FIFO_ENABLE_SLICE | MPC512x_PSC_FIFO_ENABLE_DMA);
    452
    453	mps->bits_per_word = 8;
    454
    455	return 0;
    456}
    457
    458static irqreturn_t mpc512x_psc_spi_isr(int irq, void *dev_id)
    459{
    460	struct mpc512x_psc_spi *mps = (struct mpc512x_psc_spi *)dev_id;
    461	struct mpc512x_psc_fifo __iomem *fifo = mps->fifo;
    462
    463	/* clear interrupt and wake up the rx/tx routine */
    464	if (in_be32(&fifo->txisr) &
    465	    in_be32(&fifo->tximr) & MPC512x_PSC_FIFO_EMPTY) {
    466		out_be32(&fifo->txisr, MPC512x_PSC_FIFO_EMPTY);
    467		out_be32(&fifo->tximr, 0);
    468		complete(&mps->txisrdone);
    469		return IRQ_HANDLED;
    470	}
    471	return IRQ_NONE;
    472}
    473
    474static int mpc512x_psc_spi_do_probe(struct device *dev, u32 regaddr,
    475					      u32 size, unsigned int irq)
    476{
    477	struct fsl_spi_platform_data *pdata = dev_get_platdata(dev);
    478	struct mpc512x_psc_spi *mps;
    479	struct spi_master *master;
    480	int ret;
    481	void *tempp;
    482	struct clk *clk;
    483
    484	master = spi_alloc_master(dev, sizeof(*mps));
    485	if (master == NULL)
    486		return -ENOMEM;
    487
    488	dev_set_drvdata(dev, master);
    489	mps = spi_master_get_devdata(master);
    490	mps->type = (int)of_device_get_match_data(dev);
    491	mps->irq = irq;
    492
    493	if (pdata) {
    494		mps->cs_control = pdata->cs_control;
    495		master->bus_num = pdata->bus_num;
    496		master->num_chipselect = pdata->max_chipselect;
    497	}
    498
    499	master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH | SPI_LSB_FIRST;
    500	master->setup = mpc512x_psc_spi_setup;
    501	master->prepare_transfer_hardware = mpc512x_psc_spi_prep_xfer_hw;
    502	master->transfer_one_message = mpc512x_psc_spi_msg_xfer;
    503	master->unprepare_transfer_hardware = mpc512x_psc_spi_unprep_xfer_hw;
    504	master->use_gpio_descriptors = true;
    505	master->cleanup = mpc512x_psc_spi_cleanup;
    506	master->dev.of_node = dev->of_node;
    507
    508	tempp = devm_ioremap(dev, regaddr, size);
    509	if (!tempp) {
    510		dev_err(dev, "could not ioremap I/O port range\n");
    511		ret = -EFAULT;
    512		goto free_master;
    513	}
    514	mps->psc = tempp;
    515	mps->fifo =
    516		(struct mpc512x_psc_fifo *)(tempp + sizeof(struct mpc52xx_psc));
    517	ret = devm_request_irq(dev, mps->irq, mpc512x_psc_spi_isr, IRQF_SHARED,
    518				"mpc512x-psc-spi", mps);
    519	if (ret)
    520		goto free_master;
    521	init_completion(&mps->txisrdone);
    522
    523	clk = devm_clk_get(dev, "mclk");
    524	if (IS_ERR(clk)) {
    525		ret = PTR_ERR(clk);
    526		goto free_master;
    527	}
    528	ret = clk_prepare_enable(clk);
    529	if (ret)
    530		goto free_master;
    531	mps->clk_mclk = clk;
    532	mps->mclk_rate = clk_get_rate(clk);
    533
    534	clk = devm_clk_get(dev, "ipg");
    535	if (IS_ERR(clk)) {
    536		ret = PTR_ERR(clk);
    537		goto free_mclk_clock;
    538	}
    539	ret = clk_prepare_enable(clk);
    540	if (ret)
    541		goto free_mclk_clock;
    542	mps->clk_ipg = clk;
    543
    544	ret = mpc512x_psc_spi_port_config(master, mps);
    545	if (ret < 0)
    546		goto free_ipg_clock;
    547
    548	ret = devm_spi_register_master(dev, master);
    549	if (ret < 0)
    550		goto free_ipg_clock;
    551
    552	return ret;
    553
    554free_ipg_clock:
    555	clk_disable_unprepare(mps->clk_ipg);
    556free_mclk_clock:
    557	clk_disable_unprepare(mps->clk_mclk);
    558free_master:
    559	spi_master_put(master);
    560
    561	return ret;
    562}
    563
    564static int mpc512x_psc_spi_do_remove(struct device *dev)
    565{
    566	struct spi_master *master = dev_get_drvdata(dev);
    567	struct mpc512x_psc_spi *mps = spi_master_get_devdata(master);
    568
    569	clk_disable_unprepare(mps->clk_mclk);
    570	clk_disable_unprepare(mps->clk_ipg);
    571
    572	return 0;
    573}
    574
    575static int mpc512x_psc_spi_of_probe(struct platform_device *op)
    576{
    577	const u32 *regaddr_p;
    578	u64 regaddr64, size64;
    579
    580	regaddr_p = of_get_address(op->dev.of_node, 0, &size64, NULL);
    581	if (!regaddr_p) {
    582		dev_err(&op->dev, "Invalid PSC address\n");
    583		return -EINVAL;
    584	}
    585	regaddr64 = of_translate_address(op->dev.of_node, regaddr_p);
    586
    587	return mpc512x_psc_spi_do_probe(&op->dev, (u32) regaddr64, (u32) size64,
    588				irq_of_parse_and_map(op->dev.of_node, 0));
    589}
    590
    591static int mpc512x_psc_spi_of_remove(struct platform_device *op)
    592{
    593	return mpc512x_psc_spi_do_remove(&op->dev);
    594}
    595
    596static const struct of_device_id mpc512x_psc_spi_of_match[] = {
    597	{ .compatible = "fsl,mpc5121-psc-spi", .data = (void *)TYPE_MPC5121 },
    598	{ .compatible = "fsl,mpc5125-psc-spi", .data = (void *)TYPE_MPC5125 },
    599	{},
    600};
    601
    602MODULE_DEVICE_TABLE(of, mpc512x_psc_spi_of_match);
    603
    604static struct platform_driver mpc512x_psc_spi_of_driver = {
    605	.probe = mpc512x_psc_spi_of_probe,
    606	.remove = mpc512x_psc_spi_of_remove,
    607	.driver = {
    608		.name = "mpc512x-psc-spi",
    609		.of_match_table = mpc512x_psc_spi_of_match,
    610	},
    611};
    612module_platform_driver(mpc512x_psc_spi_of_driver);
    613
    614MODULE_AUTHOR("John Rigby");
    615MODULE_DESCRIPTION("MPC512x PSC SPI Driver");
    616MODULE_LICENSE("GPL");