mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 11:11:45 -04:00
Merge branches 'iommu/fixes', 'dma-debug', 'arm/omap', 'arm/tegra', 'core' and 'x86/amd' into next
This commit is contained in:
commit
28f8571e1e
1184 changed files with 11796 additions and 7946 deletions
|
|
@ -119,6 +119,7 @@ EXPORT_SYMBOL_GPL(iommu_present);
|
|||
* iommu_set_fault_handler() - set a fault handler for an iommu domain
|
||||
* @domain: iommu domain
|
||||
* @handler: fault handler
|
||||
* @token: user data, will be passed back to the fault handler
|
||||
*
|
||||
* This function should be used by IOMMU users which want to be notified
|
||||
* whenever an IOMMU fault happens.
|
||||
|
|
@ -127,11 +128,13 @@ EXPORT_SYMBOL_GPL(iommu_present);
|
|||
* error code otherwise.
|
||||
*/
|
||||
void iommu_set_fault_handler(struct iommu_domain *domain,
|
||||
iommu_fault_handler_t handler)
|
||||
iommu_fault_handler_t handler,
|
||||
void *token)
|
||||
{
|
||||
BUG_ON(!domain);
|
||||
|
||||
domain->handler = handler;
|
||||
domain->handler_token = token;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(iommu_set_fault_handler);
|
||||
|
||||
|
|
|
|||
|
|
@ -41,11 +41,13 @@
|
|||
* @pgtable: the page table
|
||||
* @iommu_dev: an omap iommu device attached to this domain. only a single
|
||||
* iommu device can be attached for now.
|
||||
* @dev: Device using this domain.
|
||||
* @lock: domain lock, should be taken when attaching/detaching
|
||||
*/
|
||||
struct omap_iommu_domain {
|
||||
u32 *pgtable;
|
||||
struct omap_iommu *iommu_dev;
|
||||
struct device *dev;
|
||||
spinlock_t lock;
|
||||
};
|
||||
|
||||
|
|
@ -1081,6 +1083,7 @@ omap_iommu_attach_dev(struct iommu_domain *domain, struct device *dev)
|
|||
}
|
||||
|
||||
omap_domain->iommu_dev = arch_data->iommu_dev = oiommu;
|
||||
omap_domain->dev = dev;
|
||||
oiommu->domain = domain;
|
||||
|
||||
out:
|
||||
|
|
@ -1088,19 +1091,16 @@ out:
|
|||
return ret;
|
||||
}
|
||||
|
||||
static void omap_iommu_detach_dev(struct iommu_domain *domain,
|
||||
struct device *dev)
|
||||
static void _omap_iommu_detach_dev(struct omap_iommu_domain *omap_domain,
|
||||
struct device *dev)
|
||||
{
|
||||
struct omap_iommu_domain *omap_domain = domain->priv;
|
||||
struct omap_iommu_arch_data *arch_data = dev->archdata.iommu;
|
||||
struct omap_iommu *oiommu = dev_to_omap_iommu(dev);
|
||||
|
||||
spin_lock(&omap_domain->lock);
|
||||
struct omap_iommu_arch_data *arch_data = dev->archdata.iommu;
|
||||
|
||||
/* only a single device is supported per domain for now */
|
||||
if (omap_domain->iommu_dev != oiommu) {
|
||||
dev_err(dev, "invalid iommu device\n");
|
||||
goto out;
|
||||
return;
|
||||
}
|
||||
|
||||
iopgtable_clear_entry_all(oiommu);
|
||||
|
|
@ -1108,8 +1108,16 @@ static void omap_iommu_detach_dev(struct iommu_domain *domain,
|
|||
omap_iommu_detach(oiommu);
|
||||
|
||||
omap_domain->iommu_dev = arch_data->iommu_dev = NULL;
|
||||
omap_domain->dev = NULL;
|
||||
}
|
||||
|
||||
out:
|
||||
static void omap_iommu_detach_dev(struct iommu_domain *domain,
|
||||
struct device *dev)
|
||||
{
|
||||
struct omap_iommu_domain *omap_domain = domain->priv;
|
||||
|
||||
spin_lock(&omap_domain->lock);
|
||||
_omap_iommu_detach_dev(omap_domain, dev);
|
||||
spin_unlock(&omap_domain->lock);
|
||||
}
|
||||
|
||||
|
|
@ -1148,13 +1156,19 @@ out:
|
|||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/* assume device was already detached */
|
||||
static void omap_iommu_domain_destroy(struct iommu_domain *domain)
|
||||
{
|
||||
struct omap_iommu_domain *omap_domain = domain->priv;
|
||||
|
||||
domain->priv = NULL;
|
||||
|
||||
/*
|
||||
* An iommu device is still attached
|
||||
* (currently, only one device can be attached) ?
|
||||
*/
|
||||
if (omap_domain->iommu_dev)
|
||||
_omap_iommu_detach_dev(omap_domain, omap_domain->dev);
|
||||
|
||||
kfree(omap_domain->pgtable);
|
||||
kfree(omap_domain);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -29,15 +29,17 @@
|
|||
#include <linux/device.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/iommu.h>
|
||||
#include <linux/of.h>
|
||||
|
||||
#include <asm/cacheflush.h>
|
||||
|
||||
/* bitmap of the page sizes currently supported */
|
||||
#define GART_IOMMU_PGSIZES (SZ_4K)
|
||||
|
||||
#define GART_CONFIG 0x24
|
||||
#define GART_ENTRY_ADDR 0x28
|
||||
#define GART_ENTRY_DATA 0x2c
|
||||
#define GART_REG_BASE 0x24
|
||||
#define GART_CONFIG (0x24 - GART_REG_BASE)
|
||||
#define GART_ENTRY_ADDR (0x28 - GART_REG_BASE)
|
||||
#define GART_ENTRY_DATA (0x2c - GART_REG_BASE)
|
||||
#define GART_ENTRY_PHYS_ADDR_VALID (1 << 31)
|
||||
|
||||
#define GART_PAGE_SHIFT 12
|
||||
|
|
@ -158,7 +160,7 @@ static int gart_iommu_attach_dev(struct iommu_domain *domain,
|
|||
struct gart_client *client, *c;
|
||||
int err = 0;
|
||||
|
||||
gart = dev_get_drvdata(dev->parent);
|
||||
gart = gart_handle;
|
||||
if (!gart)
|
||||
return -EINVAL;
|
||||
domain->priv = gart;
|
||||
|
|
@ -422,6 +424,14 @@ const struct dev_pm_ops tegra_gart_pm_ops = {
|
|||
.resume = tegra_gart_resume,
|
||||
};
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
static struct of_device_id tegra_gart_of_match[] __devinitdata = {
|
||||
{ .compatible = "nvidia,tegra20-gart", },
|
||||
{ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, tegra_gart_of_match);
|
||||
#endif
|
||||
|
||||
static struct platform_driver tegra_gart_driver = {
|
||||
.probe = tegra_gart_probe,
|
||||
.remove = tegra_gart_remove,
|
||||
|
|
@ -429,6 +439,7 @@ static struct platform_driver tegra_gart_driver = {
|
|||
.owner = THIS_MODULE,
|
||||
.name = "tegra-gart",
|
||||
.pm = &tegra_gart_pm_ops,
|
||||
.of_match_table = of_match_ptr(tegra_gart_of_match),
|
||||
},
|
||||
};
|
||||
|
||||
|
|
@ -448,4 +459,5 @@ module_exit(tegra_gart_exit);
|
|||
|
||||
MODULE_DESCRIPTION("IOMMU API for GART in Tegra20");
|
||||
MODULE_AUTHOR("Hiroshi DOYU <[email protected]>");
|
||||
MODULE_ALIAS("platform:tegra-gart");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
|
|
|||
|
|
@ -733,7 +733,7 @@ static int smmu_iommu_attach_dev(struct iommu_domain *domain,
|
|||
pr_info("Reserve \"page zero\" for AVP vectors using a common dummy\n");
|
||||
}
|
||||
|
||||
dev_dbg(smmu->dev, "%s is attached\n", dev_name(c->dev));
|
||||
dev_dbg(smmu->dev, "%s is attached\n", dev_name(dev));
|
||||
return 0;
|
||||
|
||||
err_client:
|
||||
|
|
|
|||
Loading…
Reference in a new issue