Jump to content

ThunderBolt Drivers


406 posts in this topic

Recommended Posts

50 minutes ago, maleorderbride said:

Are you on the latest firmware? 21 I believe. That screenshot looks valid, but I can't see if you have PCIHotplugCapable also set as One.

You say you tried several "version" of the SSDT, but did you ever follow my instructions and modify your own to fit? It's quite easy. Do so and verify with an IOreg attached.

In the first place, thank you very much for your help. I really appreciate this.

Yes, I am on fw21.

There's several ssdt's floating around(also on the site which name I will not mention) that are versions of yours, if I compare code in maciasl. None of them works better that the other. What exactly am I supposed to adapt for my board? My TB is builtin, it's not an extra card in a PCIe slot. 

Best,

Zip

Link to comment
Share on other sites

In the first place, thank you very much for your help. I really appreciate this.

Yes, I am on fw21.

There's several ssdt's floating around(also on the site which name I will not mention) that are versions of yours, if I compare code in maciasl. None of them works better that the other. What exactly am I supposed to adapt for my board? My TB is builtin, it's not an extra card in a PCIe slot. 

Best,

Zip

Use the first SSDT-TB3.aml attached to[mention=358090]maleorderbride[/mention] post on the first page.

Thats the original and all are derived from there.

 

You need to adapt the ACPI path for your own case.

Using iojones or IORegistryExplorer, search for NHI or thunderbolt and look at the path.

Modify the aml accordingly and compile

 

 

 

 

 

  • Like 1
Link to comment
Share on other sites

25 minutes ago, maleorderbride said:

How can anyone help you if they can't see what effect the SSDT is having in your system? I see your old IOreg now, but it is useless since you aren't injecting any thunderbolt information.

Follow the instructions again. Post just an IOreg with the SSDT installed.

 

Ok, I have edited the SSDT this way. But no hot plugs

/*
 * Intel ACPI Component Architecture
 * AML/ASL+ Disassembler version 20161210-64(RM)
 * Copyright (c) 2000 - 2016 Intel Corporation
 * 
 * Disassembling to non-symbolic legacy ASL operators
 *
 * Disassembly of iASL0ZCA8E.aml, Tue Apr 10 19:06:43 2018
 *
 * Original Table Header:
 *     Signature        "SSDT"
 *     Length           0x000002A2 (674)
 *     Revision         0x01
 *     Checksum         0xEB
 *     OEM ID           "Gigaby"
 *     OEM Table ID     "TB3"
 *     OEM Revision     0x00003000 (12288)
 *     Compiler ID      "INTL"
 *     Compiler Version 0x20161210 (538317328)
 */
DefinitionBlock ("", "SSDT", 1, "Gigaby", "TB3", 0x00003000)
{
    External (_SB_.PCI0.RP05, DeviceObj)    // (from opcode)
    External (_SB_.PCI0.RP05.PXSX, DeviceObj)    // (from opcode)
    External (PXSX, DeviceObj)    // (from opcode)

    Scope (\_SB.PCI0.RP05)
    {
        Scope (PXSX)
        {
            Name (_STA, Zero)  // _STA: Status
        }

        Device (UPSB)
        {
            Name (_ADR, Zero)  // _ADR: Address
            Method (_DSM, 4, NotSerialized)  // _DSM: Device-Specific Method
            {
                If (LNot (Arg2))
                {
                    Return (Buffer (One)
                    {
                         0x03                                           
                    })
                }

                Return (Package (0x02)
                {
                    "PCI-Thunderbolt", 
                    One
                })
            }

            Name (_RMV, One)  // _RMV: Removal Status
            Device (DSB0)
            {
                Name (_ADR, Zero)  // _ADR: Address
                Method (_DSM, 4, NotSerialized)  // _DSM: Device-Specific Method
                {
                    If (LNot (Arg2))
                    {
                        Return (Buffer (One)
                        {
                             0x03                                           
                        })
                    }

                    Return (Package (0x02)
                    {
                        "PCIHotplugCapable", 
                        One
                    })
                }

                Device (NHI0)
                {
                    Name (_ADR, Zero)  // _ADR: Address
                    Method (_DSM, 4, NotSerialized)  // _DSM: Device-Specific Method
                    {
                        If (LNot (Arg2))
                        {
                            Return (Buffer (One)
                            {
                                 0x03                                           
                            })
                        }

                        Return (Package (0x02)
                        {
                            "power-save", 
                            Zero
                        })
                    }
                }
            }

            Device (DSB1)
            {
                Name (_ADR, 0x00010000)  // _ADR: Address
            }

            Device (DSB2)
            {
                Name (_ADR, 0x00020000)  // _ADR: Address
                Device (XHC2)
                {
                    Name (_ADR, Zero)  // _ADR: Address
                    Device (RHUB)
                    {
                        Name (_ADR, Zero)  // _ADR: Address
                        Device (SSP1)
                        {
                            Name (_ADR, One)  // _ADR: Address
                            Name (_UPC, Package (0x04)  // _UPC: USB Port Capabilities
                            {
                                0xFF, 
                                0x09, 
                                Zero, 
                                Zero
                            })
                            Name (_PLD, Package (0x01)  // _PLD: Physical Location of Device
                            {
                                Buffer (0x10)
                                {
                                    /* 0000 */  0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                                    /* 0008 */  0x31, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 
                                }
                            })
                            Method (_DSM, 4, NotSerialized)  // _DSM: Device-Specific Method
                            {
                                If (LEqual (Arg2, Zero))
                                {
                                    Return (Buffer (One)
                                    {
                                         0x03                                           
                                    })
                                }

                                Return (Package (0x02)
                                {
                                    "UsbCPortNumber", 
                                    One
                                })
                            }
                        }

                        Device (SSP2)
                        {
                            Name (_ADR, 0x02)  // _ADR: Address
                            Name (_UPC, Package (0x04)  // _UPC: USB Port Capabilities
                            {
                                0xFF, 
                                0x09, 
                                Zero, 
                                Zero
                            })
                            Name (_PLD, Package (0x01)  // _PLD: Physical Location of Device
                            {
                                Buffer (0x10)
                                {
                                    /* 0000 */  0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                                    /* 0008 */  0x31, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 
                                }
                            })
                            Method (_DSM, 4, NotSerialized)  // _DSM: Device-Specific Method
                            {
                                If (LEqual (Arg2, Zero))
                                {
                                    Return (Buffer (One)
                                    {
                                         0x03                                           
                                    })
                                }

                                Return (Package (0x02)
                                {
                                    "UsbCPortNumber", 
                                    0x02
                                })
                            }
                        }

                        Device (HS01)
                        {
                            Name (_ADR, 0x03)  // _ADR: Address
                            Name (_UPC, Package (0x04)  // _UPC: USB Port Capabilities
                            {
                                0xFF, 
                                0x09, 
                                Zero, 
                                Zero
                            })
                            Name (_PLD, Package (0x01)  // _PLD: Physical Location of Device
                            {
                                Buffer (0x10)
                                {
                                    /* 0000 */  0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                                    /* 0008 */  0x31, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 
                                }
                            })
                        }

                        Device (HS02)
                        {
                            Name (_ADR, 0x04)  // _ADR: Address
                            Name (_UPC, Package (0x04)  // _UPC: USB Port Capabilities
                            {
                                0xFF, 
                                0x09, 
                                Zero, 
                                Zero
                            })
                            Name (_PLD, Package (0x01)  // _PLD: Physical Location of Device
                            {
                                Buffer (0x10)
                                {
                                    /* 0000 */  0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                                    /* 0008 */  0x31, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 
                                }
                            })
                        }
                    }
                }
            }

            Device (DSB3)
            {
                Name (_ADR, 0x00030000)  // _ADR: Address
            }

            Device (DSB4)
            {
                Name (_ADR, 0x00040000)  // _ADR: Address
            }
        }
    }
}

Did I make any mistakes? Sorry but I'm not an expert ...
Here is the IOreg with the SSDT: Download

Link to comment
Share on other sites

17 minutes ago, lelet said:

Sorry, I think I used version 3 instead of 2.1 as before.
Here is the IOreg 2.1: Download

Thanks for your help!

looks good to me...

Unfortunately, it's one of those case where it just doesn't work.

I couldn't get it to work either except using the ASRock TB3 card with a Gigabyte x299 Gaming Pro 7...

I don't think we've figured out everything about TB3 yet, it's really a hit and miss situation.

What TB3 card are you using? what you have is a JHL6540, that's not what the Gigabyte card is using

Link to comment
Share on other sites

13 minutes ago, jya said:

looks good to me...

Unfortunately, it's one of those case where it just doesn't work.

I couldn't get it to work either except using the ASRock TB3 card with a Gigabyte x299 Gaming Pro 7...

I don't think we've figured out everything about TB3 yet, it's really a hit and miss situation.

What TB3 card are you using? what you have is a JHL6540, that's not what the Gigabyte card is using

The card is a GC-Alpine Ridge of Gigabyte and DPCIManager reports it as DSL3510.
The curious thing is that the devices reconnect correctly after sleep (with and without SSDT). During sleep I can also turn them off and on again, they reconnect the same when I wake the computer. This makes me think that the line to have the hotplug is really thin...

 

EDIT:

Browsing the web I found THIS. It can be interesting?

 

function detect_thunderbolt()
{
	# Add Apple EFI drivers to inject device properties for Thunderbolt
	if [ ! -z "$(check_device_presence 8086 1547)" ]; then
		echo " - Intel DSL3510 Thunderbolt [8086:1547] detected, installing EFI drivers..."
		cp "$gRepo/efi/drivers/ThunderboltNhi.efi" "$gEFIMount/EFI/CLOVER/drivers64uefi"
		cp "$gRepo/efi/drivers/ThunderboltXDomainDevice.efi" "$gEFIMount/EFI/CLOVER/drivers64uefi"
	fi
}

 

Edited by lelet
Link to comment
Share on other sites

2 minutes ago, lelet said:

The card is a GC-Alpine Ridge of Gigabyte and DPCIManager reports it as DSL3510.
The curious thing is that the devices reconnect correctly after sleep (with and without SSDT). During sleep I can also turn them off and on again, they reconnect the same when I wake the computer. This makes me think that the line to have the hotplug is really thin...

The IORegistry you've attached shows that it's a pci8086,15d3

That's the same as the iMac Pro , a JHL6540

https://pci-ids.ucw.cz/read/PC/8086/15d3

GB Alpine Ridge has been reported (and that's what GB shows on their website has a DSL6540 https://www.gigabyte.com/au/Motherboard/GC-ALPINE-RIDGE-rev-20#ov)

The DSL6540 is pci8086,1578

https://pci-ids.ucw.cz/read/PC/8086/1578

Mind you, there's no much difference between the two, just a manucturing diffenrence and that Intel just EOL the DSL6540

Maybe GB updated silently their card with the new chipset

Link to comment
Share on other sites

14 minutes ago, jya said:

looks good to me...

Unfortunately, it's one of those case where it just doesn't work.

I couldn't get it to work either except using the ASRock TB3 card with a Gigabyte x299 Gaming Pro 7...

I don't think we've figured out everything about TB3 yet, it's really a hit and miss situation.

What TB3 card are you using? what you have is a JHL6540, that's not what the Gigabyte card is using

There are two version of the Gigabyte Alpine Ridge card with the same model number and name. The newer one uses JHL6540.

Perhaps your TB devices are part of the equation. Do you have TB3 hard drive you can test with?

Or are you using TB3->TB2 adapters here? The Apple one sucks, try the Akitio one if so.

Link to comment
Share on other sites

1 minute ago, maleorderbride said:

There are two version of the Gigabyte Alpine Ridge card with the same model number and name. The newer one uses JHL6540.

Perhaps your TB devices are part of the equation. Do you have TB3 hard drive you can test with?

Or are you using TB3->TB2 adapters here? The Apple one sucks, try the Akitio one if so.

The ASRock is also using the JHL6540, and I'm using the Apple TB3->TB2 adapter... So I don't think it's a chipset issue.

Tomorrow I'm getting an ASRock x299 MB, I wonder if hotplug will work with that one... With my great luck, I'll find that it doesn't work :(

Link to comment
Share on other sites

5 minutes ago, maleorderbride said:

There are two version of the Gigabyte Alpine Ridge card with the same model number and name. The newer one uses JHL6540.

Perhaps your TB devices are part of the equation. Do you have TB3 hard drive you can test with?

Or are you using TB3->TB2 adapters here? The Apple one sucks, try the Akitio one if so.

I am using the rev. 2.0 indeed, Gigabyte has probably updated it. And I'm using the Apple adapter from Thunderbolt 3 to 2, unfortunately I do not have Thunderbolt 3 devices to try.

Is the information I added to my previous post useful?

16 minutes ago, lelet said:

EDIT:

Browsing the web I found THIS. It can be interesting?

 


function detect_thunderbolt()
{
	# Add Apple EFI drivers to inject device properties for Thunderbolt
	if [ ! -z "$(check_device_presence 8086 1547)" ]; then
		echo " - Intel DSL3510 Thunderbolt [8086:1547] detected, installing EFI drivers..."
		cp "$gRepo/efi/drivers/ThunderboltNhi.efi" "$gEFIMount/EFI/CLOVER/drivers64uefi"
		cp "$gRepo/efi/drivers/ThunderboltXDomainDevice.efi" "$gEFIMount/EFI/CLOVER/drivers64uefi"
	fi
}

 

 

Link to comment
Share on other sites

3 hours ago, maleorderbride said:

Are you on the latest firmware? 21 I believe. That screenshot looks valid, but I can't see if you have PCIHotplugCapable also set as One.

You say you tried several "version" of the SSDT, but did you ever follow my instructions and modify your own to fit? It's quite easy. Do so and verify with an IOreg attached.

I've adapted your SSDT(I only have PXSX)imageproxy.php?img=&key=c17464ef1b1b51c7and rebooted.

IODeviceTree:/PCI0@0/RP05@1C,4/UPSB@0/DSB0@0 ->  PCIHotplugCapable = 0x1. This is right?

 

My ethernet tb adapter hangs off IODeviceTree:/PCI0@0/RP05@1C,4/UPSB@0/DSB1@1/pci-bridge@0/pci-bridge@0/ethernet@0 which is not PCIHotplugCapable...

 

FYI, I have 2 TB3-USB3.1 combo ports.

Sorry, I got an error uploading my screenshot twice. Now there are 3 and I don't see how I can get rid of the 2 copies...

 

Schermafbeelding 2018-04-10 om 21.24.49.png

Schermafbeelding 2018-04-10 om 21.16.27.png

Schermafbeelding 2018-04-10 om 21.16.27.png

Edited by zipb
Link to comment
Share on other sites

Hmm. Using the adapted SSDT from the first page I just slept my hack thrice without losing my tb - ethernet device + attached audio interface, and the SSD attached to my USB3.1 port is properly reattached too...

That's progress! Nice! Thank you!

Log looks not too shabby either. Tons of bluetooth related stuff, but that's probably nomal advertising of services.

I wonder what has changed that suddenly made it work. I will try a couple of reboots and do some more testing.

  • Like 1
Link to comment
Share on other sites

11 hours ago, zipb said:

Hmm. Using the adapted SSDT from the first page I just slept my hack thrice without losing my tb - ethernet device + attached audio interface, and the SSD attached to my USB3.1 port is properly reattached too...

That's progress! Nice! Thank you!

Log looks not too shabby either. Tons of bluetooth related stuff, but that's probably nomal advertising of services.

I wonder what has changed that suddenly made it work. I will try a couple of reboots and do some more testing.

Hot swap definitely doesn't work. Everything on the 2 TB ports(TB and USB) gets hosed if I unplug a TB device. Nothing visible in the About This Mac... PCi and Thunderbolt sections...

7 hours ago, TheRacerMaster said:

I don't know if simply adding the Thunderbolt EFI drivers will actually fix anything (that was more of a test than anything else). Besides, for Apple EFI device property injection to work, you'd also need EfiDevicePathPropertyDatabase.efi.

Pray tell, where do I find this efi and how does this work?

More info much appreciated!

Link to comment
Share on other sites

10 hours ago, TheRacerMaster said:

I don't know if simply adding the Thunderbolt EFI drivers will actually fix anything (that was more of a test than anything else). Besides, for Apple EFI device property injection to work, you'd also need EfiDevicePathPropertyDatabase.efi.

 

3 hours ago, jya said:

Where are those efi from? Are they even 64 bits?

These are the two efi files:

https://github.com/al3xtjames/Gigabyte-GA-Z77X-macOS-Install/blob/master/efi/drivers/ThunderboltNhi.efi

https://github.com/al3xtjames/Gigabyte-GA-Z77X-macOS-Install/blob/master/efi/drivers/ThunderboltXDomainDevice.efi

They are for a Gigabyte motherboard with integrated Thunderbolt DSL3510, and they probably have to be adapted, but I do not know how to modify them.
Both must be placed in the folder: EFI/CLOVER/drivers64uefi

Link to comment
Share on other sites

48 minutes ago, lelet said:

 

These are the two efi files:

https://github.com/al3xtjames/Gigabyte-GA-Z77X-macOS-Install/blob/master/efi/drivers/ThunderboltNhi.efi

https://github.com/al3xtjames/Gigabyte-GA-Z77X-macOS-Install/blob/master/efi/drivers/ThunderboltXDomainDevice.efi

They are for a Gigabyte motherboard with integrated Thunderbolt DSL3510, and they probably have to be adapted, but I do not know how to modify them.
Both must be placed in the folder: EFI/CLOVER/drivers64uefi

you don't answer either of my question :)

By where are they coming from, I don't mean the github path....

nor does that tell me those are 64 bits efi files :)

Link to comment
Share on other sites

6 hours ago, jya said:

you don't answer either of my question :)

By where are they coming from, I don't mean the github path....

nor does that tell me those are 64 bits efi files :)

Simply because I do not know, If I knew it I would have already written it ;)

However I want to bring back a PARTIAL SUCCESS! :thumbsup_anim:
My computer is still empty, so I can afford certain experiments.
I added the two efi files to my drivers64uefi folder and... in some cases the hotplug works!
To be successful, the devices must be turned on before booting (as before), but now if I turn them off and turn them on again, they often reconnect.
However, everything is very unstable:
- If I turn off the last device in the chain, almost all others are also disconnected;
- If I open the UAD app to manage the audio interfaces, after I turn off the devices, when I turn them back on they will not reconnect anymore and the app will crash;
- If I turn on the computer with the devices turned off, the hotplug does not work;
And there are many other variables that I do not list.

Obviously this is already a lot, considering that they should not even be compatible.

However it seems that the solution is not an SSDT, but the driver.
Now it would be useful to find drivers from a original machine with Thunderbolt 3.

 

EDIT: Added IOreg with only the efi drivers loaded: IOreg efithunderboltdriver.zip

Edited by lelet
Link to comment
Share on other sites

Both of those are extracted from Apple firmware updates (in that case, from iMac13,2). You probably want the drivers from a TB3 Mac if you'd like to experiment (use UEFITool, or use the attached ones from iMacPro1,1). Note that I haven't looked at them at all, so they most likely will not work without additional research!

Proper Thunderbolt functionality probably requires more research regarding the NHI. goodwin_c was looking into this a while ago, but I'm not sure if anything came of it.

tb-efi.zip

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

False alarm, the efi drivers are not responsible. I tried to clean my system from every patch and it happens the same (by now I do not understand anything).

Thanks @TheRacerMaster, but at this point the only test to do is with the efi drivers for the TB3 from an iMac18,3 or iMacPro1,1 :wallbash:

Link to comment
Share on other sites

A bit of an update.. I received the ASRock x299 Professional Gaming XE board, still using the ASRock TB3 card...

Good thing on this board is that all PCI slots are hooked to the CPU PCI lanes, except for the PCI1x that is connected to the PCH.

Getting the ASRock TB3 card to properly work turned out to be an absolute pain, you must fully clear the CMOS if you want the card to work once you move it...

Graphic card in PCIx16_1, TB3 card in PCIx16_2: TB3 Hotplug works, USB-C doesn't work. TB3 devices plugged don't fully work. In particular the webcam, audio device, microphone and USB hub on the Apple Display screen don't work (they work in windows) same issue as I posted there:

Graphic card in PCIx16_1, TB3 card in PCIx16_3: TB3 Hotplug doesn't work, USB-C doesn't work. TB3 devices plugged work fully. Unplugging/Plugging however doesn't crash/hang the machine.

Graphic card in PCIx16_3, TB3 card in PCIx16_5: TB3 hotplug works, USB-C doesn't work. TB3 devices plugged work fully

Good news is that while USB-C doesn't work, it doesn't hang the mac when I plug something. So at least I can charge my phone :)

Now I have a lot of USB ports that don't work anyway, so maybe it's just a matter of getting USB to work on those other ports first.

For some reasons, like the Asus Prime Deluxe, the pci12d8,400f doesn't get its driver loaded depending on the slot the card is loaded. On the Asus I had to plug the TB3 card in Slot 4, it wouldn't work fully anywhere else

So the best result I've achieved is with the Gigabyte Gaming 7 pro, however the TB3 card must be in slot 4, and is wired via the PCH which is non-optimal.

  • Like 1
Link to comment
Share on other sites

17 hours ago, TheRacerMaster said:

Both of those are extracted from Apple firmware updates (in that case, from iMac13,2). You probably want the drivers from a TB3 Mac if you'd like to experiment (use UEFITool, or use the attached ones from iMacPro1,1). Note that I haven't looked at them at all, so they most likely will not work without additional research!

Proper Thunderbolt functionality probably requires more research regarding the NHI. goodwin_c was looking into this a while ago, but I'm not sure if anything came of it.

tb-efi.zip

Thanks, but what am I supposed to do with this efi? Open it with what and then change what? Can someone give (a link to) an overview of what should happen exactly and where and how a driver talks to efi talks to what? 

This installing SSDT's and hoping they will magically fix everything is not leading to much.

This is probably way over my head, but now I feel like I'm stumbling in the dark without even knowing what I am looking for.

Best,

 

Zip

Link to comment
Share on other sites

As reported by @jya, probably the chipset makes some differences, but it is not the main problem. If so, on Windows it would not work.
In fact, from the tests carried out, it seems a problem of how the various ACPI paths are managed. Previously I had attached the files of an iMac18,3 on purpose to make comparisons.

Link to comment
Share on other sites

 Share

×
×
  • Create New...