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

Commit 761ce533 authored by Laurent Dufour's avatar Laurent Dufour Committed by Bjorn Helgaas
Browse files

PCI: rphahp: Fix endianess issues

Numerical values stored in the device tree are encoded in Big Endian and
should be byte swapped when running in Little Endian.

The RPA hotplug module should convert those values as well.

Note that in rpaphp_get_drc_props(), the comparison between indexes[i+1]
and *index is done using the BE values (whatever is the current endianess).
This doesn't matter since we are checking for equality here.  This way only
the returned value is byte swapped.

RPA also made RTAS calls which implies BE values to be used.  According to
the patch done in RTAS (http://patchwork.ozlabs.org/patch/336865

), no
additional conversion is required in RPA.

Signed-off-by: default avatarLaurent Dufour <ldufour@linux.vnet.ibm.com>
Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
parent 374a9140
Loading
Loading
Loading
Loading
+9 −6
Original line number Original line Diff line number Diff line
@@ -223,16 +223,16 @@ int rpaphp_get_drc_props(struct device_node *dn, int *drc_index,
	type_tmp = (char *) &types[1];
	type_tmp = (char *) &types[1];


	/* Iterate through parent properties, looking for my-drc-index */
	/* Iterate through parent properties, looking for my-drc-index */
	for (i = 0; i < indexes[0]; i++) {
	for (i = 0; i < be32_to_cpu(indexes[0]); i++) {
		if ((unsigned int) indexes[i + 1] == *my_index) {
		if ((unsigned int) indexes[i + 1] == *my_index) {
			if (drc_name)
			if (drc_name)
				*drc_name = name_tmp;
				*drc_name = name_tmp;
			if (drc_type)
			if (drc_type)
				*drc_type = type_tmp;
				*drc_type = type_tmp;
			if (drc_index)
			if (drc_index)
				*drc_index = *my_index;
				*drc_index = be32_to_cpu(*my_index);
			if (drc_power_domain)
			if (drc_power_domain)
				*drc_power_domain = domains[i+1];
				*drc_power_domain = be32_to_cpu(domains[i+1]);
			return 0;
			return 0;
		}
		}
		name_tmp += (strlen(name_tmp) + 1);
		name_tmp += (strlen(name_tmp) + 1);
@@ -321,16 +321,19 @@ int rpaphp_add_slot(struct device_node *dn)
	/* register PCI devices */
	/* register PCI devices */
	name = (char *) &names[1];
	name = (char *) &names[1];
	type = (char *) &types[1];
	type = (char *) &types[1];
	for (i = 0; i < indexes[0]; i++) {
	for (i = 0; i < be32_to_cpu(indexes[0]); i++) {
		int index;


		slot = alloc_slot_struct(dn, indexes[i + 1], name, power_domains[i + 1]);
		index = be32_to_cpu(indexes[i + 1]);
		slot = alloc_slot_struct(dn, index, name,
					 be32_to_cpu(power_domains[i + 1]));
		if (!slot)
		if (!slot)
			return -ENOMEM;
			return -ENOMEM;


		slot->type = simple_strtoul(type, NULL, 10);
		slot->type = simple_strtoul(type, NULL, 10);


		dbg("Found drc-index:0x%x drc-name:%s drc-type:%s\n",
		dbg("Found drc-index:0x%x drc-name:%s drc-type:%s\n",
				indexes[i + 1], name, type);
				index, name, type);


		retval = rpaphp_enable_slot(slot);
		retval = rpaphp_enable_slot(slot);
		if (!retval)
		if (!retval)