Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 125aef8b authored by Xiaoming Zhou's avatar Xiaoming Zhou
Browse files

msm: mdss: reserve memory for splash screen on 8x10



Earlier, display driver was allocating the memory for
splash screen feature.   The splash image was copied
to the allocated memory during LK to kernel transition.
Now, instead of allocating and copying, display driver
reserves the splash screen memory until the first display
update.

Change-Id: Ie5f0aa17dceaa826eddab1e5b4b705a3ea287a1a
Signed-off-by: default avatarXiaoming Zhou <zhoux@codeaurora.org>
parent 4f7e2151
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@
		mdss_fb0: qcom,mdss_fb_primary {
			cell-index = <0>;
			compatible = "qcom,mdss-fb";
			qcom,memblock-reserve = <0xf800000 0x800000>;
		};
	};

+43 −6
Original line number Diff line number Diff line
@@ -35,6 +35,8 @@
#include <linux/file.h>
#include <linux/msm_kgsl.h>
#include <linux/major.h>
#include <linux/bootmem.h>
#include <linux/memblock.h>

#include <mach/board.h>
#include <mach/clk.h>
@@ -1064,6 +1066,45 @@ void mdp3_free(void)
	}
}

int mdp3_parse_dt_splash(struct msm_fb_data_type *mfd)
{
	struct platform_device *pdev = mfd->pdev;
	int rc;
	u32 offsets[2];

	rc = of_property_read_u32_array(pdev->dev.of_node,
				"qcom,memblock-reserve", offsets, 2);

	if (rc) {
		pr_err("fail to get memblock-reserve property\n");
		return rc;
	}

	if (mdp3_res->splash_mem_addr != offsets[0])
		rc = -EINVAL;

	mdp3_res->splash_mem_addr = offsets[0];
	mdp3_res->splash_mem_size = offsets[1];

	pr_debug("memaddr=%x size=%x\n", mdp3_res->splash_mem_addr,
		mdp3_res->splash_mem_size);

	return rc;
}

void mdp3_release_splash_memory(void)
{
	/* Give back the reserved memory to the system */
	if (mdp3_res->splash_mem_addr) {
		pr_debug("mdp3_release_splash_memory\n");
		memblock_free(mdp3_res->splash_mem_addr,
				mdp3_res->splash_mem_size);
		free_bootmem_late(mdp3_res->splash_mem_addr,
				mdp3_res->splash_mem_size);
		mdp3_res->splash_mem_addr = 0;
	}
}

struct mdp3_dma *mdp3_get_dma_pipe(int capability)
{
	int i;
@@ -1154,6 +1195,8 @@ static int mdp3_is_display_on(struct mdss_panel_data *pdata)
		rc = (status == 0x080000);
	}

	mdp3_res->splash_mem_addr = MDP3_REG_READ(MDP3_REG_DMA_S_IBUF_ADDR);

	mdp3_clk_update(MDP3_CLK_AHB, 0);
	mdp3_clk_update(MDP3_CLK_CORE, 0);
	return rc;
@@ -1187,12 +1230,6 @@ static int mdp3_continuous_splash_on(struct mdss_panel_data *pdata)
		goto splash_on_err;
	}

	rc = mdp3_continuous_splash_copy(pdata);
	if (rc) {
		pr_err("fail to copy continuous splash image\n");
		goto splash_on_err;
	}

	mdp3_irq_register();

	if (pdata->event_handler) {
+5 −0
Original line number Diff line number Diff line
@@ -122,6 +122,9 @@ struct mdp3_hw_resource {
	u32 irq_mask;
	struct mdp3_intr_cb callbacks[MDP3_MAX_INTR];
	int irq_registered;

	u32 splash_mem_addr;
	u32 splash_mem_size;
};

struct mdp3_img_data {
@@ -152,6 +155,8 @@ int mdp3_iommu_enable(int client);
int mdp3_iommu_disable(int client);
int mdp3_iommu_is_attached(int client);
void mdp3_free(void);
int mdp3_parse_dt_splash(struct msm_fb_data_type *mfd);
void mdp3_release_splash_memory(void);

#define MDP3_REG_WRITE(addr, val) writel_relaxed(val, mdp3_res->mdp_base + addr)
#define MDP3_REG_READ(addr) readl_relaxed(mdp3_res->mdp_base + addr)
+13 −3
Original line number Diff line number Diff line
@@ -682,8 +682,8 @@ static int mdp3_ctrl_display_commit_kickoff(struct msm_fb_data_type *mfd)
		pr_debug("continuous splash screen, IOMMU not attached\n");
		mdp3_ctrl_off(mfd);
		mdp3_ctrl_on(mfd);
		mdp3_free();
	}
	mdp3_release_splash_memory();

	mutex_lock(&mdp3_session->lock);

@@ -1275,8 +1275,13 @@ int mdp3_ctrl_init(struct msm_fb_data_type *mfd)
	struct mdp3_session_data *mdp3_session = NULL;
	u32 intf_type = MDP3_DMA_OUTPUT_SEL_DSI_VIDEO;
	int rc;
	int splash_mismatch = 0;

	pr_info("mdp3_ctrl_init\n");
	rc = mdp3_parse_dt_splash(mfd);
	if (rc)
		splash_mismatch = 1;

	pr_debug("mdp3_ctrl_init\n");
	mdp3_interface->on_fnc = mdp3_ctrl_on;
	mdp3_interface->off_fnc = mdp3_ctrl_off;
	mdp3_interface->do_histogram = NULL;
@@ -1321,7 +1326,7 @@ int mdp3_ctrl_init(struct msm_fb_data_type *mfd)
	mdp3_session->dma->output_config.out_sel = intf_type;
	mdp3_session->mfd = mfd;
	mdp3_session->panel = dev_get_platdata(&mfd->pdev->dev);
	mdp3_session->status = 0;
	mdp3_session->status = mdp3_session->intf->active;
	mdp3_session->overlay.id = MSMFB_NEW_REQUEST;
	mdp3_bufq_init(&mdp3_session->bufq_in);
	mdp3_bufq_init(&mdp3_session->bufq_out);
@@ -1351,6 +1356,11 @@ int mdp3_ctrl_init(struct msm_fb_data_type *mfd)
	kobject_uevent(&dev->kobj, KOBJ_ADD);
	pr_debug("vsync kobject_uevent(KOBJ_ADD)\n");

	if (splash_mismatch) {
		pr_err("splash memory mismatch, stop splash\n");
		mdp3_ctrl_off(mfd);
	}

init_done:
	if (IS_ERR_VALUE(rc))
		kfree(mdp3_session);