diff options
author | Ben Skeggs <bskeggs@redhat.com> | 2010-11-18 23:32:56 -0500 |
---|---|---|
committer | Francisco Jerez <currojerez@riseup.net> | 2010-12-07 21:00:36 -0500 |
commit | 12fb9525075982bc65cfd71427dd7afdf47bafed (patch) | |
tree | 0e8b75e10ec7c5b607f14d24b857041850bc40d9 /drivers | |
parent | ceac30999dfb00ee7b56cfea8b28ef50999a3c95 (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.h | 10 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_hw.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_state.c | 22 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nv04_dac.c | 12 |
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 *); |
796 | extern int nouveau_ioctl_setparam(struct drm_device *, void *data, | 796 | extern int nouveau_ioctl_setparam(struct drm_device *, void *data, |
797 | struct drm_file *); | 797 | struct drm_file *); |
798 | extern bool nouveau_wait_until(struct drm_device *, uint64_t timeout, | 798 | extern 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); |
800 | extern bool nouveau_wait_ne(struct drm_device *, uint64_t timeout, | ||
801 | uint32_t reg, uint32_t mask, uint32_t val); | ||
800 | extern bool nouveau_wait_for_idle(struct drm_device *); | 802 | extern bool nouveau_wait_for_idle(struct drm_device *); |
801 | extern int nouveau_card_init(struct drm_device *); | 803 | extern 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 */ |
1440 | static inline u32 nv_ri32(struct drm_device *dev, unsigned offset) | 1444 | static 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 */ |
1129 | bool nouveau_wait_until(struct drm_device *dev, uint64_t timeout, | 1129 | bool |
1130 | uint32_t reg, uint32_t mask, uint32_t val) | 1130 | nouveau_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 */ | ||
1146 | bool | ||
1147 | nouveau_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 */ |
1145 | bool nouveau_wait_for_idle(struct drm_device *dev) | 1163 | bool 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); |