@ -136,13 +136,20 @@ static struct msi_domain_info pci_msi_domain_info = {
. handler_name = " edge " ,
} ;
void arch_init_msi_domain ( struct irq_domain * parent )
void __init arch_init_msi_domain ( struct irq_domain * parent )
{
struct fwnode_handle * fn ;
if ( disable_apic )
return ;
msi_default_domain = pci_msi_create_irq_domain ( NULL ,
& pci_msi_domain_info , parent ) ;
fn = irq_domain_alloc_named_fwnode ( " PCI-MSI " ) ;
if ( fn ) {
msi_default_domain =
pci_msi_create_irq_domain ( fn , & pci_msi_domain_info ,
parent ) ;
irq_domain_free_fwnode ( fn ) ;
}
if ( ! msi_default_domain )
pr_warn ( " failed to initialize irqdomain for MSI/MSI-x. \n " ) ;
}
@ -230,13 +237,20 @@ static struct irq_domain *dmar_get_irq_domain(void)
{
static struct irq_domain * dmar_domain ;
static DEFINE_MUTEX ( dmar_lock ) ;
struct fwnode_handle * fn ;
mutex_lock ( & dmar_lock ) ;
if ( dmar_domain = = NULL )
dmar_domain = msi_create_irq_domain ( NULL , & dmar_msi_domain_info ,
if ( dmar_domain )
goto out ;
fn = irq_domain_alloc_named_fwnode ( " DMAR-MSI " ) ;
if ( fn ) {
dmar_domain = msi_create_irq_domain ( fn , & dmar_msi_domain_info ,
x86_vector_domain ) ;
irq_domain_free_fwnode ( fn ) ;
}
out :
mutex_unlock ( & dmar_lock ) ;
return dmar_domain ;
}
@ -326,9 +340,10 @@ static struct msi_domain_info hpet_msi_domain_info = {
struct irq_domain * hpet_create_irq_domain ( int hpet_id )
{
struct irq_domain * parent ;
struct irq_alloc_info info ;
struct msi_domain_info * domain_info ;
struct irq_domain * parent , * d ;
struct irq_alloc_info info ;
struct fwnode_handle * fn ;
if ( x86_vector_domain = = NULL )
return NULL ;
@ -349,7 +364,16 @@ struct irq_domain *hpet_create_irq_domain(int hpet_id)
else
hpet_msi_controller . name = " IR-HPET-MSI " ;
return msi_create_irq_domain ( NULL , domain_info , parent ) ;
fn = irq_domain_alloc_named_id_fwnode ( hpet_msi_controller . name ,
hpet_id ) ;
if ( ! fn ) {
kfree ( domain_info ) ;
return NULL ;
}
d = msi_create_irq_domain ( fn , domain_info , parent ) ;
irq_domain_free_fwnode ( fn ) ;
return d ;
}
int hpet_assign_irq ( struct irq_domain * domain , struct hpet_dev * dev ,