drivers: rkflash: implement block layer discard interface

Change-Id: Iba733d47a09d1f3809b90f43e456fb57d86a6244
Signed-off-by: Dingqiang Lin <jon.lin@rock-chips.com>
This commit is contained in:
Dingqiang Lin 2018-11-02 21:40:40 +08:00 committed by Tao Huang
parent 2d5222e4ae
commit f757bf19e2
10 changed files with 77 additions and 40 deletions

View File

@ -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;

View File

@ -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);

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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;

View File

@ -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 {

View File

@ -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(...)

View File

@ -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();