I'm working on a function like the one below for copying out the VBIOS ROM. This would make a good candidate for a device indepenent DRM IOCTL (with a callout for the bug fix). This is something that really should be fixed in X. Mapping the ROM in from user space without the kernel's knowledge is asking for trouble on hotplug systems.
This could would be even simpler if there was an enable/diable PCI ROM call in the PCI driver. I have a getparam function for getting the VBIOS length so that the buffer can be allocated. int radeon_getbios( DRM_IOCTL_ARGS ) { DRM_DEVICE; drm_file_t *filp_priv; drm_radeon_private_t *dev_priv = dev->dev_private; drm_radeon_getbios_t gb; unsigned int temp; struct resource *r; void *rom; if ( !dev_priv ) { DRM_ERROR( "%s called with no initialization\n", __FUNCTION__ ); return DRM_ERR( EINVAL ); } DRM_GET_PRIV_WITH_RETURN( filp_priv, filp ); DRM_COPY_FROM_USER_IOCTL( gb, ( drm_radeon_getbios_t* )data, sizeof( gb ) ); /* Fix from ATI for problem with Radeon hardware not leaving ROM enabled */ temp = RADEON_READ(RADEON_MPP_TB_CONFIG); temp &= 0x00ffffffu; temp |= 0x04 << 24; RADEON_WRITE(RADEON_MPP_TB_CONFIG, temp); temp = RADEON_READ(RADEON_MPP_TB_CONFIG); /* no need to search for the ROM, just ask the card where it is. */ r = &dev->pdev->resource[PCI_ROM_RESOURCE]; /* assign the ROM an address if it doesn't have one */ if (r->parent == NULL) pci_assign_resource(dev->pdev, PCI_ROM_RESOURCE); /* enable if needed */ if (!(r->flags & PCI_ROM_ADDRESS_ENABLE)) { pci_write_config_dword(dev->pdev, dev->pdev->rom_base_reg, r->start | PCI_ROM_ADDRESS_ENABLE); r->flags |= PCI_ROM_ADDRESS_ENABLE; } rom = ioremap(r->start, r->end - r->start + 1); if (!rom) { printk(KERN_ERR "radeonfb: ROM failed to map\n"); return -1; } gb.length = min( gb.length, pci_resource_len( dev->pdev, PCI_ROM_RESOURCE )); DRM_COPY_TO_USER( rom, gb.data, gb.length); iounmap(rom); if (r->parent) { release_resource(r); r->flags &= ~PCI_ROM_ADDRESS_ENABLE; r->end -= r->start; r->start = 0; } /* This will disable and set address to unassigned */ pci_write_config_dword(dev->pdev, dev->pdev->rom_base_reg, 0); DRM_COPY_TO_USER_IOCTL( (drm_radeon_getbios_t *)data, gb, sizeof(gb) ); return 0; } ===== Jon Smirl [EMAIL PROTECTED] __________________________________ Do you Yahoo!? Protect your identity with Yahoo! Mail AddressGuard http://antispam.yahoo.com/whatsnewfree ------------------------------------------------------- This SF.net email is sponsored by: SF.net Giveback Program. Does SourceForge.net help you be more productive? Does it help you create better code? SHARE THE LOVE, and help us help YOU! Click Here: http://sourceforge.net/donate/ _______________________________________________ Dri-devel mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/dri-devel