Commit | Line | Data |
---|---|---|
4b1ced84 JH |
1 | /* |
2 | * Synopsys Designware PCIe host controller driver | |
3 | * | |
4 | * Copyright (C) 2013 Samsung Electronics Co., Ltd. | |
5 | * http://www.samsung.com | |
6 | * | |
7 | * Author: Jingoo Han <jg1.han@samsung.com> | |
8 | * | |
9 | * This program is free software; you can redistribute it and/or modify | |
10 | * it under the terms of the GNU General Public License version 2 as | |
11 | * published by the Free Software Foundation. | |
12 | */ | |
13 | ||
18edf451 SJ |
14 | #ifndef _PCIE_DESIGNWARE_H |
15 | #define _PCIE_DESIGNWARE_H | |
16 | ||
f342d940 JH |
17 | /* |
18 | * Maximum number of MSI IRQs can be 256 per controller. But keep | |
19 | * it 32 as of now. Probably we will never need more than 32. If needed, | |
20 | * then increment it in multiple of 32. | |
21 | */ | |
22 | #define MAX_MSI_IRQS 32 | |
23 | #define MAX_MSI_CTRLS (MAX_MSI_IRQS / 32) | |
24 | ||
886bc5ce JP |
25 | /* Parameters for the waiting for link up routine */ |
26 | #define LINK_WAIT_MAX_RETRIES 10 | |
27 | #define LINK_WAIT_USLEEP_MIN 90000 | |
28 | #define LINK_WAIT_USLEEP_MAX 100000 | |
29 | ||
4b1ced84 JH |
30 | struct pcie_port { |
31 | struct device *dev; | |
32 | u8 root_bus_nr; | |
33 | void __iomem *dbi_base; | |
34 | u64 cfg0_base; | |
35 | void __iomem *va_cfg0_base; | |
adf70fc0 | 36 | u32 cfg0_size; |
4b1ced84 JH |
37 | u64 cfg1_base; |
38 | void __iomem *va_cfg1_base; | |
adf70fc0 | 39 | u32 cfg1_size; |
0021d22b | 40 | resource_size_t io_base; |
adf70fc0 PA |
41 | phys_addr_t io_bus_addr; |
42 | u32 io_size; | |
4b1ced84 | 43 | u64 mem_base; |
adf70fc0 PA |
44 | phys_addr_t mem_bus_addr; |
45 | u32 mem_size; | |
0021d22b ZW |
46 | struct resource *cfg; |
47 | struct resource *io; | |
48 | struct resource *mem; | |
49 | struct resource *busn; | |
4b1ced84 JH |
50 | int irq; |
51 | u32 lanes; | |
52 | struct pcie_host_ops *ops; | |
f342d940 | 53 | int msi_irq; |
904d0e78 | 54 | struct irq_domain *irq_domain; |
f342d940 JH |
55 | unsigned long msi_data; |
56 | DECLARE_BITMAP(msi_irq_in_use, MAX_MSI_IRQS); | |
4b1ced84 JH |
57 | }; |
58 | ||
59 | struct pcie_host_ops { | |
60 | void (*readl_rc)(struct pcie_port *pp, | |
61 | void __iomem *dbi_base, u32 *val); | |
62 | void (*writel_rc)(struct pcie_port *pp, | |
63 | u32 val, void __iomem *dbi_base); | |
64 | int (*rd_own_conf)(struct pcie_port *pp, int where, int size, u32 *val); | |
65 | int (*wr_own_conf)(struct pcie_port *pp, int where, int size, u32 val); | |
a1c0ae9c MK |
66 | int (*rd_other_conf)(struct pcie_port *pp, struct pci_bus *bus, |
67 | unsigned int devfn, int where, int size, u32 *val); | |
68 | int (*wr_other_conf)(struct pcie_port *pp, struct pci_bus *bus, | |
69 | unsigned int devfn, int where, int size, u32 val); | |
4b1ced84 JH |
70 | int (*link_up)(struct pcie_port *pp); |
71 | void (*host_init)(struct pcie_port *pp); | |
2f37c5a8 MK |
72 | void (*msi_set_irq)(struct pcie_port *pp, int irq); |
73 | void (*msi_clear_irq)(struct pcie_port *pp, int irq); | |
98a97e6f | 74 | phys_addr_t (*get_msi_addr)(struct pcie_port *pp); |
24832b4d | 75 | u32 (*get_msi_data)(struct pcie_port *pp, int pos); |
b14a3d17 | 76 | void (*scan_bus)(struct pcie_port *pp); |
c2791b80 | 77 | int (*msi_host_init)(struct pcie_port *pp, struct msi_controller *chip); |
4b1ced84 JH |
78 | }; |
79 | ||
4c45852f GP |
80 | int dw_pcie_cfg_read(void __iomem *addr, int size, u32 *val); |
81 | int dw_pcie_cfg_write(void __iomem *addr, int size, u32 val); | |
7f4f16ee | 82 | irqreturn_t dw_handle_msi_irq(struct pcie_port *pp); |
f342d940 | 83 | void dw_pcie_msi_init(struct pcie_port *pp); |
886bc5ce | 84 | int dw_pcie_wait_for_link(struct pcie_port *pp); |
4b1ced84 JH |
85 | int dw_pcie_link_up(struct pcie_port *pp); |
86 | void dw_pcie_setup_rc(struct pcie_port *pp); | |
87 | int dw_pcie_host_init(struct pcie_port *pp); | |
18edf451 SJ |
88 | |
89 | #endif /* _PCIE_DESIGNWARE_H */ |