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)
|
137 | 137 | // *** Discreet card on IGP, check PCI BAR 0 |
138 | 138 | // On post, the bios puts a copy of the IGP |
139 | 139 | // 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; |
141 | 141 | romSize = 256 * 1024; |
142 | 142 | |
143 | 143 | if (romBase == 0 || romSize == 0) { |
… |
… |
radeon_hd_getbios_avivo(radeon_info &info)
|
517 | 517 | } |
518 | 518 | |
519 | 519 | |
520 | | static uint32 |
521 | | radeon_hd_pci_bar_mmio(uint16 chipsetID) |
| 520 | static void |
| 521 | radeon_hd_locate_bars(radeon_info &info, radeon_bar_map &barMap) |
522 | 522 | { |
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; |
527 | 536 | } |
528 | 537 | |
529 | 538 | |
… |
… |
radeon_hd_init(radeon_info &info)
|
550 | 559 | memset((void*)info.shared_info, 0, sizeof(radeon_shared_info)); |
551 | 560 | sharedCreator.Detach(); |
552 | 561 | |
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 |
554 | 567 | AreaKeeper mmioMapper; |
555 | | const uint32 pciBarMmio = radeon_hd_pci_bar_mmio(info.chipsetID); |
| 568 | |
556 | 569 | 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], |
559 | 572 | B_ANY_KERNEL_ADDRESS, B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA, |
560 | 573 | (void**)&info.registers); |
561 | 574 | if (mmioMapper.InitCheck() < B_OK) { |
… |
… |
radeon_hd_init(radeon_info &info)
|
603 | 616 | } |
604 | 617 | } |
605 | 618 | |
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; |
607 | 622 | |
608 | 623 | // if graphics memory is larger then PCI bar, just map bar |
609 | 624 | if (info.shared_info->graphics_memory_size == 0) { |
… |
… |
radeon_hd_init(radeon_info &info)
|
627 | 642 | // *** Framebuffer mapping |
628 | 643 | AreaKeeper frambufferMapper; |
629 | 644 | 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], |
631 | 646 | info.shared_info->frame_buffer_size * 1024, |
632 | 647 | B_ANY_KERNEL_ADDRESS, B_READ_AREA | B_WRITE_AREA, |
633 | 648 | (void**)&info.shared_info->frame_buffer); |
… |
… |
radeon_hd_init(radeon_info &info)
|
639 | 654 | |
640 | 655 | // Turn on write combining for the frame buffer area |
641 | 656 | 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); |
643 | 658 | |
644 | 659 | frambufferMapper.Detach(); |
645 | 660 | |
646 | 661 | info.shared_info->frame_buffer_area = info.framebuffer_area; |
647 | 662 | 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]; |
649 | 664 | |
650 | 665 | // Pass common information to accelerant |
651 | 666 | info.shared_info->deviceIndex = info.id; |
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
|
|
28 | 28 | ((RADEON_BIOS16(adr, v) | RADEON_BIOS16(adr, v + 2) << 16)) |
29 | 29 | |
30 | 30 | |
| 31 | struct radeon_bar_map { |
| 32 | int framebuffer; |
| 33 | int mmio; |
| 34 | int doorbell; |
| 35 | }; |
| 36 | |
31 | 37 | struct radeon_info { |
32 | 38 | int32 open_count; |
33 | 39 | status_t init_status; |