Ticket #10606: radeon-bar.diff

File radeon-bar.diff, 3.9 KB (added by waddlesplash, 10 years ago)

Preliminary patch I recieved from Alex.

  • src/add-ons/kernel/drivers/graphics/radeon_hd/radeon_hd.cpp

    diff --git a/src/add-ons/kernel/drivers/graphics/radeon_hd/radeon_hd.cpp b/src/add-ons/kernel/drivers/graphics/radeon_hd/radeon_hd.cpp
    index 5769b11..3120e44 100644
    a b radeon_hd_getbios(radeon_info &info)  
    137137                // *** Discreet card on IGP, check PCI BAR 0
    138138                // On post, the bios puts a copy of the IGP
    139139                // AtomBIOS at the start of the video ram
    140                 romBase = info.pci->u.h0.base_registers[PCI_BAR_FB];
     140                romBase = info.shared_info->frame_buffer_phys;
    141141                romSize = 256 * 1024;
    142142
    143143                if (romBase == 0 || romSize == 0) {
    radeon_hd_getbios_avivo(radeon_info &info)  
    517517}
    518518
    519519
    520 static uint32
    521 radeon_hd_pci_bar_mmio(uint16 chipsetID)
     520static void
     521radeon_hd_locate_bars(radeon_info &info, radeon_bar_map &barMap)
    522522{
    523     if (chipsetID < RADEON_BONAIRE)
    524         return 2;
    525     else
    526         return 5;
     523    // Locate some good bars
     524
     525    // DCE < 8
     526    //  BAR 0 == FB
     527    //  BAR 2 == MMIO
     528    // DCE >= 8
     529    //  BAR 0 == FB
     530    //  BAR 2 == DOORBELL
     531    //  BAR 5 == MMIO
     532
     533    barMap.framebuffer = 0;
     534    barMap.mmio = info.shared_info->dceMajor < 8 ? 2 : 5;
     535    barMap.doorbell = info.shared_info->dceMajor >= 8 ? 2 : -1;
    527536}
    528537
    529538
    radeon_hd_init(radeon_info &info)  
    550559    memset((void*)info.shared_info, 0, sizeof(radeon_shared_info));
    551560    sharedCreator.Detach();
    552561
    553     // *** Map Memory mapped IO
     562    // *** Find bars
     563    radeon_bar_map barMap;
     564    radeon_hd_locate_bars(info, &barMap)
     565
     566    // *** Memory mapped IO
    554567    AreaKeeper mmioMapper;
    555     const uint32 pciBarMmio = radeon_hd_pci_bar_mmio(info.chipsetID);
     568   
    556569    info.registers_area = mmioMapper.Map("radeon hd mmio",
    557         info.pci->u.h0.base_registers[pciBarMmio],
    558         info.pci->u.h0.base_register_sizes[pciBarMmio],
     570        info.pci->u.h0.base_registers[barMap.mmio],
     571        info.pci->u.h0.base_register_sizes[barMap.mmio],
    559572        B_ANY_KERNEL_ADDRESS, B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA,
    560573        (void**)&info.registers);
    561574    if (mmioMapper.InitCheck() < B_OK) {
    radeon_hd_init(radeon_info &info)  
    603616        }
    604617    }
    605618
    606     uint32 barSize = info.pci->u.h0.base_register_sizes[PCI_BAR_FB] / 1024;
     619    // TODO: if barMap.doorbell >= 0, map
     620
     621    uint32 fbBarSize = info.pci->u.h0.base_register_sizes[barMap.framebuffer] / 1024;
    607622
    608623    // if graphics memory is larger then PCI bar, just map bar
    609624    if (info.shared_info->graphics_memory_size == 0) {
    radeon_hd_init(radeon_info &info)  
    627642    // *** Framebuffer mapping
    628643    AreaKeeper frambufferMapper;
    629644    info.framebuffer_area = frambufferMapper.Map("radeon hd frame buffer",
    630         info.pci->u.h0.base_registers[PCI_BAR_FB],
     645        info.pci->u.h0.base_registers[barMap.framebuffer],
    631646        info.shared_info->frame_buffer_size * 1024,
    632647        B_ANY_KERNEL_ADDRESS, B_READ_AREA | B_WRITE_AREA,
    633648        (void**)&info.shared_info->frame_buffer);
    radeon_hd_init(radeon_info &info)  
    639654
    640655    // Turn on write combining for the frame buffer area
    641656    vm_set_area_memory_type(info.framebuffer_area,
    642         info.pci->u.h0.base_registers[PCI_BAR_FB], B_MTR_WC);
     657        info.pci->u.h0.base_registers[barMap.framebuffer], B_MTR_WC);
    643658
    644659    frambufferMapper.Detach();
    645660
    646661    info.shared_info->frame_buffer_area = info.framebuffer_area;
    647662    info.shared_info->frame_buffer_phys
    648         = info.pci->u.h0.base_registers[PCI_BAR_FB];
     663        = info.pci->u.h0.base_registers[barMap.framebuffer];
    649664
    650665    // Pass common information to accelerant
    651666    info.shared_info->deviceIndex = info.id;
  • src/add-ons/kernel/drivers/graphics/radeon_hd/radeon_hd_private.h

    diff --git a/src/add-ons/kernel/drivers/graphics/radeon_hd/radeon_hd_private.h b/src/add-ons/kernel/drivers/graphics/radeon_hd/radeon_hd_private.h
    index c4e3203..b7cac96 100644
    a b  
    2828    ((RADEON_BIOS16(adr, v) | RADEON_BIOS16(adr, v + 2) << 16))
    2929
    3030
     31struct radeon_bar_map {
     32    int framebuffer;
     33    int mmio;
     34    int doorbell;
     35};
     36
    3137struct radeon_info {
    3238    int32           open_count;
    3339    status_t        init_status;