Author: alexander
Date: 2007-03-24 06:06:14 -0600 (Sat, 24 Mar 2007)
New Revision: 1825

Added:
   trunk/packages/xorg-udev-rules/
   trunk/packages/xorg-udev-rules/Makefile
   trunk/packages/xorg-udev-rules/extract_pci_ids.c
Removed:
   trunk/packages/udev/detect-video
Modified:
   trunk/Makefile
   trunk/doc/README
   trunk/packages/udev/Makefile
Log:
Added a program that extracts PCI IDs of supported video cards from Xorg
drivers and writes udev rules like this:

# ATI Radeon X850 PRO (R480) (AGP)
ATTR{vendor}=="0x1002", ATTR{device}=="0x4b4b", RUN+="/bin/sed -i s/vesa/ati/ 
/etc/X11/xorg.conf"

This way, video card autodetection is now fixed.


Modified: trunk/Makefile
===================================================================
--- trunk/Makefile      2007-03-24 10:47:05 UTC (rev 1824)
+++ trunk/Makefile      2007-03-24 12:06:14 UTC (rev 1825)
@@ -250,7 +250,7 @@
        ch-freetype ch-fontconfig \
        ch-Xorg-base ch-Xorg-util ch-Xorg-proto ch-Xorg-lib ch-libdrm ch-Mesa \
        ch-xbitmaps ch-Xorg-app ch-xcursor-themes ch-xorg-server \
-       ch-Xorg-font ch-Xorg-driver ch-XML-Parser ch-xkeyboard-config \
+       ch-Xorg-font ch-Xorg-driver ch-xorg-udev-rules ch-XML-Parser 
ch-xkeyboard-config \
        ch-synaptics ch-inputattach ch-915resolution ch-fonts-thai \
        ch-freefont ch-fonts-dejavu ch-fonts-kochi ch-fonts-firefly 
ch-fonts-baekmuk \
        ch-libjpeg ch-libtiff ch-openssh ch-glib2 ch-giflib ch-imlib ch-imlib2 \

Modified: trunk/doc/README
===================================================================
--- trunk/doc/README    2007-03-24 10:47:05 UTC (rev 1824)
+++ trunk/doc/README    2007-03-24 12:06:14 UTC (rev 1825)
@@ -83,11 +83,6 @@
 process may fail if you have more than one video card, if your video card
 doesn't support 24-bit color depth, or if your monitor is not Plug-n-Play
 compatible (in other words, doesn't tell its characteristics to Xorg via DDC).
-Also, in the following cases, the autodetection process is known to suggest
-a non-working driver even for 2D graphics:
-
-    * ATI Radeon X1000 or higher (needs the "vesa" driver)
-
 In such cases, you have to edit the /etc/X11/xorg.conf file manually, using
 vim, joe or nano.
 
@@ -119,6 +114,8 @@
 Section "Monitor"
        Identifier      "Generic Monitor"
        Option          "DPMS"
+       # Option        "NoDDC" # for broken monitors that
+                               # report max dot clock = 0 MHz
        HorizSync       30-92   # because gtf said "hsync: 91.38 kHz"
        VertRefresh     56-86   # because a 85 Hz mode has been requested
        # the Modeline may also be pasted here

Modified: trunk/packages/udev/Makefile
===================================================================
--- trunk/packages/udev/Makefile        2007-03-24 10:47:05 UTC (rev 1824)
+++ trunk/packages/udev/Makefile        2007-03-24 12:06:14 UTC (rev 1825)
@@ -41,8 +41,7 @@
        cd $(CONFDIR) ; make install install-doc install-extra-doc
        rm /etc/udev/rules.d/81-cdrom.rules
        echo 'ACTION=="add", SUBSYSTEM=="block", ENV{ID_TYPE}=="cd", 
IMPORT{program}="cdrom_id --export $tempnode", GROUP="cdrom"' 
>/etc/udev/rules.d/61-cdrom.rules
-       echo 'ACTION=="add", BUS=="pci", ATTR{class}=="0x030000", 
RUN+="detect-video"' >/etc/udev/rules.d/30-video.rules
-       install -m755 ../detect-video ../dhcp-helper /lib/udev
+       install -m755 ../dhcp-helper /lib/udev
        install -m644 ../76-network.rules /etc/udev/rules.d/
        install -m644 -D docs/writing_udev_rules/index.html \
         /usr/share/doc/$(DIR)/index.html

Deleted: trunk/packages/udev/detect-video
===================================================================
--- trunk/packages/udev/detect-video    2007-03-24 10:47:05 UTC (rev 1824)
+++ trunk/packages/udev/detect-video    2007-03-24 12:06:14 UTC (rev 1825)
@@ -1,14 +0,0 @@
-#!/bin/sh
-
-SUB_VENDOR_ID=${PCI_SUBSYS_ID%:*}
-SUB_DEVICE_ID=${PCI_SUBSYS_ID#*:}
-
-VENDOR_ID=${PCI_ID%:*}
-DEVICE_ID=${PCI_ID#*:}
-
-X_DRIVER=`/usr/bin/getconfig.pl -b "0x$SUB_DEVICE_ID" -c 0x0300 \
-       -d "0x$DEVICE_ID" -s "0x$SUB_VENDOR_ID" -v "0x$VENDOR_ID" 2>/dev/null`
-if [ -n "$X_DRIVER" ] ; then
-       echo "Using \"$X_DRIVER\" as a video driver" >/dev/console
-       sed -i -e "s/vesa/$X_DRIVER/" /etc/X11/xorg.conf
-fi

Added: trunk/packages/xorg-udev-rules/Makefile
===================================================================
--- trunk/packages/xorg-udev-rules/Makefile                             (rev 0)
+++ trunk/packages/xorg-udev-rules/Makefile     2007-03-24 12:06:14 UTC (rev 
1825)
@@ -0,0 +1,33 @@
+# xorg udev rules Makefile
+
+NM= xorg-udev-rules
+
+# Targets
+
+chroot:
+       chroot "$(MP)" $(chenv-blfs) \
+       'cd $(ROOT) && make ch-$(NM) $(chbash-post-bash)'
+
+stage2: Makefile extract_pci_ids.c
+       make -f Makefile compile-$@ >$(NM).log 2>&1
+       make clean >>$(NM).log 2>&1
+       touch $@        
+
+compile-stage2:
+       nm -D /usr/bin/Xorg | egrep ' (B|D) ' | cut -d ' ' -f 3 | grep -v __ 
>symbols
+       for a in `cat symbols` ; do echo "char $$a[4096];" ; done >symbols.c
+       gcc -rdynamic -o extract_pci_ids extract_pci_ids.c symbols.c -ldl
+       echo '# Automatically generated rules, do not edit' >30-video.rules
+       echo 'SUBSYSTEM!="pci", GOTO="end_video"' >>30-video.rules
+       echo 'ATTR{class}!="0x030000", GOTO="end_video"' >>30-video.rules
+       echo '' >>30-video.rules
+       for a in /usr/lib/xorg/modules/drivers/*_drv.so ; do \
+           echo $$a ; \
+           ./extract_pci_ids $$a >>30-video.rules ; done
+       echo 'LABEL="end_video"' >>30-video.rules
+       install -m644 30-video.rules /etc/udev/rules.d
+
+clean:
+       rm -f extract_pci_ids symbols symbols.c 30-video.rules
+
+.PHONY: clean chroot compile-stage2

Added: trunk/packages/xorg-udev-rules/extract_pci_ids.c
===================================================================
--- trunk/packages/xorg-udev-rules/extract_pci_ids.c                            
(rev 0)
+++ trunk/packages/xorg-udev-rules/extract_pci_ids.c    2007-03-24 12:06:14 UTC 
(rev 1825)
@@ -0,0 +1,188 @@
+#include <stdio.h>
+#include <string.h>
+#include <dlfcn.h>
+#include <xorg/xf86str.h>
+
+char driver_name[128];
+
+DriverPtr GetDriverRec(char *drvname, void *handle)
+{
+       char mdsym[128];
+       XF86ModuleData * md;
+       DriverRec *result;
+       sprintf(mdsym, "%sModuleData", drvname);
+       md = dlsym(handle, mdsym);
+       md->setup(&result, NULL, NULL, NULL);
+       return result;
+}
+
+void WriteUdevRule(const char *comment, int vendor, int device)
+{
+       if ((vendor == 0) || (vendor == 0xff) || (vendor == 0xffff))
+               return;
+       if ((device == 0) || (device == 0xffff))
+               return;
+       printf("# %s\n"
+               "ATTR{vendor}==\"0x%04x\", "
+               "ATTR{device}==\"0x%04x\", "
+               "RUN+=\"/bin/sed -i s/vesa/%s/ /etc/X11/xorg.conf\"\n\n",
+               comment, vendor, device, driver_name);
+}
+
+int main(int argc, char *argv[])
+{
+       void *handle;
+       char driver[128];
+       char drvname[128];
+       char *pos;
+       DriverPtr drv;
+
+       strcpy(driver, argv[1]);
+       strcpy(drvname, argv[1]);
+       pos = strstr(drvname, "_drv.so");
+       if (!pos) {
+               /* This file is not a driver */
+               return 0;
+       }
+       *pos = 0;
+       pos = strrchr(drvname, '/');
+       if (pos)
+               strcpy(driver_name, pos + 1);
+       else
+               /* dlopen would fail anyway */
+               return 0;
+
+       /* radeon and r128 should not be used directly,
+          and sisusb is too different */
+       if (!strcmp(driver_name, "radeon"))
+               return 0;
+       if (!strcmp(driver_name, "r128"))
+               return 0;
+       if (!strcmp(driver_name, "sisusb"))
+               return 0;
+
+       handle = dlopen(driver, RTLD_LAZY);
+       if (!handle) {
+               /* this driver is not interesting anyway */
+               return 0;
+       }
+       drv = GetDriverRec(driver_name, handle);
+       if (!strcmp(driver_name, "nv")) {
+               drv->Identify(1);
+       } else if (!strcmp(driver_name, "ati")) {
+               Bool (*Probe)(struct _DriverRec *drv, int flags);
+               Probe = dlsym(handle, "R128Probe");
+               Probe(drv, 1);
+               Probe = dlsym(handle, "RADEONProbe");
+               Probe(drv, 1);
+       } else {
+               drv->Probe(drv, 1);
+       }
+       dlclose(handle);
+       return 0;
+}
+
+/* Stubs that are called by Xorg drivers from Probe and Identify functions */
+unsigned char byte_reversed[256];
+
+pointer XNFalloc(unsigned long amount)
+{
+       return malloc(amount);
+}
+
+unsigned short StandardMinorOpcode(void * client)
+{
+       return 1;
+}
+
+void xf86ErrorFVerb()
+{
+}
+
+void xf86AddDriver(DriverPtr drv, void * module, int unknown)
+{
+       DriverPtr *dest = module;
+       *dest = drv;
+}
+
+int xf86MatchDevice()
+{
+       return 1;
+}
+
+void * xf86GetPciVideoInfo()
+{
+       static void* dummy = NULL;
+       return &dummy;
+}
+
+void *xf86GetPciConfigInfo(void)
+{
+       static void* dummy = NULL;
+       return &dummy;
+}
+
+void LoaderRefSymLists(const char ** dummy, ...)
+{
+}
+
+void xf86LoaderRefSymLists(const char ** dummy, ...)
+{
+}
+
+void xf86MsgVerb(MessageType type, int verb, const char *format, ...)
+{
+}
+
+void Xfree(void * ptr)
+{
+}
+
+int xf86MatchPciInstances(const char *driverName, int vendorID,
+                      SymTabPtr chipsets, PciChipsets *PCIchipsets,
+                      GDevPtr *devList, int numDevs, DriverPtr drvp,
+                      int **foundEntities)
+{
+       const char *comment;
+       while (PCIchipsets->PCIid != -1) {
+               SymTabPtr chips = chipsets;
+               while (chips->token != -1) {
+                       if (chips->token == PCIchipsets->numChipset)
+                               comment = chips->name;
+                       chips++;
+               }
+               if (!vendorID)
+                       vendorID = PCIchipsets->PCIid >> 16;
+               WriteUdevRule(comment, vendorID, PCIchipsets->PCIid & 0xffff);
+               PCIchipsets++;
+       }
+       return 0;
+}
+
+void xf86PrintChipsets(const char *drvname, const char *drvmsg,
+                       SymTabPtr chips)
+{
+       while(chips->token != -1) {
+               WriteUdevRule(chips->name,
+                   chips->token >> 16, chips->token & 0xffff);
+               chips++;
+       }
+}
+
+int xf86MatchIsaInstances(const char *driverName, SymTabPtr chipsets,
+                          IsaChipsets *ISAchipsets, DriverPtr drvp,
+                          FindIsaDevProc FindIsaDevice, GDevPtr *devList,
+                          int numDevs, int **foundEntities)
+{
+       return 0;
+}
+
+pointer xf86LoadDrvSubModule(DriverPtr drv, const char *name)
+{
+       return NULL;
+}
+
+Bool xf86ServerIsOnlyDetecting(void)
+{
+       return TRUE;
+}

-- 
http://linuxfromscratch.org/mailman/listinfo/livecd
FAQ: http://www.linuxfromscratch.org/faq/
Unsubscribe: See the above information page

Reply via email to