@@ -308,3 +308,48 @@ static void __init free_command_buffer(struct amd_iommu *iommu)
308
308
get_order (CMD_BUFFER_SIZE ));
309
309
}
310
310
311
+ static void set_dev_entry_bit (u16 devid , u8 bit )
312
+ {
313
+ int i = (bit >> 5 ) & 0x07 ;
314
+ int _bit = bit & 0x1f ;
315
+
316
+ amd_iommu_dev_table [devid ].data [i ] |= (1 << _bit );
317
+ }
318
+
319
+ static void __init set_dev_entry_from_acpi (u16 devid , u32 flags , u32 ext_flags )
320
+ {
321
+ if (flags & ACPI_DEVFLAG_INITPASS )
322
+ set_dev_entry_bit (devid , DEV_ENTRY_INIT_PASS );
323
+ if (flags & ACPI_DEVFLAG_EXTINT )
324
+ set_dev_entry_bit (devid , DEV_ENTRY_EINT_PASS );
325
+ if (flags & ACPI_DEVFLAG_NMI )
326
+ set_dev_entry_bit (devid , DEV_ENTRY_NMI_PASS );
327
+ if (flags & ACPI_DEVFLAG_SYSMGT1 )
328
+ set_dev_entry_bit (devid , DEV_ENTRY_SYSMGT1 );
329
+ if (flags & ACPI_DEVFLAG_SYSMGT2 )
330
+ set_dev_entry_bit (devid , DEV_ENTRY_SYSMGT2 );
331
+ if (flags & ACPI_DEVFLAG_LINT0 )
332
+ set_dev_entry_bit (devid , DEV_ENTRY_LINT0_PASS );
333
+ if (flags & ACPI_DEVFLAG_LINT1 )
334
+ set_dev_entry_bit (devid , DEV_ENTRY_LINT1_PASS );
335
+ }
336
+
337
+ static void __init set_iommu_for_device (struct amd_iommu * iommu , u16 devid )
338
+ {
339
+ amd_iommu_rlookup_table [devid ] = iommu ;
340
+ }
341
+
342
+ static void __init set_device_exclusion_range (u16 devid , struct ivmd_header * m )
343
+ {
344
+ struct amd_iommu * iommu = amd_iommu_rlookup_table [devid ];
345
+
346
+ if (!(m -> flags & IVMD_FLAG_EXCL_RANGE ))
347
+ return ;
348
+
349
+ if (iommu ) {
350
+ set_dev_entry_bit (m -> devid , DEV_ENTRY_EX );
351
+ iommu -> exclusion_start = m -> range_start ;
352
+ iommu -> exclusion_length = m -> range_length ;
353
+ }
354
+ }
355
+
0 commit comments