summaryrefslogtreecommitdiff
path: root/drivers/rkflash
diff options
context:
space:
mode:
authorDingqiang Lin <jon.lin@rock-chips.com>2018-11-02 21:40:40 +0800
committerTao Huang <huangtao@rock-chips.com>2018-11-05 18:47:07 +0800
commitf757bf19e2b5e3e747fcf2f9392e98356dee4c1c (patch)
tree4e5fb7cac022ac4d1c83a1e50565b04be3886cdd /drivers/rkflash
parent2d5222e4ae62e03a853645fd0efd4f2e49cead3e (diff)
drivers: rkflash: implement block layer discard interface
Change-Id: Iba733d47a09d1f3809b90f43e456fb57d86a6244 Signed-off-by: Dingqiang Lin <jon.lin@rock-chips.com>
Diffstat (limited to 'drivers/rkflash')
-rw-r--r--drivers/rkflash/nand_boot.c5
-rw-r--r--drivers/rkflash/rk_sftl.h1
-rw-r--r--drivers/rkflash/rk_sftl_arm_v7.S24
-rw-r--r--drivers/rkflash/rk_sftl_arm_v7_thumb.S24
-rw-r--r--drivers/rkflash/rk_sftl_arm_v8.S24
-rw-r--r--drivers/rkflash/rkflash_api.h2
-rw-r--r--drivers/rkflash/rkflash_blk.c29
-rw-r--r--drivers/rkflash/rkflash_blk.h1
-rw-r--r--drivers/rkflash/rkflash_debug.h2
-rw-r--r--drivers/rkflash/sfc_nand_boot.c5
10 files changed, 77 insertions, 40 deletions
diff --git a/drivers/rkflash/nand_boot.c b/drivers/rkflash/nand_boot.c
index 6c9ea7279eee..ac4b01bebff4 100644
--- a/drivers/rkflash/nand_boot.c
+++ b/drivers/rkflash/nand_boot.c
@@ -57,6 +57,11 @@ int sftl_flash_gc(void)
return sftl_gc();
}
+int sftl_flash_discard(u32 sec, u32 n_sec)
+{
+ return sftl_discard(sec, n_sec);
+}
+
void sftl_flash_deinit(void)
{
u8 chip_sel = 0;
diff --git a/drivers/rkflash/rk_sftl.h b/drivers/rkflash/rk_sftl.h
index f474236a7cfc..378f83714b5d 100644
--- a/drivers/rkflash/rk_sftl.h
+++ b/drivers/rkflash/rk_sftl.h
@@ -12,6 +12,7 @@ int sftl_read(u32 index, u32 count, u8 *buf);
int sftl_write(u32 index, u32 count, u8 *buf);
u32 sftl_get_density(void);
s32 sftl_gc(void);
+int sftl_discard(u32 sec, u32 n_sec);
int sftl_vendor_read(u32 index, u32 count, u8 *buf);
int sftl_vendor_write(u32 index, u32 count, u8 *buf);
diff --git a/drivers/rkflash/rk_sftl_arm_v7.S b/drivers/rkflash/rk_sftl_arm_v7.S
index 7b2b06134d48..5787848609f5 100644
--- a/drivers/rkflash/rk_sftl_arm_v7.S
+++ b/drivers/rkflash/rk_sftl_arm_v7.S
@@ -1,7 +1,7 @@
/* SPDX-License-Identifier: GPL-2.0 */
/* Copyright (c) 2018 Rockchip Electronics Co. Ltd.
- * date: 2018-10-29
+ * date: 2018-11-02
*/
.file "rk_sftl.c"
.global __udivsi3
@@ -9910,12 +9910,12 @@ sftl_deinit:
.word .LANCHOR2
.size sftl_deinit, .-sftl_deinit
.align 2
- .global FtlDiscard
+ .global sftl_discard
.syntax unified
.arm
.fpu softvfp
- .type FtlDiscard, %function
-FtlDiscard:
+ .type sftl_discard, %function
+sftl_discard:
@ args = 0, pretend = 0, frame = 8
@ frame_needed = 1, uses_anonymous_args = 0
mov ip, sp
@@ -9999,7 +9999,7 @@ FtlDiscard:
.align 2
.L1439:
.word .LANCHOR0
- .size FtlDiscard, .-FtlDiscard
+ .size sftl_discard, .-sftl_discard
.align 2
.global FtlVpcCheckAndModify
.syntax unified
@@ -10251,7 +10251,7 @@ FtlProgPages:
ldrh r3, [r6, #32]
cmp r2, r3
bcc .L1473
- movw r2, #955
+ movw r2, #958
mov r1, r10
ldr r0, .L1482+8
bl sftl_printk
@@ -10291,7 +10291,7 @@ FtlProgPages:
ldrh r3, [r6, #32]
cmp r2, r3
bcc .L1468
- movw r2, #970
+ movw r2, #973
ldr r1, .L1482+4
ldr r0, .L1482+8
bl sftl_printk
@@ -12075,7 +12075,7 @@ FtlWrite:
ldrh r3, [r10, #32]
cmp r2, r3
bcc .L1723
- movw r2, #1011
+ movw r2, #1014
ldr r1, .L1770+12
ldr r0, .L1770+16
bl sftl_printk
@@ -12121,7 +12121,7 @@ FtlWrite:
ldrh r3, [r10, #32]
cmp r2, r3
bcc .L1728
- movw r2, #1044
+ movw r2, #1047
ldr r1, .L1770+12
ldr r0, .L1770+16
bl sftl_printk
@@ -12143,7 +12143,7 @@ FtlWrite:
ldr r2, [fp, #-72]
cmp r3, r2
bls .L1749
- movw r2, #1121
+ movw r2, #1124
ldr r1, .L1770+12
ldr r0, .L1770+16
bl sftl_printk
@@ -12277,7 +12277,7 @@ FtlWrite:
ldr r3, [r8, #8]
cmp r5, r3
beq .L1743
- movw r2, #1097
+ movw r2, #1100
ldr r1, .L1770+12
ldr r0, .L1770+16
bl sftl_printk
@@ -12299,7 +12299,7 @@ FtlWrite:
ldrh r3, [r10, #32]
cmp r2, r3
bcc .L1745
- movw r2, #1112
+ movw r2, #1115
ldr r1, .L1770+12
ldr r0, .L1770+16
bl sftl_printk
diff --git a/drivers/rkflash/rk_sftl_arm_v7_thumb.S b/drivers/rkflash/rk_sftl_arm_v7_thumb.S
index ac8c3bbe7110..7103ff940fd1 100644
--- a/drivers/rkflash/rk_sftl_arm_v7_thumb.S
+++ b/drivers/rkflash/rk_sftl_arm_v7_thumb.S
@@ -1,7 +1,7 @@
/* SPDX-License-Identifier: GPL-2.0 */
/* Copyright (c) 2018 Rockchip Electronics Co. Ltd.
- * date: 2018-10-29
+ * date: 2018-11-02
*/
.arch armv7-a
.eabi_attribute 20, 1
@@ -10078,13 +10078,13 @@ sftl_deinit:
.fnend
.size sftl_deinit, .-sftl_deinit
.align 1
- .global FtlDiscard
+ .global sftl_discard
.syntax unified
.thumb
.thumb_func
.fpu softvfp
- .type FtlDiscard, %function
-FtlDiscard:
+ .type sftl_discard, %function
+sftl_discard:
.fnstart
@ args = 0, pretend = 0, frame = 8
@ frame_needed = 0, uses_anonymous_args = 0
@@ -10172,7 +10172,7 @@ FtlDiscard:
.L1474:
.word .LANCHOR0
.fnend
- .size FtlDiscard, .-FtlDiscard
+ .size sftl_discard, .-sftl_discard
.align 1
.global FtlVpcCheckAndModify
.syntax unified
@@ -10422,7 +10422,7 @@ FtlProgPages:
ldrh r3, [r6, #32]
cmp r2, r3
bcc .L1508
- movw r2, #955
+ movw r2, #958
mov r1, r10
mov r0, fp
bl sftl_printk
@@ -10460,7 +10460,7 @@ FtlProgPages:
ldrh r3, [r6, #32]
cmp r2, r3
bcc .L1503
- movw r2, #970
+ movw r2, #973
ldr r1, .L1517+8
ldr r0, .L1517+12
bl sftl_printk
@@ -12149,7 +12149,7 @@ FtlWrite:
ldrh r3, [r4, #32]
cmp r2, r3
bcc .L1761
- movw r2, #1011
+ movw r2, #1014
ldr r1, .L1808+8
ldr r0, .L1808+12
bl sftl_printk
@@ -12196,7 +12196,7 @@ FtlWrite:
ldrb r2, [r5, #6] @ zero_extendqisi2
cmp r2, r3
bcc .L1766
- movw r2, #1044
+ movw r2, #1047
ldr r1, .L1808+8
ldr r0, .L1808+12
bl sftl_printk
@@ -12215,7 +12215,7 @@ FtlWrite:
ldr r3, [sp]
cmp fp, r3
bls .L1788
- movw r2, #1121
+ movw r2, #1124
ldr r1, .L1808+8
ldr r0, .L1808+12
bl sftl_printk
@@ -12310,7 +12310,7 @@ FtlWrite:
ldrh r3, [r4, #32]
cmp r2, r3
bcc .L1784
- mov r2, #1112
+ movw r2, #1115
ldr r1, .L1808+8
ldr r0, .L1808+12
bl sftl_printk
@@ -12400,7 +12400,7 @@ FtlWrite:
ldr r3, [r9, #8]
cmp r7, r3
beq .L1782
- movw r2, #1097
+ movw r2, #1100
ldr r1, .L1810+4
ldr r0, .L1810+8
bl sftl_printk
diff --git a/drivers/rkflash/rk_sftl_arm_v8.S b/drivers/rkflash/rk_sftl_arm_v8.S
index 1b5ac0ac9462..d24b8d27e421 100644
--- a/drivers/rkflash/rk_sftl_arm_v8.S
+++ b/drivers/rkflash/rk_sftl_arm_v8.S
@@ -1,7 +1,7 @@
/* SPDX-License-Identifier: GPL-2.0 */
/* Copyright (c) 2018 Rockchip Electronics Co. Ltd.
- * date: 2018-10-29
+ * date: 2018-11-02
*/
.arch armv8-a
.file "rk_sftl.c"
@@ -9144,9 +9144,9 @@ sftl_deinit:
ret
.size sftl_deinit, .-sftl_deinit
.align 2
- .global FtlDiscard
- .type FtlDiscard, %function
-FtlDiscard:
+ .global sftl_discard
+ .type sftl_discard, %function
+sftl_discard:
stp x29, x30, [sp, -64]!
add w3, w0, w1
add x29, sp, 0
@@ -9223,7 +9223,7 @@ FtlDiscard:
.L1344:
mov w0, -1
b .L1336
- .size FtlDiscard, .-FtlDiscard
+ .size sftl_discard, .-sftl_discard
.align 2
.global FtlVpcCheckAndModify
.type FtlVpcCheckAndModify, %function
@@ -9470,7 +9470,7 @@ FtlProgPages:
cmp w1, w0
bcc .L1383
adrp x0, .LC1
- mov w2, 955
+ mov w2, 958
add x1, x25, 648
add x0, x0, :lo12:.LC1
bl sftl_printk
@@ -9512,7 +9512,7 @@ FtlProgPages:
adrp x1, .LANCHOR1
add x1, x1, :lo12:.LANCHOR1
adrp x0, .LC1
- mov w2, 970
+ mov w2, 973
add x1, x1, 648
add x0, x0, :lo12:.LC1
bl sftl_printk
@@ -11114,7 +11114,7 @@ FtlWrite:
bcc .L1614
ldr x1, [x29, 160]
adrp x0, .LC1
- mov w2, 1011
+ mov w2, 1014
add x0, x0, :lo12:.LC1
bl sftl_printk
.L1614:
@@ -11163,7 +11163,7 @@ FtlWrite:
bcc .L1619
ldr x1, [x29, 160]
adrp x0, .LC1
- mov w2, 1044
+ mov w2, 1047
add x0, x0, :lo12:.LC1
bl sftl_printk
.L1619:
@@ -11185,7 +11185,7 @@ FtlWrite:
bcs .L1640
ldr x1, [x29, 160]
adrp x0, .LC1
- mov w2, 1121
+ mov w2, 1124
add x0, x0, :lo12:.LC1
bl sftl_printk
.L1640:
@@ -11268,7 +11268,7 @@ FtlWrite:
bcc .L1636
ldr x1, [x29, 160]
adrp x0, .LC1
- mov w2, 1112
+ mov w2, 1115
add x0, x0, :lo12:.LC1
bl sftl_printk
.L1636:
@@ -11372,7 +11372,7 @@ FtlWrite:
cmp w21, w0
beq .L1634
ldr x1, [x29, 160]
- mov w2, 1097
+ mov w2, 1100
adrp x0, .LC1
add x0, x0, :lo12:.LC1
bl sftl_printk
diff --git a/drivers/rkflash/rkflash_api.h b/drivers/rkflash/rkflash_api.h
index f1bdb7b33f1e..2804181fa648 100644
--- a/drivers/rkflash/rkflash_api.h
+++ b/drivers/rkflash/rkflash_api.h
@@ -17,6 +17,7 @@ void sftl_flash_deinit(void);
int sftl_flash_resume(void __iomem *reg_addr);
void sftl_flash_clean_irq(void);
int sftl_flash_gc(void);
+int sftl_flash_discard(u32 sec, u32 n_sec);
#endif
#ifdef CONFIG_RK_SFC_NOR
@@ -43,6 +44,7 @@ void snand_deinit(void);
int snand_resume(void __iomem *reg_addr);
void sfc_clean_irq(void);
int snand_gc(void);
+int snand_discard(u32 sec, u32 n_sec);
#endif
#endif
diff --git a/drivers/rkflash/rkflash_blk.c b/drivers/rkflash/rkflash_blk.c
index 72caaf94e89c..4c4afe34daa8 100644
--- a/drivers/rkflash/rkflash_blk.c
+++ b/drivers/rkflash/rkflash_blk.c
@@ -54,8 +54,9 @@ static struct flash_boot_ops nandc_nand_ops = {
sftl_flash_vendor_read,
sftl_flash_vendor_write,
sftl_flash_gc,
+ sftl_flash_discard,
#else
- -1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ -1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
#endif
};
@@ -71,8 +72,9 @@ static struct flash_boot_ops sfc_nor_ops = {
snor_vendor_read,
snor_vendor_write,
snor_gc,
+ NULL,
#else
- -1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ -1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
#endif
};
@@ -88,8 +90,9 @@ static struct flash_boot_ops sfc_nand_ops = {
snand_vendor_read,
snand_vendor_write,
snand_gc,
+ snand_discard,
#else
- -1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ -1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
#endif
};
@@ -167,6 +170,21 @@ static int rkflash_flash_gc(void)
return ret;
}
+static int rkflash_blk_discard(u32 sec, u32 n_sec)
+{
+ int ret;
+
+ if (g_boot_ops[g_flash_type]->discard) {
+ mutex_lock(&g_flash_ops_mutex);
+ ret = g_boot_ops[g_flash_type]->discard(sec, n_sec);
+ mutex_unlock(&g_flash_ops_mutex);
+ } else {
+ ret = -EPERM;
+ }
+
+ return ret;
+};
+
static unsigned int rk_partition_init(struct flash_part *part)
{
int i, part_num = 0;
@@ -368,6 +386,11 @@ static int rkflash_blktrans_thread(void *arg)
res = 0;
if (req->cmd_flags & REQ_DISCARD) {
+ spin_unlock_irq(rq->queue_lock);
+ if (rkflash_blk_discard(blk_rq_pos(req) +
+ dev->off_size, totle_nsect))
+ res = -EIO;
+ spin_lock_irq(rq->queue_lock);
if (!__blk_end_request_cur(req, res))
req = NULL;
continue;
diff --git a/drivers/rkflash/rkflash_blk.h b/drivers/rkflash/rkflash_blk.h
index e3dc37efdcc5..f3da2f048920 100644
--- a/drivers/rkflash/rkflash_blk.h
+++ b/drivers/rkflash/rkflash_blk.h
@@ -35,6 +35,7 @@ struct flash_boot_ops {
int (*vendor_read)(u32 sec, u32 n_sec, void *p_data);
int (*vendor_write)(u32 sec, u32 n_sec, void *p_data);
int (*gc)(void);
+ int (*discard)(u32 sec, u32 n_sec);
};
struct flash_part {
diff --git a/drivers/rkflash/rkflash_debug.h b/drivers/rkflash/rkflash_debug.h
index 850a9e41b67b..edd609c071d3 100644
--- a/drivers/rkflash/rkflash_debug.h
+++ b/drivers/rkflash/rkflash_debug.h
@@ -74,7 +74,7 @@ extern unsigned int rkflash_debug;
#endif
#if (PRINT_SWI_NANDC_E)
-#define PRINT_NANDC_E(...) {if (rkflash_debug & PRINT_BIT_NANDC_I)\
+#define PRINT_NANDC_E(...) {if (rkflash_debug & PRINT_BIT_NANDC_E)\
pr_info(__VA_ARGS__); }
#else
#define PRINT_NANDC_E(...)
diff --git a/drivers/rkflash/sfc_nand_boot.c b/drivers/rkflash/sfc_nand_boot.c
index 1f0ecea4ef90..ff3d3ef9efaa 100644
--- a/drivers/rkflash/sfc_nand_boot.c
+++ b/drivers/rkflash/sfc_nand_boot.c
@@ -53,6 +53,11 @@ int snand_gc(void)
return sftl_gc();
}
+int snand_discard(u32 sec, u32 n_sec)
+{
+ return sftl_discard(sec, n_sec);
+}
+
void snand_deinit(void)
{
sftl_deinit();