pci_io.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. /*
  2. * Copyright (c) 2014 Google, Inc
  3. * Written by Simon Glass <sjg@chromium.org>
  4. *
  5. * SPDX-License-Identifier: GPL-2.0+
  6. */
  7. /*
  8. * IO space access commands.
  9. */
  10. #include <common.h>
  11. #include <command.h>
  12. #include <dm.h>
  13. #include <asm/io.h>
  14. int pci_map_physmem(phys_addr_t paddr, unsigned long *lenp,
  15. struct udevice **devp, void **ptrp)
  16. {
  17. struct udevice *dev;
  18. int ret;
  19. *ptrp = 0;
  20. for (uclass_first_device(UCLASS_PCI_EMUL, &dev);
  21. dev;
  22. uclass_next_device(&dev)) {
  23. struct dm_pci_emul_ops *ops = pci_get_emul_ops(dev);
  24. if (!ops || !ops->map_physmem)
  25. continue;
  26. ret = (ops->map_physmem)(dev, paddr, lenp, ptrp);
  27. if (ret)
  28. continue;
  29. *devp = dev;
  30. return 0;
  31. }
  32. debug("%s: failed: addr=%x\n", __func__, paddr);
  33. return -ENOSYS;
  34. }
  35. int pci_unmap_physmem(const void *vaddr, unsigned long len,
  36. struct udevice *dev)
  37. {
  38. struct dm_pci_emul_ops *ops = pci_get_emul_ops(dev);
  39. if (!ops || !ops->unmap_physmem)
  40. return -ENOSYS;
  41. return (ops->unmap_physmem)(dev, vaddr, len);
  42. }
  43. static int pci_io_read(unsigned int addr, ulong *valuep, pci_size_t size)
  44. {
  45. struct udevice *dev;
  46. int ret;
  47. *valuep = pci_get_ff(size);
  48. for (uclass_first_device(UCLASS_PCI_EMUL, &dev);
  49. dev;
  50. uclass_next_device(&dev)) {
  51. struct dm_pci_emul_ops *ops = pci_get_emul_ops(dev);
  52. if (ops && ops->read_io) {
  53. ret = (ops->read_io)(dev, addr, valuep, size);
  54. if (!ret)
  55. return 0;
  56. }
  57. }
  58. debug("%s: failed: addr=%x\n", __func__, addr);
  59. return -ENOSYS;
  60. }
  61. static int pci_io_write(unsigned int addr, ulong value, pci_size_t size)
  62. {
  63. struct udevice *dev;
  64. int ret;
  65. for (uclass_first_device(UCLASS_PCI_EMUL, &dev);
  66. dev;
  67. uclass_next_device(&dev)) {
  68. struct dm_pci_emul_ops *ops = pci_get_emul_ops(dev);
  69. if (ops && ops->write_io) {
  70. ret = (ops->write_io)(dev, addr, value, size);
  71. if (!ret)
  72. return 0;
  73. }
  74. }
  75. debug("%s: failed: addr=%x, value=%lx\n", __func__, addr, value);
  76. return -ENOSYS;
  77. }
  78. int inl(unsigned int addr)
  79. {
  80. unsigned long value;
  81. int ret;
  82. ret = pci_io_read(addr, &value, PCI_SIZE_32);
  83. return ret ? 0 : value;
  84. }
  85. int inw(unsigned int addr)
  86. {
  87. unsigned long value;
  88. int ret;
  89. ret = pci_io_read(addr, &value, PCI_SIZE_16);
  90. return ret ? 0 : value;
  91. }
  92. int inb(unsigned int addr)
  93. {
  94. unsigned long value;
  95. int ret;
  96. ret = pci_io_read(addr, &value, PCI_SIZE_8);
  97. return ret ? 0 : value;
  98. }
  99. void outl(unsigned int value, unsigned int addr)
  100. {
  101. pci_io_write(addr, value, PCI_SIZE_32);
  102. }
  103. void outw(unsigned int value, unsigned int addr)
  104. {
  105. pci_io_write(addr, value, PCI_SIZE_16);
  106. }
  107. void outb(unsigned int value, unsigned int addr)
  108. {
  109. pci_io_write(addr, value, PCI_SIZE_8);
  110. }