diff options
author | Deepak Goyal <dgoyal@nvidia.com> | 2018-09-14 02:15:19 -0400 |
---|---|---|
committer | mobile promotions <svcmobile_promotions@nvidia.com> | 2018-09-27 01:24:52 -0400 |
commit | 34732a14b22f09d8f9d52f756612178f0313f120 (patch) | |
tree | 94f634efcad3179ddbca82dedaf82dfe8f099030 /drivers/gpu/nvgpu/os/linux/sysfs.c | |
parent | 991179f29cea8ab8272465789496c2f15bad6240 (diff) |
nvgpu: gpu: Support multiple tpc-pg masks.
- TPC powergating should be done before
calling gk20a_enable_gr_hw.
gk20a_enable_gr_hw() issues a GR engine reset.
Without this fix, enabling 1 TPC from each PES
causes ctxsw timeout error while running GFX Benchmark.
- Adds valid tpc-pg mask for 1/2/3/4 active TPC configs.
TPC Config - TPC-MASK
4 TPC configuration - 0x0
3 TPC configuration - 0x1/0x2/0x4/0x8
2 TPC configuration - 0x5/0x9/0x6/0xa
- We should not write to gr_fe_tpc_pesmask_r()
as part of TPC-PG sequence. This register is for
debug purpose only.
Bug 200442360
Change-Id: I6fbe1ad8fbc836ace8cbaf00ec3d21a12c73e0bd
Signed-off-by: Deepak Goyal <dgoyal@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/1809772
Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com>
Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/os/linux/sysfs.c')
-rw-r--r-- | drivers/gpu/nvgpu/os/linux/sysfs.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/drivers/gpu/nvgpu/os/linux/sysfs.c b/drivers/gpu/nvgpu/os/linux/sysfs.c index 9e48e45d..1ffb6539 100644 --- a/drivers/gpu/nvgpu/os/linux/sysfs.c +++ b/drivers/gpu/nvgpu/os/linux/sysfs.c | |||
@@ -865,6 +865,18 @@ static ssize_t tpc_pg_mask_read(struct device *dev, | |||
865 | return snprintf(buf, PAGE_SIZE, "%d\n", g->tpc_pg_mask); | 865 | return snprintf(buf, PAGE_SIZE, "%d\n", g->tpc_pg_mask); |
866 | } | 866 | } |
867 | 867 | ||
868 | static bool is_tpc_mask_valid(struct gk20a *g, u32 tpc_mask) | ||
869 | { | ||
870 | u32 i; | ||
871 | bool valid = false; | ||
872 | |||
873 | for (i = 0; i < MAX_TPC_PG_CONFIGS; i++) { | ||
874 | if (tpc_mask == g->valid_tpc_mask[i]) | ||
875 | valid = true; | ||
876 | } | ||
877 | return valid; | ||
878 | } | ||
879 | |||
868 | static ssize_t tpc_pg_mask_store(struct device *dev, | 880 | static ssize_t tpc_pg_mask_store(struct device *dev, |
869 | struct device_attribute *attr, const char *buf, size_t count) | 881 | struct device_attribute *attr, const char *buf, size_t count) |
870 | { | 882 | { |
@@ -896,10 +908,9 @@ static ssize_t tpc_pg_mask_store(struct device *dev, | |||
896 | return -ENODEV; | 908 | return -ENODEV; |
897 | } | 909 | } |
898 | 910 | ||
899 | if (val == TPC_MASK_FOR_ALL_ACTIVE_TPCs || val == g->valid_tpc_mask) { | 911 | if (is_tpc_mask_valid(g, (u32)val)) { |
900 | g->tpc_pg_mask = val; | 912 | g->tpc_pg_mask = val; |
901 | } else { | 913 | } else { |
902 | |||
903 | nvgpu_err(g, "TPC-PG mask is invalid"); | 914 | nvgpu_err(g, "TPC-PG mask is invalid"); |
904 | nvgpu_mutex_release(&g->tpc_pg_lock); | 915 | nvgpu_mutex_release(&g->tpc_pg_lock); |
905 | return -EINVAL; | 916 | return -EINVAL; |