diff options
author | Luca Barbieri <luca@luca-barbieri.com> | 2010-03-28 19:40:25 +0200 |
---|---|---|
committer | Luca Barbieri <luca@luca-barbieri.com> | 2010-03-28 19:40:25 +0200 |
commit | ac6dd980feff0e435bdca3d7d38909c50974a101 (patch) | |
tree | a81b3317743955ebf1baffa0e4ed4d8173048cd7 | |
parent | 14984acb5e5364a9ead6646cf6cf8ac60f539395 (diff) |
rework rd/wr get/put logic
-rw-r--r-- | channels.cpp | 4 | ||||
-rw-r--r-- | nvlib.h | 79 |
2 files changed, 41 insertions, 42 deletions
diff --git a/channels.cpp b/channels.cpp index 2745396..65714be 100644 --- a/channels.cpp +++ b/channels.cpp @@ -12,8 +12,8 @@ int main(int argc, char** argv) printf("Channel %i\n", i); printf(" enabled = %i\n", dev->is_channel_enabled(i)); printf(" dma = %08x\n", dev->ramfc->fc[i]->rd32(dev->ramfc->fc_fifo) << 4); - printf(" get = %08x\n", dev->users->user[i]->rd_get()); - printf(" put = %08x\n", dev->users->user[i]->rd_put()); + printf(" get = %08x\n", dev->rd_get(i)); + printf(" put = %08x\n", dev->rd_put(i)); } return 0; } @@ -535,26 +535,6 @@ struct nv_device : public nv_region ptr = users->ptr + users->user_size * channel; size = users->user_size; } - - uint32_t rd_get() - { - return rd32(0x44); - } - - void wr_get(uint32_t value) - { - wr32(0x44, value); - } - - uint32_t rd_put() - { - return rd32(0x40); - } - - void wr_put(uint32_t value) - { - wr32(0x40, value); - } }; nv_device* dev; @@ -711,6 +691,30 @@ struct nv_device : public nv_region return !!(rd32(NV50_PFIFO_CTX_TABLE(channel)) & NV50_PFIFO_CTX_TABLE_CHANNEL_ENABLED); } + uint32_t rd_get(unsigned channel) + { + return users->user[channel]->rd32(0x44); + } + + void wr_get(unsigned channel, uint32_t value) + { + users->user[channel]->wr32(0x44, value); + } + + uint32_t rd_put(unsigned channel) + { + /* user put always reads as 0 pre-nv40 */ + if(card_type < NV_40) + return ramfc->fc[channel]->rd32(0); // TODO: what if the channel is executing right now? + else + return users->user[channel]->rd32(0x40); + } + + void wr_put(unsigned channel, uint32_t value) + { + users->user[channel]->wr32(0x40, value); + } + void get_grclasses(unsigned channel, unsigned grclasses[8]) { if(os->nv_driver == NV_DRIVER_NVIDIA) { @@ -790,8 +794,8 @@ int nv_find_idle_channel(struct nv_device* dev) else enabled[i] = dev->is_channel_enabled(i); if(enabled[i]) { - gets1[i] = dev->users->user[i]->rd_get(); - puts1[i] = dev->users->user[i]->rd_put(); + gets1[i] = dev->rd_get(i); + puts1[i] = dev->rd_put(i); } } @@ -801,8 +805,8 @@ int nv_find_idle_channel(struct nv_device* dev) if(enabled[i]) { enabled[i] = dev->is_channel_enabled(i); if(enabled[i]) { - gets2[i] = dev->users->user[i]->rd_get(); - puts2[i] = dev->users->user[i]->rd_put(); + gets2[i] = dev->rd_get(i); + puts2[i] = dev->rd_put(i); } } } @@ -862,20 +866,17 @@ struct nv_channel { struct nv_channel_direct : public nv_channel { - nv_user* user; - nv_channel_direct(struct nv_device* dev, int channel) : nv_channel(dev, channel) { - user = dev->users->user[channel]; } virtual void wait_idle() { uint32_t get, put; - put = user->rd_put(); + put = dev->rd_put(channel); while(get != put) - get = user->rd_get(); + get = dev->rd_get(channel); } }; @@ -918,17 +919,17 @@ struct nv_channel_vram : public nv_channel_direct if(put != our_put) { if(!taken) { wait_idle(); - orig_getput = user->rd_put(); + orig_getput = dev->rd_put(channel); orig_ctxdma = dev->ramfc->fc[channel]->rd32(dev->ramfc->fc_fifo) << 4; dev->ramfc->fc[channel]->wr32(dev->ramfc->fc_fifo, vram_ctxdma >> 4); - user->wr_get(put); - user->wr_put(put); + dev->wr_get(channel, put); + dev->wr_put(channel, put); taken = true; } put = our_put; - user->wr_put(put); + dev->wr_put(channel, put); } } @@ -945,7 +946,6 @@ struct nv_channel_runner struct nv_channel_parasite : public nv_channel_direct { std::auto_ptr<nv_dma_object> dmaobj; - nv_user* user; uint32_t dmactx; uint32_t put; uint32_t our_put; @@ -957,8 +957,7 @@ struct nv_channel_parasite : public nv_channel_direct { uint32_t dmactx = dev->ramfc->fc[channel]->rd32(dev->ramfc->fc_fifo) << 4; dmaobj.reset(new nv_dma_object(&*dev->ramin, dmactx)); - user = dev->users->user[channel]; - orig_getput = our_put = put = user->rd_put(); + orig_getput = our_put = put = dev->rd_put(channel); } virtual void outp(void* buf, int dwords) @@ -973,7 +972,7 @@ struct nv_channel_parasite : public nv_channel_direct { if(put != our_put) { put = our_put; - user->wr_put(put); + dev->wr_put(channel, put); } } @@ -989,12 +988,12 @@ struct nv_channel_parasite : public nv_channel_direct fire(); wait_idle(); - user->wr_get(orig_getput); - user->wr_put(orig_getput); + dev->wr_get(channel, orig_getput); + dev->wr_put(channel, orig_getput); runner->run(); - orig_getput = our_put = put = user->rd_put(); + orig_getput = our_put = put = dev->rd_put(channel); } } }; |