Jump to content

Can't get AppleALC to work


dzsipokink
 Share

5 posts in this topic

Recommended Posts

I successfully installed macOS Catalina onto my Lenovo Thinkpad X230 (Ivy Bridge) notebook using the vanilla OpenCore (0.6.4) guide. The installation process was painless and the OS boots up just fine.

I double checked the guide and gathered all the files needed. I downloaded the latest kexts from github, and I used SSDTime & PreBuilt SSDT-s to get my ACPI related files.

Right now, I'm at the point when I'm trying to fix things at post installation. However, I was spending the last 2 days with trying to get my ALC269 audio device recognised with no luck. No audio devices shows up.

I'm trying to figure out whats causing this issue, and any help would be deeply appreciated!

I have tried using alcid=xxx bootargs with many possible values menitoned by u/GalacticSpaceTiger in this post. Additionally, I know for the fact that alcid=18 should work for me, because I tried other X230 opencore repos and it worked with that, and also other values.

The interesting thing is that I can get my audio device working by adding the following patch into my config.plist (ACPI > Patch) :
<dict>
<key>Comment</key>
<string>HPET (\\WNTF\\!WXPF to \_OSI("Darwin"))</string>
<key>Enabled</key>
<true/>
<key>Find</key>
<data>
oBCQXFdOVEaSXFdYUEY=
</data>
<key>Replace</key>
<data>
oA9fT1NJDURhcndpbgA=
</data>
</dict>


When I add this patch, the audio works fine, but the system shuts down after a minute or two. Also, I could not find any information about this patch in the Dortania guide. My guess is that it's related to IRQ patching. So I went back to the ACPI patching guide and double checked everything. No luck unfortunately.

Do you have any idea what I'm missing here?

My Specs:


This is my work in progress EFI folder: direct download link

Edited by dzsipokink
Link to comment
Share on other sites

It is correct that the problem of sound output through AppleALC is caused by an IRQ conflict.

On older computers below Intel 5th Gen Broadwell, IRQ conflicts have a big impact on Mac OS.

So, in the case of Clover, patching is done by setting the ACPI - DSDT - Fixes - FixHPET items to True.

However, in the case of OpenCore, it is mainly used to patch HPET using SSDTTime.

 

I recommend that you do not use the ACPI patch you wrote in your post, and create and apply the following SSDT patch yourself.

I'm not sure how exactly that patch is used to patch, but on older computers where HPET needs to be used, if the HPET name is different, such as HPE0, it is often a kernel panic reboot some time after Mac OS boot.

https://github.com/daliansky/OC-little/blob/master/保留部件/声卡IRQ补丁/SSDT-HPET_RTC_TIMR-fix.dsl

https://github.com/jsassu20/OpenCore-HotPatching-Guide/blob/master/23-HPET_RTC_TIMR 3-in-1 patch/SSDT-HPET_RTC_TIMR-fix.dsl

 

So, check which IRQ to patch with SSDTTime and use AppleALC by patching IRQ conflicts with RTC, TIMR device disable, HPET._CRS patch, RTC0, TIM0 device enable on Mac OS.

And, in other OS such as Windows other than Mac OS, the existing HPET.XCRS, RTC, TIMR are used.

A patch is needed to rename HPET's _CRS to XCRS.

However, you need to check it yourself as the devices that need to patch IRQ conflicts in SSDTTime are different for each computer.

 

In summary, the following items are used in Mac OS.

- HPET._CRS (patched by SSDTTime)

- RTC0 (Device to be activated and used only in Mac OS)

- TIM0 (Device to be activated and used only in Mac OS)

 

In other OS such as Windows other than Mac OS, use the following items.

- HPET.XCRS (OEM DSDT content with only Rename patch applied)

- RTC (OEM DSDT content)

- TIMR (OEM DSDT content)

 

In addition, code must be written to enable or disable depending on the OS using the If (_OSI ("Darwin")) syntax in the _STA Method.

 

Example code for SSDT is as follows

	Scope (HPET)
        {
            Name (BUF1, ResourceTemplate ()
            {
                IRQNoFlags ()
                    {0,8}
                Memory32Fixed (ReadWrite,
                    0xFED00000,         // Address Base
                    0x00000400,         // Address Length
                    )
            })
            Method (_CRS, 0, NotSerialized)  // _CRS: Current Resource Settings
            {
                If (_OSI ("Darwin"))
                {
                    Return (BUF1)
                }

                Return (\_SB.PCI0.LPCB.HPET.XCRS ())
            }
        }

 

Please be careful not to use the above code as it is.

The contents of the object called BUF1 can be retrieved from SSDT-HPET.aml created by patching from SSDTTime.

Also, if the name of the device corresponding to the LPC is LPC rather than LPCB, the Scope path must be changed to \_SB.PCI0.LPC.~.

 

The overall contents and tree structure of an example SSDT is as follows :

596869857_2020-12-3112_42_46.png.29b6e607c8255eb114a04aa11132efaa.png

 

    External (_SB_.PCI0.LPCB, DeviceObj)    // (from opcode)
    External (_SB_.PCI0.LPCB.HPET, DeviceObj)    // (from opcode)
    External (_SB_.PCI0.LPCB.HPET.BUF0, BuffObj)    // (from opcode)
    External (_SB_.PCI0.LPCB.HPET.XCRS, MethodObj)    // 0 Arguments (from opcode)

    Scope (\_SB.PCI0.LPCB)
    {
        Method (RTC._STA, 0, NotSerialized)  // _STA: Status
        {
            If (_OSI ("Darwin"))
            {
                Return (Zero)
            }

            Return (0x0F)
        }

        Method (TIMR._STA, 0, NotSerialized)  // _STA: Status
        {
            If (_OSI ("Darwin"))
            {
                Return (Zero)
            }

            Return (0x0F)
        }

        Scope (HPET)
        {
            Name (BUF1, ResourceTemplate ()
            {
                IRQNoFlags ()
                    {0,8}
                Memory32Fixed (ReadWrite,
                    0xFED00000,         // Address Base
                    0x00000400,         // Address Length
                    )
            })
            Method (_CRS, 0, NotSerialized)  // _CRS: Current Resource Settings
            {
                If (_OSI ("Darwin"))
                {
                    Return (BUF1)
                }

                Return (\_SB.PCI0.LPCB.HPET.XCRS ())
            }
        }

        Device (RTC0)
        {
            Name (_HID, EisaId ("PNP0B00"))  // _HID: Hardware ID
            Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
            {
                IO (Decode16,
                    0x0070,             // Range Minimum
                    0x0070,             // Range Maximum
                    0x01,               // Alignment
                    0x08,               // Length
                    )
            })
            Method (_STA, 0, NotSerialized)  // _STA: Status
            {
                If (_OSI ("Darwin"))
                {
                    Return (0x0F)
                }

                Return (Zero)
            }
        }

        Device (TIM0)
        {
            Name (_HID, EisaId ("PNP0100"))  // _HID: Hardware ID
            Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
            {
                IO (Decode16,
                    0x0040,             // Range Minimum
                    0x0040,             // Range Maximum
                    0x01,               // Alignment
                    0x04,               // Length
                    )
                IO (Decode16,
                    0x0050,             // Range Minimum
                    0x0050,             // Range Maximum
                    0x10,               // Alignment
                    0x04,               // Length
                    )
            })
            Method (_STA, 0, NotSerialized)  // _STA: Status
            {
                If (_OSI ("Darwin"))
                {
                    Return (0x0F)
                }

                Return (Zero)
            }
        }
    }

 

I hope your problem is solved well. :)

Edited by shl628
  • Like 1
Link to comment
Share on other sites

8 hours ago, shl628 said:

 

I hope your problem is solved well. :)

 

Oh my god thank you @shl628! Very indepth answer, and very useful! 

 

Although, I am somewhat new to the whole acpi patching game. 

Would you recommend this, and this guide by Rehabmen to get done the patching part?

 

I already used SSDTime's IRQ fix with Option 'C' but that alone didn't do the trick, so I'm also sure about the patches you mention are neccesary as well. 

  • Like 1
Link to comment
Share on other sites

19 hours ago, dzsipokink said:

 

Oh my god thank you @shl628! Very indepth answer, and very useful! 

 

Although, I am somewhat new to the whole acpi patching game. 

Would you recommend this, and this guide by Rehabmen to get done the patching part?

 

I already used SSDTime's IRQ fix with Option 'C' but that alone didn't do the trick, so I'm also sure about the patches you mention are neccesary as well. 

 

I have attached the modified SSDT. :)

Delete the existing SSDT-HPET.aml and replace it with the one attached below.

SSDT-HPET.aml

 

And, delete the following items from the ACPI - Patch section of Config.plist.

- TIMR IRQ 0 Patch

- RTC IRQ 8 Patch

 

In order to rename only HPET _CRS to XCRS, modify the patch contents as follows.

Find : 0F085F435253

Replace : 0F0858435253

Edited by shl628
Link to comment
Share on other sites

On 1/1/2021 at 3:56 AM, shl628 said:

 

I have attached the modified SSDT. :)

Delete the existing SSDT-HPET.aml and replace it with the one attached below.

SSDT-HPET.aml

 

And, delete the following items from the ACPI - Patch section of Config.plist.

- TIMR IRQ 0 Patch

- RTC IRQ 8 Patch

 

In order to rename only HPET _CRS to XCRS, modify the patch contents as follows.

Find : 0F085F435253

Replace : 0F0858435253

Thank you! I'm having a few exams in January so I'll be out of hackintoshing until 11st January. I'll be reporting back soon!

Link to comment
Share on other sites

 Share

×
×
  • Create New...