LCOV - code coverage report
Current view: top level - drivers/iommu - amd_iommu.c (source / functions) Hit Total Coverage
Test: combined.info Lines: 0 1324 0.0 %
Date: 2022-03-28 16:04:14 Functions: 0 107 0.0 %
Branches: 0 634 0.0 %

           Branch data     Line data    Source code
       1                 :            : // SPDX-License-Identifier: GPL-2.0-only
       2                 :            : /*
       3                 :            :  * Copyright (C) 2007-2010 Advanced Micro Devices, Inc.
       4                 :            :  * Author: Joerg Roedel <jroedel@suse.de>
       5                 :            :  *         Leo Duran <leo.duran@amd.com>
       6                 :            :  */
       7                 :            : 
       8                 :            : #define pr_fmt(fmt)     "AMD-Vi: " fmt
       9                 :            : #define dev_fmt(fmt)    pr_fmt(fmt)
      10                 :            : 
      11                 :            : #include <linux/ratelimit.h>
      12                 :            : #include <linux/pci.h>
      13                 :            : #include <linux/acpi.h>
      14                 :            : #include <linux/amba/bus.h>
      15                 :            : #include <linux/platform_device.h>
      16                 :            : #include <linux/pci-ats.h>
      17                 :            : #include <linux/bitmap.h>
      18                 :            : #include <linux/slab.h>
      19                 :            : #include <linux/debugfs.h>
      20                 :            : #include <linux/scatterlist.h>
      21                 :            : #include <linux/dma-mapping.h>
      22                 :            : #include <linux/dma-direct.h>
      23                 :            : #include <linux/dma-iommu.h>
      24                 :            : #include <linux/iommu-helper.h>
      25                 :            : #include <linux/iommu.h>
      26                 :            : #include <linux/delay.h>
      27                 :            : #include <linux/amd-iommu.h>
      28                 :            : #include <linux/notifier.h>
      29                 :            : #include <linux/export.h>
      30                 :            : #include <linux/irq.h>
      31                 :            : #include <linux/msi.h>
      32                 :            : #include <linux/dma-contiguous.h>
      33                 :            : #include <linux/irqdomain.h>
      34                 :            : #include <linux/percpu.h>
      35                 :            : #include <linux/iova.h>
      36                 :            : #include <asm/irq_remapping.h>
      37                 :            : #include <asm/io_apic.h>
      38                 :            : #include <asm/apic.h>
      39                 :            : #include <asm/hw_irq.h>
      40                 :            : #include <asm/msidef.h>
      41                 :            : #include <asm/proto.h>
      42                 :            : #include <asm/iommu.h>
      43                 :            : #include <asm/gart.h>
      44                 :            : #include <asm/dma.h>
      45                 :            : 
      46                 :            : #include "amd_iommu_proto.h"
      47                 :            : #include "amd_iommu_types.h"
      48                 :            : #include "irq_remapping.h"
      49                 :            : 
      50                 :            : #define CMD_SET_TYPE(cmd, t) ((cmd)->data[1] |= ((t) << 28))
      51                 :            : 
      52                 :            : #define LOOP_TIMEOUT    100000
      53                 :            : 
      54                 :            : /* IO virtual address start page frame number */
      55                 :            : #define IOVA_START_PFN          (1)
      56                 :            : #define IOVA_PFN(addr)          ((addr) >> PAGE_SHIFT)
      57                 :            : 
      58                 :            : /* Reserved IOVA ranges */
      59                 :            : #define MSI_RANGE_START         (0xfee00000)
      60                 :            : #define MSI_RANGE_END           (0xfeefffff)
      61                 :            : #define HT_RANGE_START          (0xfd00000000ULL)
      62                 :            : #define HT_RANGE_END            (0xffffffffffULL)
      63                 :            : 
      64                 :            : /*
      65                 :            :  * This bitmap is used to advertise the page sizes our hardware support
      66                 :            :  * to the IOMMU core, which will then use this information to split
      67                 :            :  * physically contiguous memory regions it is mapping into page sizes
      68                 :            :  * that we support.
      69                 :            :  *
      70                 :            :  * 512GB Pages are not supported due to a hardware bug
      71                 :            :  */
      72                 :            : #define AMD_IOMMU_PGSIZES       ((~0xFFFUL) & ~(2ULL << 38))
      73                 :            : 
      74                 :            : static DEFINE_SPINLOCK(pd_bitmap_lock);
      75                 :            : 
      76                 :            : /* List of all available dev_data structures */
      77                 :            : static LLIST_HEAD(dev_data_list);
      78                 :            : 
      79                 :            : LIST_HEAD(ioapic_map);
      80                 :            : LIST_HEAD(hpet_map);
      81                 :            : LIST_HEAD(acpihid_map);
      82                 :            : 
      83                 :            : /*
      84                 :            :  * Domain for untranslated devices - only allocated
      85                 :            :  * if iommu=pt passed on kernel cmd line.
      86                 :            :  */
      87                 :            : const struct iommu_ops amd_iommu_ops;
      88                 :            : 
      89                 :            : static ATOMIC_NOTIFIER_HEAD(ppr_notifier);
      90                 :            : int amd_iommu_max_glx_val = -1;
      91                 :            : 
      92                 :            : /*
      93                 :            :  * general struct to manage commands send to an IOMMU
      94                 :            :  */
      95                 :            : struct iommu_cmd {
      96                 :            :         u32 data[4];
      97                 :            : };
      98                 :            : 
      99                 :            : struct kmem_cache *amd_iommu_irq_cache;
     100                 :            : 
     101                 :            : static void update_domain(struct protection_domain *domain);
     102                 :            : static int protection_domain_init(struct protection_domain *domain);
     103                 :            : static void detach_device(struct device *dev);
     104                 :            : 
     105                 :            : /****************************************************************************
     106                 :            :  *
     107                 :            :  * Helper functions
     108                 :            :  *
     109                 :            :  ****************************************************************************/
     110                 :            : 
     111                 :          0 : static inline u16 get_pci_device_id(struct device *dev)
     112                 :            : {
     113                 :          0 :         struct pci_dev *pdev = to_pci_dev(dev);
     114                 :            : 
     115                 :          0 :         return pci_dev_id(pdev);
     116                 :            : }
     117                 :            : 
     118                 :            : static inline int get_acpihid_device_id(struct device *dev,
     119                 :            :                                         struct acpihid_map_entry **entry)
     120                 :            : {
     121                 :            :         struct acpi_device *adev = ACPI_COMPANION(dev);
     122                 :            :         struct acpihid_map_entry *p;
     123                 :            : 
     124                 :            :         if (!adev)
     125                 :            :                 return -ENODEV;
     126                 :            : 
     127                 :            :         list_for_each_entry(p, &acpihid_map, list) {
     128                 :            :                 if (acpi_dev_hid_uid_match(adev, p->hid, p->uid)) {
     129                 :            :                         if (entry)
     130                 :            :                                 *entry = p;
     131                 :            :                         return p->devid;
     132                 :            :                 }
     133                 :            :         }
     134                 :            :         return -EINVAL;
     135                 :            : }
     136                 :            : 
     137                 :          0 : static inline int get_device_id(struct device *dev)
     138                 :            : {
     139                 :          0 :         int devid;
     140                 :            : 
     141         [ #  # ]:          0 :         if (dev_is_pci(dev))
     142                 :          0 :                 devid = get_pci_device_id(dev);
     143                 :            :         else
     144                 :          0 :                 devid = get_acpihid_device_id(dev, NULL);
     145                 :            : 
     146                 :          0 :         return devid;
     147                 :            : }
     148                 :            : 
     149                 :          0 : static struct protection_domain *to_pdomain(struct iommu_domain *dom)
     150                 :            : {
     151                 :          0 :         return container_of(dom, struct protection_domain, domain);
     152                 :            : }
     153                 :            : 
     154                 :          0 : static struct iommu_dev_data *alloc_dev_data(u16 devid)
     155                 :            : {
     156                 :          0 :         struct iommu_dev_data *dev_data;
     157                 :            : 
     158                 :          0 :         dev_data = kzalloc(sizeof(*dev_data), GFP_KERNEL);
     159         [ #  # ]:          0 :         if (!dev_data)
     160                 :            :                 return NULL;
     161                 :            : 
     162                 :          0 :         spin_lock_init(&dev_data->lock);
     163                 :          0 :         dev_data->devid = devid;
     164                 :          0 :         ratelimit_default_init(&dev_data->rs);
     165                 :            : 
     166                 :          0 :         llist_add(&dev_data->dev_data_list, &dev_data_list);
     167                 :          0 :         return dev_data;
     168                 :            : }
     169                 :            : 
     170                 :          0 : static struct iommu_dev_data *search_dev_data(u16 devid)
     171                 :            : {
     172                 :          0 :         struct iommu_dev_data *dev_data;
     173                 :          0 :         struct llist_node *node;
     174                 :            : 
     175                 :          0 :         if (llist_empty(&dev_data_list))
     176                 :            :                 return NULL;
     177                 :            : 
     178                 :          0 :         node = dev_data_list.first;
     179   [ #  #  #  # ]:          0 :         llist_for_each_entry(dev_data, node, dev_data_list) {
     180   [ #  #  #  # ]:          0 :                 if (dev_data->devid == devid)
     181                 :            :                         return dev_data;
     182                 :            :         }
     183                 :            : 
     184                 :            :         return NULL;
     185                 :            : }
     186                 :            : 
     187                 :          0 : static int clone_alias(struct pci_dev *pdev, u16 alias, void *data)
     188                 :            : {
     189         [ #  # ]:          0 :         u16 devid = pci_dev_id(pdev);
     190                 :            : 
     191         [ #  # ]:          0 :         if (devid == alias)
     192                 :            :                 return 0;
     193                 :            : 
     194                 :          0 :         amd_iommu_rlookup_table[alias] =
     195                 :          0 :                 amd_iommu_rlookup_table[devid];
     196                 :          0 :         memcpy(amd_iommu_dev_table[alias].data,
     197                 :          0 :                amd_iommu_dev_table[devid].data,
     198                 :            :                sizeof(amd_iommu_dev_table[alias].data));
     199                 :            : 
     200                 :          0 :         return 0;
     201                 :            : }
     202                 :            : 
     203                 :          0 : static void clone_aliases(struct pci_dev *pdev)
     204                 :            : {
     205         [ #  # ]:          0 :         if (!pdev)
     206                 :            :                 return;
     207                 :            : 
     208                 :            :         /*
     209                 :            :          * The IVRS alias stored in the alias table may not be
     210                 :            :          * part of the PCI DMA aliases if it's bus differs
     211                 :            :          * from the original device.
     212                 :            :          */
     213                 :          0 :         clone_alias(pdev, amd_iommu_alias_table[pci_dev_id(pdev)], NULL);
     214                 :            : 
     215                 :          0 :         pci_for_each_dma_alias(pdev, clone_alias, NULL);
     216                 :            : }
     217                 :            : 
     218                 :          0 : static struct pci_dev *setup_aliases(struct device *dev)
     219                 :            : {
     220                 :          0 :         struct pci_dev *pdev = to_pci_dev(dev);
     221                 :          0 :         u16 ivrs_alias;
     222                 :            : 
     223                 :            :         /* For ACPI HID devices, there are no aliases */
     224         [ #  # ]:          0 :         if (!dev_is_pci(dev))
     225                 :            :                 return NULL;
     226                 :            : 
     227                 :            :         /*
     228                 :            :          * Add the IVRS alias to the pci aliases if it is on the same
     229                 :            :          * bus. The IVRS table may know about a quirk that we don't.
     230                 :            :          */
     231         [ #  # ]:          0 :         ivrs_alias = amd_iommu_alias_table[pci_dev_id(pdev)];
     232         [ #  # ]:          0 :         if (ivrs_alias != pci_dev_id(pdev) &&
     233         [ #  # ]:          0 :             PCI_BUS_NUM(ivrs_alias) == pdev->bus->number)
     234                 :          0 :                 pci_add_dma_alias(pdev, ivrs_alias & 0xff, 1);
     235                 :            : 
     236                 :          0 :         clone_aliases(pdev);
     237                 :            : 
     238                 :          0 :         return pdev;
     239                 :            : }
     240                 :            : 
     241                 :          0 : static struct iommu_dev_data *find_dev_data(u16 devid)
     242                 :            : {
     243                 :          0 :         struct iommu_dev_data *dev_data;
     244                 :          0 :         struct amd_iommu *iommu = amd_iommu_rlookup_table[devid];
     245                 :            : 
     246         [ #  # ]:          0 :         dev_data = search_dev_data(devid);
     247                 :            : 
     248         [ #  # ]:          0 :         if (dev_data == NULL) {
     249                 :          0 :                 dev_data = alloc_dev_data(devid);
     250         [ #  # ]:          0 :                 if (!dev_data)
     251                 :            :                         return NULL;
     252                 :            : 
     253         [ #  # ]:          0 :                 if (translation_pre_enabled(iommu))
     254                 :          0 :                         dev_data->defer_attach = true;
     255                 :            :         }
     256                 :            : 
     257                 :            :         return dev_data;
     258                 :            : }
     259                 :            : 
     260                 :          0 : struct iommu_dev_data *get_dev_data(struct device *dev)
     261                 :            : {
     262                 :          0 :         return dev->archdata.iommu;
     263                 :            : }
     264                 :            : EXPORT_SYMBOL(get_dev_data);
     265                 :            : 
     266                 :            : /*
     267                 :            : * Find or create an IOMMU group for a acpihid device.
     268                 :            : */
     269                 :          0 : static struct iommu_group *acpihid_device_group(struct device *dev)
     270                 :            : {
     271                 :          0 :         struct acpihid_map_entry *p, *entry = NULL;
     272                 :          0 :         int devid;
     273                 :            : 
     274                 :          0 :         devid = get_acpihid_device_id(dev, &entry);
     275         [ #  # ]:          0 :         if (devid < 0)
     276                 :          0 :                 return ERR_PTR(devid);
     277                 :            : 
     278         [ #  # ]:          0 :         list_for_each_entry(p, &acpihid_map, list) {
     279   [ #  #  #  # ]:          0 :                 if ((devid == p->devid) && p->group)
     280                 :          0 :                         entry->group = p->group;
     281                 :            :         }
     282                 :            : 
     283         [ #  # ]:          0 :         if (!entry->group)
     284                 :          0 :                 entry->group = generic_device_group(dev);
     285                 :            :         else
     286                 :          0 :                 iommu_group_ref_get(entry->group);
     287                 :            : 
     288                 :          0 :         return entry->group;
     289                 :            : }
     290                 :            : 
     291                 :          0 : static bool pci_iommuv2_capable(struct pci_dev *pdev)
     292                 :            : {
     293                 :          0 :         static const int caps[] = {
     294                 :            :                 PCI_EXT_CAP_ID_ATS,
     295                 :            :                 PCI_EXT_CAP_ID_PRI,
     296                 :            :                 PCI_EXT_CAP_ID_PASID,
     297                 :            :         };
     298                 :          0 :         int i, pos;
     299                 :            : 
     300         [ #  # ]:          0 :         if (pci_ats_disabled())
     301                 :            :                 return false;
     302                 :            : 
     303         [ #  # ]:          0 :         for (i = 0; i < 3; ++i) {
     304                 :          0 :                 pos = pci_find_ext_capability(pdev, caps[i]);
     305         [ #  # ]:          0 :                 if (pos == 0)
     306                 :            :                         return false;
     307                 :            :         }
     308                 :            : 
     309                 :            :         return true;
     310                 :            : }
     311                 :            : 
     312                 :          0 : static bool pdev_pri_erratum(struct pci_dev *pdev, u32 erratum)
     313                 :            : {
     314                 :          0 :         struct iommu_dev_data *dev_data;
     315                 :            : 
     316                 :          0 :         dev_data = get_dev_data(&pdev->dev);
     317                 :            : 
     318                 :          0 :         return dev_data->errata & (1 << erratum) ? true : false;
     319                 :            : }
     320                 :            : 
     321                 :            : /*
     322                 :            :  * This function checks if the driver got a valid device from the caller to
     323                 :            :  * avoid dereferencing invalid pointers.
     324                 :            :  */
     325                 :          0 : static bool check_device(struct device *dev)
     326                 :            : {
     327                 :          0 :         int devid;
     328                 :            : 
     329   [ #  #  #  # ]:          0 :         if (!dev || !dev->dma_mask)
     330                 :            :                 return false;
     331                 :            : 
     332                 :          0 :         devid = get_device_id(dev);
     333         [ #  # ]:          0 :         if (devid < 0)
     334                 :            :                 return false;
     335                 :            : 
     336                 :            :         /* Out of our scope? */
     337         [ #  # ]:          0 :         if (devid > amd_iommu_last_bdf)
     338                 :            :                 return false;
     339                 :            : 
     340         [ #  # ]:          0 :         if (amd_iommu_rlookup_table[devid] == NULL)
     341                 :          0 :                 return false;
     342                 :            : 
     343                 :            :         return true;
     344                 :            : }
     345                 :            : 
     346                 :          0 : static void init_iommu_group(struct device *dev)
     347                 :            : {
     348                 :          0 :         struct iommu_group *group;
     349                 :            : 
     350                 :          0 :         group = iommu_group_get_for_dev(dev);
     351         [ #  # ]:          0 :         if (IS_ERR(group))
     352                 :            :                 return;
     353                 :            : 
     354                 :          0 :         iommu_group_put(group);
     355                 :            : }
     356                 :            : 
     357                 :          0 : static int iommu_init_device(struct device *dev)
     358                 :            : {
     359                 :          0 :         struct iommu_dev_data *dev_data;
     360                 :          0 :         struct amd_iommu *iommu;
     361                 :          0 :         int devid;
     362                 :            : 
     363         [ #  # ]:          0 :         if (dev->archdata.iommu)
     364                 :            :                 return 0;
     365                 :            : 
     366                 :          0 :         devid = get_device_id(dev);
     367         [ #  # ]:          0 :         if (devid < 0)
     368                 :            :                 return devid;
     369                 :            : 
     370                 :          0 :         iommu = amd_iommu_rlookup_table[devid];
     371                 :            : 
     372                 :          0 :         dev_data = find_dev_data(devid);
     373         [ #  # ]:          0 :         if (!dev_data)
     374                 :            :                 return -ENOMEM;
     375                 :            : 
     376                 :          0 :         dev_data->pdev = setup_aliases(dev);
     377                 :            : 
     378                 :            :         /*
     379                 :            :          * By default we use passthrough mode for IOMMUv2 capable device.
     380                 :            :          * But if amd_iommu=force_isolation is set (e.g. to debug DMA to
     381                 :            :          * invalid address), we ignore the capability for the device so
     382                 :            :          * it'll be forced to go into translation mode.
     383                 :            :          */
     384   [ #  #  #  # ]:          0 :         if ((iommu_default_passthrough() || !amd_iommu_force_isolation) &&
     385   [ #  #  #  # ]:          0 :             dev_is_pci(dev) && pci_iommuv2_capable(to_pci_dev(dev))) {
     386                 :          0 :                 struct amd_iommu *iommu;
     387                 :            : 
     388                 :          0 :                 iommu = amd_iommu_rlookup_table[dev_data->devid];
     389                 :          0 :                 dev_data->iommu_v2 = iommu->is_iommu_v2;
     390                 :            :         }
     391                 :            : 
     392                 :          0 :         dev->archdata.iommu = dev_data;
     393                 :            : 
     394                 :          0 :         iommu_device_link(&iommu->iommu, dev);
     395                 :            : 
     396                 :          0 :         return 0;
     397                 :            : }
     398                 :            : 
     399                 :          0 : static void iommu_ignore_device(struct device *dev)
     400                 :            : {
     401                 :          0 :         int devid;
     402                 :            : 
     403                 :          0 :         devid = get_device_id(dev);
     404         [ #  # ]:          0 :         if (devid < 0)
     405                 :            :                 return;
     406                 :            : 
     407                 :          0 :         amd_iommu_rlookup_table[devid] = NULL;
     408                 :          0 :         memset(&amd_iommu_dev_table[devid], 0, sizeof(struct dev_table_entry));
     409                 :            : 
     410                 :          0 :         setup_aliases(dev);
     411                 :            : }
     412                 :            : 
     413                 :          0 : static void iommu_uninit_device(struct device *dev)
     414                 :            : {
     415                 :          0 :         struct iommu_dev_data *dev_data;
     416                 :          0 :         struct amd_iommu *iommu;
     417                 :          0 :         int devid;
     418                 :            : 
     419                 :          0 :         devid = get_device_id(dev);
     420         [ #  # ]:          0 :         if (devid < 0)
     421                 :            :                 return;
     422                 :            : 
     423                 :          0 :         iommu = amd_iommu_rlookup_table[devid];
     424                 :            : 
     425         [ #  # ]:          0 :         dev_data = search_dev_data(devid);
     426         [ #  # ]:          0 :         if (!dev_data)
     427                 :            :                 return;
     428                 :            : 
     429         [ #  # ]:          0 :         if (dev_data->domain)
     430                 :          0 :                 detach_device(dev);
     431                 :            : 
     432                 :          0 :         iommu_device_unlink(&iommu->iommu, dev);
     433                 :            : 
     434                 :          0 :         iommu_group_remove_device(dev);
     435                 :            : 
     436                 :            :         /* Remove dma-ops */
     437                 :          0 :         dev->dma_ops = NULL;
     438                 :            : 
     439                 :            :         /*
     440                 :            :          * We keep dev_data around for unplugged devices and reuse it when the
     441                 :            :          * device is re-plugged - not doing so would introduce a ton of races.
     442                 :            :          */
     443                 :            : }
     444                 :            : 
     445                 :            : /*
     446                 :            :  * Helper function to get the first pte of a large mapping
     447                 :            :  */
     448                 :          0 : static u64 *first_pte_l7(u64 *pte, unsigned long *page_size,
     449                 :            :                          unsigned long *count)
     450                 :            : {
     451                 :          0 :         unsigned long pte_mask, pg_size, cnt;
     452                 :          0 :         u64 *fpte;
     453                 :            : 
     454                 :          0 :         pg_size  = PTE_PAGE_SIZE(*pte);
     455                 :          0 :         cnt      = PAGE_SIZE_PTE_COUNT(pg_size);
     456                 :          0 :         pte_mask = ~((cnt << 3) - 1);
     457                 :          0 :         fpte     = (u64 *)(((unsigned long)pte) & pte_mask);
     458                 :            : 
     459                 :          0 :         if (page_size)
     460                 :            :                 *page_size = pg_size;
     461                 :            : 
     462                 :          0 :         if (count)
     463                 :          0 :                 *count = cnt;
     464                 :            : 
     465                 :          0 :         return fpte;
     466                 :            : }
     467                 :            : 
     468                 :            : /****************************************************************************
     469                 :            :  *
     470                 :            :  * Interrupt handling functions
     471                 :            :  *
     472                 :            :  ****************************************************************************/
     473                 :            : 
     474                 :          0 : static void dump_dte_entry(u16 devid)
     475                 :            : {
     476                 :          0 :         int i;
     477                 :            : 
     478         [ #  # ]:          0 :         for (i = 0; i < 4; ++i)
     479                 :          0 :                 pr_err("DTE[%d]: %016llx\n", i,
     480                 :            :                         amd_iommu_dev_table[devid].data[i]);
     481                 :          0 : }
     482                 :            : 
     483                 :          0 : static void dump_command(unsigned long phys_addr)
     484                 :            : {
     485                 :          0 :         struct iommu_cmd *cmd = iommu_phys_to_virt(phys_addr);
     486                 :          0 :         int i;
     487                 :            : 
     488         [ #  # ]:          0 :         for (i = 0; i < 4; ++i)
     489                 :          0 :                 pr_err("CMD[%d]: %08x\n", i, cmd->data[i]);
     490                 :          0 : }
     491                 :            : 
     492                 :          0 : static void amd_iommu_report_page_fault(u16 devid, u16 domain_id,
     493                 :            :                                         u64 address, int flags)
     494                 :            : {
     495                 :          0 :         struct iommu_dev_data *dev_data = NULL;
     496                 :          0 :         struct pci_dev *pdev;
     497                 :            : 
     498                 :          0 :         pdev = pci_get_domain_bus_and_slot(0, PCI_BUS_NUM(devid),
     499                 :            :                                            devid & 0xff);
     500         [ #  # ]:          0 :         if (pdev)
     501                 :          0 :                 dev_data = get_dev_data(&pdev->dev);
     502                 :            : 
     503   [ #  #  #  # ]:          0 :         if (dev_data && __ratelimit(&dev_data->rs)) {
     504                 :          0 :                 pci_err(pdev, "Event logged [IO_PAGE_FAULT domain=0x%04x address=0x%llx flags=0x%04x]\n",
     505                 :            :                         domain_id, address, flags);
     506         [ #  # ]:          0 :         } else if (printk_ratelimit()) {
     507                 :          0 :                 pr_err("Event logged [IO_PAGE_FAULT device=%02x:%02x.%x domain=0x%04x address=0x%llx flags=0x%04x]\n",
     508                 :            :                         PCI_BUS_NUM(devid), PCI_SLOT(devid), PCI_FUNC(devid),
     509                 :            :                         domain_id, address, flags);
     510                 :            :         }
     511                 :            : 
     512         [ #  # ]:          0 :         if (pdev)
     513                 :          0 :                 pci_dev_put(pdev);
     514                 :          0 : }
     515                 :            : 
     516                 :          0 : static void iommu_print_event(struct amd_iommu *iommu, void *__evt)
     517                 :            : {
     518                 :          0 :         struct device *dev = iommu->iommu.dev;
     519                 :          0 :         int type, devid, pasid, flags, tag;
     520                 :          0 :         volatile u32 *event = __evt;
     521                 :          0 :         int count = 0;
     522                 :          0 :         u64 address;
     523                 :            : 
     524                 :          0 : retry:
     525                 :          0 :         type    = (event[1] >> EVENT_TYPE_SHIFT)  & EVENT_TYPE_MASK;
     526                 :          0 :         devid   = (event[0] >> EVENT_DEVID_SHIFT) & EVENT_DEVID_MASK;
     527                 :          0 :         pasid   = (event[0] & EVENT_DOMID_MASK_HI) |
     528                 :          0 :                   (event[1] & EVENT_DOMID_MASK_LO);
     529                 :          0 :         flags   = (event[1] >> EVENT_FLAGS_SHIFT) & EVENT_FLAGS_MASK;
     530                 :          0 :         address = (u64)(((u64)event[3]) << 32) | event[2];
     531                 :            : 
     532         [ #  # ]:          0 :         if (type == 0) {
     533                 :            :                 /* Did we hit the erratum? */
     534         [ #  # ]:          0 :                 if (++count == LOOP_TIMEOUT) {
     535                 :          0 :                         pr_err("No event written to event log\n");
     536                 :          0 :                         return;
     537                 :            :                 }
     538                 :          0 :                 udelay(1);
     539                 :          0 :                 goto retry;
     540                 :            :         }
     541                 :            : 
     542         [ #  # ]:          0 :         if (type == EVENT_TYPE_IO_FAULT) {
     543                 :          0 :                 amd_iommu_report_page_fault(devid, pasid, address, flags);
     544                 :          0 :                 return;
     545                 :            :         }
     546                 :            : 
     547   [ #  #  #  #  :          0 :         switch (type) {
             #  #  #  #  
                      # ]
     548                 :          0 :         case EVENT_TYPE_ILL_DEV:
     549                 :          0 :                 dev_err(dev, "Event logged [ILLEGAL_DEV_TABLE_ENTRY device=%02x:%02x.%x pasid=0x%05x address=0x%llx flags=0x%04x]\n",
     550                 :            :                         PCI_BUS_NUM(devid), PCI_SLOT(devid), PCI_FUNC(devid),
     551                 :            :                         pasid, address, flags);
     552                 :          0 :                 dump_dte_entry(devid);
     553                 :          0 :                 break;
     554                 :          0 :         case EVENT_TYPE_DEV_TAB_ERR:
     555                 :          0 :                 dev_err(dev, "Event logged [DEV_TAB_HARDWARE_ERROR device=%02x:%02x.%x "
     556                 :            :                         "address=0x%llx flags=0x%04x]\n",
     557                 :            :                         PCI_BUS_NUM(devid), PCI_SLOT(devid), PCI_FUNC(devid),
     558                 :            :                         address, flags);
     559                 :          0 :                 break;
     560                 :          0 :         case EVENT_TYPE_PAGE_TAB_ERR:
     561                 :          0 :                 dev_err(dev, "Event logged [PAGE_TAB_HARDWARE_ERROR device=%02x:%02x.%x pasid=0x%04x address=0x%llx flags=0x%04x]\n",
     562                 :            :                         PCI_BUS_NUM(devid), PCI_SLOT(devid), PCI_FUNC(devid),
     563                 :            :                         pasid, address, flags);
     564                 :          0 :                 break;
     565                 :          0 :         case EVENT_TYPE_ILL_CMD:
     566                 :          0 :                 dev_err(dev, "Event logged [ILLEGAL_COMMAND_ERROR address=0x%llx]\n", address);
     567                 :          0 :                 dump_command(address);
     568                 :          0 :                 break;
     569                 :          0 :         case EVENT_TYPE_CMD_HARD_ERR:
     570                 :          0 :                 dev_err(dev, "Event logged [COMMAND_HARDWARE_ERROR address=0x%llx flags=0x%04x]\n",
     571                 :            :                         address, flags);
     572                 :          0 :                 break;
     573                 :          0 :         case EVENT_TYPE_IOTLB_INV_TO:
     574                 :          0 :                 dev_err(dev, "Event logged [IOTLB_INV_TIMEOUT device=%02x:%02x.%x address=0x%llx]\n",
     575                 :            :                         PCI_BUS_NUM(devid), PCI_SLOT(devid), PCI_FUNC(devid),
     576                 :            :                         address);
     577                 :          0 :                 break;
     578                 :          0 :         case EVENT_TYPE_INV_DEV_REQ:
     579                 :          0 :                 dev_err(dev, "Event logged [INVALID_DEVICE_REQUEST device=%02x:%02x.%x pasid=0x%05x address=0x%llx flags=0x%04x]\n",
     580                 :            :                         PCI_BUS_NUM(devid), PCI_SLOT(devid), PCI_FUNC(devid),
     581                 :            :                         pasid, address, flags);
     582                 :          0 :                 break;
     583                 :          0 :         case EVENT_TYPE_INV_PPR_REQ:
     584                 :          0 :                 pasid = PPR_PASID(*((u64 *)__evt));
     585                 :          0 :                 tag = event[1] & 0x03FF;
     586                 :          0 :                 dev_err(dev, "Event logged [INVALID_PPR_REQUEST device=%02x:%02x.%x pasid=0x%05x address=0x%llx flags=0x%04x tag=0x%03x]\n",
     587                 :            :                         PCI_BUS_NUM(devid), PCI_SLOT(devid), PCI_FUNC(devid),
     588                 :            :                         pasid, address, flags, tag);
     589                 :          0 :                 break;
     590                 :          0 :         default:
     591                 :          0 :                 dev_err(dev, "Event logged [UNKNOWN event[0]=0x%08x event[1]=0x%08x event[2]=0x%08x event[3]=0x%08x\n",
     592                 :            :                         event[0], event[1], event[2], event[3]);
     593                 :            :         }
     594                 :            : 
     595                 :          0 :         memset(__evt, 0, 4 * sizeof(u32));
     596                 :            : }
     597                 :            : 
     598                 :          0 : static void iommu_poll_events(struct amd_iommu *iommu)
     599                 :            : {
     600                 :          0 :         u32 head, tail;
     601                 :            : 
     602                 :          0 :         head = readl(iommu->mmio_base + MMIO_EVT_HEAD_OFFSET);
     603                 :          0 :         tail = readl(iommu->mmio_base + MMIO_EVT_TAIL_OFFSET);
     604                 :            : 
     605         [ #  # ]:          0 :         while (head != tail) {
     606                 :          0 :                 iommu_print_event(iommu, iommu->evt_buf + head);
     607                 :          0 :                 head = (head + EVENT_ENTRY_SIZE) % EVT_BUFFER_SIZE;
     608                 :            :         }
     609                 :            : 
     610                 :          0 :         writel(head, iommu->mmio_base + MMIO_EVT_HEAD_OFFSET);
     611                 :          0 : }
     612                 :            : 
     613                 :            : static void iommu_handle_ppr_entry(struct amd_iommu *iommu, u64 *raw)
     614                 :            : {
     615                 :            :         struct amd_iommu_fault fault;
     616                 :            : 
     617                 :            :         if (PPR_REQ_TYPE(raw[0]) != PPR_REQ_FAULT) {
     618                 :            :                 pr_err_ratelimited("Unknown PPR request received\n");
     619                 :            :                 return;
     620                 :            :         }
     621                 :            : 
     622                 :            :         fault.address   = raw[1];
     623                 :            :         fault.pasid     = PPR_PASID(raw[0]);
     624                 :            :         fault.device_id = PPR_DEVID(raw[0]);
     625                 :            :         fault.tag       = PPR_TAG(raw[0]);
     626                 :            :         fault.flags     = PPR_FLAGS(raw[0]);
     627                 :            : 
     628                 :            :         atomic_notifier_call_chain(&ppr_notifier, 0, &fault);
     629                 :            : }
     630                 :            : 
     631                 :          0 : static void iommu_poll_ppr_log(struct amd_iommu *iommu)
     632                 :            : {
     633                 :          0 :         u32 head, tail;
     634                 :            : 
     635         [ #  # ]:          0 :         if (iommu->ppr_log == NULL)
     636                 :            :                 return;
     637                 :            : 
     638                 :          0 :         head = readl(iommu->mmio_base + MMIO_PPR_HEAD_OFFSET);
     639                 :          0 :         tail = readl(iommu->mmio_base + MMIO_PPR_TAIL_OFFSET);
     640                 :            : 
     641         [ #  # ]:          0 :         while (head != tail) {
     642                 :          0 :                 volatile u64 *raw;
     643                 :          0 :                 u64 entry[2];
     644                 :          0 :                 int i;
     645                 :            : 
     646                 :          0 :                 raw = (u64 *)(iommu->ppr_log + head);
     647                 :            : 
     648                 :            :                 /*
     649                 :            :                  * Hardware bug: Interrupt may arrive before the entry is
     650                 :            :                  * written to memory. If this happens we need to wait for the
     651                 :            :                  * entry to arrive.
     652                 :            :                  */
     653         [ #  # ]:          0 :                 for (i = 0; i < LOOP_TIMEOUT; ++i) {
     654         [ #  # ]:          0 :                         if (PPR_REQ_TYPE(raw[0]) != 0)
     655                 :            :                                 break;
     656                 :          0 :                         udelay(1);
     657                 :            :                 }
     658                 :            : 
     659                 :            :                 /* Avoid memcpy function-call overhead */
     660                 :          0 :                 entry[0] = raw[0];
     661                 :          0 :                 entry[1] = raw[1];
     662                 :            : 
     663                 :            :                 /*
     664                 :            :                  * To detect the hardware bug we need to clear the entry
     665                 :            :                  * back to zero.
     666                 :            :                  */
     667                 :          0 :                 raw[0] = raw[1] = 0UL;
     668                 :            : 
     669                 :            :                 /* Update head pointer of hardware ring-buffer */
     670                 :          0 :                 head = (head + PPR_ENTRY_SIZE) % PPR_LOG_SIZE;
     671                 :          0 :                 writel(head, iommu->mmio_base + MMIO_PPR_HEAD_OFFSET);
     672                 :            : 
     673                 :            :                 /* Handle PPR entry */
     674                 :          0 :                 iommu_handle_ppr_entry(iommu, entry);
     675                 :            : 
     676                 :            :                 /* Refresh ring-buffer information */
     677                 :          0 :                 head = readl(iommu->mmio_base + MMIO_PPR_HEAD_OFFSET);
     678                 :          0 :                 tail = readl(iommu->mmio_base + MMIO_PPR_TAIL_OFFSET);
     679                 :            :         }
     680                 :            : }
     681                 :            : 
     682                 :            : #ifdef CONFIG_IRQ_REMAP
     683                 :            : static int (*iommu_ga_log_notifier)(u32);
     684                 :            : 
     685                 :            : int amd_iommu_register_ga_log_notifier(int (*notifier)(u32))
     686                 :            : {
     687                 :            :         iommu_ga_log_notifier = notifier;
     688                 :            : 
     689                 :            :         return 0;
     690                 :            : }
     691                 :            : EXPORT_SYMBOL(amd_iommu_register_ga_log_notifier);
     692                 :            : 
     693                 :            : static void iommu_poll_ga_log(struct amd_iommu *iommu)
     694                 :            : {
     695                 :            :         u32 head, tail, cnt = 0;
     696                 :            : 
     697                 :            :         if (iommu->ga_log == NULL)
     698                 :            :                 return;
     699                 :            : 
     700                 :            :         head = readl(iommu->mmio_base + MMIO_GA_HEAD_OFFSET);
     701                 :            :         tail = readl(iommu->mmio_base + MMIO_GA_TAIL_OFFSET);
     702                 :            : 
     703                 :            :         while (head != tail) {
     704                 :            :                 volatile u64 *raw;
     705                 :            :                 u64 log_entry;
     706                 :            : 
     707                 :            :                 raw = (u64 *)(iommu->ga_log + head);
     708                 :            :                 cnt++;
     709                 :            : 
     710                 :            :                 /* Avoid memcpy function-call overhead */
     711                 :            :                 log_entry = *raw;
     712                 :            : 
     713                 :            :                 /* Update head pointer of hardware ring-buffer */
     714                 :            :                 head = (head + GA_ENTRY_SIZE) % GA_LOG_SIZE;
     715                 :            :                 writel(head, iommu->mmio_base + MMIO_GA_HEAD_OFFSET);
     716                 :            : 
     717                 :            :                 /* Handle GA entry */
     718                 :            :                 switch (GA_REQ_TYPE(log_entry)) {
     719                 :            :                 case GA_GUEST_NR:
     720                 :            :                         if (!iommu_ga_log_notifier)
     721                 :            :                                 break;
     722                 :            : 
     723                 :            :                         pr_debug("%s: devid=%#x, ga_tag=%#x\n",
     724                 :            :                                  __func__, GA_DEVID(log_entry),
     725                 :            :                                  GA_TAG(log_entry));
     726                 :            : 
     727                 :            :                         if (iommu_ga_log_notifier(GA_TAG(log_entry)) != 0)
     728                 :            :                                 pr_err("GA log notifier failed.\n");
     729                 :            :                         break;
     730                 :            :                 default:
     731                 :            :                         break;
     732                 :            :                 }
     733                 :            :         }
     734                 :            : }
     735                 :            : #endif /* CONFIG_IRQ_REMAP */
     736                 :            : 
     737                 :            : #define AMD_IOMMU_INT_MASK      \
     738                 :            :         (MMIO_STATUS_EVT_INT_MASK | \
     739                 :            :          MMIO_STATUS_PPR_INT_MASK | \
     740                 :            :          MMIO_STATUS_GALOG_INT_MASK)
     741                 :            : 
     742                 :          0 : irqreturn_t amd_iommu_int_thread(int irq, void *data)
     743                 :            : {
     744                 :          0 :         struct amd_iommu *iommu = (struct amd_iommu *) data;
     745                 :          0 :         u32 status = readl(iommu->mmio_base + MMIO_STATUS_OFFSET);
     746                 :            : 
     747         [ #  # ]:          0 :         while (status & AMD_IOMMU_INT_MASK) {
     748                 :            :                 /* Enable EVT and PPR and GA interrupts again */
     749                 :          0 :                 writel(AMD_IOMMU_INT_MASK,
     750                 :          0 :                         iommu->mmio_base + MMIO_STATUS_OFFSET);
     751                 :            : 
     752         [ #  # ]:          0 :                 if (status & MMIO_STATUS_EVT_INT_MASK) {
     753                 :          0 :                         pr_devel("Processing IOMMU Event Log\n");
     754                 :          0 :                         iommu_poll_events(iommu);
     755                 :            :                 }
     756                 :            : 
     757         [ #  # ]:          0 :                 if (status & MMIO_STATUS_PPR_INT_MASK) {
     758                 :          0 :                         pr_devel("Processing IOMMU PPR Log\n");
     759                 :          0 :                         iommu_poll_ppr_log(iommu);
     760                 :            :                 }
     761                 :            : 
     762                 :            : #ifdef CONFIG_IRQ_REMAP
     763                 :            :                 if (status & MMIO_STATUS_GALOG_INT_MASK) {
     764                 :            :                         pr_devel("Processing IOMMU GA Log\n");
     765                 :            :                         iommu_poll_ga_log(iommu);
     766                 :            :                 }
     767                 :            : #endif
     768                 :            : 
     769                 :            :                 /*
     770                 :            :                  * Hardware bug: ERBT1312
     771                 :            :                  * When re-enabling interrupt (by writing 1
     772                 :            :                  * to clear the bit), the hardware might also try to set
     773                 :            :                  * the interrupt bit in the event status register.
     774                 :            :                  * In this scenario, the bit will be set, and disable
     775                 :            :                  * subsequent interrupts.
     776                 :            :                  *
     777                 :            :                  * Workaround: The IOMMU driver should read back the
     778                 :            :                  * status register and check if the interrupt bits are cleared.
     779                 :            :                  * If not, driver will need to go through the interrupt handler
     780                 :            :                  * again and re-clear the bits
     781                 :            :                  */
     782                 :          0 :                 status = readl(iommu->mmio_base + MMIO_STATUS_OFFSET);
     783                 :            :         }
     784                 :          0 :         return IRQ_HANDLED;
     785                 :            : }
     786                 :            : 
     787                 :          0 : irqreturn_t amd_iommu_int_handler(int irq, void *data)
     788                 :            : {
     789                 :          0 :         return IRQ_WAKE_THREAD;
     790                 :            : }
     791                 :            : 
     792                 :            : /****************************************************************************
     793                 :            :  *
     794                 :            :  * IOMMU command queuing functions
     795                 :            :  *
     796                 :            :  ****************************************************************************/
     797                 :            : 
     798                 :          0 : static int wait_on_sem(volatile u64 *sem)
     799                 :            : {
     800                 :          0 :         int i = 0;
     801                 :            : 
     802   [ #  #  #  # ]:          0 :         while (*sem == 0 && i < LOOP_TIMEOUT) {
     803                 :          0 :                 udelay(1);
     804                 :          0 :                 i += 1;
     805                 :            :         }
     806                 :            : 
     807         [ #  # ]:          0 :         if (i == LOOP_TIMEOUT) {
     808                 :          0 :                 pr_alert("Completion-Wait loop timed out\n");
     809                 :          0 :                 return -EIO;
     810                 :            :         }
     811                 :            : 
     812                 :            :         return 0;
     813                 :            : }
     814                 :            : 
     815                 :          0 : static void copy_cmd_to_buffer(struct amd_iommu *iommu,
     816                 :            :                                struct iommu_cmd *cmd)
     817                 :            : {
     818                 :          0 :         u8 *target;
     819                 :          0 :         u32 tail;
     820                 :            : 
     821                 :            :         /* Copy command to buffer */
     822                 :          0 :         tail = iommu->cmd_buf_tail;
     823                 :          0 :         target = iommu->cmd_buf + tail;
     824                 :          0 :         memcpy(target, cmd, sizeof(*cmd));
     825                 :            : 
     826                 :          0 :         tail = (tail + sizeof(*cmd)) % CMD_BUFFER_SIZE;
     827                 :          0 :         iommu->cmd_buf_tail = tail;
     828                 :            : 
     829                 :            :         /* Tell the IOMMU about it */
     830                 :          0 :         writel(tail, iommu->mmio_base + MMIO_CMD_TAIL_OFFSET);
     831                 :            : }
     832                 :            : 
     833                 :          0 : static void build_completion_wait(struct iommu_cmd *cmd, u64 address)
     834                 :            : {
     835         [ #  # ]:          0 :         u64 paddr = iommu_virt_to_phys((void *)address);
     836                 :            : 
     837         [ #  # ]:          0 :         WARN_ON(address & 0x7ULL);
     838                 :            : 
     839                 :          0 :         memset(cmd, 0, sizeof(*cmd));
     840                 :          0 :         cmd->data[0] = lower_32_bits(paddr) | CMD_COMPL_WAIT_STORE_MASK;
     841                 :          0 :         cmd->data[1] = upper_32_bits(paddr);
     842                 :          0 :         cmd->data[2] = 1;
     843                 :          0 :         CMD_SET_TYPE(cmd, CMD_COMPL_WAIT);
     844                 :          0 : }
     845                 :            : 
     846                 :          0 : static void build_inv_dte(struct iommu_cmd *cmd, u16 devid)
     847                 :            : {
     848                 :          0 :         memset(cmd, 0, sizeof(*cmd));
     849                 :          0 :         cmd->data[0] = devid;
     850                 :          0 :         CMD_SET_TYPE(cmd, CMD_INV_DEV_ENTRY);
     851                 :            : }
     852                 :            : 
     853                 :          0 : static void build_inv_iommu_pages(struct iommu_cmd *cmd, u64 address,
     854                 :            :                                   size_t size, u16 domid, int pde)
     855                 :            : {
     856                 :          0 :         u64 pages;
     857                 :          0 :         bool s;
     858                 :            : 
     859         [ #  # ]:          0 :         pages = iommu_num_pages(address, size, PAGE_SIZE);
     860                 :          0 :         s     = false;
     861                 :            : 
     862         [ #  # ]:          0 :         if (pages > 1) {
     863                 :            :                 /*
     864                 :            :                  * If we have to flush more than one page, flush all
     865                 :            :                  * TLB entries for this domain
     866                 :            :                  */
     867                 :          0 :                 address = CMD_INV_IOMMU_ALL_PAGES_ADDRESS;
     868                 :          0 :                 s = true;
     869                 :            :         }
     870                 :            : 
     871                 :          0 :         address &= PAGE_MASK;
     872                 :            : 
     873                 :          0 :         memset(cmd, 0, sizeof(*cmd));
     874                 :          0 :         cmd->data[1] |= domid;
     875                 :          0 :         cmd->data[2]  = lower_32_bits(address);
     876                 :          0 :         cmd->data[3]  = upper_32_bits(address);
     877                 :          0 :         CMD_SET_TYPE(cmd, CMD_INV_IOMMU_PAGES);
     878         [ #  # ]:          0 :         if (s) /* size bit - we flush more than one 4kb page */
     879                 :          0 :                 cmd->data[2] |= CMD_INV_IOMMU_PAGES_SIZE_MASK;
     880         [ #  # ]:          0 :         if (pde) /* PDE bit - we want to flush everything, not only the PTEs */
     881                 :          0 :                 cmd->data[2] |= CMD_INV_IOMMU_PAGES_PDE_MASK;
     882                 :          0 : }
     883                 :            : 
     884                 :            : static void build_inv_iotlb_pages(struct iommu_cmd *cmd, u16 devid, int qdep,
     885                 :            :                                   u64 address, size_t size)
     886                 :            : {
     887                 :            :         u64 pages;
     888                 :            :         bool s;
     889                 :            : 
     890                 :            :         pages = iommu_num_pages(address, size, PAGE_SIZE);
     891                 :            :         s     = false;
     892                 :            : 
     893                 :            :         if (pages > 1) {
     894                 :            :                 /*
     895                 :            :                  * If we have to flush more than one page, flush all
     896                 :            :                  * TLB entries for this domain
     897                 :            :                  */
     898                 :            :                 address = CMD_INV_IOMMU_ALL_PAGES_ADDRESS;
     899                 :            :                 s = true;
     900                 :            :         }
     901                 :            : 
     902                 :            :         address &= PAGE_MASK;
     903                 :            : 
     904                 :            :         memset(cmd, 0, sizeof(*cmd));
     905                 :            :         cmd->data[0]  = devid;
     906                 :            :         cmd->data[0] |= (qdep & 0xff) << 24;
     907                 :            :         cmd->data[1]  = devid;
     908                 :            :         cmd->data[2]  = lower_32_bits(address);
     909                 :            :         cmd->data[3]  = upper_32_bits(address);
     910                 :            :         CMD_SET_TYPE(cmd, CMD_INV_IOTLB_PAGES);
     911                 :            :         if (s)
     912                 :            :                 cmd->data[2] |= CMD_INV_IOMMU_PAGES_SIZE_MASK;
     913                 :            : }
     914                 :            : 
     915                 :          0 : static void build_inv_iommu_pasid(struct iommu_cmd *cmd, u16 domid, int pasid,
     916                 :            :                                   u64 address, bool size)
     917                 :            : {
     918                 :          0 :         memset(cmd, 0, sizeof(*cmd));
     919                 :            : 
     920                 :          0 :         address &= ~(0xfffULL);
     921                 :            : 
     922                 :          0 :         cmd->data[0]  = pasid;
     923                 :          0 :         cmd->data[1]  = domid;
     924                 :          0 :         cmd->data[2]  = lower_32_bits(address);
     925                 :          0 :         cmd->data[3]  = upper_32_bits(address);
     926                 :          0 :         cmd->data[2] |= CMD_INV_IOMMU_PAGES_PDE_MASK;
     927                 :          0 :         cmd->data[2] |= CMD_INV_IOMMU_PAGES_GN_MASK;
     928                 :          0 :         if (size)
     929                 :          0 :                 cmd->data[2] |= CMD_INV_IOMMU_PAGES_SIZE_MASK;
     930                 :          0 :         CMD_SET_TYPE(cmd, CMD_INV_IOMMU_PAGES);
     931                 :            : }
     932                 :            : 
     933                 :          0 : static void build_inv_iotlb_pasid(struct iommu_cmd *cmd, u16 devid, int pasid,
     934                 :            :                                   int qdep, u64 address, bool size)
     935                 :            : {
     936                 :          0 :         memset(cmd, 0, sizeof(*cmd));
     937                 :            : 
     938                 :          0 :         address &= ~(0xfffULL);
     939                 :            : 
     940                 :          0 :         cmd->data[0]  = devid;
     941                 :          0 :         cmd->data[0] |= ((pasid >> 8) & 0xff) << 16;
     942                 :          0 :         cmd->data[0] |= (qdep  & 0xff) << 24;
     943                 :          0 :         cmd->data[1]  = devid;
     944                 :          0 :         cmd->data[1] |= (pasid & 0xff) << 16;
     945                 :          0 :         cmd->data[2]  = lower_32_bits(address);
     946                 :          0 :         cmd->data[2] |= CMD_INV_IOMMU_PAGES_GN_MASK;
     947                 :          0 :         cmd->data[3]  = upper_32_bits(address);
     948                 :          0 :         if (size)
     949                 :          0 :                 cmd->data[2] |= CMD_INV_IOMMU_PAGES_SIZE_MASK;
     950                 :          0 :         CMD_SET_TYPE(cmd, CMD_INV_IOTLB_PAGES);
     951                 :            : }
     952                 :            : 
     953                 :          0 : static void build_complete_ppr(struct iommu_cmd *cmd, u16 devid, int pasid,
     954                 :            :                                int status, int tag, bool gn)
     955                 :            : {
     956                 :          0 :         memset(cmd, 0, sizeof(*cmd));
     957                 :            : 
     958                 :          0 :         cmd->data[0]  = devid;
     959                 :          0 :         if (gn) {
     960                 :          0 :                 cmd->data[1]  = pasid;
     961                 :          0 :                 cmd->data[2]  = CMD_INV_IOMMU_PAGES_GN_MASK;
     962                 :            :         }
     963                 :          0 :         cmd->data[3]  = tag & 0x1ff;
     964                 :          0 :         cmd->data[3] |= (status & PPR_STATUS_MASK) << PPR_STATUS_SHIFT;
     965                 :            : 
     966                 :          0 :         CMD_SET_TYPE(cmd, CMD_COMPLETE_PPR);
     967                 :            : }
     968                 :            : 
     969                 :          0 : static void build_inv_all(struct iommu_cmd *cmd)
     970                 :            : {
     971                 :          0 :         memset(cmd, 0, sizeof(*cmd));
     972                 :          0 :         CMD_SET_TYPE(cmd, CMD_INV_ALL);
     973                 :            : }
     974                 :            : 
     975                 :          0 : static void build_inv_irt(struct iommu_cmd *cmd, u16 devid)
     976                 :            : {
     977                 :          0 :         memset(cmd, 0, sizeof(*cmd));
     978                 :          0 :         cmd->data[0] = devid;
     979                 :          0 :         CMD_SET_TYPE(cmd, CMD_INV_IRT);
     980                 :            : }
     981                 :            : 
     982                 :            : /*
     983                 :            :  * Writes the command to the IOMMUs command buffer and informs the
     984                 :            :  * hardware about the new command.
     985                 :            :  */
     986                 :          0 : static int __iommu_queue_command_sync(struct amd_iommu *iommu,
     987                 :            :                                       struct iommu_cmd *cmd,
     988                 :            :                                       bool sync)
     989                 :            : {
     990                 :          0 :         unsigned int count = 0;
     991                 :          0 :         u32 left, next_tail;
     992                 :            : 
     993                 :          0 :         next_tail = (iommu->cmd_buf_tail + sizeof(*cmd)) % CMD_BUFFER_SIZE;
     994                 :          0 : again:
     995                 :          0 :         left      = (iommu->cmd_buf_head - next_tail) % CMD_BUFFER_SIZE;
     996                 :            : 
     997         [ #  # ]:          0 :         if (left <= 0x20) {
     998                 :            :                 /* Skip udelay() the first time around */
     999         [ #  # ]:          0 :                 if (count++) {
    1000         [ #  # ]:          0 :                         if (count == LOOP_TIMEOUT) {
    1001                 :          0 :                                 pr_err("Command buffer timeout\n");
    1002                 :          0 :                                 return -EIO;
    1003                 :            :                         }
    1004                 :            : 
    1005                 :          0 :                         udelay(1);
    1006                 :            :                 }
    1007                 :            : 
    1008                 :            :                 /* Update head and recheck remaining space */
    1009                 :          0 :                 iommu->cmd_buf_head = readl(iommu->mmio_base +
    1010                 :            :                                             MMIO_CMD_HEAD_OFFSET);
    1011                 :            : 
    1012                 :          0 :                 goto again;
    1013                 :            :         }
    1014                 :            : 
    1015                 :          0 :         copy_cmd_to_buffer(iommu, cmd);
    1016                 :            : 
    1017                 :            :         /* Do we need to make sure all commands are processed? */
    1018                 :          0 :         iommu->need_sync = sync;
    1019                 :            : 
    1020                 :          0 :         return 0;
    1021                 :            : }
    1022                 :            : 
    1023                 :          0 : static int iommu_queue_command_sync(struct amd_iommu *iommu,
    1024                 :            :                                     struct iommu_cmd *cmd,
    1025                 :            :                                     bool sync)
    1026                 :            : {
    1027                 :          0 :         unsigned long flags;
    1028                 :          0 :         int ret;
    1029                 :            : 
    1030                 :          0 :         raw_spin_lock_irqsave(&iommu->lock, flags);
    1031                 :          0 :         ret = __iommu_queue_command_sync(iommu, cmd, sync);
    1032                 :          0 :         raw_spin_unlock_irqrestore(&iommu->lock, flags);
    1033                 :            : 
    1034                 :          0 :         return ret;
    1035                 :            : }
    1036                 :            : 
    1037                 :          0 : static int iommu_queue_command(struct amd_iommu *iommu, struct iommu_cmd *cmd)
    1038                 :            : {
    1039                 :          0 :         return iommu_queue_command_sync(iommu, cmd, true);
    1040                 :            : }
    1041                 :            : 
    1042                 :            : /*
    1043                 :            :  * This function queues a completion wait command into the command
    1044                 :            :  * buffer of an IOMMU
    1045                 :            :  */
    1046                 :          0 : static int iommu_completion_wait(struct amd_iommu *iommu)
    1047                 :            : {
    1048                 :          0 :         struct iommu_cmd cmd;
    1049                 :          0 :         unsigned long flags;
    1050                 :          0 :         int ret;
    1051                 :            : 
    1052         [ #  # ]:          0 :         if (!iommu->need_sync)
    1053                 :            :                 return 0;
    1054                 :            : 
    1055                 :            : 
    1056                 :          0 :         build_completion_wait(&cmd, (u64)&iommu->cmd_sem);
    1057                 :            : 
    1058                 :          0 :         raw_spin_lock_irqsave(&iommu->lock, flags);
    1059                 :            : 
    1060                 :          0 :         iommu->cmd_sem = 0;
    1061                 :            : 
    1062                 :          0 :         ret = __iommu_queue_command_sync(iommu, &cmd, false);
    1063         [ #  # ]:          0 :         if (ret)
    1064                 :          0 :                 goto out_unlock;
    1065                 :            : 
    1066                 :          0 :         ret = wait_on_sem(&iommu->cmd_sem);
    1067                 :            : 
    1068                 :          0 : out_unlock:
    1069                 :          0 :         raw_spin_unlock_irqrestore(&iommu->lock, flags);
    1070                 :            : 
    1071                 :          0 :         return ret;
    1072                 :            : }
    1073                 :            : 
    1074                 :          0 : static int iommu_flush_dte(struct amd_iommu *iommu, u16 devid)
    1075                 :            : {
    1076                 :          0 :         struct iommu_cmd cmd;
    1077                 :            : 
    1078                 :          0 :         build_inv_dte(&cmd, devid);
    1079                 :            : 
    1080                 :          0 :         return iommu_queue_command(iommu, &cmd);
    1081                 :            : }
    1082                 :            : 
    1083                 :          0 : static void amd_iommu_flush_dte_all(struct amd_iommu *iommu)
    1084                 :            : {
    1085                 :          0 :         u32 devid;
    1086                 :            : 
    1087         [ #  # ]:          0 :         for (devid = 0; devid <= 0xffff; ++devid)
    1088                 :          0 :                 iommu_flush_dte(iommu, devid);
    1089                 :            : 
    1090                 :          0 :         iommu_completion_wait(iommu);
    1091                 :          0 : }
    1092                 :            : 
    1093                 :            : /*
    1094                 :            :  * This function uses heavy locking and may disable irqs for some time. But
    1095                 :            :  * this is no issue because it is only called during resume.
    1096                 :            :  */
    1097                 :          0 : static void amd_iommu_flush_tlb_all(struct amd_iommu *iommu)
    1098                 :            : {
    1099                 :          0 :         u32 dom_id;
    1100                 :            : 
    1101         [ #  # ]:          0 :         for (dom_id = 0; dom_id <= 0xffff; ++dom_id) {
    1102                 :          0 :                 struct iommu_cmd cmd;
    1103                 :          0 :                 build_inv_iommu_pages(&cmd, 0, CMD_INV_IOMMU_ALL_PAGES_ADDRESS,
    1104                 :            :                                       dom_id, 1);
    1105                 :          0 :                 iommu_queue_command(iommu, &cmd);
    1106                 :            :         }
    1107                 :            : 
    1108                 :          0 :         iommu_completion_wait(iommu);
    1109                 :          0 : }
    1110                 :            : 
    1111                 :          0 : static void amd_iommu_flush_tlb_domid(struct amd_iommu *iommu, u32 dom_id)
    1112                 :            : {
    1113                 :          0 :         struct iommu_cmd cmd;
    1114                 :            : 
    1115                 :          0 :         build_inv_iommu_pages(&cmd, 0, CMD_INV_IOMMU_ALL_PAGES_ADDRESS,
    1116                 :            :                               dom_id, 1);
    1117                 :          0 :         iommu_queue_command(iommu, &cmd);
    1118                 :            : 
    1119                 :          0 :         iommu_completion_wait(iommu);
    1120                 :          0 : }
    1121                 :            : 
    1122                 :          0 : static void amd_iommu_flush_all(struct amd_iommu *iommu)
    1123                 :            : {
    1124                 :          0 :         struct iommu_cmd cmd;
    1125                 :            : 
    1126                 :          0 :         build_inv_all(&cmd);
    1127                 :            : 
    1128                 :          0 :         iommu_queue_command(iommu, &cmd);
    1129                 :          0 :         iommu_completion_wait(iommu);
    1130                 :          0 : }
    1131                 :            : 
    1132                 :          0 : static void iommu_flush_irt(struct amd_iommu *iommu, u16 devid)
    1133                 :            : {
    1134                 :          0 :         struct iommu_cmd cmd;
    1135                 :            : 
    1136                 :          0 :         build_inv_irt(&cmd, devid);
    1137                 :            : 
    1138                 :          0 :         iommu_queue_command(iommu, &cmd);
    1139                 :          0 : }
    1140                 :            : 
    1141                 :          0 : static void amd_iommu_flush_irt_all(struct amd_iommu *iommu)
    1142                 :            : {
    1143                 :          0 :         u32 devid;
    1144                 :            : 
    1145         [ #  # ]:          0 :         for (devid = 0; devid <= MAX_DEV_TABLE_ENTRIES; devid++)
    1146                 :          0 :                 iommu_flush_irt(iommu, devid);
    1147                 :            : 
    1148                 :          0 :         iommu_completion_wait(iommu);
    1149                 :          0 : }
    1150                 :            : 
    1151                 :          0 : void iommu_flush_all_caches(struct amd_iommu *iommu)
    1152                 :            : {
    1153   [ #  #  #  # ]:          0 :         if (iommu_feature(iommu, FEATURE_IA)) {
    1154                 :          0 :                 amd_iommu_flush_all(iommu);
    1155                 :            :         } else {
    1156                 :          0 :                 amd_iommu_flush_dte_all(iommu);
    1157                 :          0 :                 amd_iommu_flush_irt_all(iommu);
    1158                 :          0 :                 amd_iommu_flush_tlb_all(iommu);
    1159                 :            :         }
    1160                 :          0 : }
    1161                 :            : 
    1162                 :            : /*
    1163                 :            :  * Command send function for flushing on-device TLB
    1164                 :            :  */
    1165                 :            : static int device_flush_iotlb(struct iommu_dev_data *dev_data,
    1166                 :            :                               u64 address, size_t size)
    1167                 :            : {
    1168                 :            :         struct amd_iommu *iommu;
    1169                 :            :         struct iommu_cmd cmd;
    1170                 :            :         int qdep;
    1171                 :            : 
    1172                 :            :         qdep     = dev_data->ats.qdep;
    1173                 :            :         iommu    = amd_iommu_rlookup_table[dev_data->devid];
    1174                 :            : 
    1175                 :            :         build_inv_iotlb_pages(&cmd, dev_data->devid, qdep, address, size);
    1176                 :            : 
    1177                 :            :         return iommu_queue_command(iommu, &cmd);
    1178                 :            : }
    1179                 :            : 
    1180                 :          0 : static int device_flush_dte_alias(struct pci_dev *pdev, u16 alias, void *data)
    1181                 :            : {
    1182                 :          0 :         struct amd_iommu *iommu = data;
    1183                 :            : 
    1184                 :          0 :         return iommu_flush_dte(iommu, alias);
    1185                 :            : }
    1186                 :            : 
    1187                 :            : /*
    1188                 :            :  * Command send function for invalidating a device table entry
    1189                 :            :  */
    1190                 :          0 : static int device_flush_dte(struct iommu_dev_data *dev_data)
    1191                 :            : {
    1192                 :          0 :         struct amd_iommu *iommu;
    1193                 :          0 :         u16 alias;
    1194                 :          0 :         int ret;
    1195                 :            : 
    1196                 :          0 :         iommu = amd_iommu_rlookup_table[dev_data->devid];
    1197                 :            : 
    1198         [ #  # ]:          0 :         if (dev_data->pdev)
    1199                 :          0 :                 ret = pci_for_each_dma_alias(dev_data->pdev,
    1200                 :            :                                              device_flush_dte_alias, iommu);
    1201                 :            :         else
    1202                 :          0 :                 ret = iommu_flush_dte(iommu, dev_data->devid);
    1203         [ #  # ]:          0 :         if (ret)
    1204                 :            :                 return ret;
    1205                 :            : 
    1206                 :          0 :         alias = amd_iommu_alias_table[dev_data->devid];
    1207         [ #  # ]:          0 :         if (alias != dev_data->devid) {
    1208                 :          0 :                 ret = iommu_flush_dte(iommu, alias);
    1209         [ #  # ]:          0 :                 if (ret)
    1210                 :            :                         return ret;
    1211                 :            :         }
    1212                 :            : 
    1213         [ #  # ]:          0 :         if (dev_data->ats.enabled)
    1214                 :          0 :                 ret = device_flush_iotlb(dev_data, 0, ~0UL);
    1215                 :            : 
    1216                 :            :         return ret;
    1217                 :            : }
    1218                 :            : 
    1219                 :            : /*
    1220                 :            :  * TLB invalidation function which is called from the mapping functions.
    1221                 :            :  * It invalidates a single PTE if the range to flush is within a single
    1222                 :            :  * page. Otherwise it flushes the whole TLB of the IOMMU.
    1223                 :            :  */
    1224                 :          0 : static void __domain_flush_pages(struct protection_domain *domain,
    1225                 :            :                                  u64 address, size_t size, int pde)
    1226                 :            : {
    1227                 :          0 :         struct iommu_dev_data *dev_data;
    1228                 :          0 :         struct iommu_cmd cmd;
    1229                 :          0 :         int ret = 0, i;
    1230                 :            : 
    1231                 :          0 :         build_inv_iommu_pages(&cmd, address, size, domain->id, pde);
    1232                 :            : 
    1233         [ #  # ]:          0 :         for (i = 0; i < amd_iommu_get_num_iommus(); ++i) {
    1234         [ #  # ]:          0 :                 if (!domain->dev_iommu[i])
    1235                 :          0 :                         continue;
    1236                 :            : 
    1237                 :            :                 /*
    1238                 :            :                  * Devices of this domain are behind this IOMMU
    1239                 :            :                  * We need a TLB flush
    1240                 :            :                  */
    1241                 :          0 :                 ret |= iommu_queue_command(amd_iommus[i], &cmd);
    1242                 :            :         }
    1243                 :            : 
    1244         [ #  # ]:          0 :         list_for_each_entry(dev_data, &domain->dev_list, list) {
    1245                 :            : 
    1246         [ #  # ]:          0 :                 if (!dev_data->ats.enabled)
    1247                 :          0 :                         continue;
    1248                 :            : 
    1249                 :          0 :                 ret |= device_flush_iotlb(dev_data, address, size);
    1250                 :            :         }
    1251                 :            : 
    1252         [ #  # ]:          0 :         WARN_ON(ret);
    1253                 :          0 : }
    1254                 :            : 
    1255                 :          0 : static void domain_flush_pages(struct protection_domain *domain,
    1256                 :            :                                u64 address, size_t size)
    1257                 :            : {
    1258                 :          0 :         __domain_flush_pages(domain, address, size, 0);
    1259                 :            : }
    1260                 :            : 
    1261                 :            : /* Flush the whole IO/TLB for a given protection domain - including PDE */
    1262                 :          0 : static void domain_flush_tlb_pde(struct protection_domain *domain)
    1263                 :            : {
    1264                 :          0 :         __domain_flush_pages(domain, 0, CMD_INV_IOMMU_ALL_PAGES_ADDRESS, 1);
    1265                 :            : }
    1266                 :            : 
    1267                 :          0 : static void domain_flush_complete(struct protection_domain *domain)
    1268                 :            : {
    1269                 :          0 :         int i;
    1270                 :            : 
    1271         [ #  # ]:          0 :         for (i = 0; i < amd_iommu_get_num_iommus(); ++i) {
    1272   [ #  #  #  # ]:          0 :                 if (domain && !domain->dev_iommu[i])
    1273                 :          0 :                         continue;
    1274                 :            : 
    1275                 :            :                 /*
    1276                 :            :                  * Devices of this domain are behind this IOMMU
    1277                 :            :                  * We need to wait for completion of all commands.
    1278                 :            :                  */
    1279                 :          0 :                 iommu_completion_wait(amd_iommus[i]);
    1280                 :            :         }
    1281                 :          0 : }
    1282                 :            : 
    1283                 :            : /* Flush the not present cache if it exists */
    1284                 :          0 : static void domain_flush_np_cache(struct protection_domain *domain,
    1285                 :            :                 dma_addr_t iova, size_t size)
    1286                 :            : {
    1287         [ #  # ]:          0 :         if (unlikely(amd_iommu_np_cache)) {
    1288                 :          0 :                 unsigned long flags;
    1289                 :            : 
    1290                 :          0 :                 spin_lock_irqsave(&domain->lock, flags);
    1291                 :          0 :                 domain_flush_pages(domain, iova, size);
    1292                 :          0 :                 domain_flush_complete(domain);
    1293                 :          0 :                 spin_unlock_irqrestore(&domain->lock, flags);
    1294                 :            :         }
    1295                 :          0 : }
    1296                 :            : 
    1297                 :            : 
    1298                 :            : /*
    1299                 :            :  * This function flushes the DTEs for all devices in domain
    1300                 :            :  */
    1301                 :          0 : static void domain_flush_devices(struct protection_domain *domain)
    1302                 :            : {
    1303                 :          0 :         struct iommu_dev_data *dev_data;
    1304                 :            : 
    1305         [ #  # ]:          0 :         list_for_each_entry(dev_data, &domain->dev_list, list)
    1306                 :          0 :                 device_flush_dte(dev_data);
    1307                 :            : }
    1308                 :            : 
    1309                 :            : /****************************************************************************
    1310                 :            :  *
    1311                 :            :  * The functions below are used the create the page table mappings for
    1312                 :            :  * unity mapped regions.
    1313                 :            :  *
    1314                 :            :  ****************************************************************************/
    1315                 :            : 
    1316                 :          0 : static void free_page_list(struct page *freelist)
    1317                 :            : {
    1318         [ #  # ]:          0 :         while (freelist != NULL) {
    1319                 :          0 :                 unsigned long p = (unsigned long)page_address(freelist);
    1320                 :          0 :                 freelist = freelist->freelist;
    1321                 :          0 :                 free_page(p);
    1322                 :            :         }
    1323                 :          0 : }
    1324                 :            : 
    1325                 :          0 : static struct page *free_pt_page(unsigned long pt, struct page *freelist)
    1326                 :            : {
    1327         [ #  # ]:          0 :         struct page *p = virt_to_page((void *)pt);
    1328                 :            : 
    1329                 :          0 :         p->freelist = freelist;
    1330                 :            : 
    1331                 :          0 :         return p;
    1332                 :            : }
    1333                 :            : 
    1334                 :            : #define DEFINE_FREE_PT_FN(LVL, FN)                                              \
    1335                 :            : static struct page *free_pt_##LVL (unsigned long __pt, struct page *freelist)   \
    1336                 :            : {                                                                               \
    1337                 :            :         unsigned long p;                                                        \
    1338                 :            :         u64 *pt;                                                                \
    1339                 :            :         int i;                                                                  \
    1340                 :            :                                                                                 \
    1341                 :            :         pt = (u64 *)__pt;                                                       \
    1342                 :            :                                                                                 \
    1343                 :            :         for (i = 0; i < 512; ++i) {                                          \
    1344                 :            :                 /* PTE present? */                                              \
    1345                 :            :                 if (!IOMMU_PTE_PRESENT(pt[i]))                                  \
    1346                 :            :                         continue;                                               \
    1347                 :            :                                                                                 \
    1348                 :            :                 /* Large PTE? */                                                \
    1349                 :            :                 if (PM_PTE_LEVEL(pt[i]) == 0 ||                                 \
    1350                 :            :                     PM_PTE_LEVEL(pt[i]) == 7)                                   \
    1351                 :            :                         continue;                                               \
    1352                 :            :                                                                                 \
    1353                 :            :                 p = (unsigned long)IOMMU_PTE_PAGE(pt[i]);                       \
    1354                 :            :                 freelist = FN(p, freelist);                                     \
    1355                 :            :         }                                                                       \
    1356                 :            :                                                                                 \
    1357                 :            :         return free_pt_page((unsigned long)pt, freelist);                       \
    1358                 :            : }
    1359                 :            : 
    1360   [ #  #  #  #  :          0 : DEFINE_FREE_PT_FN(l2, free_pt_page)
          #  #  #  #  #  
                      # ]
    1361   [ #  #  #  #  :          0 : DEFINE_FREE_PT_FN(l3, free_pt_l2)
             #  #  #  # ]
    1362   [ #  #  #  #  :          0 : DEFINE_FREE_PT_FN(l4, free_pt_l3)
             #  #  #  # ]
    1363   [ #  #  #  #  :          0 : DEFINE_FREE_PT_FN(l5, free_pt_l4)
             #  #  #  # ]
    1364   [ #  #  #  #  :          0 : DEFINE_FREE_PT_FN(l6, free_pt_l5)
             #  #  #  # ]
    1365                 :            : 
    1366                 :          0 : static struct page *free_sub_pt(unsigned long root, int mode,
    1367                 :            :                                 struct page *freelist)
    1368                 :            : {
    1369   [ #  #  #  #  :          0 :         switch (mode) {
             #  #  #  # ]
    1370                 :            :         case PAGE_MODE_NONE:
    1371                 :            :         case PAGE_MODE_7_LEVEL:
    1372                 :            :                 break;
    1373                 :            :         case PAGE_MODE_1_LEVEL:
    1374         [ #  # ]:          0 :                 freelist = free_pt_page(root, freelist);
    1375                 :          0 :                 break;
    1376                 :          0 :         case PAGE_MODE_2_LEVEL:
    1377                 :          0 :                 freelist = free_pt_l2(root, freelist);
    1378                 :          0 :                 break;
    1379                 :          0 :         case PAGE_MODE_3_LEVEL:
    1380                 :          0 :                 freelist = free_pt_l3(root, freelist);
    1381                 :          0 :                 break;
    1382                 :          0 :         case PAGE_MODE_4_LEVEL:
    1383                 :          0 :                 freelist = free_pt_l4(root, freelist);
    1384                 :          0 :                 break;
    1385                 :          0 :         case PAGE_MODE_5_LEVEL:
    1386                 :          0 :                 freelist = free_pt_l5(root, freelist);
    1387                 :          0 :                 break;
    1388                 :          0 :         case PAGE_MODE_6_LEVEL:
    1389                 :          0 :                 freelist = free_pt_l6(root, freelist);
    1390                 :          0 :                 break;
    1391                 :          0 :         default:
    1392                 :          0 :                 BUG();
    1393                 :            :         }
    1394                 :            : 
    1395                 :          0 :         return freelist;
    1396                 :            : }
    1397                 :            : 
    1398                 :            : static void free_pagetable(struct protection_domain *domain)
    1399                 :            : {
    1400                 :            :         unsigned long root = (unsigned long)domain->pt_root;
    1401                 :            :         struct page *freelist = NULL;
    1402                 :            : 
    1403                 :            :         BUG_ON(domain->mode < PAGE_MODE_NONE ||
    1404                 :            :                domain->mode > PAGE_MODE_6_LEVEL);
    1405                 :            : 
    1406                 :            :         freelist = free_sub_pt(root, domain->mode, freelist);
    1407                 :            : 
    1408                 :            :         free_page_list(freelist);
    1409                 :            : }
    1410                 :            : 
    1411                 :            : /*
    1412                 :            :  * This function is used to add another level to an IO page table. Adding
    1413                 :            :  * another level increases the size of the address space by 9 bits to a size up
    1414                 :            :  * to 64 bits.
    1415                 :            :  */
    1416                 :          0 : static bool increase_address_space(struct protection_domain *domain,
    1417                 :            :                                    unsigned long address,
    1418                 :            :                                    gfp_t gfp)
    1419                 :            : {
    1420                 :          0 :         unsigned long flags;
    1421                 :          0 :         bool ret = false;
    1422                 :          0 :         u64 *pte;
    1423                 :            : 
    1424                 :          0 :         spin_lock_irqsave(&domain->lock, flags);
    1425                 :            : 
    1426   [ #  #  #  # ]:          0 :         if (address <= PM_LEVEL_SIZE(domain->mode) ||
    1427   [ #  #  #  # ]:          0 :             WARN_ON_ONCE(domain->mode == PAGE_MODE_6_LEVEL))
    1428                 :          0 :                 goto out;
    1429                 :            : 
    1430                 :          0 :         pte = (void *)get_zeroed_page(gfp);
    1431         [ #  # ]:          0 :         if (!pte)
    1432                 :          0 :                 goto out;
    1433                 :            : 
    1434         [ #  # ]:          0 :         *pte             = PM_LEVEL_PDE(domain->mode,
    1435                 :            :                                         iommu_virt_to_phys(domain->pt_root));
    1436                 :          0 :         domain->pt_root  = pte;
    1437                 :          0 :         domain->mode    += 1;
    1438                 :            : 
    1439                 :          0 :         ret = true;
    1440                 :            : 
    1441                 :          0 : out:
    1442                 :          0 :         spin_unlock_irqrestore(&domain->lock, flags);
    1443                 :            : 
    1444                 :          0 :         return ret;
    1445                 :            : }
    1446                 :            : 
    1447                 :          0 : static u64 *alloc_pte(struct protection_domain *domain,
    1448                 :            :                       unsigned long address,
    1449                 :            :                       unsigned long page_size,
    1450                 :            :                       u64 **pte_page,
    1451                 :            :                       gfp_t gfp,
    1452                 :            :                       bool *updated)
    1453                 :            : {
    1454                 :          0 :         int level, end_lvl;
    1455                 :          0 :         u64 *pte, *page;
    1456                 :            : 
    1457   [ #  #  #  # ]:          0 :         BUG_ON(!is_power_of_2(page_size));
    1458                 :            : 
    1459   [ #  #  #  # ]:          0 :         while (address > PM_LEVEL_SIZE(domain->mode))
    1460   [ #  #  #  # ]:          0 :                 *updated = increase_address_space(domain, address, gfp) || *updated;
    1461                 :            : 
    1462                 :          0 :         level   = domain->mode - 1;
    1463                 :          0 :         pte     = &domain->pt_root[PM_LEVEL_INDEX(level, address)];
    1464                 :          0 :         address = PAGE_SIZE_ALIGN(address, page_size);
    1465                 :          0 :         end_lvl = PAGE_SIZE_LEVEL(page_size);
    1466                 :            : 
    1467         [ #  # ]:          0 :         while (level > end_lvl) {
    1468                 :          0 :                 u64 __pte, __npte;
    1469                 :          0 :                 int pte_level;
    1470                 :            : 
    1471                 :          0 :                 __pte     = *pte;
    1472                 :          0 :                 pte_level = PM_PTE_LEVEL(__pte);
    1473                 :            : 
    1474                 :            :                 /*
    1475                 :            :                  * If we replace a series of large PTEs, we need
    1476                 :            :                  * to tear down all of them.
    1477                 :            :                  */
    1478   [ #  #  #  # ]:          0 :                 if (IOMMU_PTE_PRESENT(__pte) &&
    1479                 :            :                     pte_level == PAGE_MODE_7_LEVEL) {
    1480                 :          0 :                         unsigned long count, i;
    1481                 :          0 :                         u64 *lpte;
    1482                 :            : 
    1483                 :          0 :                         lpte = first_pte_l7(pte, NULL, &count);
    1484                 :            : 
    1485                 :            :                         /*
    1486                 :            :                          * Unmap the replicated PTEs that still match the
    1487                 :            :                          * original large mapping
    1488                 :            :                          */
    1489         [ #  # ]:          0 :                         for (i = 0; i < count; ++i)
    1490                 :          0 :                                 cmpxchg64(&lpte[i], __pte, 0ULL);
    1491                 :            : 
    1492                 :          0 :                         *updated = true;
    1493                 :          0 :                         continue;
    1494                 :            :                 }
    1495                 :            : 
    1496   [ #  #  #  # ]:          0 :                 if (!IOMMU_PTE_PRESENT(__pte) ||
    1497                 :            :                     pte_level == PAGE_MODE_NONE) {
    1498                 :          0 :                         page = (u64 *)get_zeroed_page(gfp);
    1499                 :            : 
    1500         [ #  # ]:          0 :                         if (!page)
    1501                 :            :                                 return NULL;
    1502                 :            : 
    1503         [ #  # ]:          0 :                         __npte = PM_LEVEL_PDE(level, iommu_virt_to_phys(page));
    1504                 :            : 
    1505                 :            :                         /* pte could have been changed somewhere. */
    1506         [ #  # ]:          0 :                         if (cmpxchg64(pte, __pte, __npte) != __pte)
    1507                 :          0 :                                 free_page((unsigned long)page);
    1508         [ #  # ]:          0 :                         else if (IOMMU_PTE_PRESENT(__pte))
    1509                 :          0 :                                 *updated = true;
    1510                 :            : 
    1511                 :          0 :                         continue;
    1512                 :            :                 }
    1513                 :            : 
    1514                 :            :                 /* No level skipping support yet */
    1515         [ #  # ]:          0 :                 if (pte_level != level)
    1516                 :            :                         return NULL;
    1517                 :            : 
    1518                 :          0 :                 level -= 1;
    1519                 :            : 
    1520         [ #  # ]:          0 :                 pte = IOMMU_PTE_PAGE(__pte);
    1521                 :            : 
    1522         [ #  # ]:          0 :                 if (pte_page && level == end_lvl)
    1523                 :          0 :                         *pte_page = pte;
    1524                 :            : 
    1525                 :          0 :                 pte = &pte[PM_LEVEL_INDEX(level, address)];
    1526                 :            :         }
    1527                 :            : 
    1528                 :            :         return pte;
    1529                 :            : }
    1530                 :            : 
    1531                 :            : /*
    1532                 :            :  * This function checks if there is a PTE for a given dma address. If
    1533                 :            :  * there is one, it returns the pointer to it.
    1534                 :            :  */
    1535                 :            : static u64 *fetch_pte(struct protection_domain *domain,
    1536                 :            :                       unsigned long address,
    1537                 :            :                       unsigned long *page_size)
    1538                 :            : {
    1539                 :            :         int level;
    1540                 :            :         u64 *pte;
    1541                 :            : 
    1542                 :            :         *page_size = 0;
    1543                 :            : 
    1544                 :            :         if (address > PM_LEVEL_SIZE(domain->mode))
    1545                 :            :                 return NULL;
    1546                 :            : 
    1547                 :            :         level      =  domain->mode - 1;
    1548                 :            :         pte        = &domain->pt_root[PM_LEVEL_INDEX(level, address)];
    1549                 :            :         *page_size =  PTE_LEVEL_PAGE_SIZE(level);
    1550                 :            : 
    1551                 :            :         while (level > 0) {
    1552                 :            : 
    1553                 :            :                 /* Not Present */
    1554                 :            :                 if (!IOMMU_PTE_PRESENT(*pte))
    1555                 :            :                         return NULL;
    1556                 :            : 
    1557                 :            :                 /* Large PTE */
    1558                 :            :                 if (PM_PTE_LEVEL(*pte) == 7 ||
    1559                 :            :                     PM_PTE_LEVEL(*pte) == 0)
    1560                 :            :                         break;
    1561                 :            : 
    1562                 :            :                 /* No level skipping support yet */
    1563                 :            :                 if (PM_PTE_LEVEL(*pte) != level)
    1564                 :            :                         return NULL;
    1565                 :            : 
    1566                 :            :                 level -= 1;
    1567                 :            : 
    1568                 :            :                 /* Walk to the next level */
    1569                 :            :                 pte        = IOMMU_PTE_PAGE(*pte);
    1570                 :            :                 pte        = &pte[PM_LEVEL_INDEX(level, address)];
    1571                 :            :                 *page_size = PTE_LEVEL_PAGE_SIZE(level);
    1572                 :            :         }
    1573                 :            : 
    1574                 :            :         /*
    1575                 :            :          * If we have a series of large PTEs, make
    1576                 :            :          * sure to return a pointer to the first one.
    1577                 :            :          */
    1578                 :            :         if (PM_PTE_LEVEL(*pte) == PAGE_MODE_7_LEVEL)
    1579                 :            :                 pte = first_pte_l7(pte, page_size, NULL);
    1580                 :            : 
    1581                 :            :         return pte;
    1582                 :            : }
    1583                 :            : 
    1584                 :          0 : static struct page *free_clear_pte(u64 *pte, u64 pteval, struct page *freelist)
    1585                 :            : {
    1586                 :          0 :         unsigned long pt;
    1587                 :          0 :         int mode;
    1588                 :            : 
    1589         [ #  # ]:          0 :         while (cmpxchg64(pte, pteval, 0) != pteval) {
    1590                 :          0 :                 pr_warn("AMD-Vi: IOMMU pte changed since we read it\n");
    1591                 :          0 :                 pteval = *pte;
    1592                 :            :         }
    1593                 :            : 
    1594         [ #  # ]:          0 :         if (!IOMMU_PTE_PRESENT(pteval))
    1595                 :            :                 return freelist;
    1596                 :            : 
    1597                 :          0 :         pt   = (unsigned long)IOMMU_PTE_PAGE(pteval);
    1598                 :          0 :         mode = IOMMU_PTE_MODE(pteval);
    1599                 :            : 
    1600                 :          0 :         return free_sub_pt(pt, mode, freelist);
    1601                 :            : }
    1602                 :            : 
    1603                 :            : /*
    1604                 :            :  * Generic mapping functions. It maps a physical address into a DMA
    1605                 :            :  * address space. It allocates the page table pages if necessary.
    1606                 :            :  * In the future it can be extended to a generic mapping function
    1607                 :            :  * supporting all features of AMD IOMMU page tables like level skipping
    1608                 :            :  * and full 64 bit address spaces.
    1609                 :            :  */
    1610                 :          0 : static int iommu_map_page(struct protection_domain *dom,
    1611                 :            :                           unsigned long bus_addr,
    1612                 :            :                           unsigned long phys_addr,
    1613                 :            :                           unsigned long page_size,
    1614                 :            :                           int prot,
    1615                 :            :                           gfp_t gfp)
    1616                 :            : {
    1617                 :          0 :         struct page *freelist = NULL;
    1618                 :          0 :         bool updated = false;
    1619                 :          0 :         u64 __pte, *pte;
    1620                 :          0 :         int ret, i, count;
    1621                 :            : 
    1622         [ #  # ]:          0 :         BUG_ON(!IS_ALIGNED(bus_addr, page_size));
    1623         [ #  # ]:          0 :         BUG_ON(!IS_ALIGNED(phys_addr, page_size));
    1624                 :            : 
    1625                 :          0 :         ret = -EINVAL;
    1626         [ #  # ]:          0 :         if (!(prot & IOMMU_PROT_MASK))
    1627                 :          0 :                 goto out;
    1628                 :            : 
    1629                 :          0 :         count = PAGE_SIZE_PTE_COUNT(page_size);
    1630                 :          0 :         pte   = alloc_pte(dom, bus_addr, page_size, NULL, gfp, &updated);
    1631                 :            : 
    1632                 :          0 :         ret = -ENOMEM;
    1633         [ #  # ]:          0 :         if (!pte)
    1634                 :          0 :                 goto out;
    1635                 :            : 
    1636         [ #  # ]:          0 :         for (i = 0; i < count; ++i)
    1637                 :          0 :                 freelist = free_clear_pte(&pte[i], pte[i], freelist);
    1638                 :            : 
    1639         [ #  # ]:          0 :         if (freelist != NULL)
    1640                 :          0 :                 updated = true;
    1641                 :            : 
    1642         [ #  # ]:          0 :         if (count > 1) {
    1643                 :          0 :                 __pte = PAGE_SIZE_PTE(__sme_set(phys_addr), page_size);
    1644                 :          0 :                 __pte |= PM_LEVEL_ENC(7) | IOMMU_PTE_PR | IOMMU_PTE_FC;
    1645                 :            :         } else
    1646                 :          0 :                 __pte = __sme_set(phys_addr) | IOMMU_PTE_PR | IOMMU_PTE_FC;
    1647                 :            : 
    1648         [ #  # ]:          0 :         if (prot & IOMMU_PROT_IR)
    1649                 :          0 :                 __pte |= IOMMU_PTE_IR;
    1650         [ #  # ]:          0 :         if (prot & IOMMU_PROT_IW)
    1651                 :          0 :                 __pte |= IOMMU_PTE_IW;
    1652                 :            : 
    1653         [ #  # ]:          0 :         for (i = 0; i < count; ++i)
    1654                 :          0 :                 pte[i] = __pte;
    1655                 :            : 
    1656                 :            :         ret = 0;
    1657                 :            : 
    1658                 :          0 : out:
    1659         [ #  # ]:          0 :         if (updated) {
    1660                 :          0 :                 unsigned long flags;
    1661                 :            : 
    1662                 :          0 :                 spin_lock_irqsave(&dom->lock, flags);
    1663                 :          0 :                 update_domain(dom);
    1664                 :          0 :                 spin_unlock_irqrestore(&dom->lock, flags);
    1665                 :            :         }
    1666                 :            : 
    1667                 :            :         /* Everything flushed out, free pages now */
    1668                 :          0 :         free_page_list(freelist);
    1669                 :            : 
    1670                 :          0 :         return ret;
    1671                 :            : }
    1672                 :            : 
    1673                 :          0 : static unsigned long iommu_unmap_page(struct protection_domain *dom,
    1674                 :            :                                       unsigned long bus_addr,
    1675                 :            :                                       unsigned long page_size)
    1676                 :            : {
    1677                 :          0 :         unsigned long long unmapped;
    1678                 :          0 :         unsigned long unmap_size;
    1679                 :          0 :         u64 *pte;
    1680                 :            : 
    1681   [ #  #  #  # ]:          0 :         BUG_ON(!is_power_of_2(page_size));
    1682                 :            : 
    1683                 :            :         unmapped = 0;
    1684                 :            : 
    1685         [ #  # ]:          0 :         while (unmapped < page_size) {
    1686                 :            : 
    1687                 :          0 :                 pte = fetch_pte(dom, bus_addr, &unmap_size);
    1688                 :            : 
    1689         [ #  # ]:          0 :                 if (pte) {
    1690                 :          0 :                         int i, count;
    1691                 :            : 
    1692                 :          0 :                         count = PAGE_SIZE_PTE_COUNT(unmap_size);
    1693         [ #  # ]:          0 :                         for (i = 0; i < count; i++)
    1694                 :          0 :                                 pte[i] = 0ULL;
    1695                 :            :                 }
    1696                 :            : 
    1697                 :          0 :                 bus_addr  = (bus_addr & ~(unmap_size - 1)) + unmap_size;
    1698                 :          0 :                 unmapped += unmap_size;
    1699                 :            :         }
    1700                 :            : 
    1701   [ #  #  #  # ]:          0 :         BUG_ON(unmapped && !is_power_of_2(unmapped));
    1702                 :            : 
    1703                 :          0 :         return unmapped;
    1704                 :            : }
    1705                 :            : 
    1706                 :            : /****************************************************************************
    1707                 :            :  *
    1708                 :            :  * The next functions belong to the domain allocation. A domain is
    1709                 :            :  * allocated for every IOMMU as the default domain. If device isolation
    1710                 :            :  * is enabled, every device get its own domain. The most important thing
    1711                 :            :  * about domains is the page table mapping the DMA address space they
    1712                 :            :  * contain.
    1713                 :            :  *
    1714                 :            :  ****************************************************************************/
    1715                 :            : 
    1716                 :          0 : static u16 domain_id_alloc(void)
    1717                 :            : {
    1718                 :          0 :         int id;
    1719                 :            : 
    1720                 :          0 :         spin_lock(&pd_bitmap_lock);
    1721                 :          0 :         id = find_first_zero_bit(amd_iommu_pd_alloc_bitmap, MAX_DOMAIN_ID);
    1722         [ #  # ]:          0 :         BUG_ON(id == 0);
    1723         [ #  # ]:          0 :         if (id > 0 && id < MAX_DOMAIN_ID)
    1724                 :          0 :                 __set_bit(id, amd_iommu_pd_alloc_bitmap);
    1725                 :            :         else
    1726                 :            :                 id = 0;
    1727                 :          0 :         spin_unlock(&pd_bitmap_lock);
    1728                 :            : 
    1729                 :          0 :         return id;
    1730                 :            : }
    1731                 :            : 
    1732                 :          0 : static void domain_id_free(int id)
    1733                 :            : {
    1734                 :          0 :         spin_lock(&pd_bitmap_lock);
    1735         [ #  # ]:          0 :         if (id > 0 && id < MAX_DOMAIN_ID)
    1736                 :          0 :                 __clear_bit(id, amd_iommu_pd_alloc_bitmap);
    1737                 :          0 :         spin_unlock(&pd_bitmap_lock);
    1738                 :          0 : }
    1739                 :            : 
    1740                 :          0 : static void free_gcr3_tbl_level1(u64 *tbl)
    1741                 :            : {
    1742                 :          0 :         u64 *ptr;
    1743                 :          0 :         int i;
    1744                 :            : 
    1745         [ #  # ]:          0 :         for (i = 0; i < 512; ++i) {
    1746         [ #  # ]:          0 :                 if (!(tbl[i] & GCR3_VALID))
    1747                 :          0 :                         continue;
    1748                 :            : 
    1749                 :          0 :                 ptr = iommu_phys_to_virt(tbl[i] & PAGE_MASK);
    1750                 :            : 
    1751                 :          0 :                 free_page((unsigned long)ptr);
    1752                 :            :         }
    1753                 :          0 : }
    1754                 :            : 
    1755                 :          0 : static void free_gcr3_tbl_level2(u64 *tbl)
    1756                 :            : {
    1757                 :          0 :         u64 *ptr;
    1758                 :          0 :         int i;
    1759                 :            : 
    1760         [ #  # ]:          0 :         for (i = 0; i < 512; ++i) {
    1761         [ #  # ]:          0 :                 if (!(tbl[i] & GCR3_VALID))
    1762                 :          0 :                         continue;
    1763                 :            : 
    1764                 :          0 :                 ptr = iommu_phys_to_virt(tbl[i] & PAGE_MASK);
    1765                 :            : 
    1766                 :          0 :                 free_gcr3_tbl_level1(ptr);
    1767                 :            :         }
    1768                 :          0 : }
    1769                 :            : 
    1770                 :            : static void free_gcr3_table(struct protection_domain *domain)
    1771                 :            : {
    1772                 :            :         if (domain->glx == 2)
    1773                 :            :                 free_gcr3_tbl_level2(domain->gcr3_tbl);
    1774                 :            :         else if (domain->glx == 1)
    1775                 :            :                 free_gcr3_tbl_level1(domain->gcr3_tbl);
    1776                 :            :         else
    1777                 :            :                 BUG_ON(domain->glx != 0);
    1778                 :            : 
    1779                 :            :         free_page((unsigned long)domain->gcr3_tbl);
    1780                 :            : }
    1781                 :            : 
    1782                 :            : /*
    1783                 :            :  * Free a domain, only used if something went wrong in the
    1784                 :            :  * allocation path and we need to free an already allocated page table
    1785                 :            :  */
    1786                 :          0 : static void dma_ops_domain_free(struct protection_domain *domain)
    1787                 :            : {
    1788         [ #  # ]:          0 :         if (!domain)
    1789                 :            :                 return;
    1790                 :            : 
    1791                 :          0 :         iommu_put_dma_cookie(&domain->domain);
    1792                 :            : 
    1793                 :          0 :         free_pagetable(domain);
    1794                 :            : 
    1795         [ #  # ]:          0 :         if (domain->id)
    1796                 :          0 :                 domain_id_free(domain->id);
    1797                 :            : 
    1798                 :          0 :         kfree(domain);
    1799                 :            : }
    1800                 :            : 
    1801                 :            : /*
    1802                 :            :  * Allocates a new protection domain usable for the dma_ops functions.
    1803                 :            :  * It also initializes the page table and the address allocator data
    1804                 :            :  * structures required for the dma_ops interface
    1805                 :            :  */
    1806                 :          0 : static struct protection_domain *dma_ops_domain_alloc(void)
    1807                 :            : {
    1808                 :          0 :         struct protection_domain *domain;
    1809                 :            : 
    1810                 :          0 :         domain = kzalloc(sizeof(struct protection_domain), GFP_KERNEL);
    1811         [ #  # ]:          0 :         if (!domain)
    1812                 :            :                 return NULL;
    1813                 :            : 
    1814                 :          0 :         if (protection_domain_init(domain))
    1815                 :          0 :                 goto free_domain;
    1816                 :            : 
    1817                 :          0 :         domain->mode = PAGE_MODE_3_LEVEL;
    1818                 :          0 :         domain->pt_root = (void *)get_zeroed_page(GFP_KERNEL);
    1819                 :          0 :         domain->flags = PD_DMA_OPS_MASK;
    1820         [ #  # ]:          0 :         if (!domain->pt_root)
    1821                 :          0 :                 goto free_domain;
    1822                 :            : 
    1823         [ #  # ]:          0 :         if (iommu_get_dma_cookie(&domain->domain) == -ENOMEM)
    1824                 :          0 :                 goto free_domain;
    1825                 :            : 
    1826                 :            :         return domain;
    1827                 :            : 
    1828                 :          0 : free_domain:
    1829                 :          0 :         dma_ops_domain_free(domain);
    1830                 :            : 
    1831                 :          0 :         return NULL;
    1832                 :            : }
    1833                 :            : 
    1834                 :            : /*
    1835                 :            :  * little helper function to check whether a given protection domain is a
    1836                 :            :  * dma_ops domain
    1837                 :            :  */
    1838                 :          0 : static bool dma_ops_domain(struct protection_domain *domain)
    1839                 :            : {
    1840                 :          0 :         return domain->flags & PD_DMA_OPS_MASK;
    1841                 :            : }
    1842                 :            : 
    1843                 :          0 : static void set_dte_entry(u16 devid, struct protection_domain *domain,
    1844                 :            :                           bool ats, bool ppr)
    1845                 :            : {
    1846                 :          0 :         u64 pte_root = 0;
    1847                 :          0 :         u64 flags = 0;
    1848                 :          0 :         u32 old_domid;
    1849                 :            : 
    1850         [ #  # ]:          0 :         if (domain->mode != PAGE_MODE_NONE)
    1851         [ #  # ]:          0 :                 pte_root = iommu_virt_to_phys(domain->pt_root);
    1852                 :            : 
    1853                 :          0 :         pte_root |= (domain->mode & DEV_ENTRY_MODE_MASK)
    1854                 :          0 :                     << DEV_ENTRY_MODE_SHIFT;
    1855                 :          0 :         pte_root |= DTE_FLAG_IR | DTE_FLAG_IW | DTE_FLAG_V | DTE_FLAG_TV;
    1856                 :            : 
    1857                 :          0 :         flags = amd_iommu_dev_table[devid].data[1];
    1858                 :            : 
    1859         [ #  # ]:          0 :         if (ats)
    1860                 :          0 :                 flags |= DTE_FLAG_IOTLB;
    1861                 :            : 
    1862         [ #  # ]:          0 :         if (ppr) {
    1863                 :          0 :                 struct amd_iommu *iommu = amd_iommu_rlookup_table[devid];
    1864                 :            : 
    1865   [ #  #  #  # ]:          0 :                 if (iommu_feature(iommu, FEATURE_EPHSUP))
    1866                 :          0 :                         pte_root |= 1ULL << DEV_ENTRY_PPR;
    1867                 :            :         }
    1868                 :            : 
    1869         [ #  # ]:          0 :         if (domain->flags & PD_IOMMUV2_MASK) {
    1870         [ #  # ]:          0 :                 u64 gcr3 = iommu_virt_to_phys(domain->gcr3_tbl);
    1871                 :          0 :                 u64 glx  = domain->glx;
    1872                 :          0 :                 u64 tmp;
    1873                 :            : 
    1874                 :          0 :                 pte_root |= DTE_FLAG_GV;
    1875                 :          0 :                 pte_root |= (glx & DTE_GLX_MASK) << DTE_GLX_SHIFT;
    1876                 :            : 
    1877                 :            :                 /* First mask out possible old values for GCR3 table */
    1878                 :          0 :                 tmp = DTE_GCR3_VAL_B(~0ULL) << DTE_GCR3_SHIFT_B;
    1879                 :          0 :                 flags    &= ~tmp;
    1880                 :            : 
    1881                 :          0 :                 tmp = DTE_GCR3_VAL_C(~0ULL) << DTE_GCR3_SHIFT_C;
    1882                 :          0 :                 flags    &= ~tmp;
    1883                 :            : 
    1884                 :            :                 /* Encode GCR3 table into DTE */
    1885                 :          0 :                 tmp = DTE_GCR3_VAL_A(gcr3) << DTE_GCR3_SHIFT_A;
    1886                 :          0 :                 pte_root |= tmp;
    1887                 :            : 
    1888                 :          0 :                 tmp = DTE_GCR3_VAL_B(gcr3) << DTE_GCR3_SHIFT_B;
    1889                 :          0 :                 flags    |= tmp;
    1890                 :            : 
    1891                 :          0 :                 tmp = DTE_GCR3_VAL_C(gcr3) << DTE_GCR3_SHIFT_C;
    1892                 :          0 :                 flags    |= tmp;
    1893                 :            :         }
    1894                 :            : 
    1895                 :          0 :         flags &= ~DEV_DOMID_MASK;
    1896                 :          0 :         flags |= domain->id;
    1897                 :            : 
    1898                 :          0 :         old_domid = amd_iommu_dev_table[devid].data[1] & DEV_DOMID_MASK;
    1899                 :          0 :         amd_iommu_dev_table[devid].data[1]  = flags;
    1900                 :          0 :         amd_iommu_dev_table[devid].data[0]  = pte_root;
    1901                 :            : 
    1902                 :            :         /*
    1903                 :            :          * A kdump kernel might be replacing a domain ID that was copied from
    1904                 :            :          * the previous kernel--if so, it needs to flush the translation cache
    1905                 :            :          * entries for the old domain ID that is being overwritten
    1906                 :            :          */
    1907         [ #  # ]:          0 :         if (old_domid) {
    1908                 :          0 :                 struct amd_iommu *iommu = amd_iommu_rlookup_table[devid];
    1909                 :            : 
    1910                 :          0 :                 amd_iommu_flush_tlb_domid(iommu, old_domid);
    1911                 :            :         }
    1912                 :          0 : }
    1913                 :            : 
    1914                 :          0 : static void clear_dte_entry(u16 devid)
    1915                 :            : {
    1916                 :            :         /* remove entry from the device table seen by the hardware */
    1917                 :          0 :         amd_iommu_dev_table[devid].data[0]  = DTE_FLAG_V | DTE_FLAG_TV;
    1918                 :          0 :         amd_iommu_dev_table[devid].data[1] &= DTE_FLAG_MASK;
    1919                 :            : 
    1920                 :          0 :         amd_iommu_apply_erratum_63(devid);
    1921                 :          0 : }
    1922                 :            : 
    1923                 :          0 : static void do_attach(struct iommu_dev_data *dev_data,
    1924                 :            :                       struct protection_domain *domain)
    1925                 :            : {
    1926                 :          0 :         struct amd_iommu *iommu;
    1927                 :          0 :         bool ats;
    1928                 :            : 
    1929                 :          0 :         iommu = amd_iommu_rlookup_table[dev_data->devid];
    1930                 :          0 :         ats   = dev_data->ats.enabled;
    1931                 :            : 
    1932                 :            :         /* Update data structures */
    1933                 :          0 :         dev_data->domain = domain;
    1934                 :          0 :         list_add(&dev_data->list, &domain->dev_list);
    1935                 :            : 
    1936                 :            :         /* Do reference counting */
    1937                 :          0 :         domain->dev_iommu[iommu->index] += 1;
    1938                 :          0 :         domain->dev_cnt                 += 1;
    1939                 :            : 
    1940                 :            :         /* Update device table */
    1941                 :          0 :         set_dte_entry(dev_data->devid, domain, ats, dev_data->iommu_v2);
    1942                 :          0 :         clone_aliases(dev_data->pdev);
    1943                 :            : 
    1944                 :          0 :         device_flush_dte(dev_data);
    1945                 :          0 : }
    1946                 :            : 
    1947                 :          0 : static void do_detach(struct iommu_dev_data *dev_data)
    1948                 :            : {
    1949                 :          0 :         struct protection_domain *domain = dev_data->domain;
    1950                 :          0 :         struct amd_iommu *iommu;
    1951                 :            : 
    1952                 :          0 :         iommu = amd_iommu_rlookup_table[dev_data->devid];
    1953                 :            : 
    1954                 :            :         /* Update data structures */
    1955                 :          0 :         dev_data->domain = NULL;
    1956                 :          0 :         list_del(&dev_data->list);
    1957                 :          0 :         clear_dte_entry(dev_data->devid);
    1958                 :          0 :         clone_aliases(dev_data->pdev);
    1959                 :            : 
    1960                 :            :         /* Flush the DTE entry */
    1961                 :          0 :         device_flush_dte(dev_data);
    1962                 :            : 
    1963                 :            :         /* Flush IOTLB */
    1964                 :          0 :         domain_flush_tlb_pde(domain);
    1965                 :            : 
    1966                 :            :         /* Wait for the flushes to finish */
    1967                 :          0 :         domain_flush_complete(domain);
    1968                 :            : 
    1969                 :            :         /* decrease reference counters - needs to happen after the flushes */
    1970                 :          0 :         domain->dev_iommu[iommu->index] -= 1;
    1971                 :          0 :         domain->dev_cnt                 -= 1;
    1972                 :          0 : }
    1973                 :            : 
    1974                 :          0 : static void pdev_iommuv2_disable(struct pci_dev *pdev)
    1975                 :            : {
    1976                 :          0 :         pci_disable_ats(pdev);
    1977                 :          0 :         pci_disable_pri(pdev);
    1978                 :          0 :         pci_disable_pasid(pdev);
    1979                 :          0 : }
    1980                 :            : 
    1981                 :            : /* FIXME: Change generic reset-function to do the same */
    1982                 :          0 : static int pri_reset_while_enabled(struct pci_dev *pdev)
    1983                 :            : {
    1984                 :          0 :         u16 control;
    1985                 :          0 :         int pos;
    1986                 :            : 
    1987                 :          0 :         pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_PRI);
    1988         [ #  # ]:          0 :         if (!pos)
    1989                 :            :                 return -EINVAL;
    1990                 :            : 
    1991                 :          0 :         pci_read_config_word(pdev, pos + PCI_PRI_CTRL, &control);
    1992                 :          0 :         control |= PCI_PRI_CTRL_RESET;
    1993                 :          0 :         pci_write_config_word(pdev, pos + PCI_PRI_CTRL, control);
    1994                 :            : 
    1995                 :          0 :         return 0;
    1996                 :            : }
    1997                 :            : 
    1998                 :          0 : static int pdev_iommuv2_enable(struct pci_dev *pdev)
    1999                 :            : {
    2000                 :          0 :         bool reset_enable;
    2001                 :          0 :         int reqs, ret;
    2002                 :            : 
    2003                 :            :         /* FIXME: Hardcode number of outstanding requests for now */
    2004                 :          0 :         reqs = 32;
    2005         [ #  # ]:          0 :         if (pdev_pri_erratum(pdev, AMD_PRI_DEV_ERRATUM_LIMIT_REQ_ONE))
    2006                 :          0 :                 reqs = 1;
    2007                 :          0 :         reset_enable = pdev_pri_erratum(pdev, AMD_PRI_DEV_ERRATUM_ENABLE_RESET);
    2008                 :            : 
    2009                 :            :         /* Only allow access to user-accessible pages */
    2010                 :          0 :         ret = pci_enable_pasid(pdev, 0);
    2011         [ #  # ]:          0 :         if (ret)
    2012                 :          0 :                 goto out_err;
    2013                 :            : 
    2014                 :            :         /* First reset the PRI state of the device */
    2015                 :          0 :         ret = pci_reset_pri(pdev);
    2016         [ #  # ]:          0 :         if (ret)
    2017                 :          0 :                 goto out_err;
    2018                 :            : 
    2019                 :            :         /* Enable PRI */
    2020                 :          0 :         ret = pci_enable_pri(pdev, reqs);
    2021         [ #  # ]:          0 :         if (ret)
    2022                 :          0 :                 goto out_err;
    2023                 :            : 
    2024         [ #  # ]:          0 :         if (reset_enable) {
    2025                 :          0 :                 ret = pri_reset_while_enabled(pdev);
    2026         [ #  # ]:          0 :                 if (ret)
    2027                 :          0 :                         goto out_err;
    2028                 :            :         }
    2029                 :            : 
    2030                 :          0 :         ret = pci_enable_ats(pdev, PAGE_SHIFT);
    2031         [ #  # ]:          0 :         if (ret)
    2032                 :          0 :                 goto out_err;
    2033                 :            : 
    2034                 :            :         return 0;
    2035                 :            : 
    2036                 :          0 : out_err:
    2037                 :          0 :         pci_disable_pri(pdev);
    2038                 :          0 :         pci_disable_pasid(pdev);
    2039                 :            : 
    2040                 :          0 :         return ret;
    2041                 :            : }
    2042                 :            : 
    2043                 :            : /*
    2044                 :            :  * If a device is not yet associated with a domain, this function makes the
    2045                 :            :  * device visible in the domain
    2046                 :            :  */
    2047                 :          0 : static int attach_device(struct device *dev,
    2048                 :            :                          struct protection_domain *domain)
    2049                 :            : {
    2050                 :          0 :         struct pci_dev *pdev;
    2051                 :          0 :         struct iommu_dev_data *dev_data;
    2052                 :          0 :         unsigned long flags;
    2053                 :          0 :         int ret;
    2054                 :            : 
    2055                 :          0 :         spin_lock_irqsave(&domain->lock, flags);
    2056                 :            : 
    2057                 :          0 :         dev_data = get_dev_data(dev);
    2058                 :            : 
    2059                 :          0 :         spin_lock(&dev_data->lock);
    2060                 :            : 
    2061                 :          0 :         ret = -EBUSY;
    2062         [ #  # ]:          0 :         if (dev_data->domain != NULL)
    2063                 :          0 :                 goto out;
    2064                 :            : 
    2065         [ #  # ]:          0 :         if (!dev_is_pci(dev))
    2066                 :          0 :                 goto skip_ats_check;
    2067                 :            : 
    2068                 :          0 :         pdev = to_pci_dev(dev);
    2069         [ #  # ]:          0 :         if (domain->flags & PD_IOMMUV2_MASK) {
    2070                 :          0 :                 ret = -EINVAL;
    2071         [ #  # ]:          0 :                 if (!dev_data->passthrough)
    2072                 :          0 :                         goto out;
    2073                 :            : 
    2074         [ #  # ]:          0 :                 if (dev_data->iommu_v2) {
    2075         [ #  # ]:          0 :                         if (pdev_iommuv2_enable(pdev) != 0)
    2076                 :          0 :                                 goto out;
    2077                 :            : 
    2078                 :          0 :                         dev_data->ats.enabled = true;
    2079                 :          0 :                         dev_data->ats.qdep    = pci_ats_queue_depth(pdev);
    2080                 :          0 :                         dev_data->pri_tlp     = pci_prg_resp_pasid_required(pdev);
    2081                 :            :                 }
    2082   [ #  #  #  # ]:          0 :         } else if (amd_iommu_iotlb_sup &&
    2083                 :          0 :                    pci_enable_ats(pdev, PAGE_SHIFT) == 0) {
    2084                 :          0 :                 dev_data->ats.enabled = true;
    2085                 :          0 :                 dev_data->ats.qdep    = pci_ats_queue_depth(pdev);
    2086                 :            :         }
    2087                 :            : 
    2088                 :          0 : skip_ats_check:
    2089                 :          0 :         ret = 0;
    2090                 :            : 
    2091                 :          0 :         do_attach(dev_data, domain);
    2092                 :            : 
    2093                 :            :         /*
    2094                 :            :          * We might boot into a crash-kernel here. The crashed kernel
    2095                 :            :          * left the caches in the IOMMU dirty. So we have to flush
    2096                 :            :          * here to evict all dirty stuff.
    2097                 :            :          */
    2098                 :          0 :         domain_flush_tlb_pde(domain);
    2099                 :            : 
    2100                 :          0 :         domain_flush_complete(domain);
    2101                 :            : 
    2102                 :          0 : out:
    2103                 :          0 :         spin_unlock(&dev_data->lock);
    2104                 :            : 
    2105                 :          0 :         spin_unlock_irqrestore(&domain->lock, flags);
    2106                 :            : 
    2107                 :          0 :         return ret;
    2108                 :            : }
    2109                 :            : 
    2110                 :            : /*
    2111                 :            :  * Removes a device from a protection domain (with devtable_lock held)
    2112                 :            :  */
    2113                 :          0 : static void detach_device(struct device *dev)
    2114                 :            : {
    2115                 :          0 :         struct protection_domain *domain;
    2116                 :          0 :         struct iommu_dev_data *dev_data;
    2117                 :          0 :         unsigned long flags;
    2118                 :            : 
    2119                 :          0 :         dev_data = get_dev_data(dev);
    2120                 :          0 :         domain   = dev_data->domain;
    2121                 :            : 
    2122                 :          0 :         spin_lock_irqsave(&domain->lock, flags);
    2123                 :            : 
    2124                 :          0 :         spin_lock(&dev_data->lock);
    2125                 :            : 
    2126                 :            :         /*
    2127                 :            :          * First check if the device is still attached. It might already
    2128                 :            :          * be detached from its domain because the generic
    2129                 :            :          * iommu_detach_group code detached it and we try again here in
    2130                 :            :          * our alias handling.
    2131                 :            :          */
    2132   [ #  #  #  # ]:          0 :         if (WARN_ON(!dev_data->domain))
    2133                 :          0 :                 goto out;
    2134                 :            : 
    2135                 :          0 :         do_detach(dev_data);
    2136                 :            : 
    2137         [ #  # ]:          0 :         if (!dev_is_pci(dev))
    2138                 :          0 :                 goto out;
    2139                 :            : 
    2140   [ #  #  #  # ]:          0 :         if (domain->flags & PD_IOMMUV2_MASK && dev_data->iommu_v2)
    2141                 :          0 :                 pdev_iommuv2_disable(to_pci_dev(dev));
    2142         [ #  # ]:          0 :         else if (dev_data->ats.enabled)
    2143                 :          0 :                 pci_disable_ats(to_pci_dev(dev));
    2144                 :            : 
    2145                 :          0 :         dev_data->ats.enabled = false;
    2146                 :            : 
    2147                 :          0 : out:
    2148                 :          0 :         spin_unlock(&dev_data->lock);
    2149                 :            : 
    2150                 :          0 :         spin_unlock_irqrestore(&domain->lock, flags);
    2151                 :          0 : }
    2152                 :            : 
    2153                 :          0 : static int amd_iommu_add_device(struct device *dev)
    2154                 :            : {
    2155                 :          0 :         struct iommu_dev_data *dev_data;
    2156                 :          0 :         struct iommu_domain *domain;
    2157                 :          0 :         struct amd_iommu *iommu;
    2158                 :          0 :         int ret, devid;
    2159                 :            : 
    2160   [ #  #  #  # ]:          0 :         if (!check_device(dev) || get_dev_data(dev))
    2161                 :            :                 return 0;
    2162                 :            : 
    2163                 :          0 :         devid = get_device_id(dev);
    2164         [ #  # ]:          0 :         if (devid < 0)
    2165                 :            :                 return devid;
    2166                 :            : 
    2167                 :          0 :         iommu = amd_iommu_rlookup_table[devid];
    2168                 :            : 
    2169                 :          0 :         ret = iommu_init_device(dev);
    2170         [ #  # ]:          0 :         if (ret) {
    2171         [ #  # ]:          0 :                 if (ret != -ENOTSUPP)
    2172                 :          0 :                         dev_err(dev, "Failed to initialize - trying to proceed anyway\n");
    2173                 :            : 
    2174                 :          0 :                 iommu_ignore_device(dev);
    2175                 :          0 :                 dev->dma_ops = NULL;
    2176                 :          0 :                 goto out;
    2177                 :            :         }
    2178                 :          0 :         init_iommu_group(dev);
    2179                 :            : 
    2180                 :          0 :         dev_data = get_dev_data(dev);
    2181                 :            : 
    2182         [ #  # ]:          0 :         BUG_ON(!dev_data);
    2183                 :            : 
    2184         [ #  # ]:          0 :         if (dev_data->iommu_v2)
    2185                 :          0 :                 iommu_request_dm_for_dev(dev);
    2186                 :            : 
    2187                 :            :         /* Domains are initialized for this device - have a look what we ended up with */
    2188                 :          0 :         domain = iommu_get_domain_for_dev(dev);
    2189         [ #  # ]:          0 :         if (domain->type == IOMMU_DOMAIN_IDENTITY)
    2190                 :          0 :                 dev_data->passthrough = true;
    2191         [ #  # ]:          0 :         else if (domain->type == IOMMU_DOMAIN_DMA)
    2192                 :          0 :                 iommu_setup_dma_ops(dev, IOVA_START_PFN << PAGE_SHIFT, 0);
    2193                 :            : 
    2194                 :          0 : out:
    2195                 :          0 :         iommu_completion_wait(iommu);
    2196                 :            : 
    2197                 :          0 :         return 0;
    2198                 :            : }
    2199                 :            : 
    2200                 :          0 : static void amd_iommu_remove_device(struct device *dev)
    2201                 :            : {
    2202                 :          0 :         struct amd_iommu *iommu;
    2203                 :          0 :         int devid;
    2204                 :            : 
    2205         [ #  # ]:          0 :         if (!check_device(dev))
    2206                 :            :                 return;
    2207                 :            : 
    2208                 :          0 :         devid = get_device_id(dev);
    2209         [ #  # ]:          0 :         if (devid < 0)
    2210                 :            :                 return;
    2211                 :            : 
    2212                 :          0 :         iommu = amd_iommu_rlookup_table[devid];
    2213                 :            : 
    2214                 :          0 :         iommu_uninit_device(dev);
    2215                 :          0 :         iommu_completion_wait(iommu);
    2216                 :            : }
    2217                 :            : 
    2218                 :          0 : static struct iommu_group *amd_iommu_device_group(struct device *dev)
    2219                 :            : {
    2220         [ #  # ]:          0 :         if (dev_is_pci(dev))
    2221                 :          0 :                 return pci_device_group(dev);
    2222                 :            : 
    2223                 :          0 :         return acpihid_device_group(dev);
    2224                 :            : }
    2225                 :            : 
    2226                 :          0 : static int amd_iommu_domain_get_attr(struct iommu_domain *domain,
    2227                 :            :                 enum iommu_attr attr, void *data)
    2228                 :            : {
    2229      [ #  #  # ]:          0 :         switch (domain->type) {
    2230                 :            :         case IOMMU_DOMAIN_UNMANAGED:
    2231                 :            :                 return -ENODEV;
    2232                 :          0 :         case IOMMU_DOMAIN_DMA:
    2233         [ #  # ]:          0 :                 switch (attr) {
    2234                 :          0 :                 case DOMAIN_ATTR_DMA_USE_FLUSH_QUEUE:
    2235                 :          0 :                         *(int *)data = !amd_iommu_unmap_flush;
    2236                 :          0 :                         return 0;
    2237                 :            :                 default:
    2238                 :            :                         return -ENODEV;
    2239                 :            :                 }
    2240                 :          0 :                 break;
    2241                 :          0 :         default:
    2242                 :          0 :                 return -EINVAL;
    2243                 :            :         }
    2244                 :            : }
    2245                 :            : 
    2246                 :            : /*****************************************************************************
    2247                 :            :  *
    2248                 :            :  * The next functions belong to the dma_ops mapping/unmapping code.
    2249                 :            :  *
    2250                 :            :  *****************************************************************************/
    2251                 :            : 
    2252                 :          0 : static void update_device_table(struct protection_domain *domain)
    2253                 :            : {
    2254                 :          0 :         struct iommu_dev_data *dev_data;
    2255                 :            : 
    2256         [ #  # ]:          0 :         list_for_each_entry(dev_data, &domain->dev_list, list) {
    2257                 :          0 :                 set_dte_entry(dev_data->devid, domain, dev_data->ats.enabled,
    2258                 :          0 :                               dev_data->iommu_v2);
    2259                 :          0 :                 clone_aliases(dev_data->pdev);
    2260                 :            :         }
    2261                 :          0 : }
    2262                 :            : 
    2263                 :          0 : static void update_domain(struct protection_domain *domain)
    2264                 :            : {
    2265                 :          0 :         update_device_table(domain);
    2266                 :            : 
    2267                 :          0 :         domain_flush_devices(domain);
    2268                 :          0 :         domain_flush_tlb_pde(domain);
    2269                 :          0 : }
    2270                 :            : 
    2271                 :          0 : int __init amd_iommu_init_api(void)
    2272                 :            : {
    2273                 :          0 :         int ret, err = 0;
    2274                 :            : 
    2275                 :          0 :         ret = iova_cache_get();
    2276         [ #  # ]:          0 :         if (ret)
    2277                 :            :                 return ret;
    2278                 :            : 
    2279                 :          0 :         err = bus_set_iommu(&pci_bus_type, &amd_iommu_ops);
    2280         [ #  # ]:          0 :         if (err)
    2281                 :            :                 return err;
    2282                 :            : #ifdef CONFIG_ARM_AMBA
    2283                 :            :         err = bus_set_iommu(&amba_bustype, &amd_iommu_ops);
    2284                 :            :         if (err)
    2285                 :            :                 return err;
    2286                 :            : #endif
    2287                 :          0 :         err = bus_set_iommu(&platform_bus_type, &amd_iommu_ops);
    2288         [ #  # ]:          0 :         if (err)
    2289                 :          0 :                 return err;
    2290                 :            : 
    2291                 :            :         return 0;
    2292                 :            : }
    2293                 :            : 
    2294                 :          0 : int __init amd_iommu_init_dma_ops(void)
    2295                 :            : {
    2296                 :          0 :         swiotlb        = (iommu_default_passthrough() || sme_me_mask) ? 1 : 0;
    2297                 :            : 
    2298         [ #  # ]:          0 :         if (amd_iommu_unmap_flush)
    2299                 :          0 :                 pr_info("IO/TLB flush on unmap enabled\n");
    2300                 :            :         else
    2301                 :          0 :                 pr_info("Lazy IO/TLB flushing enabled\n");
    2302                 :            : 
    2303                 :          0 :         return 0;
    2304                 :            : 
    2305                 :            : }
    2306                 :            : 
    2307                 :            : /*****************************************************************************
    2308                 :            :  *
    2309                 :            :  * The following functions belong to the exported interface of AMD IOMMU
    2310                 :            :  *
    2311                 :            :  * This interface allows access to lower level functions of the IOMMU
    2312                 :            :  * like protection domain handling and assignement of devices to domains
    2313                 :            :  * which is not possible with the dma_ops interface.
    2314                 :            :  *
    2315                 :            :  *****************************************************************************/
    2316                 :            : 
    2317                 :          0 : static void cleanup_domain(struct protection_domain *domain)
    2318                 :            : {
    2319                 :          0 :         struct iommu_dev_data *entry;
    2320                 :          0 :         unsigned long flags;
    2321                 :            : 
    2322                 :          0 :         spin_lock_irqsave(&domain->lock, flags);
    2323                 :            : 
    2324         [ #  # ]:          0 :         while (!list_empty(&domain->dev_list)) {
    2325                 :          0 :                 entry = list_first_entry(&domain->dev_list,
    2326                 :            :                                          struct iommu_dev_data, list);
    2327         [ #  # ]:          0 :                 BUG_ON(!entry->domain);
    2328                 :          0 :                 do_detach(entry);
    2329                 :            :         }
    2330                 :            : 
    2331                 :          0 :         spin_unlock_irqrestore(&domain->lock, flags);
    2332                 :          0 : }
    2333                 :            : 
    2334                 :          0 : static void protection_domain_free(struct protection_domain *domain)
    2335                 :            : {
    2336         [ #  # ]:          0 :         if (!domain)
    2337                 :            :                 return;
    2338                 :            : 
    2339         [ #  # ]:          0 :         if (domain->id)
    2340                 :          0 :                 domain_id_free(domain->id);
    2341                 :            : 
    2342                 :          0 :         kfree(domain);
    2343                 :            : }
    2344                 :            : 
    2345                 :          0 : static int protection_domain_init(struct protection_domain *domain)
    2346                 :            : {
    2347                 :          0 :         spin_lock_init(&domain->lock);
    2348                 :          0 :         domain->id = domain_id_alloc();
    2349   [ #  #  #  # ]:          0 :         if (!domain->id)
    2350                 :            :                 return -ENOMEM;
    2351                 :          0 :         INIT_LIST_HEAD(&domain->dev_list);
    2352                 :            : 
    2353                 :          0 :         return 0;
    2354                 :            : }
    2355                 :            : 
    2356                 :          0 : static struct protection_domain *protection_domain_alloc(void)
    2357                 :            : {
    2358                 :          0 :         struct protection_domain *domain;
    2359                 :            : 
    2360                 :          0 :         domain = kzalloc(sizeof(*domain), GFP_KERNEL);
    2361         [ #  # ]:          0 :         if (!domain)
    2362                 :            :                 return NULL;
    2363                 :            : 
    2364                 :          0 :         if (protection_domain_init(domain))
    2365                 :          0 :                 goto out_err;
    2366                 :            : 
    2367                 :            :         return domain;
    2368                 :            : 
    2369                 :            : out_err:
    2370                 :          0 :         kfree(domain);
    2371                 :            : 
    2372                 :          0 :         return NULL;
    2373                 :            : }
    2374                 :            : 
    2375                 :          0 : static struct iommu_domain *amd_iommu_domain_alloc(unsigned type)
    2376                 :            : {
    2377                 :          0 :         struct protection_domain *pdomain;
    2378                 :            : 
    2379   [ #  #  #  # ]:          0 :         switch (type) {
    2380                 :          0 :         case IOMMU_DOMAIN_UNMANAGED:
    2381                 :          0 :                 pdomain = protection_domain_alloc();
    2382         [ #  # ]:          0 :                 if (!pdomain)
    2383                 :            :                         return NULL;
    2384                 :            : 
    2385                 :          0 :                 pdomain->mode    = PAGE_MODE_3_LEVEL;
    2386                 :          0 :                 pdomain->pt_root = (void *)get_zeroed_page(GFP_KERNEL);
    2387         [ #  # ]:          0 :                 if (!pdomain->pt_root) {
    2388                 :          0 :                         protection_domain_free(pdomain);
    2389                 :          0 :                         return NULL;
    2390                 :            :                 }
    2391                 :            : 
    2392                 :          0 :                 pdomain->domain.geometry.aperture_start = 0;
    2393                 :          0 :                 pdomain->domain.geometry.aperture_end   = ~0ULL;
    2394                 :          0 :                 pdomain->domain.geometry.force_aperture = true;
    2395                 :            : 
    2396                 :          0 :                 break;
    2397                 :          0 :         case IOMMU_DOMAIN_DMA:
    2398                 :          0 :                 pdomain = dma_ops_domain_alloc();
    2399         [ #  # ]:          0 :                 if (!pdomain) {
    2400                 :          0 :                         pr_err("Failed to allocate\n");
    2401                 :          0 :                         return NULL;
    2402                 :            :                 }
    2403                 :            :                 break;
    2404                 :          0 :         case IOMMU_DOMAIN_IDENTITY:
    2405                 :          0 :                 pdomain = protection_domain_alloc();
    2406         [ #  # ]:          0 :                 if (!pdomain)
    2407                 :            :                         return NULL;
    2408                 :            : 
    2409                 :          0 :                 pdomain->mode = PAGE_MODE_NONE;
    2410                 :          0 :                 break;
    2411                 :            :         default:
    2412                 :            :                 return NULL;
    2413                 :            :         }
    2414                 :            : 
    2415                 :          0 :         return &pdomain->domain;
    2416                 :            : }
    2417                 :            : 
    2418                 :          0 : static void amd_iommu_domain_free(struct iommu_domain *dom)
    2419                 :            : {
    2420                 :          0 :         struct protection_domain *domain;
    2421                 :            : 
    2422                 :          0 :         domain = to_pdomain(dom);
    2423                 :            : 
    2424         [ #  # ]:          0 :         if (domain->dev_cnt > 0)
    2425                 :          0 :                 cleanup_domain(domain);
    2426                 :            : 
    2427         [ #  # ]:          0 :         BUG_ON(domain->dev_cnt != 0);
    2428                 :            : 
    2429         [ #  # ]:          0 :         if (!dom)
    2430                 :            :                 return;
    2431                 :            : 
    2432         [ #  # ]:          0 :         switch (dom->type) {
    2433                 :          0 :         case IOMMU_DOMAIN_DMA:
    2434                 :            :                 /* Now release the domain */
    2435                 :          0 :                 dma_ops_domain_free(domain);
    2436                 :          0 :                 break;
    2437                 :          0 :         default:
    2438         [ #  # ]:          0 :                 if (domain->mode != PAGE_MODE_NONE)
    2439                 :          0 :                         free_pagetable(domain);
    2440                 :            : 
    2441         [ #  # ]:          0 :                 if (domain->flags & PD_IOMMUV2_MASK)
    2442                 :          0 :                         free_gcr3_table(domain);
    2443                 :            : 
    2444                 :          0 :                 protection_domain_free(domain);
    2445                 :          0 :                 break;
    2446                 :            :         }
    2447                 :            : }
    2448                 :            : 
    2449                 :          0 : static void amd_iommu_detach_device(struct iommu_domain *dom,
    2450                 :            :                                     struct device *dev)
    2451                 :            : {
    2452                 :          0 :         struct iommu_dev_data *dev_data = dev->archdata.iommu;
    2453                 :          0 :         struct amd_iommu *iommu;
    2454                 :          0 :         int devid;
    2455                 :            : 
    2456         [ #  # ]:          0 :         if (!check_device(dev))
    2457                 :            :                 return;
    2458                 :            : 
    2459                 :          0 :         devid = get_device_id(dev);
    2460         [ #  # ]:          0 :         if (devid < 0)
    2461                 :            :                 return;
    2462                 :            : 
    2463         [ #  # ]:          0 :         if (dev_data->domain != NULL)
    2464                 :          0 :                 detach_device(dev);
    2465                 :            : 
    2466                 :          0 :         iommu = amd_iommu_rlookup_table[devid];
    2467         [ #  # ]:          0 :         if (!iommu)
    2468                 :            :                 return;
    2469                 :            : 
    2470                 :            : #ifdef CONFIG_IRQ_REMAP
    2471                 :            :         if (AMD_IOMMU_GUEST_IR_VAPIC(amd_iommu_guest_ir) &&
    2472                 :            :             (dom->type == IOMMU_DOMAIN_UNMANAGED))
    2473                 :            :                 dev_data->use_vapic = 0;
    2474                 :            : #endif
    2475                 :            : 
    2476                 :          0 :         iommu_completion_wait(iommu);
    2477                 :            : }
    2478                 :            : 
    2479                 :          0 : static int amd_iommu_attach_device(struct iommu_domain *dom,
    2480                 :            :                                    struct device *dev)
    2481                 :            : {
    2482                 :          0 :         struct protection_domain *domain = to_pdomain(dom);
    2483                 :          0 :         struct iommu_dev_data *dev_data;
    2484                 :          0 :         struct amd_iommu *iommu;
    2485                 :          0 :         int ret;
    2486                 :            : 
    2487         [ #  # ]:          0 :         if (!check_device(dev))
    2488                 :            :                 return -EINVAL;
    2489                 :            : 
    2490                 :          0 :         dev_data = dev->archdata.iommu;
    2491                 :          0 :         dev_data->defer_attach = false;
    2492                 :            : 
    2493                 :          0 :         iommu = amd_iommu_rlookup_table[dev_data->devid];
    2494         [ #  # ]:          0 :         if (!iommu)
    2495                 :            :                 return -EINVAL;
    2496                 :            : 
    2497         [ #  # ]:          0 :         if (dev_data->domain)
    2498                 :          0 :                 detach_device(dev);
    2499                 :            : 
    2500                 :          0 :         ret = attach_device(dev, domain);
    2501                 :            : 
    2502                 :            : #ifdef CONFIG_IRQ_REMAP
    2503                 :            :         if (AMD_IOMMU_GUEST_IR_VAPIC(amd_iommu_guest_ir)) {
    2504                 :            :                 if (dom->type == IOMMU_DOMAIN_UNMANAGED)
    2505                 :            :                         dev_data->use_vapic = 1;
    2506                 :            :                 else
    2507                 :            :                         dev_data->use_vapic = 0;
    2508                 :            :         }
    2509                 :            : #endif
    2510                 :            : 
    2511                 :          0 :         iommu_completion_wait(iommu);
    2512                 :            : 
    2513                 :          0 :         return ret;
    2514                 :            : }
    2515                 :            : 
    2516                 :          0 : static int amd_iommu_map(struct iommu_domain *dom, unsigned long iova,
    2517                 :            :                          phys_addr_t paddr, size_t page_size, int iommu_prot,
    2518                 :            :                          gfp_t gfp)
    2519                 :            : {
    2520                 :          0 :         struct protection_domain *domain = to_pdomain(dom);
    2521                 :          0 :         int prot = 0;
    2522                 :          0 :         int ret;
    2523                 :            : 
    2524         [ #  # ]:          0 :         if (domain->mode == PAGE_MODE_NONE)
    2525                 :            :                 return -EINVAL;
    2526                 :            : 
    2527                 :          0 :         if (iommu_prot & IOMMU_READ)
    2528                 :            :                 prot |= IOMMU_PROT_IR;
    2529         [ #  # ]:          0 :         if (iommu_prot & IOMMU_WRITE)
    2530                 :          0 :                 prot |= IOMMU_PROT_IW;
    2531                 :            : 
    2532                 :          0 :         ret = iommu_map_page(domain, iova, paddr, page_size, prot, gfp);
    2533                 :            : 
    2534                 :          0 :         domain_flush_np_cache(domain, iova, page_size);
    2535                 :            : 
    2536                 :          0 :         return ret;
    2537                 :            : }
    2538                 :            : 
    2539                 :          0 : static size_t amd_iommu_unmap(struct iommu_domain *dom, unsigned long iova,
    2540                 :            :                               size_t page_size,
    2541                 :            :                               struct iommu_iotlb_gather *gather)
    2542                 :            : {
    2543                 :          0 :         struct protection_domain *domain = to_pdomain(dom);
    2544                 :            : 
    2545         [ #  # ]:          0 :         if (domain->mode == PAGE_MODE_NONE)
    2546                 :            :                 return 0;
    2547                 :            : 
    2548                 :          0 :         return iommu_unmap_page(domain, iova, page_size);
    2549                 :            : }
    2550                 :            : 
    2551                 :          0 : static phys_addr_t amd_iommu_iova_to_phys(struct iommu_domain *dom,
    2552                 :            :                                           dma_addr_t iova)
    2553                 :            : {
    2554                 :          0 :         struct protection_domain *domain = to_pdomain(dom);
    2555                 :          0 :         unsigned long offset_mask, pte_pgsize;
    2556                 :          0 :         u64 *pte, __pte;
    2557                 :            : 
    2558         [ #  # ]:          0 :         if (domain->mode == PAGE_MODE_NONE)
    2559                 :            :                 return iova;
    2560                 :            : 
    2561                 :          0 :         pte = fetch_pte(domain, iova, &pte_pgsize);
    2562                 :            : 
    2563   [ #  #  #  # ]:          0 :         if (!pte || !IOMMU_PTE_PRESENT(*pte))
    2564                 :            :                 return 0;
    2565                 :            : 
    2566                 :          0 :         offset_mask = pte_pgsize - 1;
    2567                 :          0 :         __pte       = __sme_clr(*pte & PM_ADDR_MASK);
    2568                 :            : 
    2569                 :          0 :         return (__pte & ~offset_mask) | (iova & offset_mask);
    2570                 :            : }
    2571                 :            : 
    2572                 :          0 : static bool amd_iommu_capable(enum iommu_cap cap)
    2573                 :            : {
    2574         [ #  # ]:          0 :         switch (cap) {
    2575                 :            :         case IOMMU_CAP_CACHE_COHERENCY:
    2576                 :            :                 return true;
    2577                 :            :         case IOMMU_CAP_INTR_REMAP:
    2578                 :            :                 return (irq_remapping_enabled == 1);
    2579                 :            :         case IOMMU_CAP_NOEXEC:
    2580                 :            :                 return false;
    2581                 :            :         default:
    2582                 :            :                 break;
    2583                 :            :         }
    2584                 :            : 
    2585                 :            :         return false;
    2586                 :            : }
    2587                 :            : 
    2588                 :          0 : static void amd_iommu_get_resv_regions(struct device *dev,
    2589                 :            :                                        struct list_head *head)
    2590                 :            : {
    2591                 :          0 :         struct iommu_resv_region *region;
    2592                 :          0 :         struct unity_map_entry *entry;
    2593                 :          0 :         int devid;
    2594                 :            : 
    2595                 :          0 :         devid = get_device_id(dev);
    2596         [ #  # ]:          0 :         if (devid < 0)
    2597                 :            :                 return;
    2598                 :            : 
    2599         [ #  # ]:          0 :         list_for_each_entry(entry, &amd_iommu_unity_map, list) {
    2600                 :          0 :                 int type, prot = 0;
    2601                 :          0 :                 size_t length;
    2602                 :            : 
    2603   [ #  #  #  # ]:          0 :                 if (devid < entry->devid_start || devid > entry->devid_end)
    2604                 :          0 :                         continue;
    2605                 :            : 
    2606                 :          0 :                 type   = IOMMU_RESV_DIRECT;
    2607                 :          0 :                 length = entry->address_end - entry->address_start;
    2608                 :          0 :                 if (entry->prot & IOMMU_PROT_IR)
    2609                 :            :                         prot |= IOMMU_READ;
    2610         [ #  # ]:          0 :                 if (entry->prot & IOMMU_PROT_IW)
    2611                 :          0 :                         prot |= IOMMU_WRITE;
    2612         [ #  # ]:          0 :                 if (entry->prot & IOMMU_UNITY_MAP_FLAG_EXCL_RANGE)
    2613                 :            :                         /* Exclusion range */
    2614                 :          0 :                         type = IOMMU_RESV_RESERVED;
    2615                 :            : 
    2616                 :          0 :                 region = iommu_alloc_resv_region(entry->address_start,
    2617                 :            :                                                  length, prot, type);
    2618         [ #  # ]:          0 :                 if (!region) {
    2619                 :          0 :                         dev_err(dev, "Out of memory allocating dm-regions\n");
    2620                 :          0 :                         return;
    2621                 :            :                 }
    2622                 :          0 :                 list_add_tail(&region->list, head);
    2623                 :            :         }
    2624                 :            : 
    2625                 :          0 :         region = iommu_alloc_resv_region(MSI_RANGE_START,
    2626                 :            :                                          MSI_RANGE_END - MSI_RANGE_START + 1,
    2627                 :            :                                          0, IOMMU_RESV_MSI);
    2628         [ #  # ]:          0 :         if (!region)
    2629                 :            :                 return;
    2630                 :          0 :         list_add_tail(&region->list, head);
    2631                 :            : 
    2632                 :          0 :         region = iommu_alloc_resv_region(HT_RANGE_START,
    2633                 :            :                                          HT_RANGE_END - HT_RANGE_START + 1,
    2634                 :            :                                          0, IOMMU_RESV_RESERVED);
    2635         [ #  # ]:          0 :         if (!region)
    2636                 :            :                 return;
    2637                 :          0 :         list_add_tail(&region->list, head);
    2638                 :            : }
    2639                 :            : 
    2640                 :          0 : static bool amd_iommu_is_attach_deferred(struct iommu_domain *domain,
    2641                 :            :                                          struct device *dev)
    2642                 :            : {
    2643                 :          0 :         struct iommu_dev_data *dev_data = dev->archdata.iommu;
    2644                 :          0 :         return dev_data->defer_attach;
    2645                 :            : }
    2646                 :            : 
    2647                 :          0 : static void amd_iommu_flush_iotlb_all(struct iommu_domain *domain)
    2648                 :            : {
    2649                 :          0 :         struct protection_domain *dom = to_pdomain(domain);
    2650                 :          0 :         unsigned long flags;
    2651                 :            : 
    2652                 :          0 :         spin_lock_irqsave(&dom->lock, flags);
    2653                 :          0 :         domain_flush_tlb_pde(dom);
    2654                 :          0 :         domain_flush_complete(dom);
    2655                 :          0 :         spin_unlock_irqrestore(&dom->lock, flags);
    2656                 :          0 : }
    2657                 :            : 
    2658                 :          0 : static void amd_iommu_iotlb_sync(struct iommu_domain *domain,
    2659                 :            :                                  struct iommu_iotlb_gather *gather)
    2660                 :            : {
    2661                 :          0 :         amd_iommu_flush_iotlb_all(domain);
    2662                 :          0 : }
    2663                 :            : 
    2664                 :            : const struct iommu_ops amd_iommu_ops = {
    2665                 :            :         .capable = amd_iommu_capable,
    2666                 :            :         .domain_alloc = amd_iommu_domain_alloc,
    2667                 :            :         .domain_free  = amd_iommu_domain_free,
    2668                 :            :         .attach_dev = amd_iommu_attach_device,
    2669                 :            :         .detach_dev = amd_iommu_detach_device,
    2670                 :            :         .map = amd_iommu_map,
    2671                 :            :         .unmap = amd_iommu_unmap,
    2672                 :            :         .iova_to_phys = amd_iommu_iova_to_phys,
    2673                 :            :         .add_device = amd_iommu_add_device,
    2674                 :            :         .remove_device = amd_iommu_remove_device,
    2675                 :            :         .device_group = amd_iommu_device_group,
    2676                 :            :         .domain_get_attr = amd_iommu_domain_get_attr,
    2677                 :            :         .get_resv_regions = amd_iommu_get_resv_regions,
    2678                 :            :         .put_resv_regions = generic_iommu_put_resv_regions,
    2679                 :            :         .is_attach_deferred = amd_iommu_is_attach_deferred,
    2680                 :            :         .pgsize_bitmap  = AMD_IOMMU_PGSIZES,
    2681                 :            :         .flush_iotlb_all = amd_iommu_flush_iotlb_all,
    2682                 :            :         .iotlb_sync = amd_iommu_iotlb_sync,
    2683                 :            : };
    2684                 :            : 
    2685                 :            : /*****************************************************************************
    2686                 :            :  *
    2687                 :            :  * The next functions do a basic initialization of IOMMU for pass through
    2688                 :            :  * mode
    2689                 :            :  *
    2690                 :            :  * In passthrough mode the IOMMU is initialized and enabled but not used for
    2691                 :            :  * DMA-API translation.
    2692                 :            :  *
    2693                 :            :  *****************************************************************************/
    2694                 :            : 
    2695                 :            : /* IOMMUv2 specific functions */
    2696                 :          0 : int amd_iommu_register_ppr_notifier(struct notifier_block *nb)
    2697                 :            : {
    2698                 :          0 :         return atomic_notifier_chain_register(&ppr_notifier, nb);
    2699                 :            : }
    2700                 :            : EXPORT_SYMBOL(amd_iommu_register_ppr_notifier);
    2701                 :            : 
    2702                 :          0 : int amd_iommu_unregister_ppr_notifier(struct notifier_block *nb)
    2703                 :            : {
    2704                 :          0 :         return atomic_notifier_chain_unregister(&ppr_notifier, nb);
    2705                 :            : }
    2706                 :            : EXPORT_SYMBOL(amd_iommu_unregister_ppr_notifier);
    2707                 :            : 
    2708                 :          0 : void amd_iommu_domain_direct_map(struct iommu_domain *dom)
    2709                 :            : {
    2710                 :          0 :         struct protection_domain *domain = to_pdomain(dom);
    2711                 :          0 :         unsigned long flags;
    2712                 :            : 
    2713                 :          0 :         spin_lock_irqsave(&domain->lock, flags);
    2714                 :            : 
    2715                 :            :         /* Update data structure */
    2716                 :          0 :         domain->mode    = PAGE_MODE_NONE;
    2717                 :            : 
    2718                 :            :         /* Make changes visible to IOMMUs */
    2719                 :          0 :         update_domain(domain);
    2720                 :            : 
    2721                 :            :         /* Page-table is not visible to IOMMU anymore, so free it */
    2722                 :          0 :         free_pagetable(domain);
    2723                 :            : 
    2724                 :          0 :         spin_unlock_irqrestore(&domain->lock, flags);
    2725                 :          0 : }
    2726                 :            : EXPORT_SYMBOL(amd_iommu_domain_direct_map);
    2727                 :            : 
    2728                 :          0 : int amd_iommu_domain_enable_v2(struct iommu_domain *dom, int pasids)
    2729                 :            : {
    2730                 :          0 :         struct protection_domain *domain = to_pdomain(dom);
    2731                 :          0 :         unsigned long flags;
    2732                 :          0 :         int levels, ret;
    2733                 :            : 
    2734         [ #  # ]:          0 :         if (pasids <= 0 || pasids > (PASID_MASK + 1))
    2735                 :            :                 return -EINVAL;
    2736                 :            : 
    2737                 :            :         /* Number of GCR3 table levels required */
    2738         [ #  # ]:          0 :         for (levels = 0; (pasids - 1) & ~0x1ff; pasids >>= 9)
    2739                 :          0 :                 levels += 1;
    2740                 :            : 
    2741         [ #  # ]:          0 :         if (levels > amd_iommu_max_glx_val)
    2742                 :            :                 return -EINVAL;
    2743                 :            : 
    2744                 :          0 :         spin_lock_irqsave(&domain->lock, flags);
    2745                 :            : 
    2746                 :            :         /*
    2747                 :            :          * Save us all sanity checks whether devices already in the
    2748                 :            :          * domain support IOMMUv2. Just force that the domain has no
    2749                 :            :          * devices attached when it is switched into IOMMUv2 mode.
    2750                 :            :          */
    2751                 :          0 :         ret = -EBUSY;
    2752   [ #  #  #  # ]:          0 :         if (domain->dev_cnt > 0 || domain->flags & PD_IOMMUV2_MASK)
    2753                 :          0 :                 goto out;
    2754                 :            : 
    2755                 :          0 :         ret = -ENOMEM;
    2756                 :          0 :         domain->gcr3_tbl = (void *)get_zeroed_page(GFP_ATOMIC);
    2757         [ #  # ]:          0 :         if (domain->gcr3_tbl == NULL)
    2758                 :          0 :                 goto out;
    2759                 :            : 
    2760                 :          0 :         domain->glx      = levels;
    2761                 :          0 :         domain->flags   |= PD_IOMMUV2_MASK;
    2762                 :            : 
    2763                 :          0 :         update_domain(domain);
    2764                 :            : 
    2765                 :          0 :         ret = 0;
    2766                 :            : 
    2767                 :          0 : out:
    2768                 :          0 :         spin_unlock_irqrestore(&domain->lock, flags);
    2769                 :            : 
    2770                 :          0 :         return ret;
    2771                 :            : }
    2772                 :            : EXPORT_SYMBOL(amd_iommu_domain_enable_v2);
    2773                 :            : 
    2774                 :          0 : static int __flush_pasid(struct protection_domain *domain, int pasid,
    2775                 :            :                          u64 address, bool size)
    2776                 :            : {
    2777                 :          0 :         struct iommu_dev_data *dev_data;
    2778                 :          0 :         struct iommu_cmd cmd;
    2779                 :          0 :         int i, ret;
    2780                 :            : 
    2781         [ #  # ]:          0 :         if (!(domain->flags & PD_IOMMUV2_MASK))
    2782                 :            :                 return -EINVAL;
    2783                 :            : 
    2784         [ #  # ]:          0 :         build_inv_iommu_pasid(&cmd, domain->id, pasid, address, size);
    2785                 :            : 
    2786                 :            :         /*
    2787                 :            :          * IOMMU TLB needs to be flushed before Device TLB to
    2788                 :            :          * prevent device TLB refill from IOMMU TLB
    2789                 :            :          */
    2790         [ #  # ]:          0 :         for (i = 0; i < amd_iommu_get_num_iommus(); ++i) {
    2791         [ #  # ]:          0 :                 if (domain->dev_iommu[i] == 0)
    2792                 :          0 :                         continue;
    2793                 :            : 
    2794                 :          0 :                 ret = iommu_queue_command(amd_iommus[i], &cmd);
    2795         [ #  # ]:          0 :                 if (ret != 0)
    2796                 :          0 :                         goto out;
    2797                 :            :         }
    2798                 :            : 
    2799                 :            :         /* Wait until IOMMU TLB flushes are complete */
    2800                 :          0 :         domain_flush_complete(domain);
    2801                 :            : 
    2802                 :            :         /* Now flush device TLBs */
    2803         [ #  # ]:          0 :         list_for_each_entry(dev_data, &domain->dev_list, list) {
    2804                 :          0 :                 struct amd_iommu *iommu;
    2805                 :          0 :                 int qdep;
    2806                 :            : 
    2807                 :            :                 /*
    2808                 :            :                    There might be non-IOMMUv2 capable devices in an IOMMUv2
    2809                 :            :                  * domain.
    2810                 :            :                  */
    2811         [ #  # ]:          0 :                 if (!dev_data->ats.enabled)
    2812                 :          0 :                         continue;
    2813                 :            : 
    2814                 :          0 :                 qdep  = dev_data->ats.qdep;
    2815                 :          0 :                 iommu = amd_iommu_rlookup_table[dev_data->devid];
    2816                 :            : 
    2817         [ #  # ]:          0 :                 build_inv_iotlb_pasid(&cmd, dev_data->devid, pasid,
    2818                 :            :                                       qdep, address, size);
    2819                 :            : 
    2820                 :          0 :                 ret = iommu_queue_command(iommu, &cmd);
    2821         [ #  # ]:          0 :                 if (ret != 0)
    2822                 :          0 :                         goto out;
    2823                 :            :         }
    2824                 :            : 
    2825                 :            :         /* Wait until all device TLBs are flushed */
    2826                 :          0 :         domain_flush_complete(domain);
    2827                 :            : 
    2828                 :          0 :         ret = 0;
    2829                 :            : 
    2830                 :            : out:
    2831                 :            : 
    2832                 :            :         return ret;
    2833                 :            : }
    2834                 :            : 
    2835                 :          0 : static int __amd_iommu_flush_page(struct protection_domain *domain, int pasid,
    2836                 :            :                                   u64 address)
    2837                 :            : {
    2838                 :          0 :         return __flush_pasid(domain, pasid, address, false);
    2839                 :            : }
    2840                 :            : 
    2841                 :          0 : int amd_iommu_flush_page(struct iommu_domain *dom, int pasid,
    2842                 :            :                          u64 address)
    2843                 :            : {
    2844                 :          0 :         struct protection_domain *domain = to_pdomain(dom);
    2845                 :          0 :         unsigned long flags;
    2846                 :          0 :         int ret;
    2847                 :            : 
    2848                 :          0 :         spin_lock_irqsave(&domain->lock, flags);
    2849                 :          0 :         ret = __amd_iommu_flush_page(domain, pasid, address);
    2850                 :          0 :         spin_unlock_irqrestore(&domain->lock, flags);
    2851                 :            : 
    2852                 :          0 :         return ret;
    2853                 :            : }
    2854                 :            : EXPORT_SYMBOL(amd_iommu_flush_page);
    2855                 :            : 
    2856                 :          0 : static int __amd_iommu_flush_tlb(struct protection_domain *domain, int pasid)
    2857                 :            : {
    2858                 :          0 :         return __flush_pasid(domain, pasid, CMD_INV_IOMMU_ALL_PAGES_ADDRESS,
    2859                 :            :                              true);
    2860                 :            : }
    2861                 :            : 
    2862                 :          0 : int amd_iommu_flush_tlb(struct iommu_domain *dom, int pasid)
    2863                 :            : {
    2864                 :          0 :         struct protection_domain *domain = to_pdomain(dom);
    2865                 :          0 :         unsigned long flags;
    2866                 :          0 :         int ret;
    2867                 :            : 
    2868                 :          0 :         spin_lock_irqsave(&domain->lock, flags);
    2869                 :          0 :         ret = __amd_iommu_flush_tlb(domain, pasid);
    2870                 :          0 :         spin_unlock_irqrestore(&domain->lock, flags);
    2871                 :            : 
    2872                 :          0 :         return ret;
    2873                 :            : }
    2874                 :            : EXPORT_SYMBOL(amd_iommu_flush_tlb);
    2875                 :            : 
    2876                 :          0 : static u64 *__get_gcr3_pte(u64 *root, int level, int pasid, bool alloc)
    2877                 :            : {
    2878                 :          0 :         int index;
    2879                 :          0 :         u64 *pte;
    2880                 :            : 
    2881                 :          0 :         while (true) {
    2882                 :            : 
    2883                 :          0 :                 index = (pasid >> (9 * level)) & 0x1ff;
    2884                 :          0 :                 pte   = &root[index];
    2885                 :            : 
    2886         [ #  # ]:          0 :                 if (level == 0)
    2887                 :            :                         break;
    2888                 :            : 
    2889         [ #  # ]:          0 :                 if (!(*pte & GCR3_VALID)) {
    2890         [ #  # ]:          0 :                         if (!alloc)
    2891                 :            :                                 return NULL;
    2892                 :            : 
    2893                 :          0 :                         root = (void *)get_zeroed_page(GFP_ATOMIC);
    2894         [ #  # ]:          0 :                         if (root == NULL)
    2895                 :            :                                 return NULL;
    2896                 :            : 
    2897         [ #  # ]:          0 :                         *pte = iommu_virt_to_phys(root) | GCR3_VALID;
    2898                 :            :                 }
    2899                 :            : 
    2900                 :          0 :                 root = iommu_phys_to_virt(*pte & PAGE_MASK);
    2901                 :            : 
    2902                 :          0 :                 level -= 1;
    2903                 :            :         }
    2904                 :            : 
    2905                 :            :         return pte;
    2906                 :            : }
    2907                 :            : 
    2908                 :          0 : static int __set_gcr3(struct protection_domain *domain, int pasid,
    2909                 :            :                       unsigned long cr3)
    2910                 :            : {
    2911                 :          0 :         u64 *pte;
    2912                 :            : 
    2913         [ #  # ]:          0 :         if (domain->mode != PAGE_MODE_NONE)
    2914                 :            :                 return -EINVAL;
    2915                 :            : 
    2916                 :          0 :         pte = __get_gcr3_pte(domain->gcr3_tbl, domain->glx, pasid, true);
    2917         [ #  # ]:          0 :         if (pte == NULL)
    2918                 :            :                 return -ENOMEM;
    2919                 :            : 
    2920                 :          0 :         *pte = (cr3 & PAGE_MASK) | GCR3_VALID;
    2921                 :            : 
    2922                 :          0 :         return __amd_iommu_flush_tlb(domain, pasid);
    2923                 :            : }
    2924                 :            : 
    2925                 :          0 : static int __clear_gcr3(struct protection_domain *domain, int pasid)
    2926                 :            : {
    2927                 :          0 :         u64 *pte;
    2928                 :            : 
    2929         [ #  # ]:          0 :         if (domain->mode != PAGE_MODE_NONE)
    2930                 :            :                 return -EINVAL;
    2931                 :            : 
    2932                 :          0 :         pte = __get_gcr3_pte(domain->gcr3_tbl, domain->glx, pasid, false);
    2933         [ #  # ]:          0 :         if (pte == NULL)
    2934                 :            :                 return 0;
    2935                 :            : 
    2936                 :          0 :         *pte = 0;
    2937                 :            : 
    2938                 :          0 :         return __amd_iommu_flush_tlb(domain, pasid);
    2939                 :            : }
    2940                 :            : 
    2941                 :          0 : int amd_iommu_domain_set_gcr3(struct iommu_domain *dom, int pasid,
    2942                 :            :                               unsigned long cr3)
    2943                 :            : {
    2944                 :          0 :         struct protection_domain *domain = to_pdomain(dom);
    2945                 :          0 :         unsigned long flags;
    2946                 :          0 :         int ret;
    2947                 :            : 
    2948                 :          0 :         spin_lock_irqsave(&domain->lock, flags);
    2949                 :          0 :         ret = __set_gcr3(domain, pasid, cr3);
    2950                 :          0 :         spin_unlock_irqrestore(&domain->lock, flags);
    2951                 :            : 
    2952                 :          0 :         return ret;
    2953                 :            : }
    2954                 :            : EXPORT_SYMBOL(amd_iommu_domain_set_gcr3);
    2955                 :            : 
    2956                 :          0 : int amd_iommu_domain_clear_gcr3(struct iommu_domain *dom, int pasid)
    2957                 :            : {
    2958                 :          0 :         struct protection_domain *domain = to_pdomain(dom);
    2959                 :          0 :         unsigned long flags;
    2960                 :          0 :         int ret;
    2961                 :            : 
    2962                 :          0 :         spin_lock_irqsave(&domain->lock, flags);
    2963                 :          0 :         ret = __clear_gcr3(domain, pasid);
    2964                 :          0 :         spin_unlock_irqrestore(&domain->lock, flags);
    2965                 :            : 
    2966                 :          0 :         return ret;
    2967                 :            : }
    2968                 :            : EXPORT_SYMBOL(amd_iommu_domain_clear_gcr3);
    2969                 :            : 
    2970                 :          0 : int amd_iommu_complete_ppr(struct pci_dev *pdev, int pasid,
    2971                 :            :                            int status, int tag)
    2972                 :            : {
    2973                 :          0 :         struct iommu_dev_data *dev_data;
    2974                 :          0 :         struct amd_iommu *iommu;
    2975                 :          0 :         struct iommu_cmd cmd;
    2976                 :            : 
    2977                 :          0 :         dev_data = get_dev_data(&pdev->dev);
    2978                 :          0 :         iommu    = amd_iommu_rlookup_table[dev_data->devid];
    2979                 :            : 
    2980                 :          0 :         build_complete_ppr(&cmd, dev_data->devid, pasid, status,
    2981         [ #  # ]:          0 :                            tag, dev_data->pri_tlp);
    2982                 :            : 
    2983                 :          0 :         return iommu_queue_command(iommu, &cmd);
    2984                 :            : }
    2985                 :            : EXPORT_SYMBOL(amd_iommu_complete_ppr);
    2986                 :            : 
    2987                 :          0 : struct iommu_domain *amd_iommu_get_v2_domain(struct pci_dev *pdev)
    2988                 :            : {
    2989                 :          0 :         struct protection_domain *pdomain;
    2990                 :          0 :         struct iommu_domain *io_domain;
    2991                 :          0 :         struct device *dev = &pdev->dev;
    2992                 :            : 
    2993         [ #  # ]:          0 :         if (!check_device(dev))
    2994                 :            :                 return NULL;
    2995                 :            : 
    2996                 :          0 :         pdomain = get_dev_data(dev)->domain;
    2997   [ #  #  #  # ]:          0 :         if (pdomain == NULL && get_dev_data(dev)->defer_attach) {
    2998                 :          0 :                 get_dev_data(dev)->defer_attach = false;
    2999                 :          0 :                 io_domain = iommu_get_domain_for_dev(dev);
    3000                 :          0 :                 pdomain = to_pdomain(io_domain);
    3001                 :          0 :                 attach_device(dev, pdomain);
    3002                 :            :         }
    3003         [ #  # ]:          0 :         if (pdomain == NULL)
    3004                 :            :                 return NULL;
    3005                 :            : 
    3006         [ #  # ]:          0 :         if (!dma_ops_domain(pdomain))
    3007                 :            :                 return NULL;
    3008                 :            : 
    3009                 :            :         /* Only return IOMMUv2 domains */
    3010         [ #  # ]:          0 :         if (!(pdomain->flags & PD_IOMMUV2_MASK))
    3011                 :            :                 return NULL;
    3012                 :            : 
    3013                 :          0 :         return &pdomain->domain;
    3014                 :            : }
    3015                 :            : EXPORT_SYMBOL(amd_iommu_get_v2_domain);
    3016                 :            : 
    3017                 :          0 : void amd_iommu_enable_device_erratum(struct pci_dev *pdev, u32 erratum)
    3018                 :            : {
    3019                 :          0 :         struct iommu_dev_data *dev_data;
    3020                 :            : 
    3021         [ #  # ]:          0 :         if (!amd_iommu_v2_supported())
    3022                 :            :                 return;
    3023                 :            : 
    3024                 :          0 :         dev_data = get_dev_data(&pdev->dev);
    3025                 :          0 :         dev_data->errata |= (1 << erratum);
    3026                 :            : }
    3027                 :            : EXPORT_SYMBOL(amd_iommu_enable_device_erratum);
    3028                 :            : 
    3029                 :          0 : int amd_iommu_device_info(struct pci_dev *pdev,
    3030                 :            :                           struct amd_iommu_device_info *info)
    3031                 :            : {
    3032                 :          0 :         int max_pasids;
    3033                 :          0 :         int pos;
    3034                 :            : 
    3035         [ #  # ]:          0 :         if (pdev == NULL || info == NULL)
    3036                 :            :                 return -EINVAL;
    3037                 :            : 
    3038         [ #  # ]:          0 :         if (!amd_iommu_v2_supported())
    3039                 :            :                 return -EINVAL;
    3040                 :            : 
    3041                 :          0 :         memset(info, 0, sizeof(*info));
    3042                 :            : 
    3043         [ #  # ]:          0 :         if (!pci_ats_disabled()) {
    3044                 :          0 :                 pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_ATS);
    3045         [ #  # ]:          0 :                 if (pos)
    3046                 :          0 :                         info->flags |= AMD_IOMMU_DEVICE_FLAG_ATS_SUP;
    3047                 :            :         }
    3048                 :            : 
    3049                 :          0 :         pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_PRI);
    3050         [ #  # ]:          0 :         if (pos)
    3051                 :          0 :                 info->flags |= AMD_IOMMU_DEVICE_FLAG_PRI_SUP;
    3052                 :            : 
    3053                 :          0 :         pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_PASID);
    3054         [ #  # ]:          0 :         if (pos) {
    3055                 :          0 :                 int features;
    3056                 :            : 
    3057                 :          0 :                 max_pasids = 1 << (9 * (amd_iommu_max_glx_val + 1));
    3058                 :          0 :                 max_pasids = min(max_pasids, (1 << 20));
    3059                 :            : 
    3060                 :          0 :                 info->flags |= AMD_IOMMU_DEVICE_FLAG_PASID_SUP;
    3061                 :          0 :                 info->max_pasids = min(pci_max_pasids(pdev), max_pasids);
    3062                 :            : 
    3063                 :          0 :                 features = pci_pasid_features(pdev);
    3064         [ #  # ]:          0 :                 if (features & PCI_PASID_CAP_EXEC)
    3065                 :          0 :                         info->flags |= AMD_IOMMU_DEVICE_FLAG_EXEC_SUP;
    3066         [ #  # ]:          0 :                 if (features & PCI_PASID_CAP_PRIV)
    3067                 :          0 :                         info->flags |= AMD_IOMMU_DEVICE_FLAG_PRIV_SUP;
    3068                 :            :         }
    3069                 :            : 
    3070                 :            :         return 0;
    3071                 :            : }
    3072                 :            : EXPORT_SYMBOL(amd_iommu_device_info);
    3073                 :            : 
    3074                 :            : #ifdef CONFIG_IRQ_REMAP
    3075                 :            : 
    3076                 :            : /*****************************************************************************
    3077                 :            :  *
    3078                 :            :  * Interrupt Remapping Implementation
    3079                 :            :  *
    3080                 :            :  *****************************************************************************/
    3081                 :            : 
    3082                 :            : static struct irq_chip amd_ir_chip;
    3083                 :            : static DEFINE_SPINLOCK(iommu_table_lock);
    3084                 :            : 
    3085                 :            : static void set_dte_irq_entry(u16 devid, struct irq_remap_table *table)
    3086                 :            : {
    3087                 :            :         u64 dte;
    3088                 :            : 
    3089                 :            :         dte     = amd_iommu_dev_table[devid].data[2];
    3090                 :            :         dte     &= ~DTE_IRQ_PHYS_ADDR_MASK;
    3091                 :            :         dte     |= iommu_virt_to_phys(table->table);
    3092                 :            :         dte     |= DTE_IRQ_REMAP_INTCTL;
    3093                 :            :         dte     |= DTE_IRQ_TABLE_LEN;
    3094                 :            :         dte     |= DTE_IRQ_REMAP_ENABLE;
    3095                 :            : 
    3096                 :            :         amd_iommu_dev_table[devid].data[2] = dte;
    3097                 :            : }
    3098                 :            : 
    3099                 :            : static struct irq_remap_table *get_irq_table(u16 devid)
    3100                 :            : {
    3101                 :            :         struct irq_remap_table *table;
    3102                 :            : 
    3103                 :            :         if (WARN_ONCE(!amd_iommu_rlookup_table[devid],
    3104                 :            :                       "%s: no iommu for devid %x\n", __func__, devid))
    3105                 :            :                 return NULL;
    3106                 :            : 
    3107                 :            :         table = irq_lookup_table[devid];
    3108                 :            :         if (WARN_ONCE(!table, "%s: no table for devid %x\n", __func__, devid))
    3109                 :            :                 return NULL;
    3110                 :            : 
    3111                 :            :         return table;
    3112                 :            : }
    3113                 :            : 
    3114                 :            : static struct irq_remap_table *__alloc_irq_table(void)
    3115                 :            : {
    3116                 :            :         struct irq_remap_table *table;
    3117                 :            : 
    3118                 :            :         table = kzalloc(sizeof(*table), GFP_KERNEL);
    3119                 :            :         if (!table)
    3120                 :            :                 return NULL;
    3121                 :            : 
    3122                 :            :         table->table = kmem_cache_alloc(amd_iommu_irq_cache, GFP_KERNEL);
    3123                 :            :         if (!table->table) {
    3124                 :            :                 kfree(table);
    3125                 :            :                 return NULL;
    3126                 :            :         }
    3127                 :            :         raw_spin_lock_init(&table->lock);
    3128                 :            : 
    3129                 :            :         if (!AMD_IOMMU_GUEST_IR_GA(amd_iommu_guest_ir))
    3130                 :            :                 memset(table->table, 0,
    3131                 :            :                        MAX_IRQS_PER_TABLE * sizeof(u32));
    3132                 :            :         else
    3133                 :            :                 memset(table->table, 0,
    3134                 :            :                        (MAX_IRQS_PER_TABLE * (sizeof(u64) * 2)));
    3135                 :            :         return table;
    3136                 :            : }
    3137                 :            : 
    3138                 :            : static void set_remap_table_entry(struct amd_iommu *iommu, u16 devid,
    3139                 :            :                                   struct irq_remap_table *table)
    3140                 :            : {
    3141                 :            :         irq_lookup_table[devid] = table;
    3142                 :            :         set_dte_irq_entry(devid, table);
    3143                 :            :         iommu_flush_dte(iommu, devid);
    3144                 :            : }
    3145                 :            : 
    3146                 :            : static int set_remap_table_entry_alias(struct pci_dev *pdev, u16 alias,
    3147                 :            :                                        void *data)
    3148                 :            : {
    3149                 :            :         struct irq_remap_table *table = data;
    3150                 :            : 
    3151                 :            :         irq_lookup_table[alias] = table;
    3152                 :            :         set_dte_irq_entry(alias, table);
    3153                 :            : 
    3154                 :            :         iommu_flush_dte(amd_iommu_rlookup_table[alias], alias);
    3155                 :            : 
    3156                 :            :         return 0;
    3157                 :            : }
    3158                 :            : 
    3159                 :            : static struct irq_remap_table *alloc_irq_table(u16 devid, struct pci_dev *pdev)
    3160                 :            : {
    3161                 :            :         struct irq_remap_table *table = NULL;
    3162                 :            :         struct irq_remap_table *new_table = NULL;
    3163                 :            :         struct amd_iommu *iommu;
    3164                 :            :         unsigned long flags;
    3165                 :            :         u16 alias;
    3166                 :            : 
    3167                 :            :         spin_lock_irqsave(&iommu_table_lock, flags);
    3168                 :            : 
    3169                 :            :         iommu = amd_iommu_rlookup_table[devid];
    3170                 :            :         if (!iommu)
    3171                 :            :                 goto out_unlock;
    3172                 :            : 
    3173                 :            :         table = irq_lookup_table[devid];
    3174                 :            :         if (table)
    3175                 :            :                 goto out_unlock;
    3176                 :            : 
    3177                 :            :         alias = amd_iommu_alias_table[devid];
    3178                 :            :         table = irq_lookup_table[alias];
    3179                 :            :         if (table) {
    3180                 :            :                 set_remap_table_entry(iommu, devid, table);
    3181                 :            :                 goto out_wait;
    3182                 :            :         }
    3183                 :            :         spin_unlock_irqrestore(&iommu_table_lock, flags);
    3184                 :            : 
    3185                 :            :         /* Nothing there yet, allocate new irq remapping table */
    3186                 :            :         new_table = __alloc_irq_table();
    3187                 :            :         if (!new_table)
    3188                 :            :                 return NULL;
    3189                 :            : 
    3190                 :            :         spin_lock_irqsave(&iommu_table_lock, flags);
    3191                 :            : 
    3192                 :            :         table = irq_lookup_table[devid];
    3193                 :            :         if (table)
    3194                 :            :                 goto out_unlock;
    3195                 :            : 
    3196                 :            :         table = irq_lookup_table[alias];
    3197                 :            :         if (table) {
    3198                 :            :                 set_remap_table_entry(iommu, devid, table);
    3199                 :            :                 goto out_wait;
    3200                 :            :         }
    3201                 :            : 
    3202                 :            :         table = new_table;
    3203                 :            :         new_table = NULL;
    3204                 :            : 
    3205                 :            :         if (pdev)
    3206                 :            :                 pci_for_each_dma_alias(pdev, set_remap_table_entry_alias,
    3207                 :            :                                        table);
    3208                 :            :         else
    3209                 :            :                 set_remap_table_entry(iommu, devid, table);
    3210                 :            : 
    3211                 :            :         if (devid != alias)
    3212                 :            :                 set_remap_table_entry(iommu, alias, table);
    3213                 :            : 
    3214                 :            : out_wait:
    3215                 :            :         iommu_completion_wait(iommu);
    3216                 :            : 
    3217                 :            : out_unlock:
    3218                 :            :         spin_unlock_irqrestore(&iommu_table_lock, flags);
    3219                 :            : 
    3220                 :            :         if (new_table) {
    3221                 :            :                 kmem_cache_free(amd_iommu_irq_cache, new_table->table);
    3222                 :            :                 kfree(new_table);
    3223                 :            :         }
    3224                 :            :         return table;
    3225                 :            : }
    3226                 :            : 
    3227                 :            : static int alloc_irq_index(u16 devid, int count, bool align,
    3228                 :            :                            struct pci_dev *pdev)
    3229                 :            : {
    3230                 :            :         struct irq_remap_table *table;
    3231                 :            :         int index, c, alignment = 1;
    3232                 :            :         unsigned long flags;
    3233                 :            :         struct amd_iommu *iommu = amd_iommu_rlookup_table[devid];
    3234                 :            : 
    3235                 :            :         if (!iommu)
    3236                 :            :                 return -ENODEV;
    3237                 :            : 
    3238                 :            :         table = alloc_irq_table(devid, pdev);
    3239                 :            :         if (!table)
    3240                 :            :                 return -ENODEV;
    3241                 :            : 
    3242                 :            :         if (align)
    3243                 :            :                 alignment = roundup_pow_of_two(count);
    3244                 :            : 
    3245                 :            :         raw_spin_lock_irqsave(&table->lock, flags);
    3246                 :            : 
    3247                 :            :         /* Scan table for free entries */
    3248                 :            :         for (index = ALIGN(table->min_index, alignment), c = 0;
    3249                 :            :              index < MAX_IRQS_PER_TABLE;) {
    3250                 :            :                 if (!iommu->irte_ops->is_allocated(table, index)) {
    3251                 :            :                         c += 1;
    3252                 :            :                 } else {
    3253                 :            :                         c     = 0;
    3254                 :            :                         index = ALIGN(index + 1, alignment);
    3255                 :            :                         continue;
    3256                 :            :                 }
    3257                 :            : 
    3258                 :            :                 if (c == count) {
    3259                 :            :                         for (; c != 0; --c)
    3260                 :            :                                 iommu->irte_ops->set_allocated(table, index - c + 1);
    3261                 :            : 
    3262                 :            :                         index -= count - 1;
    3263                 :            :                         goto out;
    3264                 :            :                 }
    3265                 :            : 
    3266                 :            :                 index++;
    3267                 :            :         }
    3268                 :            : 
    3269                 :            :         index = -ENOSPC;
    3270                 :            : 
    3271                 :            : out:
    3272                 :            :         raw_spin_unlock_irqrestore(&table->lock, flags);
    3273                 :            : 
    3274                 :            :         return index;
    3275                 :            : }
    3276                 :            : 
    3277                 :            : static int modify_irte_ga(u16 devid, int index, struct irte_ga *irte,
    3278                 :            :                           struct amd_ir_data *data)
    3279                 :            : {
    3280                 :            :         struct irq_remap_table *table;
    3281                 :            :         struct amd_iommu *iommu;
    3282                 :            :         unsigned long flags;
    3283                 :            :         struct irte_ga *entry;
    3284                 :            : 
    3285                 :            :         iommu = amd_iommu_rlookup_table[devid];
    3286                 :            :         if (iommu == NULL)
    3287                 :            :                 return -EINVAL;
    3288                 :            : 
    3289                 :            :         table = get_irq_table(devid);
    3290                 :            :         if (!table)
    3291                 :            :                 return -ENOMEM;
    3292                 :            : 
    3293                 :            :         raw_spin_lock_irqsave(&table->lock, flags);
    3294                 :            : 
    3295                 :            :         entry = (struct irte_ga *)table->table;
    3296                 :            :         entry = &entry[index];
    3297                 :            :         entry->lo.fields_remap.valid = 0;
    3298                 :            :         entry->hi.val = irte->hi.val;
    3299                 :            :         entry->lo.val = irte->lo.val;
    3300                 :            :         entry->lo.fields_remap.valid = 1;
    3301                 :            :         if (data)
    3302                 :            :                 data->ref = entry;
    3303                 :            : 
    3304                 :            :         raw_spin_unlock_irqrestore(&table->lock, flags);
    3305                 :            : 
    3306                 :            :         iommu_flush_irt(iommu, devid);
    3307                 :            :         iommu_completion_wait(iommu);
    3308                 :            : 
    3309                 :            :         return 0;
    3310                 :            : }
    3311                 :            : 
    3312                 :            : static int modify_irte(u16 devid, int index, union irte *irte)
    3313                 :            : {
    3314                 :            :         struct irq_remap_table *table;
    3315                 :            :         struct amd_iommu *iommu;
    3316                 :            :         unsigned long flags;
    3317                 :            : 
    3318                 :            :         iommu = amd_iommu_rlookup_table[devid];
    3319                 :            :         if (iommu == NULL)
    3320                 :            :                 return -EINVAL;
    3321                 :            : 
    3322                 :            :         table = get_irq_table(devid);
    3323                 :            :         if (!table)
    3324                 :            :                 return -ENOMEM;
    3325                 :            : 
    3326                 :            :         raw_spin_lock_irqsave(&table->lock, flags);
    3327                 :            :         table->table[index] = irte->val;
    3328                 :            :         raw_spin_unlock_irqrestore(&table->lock, flags);
    3329                 :            : 
    3330                 :            :         iommu_flush_irt(iommu, devid);
    3331                 :            :         iommu_completion_wait(iommu);
    3332                 :            : 
    3333                 :            :         return 0;
    3334                 :            : }
    3335                 :            : 
    3336                 :            : static void free_irte(u16 devid, int index)
    3337                 :            : {
    3338                 :            :         struct irq_remap_table *table;
    3339                 :            :         struct amd_iommu *iommu;
    3340                 :            :         unsigned long flags;
    3341                 :            : 
    3342                 :            :         iommu = amd_iommu_rlookup_table[devid];
    3343                 :            :         if (iommu == NULL)
    3344                 :            :                 return;
    3345                 :            : 
    3346                 :            :         table = get_irq_table(devid);
    3347                 :            :         if (!table)
    3348                 :            :                 return;
    3349                 :            : 
    3350                 :            :         raw_spin_lock_irqsave(&table->lock, flags);
    3351                 :            :         iommu->irte_ops->clear_allocated(table, index);
    3352                 :            :         raw_spin_unlock_irqrestore(&table->lock, flags);
    3353                 :            : 
    3354                 :            :         iommu_flush_irt(iommu, devid);
    3355                 :            :         iommu_completion_wait(iommu);
    3356                 :            : }
    3357                 :            : 
    3358                 :            : static void irte_prepare(void *entry,
    3359                 :            :                          u32 delivery_mode, u32 dest_mode,
    3360                 :            :                          u8 vector, u32 dest_apicid, int devid)
    3361                 :            : {
    3362                 :            :         union irte *irte = (union irte *) entry;
    3363                 :            : 
    3364                 :            :         irte->val                = 0;
    3365                 :            :         irte->fields.vector      = vector;
    3366                 :            :         irte->fields.int_type    = delivery_mode;
    3367                 :            :         irte->fields.destination = dest_apicid;
    3368                 :            :         irte->fields.dm          = dest_mode;
    3369                 :            :         irte->fields.valid       = 1;
    3370                 :            : }
    3371                 :            : 
    3372                 :            : static void irte_ga_prepare(void *entry,
    3373                 :            :                             u32 delivery_mode, u32 dest_mode,
    3374                 :            :                             u8 vector, u32 dest_apicid, int devid)
    3375                 :            : {
    3376                 :            :         struct irte_ga *irte = (struct irte_ga *) entry;
    3377                 :            : 
    3378                 :            :         irte->lo.val                      = 0;
    3379                 :            :         irte->hi.val                      = 0;
    3380                 :            :         irte->lo.fields_remap.int_type    = delivery_mode;
    3381                 :            :         irte->lo.fields_remap.dm          = dest_mode;
    3382                 :            :         irte->hi.fields.vector            = vector;
    3383                 :            :         irte->lo.fields_remap.destination = APICID_TO_IRTE_DEST_LO(dest_apicid);
    3384                 :            :         irte->hi.fields.destination       = APICID_TO_IRTE_DEST_HI(dest_apicid);
    3385                 :            :         irte->lo.fields_remap.valid       = 1;
    3386                 :            : }
    3387                 :            : 
    3388                 :            : static void irte_activate(void *entry, u16 devid, u16 index)
    3389                 :            : {
    3390                 :            :         union irte *irte = (union irte *) entry;
    3391                 :            : 
    3392                 :            :         irte->fields.valid = 1;
    3393                 :            :         modify_irte(devid, index, irte);
    3394                 :            : }
    3395                 :            : 
    3396                 :            : static void irte_ga_activate(void *entry, u16 devid, u16 index)
    3397                 :            : {
    3398                 :            :         struct irte_ga *irte = (struct irte_ga *) entry;
    3399                 :            : 
    3400                 :            :         irte->lo.fields_remap.valid = 1;
    3401                 :            :         modify_irte_ga(devid, index, irte, NULL);
    3402                 :            : }
    3403                 :            : 
    3404                 :            : static void irte_deactivate(void *entry, u16 devid, u16 index)
    3405                 :            : {
    3406                 :            :         union irte *irte = (union irte *) entry;
    3407                 :            : 
    3408                 :            :         irte->fields.valid = 0;
    3409                 :            :         modify_irte(devid, index, irte);
    3410                 :            : }
    3411                 :            : 
    3412                 :            : static void irte_ga_deactivate(void *entry, u16 devid, u16 index)
    3413                 :            : {
    3414                 :            :         struct irte_ga *irte = (struct irte_ga *) entry;
    3415                 :            : 
    3416                 :            :         irte->lo.fields_remap.valid = 0;
    3417                 :            :         modify_irte_ga(devid, index, irte, NULL);
    3418                 :            : }
    3419                 :            : 
    3420                 :            : static void irte_set_affinity(void *entry, u16 devid, u16 index,
    3421                 :            :                               u8 vector, u32 dest_apicid)
    3422                 :            : {
    3423                 :            :         union irte *irte = (union irte *) entry;
    3424                 :            : 
    3425                 :            :         irte->fields.vector = vector;
    3426                 :            :         irte->fields.destination = dest_apicid;
    3427                 :            :         modify_irte(devid, index, irte);
    3428                 :            : }
    3429                 :            : 
    3430                 :            : static void irte_ga_set_affinity(void *entry, u16 devid, u16 index,
    3431                 :            :                                  u8 vector, u32 dest_apicid)
    3432                 :            : {
    3433                 :            :         struct irte_ga *irte = (struct irte_ga *) entry;
    3434                 :            : 
    3435                 :            :         if (!irte->lo.fields_remap.guest_mode) {
    3436                 :            :                 irte->hi.fields.vector = vector;
    3437                 :            :                 irte->lo.fields_remap.destination =
    3438                 :            :                                         APICID_TO_IRTE_DEST_LO(dest_apicid);
    3439                 :            :                 irte->hi.fields.destination =
    3440                 :            :                                         APICID_TO_IRTE_DEST_HI(dest_apicid);
    3441                 :            :                 modify_irte_ga(devid, index, irte, NULL);
    3442                 :            :         }
    3443                 :            : }
    3444                 :            : 
    3445                 :            : #define IRTE_ALLOCATED (~1U)
    3446                 :            : static void irte_set_allocated(struct irq_remap_table *table, int index)
    3447                 :            : {
    3448                 :            :         table->table[index] = IRTE_ALLOCATED;
    3449                 :            : }
    3450                 :            : 
    3451                 :            : static void irte_ga_set_allocated(struct irq_remap_table *table, int index)
    3452                 :            : {
    3453                 :            :         struct irte_ga *ptr = (struct irte_ga *)table->table;
    3454                 :            :         struct irte_ga *irte = &ptr[index];
    3455                 :            : 
    3456                 :            :         memset(&irte->lo.val, 0, sizeof(u64));
    3457                 :            :         memset(&irte->hi.val, 0, sizeof(u64));
    3458                 :            :         irte->hi.fields.vector = 0xff;
    3459                 :            : }
    3460                 :            : 
    3461                 :            : static bool irte_is_allocated(struct irq_remap_table *table, int index)
    3462                 :            : {
    3463                 :            :         union irte *ptr = (union irte *)table->table;
    3464                 :            :         union irte *irte = &ptr[index];
    3465                 :            : 
    3466                 :            :         return irte->val != 0;
    3467                 :            : }
    3468                 :            : 
    3469                 :            : static bool irte_ga_is_allocated(struct irq_remap_table *table, int index)
    3470                 :            : {
    3471                 :            :         struct irte_ga *ptr = (struct irte_ga *)table->table;
    3472                 :            :         struct irte_ga *irte = &ptr[index];
    3473                 :            : 
    3474                 :            :         return irte->hi.fields.vector != 0;
    3475                 :            : }
    3476                 :            : 
    3477                 :            : static void irte_clear_allocated(struct irq_remap_table *table, int index)
    3478                 :            : {
    3479                 :            :         table->table[index] = 0;
    3480                 :            : }
    3481                 :            : 
    3482                 :            : static void irte_ga_clear_allocated(struct irq_remap_table *table, int index)
    3483                 :            : {
    3484                 :            :         struct irte_ga *ptr = (struct irte_ga *)table->table;
    3485                 :            :         struct irte_ga *irte = &ptr[index];
    3486                 :            : 
    3487                 :            :         memset(&irte->lo.val, 0, sizeof(u64));
    3488                 :            :         memset(&irte->hi.val, 0, sizeof(u64));
    3489                 :            : }
    3490                 :            : 
    3491                 :            : static int get_devid(struct irq_alloc_info *info)
    3492                 :            : {
    3493                 :            :         int devid = -1;
    3494                 :            : 
    3495                 :            :         switch (info->type) {
    3496                 :            :         case X86_IRQ_ALLOC_TYPE_IOAPIC:
    3497                 :            :                 devid     = get_ioapic_devid(info->ioapic_id);
    3498                 :            :                 break;
    3499                 :            :         case X86_IRQ_ALLOC_TYPE_HPET:
    3500                 :            :                 devid     = get_hpet_devid(info->hpet_id);
    3501                 :            :                 break;
    3502                 :            :         case X86_IRQ_ALLOC_TYPE_MSI:
    3503                 :            :         case X86_IRQ_ALLOC_TYPE_MSIX:
    3504                 :            :                 devid = get_device_id(&info->msi_dev->dev);
    3505                 :            :                 break;
    3506                 :            :         default:
    3507                 :            :                 BUG_ON(1);
    3508                 :            :                 break;
    3509                 :            :         }
    3510                 :            : 
    3511                 :            :         return devid;
    3512                 :            : }
    3513                 :            : 
    3514                 :            : static struct irq_domain *get_ir_irq_domain(struct irq_alloc_info *info)
    3515                 :            : {
    3516                 :            :         struct amd_iommu *iommu;
    3517                 :            :         int devid;
    3518                 :            : 
    3519                 :            :         if (!info)
    3520                 :            :                 return NULL;
    3521                 :            : 
    3522                 :            :         devid = get_devid(info);
    3523                 :            :         if (devid >= 0) {
    3524                 :            :                 iommu = amd_iommu_rlookup_table[devid];
    3525                 :            :                 if (iommu)
    3526                 :            :                         return iommu->ir_domain;
    3527                 :            :         }
    3528                 :            : 
    3529                 :            :         return NULL;
    3530                 :            : }
    3531                 :            : 
    3532                 :            : static struct irq_domain *get_irq_domain(struct irq_alloc_info *info)
    3533                 :            : {
    3534                 :            :         struct amd_iommu *iommu;
    3535                 :            :         int devid;
    3536                 :            : 
    3537                 :            :         if (!info)
    3538                 :            :                 return NULL;
    3539                 :            : 
    3540                 :            :         switch (info->type) {
    3541                 :            :         case X86_IRQ_ALLOC_TYPE_MSI:
    3542                 :            :         case X86_IRQ_ALLOC_TYPE_MSIX:
    3543                 :            :                 devid = get_device_id(&info->msi_dev->dev);
    3544                 :            :                 if (devid < 0)
    3545                 :            :                         return NULL;
    3546                 :            : 
    3547                 :            :                 iommu = amd_iommu_rlookup_table[devid];
    3548                 :            :                 if (iommu)
    3549                 :            :                         return iommu->msi_domain;
    3550                 :            :                 break;
    3551                 :            :         default:
    3552                 :            :                 break;
    3553                 :            :         }
    3554                 :            : 
    3555                 :            :         return NULL;
    3556                 :            : }
    3557                 :            : 
    3558                 :            : struct irq_remap_ops amd_iommu_irq_ops = {
    3559                 :            :         .prepare                = amd_iommu_prepare,
    3560                 :            :         .enable                 = amd_iommu_enable,
    3561                 :            :         .disable                = amd_iommu_disable,
    3562                 :            :         .reenable               = amd_iommu_reenable,
    3563                 :            :         .enable_faulting        = amd_iommu_enable_faulting,
    3564                 :            :         .get_ir_irq_domain      = get_ir_irq_domain,
    3565                 :            :         .get_irq_domain         = get_irq_domain,
    3566                 :            : };
    3567                 :            : 
    3568                 :            : static void irq_remapping_prepare_irte(struct amd_ir_data *data,
    3569                 :            :                                        struct irq_cfg *irq_cfg,
    3570                 :            :                                        struct irq_alloc_info *info,
    3571                 :            :                                        int devid, int index, int sub_handle)
    3572                 :            : {
    3573                 :            :         struct irq_2_irte *irte_info = &data->irq_2_irte;
    3574                 :            :         struct msi_msg *msg = &data->msi_entry;
    3575                 :            :         struct IO_APIC_route_entry *entry;
    3576                 :            :         struct amd_iommu *iommu = amd_iommu_rlookup_table[devid];
    3577                 :            : 
    3578                 :            :         if (!iommu)
    3579                 :            :                 return;
    3580                 :            : 
    3581                 :            :         data->irq_2_irte.devid = devid;
    3582                 :            :         data->irq_2_irte.index = index + sub_handle;
    3583                 :            :         iommu->irte_ops->prepare(data->entry, apic->irq_delivery_mode,
    3584                 :            :                                  apic->irq_dest_mode, irq_cfg->vector,
    3585                 :            :                                  irq_cfg->dest_apicid, devid);
    3586                 :            : 
    3587                 :            :         switch (info->type) {
    3588                 :            :         case X86_IRQ_ALLOC_TYPE_IOAPIC:
    3589                 :            :                 /* Setup IOAPIC entry */
    3590                 :            :                 entry = info->ioapic_entry;
    3591                 :            :                 info->ioapic_entry = NULL;
    3592                 :            :                 memset(entry, 0, sizeof(*entry));
    3593                 :            :                 entry->vector        = index;
    3594                 :            :                 entry->mask          = 0;
    3595                 :            :                 entry->trigger       = info->ioapic_trigger;
    3596                 :            :                 entry->polarity      = info->ioapic_polarity;
    3597                 :            :                 /* Mask level triggered irqs. */
    3598                 :            :                 if (info->ioapic_trigger)
    3599                 :            :                         entry->mask = 1;
    3600                 :            :                 break;
    3601                 :            : 
    3602                 :            :         case X86_IRQ_ALLOC_TYPE_HPET:
    3603                 :            :         case X86_IRQ_ALLOC_TYPE_MSI:
    3604                 :            :         case X86_IRQ_ALLOC_TYPE_MSIX:
    3605                 :            :                 msg->address_hi = MSI_ADDR_BASE_HI;
    3606                 :            :                 msg->address_lo = MSI_ADDR_BASE_LO;
    3607                 :            :                 msg->data = irte_info->index;
    3608                 :            :                 break;
    3609                 :            : 
    3610                 :            :         default:
    3611                 :            :                 BUG_ON(1);
    3612                 :            :                 break;
    3613                 :            :         }
    3614                 :            : }
    3615                 :            : 
    3616                 :            : struct amd_irte_ops irte_32_ops = {
    3617                 :            :         .prepare = irte_prepare,
    3618                 :            :         .activate = irte_activate,
    3619                 :            :         .deactivate = irte_deactivate,
    3620                 :            :         .set_affinity = irte_set_affinity,
    3621                 :            :         .set_allocated = irte_set_allocated,
    3622                 :            :         .is_allocated = irte_is_allocated,
    3623                 :            :         .clear_allocated = irte_clear_allocated,
    3624                 :            : };
    3625                 :            : 
    3626                 :            : struct amd_irte_ops irte_128_ops = {
    3627                 :            :         .prepare = irte_ga_prepare,
    3628                 :            :         .activate = irte_ga_activate,
    3629                 :            :         .deactivate = irte_ga_deactivate,
    3630                 :            :         .set_affinity = irte_ga_set_affinity,
    3631                 :            :         .set_allocated = irte_ga_set_allocated,
    3632                 :            :         .is_allocated = irte_ga_is_allocated,
    3633                 :            :         .clear_allocated = irte_ga_clear_allocated,
    3634                 :            : };
    3635                 :            : 
    3636                 :            : static int irq_remapping_alloc(struct irq_domain *domain, unsigned int virq,
    3637                 :            :                                unsigned int nr_irqs, void *arg)
    3638                 :            : {
    3639                 :            :         struct irq_alloc_info *info = arg;
    3640                 :            :         struct irq_data *irq_data;
    3641                 :            :         struct amd_ir_data *data = NULL;
    3642                 :            :         struct irq_cfg *cfg;
    3643                 :            :         int i, ret, devid;
    3644                 :            :         int index;
    3645                 :            : 
    3646                 :            :         if (!info)
    3647                 :            :                 return -EINVAL;
    3648                 :            :         if (nr_irqs > 1 && info->type != X86_IRQ_ALLOC_TYPE_MSI &&
    3649                 :            :             info->type != X86_IRQ_ALLOC_TYPE_MSIX)
    3650                 :            :                 return -EINVAL;
    3651                 :            : 
    3652                 :            :         /*
    3653                 :            :          * With IRQ remapping enabled, don't need contiguous CPU vectors
    3654                 :            :          * to support multiple MSI interrupts.
    3655                 :            :          */
    3656                 :            :         if (info->type == X86_IRQ_ALLOC_TYPE_MSI)
    3657                 :            :                 info->flags &= ~X86_IRQ_ALLOC_CONTIGUOUS_VECTORS;
    3658                 :            : 
    3659                 :            :         devid = get_devid(info);
    3660                 :            :         if (devid < 0)
    3661                 :            :                 return -EINVAL;
    3662                 :            : 
    3663                 :            :         ret = irq_domain_alloc_irqs_parent(domain, virq, nr_irqs, arg);
    3664                 :            :         if (ret < 0)
    3665                 :            :                 return ret;
    3666                 :            : 
    3667                 :            :         if (info->type == X86_IRQ_ALLOC_TYPE_IOAPIC) {
    3668                 :            :                 struct irq_remap_table *table;
    3669                 :            :                 struct amd_iommu *iommu;
    3670                 :            : 
    3671                 :            :                 table = alloc_irq_table(devid, NULL);
    3672                 :            :                 if (table) {
    3673                 :            :                         if (!table->min_index) {
    3674                 :            :                                 /*
    3675                 :            :                                  * Keep the first 32 indexes free for IOAPIC
    3676                 :            :                                  * interrupts.
    3677                 :            :                                  */
    3678                 :            :                                 table->min_index = 32;
    3679                 :            :                                 iommu = amd_iommu_rlookup_table[devid];
    3680                 :            :                                 for (i = 0; i < 32; ++i)
    3681                 :            :                                         iommu->irte_ops->set_allocated(table, i);
    3682                 :            :                         }
    3683                 :            :                         WARN_ON(table->min_index != 32);
    3684                 :            :                         index = info->ioapic_pin;
    3685                 :            :                 } else {
    3686                 :            :                         index = -ENOMEM;
    3687                 :            :                 }
    3688                 :            :         } else if (info->type == X86_IRQ_ALLOC_TYPE_MSI ||
    3689                 :            :                    info->type == X86_IRQ_ALLOC_TYPE_MSIX) {
    3690                 :            :                 bool align = (info->type == X86_IRQ_ALLOC_TYPE_MSI);
    3691                 :            : 
    3692                 :            :                 index = alloc_irq_index(devid, nr_irqs, align, info->msi_dev);
    3693                 :            :         } else {
    3694                 :            :                 index = alloc_irq_index(devid, nr_irqs, false, NULL);
    3695                 :            :         }
    3696                 :            : 
    3697                 :            :         if (index < 0) {
    3698                 :            :                 pr_warn("Failed to allocate IRTE\n");
    3699                 :            :                 ret = index;
    3700                 :            :                 goto out_free_parent;
    3701                 :            :         }
    3702                 :            : 
    3703                 :            :         for (i = 0; i < nr_irqs; i++) {
    3704                 :            :                 irq_data = irq_domain_get_irq_data(domain, virq + i);
    3705                 :            :                 cfg = irqd_cfg(irq_data);
    3706                 :            :                 if (!irq_data || !cfg) {
    3707                 :            :                         ret = -EINVAL;
    3708                 :            :                         goto out_free_data;
    3709                 :            :                 }
    3710                 :            : 
    3711                 :            :                 ret = -ENOMEM;
    3712                 :            :                 data = kzalloc(sizeof(*data), GFP_KERNEL);
    3713                 :            :                 if (!data)
    3714                 :            :                         goto out_free_data;
    3715                 :            : 
    3716                 :            :                 if (!AMD_IOMMU_GUEST_IR_GA(amd_iommu_guest_ir))
    3717                 :            :                         data->entry = kzalloc(sizeof(union irte), GFP_KERNEL);
    3718                 :            :                 else
    3719                 :            :                         data->entry = kzalloc(sizeof(struct irte_ga),
    3720                 :            :                                                      GFP_KERNEL);
    3721                 :            :                 if (!data->entry) {
    3722                 :            :                         kfree(data);
    3723                 :            :                         goto out_free_data;
    3724                 :            :                 }
    3725                 :            : 
    3726                 :            :                 irq_data->hwirq = (devid << 16) + i;
    3727                 :            :                 irq_data->chip_data = data;
    3728                 :            :                 irq_data->chip = &amd_ir_chip;
    3729                 :            :                 irq_remapping_prepare_irte(data, cfg, info, devid, index, i);
    3730                 :            :                 irq_set_status_flags(virq + i, IRQ_MOVE_PCNTXT);
    3731                 :            :         }
    3732                 :            : 
    3733                 :            :         return 0;
    3734                 :            : 
    3735                 :            : out_free_data:
    3736                 :            :         for (i--; i >= 0; i--) {
    3737                 :            :                 irq_data = irq_domain_get_irq_data(domain, virq + i);
    3738                 :            :                 if (irq_data)
    3739                 :            :                         kfree(irq_data->chip_data);
    3740                 :            :         }
    3741                 :            :         for (i = 0; i < nr_irqs; i++)
    3742                 :            :                 free_irte(devid, index + i);
    3743                 :            : out_free_parent:
    3744                 :            :         irq_domain_free_irqs_common(domain, virq, nr_irqs);
    3745                 :            :         return ret;
    3746                 :            : }
    3747                 :            : 
    3748                 :            : static void irq_remapping_free(struct irq_domain *domain, unsigned int virq,
    3749                 :            :                                unsigned int nr_irqs)
    3750                 :            : {
    3751                 :            :         struct irq_2_irte *irte_info;
    3752                 :            :         struct irq_data *irq_data;
    3753                 :            :         struct amd_ir_data *data;
    3754                 :            :         int i;
    3755                 :            : 
    3756                 :            :         for (i = 0; i < nr_irqs; i++) {
    3757                 :            :                 irq_data = irq_domain_get_irq_data(domain, virq  + i);
    3758                 :            :                 if (irq_data && irq_data->chip_data) {
    3759                 :            :                         data = irq_data->chip_data;
    3760                 :            :                         irte_info = &data->irq_2_irte;
    3761                 :            :                         free_irte(irte_info->devid, irte_info->index);
    3762                 :            :                         kfree(data->entry);
    3763                 :            :                         kfree(data);
    3764                 :            :                 }
    3765                 :            :         }
    3766                 :            :         irq_domain_free_irqs_common(domain, virq, nr_irqs);
    3767                 :            : }
    3768                 :            : 
    3769                 :            : static void amd_ir_update_irte(struct irq_data *irqd, struct amd_iommu *iommu,
    3770                 :            :                                struct amd_ir_data *ir_data,
    3771                 :            :                                struct irq_2_irte *irte_info,
    3772                 :            :                                struct irq_cfg *cfg);
    3773                 :            : 
    3774                 :            : static int irq_remapping_activate(struct irq_domain *domain,
    3775                 :            :                                   struct irq_data *irq_data, bool reserve)
    3776                 :            : {
    3777                 :            :         struct amd_ir_data *data = irq_data->chip_data;
    3778                 :            :         struct irq_2_irte *irte_info = &data->irq_2_irte;
    3779                 :            :         struct amd_iommu *iommu = amd_iommu_rlookup_table[irte_info->devid];
    3780                 :            :         struct irq_cfg *cfg = irqd_cfg(irq_data);
    3781                 :            : 
    3782                 :            :         if (!iommu)
    3783                 :            :                 return 0;
    3784                 :            : 
    3785                 :            :         iommu->irte_ops->activate(data->entry, irte_info->devid,
    3786                 :            :                                   irte_info->index);
    3787                 :            :         amd_ir_update_irte(irq_data, iommu, data, irte_info, cfg);
    3788                 :            :         return 0;
    3789                 :            : }
    3790                 :            : 
    3791                 :            : static void irq_remapping_deactivate(struct irq_domain *domain,
    3792                 :            :                                      struct irq_data *irq_data)
    3793                 :            : {
    3794                 :            :         struct amd_ir_data *data = irq_data->chip_data;
    3795                 :            :         struct irq_2_irte *irte_info = &data->irq_2_irte;
    3796                 :            :         struct amd_iommu *iommu = amd_iommu_rlookup_table[irte_info->devid];
    3797                 :            : 
    3798                 :            :         if (iommu)
    3799                 :            :                 iommu->irte_ops->deactivate(data->entry, irte_info->devid,
    3800                 :            :                                             irte_info->index);
    3801                 :            : }
    3802                 :            : 
    3803                 :            : static const struct irq_domain_ops amd_ir_domain_ops = {
    3804                 :            :         .alloc = irq_remapping_alloc,
    3805                 :            :         .free = irq_remapping_free,
    3806                 :            :         .activate = irq_remapping_activate,
    3807                 :            :         .deactivate = irq_remapping_deactivate,
    3808                 :            : };
    3809                 :            : 
    3810                 :            : int amd_iommu_activate_guest_mode(void *data)
    3811                 :            : {
    3812                 :            :         struct amd_ir_data *ir_data = (struct amd_ir_data *)data;
    3813                 :            :         struct irte_ga *entry = (struct irte_ga *) ir_data->entry;
    3814                 :            : 
    3815                 :            :         if (!AMD_IOMMU_GUEST_IR_VAPIC(amd_iommu_guest_ir) ||
    3816                 :            :             !entry || entry->lo.fields_vapic.guest_mode)
    3817                 :            :                 return 0;
    3818                 :            : 
    3819                 :            :         entry->lo.val = 0;
    3820                 :            :         entry->hi.val = 0;
    3821                 :            : 
    3822                 :            :         entry->lo.fields_vapic.guest_mode  = 1;
    3823                 :            :         entry->lo.fields_vapic.ga_log_intr = 1;
    3824                 :            :         entry->hi.fields.ga_root_ptr       = ir_data->ga_root_ptr;
    3825                 :            :         entry->hi.fields.vector            = ir_data->ga_vector;
    3826                 :            :         entry->lo.fields_vapic.ga_tag      = ir_data->ga_tag;
    3827                 :            : 
    3828                 :            :         return modify_irte_ga(ir_data->irq_2_irte.devid,
    3829                 :            :                               ir_data->irq_2_irte.index, entry, ir_data);
    3830                 :            : }
    3831                 :            : EXPORT_SYMBOL(amd_iommu_activate_guest_mode);
    3832                 :            : 
    3833                 :            : int amd_iommu_deactivate_guest_mode(void *data)
    3834                 :            : {
    3835                 :            :         struct amd_ir_data *ir_data = (struct amd_ir_data *)data;
    3836                 :            :         struct irte_ga *entry = (struct irte_ga *) ir_data->entry;
    3837                 :            :         struct irq_cfg *cfg = ir_data->cfg;
    3838                 :            : 
    3839                 :            :         if (!AMD_IOMMU_GUEST_IR_VAPIC(amd_iommu_guest_ir) ||
    3840                 :            :             !entry || !entry->lo.fields_vapic.guest_mode)
    3841                 :            :                 return 0;
    3842                 :            : 
    3843                 :            :         entry->lo.val = 0;
    3844                 :            :         entry->hi.val = 0;
    3845                 :            : 
    3846                 :            :         entry->lo.fields_remap.dm          = apic->irq_dest_mode;
    3847                 :            :         entry->lo.fields_remap.int_type    = apic->irq_delivery_mode;
    3848                 :            :         entry->hi.fields.vector            = cfg->vector;
    3849                 :            :         entry->lo.fields_remap.destination =
    3850                 :            :                                 APICID_TO_IRTE_DEST_LO(cfg->dest_apicid);
    3851                 :            :         entry->hi.fields.destination =
    3852                 :            :                                 APICID_TO_IRTE_DEST_HI(cfg->dest_apicid);
    3853                 :            : 
    3854                 :            :         return modify_irte_ga(ir_data->irq_2_irte.devid,
    3855                 :            :                               ir_data->irq_2_irte.index, entry, ir_data);
    3856                 :            : }
    3857                 :            : EXPORT_SYMBOL(amd_iommu_deactivate_guest_mode);
    3858                 :            : 
    3859                 :            : static int amd_ir_set_vcpu_affinity(struct irq_data *data, void *vcpu_info)
    3860                 :            : {
    3861                 :            :         int ret;
    3862                 :            :         struct amd_iommu *iommu;
    3863                 :            :         struct amd_iommu_pi_data *pi_data = vcpu_info;
    3864                 :            :         struct vcpu_data *vcpu_pi_info = pi_data->vcpu_data;
    3865                 :            :         struct amd_ir_data *ir_data = data->chip_data;
    3866                 :            :         struct irq_2_irte *irte_info = &ir_data->irq_2_irte;
    3867                 :            :         struct iommu_dev_data *dev_data = search_dev_data(irte_info->devid);
    3868                 :            : 
    3869                 :            :         /* Note:
    3870                 :            :          * This device has never been set up for guest mode.
    3871                 :            :          * we should not modify the IRTE
    3872                 :            :          */
    3873                 :            :         if (!dev_data || !dev_data->use_vapic)
    3874                 :            :                 return 0;
    3875                 :            : 
    3876                 :            :         ir_data->cfg = irqd_cfg(data);
    3877                 :            :         pi_data->ir_data = ir_data;
    3878                 :            : 
    3879                 :            :         /* Note:
    3880                 :            :          * SVM tries to set up for VAPIC mode, but we are in
    3881                 :            :          * legacy mode. So, we force legacy mode instead.
    3882                 :            :          */
    3883                 :            :         if (!AMD_IOMMU_GUEST_IR_VAPIC(amd_iommu_guest_ir)) {
    3884                 :            :                 pr_debug("%s: Fall back to using intr legacy remap\n",
    3885                 :            :                          __func__);
    3886                 :            :                 pi_data->is_guest_mode = false;
    3887                 :            :         }
    3888                 :            : 
    3889                 :            :         iommu = amd_iommu_rlookup_table[irte_info->devid];
    3890                 :            :         if (iommu == NULL)
    3891                 :            :                 return -EINVAL;
    3892                 :            : 
    3893                 :            :         pi_data->prev_ga_tag = ir_data->cached_ga_tag;
    3894                 :            :         if (pi_data->is_guest_mode) {
    3895                 :            :                 ir_data->ga_root_ptr = (pi_data->base >> 12);
    3896                 :            :                 ir_data->ga_vector = vcpu_pi_info->vector;
    3897                 :            :                 ir_data->ga_tag = pi_data->ga_tag;
    3898                 :            :                 ret = amd_iommu_activate_guest_mode(ir_data);
    3899                 :            :                 if (!ret)
    3900                 :            :                         ir_data->cached_ga_tag = pi_data->ga_tag;
    3901                 :            :         } else {
    3902                 :            :                 ret = amd_iommu_deactivate_guest_mode(ir_data);
    3903                 :            : 
    3904                 :            :                 /*
    3905                 :            :                  * This communicates the ga_tag back to the caller
    3906                 :            :                  * so that it can do all the necessary clean up.
    3907                 :            :                  */
    3908                 :            :                 if (!ret)
    3909                 :            :                         ir_data->cached_ga_tag = 0;
    3910                 :            :         }
    3911                 :            : 
    3912                 :            :         return ret;
    3913                 :            : }
    3914                 :            : 
    3915                 :            : 
    3916                 :            : static void amd_ir_update_irte(struct irq_data *irqd, struct amd_iommu *iommu,
    3917                 :            :                                struct amd_ir_data *ir_data,
    3918                 :            :                                struct irq_2_irte *irte_info,
    3919                 :            :                                struct irq_cfg *cfg)
    3920                 :            : {
    3921                 :            : 
    3922                 :            :         /*
    3923                 :            :          * Atomically updates the IRTE with the new destination, vector
    3924                 :            :          * and flushes the interrupt entry cache.
    3925                 :            :          */
    3926                 :            :         iommu->irte_ops->set_affinity(ir_data->entry, irte_info->devid,
    3927                 :            :                                       irte_info->index, cfg->vector,
    3928                 :            :                                       cfg->dest_apicid);
    3929                 :            : }
    3930                 :            : 
    3931                 :            : static int amd_ir_set_affinity(struct irq_data *data,
    3932                 :            :                                const struct cpumask *mask, bool force)
    3933                 :            : {
    3934                 :            :         struct amd_ir_data *ir_data = data->chip_data;
    3935                 :            :         struct irq_2_irte *irte_info = &ir_data->irq_2_irte;
    3936                 :            :         struct irq_cfg *cfg = irqd_cfg(data);
    3937                 :            :         struct irq_data *parent = data->parent_data;
    3938                 :            :         struct amd_iommu *iommu = amd_iommu_rlookup_table[irte_info->devid];
    3939                 :            :         int ret;
    3940                 :            : 
    3941                 :            :         if (!iommu)
    3942                 :            :                 return -ENODEV;
    3943                 :            : 
    3944                 :            :         ret = parent->chip->irq_set_affinity(parent, mask, force);
    3945                 :            :         if (ret < 0 || ret == IRQ_SET_MASK_OK_DONE)
    3946                 :            :                 return ret;
    3947                 :            : 
    3948                 :            :         amd_ir_update_irte(data, iommu, ir_data, irte_info, cfg);
    3949                 :            :         /*
    3950                 :            :          * After this point, all the interrupts will start arriving
    3951                 :            :          * at the new destination. So, time to cleanup the previous
    3952                 :            :          * vector allocation.
    3953                 :            :          */
    3954                 :            :         send_cleanup_vector(cfg);
    3955                 :            : 
    3956                 :            :         return IRQ_SET_MASK_OK_DONE;
    3957                 :            : }
    3958                 :            : 
    3959                 :            : static void ir_compose_msi_msg(struct irq_data *irq_data, struct msi_msg *msg)
    3960                 :            : {
    3961                 :            :         struct amd_ir_data *ir_data = irq_data->chip_data;
    3962                 :            : 
    3963                 :            :         *msg = ir_data->msi_entry;
    3964                 :            : }
    3965                 :            : 
    3966                 :            : static struct irq_chip amd_ir_chip = {
    3967                 :            :         .name                   = "AMD-IR",
    3968                 :            :         .irq_ack                = apic_ack_irq,
    3969                 :            :         .irq_set_affinity       = amd_ir_set_affinity,
    3970                 :            :         .irq_set_vcpu_affinity  = amd_ir_set_vcpu_affinity,
    3971                 :            :         .irq_compose_msi_msg    = ir_compose_msi_msg,
    3972                 :            : };
    3973                 :            : 
    3974                 :            : int amd_iommu_create_irq_domain(struct amd_iommu *iommu)
    3975                 :            : {
    3976                 :            :         struct fwnode_handle *fn;
    3977                 :            : 
    3978                 :            :         fn = irq_domain_alloc_named_id_fwnode("AMD-IR", iommu->index);
    3979                 :            :         if (!fn)
    3980                 :            :                 return -ENOMEM;
    3981                 :            :         iommu->ir_domain = irq_domain_create_tree(fn, &amd_ir_domain_ops, iommu);
    3982                 :            :         irq_domain_free_fwnode(fn);
    3983                 :            :         if (!iommu->ir_domain)
    3984                 :            :                 return -ENOMEM;
    3985                 :            : 
    3986                 :            :         iommu->ir_domain->parent = arch_get_ir_parent_domain();
    3987                 :            :         iommu->msi_domain = arch_create_remap_msi_irq_domain(iommu->ir_domain,
    3988                 :            :                                                              "AMD-IR-MSI",
    3989                 :            :                                                              iommu->index);
    3990                 :            :         return 0;
    3991                 :            : }
    3992                 :            : 
    3993                 :            : int amd_iommu_update_ga(int cpu, bool is_run, void *data)
    3994                 :            : {
    3995                 :            :         unsigned long flags;
    3996                 :            :         struct amd_iommu *iommu;
    3997                 :            :         struct irq_remap_table *table;
    3998                 :            :         struct amd_ir_data *ir_data = (struct amd_ir_data *)data;
    3999                 :            :         int devid = ir_data->irq_2_irte.devid;
    4000                 :            :         struct irte_ga *entry = (struct irte_ga *) ir_data->entry;
    4001                 :            :         struct irte_ga *ref = (struct irte_ga *) ir_data->ref;
    4002                 :            : 
    4003                 :            :         if (!AMD_IOMMU_GUEST_IR_VAPIC(amd_iommu_guest_ir) ||
    4004                 :            :             !ref || !entry || !entry->lo.fields_vapic.guest_mode)
    4005                 :            :                 return 0;
    4006                 :            : 
    4007                 :            :         iommu = amd_iommu_rlookup_table[devid];
    4008                 :            :         if (!iommu)
    4009                 :            :                 return -ENODEV;
    4010                 :            : 
    4011                 :            :         table = get_irq_table(devid);
    4012                 :            :         if (!table)
    4013                 :            :                 return -ENODEV;
    4014                 :            : 
    4015                 :            :         raw_spin_lock_irqsave(&table->lock, flags);
    4016                 :            : 
    4017                 :            :         if (ref->lo.fields_vapic.guest_mode) {
    4018                 :            :                 if (cpu >= 0) {
    4019                 :            :                         ref->lo.fields_vapic.destination =
    4020                 :            :                                                 APICID_TO_IRTE_DEST_LO(cpu);
    4021                 :            :                         ref->hi.fields.destination =
    4022                 :            :                                                 APICID_TO_IRTE_DEST_HI(cpu);
    4023                 :            :                 }
    4024                 :            :                 ref->lo.fields_vapic.is_run = is_run;
    4025                 :            :                 barrier();
    4026                 :            :         }
    4027                 :            : 
    4028                 :            :         raw_spin_unlock_irqrestore(&table->lock, flags);
    4029                 :            : 
    4030                 :            :         iommu_flush_irt(iommu, devid);
    4031                 :            :         iommu_completion_wait(iommu);
    4032                 :            :         return 0;
    4033                 :            : }
    4034                 :            : EXPORT_SYMBOL(amd_iommu_update_ga);
    4035                 :            : #endif

Generated by: LCOV version 1.14