Contribute
Register

[Guide] Lenovo Yoga C930-13IKB (4K/i7-8550u) 99% working, updated 7 Feb

Joined
Oct 31, 2014
Messages
104
Motherboard
Lenovo LNVNB161216
CPU
i7-8550U
Graphics
UHD 620 (3840x2160)
Mobile Phone
Android
382617

Spoiler: I love it. For some reason it feels much more...don't know...friendly to the touch than Macbook Pro 2018. Somehow with the MBP I constantly feared breaking it (this might be because out of five I tried none lasted longer than two weeks before the keys began to malfunction). This laptop just feels friendly and sturdy. Plus it fits a 14" screen where MBP fits 13.3" and weighs the same, 1.37 kg.

I've tried to use this baby with Windows. I did my best. But at the end I just couldn't with Windows, which is how I am now typing this from a laptop running macOS Mojave 10.14.2, Ubuntu 18.04, and a small Win partition to check for updates. Which in this case is very important – latest BIOS is a must.

It's very stable – I am surprised at how stable it is. Long overnight sleeps don't break anything like USB or sound or wifi, as so many people reported. I use it as my main machine (while keeping VERY regular backups, both cloning the drive and using Time Machine over network). It is much quieter and cooler in macOS than in Windows – I booted Windows to update something and when the fans roared I was rather taken aback.

Specs:
Lenovo Yoga C930
4K touchscreen 2-in-1 display
2xThunderbolt 3/USB-C 3.1
1xUSB-A 3.0
Included pen docked inside (genius if you ask me)
16 GB RAM (soldered)
i7-8550u (soldered)
Original SSD (don't make my mistake, buy the lowest/cheapest capacity!) replaced by Samsung EVO 870 – you won't be able to use the original SSD anyway
Original Intel wifi replaced with Dell DW1560 (bought mine here)

The below guide is current as of February 7, 2019 and may (will) be changed!

What works (tested)
– USB (A and C types), Thunderbolt not tested, hotplug in all three USBs
– Audio except internal microphone (BIOS update 32 enables the subwoofer in macOS but not Ubuntu, which is interesting; Boom 3D takes care of the volume and EQ)
– 4K screen, UHD 630 iGPU (1536 MB detected), QI/CE
– touchpad with multitouch and gestures, it's a shitty touchpad compared to Apple's, but it works
– pen works 99% – it behaves like a basic mouse, no pressure sensitivity, I don't know whether that can be added but there is a chance it can, since the screen is detected as Wacom tablet. Wacom Utility didn't help, though. I'm not too bothered, I use tablet mode to read PDFs full screen, mouse is enough to turn the pages.
– brightness (I remapped it to F11 and F12, because I use those keys precisely never, it's possible to come up with a more elegant solution but I couldn't be bothered), Night Shift, scaling, etc.
– display rotation (I use a little app called Display Rotation and remapped Ctrl-Option-Command-0 to F10 to return to "regular" mode if needed) – if it's possible to use the rotation sensor let me know, but I would imagine not. The Displays (Preferences) + option rotation also works. Sometimes the scaling disables itself, just re-enable it.
– tablet mode
– battery indicator
– camera
– headset including microphone (note: some headsets added to phones have the microphone connectors reversed, try another one in case of problems)
– clamshell mode with external 1080p display over USB-C
– wifi and bluetooth
– sleep, including Power Nap – sleep on lid close or power button or Apple > Sleep, wake by power button only so far
– DRM-protected content on Apple Music
– App Store (updated to Mojave 10.14.3 without problems, standard procedure)

What I didn't test
– Thunderbolt (I don't have a single TB device)

What doesn't work
– internal mic (apparently requires BIOS update from Lenovo, Linux people complain about it as well)
– audio over USB-C (is that HDMI audio? in any case it doesn't work, but I don't care)
– fingerprint reader – does this work in any non-Apple laptop? Because if yes, I want it.
– Messages and FaceTime (I don't use them) – I used this guide, but can't log in to either, I get stuck on the "please wait" screen and it stays there indefinitely. I don't use Messages and FaceTime, so for me it's cosmetic really.

If there's something missing, ask below and I'll check.

382598


Before install

Make a recovery USB stick for Windows 10.
I deleted mine and spent way more time than should be necessary reinstalling it – curio: Bootcamp Assistant is not able to create a USB stick with fall update of Win 10, so you would have to use the April version, make the stick in advance.

Get either the wifi card or a USB dongle (I used TP-Link Archer T1U – don't forget those come with apps/drivers). Bear in mind you won't be able to install anything on the internal SSD until you replace it, but I recommend starting with an external drive anyway. Get a cable mouse you can connect to USB-A.

Get a magnifying glass or someone with very good vision, because you will install in 4K mode with teeny weeny windows and text.

Update the BIOS and firmware to latest version. This is important and only possible from Windows. (It's the only reason why I have a small partition for Windows on the SSD at all.) Link here.

Download the required kexts below. Get latest versions of everything. If using a Wifi dongle download its software as well for obvious reasons. You will need maciASL and iasl from RehabMan (NOT the latest official commits). I use PListEdit as well. Do not try to connect to Messages and FaceTime using USB Wifi dongle.

*​

BIOS settings

The Lenovo BIOS is largely locked and I don't dare to tinker with that. But I could do enough. Enter the BIOS by pressing F2 on boot (you must press F2 already when pressing Power button, 1/5 second later and it won't work). Sometimes you only get boot order list, this seems random, just try again and choose BIOS Setup.

– disable Secure Boot
– disable Intel Virtual Technology
– system performance mode: intelligent (you can try other options)
– Intel SGX: disabled (that's the fingerprint reader)
– USB Boot: enabled
– Intel Platform Trust Technology: enabled – when I disabled it I was greeted with the Ø sign

*​

Install instructions

Follow RehabMan's guide, using the hd520_530_etc. plist. One thing: before install edit the plist and change platform-id in Graphics section to 0x12345678. Create a USB stick with installmedia as RehabMan explains. I used RehabMan's latest build of Clover to install.

I tried to do a clean install on the internal drive and failed. I later found out that for some reason – please don't ask me where I read that – NVMe drives as internal can be problematic for installing. I started with an external SSD and had no problems. My recommendation is that you do the same and use Carbon Copy Cloner to move it to your future internal drive.


Post-install

Install Clover on the target drive. Use RehabMan's recommended settings for now. Add RC scripts on boot volume to avoid crashes with OsxAptio*.

Working out of the box:
– keyboard works, backlight handled by hardware (Fn+Space), disable trackpad key (why? anyway, it works, not that it matters because your touchpad and touchscreen don't at this point)
– all (three) USBs work, no hotplug in USB-C
– camera (this one really surprised me!)
– 4k detected, use scaling in Display Properties
– this is interesting: fans are controlled by hardware. It Just Works (TM). Both macOS and Ubuntu keep the computer MUCH quieter and cooler than Windows! I mostly hear the fans spin and feel the heat when I'm constantly restarting the laptop fixing something. Otherwise it's quiet and cool.
– the rest needs TLC.

*​

Config.plist

Install Clover Configurator and modify your config.plist – or use mine (attached) POST-INSTALL.

ACPI

Patches used:
HDAS->HDEF
HECI->IMEI (credit: @hauntix)
MEI->IMEI
GFX0->IGPU
PCI0.VID -> IGPU #1 and IGPU #2
XHCI -> XHC
EHC1 -> EH01
EHC2 -> EH02
SAT0 -> SATA (credit: @hauntix)

and

https://github.com/RehabMan/OS-X-Clover-Laptop-Config/blob/master/config_patches.plist – to enable trackpad with Voodoo and FakeSMC installed in /L/E (thanks to @Feartech)

You can remove the DMVT-prealloc patch. I have no clue how much RAM this laptop allocates, but it's more than 32 MB.

Make sure Plugin Type is enabled. Fixes section: FixIPIC, FixHPET, FixRTC, FixTMR. Enable SlpSmiAtWake below the Fixes section.

Boot (updated Feb 7, new config.plist uploaded)

dart=0
slide=0
darkwake=0
-disablegfxfirmware
-cdfon

Devices

Remove all NVidia, ATI, etc. patches
FakeID 0x591B8086 IntelGFX
USB: Inject
Audio: Inject: No, ResetHDA

Add patch:

Device IntelGFX
Key: AAPL, GfxYTile
Value: 01000000

Properties for AppleHDA/AppleALC (in the Arbitrary/Properties section):

Devices: PciRoot(0x0)/Pci(0x1f,0x3)
Properties for this device:
layout-id 07000000
alc-layout-id 03000000

This is a dirty solution to the fact that alcid parameter on boot doesn't seem to work, and Mojave removed layout 3. This way AppleALC uses layout 3, while AppleHDA is convinced it's layout 7. Once the sound works, volume keys incl. mute work automagically. Use AppleALC 1.3.4.

GUI


Pick a 4K theme. I tried various scaling and resolution options in Clover and the only one that worked apart from 4K was 1024x768 which was ridiculous. I'm using Mojave4K theme and it's lovely. Verbose boot requires a microscope.

Graphics

Inject Intel
ig-platform-id: 0x591B0000

Kernel and Kext Patches

382600


382601


Enable Apple RTC, Kernel LAPIC, KernelPm.

Rt Variables

ROM: UseMacAddr0
BooterConfig: 0x28
CsrActiveConfig: 0x67

SMBIOS

Product Name: MacBookPro14,1 (I tried other MBP and Air SMBIOSes and they all caused problems or slowed the computer down a LOT – none of them solved my sleep problem)
I generated a custom UUID, but it didn't help me with Messages and Facetime.

System Parameters

Injext Kexts: Detect


Kexts

Add the following kexts: (there's a chance some of them are not necessary and will be removed from this list later, for now I use them because they work). Use latest builds of everything! A little tool called Kext Updater has been quite helpful.

/Clover/Kexts/Other
– FakeSMC
– FakePCIID + FakePCIID_Broadcom_WiFi.kext (for my Broadcom wifi)
– Lilu
– USBInjectAll
– VoodooI2C
– VoodooI2CHID
– VoodooPS2Controller

/Library/Extensions:
– leave everything that's already there

– ACPIBatteryManager
– AppleALC 1.3.4
– BrcmFirmwareRepo (wifi + bluetooth)
– BrcmPatchRAM2
– FakePCIID, FakePCIID_Broadcom_WiFi, FakePCIID_Intel_HD_Graphics
– FakeSMC (I added all the sensors plugins and HWMonitor, but they're not necessary, I just like having them)

382603
– Lilu
– USBInjectAll
– VoodooI2C, I2CHID, PS2Controller
– WhateverGreen

Get all those kexts into one folder and do this:

Code:
sudo cp -R [folder]/*.* /Library/Extensions
sudo kextcache -i /
Don't forget rebuilding cache every time you put another kext in /L/E unless you like having extra problems for no reason.


Drivers

I use the following in drivers64UEFI:
– ApfsDriverLoader-64
– AppleImageCodec-64
– AppleInputFix-64
– AudioDxe-64
– DataHubDxe-64
– EmuVariableUefi-64.efi
– FSInject-64.efi
– HFSPlus.efi
– OsxAptioFixDrv-64
– SMCHelper-64.efi


Get your hands dirty

Not literally, but you can if you feel like it, this is not a butterfly keyboard Apple laptop. Hell, eat a cookie. Don't sit in a dust-free environment. By the way, the keyboard and chassis stay much cleaner than MBP ever did.

DSDT patching

On startup press F4 a few times. Your DSDT files will be generated to CLOVER/ACPI/origin. Keep them untouched!!! When you change something, save it to another folder.

Use maciASL and iasl builds by RehabMan! The other builds, even if newer, are buggy and will create files you won't be able to compile.

Use iasl to extract dsdt.dsl (source code) from dsdt.aml (machine code). Do not use the default "Pre-Edited DSDT" maciASL opens with.

Code:
iasl -dl /Volumes/EFI/EFI/CLOVER/ACPI/origin/DSDT.aml
The result will be a file called DSDT.dsl – again, keep it and make a copy!!!

I am not uploading the DSDT, because it's different for every computer AND changes with BIOS updates. Keep the patches, as you will be re-applying them.


Patches to use first

As recommended by RehabMan in post-install section of his guide.

Further patches follow...

Touchpad

Use the following DSDT patch:

Code:
// Touchpad is the device TPL1 (SYNA2B31). In DSDT in TPL1 section replace pin with 0x55:

Name (SBFG, ResourceTemplate ()
{
GpioInt (Level, ActiveLow, Exclusive, PullDefault, 0x0000,
"\\_SB.PCI0.GPI0", 0x00, ResourceConsumer, ,
)
{ // Pin list
0x55 // this was 0x00
}
})


// Find the _CRS method in the TPL1 section and replace it with:

Method (_CRS, 0, NotSerialized) // _CRS: Current Resource Settings
{
Return (ConcatenateResTemplate (SBFB, SBFG))
}
This is a patch I found somewhere and adapted – my apologies, I didn't write down the source.

Battery

This one was the most difficult. I followed RehabMan's guide. Use the following DSDT patch:

Code:
// 16-bit

//                B1TM,   16, // 0x62
//                B1VT,   16, // 0x64
//                B1CR,   16, // 0x66
//                B1RC,   16, // 0x6a
//                B1FC,   16, // 0x6c
//                B1DC,   16, // 0x76
//                B1DV,   16, // 0x78
//                BDCW,   16, // 0x7A
//                BDCL,   16, // 0x7C
//                B1DT,   16, // 0xA0
//                B2DT,   16, // 0xA2
//                B1CY,   16, // 0xA4
//                BCRT,   16, // 0xBA

into method label B1B2 remove_entry;
into definitionblock code_regex . insert
begin
Method (B1B2, 2, NotSerialized) { Return(Or(Arg0, ShiftLeft(Arg1, 8))) }\n
end;

into device label H_EC code_regex B1TM,\s+16, replace_matched begin B1T0,8,B1T1,8, end;
into device label H_EC code_regex B1VT,\s+16, replace_matched begin B1V0,8,B1V1,8, end;
into device label H_EC code_regex B1CR,\s+16, replace_matched begin B1C4,8,B1C5,8, end;
into device label H_EC code_regex B1RC,\s+16, replace_matched begin B1R0,8,B1R1,8, end;
into device label H_EC code_regex B1FC,\s+16, replace_matched begin B1F0,8,B1F1,8, end;
into device label H_EC code_regex B1DC,\s+16, replace_matched begin B1D0,8,B1D1,8, end;
into device label H_EC code_regex B1DV,\s+16, replace_matched begin B1D2,8,B1D3,8, end;
into device label H_EC code_regex BDCW,\s+16, replace_matched begin DCW0,8,DCW1,8, end;
into device label H_EC code_regex BDCL,\s+16, replace_matched begin BDC0,8,BDC1,8, end;
into device label H_EC code_regex B1DT,\s+16, replace_matched begin B1D4,8,B1D5,8, end;
into device label H_EC code_regex B2DT,\s+16, replace_matched begin B2D0,8,B2D1,8, end;
into device label H_EC code_regex B1CY,\s+16, replace_matched begin B1C6,8,B1C7,8, end;
into device label H_EC code_regex BCRT,\s+16, replace_matched begin CRT0,8,CRT1,8, end;

into method label _BIF code_regex \(ECRD\s+\(RefOf\s+\(B1FC\)\) replaceall_matched begin \(B1FC end;
into method label _BIF code_regex \(ECRD\s+\(RefOf\s+\(B1DC\)\) replaceall_matched begin \(B1DC end;
into method label _BIF code_regex \(ECRD\s+\(RefOf\s+\(B1DV\)\) replaceall_matched begin \(B1DV end;
into method label _BIF code_regex \(ECRD\s+\(RefOf\s+\(B1CR\)\) replaceall_matched begin \(B1CR end;
into method label _BST code_regex \(ECRD\s+\(RefOf\s+\(B1CR\)\) replaceall_matched begin \(B1CR end;
into method label _BIF code_regex \(ECRD\s+\(RefOf\s+\(B1VT\)\) replaceall_matched begin \(B1VT end;
into method label _BST code_regex \(ECRD\s+\(RefOf\s+\(B1VT\)\) replaceall_matched begin \(B1VT end;
into method label _BST code_regex \(ECRD\s+\(RefOf\s+\(B1RC\)\) replaceall_matched begin \(B1RC end;

into method label GSBI code_regex \(B1TM, replaceall_matched begin (B1B2(B1T0,B1T1), end;
into method label GSBI code_regex \(B1VT, replaceall_matched begin (B1B2(B1V0,B1V1), end;
into method label _BST code_regex \(B1VT, replaceall_matched begin (B1B2(B1V0,B1V1), end;
into method label _BST code_regex \(B1CR, replaceall_matched begin (B1B2(B1C4,B1C5), end;
into method label GSBI code_regex \(B1CR, replaceall_matched begin (B1B2(B1C4,B1C5), end;
into method label _BST code_regex \(B1RC, replaceall_matched begin (B1B2(B1R0,B1R1), end;
into method label GSBI code_regex \(B1RC, replaceall_matched begin (B1B2(B1R0,B1R1), end;
into method label _BIF code_regex \(B1FC, replaceall_matched begin (B1B2(B1F0,B1F1), end;
into method label GSBI code_regex \(B1FC, replaceall_matched begin (B1B2(B1F0,B1F1), end;
into method label _BIF code_regex \(B1DC, replaceall_matched begin (B1B2(B1D0,B1D1), end;
into method label GSBI code_regex \(B1DC, replaceall_matched begin (B1B2(B1D0,B1D1), end;
into method label _BIF code_regex \(B1DV, replaceall_matched begin (B1B2(B1D2,B1D3), end;
into method label GSBI code_regex \(B1DV, replaceall_matched begin (B1B2(B1D2,B1D3), end;
into method label GSBI code_regex \(BDCW, replaceall_matched begin (B1B2(DCW0,DCW1), end;
into method label GSBI code_regex \(BDCL, replaceall_matched begin (B1B2(BDC0,BDC1), end;
into method label GSBI code_regex \(B1DT, replaceall_matched begin (B1B2(B1D4,B1D5), end;
into method label GSBI code_regex \(B2DT, replaceall_matched begin (B1B2(B2D0,B2D1), end;
into method label GBID code_regex \(B1CY, replaceall_matched begin (B1B2(B1C6,B1C7), end;
into method label SMTF code_regex \(BCRT, replaceall_matched begin (B1B2(CRT0,CRT1), end;



//                BARL,   64, // 0x06
//                BARH,   64, // 0x0E
//                SMD0,   256, // 0x1C
//                B1MA,   64, // 0x80
//                B1DN,   64, // 0x88
//                B1CH,   32, // 0x90
//                BARN,   184, // 0xC0

// 32-bit B1CH

into method label B1B4 remove_entry;
into definitionblock code_regex . insert
begin
Method (B1B4, 4, NotSerialized)\n
{\n
    Store(Arg3, Local0)\n
    Or(Arg2, ShiftLeft(Local0, 8), Local0)\n
    Or(Arg1, ShiftLeft(Local0, 8), Local0)\n
    Or(Arg0, ShiftLeft(Local0, 8), Local0)\n
    Return(Local0)\n
}\n
end;

# 32-bit registers
into device label H_EC code_regex B1CH,\s+32 replace_matched begin B1C0,8,B1C1,8,B1C2,8,B1C3,8 end;

# fix 32-bit methods
into method label GSBI code_regex \(B1CH, replaceall_matched begin (B1B4(B1C0,B1C1,B1C2,B1C3), end;

# 64-128 (Buffers)

# utility methods to read/write buffers from/to EC
into method label RE1B parent_label H_EC remove_entry;
into method label RECB parent_label H_EC remove_entry;
into device label H_EC insert
begin
Method (RE1B, 1, NotSerialized)\n
{\n
    OperationRegion(ERAM, EmbeddedControl, Arg0, 1)\n
    Field(ERAM, ByteAcc, NoLock, Preserve) { BYTE, 8 }\n
    Return(BYTE)\n
}\n
Method (RECB, 2, Serialized)\n
// Arg0 - offset in bytes from zero-based EC\n
// Arg1 - size of buffer in bits\n
{\n
    ShiftRight(Add(Arg1,7), 3, Arg1)\n
    Name(TEMP, Buffer(Arg1) { })\n
    Add(Arg0, Arg1, Arg1)\n
    Store(0, Local0)\n
    While (LLess(Arg0, Arg1))\n
    {\n
        Store(RE1B(Arg0), Index(TEMP, Local0))\n
        Increment(Arg0)\n
        Increment(Local0)\n
    }\n
    Return(TEMP)\n
}\n
end;

into method label WE1B parent_label H_EC remove_entry;
into method label WECB parent_label H_EC remove_entry;
into device label H_EC insert
begin
Method (WE1B, 2, NotSerialized)\n
{\n
    OperationRegion(ERAM, EmbeddedControl, Arg0, 1)\n
    Field(ERAM, ByteAcc, NoLock, Preserve) { BYTE, 8 }\n
    Store(Arg1, BYTE)\n
}\n
Method (WECB, 3, Serialized)\n
// Arg0 - offset in bytes from zero-based EC\n
// Arg1 - size of buffer in bits\n
// Arg2 - value to write\n
{\n
    ShiftRight(Add(Arg1,7), 3, Arg1)\n
    Name(TEMP, Buffer(Arg1) { })\n
    Store(Arg2, TEMP)\n
    Add(Arg0, Arg1, Arg1)\n
    Store(0, Local0)\n
    While (LLess(Arg0, Arg1))\n
    {\n
        WE1B(Arg0, DerefOf(Index(TEMP, Local0)))\n
        Increment(Arg0)\n
        Increment(Local0)\n
    }\n
}\n
end;


into device label H_EC code_regex (BARL,)\s+(64) replace_matched begin BARX,%2,//%1%2 end;
into device label H_EC code_regex (BARH,)\s+(64) replace_matched begin BARY,%2,//%1%2 end;
into device label H_EC code_regex (SMD0,)\s+(256) replace_matched begin SMDZ,%2,//%1%2 end;
into device label H_EC code_regex (B1MA,)\s+(64) replace_matched begin B1MX,%2,//%1%2 end;
into device label H_EC code_regex (B1DN,)\s+(64) replace_matched begin B1MY,%2,//%1%2 end;
into device label H_EC code_regex (BARN,)\s+(184) replace_matched begin BARZ,%2,//%1%2 end;


#replacements 64 and 128

// SMD0 written and read in MHPF, read in I2CO, written in CSER

into method label GSBI code_regex \(BARL, replaceall_matched begin (RECB(0x06,64), end;
into method label GSBI code_regex \(BARH, replaceall_matched begin (RECB(0x0E,64), end;
into method label MHPF code_regex \(SMD0, replaceall_matched begin (RECB(0x1C,256), end;
into method label MHPF code_regex Store\s+\(FB4,\s+SMD0\) replace_matched begin WECB(0x1C\,256\,FB4) end;
into method label I2C0 code_regex \(SMD0, replaceall_matched begin (RECB(0x1C,256), end;
into method label _CRS code_regex \(SMD0, replaceall_matched begin (\\_SB.PCI0.LPCB.H_EC.RECB(0x1C,256), end;
into method label _STA code_regex \(SMD0, replaceall_matched begin (RECB(0x1C,256), end;
into method label CSER code_regex \(SMD0, replaceall_matched begin (\\_SB.PCI0.LPCB.H_EC.RECB(0x1C,256), end;
into method label BAT1 code_regex \(B1MA, replaceall_matched begin (RECB(0x80,64), end;
into method label _BIF code_regex \(B1MA, replaceall_matched begin (RECB(0x80,64), end;
into method label GSBI code_regex \(B1MA, replaceall_matched begin (RECB(0x80,64), end;
into method label GSBI code_regex \(B1DN, replaceall_matched begin (RECB(0x88,64), end;

// ^^PCI0.LPCB.H_EC.BARN fix = _SB.PCI0.LPCB.H_EC

into method label BATD code_regex \(RefOf\s+\(\^\^PCI0\.LPCB\.H_EC\.BARN\)\) replaceall_matched begin (\\_SB.PCI0.LPCB.H_EC.RECB(0xC0,184)) end;
382604
(I don't think my battery has 167 cycles and the temperature of 0 degrees, but who cares really...)

macOS battery indicator also works, so does Monity, which by the way I recommend.

I originally thought battery life was awful, then once Spotlight stopped indexing I found out it's 5 hours with Chrome and Spotify (plus 1password, Display Rotation, Boom 3D, Creative Cloud, BetterTouchTool, HWMonitor, Resilio Sync in the background). If you want 10 hours of battery life, get a Macbook Air with an external keyboard for when your space bar breaks two weeks after purchase.

Touchscreen

Apply the following patch:

Code:
The following DSDT patch is required:

1. Find _CRS method in TPD0

2. Replace

Method (_CRS, 0, NotSerialized) // _CRS: Current Resource Settings
{
If (LLess (OSYS, 0x07DC))
{
Return (SBFI)
}

If (LEqual (SDM1, Zero))
{
Return (ConcatenateResTemplate (SBFB, SBFG))
}

Return (ConcatenateResTemplate (SBFB, SBFI))
}

with

Method (_CRS, 0, NotSerialized) // _CRS: Current Resource Settings
{
Return (ConcatenateResTemplate (SBFB, SBFG))
}
As mentioned, you will get basic mouse functionality. The funny thing is that you have to touch the screen once with a finger before the pen is recognised. I have no clue why, it's kind of funny. If I manage to get the pen to transmit pressure level somehow, I'll update the guide.

USB

I used RehabMan's guide (get used to this phrase). My USBs work like this:

HS01 – internal
HS03 – USB-C paired with SS01
HS05 – "IOUSBDevice" = fingerprint reader which doesn't work anyway – remove as well, it interfers with sleep!
HS06 – USB-C paired with SS02
HS07 – USB-A paired with SS01 (if you start the laptop with something connected to USB-C you get two pairings with SS01, both with different memory addresses – 03000000 and 14b00000)
HS08 – Wifi/Bluetooth

My SSDT-UIAC:

Code:
// SSDT-UIAC-ALL.dsl
//
// This SSDT can be used as a template to build your own
// customization for USBInjectAll.kext.
//
// This SSDT contains all ports, so using it is the same as without
// a custom SSDT.  Delete ports that are not connected or ports you
// do not need.
//
// Change the UsbConnector or portType as needed to match your
// actual USB configuration.
//
// Note:
// portType=0 seems to indicate normal external USB2 port (as seen in MacBookPro8,1)
// portType=2 seems to indicate "internal device" (as seen in MacBookPro8,1)
// portType=4 is used by MacBookPro8,3 (reason/purpose unknown)
//

DefinitionBlock ("", "SSDT", 2, "hack", "_UIAC", 0)
{
    Device(UIAC)
    {
        Name(_HID, "UIA00000")

        Name(RMCF, Package()
        {
            "8086_9d2f", Package()  // was: 0x9dxx
            {
                "port-count", Buffer() { 15, 0, 0, 0 },
                "ports", Package()
                {
                    "HS01", Package() // All internal
                    {
                        "UsbConnector", 255,
                        "port", Buffer() { 1, 0, 0, 0 },
                    },
                    "HS03", Package() // USB-C
                    {
                        "UsbConnector", 3,
                        "port", Buffer() { 3, 0, 0, 0 },
                    },
                    "HS06", Package() // USB-C
                    {
                        "UsbConnector", 3,
                        "port", Buffer() { 6, 0, 0, 0 },
                    },
                    "HS07", Package() // ?
                    {
                        "UsbConnector", 3,
                        "port", Buffer() { 7, 0, 0, 0 },
                    },
                    "HS08", Package() // Bluetooth
                    {
                        "UsbConnector", 255,
                        "port", Buffer() { 8, 0, 0, 0 },
                    },
                    "SS01", Package()
                    {
                        "UsbConnector", 9,
                        "port", Buffer() { 13, 0, 0, 0 },
                    },
                    "SS02", Package()
                    {
                        "UsbConnector", 9,
                        "port", Buffer() { 14, 0, 0, 0 },
                    },
                    "USR1", Package()
                    {
                        "UsbConnector", 3,
                        "port", Buffer() { 11, 0, 0, 0 },
                    },
                    "USR2", Package()
                    {
                        "UsbConnector", 3,
                        "port", Buffer() { 12, 0, 0, 0 },
                    },
                },
            },
        })
    }
}

//EOF
I have no clue what the USR1 and USR2 do, if anything, but since I'm below 15 port limit I just left them in. Compile the code above to AML and put in ACPI/patched/SSDT-UIAC.aml

For hotplugging I used the following patch, adapted from @KNNSpeed, replacing RP15 with RP01:

Code:
DefinitionBlock ("", "SSDT", 2, "hack", "TYPC", 0x00000000)
{
    External (_SB_.PCI0.RP01.PXSX, DeviceObj)    // (from opcode)

        Scope (\_SB.PCI0.RP01.PXSX) //UPSB
        {
            // This is the key fix for machines that turn off the Type-C port, right here.
            Method (_RMV, 0, NotSerialized)  // _RMV: Removal Status
            {
                Return (One) // Returning 0 means not a removable device. But we want to act like an ExpressCard! (credit dpassmor)
            }

            Method (_DSM, 4, NotSerialized)
            {
                Store (Package (0x02)
                {
                    "PCI-Thunderbolt",
                    One
                },
                Local0)
                Return (Local0)
            }

            Device (TBL1) //DSB0
            {
                Name (_ADR, Zero)  // _ADR: Address

                Method (_RMV, 0, NotSerialized)  // _RMV: Removal Status
                {
                  Return (Zero)
                }
                 //The NHI is here. This gives us a real name for the device instead of just a device ID in IOReg
                  Device (NHI0)
                  {
                      Name (_ADR, Zero)  // _ADR: Address
                      Name (_STR, Unicode ("Thunderbolt"))  // _STR: Description String

                      Method (_RMV, 0, NotSerialized)  // _RMV: Removal Status
                      {
                          Return (Zero)
                      }

                      Method (_DSM, 4, NotSerialized)  // _DSM: Device-Specific Method
                      {
                        Local0 = Package (0x03)
                        {
                            "power-save",
                            One,
                            Buffer (One)
                            {
                                 0x00
                            }
                        }
                        Return (Local0)
                      }

                      //TODO: May need more code here (?)

                  }

            }

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

                Method (_RMV, 0, NotSerialized)  // _RMV: Removal Status
                {
                  Return (Zero)
                }

                //TODO: Gonna need a lot more code here for TB support...

                Device (TBLU) //UPS0 on DSB1
                {
                  Name (_ADR, Zero)

                  Method (_RMV, 0, NotSerialized)  // _RMV: Removal Status
                  {
                    Return (One)
                  }

                  Device (TB00) //DSB0
                  {
                    Name (_ADR, Zero)

                    Method (_RMV, 0, NotSerialized)  // _RMV: Removal Status
                    {
                      Return (One)
                    }

                    Device (DEV0) //DEV0
                    {
                      Name (_ADR, Zero)

                      Method (_RMV, 0, NotSerialized)  // _RMV: Removal Status
                      {
                        Return (One)
                      }
                    }
                  }
                  ///////////////////////////////////////////////
                  Device (TB03) //DSB3
                  {
                    Name (_ADR, 0x00030000)

                    Method (_RMV, 0, NotSerialized)  // _RMV: Removal Status
                    {
                      Return (One)
                    }
                    Device(TB3U) //UPS0
                    {
                      Name (_ADR, Zero)

                      Method (_RMV, 0, NotSerialized)  // _RMV: Removal Status
                      {
                        Return (One)
                      }
                      Device(TB30) //DSB0
                      {
                        Name (_ADR, Zero)

                        Device(DEV0) //DEV0
                        {
                          Name (_ADR, Zero)
                        }
                      }
                      Device (TB33) //DSB3
                      {
                        Name (_ADR, 0x00030000)

                        Method (_RMV, 0, NotSerialized)  // _RMV: Removal Status
                        {
                          Return (One)
                        }

                        Device (DEV0) //DEV0
                        {
                          Name (_ADR, Zero)

                          Method (_RMV, 0, NotSerialized)  // _RMV: Removal Status
                          {
                            Return (One)
                          }
                        }
                      }
                      Device (TB34) //DSB4
                      {
                        Name (_ADR, 0x00040000)

                        Method (_RMV, 0, NotSerialized)  // _RMV: Removal Status
                        {
                          Return (One)
                        }

                        Device (DEV0) //DEV0
                        {
                          Name (_ADR, Zero)

                          Method (_RMV, 0, NotSerialized)  // _RMV: Removal Status
                          {
                            Return (One)
                          }
                        }
                      }
                      Device (TB35) //DSB5
                      {
                        Name (_ADR, 0x00050000)

                        Method (_RMV, 0, NotSerialized)  // _RMV: Removal Status
                        {
                          Return (One)
                        }
                      }
                      Device (TB36) //DSB6
                      {
                        Name (_ADR, 0x00060000)

                        Method (_RMV, 0, NotSerialized)  // _RMV: Removal Status
                        {
                          Return (One)
                        }
                      }
                    }
                  }
                  ///////////////////////////////////////////////
                  Device (TB04) //DSB4
                  {
                    Name (_ADR, 0x00040000)

                    Method (_RMV, 0, NotSerialized)  // _RMV: Removal Status
                    {
                      Return (One)
                    }
                    Device(TB4U) //UPS0
                    {
                      Name (_ADR, Zero)

                      Method (_RMV, 0, NotSerialized)  // _RMV: Removal Status
                      {
                        Return (One)
                      }
                      Device(TB40) //DSB0
                      {
                        Name (_ADR, Zero)

                        Device(DEV0) //DEV0
                        {
                          Name (_ADR, Zero)

                          Method (_RMV, 0, NotSerialized)  // _RMV: Removal Status
                          {
                            Return (One)
                          }
                        }
                      }
                      Device (TB43) //DSB3
                      {
                        Name (_ADR, 0x00030000)

                        Method (_RMV, 0, NotSerialized)  // _RMV: Removal Status
                        {
                          Return (One)
                        }

                        Device (DEV0) //DEV0
                        {
                          Name (_ADR, Zero)

                          Method (_RMV, 0, NotSerialized)  // _RMV: Removal Status
                          {
                            Return (One)
                          }
                        }
                      }
                      Device (TB44) //DSB4
                      {
                        Name (_ADR, 0x00040000)

                        Method (_RMV, 0, NotSerialized)  // _RMV: Removal Status
                        {
                          Return (One)
                        }

                        Device (DEV0) //DEV0
                        {
                          Name (_ADR, Zero)

                          Method (_RMV, 0, NotSerialized)  // _RMV: Removal Status
                          {
                            Return (One)
                          }
                        }
                      }
                      Device (TB45) //DSB5
                      {
                        Name (_ADR, 0x00050000)

                        Method (_RMV, 0, NotSerialized)  // _RMV: Removal Status
                        {
                          Return (One)
                        }
                      }
                      Device (TB46) //DSB6
                      {
                        Name (_ADR, 0x00060000)

                        Method (_RMV, 0, NotSerialized)  // _RMV: Removal Status
                        {
                          Return (One)
                        }
                      }
                    }
                  }
                  ///////////////////////////////////////////////
                  Device (TB05) //DSB5
                  {
                    Name (_ADR, 0x00050000)

                    Method (_RMV, 0, NotSerialized)  // _RMV: Removal Status
                    {
                      Return (One)
                    }
                  }
                  Device (TB06) //DSB6
                  {
                    Name (_ADR, 0x00060000)

                    Method (_RMV, 0, NotSerialized)  // _RMV: Removal Status
                    {
                      Return (One)
                    }
                  }
                }
            }

            Device (TBL3) //DSB2
            //USB port works; we're done here.
            {
                Name (_ADR, 0x00020000)  // _ADR: Address

                Method (_RMV, 0, NotSerialized)  // _RMV: Removal Status
                {
                    Return (Zero)
                }

                Device (TBTU)
                {
                    Name (_ADR, Zero)  // _ADR: Address

                    Name (_PRW, Package (0x02)  // _PRW: Power Resources for Wake
                    {
                      0x6D,
                      Zero
                    })


                    Device (RHUB)
                    {
                        Name (_ADR, Zero)  // _ADR: Address
                        Method (GPLD, 2, Serialized)
                        {
                            Name (PCKG, Package (0x01)
                            {
                                Buffer (0x10) {}
                            })
                            CreateField (DerefOf (PCKG [Zero]), Zero, 0x07, REV)
                            REV = One
                            CreateField (DerefOf (PCKG [Zero]), 0x40, One, VISI)
                            VISI = Arg0
                            CreateField (DerefOf (PCKG [Zero]), 0x57, 0x08, GPOS)
                            GPOS = Arg1
                            Return (PCKG)
                        }

                        Method (GUPC, 1, Serialized)
                        {
                            Name (PCKG, Package (0x04)
                            {
                                Zero,
                                0xFF,
                                Zero,
                                Zero
                            })
                            PCKG [Zero] = Arg0
                            Return (PCKG)
                        }

                        Method (TPLD, 2, Serialized)
                        {
                            Name (PCKG, Package (0x01)
                            {
                                Buffer (0x10) {}
                            })
                            CreateField (DerefOf (PCKG [Zero]), Zero, 0x07, REV)
                            REV = One
                            CreateField (DerefOf (PCKG [Zero]), 0x40, One, VISI)
                            VISI = Arg0
                            CreateField (DerefOf (PCKG [Zero]), 0x57, 0x08, GPOS)
                            GPOS = Arg1
                            CreateField (DerefOf (PCKG [Zero]), 0x4A, 0x04, SHAP)
                            SHAP = One
                            CreateField (DerefOf (PCKG [Zero]), 0x20, 0x10, WID)
                            WID = 0x08
                            CreateField (DerefOf (PCKG [Zero]), 0x30, 0x10, HGT)
                            HGT = 0x03
                            Return (PCKG)
                        }

                        Method (TUPC, 1, Serialized)
                        {
                            Name (PCKG, Package (0x04)
                            {
                                One,
                                Zero,
                                Zero,
                                Zero
                            })
                            PCKG [One] = Arg0
                            Return (PCKG)
                        }

                        Device (UB21)
                        {
                            Name (_ADR, One)  // _ADR: Address
                            Method (_UPC, 0, NotSerialized)  // _UPC: USB Port Capabilities
                            {
                                Return (TUPC (0x09))
                            }

                            Method (_PLD, 0, NotSerialized)  // _PLD: Physical Location of Device
                            {
                                Return (TPLD (One, One))
                            }
                        }

                        Device (UB22)
                        {
                            Name (_ADR, 0x02)  // _ADR: Address
                            Method (_UPC, 0, NotSerialized)  // _UPC: USB Port Capabilities
                            {
                                Return (GUPC (Zero))
                            }

                            Method (_PLD, 0, NotSerialized)  // _PLD: Physical Location of Device
                            {
                                Return (GPLD (Zero, Zero))
                            }
                        }

                        Device (UB31)
                        {
                            Name (_ADR, 0x03)  // _ADR: Address
                            Method (_UPC, 0, NotSerialized)  // _UPC: USB Port Capabilities
                            {
                                Return (TUPC (0x09))
                            }

                            Method (_PLD, 0, NotSerialized)  // _PLD: Physical Location of Device
                            {
                                Return (TPLD (One, One))
                            }
                        }

                        Device (UB32)
                        {
                            Name (_ADR, 0x04)  // _ADR: Address
                            Method (_UPC, 0, NotSerialized)  // _UPC: USB Port Capabilities
                            {
                                Return (GUPC (Zero))
                            }

                            Method (_PLD, 0, NotSerialized)  // _PLD: Physical Location of Device
                            {
                                Return (GPLD (Zero, Zero))
                            }
                        }
                    }
                }
            }
        }
}
Compile with maciASL and put in ACPI/patched as SSDT-TYPC.aml

Energy management

ACPIBatteryManagement is a must, of course. See above for USB patching.
Ensure config.plist/KernelAndKextPatches/KernelPm=true and that SMBIOS is MacBookPro14,1.
Use config.plist/ACPI/SSDT/Generate/PluginType=true
I tried RehabMan's SSDT-XCPM, made no difference that I could notice. It's still in my ACPI/patched, because the laptop works and I'm not going to delete it just to see whether I can break something.

Sleep (updated 7 February 2019)

Sleep: works both on Apple logo > sleep and on closing lid. Wake only by power button (so far).

The first step for me was this article: https://pikeralpha.wordpress.com/2017/01/12/debugging-sleep-issues/
I don't have PMStatusCode, but as I later found out it's unnecessary as long as I can get to actually doing a sleep/wake cycle, upon which the other values will appear in IOReg.

I used the patch Pike quotes and saved it as SSDT-SLEP in my ACPI/patched folder. Attached the AML version. Code:

Code:
DefinitionBlock ("", "SSDT", 1, "Pike", "MISC", 0x00003000)
{
    External (_SB_.PCI0, DeviceObj)    // (from opcode)

    Scope (\)
    {
        Name (SLTP, Zero)
        Method (_TTS, 1, NotSerialized)  // _TTS: Transition To State
        {
            Store ("Method (_TTS) called", Debug)
            Store (Arg0, SLTP)
        }
    }

    Scope (\_SB.PCI0)
    {
        Method (LPS0, 0, NotSerialized)
        {
            Store ("Method (LPS0) called", Debug)
            Return (One)
        }
    }

    Scope (\_GPE)
    {
        Method (LXEN, 0, NotSerialized)
        {
            Store ("Method (LXEN) called", Debug)
            Return (One)
        }
    }

    Scope (\_SB) // might not be needed, but works
    {
        Method (LPS0, 0, NotSerialized)
        {
            Store ("Method \\_SB._LPS0 Called", Debug)
            Return (One)
        }
    }
}
There was an unfortunate problem, though. When I woke the laptop up from sleep, the screen stayed black and required me to shut the lid and open it again. DebugACPI showed me that the power button wake did not check the actual status of the lid, assuming it was closed. This is how I handled it (inspired by this thread)

Code:
            Device (LID0)
            {
                Name (_HID, EisaId ("PNP0C0D"))  // _HID: Hardware ID
                Method (_STA, 0, NotSerialized)  // _STA: Status
                {
                    Return (0x0F)
                }

                Method (_LID, 0, NotSerialized)  // _LID: Lid Status
                {
                   Return (LIDS)
                }
              
            // ADD THE PATCH BELOW
              
                Name (_PRW, Package (0x02)    // Added for wake resource, this adds "lidwake" to pmset -g even though lidwake still doesn't work
                {
                    0x1B,
                    0x03
                })
              
            }
          
            Scope (\_GPE)
            {
                Method (_L1B, 0, NotSerialized)    // Wake notifier for LID0 – this wakes up the screen when power button is pressed
                {
                    Notify (\_SB.PCI0.LPCB.H_EC.LID0, 0x02)
                }
            }

            // PATCH ENDS
If you're curious, changing the EDID values (using FixEDID) causes the following:
– iMac display, iMac retina display = black screen on startup
– Macbook Pro: disables scaling
– Macbook Air: disables scaling AND lowers the resolution to the point where you can see pixels (yay?)
– Cinema HD: resolution becomes 4K and scaling is disabled
– Thunderbolt display: sleep doesn't disable backlight, so that's an "improvement", but frankly I've seen better results

Putting the computer to sleep all night depleted the battery by 20% within 8.5 hours – I believe that's typical for Hackintosh laptops. No crashes, no problems on wake, sound works, USB works, etc. Remark: the LED in the power button stays on.

Remember this laptop controls keyboard backlight in hardware. When you open the lid, the screen is black, yet keys backlit, this does NOT mean the laptop is awake. Use Caps Lock to check – if the LED switches on and off, the laptop is awake, if not, it's still sleeping.

Sound

Note: updating AppleALC to latest version breaks the sound and no matter what I do with the layouts it doesn't work. Stick with 1.3.4 or try to resolve the problem and let us know how it went.


Using the vanilla, untouched AppleHDA from Mojave and AppleALC, enforce layout 3 for AppleALC and 7 for AppleHDA as shown earlier. I have no idea why alcid parameter gets ignored. Leave all the ALC298 and ALC298a etc. patches alone, they don't change anything at all. Apple layouts that work are 3, 29, 66. I use 3. It doesn't detect the KabyLake codec HDMI audio – it's a separate codec, there's a chance it would work with a different codec – if someone can be bothered to fix that, let me know and I'll add it to the guide.


Final words

Keep backups of everything and I don't mean just on Time Machine. Carbon Copy Cloner is your best friend. Buy it. Once you manage to install everything on the external SSD, use CCC to copy it to the internal one. Remember EFI partition is not copied with CCC and you have to do it manually!

– Clover Configurator > Mount EFI > mount the internal EFI partition
– copy your EFI folder (I keep mine in Dropbox together with source codes of everything and date of last modification)
– unmount the internal EFI partition
– don't forget to install Clover on the copied drive as well!!!
– mount the CCC EFI partition (please make sure to create one first...)
– copy the EFI folder in there
– done

Windows and Ubuntu updates or grub-updates will always overwrite your default bootloader. Go to BIOS and change the order so that Clover EFI is the first again. Problem = solved. Since I found a way to replace Aptio* with OsxAptio* fix, Ubuntu loads from the boot screen without problems.

Note: OsxAptio* seems to break access to the Recovery partition, so decide what's more important for you – I like having triple boot, a cloned drive, Time Machine backup, plus a USB stick with working install of Mojave. In order to boot into Safe Mode you will have to use Clover Bootloader's Options > Graphics Injector > set platform-id to 0x12345678.


Thanks

RehabMan, Feartech, KNNSpeed, acidanthera, Pike R. Alpha, jaymonkey, ayilm1, and everyone whose patches I used and forgot to write down the credits :(

*​

I think that's it. I do not guarantee it will work with any other model than i7/4K, let me know if it does.
 

Attachments

Last edited:
Joined
Feb 1, 2019
Messages
2
Motherboard
Asus N46JV
CPU
Intel Core i7 4600 HQ
Graphics
GeForce GT750M
Awesome..
Hi man, im plan to buy this laptop (4K/i7)..

Can you Upload your EFI file to this Thread?
 
Joined
Jan 26, 2019
Messages
17
Motherboard
NUC7I7DNKE
CPU
i7-8650U
Graphics
UHD620
Graphics

Inject Intel
ig-platform-id: 0x59160000
Admittedly, I'm not the expert when it comes to framebuffers and platform id's but isn't that the platform id for a desktop? I thought the platform id for a laptop was 0x591B0000.
 
Joined
Oct 31, 2014
Messages
104
Motherboard
Lenovo LNVNB161216
CPU
i7-8550U
Graphics
UHD 620 (3840x2160)
Mobile Phone
Android
Awesome..
Hi man, im plan to buy this laptop (4K/i7)..

Can you Upload your EFI file to this Thread?
Sure. Bear in mind, though, that my setup is for three OSes (I removed Microsoft and Ubuntu folders), and you can't reuse my DSDT. APPLE > EXTENSIONS > firmware.scap is 15 MB – no clue why that is, but I'm not going to delete it to see what happens, even though (actual Apple) forums mention it might just be an unneeded security update. If you feel like experimenting, let me know the results!

Admittedly, I'm not the expert when it comes to framebuffers and platform id's but isn't that the platform id for a desktop? I thought the platform id for a laptop was 0x591B0000.
Tested: 591B0000 doesn't seem to change anything, 5917 – even though according to Windows that's the correct number – disables acceleration and takes me back to 31 MB VRAM according to "About this Mac". I hoped either 591B or 5917 would enable lidwake, alas, no. Moving on to darkwake=4 for the next reboot...since I have one problem to solve...

Steps to reproduce problem:
  1. Put the laptop to sleep
  2. Whisper "sweet dreams, baby"
  3. Wake it by opening the lid and pressing power button for 2 seconds
  4. Stare at the blank screen for a few seconds, wondering what happened, especially if you had no coffee yet
  5. Shut the lid
  6. Open it again
  7. It Just Works (TM)

I tried to google why the hell would I need to open the lid twice, but either I don't know how to phrase it correctly or I'm super unique in this aspect. Or I have a mistake in one of the many patches and SSDTs used. Or a wrong darkwake value. Or... EnableLidWake.kext doesn't work, by the way, pmset -g doesn't list lidwake as a value at all, sudo pmset -a lidwake 1 does nothing. This morning, after overnight sleep (with five darkwakes for Power Nap, I checked the log) I suddenly had lidwake working once, then when I put the laptop to sleep for 15 minutes suddenly it didn't work anymore. Again, at this point I don't have to worry about shutting the laptop and needing to reboot it afterwards, which is good enough for me.


See first post for solution. Zipper Clover folder below updated February 7, 2019.
 

Attachments

Last edited:
Joined
Jun 22, 2011
Messages
146
Motherboard
Lenovo C930-13 IKB-Clover
CPU
i7-8550U
Graphics
UHD620, 3840 x 2160
Mac
MacBook Pro
Mobile Phone
iOS
Hey there. I’ll be buying this laptop here soon.

As for your WiFi, did you need to whitelist it in the bios or did it just “work”?

Super awesome guide. I’m in love with this laptop and I’m really glad it can be hacked!



EDIT: Also saw there is a C930 Glass. Looks to have the exact same internals, just a different outside. Should be safe to still use this guide, correct?
 
Last edited:
Joined
Oct 31, 2014
Messages
104
Motherboard
Lenovo LNVNB161216
CPU
i7-8550U
Graphics
UHD 620 (3840x2160)
Mobile Phone
Android
Hi,

sorry, the forum didn't send me notifications about those posts.

  1. Wifi didn't need any whitelisting (this BIOS is super basic, I'd have to hack into it and reflash, I'm not that brave). Just replaced it, added the Brcm* kexts, works.
  2. The OsxAptio – I believe (IIRC) the key was adding EmuVariableUefi-64.efi, but if you don't intend to triple boot like I do, AptioMemoryFix-64 will work for you.
  3. As for the Glass I have no faintest clue. In fact I only found out it existed last week. I think it's the same internals in a different chassis though.
*

A problem I can't fix yet is lidwake, or in fact any form of wake without using the power button. The thread I "borrowed" from to enable the screen on wake has an extra method:

Code:
    Method (_LID, 0, NotSerialized)  // _LID: Lid Status
    {
        If (MYEC)    // If EC enabled
        {
            Store (LIDS, Local0)
        }
        Else
        {
            Store (One, Local0)    // Assume LID is open
        }


        Return (Local0)
    }
Mine just returns LIDS. Unfortunately I can't figure out what to replace MYEC with. I tried to dig into various _WAK methods, then simply replaced Return (LIDS) with Return (One), but that of course broke sleep due to "user active". Any ideas?
 
Last edited:
Joined
Jun 22, 2011
Messages
146
Motherboard
Lenovo C930-13 IKB-Clover
CPU
i7-8550U
Graphics
UHD620, 3840 x 2160
Mac
MacBook Pro
Mobile Phone
iOS
Hi,

sorry, the forum didn't send me notifications about those posts.

  1. Wifi didn't need any whitelisting (this BIOS is super basic, I'd have to hack into it and reflash, I'm not that brave). Just replaced it, added the Brcm* kexts, works.
  2. The OsxAptio – I believe (IIRC) the key was adding EmuVariableUefi-64.efi, but if you don't intend to triple boot like I do, AptioMemoryFix-64 will work for you.
  3. As for the Glass I have no faintest clue. In fact I only found out it existed last week. I think it's the same internals in a different chassis though.

Awesome. I think I'm going to get the glass version. It's cheaper and I think it looks nicer. Cheers!

Edit: I DO plan on at least dual booting though. Ideally, I'd like a partition for macOS, Windows 10, and then a third partition for exFAT so I can move files between the two systems without the use of a cloud or thumb drive. Since I'll be doing that, do I need to use EmuVariableUfi-64.efi?
 
Last edited:
Joined
Jun 22, 2011
Messages
146
Motherboard
Lenovo C930-13 IKB-Clover
CPU
i7-8550U
Graphics
UHD620, 3840 x 2160
Mac
MacBook Pro
Mobile Phone
iOS
Just ended up purchasing the normal non-glass version to be safe. Probably would work anyway, but the more I thought about it, I'll be travelling A LOT with this laptop and I'd be really concerned about the glass scratching or cracking or something in my backpack.

You mentioned too that the SSD in your laptop was incompatible with macOS. What was the SSD that shipped with your laptop?

EDIT: This is the same WIFI card you purchased, correct? https://www.ebay.com/itm/Broadcom-BCM94352Z-DW1560-6XRYC-802-11-AC-867-Mbps-Bluetooth-4-0-WIFI-WLAN-Card/272204993348?epid=1865142209&hash=item3f60ae9344:g:wdoAAOSw-KFXeSpi:rk:1:pf:0&LH_BIN=1
 
Last edited:
Joined
Oct 31, 2014
Messages
104
Motherboard
Lenovo LNVNB161216
CPU
i7-8550U
Graphics
UHD 620 (3840x2160)
Mobile Phone
Android
Edit: I DO plan on at least dual booting though. Ideally, I'd like a partition for macOS, Windows 10, and then a third partition for exFAT so I can move files between the two systems without the use of a cloud or thumb drive. Since I'll be doing that, do I need to use EmuVariableUfi-64.efi?
I wouldn't think so. The only reason I went for the OsxAptio+Emu solution was that Ubuntu wouldn't boot.

You mentioned too that the SSD in your laptop was incompatible with macOS. What was the SSD that shipped with your laptop?
Some sort of super extra blazing fast and unusable Samsung. PM961, I think.

And yes, it's the same card, but first check out the feedback of the seller just in case. Apparently sometimes they, ahem, accidentally brand them incorrectly.

Oh, and the screen didn't wake up this morning, so back to the drawing board I go... It's a very particular set of events. If, and only if the sleep is triggered by lid close, the screen will not wake up. I feel that the last state of the lid is remembered (so, when you close it, closed) and it is not re-checked upon wake. 15 years ago this computer would be bringing me coffee and doing the dishes by now.
 
Last edited:
Joined
Jun 22, 2011
Messages
146
Motherboard
Lenovo C930-13 IKB-Clover
CPU
i7-8550U
Graphics
UHD620, 3840 x 2160
Mac
MacBook Pro
Mobile Phone
iOS
I wouldn't think so. The only reason I went for the OsxAptio+Emu solution was that Ubuntu wouldn't boot.


Some sort of super extra blazing fast and unusable Samsung. PM961, I think.

And yes, it's the same card, but first check out the feedback of the seller just in case. Apparently sometimes they, ahem, accidentally brand them incorrectly.

Oh, and the screen didn't wake up this morning, so back to the drawing board I go... It's a very particular set of events. If, and only if the sleep is triggered by lid close, the screen will not wake up. I feel that the last state of the lid is remembered (so, when you close it, closed) and it is not re-checked upon wake. 15 years ago this computer would be bringing me coffee and doing the dishes by now.

Awesome. I MAY do a Linux distro as well, but probably unlikely. My line of thinking is that it would be pretty unneeded to have BOTH macOS and Linux.

Ahhh yeah, it was probably the PM981 or PM961. I think those are infamous for not working on macOS. I'm thinking I may just do the Samsung 970 EVO just to be safe, but I would like to get a SPX6800 or something and save some money.

I don't mind too much if sleep doesn't work, but it'd be awesome if you got it working! I just ordered my today and lenovo is telling me 3-4 weeks to ship. I'll keep you updated!

Also, did check about the wifi card. It is what they say it is. The seller has 99.5% rep and the name of the card is imprinted on the chip.

Super excited!
 
Top