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

Commit a980f0f3 authored by Pankaj Gupta's avatar Pankaj Gupta
Browse files

msm: kgsl: Move gmu_init from gmu_start to adreno_init



When request_firmware for gmu_fw fails, we set kgsl state to
KGSL_STATE_RESET. During this process gmu_fw_start gets called
and it tries to load gmu fw resulting in null pointer access.

Moving gmu_init() from gmu_start() to adreno_init(). This will
avoid unnecessary state changes when request_firmware for
gmu_fw fails.

Change-Id: I8d4e9f8b4c8a38c7303d4c71f3e4d47a6b110056
Signed-off-by: default avatarPankaj Gupta <gpankaj@codeaurora.org>
parent 692654ff
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -1715,6 +1715,10 @@ static int adreno_init(struct kgsl_device *device)
	if (ret)
		return ret;

	ret = gmu_core_init(device);
	if (ret)
		return ret;

	/* Put the GPU in a responsive state */
	if (ADRENO_GPUREV(adreno_dev) < 600) {
		/* No need for newer generation architectures */
+1 −3
Original line number Diff line number Diff line
@@ -1569,9 +1569,6 @@ static int gmu_start(struct kgsl_device *device)
	case KGSL_STATE_INIT:
		gmu_aop_send_acd_state(device, test_bit(ADRENO_ACD_CTRL,
					&adreno_dev->pwrctrl_flag));
		ret = gmu_init(device);
		if (ret)
			return ret;
	case KGSL_STATE_SUSPEND:
		WARN_ON(test_bit(GMU_CLK_ON, &device->gmu_core.flags));

@@ -1770,6 +1767,7 @@ static bool gmu_regulator_isenabled(struct kgsl_device *device)
struct gmu_core_ops gmu_ops = {
	.probe = gmu_probe,
	.remove = gmu_remove,
	.init = gmu_init,
	.start = gmu_start,
	.stop = gmu_stop,
	.dcvs_set = gmu_dcvs_set,
+10 −0
Original line number Diff line number Diff line
@@ -111,6 +111,16 @@ bool gmu_core_scales_bandwidth(struct kgsl_device *device)
	}
}

int gmu_core_init(struct kgsl_device *device)
{
	struct gmu_core_ops *gmu_core_ops = GMU_CORE_OPS(device);

	if (gmu_core_ops && gmu_core_ops->init)
		return gmu_core_ops->init(device);

	return 0;
}

int gmu_core_start(struct kgsl_device *device)
{
	struct gmu_core_ops *gmu_core_ops = GMU_CORE_OPS(device);
+2 −0
Original line number Diff line number Diff line
@@ -115,6 +115,7 @@ struct gmu_core_ops {
	void (*remove)(struct kgsl_device *device);
	int (*dcvs_set)(struct kgsl_device *device,
			unsigned int gpu_pwrlevel, unsigned int bus_level);
	int (*init)(struct kgsl_device *device);
	int (*start)(struct kgsl_device *device);
	void (*stop)(struct kgsl_device *device);
	void (*snapshot)(struct kgsl_device *device);
@@ -178,6 +179,7 @@ extern struct gmu_core_ops rgmu_ops;
/* GMU core functions */
int gmu_core_probe(struct kgsl_device *device);
void gmu_core_remove(struct kgsl_device *device);
int gmu_core_init(struct kgsl_device *device);
int gmu_core_start(struct kgsl_device *device);
void gmu_core_stop(struct kgsl_device *device);
int gmu_core_suspend(struct kgsl_device *device);