]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/dev/bhnd/cores/pci/bhnd_pci_hostbvar.h
Update to bmake-201802222
[FreeBSD/FreeBSD.git] / sys / dev / bhnd / cores / pci / bhnd_pci_hostbvar.h
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3  *
4  * Copyright (c) 2015-2016 Landon Fuller <landon@landonf.org>
5  * All rights reserved.
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 at minimum a disclaimer
14  *    similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
15  *    redistribution must be conditioned upon including a substantially
16  *    similar Disclaimer requirement for further binary redistribution.
17  *
18  * NO WARRANTY
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21  * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
22  * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
23  * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
24  * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
27  * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
29  * THE POSSIBILITY OF SUCH DAMAGES.
30  * 
31  * $FreeBSD$
32  */
33
34 #ifndef _BHND_CORES_PCI_BHND_PCI_HOSTBVAR_H_
35 #define _BHND_CORES_PCI_BHND_PCI_HOSTBVAR_H_
36
37 /*
38  * PCI/PCIe-Gen1 Host Bridge definitions.
39  */
40
41 #include <sys/param.h>
42 #include <sys/bus.h>
43
44 #include "bhnd_pcivar.h"
45
46 DECLARE_CLASS(bhnd_pci_hostb_driver);
47
48 /**
49  * PCI/PCIe-Gen1 endpoint-mode device quirks
50  */
51 enum {
52         /** No quirks */
53         BHND_PCI_QUIRK_NONE                     = 0,
54         
55         /**
56          * SBTOPCI_PREF and SBTOPCI_BURST must be set on the
57          * SSB_PCICORE_SBTOPCI2 register.
58          */
59         BHND_PCI_QUIRK_SBTOPCI2_PREF_BURST      = (1<<1),
60
61         /**
62          * SBTOPCI_RC_READMULTI must be set on the SSB_PCICORE_SBTOPCI2
63          * register.
64          */
65         BHND_PCI_QUIRK_SBTOPCI2_READMULTI       = (1<<2),
66
67         /**
68          * PCI CLKRUN# should be disabled on attach (via CLKRUN_DSBL).
69          * 
70          * The purpose of this work-around is unclear; there is some
71          * documentation regarding earlier Broadcom drivers supporting
72          * a "force CLKRUN#" *enable* registry key for use on mobile
73          * hardware.
74          */
75         BHND_PCI_QUIRK_CLKRUN_DSBL              = (1<<3),
76
77         /**
78          * On PCI-attached BCM4321CB* boards, the PCI latency timer must be set
79          * to 960ns on initial attach.
80          */
81         BHND_PCI_QUIRK_960NS_LATTIM_OVR         = (1<<4),
82
83         /**
84          * TLP workaround for unmatched address handling is required.
85          * 
86          * This TLP workaround will enable setting of the PCIe UR status bit
87          * on memory access to an unmatched address.
88          */
89         BHND_PCIE_QUIRK_UR_STATUS_FIX           = (1<<5),
90
91         /**
92          * PCI-PM power management must be explicitly enabled via
93          * the data link control register.
94          */
95         BHND_PCIE_QUIRK_PCIPM_REQEN             = (1<<6),
96
97         /**
98          * Fix L0s to L0 exit transition on SerDes <= rev9 devices.
99          * 
100          * On these devices, PCIe/SerDes symbol lock can be lost if the
101          * reference clock has not fully stabilized during the L0s to L0
102          * exit transition, triggering an internal reset of the chip.
103          * 
104          * The SerDes RX CDR phase lock timers and proportional/integral
105          * filters must be tweaked to ensure the CDR has fully stabilized
106          * before asserting receive sequencer completion.
107          */
108         BHND_PCIE_QUIRK_SDR9_L0s_HANG           = (1<<7),
109
110         /**
111          * The idle time for entering L1 low-power state must be
112          * explicitly set (to 114ns) to fix slow L1->L0 transition issues.
113          */
114         BHND_PCIE_QUIRK_L1_IDLE_THRESH          = (1<<8),
115         
116         /**
117          * The ASPM L1 entry timer should be extended for better performance,
118          * and restored for better power savings.
119          */
120         BHND_PCIE_QUIRK_L1_TIMER_PERF           = (1<<9),
121
122         /**
123          * ASPM and ECPM settings must be overridden manually.
124          * Applies to 4311B0/4321B1 chipset revisions.
125          * 
126          * The override behavior is controlled by the BHND_BFL2_PCIEWAR_OVR
127          * flag; if set, ASPM and CLKREQ should be explicitly disabled. If not
128          * set, they should be explicitly enabled.
129          * 
130          * Attach/Resume:
131          *   - Update SRSH_ASPM_ENB flag in the SPROM ASPM register.
132          *   - Update SRSH_CLKREQ_ENB flag in the SPROM CLKREQ_REV5
133          *     register.
134          *   - Update ASPM L0S/L1 flags in PCIER_LINK_CTL register.
135          *   - Clear CLKREQ (ECPM) flag in PCIER_LINK_CTL register.
136          * 
137          * Suspend:
138          *   - Clear ASPM L1 flag in the PCIER_LINK_CTL register.
139          *   - Set CLKREQ (ECPM) flag in the PCIER_LINK_CTL register.
140          * 
141          * Detach:
142          *   - Set CLKREQ (ECPM) flag in the PCIER_LINK_CTL register.
143          */
144         BHND_PCIE_QUIRK_ASPM_OVR                = (1<<10),
145
146         /**
147          * A subset of Apple devices did not set the BHND_BFL2_PCIEWAR_OVR
148          * flag in SPROM; on these devices, the BHND_BFL2_PCIEWAR_OVR flag
149          * should always be treated as if set.
150          */
151         BHND_PCIE_QUIRK_BFL2_PCIEWAR_EN         = (1<<11),
152
153         /**
154          * Fix SerDes polarity on SerDes <= rev9 devices.
155          *
156          * The SerDes polarity must be saved at device attachment, and
157          * restored on suspend/resume.
158          */
159         BHND_PCIE_QUIRK_SDR9_POLARITY           = (1<<12),
160
161         /**
162          * SerDes PLL down flag must be manually disabled (by ChipCommon) on
163          * resume.
164          */
165         BHND_PCIE_QUIRK_SERDES_NOPLLDOWN        = (1<<13),
166
167         /**
168          * On attach and resume, consult the SPROM to determine whether
169          * the L2/L3-Ready w/o PCI RESET work-around must be applied.
170          *
171          * If L23READY_EXIT_NOPRST is not already set in the SPROM, set it
172          */
173         BHND_PCIE_QUIRK_SPROM_L23_PCI_RESET     = (1<<14),
174         
175         /**
176          * The PCIe SerDes PLL must be configured to not retry the startup
177          * sequence upon frequency detection failure on SerDes <= rev9 devices
178          * 
179          * The issue this workaround resolves is unknown.
180          */
181         BHND_PCIE_QUIRK_SDR9_NO_FREQRETRY       = (1<<15),
182
183         /**
184          * Common flag for quirks that require PCIe SerDes TX
185          * drive strength adjustment.
186          * 
187          * Only applies to PCIe >= rev10 devices.
188          */
189         BHND_PCIE_QUIRK_SERDES_TXDRV_ADJUST     = (1<<16),
190
191         /**
192          * On Apple BCM94322X9 devices, the PCIe SerDes TX drive strength
193          * should be set to 700mV.
194          *
195          * The exact issue is unknown, but presumably this workaround
196          * resolves signal integrity issues with these devices.
197          * 
198          * Only applies to PCIe >= rev10 devices.
199          */
200         BHND_PCIE_QUIRK_SERDES_TXDRV_700MV      = (1<<17) |
201             BHND_PCIE_QUIRK_SERDES_TXDRV_ADJUST,
202
203         /**
204          * On some Apple BCM4331-based devices, the PCIe SerDes TX drive
205          * strength should be set to its maximum.
206          *
207          * The exact issue is unknown, but presumably this workaround
208          * resolves signal integrity issues with these devices.
209          */
210         BHND_PCIE_QUIRK_SERDES_TXDRV_MAX        = (1<<18) |
211             BHND_PCIE_QUIRK_SERDES_TXDRV_ADJUST,
212
213         /**
214          * PCIe cores prior to rev18 do not support an MRRS larger than
215          * 128 bytes.
216          */
217         BHND_PCIE_QUIRK_MAX_MRRS_128            = (1<<19),
218
219         /**
220          * The PCIe core should be configured with an MRRS of 512 bytes.
221          */
222         BHND_PCIE_QUIRK_DEFAULT_MRRS_512        = (1<<20),
223 };
224
225 /**
226  * bhnd_pci_hostb driver instance state.
227  */
228 struct bhnd_pcihb_softc {
229         struct bhnd_pci_softc   common;         /**< common bhnd_pci state */
230         device_t                dev;
231         device_t                pci_dev;        /**< host PCI device */
232         uint32_t                quirks;         /**< hostb device quirks */
233
234         /** BHND_PCIE_QUIRK_ASPM_OVR state. */
235         struct {
236                 /**
237                  * ASPM/CLKREQ override setting.
238                  * 
239                  * If true, ASPM/CLKREQ should be overridden as enabled.
240                  * If false, ASPM/CLKREQ should be overridden as disabled.
241                  */
242                 bool aspm_en;
243         } aspm_quirk_override;
244
245         /** BHND_PCIE_QUIRK_SDR9_POLARITY state. */
246         struct {
247                 /** 
248                  * PCIe SerDes RX polarity.
249                  *
250                  * Initialized to the PCIe link's RX polarity
251                  * at attach time. This is used to restore the
252                  * correct polarity on resume */
253                 bool    inv;
254         } sdr9_quirk_polarity;
255 };
256
257
258 #endif /* _BHND_CORES_PCI_BHND_PCI_HOSTBVAR_H_ */