]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - include/linux/host1x.h
Merge tag 'for-linus-20191129' of git://git.kernel.dk/linux-block
[linux.git] / include / linux / host1x.h
index e6eea45e115496c4eba3514d5dccbc79c8e0deac..6f8d772591ba798c7e53117fa48f2a724325f134 100644 (file)
@@ -18,6 +18,7 @@ enum host1x_class {
 };
 
 struct host1x_client;
+struct iommu_group;
 
 /**
  * struct host1x_client_ops - host1x client operations
@@ -34,6 +35,7 @@ struct host1x_client_ops {
  * @list: list node for the host1x client
  * @parent: pointer to struct device representing the host1x controller
  * @dev: pointer to struct device backing this host1x client
+ * @group: IOMMU group that this client is a member of
  * @ops: host1x client operations
  * @class: host1x class represented by this client
  * @channel: host1x channel associated with this client
@@ -44,6 +46,7 @@ struct host1x_client {
        struct list_head list;
        struct device *parent;
        struct device *dev;
+       struct iommu_group *group;
 
        const struct host1x_client_ops *ops;
 
@@ -64,8 +67,9 @@ struct sg_table;
 struct host1x_bo_ops {
        struct host1x_bo *(*get)(struct host1x_bo *bo);
        void (*put)(struct host1x_bo *bo);
-       dma_addr_t (*pin)(struct host1x_bo *bo, struct sg_table **sgt);
-       void (*unpin)(struct host1x_bo *bo, struct sg_table *sgt);
+       struct sg_table *(*pin)(struct device *dev, struct host1x_bo *bo,
+                               dma_addr_t *phys);
+       void (*unpin)(struct device *dev, struct sg_table *sgt);
        void *(*mmap)(struct host1x_bo *bo);
        void (*munmap)(struct host1x_bo *bo, void *addr);
        void *(*kmap)(struct host1x_bo *bo, unsigned int pagenum);
@@ -92,15 +96,17 @@ static inline void host1x_bo_put(struct host1x_bo *bo)
        bo->ops->put(bo);
 }
 
-static inline dma_addr_t host1x_bo_pin(struct host1x_bo *bo,
-                                      struct sg_table **sgt)
+static inline struct sg_table *host1x_bo_pin(struct device *dev,
+                                            struct host1x_bo *bo,
+                                            dma_addr_t *phys)
 {
-       return bo->ops->pin(bo, sgt);
+       return bo->ops->pin(dev, bo, phys);
 }
 
-static inline void host1x_bo_unpin(struct host1x_bo *bo, struct sg_table *sgt)
+static inline void host1x_bo_unpin(struct device *dev, struct host1x_bo *bo,
+                                  struct sg_table *sgt)
 {
-       bo->ops->unpin(bo, sgt);
+       bo->ops->unpin(dev, sgt);
 }
 
 static inline void *host1x_bo_mmap(struct host1x_bo *bo)
@@ -158,7 +164,7 @@ u32 host1x_syncpt_base_id(struct host1x_syncpt_base *base);
 struct host1x_channel;
 struct host1x_job;
 
-struct host1x_channel *host1x_channel_request(struct device *dev);
+struct host1x_channel *host1x_channel_request(struct host1x_client *client);
 struct host1x_channel *host1x_channel_get(struct host1x_channel *channel);
 void host1x_channel_put(struct host1x_channel *channel);
 int host1x_job_submit(struct host1x_job *job);
@@ -167,6 +173,9 @@ int host1x_job_submit(struct host1x_job *job);
  * host1x job
  */
 
+#define HOST1X_RELOC_READ      (1 << 0)
+#define HOST1X_RELOC_WRITE     (1 << 1)
+
 struct host1x_reloc {
        struct {
                struct host1x_bo *bo;
@@ -177,6 +186,7 @@ struct host1x_reloc {
                unsigned long offset;
        } target;
        unsigned long shift;
+       unsigned long flags;
 };
 
 struct host1x_job {