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

Reply via email to