[Mesa-stable] [Mesa-dev] [PATCH] loader: add special logic to distinguish nouveau from nouveau_vieux

Eric Anholt eric at anholt.net
Mon Mar 17 15:01:24 PDT 2014


Ilia Mirkin <imirkin at alum.mit.edu> writes:

> On Mon, Mar 17, 2014 at 2:42 PM, Ilia Mirkin <imirkin at 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 <imirkin at alum.mit.edu>
>> Cc: "10.1" <mesa-stable at 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().

(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?)
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 818 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/mesa-stable/attachments/20140317/561b8c52/attachment.sig>


More information about the mesa-stable mailing list