On Mon, Mar 17, 2014 at 6:01 PM, Eric Anholt <e...@anholt.net> wrote: > Ilia Mirkin <imir...@alum.mit.edu> writes: > >> On Mon, Mar 17, 2014 at 2:42 PM, Ilia Mirkin <imir...@alum.mit.edu> wrote: >>> There are a lot of different pci ids supported by nouveau, and more are >>> added all the time. The relevant distinguisher between drivers is the >>> chipset id. >>> >>> Signed-off-by: Ilia Mirkin <imir...@alum.mit.edu> >>> Cc: "10.1" <mesa-sta...@lists.freedesktop.org> >>> --- >>> >>> I haven't tested this on real hardware yet, but perhaps this is a little >>> less >>> hacky than the former version and will actually work for more than NV05. >>> When >>> I test it out tonight, I'll add a print in there to make sure that it's >>> hitting the expected paths. >>> >>> src/loader/Makefile.sources | 3 +- >>> src/loader/loader.c | 5 +- >>> src/loader/pci_id_driver_map.c | 68 >>> ++++++++++++++++++++++ >>> .../pci_ids => src/loader}/pci_id_driver_map.h | 7 ++- >>> 4 files changed, 80 insertions(+), 3 deletions(-) >>> create mode 100644 src/loader/pci_id_driver_map.c >>> rename {include/pci_ids => src/loader}/pci_id_driver_map.h (90%) >>> >>> diff --git a/src/loader/Makefile.sources b/src/loader/Makefile.sources >>> index 51a64ea..1a1345f 100644 >>> --- a/src/loader/Makefile.sources >>> +++ b/src/loader/Makefile.sources >>> @@ -1,2 +1,3 @@ >>> LOADER_C_FILES := \ >>> - loader.c >>> \ No newline at end of file >>> + loader.c \ >>> + pci_id_driver_map.c >>> diff --git a/src/loader/loader.c b/src/loader/loader.c >>> index 811f8a2..e343f4a 100644 >>> --- a/src/loader/loader.c >>> +++ b/src/loader/loader.c >>> @@ -78,7 +78,7 @@ >>> #endif >>> >>> #define __IS_LOADER >>> -#include "pci_ids/pci_id_driver_map.h" >>> +#include "pci_id_driver_map.h" >>> >>> static void default_logger(int level, const char *fmt, ...) >>> { >>> @@ -352,6 +352,9 @@ loader_get_driver_for_fd(int fd, unsigned driver_types) >>> if (!(driver_types & driver_map[i].driver_types)) >>> continue; >>> >>> + if (driver_map[i].predicate && !driver_map[i].predicate(fd)) >>> + continue; >>> + >>> if (driver_map[i].num_chips_ids == -1) { >>> driver = strdup(driver_map[i].driver); >>> goto out; >>> diff --git a/src/loader/pci_id_driver_map.c b/src/loader/pci_id_driver_map.c >>> new file mode 100644 >>> index 0000000..e5ba9fe >>> --- /dev/null >>> +++ b/src/loader/pci_id_driver_map.c >>> @@ -0,0 +1,68 @@ >>> +/* >>> + * Copyright 2014 Ilia Mirkin >>> + * >>> + * Permission is hereby granted, free of charge, to any person obtaining a >>> + * copy of this software and associated documentation files (the >>> "Software"), >>> + * to deal in the Software without restriction, including without >>> limitation >>> + * the rights to use, copy, modify, merge, publish, distribute, sublicense, >>> + * and/or sell copies of the Software, and to permit persons to whom the >>> + * Software is furnished to do so, subject to the following conditions: >>> + * >>> + * The above copyright notice and this permission notice (including the >>> next >>> + * paragraph) shall be included in all copies or substantial portions of >>> the >>> + * Software. >>> + * >>> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS >>> OR >>> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, >>> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL >>> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR >>> OTHER >>> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING >>> FROM, >>> + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS >>> IN THE >>> + * SOFTWARE. >>> + */ >>> + >>> +#include <string.h> >>> + >>> +#ifndef __NOT_HAVE_DRM_H >>> + >>> +#include <xf86drm.h> >>> +#include <libdrm/nouveau_drm.h> >>> + >>> +int is_nouveau(int fd); >>> +int is_nouveau_vieux(int fd); >>> + >>> +static int >>> +nouveau_chipset(int fd) >>> +{ >>> + struct drm_nouveau_getparam gp; >>> + int chipset, ret; >>> + >>> + memset(&gp, 0, sizeof(gp)); >>> + gp.param = NOUVEAU_GETPARAM_CHIPSET_ID; >>> + gp.value = &chipset; >>> + ret = drmCommandWriteRead(fd, DRM_NOUVEAU_GETPARAM, &gp, sizeof(gp)); >> >> ... and this doesn't work because the GETPARAM ioctl is marked as >> DRM_UNLOCKED|DRM_AUTH|DRM_RENDER_ALLOW and we aren't authed at this >> point, nor are we considered a render client. I repeat my earlier >> comment: ARGH! [And of course fixing this in the kernel is too late, >> since this has to work for older kernels too.] >> >> Any other ideas? Having to fill out the pci tables would really suck. >> I'm back to the "hard-code prefer X driver name for nouveau" idea... > > I don't see a reason not to get the magic and do the auth before doing > loader_get_driver_for_fd().
OK, I'll look into whether that's reasonably doable. > > (though, how big would the pciids table for nouveau_vieux be to just > hardcode it in pci_id_driver_map.h? There aren't any more new ones > being made, right?) Yeah... I considered that. Coincidentally, a pci id table was recently put together at http://envytools.readthedocs.org/en/latest/pciid.html. There appear to be about 70 pci ids. But who knows -- there could be cards we don't know about (rather, in pci id spaces we don't know about) that work just fine. -ilia _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev