mirror of
https://github.com/LibreELEC/LibreELEC.tv.git
synced 2025-07-29 13:46:49 +00:00
Merge pull request #8392 from jernejsk/le11-fixes
[LE11] Allwinner: Backport fixes
This commit is contained in:
commit
ddb1c65c1a
@ -0,0 +1,65 @@
|
|||||||
|
From 6fba61d436ed9d610e1001860e2fcdf2ccf96803 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jernej Skrabec <jernej.skrabec@gmail.com>
|
||||||
|
Date: Sat, 7 Oct 2023 08:36:47 +0200
|
||||||
|
Subject: [PATCH 14/23] media: cedrus: h265: Fix configuring bitstream size
|
||||||
|
|
||||||
|
bit_size field holds size of slice, not slice + header. Because of HW
|
||||||
|
quirks, driver can't program in just slice, but also preceeding header.
|
||||||
|
But that means that currently used bit_size is wrong (too small).
|
||||||
|
Instead, just use size of whole buffer. There is no harm in doing this.
|
||||||
|
|
||||||
|
Fixes: 86caab29da78 ("media: cedrus: Add HEVC/H.265 decoding support")
|
||||||
|
Signed-off-by: Jernej Skrabec <jernej.skrabec@gmail.com>
|
||||||
|
---
|
||||||
|
drivers/staging/media/sunxi/cedrus/cedrus_h265.c | 10 ++++------
|
||||||
|
1 file changed, 4 insertions(+), 6 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_h265.c b/drivers/staging/media/sunxi/cedrus/cedrus_h265.c
|
||||||
|
index fc9297232456..16c822637dc6 100644
|
||||||
|
--- a/drivers/staging/media/sunxi/cedrus/cedrus_h265.c
|
||||||
|
+++ b/drivers/staging/media/sunxi/cedrus/cedrus_h265.c
|
||||||
|
@@ -454,11 +454,11 @@ static int cedrus_h265_setup(struct cedrus_ctx *ctx, struct cedrus_run *run)
|
||||||
|
unsigned int ctb_addr_x, ctb_addr_y;
|
||||||
|
struct cedrus_buffer *cedrus_buf;
|
||||||
|
dma_addr_t src_buf_addr;
|
||||||
|
- dma_addr_t src_buf_end_addr;
|
||||||
|
u32 chroma_log2_weight_denom;
|
||||||
|
u32 num_entry_point_offsets;
|
||||||
|
u32 output_pic_list_index;
|
||||||
|
u32 pic_order_cnt[2];
|
||||||
|
+ size_t slice_bytes;
|
||||||
|
u8 padding;
|
||||||
|
int count;
|
||||||
|
u32 reg;
|
||||||
|
@@ -468,6 +468,7 @@ static int cedrus_h265_setup(struct cedrus_ctx *ctx, struct cedrus_run *run)
|
||||||
|
decode_params = run->h265.decode_params;
|
||||||
|
pred_weight_table = &slice_params->pred_weight_table;
|
||||||
|
num_entry_point_offsets = slice_params->num_entry_point_offsets;
|
||||||
|
+ slice_bytes = vb2_get_plane_payload(&run->src->vb2_buf, 0);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If entry points offsets are present, we should get them
|
||||||
|
@@ -490,7 +491,7 @@ static int cedrus_h265_setup(struct cedrus_ctx *ctx, struct cedrus_run *run)
|
||||||
|
|
||||||
|
cedrus_write(dev, VE_DEC_H265_BITS_OFFSET, 0);
|
||||||
|
|
||||||
|
- reg = slice_params->bit_size;
|
||||||
|
+ reg = slice_bytes * 8;
|
||||||
|
cedrus_write(dev, VE_DEC_H265_BITS_LEN, reg);
|
||||||
|
|
||||||
|
/* Source beginning and end addresses. */
|
||||||
|
@@ -504,10 +505,7 @@ static int cedrus_h265_setup(struct cedrus_ctx *ctx, struct cedrus_run *run)
|
||||||
|
|
||||||
|
cedrus_write(dev, VE_DEC_H265_BITS_ADDR, reg);
|
||||||
|
|
||||||
|
- src_buf_end_addr = src_buf_addr +
|
||||||
|
- DIV_ROUND_UP(slice_params->bit_size, 8);
|
||||||
|
-
|
||||||
|
- reg = VE_DEC_H265_BITS_END_ADDR_BASE(src_buf_end_addr);
|
||||||
|
+ reg = VE_DEC_H265_BITS_END_ADDR_BASE(src_buf_addr + slice_bytes);
|
||||||
|
cedrus_write(dev, VE_DEC_H265_BITS_END_ADDR, reg);
|
||||||
|
|
||||||
|
/* Coding tree block address */
|
||||||
|
--
|
||||||
|
2.42.0
|
||||||
|
|
@ -0,0 +1,150 @@
|
|||||||
|
From 239ce64f28fce7cc035a857bb5ed6f51ad6795c8 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jernej Skrabec <jernej.skrabec@gmail.com>
|
||||||
|
Date: Thu, 19 Oct 2023 19:16:18 +0200
|
||||||
|
Subject: [PATCH] wip: media: sunxi: sun8i-di: fix race condition
|
||||||
|
|
||||||
|
Signed-off-by: Jernej Skrabec <jernej.skrabec@gmail.com>
|
||||||
|
---
|
||||||
|
.../media/platform/sunxi/sun8i-di/sun8i-di.c | 69 ++++++++++---------
|
||||||
|
1 file changed, 35 insertions(+), 34 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/media/platform/sunxi/sun8i-di/sun8i-di.c b/drivers/media/platform/sunxi/sun8i-di/sun8i-di.c
|
||||||
|
index 90ab1d77b6a5..f7ff0937828c 100644
|
||||||
|
--- a/drivers/media/platform/sunxi/sun8i-di/sun8i-di.c
|
||||||
|
+++ b/drivers/media/platform/sunxi/sun8i-di/sun8i-di.c
|
||||||
|
@@ -66,6 +66,7 @@ static void deinterlace_device_run(void *priv)
|
||||||
|
struct vb2_v4l2_buffer *src, *dst;
|
||||||
|
unsigned int hstep, vstep;
|
||||||
|
dma_addr_t addr;
|
||||||
|
+ int i;
|
||||||
|
|
||||||
|
src = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx);
|
||||||
|
dst = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx);
|
||||||
|
@@ -160,6 +161,26 @@ static void deinterlace_device_run(void *priv)
|
||||||
|
deinterlace_write(dev, DEINTERLACE_CH1_HORZ_FACT, hstep);
|
||||||
|
deinterlace_write(dev, DEINTERLACE_CH1_VERT_FACT, vstep);
|
||||||
|
|
||||||
|
+ /* neutral filter coefficients */
|
||||||
|
+ deinterlace_set_bits(dev, DEINTERLACE_FRM_CTRL,
|
||||||
|
+ DEINTERLACE_FRM_CTRL_COEF_ACCESS);
|
||||||
|
+ readl_poll_timeout(dev->base + DEINTERLACE_STATUS, val,
|
||||||
|
+ val & DEINTERLACE_STATUS_COEF_STATUS, 2, 40);
|
||||||
|
+
|
||||||
|
+ for (i = 0; i < 32; i++) {
|
||||||
|
+ deinterlace_write(dev, DEINTERLACE_CH0_HORZ_COEF0 + i * 4,
|
||||||
|
+ DEINTERLACE_IDENTITY_COEF);
|
||||||
|
+ deinterlace_write(dev, DEINTERLACE_CH0_VERT_COEF + i * 4,
|
||||||
|
+ DEINTERLACE_IDENTITY_COEF);
|
||||||
|
+ deinterlace_write(dev, DEINTERLACE_CH1_HORZ_COEF0 + i * 4,
|
||||||
|
+ DEINTERLACE_IDENTITY_COEF);
|
||||||
|
+ deinterlace_write(dev, DEINTERLACE_CH1_VERT_COEF + i * 4,
|
||||||
|
+ DEINTERLACE_IDENTITY_COEF);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ deinterlace_clr_set_bits(dev, DEINTERLACE_FRM_CTRL,
|
||||||
|
+ DEINTERLACE_FRM_CTRL_COEF_ACCESS, 0);
|
||||||
|
+
|
||||||
|
deinterlace_clr_set_bits(dev, DEINTERLACE_FIELD_CTRL,
|
||||||
|
DEINTERLACE_FIELD_CTRL_FIELD_CNT_MSK,
|
||||||
|
DEINTERLACE_FIELD_CTRL_FIELD_CNT(ctx->field));
|
||||||
|
@@ -248,7 +269,6 @@ static irqreturn_t deinterlace_irq(int irq, void *data)
|
||||||
|
static void deinterlace_init(struct deinterlace_dev *dev)
|
||||||
|
{
|
||||||
|
u32 val;
|
||||||
|
- int i;
|
||||||
|
|
||||||
|
deinterlace_write(dev, DEINTERLACE_BYPASS,
|
||||||
|
DEINTERLACE_BYPASS_CSC);
|
||||||
|
@@ -284,27 +304,7 @@ static void deinterlace_init(struct deinterlace_dev *dev)
|
||||||
|
|
||||||
|
deinterlace_clr_set_bits(dev, DEINTERLACE_CHROMA_DIFF,
|
||||||
|
DEINTERLACE_CHROMA_DIFF_TH_MSK,
|
||||||
|
- DEINTERLACE_CHROMA_DIFF_TH(5));
|
||||||
|
-
|
||||||
|
- /* neutral filter coefficients */
|
||||||
|
- deinterlace_set_bits(dev, DEINTERLACE_FRM_CTRL,
|
||||||
|
- DEINTERLACE_FRM_CTRL_COEF_ACCESS);
|
||||||
|
- readl_poll_timeout(dev->base + DEINTERLACE_STATUS, val,
|
||||||
|
- val & DEINTERLACE_STATUS_COEF_STATUS, 2, 40);
|
||||||
|
-
|
||||||
|
- for (i = 0; i < 32; i++) {
|
||||||
|
- deinterlace_write(dev, DEINTERLACE_CH0_HORZ_COEF0 + i * 4,
|
||||||
|
- DEINTERLACE_IDENTITY_COEF);
|
||||||
|
- deinterlace_write(dev, DEINTERLACE_CH0_VERT_COEF + i * 4,
|
||||||
|
- DEINTERLACE_IDENTITY_COEF);
|
||||||
|
- deinterlace_write(dev, DEINTERLACE_CH1_HORZ_COEF0 + i * 4,
|
||||||
|
- DEINTERLACE_IDENTITY_COEF);
|
||||||
|
- deinterlace_write(dev, DEINTERLACE_CH1_VERT_COEF + i * 4,
|
||||||
|
- DEINTERLACE_IDENTITY_COEF);
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- deinterlace_clr_set_bits(dev, DEINTERLACE_FRM_CTRL,
|
||||||
|
- DEINTERLACE_FRM_CTRL_COEF_ACCESS, 0);
|
||||||
|
+ DEINTERLACE_CHROMA_DIFF_TH(31));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline struct deinterlace_ctx *deinterlace_file2ctx(struct file *file)
|
||||||
|
@@ -929,11 +929,18 @@ static int deinterlace_runtime_resume(struct device *device)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ ret = reset_control_deassert(dev->rstc);
|
||||||
|
+ if (ret) {
|
||||||
|
+ dev_err(dev->dev, "Failed to apply reset\n");
|
||||||
|
+
|
||||||
|
+ goto err_exclusive_rate;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
ret = clk_prepare_enable(dev->bus_clk);
|
||||||
|
if (ret) {
|
||||||
|
dev_err(dev->dev, "Failed to enable bus clock\n");
|
||||||
|
|
||||||
|
- goto err_exclusive_rate;
|
||||||
|
+ goto err_rst;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = clk_prepare_enable(dev->mod_clk);
|
||||||
|
@@ -950,23 +957,16 @@ static int deinterlace_runtime_resume(struct device *device)
|
||||||
|
goto err_mod_clk;
|
||||||
|
}
|
||||||
|
|
||||||
|
- ret = reset_control_deassert(dev->rstc);
|
||||||
|
- if (ret) {
|
||||||
|
- dev_err(dev->dev, "Failed to apply reset\n");
|
||||||
|
-
|
||||||
|
- goto err_ram_clk;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
deinterlace_init(dev);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
-err_ram_clk:
|
||||||
|
- clk_disable_unprepare(dev->ram_clk);
|
||||||
|
err_mod_clk:
|
||||||
|
clk_disable_unprepare(dev->mod_clk);
|
||||||
|
err_bus_clk:
|
||||||
|
clk_disable_unprepare(dev->bus_clk);
|
||||||
|
+err_rst:
|
||||||
|
+ reset_control_assert(dev->rstc);
|
||||||
|
err_exclusive_rate:
|
||||||
|
clk_rate_exclusive_put(dev->mod_clk);
|
||||||
|
|
||||||
|
@@ -977,11 +977,12 @@ static int deinterlace_runtime_suspend(struct device *device)
|
||||||
|
{
|
||||||
|
struct deinterlace_dev *dev = dev_get_drvdata(device);
|
||||||
|
|
||||||
|
- reset_control_assert(dev->rstc);
|
||||||
|
-
|
||||||
|
clk_disable_unprepare(dev->ram_clk);
|
||||||
|
clk_disable_unprepare(dev->mod_clk);
|
||||||
|
clk_disable_unprepare(dev->bus_clk);
|
||||||
|
+
|
||||||
|
+ reset_control_assert(dev->rstc);
|
||||||
|
+
|
||||||
|
clk_rate_exclusive_put(dev->mod_clk);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
--
|
||||||
|
2.42.0
|
||||||
|
|
@ -0,0 +1,46 @@
|
|||||||
|
From: Gunjan Gupta <viraniac@gmail.com>
|
||||||
|
Subject: [PATCH 1/1] sunxi: dram: Fix incorrect ram size detection for some H6
|
||||||
|
boards
|
||||||
|
Date: Sun, 1 Oct 2023 21:43:32 +0530
|
||||||
|
|
||||||
|
On some H6 boards like Orange Pi 3 LTS, some times U-Boot fails to detect
|
||||||
|
ram size correctly. Instead of 2GB thats available, it detects 4GB of ram
|
||||||
|
and then SPL just hangs there making board not to boot further.
|
||||||
|
|
||||||
|
On debugging, I found that the rows value were being determined correctly,
|
||||||
|
but columns were sometimes off by one value. I found that adding some
|
||||||
|
delay after the mctl_core_init call along with making use of dsb in the
|
||||||
|
start of the mctl_mem_matches solves the issue.
|
||||||
|
|
||||||
|
Signed-off-by: Gunjan Gupta <viraniac@gmail.com>
|
||||||
|
---
|
||||||
|
|
||||||
|
arch/arm/mach-sunxi/dram_helpers.c | 1 +
|
||||||
|
arch/arm/mach-sunxi/dram_sun50i_h6.c | 2 ++
|
||||||
|
2 files changed, 3 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/arch/arm/mach-sunxi/dram_helpers.c b/arch/arm/mach-sunxi/dram_helpers.c
|
||||||
|
index cdf2750f1c..5758c58e07 100644
|
||||||
|
--- a/arch/arm/mach-sunxi/dram_helpers.c
|
||||||
|
+++ b/arch/arm/mach-sunxi/dram_helpers.c
|
||||||
|
@@ -32,6 +32,7 @@ void mctl_await_completion(u32 *reg, u32 mask, u32 val)
|
||||||
|
#ifndef CONFIG_MACH_SUNIV
|
||||||
|
bool mctl_mem_matches(u32 offset)
|
||||||
|
{
|
||||||
|
+ dsb();
|
||||||
|
/* Try to write different values to RAM at two addresses */
|
||||||
|
writel(0, CFG_SYS_SDRAM_BASE);
|
||||||
|
writel(0xaa55aa55, (ulong)CFG_SYS_SDRAM_BASE + offset);
|
||||||
|
diff --git a/arch/arm/mach-sunxi/dram_sun50i_h6.c b/arch/arm/mach-sunxi/dram_sun50i_h6.c
|
||||||
|
index bff2e42513..a031a845f5 100644
|
||||||
|
--- a/arch/arm/mach-sunxi/dram_sun50i_h6.c
|
||||||
|
+++ b/arch/arm/mach-sunxi/dram_sun50i_h6.c
|
||||||
|
@@ -623,6 +623,8 @@ static void mctl_auto_detect_dram_size(struct dram_para *para)
|
||||||
|
para->cols = 11;
|
||||||
|
mctl_core_init(para);
|
||||||
|
|
||||||
|
+ udelay(50);
|
||||||
|
+
|
||||||
|
for (para->cols = 8; para->cols < 11; para->cols++) {
|
||||||
|
/* 8 bits per byte and 16/32 bit width */
|
||||||
|
if (mctl_mem_matches(1 << (para->cols + 1 +
|
@ -1,40 +0,0 @@
|
|||||||
From: megous@megous.com
|
|
||||||
Date: Mon, 29 Jul 2019 01:39:42 +0200
|
|
||||||
Subject: [U-Boot] [PATCH] Fix unreliable detection of DRAM size on Orange Pi 3
|
|
||||||
|
|
||||||
From: Ondrej Jirman <megous@megous.com>
|
|
||||||
|
|
||||||
Orange Pi 3 has 2 GiB of DRAM, that sometime get misdetected
|
|
||||||
as 4 GiB, due to false negative result from mctl_mem_matches()
|
|
||||||
when detecting number of column address bits. This leads to
|
|
||||||
u-boot detecting more address bits than there are and the
|
|
||||||
boot process hangs shortly after.
|
|
||||||
|
|
||||||
In mctl_mem_matches() we need to wait for each write to finish,
|
|
||||||
separately. Without this, the check is not reliable for some
|
|
||||||
unknown reason, probably having to do with unpredictable memory
|
|
||||||
access ordering.
|
|
||||||
|
|
||||||
Patch was made with help from André Przywara, who noticed that
|
|
||||||
my original idea about detection failing due to read-back from
|
|
||||||
cache without involving DRAM was false, because data cache is
|
|
||||||
still of at the time of the DRAM size autodetection.
|
|
||||||
|
|
||||||
Signed-off-by: Ondrej Jirman <megous@megous.com>
|
|
||||||
Cc: André Przywara <andre.przywara@arm.com>
|
|
||||||
---
|
|
||||||
arch/arm/mach-sunxi/dram_helpers.c | 1 +
|
|
||||||
1 file changed, 1 insertion(+)
|
|
||||||
|
|
||||||
diff --git a/arch/arm/mach-sunxi/dram_helpers.c b/arch/arm/mach-sunxi/dram_helpers.c
|
|
||||||
index 239ab421a8..6dba448638 100644
|
|
||||||
--- a/arch/arm/mach-sunxi/dram_helpers.c
|
|
||||||
+++ b/arch/arm/mach-sunxi/dram_helpers.c
|
|
||||||
@@ -30,6 +30,7 @@ bool mctl_mem_matches(u32 offset)
|
|
||||||
{
|
|
||||||
/* Try to write different values to RAM at two addresses */
|
|
||||||
writel(0, CONFIG_SYS_SDRAM_BASE);
|
|
||||||
+ dsb();
|
|
||||||
writel(0xaa55aa55, (ulong)CONFIG_SYS_SDRAM_BASE + offset);
|
|
||||||
dsb();
|
|
||||||
/* Check if the same value is actually observed when reading back */
|
|
Loading…
x
Reference in New Issue
Block a user