Re: GPL only modules [was Re: [GIT PATCH] more Driver core patchesfor 2.6.19]

From: Diego Calleja
Date: Tue Dec 19 2006 - 08:56:27 EST


El Tue, 19 Dec 2006 23:57:45 +1100, Marek Wawrzyczny <marekw1977@xxxxxxxxxxxx> escribió:

> I had another, probably crazy idea. Would it be possible to utilize the
> current vendor/device PCI ID database to create Linux friendliness matrix
> site?

I've a script (attached) that looks into /lib/modules/`uname -r`/modules.pcimap,
looks up the IDs in the pci id database and print the real name. At least it shows
it's possible to know what devices are supported ...



#!/usr/bin/python

def pciids_to_names(ids):
# Only the last four numbers of the ids have useful info
vendorid = ids[1][6:10]
deviceid = ids[2][6:10]
subvendorid = ids[3][6:10]
subdeviceid = ids[4][6:10]

result = [ids[0], "", "", "", "", ""]
pciids = open('/usr/share/misc/pci.ids', 'r')

# Search for vendor
for line in pciids:
if line[0] == "#" or line[0] == "C" or line[0] == "\t":
continue
if line[0:4] == vendorid:
result[1] = line[6:].strip() # Vendor name
break

if result[1] == "": # Vendor not found
return result

# Search for a device
for line in pciids:
if line[0] != "\t":
continue
if line[1:5] == deviceid:
result[2] = line[7:].strip() # Device name
break

# Search a subsystem name
for line in pciids:
if line[2:11] == subvendorid + " " + subdeviceid: # subsystem name
result[3] = line[12:].strip() # The subvendor and subdevice ids point to a _single_ subsystem name
break

# Search a class name
if ids[5][4:6] == "00" and ids[5][6:8] == "00" and ids[5][6:8] == "00":
pass # void class ids
else:
pciids.seek(0)
# Search a class name
for line in pciids:
if line[0] == "C":
if line[2:4] == ids[5][4:6]: # found class
result[4] = line[6:].strip() # appended class name
break

if result[4] == "": # class not found
return result

# Search subclass name
for line in pciids:
if line [1:3] == ids[5][6:8]:
result[5] = line[5:].strip()
break
return result




### Start of the code flow ###
import platform
pcimap = open('/lib/modules/' + platform.uname()[2] + '/modules.pcimap', 'r')
previousmodule = ""
for line in pcimap:
if line[0] == "#" or line[0] == " ": continue
data = line.split(None)
ret = pciids_to_names(data)

if ret[0] != previousmodule:
previousmodule = ret[0]
print "Driver: " + previousmodule

if ret[2] == "":
output = "\tDevice NOT found in the pciid database: " + repr(data)
else:
output = "\tDevice: " + ret[2] + " (deviceid " + data[2][6:] + "); made by " + ret[1] + " (vendorid " + data[1][6:] + ")"
if ret[3] != "": output += "; Subsystem: " + ret[3] + " (subsysid " + data[3][6:] + ":" + data[4][6:] + ")"
if ret[4] != "": output += "; Class: " + ret[4]
if ret[5] != "": output += "; Subclass: " + ret[5]

print output