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

Commit d59cbe75 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

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

parents fa607ace 125aef8b
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);