1// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) 2/* Copyright (C) 2015-2018 Netronome Systems, Inc. */ 3 4/* 5 * nfp6000_pcie.c 6 * Authors: Jakub Kicinski <jakub.kicinski@netronome.com> 7 * Jason McMullan <jason.mcmullan@netronome.com> 8 * Rolf Neugebauer <rolf.neugebauer@netronome.com> 9 * 10 * Multiplexes the NFP BARs between NFP internal resources and 11 * implements the PCIe specific interface for generic CPP bus access. 12 * 13 * The BARs are managed with refcounts and are allocated/acquired 14 * using target, token and offset/size matching. The generic CPP bus 15 * abstraction builds upon this BAR interface. 16 */ 17 18#include <asm/unaligned.h> 19#include <linux/kernel.h> 20#include <linux/module.h> 21#include <linux/kref.h> 22#include <linux/io.h> 23#include <linux/delay.h> 24#include <linux/interrupt.h> 25#include <linux/sort.h> 26#include <linux/sched.h> 27#include <linux/types.h> 28#include <linux/pci.h> 29 30#include "nfp_cpp.h" 31#include "nfp_dev.h" 32 33#include "nfp6000/nfp6000.h" 34 35#include "nfp6000_pcie.h" 36 37#define NFP_PCIE_BAR(_pf) (0x30000 + ((_pf) & 7) * 0xc0) 38#define NFP_PCIE_BAR_EXPLICIT_BAR0(_x, _y) \ 39 (0x00000080 + (0x40 * ((_x) & 0x3)) + (0x10 * ((_y) & 0x3))) 40#define NFP_PCIE_BAR_EXPLICIT_BAR0_SignalType(_x) (((_x) & 0x3) << 30) 41#define NFP_PCIE_BAR_EXPLICIT_BAR0_SignalType_of(_x) (((_x) >> 30) & 0x3) 42#define NFP_PCIE_BAR_EXPLICIT_BAR0_Token(_x) (((_x) & 0x3) << 28) 43#define NFP_PCIE_BAR_EXPLICIT_BAR0_Token_of(_x) (((_x) >> 28) & 0x3) 44#define NFP_PCIE_BAR_EXPLICIT_BAR0_Address(_x) (((_x) & 0xffffff) << 0) 45#define NFP_PCIE_BAR_EXPLICIT_BAR0_Address_of(_x) (((_x) >> 0) & 0xffffff) 46#define NFP_PCIE_BAR_EXPLICIT_BAR1(_x, _y) \ 47 (0x00000084 + (0x40 * ((_x) & 0x3)) + (0x10 * ((_y) & 0x3))) 48#define NFP_PCIE_BAR_EXPLICIT_BAR1_SignalRef(_x) (((_x) & 0x7f) << 24) 49#define NFP_PCIE_BAR_EXPLICIT_BAR1_SignalRef_of(_x) (((_x) >> 24) & 0x7f) 50#define NFP_PCIE_BAR_EXPLICIT_BAR1_DataMaster(_x) (((_x) & 0x3ff) << 14) 51#define NFP_PCIE_BAR_EXPLICIT_BAR1_DataMaster_of(_x) (((_x) >> 14) & 0x3ff) 52#define NFP_PCIE_BAR_EXPLICIT_BAR1_DataRef(_x) (((_x) & 0x3fff) << 0) 53#define NFP_PCIE_BAR_EXPLICIT_BAR1_DataRef_of(_x) (((_x) >> 0) & 0x3fff) 54#define NFP_PCIE_BAR_EXPLICIT_BAR2(_x, _y) \ 55 (0x00000088 + (0x40 * ((_x) & 0x3)) + (0x10 * ((_y) & 0x3))) 56#define NFP_PCIE_BAR_EXPLICIT_BAR2_Target(_x) (((_x) & 0xf) << 28) 57#define NFP_PCIE_BAR_EXPLICIT_BAR2_Target_of(_x) (((_x) >> 28) & 0xf) 58#define NFP_PCIE_BAR_EXPLICIT_BAR2_Action(_x) (((_x) & 0x1f) << 23) 59#define NFP_PCIE_BAR_EXPLICIT_BAR2_Action_of(_x) (((_x) >> 23) & 0x1f) 60#define NFP_PCIE_BAR_EXPLICIT_BAR2_Length(_x) (((_x) & 0x1f) << 18) 61#define NFP_PCIE_BAR_EXPLICIT_BAR2_Length_of(_x) (((_x) >> 18) & 0x1f) 62#define NFP_PCIE_BAR_EXPLICIT_BAR2_ByteMask(_x) (((_x) & 0xff) << 10) 63#define NFP_PCIE_BAR_EXPLICIT_BAR2_ByteMask_of(_x) (((_x) >> 10) & 0xff) 64#define NFP_PCIE_BAR_EXPLICIT_BAR2_SignalMaster(_x) (((_x) & 0x3ff) << 0) 65#define NFP_PCIE_BAR_EXPLICIT_BAR2_SignalMaster_of(_x) (((_x) >> 0) & 0x3ff) 66 67#define NFP_PCIE_BAR_PCIE2CPP_Action_BaseAddress(_x) (((_x) & 0x1f) << 16) 68#define NFP_PCIE_BAR_PCIE2CPP_Action_BaseAddress_of(_x) (((_x) >> 16) & 0x1f) 69#define NFP_PCIE_BAR_PCIE2CPP_BaseAddress(_x) (((_x) & 0xffff) << 0) 70#define NFP_PCIE_BAR_PCIE2CPP_BaseAddress_of(_x) (((_x) >> 0) & 0xffff) 71#define NFP_PCIE_BAR_PCIE2CPP_LengthSelect(_x) (((_x) & 0x3) << 27) 72#define NFP_PCIE_BAR_PCIE2CPP_LengthSelect_of(_x) (((_x) >> 27) & 0x3) 73#define NFP_PCIE_BAR_PCIE2CPP_LengthSelect_32BIT 0 74#define NFP_PCIE_BAR_PCIE2CPP_LengthSelect_64BIT 1 75#define NFP_PCIE_BAR_PCIE2CPP_LengthSelect_0BYTE 3 76#define NFP_PCIE_BAR_PCIE2CPP_MapType(_x) (((_x) & 0x7) << 29) 77#define NFP_PCIE_BAR_PCIE2CPP_MapType_of(_x) (((_x) >> 29) & 0x7) 78#define NFP_PCIE_BAR_PCIE2CPP_MapType_FIXED 0 79#define NFP_PCIE_BAR_PCIE2CPP_MapType_BULK 1 80#define NFP_PCIE_BAR_PCIE2CPP_MapType_TARGET 2 81#define NFP_PCIE_BAR_PCIE2CPP_MapType_GENERAL 3 82#define NFP_PCIE_BAR_PCIE2CPP_MapType_EXPLICIT0 4 83#define NFP_PCIE_BAR_PCIE2CPP_MapType_EXPLICIT1 5 84#define NFP_PCIE_BAR_PCIE2CPP_MapType_EXPLICIT2 6 85#define NFP_PCIE_BAR_PCIE2CPP_MapType_EXPLICIT3 7 86#define NFP_PCIE_BAR_PCIE2CPP_Target_BaseAddress(_x) (((_x) & 0xf) << 23) 87#define NFP_PCIE_BAR_PCIE2CPP_Target_BaseAddress_of(_x) (((_x) >> 23) & 0xf) 88#define NFP_PCIE_BAR_PCIE2CPP_Token_BaseAddress(_x) (((_x) & 0x3) << 21) 89#define NFP_PCIE_BAR_PCIE2CPP_Token_BaseAddress_of(_x) (((_x) >> 21) & 0x3) 90#define NFP_PCIE_EM 0x020000 91#define NFP_PCIE_SRAM 0x000000 92 93/* Minimal size of the PCIe cfg memory we depend on being mapped, 94 * queue controller and DMA controller don't have to be covered. 95 */ 96#define NFP_PCI_MIN_MAP_SIZE 0x080000 97 98#define NFP_PCIE_P2C_FIXED_SIZE(bar) (1 << (bar)->bitsize) 99#define NFP_PCIE_P2C_BULK_SIZE(bar) (1 << (bar)->bitsize) 100#define NFP_PCIE_P2C_GENERAL_TARGET_OFFSET(bar, x) ((x) << ((bar)->bitsize - 2)) 101#define NFP_PCIE_P2C_GENERAL_TOKEN_OFFSET(bar, x) ((x) << ((bar)->bitsize - 4)) 102#define NFP_PCIE_P2C_GENERAL_SIZE(bar) (1 << ((bar)->bitsize - 4)) 103 104#define NFP_PCIE_P2C_EXPBAR_OFFSET(bar_index) ((bar_index) * 4) 105 106/* The number of explicit BARs to reserve. 107 * Minimum is 0, maximum is 4 on the NFP6000. 108 * The NFP3800 can have only one per PF. 109 */ 110#define NFP_PCIE_EXPLICIT_BARS 2 111 112struct nfp6000_pcie; 113struct nfp6000_area_priv; 114 115/** 116 * struct nfp_bar - describes BAR configuration and usage 117 * @nfp: backlink to owner 118 * @barcfg: cached contents of BAR config CSR 119 * @base: the BAR's base CPP offset 120 * @mask: mask for the BAR aperture (read only) 121 * @bitsize: bitsize of BAR aperture (read only) 122 * @index: index of the BAR 123 * @refcnt: number of current users 124 * @iomem: mapped IO memory 125 * @resource: iomem resource window 126 */ 127struct nfp_bar { 128 struct nfp6000_pcie *nfp; 129 u32 barcfg; 130 u64 base; /* CPP address base */ 131 u64 mask; /* Bit mask of the bar */ 132 u32 bitsize; /* Bit size of the bar */ 133 int index; 134 atomic_t refcnt; 135 136 void __iomem *iomem; 137 struct resource *resource; 138}; 139 140#define NFP_PCI_BAR_MAX (PCI_64BIT_BAR_COUNT * 8) 141 142struct nfp6000_pcie { 143 struct pci_dev *pdev; 144 struct device *dev; 145 const struct nfp_dev_info *dev_info; 146 147 /* PCI BAR management */ 148 spinlock_t bar_lock; /* Protect the PCI2CPP BAR cache */ 149 int bars; 150 struct nfp_bar bar[NFP_PCI_BAR_MAX]; 151 wait_queue_head_t bar_waiters; 152 153 /* Reserved BAR access */ 154 struct { 155 void __iomem *csr; 156 void __iomem *em; 157 void __iomem *expl[4]; 158 } iomem; 159 160 /* Explicit IO access */ 161 struct { 162 struct mutex mutex; /* Lock access to this explicit group */ 163 u8 master_id; 164 u8 signal_ref; 165 void __iomem *data; 166 struct { 167 void __iomem *addr; 168 int bitsize; 169 int free[4]; 170 } group[4]; 171 } expl; 172}; 173 174static u32 nfp_bar_maptype(struct nfp_bar *bar) 175{ 176 return NFP_PCIE_BAR_PCIE2CPP_MapType_of(bar->barcfg); 177} 178 179static resource_size_t nfp_bar_resource_len(struct nfp_bar *bar) 180{ 181 return pci_resource_len(bar->nfp->pdev, (bar->index / 8) * 2) / 8; 182} 183 184static resource_size_t nfp_bar_resource_start(struct nfp_bar *bar) 185{ 186 return pci_resource_start(bar->nfp->pdev, (bar->index / 8) * 2) 187 + nfp_bar_resource_len(bar) * (bar->index & 7); 188} 189 190#define TARGET_WIDTH_32 4 191#define TARGET_WIDTH_64 8 192 193static int 194compute_bar(const struct nfp6000_pcie *nfp, const struct nfp_bar *bar, 195 u32 *bar_config, u64 *bar_base, 196 int tgt, int act, int tok, u64 offset, size_t size, int width) 197{ 198 int bitsize; 199 u32 newcfg; 200 201 if (tgt >= NFP_CPP_NUM_TARGETS) 202 return -EINVAL; 203 204 switch (width) { 205 case 8: 206 newcfg = NFP_PCIE_BAR_PCIE2CPP_LengthSelect( 207 NFP_PCIE_BAR_PCIE2CPP_LengthSelect_64BIT); 208 break; 209 case 4: 210 newcfg = NFP_PCIE_BAR_PCIE2CPP_LengthSelect( 211 NFP_PCIE_BAR_PCIE2CPP_LengthSelect_32BIT); 212 break; 213 case 0: 214 newcfg = NFP_PCIE_BAR_PCIE2CPP_LengthSelect( 215 NFP_PCIE_BAR_PCIE2CPP_LengthSelect_0BYTE); 216 break; 217 default: 218 return -EINVAL; 219 } 220 221 if (act != NFP_CPP_ACTION_RW && act != 0) { 222 /* Fixed CPP mapping with specific action */ 223 u64 mask = ~(NFP_PCIE_P2C_FIXED_SIZE(bar) - 1); 224 225 newcfg |= NFP_PCIE_BAR_PCIE2CPP_MapType( 226 NFP_PCIE_BAR_PCIE2CPP_MapType_FIXED); 227 newcfg |= NFP_PCIE_BAR_PCIE2CPP_Target_BaseAddress(tgt); 228 newcfg |= NFP_PCIE_BAR_PCIE2CPP_Action_BaseAddress(act); 229 newcfg |= NFP_PCIE_BAR_PCIE2CPP_Token_BaseAddress(tok); 230 231 if ((offset & mask) != ((offset + size - 1) & mask)) 232 return -EINVAL; 233 offset &= mask; 234 235 bitsize = 40 - 16; 236 } else { 237 u64 mask = ~(NFP_PCIE_P2C_BULK_SIZE(bar) - 1); 238 239 /* Bulk mapping */ 240 newcfg |= NFP_PCIE_BAR_PCIE2CPP_MapType( 241 NFP_PCIE_BAR_PCIE2CPP_MapType_BULK); 242 newcfg |= NFP_PCIE_BAR_PCIE2CPP_Target_BaseAddress(tgt); 243 newcfg |= NFP_PCIE_BAR_PCIE2CPP_Token_BaseAddress(tok); 244 245 if ((offset & mask) != ((offset + size - 1) & mask)) 246 return -EINVAL; 247 248 offset &= mask; 249 250 bitsize = 40 - 21; 251 } 252 253 if (bar->bitsize < bitsize) 254 return -EINVAL; 255 256 newcfg |= offset >> bitsize; 257 258 if (bar_base) 259 *bar_base = offset; 260 261 if (bar_config) 262 *bar_config = newcfg; 263 264 return 0; 265} 266 267static int 268nfp6000_bar_write(struct nfp6000_pcie *nfp, struct nfp_bar *bar, u32 newcfg) 269{ 270 unsigned int xbar; 271 272 xbar = NFP_PCIE_P2C_EXPBAR_OFFSET(bar->index); 273 274 if (nfp->iomem.csr) { 275 writel(newcfg, nfp->iomem.csr + xbar); 276 /* Readback to ensure BAR is flushed */ 277 readl(nfp->iomem.csr + xbar); 278 } else { 279 xbar += nfp->dev_info->pcie_cfg_expbar_offset; 280 pci_write_config_dword(nfp->pdev, xbar, newcfg); 281 } 282 283 bar->barcfg = newcfg; 284 285 return 0; 286} 287 288static int 289reconfigure_bar(struct nfp6000_pcie *nfp, struct nfp_bar *bar, 290 int tgt, int act, int tok, u64 offset, size_t size, int width) 291{ 292 u64 newbase; 293 u32 newcfg; 294 int err; 295 296 err = compute_bar(nfp, bar, &newcfg, &newbase, 297 tgt, act, tok, offset, size, width); 298 if (err) 299 return err; 300 301 bar->base = newbase; 302 303 return nfp6000_bar_write(nfp, bar, newcfg); 304} 305 306/* Check if BAR can be used with the given parameters. */ 307static int matching_bar(struct nfp_bar *bar, u32 tgt, u32 act, u32 tok, 308 u64 offset, size_t size, int width) 309{ 310 int bartgt, baract, bartok; 311 int barwidth; 312 u32 maptype; 313 314 maptype = NFP_PCIE_BAR_PCIE2CPP_MapType_of(bar->barcfg); 315 bartgt = NFP_PCIE_BAR_PCIE2CPP_Target_BaseAddress_of(bar->barcfg); 316 bartok = NFP_PCIE_BAR_PCIE2CPP_Token_BaseAddress_of(bar->barcfg); 317 baract = NFP_PCIE_BAR_PCIE2CPP_Action_BaseAddress_of(bar->barcfg); 318 319 barwidth = NFP_PCIE_BAR_PCIE2CPP_LengthSelect_of(bar->barcfg); 320 switch (barwidth) { 321 case NFP_PCIE_BAR_PCIE2CPP_LengthSelect_32BIT: 322 barwidth = 4; 323 break; 324 case NFP_PCIE_BAR_PCIE2CPP_LengthSelect_64BIT: 325 barwidth = 8; 326 break; 327 case NFP_PCIE_BAR_PCIE2CPP_LengthSelect_0BYTE: 328 barwidth = 0; 329 break; 330 default: 331 barwidth = -1; 332 break; 333 } 334 335 switch (maptype) { 336 case NFP_PCIE_BAR_PCIE2CPP_MapType_TARGET: 337 bartok = -1; 338 fallthrough; 339 case NFP_PCIE_BAR_PCIE2CPP_MapType_BULK: 340 baract = NFP_CPP_ACTION_RW; 341 if (act == 0) 342 act = NFP_CPP_ACTION_RW; 343 fallthrough; 344 case NFP_PCIE_BAR_PCIE2CPP_MapType_FIXED: 345 break; 346 default: 347 /* We don't match explicit bars through the area interface */ 348 return 0; 349 } 350 351 /* Make sure to match up the width */ 352 if (barwidth != width) 353 return 0; 354 355 if ((bartgt < 0 || bartgt == tgt) && 356 (bartok < 0 || bartok == tok) && 357 (baract == act) && 358 bar->base <= offset && 359 (bar->base + (1 << bar->bitsize)) >= (offset + size)) 360 return 1; 361 362 /* No match */ 363 return 0; 364} 365 366static int 367find_matching_bar(struct nfp6000_pcie *nfp, 368 u32 tgt, u32 act, u32 tok, u64 offset, size_t size, int width) 369{ 370 int n; 371 372 for (n = 0; n < nfp->bars; n++) { 373 struct nfp_bar *bar = &nfp->bar[n]; 374 375 if (matching_bar(bar, tgt, act, tok, offset, size, width)) 376 return n; 377 } 378 379 return -1; 380} 381 382/* Return EAGAIN if no resource is available */ 383static int 384find_unused_bar_noblock(const struct nfp6000_pcie *nfp, 385 int tgt, int act, int tok, 386 u64 offset, size_t size, int width) 387{ 388 int n, busy = 0; 389 390 for (n = 0; n < nfp->bars; n++) { 391 const struct nfp_bar *bar = &nfp->bar[n]; 392 int err; 393 394 if (!bar->bitsize) 395 continue; 396 397 /* Just check to see if we can make it fit... */ 398 err = compute_bar(nfp, bar, NULL, NULL, 399 tgt, act, tok, offset, size, width); 400 if (err) 401 continue; 402 403 if (!atomic_read(&bar->refcnt)) 404 return n; 405 406 busy++; 407 } 408 409 if (WARN(!busy, "No suitable BAR found for request tgt:0x%x act:0x%x tok:0x%x off:0x%llx size:%zd width:%d\n", 410 tgt, act, tok, offset, size, width)) 411 return -EINVAL; 412 413 return -EAGAIN; 414} 415 416static int 417find_unused_bar_and_lock(struct nfp6000_pcie *nfp, 418 int tgt, int act, int tok, 419 u64 offset, size_t size, int width) 420{ 421 unsigned long flags; 422 int n; 423 424 spin_lock_irqsave(&nfp->bar_lock, flags); 425 426 n = find_unused_bar_noblock(nfp, tgt, act, tok, offset, size, width); 427 if (n < 0) 428 spin_unlock_irqrestore(&nfp->bar_lock, flags); 429 else 430 __release(&nfp->bar_lock); 431 432 return n; 433} 434 435static void nfp_bar_get(struct nfp6000_pcie *nfp, struct nfp_bar *bar) 436{ 437 atomic_inc(&bar->refcnt); 438} 439 440static void nfp_bar_put(struct nfp6000_pcie *nfp, struct nfp_bar *bar) 441{ 442 if (atomic_dec_and_test(&bar->refcnt)) 443 wake_up_interruptible(&nfp->bar_waiters); 444} 445 446static int 447nfp_wait_for_bar(struct nfp6000_pcie *nfp, int *barnum, 448 u32 tgt, u32 act, u32 tok, u64 offset, size_t size, int width) 449{ 450 return wait_event_interruptible(nfp->bar_waiters, 451 (*barnum = find_unused_bar_and_lock(nfp, tgt, act, tok, 452 offset, size, width)) 453 != -EAGAIN); 454} 455 456static int 457nfp_alloc_bar(struct nfp6000_pcie *nfp, 458 u32 tgt, u32 act, u32 tok, 459 u64 offset, size_t size, int width, int nonblocking) 460{ 461 unsigned long irqflags; 462 int barnum, retval; 463 464 if (size > (1 << 24)) 465 return -EINVAL; 466 467 spin_lock_irqsave(&nfp->bar_lock, irqflags); 468 barnum = find_matching_bar(nfp, tgt, act, tok, offset, size, width); 469 if (barnum >= 0) { 470 /* Found a perfect match. */ 471 nfp_bar_get(nfp, &nfp->bar[barnum]); 472 spin_unlock_irqrestore(&nfp->bar_lock, irqflags); 473 return barnum; 474 } 475 476 barnum = find_unused_bar_noblock(nfp, tgt, act, tok, 477 offset, size, width); 478 if (barnum < 0) { 479 if (nonblocking) 480 goto err_nobar; 481 482 /* Wait until a BAR becomes available. The 483 * find_unused_bar function will reclaim the bar_lock 484 * if a free BAR is found. 485 */ 486 spin_unlock_irqrestore(&nfp->bar_lock, irqflags); 487 retval = nfp_wait_for_bar(nfp, &barnum, tgt, act, tok, 488 offset, size, width); 489 if (retval) 490 return retval; 491 __acquire(&nfp->bar_lock); 492 } 493 494 nfp_bar_get(nfp, &nfp->bar[barnum]); 495 retval = reconfigure_bar(nfp, &nfp->bar[barnum], 496 tgt, act, tok, offset, size, width); 497 if (retval < 0) { 498 nfp_bar_put(nfp, &nfp->bar[barnum]); 499 barnum = retval; 500 } 501 502err_nobar: 503 spin_unlock_irqrestore(&nfp->bar_lock, irqflags); 504 return barnum; 505} 506 507static void disable_bars(struct nfp6000_pcie *nfp); 508 509static int bar_cmp(const void *aptr, const void *bptr) 510{ 511 const struct nfp_bar *a = aptr, *b = bptr; 512 513 if (a->bitsize == b->bitsize) 514 return a->index - b->index; 515 else 516 return a->bitsize - b->bitsize; 517} 518 519/* Map all PCI bars and fetch the actual BAR configurations from the 520 * board. We assume that the BAR with the PCIe config block is 521 * already mapped. 522 * 523 * BAR0.0: Reserved for General Mapping (for MSI-X access to PCIe SRAM) 524 * BAR0.1: Reserved for XPB access (for MSI-X access to PCIe PBA) 525 * BAR0.2: -- 526 * BAR0.3: -- 527 * BAR0.4: Reserved for Explicit 0.0-0.3 access 528 * BAR0.5: Reserved for Explicit 1.0-1.3 access 529 * BAR0.6: Reserved for Explicit 2.0-2.3 access 530 * BAR0.7: Reserved for Explicit 3.0-3.3 access 531 * 532 * BAR1.0-BAR1.7: -- 533 * BAR2.0-BAR2.7: -- 534 */ 535static int enable_bars(struct nfp6000_pcie *nfp, u16 interface) 536{ 537 const u32 barcfg_msix_general = 538 NFP_PCIE_BAR_PCIE2CPP_MapType( 539 NFP_PCIE_BAR_PCIE2CPP_MapType_GENERAL) | 540 NFP_PCIE_BAR_PCIE2CPP_LengthSelect( 541 NFP_PCIE_BAR_PCIE2CPP_LengthSelect_32BIT); 542 const u32 barcfg_msix_xpb = 543 NFP_PCIE_BAR_PCIE2CPP_MapType( 544 NFP_PCIE_BAR_PCIE2CPP_MapType_BULK) | 545 NFP_PCIE_BAR_PCIE2CPP_LengthSelect( 546 NFP_PCIE_BAR_PCIE2CPP_LengthSelect_32BIT) | 547 NFP_PCIE_BAR_PCIE2CPP_Target_BaseAddress( 548 NFP_CPP_TARGET_ISLAND_XPB); 549 const u32 barcfg_explicit[4] = { 550 NFP_PCIE_BAR_PCIE2CPP_MapType( 551 NFP_PCIE_BAR_PCIE2CPP_MapType_EXPLICIT0), 552 NFP_PCIE_BAR_PCIE2CPP_MapType( 553 NFP_PCIE_BAR_PCIE2CPP_MapType_EXPLICIT1), 554 NFP_PCIE_BAR_PCIE2CPP_MapType( 555 NFP_PCIE_BAR_PCIE2CPP_MapType_EXPLICIT2), 556 NFP_PCIE_BAR_PCIE2CPP_MapType( 557 NFP_PCIE_BAR_PCIE2CPP_MapType_EXPLICIT3), 558 }; 559 char status_msg[196] = {}; 560 int i, err, bars_free; 561 struct nfp_bar *bar; 562 int expl_groups; 563 char *msg, *end; 564 565 msg = status_msg + 566 snprintf(status_msg, sizeof(status_msg) - 1, "RESERVED BARs: "); 567 end = status_msg + sizeof(status_msg) - 1; 568 569 bar = &nfp->bar[0]; 570 for (i = 0; i < ARRAY_SIZE(nfp->bar); i++, bar++) { 571 struct resource *res; 572 573 res = &nfp->pdev->resource[(i >> 3) * 2]; 574 575 /* Skip over BARs that are not IORESOURCE_MEM */ 576 if (!(resource_type(res) & IORESOURCE_MEM)) { 577 bar--; 578 continue; 579 } 580 581 bar->resource = res; 582 bar->barcfg = 0; 583 584 bar->nfp = nfp; 585 bar->index = i; 586 bar->mask = nfp_bar_resource_len(bar) - 1; 587 bar->bitsize = fls(bar->mask); 588 bar->base = 0; 589 bar->iomem = NULL; 590 } 591 592 nfp->bars = bar - &nfp->bar[0]; 593 if (nfp->bars < 8) { 594 dev_err(nfp->dev, "No usable BARs found!\n"); 595 return -EINVAL; 596 } 597 598 bars_free = nfp->bars; 599 600 /* Convert unit ID (0..3) to signal master/data master ID (0x40..0x70) 601 */ 602 mutex_init(&nfp->expl.mutex); 603 604 nfp->expl.master_id = ((NFP_CPP_INTERFACE_UNIT_of(interface) & 3) + 4) 605 << 4; 606 nfp->expl.signal_ref = 0x10; 607 608 /* Configure, and lock, BAR0.0 for General Target use (MSI-X SRAM) */ 609 bar = &nfp->bar[0]; 610 if (nfp_bar_resource_len(bar) >= NFP_PCI_MIN_MAP_SIZE) 611 bar->iomem = ioremap(nfp_bar_resource_start(bar), 612 nfp_bar_resource_len(bar)); 613 if (bar->iomem) { 614 int pf; 615 616 msg += scnprintf(msg, end - msg, "0.0: General/MSI-X SRAM, "); 617 atomic_inc(&bar->refcnt); 618 bars_free--; 619 620 nfp6000_bar_write(nfp, bar, barcfg_msix_general); 621 622 nfp->expl.data = bar->iomem + NFP_PCIE_SRAM + 623 nfp->dev_info->pcie_expl_offset; 624 625 switch (nfp->pdev->device) { 626 case PCI_DEVICE_ID_NFP3800: 627 pf = nfp->pdev->devfn & 7; 628 nfp->iomem.csr = bar->iomem + NFP_PCIE_BAR(pf); 629 break; 630 case PCI_DEVICE_ID_NFP4000: 631 case PCI_DEVICE_ID_NFP5000: 632 case PCI_DEVICE_ID_NFP6000: 633 nfp->iomem.csr = bar->iomem + NFP_PCIE_BAR(0); 634 break; 635 default: 636 dev_err(nfp->dev, "Unsupported device ID: %04hx!\n", 637 nfp->pdev->device); 638 err = -EINVAL; 639 goto err_unmap_bar0; 640 } 641 nfp->iomem.em = bar->iomem + NFP_PCIE_EM; 642 } 643 644 switch (nfp->pdev->device) { 645 case PCI_DEVICE_ID_NFP3800: 646 expl_groups = 1; 647 break; 648 case PCI_DEVICE_ID_NFP4000: 649 case PCI_DEVICE_ID_NFP5000: 650 case PCI_DEVICE_ID_NFP6000: 651 expl_groups = 4; 652 break; 653 default: 654 dev_err(nfp->dev, "Unsupported device ID: %04hx!\n", 655 nfp->pdev->device); 656 err = -EINVAL; 657 goto err_unmap_bar0; 658 } 659 660 /* Configure, and lock, BAR0.1 for PCIe XPB (MSI-X PBA) */ 661 bar = &nfp->bar[1]; 662 msg += scnprintf(msg, end - msg, "0.1: PCIe XPB/MSI-X PBA, "); 663 atomic_inc(&bar->refcnt); 664 bars_free--; 665 666 nfp6000_bar_write(nfp, bar, barcfg_msix_xpb); 667 668 /* Use BAR0.4..BAR0.7 for EXPL IO */ 669 for (i = 0; i < 4; i++) { 670 int j; 671 672 if (i >= NFP_PCIE_EXPLICIT_BARS || i >= expl_groups) { 673 nfp->expl.group[i].bitsize = 0; 674 continue; 675 } 676 677 bar = &nfp->bar[4 + i]; 678 bar->iomem = ioremap(nfp_bar_resource_start(bar), 679 nfp_bar_resource_len(bar)); 680 if (bar->iomem) { 681 msg += scnprintf(msg, end - msg, 682 "0.%d: Explicit%d, ", 4 + i, i); 683 atomic_inc(&bar->refcnt); 684 bars_free--; 685 686 nfp->expl.group[i].bitsize = bar->bitsize; 687 nfp->expl.group[i].addr = bar->iomem; 688 nfp6000_bar_write(nfp, bar, barcfg_explicit[i]); 689 690 for (j = 0; j < 4; j++) 691 nfp->expl.group[i].free[j] = true; 692 } 693 nfp->iomem.expl[i] = bar->iomem; 694 } 695 696 /* Sort bars by bit size - use the smallest possible first. */ 697 sort(&nfp->bar[0], nfp->bars, sizeof(nfp->bar[0]), 698 bar_cmp, NULL); 699 700 dev_info(nfp->dev, "%sfree: %d/%d\n", status_msg, bars_free, nfp->bars); 701 702 return 0; 703 704err_unmap_bar0: 705 if (nfp->bar[0].iomem) 706 iounmap(nfp->bar[0].iomem); 707 return err; 708} 709 710static void disable_bars(struct nfp6000_pcie *nfp) 711{ 712 struct nfp_bar *bar = &nfp->bar[0]; 713 int n; 714 715 for (n = 0; n < nfp->bars; n++, bar++) { 716 if (bar->iomem) { 717 iounmap(bar->iomem); 718 bar->iomem = NULL; 719 } 720 } 721} 722 723/* 724 * Generic CPP bus access interface. 725 */ 726 727struct nfp6000_area_priv { 728 atomic_t refcnt; 729 730 struct nfp_bar *bar; 731 u32 bar_offset; 732 733 u32 target; 734 u32 action; 735 u32 token; 736 u64 offset; 737 struct { 738 int read; 739 int write; 740 int bar; 741 } width; 742 size_t size; 743 744 void __iomem *iomem; 745 phys_addr_t phys; 746 struct resource resource; 747}; 748 749static int nfp6000_area_init(struct nfp_cpp_area *area, u32 dest, 750 unsigned long long address, unsigned long size) 751{ 752 struct nfp6000_area_priv *priv = nfp_cpp_area_priv(area); 753 u32 target = NFP_CPP_ID_TARGET_of(dest); 754 u32 action = NFP_CPP_ID_ACTION_of(dest); 755 u32 token = NFP_CPP_ID_TOKEN_of(dest); 756 int pp; 757 758 pp = nfp_target_pushpull(NFP_CPP_ID(target, action, token), address); 759 if (pp < 0) 760 return pp; 761 762 priv->width.read = PUSH_WIDTH(pp); 763 priv->width.write = PULL_WIDTH(pp); 764 if (priv->width.read > 0 && 765 priv->width.write > 0 && 766 priv->width.read != priv->width.write) { 767 return -EINVAL; 768 } 769 770 if (priv->width.read > 0) 771 priv->width.bar = priv->width.read; 772 else 773 priv->width.bar = priv->width.write; 774 775 atomic_set(&priv->refcnt, 0); 776 priv->bar = NULL; 777 778 priv->target = target; 779 priv->action = action; 780 priv->token = token; 781 priv->offset = address; 782 priv->size = size; 783 memset(&priv->resource, 0, sizeof(priv->resource)); 784 785 return 0; 786} 787 788static void nfp6000_area_cleanup(struct nfp_cpp_area *area) 789{ 790} 791 792static void priv_area_get(struct nfp_cpp_area *area) 793{ 794 struct nfp6000_area_priv *priv = nfp_cpp_area_priv(area); 795 796 atomic_inc(&priv->refcnt); 797} 798 799static int priv_area_put(struct nfp_cpp_area *area) 800{ 801 struct nfp6000_area_priv *priv = nfp_cpp_area_priv(area); 802 803 if (WARN_ON(!atomic_read(&priv->refcnt))) 804 return 0; 805 806 return atomic_dec_and_test(&priv->refcnt); 807} 808 809static int nfp6000_area_acquire(struct nfp_cpp_area *area) 810{ 811 struct nfp6000_pcie *nfp = nfp_cpp_priv(nfp_cpp_area_cpp(area)); 812 struct nfp6000_area_priv *priv = nfp_cpp_area_priv(area); 813 int barnum, err; 814 815 if (priv->bar) { 816 /* Already allocated. */ 817 priv_area_get(area); 818 return 0; 819 } 820 821 barnum = nfp_alloc_bar(nfp, priv->target, priv->action, priv->token, 822 priv->offset, priv->size, priv->width.bar, 1); 823 824 if (barnum < 0) { 825 err = barnum; 826 goto err_alloc_bar; 827 } 828 priv->bar = &nfp->bar[barnum]; 829 830 /* Calculate offset into BAR. */ 831 if (nfp_bar_maptype(priv->bar) == 832 NFP_PCIE_BAR_PCIE2CPP_MapType_GENERAL) { 833 priv->bar_offset = priv->offset & 834 (NFP_PCIE_P2C_GENERAL_SIZE(priv->bar) - 1); 835 priv->bar_offset += NFP_PCIE_P2C_GENERAL_TARGET_OFFSET( 836 priv->bar, priv->target); 837 priv->bar_offset += NFP_PCIE_P2C_GENERAL_TOKEN_OFFSET( 838 priv->bar, priv->token); 839 } else { 840 priv->bar_offset = priv->offset & priv->bar->mask; 841 } 842 843 /* We don't actually try to acquire the resource area using 844 * request_resource. This would prevent sharing the mapped 845 * BAR between multiple CPP areas and prevent us from 846 * effectively utilizing the limited amount of BAR resources. 847 */ 848 priv->phys = nfp_bar_resource_start(priv->bar) + priv->bar_offset; 849 priv->resource.name = nfp_cpp_area_name(area); 850 priv->resource.start = priv->phys; 851 priv->resource.end = priv->resource.start + priv->size - 1; 852 priv->resource.flags = IORESOURCE_MEM; 853 854 /* If the bar is already mapped in, use its mapping */ 855 if (priv->bar->iomem) 856 priv->iomem = priv->bar->iomem + priv->bar_offset; 857 else 858 /* Must have been too big. Sub-allocate. */ 859 priv->iomem = ioremap(priv->phys, priv->size); 860 861 if (IS_ERR_OR_NULL(priv->iomem)) { 862 dev_err(nfp->dev, "Can't ioremap() a %d byte region of BAR %d\n", 863 (int)priv->size, priv->bar->index); 864 err = !priv->iomem ? -ENOMEM : PTR_ERR(priv->iomem); 865 priv->iomem = NULL; 866 goto err_iomem_remap; 867 } 868 869 priv_area_get(area); 870 return 0; 871 872err_iomem_remap: 873 nfp_bar_put(nfp, priv->bar); 874 priv->bar = NULL; 875err_alloc_bar: 876 return err; 877} 878 879static void nfp6000_area_release(struct nfp_cpp_area *area) 880{ 881 struct nfp6000_pcie *nfp = nfp_cpp_priv(nfp_cpp_area_cpp(area)); 882 struct nfp6000_area_priv *priv = nfp_cpp_area_priv(area); 883 884 if (!priv_area_put(area)) 885 return; 886 887 if (!priv->bar->iomem) 888 iounmap(priv->iomem); 889 890 nfp_bar_put(nfp, priv->bar); 891 892 priv->bar = NULL; 893 priv->iomem = NULL; 894} 895 896static phys_addr_t nfp6000_area_phys(struct nfp_cpp_area *area) 897{ 898 struct nfp6000_area_priv *priv = nfp_cpp_area_priv(area); 899 900 return priv->phys; 901} 902 903static void __iomem *nfp6000_area_iomem(struct nfp_cpp_area *area) 904{ 905 struct nfp6000_area_priv *priv = nfp_cpp_area_priv(area); 906 907 return priv->iomem; 908} 909 910static struct resource *nfp6000_area_resource(struct nfp_cpp_area *area) 911{ 912 /* Use the BAR resource as the resource for the CPP area. 913 * This enables us to share the BAR among multiple CPP areas 914 * without resource conflicts. 915 */ 916 struct nfp6000_area_priv *priv = nfp_cpp_area_priv(area); 917 918 return priv->bar->resource; 919} 920 921static int nfp6000_area_read(struct nfp_cpp_area *area, void *kernel_vaddr, 922 unsigned long offset, unsigned int length) 923{ 924 u64 __maybe_unused *wrptr64 = kernel_vaddr; 925 const u64 __iomem __maybe_unused *rdptr64; 926 struct nfp6000_area_priv *priv; 927 u32 *wrptr32 = kernel_vaddr; 928 const u32 __iomem *rdptr32; 929 int n, width; 930 931 priv = nfp_cpp_area_priv(area); 932 rdptr64 = priv->iomem + offset; 933 rdptr32 = priv->iomem + offset; 934 935 if (offset + length > priv->size) 936 return -EFAULT; 937 938 width = priv->width.read; 939 if (width <= 0) 940 return -EINVAL; 941 942 /* MU reads via a PCIe2CPP BAR support 32bit (and other) lengths */ 943 if (priv->target == (NFP_CPP_TARGET_MU & NFP_CPP_TARGET_ID_MASK) && 944 priv->action == NFP_CPP_ACTION_RW && 945 (offset % sizeof(u64) == 4 || length % sizeof(u64) == 4)) 946 width = TARGET_WIDTH_32; 947 948 /* Unaligned? Translate to an explicit access */ 949 if ((priv->offset + offset) & (width - 1)) 950 return nfp_cpp_explicit_read(nfp_cpp_area_cpp(area), 951 NFP_CPP_ID(priv->target, 952 priv->action, 953 priv->token), 954 priv->offset + offset, 955 kernel_vaddr, length, width); 956 957 if (WARN_ON(!priv->bar)) 958 return -EFAULT; 959 960 switch (width) { 961 case TARGET_WIDTH_32: 962 if (offset % sizeof(u32) != 0 || length % sizeof(u32) != 0) 963 return -EINVAL; 964 965 for (n = 0; n < length; n += sizeof(u32)) 966 *wrptr32++ = __raw_readl(rdptr32++); 967 return n; 968#ifdef __raw_readq 969 case TARGET_WIDTH_64: 970 if (offset % sizeof(u64) != 0 || length % sizeof(u64) != 0) 971 return -EINVAL; 972 973 for (n = 0; n < length; n += sizeof(u64)) 974 *wrptr64++ = __raw_readq(rdptr64++); 975 return n; 976#endif 977 default: 978 return -EINVAL; 979 } 980} 981 982static int 983nfp6000_area_write(struct nfp_cpp_area *area, 984 const void *kernel_vaddr, 985 unsigned long offset, unsigned int length) 986{ 987 const u64 __maybe_unused *rdptr64 = kernel_vaddr; 988 u64 __iomem __maybe_unused *wrptr64; 989 const u32 *rdptr32 = kernel_vaddr; 990 struct nfp6000_area_priv *priv; 991 u32 __iomem *wrptr32; 992 int n, width; 993 994 priv = nfp_cpp_area_priv(area); 995 wrptr64 = priv->iomem + offset; 996 wrptr32 = priv->iomem + offset; 997 998 if (offset + length > priv->size) 999 return -EFAULT; 1000 1001 width = priv->width.write; 1002 if (width <= 0) 1003 return -EINVAL; 1004 1005 /* MU writes via a PCIe2CPP BAR support 32bit (and other) lengths */ 1006 if (priv->target == (NFP_CPP_TARGET_ID_MASK & NFP_CPP_TARGET_MU) && 1007 priv->action == NFP_CPP_ACTION_RW && 1008 (offset % sizeof(u64) == 4 || length % sizeof(u64) == 4)) 1009 width = TARGET_WIDTH_32; 1010 1011 /* Unaligned? Translate to an explicit access */ 1012 if ((priv->offset + offset) & (width - 1)) 1013 return nfp_cpp_explicit_write(nfp_cpp_area_cpp(area), 1014 NFP_CPP_ID(priv->target, 1015 priv->action, 1016 priv->token), 1017 priv->offset + offset, 1018 kernel_vaddr, length, width); 1019 1020 if (WARN_ON(!priv->bar)) 1021 return -EFAULT; 1022 1023 switch (width) { 1024 case TARGET_WIDTH_32: 1025 if (offset % sizeof(u32) != 0 || length % sizeof(u32) != 0) 1026 return -EINVAL; 1027 1028 for (n = 0; n < length; n += sizeof(u32)) { 1029 __raw_writel(*rdptr32++, wrptr32++); 1030 wmb(); 1031 } 1032 return n; 1033#ifdef __raw_writeq 1034 case TARGET_WIDTH_64: 1035 if (offset % sizeof(u64) != 0 || length % sizeof(u64) != 0) 1036 return -EINVAL; 1037 1038 for (n = 0; n < length; n += sizeof(u64)) { 1039 __raw_writeq(*rdptr64++, wrptr64++); 1040 wmb(); 1041 } 1042 return n; 1043#endif 1044 default: 1045 return -EINVAL; 1046 } 1047} 1048 1049struct nfp6000_explicit_priv { 1050 struct nfp6000_pcie *nfp; 1051 struct { 1052 int group; 1053 int area; 1054 } bar; 1055 int bitsize; 1056 void __iomem *data; 1057 void __iomem *addr; 1058}; 1059 1060static int nfp6000_explicit_acquire(struct nfp_cpp_explicit *expl) 1061{ 1062 struct nfp6000_pcie *nfp = nfp_cpp_priv(nfp_cpp_explicit_cpp(expl)); 1063 struct nfp6000_explicit_priv *priv = nfp_cpp_explicit_priv(expl); 1064 int i, j; 1065 1066 mutex_lock(&nfp->expl.mutex); 1067 for (i = 0; i < ARRAY_SIZE(nfp->expl.group); i++) { 1068 if (!nfp->expl.group[i].bitsize) 1069 continue; 1070 1071 for (j = 0; j < ARRAY_SIZE(nfp->expl.group[i].free); j++) { 1072 u16 data_offset; 1073 1074 if (!nfp->expl.group[i].free[j]) 1075 continue; 1076 1077 priv->nfp = nfp; 1078 priv->bar.group = i; 1079 priv->bar.area = j; 1080 priv->bitsize = nfp->expl.group[i].bitsize - 2; 1081 1082 data_offset = (priv->bar.group << 9) + 1083 (priv->bar.area << 7); 1084 priv->data = nfp->expl.data + data_offset; 1085 priv->addr = nfp->expl.group[i].addr + 1086 (priv->bar.area << priv->bitsize); 1087 nfp->expl.group[i].free[j] = false; 1088 1089 mutex_unlock(&nfp->expl.mutex); 1090 return 0; 1091 } 1092 } 1093 mutex_unlock(&nfp->expl.mutex); 1094 1095 return -EAGAIN; 1096} 1097 1098static void nfp6000_explicit_release(struct nfp_cpp_explicit *expl) 1099{ 1100 struct nfp6000_explicit_priv *priv = nfp_cpp_explicit_priv(expl); 1101 struct nfp6000_pcie *nfp = priv->nfp; 1102 1103 mutex_lock(&nfp->expl.mutex); 1104 nfp->expl.group[priv->bar.group].free[priv->bar.area] = true; 1105 mutex_unlock(&nfp->expl.mutex); 1106} 1107 1108static int nfp6000_explicit_put(struct nfp_cpp_explicit *expl, 1109 const void *buff, size_t len) 1110{ 1111 struct nfp6000_explicit_priv *priv = nfp_cpp_explicit_priv(expl); 1112 const u32 *src = buff; 1113 size_t i; 1114 1115 for (i = 0; i < len; i += sizeof(u32)) 1116 writel(*(src++), priv->data + i); 1117 1118 return i; 1119} 1120 1121static int 1122nfp6000_explicit_do(struct nfp_cpp_explicit *expl, 1123 const struct nfp_cpp_explicit_command *cmd, u64 address) 1124{ 1125 struct nfp6000_explicit_priv *priv = nfp_cpp_explicit_priv(expl); 1126 u8 signal_master, signal_ref, data_master; 1127 struct nfp6000_pcie *nfp = priv->nfp; 1128 int sigmask = 0; 1129 u16 data_ref; 1130 u32 csr[3]; 1131 1132 if (cmd->siga_mode) 1133 sigmask |= 1 << cmd->siga; 1134 if (cmd->sigb_mode) 1135 sigmask |= 1 << cmd->sigb; 1136 1137 signal_master = cmd->signal_master; 1138 if (!signal_master) 1139 signal_master = nfp->expl.master_id; 1140 1141 signal_ref = cmd->signal_ref; 1142 if (signal_master == nfp->expl.master_id) 1143 signal_ref = nfp->expl.signal_ref + 1144 ((priv->bar.group * 4 + priv->bar.area) << 1); 1145 1146 data_master = cmd->data_master; 1147 if (!data_master) 1148 data_master = nfp->expl.master_id; 1149 1150 data_ref = cmd->data_ref; 1151 if (data_master == nfp->expl.master_id) 1152 data_ref = 0x1000 + 1153 (priv->bar.group << 9) + (priv->bar.area << 7); 1154 1155 csr[0] = NFP_PCIE_BAR_EXPLICIT_BAR0_SignalType(sigmask) | 1156 NFP_PCIE_BAR_EXPLICIT_BAR0_Token( 1157 NFP_CPP_ID_TOKEN_of(cmd->cpp_id)) | 1158 NFP_PCIE_BAR_EXPLICIT_BAR0_Address(address >> 16); 1159 1160 csr[1] = NFP_PCIE_BAR_EXPLICIT_BAR1_SignalRef(signal_ref) | 1161 NFP_PCIE_BAR_EXPLICIT_BAR1_DataMaster(data_master) | 1162 NFP_PCIE_BAR_EXPLICIT_BAR1_DataRef(data_ref); 1163 1164 csr[2] = NFP_PCIE_BAR_EXPLICIT_BAR2_Target( 1165 NFP_CPP_ID_TARGET_of(cmd->cpp_id)) | 1166 NFP_PCIE_BAR_EXPLICIT_BAR2_Action( 1167 NFP_CPP_ID_ACTION_of(cmd->cpp_id)) | 1168 NFP_PCIE_BAR_EXPLICIT_BAR2_Length(cmd->len) | 1169 NFP_PCIE_BAR_EXPLICIT_BAR2_ByteMask(cmd->byte_mask) | 1170 NFP_PCIE_BAR_EXPLICIT_BAR2_SignalMaster(signal_master); 1171 1172 if (nfp->iomem.csr) { 1173 writel(csr[0], nfp->iomem.csr + 1174 NFP_PCIE_BAR_EXPLICIT_BAR0(priv->bar.group, 1175 priv->bar.area)); 1176 writel(csr[1], nfp->iomem.csr + 1177 NFP_PCIE_BAR_EXPLICIT_BAR1(priv->bar.group, 1178 priv->bar.area)); 1179 writel(csr[2], nfp->iomem.csr + 1180 NFP_PCIE_BAR_EXPLICIT_BAR2(priv->bar.group, 1181 priv->bar.area)); 1182 /* Readback to ensure BAR is flushed */ 1183 readl(nfp->iomem.csr + 1184 NFP_PCIE_BAR_EXPLICIT_BAR0(priv->bar.group, 1185 priv->bar.area)); 1186 readl(nfp->iomem.csr + 1187 NFP_PCIE_BAR_EXPLICIT_BAR1(priv->bar.group, 1188 priv->bar.area)); 1189 readl(nfp->iomem.csr + 1190 NFP_PCIE_BAR_EXPLICIT_BAR2(priv->bar.group, 1191 priv->bar.area)); 1192 } else { 1193 pci_write_config_dword(nfp->pdev, 0x400 + 1194 NFP_PCIE_BAR_EXPLICIT_BAR0( 1195 priv->bar.group, priv->bar.area), 1196 csr[0]); 1197 1198 pci_write_config_dword(nfp->pdev, 0x400 + 1199 NFP_PCIE_BAR_EXPLICIT_BAR1( 1200 priv->bar.group, priv->bar.area), 1201 csr[1]); 1202 1203 pci_write_config_dword(nfp->pdev, 0x400 + 1204 NFP_PCIE_BAR_EXPLICIT_BAR2( 1205 priv->bar.group, priv->bar.area), 1206 csr[2]); 1207 } 1208 1209 /* Issue the 'kickoff' transaction */ 1210 readb(priv->addr + (address & ((1 << priv->bitsize) - 1))); 1211 1212 return sigmask; 1213} 1214 1215static int nfp6000_explicit_get(struct nfp_cpp_explicit *expl, 1216 void *buff, size_t len) 1217{ 1218 struct nfp6000_explicit_priv *priv = nfp_cpp_explicit_priv(expl); 1219 u32 *dst = buff; 1220 size_t i; 1221 1222 for (i = 0; i < len; i += sizeof(u32)) 1223 *(dst++) = readl(priv->data + i); 1224 1225 return i; 1226} 1227 1228static int nfp6000_init(struct nfp_cpp *cpp) 1229{ 1230 nfp_cpp_area_cache_add(cpp, SZ_64K); 1231 nfp_cpp_area_cache_add(cpp, SZ_64K); 1232 nfp_cpp_area_cache_add(cpp, SZ_256K); 1233 1234 return 0; 1235} 1236 1237static void nfp6000_free(struct nfp_cpp *cpp) 1238{ 1239 struct nfp6000_pcie *nfp = nfp_cpp_priv(cpp); 1240 1241 disable_bars(nfp); 1242 kfree(nfp); 1243} 1244 1245static int nfp6000_read_serial(struct device *dev, u8 *serial) 1246{ 1247 struct pci_dev *pdev = to_pci_dev(dev); 1248 u64 dsn; 1249 1250 dsn = pci_get_dsn(pdev); 1251 if (!dsn) { 1252 dev_err(dev, "can't find PCIe Serial Number Capability\n"); 1253 return -EINVAL; 1254 } 1255 1256 put_unaligned_be32((u32)(dsn >> 32), serial); 1257 put_unaligned_be16((u16)(dsn >> 16), serial + 4); 1258 1259 return 0; 1260} 1261 1262static int nfp6000_get_interface(struct device *dev) 1263{ 1264 struct pci_dev *pdev = to_pci_dev(dev); 1265 u64 dsn; 1266 1267 dsn = pci_get_dsn(pdev); 1268 if (!dsn) { 1269 dev_err(dev, "can't find PCIe Serial Number Capability\n"); 1270 return -EINVAL; 1271 } 1272 1273 return dsn & 0xffff; 1274} 1275 1276static const struct nfp_cpp_operations nfp6000_pcie_ops = { 1277 .owner = THIS_MODULE, 1278 1279 .init = nfp6000_init, 1280 .free = nfp6000_free, 1281 1282 .read_serial = nfp6000_read_serial, 1283 .get_interface = nfp6000_get_interface, 1284 1285 .area_priv_size = sizeof(struct nfp6000_area_priv), 1286 .area_init = nfp6000_area_init, 1287 .area_cleanup = nfp6000_area_cleanup, 1288 .area_acquire = nfp6000_area_acquire, 1289 .area_release = nfp6000_area_release, 1290 .area_phys = nfp6000_area_phys, 1291 .area_iomem = nfp6000_area_iomem, 1292 .area_resource = nfp6000_area_resource, 1293 .area_read = nfp6000_area_read, 1294 .area_write = nfp6000_area_write, 1295 1296 .explicit_priv_size = sizeof(struct nfp6000_explicit_priv), 1297 .explicit_acquire = nfp6000_explicit_acquire, 1298 .explicit_release = nfp6000_explicit_release, 1299 .explicit_put = nfp6000_explicit_put, 1300 .explicit_do = nfp6000_explicit_do, 1301 .explicit_get = nfp6000_explicit_get, 1302}; 1303 1304/** 1305 * nfp_cpp_from_nfp6000_pcie() - Build a NFP CPP bus from a NFP6000 PCI device 1306 * @pdev: NFP6000 PCI device 1307 * @dev_info: NFP ASIC params 1308 * 1309 * Return: NFP CPP handle 1310 */ 1311struct nfp_cpp * 1312nfp_cpp_from_nfp6000_pcie(struct pci_dev *pdev, const struct nfp_dev_info *dev_info) 1313{ 1314 struct nfp6000_pcie *nfp; 1315 u16 interface; 1316 int err; 1317 1318 /* Finished with card initialization. */ 1319 dev_info(&pdev->dev, "Network Flow Processor %s PCIe Card Probe\n", 1320 dev_info->chip_names); 1321 pcie_print_link_status(pdev); 1322 1323 nfp = kzalloc(sizeof(*nfp), GFP_KERNEL); 1324 if (!nfp) { 1325 err = -ENOMEM; 1326 goto err_ret; 1327 } 1328 1329 nfp->dev = &pdev->dev; 1330 nfp->pdev = pdev; 1331 nfp->dev_info = dev_info; 1332 init_waitqueue_head(&nfp->bar_waiters); 1333 spin_lock_init(&nfp->bar_lock); 1334 1335 interface = nfp6000_get_interface(&pdev->dev); 1336 1337 if (NFP_CPP_INTERFACE_TYPE_of(interface) != 1338 NFP_CPP_INTERFACE_TYPE_PCI) { 1339 dev_err(&pdev->dev, 1340 "Interface type %d is not the expected %d\n", 1341 NFP_CPP_INTERFACE_TYPE_of(interface), 1342 NFP_CPP_INTERFACE_TYPE_PCI); 1343 err = -ENODEV; 1344 goto err_free_nfp; 1345 } 1346 1347 if (NFP_CPP_INTERFACE_CHANNEL_of(interface) != 1348 NFP_CPP_INTERFACE_CHANNEL_PEROPENER) { 1349 dev_err(&pdev->dev, "Interface channel %d is not the expected %d\n", 1350 NFP_CPP_INTERFACE_CHANNEL_of(interface), 1351 NFP_CPP_INTERFACE_CHANNEL_PEROPENER); 1352 err = -ENODEV; 1353 goto err_free_nfp; 1354 } 1355 1356 err = enable_bars(nfp, interface); 1357 if (err) 1358 goto err_free_nfp; 1359 1360 /* Probe for all the common NFP devices */ 1361 return nfp_cpp_from_operations(&nfp6000_pcie_ops, &pdev->dev, nfp); 1362 1363err_free_nfp: 1364 kfree(nfp); 1365err_ret: 1366 dev_err(&pdev->dev, "NFP6000 PCI setup failed\n"); 1367 return ERR_PTR(err); 1368} 1369