diff options
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 |