diff --git a/linux-5.10/hispark_taurus_patch/hispark_taurus.patch b/linux-5.10/hispark_taurus_patch/hispark_taurus.patch index d3f4cae53105ddbe259a3cc5e501a7424c7ed943..ee62455baf69781c97734ec96dfa50627636f62a 100755 --- a/linux-5.10/hispark_taurus_patch/hispark_taurus.patch +++ b/linux-5.10/hispark_taurus_patch/hispark_taurus.patch @@ -25241,10 +25241,11 @@ diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c index 94caee49d..c69c59dcb 100644 --- a/drivers/mmc/core/block.c +++ b/drivers/mmc/core/block.c -@@ -538,17 +538,15 @@ static int __mmc_blk_ioctl_cmd(struct mmc_card *card, struct mmc_blk_data *md, +@@ -537,18 +537,16 @@ static int __mmc_blk_ioctl_cmd(struct mmc_card *card, struct mmc_blk_data *md, + return err; } - if (idata->rpmb) { +- if (idata->rpmb || prev_idata) { - sbc.opcode = MMC_SET_BLOCK_COUNT; - /* - * We don't do any blockcount validation because the max size @@ -25256,6 +25257,7 @@ index 94caee49d..c69c59dcb 100644 - sbc.arg = prev_idata->ic.arg; - sbc.flags = MMC_RSP_R1 | MMC_CMD_AC; - mrq.sbc = &sbc; ++ if (idata->rpmb) { + struct mmc_command mmc_cmd = {}; + mmc_cmd.opcode = MMC_SET_BLOCK_COUNT; + mmc_cmd.arg = data.blocks & 0x0000FFFF; diff --git a/linux-5.10/rk3568_patch/kernel.patch b/linux-5.10/rk3568_patch/kernel.patch index afd3e8408dff518dec27c987816643838a04ed4a..85c0bea7825b5d67058e582398d2d90738deaf68 100755 --- a/linux-5.10/rk3568_patch/kernel.patch +++ b/linux-5.10/rk3568_patch/kernel.patch @@ -128809,12 +128809,11 @@ index 9a88faaf8b27..9fd6a82f79d6 100644 data->regs = devm_platform_ioremap_resource(pdev, 0); if (IS_ERR(data->regs)) -@@ -202,23 +592,100 @@ static int rockchip_dfi_probe(struct platform_device *pdev) - if (IS_ERR(data->regmap_pmu)) - return PTR_ERR(data->regmap_pmu); - } +@@ -203,23 +593,99 @@ static int rockchip_dfi_probe(struct platform_device *pdev) + if (IS_ERR(data->regmap_pmu)) + return PTR_ERR(data->regmap_pmu); + - data->dev = dev; -+ + regmap_read(data->regmap_pmu, PMUGRF_OS_REG2, &val); + data->dram_type = READ_DRAMTYPE_INFO(val); + data->ch_msk = READ_CH_INFO(val); @@ -611045,7 +611044,7 @@ index af98bfcde518..b80ef0c6dc53 100644 }; static int vop_crtc_enable_vblank(struct drm_crtc *crtc) -@@ -1120,276 +2483,1510 @@ static int vop_crtc_enable_vblank(struct drm_crtc *crtc) +@@ -1120,8 +2483,13 @@ static int vop_crtc_enable_vblank(struct drm_crtc *crtc) spin_lock_irqsave(&vop->irq_lock, flags); @@ -611058,15 +611057,14 @@ index af98bfcde518..b80ef0c6dc53 100644 + VOP_INTR_SET_TYPE(vop, clear, FS_INTR, 1); + VOP_INTR_SET_TYPE(vop, enable, FS_INTR, 1); + } -+ -+ spin_unlock_irqrestore(&vop->irq_lock, flags); -+ -+ return 0; -+} -+ -+static void vop_crtc_disable_vblank(struct drm_crtc *crtc) -+{ -+ struct vop *vop = to_vop(crtc); + + spin_unlock_irqrestore(&vop->irq_lock, flags); + +@@ -1131,265 +2499,1494 @@ static int vop_crtc_enable_vblank(struct drm_crtc *crtc) + static void vop_crtc_disable_vblank(struct drm_crtc *crtc) + { + struct vop *vop = to_vop(crtc); +- unsigned long flags; + unsigned long flags; + + if (WARN_ON(!vop->is_enabled)) @@ -611078,8 +611076,8 @@ index af98bfcde518..b80ef0c6dc53 100644 + VOP_INTR_SET_TYPE(vop, enable, FS_FIELD_INTR, 0); + else + VOP_INTR_SET_TYPE(vop, enable, FS_INTR, 0); - - spin_unlock_irqrestore(&vop->irq_lock, flags); ++ ++ spin_unlock_irqrestore(&vop->irq_lock, flags); +} + +static void vop_crtc_cancel_pending_vblank(struct drm_crtc *crtc, @@ -612172,19 +612170,17 @@ index af98bfcde518..b80ef0c6dc53 100644 + s->afbdc_win_ptr = plane_state->yrgb_mst; + s->afbdc_en = 1; + } - - return 0; - } - --static void vop_crtc_disable_vblank(struct drm_crtc *crtc) ++ ++ return 0; ++} ++ +static void vop_dclk_source_generate(struct drm_crtc *crtc, + struct drm_crtc_state *crtc_state) - { ++{ + struct rockchip_drm_private *private = crtc->dev->dev_private; + struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc_state); + struct rockchip_crtc_state *old_s = to_rockchip_crtc_state(crtc->state); - struct vop *vop = to_vop(crtc); -- unsigned long flags; ++ struct vop *vop = to_vop(crtc); + struct rockchip_dclk_pll *old_pll = vop->pll; - if (WARN_ON(!vop->is_enabled)) @@ -612303,10 +612299,16 @@ index af98bfcde518..b80ef0c6dc53 100644 + + if (!win_data->phy) + continue; -+ + +- for (i = 0; i < crtc->gamma_size; i++) { +- u32 word; + for (j = 0; j < vop->num_wins; j++) { + win = &vop->win[j]; -+ + +- word = (drm_color_lut_extract(lut[i].red, 10) << 20) | +- (drm_color_lut_extract(lut[i].green, 10) << 10) | +- drm_color_lut_extract(lut[i].blue, 10); +- writel(word, vop->lut_regs + i * 4); + if (win->win_id == i && !win->area_id) + break; + } @@ -612314,9 +612316,7 @@ index af98bfcde518..b80ef0c6dc53 100644 + ret = -EINVAL; + goto err_free_pzpos; + } - -- for (i = 0; i < crtc->gamma_size; i++) { -- u32 word; ++ + plane = &win->base; + pstate = state->planes[drm_plane_index(plane)].state; + /* @@ -612326,11 +612326,7 @@ index af98bfcde518..b80ef0c6dc53 100644 + if (!pstate) + pstate = plane->state; + plane_state = to_vop_plane_state(pstate); - -- word = (drm_color_lut_extract(lut[i].red, 10) << 20) | -- (drm_color_lut_extract(lut[i].green, 10) << 10) | -- drm_color_lut_extract(lut[i].blue, 10); -- writel(word, vop->lut_regs + i * 4); ++ + if (!pstate->visible) + pzpos[cnt].zpos = INT_MAX; + else @@ -612696,12 +612692,7 @@ index af98bfcde518..b80ef0c6dc53 100644 + VOP_CTRL_SET(vop, auto_gate_en, 0); + VOP_CTRL_SET(vop, bcsh_en, s->bcsh_en); +} - -- VOP_REG_SET(vop, modeset, htotal_pw, (htotal << 16) | hsync_len); -- val = hact_st << 16; -- val |= hact_end; -- VOP_REG_SET(vop, modeset, hact_st_end, val); -- VOP_REG_SET(vop, modeset, hpost_st_end, val); ++ +static void vop_cfg_update(struct drm_crtc *crtc, + struct drm_crtc_state *old_crtc_state) +{ @@ -612710,24 +612701,29 @@ index af98bfcde518..b80ef0c6dc53 100644 + struct vop *vop = to_vop(crtc); + const struct vop_data *vop_data = vop->data; +- VOP_REG_SET(vop, modeset, htotal_pw, (htotal << 16) | hsync_len); +- val = hact_st << 16; +- val |= hact_end; +- VOP_REG_SET(vop, modeset, hact_st_end, val); +- VOP_REG_SET(vop, modeset, hpost_st_end, val); ++ spin_lock(&vop->reg_lock); + - VOP_REG_SET(vop, modeset, vtotal_pw, (vtotal << 16) | vsync_len); - val = vact_st << 16; - val |= vact_end; - VOP_REG_SET(vop, modeset, vact_st_end, val); - VOP_REG_SET(vop, modeset, vpost_st_end, val); -+ spin_lock(&vop->reg_lock); ++ vop_update_csc(crtc); - VOP_REG_SET(vop, intr, line_flag_num[0], vact_end); -+ vop_update_csc(crtc); ++ vop_tv_config_update(crtc, old_crtc_state); - clk_set_rate(vop->dclk, adjusted_mode->clock * 1000); -+ vop_tv_config_update(crtc, old_crtc_state); ++ if (s->afbdc_en) { ++ u32 pic_size, pic_offset; - VOP_REG_SET(vop, common, standby, 0); - mutex_unlock(&vop->vop_lock); -+ if (s->afbdc_en) { -+ u32 pic_size, pic_offset; -+ + VOP_CTRL_SET(vop, afbdc_format, s->afbdc_win_format | 1 << 4); + VOP_CTRL_SET(vop, afbdc_hreg_block_split, 0); + VOP_CTRL_SET(vop, afbdc_sel, s->afbdc_win_id); @@ -612908,7 +612904,7 @@ index af98bfcde518..b80ef0c6dc53 100644 .atomic_flush = vop_crtc_atomic_flush, .atomic_enable = vop_crtc_atomic_enable, .atomic_disable = vop_crtc_atomic_disable, -@@ -1526,14 +4116,36 @@ static void vop_crtc_destroy(struct drm_crtc *crtc) +@@ -1526,15 +4116,36 @@ static void vop_crtc_destroy(struct drm_crtc *crtc) drm_crtc_cleanup(crtc); } @@ -612941,13 +612937,14 @@ index af98bfcde518..b80ef0c6dc53 100644 if (WARN_ON(!crtc->state)) return NULL; -- rockchip_state = kzalloc(sizeof(*rockchip_state), GFP_KERNEL); +- rockchip_state = kmemdup(to_rockchip_crtc_state(crtc->state), +- sizeof(*rockchip_state), GFP_KERNEL); + old_state = to_rockchip_crtc_state(crtc->state); + rockchip_state = kmemdup(old_state, sizeof(*old_state), GFP_KERNEL); if (!rockchip_state) return NULL; -@@ -1550,17 +4162,6 @@ static void vop_crtc_destroy_state(struct drm_crtc *crtc, +@@ -1551,20 +4162,6 @@ static void vop_crtc_destroy_state(struct drm_crtc *crtc, kfree(s); } @@ -612959,13 +612956,16 @@ index af98bfcde518..b80ef0c6dc53 100644 - if (crtc->state) - vop_crtc_destroy_state(crtc, crtc->state); - -- __drm_atomic_helper_crtc_reset(crtc, &crtc_state->base); +- if (crtc_state) +- __drm_atomic_helper_crtc_reset(crtc, &crtc_state->base); +- else +- __drm_atomic_helper_crtc_reset(crtc, NULL); -} - #ifdef CONFIG_DRM_ANALOGIX_DP static struct drm_connector *vop_get_edp_connector(struct vop *vop) { -@@ -1624,20 +4225,118 @@ vop_crtc_verify_crc_source(struct drm_crtc *crtc, const char *source_name, +@@ -1628,20 +4225,118 @@ vop_crtc_verify_crc_source(struct drm_crtc *crtc, const char *source_name, { return -ENODEV; } @@ -613086,7 +613086,7 @@ index af98bfcde518..b80ef0c6dc53 100644 }; static void vop_fb_unref_worker(struct drm_flip_work *work, void *val) -@@ -1645,22 +4344,23 @@ static void vop_fb_unref_worker(struct drm_flip_work *work, void *val) +@@ -1649,22 +4344,23 @@ static void vop_fb_unref_worker(struct drm_flip_work *work, void *val) struct vop *vop = container_of(work, struct vop, fb_unref_work); struct drm_framebuffer *fb = val; @@ -613114,7 +613114,7 @@ index af98bfcde518..b80ef0c6dc53 100644 if (test_and_clear_bit(VOP_PENDING_FB_UNREF, &vop->pending)) drm_flip_work_commit(&vop->fb_unref_work, system_unbound_wq); -@@ -1669,8 +4369,9 @@ static void vop_handle_vblank(struct vop *vop) +@@ -1673,8 +4369,9 @@ static void vop_handle_vblank(struct vop *vop) static irqreturn_t vop_isr(int irq, void *data) { struct vop *vop = data; @@ -613125,7 +613125,7 @@ index af98bfcde518..b80ef0c6dc53 100644 int ret = IRQ_NONE; /* -@@ -1689,14 +4390,14 @@ static irqreturn_t vop_isr(int irq, void *data) +@@ -1693,14 +4390,14 @@ static irqreturn_t vop_isr(int irq, void *data) * interrupt register has interrupt status, enable and clear bits, we * must hold irq_lock to avoid a race with enable/disable_vblank(). */ @@ -613142,7 +613142,7 @@ index af98bfcde518..b80ef0c6dc53 100644 /* This is expected for vop iommu irqs, since the irq is shared */ if (!active_irqs) -@@ -1714,17 +4415,42 @@ static irqreturn_t vop_isr(int irq, void *data) +@@ -1718,17 +4415,42 @@ static irqreturn_t vop_isr(int irq, void *data) ret = IRQ_HANDLED; } @@ -613189,7 +613189,7 @@ index af98bfcde518..b80ef0c6dc53 100644 out_disable: vop_core_clks_disable(vop); -@@ -1733,27 +4459,230 @@ static irqreturn_t vop_isr(int irq, void *data) +@@ -1737,27 +4459,230 @@ static irqreturn_t vop_isr(int irq, void *data) return ret; } @@ -613427,7 +613427,7 @@ index af98bfcde518..b80ef0c6dc53 100644 int i; /* -@@ -1761,29 +4690,20 @@ static int vop_create_crtc(struct vop *vop) +@@ -1765,29 +4690,20 @@ static int vop_create_crtc(struct vop *vop) * to pass them to drm_crtc_init_with_planes, which sets the * "possible_crtcs" to the newly initialized crtc. */ @@ -613464,7 +613464,7 @@ index af98bfcde518..b80ef0c6dc53 100644 if (plane->type == DRM_PLANE_TYPE_PRIMARY) primary = plane; else if (plane->type == DRM_PLANE_TYPE_CURSOR) -@@ -1796,37 +4716,24 @@ static int vop_create_crtc(struct vop *vop) +@@ -1800,37 +4716,24 @@ static int vop_create_crtc(struct vop *vop) goto err_cleanup_planes; drm_crtc_helper_add(crtc, &vop_crtc_helper_funcs); @@ -613508,7 +613508,7 @@ index af98bfcde518..b80ef0c6dc53 100644 } port = of_get_child_by_name(dev->of_node, "port"); -@@ -1843,15 +4750,64 @@ static int vop_create_crtc(struct vop *vop) +@@ -1847,15 +4750,64 @@ static int vop_create_crtc(struct vop *vop) init_completion(&vop->dsp_hold_completion); init_completion(&vop->line_flag_completion); crtc->port = port; @@ -613576,7 +613576,7 @@ index af98bfcde518..b80ef0c6dc53 100644 err_cleanup_crtc: drm_crtc_cleanup(crtc); err_cleanup_planes: -@@ -1863,7 +4819,7 @@ static int vop_create_crtc(struct vop *vop) +@@ -1867,7 +4819,7 @@ static int vop_create_crtc(struct vop *vop) static void vop_destroy_crtc(struct vop *vop) { @@ -613585,7 +613585,7 @@ index af98bfcde518..b80ef0c6dc53 100644 struct drm_device *drm_dev = vop->drm_dev; struct drm_plane *plane, *tmp; -@@ -1891,187 +4847,129 @@ static void vop_destroy_crtc(struct vop *vop) +@@ -1895,187 +4847,129 @@ static void vop_destroy_crtc(struct vop *vop) drm_flip_work_cleanup(&vop->fb_unref_work); } @@ -613869,7 +613869,7 @@ index af98bfcde518..b80ef0c6dc53 100644 static int vop_bind(struct device *dev, struct device *master, void *data) { -@@ -2080,46 +4978,97 @@ static int vop_bind(struct device *dev, struct device *master, void *data) +@@ -2084,46 +4978,97 @@ static int vop_bind(struct device *dev, struct device *master, void *data) struct drm_device *drm_dev = data; struct vop *vop; struct resource *res; @@ -613980,7 +613980,7 @@ index af98bfcde518..b80ef0c6dc53 100644 irq = platform_get_irq(pdev, 0); if (irq < 0) { DRM_DEV_ERROR(dev, "cannot find irq for vop\n"); -@@ -2131,53 +5080,51 @@ static int vop_bind(struct device *dev, struct device *master, void *data) +@@ -2135,53 +5080,51 @@ static int vop_bind(struct device *dev, struct device *master, void *data) spin_lock_init(&vop->irq_lock); mutex_init(&vop->vop_lock);