| 3742 | } |
| 3743 | |
| 3744 | UINT32 AddHDEF (UINT8 *dsdt, UINT32 len, const XString8& OSVersion) |
| 3745 | { |
| 3746 | UINT32 i, k; |
| 3747 | UINT32 PCIADR, PCISIZE = 0; |
| 3748 | INT32 sizeoffset; |
| 3749 | UINT32 HDAADR = 0, Size; |
| 3750 | AML_CHUNK* root; |
| 3751 | // AML_CHUNK* met, *met2; |
| 3752 | AML_CHUNK* device; |
| 3753 | // AML_CHUNK* pack; |
| 3754 | CHAR8 *hdef; |
| 3755 | |
| 3756 | PCIADR = GetPciDevice(dsdt, len); |
| 3757 | if (PCIADR) { |
| 3758 | PCISIZE = get_size(dsdt, PCIADR); |
| 3759 | } |
| 3760 | if (!PCISIZE) return len; //what is the bad DSDT ?! |
| 3761 | DBG("Start HDA Fix\n"); |
| 3762 | // len = DeleteDevice("AZAL", dsdt, len); |
| 3763 | |
| 3764 | // HDA Address |
| 3765 | for (i=0x20; len >= 10 && i < len - 10; i++) { |
| 3766 | if (HDAADR1 != 0x00000000 && HDAFIX && |
| 3767 | CmpAdr(dsdt, i, HDAADR1)) { |
| 3768 | HDAADR = devFind(dsdt, i); |
| 3769 | if (!HDAADR) { |
| 3770 | continue; |
| 3771 | } |
| 3772 | |
| 3773 | // BridgeSize = get_size(dsdt, HDAADR); |
| 3774 | device_name[4] = (__typeof_am__(device_name[4]))AllocateZeroPool(5); |
| 3775 | CopyMem(device_name[4], dsdt+i, 4); |
| 3776 | DBG("found HDA device NAME(_ADR,0x%08X) And Name is %s\n", |
| 3777 | HDAADR1, device_name[4]); |
| 3778 | ReplaceName(dsdt, len, device_name[4], "HDEF"); |
| 3779 | HDAFIX = FALSE; |
| 3780 | break; |
| 3781 | } // End HDA |
| 3782 | } |
| 3783 | |
| 3784 | if (HDAADR) { // bridge or device |
| 3785 | i = HDAADR; |
| 3786 | Size = get_size(dsdt, i); |
| 3787 | k = FindMethod(dsdt + i, Size, "_DSM"); |
| 3788 | if (k != 0) { |
| 3789 | k += i; |
| 3790 | Size = get_size(dsdt, k); |
| 3791 | sizeoffset = - 1 - Size; |
| 3792 | len = move_data(k - 1, dsdt, len, sizeoffset); |
| 3793 | len = CorrectOuters(dsdt, len, k - 2, sizeoffset); |
| 3794 | DBG("_DSM in HDA already exists, dropped\n"); |
| 3795 | } |
| 3796 | } |
| 3797 | |
| 3798 | root = aml_create_node(NULL); |
| 3799 | if (HDAFIX) { |
| 3800 | MsgLog("Start Add Device HDEF\n"); |
| 3801 | device = aml_add_device(root, "HDEF"); |
no test coverage detected