@@ -1218,10 +1218,9 @@ static bool iort_pci_rc_supports_ats(struct acpi_iort_node *node)
12181218 return pci_rc -> ats_attribute & ACPI_IORT_ATS_SUPPORTED ;
12191219}
12201220
1221- static int iort_iommu_xlate (struct device * dev , struct acpi_iort_node * node ,
1222- u32 streamid )
1221+ static int iort_iommu_xlate (struct iommu_fwspec * fwspec , struct device * dev ,
1222+ struct acpi_iort_node * node , u32 streamid )
12231223{
1224- const struct iommu_ops * ops ;
12251224 struct fwnode_handle * iort_fwnode ;
12261225
12271226 if (!node )
@@ -1239,17 +1238,14 @@ static int iort_iommu_xlate(struct device *dev, struct acpi_iort_node *node,
12391238 * in the kernel or not, defer the IOMMU configuration
12401239 * or just abort it.
12411240 */
1242- ops = iommu_ops_from_fwnode (iort_fwnode );
1243- if (!ops )
1244- return iort_iommu_driver_enabled (node -> type ) ?
1245- - EPROBE_DEFER : - ENODEV ;
1246-
1247- return acpi_iommu_fwspec_init (dev , streamid , iort_fwnode , ops );
1241+ return acpi_iommu_fwspec_init (fwspec , dev , streamid , iort_fwnode ,
1242+ iort_iommu_driver_enabled (node -> type ));
12481243}
12491244
12501245struct iort_pci_alias_info {
12511246 struct device * dev ;
12521247 struct acpi_iort_node * node ;
1248+ struct iommu_fwspec * fwspec ;
12531249};
12541250
12551251static int iort_pci_iommu_init (struct pci_dev * pdev , u16 alias , void * data )
@@ -1260,7 +1256,7 @@ static int iort_pci_iommu_init(struct pci_dev *pdev, u16 alias, void *data)
12601256
12611257 parent = iort_node_map_id (info -> node , alias , & streamid ,
12621258 IORT_IOMMU_TYPE );
1263- return iort_iommu_xlate (info -> dev , parent , streamid );
1259+ return iort_iommu_xlate (info -> fwspec , info -> dev , parent , streamid );
12641260}
12651261
12661262static void iort_named_component_init (struct device * dev ,
@@ -1280,7 +1276,8 @@ static void iort_named_component_init(struct device *dev,
12801276 dev_warn (dev , "Could not add device properties\n" );
12811277}
12821278
1283- static int iort_nc_iommu_map (struct device * dev , struct acpi_iort_node * node )
1279+ static int iort_nc_iommu_map (struct iommu_fwspec * fwspec , struct device * dev ,
1280+ struct acpi_iort_node * node )
12841281{
12851282 struct acpi_iort_node * parent ;
12861283 int err = - ENODEV , i = 0 ;
@@ -1293,13 +1290,13 @@ static int iort_nc_iommu_map(struct device *dev, struct acpi_iort_node *node)
12931290 i ++ );
12941291
12951292 if (parent )
1296- err = iort_iommu_xlate (dev , parent , streamid );
1293+ err = iort_iommu_xlate (fwspec , dev , parent , streamid );
12971294 } while (parent && !err );
12981295
12991296 return err ;
13001297}
13011298
1302- static int iort_nc_iommu_map_id (struct device * dev ,
1299+ static int iort_nc_iommu_map_id (struct iommu_fwspec * fwspec , struct device * dev ,
13031300 struct acpi_iort_node * node ,
13041301 const u32 * in_id )
13051302{
@@ -1308,7 +1305,7 @@ static int iort_nc_iommu_map_id(struct device *dev,
13081305
13091306 parent = iort_node_map_id (node , * in_id , & streamid , IORT_IOMMU_TYPE );
13101307 if (parent )
1311- return iort_iommu_xlate (dev , parent , streamid );
1308+ return iort_iommu_xlate (fwspec , dev , parent , streamid );
13121309
13131310 return - ENODEV ;
13141311}
@@ -1317,20 +1314,22 @@ static int iort_nc_iommu_map_id(struct device *dev,
13171314/**
13181315 * iort_iommu_configure_id - Set-up IOMMU configuration for a device.
13191316 *
1317+ * @fwspec: The iommu_fwspec to fill in with fw information about the device
13201318 * @dev: device to configure
13211319 * @id_in: optional input id const value pointer
13221320 *
13231321 * Returns: 0 on success, <0 on failure
13241322 */
1325- int iort_iommu_configure_id (struct device * dev , const u32 * id_in )
1323+ int iort_iommu_configure_id (struct iommu_fwspec * fwspec , struct device * dev ,
1324+ const u32 * id_in )
13261325{
13271326 struct acpi_iort_node * node ;
13281327 int err = - ENODEV ;
13291328
13301329 if (dev_is_pci (dev )) {
1331- struct iommu_fwspec * fwspec ;
13321330 struct pci_bus * bus = to_pci_dev (dev )-> bus ;
1333- struct iort_pci_alias_info info = { .dev = dev };
1331+ struct iort_pci_alias_info info = { .dev = dev ,
1332+ .fwspec = fwspec };
13341333
13351334 node = iort_scan_node (ACPI_IORT_NODE_PCI_ROOT_COMPLEX ,
13361335 iort_match_node_callback , & bus -> dev );
@@ -1341,17 +1340,16 @@ int iort_iommu_configure_id(struct device *dev, const u32 *id_in)
13411340 err = pci_for_each_dma_alias (to_pci_dev (dev ),
13421341 iort_pci_iommu_init , & info );
13431342
1344- fwspec = dev_iommu_fwspec_get (dev );
1345- if (fwspec && iort_pci_rc_supports_ats (node ))
1343+ if (iort_pci_rc_supports_ats (node ))
13461344 fwspec -> flags |= IOMMU_FWSPEC_PCI_RC_ATS ;
13471345 } else {
13481346 node = iort_scan_node (ACPI_IORT_NODE_NAMED_COMPONENT ,
13491347 iort_match_node_callback , dev );
13501348 if (!node )
13511349 return - ENODEV ;
13521350
1353- err = id_in ? iort_nc_iommu_map_id (dev , node , id_in ) :
1354- iort_nc_iommu_map (dev , node );
1351+ err = id_in ? iort_nc_iommu_map_id (fwspec , dev , node , id_in ) :
1352+ iort_nc_iommu_map (fwspec , dev , node );
13551353
13561354 if (!err )
13571355 iort_named_component_init (dev , node );
@@ -1363,8 +1361,6 @@ int iort_iommu_configure_id(struct device *dev, const u32 *id_in)
13631361#else
13641362void iort_iommu_get_resv_regions (struct device * dev , struct list_head * head )
13651363{ }
1366- int iort_iommu_configure_id (struct device * dev , const u32 * input_id )
1367- { return - ENODEV ; }
13681364#endif
13691365
13701366static int nc_dma_get_range (struct device * dev , u64 * size )
0 commit comments