ACK: [PATCH] bios: mtrr: print out actual default type of MTRR
Colin Ian King
colin.king at canonical.com
Fri Jun 9 05:42:01 UTC 2017
On 06/06/17 08:37, Ivan Hu wrote:
> Print out default type of MTRR instead of using "Most probably Uncached".
> Also modify to get default type from MSR once, avoiding to get default type each
> time we check cahch type.
>
> Signed-off-by: Ivan Hu <ivan.hu at canonical.com>
> ---
> src/bios/mtrr/mtrr.c | 79 +++++++++++++++++++++++++++++++++-------------------
> 1 file changed, 50 insertions(+), 29 deletions(-)
>
> diff --git a/src/bios/mtrr/mtrr.c b/src/bios/mtrr/mtrr.c
> index 7d29c2b..6386b6e 100644
> --- a/src/bios/mtrr/mtrr.c
> +++ b/src/bios/mtrr/mtrr.c
> @@ -51,6 +51,8 @@ static fwts_cpuinfo_x86 *fwts_cpuinfo;
>
> #define MTRR_DEF_TYPE_MSR 0x2FF
>
> +static uint64_t mtrr_default;
> +
> struct mtrr_entry {
> uint8_t reg;
> uint64_t start;
> @@ -74,8 +76,21 @@ static char *cache_to_string(int type)
> strcat(str," Write-Through");
> if (type & WRITE_PROTECT)
> strcat(str," Write-Protect");
> - if (type & DEFAULT)
> - strcat(str," Default (Most probably Uncached)");
> + if (type & DEFAULT) {
> + strcat(str," Default");
> + if (mtrr_default & UNCACHED)
> + strcat(str," (Uncached)");
> + if (mtrr_default & WRITE_BACK)
> + strcat(str," (Write-Back)");
> + if (mtrr_default & WRITE_COMBINING)
> + strcat(str," (Write-Combining)");
> + if (mtrr_default & WRITE_THROUGH)
> + strcat(str," (Write-Through)");
> + if (mtrr_default & WRITE_PROTECT)
> + strcat(str," (Write-Protect)");
> + if (mtrr_default & UNKNOWN)
> + strcat(str," (Unknown)");
> + }
> if (type & UNKNOWN)
> strcat(str," Unknown");
> return str;
> @@ -167,12 +182,38 @@ static int get_mtrrs(void)
> return FWTS_OK;
> }
>
> +static int get_default_mtrr(void) {
> + if (fwts_cpu_readmsr(0, MTRR_DEF_TYPE_MSR, &mtrr_default) == FWTS_OK) {
> + switch (mtrr_default & 0xFF) {
> + case 0:
> + mtrr_default = UNCACHED;
> + break;
> + case 1:
> + mtrr_default = WRITE_COMBINING;
> + break;
> + case 4:
> + mtrr_default = WRITE_THROUGH;
> + break;
> + case 5:
> + mtrr_default = WRITE_PROTECT;
> + break;
> + case 6:
> + mtrr_default = WRITE_BACK;
> + break;
> + default:
> + mtrr_default = UNKNOWN;
> + break;
> + }
> + return FWTS_OK;
> + }
> + return FWTS_ERROR;
> +}
> +
> static int cache_types(uint64_t start, uint64_t end)
> {
> fwts_list_link *item;
> struct mtrr_entry *entry;
> int type = 0;
> - uint64_t mtrr_default = UNCACHED;
>
> fwts_list_foreach(item, mtrr_list) {
> entry = fwts_list_data(struct mtrr_entry*, item);
> @@ -202,32 +243,9 @@ restart:
> if (start != end)
> type |= DEFAULT;
>
> - if (fwts_cpu_readmsr(0, MTRR_DEF_TYPE_MSR, &mtrr_default) == FWTS_OK) {
> - switch (mtrr_default & 0xFF) {
> - case 0:
> - mtrr_default = UNCACHED;
> - break;
> - case 1:
> - mtrr_default = WRITE_COMBINING;
> - break;
> - case 4:
> - mtrr_default = WRITE_THROUGH;
> - break;
> - case 5:
> - mtrr_default = WRITE_PROTECT;
> - break;
> - case 6:
> - mtrr_default = WRITE_BACK;
> - break;
> - default:
> - mtrr_default = UNKNOWN;
> - break;
> - }
> -
> - if ((type & DEFAULT) && mtrr_default != UNCACHED) {
> - type &= ~DEFAULT;
> - type |= mtrr_default;
> - }
> + if ((type & DEFAULT) && mtrr_default != UNCACHED) {
> + type &= ~DEFAULT;
> + type |= mtrr_default;
> }
>
> return type;
> @@ -390,6 +408,9 @@ static int validate_iomem(fwts_framework *fw)
> if ((file = fopen("/proc/iomem", "r")) == NULL)
> return FWTS_ERROR;
>
> + if (get_default_mtrr() != FWTS_OK)
> + mtrr_default = UNKNOWN;
> +
> while (!feof(file)) {
> uint64_t start;
> uint64_t end;
>
Yep, good idea. Thanks Ivan.
Acked-by: Colin Ian King <colin.king at canonical.com>
More information about the fwts-devel
mailing list