-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
riscv: sifive: Add SiFive alternative ports
Add required ports of the Alternative scheme for SiFive. Signed-off-by: Vincent Chen <vincent.chen@sifive.com> Reviewed-by: Anup Patel <anup@brainfault.org> Signed-off-by: Palmer Dabbelt <palmerdabbelt@google.com>
- Loading branch information
Vincent Chen
authored and
Palmer Dabbelt
committed
Apr 26, 2021
1 parent
6f4eea9
commit 1a0e5db
Showing
7 changed files
with
89 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1,2 @@ | ||
obj-y += alternative.o | ||
obj-$(CONFIG_ERRATA_SIFIVE) += sifive/ |
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 @@ | ||
obj-y += errata.o |
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,68 @@ | ||
// SPDX-License-Identifier: GPL-2.0-only | ||
/* | ||
* Copyright (C) 2021 Sifive. | ||
*/ | ||
|
||
#include <linux/kernel.h> | ||
#include <linux/string.h> | ||
#include <linux/bug.h> | ||
#include <asm/patch.h> | ||
#include <asm/alternative.h> | ||
#include <asm/vendorid_list.h> | ||
#include <asm/errata_list.h> | ||
|
||
struct errata_info_t { | ||
char name[ERRATA_STRING_LENGTH_MAX]; | ||
bool (*check_func)(unsigned long arch_id, unsigned long impid); | ||
}; | ||
|
||
static u32 __init sifive_errata_probe(unsigned long archid, unsigned long impid) | ||
{ | ||
int idx; | ||
u32 cpu_req_errata = 0; | ||
|
||
for (idx = 0; idx < ERRATA_SIFIVE_NUMBER; idx++) | ||
if (errata_list[idx].check_func(archid, impid)) | ||
cpu_req_errata |= (1U << idx); | ||
|
||
return cpu_req_errata; | ||
} | ||
|
||
static void __init warn_miss_errata(u32 miss_errata) | ||
{ | ||
int i; | ||
|
||
pr_warn("----------------------------------------------------------------\n"); | ||
pr_warn("WARNING: Missing the following errata may cause potential issues\n"); | ||
for (i = 0; i < ERRATA_SIFIVE_NUMBER; i++) | ||
if (miss_errata & 0x1 << i) | ||
pr_warn("\tSiFive Errata[%d]:%s\n", i, errata_list[i].name); | ||
pr_warn("Please enable the corresponding Kconfig to apply them\n"); | ||
pr_warn("----------------------------------------------------------------\n"); | ||
} | ||
|
||
void __init sifive_errata_patch_func(struct alt_entry *begin, struct alt_entry *end, | ||
unsigned long archid, unsigned long impid) | ||
{ | ||
struct alt_entry *alt; | ||
u32 cpu_req_errata = sifive_errata_probe(archid, impid); | ||
u32 cpu_apply_errata = 0; | ||
u32 tmp; | ||
|
||
for (alt = begin; alt < end; alt++) { | ||
if (alt->vendor_id != SIFIVE_VENDOR_ID) | ||
continue; | ||
if (alt->errata_id >= ERRATA_SIFIVE_NUMBER) { | ||
WARN(1, "This errata id:%d is not in kernel errata list", alt->errata_id); | ||
continue; | ||
} | ||
|
||
tmp = (1U << alt->errata_id); | ||
if (cpu_req_errata & tmp) { | ||
patch_text_nosync(alt->old_ptr, alt->alt_ptr, alt->alt_len); | ||
cpu_apply_errata |= tmp; | ||
} | ||
} | ||
if (cpu_apply_errata != cpu_req_errata) | ||
warn_miss_errata(cpu_req_errata - cpu_apply_errata); | ||
} |
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