Contribute
Register

How to build your own iMac Pro [Successful Build/Extended Guide]

Status
Not open for further replies.
Make this simple test:
Boot with HDMI cable only.. once in macOS try to connect the HDMI cable with the other HDMI port on your GPU, skip the HDMI cable and connect the DisplayPort Cable with each of the two DisplayPorts on the GPU.. Watch simultaneously all related apparent changes in IOREG! You will see full Display HotPlug and all 4 ports are working!

Boot with HDMI cable (HDMI1 port)(No Lilu.kext, No VegaGraphicsFixup.kext):
Plug into another HDMI2 port - works
Plug into another DP1 port - does not work
Plug into another DP2 port - does not work

When I login into the remote session after the test while DP cable is connected I can see that both HDMI displays are disconnected (ok), however, no DP ort display is detected (bad) (see Attach).

Plugging cable again into another HDMI ports - works perfectly

I am starting to think that something may be wrong with this DP cable. I have ordered a new DP cable just to test this theory (although current DP cable works fine under windows + 4K gaming)
 

Attachments

  • IOREG no display.png
    IOREG no display.png
    291.9 KB · Views: 88
Boot with HDMI cable (HDMI1 port)(No Lilu.kext, No VegaGraphicsFixup.kext):
Plug into another HDMI2 port - works
Plug into another DP1 port - does not work
Plug into another DP2 port - does not work

When I login into the remote session after the test while DP cable is connected I can see that both HDMI displays are disconnected (ok), however, no DP ort display is detected (bad) (see Attach).

Plugging cable again into another HDMI ports - works perfectly

I am starting to think that something may be wrong with this DP cable. I have ordered a new DP cable just to test this theory (although current DP cable works fine under windows + 4K gaming)

Yup maybe the cable is not compatible..

Display drives via DP under windows with 60 Hz and under macOS with 75 Hz..
 
Well, time to add some value.....

So in reading through the threads to do research for this implementation of my 7940x, I noticed some folks who have Vega adapters wanting some fan control.

Has anyone seen the following utility? It was originally posted on a Chinese site and some kind soul translated it to English so that we could use it. I have used to generate a kext to control my fans on my Vega, and after some experimentation, it has worked well. Note, this requires Safari to work, and it only works for the Vegas (56 or 64), which, have some fan speed issues on High Sierra.

Hope some find this helpful (I have!).
 

Attachments

  • VGTab-en.app.zip
    430 KB · Views: 79
Last edited:
  • Like
Reactions: kgp
Yup maybe the cable is not compatible..

Display drives via DP under windows with 60 Hz and under macOS with 75 Hz..

If I could just add that I always purchase the highest rated cables I can get just because of this issue. But that was not always the case: I once had an HDMI cable that was a bargain cable, that I got at a local electronics store and it was a total nightmare to troubleshoot.

@panell - any chance you would be interested in posting your latest 7940x EFI for research purposes? It would help @kgp too, as it may help him post aml implementations for the 7940x.....
 
  • Like
Reactions: kgp
Well, time to add some value.....

So in reading through the threads to do research for this implementation of my 7940x, I noticed some folks who have Vega adapters wanting some fan control.

Has anyone seen the following utility? It was originally posted on a Chinese site and some kind soul translated it to English so that we could use it. I have used to generate a kext to control my fans on my Vega, and after some experimentation, it has worked well. Note, this requires Safari to work, and it only works for the Vegas (56 or 64), which, have some fan speed issues on High Sierra.

Hope some find this helpful (I have!).

Interesting approach, @mm2margaret :thumbup:

:!: Although I have to remind everybody when using the resulting kext to remove the corresponding entries from SSDT-X299-iMacPro-Vega.aml :!:

Code:
                                "PP_PhmSoftPowerPlayTable",
                                Buffer (One)
                                {
                                    /* 0000 */  0xB6, 0x02, 0x08, 0x01, 0x00, 0x5C, 0x00, 0xE1,
                                    /* 0008 */  0x06, 0x00, 0x00, 0xEE, 0x2B, 0x00, 0x00, 0x1B,
                                    /* 0010 */  0x00, 0x48, 0x00, 0x00, 0x00, 0x80, 0xA9, 0x03,
                                    /* 0018 */  0x00, 0xF0, 0x49, 0x02, 0x00, 0x8E, 0x00, 0x08,
                                    /* 0020 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                                    /* 0028 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01,
                                    /* 0030 */  0x5C, 0x00, 0x4F, 0x02, 0x46, 0x02, 0x94, 0x00,
                                    /* 0038 */  0x9E, 0x01, 0xBE, 0x00, 0x28, 0x01, 0x7A, 0x00,
                                    /* 0040 */  0x8C, 0x00, 0xBC, 0x01, 0x00, 0x00, 0x00, 0x00,
                                    /* 0048 */  0x72, 0x02, 0x00, 0x00, 0x90, 0x00, 0xA8, 0x02,
                                    /* 0050 */  0x6D, 0x01, 0x43, 0x01, 0x97, 0x01, 0xF0, 0x49,
                                    /* 0058 */  0x02, 0x00, 0x71, 0x02, 0x02, 0x02, 0x00, 0x00,
                                    /* 0060 */  0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
                                    /* 0068 */  0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x07, 0x00,
                                    /* 0070 */  0x03, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00,
                                    /* 0078 */  0x00, 0x00, 0x01, 0x08, 0x84, 0x03, 0x84, 0x03,
                                    /* 0080 */  0xB6, 0x03, 0xE8, 0x03, 0x1A, 0x04, 0x4C, 0x04,
                                    /* 0088 */  0x60, 0x04, 0x7E, 0x04, 0x01, 0x01, 0x33, 0x04,
                                    /* 0090 */  0x01, 0x01, 0x84, 0x03, 0x00, 0x08, 0x60, 0xEA,
                                    /* 0098 */  0x00, 0x00, 0x00, 0x40, 0x19, 0x01, 0x00, 0x01,
                                    /* 00A0 */  0x80, 0x38, 0x01, 0x00, 0x02, 0xDC, 0x4A, 0x01,
                                    /* 00A8 */  0x00, 0x03, 0x90, 0x5F, 0x01, 0x00, 0x04, 0x00,
                                    /* 00B0 */  0x77, 0x01, 0x00, 0x05, 0x90, 0x91, 0x01, 0x00,
                                    /* 00B8 */  0x06, 0x50, 0xBD, 0x01, 0x00, 0x07, 0x01, 0x08,
                                    /* 00C0 */  0xD0, 0x4C, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00,
                                    /* 00C8 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x8D, 0x01,
                                    /* 00D0 */  0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                                    /* 00D8 */  0x00, 0x00, 0xDC, 0xC7, 0x01, 0x00, 0x02, 0x00,
                                    /* 00E0 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98,
                                    /* 00E8 */  0xFC, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00,
                                    /* 00F0 */  0x00, 0x00, 0x00, 0x00, 0xD8, 0x1B, 0x02, 0x00,
                                    /* 00F8 */  0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                                    /* 0100 */  0x00, 0xF4, 0x40, 0x02, 0x00, 0x05, 0x00, 0x00,
                                    /* 0108 */  0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1C, 0x64,
                                    /* 0110 */  0x02, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x01,
                                    /* 0118 */  0x00, 0x00, 0x00, 0x68, 0x81, 0x02, 0x00, 0x07,
                                    /* 0120 */  0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
                                    /* 0128 */  0x00, 0x05, 0x60, 0xEA, 0x00, 0x00, 0x00, 0x40,
                                    /* 0130 */  0x19, 0x01, 0x00, 0x00, 0x80, 0x38, 0x01, 0x00,
                                    /* 0138 */  0x00, 0xDC, 0x4A, 0x01, 0x00, 0x00, 0x90, 0x5F,
                                    /* 0140 */  0x01, 0x00, 0x00, 0x00, 0x08, 0x28, 0x6E, 0x00,
                                    /* 0148 */  0x00, 0x00, 0x2C, 0xC9, 0x00, 0x00, 0x01, 0xF8,
                                    /* 0150 */  0x0B, 0x01, 0x00, 0x02, 0x80, 0x38, 0x01, 0x00,
                                    /* 0158 */  0x03, 0x90, 0x5F, 0x01, 0x00, 0x04, 0xF4, 0x91,
                                    /* 0160 */  0x01, 0x00, 0x05, 0xD0, 0xB0, 0x01, 0x00, 0x06,
                                    /* 0168 */  0x38, 0xC1, 0x01, 0x00, 0x07, 0x00, 0x08, 0x6C,
                                    /* 0170 */  0x39, 0x00, 0x00, 0x00, 0x24, 0x5E, 0x00, 0x00,
                                    /* 0178 */  0x01, 0xFC, 0x85, 0x00, 0x00, 0x02, 0xAC, 0xBC,
                                    /* 0180 */  0x00, 0x00, 0x03, 0x34, 0xD0, 0x00, 0x00, 0x04,
                                    /* 0188 */  0x68, 0x6E, 0x01, 0x00, 0x05, 0x08, 0x97, 0x01,
                                    /* 0190 */  0x00, 0x06, 0xB0, 0xAD, 0x01, 0x00, 0x07, 0x00,
                                    /* 0198 */  0x01, 0x68, 0x3C, 0x01, 0x00, 0x00, 0x01, 0x04,
                                    /* 01A0 */  0x3C, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50,
                                    /* 01A8 */  0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x38,
                                    /* 01B0 */  0x01, 0x00, 0x02, 0x00, 0x00, 0x34, 0x98, 0x01,
                                    /* 01B8 */  0x00, 0x04, 0x00, 0x00, 0x01, 0x08, 0x00, 0x98,
                                    /* 01C0 */  0x85, 0x00, 0x00, 0x40, 0xB5, 0x00, 0x00, 0x60,
                                    /* 01C8 */  0xEA, 0x00, 0x00, 0x50, 0xC3, 0x00, 0x00, 0x01,
                                    /* 01D0 */  0x80, 0xBB, 0x00, 0x00, 0x60, 0xEA, 0x00, 0x00,
                                    /* 01D8 */  0x94, 0x0B, 0x01, 0x00, 0x50, 0xC3, 0x00, 0x00,
                                    /* 01E0 */  0x02, 0x00, 0xE1, 0x00, 0x00, 0x94, 0x0B, 0x01,
                                    /* 01E8 */  0x00, 0x40, 0x19, 0x01, 0x00, 0x50, 0xC3, 0x00,
                                    /* 01F0 */  0x00, 0x03, 0x78, 0xFF, 0x00, 0x00, 0x40, 0x19,
                                    /* 01F8 */  0x01, 0x00, 0x88, 0x26, 0x01, 0x00, 0x50, 0xC3,
                                    /* 0200 */  0x00, 0x00, 0x04, 0x40, 0x19, 0x01, 0x00, 0x80,
                                    /* 0208 */  0x38, 0x01, 0x00, 0x80, 0x38, 0x01, 0x00, 0x50,
                                    /* 0210 */  0xC3, 0x00, 0x00, 0x05, 0x80, 0x38, 0x01, 0x00,
                                    /* 0218 */  0xDC, 0x4A, 0x01, 0x00, 0xDC, 0x4A, 0x01, 0x00,
                                    /* 0220 */  0x50, 0xC3, 0x00, 0x00, 0x06, 0x00, 0x77, 0x01,
                                    /* 0228 */  0x00, 0x00, 0x77, 0x01, 0x00, 0x90, 0x5F, 0x01,
                                    /* 0230 */  0x00, 0x50, 0xC3, 0x00, 0x00, 0x07, 0x90, 0x91,
                                    /* 0238 */  0x01, 0x00, 0x90, 0x91, 0x01, 0x00, 0x00, 0x77,
                                    /* 0240 */  0x01, 0x00, 0x50, 0xC3, 0x00, 0x00, 0x01, 0x18,
                                    /* 0248 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B,
                                    /* 0250 */  0x00, 0x00, 0xBC, 0x02, 0x48, 0x26, 0x46, 0x00,
                                    /* 0258 */  0x0A, 0x00, 0x54, 0x03, 0x90, 0x01, 0x90, 0x01,
                                    /* 0260 */  0x90, 0x01, 0x90, 0x01, 0x90, 0x01, 0x90, 0x01,
                                    /* 0268 */  0x90, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
                                    /* 0270 */  0x04, 0x31, 0x07, 0x90, 0x01, 0x90, 0x01, 0x90,
                                    /* 0278 */  0x01, 0x90, 0x01, 0x00, 0x00, 0x59, 0x00, 0x69,
                                    /* 0280 */  0x00, 0x4A, 0x00, 0x4A, 0x00, 0x5F, 0x00, 0x73,
                                    /* 0288 */  0x00, 0x73, 0x00, 0x64, 0x00, 0x40, 0x00, 0x90,
                                    /* 0290 */  0x92, 0x97, 0x60, 0x96, 0x00, 0x90, 0x55, 0x00,
                                    /* 0298 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                                    /* 02A0 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                                    /* 02A8 */  0x02, 0x02, 0xD4, 0x30, 0x00, 0x00, 0x02, 0x10,
                                    /* 02B0 */  0x60, 0xEA, 0x00, 0x00, 0x02, 0x10            
                                },

                                "PP_DisablePowerContainment",
                                Buffer (One)
                                {
                                     0x01                                          
                                },

                                "PP_FuzzyFanControl",
                                Buffer (One)
                                {
                                     0x00                                          
                                },
 
Don't forget that also the 18 core CPxx->PRxx ACPI replacements are hardwired in the config.plist of my EFI-Folder distribution.

I propose to collect/post config.plist CPxx->PRxx text snippets also for 8, 10, 12 14, 16 core Skylake-X processors, which I can subsequently link in my guide.

One then just needs to edit the config.plist with TextEdit.app and replace or add the CPxx->PRxx ACPI replacements under

<key>Name</key>
<string>DSDT.aml</string>
<key>Patches</key>
<array>
.....
.....
<array>
Right. If you want to go one step further I can compile it as a set of templates and write a simple build script in python to do substitutions, so that we always have up-to-date config templates for all CPUs. We could also create text representations of SSDT implementations for all supported devices inserted in each PCI slot. Years spent working on enterprise OS configuration management learned me that people can be really bad at copy-pasting. If you think that would be a valuable contribution I can take care of this in the next couple of weeks.

I would love to get a version for the 7960x! I tried to do it myself but it gets a bit out of order as I went down the line based on the 7980x - this led to it not booting so I just left them blank.
Thanks for the screenshots! Expect an update tomorrow.
 
Right. If you want to go one step further I can compile it as a set of templates and write a simple build script in python to do substitutions, so that we always have up-to-date config templates for all CPUs. We could also create text representations of SSDT implementations for all supported devices inserted in each PCI slot. Years spent working on enterprise OS configuration management learned me that people can be really bad at copy-pasting. If you think that would be a valuable contribution I can take care of this in the next couple of weeks.

Thanks for the screenshots! Expect an update tomorrow.

Of course it would be a valuable contribution but I doubt that it would be possible.. The CPxx->PRxx replacement likely could be done automatically, but an automatic configuration of an entire system SSDT for any existing system? The latter I see simply impossible.
 
Of course it would be a valuable contribution but I doubt that it would be possible.. The CPxx->PRxx replacement likely could be done automatically, but an automatic configuration of an entire system SSDT for any existing system? The latter I see simply impossible.
I’m certainly not familiar enough with SSDT system, will trust your judgement here. We can start small with just the CP replacements and see how far we can take it. Worst thing that’s going to happen is that the project will be deemed as useless and dies quietly. I’ll start a GitHub project governed under GPLv3, based on my understanding of your and this forum’s stance to non-commercial aspect of this work I think this would be the most appropriate license.
On SSDT I see the following steps we can try:
1) Split the big SSDT into device-specific ones, so that they’re easier to maintain in source control
2) For each PCIe device, generate a set of SSDTs that cover placement in each slot (we know for sure which slots are called what on a given motherboard). E.g. TB3-Slot3 vs TB3-Slot6. Then instead of adopting you just pick the one you need and/or delete the ones you don’t
3) For other values we know (might) need to be adopted - create a config that would feed the templates. Provide an instruction on how to extract those values from IOreg and/or DDST.
4) Create a separate script that uses the same API as IOreg to extract this values for you, or accepts IOreg dump and parses it (this is the step I haven’t researched how to implement, and it might be impossible. BUT we could live without it and just use 3)
5) Create a build script that compiles all the templates and spits out a file structure that can be applied on top of “base” directory with copy+replace.
6) Add functionality to download appropriate base directory from a known location and apply step 5 automatically.

@kgp I would appreciate your feedback on this. There are certainly things I don’t yet fully understand, and I’m probably making false assumptions. Some parts of your guide still feel like magic to me :)
 
I’m certainly not familiar enough with SSDT system, will trust your judgement here. We can start small with just the CP replacements and see how far we can take it. Worst thing that’s going to happen is that the project will be deemed as useless and dies quietly. I’ll start a GitHub project governed under GPLv3, based on my understanding of your and this forum’s stance to non-commercial aspect of this work I think this would be the most appropriate license.
On SSDT I see the following steps we can try:
1) Split the big SSDT into device-specific ones, so that they’re easier to maintain in source control
2) For each PCIe device, generate a set of SSDTs that cover placement in each slot (we know for sure which slots are called what on a given motherboard). E.g. TB3-Slot3 vs TB3-Slot6. Then instead of adopting you just pick the one you need and/or delete the ones you don’t
3) For other values we know (might) need to be adopted - create a config that would feed the templates. Provide an instruction on how to extract those values from IOreg and/or DDST.
4) Create a separate script that uses the same API as IOreg to extract this values for you, or accepts IOreg dump and parses it (this is the step I haven’t researched how to implement, and it might be impossible. BUT we could live without it and just use 3)
5) Create a build script that compiles all the templates and spits out a file structure that can be applied on top of “base” directory with copy+replace.
6) Add functionality to download appropriate base directory from a known location and apply step 5 automatically.

@kgp I would appreciate your feedback on this. There are certainly things I don’t yet fully understand, and I’m probably making false assumptions. Some parts of your guide still feel like magic to me :)

Nope, definitely no Gitub project out of my system SSDT... ! And please don't touch the system SSDT at present..

If you want, try to write a program for automatic core replacements, although I do not see really a necessity to do so..

Everybody will be able to copy a simple text snippet manually.

In any case, all related work needs to be handled, uploaded and discussed exclusively along this thread.

No permission to publish anything related on Github or elsewhere, sorry..

Good luck,

KGP
 
Nope, definitely no Gitub project out of my system SSDT... ! And please don't touch the system SSDT at present..

If you want, try to write a program for automatic core replacements, although I do not see really a necessity to do so..

Everybody will be able to copy a simple text snippet manually.

In any case, all related work needs to be handled, uploaded and discussed exclusively along this thread.

No permission to publish anything related on Github or elsewhere, sorry..

Good luck,

KGP
Thanks, I won't be publishing anything related to this on Github unless I get your clearance. I'll create the program tonight, how do you want to review?

In the meantime, can I ask you to take a look at my Thunderbolt implementation? Uploaded EFI folder with included IOreg export here: https://drive.google.com/open?id=1kuCpy-z3f6Um_pboMqJHz0symlKEUBay

I can highlight exact values I adopted if that would make it easier for you. Or if you need anything - just let me know.

Here's what I see in system report:
upload_2018-8-13_2-42-19.png


USB functionality works (both USB-A and USB-C), but Thunderbolt3 devices don't appear, neither if I boot with them nor hot-plugged. Note that I left the motherboard cable attached, because the card doesn't work without it on Windows, and I'm fine with not having hot-plug on Mac for the time being. Just need to make the port work.
 
Status
Not open for further replies.
Back
Top