From 64b16a43a1f9b4faf87c72387e69b9b854a098e8 Mon Sep 17 00:00:00 2001 From: starfrost013 Date: Wed, 26 Mar 2025 01:43:46 +0000 Subject: [PATCH] Fix 32bpp bsod by actually creating framebuffer mappings. Don't remap memory if it's 0 (prevents trashing the low/real-mode memory map), general code simplification (some things were enabled 3 times what --- doc/nvidia_notes/status.xlsx | Bin 15607 -> 15648 bytes src/include/86box/nv/vid_nv.h | 1 + src/include/86box/nv/vid_nv3.h | 18 +- .../classes/nv3_class_01c_image_in_memory.c | 2 +- .../nv/nv3/classes/nv3_class_shared_methods.c | 8 +- src/video/nv/nv3/nv3_core.c | 163 ++++++++++++------ src/video/nv/nv3/nv3_core_config.c | 8 +- src/video/nv/nv3/subsystems/nv3_pfb.c | 6 +- src/video/nv/nv3/subsystems/nv3_pfifo.c | 2 +- 9 files changed, 140 insertions(+), 68 deletions(-) diff --git a/doc/nvidia_notes/status.xlsx b/doc/nvidia_notes/status.xlsx index e23fe6c7248b0bed60a1a932a22f5bf1d20bfb23..c050432b51bc3ae5023ac7204abcea8ad1e97540 100644 GIT binary patch delta 3970 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 BRw@7h delta 3932 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 U9$Opgraph.bpixel[src_buffer_id] = ((real_format & 0x03) | NV3_BPIXEL_FORMAT_IS_VALID); + nv3->pgraph.bpixel[src_buffer_id] = (real_format | NV3_BPIXEL_FORMAT_IS_VALID); nv_log("Image in Memory BUF%d COLOR_FORMAT=0x%04x", src_buffer_id, param); diff --git a/src/video/nv/nv3/classes/nv3_class_shared_methods.c b/src/video/nv/nv3/classes/nv3_class_shared_methods.c index 9985845cf..01f0e90c7 100644 --- a/src/video/nv/nv3/classes/nv3_class_shared_methods.c +++ b/src/video/nv/nv3/classes/nv3_class_shared_methods.c @@ -166,10 +166,10 @@ void nv3_notify_if_needed(uint32_t name, uint32_t method_id, nv3_ramin_context_t switch (info_notification_target) { case NV3_NOTIFICATION_TARGET_NVM: - svga_writel_linear(final_address, (notify.nanoseconds & 0xFFFFFFFF), nv3); - svga_writel_linear(final_address + 4, (notify.nanoseconds >> 32), nv3); - svga_writel_linear(final_address + 8, notify.info32, nv3); - svga_writel_linear(final_address + 0x0C, (notify.info16 | notify.status), nv3); + svga_writel_linear(final_address, (notify.nanoseconds & 0xFFFFFFFF), &nv3->nvbase.svga); + svga_writel_linear(final_address + 4, (notify.nanoseconds >> 32), &nv3->nvbase.svga); + svga_writel_linear(final_address + 8, notify.info32, &nv3->nvbase.svga); + svga_writel_linear(final_address + 0x0C, (notify.info16 | notify.status), &nv3->nvbase.svga); break; case NV3_NOTIFICATION_TARGET_PCI: case NV3_NOTIFICATION_TARGET_AGP: diff --git a/src/video/nv/nv3/nv3_core.c b/src/video/nv/nv3/nv3_core.c index 5016329a9..09d8e093a 100644 --- a/src/video/nv/nv3/nv3_core.c +++ b/src/video/nv/nv3/nv3_core.c @@ -129,9 +129,6 @@ uint32_t nv3_mmio_read32(uint32_t addr, void* priv) ret = nv3_mmio_arbitrate_read(addr); - // This may get around the riva shredding its own cache - //nv3_pfifo_cache0_pull(); - //nv3_pfifo_cache1_pull(); return ret; @@ -261,7 +258,7 @@ uint8_t nv3_pci_read(int32_t func, int32_t addr, void* priv) // 66Mhz FSB capable case PCI_REG_COMMAND_L: - ret = nv3->pci_config.pci_regs[PCI_REG_COMMAND_L]; // we actually respond to the fucking + ret = nv3->pci_config.pci_regs[PCI_REG_COMMAND_L] ; // we actually respond to the fucking break; case PCI_REG_COMMAND_H: @@ -396,6 +393,11 @@ void nv3_pci_write(int32_t func, int32_t addr, uint8_t val, void* priv) // actually update the mappings nv3_update_mappings(); break; + case PCI_REG_COMMAND_H: + nv3->pci_config.pci_regs[PCI_REG_COMMAND_H] = val; + // actually update the mappings + nv3_update_mappings(); + break; // pci status register case PCI_REG_STATUS_L: nv3->pci_config.pci_regs[PCI_REG_STATUS_L] = val | (NV3_PCI_STATUS_L_66MHZ_CAPABLE); @@ -736,13 +738,57 @@ void nv3_svga_out(uint16_t addr, uint8_t val, void* priv) } +/* DFB, sets up a dumb framebuffer */ +uint8_t nv3_dfb_read8(uint32_t addr, void* priv) +{ + addr &= (nv3->nvbase.svga.vram_mask); + return nv3->nvbase.svga.vram[addr]; +} + +uint16_t nv3_dfb_read16(uint32_t addr, void* priv) +{ + addr &= (nv3->nvbase.svga.vram_mask); + return (nv3->nvbase.svga.vram[addr + 1] << 8) | nv3->nvbase.svga.vram[addr]; +} + +uint32_t nv3_dfb_read32(uint32_t addr, void* priv) +{ + addr &= (nv3->nvbase.svga.vram_mask); + return (nv3->nvbase.svga.vram[addr + 3] << 24) | (nv3->nvbase.svga.vram[addr + 2] << 16) + + (nv3->nvbase.svga.vram[addr + 1] << 8) | nv3->nvbase.svga.vram[addr]; +} + +void nv3_dfb_write8(uint32_t addr, uint8_t val, void* priv) +{ + addr &= (nv3->nvbase.svga.vram_mask); + nv3->nvbase.svga.vram[addr] = val; +} + +void nv3_dfb_write16(uint32_t addr, uint16_t val, void* priv) +{ + addr &= (nv3->nvbase.svga.vram_mask); + nv3->nvbase.svga.vram[addr + 1] = (val >> 8) & 0xFF; + nv3->nvbase.svga.vram[addr] = (val) & 0xFF; +} + +void nv3_dfb_write32(uint32_t addr, uint32_t val, void* priv) +{ + addr &= (nv3->nvbase.svga.vram_mask); + nv3->nvbase.svga.vram[addr + 3] = (val >> 24) & 0xFF; + nv3->nvbase.svga.vram[addr + 2] = (val >> 16) & 0xFF; + nv3->nvbase.svga.vram[addr + 1] = (val >> 8) & 0xFF; + nv3->nvbase.svga.vram[addr] = (val) & 0xFF; +} + +/* Cursor shit */ void nv3_draw_cursor(svga_t* svga, int32_t drawline) { // sanity check if (!nv3) return; - // this is a 2kb bitmap in vram...somewhere... + // On windows, this shows up using NV_IMAGE_IN_MEMORY. + // Do we need to emulate it? nv_log("nv3_draw_cursor drawline=0x%04x", drawline); } @@ -829,25 +875,26 @@ void nv3_init_mappings_svga() { nv_log("Initialising SVGA core memory mapping\n"); + // setup the svga mappings - mem_mapping_set(&nv3->nvbase.framebuffer_mapping, 0, 0, - svga_read_linear, - svga_readw_linear, - svga_readl_linear, - svga_write_linear, - svga_writew_linear, - svga_writel_linear, - NULL, 0, &nv3->nvbase.svga); + mem_mapping_add(&nv3->nvbase.framebuffer_mapping, 0, 0, + nv3_dfb_read8, + nv3_dfb_read16, + nv3_dfb_read32, + nv3_dfb_write8, + nv3_dfb_write16, + nv3_dfb_write32, + nv3->nvbase.svga.vram, 0, &nv3->nvbase.svga); // the SVGA/LFB mapping is also mirrored - mem_mapping_set(&nv3->nvbase.framebuffer_mapping_mirror, 0, 0, - svga_read_linear, - svga_readw_linear, - svga_readl_linear, - svga_write_linear, - svga_writew_linear, - svga_writel_linear, - NULL, 0, &nv3->nvbase.svga); + mem_mapping_add(&nv3->nvbase.framebuffer_mapping_mirror, 0, 0, + nv3_dfb_read8, + nv3_dfb_read16, + nv3_dfb_read32, + nv3_dfb_write8, + nv3_dfb_write16, + nv3_dfb_write32, + nv3->nvbase.svga.vram, 0, &nv3->nvbase.svga); io_sethandler(0x03c0, 0x0020, nv3_svga_in, NULL, NULL, @@ -885,6 +932,12 @@ void nv3_update_mappings() nv3_svga_out, NULL, NULL, nv3); + if (!(nv3->pci_config.pci_regs[PCI_REG_COMMAND]) & PCI_COMMAND_MEM) + { + nv_log("The memory was turned off, not much is going to happen.\n"); + return; + } + // turn off bar0 and bar1 by defualt mem_mapping_disable(&nv3->nvbase.mmio_mapping); mem_mapping_disable(&nv3->nvbase.framebuffer_mapping); @@ -892,50 +945,56 @@ void nv3_update_mappings() mem_mapping_disable(&nv3->nvbase.ramin_mapping); mem_mapping_disable(&nv3->nvbase.ramin_mapping_mirror); - if (!(nv3->pci_config.pci_regs[PCI_REG_COMMAND]) & PCI_COMMAND_MEM) - { - nv_log("The memory was turned off, not much is going to happen.\n"); - return; - } - - mem_mapping_enable(&nv3->nvbase.mmio_mapping); - mem_mapping_enable(&nv3->nvbase.framebuffer_mapping); - mem_mapping_enable(&nv3->nvbase.framebuffer_mapping_mirror); - mem_mapping_enable(&nv3->nvbase.ramin_mapping); - mem_mapping_enable(&nv3->nvbase.ramin_mapping_mirror); - - // first map bar0 + // Setup BAR0 (MMIO) nv_log("BAR0 (MMIO Base) = 0x%08x\n", nv3->nvbase.bar0_mmio_base); - //mem_mapping_enable(&nv3->nvbase.mmio_mapping); // should have no effect if already enabled - - mem_mapping_set_addr(&nv3->nvbase.mmio_mapping, nv3->nvbase.bar0_mmio_base, NV3_MMIO_SIZE); - + + if (nv3->nvbase.bar0_mmio_base) + mem_mapping_set_addr(&nv3->nvbase.mmio_mapping, nv3->nvbase.bar0_mmio_base, NV3_MMIO_SIZE); // if this breaks anything, remove it - // skeptical that 0 is used to disable... nv_log("BAR1 (Linear Framebuffer / NV_USER Base & RAMIN) = 0x%08x\n", nv3->nvbase.bar1_lfb_base); // this is likely mirrored // 4x on 2mb cards // 2x on 4mb cards // and not at all on 8mb - mem_mapping_enable(&nv3->nvbase.framebuffer_mapping); - mem_mapping_enable(&nv3->nvbase.framebuffer_mapping_mirror); - mem_mapping_enable(&nv3->nvbase.ramin_mapping); - mem_mapping_enable(&nv3->nvbase.ramin_mapping_mirror); - mem_mapping_set_addr(&nv3->nvbase.framebuffer_mapping, nv3->nvbase.bar1_lfb_base, NV3_MMIO_SIZE); + /* TODO: 2MB */ + // 4MB VRAM memory map: // LFB_BASE+VRAM_SIZE=RAMIN Mirror(?) 0x1400000 (VERIFY PCBOX) // LFB_BASE+VRAM_SIZE*2=LFB Mirror(?) 0x1800000 // LFB_BASE+VRAM_SIZE*3=Definitely RAMIN (then it ends, the total ram space is 16mb) 0x1C00000 - mem_mapping_set_addr(&nv3->nvbase.ramin_mapping_mirror, nv3->nvbase.bar1_lfb_base + NV3_LFB_RAMIN_MIRROR_START, NV3_LFB_MAPPING_SIZE); - mem_mapping_set_addr(&nv3->nvbase.framebuffer_mapping_mirror, nv3->nvbase.bar1_lfb_base + NV3_LFB_2NDHALF_START, NV3_LFB_MAPPING_SIZE); - mem_mapping_set_addr(&nv3->nvbase.ramin_mapping, nv3->nvbase.bar1_lfb_base + NV3_LFB_RAMIN_START, NV3_LFB_MAPPING_SIZE); - // TODO: RAMIN and its mirror + // 8MB VRAM memory map: + // LFB_BASE->LFB_BASE+VRAM_SIZE=LFB + // What is in 800000-c00000? + // LFB_BASE+0xC00000 = RAMIN + + if (nv3->nvbase.bar1_lfb_base) + { + if (nv3->nvbase.vram_amount == NV3_VRAM_SIZE_4MB) + { + mem_mapping_set_addr(&nv3->nvbase.framebuffer_mapping, nv3->nvbase.bar1_lfb_base, NV3_VRAM_SIZE_4MB); + mem_mapping_set_addr(&nv3->nvbase.ramin_mapping_mirror, nv3->nvbase.bar1_lfb_base + NV3_LFB_RAMIN_MIRROR_START, NV3_LFB_MAPPING_SIZE); + mem_mapping_set_addr(&nv3->nvbase.framebuffer_mapping_mirror, nv3->nvbase.bar1_lfb_base + NV3_LFB_MIRROR_START, NV3_VRAM_SIZE_4MB); + mem_mapping_set_addr(&nv3->nvbase.ramin_mapping, nv3->nvbase.bar1_lfb_base + NV3_LFB_RAMIN_START, NV3_LFB_MAPPING_SIZE); + } + else if (nv3->nvbase.vram_amount == NV3_VRAM_SIZE_8MB) + { + // we don't need this one in the case of 8mb, because regular mapping is 8mb + mem_mapping_disable(&nv3->nvbase.ramin_mapping_mirror); + mem_mapping_set_addr(&nv3->nvbase.framebuffer_mapping, nv3->nvbase.bar1_lfb_base, NV3_VRAM_SIZE_8MB); + mem_mapping_set_addr(&nv3->nvbase.framebuffer_mapping_mirror, nv3->nvbase.bar1_lfb_base + NV3_LFB_MIRROR_START, NV3_LFB_MAPPING_SIZE); + mem_mapping_set_addr(&nv3->nvbase.ramin_mapping, nv3->nvbase.bar1_lfb_base + NV3_LFB_RAMIN_START, NV3_LFB_MAPPING_SIZE); + } + else + { + fatal("NV3-2MB not implemented yet (It never existed anyway)"); + } + } // Did we change the banked SVGA mode? switch (nv3->nvbase.svga.gdcreg[0x06] & 0x0c) @@ -977,7 +1036,7 @@ void* nv3_init(const device_t *info) // Allows nv_log to be used for multiple nvidia devices nv_log_set_device(nv3->nvbase.log); #endif - nv_log("initialising core\n"); + nv_log("Initialising core\n"); // Figure out which vbios the user selected const char* vbios_id = device_get_config_bios("vbios"); @@ -1001,7 +1060,7 @@ void* nv3_init(const device_t *info) nv_log("Successfully loaded VBIOS %s located at %s\n", vbios_id, vbios_file); // set the vram amount and gpu revision - uint32_t vram_amount = device_get_config_int("vram_size"); + nv3->nvbase.vram_amount = device_get_config_int("vram_size"); nv3->nvbase.gpu_revision = device_get_config_int("chip_revision"); // set up the bus and start setting up SVGA core @@ -1011,7 +1070,7 @@ void* nv3_init(const device_t *info) pci_add_card(PCI_ADD_NORMAL, nv3_pci_read, nv3_pci_write, NULL, &nv3->nvbase.pci_slot); - svga_init(&nv3_device_pci, &nv3->nvbase.svga, nv3, vram_amount, + svga_init(&nv3_device_pci, &nv3->nvbase.svga, nv3, nv3->nvbase.vram_amount, nv3_recalc_timings, nv3_svga_in, nv3_svga_out, nv3_draw_cursor, NULL); } else if (nv3->nvbase.bus_generation == nv_bus_agp_1x) @@ -1020,7 +1079,7 @@ void* nv3_init(const device_t *info) pci_add_card(PCI_ADD_AGP, nv3_pci_read, nv3_pci_write, NULL, &nv3->nvbase.pci_slot); - svga_init(&nv3_device_agp, &nv3->nvbase.svga, nv3, vram_amount, + svga_init(&nv3_device_agp, &nv3->nvbase.svga, nv3, nv3->nvbase.vram_amount, nv3_recalc_timings, nv3_svga_in, nv3_svga_out, nv3_draw_cursor, NULL); } diff --git a/src/video/nv/nv3/nv3_core_config.c b/src/video/nv/nv3/nv3_core_config.c index e8beb6df7..256ae9dd9 100644 --- a/src/video/nv/nv3/nv3_core_config.c +++ b/src/video/nv/nv3/nv3_core_config.c @@ -140,23 +140,23 @@ const device_config_t nv3_config[] = .name = "vram_size", .description = "VRAM Size", .type = CONFIG_SELECTION, - .default_int = VRAM_SIZE_4MB, + .default_int = NV3_VRAM_SIZE_4MB, .selection = { #ifndef RELEASE_BUILD // This never existed officially but was planned. Debug only { .description = "2 MB (Never officially sold)", - .value = VRAM_SIZE_2MB, + .value = NV3_VRAM_SIZE_2MB, }, #endif { .description = "4 MB", - .value = VRAM_SIZE_4MB, + .value = NV3_VRAM_SIZE_4MB, }, { .description = "8 MB", - .value = VRAM_SIZE_8MB, + .value = NV3_VRAM_SIZE_8MB, }, } diff --git a/src/video/nv/nv3/subsystems/nv3_pfb.c b/src/video/nv/nv3/subsystems/nv3_pfb.c index 644d4090d..0dae5ab39 100644 --- a/src/video/nv/nv3/subsystems/nv3_pfb.c +++ b/src/video/nv/nv3/subsystems/nv3_pfb.c @@ -57,9 +57,13 @@ void nv3_pfb_init() | (NV3_PFB_BOOT_RAM_DATA_TWIDDLE_OFF << NV3_PFB_BOOT_RAM_DATA_TWIDDLE) | (NV3_PFB_BOOT_RAM_BANKS_4 << NV3_PFB_BOOT_RAM_BANKS) | (NV3_PFB_BOOT_RAM_WIDTH_128 << NV3_PFB_BOOT_RAM_WIDTH) - | (NV3_PFB_BOOT_RAM_AMOUNT_4MB << NV3_PFB_BOOT_RAM_AMOUNT) ); + if (nv3->nvbase.vram_amount == NV3_VRAM_SIZE_4MB) + nv3->pfb.boot |= (NV3_PFB_BOOT_RAM_AMOUNT_4MB << NV3_PFB_BOOT_RAM_AMOUNT); + else + nv3->pfb.boot |= (NV3_PFB_BOOT_RAM_AMOUNT_8MB << NV3_PFB_BOOT_RAM_AMOUNT); + nv_log("Done\n"); } diff --git a/src/video/nv/nv3/subsystems/nv3_pfifo.c b/src/video/nv/nv3/subsystems/nv3_pfifo.c index b782f2b56..ef6af049e 100644 --- a/src/video/nv/nv3/subsystems/nv3_pfifo.c +++ b/src/video/nv/nv3/subsystems/nv3_pfifo.c @@ -218,7 +218,7 @@ uint32_t nv3_pfifo_read(uint32_t address) ret = nv3->pfifo.cache1_settings.dma_state; break; case NV3_PFIFO_CACHE1_DMA_CONFIG_1: - ret = nv3->pfifo.cache1_settings.dma_length & (VRAM_SIZE_8MB) - 4; //MAX vram size + ret = nv3->pfifo.cache1_settings.dma_length & (NV3_VRAM_SIZE_8MB) - 4; //MAX vram size break; case NV3_PFIFO_CACHE1_DMA_CONFIG_2: ret = nv3->pfifo.cache1_settings.dma_address;