rvu_pf.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (C) 2018 Marvell International Ltd.
  4. */
  5. #include <dm.h>
  6. #include <errno.h>
  7. #include <malloc.h>
  8. #include <misc.h>
  9. #include <net.h>
  10. #include <pci_ids.h>
  11. #include <asm/io.h>
  12. #include <asm/types.h>
  13. #include <asm/arch/board.h>
  14. #include "cgx.h"
  15. #include "nix.h"
  16. extern struct udevice *rvu_af_dev;
  17. int rvu_pf_init(struct rvu_pf *rvu)
  18. {
  19. struct nix *nix;
  20. struct eth_pdata *pdata = dev_get_plat(rvu->dev);
  21. debug("%s: Allocating nix lf\n", __func__);
  22. nix = nix_lf_alloc(rvu->dev);
  23. if (!nix) {
  24. printf("%s: Error allocating lf for pf %d\n",
  25. __func__, rvu->pfid);
  26. return -1;
  27. }
  28. rvu->nix = nix;
  29. /* to make post_probe happy */
  30. if (is_valid_ethaddr(nix->lmac->mac_addr)) {
  31. memcpy(pdata->enetaddr, nix->lmac->mac_addr, 6);
  32. eth_env_set_enetaddr_by_index("eth", dev_seq(rvu->dev),
  33. pdata->enetaddr);
  34. }
  35. return 0;
  36. }
  37. static const struct eth_ops nix_eth_ops = {
  38. .start = nix_lf_init,
  39. .send = nix_lf_xmit,
  40. .recv = nix_lf_recv,
  41. .free_pkt = nix_lf_free_pkt,
  42. .stop = nix_lf_halt,
  43. .write_hwaddr = nix_lf_setup_mac,
  44. };
  45. int rvu_pf_probe(struct udevice *dev)
  46. {
  47. struct rvu_pf *rvu = dev_get_priv(dev);
  48. int err;
  49. char name[16];
  50. debug("%s: name: %s\n", __func__, dev->name);
  51. rvu->pf_base = dm_pci_map_bar(dev, PCI_BASE_ADDRESS_2, PCI_REGION_MEM);
  52. rvu->pfid = dev_seq(dev) + 1; // RVU PF's start from 1;
  53. rvu->dev = dev;
  54. if (!rvu_af_dev) {
  55. printf("%s: Error: Could not find RVU AF device\n",
  56. __func__);
  57. return -1;
  58. }
  59. rvu->afdev = rvu_af_dev;
  60. debug("RVU PF %u BAR2 %p\n", rvu->pfid, rvu->pf_base);
  61. rvu_get_lfid_for_pf(rvu->pfid, &rvu->nix_lfid, &rvu->npa_lfid);
  62. err = rvu_pf_init(rvu);
  63. if (err)
  64. printf("%s: Error %d adding nix\n", __func__, err);
  65. /*
  66. * modify device name to include index/sequence number,
  67. * for better readability, this is 1:1 mapping with eth0/1/2.. names.
  68. */
  69. sprintf(name, "rvu_pf#%d", dev_seq(dev));
  70. device_set_name(dev, name);
  71. debug("%s: name: %s\n", __func__, dev->name);
  72. return err;
  73. }
  74. int rvu_pf_remove(struct udevice *dev)
  75. {
  76. struct rvu_pf *rvu = dev_get_priv(dev);
  77. nix_lf_shutdown(rvu->nix);
  78. npa_lf_shutdown(rvu->nix);
  79. debug("%s: rvu pf%d down --\n", __func__, rvu->pfid);
  80. return 0;
  81. }
  82. U_BOOT_DRIVER(rvu_pf) = {
  83. .name = "rvu_pf",
  84. .id = UCLASS_ETH,
  85. .probe = rvu_pf_probe,
  86. .remove = rvu_pf_remove,
  87. .ops = &nix_eth_ops,
  88. .priv_auto = sizeof(struct rvu_pf),
  89. .plat_auto = sizeof(struct eth_pdata),
  90. };
  91. static struct pci_device_id rvu_pf_supported[] = {
  92. { PCI_VDEVICE(CAVIUM, PCI_DEVICE_ID_CAVIUM_RVU_PF) },
  93. {}
  94. };
  95. U_BOOT_PCI_DEVICE(rvu_pf, rvu_pf_supported);