mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-01-22 15:47:11 -05:00
x86/mtrr: Add get_effective_type() service function
Add a service function for obtaining the effective cache mode of overlapping MTRR registers. Make use of that function in check_type_overlap(). Signed-off-by: Juergen Gross <jgross@suse.com> Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de> Tested-by: Michael Kelley <mikelley@microsoft.com> Link: https://lore.kernel.org/r/20230502120931.20719-11-jgross@suse.com Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
This commit is contained in:
committed by
Borislav Petkov (AMD)
parent
961c6a4326
commit
1ca1209904
@@ -80,31 +80,30 @@ static u64 get_mtrr_size(u64 mask)
|
||||
return size;
|
||||
}
|
||||
|
||||
static u8 get_effective_type(u8 type1, u8 type2)
|
||||
{
|
||||
if (type1 == MTRR_TYPE_UNCACHABLE || type2 == MTRR_TYPE_UNCACHABLE)
|
||||
return MTRR_TYPE_UNCACHABLE;
|
||||
|
||||
if ((type1 == MTRR_TYPE_WRBACK && type2 == MTRR_TYPE_WRTHROUGH) ||
|
||||
(type1 == MTRR_TYPE_WRTHROUGH && type2 == MTRR_TYPE_WRBACK))
|
||||
return MTRR_TYPE_WRTHROUGH;
|
||||
|
||||
if (type1 != type2)
|
||||
return MTRR_TYPE_UNCACHABLE;
|
||||
|
||||
return type1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Check and return the effective type for MTRR-MTRR type overlap.
|
||||
* Returns 1 if the effective type is UNCACHEABLE, else returns 0
|
||||
* Returns true if the effective type is UNCACHEABLE, else returns false
|
||||
*/
|
||||
static int check_type_overlap(u8 *prev, u8 *curr)
|
||||
static bool check_type_overlap(u8 *prev, u8 *curr)
|
||||
{
|
||||
if (*prev == MTRR_TYPE_UNCACHABLE || *curr == MTRR_TYPE_UNCACHABLE) {
|
||||
*prev = MTRR_TYPE_UNCACHABLE;
|
||||
*curr = MTRR_TYPE_UNCACHABLE;
|
||||
return 1;
|
||||
}
|
||||
*prev = *curr = get_effective_type(*curr, *prev);
|
||||
|
||||
if ((*prev == MTRR_TYPE_WRBACK && *curr == MTRR_TYPE_WRTHROUGH) ||
|
||||
(*prev == MTRR_TYPE_WRTHROUGH && *curr == MTRR_TYPE_WRBACK)) {
|
||||
*prev = MTRR_TYPE_WRTHROUGH;
|
||||
*curr = MTRR_TYPE_WRTHROUGH;
|
||||
}
|
||||
|
||||
if (*prev != *curr) {
|
||||
*prev = MTRR_TYPE_UNCACHABLE;
|
||||
*curr = MTRR_TYPE_UNCACHABLE;
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return *prev == MTRR_TYPE_UNCACHABLE;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user