Compare commits

...

7 Commits

Author SHA1 Message Date
Tim Crawford
f615ba1c4e [WIP] ec/system76/ec: Implement USB-C DP HPD
Change-Id: I0487b761a5a83b0a1897c92416d0d81219303341
Signed-off-by: Tim Crawford <tcrawford@system76.com>
2024-06-13 11:21:27 -06:00
Tim Crawford
3a205fc0bf mb/system76/adl,rpl: Enable TCSS USB/Display detection
Change-Id: I9d06c1e4e84655cb78175a7b011bbca2e01403a9
Signed-off-by: Tim Crawford <tcrawford@system76.com>
2024-06-13 11:21:27 -06:00
Tim Crawford
1e9f75af51 [WIP] ec/system76/ec: Implement usbc_get_ops
Change-Id: Icee0661ec0d0c949b73503e639dd8a461c05235a
Signed-off-by: Tim Crawford <tcrawford@system76.com>
2024-06-13 11:21:27 -06:00
Tim Crawford
d267490a6f include/device: Add missing headers to usbc_mux.h
Add the headers for using bool and uint8_t.

Change-Id: Ie1a2a482145a7ca02fb306e385538894807a6ad6
Signed-off-by: Tim Crawford <tcrawford@system76.com>
2024-06-13 11:21:26 -06:00
Sean Rhodes
019baecda0 soc/intel/alderlake: Set UsbTcPortEn based on tcss_port[x]
UsbTcPortEn is configured based on pointers to tcss_usb3_port1,
which is part of the ACPI driver.

This is illogical, as the port might need to be enabled, and
the ACPI not needed or included. Change this so it's configured
based on the tcss_port[x] in devicetree.

Tested by connecting a USB 3.0 hub, and checking that Linux
correctly identifies a new USB 3.0 device.

Change-Id: I07ef0759057f7f40210766a73643c9ccf1dc986d
Signed-off-by: Sean Rhodes <sean@starlabs.systems>
2024-06-12 17:22:01 -06:00
Tim Crawford
792996fc8c mb/system76/tgl: Update VBT to version 250
Commit 4c7e97b26a ("Update fsp submodule to upstream master branch")
included an update to the VBT from 240 to 250, breaking parsing of
existing VBTs.

Generate blobs for the new version using Intel Display Configuration
Tool (DisCon) v3.3.

Change-Id: I918356d9f660b985ee4408ef77544fbd071ab35f
Signed-off-by: Tim Crawford <tcrawford@system76.com>
2024-05-21 14:30:46 -06:00
Jeremy Soller
f65d2abb06 Add lemp13-b
Change-Id: Icc82c47f5e9e6885e9d31878c26d471d06e11c34
Signed-off-by: Jeremy Soller <jackpot51@gmail.com>
2024-05-17 08:35:04 -06:00
14 changed files with 156 additions and 11 deletions

View File

@@ -5,6 +5,7 @@ all-y += system76_ec.c
ramstage-y += smbios.c
ramstage-$(CONFIG_EC_SYSTEM76_EC_LOCKDOWN) += lockdown.c
ramstage-y += usbc_mux.c
smm-$(CONFIG_DEBUG_SMI) += system76_ec.c

View File

@@ -0,0 +1,132 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#include "system76_ec.h"
#include <console/console.h>
#include <delay.h>
#include <device/usbc_mux.h>
#include <timer.h>
#include <types.h>
#define CMD_USBC_MUX_INFO 23
enum usbc_mux_flags {
USBC_MUX_DP = BIT(0),
USBC_MUX_USB = BIT(1),
USBC_MUX_CABLE = BIT(2),
USBC_MUX_POLARITY = BIT(3),
USBC_MUX_HPD_LVL = BIT(4),
USBC_MUX_HPD_IRQ = BIT(5),
USBC_MUX_UFP = BIT(6),
USBC_MUX_DBG_ACC = BIT(7),
};
static int system76_ec_get_mux_info(int port, struct usbc_mux_info *info)
{
uint8_t request[1] = { port };
uint8_t reply[3] = { 0 };
uint8_t flags;
uint8_t pin_mode;
bool res;
if (!info)
return -1;
res = system76_ec_cmd(CMD_USBC_MUX_INFO, request, ARRAY_SIZE(request),
reply, ARRAY_SIZE(reply));
if (!res)
return -1;
flags = reply[1];
pin_mode = reply[2];
info->dp = !!(flags & USBC_MUX_DP);
info->usb = !!(flags & USBC_MUX_USB);
info->cable = !!(flags & USBC_MUX_CABLE);
info->polarity = !!(flags & USBC_MUX_POLARITY);
info->hpd_lvl = !!(flags & USBC_MUX_HPD_LVL);
info->hpd_irq = !!(flags & USBC_MUX_HPD_IRQ);
info->ufp = !!(flags & USBC_MUX_UFP);
info->dbg_acc = !!(flags & USBC_MUX_DBG_ACC);
info->dp_pin_mode = pin_mode;
printk(BIOS_SPEW, "%s: dp=%u, usb=%u\n", __func__, info->dp, info->usb);
printk(BIOS_SPEW, "%s: cable=%u, polarity=%u\n", __func__, info->cable, info->polarity);
printk(BIOS_SPEW, "%s: hpd_lvl=%u, hpd_irq=%u\n", __func__, info->hpd_lvl, info->hpd_irq);
printk(BIOS_SPEW, "%s: ufp=%u, dbg_acc=%u\n", __func__, info->ufp, info->dbg_acc);
printk(BIOS_SPEW, "%s: pin_mode=0x%x\n", __func__, info->dp_pin_mode);
return 0;
}
static int system76_ec_wait_for_connection(long timeout_ms)
{
// TODO
return 1;
}
static int system76_ec_enter_dp_mode(int port)
{
// TODO
return 0;
}
static int system76_ec_wait_for_dp_mode_entry(int port, long timeout_ms)
{
struct usbc_mux_info info;
if (system76_ec_get_mux_info(port, &info) < 0) {
printk(BIOS_WARNING, "%s: could not get usbc mux info\n", __func__);
return -1;
}
if (!info.dp) {
printk(BIOS_WARNING, "DP mode not ready\n");
return -1;
}
return 0;
}
static int system76_ec_wait_for_hpd(int port, long timeout_ms)
{
struct usbc_mux_info info;
struct stopwatch sw;
stopwatch_init_msecs_expire(&sw, timeout_ms);
while (1) {
if (system76_ec_get_mux_info(port, &info) < 0) {
printk(BIOS_WARNING, "%s: could not get usbc mux info\n", __func__);
return -1;
}
if (info.hpd_lvl)
break;
if (stopwatch_expired(&sw)) {
printk(BIOS_WARNING, "HPD not ready after %ldms\n", timeout_ms);
return -1;
}
mdelay(100);
}
printk(BIOS_INFO, "HPD ready after %lldms\n", stopwatch_duration_msecs(&sw));
return 0;
}
static const struct usbc_ops system76_ec_usbc_ops = {
.mux_ops = {
.get_mux_info = system76_ec_get_mux_info,
},
.dp_ops = {
.wait_for_connection = system76_ec_wait_for_connection,
.enter_dp_mode = system76_ec_enter_dp_mode,
.wait_for_dp_mode_entry = system76_ec_wait_for_dp_mode_entry,
.wait_for_hpd = system76_ec_wait_for_hpd,
},
};
const struct usbc_ops *usbc_get_ops(void)
{
return &system76_ec_usbc_ops;
}

View File

@@ -3,6 +3,9 @@
#ifndef __USBC_MUX_H__
#define __USBC_MUX_H__
#include <stdbool.h>
#include <stdint.h>
/* struct to hold all USB-C mux related variables */
struct usbc_mux_info {
bool dp; /* DP connected */

View File

@@ -11,6 +11,8 @@ config BOARD_SYSTEM76_ADL_COMMON
select DRIVERS_INTEL_USB4_RETIMER
select EC_SYSTEM76_EC
select EC_SYSTEM76_EC_LOCKDOWN
select ENABLE_TCSS_DISPLAY_DETECTION
select ENABLE_TCSS_USB_DETECTION
select HAVE_ACPI_RESUME
select HAVE_ACPI_TABLES
select HAVE_CMOS_DEFAULT

View File

@@ -45,6 +45,13 @@ config BOARD_SYSTEM76_LEMP13
select SOC_INTEL_METEORLAKE_U_H
select SOC_INTEL_ENABLE_USB4_PCIE_RESOURCES
config BOARD_SYSTEM76_LEMP13_B
select BOARD_SYSTEM76_MTL_COMMON
select DRIVERS_I2C_TAS5825M
select HAVE_SPD_IN_CBFS
select SOC_INTEL_METEORLAKE_U_H
select SOC_INTEL_ENABLE_USB4_PCIE_RESOURCES
if BOARD_SYSTEM76_MTL_COMMON
config MAINBOARD_DIR
@@ -52,7 +59,7 @@ config MAINBOARD_DIR
config VARIANT_DIR
default "darp10" if BOARD_SYSTEM76_DARP10 || BOARD_SYSTEM76_DARP10_B
default "lemp13" if BOARD_SYSTEM76_LEMP13
default "lemp13" if BOARD_SYSTEM76_LEMP13 || BOARD_SYSTEM76_LEMP13_B
config OVERRIDE_DEVICETREE
default "variants/\$(CONFIG_VARIANT_DIR)/overridetree.cb"
@@ -61,15 +68,17 @@ config MAINBOARD_PART_NUMBER
default "darp10" if BOARD_SYSTEM76_DARP10
default "darp10-b" if BOARD_SYSTEM76_DARP10_B
default "lemp13" if BOARD_SYSTEM76_LEMP13
default "lemp13-b" if BOARD_SYSTEM76_LEMP13_B
config MAINBOARD_SMBIOS_PRODUCT_NAME
default "Darter Pro" if BOARD_SYSTEM76_DARP10 || BOARD_SYSTEM76_DARP10_B
default "Lemur Pro" if BOARD_SYSTEM76_LEMP13
default "Lemur Pro" if BOARD_SYSTEM76_LEMP13 || BOARD_SYSTEM76_LEMP13_B
config MAINBOARD_VERSION
default "darp10" if BOARD_SYSTEM76_DARP10
default "darp10-b" if BOARD_SYSTEM76_DARP10_B
default "lemp13" if BOARD_SYSTEM76_LEMP13
default "lemp13-b" if BOARD_SYSTEM76_LEMP13_B
config CMOS_DEFAULT_FILE
default "src/mainboard/\$(MAINBOARDDIR)/cmos.default"

View File

@@ -8,3 +8,6 @@ config BOARD_SYSTEM76_DARP10_B
config BOARD_SYSTEM76_LEMP13
bool "lemp13"
config BOARD_SYSTEM76_LEMP13_B
bool "lemp13-b"

View File

@@ -9,6 +9,8 @@ config BOARD_SYSTEM76_RPL_COMMON
select DRIVERS_I2C_HID
select EC_SYSTEM76_EC
select EC_SYSTEM76_EC_LOCKDOWN
select ENABLE_TCSS_DISPLAY_DETECTION
select ENABLE_TCSS_USB_DETECTION
select HAVE_ACPI_RESUME
select HAVE_ACPI_TABLES
select HAVE_CMOS_DEFAULT

View File

@@ -652,13 +652,6 @@ WEAK_DEV_PTR(tcss_usb3_port4);
static void fill_fsps_tcss_params(FSP_S_CONFIG *s_cfg,
const struct soc_intel_alderlake_config *config)
{
const struct device *tcss_port_arr[] = {
DEV_PTR(tcss_usb3_port1),
DEV_PTR(tcss_usb3_port2),
DEV_PTR(tcss_usb3_port3),
DEV_PTR(tcss_usb3_port4),
};
s_cfg->TcssAuxOri = config->tcss_aux_ori;
/* Explicitly clear this field to avoid using defaults */
@@ -676,8 +669,8 @@ static void fill_fsps_tcss_params(FSP_S_CONFIG *s_cfg,
s_cfg->D3ColdEnable = CONFIG(D3COLD_SUPPORT);
s_cfg->UsbTcPortEn = 0;
for (int i = 0; i < MAX_TYPE_C_PORTS; i++) {
if (is_dev_enabled(tcss_port_arr[i]))
for (int i = 0; i < ARRAY_SIZE(config->tcss_ports); i++) {
if (config->tcss_ports[i].enable)
s_cfg->UsbTcPortEn |= BIT(i);
}