aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorBen Skeggs <bskeggs@redhat.com>2010-11-18 23:32:56 -0500
committerFrancisco Jerez <currojerez@riseup.net>2010-12-07 21:00:36 -0500
commit12fb9525075982bc65cfd71427dd7afdf47bafed (patch)
tree0e8b75e10ec7c5b607f14d24b857041850bc40d9 /drivers
parentceac30999dfb00ee7b56cfea8b28ef50999a3c95 (diff)
drm/nouveau: introduce a util function to wait on reg != val
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_drv.h10
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_hw.c4
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_state.c22
-rw-r--r--drivers/gpu/drm/nouveau/nv04_dac.c12
4 files changed, 35 insertions, 13 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.h b/drivers/gpu/drm/nouveau/nouveau_drv.h
index bbf19861b6c..e82dff4008c 100644
--- a/drivers/gpu/drm/nouveau/nouveau_drv.h
+++ b/drivers/gpu/drm/nouveau/nouveau_drv.h
@@ -795,8 +795,10 @@ extern int nouveau_ioctl_getparam(struct drm_device *, void *data,
795 struct drm_file *); 795 struct drm_file *);
796extern int nouveau_ioctl_setparam(struct drm_device *, void *data, 796extern int nouveau_ioctl_setparam(struct drm_device *, void *data,
797 struct drm_file *); 797 struct drm_file *);
798extern bool nouveau_wait_until(struct drm_device *, uint64_t timeout, 798extern bool nouveau_wait_eq(struct drm_device *, uint64_t timeout,
799 uint32_t reg, uint32_t mask, uint32_t val); 799 uint32_t reg, uint32_t mask, uint32_t val);
800extern bool nouveau_wait_ne(struct drm_device *, uint64_t timeout,
801 uint32_t reg, uint32_t mask, uint32_t val);
800extern bool nouveau_wait_for_idle(struct drm_device *); 802extern bool nouveau_wait_for_idle(struct drm_device *);
801extern int nouveau_card_init(struct drm_device *); 803extern int nouveau_card_init(struct drm_device *);
802 804
@@ -1434,7 +1436,9 @@ static inline void nv_wr08(struct drm_device *dev, unsigned reg, u8 val)
1434} 1436}
1435 1437
1436#define nv_wait(dev, reg, mask, val) \ 1438#define nv_wait(dev, reg, mask, val) \
1437 nouveau_wait_until(dev, 2000000000ULL, (reg), (mask), (val)) 1439 nouveau_wait_eq(dev, 2000000000ULL, (reg), (mask), (val))
1440#define nv_wait_ne(dev, reg, mask, val) \
1441 nouveau_wait_ne(dev, 2000000000ULL, (reg), (mask), (val))
1438 1442
1439/* PRAMIN access */ 1443/* PRAMIN access */
1440static inline u32 nv_ri32(struct drm_device *dev, unsigned offset) 1444static inline u32 nv_ri32(struct drm_device *dev, unsigned offset)
diff --git a/drivers/gpu/drm/nouveau/nouveau_hw.c b/drivers/gpu/drm/nouveau/nouveau_hw.c
index 6ba640e7a7e..053edf9d2f6 100644
--- a/drivers/gpu/drm/nouveau/nouveau_hw.c
+++ b/drivers/gpu/drm/nouveau/nouveau_hw.c
@@ -999,8 +999,8 @@ nv_load_state_ext(struct drm_device *dev, int head,
999 if (dev_priv->card_type == NV_10) { 999 if (dev_priv->card_type == NV_10) {
1000 /* Not waiting for vertical retrace before modifying 1000 /* Not waiting for vertical retrace before modifying
1001 CRE_53/CRE_54 causes lockups. */ 1001 CRE_53/CRE_54 causes lockups. */
1002 nouveau_wait_until(dev, 650000000, NV_PRMCIO_INP0__COLOR, 0x8, 0x8); 1002 nouveau_wait_eq(dev, 650000000, NV_PRMCIO_INP0__COLOR, 0x8, 0x8);
1003 nouveau_wait_until(dev, 650000000, NV_PRMCIO_INP0__COLOR, 0x8, 0x0); 1003 nouveau_wait_eq(dev, 650000000, NV_PRMCIO_INP0__COLOR, 0x8, 0x0);
1004 } 1004 }
1005 1005
1006 wr_cio_state(dev, head, regp, NV_CIO_CRE_53); 1006 wr_cio_state(dev, head, regp, NV_CIO_CRE_53);
diff --git a/drivers/gpu/drm/nouveau/nouveau_state.c b/drivers/gpu/drm/nouveau/nouveau_state.c
index e779e932045..e0811f93243 100644
--- a/drivers/gpu/drm/nouveau/nouveau_state.c
+++ b/drivers/gpu/drm/nouveau/nouveau_state.c
@@ -1126,8 +1126,9 @@ nouveau_ioctl_setparam(struct drm_device *dev, void *data,
1126} 1126}
1127 1127
1128/* Wait until (value(reg) & mask) == val, up until timeout has hit */ 1128/* Wait until (value(reg) & mask) == val, up until timeout has hit */
1129bool nouveau_wait_until(struct drm_device *dev, uint64_t timeout, 1129bool
1130 uint32_t reg, uint32_t mask, uint32_t val) 1130nouveau_wait_eq(struct drm_device *dev, uint64_t timeout,
1131 uint32_t reg, uint32_t mask, uint32_t val)
1131{ 1132{
1132 struct drm_nouveau_private *dev_priv = dev->dev_private; 1133 struct drm_nouveau_private *dev_priv = dev->dev_private;
1133 struct nouveau_timer_engine *ptimer = &dev_priv->engine.timer; 1134 struct nouveau_timer_engine *ptimer = &dev_priv->engine.timer;
@@ -1141,6 +1142,23 @@ bool nouveau_wait_until(struct drm_device *dev, uint64_t timeout,
1141 return false; 1142 return false;
1142} 1143}
1143 1144
1145/* Wait until (value(reg) & mask) != val, up until timeout has hit */
1146bool
1147nouveau_wait_ne(struct drm_device *dev, uint64_t timeout,
1148 uint32_t reg, uint32_t mask, uint32_t val)
1149{
1150 struct drm_nouveau_private *dev_priv = dev->dev_private;
1151 struct nouveau_timer_engine *ptimer = &dev_priv->engine.timer;
1152 uint64_t start = ptimer->read(dev);
1153
1154 do {
1155 if ((nv_rd32(dev, reg) & mask) != val)
1156 return true;
1157 } while (ptimer->read(dev) - start < timeout);
1158
1159 return false;
1160}
1161
1144/* Waits for PGRAPH to go completely idle */ 1162/* Waits for PGRAPH to go completely idle */
1145bool nouveau_wait_for_idle(struct drm_device *dev) 1163bool nouveau_wait_for_idle(struct drm_device *dev)
1146{ 1164{
diff --git a/drivers/gpu/drm/nouveau/nv04_dac.c b/drivers/gpu/drm/nouveau/nv04_dac.c
index ba6423f2ffc..e000455e06d 100644
--- a/drivers/gpu/drm/nouveau/nv04_dac.c
+++ b/drivers/gpu/drm/nouveau/nv04_dac.c
@@ -74,14 +74,14 @@ static int sample_load_twice(struct drm_device *dev, bool sense[2])
74 * use a 10ms timeout (guards against crtc being inactive, in 74 * use a 10ms timeout (guards against crtc being inactive, in
75 * which case blank state would never change) 75 * which case blank state would never change)
76 */ 76 */
77 if (!nouveau_wait_until(dev, 10000000, NV_PRMCIO_INP0__COLOR, 77 if (!nouveau_wait_eq(dev, 10000000, NV_PRMCIO_INP0__COLOR,
78 0x00000001, 0x00000000)) 78 0x00000001, 0x00000000))
79 return -EBUSY; 79 return -EBUSY;
80 if (!nouveau_wait_until(dev, 10000000, NV_PRMCIO_INP0__COLOR, 80 if (!nouveau_wait_eq(dev, 10000000, NV_PRMCIO_INP0__COLOR,
81 0x00000001, 0x00000001)) 81 0x00000001, 0x00000001))
82 return -EBUSY; 82 return -EBUSY;
83 if (!nouveau_wait_until(dev, 10000000, NV_PRMCIO_INP0__COLOR, 83 if (!nouveau_wait_eq(dev, 10000000, NV_PRMCIO_INP0__COLOR,
84 0x00000001, 0x00000000)) 84 0x00000001, 0x00000000))
85 return -EBUSY; 85 return -EBUSY;
86 86
87 udelay(100); 87 udelay(100);