DEVICE_READ32_SWITCH() { case NV_PFB_CFG0: /* 3-4 memory partitions. The debug bios checks this. */ result = 3; // = NV_PFB_CFG0_PART_4 break; case NV_PFB_CSTATUS: result = d->vram_size; break; case NV_PFB_WBC: result = 0; // = !NV_PFB_WBC_FLUSH /* Flush not pending. */ break; default: DEVICE_READ32_REG(pfb); break; }
DEVICE_READ32_SWITCH() { case NV_PFIFO_RAMHT: result = 0x03000100; // = NV_PFIFO_RAMHT_SIZE_4K | NV_PFIFO_RAMHT_BASE_ADDRESS(NumberOfPaddingBytes >> 12) | NV_PFIFO_RAMHT_SEARCH_128 break; case NV_PFIFO_RAMFC: result = 0x00890110; // = ? | NV_PFIFO_RAMFC_SIZE_2K | ? break; case NV_PFIFO_INTR_0: result = d->pfifo.pending_interrupts; break; case NV_PFIFO_INTR_EN_0: result = d->pfifo.enabled_interrupts; break; case NV_PFIFO_RUNOUT_STATUS: result = NV_PFIFO_RUNOUT_STATUS_LOW_MARK; /* low mark empty */ break; case NV_PFIFO_CACHE1_PUSH0: result = d->pfifo.cache1.push_enabled; break; case NV_PFIFO_CACHE1_PUSH1: SET_MASK(result, NV_PFIFO_CACHE1_PUSH1_CHID, d->pfifo.cache1.channel_id); SET_MASK(result, NV_PFIFO_CACHE1_PUSH1_MODE, d->pfifo.cache1.mode); break; case NV_PFIFO_CACHE1_STATUS: { qemu_mutex_lock(&d->pfifo.cache1.cache_lock); if (d->pfifo.cache1.cache.empty()) { result |= NV_PFIFO_CACHE1_STATUS_LOW_MARK; /* low mark empty */ } qemu_mutex_unlock(&d->pfifo.cache1.cache_lock); break; } case NV_PFIFO_CACHE1_DMA_PUSH: SET_MASK(result, NV_PFIFO_CACHE1_DMA_PUSH_ACCESS, d->pfifo.cache1.dma_push_enabled); SET_MASK(result, NV_PFIFO_CACHE1_DMA_PUSH_STATUS, d->pfifo.cache1.dma_push_suspended); SET_MASK(result, NV_PFIFO_CACHE1_DMA_PUSH_BUFFER, 1); /* buffer emoty */ break; case NV_PFIFO_CACHE1_DMA_STATE: SET_MASK(result, NV_PFIFO_CACHE1_DMA_STATE_METHOD_TYPE, d->pfifo.cache1.method_nonincreasing); SET_MASK(result, NV_PFIFO_CACHE1_DMA_STATE_METHOD, d->pfifo.cache1.method >> 2); SET_MASK(result, NV_PFIFO_CACHE1_DMA_STATE_SUBCHANNEL, d->pfifo.cache1.subchannel); SET_MASK(result, NV_PFIFO_CACHE1_DMA_STATE_METHOD_COUNT, d->pfifo.cache1.method_count); SET_MASK(result, NV_PFIFO_CACHE1_DMA_STATE_ERROR, d->pfifo.cache1.error); break; case NV_PFIFO_CACHE1_DMA_INSTANCE: SET_MASK(result, NV_PFIFO_CACHE1_DMA_INSTANCE_ADDRESS_MASK, d->pfifo.cache1.dma_instance >> 4); break; case NV_PFIFO_CACHE1_DMA_PUT: result = d->user.channel_control[d->pfifo.cache1.channel_id].dma_put; break; case NV_PFIFO_CACHE1_DMA_GET: result = d->user.channel_control[d->pfifo.cache1.channel_id].dma_get; break; case NV_PFIFO_CACHE1_DMA_SUBROUTINE: result = d->pfifo.cache1.subroutine_return | (xbaddr)d->pfifo.cache1.subroutine_active; break; case NV_PFIFO_CACHE1_PULL0: { qemu_mutex_lock(&d->pfifo.cache1.cache_lock); result = d->pfifo.cache1.pull_enabled; qemu_mutex_unlock(&d->pfifo.cache1.cache_lock); break; } case NV_PFIFO_CACHE1_ENGINE: { qemu_mutex_lock(&d->pfifo.cache1.cache_lock); for (int i = 0; i < NV2A_NUM_SUBCHANNELS; i++) { result |= d->pfifo.cache1.bound_engines[i] << (i * 2); } qemu_mutex_unlock(&d->pfifo.cache1.cache_lock); break; } case NV_PFIFO_CACHE1_DMA_DCOUNT: result = d->pfifo.cache1.dcount; break; case NV_PFIFO_CACHE1_DMA_GET_JMP_SHADOW: result = d->pfifo.cache1.get_jmp_shadow; break; case NV_PFIFO_CACHE1_DMA_RSVD_SHADOW: result = d->pfifo.cache1.rsvd_shadow; break; case NV_PFIFO_CACHE1_DMA_DATA_SHADOW: result = d->pfifo.cache1.data_shadow; break; default: DEVICE_READ32_REG(pfifo); // Was : DEBUG_READ32_UNHANDLED(PFIFO); break; }