summaryrefslogtreecommitdiff
path: root/src/cpu/via/nano/update_ucode.h
blob: 09f4d7641a16b6756a46b91554486aa8ae3ad461 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
/*
 * This file is part of the coreboot project.
 *
 * Copyright (C) 2012  Alexandru Gagniuc <mr.nuke.me@gmail.com>
 *
 * 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, either version 2 of the License, or
 * (at your option) any later version.
 *
 * 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.
 */
#ifndef __UPDATE_UCODE_H
#define __UPDATE_UCODE_H

#include <console/console.h>
#include <cpu/cpu.h>

#define MSR_IA32_BIOS_UPDT_TRIG         0x00000079
#define MSR_IA32_BIOS_SIGN_ID           0x0000008b
#define MSR_UCODE_UPDATE_STATUS         0x00001205

#define NANO_UCODE_SIGNATURE            0x53415252
#define NANO_UCODE_HEADER_SIZE          0x30

/* These are values returned by the CPU after we attempt microcode updates.
 * We care what these values are exactly, so we define them to be sure */
typedef enum {
	UCODE_UPDATE_NOT_ATTEMPTED     = 0x0,
	UCODE_UPDATE_SUCCESS           = 0x1,
	UCODE_UPDATE_FAIL              = 0x2,
	UCODE_UPDATE_WRONG_CPU         = 0x3,
	UCODE_INVALID_UPDATE_BLOCK     = 0x4,
} ucode_update_status;


typedef enum {
	NANO_UCODE_VALID = 0, /* We only care that valid == 0 */
	NANO_UCODE_SIGNATURE_ERROR,
	NANO_UCODE_WRONG_SIZE,
	NANO_UCODE_CHECKSUM_FAIL,
} ucode_validity;

typedef struct {
	u32 signature;          /* NANO_UCODE_SIGNATURE */
	u32 update_revision;    /* Revision of the update header */
	u16 year;               /* Year  of patch release */
	u8  day;                /* Day   of patch release */
	u8  month;              /* Month of patch release */
	u32 applicable_fms;     /* Fam/model/stepping to which ucode applies */
	u32 checksum;           /* Two's complement checksum of ucode+header */
	u32 loader_revision;    /* Revision of hardware ucode update loader*/
	u32 rfu_1;              /* Reserved for future use */
	u32 payload_size;       /* Size of the ucode payload only */
	u32 total_size;         /* Size of the ucode, including header */
	char name[8];           /* ASCII string of ucode filename */
	u32 rfu_2;              /* Reserved for future use */
	/* First double-word of the ucode payload
	 * Its address represents the beginning of the ucode update we need to
	 * send to the CPU */
	u32 ucode_start;

} nano_ucode_header;

unsigned int nano_update_ucode(void);

#endif /* __UPDATE_UCODE_H */