mirror of
https://github.com/linux-msm/laptops-kernel.git
synced 2026-08-13 14:19:53 -07:00
media: iris: Add helper to select relevant context bank device
Associate the context bank device with the respective buffers. Fall back to core->dev when the platform still describes the IOMMU on the parent iris node instead of using subnodes. Those platforms would be migrated gradually. Co-developed-by: Vishnu Reddy <busanna.reddy@oss.qualcomm.com> Signed-off-by: Vishnu Reddy <busanna.reddy@oss.qualcomm.com> Signed-off-by: Vikash Garodia <vikash.garodia@oss.qualcomm.com> Tested-by: Daniel J Blueman <daniel@quora.org> Link: https://patch.msgid.link/20260726-glymur-v10-4-de451559e88b@oss.qualcomm.com Signed-off-by: Abel Vesa <abel.vesa@oss.qualcomm.com>
This commit is contained in:
committed by
Abel Vesa
parent
3156278e35
commit
54b5ddf075
@@ -529,7 +529,7 @@ static int iris_create_internal_buffer(struct iris_inst *inst,
|
||||
enum iris_buffer_type buffer_type, u32 index)
|
||||
{
|
||||
struct iris_buffers *buffers = &inst->buffers[buffer_type];
|
||||
struct iris_core *core = inst->core;
|
||||
struct device *dev = iris_get_cb_dev(inst, buffer_type);
|
||||
struct iris_buffer *buffer;
|
||||
|
||||
if (!buffers->size)
|
||||
@@ -545,7 +545,7 @@ static int iris_create_internal_buffer(struct iris_inst *inst,
|
||||
buffer->buffer_size = buffers->size;
|
||||
buffer->dma_attrs = DMA_ATTR_WRITE_COMBINE | DMA_ATTR_NO_KERNEL_MAPPING;
|
||||
|
||||
buffer->kvaddr = dma_alloc_attrs(core->dev, buffer->buffer_size,
|
||||
buffer->kvaddr = dma_alloc_attrs(dev, buffer->buffer_size,
|
||||
&buffer->device_addr, GFP_KERNEL, buffer->dma_attrs);
|
||||
if (!buffer->kvaddr) {
|
||||
kfree(buffer);
|
||||
@@ -682,10 +682,10 @@ int iris_queue_internal_buffers(struct iris_inst *inst, u32 plane)
|
||||
|
||||
int iris_destroy_internal_buffer(struct iris_inst *inst, struct iris_buffer *buffer)
|
||||
{
|
||||
struct iris_core *core = inst->core;
|
||||
struct device *dev = iris_get_cb_dev(inst, buffer->type);
|
||||
|
||||
list_del(&buffer->list);
|
||||
dma_free_attrs(core->dev, buffer->buffer_size, buffer->kvaddr,
|
||||
dma_free_attrs(dev, buffer->buffer_size, buffer->kvaddr,
|
||||
buffer->device_addr, buffer->dma_attrs);
|
||||
kfree(buffer);
|
||||
|
||||
|
||||
@@ -36,6 +36,8 @@ struct qcom_ubwc_cfg_data;
|
||||
* struct iris_core - holds core parameters valid for all instances
|
||||
*
|
||||
* @dev: reference to device structure
|
||||
* @np_dev: reference to non-pixel device structure
|
||||
* @p_dev: reference to pixel device structure
|
||||
* @reg_base: IO memory base address
|
||||
* @irq: iris irq
|
||||
* @v4l2_dev: a holder for v4l2 device structure
|
||||
@@ -81,6 +83,8 @@ struct qcom_ubwc_cfg_data;
|
||||
|
||||
struct iris_core {
|
||||
struct device *dev;
|
||||
struct device *np_dev;
|
||||
struct device *p_dev;
|
||||
void __iomem *reg_base;
|
||||
int irq;
|
||||
struct v4l2_device v4l2_dev;
|
||||
|
||||
@@ -245,25 +245,26 @@ static void iris_hfi_queue_deinit(struct iris_iface_q_info *iface_q)
|
||||
|
||||
int iris_hfi_queues_init(struct iris_core *core)
|
||||
{
|
||||
struct device *dev = core->np_dev ? core->np_dev : core->dev;
|
||||
struct iris_hfi_queue_table_header *q_tbl_hdr;
|
||||
u32 queue_size;
|
||||
|
||||
/* Iris hardware requires 4K queue alignment */
|
||||
queue_size = ALIGN((sizeof(*q_tbl_hdr) + (IFACEQ_QUEUE_SIZE * IFACEQ_NUMQ)), SZ_4K);
|
||||
core->iface_q_table_vaddr = dma_alloc_attrs(core->dev, queue_size,
|
||||
core->iface_q_table_vaddr = dma_alloc_attrs(dev, queue_size,
|
||||
&core->iface_q_table_daddr,
|
||||
GFP_KERNEL, DMA_ATTR_WRITE_COMBINE);
|
||||
if (!core->iface_q_table_vaddr) {
|
||||
dev_err(core->dev, "queues alloc and map failed\n");
|
||||
dev_err(dev, "queues alloc and map failed\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
core->sfr_vaddr = dma_alloc_attrs(core->dev, SFR_SIZE,
|
||||
core->sfr_vaddr = dma_alloc_attrs(dev, SFR_SIZE,
|
||||
&core->sfr_daddr,
|
||||
GFP_KERNEL, DMA_ATTR_WRITE_COMBINE);
|
||||
if (!core->sfr_vaddr) {
|
||||
dev_err(core->dev, "sfr alloc and map failed\n");
|
||||
dma_free_attrs(core->dev, queue_size, core->iface_q_table_vaddr,
|
||||
dev_err(dev, "sfr alloc and map failed\n");
|
||||
dma_free_attrs(dev, queue_size, core->iface_q_table_vaddr,
|
||||
core->iface_q_table_daddr, DMA_ATTR_WRITE_COMBINE);
|
||||
return -ENOMEM;
|
||||
}
|
||||
@@ -291,6 +292,7 @@ int iris_hfi_queues_init(struct iris_core *core)
|
||||
|
||||
void iris_hfi_queues_deinit(struct iris_core *core)
|
||||
{
|
||||
struct device *dev = core->np_dev ? core->np_dev : core->dev;
|
||||
u32 queue_size;
|
||||
|
||||
if (!core->iface_q_table_vaddr)
|
||||
@@ -300,7 +302,7 @@ void iris_hfi_queues_deinit(struct iris_core *core)
|
||||
iris_hfi_queue_deinit(&core->message_queue);
|
||||
iris_hfi_queue_deinit(&core->command_queue);
|
||||
|
||||
dma_free_attrs(core->dev, SFR_SIZE, core->sfr_vaddr,
|
||||
dma_free_attrs(dev, SFR_SIZE, core->sfr_vaddr,
|
||||
core->sfr_daddr, DMA_ATTR_WRITE_COMBINE);
|
||||
|
||||
core->sfr_vaddr = NULL;
|
||||
@@ -309,7 +311,7 @@ void iris_hfi_queues_deinit(struct iris_core *core)
|
||||
queue_size = ALIGN(sizeof(struct iris_hfi_queue_table_header) +
|
||||
(IFACEQ_QUEUE_SIZE * IFACEQ_NUMQ), SZ_4K);
|
||||
|
||||
dma_free_attrs(core->dev, queue_size, core->iface_q_table_vaddr,
|
||||
dma_free_attrs(dev, queue_size, core->iface_q_table_vaddr,
|
||||
core->iface_q_table_daddr, DMA_ATTR_WRITE_COMBINE);
|
||||
|
||||
core->iface_q_table_vaddr = NULL;
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
#include <linux/reset.h>
|
||||
|
||||
#include "iris_core.h"
|
||||
#include "iris_instance.h"
|
||||
#include "iris_resources.h"
|
||||
|
||||
#define BW_THRESHOLD 50000
|
||||
@@ -169,3 +170,43 @@ struct device *iris_create_cb_dev(struct iris_core *core, const char *name)
|
||||
|
||||
return &pdev->dev;
|
||||
}
|
||||
|
||||
struct device *iris_get_cb_dev(struct iris_inst *inst, enum iris_buffer_type buffer_type)
|
||||
{
|
||||
struct iris_core *core = inst->core;
|
||||
struct device *dev = NULL;
|
||||
|
||||
switch (buffer_type) {
|
||||
case BUF_INPUT:
|
||||
if (inst->domain == DECODER)
|
||||
dev = core->np_dev;
|
||||
else
|
||||
dev = core->p_dev;
|
||||
break;
|
||||
case BUF_OUTPUT:
|
||||
if (inst->domain == DECODER)
|
||||
dev = core->p_dev;
|
||||
else
|
||||
dev = core->np_dev;
|
||||
break;
|
||||
case BUF_DPB:
|
||||
case BUF_PARTIAL:
|
||||
case BUF_SCRATCH_1:
|
||||
case BUF_SCRATCH_2:
|
||||
case BUF_VPSS:
|
||||
dev = core->p_dev;
|
||||
break;
|
||||
case BUF_BIN:
|
||||
case BUF_ARP:
|
||||
case BUF_COMV:
|
||||
case BUF_LINE:
|
||||
case BUF_NON_COMV:
|
||||
case BUF_PERSIST:
|
||||
dev = core->np_dev;
|
||||
break;
|
||||
default:
|
||||
dev_err(core->dev, "invalid buffer type: %d\n", buffer_type);
|
||||
}
|
||||
|
||||
return dev ? dev : core->dev;
|
||||
}
|
||||
|
||||
@@ -16,5 +16,6 @@ int iris_set_icc_bw(struct iris_core *core, unsigned long icc_bw);
|
||||
int iris_disable_unprepare_clock(struct iris_core *core, enum platform_clk_type clk_type);
|
||||
int iris_prepare_enable_clock(struct iris_core *core, enum platform_clk_type clk_type);
|
||||
struct device *iris_create_cb_dev(struct iris_core *core, const char *name);
|
||||
struct device *iris_get_cb_dev(struct iris_inst *inst, enum iris_buffer_type buffer_type);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -107,7 +107,7 @@ iris_m2m_queue_init(void *priv, struct vb2_queue *src_vq, struct vb2_queue *dst_
|
||||
src_vq->drv_priv = inst;
|
||||
src_vq->buf_struct_size = sizeof(struct iris_buffer);
|
||||
src_vq->min_reqbufs_allocation = MIN_BUFFERS;
|
||||
src_vq->dev = inst->core->dev;
|
||||
src_vq->dev = iris_get_cb_dev(inst, BUF_INPUT);
|
||||
src_vq->lock = &inst->ctx_q_lock;
|
||||
ret = vb2_queue_init(src_vq);
|
||||
if (ret)
|
||||
@@ -121,7 +121,7 @@ iris_m2m_queue_init(void *priv, struct vb2_queue *src_vq, struct vb2_queue *dst_
|
||||
dst_vq->drv_priv = inst;
|
||||
dst_vq->buf_struct_size = sizeof(struct iris_buffer);
|
||||
dst_vq->min_reqbufs_allocation = MIN_BUFFERS;
|
||||
dst_vq->dev = inst->core->dev;
|
||||
dst_vq->dev = iris_get_cb_dev(inst, BUF_OUTPUT);
|
||||
dst_vq->lock = &inst->ctx_q_lock;
|
||||
|
||||
return vb2_queue_init(dst_vq);
|
||||
|
||||
Reference in New Issue
Block a user