linux/drivers/pci/controller/dwc/pcie-designware-ep.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * Synopsys DesignWare PCIe Endpoint controller driver
   4 *
   5 * Copyright (C) 2017 Texas Instruments
   6 * Author: Kishon Vijay Abraham I <kishon@ti.com>
   7 */
   8
   9#include <linux/of.h>
  10#include <linux/platform_device.h>
  11
  12#include "pcie-designware.h"
  13#include <linux/pci-epc.h>
  14#include <linux/pci-epf.h>
  15
  16#include "../../pci.h"
  17
  18void dw_pcie_ep_linkup(struct dw_pcie_ep *ep)
  19{
  20        struct pci_epc *epc = ep->epc;
  21
  22        pci_epc_linkup(epc);
  23}
  24EXPORT_SYMBOL_GPL(dw_pcie_ep_linkup);
  25
  26void dw_pcie_ep_init_notify(struct dw_pcie_ep *ep)
  27{
  28        struct pci_epc *epc = ep->epc;
  29
  30        pci_epc_init_notify(epc);
  31}
  32EXPORT_SYMBOL_GPL(dw_pcie_ep_init_notify);
  33
  34struct dw_pcie_ep_func *
  35dw_pcie_ep_get_func_from_ep(struct dw_pcie_ep *ep, u8 func_no)
  36{
  37        struct dw_pcie_ep_func *ep_func;
  38
  39        list_for_each_entry(ep_func, &ep->func_list, list) {
  40                if (ep_func->func_no == func_no)
  41                        return ep_func;
  42        }
  43
  44        return NULL;
  45}
  46
  47static unsigned int dw_pcie_ep_func_select(struct dw_pcie_ep *ep, u8 func_no)
  48{
  49        unsigned int func_offset = 0;
  50
  51        if (ep->ops->func_conf_select)
  52                func_offset = ep->ops->func_conf_select(ep, func_no);
  53
  54        return func_offset;
  55}
  56
  57static void __dw_pcie_ep_reset_bar(struct dw_pcie *pci, u8 func_no,
  58                                   enum pci_barno bar, int flags)
  59{
  60        u32 reg;
  61        unsigned int func_offset = 0;
  62        struct dw_pcie_ep *ep = &pci->ep;
  63
  64        func_offset = dw_pcie_ep_func_select(ep, func_no);
  65
  66        reg = func_offset + PCI_BASE_ADDRESS_0 + (4 * bar);
  67        dw_pcie_dbi_ro_wr_en(pci);
  68        dw_pcie_writel_dbi2(pci, reg, 0x0);
  69        dw_pcie_writel_dbi(pci, reg, 0x0);
  70        if (flags & PCI_BASE_ADDRESS_MEM_TYPE_64) {
  71                dw_pcie_writel_dbi2(pci, reg + 4, 0x0);
  72                dw_pcie_writel_dbi(pci, reg + 4, 0x0);
  73        }
  74        dw_pcie_dbi_ro_wr_dis(pci);
  75}
  76
  77void dw_pcie_ep_reset_bar(struct dw_pcie *pci, enum pci_barno bar)
  78{
  79        u8 func_no, funcs;
  80
  81        funcs = pci->ep.epc->max_functions;
  82
  83        for (func_no = 0; func_no < funcs; func_no++)
  84                __dw_pcie_ep_reset_bar(pci, func_no, bar, 0);
  85}
  86
  87static u8 __dw_pcie_ep_find_next_cap(struct dw_pcie_ep *ep, u8 func_no,
  88                u8 cap_ptr, u8 cap)
  89{
  90        struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
  91        unsigned int func_offset = 0;
  92        u8 cap_id, next_cap_ptr;
  93        u16 reg;
  94
  95        if (!cap_ptr)
  96                return 0;
  97
  98        func_offset = dw_pcie_ep_func_select(ep, func_no);
  99
 100        reg = dw_pcie_readw_dbi(pci, func_offset + cap_ptr);
 101        cap_id = (reg & 0x00ff);
 102
 103        if (cap_id > PCI_CAP_ID_MAX)
 104                return 0;
 105
 106        if (cap_id == cap)
 107                return cap_ptr;
 108
 109        next_cap_ptr = (reg & 0xff00) >> 8;
 110        return __dw_pcie_ep_find_next_cap(ep, func_no, next_cap_ptr, cap);
 111}
 112
 113static u8 dw_pcie_ep_find_capability(struct dw_pcie_ep *ep, u8 func_no, u8 cap)
 114{
 115        struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
 116        unsigned int func_offset = 0;
 117        u8 next_cap_ptr;
 118        u16 reg;
 119
 120        func_offset = dw_pcie_ep_func_select(ep, func_no);
 121
 122        reg = dw_pcie_readw_dbi(pci, func_offset + PCI_CAPABILITY_LIST);
 123        next_cap_ptr = (reg & 0x00ff);
 124
 125        return __dw_pcie_ep_find_next_cap(ep, func_no, next_cap_ptr, cap);
 126}
 127
 128static int dw_pcie_ep_write_header(struct pci_epc *epc, u8 func_no,
 129                                   struct pci_epf_header *hdr)
 130{
 131        struct dw_pcie_ep *ep = epc_get_drvdata(epc);
 132        struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
 133        unsigned int func_offset = 0;
 134
 135        func_offset = dw_pcie_ep_func_select(ep, func_no);
 136
 137        dw_pcie_dbi_ro_wr_en(pci);
 138        dw_pcie_writew_dbi(pci, func_offset + PCI_VENDOR_ID, hdr->vendorid);
 139        dw_pcie_writew_dbi(pci, func_offset + PCI_DEVICE_ID, hdr->deviceid);
 140        dw_pcie_writeb_dbi(pci, func_offset + PCI_REVISION_ID, hdr->revid);
 141        dw_pcie_writeb_dbi(pci, func_offset + PCI_CLASS_PROG, hdr->progif_code);
 142        dw_pcie_writew_dbi(pci, func_offset + PCI_CLASS_DEVICE,
 143                           hdr->subclass_code | hdr->baseclass_code << 8);
 144        dw_pcie_writeb_dbi(pci, func_offset + PCI_CACHE_LINE_SIZE,
 145                           hdr->cache_line_size);
 146        dw_pcie_writew_dbi(pci, func_offset + PCI_SUBSYSTEM_VENDOR_ID,
 147                           hdr->subsys_vendor_id);
 148        dw_pcie_writew_dbi(pci, func_offset + PCI_SUBSYSTEM_ID, hdr->subsys_id);
 149        dw_pcie_writeb_dbi(pci, func_offset + PCI_INTERRUPT_PIN,
 150                           hdr->interrupt_pin);
 151        dw_pcie_dbi_ro_wr_dis(pci);
 152
 153        return 0;
 154}
 155
 156static int dw_pcie_ep_inbound_atu(struct dw_pcie_ep *ep, u8 func_no,
 157                                  enum pci_barno bar, dma_addr_t cpu_addr,
 158                                  enum dw_pcie_as_type as_type)
 159{
 160        int ret;
 161        u32 free_win;
 162        struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
 163
 164        free_win = find_first_zero_bit(ep->ib_window_map, pci->num_ib_windows);
 165        if (free_win >= pci->num_ib_windows) {
 166                dev_err(pci->dev, "No free inbound window\n");
 167                return -EINVAL;
 168        }
 169
 170        ret = dw_pcie_prog_inbound_atu(pci, func_no, free_win, bar, cpu_addr,
 171                                       as_type);
 172        if (ret < 0) {
 173                dev_err(pci->dev, "Failed to program IB window\n");
 174                return ret;
 175        }
 176
 177        ep->bar_to_atu[bar] = free_win;
 178        set_bit(free_win, ep->ib_window_map);
 179
 180        return 0;
 181}
 182
 183static int dw_pcie_ep_outbound_atu(struct dw_pcie_ep *ep, u8 func_no,
 184                                   phys_addr_t phys_addr,
 185                                   u64 pci_addr, size_t size)
 186{
 187        u32 free_win;
 188        struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
 189
 190        free_win = find_first_zero_bit(ep->ob_window_map, pci->num_ob_windows);
 191        if (free_win >= pci->num_ob_windows) {
 192                dev_err(pci->dev, "No free outbound window\n");
 193                return -EINVAL;
 194        }
 195
 196        dw_pcie_prog_ep_outbound_atu(pci, func_no, free_win, PCIE_ATU_TYPE_MEM,
 197                                     phys_addr, pci_addr, size);
 198
 199        set_bit(free_win, ep->ob_window_map);
 200        ep->outbound_addr[free_win] = phys_addr;
 201
 202        return 0;
 203}
 204
 205static void dw_pcie_ep_clear_bar(struct pci_epc *epc, u8 func_no,
 206                                 struct pci_epf_bar *epf_bar)
 207{
 208        struct dw_pcie_ep *ep = epc_get_drvdata(epc);
 209        struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
 210        enum pci_barno bar = epf_bar->barno;
 211        u32 atu_index = ep->bar_to_atu[bar];
 212
 213        __dw_pcie_ep_reset_bar(pci, func_no, bar, epf_bar->flags);
 214
 215        dw_pcie_disable_atu(pci, atu_index, DW_PCIE_REGION_INBOUND);
 216        clear_bit(atu_index, ep->ib_window_map);
 217        ep->epf_bar[bar] = NULL;
 218}
 219
 220static int dw_pcie_ep_set_bar(struct pci_epc *epc, u8 func_no,
 221                              struct pci_epf_bar *epf_bar)
 222{
 223        int ret;
 224        struct dw_pcie_ep *ep = epc_get_drvdata(epc);
 225        struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
 226        enum pci_barno bar = epf_bar->barno;
 227        size_t size = epf_bar->size;
 228        int flags = epf_bar->flags;
 229        enum dw_pcie_as_type as_type;
 230        u32 reg;
 231        unsigned int func_offset = 0;
 232
 233        func_offset = dw_pcie_ep_func_select(ep, func_no);
 234
 235        reg = PCI_BASE_ADDRESS_0 + (4 * bar) + func_offset;
 236
 237        if (!(flags & PCI_BASE_ADDRESS_SPACE))
 238                as_type = DW_PCIE_AS_MEM;
 239        else
 240                as_type = DW_PCIE_AS_IO;
 241
 242        ret = dw_pcie_ep_inbound_atu(ep, func_no, bar,
 243                                     epf_bar->phys_addr, as_type);
 244        if (ret)
 245                return ret;
 246
 247        dw_pcie_dbi_ro_wr_en(pci);
 248
 249        dw_pcie_writel_dbi2(pci, reg, lower_32_bits(size - 1));
 250        dw_pcie_writel_dbi(pci, reg, flags);
 251
 252        if (flags & PCI_BASE_ADDRESS_MEM_TYPE_64) {
 253                dw_pcie_writel_dbi2(pci, reg + 4, upper_32_bits(size - 1));
 254                dw_pcie_writel_dbi(pci, reg + 4, 0);
 255        }
 256
 257        ep->epf_bar[bar] = epf_bar;
 258        dw_pcie_dbi_ro_wr_dis(pci);
 259
 260        return 0;
 261}
 262
 263static int dw_pcie_find_index(struct dw_pcie_ep *ep, phys_addr_t addr,
 264                              u32 *atu_index)
 265{
 266        u32 index;
 267        struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
 268
 269        for (index = 0; index < pci->num_ob_windows; index++) {
 270                if (ep->outbound_addr[index] != addr)
 271                        continue;
 272                *atu_index = index;
 273                return 0;
 274        }
 275
 276        return -EINVAL;
 277}
 278
 279static void dw_pcie_ep_unmap_addr(struct pci_epc *epc, u8 func_no,
 280                                  phys_addr_t addr)
 281{
 282        int ret;
 283        u32 atu_index;
 284        struct dw_pcie_ep *ep = epc_get_drvdata(epc);
 285        struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
 286
 287        ret = dw_pcie_find_index(ep, addr, &atu_index);
 288        if (ret < 0)
 289                return;
 290
 291        dw_pcie_disable_atu(pci, atu_index, DW_PCIE_REGION_OUTBOUND);
 292        clear_bit(atu_index, ep->ob_window_map);
 293}
 294
 295static int dw_pcie_ep_map_addr(struct pci_epc *epc, u8 func_no,
 296                               phys_addr_t addr,
 297                               u64 pci_addr, size_t size)
 298{
 299        int ret;
 300        struct dw_pcie_ep *ep = epc_get_drvdata(epc);
 301        struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
 302
 303        ret = dw_pcie_ep_outbound_atu(ep, func_no, addr, pci_addr, size);
 304        if (ret) {
 305                dev_err(pci->dev, "Failed to enable address\n");
 306                return ret;
 307        }
 308
 309        return 0;
 310}
 311
 312static int dw_pcie_ep_get_msi(struct pci_epc *epc, u8 func_no)
 313{
 314        struct dw_pcie_ep *ep = epc_get_drvdata(epc);
 315        struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
 316        u32 val, reg;
 317        unsigned int func_offset = 0;
 318        struct dw_pcie_ep_func *ep_func;
 319
 320        ep_func = dw_pcie_ep_get_func_from_ep(ep, func_no);
 321        if (!ep_func || !ep_func->msi_cap)
 322                return -EINVAL;
 323
 324        func_offset = dw_pcie_ep_func_select(ep, func_no);
 325
 326        reg = ep_func->msi_cap + func_offset + PCI_MSI_FLAGS;
 327        val = dw_pcie_readw_dbi(pci, reg);
 328        if (!(val & PCI_MSI_FLAGS_ENABLE))
 329                return -EINVAL;
 330
 331        val = (val & PCI_MSI_FLAGS_QSIZE) >> 4;
 332
 333        return val;
 334}
 335
 336static int dw_pcie_ep_set_msi(struct pci_epc *epc, u8 func_no, u8 interrupts)
 337{
 338        struct dw_pcie_ep *ep = epc_get_drvdata(epc);
 339        struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
 340        u32 val, reg;
 341        unsigned int func_offset = 0;
 342        struct dw_pcie_ep_func *ep_func;
 343
 344        ep_func = dw_pcie_ep_get_func_from_ep(ep, func_no);
 345        if (!ep_func || !ep_func->msi_cap)
 346                return -EINVAL;
 347
 348        func_offset = dw_pcie_ep_func_select(ep, func_no);
 349
 350        reg = ep_func->msi_cap + func_offset + PCI_MSI_FLAGS;
 351        val = dw_pcie_readw_dbi(pci, reg);
 352        val &= ~PCI_MSI_FLAGS_QMASK;
 353        val |= (interrupts << 1) & PCI_MSI_FLAGS_QMASK;
 354        dw_pcie_dbi_ro_wr_en(pci);
 355        dw_pcie_writew_dbi(pci, reg, val);
 356        dw_pcie_dbi_ro_wr_dis(pci);
 357
 358        return 0;
 359}
 360
 361static int dw_pcie_ep_get_msix(struct pci_epc *epc, u8 func_no)
 362{
 363        struct dw_pcie_ep *ep = epc_get_drvdata(epc);
 364        struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
 365        u32 val, reg;
 366        unsigned int func_offset = 0;
 367        struct dw_pcie_ep_func *ep_func;
 368
 369        ep_func = dw_pcie_ep_get_func_from_ep(ep, func_no);
 370        if (!ep_func || !ep_func->msix_cap)
 371                return -EINVAL;
 372
 373        func_offset = dw_pcie_ep_func_select(ep, func_no);
 374
 375        reg = ep_func->msix_cap + func_offset + PCI_MSIX_FLAGS;
 376        val = dw_pcie_readw_dbi(pci, reg);
 377        if (!(val & PCI_MSIX_FLAGS_ENABLE))
 378                return -EINVAL;
 379
 380        val &= PCI_MSIX_FLAGS_QSIZE;
 381
 382        return val;
 383}
 384
 385static int dw_pcie_ep_set_msix(struct pci_epc *epc, u8 func_no, u16 interrupts,
 386                               enum pci_barno bir, u32 offset)
 387{
 388        struct dw_pcie_ep *ep = epc_get_drvdata(epc);
 389        struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
 390        u32 val, reg;
 391        unsigned int func_offset = 0;
 392        struct dw_pcie_ep_func *ep_func;
 393
 394        ep_func = dw_pcie_ep_get_func_from_ep(ep, func_no);
 395        if (!ep_func || !ep_func->msix_cap)
 396                return -EINVAL;
 397
 398        dw_pcie_dbi_ro_wr_en(pci);
 399
 400        func_offset = dw_pcie_ep_func_select(ep, func_no);
 401
 402        reg = ep_func->msix_cap + func_offset + PCI_MSIX_FLAGS;
 403        val = dw_pcie_readw_dbi(pci, reg);
 404        val &= ~PCI_MSIX_FLAGS_QSIZE;
 405        val |= interrupts;
 406        dw_pcie_writew_dbi(pci, reg, val);
 407
 408        reg = ep_func->msix_cap + func_offset + PCI_MSIX_TABLE;
 409        val = offset | bir;
 410        dw_pcie_writel_dbi(pci, reg, val);
 411
 412        reg = ep_func->msix_cap + func_offset + PCI_MSIX_PBA;
 413        val = (offset + (interrupts * PCI_MSIX_ENTRY_SIZE)) | bir;
 414        dw_pcie_writel_dbi(pci, reg, val);
 415
 416        dw_pcie_dbi_ro_wr_dis(pci);
 417
 418        return 0;
 419}
 420
 421static int dw_pcie_ep_raise_irq(struct pci_epc *epc, u8 func_no,
 422                                enum pci_epc_irq_type type, u16 interrupt_num)
 423{
 424        struct dw_pcie_ep *ep = epc_get_drvdata(epc);
 425
 426        if (!ep->ops->raise_irq)
 427                return -EINVAL;
 428
 429        return ep->ops->raise_irq(ep, func_no, type, interrupt_num);
 430}
 431
 432static void dw_pcie_ep_stop(struct pci_epc *epc)
 433{
 434        struct dw_pcie_ep *ep = epc_get_drvdata(epc);
 435        struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
 436
 437        if (pci->ops && pci->ops->stop_link)
 438                pci->ops->stop_link(pci);
 439}
 440
 441static int dw_pcie_ep_start(struct pci_epc *epc)
 442{
 443        struct dw_pcie_ep *ep = epc_get_drvdata(epc);
 444        struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
 445
 446        if (!pci->ops || !pci->ops->start_link)
 447                return -EINVAL;
 448
 449        return pci->ops->start_link(pci);
 450}
 451
 452static const struct pci_epc_features*
 453dw_pcie_ep_get_features(struct pci_epc *epc, u8 func_no)
 454{
 455        struct dw_pcie_ep *ep = epc_get_drvdata(epc);
 456
 457        if (!ep->ops->get_features)
 458                return NULL;
 459
 460        return ep->ops->get_features(ep);
 461}
 462
 463static const struct pci_epc_ops epc_ops = {
 464        .write_header           = dw_pcie_ep_write_header,
 465        .set_bar                = dw_pcie_ep_set_bar,
 466        .clear_bar              = dw_pcie_ep_clear_bar,
 467        .map_addr               = dw_pcie_ep_map_addr,
 468        .unmap_addr             = dw_pcie_ep_unmap_addr,
 469        .set_msi                = dw_pcie_ep_set_msi,
 470        .get_msi                = dw_pcie_ep_get_msi,
 471        .set_msix               = dw_pcie_ep_set_msix,
 472        .get_msix               = dw_pcie_ep_get_msix,
 473        .raise_irq              = dw_pcie_ep_raise_irq,
 474        .start                  = dw_pcie_ep_start,
 475        .stop                   = dw_pcie_ep_stop,
 476        .get_features           = dw_pcie_ep_get_features,
 477};
 478
 479int dw_pcie_ep_raise_legacy_irq(struct dw_pcie_ep *ep, u8 func_no)
 480{
 481        struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
 482        struct device *dev = pci->dev;
 483
 484        dev_err(dev, "EP cannot trigger legacy IRQs\n");
 485
 486        return -EINVAL;
 487}
 488
 489int dw_pcie_ep_raise_msi_irq(struct dw_pcie_ep *ep, u8 func_no,
 490                             u8 interrupt_num)
 491{
 492        struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
 493        struct dw_pcie_ep_func *ep_func;
 494        struct pci_epc *epc = ep->epc;
 495        unsigned int aligned_offset;
 496        unsigned int func_offset = 0;
 497        u16 msg_ctrl, msg_data;
 498        u32 msg_addr_lower, msg_addr_upper, reg;
 499        u64 msg_addr;
 500        bool has_upper;
 501        int ret;
 502
 503        ep_func = dw_pcie_ep_get_func_from_ep(ep, func_no);
 504        if (!ep_func || !ep_func->msi_cap)
 505                return -EINVAL;
 506
 507        func_offset = dw_pcie_ep_func_select(ep, func_no);
 508
 509        /* Raise MSI per the PCI Local Bus Specification Revision 3.0, 6.8.1. */
 510        reg = ep_func->msi_cap + func_offset + PCI_MSI_FLAGS;
 511        msg_ctrl = dw_pcie_readw_dbi(pci, reg);
 512        has_upper = !!(msg_ctrl & PCI_MSI_FLAGS_64BIT);
 513        reg = ep_func->msi_cap + func_offset + PCI_MSI_ADDRESS_LO;
 514        msg_addr_lower = dw_pcie_readl_dbi(pci, reg);
 515        if (has_upper) {
 516                reg = ep_func->msi_cap + func_offset + PCI_MSI_ADDRESS_HI;
 517                msg_addr_upper = dw_pcie_readl_dbi(pci, reg);
 518                reg = ep_func->msi_cap + func_offset + PCI_MSI_DATA_64;
 519                msg_data = dw_pcie_readw_dbi(pci, reg);
 520        } else {
 521                msg_addr_upper = 0;
 522                reg = ep_func->msi_cap + func_offset + PCI_MSI_DATA_32;
 523                msg_data = dw_pcie_readw_dbi(pci, reg);
 524        }
 525        aligned_offset = msg_addr_lower & (epc->mem->window.page_size - 1);
 526        msg_addr = ((u64)msg_addr_upper) << 32 |
 527                        (msg_addr_lower & ~aligned_offset);
 528        ret = dw_pcie_ep_map_addr(epc, func_no, ep->msi_mem_phys, msg_addr,
 529                                  epc->mem->window.page_size);
 530        if (ret)
 531                return ret;
 532
 533        writel(msg_data | (interrupt_num - 1), ep->msi_mem + aligned_offset);
 534
 535        dw_pcie_ep_unmap_addr(epc, func_no, ep->msi_mem_phys);
 536
 537        return 0;
 538}
 539
 540int dw_pcie_ep_raise_msix_irq_doorbell(struct dw_pcie_ep *ep, u8 func_no,
 541                                       u16 interrupt_num)
 542{
 543        struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
 544        struct dw_pcie_ep_func *ep_func;
 545        u32 msg_data;
 546
 547        ep_func = dw_pcie_ep_get_func_from_ep(ep, func_no);
 548        if (!ep_func || !ep_func->msix_cap)
 549                return -EINVAL;
 550
 551        msg_data = (func_no << PCIE_MSIX_DOORBELL_PF_SHIFT) |
 552                   (interrupt_num - 1);
 553
 554        dw_pcie_writel_dbi(pci, PCIE_MSIX_DOORBELL, msg_data);
 555
 556        return 0;
 557}
 558
 559int dw_pcie_ep_raise_msix_irq(struct dw_pcie_ep *ep, u8 func_no,
 560                              u16 interrupt_num)
 561{
 562        struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
 563        struct dw_pcie_ep_func *ep_func;
 564        struct pci_epf_msix_tbl *msix_tbl;
 565        struct pci_epc *epc = ep->epc;
 566        unsigned int func_offset = 0;
 567        u32 reg, msg_data, vec_ctrl;
 568        unsigned int aligned_offset;
 569        u32 tbl_offset;
 570        u64 msg_addr;
 571        int ret;
 572        u8 bir;
 573
 574        ep_func = dw_pcie_ep_get_func_from_ep(ep, func_no);
 575        if (!ep_func || !ep_func->msix_cap)
 576                return -EINVAL;
 577
 578        func_offset = dw_pcie_ep_func_select(ep, func_no);
 579
 580        reg = ep_func->msix_cap + func_offset + PCI_MSIX_TABLE;
 581        tbl_offset = dw_pcie_readl_dbi(pci, reg);
 582        bir = (tbl_offset & PCI_MSIX_TABLE_BIR);
 583        tbl_offset &= PCI_MSIX_TABLE_OFFSET;
 584
 585        msix_tbl = ep->epf_bar[bir]->addr + tbl_offset;
 586        msg_addr = msix_tbl[(interrupt_num - 1)].msg_addr;
 587        msg_data = msix_tbl[(interrupt_num - 1)].msg_data;
 588        vec_ctrl = msix_tbl[(interrupt_num - 1)].vector_ctrl;
 589
 590        if (vec_ctrl & PCI_MSIX_ENTRY_CTRL_MASKBIT) {
 591                dev_dbg(pci->dev, "MSI-X entry ctrl set\n");
 592                return -EPERM;
 593        }
 594
 595        aligned_offset = msg_addr & (epc->mem->window.page_size - 1);
 596        ret = dw_pcie_ep_map_addr(epc, func_no, ep->msi_mem_phys,  msg_addr,
 597                                  epc->mem->window.page_size);
 598        if (ret)
 599                return ret;
 600
 601        writel(msg_data, ep->msi_mem + aligned_offset);
 602
 603        dw_pcie_ep_unmap_addr(epc, func_no, ep->msi_mem_phys);
 604
 605        return 0;
 606}
 607
 608void dw_pcie_ep_exit(struct dw_pcie_ep *ep)
 609{
 610        struct pci_epc *epc = ep->epc;
 611
 612        pci_epc_mem_free_addr(epc, ep->msi_mem_phys, ep->msi_mem,
 613                              epc->mem->window.page_size);
 614
 615        pci_epc_mem_exit(epc);
 616}
 617
 618static unsigned int dw_pcie_ep_find_ext_capability(struct dw_pcie *pci, int cap)
 619{
 620        u32 header;
 621        int pos = PCI_CFG_SPACE_SIZE;
 622
 623        while (pos) {
 624                header = dw_pcie_readl_dbi(pci, pos);
 625                if (PCI_EXT_CAP_ID(header) == cap)
 626                        return pos;
 627
 628                pos = PCI_EXT_CAP_NEXT(header);
 629                if (!pos)
 630                        break;
 631        }
 632
 633        return 0;
 634}
 635
 636int dw_pcie_ep_init_complete(struct dw_pcie_ep *ep)
 637{
 638        struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
 639        unsigned int offset;
 640        unsigned int nbars;
 641        u8 hdr_type;
 642        u32 reg;
 643        int i;
 644
 645        hdr_type = dw_pcie_readb_dbi(pci, PCI_HEADER_TYPE) &
 646                   PCI_HEADER_TYPE_MASK;
 647        if (hdr_type != PCI_HEADER_TYPE_NORMAL) {
 648                dev_err(pci->dev,
 649                        "PCIe controller is not set to EP mode (hdr_type:0x%x)!\n",
 650                        hdr_type);
 651                return -EIO;
 652        }
 653
 654        offset = dw_pcie_ep_find_ext_capability(pci, PCI_EXT_CAP_ID_REBAR);
 655
 656        dw_pcie_dbi_ro_wr_en(pci);
 657
 658        if (offset) {
 659                reg = dw_pcie_readl_dbi(pci, offset + PCI_REBAR_CTRL);
 660                nbars = (reg & PCI_REBAR_CTRL_NBAR_MASK) >>
 661                        PCI_REBAR_CTRL_NBAR_SHIFT;
 662
 663                for (i = 0; i < nbars; i++, offset += PCI_REBAR_CTRL)
 664                        dw_pcie_writel_dbi(pci, offset + PCI_REBAR_CAP, 0x0);
 665        }
 666
 667        dw_pcie_setup(pci);
 668        dw_pcie_dbi_ro_wr_dis(pci);
 669
 670        return 0;
 671}
 672EXPORT_SYMBOL_GPL(dw_pcie_ep_init_complete);
 673
 674int dw_pcie_ep_init(struct dw_pcie_ep *ep)
 675{
 676        int ret;
 677        void *addr;
 678        u8 func_no;
 679        struct resource *res;
 680        struct pci_epc *epc;
 681        struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
 682        struct device *dev = pci->dev;
 683        struct platform_device *pdev = to_platform_device(dev);
 684        struct device_node *np = dev->of_node;
 685        const struct pci_epc_features *epc_features;
 686        struct dw_pcie_ep_func *ep_func;
 687
 688        INIT_LIST_HEAD(&ep->func_list);
 689
 690        if (!pci->dbi_base) {
 691                res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dbi");
 692                pci->dbi_base = devm_pci_remap_cfg_resource(dev, res);
 693                if (IS_ERR(pci->dbi_base))
 694                        return PTR_ERR(pci->dbi_base);
 695        }
 696
 697        if (!pci->dbi_base2) {
 698                res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dbi2");
 699                if (!res)
 700                        pci->dbi_base2 = pci->dbi_base + SZ_4K;
 701                else {
 702                        pci->dbi_base2 = devm_pci_remap_cfg_resource(dev, res);
 703                        if (IS_ERR(pci->dbi_base2))
 704                                return PTR_ERR(pci->dbi_base2);
 705                }
 706        }
 707
 708        dw_pcie_iatu_detect(pci);
 709
 710        res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "addr_space");
 711        if (!res)
 712                return -EINVAL;
 713
 714        ep->phys_base = res->start;
 715        ep->addr_size = resource_size(res);
 716
 717        ep->ib_window_map = devm_kcalloc(dev,
 718                                         BITS_TO_LONGS(pci->num_ib_windows),
 719                                         sizeof(long),
 720                                         GFP_KERNEL);
 721        if (!ep->ib_window_map)
 722                return -ENOMEM;
 723
 724        ep->ob_window_map = devm_kcalloc(dev,
 725                                         BITS_TO_LONGS(pci->num_ob_windows),
 726                                         sizeof(long),
 727                                         GFP_KERNEL);
 728        if (!ep->ob_window_map)
 729                return -ENOMEM;
 730
 731        addr = devm_kcalloc(dev, pci->num_ob_windows, sizeof(phys_addr_t),
 732                            GFP_KERNEL);
 733        if (!addr)
 734                return -ENOMEM;
 735        ep->outbound_addr = addr;
 736
 737        if (pci->link_gen < 1)
 738                pci->link_gen = of_pci_get_max_link_speed(np);
 739
 740        epc = devm_pci_epc_create(dev, &epc_ops);
 741        if (IS_ERR(epc)) {
 742                dev_err(dev, "Failed to create epc device\n");
 743                return PTR_ERR(epc);
 744        }
 745
 746        ep->epc = epc;
 747        epc_set_drvdata(epc, ep);
 748
 749        ret = of_property_read_u8(np, "max-functions", &epc->max_functions);
 750        if (ret < 0)
 751                epc->max_functions = 1;
 752
 753        for (func_no = 0; func_no < epc->max_functions; func_no++) {
 754                ep_func = devm_kzalloc(dev, sizeof(*ep_func), GFP_KERNEL);
 755                if (!ep_func)
 756                        return -ENOMEM;
 757
 758                ep_func->func_no = func_no;
 759                ep_func->msi_cap = dw_pcie_ep_find_capability(ep, func_no,
 760                                                              PCI_CAP_ID_MSI);
 761                ep_func->msix_cap = dw_pcie_ep_find_capability(ep, func_no,
 762                                                               PCI_CAP_ID_MSIX);
 763
 764                list_add_tail(&ep_func->list, &ep->func_list);
 765        }
 766
 767        if (ep->ops->ep_init)
 768                ep->ops->ep_init(ep);
 769
 770        ret = pci_epc_mem_init(epc, ep->phys_base, ep->addr_size,
 771                               ep->page_size);
 772        if (ret < 0) {
 773                dev_err(dev, "Failed to initialize address space\n");
 774                return ret;
 775        }
 776
 777        ep->msi_mem = pci_epc_mem_alloc_addr(epc, &ep->msi_mem_phys,
 778                                             epc->mem->window.page_size);
 779        if (!ep->msi_mem) {
 780                dev_err(dev, "Failed to reserve memory for MSI/MSI-X\n");
 781                return -ENOMEM;
 782        }
 783
 784        if (ep->ops->get_features) {
 785                epc_features = ep->ops->get_features(ep);
 786                if (epc_features->core_init_notifier)
 787                        return 0;
 788        }
 789
 790        return dw_pcie_ep_init_complete(ep);
 791}
 792EXPORT_SYMBOL_GPL(dw_pcie_ep_init);
 793