sb/intel/bd82x6x: Turn ME PCI register structs into unions

This allows dropping the `pci_read_dword_ptr` and `pci_write_dword_ptr`
wrappers.

Change-Id: I7a6916e535fbba9f05451d5302261418f950be83
Signed-off-by: Angel Pons <th3fanbus@gmail.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/49993
Reviewed-by: Nico Huber <nico.h@gmx.de>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
Angel Pons 2021-01-27 13:03:20 +01:00 committed by Patrick Georgi
parent d882bd478d
commit 3f7bb7dc44
8 changed files with 105 additions and 121 deletions

View File

@ -24,24 +24,18 @@ static const char *me_ack_values[] = {
[ME_HFS_ACK_CONTINUE] = "Continue to boot"
};
static inline void pci_read_dword_ptr(void *ptr, int offset)
{
u32 dword = pci_read_config32(PCH_ME_DEV, offset);
memcpy(ptr, &dword, sizeof(dword));
}
void intel_early_me_status(void)
{
struct me_hfs hfs;
struct me_gmes gmes;
union me_hfs hfs;
union me_gmes gmes;
u32 id = pci_read_config32(PCH_ME_DEV, PCI_VENDOR_ID);
if ((id == 0xffffffff) || (id == 0x00000000) ||
(id == 0x0000ffff) || (id == 0xffff0000)) {
printk(BIOS_DEBUG, "Missing Intel ME PCI device.\n");
} else {
pci_read_dword_ptr(&hfs, PCI_ME_HFS);
pci_read_dword_ptr(&gmes, PCI_ME_GMES);
hfs.raw = pci_read_config32(PCH_ME_DEV, PCI_ME_HFS);
gmes.raw = pci_read_config32(PCH_ME_DEV, PCI_ME_GMES);
intel_me_status(&hfs, &gmes);
}
@ -50,14 +44,14 @@ void intel_early_me_status(void)
int intel_early_me_init(void)
{
int count;
struct me_uma uma;
struct me_hfs hfs;
union me_uma uma;
union me_hfs hfs;
printk(BIOS_INFO, "Intel ME early init\n");
/* Wait for ME UMA SIZE VALID bit to be set */
for (count = ME_RETRY; count > 0; --count) {
pci_read_dword_ptr(&uma, PCI_ME_UMA);
uma.raw = pci_read_config32(PCH_ME_DEV, PCI_ME_UMA);
if (uma.valid)
break;
udelay(ME_DELAY);
@ -68,7 +62,7 @@ int intel_early_me_init(void)
}
/* Check for valid firmware */
pci_read_dword_ptr(&hfs, PCI_ME_HFS);
hfs.raw = pci_read_config32(PCH_ME_DEV, PCI_ME_HFS);
if (hfs.fpt_bad) {
printk(BIOS_WARNING, "WARNING: ME has bad firmware\n");
return -1;
@ -80,9 +74,9 @@ int intel_early_me_init(void)
int intel_early_me_uma_size(void)
{
struct me_uma uma;
union me_uma uma;
pci_read_dword_ptr(&uma, PCI_ME_UMA);
uma.raw = pci_read_config32(PCH_ME_DEV, PCI_ME_UMA);
if (uma.valid) {
printk(BIOS_DEBUG, "ME: Requested %uMB UMA\n", uma.size);
return uma.size;
@ -98,7 +92,7 @@ int intel_early_me_init_done(u8 status)
u32 mebase_l, mebase_h;
u32 millisec;
u32 hfs, me_fws2;
struct me_did did = {
union me_did did = {
.init_done = ME_INIT_DONE,
.status = status
};

View File

@ -22,31 +22,18 @@ static const char *me_ack_values[] = {
[ME_HFS_ACK_CONTINUE] = "Continue to boot"
};
static inline void pci_read_dword_ptr(void *ptr, int offset)
{
u32 dword = pci_read_config32(PCH_ME_DEV, offset);
memcpy(ptr, &dword, sizeof(dword));
}
static inline void pci_write_dword_ptr(void *ptr, int offset)
{
u32 dword = 0;
memcpy(&dword, ptr, sizeof(dword));
pci_write_config32(PCH_ME_DEV, offset, dword);
}
void intel_early_me_status(void)
{
struct me_hfs hfs;
struct me_gmes gmes;
union me_hfs hfs;
union me_gmes gmes;
u32 id = pci_read_config32(PCH_ME_DEV, PCI_VENDOR_ID);
if ((id == 0xffffffff) || (id == 0x00000000) ||
(id == 0x0000ffff) || (id == 0xffff0000)) {
printk(BIOS_DEBUG, "Missing Intel ME PCI device.\n");
} else {
pci_read_dword_ptr(&hfs, PCI_ME_HFS);
pci_read_dword_ptr(&gmes, PCI_ME_GMES);
hfs.raw = pci_read_config32(PCH_ME_DEV, PCI_ME_HFS);
gmes.raw = pci_read_config32(PCH_ME_DEV, PCI_ME_GMES);
intel_me_status(&hfs, &gmes);
}
@ -55,14 +42,14 @@ void intel_early_me_status(void)
int intel_early_me_init(void)
{
int count;
struct me_uma uma;
struct me_hfs hfs;
union me_uma uma;
union me_hfs hfs;
printk(BIOS_INFO, "Intel ME early init\n");
/* Wait for ME UMA SIZE VALID bit to be set */
for (count = ME_RETRY; count > 0; --count) {
pci_read_dword_ptr(&uma, PCI_ME_UMA);
uma.raw = pci_read_config32(PCH_ME_DEV, PCI_ME_UMA);
if (uma.valid)
break;
udelay(ME_DELAY);
@ -73,7 +60,7 @@ int intel_early_me_init(void)
}
/* Check for valid firmware */
pci_read_dword_ptr(&hfs, PCI_ME_HFS);
hfs.raw = pci_read_config32(PCH_ME_DEV, PCI_ME_HFS);
if (hfs.fpt_bad) {
printk(BIOS_WARNING, "WARNING: ME has bad firmware\n");
return -1;
@ -85,9 +72,9 @@ int intel_early_me_init(void)
int intel_early_me_uma_size(void)
{
struct me_uma uma;
union me_uma uma;
pci_read_dword_ptr(&uma, PCI_ME_UMA);
uma.raw = pci_read_config32(PCH_ME_DEV, PCI_ME_UMA);
if (uma.valid) {
printk(BIOS_DEBUG, "ME: Requested %uMB UMA\n", uma.size);
return uma.size;
@ -102,8 +89,8 @@ int intel_early_me_init_done(u8 status)
u8 reset;
int count;
u32 mebase_l, mebase_h;
struct me_hfs hfs;
struct me_did did = {
union me_hfs hfs;
union me_did did = {
.init_done = ME_INIT_DONE,
.status = status
};
@ -117,11 +104,11 @@ int intel_early_me_init_done(u8 status)
printk(BIOS_DEBUG, "ME: Sending Init Done with status: %d, "
"UMA base: 0x%04x\n", status, did.uma_base);
pci_write_dword_ptr(&did, PCI_ME_H_GS);
pci_write_config32(PCH_ME_DEV, PCI_ME_H_GS, did.raw);
/* Must wait for ME acknowledgement */
for (count = ME_RETRY; count > 0; --count) {
pci_read_dword_ptr(&hfs, PCI_ME_HFS);
hfs.raw = pci_read_config32(PCH_ME_DEV, PCI_ME_HFS);
if (hfs.bios_msg_ack)
break;
udelay(ME_DELAY);

View File

@ -31,15 +31,15 @@
static me_bios_path intel_me_path(struct device *dev)
{
me_bios_path path = ME_DISABLE_BIOS_PATH;
struct me_hfs hfs;
struct me_gmes gmes;
union me_hfs hfs;
union me_gmes gmes;
/* S3 wake skips all MKHI messages */
if (acpi_is_wakeup_s3())
return ME_S3WAKE_BIOS_PATH;
pci_read_dword_ptr(dev, &hfs, PCI_ME_HFS);
pci_read_dword_ptr(dev, &gmes, PCI_ME_GMES);
hfs.raw = pci_read_config32(dev, PCI_ME_HFS);
gmes.raw = pci_read_config32(dev, PCI_ME_GMES);
/* Check and dump status */
intel_me_status(&hfs, &gmes);
@ -180,7 +180,7 @@ static void intel_me_init(struct device *dev)
me_bios_path path = intel_me_path(dev);
u8 me_state = 0, me_state_prev = 0;
bool need_reset = false;
struct me_hfs hfs;
union me_hfs hfs;
/* Do initial setup and determine the BIOS path */
printk(BIOS_NOTICE, "ME: BIOS path: %s\n", me_get_bios_path_string(path));
@ -236,7 +236,7 @@ static void intel_me_init(struct device *dev)
case ME_DISABLE_BIOS_PATH:
/* Bring ME out of Soft Temporary Disable mode, if needed */
pci_read_dword_ptr(dev, &hfs, PCI_ME_HFS);
hfs.raw = pci_read_config32(dev, PCI_ME_HFS);
if (hfs.operation_mode == ME_HFS_MODE_DIS
&& me_state == CMOS_ME_STATE_NORMAL
&& (CMOS_ME_STATE(me_state_prev) == CMOS_ME_STATE_DISABLED

View File

@ -47,30 +47,36 @@
#define ME_HFS_ACK_GBL_RESET 6
#define ME_HFS_ACK_CONTINUE 7
struct me_hfs {
u32 working_state: 4;
u32 mfg_mode: 1;
u32 fpt_bad: 1;
u32 operation_state: 3;
u32 fw_init_complete: 1;
u32 ft_bup_ld_flr: 1;
u32 update_in_progress: 1;
u32 error_code: 4;
u32 operation_mode: 4;
u32 reserved: 4;
u32 boot_options_present: 1;
u32 ack_data: 3;
u32 bios_msg_ack: 4;
union me_hfs {
struct {
u32 working_state: 4;
u32 mfg_mode: 1;
u32 fpt_bad: 1;
u32 operation_state: 3;
u32 fw_init_complete: 1;
u32 ft_bup_ld_flr: 1;
u32 update_in_progress: 1;
u32 error_code: 4;
u32 operation_mode: 4;
u32 reserved: 4;
u32 boot_options_present: 1;
u32 ack_data: 3;
u32 bios_msg_ack: 4;
};
u32 raw;
} __packed;
#define PCI_ME_UMA 0x44
struct me_uma {
u32 size: 6;
u32 reserved_1: 10;
u32 valid: 1;
u32 reserved_0: 14;
u32 set_to_one: 1;
union me_uma {
struct {
u32 size: 6;
u32 reserved_1: 10;
u32 valid: 1;
u32 reserved_0: 14;
u32 set_to_one: 1;
};
u32 raw;
} __packed;
#define PCI_ME_H_GS 0x4c
@ -79,11 +85,14 @@ struct me_uma {
#define ME_INIT_STATUS_NOMEM 1
#define ME_INIT_STATUS_ERROR 2
struct me_did {
u32 uma_base: 16;
u32 reserved: 8;
u32 status: 4;
u32 init_done: 4;
union me_did {
struct {
u32 uma_base: 16;
u32 reserved: 8;
u32 status: 4;
u32 init_done: 4;
};
u32 raw;
} __packed;
#define PCI_ME_GMES 0x48
@ -95,21 +104,24 @@ struct me_did {
#define ME_GMES_PHASE_UNKNOWN 5
#define ME_GMES_PHASE_HOST 6
struct me_gmes {
u32 bist_in_prog : 1;
u32 icc_prog_sts : 2;
u32 invoke_mebx : 1;
u32 cpu_replaced_sts : 1;
u32 mbp_rdy : 1;
u32 mfs_failure : 1;
u32 warm_rst_req_for_df : 1;
u32 cpu_replaced_valid : 1;
u32 reserved_1 : 2;
u32 fw_upd_ipu : 1;
u32 reserved_2 : 4;
u32 current_state: 8;
u32 current_pmevent: 4;
u32 progress_code: 4;
union me_gmes {
struct {
u32 bist_in_prog : 1;
u32 icc_prog_sts : 2;
u32 invoke_mebx : 1;
u32 cpu_replaced_sts : 1;
u32 mbp_rdy : 1;
u32 mfs_failure : 1;
u32 warm_rst_req_for_df : 1;
u32 cpu_replaced_valid : 1;
u32 reserved_1 : 2;
u32 fw_upd_ipu : 1;
u32 reserved_2 : 4;
u32 current_state: 8;
u32 current_pmevent: 4;
u32 progress_code: 4;
};
u32 raw;
} __packed;
#define PCI_ME_HERES 0xbc
@ -117,11 +129,14 @@ struct me_gmes {
#define PCI_ME_EXT_SHA256 0x02
#define PCI_ME_HER(x) (0xc0+(4*(x)))
struct me_heres {
u32 extend_reg_algorithm: 4;
u32 reserved: 26;
u32 extend_feature_present: 1;
u32 extend_reg_valid: 1;
union me_heres {
struct {
u32 extend_reg_algorithm: 4;
u32 reserved: 26;
u32 extend_feature_present: 1;
u32 extend_reg_valid: 1;
};
u32 raw;
} __packed;
/*
@ -243,7 +258,6 @@ void mei_read_dword_ptr(void *ptr, int offset);
void mei_write_dword_ptr(void *ptr, int offset);
#ifndef __SIMPLE_DEVICE__
void pci_read_dword_ptr(struct device *dev, void *ptr, int offset);
bool enter_soft_temp_disable(void);
void enter_soft_temp_disable_wait(void);
void exit_soft_temp_disable(struct device *dev);
@ -268,7 +282,7 @@ int intel_me_extend_valid(struct device *dev);
void intel_me_hide(struct device *dev);
/* Defined in me_status.c for both romstage and ramstage */
void intel_me_status(struct me_hfs *hfs, struct me_gmes *gmes);
void intel_me_status(union me_hfs *hfs, union me_gmes *gmes);
void intel_early_me_status(void);
int intel_early_me_init(void);

View File

@ -49,15 +49,15 @@ static void me_print_fw_version(mbp_fw_version_name *vers_name)
static me_bios_path intel_me_path(struct device *dev)
{
me_bios_path path = ME_DISABLE_BIOS_PATH;
struct me_hfs hfs;
struct me_gmes gmes;
union me_hfs hfs;
union me_gmes gmes;
/* S3 wake skips all MKHI messages */
if (acpi_is_wakeup_s3())
return ME_S3WAKE_BIOS_PATH;
pci_read_dword_ptr(dev, &hfs, PCI_ME_HFS);
pci_read_dword_ptr(dev, &gmes, PCI_ME_GMES);
hfs.raw = pci_read_config32(dev, PCI_ME_HFS);
gmes.raw = pci_read_config32(dev, PCI_ME_GMES);
/* Check and dump status */
intel_me_status(&hfs, &gmes);
@ -178,7 +178,7 @@ static void intel_me_init(struct device *dev)
me_bios_payload mbp_data;
u8 me_state = 0, me_state_prev = 0;
bool need_reset = false;
struct me_hfs hfs;
union me_hfs hfs;
/* Do initial setup and determine the BIOS path */
printk(BIOS_NOTICE, "ME: BIOS path: %s\n", me_get_bios_path_string(path));
@ -235,7 +235,7 @@ static void intel_me_init(struct device *dev)
case ME_DISABLE_BIOS_PATH:
/* Bring ME out of Soft Temporary Disable mode, if needed */
pci_read_dword_ptr(dev, &hfs, PCI_ME_HFS);
hfs.raw = pci_read_config32(dev, PCI_ME_HFS);
if (hfs.operation_mode == ME_HFS_MODE_DIS
&& me_state == CMOS_ME_STATE_NORMAL
&& (CMOS_ME_STATE(me_state_prev) == CMOS_ME_STATE_DISABLED

View File

@ -88,15 +88,6 @@ void mei_write_dword_ptr(void *ptr, int offset)
mei_dump(ptr, dword, offset, "WRITE");
}
#ifndef __SIMPLE_DEVICE__
void pci_read_dword_ptr(struct device *dev, void *ptr, int offset)
{
u32 dword = pci_read_config32(dev, offset);
memcpy(ptr, &dword, sizeof(dword));
mei_dump(ptr, dword, offset, "PCI READ");
}
#endif
void read_host_csr(struct mei_csr *csr)
{
mei_read_dword_ptr(csr, MEI_H_CSR);
@ -368,11 +359,11 @@ int intel_mei_setup(struct device *dev)
/* Read the Extend register hash of ME firmware */
int intel_me_extend_valid(struct device *dev)
{
struct me_heres status;
union me_heres status;
u32 extend[8] = {0};
int i, count = 0;
pci_read_dword_ptr(dev, &status, PCI_ME_HERES);
status.raw = pci_read_config32(dev, PCI_ME_HERES);
if (!status.extend_feature_present) {
printk(BIOS_ERR, "ME: Extend Feature not present\n");
return -1;
@ -469,7 +460,7 @@ void exit_soft_temp_disable(struct device *dev)
void exit_soft_temp_disable_wait(struct device *dev)
{
struct me_hfs hfs;
union me_hfs hfs;
struct stopwatch sw;
stopwatch_init_msecs_expire(&sw, ME_ENABLE_TIMEOUT);
@ -480,7 +471,7 @@ void exit_soft_temp_disable_wait(struct device *dev)
*/
do {
mdelay(50);
pci_read_dword_ptr(dev, &hfs, PCI_ME_HFS);
hfs.raw = pci_read_config32(dev, PCI_ME_HFS);
if (hfs.fw_init_complete)
break;
} while (!stopwatch_expired(&sw));

View File

@ -64,8 +64,7 @@ static int me7_mkhi_end_of_post(void)
void intel_me_finalize_smm(void)
{
struct me_hfs hfs;
u32 reg32;
union me_hfs hfs;
update_mei_base_address();
@ -74,8 +73,7 @@ void intel_me_finalize_smm(void)
return;
/* Make sure ME is in a mode that expects EOP */
reg32 = pci_read_config32(PCH_ME_DEV, PCI_ME_HFS);
memcpy(&hfs, &reg32, sizeof(u32));
hfs.raw = pci_read_config32(PCH_ME_DEV, PCI_ME_HFS);
/* Abort and leave device alone if not normal mode */
if (hfs.fpt_bad ||

View File

@ -122,7 +122,7 @@ static const char *me_progress_policy_values[] = {
[0x10] = "Required VSCC values for flash parts do not match",
};
void intel_me_status(struct me_hfs *hfs, struct me_gmes *gmes)
void intel_me_status(union me_hfs *hfs, union me_gmes *gmes)
{
if (CONFIG_DEFAULT_CONSOLE_LOGLEVEL < BIOS_DEBUG)
return;