| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,3 +1,3 @@ | ||
| config DRIVERS_AMD_I2S_MACHINE_DEV | ||
| bool | ||
| depends on HAVE_ACPI_TABLES |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| ramstage-$(CONFIG_DRIVERS_AMD_I2S_MACHINE_DEV) += i2s_machine_dev.c |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,19 @@ | ||
| /* SPDX-License-Identifier: GPL-2.0-or-later */ | ||
|
|
||
| #ifndef __DRIVERS_AMD_I2S_MACHINE_DEV_H__ | ||
| #define __DRIVERS_AMD_I2S_MACHINE_DEV_H__ | ||
|
|
||
| #include <acpi/acpi_device.h> | ||
|
|
||
| struct drivers_amd_i2s_machine_dev_config { | ||
| /* ACPI _HID (required) */ | ||
| const char *hid; | ||
|
|
||
| /* ACPI _UID */ | ||
| unsigned int uid; | ||
|
|
||
| /* DMIC select GPIO (required) */ | ||
| struct acpi_gpio dmic_select_gpio; | ||
| }; | ||
|
|
||
| #endif /* ___DRIVERS_AMD_I2S_MACHINE_DEV_H__ */ |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,92 @@ | ||
| /* SPDX-License-Identifier: GPL-2.0-or-later */ | ||
|
|
||
| #include <acpi/acpi_device.h> | ||
| #include <acpi/acpigen.h> | ||
| #include <device/device.h> | ||
| #include <string.h> | ||
| #include "chip.h" | ||
| #include <console/console.h> | ||
|
|
||
| #define AMD_I2S_ACPI_DESC "I2S machine driver" | ||
|
|
||
| static void i2s_machine_dev_fill_ssdt(const struct device *dev) | ||
| { | ||
| const char *scope = acpi_device_scope(dev); | ||
| struct acpi_dp *dsd; | ||
| const struct acpi_gpio *dmic_select_gpio; | ||
| const struct drivers_amd_i2s_machine_dev_config *cfg; | ||
| const char *path = acpi_device_path(dev); | ||
|
|
||
| cfg = config_of(dev); | ||
|
|
||
| dmic_select_gpio = &cfg->dmic_select_gpio; | ||
|
|
||
| if (cfg->hid == NULL) { | ||
| printk(BIOS_ERR, "%s: ERROR: HID required\n", dev_path(dev)); | ||
| return; | ||
| } | ||
|
|
||
| if (dmic_select_gpio->pin_count == 0) { | ||
| printk(BIOS_ERR, "%s: ERROR: DMIC select GPIO required\n", dev_path(dev)); | ||
| return; | ||
| } | ||
|
|
||
| acpigen_write_scope(scope); /* Scope */ | ||
| acpigen_write_device(acpi_device_name(dev)); /* Device */ | ||
| acpigen_write_name_string("_HID", cfg->hid); | ||
| acpigen_write_name_integer("_UID", cfg->uid); | ||
| acpigen_write_name_string("_DDN", AMD_I2S_ACPI_DESC); | ||
|
|
||
| acpigen_write_STA(acpi_device_status(dev)); | ||
|
|
||
| /* Resources */ | ||
| acpigen_write_name("_CRS"); | ||
| acpigen_write_resourcetemplate_header(); | ||
| acpi_device_write_gpio(dmic_select_gpio); | ||
| acpigen_write_resourcetemplate_footer(); | ||
|
|
||
| dsd = acpi_dp_new_table("_DSD"); | ||
| /* | ||
| * This GPIO is used to select DMIC0 or DMIC1 by the kernel driver. It does not | ||
| * really have a polarity since low and high control the selection of DMIC and | ||
| * hence does not have an active polarity. | ||
| * Kernel driver does not use the polarity field and instead treats the GPIO | ||
| * selection as follows: | ||
| * Set low (0) = Select DMIC0 | ||
| * Set high (1) = Select DMIC1 | ||
| */ | ||
| acpi_dp_add_gpio(dsd, "dmic-gpios", path, | ||
| 0, /* Index = 0 (There is a single GPIO entry in _CRS). */ | ||
| 0, /* Pin = 0 (There is a single pin in the GPIO resource). */ | ||
| 0); /* Active low = 0 (Kernel driver does not use active polarity). */ | ||
| acpi_dp_write(dsd); | ||
|
|
||
| acpigen_pop_len(); /* Device */ | ||
| acpigen_pop_len(); /* Scope */ | ||
|
|
||
| printk(BIOS_INFO, "%s: %s at %s\n", path, AMD_I2S_ACPI_DESC, dev_path(dev)); | ||
| } | ||
|
|
||
| static const char *i2s_machine_dev_acpi_name(const struct device *dev) | ||
| { | ||
| static char name[5]; | ||
| snprintf(name, sizeof(name), "I2S%X", dev->path.generic.id); | ||
| return name; | ||
| } | ||
|
|
||
| static struct device_operations i2s_machine_dev_ops = { | ||
| .read_resources = noop_read_resources, | ||
| .set_resources = noop_set_resources, | ||
| .acpi_name = i2s_machine_dev_acpi_name, | ||
| .acpi_fill_ssdt = i2s_machine_dev_fill_ssdt, | ||
| }; | ||
|
|
||
| static void i2s_machine_dev_enable(struct device *dev) | ||
| { | ||
| dev->ops = &i2s_machine_dev_ops; | ||
| } | ||
|
|
||
| struct chip_operations drivers_amd_i2s_machine_dev_ops = { | ||
| CHIP_NAME("AMD I2S Machine Device") | ||
| .enable_dev = i2s_machine_dev_enable | ||
| }; |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,2 +1,2 @@ | ||
| subdirs-y += conn | ||
| ramstage-$(CONFIG_DRIVERS_INTEL_PMC) += mux.c |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| ramstage-$(CONFIG_DRIVERS_INTEL_PMC) += conn.c |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -8,7 +8,6 @@ | |
| * is still in the preboot phase. | ||
| * | ||
| */ | ||
| /* | ||
| * ptt_active | ||
| * | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,112 @@ | ||
| /* SPDX-License-Identifier: GPL-2.0-only */ | ||
|
|
||
| #include <console/console.h> | ||
| #include <device/pnp.h> | ||
| #include <delay.h> | ||
| #include <timer.h> | ||
|
|
||
| #include "ipmi_kcs.h" | ||
| #include "chip.h" | ||
|
|
||
| static int ipmi_get_bmc_self_test_result(const struct device *dev, | ||
| struct ipmi_selftest_rsp *rsp) | ||
| { | ||
| int ret; | ||
|
|
||
| ret = ipmi_kcs_message(dev->path.pnp.port, IPMI_NETFN_APPLICATION, 0, | ||
| IPMI_BMC_GET_SELFTEST_RESULTS, NULL, 0, (u8 *)rsp, | ||
| sizeof(*rsp)); | ||
|
|
||
| if (ret < sizeof(struct ipmi_rsp) || rsp->resp.completion_code) { | ||
| printk(BIOS_ERR, "IPMI: %s command failed (ret=%d resp=0x%x)\n", | ||
| __func__, ret, rsp->resp.completion_code); | ||
| return 1; | ||
| } | ||
| if (ret != sizeof(*rsp)) { | ||
| printk(BIOS_ERR, "IPMI: %s response truncated\n", __func__); | ||
| return 1; | ||
| } | ||
|
|
||
| return 0; | ||
| } | ||
|
|
||
| enum cb_err ipmi_kcs_premem_init(const u16 port, const u16 device) | ||
| { | ||
| const struct drivers_ipmi_config *conf = NULL; | ||
| struct ipmi_selftest_rsp selftestrsp = {0}; | ||
| uint8_t retry_count; | ||
| const struct device *dev; | ||
|
|
||
| /* Find IPMI PNP device from devicetree in romstage */ | ||
| dev = dev_find_slot_pnp(port, device); | ||
|
|
||
| if (!dev) { | ||
| printk(BIOS_ERR, "IPMI: Cannot find PNP device port: %x, device %x\n", | ||
| port, device); | ||
| return CB_ERR; | ||
| } | ||
| if (!dev->enabled) { | ||
| printk(BIOS_ERR, "IPMI: device is not enabled\n"); | ||
| return CB_ERR; | ||
| } | ||
| printk(BIOS_DEBUG, "IPMI: romstage PNP KCS 0x%x\n", dev->path.pnp.port); | ||
| if (dev->chip_info) | ||
| conf = dev->chip_info; | ||
|
|
||
| if (conf && conf->wait_for_bmc && conf->bmc_boot_timeout) { | ||
| struct stopwatch sw; | ||
| stopwatch_init_msecs_expire(&sw, conf->bmc_boot_timeout * 1000); | ||
| printk(BIOS_DEBUG, "IPMI: Waiting for BMC...\n"); | ||
|
|
||
| while (!stopwatch_expired(&sw)) { | ||
| if (inb(dev->path.pnp.port) != 0xff) | ||
| break; | ||
| mdelay(100); | ||
| } | ||
| if (stopwatch_expired(&sw)) { | ||
| printk(BIOS_INFO, "IPMI: Waiting for BMC timed out\n"); | ||
| return CB_ERR; | ||
| } | ||
| } | ||
|
|
||
| printk(BIOS_INFO, "Get BMC self test result..."); | ||
| if (conf && conf->bmc_boot_timeout) { | ||
| for (retry_count = 0; retry_count < conf->bmc_boot_timeout; retry_count++) { | ||
| if (!ipmi_get_bmc_self_test_result(dev, &selftestrsp)) | ||
| break; | ||
|
|
||
| mdelay(1000); | ||
| } | ||
| } else { | ||
| /* At least run once */ | ||
| ipmi_get_bmc_self_test_result(dev, &selftestrsp); | ||
| } | ||
|
|
||
| int ret = CB_ERR; | ||
| switch (selftestrsp.result) { | ||
| case IPMI_APP_SELFTEST_NO_ERROR: /* 0x55 */ | ||
| printk(BIOS_DEBUG, "No Error\n"); | ||
| ret = CB_SUCCESS; | ||
| break; | ||
| case IPMI_APP_SELFTEST_NOT_IMPLEMENTED: /* 0x56 */ | ||
| printk(BIOS_DEBUG, "Function Not Implemented\n"); | ||
| ret = CB_SUCCESS; | ||
| break; | ||
| case IPMI_APP_SELFTEST_ERROR: /* 0x57 */ | ||
| printk(BIOS_ERR, "Corrupted or inaccessible data or device\n"); | ||
| break; | ||
| case IPMI_APP_SELFTEST_FATAL_HW_ERROR: /* 0x58 */ | ||
| printk(BIOS_ERR, "Fatal Hardware Error\n"); | ||
| break; | ||
| case IPMI_APP_SELFTEST_RESERVED: /* 0xFF */ | ||
| printk(BIOS_DEBUG, "Reserved\n"); | ||
| ret = CB_SUCCESS; | ||
| break; | ||
|
|
||
| default: /* Other Device Specific Hardware Error */ | ||
| printk(BIOS_ERR, "Device Specific Error 0x%x 0x%x\n", selftestrsp.result, | ||
| selftestrsp.param); | ||
| break; | ||
| } | ||
| return ret; | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,6 +1,5 @@ | ||
| /* SPDX-License-Identifier: GPL-2.0-only */ | ||
|
|
||
| #include <option.h> | ||
| #include <device/device.h> | ||
|
|
||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,12 @@ | ||
| config OCP_DMI | ||
| bool | ||
| default n | ||
| depends on IPMI_KCS && GENERATE_SMBIOS_TABLES && XEON_SP_COMMON_BASE | ||
| help | ||
| It implements the SMBIOS IPMI FRU mapping table defined in | ||
| https://www.opencompute.org/documents/facebook-xeon-motherboard-v31 | ||
| 22.3 SMBIOS FRU mapping table | ||
|
|
||
| config FRU_DEVICE_ID | ||
| int | ||
| default 0 |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| ramstage-$(CONFIG_OCP_DMI) += smbios.c |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,20 @@ | ||
| /* SPDX-License-Identifier: GPL-2.0-or-later */ | ||
|
|
||
| #ifndef __OCP_DMI_H | ||
| #define __OCP_DMI_H | ||
|
|
||
| #include <cpu/x86/msr.h> | ||
| #include <device/device.h> | ||
| #include <smbios.h> | ||
|
|
||
| #define TBF "To Be Filled By O.E.M." | ||
|
|
||
| extern msr_t xeon_sp_ppin[]; | ||
|
|
||
| /* Override SMBIOS type 11 OEM string 1 to string 6 */ | ||
| void ocp_oem_smbios_strings(struct device *dev, struct smbios_type11 *t); | ||
|
|
||
| /* This function allows adding the same repeated string to the table */ | ||
| int smbios_add_oem_string(u8 *start, const char *str); | ||
|
|
||
| #endif |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,260 @@ | ||
| /* SPDX-License-Identifier: GPL-2.0-or-later */ | ||
|
|
||
| #include <console/console.h> | ||
| #include <device/device.h> | ||
| #include <drivers/ipmi/ipmi_ops.h> | ||
| #include <delay.h> | ||
| #include <cpu/x86/mp.h> | ||
| #include <timer.h> | ||
| #include <stdio.h> | ||
| #include <string.h> | ||
| #include <soc/soc_util.h> | ||
| #include <soc/cpu.h> | ||
| #include <smbios.h> | ||
|
|
||
| #include "ocp_dmi.h" | ||
|
|
||
| #define PPIN_STR_LEN 17 | ||
|
|
||
| struct fru_info_str fru_strings = {0}; | ||
| /* The spec defines only at most 2 sockets */ | ||
| msr_t xeon_sp_ppin[2] = {0}; | ||
| static bool remote_ppin_done = false; | ||
|
|
||
| /* Override SMBIOS type 1 data. */ | ||
| const char *smbios_system_manufacturer(void) | ||
| { | ||
| if (fru_strings.prod_info.manufacturer != NULL) | ||
| return (const char *)fru_strings.prod_info.manufacturer; | ||
| else | ||
| return CONFIG_MAINBOARD_SMBIOS_MANUFACTURER; | ||
| } | ||
|
|
||
| const char *smbios_system_product_name(void) | ||
| { | ||
| if (fru_strings.board_info.product_name != NULL) | ||
| return (const char *)fru_strings.prod_info.product_name; | ||
| else | ||
| return CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME; | ||
| } | ||
|
|
||
| const char *smbios_system_serial_number(void) | ||
| { | ||
| if (fru_strings.prod_info.serial_number != NULL) | ||
| return (const char *)fru_strings.prod_info.serial_number; | ||
| else | ||
| return CONFIG_MAINBOARD_SERIAL_NUMBER; | ||
| } | ||
|
|
||
| const char *smbios_system_version(void) | ||
| { | ||
| if (fru_strings.prod_info.product_version != NULL) | ||
| return (const char *)fru_strings.prod_info.product_version; | ||
| else | ||
| return CONFIG_MAINBOARD_VERSION; | ||
| } | ||
|
|
||
| /* Override SMBIOS type 1 uuid from the value from BMC. */ | ||
| void smbios_system_set_uuid(u8 *uuid) | ||
| { | ||
| ipmi_get_system_guid(CONFIG_BMC_KCS_BASE, uuid); | ||
| } | ||
|
|
||
| /* Override SMBIOS type 2 data. */ | ||
| const char *smbios_mainboard_version(void) | ||
| { | ||
| if (fru_strings.board_info.part_number != NULL) | ||
| return (const char *)fru_strings.board_info.part_number; | ||
| else | ||
| return CONFIG_MAINBOARD_VERSION; | ||
| } | ||
|
|
||
| const char *smbios_mainboard_manufacturer(void) | ||
| { | ||
| if (fru_strings.board_info.manufacturer != NULL) | ||
| return (const char *)fru_strings.board_info.manufacturer; | ||
| else | ||
| return CONFIG_MAINBOARD_SMBIOS_MANUFACTURER; | ||
| } | ||
|
|
||
| const char *smbios_mainboard_product_name(void) | ||
| { | ||
| if (fru_strings.board_info.product_name != NULL) | ||
| return (const char *)fru_strings.board_info.product_name; | ||
| else | ||
| return CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME; | ||
| } | ||
|
|
||
| const char *smbios_mainboard_serial_number(void) | ||
| { | ||
| if (fru_strings.board_info.serial_number != NULL) | ||
| return (const char *)fru_strings.board_info.serial_number; | ||
| else | ||
| return CONFIG_MAINBOARD_SERIAL_NUMBER; | ||
| } | ||
|
|
||
| /* Override SMBIOS type 2 and 3 asset_tag data. */ | ||
| const char *smbios_mainboard_asset_tag(void) | ||
| { | ||
| if (fru_strings.prod_info.asset_tag != NULL) | ||
| return (const char *)fru_strings.prod_info.asset_tag; | ||
| else | ||
| return ""; | ||
| } | ||
|
|
||
| /* Override SMBIOS type 3 data. */ | ||
| smbios_enclosure_type smbios_mainboard_enclosure_type(void) | ||
| { | ||
| /* SMBIOS System Enclosure or Chassis Types are values from 0 to 20h. */ | ||
| if (fru_strings.chassis_info.chassis_type <= 0x20) | ||
| return fru_strings.chassis_info.chassis_type; | ||
| else | ||
| return SMBIOS_ENCLOSURE_RACK_MOUNT_CHASSIS; | ||
| } | ||
|
|
||
| const char *smbios_chassis_version(void) | ||
| { | ||
| if (fru_strings.chassis_info.chassis_partnumber != NULL) | ||
| return fru_strings.chassis_info.chassis_partnumber; | ||
| else | ||
| return ""; | ||
| } | ||
|
|
||
| const char *smbios_chassis_serial_number(void) | ||
| { | ||
| if (fru_strings.chassis_info.serial_number != NULL) | ||
| return fru_strings.chassis_info.serial_number; | ||
| else | ||
| return ""; | ||
| } | ||
|
|
||
| /* Override SMBIOS type 4 processor serial numbers from FRU Chassis custom data. */ | ||
| const char *smbios_processor_serial_number(void) | ||
| { | ||
| /* For now type 4 only creates for one CPU, so it can only write the serial number | ||
| * of CPU0. | ||
| */ | ||
| if (*fru_strings.chassis_info.chassis_custom != NULL) | ||
| return *fru_strings.chassis_info.chassis_custom; | ||
| else | ||
| return ""; | ||
| } | ||
|
|
||
| static void read_remote_ppin(void *data) | ||
| { | ||
| *(msr_t *)data = read_msr_ppin(); | ||
| remote_ppin_done = true; | ||
| } | ||
|
|
||
| static void wait_for_remote_ppin(void) | ||
| { | ||
| struct stopwatch sw; | ||
|
|
||
| stopwatch_init_msecs_expire(&sw, 500); | ||
| while (!stopwatch_expired(&sw)) { | ||
| if (remote_ppin_done) | ||
| break; | ||
| mdelay(100); | ||
| } | ||
| if (stopwatch_expired(&sw)) | ||
| printk(BIOS_ERR, "Wait for read_remote_ppin() timeout\n"); | ||
| } | ||
|
|
||
| int smbios_add_oem_string(u8 *start, const char *str) | ||
| { | ||
| int i = 1; | ||
| char *p = (char *)start; | ||
|
|
||
| if (*str == '\0') | ||
| return 0; | ||
|
|
||
| for (;;) { | ||
| if (!*p) { | ||
| strcpy(p, str); | ||
| p += strlen(str); | ||
| *p++ = '\0'; | ||
| *p++ = '\0'; | ||
| return i; | ||
| } | ||
|
|
||
| p += strlen(p)+1; | ||
| i++; | ||
| } | ||
| } | ||
|
|
||
| /* When the most significant 4 bits of PPIN hi/lo are 0, add '0' to the beginning */ | ||
| static void ppin_string_fixup(int i, char *ppin) | ||
| { | ||
| if ((xeon_sp_ppin[i].hi & 0xf0000000) == 0) { | ||
| if ((xeon_sp_ppin[i].lo & 0xf0000000) == 0) | ||
| snprintf(ppin, PPIN_STR_LEN, "0%x0%x", xeon_sp_ppin[i].hi, | ||
| xeon_sp_ppin[i].lo); | ||
| else | ||
| snprintf(ppin, PPIN_STR_LEN, "0%x%x", xeon_sp_ppin[i].hi, | ||
| xeon_sp_ppin[i].lo); | ||
| } else if ((xeon_sp_ppin[i].lo & 0xf0000000) == 0) { | ||
| snprintf(ppin, PPIN_STR_LEN, "%x0%x", xeon_sp_ppin[i].hi, xeon_sp_ppin[i].lo); | ||
| } else { | ||
| snprintf(ppin, PPIN_STR_LEN, "%x%x", xeon_sp_ppin[i].hi, xeon_sp_ppin[i].lo); | ||
| } | ||
| } | ||
|
|
||
| /* | ||
| * Override SMBIOS type 11 OEM string 1 to string 6, the rest are project dependent | ||
| * and can be added in the mainboard code. | ||
| */ | ||
| void ocp_oem_smbios_strings(struct device *dev, struct smbios_type11 *t) | ||
| { | ||
| char ppin[PPIN_STR_LEN]; | ||
|
|
||
| /* Add OEM string 1 to 4 */ | ||
| if (fru_strings.board_info.custom_count > 0 && | ||
| *fru_strings.board_info.board_custom != NULL) | ||
| t->count = smbios_add_oem_string(t->eos, *fru_strings.board_info.board_custom); | ||
| else | ||
| t->count = smbios_add_oem_string(t->eos, TBF); | ||
|
|
||
| if (fru_strings.prod_info.custom_count > 0 && | ||
| *fru_strings.prod_info.product_custom != NULL) | ||
| t->count = smbios_add_oem_string(t->eos, *fru_strings.prod_info.product_custom); | ||
| else | ||
| t->count = smbios_add_oem_string(t->eos, TBF); | ||
|
|
||
| if (fru_strings.prod_info.custom_count > 1 && | ||
| *(fru_strings.prod_info.product_custom + 1) != NULL) | ||
| t->count = smbios_add_oem_string(t->eos, | ||
| *(fru_strings.prod_info.product_custom + 1)); | ||
| else | ||
| t->count = smbios_add_oem_string(t->eos, TBF); | ||
|
|
||
| if (fru_strings.prod_info.custom_count > 2 && | ||
| *(fru_strings.prod_info.product_custom + 2) != NULL) { | ||
| t->count = smbios_add_oem_string(t->eos, | ||
| *(fru_strings.prod_info.product_custom + 2)); | ||
| } else { | ||
| t->count = smbios_add_oem_string(t->eos, TBF); | ||
| } | ||
|
|
||
| /* Add CPU0 PPIN to OEM string 5 */ | ||
| xeon_sp_ppin[0] = read_msr_ppin(); | ||
| ppin_string_fixup(0, ppin); | ||
| t->count = smbios_add_oem_string(t->eos, ppin); | ||
|
|
||
| /* Add CPU1 PPIN to OEM string 6 */ | ||
| if (CONFIG_MAX_SOCKET == 2 && CONFIG(PARALLEL_MP_AP_WORK)) { | ||
| /* Read the last CPU MSR */ | ||
| if (mp_run_on_aps(read_remote_ppin, (void *)&xeon_sp_ppin[1], | ||
| get_platform_thread_count() - 1, 100 * USECS_PER_MSEC)) { | ||
| printk(BIOS_ERR, "Failed to read remote PPIN.\n"); | ||
| t->count = smbios_add_oem_string(t->eos, TBF); | ||
| } else { | ||
| /* Wait for read_remote_ppin() to finish because it's executed | ||
| in parallel */ | ||
| wait_for_remote_ppin(); | ||
| ppin_string_fixup(1, ppin); | ||
| t->count = smbios_add_oem_string(t->eos, ppin); | ||
| } | ||
| } else { | ||
| t->count = smbios_add_oem_string(t->eos, "0000"); | ||
| } | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -2,7 +2,6 @@ | |
|
|
||
| #include <arch/io.h> | ||
| #include <console/spkmodem.h> | ||
|
|
||
| #define SPEAKER_PIT_FREQUENCY 0x1234dd | ||
|
|
||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,4 +1,4 @@ | ||
| verstage-$(CONFIG_MAINBOARD_HAS_LPC_TPM) += tis.c | ||
| romstage-$(CONFIG_MAINBOARD_HAS_LPC_TPM) += tis.c | ||
| ramstage-$(CONFIG_MAINBOARD_HAS_LPC_TPM) += tis.c | ||
| postcar-$(CONFIG_MAINBOARD_HAS_LPC_TPM) += tis.c |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,6 @@ | ||
| config DRIVERS_USB_PCI_XHCI | ||
| def_bool n | ||
| depends on HAVE_ACPI_TABLES | ||
| select XHCI_UTILS | ||
| help | ||
| PCI driver that generates ACPI nodes for an xHCI compatible controller. |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| ramstage-$(CONFIG_DRIVERS_USB_PCI_XHCI) += pci_xhci.c |