I got the internal display to work by modifying my DSDT. Using this guide http://blog.stuffedcow.net/2012/07/intel-hd4000-qeci-acceleration/ and diffing a DSDT that made it work, I found that my machine must be allocating 64mb of RAM for video, so adjusting the fields in this section made some differences:
Method (_DSM, 4, NotSerialized)
{
Store (Package (0x08)
{
"AAPL00,DualLink",
Buffer (0x04)
{
0x01, 0x00, 0x00, 0x00
},
"AAPL,ig-platform-id",
Buffer (0x04)
{
0x02, 0x00, 0x66, 0x01
},
"hda-gfx",
Buffer (0x0A)
{
"onboard-1"
},
"model",
Buffer (0x17)
{
"Intel HD Graphics 4000"
}
}, Local0)
DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
Return (Local0)
}
Changing the values of the Package (as shown by a different DSDT that got the internal display working) and the first octet of the platform ID got some things working, according to this table:
Package PlatformID#1 Internal HDMI
0x08 0x02 No No
0x08 0x03 No YES
0x08 0x08 No Garbled
0x08 0x09 No Garbled
0x0C 0x02 Yes No
0x0C 0x03 Yes No
0x0C 0x08 Yes No
0x0C 0x09 Yes No
I'm new to DSDTs, so I didn't realize that the hex number after Package is the number of key-value pairs that will follow, x2. So, 8 should be correct in this case; that must mean that overrunning the number of fields actually specified (by using 0x0C) must be mangling something farther down, which I guess is disabling the external display and letting the internal work. I'm going to assume that in my particular case, a ig-platform-id of 01660003 (but in little-endian) is correct.
So, at this point, I can use two different copies of an otherwise identical DSDT, one for internal and one for external graphics. The holy grail, of course, is to use BOTH displays, but I would settle for one or the other without a reboot. Any ideas on where to go from here?