On Thu, 2003-11-06 at 10:48, Jon Smirl wrote:
> 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;
> }

Since this is something that will be needed for many devices, more than
there will be DRMs for, this seems like something that ought to be in a
lower-level driver (used by the DRM and fbdev).

-- 
Eric Anholt                                [EMAIL PROTECTED]          
http://people.freebsd.org/~anholt/         [EMAIL PROTECTED]




-------------------------------------------------------
This SF.Net email sponsored by: ApacheCon 2003,
16-19 November in Las Vegas. Learn firsthand the latest
developments in Apache, PHP, Perl, XML, Java, MySQL,
WebDAV, and more! http://www.apachecon.com/
_______________________________________________
Dri-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/dri-devel

Reply via email to