File 0022-kernel-6.0-opensusedit.patch of Package x11-video-nvidiaG02
diff -ruN NVIDIA-Linux-x86_64-304.137-no-compat32p2/kernel/nv-acpi.c NVIDIA-Linux-x86_64-304.137-no-compat32p1/kernel/nv-acpi.c
--- NVIDIA-Linux-x86_64-304.137-no-compat32p2/nv-acpi.c 2022-10-11 18:32:25.806972254 -0300
+++ NVIDIA-Linux-x86_64-304.137-no-compat32p1/nv-acpi.c 2022-10-17 20:44:08.497414745 -0300
@@ -175,6 +175,53 @@
return 0;
}
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 14, 0)
+static struct nv_acpi_add_enumerated_data {
+ nv_acpi_t *object;
+ int *counter;
+};
+static int nv_acpi_add_enumerated(struct acpi_device *dev, void *data)
+{
+ struct nv_acpi_add_enumerated_data *rcvd_data = data;
+ nv_acpi_t *pNvAcpiObject = rcvd_data->object;
+ int *device_counter = rcvd_data->counter;
+ acpi_status status = -1;
+ nv_acpi_integer_t device_id = 0;
+ if (!dev)
+ return 0;
+ if (*device_counter == NV_MAXNUM_DISPLAY_DEVICES) {
+ nv_printf(NV_DBG_ERRORS,
+ "NVRM: nv_acpi_add: Total number of devices cannot exceed %d\n",
+ NV_MAXNUM_DISPLAY_DEVICES);
+ return 1;
+ }
+ status =
+ acpi_evaluate_integer(dev->handle, "_ADR", NULL, &device_id);
+ if (ACPI_FAILURE(status))
+ /* Couldnt query device_id for this device */
+ return 0;
+
+ device_id = (device_id & 0xffff);
+
+ if ((device_id != 0x100) && /* Not a known CRT device-id */
+ (device_id != 0x200) && /* Not a known TV device-id */
+ (device_id != 0x0110) && (device_id != 0x0118) && (device_id != 0x0400) && /* Not an LCD*/
+ (device_id != 0x0111) && (device_id != 0x0120) && (device_id != 0x0300)) /* Not a known DVI device-id */
+ {
+ /* This isnt a known device Id.
+ Do default switching on this system. */
+ pNvAcpiObject->default_display_mask = 1;
+ return 1;
+ }
+
+ pNvAcpiObject->pNvVideo[*device_counter].dev_id = device_id;
+ pNvAcpiObject->pNvVideo[*device_counter].dev_handle = dev->handle;
+
+ (*device_counter)++;
+ return 0;
+}
+#endif
+
static int nv_acpi_add(struct acpi_device *device)
{
/*
@@ -187,8 +234,10 @@
union acpi_object control_argument_0 = { ACPI_TYPE_INTEGER };
struct acpi_object_list control_argument_list = { 0, NULL };
nv_stack_t *sp = NULL;
+#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 14, 0)
struct list_head *node, *next;
nv_acpi_integer_t device_id = 0;
+#endif
int device_counter = 0;
NV_KMEM_CACHE_ALLOC_STACK(sp);
@@ -217,6 +266,7 @@
// grab handles to all the important nodes representing devices
+#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 14, 0)
list_for_each_safe(node, next, &device->children)
{
struct acpi_device *dev =
@@ -259,6 +309,14 @@
}
+#else
+ struct nv_acpi_add_enumerated_data data = {
+ .object = pNvAcpiObject,
+ .counter = &device_counter,
+ };
+ acpi_dev_for_each_child(device, nv_acpi_add_enumerated, &data);
+#endif
+
// arg 0, bits 1:0, 0 = enable events
control_argument_0.integer.type = ACPI_TYPE_INTEGER;
control_argument_0.integer.value = 0x0;
@@ -1119,6 +1177,31 @@
return RM_OK;
}
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 14, 0)
+static int nv_acpi_ddc_method_enumerated(struct acpi_device *dev, void *data)
+{
+ acpi_handle *lcd_dev_handle = data;
+ acpi_status status;
+ nv_acpi_integer_t device_id = 0;
+ if (!dev)
+ return 0;
+ status = acpi_evaluate_integer(dev->handle, "_ADR", NULL, &device_id);
+ if (ACPI_FAILURE(status))
+ /* Couldnt query device_id for this device */
+ return 0;
+
+ device_id = (device_id & 0xffff);
+
+ if ((device_id == 0x0110) || (device_id == 0x0118) || (device_id == 0x0400)) /* Only for an LCD*/
+ {
+ *lcd_dev_handle = dev->handle;
+ nv_printf(NV_DBG_INFO, "NVRM: %s Found LCD: %x\n", __FUNCTION__, device_id);
+ return 1;
+ }
+ return 0;
+}
+#endif
+
/*
* This function executes a _DDC ACPI method.
*/
@@ -1134,8 +1217,10 @@
union acpi_object *ddc;
union acpi_object ddc_arg0 = { ACPI_TYPE_INTEGER };
struct acpi_object_list input = { 1, &ddc_arg0 };
+#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 14, 0)
struct list_head *node, *next;
nv_acpi_integer_t device_id = 0;
+#endif
NvU32 i;
acpi_handle dev_handle = NULL;
acpi_handle lcd_dev_handle = NULL;
@@ -1166,6 +1251,7 @@
return RM_ERR_NOT_SUPPORTED;
}
+#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 14, 0)
list_for_each_safe(node, next, &device->children)
{
struct acpi_device *dev =
@@ -1190,6 +1276,10 @@
}
+#else
+ acpi_dev_for_each_child(device, nv_acpi_ddc_method_enumerated, &lcd_dev_handle);
+#endif
+
if (lcd_dev_handle == NULL)
{
nv_printf(NV_DBG_INFO, "NVRM: %s LCD not found\n", __FUNCTION__);