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

pci.c (5045B)


      1// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
      2/*
      3 * pci.c - DesignWare HS OTG Controller PCI driver
      4 *
      5 * Copyright (C) 2004-2013 Synopsys, Inc.
      6 *
      7 * Redistribution and use in source and binary forms, with or without
      8 * modification, are permitted provided that the following conditions
      9 * are met:
     10 * 1. Redistributions of source code must retain the above copyright
     11 *    notice, this list of conditions, and the following disclaimer,
     12 *    without modification.
     13 * 2. Redistributions in binary form must reproduce the above copyright
     14 *    notice, this list of conditions and the following disclaimer in the
     15 *    documentation and/or other materials provided with the distribution.
     16 * 3. The names of the above-listed copyright holders may not be used
     17 *    to endorse or promote products derived from this software without
     18 *    specific prior written permission.
     19 *
     20 * ALTERNATIVELY, this software may be distributed under the terms of the
     21 * GNU General Public License ("GPL") as published by the Free Software
     22 * Foundation; either version 2 of the License, or (at your option) any
     23 * later version.
     24 *
     25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
     26 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
     27 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     28 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
     29 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     30 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     31 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     32 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
     33 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
     34 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     35 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     36 */
     37
     38/*
     39 * Provides the initialization and cleanup entry points for the DWC_otg PCI
     40 * driver
     41 */
     42#include <linux/kernel.h>
     43#include <linux/module.h>
     44#include <linux/moduleparam.h>
     45#include <linux/spinlock.h>
     46#include <linux/interrupt.h>
     47#include <linux/io.h>
     48#include <linux/slab.h>
     49#include <linux/pci.h>
     50#include <linux/usb.h>
     51
     52#include <linux/usb/hcd.h>
     53#include <linux/usb/ch11.h>
     54#include <linux/platform_device.h>
     55#include <linux/usb/usb_phy_generic.h>
     56
     57#define PCI_PRODUCT_ID_HAPS_HSOTG	0xabc0
     58
     59static const char dwc2_driver_name[] = "dwc2-pci";
     60
     61struct dwc2_pci_glue {
     62	struct platform_device *dwc2;
     63	struct platform_device *phy;
     64};
     65
     66/**
     67 * dwc2_pci_remove() - Provides the cleanup entry points for the DWC_otg PCI
     68 * driver
     69 *
     70 * @pci: The programming view of DWC_otg PCI
     71 */
     72static void dwc2_pci_remove(struct pci_dev *pci)
     73{
     74	struct dwc2_pci_glue *glue = pci_get_drvdata(pci);
     75
     76	platform_device_unregister(glue->dwc2);
     77	usb_phy_generic_unregister(glue->phy);
     78	pci_set_drvdata(pci, NULL);
     79}
     80
     81static int dwc2_pci_probe(struct pci_dev *pci,
     82			  const struct pci_device_id *id)
     83{
     84	struct resource		res[2];
     85	struct platform_device	*dwc2;
     86	struct platform_device	*phy;
     87	int			ret;
     88	struct device		*dev = &pci->dev;
     89	struct dwc2_pci_glue	*glue;
     90
     91	ret = pcim_enable_device(pci);
     92	if (ret) {
     93		dev_err(dev, "failed to enable pci device\n");
     94		return -ENODEV;
     95	}
     96
     97	pci_set_master(pci);
     98
     99	phy = usb_phy_generic_register();
    100	if (IS_ERR(phy)) {
    101		dev_err(dev, "error registering generic PHY (%ld)\n",
    102			PTR_ERR(phy));
    103		return PTR_ERR(phy);
    104	}
    105
    106	dwc2 = platform_device_alloc("dwc2", PLATFORM_DEVID_AUTO);
    107	if (!dwc2) {
    108		dev_err(dev, "couldn't allocate dwc2 device\n");
    109		ret = -ENOMEM;
    110		goto err;
    111	}
    112
    113	memset(res, 0x00, sizeof(struct resource) * ARRAY_SIZE(res));
    114
    115	res[0].start	= pci_resource_start(pci, 0);
    116	res[0].end	= pci_resource_end(pci, 0);
    117	res[0].name	= "dwc2";
    118	res[0].flags	= IORESOURCE_MEM;
    119
    120	res[1].start	= pci->irq;
    121	res[1].name	= "dwc2";
    122	res[1].flags	= IORESOURCE_IRQ;
    123
    124	ret = platform_device_add_resources(dwc2, res, ARRAY_SIZE(res));
    125	if (ret) {
    126		dev_err(dev, "couldn't add resources to dwc2 device\n");
    127		goto err;
    128	}
    129
    130	dwc2->dev.parent = dev;
    131
    132	glue = devm_kzalloc(dev, sizeof(*glue), GFP_KERNEL);
    133	if (!glue) {
    134		ret = -ENOMEM;
    135		goto err;
    136	}
    137
    138	ret = platform_device_add(dwc2);
    139	if (ret) {
    140		dev_err(dev, "failed to register dwc2 device\n");
    141		goto err;
    142	}
    143
    144	glue->phy = phy;
    145	glue->dwc2 = dwc2;
    146	pci_set_drvdata(pci, glue);
    147
    148	return 0;
    149err:
    150	usb_phy_generic_unregister(phy);
    151	platform_device_put(dwc2);
    152	return ret;
    153}
    154
    155static const struct pci_device_id dwc2_pci_ids[] = {
    156	{
    157		PCI_DEVICE(PCI_VENDOR_ID_SYNOPSYS, PCI_PRODUCT_ID_HAPS_HSOTG),
    158	},
    159	{
    160		PCI_DEVICE(PCI_VENDOR_ID_STMICRO,
    161			   PCI_DEVICE_ID_STMICRO_USB_OTG),
    162	},
    163	{ /* end: all zeroes */ }
    164};
    165MODULE_DEVICE_TABLE(pci, dwc2_pci_ids);
    166
    167static struct pci_driver dwc2_pci_driver = {
    168	.name = dwc2_driver_name,
    169	.id_table = dwc2_pci_ids,
    170	.probe = dwc2_pci_probe,
    171	.remove = dwc2_pci_remove,
    172};
    173
    174module_pci_driver(dwc2_pci_driver);
    175
    176MODULE_DESCRIPTION("DESIGNWARE HS OTG PCI Bus Glue");
    177MODULE_AUTHOR("Synopsys, Inc.");
    178MODULE_LICENSE("Dual BSD/GPL");