AMD IOMMU alias handling cleanups and code removal
Joerg Roedel
maintainercover AMD IOMMU alias handling cleanups and code removal
Hi,
This patch-set cleans up the alias handling code in the AMD IOMMU driver. Most of the alias handling is done already in the IOMMU group code. Only the handling of request-ids that are not backed by a 'struct pci_dev' still needs to happen in the AMD IOMMU driver, as the IOMMU group code has no way of handling that.
A few other cleanups which accumulated during implemented this are also included in this patch-set.
Regards,
Joerg
Joerg Roedel (12):
iommu/amd: Do not BUG_ON in __detach_device()
iommu/amd: Do not iterate over alias-list in __[attach|detach]_device iommu/amd: Don't disable IRQs in __detach_device iommu/amd: WARN when __[attach|detach]_device are called with irqs
enabled
iommu/amd: Set alias DTE in do_attach/do_detach
iommu/amd: Remove old alias handling code
iommu/amd: Align DTE flag definitions
iommu/amd: Remove cmd_buf_size and evt_buf_size from struct amd_iommu iommu/amd: Cleanup buffer allocation
iommu/amd: Initialize amd_iommu_last_bdf for DEV_ALL iommu/amd: Remove first/last_device handling
iommu/amd: Remove find_last_devid_on_pci()
drivers/iommu/amd_iommu.c | 172 +++++++++------------------------------- drivers/iommu/amd_iommu_init.c | 111 ++++++-------------------- drivers/iommu/amd_iommu_types.h | 13 +-- 3 files changed, 64 insertions(+), 232 deletions(-)
Signature · 1 line
1.9.1
Joerg Roedel
maintainerPATCH 1/12 iommu/amd: Do not BUG_ON in __detach_device()
From: Joerg Roedel <[email protected]>
The condition in the BUG_ON is an indicator of a BUG, but no reason to kill the code path. Turn it into a WARN_ON and bail out if it is hit.
--- drivers/iommu/amd_iommu.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/iommu/amd_iommu.c +2 -1
@@ -2213,7 +2213,8 @@ static void __detach_device(struct iommu_dev_data *dev_data)struct protection_domain *domain;unsigned long flags; -BUG_ON (!dev_data->domain); +if (WARN_ON (!dev_data->domain)) +return ; domain = dev_data->domain;
Signature · 1 line
1.9.1
Joerg Roedel
maintainerPATCH 2/12 iommu/amd: Do not iterate over alias-list in __[attach|detach]_device
In reply to Joerg RoedelFrom: Joerg Roedel <[email protected]>
The alias list is handled aleady by iommu core code. No need anymore to handle it in this part of the AMD IOMMU code
--- drivers/iommu/amd_iommu.c | 26 +++----------------------- 1 file changed, 3 insertions(+), 23 deletions(-)
drivers/iommu/amd_iommu.c +3 -23
@@ -2037,29 +2037,17 @@ static void do_detach(struct iommu_dev_data *dev_data)static int __attach_device (struct iommu_dev_data *dev_data,struct protection_domain *domain) { -struct iommu_dev_data *head, *entry;int ret;/* lock domain */ spin_lock (&domain->lock); - head = dev_data; - -if (head->alias_data !=NULL ) - head = head->alias_data; - -/* Now we have the root of the alias group, if any */ - ret = -EBUSY ; -if (head->domain !=NULL ) +if (dev_data->domain !=NULL ) goto out_unlock;/* Attach alias group root */ -do_attach (head, domain); - -/* Attach other devices in the alias group */ -list_for_each_entry (entry, &head->alias_list, alias_list) -do_attach (entry, domain); +do_attach (dev_data, domain); ret =0 ;
@@ -2209,7 +2197,6 @@ static int attach_device(struct device *dev,*/ static void __detach_device (struct iommu_dev_data *dev_data) { -struct iommu_dev_data *head, *entry;struct protection_domain *domain;unsigned long flags;
@@ -2220,14 +2207,7 @@ static void __detach_device(struct iommu_dev_data *dev_data)spin_lock_irqsave (&domain->lock, flags); - head = dev_data; -if (head->alias_data !=NULL ) - head = head->alias_data; - -list_for_each_entry (entry, &head->alias_list, alias_list) -do_detach (entry); - -do_detach (head); +do_detach (dev_data);spin_unlock_irqrestore (&domain->lock, flags); }
Signature · 1 line
1.9.1
Joerg Roedel
maintainerPATCH 3/12 iommu/amd: Don't disable IRQs in __detach_device
In reply to Joerg RoedelFrom: Joerg Roedel <[email protected]>
This function is already called with IRQs disabled already. So no need to disable them again.
--- drivers/iommu/amd_iommu.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/iommu/amd_iommu.c +2 -3
@@ -2198,18 +2198,17 @@ static int attach_device(struct device *dev,static void __detach_device (struct iommu_dev_data *dev_data) {struct protection_domain *domain; -unsigned long flags;if (WARN_ON (!dev_data->domain))return ; domain = dev_data->domain; -spin_lock_irqsave (&domain->lock, flags); +spin_lock (&domain->lock);do_detach (dev_data); -spin_unlock_irqrestore (&domain->lock, flags); +spin_unlock (&domain->lock); }/*
Signature · 1 line
1.9.1
Joerg Roedel
maintainerPATCH 4/12 iommu/amd: WARN when __[attach|detach]_device are called with irqs enabled
In reply to Joerg RoedelFrom: Joerg Roedel <[email protected]>
These functions rely on being called with IRQs disabled. Add a WARN_ON to detect early when its not.
--- drivers/iommu/amd_iommu.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
drivers/iommu/amd_iommu.c +12 -0
@@ -2039,6 +2039,12 @@ static int __attach_device(struct iommu_dev_data *dev_data, {int ret; +/* +* Must be called with IRQs disabled. Warn here to detect early +* when its not. +*/ +WARN_ON (!irqs_disabled ()); +/* lock domain */ spin_lock (&domain->lock);
@@ -2199,6 +2205,12 @@ static void __detach_device(struct iommu_dev_data *dev_data) {struct protection_domain *domain; +/* +* Must be called with IRQs disabled. Warn here to detect early +* when its not. +*/ +WARN_ON (!irqs_disabled ()); +if (WARN_ON (!dev_data->domain))return ;
Signature · 1 line
1.9.1
Joerg Roedel
maintainerPATCH 5/12 iommu/amd: Set alias DTE in do_attach/do_detach
In reply to Joerg RoedelFrom: Joerg Roedel <[email protected]>
With this we don't have to create dev_data entries for non-existent devices (which only exist as request-ids).
--- drivers/iommu/amd_iommu.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-)
drivers/iommu/amd_iommu.c +15 -2
@@ -1114,11 +1114,15 @@ static int device_flush_iotlb(struct iommu_dev_data *dev_data,static int device_flush_dte (struct iommu_dev_data *dev_data) {struct amd_iommu *iommu; +u16 alias;int ret; iommu = amd_iommu_rlookup_table[dev_data->devid]; + alias = amd_iommu_alias_table[dev_data->devid]; ret =iommu_flush_dte (iommu, dev_data->devid); +if (!ret && alias != dev_data->devid) + ret =iommu_flush_dte (iommu, alias);if (ret)return ret;
@@ -1984,27 +1988,33 @@ static void do_attach(struct iommu_dev_data *dev_data, struct protection_domain *domain) {struct amd_iommu *iommu; +u16 alias;bool ats; iommu = amd_iommu_rlookup_table[dev_data->devid]; + alias = amd_iommu_alias_table[dev_data->devid]; ats = dev_data->ats.enabled;/* Update data structures */ dev_data->domain = domain;list_add (&dev_data->list, &domain->dev_list); -set_dte_entry (dev_data->devid, domain, ats);/* Do reference counting */ domain->dev_iommu[iommu->index] +=1 ; domain->dev_cnt +=1 ; -/* Flush the DTE entry */ +/* Update device table */ +set_dte_entry (dev_data->devid, domain, ats); +if (alias != dev_data->devid) +set_dte_entry (dev_data->devid, domain, ats); +device_flush_dte (dev_data); }static void do_detach (struct iommu_dev_data *dev_data) {struct amd_iommu *iommu; +u16 alias;/* * First check if the device is still attached. It might already
@@ -2016,6 +2026,7 @@ static void do_detach(struct iommu_dev_data *dev_data)return ; iommu = amd_iommu_rlookup_table[dev_data->devid]; + alias = amd_iommu_alias_table[dev_data->devid];/* decrease reference counters */ dev_data->domain->dev_iommu[iommu->index] -=1 ;
@@ -2025,6 +2036,8 @@ static void do_detach(struct iommu_dev_data *dev_data) dev_data->domain =NULL ;list_del (&dev_data->list);clear_dte_entry (dev_data->devid); +if (alias != dev_data->devid) +clear_dte_entry (alias);/* Flush the DTE entry */ device_flush_dte (dev_data);
Signature · 1 line
1.9.1
Joerg Roedel
maintainerPATCH 6/12 iommu/amd: Remove old alias handling code
In reply to Joerg RoedelFrom: Joerg Roedel <[email protected]>
This mostly removes the code to create dev_data structures for alias device ids. They are not necessary anymore, as they were only created for device ids which have no struct pci_dev associated with it. But these device ids are handled in a simpler way now, so there is no need for this code anymore.
--- drivers/iommu/amd_iommu.c | 99 ----------------------------------------------- 1 file changed, 99 deletions(-)
drivers/iommu/amd_iommu.c +0 -99
@@ -89,8 +89,6 @@ static struct dma_map_ops amd_iommu_dma_ops;struct iommu_dev_data {struct list_head list;/* For domain->dev_list */ struct list_head dev_data_list;/* For global dev_data_list */ -struct list_head alias_list;/* Link alias-groups together */ -struct iommu_dev_data *alias_data;/* The alias dev_data */ struct protection_domain *domain;/* Domain the device is bound to */ u16 devid;/* PCI Device ID */ bool iommu_v2;/* Device can make use of IOMMUv2 */
@@ -136,8 +134,6 @@ static struct iommu_dev_data *alloc_dev_data(u16 devid)if (!dev_data)return NULL ; -INIT_LIST_HEAD (&dev_data->alias_list); - dev_data->devid = devid;spin_lock_irqsave (&dev_data_list_lock, flags);
@@ -147,17 +143,6 @@ static struct iommu_dev_data *alloc_dev_data(u16 devid)return dev_data; } -static void free_dev_data (struct iommu_dev_data *dev_data) -{ -unsigned long flags; - -spin_lock_irqsave (&dev_data_list_lock, flags); -list_del (&dev_data->dev_data_list); -spin_unlock_irqrestore (&dev_data_list_lock, flags); - -kfree (dev_data); -} -static struct iommu_dev_data *search_dev_data (u16 devid) {struct iommu_dev_data *dev_data;
@@ -311,73 +296,10 @@ out:iommu_group_put (group); } -static int __last_alias (struct pci_dev *pdev,u16 alias,void *data) -{ - *(u16 *)data = alias; -return 0 ; -} - -static u16 get_alias (struct device *dev) -{ -struct pci_dev *pdev =to_pci_dev (dev); -u16 devid, ivrs_alias, pci_alias; - - devid =get_device_id (dev); - ivrs_alias = amd_iommu_alias_table[devid]; -pci_for_each_dma_alias (pdev, __last_alias, &pci_alias); - -if (ivrs_alias == pci_alias) -return ivrs_alias; - -/* -* DMA alias showdown -* -* The IVRS is fairly reliable in telling us about aliases, but it -* can't know about every screwy device. If we don't have an IVRS -* reported alias, use the PCI reported alias. In that case we may -* still need to initialize the rlookup and dev_table entries if the -* alias is to a non-existent device. -*/ -if (ivrs_alias == devid) { -if (!amd_iommu_rlookup_table[pci_alias]) { - amd_iommu_rlookup_table[pci_alias] = - amd_iommu_rlookup_table[devid]; -memcpy (amd_iommu_dev_table[pci_alias].data, - amd_iommu_dev_table[devid].data, -sizeof (amd_iommu_dev_table[pci_alias].data)); - } - -return pci_alias; - } - -pr_info ("AMD-Vi: Using IVRS reported alias %02x:%02x.%d " -"for device %s[%04x:%04x], kernel reported alias " -"%02x:%02x.%d\n" ,PCI_BUS_NUM (ivrs_alias),PCI_SLOT (ivrs_alias), -PCI_FUNC (ivrs_alias),dev_name (dev), pdev->vendor, pdev->device, -PCI_BUS_NUM (pci_alias),PCI_SLOT (pci_alias), -PCI_FUNC (pci_alias)); - -/* -* If we don't have a PCI DMA alias and the IVRS alias is on the same -* bus, then the IVRS table may know about a quirk that we don't. -*/ -if (pci_alias == devid && -PCI_BUS_NUM (ivrs_alias) == pdev->bus->number) { - pdev->dev_flags |=PCI_DEV_FLAGS_DMA_ALIAS_DEVFN ; - pdev->dma_alias_devfn = ivrs_alias &0xff ; -pr_info ("AMD-Vi: Added PCI DMA alias %02x.%d for %s\n" , -PCI_SLOT (ivrs_alias),PCI_FUNC (ivrs_alias), -dev_name (dev)); - } - -return ivrs_alias; -} -static int iommu_init_device (struct device *dev) {struct pci_dev *pdev =to_pci_dev (dev);struct iommu_dev_data *dev_data; -u16 alias;if (dev->archdata.iommu)return 0 ;
@@ -386,24 +308,6 @@ static int iommu_init_device(struct device *dev)if (!dev_data)return -ENOMEM ; - alias =get_alias (dev); - -if (alias != dev_data->devid) { -struct iommu_dev_data *alias_data; - - alias_data =find_dev_data (alias); -if (alias_data ==NULL ) { -pr_err ("AMD-Vi: Warning: Unhandled device %s\n" , -dev_name (dev)); -free_dev_data (dev_data); -return -ENOTSUPP ; - } - dev_data->alias_data = alias_data; - -/* Add device to the alias_list */ -list_add (&dev_data->alias_list, &alias_data->alias_list); - } -if (pci_iommuv2_capable (pdev)) {struct amd_iommu *iommu;
@@ -445,9 +349,6 @@ static void iommu_uninit_device(struct device *dev)iommu_group_remove_device (dev); -/* Unlink from alias, it may change if another device is re-plugged */ - dev_data->alias_data =NULL ; -/* Remove dma-ops */ dev->archdata.dma_ops =NULL ;
Signature · 1 line
1.9.1
Joerg Roedel
maintainerPATCH 7/12 iommu/amd: Align DTE flag definitions
In reply to Joerg RoedelFrom: Joerg Roedel <[email protected]>
No functional change.
--- drivers/iommu/amd_iommu_types.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/iommu/amd_iommu_types.h +2 -2
@@ -295,8 +295,8 @@#define IOMMU_PTE_IR (1ULL << 61)#define IOMMU_PTE_IW (1ULL << 62) -#define DTE_FLAG_IOTLB (0x01UL << 32) -#define DTE_FLAG_GV (0x01ULL << 55) +#define DTE_FLAG_IOTLB (1ULL << 32) +#define DTE_FLAG_GV (1ULL << 55)#define DTE_GLX_SHIFT (56)#define DTE_GLX_MASK (3)
Signature · 1 line
1.9.1
Joerg Roedel
maintainerPATCH 8/12 iommu/amd: Remove cmd_buf_size and evt_buf_size from struct amd_iommu
In reply to Joerg RoedelFrom: Joerg Roedel <[email protected]>
The driver always uses a constant size for these buffers anyway, so there is no need to waste memory to store the sizes.
--- drivers/iommu/amd_iommu.c | 10 ++++------ drivers/iommu/amd_iommu_init.c | 8 +------- drivers/iommu/amd_iommu_types.h | 4 ---- 3 files changed, 5 insertions(+), 17 deletions(-)
drivers/iommu/amd_iommu.c +4 -6
@@ -534,7 +534,7 @@ static void iommu_poll_events(struct amd_iommu *iommu)while (head != tail) {iommu_print_event (iommu, iommu->evt_buf + head); - head = (head +EVENT_ENTRY_SIZE ) % iommu->evt_buf_size; + head = (head +EVENT_ENTRY_SIZE ) %EVT_BUFFER_SIZE ; }writel (head, iommu->mmio_base +MMIO_EVT_HEAD_OFFSET );
@@ -684,7 +684,7 @@ static void copy_cmd_to_buffer(struct amd_iommu *iommu,u8 *target; target = iommu->cmd_buf + tail; - tail = (tail +sizeof (*cmd)) % iommu->cmd_buf_size; + tail = (tail +sizeof (*cmd)) %CMD_BUFFER_SIZE ;/* Copy command to buffer */ memcpy (target, cmd,sizeof (*cmd));
@@ -851,15 +851,13 @@ static int iommu_queue_command_sync(struct amd_iommu *iommu,u32 left, tail, head, next_tail;unsigned long flags; -WARN_ON (iommu->cmd_buf_size &CMD_BUFFER_UNINITIALIZED ); - again:spin_lock_irqsave (&iommu->lock, flags); head =readl (iommu->mmio_base +MMIO_CMD_HEAD_OFFSET ); tail =readl (iommu->mmio_base +MMIO_CMD_TAIL_OFFSET ); - next_tail = (tail +sizeof (*cmd)) % iommu->cmd_buf_size; - left = (head - next_tail) % iommu->cmd_buf_size; + next_tail = (tail +sizeof (*cmd)) %CMD_BUFFER_SIZE ; + left = (head - next_tail) %CMD_BUFFER_SIZE ;if (left <=2 ) {struct iommu_cmd sync_cmd;
drivers/iommu/amd_iommu_init.c +1 -7
@@ -521,8 +521,6 @@ static u8 * __init alloc_command_buffer(struct amd_iommu *iommu)if (cmd_buf ==NULL )return NULL ; - iommu->cmd_buf_size =CMD_BUFFER_SIZE |CMD_BUFFER_UNINITIALIZED ; -return cmd_buf; }
@@ -557,13 +555,11 @@ static void iommu_enable_command_buffer(struct amd_iommu *iommu) &entry, sizeof(entry));amd_iommu_reset_cmd_buffer (iommu); - iommu->cmd_buf_size &= ~(CMD_BUFFER_UNINITIALIZED ); }static void __init free_command_buffer (struct amd_iommu *iommu) { -free_pages ((unsigned long )iommu->cmd_buf, -get_order (iommu->cmd_buf_size & ~(CMD_BUFFER_UNINITIALIZED ))); +free_pages ((unsigned long )iommu->cmd_buf,get_order (CMD_BUFFER_SIZE )); }/* allocates the memory where the IOMMU will log its events to */
@@ -575,8 +571,6 @@ static u8 * __init alloc_event_buffer(struct amd_iommu *iommu)if (iommu->evt_buf ==NULL )return NULL ; - iommu->evt_buf_size =EVT_BUFFER_SIZE ; -return iommu->evt_buf; }
drivers/iommu/amd_iommu_types.h +0 -4
@@ -528,11 +528,7 @@ struct amd_iommu {/* command buffer virtual address */ u8 *cmd_buf; -/* size of command buffer */ -u32 cmd_buf_size; -/* size of event buffer */ -u32 evt_buf_size;/* event buffer virtual address */ u8 *evt_buf;
Signature · 1 line
1.9.1
Joerg Roedel
maintainerPATCH 9/12 iommu/amd: Cleanup buffer allocation
In reply to Joerg RoedelFrom: Joerg Roedel <[email protected]>
Clean up the functions to allocate the command, event and ppr-log buffers. Remove redundant code and change the return value to int.
--- drivers/iommu/amd_iommu_init.c | 46 +++++++++++++++--------------------------- 1 file changed, 16 insertions(+), 30 deletions(-)
drivers/iommu/amd_iommu_init.c +16 -30
@@ -513,15 +513,12 @@ static int __init find_last_devid_acpi(struct acpi_table_header *table)* write commands to that buffer later and the IOMMU will execute them * asynchronously */ -static u8 *__init alloc_command_buffer (struct amd_iommu *iommu) +static int __init alloc_command_buffer (struct amd_iommu *iommu) { -u8 *cmd_buf = (u8 *)__get_free_pages (GFP_KERNEL | __GFP_ZERO, -get_order (CMD_BUFFER_SIZE )); + iommu->cmd_buf = (void *)__get_free_pages (GFP_KERNEL | __GFP_ZERO, +get_order (CMD_BUFFER_SIZE )); -if (cmd_buf ==NULL ) -return NULL ; - -return cmd_buf; +return iommu->cmd_buf ?0 : -ENOMEM ; }/*
@@ -563,15 +560,12 @@ static void __init free_command_buffer(struct amd_iommu *iommu) }/* allocates the memory where the IOMMU will log its events to */ -static u8 *__init alloc_event_buffer (struct amd_iommu *iommu) +static int __init alloc_event_buffer (struct amd_iommu *iommu) { - iommu->evt_buf = (u8 *)__get_free_pages (GFP_KERNEL | __GFP_ZERO, -get_order (EVT_BUFFER_SIZE )); + iommu->evt_buf = (void *)__get_free_pages (GFP_KERNEL | __GFP_ZERO, +get_order (EVT_BUFFER_SIZE )); -if (iommu->evt_buf ==NULL ) -return NULL ; - -return iommu->evt_buf; +return iommu->evt_buf ?0 : -ENOMEM ; }static void iommu_enable_event_buffer (struct amd_iommu *iommu)
@@ -598,15 +592,12 @@ static void __init free_event_buffer(struct amd_iommu *iommu) }/* allocates the memory where the IOMMU will log its events to */ -static u8 *__init alloc_ppr_log (struct amd_iommu *iommu) +static int __init alloc_ppr_log (struct amd_iommu *iommu) { - iommu->ppr_log = (u8 *)__get_free_pages (GFP_KERNEL | __GFP_ZERO, -get_order (PPR_LOG_SIZE )); + iommu->ppr_log = (void *)__get_free_pages (GFP_KERNEL | __GFP_ZERO, +get_order (PPR_LOG_SIZE )); -if (iommu->ppr_log ==NULL ) -return NULL ; - -return iommu->ppr_log; +return iommu->ppr_log ?0 : -ENOMEM ; }static void iommu_enable_ppr_log (struct amd_iommu *iommu)
@@ -1105,12 +1096,10 @@ static int __init init_iommu_one(struct amd_iommu *iommu, struct ivhd_header *h)if (!iommu->mmio_base)return -ENOMEM ; - iommu->cmd_buf =alloc_command_buffer (iommu); -if (!iommu->cmd_buf) +if (alloc_command_buffer (iommu))return -ENOMEM ; - iommu->evt_buf =alloc_event_buffer (iommu); -if (!iommu->evt_buf) +if (alloc_event_buffer (iommu))return -ENOMEM ; iommu->int_enabled = false;
@@ -1302,11 +1291,8 @@ static int iommu_init_pci(struct amd_iommu *iommu) amd_iommu_v2_present = true; } -if (iommu_feature (iommu,FEATURE_PPR )) { - iommu->ppr_log =alloc_ppr_log (iommu); -if (!iommu->ppr_log) -return -ENOMEM ; - } +if (iommu_feature (iommu,FEATURE_PPR ) &&alloc_ppr_log (iommu)) +return -ENOMEM ;if (iommu->cap & (1UL <<IOMMU_CAP_NPCACHE )) amd_iommu_np_cache = true;
Signature · 1 line
1.9.1
Joerg Roedel
maintainerPATCH 10/12 iommu/amd: Initialize amd_iommu_last_bdf for DEV_ALL
In reply to Joerg RoedelFrom: Joerg Roedel <[email protected]>
Also initialize the amd_iommu_last_bdf variable when a IVHD_DEV_ALL entry is found in the ACPI table.
--- drivers/iommu/amd_iommu_init.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/iommu/amd_iommu_init.c +4 -0
@@ -441,6 +441,10 @@ static int __init find_last_devid_from_ivhd(struct ivhd_header *h)while (p < end) { dev = (struct ivhd_entry *)p;switch (dev->type) { +case IVHD_DEV_ALL : +/* Use maximum BDF value for DEV_ALL */ +update_last_devid (0xffff ); +break ;case IVHD_DEV_SELECT :case IVHD_DEV_RANGE_END :case IVHD_DEV_ALIAS :
Signature · 1 line
1.9.1
Joerg Roedel
maintainerPATCH 11/12 iommu/amd: Remove first/last_device handling
In reply to Joerg RoedelFrom: Joerg Roedel <[email protected]>
The code is buggy and the values read from PCI are not reliable anyway, so it is the best to just remove this code.
--- drivers/iommu/amd_iommu_init.c | 34 +++------------------------------- drivers/iommu/amd_iommu_types.h | 5 ----- 2 files changed, 3 insertions(+), 36 deletions(-)
drivers/iommu/amd_iommu_init.c +3 -31
@@ -824,20 +824,10 @@ static int __init init_iommu_from_acpi(struct amd_iommu *iommu,switch (e->type) {case IVHD_DEV_ALL : -DUMP_printk (" DEV_ALL\t\t\t first devid: %02x:%02x.%x" -" last device %02x:%02x.%x flags: %02x\n" , -PCI_BUS_NUM (iommu->first_device), -PCI_SLOT (iommu->first_device), -PCI_FUNC (iommu->first_device), -PCI_BUS_NUM (iommu->last_device), -PCI_SLOT (iommu->last_device), -PCI_FUNC (iommu->last_device), - e->flags); +DUMP_printk (" DEV_ALL\t\t\tflags: %02x\n" , e->flags); -for (dev_i = iommu->first_device; - dev_i <= iommu->last_device; ++dev_i) -set_dev_entry_from_acpi (iommu, dev_i, - e->flags,0 ); +for (dev_i =0 ; dev_i <= amd_iommu_last_bdf; ++dev_i) +set_dev_entry_from_acpi (iommu, dev_i, e->flags,0 );break ;case IVHD_DEV_SELECT :
@@ -993,17 +983,6 @@ static int __init init_iommu_from_acpi(struct amd_iommu *iommu,return 0 ; } -/* Initializes the device->iommu mapping for the driver */ -static int __init init_iommu_devices (struct amd_iommu *iommu) -{ -u32 i; - -for (i = iommu->first_device; i <= iommu->last_device; ++i) -set_iommu_for_device (iommu, i); - -return 0 ; -} -static void __init free_iommu_one (struct amd_iommu *iommu) {free_command_buffer (iommu);
@@ -1122,8 +1101,6 @@ static int __init init_iommu_one(struct amd_iommu *iommu, struct ivhd_header *h)*/ amd_iommu_rlookup_table[iommu->devid] =NULL ; -init_iommu_devices (iommu); -return 0 ; }
@@ -1253,11 +1230,6 @@ static int iommu_init_pci(struct amd_iommu *iommu)pci_read_config_dword (iommu->dev, cap_ptr +MMIO_MISC_OFFSET , &misc); - iommu->first_device =PCI_DEVID (MMIO_GET_BUS (range), -MMIO_GET_FD (range)); - iommu->last_device =PCI_DEVID (MMIO_GET_BUS (range), -MMIO_GET_LD (range)); -if (!(iommu->cap & (1 <<IOMMU_CAP_IOTLB ))) amd_iommu_iotlb_sup = false;
drivers/iommu/amd_iommu_types.h +0 -5
@@ -516,11 +516,6 @@ struct amd_iommu {/* pci domain of this IOMMU */ u16 pci_seg; -/* first device this IOMMU handles. read from PCI */ -u16 first_device; -/* last device this IOMMU handles. read from PCI */ -u16 last_device; -/* start of exclusion range of that IOMMU */ u64 exclusion_start;/* length of exclusion range of that IOMMU */
Signature · 1 line
1.9.1
Joerg Roedel
maintainerPATCH 12/12 iommu/amd: Remove find_last_devid_on_pci()
In reply to Joerg RoedelFrom: Joerg Roedel <[email protected]>
The value read from the PCI header is not reliable, so remove this code.
--- drivers/iommu/amd_iommu_init.c | 19 ------------------- 1 file changed, 19 deletions(-)
drivers/iommu/amd_iommu_init.c +0 -19
@@ -408,20 +408,6 @@ static inline int ivhd_entry_length(u8 *ivhd) }/* -* This function reads the last device id the IOMMU has to handle from the PCI -* capability header for this IOMMU -*/ -static int __init find_last_devid_on_pci (int bus,int dev,int fn,int cap_ptr) -{ -u32 cap; - - cap =read_pci_config (bus, dev, fn, cap_ptr+MMIO_RANGE_OFFSET ); -update_last_devid (PCI_DEVID (MMIO_GET_BUS (cap),MMIO_GET_LD (cap))); - -return 0 ; -} - -/* * After reading the highest device id from the IOMMU PCI capability header * this function looks if there is a higher device id defined in the ACPI table */
@@ -433,11 +419,6 @@ static int __init find_last_devid_from_ivhd(struct ivhd_header *h) p +=sizeof (*h); end += h->length; -find_last_devid_on_pci (PCI_BUS_NUM (h->devid), -PCI_SLOT (h->devid), -PCI_FUNC (h->devid), - h->cap_ptr); -while (p < end) { dev = (struct ivhd_entry *)p;switch (dev->type) {
Signature · 1 line
1.9.1