mirror of
https://github.com/libretro/Lakka-LibreELEC.git
synced 2025-02-25 18:50:31 +00:00
linux (Allwinner): patches upstreamed in 5.15
This commit is contained in:
parent
7f9c087f70
commit
9a24926f9f
@ -1,45 +0,0 @@
|
||||
From 229e5bdcd39ed3ca0a71dc8500ba4ea90d4415db Mon Sep 17 00:00:00 2001
|
||||
From: Jernej Skrabec <jernej.skrabec@gmail.com>
|
||||
Date: Sun, 6 Jun 2021 10:23:13 +0200
|
||||
Subject: [PATCH] media: hevc: Add segment address field
|
||||
|
||||
If HEVC frame consists of multiple slices, segment address has to be
|
||||
known in order to properly decode it.
|
||||
|
||||
Add segment address field to slice parameters.
|
||||
|
||||
Signed-off-by: Jernej Skrabec <jernej.skrabec@gmail.com>
|
||||
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
|
||||
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
|
||||
---
|
||||
Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst | 3 +++
|
||||
include/media/hevc-ctrls.h | 3 ++-
|
||||
2 files changed, 5 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst
|
||||
+++ b/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst
|
||||
@@ -3000,6 +3000,9 @@ enum v4l2_mpeg_video_hevc_size_of_length
|
||||
* - __u8
|
||||
- ``pic_struct``
|
||||
-
|
||||
+ * - __u32
|
||||
+ - ``slice_segment_addr``
|
||||
+ -
|
||||
* - __u8
|
||||
- ``ref_idx_l0[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]``
|
||||
- The list of L0 reference elements as indices in the DPB.
|
||||
--- a/include/media/hevc-ctrls.h
|
||||
+++ b/include/media/hevc-ctrls.h
|
||||
@@ -196,10 +196,11 @@ struct v4l2_ctrl_hevc_slice_params {
|
||||
__u8 pic_struct;
|
||||
|
||||
/* ISO/IEC 23008-2, ITU-T Rec. H.265: General slice segment header */
|
||||
+ __u32 slice_segment_addr;
|
||||
__u8 ref_idx_l0[V4L2_HEVC_DPB_ENTRIES_NUM_MAX];
|
||||
__u8 ref_idx_l1[V4L2_HEVC_DPB_ENTRIES_NUM_MAX];
|
||||
|
||||
- __u8 padding[5];
|
||||
+ __u8 padding;
|
||||
|
||||
/* ISO/IEC 23008-2, ITU-T Rec. H.265: Weighted prediction parameter */
|
||||
struct v4l2_hevc_pred_weight_table pred_weight_table;
|
@ -1,92 +0,0 @@
|
||||
From d92a4a27d983032267b231a32be98a11a9995e5c Mon Sep 17 00:00:00 2001
|
||||
From: Jernej Skrabec <jernej.skrabec@gmail.com>
|
||||
Date: Sun, 6 Jun 2021 10:23:14 +0200
|
||||
Subject: [PATCH] media: cedrus: hevc: Add support for multiple slices
|
||||
|
||||
Now that segment address is available, support for multi-slice frames
|
||||
can be easily added.
|
||||
|
||||
Signed-off-by: Jernej Skrabec <jernej.skrabec@gmail.com>
|
||||
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
|
||||
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
|
||||
---
|
||||
.../staging/media/sunxi/cedrus/cedrus_h265.c | 26 ++++++++++++-------
|
||||
.../staging/media/sunxi/cedrus/cedrus_video.c | 1 +
|
||||
2 files changed, 17 insertions(+), 10 deletions(-)
|
||||
|
||||
--- a/drivers/staging/media/sunxi/cedrus/cedrus_h265.c
|
||||
+++ b/drivers/staging/media/sunxi/cedrus/cedrus_h265.c
|
||||
@@ -247,6 +247,8 @@ static void cedrus_h265_setup(struct ced
|
||||
const struct v4l2_ctrl_hevc_slice_params *slice_params;
|
||||
const struct v4l2_ctrl_hevc_decode_params *decode_params;
|
||||
const struct v4l2_hevc_pred_weight_table *pred_weight_table;
|
||||
+ unsigned int width_in_ctb_luma, ctb_size_luma;
|
||||
+ unsigned int log2_max_luma_coding_block_size;
|
||||
dma_addr_t src_buf_addr;
|
||||
dma_addr_t src_buf_end_addr;
|
||||
u32 chroma_log2_weight_denom;
|
||||
@@ -260,15 +262,17 @@ static void cedrus_h265_setup(struct ced
|
||||
decode_params = run->h265.decode_params;
|
||||
pred_weight_table = &slice_params->pred_weight_table;
|
||||
|
||||
+ log2_max_luma_coding_block_size =
|
||||
+ sps->log2_min_luma_coding_block_size_minus3 + 3 +
|
||||
+ sps->log2_diff_max_min_luma_coding_block_size;
|
||||
+ ctb_size_luma = 1UL << log2_max_luma_coding_block_size;
|
||||
+ width_in_ctb_luma =
|
||||
+ DIV_ROUND_UP(sps->pic_width_in_luma_samples, ctb_size_luma);
|
||||
+
|
||||
/* MV column buffer size and allocation. */
|
||||
if (!ctx->codec.h265.mv_col_buf_size) {
|
||||
unsigned int num_buffers =
|
||||
run->dst->vb2_buf.vb2_queue->num_buffers;
|
||||
- unsigned int log2_max_luma_coding_block_size =
|
||||
- sps->log2_min_luma_coding_block_size_minus3 + 3 +
|
||||
- sps->log2_diff_max_min_luma_coding_block_size;
|
||||
- unsigned int ctb_size_luma =
|
||||
- 1UL << log2_max_luma_coding_block_size;
|
||||
|
||||
/*
|
||||
* Each CTB requires a MV col buffer with a specific unit size.
|
||||
@@ -322,15 +326,17 @@ static void cedrus_h265_setup(struct ced
|
||||
reg = VE_DEC_H265_BITS_END_ADDR_BASE(src_buf_end_addr);
|
||||
cedrus_write(dev, VE_DEC_H265_BITS_END_ADDR, reg);
|
||||
|
||||
- /* Coding tree block address: start at the beginning. */
|
||||
- reg = VE_DEC_H265_DEC_CTB_ADDR_X(0) | VE_DEC_H265_DEC_CTB_ADDR_Y(0);
|
||||
+ /* Coding tree block address */
|
||||
+ reg = VE_DEC_H265_DEC_CTB_ADDR_X(slice_params->slice_segment_addr % width_in_ctb_luma);
|
||||
+ reg |= VE_DEC_H265_DEC_CTB_ADDR_Y(slice_params->slice_segment_addr / width_in_ctb_luma);
|
||||
cedrus_write(dev, VE_DEC_H265_DEC_CTB_ADDR, reg);
|
||||
|
||||
cedrus_write(dev, VE_DEC_H265_TILE_START_CTB, 0);
|
||||
cedrus_write(dev, VE_DEC_H265_TILE_END_CTB, 0);
|
||||
|
||||
/* Clear the number of correctly-decoded coding tree blocks. */
|
||||
- cedrus_write(dev, VE_DEC_H265_DEC_CTB_NUM, 0);
|
||||
+ if (ctx->fh.m2m_ctx->new_frame)
|
||||
+ cedrus_write(dev, VE_DEC_H265_DEC_CTB_NUM, 0);
|
||||
|
||||
/* Initialize bitstream access. */
|
||||
cedrus_write(dev, VE_DEC_H265_TRIGGER, VE_DEC_H265_TRIGGER_INIT_SWDEC);
|
||||
@@ -482,8 +488,8 @@ static void cedrus_h265_setup(struct ced
|
||||
V4L2_HEVC_SLICE_PARAMS_FLAG_DEPENDENT_SLICE_SEGMENT,
|
||||
slice_params->flags);
|
||||
|
||||
- /* FIXME: For multi-slice support. */
|
||||
- reg |= VE_DEC_H265_DEC_SLICE_HDR_INFO0_FLAG_FIRST_SLICE_SEGMENT_IN_PIC;
|
||||
+ if (ctx->fh.m2m_ctx->new_frame)
|
||||
+ reg |= VE_DEC_H265_DEC_SLICE_HDR_INFO0_FLAG_FIRST_SLICE_SEGMENT_IN_PIC;
|
||||
|
||||
cedrus_write(dev, VE_DEC_H265_DEC_SLICE_HDR_INFO0, reg);
|
||||
|
||||
--- a/drivers/staging/media/sunxi/cedrus/cedrus_video.c
|
||||
+++ b/drivers/staging/media/sunxi/cedrus/cedrus_video.c
|
||||
@@ -340,6 +340,7 @@ static int cedrus_s_fmt_vid_out(struct f
|
||||
|
||||
switch (ctx->src_fmt.pixelformat) {
|
||||
case V4L2_PIX_FMT_H264_SLICE:
|
||||
+ case V4L2_PIX_FMT_HEVC_SLICE:
|
||||
vq->subsystem_flags |=
|
||||
VB2_V4L2_FL_SUPPORTS_M2M_HOLD_CAPTURE_BUF;
|
||||
break;
|
@ -1,55 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
Date: Wed, 15 Jan 2020 18:39:17 +0100
|
||||
Subject: [PATCH] arm64: dts: allwinner: h6: tanix-tx6: enable emmc
|
||||
|
||||
Tanix TX6 has 32 GiB eMMC. Add a node for it.
|
||||
|
||||
Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
---
|
||||
.../dts/allwinner/sun50i-h6-tanix-tx6.dts | 20 +++++++++++++++++++
|
||||
1 file changed, 20 insertions(+)
|
||||
|
||||
--- a/arch/arm64/boot/dts/allwinner/sun50i-h6-tanix-tx6.dts
|
||||
+++ b/arch/arm64/boot/dts/allwinner/sun50i-h6-tanix-tx6.dts
|
||||
@@ -32,6 +32,13 @@
|
||||
};
|
||||
};
|
||||
|
||||
+ reg_vcc1v8: regulator-vcc1v8 {
|
||||
+ compatible = "regulator-fixed";
|
||||
+ regulator-name = "vcc1v8";
|
||||
+ regulator-min-microvolt = <1800000>;
|
||||
+ regulator-max-microvolt = <1800000>;
|
||||
+ };
|
||||
+
|
||||
reg_vcc3v3: regulator-vcc3v3 {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "vcc3v3";
|
||||
@@ -91,6 +98,15 @@
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
+&mmc2 {
|
||||
+ vmmc-supply = <®_vcc3v3>;
|
||||
+ vqmmc-supply = <®_vcc1v8>;
|
||||
+ non-removable;
|
||||
+ cap-mmc-hw-reset;
|
||||
+ bus-width = <8>;
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
&ohci0 {
|
||||
status = "okay";
|
||||
};
|
||||
@@ -99,6 +115,10 @@
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
+&pio {
|
||||
+ vcc-pc-supply = <®_vcc1v8>;
|
||||
+};
|
||||
+
|
||||
&r_ir {
|
||||
linux,rc-map-name = "rc-tanix-tx5max";
|
||||
status = "okay";
|
@ -1,210 +0,0 @@
|
||||
From 887d1018e2c5ab5e81edbd1318bbf4bbd2c739b0 Mon Sep 17 00:00:00 2001
|
||||
From: Jernej Skrabec <jernej.skrabec@gmail.com>
|
||||
Date: Sun, 12 Sep 2021 20:15:26 +0200
|
||||
Subject: [PATCH] drm/sun4i: dw-hdmi: Fix HDMI PHY clock setup
|
||||
|
||||
Recent rework which made HDMI PHY driver a platform device inadvertely
|
||||
reversed clock setup order. HW is very touch about it. Proper way is to
|
||||
handle controllers resets and clocks first and HDMI PHYs second.
|
||||
|
||||
Move HDMI PHY reset & clocks handling to sun8i_hdmi_phy_init() which
|
||||
will assure that code is executed after controllers reset & clocks are
|
||||
handled. Additionally, add sun8i_hdmi_phy_deinit() which will deinit it
|
||||
at controllers driver unload.
|
||||
|
||||
Fixes: 9bf3797796f5 ("drm/sun4i: dw-hdmi: Make HDMI PHY into a platform device")
|
||||
Signed-off-by: Jernej Skrabec <jernej.skrabec@gmail.com>
|
||||
---
|
||||
drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c | 7 +-
|
||||
drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h | 4 +-
|
||||
drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c | 97 ++++++++++++++------------
|
||||
3 files changed, 61 insertions(+), 47 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c b/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c
|
||||
index f75fb157f2ff..5fa5407ac583 100644
|
||||
--- a/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c
|
||||
+++ b/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c
|
||||
@@ -216,11 +216,13 @@ static int sun8i_dw_hdmi_bind(struct device *dev, struct device *master,
|
||||
goto err_disable_clk_tmds;
|
||||
}
|
||||
|
||||
+ ret = sun8i_hdmi_phy_init(hdmi->phy);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
drm_encoder_helper_add(encoder, &sun8i_dw_hdmi_encoder_helper_funcs);
|
||||
drm_simple_encoder_init(drm, encoder, DRM_MODE_ENCODER_TMDS);
|
||||
|
||||
- sun8i_hdmi_phy_init(hdmi->phy);
|
||||
-
|
||||
plat_data->mode_valid = hdmi->quirks->mode_valid;
|
||||
plat_data->use_drm_infoframe = hdmi->quirks->use_drm_infoframe;
|
||||
sun8i_hdmi_phy_set_ops(hdmi->phy, plat_data);
|
||||
@@ -262,6 +264,7 @@ static void sun8i_dw_hdmi_unbind(struct device *dev, struct device *master,
|
||||
struct sun8i_dw_hdmi *hdmi = dev_get_drvdata(dev);
|
||||
|
||||
dw_hdmi_unbind(hdmi->hdmi);
|
||||
+ sun8i_hdmi_phy_deinit(hdmi->phy);
|
||||
clk_disable_unprepare(hdmi->clk_tmds);
|
||||
reset_control_assert(hdmi->rst_ctrl);
|
||||
gpiod_set_value(hdmi->ddc_en, 0);
|
||||
diff --git a/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h b/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h
|
||||
index 74f6ed0e2570..bffe1b9cd3dc 100644
|
||||
--- a/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h
|
||||
+++ b/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h
|
||||
@@ -169,6 +169,7 @@ struct sun8i_hdmi_phy {
|
||||
struct clk *clk_phy;
|
||||
struct clk *clk_pll0;
|
||||
struct clk *clk_pll1;
|
||||
+ struct device *dev;
|
||||
unsigned int rcal;
|
||||
struct regmap *regs;
|
||||
struct reset_control *rst_phy;
|
||||
@@ -205,7 +206,8 @@ encoder_to_sun8i_dw_hdmi(struct drm_encoder *encoder)
|
||||
|
||||
int sun8i_hdmi_phy_get(struct sun8i_dw_hdmi *hdmi, struct device_node *node);
|
||||
|
||||
-void sun8i_hdmi_phy_init(struct sun8i_hdmi_phy *phy);
|
||||
+int sun8i_hdmi_phy_init(struct sun8i_hdmi_phy *phy);
|
||||
+void sun8i_hdmi_phy_deinit(struct sun8i_hdmi_phy *phy);
|
||||
void sun8i_hdmi_phy_set_ops(struct sun8i_hdmi_phy *phy,
|
||||
struct dw_hdmi_plat_data *plat_data);
|
||||
|
||||
diff --git a/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c b/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c
|
||||
index c9239708d398..78b152973957 100644
|
||||
--- a/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c
|
||||
+++ b/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c
|
||||
@@ -506,9 +506,60 @@ static void sun8i_hdmi_phy_init_h3(struct sun8i_hdmi_phy *phy)
|
||||
phy->rcal = (val & SUN8I_HDMI_PHY_ANA_STS_RCAL_MASK) >> 2;
|
||||
}
|
||||
|
||||
-void sun8i_hdmi_phy_init(struct sun8i_hdmi_phy *phy)
|
||||
+int sun8i_hdmi_phy_init(struct sun8i_hdmi_phy *phy)
|
||||
{
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = reset_control_deassert(phy->rst_phy);
|
||||
+ if (ret) {
|
||||
+ dev_err(phy->dev, "Cannot deassert phy reset control: %d\n", ret);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ ret = clk_prepare_enable(phy->clk_bus);
|
||||
+ if (ret) {
|
||||
+ dev_err(phy->dev, "Cannot enable bus clock: %d\n", ret);
|
||||
+ goto err_deassert_rst_phy;
|
||||
+ }
|
||||
+
|
||||
+ ret = clk_prepare_enable(phy->clk_mod);
|
||||
+ if (ret) {
|
||||
+ dev_err(phy->dev, "Cannot enable mod clock: %d\n", ret);
|
||||
+ goto err_disable_clk_bus;
|
||||
+ }
|
||||
+
|
||||
+ if (phy->variant->has_phy_clk) {
|
||||
+ ret = sun8i_phy_clk_create(phy, phy->dev,
|
||||
+ phy->variant->has_second_pll);
|
||||
+ if (ret) {
|
||||
+ dev_err(phy->dev, "Couldn't create the PHY clock\n");
|
||||
+ goto err_disable_clk_mod;
|
||||
+ }
|
||||
+
|
||||
+ clk_prepare_enable(phy->clk_phy);
|
||||
+ }
|
||||
+
|
||||
phy->variant->phy_init(phy);
|
||||
+
|
||||
+ return 0;
|
||||
+
|
||||
+err_disable_clk_mod:
|
||||
+ clk_disable_unprepare(phy->clk_mod);
|
||||
+err_disable_clk_bus:
|
||||
+ clk_disable_unprepare(phy->clk_bus);
|
||||
+err_deassert_rst_phy:
|
||||
+ reset_control_assert(phy->rst_phy);
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+void sun8i_hdmi_phy_deinit(struct sun8i_hdmi_phy *phy)
|
||||
+{
|
||||
+ clk_disable_unprepare(phy->clk_mod);
|
||||
+ clk_disable_unprepare(phy->clk_bus);
|
||||
+ clk_disable_unprepare(phy->clk_phy);
|
||||
+
|
||||
+ reset_control_assert(phy->rst_phy);
|
||||
}
|
||||
|
||||
void sun8i_hdmi_phy_set_ops(struct sun8i_hdmi_phy *phy,
|
||||
@@ -638,6 +689,7 @@ static int sun8i_hdmi_phy_probe(struct platform_device *pdev)
|
||||
return -ENOMEM;
|
||||
|
||||
phy->variant = (struct sun8i_hdmi_phy_variant *)match->data;
|
||||
+ phy->dev = dev;
|
||||
|
||||
ret = of_address_to_resource(node, 0, &res);
|
||||
if (ret) {
|
||||
@@ -696,47 +748,10 @@ static int sun8i_hdmi_phy_probe(struct platform_device *pdev)
|
||||
goto err_put_clk_pll1;
|
||||
}
|
||||
|
||||
- ret = reset_control_deassert(phy->rst_phy);
|
||||
- if (ret) {
|
||||
- dev_err(dev, "Cannot deassert phy reset control: %d\n", ret);
|
||||
- goto err_put_rst_phy;
|
||||
- }
|
||||
-
|
||||
- ret = clk_prepare_enable(phy->clk_bus);
|
||||
- if (ret) {
|
||||
- dev_err(dev, "Cannot enable bus clock: %d\n", ret);
|
||||
- goto err_deassert_rst_phy;
|
||||
- }
|
||||
-
|
||||
- ret = clk_prepare_enable(phy->clk_mod);
|
||||
- if (ret) {
|
||||
- dev_err(dev, "Cannot enable mod clock: %d\n", ret);
|
||||
- goto err_disable_clk_bus;
|
||||
- }
|
||||
-
|
||||
- if (phy->variant->has_phy_clk) {
|
||||
- ret = sun8i_phy_clk_create(phy, dev,
|
||||
- phy->variant->has_second_pll);
|
||||
- if (ret) {
|
||||
- dev_err(dev, "Couldn't create the PHY clock\n");
|
||||
- goto err_disable_clk_mod;
|
||||
- }
|
||||
-
|
||||
- clk_prepare_enable(phy->clk_phy);
|
||||
- }
|
||||
-
|
||||
platform_set_drvdata(pdev, phy);
|
||||
|
||||
return 0;
|
||||
|
||||
-err_disable_clk_mod:
|
||||
- clk_disable_unprepare(phy->clk_mod);
|
||||
-err_disable_clk_bus:
|
||||
- clk_disable_unprepare(phy->clk_bus);
|
||||
-err_deassert_rst_phy:
|
||||
- reset_control_assert(phy->rst_phy);
|
||||
-err_put_rst_phy:
|
||||
- reset_control_put(phy->rst_phy);
|
||||
err_put_clk_pll1:
|
||||
clk_put(phy->clk_pll1);
|
||||
err_put_clk_pll0:
|
||||
@@ -753,12 +768,6 @@ static int sun8i_hdmi_phy_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct sun8i_hdmi_phy *phy = platform_get_drvdata(pdev);
|
||||
|
||||
- clk_disable_unprepare(phy->clk_mod);
|
||||
- clk_disable_unprepare(phy->clk_bus);
|
||||
- clk_disable_unprepare(phy->clk_phy);
|
||||
-
|
||||
- reset_control_assert(phy->rst_phy);
|
||||
-
|
||||
reset_control_put(phy->rst_phy);
|
||||
|
||||
clk_put(phy->clk_pll0);
|
||||
--
|
||||
2.33.0
|
||||
|
Loading…
x
Reference in New Issue
Block a user