You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge tag 'pci-v4.13-changes' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci
Pull PCI updates from Bjorn Helgaas:
- add sysfs max_link_speed/width, current_link_speed/width (Wong Vee
Khee)
- make host bridge IRQ mapping much more generic (Matthew Minter,
Lorenzo Pieralisi)
- convert most drivers to pci_scan_root_bus_bridge() (Lorenzo
Pieralisi)
- mutex sriov_configure() (Jakub Kicinski)
- mutex pci_error_handlers callbacks (Christoph Hellwig)
- split ->reset_notify() into ->reset_prepare()/reset_done()
(Christoph Hellwig)
- support multiple PCIe portdrv interrupts for MSI as well as MSI-X
(Gabriele Paoloni)
- allocate MSI/MSI-X vector for Downstream Port Containment (Gabriele
Paoloni)
- fix MSI IRQ affinity pre/post/min_vecs issue (Michael Hernandez)
- test INTx masking during enumeration, not at run-time (Piotr Gregor)
- avoid using device_may_wakeup() for runtime PM (Rafael J. Wysocki)
- restore the status of PCI devices across hibernation (Chen Yu)
- keep parent resources that start at 0x0 (Ard Biesheuvel)
- enable ECRC only if device supports it (Bjorn Helgaas)
- restore PRI and PASID state after Function-Level Reset (CQ Tang)
- skip DPC event if device is not present (Keith Busch)
- check domain when matching SMBIOS info (Sujith Pandel)
- mark Intel XXV710 NIC INTx masking as broken (Alex Williamson)
- avoid AMD SB7xx EHCI USB wakeup defect (Kai-Heng Feng)
- work around long-standing Macbook Pro poweroff issue (Bjorn Helgaas)
- add Switchtec "running" status flag (Logan Gunthorpe)
- fix dra7xx incorrect RW1C IRQ register usage (Arvind Yadav)
- modify xilinx-nwl IRQ chip for legacy interrupts (Bharat Kumar
Gogada)
- move VMD SRCU cleanup after bus, child device removal (Jon Derrick)
- add Faraday clock handling (Linus Walleij)
- configure Rockchip MPS and reorganize (Shawn Lin)
- limit Qualcomm TLP size to 2K (hardware issue) (Srinivas Kandagatla)
- support Tegra MSI 64-bit addressing (Thierry Reding)
- use Rockchip normal (not privileged) register bank (Shawn Lin)
- add HiSilicon Kirin SoC PCIe controller driver (Xiaowei Song)
- add Sigma Designs Tango SMP8759 PCIe controller driver (Marc
Gonzalez)
- add MediaTek PCIe host controller support (Ryder Lee)
- add Qualcomm IPQ4019 support (John Crispin)
- add HyperV vPCI protocol v1.2 support (Jork Loeser)
- add i.MX6 regulator support (Quentin Schulz)
* tag 'pci-v4.13-changes' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci: (113 commits)
PCI: tango: Add Sigma Designs Tango SMP8759 PCIe host bridge support
PCI: Add DT binding for Sigma Designs Tango PCIe controller
PCI: rockchip: Use normal register bank for config accessors
dt-bindings: PCI: Add documentation for MediaTek PCIe
PCI: Remove __pci_dev_reset() and pci_dev_reset()
PCI: Split ->reset_notify() method into ->reset_prepare() and ->reset_done()
PCI: xilinx: Make of_device_ids const
PCI: xilinx-nwl: Modify IRQ chip for legacy interrupts
PCI: vmd: Move SRCU cleanup after bus, child device removal
PCI: vmd: Correct comment: VMD domains start at 0x10000, not 0x1000
PCI: versatile: Add local struct device pointers
PCI: tegra: Do not allocate MSI target memory
PCI: tegra: Support MSI 64-bit addressing
PCI: rockchip: Use local struct device pointer consistently
PCI: rockchip: Check for clk_prepare_enable() errors during resume
MAINTAINERS: Remove Wenrui Li as Rockchip PCIe driver maintainer
PCI: rockchip: Configure RC's MPS setting
PCI: rockchip: Reconfigure configuration space header type
PCI: rockchip: Split out rockchip_pcie_cfg_configuration_accesses()
PCI: rockchip: Move configuration accesses into rockchip_pcie_cfg_atu()
...
This commit is contained in:
@@ -30,6 +30,13 @@ Mandatory properties:
|
||||
128MB, 256MB, 512MB, 1GB or 2GB in size. The memory should be marked as
|
||||
pre-fetchable.
|
||||
|
||||
Optional properties:
|
||||
- clocks: when present, this should contain the peripheral clock (PCLK) and the
|
||||
PCI clock (PCICLK). If these are not present, they are assumed to be
|
||||
hard-wired enabled and always on. The PCI clock will be 33 or 66 MHz.
|
||||
- clock-names: when present, this should contain "PCLK" for the peripheral
|
||||
clock and "PCICLK" for the PCI-side clock.
|
||||
|
||||
Mandatory subnodes:
|
||||
- For "faraday,ftpci100" a node representing the interrupt-controller inside the
|
||||
host bridge is mandatory. It has the following mandatory properties:
|
||||
|
||||
@@ -33,6 +33,10 @@ Optional properties:
|
||||
- reset-gpio-active-high: If present then the reset sequence using the GPIO
|
||||
specified in the "reset-gpio" property is reversed (H=reset state,
|
||||
L=operation state).
|
||||
- vpcie-supply: Should specify the regulator in charge of PCIe port power.
|
||||
The regulator will be enabled when initializing the PCIe host and
|
||||
disabled either as part of the init process or when shutting down the
|
||||
host.
|
||||
|
||||
Additional required properties for imx6sx-pcie:
|
||||
- clock names: Must include the following additional entries:
|
||||
|
||||
@@ -0,0 +1,130 @@
|
||||
MediaTek Gen2 PCIe controller which is available on MT7623 series SoCs
|
||||
|
||||
PCIe subsys supports single root complex (RC) with 3 Root Ports. Each root
|
||||
ports supports a Gen2 1-lane Link and has PIPE interface to PHY.
|
||||
|
||||
Required properties:
|
||||
- compatible: Should contain "mediatek,mt7623-pcie".
|
||||
- device_type: Must be "pci"
|
||||
- reg: Base addresses and lengths of the PCIe controller.
|
||||
- #address-cells: Address representation for root ports (must be 3)
|
||||
- #size-cells: Size representation for root ports (must be 2)
|
||||
- #interrupt-cells: Size representation for interrupts (must be 1)
|
||||
- interrupt-map-mask and interrupt-map: Standard PCI IRQ mapping properties
|
||||
Please refer to the standard PCI bus binding document for a more detailed
|
||||
explanation.
|
||||
- clocks: Must contain an entry for each entry in clock-names.
|
||||
See ../clocks/clock-bindings.txt for details.
|
||||
- clock-names: Must include the following entries:
|
||||
- free_ck :for reference clock of PCIe subsys
|
||||
- sys_ck0 :for clock of Port0
|
||||
- sys_ck1 :for clock of Port1
|
||||
- sys_ck2 :for clock of Port2
|
||||
- resets: Must contain an entry for each entry in reset-names.
|
||||
See ../reset/reset.txt for details.
|
||||
- reset-names: Must include the following entries:
|
||||
- pcie-rst0 :port0 reset
|
||||
- pcie-rst1 :port1 reset
|
||||
- pcie-rst2 :port2 reset
|
||||
- phys: List of PHY specifiers (used by generic PHY framework).
|
||||
- phy-names : Must be "pcie-phy0", "pcie-phy1", "pcie-phyN".. based on the
|
||||
number of PHYs as specified in *phys* property.
|
||||
- power-domains: A phandle and power domain specifier pair to the power domain
|
||||
which is responsible for collapsing and restoring power to the peripheral.
|
||||
- bus-range: Range of bus numbers associated with this controller.
|
||||
- ranges: Ranges for the PCI memory and I/O regions.
|
||||
|
||||
In addition, the device tree node must have sub-nodes describing each
|
||||
PCIe port interface, having the following mandatory properties:
|
||||
|
||||
Required properties:
|
||||
- device_type: Must be "pci"
|
||||
- reg: Only the first four bytes are used to refer to the correct bus number
|
||||
and device number.
|
||||
- #address-cells: Must be 3
|
||||
- #size-cells: Must be 2
|
||||
- #interrupt-cells: Must be 1
|
||||
- interrupt-map-mask and interrupt-map: Standard PCI IRQ mapping properties
|
||||
Please refer to the standard PCI bus binding document for a more detailed
|
||||
explanation.
|
||||
- ranges: Sub-ranges distributed from the PCIe controller node. An empty
|
||||
property is sufficient.
|
||||
- num-lanes: Number of lanes to use for this port.
|
||||
|
||||
Examples:
|
||||
|
||||
hifsys: syscon@1a000000 {
|
||||
compatible = "mediatek,mt7623-hifsys",
|
||||
"mediatek,mt2701-hifsys",
|
||||
"syscon";
|
||||
reg = <0 0x1a000000 0 0x1000>;
|
||||
#clock-cells = <1>;
|
||||
#reset-cells = <1>;
|
||||
};
|
||||
|
||||
pcie: pcie-controller@1a140000 {
|
||||
compatible = "mediatek,mt7623-pcie";
|
||||
device_type = "pci";
|
||||
reg = <0 0x1a140000 0 0x1000>, /* PCIe shared registers */
|
||||
<0 0x1a142000 0 0x1000>, /* Port0 registers */
|
||||
<0 0x1a143000 0 0x1000>, /* Port1 registers */
|
||||
<0 0x1a144000 0 0x1000>; /* Port2 registers */
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
#interrupt-cells = <1>;
|
||||
interrupt-map-mask = <0xf800 0 0 0>;
|
||||
interrupt-map = <0x0000 0 0 0 &sysirq GIC_SPI 193 IRQ_TYPE_LEVEL_LOW>,
|
||||
<0x0800 0 0 0 &sysirq GIC_SPI 194 IRQ_TYPE_LEVEL_LOW>,
|
||||
<0x1000 0 0 0 &sysirq GIC_SPI 195 IRQ_TYPE_LEVEL_LOW>;
|
||||
clocks = <&topckgen CLK_TOP_ETHIF_SEL>,
|
||||
<&hifsys CLK_HIFSYS_PCIE0>,
|
||||
<&hifsys CLK_HIFSYS_PCIE1>,
|
||||
<&hifsys CLK_HIFSYS_PCIE2>;
|
||||
clock-names = "free_ck", "sys_ck0", "sys_ck1", "sys_ck2";
|
||||
resets = <&hifsys MT2701_HIFSYS_PCIE0_RST>,
|
||||
<&hifsys MT2701_HIFSYS_PCIE1_RST>,
|
||||
<&hifsys MT2701_HIFSYS_PCIE2_RST>;
|
||||
reset-names = "pcie-rst0", "pcie-rst1", "pcie-rst2";
|
||||
phys = <&pcie0_phy>, <&pcie1_phy>, <&pcie2_phy>;
|
||||
phy-names = "pcie-phy0", "pcie-phy1", "pcie-phy2";
|
||||
power-domains = <&scpsys MT2701_POWER_DOMAIN_HIF>;
|
||||
bus-range = <0x00 0xff>;
|
||||
ranges = <0x81000000 0 0x1a160000 0 0x1a160000 0 0x00010000 /* I/O space */
|
||||
0x83000000 0 0x60000000 0 0x60000000 0 0x10000000>; /* memory space */
|
||||
|
||||
pcie@0,0 {
|
||||
device_type = "pci";
|
||||
reg = <0x0000 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
#interrupt-cells = <1>;
|
||||
interrupt-map-mask = <0 0 0 0>;
|
||||
interrupt-map = <0 0 0 0 &sysirq GIC_SPI 193 IRQ_TYPE_LEVEL_LOW>;
|
||||
ranges;
|
||||
num-lanes = <1>;
|
||||
};
|
||||
|
||||
pcie@1,0 {
|
||||
device_type = "pci";
|
||||
reg = <0x0800 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
#interrupt-cells = <1>;
|
||||
interrupt-map-mask = <0 0 0 0>;
|
||||
interrupt-map = <0 0 0 0 &sysirq GIC_SPI 194 IRQ_TYPE_LEVEL_LOW>;
|
||||
ranges;
|
||||
num-lanes = <1>;
|
||||
};
|
||||
|
||||
pcie@2,0 {
|
||||
device_type = "pci";
|
||||
reg = <0x1000 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
#interrupt-cells = <1>;
|
||||
interrupt-map-mask = <0 0 0 0>;
|
||||
interrupt-map = <0 0 0 0 &sysirq GIC_SPI 195 IRQ_TYPE_LEVEL_LOW>;
|
||||
ranges;
|
||||
num-lanes = <1>;
|
||||
};
|
||||
};
|
||||
@@ -8,6 +8,7 @@
|
||||
- "qcom,pcie-apq8064" for apq8064
|
||||
- "qcom,pcie-apq8084" for apq8084
|
||||
- "qcom,pcie-msm8996" for msm8996 or apq8096
|
||||
- "qcom,pcie-ipq4019" for ipq4019
|
||||
|
||||
- reg:
|
||||
Usage: required
|
||||
@@ -87,7 +88,7 @@
|
||||
- "core" Clocks the pcie hw block
|
||||
- "phy" Clocks the pcie PHY block
|
||||
- clock-names:
|
||||
Usage: required for apq8084
|
||||
Usage: required for apq8084/ipq4019
|
||||
Value type: <stringlist>
|
||||
Definition: Should contain the following entries
|
||||
- "aux" Auxiliary (AUX) clock
|
||||
@@ -126,6 +127,23 @@
|
||||
Definition: Should contain the following entries
|
||||
- "core" Core reset
|
||||
|
||||
- reset-names:
|
||||
Usage: required for ipq/apq8064
|
||||
Value type: <stringlist>
|
||||
Definition: Should contain the following entries
|
||||
- "axi_m" AXI master reset
|
||||
- "axi_s" AXI slave reset
|
||||
- "pipe" PIPE reset
|
||||
- "axi_m_vmid" VMID reset
|
||||
- "axi_s_xpu" XPU reset
|
||||
- "parf" PARF reset
|
||||
- "phy" PHY reset
|
||||
- "axi_m_sticky" AXI sticky reset
|
||||
- "pipe_sticky" PIPE sticky reset
|
||||
- "pwr" PWR reset
|
||||
- "ahb" AHB reset
|
||||
- "phy_ahb" PHY AHB reset
|
||||
|
||||
- power-domains:
|
||||
Usage: required for apq8084 and msm8996/apq8096
|
||||
Value type: <prop-encoded-array>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
* Renesas RCar PCIe interface
|
||||
* Renesas R-Car PCIe interface
|
||||
|
||||
Required properties:
|
||||
compatible: "renesas,pcie-r8a7779" for the R8A7779 SoC;
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
Sigma Designs Tango PCIe controller
|
||||
|
||||
Required properties:
|
||||
|
||||
- compatible: "sigma,smp8759-pcie"
|
||||
- reg: address/size of PCI configuration space, address/size of register area
|
||||
- bus-range: defined by size of PCI configuration space
|
||||
- device_type: "pci"
|
||||
- #size-cells: <2>
|
||||
- #address-cells: <3>
|
||||
- msi-controller
|
||||
- ranges: translation from system to bus addresses
|
||||
- interrupts: spec for misc interrupts, spec for MSI
|
||||
|
||||
Example:
|
||||
|
||||
pcie@2e000 {
|
||||
compatible = "sigma,smp8759-pcie";
|
||||
reg = <0x50000000 0x400000>, <0x2e000 0x100>;
|
||||
bus-range = <0 3>;
|
||||
device_type = "pci";
|
||||
#size-cells = <2>;
|
||||
#address-cells = <3>;
|
||||
msi-controller;
|
||||
ranges = <0x02000000 0x0 0x00400000 0x50400000 0x0 0x3c00000>;
|
||||
interrupts =
|
||||
<54 IRQ_TYPE_LEVEL_HIGH>, /* misc interrupts */
|
||||
<55 IRQ_TYPE_LEVEL_HIGH>; /* MSI */
|
||||
};
|
||||
@@ -348,6 +348,7 @@ PER-CPU MEM
|
||||
devm_free_percpu()
|
||||
|
||||
PCI
|
||||
devm_pci_alloc_host_bridge() : managed PCI host bridge allocation
|
||||
devm_pci_remap_cfgspace() : ioremap PCI configuration space
|
||||
devm_pci_remap_cfg_resource() : ioremap PCI configuration space resource
|
||||
pcim_enable_device() : after success, all PCI ops become managed
|
||||
|
||||
+16
-1
@@ -10160,9 +10160,16 @@ S: Maintained
|
||||
F: Documentation/devicetree/bindings/pci/hisilicon-pcie.txt
|
||||
F: drivers/pci/dwc/pcie-hisi.c
|
||||
|
||||
PCIE DRIVER FOR HISILICON KIRIN
|
||||
M: Xiaowei Song <songxiaowei@hisilicon.com>
|
||||
M: Binghui Wang <wangbinghui@hisilicon.com>
|
||||
L: linux-pci@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/pci/pcie-kirin.txt
|
||||
F: drivers/pci/dwc/pcie-kirin.c
|
||||
|
||||
PCIE DRIVER FOR ROCKCHIP
|
||||
M: Shawn Lin <shawn.lin@rock-chips.com>
|
||||
M: Wenrui Li <wenrui.li@rock-chips.com>
|
||||
L: linux-pci@vger.kernel.org
|
||||
L: linux-rockchip@lists.infradead.org
|
||||
S: Maintained
|
||||
@@ -10184,6 +10191,14 @@ S: Supported
|
||||
F: Documentation/devicetree/bindings/pci/pci-thunder-*
|
||||
F: drivers/pci/host/pci-thunder-*
|
||||
|
||||
PCIE DRIVER FOR MEDIATEK
|
||||
M: Ryder Lee <ryder.lee@mediatek.com>
|
||||
L: linux-pci@vger.kernel.org
|
||||
L: linux-mediatek@lists.infradead.org
|
||||
S: Supported
|
||||
F: Documentation/devicetree/bindings/pci/mediatek*
|
||||
F: drivers/pci/host/*mediatek*
|
||||
|
||||
PCMCIA SUBSYSTEM
|
||||
P: Linux PCMCIA Team
|
||||
L: linux-pcmcia@lists.infradead.org
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
struct pci_sys_data;
|
||||
struct pci_ops;
|
||||
struct pci_bus;
|
||||
struct pci_host_bridge;
|
||||
struct device;
|
||||
|
||||
struct hw_pci {
|
||||
@@ -25,7 +26,7 @@ struct hw_pci {
|
||||
unsigned int io_optional:1;
|
||||
void **private_data;
|
||||
int (*setup)(int nr, struct pci_sys_data *);
|
||||
struct pci_bus *(*scan)(int nr, struct pci_sys_data *);
|
||||
int (*scan)(int nr, struct pci_host_bridge *);
|
||||
void (*preinit)(void);
|
||||
void (*postinit)(void);
|
||||
u8 (*swizzle)(struct pci_dev *dev, u8 *pin);
|
||||
|
||||
+29
-17
@@ -458,10 +458,14 @@ static void pcibios_init_hw(struct device *parent, struct hw_pci *hw,
|
||||
int nr, busnr;
|
||||
|
||||
for (nr = busnr = 0; nr < hw->nr_controllers; nr++) {
|
||||
sys = kzalloc(sizeof(struct pci_sys_data), GFP_KERNEL);
|
||||
if (WARN(!sys, "PCI: unable to allocate sys data!"))
|
||||
struct pci_host_bridge *bridge;
|
||||
|
||||
bridge = pci_alloc_host_bridge(sizeof(struct pci_sys_data));
|
||||
if (WARN(!bridge, "PCI: unable to allocate bridge!"))
|
||||
break;
|
||||
|
||||
sys = pci_host_bridge_priv(bridge);
|
||||
|
||||
sys->busnr = busnr;
|
||||
sys->swizzle = hw->swizzle;
|
||||
sys->map_irq = hw->map_irq;
|
||||
@@ -473,7 +477,6 @@ static void pcibios_init_hw(struct device *parent, struct hw_pci *hw,
|
||||
ret = hw->setup(nr, sys);
|
||||
|
||||
if (ret > 0) {
|
||||
struct pci_host_bridge *host_bridge;
|
||||
|
||||
ret = pcibios_init_resource(nr, sys, hw->io_optional);
|
||||
if (ret) {
|
||||
@@ -481,26 +484,37 @@ static void pcibios_init_hw(struct device *parent, struct hw_pci *hw,
|
||||
break;
|
||||
}
|
||||
|
||||
if (hw->scan)
|
||||
sys->bus = hw->scan(nr, sys);
|
||||
else
|
||||
sys->bus = pci_scan_root_bus_msi(parent,
|
||||
sys->busnr, hw->ops, sys,
|
||||
&sys->resources, hw->msi_ctrl);
|
||||
bridge->map_irq = pcibios_map_irq;
|
||||
bridge->swizzle_irq = pcibios_swizzle;
|
||||
|
||||
if (WARN(!sys->bus, "PCI: unable to scan bus!")) {
|
||||
kfree(sys);
|
||||
if (hw->scan)
|
||||
ret = hw->scan(nr, bridge);
|
||||
else {
|
||||
list_splice_init(&sys->resources,
|
||||
&bridge->windows);
|
||||
bridge->dev.parent = parent;
|
||||
bridge->sysdata = sys;
|
||||
bridge->busnr = sys->busnr;
|
||||
bridge->ops = hw->ops;
|
||||
bridge->msi = hw->msi_ctrl;
|
||||
bridge->align_resource =
|
||||
hw->align_resource;
|
||||
|
||||
ret = pci_scan_root_bus_bridge(bridge);
|
||||
}
|
||||
|
||||
if (WARN(ret < 0, "PCI: unable to scan bus!")) {
|
||||
pci_free_host_bridge(bridge);
|
||||
break;
|
||||
}
|
||||
|
||||
sys->bus = bridge->bus;
|
||||
|
||||
busnr = sys->bus->busn_res.end + 1;
|
||||
|
||||
list_add(&sys->node, head);
|
||||
|
||||
host_bridge = pci_find_host_bridge(sys->bus);
|
||||
host_bridge->align_resource = hw->align_resource;
|
||||
} else {
|
||||
kfree(sys);
|
||||
pci_free_host_bridge(bridge);
|
||||
if (ret < 0)
|
||||
break;
|
||||
}
|
||||
@@ -519,8 +533,6 @@ void pci_common_init_dev(struct device *parent, struct hw_pci *hw)
|
||||
if (hw->postinit)
|
||||
hw->postinit();
|
||||
|
||||
pci_fixup_irqs(pcibios_swizzle, pcibios_map_irq);
|
||||
|
||||
list_for_each_entry(sys, &head, node) {
|
||||
struct pci_bus *bus = sys->bus;
|
||||
|
||||
|
||||
@@ -152,16 +152,23 @@ static void rc_pci_fixup(struct pci_dev *dev)
|
||||
}
|
||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MARVELL, PCI_ANY_ID, rc_pci_fixup);
|
||||
|
||||
static struct pci_bus __init *
|
||||
dove_pcie_scan_bus(int nr, struct pci_sys_data *sys)
|
||||
static int __init
|
||||
dove_pcie_scan_bus(int nr, struct pci_host_bridge *bridge)
|
||||
{
|
||||
struct pci_sys_data *sys = pci_host_bridge_priv(bridge);
|
||||
|
||||
if (nr >= num_pcie_ports) {
|
||||
BUG();
|
||||
return NULL;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return pci_scan_root_bus(NULL, sys->busnr, &pcie_ops, sys,
|
||||
&sys->resources);
|
||||
list_splice_init(&sys->resources, &bridge->windows);
|
||||
bridge->dev.parent = NULL;
|
||||
bridge->sysdata = sys;
|
||||
bridge->busnr = sys->busnr;
|
||||
bridge->ops = &pcie_ops;
|
||||
|
||||
return pci_scan_root_bus_bridge(bridge);
|
||||
}
|
||||
|
||||
static int __init dove_pcie_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
|
||||
+20
-11
@@ -504,10 +504,10 @@ iop13xx_pci_abort(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
|
||||
|
||||
/* Scan an IOP13XX PCI bus. nr selects which ATU we use.
|
||||
*/
|
||||
struct pci_bus *iop13xx_scan_bus(int nr, struct pci_sys_data *sys)
|
||||
int iop13xx_scan_bus(int nr, struct pci_host_bridge *bridge)
|
||||
{
|
||||
int which_atu;
|
||||
struct pci_bus *bus = NULL;
|
||||
int which_atu, ret;
|
||||
struct pci_sys_data *sys = pci_host_bridge_priv(bridge);
|
||||
|
||||
switch (init_atu) {
|
||||
case IOP13XX_INIT_ATU_ATUX:
|
||||
@@ -525,9 +525,14 @@ struct pci_bus *iop13xx_scan_bus(int nr, struct pci_sys_data *sys)
|
||||
|
||||
if (!which_atu) {
|
||||
BUG();
|
||||
return NULL;
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
list_splice_init(&sys->resources, &bridge->windows);
|
||||
bridge->dev.parent = NULL;
|
||||
bridge->sysdata = sys;
|
||||
bridge->busnr = sys->busnr;
|
||||
|
||||
switch (which_atu) {
|
||||
case IOP13XX_INIT_ATU_ATUX:
|
||||
if (time_after_eq(jiffies + msecs_to_jiffies(1000),
|
||||
@@ -535,18 +540,22 @@ struct pci_bus *iop13xx_scan_bus(int nr, struct pci_sys_data *sys)
|
||||
while(time_before(jiffies, atux_trhfa_timeout))
|
||||
udelay(100);
|
||||
|
||||
bus = pci_bus_atux = pci_scan_root_bus(NULL, sys->busnr,
|
||||
&iop13xx_atux_ops,
|
||||
sys, &sys->resources);
|
||||
bridge->ops = &iop13xx_atux_ops;
|
||||
ret = pci_scan_root_bus_bridge(bridge);
|
||||
if (!ret)
|
||||
pci_bus_atux = bridge->bus;
|
||||
break;
|
||||
case IOP13XX_INIT_ATU_ATUE:
|
||||
bus = pci_bus_atue = pci_scan_root_bus(NULL, sys->busnr,
|
||||
&iop13xx_atue_ops,
|
||||
sys, &sys->resources);
|
||||
bridge->ops = &iop13xx_atue_ops;
|
||||
ret = pci_scan_root_bus_bridge(bridge);
|
||||
if (!ret)
|
||||
pci_bus_atue = bridge->bus;
|
||||
break;
|
||||
default:
|
||||
ret = -EINVAL;
|
||||
}
|
||||
|
||||
return bus;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* This function is called from iop13xx_pci_init() after assigning valid
|
||||
|
||||
@@ -11,9 +11,10 @@ extern size_t iop13xx_atue_mem_size;
|
||||
extern size_t iop13xx_atux_mem_size;
|
||||
|
||||
struct pci_sys_data;
|
||||
struct pci_host_bridge;
|
||||
struct hw_pci;
|
||||
int iop13xx_pci_setup(int nr, struct pci_sys_data *sys);
|
||||
struct pci_bus *iop13xx_scan_bus(int nr, struct pci_sys_data *);
|
||||
int iop13xx_scan_bus(int nr, struct pci_host_bridge *bridge);
|
||||
void iop13xx_atu_select(struct hw_pci *plat_pci);
|
||||
void iop13xx_pci_init(void);
|
||||
void iop13xx_map_pci_memory(void);
|
||||
|
||||
@@ -194,16 +194,22 @@ static void rc_pci_fixup(struct pci_dev *dev)
|
||||
}
|
||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MARVELL, PCI_ANY_ID, rc_pci_fixup);
|
||||
|
||||
static struct pci_bus __init *
|
||||
mv78xx0_pcie_scan_bus(int nr, struct pci_sys_data *sys)
|
||||
static int __init mv78xx0_pcie_scan_bus(int nr, struct pci_host_bridge *bridge)
|
||||
{
|
||||
struct pci_sys_data *sys = pci_host_bridge_priv(bridge);
|
||||
|
||||
if (nr >= num_pcie_ports) {
|
||||
BUG();
|
||||
return NULL;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return pci_scan_root_bus(NULL, sys->busnr, &pcie_ops, sys,
|
||||
&sys->resources);
|
||||
list_splice_init(&sys->resources, &bridge->windows);
|
||||
bridge->dev.parent = NULL;
|
||||
bridge->sysdata = sys;
|
||||
bridge->busnr = sys->busnr;
|
||||
bridge->ops = &pcie_ops;
|
||||
|
||||
return pci_scan_root_bus_bridge(bridge);
|
||||
}
|
||||
|
||||
static int __init mv78xx0_pcie_map_irq(const struct pci_dev *dev, u8 slot,
|
||||
|
||||
@@ -54,6 +54,7 @@ void orion5x_restart(enum reboot_mode, const char *);
|
||||
* PCIe/PCI functions.
|
||||
*/
|
||||
struct pci_bus;
|
||||
struct pci_host_bridge;
|
||||
struct pci_sys_data;
|
||||
struct pci_dev;
|
||||
|
||||
@@ -61,7 +62,7 @@ void orion5x_pcie_id(u32 *dev, u32 *rev);
|
||||
void orion5x_pci_disable(void);
|
||||
void orion5x_pci_set_cardbus_mode(void);
|
||||
int orion5x_pci_sys_setup(int nr, struct pci_sys_data *sys);
|
||||
struct pci_bus *orion5x_pci_sys_scan_bus(int nr, struct pci_sys_data *sys);
|
||||
int orion5x_pci_sys_scan_bus(int nr, struct pci_host_bridge *bridge);
|
||||
int orion5x_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin);
|
||||
|
||||
struct tag;
|
||||
|
||||
@@ -555,18 +555,27 @@ int __init orion5x_pci_sys_setup(int nr, struct pci_sys_data *sys)
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct pci_bus __init *orion5x_pci_sys_scan_bus(int nr, struct pci_sys_data *sys)
|
||||
int __init orion5x_pci_sys_scan_bus(int nr, struct pci_host_bridge *bridge)
|
||||
{
|
||||
if (nr == 0)
|
||||
return pci_scan_root_bus(NULL, sys->busnr, &pcie_ops, sys,
|
||||
&sys->resources);
|
||||
struct pci_sys_data *sys = pci_host_bridge_priv(bridge);
|
||||
|
||||
if (nr == 1 && !orion5x_pci_disabled)
|
||||
return pci_scan_root_bus(NULL, sys->busnr, &pci_ops, sys,
|
||||
&sys->resources);
|
||||
list_splice_init(&sys->resources, &bridge->windows);
|
||||
bridge->dev.parent = NULL;
|
||||
bridge->sysdata = sys;
|
||||
bridge->busnr = sys->busnr;
|
||||
|
||||
if (nr == 0) {
|
||||
bridge->ops = &pcie_ops;
|
||||
return pci_scan_root_bus_bridge(bridge);
|
||||
}
|
||||
|
||||
if (nr == 1 && !orion5x_pci_disabled) {
|
||||
bridge->ops = &pci_ops;
|
||||
return pci_scan_root_bus_bridge(bridge);
|
||||
}
|
||||
|
||||
BUG();
|
||||
return NULL;
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
int __init orion5x_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
|
||||
@@ -39,20 +39,18 @@ resource_size_t pcibios_align_resource(void *data, const struct resource *res,
|
||||
return res->start;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
/*
|
||||
* Try to assign the IRQ number when probing a new device
|
||||
*/
|
||||
int pcibios_alloc_irq(struct pci_dev *dev)
|
||||
{
|
||||
if (acpi_disabled)
|
||||
dev->irq = of_irq_parse_and_map_pci(dev, 0, 0);
|
||||
#ifdef CONFIG_ACPI
|
||||
else
|
||||
return acpi_pci_irq_enable(dev);
|
||||
#endif
|
||||
if (!acpi_disabled)
|
||||
acpi_pci_irq_enable(dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* raw_pci_read/write - Platform-specific PCI config space access.
|
||||
|
||||
@@ -80,7 +80,6 @@ extern u32 cs5536_pci_conf_read4(int function, int reg);
|
||||
#define PCI_BAR3_REG 0x1c
|
||||
#define PCI_BAR4_REG 0x20
|
||||
#define PCI_BAR5_REG 0x24
|
||||
#define PCI_BAR_COUNT 6
|
||||
#define PCI_BAR_RANGE_MASK 0xFFFFFFFF
|
||||
|
||||
/* CARDBUS CIS POINTER */
|
||||
|
||||
@@ -39,7 +39,6 @@ struct pci_controller {
|
||||
unsigned long io_offset;
|
||||
unsigned long io_map_base;
|
||||
struct resource *busn_resource;
|
||||
unsigned long busn_offset;
|
||||
|
||||
#ifndef CONFIG_PCI_DOMAINS_GENERIC
|
||||
unsigned int index;
|
||||
|
||||
@@ -86,8 +86,7 @@ static void pcibios_scanbus(struct pci_controller *hose)
|
||||
hose->mem_resource, hose->mem_offset);
|
||||
pci_add_resource_offset(&resources,
|
||||
hose->io_resource, hose->io_offset);
|
||||
pci_add_resource_offset(&resources,
|
||||
hose->busn_resource, hose->busn_offset);
|
||||
pci_add_resource(&resources, hose->busn_resource);
|
||||
bus = pci_scan_root_bus(NULL, next_busno, hose->pci_ops, hose,
|
||||
&resources);
|
||||
hose->bus = bus;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user