rewrote memory size detection. This should fix black screen at app_server startup on a number of GF7xxx cards (humdinger's for instance). updated docs, bumped version to 0.98.

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@32845 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Rudolf Cornelissen 2009-08-31 08:55:02 +00:00
parent 91147eefd0
commit fa42e59564
4 changed files with 31 additions and 45 deletions

View File

@ -92,7 +92,7 @@ status_t nv_general_powerup()
{
status_t status;
LOG(1,("POWERUP: Haiku nVidia Accelerant 0.97 running.\n"));
LOG(1,("POWERUP: Haiku nVidia Accelerant 0.98 running.\n"));
/* log VBLANK INT usability status */
if (si->ps.int_assigned)

View File

@ -3233,6 +3233,7 @@ static void getRAMsize_arch_nv10_20_30_40(void)
{
uint32 dev_manID = CFGR(DEVID);
uint32 strapinfo = NV_REG32(NV32_NV10STRAPINFO);
uint32 mem_size;
switch (dev_manID)
{
@ -3243,44 +3244,19 @@ static void getRAMsize_arch_nv10_20_30_40(void)
LOG(8,("INFO: nVidia GPU with UMA detected\n"));
break;
default:
LOG(8,("INFO: kerneldriver mapped %3.3fMb framebuffer memory\n",
(si->ps.memory_size / (1024.0 * 1024.0))));
LOG(8,("INFO: (Memory detection) Strapinfo value is: $%08x\n", strapinfo));
switch ((strapinfo & 0x3ff00000) >> 20)
{
case 2:
si->ps.memory_size = 2 * 1024 * 1024;
break;
case 4:
si->ps.memory_size = 4 * 1024 * 1024;
break;
case 8:
si->ps.memory_size = 8 * 1024 * 1024;
break;
case 16:
si->ps.memory_size = 16 * 1024 * 1024;
break;
case 32:
si->ps.memory_size = 32 * 1024 * 1024;
break;
case 64:
si->ps.memory_size = 64 * 1024 * 1024;
break;
case 128:
si->ps.memory_size = 128 * 1024 * 1024;
break;
case 256:
si->ps.memory_size = 256 * 1024 * 1024;
break;
case 512:
si->ps.memory_size = 512 * 1024 * 1024;
break;
default:
si->ps.memory_size = 16 * 1024 * 1024;
mem_size = (strapinfo & 0x3ff00000);
if (!mem_size) {
mem_size = 16 * 1024 * 1024;
LOG(8,("INFO: NV10/20/30 architecture chip with unknown RAM amount detected;\n"));
LOG(8,("INFO: Setting 16Mb\n"));
break;
}
/* don't attempt to adress memory not mapped by the kerneldriver */
if (si->ps.memory_size > mem_size) si->ps.memory_size = mem_size;
}
}

View File

@ -4,7 +4,7 @@
</head>
<body>
<p><h2>Changes done for each driverversion:</h2></p>
<p><h1>head (SVN 0.97, Rudolf)</h1></p>
<p><h1>head (SVN 0.98, Rudolf)</h1></p>
<ul>
<li>Fixed driver assuming enabling AGP mode succeeded on some occasions if it did not block it itself. Blocking AGP mode completely via the AGP busmanager (option 'block_agp') resulted in a crashing acceleration engine because it was setup for AGP transfers instead of using PCI transfers. Error was solved with help from user kraton.
<li>Fixed shared_info struct problem occuring when 3D 'accelerant' is used (tested Alpha 4.1): the TVencoder type definition list apparantly gets some memory assigned these days when done inside the definition of shared_info. Moved encoder list outside the shared_info definition.
@ -24,7 +24,8 @@
<li>Modified GPU PTimer programming which according to the Nouveau project fixes LVDS panel programming in some cases.
<li>Corrected/Added detection of third I2C bus on cards that support it. The old detection method for a third and (non-existing) fourth bus was faulty. The driver uses I2C channels for monitor DDC/EDID and TVencoder communications.
<li>DDC/EDID fetching now also works on GCC4 binaries due to a fixed fault in the accelerants/common code (which is used for that function);
<li>Added support for Haiku specific driverhook GET_PREFERRED_DISPLAY_MODE. Laptops should now also startup in native mode automatically at first system boot.
<li>Added support for Haiku specific driverhook GET_PREFERRED_DISPLAY_MODE. Laptops should now also startup in native mode automatically at first system boot;
<li>Rewrote framebuffer memory detection. Accelerant now only uses the amount of RAM mapped by the kerneldriver as maximum. This fixes black screen at app_server startup on a number of GF7xxx cards.
</ul>
<p><h1>nv_driver 0.80 (Rudolf)</h1></p>
<ul>

View File

@ -4,7 +4,7 @@
Other authors:
Mark Watson;
Rudolf Cornelissen 3/2002-6/2009.
Rudolf Cornelissen 3/2002-8/2009.
*/
@ -681,6 +681,10 @@ map_device(device_info *di)
/* remember the DMA address of the frame buffer for BDirectWindow?? purposes */
si->framebuffer_pci = (void *) di->pcii.u.h0.base_registers_pci[frame_buffer];
/* note the amount of memory mapped by the kerneldriver so we can make sure we
* don't attempt to adress more later on */
si->ps.memory_size = di->pcii.u.h0.base_register_sizes[frame_buffer];
// remember settings for use here and in accelerant
si->settings = sSettings;
@ -851,6 +855,7 @@ open_hook(const char* name, uint32 flags, void** cookie)
physical_entry map[1];
size_t net_buf_size;
void *unaligned_dma_buffer;
uint32 mem_size;
/* find the device name in the list of devices */
/* we're never passed a name we didn't publish */
@ -946,21 +951,32 @@ open_hook(const char* name, uint32 flags, void** cookie)
* wrongly identify the INT request coming from us! */
si->ps.secondary_head = false;
/* map the device */
result = map_device(di);
if (result < 0) goto free_shared_and_alldma;
/* we will be returning OK status for sure now */
result = B_OK;
/* note the amount of system RAM the system BIOS assigned to the card if applicable:
* unified memory architecture (UMA) */
switch ((((uint32)(si->device_id)) << 16) | si->vendor_id)
{
case 0x01a010de: /* Nvidia GeForce2 Integrated GPU */
/* device at bus #0, device #0, function #1 holds value at byte-index 0x7C */
si->ps.memory_size = 1024 * 1024 *
mem_size = 1024 * 1024 *
(((((*pci_bus->read_pci_config)(0, 0, 1, 0x7c, 4)) & 0x000007c0) >> 6) + 1);
/* don't attempt to adress memory not mapped by the kerneldriver */
if (si->ps.memory_size > mem_size) si->ps.memory_size = mem_size;
/* last 64kB RAM is used for the BIOS (or something else?) */
si->ps.memory_size -= (64 * 1024);
break;
case 0x01f010de: /* Nvidia GeForce4 MX Integrated GPU */
/* device at bus #0, device #0, function #1 holds value at byte-index 0x84 */
si->ps.memory_size = 1024 * 1024 *
mem_size = 1024 * 1024 *
(((((*pci_bus->read_pci_config)(0, 0, 1, 0x84, 4)) & 0x000007f0) >> 4) + 1);
/* don't attempt to adress memory not mapped by the kerneldriver */
if (si->ps.memory_size > mem_size) si->ps.memory_size = mem_size;
/* last 64kB RAM is used for the BIOS (or something else?) */
si->ps.memory_size -= (64 * 1024);
break;
@ -970,13 +986,6 @@ open_hook(const char* name, uint32 flags, void** cookie)
break;
}
/* map the device */
result = map_device(di);
if (result < 0) goto free_shared_and_alldma;
/* we will be returning OK status for sure now */
result = B_OK;
/* disable and clear any pending interrupts */
//fixme:
//distinquish between crtc1/crtc2 once all heads get seperate driver instances!