Whee, I see some crazy paranoia on the news sites, and I figured I'd chime in having had to deal with weird DVI->HDMI conversion in the past.. On Tue, Oct 8, 2013 at 3:29 AM, Christian König <deathsimple@xxxxxxxxxxx> wrote: > > So the poor little one which came with the gfx card should be sufficient, > but if you want to use fglrx + some other adapter you might run into > problems. As far as I can tell, these dongles are exclusively converting from dual-link DVI or standard DVI ports on high-end graphics cards into HDMI ports so that you can just connect an HDMI display (most likely a TV) to them. This is no conversion at all, really - the transmission encoding (TMDS) is identical, the pins and levels and signals are identical up to the point DVI is defined, and HDMI was designed with this "compatibility" in mind. The difference is entirely down to the content and type of the frames (as in packetized data, not framebuffers) being transmitted, HDMI interleaves a huge bunch of stuff between what would otherwise be pauses in the data stream (actually the various porches and synchronization intervals) on DVI. This includes audio, but also things like HDMI infoframes (there are a lot of different kinds of these). The question is simple; given a card with only a DVI connector, but the possibility to connect to HDMI or even DisplayPort, how do you tell if you should be generating these extra frames be interleaved in the data stream, in these spaces where a monitor may assume nothing at all is being transmitted and/or useful? The answer is super complicated. The only way you can tell your monitor is "HDMI" and "supports audio" is seeing a CEA extension block or two, one containing the HDMI vendor OUI (this means this thing says it should be HDMI compliant, but that doesn't actually MEAN anything in real life, in my experience) and one containing audio acceptance information (frequency, bits, rates, compression methods, which is also often wrong). I have had plenty of monitors which have both an HDMI port and a DVI port on the back. Both of them respond with identical EDID information. The DVI port - while perfectly possible that it could support audio as above - doesn't do audio. In fact, if you enable *ANY* extra HDMI infoframes like AVI, SPD or so, what you get is a random resolution failing to work or if you enable audio, it manifests as a huge pink line down the side of the screen, or a skewed display (the left edge of the screen starts around half way in horizontally, and as it progresses down vertically it gets closer to the real left edge of the panel - so if you had anything important in the top right of your screen, you wouldn't have a good day..). Others just go black, others say "No Signal" or "Unsupported Timing" (which is ironic since the timings were from the EDID detail timings or the CEA spec) Note, if your driver didn't parse the EDID properly and just lets you "force enable" audio or "HDMI mode", or if somehow the driver starts off with an assumption about being HDMI.. on an old DVI monitor, too, you'll get the same stuff happen. What is inside the monitor described above is two decoders, one on the HDMI side connected to the LCD, and one on the DVI side connected to the LCD, for some reason both are converted to parallel RGB and shunted through an external encoder to the panel. The HDMI decoder is hooked up to the speakers.. the DVI one is not. I also have had access to a couple TVs where HDMI audio *does not work* on the side or "HDMI 3" port on the back of the TV. There are FAQs on the vendor site that say, if it doesn't work, try connecting it to "HDMI 1". I broke this one open and it has two HDMI decoders connected into the system, and a quick check at the time showed that they are dual-input decoders with i2s audio output to a codec and display data to a panel. So to get 4 HDMI inputs on the TV they needed two chips. A single-chip, 4-input decoder didn't exist at the time. It turns out the "other" one is actually a DVI product - no audio, just DVI->panel. >From a design point of view the monitor vendor saved all of a few cents on eeprom flashing/manufacture costs, or by not buying a micro-controller with i2c that has space for an extra couple 128 byte binary blobs. After all, if you can fit your entire EDID and DDC/CI stuff into a chip with 1KiB of flash, and then you start thinking you need 256 or 512 bytes more to store "different" EDIDs, you have to move up to a 2KiB controller, which could be a mite more expensive. For 10 million TVs, half a cent per TV extra is a lot of money on the production run. Additionally, if you don't do DDC/CI then your driver could be made very simple if all your had to do was send parts of a single 128 byte array over the bus. No addressing, save space on pointers.. less guys in the software department to employ, and less time spent writing it in the first place. I've seen designs where the EDID for some ports says it has audio support, but actually the second HDMI decoder doesn't have a codec where it needs to be (and there are empty solder pads on the PCB for one.. they cheaped out by not putting it). In the end, the monitor *is* HDMI compliant, and does have speakers, and does accept those audio formats. Just not on the DVI port, or certain HDMI port, for the reasons above. So.. the EDID 'lies.' ~ So.. Assuming the default state is DVI mode with no audio or HDMI frames, plugging in a dongle changes NOTHING from the graphics card encoder's point of view, or even from an electrical point of view. There is NO way to detect if you have an HDMI cable vs a DVI cable without invoking something HDMI-specific which simply isn't reliable. On my monitor above, connecting a DVI cable to the DVI port on the monitor and the card gives me a good display, and I can even display CEA modes - in terms of display timings - as long as I make for sure that it is not sending AVI infoframes or audio along with them. If I connect HDMI to HDMI, audio works. If I bridge the HDMI port via a DVI adapter or two (HDMI-in <- DVI-HDMI <- HDMI-DVI<- DVI-cable <- HDMI-out) then *audio still works*, although this is total overkill.. no ATI customer would bother with this. Let's assume ATI decided that the only SANE way to connect was attach dongle to DVI graphics card, then an HDMI cable to an HDMI TV. Because attaching DVI to DVI, 99.9% of the time, means there's no audio capability on the monitor, in comes the magic AMD EEPROM. All it does is allow AMD to instrument a little control via their driver in a world where everything in the physical world outside the GPU ASIC, going outwards to the monitor, is totally screwed over and potentially full of bad data. It gives the Catalyst driver a better grasp over the situation. * If it does not detect any dongle, then the link is 'obviously' DVI to DVI no matter what the EDID says about audio. So don't enable audio, because you can cripple or just screw up a DVI display by putting unexpected data in it's synchronization intervals. * If it does detect the dongle, there is an HDMI cable involved, and an assumption can be made; HDMI TVs which say in the EDID that they can do audio, generally can do audio without trouble. So, enable audio. It may not work.. but that's life. What that ends up as is that for a couple cents cost saving for a million really crappy cheap Walmart TVs, AMD spent a couple cents on their side for every graphics card dongle - and they get more 'predictable' customer experience, because the quality of EDID data is not predictable (or more precisely, it is predictably bad), the production quality of TVs and monitors is not predictable, and in the most common connection configuration they can use some real hardware outside the card to essentially know if they should even bother trying to "be" HDMI compliant vs. falling back to DVI mode. What you get if you do not have the magic EEPROM is drivers making choices and getting them "wrong," causing all kinds of almost unsolvable problems for developers - especially if they don't have that monitor, that exact graphics card and even that exact same DVI->HDMI dongle. One solution is maintain a whitelist or blacklist or both of features to support for each monitor/TV vendor, but you could never hope to keep it maintained properly nor could you find out if there is a weird dongle inbetween that is just wired badly. The other is leaving the decision up to the user, which is just asking for all kinds of trouble. It may be great that the radeonhd driver can drive any HDMI monitor with any dongle and enable audio, but that doesn't guarantee it will work (Christian pretty much said this in the mail I replied to). AMD have a call center and support team to accept "this combination doesn't operate correctly", and a couple cents for every dongle probably meant many, many thousand fewer support queries. ~ My guess for "why AMD did it" is just that - a guess, mostly conjecture from a driver author's point of view, and from someone who has been collecting monitors and testing specific HDMI and DVI support over the past few years. There is no way to, with 100% certainty, know what's connected and if a particular combination of display timing and infoframes would work, and I am pretty accepting of AMD's little solution.. and of the opensource driver letting it be predicated on the EDID being valid, and then on that matter letting whether it's turned on or not be entirely a user choice. But it will cause a bunch of bugzilla entries ;) What I would do is make sure that given the driver detecting that little DVI->HDMI dongle, rather than forcing a change of behavior, you can at least print to a console or fiddle with a different DRM connector type or data definition that says this is one of those 'official' dongles between the card and the monitor. You can rely on the quality of the dongle (wired correctly) *AND* detect it, which means the variations of support above can be rationalized vs. a totally unknown dongle/connector/converter in the way vs. direct connection (the last two can only be detected by asking the 'customer') Have fun, Matt <neko@xxxxxxxxxxxxx> _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel