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) {