Skip to content

Commit 5320ace

Browse files
authored
media: iris: add context bank support via iommu-map for lemans and hamoa (#452)
media: iris: add context bank support via iommu-map for lemans and hamoa
2 parents 157fa2e + d8f8430 commit 5320ace

14 files changed

Lines changed: 196 additions & 23 deletions

File tree

arch/arm64/boot/dts/qcom/hamoa.dtsi

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include <dt-bindings/interconnect/qcom,x1e80100-rpmh.h>
1717
#include <dt-bindings/interrupt-controller/arm-gic.h>
1818
#include <dt-bindings/mailbox/qcom-ipcc.h>
19+
#include <dt-bindings/media/qcom,sm8550-iris.h>
1920
#include <dt-bindings/phy/phy.h>
2021
#include <dt-bindings/phy/phy-qcom-qmp.h>
2122
#include <dt-bindings/power/qcom,rpmhpd.h>
@@ -5496,8 +5497,8 @@
54965497
resets = <&gcc GCC_VIDEO_AXI0_CLK_ARES>;
54975498
reset-names = "bus";
54985499

5499-
iommus = <&apps_smmu 0x1940 0>,
5500-
<&apps_smmu 0x1947 0>;
5500+
iommu-map = <IRIS_NON_PIXEL_VCODEC &apps_smmu 0x1940 0x0 0x1>,
5501+
<IRIS_PIXEL &apps_smmu 0x1947 0x0 0x1>;
55015502
dma-coherent;
55025503

55035504
/*

arch/arm64/boot/dts/qcom/lemans-auto.dtsi

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,3 +102,7 @@
102102
};
103103
};
104104
};
105+
106+
&iris {
107+
firmware-name = "qcom/vpu/vpu30_p4_s6.mbn";
108+
};

arch/arm64/boot/dts/qcom/lemans-ride-common.dtsi

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -580,8 +580,6 @@
580580
};
581581

582582
&iris {
583-
firmware-name = "qcom/vpu/vpu30_p4_s6.mbn";
584-
585583
status = "okay";
586584
};
587585

arch/arm64/boot/dts/qcom/lemans.dtsi

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include <dt-bindings/interconnect/qcom,osm-l3.h>
1818
#include <dt-bindings/interconnect/qcom,sa8775p-rpmh.h>
1919
#include <dt-bindings/mailbox/qcom-ipcc.h>
20+
#include <dt-bindings/media/qcom,sm8550-iris.h>
2021
#include <dt-bindings/firmware/qcom,scm.h>
2122
#include <dt-bindings/power/qcom-rpmpd.h>
2223
#include <dt-bindings/soc/qcom,gpr.h>
@@ -4562,11 +4563,13 @@
45624563

45634564
memory-region = <&pil_video_mem>;
45644565

4566+
firmware-name = "qcom/vpu/vpu30_p4_s6_16mb.mbn";
4567+
45654568
resets = <&gcc GCC_VIDEO_AXI0_CLK_ARES>;
45664569
reset-names = "bus";
45674570

4568-
iommus = <&apps_smmu 0x0880 0x0400>,
4569-
<&apps_smmu 0x0887 0x0400>;
4571+
iommu-map = <IRIS_NON_PIXEL_VCODEC &apps_smmu 0x0880 0x0400 0x1>,
4572+
<IRIS_PIXEL &apps_smmu 0x0887 0x0400 0x1>;
45704573
dma-coherent;
45714574

45724575
status = "disabled";

drivers/media/platform/qcom/iris/iris_buffer.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,7 @@ static int iris_create_internal_buffer(struct iris_inst *inst,
336336
enum iris_buffer_type buffer_type, u32 index)
337337
{
338338
struct iris_buffers *buffers = &inst->buffers[buffer_type];
339-
struct iris_core *core = inst->core;
339+
struct device *dev = iris_get_cb_dev(inst, buffer_type);
340340
struct iris_buffer *buffer;
341341

342342
if (!buffers->size)
@@ -352,7 +352,7 @@ static int iris_create_internal_buffer(struct iris_inst *inst,
352352
buffer->buffer_size = buffers->size;
353353
buffer->dma_attrs = DMA_ATTR_WRITE_COMBINE | DMA_ATTR_NO_KERNEL_MAPPING;
354354

355-
buffer->kvaddr = dma_alloc_attrs(core->dev, buffer->buffer_size,
355+
buffer->kvaddr = dma_alloc_attrs(dev, buffer->buffer_size,
356356
&buffer->device_addr, GFP_KERNEL, buffer->dma_attrs);
357357
if (!buffer->kvaddr) {
358358
kfree(buffer);
@@ -489,10 +489,10 @@ int iris_queue_internal_buffers(struct iris_inst *inst, u32 plane)
489489

490490
int iris_destroy_internal_buffer(struct iris_inst *inst, struct iris_buffer *buffer)
491491
{
492-
struct iris_core *core = inst->core;
492+
struct device *dev = iris_get_cb_dev(inst, buffer->type);
493493

494494
list_del(&buffer->list);
495-
dma_free_attrs(core->dev, buffer->buffer_size, buffer->kvaddr,
495+
dma_free_attrs(dev, buffer->buffer_size, buffer->kvaddr,
496496
buffer->device_addr, buffer->dma_attrs);
497497
kfree(buffer);
498498

drivers/media/platform/qcom/iris/iris_core.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ enum domain_type {
3434
* struct iris_core - holds core parameters valid for all instances
3535
*
3636
* @dev: reference to device structure
37+
* @dev_np: reference to non-pixel context bank device structure
38+
* @dev_p: reference to pixel context bank device structure
39+
* @dev_bs: reference to bitstream context bank device structure
3740
* @reg_base: IO memory base address
3841
* @irq: iris irq
3942
* @v4l2_dev: a holder for v4l2 device structure
@@ -77,6 +80,9 @@ enum domain_type {
7780

7881
struct iris_core {
7982
struct device *dev;
83+
struct device *dev_np;
84+
struct device *dev_p;
85+
struct device *dev_bs;
8086
void __iomem *reg_base;
8187
int irq;
8288
struct v4l2_device v4l2_dev;

drivers/media/platform/qcom/iris/iris_hfi_queue.c

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -245,25 +245,26 @@ static void iris_hfi_queue_deinit(struct iris_iface_q_info *iface_q)
245245

246246
int iris_hfi_queues_init(struct iris_core *core)
247247
{
248+
struct device *dev = core->dev_np ? core->dev_np : core->dev;
248249
struct iris_hfi_queue_table_header *q_tbl_hdr;
249250
u32 queue_size;
250251

251252
/* Iris hardware requires 4K queue alignment */
252253
queue_size = ALIGN((sizeof(*q_tbl_hdr) + (IFACEQ_QUEUE_SIZE * IFACEQ_NUMQ)), SZ_4K);
253-
core->iface_q_table_vaddr = dma_alloc_attrs(core->dev, queue_size,
254+
core->iface_q_table_vaddr = dma_alloc_attrs(dev, queue_size,
254255
&core->iface_q_table_daddr,
255256
GFP_KERNEL, DMA_ATTR_WRITE_COMBINE);
256257
if (!core->iface_q_table_vaddr) {
257-
dev_err(core->dev, "queues alloc and map failed\n");
258+
dev_err(dev, "queues alloc and map failed\n");
258259
return -ENOMEM;
259260
}
260261

261-
core->sfr_vaddr = dma_alloc_attrs(core->dev, SFR_SIZE,
262+
core->sfr_vaddr = dma_alloc_attrs(dev, SFR_SIZE,
262263
&core->sfr_daddr,
263264
GFP_KERNEL, DMA_ATTR_WRITE_COMBINE);
264265
if (!core->sfr_vaddr) {
265-
dev_err(core->dev, "sfr alloc and map failed\n");
266-
dma_free_attrs(core->dev, sizeof(*q_tbl_hdr), core->iface_q_table_vaddr,
266+
dev_err(dev, "sfr alloc and map failed\n");
267+
dma_free_attrs(dev, sizeof(*q_tbl_hdr), core->iface_q_table_vaddr,
267268
core->iface_q_table_daddr, DMA_ATTR_WRITE_COMBINE);
268269
return -ENOMEM;
269270
}
@@ -291,6 +292,7 @@ int iris_hfi_queues_init(struct iris_core *core)
291292

292293
void iris_hfi_queues_deinit(struct iris_core *core)
293294
{
295+
struct device *dev = core->dev_np ? core->dev_np : core->dev;
294296
u32 queue_size;
295297

296298
if (!core->iface_q_table_vaddr)
@@ -300,7 +302,7 @@ void iris_hfi_queues_deinit(struct iris_core *core)
300302
iris_hfi_queue_deinit(&core->message_queue);
301303
iris_hfi_queue_deinit(&core->command_queue);
302304

303-
dma_free_attrs(core->dev, SFR_SIZE, core->sfr_vaddr,
305+
dma_free_attrs(dev, SFR_SIZE, core->sfr_vaddr,
304306
core->sfr_daddr, DMA_ATTR_WRITE_COMBINE);
305307

306308
core->sfr_vaddr = NULL;
@@ -309,7 +311,7 @@ void iris_hfi_queues_deinit(struct iris_core *core)
309311
queue_size = ALIGN(sizeof(struct iris_hfi_queue_table_header) +
310312
(IFACEQ_QUEUE_SIZE * IFACEQ_NUMQ), SZ_4K);
311313

312-
dma_free_attrs(core->dev, queue_size, core->iface_q_table_vaddr,
314+
dma_free_attrs(dev, queue_size, core->iface_q_table_vaddr,
313315
core->iface_q_table_daddr, DMA_ATTR_WRITE_COMBINE);
314316

315317
core->iface_q_table_vaddr = NULL;

drivers/media/platform/qcom/iris/iris_platform_common.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,8 @@ struct iris_platform_data {
219219
u32 (*get_vpu_buffer_size)(struct iris_inst *inst, enum iris_buffer_type buffer_type);
220220
const struct vpu_ops *vpu_ops;
221221
void (*set_preset_registers)(struct iris_core *core);
222+
int (*init_cb_devs)(struct iris_core *core);
223+
void (*deinit_cb_devs)(struct iris_core *core);
222224
const struct icc_info *icc_tbl;
223225
unsigned int icc_tbl_size;
224226
const struct bw_info *bw_tbl_dec;

drivers/media/platform/qcom/iris/iris_platform_gen2.c

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -761,6 +761,47 @@ static void iris_set_sm8550_preset_registers(struct iris_core *core)
761761
writel(0x0, core->reg_base + 0xB0088);
762762
}
763763

764+
static int sm8550_init_cb_devs(struct iris_core *core)
765+
{
766+
const u32 f_id_np = 0; /* IRIS_NON_PIXEL_VCODEC */
767+
const u32 f_id_p = 1; /* IRIS_PIXEL */
768+
struct device *dev;
769+
770+
dev = iris_create_cb_dev(core, "iris_non_pixel", &f_id_np);
771+
if (IS_ERR(dev))
772+
return PTR_ERR(dev);
773+
774+
core->dev_np = dev;
775+
core->dev_bs = core->dev_np;
776+
777+
dev = iris_create_cb_dev(core, "iris_pixel", &f_id_p);
778+
if (IS_ERR(dev))
779+
goto err_unreg_dev_np;
780+
781+
core->dev_p = dev;
782+
783+
return 0;
784+
785+
err_unreg_dev_np:
786+
platform_device_unregister(to_platform_device(core->dev_np));
787+
core->dev_np = NULL;
788+
core->dev_bs = NULL;
789+
790+
return PTR_ERR(dev);
791+
}
792+
793+
static void sm8550_deinit_cb_devs(struct iris_core *core)
794+
{
795+
if (core->dev_np)
796+
platform_device_unregister(to_platform_device(core->dev_np));
797+
if (core->dev_p)
798+
platform_device_unregister(to_platform_device(core->dev_p));
799+
800+
core->dev_np = NULL;
801+
core->dev_bs = NULL;
802+
core->dev_p = NULL;
803+
}
804+
764805
static const struct icc_info sm8550_icc_table[] = {
765806
{ "cpu-cfg", 1000, 1000 },
766807
{ "video-mem", 1000, 15000000 },
@@ -928,6 +969,8 @@ const struct iris_platform_data sm8550_data = {
928969
.get_vpu_buffer_size = iris_vpu_buf_size,
929970
.vpu_ops = &iris_vpu3_ops,
930971
.set_preset_registers = iris_set_sm8550_preset_registers,
972+
.init_cb_devs = sm8550_init_cb_devs,
973+
.deinit_cb_devs = sm8550_deinit_cb_devs,
931974
.icc_tbl = sm8550_icc_table,
932975
.icc_tbl_size = ARRAY_SIZE(sm8550_icc_table),
933976
.clk_rst_tbl = sm8550_clk_reset_table,

drivers/media/platform/qcom/iris/iris_probe.c

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,20 @@ static int iris_init_resets(struct iris_core *core)
123123
core->iris_platform_data->controller_rst_tbl_size);
124124
}
125125

126+
static int iris_init_cb_devs(struct iris_core *core)
127+
{
128+
if (core->iris_platform_data->init_cb_devs)
129+
return core->iris_platform_data->init_cb_devs(core);
130+
131+
return 0;
132+
}
133+
134+
static void iris_deinit_cb_devs(struct iris_core *core)
135+
{
136+
if (core->iris_platform_data->deinit_cb_devs)
137+
core->iris_platform_data->deinit_cb_devs(core);
138+
}
139+
126140
static int iris_init_resources(struct iris_core *core)
127141
{
128142
int ret;
@@ -193,6 +207,7 @@ static void iris_remove(struct platform_device *pdev)
193207
return;
194208

195209
iris_core_deinit(core);
210+
iris_deinit_cb_devs(core);
196211

197212
video_unregister_device(core->vdev_dec);
198213
video_unregister_device(core->vdev_enc);
@@ -259,11 +274,15 @@ static int iris_probe(struct platform_device *pdev)
259274
if (ret)
260275
return ret;
261276

277+
ret = iris_init_cb_devs(core);
278+
if (ret)
279+
return ret;
280+
262281
iris_session_init_caps(core);
263282

264283
ret = v4l2_device_register(dev, &core->v4l2_dev);
265284
if (ret)
266-
return ret;
285+
goto err_deinit_cb;
267286

268287
ret = iris_register_video_device(core, DECODER);
269288
if (ret)
@@ -277,9 +296,11 @@ static int iris_probe(struct platform_device *pdev)
277296

278297
dma_mask = core->iris_platform_data->dma_mask;
279298

280-
ret = dma_set_mask_and_coherent(dev, dma_mask);
281-
if (ret)
282-
goto err_vdev_unreg_enc;
299+
if (device_iommu_mapped(core->dev)) {
300+
ret = dma_set_mask_and_coherent(core->dev, dma_mask);
301+
if (ret)
302+
goto err_vdev_unreg_enc;
303+
}
283304

284305
dma_set_max_seg_size(&pdev->dev, DMA_BIT_MASK(32));
285306
dma_set_seg_boundary(&pdev->dev, DMA_BIT_MASK(32));
@@ -298,6 +319,8 @@ static int iris_probe(struct platform_device *pdev)
298319
video_unregister_device(core->vdev_dec);
299320
err_v4l2_unreg:
300321
v4l2_device_unregister(&core->v4l2_dev);
322+
err_deinit_cb:
323+
iris_deinit_cb_devs(core);
301324

302325
return ret;
303326
}

0 commit comments

Comments
 (0)