cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

xhci-pci.c (23551B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * xHCI host controller driver PCI Bus Glue.
      4 *
      5 * Copyright (C) 2008 Intel Corp.
      6 *
      7 * Author: Sarah Sharp
      8 * Some code borrowed from the Linux EHCI driver.
      9 */
     10
     11#include <linux/pci.h>
     12#include <linux/slab.h>
     13#include <linux/module.h>
     14#include <linux/acpi.h>
     15#include <linux/reset.h>
     16
     17#include "xhci.h"
     18#include "xhci-trace.h"
     19#include "xhci-pci.h"
     20
     21#define SSIC_PORT_NUM		2
     22#define SSIC_PORT_CFG2		0x880c
     23#define SSIC_PORT_CFG2_OFFSET	0x30
     24#define PROG_DONE		(1 << 30)
     25#define SSIC_PORT_UNUSED	(1 << 31)
     26#define SPARSE_DISABLE_BIT	17
     27#define SPARSE_CNTL_ENABLE	0xC12C
     28
     29/* Device for a quirk */
     30#define PCI_VENDOR_ID_FRESCO_LOGIC	0x1b73
     31#define PCI_DEVICE_ID_FRESCO_LOGIC_PDK	0x1000
     32#define PCI_DEVICE_ID_FRESCO_LOGIC_FL1009	0x1009
     33#define PCI_DEVICE_ID_FRESCO_LOGIC_FL1100	0x1100
     34#define PCI_DEVICE_ID_FRESCO_LOGIC_FL1400	0x1400
     35
     36#define PCI_VENDOR_ID_ETRON		0x1b6f
     37#define PCI_DEVICE_ID_EJ168		0x7023
     38
     39#define PCI_DEVICE_ID_INTEL_LYNXPOINT_XHCI	0x8c31
     40#define PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_XHCI	0x9c31
     41#define PCI_DEVICE_ID_INTEL_WILDCATPOINT_LP_XHCI	0x9cb1
     42#define PCI_DEVICE_ID_INTEL_CHERRYVIEW_XHCI		0x22b5
     43#define PCI_DEVICE_ID_INTEL_SUNRISEPOINT_H_XHCI		0xa12f
     44#define PCI_DEVICE_ID_INTEL_SUNRISEPOINT_LP_XHCI	0x9d2f
     45#define PCI_DEVICE_ID_INTEL_BROXTON_M_XHCI		0x0aa8
     46#define PCI_DEVICE_ID_INTEL_BROXTON_B_XHCI		0x1aa8
     47#define PCI_DEVICE_ID_INTEL_APL_XHCI			0x5aa8
     48#define PCI_DEVICE_ID_INTEL_DNV_XHCI			0x19d0
     49#define PCI_DEVICE_ID_INTEL_ALPINE_RIDGE_2C_XHCI	0x15b5
     50#define PCI_DEVICE_ID_INTEL_ALPINE_RIDGE_4C_XHCI	0x15b6
     51#define PCI_DEVICE_ID_INTEL_ALPINE_RIDGE_LP_XHCI	0x15c1
     52#define PCI_DEVICE_ID_INTEL_ALPINE_RIDGE_C_2C_XHCI	0x15db
     53#define PCI_DEVICE_ID_INTEL_ALPINE_RIDGE_C_4C_XHCI	0x15d4
     54#define PCI_DEVICE_ID_INTEL_TITAN_RIDGE_2C_XHCI		0x15e9
     55#define PCI_DEVICE_ID_INTEL_TITAN_RIDGE_4C_XHCI		0x15ec
     56#define PCI_DEVICE_ID_INTEL_TITAN_RIDGE_DD_XHCI		0x15f0
     57#define PCI_DEVICE_ID_INTEL_ICE_LAKE_XHCI		0x8a13
     58#define PCI_DEVICE_ID_INTEL_CML_XHCI			0xa3af
     59#define PCI_DEVICE_ID_INTEL_TIGER_LAKE_XHCI		0x9a13
     60#define PCI_DEVICE_ID_INTEL_MAPLE_RIDGE_XHCI		0x1138
     61#define PCI_DEVICE_ID_INTEL_ALDER_LAKE_XHCI		0x461e
     62#define PCI_DEVICE_ID_INTEL_ALDER_LAKE_N_XHCI		0x464e
     63#define PCI_DEVICE_ID_INTEL_ALDER_LAKE_PCH_XHCI	0x51ed
     64#define PCI_DEVICE_ID_INTEL_RAPTOR_LAKE_XHCI		0xa71e
     65#define PCI_DEVICE_ID_INTEL_METEOR_LAKE_XHCI		0x7ec0
     66
     67#define PCI_DEVICE_ID_AMD_RENOIR_XHCI			0x1639
     68#define PCI_DEVICE_ID_AMD_PROMONTORYA_4			0x43b9
     69#define PCI_DEVICE_ID_AMD_PROMONTORYA_3			0x43ba
     70#define PCI_DEVICE_ID_AMD_PROMONTORYA_2			0x43bb
     71#define PCI_DEVICE_ID_AMD_PROMONTORYA_1			0x43bc
     72#define PCI_DEVICE_ID_AMD_YELLOW_CARP_XHCI_1		0x161a
     73#define PCI_DEVICE_ID_AMD_YELLOW_CARP_XHCI_2		0x161b
     74#define PCI_DEVICE_ID_AMD_YELLOW_CARP_XHCI_3		0x161d
     75#define PCI_DEVICE_ID_AMD_YELLOW_CARP_XHCI_4		0x161e
     76#define PCI_DEVICE_ID_AMD_YELLOW_CARP_XHCI_5		0x15d6
     77#define PCI_DEVICE_ID_AMD_YELLOW_CARP_XHCI_6		0x15d7
     78#define PCI_DEVICE_ID_AMD_YELLOW_CARP_XHCI_7		0x161c
     79#define PCI_DEVICE_ID_AMD_YELLOW_CARP_XHCI_8		0x161f
     80
     81#define PCI_DEVICE_ID_ASMEDIA_1042_XHCI			0x1042
     82#define PCI_DEVICE_ID_ASMEDIA_1042A_XHCI		0x1142
     83#define PCI_DEVICE_ID_ASMEDIA_1142_XHCI			0x1242
     84#define PCI_DEVICE_ID_ASMEDIA_2142_XHCI			0x2142
     85#define PCI_DEVICE_ID_ASMEDIA_3242_XHCI			0x3242
     86
     87static const char hcd_name[] = "xhci_hcd";
     88
     89static struct hc_driver __read_mostly xhci_pci_hc_driver;
     90
     91static int xhci_pci_setup(struct usb_hcd *hcd);
     92
     93static const struct xhci_driver_overrides xhci_pci_overrides __initconst = {
     94	.reset = xhci_pci_setup,
     95};
     96
     97/* called after powerup, by probe or system-pm "wakeup" */
     98static int xhci_pci_reinit(struct xhci_hcd *xhci, struct pci_dev *pdev)
     99{
    100	/*
    101	 * TODO: Implement finding debug ports later.
    102	 * TODO: see if there are any quirks that need to be added to handle
    103	 * new extended capabilities.
    104	 */
    105
    106	/* PCI Memory-Write-Invalidate cycle support is optional (uncommon) */
    107	if (!pci_set_mwi(pdev))
    108		xhci_dbg(xhci, "MWI active\n");
    109
    110	xhci_dbg(xhci, "Finished xhci_pci_reinit\n");
    111	return 0;
    112}
    113
    114static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
    115{
    116	struct pci_dev                  *pdev = to_pci_dev(dev);
    117	struct xhci_driver_data         *driver_data;
    118	const struct pci_device_id      *id;
    119
    120	id = pci_match_id(to_pci_driver(pdev->dev.driver)->id_table, pdev);
    121
    122	if (id && id->driver_data) {
    123		driver_data = (struct xhci_driver_data *)id->driver_data;
    124		xhci->quirks |= driver_data->quirks;
    125	}
    126
    127	/* Look for vendor-specific quirks */
    128	if (pdev->vendor == PCI_VENDOR_ID_FRESCO_LOGIC &&
    129			(pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_PDK ||
    130			 pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_FL1400)) {
    131		if (pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_PDK &&
    132				pdev->revision == 0x0) {
    133			xhci->quirks |= XHCI_RESET_EP_QUIRK;
    134			xhci_dbg_trace(xhci, trace_xhci_dbg_quirks,
    135				"XHCI_RESET_EP_QUIRK for this evaluation HW is deprecated");
    136		}
    137		if (pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_PDK &&
    138				pdev->revision == 0x4) {
    139			xhci->quirks |= XHCI_SLOW_SUSPEND;
    140			xhci_dbg_trace(xhci, trace_xhci_dbg_quirks,
    141				"QUIRK: Fresco Logic xHC revision %u"
    142				"must be suspended extra slowly",
    143				pdev->revision);
    144		}
    145		if (pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_PDK)
    146			xhci->quirks |= XHCI_BROKEN_STREAMS;
    147		/* Fresco Logic confirms: all revisions of this chip do not
    148		 * support MSI, even though some of them claim to in their PCI
    149		 * capabilities.
    150		 */
    151		xhci->quirks |= XHCI_BROKEN_MSI;
    152		xhci_dbg_trace(xhci, trace_xhci_dbg_quirks,
    153				"QUIRK: Fresco Logic revision %u "
    154				"has broken MSI implementation",
    155				pdev->revision);
    156		xhci->quirks |= XHCI_TRUST_TX_LENGTH;
    157	}
    158
    159	if (pdev->vendor == PCI_VENDOR_ID_FRESCO_LOGIC &&
    160			pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_FL1009)
    161		xhci->quirks |= XHCI_BROKEN_STREAMS;
    162
    163	if (pdev->vendor == PCI_VENDOR_ID_FRESCO_LOGIC &&
    164			pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_FL1100)
    165		xhci->quirks |= XHCI_TRUST_TX_LENGTH;
    166
    167	if (pdev->vendor == PCI_VENDOR_ID_NEC)
    168		xhci->quirks |= XHCI_NEC_HOST;
    169
    170	if (pdev->vendor == PCI_VENDOR_ID_AMD && xhci->hci_version == 0x96)
    171		xhci->quirks |= XHCI_AMD_0x96_HOST;
    172
    173	/* AMD PLL quirk */
    174	if (pdev->vendor == PCI_VENDOR_ID_AMD && usb_amd_quirk_pll_check())
    175		xhci->quirks |= XHCI_AMD_PLL_FIX;
    176
    177	if (pdev->vendor == PCI_VENDOR_ID_AMD &&
    178		(pdev->device == 0x145c ||
    179		 pdev->device == 0x15e0 ||
    180		 pdev->device == 0x15e1 ||
    181		 pdev->device == 0x43bb))
    182		xhci->quirks |= XHCI_SUSPEND_DELAY;
    183
    184	if (pdev->vendor == PCI_VENDOR_ID_AMD &&
    185	    (pdev->device == 0x15e0 || pdev->device == 0x15e1))
    186		xhci->quirks |= XHCI_SNPS_BROKEN_SUSPEND;
    187
    188	if (pdev->vendor == PCI_VENDOR_ID_AMD && pdev->device == 0x15e5) {
    189		xhci->quirks |= XHCI_DISABLE_SPARSE;
    190		xhci->quirks |= XHCI_RESET_ON_RESUME;
    191	}
    192
    193	if (pdev->vendor == PCI_VENDOR_ID_AMD)
    194		xhci->quirks |= XHCI_TRUST_TX_LENGTH;
    195
    196	if ((pdev->vendor == PCI_VENDOR_ID_AMD) &&
    197		((pdev->device == PCI_DEVICE_ID_AMD_PROMONTORYA_4) ||
    198		(pdev->device == PCI_DEVICE_ID_AMD_PROMONTORYA_3) ||
    199		(pdev->device == PCI_DEVICE_ID_AMD_PROMONTORYA_2) ||
    200		(pdev->device == PCI_DEVICE_ID_AMD_PROMONTORYA_1)))
    201		xhci->quirks |= XHCI_U2_DISABLE_WAKE;
    202
    203	if (pdev->vendor == PCI_VENDOR_ID_AMD &&
    204		pdev->device == PCI_DEVICE_ID_AMD_RENOIR_XHCI)
    205		xhci->quirks |= XHCI_BROKEN_D3COLD;
    206
    207	if (pdev->vendor == PCI_VENDOR_ID_INTEL) {
    208		xhci->quirks |= XHCI_LPM_SUPPORT;
    209		xhci->quirks |= XHCI_INTEL_HOST;
    210		xhci->quirks |= XHCI_AVOID_BEI;
    211	}
    212	if (pdev->vendor == PCI_VENDOR_ID_INTEL &&
    213			pdev->device == PCI_DEVICE_ID_INTEL_PANTHERPOINT_XHCI) {
    214		xhci->quirks |= XHCI_EP_LIMIT_QUIRK;
    215		xhci->limit_active_eps = 64;
    216		xhci->quirks |= XHCI_SW_BW_CHECKING;
    217		/*
    218		 * PPT desktop boards DH77EB and DH77DF will power back on after
    219		 * a few seconds of being shutdown.  The fix for this is to
    220		 * switch the ports from xHCI to EHCI on shutdown.  We can't use
    221		 * DMI information to find those particular boards (since each
    222		 * vendor will change the board name), so we have to key off all
    223		 * PPT chipsets.
    224		 */
    225		xhci->quirks |= XHCI_SPURIOUS_REBOOT;
    226	}
    227	if (pdev->vendor == PCI_VENDOR_ID_INTEL &&
    228		(pdev->device == PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_XHCI ||
    229		 pdev->device == PCI_DEVICE_ID_INTEL_WILDCATPOINT_LP_XHCI)) {
    230		xhci->quirks |= XHCI_SPURIOUS_REBOOT;
    231		xhci->quirks |= XHCI_SPURIOUS_WAKEUP;
    232	}
    233	if (pdev->vendor == PCI_VENDOR_ID_INTEL &&
    234		(pdev->device == PCI_DEVICE_ID_INTEL_SUNRISEPOINT_LP_XHCI ||
    235		 pdev->device == PCI_DEVICE_ID_INTEL_SUNRISEPOINT_H_XHCI ||
    236		 pdev->device == PCI_DEVICE_ID_INTEL_CHERRYVIEW_XHCI ||
    237		 pdev->device == PCI_DEVICE_ID_INTEL_BROXTON_M_XHCI ||
    238		 pdev->device == PCI_DEVICE_ID_INTEL_BROXTON_B_XHCI ||
    239		 pdev->device == PCI_DEVICE_ID_INTEL_APL_XHCI ||
    240		 pdev->device == PCI_DEVICE_ID_INTEL_DNV_XHCI ||
    241		 pdev->device == PCI_DEVICE_ID_INTEL_CML_XHCI)) {
    242		xhci->quirks |= XHCI_PME_STUCK_QUIRK;
    243	}
    244	if (pdev->vendor == PCI_VENDOR_ID_INTEL &&
    245	    pdev->device == PCI_DEVICE_ID_INTEL_CHERRYVIEW_XHCI)
    246		xhci->quirks |= XHCI_SSIC_PORT_UNUSED;
    247	if (pdev->vendor == PCI_VENDOR_ID_INTEL &&
    248	    (pdev->device == PCI_DEVICE_ID_INTEL_CHERRYVIEW_XHCI ||
    249	     pdev->device == PCI_DEVICE_ID_INTEL_SUNRISEPOINT_LP_XHCI ||
    250	     pdev->device == PCI_DEVICE_ID_INTEL_APL_XHCI))
    251		xhci->quirks |= XHCI_INTEL_USB_ROLE_SW;
    252	if (pdev->vendor == PCI_VENDOR_ID_INTEL &&
    253	    (pdev->device == PCI_DEVICE_ID_INTEL_CHERRYVIEW_XHCI ||
    254	     pdev->device == PCI_DEVICE_ID_INTEL_SUNRISEPOINT_LP_XHCI ||
    255	     pdev->device == PCI_DEVICE_ID_INTEL_SUNRISEPOINT_H_XHCI ||
    256	     pdev->device == PCI_DEVICE_ID_INTEL_APL_XHCI ||
    257	     pdev->device == PCI_DEVICE_ID_INTEL_DNV_XHCI))
    258		xhci->quirks |= XHCI_MISSING_CAS;
    259
    260	if (pdev->vendor == PCI_VENDOR_ID_INTEL &&
    261	    (pdev->device == PCI_DEVICE_ID_INTEL_ALPINE_RIDGE_2C_XHCI ||
    262	     pdev->device == PCI_DEVICE_ID_INTEL_ALPINE_RIDGE_4C_XHCI ||
    263	     pdev->device == PCI_DEVICE_ID_INTEL_ALPINE_RIDGE_LP_XHCI ||
    264	     pdev->device == PCI_DEVICE_ID_INTEL_ALPINE_RIDGE_C_2C_XHCI ||
    265	     pdev->device == PCI_DEVICE_ID_INTEL_ALPINE_RIDGE_C_4C_XHCI ||
    266	     pdev->device == PCI_DEVICE_ID_INTEL_TITAN_RIDGE_2C_XHCI ||
    267	     pdev->device == PCI_DEVICE_ID_INTEL_TITAN_RIDGE_4C_XHCI ||
    268	     pdev->device == PCI_DEVICE_ID_INTEL_TITAN_RIDGE_DD_XHCI ||
    269	     pdev->device == PCI_DEVICE_ID_INTEL_ICE_LAKE_XHCI ||
    270	     pdev->device == PCI_DEVICE_ID_INTEL_TIGER_LAKE_XHCI ||
    271	     pdev->device == PCI_DEVICE_ID_INTEL_MAPLE_RIDGE_XHCI ||
    272	     pdev->device == PCI_DEVICE_ID_INTEL_ALDER_LAKE_XHCI ||
    273	     pdev->device == PCI_DEVICE_ID_INTEL_ALDER_LAKE_N_XHCI ||
    274	     pdev->device == PCI_DEVICE_ID_INTEL_ALDER_LAKE_PCH_XHCI ||
    275	     pdev->device == PCI_DEVICE_ID_INTEL_RAPTOR_LAKE_XHCI ||
    276	     pdev->device == PCI_DEVICE_ID_INTEL_METEOR_LAKE_XHCI))
    277		xhci->quirks |= XHCI_DEFAULT_PM_RUNTIME_ALLOW;
    278
    279	if (pdev->vendor == PCI_VENDOR_ID_ETRON &&
    280			pdev->device == PCI_DEVICE_ID_EJ168) {
    281		xhci->quirks |= XHCI_RESET_ON_RESUME;
    282		xhci->quirks |= XHCI_TRUST_TX_LENGTH;
    283		xhci->quirks |= XHCI_BROKEN_STREAMS;
    284	}
    285	if (pdev->vendor == PCI_VENDOR_ID_RENESAS &&
    286	    pdev->device == 0x0014) {
    287		xhci->quirks |= XHCI_TRUST_TX_LENGTH;
    288		xhci->quirks |= XHCI_ZERO_64B_REGS;
    289	}
    290	if (pdev->vendor == PCI_VENDOR_ID_RENESAS &&
    291	    pdev->device == 0x0015) {
    292		xhci->quirks |= XHCI_RESET_ON_RESUME;
    293		xhci->quirks |= XHCI_ZERO_64B_REGS;
    294	}
    295	if (pdev->vendor == PCI_VENDOR_ID_VIA)
    296		xhci->quirks |= XHCI_RESET_ON_RESUME;
    297
    298	/* See https://bugzilla.kernel.org/show_bug.cgi?id=79511 */
    299	if (pdev->vendor == PCI_VENDOR_ID_VIA &&
    300			pdev->device == 0x3432)
    301		xhci->quirks |= XHCI_BROKEN_STREAMS;
    302
    303	if (pdev->vendor == PCI_VENDOR_ID_VIA && pdev->device == 0x3483) {
    304		xhci->quirks |= XHCI_LPM_SUPPORT;
    305		xhci->quirks |= XHCI_EP_CTX_BROKEN_DCS;
    306	}
    307
    308	if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA &&
    309		pdev->device == PCI_DEVICE_ID_ASMEDIA_1042_XHCI)
    310		xhci->quirks |= XHCI_BROKEN_STREAMS;
    311	if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA &&
    312		pdev->device == PCI_DEVICE_ID_ASMEDIA_1042A_XHCI) {
    313		xhci->quirks |= XHCI_TRUST_TX_LENGTH;
    314		xhci->quirks |= XHCI_NO_64BIT_SUPPORT;
    315	}
    316	if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA &&
    317	    (pdev->device == PCI_DEVICE_ID_ASMEDIA_1142_XHCI ||
    318	     pdev->device == PCI_DEVICE_ID_ASMEDIA_2142_XHCI ||
    319	     pdev->device == PCI_DEVICE_ID_ASMEDIA_3242_XHCI))
    320		xhci->quirks |= XHCI_NO_64BIT_SUPPORT;
    321
    322	if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA &&
    323		pdev->device == PCI_DEVICE_ID_ASMEDIA_1042A_XHCI)
    324		xhci->quirks |= XHCI_ASMEDIA_MODIFY_FLOWCONTROL;
    325
    326	if (pdev->vendor == PCI_VENDOR_ID_TI && pdev->device == 0x8241)
    327		xhci->quirks |= XHCI_LIMIT_ENDPOINT_INTERVAL_7;
    328
    329	if ((pdev->vendor == PCI_VENDOR_ID_BROADCOM ||
    330	     pdev->vendor == PCI_VENDOR_ID_CAVIUM) &&
    331	     pdev->device == 0x9026)
    332		xhci->quirks |= XHCI_RESET_PLL_ON_DISCONNECT;
    333
    334	if (pdev->vendor == PCI_VENDOR_ID_AMD &&
    335	    (pdev->device == PCI_DEVICE_ID_AMD_PROMONTORYA_2 ||
    336	     pdev->device == PCI_DEVICE_ID_AMD_PROMONTORYA_4))
    337		xhci->quirks |= XHCI_NO_SOFT_RETRY;
    338
    339	if (pdev->vendor == PCI_VENDOR_ID_AMD &&
    340	    (pdev->device == PCI_DEVICE_ID_AMD_YELLOW_CARP_XHCI_1 ||
    341	    pdev->device == PCI_DEVICE_ID_AMD_YELLOW_CARP_XHCI_2 ||
    342	    pdev->device == PCI_DEVICE_ID_AMD_YELLOW_CARP_XHCI_3 ||
    343	    pdev->device == PCI_DEVICE_ID_AMD_YELLOW_CARP_XHCI_4 ||
    344	    pdev->device == PCI_DEVICE_ID_AMD_YELLOW_CARP_XHCI_5 ||
    345	    pdev->device == PCI_DEVICE_ID_AMD_YELLOW_CARP_XHCI_6 ||
    346	    pdev->device == PCI_DEVICE_ID_AMD_YELLOW_CARP_XHCI_7 ||
    347	    pdev->device == PCI_DEVICE_ID_AMD_YELLOW_CARP_XHCI_8))
    348		xhci->quirks |= XHCI_DEFAULT_PM_RUNTIME_ALLOW;
    349
    350	if (xhci->quirks & XHCI_RESET_ON_RESUME)
    351		xhci_dbg_trace(xhci, trace_xhci_dbg_quirks,
    352				"QUIRK: Resetting on resume");
    353}
    354
    355#ifdef CONFIG_ACPI
    356static void xhci_pme_acpi_rtd3_enable(struct pci_dev *dev)
    357{
    358	static const guid_t intel_dsm_guid =
    359		GUID_INIT(0xac340cb7, 0xe901, 0x45bf,
    360			  0xb7, 0xe6, 0x2b, 0x34, 0xec, 0x93, 0x1e, 0x23);
    361	union acpi_object *obj;
    362
    363	obj = acpi_evaluate_dsm(ACPI_HANDLE(&dev->dev), &intel_dsm_guid, 3, 1,
    364				NULL);
    365	ACPI_FREE(obj);
    366}
    367#else
    368static void xhci_pme_acpi_rtd3_enable(struct pci_dev *dev) { }
    369#endif /* CONFIG_ACPI */
    370
    371/* called during probe() after chip reset completes */
    372static int xhci_pci_setup(struct usb_hcd *hcd)
    373{
    374	struct xhci_hcd		*xhci;
    375	struct pci_dev		*pdev = to_pci_dev(hcd->self.controller);
    376	int			retval;
    377
    378	xhci = hcd_to_xhci(hcd);
    379	if (!xhci->sbrn)
    380		pci_read_config_byte(pdev, XHCI_SBRN_OFFSET, &xhci->sbrn);
    381
    382	/* imod_interval is the interrupt moderation value in nanoseconds. */
    383	xhci->imod_interval = 40000;
    384
    385	retval = xhci_gen_setup(hcd, xhci_pci_quirks);
    386	if (retval)
    387		return retval;
    388
    389	if (!usb_hcd_is_primary_hcd(hcd))
    390		return 0;
    391
    392	if (xhci->quirks & XHCI_PME_STUCK_QUIRK)
    393		xhci_pme_acpi_rtd3_enable(pdev);
    394
    395	xhci_dbg(xhci, "Got SBRN %u\n", (unsigned int) xhci->sbrn);
    396
    397	/* Find any debug ports */
    398	return xhci_pci_reinit(xhci, pdev);
    399}
    400
    401/*
    402 * We need to register our own PCI probe function (instead of the USB core's
    403 * function) in order to create a second roothub under xHCI.
    404 */
    405static int xhci_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
    406{
    407	int retval;
    408	struct xhci_hcd *xhci;
    409	struct usb_hcd *hcd;
    410	struct xhci_driver_data *driver_data;
    411	struct reset_control *reset;
    412
    413	driver_data = (struct xhci_driver_data *)id->driver_data;
    414	if (driver_data && driver_data->quirks & XHCI_RENESAS_FW_QUIRK) {
    415		retval = renesas_xhci_check_request_fw(dev, id);
    416		if (retval)
    417			return retval;
    418	}
    419
    420	reset = devm_reset_control_get_optional_exclusive(&dev->dev, NULL);
    421	if (IS_ERR(reset))
    422		return PTR_ERR(reset);
    423	reset_control_reset(reset);
    424
    425	/* Prevent runtime suspending between USB-2 and USB-3 initialization */
    426	pm_runtime_get_noresume(&dev->dev);
    427
    428	/* Register the USB 2.0 roothub.
    429	 * FIXME: USB core must know to register the USB 2.0 roothub first.
    430	 * This is sort of silly, because we could just set the HCD driver flags
    431	 * to say USB 2.0, but I'm not sure what the implications would be in
    432	 * the other parts of the HCD code.
    433	 */
    434	retval = usb_hcd_pci_probe(dev, id, &xhci_pci_hc_driver);
    435
    436	if (retval)
    437		goto put_runtime_pm;
    438
    439	/* USB 2.0 roothub is stored in the PCI device now. */
    440	hcd = dev_get_drvdata(&dev->dev);
    441	xhci = hcd_to_xhci(hcd);
    442	xhci->reset = reset;
    443	xhci->shared_hcd = usb_create_shared_hcd(&xhci_pci_hc_driver, &dev->dev,
    444						 pci_name(dev), hcd);
    445	if (!xhci->shared_hcd) {
    446		retval = -ENOMEM;
    447		goto dealloc_usb2_hcd;
    448	}
    449
    450	retval = xhci_ext_cap_init(xhci);
    451	if (retval)
    452		goto put_usb3_hcd;
    453
    454	retval = usb_add_hcd(xhci->shared_hcd, dev->irq,
    455			IRQF_SHARED);
    456	if (retval)
    457		goto put_usb3_hcd;
    458	/* Roothub already marked as USB 3.0 speed */
    459
    460	if (!(xhci->quirks & XHCI_BROKEN_STREAMS) &&
    461			HCC_MAX_PSA(xhci->hcc_params) >= 4)
    462		xhci->shared_hcd->can_do_streams = 1;
    463
    464	/* USB-2 and USB-3 roothubs initialized, allow runtime pm suspend */
    465	pm_runtime_put_noidle(&dev->dev);
    466
    467	if (xhci->quirks & XHCI_DEFAULT_PM_RUNTIME_ALLOW)
    468		pm_runtime_allow(&dev->dev);
    469
    470	return 0;
    471
    472put_usb3_hcd:
    473	usb_put_hcd(xhci->shared_hcd);
    474dealloc_usb2_hcd:
    475	usb_hcd_pci_remove(dev);
    476put_runtime_pm:
    477	pm_runtime_put_noidle(&dev->dev);
    478	return retval;
    479}
    480
    481static void xhci_pci_remove(struct pci_dev *dev)
    482{
    483	struct xhci_hcd *xhci;
    484
    485	xhci = hcd_to_xhci(pci_get_drvdata(dev));
    486
    487	xhci->xhc_state |= XHCI_STATE_REMOVING;
    488
    489	if (xhci->quirks & XHCI_DEFAULT_PM_RUNTIME_ALLOW)
    490		pm_runtime_forbid(&dev->dev);
    491
    492	if (xhci->shared_hcd) {
    493		usb_remove_hcd(xhci->shared_hcd);
    494		usb_put_hcd(xhci->shared_hcd);
    495		xhci->shared_hcd = NULL;
    496	}
    497
    498	/* Workaround for spurious wakeups at shutdown with HSW */
    499	if (xhci->quirks & XHCI_SPURIOUS_WAKEUP)
    500		pci_set_power_state(dev, PCI_D3hot);
    501
    502	usb_hcd_pci_remove(dev);
    503}
    504
    505#ifdef CONFIG_PM
    506/*
    507 * In some Intel xHCI controllers, in order to get D3 working,
    508 * through a vendor specific SSIC CONFIG register at offset 0x883c,
    509 * SSIC PORT need to be marked as "unused" before putting xHCI
    510 * into D3. After D3 exit, the SSIC port need to be marked as "used".
    511 * Without this change, xHCI might not enter D3 state.
    512 */
    513static void xhci_ssic_port_unused_quirk(struct usb_hcd *hcd, bool suspend)
    514{
    515	struct xhci_hcd	*xhci = hcd_to_xhci(hcd);
    516	u32 val;
    517	void __iomem *reg;
    518	int i;
    519
    520	for (i = 0; i < SSIC_PORT_NUM; i++) {
    521		reg = (void __iomem *) xhci->cap_regs +
    522				SSIC_PORT_CFG2 +
    523				i * SSIC_PORT_CFG2_OFFSET;
    524
    525		/* Notify SSIC that SSIC profile programming is not done. */
    526		val = readl(reg) & ~PROG_DONE;
    527		writel(val, reg);
    528
    529		/* Mark SSIC port as unused(suspend) or used(resume) */
    530		val = readl(reg);
    531		if (suspend)
    532			val |= SSIC_PORT_UNUSED;
    533		else
    534			val &= ~SSIC_PORT_UNUSED;
    535		writel(val, reg);
    536
    537		/* Notify SSIC that SSIC profile programming is done */
    538		val = readl(reg) | PROG_DONE;
    539		writel(val, reg);
    540		readl(reg);
    541	}
    542}
    543
    544/*
    545 * Make sure PME works on some Intel xHCI controllers by writing 1 to clear
    546 * the Internal PME flag bit in vendor specific PMCTRL register at offset 0x80a4
    547 */
    548static void xhci_pme_quirk(struct usb_hcd *hcd)
    549{
    550	struct xhci_hcd	*xhci = hcd_to_xhci(hcd);
    551	void __iomem *reg;
    552	u32 val;
    553
    554	reg = (void __iomem *) xhci->cap_regs + 0x80a4;
    555	val = readl(reg);
    556	writel(val | BIT(28), reg);
    557	readl(reg);
    558}
    559
    560static void xhci_sparse_control_quirk(struct usb_hcd *hcd)
    561{
    562	u32 reg;
    563
    564	reg = readl(hcd->regs + SPARSE_CNTL_ENABLE);
    565	reg &= ~BIT(SPARSE_DISABLE_BIT);
    566	writel(reg, hcd->regs + SPARSE_CNTL_ENABLE);
    567}
    568
    569static int xhci_pci_suspend(struct usb_hcd *hcd, bool do_wakeup)
    570{
    571	struct xhci_hcd	*xhci = hcd_to_xhci(hcd);
    572	struct pci_dev		*pdev = to_pci_dev(hcd->self.controller);
    573	int			ret;
    574
    575	/*
    576	 * Systems with the TI redriver that loses port status change events
    577	 * need to have the registers polled during D3, so avoid D3cold.
    578	 */
    579	if (xhci->quirks & (XHCI_COMP_MODE_QUIRK | XHCI_BROKEN_D3COLD))
    580		pci_d3cold_disable(pdev);
    581
    582	if (xhci->quirks & XHCI_PME_STUCK_QUIRK)
    583		xhci_pme_quirk(hcd);
    584
    585	if (xhci->quirks & XHCI_SSIC_PORT_UNUSED)
    586		xhci_ssic_port_unused_quirk(hcd, true);
    587
    588	if (xhci->quirks & XHCI_DISABLE_SPARSE)
    589		xhci_sparse_control_quirk(hcd);
    590
    591	ret = xhci_suspend(xhci, do_wakeup);
    592	if (ret && (xhci->quirks & XHCI_SSIC_PORT_UNUSED))
    593		xhci_ssic_port_unused_quirk(hcd, false);
    594
    595	return ret;
    596}
    597
    598static int xhci_pci_resume(struct usb_hcd *hcd, bool hibernated)
    599{
    600	struct xhci_hcd		*xhci = hcd_to_xhci(hcd);
    601	struct pci_dev		*pdev = to_pci_dev(hcd->self.controller);
    602	int			retval = 0;
    603
    604	reset_control_reset(xhci->reset);
    605
    606	/* The BIOS on systems with the Intel Panther Point chipset may or may
    607	 * not support xHCI natively.  That means that during system resume, it
    608	 * may switch the ports back to EHCI so that users can use their
    609	 * keyboard to select a kernel from GRUB after resume from hibernate.
    610	 *
    611	 * The BIOS is supposed to remember whether the OS had xHCI ports
    612	 * enabled before resume, and switch the ports back to xHCI when the
    613	 * BIOS/OS semaphore is written, but we all know we can't trust BIOS
    614	 * writers.
    615	 *
    616	 * Unconditionally switch the ports back to xHCI after a system resume.
    617	 * It should not matter whether the EHCI or xHCI controller is
    618	 * resumed first. It's enough to do the switchover in xHCI because
    619	 * USB core won't notice anything as the hub driver doesn't start
    620	 * running again until after all the devices (including both EHCI and
    621	 * xHCI host controllers) have been resumed.
    622	 */
    623
    624	if (pdev->vendor == PCI_VENDOR_ID_INTEL)
    625		usb_enable_intel_xhci_ports(pdev);
    626
    627	if (xhci->quirks & XHCI_SSIC_PORT_UNUSED)
    628		xhci_ssic_port_unused_quirk(hcd, false);
    629
    630	if (xhci->quirks & XHCI_PME_STUCK_QUIRK)
    631		xhci_pme_quirk(hcd);
    632
    633	retval = xhci_resume(xhci, hibernated);
    634	return retval;
    635}
    636
    637static void xhci_pci_shutdown(struct usb_hcd *hcd)
    638{
    639	struct xhci_hcd		*xhci = hcd_to_xhci(hcd);
    640	struct pci_dev		*pdev = to_pci_dev(hcd->self.controller);
    641
    642	xhci_shutdown(hcd);
    643
    644	/* Yet another workaround for spurious wakeups at shutdown with HSW */
    645	if (xhci->quirks & XHCI_SPURIOUS_WAKEUP)
    646		pci_set_power_state(pdev, PCI_D3hot);
    647}
    648#endif /* CONFIG_PM */
    649
    650/*-------------------------------------------------------------------------*/
    651
    652static const struct xhci_driver_data reneses_data = {
    653	.quirks  = XHCI_RENESAS_FW_QUIRK,
    654	.firmware = "renesas_usb_fw.mem",
    655};
    656
    657/* PCI driver selection metadata; PCI hotplugging uses this */
    658static const struct pci_device_id pci_ids[] = {
    659	{ PCI_DEVICE(0x1912, 0x0014),
    660		.driver_data =  (unsigned long)&reneses_data,
    661	},
    662	{ PCI_DEVICE(0x1912, 0x0015),
    663		.driver_data =  (unsigned long)&reneses_data,
    664	},
    665	/* handle any USB 3.0 xHCI controller */
    666	{ PCI_DEVICE_CLASS(PCI_CLASS_SERIAL_USB_XHCI, ~0),
    667	},
    668	{ /* end: all zeroes */ }
    669};
    670MODULE_DEVICE_TABLE(pci, pci_ids);
    671
    672/*
    673 * Without CONFIG_USB_XHCI_PCI_RENESAS renesas_xhci_check_request_fw() won't
    674 * load firmware, so don't encumber the xhci-pci driver with it.
    675 */
    676#if IS_ENABLED(CONFIG_USB_XHCI_PCI_RENESAS)
    677MODULE_FIRMWARE("renesas_usb_fw.mem");
    678#endif
    679
    680/* pci driver glue; this is a "new style" PCI driver module */
    681static struct pci_driver xhci_pci_driver = {
    682	.name =		hcd_name,
    683	.id_table =	pci_ids,
    684
    685	.probe =	xhci_pci_probe,
    686	.remove =	xhci_pci_remove,
    687	/* suspend and resume implemented later */
    688
    689	.shutdown = 	usb_hcd_pci_shutdown,
    690#ifdef CONFIG_PM
    691	.driver = {
    692		.pm = &usb_hcd_pci_pm_ops
    693	},
    694#endif
    695};
    696
    697static int __init xhci_pci_init(void)
    698{
    699	xhci_init_driver(&xhci_pci_hc_driver, &xhci_pci_overrides);
    700#ifdef CONFIG_PM
    701	xhci_pci_hc_driver.pci_suspend = xhci_pci_suspend;
    702	xhci_pci_hc_driver.pci_resume = xhci_pci_resume;
    703	xhci_pci_hc_driver.shutdown = xhci_pci_shutdown;
    704#endif
    705	return pci_register_driver(&xhci_pci_driver);
    706}
    707module_init(xhci_pci_init);
    708
    709static void __exit xhci_pci_exit(void)
    710{
    711	pci_unregister_driver(&xhci_pci_driver);
    712}
    713module_exit(xhci_pci_exit);
    714
    715MODULE_DESCRIPTION("xHCI PCI Host Controller Driver");
    716MODULE_LICENSE("GPL");