I think this is the right place to start. A couple of these look easier to get rid of than others. __HAVE_MTRR and __HAVE_AGP are enabled in every driver except ffb. It should be easy enough to get rid of them. It looks like __HAVE_RELEASE, __HAVE_DMA_READY, __HAVE_DMA_FLUSH, __HAVE_DMA_QUIESCENT, and __HAVE_MULTIPLE_DMA_QUEUES (which looks broken anyway) should also be low-hanging fruit.
If we get that far, I think the next step would be to replace the DRIVER_* macros with a table of function pointers that would get passed around. Since I doubt any of those uses are performance critical, that should be fine.
Then we can start looking at data structure refactoring.
> >If this kind of abuse wasn't so widespread, abstracting this code
> >out into shared sections and driver specific parts would be a lot
> >simpler. Sadly, this is the tip of the iceberg.
> > I think it comes down to the fact that the original DRM developers > wanted templates. C doesn't have them, so they did the "next best" thing.
I vaguelly recall the code at one point not looking quite 'so bad',
it just grew and grew into this monster. I'm sure it was done originally
with the best of intentions, but it seems someone along the line got
a bit carried away.
There was a point when a *lot* of the device-dependent code was still in the OS-dependent directories. This is how the i810 and i830 drivers still are. I think as more of the code got moved into the OS-independent directory, it got less pleasant to read.