nwl_register.c 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #define _PCILIB_NWL_REGISTER_C
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <unistd.h>
  6. #include <sys/time.h>
  7. #include "pcilib.h"
  8. #include "pci.h"
  9. #include "error.h"
  10. #include "tools.h"
  11. #include "nwl_private.h"
  12. #include "nwl_register.h"
  13. int nwl_add_registers(nwl_dma_t *ctx) {
  14. int err;
  15. size_t n, i, j;
  16. int length;
  17. const char *names[NWL_MAX_DMA_ENGINE_REGISTERS];
  18. uintptr_t addr[NWL_MAX_DMA_ENGINE_REGISTERS];
  19. // We don't want DMA registers
  20. if (pcilib_find_bank_by_addr(ctx->pcilib, PCILIB_REGISTER_BANK_DMA) == PCILIB_REGISTER_BANK_INVALID) return 0;
  21. err = pcilib_add_registers(ctx->pcilib, 0, nwl_dma_registers);
  22. if (err) return err;
  23. if (ctx->type == PCILIB_DMA_MODIFICATION_DEFAULT) {
  24. err = pcilib_add_registers(ctx->pcilib, 0, nwl_xrawdata_registers);
  25. if (err) return err;
  26. }
  27. for (n = 0; nwl_dma_engine_registers[n].bits; n++) {
  28. names[n] = nwl_dma_engine_registers[n].name;
  29. addr[n] = nwl_dma_engine_registers[n].addr;
  30. }
  31. if (ctx->n_engines > 9) length = 2;
  32. else length = 1;
  33. for (i = 0; i < ctx->n_engines; i++) {
  34. for (j = 0; nwl_dma_engine_registers[j].bits; j++) {
  35. const char *direction;
  36. nwl_dma_engine_registers[j].name = nwl_dma_engine_register_names[i * NWL_MAX_DMA_ENGINE_REGISTERS + j];
  37. nwl_dma_engine_registers[j].addr = addr[j] + (ctx->engines[i].base_addr - ctx->base_addr);
  38. // printf("%lx %lx\n", (ctx->engines[i].base_addr - ctx->base_addr), nwl_dma_engine_registers[j].addr);
  39. switch (ctx->engines[i].desc.direction) {
  40. case PCILIB_DMA_FROM_DEVICE:
  41. direction = "r";
  42. break;
  43. case PCILIB_DMA_TO_DEVICE:
  44. direction = "w";
  45. break;
  46. default:
  47. direction = "";
  48. }
  49. sprintf((char*)nwl_dma_engine_registers[j].name, names[j], length, ctx->engines[i].desc.addr, direction);
  50. }
  51. err = pcilib_add_registers(ctx->pcilib, n, nwl_dma_engine_registers);
  52. if (err) return err;
  53. }
  54. for (n = 0; nwl_dma_engine_registers[n].bits; n++) {
  55. nwl_dma_engine_registers[n].name = names[n];
  56. nwl_dma_engine_registers[n].addr = addr[n];
  57. }
  58. return 0;
  59. }