pvr: Support ipf_creq_pf in pvr_isp_ctrl_stream()

Signed-off-by: Sarah Walker <sarah.walker@imgtec.com>
Acked-by: Karmjit Mahil <Karmjit.Mahil@imgtec.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21550>
This commit is contained in:
Sarah Walker
2022-11-09 11:44:02 +00:00
committed by Marge Bot
parent 86ad868142
commit 71fe789d35
3 changed files with 71 additions and 15 deletions

View File

@@ -499,11 +499,13 @@ SOFTWARE.
-->
<struct name="ISP_RGN_SIPF" length="1">
<condition type="if" check="IPF_CREQ_PF"/>
<!-- FIXME: This should have a default value of 0x1F not setting it since
csbgen doesn't check if the feature is present or not so this will
be set even when the feature is not present.
-->
<field name="cs_size_ipf_creq_pf" start="24" end="28" type="uint"/>
<!-- FIXME: This should have a default value of 0x1F not setting it since
csbgen doesn't check if the feature is present or not so this will
be set even when the feature is not present.
-->
<field name="cs_size_ipf_creq_pf" start="24" end="28" type="uint">
<define name="MAX" value="31"/>
</field>
<condition type="endif" check="IPF_CREQ_PF"/>
<field name="size" start="0" end="23" type="uint">
<!-- Note that this differs from ISP_RGN. -->

View File

@@ -131,11 +131,19 @@ SOFTWARE.
<struct name="CONTROL_STREAM" length="1">
<field name="cs_type" start="30" end="31" type="CS_TYPE"/>
<field name="cs_link" start="3" end="29" type="uint">
<field name="cs_link" start="3" end="29" shift="7" type="address">
<define name="UNIT_SIZE" value="128"/>
</field>
</struct>
<!-- FIXME: This is only available with SIMPLE_INTERNAL_PARAMETER_FORMAT_V2. -->
<struct name="CONTROL_STREAM_LINK_SIPF2" length="1">
<field name="cs_link" start="2" end="31" shift="6" type="address">
<define name="UNIT_SIZE" value="64"/>
</field>
<field name="cs_ctrl_type" start="0" end="1" type="CS_CTRL_TYPE_SIPF2" default="LINK"/>
</struct>
<!-- FIXME: This is only available with SIMPLE_INTERNAL_PARAMETER_FORMAT_V2. -->
<struct name="CONTROL_STREAM_TERMINATE_SIPF2" length="1">
<field name="rsvd" start="2" end="7" type="uint"/>

View File

@@ -3893,16 +3893,20 @@ static VkResult pvr_isp_ctrl_stream(const struct pvr_device_info *dev_info,
struct pvr_transfer_prep_data *prep_data)
{
const uint32_t max_mappings_per_pb = pvr_transfer_max_quads_per_pb(dev_info);
uint32_t free_ctrl_stream_words = PVRX(IPF_CONTROL_STREAM_SIZE_DWORDS);
struct pvr_transfer_3d_state *const state = &prep_data->state;
struct pvr_winsys_transfer_regs *const regs = &state->regs;
struct pvr_transfer_pass *pass = NULL;
uint32_t flags = transfer_cmd->flags;
pvr_dev_addr_t stream_base_vaddr;
uint32_t prim_hdr_count = 0U;
uint32_t num_prim_blks = 0U;
uint32_t prim_blk_size = 0U;
uint32_t region_arrays_size;
uint32_t num_region_arrays;
uint32_t total_stream_size;
struct pvr_bo *pvr_cs_bo;
bool was_linked = false;
uint32_t rem_mappings;
uint32_t *blk_cs_ptr;
uint32_t *cs_ptr;
@@ -3974,6 +3978,10 @@ static VkResult pvr_isp_ctrl_stream(const struct pvr_device_info *dev_info,
if (result != VK_SUCCESS)
return result;
stream_base_vaddr =
PVR_DEV_ADDR(pvr_cs_bo->vma->dev_addr.addr -
ctx->device->heaps.transfer_3d_heap->base_addr.addr);
cs_ptr = pvr_cs_bo->bo->map;
blk_cs_ptr = cs_ptr + region_arrays_size / sizeof(uint32_t);
@@ -4209,24 +4217,59 @@ static VkResult pvr_isp_ctrl_stream(const struct pvr_device_info *dev_info,
return result;
while (rem_mappings > 0U) {
const uint64_t transfer_heap_base =
transfer_cmd->cmd_buffer->device->heaps.transfer_3d_heap
->base_addr.addr;
const uint32_t min_free_ctrl_stream_words =
PVR_HAS_FEATURE(dev_info, simple_internal_parameter_format) ? 2 : 3;
const uint32_t num_mappings = MIN2(max_mappings_per_pb, rem_mappings);
struct pvr_rect_mapping *mappings = NULL;
uint32_t stream_start_offset = 0U;
pvr_dev_addr_t prim_blk_addr;
if (free_ctrl_stream_words < min_free_ctrl_stream_words) {
pvr_dev_addr_t next_region_array_vaddr = stream_base_vaddr;
num_region_arrays++;
next_region_array_vaddr.addr +=
num_region_arrays * (PVRX(IPF_CONTROL_STREAM_SIZE_DWORDS) * 4);
if (PVR_HAS_FEATURE(dev_info,
simple_internal_parameter_format_v2)) {
uint32_t link_addr;
pvr_csb_pack (&link_addr,
IPF_CONTROL_STREAM_LINK_SIPF2,
control_stream) {
control_stream.cs_ctrl_type =
PVRX(IPF_CS_CTRL_TYPE_SIPF2_LINK);
control_stream.cs_link.addr = next_region_array_vaddr.addr;
}
pvr_isp_ctrl_stream_sipf_write_aligned(
(uint8_t *)cs_ptr,
link_addr,
pvr_cmd_length(IPF_CONTROL_STREAM_LINK_SIPF2) * 4);
} else {
pvr_csb_pack (cs_ptr, IPF_CONTROL_STREAM, control_stream) {
control_stream.cs_type = PVRX(IPF_CS_TYPE_LINK);
control_stream.cs_link.addr = next_region_array_vaddr.addr;
}
}
cs_ptr = (uint32_t *)pvr_cs_bo->bo->map +
num_region_arrays * PVRX(IPF_CONTROL_STREAM_SIZE_DWORDS);
free_ctrl_stream_words = PVRX(IPF_CONTROL_STREAM_SIZE_DWORDS);
was_linked = PVR_HAS_FEATURE(dev_info, ipf_creq_pf);
}
if (PVR_HAS_FEATURE(dev_info, ipf_creq_pf))
pvr_finishme("Unimplemented path.");
prim_hdr_count++;
if (flags & PVR_TRANSFER_CMD_FLAGS_FILL)
mappings = pass ? pass->mappings : &fill_mapping;
else
mappings = transfer_cmd->mappings;
prim_blk_addr =
PVR_DEV_ADDR(pvr_cs_bo->vma->dev_addr.addr - transfer_heap_base);
prim_blk_addr = stream_base_vaddr;
prim_blk_addr.addr +=
(uintptr_t)blk_cs_ptr - (uintptr_t)pvr_cs_bo->bo->map;
@@ -4307,6 +4350,8 @@ static VkResult pvr_isp_ctrl_stream(const struct pvr_device_info *dev_info,
pvr_isp_ctrl_stream_sipf_write_aligned(cs_byte_ptr, tmp, 1);
cs_ptr = (uint32_t *)cs_byte_ptr;
free_ctrl_stream_words -= 2;
} else {
pvr_csb_pack (cs_ptr, IPF_PRIMITIVE_FORMAT, word) {
word.cs_type = PVRX(IPF_CS_TYPE_PRIM);
@@ -4322,6 +4367,8 @@ static VkResult pvr_isp_ctrl_stream(const struct pvr_device_info *dev_info,
word.cs_prim_base = prim_blk_addr;
}
cs_ptr += pvr_cmd_length(IPF_PRIMITIVE_BASE);
free_ctrl_stream_words -= 2;
}
rem_mappings -= num_mappings;
@@ -4330,7 +4377,7 @@ static VkResult pvr_isp_ctrl_stream(const struct pvr_device_info *dev_info,
}
if (PVR_HAS_FEATURE(dev_info, ipf_creq_pf))
pvr_finishme("Unimplemented path.");
assert((num_region_arrays > 1) == was_linked);
if (PVR_HAS_FEATURE(dev_info, simple_internal_parameter_format_v2)) {
uint8_t *cs_byte_ptr = (uint8_t *)cs_ptr;
@@ -4366,8 +4413,7 @@ static VkResult pvr_isp_ctrl_stream(const struct pvr_device_info *dev_info,
/* Bit 0 in CR_ISP_RGN.cs_size_ipf_creq_pf is used to indicate the
* presence of a link.
*/
pvr_finishme("Unimplemented isp link. Defaulting to no link.");
isp_rgn.cs_size_ipf_creq_pf = 0;
isp_rgn.cs_size_ipf_creq_pf = was_linked;
}
} else {
/* clang-format off */