7b1f91ce8b
This add a bhnd device table mechanism that standardizes matching of devices on the bhnd(4) bus, discovery of device quirk flags, and should be pluggable into the new PNPINFO machinery. Submitted by: Landon Fuller <landonf@landonf.org> Differential Revision: https://reviews.freebsd.org/D5759
242 lines
7.5 KiB
C
242 lines
7.5 KiB
C
/*-
|
|
* Copyright (c) 2015 Landon Fuller <landon@landonf.org>
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer,
|
|
* without modification.
|
|
* 2. Redistributions in binary form must reproduce at minimum a disclaimer
|
|
* similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
|
|
* redistribution must be conditioned upon including a substantially
|
|
* similar Disclaimer requirement for further binary redistribution.
|
|
*
|
|
* NO WARRANTY
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
* LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
|
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
|
* THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
|
|
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
|
|
* IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
|
* THE POSSIBILITY OF SUCH DAMAGES.
|
|
*
|
|
* $FreeBSD$
|
|
*/
|
|
|
|
#ifndef _BHND_BHNDB_PCIVAR_H_
|
|
#define _BHND_BHNDB_PCIVAR_H_
|
|
|
|
#include <sys/stdint.h>
|
|
|
|
#include <dev/bhnd/cores/pci/bhnd_pcivar.h>
|
|
|
|
#include "bhndbvar.h"
|
|
|
|
/*
|
|
* bhndb(4) PCI driver subclass.
|
|
*/
|
|
|
|
DECLARE_CLASS(bhndb_pci_driver);
|
|
|
|
struct bhndb_pci_softc;
|
|
|
|
/*
|
|
* An interconnect-specific function implementing BHNDB_SET_WINDOW_ADDR
|
|
*/
|
|
typedef int (*bhndb_pci_set_regwin_t)(struct bhndb_pci_softc *sc,
|
|
const struct bhndb_regwin *rw, bhnd_addr_t addr);
|
|
|
|
|
|
/**
|
|
* PCI bridge core identification table.
|
|
*/
|
|
struct bhndb_pci_id {
|
|
uint16_t device; /**< bhnd device ID */
|
|
bhnd_pci_regfmt_t regfmt; /**< register format */
|
|
struct bhnd_device_quirk *quirks; /**< quirks table */
|
|
};
|
|
|
|
struct bhndb_pci_softc {
|
|
struct bhndb_softc bhndb; /**< parent softc */
|
|
device_t dev; /**< bridge device */
|
|
bhnd_devclass_t pci_devclass; /**< PCI core's devclass */
|
|
bhndb_pci_set_regwin_t set_regwin; /**< regwin handler */
|
|
|
|
/*
|
|
* Initialized in BHNDB_INIT_FULL_CONFIG()
|
|
*/
|
|
|
|
device_t mdio; /**< PCIe MDIO device. NULL if not PCIe. */
|
|
bhnd_pci_regfmt_t regfmt; /**< device register format */
|
|
|
|
struct resource *mem_res; /**< pci core's registers (borrowed reference) */
|
|
bus_size_t mem_off; /**< offset to the PCI core's registers within `mem_res` . */
|
|
|
|
struct bhnd_resource bhnd_mem_res; /**< bhnd resource representation of mem_res.
|
|
this is a simple 'direct' resource mapping */
|
|
|
|
uint32_t quirks; /**< BHNDB_PCI(E)_QUIRK flags */
|
|
|
|
/**
|
|
* Driver state specific to BHNDB_PCIE_QUIRK_SDR9_POLARITY.
|
|
*/
|
|
struct {
|
|
/**
|
|
* PCIe SerDes RX polarity.
|
|
*
|
|
* Initialized to the PCIe link's RX polarity
|
|
* at attach time. This is used to restore the
|
|
* correct polarity on resume */
|
|
bool inv;
|
|
} sdr9_quirk_polarity;
|
|
};
|
|
|
|
/*
|
|
* PCI/PCIe-Gen1 endpoint-mode device quirks
|
|
*/
|
|
enum {
|
|
/** No quirks */
|
|
BHNDB_PCI_QUIRK_NONE = 0,
|
|
|
|
/**
|
|
* BCM4306 chips (and possibly others) do not support the idle
|
|
* low-power clock. Clocking must be bootstrapped at attach/resume by
|
|
* directly adjusting GPIO registers exposed in the PCI config space,
|
|
* and correspondingly, explicitly shutdown at detach/suspend.
|
|
*/
|
|
BHNDB_PCI_QUIRK_EXT_CLOCK_GATING = (1<<1),
|
|
|
|
/**
|
|
* SBTOPCI_PREF and SBTOPCI_BURST must be set on the
|
|
* SSB_PCICORE_SBTOPCI2 register.
|
|
*/
|
|
BHNDB_PCI_QUIRK_SBTOPCI2_PREF_BURST = (1<<2),
|
|
|
|
/**
|
|
* SBTOPCI_RC_READMULTI must be set on the SSB_PCICORE_SBTOPCI2
|
|
* register.
|
|
*/
|
|
BHNDB_PCI_QUIRK_SBTOPCI2_READMULTI = (1<<3),
|
|
|
|
/**
|
|
* Interrupt masking is handled via the interconnect configuration
|
|
* registers (SBINTVEC on siba), rather than the PCI_INT_MASK
|
|
* config register.
|
|
*/
|
|
BHNDB_PCI_QUIRK_SBINTVEC = (1<<4),
|
|
|
|
/**
|
|
* PCI CLKRUN# should be disabled on attach (via CLKRUN_DSBL).
|
|
*
|
|
* The purpose of this work-around is unclear; there is some
|
|
* documentation regarding earlier Broadcom drivers supporting
|
|
* a "force CLKRUN#" *enable* registry key for use on mobile
|
|
* hardware.
|
|
*/
|
|
BHNDB_PCI_QUIRK_CLKRUN_DSBL = (1<<5),
|
|
|
|
/**
|
|
* TLP workaround for unmatched address handling is required.
|
|
*
|
|
* This TLP workaround will enable setting of the PCIe UR status bit
|
|
* on memory access to an unmatched address.
|
|
*/
|
|
BHNDB_PCIE_QUIRK_UR_STATUS_FIX = (1<<6),
|
|
|
|
/**
|
|
* PCI-PM power management must be explicitly enabled via
|
|
* the data link control register.
|
|
*/
|
|
BHNDB_PCIE_QUIRK_PCIPM_REQEN = (1<<7),
|
|
|
|
/**
|
|
* Fix L0s to L0 exit transition on SerDes <= rev9 devices.
|
|
*
|
|
* On these devices, PCIe/SerDes symbol lock can be lost if the
|
|
* reference clock has not fully stabilized during the L0s to L0
|
|
* exit transition, triggering an internal reset of the chip.
|
|
*
|
|
* The SerDes RX CDR phase lock timers and proportional/integral
|
|
* filters must be tweaked to ensure the CDR has fully stabilized
|
|
* before asserting receive sequencer completion.
|
|
*/
|
|
BHNDB_PCIE_QUIRK_SDR9_L0s_HANG = (1<<8),
|
|
|
|
/**
|
|
* The idle time for entering L1 low-power state must be
|
|
* explicitly set (to 114ns) to fix slow L1->L0 transition issues.
|
|
*/
|
|
BHNDB_PCIE_QUIRK_L1_IDLE_THRESH = (1<<9),
|
|
|
|
/**
|
|
* The ASPM L1 entry timer should be extended for better performance,
|
|
* and restored for better power savings.
|
|
*/
|
|
BHNDB_PCIE_QUIRK_L1_TIMER_PERF = (1<<10),
|
|
|
|
/**
|
|
* ASPM and ECPM settings must be overridden manually.
|
|
*
|
|
* The override behavior is controlled by the BHND_BFL2_PCIEWAR_OVR
|
|
* flag. If this flag is set, ASPM/CLKREQ should be overridden as
|
|
* enabled; otherwise, they should be overridden as disabled.
|
|
*
|
|
* Attach/Resume:
|
|
* - Set SRSH_ASPM_ENB flag in the SPROM ASPM register.
|
|
* - Set ASPM L0S/L1 in the PCIER_LINK_CTL register.
|
|
* - Set SRSH_CLKREQ_ENB flag in the SPROM CLKREQ_REV5 register.
|
|
* - Clear ECPM in the PCIER_LINK_CTL register.
|
|
*
|
|
* Detach/Suspend:
|
|
* -
|
|
* - When the device enters D3 state, or system enters S3/S4 state,
|
|
* clear ASPM L1 in the PCIER_LINK_CTL register.
|
|
*/
|
|
BHNDB_PCIE_QUIRK_ASPM_OVR = (1<<11),
|
|
|
|
/**
|
|
* Fix SerDes polarity on SerDes <= rev9 devices.
|
|
*
|
|
* The SerDes polarity must be saved at device attachment, and
|
|
* restored on suspend/resume.
|
|
*/
|
|
BHNDB_PCIE_QUIRK_SDR9_POLARITY = (1<<12),
|
|
|
|
/**
|
|
* The SerDes PLL override flag (CHIPCTRL_4321_PLL_DOWN) must be set on
|
|
* the ChipCommon core on resume.
|
|
*/
|
|
BHNDB_PCIE_QUIRK_SERDES_NOPLLDOWN = (1<<13),
|
|
|
|
/**
|
|
* On attach and resume, consult the SPROM to determine whether
|
|
* the L2/L3-Ready w/o PCI RESET work-around must be applied.
|
|
*
|
|
* If L23READY_EXIT_NOPRST is not already set in the SPROM, set it
|
|
*/
|
|
BHNDB_PCIE_QUIRK_SPROM_L23_PCI_RESET = (1<<14),
|
|
|
|
/**
|
|
* The PCIe SerDes supports non-standard extended MDIO register access.
|
|
*
|
|
* The PCIe SerDes supports access to extended MDIO registers via
|
|
* a non-standard Clause 22 address extension mechanism.
|
|
*/
|
|
BHNDB_PCIE_QUIRK_SD_C22_EXTADDR = (1<<15),
|
|
|
|
/**
|
|
* The PCIe SerDes PLL must be configured to not retry the startup
|
|
* sequence upon frequency detection failure on SerDes <= rev9 devices
|
|
*
|
|
* The issue this workaround resolves has not be determined.
|
|
*/
|
|
BHNDB_PCIE_QUIRK_SDR9_NO_FREQRETRY = (1<<16),
|
|
};
|
|
|
|
#endif /* _BHND_BHNDB_PCIVAR_H_ */ |