rvu_af.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  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 <linux/list.h>
  12. #include <asm/io.h>
  13. #include <asm/arch/board.h>
  14. #include <asm/arch/csrs/csrs-npa.h>
  15. #include "nix.h"
  16. struct udevice *rvu_af_dev;
  17. inline struct rvu_af *get_af(void)
  18. {
  19. return rvu_af_dev ? dev_get_priv(rvu_af_dev) : NULL;
  20. }
  21. void rvu_get_lfid_for_pf(int pf, int *nixid, int *npaid)
  22. {
  23. union nixx_af_rvu_lf_cfg_debug nix_lf_dbg;
  24. union npa_af_rvu_lf_cfg_debug npa_lf_dbg;
  25. union rvu_pf_func_s pf_func;
  26. struct rvu_af *af = dev_get_priv(rvu_af_dev);
  27. struct nix_af *nix_af = af->nix_af;
  28. pf_func.u = 0;
  29. pf_func.s.pf = pf;
  30. nix_lf_dbg.u = 0;
  31. nix_lf_dbg.s.pf_func = pf_func.u & 0xFFFF;
  32. nix_lf_dbg.s.exec = 1;
  33. nix_af_reg_write(nix_af, NIXX_AF_RVU_LF_CFG_DEBUG(),
  34. nix_lf_dbg.u);
  35. do {
  36. nix_lf_dbg.u = nix_af_reg_read(nix_af,
  37. NIXX_AF_RVU_LF_CFG_DEBUG());
  38. } while (nix_lf_dbg.s.exec);
  39. if (nix_lf_dbg.s.lf_valid)
  40. *nixid = nix_lf_dbg.s.lf;
  41. debug("%s: nix lf_valid %d lf %d nixid %d\n", __func__,
  42. nix_lf_dbg.s.lf_valid, nix_lf_dbg.s.lf, *nixid);
  43. npa_lf_dbg.u = 0;
  44. npa_lf_dbg.s.pf_func = pf_func.u & 0xFFFF;
  45. npa_lf_dbg.s.exec = 1;
  46. npa_af_reg_write(nix_af->npa_af, NPA_AF_RVU_LF_CFG_DEBUG(),
  47. npa_lf_dbg.u);
  48. do {
  49. npa_lf_dbg.u = npa_af_reg_read(nix_af->npa_af,
  50. NPA_AF_RVU_LF_CFG_DEBUG());
  51. } while (npa_lf_dbg.s.exec);
  52. if (npa_lf_dbg.s.lf_valid)
  53. *npaid = npa_lf_dbg.s.lf;
  54. debug("%s: npa lf_valid %d lf %d npaid %d\n", __func__,
  55. npa_lf_dbg.s.lf_valid, npa_lf_dbg.s.lf, *npaid);
  56. }
  57. struct nix_af *rvu_af_init(struct rvu_af *rvu_af)
  58. {
  59. struct nix_af *nix_af;
  60. union rvu_af_addr_s block_addr;
  61. int err;
  62. nix_af = (struct nix_af *)calloc(1, sizeof(struct nix_af));
  63. if (!nix_af) {
  64. printf("%s: out of memory\n", __func__);
  65. goto error;
  66. }
  67. nix_af->dev = rvu_af->dev;
  68. block_addr.u = 0;
  69. block_addr.s.block = RVU_BLOCK_ADDR_E_NIXX(0);
  70. nix_af->nix_af_base = rvu_af->af_base + block_addr.u;
  71. nix_af->npa_af = (struct npa_af *)calloc(1, sizeof(struct npa_af));
  72. if (!nix_af->npa_af) {
  73. printf("%s: out of memory\n", __func__);
  74. goto error;
  75. }
  76. block_addr.u = 0;
  77. block_addr.s.block = RVU_BLOCK_ADDR_E_NPA;
  78. nix_af->npa_af->npa_af_base = rvu_af->af_base + block_addr.u;
  79. block_addr.u = 0;
  80. block_addr.s.block = RVU_BLOCK_ADDR_E_NPC;
  81. nix_af->npc_af_base = rvu_af->af_base + block_addr.u;
  82. debug("%s: Setting up npa admin\n", __func__);
  83. err = npa_af_setup(nix_af->npa_af);
  84. if (err) {
  85. printf("%s: Error %d setting up NPA admin\n", __func__, err);
  86. goto error;
  87. }
  88. debug("%s: Setting up nix af\n", __func__);
  89. err = nix_af_setup(nix_af);
  90. if (err) {
  91. printf("%s: Error %d setting up NIX admin\n", __func__, err);
  92. goto error;
  93. }
  94. debug("%s: nix_af: %p\n", __func__, nix_af);
  95. return nix_af;
  96. error:
  97. if (nix_af->npa_af) {
  98. free(nix_af->npa_af);
  99. memset(nix_af, 0, sizeof(*nix_af));
  100. }
  101. if (nix_af)
  102. free(nix_af);
  103. return NULL;
  104. }
  105. int rvu_af_probe(struct udevice *dev)
  106. {
  107. struct rvu_af *af_ptr = dev_get_priv(dev);
  108. af_ptr->af_base = dm_pci_map_bar(dev, PCI_BASE_ADDRESS_0,
  109. PCI_REGION_MEM);
  110. debug("%s RVU AF BAR %p\n", __func__, af_ptr->af_base);
  111. af_ptr->dev = dev;
  112. rvu_af_dev = dev;
  113. af_ptr->nix_af = rvu_af_init(af_ptr);
  114. if (!af_ptr->nix_af) {
  115. printf("%s: Error: could not initialize NIX AF\n", __func__);
  116. return -1;
  117. }
  118. debug("%s: Done\n", __func__);
  119. return 0;
  120. }
  121. int rvu_af_remove(struct udevice *dev)
  122. {
  123. struct rvu_af *rvu_af = dev_get_priv(dev);
  124. nix_af_shutdown(rvu_af->nix_af);
  125. npa_af_shutdown(rvu_af->nix_af->npa_af);
  126. npc_af_shutdown(rvu_af->nix_af);
  127. debug("%s: rvu af down --\n", __func__);
  128. return 0;
  129. }
  130. U_BOOT_DRIVER(rvu_af) = {
  131. .name = "rvu_af",
  132. .id = UCLASS_MISC,
  133. .probe = rvu_af_probe,
  134. .remove = rvu_af_remove,
  135. .priv_auto = sizeof(struct rvu_af),
  136. };
  137. static struct pci_device_id rvu_af_supported[] = {
  138. { PCI_VDEVICE(CAVIUM, PCI_DEVICE_ID_CAVIUM_RVU_AF) },
  139. {}
  140. };
  141. U_BOOT_PCI_DEVICE(rvu_af, rvu_af_supported);