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-hisi-kunpeng.c (14211B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2//
      3// HiSilicon SPI Controller Driver for Kunpeng SoCs
      4//
      5// Copyright (c) 2021 HiSilicon Technologies Co., Ltd.
      6// Author: Jay Fang <f.fangjian@huawei.com>
      7//
      8// This code is based on spi-dw-core.c.
      9
     10#include <linux/acpi.h>
     11#include <linux/bitfield.h>
     12#include <linux/debugfs.h>
     13#include <linux/delay.h>
     14#include <linux/err.h>
     15#include <linux/interrupt.h>
     16#include <linux/module.h>
     17#include <linux/property.h>
     18#include <linux/platform_device.h>
     19#include <linux/slab.h>
     20#include <linux/spi/spi.h>
     21
     22/* Register offsets */
     23#define HISI_SPI_CSCR		0x00	/* cs control register */
     24#define HISI_SPI_CR		0x04	/* spi common control register */
     25#define HISI_SPI_ENR		0x08	/* spi enable register */
     26#define HISI_SPI_FIFOC		0x0c	/* fifo level control register */
     27#define HISI_SPI_IMR		0x10	/* interrupt mask register */
     28#define HISI_SPI_DIN		0x14	/* data in register */
     29#define HISI_SPI_DOUT		0x18	/* data out register */
     30#define HISI_SPI_SR		0x1c	/* status register */
     31#define HISI_SPI_RISR		0x20	/* raw interrupt status register */
     32#define HISI_SPI_ISR		0x24	/* interrupt status register */
     33#define HISI_SPI_ICR		0x28	/* interrupt clear register */
     34#define HISI_SPI_VERSION	0xe0	/* version register */
     35
     36/* Bit fields in HISI_SPI_CR */
     37#define CR_LOOP_MASK		GENMASK(1, 1)
     38#define CR_CPOL_MASK		GENMASK(2, 2)
     39#define CR_CPHA_MASK		GENMASK(3, 3)
     40#define CR_DIV_PRE_MASK		GENMASK(11, 4)
     41#define CR_DIV_POST_MASK	GENMASK(19, 12)
     42#define CR_BPW_MASK		GENMASK(24, 20)
     43#define CR_SPD_MODE_MASK	GENMASK(25, 25)
     44
     45/* Bit fields in HISI_SPI_FIFOC */
     46#define FIFOC_TX_MASK		GENMASK(5, 3)
     47#define FIFOC_RX_MASK		GENMASK(11, 9)
     48
     49/* Bit fields in HISI_SPI_IMR, 4 bits */
     50#define IMR_RXOF		BIT(0)		/* Receive Overflow */
     51#define IMR_RXTO		BIT(1)		/* Receive Timeout */
     52#define IMR_RX			BIT(2)		/* Receive */
     53#define IMR_TX			BIT(3)		/* Transmit */
     54#define IMR_MASK		(IMR_RXOF | IMR_RXTO | IMR_RX | IMR_TX)
     55
     56/* Bit fields in HISI_SPI_SR, 5 bits */
     57#define SR_TXE			BIT(0)		/* Transmit FIFO empty */
     58#define SR_TXNF			BIT(1)		/* Transmit FIFO not full */
     59#define SR_RXNE			BIT(2)		/* Receive FIFO not empty */
     60#define SR_RXF			BIT(3)		/* Receive FIFO full */
     61#define SR_BUSY			BIT(4)		/* Busy Flag */
     62
     63/* Bit fields in HISI_SPI_ISR, 4 bits */
     64#define ISR_RXOF		BIT(0)		/* Receive Overflow */
     65#define ISR_RXTO		BIT(1)		/* Receive Timeout */
     66#define ISR_RX			BIT(2)		/* Receive */
     67#define ISR_TX			BIT(3)		/* Transmit */
     68#define ISR_MASK		(ISR_RXOF | ISR_RXTO | ISR_RX | ISR_TX)
     69
     70/* Bit fields in HISI_SPI_ICR, 2 bits */
     71#define ICR_RXOF		BIT(0)		/* Receive Overflow */
     72#define ICR_RXTO		BIT(1)		/* Receive Timeout */
     73#define ICR_MASK		(ICR_RXOF | ICR_RXTO)
     74
     75#define DIV_POST_MAX		0xFF
     76#define DIV_POST_MIN		0x00
     77#define DIV_PRE_MAX		0xFE
     78#define DIV_PRE_MIN		0x02
     79#define CLK_DIV_MAX		((1 + DIV_POST_MAX) * DIV_PRE_MAX)
     80#define CLK_DIV_MIN		((1 + DIV_POST_MIN) * DIV_PRE_MIN)
     81
     82#define DEFAULT_NUM_CS		1
     83
     84#define HISI_SPI_WAIT_TIMEOUT_MS	10UL
     85
     86enum hisi_spi_rx_level_trig {
     87	HISI_SPI_RX_1,
     88	HISI_SPI_RX_4,
     89	HISI_SPI_RX_8,
     90	HISI_SPI_RX_16,
     91	HISI_SPI_RX_32,
     92	HISI_SPI_RX_64,
     93	HISI_SPI_RX_128
     94};
     95
     96enum hisi_spi_tx_level_trig {
     97	HISI_SPI_TX_1_OR_LESS,
     98	HISI_SPI_TX_4_OR_LESS,
     99	HISI_SPI_TX_8_OR_LESS,
    100	HISI_SPI_TX_16_OR_LESS,
    101	HISI_SPI_TX_32_OR_LESS,
    102	HISI_SPI_TX_64_OR_LESS,
    103	HISI_SPI_TX_128_OR_LESS
    104};
    105
    106enum hisi_spi_frame_n_bytes {
    107	HISI_SPI_N_BYTES_NULL,
    108	HISI_SPI_N_BYTES_U8,
    109	HISI_SPI_N_BYTES_U16,
    110	HISI_SPI_N_BYTES_U32 = 4
    111};
    112
    113/* Slave spi_dev related */
    114struct hisi_chip_data {
    115	u32 cr;
    116	u32 speed_hz;	/* baud rate */
    117	u16 clk_div;	/* baud rate divider */
    118
    119	/* clk_div = (1 + div_post) * div_pre */
    120	u8 div_post;	/* value from 0 to 255 */
    121	u8 div_pre;	/* value from 2 to 254 (even only!) */
    122};
    123
    124struct hisi_spi {
    125	struct device		*dev;
    126
    127	void __iomem		*regs;
    128	int			irq;
    129	u32			fifo_len; /* depth of the FIFO buffer */
    130
    131	/* Current message transfer state info */
    132	const void		*tx;
    133	unsigned int		tx_len;
    134	void			*rx;
    135	unsigned int		rx_len;
    136	u8			n_bytes; /* current is a 1/2/4 bytes op */
    137
    138	struct dentry *debugfs;
    139	struct debugfs_regset32 regset;
    140};
    141
    142#define HISI_SPI_DBGFS_REG(_name, _off)	\
    143{					\
    144	.name = _name,			\
    145	.offset = _off,			\
    146}
    147
    148static const struct debugfs_reg32 hisi_spi_regs[] = {
    149	HISI_SPI_DBGFS_REG("CSCR", HISI_SPI_CSCR),
    150	HISI_SPI_DBGFS_REG("CR", HISI_SPI_CR),
    151	HISI_SPI_DBGFS_REG("ENR", HISI_SPI_ENR),
    152	HISI_SPI_DBGFS_REG("FIFOC", HISI_SPI_FIFOC),
    153	HISI_SPI_DBGFS_REG("IMR", HISI_SPI_IMR),
    154	HISI_SPI_DBGFS_REG("DIN", HISI_SPI_DIN),
    155	HISI_SPI_DBGFS_REG("DOUT", HISI_SPI_DOUT),
    156	HISI_SPI_DBGFS_REG("SR", HISI_SPI_SR),
    157	HISI_SPI_DBGFS_REG("RISR", HISI_SPI_RISR),
    158	HISI_SPI_DBGFS_REG("ISR", HISI_SPI_ISR),
    159	HISI_SPI_DBGFS_REG("ICR", HISI_SPI_ICR),
    160	HISI_SPI_DBGFS_REG("VERSION", HISI_SPI_VERSION),
    161};
    162
    163static int hisi_spi_debugfs_init(struct hisi_spi *hs)
    164{
    165	char name[32];
    166
    167	struct spi_controller *master;
    168
    169	master = container_of(hs->dev, struct spi_controller, dev);
    170	snprintf(name, 32, "hisi_spi%d", master->bus_num);
    171	hs->debugfs = debugfs_create_dir(name, NULL);
    172	if (!hs->debugfs)
    173		return -ENOMEM;
    174
    175	hs->regset.regs = hisi_spi_regs;
    176	hs->regset.nregs = ARRAY_SIZE(hisi_spi_regs);
    177	hs->regset.base = hs->regs;
    178	debugfs_create_regset32("registers", 0400, hs->debugfs, &hs->regset);
    179
    180	return 0;
    181}
    182
    183static u32 hisi_spi_busy(struct hisi_spi *hs)
    184{
    185	return readl(hs->regs + HISI_SPI_SR) & SR_BUSY;
    186}
    187
    188static u32 hisi_spi_rx_not_empty(struct hisi_spi *hs)
    189{
    190	return readl(hs->regs + HISI_SPI_SR) & SR_RXNE;
    191}
    192
    193static u32 hisi_spi_tx_not_full(struct hisi_spi *hs)
    194{
    195	return readl(hs->regs + HISI_SPI_SR) & SR_TXNF;
    196}
    197
    198static void hisi_spi_flush_fifo(struct hisi_spi *hs)
    199{
    200	unsigned long limit = loops_per_jiffy << 1;
    201
    202	do {
    203		while (hisi_spi_rx_not_empty(hs))
    204			readl(hs->regs + HISI_SPI_DOUT);
    205	} while (hisi_spi_busy(hs) && limit--);
    206}
    207
    208/* Disable the controller and all interrupts */
    209static void hisi_spi_disable(struct hisi_spi *hs)
    210{
    211	writel(0, hs->regs + HISI_SPI_ENR);
    212	writel(IMR_MASK, hs->regs + HISI_SPI_IMR);
    213	writel(ICR_MASK, hs->regs + HISI_SPI_ICR);
    214}
    215
    216static u8 hisi_spi_n_bytes(struct spi_transfer *transfer)
    217{
    218	if (transfer->bits_per_word <= 8)
    219		return HISI_SPI_N_BYTES_U8;
    220	else if (transfer->bits_per_word <= 16)
    221		return HISI_SPI_N_BYTES_U16;
    222	else
    223		return HISI_SPI_N_BYTES_U32;
    224}
    225
    226static void hisi_spi_reader(struct hisi_spi *hs)
    227{
    228	u32 max = min_t(u32, hs->rx_len, hs->fifo_len);
    229	u32 rxw;
    230
    231	while (hisi_spi_rx_not_empty(hs) && max--) {
    232		rxw = readl(hs->regs + HISI_SPI_DOUT);
    233		/* Check the transfer's original "rx" is not null */
    234		if (hs->rx) {
    235			switch (hs->n_bytes) {
    236			case HISI_SPI_N_BYTES_U8:
    237				*(u8 *)(hs->rx) = rxw;
    238				break;
    239			case HISI_SPI_N_BYTES_U16:
    240				*(u16 *)(hs->rx) = rxw;
    241				break;
    242			case HISI_SPI_N_BYTES_U32:
    243				*(u32 *)(hs->rx) = rxw;
    244				break;
    245			}
    246			hs->rx += hs->n_bytes;
    247		}
    248		--hs->rx_len;
    249	}
    250}
    251
    252static void hisi_spi_writer(struct hisi_spi *hs)
    253{
    254	u32 max = min_t(u32, hs->tx_len, hs->fifo_len);
    255	u32 txw = 0;
    256
    257	while (hisi_spi_tx_not_full(hs) && max--) {
    258		/* Check the transfer's original "tx" is not null */
    259		if (hs->tx) {
    260			switch (hs->n_bytes) {
    261			case HISI_SPI_N_BYTES_U8:
    262				txw = *(u8 *)(hs->tx);
    263				break;
    264			case HISI_SPI_N_BYTES_U16:
    265				txw = *(u16 *)(hs->tx);
    266				break;
    267			case HISI_SPI_N_BYTES_U32:
    268				txw = *(u32 *)(hs->tx);
    269				break;
    270			}
    271			hs->tx += hs->n_bytes;
    272		}
    273		writel(txw, hs->regs + HISI_SPI_DIN);
    274		--hs->tx_len;
    275	}
    276}
    277
    278static void __hisi_calc_div_reg(struct hisi_chip_data *chip)
    279{
    280	chip->div_pre = DIV_PRE_MAX;
    281	while (chip->div_pre >= DIV_PRE_MIN) {
    282		if (chip->clk_div % chip->div_pre == 0)
    283			break;
    284
    285		chip->div_pre -= 2;
    286	}
    287
    288	if (chip->div_pre > chip->clk_div)
    289		chip->div_pre = chip->clk_div;
    290
    291	chip->div_post = (chip->clk_div / chip->div_pre) - 1;
    292}
    293
    294static u32 hisi_calc_effective_speed(struct spi_controller *master,
    295			struct hisi_chip_data *chip, u32 speed_hz)
    296{
    297	u32 effective_speed;
    298
    299	/* Note clock divider doesn't support odd numbers */
    300	chip->clk_div = DIV_ROUND_UP(master->max_speed_hz, speed_hz) + 1;
    301	chip->clk_div &= 0xfffe;
    302	if (chip->clk_div > CLK_DIV_MAX)
    303		chip->clk_div = CLK_DIV_MAX;
    304
    305	effective_speed = master->max_speed_hz / chip->clk_div;
    306	if (chip->speed_hz != effective_speed) {
    307		__hisi_calc_div_reg(chip);
    308		chip->speed_hz = effective_speed;
    309	}
    310
    311	return effective_speed;
    312}
    313
    314static u32 hisi_spi_prepare_cr(struct spi_device *spi)
    315{
    316	u32 cr = FIELD_PREP(CR_SPD_MODE_MASK, 1);
    317
    318	cr |= FIELD_PREP(CR_CPHA_MASK, (spi->mode & SPI_CPHA) ? 1 : 0);
    319	cr |= FIELD_PREP(CR_CPOL_MASK, (spi->mode & SPI_CPOL) ? 1 : 0);
    320	cr |= FIELD_PREP(CR_LOOP_MASK, (spi->mode & SPI_LOOP) ? 1 : 0);
    321
    322	return cr;
    323}
    324
    325static void hisi_spi_hw_init(struct hisi_spi *hs)
    326{
    327	hisi_spi_disable(hs);
    328
    329	/* FIFO default config */
    330	writel(FIELD_PREP(FIFOC_TX_MASK, HISI_SPI_TX_64_OR_LESS) |
    331		FIELD_PREP(FIFOC_RX_MASK, HISI_SPI_RX_16),
    332		hs->regs + HISI_SPI_FIFOC);
    333
    334	hs->fifo_len = 256;
    335}
    336
    337static irqreturn_t hisi_spi_irq(int irq, void *dev_id)
    338{
    339	struct spi_controller *master = dev_id;
    340	struct hisi_spi *hs = spi_controller_get_devdata(master);
    341	u32 irq_status = readl(hs->regs + HISI_SPI_ISR) & ISR_MASK;
    342
    343	if (!irq_status)
    344		return IRQ_NONE;
    345
    346	if (!master->cur_msg)
    347		return IRQ_HANDLED;
    348
    349	/* Error handling */
    350	if (irq_status & ISR_RXOF) {
    351		dev_err(hs->dev, "interrupt_transfer: fifo overflow\n");
    352		master->cur_msg->status = -EIO;
    353		goto finalize_transfer;
    354	}
    355
    356	/*
    357	 * Read data from the Rx FIFO every time. If there is
    358	 * nothing left to receive, finalize the transfer.
    359	 */
    360	hisi_spi_reader(hs);
    361	if (!hs->rx_len)
    362		goto finalize_transfer;
    363
    364	/* Send data out when Tx FIFO IRQ triggered */
    365	if (irq_status & ISR_TX)
    366		hisi_spi_writer(hs);
    367
    368	return IRQ_HANDLED;
    369
    370finalize_transfer:
    371	hisi_spi_disable(hs);
    372	spi_finalize_current_transfer(master);
    373	return IRQ_HANDLED;
    374}
    375
    376static int hisi_spi_transfer_one(struct spi_controller *master,
    377		struct spi_device *spi, struct spi_transfer *transfer)
    378{
    379	struct hisi_spi *hs = spi_controller_get_devdata(master);
    380	struct hisi_chip_data *chip = spi_get_ctldata(spi);
    381	u32 cr = chip->cr;
    382
    383	/* Update per transfer options for speed and bpw */
    384	transfer->effective_speed_hz =
    385		hisi_calc_effective_speed(master, chip, transfer->speed_hz);
    386	cr |= FIELD_PREP(CR_DIV_PRE_MASK, chip->div_pre);
    387	cr |= FIELD_PREP(CR_DIV_POST_MASK, chip->div_post);
    388	cr |= FIELD_PREP(CR_BPW_MASK, transfer->bits_per_word - 1);
    389	writel(cr, hs->regs + HISI_SPI_CR);
    390
    391	hisi_spi_flush_fifo(hs);
    392
    393	hs->n_bytes = hisi_spi_n_bytes(transfer);
    394	hs->tx = transfer->tx_buf;
    395	hs->tx_len = transfer->len / hs->n_bytes;
    396	hs->rx = transfer->rx_buf;
    397	hs->rx_len = hs->tx_len;
    398
    399	/*
    400	 * Ensure that the transfer data above has been updated
    401	 * before the interrupt to start.
    402	 */
    403	smp_mb();
    404
    405	/* Enable all interrupts and the controller */
    406	writel(~(u32)IMR_MASK, hs->regs + HISI_SPI_IMR);
    407	writel(1, hs->regs + HISI_SPI_ENR);
    408
    409	return 1;
    410}
    411
    412static void hisi_spi_handle_err(struct spi_controller *master,
    413		struct spi_message *msg)
    414{
    415	struct hisi_spi *hs = spi_controller_get_devdata(master);
    416
    417	hisi_spi_disable(hs);
    418
    419	/*
    420	 * Wait for interrupt handler that is
    421	 * already in timeout to complete.
    422	 */
    423	msleep(HISI_SPI_WAIT_TIMEOUT_MS);
    424}
    425
    426static int hisi_spi_setup(struct spi_device *spi)
    427{
    428	struct hisi_chip_data *chip;
    429
    430	/* Only alloc on first setup */
    431	chip = spi_get_ctldata(spi);
    432	if (!chip) {
    433		chip = kzalloc(sizeof(*chip), GFP_KERNEL);
    434		if (!chip)
    435			return -ENOMEM;
    436		spi_set_ctldata(spi, chip);
    437	}
    438
    439	chip->cr = hisi_spi_prepare_cr(spi);
    440
    441	return 0;
    442}
    443
    444static void hisi_spi_cleanup(struct spi_device *spi)
    445{
    446	struct hisi_chip_data *chip = spi_get_ctldata(spi);
    447
    448	kfree(chip);
    449	spi_set_ctldata(spi, NULL);
    450}
    451
    452static int hisi_spi_probe(struct platform_device *pdev)
    453{
    454	struct device *dev = &pdev->dev;
    455	struct spi_controller *master;
    456	struct hisi_spi *hs;
    457	int ret, irq;
    458
    459	irq = platform_get_irq(pdev, 0);
    460	if (irq < 0)
    461		return irq;
    462
    463	master = devm_spi_alloc_master(dev, sizeof(*hs));
    464	if (!master)
    465		return -ENOMEM;
    466
    467	platform_set_drvdata(pdev, master);
    468
    469	hs = spi_controller_get_devdata(master);
    470	hs->dev = dev;
    471	hs->irq = irq;
    472
    473	hs->regs = devm_platform_ioremap_resource(pdev, 0);
    474	if (IS_ERR(hs->regs))
    475		return PTR_ERR(hs->regs);
    476
    477	/* Specify maximum SPI clocking speed (master only) by firmware */
    478	ret = device_property_read_u32(dev, "spi-max-frequency",
    479					&master->max_speed_hz);
    480	if (ret) {
    481		dev_err(dev, "failed to get max SPI clocking speed, ret=%d\n",
    482			ret);
    483		return -EINVAL;
    484	}
    485
    486	ret = device_property_read_u16(dev, "num-cs",
    487					&master->num_chipselect);
    488	if (ret)
    489		master->num_chipselect = DEFAULT_NUM_CS;
    490
    491	master->use_gpio_descriptors = true;
    492	master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH | SPI_LOOP;
    493	master->bits_per_word_mask = SPI_BPW_RANGE_MASK(4, 32);
    494	master->bus_num = pdev->id;
    495	master->setup = hisi_spi_setup;
    496	master->cleanup = hisi_spi_cleanup;
    497	master->transfer_one = hisi_spi_transfer_one;
    498	master->handle_err = hisi_spi_handle_err;
    499	master->dev.fwnode = dev->fwnode;
    500
    501	hisi_spi_hw_init(hs);
    502
    503	ret = devm_request_irq(dev, hs->irq, hisi_spi_irq, 0, dev_name(dev),
    504			master);
    505	if (ret < 0) {
    506		dev_err(dev, "failed to get IRQ=%d, ret=%d\n", hs->irq, ret);
    507		return ret;
    508	}
    509
    510	ret = spi_register_controller(master);
    511	if (ret) {
    512		dev_err(dev, "failed to register spi master, ret=%d\n", ret);
    513		return ret;
    514	}
    515
    516	if (hisi_spi_debugfs_init(hs))
    517		dev_info(dev, "failed to create debugfs dir\n");
    518
    519	dev_info(dev, "hw version:0x%x max-freq:%u kHz\n",
    520		readl(hs->regs + HISI_SPI_VERSION),
    521		master->max_speed_hz / 1000);
    522
    523	return 0;
    524}
    525
    526static int hisi_spi_remove(struct platform_device *pdev)
    527{
    528	struct spi_controller *master = platform_get_drvdata(pdev);
    529	struct hisi_spi *hs = spi_controller_get_devdata(master);
    530
    531	debugfs_remove_recursive(hs->debugfs);
    532	spi_unregister_controller(master);
    533
    534	return 0;
    535}
    536
    537static const struct acpi_device_id hisi_spi_acpi_match[] = {
    538	{"HISI03E1", 0},
    539	{}
    540};
    541MODULE_DEVICE_TABLE(acpi, hisi_spi_acpi_match);
    542
    543static struct platform_driver hisi_spi_driver = {
    544	.probe		= hisi_spi_probe,
    545	.remove		= hisi_spi_remove,
    546	.driver		= {
    547		.name	= "hisi-kunpeng-spi",
    548		.acpi_match_table = hisi_spi_acpi_match,
    549	},
    550};
    551module_platform_driver(hisi_spi_driver);
    552
    553MODULE_AUTHOR("Jay Fang <f.fangjian@huawei.com>");
    554MODULE_DESCRIPTION("HiSilicon SPI Controller Driver for Kunpeng SoCs");
    555MODULE_LICENSE("GPL v2");