forked from torvalds/linux
Permalink
Show file tree
Hide file tree
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
riscv: Add task switch support for vector
This patch adds task switch support for vector. It supports partial lazy save and restore mechanism. It also supports all lengths of vlen. [guoren@linux.alibaba.com: First available porting to support vector context switching] [nick.knight@sifive.com: Rewrite vector.S to support dynamic vlen, xlen and code refine] [vincent.chen@sifive.com: Fix the might_sleep issue in vstate_save, vstate_restore] [andrew@sifive.com: Optimize task switch codes of vector] Suggested-by: Andrew Waterman <andrew@sifive.com> Co-developed-by: Nick Knight <nick.knight@sifive.com> Signed-off-by: Nick Knight <nick.knight@sifive.com> Co-developed-by: Guo Ren <guoren@linux.alibaba.com> Signed-off-by: Guo Ren <guoren@linux.alibaba.com> Co-developed-by: Vincent Chen <vincent.chen@sifive.com> Signed-off-by: Vincent Chen <vincent.chen@sifive.com> Signed-off-by: Greentime Hu <greentime.hu@sifive.com>
- Loading branch information
1 parent
0a1eacb
commit 93773de66911ee019c1fb31ae8e53a1221a540db
Showing
4 changed files
with
196 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,81 @@ | ||
| /* SPDX-License-Identifier: GPL-2.0 */ | ||
| /* | ||
| * Copyright (C) 2012 Regents of the University of California | ||
| * Copyright (C) 2017 SiFive | ||
| * Copyright (C) 2019 Alibaba Group Holding Limited | ||
| * | ||
| * This program is free software; you can redistribute it and/or | ||
| * modify it under the terms of the GNU General Public License | ||
| * as published by the Free Software Foundation, version 2. | ||
| * | ||
| * This program is distributed in the hope that it will be useful, | ||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| * GNU General Public License for more details. | ||
| */ | ||
|
|
||
| #include <linux/linkage.h> | ||
|
|
||
| #include <asm/asm.h> | ||
| #include <asm/csr.h> | ||
| #include <asm/asm-offsets.h> | ||
|
|
||
| #define vstatep a0 | ||
| #define datap a1 | ||
| #define x_vstart t0 | ||
| #define x_vtype t1 | ||
| #define x_vl t2 | ||
| #define x_vcsr t3 | ||
| #define incr t4 | ||
| #define status t5 | ||
|
|
||
| ENTRY(__vstate_save) | ||
| li status, SR_VS | ||
| csrs sstatus, status | ||
|
|
||
| csrr x_vstart, CSR_VSTART | ||
| csrr x_vtype, CSR_VTYPE | ||
| csrr x_vl, CSR_VL | ||
| csrr x_vcsr, CSR_VCSR | ||
| vsetvli incr, x0, e8, m8 | ||
| vse8.v v0, (datap) | ||
| add datap, datap, incr | ||
| vse8.v v8, (datap) | ||
| add datap, datap, incr | ||
| vse8.v v16, (datap) | ||
| add datap, datap, incr | ||
| vse8.v v24, (datap) | ||
|
|
||
| REG_S x_vstart, RISCV_V_STATE_VSTART(vstatep) | ||
| REG_S x_vtype, RISCV_V_STATE_VTYPE(vstatep) | ||
| REG_S x_vl, RISCV_V_STATE_VL(vstatep) | ||
| REG_S x_vcsr, RISCV_V_STATE_VCSR(vstatep) | ||
|
|
||
| csrc sstatus, status | ||
| ret | ||
| ENDPROC(__vstate_save) | ||
|
|
||
| ENTRY(__vstate_restore) | ||
| li status, SR_VS | ||
| csrs sstatus, status | ||
|
|
||
| vsetvli incr, x0, e8, m8 | ||
| vle8.v v0, (datap) | ||
| add datap, datap, incr | ||
| vle8.v v8, (datap) | ||
| add datap, datap, incr | ||
| vle8.v v16, (datap) | ||
| add datap, datap, incr | ||
| vle8.v v24, (datap) | ||
|
|
||
| REG_L x_vstart, RISCV_V_STATE_VSTART(vstatep) | ||
| REG_L x_vtype, RISCV_V_STATE_VTYPE(vstatep) | ||
| REG_L x_vl, RISCV_V_STATE_VL(vstatep) | ||
| REG_L x_vcsr, RISCV_V_STATE_VCSR(vstatep) | ||
| vsetvl x0, x_vl, x_vtype | ||
| csrw CSR_VSTART, x_vstart | ||
| csrw CSR_VCSR, x_vcsr | ||
|
|
||
| csrc sstatus, status | ||
| ret | ||
| ENDPROC(__vstate_restore) |