summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuca Barbieri <luca@luca-barbieri.com>2010-03-28 19:40:25 +0200
committerLuca Barbieri <luca@luca-barbieri.com>2010-03-28 19:40:25 +0200
commitac6dd980feff0e435bdca3d7d38909c50974a101 (patch)
treea81b3317743955ebf1baffa0e4ed4d8173048cd7
parent14984acb5e5364a9ead6646cf6cf8ac60f539395 (diff)
rework rd/wr get/put logic
-rw-r--r--channels.cpp4
-rw-r--r--nvlib.h79
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;
}
diff --git a/nvlib.h b/nvlib.h
index 137c471..c6deffa 100644
--- a/nvlib.h
+++ b/nvlib.h
@@ -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);
}
}
};