mirror of
https://github.com/torvalds/linux.git
synced 2026-08-01 12:11:59 +02:00
Merge 0e0073eb1b ("Merge tag 'hyperv-next-signed-20221009' of git://git.kernel.org/pub/scm/linux/kernel/git/hyperv/linux") into android-mainline
Steps on the way to 6.1-rc1 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: Icf501c4029d2edca6925b30fa59649981bfc64b8
This commit is contained in:
commit
68051b9d57
|
|
@ -38,7 +38,7 @@ static int __init hyperv_init(void)
|
|||
return 0;
|
||||
|
||||
/* Setup the guest ID */
|
||||
guest_id = generate_guest_id(0, LINUX_VERSION_CODE, 0);
|
||||
guest_id = hv_generate_guest_id(LINUX_VERSION_CODE);
|
||||
hv_set_vpreg(HV_REGISTER_GUEST_OSID, guest_id);
|
||||
|
||||
/* Get the features and hints from Hyper-V */
|
||||
|
|
|
|||
|
|
@ -426,7 +426,7 @@ void __init hyperv_init(void)
|
|||
* 1. Register the guest ID
|
||||
* 2. Enable the hypercall and register the hypercall page
|
||||
*/
|
||||
guest_id = generate_guest_id(0, LINUX_VERSION_CODE, 0);
|
||||
guest_id = hv_generate_guest_id(LINUX_VERSION_CODE);
|
||||
wrmsrl(HV_X64_MSR_GUEST_OS_ID, guest_id);
|
||||
|
||||
/* Hyper-V requires to write guest os id via ghcb in SNP IVM. */
|
||||
|
|
@ -459,13 +459,13 @@ void __init hyperv_init(void)
|
|||
wrmsrl(HV_X64_MSR_HYPERCALL, hypercall_msr.as_uint64);
|
||||
|
||||
pg = vmalloc_to_page(hv_hypercall_pg);
|
||||
dst = kmap(pg);
|
||||
dst = kmap_local_page(pg);
|
||||
src = memremap(hypercall_msr.guest_physical_address << PAGE_SHIFT, PAGE_SIZE,
|
||||
MEMREMAP_WB);
|
||||
BUG_ON(!(src && dst));
|
||||
memcpy(dst, src, HV_HYP_PAGE_SIZE);
|
||||
memunmap(src);
|
||||
kunmap(pg);
|
||||
kunmap_local(dst);
|
||||
} else {
|
||||
hypercall_msr.guest_physical_address = vmalloc_to_pfn(hv_hypercall_pg);
|
||||
wrmsrl(HV_X64_MSR_HYPERCALL, hypercall_msr.as_uint64);
|
||||
|
|
|
|||
|
|
@ -142,8 +142,6 @@ static int hyperv_vmbus_probe(struct hv_device *hdev,
|
|||
if (ret)
|
||||
drm_warn(dev, "Failed to update vram location.\n");
|
||||
|
||||
hv->dirt_needed = true;
|
||||
|
||||
ret = hyperv_mode_config_init(hv);
|
||||
if (ret)
|
||||
goto err_free_mmio;
|
||||
|
|
|
|||
|
|
@ -208,7 +208,7 @@ static inline int hyperv_sendpacket(struct hv_device *hdev, struct synthvid_msg
|
|||
VM_PKT_DATA_INBAND, 0);
|
||||
|
||||
if (ret)
|
||||
drm_err(&hv->dev, "Unable to send packet via vmbus\n");
|
||||
drm_err_ratelimited(&hv->dev, "Unable to send packet via vmbus; error %d\n", ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -431,34 +431,29 @@ struct vmbus_channel *relid2channel(u32 relid)
|
|||
void vmbus_on_event(unsigned long data)
|
||||
{
|
||||
struct vmbus_channel *channel = (void *) data;
|
||||
unsigned long time_limit = jiffies + 2;
|
||||
void (*callback_fn)(void *context);
|
||||
|
||||
trace_vmbus_on_event(channel);
|
||||
|
||||
hv_debug_delay_test(channel, INTERRUPT_DELAY);
|
||||
do {
|
||||
void (*callback_fn)(void *);
|
||||
|
||||
/* A channel once created is persistent even when
|
||||
* there is no driver handling the device. An
|
||||
* unloading driver sets the onchannel_callback to NULL.
|
||||
*/
|
||||
callback_fn = READ_ONCE(channel->onchannel_callback);
|
||||
if (unlikely(callback_fn == NULL))
|
||||
return;
|
||||
/* A channel once created is persistent even when
|
||||
* there is no driver handling the device. An
|
||||
* unloading driver sets the onchannel_callback to NULL.
|
||||
*/
|
||||
callback_fn = READ_ONCE(channel->onchannel_callback);
|
||||
if (unlikely(!callback_fn))
|
||||
return;
|
||||
|
||||
(*callback_fn)(channel->channel_callback_context);
|
||||
(*callback_fn)(channel->channel_callback_context);
|
||||
|
||||
if (channel->callback_mode != HV_CALL_BATCHED)
|
||||
return;
|
||||
if (channel->callback_mode != HV_CALL_BATCHED)
|
||||
return;
|
||||
|
||||
if (likely(hv_end_read(&channel->inbound) == 0))
|
||||
return;
|
||||
if (likely(hv_end_read(&channel->inbound) == 0))
|
||||
return;
|
||||
|
||||
hv_begin_read(&channel->inbound);
|
||||
} while (likely(time_before(jiffies, time_limit)));
|
||||
|
||||
/* The time limit (2 jiffies) has been reached */
|
||||
hv_begin_read(&channel->inbound);
|
||||
tasklet_schedule(&channel->callback_event);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -46,8 +46,6 @@ struct vmbus_dynid {
|
|||
|
||||
static struct acpi_device *hv_acpi_dev;
|
||||
|
||||
static struct completion probe_event;
|
||||
|
||||
static int hyperv_cpuhp_online;
|
||||
|
||||
static void *hv_panic_page;
|
||||
|
|
@ -1132,7 +1130,8 @@ void vmbus_on_msg_dpc(unsigned long data)
|
|||
return;
|
||||
|
||||
INIT_WORK(&ctx->work, vmbus_onmessage_work);
|
||||
memcpy(&ctx->msg, &msg_copy, sizeof(msg->header) + payload_size);
|
||||
ctx->msg.header = msg_copy.header;
|
||||
memcpy(&ctx->msg.payload, msg_copy.u.payload, payload_size);
|
||||
|
||||
/*
|
||||
* The host can generate a rescind message while we
|
||||
|
|
@ -1573,7 +1572,7 @@ static int vmbus_bus_init(void)
|
|||
}
|
||||
|
||||
/**
|
||||
* __vmbus_child_driver_register() - Register a vmbus's driver
|
||||
* __vmbus_driver_register() - Register a vmbus's driver
|
||||
* @hv_driver: Pointer to driver structure you want to register
|
||||
* @owner: owner module of the drv
|
||||
* @mod_name: module name string
|
||||
|
|
@ -2052,7 +2051,7 @@ struct hv_device *vmbus_device_create(const guid_t *type,
|
|||
child_device_obj->channel = channel;
|
||||
guid_copy(&child_device_obj->dev_type, type);
|
||||
guid_copy(&child_device_obj->dev_instance, instance);
|
||||
child_device_obj->vendor_id = 0x1414; /* MSFT vendor ID */
|
||||
child_device_obj->vendor_id = PCI_VENDOR_ID_MICROSOFT;
|
||||
|
||||
return child_device_obj;
|
||||
}
|
||||
|
|
@ -2468,7 +2467,6 @@ static int vmbus_acpi_add(struct acpi_device *device)
|
|||
ret_val = 0;
|
||||
|
||||
acpi_walk_err:
|
||||
complete(&probe_event);
|
||||
if (ret_val)
|
||||
vmbus_acpi_remove(device);
|
||||
return ret_val;
|
||||
|
|
@ -2647,6 +2645,7 @@ static struct acpi_driver vmbus_acpi_driver = {
|
|||
.remove = vmbus_acpi_remove,
|
||||
},
|
||||
.drv.pm = &vmbus_bus_pm,
|
||||
.drv.probe_type = PROBE_FORCE_SYNCHRONOUS,
|
||||
};
|
||||
|
||||
static void hv_kexec_handler(void)
|
||||
|
|
@ -2719,7 +2718,7 @@ static struct syscore_ops hv_synic_syscore_ops = {
|
|||
|
||||
static int __init hv_acpi_init(void)
|
||||
{
|
||||
int ret, t;
|
||||
int ret;
|
||||
|
||||
if (!hv_is_hyperv_initialized())
|
||||
return -ENODEV;
|
||||
|
|
@ -2727,8 +2726,6 @@ static int __init hv_acpi_init(void)
|
|||
if (hv_root_partition)
|
||||
return 0;
|
||||
|
||||
init_completion(&probe_event);
|
||||
|
||||
/*
|
||||
* Get ACPI resources first.
|
||||
*/
|
||||
|
|
@ -2737,9 +2734,8 @@ static int __init hv_acpi_init(void)
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
t = wait_for_completion_timeout(&probe_event, 5*HZ);
|
||||
if (t == 0) {
|
||||
ret = -ETIMEDOUT;
|
||||
if (!hv_acpi_dev) {
|
||||
ret = -ENODEV;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -60,6 +60,9 @@
|
|||
#define VMSTOR_PROTO_VERSION_WIN8_1 VMSTOR_PROTO_VERSION(6, 0)
|
||||
#define VMSTOR_PROTO_VERSION_WIN10 VMSTOR_PROTO_VERSION(6, 2)
|
||||
|
||||
/* channel callback timeout in ms */
|
||||
#define CALLBACK_TIMEOUT 2
|
||||
|
||||
/* Packet structure describing virtual storage requests. */
|
||||
enum vstor_packet_operation {
|
||||
VSTOR_OPERATION_COMPLETE_IO = 1,
|
||||
|
|
@ -1204,6 +1207,7 @@ static void storvsc_on_channel_callback(void *context)
|
|||
struct hv_device *device;
|
||||
struct storvsc_device *stor_device;
|
||||
struct Scsi_Host *shost;
|
||||
unsigned long time_limit = jiffies + msecs_to_jiffies(CALLBACK_TIMEOUT);
|
||||
|
||||
if (channel->primary_channel != NULL)
|
||||
device = channel->primary_channel->device_obj;
|
||||
|
|
@ -1224,6 +1228,11 @@ static void storvsc_on_channel_callback(void *context)
|
|||
u32 minlen = rqst_id ? sizeof(struct vstor_packet) :
|
||||
sizeof(enum vstor_packet_operation);
|
||||
|
||||
if (unlikely(time_after(jiffies, time_limit))) {
|
||||
hv_pkt_iter_close(channel);
|
||||
return;
|
||||
}
|
||||
|
||||
if (pktlen < minlen) {
|
||||
dev_err(&device->device,
|
||||
"Invalid pkt: id=%llu, len=%u, minlen=%u\n",
|
||||
|
|
@ -2059,7 +2068,7 @@ static int storvsc_probe(struct hv_device *device,
|
|||
err_out2:
|
||||
/*
|
||||
* Once we have connected with the host, we would need to
|
||||
* to invoke storvsc_dev_remove() to rollback this state and
|
||||
* invoke storvsc_dev_remove() to rollback this state and
|
||||
* this call also frees up the stor_device; hence the jump around
|
||||
* err_out1 label.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -52,7 +52,7 @@ obj-$(CONFIG_DA9062_THERMAL) += da9062-thermal.o
|
|||
obj-y += intel/
|
||||
obj-$(CONFIG_TI_SOC_THERMAL) += ti-soc-thermal/
|
||||
obj-y += st/
|
||||
obj-$(CONFIG_QCOM_TSENS) += qcom/
|
||||
obj-y += qcom/
|
||||
obj-y += tegra/
|
||||
obj-$(CONFIG_HISI_THERMAL) += hisi_thermal.o
|
||||
obj-$(CONFIG_MTK_THERMAL) += mtk_thermal.o
|
||||
|
|
|
|||
|
|
@ -76,59 +76,55 @@ static const struct thermal_zone_device_ops imx_sc_thermal_ops = {
|
|||
|
||||
static int imx_sc_thermal_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device_node *np, *child, *sensor_np;
|
||||
struct imx_sc_sensor *sensor;
|
||||
int ret;
|
||||
const int *resource_id;
|
||||
int i, ret;
|
||||
|
||||
ret = imx_scu_get_handle(&thermal_ipc_handle);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
np = of_find_node_by_name(NULL, "thermal-zones");
|
||||
if (!np)
|
||||
return -ENODEV;
|
||||
resource_id = of_device_get_match_data(&pdev->dev);
|
||||
if (!resource_id)
|
||||
return -EINVAL;
|
||||
|
||||
sensor_np = of_node_get(pdev->dev.of_node);
|
||||
for (i = 0; resource_id[i] > 0; i++) {
|
||||
|
||||
for_each_available_child_of_node(np, child) {
|
||||
sensor = devm_kzalloc(&pdev->dev, sizeof(*sensor), GFP_KERNEL);
|
||||
if (!sensor) {
|
||||
of_node_put(child);
|
||||
ret = -ENOMEM;
|
||||
goto put_node;
|
||||
}
|
||||
if (!sensor)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = thermal_zone_of_get_sensor_id(child,
|
||||
sensor_np,
|
||||
&sensor->resource_id);
|
||||
if (ret < 0) {
|
||||
dev_err(&pdev->dev,
|
||||
"failed to get valid sensor resource id: %d\n",
|
||||
ret);
|
||||
of_node_put(child);
|
||||
break;
|
||||
}
|
||||
sensor->resource_id = resource_id[i];
|
||||
|
||||
sensor->tzd = devm_thermal_of_zone_register(&pdev->dev,
|
||||
sensor->resource_id,
|
||||
sensor,
|
||||
&imx_sc_thermal_ops);
|
||||
sensor->tzd = devm_thermal_of_zone_register(&pdev->dev, sensor->resource_id,
|
||||
sensor, &imx_sc_thermal_ops);
|
||||
if (IS_ERR(sensor->tzd)) {
|
||||
dev_err(&pdev->dev, "failed to register thermal zone\n");
|
||||
/*
|
||||
* Save the error value before freeing the
|
||||
* sensor pointer, otherwise we endup with a
|
||||
* use-after-free error
|
||||
*/
|
||||
ret = PTR_ERR(sensor->tzd);
|
||||
of_node_put(child);
|
||||
break;
|
||||
|
||||
devm_kfree(&pdev->dev, sensor);
|
||||
|
||||
/*
|
||||
* The thermal framework notifies us there is
|
||||
* no thermal zone description for such a
|
||||
* sensor id
|
||||
*/
|
||||
if (ret == -ENODEV)
|
||||
continue;
|
||||
|
||||
dev_err(&pdev->dev, "failed to register thermal zone\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (devm_thermal_add_hwmon_sysfs(sensor->tzd))
|
||||
dev_warn(&pdev->dev, "failed to add hwmon sysfs attributes\n");
|
||||
}
|
||||
|
||||
put_node:
|
||||
of_node_put(sensor_np);
|
||||
of_node_put(np);
|
||||
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int imx_sc_thermal_remove(struct platform_device *pdev)
|
||||
|
|
@ -136,8 +132,10 @@ static int imx_sc_thermal_remove(struct platform_device *pdev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int imx_sc_sensors[] = { IMX_SC_R_SYSTEM, IMX_SC_R_PMIC_0, -1 };
|
||||
|
||||
static const struct of_device_id imx_sc_thermal_table[] = {
|
||||
{ .compatible = "fsl,imx-sc-thermal", },
|
||||
{ .compatible = "fsl,imx-sc-thermal", .data = imx_sc_sensors },
|
||||
{}
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, imx_sc_thermal_table);
|
||||
|
|
|
|||
|
|
@ -604,7 +604,7 @@ static const struct tsens_ops ops_8939 = {
|
|||
struct tsens_plat_data data_8939 = {
|
||||
.num_sensors = 10,
|
||||
.ops = &ops_8939,
|
||||
.hw_ids = (unsigned int []){ 0, 1, 2, 4, 5, 6, 7, 8, 9, 10 },
|
||||
.hw_ids = (unsigned int []){ 0, 1, 2, 3, 5, 6, 7, 8, 9, 10 },
|
||||
|
||||
.feat = &tsens_v0_1_feat,
|
||||
.fields = tsens_v0_1_regfields,
|
||||
|
|
|
|||
|
|
@ -316,7 +316,7 @@ static int rcar_thermal_get_trip_temp(struct thermal_zone_device *zone,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static struct thermal_zone_device_ops rcar_thermal_zone_of_ops = {
|
||||
static const struct thermal_zone_device_ops rcar_thermal_zone_of_ops = {
|
||||
.get_temp = rcar_thermal_get_temp,
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -1186,7 +1186,7 @@ thermal_zone_device_register_with_trips(const char *type, struct thermal_trip *t
|
|||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
if (type && strlen(type) >= THERMAL_NAME_LENGTH) {
|
||||
if (strlen(type) >= THERMAL_NAME_LENGTH) {
|
||||
pr_err("Thermal zone name (%s) too long, should be under %d chars\n",
|
||||
type, THERMAL_NAME_LENGTH);
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
|
|
|||
|
|
@ -130,50 +130,6 @@ static int of_thermal_get_crit_temp(struct thermal_zone_device *tz,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
/**
|
||||
* thermal_zone_of_get_sensor_id - get sensor ID from a DT thermal zone
|
||||
* @tz_np: a valid thermal zone device node.
|
||||
* @sensor_np: a sensor node of a valid sensor device.
|
||||
* @id: the sensor ID returned if success.
|
||||
*
|
||||
* This function will get sensor ID from a given thermal zone node and
|
||||
* the sensor node must match the temperature provider @sensor_np.
|
||||
*
|
||||
* Return: 0 on success, proper error code otherwise.
|
||||
*/
|
||||
|
||||
int thermal_zone_of_get_sensor_id(struct device_node *tz_np,
|
||||
struct device_node *sensor_np,
|
||||
u32 *id)
|
||||
{
|
||||
struct of_phandle_args sensor_specs;
|
||||
int ret;
|
||||
|
||||
ret = of_parse_phandle_with_args(tz_np,
|
||||
"thermal-sensors",
|
||||
"#thermal-sensor-cells",
|
||||
0,
|
||||
&sensor_specs);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (sensor_specs.np != sensor_np) {
|
||||
of_node_put(sensor_specs.np);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (sensor_specs.args_count > 1)
|
||||
pr_warn("%pOFn: too many cells in sensor specifier %d\n",
|
||||
sensor_specs.np, sensor_specs.args_count);
|
||||
|
||||
*id = sensor_specs.args_count ? sensor_specs.args[0] : 0;
|
||||
|
||||
of_node_put(sensor_specs.np);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(thermal_zone_of_get_sensor_id);
|
||||
|
||||
/*** functions parsing device tree nodes ***/
|
||||
|
||||
static int of_find_trip_id(struct device_node *np, struct device_node *trip)
|
||||
|
|
|
|||
|
|
@ -105,15 +105,12 @@ static inline u64 hv_do_rep_hypercall(u16 code, u16 rep_count, u16 varhead_size,
|
|||
}
|
||||
|
||||
/* Generate the guest OS identifier as described in the Hyper-V TLFS */
|
||||
static inline __u64 generate_guest_id(__u64 d_info1, __u64 kernel_version,
|
||||
__u64 d_info2)
|
||||
static inline u64 hv_generate_guest_id(u64 kernel_version)
|
||||
{
|
||||
__u64 guest_id = 0;
|
||||
u64 guest_id;
|
||||
|
||||
guest_id = (((__u64)HV_LINUX_VENDOR_ID) << 48);
|
||||
guest_id |= (d_info1 << 48);
|
||||
guest_id = (((u64)HV_LINUX_VENDOR_ID) << 48);
|
||||
guest_id |= (kernel_version << 16);
|
||||
guest_id |= d_info2;
|
||||
|
||||
return guest_id;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -308,9 +308,6 @@ void devm_thermal_of_zone_unregister(struct device *dev, struct thermal_zone_dev
|
|||
|
||||
void thermal_of_zone_unregister(struct thermal_zone_device *tz);
|
||||
|
||||
int thermal_zone_of_get_sensor_id(struct device_node *tz_np,
|
||||
struct device_node *sensor_np,
|
||||
u32 *id);
|
||||
#else
|
||||
static inline
|
||||
struct thermal_zone_device *thermal_of_zone_register(struct device_node *sensor, int id, void *data,
|
||||
|
|
@ -334,13 +331,6 @@ static inline void devm_thermal_of_zone_unregister(struct device *dev,
|
|||
struct thermal_zone_device *tz)
|
||||
{
|
||||
}
|
||||
|
||||
static inline int thermal_zone_of_get_sensor_id(struct device_node *tz_np,
|
||||
struct device_node *sensor_np,
|
||||
u32 *id)
|
||||
{
|
||||
return -ENOENT;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_THERMAL
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user