|
@@ -3241,7 +3241,10 @@ static struct iova *intel_alloc_iova(struct device *dev,
|
|
|
|
|
|
static struct dmar_domain *__get_valid_domain_for_dev(struct device *dev)
|
|
static struct dmar_domain *__get_valid_domain_for_dev(struct device *dev)
|
|
{
|
|
{
|
|
|
|
+ struct dmar_rmrr_unit *rmrr;
|
|
struct dmar_domain *domain;
|
|
struct dmar_domain *domain;
|
|
|
|
+ struct device *i_dev;
|
|
|
|
+ int i, ret;
|
|
|
|
|
|
domain = get_domain_for_dev(dev, DEFAULT_DOMAIN_ADDRESS_WIDTH);
|
|
domain = get_domain_for_dev(dev, DEFAULT_DOMAIN_ADDRESS_WIDTH);
|
|
if (!domain) {
|
|
if (!domain) {
|
|
@@ -3250,6 +3253,23 @@ static struct dmar_domain *__get_valid_domain_for_dev(struct device *dev)
|
|
return NULL;
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /* We have a new domain - setup possible RMRRs for the device */
|
|
|
|
+ rcu_read_lock();
|
|
|
|
+ for_each_rmrr_units(rmrr) {
|
|
|
|
+ for_each_active_dev_scope(rmrr->devices, rmrr->devices_cnt,
|
|
|
|
+ i, i_dev) {
|
|
|
|
+ if (i_dev != dev)
|
|
|
|
+ continue;
|
|
|
|
+
|
|
|
|
+ ret = domain_prepare_identity_map(dev, domain,
|
|
|
|
+ rmrr->base_address,
|
|
|
|
+ rmrr->end_address);
|
|
|
|
+ if (ret)
|
|
|
|
+ dev_err(dev, "Mapping reserved region failed\n");
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ rcu_read_unlock();
|
|
|
|
+
|
|
return domain;
|
|
return domain;
|
|
}
|
|
}
|
|
|
|
|