diff options
Diffstat (limited to 'src/soc/intel')
-rw-r--r-- | src/soc/intel/skylake/chip.c | 45 | ||||
-rw-r--r-- | src/soc/intel/skylake/chip.h | 13 | ||||
-rw-r--r-- | src/soc/intel/skylake/include/soc/usb.h | 167 |
3 files changed, 195 insertions, 30 deletions
diff --git a/src/soc/intel/skylake/chip.c b/src/soc/intel/skylake/chip.c index 2613d38474..44f247fb52 100644 --- a/src/soc/intel/skylake/chip.c +++ b/src/soc/intel/skylake/chip.c @@ -275,28 +275,33 @@ void soc_silicon_init_params(SILICON_INIT_UPD *params) memcpy(params->SerialIoDevMode, config->SerialIoDevMode, sizeof(params->SerialIoDevMode)); - memcpy(params->PortUsb20Enable, config->PortUsb20Enable, - sizeof(params->PortUsb20Enable)); - memcpy(params->PortUsb30Enable, config->PortUsb30Enable, - sizeof(params->PortUsb30Enable)); - memcpy(params->Usb2AfePetxiset, config->Usb2AfePetxiset, - sizeof(params->Usb2AfePetxiset)); - memcpy(params->Usb2AfeTxiset, config->Usb2AfeTxiset, - sizeof(params->Usb2AfeTxiset)); - memcpy(params->Usb2AfePredeemp, config->Usb2AfePredeemp, - sizeof(params->Usb2AfePredeemp)); - memcpy(params->Usb2AfePehalfbit, config->Usb2AfePehalfbit, - sizeof(params->Usb2AfePehalfbit)); + for (i = 0; i < ARRAY_SIZE(config->usb2_ports); i++) { + params->PortUsb20Enable[i] = + config->usb2_ports[i].enable; + params->Usb2AfePetxiset[i] = + config->usb2_ports[i].pre_emp_bias; + params->Usb2AfeTxiset[i] = + config->usb2_ports[i].tx_bias; + params->Usb2AfePredeemp[i] = + config->usb2_ports[i].tx_emp_enable; + params->Usb2AfePehalfbit[i] = + config->usb2_ports[i].pre_emp_bit; + } - memcpy(params->Usb3HsioTxDeEmphEnable, config->Usb3HsioTxDeEmphEnable, - sizeof(params->Usb3HsioTxDeEmphEnable)); - memcpy(params->Usb3HsioTxDeEmph, config->Usb3HsioTxDeEmph, - sizeof(params->Usb3HsioTxDeEmph)); - memcpy(params->Usb3HsioTxDownscaleAmpEnable, config->Usb3HsioTxDownscaleAmpEnable, - sizeof(params->Usb3HsioTxDownscaleAmpEnable)); - memcpy(params->Usb3HsioTxDownscaleAmp, config->Usb3HsioTxDownscaleAmp, - sizeof(params->Usb3HsioTxDownscaleAmp)); + for (i = 0; i < ARRAY_SIZE(config->usb3_ports); i++) { + params->PortUsb30Enable[i] = config->usb3_ports[i].enable; + if (config->usb3_ports[i].tx_de_emp) { + params->Usb3HsioTxDeEmphEnable[i] = 1; + params->Usb3HsioTxDeEmph[i] = + config->usb3_ports[i].tx_de_emp; + } + if (config->usb3_ports[i].tx_downscale_amp) { + params->Usb3HsioTxDownscaleAmpEnable[i] = 1; + params->Usb3HsioTxDownscaleAmp[i] = + config->usb3_ports[i].tx_downscale_amp; + } + } params->SataSalpSupport = config->SataSalpSupport; params->SataPortsEnable[0] = config->SataPortsEnable[0]; diff --git a/src/soc/intel/skylake/chip.h b/src/soc/intel/skylake/chip.h index b54869c051..c093d91c78 100644 --- a/src/soc/intel/skylake/chip.h +++ b/src/soc/intel/skylake/chip.h @@ -28,6 +28,7 @@ #include <soc/pci_devs.h> #include <soc/pmc.h> #include <soc/serialio.h> +#include <soc/usb.h> struct soc_intel_skylake_config { /* @@ -162,18 +163,10 @@ struct soc_intel_skylake_config { u8 PcieRpClkReqNumber[20]; /* USB related */ - u8 PortUsb20Enable[16]; - u8 PortUsb30Enable[10]; + struct usb2_port_config usb2_ports[16]; + struct usb3_port_config usb3_ports[10]; u8 XdciEnable; u8 SsicPortEnable; - u8 Usb2AfePetxiset[16]; - u8 Usb2AfeTxiset[16]; - u8 Usb2AfePredeemp[16]; - u8 Usb2AfePehalfbit[16]; - u8 Usb3HsioTxDeEmphEnable[10]; - u8 Usb3HsioTxDeEmph[10]; - u8 Usb3HsioTxDownscaleAmpEnable[10]; - u8 Usb3HsioTxDownscaleAmp[10]; /* SMBus */ u8 SmbusEnable; diff --git a/src/soc/intel/skylake/include/soc/usb.h b/src/soc/intel/skylake/include/soc/usb.h new file mode 100644 index 0000000000..29b603afec --- /dev/null +++ b/src/soc/intel/skylake/include/soc/usb.h @@ -0,0 +1,167 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2015 Google Inc. + * Copyright (C) 2015 Intel Corporation. + * + * 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; version 2 of the License. + * + * 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. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc. + */ + + +#ifndef _SOC_USB_H_ +#define _SOC_USB_H_ + +#include <stdint.h> + +#define USB2_EMP_OFF 0 +#define USB2_DE_EMP_ON 1 +#define USB2_PRE_EMP_ON 2 + +#define USB2_FULL_BIT_PRE_EMP 0 +#define USB2_HALF_BIT_PRE_EMP 1 + +#define USB2_BIAS_0MV 0 +#define USB2_BIAS_11MV 1 +#define USB2_BIAS_17MV 2 +#define USB2_BIAS_28MV 3 +#define USB2_BIAS_28MV2 4 +#define USB2_BIAS_39MV 5 +#define USB2_BIAS_45MV 6 +#define USB2_BIAS_56MV 7 + +struct usb2_port_config { + uint8_t enable; + uint8_t tx_bias; + uint8_t tx_emp_enable; + uint8_t pre_emp_bias; + uint8_t pre_emp_bit; +}; + +#define USB2_PORT_EMPTY { \ + .enable = 0, \ + .tx_bias = USB2_BIAS_0MV, \ + .tx_emp_enable = USB2_EMP_OFF, \ + .pre_emp_bias = USB2_BIAS_0MV, \ + .pre_emp_bit = USB2_HALF_BIT_PRE_EMP, \ +} + +/* + * Standard USB Port based on length: + * - External + * - Back Panel + * - OTG + * - M.2 + * - Internal device down + */ + +/* 11.5"-12" */ +#define USB2_PORT_LONG { \ + .enable = 1, \ + .tx_bias = USB2_BIAS_39MV, \ + .tx_emp_enable = USB2_PRE_EMP_ON, \ + .pre_emp_bias = USB2_BIAS_56MV, \ + .pre_emp_bit = USB2_HALF_BIT_PRE_EMP, \ +} + +/* 6"-11.5" */ +#define USB2_PORT_MID { \ + .enable = 1, \ + .tx_bias = USB2_BIAS_0MV, \ + .tx_emp_enable = USB2_PRE_EMP_ON, \ + .pre_emp_bias = USB2_BIAS_56MV, \ + .pre_emp_bit = USB2_HALF_BIT_PRE_EMP, \ +} + +/* 3"-6" */ +#define USB2_PORT_SHORT { \ + .enable = 1, \ + .tx_bias = USB2_BIAS_39MV, \ + .tx_emp_enable = USB2_PRE_EMP_ON | USB2_DE_EMP_ON, \ + .pre_emp_bias = USB2_BIAS_39MV, \ + .pre_emp_bit = USB2_FULL_BIT_PRE_EMP, \ +} + +/* Type-C Port, no BC1.2 charge detect module / MUX */ +#define USB2_PORT_TYPE_C { \ + .enable = 1, \ + .tx_bias = USB2_BIAS_0MV, \ + .tx_emp_enable = USB2_PRE_EMP_ON, \ + .pre_emp_bias = USB2_BIAS_56MV, \ + .pre_emp_bit = USB2_HALF_BIT_PRE_EMP, \ +} + +/* Port with BC1.2 charge detect module / MUX */ +#define USB2_PORT_BC12_MUX { \ + .enable = 1, \ + .tx_bias = USB2_BIAS_0MV, \ + .tx_emp_enable = USB2_PRE_EMP_ON, \ + .pre_emp_bias = USB2_BIAS_56MV, \ + .pre_emp_bit = USB2_HALF_BIT_PRE_EMP, \ +} + +/* Internal Flex Cable, 3"-5" + cable + 2" card */ +#define USB2_PORT_FLEX { \ + .enable = 1, \ + .tx_bias = USB2_BIAS_0MV, \ + .tx_emp_enable = USB2_PRE_EMP_ON, \ + .pre_emp_bias = USB2_BIAS_56MV, \ + .pre_emp_bit = USB2_HALF_BIT_PRE_EMP, \ +} + +/* Docking, 3"-9" */ +#define USB2_PORT_DOCKING_LONG { \ + .enable = 1, \ + .tx_bias = USB2_BIAS_0MV, \ + .tx_emp_enable = USB2_PRE_EMP_ON, \ + .pre_emp_bias = USB2_BIAS_56MV, \ + .pre_emp_bit = USB2_HALF_BIT_PRE_EMP, \ +} + +/* Docking, 3"-6" */ +#define USB2_PORT_DOCKING_SHORT { \ + .enable = 1, \ + .tx_bias = USB2_BIAS_17MV, \ + .tx_emp_enable = USB2_PRE_EMP_ON | USB2_DE_EMP_ON, \ + .pre_emp_bias = USB2_BIAS_45MV, \ + .pre_emp_bit = USB2_FULL_BIT_PRE_EMP, \ +} + +/* 2:1 Detachable, 2"-4" on tablet + 2"-4" on base */ +#define USB2_PORT_DETACHABLE_TABLET { \ + .enable = 1, \ + .tx_bias = USB2_BIAS_17MV, \ + .tx_emp_enable = USB2_PRE_EMP_ON | USB2_DE_EMP_ON, \ + .pre_emp_bias = USB2_BIAS_45MV, \ + .pre_emp_bit = USB2_FULL_BIT_PRE_EMP, \ +} + +struct usb3_port_config { + uint8_t enable; + uint8_t tx_de_emp; + uint8_t tx_downscale_amp; +}; + +#define USB3_PORT_EMPTY { \ + .enable = 0, \ + .tx_de_emp = 0x00, \ + .tx_downscale_amp = 0x00, \ +} + +#define USB3_PORT_DEFAULT { \ + .enable = 1, \ + .tx_de_emp = 0x29, \ + .tx_downscale_amp = 0x00, \ +} + +#endif |