soc/intel/common: Add SOC specific function to get XHCI USB info

It feels appropriate to define SoC specific XHCI USB info in SoC
specific XHCI source file and an API to get that information instead of
defining it in elog source file. This will help in other situations
where the information is required.

BUG=None
BRANCH=None
TEST=Boot to ChromeOS.

Change-Id: Ie63a29a7096bfcaab87baaae947b786ab2345ed1
Signed-off-by: Karthikeyan Ramasubramanian <kramasub@google.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/34290
Reviewed-by: Paul Fagerburg <pfagerburg@chromium.org>
Reviewed-by: Furquan Shaikh <furquan@google.com>
Reviewed-by: Tim Wawrzynczak <twawrzynczak@chromium.org>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
Karthikeyan Ramasubramanian 2019-07-03 13:02:37 -06:00 committed by Patrick Georgi
parent a260215a64
commit 0f718312f1
10 changed files with 124 additions and 45 deletions

View File

@ -44,6 +44,7 @@ smm-y += smihandler.c
smm-y += spi.c smm-y += spi.c
smm-y += uart.c smm-y += uart.c
smm-y += elog.c smm-y += elog.c
smm-y += xhci.c
ramstage-$(CONFIG_HAVE_ACPI_TABLES) += acpi.c ramstage-$(CONFIG_HAVE_ACPI_TABLES) += acpi.c
ramstage-y += cpu.c ramstage-y += cpu.c
@ -67,6 +68,7 @@ ramstage-y += pmc.c
ramstage-y += reset.c ramstage-y += reset.c
ramstage-y += xdci.c ramstage-y += xdci.c
ramstage-y += sd.c ramstage-y += sd.c
ramstage-y += xhci.c
postcar-y += memmap.c postcar-y += memmap.c
postcar-y += mmap_boot.c postcar-y += mmap_boot.c

View File

@ -25,23 +25,6 @@
#include <soc/smbus.h> #include <soc/smbus.h>
#include <stdint.h> #include <stdint.h>
#define XHCI_USB2_PORT_STATUS_REG 0x480
#if CONFIG(SOC_INTEL_GLK)
#define XHCI_USB3_PORT_STATUS_REG 0x510
#define XHCI_USB2_PORT_NUM 9
#else
#define XHCI_USB3_PORT_STATUS_REG 0x500
#define XHCI_USB2_PORT_NUM 8
#endif
#define XHCI_USB3_PORT_NUM 7
static const struct xhci_usb_info usb_info = {
.usb2_port_status_reg = XHCI_USB2_PORT_STATUS_REG,
.num_usb2_ports = XHCI_USB2_PORT_NUM,
.usb3_port_status_reg = XHCI_USB3_PORT_STATUS_REG,
.num_usb3_ports = XHCI_USB3_PORT_NUM,
};
static void pch_log_gpio_gpe(u32 gpe0_sts, u32 gpe0_en, int start) static void pch_log_gpio_gpe(u32 gpe0_sts, u32 gpe0_en, int start)
{ {
int i; int i;
@ -74,7 +57,7 @@ static void pch_log_wake_source(struct chipset_power_state *ps)
/* XHCI */ /* XHCI */
if (ps->gpe0_sts[GPE0_A] & XHCI_PME_STS) if (ps->gpe0_sts[GPE0_A] & XHCI_PME_STS)
pch_xhci_update_wake_event(&usb_info); pch_xhci_update_wake_event(soc_get_xhci_usb_info());
/* SMBUS Wake */ /* SMBUS Wake */
if (ps->gpe0_sts[GPE0_A] & SMB_WAK_STS) if (ps->gpe0_sts[GPE0_A] & SMB_WAK_STS)

View File

@ -0,0 +1,38 @@
/*
* This file is part of the coreboot project.
*
* Copyright 2019 Google LLC
*
* 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.
*/
#include <intelblocks/xhci.h>
#define XHCI_USB2_PORT_STATUS_REG 0x480
#if CONFIG(SOC_INTEL_GLK)
#define XHCI_USB3_PORT_STATUS_REG 0x510
#define XHCI_USB2_PORT_NUM 9
#else
#define XHCI_USB3_PORT_STATUS_REG 0x500
#define XHCI_USB2_PORT_NUM 8
#endif
#define XHCI_USB3_PORT_NUM 7
static const struct xhci_usb_info usb_info = {
.usb2_port_status_reg = XHCI_USB2_PORT_STATUS_REG,
.num_usb2_ports = XHCI_USB2_PORT_NUM,
.usb3_port_status_reg = XHCI_USB3_PORT_STATUS_REG,
.num_usb3_ports = XHCI_USB3_PORT_NUM,
};
const struct xhci_usb_info *soc_get_xhci_usb_info(void)
{
return &usb_info;
}

View File

@ -56,12 +56,14 @@ ramstage-y += systemagent.c
ramstage-y += uart.c ramstage-y += uart.c
ramstage-y += vr_config.c ramstage-y += vr_config.c
ramstage-y += sd.c ramstage-y += sd.c
ramstage-y += xhci.c
smm-y += elog.c smm-y += elog.c
smm-y += p2sb.c smm-y += p2sb.c
smm-y += pmutil.c smm-y += pmutil.c
smm-y += smihandler.c smm-y += smihandler.c
smm-y += uart.c smm-y += uart.c
smm-y += xhci.c
postcar-y += memmap.c postcar-y += memmap.c
postcar-y += pmutil.c postcar-y += pmutil.c

View File

@ -24,18 +24,6 @@
#include <soc/pci_devs.h> #include <soc/pci_devs.h>
#include <soc/pm.h> #include <soc/pm.h>
#define XHCI_USB2_PORT_STATUS_REG 0x480
#define XHCI_USB3_PORT_STATUS_REG 0x580
#define XHCI_USB2_PORT_NUM 14
#define XHCI_USB3_PORT_NUM 10
static const struct xhci_usb_info usb_info = {
.usb2_port_status_reg = XHCI_USB2_PORT_STATUS_REG,
.num_usb2_ports = XHCI_USB2_PORT_NUM,
.usb3_port_status_reg = XHCI_USB3_PORT_STATUS_REG,
.num_usb3_ports = XHCI_USB3_PORT_NUM,
};
static void pch_log_gpio_gpe(u32 gpe0_sts, u32 gpe0_en, int start) static void pch_log_gpio_gpe(u32 gpe0_sts, u32 gpe0_en, int start)
{ {
int i; int i;
@ -68,7 +56,7 @@ static void pch_log_wake_source(struct chipset_power_state *ps)
/* XHCI - "Power Management Event Bus 0" events include XHCI */ /* XHCI - "Power Management Event Bus 0" events include XHCI */
if (ps->gpe0_sts[GPE_STD] & PME_B0_STS) if (ps->gpe0_sts[GPE_STD] & PME_B0_STS)
pch_xhci_update_wake_event(&usb_info); pch_xhci_update_wake_event(soc_get_xhci_usb_info());
/* SMBUS Wake */ /* SMBUS Wake */
if (ps->gpe0_sts[GPE_STD] & SMB_WAK_STS) if (ps->gpe0_sts[GPE_STD] & SMB_WAK_STS)

View File

@ -0,0 +1,33 @@
/*
* This file is part of the coreboot project.
*
* Copyright 2019 Google LLC
*
* 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.
*/
#include <intelblocks/xhci.h>
#define XHCI_USB2_PORT_STATUS_REG 0x480
#define XHCI_USB3_PORT_STATUS_REG 0x580
#define XHCI_USB2_PORT_NUM 14
#define XHCI_USB3_PORT_NUM 10
static const struct xhci_usb_info usb_info = {
.usb2_port_status_reg = XHCI_USB2_PORT_STATUS_REG,
.num_usb2_ports = XHCI_USB2_PORT_NUM,
.usb3_port_status_reg = XHCI_USB3_PORT_STATUS_REG,
.num_usb3_ports = XHCI_USB3_PORT_NUM,
};
const struct xhci_usb_info *soc_get_xhci_usb_info(void)
{
return &usb_info;
}

View File

@ -46,4 +46,14 @@ bool pch_xhci_update_wake_event(const struct xhci_usb_info *info);
void soc_xhci_init(struct device *dev); void soc_xhci_init(struct device *dev);
/**
* soc_get_xhci_usb_info() - Get the information about USB2 & USB3 ports.
*
* This function is used to get USB ports and status register offset information
* within a XHCI controller.
*
* Return: USB ports and status register offset info for the SoC.
*/
const struct xhci_usb_info *soc_get_xhci_usb_info(void);
#endif /* SOC_INTEL_COMMON_BLOCK_XHCI_H */ #endif /* SOC_INTEL_COMMON_BLOCK_XHCI_H */

View File

@ -67,6 +67,7 @@ ramstage-y += systemagent.c
ramstage-y += thermal.c ramstage-y += thermal.c
ramstage-y += uart.c ramstage-y += uart.c
ramstage-y += vr_config.c ramstage-y += vr_config.c
ramstage-y += xhci.c
smm-y += elog.c smm-y += elog.c
smm-y += gpio.c smm-y += gpio.c
@ -74,6 +75,7 @@ smm-y += p2sb.c
smm-y += pmutil.c smm-y += pmutil.c
smm-y += smihandler.c smm-y += smihandler.c
smm-y += uart.c smm-y += uart.c
smm-y += xhci.c
postcar-y += memmap.c postcar-y += memmap.c
postcar-y += gspi.c postcar-y += gspi.c

View File

@ -39,18 +39,6 @@ static void pch_log_gpio_gpe(u32 gpe0_sts, u32 gpe0_en, int start)
} }
} }
#define XHCI_USB2_PORT_STATUS_REG 0x480
#define XHCI_USB3_PORT_STATUS_REG 0x540
#define XHCI_USB2_PORT_NUM 10
#define XHCI_USB3_PORT_NUM 6
static const struct xhci_usb_info usb_info = {
.usb2_port_status_reg = XHCI_USB2_PORT_STATUS_REG,
.num_usb2_ports = XHCI_USB2_PORT_NUM,
.usb3_port_status_reg = XHCI_USB3_PORT_STATUS_REG,
.num_usb3_ports = XHCI_USB3_PORT_NUM,
};
struct pme_status_info { struct pme_status_info {
#ifdef __SIMPLE_DEVICE__ #ifdef __SIMPLE_DEVICE__
pci_devfn_t dev; pci_devfn_t dev;
@ -76,7 +64,7 @@ static void pch_log_add_elog_event(const struct pme_status_info *info,
* USB2/3 ports. * USB2/3 ports.
*/ */
if ((info->dev == PCH_DEV_XHCI) && if ((info->dev == PCH_DEV_XHCI) &&
pch_xhci_update_wake_event(&usb_info)) pch_xhci_update_wake_event(soc_get_xhci_usb_info()))
return; return;
elog_add_event_wake(info->elog_event, 0); elog_add_event_wake(info->elog_event, 0);
@ -124,7 +112,7 @@ static void pch_log_pme_internal_wake_source(void)
* PME_STS_BIT in controller register. * PME_STS_BIT in controller register.
*/ */
if (!dev_found) if (!dev_found)
dev_found = pch_xhci_update_wake_event(&usb_info); dev_found = pch_xhci_update_wake_event(soc_get_xhci_usb_info());
if (!dev_found) if (!dev_found)
elog_add_event_wake(ELOG_WAKE_SOURCE_PME_INTERNAL, 0); elog_add_event_wake(ELOG_WAKE_SOURCE_PME_INTERNAL, 0);

View File

@ -0,0 +1,33 @@
/*
* This file is part of the coreboot project.
*
* Copyright 2019 Google LLC
*
* 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.
*/
#include <intelblocks/xhci.h>
#define XHCI_USB2_PORT_STATUS_REG 0x480
#define XHCI_USB3_PORT_STATUS_REG 0x540
#define XHCI_USB2_PORT_NUM 10
#define XHCI_USB3_PORT_NUM 6
static const struct xhci_usb_info usb_info = {
.usb2_port_status_reg = XHCI_USB2_PORT_STATUS_REG,
.num_usb2_ports = XHCI_USB2_PORT_NUM,
.usb3_port_status_reg = XHCI_USB3_PORT_STATUS_REG,
.num_usb3_ports = XHCI_USB3_PORT_NUM,
};
const struct xhci_usb_info *soc_get_xhci_usb_info(void)
{
return &usb_info;
}