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

Commit 1b5db31d authored by Yulian Shandorov's avatar Yulian Shandorov
Browse files

msm: Add nodes in socinfo, to store APPS image version in SMEM



- Nodes for image_version, image_crm_version and image_variant updated in
order to store APPS image version.
- We get this info from userspace and pass it to SMEM.
- UGO write access added to select_image node, in order DIAG daemon
to be able to change it from userspace.

Change-Id: I9792aed3a74c4ba156b1b387d3ff38a1c5a13088
Signed-off-by: default avatarYulian Shandorov <jshandorov@codeaurora.org>
parent 4bf0ed1a
Loading
Loading
Loading
Loading
+98 −17
Original line number Original line Diff line number Diff line
@@ -42,6 +42,7 @@
#define SMEM_IMAGE_VERSION_VARIANT_OFFSET 75
#define SMEM_IMAGE_VERSION_VARIANT_OFFSET 75
#define SMEM_IMAGE_VERSION_OEM_SIZE 32
#define SMEM_IMAGE_VERSION_OEM_SIZE 32
#define SMEM_IMAGE_VERSION_OEM_OFFSET 96
#define SMEM_IMAGE_VERSION_OEM_OFFSET 96
#define SMEM_IMAGE_VERSION_PARTITION_APPS 10


enum {
enum {
	HW_PLATFORM_UNKNOWN = 0,
	HW_PLATFORM_UNKNOWN = 0,
@@ -660,23 +661,28 @@ msm_get_image_version(struct device *dev,
	}
	}
	string_address += current_image * SMEM_IMAGE_VERSION_SINGLE_BLOCK_SIZE;
	string_address += current_image * SMEM_IMAGE_VERSION_SINGLE_BLOCK_SIZE;
	string_address += SMEM_IMAGE_VERSION_NAME_OFFSET;
	string_address += SMEM_IMAGE_VERSION_NAME_OFFSET;
	return snprintf(buf, SMEM_IMAGE_VERSION_NAME_SIZE, "%-.75s",
	return snprintf(buf, SMEM_IMAGE_VERSION_NAME_SIZE, "%-.72s\n",
			string_address);
			string_address);
}
}


static ssize_t
static ssize_t
msm_store_image_type(struct device *dev, struct device_attribute *attr,
msm_set_image_version(struct device *dev,
			const char *buf, size_t count)
			struct device_attribute *attr,
			const char *buf,
			size_t count)
{
{
	int ret, digit;
	char *store_address;


	ret = kstrtoint(buf, 10, &digit);
	if (current_image != SMEM_IMAGE_VERSION_PARTITION_APPS)
	if (ret)
		return count;
		return ret;
	store_address = socinfo_get_image_version_base_address();
	if (0 <= digit && digit < SMEM_IMAGE_VERSION_BLOCKS_COUNT)
	if (store_address == NULL) {
		current_image = digit;
		pr_err("%s : Failed to get image version base address",
	else
				__func__);
		current_image = 0;
		return count;
	}
	store_address += current_image * SMEM_IMAGE_VERSION_SINGLE_BLOCK_SIZE;
	snprintf(store_address, SMEM_IMAGE_VERSION_NAME_SIZE, "%-.75s", buf);
	return count;
	return count;
}
}


@@ -696,10 +702,32 @@ msm_get_image_variant(struct device *dev,
	}
	}
	string_address += current_image * SMEM_IMAGE_VERSION_SINGLE_BLOCK_SIZE;
	string_address += current_image * SMEM_IMAGE_VERSION_SINGLE_BLOCK_SIZE;
	string_address += SMEM_IMAGE_VERSION_VARIANT_OFFSET;
	string_address += SMEM_IMAGE_VERSION_VARIANT_OFFSET;
	return snprintf(buf, SMEM_IMAGE_VERSION_VARIANT_SIZE, "%-.20s",
	return snprintf(buf, SMEM_IMAGE_VERSION_VARIANT_SIZE, "%-.20s\n",
			string_address);
			string_address);
}
}


static ssize_t
msm_set_image_variant(struct device *dev,
			struct device_attribute *attr,
			const char *buf,
			size_t count)
{
	char *store_address;

	if (current_image != SMEM_IMAGE_VERSION_PARTITION_APPS)
		return count;
	store_address = socinfo_get_image_version_base_address();
	if (store_address == NULL) {
		pr_err("%s : Failed to get image version base address",
				__func__);
		return count;
	}
	store_address += current_image * SMEM_IMAGE_VERSION_SINGLE_BLOCK_SIZE;
	store_address += SMEM_IMAGE_VERSION_VARIANT_OFFSET;
	snprintf(store_address, SMEM_IMAGE_VERSION_VARIANT_SIZE, "%-.20s", buf);
	return count;
}

static ssize_t
static ssize_t
msm_get_image_crm_version(struct device *dev,
msm_get_image_crm_version(struct device *dev,
			struct device_attribute *attr,
			struct device_attribute *attr,
@@ -719,6 +747,54 @@ msm_get_image_crm_version(struct device *dev,
			string_address);
			string_address);
}
}


static ssize_t
msm_set_image_crm_version(struct device *dev,
			struct device_attribute *attr,
			const char *buf,
			size_t count)
{
	char *store_address;

	if (current_image != SMEM_IMAGE_VERSION_PARTITION_APPS)
		return count;
	store_address = socinfo_get_image_version_base_address();
	if (store_address == NULL) {
		pr_err("%s : Failed to get image version base address",
				__func__);
		return count;
	}
	store_address += current_image * SMEM_IMAGE_VERSION_SINGLE_BLOCK_SIZE;
	store_address += SMEM_IMAGE_VERSION_OEM_OFFSET;
	snprintf(store_address, SMEM_IMAGE_VERSION_OEM_SIZE, "%-.32s", buf);
	return count;
}

static ssize_t
msm_get_image_number(struct device *dev,
			struct device_attribute *attr,
			char *buf)
{
	return snprintf(buf, PAGE_SIZE, "%d\n",
			current_image);
}

static ssize_t
msm_select_image(struct device *dev, struct device_attribute *attr,
			const char *buf, size_t count)
{
	int ret, digit;

	ret = kstrtoint(buf, 10, &digit);
	if (ret)
		return ret;
	if (0 <= digit && digit < SMEM_IMAGE_VERSION_BLOCKS_COUNT)
		current_image = digit;
	else
		current_image = 0;
	return count;
}


static struct device_attribute msm_soc_attr_raw_version =
static struct device_attribute msm_soc_attr_raw_version =
	__ATTR(raw_version, S_IRUGO, msm_get_raw_version,  NULL);
	__ATTR(raw_version, S_IRUGO, msm_get_raw_version,  NULL);


@@ -764,15 +840,19 @@ static struct device_attribute msm_soc_attr_pmic_die_revision =


static struct device_attribute image_version =
static struct device_attribute image_version =
	__ATTR(image_version, S_IRUGO | S_IWUSR,
	__ATTR(image_version, S_IRUGO | S_IWUSR,
			msm_get_image_version, msm_store_image_type);
			msm_get_image_version, msm_set_image_version);


static struct device_attribute image_variant =
static struct device_attribute image_variant =
	__ATTR(image_variant, S_IRUGO,
	__ATTR(image_variant, S_IRUGO | S_IWUSR,
			msm_get_image_variant, NULL);
			msm_get_image_variant, msm_set_image_variant);


static struct device_attribute image_crm_version =
static struct device_attribute image_crm_version =
	__ATTR(image_crm_version, S_IRUGO,
	__ATTR(image_crm_version, S_IRUGO | S_IWUSR,
			msm_get_image_crm_version, NULL);
			msm_get_image_crm_version, msm_set_image_crm_version);

static struct device_attribute select_image =
	__ATTR(select_image, S_IRUGO | S_IWUGO,
			msm_get_image_number, msm_select_image);


static void * __init setup_dummy_socinfo(void)
static void * __init setup_dummy_socinfo(void)
{
{
@@ -806,6 +886,7 @@ static void __init populate_soc_sysfs_files(struct device *msm_soc_device)
	device_create_file(msm_soc_device, &image_version);
	device_create_file(msm_soc_device, &image_version);
	device_create_file(msm_soc_device, &image_variant);
	device_create_file(msm_soc_device, &image_variant);
	device_create_file(msm_soc_device, &image_crm_version);
	device_create_file(msm_soc_device, &image_crm_version);
	device_create_file(msm_soc_device, &select_image);


	switch (legacy_format) {
	switch (legacy_format) {
	case 8:
	case 8: