After tapeout, we found timing issues and managed to solve them inside the SoC with a metal mask fix that didn't disrupt the ongoing manufacture. Supposedly, timing analysis said there were no issues outside of the SoC, but there is in fact some timing violation in the serial loader that configures GPIO 0 to 18. A bit of investigation managed to pin that down to a simple hold violation between GPIO blocks, and by modeling the error, I was able to figure out how to account for that by shifting bits in the configuration words before running the serial load. The error limits the ways in which the pins can be configured for management-side use, but doesn't cause any problems for user-side use, and all the major management-side functions like running the housekeeping SPI, the SPI master, and the UART are working. Figuring out the configuration bits by hand is painful, so I wrote a little python script which converts a set of configuration values into the values that need to be put into the C file to make the configuration come up the way that it was intended. That script was posted in my thread with Weston. I can also post an example C program, on request.