mirror of
https://github.com/archlinux-jerry/nvidia-340xx
synced 2024-11-27 18:10:40 +08:00
130 lines
3.8 KiB
Diff
130 lines
3.8 KiB
Diff
diff -Naur a/kernel/nv-acpi.c b/kernel/nv-acpi.c
|
|
--- a/kernel/nv-acpi.c 2022-10-13 03:30:02.415728837 +0000
|
|
+++ b/kernel/nv-acpi.c 2022-10-13 03:30:02.429062177 +0000
|
|
@@ -178,6 +178,53 @@
|
|
return 0;
|
|
}
|
|
|
|
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 0, 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)
|
|
{
|
|
/*
|
|
@@ -219,7 +266,7 @@
|
|
pNvAcpiObject->sp = sp;
|
|
|
|
// grab handles to all the important nodes representing devices
|
|
-
|
|
+#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 0, 0)
|
|
list_for_each_safe(node, next, &device->children)
|
|
{
|
|
struct acpi_device *dev =
|
|
@@ -261,6 +308,13 @@
|
|
device_counter++;
|
|
|
|
}
|
|
+#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;
|
|
@@ -1192,6 +1246,31 @@
|
|
return status;
|
|
}
|
|
|
|
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)
|
|
+static int nv_acpi_ddc_method_enumerated(struct acpi_device *dev, void *data)
|
|
+{
|
|
+ acpi_handle *lcd_dev_handle = data;
|
|
+ acpi_status status = -1;
|
|
+ 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.
|
|
*/
|
|
@@ -1239,6 +1318,7 @@
|
|
return RM_ERR_NOT_SUPPORTED;
|
|
}
|
|
|
|
+#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 0, 0)
|
|
list_for_each_safe(node, next, &device->children)
|
|
{
|
|
struct acpi_device *dev =
|
|
@@ -1262,6 +1342,9 @@
|
|
}
|
|
|
|
}
|
|
+#else
|
|
+ acpi_dev_for_each_child(device, nv_acpi_ddc_method_enumerated, &lcd_dev_handle);
|
|
+#endif
|
|
|
|
if (lcd_dev_handle == NULL)
|
|
{
|