Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions drivers/acpi/riscv/irq.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,11 @@
*/

#include <linux/acpi.h>
#include <linux/device.h>
#include <linux/sort.h>
#include <linux/irq.h>
#include <linux/irqdomain.h>
#include <linux/irqchip/riscv-imsic.h>

#include "init.h"

Expand Down Expand Up @@ -397,6 +400,16 @@ static u32 riscv_acpi_add_irq_dep(acpi_handle handle)
return count;
}

void acpi_arch_msi_configure(struct device *dev)
{
struct irq_domain *msi_domain;

msi_domain = irq_find_matching_fwnode(imsic_acpi_get_fwnode(dev),
DOMAIN_BUS_PLATFORM_MSI);
if (msi_domain)
dev_set_msi_domain(dev, msi_domain);
}

u32 arch_acpi_add_auto_dep(acpi_handle handle)
{
if (acpi_has_method(handle, "_PRT"))
Expand Down
10 changes: 10 additions & 0 deletions drivers/acpi/scan.c
Original file line number Diff line number Diff line change
Expand Up @@ -1648,6 +1648,16 @@ static int acpi_iommu_configure_id(struct device *dev, const u32 *id_in)

#endif /* !CONFIG_IOMMU_API */

/**
* acpi_msi_configure - Set-up MSI domain for the device.
* @dev: The pointer to the device
*/
void acpi_msi_configure(struct device *dev)
{
acpi_arch_msi_configure(dev);
}
EXPORT_SYMBOL_GPL(acpi_msi_configure);

/**
* acpi_dma_configure_id - Set-up DMA configuration for the device.
* @dev: The pointer to the device
Expand Down
4 changes: 4 additions & 0 deletions drivers/base/platform.c
Original file line number Diff line number Diff line change
Expand Up @@ -1456,8 +1456,12 @@ static int platform_dma_configure(struct device *dev)
int ret = 0;

if (is_of_node(fwnode)) {
if (!dev_get_msi_domain(dev))
of_msi_configure(dev, dev->of_node);
ret = of_dma_configure(dev, to_of_node(fwnode), true);
} else if (is_acpi_device_node(fwnode)) {
if (!dev_get_msi_domain(dev))
acpi_msi_configure(dev);
attr = acpi_get_dma_attr(to_acpi_device_node(fwnode));
ret = acpi_dma_configure(dev, attr);
}
Expand Down
9 changes: 0 additions & 9 deletions drivers/iommu/riscv/iommu-platform.c
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,6 @@ static int riscv_iommu_platform_probe(struct platform_device *pdev)
enum riscv_iommu_igs_settings igs;
struct device *dev = &pdev->dev;
struct riscv_iommu_device *iommu = NULL;
struct irq_domain *msi_domain;
struct resource *res = NULL;
int vec, ret;

Expand All @@ -74,14 +73,6 @@ static int riscv_iommu_platform_probe(struct platform_device *pdev)
switch (igs) {
case RISCV_IOMMU_CAPABILITIES_IGS_BOTH:
case RISCV_IOMMU_CAPABILITIES_IGS_MSI:
if (is_of_node(dev_fwnode(dev))) {
of_msi_configure(dev, to_of_node(dev->fwnode));
} else {
msi_domain = irq_find_matching_fwnode(imsic_acpi_get_fwnode(dev),
DOMAIN_BUS_PLATFORM_MSI);
dev_set_msi_domain(dev, msi_domain);
}

if (!dev_get_msi_domain(dev)) {
dev_warn(dev, "failed to find an MSI domain\n");
goto msi_fail;
Expand Down
27 changes: 0 additions & 27 deletions drivers/irqchip/irq-riscv-aplic-msi.c
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,6 @@ static const struct msi_domain_template aplic_msi_template = {
int aplic_msi_setup(struct device *dev, void __iomem *regs)
{
const struct imsic_global_config *imsic_global;
struct irq_domain *msi_domain;
struct aplic_priv *priv;
struct aplic_msicfg *mc;
phys_addr_t pa;
Expand Down Expand Up @@ -245,32 +244,6 @@ int aplic_msi_setup(struct device *dev, void __iomem *regs)
/* Setup global config and interrupt delivery */
aplic_init_hw_global(priv, true);

/* Set the APLIC device MSI domain if not available */
if (!dev_get_msi_domain(dev)) {
/*
* The device MSI domain for OF devices is only set at the
* time of populating/creating OF device. If the device MSI
* domain is discovered later after the OF device is created
* then we need to set it explicitly before using any platform
* MSI functions.
*
* In case of APLIC device, the parent MSI domain is always
* IMSIC and the IMSIC MSI domains are created later through
* the platform driver probing so we set it explicitly here.
*/
if (is_of_node(dev->fwnode)) {
of_msi_configure(dev, to_of_node(dev->fwnode));
} else {
msi_domain = irq_find_matching_fwnode(imsic_acpi_get_fwnode(dev),
DOMAIN_BUS_PLATFORM_MSI);
if (msi_domain)
dev_set_msi_domain(dev, msi_domain);
}

if (!dev_get_msi_domain(dev))
return -EPROBE_DEFER;
}

if (!msi_create_device_irq_domain(dev, MSI_DEFAULT_DOMAIN, &aplic_msi_template,
priv->nr_irqs + 1, priv, priv)) {
dev_err(dev, "failed to create MSI irq domain\n");
Expand Down
29 changes: 0 additions & 29 deletions drivers/irqchip/irq-riscv-rpmi-sysmsi.c
Original file line number Diff line number Diff line change
Expand Up @@ -260,35 +260,6 @@ static int rpmi_sysmsi_probe(struct platform_device *pdev)
riscv_acpi_update_gsi_range(priv->gsi_base, priv->nr_irqs);
}

/*
* The device MSI domain for platform devices on RISC-V architecture
* is only available after the MSI controller driver is probed so,
* explicitly configure here.
*/
if (!dev_get_msi_domain(dev)) {
/*
* The device MSI domain for OF devices is only set at the
* time of populating/creating OF device. If the device MSI
* domain is discovered later after the OF device is created
* then we need to set it explicitly before using any platform
* MSI functions.
*/
if (is_of_node(fwnode)) {
of_msi_configure(dev, dev_of_node(dev));
} else if (is_acpi_device_node(fwnode)) {
struct irq_domain *msi_domain;

msi_domain = irq_find_matching_fwnode(imsic_acpi_get_fwnode(dev),
DOMAIN_BUS_PLATFORM_MSI);
dev_set_msi_domain(dev, msi_domain);
}

if (!dev_get_msi_domain(dev)) {
mbox_free_channel(priv->chan);
return -EPROBE_DEFER;
}
}

if (!msi_create_device_irq_domain(dev, MSI_DEFAULT_DOMAIN,
&rpmi_sysmsi_template,
priv->nr_irqs, priv, priv)) {
Expand Down
29 changes: 0 additions & 29 deletions drivers/mailbox/riscv-sbi-mpxy-mbox.c
Original file line number Diff line number Diff line change
Expand Up @@ -902,35 +902,6 @@ static int mpxy_mbox_probe(struct platform_device *pdev)

/* Setup MSIs for mailbox (if required) */
if (mbox->msi_count) {
/*
* The device MSI domain for platform devices on RISC-V architecture
* is only available after the MSI controller driver is probed so,
* explicitly configure here.
*/
if (!dev_get_msi_domain(dev)) {
struct fwnode_handle *fwnode = dev_fwnode(dev);

/*
* The device MSI domain for OF devices is only set at the
* time of populating/creating OF device. If the device MSI
* domain is discovered later after the OF device is created
* then we need to set it explicitly before using any platform
* MSI functions.
*/
if (is_of_node(fwnode)) {
of_msi_configure(dev, dev_of_node(dev));
} else if (is_acpi_device_node(fwnode)) {
struct irq_domain *msi_domain;

msi_domain = irq_find_matching_fwnode(imsic_acpi_get_fwnode(dev),
DOMAIN_BUS_PLATFORM_MSI);
dev_set_msi_domain(dev, msi_domain);
}

if (!dev_get_msi_domain(dev))
return -EPROBE_DEFER;
}

mbox->msi_index_to_channel = devm_kcalloc(dev, mbox->msi_count,
sizeof(*mbox->msi_index_to_channel),
GFP_KERNEL);
Expand Down
1 change: 1 addition & 0 deletions include/acpi/acpi_bus.h
Original file line number Diff line number Diff line change
Expand Up @@ -744,6 +744,7 @@ bool acpi_dma_supported(const struct acpi_device *adev);
enum dev_dma_attr acpi_get_dma_attr(struct acpi_device *adev);
int acpi_iommu_fwspec_init(struct device *dev, u32 id,
struct fwnode_handle *fwnode);
void acpi_msi_configure(struct device *dev);
int acpi_dma_get_range(struct device *dev, const struct bus_dma_region **map);
int acpi_dma_configure_id(struct device *dev, enum dev_dma_attr attr,
const u32 *input_id);
Expand Down
10 changes: 10 additions & 0 deletions include/linux/acpi.h
Original file line number Diff line number Diff line change
Expand Up @@ -260,6 +260,12 @@ acpi_numa_processor_affinity_init(struct acpi_srat_cpu_affinity *pa) { }

void acpi_numa_x2apic_affinity_init(struct acpi_srat_x2apic_cpu_affinity *pa);

#if defined(CONFIG_RISCV)
void acpi_arch_msi_configure(struct device *dev);
#else
static inline void acpi_arch_msi_configure(struct device *dev) { }
#endif

#if defined(CONFIG_ARM64) || defined(CONFIG_LOONGARCH)
void acpi_arch_dma_setup(struct device *dev);
#else
Expand Down Expand Up @@ -1058,6 +1064,10 @@ static inline int acpi_dma_get_range(struct device *dev, const struct bus_dma_re
return -ENODEV;
}

static inline void acpi_msi_configure(struct device *dev)
{
}

static inline int acpi_dma_configure(struct device *dev,
enum dev_dma_attr attr)
{
Expand Down