diff options
author | Terje Bergstrom <tbergstrom@nvidia.com> | 2016-10-12 18:24:11 -0400 |
---|---|---|
committer | Deepak Nibade <dnibade@nvidia.com> | 2016-12-27 04:56:50 -0500 |
commit | b6408e26c1a6c4c91233c144bae84db9728c4338 (patch) | |
tree | 8ff80253f32ecc7f3da7476c77dead79304a1089 /drivers/gpu | |
parent | 7f7bf15564ad6a1198807e10bab156337f9dde9b (diff) |
gpu: nvgpu: At FB reset wait for scrubber
We need to wait for scrubber to have finished before we can allow
any accesses to memory. Do the wait in place where on iGPU we would
do FB reset.
Bug 1799537
Bug 1815139
Change-Id: Ic92dee936388a13c4abf0b295fd99581522c430f
Signed-off-by: Terje Bergstrom <tbergstrom@nvidia.com>
Reviewed-on: http://git-master/r/1235541
(cherry picked from commit 1ef73ecb4e37da042e7117426ab2823b7f4528dc)
Reviewed-on: http://git-master/r/1239955
GVS: Gerrit_Virtual_Submit
Diffstat (limited to 'drivers/gpu')
-rw-r--r-- | drivers/gpu/nvgpu/gp106/fb_gp106.c | 21 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gp106/hw_fb_gp106.h | 28 |
2 files changed, 48 insertions, 1 deletions
diff --git a/drivers/gpu/nvgpu/gp106/fb_gp106.c b/drivers/gpu/nvgpu/gp106/fb_gp106.c index 1c5b3e0a..ef9f1094 100644 --- a/drivers/gpu/nvgpu/gp106/fb_gp106.c +++ b/drivers/gpu/nvgpu/gp106/fb_gp106.c | |||
@@ -12,14 +12,33 @@ | |||
12 | */ | 12 | */ |
13 | 13 | ||
14 | #include <linux/types.h> | 14 | #include <linux/types.h> |
15 | #include <linux/delay.h> | ||
15 | 16 | ||
16 | #include "gk20a/gk20a.h" | 17 | #include "gk20a/gk20a.h" |
17 | #include "gp10b/fb_gp10b.h" | 18 | #include "gp10b/fb_gp10b.h" |
19 | #include "hw_fb_gp106.h" | ||
20 | |||
21 | #define HW_SCRUB_TIMEOUT_DEFAULT 100 /* usec */ | ||
22 | #define HW_SCRUB_TIMEOUT_MAX 2000000 /* usec */ | ||
23 | |||
24 | static void gp106_fb_reset(struct gk20a *g) | ||
25 | { | ||
26 | int retries = HW_SCRUB_TIMEOUT_MAX / HW_SCRUB_TIMEOUT_DEFAULT; | ||
27 | /* wait for memory to be accessible */ | ||
28 | do { | ||
29 | u32 w = gk20a_readl(g, fb_niso_scrub_status_r()); | ||
30 | if (fb_niso_scrub_status_flag_v(w)) { | ||
31 | gk20a_dbg_fn("done"); | ||
32 | break; | ||
33 | } | ||
34 | udelay(HW_SCRUB_TIMEOUT_DEFAULT); | ||
35 | } while (--retries); | ||
36 | } | ||
18 | 37 | ||
19 | void gp106_init_fb(struct gpu_ops *gops) | 38 | void gp106_init_fb(struct gpu_ops *gops) |
20 | { | 39 | { |
21 | gp10b_init_fb(gops); | 40 | gp10b_init_fb(gops); |
22 | 41 | ||
23 | gops->fb.init_fs_state = NULL; | 42 | gops->fb.init_fs_state = NULL; |
24 | gops->fb.reset = NULL; | 43 | gops->fb.reset = gp106_fb_reset; |
25 | } | 44 | } |
diff --git a/drivers/gpu/nvgpu/gp106/hw_fb_gp106.h b/drivers/gpu/nvgpu/gp106/hw_fb_gp106.h index d76f78b9..19d88464 100644 --- a/drivers/gpu/nvgpu/gp106/hw_fb_gp106.h +++ b/drivers/gpu/nvgpu/gp106/hw_fb_gp106.h | |||
@@ -574,4 +574,32 @@ static inline u32 fb_fbpa_fbio_cmd_delay_cmd_priv_max_v(void) | |||
574 | { | 574 | { |
575 | return 1; | 575 | return 1; |
576 | } | 576 | } |
577 | static inline u32 fb_niso_scrubber_status_r(void) | ||
578 | { | ||
579 | return 0x00100b20; | ||
580 | } | ||
581 | static inline u32 fb_niso_scrubber_status_flag_s(void) | ||
582 | { | ||
583 | return 1; | ||
584 | } | ||
585 | static inline u32 fb_niso_scrubber_status_flag_f(u32 v) | ||
586 | { | ||
587 | return (v & 0x1) << 0; | ||
588 | } | ||
589 | static inline u32 fb_niso_scrubber_status_flag_m(void) | ||
590 | { | ||
591 | return 0x1 << 0; | ||
592 | } | ||
593 | static inline u32 fb_niso_scrubber_status_flag_v(u32 r) | ||
594 | { | ||
595 | return (r >> 0) & 0x1; | ||
596 | } | ||
597 | static inline u32 fb_niso_scrub_status_r(void) | ||
598 | { | ||
599 | return 0x00100b20; | ||
600 | } | ||
601 | static inline u32 fb_niso_scrub_status_flag_v(u32 r) | ||
602 | { | ||
603 | return (r >> 0) & 0x1; | ||
604 | } | ||
577 | #endif | 605 | #endif |