提交 24c1d66a 编写于 作者: F fengsheng 提交者: Xie XiuQi

sfc: optimize erase and write time

driver inclusion
category: feature
bugzilla: NA
CVE: NA

optimize erase and write time
Signed-off-by: NFeng Sheng <fengsheng5@huawei.com>
Reviewed-by: Lin Siwei <linsiwei@huawei.com>a
Reviewed-by: NYang Yingliang <yangyingliang@huawei.com>
Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
上级 32c67b0e
...@@ -39,44 +39,42 @@ ...@@ -39,44 +39,42 @@
#define HRD_COMMON_ERR_NOT_ENOUGH_RES (int)(HRD_COMMON_ERR_BASE - 12) #define HRD_COMMON_ERR_NOT_ENOUGH_RES (int)(HRD_COMMON_ERR_BASE - 12)
#define HRD_COMMON_ERR_RES_NOT_EXIST (int)(HRD_COMMON_ERR_BASE - 13) #define HRD_COMMON_ERR_RES_NOT_EXIST (int)(HRD_COMMON_ERR_BASE - 13)
/* Swap tool */ /* 16 bit nibble swap. example 0x1234 -> 0x2143 */
/* 16bit nibble swap. For example 0x1234 -> 0x2143 */
#define HRD_NIBBLE_SWAP_16BIT(X) (((X&0xf) << 4) | \ #define HRD_NIBBLE_SWAP_16BIT(X) (((X&0xf) << 4) | \
((X&0xf0) >> 4) | \ ((X&0xF0) >> 4) | \
((X&0xf00) << 4) | \ ((X&0xF00) << 4) | \
((X&0xf000) >> 4)) ((X&0xF000) >> 4))
/* 32bit nibble swap. For example 0x12345678 -> 0x21436587 */ /*32 bit nibble swap. example 0x12345678 -> 0x21436587 */
#define HRD_NIBBLE_SWAP_32BIT(X) (((X&0xf) << 4) | \ #define HRD_NIBBLE_SWAP_32BIT(X) (((X&0xF) << 4) | \
((X&0xf0) >> 4) | \ ((X&0xF0) >> 4) | \
((X&0xf00) << 4) | \ ((X&0xF00) << 4) | \
((X&0xf000) >> 4) | \ ((X&0xF000) >> 4) | \
((X&0xf0000) << 4) | \ ((X&0xF0000) << 4) | \
((X&0xf00000) >> 4) | \ ((X&0xF00000) >> 4) | \
((X&0xf000000) << 4) | \ ((X&0xF000000) << 4) | \
((X&0xf0000000) >> 4)) ((X&0xF0000000) >> 4))
/* 16bit byte swap. For example 0x1234->0x3412 */ /* 16 bit byte swap. example 0x1234->0x3412 */
#define HRD_BYTE_SWAP_16BIT(X) ((((X)&0xff)<<8) | (((X)&0xff00)>>8)) #define HRD_BYTE_SWAP_16BIT(X) ((((X)&0xFF)<<8) | (((X)&0xFF00)>>8))
/* 32bit byte swap. For example 0x12345678->0x78563412 */ /* 32 bit byte swap. example 0x12345678->0x78563412 */
#define HRD_BYTE_SWAP_32BIT(X) ((((X)&0xff)<<24) | \ #define HRD_BYTE_SWAP_32BIT(X) ((((X)&0xFF)<<24) | \
(((X)&0xff00)<<8) | \ (((X)&0xFF00)<<8) | \
(((X)&0xff0000)>>8) | \ (((X)&0xFF0000)>>8) | \
(((X)&0xff000000)>>24)) (((X)&0xFF000000)>>24))
/* 64bit byte swap. For example 0x11223344.55667788 -> 0x88776655.44332211 */ /* 64 bit byte swap. example 0x11223344.55667788 -> 0x88776655.44332211 */
#define HRD_BYTE_SWAP_64BIT(X) ((l64) ((((X)&0xffULL)<<56) | \ #define HRD_BYTE_SWAP_64BIT(X) ((l64) ((((X)&0xFFULL)<<56) | \
(((X)&0xff00ULL)<<40) | \ (((X)&0xFF00ULL)<<40) | \
(((X)&0xff0000ULL)<<24) | \ (((X)&0xFF0000ULL)<<24) | \
(((X)&0xff000000ULL)<<8) | \ (((X)&0xFF000000ULL)<<8) | \
(((X)&0xff00000000ULL)>>8) | \ (((X)&0xFF00000000ULL)>>8) | \
(((X)&0xff0000000000ULL)>>24) | \ (((X)&0xFF0000000000ULL)>>24) | \
(((X)&0xff000000000000ULL)>>40) | \ (((X)&0xFF000000000000ULL)>>40) | \
(((X)&0xff00000000000000ULL)>>56))) (((X)&0xFF00000000000000ULL)>>56)))
/* Endianess macros. */ /* -- Endianess macros. */
#ifdef HRD_ENDNESS_BIGEND #ifdef HRD_ENDNESS_BIGEND
#define HRD_16BIT_LE(X) HRD_BYTE_SWAP_16BIT(X) #define HRD_16BIT_LE(X) HRD_BYTE_SWAP_16BIT(X)
#define HRD_32BIT_LE(X) HRD_BYTE_SWAP_32BIT(X) #define HRD_32BIT_LE(X) HRD_BYTE_SWAP_32BIT(X)
......
// SPDX-License-Identifier: GPL-2.0
/* /*
* Copyright (C) 2019 Hisilicon Limited, All Rights Reserved. * Copyright (C) 2019 Hisilicon Limited, All Rights Reserved.
* *
...@@ -29,6 +29,8 @@ ...@@ -29,6 +29,8 @@
#include "hrd_sflash_driver.h" #include "hrd_sflash_driver.h"
#include "hrd_sflash_hal.h" #include "hrd_sflash_hal.h"
#define SFC_DRIVER_VERSION "1.7.8.0"
static const char *sflashMtdList[] = { "sflash", NULL }; static const char *sflashMtdList[] = { "sflash", NULL };
static unsigned int hrd_flash_info_fill(struct maps_init_info *maps, static unsigned int hrd_flash_info_fill(struct maps_init_info *maps,
...@@ -37,8 +39,7 @@ static unsigned int hrd_flash_info_fill(struct maps_init_info *maps, ...@@ -37,8 +39,7 @@ static unsigned int hrd_flash_info_fill(struct maps_init_info *maps,
{ {
u32 i; u32 i;
/* clear the whole array */ memset((void *)maps, 0x0, sizeof(struct maps_init_info)*MTD_MAX_FLASH_NUMBER);
memset((void *)maps, 0x0, sizeof(maps));
for (i = 0; i < MTD_MAX_FLASH_NUMBER; i++) { for (i = 0; i < MTD_MAX_FLASH_NUMBER; i++) {
maps[i].mtdDrv = sflashMtdList; maps[i].mtdDrv = sflashMtdList;
...@@ -46,18 +47,18 @@ static unsigned int hrd_flash_info_fill(struct maps_init_info *maps, ...@@ -46,18 +47,18 @@ static unsigned int hrd_flash_info_fill(struct maps_init_info *maps,
maps[i].mapInfo.phys = flash_iores->start; maps[i].mapInfo.phys = flash_iores->start;
maps[i].mapInfo.size = resource_size(flash_iores); maps[i].mapInfo.size = resource_size(flash_iores);
maps[i].mapInfo.bankwidth = 8; maps[i].mapInfo.bankwidth = 8;
DB(pr_info("i is 0x%x, phys 0x%llx,size 0x%lx\n", DB(pr_info("[SFC] i is 0x%x, phys 0x%llx,size 0x%lx\n",
(u32) i, maps[i].mapInfo.phys, (u32) i, maps[i].mapInfo.phys,
maps[i].mapInfo.size)); maps[i].mapInfo.size));
DB(pr_info("\nINFO: Found %s %d - base 0x%08x, size 0x%x", DB(pr_info("[SFC] INFO: Found %s %d - base 0x%08x, size 0x%x\n",
maps[i].mapInfo.name, i, maps[i].mapInfo.name, i,
(unsigned int)maps[i].mapInfo.phys, (unsigned int)maps[i].mapInfo.phys,
(unsigned int)maps[i].mapInfo.size)); (unsigned int)maps[i].mapInfo.size));
} }
DB(pr_info("\nINFO: %s - Found %d Flash Devices", __func__, i)); DB(pr_info("[SFC] INFO: %s - Found %d Flash Devices\n", __func__, i));
return i; return i;
} }
...@@ -68,26 +69,24 @@ static int __init hrd_flashProbe(const char **mtdDrv, struct map_info *map, ...@@ -68,26 +69,24 @@ static int __init hrd_flashProbe(const char **mtdDrv, struct map_info *map,
if ((mtdDrv == NULL) if ((mtdDrv == NULL)
|| (map == NULL) || (map == NULL)
|| (mtd == NULL)) { || (mtd == NULL)) {
pr_err("\nERROR: NULL pointer parameter at %s entry", __func__); pr_err("[SFC] ERROR: NULL pointer parameter at %s entry\n", __func__);
return -EINVAL; return -EINVAL;
} }
/* remap the physical address to a virtual address */
map->virt = ioremap(map->phys, map->size); map->virt = ioremap(map->phys, map->size);
if (!map->virt) { if (!map->virt) {
pr_err("\nFailed ioremap Flash device at base 0x%x.", pr_err("[SFC] Failed ioremap Flash device at base 0x%x.\n",
(unsigned int)map->phys); (unsigned int)map->phys);
return -EIO; return -EIO;
} }
DB(pr_info DB(pr_info
("\nIo remapped ok.phy addr:0x%llx, virt addr:0x%llx", ("[SFC] Io remapped ok.phy addr:0x%llx, virt addr:0x%llx\n",
(u64) map->phys, (u64) map->virt)); (u64) map->phys, (u64) map->virt));
/* Skip bankwidths that are not supported */ /* Skip bankwidths that are not supported */
if (!map_bankwidth_supported(map->bankwidth)) { if (!map_bankwidth_supported(map->bankwidth)) {
pr_err("\nERROR: bankwidth %d not supported.", pr_err("[SFC] ERROR: bankwidth %d not supported.\n",
(unsigned int)map->bankwidth); (unsigned int)map->bankwidth);
iounmap((void *)map->virt); iounmap((void *)map->virt);
return -EIO; return -EIO;
...@@ -97,20 +96,19 @@ static int __init hrd_flashProbe(const char **mtdDrv, struct map_info *map, ...@@ -97,20 +96,19 @@ static int __init hrd_flashProbe(const char **mtdDrv, struct map_info *map,
for (; (!(*mtd) && *mtdDrv); mtdDrv++) { for (; (!(*mtd) && *mtdDrv); mtdDrv++) {
DB(pr_info DB(pr_info
("\nUsing %s probe %s at addr 0x%llx,size 0x%x, width %dm", ("[SFC] Using %s probe %s at addr 0x%llx,size 0x%x, width %dm\n",
*mtdDrv, map->name, (u64) map->phys, *mtdDrv, map->name, (u64) map->phys,
(unsigned int)map->size, map->bankwidth)); (unsigned int)map->size, map->bankwidth));
*mtd = sflash_probe(map, sfc_regres); *mtd = sflash_probe(map, sfc_regres);
if (*mtd) { if (*mtd) {
DB(pr_info(" - detected OK")); DB(pr_info(" - detected OK\n"));
/*map->size = (*mtd)->size; */
(*mtd)->owner = THIS_MODULE; (*mtd)->owner = THIS_MODULE;
if (mtd_device_register(*mtd, NULL, 0)) { if (mtd_device_register(*mtd, NULL, 0)) {
pr_err pr_err
("\nERROR: %s - Failed to add the mtd device", ("[SFC] ERROR: %s - Failed to add the mtd device\n",
__func__); __func__);
iounmap((void *)map->virt); iounmap((void *)map->virt);
map->virt = 0; map->virt = 0;
...@@ -119,13 +117,13 @@ static int __init hrd_flashProbe(const char **mtdDrv, struct map_info *map, ...@@ -119,13 +117,13 @@ static int __init hrd_flashProbe(const char **mtdDrv, struct map_info *map,
return 0; return 0;
} else { } else {
DB(pr_info(" - Not detected")); DB(pr_info("[SFC] - Not detected\n"));
} }
} }
iounmap((void *)map->virt); iounmap((void *)map->virt);
map->virt = 0; map->virt = 0;
pr_err("\nERROR: %s - probe failed", __func__); pr_err("[SFC] ERROR: %s - probe failed\n", __func__);
return -ENXIO; return -ENXIO;
} }
...@@ -139,43 +137,43 @@ static unsigned int flash_map_init(struct platform_device *pdev) ...@@ -139,43 +137,43 @@ static unsigned int flash_map_init(struct platform_device *pdev)
struct resource *flash_iores; struct resource *flash_iores;
struct sfc_host *host; struct sfc_host *host;
pr_info("SFC Driver V0.11"); pr_info("SFC Driver\n");
host = devm_kzalloc(dev, sizeof(struct sfc_host), GFP_KERNEL); host = devm_kzalloc(dev, sizeof(struct sfc_host), GFP_KERNEL);
if (!host) {
if (!host) pr_err("[SFC] ERROR: %s devm_kzalloc failed\n", __func__);
return -ENOMEM; return -ENOMEM;
}
sfc_regres = platform_get_resource(pdev, IORESOURCE_MEM, 0); sfc_regres = platform_get_resource(pdev, IORESOURCE_MEM, 0);
flash_iores = platform_get_resource(pdev, IORESOURCE_MEM, 1); flash_iores = platform_get_resource(pdev, IORESOURCE_MEM, 1);
if (sfc_regres->end <= sfc_regres->start) { if (sfc_regres->end <= sfc_regres->start) {
pr_info("\nERROR: %s - sfc register error\r\n", __func__); pr_err("ERROR: sfc register error\n");
return -EFAULT; return -EFAULT;
} }
if (flash_iores->end <= flash_iores->start) { if (flash_iores->end <= flash_iores->start) {
pr_info("\nERROR: %s - sflash addr error\r\n", __func__); pr_err("[SFC] ERROR: flash addr error\n");
return -EFAULT; return -EFAULT;
} }
mapsNum = hrd_flash_info_fill(host->maps, flash_iores, pdev); mapsNum = hrd_flash_info_fill(host->maps, flash_iores, pdev);
DB(pr_info DB(pr_info
("\nINFO: hrd_flash_info_fill - DEtected %d devices\n", mapsNum)); ("[SFC] INFO: DEtected %d devices\n", mapsNum));
for (i = 0; i < mapsNum; i++) { for (i = 0; i < mapsNum; i++) {
DB(pr_info DB(pr_info
("MTD: Initialize the %s device at address 0x%08x\n", ("[SFC] MTD: Initialize the %s device at address 0x%08x\n",
host->maps[i].mapInfo.name, host->maps[i].mapInfo.name,
(unsigned int)host->maps[i].mapInfo.phys)); (unsigned int)host->maps[i].mapInfo.phys));
if (hrd_flashProbe if (hrd_flashProbe
(host->maps[i].mtdDrv, &host->maps[i].mapInfo, sfc_regres, (host->maps[i].mtdDrv, &host->maps[i].mapInfo, sfc_regres,
&host->maps[i].mtdInfo) == 0) { &host->maps[i].mtdInfo) == 0) {
DB(pr_info(" - OK.\n")); DB(pr_info("[SFC]- OK.\n"));
} else { } else {
host->maps[i].mtdInfo = NULL; host->maps[i].mtdInfo = NULL;
DB(pr_err(" - FAILED!\n")); DB(pr_err(" [SFC]- FAILED!\n"));
} }
} }
...@@ -203,8 +201,10 @@ static void __exit flash_map_exit(struct platform_device *pdev) ...@@ -203,8 +201,10 @@ static void __exit flash_map_exit(struct platform_device *pdev)
host->maps[i].mapInfo.virt = 0; host->maps[i].mapInfo.virt = 0;
} }
if (host->maps[i].mtdInfo) {
sflash_destroy(host->maps[i].mtdInfo); sflash_destroy(host->maps[i].mtdInfo);
} }
}
} }
...@@ -243,4 +243,4 @@ module_platform_driver(hisi_sfc_driver); ...@@ -243,4 +243,4 @@ module_platform_driver(hisi_sfc_driver);
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_AUTHOR("Huawei Tech. Co., Ltd."); MODULE_AUTHOR("Huawei Tech. Co., Ltd.");
MODULE_DESCRIPTION("Hi16xx SFC driver"); MODULE_DESCRIPTION("Hi16xx SFC driver");
MODULE_VERSION("1.07"); MODULE_VERSION(SFC_DRIVER_VERSION);
// SPDX-License-Identifier: GPL-2.0
/* /*
* Copyright (C) 2019 Hisilicon Limited, All Rights Reserved. * Copyright (C) 2019 Hisilicon Limited, All Rights Reserved.
* *
...@@ -78,23 +78,16 @@ struct mtd_info *sflash_probe(struct map_info *map, struct resource *sfc_regres) ...@@ -78,23 +78,16 @@ struct mtd_info *sflash_probe(struct map_info *map, struct resource *sfc_regres)
struct SFC_SFLASH_INFO *sflash; struct SFC_SFLASH_INFO *sflash;
unsigned long flags = 0, sflash_in_irq = 0; unsigned long flags = 0, sflash_in_irq = 0;
DB_LOCAL(pr_info("\nINFO: entering %s", __func__)); DB_LOCAL(pr_info("[SFC] INFO: entering %s\n", __func__));
mtd = kmalloc(sizeof(*mtd), GFP_KERNEL); mtd = kmalloc(sizeof(*mtd), GFP_KERNEL);
if (!mtd) { if (!mtd) {
pr_err(KERN_NOTICE pr_err("ERROR: %s - Failed to allocate memory for mtd structure\n", __func__);
"\nERROR: %s - Failed to allocate memory for mtd structure",
__func__);
return NULL; return NULL;
} }
sflash = kmalloc(sizeof(struct SFC_SFLASH_INFO), GFP_KERNEL); sflash = kmalloc(sizeof(struct SFC_SFLASH_INFO), GFP_KERNEL);
if (!sflash) { if (!sflash) {
pr_err(KERN_NOTICE pr_err("[SFC] ERROR: %s - Failed to allocate memory for sflash structure\n", __func__);
"\nERROR: %s - Failed to allocate memory for sflash structure",
__func__);
kfree(mtd); kfree(mtd);
return NULL; return NULL;
} }
...@@ -103,13 +96,10 @@ struct mtd_info *sflash_probe(struct map_info *map, struct resource *sfc_regres) ...@@ -103,13 +96,10 @@ struct mtd_info *sflash_probe(struct map_info *map, struct resource *sfc_regres)
memset(sflash, 0, sizeof(*sflash)); memset(sflash, 0, sizeof(*sflash));
DB_LOCAL(pr_info DB_LOCAL(pr_info
("\nINFO: %s - Base address %llx\n", __func__, map->phys)); ("[SFC] INFO: %s - Base address %llx\n", __func__, map->phys));
sflash->baseAddr = (u64) ioremap(map->phys, map->size); sflash->baseAddr = (u64) ioremap(map->phys, map->size);
if (!sflash->baseAddr) { if (!sflash->baseAddr) {
pr_err(KERN_NOTICE pr_err("[SFC] ERROR: %s - map flash error\n", __func__);
"\nERROR: %s - map flash error\r\n", __func__);
goto exit0; goto exit0;
} }
...@@ -117,27 +107,22 @@ struct mtd_info *sflash_probe(struct map_info *map, struct resource *sfc_regres) ...@@ -117,27 +107,22 @@ struct mtd_info *sflash_probe(struct map_info *map, struct resource *sfc_regres)
(u64) ioremap_nocache(sfc_regres->start, resource_size(sfc_regres)); (u64) ioremap_nocache(sfc_regres->start, resource_size(sfc_regres));
if (!sflash->sfc_reg_base) { if (!sflash->sfc_reg_base) {
pr_err(KERN_NOTICE pr_err("[SFC] ERROR: %s - map register error\n", __func__);
"\nERROR: %s - map register error\r\n", __func__);
goto exit1; goto exit1;
} }
mutex_init(&sflash->lock); mutex_init(&sflash->lock);
sflash->index = INVALID_DEVICE_NUMBER;
sflash->index = INVALID_DEVICE_NUMBER; /* will be detected in init */
sflash_disable_irqs(flags, sflash_in_irq); sflash_disable_irqs(flags, sflash_in_irq);
if (hrd_sflash_init(sflash) != HRD_OK) { if (hrd_sflash_init(sflash) != HRD_OK) {
sflash_enable_irqs(flags, sflash_in_irq); sflash_enable_irqs(flags, sflash_in_irq);
pr_err(KERN_NOTICE pr_err("[SFC] ERROR: %s - Failed to initialize the SFlash.\n", __func__);
"ERROR: %s - Failed to initialize the SFlash.",
__func__);
goto exit2; goto exit2;
} }
sflash_enable_irqs(flags, sflash_in_irq); sflash_enable_irqs(flags, sflash_in_irq);
mtd->erasesize = sflash->sectorSize; mtd->erasesize = sflash->sectorSize;
mtd->size = (u64) sflash->sectorSize * (u64) sflash->sectorNumber; mtd->size = (u64) sflash->sectorSize * (u64) sflash->sectorNumber;
mtd->priv = map; mtd->priv = map;
...@@ -160,21 +145,21 @@ struct mtd_info *sflash_probe(struct map_info *map, struct resource *sfc_regres) ...@@ -160,21 +145,21 @@ struct mtd_info *sflash_probe(struct map_info *map, struct resource *sfc_regres)
map->fldrv_priv = sflash; map->fldrv_priv = sflash;
DB_LOCAL(pr_info DB_LOCAL(pr_info
("\nINFO: %s - Detected SFlash device (size 0x%llx)", __func__, ("[SFC] INFO: %s - Detected SFlash device (size 0x%llx)\n", __func__,
mtd->size)); mtd->size));
DB_LOCAL(pr_info DB_LOCAL(pr_info
("\n Base Address : 0x%llx", sflash->baseAddr)); ("[SFC] Base Address : 0x%llx\n", sflash->baseAddr));
DB_LOCAL(pr_info DB_LOCAL(pr_info
("\n Manufacturer ID : 0x%02x", ("[SFC] Manufacturer ID : 0x%02x\n",
sflash->manufacturerId)); sflash->manufacturerId));
DB_LOCAL(pr_info DB_LOCAL(pr_info
("\n Device ID : 0x%04x", sflash->deviceId)); ("[SFC] Device ID : 0x%04x\n", sflash->deviceId));
DB_LOCAL(pr_info DB_LOCAL(pr_info
("\n Sector Size : 0x%x", sflash->sectorSize)); ("[SFC] Sector Size : 0x%x\n", sflash->sectorSize));
DB_LOCAL(pr_info DB_LOCAL(pr_info
("\n Sector Number : %d", sflash->sectorNumber)); ("[SFC] Sector Number : %d\n", sflash->sectorNumber));
pr_info("SPI Serial flash detected @ 0x%08llx, %dKB (%dsec x %dKB)\n", pr_info("[SFC] detected @ 0x%08llx, %dKB (%dsec x %dKB)\n",
sflash->baseAddr, sflash->baseAddr,
((sflash->sectorNumber * sflash->sectorSize) / 1024), ((sflash->sectorNumber * sflash->sectorSize) / 1024),
sflash->sectorNumber, (sflash->sectorSize / 1024)); sflash->sectorNumber, (sflash->sectorSize / 1024));
...@@ -204,7 +189,7 @@ void sflash_destroy(struct mtd_info *mtd) ...@@ -204,7 +189,7 @@ void sflash_destroy(struct mtd_info *mtd)
struct map_info *map = mtd->priv; struct map_info *map = mtd->priv;
struct SFC_SFLASH_INFO *sflash = map->fldrv_priv; struct SFC_SFLASH_INFO *sflash = map->fldrv_priv;
DB_LOCAL(pr_info("\nINFO: %s called", __func__)); DB_LOCAL(pr_info("[SFC] INFO: %s called\n", __func__));
if (sflash->baseAddr != 0) if (sflash->baseAddr != 0)
iounmap((void *)sflash->baseAddr); iounmap((void *)sflash->baseAddr);
...@@ -227,7 +212,7 @@ static int sflash_read(struct mtd_info *mtd, loff_t from, size_t len, ...@@ -227,7 +212,7 @@ static int sflash_read(struct mtd_info *mtd, loff_t from, size_t len,
*retlen = 0; *retlen = 0;
DB_LOCAL(pr_info DB_LOCAL(pr_info
("\nINFO: %s - offset %08x, len %d", __func__, offset, ("[SFC] INFO: %s - offset %08x, len %d\n", __func__, offset,
(int)len)); (int)len));
mutex_lock(&sflash->lock); mutex_lock(&sflash->lock);
...@@ -237,12 +222,8 @@ static int sflash_read(struct mtd_info *mtd, loff_t from, size_t len, ...@@ -237,12 +222,8 @@ static int sflash_read(struct mtd_info *mtd, loff_t from, size_t len,
ret = SFC_RegModeRead(sflash, offset, (u8 *) buf, (u32) len); ret = SFC_RegModeRead(sflash, offset, (u8 *) buf, (u32) len);
break; break;
case SFC_BUS_RW_MODE:
ret = SFC_BusModeRead(sflash, offset, (u8 *) buf, (u32) len);
break;
default: default:
pr_err(KERN_NOTICE "\nERROR: %s - rw mode error", __func__); pr_err("[SFC] ERROR: %s - rw mode error\n", __func__);
ret = -1; ret = -1;
} }
...@@ -250,16 +231,14 @@ static int sflash_read(struct mtd_info *mtd, loff_t from, size_t len, ...@@ -250,16 +231,14 @@ static int sflash_read(struct mtd_info *mtd, loff_t from, size_t len,
if (ret != HRD_OK) { if (ret != HRD_OK) {
mutex_unlock(&sflash->lock); mutex_unlock(&sflash->lock);
pr_err(KERN_NOTICE "\nERROR: %s - Failed to read block", pr_err("[SFC] ERROR: %s - Failed to read block\n", __func__);
__func__);
return -1; return -1;
} }
mutex_unlock(&sflash->lock); mutex_unlock(&sflash->lock);
*retlen = len; *retlen = len;
DB_LOCAL(pr_info(" - OK")); DB_LOCAL(pr_info(" [SFC] - OK\n"));
return 0; return 0;
} }
...@@ -273,7 +252,7 @@ static int sflash_write(struct mtd_info *mtd, loff_t to, size_t len, ...@@ -273,7 +252,7 @@ static int sflash_write(struct mtd_info *mtd, loff_t to, size_t len,
*retlen = 0; *retlen = 0;
DB_LOCAL(pr_info("\nINFO: %s-offset %08x, len %d", DB_LOCAL(pr_info("[SFC] INFO: %s-offset %08x, len %d\n",
__func__, offset, (u32) len)); __func__, offset, (u32) len));
mutex_lock(&sflash->lock); mutex_lock(&sflash->lock);
...@@ -282,20 +261,15 @@ static int sflash_write(struct mtd_info *mtd, loff_t to, size_t len, ...@@ -282,20 +261,15 @@ static int sflash_write(struct mtd_info *mtd, loff_t to, size_t len,
case SFC_REGISTER_RW_MODE: case SFC_REGISTER_RW_MODE:
ret = SFC_RegModeWrite(sflash, offset, buf, (u32) len); ret = SFC_RegModeWrite(sflash, offset, buf, (u32) len);
break; break;
case SFC_BUS_RW_MODE:
ret = SFC_BusModeWrite(sflash, offset, buf, (u32) len);
break;
default: default:
pr_err(KERN_NOTICE "\nERROR: %s - rw mode error", __func__); pr_err("[SFC] ERROR: %s - rw mode error\n", __func__);
ret = -1; ret = -1;
} }
if (ret != HRD_OK) { if (ret != HRD_OK) {
mutex_unlock(&sflash->lock); mutex_unlock(&sflash->lock);
pr_err(KERN_NOTICE "\nERROR: %s - Failed to write block", pr_err("[SFC] ERROR: %s - Failed to write block\n",
__func__); __func__);
return -1; return -1;
} }
...@@ -304,7 +278,7 @@ static int sflash_write(struct mtd_info *mtd, loff_t to, size_t len, ...@@ -304,7 +278,7 @@ static int sflash_write(struct mtd_info *mtd, loff_t to, size_t len,
*retlen = len; *retlen = len;
DB_LOCAL(pr_info(" - OK")); DB_LOCAL(pr_info("[SFC] - OK"));
return 0; return 0;
} }
...@@ -319,37 +293,31 @@ static int sflash_erase(struct mtd_info *mtd, struct erase_info *instr) ...@@ -319,37 +293,31 @@ static int sflash_erase(struct mtd_info *mtd, struct erase_info *instr)
u64 i; u64 i;
DB_LOCAL(pr_info DB_LOCAL(pr_info
("\nINFO: %s - Addr %08llx, len %lld", __func__, instr->addr, ("[SFC] INFO: %s - Addr %08llx, len %lld\n", __func__, instr->addr,
instr->len)); instr->len));
if (!sflash) { if (!sflash) {
pr_err("\nError: sflash is NULL"); pr_err("[SFC] Error: sflash is NULL\n");
return -EINVAL; return -EINVAL;
} }
if (instr->addr & (mtd->erasesize - 1)) { if (instr->addr & (mtd->erasesize - 1)) {
pr_err("\nError: %s - Erase address not sector alligned", pr_err("[SFC] Error: %s - Erase address not sector alligned\n",
__func__); __func__);
return -EINVAL; return -EINVAL;
} }
if (instr->len & (mtd->erasesize - 1)) { if (instr->len & (mtd->erasesize - 1)) {
pr_err("\nError: %s - Erase length is not sector alligned", pr_err("[SFC] Error: %s - Erase length is not sector alligned\n",
__func__); __func__);
return -EINVAL; return -EINVAL;
} }
if (instr->len + instr->addr > mtd->size) { if (instr->len + instr->addr > mtd->size) {
pr_err("\nError: %s - Erase exceeded flash size", __func__); pr_err("[SFC] Error: %s - Erase exceeded flash size\n", __func__);
return -EINVAL; return -EINVAL;
} }
if (0 != SFC_ControllerAddrModeSet(sflash)) {
pr_err("\nError: %s - SFC_ControllerAddrModeSet %d failed",
__func__, sflash->addr_mode);
return -1;
}
{ {
fsec = instr->addr; fsec = instr->addr;
do_div(fsec, 4 * 1024); do_div(fsec, 4 * 1024);
...@@ -357,10 +325,12 @@ static int sflash_erase(struct mtd_info *mtd, struct erase_info *instr) ...@@ -357,10 +325,12 @@ static int sflash_erase(struct mtd_info *mtd, struct erase_info *instr)
do_div(lsec, 4 * 1024); do_div(lsec, 4 * 1024);
if (fsec < lsec) { if (fsec < lsec) {
pr_info("\nINFO: %s - for 4K from sector %lld to %lld", pr_info("[SFC] INFO: %s - for 4K from sector %lld to %lld\n",
__func__, fsec, lsec - 1); __func__, fsec, lsec - 1);
mutex_lock(&sflash->lock); mutex_lock(&sflash->lock);
SFC_CheckErr(sflash);
for (i = fsec; i < lsec; i++) { for (i = fsec; i < lsec; i++) {
if (SFC_BlockErase if (SFC_BlockErase
(sflash, ((u32) i) * 0x1000, (sflash, ((u32) i) * 0x1000,
...@@ -368,7 +338,7 @@ static int sflash_erase(struct mtd_info *mtd, struct erase_info *instr) ...@@ -368,7 +338,7 @@ static int sflash_erase(struct mtd_info *mtd, struct erase_info *instr)
mutex_unlock(&sflash->lock); mutex_unlock(&sflash->lock);
pr_err pr_err
("\nError: %s - mvSFlashSectorErase on sector %lld", ("[SFC] Error: %s - mvSFlashSectorErase on sector %lld\n",
__func__, i); __func__, i);
return -1; return -1;
} }
...@@ -384,7 +354,7 @@ static int sflash_erase(struct mtd_info *mtd, struct erase_info *instr) ...@@ -384,7 +354,7 @@ static int sflash_erase(struct mtd_info *mtd, struct erase_info *instr)
do_div(lsec, mtd->erasesize); do_div(lsec, mtd->erasesize);
lsec = (fsec + lsec); lsec = (fsec + lsec);
DB_LOCAL(pr_info("\nINFO: %s - from sector %u to %u", __func__, fsec, DB_LOCAL(pr_info("[SFC] INFO: %s - from sector %u to %u\n", __func__, fsec,
lsec - 1)); lsec - 1));
mutex_lock(&sflash->lock); mutex_lock(&sflash->lock);
...@@ -395,7 +365,7 @@ static int sflash_erase(struct mtd_info *mtd, struct erase_info *instr) ...@@ -395,7 +365,7 @@ static int sflash_erase(struct mtd_info *mtd, struct erase_info *instr)
mutex_unlock(&sflash->lock); mutex_unlock(&sflash->lock);
pr_err pr_err
("\nError: %s - mvSFlashSectorErase on sector %lld", ("[SFC] Error: %s - mvSFlashSectorErase on sector %lld\n",
__func__, i); __func__, i);
#if LINUX_VERSION_CODE > KERNEL_VERSION(4, 16, 0) #if LINUX_VERSION_CODE > KERNEL_VERSION(4, 16, 0)
instr->fail_addr = ((u32) i) * mtd->erasesize; instr->fail_addr = ((u32) i) * mtd->erasesize;
...@@ -421,7 +391,7 @@ static int sflash_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len) ...@@ -421,7 +391,7 @@ static int sflash_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
struct map_info *map = mtd->priv; struct map_info *map = mtd->priv;
struct SFC_SFLASH_INFO *sflash = map->fldrv_priv; struct SFC_SFLASH_INFO *sflash = map->fldrv_priv;
DB_LOCAL(pr_info("\nINFO: %s called", __func__)); DB_LOCAL(pr_info("[SFC] INFO: %s called\n", __func__));
mutex_lock(&sflash->lock); mutex_lock(&sflash->lock);
ret = SFC_WPSet(sflash, 1); ret = SFC_WPSet(sflash, 1);
...@@ -436,7 +406,7 @@ static int sflash_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len) ...@@ -436,7 +406,7 @@ static int sflash_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
struct map_info *map = mtd->priv; struct map_info *map = mtd->priv;
struct SFC_SFLASH_INFO *sflash = map->fldrv_priv; struct SFC_SFLASH_INFO *sflash = map->fldrv_priv;
pr_info("\nINFO: %s called", __func__); pr_info("[SFC] INFO: %s called\n", __func__);
mutex_lock(&sflash->lock); mutex_lock(&sflash->lock);
ret = SFC_WPSet(sflash, 0); ret = SFC_WPSet(sflash, 0);
...@@ -447,28 +417,28 @@ static int sflash_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len) ...@@ -447,28 +417,28 @@ static int sflash_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
static void sflash_sync(struct mtd_info *mtd) static void sflash_sync(struct mtd_info *mtd)
{ {
DB_LOCAL(pr_info("\nINFO: %s called - DUMMY", __func__)); DB_LOCAL(pr_info("[SFC] INFO: %s called - DUMMY\n", __func__));
} }
static int sflash_suspend(struct mtd_info *mtd) static int sflash_suspend(struct mtd_info *mtd)
{ {
DB_LOCAL(pr_info("\nINFO: %s called - DUMMY()", __func__)); DB_LOCAL(pr_info("[SFC] INFO: %s called - DUMMY()\n", __func__));
return 0; return 0;
} }
static void sflash_resume(struct mtd_info *mtd) static void sflash_resume(struct mtd_info *mtd)
{ {
DB_LOCAL(pr_info("\nINFO: %s called - DUMMY", __func__)); DB_LOCAL(pr_info("[SFC] INFO: %s called - DUMMY\n", __func__));
} }
static int sflash_block_isbad(struct mtd_info *mtd, loff_t ofs) static int sflash_block_isbad(struct mtd_info *mtd, loff_t ofs)
{ {
DB_LOCAL(pr_info("\nINFO: %s called - DUMMY", __func__)); DB_LOCAL(pr_info("[SFC] INFO: %s called - DUMMY\n", __func__));
return 0; return 0;
} }
static int sflash_block_markbad(struct mtd_info *mtd, loff_t ofs) static int sflash_block_markbad(struct mtd_info *mtd, loff_t ofs)
{ {
DB_LOCAL(pr_info("\nINFO: %s called - DUMMY", __func__)); DB_LOCAL(pr_info("[SFC] INFO: %s called - DUMMY\n", __func__));
return 0; return 0;
} }
...@@ -131,7 +131,7 @@ ...@@ -131,7 +131,7 @@
#define DATABUFFER6 CMD_DATABUF(6) #define DATABUFFER6 CMD_DATABUF(6)
#define DATABUFFER7 CMD_DATABUF(7) #define DATABUFFER7 CMD_DATABUF(7)
#define DATABUFFER8 CMD_DATABUF(8) #define DATABUFFER8 CMD_DATABUF(8)
#define SFC_HARD_BUF_LEN (64) #define SFC_HARD_BUF_LEN (256)
/* GLOBAL_CONFIG */ /* GLOBAL_CONFIG */
#define RD_DELAY 3 #define RD_DELAY 3
...@@ -201,19 +201,14 @@ union UN_SFC_CMD_CONFIG { ...@@ -201,19 +201,14 @@ union UN_SFC_CMD_CONFIG {
unsigned int u32; unsigned int u32;
}; };
extern u32 SFC_ControllerInit(u64 sfc_reg_base); extern s32 SFC_CheckErr(struct SFC_SFLASH_INFO *sflash);
extern s32 SFC_RegModeRead(struct SFC_SFLASH_INFO *sflash, u32 offset, extern s32 SFC_RegModeRead(struct SFC_SFLASH_INFO *sflash, u32 offset,
u8 *pucDest, u32 ulReadLen); u8 *pucDest, u32 ulReadLen);
extern s32 SFC_BusModeRead(struct SFC_SFLASH_INFO *sflash, u32 offset,
u8 *pucDest, u32 ulReadLen);
extern s32 SFC_RegModeWrite(struct SFC_SFLASH_INFO *sflash, u32 offset, extern s32 SFC_RegModeWrite(struct SFC_SFLASH_INFO *sflash, u32 offset,
const u8 *pucSrc, u32 ulWriteLen); const u8 *pucSrc, u32 ulWriteLen);
extern s32 SFC_BusModeWrite(struct SFC_SFLASH_INFO *sflash, u32 offset,
const u8 *pucSrc, u32 ulWriteLen);
extern s32 SFC_SPIFlashIdGet(struct SFC_SFLASH_INFO *pFlinfo, extern s32 SFC_SPIFlashIdGet(struct SFC_SFLASH_INFO *pFlinfo,
u8 *pulManuId, u16 *pulDevId, u8 *pcfi_len, u8 *pulManuId, u16 *pulDevId, u8 *pcfi_len,
u8 *psec_arch, u8 *pfid); u8 *psec_arch, u8 *pfid);
extern s32 SFC_ControllerAddrModeSet(struct SFC_SFLASH_INFO *pFlinfo);
extern s32 SFC_BlockErase(struct SFC_SFLASH_INFO *sflash, u32 ulAddr, extern s32 SFC_BlockErase(struct SFC_SFLASH_INFO *sflash, u32 ulAddr,
u32 ErCmd); u32 ErCmd);
extern int hrd_sflash_init(struct SFC_SFLASH_INFO *pFlinfo); extern int hrd_sflash_init(struct SFC_SFLASH_INFO *pFlinfo);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册