radeon_hd: 64 bit PCI bus fixes
Change-Id: If14dc31bf4c9360b5e1d0b477ba375cec8f75ba7 Reviewed-on: https://review.haiku-os.org/c/haiku/+/4306 Reviewed-by: Alex von Gluck IV <kallisti5@unixzen.com>
This commit is contained in:
parent
7508e28c4f
commit
756884ad48
@ -570,7 +570,7 @@ radeon_gpu_mc_init()
|
||||
}
|
||||
|
||||
gInfo->fb.vramStart = vramBase;
|
||||
gInfo->fb.vramSize = gInfo->shared_info->frame_buffer_size * 1024;
|
||||
gInfo->fb.vramSize = (uint64)gInfo->shared_info->frame_buffer_size * 1024;
|
||||
gInfo->fb.vramEnd = (vramBase + gInfo->fb.vramSize) - 1;
|
||||
}
|
||||
|
||||
|
@ -179,6 +179,14 @@ radeon_set_display_mode(display_mode* mode)
|
||||
// TODO: multi-monitor? For now we set the mode on
|
||||
// the first display found.
|
||||
|
||||
TRACE("%s\n", __func__);
|
||||
TRACE(" mode->space: %#" B_PRIx32 "\n", mode->space);
|
||||
TRACE(" mode->virtual_width: %" B_PRIu16 "\n", mode->virtual_width);
|
||||
TRACE(" mode->virtual_height: %" B_PRIu16 "\n", mode->virtual_height);
|
||||
TRACE(" mode->h_display_start: %" B_PRIu16 "\n", mode->h_display_start);
|
||||
TRACE(" mode->v_display_start: %" B_PRIu16 "\n", mode->v_display_start);
|
||||
TRACE(" mode->flags: %#" B_PRIx32 "\n", mode->flags);
|
||||
|
||||
uint8 crtcID = 0;
|
||||
|
||||
if (gDisplay[crtcID]->attached == false)
|
||||
@ -277,6 +285,12 @@ radeon_get_frame_buffer_config(frame_buffer_config* config)
|
||||
|
||||
config->bytes_per_row = gInfo->shared_info->bytes_per_row;
|
||||
|
||||
TRACE(" config->frame_buffer: %#" B_PRIxADDR "\n",
|
||||
(phys_addr_t)config->frame_buffer);
|
||||
TRACE(" config->frame_buffer_dma: %#" B_PRIxADDR "\n",
|
||||
(phys_addr_t)config->frame_buffer_dma);
|
||||
TRACE(" config->bytes_per_row: %" B_PRIu32 "\n", config->bytes_per_row);
|
||||
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
|
@ -538,6 +538,11 @@ radeon_hd_init(radeon_info &info)
|
||||
"Radeon %s 1002:%" B_PRIX32 "\n", __func__, info.id,
|
||||
radeon_chip_name[info.chipsetID], info.pciID);
|
||||
|
||||
// Enable response in I/O, memory space. Enable bus mastering
|
||||
uint32 pciConfig = get_pci_config(info.pci, PCI_command, 2);
|
||||
pciConfig |= PCI_command_io | PCI_command_memory | PCI_command_master;
|
||||
set_pci_config(info.pci, PCI_command, 2, pciConfig);
|
||||
|
||||
// *** Map shared info
|
||||
AreaKeeper sharedCreator;
|
||||
info.shared_area = sharedCreator.Create("radeon hd shared info",
|
||||
@ -629,27 +634,37 @@ radeon_hd_init(radeon_info &info)
|
||||
info.shared_info->graphics_memory_size / 1024);
|
||||
|
||||
// *** Framebuffer mapping
|
||||
phys_addr_t physicalAddress = info.pci->u.h0.base_registers[PCI_BAR_FB];
|
||||
if ((info.pci->u.h0.base_register_flags[PCI_BAR_FB] & PCI_address_type)
|
||||
== PCI_address_type_64) {
|
||||
physicalAddress
|
||||
|= (uint64)info.pci->u.h0.base_registers[PCI_BAR_FB + 1] << 32;
|
||||
}
|
||||
|
||||
TRACE("framebuffer paddr: %#" B_PRIxADDR "\n", physicalAddress);
|
||||
AreaKeeper frambufferMapper;
|
||||
info.framebuffer_area = frambufferMapper.Map("radeon hd frame buffer",
|
||||
info.pci->u.h0.base_registers[PCI_BAR_FB],
|
||||
info.shared_info->frame_buffer_size * 1024,
|
||||
physicalAddress, info.shared_info->frame_buffer_size * 1024,
|
||||
B_ANY_KERNEL_ADDRESS, B_READ_AREA | B_WRITE_AREA,
|
||||
(void**)&info.shared_info->frame_buffer);
|
||||
|
||||
if (frambufferMapper.InitCheck() < B_OK) {
|
||||
ERROR("%s: card(%" B_PRId32 "): couldn't map frame buffer!\n",
|
||||
__func__, info.id);
|
||||
return info.framebuffer_area;
|
||||
}
|
||||
TRACE("frambuffer vaddr: %#" B_PRIxADDR "\n",
|
||||
(addr_t)info.shared_info->frame_buffer);
|
||||
TRACE("frambuffer size: %#" B_PRIxSIZE "\n",
|
||||
(size_t)info.shared_info->frame_buffer_size * 1024);
|
||||
|
||||
// Turn on write combining for the frame buffer area
|
||||
vm_set_area_memory_type(info.framebuffer_area,
|
||||
info.pci->u.h0.base_registers[PCI_BAR_FB], B_MTR_WC);
|
||||
vm_set_area_memory_type(info.framebuffer_area, physicalAddress, B_MTR_WC);
|
||||
|
||||
frambufferMapper.Detach();
|
||||
|
||||
info.shared_info->frame_buffer_area = info.framebuffer_area;
|
||||
info.shared_info->frame_buffer_phys
|
||||
= info.pci->u.h0.base_registers[PCI_BAR_FB];
|
||||
info.shared_info->frame_buffer_phys = physicalAddress;
|
||||
|
||||
// Pass common information to accelerant
|
||||
info.shared_info->deviceIndex = info.id;
|
||||
|
Loading…
Reference in New Issue
Block a user