mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 18:51:56 -04:00
Merge branches 'x86/amd', 'x86/vt-d', 'arm/rockchip', 'arm/omap', 'arm/mediatek', 'arm/exynos', 'arm/renesas', 'arm/smmu' and 'core' into next
This commit is contained in:
parent
29d049be94
f746a025d3
57c26957bd
b6d57f1da7
70ca608b2e
6d7cf02a86
9fe77e0166
7868805969
f51dc89265
commit
d4f96fd5c2
1654 changed files with 19064 additions and 11836 deletions
|
|
@ -74,10 +74,10 @@ void __init acpi_watchdog_init(void)
|
|||
res.start = gas->address;
|
||||
if (gas->space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY) {
|
||||
res.flags = IORESOURCE_MEM;
|
||||
res.end = res.start + ALIGN(gas->access_width, 4);
|
||||
res.end = res.start + ALIGN(gas->access_width, 4) - 1;
|
||||
} else if (gas->space_id == ACPI_ADR_SPACE_SYSTEM_IO) {
|
||||
res.flags = IORESOURCE_IO;
|
||||
res.end = res.start + gas->access_width;
|
||||
res.end = res.start + gas->access_width - 1;
|
||||
} else {
|
||||
pr_warn("Unsupported address space: %u\n",
|
||||
gas->space_id);
|
||||
|
|
|
|||
|
|
@ -39,6 +39,7 @@
|
|||
struct iort_its_msi_chip {
|
||||
struct list_head list;
|
||||
struct fwnode_handle *fw_node;
|
||||
phys_addr_t base_addr;
|
||||
u32 translation_id;
|
||||
};
|
||||
|
||||
|
|
@ -161,14 +162,16 @@ static LIST_HEAD(iort_msi_chip_list);
|
|||
static DEFINE_SPINLOCK(iort_msi_chip_lock);
|
||||
|
||||
/**
|
||||
* iort_register_domain_token() - register domain token and related ITS ID
|
||||
* to the list from where we can get it back later on.
|
||||
* iort_register_domain_token() - register domain token along with related
|
||||
* ITS ID and base address to the list from where we can get it back later on.
|
||||
* @trans_id: ITS ID.
|
||||
* @base: ITS base address.
|
||||
* @fw_node: Domain token.
|
||||
*
|
||||
* Returns: 0 on success, -ENOMEM if no memory when allocating list element
|
||||
*/
|
||||
int iort_register_domain_token(int trans_id, struct fwnode_handle *fw_node)
|
||||
int iort_register_domain_token(int trans_id, phys_addr_t base,
|
||||
struct fwnode_handle *fw_node)
|
||||
{
|
||||
struct iort_its_msi_chip *its_msi_chip;
|
||||
|
||||
|
|
@ -178,6 +181,7 @@ int iort_register_domain_token(int trans_id, struct fwnode_handle *fw_node)
|
|||
|
||||
its_msi_chip->fw_node = fw_node;
|
||||
its_msi_chip->translation_id = trans_id;
|
||||
its_msi_chip->base_addr = base;
|
||||
|
||||
spin_lock(&iort_msi_chip_lock);
|
||||
list_add(&its_msi_chip->list, &iort_msi_chip_list);
|
||||
|
|
@ -581,6 +585,24 @@ int iort_pmsi_get_dev_id(struct device *dev, u32 *dev_id)
|
|||
return -ENODEV;
|
||||
}
|
||||
|
||||
static int __maybe_unused iort_find_its_base(u32 its_id, phys_addr_t *base)
|
||||
{
|
||||
struct iort_its_msi_chip *its_msi_chip;
|
||||
int ret = -ENODEV;
|
||||
|
||||
spin_lock(&iort_msi_chip_lock);
|
||||
list_for_each_entry(its_msi_chip, &iort_msi_chip_list, list) {
|
||||
if (its_msi_chip->translation_id == its_id) {
|
||||
*base = its_msi_chip->base_addr;
|
||||
ret = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
spin_unlock(&iort_msi_chip_lock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* iort_dev_find_its_id() - Find the ITS identifier for a device
|
||||
* @dev: The device.
|
||||
|
|
@ -766,6 +788,24 @@ static inline bool iort_iommu_driver_enabled(u8 type)
|
|||
}
|
||||
|
||||
#ifdef CONFIG_IOMMU_API
|
||||
static struct acpi_iort_node *iort_get_msi_resv_iommu(struct device *dev)
|
||||
{
|
||||
struct acpi_iort_node *iommu;
|
||||
struct iommu_fwspec *fwspec = dev->iommu_fwspec;
|
||||
|
||||
iommu = iort_get_iort_node(fwspec->iommu_fwnode);
|
||||
|
||||
if (iommu && (iommu->type == ACPI_IORT_NODE_SMMU_V3)) {
|
||||
struct acpi_iort_smmu_v3 *smmu;
|
||||
|
||||
smmu = (struct acpi_iort_smmu_v3 *)iommu->node_data;
|
||||
if (smmu->model == ACPI_IORT_SMMU_V3_HISILICON_HI161X)
|
||||
return iommu;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline const struct iommu_ops *iort_fwspec_iommu_ops(
|
||||
struct iommu_fwspec *fwspec)
|
||||
{
|
||||
|
|
@ -782,6 +822,69 @@ static inline int iort_add_device_replay(const struct iommu_ops *ops,
|
|||
|
||||
return err;
|
||||
}
|
||||
|
||||
/**
|
||||
* iort_iommu_msi_get_resv_regions - Reserved region driver helper
|
||||
* @dev: Device from iommu_get_resv_regions()
|
||||
* @head: Reserved region list from iommu_get_resv_regions()
|
||||
*
|
||||
* Returns: Number of msi reserved regions on success (0 if platform
|
||||
* doesn't require the reservation or no associated msi regions),
|
||||
* appropriate error value otherwise. The ITS interrupt translation
|
||||
* spaces (ITS_base + SZ_64K, SZ_64K) associated with the device
|
||||
* are the msi reserved regions.
|
||||
*/
|
||||
int iort_iommu_msi_get_resv_regions(struct device *dev, struct list_head *head)
|
||||
{
|
||||
struct acpi_iort_its_group *its;
|
||||
struct acpi_iort_node *iommu_node, *its_node = NULL;
|
||||
int i, resv = 0;
|
||||
|
||||
iommu_node = iort_get_msi_resv_iommu(dev);
|
||||
if (!iommu_node)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* Current logic to reserve ITS regions relies on HW topologies
|
||||
* where a given PCI or named component maps its IDs to only one
|
||||
* ITS group; if a PCI or named component can map its IDs to
|
||||
* different ITS groups through IORT mappings this function has
|
||||
* to be reworked to ensure we reserve regions for all ITS groups
|
||||
* a given PCI or named component may map IDs to.
|
||||
*/
|
||||
|
||||
for (i = 0; i < dev->iommu_fwspec->num_ids; i++) {
|
||||
its_node = iort_node_map_id(iommu_node,
|
||||
dev->iommu_fwspec->ids[i],
|
||||
NULL, IORT_MSI_TYPE);
|
||||
if (its_node)
|
||||
break;
|
||||
}
|
||||
|
||||
if (!its_node)
|
||||
return 0;
|
||||
|
||||
/* Move to ITS specific data */
|
||||
its = (struct acpi_iort_its_group *)its_node->node_data;
|
||||
|
||||
for (i = 0; i < its->its_count; i++) {
|
||||
phys_addr_t base;
|
||||
|
||||
if (!iort_find_its_base(its->identifiers[i], &base)) {
|
||||
int prot = IOMMU_WRITE | IOMMU_NOEXEC | IOMMU_MMIO;
|
||||
struct iommu_resv_region *region;
|
||||
|
||||
region = iommu_alloc_resv_region(base + SZ_64K, SZ_64K,
|
||||
prot, IOMMU_RESV_MSI);
|
||||
if (region) {
|
||||
list_add_tail(®ion->list, head);
|
||||
resv++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return (resv == its->its_count) ? resv : -ENODEV;
|
||||
}
|
||||
#else
|
||||
static inline const struct iommu_ops *iort_fwspec_iommu_ops(
|
||||
struct iommu_fwspec *fwspec)
|
||||
|
|
@ -789,6 +892,8 @@ static inline const struct iommu_ops *iort_fwspec_iommu_ops(
|
|||
static inline int iort_add_device_replay(const struct iommu_ops *ops,
|
||||
struct device *dev)
|
||||
{ return 0; }
|
||||
int iort_iommu_msi_get_resv_regions(struct device *dev, struct list_head *head)
|
||||
{ return 0; }
|
||||
#endif
|
||||
|
||||
static int iort_iommu_xlate(struct device *dev, struct acpi_iort_node *node,
|
||||
|
|
|
|||
|
|
@ -70,7 +70,6 @@ static async_cookie_t async_cookie;
|
|||
static bool battery_driver_registered;
|
||||
static int battery_bix_broken_package;
|
||||
static int battery_notification_delay_ms;
|
||||
static int battery_full_discharging;
|
||||
static unsigned int cache_time = 1000;
|
||||
module_param(cache_time, uint, 0644);
|
||||
MODULE_PARM_DESC(cache_time, "cache time in milliseconds");
|
||||
|
|
@ -215,12 +214,9 @@ static int acpi_battery_get_property(struct power_supply *psy,
|
|||
return -ENODEV;
|
||||
switch (psp) {
|
||||
case POWER_SUPPLY_PROP_STATUS:
|
||||
if (battery->state & ACPI_BATTERY_STATE_DISCHARGING) {
|
||||
if (battery_full_discharging && battery->rate_now == 0)
|
||||
val->intval = POWER_SUPPLY_STATUS_FULL;
|
||||
else
|
||||
val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
|
||||
} else if (battery->state & ACPI_BATTERY_STATE_CHARGING)
|
||||
if (battery->state & ACPI_BATTERY_STATE_DISCHARGING)
|
||||
val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
|
||||
else if (battery->state & ACPI_BATTERY_STATE_CHARGING)
|
||||
val->intval = POWER_SUPPLY_STATUS_CHARGING;
|
||||
else if (acpi_battery_is_charged(battery))
|
||||
val->intval = POWER_SUPPLY_STATUS_FULL;
|
||||
|
|
@ -1170,12 +1166,6 @@ battery_notification_delay_quirk(const struct dmi_system_id *d)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int __init battery_full_discharging_quirk(const struct dmi_system_id *d)
|
||||
{
|
||||
battery_full_discharging = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct dmi_system_id bat_dmi_table[] __initconst = {
|
||||
{
|
||||
.callback = battery_bix_broken_package_quirk,
|
||||
|
|
@ -1193,38 +1183,6 @@ static const struct dmi_system_id bat_dmi_table[] __initconst = {
|
|||
DMI_MATCH(DMI_PRODUCT_NAME, "Aspire V5-573G"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = battery_full_discharging_quirk,
|
||||
.ident = "ASUS GL502VSK",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "GL502VSK"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = battery_full_discharging_quirk,
|
||||
.ident = "ASUS UX305LA",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "UX305LA"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = battery_full_discharging_quirk,
|
||||
.ident = "ASUS UX360UA",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "UX360UA"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = battery_full_discharging_quirk,
|
||||
.ident = "ASUS UX410UAK",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "UX410UAK"),
|
||||
},
|
||||
},
|
||||
{},
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -660,13 +660,15 @@ struct acpi_device *acpi_companion_match(const struct device *dev)
|
|||
* acpi_of_match_device - Match device object using the "compatible" property.
|
||||
* @adev: ACPI device object to match.
|
||||
* @of_match_table: List of device IDs to match against.
|
||||
* @of_id: OF ID if matched
|
||||
*
|
||||
* If @dev has an ACPI companion which has ACPI_DT_NAMESPACE_HID in its list of
|
||||
* identifiers and a _DSD object with the "compatible" property, use that
|
||||
* property to match against the given list of identifiers.
|
||||
*/
|
||||
static bool acpi_of_match_device(struct acpi_device *adev,
|
||||
const struct of_device_id *of_match_table)
|
||||
const struct of_device_id *of_match_table,
|
||||
const struct of_device_id **of_id)
|
||||
{
|
||||
const union acpi_object *of_compatible, *obj;
|
||||
int i, nval;
|
||||
|
|
@ -690,8 +692,11 @@ static bool acpi_of_match_device(struct acpi_device *adev,
|
|||
const struct of_device_id *id;
|
||||
|
||||
for (id = of_match_table; id->compatible[0]; id++)
|
||||
if (!strcasecmp(obj->string.pointer, id->compatible))
|
||||
if (!strcasecmp(obj->string.pointer, id->compatible)) {
|
||||
if (of_id)
|
||||
*of_id = id;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
|
|
@ -762,10 +767,11 @@ static bool __acpi_match_device_cls(const struct acpi_device_id *id,
|
|||
return true;
|
||||
}
|
||||
|
||||
static const struct acpi_device_id *__acpi_match_device(
|
||||
struct acpi_device *device,
|
||||
const struct acpi_device_id *ids,
|
||||
const struct of_device_id *of_ids)
|
||||
static bool __acpi_match_device(struct acpi_device *device,
|
||||
const struct acpi_device_id *acpi_ids,
|
||||
const struct of_device_id *of_ids,
|
||||
const struct acpi_device_id **acpi_id,
|
||||
const struct of_device_id **of_id)
|
||||
{
|
||||
const struct acpi_device_id *id;
|
||||
struct acpi_hardware_id *hwid;
|
||||
|
|
@ -775,30 +781,32 @@ static const struct acpi_device_id *__acpi_match_device(
|
|||
* driver for it.
|
||||
*/
|
||||
if (!device || !device->status.present)
|
||||
return NULL;
|
||||
return false;
|
||||
|
||||
list_for_each_entry(hwid, &device->pnp.ids, list) {
|
||||
/* First, check the ACPI/PNP IDs provided by the caller. */
|
||||
for (id = ids; id->id[0] || id->cls; id++) {
|
||||
if (id->id[0] && !strcmp((char *) id->id, hwid->id))
|
||||
return id;
|
||||
else if (id->cls && __acpi_match_device_cls(id, hwid))
|
||||
return id;
|
||||
if (acpi_ids) {
|
||||
for (id = acpi_ids; id->id[0] || id->cls; id++) {
|
||||
if (id->id[0] && !strcmp((char *)id->id, hwid->id))
|
||||
goto out_acpi_match;
|
||||
if (id->cls && __acpi_match_device_cls(id, hwid))
|
||||
goto out_acpi_match;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Next, check ACPI_DT_NAMESPACE_HID and try to match the
|
||||
* "compatible" property if found.
|
||||
*
|
||||
* The id returned by the below is not valid, but the only
|
||||
* caller passing non-NULL of_ids here is only interested in
|
||||
* whether or not the return value is NULL.
|
||||
*/
|
||||
if (!strcmp(ACPI_DT_NAMESPACE_HID, hwid->id)
|
||||
&& acpi_of_match_device(device, of_ids))
|
||||
return id;
|
||||
if (!strcmp(ACPI_DT_NAMESPACE_HID, hwid->id))
|
||||
return acpi_of_match_device(device, of_ids, of_id);
|
||||
}
|
||||
return NULL;
|
||||
return false;
|
||||
|
||||
out_acpi_match:
|
||||
if (acpi_id)
|
||||
*acpi_id = id;
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -815,32 +823,29 @@ static const struct acpi_device_id *__acpi_match_device(
|
|||
const struct acpi_device_id *acpi_match_device(const struct acpi_device_id *ids,
|
||||
const struct device *dev)
|
||||
{
|
||||
return __acpi_match_device(acpi_companion_match(dev), ids, NULL);
|
||||
const struct acpi_device_id *id = NULL;
|
||||
|
||||
__acpi_match_device(acpi_companion_match(dev), ids, NULL, &id, NULL);
|
||||
return id;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(acpi_match_device);
|
||||
|
||||
void *acpi_get_match_data(const struct device *dev)
|
||||
const void *acpi_device_get_match_data(const struct device *dev)
|
||||
{
|
||||
const struct acpi_device_id *match;
|
||||
|
||||
if (!dev->driver)
|
||||
return NULL;
|
||||
|
||||
if (!dev->driver->acpi_match_table)
|
||||
return NULL;
|
||||
|
||||
match = acpi_match_device(dev->driver->acpi_match_table, dev);
|
||||
if (!match)
|
||||
return NULL;
|
||||
|
||||
return (void *)match->driver_data;
|
||||
return (const void *)match->driver_data;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(acpi_get_match_data);
|
||||
EXPORT_SYMBOL_GPL(acpi_device_get_match_data);
|
||||
|
||||
int acpi_match_device_ids(struct acpi_device *device,
|
||||
const struct acpi_device_id *ids)
|
||||
{
|
||||
return __acpi_match_device(device, ids, NULL) ? 0 : -ENOENT;
|
||||
return __acpi_match_device(device, ids, NULL, NULL, NULL) ? 0 : -ENOENT;
|
||||
}
|
||||
EXPORT_SYMBOL(acpi_match_device_ids);
|
||||
|
||||
|
|
@ -849,10 +854,12 @@ bool acpi_driver_match_device(struct device *dev,
|
|||
{
|
||||
if (!drv->acpi_match_table)
|
||||
return acpi_of_match_device(ACPI_COMPANION(dev),
|
||||
drv->of_match_table);
|
||||
drv->of_match_table,
|
||||
NULL);
|
||||
|
||||
return !!__acpi_match_device(acpi_companion_match(dev),
|
||||
drv->acpi_match_table, drv->of_match_table);
|
||||
return __acpi_match_device(acpi_companion_match(dev),
|
||||
drv->acpi_match_table, drv->of_match_table,
|
||||
NULL, NULL);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(acpi_driver_match_device);
|
||||
|
||||
|
|
|
|||
|
|
@ -1927,6 +1927,9 @@ static int acpi_ec_suspend_noirq(struct device *dev)
|
|||
ec->reference_count >= 1)
|
||||
acpi_set_gpe(NULL, ec->gpe, ACPI_GPE_DISABLE);
|
||||
|
||||
if (acpi_sleep_no_ec_events())
|
||||
acpi_ec_enter_noirq(ec);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -1934,6 +1937,9 @@ static int acpi_ec_resume_noirq(struct device *dev)
|
|||
{
|
||||
struct acpi_ec *ec = acpi_driver_data(to_acpi_device(dev));
|
||||
|
||||
if (acpi_sleep_no_ec_events())
|
||||
acpi_ec_leave_noirq(ec);
|
||||
|
||||
if (ec_no_wakeup && test_bit(EC_FLAGS_STARTED, &ec->flags) &&
|
||||
ec->reference_count >= 1)
|
||||
acpi_set_gpe(NULL, ec->gpe, ACPI_GPE_ENABLE);
|
||||
|
|
|
|||
|
|
@ -2675,10 +2675,14 @@ static int acpi_nfit_register_region(struct acpi_nfit_desc *acpi_desc,
|
|||
else
|
||||
ndr_desc->numa_node = NUMA_NO_NODE;
|
||||
|
||||
if(acpi_desc->platform_cap & ACPI_NFIT_CAPABILITY_CACHE_FLUSH)
|
||||
/*
|
||||
* Persistence domain bits are hierarchical, if
|
||||
* ACPI_NFIT_CAPABILITY_CACHE_FLUSH is set then
|
||||
* ACPI_NFIT_CAPABILITY_MEM_FLUSH is implied.
|
||||
*/
|
||||
if (acpi_desc->platform_cap & ACPI_NFIT_CAPABILITY_CACHE_FLUSH)
|
||||
set_bit(ND_REGION_PERSIST_CACHE, &ndr_desc->flags);
|
||||
|
||||
if (acpi_desc->platform_cap & ACPI_NFIT_CAPABILITY_MEM_FLUSH)
|
||||
else if (acpi_desc->platform_cap & ACPI_NFIT_CAPABILITY_MEM_FLUSH)
|
||||
set_bit(ND_REGION_PERSIST_MEMCTRL, &ndr_desc->flags);
|
||||
|
||||
list_for_each_entry(nfit_memdev, &acpi_desc->memdevs, list) {
|
||||
|
|
|
|||
|
|
@ -103,25 +103,27 @@ int acpi_map_pxm_to_node(int pxm)
|
|||
*/
|
||||
int acpi_map_pxm_to_online_node(int pxm)
|
||||
{
|
||||
int node, n, dist, min_dist;
|
||||
int node, min_node;
|
||||
|
||||
node = acpi_map_pxm_to_node(pxm);
|
||||
|
||||
if (node == NUMA_NO_NODE)
|
||||
node = 0;
|
||||
|
||||
min_node = node;
|
||||
if (!node_online(node)) {
|
||||
min_dist = INT_MAX;
|
||||
int min_dist = INT_MAX, dist, n;
|
||||
|
||||
for_each_online_node(n) {
|
||||
dist = node_distance(node, n);
|
||||
if (dist < min_dist) {
|
||||
min_dist = dist;
|
||||
node = n;
|
||||
min_node = n;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return node;
|
||||
return min_node;
|
||||
}
|
||||
EXPORT_SYMBOL(acpi_map_pxm_to_online_node);
|
||||
|
||||
|
|
|
|||
|
|
@ -1271,11 +1271,11 @@ static int acpi_fwnode_graph_parse_endpoint(const struct fwnode_handle *fwnode,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void *
|
||||
static const void *
|
||||
acpi_fwnode_device_get_match_data(const struct fwnode_handle *fwnode,
|
||||
const struct device *dev)
|
||||
{
|
||||
return acpi_get_match_data(dev);
|
||||
return acpi_device_get_match_data(dev);
|
||||
}
|
||||
|
||||
#define DECLARE_ACPI_FWNODE_OPS(ops) \
|
||||
|
|
|
|||
|
|
@ -115,6 +115,7 @@ int __init acpi_parse_spcr(bool enable_earlycon, bool enable_console)
|
|||
table->serial_port.access_width))) {
|
||||
default:
|
||||
pr_err("Unexpected SPCR Access Width. Defaulting to byte size\n");
|
||||
/* fall through */
|
||||
case 8:
|
||||
iotype = "mmio";
|
||||
break;
|
||||
|
|
|
|||
Loading…
Reference in a new issue