Merge branches 'arm/exynos', 'arm/renesas', 'arm/rockchip', 'arm/omap', 'arm/mediatek...
authorJoerg Roedel <jroedel@suse.de>
Fri, 1 Sep 2017 09:31:42 +0000 (11:31 +0200)
committerJoerg Roedel <jroedel@suse.de>
Fri, 1 Sep 2017 09:31:42 +0000 (11:31 +0200)
1  2  3  4  5  6  7  8  9  10  11  12  13  14 
MAINTAINERS
drivers/iommu/Kconfig
drivers/iommu/amd_iommu.c
drivers/iommu/amd_iommu_types.h
drivers/iommu/arm-smmu.c
drivers/iommu/fsl_pamu.c
drivers/iommu/fsl_pamu_domain.c
drivers/iommu/intel-iommu.c
drivers/iommu/iommu.c
drivers/iommu/rockchip-iommu.c
include/linux/iommu.h

diff --cc MAINTAINERS
index 1c3feffb1c1cfd2b46685907300a9f026fb67e6a,f66488dfdbc9cc59fc744ce9f8349b9b69bd945c,f66488dfdbc9cc59fc744ce9f8349b9b69bd945c,f66488dfdbc9cc59fc744ce9f8349b9b69bd945c,f66488dfdbc9cc59fc744ce9f8349b9b69bd945c,f66488dfdbc9cc59fc744ce9f8349b9b69bd945c,6f7721d1634c2eb7247538f2cb4d85fa1be1a458,c7a6ac0996dae6fdcaa04999727fe7605743dc26,6f7721d1634c2eb7247538f2cb4d85fa1be1a458,6f7721d1634c2eb7247538f2cb4d85fa1be1a458,f7d568b8f133d9919e3823c102d7ac78f89c894a,6f7721d1634c2eb7247538f2cb4d85fa1be1a458,6f7721d1634c2eb7247538f2cb4d85fa1be1a458,f66488dfdbc9cc59fc744ce9f8349b9b69bd945c..48ebccbd96064ad365a55421e3d389c55aac4c8b
@@@@@@@@@@@@@@@ -1156,18 -1156,18 -1156,18 -1156,18 -1156,18 -1156,18 -1156,18 -1156,18 -1156,18 -1156,18 -1117,6 -1156,18 -1156,18 -1156,18 +1156,18 @@@@@@@@@@@@@@@ F:        drivers/clk/axi
              F:        drivers/pinctrl/pinctrl-artpec*
              F:        Documentation/devicetree/bindings/pinctrl/axis,artpec6-pinctrl.txt
              
 -----       -L:        openbmc@lists.ozlabs.org
          +   ARM/ASPEED I2C DRIVER
          +   M:        Brendan Higgins <brendanhiggins@google.com>
          +   R:        Benjamin Herrenschmidt <benh@kernel.crashing.org>
          +   R:        Joel Stanley <joel@jms.id.au>
          +   L:        linux-i2c@vger.kernel.org
 +++++    +  +L:        openbmc@lists.ozlabs.org (moderated for non-subscribers)
          +   S:        Maintained
          +   F:        drivers/irqchip/irq-aspeed-i2c-ic.c
          +   F:        drivers/i2c/busses/i2c-aspeed.c
          +   F:        Documentation/devicetree/bindings/interrupt-controller/aspeed,ast2400-i2c-ic.txt
          +   F:        Documentation/devicetree/bindings/i2c/i2c-aspeed.txt
          +   
              ARM/ASPEED MACHINE SUPPORT
              M:        Joel Stanley <joel@jms.id.au>
              S:        Maintained
@@@@@@@@@@@@@@@ -5834,12 -5826,12 -5826,12 -5826,12 -5826,12 -5826,12 -5834,12 -5834,12 -5834,12 -5834,12 -5748,11 -5834,12 -5834,12 -5826,12 +5834,12 @@@@@@@@@@@@@@@ F:       drivers/staging/greybus/spi.
              F:        drivers/staging/greybus/spilib.c
              F:        drivers/staging/greybus/spilib.h
              
 -----       -GREYBUS LOOBACK/TIME PROTOCOLS DRIVERS
          -   GREYBUS PROTOCOLS DRIVERS
          -   M:        David Lin <dtwlin@gmail.com>
 +++++    +  +GREYBUS LOOPBACK/TIME PROTOCOLS DRIVERS
          +   M:        Bryan O'Donoghue <pure.logic@nexus-software.ie>
              S:        Maintained
          -   F:        drivers/staging/greybus/uart.c
          -   F:        drivers/staging/greybus/log.c
          +   F:        drivers/staging/greybus/loopback.c
          +   F:        drivers/staging/greybus/timesync.c
          +   F:        drivers/staging/greybus/timesync_platform.c
              
              GREYBUS PLATFORM DRIVERS
              M:        Vaibhav Hiremath <hvaibhav.linux@gmail.com>
              S:        Supported
              F:        arch/hexagon/
              
+++++++ ++++++QUALCOMM IOMMU
+++++++ ++++++M:        Rob Clark <robdclark@gmail.com>
+++++++ ++++++L:        iommu@lists.linux-foundation.org
+++++++ ++++++L:        linux-arm-msm@vger.kernel.org
+++++++ ++++++S:        Maintained
+++++++ ++++++F:        drivers/iommu/qcom_iommu.c
+++++++ ++++++
          +   QUALCOMM VENUS VIDEO ACCELERATOR DRIVER
          +   M:        Stanimir Varbanov <stanimir.varbanov@linaro.org>
          +   L:        linux-media@vger.kernel.org
          +   L:        linux-arm-msm@vger.kernel.org
          +   T:        git git://linuxtv.org/media_tree.git
          +   S:        Maintained
          +   F:        drivers/media/platform/qcom/venus/
          +   
              QUALCOMM WCN36XX WIRELESS DRIVER
              M:        Eugene Krasnikov <k.eugene.e@gmail.com>
              L:        wcn36xx@lists.infradead.org
              F:        include/linux/virtio*.h
              F:        include/uapi/linux/virtio_*.h
              F:        drivers/crypto/virtio/
 +++++    +  +F:        mm/balloon_compaction.c
          +   
          +   VIRTIO CRYPTO DRIVER
          +   M:        Gonglei <arei.gonglei@huawei.com>
          +   L:        virtualization@lists.linux-foundation.org
          +   L:        linux-crypto@vger.kernel.org
          +   S:        Maintained
          +   F:        drivers/crypto/virtio/
          +   F:        include/uapi/linux/virtio_crypto.h
              
              VIRTIO DRIVERS FOR S390
          -   M:        Cornelia Huck <cornelia.huck@de.ibm.com>
          +   M:        Cornelia Huck <cohuck@redhat.com>
              M:        Halil Pasic <pasic@linux.vnet.ibm.com>
              L:        linux-s390@vger.kernel.org
              L:        virtualization@lists.linux-foundation.org
Simple merge
index 354cbd6392cdf261ba657548ed2c208a09ddf50f,688e77576e5a50b3f2f137eec72cd721d6bf96fa,688e77576e5a50b3f2f137eec72cd721d6bf96fa,688e77576e5a50b3f2f137eec72cd721d6bf96fa,688e77576e5a50b3f2f137eec72cd721d6bf96fa,354cbd6392cdf261ba657548ed2c208a09ddf50f,5a61cf5a4443b61426d5d33b2e8344a1b51cfe51,354cbd6392cdf261ba657548ed2c208a09ddf50f,354cbd6392cdf261ba657548ed2c208a09ddf50f,354cbd6392cdf261ba657548ed2c208a09ddf50f,63cacf5d6cf23ab5611ba4219207a47c00662226,b531307a9360a3d245f043dc8b39ca9de74442f3,354cbd6392cdf261ba657548ed2c208a09ddf50f,7798fcf41b9bed1b7390e22c289edc6dcf142b13..538c16f669f9bf7cb8fda0491c9c02b63f483a2b
@@@@@@@@@@@@@@@ -102,29 -102,29 -102,29 -102,29 -102,29 -102,29 -102,29 -102,29 -102,29 -102,29 -119,27 -102,6 -102,29 -102,29 +102,6 @@@@@@@@@@@@@@@ int amd_iommu_max_glx_val = -1
              
              static const struct dma_map_ops amd_iommu_dma_ops;
              
----------- --/*
----------- -- * This struct contains device specific data for the IOMMU
----------- -- */
----------- --struct iommu_dev_data {
----------- --  struct list_head list;            /* For domain->dev_list */
----------- --  struct list_head dev_data_list;   /* For global dev_data_list */
----------- --  struct protection_domain *domain; /* Domain the device is bound to */
----------- --  u16 devid;                        /* PCI Device ID */
----------- --  u16 alias;                        /* Alias Device ID */
----------- --  bool iommu_v2;                    /* Device can make use of IOMMUv2 */
----------- --  bool passthrough;                 /* Device is identity mapped */
----------- --  struct {
----------- --          bool enabled;
----------- --          int qdep;
----------- --  } ats;                            /* ATS state */
----------- --  bool pri_tlp;                     /* PASID TLB required for
----------- --                                       PPR completions */
----------- --  u32 errata;                       /* Bitmap for errata to apply */
----------- --  bool use_vapic;                   /* Enable device to use vapic mode */
----------  --
----------  --  struct ratelimit_state rs;        /* Ratelimit IOPF messages */
----------- --};
----------- --
              /*
               * general struct to manage commands send to an IOMMU
               */
@@@@@@@@@@@@@@@ -137,20 -137,20 -137,20 -137,20 -137,20 -137,20 -137,7 -137,20 -137,20 -137,20 -152,6 -114,20 -137,20 -137,7 +114,7 @@@@@@@@@@@@@@@ struct kmem_cache *amd_iommu_irq_cache
              static void update_domain(struct protection_domain *domain);
              static int protection_domain_init(struct protection_domain *domain);
              static void detach_device(struct device *dev);
------ --- -- 
------ --- -- #define FLUSH_QUEUE_SIZE 256
------ --- -- 
------ --- -- struct flush_queue_entry {
------ --- --   unsigned long iova_pfn;
------ --- --   unsigned long pages;
------ --- --   u64 counter; /* Flush counter when this entry was added to the queue */
------ --- -- };
------ --- -- 
------ --- -- struct flush_queue {
------ --- --   struct flush_queue_entry *entries;
------ --- --   unsigned head, tail;
------ --- --   spinlock_t lock;
------ --- -- };
++++++ ++++++ static void iova_domain_flush_tlb(struct iova_domain *iovad);
              
              /*
               * Data container for a dma_ops specific protection domain
@@@@@@@@@@@@@@@ -1788,180 -1788,180 -1788,180 -1788,180 -1788,180 -1788,180 -1745,21 -1788,180 -1788,180 -1788,180 -1733,6 -1771,180 -1788,180 -1745,21 +1728,21 @@@@@@@@@@@@@@@ static void free_gcr3_table(struct prot
                free_page((unsigned long)domain->gcr3_tbl);
              }
              
------ --- -- static void dma_ops_domain_free_flush_queue(struct dma_ops_domain *dom)
------ --- -- {
------ --- --   int cpu;
------ --- -- 
------ --- --   for_each_possible_cpu(cpu) {
------ --- --           struct flush_queue *queue;
------ --- -- 
------ --- --           queue = per_cpu_ptr(dom->flush_queue, cpu);
------ --- --           kfree(queue->entries);
------ --- --   }
------ --- -- 
------ --- --   free_percpu(dom->flush_queue);
------ --- -- 
------ --- --   dom->flush_queue = NULL;
------ --- -- }
------ --- -- 
------ --- -- static int dma_ops_domain_alloc_flush_queue(struct dma_ops_domain *dom)
------ --- -- {
------ --- --   int cpu;
------ --- -- 
------ --- --   atomic64_set(&dom->flush_start_cnt,  0);
------ --- --   atomic64_set(&dom->flush_finish_cnt, 0);
------ --- -- 
------ --- --   dom->flush_queue = alloc_percpu(struct flush_queue);
------ --- --   if (!dom->flush_queue)
------ --- --           return -ENOMEM;
------ --- -- 
------ --- --   /* First make sure everything is cleared */
------ --- --   for_each_possible_cpu(cpu) {
------ --- --           struct flush_queue *queue;
------ --- -- 
------ --- --           queue = per_cpu_ptr(dom->flush_queue, cpu);
------ --- --           queue->head    = 0;
------ --- --           queue->tail    = 0;
------ --- --           queue->entries = NULL;
------ --- --   }
------ --- -- 
------ --- --   /* Now start doing the allocation */
------ --- --   for_each_possible_cpu(cpu) {
------ --- --           struct flush_queue *queue;
------ --- -- 
------ --- --           queue = per_cpu_ptr(dom->flush_queue, cpu);
------ --- --           queue->entries = kzalloc(FLUSH_QUEUE_SIZE * sizeof(*queue->entries),
------ --- --                                    GFP_KERNEL);
------ --- --           if (!queue->entries) {
------ --- --                   dma_ops_domain_free_flush_queue(dom);
------ --- --                   return -ENOMEM;
------ --- --           }
------ --- -- 
------ --- --           spin_lock_init(&queue->lock);
------ --- --   }
------ --- -- 
------ --- --   return 0;
------ --- -- }
------ --- -- 
          +   static void dma_ops_domain_flush_tlb(struct dma_ops_domain *dom)
          +   {
------ --- --   atomic64_inc(&dom->flush_start_cnt);
          +     domain_flush_tlb(&dom->domain);
          +     domain_flush_complete(&dom->domain);
------ --- --   atomic64_inc(&dom->flush_finish_cnt);
------ ---  - }
------ ---  - 
------ ---  - static inline bool queue_ring_full(struct flush_queue *queue)
------ ---  - {
------ ---  -   assert_spin_locked(&queue->lock);
------ ---  - 
------ ---  -   return (((queue->tail + 1) % FLUSH_QUEUE_SIZE) == queue->head);
 ----         }
 ----         
 ----         #define queue_ring_for_each(i, q) \
 ----           for (i = (q)->head; i != (q)->tail; i = (i + 1) % FLUSH_QUEUE_SIZE)
 ----         
 ----         static inline unsigned queue_ring_add(struct flush_queue *queue)
 ----         {
 ----           unsigned idx = queue->tail;
 ----         
 ----           assert_spin_locked(&queue->lock);
 ----           queue->tail = (idx + 1) % FLUSH_QUEUE_SIZE;
 ----         
 ----           return idx;
 ----         }
 ----         
 ----         static inline void queue_ring_remove_head(struct flush_queue *queue)
 ----         {
 ----           assert_spin_locked(&queue->lock);
 ----           queue->head = (queue->head + 1) % FLUSH_QUEUE_SIZE;
 ----         }
 ----         
 ----         static void queue_ring_free_flushed(struct dma_ops_domain *dom,
 ----                                       struct flush_queue *queue)
 ----         {
 ----           u64 counter = atomic64_read(&dom->flush_finish_cnt);
 ----           int idx;
 ----         
 ----           queue_ring_for_each(idx, queue) {
 ----                   /*
 ----                    * This assumes that counter values in the ring-buffer are
 ----                    * monotonously rising.
 ----                    */
 ----                   if (queue->entries[idx].counter >= counter)
 ----                           break;
 ----         
 ----                   free_iova_fast(&dom->iovad,
 ----                                  queue->entries[idx].iova_pfn,
 ----                                  queue->entries[idx].pages);
 ----         
 ----                   queue_ring_remove_head(queue);
 ----           }
 ----         }
 ----         
 ----         static void queue_add(struct dma_ops_domain *dom,
 ----                         unsigned long address, unsigned long pages)
 ----         {
 ----           struct flush_queue *queue;
 ----           unsigned long flags;
 ----           int idx;
 ----         
 ----           pages     = __roundup_pow_of_two(pages);
 ----           address >>= PAGE_SHIFT;
 ----         
 ----           queue = get_cpu_ptr(dom->flush_queue);
 ----           spin_lock_irqsave(&queue->lock, flags);
 ----         
 ----           /*
 ----            * First remove the enries from the ring-buffer that are already
 ----            * flushed to make the below queue_ring_full() check less likely
 ----            */
 ----           queue_ring_free_flushed(dom, queue);
 ----         
 ----           /*
 ----            * When ring-queue is full, flush the entries from the IOTLB so
 ----            * that we can free all entries with queue_ring_free_flushed()
 ----            * below.
 ----            */
 ----           if (queue_ring_full(queue)) {
 ----                   dma_ops_domain_flush_tlb(dom);
 ----                   queue_ring_free_flushed(dom, queue);
 ----           }
 ----         
 ----           idx = queue_ring_add(queue);
 ----         
 ----           queue->entries[idx].iova_pfn = address;
 ----           queue->entries[idx].pages    = pages;
 ----           queue->entries[idx].counter  = atomic64_read(&dom->flush_start_cnt);
 ----         
 ----           spin_unlock_irqrestore(&queue->lock, flags);
 ----         
 ----           if (atomic_cmpxchg(&dom->flush_timer_on, 0, 1) == 0)
 ----                   mod_timer(&dom->flush_timer, jiffies + msecs_to_jiffies(10));
 ----         
 ----           put_cpu_ptr(dom->flush_queue);
          +   }
          +   
-    - ---  - #define queue_ring_for_each(i, q) \
-    - ---  -   for (i = (q)->head; i != (q)->tail; i = (i + 1) % FLUSH_QUEUE_SIZE)
-    - ---  - 
-    - ---  - static inline unsigned queue_ring_add(struct flush_queue *queue)
 ----         static void queue_flush_timeout(unsigned long data)
           -  static inline bool queue_ring_full(struct flush_queue *queue)
++++++ ++++++ static void iova_domain_flush_tlb(struct iova_domain *iovad)
          +   {
-    - ---  -   unsigned idx = queue->tail;
 ----           struct dma_ops_domain *dom = (struct dma_ops_domain *)data;
 ----           int cpu;
           -    assert_spin_locked(&queue->lock);
           -  
           -    return (((queue->tail + 1) % FLUSH_QUEUE_SIZE) == queue->head);
           -  }
++++++ ++++++   struct dma_ops_domain *dom;
          +   
           -  #define queue_ring_for_each(i, q) \
           -    for (i = (q)->head; i != (q)->tail; i = (i + 1) % FLUSH_QUEUE_SIZE)
           -  
           -  static inline unsigned queue_ring_add(struct flush_queue *queue)
           -  {
           -    unsigned idx = queue->tail;
           -  
-    - --- --   assert_spin_locked(&queue->lock);
-    - --- --   queue->tail = (idx + 1) % FLUSH_QUEUE_SIZE;
-    - --- -- 
-    - --- --   return idx;
-    - --- -- }
-    - --- -- 
-    - --- -- static inline void queue_ring_remove_head(struct flush_queue *queue)
-    - --- -- {
-    - --- --   assert_spin_locked(&queue->lock);
-    - --- --   queue->head = (queue->head + 1) % FLUSH_QUEUE_SIZE;
-    - --- -- }
-    - --- -- 
-    - --- -- static void queue_ring_free_flushed(struct dma_ops_domain *dom,
-    - --- --                               struct flush_queue *queue)
-    - --- -- {
-    - --- --   u64 counter = atomic64_read(&dom->flush_finish_cnt);
-    - --- --   int idx;
-    - --- -- 
-    - --- --   queue_ring_for_each(idx, queue) {
-    - --- --           /*
-    - --- --            * This assumes that counter values in the ring-buffer are
-    - --- --            * monotonously rising.
-    - --- --            */
-    - --- --           if (queue->entries[idx].counter >= counter)
-    - --- --                   break;
-    - --- -- 
-    - --- --           free_iova_fast(&dom->iovad,
-    - --- --                          queue->entries[idx].iova_pfn,
-    - --- --                          queue->entries[idx].pages);
-    - --- -- 
-    - --- --           queue_ring_remove_head(queue);
-    - --- --   }
-    - --- -- }
-    - --- -- 
-    - --- -- static void queue_add(struct dma_ops_domain *dom,
-    - --- --                 unsigned long address, unsigned long pages)
-    - --- -- {
-    - --- --   struct flush_queue *queue;
-    - --- --   unsigned long flags;
-    - --- --   int idx;
-    - --- -- 
-    - --- --   pages     = __roundup_pow_of_two(pages);
-    - --- --   address >>= PAGE_SHIFT;
-    - --- -- 
-    - --- --   queue = get_cpu_ptr(dom->flush_queue);
-    - --- --   spin_lock_irqsave(&queue->lock, flags);
-    - --- -- 
-    - --- --   /*
-    - --- --    * First remove the enries from the ring-buffer that are already
-    - --- --    * flushed to make the below queue_ring_full() check less likely
-    - --- --    */
-    - --- --   queue_ring_free_flushed(dom, queue);
-    - --- -- 
-    - --- --   /*
-    - --- --    * When ring-queue is full, flush the entries from the IOTLB so
-    - --- --    * that we can free all entries with queue_ring_free_flushed()
-    - --- --    * below.
-    - --- --    */
-    - --- --   if (queue_ring_full(queue)) {
-    - --- --           dma_ops_domain_flush_tlb(dom);
-    - --- --           queue_ring_free_flushed(dom, queue);
-    - --- --   }
-    - --- -- 
-    - --- --   idx = queue_ring_add(queue);
-    - --- -- 
-    - --- --   queue->entries[idx].iova_pfn = address;
-    - --- --   queue->entries[idx].pages    = pages;
-    - --- --   queue->entries[idx].counter  = atomic64_read(&dom->flush_start_cnt);
-    - --- -- 
-    - --- --   spin_unlock_irqrestore(&queue->lock, flags);
-    - --- -- 
-    - --- --   if (atomic_cmpxchg(&dom->flush_timer_on, 0, 1) == 0)
-    - --- --           mod_timer(&dom->flush_timer, jiffies + msecs_to_jiffies(10));
-    - --- -- 
-    - --- --   put_cpu_ptr(dom->flush_queue);
-    - --- -- }
-    - --- -- 
-    - --- -- static void queue_flush_timeout(unsigned long data)
-    - --- -- {
-    - --- --   struct dma_ops_domain *dom = (struct dma_ops_domain *)data;
-    - --- --   int cpu;
-    - --- -- 
------ --- --   atomic_set(&dom->flush_timer_on, 0);
++++++ ++++++   dom = container_of(iovad, struct dma_ops_domain, iovad);
          +   
          +     dma_ops_domain_flush_tlb(dom);
------ --- -- 
------ --- --   for_each_possible_cpu(cpu) {
------ --- --           struct flush_queue *queue;
------ --- --           unsigned long flags;
------ --- -- 
------ --- --           queue = per_cpu_ptr(dom->flush_queue, cpu);
------ --- --           spin_lock_irqsave(&queue->lock, flags);
------ --- --           queue_ring_free_flushed(dom, queue);
------ --- --           spin_unlock_irqrestore(&queue->lock, flags);
------ --- --   }
          +   }
          +   
              /*
               * Free a domain, only used if something went wrong in the
               * allocation path and we need to free an already allocated page table
@@@@@@@@@@@@@@@ -2013,16 -2013,16 -2013,16 -2013,16 -2013,16 -2013,16 -1806,11 -2013,16 -2013,16 -2013,16 -1779,8 -1996,16 -2013,16 -1806,11 +1789,11 @@@@@@@@@@@@@@@ static struct dma_ops_domain *dma_ops_d
                init_iova_domain(&dma_dom->iovad, PAGE_SIZE,
                                 IOVA_START_PFN, DMA_32BIT_PFN);
              
------ --- --   /* Initialize reserved ranges */
------ --- --   copy_reserved_iova(&reserved_iova_ranges, &dma_dom->iovad);
------ --- -- 
------ --- --   if (dma_ops_domain_alloc_flush_queue(dma_dom))
++++++ ++++++   if (init_iova_flush_queue(&dma_dom->iovad, iova_domain_flush_tlb, NULL))
          +             goto free_dma_dom;
          +   
------ --- --   setup_timer(&dma_dom->flush_timer, queue_flush_timeout,
------ --- --               (unsigned long)dma_dom);
------ --- -- 
------ --- --   atomic_set(&dma_dom->flush_timer_on, 0);
++++++ +++ ++   /* Initialize reserved ranges */
++++++ +++ ++   copy_reserved_iova(&reserved_iova_ranges, &dma_dom->iovad);
              
                add_domain_to_list(&dma_dom->domain);
              
@@@@@@@@@@@@@@@ -2086,8 -2086,8 -2086,8 -2086,8 -2086,8 -2086,8 -1874,8 -2086,8 -2086,8 -2086,8 -1844,7 -2069,7 -2086,8 -1874,8 +1857,7 @@@@@@@@@@@@@@@ static void set_dte_entry(u16 devid, st
                        flags    |= tmp;
                }
              
----------  --
----------  --  flags &= ~(DTE_FLAG_SA | 0xffffULL);
          -     flags &= ~(0xffffUL);
+++++++++++ ++  flags &= ~DEV_DOMID_MASK;
                flags |= domain->id;
              
                amd_iommu_dev_table[devid].data[1]  = flags;
index d6b873b57054b44d2f0227630798cda83a637256,294a409e283b7ae4b52c59350756983711bba9d1,294a409e283b7ae4b52c59350756983711bba9d1,294a409e283b7ae4b52c59350756983711bba9d1,294a409e283b7ae4b52c59350756983711bba9d1,d6b873b57054b44d2f0227630798cda83a637256,294a409e283b7ae4b52c59350756983711bba9d1,294a409e283b7ae4b52c59350756983711bba9d1,294a409e283b7ae4b52c59350756983711bba9d1,294a409e283b7ae4b52c59350756983711bba9d1,4de8f4160bb81592bea7dd0aaa6e06aebcd777cf,9e5af13be7c5cdd846154aa321f23e6f886fda2a,294a409e283b7ae4b52c59350756983711bba9d1,294a409e283b7ae4b52c59350756983711bba9d1..5f775fef341c6bcf3974c43e87fe317e0b35ad52
              #define IOMMU_PTE_IR (1ULL << 61)
              #define IOMMU_PTE_IW (1ULL << 62)
              
+++++++++++ ++/*
+++++++++++ ++ * Bit value definition for DTE fields
+++++++++++ ++ */
+++++++++++ ++#define DTE_FLAG_V  (1ULL << 0)
+++++++++++ ++#define DTE_FLAG_TV (1ULL << 1)
+++++++++++ ++#define DTE_FLAG_IR (1ULL << 61)
+++++++++++ ++#define DTE_FLAG_IW (1ULL << 62)
+++++++++++ ++
              #define DTE_FLAG_IOTLB    (1ULL << 32)
----------  --#define DTE_FLAG_SA       (1ULL << 34)
              #define DTE_FLAG_GV       (1ULL << 55)
              #define DTE_FLAG_MASK     (0x3ffULL << 32)
              #define DTE_GLX_SHIFT     (56)
index 2d80fa8a0634aba34b366609d8bcc50f432bb31c,bc89b4d6c043dacee88463ba22edc8883f60385e,bc89b4d6c043dacee88463ba22edc8883f60385e,bc89b4d6c043dacee88463ba22edc8883f60385e,bc89b4d6c043dacee88463ba22edc8883f60385e,2d80fa8a0634aba34b366609d8bcc50f432bb31c,2d80fa8a0634aba34b366609d8bcc50f432bb31c,262e1a3bbeeb849c7006ca9f37164c4e57820d11,beeb042c718c0d0ad9d8bc8bc4ab51988442700a,2d80fa8a0634aba34b366609d8bcc50f432bb31c,7ec30b08b3bdc285872e0139997a300497450f98,2d80fa8a0634aba34b366609d8bcc50f432bb31c,2d80fa8a0634aba34b366609d8bcc50f432bb31c,bc89b4d6c043dacee88463ba22edc8883f60385e..3bdb799d3b4b1f5ee1de1e2505d3d0024273c658
@@@@@@@@@@@@@@@ -438,7 -436,7 -436,7 -436,7 -436,7 -438,7 -438,7 -245,7 -446,7 -438,7 -428,7 -438,7 -438,7 -436,7 +253,7 @@@@@@@@@@@@@@@ struct arm_smmu_domain 
                struct arm_smmu_cfg             cfg;
                enum arm_smmu_domain_stage      stage;
                struct mutex                    init_mutex; /* Protects smmu pointer */
 ----        -  spinlock_t                      cb_lock; /* Serialises ATS1* ops */
 ++++     +  +  spinlock_t                      cb_lock; /* Serialises ATS1* ops and TLB syncs */
                struct iommu_domain             domain;
              };
              
Simple merge
Simple merge
Simple merge
index 3f6ea160afed3bdf0e06a220b89e53c04b7ba84f,3f6ea160afed3bdf0e06a220b89e53c04b7ba84f,3f6ea160afed3bdf0e06a220b89e53c04b7ba84f,3f6ea160afed3bdf0e06a220b89e53c04b7ba84f,3f6ea160afed3bdf0e06a220b89e53c04b7ba84f,3f6ea160afed3bdf0e06a220b89e53c04b7ba84f,af69bf7e035afbc571893d46566cdfe37cc573d9,3f6ea160afed3bdf0e06a220b89e53c04b7ba84f,3f6ea160afed3bdf0e06a220b89e53c04b7ba84f,3f6ea160afed3bdf0e06a220b89e53c04b7ba84f,cf7ca7e70777d6498f751fac98bc29fef9ba8ce6,86581b115b92546cd4dbdc3bf036fc8a153846e4,3f6ea160afed3bdf0e06a220b89e53c04b7ba84f,31c2b1dc8cfd764e8d4188c6b7d5fb7c9c9b1c6f..3de5c0bcb5cc9f32b6fb615ce38f5729ae86d407
@@@@@@@@@@@@@@@ -1005,13 -1005,13 -1005,13 -1005,13 -1005,13 -1005,13 -1005,12 -1005,13 -1005,13 -1005,13 -1015,10 -1005,13 -1005,13 -1007,12 +1007,12 @@@@@@@@@@@@@@@ struct iommu_group *iommu_group_get_for
                if (group)
                        return group;
              
------ ------   group = ERR_PTR(-EINVAL);
------ --- -- 
------ --- --   if (ops && ops->device_group)
------ --- --           group = ops->device_group(dev);
++++++ ++++++   if (!ops)
++++++ ++++++           return ERR_PTR(-EINVAL);
              
          -     if (ops && ops->device_group)
          -             group = ops->device_group(dev);
++++++ ++++++   group = ops->device_group(dev);
          +     if (WARN_ON_ONCE(group == NULL))
          +             return ERR_PTR(-EINVAL);
              
                if (IS_ERR(group))
                        return group;
@@@@@@@@@@@@@@@ -1360,9 -1360,9 -1360,9 -1360,9 -1360,9 -1360,9 -1352,6 -1360,9 -1360,9 -1360,9 -1367,9 -1368,9 -1360,9 -1354,8 +1362,8 @@@@@@@@@@@@@@@ struct iommu_domain *iommu_get_domain_f
                struct iommu_group *group;
              
                group = iommu_group_get(dev);
------ ------   /* FIXME: Remove this when groups a mandatory for iommu drivers */
------ ------   if (group == NULL)
+++++++++++++   if (!group)
      +                 return NULL;
              
                domain = group->domain;
              
Simple merge
index 176f7569d87408c1e57bf09846809bfef5b0b7c8,2cb54adc4a334aa3f3a1732c35eaf9749d64b9e8,2cb54adc4a334aa3f3a1732c35eaf9749d64b9e8,2cb54adc4a334aa3f3a1732c35eaf9749d64b9e8,2cb54adc4a334aa3f3a1732c35eaf9749d64b9e8,176f7569d87408c1e57bf09846809bfef5b0b7c8,f1ce8e517d8dcd84296ae03eab30017dd769cd49,2cb54adc4a334aa3f3a1732c35eaf9749d64b9e8,2cb54adc4a334aa3f3a1732c35eaf9749d64b9e8,2cb54adc4a334aa3f3a1732c35eaf9749d64b9e8,2cb54adc4a334aa3f3a1732c35eaf9749d64b9e8,63983c9e6c3af7b542a4dd3dda3377cbad7d6b0b,2cb54adc4a334aa3f3a1732c35eaf9749d64b9e8,50be4fd338e44ac91729ad5e24cf3005861a4dd5..a7f2ac689d2917e2902e78604e8b6b33df1ee333
@@@@@@@@@@@@@@@ -436,11 -431,11 -431,11 -431,11 -431,11 -436,11 -431,11 -431,11 -431,11 -431,11 -431,11 -432,11 -431,11 -460,17 +466,17 @@@@@@@@@@@@@@@ static inline int iommu_map(struct iomm
              }
              
              static inline int iommu_unmap(struct iommu_domain *domain, unsigned long iova,
------ ------                         int gfp_order)
++++++ ++++++                         size_t size)
++++++ ++++++ {
++++++ ++++++   return -ENODEV;
++++++ ++++++ }
++++++ ++++++ 
+++++++++++++ static inline int iommu_unmap_fast(struct iommu_domain *domain, unsigned long iova,
+++++++++++++                              int gfp_order)
      +       {
      +         return -ENODEV;
      +       }
      +       
              static inline size_t iommu_map_sg(struct iommu_domain *domain,
                                          unsigned long iova, struct scatterlist *sg,
                                          unsigned int nents, int prot)