* [PATCH v14, 0/2] ADD DM9051 ETHERNET DRIVER
From: Joseph CHAMG @ 2022-01-27 3:26 UTC (permalink / raw)
To: David S . Miller, Jakub Kicinski, Rob Herring, Joseph CHANG,
joseph_chang
Cc: netdev, devicetree, linux-kernel, andy.shevchenko, andrew, leon
DM9051 is a spi interface chip,
need cs/mosi/miso/clock with an interrupt gpio pin
Joseph CHAMG (1):
net: Add dm9051 driver
JosephCHANG (1):
yaml: Add dm9051 SPI network yaml file
.../bindings/net/davicom,dm9051.yaml | 62 +
drivers/net/ethernet/davicom/Kconfig | 31 +
drivers/net/ethernet/davicom/Makefile | 1 +
drivers/net/ethernet/davicom/dm9051.c | 1151 +++++++++++++++++
drivers/net/ethernet/davicom/dm9051.h | 159 +++
5 files changed, 1404 insertions(+)
create mode 100644 Documentation/devicetree/bindings/net/davicom,dm9051.yaml
create mode 100644 drivers/net/ethernet/davicom/dm9051.c
create mode 100644 drivers/net/ethernet/davicom/dm9051.h
base-commit: 9d922f5df53844228b9f7c62f2593f4f06c0b69b
--
2.20.1
^ permalink raw reply
* Re: [PATCH v1, 6/8] media: mtk-vcodec: prevent kernel crash when scp ipi timeout
From: Macpaul Lin @ 2022-01-27 3:15 UTC (permalink / raw)
To: Yunfei Dong, Alexandre Courbot, Hans Verkuil, Tzung-Bi Shih,
AngeloGioacchino Del Regno, Tiffany Lin, Andrew-CT Chen,
Mauro Carvalho Chehab, Rob Herring, Matthias Brugger, Tomasz Figa
Cc: George Sun, Xiaoyong Lu, Hsin-Yi Wang, Fritz Koenig,
Dafna Hirschfeld, Benjamin Gaignard, Daniel Vetter, dri-devel,
Irui Wang, Steve Cho, linux-media, devicetree, linux-kernel,
linux-arm-kernel, srv_heupstream, linux-mediatek,
Project_Global_Chrome_Upstream_Group, Fabien Parent, Macross Chen
In-Reply-To: <20220127025544.10854-7-yunfei.dong@mediatek.com>
On 1/27/22 10:55 AM, Yunfei Dong wrote:
> From: Tinghan Shen <tinghan.shen@mediatek.com>
>
> When SCP timeout during playing video, kernel crashes with following
> message. It's caused by accessing NULL pointer in vpu_dec_ipi_handler.
> This patch doesn't solve the root cause of NULL pointer, but merely
> prevent kernel crashed when encounter the NULL pointer.
>
> After applied this patch, kernel keeps alive, only the video player turns
> to green screen.
>
> [67242.065474] pc : vpu_dec_ipi_handler+0xa0/0xb20 [mtk_vcodec_dec]
> [67242.065485] [MTK_V4L2] level=0 fops_vcodec_open(),334:
> 18000000.vcodec_dec decoder [135]
> [67242.065523] lr : scp_ipi_handler+0x11c/0x244 [mtk_scp]
> [67242.065540] sp : ffffffbb4207fb10
> [67242.065557] x29: ffffffbb4207fb30 x28: ffffffd00a1d5000
> [67242.065592] x27: 1ffffffa0143aa24 x26: 0000000000000000
> [67242.065625] x25: dfffffd000000000 x24: ffffffd0168bfdb0
> [67242.065659] x23: 1ffffff76840ff74 x22: ffffffbb41fa8a88
> [67242.065692] x21: ffffffbb4207fb9c x20: ffffffbb4207fba0
> [67242.065725] x19: ffffffbb4207fb98 x18: 0000000000000000
> [67242.065758] x17: 0000000000000000 x16: ffffffd042022094
> [67242.065791] x15: 1ffffff77ed4b71a x14: 1ffffff77ed4b719
> [67242.065824] x13: 0000000000000000 x12: 0000000000000000
> [67242.065857] x11: 0000000000000000 x10: dfffffd000000001
> [67242.065890] x9 : 0000000000000000 x8 : 0000000000000002
> [67242.065923] x7 : 0000000000000000 x6 : 000000000000003f
> [67242.065956] x5 : 0000000000000040 x4 : ffffffffffffffe0
> [67242.065989] x3 : ffffffd043b841b8 x2 : 0000000000000000
> [67242.066021] x1 : 0000000000000010 x0 : 0000000000000010
> [67242.066055] Call trace:
> [67242.066092] vpu_dec_ipi_handler+0xa0/0xb20 [mtk_vcodec_dec
> 12220d230d83a7426fc38c56b3e7bc6066955bae]
> [67242.066119] scp_ipi_handler+0x11c/0x244 [mtk_scp
> 8fb69c2ef141dd3192518b952b65aba35627b8bf]
> [67242.066145] mt8192_scp_irq_handler+0x70/0x128 [mtk_scp
> 8fb69c2ef141dd3192518b952b65aba35627b8bf]
> [67242.066172] scp_irq_handler+0xa0/0x114 [mtk_scp
> 8fb69c2ef141dd3192518b952b65aba35627b8bf]
> [67242.066200] irq_thread_fn+0x84/0xf8
> [67242.066220] irq_thread+0x170/0x1ec
> [67242.066242] kthread+0x2f8/0x3b8
> [67242.066264] ret_from_fork+0x10/0x30
> [67242.066292] Code: 38f96908 35003628 91004340 d343fc08 (38f96908)
>
> Signed-off-by: Tinghan Shen <tinghan.shen@mediatek.com>
> Signed-off-by: Yunfei Dong <yunfei.dong@mediatek.com>
> ---
> drivers/media/platform/mtk-vcodec/vdec_vpu_if.c | 5 +++++
> 1 file changed, 5 insertions(+)
>
> diff --git a/drivers/media/platform/mtk-vcodec/vdec_vpu_if.c b/drivers/media/platform/mtk-vcodec/vdec_vpu_if.c
> index 35f4d5583084..1041dd663e76 100644
> --- a/drivers/media/platform/mtk-vcodec/vdec_vpu_if.c
> +++ b/drivers/media/platform/mtk-vcodec/vdec_vpu_if.c
> @@ -91,6 +91,11 @@ static void vpu_dec_ipi_handler(void *data, unsigned int len, void *priv)
> struct vdec_vpu_inst *vpu = (struct vdec_vpu_inst *)
> (unsigned long)msg->ap_inst_addr;
>
> + if (!vpu) {
> + mtk_v4l2_err("ap_inst_addr is NULL");
> + return;
> + }
> +
> mtk_vcodec_debug(vpu, "+ id=%X", msg->msg_id);
>
> vpu->failure = msg->status;
>
Reviewed-by: Macpaul Lin <macpaul.lin@mediatek.com>
Regards,
Macpaul Lin
^ permalink raw reply
* Re: [PATCH v1, 4/8] media: mtk-vcodec: Adds compatible for mt8195
From: Macpaul Lin @ 2022-01-27 3:13 UTC (permalink / raw)
To: Yunfei Dong, Alexandre Courbot, Hans Verkuil, Tzung-Bi Shih,
AngeloGioacchino Del Regno, Tiffany Lin, Andrew-CT Chen,
Mauro Carvalho Chehab, Rob Herring, Matthias Brugger, Tomasz Figa
Cc: George Sun, Xiaoyong Lu, Hsin-Yi Wang, Fritz Koenig,
Dafna Hirschfeld, Benjamin Gaignard, Daniel Vetter, dri-devel,
Irui Wang, Steve Cho, linux-media, devicetree, linux-kernel,
linux-arm-kernel, srv_heupstream, linux-mediatek,
Project_Global_Chrome_Upstream_Group, Macross Chen
In-Reply-To: <20220127025544.10854-5-yunfei.dong@mediatek.com>
On 1/27/22 10:55 AM, Yunfei Dong wrote:
> Adds compatible for mt8195 platform.
>
> Signed-off-by: Yunfei Dong <yunfei.dong@mediatek.com>
> ---
> drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c | 4 ++++
> 1 file changed, 4 insertions(+)
>
> diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c
> index 2d21d0010c9c..938bf14e4e8c 100644
> --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c
> +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c
> @@ -468,6 +468,10 @@ static const struct of_device_id mtk_vcodec_match[] = {
> .compatible = "mediatek,mt8186-vcodec-dec",
> .data = &mtk_vdec_single_core_pdata,
> },
> + {
> + .compatible = "mediatek,mt8195-vcodec-dec",
> + .data = &mtk_lat_sig_core_pdata,
> + },
> {},
> };
>
>
Reviewed-by: Macpaul Lin <macpaul.lin@mediatek.com>
Regards,
Macpaul Lin
^ permalink raw reply
* Re: [PATCH v1, 3/8] dt-bindings: media: mtk-vcodec: Adds decoder dt-bindings for mt8195
From: Macpaul Lin @ 2022-01-27 3:13 UTC (permalink / raw)
To: Yunfei Dong, Alexandre Courbot, Hans Verkuil, Tzung-Bi Shih,
AngeloGioacchino Del Regno, Tiffany Lin, Andrew-CT Chen,
Mauro Carvalho Chehab, Rob Herring, Matthias Brugger, Tomasz Figa
Cc: George Sun, Xiaoyong Lu, Hsin-Yi Wang, Fritz Koenig,
Dafna Hirschfeld, Benjamin Gaignard, Daniel Vetter, dri-devel,
Irui Wang, Steve Cho, linux-media, devicetree, linux-kernel,
linux-arm-kernel, srv_heupstream, linux-mediatek,
Project_Global_Chrome_Upstream_Group, Macross Chen
In-Reply-To: <20220127025544.10854-4-yunfei.dong@mediatek.com>
On 1/27/22 10:55 AM, Yunfei Dong wrote:
> Adds decoder dt-bindings for mt8195.
>
> Signed-off-by: Yunfei Dong <yunfei.dong@mediatek.com>
> ---
> .../bindings/media/mediatek,vcodec-subdev-decoder.yaml | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/Documentation/devicetree/bindings/media/mediatek,vcodec-subdev-decoder.yaml b/Documentation/devicetree/bindings/media/mediatek,vcodec-subdev-decoder.yaml
> index a3c892338ac0..a2f2db29daed 100644
> --- a/Documentation/devicetree/bindings/media/mediatek,vcodec-subdev-decoder.yaml
> +++ b/Documentation/devicetree/bindings/media/mediatek,vcodec-subdev-decoder.yaml
> @@ -50,6 +50,7 @@ properties:
> enum:
> - mediatek,mt8192-vcodec-dec
> - mediatek,mt8186-vcodec-dec
> + - mediatek,mt8195-vcodec-dec
>
> reg:
> maxItems: 1
>
Reviewed-by: Macpaul Lin <macpaul.lin@mediatek.com>
Regards,
Macpaul Lin
^ permalink raw reply
* [PATCH 1/1] ARM: dts: qcom-apq8060-dragonboard: fix typo in eMMC
From: Ben Wolsieffer @ 2022-01-27 2:53 UTC (permalink / raw)
Cc: trivial, Ben Wolsieffer, Andy Gross, Bjorn Andersson, Rob Herring,
linux-arm-msm, devicetree, linux-kernel
eMMC was misspelled as eMMMC.
Signed-off-by: Ben Wolsieffer <benwolsieffer@gmail.com>
---
arch/arm/boot/dts/qcom-apq8060-dragonboard.dts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/arch/arm/boot/dts/qcom-apq8060-dragonboard.dts b/arch/arm/boot/dts/qcom-apq8060-dragonboard.dts
index d664ccd454c5..a03dab5661f5 100644
--- a/arch/arm/boot/dts/qcom-apq8060-dragonboard.dts
+++ b/arch/arm/boot/dts/qcom-apq8060-dragonboard.dts
@@ -83,7 +83,7 @@ cm3605 {
soc {
pinctrl@800000 {
- /* eMMMC pins, all 8 data lines connected */
+ /* eMMC pins, all 8 data lines connected */
dragon_sdcc1_pins: sdcc1 {
mux {
pins = "gpio159", "gpio160", "gpio161",
--
2.34.1
^ permalink raw reply related
* [PATCH v1, 8/8] media: mtk-vcodec: Add to support H264 inner racing mode
From: Yunfei Dong @ 2022-01-27 2:55 UTC (permalink / raw)
To: Yunfei Dong, Alexandre Courbot, Hans Verkuil, Tzung-Bi Shih,
AngeloGioacchino Del Regno, Tiffany Lin, Andrew-CT Chen,
Mauro Carvalho Chehab, Rob Herring, Matthias Brugger, Tomasz Figa
Cc: George Sun, Xiaoyong Lu, Hsin-Yi Wang, Fritz Koenig,
Dafna Hirschfeld, Benjamin Gaignard, Daniel Vetter, dri-devel,
Irui Wang, Steve Cho, linux-media, devicetree, linux-kernel,
linux-arm-kernel, srv_heupstream, linux-mediatek,
Project_Global_Chrome_Upstream_Group
In-Reply-To: <20220127025544.10854-1-yunfei.dong@mediatek.com>
In order to reduce decoder latency, enable H264 inner racing mode.
Send lat trans buffer information to core when trigger lat to work,
need not to wait until lat decode done.
Signed-off-by: Yunfei Dong <yunfei.dong@mediatek.com>
---
.../platform/mtk-vcodec/mtk_vcodec_dec_drv.c | 4 +++
.../platform/mtk-vcodec/mtk_vcodec_dec_pm.c | 34 +++++++++++++++++++
.../platform/mtk-vcodec/mtk_vcodec_drv.h | 10 ++++++
.../mtk-vcodec/vdec/vdec_h264_req_multi_if.c | 23 ++++++++++---
4 files changed, 66 insertions(+), 5 deletions(-)
diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c
index 938bf14e4e8c..099dc28b7445 100644
--- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c
+++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c
@@ -390,6 +390,10 @@ static int mtk_vcodec_probe(struct platform_device *pdev)
}
}
+ atomic_set(&dev->dec_active_cnt, 0);
+ memset(dev->vdec_racing_info, 0 , sizeof(dev->vdec_racing_info));
+ mutex_init(&dev->dec_racing_info_mutex);
+
if (dev->vdec_pdata->uses_stateless_api) {
dev->mdev_dec.dev = &pdev->dev;
strscpy(dev->mdev_dec.model, MTK_VCODEC_DEC_NAME,
diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_pm.c b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_pm.c
index 76e1442fc6f9..065d14a3d11f 100644
--- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_pm.c
+++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_pm.c
@@ -173,6 +173,34 @@ static void mtk_vcodec_dec_disable_irq(struct mtk_vcodec_dev *vdec_dev, int hw_i
}
}
+static void mtk_vcodec_load_racing_info(struct mtk_vcodec_ctx *ctx)
+{
+ void __iomem *vdec_racing_addr;
+ int j;
+
+ mutex_lock(&ctx->dev->dec_racing_info_mutex);
+ if (atomic_inc_return(&ctx->dev->dec_active_cnt) == 1) {
+ vdec_racing_addr = ctx->dev->reg_base[VDEC_MISC] + 0x100;
+ for (j = 0; j < 132; j++)
+ writel(ctx->dev->vdec_racing_info[j], vdec_racing_addr + j * 4);
+ }
+ mutex_unlock(&ctx->dev->dec_racing_info_mutex);
+}
+
+static void mtk_vcodec_record_racing_info(struct mtk_vcodec_ctx *ctx)
+{
+ void __iomem *vdec_racing_addr;
+ int j;
+
+ mutex_lock(&ctx->dev->dec_racing_info_mutex);
+ if (atomic_dec_and_test(&ctx->dev->dec_active_cnt)) {
+ vdec_racing_addr = ctx->dev->reg_base[VDEC_MISC] + 0x100;
+ for (j = 0; j < 132; j++)
+ ctx->dev->vdec_racing_info[j] = readl(vdec_racing_addr + j * 4);
+ }
+ mutex_unlock(&ctx->dev->dec_racing_info_mutex);
+}
+
static struct mtk_vcodec_pm *mtk_vcodec_dec_get_pm(struct mtk_vcodec_dev *vdec_dev,
int hw_idx)
{
@@ -243,11 +271,17 @@ void mtk_vcodec_dec_enable_hardware(struct mtk_vcodec_ctx *ctx, int hw_idx)
mtk_vcodec_dec_child_dev_on(ctx->dev, hw_idx);
mtk_vcodec_dec_enable_irq(ctx->dev, hw_idx);
+
+ if (IS_VDEC_INNER_RACING(ctx->dev->dec_capability))
+ mtk_vcodec_load_racing_info(ctx);
}
EXPORT_SYMBOL_GPL(mtk_vcodec_dec_enable_hardware);
void mtk_vcodec_dec_disable_hardware(struct mtk_vcodec_ctx *ctx, int hw_idx)
{
+ if (IS_VDEC_INNER_RACING(ctx->dev->dec_capability))
+ mtk_vcodec_record_racing_info(ctx);
+
mtk_vcodec_dec_disable_irq(ctx->dev, hw_idx);
mtk_vcodec_dec_child_dev_off(ctx->dev, hw_idx);
diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h b/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h
index 363b999dd709..4d6ace869b5a 100644
--- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h
+++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h
@@ -28,6 +28,7 @@
#define MTK_V4L2_BENCHMARK 0
#define WAIT_INTR_TIMEOUT_MS 1000
#define IS_VDEC_LAT_ARCH(hw_arch) ((hw_arch) >= MTK_VDEC_LAT_SINGLE_CORE)
+#define IS_VDEC_INNER_RACING(capability) (capability & MTK_VCODEC_INNER_RACING)
/*
* enum mtk_hw_reg_idx - MTK hw register base index
@@ -360,6 +361,7 @@ enum mtk_vdec_format_types {
MTK_VDEC_FORMAT_H264_SLICE = 0x100,
MTK_VDEC_FORMAT_VP8_FRAME = 0x200,
MTK_VDEC_FORMAT_VP9_FRAME = 0x400,
+ MTK_VCODEC_INNER_RACING = 0x20000,
};
/**
@@ -480,6 +482,10 @@ struct mtk_vcodec_enc_pdata {
* @subdev_dev: subdev hardware device
* @subdev_prob_done: check whether all used hw device is prob done
* @subdev_bitmap: used to record hardware is ready or not
+ *
+ * @dec_active_cnt: used to mark whether need to record register value
+ * @vdec_racing_info: record register value
+ * @dec_racing_info_mutex: mutex lock used for inner racing mode
*/
struct mtk_vcodec_dev {
struct v4l2_device v4l2_dev;
@@ -525,6 +531,10 @@ struct mtk_vcodec_dev {
void *subdev_dev[MTK_VDEC_HW_MAX];
int (*subdev_prob_done)(struct mtk_vcodec_dev *vdec_dev);
DECLARE_BITMAP(subdev_bitmap, MTK_VDEC_HW_MAX);
+
+ atomic_t dec_active_cnt;
+ u32 vdec_racing_info[132];
+ struct mutex dec_racing_info_mutex;
};
static inline struct mtk_vcodec_ctx *fh_to_ctx(struct v4l2_fh *fh)
diff --git a/drivers/media/platform/mtk-vcodec/vdec/vdec_h264_req_multi_if.c b/drivers/media/platform/mtk-vcodec/vdec/vdec_h264_req_multi_if.c
index 5541edbafed2..988d1d12d5c8 100644
--- a/drivers/media/platform/mtk-vcodec/vdec/vdec_h264_req_multi_if.c
+++ b/drivers/media/platform/mtk-vcodec/vdec/vdec_h264_req_multi_if.c
@@ -617,6 +617,17 @@ static int vdec_h264_slice_decode(void *h_vdec, struct mtk_vcodec_mem *bs,
goto err_free_fb_out;
}
+ share_info->trans_end = inst->ctx->msg_queue.wdma_addr.dma_addr +
+ inst->vsi->wdma_end_addr_offset;
+ share_info->trans_start = inst->ctx->msg_queue.wdma_wptr_addr;
+ share_info->nal_info = inst->vsi->dec.nal_info;
+
+ if (IS_VDEC_INNER_RACING(inst->ctx->dev->dec_capability)) {
+ memcpy(&share_info->h264_slice_params, &inst->vsi->h264_slice_params,
+ sizeof(share_info->h264_slice_params));
+ vdec_msg_queue_qbuf(&inst->ctx->dev->msg_queue_core_ctx, lat_buf);
+ }
+
/* wait decoder done interrupt */
timeout = mtk_vcodec_wait_for_done_ctx(inst->ctx, MTK_INST_IRQ_RECEIVED,
WAIT_INTR_TIMEOUT_MS, MTK_VDEC_LAT0);
@@ -630,14 +641,16 @@ static int vdec_h264_slice_decode(void *h_vdec, struct mtk_vcodec_mem *bs,
share_info->trans_end = inst->ctx->msg_queue.wdma_addr.dma_addr +
inst->vsi->wdma_end_addr_offset;
- share_info->trans_start = inst->ctx->msg_queue.wdma_wptr_addr;
- share_info->nal_info = inst->vsi->dec.nal_info;
vdec_msg_queue_update_ube_wptr(&lat_buf->ctx->msg_queue,
share_info->trans_end);
- memcpy(&share_info->h264_slice_params, &inst->vsi->h264_slice_params,
- sizeof(share_info->h264_slice_params));
- vdec_msg_queue_qbuf(&inst->ctx->dev->msg_queue_core_ctx, lat_buf);
+ if (!IS_VDEC_INNER_RACING(inst->ctx->dev->dec_capability)) {
+ memcpy(&share_info->h264_slice_params, &inst->vsi->h264_slice_params,
+ sizeof(share_info->h264_slice_params));
+ vdec_msg_queue_qbuf(&inst->ctx->dev->msg_queue_core_ctx, lat_buf);
+ }
+ mtk_vcodec_debug(inst, "lat crc: 0x%x 0x%x 0x%x", inst->vsi->dec.crc[0],
+ inst->vsi->dec.crc[1], inst->vsi->dec.crc[2]);
inst->slice_dec_num++;
err_free_fb_out:
--
2.25.1
^ permalink raw reply related
* [PATCH v1, 7/8] media: uapi: Init VP9 stateless decode params
From: Yunfei Dong @ 2022-01-27 2:55 UTC (permalink / raw)
To: Yunfei Dong, Alexandre Courbot, Hans Verkuil, Tzung-Bi Shih,
AngeloGioacchino Del Regno, Tiffany Lin, Andrew-CT Chen,
Mauro Carvalho Chehab, Rob Herring, Matthias Brugger, Tomasz Figa
Cc: George Sun, Xiaoyong Lu, Hsin-Yi Wang, Fritz Koenig,
Dafna Hirschfeld, Benjamin Gaignard, Daniel Vetter, dri-devel,
Irui Wang, Steve Cho, linux-media, devicetree, linux-kernel,
linux-arm-kernel, srv_heupstream, linux-mediatek,
Project_Global_Chrome_Upstream_Group
In-Reply-To: <20220127025544.10854-1-yunfei.dong@mediatek.com>
Init some of VP9 frame decode params to default value.
Signed-off-by: Yunfei Dong <yunfei.dong@mediatek.com>
---
drivers/media/v4l2-core/v4l2-ctrls-core.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/drivers/media/v4l2-core/v4l2-ctrls-core.c b/drivers/media/v4l2-core/v4l2-ctrls-core.c
index 54abe5245dcc..b25c77b8a445 100644
--- a/drivers/media/v4l2-core/v4l2-ctrls-core.c
+++ b/drivers/media/v4l2-core/v4l2-ctrls-core.c
@@ -112,6 +112,7 @@ static void std_init_compound(const struct v4l2_ctrl *ctrl, u32 idx,
struct v4l2_ctrl_mpeg2_picture *p_mpeg2_picture;
struct v4l2_ctrl_mpeg2_quantisation *p_mpeg2_quant;
struct v4l2_ctrl_vp8_frame *p_vp8_frame;
+ struct v4l2_ctrl_vp9_frame *p_vp9_frame;
struct v4l2_ctrl_fwht_params *p_fwht_params;
void *p = ptr.p + idx * ctrl->elem_size;
@@ -152,6 +153,13 @@ static void std_init_compound(const struct v4l2_ctrl *ctrl, u32 idx,
p_vp8_frame = p;
p_vp8_frame->num_dct_parts = 1;
break;
+ case V4L2_CTRL_TYPE_VP9_FRAME:
+ p_vp9_frame = p;
+ p_vp9_frame->profile = 0;
+ p_vp9_frame->bit_depth = 8;
+ p_vp9_frame->flags |= V4L2_VP9_FRAME_FLAG_X_SUBSAMPLING |
+ V4L2_VP9_FRAME_FLAG_Y_SUBSAMPLING;
+ break;
case V4L2_CTRL_TYPE_FWHT_PARAMS:
p_fwht_params = p;
p_fwht_params->version = V4L2_FWHT_VERSION;
--
2.25.1
^ permalink raw reply related
* [PATCH v1, 4/8] media: mtk-vcodec: Adds compatible for mt8195
From: Yunfei Dong @ 2022-01-27 2:55 UTC (permalink / raw)
To: Yunfei Dong, Alexandre Courbot, Hans Verkuil, Tzung-Bi Shih,
AngeloGioacchino Del Regno, Tiffany Lin, Andrew-CT Chen,
Mauro Carvalho Chehab, Rob Herring, Matthias Brugger, Tomasz Figa
Cc: George Sun, Xiaoyong Lu, Hsin-Yi Wang, Fritz Koenig,
Dafna Hirschfeld, Benjamin Gaignard, Daniel Vetter, dri-devel,
Irui Wang, Steve Cho, linux-media, devicetree, linux-kernel,
linux-arm-kernel, srv_heupstream, linux-mediatek,
Project_Global_Chrome_Upstream_Group
In-Reply-To: <20220127025544.10854-1-yunfei.dong@mediatek.com>
Adds compatible for mt8195 platform.
Signed-off-by: Yunfei Dong <yunfei.dong@mediatek.com>
---
drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c
index 2d21d0010c9c..938bf14e4e8c 100644
--- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c
+++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c
@@ -468,6 +468,10 @@ static const struct of_device_id mtk_vcodec_match[] = {
.compatible = "mediatek,mt8186-vcodec-dec",
.data = &mtk_vdec_single_core_pdata,
},
+ {
+ .compatible = "mediatek,mt8195-vcodec-dec",
+ .data = &mtk_lat_sig_core_pdata,
+ },
{},
};
--
2.25.1
^ permalink raw reply related
* [PATCH v1, 6/8] media: mtk-vcodec: prevent kernel crash when scp ipi timeout
From: Yunfei Dong @ 2022-01-27 2:55 UTC (permalink / raw)
To: Yunfei Dong, Alexandre Courbot, Hans Verkuil, Tzung-Bi Shih,
AngeloGioacchino Del Regno, Tiffany Lin, Andrew-CT Chen,
Mauro Carvalho Chehab, Rob Herring, Matthias Brugger, Tomasz Figa
Cc: George Sun, Xiaoyong Lu, Hsin-Yi Wang, Fritz Koenig,
Dafna Hirschfeld, Benjamin Gaignard, Daniel Vetter, dri-devel,
Irui Wang, Steve Cho, linux-media, devicetree, linux-kernel,
linux-arm-kernel, srv_heupstream, linux-mediatek,
Project_Global_Chrome_Upstream_Group
In-Reply-To: <20220127025544.10854-1-yunfei.dong@mediatek.com>
From: Tinghan Shen <tinghan.shen@mediatek.com>
When SCP timeout during playing video, kernel crashes with following
message. It's caused by accessing NULL pointer in vpu_dec_ipi_handler.
This patch doesn't solve the root cause of NULL pointer, but merely
prevent kernel crashed when encounter the NULL pointer.
After applied this patch, kernel keeps alive, only the video player turns
to green screen.
[67242.065474] pc : vpu_dec_ipi_handler+0xa0/0xb20 [mtk_vcodec_dec]
[67242.065485] [MTK_V4L2] level=0 fops_vcodec_open(),334:
18000000.vcodec_dec decoder [135]
[67242.065523] lr : scp_ipi_handler+0x11c/0x244 [mtk_scp]
[67242.065540] sp : ffffffbb4207fb10
[67242.065557] x29: ffffffbb4207fb30 x28: ffffffd00a1d5000
[67242.065592] x27: 1ffffffa0143aa24 x26: 0000000000000000
[67242.065625] x25: dfffffd000000000 x24: ffffffd0168bfdb0
[67242.065659] x23: 1ffffff76840ff74 x22: ffffffbb41fa8a88
[67242.065692] x21: ffffffbb4207fb9c x20: ffffffbb4207fba0
[67242.065725] x19: ffffffbb4207fb98 x18: 0000000000000000
[67242.065758] x17: 0000000000000000 x16: ffffffd042022094
[67242.065791] x15: 1ffffff77ed4b71a x14: 1ffffff77ed4b719
[67242.065824] x13: 0000000000000000 x12: 0000000000000000
[67242.065857] x11: 0000000000000000 x10: dfffffd000000001
[67242.065890] x9 : 0000000000000000 x8 : 0000000000000002
[67242.065923] x7 : 0000000000000000 x6 : 000000000000003f
[67242.065956] x5 : 0000000000000040 x4 : ffffffffffffffe0
[67242.065989] x3 : ffffffd043b841b8 x2 : 0000000000000000
[67242.066021] x1 : 0000000000000010 x0 : 0000000000000010
[67242.066055] Call trace:
[67242.066092] vpu_dec_ipi_handler+0xa0/0xb20 [mtk_vcodec_dec
12220d230d83a7426fc38c56b3e7bc6066955bae]
[67242.066119] scp_ipi_handler+0x11c/0x244 [mtk_scp
8fb69c2ef141dd3192518b952b65aba35627b8bf]
[67242.066145] mt8192_scp_irq_handler+0x70/0x128 [mtk_scp
8fb69c2ef141dd3192518b952b65aba35627b8bf]
[67242.066172] scp_irq_handler+0xa0/0x114 [mtk_scp
8fb69c2ef141dd3192518b952b65aba35627b8bf]
[67242.066200] irq_thread_fn+0x84/0xf8
[67242.066220] irq_thread+0x170/0x1ec
[67242.066242] kthread+0x2f8/0x3b8
[67242.066264] ret_from_fork+0x10/0x30
[67242.066292] Code: 38f96908 35003628 91004340 d343fc08 (38f96908)
Signed-off-by: Tinghan Shen <tinghan.shen@mediatek.com>
Signed-off-by: Yunfei Dong <yunfei.dong@mediatek.com>
---
drivers/media/platform/mtk-vcodec/vdec_vpu_if.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/drivers/media/platform/mtk-vcodec/vdec_vpu_if.c b/drivers/media/platform/mtk-vcodec/vdec_vpu_if.c
index 35f4d5583084..1041dd663e76 100644
--- a/drivers/media/platform/mtk-vcodec/vdec_vpu_if.c
+++ b/drivers/media/platform/mtk-vcodec/vdec_vpu_if.c
@@ -91,6 +91,11 @@ static void vpu_dec_ipi_handler(void *data, unsigned int len, void *priv)
struct vdec_vpu_inst *vpu = (struct vdec_vpu_inst *)
(unsigned long)msg->ap_inst_addr;
+ if (!vpu) {
+ mtk_v4l2_err("ap_inst_addr is NULL");
+ return;
+ }
+
mtk_vcodec_debug(vpu, "+ id=%X", msg->msg_id);
vpu->failure = msg->status;
--
2.25.1
^ permalink raw reply related
* [PATCH v1, 5/8] media: mtk-vcodec: Different codec using different capture format
From: Yunfei Dong @ 2022-01-27 2:55 UTC (permalink / raw)
To: Yunfei Dong, Alexandre Courbot, Hans Verkuil, Tzung-Bi Shih,
AngeloGioacchino Del Regno, Tiffany Lin, Andrew-CT Chen,
Mauro Carvalho Chehab, Rob Herring, Matthias Brugger, Tomasz Figa
Cc: George Sun, Xiaoyong Lu, Hsin-Yi Wang, Fritz Koenig,
Dafna Hirschfeld, Benjamin Gaignard, Daniel Vetter, dri-devel,
Irui Wang, Steve Cho, linux-media, devicetree, linux-kernel,
linux-arm-kernel, srv_heupstream, linux-mediatek,
Project_Global_Chrome_Upstream_Group
In-Reply-To: <20220127025544.10854-1-yunfei.dong@mediatek.com>
Vp8 need to use MM21, but vp9 and h264 need to use HyFbc mode
for mt8195. Vp8/vp9/h264 use the same MM21 format for mt8192.
Signed-off-by: Yunfei Dong <yunfei.dong@mediatek.com>
---
.../platform/mtk-vcodec/mtk_vcodec_dec.c | 41 +++++++++++++++++++
1 file changed, 41 insertions(+)
diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec.c b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec.c
index 6ad17e69e32d..f2ced0147534 100644
--- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec.c
+++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec.c
@@ -35,6 +35,44 @@ mtk_vdec_find_format(struct v4l2_format *f,
return NULL;
}
+static bool mtk_vdec_get_cap_fmt(struct mtk_vcodec_ctx *ctx, int format_index)
+{
+ const struct mtk_vcodec_dec_pdata *dec_pdata = ctx->dev->vdec_pdata;
+ const struct mtk_video_fmt *fmt;
+ struct mtk_q_data *q_data;
+ int num_frame_count = 0, i;
+ bool ret = true;
+
+ for (i = 0; i < *dec_pdata->num_formats; i++) {
+ if (dec_pdata->vdec_formats[i].type != MTK_FMT_FRAME)
+ continue;
+
+ num_frame_count++;
+ }
+
+ if (num_frame_count == 1)
+ return true;
+
+ fmt = &dec_pdata->vdec_formats[format_index];
+ q_data = &ctx->q_data[MTK_Q_DATA_SRC];
+ switch (q_data->fmt->fourcc) {
+ case V4L2_PIX_FMT_VP8_FRAME:
+ if (fmt->fourcc == V4L2_PIX_FMT_MM21)
+ ret = true;
+ break;
+ case V4L2_PIX_FMT_H264_SLICE:
+ case V4L2_PIX_FMT_VP9_FRAME:
+ if (fmt->fourcc == V4L2_PIX_FMT_MM21)
+ ret = false;
+ break;
+ default:
+ ret = true;
+ break;
+ };
+
+ return ret;
+}
+
static struct mtk_q_data *mtk_vdec_get_q_data(struct mtk_vcodec_ctx *ctx,
enum v4l2_buf_type type)
{
@@ -578,6 +616,9 @@ static int vidioc_enum_fmt(struct v4l2_fmtdesc *f, void *priv,
dec_pdata->vdec_formats[i].type != MTK_FMT_FRAME)
continue;
+ if (!output_queue && !mtk_vdec_get_cap_fmt(ctx, i))
+ continue;
+
if (j == f->index)
break;
++j;
--
2.25.1
^ permalink raw reply related
* [PATCH v1, 3/8] dt-bindings: media: mtk-vcodec: Adds decoder dt-bindings for mt8195
From: Yunfei Dong @ 2022-01-27 2:55 UTC (permalink / raw)
To: Yunfei Dong, Alexandre Courbot, Hans Verkuil, Tzung-Bi Shih,
AngeloGioacchino Del Regno, Tiffany Lin, Andrew-CT Chen,
Mauro Carvalho Chehab, Rob Herring, Matthias Brugger, Tomasz Figa
Cc: George Sun, Xiaoyong Lu, Hsin-Yi Wang, Fritz Koenig,
Dafna Hirschfeld, Benjamin Gaignard, Daniel Vetter, dri-devel,
Irui Wang, Steve Cho, linux-media, devicetree, linux-kernel,
linux-arm-kernel, srv_heupstream, linux-mediatek,
Project_Global_Chrome_Upstream_Group
In-Reply-To: <20220127025544.10854-1-yunfei.dong@mediatek.com>
Adds decoder dt-bindings for mt8195.
Signed-off-by: Yunfei Dong <yunfei.dong@mediatek.com>
---
.../bindings/media/mediatek,vcodec-subdev-decoder.yaml | 1 +
1 file changed, 1 insertion(+)
diff --git a/Documentation/devicetree/bindings/media/mediatek,vcodec-subdev-decoder.yaml b/Documentation/devicetree/bindings/media/mediatek,vcodec-subdev-decoder.yaml
index a3c892338ac0..a2f2db29daed 100644
--- a/Documentation/devicetree/bindings/media/mediatek,vcodec-subdev-decoder.yaml
+++ b/Documentation/devicetree/bindings/media/mediatek,vcodec-subdev-decoder.yaml
@@ -50,6 +50,7 @@ properties:
enum:
- mediatek,mt8192-vcodec-dec
- mediatek,mt8186-vcodec-dec
+ - mediatek,mt8195-vcodec-dec
reg:
maxItems: 1
--
2.25.1
^ permalink raw reply related
* [PATCH v1, 2/8] media: mtk-vcodec: Add to support lat soc hardware
From: Yunfei Dong @ 2022-01-27 2:55 UTC (permalink / raw)
To: Yunfei Dong, Alexandre Courbot, Hans Verkuil, Tzung-Bi Shih,
AngeloGioacchino Del Regno, Tiffany Lin, Andrew-CT Chen,
Mauro Carvalho Chehab, Rob Herring, Matthias Brugger, Tomasz Figa
Cc: George Sun, Xiaoyong Lu, Hsin-Yi Wang, Fritz Koenig,
Dafna Hirschfeld, Benjamin Gaignard, Daniel Vetter, dri-devel,
Irui Wang, Steve Cho, linux-media, devicetree, linux-kernel,
linux-arm-kernel, srv_heupstream, linux-mediatek,
Project_Global_Chrome_Upstream_Group
In-Reply-To: <20220127025544.10854-1-yunfei.dong@mediatek.com>
Add lat soc compatible and to support lat soc power/clk helper.
Signed-off-by: Yunfei Dong <yunfei.dong@mediatek.com>
---
.../platform/mtk-vcodec/mtk_vcodec_dec_hw.c | 12 +++++++++---
.../platform/mtk-vcodec/mtk_vcodec_dec_hw.h | 2 ++
.../platform/mtk-vcodec/mtk_vcodec_dec_pm.c | 16 ++++++++++++++++
.../media/platform/mtk-vcodec/mtk_vcodec_drv.h | 1 +
4 files changed, 28 insertions(+), 3 deletions(-)
diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_hw.c b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_hw.c
index 7b5da3e4cac2..7374d5a5c156 100644
--- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_hw.c
+++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_hw.c
@@ -28,6 +28,10 @@ static const struct of_device_id mtk_vdec_hw_match[] = {
.compatible = "mediatek,mtk-vcodec-core",
.data = (void *)MTK_VDEC_CORE,
},
+ {
+ .compatible = "mediatek,mtk-vcodec-lat-soc",
+ .data = (void *)MTK_VDEC_LAT_SOC,
+ },
{},
};
MODULE_DEVICE_TABLE(of, mtk_vdec_hw_match);
@@ -166,9 +170,11 @@ static int mtk_vdec_hw_probe(struct platform_device *pdev)
subdev_dev->reg_base[VDEC_HW_SYS] = main_dev->reg_base[VDEC_HW_SYS];
set_bit(subdev_dev->hw_idx, main_dev->subdev_bitmap);
- ret = mtk_vdec_hw_init_irq(subdev_dev);
- if (ret)
- goto err;
+ if (IS_SUPPORT_VDEC_HW_IRQ(hw_idx)) {
+ ret = mtk_vdec_hw_init_irq(subdev_dev);
+ if (ret)
+ goto err;
+ }
subdev_dev->reg_base[VDEC_HW_MISC] =
devm_platform_ioremap_resource(pdev, 0);
diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_hw.h b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_hw.h
index a63e4b1b81c3..b8938c6c3e72 100644
--- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_hw.h
+++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_hw.h
@@ -17,6 +17,8 @@
#define VDEC_IRQ_CLR 0x10
#define VDEC_IRQ_CFG_REG 0xa4
+#define IS_SUPPORT_VDEC_HW_IRQ(hw_idx) (hw_idx != MTK_VDEC_LAT_SOC)
+
/**
* enum mtk_vdec_hw_reg_idx - subdev hardware register base index
* @VDEC_HW_SYS : vdec soc register index
diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_pm.c b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_pm.c
index 1581a1277473..76e1442fc6f9 100644
--- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_pm.c
+++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_pm.c
@@ -203,6 +203,14 @@ static void mtk_vcodec_dec_child_dev_on(struct mtk_vcodec_dev *vdec_dev,
mtk_vcodec_dec_pw_on(pm);
mtk_vcodec_dec_clock_on(pm);
}
+
+ if (hw_idx == MTK_VDEC_LAT0) {
+ pm = mtk_vcodec_dec_get_pm(vdec_dev, MTK_VDEC_LAT_SOC);
+ if (pm) {
+ mtk_vcodec_dec_pw_on(pm);
+ mtk_vcodec_dec_clock_on(pm);
+ }
+ }
}
static void mtk_vcodec_dec_child_dev_off(struct mtk_vcodec_dev *vdec_dev,
@@ -215,6 +223,14 @@ static void mtk_vcodec_dec_child_dev_off(struct mtk_vcodec_dev *vdec_dev,
mtk_vcodec_dec_clock_off(pm);
mtk_vcodec_dec_pw_off(pm);
}
+
+ if (hw_idx == MTK_VDEC_LAT0) {
+ pm = mtk_vcodec_dec_get_pm(vdec_dev, MTK_VDEC_LAT_SOC);
+ if (pm) {
+ mtk_vcodec_dec_clock_off(pm);
+ mtk_vcodec_dec_pw_off(pm);
+ }
+ }
}
void mtk_vcodec_dec_enable_hardware(struct mtk_vcodec_ctx *ctx, int hw_idx)
diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h b/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h
index cd2939b47790..363b999dd709 100644
--- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h
+++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h
@@ -104,6 +104,7 @@ enum mtk_vdec_hw_id {
MTK_VDEC_CORE,
MTK_VDEC_LAT0,
MTK_VDEC_LAT1,
+ MTK_VDEC_LAT_SOC,
MTK_VDEC_HW_MAX,
};
--
2.25.1
^ permalink raw reply related
* [PATCH v1, 1/8] dt-bindings: media: mtk-vcodec: Adds decoder dt-bindings for lat soc
From: Yunfei Dong @ 2022-01-27 2:55 UTC (permalink / raw)
To: Yunfei Dong, Alexandre Courbot, Hans Verkuil, Tzung-Bi Shih,
AngeloGioacchino Del Regno, Tiffany Lin, Andrew-CT Chen,
Mauro Carvalho Chehab, Rob Herring, Matthias Brugger, Tomasz Figa
Cc: George Sun, Xiaoyong Lu, Hsin-Yi Wang, Fritz Koenig,
Dafna Hirschfeld, Benjamin Gaignard, Daniel Vetter, dri-devel,
Irui Wang, Steve Cho, linux-media, devicetree, linux-kernel,
linux-arm-kernel, srv_heupstream, linux-mediatek,
Project_Global_Chrome_Upstream_Group
In-Reply-To: <20220127025544.10854-1-yunfei.dong@mediatek.com>
Adds decoder dt-bindings for compatible "mediatek,mtk-vcodec-lat-soc".
Signed-off-by: Yunfei Dong <yunfei.dong@mediatek.com>
---
.../media/mediatek,vcodec-subdev-decoder.yaml | 49 +++++++++++++++++++
1 file changed, 49 insertions(+)
diff --git a/Documentation/devicetree/bindings/media/mediatek,vcodec-subdev-decoder.yaml b/Documentation/devicetree/bindings/media/mediatek,vcodec-subdev-decoder.yaml
index 6415c9f29130..a3c892338ac0 100644
--- a/Documentation/devicetree/bindings/media/mediatek,vcodec-subdev-decoder.yaml
+++ b/Documentation/devicetree/bindings/media/mediatek,vcodec-subdev-decoder.yaml
@@ -189,6 +189,55 @@ patternProperties:
additionalProperties: false
+ '^vcodec-lat-soc@[0-9a-f]+$':
+ type: object
+
+ properties:
+ compatible:
+ const: mediatek,mtk-vcodec-lat-soc
+
+ reg:
+ maxItems: 1
+
+ iommus:
+ minItems: 1
+ maxItems: 32
+ description: |
+ List of the hardware port in respective IOMMU block for current Socs.
+ Refer to bindings/iommu/mediatek,iommu.yaml.
+
+ clocks:
+ maxItems: 5
+
+ clock-names:
+ items:
+ - const: sel
+ - const: soc-vdec
+ - const: soc-lat
+ - const: vdec
+ - const: top
+
+ assigned-clocks:
+ maxItems: 1
+
+ assigned-clock-parents:
+ maxItems: 1
+
+ power-domains:
+ maxItems: 1
+
+ required:
+ - compatible
+ - reg
+ - iommus
+ - clocks
+ - clock-names
+ - assigned-clocks
+ - assigned-clock-parents
+ - power-domains
+
+ additionalProperties: false
+
required:
- compatible
- reg
--
2.25.1
^ permalink raw reply related
* [PATCH v1, 0/8] support mt8195 decoder
From: Yunfei Dong @ 2022-01-27 2:55 UTC (permalink / raw)
To: Yunfei Dong, Alexandre Courbot, Hans Verkuil, Tzung-Bi Shih,
AngeloGioacchino Del Regno, Tiffany Lin, Andrew-CT Chen,
Mauro Carvalho Chehab, Rob Herring, Matthias Brugger, Tomasz Figa
Cc: George Sun, Xiaoyong Lu, Hsin-Yi Wang, Fritz Koenig,
Dafna Hirschfeld, Benjamin Gaignard, Daniel Vetter, dri-devel,
Irui Wang, Steve Cho, linux-media, devicetree, linux-kernel,
linux-arm-kernel, srv_heupstream, linux-mediatek,
Project_Global_Chrome_Upstream_Group
Firstly, add mt8195 soc lat hardware and compatible, then add documents.
For vp8 only support MM21 mode, H264/vp9 support MT21C, need to separate
them. Next, initialize vp9 stateless decoder parameters. Lastly, enable
H264 inner racing mode to reduce hardware latency.
Patch 1~4 add mt8195 soc lat hardware and compatible, then add documents.
Patch 5 using different format for different codecs.
Patch 6 prevent kernel crash when scp reboot.
Patch 7 init vp9 stateless decoder parameters.
Patch 8 enable H264 inner racing mode to reduce hardware latency.
---
This patch depends on "support mt8186 decoder"[1]
[1] https://patchwork.kernel.org/project/linux-mediatek/cover/20220122075606.19373-1-yunfei.dong@mediatek.com
---
Tinghan Shen (1):
media: mtk-vcodec: prevent kernel crash when scp ipi timeout
Yunfei Dong (7):
dt-bindings: media: mtk-vcodec: Adds decoder dt-bindings for lat soc
media: mtk-vcodec: Add to support lat soc hardware
dt-bindings: media: mtk-vcodec: Adds decoder dt-bindings for mt8195
media: mtk-vcodec: Adds compatible for mt8195
media: mtk-vcodec: Different codec using different capture format
media: uapi: Init VP9 stateless decode params
media: mtk-vcodec: Add to support H264 inner racing mode
.../media/mediatek,vcodec-subdev-decoder.yaml | 50 +++++++++++++++++++
.../platform/mtk-vcodec/mtk_vcodec_dec.c | 41 +++++++++++++++
.../platform/mtk-vcodec/mtk_vcodec_dec_drv.c | 8 +++
.../platform/mtk-vcodec/mtk_vcodec_dec_hw.c | 12 +++--
.../platform/mtk-vcodec/mtk_vcodec_dec_hw.h | 2 +
.../platform/mtk-vcodec/mtk_vcodec_dec_pm.c | 50 +++++++++++++++++++
.../platform/mtk-vcodec/mtk_vcodec_drv.h | 11 ++++
.../mtk-vcodec/vdec/vdec_h264_req_multi_if.c | 23 +++++++--
.../media/platform/mtk-vcodec/vdec_vpu_if.c | 5 ++
drivers/media/v4l2-core/v4l2-ctrls-core.c | 8 +++
10 files changed, 202 insertions(+), 8 deletions(-)
--
2.25.1
^ permalink raw reply
* Re: [PATCH 3/3] ARM: dts: qcom: basic HP TouchPad support
From: Ben Wolsieffer @ 2022-01-27 2:33 UTC (permalink / raw)
To: Bjorn Andersson
Cc: linus.walleij, Andy Gross, Rob Herring, Arnd Bergmann,
Olof Johansson, soc, linux-arm-msm, devicetree, linux-kernel,
linux-arm-kernel
In-Reply-To: <YfDKTGQDh3tDMECz@builder.lan>
On Tue, Jan 25, 2022 at 10:13:00PM -0600, Bjorn Andersson wrote:
> On Mon 24 Jan 20:07 CST 2022, Ben Wolsieffer wrote:
>
> > Modify the Dragonboard device tree to support the most basic hardware on
> > the HP TouchPad. The headphone UART port and eMMC are supported.
> >
>
> We typically don't have one commit for the cloning and then one to
> update the content, in particular since your diffstat became rather
> weird.
>
> That said, got some comments below, things that I wouldn't have spotted
> if you sent this as just a new file.
Ok, I'll squash those for v2.
> > - dragon_sdcc1_pins: sdcc1 {
> > + /* eMMC pins, all 8 data lines connected */
> > + emmc_pins: sdcc1 {
> > mux {
> > pins = "gpio159", "gpio160", "gpio161",
> > "gpio162", "gpio163", "gpio164",
> > "gpio165", "gpio166", "gpio167",
> > "gpio168";
> > - function = "sdc1";
> > + function = "sdc1";
> > };
> > clk {
> > pins = "gpio167"; /* SDC1 CLK */
> [..]
> > @@ -171,205 +77,33 @@ pinconf {
> > };
> > };
> >
> > - dragon_gsbi12_i2c_pins: gsbi12_i2c {
> > - mux {
> > - pins = "gpio115", "gpio116";
> > - function = "gsbi12";
> > - };
> > - pinconf {
> > - pins = "gpio115", "gpio116";
> > - drive-strength = <16>;
> > - /* These have external pull-up 4.7kOhm to 1.8V */
> > - bias-disable;
> > - };
> > - };
> > -
> > - /* Primary serial port uart 0 pins */
> > - dragon_gsbi12_serial_pins: gsbi12_serial {
> > + /* Headphone UART pins */
> > + headphone_uart_pins: gsbi12_serial {
> > mux {
> > pins = "gpio117", "gpio118";
> > function = "gsbi12";
> > };
> > - tx {
> > - pins = "gpio117";
> > - drive-strength = <8>;
> > - bias-disable;
> > - };
> > rx {
> > - pins = "gpio118";
> > + pins = "gpio117";
> > drive-strength = <2>;
> > bias-pull-up;
> > };
> > - };
>
> I find it hard to conclude what the resulting snippet is from this
> chunk, did rx swap place from gpio118 to gpio117?
Yes, I made that swap based on comments in the downstream kernel, but,
now that I think about it, there's a good chance those comments are
wrong. The downstream kernel configures both pins as 8 mA drive with no
bias, so no one would ever notice that they were swapped. I think I'll
swap them back in v2. In practice I think the pin configuration makes
little difference, but should I keep the config from the Dragonboard or
match the downstream kernel?
> [..]
> > @@ -814,14 +378,16 @@ l20 {
> > bias-pull-down;
> > };
> > l21 {
> > - // 1.1 V according to schematic
> > regulator-min-microvolt = <1200000>;
> > regulator-max-microvolt = <1200000>;
> > bias-pull-down;
> > - regulator-always-on;
> > + /*
> > + * RPM driver can't handle always-on regulators that are
> > + * supplied by regulators initialized after them.
> > + */
>
> That looks like an oversight that should be corrected, perhaps it needs
> similar attention that was given to the smd-rpm driver recently?
>
> But this makes me wonder, how can this work on the other board? Linus?
It probably doesn't work as intended, but doesn't cause a major
problem either. I only noticed the failure while looking through dmesg.
As soon as the RPM driver probe gets to an always on regulator with a not
yet initialized supply, devm_regulator_register() returns -EAGAIN, it
breaks out of the loop, and the rest of the regulators don't get
initialized. The initialization is retried several times during boot
(because of -EAGAIN), but always fails at the same spot. This doesn't
actually seem to cause any visible problem, other than errors in dmesg.
I tried making the driver continue to initialize the rest of the
regulators even if one fails with -EAGAIN, but still return -EAGAIN from
probe(). My thought was that this would cause probe to be retried later,
and initialization would succeed now that the supply regulators were
available, but instead it seems to hang before any console output.
I don't know if the regulator supplies are correct either, because the
downstream kernel doesn't specify them. I also know next to nothing about
the RPM, so I would definitely appreciate a review from someone familiar
with it.
> > + // regulator-always-on;
> > };
> > l22 {
> > - // 1.2 V according to schematic
> > regulator-min-microvolt = <1150000>;
> > regulator-max-microvolt = <1150000>;
> > bias-pull-down;
> > @@ -845,7 +411,7 @@ l25 {
> > };
> >
> > s0 {
> > - // regulator-min-microvolt = <500000>;
> > + // regulator-min-microvolt = <800000>;
> > // regulator-max-microvolt = <1325000>;
>
> This looks like the full range the regulator could do, do you see a
> reason for documenting that here? Unless there's a good reason I think
> you should leave the commented min/max out.
That was just copied from the Dragonboard DTS, with updated values from
the downstream kernel. I assume some kind of voltage/frequency scaling
driver is needed to actually support a range of voltages here, so I
guess the comments could serve as a reference if that was ever
implemented.
^ permalink raw reply
* Re: [PATCH net-next v2 5/9] net: ethernet: mtk-star-emac: add clock pad selection for RMII
From: Macpaul Lin @ 2022-01-27 2:26 UTC (permalink / raw)
To: Biao Huang, David Miller, Rob Herring, Bartosz Golaszewski,
Fabien Parent
Cc: Jakub Kicinski, Felix Fietkau, John Crispin, Sean Wang, Mark Lee,
Matthias Brugger, netdev, devicetree, linux-kernel,
linux-arm-kernel, linux-mediatek, Yinghua Pan, srv_heupstream
In-Reply-To: <20220127015857.9868-6-biao.huang@mediatek.com>
On 1/27/22 9:58 AM, Biao Huang wrote:
> This patch add a new dts property named "mediatek,rmii-rxc" parsing
> in driver, which will configure MAC to select which pin the RMII reference
> clock is connected to, TXC or RXC.
>
> TXC pad is the default reference clock pin. If user wants to use RXC pad
> instead, add "mediatek,rmii-rxc" to corresponding device node.
>
> Signed-off-by: Biao Huang <biao.huang@mediatek.com>
> Signed-off-by: Yinghua Pan <ot_yinghua.pan@mediatek.com>
> ---
> drivers/net/ethernet/mediatek/mtk_star_emac.c | 19 +++++++++++++++++--
> 1 file changed, 17 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/net/ethernet/mediatek/mtk_star_emac.c b/drivers/net/ethernet/mediatek/mtk_star_emac.c
> index a3884beaa3fe..d69f75661e75 100644
> --- a/drivers/net/ethernet/mediatek/mtk_star_emac.c
> +++ b/drivers/net/ethernet/mediatek/mtk_star_emac.c
> @@ -189,6 +189,8 @@ static const char *const mtk_star_clk_names[] = { "core", "reg", "trans" };
> #define MTK_PERICFG_REG_NIC_CFG_CON_V2 0x0c10
> #define MTK_PERICFG_REG_NIC_CFG_CON_CFG_INTF GENMASK(3, 0)
> #define MTK_PERICFG_BIT_NIC_CFG_CON_RMII 1
> +#define MTK_PERICFG_BIT_NIC_CFG_CON_CLK BIT(0)
> +#define MTK_PERICFG_BIT_NIC_CFG_CON_CLK_V2 BIT(8)
>
> /* Represents the actual structure of descriptors used by the MAC. We can
> * reuse the same structure for both TX and RX - the layout is the same, only
> @@ -265,6 +267,7 @@ struct mtk_star_priv {
> int speed;
> int duplex;
> int pause;
> + bool rmii_rxc;
>
> const struct mtk_star_compat *compat_data;
>
> @@ -1528,6 +1531,8 @@ static int mtk_star_probe(struct platform_device *pdev)
> return -ENODEV;
> }
>
> + priv->rmii_rxc = of_property_read_bool(of_node, "mediatek,rmii-rxc");
> +
> if (priv->compat_data->set_interface_mode) {
> ret = priv->compat_data->set_interface_mode(ndev);
> if (ret) {
> @@ -1571,17 +1576,25 @@ static int mt8516_set_interface_mode(struct net_device *ndev)
> {
> struct mtk_star_priv *priv = netdev_priv(ndev);
> struct device *dev = mtk_star_get_dev(priv);
> - unsigned int intf_val;
> + unsigned int intf_val, ret, rmii_rxc;
>
> switch (priv->phy_intf) {
> case PHY_INTERFACE_MODE_RMII:
> intf_val = MTK_PERICFG_BIT_NIC_CFG_CON_RMII;
> + rmii_rxc = priv->rmii_rxc ? 0 : MTK_PERICFG_BIT_NIC_CFG_CON_CLK;
> break;
> default:
> dev_err(dev, "This interface not supported\n");
> return -EINVAL;
> }
>
> + ret = regmap_update_bits(priv->pericfg,
> + MTK_PERICFG_REG_NIC_CFG1_CON,
> + MTK_PERICFG_BIT_NIC_CFG_CON_CLK,
> + rmii_rxc);
> + if (ret)
> + return ret;
> +
> return regmap_update_bits(priv->pericfg,
> MTK_PERICFG_REG_NIC_CFG0_CON,
> MTK_PERICFG_REG_NIC_CFG_CON_CFG_INTF,
> @@ -1597,6 +1610,7 @@ static int mt8365_set_interface_mode(struct net_device *ndev)
> switch (priv->phy_intf) {
> case PHY_INTERFACE_MODE_RMII:
> intf_val = MTK_PERICFG_BIT_NIC_CFG_CON_RMII;
> + intf_val |= priv->rmii_rxc ? 0 : MTK_PERICFG_BIT_NIC_CFG_CON_CLK_V2;
> break;
> default:
> dev_err(dev, "This interface not supported\n");
> @@ -1605,7 +1619,8 @@ static int mt8365_set_interface_mode(struct net_device *ndev)
>
> return regmap_update_bits(priv->pericfg,
> MTK_PERICFG_REG_NIC_CFG_CON_V2,
> - MTK_PERICFG_REG_NIC_CFG_CON_CFG_INTF,
> + MTK_PERICFG_REG_NIC_CFG_CON_CFG_INTF |
> + MTK_PERICFG_BIT_NIC_CFG_CON_CLK_V2,
> intf_val);
> }
>
>
Reviewed-by: Macpaul Lin <macpaul.lin@mediatek.com>
Regards,
Macpaul Lin
^ permalink raw reply
* Re: [PATCH net-next v2 1/9] net: ethernet: mtk-star-emac: store bit_clk_div in compat structure
From: Macpaul Lin @ 2022-01-27 2:23 UTC (permalink / raw)
To: Biao Huang, David Miller, Rob Herring, Bartosz Golaszewski,
Fabien Parent
Cc: Jakub Kicinski, Felix Fietkau, John Crispin, Sean Wang, Mark Lee,
Matthias Brugger, netdev, devicetree, linux-kernel,
linux-arm-kernel, linux-mediatek, Yinghua Pan, srv_heupstream
In-Reply-To: <20220127015857.9868-2-biao.huang@mediatek.com>
On 1/27/22 9:58 AM, Biao Huang wrote:
> From: Fabien Parent <fparent@baylibre.com>
>
> Not all the SoC are using the same clock divider. Move the divider into
> a compat structure specific to the SoCs.
>
> Signed-off-by: Biao Huang <biao.huang@mediatek.com>
> Signed-off-by: Fabien Parent <fparent@baylibre.com>
> ---
> drivers/net/ethernet/mediatek/mtk_star_emac.c | 23 +++++++++++++++----
> 1 file changed, 19 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/net/ethernet/mediatek/mtk_star_emac.c b/drivers/net/ethernet/mediatek/mtk_star_emac.c
> index 1d5dd2015453..7fd8ec0fc636 100644
> --- a/drivers/net/ethernet/mediatek/mtk_star_emac.c
> +++ b/drivers/net/ethernet/mediatek/mtk_star_emac.c
> @@ -17,6 +17,7 @@
> #include <linux/module.h>
> #include <linux/netdevice.h>
> #include <linux/of.h>
> +#include <linux/of_device.h>
> #include <linux/of_mdio.h>
> #include <linux/of_net.h>
> #include <linux/platform_device.h>
> @@ -232,6 +233,10 @@ struct mtk_star_ring {
> unsigned int tail;
> };
>
> +struct mtk_star_compat {
> + unsigned char bit_clk_div;
> +};
> +
> struct mtk_star_priv {
> struct net_device *ndev;
>
> @@ -257,6 +262,8 @@ struct mtk_star_priv {
> int duplex;
> int pause;
>
> + const struct mtk_star_compat *compat_data;
> +
> /* Protects against concurrent descriptor access. */
> spinlock_t lock;
>
> @@ -899,7 +906,7 @@ static void mtk_star_init_config(struct mtk_star_priv *priv)
> regmap_write(priv->regs, MTK_STAR_REG_SYS_CONF, val);
> regmap_update_bits(priv->regs, MTK_STAR_REG_MAC_CLK_CONF,
> MTK_STAR_MSK_MAC_CLK_CONF,
> - MTK_STAR_BIT_CLK_DIV_10);
> + priv->compat_data->bit_clk_div);
> }
>
> static void mtk_star_set_mode_rmii(struct mtk_star_priv *priv)
> @@ -1461,6 +1468,7 @@ static int mtk_star_probe(struct platform_device *pdev)
>
> priv = netdev_priv(ndev);
> priv->ndev = ndev;
> + priv->compat_data = of_device_get_match_data(&pdev->dev);
> SET_NETDEV_DEV(ndev, dev);
> platform_set_drvdata(pdev, ndev);
>
> @@ -1556,10 +1564,17 @@ static int mtk_star_probe(struct platform_device *pdev)
> return devm_register_netdev(dev, ndev);
> }
>
> +static const struct mtk_star_compat mtk_star_mt8516_compat = {
> + .bit_clk_div = MTK_STAR_BIT_CLK_DIV_10,
> +};
> +
> static const struct of_device_id mtk_star_of_match[] = {
> - { .compatible = "mediatek,mt8516-eth", },
> - { .compatible = "mediatek,mt8518-eth", },
> - { .compatible = "mediatek,mt8175-eth", },
> + { .compatible = "mediatek,mt8516-eth",
> + .data = &mtk_star_mt8516_compat },
> + { .compatible = "mediatek,mt8518-eth",
> + .data = &mtk_star_mt8516_compat },
> + { .compatible = "mediatek,mt8175-eth",
> + .data = &mtk_star_mt8516_compat },
> { }
> };
> MODULE_DEVICE_TABLE(of, mtk_star_of_match);
>
Reviewed-by: Macpaul Lin <macpaul.lin@mediatek.com>
Regards,
Macpaul Lin
^ permalink raw reply
* Re: [PATCH net-next v2 3/9] net: ethernet: mtk-star-emac: add support for MT8365 SoC
From: Macpaul Lin @ 2022-01-27 2:22 UTC (permalink / raw)
To: Biao Huang, David Miller, Rob Herring, Bartosz Golaszewski,
Fabien Parent
Cc: Jakub Kicinski, Felix Fietkau, John Crispin, Sean Wang, Mark Lee,
Matthias Brugger, netdev, devicetree, linux-kernel,
linux-arm-kernel, linux-mediatek, Yinghua Pan, srv_heupstream
In-Reply-To: <20220127015857.9868-4-biao.huang@mediatek.com>
On 1/27/22 9:58 AM, Biao Huang wrote:
> Add Ethernet driver support for MT8365 SoC.
>
> Signed-off-by: Biao Huang <biao.huang@mediatek.com>
> Signed-off-by: Yinghua Pan <ot_yinghua.pan@mediatek.com>
> Signed-off-by: Fabien Parent <fparent@baylibre.com>
> ---
> drivers/net/ethernet/mediatek/mtk_star_emac.c | 75 ++++++++++++++++---
> 1 file changed, 64 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/net/ethernet/mediatek/mtk_star_emac.c b/drivers/net/ethernet/mediatek/mtk_star_emac.c
> index a8fbbbcd185b..a3884beaa3fe 100644
> --- a/drivers/net/ethernet/mediatek/mtk_star_emac.c
> +++ b/drivers/net/ethernet/mediatek/mtk_star_emac.c
> @@ -151,6 +151,7 @@ static const char *const mtk_star_clk_names[] = { "core", "reg", "trans" };
> #define MTK_STAR_REG_MAC_CLK_CONF 0x00ac
> #define MTK_STAR_MSK_MAC_CLK_CONF GENMASK(7, 0)
> #define MTK_STAR_BIT_CLK_DIV_10 0x0a
> +#define MTK_STAR_BIT_CLK_DIV_50 0x32
>
> /* Counter registers. */
> #define MTK_STAR_REG_C_RXOKPKT 0x0100
> @@ -183,9 +184,11 @@ static const char *const mtk_star_clk_names[] = { "core", "reg", "trans" };
> #define MTK_STAR_REG_C_RX_TWIST 0x0218
>
> /* Ethernet CFG Control */
> -#define MTK_PERICFG_REG_NIC_CFG_CON 0x03c4
> -#define MTK_PERICFG_MSK_NIC_CFG_CON_CFG_MII GENMASK(3, 0)
> -#define MTK_PERICFG_BIT_NIC_CFG_CON_RMII BIT(0)
> +#define MTK_PERICFG_REG_NIC_CFG0_CON 0x03c4
> +#define MTK_PERICFG_REG_NIC_CFG1_CON 0x03c8
> +#define MTK_PERICFG_REG_NIC_CFG_CON_V2 0x0c10
> +#define MTK_PERICFG_REG_NIC_CFG_CON_CFG_INTF GENMASK(3, 0)
> +#define MTK_PERICFG_BIT_NIC_CFG_CON_RMII 1
>
> /* Represents the actual structure of descriptors used by the MAC. We can
> * reuse the same structure for both TX and RX - the layout is the same, only
> @@ -234,6 +237,7 @@ struct mtk_star_ring {
> };
>
> struct mtk_star_compat {
> + int (*set_interface_mode)(struct net_device *ndev);
> unsigned char bit_clk_div;
> };
>
> @@ -909,13 +913,6 @@ static void mtk_star_init_config(struct mtk_star_priv *priv)
> priv->compat_data->bit_clk_div);
> }
>
> -static void mtk_star_set_mode_rmii(struct mtk_star_priv *priv)
> -{
> - regmap_update_bits(priv->pericfg, MTK_PERICFG_REG_NIC_CFG_CON,
> - MTK_PERICFG_MSK_NIC_CFG_CON_CFG_MII,
> - MTK_PERICFG_BIT_NIC_CFG_CON_RMII);
> -}
> -
> static int mtk_star_enable(struct net_device *ndev)
> {
> struct mtk_star_priv *priv = netdev_priv(ndev);
> @@ -1531,7 +1528,13 @@ static int mtk_star_probe(struct platform_device *pdev)
> return -ENODEV;
> }
>
> - mtk_star_set_mode_rmii(priv);
> + if (priv->compat_data->set_interface_mode) {
> + ret = priv->compat_data->set_interface_mode(ndev);
> + if (ret) {
> + dev_err(dev, "Failed to set phy interface, err = %d\n", ret);
> + return -EINVAL;
> + }
> + }
>
> ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(32));
> if (ret) {
> @@ -1564,10 +1567,58 @@ static int mtk_star_probe(struct platform_device *pdev)
> return devm_register_netdev(dev, ndev);
> }
>
> +static int mt8516_set_interface_mode(struct net_device *ndev)
> +{
> + struct mtk_star_priv *priv = netdev_priv(ndev);
> + struct device *dev = mtk_star_get_dev(priv);
> + unsigned int intf_val;
> +
> + switch (priv->phy_intf) {
> + case PHY_INTERFACE_MODE_RMII:
> + intf_val = MTK_PERICFG_BIT_NIC_CFG_CON_RMII;
> + break;
> + default:
> + dev_err(dev, "This interface not supported\n");
> + return -EINVAL;
> + }
> +
> + return regmap_update_bits(priv->pericfg,
> + MTK_PERICFG_REG_NIC_CFG0_CON,
> + MTK_PERICFG_REG_NIC_CFG_CON_CFG_INTF,
> + intf_val);
> +}
> +
> +static int mt8365_set_interface_mode(struct net_device *ndev)
> +{
> + struct mtk_star_priv *priv = netdev_priv(ndev);
> + struct device *dev = mtk_star_get_dev(priv);
> + unsigned int intf_val;
> +
> + switch (priv->phy_intf) {
> + case PHY_INTERFACE_MODE_RMII:
> + intf_val = MTK_PERICFG_BIT_NIC_CFG_CON_RMII;
> + break;
> + default:
> + dev_err(dev, "This interface not supported\n");
> + return -EINVAL;
> + }
> +
> + return regmap_update_bits(priv->pericfg,
> + MTK_PERICFG_REG_NIC_CFG_CON_V2,
> + MTK_PERICFG_REG_NIC_CFG_CON_CFG_INTF,
> + intf_val);
> +}
> +
> static const struct mtk_star_compat mtk_star_mt8516_compat = {
> + .set_interface_mode = mt8516_set_interface_mode,
> .bit_clk_div = MTK_STAR_BIT_CLK_DIV_10,
> };
>
> +static const struct mtk_star_compat mtk_star_mt8365_compat = {
> + .set_interface_mode = mt8365_set_interface_mode,
> + .bit_clk_div = MTK_STAR_BIT_CLK_DIV_50,
> +};
> +
> static const struct of_device_id mtk_star_of_match[] = {
> { .compatible = "mediatek,mt8516-eth",
> .data = &mtk_star_mt8516_compat },
> @@ -1575,6 +1626,8 @@ static const struct of_device_id mtk_star_of_match[] = {
> .data = &mtk_star_mt8516_compat },
> { .compatible = "mediatek,mt8175-eth",
> .data = &mtk_star_mt8516_compat },
> + { .compatible = "mediatek,mt8365-eth",
> + .data = &mtk_star_mt8365_compat },
> { }
> };
> MODULE_DEVICE_TABLE(of, mtk_star_of_match);
>
Reviewed-by: Macpaul Lin <macpaul.lin@mediatek.com>
Regards,
Macpaul Lin
^ permalink raw reply
* Re: [PATCH net-next v2 6/9] net: ethernet: mtk-star-emac: add timing adjustment support
From: Macpaul Lin @ 2022-01-27 2:20 UTC (permalink / raw)
To: Biao Huang, David Miller, Rob Herring, Bartosz Golaszewski,
Fabien Parent
Cc: Jakub Kicinski, Felix Fietkau, John Crispin, Sean Wang, Mark Lee,
Matthias Brugger, netdev, devicetree, linux-kernel,
linux-arm-kernel, linux-mediatek, Yinghua Pan, srv_heupstream
In-Reply-To: <20220127015857.9868-7-biao.huang@mediatek.com>
On 1/27/22 9:58 AM, Biao Huang wrote:
> Add simple clock inversion for timing adjustment in driver.
> Add property "mediatek,txc-inverse" or "mediatek,rxc-inverse" to
> device node when necessary.
>
> Signed-off-by: Biao Huang <biao.huang@mediatek.com>
> Signed-off-by: Yinghua Pan <ot_yinghua.pan@mediatek.com>
> ---
> drivers/net/ethernet/mediatek/mtk_star_emac.c | 34 +++++++++++++++++++
> 1 file changed, 34 insertions(+)
>
> diff --git a/drivers/net/ethernet/mediatek/mtk_star_emac.c b/drivers/net/ethernet/mediatek/mtk_star_emac.c
> index d69f75661e75..d5e974e0db6d 100644
> --- a/drivers/net/ethernet/mediatek/mtk_star_emac.c
> +++ b/drivers/net/ethernet/mediatek/mtk_star_emac.c
> @@ -131,6 +131,11 @@ static const char *const mtk_star_clk_names[] = { "core", "reg", "trans" };
> #define MTK_STAR_REG_INT_MASK 0x0054
> #define MTK_STAR_BIT_INT_MASK_FNRC BIT(6)
>
> +/* Delay-Macro Register */
> +#define MTK_STAR_REG_TEST0 0x0058
> +#define MTK_STAR_BIT_INV_RX_CLK BIT(30)
> +#define MTK_STAR_BIT_INV_TX_CLK BIT(31)
> +
> /* Misc. Config Register */
> #define MTK_STAR_REG_TEST1 0x005c
> #define MTK_STAR_BIT_TEST1_RST_HASH_MBIST BIT(31)
> @@ -268,6 +273,8 @@ struct mtk_star_priv {
> int duplex;
> int pause;
> bool rmii_rxc;
> + bool rx_inv;
> + bool tx_inv;
>
> const struct mtk_star_compat *compat_data;
>
> @@ -1450,6 +1457,25 @@ static void mtk_star_clk_disable_unprepare(void *data)
> clk_bulk_disable_unprepare(MTK_STAR_NCLKS, priv->clks);
> }
>
> +static int mtk_star_set_timing(struct mtk_star_priv *priv)
> +{
> + struct device *dev = mtk_star_get_dev(priv);
> + unsigned int delay_val = 0;
> +
> + switch (priv->phy_intf) {
> + case PHY_INTERFACE_MODE_RMII:
> + delay_val |= FIELD_PREP(MTK_STAR_BIT_INV_RX_CLK, priv->rx_inv);
> + delay_val |= FIELD_PREP(MTK_STAR_BIT_INV_TX_CLK, priv->tx_inv);
> + break;
> + default:
> + dev_err(dev, "This interface not supported\n");
> + return -EINVAL;
> + }
> +
> + regmap_write(priv->regs, MTK_STAR_REG_TEST0, delay_val);
> +
> + return 0;
> +}
> static int mtk_star_probe(struct platform_device *pdev)
> {
> struct device_node *of_node;
> @@ -1532,6 +1558,8 @@ static int mtk_star_probe(struct platform_device *pdev)
> }
>
> priv->rmii_rxc = of_property_read_bool(of_node, "mediatek,rmii-rxc");
> + priv->rx_inv = of_property_read_bool(of_node, "mediatek,rxc-inverse");
> + priv->tx_inv = of_property_read_bool(of_node, "mediatek,txc-inverse");
>
> if (priv->compat_data->set_interface_mode) {
> ret = priv->compat_data->set_interface_mode(ndev);
> @@ -1541,6 +1569,12 @@ static int mtk_star_probe(struct platform_device *pdev)
> }
> }
>
> + ret = mtk_star_set_timing(priv);
> + if (ret) {
> + dev_err(dev, "Failed to set timing, err = %d\n", ret);
> + return -EINVAL;
> + }
> +
> ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(32));
> if (ret) {
> dev_err(dev, "unsupported DMA mask\n");
>
Reviewed-by: Macpaul Lin <macpaul.lin@mediatek.com>
Regards,
Macpaul Lin
^ permalink raw reply
* Re: [PATCH net-next v2 8/9] net: ethernet: mtk-star-emac: add support for MII interface
From: Macpaul Lin @ 2022-01-27 2:17 UTC (permalink / raw)
To: Biao Huang, David Miller, Rob Herring, Bartosz Golaszewski,
Fabien Parent
Cc: Jakub Kicinski, Felix Fietkau, John Crispin, Sean Wang, Mark Lee,
Matthias Brugger, netdev, devicetree, linux-kernel,
linux-arm-kernel, linux-mediatek, Yinghua Pan, srv_heupstream
In-Reply-To: <20220127015857.9868-9-biao.huang@mediatek.com>
On 1/27/22 9:58 AM, Biao Huang wrote:
> Add support for MII interface.
> If user wants to use MII, assign "MII" to "phy-mode" property in dts.
>
> Signed-off-by: Biao Huang <biao.huang@mediatek.com>
> Signed-off-by: Yinghua Pan <ot_yinghua.pan@mediatek.com>
> ---
> drivers/net/ethernet/mediatek/mtk_star_emac.c | 13 +++++++++++--
> 1 file changed, 11 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/net/ethernet/mediatek/mtk_star_emac.c b/drivers/net/ethernet/mediatek/mtk_star_emac.c
> index d5e974e0db6d..167a019fd8f5 100644
> --- a/drivers/net/ethernet/mediatek/mtk_star_emac.c
> +++ b/drivers/net/ethernet/mediatek/mtk_star_emac.c
> @@ -193,6 +193,7 @@ static const char *const mtk_star_clk_names[] = { "core", "reg", "trans" };
> #define MTK_PERICFG_REG_NIC_CFG1_CON 0x03c8
> #define MTK_PERICFG_REG_NIC_CFG_CON_V2 0x0c10
> #define MTK_PERICFG_REG_NIC_CFG_CON_CFG_INTF GENMASK(3, 0)
> +#define MTK_PERICFG_BIT_NIC_CFG_CON_MII 0
> #define MTK_PERICFG_BIT_NIC_CFG_CON_RMII 1
> #define MTK_PERICFG_BIT_NIC_CFG_CON_CLK BIT(0)
> #define MTK_PERICFG_BIT_NIC_CFG_CON_CLK_V2 BIT(8)
> @@ -1463,6 +1464,7 @@ static int mtk_star_set_timing(struct mtk_star_priv *priv)
> unsigned int delay_val = 0;
>
> switch (priv->phy_intf) {
> + case PHY_INTERFACE_MODE_MII:
> case PHY_INTERFACE_MODE_RMII:
> delay_val |= FIELD_PREP(MTK_STAR_BIT_INV_RX_CLK, priv->rx_inv);
> delay_val |= FIELD_PREP(MTK_STAR_BIT_INV_TX_CLK, priv->tx_inv);
> @@ -1545,7 +1547,8 @@ static int mtk_star_probe(struct platform_device *pdev)
> ret = of_get_phy_mode(of_node, &priv->phy_intf);
> if (ret) {
> return ret;
> - } else if (priv->phy_intf != PHY_INTERFACE_MODE_RMII) {
> + } else if (priv->phy_intf != PHY_INTERFACE_MODE_RMII &&
> + priv->phy_intf != PHY_INTERFACE_MODE_MII) {
> dev_err(dev, "unsupported phy mode: %s\n",
> phy_modes(priv->phy_intf));
> return -EINVAL;
> @@ -1610,9 +1613,12 @@ static int mt8516_set_interface_mode(struct net_device *ndev)
> {
> struct mtk_star_priv *priv = netdev_priv(ndev);
> struct device *dev = mtk_star_get_dev(priv);
> - unsigned int intf_val, ret, rmii_rxc;
> + unsigned int intf_val, ret, rmii_rxc = 0;
>
> switch (priv->phy_intf) {
> + case PHY_INTERFACE_MODE_MII:
> + intf_val = MTK_PERICFG_BIT_NIC_CFG_CON_MII;
> + break;
> case PHY_INTERFACE_MODE_RMII:
> intf_val = MTK_PERICFG_BIT_NIC_CFG_CON_RMII;
> rmii_rxc = priv->rmii_rxc ? 0 : MTK_PERICFG_BIT_NIC_CFG_CON_CLK;
> @@ -1642,6 +1648,9 @@ static int mt8365_set_interface_mode(struct net_device *ndev)
> unsigned int intf_val;
>
> switch (priv->phy_intf) {
> + case PHY_INTERFACE_MODE_MII:
> + intf_val = MTK_PERICFG_BIT_NIC_CFG_CON_MII;
> + break;
> case PHY_INTERFACE_MODE_RMII:
> intf_val = MTK_PERICFG_BIT_NIC_CFG_CON_RMII;
> intf_val |= priv->rmii_rxc ? 0 : MTK_PERICFG_BIT_NIC_CFG_CON_CLK_V2;
>
Reviewed-by: Macpaul Lin <macpaul.lin@mediatek.com>
Regards,
Macpaul Lin
^ permalink raw reply
* [PATCH net-next v2 7/9] dt-bindings: net: mtk-star-emac: add description for new properties
From: Biao Huang @ 2022-01-27 1:58 UTC (permalink / raw)
To: David Miller, Rob Herring, Bartosz Golaszewski, Fabien Parent
Cc: Jakub Kicinski, Felix Fietkau, John Crispin, Sean Wang, Mark Lee,
Matthias Brugger, netdev, devicetree, linux-kernel,
linux-arm-kernel, linux-mediatek, Biao Huang, Yinghua Pan,
srv_heupstream, Macpaul Lin
In-Reply-To: <20220127015857.9868-1-biao.huang@mediatek.com>
Add description for new properties which will be parsed in driver.
Signed-off-by: Biao Huang <biao.huang@mediatek.com>
---
.../bindings/net/mediatek,star-emac.yaml | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/Documentation/devicetree/bindings/net/mediatek,star-emac.yaml b/Documentation/devicetree/bindings/net/mediatek,star-emac.yaml
index 87a8b25b03a6..41b1b1dd562c 100644
--- a/Documentation/devicetree/bindings/net/mediatek,star-emac.yaml
+++ b/Documentation/devicetree/bindings/net/mediatek,star-emac.yaml
@@ -48,6 +48,22 @@ properties:
Phandle to the device containing the PERICFG register range. This is used
to control the MII mode.
+ mediatek,rmii-rxc:
+ type: boolean
+ description:
+ If present, indicates that the RMII reference clock, which is from external
+ PHYs, is connected to RXC pin. Otherwise, is connected to TXC pin.
+
+ mediatek,rxc-inverse:
+ type: boolean
+ description:
+ If present, indicates that clock on RXC pad will be inversed.
+
+ mediatek,txc-inverse:
+ type: boolean
+ description:
+ If present, indicates that clock on TXC pad will be inversed.
+
mdio:
type: object
description:
--
2.25.1
^ permalink raw reply related
* [PATCH net-next v2 9/9] net: ethernet: mtk-star-emac: separate tx/rx handling with two NAPIs
From: Biao Huang @ 2022-01-27 1:58 UTC (permalink / raw)
To: David Miller, Rob Herring, Bartosz Golaszewski, Fabien Parent
Cc: Jakub Kicinski, Felix Fietkau, John Crispin, Sean Wang, Mark Lee,
Matthias Brugger, netdev, devicetree, linux-kernel,
linux-arm-kernel, linux-mediatek, Biao Huang, Yinghua Pan,
srv_heupstream, Macpaul Lin
In-Reply-To: <20220127015857.9868-1-biao.huang@mediatek.com>
Current driver may lost tx interrupts under bidirectional test with iperf3,
which leads to some unexpected issues.
This patch let rx/tx interrupt enable/disable separately, and rx/tx are
handled in different NAPIs.
Signed-off-by: Biao Huang <biao.huang@mediatek.com>
Signed-off-by: Yinghua Pan <ot_yinghua.pan@mediatek.com>
---
drivers/net/ethernet/mediatek/mtk_star_emac.c | 317 ++++++++++--------
1 file changed, 181 insertions(+), 136 deletions(-)
diff --git a/drivers/net/ethernet/mediatek/mtk_star_emac.c b/drivers/net/ethernet/mediatek/mtk_star_emac.c
index 167a019fd8f5..e5bcf851511a 100644
--- a/drivers/net/ethernet/mediatek/mtk_star_emac.c
+++ b/drivers/net/ethernet/mediatek/mtk_star_emac.c
@@ -229,7 +229,7 @@ struct mtk_star_ring_desc_data {
struct sk_buff *skb;
};
-#define MTK_STAR_RING_NUM_DESCS 128
+#define MTK_STAR_RING_NUM_DESCS 512
#define MTK_STAR_NUM_TX_DESCS MTK_STAR_RING_NUM_DESCS
#define MTK_STAR_NUM_RX_DESCS MTK_STAR_RING_NUM_DESCS
#define MTK_STAR_NUM_DESCS_TOTAL (MTK_STAR_RING_NUM_DESCS * 2)
@@ -264,7 +264,8 @@ struct mtk_star_priv {
struct mtk_star_ring rx_ring;
struct mii_bus *mii;
- struct napi_struct napi;
+ struct napi_struct tx_napi;
+ struct napi_struct rx_napi;
struct device_node *phy_node;
phy_interface_t phy_intf;
@@ -380,19 +381,16 @@ mtk_star_ring_push_head_tx(struct mtk_star_ring *ring,
mtk_star_ring_push_head(ring, desc_data, flags);
}
-static unsigned int mtk_star_ring_num_used_descs(struct mtk_star_ring *ring)
+static unsigned int mtk_star_tx_ring_avail(struct mtk_star_ring *ring)
{
- return abs(ring->head - ring->tail);
-}
+ u32 avail;
-static bool mtk_star_ring_full(struct mtk_star_ring *ring)
-{
- return mtk_star_ring_num_used_descs(ring) == MTK_STAR_RING_NUM_DESCS;
-}
+ if (ring->tail > ring->head)
+ avail = ring->tail - ring->head - 1;
+ else
+ avail = MTK_STAR_RING_NUM_DESCS - ring->head + ring->tail - 1;
-static bool mtk_star_ring_descs_available(struct mtk_star_ring *ring)
-{
- return mtk_star_ring_num_used_descs(ring) > 0;
+ return avail;
}
static dma_addr_t mtk_star_dma_map_rx(struct mtk_star_priv *priv,
@@ -415,7 +413,7 @@ static void mtk_star_dma_unmap_rx(struct mtk_star_priv *priv,
}
static dma_addr_t mtk_star_dma_map_tx(struct mtk_star_priv *priv,
- struct sk_buff *skb)
+ struct sk_buff *skb)
{
struct device *dev = mtk_star_get_dev(priv);
@@ -437,6 +435,36 @@ static void mtk_star_nic_disable_pd(struct mtk_star_priv *priv)
MTK_STAR_BIT_MAC_CFG_NIC_PD);
}
+static void mtk_star_enable_dma_irq(struct mtk_star_priv *priv,
+ bool rx, bool tx)
+{
+ u32 value;
+
+ regmap_read(priv->regs, MTK_STAR_REG_INT_MASK, &value);
+
+ if (tx)
+ value &= ~MTK_STAR_BIT_INT_STS_TNTC;
+ if (rx)
+ value &= ~MTK_STAR_BIT_INT_STS_FNRC;
+
+ regmap_write(priv->regs, MTK_STAR_REG_INT_MASK, value);
+}
+
+static void mtk_star_disable_dma_irq(struct mtk_star_priv *priv,
+ bool rx, bool tx)
+{
+ u32 value;
+
+ regmap_read(priv->regs, MTK_STAR_REG_INT_MASK, &value);
+
+ if (tx)
+ value |= MTK_STAR_BIT_INT_STS_TNTC;
+ if (rx)
+ value |= MTK_STAR_BIT_INT_STS_FNRC;
+
+ regmap_write(priv->regs, MTK_STAR_REG_INT_MASK, value);
+}
+
/* Unmask the three interrupts we care about, mask all others. */
static void mtk_star_intr_enable(struct mtk_star_priv *priv)
{
@@ -452,20 +480,11 @@ static void mtk_star_intr_disable(struct mtk_star_priv *priv)
regmap_write(priv->regs, MTK_STAR_REG_INT_MASK, ~0);
}
-static unsigned int mtk_star_intr_read(struct mtk_star_priv *priv)
-{
- unsigned int val;
-
- regmap_read(priv->regs, MTK_STAR_REG_INT_STS, &val);
-
- return val;
-}
-
static unsigned int mtk_star_intr_ack_all(struct mtk_star_priv *priv)
{
unsigned int val;
- val = mtk_star_intr_read(priv);
+ regmap_read(priv->regs, MTK_STAR_REG_INT_STS, &val);
regmap_write(priv->regs, MTK_STAR_REG_INT_STS, val);
return val;
@@ -737,25 +756,46 @@ static void mtk_star_free_tx_skbs(struct mtk_star_priv *priv)
mtk_star_ring_free_skbs(priv, ring, mtk_star_dma_unmap_tx);
}
-/* All processing for TX and RX happens in the napi poll callback.
- *
- * FIXME: The interrupt handling should be more fine-grained with each
- * interrupt enabled/disabled independently when needed. Unfortunatly this
- * turned out to impact the driver's stability and until we have something
- * working properly, we're disabling all interrupts during TX & RX processing
- * or when resetting the counter registers.
+/* mtk_star_handle_irq - Interrupt Handler.
+ * @irq: interrupt number.
+ * @data: pointer to a network interface device structure.
+ * Description : this is the driver interrupt service routine.
+ * it mainly handles:
+ * 1. tx complete interrupt for frame transmission.
+ * 2. rx complete interrupt for frame reception.
+ * 3. MAC Management Counter interrupt to avoid counter overflow.
*/
static irqreturn_t mtk_star_handle_irq(int irq, void *data)
{
- struct mtk_star_priv *priv;
- struct net_device *ndev;
+ struct net_device *ndev = data;
+ struct mtk_star_priv *priv = netdev_priv(ndev);
+ unsigned int intr_status = mtk_star_intr_ack_all(priv);
+ unsigned long flags = 0;
+
+ if (intr_status & MTK_STAR_BIT_INT_STS_FNRC) {
+ if (napi_schedule_prep(&priv->rx_napi)) {
+ spin_lock_irqsave(&priv->lock, flags);
+ /* mask Rx Complete interrupt */
+ mtk_star_disable_dma_irq(priv, true, false);
+ spin_unlock_irqrestore(&priv->lock, flags);
+ __napi_schedule_irqoff(&priv->rx_napi);
+ }
+ }
- ndev = data;
- priv = netdev_priv(ndev);
+ if (intr_status & MTK_STAR_BIT_INT_STS_TNTC) {
+ if (napi_schedule_prep(&priv->tx_napi)) {
+ spin_lock_irqsave(&priv->lock, flags);
+ /* mask Tx Complete interrupt */
+ mtk_star_disable_dma_irq(priv, false, true);
+ spin_unlock_irqrestore(&priv->lock, flags);
+ __napi_schedule_irqoff(&priv->tx_napi);
+ }
+ }
- if (netif_running(ndev)) {
- mtk_star_intr_disable(priv);
- napi_schedule(&priv->napi);
+ /* interrupt is triggered once any counters reach 0x8000000 */
+ if (intr_status & MTK_STAR_REG_INT_STS_MIB_CNT_TH) {
+ mtk_star_update_stats(priv);
+ mtk_star_reset_counters(priv);
}
return IRQ_HANDLED;
@@ -971,7 +1011,8 @@ static int mtk_star_enable(struct net_device *ndev)
if (ret)
goto err_free_skbs;
- napi_enable(&priv->napi);
+ napi_enable(&priv->tx_napi);
+ napi_enable(&priv->rx_napi);
mtk_star_intr_ack_all(priv);
mtk_star_intr_enable(priv);
@@ -1004,7 +1045,8 @@ static void mtk_star_disable(struct net_device *ndev)
struct mtk_star_priv *priv = netdev_priv(ndev);
netif_stop_queue(ndev);
- napi_disable(&priv->napi);
+ napi_disable(&priv->tx_napi);
+ napi_disable(&priv->rx_napi);
mtk_star_intr_disable(priv);
mtk_star_dma_disable(priv);
mtk_star_intr_ack_all(priv);
@@ -1043,6 +1085,17 @@ static int mtk_star_netdev_start_xmit(struct sk_buff *skb,
struct mtk_star_ring *ring = &priv->tx_ring;
struct device *dev = mtk_star_get_dev(priv);
struct mtk_star_ring_desc_data desc_data;
+ int nfrags = skb_shinfo(skb)->nr_frags;
+
+ if (unlikely(mtk_star_tx_ring_avail(ring) < nfrags + 1)) {
+ if (!netif_queue_stopped(ndev)) {
+ netif_stop_queue(ndev);
+ /* This is a hard error, log it. */
+ netdev_err(priv->ndev, "%s: Tx Ring full when queue awake\n",
+ __func__);
+ }
+ return NETDEV_TX_BUSY;
+ }
desc_data.dma_addr = mtk_star_dma_map_tx(priv, skb);
if (dma_mapping_error(dev, desc_data.dma_addr))
@@ -1050,18 +1103,10 @@ static int mtk_star_netdev_start_xmit(struct sk_buff *skb,
desc_data.skb = skb;
desc_data.len = skb->len;
-
- spin_lock_bh(&priv->lock);
-
mtk_star_ring_push_head_tx(ring, &desc_data);
netdev_sent_queue(ndev, skb->len);
- if (mtk_star_ring_full(ring))
- netif_stop_queue(ndev);
-
- spin_unlock_bh(&priv->lock);
-
mtk_star_dma_resume_tx(priv);
return NETDEV_TX_OK;
@@ -1092,23 +1137,31 @@ static int mtk_star_tx_complete_one(struct mtk_star_priv *priv)
return ret;
}
-static void mtk_star_tx_complete_all(struct mtk_star_priv *priv)
+static int mtk_star_tx_poll(struct napi_struct *napi, int budget)
{
- struct mtk_star_ring *ring = &priv->tx_ring;
- struct net_device *ndev = priv->ndev;
- int ret, pkts_compl, bytes_compl;
+ int ret, pkts_compl = 0, bytes_compl = 0, count = 0;
+ struct mtk_star_priv *priv;
+ struct mtk_star_ring *ring;
+ struct net_device *ndev;
+ unsigned long flags = 0;
+ unsigned int entry;
bool wake = false;
- spin_lock(&priv->lock);
+ priv = container_of(napi, struct mtk_star_priv, tx_napi);
+ ndev = priv->ndev;
- for (pkts_compl = 0, bytes_compl = 0;;
+ __netif_tx_lock_bh(netdev_get_tx_queue(priv->ndev, 0));
+ ring = &priv->tx_ring;
+ entry = ring->tail;
+ for (pkts_compl = 0, bytes_compl = 0;
+ (entry != ring->head) && (count < budget);
pkts_compl++, bytes_compl += ret, wake = true) {
- if (!mtk_star_ring_descs_available(ring))
- break;
ret = mtk_star_tx_complete_one(priv);
if (ret < 0)
break;
+ count++;
+ entry = ring->tail;
}
netdev_completed_queue(ndev, pkts_compl, bytes_compl);
@@ -1116,7 +1169,16 @@ static void mtk_star_tx_complete_all(struct mtk_star_priv *priv)
if (wake && netif_queue_stopped(ndev))
netif_wake_queue(ndev);
- spin_unlock(&priv->lock);
+ __netif_tx_unlock_bh(netdev_get_tx_queue(priv->ndev, 0));
+
+ count = min(count, budget);
+ if (count < budget && napi_complete_done(napi, count)) {
+ spin_lock_irqsave(&priv->lock, flags);
+ mtk_star_enable_dma_irq(priv, false, true);
+ spin_unlock_irqrestore(&priv->lock, flags);
+ }
+
+ return count;
}
static void mtk_star_netdev_get_stats64(struct net_device *ndev,
@@ -1196,7 +1258,7 @@ static const struct ethtool_ops mtk_star_ethtool_ops = {
.set_link_ksettings = phy_ethtool_set_link_ksettings,
};
-static int mtk_star_receive_packet(struct mtk_star_priv *priv)
+static int mtk_star_rx(struct mtk_star_priv *priv, int budget)
{
struct mtk_star_ring *ring = &priv->rx_ring;
struct device *dev = mtk_star_get_dev(priv);
@@ -1204,107 +1266,86 @@ static int mtk_star_receive_packet(struct mtk_star_priv *priv)
struct net_device *ndev = priv->ndev;
struct sk_buff *curr_skb, *new_skb;
dma_addr_t new_dma_addr;
- int ret;
+ int ret, count = 0;
- spin_lock(&priv->lock);
- ret = mtk_star_ring_pop_tail(ring, &desc_data);
- spin_unlock(&priv->lock);
- if (ret)
- return -1;
+ while (count < budget) {
+ ret = mtk_star_ring_pop_tail(ring, &desc_data);
+ if (ret)
+ return -1;
- curr_skb = desc_data.skb;
+ curr_skb = desc_data.skb;
- if ((desc_data.flags & MTK_STAR_DESC_BIT_RX_CRCE) ||
- (desc_data.flags & MTK_STAR_DESC_BIT_RX_OSIZE)) {
- /* Error packet -> drop and reuse skb. */
- new_skb = curr_skb;
- goto push_new_skb;
- }
+ if ((desc_data.flags & MTK_STAR_DESC_BIT_RX_CRCE) ||
+ (desc_data.flags & MTK_STAR_DESC_BIT_RX_OSIZE)) {
+ /* Error packet -> drop and reuse skb. */
+ new_skb = curr_skb;
+ goto push_new_skb;
+ }
- /* Prepare new skb before receiving the current one. Reuse the current
- * skb if we fail at any point.
- */
- new_skb = mtk_star_alloc_skb(ndev);
- if (!new_skb) {
- ndev->stats.rx_dropped++;
- new_skb = curr_skb;
- goto push_new_skb;
- }
+ /* Prepare new skb before receiving the current one.
+ * Reuse the current skb if we fail at any point.
+ */
+ new_skb = mtk_star_alloc_skb(ndev);
+ if (!new_skb) {
+ ndev->stats.rx_dropped++;
+ new_skb = curr_skb;
+ goto push_new_skb;
+ }
- new_dma_addr = mtk_star_dma_map_rx(priv, new_skb);
- if (dma_mapping_error(dev, new_dma_addr)) {
- ndev->stats.rx_dropped++;
- dev_kfree_skb(new_skb);
- new_skb = curr_skb;
- netdev_err(ndev, "DMA mapping error of RX descriptor\n");
- goto push_new_skb;
- }
+ new_dma_addr = mtk_star_dma_map_rx(priv, new_skb);
+ if (dma_mapping_error(dev, new_dma_addr)) {
+ ndev->stats.rx_dropped++;
+ dev_kfree_skb(new_skb);
+ new_skb = curr_skb;
+ netdev_err(ndev, "DMA mapping error of RX descriptor\n");
+ goto push_new_skb;
+ }
- /* We can't fail anymore at this point: it's safe to unmap the skb. */
- mtk_star_dma_unmap_rx(priv, &desc_data);
+ /* We can't fail anymore at this point:
+ * it's safe to unmap the skb.
+ */
+ mtk_star_dma_unmap_rx(priv, &desc_data);
- skb_put(desc_data.skb, desc_data.len);
- desc_data.skb->ip_summed = CHECKSUM_NONE;
- desc_data.skb->protocol = eth_type_trans(desc_data.skb, ndev);
- desc_data.skb->dev = ndev;
- netif_receive_skb(desc_data.skb);
+ skb_put(desc_data.skb, desc_data.len);
+ desc_data.skb->ip_summed = CHECKSUM_NONE;
+ desc_data.skb->protocol = eth_type_trans(desc_data.skb, ndev);
+ desc_data.skb->dev = ndev;
+ netif_receive_skb(desc_data.skb);
- /* update dma_addr for new skb */
- desc_data.dma_addr = new_dma_addr;
+ /* update dma_addr for new skb */
+ desc_data.dma_addr = new_dma_addr;
push_new_skb:
- desc_data.len = skb_tailroom(new_skb);
- desc_data.skb = new_skb;
-
- spin_lock(&priv->lock);
- mtk_star_ring_push_head_rx(ring, &desc_data);
- spin_unlock(&priv->lock);
-
- return 0;
-}
-static int mtk_star_process_rx(struct mtk_star_priv *priv, int budget)
-{
- int received, ret;
+ count++;
- for (received = 0, ret = 0; received < budget && ret == 0; received++)
- ret = mtk_star_receive_packet(priv);
+ desc_data.len = skb_tailroom(new_skb);
+ desc_data.skb = new_skb;
+ mtk_star_ring_push_head_rx(ring, &desc_data);
+ }
mtk_star_dma_resume_rx(priv);
- return received;
+ return count;
}
-static int mtk_star_poll(struct napi_struct *napi, int budget)
+static int mtk_star_rx_poll(struct napi_struct *napi, int budget)
{
struct mtk_star_priv *priv;
- unsigned int status;
- int received = 0;
+ unsigned long flags = 0;
+ int work_done = 0;
- priv = container_of(napi, struct mtk_star_priv, napi);
+ priv = container_of(napi, struct mtk_star_priv, rx_napi);
- status = mtk_star_intr_read(priv);
- mtk_star_intr_ack_all(priv);
-
- if (status & MTK_STAR_BIT_INT_STS_TNTC)
- /* Clean-up all TX descriptors. */
- mtk_star_tx_complete_all(priv);
-
- if (status & MTK_STAR_BIT_INT_STS_FNRC)
- /* Receive up to $budget packets. */
- received = mtk_star_process_rx(priv, budget);
-
- if (unlikely(status & MTK_STAR_REG_INT_STS_MIB_CNT_TH)) {
- mtk_star_update_stats(priv);
- mtk_star_reset_counters(priv);
+ work_done = mtk_star_rx(priv, budget);
+ if (work_done < budget) {
+ napi_complete_done(napi, work_done);
+ spin_lock_irqsave(&priv->lock, flags);
+ mtk_star_enable_dma_irq(priv, true, false);
+ spin_unlock_irqrestore(&priv->lock, flags);
}
- if (received < budget)
- napi_complete_done(napi, received);
-
- mtk_star_intr_enable(priv);
-
- return received;
+ return work_done;
}
static void mtk_star_mdio_rwok_clear(struct mtk_star_priv *priv)
@@ -1478,6 +1519,7 @@ static int mtk_star_set_timing(struct mtk_star_priv *priv)
return 0;
}
+
static int mtk_star_probe(struct platform_device *pdev)
{
struct device_node *of_node;
@@ -1604,7 +1646,10 @@ static int mtk_star_probe(struct platform_device *pdev)
ndev->netdev_ops = &mtk_star_netdev_ops;
ndev->ethtool_ops = &mtk_star_ethtool_ops;
- netif_napi_add(ndev, &priv->napi, mtk_star_poll, MTK_STAR_NAPI_WEIGHT);
+ netif_napi_add(ndev, &priv->rx_napi,
+ mtk_star_rx_poll, MTK_STAR_NAPI_WEIGHT);
+ netif_tx_napi_add(ndev, &priv->tx_napi,
+ mtk_star_tx_poll, MTK_STAR_NAPI_WEIGHT);
return devm_register_netdev(dev, ndev);
}
--
2.25.1
^ permalink raw reply related
* [PATCH net-next v2 8/9] net: ethernet: mtk-star-emac: add support for MII interface
From: Biao Huang @ 2022-01-27 1:58 UTC (permalink / raw)
To: David Miller, Rob Herring, Bartosz Golaszewski, Fabien Parent
Cc: Jakub Kicinski, Felix Fietkau, John Crispin, Sean Wang, Mark Lee,
Matthias Brugger, netdev, devicetree, linux-kernel,
linux-arm-kernel, linux-mediatek, Biao Huang, Yinghua Pan,
srv_heupstream, Macpaul Lin
In-Reply-To: <20220127015857.9868-1-biao.huang@mediatek.com>
Add support for MII interface.
If user wants to use MII, assign "MII" to "phy-mode" property in dts.
Signed-off-by: Biao Huang <biao.huang@mediatek.com>
Signed-off-by: Yinghua Pan <ot_yinghua.pan@mediatek.com>
---
drivers/net/ethernet/mediatek/mtk_star_emac.c | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/drivers/net/ethernet/mediatek/mtk_star_emac.c b/drivers/net/ethernet/mediatek/mtk_star_emac.c
index d5e974e0db6d..167a019fd8f5 100644
--- a/drivers/net/ethernet/mediatek/mtk_star_emac.c
+++ b/drivers/net/ethernet/mediatek/mtk_star_emac.c
@@ -193,6 +193,7 @@ static const char *const mtk_star_clk_names[] = { "core", "reg", "trans" };
#define MTK_PERICFG_REG_NIC_CFG1_CON 0x03c8
#define MTK_PERICFG_REG_NIC_CFG_CON_V2 0x0c10
#define MTK_PERICFG_REG_NIC_CFG_CON_CFG_INTF GENMASK(3, 0)
+#define MTK_PERICFG_BIT_NIC_CFG_CON_MII 0
#define MTK_PERICFG_BIT_NIC_CFG_CON_RMII 1
#define MTK_PERICFG_BIT_NIC_CFG_CON_CLK BIT(0)
#define MTK_PERICFG_BIT_NIC_CFG_CON_CLK_V2 BIT(8)
@@ -1463,6 +1464,7 @@ static int mtk_star_set_timing(struct mtk_star_priv *priv)
unsigned int delay_val = 0;
switch (priv->phy_intf) {
+ case PHY_INTERFACE_MODE_MII:
case PHY_INTERFACE_MODE_RMII:
delay_val |= FIELD_PREP(MTK_STAR_BIT_INV_RX_CLK, priv->rx_inv);
delay_val |= FIELD_PREP(MTK_STAR_BIT_INV_TX_CLK, priv->tx_inv);
@@ -1545,7 +1547,8 @@ static int mtk_star_probe(struct platform_device *pdev)
ret = of_get_phy_mode(of_node, &priv->phy_intf);
if (ret) {
return ret;
- } else if (priv->phy_intf != PHY_INTERFACE_MODE_RMII) {
+ } else if (priv->phy_intf != PHY_INTERFACE_MODE_RMII &&
+ priv->phy_intf != PHY_INTERFACE_MODE_MII) {
dev_err(dev, "unsupported phy mode: %s\n",
phy_modes(priv->phy_intf));
return -EINVAL;
@@ -1610,9 +1613,12 @@ static int mt8516_set_interface_mode(struct net_device *ndev)
{
struct mtk_star_priv *priv = netdev_priv(ndev);
struct device *dev = mtk_star_get_dev(priv);
- unsigned int intf_val, ret, rmii_rxc;
+ unsigned int intf_val, ret, rmii_rxc = 0;
switch (priv->phy_intf) {
+ case PHY_INTERFACE_MODE_MII:
+ intf_val = MTK_PERICFG_BIT_NIC_CFG_CON_MII;
+ break;
case PHY_INTERFACE_MODE_RMII:
intf_val = MTK_PERICFG_BIT_NIC_CFG_CON_RMII;
rmii_rxc = priv->rmii_rxc ? 0 : MTK_PERICFG_BIT_NIC_CFG_CON_CLK;
@@ -1642,6 +1648,9 @@ static int mt8365_set_interface_mode(struct net_device *ndev)
unsigned int intf_val;
switch (priv->phy_intf) {
+ case PHY_INTERFACE_MODE_MII:
+ intf_val = MTK_PERICFG_BIT_NIC_CFG_CON_MII;
+ break;
case PHY_INTERFACE_MODE_RMII:
intf_val = MTK_PERICFG_BIT_NIC_CFG_CON_RMII;
intf_val |= priv->rmii_rxc ? 0 : MTK_PERICFG_BIT_NIC_CFG_CON_CLK_V2;
--
2.25.1
^ permalink raw reply related
* [PATCH net-next v2 6/9] net: ethernet: mtk-star-emac: add timing adjustment support
From: Biao Huang @ 2022-01-27 1:58 UTC (permalink / raw)
To: David Miller, Rob Herring, Bartosz Golaszewski, Fabien Parent
Cc: Jakub Kicinski, Felix Fietkau, John Crispin, Sean Wang, Mark Lee,
Matthias Brugger, netdev, devicetree, linux-kernel,
linux-arm-kernel, linux-mediatek, Biao Huang, Yinghua Pan,
srv_heupstream, Macpaul Lin
In-Reply-To: <20220127015857.9868-1-biao.huang@mediatek.com>
Add simple clock inversion for timing adjustment in driver.
Add property "mediatek,txc-inverse" or "mediatek,rxc-inverse" to
device node when necessary.
Signed-off-by: Biao Huang <biao.huang@mediatek.com>
Signed-off-by: Yinghua Pan <ot_yinghua.pan@mediatek.com>
---
drivers/net/ethernet/mediatek/mtk_star_emac.c | 34 +++++++++++++++++++
1 file changed, 34 insertions(+)
diff --git a/drivers/net/ethernet/mediatek/mtk_star_emac.c b/drivers/net/ethernet/mediatek/mtk_star_emac.c
index d69f75661e75..d5e974e0db6d 100644
--- a/drivers/net/ethernet/mediatek/mtk_star_emac.c
+++ b/drivers/net/ethernet/mediatek/mtk_star_emac.c
@@ -131,6 +131,11 @@ static const char *const mtk_star_clk_names[] = { "core", "reg", "trans" };
#define MTK_STAR_REG_INT_MASK 0x0054
#define MTK_STAR_BIT_INT_MASK_FNRC BIT(6)
+/* Delay-Macro Register */
+#define MTK_STAR_REG_TEST0 0x0058
+#define MTK_STAR_BIT_INV_RX_CLK BIT(30)
+#define MTK_STAR_BIT_INV_TX_CLK BIT(31)
+
/* Misc. Config Register */
#define MTK_STAR_REG_TEST1 0x005c
#define MTK_STAR_BIT_TEST1_RST_HASH_MBIST BIT(31)
@@ -268,6 +273,8 @@ struct mtk_star_priv {
int duplex;
int pause;
bool rmii_rxc;
+ bool rx_inv;
+ bool tx_inv;
const struct mtk_star_compat *compat_data;
@@ -1450,6 +1457,25 @@ static void mtk_star_clk_disable_unprepare(void *data)
clk_bulk_disable_unprepare(MTK_STAR_NCLKS, priv->clks);
}
+static int mtk_star_set_timing(struct mtk_star_priv *priv)
+{
+ struct device *dev = mtk_star_get_dev(priv);
+ unsigned int delay_val = 0;
+
+ switch (priv->phy_intf) {
+ case PHY_INTERFACE_MODE_RMII:
+ delay_val |= FIELD_PREP(MTK_STAR_BIT_INV_RX_CLK, priv->rx_inv);
+ delay_val |= FIELD_PREP(MTK_STAR_BIT_INV_TX_CLK, priv->tx_inv);
+ break;
+ default:
+ dev_err(dev, "This interface not supported\n");
+ return -EINVAL;
+ }
+
+ regmap_write(priv->regs, MTK_STAR_REG_TEST0, delay_val);
+
+ return 0;
+}
static int mtk_star_probe(struct platform_device *pdev)
{
struct device_node *of_node;
@@ -1532,6 +1558,8 @@ static int mtk_star_probe(struct platform_device *pdev)
}
priv->rmii_rxc = of_property_read_bool(of_node, "mediatek,rmii-rxc");
+ priv->rx_inv = of_property_read_bool(of_node, "mediatek,rxc-inverse");
+ priv->tx_inv = of_property_read_bool(of_node, "mediatek,txc-inverse");
if (priv->compat_data->set_interface_mode) {
ret = priv->compat_data->set_interface_mode(ndev);
@@ -1541,6 +1569,12 @@ static int mtk_star_probe(struct platform_device *pdev)
}
}
+ ret = mtk_star_set_timing(priv);
+ if (ret) {
+ dev_err(dev, "Failed to set timing, err = %d\n", ret);
+ return -EINVAL;
+ }
+
ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(32));
if (ret) {
dev_err(dev, "unsupported DMA mask\n");
--
2.25.1
^ permalink raw reply related
* [PATCH net-next v2 4/9] dt-bindings: net: mtk-star-emac: add support for MT8365
From: Biao Huang @ 2022-01-27 1:58 UTC (permalink / raw)
To: David Miller, Rob Herring, Bartosz Golaszewski, Fabien Parent
Cc: Jakub Kicinski, Felix Fietkau, John Crispin, Sean Wang, Mark Lee,
Matthias Brugger, netdev, devicetree, linux-kernel,
linux-arm-kernel, linux-mediatek, Biao Huang, Yinghua Pan,
srv_heupstream, Macpaul Lin
In-Reply-To: <20220127015857.9868-1-biao.huang@mediatek.com>
Add binding document for Ethernet on MT8365.
Signed-off-by: Biao Huang <biao.huang@mediatek.com>
Reviewed-by: Bartosz Golaszewski <brgl@bgdev.pl>
---
Documentation/devicetree/bindings/net/mediatek,star-emac.yaml | 1 +
1 file changed, 1 insertion(+)
diff --git a/Documentation/devicetree/bindings/net/mediatek,star-emac.yaml b/Documentation/devicetree/bindings/net/mediatek,star-emac.yaml
index e6a5ff208253..87a8b25b03a6 100644
--- a/Documentation/devicetree/bindings/net/mediatek,star-emac.yaml
+++ b/Documentation/devicetree/bindings/net/mediatek,star-emac.yaml
@@ -23,6 +23,7 @@ properties:
- mediatek,mt8516-eth
- mediatek,mt8518-eth
- mediatek,mt8175-eth
+ - mediatek,mt8365-eth
reg:
maxItems: 1
--
2.25.1
^ permalink raw reply related
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox