This is totally fucked up code, but if you like hazard... I mean that I really just called some random ACPI (aml) methods not knowing what they should do. Additionally this code is for my laptop. I have GEFORCE 620M GPU, so I added this to pcidevs. Another thing is that patched code recognizes my GPU device through ACPI name "\\_SB_.PCI0.PEG0.PEGP". I have discovered name when I was using Linux kernel's module called acpi_call. Other laptops may have differently named GPUs.
You use this at your own risk and you must *not* report bugs to Project when using patched kernel. File: GENERIC Status: Locally Modified Working revision: 1.427 Repository revision: 1.427 /cvs/src/sys/arch/amd64/conf/GENERIC,v Commit Identifier: xNzAQvg5oqM2b0pn File: acpi.c Status: Locally Modified Working revision: 1.313 Repository revision: 1.313 /cvs/src/sys/dev/acpi/acpi.c,v Commit Identifier: h0GHFDGWnEdswfbK File: dsdt.c Status: Locally Modified Working revision: 1.223 Repository revision: 1.223 /cvs/src/sys/dev/acpi/dsdt.c,v Commit Identifier: SBTJg3diM8lXHXRE File: files.pci Status: Locally Modified Working revision: 1.324 Repository revision: 1.324 /cvs/src/sys/dev/pci/files.pci,v Commit Identifier: aeD3LK9Qomrjecge File: pcidevs Status: Locally Modified Working revision: 1.1802 Repository revision: 1.1802 /cvs/src/sys/dev/pci/pcidevs,v Commit Identifier: ZupaPoe9OBu6iKll File: pcidevs.h Status: Locally Modified Working revision: 1.1796 Repository revision: 1.1796 /cvs/src/sys/dev/pci/pcidevs.h,v Commit Identifier: Z3aUcOQiFLoINK6d File: pcidevs_data.h Status: Locally Modified Working revision: 1.1791 Repository revision: 1.1791 /cvs/src/sys/dev/pci/pcidevs_data.h,v Commit Identifier: Z3aUcOQiFLoINK6d Index: sys/arch/amd64/conf/GENERIC =================================================================== RCS file: /cvs/src/sys/arch/amd64/conf/GENERIC,v retrieving revision 1.427 diff -u -p -r1.427 GENERIC --- sys/arch/amd64/conf/GENERIC 3 Aug 2016 17:23:38 -0000 1.427 +++ sys/arch/amd64/conf/GENERIC 19 Aug 2016 21:31:07 -0000 @@ -11,7 +11,7 @@ machine amd64 include "../../../conf/GENERIC" -maxusers 80 # estimated number of users +maxusers 100 # estimated number of users option USER_PCICONF # user-space PCI configuration @@ -22,10 +22,14 @@ option MTRR # CPU memory range attribu #option KGDB # Remote debugger support; exclusive of DDB #option "KGDB_DEVNAME=\"com\"",KGDBADDR=0x2f8,KGDBRATE=9600 -option NTFS # NTFS support +#option NTFS # NTFS support option HIBERNATE # Hibernate support + +option HZ=300 + config bsd swap generic +#option DEBUG mainbus0 at root @@ -399,6 +403,7 @@ adw* at pci? # AdvanSys ULTRA WIDE SC pcscp* at pci? # AMD 53c974 PCscsi-PCI SCSI #trm* at pci? # Tekram DC-3x5U SCSI Controllers vmwpvs* at pci? # VMware ParaVirtual SCSI +nvdsbl* at pci? # Nvidia PCI Driver for disabling nvme* at pci? # NVMe controllers scsibus* at scsi? Index: sys/dev/acpi/acpi.c =================================================================== RCS file: /cvs/src/sys/dev/acpi/acpi.c,v retrieving revision 1.313 diff -u -p -r1.313 acpi.c --- sys/dev/acpi/acpi.c 28 Jul 2016 21:57:56 -0000 1.313 +++ sys/dev/acpi/acpi.c 19 Aug 2016 21:31:44 -0000 @@ -562,11 +562,11 @@ acpi_getpci(struct aml_node *node, void { const char *pcihid[] = { ACPI_DEV_PCIB, ACPI_DEV_PCIEB, "HWP0002", 0 }; struct acpi_pci *pci, *ppci; - struct aml_value res; + struct aml_value res,res2; struct acpi_softc *sc = arg; pci_chipset_tag_t pc = NULL; pcitag_t tag; - uint64_t val; + uint64_t val,val2; uint32_t reg; if (!node->value || node->value->type != AML_OBJTYPE_DEVICE) @@ -620,6 +620,35 @@ acpi_getpci(struct aml_node *node, void pci->bus, pci->dev, pci->fun, aml_nodename(node)); + + bool czyNvidiaGPU = false; + if (!(strcmp("\\_SB_.PCI0.PEG0.PEGP",aml_nodename(node)))) + czyNvidiaGPU = true; + + if (czyNvidiaGPU) { + printf("bedzie evalname na GPU\n"); + bool czyPoprawnieName = false; + if(aml_evalname(sc, node, "_OFF", 0, NULL, &res2)){ + printf("evalname na GPU true\n"); + czyPoprawnieName = true; + aml_freevalue(&res2); + } else { + printf("evalname na GPU false\n"); + czyPoprawnieName = false; + } + + if (res2.type == AML_OBJTYPE_PACKAGE) printf("zwrocono AML_OBJTYPE_PACKAGE\n"); + + if (!czyPoprawnieName) { + if(aml_evalinteger(sc, node, "_OFF", 0, NULL, &val2)){ + printf("evalint wykonano i true\n"); + } else { + printf("evalint wykonano i false\n"); + } + } + + } + /* Collect device power state information. */ if (aml_evalinteger(sc, node, "_S3D", 0, NULL, &val) == 0) pci->_s3d = val; @@ -675,7 +704,8 @@ void acpi_pci_match(struct device *dev, struct pci_attach_args *pa) { struct acpi_pci *pdev; - int state; + int state,minstate; + pcitag_t tag; TAILQ_FOREACH(pdev, &acpi_pcidevs, next) { if (pdev->bus != pa->pa_bus || @@ -693,9 +723,30 @@ acpi_pci_match(struct device *dev, struc * initialize them. */ state = pci_get_powerstate(pa->pa_pc, pa->pa_tag); - acpi_pci_set_powerstate(pa->pa_pc, pa->pa_tag, state, 1); - acpi_pci_set_powerstate(pa->pa_pc, pa->pa_tag, state, 0); - + tag = pci_make_tag(pa->pa_pc, pdev->bus, pdev->dev, pdev->fun); + minstate = acpi_pci_min_powerstate(pa->pa_pc, tag); + bool czyGPU2 = false; + czyGPU2 = !(strcmp("\\_SB_.PCI0.PEG0.PEGP",aml_nodename(pdev->node))); + if (czyGPU2){ + printf("Zmieniam stan zasilania z %d na %d\n",state,PCI_PMCSR_STATE_D3); + printf("Minimalny stan zasilania %d\n",minstate); + state=PCI_PMCSR_STATE_D3; + acpi_pci_set_powerstate(pa->pa_pc, tag, state, 1); + acpi_pci_set_powerstate(pa->pa_pc, tag, state, 0); + pci_set_powerstate(pa->pa_pc, tag, PCI_PMCSR_STATE_D3); + } else { + + + acpi_pci_set_powerstate(pa->pa_pc, pa->pa_tag, state, 1); + acpi_pci_set_powerstate(pa->pa_pc, pa->pa_tag, state, 0); + + } + + if(czyGPU2){ + state=128; + state = pci_get_powerstate(pa->pa_pc, tag); + printf("Zasilanie zmieniono na stan %d\n",state); + } aml_register_notify(pdev->node, NULL, acpi_pci_notify, pdev, 0); } } Index: sys/dev/pci/files.pci =================================================================== RCS file: /cvs/src/sys/dev/pci/files.pci,v retrieving revision 1.324 diff -u -p -r1.324 files.pci --- sys/dev/pci/files.pci 17 Mar 2016 04:02:00 -0000 1.324 +++ sys/dev/pci/files.pci 19 Aug 2016 21:33:18 -0000 @@ -121,6 +121,11 @@ device eso {}: audio, midibus attach eso at pci file dev/pci/eso.c eso +#Acer Optimus nvdsbl disable nvidia gpu PCI +device nvdsbl +attach nvdsbl at pci +file dev/pci/nvdsbl.c + # Acer Labs M5455 device auacer: audio, ac97 attach auacer at pci Index: sys/dev/pci/pcidevs =================================================================== RCS file: /cvs/src/sys/dev/pci/pcidevs,v retrieving revision 1.1802 diff -u -p -r1.1802 pcidevs --- sys/dev/pci/pcidevs 31 Jul 2016 07:36:16 -0000 1.1802 +++ sys/dev/pci/pcidevs 19 Aug 2016 21:34:00 -0000 @@ -6107,6 +6107,7 @@ product NVIDIA MCP89_OHCI 0x0d9c MCP89 U product NVIDIA MCP89_EHCI 0x0d9d MCP89 USB product NVIDIA GEFORCEGTX460M 0x0dd1 GeForce GTX 460M product NVIDIA GEFORCE_425M 0x0df0 GeForce 425M +product NVIDIA GEFORCE_620M 0x1140 Geforce 620M product NVIDIA GEFORCEGTX550TI 0x1244 GeForce GTX 550 Ti product NVIDIA GEFORCEGTS450_1 0x1245 GeForce GTS 450 product NVIDIA GEFORCEGT550M 0x1246 GeForce GT 550M After that go to cd sys/dev/pci/ and execute: # make You use this at your own risk and you mustn't report bugs to Project when using patched kernel.