The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/contrib/alpine-hal/al_hal_pcie.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2 ********************************************************************************
    3 Copyright (C) 2015 Annapurna Labs Ltd.
    4 
    5 This file may be licensed under the terms of the Annapurna Labs Commercial
    6 License Agreement.
    7 
    8 Alternatively, this file can be distributed under the terms of the GNU General
    9 Public License V2 as published by the Free Software Foundation and can be
   10 found at http://www.gnu.org/licenses/gpl-2.0.html
   11 
   12 Alternatively, redistribution and use in source and binary forms, with or
   13 without modification, are permitted provided that the following conditions are
   14 met:
   15 
   16     *     Redistributions of source code must retain the above copyright notice,
   17 this list of conditions and the following disclaimer.
   18 
   19     *     Redistributions in binary form must reproduce the above copyright
   20 notice, this list of conditions and the following disclaimer in
   21 the documentation and/or other materials provided with the
   22 distribution.
   23 
   24 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
   25 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
   26 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   27 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
   28 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
   29 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
   30 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
   31 ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   32 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
   33 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   34 
   35 *******************************************************************************/
   36 
   37 #include <sys/cdefs.h>
   38 __FBSDID("$FreeBSD$");
   39 
   40 #include <sys/param.h>
   41 #include <sys/systm.h>
   42 #include <sys/kernel.h>
   43 
   44 #include "al_hal_pcie.h"
   45 #include "al_hal_pbs_regs.h"
   46 #include "al_hal_unit_adapter_regs.h"
   47 
   48 /**
   49  * Parameter definitions
   50  */
   51 #define AL_PCIE_AXI_REGS_OFFSET                 0x0
   52 
   53 #define AL_PCIE_LTSSM_STATE_L0                  0x11
   54 #define AL_PCIE_LTSSM_STATE_L0S                 0x12
   55 #define AL_PCIE_DEVCTL_PAYLOAD_128B             0x00
   56 #define AL_PCIE_DEVCTL_PAYLOAD_256B             0x20
   57 
   58 #define AL_PCIE_SECBUS_DEFAULT                  0x1
   59 #define AL_PCIE_SUBBUS_DEFAULT                  0x1
   60 #define AL_PCIE_LINKUP_WAIT_INTERVAL            50      /* measured in usec */
   61 #define AL_PCIE_LINKUP_WAIT_INTERVALS_PER_SEC   20
   62 
   63 #define AL_PCIE_LINKUP_RETRIES                  8
   64 
   65 #define AL_PCIE_MAX_32_MEMORY_BAR_SIZE          (0x100000000ULL)
   66 #define AL_PCIE_MIN_MEMORY_BAR_SIZE             (1 << 12)
   67 #define AL_PCIE_MIN_IO_BAR_SIZE                 (1 << 8)
   68 
   69 /**
   70  * inbound header credits and outstanding outbound reads defaults
   71  */
   72 /** RC - Revisions 1/2 */
   73 #define AL_PCIE_REV_1_2_RC_OB_OS_READS_DEFAULT  (8)
   74 #define AL_PCIE_REV_1_2_RC_NOF_CPL_HDR_DEFAULT  (41)
   75 #define AL_PCIE_REV_1_2_RC_NOF_NP_HDR_DEFAULT   (25)
   76 #define AL_PCIE_REV_1_2_RC_NOF_P_HDR_DEFAULT    (31)
   77 /** EP - Revisions 1/2 */
   78 #define AL_PCIE_REV_1_2_EP_OB_OS_READS_DEFAULT  (15)
   79 #define AL_PCIE_REV_1_2_EP_NOF_CPL_HDR_DEFAULT  (76)
   80 #define AL_PCIE_REV_1_2_EP_NOF_NP_HDR_DEFAULT   (6)
   81 #define AL_PCIE_REV_1_2_EP_NOF_P_HDR_DEFAULT    (15)
   82 /** RC - Revision 3 */
   83 #define AL_PCIE_REV_3_RC_OB_OS_READS_DEFAULT    (32)
   84 #define AL_PCIE_REV_3_RC_NOF_CPL_HDR_DEFAULT    (161)
   85 #define AL_PCIE_REV_3_RC_NOF_NP_HDR_DEFAULT     (38)
   86 #define AL_PCIE_REV_3_RC_NOF_P_HDR_DEFAULT      (60)
   87 /** EP - Revision 3 */
   88 #define AL_PCIE_REV_3_EP_OB_OS_READS_DEFAULT    (32)
   89 #define AL_PCIE_REV_3_EP_NOF_CPL_HDR_DEFAULT    (161)
   90 #define AL_PCIE_REV_3_EP_NOF_NP_HDR_DEFAULT     (38)
   91 #define AL_PCIE_REV_3_EP_NOF_P_HDR_DEFAULT      (60)
   92 
   93 /**
   94  * MACROS
   95  */
   96 #define AL_PCIE_PARSE_LANES(v)          (((1 << v) - 1) << \
   97                 PCIE_REVX_AXI_MISC_PCIE_GLOBAL_CONF_NOF_ACT_LANES_SHIFT)
   98 
   99 #define AL_PCIE_FLR_DONE_INTERVAL               10
  100 
  101 /**
  102  * Static functions
  103  */
  104 static void
  105 al_pcie_port_wr_to_ro_set(struct al_pcie_port *pcie_port, al_bool enable)
  106 {
  107         /* when disabling writes to RO, make sure any previous writes to
  108          * config space were committed
  109          */
  110         if (enable == AL_FALSE)
  111                 al_local_data_memory_barrier();
  112 
  113         al_reg_write32(&pcie_port->regs->port_regs->rd_only_wr_en,
  114                        (enable == AL_TRUE) ? 1 : 0);
  115 
  116         /* when enabling writes to RO, make sure it is committed before trying
  117          * to write to RO config space
  118          */
  119         if (enable == AL_TRUE)
  120                 al_local_data_memory_barrier();
  121 }
  122 
  123 /** helper function to access dbi_cs2 registers */
  124 static void
  125 al_reg_write32_dbi_cs2(
  126         struct al_pcie_port     *pcie_port,
  127         uint32_t                *offset,
  128         uint32_t                val)
  129 {
  130         uintptr_t cs2_bit =
  131                 (pcie_port->rev_id == AL_PCIE_REV_ID_3) ? 0x4000 : 0x1000;
  132 
  133         al_reg_write32((uint32_t *)((uintptr_t)offset | cs2_bit), val);
  134 }
  135 
  136 static unsigned int
  137 al_pcie_speed_gen_code(enum al_pcie_link_speed speed)
  138 {
  139         if (speed == AL_PCIE_LINK_SPEED_GEN1)
  140                 return 1;
  141         if (speed == AL_PCIE_LINK_SPEED_GEN2)
  142                 return 2;
  143         if (speed == AL_PCIE_LINK_SPEED_GEN3)
  144                 return 3;
  145         /* must not be reached */
  146         return 0;
  147 }
  148 
  149 static inline void
  150 al_pcie_port_link_speed_ctrl_set(
  151         struct al_pcie_port *pcie_port,
  152         enum al_pcie_link_speed max_speed)
  153 {
  154         struct al_pcie_regs *regs = pcie_port->regs;
  155 
  156         al_pcie_port_wr_to_ro_set(pcie_port, AL_TRUE);
  157 
  158         if (max_speed != AL_PCIE_LINK_SPEED_DEFAULT) {
  159                 uint16_t max_speed_val = (uint16_t)al_pcie_speed_gen_code(max_speed);
  160                 al_reg_write32_masked(
  161                         (uint32_t __iomem *)(regs->core_space[0].pcie_link_cap_base),
  162                         0xF, max_speed_val);
  163                 al_reg_write32_masked(
  164                         (uint32_t __iomem *)(regs->core_space[0].pcie_cap_base
  165                         + (AL_PCI_EXP_LNKCTL2 >> 2)),
  166                         0xF, max_speed_val);
  167         }
  168 
  169         al_pcie_port_wr_to_ro_set(pcie_port, AL_FALSE);
  170 }
  171 
  172 static int
  173 al_pcie_port_link_config(
  174         struct al_pcie_port *pcie_port,
  175         const struct al_pcie_link_params *link_params)
  176 {
  177         struct al_pcie_regs *regs = pcie_port->regs;
  178         uint8_t max_lanes = pcie_port->max_lanes;
  179 
  180         if ((link_params->max_payload_size != AL_PCIE_MPS_DEFAULT)      &&
  181             (link_params->max_payload_size != AL_PCIE_MPS_128)          &&
  182             (link_params->max_payload_size != AL_PCIE_MPS_256)) {
  183                 al_err("PCIe %d: unsupported Max Payload Size (%u)\n",
  184                        pcie_port->port_id, link_params->max_payload_size);
  185                 return -EINVAL;
  186         }
  187 
  188         al_pcie_port_link_speed_ctrl_set(pcie_port, link_params->max_speed);
  189 
  190         /* Change Max Payload Size, if needed.
  191          * The Max Payload Size is only valid for PF0.
  192          */
  193         if (link_params->max_payload_size != AL_PCIE_MPS_DEFAULT)
  194                 al_reg_write32_masked(regs->core_space[0].pcie_dev_ctrl_status,
  195                                       PCIE_PORT_DEV_CTRL_STATUS_MPS_MASK,
  196                                       link_params->max_payload_size <<
  197                                         PCIE_PORT_DEV_CTRL_STATUS_MPS_SHIFT);
  198 
  199         /** Snap from PCIe core spec:
  200          * Link Mode Enable. Sets the number of lanes in the link that you want
  201          * to connect to the link partner. When you have unused lanes in your
  202          * system, then you must change the value in this register to reflect
  203          * the number of lanes. You must also change the value in the
  204          * "Predetermined Number of Lanes" field of the "Link Width and Speed
  205          * Change Control Register".
  206          * 000001: x1
  207          * 000011: x2
  208          * 000111: x4
  209          * 001111: x8
  210          * 011111: x16
  211          * 111111: x32 (not supported)
  212          */
  213         al_reg_write32_masked(&regs->port_regs->gen2_ctrl,
  214                                 PCIE_PORT_GEN2_CTRL_NUM_OF_LANES_MASK,
  215                                 max_lanes << PCIE_PORT_GEN2_CTRL_NUM_OF_LANES_SHIFT);
  216         al_reg_write32_masked(&regs->port_regs->port_link_ctrl,
  217                                 PCIE_PORT_LINK_CTRL_LINK_CAPABLE_MASK,
  218                                 (max_lanes + (max_lanes-1))
  219                                 << PCIE_PORT_LINK_CTRL_LINK_CAPABLE_SHIFT);
  220 
  221         return 0;
  222 }
  223 
  224 static void
  225 al_pcie_port_ram_parity_int_config(
  226         struct al_pcie_port *pcie_port,
  227         al_bool enable)
  228 {
  229         struct al_pcie_regs *regs = pcie_port->regs;
  230 
  231         al_reg_write32(&regs->app.parity->en_core,
  232                 (enable == AL_TRUE) ? 0xffffffff : 0x0);
  233 
  234         al_reg_write32_masked(&regs->app.int_grp_b->mask,
  235               PCIE_W_INT_GRP_B_CAUSE_B_PARITY_ERROR_CORE,
  236               (enable != AL_TRUE) ?
  237               PCIE_W_INT_GRP_B_CAUSE_B_PARITY_ERROR_CORE : 0);
  238 
  239 }
  240 
  241 static void
  242 al_pcie_port_axi_parity_int_config(
  243         struct al_pcie_port *pcie_port,
  244         al_bool enable)
  245 {
  246         struct al_pcie_regs *regs = pcie_port->regs;
  247         uint32_t parity_enable_mask = 0xffffffff;
  248 
  249         /**
  250          * Addressing RMN: 5603
  251          *
  252          * RMN description:
  253          * u4_ram2p signal false parity error
  254          *
  255          * Software flow:
  256          * Disable parity check for this memory
  257          */
  258         if (pcie_port->rev_id >= AL_PCIE_REV_ID_3)
  259                 parity_enable_mask &= ~PCIE_AXI_PARITY_EN_AXI_U4_RAM2P;
  260 
  261         al_reg_write32(regs->axi.parity.en_axi,
  262                        (enable == AL_TRUE) ? parity_enable_mask : 0x0);
  263 
  264         if (pcie_port->rev_id == AL_PCIE_REV_ID_3) {
  265                 al_reg_write32_masked(regs->axi.ctrl.global,
  266                         PCIE_REV3_AXI_CTRL_GLOBAL_PARITY_CALC_EN_MSTR |
  267                         PCIE_REV3_AXI_CTRL_GLOBAL_PARITY_ERR_EN_RD |
  268                         PCIE_REV3_AXI_CTRL_GLOBAL_PARITY_CALC_EN_SLV |
  269                         PCIE_REV3_AXI_CTRL_GLOBAL_PARITY_ERR_EN_WR,
  270                         (enable == AL_TRUE) ?
  271                         PCIE_REV3_AXI_CTRL_GLOBAL_PARITY_CALC_EN_MSTR |
  272                         PCIE_REV3_AXI_CTRL_GLOBAL_PARITY_ERR_EN_RD |
  273                         PCIE_REV3_AXI_CTRL_GLOBAL_PARITY_CALC_EN_SLV |
  274                         PCIE_REV3_AXI_CTRL_GLOBAL_PARITY_ERR_EN_WR :
  275                         PCIE_REV3_AXI_CTRL_GLOBAL_PARITY_CALC_EN_SLV);
  276         } else {
  277                 al_reg_write32_masked(regs->axi.ctrl.global,
  278                         PCIE_REV1_2_AXI_CTRL_GLOBAL_PARITY_CALC_EN_MSTR |
  279                         PCIE_REV1_2_AXI_CTRL_GLOBAL_PARITY_ERR_EN_RD |
  280                         PCIE_REV1_2_AXI_CTRL_GLOBAL_PARITY_CALC_EN_SLV |
  281                         PCIE_REV1_2_AXI_CTRL_GLOBAL_PARITY_ERR_EN_WR,
  282                         (enable == AL_TRUE) ?
  283                         PCIE_REV1_2_AXI_CTRL_GLOBAL_PARITY_CALC_EN_MSTR |
  284                         PCIE_REV1_2_AXI_CTRL_GLOBAL_PARITY_ERR_EN_RD |
  285                         PCIE_REV1_2_AXI_CTRL_GLOBAL_PARITY_CALC_EN_SLV |
  286                         PCIE_REV1_2_AXI_CTRL_GLOBAL_PARITY_ERR_EN_WR :
  287                         PCIE_REV1_2_AXI_CTRL_GLOBAL_PARITY_CALC_EN_SLV);
  288         }
  289 
  290         al_reg_write32_masked(&regs->axi.int_grp_a->mask,
  291                 PCIE_AXI_INT_GRP_A_CAUSE_PARITY_ERR_DATA_PATH_RD |
  292                 PCIE_AXI_INT_GRP_A_CAUSE_PARITY_ERR_OUT_ADDR_RD |
  293                 PCIE_AXI_INT_GRP_A_CAUSE_PARITY_ERR_OUT_ADDR_WR |
  294                 PCIE_AXI_INT_GRP_A_CAUSE_PARITY_ERR_OUT_DATA_WR |
  295                 PCIE_AXI_INT_GRP_A_CAUSE_PARITY_ERROR_AXI,
  296                 (enable != AL_TRUE) ?
  297                 (PCIE_AXI_INT_GRP_A_CAUSE_PARITY_ERR_DATA_PATH_RD |
  298                 PCIE_AXI_INT_GRP_A_CAUSE_PARITY_ERR_OUT_ADDR_RD |
  299                 PCIE_AXI_INT_GRP_A_CAUSE_PARITY_ERR_OUT_ADDR_WR |
  300                 PCIE_AXI_INT_GRP_A_CAUSE_PARITY_ERR_OUT_DATA_WR |
  301                 PCIE_AXI_INT_GRP_A_CAUSE_PARITY_ERROR_AXI) : 0);
  302 }
  303 
  304 static void
  305 al_pcie_port_relaxed_pcie_ordering_config(
  306         struct al_pcie_port *pcie_port,
  307         struct al_pcie_relaxed_ordering_params *relaxed_ordering_params)
  308 {
  309         struct al_pcie_regs *regs = pcie_port->regs;
  310         enum al_pcie_operating_mode op_mode = al_pcie_operating_mode_get(pcie_port);
  311         /**
  312          * Default:
  313          *  - RC: Rx relaxed ordering only
  314          *  - EP: TX relaxed ordering only
  315          */
  316         al_bool tx_relaxed_ordering = (op_mode == AL_PCIE_OPERATING_MODE_RC ? AL_FALSE : AL_TRUE);
  317         al_bool rx_relaxed_ordering = (op_mode == AL_PCIE_OPERATING_MODE_RC ? AL_TRUE : AL_FALSE);
  318 
  319         if (relaxed_ordering_params) {
  320                 tx_relaxed_ordering = relaxed_ordering_params->enable_tx_relaxed_ordering;
  321                 rx_relaxed_ordering = relaxed_ordering_params->enable_rx_relaxed_ordering;
  322         }
  323 
  324         /** PCIe ordering:
  325          *  - disable outbound completion must be stalled behind outbound write
  326          *    ordering rule enforcement is disabled for root-port
  327          *  - disables read completion on the master port push slave writes for end-point
  328          */
  329         al_reg_write32_masked(
  330                 regs->axi.ordering.pos_cntl,
  331                 PCIE_AXI_POS_ORDER_BYPASS_CMPL_AFTER_WR_FIX |
  332                 PCIE_AXI_POS_ORDER_EP_CMPL_AFTER_WR_DIS |
  333                 PCIE_AXI_POS_ORDER_EP_CMPL_AFTER_WR_SUPPORT_INTERLV_DIS |
  334                 PCIE_AXI_POS_ORDER_SEGMENT_BUFFER_DONT_WAIT_FOR_P_WRITES,
  335                 (tx_relaxed_ordering ?
  336                 (PCIE_AXI_POS_ORDER_BYPASS_CMPL_AFTER_WR_FIX |
  337                 PCIE_AXI_POS_ORDER_SEGMENT_BUFFER_DONT_WAIT_FOR_P_WRITES) : 0) |
  338                 (rx_relaxed_ordering ?
  339                 (PCIE_AXI_POS_ORDER_EP_CMPL_AFTER_WR_DIS |
  340                 PCIE_AXI_POS_ORDER_EP_CMPL_AFTER_WR_SUPPORT_INTERLV_DIS) : 0));
  341 }
  342 
  343 static int
  344 al_pcie_rev_id_get(
  345         void __iomem *pbs_reg_base,
  346         void __iomem *pcie_reg_base)
  347 {
  348         uint32_t chip_id;
  349         uint16_t chip_id_dev;
  350         uint8_t rev_id;
  351         struct al_pbs_regs *pbs_regs = pbs_reg_base;
  352 
  353         /* get revision ID from PBS' chip_id register */
  354         chip_id = al_reg_read32(&pbs_regs->unit.chip_id);
  355         chip_id_dev = AL_REG_FIELD_GET(chip_id,
  356                                        PBS_UNIT_CHIP_ID_DEV_ID_MASK,
  357                                        PBS_UNIT_CHIP_ID_DEV_ID_SHIFT);
  358 
  359         if (chip_id_dev == PBS_UNIT_CHIP_ID_DEV_ID_ALPINE_V1) {
  360                 rev_id = AL_PCIE_REV_ID_1;
  361         } else if (chip_id_dev == PBS_UNIT_CHIP_ID_DEV_ID_ALPINE_V2) {
  362                 struct al_pcie_revx_regs __iomem *regs =
  363                         (struct al_pcie_revx_regs __iomem *)pcie_reg_base;
  364                 uint32_t dev_id;
  365 
  366                 dev_id = al_reg_read32(&regs->axi.device_id.device_rev_id) &
  367                         PCIE_AXI_DEVICE_ID_REG_DEV_ID_MASK;
  368                 if (dev_id == PCIE_AXI_DEVICE_ID_REG_DEV_ID_X4) {
  369                         rev_id = AL_PCIE_REV_ID_2;
  370                 } else if (dev_id == PCIE_AXI_DEVICE_ID_REG_DEV_ID_X8) {
  371                         rev_id = AL_PCIE_REV_ID_3;
  372                 } else {
  373                         al_warn("%s: Revision ID is unknown\n",
  374                                 __func__);
  375                         return -EINVAL;
  376                 }
  377         } else {
  378                 al_warn("%s: Revision ID is unknown\n",
  379                         __func__);
  380                 return -EINVAL;
  381         }
  382         return rev_id;
  383 }
  384 
  385 static int
  386 al_pcie_port_lat_rply_timers_config(
  387         struct al_pcie_port *pcie_port,
  388         const struct al_pcie_latency_replay_timers  *lat_rply_timers)
  389 {
  390         struct al_pcie_regs *regs = pcie_port->regs;
  391         uint32_t        reg = 0;
  392 
  393         AL_REG_FIELD_SET(reg, 0xFFFF, 0, lat_rply_timers->round_trip_lat_limit);
  394         AL_REG_FIELD_SET(reg, 0xFFFF0000, 16, lat_rply_timers->replay_timer_limit);
  395 
  396         al_reg_write32(&regs->port_regs->ack_lat_rply_timer, reg);
  397         return 0;
  398 }
  399 
  400 static void
  401 al_pcie_ib_hcrd_os_ob_reads_config_default(
  402         struct al_pcie_port *pcie_port)
  403 {
  404 
  405         struct al_pcie_ib_hcrd_os_ob_reads_config ib_hcrd_os_ob_reads_config;
  406 
  407         switch (al_pcie_operating_mode_get(pcie_port)) {
  408         case AL_PCIE_OPERATING_MODE_RC:
  409                 if (pcie_port->rev_id == AL_PCIE_REV_ID_3) {
  410                         ib_hcrd_os_ob_reads_config.nof_outstanding_ob_reads =
  411                                 AL_PCIE_REV_3_RC_OB_OS_READS_DEFAULT;
  412                         ib_hcrd_os_ob_reads_config.nof_cpl_hdr =
  413                                 AL_PCIE_REV_3_RC_NOF_CPL_HDR_DEFAULT;
  414                         ib_hcrd_os_ob_reads_config.nof_np_hdr =
  415                                 AL_PCIE_REV_3_RC_NOF_NP_HDR_DEFAULT;
  416                         ib_hcrd_os_ob_reads_config.nof_p_hdr =
  417                                 AL_PCIE_REV_3_RC_NOF_P_HDR_DEFAULT;
  418                 } else {
  419                         ib_hcrd_os_ob_reads_config.nof_outstanding_ob_reads =
  420                                 AL_PCIE_REV_1_2_RC_OB_OS_READS_DEFAULT;
  421                         ib_hcrd_os_ob_reads_config.nof_cpl_hdr =
  422                                 AL_PCIE_REV_1_2_RC_NOF_CPL_HDR_DEFAULT;
  423                         ib_hcrd_os_ob_reads_config.nof_np_hdr =
  424                                 AL_PCIE_REV_1_2_RC_NOF_NP_HDR_DEFAULT;
  425                         ib_hcrd_os_ob_reads_config.nof_p_hdr =
  426                                 AL_PCIE_REV_1_2_RC_NOF_P_HDR_DEFAULT;
  427                 }
  428                 break;
  429 
  430         case AL_PCIE_OPERATING_MODE_EP:
  431                 if (pcie_port->rev_id == AL_PCIE_REV_ID_3) {
  432                         ib_hcrd_os_ob_reads_config.nof_outstanding_ob_reads =
  433                                 AL_PCIE_REV_3_EP_OB_OS_READS_DEFAULT;
  434                         ib_hcrd_os_ob_reads_config.nof_cpl_hdr =
  435                                 AL_PCIE_REV_3_EP_NOF_CPL_HDR_DEFAULT;
  436                         ib_hcrd_os_ob_reads_config.nof_np_hdr =
  437                                 AL_PCIE_REV_3_EP_NOF_NP_HDR_DEFAULT;
  438                         ib_hcrd_os_ob_reads_config.nof_p_hdr =
  439                                 AL_PCIE_REV_3_EP_NOF_P_HDR_DEFAULT;
  440                 } else {
  441                         ib_hcrd_os_ob_reads_config.nof_outstanding_ob_reads =
  442                                 AL_PCIE_REV_1_2_EP_OB_OS_READS_DEFAULT;
  443                         ib_hcrd_os_ob_reads_config.nof_cpl_hdr =
  444                                 AL_PCIE_REV_1_2_EP_NOF_CPL_HDR_DEFAULT;
  445                         ib_hcrd_os_ob_reads_config.nof_np_hdr =
  446                                 AL_PCIE_REV_1_2_EP_NOF_NP_HDR_DEFAULT;
  447                         ib_hcrd_os_ob_reads_config.nof_p_hdr =
  448                                 AL_PCIE_REV_1_2_EP_NOF_P_HDR_DEFAULT;
  449                 }
  450                 break;
  451 
  452         default:
  453                 al_err("PCIe %d: outstanding outbound transactions could not be configured - unknown operating mode\n",
  454                         pcie_port->port_id);
  455                 al_assert(0);
  456         }
  457 
  458         al_pcie_port_ib_hcrd_os_ob_reads_config(pcie_port, &ib_hcrd_os_ob_reads_config);
  459 };
  460 
  461 /** return AL_TRUE if link is up, AL_FALSE otherwise */
  462 static al_bool
  463 al_pcie_check_link(
  464         struct al_pcie_port *pcie_port,
  465         uint8_t *ltssm_ret)
  466 {
  467         struct al_pcie_regs *regs = (struct al_pcie_regs *)pcie_port->regs;
  468         uint32_t info_0;
  469         uint8_t ltssm_state;
  470 
  471         info_0 = al_reg_read32(&regs->app.debug->info_0);
  472 
  473         ltssm_state = AL_REG_FIELD_GET(info_0,
  474                         PCIE_W_DEBUG_INFO_0_LTSSM_STATE_MASK,
  475                         PCIE_W_DEBUG_INFO_0_LTSSM_STATE_SHIFT);
  476 
  477         al_dbg("PCIe %d: Port Debug 0: 0x%08x. LTSSM state :0x%x\n",
  478                 pcie_port->port_id, info_0, ltssm_state);
  479 
  480         if (ltssm_ret)
  481                 *ltssm_ret = ltssm_state;
  482 
  483         if ((ltssm_state == AL_PCIE_LTSSM_STATE_L0) ||
  484                         (ltssm_state == AL_PCIE_LTSSM_STATE_L0S))
  485                 return AL_TRUE;
  486         return AL_FALSE;
  487 }
  488 
  489 static int
  490 al_pcie_port_gen2_params_config(struct al_pcie_port *pcie_port,
  491                                 const struct al_pcie_gen2_params *gen2_params)
  492 {
  493         struct al_pcie_regs *regs = pcie_port->regs;
  494         uint32_t gen2_ctrl;
  495 
  496         al_dbg("PCIe %d: Gen2 params config: Tx Swing %s, interrupt on link Eq %s, set Deemphasis %s\n",
  497                pcie_port->port_id,
  498                gen2_params->tx_swing_low ? "Low" : "Full",
  499                gen2_params->tx_compliance_receive_enable? "enable" : "disable",
  500                gen2_params->set_deemphasis? "enable" : "disable");
  501 
  502         gen2_ctrl = al_reg_read32(&regs->port_regs->gen2_ctrl);
  503 
  504         if (gen2_params->tx_swing_low)
  505                 AL_REG_BIT_SET(gen2_ctrl, PCIE_PORT_GEN2_CTRL_TX_SWING_LOW_SHIFT);
  506         else
  507                 AL_REG_BIT_CLEAR(gen2_ctrl, PCIE_PORT_GEN2_CTRL_TX_SWING_LOW_SHIFT);
  508 
  509         if (gen2_params->tx_compliance_receive_enable)
  510                 AL_REG_BIT_SET(gen2_ctrl, PCIE_PORT_GEN2_CTRL_TX_COMPLIANCE_RCV_SHIFT);
  511         else
  512                 AL_REG_BIT_CLEAR(gen2_ctrl, PCIE_PORT_GEN2_CTRL_TX_COMPLIANCE_RCV_SHIFT);
  513 
  514         if (gen2_params->set_deemphasis)
  515                 AL_REG_BIT_SET(gen2_ctrl, PCIE_PORT_GEN2_CTRL_DEEMPHASIS_SET_SHIFT);
  516         else
  517                 AL_REG_BIT_CLEAR(gen2_ctrl, PCIE_PORT_GEN2_CTRL_DEEMPHASIS_SET_SHIFT);
  518 
  519         al_reg_write32(&regs->port_regs->gen2_ctrl, gen2_ctrl);
  520 
  521         return 0;
  522 }
  523 
  524 
  525 static uint16_t
  526 gen3_lane_eq_param_to_val(const struct al_pcie_gen3_lane_eq_params *eq_params)
  527 {
  528         uint16_t eq_control = 0;
  529 
  530         eq_control = eq_params->downstream_port_transmitter_preset & 0xF;
  531         eq_control |= (eq_params->downstream_port_receiver_preset_hint & 0x7) << 4;
  532         eq_control |= (eq_params->upstream_port_transmitter_preset & 0xF) << 8;
  533         eq_control |= (eq_params->upstream_port_receiver_preset_hint & 0x7) << 12;
  534 
  535         return eq_control;
  536 }
  537 
  538 static int
  539 al_pcie_port_gen3_params_config(struct al_pcie_port *pcie_port,
  540                                 const struct al_pcie_gen3_params *gen3_params)
  541 {
  542         struct al_pcie_regs *regs = pcie_port->regs;
  543         uint32_t reg = 0;
  544         uint16_t __iomem *lanes_eq_base = (uint16_t __iomem *)(regs->core_space[0].pcie_sec_ext_cap_base + (0xC >> 2));
  545         int i;
  546 
  547         al_dbg("PCIe %d: Gen3 params config: Equalization %s, interrupt on link Eq %s\n",
  548                pcie_port->port_id,
  549                gen3_params->perform_eq ? "enable" : "disable",
  550                gen3_params->interrupt_enable_on_link_eq_request? "enable" : "disable");
  551 
  552         if (gen3_params->perform_eq)
  553                 AL_REG_BIT_SET(reg, 0);
  554         if (gen3_params->interrupt_enable_on_link_eq_request)
  555                 AL_REG_BIT_SET(reg, 1);
  556 
  557         al_reg_write32(regs->core_space[0].pcie_sec_ext_cap_base + (4 >> 2),
  558                        reg);
  559 
  560         al_pcie_port_wr_to_ro_set(pcie_port, AL_TRUE);
  561 
  562         for (i = 0; i < gen3_params->eq_params_elements; i += 2) {
  563                 uint32_t eq_control =
  564                         (uint32_t)gen3_lane_eq_param_to_val(gen3_params->eq_params + i) |
  565                         (uint32_t)gen3_lane_eq_param_to_val(gen3_params->eq_params + i + 1) << 16;
  566 
  567                 al_dbg("PCIe %d: Set EQ (0x%08x) for lane %d, %d\n", pcie_port->port_id, eq_control, i, i + 1);
  568                 al_reg_write32((uint32_t *)(lanes_eq_base + i), eq_control);
  569         }
  570 
  571         al_pcie_port_wr_to_ro_set(pcie_port, AL_FALSE);
  572 
  573         reg = al_reg_read32(&regs->port_regs->gen3_ctrl);
  574         if (gen3_params->eq_disable)
  575                 AL_REG_BIT_SET(reg, PCIE_PORT_GEN3_CTRL_EQ_DISABLE_SHIFT);
  576         else
  577                 AL_REG_BIT_CLEAR(reg, PCIE_PORT_GEN3_CTRL_EQ_DISABLE_SHIFT);
  578 
  579         if (gen3_params->eq_phase2_3_disable)
  580                 AL_REG_BIT_SET(reg, PCIE_PORT_GEN3_CTRL_EQ_PHASE_2_3_DISABLE_SHIFT);
  581         else
  582                 AL_REG_BIT_CLEAR(reg, PCIE_PORT_GEN3_CTRL_EQ_PHASE_2_3_DISABLE_SHIFT);
  583 
  584         al_reg_write32(&regs->port_regs->gen3_ctrl, reg);
  585 
  586         reg = 0;
  587         AL_REG_FIELD_SET(reg, PCIE_PORT_GEN3_EQ_LF_MASK,
  588                          PCIE_PORT_GEN3_EQ_LF_SHIFT,
  589                          gen3_params->local_lf);
  590         AL_REG_FIELD_SET(reg, PCIE_PORT_GEN3_EQ_FS_MASK,
  591                          PCIE_PORT_GEN3_EQ_FS_SHIFT,
  592                          gen3_params->local_fs);
  593 
  594         al_reg_write32(&regs->port_regs->gen3_eq_fs_lf, reg);
  595 
  596         reg = 0;
  597         AL_REG_FIELD_SET(reg, PCIE_AXI_MISC_ZERO_LANEX_PHY_MAC_LOCAL_LF_MASK,
  598                          PCIE_AXI_MISC_ZERO_LANEX_PHY_MAC_LOCAL_LF_SHIFT,
  599                          gen3_params->local_lf);
  600         AL_REG_FIELD_SET(reg, PCIE_AXI_MISC_ZERO_LANEX_PHY_MAC_LOCAL_FS_MASK,
  601                          PCIE_AXI_MISC_ZERO_LANEX_PHY_MAC_LOCAL_FS_SHIFT,
  602                          gen3_params->local_fs);
  603         al_reg_write32(regs->axi.conf.zero_lane0, reg);
  604         al_reg_write32(regs->axi.conf.zero_lane1, reg);
  605         al_reg_write32(regs->axi.conf.zero_lane2, reg);
  606         al_reg_write32(regs->axi.conf.zero_lane3, reg);
  607         if (pcie_port->rev_id == AL_PCIE_REV_ID_3) {
  608                 al_reg_write32(regs->axi.conf.zero_lane4, reg);
  609                 al_reg_write32(regs->axi.conf.zero_lane5, reg);
  610                 al_reg_write32(regs->axi.conf.zero_lane6, reg);
  611                 al_reg_write32(regs->axi.conf.zero_lane7, reg);
  612         }
  613 
  614         /*
  615          * Gen3 EQ Control Register:
  616          * - Preset Request Vector - request 9
  617          * - Behavior After 24 ms Timeout (when optimal settings are not
  618          *   found): Recovery.Equalization.RcvrLock
  619          * - Phase2_3 2 ms Timeout Disable
  620          * - Feedback Mode - Figure Of Merit
  621          */
  622         reg = 0x00020031;
  623         al_reg_write32(&regs->port_regs->gen3_eq_ctrl, reg);
  624 
  625         return 0;
  626 }
  627 
  628 static int
  629 al_pcie_port_pf_params_config(struct al_pcie_pf *pcie_pf,
  630                               const struct al_pcie_pf_config_params *pf_params)
  631 {
  632         struct al_pcie_port *pcie_port = pcie_pf->pcie_port;
  633         struct al_pcie_regs *regs = pcie_port->regs;
  634         unsigned int pf_num = pcie_pf->pf_num;
  635         int bar_idx;
  636         int ret;
  637 
  638         al_pcie_port_wr_to_ro_set(pcie_port, AL_TRUE);
  639 
  640         /* Disable D1 and D3hot capabilities */
  641         if (pf_params->cap_d1_d3hot_dis)
  642                 al_reg_write32_masked(
  643                         regs->core_space[pf_num].pcie_pm_cap_base,
  644                         AL_FIELD_MASK(26, 25) | AL_FIELD_MASK(31, 28), 0);
  645 
  646         /* Set/Clear FLR bit */
  647         if (pf_params->cap_flr_dis)
  648                 al_reg_write32_masked(
  649                         regs->core_space[pf_num].pcie_dev_cap_base,
  650                         AL_PCI_EXP_DEVCAP_FLR, 0);
  651         else
  652                 al_reg_write32_masked(
  653                         regs->core_space[pcie_pf->pf_num].pcie_dev_cap_base,
  654                         AL_PCI_EXP_DEVCAP_FLR, AL_PCI_EXP_DEVCAP_FLR);
  655 
  656         /* Disable ASPM capability */
  657         if (pf_params->cap_aspm_dis) {
  658                 al_reg_write32_masked(
  659                         regs->core_space[pf_num].pcie_cap_base + (AL_PCI_EXP_LNKCAP >> 2),
  660                         AL_PCI_EXP_LNKCAP_ASPMS, 0);
  661         }
  662 
  663         if (!pf_params->bar_params_valid) {
  664                 ret = 0;
  665                 goto done;
  666         }
  667 
  668         for (bar_idx = 0; bar_idx < 6;){ /* bar_idx will be incremented depending on bar type */
  669                 const struct al_pcie_ep_bar_params *params = pf_params->bar_params + bar_idx;
  670                 uint32_t mask = 0;
  671                 uint32_t ctrl = 0;
  672                 uint32_t __iomem *bar_addr = &regs->core_space[pf_num].config_header[(AL_PCI_BASE_ADDRESS_0 >> 2) + bar_idx];
  673 
  674                 if (params->enable) {
  675                         uint64_t size = params->size;
  676 
  677                         if (params->memory_64_bit) {
  678                                 const struct al_pcie_ep_bar_params *next_params = params + 1;
  679                                 /* 64 bars start at even index (BAR0, BAR 2 or BAR 4) */
  680                                 if (bar_idx & 1) {
  681                                         ret = -EINVAL;
  682                                         goto done;
  683                                 }
  684 
  685                                 /* next BAR must be disabled */
  686                                 if (next_params->enable) {
  687                                         ret = -EINVAL;
  688                                         goto done;
  689                                 }
  690 
  691                                 /* 64 bar must be memory bar */
  692                                 if (!params->memory_space) {
  693                                         ret = -EINVAL;
  694                                         goto done;
  695                                 }
  696                         } else {
  697                                 if (size > AL_PCIE_MAX_32_MEMORY_BAR_SIZE)
  698                                         return -EINVAL;
  699                                 /* 32 bit space can't be prefetchable */
  700                                 if (params->memory_is_prefetchable) {
  701                                         ret = -EINVAL;
  702                                         goto done;
  703                                 }
  704                         }
  705 
  706                         if (params->memory_space) {
  707                                 if (size < AL_PCIE_MIN_MEMORY_BAR_SIZE) {
  708                                         al_err("PCIe %d: memory BAR %d: size (0x%jx) less that minimal allowed value\n",
  709                                                 pcie_port->port_id, bar_idx,
  710                                                 (uintmax_t)size);
  711                                         ret = -EINVAL;
  712                                         goto done;
  713                                 }
  714                         } else {
  715                                 /* IO can't be prefetchable */
  716                                 if (params->memory_is_prefetchable) {
  717                                         ret = -EINVAL;
  718                                         goto done;
  719                                 }
  720 
  721                                 if (size < AL_PCIE_MIN_IO_BAR_SIZE) {
  722                                         al_err("PCIe %d: IO BAR %d: size (0x%jx) less that minimal allowed value\n",
  723                                                 pcie_port->port_id, bar_idx,
  724                                                 (uintmax_t)size);
  725                                         ret = -EINVAL;
  726                                         goto done;
  727                                 }
  728                         }
  729 
  730                         /* size must be power of 2 */
  731                         if (size & (size - 1)) {
  732                                 al_err("PCIe %d: BAR %d:size (0x%jx) must be "
  733                                         "power of 2\n",
  734                                         pcie_port->port_id, bar_idx, (uintmax_t)size);
  735                                 ret = -EINVAL;
  736                                 goto done;
  737                         }
  738 
  739                         /* If BAR is 64-bit, disable the next BAR before
  740                          * configuring this one
  741                          */
  742                         if (params->memory_64_bit)
  743                                 al_reg_write32_dbi_cs2(pcie_port, bar_addr + 1, 0);
  744 
  745                         mask = 1; /* enable bit*/
  746                         mask |= (params->size - 1) & 0xFFFFFFFF;
  747 
  748                         al_reg_write32_dbi_cs2(pcie_port, bar_addr , mask);
  749 
  750                         if (params->memory_space == AL_FALSE)
  751                                 ctrl = AL_PCI_BASE_ADDRESS_SPACE_IO;
  752                         if (params->memory_64_bit)
  753                                 ctrl |= AL_PCI_BASE_ADDRESS_MEM_TYPE_64;
  754                         if (params->memory_is_prefetchable)
  755                                 ctrl |= AL_PCI_BASE_ADDRESS_MEM_PREFETCH;
  756                         al_reg_write32(bar_addr, ctrl);
  757 
  758                         if (params->memory_64_bit) {
  759                                 mask = ((params->size - 1) >> 32) & 0xFFFFFFFF;
  760                                 al_reg_write32_dbi_cs2(pcie_port, bar_addr + 1, mask);
  761                         }
  762 
  763                 } else {
  764                         al_reg_write32_dbi_cs2(pcie_port, bar_addr , mask);
  765                 }
  766                 if (params->enable && params->memory_64_bit)
  767                         bar_idx += 2;
  768                 else
  769                         bar_idx += 1;
  770         }
  771 
  772         if (pf_params->exp_bar_params.enable) {
  773                 if (pcie_port->rev_id != AL_PCIE_REV_ID_3) {
  774                         al_err("PCIe %d: Expansion BAR enable not supported\n", pcie_port->port_id);
  775                         ret = -ENOSYS;
  776                         goto done;
  777                 } else {
  778                         /* Enable exp ROM */
  779                         uint32_t __iomem *exp_rom_bar_addr =
  780                         &regs->core_space[pf_num].config_header[AL_PCI_EXP_ROM_BASE_ADDRESS >> 2];
  781                         uint32_t mask = 1; /* enable bit*/
  782                         mask |= (pf_params->exp_bar_params.size - 1) & 0xFFFFFFFF;
  783                         al_reg_write32_dbi_cs2(pcie_port, exp_rom_bar_addr , mask);
  784                 }
  785         } else if (pcie_port->rev_id == AL_PCIE_REV_ID_3) {
  786                 /* Disable exp ROM */
  787                 uint32_t __iomem *exp_rom_bar_addr =
  788                         &regs->core_space[pf_num].config_header[AL_PCI_EXP_ROM_BASE_ADDRESS >> 2];
  789                 al_reg_write32_dbi_cs2(pcie_port, exp_rom_bar_addr , 0);
  790         }
  791 
  792         /* Open CPU generated msi and legacy interrupts in pcie wrapper logic */
  793         if (pcie_port->rev_id == AL_PCIE_REV_ID_1) {
  794                 al_reg_write32(regs->app.soc_int[pf_num].mask_inta_leg_0, (1 << 21));
  795         } else if ((pcie_port->rev_id == AL_PCIE_REV_ID_2) ||
  796                 (pcie_port->rev_id == AL_PCIE_REV_ID_3)) {
  797                 al_reg_write32(regs->app.soc_int[pf_num].mask_inta_leg_3, (1 << 18));
  798         } else {
  799                 al_assert(0);
  800                 ret = -ENOSYS;
  801                 goto done;
  802         }
  803 
  804         /**
  805          * Addressing RMN: 1547
  806          *
  807          * RMN description:
  808          * 1. Whenever writing to 0x2xx offset, the write also happens to
  809          * 0x3xx address, meaning two registers are written instead of one.
  810          * 2. Read and write from 0x3xx work ok.
  811          *
  812          * Software flow:
  813          * Backup the value of the app.int_grp_a.mask_a register, because
  814          * app.int_grp_a.mask_clear_a gets overwritten during the write to
  815          * app.soc.mask_msi_leg_0 register.
  816          * Restore the original value after the write to app.soc.mask_msi_leg_0
  817          * register.
  818          */
  819         if (pcie_port->rev_id == AL_PCIE_REV_ID_1) {
  820                 al_reg_write32(regs->app.soc_int[pf_num].mask_msi_leg_0, (1 << 22));
  821         } else if ((pcie_port->rev_id == AL_PCIE_REV_ID_2) ||
  822                 (pcie_port->rev_id == AL_PCIE_REV_ID_3)) {
  823                 al_reg_write32(regs->app.soc_int[pf_num].mask_msi_leg_3, (1 << 19));
  824         } else {
  825                 al_assert(0);
  826                 ret = -ENOSYS;
  827                 goto done;
  828         }
  829 
  830         ret = 0;
  831 
  832 done:
  833         al_pcie_port_wr_to_ro_set(pcie_port, AL_FALSE);
  834 
  835         return ret;
  836 }
  837 
  838 static int
  839 al_pcie_port_sris_config(
  840         struct al_pcie_port *pcie_port,
  841         struct al_pcie_sris_params *sris_params,
  842         enum al_pcie_link_speed link_speed)
  843 {
  844         int rc = 0;
  845         struct al_pcie_regs *regs = pcie_port->regs;
  846 
  847         if (sris_params->use_defaults) {
  848                 sris_params->kp_counter_gen3 = (pcie_port->rev_id > AL_PCIE_REV_ID_1) ?
  849                                                 PCIE_SRIS_KP_COUNTER_GEN3_DEFAULT_VAL : 0;
  850                 sris_params->kp_counter_gen21 = PCIE_SRIS_KP_COUNTER_GEN21_DEFAULT_VAL;
  851 
  852                 al_dbg("PCIe %d: configuring SRIS with default values kp_gen3[%d] kp_gen21[%d]\n",
  853                         pcie_port->port_id,
  854                         sris_params->kp_counter_gen3,
  855                         sris_params->kp_counter_gen21);
  856         }
  857 
  858         switch (pcie_port->rev_id) {
  859         case AL_PCIE_REV_ID_3:
  860                 al_reg_write32_masked(&regs->app.cfg_func_ext->cfg,
  861                                 PCIE_W_CFG_FUNC_EXT_CFG_APP_SRIS_MODE,
  862                                 PCIE_W_CFG_FUNC_EXT_CFG_APP_SRIS_MODE);
  863         case AL_PCIE_REV_ID_2:
  864                 al_reg_write32_masked(regs->app.global_ctrl.sris_kp_counter,
  865                         PCIE_W_GLOBAL_CTRL_SRIS_KP_COUNTER_VALUE_GEN3_SRIS_MASK |
  866                         PCIE_W_GLOBAL_CTRL_SRIS_KP_COUNTER_VALUE_GEN21_SRIS_MASK |
  867                         PCIE_W_GLOBAL_CTRL_SRIS_KP_COUNTER_VALUE_PCIE_X4_SRIS_EN,
  868                         (sris_params->kp_counter_gen3 <<
  869                                 PCIE_W_GLOBAL_CTRL_SRIS_KP_COUNTER_VALUE_GEN3_SRIS_SHIFT) |
  870                         (sris_params->kp_counter_gen21 <<
  871                                 PCIE_W_GLOBAL_CTRL_SRIS_KP_COUNTER_VALUE_GEN21_SRIS_SHIFT) |
  872                         PCIE_W_GLOBAL_CTRL_SRIS_KP_COUNTER_VALUE_PCIE_X4_SRIS_EN);
  873                 break;
  874 
  875         case AL_PCIE_REV_ID_1:
  876                 if ((link_speed == AL_PCIE_LINK_SPEED_GEN3) && (sris_params->kp_counter_gen3)) {
  877                         al_err("PCIe %d: cannot config Gen%d SRIS with rev_id[%d]\n",
  878                                 pcie_port->port_id, al_pcie_speed_gen_code(link_speed),
  879                                 pcie_port->rev_id);
  880                         return -EINVAL;
  881                 }
  882 
  883                 al_reg_write32_masked(&regs->port_regs->filter_mask_reg_1,
  884                         PCIE_FLT_MASK_SKP_INT_VAL_MASK,
  885                         sris_params->kp_counter_gen21);
  886                 break;
  887 
  888         default:
  889                 al_err("PCIe %d: SRIS config is not supported in rev_id[%d]\n",
  890                         pcie_port->port_id, pcie_port->rev_id);
  891                 al_assert(0);
  892                 return -EINVAL;
  893         }
  894 
  895         return rc;
  896 }
  897 
  898 static void
  899 al_pcie_port_ib_hcrd_config(struct al_pcie_port *pcie_port)
  900 {
  901         struct al_pcie_regs *regs = pcie_port->regs;
  902 
  903         al_reg_write32_masked(
  904                 &regs->port_regs->vc0_posted_rcv_q_ctrl,
  905                 RADM_PQ_HCRD_VC0_MASK,
  906                 (pcie_port->ib_hcrd_config.nof_p_hdr - 1)
  907                         << RADM_PQ_HCRD_VC0_SHIFT);
  908 
  909         al_reg_write32_masked(
  910                 &regs->port_regs->vc0_non_posted_rcv_q_ctrl,
  911                 RADM_NPQ_HCRD_VC0_MASK,
  912                 (pcie_port->ib_hcrd_config.nof_np_hdr - 1)
  913                         << RADM_NPQ_HCRD_VC0_SHIFT);
  914 }
  915 
  916 static unsigned int
  917 al_pcie_port_max_num_of_pfs_get(struct al_pcie_port *pcie_port)
  918 {
  919         struct al_pcie_regs *regs = pcie_port->regs;
  920         uint32_t max_func_num;
  921         uint32_t max_num_of_pfs;
  922 
  923         /**
  924          * Only in REV3, when port is already enabled, max_num_of_pfs is already
  925          * initialized, return it. Otherwise, return default: 1 PF
  926          */
  927         if ((pcie_port->rev_id == AL_PCIE_REV_ID_3)
  928                 && al_pcie_port_is_enabled(pcie_port)) {
  929                 max_func_num = al_reg_read32(&regs->port_regs->timer_ctrl_max_func_num);
  930                 max_num_of_pfs = AL_REG_FIELD_GET(max_func_num, PCIE_PORT_GEN3_MAX_FUNC_NUM, 0) + 1;
  931                 return max_num_of_pfs;
  932         }
  933         return 1;
  934 }
  935 
  936 /** Enable ecrc generation in outbound atu (Addressing RMN: 5119) */
  937 static void al_pcie_ecrc_gen_ob_atu_enable(struct al_pcie_port *pcie_port, unsigned int pf_num)
  938 {
  939         struct al_pcie_regs *regs = pcie_port->regs;
  940         int max_ob_atu = (pcie_port->rev_id == AL_PCIE_REV_ID_3) ?
  941                 AL_PCIE_REV_3_ATU_NUM_OUTBOUND_REGIONS : AL_PCIE_REV_1_2_ATU_NUM_OUTBOUND_REGIONS;
  942         int i;
  943         for (i = 0; i < max_ob_atu; i++) {
  944                 al_bool enable = 0;
  945                 uint32_t reg = 0;
  946                 unsigned int func_num;
  947                 AL_REG_FIELD_SET(reg, 0xF, 0, i);
  948                 AL_REG_BIT_VAL_SET(reg, 31, AL_PCIE_ATU_DIR_OUTBOUND);
  949                 al_reg_write32(&regs->port_regs->iatu.index, reg);
  950                 reg = al_reg_read32(&regs->port_regs->iatu.cr2);
  951                 enable = AL_REG_BIT_GET(reg, 31) ? AL_TRUE : AL_FALSE;
  952                 reg = al_reg_read32(&regs->port_regs->iatu.cr1);
  953                 func_num = AL_REG_FIELD_GET(reg,
  954                                 PCIE_IATU_CR1_FUNC_NUM_MASK,
  955                                 PCIE_IATU_CR1_FUNC_NUM_SHIFT);
  956                 if ((enable == AL_TRUE) && (pf_num == func_num)) {
  957                         /* Set TD bit */
  958                         AL_REG_BIT_SET(reg, 8);
  959                         al_reg_write32(&regs->port_regs->iatu.cr1, reg);
  960                 }
  961         }
  962 }
  963 
  964 /******************************************************************************/
  965 /***************************** API Implementation *****************************/
  966 /******************************************************************************/
  967 
  968 /*************************** PCIe Initialization API **************************/
  969 
  970 /**
  971  * Initializes a PCIe port handle structure
  972  * Caution: this function should not read/write to any register except for
  973  * reading RO register (REV_ID for example)
  974  */
  975 int
  976 al_pcie_port_handle_init(
  977         struct al_pcie_port     *pcie_port,
  978         void __iomem            *pcie_reg_base,
  979         void __iomem            *pbs_reg_base,
  980         unsigned int            port_id)
  981 {
  982         int i, ret;
  983 
  984         pcie_port->pcie_reg_base = pcie_reg_base;
  985         pcie_port->regs = &pcie_port->regs_ptrs;
  986         pcie_port->ex_regs = NULL;
  987         pcie_port->pbs_regs = pbs_reg_base;
  988         pcie_port->port_id = port_id;
  989         pcie_port->max_lanes = 0;
  990 
  991         ret = al_pcie_rev_id_get(pbs_reg_base, pcie_reg_base);
  992         if (ret < 0)
  993                 return ret;
  994 
  995         pcie_port->rev_id = ret;
  996 
  997         /* Zero all regs */
  998         al_memset(pcie_port->regs, 0, sizeof(struct al_pcie_regs));
  999 
 1000         if (pcie_port->rev_id == AL_PCIE_REV_ID_1) {
 1001                 struct al_pcie_rev1_regs __iomem *regs =
 1002                         (struct al_pcie_rev1_regs __iomem *)pcie_reg_base;
 1003 
 1004                 pcie_port->regs->axi.ctrl.global = &regs->axi.ctrl.global;
 1005                 pcie_port->regs->axi.ctrl.master_rctl = &regs->axi.ctrl.master_rctl;
 1006                 pcie_port->regs->axi.ctrl.master_ctl = &regs->axi.ctrl.master_ctl;
 1007                 pcie_port->regs->axi.ctrl.master_arctl = &regs->axi.ctrl.master_arctl;
 1008                 pcie_port->regs->axi.ctrl.master_awctl = &regs->axi.ctrl.master_awctl;
 1009                 pcie_port->regs->axi.ctrl.slv_ctl = &regs->axi.ctrl.slv_ctl;
 1010                 pcie_port->regs->axi.ob_ctrl.cfg_target_bus = &regs->axi.ob_ctrl.cfg_target_bus;
 1011                 pcie_port->regs->axi.ob_ctrl.cfg_control = &regs->axi.ob_ctrl.cfg_control;
 1012                 pcie_port->regs->axi.ob_ctrl.io_start_l = &regs->axi.ob_ctrl.io_start_l;
 1013                 pcie_port->regs->axi.ob_ctrl.io_start_h = &regs->axi.ob_ctrl.io_start_h;
 1014                 pcie_port->regs->axi.ob_ctrl.io_limit_l = &regs->axi.ob_ctrl.io_limit_l;
 1015                 pcie_port->regs->axi.ob_ctrl.io_limit_h = &regs->axi.ob_ctrl.io_limit_h;
 1016                 pcie_port->regs->axi.pcie_global.conf = &regs->axi.pcie_global.conf;
 1017                 pcie_port->regs->axi.conf.zero_lane0 = &regs->axi.conf.zero_lane0;
 1018                 pcie_port->regs->axi.conf.zero_lane1 = &regs->axi.conf.zero_lane1;
 1019                 pcie_port->regs->axi.conf.zero_lane2 = &regs->axi.conf.zero_lane2;
 1020                 pcie_port->regs->axi.conf.zero_lane3 = &regs->axi.conf.zero_lane3;
 1021                 pcie_port->regs->axi.status.lane[0] = &regs->axi.status.lane0;
 1022                 pcie_port->regs->axi.status.lane[1] = &regs->axi.status.lane1;
 1023                 pcie_port->regs->axi.status.lane[2] = &regs->axi.status.lane2;
 1024                 pcie_port->regs->axi.status.lane[3] = &regs->axi.status.lane3;
 1025                 pcie_port->regs->axi.parity.en_axi = &regs->axi.parity.en_axi;
 1026                 pcie_port->regs->axi.ordering.pos_cntl = &regs->axi.ordering.pos_cntl;
 1027                 pcie_port->regs->axi.pre_configuration.pcie_core_setup = &regs->axi.pre_configuration.pcie_core_setup;
 1028                 pcie_port->regs->axi.init_fc.cfg = &regs->axi.init_fc.cfg;
 1029                 pcie_port->regs->axi.int_grp_a = &regs->axi.int_grp_a;
 1030 
 1031                 pcie_port->regs->app.global_ctrl.port_init = &regs->app.global_ctrl.port_init;
 1032                 pcie_port->regs->app.global_ctrl.pm_control = &regs->app.global_ctrl.pm_control;
 1033                 pcie_port->regs->app.global_ctrl.events_gen[0] = &regs->app.global_ctrl.events_gen;
 1034                 pcie_port->regs->app.debug = &regs->app.debug;
 1035                 pcie_port->regs->app.soc_int[0].status_0 = &regs->app.soc_int.status_0;
 1036                 pcie_port->regs->app.soc_int[0].status_1 = &regs->app.soc_int.status_1;
 1037                 pcie_port->regs->app.soc_int[0].status_2 = &regs->app.soc_int.status_2;
 1038                 pcie_port->regs->app.soc_int[0].mask_inta_leg_0 = &regs->app.soc_int.mask_inta_leg_0;
 1039                 pcie_port->regs->app.soc_int[0].mask_inta_leg_1 = &regs->app.soc_int.mask_inta_leg_1;
 1040                 pcie_port->regs->app.soc_int[0].mask_inta_leg_2 = &regs->app.soc_int.mask_inta_leg_2;
 1041                 pcie_port->regs->app.soc_int[0].mask_msi_leg_0 = &regs->app.soc_int.mask_msi_leg_0;
 1042                 pcie_port->regs->app.soc_int[0].mask_msi_leg_1 = &regs->app.soc_int.mask_msi_leg_1;
 1043                 pcie_port->regs->app.soc_int[0].mask_msi_leg_2 = &regs->app.soc_int.mask_msi_leg_2;
 1044                 pcie_port->regs->app.ctrl_gen = &regs->app.ctrl_gen;
 1045                 pcie_port->regs->app.parity = &regs->app.parity;
 1046                 pcie_port->regs->app.atu.in_mask_pair = regs->app.atu.in_mask_pair;
 1047                 pcie_port->regs->app.atu.out_mask_pair = regs->app.atu.out_mask_pair;
 1048                 pcie_port->regs->app.int_grp_a = &regs->app.int_grp_a;
 1049                 pcie_port->regs->app.int_grp_b = &regs->app.int_grp_b;
 1050 
 1051                 pcie_port->regs->core_space[0].config_header = regs->core_space.config_header;
 1052                 pcie_port->regs->core_space[0].pcie_pm_cap_base = &regs->core_space.pcie_pm_cap_base;
 1053                 pcie_port->regs->core_space[0].pcie_cap_base = &regs->core_space.pcie_cap_base;
 1054                 pcie_port->regs->core_space[0].pcie_dev_cap_base = &regs->core_space.pcie_dev_cap_base;
 1055                 pcie_port->regs->core_space[0].pcie_dev_ctrl_status = &regs->core_space.pcie_dev_ctrl_status;
 1056                 pcie_port->regs->core_space[0].pcie_link_cap_base = &regs->core_space.pcie_link_cap_base;
 1057                 pcie_port->regs->core_space[0].msix_cap_base = &regs->core_space.msix_cap_base;
 1058                 pcie_port->regs->core_space[0].aer = &regs->core_space.aer;
 1059                 pcie_port->regs->core_space[0].pcie_sec_ext_cap_base = &regs->core_space.pcie_sec_ext_cap_base;
 1060 
 1061                 pcie_port->regs->port_regs = &regs->core_space.port_regs;
 1062 
 1063         } else if (pcie_port->rev_id == AL_PCIE_REV_ID_2) {
 1064                 struct al_pcie_rev2_regs __iomem *regs =
 1065                         (struct al_pcie_rev2_regs __iomem *)pcie_reg_base;
 1066 
 1067                 pcie_port->regs->axi.ctrl.global = &regs->axi.ctrl.global;
 1068                 pcie_port->regs->axi.ctrl.master_rctl = &regs->axi.ctrl.master_rctl;
 1069                 pcie_port->regs->axi.ctrl.master_ctl = &regs->axi.ctrl.master_ctl;
 1070                 pcie_port->regs->axi.ctrl.master_arctl = &regs->axi.ctrl.master_arctl;
 1071                 pcie_port->regs->axi.ctrl.master_awctl = &regs->axi.ctrl.master_awctl;
 1072                 pcie_port->regs->axi.ctrl.slv_ctl = &regs->axi.ctrl.slv_ctl;
 1073                 pcie_port->regs->axi.ob_ctrl.cfg_target_bus = &regs->axi.ob_ctrl.cfg_target_bus;
 1074                 pcie_port->regs->axi.ob_ctrl.cfg_control = &regs->axi.ob_ctrl.cfg_control;
 1075                 pcie_port->regs->axi.ob_ctrl.io_start_l = &regs->axi.ob_ctrl.io_start_l;
 1076                 pcie_port->regs->axi.ob_ctrl.io_start_h = &regs->axi.ob_ctrl.io_start_h;
 1077                 pcie_port->regs->axi.ob_ctrl.io_limit_l = &regs->axi.ob_ctrl.io_limit_l;
 1078                 pcie_port->regs->axi.ob_ctrl.io_limit_h = &regs->axi.ob_ctrl.io_limit_h;
 1079                 pcie_port->regs->axi.ob_ctrl.tgtid_reg_ovrd = &regs->axi.ob_ctrl.tgtid_reg_ovrd;
 1080                 pcie_port->regs->axi.ob_ctrl.addr_high_reg_ovrd_sel = &regs->axi.ob_ctrl.addr_high_reg_ovrd_sel;
 1081                 pcie_port->regs->axi.ob_ctrl.addr_high_reg_ovrd_value = &regs->axi.ob_ctrl.addr_high_reg_ovrd_value;
 1082                 pcie_port->regs->axi.ob_ctrl.addr_size_replace = &regs->axi.ob_ctrl.addr_size_replace;
 1083                 pcie_port->regs->axi.pcie_global.conf = &regs->axi.pcie_global.conf;
 1084                 pcie_port->regs->axi.conf.zero_lane0 = &regs->axi.conf.zero_lane0;
 1085                 pcie_port->regs->axi.conf.zero_lane1 = &regs->axi.conf.zero_lane1;
 1086                 pcie_port->regs->axi.conf.zero_lane2 = &regs->axi.conf.zero_lane2;
 1087                 pcie_port->regs->axi.conf.zero_lane3 = &regs->axi.conf.zero_lane3;
 1088                 pcie_port->regs->axi.status.lane[0] = &regs->axi.status.lane0;
 1089                 pcie_port->regs->axi.status.lane[1] = &regs->axi.status.lane1;
 1090                 pcie_port->regs->axi.status.lane[2] = &regs->axi.status.lane2;
 1091                 pcie_port->regs->axi.status.lane[3] = &regs->axi.status.lane3;
 1092                 pcie_port->regs->axi.parity.en_axi = &regs->axi.parity.en_axi;
 1093                 pcie_port->regs->axi.ordering.pos_cntl = &regs->axi.ordering.pos_cntl;
 1094                 pcie_port->regs->axi.pre_configuration.pcie_core_setup = &regs->axi.pre_configuration.pcie_core_setup;
 1095                 pcie_port->regs->axi.init_fc.cfg = &regs->axi.init_fc.cfg;
 1096                 pcie_port->regs->axi.int_grp_a = &regs->axi.int_grp_a;
 1097 
 1098                 pcie_port->regs->app.global_ctrl.port_init = &regs->app.global_ctrl.port_init;
 1099                 pcie_port->regs->app.global_ctrl.pm_control = &regs->app.global_ctrl.pm_control;
 1100                 pcie_port->regs->app.global_ctrl.events_gen[0] = &regs->app.global_ctrl.events_gen;
 1101                 pcie_port->regs->app.global_ctrl.corr_err_sts_int = &regs->app.global_ctrl.pended_corr_err_sts_int;
 1102                 pcie_port->regs->app.global_ctrl.uncorr_err_sts_int = &regs->app.global_ctrl.pended_uncorr_err_sts_int;
 1103                 pcie_port->regs->app.global_ctrl.sris_kp_counter = &regs->app.global_ctrl.sris_kp_counter_value;
 1104                 pcie_port->regs->app.debug = &regs->app.debug;
 1105                 pcie_port->regs->app.ap_user_send_msg = &regs->app.ap_user_send_msg;
 1106                 pcie_port->regs->app.soc_int[0].status_0 = &regs->app.soc_int.status_0;
 1107                 pcie_port->regs->app.soc_int[0].status_1 = &regs->app.soc_int.status_1;
 1108                 pcie_port->regs->app.soc_int[0].status_2 = &regs->app.soc_int.status_2;
 1109                 pcie_port->regs->app.soc_int[0].status_3 = &regs->app.soc_int.status_3;
 1110                 pcie_port->regs->app.soc_int[0].mask_inta_leg_0 = &regs->app.soc_int.mask_inta_leg_0;
 1111                 pcie_port->regs->app.soc_int[0].mask_inta_leg_1 = &regs->app.soc_int.mask_inta_leg_1;
 1112                 pcie_port->regs->app.soc_int[0].mask_inta_leg_2 = &regs->app.soc_int.mask_inta_leg_2;
 1113                 pcie_port->regs->app.soc_int[0].mask_inta_leg_3 = &regs->app.soc_int.mask_inta_leg_3;
 1114                 pcie_port->regs->app.soc_int[0].mask_msi_leg_0 = &regs->app.soc_int.mask_msi_leg_0;
 1115                 pcie_port->regs->app.soc_int[0].mask_msi_leg_1 = &regs->app.soc_int.mask_msi_leg_1;
 1116                 pcie_port->regs->app.soc_int[0].mask_msi_leg_2 = &regs->app.soc_int.mask_msi_leg_2;
 1117                 pcie_port->regs->app.soc_int[0].mask_msi_leg_3 = &regs->app.soc_int.mask_msi_leg_3;
 1118                 pcie_port->regs->app.ctrl_gen = &regs->app.ctrl_gen;
 1119                 pcie_port->regs->app.parity = &regs->app.parity;
 1120                 pcie_port->regs->app.atu.in_mask_pair = regs->app.atu.in_mask_pair;
 1121                 pcie_port->regs->app.atu.out_mask_pair = regs->app.atu.out_mask_pair;
 1122                 pcie_port->regs->app.status_per_func[0] = &regs->app.status_per_func;
 1123                 pcie_port->regs->app.int_grp_a = &regs->app.int_grp_a;
 1124                 pcie_port->regs->app.int_grp_b = &regs->app.int_grp_b;
 1125 
 1126                 pcie_port->regs->core_space[0].config_header = regs->core_space.config_header;
 1127                 pcie_port->regs->core_space[0].pcie_pm_cap_base = &regs->core_space.pcie_pm_cap_base;
 1128                 pcie_port->regs->core_space[0].pcie_cap_base = &regs->core_space.pcie_cap_base;
 1129                 pcie_port->regs->core_space[0].pcie_dev_cap_base = &regs->core_space.pcie_dev_cap_base;
 1130                 pcie_port->regs->core_space[0].pcie_dev_ctrl_status = &regs->core_space.pcie_dev_ctrl_status;
 1131                 pcie_port->regs->core_space[0].pcie_link_cap_base = &regs->core_space.pcie_link_cap_base;
 1132                 pcie_port->regs->core_space[0].msix_cap_base = &regs->core_space.msix_cap_base;
 1133                 pcie_port->regs->core_space[0].aer = &regs->core_space.aer;
 1134                 pcie_port->regs->core_space[0].pcie_sec_ext_cap_base = &regs->core_space.pcie_sec_ext_cap_base;
 1135 
 1136                 pcie_port->regs->port_regs = &regs->core_space.port_regs;
 1137 
 1138         } else if (pcie_port->rev_id == AL_PCIE_REV_ID_3) {
 1139                 struct al_pcie_rev3_regs __iomem *regs =
 1140                         (struct al_pcie_rev3_regs __iomem *)pcie_reg_base;
 1141                 pcie_port->regs->axi.ctrl.global = &regs->axi.ctrl.global;
 1142                 pcie_port->regs->axi.ctrl.master_rctl = &regs->axi.ctrl.master_rctl;
 1143                 pcie_port->regs->axi.ctrl.master_ctl = &regs->axi.ctrl.master_ctl;
 1144                 pcie_port->regs->axi.ctrl.master_arctl = &regs->axi.ctrl.master_arctl;
 1145                 pcie_port->regs->axi.ctrl.master_awctl = &regs->axi.ctrl.master_awctl;
 1146                 pcie_port->regs->axi.ctrl.slv_ctl = &regs->axi.ctrl.slv_ctl;
 1147                 pcie_port->regs->axi.ob_ctrl.cfg_target_bus = &regs->axi.ob_ctrl.cfg_target_bus;
 1148                 pcie_port->regs->axi.ob_ctrl.cfg_control = &regs->axi.ob_ctrl.cfg_control;
 1149                 pcie_port->regs->axi.ob_ctrl.io_start_l = &regs->axi.ob_ctrl.io_start_l;
 1150                 pcie_port->regs->axi.ob_ctrl.io_start_h = &regs->axi.ob_ctrl.io_start_h;
 1151                 pcie_port->regs->axi.ob_ctrl.io_limit_l = &regs->axi.ob_ctrl.io_limit_l;
 1152                 pcie_port->regs->axi.ob_ctrl.io_limit_h = &regs->axi.ob_ctrl.io_limit_h;
 1153                 pcie_port->regs->axi.ob_ctrl.io_addr_mask_h = &regs->axi.ob_ctrl.io_addr_mask_h;
 1154                 pcie_port->regs->axi.ob_ctrl.ar_msg_addr_mask_h = &regs->axi.ob_ctrl.ar_msg_addr_mask_h;
 1155                 pcie_port->regs->axi.ob_ctrl.aw_msg_addr_mask_h = &regs->axi.ob_ctrl.aw_msg_addr_mask_h;
 1156                 pcie_port->regs->axi.ob_ctrl.tgtid_reg_ovrd = &regs->axi.ob_ctrl.tgtid_reg_ovrd;
 1157                 pcie_port->regs->axi.ob_ctrl.addr_high_reg_ovrd_sel = &regs->axi.ob_ctrl.addr_high_reg_ovrd_sel;
 1158                 pcie_port->regs->axi.ob_ctrl.addr_high_reg_ovrd_value = &regs->axi.ob_ctrl.addr_high_reg_ovrd_value;
 1159                 pcie_port->regs->axi.ob_ctrl.addr_size_replace = &regs->axi.ob_ctrl.addr_size_replace;
 1160                 pcie_port->regs->axi.pcie_global.conf = &regs->axi.pcie_global.conf;
 1161                 pcie_port->regs->axi.conf.zero_lane0 = &regs->axi.conf.zero_lane0;
 1162                 pcie_port->regs->axi.conf.zero_lane1 = &regs->axi.conf.zero_lane1;
 1163                 pcie_port->regs->axi.conf.zero_lane2 = &regs->axi.conf.zero_lane2;
 1164                 pcie_port->regs->axi.conf.zero_lane3 = &regs->axi.conf.zero_lane3;
 1165                 pcie_port->regs->axi.conf.zero_lane4 = &regs->axi.conf.zero_lane4;
 1166                 pcie_port->regs->axi.conf.zero_lane5 = &regs->axi.conf.zero_lane5;
 1167                 pcie_port->regs->axi.conf.zero_lane6 = &regs->axi.conf.zero_lane6;
 1168                 pcie_port->regs->axi.conf.zero_lane7 = &regs->axi.conf.zero_lane7;
 1169                 pcie_port->regs->axi.status.lane[0] = &regs->axi.status.lane0;
 1170                 pcie_port->regs->axi.status.lane[1] = &regs->axi.status.lane1;
 1171                 pcie_port->regs->axi.status.lane[2] = &regs->axi.status.lane2;
 1172                 pcie_port->regs->axi.status.lane[3] = &regs->axi.status.lane3;
 1173                 pcie_port->regs->axi.status.lane[4] = &regs->axi.status.lane4;
 1174                 pcie_port->regs->axi.status.lane[5] = &regs->axi.status.lane5;
 1175                 pcie_port->regs->axi.status.lane[6] = &regs->axi.status.lane6;
 1176                 pcie_port->regs->axi.status.lane[7] = &regs->axi.status.lane7;
 1177                 pcie_port->regs->axi.parity.en_axi = &regs->axi.parity.en_axi;
 1178                 pcie_port->regs->axi.ordering.pos_cntl = &regs->axi.ordering.pos_cntl;
 1179                 pcie_port->regs->axi.pre_configuration.pcie_core_setup = &regs->axi.pre_configuration.pcie_core_setup;
 1180                 pcie_port->regs->axi.init_fc.cfg = &regs->axi.init_fc.cfg;
 1181                 pcie_port->regs->axi.int_grp_a = &regs->axi.int_grp_a;
 1182                 pcie_port->regs->axi.axi_attr_ovrd.write_msg_ctrl_0 = &regs->axi.axi_attr_ovrd.write_msg_ctrl_0;
 1183                 pcie_port->regs->axi.axi_attr_ovrd.write_msg_ctrl_1 = &regs->axi.axi_attr_ovrd.write_msg_ctrl_1;
 1184                 pcie_port->regs->axi.axi_attr_ovrd.pf_sel = &regs->axi.axi_attr_ovrd.pf_sel;
 1185 
 1186                 for (i = 0; i < AL_MAX_NUM_OF_PFS; i++) {
 1187                         pcie_port->regs->axi.pf_axi_attr_ovrd[i].func_ctrl_0 = &regs->axi.pf_axi_attr_ovrd[i].func_ctrl_0;
 1188                         pcie_port->regs->axi.pf_axi_attr_ovrd[i].func_ctrl_1 = &regs->axi.pf_axi_attr_ovrd[i].func_ctrl_1;
 1189                         pcie_port->regs->axi.pf_axi_attr_ovrd[i].func_ctrl_2 = &regs->axi.pf_axi_attr_ovrd[i].func_ctrl_2;
 1190                         pcie_port->regs->axi.pf_axi_attr_ovrd[i].func_ctrl_3 = &regs->axi.pf_axi_attr_ovrd[i].func_ctrl_3;
 1191                         pcie_port->regs->axi.pf_axi_attr_ovrd[i].func_ctrl_4 = &regs->axi.pf_axi_attr_ovrd[i].func_ctrl_4;
 1192                         pcie_port->regs->axi.pf_axi_attr_ovrd[i].func_ctrl_5 = &regs->axi.pf_axi_attr_ovrd[i].func_ctrl_5;
 1193                         pcie_port->regs->axi.pf_axi_attr_ovrd[i].func_ctrl_6 = &regs->axi.pf_axi_attr_ovrd[i].func_ctrl_6;
 1194                         pcie_port->regs->axi.pf_axi_attr_ovrd[i].func_ctrl_7 = &regs->axi.pf_axi_attr_ovrd[i].func_ctrl_7;
 1195                         pcie_port->regs->axi.pf_axi_attr_ovrd[i].func_ctrl_8 = &regs->axi.pf_axi_attr_ovrd[i].func_ctrl_8;
 1196                         pcie_port->regs->axi.pf_axi_attr_ovrd[i].func_ctrl_9 = &regs->axi.pf_axi_attr_ovrd[i].func_ctrl_9;
 1197                 }
 1198 
 1199                 pcie_port->regs->axi.msg_attr_axuser_table.entry_vec = &regs->axi.msg_attr_axuser_table.entry_vec;
 1200 
 1201                 pcie_port->regs->app.global_ctrl.port_init = &regs->app.global_ctrl.port_init;
 1202                 pcie_port->regs->app.global_ctrl.pm_control = &regs->app.global_ctrl.pm_control;
 1203                 pcie_port->regs->app.global_ctrl.corr_err_sts_int = &regs->app.global_ctrl.pended_corr_err_sts_int;
 1204                 pcie_port->regs->app.global_ctrl.uncorr_err_sts_int = &regs->app.global_ctrl.pended_uncorr_err_sts_int;
 1205 
 1206                 for (i = 0; i < AL_MAX_NUM_OF_PFS; i++) {
 1207                         pcie_port->regs->app.global_ctrl.events_gen[i] = &regs->app.events_gen_per_func[i].events_gen;
 1208                 }
 1209 
 1210                 pcie_port->regs->app.global_ctrl.sris_kp_counter = &regs->app.global_ctrl.sris_kp_counter_value;
 1211                 pcie_port->regs->app.debug = &regs->app.debug;
 1212 
 1213                 for (i = 0; i < AL_MAX_NUM_OF_PFS; i++) {
 1214                         pcie_port->regs->app.soc_int[i].status_0 = &regs->app.soc_int_per_func[i].status_0;
 1215                         pcie_port->regs->app.soc_int[i].status_1 = &regs->app.soc_int_per_func[i].status_1;
 1216                         pcie_port->regs->app.soc_int[i].status_2 = &regs->app.soc_int_per_func[i].status_2;
 1217                         pcie_port->regs->app.soc_int[i].status_3 = &regs->app.soc_int_per_func[i].status_3;
 1218                         pcie_port->regs->app.soc_int[i].mask_inta_leg_0 = &regs->app.soc_int_per_func[i].mask_inta_leg_0;
 1219                         pcie_port->regs->app.soc_int[i].mask_inta_leg_1 = &regs->app.soc_int_per_func[i].mask_inta_leg_1;
 1220                         pcie_port->regs->app.soc_int[i].mask_inta_leg_2 = &regs->app.soc_int_per_func[i].mask_inta_leg_2;
 1221                         pcie_port->regs->app.soc_int[i].mask_inta_leg_3 = &regs->app.soc_int_per_func[i].mask_inta_leg_3;
 1222                         pcie_port->regs->app.soc_int[i].mask_msi_leg_0 = &regs->app.soc_int_per_func[i].mask_msi_leg_0;
 1223                         pcie_port->regs->app.soc_int[i].mask_msi_leg_1 = &regs->app.soc_int_per_func[i].mask_msi_leg_1;
 1224                         pcie_port->regs->app.soc_int[i].mask_msi_leg_2 = &regs->app.soc_int_per_func[i].mask_msi_leg_2;
 1225                         pcie_port->regs->app.soc_int[i].mask_msi_leg_3 = &regs->app.soc_int_per_func[i].mask_msi_leg_3;
 1226                 }
 1227 
 1228                 pcie_port->regs->app.ap_user_send_msg = &regs->app.ap_user_send_msg;
 1229                 pcie_port->regs->app.ctrl_gen = &regs->app.ctrl_gen;
 1230                 pcie_port->regs->app.parity = &regs->app.parity;
 1231                 pcie_port->regs->app.atu.in_mask_pair = regs->app.atu.in_mask_pair;
 1232                 pcie_port->regs->app.atu.out_mask_pair = regs->app.atu.out_mask_pair;
 1233                 pcie_port->regs->app.cfg_func_ext = &regs->app.cfg_func_ext;
 1234 
 1235                 for (i = 0; i < AL_MAX_NUM_OF_PFS; i++)
 1236                         pcie_port->regs->app.status_per_func[i] = &regs->app.status_per_func[i];
 1237 
 1238                 pcie_port->regs->app.int_grp_a = &regs->app.int_grp_a;
 1239                 pcie_port->regs->app.int_grp_b = &regs->app.int_grp_b;
 1240                 pcie_port->regs->app.int_grp_c = &regs->app.int_grp_c;
 1241                 pcie_port->regs->app.int_grp_d = &regs->app.int_grp_d;
 1242 
 1243                 for (i = 0; i < AL_MAX_NUM_OF_PFS; i++) {
 1244                         pcie_port->regs->core_space[i].config_header = regs->core_space.func[i].config_header;
 1245                         pcie_port->regs->core_space[i].pcie_pm_cap_base = &regs->core_space.func[i].pcie_pm_cap_base;
 1246                         pcie_port->regs->core_space[i].pcie_cap_base = &regs->core_space.func[i].pcie_cap_base;
 1247                         pcie_port->regs->core_space[i].pcie_dev_cap_base = &regs->core_space.func[i].pcie_dev_cap_base;
 1248                         pcie_port->regs->core_space[i].pcie_dev_ctrl_status = &regs->core_space.func[i].pcie_dev_ctrl_status;
 1249                         pcie_port->regs->core_space[i].pcie_link_cap_base = &regs->core_space.func[i].pcie_link_cap_base;
 1250                         pcie_port->regs->core_space[i].msix_cap_base = &regs->core_space.func[i].msix_cap_base;
 1251                         pcie_port->regs->core_space[i].aer = &regs->core_space.func[i].aer;
 1252                         pcie_port->regs->core_space[i].tph_cap_base = &regs->core_space.func[i].tph_cap_base;
 1253 
 1254                 }
 1255 
 1256                 /* secondary extension capability only for PF0 */
 1257                 pcie_port->regs->core_space[0].pcie_sec_ext_cap_base = &regs->core_space.func[0].pcie_sec_ext_cap_base;
 1258 
 1259                 pcie_port->regs->port_regs = &regs->core_space.func[0].port_regs;
 1260 
 1261         } else {
 1262                 al_warn("%s: Revision ID is unknown\n",
 1263                         __func__);
 1264                 return -EINVAL;
 1265         }
 1266 
 1267         /* set maximum number of physical functions */
 1268         pcie_port->max_num_of_pfs = al_pcie_port_max_num_of_pfs_get(pcie_port);
 1269 
 1270         /* Clear 'nof_p_hdr' & 'nof_np_hdr' to later know if they where changed by the user */
 1271         pcie_port->ib_hcrd_config.nof_np_hdr = 0;
 1272         pcie_port->ib_hcrd_config.nof_p_hdr = 0;
 1273 
 1274         al_dbg("pcie port handle initialized. port id: %d, rev_id %d, regs base %p\n",
 1275                port_id, pcie_port->rev_id, pcie_reg_base);
 1276         return 0;
 1277 }
 1278 
 1279 /**
 1280  * Initializes a PCIe Physical function handle structure
 1281  * Caution: this function should not read/write to any register except for
 1282  * reading RO register (REV_ID for example)
 1283  */
 1284 int
 1285 al_pcie_pf_handle_init(
 1286         struct al_pcie_pf *pcie_pf,
 1287         struct al_pcie_port *pcie_port,
 1288         unsigned int pf_num)
 1289 {
 1290         enum al_pcie_operating_mode op_mode = al_pcie_operating_mode_get(pcie_port);
 1291         al_assert(pf_num < pcie_port->max_num_of_pfs);
 1292 
 1293         if (op_mode != AL_PCIE_OPERATING_MODE_EP) {
 1294                 al_err("PCIe %d: can't init PF handle with operating mode [%d]\n",
 1295                         pcie_port->port_id, op_mode);
 1296                 return -EINVAL;
 1297         }
 1298 
 1299         pcie_pf->pf_num = pf_num;
 1300         pcie_pf->pcie_port = pcie_port;
 1301 
 1302         al_dbg("PCIe %d: pf handle initialized. pf number: %d, rev_id %d, regs %p\n",
 1303                pcie_port->port_id, pcie_pf->pf_num, pcie_port->rev_id,
 1304                pcie_port->regs);
 1305         return 0;
 1306 }
 1307 
 1308 /** Get port revision ID */
 1309 int al_pcie_port_rev_id_get(struct al_pcie_port *pcie_port)
 1310 {
 1311         return pcie_port->rev_id;
 1312 }
 1313 
 1314 /************************** Pre PCIe Port Enable API **************************/
 1315 
 1316 /** configure pcie operating mode (root complex or endpoint) */
 1317 int
 1318 al_pcie_port_operating_mode_config(
 1319         struct al_pcie_port *pcie_port,
 1320         enum al_pcie_operating_mode mode)
 1321 {
 1322         struct al_pcie_regs *regs = pcie_port->regs;
 1323         uint32_t reg, device_type, new_device_type;
 1324 
 1325         if (al_pcie_port_is_enabled(pcie_port)) {
 1326                 al_err("PCIe %d: already enabled, cannot set operating mode\n",
 1327                         pcie_port->port_id);
 1328                 return -EINVAL;
 1329         }
 1330 
 1331         reg = al_reg_read32(regs->axi.pcie_global.conf);
 1332 
 1333         device_type = AL_REG_FIELD_GET(reg,
 1334                         PCIE_AXI_MISC_PCIE_GLOBAL_CONF_DEV_TYPE_MASK,
 1335                         PCIE_AXI_MISC_PCIE_GLOBAL_CONF_DEV_TYPE_SHIFT);
 1336         if (mode == AL_PCIE_OPERATING_MODE_EP) {
 1337                 new_device_type = PCIE_AXI_MISC_PCIE_GLOBAL_CONF_DEV_TYPE_EP;
 1338         } else if (mode == AL_PCIE_OPERATING_MODE_RC) {
 1339                 new_device_type = PCIE_AXI_MISC_PCIE_GLOBAL_CONF_DEV_TYPE_RC;
 1340 
 1341                 if (pcie_port->rev_id == AL_PCIE_REV_ID_3) {
 1342                         /* config 1 PF in RC mode */
 1343                         al_reg_write32_masked(regs->axi.axi_attr_ovrd.pf_sel,
 1344                                 PCIE_AXI_AXI_ATTR_OVRD_PF_SEL_PF_BIT0_OVRD_FROM_AXUSER |
 1345                                 PCIE_AXI_AXI_ATTR_OVRD_PF_SEL_PF_BIT0_OVRD_FROM_REG |
 1346                                 PCIE_AXI_AXI_ATTR_OVRD_PF_SEL_PF_BIT0_ADDR_OFFSET_MASK |
 1347                                 PCIE_AXI_AXI_ATTR_OVRD_PF_SEL_CFG_PF_BIT0_OVRD |
 1348                                 PCIE_AXI_AXI_ATTR_OVRD_PF_SEL_PF_BIT1_OVRD_FROM_AXUSER |
 1349                                 PCIE_AXI_AXI_ATTR_OVRD_PF_SEL_PF_BIT1_OVRD_FROM_REG |
 1350                                 PCIE_AXI_AXI_ATTR_OVRD_PF_SEL_PF_BIT1_ADDR_OFFSET_MASK |
 1351                                 PCIE_AXI_AXI_ATTR_OVRD_PF_SEL_CFG_PF_BIT1_OVRD,
 1352                                 PCIE_AXI_AXI_ATTR_OVRD_PF_SEL_PF_BIT0_OVRD_FROM_REG |
 1353                                 PCIE_AXI_AXI_ATTR_OVRD_PF_SEL_PF_BIT1_OVRD_FROM_REG);
 1354                 }
 1355         } else {
 1356                 al_err("PCIe %d: unknown operating mode: %d\n", pcie_port->port_id, mode);
 1357                 return -EINVAL;
 1358         }
 1359 
 1360         if (new_device_type == device_type) {
 1361                 al_dbg("PCIe %d: operating mode already set to %s\n",
 1362                        pcie_port->port_id, (mode == AL_PCIE_OPERATING_MODE_EP) ?
 1363                        "EndPoint" : "Root Complex");
 1364                 return 0;
 1365         }
 1366         al_dbg("PCIe %d: set operating mode to %s\n",
 1367                 pcie_port->port_id, (mode == AL_PCIE_OPERATING_MODE_EP) ?
 1368                 "EndPoint" : "Root Complex");
 1369         AL_REG_FIELD_SET(reg, PCIE_AXI_MISC_PCIE_GLOBAL_CONF_DEV_TYPE_MASK,
 1370                          PCIE_AXI_MISC_PCIE_GLOBAL_CONF_DEV_TYPE_SHIFT,
 1371                          new_device_type);
 1372 
 1373         al_reg_write32(regs->axi.pcie_global.conf, reg);
 1374 
 1375         return 0;
 1376 }
 1377 
 1378 int
 1379 al_pcie_port_max_lanes_set(struct al_pcie_port *pcie_port, uint8_t lanes)
 1380 {
 1381         struct al_pcie_regs *regs = pcie_port->regs;
 1382         uint32_t active_lanes_val;
 1383 
 1384         if (al_pcie_port_is_enabled(pcie_port)) {
 1385                 al_err("PCIe %d: already enabled, cannot set max lanes\n",
 1386                         pcie_port->port_id);
 1387                 return -EINVAL;
 1388         }
 1389 
 1390         /* convert to bitmask format (4 ->'b1111, 2 ->'b11, 1 -> 'b1) */
 1391         active_lanes_val = AL_PCIE_PARSE_LANES(lanes);
 1392 
 1393         al_reg_write32_masked(regs->axi.pcie_global.conf,
 1394                 (pcie_port->rev_id == AL_PCIE_REV_ID_3) ?
 1395                 PCIE_REV3_AXI_MISC_PCIE_GLOBAL_CONF_NOF_ACT_LANES_MASK :
 1396                 PCIE_REV1_2_AXI_MISC_PCIE_GLOBAL_CONF_NOF_ACT_LANES_MASK,
 1397                 active_lanes_val);
 1398 
 1399         pcie_port->max_lanes = lanes;
 1400         return 0;
 1401 }
 1402 
 1403 int
 1404 al_pcie_port_max_num_of_pfs_set(
 1405         struct al_pcie_port *pcie_port,
 1406         uint8_t max_num_of_pfs)
 1407 {
 1408         struct al_pcie_regs *regs = pcie_port->regs;
 1409 
 1410         if (pcie_port->rev_id == AL_PCIE_REV_ID_3)
 1411                 al_assert(max_num_of_pfs <= REV3_MAX_NUM_OF_PFS);
 1412         else
 1413                 al_assert(max_num_of_pfs == REV1_2_MAX_NUM_OF_PFS);
 1414 
 1415         pcie_port->max_num_of_pfs = max_num_of_pfs;
 1416 
 1417         if (al_pcie_port_is_enabled(pcie_port) && (pcie_port->rev_id == AL_PCIE_REV_ID_3)) {
 1418                 enum al_pcie_operating_mode op_mode = al_pcie_operating_mode_get(pcie_port);
 1419 
 1420                 al_bool is_multi_pf =
 1421                         ((op_mode == AL_PCIE_OPERATING_MODE_EP) && (pcie_port->max_num_of_pfs > 1));
 1422 
 1423                 /* Set maximum physical function numbers */
 1424                 al_reg_write32_masked(
 1425                         &regs->port_regs->timer_ctrl_max_func_num,
 1426                         PCIE_PORT_GEN3_MAX_FUNC_NUM,
 1427                         pcie_port->max_num_of_pfs - 1);
 1428 
 1429                 al_pcie_port_wr_to_ro_set(pcie_port, AL_TRUE);
 1430 
 1431                 /**
 1432                  * in EP mode, when we have more than 1 PF we need to assert
 1433                  * multi-pf support so the host scan all PFs
 1434                  */
 1435                 al_reg_write32_masked((uint32_t __iomem *)
 1436                         (&regs->core_space[0].config_header[0] +
 1437                         (PCIE_BIST_HEADER_TYPE_BASE >> 2)),
 1438                         PCIE_BIST_HEADER_TYPE_MULTI_FUNC_MASK,
 1439                         is_multi_pf ? PCIE_BIST_HEADER_TYPE_MULTI_FUNC_MASK : 0);
 1440 
 1441                 al_pcie_port_wr_to_ro_set(pcie_port, AL_FALSE);
 1442         }
 1443 
 1444         return 0;
 1445 }
 1446 
 1447 /* Inbound header credits and outstanding outbound reads configuration */
 1448 int
 1449 al_pcie_port_ib_hcrd_os_ob_reads_config(
 1450         struct al_pcie_port *pcie_port,
 1451         struct al_pcie_ib_hcrd_os_ob_reads_config *ib_hcrd_os_ob_reads_config)
 1452 {
 1453         struct al_pcie_regs *regs = pcie_port->regs;
 1454 
 1455         if (al_pcie_port_is_enabled(pcie_port)) {
 1456                 al_err("PCIe %d: already enabled, cannot configure IB credits and OB OS reads\n",
 1457                         pcie_port->port_id);
 1458                 return -EINVAL;
 1459         }
 1460 
 1461         al_assert(ib_hcrd_os_ob_reads_config->nof_np_hdr > 0);
 1462 
 1463         al_assert(ib_hcrd_os_ob_reads_config->nof_p_hdr > 0);
 1464 
 1465         al_assert(ib_hcrd_os_ob_reads_config->nof_cpl_hdr > 0);
 1466 
 1467         if (pcie_port->rev_id == AL_PCIE_REV_ID_3) {
 1468                 al_assert(
 1469                         (ib_hcrd_os_ob_reads_config->nof_cpl_hdr +
 1470                         ib_hcrd_os_ob_reads_config->nof_np_hdr +
 1471                         ib_hcrd_os_ob_reads_config->nof_p_hdr) ==
 1472                         AL_PCIE_REV3_IB_HCRD_SUM);
 1473 
 1474                 al_reg_write32_masked(
 1475                         regs->axi.init_fc.cfg,
 1476                         PCIE_AXI_REV3_INIT_FC_CFG_NOF_P_HDR_MASK |
 1477                         PCIE_AXI_REV3_INIT_FC_CFG_NOF_NP_HDR_MASK |
 1478                         PCIE_AXI_REV3_INIT_FC_CFG_NOF_CPL_HDR_MASK,
 1479                         (ib_hcrd_os_ob_reads_config->nof_p_hdr <<
 1480                          PCIE_AXI_REV3_INIT_FC_CFG_NOF_P_HDR_SHIFT) |
 1481                         (ib_hcrd_os_ob_reads_config->nof_np_hdr <<
 1482                          PCIE_AXI_REV3_INIT_FC_CFG_NOF_NP_HDR_SHIFT) |
 1483                         (ib_hcrd_os_ob_reads_config->nof_cpl_hdr <<
 1484                          PCIE_AXI_REV3_INIT_FC_CFG_NOF_CPL_HDR_SHIFT));
 1485         } else {
 1486                 al_assert(
 1487                         (ib_hcrd_os_ob_reads_config->nof_cpl_hdr +
 1488                         ib_hcrd_os_ob_reads_config->nof_np_hdr +
 1489                         ib_hcrd_os_ob_reads_config->nof_p_hdr) ==
 1490                         AL_PCIE_REV_1_2_IB_HCRD_SUM);
 1491 
 1492                 al_reg_write32_masked(
 1493                         regs->axi.init_fc.cfg,
 1494                         PCIE_AXI_REV1_2_INIT_FC_CFG_NOF_P_HDR_MASK |
 1495                         PCIE_AXI_REV1_2_INIT_FC_CFG_NOF_NP_HDR_MASK |
 1496                         PCIE_AXI_REV1_2_INIT_FC_CFG_NOF_CPL_HDR_MASK,
 1497                         (ib_hcrd_os_ob_reads_config->nof_p_hdr <<
 1498                          PCIE_AXI_REV1_2_INIT_FC_CFG_NOF_P_HDR_SHIFT) |
 1499                         (ib_hcrd_os_ob_reads_config->nof_np_hdr <<
 1500                          PCIE_AXI_REV1_2_INIT_FC_CFG_NOF_NP_HDR_SHIFT) |
 1501                         (ib_hcrd_os_ob_reads_config->nof_cpl_hdr <<
 1502                          PCIE_AXI_REV1_2_INIT_FC_CFG_NOF_CPL_HDR_SHIFT));
 1503         }
 1504 
 1505         al_reg_write32_masked(
 1506                 regs->axi.pre_configuration.pcie_core_setup,
 1507                 PCIE_AXI_CORE_SETUP_NOF_READS_ONSLAVE_INTRF_PCIE_CORE_MASK,
 1508                 ib_hcrd_os_ob_reads_config->nof_outstanding_ob_reads <<
 1509                 PCIE_AXI_CORE_SETUP_NOF_READS_ONSLAVE_INTRF_PCIE_CORE_SHIFT);
 1510 
 1511         /* Store 'nof_p_hdr' and 'nof_np_hdr' to be set in the core later */
 1512         pcie_port->ib_hcrd_config.nof_np_hdr =
 1513                 ib_hcrd_os_ob_reads_config->nof_np_hdr;
 1514         pcie_port->ib_hcrd_config.nof_p_hdr =
 1515                 ib_hcrd_os_ob_reads_config->nof_p_hdr;
 1516 
 1517         return 0;
 1518 }
 1519 
 1520 enum al_pcie_operating_mode
 1521 al_pcie_operating_mode_get(
 1522         struct al_pcie_port *pcie_port)
 1523 {
 1524         struct al_pcie_regs *regs = pcie_port->regs;
 1525         uint32_t reg, device_type;
 1526 
 1527         al_assert(pcie_port);
 1528 
 1529         reg = al_reg_read32(regs->axi.pcie_global.conf);
 1530 
 1531         device_type = AL_REG_FIELD_GET(reg,
 1532                         PCIE_AXI_MISC_PCIE_GLOBAL_CONF_DEV_TYPE_MASK,
 1533                         PCIE_AXI_MISC_PCIE_GLOBAL_CONF_DEV_TYPE_SHIFT);
 1534 
 1535         switch (device_type) {
 1536         case PCIE_AXI_MISC_PCIE_GLOBAL_CONF_DEV_TYPE_EP:
 1537                 return AL_PCIE_OPERATING_MODE_EP;
 1538         case PCIE_AXI_MISC_PCIE_GLOBAL_CONF_DEV_TYPE_RC:
 1539                 return AL_PCIE_OPERATING_MODE_RC;
 1540         default:
 1541                 al_err("PCIe %d: unknown device type (%d) in global conf register.\n",
 1542                         pcie_port->port_id, device_type);
 1543         }
 1544         return AL_PCIE_OPERATING_MODE_UNKNOWN;
 1545 }
 1546 
 1547 /* PCIe AXI quality of service configuration */
 1548 void al_pcie_axi_qos_config(
 1549         struct al_pcie_port     *pcie_port,
 1550         unsigned int            arqos,
 1551         unsigned int            awqos)
 1552 {
 1553         struct al_pcie_regs *regs = pcie_port->regs;
 1554 
 1555         al_assert(pcie_port);
 1556         al_assert(arqos <= PCIE_AXI_CTRL_MASTER_ARCTL_ARQOS_VAL_MAX);
 1557         al_assert(awqos <= PCIE_AXI_CTRL_MASTER_AWCTL_AWQOS_VAL_MAX);
 1558 
 1559         al_reg_write32_masked(
 1560                 regs->axi.ctrl.master_arctl,
 1561                 PCIE_AXI_CTRL_MASTER_ARCTL_ARQOS_MASK,
 1562                 arqos << PCIE_AXI_CTRL_MASTER_ARCTL_ARQOS_SHIFT);
 1563         al_reg_write32_masked(
 1564                 regs->axi.ctrl.master_awctl,
 1565                 PCIE_AXI_CTRL_MASTER_AWCTL_AWQOS_MASK,
 1566                 awqos << PCIE_AXI_CTRL_MASTER_AWCTL_AWQOS_SHIFT);
 1567 }
 1568 
 1569 /**************************** PCIe Port Enable API ****************************/
 1570 
 1571 /** Enable PCIe port (deassert reset) */
 1572 int
 1573 al_pcie_port_enable(struct al_pcie_port *pcie_port)
 1574 {
 1575         struct al_pbs_regs *pbs_reg_base =
 1576                                 (struct al_pbs_regs *)pcie_port->pbs_regs;
 1577         struct al_pcie_regs *regs = pcie_port->regs;
 1578         unsigned int port_id = pcie_port->port_id;
 1579 
 1580         /* pre-port-enable default functionality should be here */
 1581 
 1582         /**
 1583          * Set inbound header credit and outstanding outbound reads defaults
 1584          * if the port initiator doesn't set it.
 1585          * Must be called before port enable (PCIE_EXIST)
 1586          */
 1587         if ((pcie_port->ib_hcrd_config.nof_np_hdr == 0) ||
 1588                         (pcie_port->ib_hcrd_config.nof_p_hdr == 0))
 1589                 al_pcie_ib_hcrd_os_ob_reads_config_default(pcie_port);
 1590 
 1591         /*
 1592          * Disable ATS capability
 1593          * - must be done before core reset deasserted
 1594          * - rev_id 0 - no effect, but no harm
 1595          */
 1596         if ((pcie_port->rev_id == AL_PCIE_REV_ID_1) ||
 1597                 (pcie_port->rev_id == AL_PCIE_REV_ID_2)) {
 1598                 al_reg_write32_masked(
 1599                         regs->axi.ordering.pos_cntl,
 1600                         PCIE_AXI_CORE_SETUP_ATS_CAP_DIS,
 1601                         PCIE_AXI_CORE_SETUP_ATS_CAP_DIS);
 1602         }
 1603 
 1604         /* Deassert core reset */
 1605         al_reg_write32_masked(
 1606                 &pbs_reg_base->unit.pcie_conf_1,
 1607                 1 << (port_id + PBS_UNIT_PCIE_CONF_1_PCIE_EXIST_SHIFT),
 1608                 1 << (port_id + PBS_UNIT_PCIE_CONF_1_PCIE_EXIST_SHIFT));
 1609 
 1610         return 0;
 1611 }
 1612 
 1613 /** Disable PCIe port (assert reset) */
 1614 void
 1615 al_pcie_port_disable(struct al_pcie_port *pcie_port)
 1616 {
 1617         struct al_pbs_regs *pbs_reg_base =
 1618                                 (struct al_pbs_regs *)pcie_port->pbs_regs;
 1619         unsigned int port_id = pcie_port->port_id;
 1620 
 1621         if (!al_pcie_port_is_enabled(pcie_port)) {
 1622                 al_warn("PCIe %d: trying to disable a non-enabled port\n",
 1623                         pcie_port->port_id);
 1624         }
 1625 
 1626         /* Assert core reset */
 1627         al_reg_write32_masked(
 1628                 &pbs_reg_base->unit.pcie_conf_1,
 1629                 1 << (port_id + PBS_UNIT_PCIE_CONF_1_PCIE_EXIST_SHIFT),
 1630                 0);
 1631 }
 1632 
 1633 int
 1634 al_pcie_port_memory_shutdown_set(
 1635         struct al_pcie_port     *pcie_port,
 1636         al_bool                 enable)
 1637 {
 1638         struct al_pcie_regs *regs = pcie_port->regs;
 1639         uint32_t mask = (pcie_port->rev_id == AL_PCIE_REV_ID_3) ?
 1640                 PCIE_REV3_AXI_MISC_PCIE_GLOBAL_CONF_MEM_SHUTDOWN :
 1641                 PCIE_REV1_2_AXI_MISC_PCIE_GLOBAL_CONF_MEM_SHUTDOWN;
 1642 
 1643         if (!al_pcie_port_is_enabled(pcie_port)) {
 1644                 al_err("PCIe %d: not enabled, cannot shutdown memory\n",
 1645                         pcie_port->port_id);
 1646                 return -EINVAL;
 1647         }
 1648 
 1649         al_reg_write32_masked(regs->axi.pcie_global.conf,
 1650                 mask, enable == AL_TRUE ? mask : 0);
 1651 
 1652         return 0;
 1653 }
 1654 
 1655 al_bool
 1656 al_pcie_port_is_enabled(struct al_pcie_port *pcie_port)
 1657 {
 1658         struct al_pbs_regs *pbs_reg_base = (struct al_pbs_regs *)pcie_port->pbs_regs;
 1659         uint32_t pcie_exist = al_reg_read32(&pbs_reg_base->unit.pcie_conf_1);
 1660 
 1661         uint32_t ports_enabled = AL_REG_FIELD_GET(pcie_exist,
 1662                 PBS_UNIT_PCIE_CONF_1_PCIE_EXIST_MASK,
 1663                 PBS_UNIT_PCIE_CONF_1_PCIE_EXIST_SHIFT);
 1664 
 1665         return (AL_REG_FIELD_GET(ports_enabled, AL_BIT(pcie_port->port_id),
 1666                 pcie_port->port_id) == 1);
 1667 }
 1668 
 1669 /*************************** PCIe Configuration API ***************************/
 1670 
 1671 /** configure pcie port (link params, etc..) */
 1672 int
 1673 al_pcie_port_config(struct al_pcie_port *pcie_port,
 1674                         const struct al_pcie_port_config_params *params)
 1675 {
 1676         struct al_pcie_regs *regs = pcie_port->regs;
 1677         enum al_pcie_operating_mode op_mode;
 1678         int status = 0;
 1679         int i;
 1680 
 1681         if (!al_pcie_port_is_enabled(pcie_port)) {
 1682                 al_err("PCIe %d: port not enabled, cannot configure port\n",
 1683                         pcie_port->port_id);
 1684                 return -EINVAL;
 1685         }
 1686 
 1687         if (al_pcie_is_link_started(pcie_port)) {
 1688                 al_err("PCIe %d: link already started, cannot configure port\n",
 1689                         pcie_port->port_id);
 1690                 return -EINVAL;
 1691         }
 1692 
 1693         al_assert(pcie_port);
 1694         al_assert(params);
 1695 
 1696         al_dbg("PCIe %d: port config\n", pcie_port->port_id);
 1697 
 1698         op_mode = al_pcie_operating_mode_get(pcie_port);
 1699 
 1700         /* if max lanes not specifies, read it from register */
 1701         if (pcie_port->max_lanes == 0) {
 1702                 uint32_t global_conf = al_reg_read32(regs->axi.pcie_global.conf);
 1703                 uint32_t act_lanes = AL_REG_FIELD_GET(global_conf,
 1704                         (pcie_port->rev_id == AL_PCIE_REV_ID_3) ?
 1705                         PCIE_REV3_AXI_MISC_PCIE_GLOBAL_CONF_NOF_ACT_LANES_MASK :
 1706                         PCIE_REV1_2_AXI_MISC_PCIE_GLOBAL_CONF_NOF_ACT_LANES_MASK,
 1707                         PCIE_REVX_AXI_MISC_PCIE_GLOBAL_CONF_NOF_ACT_LANES_SHIFT);
 1708 
 1709                 switch(act_lanes) {
 1710                 case 0x1:
 1711                         pcie_port->max_lanes = 1;
 1712                         break;
 1713                 case 0x3:
 1714                         pcie_port->max_lanes = 2;
 1715                         break;
 1716                 case 0xf:
 1717                         pcie_port->max_lanes = 4;
 1718                         break;
 1719                 case 0xff:
 1720                         pcie_port->max_lanes = 8;
 1721                         break;
 1722                 default:
 1723                         pcie_port->max_lanes = 0;
 1724                         al_err("PCIe %d: invalid max lanes val (0x%x)\n", pcie_port->port_id, act_lanes);
 1725                         break;
 1726                 }
 1727         }
 1728 
 1729         if (params->link_params)
 1730                 status = al_pcie_port_link_config(pcie_port, params->link_params);
 1731         if (status)
 1732                 goto done;
 1733 
 1734         /* Change max read request size to 256 bytes
 1735          * Max Payload Size is remained untouched- it is the responsibility of
 1736          * the host to change the MPS, if needed.
 1737          */
 1738         for (i = 0; i < AL_MAX_NUM_OF_PFS; i++) {
 1739                 al_reg_write32_masked(regs->core_space[i].pcie_dev_ctrl_status,
 1740                         PCIE_PORT_DEV_CTRL_STATUS_MRRS_MASK,
 1741                         PCIE_PORT_DEV_CTRL_STATUS_MRRS_VAL_256);
 1742                 if (pcie_port->rev_id != AL_PCIE_REV_ID_3)
 1743                         break;
 1744         }
 1745 
 1746         if (pcie_port->rev_id == AL_PCIE_REV_ID_3) {
 1747                 al_pcie_port_wr_to_ro_set(pcie_port, AL_TRUE);
 1748 
 1749                 /* Disable TPH next pointer */
 1750                 for (i = 0; i < AL_MAX_NUM_OF_PFS; i++) {
 1751                         al_reg_write32_masked(regs->core_space[i].tph_cap_base,
 1752                         PCIE_TPH_NEXT_POINTER, 0);
 1753                 }
 1754 
 1755                 al_pcie_port_wr_to_ro_set(pcie_port, AL_FALSE);
 1756         }
 1757 
 1758 
 1759         status = al_pcie_port_snoop_config(pcie_port, params->enable_axi_snoop);
 1760         if (status)
 1761                 goto done;
 1762 
 1763         al_pcie_port_max_num_of_pfs_set(pcie_port, pcie_port->max_num_of_pfs);
 1764 
 1765         al_pcie_port_ram_parity_int_config(pcie_port, params->enable_ram_parity_int);
 1766 
 1767         al_pcie_port_axi_parity_int_config(pcie_port, params->enable_axi_parity_int);
 1768 
 1769         al_pcie_port_relaxed_pcie_ordering_config(pcie_port, params->relaxed_ordering_params);
 1770 
 1771         if (params->lat_rply_timers)
 1772                 status = al_pcie_port_lat_rply_timers_config(pcie_port, params->lat_rply_timers);
 1773         if (status)
 1774                 goto done;
 1775 
 1776         if (params->gen2_params)
 1777                 status = al_pcie_port_gen2_params_config(pcie_port, params->gen2_params);
 1778         if (status)
 1779                 goto done;
 1780 
 1781         if (params->gen3_params)
 1782                 status = al_pcie_port_gen3_params_config(pcie_port, params->gen3_params);
 1783         if (status)
 1784                 goto done;
 1785 
 1786         if (params->sris_params)
 1787                 status = al_pcie_port_sris_config(pcie_port, params->sris_params,
 1788                                                 params->link_params->max_speed);
 1789         if (status)
 1790                 goto done;
 1791 
 1792         al_pcie_port_ib_hcrd_config(pcie_port);
 1793 
 1794         if (params->fast_link_mode) {
 1795                 al_reg_write32_masked(&regs->port_regs->port_link_ctrl,
 1796                               1 << PCIE_PORT_LINK_CTRL_FAST_LINK_EN_SHIFT,
 1797                               1 << PCIE_PORT_LINK_CTRL_FAST_LINK_EN_SHIFT);
 1798         }
 1799 
 1800         if (params->enable_axi_slave_err_resp)
 1801                 al_reg_write32_masked(&regs->port_regs->axi_slave_err_resp,
 1802                                 1 << PCIE_PORT_AXI_SLAVE_ERR_RESP_ALL_MAPPING_SHIFT,
 1803                                 1 << PCIE_PORT_AXI_SLAVE_ERR_RESP_ALL_MAPPING_SHIFT);
 1804 
 1805         /**
 1806          * Addressing RMN: 5477
 1807          *
 1808          * RMN description:
 1809          * address-decoder logic performs sub-target decoding even for transactions
 1810          * which undergo target enforcement. thus, in case transaction's address is
 1811          * inside any ECAM bar, the sub-target decoding will be set to ECAM, which
 1812          * causes wrong handling by PCIe unit
 1813          *
 1814          * Software flow:
 1815          * on EP mode only, turning on the iATU-enable bit (with the relevant mask
 1816          * below) allows the PCIe unit to discard the ECAM bit which was asserted
 1817          * by-mistake in the address-decoder
 1818          */
 1819         if (op_mode == AL_PCIE_OPERATING_MODE_EP) {
 1820                 al_reg_write32_masked(regs->axi.ob_ctrl.cfg_target_bus,
 1821                         PCIE_AXI_MISC_OB_CTRL_CFG_TARGET_BUS_MASK_MASK,
 1822                         (0) << PCIE_AXI_MISC_OB_CTRL_CFG_TARGET_BUS_MASK_SHIFT);
 1823                 al_reg_write32_masked(regs->axi.ob_ctrl.cfg_control,
 1824                         PCIE_AXI_MISC_OB_CTRL_CFG_CONTROL_IATU_EN,
 1825                         PCIE_AXI_MISC_OB_CTRL_CFG_CONTROL_IATU_EN);
 1826         }
 1827 
 1828         if (op_mode == AL_PCIE_OPERATING_MODE_RC) {
 1829                 /**
 1830                  * enable memory and I/O access from port when in RC mode
 1831                  * in RC mode, only core_space[0] is valid.
 1832                  */
 1833                 al_reg_write16_masked(
 1834                         (uint16_t __iomem *)(&regs->core_space[0].config_header[0] + (0x4 >> 2)),
 1835                         0x7, /* Mem, MSE, IO */
 1836                         0x7);
 1837 
 1838                 /* change the class code to match pci bridge */
 1839                 al_pcie_port_wr_to_ro_set(pcie_port, AL_TRUE);
 1840 
 1841                 al_reg_write32_masked(
 1842                         (uint32_t __iomem *)(&regs->core_space[0].config_header[0]
 1843                         + (PCI_CLASS_REVISION >> 2)),
 1844                         0xFFFFFF00,
 1845                         0x06040000);
 1846 
 1847                 al_pcie_port_wr_to_ro_set(pcie_port, AL_FALSE);
 1848 
 1849                 /**
 1850                  * Addressing RMN: 5702
 1851                  *
 1852                  * RMN description:
 1853                  * target bus mask default value in HW is: 0xFE, this enforces
 1854                  * setting the target bus for ports 1 and 3 when running on RC
 1855                  * mode since bit[20] in ECAM address in these cases is set
 1856                  *
 1857                  * Software flow:
 1858                  * on RC mode only, set target-bus value to 0xFF to prevent this
 1859                  * enforcement
 1860                  */
 1861                 al_reg_write32_masked(regs->axi.ob_ctrl.cfg_target_bus,
 1862                         PCIE_AXI_MISC_OB_CTRL_CFG_TARGET_BUS_MASK_MASK,
 1863                         PCIE_AXI_MISC_OB_CTRL_CFG_TARGET_BUS_MASK_MASK);
 1864         }
 1865 done:
 1866         al_dbg("PCIe %d: port config %s\n", pcie_port->port_id, status? "failed": "done");
 1867 
 1868         return status;
 1869 }
 1870 
 1871 int
 1872 al_pcie_pf_config(
 1873         struct al_pcie_pf *pcie_pf,
 1874         const struct al_pcie_pf_config_params *params)
 1875 {
 1876         struct al_pcie_port *pcie_port;
 1877         int status = 0;
 1878 
 1879         al_assert(pcie_pf);
 1880         al_assert(params);
 1881 
 1882         pcie_port = pcie_pf->pcie_port;
 1883 
 1884         if (!al_pcie_port_is_enabled(pcie_port)) {
 1885                 al_err("PCIe %d: port not enabled, cannot configure port\n", pcie_port->port_id);
 1886                 return -EINVAL;
 1887         }
 1888 
 1889         al_dbg("PCIe %d: pf %d config\n", pcie_port->port_id, pcie_pf->pf_num);
 1890 
 1891         if (params)
 1892                 status = al_pcie_port_pf_params_config(pcie_pf, params);
 1893         if (status)
 1894                 goto done;
 1895 
 1896 done:
 1897         al_dbg("PCIe %d: pf %d config %s\n",
 1898                 pcie_port->port_id, pcie_pf->pf_num, status ? "failed" : "done");
 1899 
 1900         return status;
 1901 }
 1902 
 1903 /************************** PCIe Link Operations API **************************/
 1904 
 1905 /* start pcie link */
 1906 int
 1907 al_pcie_link_start(struct al_pcie_port *pcie_port)
 1908 {
 1909         struct al_pcie_regs *regs = (struct al_pcie_regs *)pcie_port->regs;
 1910 
 1911         if (!al_pcie_port_is_enabled(pcie_port)) {
 1912                 al_err("PCIe %d: port not enabled, cannot start link\n",
 1913                         pcie_port->port_id);
 1914                 return -EINVAL;
 1915         }
 1916 
 1917         al_dbg("PCIe_%d: start port link.\n", pcie_port->port_id);
 1918 
 1919         al_reg_write32_masked(
 1920                         regs->app.global_ctrl.port_init,
 1921                         PCIE_W_GLOBAL_CTRL_PORT_INIT_APP_LTSSM_EN_MASK,
 1922                         PCIE_W_GLOBAL_CTRL_PORT_INIT_APP_LTSSM_EN_MASK);
 1923 
 1924         return 0;
 1925 }
 1926 
 1927 /* stop pcie link */
 1928 int
 1929 al_pcie_link_stop(struct al_pcie_port *pcie_port)
 1930 {
 1931         struct al_pcie_regs *regs = (struct al_pcie_regs *)pcie_port->regs;
 1932 
 1933         if (!al_pcie_is_link_started(pcie_port)) {
 1934                 al_warn("PCIe %d: trying to stop a non-started link\n",
 1935                         pcie_port->port_id);
 1936         }
 1937 
 1938         al_dbg("PCIe_%d: stop port link.\n", pcie_port->port_id);
 1939 
 1940         al_reg_write32_masked(
 1941                         regs->app.global_ctrl.port_init,
 1942                         PCIE_W_GLOBAL_CTRL_PORT_INIT_APP_LTSSM_EN_MASK,
 1943                         ~PCIE_W_GLOBAL_CTRL_PORT_INIT_APP_LTSSM_EN_MASK);
 1944 
 1945         return 0;
 1946 }
 1947 
 1948 /** return AL_TRUE is link started (LTSSM enabled) and AL_FALSE otherwise */
 1949 al_bool al_pcie_is_link_started(struct al_pcie_port *pcie_port)
 1950 {
 1951         struct al_pcie_regs *regs = (struct al_pcie_regs *)pcie_port->regs;
 1952 
 1953         uint32_t port_init = al_reg_read32(regs->app.global_ctrl.port_init);
 1954         uint8_t ltssm_en = AL_REG_FIELD_GET(port_init,
 1955                 PCIE_W_GLOBAL_CTRL_PORT_INIT_APP_LTSSM_EN_MASK,
 1956                 PCIE_W_GLOBAL_CTRL_PORT_INIT_APP_LTSSM_EN_SHIFT);
 1957 
 1958         return ltssm_en;
 1959 }
 1960 
 1961 /* wait for link up indication */
 1962 int
 1963 al_pcie_link_up_wait(struct al_pcie_port *pcie_port, uint32_t timeout_ms)
 1964 {
 1965         int wait_count = timeout_ms * AL_PCIE_LINKUP_WAIT_INTERVALS_PER_SEC;
 1966 
 1967         while (wait_count-- > 0)        {
 1968                 if (al_pcie_check_link(pcie_port, NULL)) {
 1969                         al_dbg("PCIe_%d: <<<<<<<<< Link up >>>>>>>>>\n", pcie_port->port_id);
 1970                         return 0;
 1971                 } else
 1972                         al_dbg("PCIe_%d: No link up, %d attempts remaining\n",
 1973                                 pcie_port->port_id, wait_count);
 1974 
 1975                 al_udelay(AL_PCIE_LINKUP_WAIT_INTERVAL);
 1976         }
 1977         al_dbg("PCIE_%d: link is not established in time\n",
 1978                                 pcie_port->port_id);
 1979 
 1980         return ETIMEDOUT;
 1981 }
 1982 
 1983 /** get link status */
 1984 int
 1985 al_pcie_link_status(struct al_pcie_port *pcie_port,
 1986                         struct al_pcie_link_status *status)
 1987 {
 1988         struct al_pcie_regs *regs = pcie_port->regs;
 1989         uint16_t        pcie_lnksta;
 1990 
 1991         al_assert(status);
 1992 
 1993         if (!al_pcie_port_is_enabled(pcie_port)) {
 1994                 al_dbg("PCIe %d: port not enabled, no link.\n", pcie_port->port_id);
 1995                 status->link_up = AL_FALSE;
 1996                 status->speed = AL_PCIE_LINK_SPEED_DEFAULT;
 1997                 status->lanes = 0;
 1998                 status->ltssm_state = 0;
 1999                 return 0;
 2000         }
 2001 
 2002         status->link_up = al_pcie_check_link(pcie_port, &status->ltssm_state);
 2003 
 2004         if (!status->link_up) {
 2005                 status->speed = AL_PCIE_LINK_SPEED_DEFAULT;
 2006                 status->lanes = 0;
 2007                 return 0;
 2008         }
 2009 
 2010         pcie_lnksta = al_reg_read16((uint16_t __iomem *)regs->core_space[0].pcie_cap_base + (AL_PCI_EXP_LNKSTA >> 1));
 2011 
 2012         switch(pcie_lnksta & AL_PCI_EXP_LNKSTA_CLS) {
 2013                 case AL_PCI_EXP_LNKSTA_CLS_2_5GB:
 2014                         status->speed = AL_PCIE_LINK_SPEED_GEN1;
 2015                         break;
 2016                 case AL_PCI_EXP_LNKSTA_CLS_5_0GB:
 2017                         status->speed = AL_PCIE_LINK_SPEED_GEN2;
 2018                         break;
 2019                 case AL_PCI_EXP_LNKSTA_CLS_8_0GB:
 2020                         status->speed = AL_PCIE_LINK_SPEED_GEN3;
 2021                         break;
 2022                 default:
 2023                         status->speed = AL_PCIE_LINK_SPEED_DEFAULT;
 2024                         al_err("PCIe %d: unknown link speed indication. PCIE LINK STATUS %x\n",
 2025                                 pcie_port->port_id, pcie_lnksta);
 2026         }
 2027         status->lanes = (pcie_lnksta & AL_PCI_EXP_LNKSTA_NLW) >> AL_PCI_EXP_LNKSTA_NLW_SHIFT;
 2028         al_dbg("PCIe %d: Link up. speed gen%d negotiated width %d\n",
 2029                 pcie_port->port_id, status->speed, status->lanes);
 2030 
 2031         return 0;
 2032 }
 2033 
 2034 /** get lane status */
 2035 void
 2036 al_pcie_lane_status_get(
 2037         struct al_pcie_port             *pcie_port,
 2038         unsigned int                    lane,
 2039         struct al_pcie_lane_status      *status)
 2040 {
 2041         struct al_pcie_regs *regs = pcie_port->regs;
 2042         uint32_t lane_status;
 2043         uint32_t *reg_ptr;
 2044 
 2045         al_assert(pcie_port);
 2046         al_assert(status);
 2047         al_assert((pcie_port->rev_id != AL_PCIE_REV_ID_1) || (lane < REV1_2_MAX_NUM_LANES));
 2048         al_assert((pcie_port->rev_id != AL_PCIE_REV_ID_2) || (lane < REV1_2_MAX_NUM_LANES));
 2049         al_assert((pcie_port->rev_id != AL_PCIE_REV_ID_3) || (lane < REV3_MAX_NUM_LANES));
 2050 
 2051         reg_ptr = regs->axi.status.lane[lane];
 2052 
 2053         /* Reset field is valid only when same value is read twice */
 2054         do {
 2055                 lane_status = al_reg_read32(reg_ptr);
 2056                 status->is_reset = !!(lane_status & PCIE_AXI_STATUS_LANE_IS_RESET);
 2057         } while (status->is_reset != (!!(al_reg_read32(reg_ptr) & PCIE_AXI_STATUS_LANE_IS_RESET)));
 2058 
 2059         status->requested_speed =
 2060                 (lane_status & PCIE_AXI_STATUS_LANE_REQUESTED_SPEED_MASK) >>
 2061                 PCIE_AXI_STATUS_LANE_REQUESTED_SPEED_SHIFT;
 2062 }
 2063 
 2064 /** trigger hot reset */
 2065 int
 2066 al_pcie_link_hot_reset(struct al_pcie_port *pcie_port, al_bool enable)
 2067 {
 2068         struct al_pcie_regs *regs = pcie_port->regs;
 2069         uint32_t events_gen;
 2070         al_bool app_reset_state;
 2071         enum al_pcie_operating_mode op_mode = al_pcie_operating_mode_get(pcie_port);
 2072 
 2073         if (op_mode != AL_PCIE_OPERATING_MODE_RC) {
 2074                 al_err("PCIe %d: hot-reset is applicable only for RC mode\n", pcie_port->port_id);
 2075                 return -EINVAL;
 2076         }
 2077 
 2078         if (!al_pcie_is_link_started(pcie_port)) {
 2079                 al_err("PCIe %d: link not started, cannot trigger hot-reset\n", pcie_port->port_id);
 2080                 return -EINVAL;
 2081         }
 2082 
 2083         events_gen = al_reg_read32(regs->app.global_ctrl.events_gen[0]);
 2084         app_reset_state = events_gen & PCIE_W_GLOBAL_CTRL_EVENTS_GEN_APP_RST_INIT;
 2085 
 2086         if (enable && app_reset_state) {
 2087                 al_err("PCIe %d: link is already in hot-reset state\n", pcie_port->port_id);
 2088                 return -EINVAL;
 2089         } else if ((!enable) && (!(app_reset_state))) {
 2090                 al_err("PCIe %d: link is already in non-hot-reset state\n", pcie_port->port_id);
 2091                 return -EINVAL;
 2092         } else {
 2093                 al_dbg("PCIe %d: %s hot-reset\n", pcie_port->port_id,
 2094                         (enable ? "enabling" : "disabling"));
 2095                 /* hot-reset functionality is implemented only for function 0 */
 2096                 al_reg_write32_masked(regs->app.global_ctrl.events_gen[0],
 2097                         PCIE_W_GLOBAL_CTRL_EVENTS_GEN_APP_RST_INIT,
 2098                         (enable ? PCIE_W_GLOBAL_CTRL_EVENTS_GEN_APP_RST_INIT
 2099                                 : ~PCIE_W_GLOBAL_CTRL_EVENTS_GEN_APP_RST_INIT));
 2100                 return 0;
 2101         }
 2102 }
 2103 
 2104 /** disable port link */
 2105 int
 2106 al_pcie_link_disable(struct al_pcie_port *pcie_port, al_bool disable)
 2107 {
 2108         struct al_pcie_regs *regs = pcie_port->regs;
 2109         uint32_t pcie_lnkctl;
 2110         al_bool link_disable_state;
 2111         enum al_pcie_operating_mode op_mode = al_pcie_operating_mode_get(pcie_port);
 2112 
 2113         if (op_mode != AL_PCIE_OPERATING_MODE_RC) {
 2114                 al_err("PCIe %d: hot-reset is applicable only for RC mode\n", pcie_port->port_id);
 2115                 return -EINVAL;
 2116         }
 2117 
 2118         if (!al_pcie_is_link_started(pcie_port)) {
 2119                 al_err("PCIe %d: link not started, cannot disable link\n", pcie_port->port_id);
 2120                 return -EINVAL;
 2121         }
 2122 
 2123         pcie_lnkctl = al_reg_read32(regs->core_space[0].pcie_cap_base + (AL_PCI_EXP_LNKCTL >> 1));
 2124         link_disable_state = pcie_lnkctl & AL_PCI_EXP_LNKCTL_LNK_DIS;
 2125 
 2126         if (disable && link_disable_state) {
 2127                 al_err("PCIe %d: link is already in disable state\n", pcie_port->port_id);
 2128                 return -EINVAL;
 2129         } else if ((!disable) && (!(link_disable_state))) {
 2130                 al_err("PCIe %d: link is already in enable state\n", pcie_port->port_id);
 2131                 return -EINVAL;
 2132         }
 2133 
 2134         al_dbg("PCIe %d: %s port\n", pcie_port->port_id, (disable ? "disabling" : "enabling"));
 2135         al_reg_write32_masked(regs->core_space[0].pcie_cap_base + (AL_PCI_EXP_LNKCTL >> 1),
 2136                 AL_PCI_EXP_LNKCTL_LNK_DIS,
 2137                 (disable ? AL_PCI_EXP_LNKCTL_LNK_DIS : ~AL_PCI_EXP_LNKCTL_LNK_DIS));
 2138         return 0;
 2139 }
 2140 
 2141 /** retrain link */
 2142 int
 2143 al_pcie_link_retrain(struct al_pcie_port *pcie_port)
 2144 {
 2145         struct al_pcie_regs *regs = pcie_port->regs;
 2146         enum al_pcie_operating_mode op_mode = al_pcie_operating_mode_get(pcie_port);
 2147 
 2148         if (op_mode != AL_PCIE_OPERATING_MODE_RC) {
 2149                 al_err("PCIe %d: link-retrain is applicable only for RC mode\n",
 2150                         pcie_port->port_id);
 2151                 return -EINVAL;
 2152         }
 2153 
 2154         if (!al_pcie_is_link_started(pcie_port)) {
 2155                 al_err("PCIe %d: link not started, cannot link-retrain\n", pcie_port->port_id);
 2156                 return -EINVAL;
 2157         }
 2158 
 2159         al_reg_write32_masked(regs->core_space[0].pcie_cap_base + (AL_PCI_EXP_LNKCTL >> 1),
 2160         AL_PCI_EXP_LNKCTL_LNK_RTRN, AL_PCI_EXP_LNKCTL_LNK_RTRN);
 2161 
 2162         return 0;
 2163 }
 2164 
 2165 /* trigger speed change */
 2166 int
 2167 al_pcie_link_change_speed(struct al_pcie_port *pcie_port,
 2168                               enum al_pcie_link_speed new_speed)
 2169 {
 2170         struct al_pcie_regs *regs = pcie_port->regs;
 2171 
 2172         if (!al_pcie_is_link_started(pcie_port)) {
 2173                 al_err("PCIe %d: link not started, cannot change speed\n", pcie_port->port_id);
 2174                 return -EINVAL;
 2175         }
 2176 
 2177         al_dbg("PCIe %d: changing speed to %d\n", pcie_port->port_id, new_speed);
 2178 
 2179         al_pcie_port_link_speed_ctrl_set(pcie_port, new_speed);
 2180 
 2181         al_reg_write32_masked(&regs->port_regs->gen2_ctrl,
 2182                 PCIE_PORT_GEN2_CTRL_DIRECT_SPEED_CHANGE,
 2183                 PCIE_PORT_GEN2_CTRL_DIRECT_SPEED_CHANGE);
 2184 
 2185         return 0;
 2186 }
 2187 
 2188 /* TODO: check if this function needed */
 2189 int
 2190 al_pcie_link_change_width(struct al_pcie_port *pcie_port,
 2191                               uint8_t width __attribute__((__unused__)))
 2192 {
 2193         al_err("PCIe %d: link change width not implemented\n",
 2194                 pcie_port->port_id);
 2195 
 2196         return -ENOSYS;
 2197 }
 2198 
 2199 /**************************** Post Link Start API *****************************/
 2200 
 2201 /************************** Snoop Configuration API ***************************/
 2202 
 2203 int
 2204 al_pcie_port_snoop_config(struct al_pcie_port *pcie_port, al_bool enable_axi_snoop)
 2205 {
 2206         struct al_pcie_regs *regs = pcie_port->regs;
 2207 
 2208         /* Set snoop mode */
 2209         al_dbg("PCIE_%d: snoop mode %s\n",
 2210                         pcie_port->port_id, enable_axi_snoop ? "enable" : "disable");
 2211 
 2212         if (enable_axi_snoop) {
 2213                 al_reg_write32_masked(regs->axi.ctrl.master_arctl,
 2214                         PCIE_AXI_CTRL_MASTER_ARCTL_OVR_SNOOP | PCIE_AXI_CTRL_MASTER_ARCTL_SNOOP,
 2215                         PCIE_AXI_CTRL_MASTER_ARCTL_OVR_SNOOP | PCIE_AXI_CTRL_MASTER_ARCTL_SNOOP);
 2216 
 2217                 al_reg_write32_masked(regs->axi.ctrl.master_awctl,
 2218                         PCIE_AXI_CTRL_MASTER_AWCTL_OVR_SNOOP | PCIE_AXI_CTRL_MASTER_AWCTL_SNOOP,
 2219                         PCIE_AXI_CTRL_MASTER_AWCTL_OVR_SNOOP | PCIE_AXI_CTRL_MASTER_AWCTL_SNOOP);
 2220         } else {
 2221                 al_reg_write32_masked(regs->axi.ctrl.master_arctl,
 2222                         PCIE_AXI_CTRL_MASTER_ARCTL_OVR_SNOOP | PCIE_AXI_CTRL_MASTER_ARCTL_SNOOP,
 2223                         PCIE_AXI_CTRL_MASTER_ARCTL_OVR_SNOOP);
 2224 
 2225                 al_reg_write32_masked(regs->axi.ctrl.master_awctl,
 2226                         PCIE_AXI_CTRL_MASTER_AWCTL_OVR_SNOOP | PCIE_AXI_CTRL_MASTER_AWCTL_SNOOP,
 2227                         PCIE_AXI_CTRL_MASTER_AWCTL_OVR_SNOOP);
 2228         }
 2229         return 0;
 2230 }
 2231 
 2232 /************************** Configuration Space API ***************************/
 2233 
 2234 /** get base address of pci configuration space header */
 2235 int
 2236 al_pcie_config_space_get(struct al_pcie_pf *pcie_pf,
 2237                              uint8_t __iomem **addr)
 2238 {
 2239         struct al_pcie_regs *regs = pcie_pf->pcie_port->regs;
 2240 
 2241         *addr = (uint8_t __iomem *)&regs->core_space[pcie_pf->pf_num].config_header[0];
 2242         return 0;
 2243 }
 2244 
 2245 /* Read data from the local configuration space */
 2246 uint32_t
 2247 al_pcie_local_cfg_space_read(
 2248         struct al_pcie_pf       *pcie_pf,
 2249         unsigned int            reg_offset)
 2250 {
 2251         struct al_pcie_regs *regs = pcie_pf->pcie_port->regs;
 2252         uint32_t data;
 2253 
 2254         data = al_reg_read32(&regs->core_space[pcie_pf->pf_num].config_header[reg_offset]);
 2255 
 2256         return data;
 2257 }
 2258 
 2259 /* Write data to the local configuration space */
 2260 void
 2261 al_pcie_local_cfg_space_write(
 2262         struct al_pcie_pf       *pcie_pf,
 2263         unsigned int            reg_offset,
 2264         uint32_t                data,
 2265         al_bool                 cs2,
 2266         al_bool                 allow_ro_wr)
 2267 {
 2268         struct al_pcie_port *pcie_port = pcie_pf->pcie_port;
 2269         struct al_pcie_regs *regs = pcie_port->regs;
 2270         unsigned int pf_num = pcie_pf->pf_num;
 2271         uint32_t *offset = &regs->core_space[pf_num].config_header[reg_offset];
 2272 
 2273         if (allow_ro_wr)
 2274                 al_pcie_port_wr_to_ro_set(pcie_port, AL_TRUE);
 2275 
 2276         if (cs2 == AL_FALSE)
 2277                 al_reg_write32(offset, data);
 2278         else
 2279                 al_reg_write32_dbi_cs2(pcie_port, offset, data);
 2280 
 2281         if (allow_ro_wr)
 2282                 al_pcie_port_wr_to_ro_set(pcie_port, AL_FALSE);
 2283 }
 2284 
 2285 /** set target_bus and mask_target_bus */
 2286 int
 2287 al_pcie_target_bus_set(
 2288         struct al_pcie_port *pcie_port,
 2289         uint8_t target_bus,
 2290         uint8_t mask_target_bus)
 2291 {
 2292         struct al_pcie_regs *regs = (struct al_pcie_regs *)pcie_port->regs;
 2293         uint32_t reg;
 2294 
 2295         reg = al_reg_read32(regs->axi.ob_ctrl.cfg_target_bus);
 2296         AL_REG_FIELD_SET(reg, PCIE_AXI_MISC_OB_CTRL_CFG_TARGET_BUS_MASK_MASK,
 2297                         PCIE_AXI_MISC_OB_CTRL_CFG_TARGET_BUS_MASK_SHIFT,
 2298                         mask_target_bus);
 2299         AL_REG_FIELD_SET(reg, PCIE_AXI_MISC_OB_CTRL_CFG_TARGET_BUS_BUSNUM_MASK,
 2300                         PCIE_AXI_MISC_OB_CTRL_CFG_TARGET_BUS_BUSNUM_SHIFT,
 2301                         target_bus);
 2302         al_reg_write32(regs->axi.ob_ctrl.cfg_target_bus, reg);
 2303         return 0;
 2304 }
 2305 
 2306 /** get target_bus and mask_target_bus */
 2307 int
 2308 al_pcie_target_bus_get(
 2309         struct al_pcie_port *pcie_port,
 2310         uint8_t *target_bus,
 2311         uint8_t *mask_target_bus)
 2312 {
 2313         struct al_pcie_regs *regs = (struct al_pcie_regs *)pcie_port->regs;
 2314         uint32_t reg;
 2315 
 2316         al_assert(target_bus);
 2317         al_assert(mask_target_bus);
 2318 
 2319         reg = al_reg_read32(regs->axi.ob_ctrl.cfg_target_bus);
 2320 
 2321         *mask_target_bus = AL_REG_FIELD_GET(reg,
 2322                                 PCIE_AXI_MISC_OB_CTRL_CFG_TARGET_BUS_MASK_MASK,
 2323                                 PCIE_AXI_MISC_OB_CTRL_CFG_TARGET_BUS_MASK_SHIFT);
 2324         *target_bus = AL_REG_FIELD_GET(reg,
 2325                         PCIE_AXI_MISC_OB_CTRL_CFG_TARGET_BUS_BUSNUM_MASK,
 2326                         PCIE_AXI_MISC_OB_CTRL_CFG_TARGET_BUS_BUSNUM_SHIFT);
 2327         return 0;
 2328 }
 2329 
 2330 /** Set secondary bus number */
 2331 int
 2332 al_pcie_secondary_bus_set(struct al_pcie_port *pcie_port, uint8_t secbus)
 2333 {
 2334         struct al_pcie_regs *regs = pcie_port->regs;
 2335 
 2336         uint32_t secbus_val = (secbus <<
 2337                         PCIE_AXI_MISC_OB_CTRL_CFG_CONTROL_SEC_BUS_SHIFT);
 2338 
 2339         al_reg_write32_masked(
 2340                 regs->axi.ob_ctrl.cfg_control,
 2341                 PCIE_AXI_MISC_OB_CTRL_CFG_CONTROL_SEC_BUS_MASK,
 2342                 secbus_val);
 2343         return 0;
 2344 }
 2345 
 2346 /** Set sub-ordinary bus number */
 2347 int
 2348 al_pcie_subordinary_bus_set(struct al_pcie_port *pcie_port, uint8_t subbus)
 2349 {
 2350         struct al_pcie_regs *regs = pcie_port->regs;
 2351 
 2352         uint32_t subbus_val = (subbus <<
 2353                         PCIE_AXI_MISC_OB_CTRL_CFG_CONTROL_SUBBUS_SHIFT);
 2354 
 2355         al_reg_write32_masked(
 2356                 regs->axi.ob_ctrl.cfg_control,
 2357                 PCIE_AXI_MISC_OB_CTRL_CFG_CONTROL_SUBBUS_MASK,
 2358                 subbus_val);
 2359         return 0;
 2360 }
 2361 
 2362 /* Enable/disable deferring incoming configuration requests */
 2363 void
 2364 al_pcie_app_req_retry_set(
 2365         struct al_pcie_port     *pcie_port,
 2366         al_bool                 en)
 2367 {
 2368         struct al_pcie_regs *regs = pcie_port->regs;
 2369         uint32_t mask = (pcie_port->rev_id == AL_PCIE_REV_ID_3) ?
 2370                 PCIE_W_REV3_GLOBAL_CTRL_PM_CONTROL_APP_REQ_RETRY_EN :
 2371                 PCIE_W_REV1_2_GLOBAL_CTRL_PM_CONTROL_APP_REQ_RETRY_EN;
 2372 
 2373         al_reg_write32_masked(regs->app.global_ctrl.pm_control,
 2374                 mask, (en == AL_TRUE) ? mask : 0);
 2375 }
 2376 
 2377 /* Check if deferring incoming configuration requests is enabled or not */
 2378 al_bool al_pcie_app_req_retry_get_status(struct al_pcie_port    *pcie_port)
 2379 {
 2380         struct al_pcie_regs *regs = pcie_port->regs;
 2381         uint32_t pm_control;
 2382         uint32_t mask = (pcie_port->rev_id == AL_PCIE_REV_ID_3) ?
 2383                 PCIE_W_REV3_GLOBAL_CTRL_PM_CONTROL_APP_REQ_RETRY_EN :
 2384                 PCIE_W_REV1_2_GLOBAL_CTRL_PM_CONTROL_APP_REQ_RETRY_EN;
 2385 
 2386         pm_control = al_reg_read32(regs->app.global_ctrl.pm_control);
 2387         return (pm_control & mask) ? AL_TRUE : AL_FALSE;
 2388 }
 2389 
 2390 /*************** Internal Address Translation Unit (ATU) API ******************/
 2391 
 2392 /** program internal ATU region entry */
 2393 int
 2394 al_pcie_atu_region_set(
 2395         struct al_pcie_port *pcie_port,
 2396         struct al_pcie_atu_region *atu_region)
 2397 {
 2398         struct al_pcie_regs *regs = pcie_port->regs;
 2399         enum al_pcie_operating_mode op_mode = al_pcie_operating_mode_get(pcie_port);
 2400         uint32_t reg = 0;
 2401 
 2402         /**
 2403          * Addressing RMN: 5384
 2404          *
 2405          * RMN description:
 2406          * From SNPS (also included in the data book) Dynamic iATU Programming
 2407          * With AHB/AXI Bridge Module When the bridge slave interface clock
 2408          * (hresetn or slv_aclk) is asynchronous to the PCIe native core clock
 2409          * (core_clk), you must not update the iATU registers while operations
 2410          * are in progress on the AHB/AXI bridge slave interface. The iATU
 2411          * registers are in the core_clk clock domain. The register outputs are
 2412          * used in the AHB/AXI bridge slave interface clock domain. There is no
 2413          * synchronization logic between these registers and the AHB/AXI bridge
 2414          * slave interface.
 2415          *
 2416          * Software flow:
 2417          * Do not allow configuring Outbound iATU after link is started
 2418          */
 2419         if ((atu_region->direction == AL_PCIE_ATU_DIR_OUTBOUND)
 2420                 && (al_pcie_is_link_started(pcie_port))) {
 2421                 if (!atu_region->enforce_ob_atu_region_set) {
 2422                         al_err("PCIe %d: setting OB iATU after link is started is not allowed\n",
 2423                                 pcie_port->port_id);
 2424                         al_assert(AL_FALSE);
 2425                         return -EINVAL;
 2426                 } else {
 2427                         al_info("PCIe %d: setting OB iATU even after link is started\n",
 2428                                 pcie_port->port_id);
 2429                 }
 2430         }
 2431 
 2432         /*TODO : add sanity check */
 2433         AL_REG_FIELD_SET(reg, 0xF, 0, atu_region->index);
 2434         AL_REG_BIT_VAL_SET(reg, 31, atu_region->direction);
 2435         al_reg_write32(&regs->port_regs->iatu.index, reg);
 2436 
 2437         al_reg_write32(&regs->port_regs->iatu.lower_base_addr,
 2438                         (uint32_t)(atu_region->base_addr & 0xFFFFFFFF));
 2439         al_reg_write32(&regs->port_regs->iatu.upper_base_addr,
 2440                         (uint32_t)((atu_region->base_addr >> 32)& 0xFFFFFFFF));
 2441         al_reg_write32(&regs->port_regs->iatu.lower_target_addr,
 2442                         (uint32_t)(atu_region->target_addr & 0xFFFFFFFF));
 2443         al_reg_write32(&regs->port_regs->iatu.upper_target_addr,
 2444                         (uint32_t)((atu_region->target_addr >> 32)& 0xFFFFFFFF));
 2445 
 2446         /* configure the limit, not needed when working in BAR match mode */
 2447         if (atu_region->match_mode == 0) {
 2448                 uint32_t limit_reg_val;
 2449                 uint32_t *limit_ext_reg =
 2450                         (atu_region->direction == AL_PCIE_ATU_DIR_OUTBOUND) ?
 2451                         &regs->app.atu.out_mask_pair[atu_region->index / 2] :
 2452                         &regs->app.atu.in_mask_pair[atu_region->index / 2];
 2453                 uint32_t limit_ext_reg_mask =
 2454                         (atu_region->index % 2) ?
 2455                         PCIE_W_ATU_MASK_EVEN_ODD_ATU_MASK_40_32_ODD_MASK :
 2456                         PCIE_W_ATU_MASK_EVEN_ODD_ATU_MASK_40_32_EVEN_MASK;
 2457                 unsigned int limit_ext_reg_shift =
 2458                         (atu_region->index % 2) ?
 2459                         PCIE_W_ATU_MASK_EVEN_ODD_ATU_MASK_40_32_ODD_SHIFT :
 2460                         PCIE_W_ATU_MASK_EVEN_ODD_ATU_MASK_40_32_EVEN_SHIFT;
 2461                 uint64_t limit_sz_msk =
 2462                         atu_region->limit - atu_region->base_addr;
 2463                 uint32_t limit_ext_reg_val = (uint32_t)(((limit_sz_msk) >>
 2464                                         32) & 0xFFFFFFFF);
 2465 
 2466                 if (limit_ext_reg_val) {
 2467                         limit_reg_val = (uint32_t)((limit_sz_msk) & 0xFFFFFFFF);
 2468                         al_assert(limit_reg_val == 0xFFFFFFFF);
 2469                 } else {
 2470                         limit_reg_val = (uint32_t)(atu_region->limit &
 2471                                         0xFFFFFFFF);
 2472                 }
 2473 
 2474                 al_reg_write32_masked(
 2475                                 limit_ext_reg,
 2476                                 limit_ext_reg_mask,
 2477                                 limit_ext_reg_val << limit_ext_reg_shift);
 2478 
 2479                 al_reg_write32(&regs->port_regs->iatu.limit_addr,
 2480                                 limit_reg_val);
 2481         }
 2482 
 2483 
 2484         /**
 2485         * Addressing RMN: 3186
 2486         *
 2487         * RMN description:
 2488         * Bug in SNPS IP (versions 4.21 , 4.10a-ea02)
 2489         * In CFG request created via outbound atu (shift mode) bits [27:12] go to
 2490         * [31:16] , the shifting is correct , however the ATU leaves bit [15:12]
 2491         * to their original values, this is then transmited in the tlp .
 2492         * Those bits are currently reserved ,bit might be non-resv. in future generations .
 2493         *
 2494         * Software flow:
 2495         * Enable HW fix
 2496         * rev=REV1,REV2 set bit 15 in corresponding app_reg.atu.out_mask
 2497         * rev>REV2 set corresponding bit is app_reg.atu.reg_out_mask
 2498         */
 2499         if ((atu_region->cfg_shift_mode == AL_TRUE) &&
 2500                 (atu_region->direction == AL_PCIE_ATU_DIR_OUTBOUND)) {
 2501                 if (pcie_port->rev_id > AL_PCIE_REV_ID_2) {
 2502                         al_reg_write32_masked(regs->app.atu.reg_out_mask,
 2503                         1 << (atu_region->index) ,
 2504                         1 << (atu_region->index));
 2505                 } else {
 2506                         uint32_t *limit_ext_reg =
 2507                                 (atu_region->direction == AL_PCIE_ATU_DIR_OUTBOUND) ?
 2508                                 &regs->app.atu.out_mask_pair[atu_region->index / 2] :
 2509                                 &regs->app.atu.in_mask_pair[atu_region->index / 2];
 2510                         uint32_t limit_ext_reg_mask =
 2511                                 (atu_region->index % 2) ?
 2512                                 PCIE_W_ATU_MASK_EVEN_ODD_ATU_MASK_40_32_ODD_MASK :
 2513                                 PCIE_W_ATU_MASK_EVEN_ODD_ATU_MASK_40_32_EVEN_MASK;
 2514                         unsigned int limit_ext_reg_shift =
 2515                                 (atu_region->index % 2) ?
 2516                                 PCIE_W_ATU_MASK_EVEN_ODD_ATU_MASK_40_32_ODD_SHIFT :
 2517                                 PCIE_W_ATU_MASK_EVEN_ODD_ATU_MASK_40_32_EVEN_SHIFT;
 2518 
 2519                         al_reg_write32_masked(
 2520                                 limit_ext_reg,
 2521                                 limit_ext_reg_mask,
 2522                                 (AL_BIT(15)) << limit_ext_reg_shift);
 2523                 }
 2524         }
 2525 
 2526         reg = 0;
 2527         AL_REG_FIELD_SET(reg, 0x1F, 0, atu_region->tlp_type);
 2528         AL_REG_FIELD_SET(reg, 0x3 << 9, 9, atu_region->attr);
 2529 
 2530 
 2531         if ((pcie_port->rev_id == AL_PCIE_REV_ID_3)
 2532                 && (op_mode == AL_PCIE_OPERATING_MODE_EP)
 2533                 && (atu_region->function_match_bypass_mode)) {
 2534                 AL_REG_FIELD_SET(reg,
 2535                         PCIE_IATU_CR1_FUNC_NUM_MASK,
 2536                         PCIE_IATU_CR1_FUNC_NUM_SHIFT,
 2537                         atu_region->function_match_bypass_mode_number);
 2538         }
 2539 
 2540         al_reg_write32(&regs->port_regs->iatu.cr1, reg);
 2541 
 2542         /* Enable/disable the region. */
 2543         reg = 0;
 2544         AL_REG_FIELD_SET(reg, 0xFF, 0, atu_region->msg_code);
 2545         AL_REG_FIELD_SET(reg, 0x700, 8, atu_region->bar_number);
 2546         AL_REG_FIELD_SET(reg, 0x3 << 24, 24, atu_region->response);
 2547         AL_REG_BIT_VAL_SET(reg, 16, atu_region->enable_attr_match_mode == AL_TRUE);
 2548         AL_REG_BIT_VAL_SET(reg, 21, atu_region->enable_msg_match_mode == AL_TRUE);
 2549         AL_REG_BIT_VAL_SET(reg, 28, atu_region->cfg_shift_mode == AL_TRUE);
 2550         AL_REG_BIT_VAL_SET(reg, 29, atu_region->invert_matching == AL_TRUE);
 2551         if (atu_region->tlp_type == AL_PCIE_TLP_TYPE_MEM || atu_region->tlp_type == AL_PCIE_TLP_TYPE_IO)
 2552                 AL_REG_BIT_VAL_SET(reg, 30, !!atu_region->match_mode);
 2553         AL_REG_BIT_VAL_SET(reg, 31, !!atu_region->enable);
 2554 
 2555         /* In outbound, enable function bypass
 2556          * In inbound, enable function match mode
 2557          * Note: this is the same bit, has different meanings in ob/ib ATUs
 2558          */
 2559         if (op_mode == AL_PCIE_OPERATING_MODE_EP)
 2560                 AL_REG_FIELD_SET(reg,
 2561                         PCIE_IATU_CR2_FUNC_NUM_TRANS_BYPASS_FUNC_MATCH_ENABLE_MASK,
 2562                         PCIE_IATU_CR2_FUNC_NUM_TRANS_BYPASS_FUNC_MATCH_ENABLE_SHIFT,
 2563                         atu_region->function_match_bypass_mode ? 0x1 : 0x0);
 2564 
 2565         al_reg_write32(&regs->port_regs->iatu.cr2, reg);
 2566 
 2567         return 0;
 2568 }
 2569 
 2570 /** obtains internal ATU region base/target addresses */
 2571 void
 2572 al_pcie_atu_region_get_fields(
 2573         struct al_pcie_port *pcie_port,
 2574         enum al_pcie_atu_dir direction, uint8_t index,
 2575         al_bool *enable, uint64_t *base_addr, uint64_t *target_addr)
 2576 {
 2577         struct al_pcie_regs *regs = pcie_port->regs;
 2578         uint64_t high_addr;
 2579         uint32_t reg = 0;
 2580 
 2581         AL_REG_FIELD_SET(reg, 0xF, 0, index);
 2582         AL_REG_BIT_VAL_SET(reg, 31, direction);
 2583         al_reg_write32(&regs->port_regs->iatu.index, reg);
 2584 
 2585         *base_addr = al_reg_read32(&regs->port_regs->iatu.lower_base_addr);
 2586         high_addr = al_reg_read32(&regs->port_regs->iatu.upper_base_addr);
 2587         high_addr <<= 32;
 2588         *base_addr |= high_addr;
 2589 
 2590         *target_addr = al_reg_read32(&regs->port_regs->iatu.lower_target_addr);
 2591         high_addr = al_reg_read32(&regs->port_regs->iatu.upper_target_addr);
 2592         high_addr <<= 32;
 2593         *target_addr |= high_addr;
 2594 
 2595         reg = al_reg_read32(&regs->port_regs->iatu.cr1);
 2596         *enable = AL_REG_BIT_GET(reg, 31) ? AL_TRUE : AL_FALSE;
 2597 }
 2598 
 2599 void
 2600 al_pcie_axi_io_config(
 2601         struct al_pcie_port *pcie_port,
 2602         al_phys_addr_t start,
 2603         al_phys_addr_t end)
 2604 {
 2605         struct al_pcie_regs *regs = pcie_port->regs;
 2606 
 2607         al_reg_write32(regs->axi.ob_ctrl.io_start_h,
 2608                         (uint32_t)((start >> 32) & 0xFFFFFFFF));
 2609 
 2610         al_reg_write32(regs->axi.ob_ctrl.io_start_l,
 2611                         (uint32_t)(start & 0xFFFFFFFF));
 2612 
 2613         al_reg_write32(regs->axi.ob_ctrl.io_limit_h,
 2614                         (uint32_t)((end >> 32) & 0xFFFFFFFF));
 2615 
 2616         al_reg_write32(regs->axi.ob_ctrl.io_limit_l,
 2617                         (uint32_t)(end & 0xFFFFFFFF));
 2618 
 2619         al_reg_write32_masked(regs->axi.ctrl.slv_ctl,
 2620                               PCIE_AXI_CTRL_SLV_CTRL_IO_BAR_EN,
 2621                               PCIE_AXI_CTRL_SLV_CTRL_IO_BAR_EN);
 2622 }
 2623 
 2624 /************** Interrupt and Event generation (Endpoint mode Only) API *****************/
 2625 
 2626 int al_pcie_pf_flr_done_gen(struct al_pcie_pf           *pcie_pf)
 2627 {
 2628         struct al_pcie_regs *regs = pcie_pf->pcie_port->regs;
 2629         unsigned int pf_num = pcie_pf->pf_num;
 2630 
 2631         al_reg_write32_masked(regs->app.global_ctrl.events_gen[pf_num],
 2632                         PCIE_W_GLOBAL_CTRL_EVENTS_GEN_FLR_PF_DONE,
 2633                         PCIE_W_GLOBAL_CTRL_EVENTS_GEN_FLR_PF_DONE);
 2634         al_udelay(AL_PCIE_FLR_DONE_INTERVAL);
 2635         al_reg_write32_masked(regs->app.global_ctrl.events_gen[pf_num],
 2636                         PCIE_W_GLOBAL_CTRL_EVENTS_GEN_FLR_PF_DONE, 0);
 2637         return 0;
 2638 }
 2639 
 2640 
 2641 /** generate INTx Assert/DeAssert Message */
 2642 int
 2643 al_pcie_legacy_int_gen(
 2644         struct al_pcie_pf               *pcie_pf,
 2645         al_bool                         assert,
 2646         enum al_pcie_legacy_int_type    type)
 2647 {
 2648         struct al_pcie_regs *regs = pcie_pf->pcie_port->regs;
 2649         unsigned int pf_num = pcie_pf->pf_num;
 2650         uint32_t reg;
 2651 
 2652         al_assert(type == AL_PCIE_LEGACY_INTA); /* only INTA supported */
 2653         reg = al_reg_read32(regs->app.global_ctrl.events_gen[pf_num]);
 2654         AL_REG_BIT_VAL_SET(reg, 3, !!assert);
 2655         al_reg_write32(regs->app.global_ctrl.events_gen[pf_num], reg);
 2656 
 2657         return 0;
 2658 }
 2659 
 2660 /** generate MSI interrupt */
 2661 int
 2662 al_pcie_msi_int_gen(struct al_pcie_pf *pcie_pf, uint8_t vector)
 2663 {
 2664         struct al_pcie_regs *regs = pcie_pf->pcie_port->regs;
 2665         unsigned int pf_num = pcie_pf->pf_num;
 2666         uint32_t reg;
 2667 
 2668         /* set msi vector and clear MSI request */
 2669         reg = al_reg_read32(regs->app.global_ctrl.events_gen[pf_num]);
 2670         AL_REG_BIT_CLEAR(reg, 4);
 2671         AL_REG_FIELD_SET(reg,
 2672                         PCIE_W_GLOBAL_CTRL_EVENTS_GEN_MSI_VECTOR_MASK,
 2673                         PCIE_W_GLOBAL_CTRL_EVENTS_GEN_MSI_VECTOR_SHIFT,
 2674                         vector);
 2675         al_reg_write32(regs->app.global_ctrl.events_gen[pf_num], reg);
 2676         /* set MSI request */
 2677         AL_REG_BIT_SET(reg, 4);
 2678         al_reg_write32(regs->app.global_ctrl.events_gen[pf_num], reg);
 2679 
 2680         return 0;
 2681 }
 2682 
 2683 /** configure MSIX capability */
 2684 int
 2685 al_pcie_msix_config(
 2686         struct al_pcie_pf *pcie_pf,
 2687         struct al_pcie_msix_params *msix_params)
 2688 {
 2689         struct al_pcie_regs *regs = pcie_pf->pcie_port->regs;
 2690         unsigned int pf_num = pcie_pf->pf_num;
 2691         uint32_t msix_reg0;
 2692 
 2693         al_pcie_port_wr_to_ro_set(pcie_pf->pcie_port, AL_TRUE);
 2694 
 2695         msix_reg0 = al_reg_read32(regs->core_space[pf_num].msix_cap_base);
 2696 
 2697         msix_reg0 &= ~(AL_PCI_MSIX_MSGCTRL_TBL_SIZE << AL_PCI_MSIX_MSGCTRL_TBL_SIZE_SHIFT);
 2698         msix_reg0 |= ((msix_params->table_size - 1) & AL_PCI_MSIX_MSGCTRL_TBL_SIZE) <<
 2699                         AL_PCI_MSIX_MSGCTRL_TBL_SIZE_SHIFT;
 2700         al_reg_write32(regs->core_space[pf_num].msix_cap_base, msix_reg0);
 2701 
 2702         /* Table offset & BAR */
 2703         al_reg_write32(regs->core_space[pf_num].msix_cap_base + (AL_PCI_MSIX_TABLE >> 2),
 2704                        (msix_params->table_offset & AL_PCI_MSIX_TABLE_OFFSET) |
 2705                                (msix_params->table_bar & AL_PCI_MSIX_TABLE_BAR));
 2706         /* PBA offset & BAR */
 2707         al_reg_write32(regs->core_space[pf_num].msix_cap_base + (AL_PCI_MSIX_PBA >> 2),
 2708                        (msix_params->pba_offset & AL_PCI_MSIX_PBA_OFFSET) |
 2709                                (msix_params->pba_bar & AL_PCI_MSIX_PBA_BAR));
 2710 
 2711         al_pcie_port_wr_to_ro_set(pcie_pf->pcie_port, AL_FALSE);
 2712 
 2713         return 0;
 2714 }
 2715 
 2716 /** check whether MSIX is enabled */
 2717 al_bool
 2718 al_pcie_msix_enabled(struct al_pcie_pf  *pcie_pf)
 2719 {
 2720         struct al_pcie_regs *regs = pcie_pf->pcie_port->regs;
 2721         uint32_t msix_reg0 = al_reg_read32(regs->core_space[pcie_pf->pf_num].msix_cap_base);
 2722 
 2723         if (msix_reg0 & AL_PCI_MSIX_MSGCTRL_EN)
 2724                 return AL_TRUE;
 2725         return AL_FALSE;
 2726 }
 2727 
 2728 /** check whether MSIX is masked */
 2729 al_bool
 2730 al_pcie_msix_masked(struct al_pcie_pf *pcie_pf)
 2731 {
 2732         struct al_pcie_regs *regs = pcie_pf->pcie_port->regs;
 2733         uint32_t msix_reg0 = al_reg_read32(regs->core_space[pcie_pf->pf_num].msix_cap_base);
 2734 
 2735         if (msix_reg0 & AL_PCI_MSIX_MSGCTRL_MASK)
 2736                 return AL_TRUE;
 2737         return AL_FALSE;
 2738 }
 2739 
 2740 /******************** Advanced Error Reporting (AER) API **********************/
 2741 /************************* Auxiliary functions ********************************/
 2742 /* configure AER capability */
 2743 static int 
 2744 al_pcie_aer_config_aux(
 2745                 struct al_pcie_port             *pcie_port,
 2746                 unsigned int    pf_num,
 2747                 struct al_pcie_aer_params       *params)
 2748 {
 2749         struct al_pcie_regs *regs = pcie_port->regs;
 2750         struct al_pcie_core_aer_regs *aer_regs = regs->core_space[pf_num].aer;
 2751         uint32_t reg_val;
 2752 
 2753         reg_val = al_reg_read32(&aer_regs->header);
 2754 
 2755         if (((reg_val & PCIE_AER_CAP_ID_MASK) >> PCIE_AER_CAP_ID_SHIFT) !=
 2756                 PCIE_AER_CAP_ID_VAL)
 2757                 return -EIO;
 2758 
 2759         if (((reg_val & PCIE_AER_CAP_VER_MASK) >> PCIE_AER_CAP_VER_SHIFT) !=
 2760                 PCIE_AER_CAP_VER_VAL)
 2761                 return -EIO;
 2762 
 2763         al_reg_write32(&aer_regs->corr_err_mask, ~params->enabled_corr_err);
 2764 
 2765         al_reg_write32(&aer_regs->uncorr_err_mask,
 2766                 (~params->enabled_uncorr_non_fatal_err) |
 2767                 (~params->enabled_uncorr_fatal_err));
 2768 
 2769         al_reg_write32(&aer_regs->uncorr_err_severity,
 2770                 params->enabled_uncorr_fatal_err);
 2771 
 2772         al_reg_write32(&aer_regs->cap_and_ctrl,
 2773                 (params->ecrc_gen_en ? PCIE_AER_CTRL_STAT_ECRC_GEN_EN : 0) |
 2774                 (params->ecrc_chk_en ? PCIE_AER_CTRL_STAT_ECRC_CHK_EN : 0));
 2775 
 2776         /**
 2777          * Addressing RMN: 5119
 2778          *
 2779          * RMN description:
 2780          * ECRC generation for outbound request translated by iATU is effected
 2781          * by iATU setting instead of ecrc_gen_bit in AER
 2782          *
 2783          * Software flow:
 2784          * When enabling ECRC generation, set the outbound iATU to generate ECRC
 2785          */
 2786         if (params->ecrc_gen_en == AL_TRUE) {
 2787                 al_pcie_ecrc_gen_ob_atu_enable(pcie_port, pf_num);
 2788         }
 2789 
 2790         al_reg_write32_masked(
 2791                 regs->core_space[pf_num].pcie_dev_ctrl_status,
 2792                 PCIE_PORT_DEV_CTRL_STATUS_CORR_ERR_REPORT_EN |
 2793                 PCIE_PORT_DEV_CTRL_STATUS_NON_FTL_ERR_REPORT_EN |
 2794                 PCIE_PORT_DEV_CTRL_STATUS_FTL_ERR_REPORT_EN |
 2795                 PCIE_PORT_DEV_CTRL_STATUS_UNSUP_REQ_REPORT_EN,
 2796                 (params->enabled_corr_err ?
 2797                  PCIE_PORT_DEV_CTRL_STATUS_CORR_ERR_REPORT_EN : 0) |
 2798                 (params->enabled_uncorr_non_fatal_err ?
 2799                  PCIE_PORT_DEV_CTRL_STATUS_NON_FTL_ERR_REPORT_EN : 0) |
 2800                 (params->enabled_uncorr_fatal_err ?
 2801                  PCIE_PORT_DEV_CTRL_STATUS_FTL_ERR_REPORT_EN : 0) |
 2802                 ((params->enabled_uncorr_non_fatal_err &
 2803                   AL_PCIE_AER_UNCORR_UNSUPRT_REQ_ERR) ?
 2804                  PCIE_PORT_DEV_CTRL_STATUS_UNSUP_REQ_REPORT_EN : 0) |
 2805                 ((params->enabled_uncorr_fatal_err &
 2806                   AL_PCIE_AER_UNCORR_UNSUPRT_REQ_ERR) ?
 2807                  PCIE_PORT_DEV_CTRL_STATUS_UNSUP_REQ_REPORT_EN : 0));
 2808 
 2809         return 0;
 2810 }
 2811 
 2812 /** AER uncorrectable errors get and clear */
 2813 static unsigned int 
 2814 al_pcie_aer_uncorr_get_and_clear_aux(
 2815                 struct al_pcie_port             *pcie_port,
 2816                 unsigned int    pf_num)
 2817 {
 2818         struct al_pcie_regs *regs = pcie_port->regs;
 2819         struct al_pcie_core_aer_regs *aer_regs = regs->core_space[pf_num].aer;
 2820         uint32_t reg_val;
 2821 
 2822         reg_val = al_reg_read32(&aer_regs->uncorr_err_stat);
 2823         al_reg_write32(&aer_regs->uncorr_err_stat, reg_val);
 2824 
 2825         return reg_val;
 2826 }
 2827 
 2828 /** AER correctable errors get and clear */
 2829 static unsigned int 
 2830 al_pcie_aer_corr_get_and_clear_aux(
 2831                 struct al_pcie_port             *pcie_port,
 2832                 unsigned int    pf_num)
 2833 {
 2834         struct al_pcie_regs *regs = pcie_port->regs;
 2835         struct al_pcie_core_aer_regs *aer_regs = regs->core_space[pf_num].aer;
 2836         uint32_t reg_val;
 2837 
 2838         reg_val = al_reg_read32(&aer_regs->corr_err_stat);
 2839         al_reg_write32(&aer_regs->corr_err_stat, reg_val);
 2840 
 2841         return reg_val;
 2842 }
 2843 
 2844 #if (AL_PCIE_AER_ERR_TLP_HDR_NUM_DWORDS != 4)
 2845 #error Wrong assumption!
 2846 #endif
 2847 
 2848 /** AER get the header for the TLP corresponding to a detected error */
 2849 static void 
 2850 al_pcie_aer_err_tlp_hdr_get_aux(
 2851                 struct al_pcie_port             *pcie_port,
 2852                 unsigned int    pf_num,
 2853         uint32_t hdr[AL_PCIE_AER_ERR_TLP_HDR_NUM_DWORDS])
 2854 {
 2855         struct al_pcie_regs *regs = pcie_port->regs;
 2856         struct al_pcie_core_aer_regs *aer_regs = regs->core_space[pf_num].aer;
 2857         int i;
 2858 
 2859         for (i = 0; i < AL_PCIE_AER_ERR_TLP_HDR_NUM_DWORDS; i++)
 2860                 hdr[i] = al_reg_read32(&aer_regs->header_log[i]);
 2861 }
 2862 
 2863 /******************** EP AER functions **********************/
 2864 /** configure EP physical function AER capability */
 2865 int al_pcie_aer_config(
 2866                 struct al_pcie_pf *pcie_pf,
 2867                 struct al_pcie_aer_params       *params)
 2868 {
 2869         al_assert(pcie_pf);
 2870         al_assert(params);
 2871 
 2872         return al_pcie_aer_config_aux(
 2873                         pcie_pf->pcie_port, pcie_pf->pf_num, params);
 2874 }
 2875 
 2876 /** EP physical function AER uncorrectable errors get and clear */
 2877 unsigned int al_pcie_aer_uncorr_get_and_clear(struct al_pcie_pf *pcie_pf)
 2878 {
 2879         al_assert(pcie_pf);
 2880 
 2881         return al_pcie_aer_uncorr_get_and_clear_aux(
 2882                         pcie_pf->pcie_port, pcie_pf->pf_num);
 2883 }
 2884 
 2885 /** EP physical function AER correctable errors get and clear */
 2886 unsigned int al_pcie_aer_corr_get_and_clear(struct al_pcie_pf *pcie_pf)
 2887 {
 2888         al_assert(pcie_pf);
 2889 
 2890         return al_pcie_aer_corr_get_and_clear_aux(
 2891                         pcie_pf->pcie_port, pcie_pf->pf_num);
 2892 }
 2893 
 2894 /**
 2895  * EP physical function AER get the header for
 2896  * the TLP corresponding to a detected error
 2897  * */
 2898 void al_pcie_aer_err_tlp_hdr_get(
 2899                 struct al_pcie_pf *pcie_pf,
 2900                 uint32_t hdr[AL_PCIE_AER_ERR_TLP_HDR_NUM_DWORDS])
 2901 {
 2902         al_assert(pcie_pf);
 2903         al_assert(hdr);
 2904 
 2905         al_pcie_aer_err_tlp_hdr_get_aux(
 2906                         pcie_pf->pcie_port, pcie_pf->pf_num, hdr);
 2907 }
 2908 
 2909 /******************** RC AER functions **********************/
 2910 /** configure RC port AER capability */
 2911 int al_pcie_port_aer_config(
 2912                 struct al_pcie_port             *pcie_port,
 2913                 struct al_pcie_aer_params       *params)
 2914 {
 2915         al_assert(pcie_port);
 2916         al_assert(params);
 2917 
 2918         /**
 2919         * For RC mode there's no PFs (neither PF handles),
 2920         * therefore PF#0 is used
 2921         * */
 2922         return al_pcie_aer_config_aux(pcie_port, 0, params);
 2923 }
 2924 
 2925 /** RC port AER uncorrectable errors get and clear */
 2926 unsigned int al_pcie_port_aer_uncorr_get_and_clear(
 2927                 struct al_pcie_port             *pcie_port)
 2928 {
 2929         al_assert(pcie_port);
 2930 
 2931         /**
 2932         * For RC mode there's no PFs (neither PF handles),
 2933         * therefore PF#0 is used
 2934         * */
 2935         return al_pcie_aer_uncorr_get_and_clear_aux(pcie_port, 0);
 2936 }
 2937 
 2938 /** RC port AER correctable errors get and clear */
 2939 unsigned int al_pcie_port_aer_corr_get_and_clear(
 2940                 struct al_pcie_port             *pcie_port)
 2941 {
 2942         al_assert(pcie_port);
 2943 
 2944         /**
 2945         * For RC mode there's no PFs (neither PF handles),
 2946         * therefore PF#0 is used
 2947         * */
 2948         return al_pcie_aer_corr_get_and_clear_aux(pcie_port, 0);
 2949 }
 2950 
 2951 /** RC port AER get the header for the TLP corresponding to a detected error */
 2952 void al_pcie_port_aer_err_tlp_hdr_get(
 2953                 struct al_pcie_port             *pcie_port,
 2954                 uint32_t hdr[AL_PCIE_AER_ERR_TLP_HDR_NUM_DWORDS])
 2955 {
 2956         al_assert(pcie_port);
 2957         al_assert(hdr);
 2958 
 2959         /**
 2960         * For RC mode there's no PFs (neither PF handles),
 2961         * therefore PF#0 is used
 2962         * */
 2963         al_pcie_aer_err_tlp_hdr_get_aux(pcie_port, 0, hdr);
 2964 }
 2965 
 2966 /********************** Loopback mode (RC and Endpoint modes) ************/
 2967 
 2968 /** enter local pipe loopback mode */
 2969 int
 2970 al_pcie_local_pipe_loopback_enter(struct al_pcie_port *pcie_port)
 2971 {
 2972         struct al_pcie_regs *regs = pcie_port->regs;
 2973 
 2974         al_dbg("PCIe %d: Enter LOCAL PIPE Loopback mode", pcie_port->port_id);
 2975 
 2976         al_reg_write32_masked(&regs->port_regs->pipe_loopback_ctrl,
 2977                               1 << PCIE_PORT_PIPE_LOOPBACK_CTRL_PIPE_LB_EN_SHIFT,
 2978                               1 << PCIE_PORT_PIPE_LOOPBACK_CTRL_PIPE_LB_EN_SHIFT);
 2979 
 2980         al_reg_write32_masked(&regs->port_regs->port_link_ctrl,
 2981                               1 << PCIE_PORT_LINK_CTRL_LB_EN_SHIFT,
 2982                               1 << PCIE_PORT_LINK_CTRL_LB_EN_SHIFT);
 2983 
 2984         return 0;
 2985 }
 2986 
 2987 /**
 2988  * @brief exit local pipe loopback mode
 2989  *
 2990  * @param pcie_port     pcie port handle
 2991  * @return              0 if no error found
 2992  */
 2993 int
 2994 al_pcie_local_pipe_loopback_exit(struct al_pcie_port *pcie_port)
 2995 {
 2996         struct al_pcie_regs *regs = pcie_port->regs;
 2997 
 2998         al_dbg("PCIe %d: Exit LOCAL PIPE Loopback mode", pcie_port->port_id);
 2999 
 3000         al_reg_write32_masked(&regs->port_regs->pipe_loopback_ctrl,
 3001                               1 << PCIE_PORT_PIPE_LOOPBACK_CTRL_PIPE_LB_EN_SHIFT,
 3002                               0);
 3003 
 3004         al_reg_write32_masked(&regs->port_regs->port_link_ctrl,
 3005                               1 << PCIE_PORT_LINK_CTRL_LB_EN_SHIFT,
 3006                               0);
 3007         return 0;
 3008 }
 3009 
 3010 /** enter remote loopback mode */
 3011 int
 3012 al_pcie_remote_loopback_enter(struct al_pcie_port *pcie_port)
 3013 {
 3014         struct al_pcie_regs *regs = pcie_port->regs;
 3015 
 3016         al_dbg("PCIe %d: Enter REMOTE Loopback mode", pcie_port->port_id);
 3017 
 3018         al_reg_write32_masked(&regs->port_regs->port_link_ctrl,
 3019                               1 << PCIE_PORT_PIPE_LOOPBACK_CTRL_PIPE_LB_EN_SHIFT,
 3020                               1 << PCIE_PORT_PIPE_LOOPBACK_CTRL_PIPE_LB_EN_SHIFT);
 3021 
 3022         return 0;
 3023 }
 3024 
 3025 /**
 3026  * @brief   exit remote loopback mode
 3027  *
 3028  * @param   pcie_port pcie port handle
 3029  * @return  0 if no error found
 3030  */
 3031 int
 3032 al_pcie_remote_loopback_exit(struct al_pcie_port *pcie_port)
 3033 {
 3034         struct al_pcie_regs *regs = pcie_port->regs;
 3035 
 3036         al_dbg("PCIe %d: Exit REMOTE Loopback mode", pcie_port->port_id);
 3037 
 3038         al_reg_write32_masked(&regs->port_regs->port_link_ctrl,
 3039                               1 << PCIE_PORT_LINK_CTRL_LB_EN_SHIFT,
 3040                               0);
 3041         return 0;
 3042 }

Cache object: 7b48d88cc7fbd5f773829540113c52b0


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.