On 2019-11-07 13:32, Alex Deucher wrote: > On Thu, Nov 7, 2019 at 12:47 PM Kuehling, Felix <felix.kuehl...@amd.com> > wrote: >> No, please lets not add a new nomenclature for PM4 packet versions. GFX >> versions are agreed on between hardware, firmware, and software and it's >> generally understood what they mean. If we add a new PM4 packet versioning >> scheme on our own, then this will add a lot of confusion when talking to >> firmware teams. >> >> You know, this would all be more straight forward if we accepted a little >> bit of code duplication and had packet writing functions per GFX version. >> You'll see this pattern a lot in the amdgpu driver where each IP version >> duplicates a bunch of code. In many cases you may be able to save a few >> lines of code by sharing functions between IP versions. But you'll add some >> confusion and burden on future maintenance. >> >> This is the price we pay for micro-optimizing minor code duplication. > What we've tried to do in amdgpu is to break out shared code in to > common helpers that are not IP specific and use that in each IP module > (e.g., amdgpu_uvd.c amdgpu_gfx.c, etc.). Sometimes we can use a > particular chunk of code across multiple generations. E.g., the uvd > stuff is a good example. We have shared generic uvd helpers that work > for most UVD IP versions, and then if we need an IP specific version, > we override that in the callbacks with a version specific one. E.g., > for the video decode engines we use the generic helpers for a number > of ring functions: > > static const struct amdgpu_ring_funcs uvd_v7_0_ring_vm_funcs = { > ... > .test_ring = uvd_v7_0_ring_test_ring, > .test_ib = amdgpu_uvd_ring_test_ib, > .insert_nop = uvd_v7_0_ring_insert_nop, > .pad_ib = amdgpu_ring_generic_pad_ib, > .begin_use = amdgpu_uvd_ring_begin_use, > .end_use = amdgpu_uvd_ring_end_use, > ... > }; > > while we override more of them for the video encode engines: > > static const struct amdgpu_ring_funcs uvd_v7_0_enc_ring_vm_funcs = { > ... > .test_ring = uvd_v7_0_enc_ring_test_ring, > .test_ib = uvd_v7_0_enc_ring_test_ib, > .insert_nop = amdgpu_ring_insert_nop, > .insert_end = uvd_v7_0_enc_ring_insert_end, > .pad_ib = amdgpu_ring_generic_pad_ib, > .begin_use = amdgpu_uvd_ring_begin_use, > .end_use = amdgpu_uvd_ring_end_use, > ... > }; > > But still maintain IP specific components.
Thanks Alex. In this case the common code is in kfd_packet_manager.c and the IP-version-specific code that writes the actual PM4 packets is in the kernel_queue_v*.c files. Yong is trying to merge the PM4 packet writing code for v9 and v10 because the packet formats are essentially unchanged. It makes the naming conventions in the code a bit meaningless because v9 now really means "v9 and v10". Apparently there is precedent for this, as we already did the same thing with v7 and v8, which I forgot about in my initial code review. Regards, Felix > > Alex > >> Regards, >> Felix >> >> On 2019-11-07 12:39, Zhao, Yong wrote: >> >> Hi Kent, >> >> I can't agree more on this. Also, the same applies to the file names. >> Definitely we need to agree on the naming scheme before making it happen. >> >> Yong >> >> On 2019-11-07 12:33 p.m., Russell, Kent wrote: >> >> I think that the versioning is getting a little confusing since we’re using >> the old GFX versions, but not really sticking to it due to the shareability >> of certain managers and shaders. Could we look into doing something like >> gen1 or gen2, or some other more ambiguous non-GFX-related versioning? >> Otherwise we’ll keep having these questions of “why is Hawaii GFX8”, “why is >> Arcturus GFX9”, etc. Then if things change, we just up the value concretely, >> instead of maybe doing a v11 if GFX11 changes things, and only GFX11 ASICs >> use those functions/variables. >> >> >> >> Obviously not high-priority, but maybe something to consider as you continue >> to consolidate and remove duplicate code. >> >> >> >> Kent >> >> >> >> From: amd-gfx <amd-gfx-boun...@lists.freedesktop.org> On Behalf Of Zhao, Yong >> Sent: Thursday, November 7, 2019 11:57 AM >> To: Kuehling, Felix <felix.kuehl...@amd.com>; amd-gfx@lists.freedesktop.org >> Subject: Re: [PATCH 2/3] drm/amdkfd: only keep release_mem function for >> Hawaii >> >> >> >> Hi Felix, >> >> >> >> That's because v8 and v7 share the same packet_manager_funcs. In this case, >> it is better to keep it as it is. >> >> >> >> Regards, >> >> Yong >> >> ________________________________ >> >> From: Kuehling, Felix <felix.kuehl...@amd.com> >> Sent: Wednesday, November 6, 2019 11:45 PM >> To: Zhao, Yong <yong.z...@amd.com>; amd-gfx@lists.freedesktop.org >> <amd-gfx@lists.freedesktop.org> >> Subject: Re: [PATCH 2/3] drm/amdkfd: only keep release_mem function for >> Hawaii >> >> >> >> On 2019-10-30 20:17, Zhao, Yong wrote: >>> release_mem won't be used at all on GFX9 and GFX10, so delete it. >> Hawaii was GFXv7. So we're not using the release_mem packet on GFXv8 >> either. Why arbitrarily limit this change to GFXv9 and 10? >> >> Regards, >> Felix >> >>> Change-Id: I13787a8a29b83e7516c582a7401f2e14721edf5f >>> Signed-off-by: Yong Zhao <yong.z...@amd.com> >>> --- >>> .../gpu/drm/amd/amdkfd/kfd_kernel_queue_v10.c | 35 ++----------------- >>> .../gpu/drm/amd/amdkfd/kfd_kernel_queue_v9.c | 33 ++--------------- >>> 2 files changed, 4 insertions(+), 64 deletions(-) >>> >>> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue_v10.c >>> b/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue_v10.c >>> index aed32ab7102e..bfd6221acae9 100644 >>> --- a/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue_v10.c >>> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue_v10.c >>> @@ -298,37 +298,6 @@ static int pm_query_status_v10(struct packet_manager >>> *pm, uint32_t *buffer, >>> return 0; >>> } >>> >>> - >>> -static int pm_release_mem_v10(uint64_t gpu_addr, uint32_t *buffer) >>> -{ >>> - struct pm4_mec_release_mem *packet; >>> - >>> - WARN_ON(!buffer); >>> - >>> - packet = (struct pm4_mec_release_mem *)buffer; >>> - memset(buffer, 0, sizeof(struct pm4_mec_release_mem)); >>> - >>> - packet->header.u32All = pm_build_pm4_header(IT_RELEASE_MEM, >>> - sizeof(struct pm4_mec_release_mem)); >>> - >>> - packet->bitfields2.event_type = CACHE_FLUSH_AND_INV_TS_EVENT; >>> - packet->bitfields2.event_index = >>> event_index__mec_release_mem__end_of_pipe; >>> - packet->bitfields2.tcl1_action_ena = 1; >>> - packet->bitfields2.tc_action_ena = 1; >>> - packet->bitfields2.cache_policy = cache_policy__mec_release_mem__lru; >>> - >>> - packet->bitfields3.data_sel = >>> data_sel__mec_release_mem__send_32_bit_low; >>> - packet->bitfields3.int_sel = >>> - int_sel__mec_release_mem__send_interrupt_after_write_confirm; >>> - >>> - packet->bitfields4.address_lo_32b = (gpu_addr & 0xffffffff) >> 2; >>> - packet->address_hi = upper_32_bits(gpu_addr); >>> - >>> - packet->data_lo = 0; >>> - >>> - return sizeof(struct pm4_mec_release_mem) / sizeof(unsigned int); >>> -} >>> - >>> const struct packet_manager_funcs kfd_v10_pm_funcs = { >>> .map_process = pm_map_process_v10, >>> .runlist = pm_runlist_v10, >>> @@ -336,13 +305,13 @@ const struct packet_manager_funcs kfd_v10_pm_funcs = { >>> .map_queues = pm_map_queues_v10, >>> .unmap_queues = pm_unmap_queues_v10, >>> .query_status = pm_query_status_v10, >>> - .release_mem = pm_release_mem_v10, >>> + .release_mem = NULL, >>> .map_process_size = sizeof(struct >>> pm4_mes_map_process), >>> .runlist_size = sizeof(struct pm4_mes_runlist), >>> .set_resources_size = sizeof(struct >>> pm4_mes_set_resources), >>> .map_queues_size = sizeof(struct pm4_mes_map_queues), >>> .unmap_queues_size = sizeof(struct >>> pm4_mes_unmap_queues), >>> .query_status_size = sizeof(struct >>> pm4_mes_query_status), >>> - .release_mem_size = sizeof(struct pm4_mec_release_mem) >>> + .release_mem_size = 0, >>> }; >>> >>> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue_v9.c >>> b/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue_v9.c >>> index 3b5ca2b1d7a6..f0e4910a8865 100644 >>> --- a/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue_v9.c >>> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue_v9.c >>> @@ -336,35 +336,6 @@ static int pm_query_status_v9(struct packet_manager >>> *pm, uint32_t *buffer, >>> return 0; >>> } >>> >>> - >>> -static int pm_release_mem_v9(uint64_t gpu_addr, uint32_t *buffer) >>> -{ >>> - struct pm4_mec_release_mem *packet; >>> - >>> - packet = (struct pm4_mec_release_mem *)buffer; >>> - memset(buffer, 0, sizeof(struct pm4_mec_release_mem)); >>> - >>> - packet->header.u32All = pm_build_pm4_header(IT_RELEASE_MEM, >>> - sizeof(struct pm4_mec_release_mem)); >>> - >>> - packet->bitfields2.event_type = CACHE_FLUSH_AND_INV_TS_EVENT; >>> - packet->bitfields2.event_index = >>> event_index__mec_release_mem__end_of_pipe; >>> - packet->bitfields2.tcl1_action_ena = 1; >>> - packet->bitfields2.tc_action_ena = 1; >>> - packet->bitfields2.cache_policy = cache_policy__mec_release_mem__lru; >>> - >>> - packet->bitfields3.data_sel = >>> data_sel__mec_release_mem__send_32_bit_low; >>> - packet->bitfields3.int_sel = >>> - int_sel__mec_release_mem__send_interrupt_after_write_confirm; >>> - >>> - packet->bitfields4.address_lo_32b = (gpu_addr & 0xffffffff) >> 2; >>> - packet->address_hi = upper_32_bits(gpu_addr); >>> - >>> - packet->data_lo = 0; >>> - >>> - return 0; >>> -} >>> - >>> const struct packet_manager_funcs kfd_v9_pm_funcs = { >>> .map_process = pm_map_process_v9, >>> .runlist = pm_runlist_v9, >>> @@ -372,12 +343,12 @@ const struct packet_manager_funcs kfd_v9_pm_funcs = { >>> .map_queues = pm_map_queues_v9, >>> .unmap_queues = pm_unmap_queues_v9, >>> .query_status = pm_query_status_v9, >>> - .release_mem = pm_release_mem_v9, >>> + .release_mem = NULL, >>> .map_process_size = sizeof(struct pm4_mes_map_process), >>> .runlist_size = sizeof(struct pm4_mes_runlist), >>> .set_resources_size = sizeof(struct pm4_mes_set_resources), >>> .map_queues_size = sizeof(struct pm4_mes_map_queues), >>> .unmap_queues_size = sizeof(struct pm4_mes_unmap_queues), >>> .query_status_size = sizeof(struct pm4_mes_query_status), >>> - .release_mem_size = sizeof(struct pm4_mec_release_mem) >>> + .release_mem_size = 0, >>> }; >> _______________________________________________ >> amd-gfx mailing list >> amd-gfx@lists.freedesktop.org >> https://lists.freedesktop.org/mailman/listinfo/amd-gfx _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx