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

Commit 113bedd5 authored by Carter Cooper's avatar Carter Cooper
Browse files

msm: kgsl: Read the GMU firmware information once



Only read the GMU and HFI version information once. Once it is
read, subsequent starts will always use the same value. So store
the values locally and don't waste time reading them again.

Change-Id: Id2b5788342a502b2bdead0bbaaf957c420e9d608
Signed-off-by: default avatarCarter Cooper <ccooper@codeaurora.org>
parent 6703dbe7
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -1126,6 +1126,10 @@ int gmu_probe(struct kgsl_device *device)
	struct adreno_device *adreno_dev = ADRENO_DEVICE(device);
	int i = 0, ret = -ENXIO;

	/* Make sure no flags enabled by default, probably don't need */
	gmu->flags = 0;
	gmu->ver = ~0U;

	node = of_find_compatible_node(device->pdev->dev.of_node,
			NULL, "qcom,gpu-gmu");

+22 −8
Original line number Diff line number Diff line
@@ -31,6 +31,12 @@
#define MSG_HDR_GET_TYPE(hdr) (((hdr) >> 16) & 0xF)
#define MSG_HDR_GET_SEQNUM(hdr) (((hdr) >> 20) & 0xFFF)

#define HFI_VER_MAJOR(hfi) (((hfi)->version >> 28) & 0xF)
#define HFI_VER_MINOR(hfi) (((hfi)->version >> 5) & 0x3FFFFF)
#define HFI_VER_BRANCH(hfi) ((hfi)->version & 0x1F)
#define HFI_VERSION(major, minor, branch) \
	(((major) << 28) | (((minor) & 0x8FFFFF) << 5) | ((branch) & 0x1F))

/* Size in below functions are in unit of dwords */
static int hfi_queue_read(struct gmu_device *gmu, uint32_t queue_idx,
		void *data, unsigned int max_size)
@@ -560,9 +566,9 @@ void hfi_receiver(unsigned long data)
	};
}

#define FW_VER_MAJOR(ver) (((ver) >> 28) & 0xF)
#define FW_VER_MINOR(ver) (((ver) >> 16) & 0xFFF)
#define FW_VERSION(major, minor) \
#define GMU_VER_MAJOR(ver) (((ver) >> 28) & 0xF)
#define GMU_VER_MINOR(ver) (((ver) >> 16) & 0xFFF)
#define GMU_VERSION(major, minor) \
	((((major) & 0xF) << 28) | (((minor) & 0xFFF) << 16))

static int hfi_verify_fw_version(struct gmu_device *gmu)
@@ -572,10 +578,14 @@ static int hfi_verify_fw_version(struct gmu_device *gmu)
	int result;
	unsigned int ver = 0, major, minor;

	/* GMU version is already known, so don't waste time finding again */
	if (gmu->ver != ~0U)
		return 0;

	major = adreno_dev->gpucore->gpmu_major;
	minor = adreno_dev->gpucore->gpmu_minor;

	result = hfi_get_fw_version(gmu, FW_VERSION(major, minor), &ver);
	result = hfi_get_fw_version(gmu, GMU_VERSION(major, minor), &ver);
	if (result) {
		dev_err_once(&gmu->pdev->dev,
				"Failed to get FW version via HFI\n");
@@ -583,19 +593,23 @@ static int hfi_verify_fw_version(struct gmu_device *gmu)
	}

	/* For now, warn once. Could return error later if needed */
	if (major != FW_VER_MAJOR(ver))
	if (major != GMU_VER_MAJOR(ver))
		dev_err_once(&gmu->pdev->dev,
				"FW Major Error: Wanted %d, got %d\n",
				major, FW_VER_MAJOR(ver));
				major, GMU_VER_MAJOR(ver));

	if (minor > FW_VER_MINOR(ver))
	if (minor > GMU_VER_MINOR(ver))
		dev_err_once(&gmu->pdev->dev,
				"FW Minor Error: Wanted < %d, got %d\n",
				FW_VER_MINOR(ver), minor);
				GMU_VER_MINOR(ver), minor);

	/* Save the gmu version information */
	gmu->ver = ver;

	/* Read the HFI version from the register */
	adreno_read_gmureg(adreno_dev,
		ADRENO_REG_GMU_HFI_VERSION_INFO, &gmu->hfi.version);

	return 0;
}

+2 −2
Original line number Diff line number Diff line
@@ -290,7 +290,7 @@ struct pending_msg {
 * @msglist: outstanding command message list. Each message in the list
 *	is waiting for ACK from GMU
 * @tasklet: the thread handling received messages from GMU
 * @fw_version: FW version number provided by GMU
 * @version: HFI version number provided
 * @seqnum: atomic counter that is incremented for each message sent. The
 *	value of the counter is used as sequence number for HFI message
 */
@@ -300,7 +300,7 @@ struct kgsl_hfi {
	struct mutex cmdq_mutex;
	struct list_head msglist;
	struct tasklet_struct tasklet;
	uint32_t fw_version;
	uint32_t version;
	atomic_t seqnum;
	bool gmu_init_done;
};