Re: [Nouveau] Add pause/unpause methods for PFIFO PGRAPH. Use them to get stable clock changes

2010-10-07 Thread Martin Peres

 Le 07/10/2010 03:33, Martin Peres a écrit :

 Hi,

Here is an updated version, all in one patch. When we agree on the 
code, I'll split it into 3 patches.



Sorry, I forgot to attach it. Here it is.
From 86e7dd89810b37a12ae189633de41aacf07355cb Mon Sep 17 00:00:00 2001
From: Martin Peres martin.pe...@ensi-bourges.fr
Date: Thu, 7 Oct 2010 05:20:38 +0200
Subject: [PATCH] Pause the card before reclocking

Signed-off-by: Martin Peres martin.pe...@ensi-bourges.fr
---
 drivers/gpu/drm/nouveau/nouveau_drv.h   |   10 ++
 drivers/gpu/drm/nouveau/nouveau_pm.c|   50 +-
 drivers/gpu/drm/nouveau/nouveau_reg.h   |3 ++
 drivers/gpu/drm/nouveau/nouveau_state.c |   35 +-
 drivers/gpu/drm/nouveau/nv50_fifo.c |   17 ++
 drivers/gpu/drm/nouveau/nv50_graph.c|   48 +
 6 files changed, 160 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.h b/drivers/gpu/drm/nouveau/nouveau_drv.h
index 591254e..9317bc3 100644
--- a/drivers/gpu/drm/nouveau/nouveau_drv.h
+++ b/drivers/gpu/drm/nouveau/nouveau_drv.h
@@ -304,6 +304,9 @@ struct nouveau_fifo_engine {
 	void (*destroy_context)(struct nouveau_channel *);
 	int  (*load_context)(struct nouveau_channel *);
 	int  (*unload_context)(struct drm_device *);
+
+	int  (*pause)(struct drm_device *);
+	void  (*unpause)(struct drm_device *);
 };
 
 struct nouveau_pgraph_object_method {
@@ -339,6 +342,9 @@ struct nouveau_pgraph_engine {
 
 	void (*set_region_tiling)(struct drm_device *dev, int i, uint32_t addr,
   uint32_t size, uint32_t pitch);
+
+	int  (*pause)(struct drm_device *);
+	void  (*unpause)(struct drm_device *);
 };
 
 struct nouveau_display_engine {
@@ -1036,6 +1042,8 @@ extern int  nv50_fifo_create_context(struct nouveau_channel *);
 extern void nv50_fifo_destroy_context(struct nouveau_channel *);
 extern int  nv50_fifo_load_context(struct nouveau_channel *);
 extern int  nv50_fifo_unload_context(struct drm_device *);
+extern int  nv50_fifo_pause(struct drm_device *);
+extern void  nv50_fifo_unpause(struct drm_device *);
 
 /* nvc0_fifo.c */
 extern int  nvc0_fifo_init(struct drm_device *);
@@ -1113,6 +1121,8 @@ extern int  nv50_graph_load_context(struct nouveau_channel *);
 extern int  nv50_graph_unload_context(struct drm_device *);
 extern void nv50_graph_context_switch(struct drm_device *);
 extern int  nv50_grctx_init(struct nouveau_grctx *);
+extern int nv50_graph_pause(struct drm_device *dev);
+extern void nv50_graph_unpause(struct drm_device *dev);
 
 /* nvc0_graph.c */
 extern int  nvc0_graph_init(struct drm_device *);
diff --git a/drivers/gpu/drm/nouveau/nouveau_pm.c b/drivers/gpu/drm/nouveau/nouveau_pm.c
index 1c99c55..b546a4d 100644
--- a/drivers/gpu/drm/nouveau/nouveau_pm.c
+++ b/drivers/gpu/drm/nouveau/nouveau_pm.c
@@ -55,6 +55,7 @@ nouveau_pm_perflvl_set(struct drm_device *dev, struct nouveau_pm_level *perflvl)
 {
 	struct drm_nouveau_private *dev_priv = dev-dev_private;
 	struct nouveau_pm_engine *pm = dev_priv-engine.pm;
+	uint32_t status;
 	int ret;
 
 	if (perflvl == pm-cur)
@@ -68,13 +69,58 @@ nouveau_pm_perflvl_set(struct drm_device *dev, struct nouveau_pm_level *perflvl)
 		}
 	}
 
+	/* TODO: Wait for vblank */
+
+	/* Disable interrupts */
+	nv_wr32(dev, 0x140, 0);
+
+	/* Pause the engines, if possible */
+	if (dev_priv-engine.fifo.pause(dev)) {
+		ret = -EIO;
+		goto out;
+	}
+	if (dev_priv-engine.graph.pause(dev)) {
+		ret = -EIO;
+		goto out;
+	}
+
+	/* Disable the PFIFO cache pulling */
+	status = nv_rd32(dev, 0x003250);
+	nv_wr32(dev, 0x003250, status0xfffe);
+
+	/* Disable the PFIFO cache dma push */
+	status = nv_rd32(dev, 0x003220);
+	nv_wr32(dev, 0x003220, status0xfffe);
+
+	/* Change the clocks */
 	nouveau_pm_clock_set(dev, perflvl, PLL_CORE, perflvl-core);
 	nouveau_pm_clock_set(dev, perflvl, PLL_SHADER, perflvl-shader);
 	nouveau_pm_clock_set(dev, perflvl, PLL_MEMORY, perflvl-memory);
 	nouveau_pm_clock_set(dev, perflvl, PLL_UNK05, perflvl-unk05);
 
+	/* Wait for PLLs to stabilize */
+	udelay(100);
+
 	pm-cur = perflvl;
-	return 0;
+	ret = 0;
+
+out:
+	/* Re-enable the PFIFO cache dma push */
+	status = nv_rd32(dev, 0x003220);
+	nv_wr32(dev, 0x003220, status|0x1);
+
+	/* Re-enable the PFIFO cache pulling */
+	status = nv_rd32(dev, 0x003250);
+	nv_wr32(dev, 0x003250, status|0x1);
+
+	/* Un-pause the engines */
+	dev_priv-engine.fifo.unpause(dev);
+	dev_priv-engine.graph.unpause(dev);
+
+	/* Re-enable interrupts */
+	nv_wr32(dev, 0x140, 1);
+
+	return ret;
 }
 
 static int
@@ -108,7 +154,7 @@ nouveau_pm_profile_set(struct drm_device *dev, const char *profile)
 			return -EINVAL;
 	}
 
-	NV_INFO(dev, setting performance level: %s\n, profile);
+	NV_INFO(dev, setting performance level: %s, profile);
 	return nouveau_pm_perflvl_set(dev, perflvl);
 }
 
diff --git a/drivers/gpu/drm/nouveau/nouveau_reg.h b/drivers/gpu/drm/nouveau/nouveau_reg.h
index 1b42541..346b77a 100644
--- a/drivers/gpu/drm/nouveau

Re: [Nouveau] Add pause/unpause methods for PFIFO PGRAPH. Use them to get stable clock changes

2010-10-06 Thread Martin Peres

 Hi,

Here is an updated version, all in one patch. When we agree on the code, 
I'll split it into 3 patches.


The new code is way better. As suggested on IRC, I also disable IRQs and 
PFIFO cache pull and push.


Please have a look and test it. This patch needs to get upstream as it 
gives a reliable way to change the clock even in the middle of a game.


It is not perfect yet, changing the clocks too often (like several 
thousand of times) lead to an hung card :)


Regards,

Martin
___
Nouveau mailing list
Nouveau@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/nouveau


Re: [Nouveau] Add pause/unpause methods for PFIFO PGRAPH. Use them to get stable clock changes

2010-09-30 Thread Martin Peres

 Hi,

Here is an updated set of patches (in regards on comments got on IRC and 
an handling error when using several channels).


These updated patch allow me to run 5 glxgears at the same time and 
reclock the card almost 100 times per second without crashing.


Don't panic if you get theses in your logs:
PGRAPH: wait for idle fail:    0103!
PGRAPH: PGRAPH paused while running a ctxprog, NV40_PGRAPH_CTXCTL_0310 = 
0x11


It means that we tried to reclock during a context switch. It would be 
safe to continue as when the program is at 0x11, it means it waits for 
another process (which is stopped because we stopped PFIFO before). I 
could allow to get this value (ie continue and clock), but if someone 
changes the ctxprog, he would have to update it here.


For the moment, I don't mind if from time to time, setting the clocks fail.

Waiting for your comments.

Regards,

Martin
From a219259d5ea46fb18f8e36c6c5a2f9e9e63fe53e Mon Sep 17 00:00:00 2001
From: Martin Peres martin.pe...@ensi-bourges.fr
Date: Wed, 29 Sep 2010 14:56:37 +0200
Subject: [PATCH 1/3] Add pause/unpause methods to the PFIFO engine

---
 drivers/gpu/drm/nouveau/nouveau_drv.h   |8 
 drivers/gpu/drm/nouveau/nouveau_reg.h   |1 +
 drivers/gpu/drm/nouveau/nouveau_state.c |   14 ++
 drivers/gpu/drm/nouveau/nv50_fifo.c |   18 ++
 4 files changed, 41 insertions(+), 0 deletions(-)

diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.h b/drivers/gpu/drm/nouveau/nouveau_drv.h
index 591254e..c256c0a 100644
--- a/drivers/gpu/drm/nouveau/nouveau_drv.h
+++ b/drivers/gpu/drm/nouveau/nouveau_drv.h
@@ -304,6 +304,9 @@ struct nouveau_fifo_engine {
 	void (*destroy_context)(struct nouveau_channel *);
 	int  (*load_context)(struct nouveau_channel *);
 	int  (*unload_context)(struct drm_device *);
+
+	int  (*pause)(struct drm_device *);
+	int  (*unpause)(struct drm_device *);
 };
 
 struct nouveau_pgraph_object_method {
@@ -339,6 +342,9 @@ struct nouveau_pgraph_engine {
 
 	void (*set_region_tiling)(struct drm_device *dev, int i, uint32_t addr,
   uint32_t size, uint32_t pitch);
+
+	int  (*pause)(struct drm_device *);
+	int  (*unpause)(struct drm_device *);
 };
 
 struct nouveau_display_engine {
@@ -1036,6 +1042,8 @@ extern int  nv50_fifo_create_context(struct nouveau_channel *);
 extern void nv50_fifo_destroy_context(struct nouveau_channel *);
 extern int  nv50_fifo_load_context(struct nouveau_channel *);
 extern int  nv50_fifo_unload_context(struct drm_device *);
+extern int  nv50_fifo_pause(struct drm_device *);
+extern int  nv50_fifo_unpause(struct drm_device *);
 
 /* nvc0_fifo.c */
 extern int  nvc0_fifo_init(struct drm_device *);
diff --git a/drivers/gpu/drm/nouveau/nouveau_reg.h b/drivers/gpu/drm/nouveau/nouveau_reg.h
index 1b42541..ee6dae1 100644
--- a/drivers/gpu/drm/nouveau/nouveau_reg.h
+++ b/drivers/gpu/drm/nouveau/nouveau_reg.h
@@ -701,6 +701,7 @@
 #define NV50_PGRAPH 0x0040
 #define NV50_PGRAPH__LEN   0x1
 #define NV50_PGRAPH__ESIZE 0x1
+#define NV50_PFIFO_FREEZE   0x2504
 
 #define NV50_PDISPLAY0x0061
 #define NV50_PDISPLAY_OBJECTS0x00610010
diff --git a/drivers/gpu/drm/nouveau/nouveau_state.c b/drivers/gpu/drm/nouveau/nouveau_state.c
index 75bce91..cfc34f5 100644
--- a/drivers/gpu/drm/nouveau/nouveau_state.c
+++ b/drivers/gpu/drm/nouveau/nouveau_state.c
@@ -86,6 +86,8 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev)
 		engine-fifo.destroy_context	= nv04_fifo_destroy_context;
 		engine-fifo.load_context	= nv04_fifo_load_context;
 		engine-fifo.unload_context	= nv04_fifo_unload_context;
+		engine-fifo.pause			= NULL;
+		engine-fifo.unpause		= NULL;
 		engine-display.early_init	= nv04_display_early_init;
 		engine-display.late_takedown	= nv04_display_late_takedown;
 		engine-display.create		= nv04_display_create;
@@ -140,6 +142,8 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev)
 		engine-fifo.destroy_context	= nv10_fifo_destroy_context;
 		engine-fifo.load_context	= nv10_fifo_load_context;
 		engine-fifo.unload_context	= nv10_fifo_unload_context;
+		engine-fifo.pause			= NULL;
+		engine-fifo.unpause		= NULL;
 		engine-display.early_init	= nv04_display_early_init;
 		engine-display.late_takedown	= nv04_display_late_takedown;
 		engine-display.create		= nv04_display_create;
@@ -194,6 +198,8 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev)
 		engine-fifo.destroy_context	= nv10_fifo_destroy_context;
 		engine-fifo.load_context	= nv10_fifo_load_context;
 		engine-fifo.unload_context	= nv10_fifo_unload_context;
+		engine-fifo.pause			= NULL;
+		engine-fifo.unpause		= NULL;
 		engine-display.early_init	= nv04_display_early_init;
 		engine-display.late_takedown	= nv04_display_late_takedown

[Nouveau] Add pause/unpause methods for PFIFO PGRAPH. Use them to get stable clock changes

2010-09-29 Thread Martin Peres

 Hi,

With these patches, I get reliable clock changes on my nv86. It should 
work from nv50 to nvc0 (non-included).


Now, we need to wait for vblank. This is on my TODO but if someone knows 
how to do so, please send me pointers to it or implement it yourself :)


Regards,

Martin
From a219259d5ea46fb18f8e36c6c5a2f9e9e63fe53e Mon Sep 17 00:00:00 2001
From: Martin Peres martin.pe...@ensi-bourges.fr
Date: Wed, 29 Sep 2010 14:56:37 +0200
Subject: [PATCH 1/3] Add pause/unpause methods to the PFIFO engine

Signed-off-by: Martin Peres martin.pe...@ensi-bourges.fr
---
 drivers/gpu/drm/nouveau/nouveau_drv.h   |8 
 drivers/gpu/drm/nouveau/nouveau_reg.h   |1 +
 drivers/gpu/drm/nouveau/nouveau_state.c |   14 ++
 drivers/gpu/drm/nouveau/nv50_fifo.c |   18 ++
 4 files changed, 41 insertions(+), 0 deletions(-)

diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.h b/drivers/gpu/drm/nouveau/nouveau_drv.h
index 591254e..c256c0a 100644
--- a/drivers/gpu/drm/nouveau/nouveau_drv.h
+++ b/drivers/gpu/drm/nouveau/nouveau_drv.h
@@ -304,6 +304,9 @@ struct nouveau_fifo_engine {
 	void (*destroy_context)(struct nouveau_channel *);
 	int  (*load_context)(struct nouveau_channel *);
 	int  (*unload_context)(struct drm_device *);
+
+	int  (*pause)(struct drm_device *);
+	int  (*unpause)(struct drm_device *);
 };
 
 struct nouveau_pgraph_object_method {
@@ -339,6 +342,9 @@ struct nouveau_pgraph_engine {
 
 	void (*set_region_tiling)(struct drm_device *dev, int i, uint32_t addr,
   uint32_t size, uint32_t pitch);
+
+	int  (*pause)(struct drm_device *);
+	int  (*unpause)(struct drm_device *);
 };
 
 struct nouveau_display_engine {
@@ -1036,6 +1042,8 @@ extern int  nv50_fifo_create_context(struct nouveau_channel *);
 extern void nv50_fifo_destroy_context(struct nouveau_channel *);
 extern int  nv50_fifo_load_context(struct nouveau_channel *);
 extern int  nv50_fifo_unload_context(struct drm_device *);
+extern int  nv50_fifo_pause(struct drm_device *);
+extern int  nv50_fifo_unpause(struct drm_device *);
 
 /* nvc0_fifo.c */
 extern int  nvc0_fifo_init(struct drm_device *);
diff --git a/drivers/gpu/drm/nouveau/nouveau_reg.h b/drivers/gpu/drm/nouveau/nouveau_reg.h
index 1b42541..ee6dae1 100644
--- a/drivers/gpu/drm/nouveau/nouveau_reg.h
+++ b/drivers/gpu/drm/nouveau/nouveau_reg.h
@@ -701,6 +701,7 @@
 #define NV50_PGRAPH 0x0040
 #define NV50_PGRAPH__LEN   0x1
 #define NV50_PGRAPH__ESIZE 0x1
+#define NV50_PFIFO_FREEZE   0x2504
 
 #define NV50_PDISPLAY0x0061
 #define NV50_PDISPLAY_OBJECTS0x00610010
diff --git a/drivers/gpu/drm/nouveau/nouveau_state.c b/drivers/gpu/drm/nouveau/nouveau_state.c
index 75bce91..cfc34f5 100644
--- a/drivers/gpu/drm/nouveau/nouveau_state.c
+++ b/drivers/gpu/drm/nouveau/nouveau_state.c
@@ -86,6 +86,8 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev)
 		engine-fifo.destroy_context	= nv04_fifo_destroy_context;
 		engine-fifo.load_context	= nv04_fifo_load_context;
 		engine-fifo.unload_context	= nv04_fifo_unload_context;
+		engine-fifo.pause			= NULL;
+		engine-fifo.unpause		= NULL;
 		engine-display.early_init	= nv04_display_early_init;
 		engine-display.late_takedown	= nv04_display_late_takedown;
 		engine-display.create		= nv04_display_create;
@@ -140,6 +142,8 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev)
 		engine-fifo.destroy_context	= nv10_fifo_destroy_context;
 		engine-fifo.load_context	= nv10_fifo_load_context;
 		engine-fifo.unload_context	= nv10_fifo_unload_context;
+		engine-fifo.pause			= NULL;
+		engine-fifo.unpause		= NULL;
 		engine-display.early_init	= nv04_display_early_init;
 		engine-display.late_takedown	= nv04_display_late_takedown;
 		engine-display.create		= nv04_display_create;
@@ -194,6 +198,8 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev)
 		engine-fifo.destroy_context	= nv10_fifo_destroy_context;
 		engine-fifo.load_context	= nv10_fifo_load_context;
 		engine-fifo.unload_context	= nv10_fifo_unload_context;
+		engine-fifo.pause			= NULL;
+		engine-fifo.unpause		= NULL;
 		engine-display.early_init	= nv04_display_early_init;
 		engine-display.late_takedown	= nv04_display_late_takedown;
 		engine-display.create		= nv04_display_create;
@@ -248,6 +254,8 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev)
 		engine-fifo.destroy_context	= nv10_fifo_destroy_context;
 		engine-fifo.load_context	= nv10_fifo_load_context;
 		engine-fifo.unload_context	= nv10_fifo_unload_context;
+		engine-fifo.pause			= NULL;
+		engine-fifo.unpause		= NULL;
 		engine-display.early_init	= nv04_display_early_init;
 		engine-display.late_takedown	= nv04_display_late_takedown;
 		engine-display.create		= nv04_display_create;
@@ -305,6 +313,8 @@ static int

Re: [Nouveau] [RFC] Initial power management vbios parsing, voltage clock setting to nouveau.

2010-09-19 Thread Martin Peres

 Le 15/09/2010 14:58, Robert Kaiser a écrit :
On an only slightly related note, what's the recommended way to read 
out the temperature of the GPU when using nouveau? (I have a NV4B 
card, but I think I read this is mostly the same for all NVidias, right?)
There is no way to get the temperature using nouveau at the moment. This 
feature should land in nouveau git some time this week.


Reading the temperature is not as straightforward as just reading a 
register. It works that way on nv84+, for earlier cards, you need to 
parse the vbios to set-up the sensor and then read the temperature (and 
change the value with some additional little calcultations). The 
documentation should be available soon, I'm working on merging all the 
doc we have.

___
Nouveau mailing list
Nouveau@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/nouveau


Re: [Nouveau] [RFC] Initial power management vbios parsing, voltage clock setting to nouveau.

2010-09-16 Thread Martin Peres

 Le 15/09/2010 14:33, C. Bergström a écrit :

If you're an end users also feel free to pull the branch directly..

http://github.com/pathscale/pscnv/tree/pm-wip

We're in #pathscale if you need more help or hit bugs..

It is not a good idea as libpdrm isn't mainstream yet. As Ben said, it 
should be developped in nouveau. Pscnv isn't ready for X users yet even 
though we are working on it.


If people want to, I'll upload a complete kernel somewhere for end users 
to test. As for the moment, I only need developpers  people who know 
what they are doing, not end-users.


Anyway, count on me to keep pscnv  nouveau in sync as for power management.

thanks

./C

ps (Have a great trip Martin and good luck at the conference!)


Thanks :)
___
Nouveau mailing list
Nouveau@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/nouveau


[Nouveau] [RFC] Initial power management vbios parsing, voltage clock setting to nouveau.

2010-09-15 Thread Martin Peres

 Hi folks,

I've been messing with PM management for a few days and I've accumulated 
an interesting volume of code.


I am now interested in comments on the overall architecture. For 
example, in this patch, I implement a proposition on how to split 
nouveau_bios.c I would really like you to comment. I have also 
introduced nouveau_pm.[hc] along with vbios/vbios_pm.[ch].


Another thing I would be interested in is the vbios parsing testing.
At the moment, it should work from nv40 to at least nv96 but it has 
really been tested only on an nv86 and an nv96. I'm expecting a lot of 
bug report.


Power mode setting is _not recommended for anything other than dev 
testing_.

There is still work to be done:
- Clock  voltage: It needs testing.
- Memory timings: It is being REed by RSpliet (please help him, he 
should be able to provide directions).

- Fan control: I have no information on this.

Despite these lacks, you should be able to safely try to downclock your 
card though. That's good news for laptop users, isn't it?


Please acknowledge that this work is almost entirely based on others's 
RE work and documentation work. Xexaxo's work has been impressive. 
RSpliet is also to be thanked as he is working on getting memory timing 
support. Darktama has also done some nice RE, we'll see how to merge his 
work. My work here has just been to implement the docs.


On a side note, I would like to say I will be out for 5 days to the XDS 
2010.
So, if you have questions I should discuss with some devs there, feel 
free to ask.


Best regards,

Martin Peres (aka mupuf), an happy new nouveau dev

 How to help for the vbios parsing ?
Thanks for wanting to help :)

First, grab the patch I've joined to this mail. It should cleanly apply 
on nouveau's master branch.

Compile, Install  Reboot.

$ cat /sys/class/drm/card0/device/pm_status
and compare the values to
# nvclock -i

If it differs, please follow the instructions here:
http://nouveau.freedesktop.org/wiki/PowerManagementDumps
If it works, then, you may want to try changing the clocks.

 How to test clock/voltage setting ?
Do not attempt anything if the vbios parsing is wrong, really.
If it did work as intended, you can continue.

** Warning ** Do not try to upclock your card, nothing good will happen.
  While playing with clocks, always check the 
current temperature


First, kill X (for safety reasons).
Then look for the wanted mode by doing:
$ cat /sys/class/drm/card0/device/pm_mode

It should give you a result like:
--- PM Modes ---
 0: core 169 MHz/shader 338 MHz/memory 100 MHz/1150 mV
*1: core 275 MHz/shader 550 MHz/memory 301 MHz/1150 mV
 2: core 400 MHz/shader 800 MHz/memory 600 MHz/1200 mV

The * means it is the currently used mode (it may also not be detected).

In this example, you should only stay between mode 0 and 1.
To set the wanted PM mode, please do so:
# echo 0  /sys/class/drm/card0/device/pm_mode
The command above will change the mode to the first mode.

There is another file for voltage control at 
/sys/class/drm/card0/device/pm_voltage that works the exact same way as 
pm_mode.


The other sysfs entries (temperature related) should be useless to you 
as they are just here for future work).


You're done, have fun.

From 38aba214268ecd0263b2a49af0698d84f6a364e6 Mon Sep 17 00:00:00 2001
From: Martin Peres martin.pe...@ensi-bourges.fr
Date: Wed, 15 Sep 2010 12:59:00 +0200
Subject: [PATCH] Add initial power management vbios parsing, voltage  clock setting to nouveau.
 It is not intented to be used by end-users (if it should be used at all),
 this commit is meant for devs to check the actual work and comment on it.

So, you may wondering what I'm asking you. I simply ask you to check the code
and see if you could improve this design.
Also, you can try:
$ cat /sys/class/drm/card0/device/pm_status
and comparing it to # nvclock -i.
If it doesn't match, please provide us with power management dumps  kernel logs:
http://nouveau.freedesktop.org/wiki/PowerManagementDumps
If it does match, report your success story also :)

Known issues: As no memory timing parsing/get/set is implemented yet (RSPliet
has been working on it but it is not complete yet), your card will likely hang
if you upclock the memory. Lowering the clocks should work fine though:
echo 0  /sys/class/drm/card0/device/pm_mode

WARNING: Use at your own risks. Please stop your machine after having fun with
this and reboot it after a minute in order to flush everything in the card.
Keep in mind how experimental it is ;)

Ack: Most of this work is based on xexaxo's documentation work and useful
advices.
---
 drivers/gpu/drm/nouveau/Makefile |2 +-
 drivers/gpu/drm/nouveau/nouveau_bios.c   |   67 +++-
 drivers/gpu/drm/nouveau/nouveau_bios.h   |   41 ++
 drivers/gpu/drm/nouveau/nouveau_biosP.h  |   44 ++
 drivers/gpu/drm/nouveau/nouveau_drv.h|2 +
 drivers/gpu/drm/nouveau/nouveau_pm.c |  677 ++
 drivers/gpu

Re: [Nouveau] Re-enable dithering after commit a7b9f9e5adef276c25584e28ce9e520045ff048b

2010-06-17 Thread Martin Peres

Le 16/06/2010 09:38, Martin Peres a écrit :

Hi everyone,

After commit a7b9f9e5adef276c25584e28ce9e520045ff048b, dithering has 
disappeared on LVDS (for those who needed it).


ThibG on IRC has bisected this behaviour to 
a7b9f9e5adef276c25584e28ce9e520045ff048b. Here is a patch that 
re-enables it.


Please comment on it.

Martin

Well, too late, Jerez already pushed a patch to do that :)

Do you have any idea of why it took almost 10 hours between the moment I 
sent this mail and the moment I actually received it from the list ? Is 
there a manual approbation somewhere to get rid of the spam ?


Thanks to Jerez for the patch anyway :) It works just as great and is 
better designed.


___
Nouveau mailing list
Nouveau@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/nouveau


Re: [Nouveau] Gart to vram/vram to gart transfers broken on NVS 140M

2010-04-25 Thread Martin PERES

Le 22/04/2010 12:20, Stephane Marchesin a écrit :

On Thu, Apr 22, 2010 at 03:13, Martin Peresmartin.pe...@free.fr  wrote:
   

Hi Nouveau folks,

I've been encountering some corruption on pixmaps for a while now, and it
seems like the problem comes from the DFS/UTS (Download From Screen / Upload
To Screen).

In fact, I'm pretty sure the problem comes from there as screenshots are
garbled and so does a few more things.

I may have time to dig this up, where should I start, is there some
documentation on the NVS 140M ? Where is the gart2vram code located ?
Do you have any idea of where could be the problem ?

 

If you really think that's UTS/DFS, edit nouveau_exa.c and disable
them (change the UTS/DFS functions to return FALSE, that'll trigger
fallbacks to sw copying).

Stephane
   
In fact, following your advice triggers a lot more corruption. So, the 
problem comes from elsewhere. My corruption problem seems like  there is 
a codepath that copy a pixmap with wrong height and width.


I'll dig into it. I'll keep in touch.

Martin
___
Nouveau mailing list
Nouveau@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/nouveau


[Nouveau] Gart to vram/vram to gart transfers broken on NVS 140M

2010-04-22 Thread Martin Peres

Hi Nouveau folks,

I've been encountering some corruption on pixmaps for a while now, and 
it seems like the problem comes from the DFS/UTS (Download From Screen / 
Upload To Screen).


In fact, I'm pretty sure the problem comes from there as screenshots are 
garbled and so does a few more things.


I may have time to dig this up, where should I start, is there some 
documentation on the NVS 140M ? Where is the gart2vram code located ?

Do you have any idea of where could be the problem ?

Thanks,

Martin
___
Nouveau mailing list
Nouveau@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/nouveau


[Nouveau] GtkPerf: Non linear Add text execution time

2010-03-12 Thread Martin Peres

Hello everyone,

I am a daily tester of the nouveau driver on my (nVidia Corporation 
Quadro NVS 140M (rev a1)).


Today, when trying to make compiz crash, I have tried to execute a lot 
of tests at the same time with both 2D and 3D. Well, I didn't bump into 
any crashes but I have discovered a really annoying performance issue.


Indeed, the gtkTextView - Add Text of gtkperf has non-linear execution 
times:


GtkPerf 0.40 - Starting testing: Fri Mar 12 13:57:19 2010

GtkTextView - Add text - time:  0,03 -- 10 executions
 ---
Total time:  0,04

GtkPerf 0.40 - Starting testing: Fri Mar 12 13:57:28 2010

GtkTextView - Add text - time:  0,99  -- 100 executions
 ---
Total time:  0,99

GtkPerf 0.40 - Starting testing: Fri Mar 12 13:57:34 2010

GtkTextView - Add text - time: 88,19 -- 1000 executions
 ---
Total time: 88,19

So, if results were linear, we would have had a 3 seconds execution time 
with 1000 executions while we got 88.19s.


Just to give you an idea. I was testing with even more iterations and 
adding just one single text can take more than one second.


I don't know if it is a performance regression or if it has always been 
here but this could explain some slow code-path I sometime encounter 
using nouveau on lengthy webpages.


What do you think about it ?

Also, one last question, do you have any idea why KWin doesn't let me 
activate the composite. Do you think the problem is from KWin or does 
Nouveau misses a few features to get it working ?


Anyway, I am an happy tester of the nouveau stack and I would be glad to 
help you in running tests/applying patches on my card.


Martin
___
Nouveau mailing list
Nouveau@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/nouveau


Re: [Nouveau] [TEST REQUEST] NV50/NV8x/NV9x/NVAx ctxprog and ctxvals generator

2010-02-24 Thread Martin PERES

Le 24/02/2010 09:22, Marcin Kościelnicki a écrit :

Aiii... ok, I accidentally introduced a bug in pre-NVA0 branch during last-
minute cleanups... I just uploaded a new version at the same address that
should fix that issue.

Btw, to anyone reporting success/failure with the generator: please include
your chipset code number [NV50, NV96, NVA5, etc.]. If you don't know what it
is, just report the hex number in Detected an NV50 generation card
(0x086900a2) line

Sorry for that screwup

Marcin Kościelnicki
   

It works better now, I could not spot any regression.

Thanks,

Martin

___
Nouveau mailing list
Nouveau@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/nouveau


Re: [Nouveau] [TEST REQUEST] NV50/NV8x/NV9x/NVAx ctxprog and ctxvals generator

2010-02-23 Thread Martin PERES

Hello,

Sorry for not answering to the right message, I've just joined the 
mailing list.


I've tried this patch on my Quadro NVS 140M and it fails to load KDM.
It shows the background but fails to show the credential edit boxes.
It seems like the computer is locked up though the mouse can still move 
(can't do any VT switches) and

I still can ssh on it.

Needless to say this works without the patch ;)

Martin

dmesg:
[drm] Initialized drm 1.1.0 20060810
nouveau :01:00.0: power state changed by ACPI to D0
nouveau :01:00.0: PCI INT A - GSI 16 (level, low) - IRQ 16
nouveau :01:00.0: setting latency timer to 64
[drm] nouveau :01:00.0: failed to evaluate _DSM: 5
[drm] nouveau :01:00.0: Detected an NV50 generation card (0x086900a2)
[drm] nouveau :01:00.0: Attempting to load BIOS image from PRAMIN
[drm] nouveau :01:00.0: ... appears to be valid
[drm] nouveau :01:00.0: BIT BIOS found
[drm] nouveau :01:00.0: Bios version 60.86.3e.00
[drm] nouveau :01:00.0: TMDS table revision 2.0 not currently supported
[drm] nouveau :01:00.0: BIT table 'd' not found
[drm] nouveau :01:00.0: Found Display Configuration Block version 4.0
[drm] nouveau :01:00.0: DCB connector table: VHER 0x40 5 14 2
[drm] nouveau :01:00.0:   0: 0x0040: type 0x40 idx 0 tag 0xff
[drm] nouveau :01:00.0:   1: 0x0100: type 0x00 idx 1 tag 0xff
[drm] nouveau :01:00.0:   2: 0x1231: type 0x31 idx 2 tag 0x07
[drm] nouveau :01:00.0:   3: 0x0311: type 0x11 idx 3 tag 0xff
[drm] nouveau :01:00.0: Raw DCB entry 0: 01000323 00010034
[drm] nouveau :01:00.0: Raw DCB entry 1: 02811300 0028
[drm] nouveau :01:00.0: Raw DCB entry 2: 02822312 00010030
[drm] nouveau :01:00.0: Raw DCB entry 3: 014333f1 0080c080
[drm] nouveau :01:00.0: Raw DCB entry 4: 000e 
[drm] nouveau :01:00.0: Parsing VBIOS init table 0 at offset 0xDD0F
[drm] nouveau :01:00.0: Parsing VBIOS init table 1 at offset 0xE04F
[drm] nouveau :01:00.0: Parsing VBIOS init table 2 at offset 0xEAA4
[drm] nouveau :01:00.0: Parsing VBIOS init table 3 at offset 0xEB96
[drm] nouveau :01:00.0: Parsing VBIOS init table 4 at offset 0xED83
[drm] nouveau :01:00.0: Parsing VBIOS init table at offset 0xEDE8
[drm] nouveau :01:00.0: 0xEDE8: Condition still not met after 20ms, 
skipping following opcodes

[drm] nouveau :01:00.0: 0xCE7E: parsing output script 0
[drm] nouveau :01:00.0: 0xCFF4: parsing output script 0
[drm] nouveau :01:00.0: 0xC66A: parsing output script 0
[TTM] Zone  kernel: Available graphics memory: 443326 kiB.
[TTM] Zone highmem: Available graphics memory: 1036578 kiB.
[drm] nouveau :01:00.0: 128 MiB VRAM
[drm] nouveau :01:00.0: 512 MiB GART (aperture)
[drm] nouveau :01:00.0: Allocating FIFO number 1
[drm] nouveau :01:00.0: nouveau_channel_alloc: initialised FIFO 1
[drm] nouveau :01:00.0: Detected a LVDS output
[drm] nouveau :01:00.0: Detected a DAC output
[drm] nouveau :01:00.0: Detected a TMDS output
[drm] nouveau :01:00.0: DCB encoder 1 unknown
[drm] nouveau :01:00.0: Detected a LVDS connector
[drm] nouveau :01:00.0: Detected a VGA connector
[drm] nouveau :01:00.0: Detected a DVI-D connector
[drm] nouveau :01:00.0: allocated 1280x800 fb: 0x4025, bo f6813200
[drm] LVDS-7: set mode 1280x800 1a
[drm] nouveau :01:00.0: 0xCE82: parsing output script 1
[drm] nouveau :01:00.0: 0xCCE3: parsing clock script 0
Console: switching to colour frame buffer device 160x50
fb0: nouveaufb frame buffer device
registered panic notifier
[drm] Initialized nouveau 0.0.16 20090420 for :01:00.0 on minor 0
[drm] nouveau :01:00.0: 0xCE41: parsing clock script 1

...

# When loading KDM
[drm] nouveau :01:00.0: Allocating FIFO number 2
[drm] nouveau :01:00.0: nouveau_channel_alloc: initialised FIFO 2
[drm] nouveau :01:00.0: Allocating FIFO number 3
[drm] nouveau :01:00.0: nouveau_channel_alloc: initialised FIFO 3
# Stuck !
___
Nouveau mailing list
Nouveau@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/nouveau


<    1   2   3   4