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

hisi-sfc.c (12167B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * HiSilicon FMC SPI NOR flash controller driver
      4 *
      5 * Copyright (c) 2015-2016 HiSilicon Technologies Co., Ltd.
      6 */
      7#include <linux/bitops.h>
      8#include <linux/clk.h>
      9#include <linux/dma-mapping.h>
     10#include <linux/iopoll.h>
     11#include <linux/module.h>
     12#include <linux/mtd/mtd.h>
     13#include <linux/mtd/spi-nor.h>
     14#include <linux/of.h>
     15#include <linux/platform_device.h>
     16#include <linux/slab.h>
     17
     18/* Hardware register offsets and field definitions */
     19#define FMC_CFG				0x00
     20#define FMC_CFG_OP_MODE_MASK		BIT_MASK(0)
     21#define FMC_CFG_OP_MODE_BOOT		0
     22#define FMC_CFG_OP_MODE_NORMAL		1
     23#define FMC_CFG_FLASH_SEL(type)		(((type) & 0x3) << 1)
     24#define FMC_CFG_FLASH_SEL_MASK		0x6
     25#define FMC_ECC_TYPE(type)		(((type) & 0x7) << 5)
     26#define FMC_ECC_TYPE_MASK		GENMASK(7, 5)
     27#define SPI_NOR_ADDR_MODE_MASK		BIT_MASK(10)
     28#define SPI_NOR_ADDR_MODE_3BYTES	(0x0 << 10)
     29#define SPI_NOR_ADDR_MODE_4BYTES	(0x1 << 10)
     30#define FMC_GLOBAL_CFG			0x04
     31#define FMC_GLOBAL_CFG_WP_ENABLE	BIT(6)
     32#define FMC_SPI_TIMING_CFG		0x08
     33#define TIMING_CFG_TCSH(nr)		(((nr) & 0xf) << 8)
     34#define TIMING_CFG_TCSS(nr)		(((nr) & 0xf) << 4)
     35#define TIMING_CFG_TSHSL(nr)		((nr) & 0xf)
     36#define CS_HOLD_TIME			0x6
     37#define CS_SETUP_TIME			0x6
     38#define CS_DESELECT_TIME		0xf
     39#define FMC_INT				0x18
     40#define FMC_INT_OP_DONE			BIT(0)
     41#define FMC_INT_CLR			0x20
     42#define FMC_CMD				0x24
     43#define FMC_CMD_CMD1(cmd)		((cmd) & 0xff)
     44#define FMC_ADDRL			0x2c
     45#define FMC_OP_CFG			0x30
     46#define OP_CFG_FM_CS(cs)		((cs) << 11)
     47#define OP_CFG_MEM_IF_TYPE(type)	(((type) & 0x7) << 7)
     48#define OP_CFG_ADDR_NUM(addr)		(((addr) & 0x7) << 4)
     49#define OP_CFG_DUMMY_NUM(dummy)		((dummy) & 0xf)
     50#define FMC_DATA_NUM			0x38
     51#define FMC_DATA_NUM_CNT(cnt)		((cnt) & GENMASK(13, 0))
     52#define FMC_OP				0x3c
     53#define FMC_OP_DUMMY_EN			BIT(8)
     54#define FMC_OP_CMD1_EN			BIT(7)
     55#define FMC_OP_ADDR_EN			BIT(6)
     56#define FMC_OP_WRITE_DATA_EN		BIT(5)
     57#define FMC_OP_READ_DATA_EN		BIT(2)
     58#define FMC_OP_READ_STATUS_EN		BIT(1)
     59#define FMC_OP_REG_OP_START		BIT(0)
     60#define FMC_DMA_LEN			0x40
     61#define FMC_DMA_LEN_SET(len)		((len) & GENMASK(27, 0))
     62#define FMC_DMA_SADDR_D0		0x4c
     63#define HIFMC_DMA_MAX_LEN		(4096)
     64#define HIFMC_DMA_MASK			(HIFMC_DMA_MAX_LEN - 1)
     65#define FMC_OP_DMA			0x68
     66#define OP_CTRL_RD_OPCODE(code)		(((code) & 0xff) << 16)
     67#define OP_CTRL_WR_OPCODE(code)		(((code) & 0xff) << 8)
     68#define OP_CTRL_RW_OP(op)		((op) << 1)
     69#define OP_CTRL_DMA_OP_READY		BIT(0)
     70#define FMC_OP_READ			0x0
     71#define FMC_OP_WRITE			0x1
     72#define FMC_WAIT_TIMEOUT		1000000
     73
     74enum hifmc_iftype {
     75	IF_TYPE_STD,
     76	IF_TYPE_DUAL,
     77	IF_TYPE_DIO,
     78	IF_TYPE_QUAD,
     79	IF_TYPE_QIO,
     80};
     81
     82struct hifmc_priv {
     83	u32 chipselect;
     84	u32 clkrate;
     85	struct hifmc_host *host;
     86};
     87
     88#define HIFMC_MAX_CHIP_NUM		2
     89struct hifmc_host {
     90	struct device *dev;
     91	struct mutex lock;
     92
     93	void __iomem *regbase;
     94	void __iomem *iobase;
     95	struct clk *clk;
     96	void *buffer;
     97	dma_addr_t dma_buffer;
     98
     99	struct spi_nor	*nor[HIFMC_MAX_CHIP_NUM];
    100	u32 num_chip;
    101};
    102
    103static inline int hisi_spi_nor_wait_op_finish(struct hifmc_host *host)
    104{
    105	u32 reg;
    106
    107	return readl_poll_timeout(host->regbase + FMC_INT, reg,
    108		(reg & FMC_INT_OP_DONE), 0, FMC_WAIT_TIMEOUT);
    109}
    110
    111static int hisi_spi_nor_get_if_type(enum spi_nor_protocol proto)
    112{
    113	enum hifmc_iftype if_type;
    114
    115	switch (proto) {
    116	case SNOR_PROTO_1_1_2:
    117		if_type = IF_TYPE_DUAL;
    118		break;
    119	case SNOR_PROTO_1_2_2:
    120		if_type = IF_TYPE_DIO;
    121		break;
    122	case SNOR_PROTO_1_1_4:
    123		if_type = IF_TYPE_QUAD;
    124		break;
    125	case SNOR_PROTO_1_4_4:
    126		if_type = IF_TYPE_QIO;
    127		break;
    128	case SNOR_PROTO_1_1_1:
    129	default:
    130		if_type = IF_TYPE_STD;
    131		break;
    132	}
    133
    134	return if_type;
    135}
    136
    137static void hisi_spi_nor_init(struct hifmc_host *host)
    138{
    139	u32 reg;
    140
    141	reg = TIMING_CFG_TCSH(CS_HOLD_TIME)
    142		| TIMING_CFG_TCSS(CS_SETUP_TIME)
    143		| TIMING_CFG_TSHSL(CS_DESELECT_TIME);
    144	writel(reg, host->regbase + FMC_SPI_TIMING_CFG);
    145}
    146
    147static int hisi_spi_nor_prep(struct spi_nor *nor)
    148{
    149	struct hifmc_priv *priv = nor->priv;
    150	struct hifmc_host *host = priv->host;
    151	int ret;
    152
    153	mutex_lock(&host->lock);
    154
    155	ret = clk_set_rate(host->clk, priv->clkrate);
    156	if (ret)
    157		goto out;
    158
    159	ret = clk_prepare_enable(host->clk);
    160	if (ret)
    161		goto out;
    162
    163	return 0;
    164
    165out:
    166	mutex_unlock(&host->lock);
    167	return ret;
    168}
    169
    170static void hisi_spi_nor_unprep(struct spi_nor *nor)
    171{
    172	struct hifmc_priv *priv = nor->priv;
    173	struct hifmc_host *host = priv->host;
    174
    175	clk_disable_unprepare(host->clk);
    176	mutex_unlock(&host->lock);
    177}
    178
    179static int hisi_spi_nor_op_reg(struct spi_nor *nor,
    180				u8 opcode, size_t len, u8 optype)
    181{
    182	struct hifmc_priv *priv = nor->priv;
    183	struct hifmc_host *host = priv->host;
    184	u32 reg;
    185
    186	reg = FMC_CMD_CMD1(opcode);
    187	writel(reg, host->regbase + FMC_CMD);
    188
    189	reg = FMC_DATA_NUM_CNT(len);
    190	writel(reg, host->regbase + FMC_DATA_NUM);
    191
    192	reg = OP_CFG_FM_CS(priv->chipselect);
    193	writel(reg, host->regbase + FMC_OP_CFG);
    194
    195	writel(0xff, host->regbase + FMC_INT_CLR);
    196	reg = FMC_OP_CMD1_EN | FMC_OP_REG_OP_START | optype;
    197	writel(reg, host->regbase + FMC_OP);
    198
    199	return hisi_spi_nor_wait_op_finish(host);
    200}
    201
    202static int hisi_spi_nor_read_reg(struct spi_nor *nor, u8 opcode, u8 *buf,
    203				 size_t len)
    204{
    205	struct hifmc_priv *priv = nor->priv;
    206	struct hifmc_host *host = priv->host;
    207	int ret;
    208
    209	ret = hisi_spi_nor_op_reg(nor, opcode, len, FMC_OP_READ_DATA_EN);
    210	if (ret)
    211		return ret;
    212
    213	memcpy_fromio(buf, host->iobase, len);
    214	return 0;
    215}
    216
    217static int hisi_spi_nor_write_reg(struct spi_nor *nor, u8 opcode,
    218				  const u8 *buf, size_t len)
    219{
    220	struct hifmc_priv *priv = nor->priv;
    221	struct hifmc_host *host = priv->host;
    222
    223	if (len)
    224		memcpy_toio(host->iobase, buf, len);
    225
    226	return hisi_spi_nor_op_reg(nor, opcode, len, FMC_OP_WRITE_DATA_EN);
    227}
    228
    229static int hisi_spi_nor_dma_transfer(struct spi_nor *nor, loff_t start_off,
    230		dma_addr_t dma_buf, size_t len, u8 op_type)
    231{
    232	struct hifmc_priv *priv = nor->priv;
    233	struct hifmc_host *host = priv->host;
    234	u8 if_type = 0;
    235	u32 reg;
    236
    237	reg = readl(host->regbase + FMC_CFG);
    238	reg &= ~(FMC_CFG_OP_MODE_MASK | SPI_NOR_ADDR_MODE_MASK);
    239	reg |= FMC_CFG_OP_MODE_NORMAL;
    240	reg |= (nor->addr_width == 4) ? SPI_NOR_ADDR_MODE_4BYTES
    241		: SPI_NOR_ADDR_MODE_3BYTES;
    242	writel(reg, host->regbase + FMC_CFG);
    243
    244	writel(start_off, host->regbase + FMC_ADDRL);
    245	writel(dma_buf, host->regbase + FMC_DMA_SADDR_D0);
    246	writel(FMC_DMA_LEN_SET(len), host->regbase + FMC_DMA_LEN);
    247
    248	reg = OP_CFG_FM_CS(priv->chipselect);
    249	if (op_type == FMC_OP_READ)
    250		if_type = hisi_spi_nor_get_if_type(nor->read_proto);
    251	else
    252		if_type = hisi_spi_nor_get_if_type(nor->write_proto);
    253	reg |= OP_CFG_MEM_IF_TYPE(if_type);
    254	if (op_type == FMC_OP_READ)
    255		reg |= OP_CFG_DUMMY_NUM(nor->read_dummy >> 3);
    256	writel(reg, host->regbase + FMC_OP_CFG);
    257
    258	writel(0xff, host->regbase + FMC_INT_CLR);
    259	reg = OP_CTRL_RW_OP(op_type) | OP_CTRL_DMA_OP_READY;
    260	reg |= (op_type == FMC_OP_READ)
    261		? OP_CTRL_RD_OPCODE(nor->read_opcode)
    262		: OP_CTRL_WR_OPCODE(nor->program_opcode);
    263	writel(reg, host->regbase + FMC_OP_DMA);
    264
    265	return hisi_spi_nor_wait_op_finish(host);
    266}
    267
    268static ssize_t hisi_spi_nor_read(struct spi_nor *nor, loff_t from, size_t len,
    269		u_char *read_buf)
    270{
    271	struct hifmc_priv *priv = nor->priv;
    272	struct hifmc_host *host = priv->host;
    273	size_t offset;
    274	int ret;
    275
    276	for (offset = 0; offset < len; offset += HIFMC_DMA_MAX_LEN) {
    277		size_t trans = min_t(size_t, HIFMC_DMA_MAX_LEN, len - offset);
    278
    279		ret = hisi_spi_nor_dma_transfer(nor,
    280			from + offset, host->dma_buffer, trans, FMC_OP_READ);
    281		if (ret) {
    282			dev_warn(nor->dev, "DMA read timeout\n");
    283			return ret;
    284		}
    285		memcpy(read_buf + offset, host->buffer, trans);
    286	}
    287
    288	return len;
    289}
    290
    291static ssize_t hisi_spi_nor_write(struct spi_nor *nor, loff_t to,
    292			size_t len, const u_char *write_buf)
    293{
    294	struct hifmc_priv *priv = nor->priv;
    295	struct hifmc_host *host = priv->host;
    296	size_t offset;
    297	int ret;
    298
    299	for (offset = 0; offset < len; offset += HIFMC_DMA_MAX_LEN) {
    300		size_t trans = min_t(size_t, HIFMC_DMA_MAX_LEN, len - offset);
    301
    302		memcpy(host->buffer, write_buf + offset, trans);
    303		ret = hisi_spi_nor_dma_transfer(nor,
    304			to + offset, host->dma_buffer, trans, FMC_OP_WRITE);
    305		if (ret) {
    306			dev_warn(nor->dev, "DMA write timeout\n");
    307			return ret;
    308		}
    309	}
    310
    311	return len;
    312}
    313
    314static const struct spi_nor_controller_ops hisi_controller_ops = {
    315	.prepare = hisi_spi_nor_prep,
    316	.unprepare = hisi_spi_nor_unprep,
    317	.read_reg = hisi_spi_nor_read_reg,
    318	.write_reg = hisi_spi_nor_write_reg,
    319	.read = hisi_spi_nor_read,
    320	.write = hisi_spi_nor_write,
    321};
    322
    323/*
    324 * Get spi flash device information and register it as a mtd device.
    325 */
    326static int hisi_spi_nor_register(struct device_node *np,
    327				struct hifmc_host *host)
    328{
    329	const struct spi_nor_hwcaps hwcaps = {
    330		.mask = SNOR_HWCAPS_READ |
    331			SNOR_HWCAPS_READ_FAST |
    332			SNOR_HWCAPS_READ_1_1_2 |
    333			SNOR_HWCAPS_READ_1_1_4 |
    334			SNOR_HWCAPS_PP,
    335	};
    336	struct device *dev = host->dev;
    337	struct spi_nor *nor;
    338	struct hifmc_priv *priv;
    339	struct mtd_info *mtd;
    340	int ret;
    341
    342	nor = devm_kzalloc(dev, sizeof(*nor), GFP_KERNEL);
    343	if (!nor)
    344		return -ENOMEM;
    345
    346	nor->dev = dev;
    347	spi_nor_set_flash_node(nor, np);
    348
    349	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
    350	if (!priv)
    351		return -ENOMEM;
    352
    353	ret = of_property_read_u32(np, "reg", &priv->chipselect);
    354	if (ret) {
    355		dev_err(dev, "There's no reg property for %pOF\n",
    356			np);
    357		return ret;
    358	}
    359
    360	ret = of_property_read_u32(np, "spi-max-frequency",
    361			&priv->clkrate);
    362	if (ret) {
    363		dev_err(dev, "There's no spi-max-frequency property for %pOF\n",
    364			np);
    365		return ret;
    366	}
    367	priv->host = host;
    368	nor->priv = priv;
    369	nor->controller_ops = &hisi_controller_ops;
    370
    371	ret = spi_nor_scan(nor, NULL, &hwcaps);
    372	if (ret)
    373		return ret;
    374
    375	mtd = &nor->mtd;
    376	mtd->name = np->name;
    377	ret = mtd_device_register(mtd, NULL, 0);
    378	if (ret)
    379		return ret;
    380
    381	host->nor[host->num_chip] = nor;
    382	host->num_chip++;
    383	return 0;
    384}
    385
    386static void hisi_spi_nor_unregister_all(struct hifmc_host *host)
    387{
    388	int i;
    389
    390	for (i = 0; i < host->num_chip; i++)
    391		mtd_device_unregister(&host->nor[i]->mtd);
    392}
    393
    394static int hisi_spi_nor_register_all(struct hifmc_host *host)
    395{
    396	struct device *dev = host->dev;
    397	struct device_node *np;
    398	int ret;
    399
    400	for_each_available_child_of_node(dev->of_node, np) {
    401		ret = hisi_spi_nor_register(np, host);
    402		if (ret) {
    403			of_node_put(np);
    404			goto fail;
    405		}
    406
    407		if (host->num_chip == HIFMC_MAX_CHIP_NUM) {
    408			dev_warn(dev, "Flash device number exceeds the maximum chipselect number\n");
    409			of_node_put(np);
    410			break;
    411		}
    412	}
    413
    414	return 0;
    415
    416fail:
    417	hisi_spi_nor_unregister_all(host);
    418	return ret;
    419}
    420
    421static int hisi_spi_nor_probe(struct platform_device *pdev)
    422{
    423	struct device *dev = &pdev->dev;
    424	struct hifmc_host *host;
    425	int ret;
    426
    427	host = devm_kzalloc(dev, sizeof(*host), GFP_KERNEL);
    428	if (!host)
    429		return -ENOMEM;
    430
    431	platform_set_drvdata(pdev, host);
    432	host->dev = dev;
    433
    434	host->regbase = devm_platform_ioremap_resource_byname(pdev, "control");
    435	if (IS_ERR(host->regbase))
    436		return PTR_ERR(host->regbase);
    437
    438	host->iobase = devm_platform_ioremap_resource_byname(pdev, "memory");
    439	if (IS_ERR(host->iobase))
    440		return PTR_ERR(host->iobase);
    441
    442	host->clk = devm_clk_get(dev, NULL);
    443	if (IS_ERR(host->clk))
    444		return PTR_ERR(host->clk);
    445
    446	ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(32));
    447	if (ret) {
    448		dev_warn(dev, "Unable to set dma mask\n");
    449		return ret;
    450	}
    451
    452	host->buffer = dmam_alloc_coherent(dev, HIFMC_DMA_MAX_LEN,
    453			&host->dma_buffer, GFP_KERNEL);
    454	if (!host->buffer)
    455		return -ENOMEM;
    456
    457	ret = clk_prepare_enable(host->clk);
    458	if (ret)
    459		return ret;
    460
    461	mutex_init(&host->lock);
    462	hisi_spi_nor_init(host);
    463	ret = hisi_spi_nor_register_all(host);
    464	if (ret)
    465		mutex_destroy(&host->lock);
    466
    467	clk_disable_unprepare(host->clk);
    468	return ret;
    469}
    470
    471static int hisi_spi_nor_remove(struct platform_device *pdev)
    472{
    473	struct hifmc_host *host = platform_get_drvdata(pdev);
    474
    475	hisi_spi_nor_unregister_all(host);
    476	mutex_destroy(&host->lock);
    477	return 0;
    478}
    479
    480static const struct of_device_id hisi_spi_nor_dt_ids[] = {
    481	{ .compatible = "hisilicon,fmc-spi-nor"},
    482	{ /* sentinel */ }
    483};
    484MODULE_DEVICE_TABLE(of, hisi_spi_nor_dt_ids);
    485
    486static struct platform_driver hisi_spi_nor_driver = {
    487	.driver = {
    488		.name	= "hisi-sfc",
    489		.of_match_table = hisi_spi_nor_dt_ids,
    490	},
    491	.probe	= hisi_spi_nor_probe,
    492	.remove	= hisi_spi_nor_remove,
    493};
    494module_platform_driver(hisi_spi_nor_driver);
    495
    496MODULE_LICENSE("GPL v2");
    497MODULE_DESCRIPTION("HiSilicon SPI Nor Flash Controller Driver");