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 fcfe1e7c4..2141f238b 100644 --- a/src/video/nv/nv3/classes/nv3_class_shared_methods.c +++ b/src/video/nv/nv3/classes/nv3_class_shared_methods.c @@ -69,13 +69,14 @@ void nv3_notify_if_needed(uint32_t name, uint32_t method_id, nv3_ramin_context_t return; uint32_t current_notification_object = nv3->pgraph.notifier; + uint32_t notification_type = ((current_notification_object >> NV3_PGRAPH_NOTIFY_REQUEST_TYPE) & 0x07); // check for a software method (0 = hardware, 1 = software) - if (((current_notification_object >> NV3_PGRAPH_NOTIFY_REQUEST_TYPE) & 0x07) != 0) + if (notification_type != 0) { nv_log("Software Notification, firing interrupt"); nv3_pgraph_interrupt_valid(NV3_PGRAPH_INTR_0_SOFTWARE_NOTIFY); - return; + //return; } // set up the NvNotification structure @@ -101,8 +102,7 @@ void nv3_notify_if_needed(uint32_t name, uint32_t method_id, nv3_ramin_context_t /* paging information */ bool page_is_present = notify_obj_page & 0x01; bool page_is_readwrite = (notify_obj_page >> NV3_NOTIFICATION_PAGE_ACCESS); - //uint32_t frame_value = (notify_obj_page >> NV3_NOTIFICATION_PAGE_FRAME_ADDRESS) & 0xFFFFF; - uint32_t frame_value = (notify_obj_page >> NV3_NOTIFICATION_PAGE_FRAME_ADDRESS) & 0xFFFFF000; + uint32_t frame_base = notify_obj_page & 0xFFFFF000; // This code is temporary and will probably be moved somewhere else // Print torns of debug info @@ -133,8 +133,44 @@ void nv3_notify_if_needed(uint32_t name, uint32_t method_id, nv3_ramin_context_t nv_log("Limit: 0x%08x\n", notify_obj_limit); (page_is_present) ? nv_log("Page is present\n") : nv_log("Page is not present\n"); (page_is_readwrite) ? nv_log("Page is read-write\n") : nv_log("Page is read-only\n"); - nv_log("Pageframe Address: 0x%08x\n", frame_value); + nv_log("Pageframe Address: 0x%08x\n", frame_base); #endif // set up the dma transfer. we need to translate to a physical address. + + uint32_t final_address = 0; + + /* Simple case: hardware notification, we can just take the pte since it's based on the type */ + if (notification_type == 0) + { + final_address = frame_base + info_adjust; + } + else + { + // for software we have to calculate the pte index + uint32_t pte_num = ((notification_type << 4) + info_adjust) >> 12; + + /* ramin entries are sorted - 1 object for each pte entry...*/ + final_address = nv3_ramin_read32(notify_obj_base + (0x10 * pte_num) + 8, nv3); + final_address += (info_adjust & 0xFFF); + } + + /* send the notification off */ + nv_log("About to send the notification to 0x%08x (Check target)", final_address); + 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); + break; + case NV3_NOTIFICATION_TARGET_PCI: + case NV3_NOTIFICATION_TARGET_AGP: + dma_bm_write(final_address, (uint8_t*)¬ify, sizeof(nv3_notification_t), 4); + break; + } + + // we're done + nv3->pgraph.notify_pending = false; } diff --git a/src/video/nv/nv3/subsystems/nv3_pramdac.c b/src/video/nv/nv3/subsystems/nv3_pramdac.c index c9430018f..099248f66 100644 --- a/src/video/nv/nv3/subsystems/nv3_pramdac.c +++ b/src/video/nv/nv3/subsystems/nv3_pramdac.c @@ -194,7 +194,10 @@ nv_register_t pramdac_registers[] = { NV3_PRAMDAC_GENERAL_CONTROL, "PRAMDAC - General Control", NULL, NULL }, { NV3_PRAMDAC_VSERR_WIDTH, "PRAMDAC - Vertical Sync Error Width", NULL, NULL}, { NV3_PRAMDAC_VEQU_END, "PRAMDAC - VEqu End", NULL, NULL}, + { NV3_PRAMDAC_VBBLANK_START, "PRAMDAC - VBBlank Start", NULL, NULL}, { NV3_PRAMDAC_VBBLANK_END, "PRAMDAC - VBBlank End", NULL, NULL}, + { NV3_PRAMDAC_HBLANK_END, "PRAMDAC - Horizontal Blanking Interval End", NULL, NULL}, + { NV3_PRAMDAC_HBLANK_START, "PRAMDAC - Horizontal Blanking Interval Start", NULL, NULL}, { NV3_PRAMDAC_VBLANK_END, "PRAMDAC - Vertical Blanking Interval End", NULL, NULL}, { NV3_PRAMDAC_VBLANK_START, "PRAMDAC - Vertical Blanking Interval Start", NULL, NULL}, { NV3_PRAMDAC_VEQU_START, "PRAMDAC - VEqu Start", NULL, NULL}, @@ -220,7 +223,7 @@ uint32_t nv3_pramdac_read(uint32_t address) // todo: friendly logging - nv_log("PRAMDAC Read from 0x%08x", address); + nv_log("PRAMDAC Read from 0x%08x\n", address); // if the register actually exists if (reg) @@ -301,7 +304,7 @@ void nv3_pramdac_write(uint32_t address, uint32_t value) { nv_register_t* reg = nv_get_register(address, pramdac_registers, sizeof(pramdac_registers)/sizeof(pramdac_registers[0])); - nv_log("PRAMDAC Write 0x%08x -> 0x%08x", value, address); + nv_log("PRAMDAC Write 0x%08x -> 0x%08x\n", value, address); // if the register actually exists if (reg) diff --git a/src/video/nv/nv3/subsystems/nv3_pramin.c b/src/video/nv/nv3/subsystems/nv3_pramin.c index f85ae3f8e..439d44bd5 100644 --- a/src/video/nv/nv3/subsystems/nv3_pramin.c +++ b/src/video/nv/nv3/subsystems/nv3_pramin.c @@ -434,14 +434,14 @@ bool nv3_ramin_find_object(uint32_t name, uint32_t cache_num, uint8_t channel, u // Perform more validation - if (obj_context_struct.class_id > NV3_PFIFO_FIRST_VALID_GRAPHICS_OBJECT_ID - || obj_context_struct.class_id < NV3_PFIFO_LAST_VALID_GRAPHICS_OBJECT_ID) + if (obj_context_struct.class_id < NV3_PFIFO_FIRST_VALID_GRAPHICS_OBJECT_ID + || obj_context_struct.class_id > NV3_PFIFO_LAST_VALID_GRAPHICS_OBJECT_ID) { fatal("NV3: Invalid graphics object class ID name=0x%04x type=%04x, interpreted by pgraph as: %04x (Contact starfrost)", name, obj_context_struct.class_id, obj_context_struct.class_id & 0x1F); } else if (obj_context_struct.channel > NV3_DMA_CHANNELS) - fatal("NV3: Super fucked up graphics object. Contact starfrost with the error string: DMA Channel ID=%d, it should be 0-8", obj_context_struct.channel); + fatal("NV3: Super fucked up graphics object. Contact starfrost with the error string: DMA Channel ID=%d, it should be 0-7", obj_context_struct.channel); // Illegal accesses sent to RAMRO, so ignore here // TODO: SEND THESE TO RAMRO!!!!!