diff --git a/0011-kernel-6.0.patch b/0011-kernel-6.0.patch index 2b9df3b..6499fa2 100644 --- a/0011-kernel-6.0.patch +++ b/0011-kernel-6.0.patch @@ -1,151 +1,121 @@ -diff -Naur a/kernel/nv-acpi.c b/kernel/nv-acpi.c ---- a/kernel/nv-acpi.c 2022-10-14 02:26:04.379601051 +0000 -+++ b/kernel/nv-acpi.c 2022-10-14 02:28:07.309332369 +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) - { - /* -@@ -190,8 +237,10 @@ +--- a/kernel/nv-acpi.c 2020-01-01 00:00:00.000000000 +0000 ++++ b/kernel/nv-acpi.c 2020-01-01 00:00:00.000000000 +0000 +@@ -190,9 +190,9 @@ 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(6, 0, 0) - struct list_head *node, *next; +- struct list_head *node, *next; nv_acpi_integer_t device_id = 0; -+#endif int device_counter = 0; ++ acpi_handle handle = NULL; NV_KMEM_CACHE_ALLOC_STACK(sp); -@@ -220,6 +269,7 @@ + if (sp == NULL) +@@ -220,13 +220,12 @@ // 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) +- list_for_each_safe(node, next, &device->children) ++ do { - struct acpi_device *dev = -@@ -261,6 +311,13 @@ +- struct acpi_device *dev = +- list_entry(node, struct acpi_device, node); +- +- if (!dev) +- continue; ++ status = acpi_get_next_object(ACPI_TYPE_DEVICE, device->handle, ++ handle, &handle); ++ if (ACPI_FAILURE(status) || (handle == NULL)) ++ break; + + if (device_counter == NV_MAXNUM_DISPLAY_DEVICES) + { +@@ -237,7 +236,7 @@ + } + + status = +- acpi_evaluate_integer(dev->handle, "_ADR", NULL, &device_id); ++ acpi_evaluate_integer(handle, "_ADR", NULL, &device_id); + if (ACPI_FAILURE(status)) + /* Couldnt query device_id for this device */ + continue; +@@ -256,11 +255,11 @@ + } + + pNvAcpiObject->pNvVideo[device_counter].dev_id = device_id; +- pNvAcpiObject->pNvVideo[device_counter].dev_handle = dev->handle; ++ pNvAcpiObject->pNvVideo[device_counter].dev_handle = handle; + 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 +- } ++ } while (handle != NULL); // arg 0, bits 1:0, 0 = enable events control_argument_0.integer.type = ACPI_TYPE_INTEGER; -@@ -1192,6 +1249,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; -+ 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. - */ -@@ -1207,8 +1289,10 @@ +@@ -1202,16 +1201,15 @@ + ) + { + acpi_status status; +- struct acpi_device *device = NULL; + struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL }; 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(6, 0, 0) - struct list_head *node, *next; +- 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; -@@ -1239,6 +1323,7 @@ ++ acpi_handle handle = NULL; + + if (!nv_acpi_get_device_handle(nv, &dev_handle)) + return RM_ERR_NOT_SUPPORTED; +@@ -1219,16 +1217,6 @@ + if (!dev_handle) + return RM_ERR_INVALID_ARGUMENT; + +-#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 18, 0) +- device = acpi_fetch_acpi_dev(dev_handle); +- status = 0; +-#else +- status = acpi_bus_get_device(dev_handle, &device); +-#endif +- +- if (ACPI_FAILURE(status) || !device) +- return RM_ERR_INVALID_ARGUMENT; +- + if (!NV_MAY_SLEEP()) + { + #if defined(DEBUG) +@@ -1239,15 +1227,15 @@ return RM_ERR_NOT_SUPPORTED; } -+#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 0, 0) - list_for_each_safe(node, next, &device->children) +- list_for_each_safe(node, next, &device->children) ++ while (lcd_dev_handle == NULL) { - struct acpi_device *dev = -@@ -1262,6 +1347,9 @@ +- struct acpi_device *dev = +- list_entry(node, struct acpi_device, node); ++ status = acpi_get_next_object(ACPI_TYPE_DEVICE, dev_handle, ++ handle, &handle); ++ if (ACPI_FAILURE(status) || (handle == NULL)) ++ break; + +- if (!dev) +- continue; ++ status = acpi_evaluate_integer(handle, "_ADR", NULL, &device_id); + +- status = acpi_evaluate_integer(dev->handle, "_ADR", NULL, &device_id); + if (ACPI_FAILURE(status)) + /* Couldnt query device_id for this device */ + continue; +@@ -1256,7 +1244,7 @@ + + if ((device_id == 0x0110) || (device_id == 0x0118) || (device_id == 0x0400)) /* Only for an LCD*/ + { +- lcd_dev_handle = dev->handle; ++ lcd_dev_handle = handle; + nv_printf(NV_DBG_INFO, "NVRM: %s Found LCD: %x\n", __FUNCTION__, device_id); + break; } - - } -+#else -+ acpi_dev_for_each_child(device, nv_acpi_ddc_method_enumerated, &lcd_dev_handle); -+#endif - - if (lcd_dev_handle == NULL) - { diff --git a/PKGBUILD b/PKGBUILD index ae2cbe6..a44cbd8 100644 --- a/PKGBUILD +++ b/PKGBUILD @@ -41,7 +41,7 @@ b2sums=('6538bbec53b10f8d20977f9b462052625742e9709ef06e24cf2e55de5d0c55f1620a4bb 'caedc5651bfd14c02fb677f9c5e87adef298d871c6281b78ce184108310e4243ded82210873014be7fedee0dd6251305fa9bbce0c872b76438e0895ef76109d9' '0266e1baaac9ffbb94d9e916a693b1663d8686b15e970bfc30f7c51f051a0af9267aa5f6a12b68586c69d2e9796a1124488b3997ba4b26db1a5ac10a892f0df2' 'd69c9acbe550d5fccca68ca6a0d5095cbcaf887d2bc43704a8eb85533896692f16701eef07ead297881f596f5502c3105bb5bea77b2dcaf6c4dc2b49941f9f19' - 'a411df83e0166366ecc7b9adfb374168487b6cfac5de0ee4a41f2c24bc234947c16f814b5c50bf36ba08c5b7e69b0c14378194f338bbe3fcae446375651d98b4') + '682a7b8e58d2a008531b7e5179e32c0c71adad673891a1057acd1aa26e410d9d93ff607e46257c6701619621cee1a27e613ec9ae19a580acdd6f68f1c1fdedea') _pkg="NVIDIA-Linux-x86_64-${pkgver}-no-compat32" # default is 'linux' substitute custom name here