lipengfei28 commented on code in PR #16772:
URL: https://github.com/apache/nuttx/pull/16772#discussion_r2273592324


##########
include/nuttx/pci/pcie_dw.h:
##########
@@ -0,0 +1,569 @@
+/****************************************************************************
+ * include/nuttx/pci/pcie_dw.h
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+#ifndef _PCIE_DESIGNWARE_H
+#define _PCIE_DESIGNWARE_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <debug.h>
+
+#include <nuttx/bits.h>
+#include <nuttx/kmalloc.h>
+#include <nuttx/pci/pci.h>
+#include <nuttx/pci/pci_epc.h>
+#include <nuttx/pci/pci_epf.h>
+#include <nuttx/spinlock.h>
+#include <nuttx/list.h>
+#include <nuttx/nuttx.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#define SZ_1K                             0x00000400
+#define SZ_4K                             0x00001000
+#define SZ_1G                             0x40000000
+#define SZ_2G                             0x80000000
+#define SZ_4G                             0x100000000
+
+#define upper_32_bits(n)                  ((uint32_t)(((n) >> 16) >> 16))
+#define lower_32_bits(n)                  ((uint32_t)(n))
+#define readb(a)                          (*(FAR volatile uint8_t *)(a))
+#define writeb(v,a)                       (*(FAR volatile uint8_t *)(a) = (v))
+#define readw(a)                          (*(FAR volatile uint16_t *)(a))
+#define writew(v,a)                       (*(FAR volatile uint16_t *)(a) = (v))
+#define readl(a)                          (*(FAR volatile uint32_t *)(a))
+#define writel(v,a)                       (*(FAR volatile uint32_t *)(a) = (v))
+
+#define __bf_shf(x)                       (ffsll(x) - 1)
+#define FIELD_PREP(_mask, _val)           (((_val) << __bf_shf(_mask)) & 
(_mask))
+#define FIELD_GET(_mask, _reg)            (((_reg) & (_mask)) >> 
__bf_shf(_mask))
+
+/* DWC PCIe IP-core versions (native support since v4.70a) */
+
+#define DW_PCIE_VER_365A                  0x3336352a
+#define DW_PCIE_VER_460A                  0x3436302a
+#define DW_PCIE_VER_470A                  0x3437302a
+#define DW_PCIE_VER_480A                  0x3438302a
+#define DW_PCIE_VER_490A                  0x3439302a
+#define DW_PCIE_VER_520A                  0x3532302a
+#define DW_PCIE_VER_540A                  0x3534302a
+
+#define __dw_pcie_ver_cmp(_pci, _ver, _op) \
+  ((_pci)->version _op DW_PCIE_VER_ ## _ver)
+
+#define dw_pcie_ver_is(_pci, _ver)       __dw_pcie_ver_cmp(_pci, _ver, ==)
+
+#define dw_pcie_ver_is_ge(_pci, _ver)    __dw_pcie_ver_cmp(_pci, _ver, >=)
+
+#define dw_pcie_ver_type_is(_pci, _ver, _type) \
+  (__dw_pcie_ver_cmp(_pci, _ver, ==) && \
+   __dw_pcie_ver_cmp(_pci, TYPE_ ## _type, ==))
+
+#define dw_pcie_ver_type_is_ge(_pci, _ver, _type) \
+  (__dw_pcie_ver_cmp(_pci, _ver, ==) && \
+   __dw_pcie_ver_cmp(_pci, TYPE_ ## _type, >=))
+
+/* DWC PCIe controller capabilities */
+
+#define DW_PCIE_CAP_REQ_RES               0
+#define DW_PCIE_CAP_IATU_UNROLL           1
+#define DW_PCIE_CAP_CDM_CHECK             2
+
+#define dw_pcie_cap_is(_pci, _cap) \
+  test_bit(DW_PCIE_CAP_ ## _cap, &(_pci)->caps)
+
+#define dw_pcie_cap_set(_pci, _cap) \
+  set_bit(DW_PCIE_CAP_ ## _cap, &(_pci)->caps)
+
+/* Parameters for the waiting for link up routine */
+
+#define LINK_WAIT_MAX_RETRIES             10
+#define LINK_WAIT_SLEEP_MS                90
+
+/* Parameters for the waiting for iATU enabled routine */
+
+#define LINK_WAIT_MAX_IATU_RETRIES        5
+#define LINK_WAIT_IATU                    9
+
+/* Synopsys-specific PCIe configuration registers */
+
+#define PCIE_PORT_FORCE                   0x708
+#define PORT_FORCE_DO_DESKEW_FOR_SRIS BIT(23)
+
+#define PCIE_PORT_AFR                     0x70C

Review Comment:
   done



##########
include/nuttx/pci/pcie_dw.h:
##########
@@ -0,0 +1,569 @@
+/****************************************************************************
+ * include/nuttx/pci/pcie_dw.h
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+#ifndef _PCIE_DESIGNWARE_H
+#define _PCIE_DESIGNWARE_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <debug.h>
+
+#include <nuttx/bits.h>
+#include <nuttx/kmalloc.h>
+#include <nuttx/pci/pci.h>
+#include <nuttx/pci/pci_epc.h>
+#include <nuttx/pci/pci_epf.h>
+#include <nuttx/spinlock.h>
+#include <nuttx/list.h>
+#include <nuttx/nuttx.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#define SZ_1K                             0x00000400
+#define SZ_4K                             0x00001000
+#define SZ_1G                             0x40000000
+#define SZ_2G                             0x80000000
+#define SZ_4G                             0x100000000
+
+#define upper_32_bits(n)                  ((uint32_t)(((n) >> 16) >> 16))
+#define lower_32_bits(n)                  ((uint32_t)(n))
+#define readb(a)                          (*(FAR volatile uint8_t *)(a))
+#define writeb(v,a)                       (*(FAR volatile uint8_t *)(a) = (v))
+#define readw(a)                          (*(FAR volatile uint16_t *)(a))
+#define writew(v,a)                       (*(FAR volatile uint16_t *)(a) = (v))
+#define readl(a)                          (*(FAR volatile uint32_t *)(a))
+#define writel(v,a)                       (*(FAR volatile uint32_t *)(a) = (v))
+
+#define __bf_shf(x)                       (ffsll(x) - 1)
+#define FIELD_PREP(_mask, _val)           (((_val) << __bf_shf(_mask)) & 
(_mask))
+#define FIELD_GET(_mask, _reg)            (((_reg) & (_mask)) >> 
__bf_shf(_mask))
+
+/* DWC PCIe IP-core versions (native support since v4.70a) */
+
+#define DW_PCIE_VER_365A                  0x3336352a
+#define DW_PCIE_VER_460A                  0x3436302a
+#define DW_PCIE_VER_470A                  0x3437302a
+#define DW_PCIE_VER_480A                  0x3438302a
+#define DW_PCIE_VER_490A                  0x3439302a
+#define DW_PCIE_VER_520A                  0x3532302a
+#define DW_PCIE_VER_540A                  0x3534302a
+
+#define __dw_pcie_ver_cmp(_pci, _ver, _op) \
+  ((_pci)->version _op DW_PCIE_VER_ ## _ver)
+
+#define dw_pcie_ver_is(_pci, _ver)       __dw_pcie_ver_cmp(_pci, _ver, ==)
+
+#define dw_pcie_ver_is_ge(_pci, _ver)    __dw_pcie_ver_cmp(_pci, _ver, >=)
+
+#define dw_pcie_ver_type_is(_pci, _ver, _type) \
+  (__dw_pcie_ver_cmp(_pci, _ver, ==) && \
+   __dw_pcie_ver_cmp(_pci, TYPE_ ## _type, ==))
+
+#define dw_pcie_ver_type_is_ge(_pci, _ver, _type) \
+  (__dw_pcie_ver_cmp(_pci, _ver, ==) && \
+   __dw_pcie_ver_cmp(_pci, TYPE_ ## _type, >=))
+
+/* DWC PCIe controller capabilities */
+
+#define DW_PCIE_CAP_REQ_RES               0
+#define DW_PCIE_CAP_IATU_UNROLL           1
+#define DW_PCIE_CAP_CDM_CHECK             2
+
+#define dw_pcie_cap_is(_pci, _cap) \
+  test_bit(DW_PCIE_CAP_ ## _cap, &(_pci)->caps)
+
+#define dw_pcie_cap_set(_pci, _cap) \
+  set_bit(DW_PCIE_CAP_ ## _cap, &(_pci)->caps)
+
+/* Parameters for the waiting for link up routine */
+
+#define LINK_WAIT_MAX_RETRIES             10
+#define LINK_WAIT_SLEEP_MS                90
+
+/* Parameters for the waiting for iATU enabled routine */
+
+#define LINK_WAIT_MAX_IATU_RETRIES        5
+#define LINK_WAIT_IATU                    9
+
+/* Synopsys-specific PCIe configuration registers */
+
+#define PCIE_PORT_FORCE                   0x708
+#define PORT_FORCE_DO_DESKEW_FOR_SRIS BIT(23)
+
+#define PCIE_PORT_AFR                     0x70C
+#define PORT_AFR_N_FTS_MASK               GENMASK(15, 8)
+#define PORT_AFR_N_FTS(n)                 FIELD_PREP(PORT_AFR_N_FTS_MASK, n)
+#define PORT_AFR_CC_N_FTS_MASK            GENMASK(23, 16)
+#define PORT_AFR_CC_N_FTS(n)              FIELD_PREP(PORT_AFR_CC_N_FTS_MASK, n)
+#define PORT_AFR_ENTER_ASPM               BIT(30)
+#define PORT_AFR_L0S_ENTRANCE_LAT_SHIFT   24
+#define PORT_AFR_L0S_ENTRANCE_LAT_MASK    GENMASK(26, 24)
+#define PORT_AFR_L1_ENTRANCE_LAT_SHIFT    27
+#define PORT_AFR_L1_ENTRANCE_LAT_MASK     GENMASK(29, 27)
+
+#define PCIE_PORT_LINK_CONTROL            0x710
+#define PORT_LINK_DLL_LINK_EN             BIT(5)
+#define PORT_LINK_FAST_LINK_MODE          BIT(7)
+#define PORT_LINK_MODE_MASK               GENMASK(21, 16)
+#define PORT_LINK_MODE(n)                 FIELD_PREP(PORT_LINK_MODE_MASK, n)
+#define PORT_LINK_MODE_1_LANES            PORT_LINK_MODE(0x1)
+#define PORT_LINK_MODE_2_LANES            PORT_LINK_MODE(0x3)
+#define PORT_LINK_MODE_4_LANES            PORT_LINK_MODE(0x7)
+#define PORT_LINK_MODE_8_LANES            PORT_LINK_MODE(0xf)
+
+#define PCIE_PORT_LANE_SKEW               0x714
+#define PORT_LANE_SKEW_INSERT_MASK        GENMASK(23, 0)
+
+#define PCIE_PORT_DEBUG0                  0x728
+#define PORT_LOGIC_LTSSM_STATE_MASK       0x1f
+#define PORT_LOGIC_LTSSM_STATE_L0         0x11
+#define PCIE_PORT_DEBUG1                  0x72C
+#define PCIE_PORT_DEBUG1_LINK_UP          BIT(4)
+#define PCIE_PORT_DEBUG1_LINK_IN_TRAINING BIT(29)
+
+#define PCIE_LINK_WIDTH_SPEED_CONTROL     0x80C
+#define PORT_LOGIC_N_FTS_MASK             GENMASK(7, 0)
+#define PORT_LOGIC_SPEED_CHANGE           BIT(17)
+#define PORT_LOGIC_LINK_WIDTH_MASK        GENMASK(12, 8)
+#define PORT_LOGIC_LINK_WIDTH(n)          
FIELD_PREP(PORT_LOGIC_LINK_WIDTH_MASK, n)
+#define PORT_LOGIC_LINK_WIDTH_1_LANES     PORT_LOGIC_LINK_WIDTH(0x1)
+#define PORT_LOGIC_LINK_WIDTH_2_LANES     PORT_LOGIC_LINK_WIDTH(0x2)
+#define PORT_LOGIC_LINK_WIDTH_4_LANES     PORT_LOGIC_LINK_WIDTH(0x4)
+#define PORT_LOGIC_LINK_WIDTH_8_LANES     PORT_LOGIC_LINK_WIDTH(0x8)
+
+#define PCIE_MSI_ADDR_LO                  0x820
+#define PCIE_MSI_ADDR_HI                  0x824
+#define PCIE_MSI_INTR0_ENABLE             0x828
+#define PCIE_MSI_INTR0_MASK               0x82C
+#define PCIE_MSI_INTR0_STATUS             0x830
+
+#define GEN3_RELATED_OFF                  0x890
+#define GEN3_RELATED_OFF_GEN3_ZRXDC_NONCOMPL    BIT(0)
+#define GEN3_RELATED_OFF_RXEQ_RGRDLESS_RXTS     BIT(13)
+#define GEN3_RELATED_OFF_GEN3_EQ_DISABLE        BIT(16)
+#define GEN3_RELATED_OFF_RATE_SHADOW_SEL_SHIFT  24
+#define GEN3_RELATED_OFF_RATE_SHADOW_SEL_MASK   GENMASK(25, 24)
+#define GEN3_RELATED_OFF_RATE_SHADOW_SEL_16_0GT 0x1
+
+#define GEN3_EQ_CONTROL_OFF                      0x8A8
+#define GEN3_EQ_CONTROL_OFF_FB_MODE              GENMASK(3, 0)
+#define GEN3_EQ_CONTROL_OFF_PHASE23_EXIT_MODE    BIT(4)
+#define GEN3_EQ_CONTROL_OFF_PSET_REQ_VEC         GENMASK(23, 8)
+#define GEN3_EQ_CONTROL_OFF_FOM_INC_INITIAL_EVAL BIT(24)
+
+#define GEN3_EQ_FB_MODE_DIR_CHANGE_OFF           0x8AC
+#define GEN3_EQ_FMDC_T_MIN_PHASE23               GENMASK(4, 0)
+#define GEN3_EQ_FMDC_N_EVALS                     GENMASK(9, 5)
+#define GEN3_EQ_FMDC_MAX_PRE_CUSROR_DELTA        GENMASK(13, 10)
+#define GEN3_EQ_FMDC_MAX_POST_CUSROR_DELTA       GENMASK(17, 14)
+
+#define PCIE_PORT_MULTI_LANE_CTRL                0x8C0
+#define PORT_MLTI_UPCFG_SUPPORT                  BIT(7)
+
+#define PCIE_VERSION_NUMBER                      0x8F8
+#define PCIE_VERSION_TYPE                        0x8FC
+
+/* iATU inbound and outbound windows CSRs. Before the IP-core v4.80a each
+ * iATU region CSRs had been indirectly accessible by means of the dedicated
+ * viewport selector. The iATU/eDMA CSRs space was re-designed in DWC PCIe
+ * v4.80a in a way so the viewport was unrolled into the directly accessible
+ * iATU/eDMA CSRs space.
+ */
+
+#define PCIE_ATU_VIEWPORT                      0x900
+#define PCIE_ATU_REGION_DIR_IB                 BIT(31)
+#define PCIE_ATU_REGION_DIR_OB                 0
+#define PCIE_ATU_VIEWPORT_BASE                 0x904
+#define PCIE_ATU_UNROLL_BASE(dir, index) \
+  (((index) << 9) | ((dir == PCIE_ATU_REGION_DIR_IB) ? BIT(8) : 0))
+#define PCIE_ATU_VIEWPORT_SIZE                 0x2C
+#define PCIE_ATU_REGION_CTRL1                  0x000
+#define PCIE_ATU_INCREASE_REGION_SIZE          BIT(13)
+#define PCIE_ATU_TYPE_MEM                      0x0
+#define PCIE_ATU_TYPE_IO                       0x2
+#define PCIE_ATU_TYPE_CFG0                     0x4
+#define PCIE_ATU_TYPE_CFG1                     0x5
+#define PCIE_ATU_TYPE_MSG                      0x10
+#define PCIE_ATU_TD                            BIT(8)
+#define PCIE_ATU_FUNC_NUM(pf)                  ((pf) << 20)
+#define PCIE_ATU_REGION_CTRL2                  0x004
+#define PCIE_ATU_ENABLE                        BIT(31)
+#define PCIE_ATU_BAR_MODE_ENABLE               BIT(30)
+#define PCIE_ATU_INHIBIT_PAYLOAD               BIT(22)
+#define PCIE_ATU_FUNC_NUM_MATCH_EN             BIT(19)
+#define PCIE_ATU_LOWER_BASE                    0x008
+#define PCIE_ATU_UPPER_BASE                    0x00C
+#define PCIE_ATU_LIMIT                         0x010
+#define PCIE_ATU_LOWER_TARGET                  0x014
+#define PCIE_ATU_BUS(x)                        FIELD_PREP(GENMASK(31, 24), x)
+#define PCIE_ATU_DEV(x)                        FIELD_PREP(GENMASK(23, 19), x)
+#define PCIE_ATU_FUNC(x)                       FIELD_PREP(GENMASK(18, 16), x)
+#define PCIE_ATU_UPPER_TARGET                  0x018
+#define PCIE_ATU_UPPER_LIMIT                   0x020
+
+#define PCIE_MISC_CONTROL_1_OFF                0x8BC
+#define PCIE_DBI_RO_WR_EN                      BIT(0)
+
+#define PCIE_MSIX_DOORBELL                     0x948
+#define PCIE_MSIX_DOORBELL_PF_SHIFT            24
+
+#define PCIE_DMA_VIEWPORT_BASE                 0x970
+#define PCIE_DMA_UNROLL_BASE                   0x80000
+#define PCIE_DMA_CTRL                          0x008
+#define PCIE_DMA_NUM_WR_CHAN                   GENMASK(3, 0)
+#define PCIE_DMA_NUM_RD_CHAN                   GENMASK(19, 16)
+
+#define PCIE_PL_CHK_REG_CONTROL_STATUS         0xB20
+#define PCIE_PL_CHK_REG_CHK_REG_START          BIT(0)
+#define PCIE_PL_CHK_REG_CHK_REG_CONTINUOUS     BIT(1)
+#define PCIE_PL_CHK_REG_CHK_REG_COMPARISON_ERR BIT(16)
+#define PCIE_PL_CHK_REG_CHK_REG_LOGIC_ERROR    BIT(17)
+#define PCIE_PL_CHK_REG_CHK_REG_COMPLETE       BIT(18)
+
+#define PCIE_PL_CHK_REG_ERR_ADDR               0xB28
+
+/* 16.0 GT/s (Gen 4) lane margining register definitions
+ */
+
+#define GEN4_LANE_MARGINING_1_OFF              0xB80
+#define MARGINING_MAX_VOLTAGE_OFFSET           GENMASK(29, 24)
+#define MARGINING_NUM_VOLTAGE_STEPS            GENMASK(22, 16)
+#define MARGINING_MAX_TIMING_OFFSET            GENMASK(13, 8)
+#define MARGINING_NUM_TIMING_STEPS             GENMASK(5, 0)
+
+#define GEN4_LANE_MARGINING_2_OFF              0xB84
+#define MARGINING_IND_ERROR_SAMPLER            BIT(28)
+#define MARGINING_SAMPLE_REPORTING_METHOD      BIT(27)
+#define MARGINING_IND_LEFT_RIGHT_TIMING        BIT(26)
+#define MARGINING_IND_UP_DOWN_VOLTAGE          BIT(25)
+#define MARGINING_VOLTAGE_SUPPORTED            BIT(24)
+#define MARGINING_MAXLANES                     GENMASK(20, 16)
+#define MARGINING_SAMPLE_RATE_TIMING           GENMASK(13, 8)
+#define MARGINING_SAMPLE_RATE_VOLTAGE          GENMASK(5, 0)
+
+/* iATU Unroll-specific register definitions
+ * From 4.80 core version the address translation will be made by unroll
+ */
+
+#define PCIE_ATU_UNR_REGION_CTRL1              0x00
+#define PCIE_ATU_UNR_REGION_CTRL2              0x04
+#define PCIE_ATU_UNR_LOWER_BASE                0x08
+#define PCIE_ATU_UNR_UPPER_BASE                0x0C
+#define PCIE_ATU_UNR_LOWER_LIMIT               0x10
+#define PCIE_ATU_UNR_LOWER_TARGET              0x14
+#define PCIE_ATU_UNR_UPPER_TARGET              0x18
+#define PCIE_ATU_UNR_UPPER_LIMIT               0x20
+
+/* RAS-DES register definitions
+ */
+#define PCIE_RAS_DES_EVENT_COUNTER_CONTROL    0x8
+#define EVENT_COUNTER_ALL_CLEAR               0x3
+#define EVENT_COUNTER_ENABLE_ALL              0x7
+#define EVENT_COUNTER_ENABLE_SHIFT            2
+#define EVENT_COUNTER_EVENT_SEL_MASK          GENMASK(7, 0)
+#define EVENT_COUNTER_EVENT_SEL_SHIFT         16
+#define EVENT_COUNTER_EVENT_Tx_L0S            0x2
+#define EVENT_COUNTER_EVENT_Rx_L0S            0x3
+#define EVENT_COUNTER_EVENT_L1                0x5
+#define EVENT_COUNTER_EVENT_L1_1              0x7
+#define EVENT_COUNTER_EVENT_L1_2              0x8
+#define EVENT_COUNTER_GROUP_SEL_SHIFT         24
+#define EVENT_COUNTER_GROUP_5                 0x5
+
+#define PCIE_RAS_DES_EVENT_COUNTER_DATA       0xc
+
+/* The default address offset between dbi_base and atu_base. Root
+ * controller drivers are not required to initialize atu_base
+ * if the offset matches this default; the driver core
+ * automatically derives atu_base From dbi_base using this offset,
+ * if atu_base not set.
+ */
+
+#define DEFAULT_DBI_ATU_OFFSET               (0x3 << 20)
+#define DEFAULT_DBI_DMA_OFFSET               PCIE_DMA_UNROLL_BASE
+
+#define MAX_MSI_IRQS                         256
+#define MAX_MSI_IRQS_PER_CTRL                32
+#define MAX_MSI_CTRLS                        (MAX_MSI_IRQS / 
MAX_MSI_IRQS_PER_CTRL)
+#define MSI_REG_CTRL_BLOCK_SIZE              12
+#define MSI_DEF_NUM_VECTORS                  32
+
+/* Maximum number of inbound/outbound iATUs */
+
+#define MAX_IATU_IN                          256
+#define MAX_IATU_OUT                         256
+
+#define DMA_LLP_MEM_SIZE                     PAGE_SIZE
+
+#define to_dw_pcie_from_pp(port)             container_of((port), struct 
dw_pcie_s, pp)
+
+#define to_dw_pcie_from_ep(endpoint)   \
+    container_of((endpoint), struct dw_pcie_s, ep)
+
+/****************************************************************************
+ * Public Types
+ ****************************************************************************/
+
+struct dw_pcie_ep_s
+{
+  FAR struct pci_epc_ctrl_s       *epc;
+  struct list_node                func_list;
+  FAR const struct dw_pcie_ep_ops *ops;
+  uint64_t                        phys_base;
+  size_t                          addr_size;
+  FAR void                        *dma_addr;
+  size_t                          dma_len;
+  size_t                          page_size;
+  uint8_t                         bar_to_atu[PCI_STD_NUM_BARS];
+  FAR uintptr_t                   *outbound_addr;
+  FAR unsigned long               *ib_window_map;
+  FAR unsigned long               *ob_window_map;
+  FAR void                        *msi_mem;
+  uint64_t                        msi_mem_phys;
+  FAR struct pci_epf_bar_s        *epf_bar[PCI_STD_NUM_BARS];
+};
+
+struct dw_pcie_rp_s
+{
+  bool                              has_msi_ctrl:1;
+  bool                              cfg0_io_shared:1;
+  uint64_t                          cfg0_base;
+  FAR void                          *va_cfg0_base;
+  uint32_t                          cfg0_size;
+  uintptr_t                         io_base;
+  uint64_t                          io_bus_addr;
+  uint32_t                          io_size;
+  int                               irq;
+  FAR const struct dw_pcie_host_ops *ops;
+  int                               msi_irq[MAX_MSI_CTRLS];
+  uint64_t                          msi_data;
+  uint32_t                          num_vectors;
+  uint32_t                          irq_mask[MAX_MSI_CTRLS];
+  FAR struct pci_host_bridge        *bridge;
+  spinlock_t                        lock;
+  DECLARE_BITMAP(msi_irq_in_use, MAX_MSI_IRQS);
+  bool                              use_atu_msg;
+  int                               msg_atu_index;
+  FAR struct resource               *msg_res;
+};
+
+struct dw_pcie_s
+{
+  FAR void                        *dbi_base;
+  FAR uintptr_t                   dbi_phys_addr;
+  FAR void                        *dbi_base2;
+  FAR void                        *atu_base;
+  uintptr_t                       atu_phys_addr;
+  size_t                          atu_size;
+  uint32_t                        num_ib_windows;
+  uint32_t                        num_ob_windows;
+  uint32_t                        region_align;
+  uint64_t                        region_limit;
+  struct dw_pcie_rp_s             pp;
+  struct dw_pcie_ep_s             ep;
+  FAR const struct dw_pcie_ops_s *ops;
+  uint32_t                       version;
+  uint32_t                       type;
+  unsigned long                  caps;
+  int                            num_lanes;
+  int                            max_link_speed;
+  uint8_t                        n_fts[2];
+  FAR void                       *priv;
+};
+
+enum dw_pcie_ltssm
+{
+  /* Need to align with PCIE_PORT_DEBUG0 bits 0:5 */
+
+  DW_PCIE_LTSSM_DETECT_QUIET = 0x0,
+  DW_PCIE_LTSSM_DETECT_ACT = 0x1,
+  DW_PCIE_LTSSM_L0 = 0x11,
+  DW_PCIE_LTSSM_L2_IDLE = 0x15,
+
+  DW_PCIE_LTSSM_UNKNOWN = 0xffffffff,
+};
+
+struct dw_pcie_ob_atu_cfg_s
+{
+  int      index;
+  int      type;
+  uint8_t  funcno;
+  uint8_t  code;
+  uint8_t  routing;
+  uint64_t cpu_addr;
+  uint64_t pci_addr;
+  uint64_t size;
+};
+
+struct dw_pcie_host_ops
+{
+  CODE int (*init)(FAR struct dw_pcie_rp_s *pp);
+  CODE void (*deinit)(FAR struct dw_pcie_rp_s *pp);
+  CODE void (*post_init)(FAR struct dw_pcie_rp_s *pp);
+  CODE int (*msi_init)(FAR struct dw_pcie_rp_s *pp);
+  CODE void (*pme_turn_off)(FAR struct dw_pcie_rp_s *pp);
+};
+
+struct dw_pcie_ep_ops
+{
+  CODE void (*pre_init)(FAR struct dw_pcie_ep_s *ep);
+  CODE void (*init)(FAR struct dw_pcie_ep_s *ep);
+  CODE int (*raise_irq)(FAR struct dw_pcie_ep_s *ep, uint8_t funcno,
+                        unsigned int type, uint16_t interrupt_num);
+  CODE const FAR struct pci_epc_features_s *(*get_features)
+      (FAR struct dw_pcie_ep_s *ep);
+  CODE uint32_t (*get_dbi_offset)(FAR struct dw_pcie_ep_s *ep,
+                                  uint8_t funcno);
+  CODE uint32_t (*get_dbi2_offset)(FAR struct dw_pcie_ep_s *ep,
+                                   uint8_t funcno);
+};
+
+struct dw_pcie_ep_func_s
+{
+  struct list_node  list;
+  uint8_t           funcno;
+  uint8_t           msi_cap;  /* MSI capability offset */
+  uint8_t           msix_cap; /* MSI-X capability offset */
+};
+
+struct dw_pcie_ops_s
+{
+  CODE uint64_t (*cpu_addr_fixup)(FAR struct dw_pcie_s *pcie,
+                                  uint64_t cpu_addr);
+  CODE uint32_t (*read_dbi)(FAR struct dw_pcie_s *pcie, FAR void *base,
+                            uint32_t reg, size_t size);
+  CODE void (*write_dbi)(FAR struct dw_pcie_s *pcie, FAR void *base,
+                         uint32_t reg, size_t size, uint32_t val);
+  CODE void (*write_dbi2)(FAR struct dw_pcie_s *pcie, FAR void *base,
+                          uint32_t reg, size_t size, uint32_t val);
+  CODE int (*link_up)(FAR struct dw_pcie_s *pcie);
+  CODE enum dw_pcie_ltssm (*get_ltssm)(FAR struct dw_pcie_s *pcie);
+  CODE int (*start_link)(FAR struct dw_pcie_s *pcie);
+  CODE void (*stop_link)(FAR struct dw_pcie_s *pcie);
+};
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+int dw_pcie_get_resources(FAR struct dw_pcie_s *pci);

Review Comment:
   done



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscr...@nuttx.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org

Reply via email to