mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 10:58:48 +09:00
Merge e5524c2a1f ("Merge tag 'fscache-fixes-20220708' of git://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs") into android-mainline
Steps on the way to 5.19-rc6 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: I485591112816600ba530b2be800417bb8c82e02a
This commit is contained in:
3
.mailmap
3
.mailmap
@@ -64,6 +64,9 @@ Bart Van Assche <bvanassche@acm.org> <bart.vanassche@sandisk.com>
|
||||
Bart Van Assche <bvanassche@acm.org> <bart.vanassche@wdc.com>
|
||||
Ben Gardner <bgardner@wabtec.com>
|
||||
Ben M Cahill <ben.m.cahill@intel.com>
|
||||
Ben Widawsky <bwidawsk@kernel.org> <ben@bwidawsk.net>
|
||||
Ben Widawsky <bwidawsk@kernel.org> <ben.widawsky@intel.com>
|
||||
Ben Widawsky <bwidawsk@kernel.org> <benjamin.widawsky@intel.com>
|
||||
Björn Steinbrink <B.Steinbrink@gmx.de>
|
||||
Björn Töpel <bjorn@kernel.org> <bjorn.topel@gmail.com>
|
||||
Björn Töpel <bjorn@kernel.org> <bjorn.topel@intel.com>
|
||||
|
||||
13
MAINTAINERS
13
MAINTAINERS
@@ -426,7 +426,6 @@ F: drivers/acpi/*thermal*
|
||||
ACPI VIOT DRIVER
|
||||
M: Jean-Philippe Brucker <jean-philippe@linaro.org>
|
||||
L: linux-acpi@vger.kernel.org
|
||||
L: iommu@lists.linux-foundation.org
|
||||
L: iommu@lists.linux.dev
|
||||
S: Maintained
|
||||
F: drivers/acpi/viot.c
|
||||
@@ -960,7 +959,6 @@ F: drivers/video/fbdev/geode/
|
||||
AMD IOMMU (AMD-VI)
|
||||
M: Joerg Roedel <joro@8bytes.org>
|
||||
R: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
|
||||
L: iommu@lists.linux-foundation.org
|
||||
L: iommu@lists.linux.dev
|
||||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu.git
|
||||
@@ -5103,7 +5101,7 @@ COMPUTE EXPRESS LINK (CXL)
|
||||
M: Alison Schofield <alison.schofield@intel.com>
|
||||
M: Vishal Verma <vishal.l.verma@intel.com>
|
||||
M: Ira Weiny <ira.weiny@intel.com>
|
||||
M: Ben Widawsky <ben.widawsky@intel.com>
|
||||
M: Ben Widawsky <bwidawsk@kernel.org>
|
||||
M: Dan Williams <dan.j.williams@intel.com>
|
||||
L: linux-cxl@vger.kernel.org
|
||||
S: Maintained
|
||||
@@ -6055,7 +6053,6 @@ DMA MAPPING HELPERS
|
||||
M: Christoph Hellwig <hch@lst.de>
|
||||
M: Marek Szyprowski <m.szyprowski@samsung.com>
|
||||
R: Robin Murphy <robin.murphy@arm.com>
|
||||
L: iommu@lists.linux-foundation.org
|
||||
L: iommu@lists.linux.dev
|
||||
S: Supported
|
||||
W: http://git.infradead.org/users/hch/dma-mapping.git
|
||||
@@ -6068,7 +6065,6 @@ F: kernel/dma/
|
||||
|
||||
DMA MAPPING BENCHMARK
|
||||
M: Xiang Chen <chenxiang66@hisilicon.com>
|
||||
L: iommu@lists.linux-foundation.org
|
||||
L: iommu@lists.linux.dev
|
||||
F: kernel/dma/map_benchmark.c
|
||||
F: tools/testing/selftests/dma/
|
||||
@@ -7653,7 +7649,6 @@ F: drivers/gpu/drm/exynos/exynos_dp*
|
||||
|
||||
EXYNOS SYSMMU (IOMMU) driver
|
||||
M: Marek Szyprowski <m.szyprowski@samsung.com>
|
||||
L: iommu@lists.linux-foundation.org
|
||||
L: iommu@lists.linux.dev
|
||||
S: Maintained
|
||||
F: drivers/iommu/exynos-iommu.c
|
||||
@@ -10085,7 +10080,6 @@ F: drivers/hid/intel-ish-hid/
|
||||
INTEL IOMMU (VT-d)
|
||||
M: David Woodhouse <dwmw2@infradead.org>
|
||||
M: Lu Baolu <baolu.lu@linux.intel.com>
|
||||
L: iommu@lists.linux-foundation.org
|
||||
L: iommu@lists.linux.dev
|
||||
S: Supported
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu.git
|
||||
@@ -10465,7 +10459,6 @@ F: include/linux/iomap.h
|
||||
IOMMU DRIVERS
|
||||
M: Joerg Roedel <joro@8bytes.org>
|
||||
M: Will Deacon <will@kernel.org>
|
||||
L: iommu@lists.linux-foundation.org
|
||||
L: iommu@lists.linux.dev
|
||||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu.git
|
||||
@@ -12625,7 +12618,6 @@ F: drivers/i2c/busses/i2c-mt65xx.c
|
||||
|
||||
MEDIATEK IOMMU DRIVER
|
||||
M: Yong Wu <yong.wu@mediatek.com>
|
||||
L: iommu@lists.linux-foundation.org
|
||||
L: iommu@lists.linux.dev
|
||||
L: linux-mediatek@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Supported
|
||||
@@ -16677,7 +16669,6 @@ F: drivers/i2c/busses/i2c-qcom-cci.c
|
||||
|
||||
QUALCOMM IOMMU
|
||||
M: Rob Clark <robdclark@gmail.com>
|
||||
L: iommu@lists.linux-foundation.org
|
||||
L: iommu@lists.linux.dev
|
||||
L: linux-arm-msm@vger.kernel.org
|
||||
S: Maintained
|
||||
@@ -19306,7 +19297,6 @@ F: arch/x86/boot/video*
|
||||
|
||||
SWIOTLB SUBSYSTEM
|
||||
M: Christoph Hellwig <hch@infradead.org>
|
||||
L: iommu@lists.linux-foundation.org
|
||||
L: iommu@lists.linux.dev
|
||||
S: Supported
|
||||
W: http://git.infradead.org/users/hch/dma-mapping.git
|
||||
@@ -21982,7 +21972,6 @@ XEN SWIOTLB SUBSYSTEM
|
||||
M: Juergen Gross <jgross@suse.com>
|
||||
M: Stefano Stabellini <sstabellini@kernel.org>
|
||||
L: xen-devel@lists.xenproject.org (moderated for non-subscribers)
|
||||
L: iommu@lists.linux-foundation.org
|
||||
L: iommu@lists.linux.dev
|
||||
S: Supported
|
||||
F: arch/x86/xen/*swiotlb*
|
||||
|
||||
@@ -11,6 +11,16 @@
|
||||
|
||||
/* Refer to drivers/acpi/cppc_acpi.c for the description of functions */
|
||||
|
||||
bool cpc_supported_by_cpu(void)
|
||||
{
|
||||
switch (boot_cpu_data.x86_vendor) {
|
||||
case X86_VENDOR_AMD:
|
||||
case X86_VENDOR_HYGON:
|
||||
return boot_cpu_has(X86_FEATURE_CPPC);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool cpc_ffh_supported(void)
|
||||
{
|
||||
return true;
|
||||
|
||||
@@ -298,7 +298,7 @@ EXPORT_SYMBOL_GPL(osc_cpc_flexible_adr_space_confirmed);
|
||||
bool osc_sb_native_usb4_support_confirmed;
|
||||
EXPORT_SYMBOL_GPL(osc_sb_native_usb4_support_confirmed);
|
||||
|
||||
bool osc_sb_cppc_not_supported;
|
||||
bool osc_sb_cppc2_support_acked;
|
||||
|
||||
static u8 sb_uuid_str[] = "0811B06E-4A27-44F9-8D60-3CBBC22E7B48";
|
||||
static void acpi_bus_osc_negotiate_platform_control(void)
|
||||
@@ -358,11 +358,6 @@ static void acpi_bus_osc_negotiate_platform_control(void)
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ACPI_CPPC_LIB
|
||||
osc_sb_cppc_not_supported = !(capbuf_ret[OSC_SUPPORT_DWORD] &
|
||||
(OSC_SB_CPC_SUPPORT | OSC_SB_CPCV2_SUPPORT));
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Now run _OSC again with query flag clear and with the caps
|
||||
* supported by both the OS and the platform.
|
||||
@@ -376,6 +371,10 @@ static void acpi_bus_osc_negotiate_platform_control(void)
|
||||
|
||||
capbuf_ret = context.ret.pointer;
|
||||
if (context.ret.length > OSC_SUPPORT_DWORD) {
|
||||
#ifdef CONFIG_ACPI_CPPC_LIB
|
||||
osc_sb_cppc2_support_acked = capbuf_ret[OSC_SUPPORT_DWORD] & OSC_SB_CPCV2_SUPPORT;
|
||||
#endif
|
||||
|
||||
osc_sb_apei_support_acked =
|
||||
capbuf_ret[OSC_SUPPORT_DWORD] & OSC_SB_APEI_SUPPORT;
|
||||
osc_pc_lpi_support_confirmed =
|
||||
|
||||
@@ -577,6 +577,19 @@ bool __weak cpc_ffh_supported(void)
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* cpc_supported_by_cpu() - check if CPPC is supported by CPU
|
||||
*
|
||||
* Check if the architectural support for CPPC is present even
|
||||
* if the _OSC hasn't prescribed it
|
||||
*
|
||||
* Return: true for supported, false for not supported
|
||||
*/
|
||||
bool __weak cpc_supported_by_cpu(void)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* pcc_data_alloc() - Allocate the pcc_data memory for pcc subspace
|
||||
*
|
||||
@@ -684,8 +697,11 @@ int acpi_cppc_processor_probe(struct acpi_processor *pr)
|
||||
acpi_status status;
|
||||
int ret = -ENODATA;
|
||||
|
||||
if (osc_sb_cppc_not_supported)
|
||||
return -ENODEV;
|
||||
if (!osc_sb_cppc2_support_acked) {
|
||||
pr_debug("CPPC v2 _OSC not acked\n");
|
||||
if (!cpc_supported_by_cpu())
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
/* Parse the ACPI _CPC table for this CPU. */
|
||||
status = acpi_evaluate_object_typed(handle, "_CPC", NULL, &output,
|
||||
|
||||
@@ -486,7 +486,18 @@ static void device_link_release_fn(struct work_struct *work)
|
||||
/* Ensure that all references to the link object have been dropped. */
|
||||
device_link_synchronize_removal();
|
||||
|
||||
pm_runtime_release_supplier(link, true);
|
||||
pm_runtime_release_supplier(link);
|
||||
/*
|
||||
* If supplier_preactivated is set, the link has been dropped between
|
||||
* the pm_runtime_get_suppliers() and pm_runtime_put_suppliers() calls
|
||||
* in __driver_probe_device(). In that case, drop the supplier's
|
||||
* PM-runtime usage counter to remove the reference taken by
|
||||
* pm_runtime_get_suppliers().
|
||||
*/
|
||||
if (link->supplier_preactivated)
|
||||
pm_runtime_put_noidle(link->supplier);
|
||||
|
||||
pm_request_idle(link->supplier);
|
||||
|
||||
put_device(link->consumer);
|
||||
put_device(link->supplier);
|
||||
|
||||
@@ -308,13 +308,10 @@ static int rpm_get_suppliers(struct device *dev)
|
||||
/**
|
||||
* pm_runtime_release_supplier - Drop references to device link's supplier.
|
||||
* @link: Target device link.
|
||||
* @check_idle: Whether or not to check if the supplier device is idle.
|
||||
*
|
||||
* Drop all runtime PM references associated with @link to its supplier device
|
||||
* and if @check_idle is set, check if that device is idle (and so it can be
|
||||
* suspended).
|
||||
* Drop all runtime PM references associated with @link to its supplier device.
|
||||
*/
|
||||
void pm_runtime_release_supplier(struct device_link *link, bool check_idle)
|
||||
void pm_runtime_release_supplier(struct device_link *link)
|
||||
{
|
||||
struct device *supplier = link->supplier;
|
||||
|
||||
@@ -327,9 +324,6 @@ void pm_runtime_release_supplier(struct device_link *link, bool check_idle)
|
||||
while (refcount_dec_not_one(&link->rpm_active) &&
|
||||
atomic_read(&supplier->power.usage_count) > 0)
|
||||
pm_runtime_put_noidle(supplier);
|
||||
|
||||
if (check_idle)
|
||||
pm_request_idle(supplier);
|
||||
}
|
||||
|
||||
static void __rpm_put_suppliers(struct device *dev, bool try_to_suspend)
|
||||
@@ -337,8 +331,11 @@ static void __rpm_put_suppliers(struct device *dev, bool try_to_suspend)
|
||||
struct device_link *link;
|
||||
|
||||
list_for_each_entry_rcu(link, &dev->links.suppliers, c_node,
|
||||
device_links_read_lock_held())
|
||||
pm_runtime_release_supplier(link, try_to_suspend);
|
||||
device_links_read_lock_held()) {
|
||||
pm_runtime_release_supplier(link);
|
||||
if (try_to_suspend)
|
||||
pm_request_idle(link->supplier);
|
||||
}
|
||||
}
|
||||
|
||||
static void rpm_put_suppliers(struct device *dev)
|
||||
@@ -1771,7 +1768,6 @@ void pm_runtime_get_suppliers(struct device *dev)
|
||||
if (link->flags & DL_FLAG_PM_RUNTIME) {
|
||||
link->supplier_preactivated = true;
|
||||
pm_runtime_get_sync(link->supplier);
|
||||
refcount_inc(&link->rpm_active);
|
||||
}
|
||||
|
||||
device_links_read_unlock(idx);
|
||||
@@ -1791,19 +1787,8 @@ void pm_runtime_put_suppliers(struct device *dev)
|
||||
list_for_each_entry_rcu(link, &dev->links.suppliers, c_node,
|
||||
device_links_read_lock_held())
|
||||
if (link->supplier_preactivated) {
|
||||
bool put;
|
||||
|
||||
link->supplier_preactivated = false;
|
||||
|
||||
spin_lock_irq(&dev->power.lock);
|
||||
|
||||
put = pm_runtime_status_suspended(dev) &&
|
||||
refcount_dec_not_one(&link->rpm_active);
|
||||
|
||||
spin_unlock_irq(&dev->power.lock);
|
||||
|
||||
if (put)
|
||||
pm_runtime_put(link->supplier);
|
||||
pm_runtime_put(link->supplier);
|
||||
}
|
||||
|
||||
device_links_read_unlock(idx);
|
||||
@@ -1838,7 +1823,8 @@ void pm_runtime_drop_link(struct device_link *link)
|
||||
return;
|
||||
|
||||
pm_runtime_drop_link_count(link->consumer);
|
||||
pm_runtime_release_supplier(link, true);
|
||||
pm_runtime_release_supplier(link);
|
||||
pm_request_idle(link->supplier);
|
||||
}
|
||||
|
||||
static bool pm_runtime_need_not_resume(struct device *dev)
|
||||
|
||||
@@ -197,7 +197,7 @@ static int init_hdm_decoder(struct cxl_port *port, struct cxl_decoder *cxld,
|
||||
else
|
||||
cxld->target_type = CXL_DECODER_ACCELERATOR;
|
||||
|
||||
if (is_cxl_endpoint(to_cxl_port(cxld->dev.parent)))
|
||||
if (is_endpoint_decoder(&cxld->dev))
|
||||
return 0;
|
||||
|
||||
target_list.value =
|
||||
|
||||
@@ -355,11 +355,13 @@ static int cxl_to_mem_cmd(struct cxl_mem_command *mem_cmd,
|
||||
return -EBUSY;
|
||||
|
||||
/* Check the input buffer is the expected size */
|
||||
if (info->size_in != send_cmd->in.size)
|
||||
if ((info->size_in != CXL_VARIABLE_PAYLOAD) &&
|
||||
(info->size_in != send_cmd->in.size))
|
||||
return -ENOMEM;
|
||||
|
||||
/* Check the output buffer is at least large enough */
|
||||
if (send_cmd->out.size < info->size_out)
|
||||
if ((info->size_out != CXL_VARIABLE_PAYLOAD) &&
|
||||
(send_cmd->out.size < info->size_out))
|
||||
return -ENOMEM;
|
||||
|
||||
*mem_cmd = (struct cxl_mem_command) {
|
||||
|
||||
@@ -272,7 +272,7 @@ static const struct device_type cxl_decoder_root_type = {
|
||||
.groups = cxl_decoder_root_attribute_groups,
|
||||
};
|
||||
|
||||
static bool is_endpoint_decoder(struct device *dev)
|
||||
bool is_endpoint_decoder(struct device *dev)
|
||||
{
|
||||
return dev->type == &cxl_decoder_endpoint_type;
|
||||
}
|
||||
|
||||
@@ -340,6 +340,7 @@ struct cxl_dport *cxl_find_dport_by_dev(struct cxl_port *port,
|
||||
|
||||
struct cxl_decoder *to_cxl_decoder(struct device *dev);
|
||||
bool is_root_decoder(struct device *dev);
|
||||
bool is_endpoint_decoder(struct device *dev);
|
||||
bool is_cxl_decoder(struct device *dev);
|
||||
struct cxl_decoder *cxl_root_decoder_alloc(struct cxl_port *port,
|
||||
unsigned int nr_targets);
|
||||
|
||||
@@ -300,13 +300,13 @@ struct cxl_mbox_identify {
|
||||
} __packed;
|
||||
|
||||
struct cxl_mbox_get_lsa {
|
||||
u32 offset;
|
||||
u32 length;
|
||||
__le32 offset;
|
||||
__le32 length;
|
||||
} __packed;
|
||||
|
||||
struct cxl_mbox_set_lsa {
|
||||
u32 offset;
|
||||
u32 reserved;
|
||||
__le32 offset;
|
||||
__le32 reserved;
|
||||
u8 data[];
|
||||
} __packed;
|
||||
|
||||
|
||||
@@ -29,6 +29,7 @@ static int create_endpoint(struct cxl_memdev *cxlmd,
|
||||
{
|
||||
struct cxl_dev_state *cxlds = cxlmd->cxlds;
|
||||
struct cxl_port *endpoint;
|
||||
int rc;
|
||||
|
||||
endpoint = devm_cxl_add_port(&parent_port->dev, &cxlmd->dev,
|
||||
cxlds->component_reg_phys, parent_port);
|
||||
@@ -37,13 +38,17 @@ static int create_endpoint(struct cxl_memdev *cxlmd,
|
||||
|
||||
dev_dbg(&cxlmd->dev, "add: %s\n", dev_name(&endpoint->dev));
|
||||
|
||||
rc = cxl_endpoint_autoremove(cxlmd, endpoint);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
if (!endpoint->dev.driver) {
|
||||
dev_err(&cxlmd->dev, "%s failed probe\n",
|
||||
dev_name(&endpoint->dev));
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
return cxl_endpoint_autoremove(cxlmd, endpoint);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void enable_suspend(void *data)
|
||||
|
||||
@@ -108,8 +108,8 @@ static int cxl_pmem_get_config_data(struct cxl_dev_state *cxlds,
|
||||
return -EINVAL;
|
||||
|
||||
get_lsa = (struct cxl_mbox_get_lsa) {
|
||||
.offset = cmd->in_offset,
|
||||
.length = cmd->in_length,
|
||||
.offset = cpu_to_le32(cmd->in_offset),
|
||||
.length = cpu_to_le32(cmd->in_length),
|
||||
};
|
||||
|
||||
rc = cxl_mbox_send_cmd(cxlds, CXL_MBOX_OP_GET_LSA, &get_lsa,
|
||||
@@ -139,7 +139,7 @@ static int cxl_pmem_set_config_data(struct cxl_dev_state *cxlds,
|
||||
return -ENOMEM;
|
||||
|
||||
*set_lsa = (struct cxl_mbox_set_lsa) {
|
||||
.offset = cmd->in_offset,
|
||||
.offset = cpu_to_le32(cmd->in_offset),
|
||||
};
|
||||
memcpy(set_lsa->data, cmd->in_buf, cmd->in_length);
|
||||
|
||||
|
||||
@@ -447,9 +447,9 @@ static int exynos_bus_probe(struct platform_device *pdev)
|
||||
}
|
||||
}
|
||||
|
||||
max_state = bus->devfreq->profile->max_state;
|
||||
min_freq = (bus->devfreq->profile->freq_table[0] / 1000);
|
||||
max_freq = (bus->devfreq->profile->freq_table[max_state - 1] / 1000);
|
||||
max_state = bus->devfreq->max_state;
|
||||
min_freq = (bus->devfreq->freq_table[0] / 1000);
|
||||
max_freq = (bus->devfreq->freq_table[max_state - 1] / 1000);
|
||||
pr_info("exynos-bus: new bus device registered: %s (%6ld KHz ~ %6ld KHz)\n",
|
||||
dev_name(dev), min_freq, max_freq);
|
||||
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of_irq.h>
|
||||
#include <linux/pinctrl/consumer.h>
|
||||
|
||||
#define VF610_GPIO_PER_PORT 32
|
||||
|
||||
|
||||
@@ -1460,11 +1460,12 @@ static ssize_t linereq_read(struct file *file,
|
||||
static void linereq_free(struct linereq *lr)
|
||||
{
|
||||
unsigned int i;
|
||||
bool hte;
|
||||
bool hte = false;
|
||||
|
||||
for (i = 0; i < lr->num_lines; i++) {
|
||||
hte = !!test_bit(FLAG_EVENT_CLOCK_HTE,
|
||||
&lr->lines[i].desc->flags);
|
||||
if (lr->lines[i].desc)
|
||||
hte = !!test_bit(FLAG_EVENT_CLOCK_HTE,
|
||||
&lr->lines[i].desc->flags);
|
||||
edge_detector_stop(&lr->lines[i], hte);
|
||||
if (lr->lines[i].desc)
|
||||
gpiod_free(lr->lines[i].desc);
|
||||
|
||||
@@ -382,7 +382,7 @@ static int dmar_pci_bus_notifier(struct notifier_block *nb,
|
||||
|
||||
static struct notifier_block dmar_pci_bus_nb = {
|
||||
.notifier_call = dmar_pci_bus_notifier,
|
||||
.priority = INT_MIN,
|
||||
.priority = 1,
|
||||
};
|
||||
|
||||
static struct dmar_drhd_unit *
|
||||
|
||||
@@ -320,30 +320,6 @@ EXPORT_SYMBOL_GPL(intel_iommu_gfx_mapped);
|
||||
DEFINE_SPINLOCK(device_domain_lock);
|
||||
static LIST_HEAD(device_domain_list);
|
||||
|
||||
/*
|
||||
* Iterate over elements in device_domain_list and call the specified
|
||||
* callback @fn against each element.
|
||||
*/
|
||||
int for_each_device_domain(int (*fn)(struct device_domain_info *info,
|
||||
void *data), void *data)
|
||||
{
|
||||
int ret = 0;
|
||||
unsigned long flags;
|
||||
struct device_domain_info *info;
|
||||
|
||||
spin_lock_irqsave(&device_domain_lock, flags);
|
||||
list_for_each_entry(info, &device_domain_list, global) {
|
||||
ret = fn(info, data);
|
||||
if (ret) {
|
||||
spin_unlock_irqrestore(&device_domain_lock, flags);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
spin_unlock_irqrestore(&device_domain_lock, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
const struct iommu_ops intel_iommu_ops;
|
||||
|
||||
static bool translation_pre_enabled(struct intel_iommu *iommu)
|
||||
|
||||
@@ -86,54 +86,6 @@ void vcmd_free_pasid(struct intel_iommu *iommu, u32 pasid)
|
||||
/*
|
||||
* Per device pasid table management:
|
||||
*/
|
||||
static inline void
|
||||
device_attach_pasid_table(struct device_domain_info *info,
|
||||
struct pasid_table *pasid_table)
|
||||
{
|
||||
info->pasid_table = pasid_table;
|
||||
list_add(&info->table, &pasid_table->dev);
|
||||
}
|
||||
|
||||
static inline void
|
||||
device_detach_pasid_table(struct device_domain_info *info,
|
||||
struct pasid_table *pasid_table)
|
||||
{
|
||||
info->pasid_table = NULL;
|
||||
list_del(&info->table);
|
||||
}
|
||||
|
||||
struct pasid_table_opaque {
|
||||
struct pasid_table **pasid_table;
|
||||
int segment;
|
||||
int bus;
|
||||
int devfn;
|
||||
};
|
||||
|
||||
static int search_pasid_table(struct device_domain_info *info, void *opaque)
|
||||
{
|
||||
struct pasid_table_opaque *data = opaque;
|
||||
|
||||
if (info->iommu->segment == data->segment &&
|
||||
info->bus == data->bus &&
|
||||
info->devfn == data->devfn &&
|
||||
info->pasid_table) {
|
||||
*data->pasid_table = info->pasid_table;
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_alias_pasid_table(struct pci_dev *pdev, u16 alias, void *opaque)
|
||||
{
|
||||
struct pasid_table_opaque *data = opaque;
|
||||
|
||||
data->segment = pci_domain_nr(pdev->bus);
|
||||
data->bus = PCI_BUS_NUM(alias);
|
||||
data->devfn = alias & 0xff;
|
||||
|
||||
return for_each_device_domain(&search_pasid_table, data);
|
||||
}
|
||||
|
||||
/*
|
||||
* Allocate a pasid table for @dev. It should be called in a
|
||||
@@ -143,28 +95,18 @@ int intel_pasid_alloc_table(struct device *dev)
|
||||
{
|
||||
struct device_domain_info *info;
|
||||
struct pasid_table *pasid_table;
|
||||
struct pasid_table_opaque data;
|
||||
struct page *pages;
|
||||
u32 max_pasid = 0;
|
||||
int ret, order;
|
||||
int size;
|
||||
int order, size;
|
||||
|
||||
might_sleep();
|
||||
info = dev_iommu_priv_get(dev);
|
||||
if (WARN_ON(!info || !dev_is_pci(dev) || info->pasid_table))
|
||||
return -EINVAL;
|
||||
|
||||
/* DMA alias device already has a pasid table, use it: */
|
||||
data.pasid_table = &pasid_table;
|
||||
ret = pci_for_each_dma_alias(to_pci_dev(dev),
|
||||
&get_alias_pasid_table, &data);
|
||||
if (ret)
|
||||
goto attach_out;
|
||||
|
||||
pasid_table = kzalloc(sizeof(*pasid_table), GFP_KERNEL);
|
||||
if (!pasid_table)
|
||||
return -ENOMEM;
|
||||
INIT_LIST_HEAD(&pasid_table->dev);
|
||||
|
||||
if (info->pasid_supported)
|
||||
max_pasid = min_t(u32, pci_max_pasids(to_pci_dev(dev)),
|
||||
@@ -182,9 +124,7 @@ int intel_pasid_alloc_table(struct device *dev)
|
||||
pasid_table->table = page_address(pages);
|
||||
pasid_table->order = order;
|
||||
pasid_table->max_pasid = 1 << (order + PAGE_SHIFT + 3);
|
||||
|
||||
attach_out:
|
||||
device_attach_pasid_table(info, pasid_table);
|
||||
info->pasid_table = pasid_table;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -202,10 +142,7 @@ void intel_pasid_free_table(struct device *dev)
|
||||
return;
|
||||
|
||||
pasid_table = info->pasid_table;
|
||||
device_detach_pasid_table(info, pasid_table);
|
||||
|
||||
if (!list_empty(&pasid_table->dev))
|
||||
return;
|
||||
info->pasid_table = NULL;
|
||||
|
||||
/* Free scalable mode PASID directory tables: */
|
||||
dir = pasid_table->table;
|
||||
|
||||
@@ -74,7 +74,6 @@ struct pasid_table {
|
||||
void *table; /* pasid table pointer */
|
||||
int order; /* page order of pasid table */
|
||||
u32 max_pasid; /* max pasid */
|
||||
struct list_head dev; /* device list */
|
||||
};
|
||||
|
||||
/* Get PRESENT bit of a PASID directory entry. */
|
||||
|
||||
@@ -3465,7 +3465,8 @@ static const struct pci_device_id nvme_id_table[] = {
|
||||
{ PCI_DEVICE(0x1987, 0x5012), /* Phison E12 */
|
||||
.driver_data = NVME_QUIRK_BOGUS_NID, },
|
||||
{ PCI_DEVICE(0x1987, 0x5016), /* Phison E16 */
|
||||
.driver_data = NVME_QUIRK_IGNORE_DEV_SUBNQN, },
|
||||
.driver_data = NVME_QUIRK_IGNORE_DEV_SUBNQN |
|
||||
NVME_QUIRK_BOGUS_NID, },
|
||||
{ PCI_DEVICE(0x1b4b, 0x1092), /* Lexar 256 GB SSD */
|
||||
.driver_data = NVME_QUIRK_NO_NS_DESC_LIST |
|
||||
NVME_QUIRK_IGNORE_DEV_SUBNQN, },
|
||||
|
||||
@@ -69,7 +69,7 @@ TRACE_EVENT(nvme_setup_cmd,
|
||||
__entry->metadata = !!blk_integrity_rq(req);
|
||||
__entry->fctype = cmd->fabrics.fctype;
|
||||
__assign_disk_name(__entry->disk, req->q->disk);
|
||||
memcpy(__entry->cdw10, &cmd->common.cdw10,
|
||||
memcpy(__entry->cdw10, &cmd->common.cdws,
|
||||
sizeof(__entry->cdw10));
|
||||
),
|
||||
TP_printk("nvme%d: %sqid=%d, cmdid=%u, nsid=%u, flags=0x%x, meta=0x%x, cmd=(%s %s)",
|
||||
|
||||
@@ -2469,6 +2469,11 @@ static int fbcon_set_font(struct vc_data *vc, struct console_font *font,
|
||||
if (charcount != 256 && charcount != 512)
|
||||
return -EINVAL;
|
||||
|
||||
/* font bigger than screen resolution ? */
|
||||
if (w > FBCON_SWAP(info->var.rotate, info->var.xres, info->var.yres) ||
|
||||
h > FBCON_SWAP(info->var.rotate, info->var.yres, info->var.xres))
|
||||
return -EINVAL;
|
||||
|
||||
/* Make sure drawing engine can handle the font */
|
||||
if (!(info->pixmap.blit_x & (1 << (font->width - 1))) ||
|
||||
!(info->pixmap.blit_y & (1 << (font->height - 1))))
|
||||
@@ -2731,6 +2736,34 @@ void fbcon_update_vcs(struct fb_info *info, bool all)
|
||||
}
|
||||
EXPORT_SYMBOL(fbcon_update_vcs);
|
||||
|
||||
/* let fbcon check if it supports a new screen resolution */
|
||||
int fbcon_modechange_possible(struct fb_info *info, struct fb_var_screeninfo *var)
|
||||
{
|
||||
struct fbcon_ops *ops = info->fbcon_par;
|
||||
struct vc_data *vc;
|
||||
unsigned int i;
|
||||
|
||||
WARN_CONSOLE_UNLOCKED();
|
||||
|
||||
if (!ops)
|
||||
return 0;
|
||||
|
||||
/* prevent setting a screen size which is smaller than font size */
|
||||
for (i = first_fb_vc; i <= last_fb_vc; i++) {
|
||||
vc = vc_cons[i].d;
|
||||
if (!vc || vc->vc_mode != KD_TEXT ||
|
||||
fbcon_info_from_console(i) != info)
|
||||
continue;
|
||||
|
||||
if (vc->vc_font.width > FBCON_SWAP(var->rotate, var->xres, var->yres) ||
|
||||
vc->vc_font.height > FBCON_SWAP(var->rotate, var->yres, var->xres))
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(fbcon_modechange_possible);
|
||||
|
||||
int fbcon_mode_deleted(struct fb_info *info,
|
||||
struct fb_videomode *mode)
|
||||
{
|
||||
|
||||
@@ -511,7 +511,7 @@ static int fb_show_logo_line(struct fb_info *info, int rotate,
|
||||
|
||||
while (n && (n * (logo->width + 8) - 8 > xres))
|
||||
--n;
|
||||
image.dx = (xres - n * (logo->width + 8) - 8) / 2;
|
||||
image.dx = (xres - (n * (logo->width + 8) - 8)) / 2;
|
||||
image.dy = y ?: (yres - logo->height) / 2;
|
||||
} else {
|
||||
image.dx = 0;
|
||||
@@ -1017,6 +1017,16 @@ fb_set_var(struct fb_info *info, struct fb_var_screeninfo *var)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* verify that virtual resolution >= physical resolution */
|
||||
if (var->xres_virtual < var->xres ||
|
||||
var->yres_virtual < var->yres) {
|
||||
pr_warn("WARNING: fbcon: Driver '%s' missed to adjust virtual screen size (%ux%u vs. %ux%u)\n",
|
||||
info->fix.id,
|
||||
var->xres_virtual, var->yres_virtual,
|
||||
var->xres, var->yres);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if ((var->activate & FB_ACTIVATE_MASK) != FB_ACTIVATE_NOW)
|
||||
return 0;
|
||||
|
||||
@@ -1107,7 +1117,9 @@ static long do_fb_ioctl(struct fb_info *info, unsigned int cmd,
|
||||
return -EFAULT;
|
||||
console_lock();
|
||||
lock_fb_info(info);
|
||||
ret = fb_set_var(info, &var);
|
||||
ret = fbcon_modechange_possible(info, &var);
|
||||
if (!ret)
|
||||
ret = fb_set_var(info, &var);
|
||||
if (!ret)
|
||||
fbcon_update_vcs(info, var.activate & FB_ACTIVATE_ALL);
|
||||
unlock_fb_info(info);
|
||||
|
||||
@@ -21,7 +21,8 @@ static int cachefiles_ondemand_fd_release(struct inode *inode,
|
||||
* anon_fd.
|
||||
*/
|
||||
xas_for_each(&xas, req, ULONG_MAX) {
|
||||
if (req->msg.opcode == CACHEFILES_OP_READ) {
|
||||
if (req->msg.object_id == object_id &&
|
||||
req->msg.opcode == CACHEFILES_OP_READ) {
|
||||
req->error = -EIO;
|
||||
complete(&req->done);
|
||||
xas_store(&xas, NULL);
|
||||
|
||||
@@ -372,17 +372,22 @@ nomem:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline bool fscache_cookie_is_dropped(struct fscache_cookie *cookie)
|
||||
{
|
||||
return READ_ONCE(cookie->state) == FSCACHE_COOKIE_STATE_DROPPED;
|
||||
}
|
||||
|
||||
static void fscache_wait_on_collision(struct fscache_cookie *candidate,
|
||||
struct fscache_cookie *wait_for)
|
||||
{
|
||||
enum fscache_cookie_state *statep = &wait_for->state;
|
||||
|
||||
wait_var_event_timeout(statep, READ_ONCE(*statep) == FSCACHE_COOKIE_STATE_DROPPED,
|
||||
wait_var_event_timeout(statep, fscache_cookie_is_dropped(wait_for),
|
||||
20 * HZ);
|
||||
if (READ_ONCE(*statep) != FSCACHE_COOKIE_STATE_DROPPED) {
|
||||
if (!fscache_cookie_is_dropped(wait_for)) {
|
||||
pr_notice("Potential collision c=%08x old: c=%08x",
|
||||
candidate->debug_id, wait_for->debug_id);
|
||||
wait_var_event(statep, READ_ONCE(*statep) == FSCACHE_COOKIE_STATE_DROPPED);
|
||||
wait_var_event(statep, fscache_cookie_is_dropped(wait_for));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -517,7 +522,14 @@ static void fscache_perform_lookup(struct fscache_cookie *cookie)
|
||||
}
|
||||
|
||||
fscache_see_cookie(cookie, fscache_cookie_see_active);
|
||||
fscache_set_cookie_state(cookie, FSCACHE_COOKIE_STATE_ACTIVE);
|
||||
spin_lock(&cookie->lock);
|
||||
if (test_and_clear_bit(FSCACHE_COOKIE_DO_INVALIDATE, &cookie->flags))
|
||||
__fscache_set_cookie_state(cookie,
|
||||
FSCACHE_COOKIE_STATE_INVALIDATING);
|
||||
else
|
||||
__fscache_set_cookie_state(cookie, FSCACHE_COOKIE_STATE_ACTIVE);
|
||||
spin_unlock(&cookie->lock);
|
||||
wake_up_cookie_state(cookie);
|
||||
trace = fscache_access_lookup_cookie_end;
|
||||
|
||||
out:
|
||||
@@ -752,6 +764,9 @@ again_locked:
|
||||
spin_lock(&cookie->lock);
|
||||
}
|
||||
|
||||
if (test_and_clear_bit(FSCACHE_COOKIE_DO_INVALIDATE, &cookie->flags))
|
||||
fscache_end_cookie_access(cookie, fscache_access_invalidate_cookie_end);
|
||||
|
||||
switch (state) {
|
||||
case FSCACHE_COOKIE_STATE_RELINQUISHING:
|
||||
fscache_see_cookie(cookie, fscache_cookie_see_relinquish);
|
||||
@@ -1048,6 +1063,9 @@ void __fscache_invalidate(struct fscache_cookie *cookie,
|
||||
return;
|
||||
|
||||
case FSCACHE_COOKIE_STATE_LOOKING_UP:
|
||||
__fscache_begin_cookie_access(cookie, fscache_access_invalidate_cookie);
|
||||
set_bit(FSCACHE_COOKIE_DO_INVALIDATE, &cookie->flags);
|
||||
fallthrough;
|
||||
case FSCACHE_COOKIE_STATE_CREATING:
|
||||
spin_unlock(&cookie->lock);
|
||||
_leave(" [look %x]", cookie->inval_counter);
|
||||
|
||||
@@ -143,7 +143,7 @@ static void fscache_wait_on_volume_collision(struct fscache_volume *candidate,
|
||||
{
|
||||
wait_var_event_timeout(&candidate->flags,
|
||||
!fscache_is_acquire_pending(candidate), 20 * HZ);
|
||||
if (!fscache_is_acquire_pending(candidate)) {
|
||||
if (fscache_is_acquire_pending(candidate)) {
|
||||
pr_notice("Potential volume collision new=%08x old=%08x",
|
||||
candidate->debug_id, collidee_debug_id);
|
||||
fscache_stat(&fscache_n_volumes_collision);
|
||||
@@ -182,7 +182,7 @@ static bool fscache_hash_volume(struct fscache_volume *candidate)
|
||||
hlist_bl_add_head(&candidate->hash_link, h);
|
||||
hlist_bl_unlock(h);
|
||||
|
||||
if (test_bit(FSCACHE_VOLUME_ACQUIRE_PENDING, &candidate->flags))
|
||||
if (fscache_is_acquire_pending(candidate))
|
||||
fscache_wait_on_volume_collision(candidate, collidee_debug_id);
|
||||
return true;
|
||||
|
||||
|
||||
@@ -5066,7 +5066,7 @@ static int io_uring_cmd_prep(struct io_kiocb *req,
|
||||
{
|
||||
struct io_uring_cmd *ioucmd = &req->uring_cmd;
|
||||
|
||||
if (sqe->rw_flags)
|
||||
if (sqe->rw_flags || sqe->__pad1)
|
||||
return -EINVAL;
|
||||
ioucmd->cmd = sqe->cmd;
|
||||
ioucmd->cmd_op = READ_ONCE(sqe->cmd_op);
|
||||
|
||||
@@ -145,6 +145,7 @@ extern bool cppc_allow_fast_switch(void);
|
||||
extern int acpi_get_psd_map(unsigned int cpu, struct cppc_cpudata *cpu_data);
|
||||
extern unsigned int cppc_get_transition_latency(int cpu);
|
||||
extern bool cpc_ffh_supported(void);
|
||||
extern bool cpc_supported_by_cpu(void);
|
||||
extern int cpc_read_ffh(int cpunum, struct cpc_reg *reg, u64 *val);
|
||||
extern int cpc_write_ffh(int cpunum, struct cpc_reg *reg, u64 val);
|
||||
#else /* !CONFIG_ACPI_CPPC_LIB */
|
||||
|
||||
@@ -584,7 +584,7 @@ acpi_status acpi_run_osc(acpi_handle handle, struct acpi_osc_context *context);
|
||||
extern bool osc_sb_apei_support_acked;
|
||||
extern bool osc_pc_lpi_support_confirmed;
|
||||
extern bool osc_sb_native_usb4_support_confirmed;
|
||||
extern bool osc_sb_cppc_not_supported;
|
||||
extern bool osc_sb_cppc2_support_acked;
|
||||
extern bool osc_cpc_flexible_adr_space_confirmed;
|
||||
|
||||
/* USB4 Capabilities */
|
||||
|
||||
@@ -15,6 +15,8 @@ void fbcon_new_modelist(struct fb_info *info);
|
||||
void fbcon_get_requirement(struct fb_info *info,
|
||||
struct fb_blit_caps *caps);
|
||||
void fbcon_fb_blanked(struct fb_info *info, int blank);
|
||||
int fbcon_modechange_possible(struct fb_info *info,
|
||||
struct fb_var_screeninfo *var);
|
||||
void fbcon_update_vcs(struct fb_info *info, bool all);
|
||||
void fbcon_remap_all(struct fb_info *info);
|
||||
int fbcon_set_con2fb_map_ioctl(void __user *argp);
|
||||
@@ -33,6 +35,8 @@ static inline void fbcon_new_modelist(struct fb_info *info) {}
|
||||
static inline void fbcon_get_requirement(struct fb_info *info,
|
||||
struct fb_blit_caps *caps) {}
|
||||
static inline void fbcon_fb_blanked(struct fb_info *info, int blank) {}
|
||||
static inline int fbcon_modechange_possible(struct fb_info *info,
|
||||
struct fb_var_screeninfo *var) { return 0; }
|
||||
static inline void fbcon_update_vcs(struct fb_info *info, bool all) {}
|
||||
static inline void fbcon_remap_all(struct fb_info *info) {}
|
||||
static inline int fbcon_set_con2fb_map_ioctl(void __user *argp) { return 0; }
|
||||
|
||||
@@ -130,6 +130,7 @@ struct fscache_cookie {
|
||||
#define FSCACHE_COOKIE_DO_PREP_TO_WRITE 12 /* T if cookie needs write preparation */
|
||||
#define FSCACHE_COOKIE_HAVE_DATA 13 /* T if this cookie has data stored */
|
||||
#define FSCACHE_COOKIE_IS_HASHED 14 /* T if this cookie is hashed */
|
||||
#define FSCACHE_COOKIE_DO_INVALIDATE 15 /* T if cookie needs invalidation */
|
||||
|
||||
enum fscache_cookie_state state;
|
||||
u8 advice; /* FSCACHE_ADV_* */
|
||||
|
||||
@@ -612,7 +612,6 @@ struct intel_iommu {
|
||||
struct device_domain_info {
|
||||
struct list_head link; /* link to domain siblings */
|
||||
struct list_head global; /* link to global list */
|
||||
struct list_head table; /* link to pasid table */
|
||||
u32 segment; /* PCI segment number */
|
||||
u8 bus; /* PCI bus number */
|
||||
u8 devfn; /* PCI devfn number */
|
||||
@@ -729,8 +728,6 @@ extern int dmar_ir_support(void);
|
||||
void *alloc_pgtable_page(int node);
|
||||
void free_pgtable_page(void *vaddr);
|
||||
struct intel_iommu *domain_get_iommu(struct dmar_domain *domain);
|
||||
int for_each_device_domain(int (*fn)(struct device_domain_info *info,
|
||||
void *data), void *data);
|
||||
void iommu_flush_write_buffer(struct intel_iommu *iommu);
|
||||
int intel_iommu_enable_pasid(struct intel_iommu *iommu, struct device *dev);
|
||||
struct intel_iommu *device_to_iommu(struct device *dev, u8 *bus, u8 *devfn);
|
||||
|
||||
@@ -16,7 +16,7 @@ static inline int memregion_alloc(gfp_t gfp)
|
||||
{
|
||||
return -ENOMEM;
|
||||
}
|
||||
void memregion_free(int id)
|
||||
static inline void memregion_free(int id)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -906,12 +906,14 @@ struct nvme_common_command {
|
||||
__le32 cdw2[2];
|
||||
__le64 metadata;
|
||||
union nvme_data_ptr dptr;
|
||||
struct_group(cdws,
|
||||
__le32 cdw10;
|
||||
__le32 cdw11;
|
||||
__le32 cdw12;
|
||||
__le32 cdw13;
|
||||
__le32 cdw14;
|
||||
__le32 cdw15;
|
||||
);
|
||||
};
|
||||
|
||||
struct nvme_rw_command {
|
||||
|
||||
@@ -88,7 +88,7 @@ extern void pm_runtime_get_suppliers(struct device *dev);
|
||||
extern void pm_runtime_put_suppliers(struct device *dev);
|
||||
extern void pm_runtime_new_link(struct device *dev);
|
||||
extern void pm_runtime_drop_link(struct device_link *link);
|
||||
extern void pm_runtime_release_supplier(struct device_link *link, bool check_idle);
|
||||
extern void pm_runtime_release_supplier(struct device_link *link);
|
||||
|
||||
extern int devm_pm_runtime_enable(struct device *dev);
|
||||
|
||||
@@ -314,8 +314,7 @@ static inline void pm_runtime_get_suppliers(struct device *dev) {}
|
||||
static inline void pm_runtime_put_suppliers(struct device *dev) {}
|
||||
static inline void pm_runtime_new_link(struct device *dev) {}
|
||||
static inline void pm_runtime_drop_link(struct device_link *link) {}
|
||||
static inline void pm_runtime_release_supplier(struct device_link *link,
|
||||
bool check_idle) {}
|
||||
static inline void pm_runtime_release_supplier(struct device_link *link) {}
|
||||
|
||||
#endif /* !CONFIG_PM */
|
||||
|
||||
|
||||
@@ -22,7 +22,10 @@ struct io_uring_sqe {
|
||||
union {
|
||||
__u64 off; /* offset into file */
|
||||
__u64 addr2;
|
||||
__u32 cmd_op;
|
||||
struct {
|
||||
__u32 cmd_op;
|
||||
__u32 __pad1;
|
||||
};
|
||||
};
|
||||
union {
|
||||
__u64 addr; /* pointer to buffer or iovecs */
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
#ifndef __LINUX_OF_DISPLAY_TIMING_H
|
||||
#define __LINUX_OF_DISPLAY_TIMING_H
|
||||
|
||||
#include <linux/errno.h>
|
||||
|
||||
struct device_node;
|
||||
struct display_timing;
|
||||
struct display_timings;
|
||||
|
||||
Reference in New Issue
Block a user