diff options
Diffstat (limited to 'drivers/rkflash')
-rw-r--r-- | drivers/rkflash/nand_boot.c | 5 | ||||
-rw-r--r-- | drivers/rkflash/rk_sftl.h | 1 | ||||
-rw-r--r-- | drivers/rkflash/rk_sftl_arm_v7.S | 24 | ||||
-rw-r--r-- | drivers/rkflash/rk_sftl_arm_v7_thumb.S | 24 | ||||
-rw-r--r-- | drivers/rkflash/rk_sftl_arm_v8.S | 24 | ||||
-rw-r--r-- | drivers/rkflash/rkflash_api.h | 2 | ||||
-rw-r--r-- | drivers/rkflash/rkflash_blk.c | 29 | ||||
-rw-r--r-- | drivers/rkflash/rkflash_blk.h | 1 | ||||
-rw-r--r-- | drivers/rkflash/rkflash_debug.h | 2 | ||||
-rw-r--r-- | drivers/rkflash/sfc_nand_boot.c | 5 |
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(); |