diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2018-03-28 21:07:23 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2018-03-28 21:07:23 -0400 |
commit | 0b412605ef5f5c64b31f19e2910b1d5eba9929c3 (patch) | |
tree | 2053ec8f2e998d298e234c1edd8a1560a8ff80e1 | |
parent | 68b8dffce68e8cae208a891c4833c7a7990bf2c4 (diff) | |
parent | ef55d1538dfb823a4475bd690f78b5edc0d2a6fd (diff) |
Merge tag 'drm-fixes-for-v4.16-rc8' of git://people.freedesktop.org/~airlied/linux
Pull drm fixes from Dave Airlie:
"Nothing serious, two amdkfd and two tegra fixes"
* tag 'drm-fixes-for-v4.16-rc8' of git://people.freedesktop.org/~airlied/linux:
drm/tegra: dc: Using NULL instead of plain integer
drm/amdkfd: Deallocate SDMA queues correctly
drm/amdkfd: Fix scratch memory with HWS enabled
drm/tegra: dc: Use correct format array for Tegra124
-rw-r--r-- | drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c | 20 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdkfd/kfd_packet_manager.c | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/tegra/dc.c | 6 |
3 files changed, 18 insertions, 11 deletions
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c index b21285afa4ea..1bd5f26b3f00 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c | |||
@@ -821,13 +821,13 @@ static int create_queue_cpsch(struct device_queue_manager *dqm, struct queue *q, | |||
821 | pr_warn("Can't create new usermode queue because %d queues were already created\n", | 821 | pr_warn("Can't create new usermode queue because %d queues were already created\n", |
822 | dqm->total_queue_count); | 822 | dqm->total_queue_count); |
823 | retval = -EPERM; | 823 | retval = -EPERM; |
824 | goto out; | 824 | goto out_unlock; |
825 | } | 825 | } |
826 | 826 | ||
827 | if (q->properties.type == KFD_QUEUE_TYPE_SDMA) { | 827 | if (q->properties.type == KFD_QUEUE_TYPE_SDMA) { |
828 | retval = allocate_sdma_queue(dqm, &q->sdma_id); | 828 | retval = allocate_sdma_queue(dqm, &q->sdma_id); |
829 | if (retval) | 829 | if (retval) |
830 | goto out; | 830 | goto out_unlock; |
831 | q->properties.sdma_queue_id = | 831 | q->properties.sdma_queue_id = |
832 | q->sdma_id / CIK_SDMA_QUEUES_PER_ENGINE; | 832 | q->sdma_id / CIK_SDMA_QUEUES_PER_ENGINE; |
833 | q->properties.sdma_engine_id = | 833 | q->properties.sdma_engine_id = |
@@ -838,7 +838,7 @@ static int create_queue_cpsch(struct device_queue_manager *dqm, struct queue *q, | |||
838 | 838 | ||
839 | if (!mqd) { | 839 | if (!mqd) { |
840 | retval = -ENOMEM; | 840 | retval = -ENOMEM; |
841 | goto out; | 841 | goto out_deallocate_sdma_queue; |
842 | } | 842 | } |
843 | 843 | ||
844 | dqm->asic_ops.init_sdma_vm(dqm, q, qpd); | 844 | dqm->asic_ops.init_sdma_vm(dqm, q, qpd); |
@@ -848,7 +848,7 @@ static int create_queue_cpsch(struct device_queue_manager *dqm, struct queue *q, | |||
848 | retval = mqd->init_mqd(mqd, &q->mqd, &q->mqd_mem_obj, | 848 | retval = mqd->init_mqd(mqd, &q->mqd, &q->mqd_mem_obj, |
849 | &q->gart_mqd_addr, &q->properties); | 849 | &q->gart_mqd_addr, &q->properties); |
850 | if (retval) | 850 | if (retval) |
851 | goto out; | 851 | goto out_deallocate_sdma_queue; |
852 | 852 | ||
853 | list_add(&q->list, &qpd->queues_list); | 853 | list_add(&q->list, &qpd->queues_list); |
854 | qpd->queue_count++; | 854 | qpd->queue_count++; |
@@ -869,7 +869,13 @@ static int create_queue_cpsch(struct device_queue_manager *dqm, struct queue *q, | |||
869 | pr_debug("Total of %d queues are accountable so far\n", | 869 | pr_debug("Total of %d queues are accountable so far\n", |
870 | dqm->total_queue_count); | 870 | dqm->total_queue_count); |
871 | 871 | ||
872 | out: | 872 | mutex_unlock(&dqm->lock); |
873 | return retval; | ||
874 | |||
875 | out_deallocate_sdma_queue: | ||
876 | if (q->properties.type == KFD_QUEUE_TYPE_SDMA) | ||
877 | deallocate_sdma_queue(dqm, q->sdma_id); | ||
878 | out_unlock: | ||
873 | mutex_unlock(&dqm->lock); | 879 | mutex_unlock(&dqm->lock); |
874 | return retval; | 880 | return retval; |
875 | } | 881 | } |
@@ -1188,8 +1194,10 @@ static int process_termination_cpsch(struct device_queue_manager *dqm, | |||
1188 | 1194 | ||
1189 | /* Clear all user mode queues */ | 1195 | /* Clear all user mode queues */ |
1190 | list_for_each_entry(q, &qpd->queues_list, list) { | 1196 | list_for_each_entry(q, &qpd->queues_list, list) { |
1191 | if (q->properties.type == KFD_QUEUE_TYPE_SDMA) | 1197 | if (q->properties.type == KFD_QUEUE_TYPE_SDMA) { |
1192 | dqm->sdma_queue_count--; | 1198 | dqm->sdma_queue_count--; |
1199 | deallocate_sdma_queue(dqm, q->sdma_id); | ||
1200 | } | ||
1193 | 1201 | ||
1194 | if (q->properties.is_active) | 1202 | if (q->properties.is_active) |
1195 | dqm->queue_count--; | 1203 | dqm->queue_count--; |
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager.c index 0ecbd1f9b606..0c3bc00978f7 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager.c | |||
@@ -188,8 +188,7 @@ static int pm_create_map_process(struct packet_manager *pm, uint32_t *buffer, | |||
188 | packet->sh_mem_ape1_base = qpd->sh_mem_ape1_base; | 188 | packet->sh_mem_ape1_base = qpd->sh_mem_ape1_base; |
189 | packet->sh_mem_ape1_limit = qpd->sh_mem_ape1_limit; | 189 | packet->sh_mem_ape1_limit = qpd->sh_mem_ape1_limit; |
190 | 190 | ||
191 | /* TODO: scratch support */ | 191 | packet->sh_hidden_private_base_vmid = qpd->sh_hidden_private_base; |
192 | packet->sh_hidden_private_base_vmid = 0; | ||
193 | 192 | ||
194 | packet->gds_addr_lo = lower_32_bits(qpd->gds_context_area); | 193 | packet->gds_addr_lo = lower_32_bits(qpd->gds_context_area); |
195 | packet->gds_addr_hi = upper_32_bits(qpd->gds_context_area); | 194 | packet->gds_addr_hi = upper_32_bits(qpd->gds_context_area); |
diff --git a/drivers/gpu/drm/tegra/dc.c b/drivers/gpu/drm/tegra/dc.c index fbffe1948b3b..90b25ce363ca 100644 --- a/drivers/gpu/drm/tegra/dc.c +++ b/drivers/gpu/drm/tegra/dc.c | |||
@@ -2009,9 +2009,9 @@ static const struct tegra_dc_soc_info tegra124_dc_soc_info = { | |||
2009 | .coupled_pm = false, | 2009 | .coupled_pm = false, |
2010 | .has_nvdisplay = false, | 2010 | .has_nvdisplay = false, |
2011 | .num_primary_formats = ARRAY_SIZE(tegra124_primary_formats), | 2011 | .num_primary_formats = ARRAY_SIZE(tegra124_primary_formats), |
2012 | .primary_formats = tegra114_primary_formats, | 2012 | .primary_formats = tegra124_primary_formats, |
2013 | .num_overlay_formats = ARRAY_SIZE(tegra124_overlay_formats), | 2013 | .num_overlay_formats = ARRAY_SIZE(tegra124_overlay_formats), |
2014 | .overlay_formats = tegra114_overlay_formats, | 2014 | .overlay_formats = tegra124_overlay_formats, |
2015 | }; | 2015 | }; |
2016 | 2016 | ||
2017 | static const struct tegra_dc_soc_info tegra210_dc_soc_info = { | 2017 | static const struct tegra_dc_soc_info tegra210_dc_soc_info = { |
@@ -2160,7 +2160,7 @@ static int tegra_dc_couple(struct tegra_dc *dc) | |||
2160 | struct device_link *link; | 2160 | struct device_link *link; |
2161 | struct device *partner; | 2161 | struct device *partner; |
2162 | 2162 | ||
2163 | partner = driver_find_device(dc->dev->driver, NULL, 0, | 2163 | partner = driver_find_device(dc->dev->driver, NULL, NULL, |
2164 | tegra_dc_match_by_pipe); | 2164 | tegra_dc_match_by_pipe); |
2165 | if (!partner) | 2165 | if (!partner) |
2166 | return -EPROBE_DEFER; | 2166 | return -EPROBE_DEFER; |