qcom-io-pgtable.h 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved.
  4. * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  5. */
  6. #ifndef __QCOM_QCOM_IO_PGTABLE_H
  7. #define __QCOM_QCOM_IO_PGTABLE_H
  8. #include <linux/io-pgtable.h>
  9. struct qcom_iommu_pgtable_log_ops {
  10. void (*log_new_table)(void *cookie, void *virt, unsigned long iova, size_t granule);
  11. void (*log_remove_table)(void *cookie, void *virt, unsigned long iova, size_t granule);
  12. };
  13. struct qcom_iommu_flush_ops {
  14. void (*tlb_add_walk_page)(void *cookie, void *virt);
  15. void (*tlb_add_inv)(void *cookie);
  16. void (*tlb_sync)(void *cookie);
  17. };
  18. struct qcom_io_pgtable_info {
  19. struct io_pgtable_cfg cfg;
  20. const struct qcom_iommu_flush_ops *iommu_tlb_ops;
  21. const struct qcom_iommu_pgtable_log_ops *pgtable_log_ops;
  22. /* When set to 0, all page table memory is treated as non-secure. */
  23. u32 vmid;
  24. dma_addr_t iova_base;
  25. dma_addr_t iova_end;
  26. };
  27. #define to_qcom_io_pgtable_info(x)\
  28. container_of((x), struct qcom_io_pgtable_info, cfg)
  29. #define IO_PGTABLE_QUIRK_QCOM_USE_LLC_NWA BIT(31)
  30. #define ARM_V8L_FAST ((unsigned int)-1)
  31. #define QCOM_ARM_64_LPAE_S1 ((unsigned int)-2)
  32. struct io_pgtable_ops *qcom_alloc_io_pgtable_ops(enum io_pgtable_fmt fmt,
  33. struct qcom_io_pgtable_info *pgtbl_info,
  34. void *cookie);
  35. void qcom_free_io_pgtable_ops(struct io_pgtable_ops *ops);
  36. static inline void
  37. qcom_io_pgtable_tlb_add_walk_page(const struct qcom_iommu_flush_ops *tlb_ops, void *cookie,
  38. void *virt)
  39. {
  40. tlb_ops->tlb_add_walk_page(cookie, virt);
  41. }
  42. static inline void
  43. qcom_io_pgtable_tlb_add_inv(const struct qcom_iommu_flush_ops *tlb_ops, void *cookie)
  44. {
  45. tlb_ops->tlb_add_inv(cookie);
  46. }
  47. static inline void
  48. qcom_io_pgtable_tlb_sync(const struct qcom_iommu_flush_ops *tlb_ops, void *cookie)
  49. {
  50. tlb_ops->tlb_sync(cookie);
  51. }
  52. static inline void
  53. qcom_io_pgtable_log_new_table(const struct qcom_iommu_pgtable_log_ops *ops, void *cookie,
  54. void *virt, unsigned long iova, size_t granule)
  55. {
  56. ops->log_new_table(cookie, virt, iova, granule);
  57. }
  58. static inline void
  59. qcom_io_pgtable_log_remove_table(const struct qcom_iommu_pgtable_log_ops *ops, void *cookie,
  60. void *virt, unsigned long iova, size_t granule)
  61. {
  62. ops->log_remove_table(cookie, virt, iova, granule);
  63. }
  64. #ifdef CONFIG_IOMMU_IO_PGTABLE_FAST
  65. extern struct io_pgtable_init_fns io_pgtable_av8l_fast_init_fns;
  66. #endif
  67. #ifdef CONFIG_IOMMU_IO_PGTABLE_LPAE
  68. extern struct io_pgtable_init_fns qcom_io_pgtable_arm_64_lpae_s1_init_fns;
  69. #endif
  70. int qcom_arm_lpae_map(struct io_pgtable_ops *ops, unsigned long iova,
  71. phys_addr_t paddr, size_t size, int iommu_prot, gfp_t gfp);
  72. int qcom_arm_lpae_map_pages(struct io_pgtable_ops *ops, unsigned long iova,
  73. phys_addr_t paddr, size_t pgsize, size_t pgcount,
  74. int iommu_prot, gfp_t gfp, size_t *mapped);
  75. int qcom_arm_lpae_map_sg(struct io_pgtable_ops *ops, unsigned long iova,
  76. struct scatterlist *sg, unsigned int nents, int prot,
  77. gfp_t gfp, size_t *mapped);
  78. size_t qcom_arm_lpae_unmap_pages(struct io_pgtable_ops *ops, unsigned long iova,
  79. size_t pgsize, size_t pgcount,
  80. struct iommu_iotlb_gather *gather);
  81. size_t qcom_arm_lpae_unmap(struct io_pgtable_ops *ops, unsigned long iova,
  82. size_t size, struct iommu_iotlb_gather *gather);
  83. #endif /* __QCOM_QCOM_IO_PGTABLE_H */