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

Commit 1be9ad65 authored by Stephen Rothwell's avatar Stephen Rothwell Committed by Paul Mackerras
Browse files

[POWERPC] iSeries: Clean up and simplify vdpinfo.c

parent cd9afb34
Loading
Loading
Loading
Loading
+46 −54
Original line number Diff line number Diff line
@@ -82,62 +82,56 @@ struct slot_map {
static void __init iseries_parse_slot_area(struct slot_map *map, int len,
		HvAgentId agent, u8 *phb, char card[4])
{
	int slot_map_len = len;
	struct slot_map *slot_map = map;

	/*
	 * Parse Slot label until we find the one requested
	 */
	while (slot_map_len > 0) {
		if (slot_map->agent == agent) {
	while (len > 0) {
		if (map->agent == agent) {
			/*
			 * If Phb wasn't found, grab the entry first one found.
			 */
			if (*phb == 0xff)
				*phb = slot_map->phb;
				*phb = map->phb;
			/* Found it, extract the data. */
			if (slot_map->phb == *phb) {
				memcpy(card, &slot_map->card_location, 3);
			if (map->phb == *phb) {
				memcpy(card, &map->card_location, 3);
				card[3]  = 0;
				break;
			}
		}
		/* Point to the next Slot */
		slot_map = (struct slot_map *)((char *)slot_map + SLOT_ENTRY_SIZE);
		slot_map_len -= SLOT_ENTRY_SIZE;
		map = (struct slot_map *)((char *)map + SLOT_ENTRY_SIZE);
		len -= SLOT_ENTRY_SIZE;
	}
}

/*
 * Parse the Mfg Area
 */
static void __init iseries_parse_mfg_area(u8 *area, int len,
		HvAgentId agent, u8 *phb,
		u8 *frame, char card[4])
static void __init iseries_parse_mfg_area(struct mfg_vpd_area *area, int len,
		HvAgentId agent, u8 *phb, u8 *frame, char card[4])
{
	struct mfg_vpd_area *mfg_area = (struct mfg_vpd_area *)area;
	int mfg_area_len = len;
	u16 slot_map_fmt = 0;

	/* Parse Mfg Data */
	while (mfg_area_len > 0) {
		int mfg_tag_len = mfg_area->length;
	while (len > 0) {
		int mfg_tag_len = area->length;
		/* Frame ID         (FI 4649020310 ) */
		if (mfg_area->tag == VPD_FRU_FRAME_ID)
			*frame = mfg_area->data1;
		if (area->tag == VPD_FRU_FRAME_ID)
			*frame = area->data1;
		/* Slot Map Format  (MF 4D46020004 ) */
		else if (mfg_area->tag == VPD_SLOT_MAP_FORMAT)
			slot_map_fmt = (mfg_area->data1 * 256)
				+ mfg_area->data2;
		else if (area->tag == VPD_SLOT_MAP_FORMAT)
			slot_map_fmt = (area->data1 * 256)
				+ area->data2;
		/* Slot Map         (SM 534D90 */
		else if (mfg_area->tag == VPD_SLOT_MAP) {
		else if (area->tag == VPD_SLOT_MAP) {
			struct slot_map *slot_map;

			if (slot_map_fmt == 0x1004)
				slot_map = (struct slot_map *)((char *)mfg_area
				slot_map = (struct slot_map *)((char *)area
						+ MFG_ENTRY_SIZE + 1);
			else
				slot_map = (struct slot_map *)((char *)mfg_area
				slot_map = (struct slot_map *)((char *)area
						+ MFG_ENTRY_SIZE);
			iseries_parse_slot_area(slot_map, mfg_tag_len,
					agent, phb, card);
@@ -146,9 +140,9 @@ static void __init iseries_parse_mfg_area(u8 *area, int len,
		 * Point to the next Mfg Area
		 * Use defined size, sizeof give wrong answer
		 */
		mfg_area = (struct mfg_vpd_area *)((char *)mfg_area + mfg_tag_len
		area = (struct mfg_vpd_area *)((char *)area + mfg_tag_len
				+ MFG_ENTRY_SIZE);
		mfg_area_len -= (mfg_tag_len + MFG_ENTRY_SIZE);
		len -= (mfg_tag_len + MFG_ENTRY_SIZE);
	}
}

@@ -156,48 +150,46 @@ static void __init iseries_parse_mfg_area(u8 *area, int len,
 * Look for "BUS".. Data is not Null terminated.
 * PHBID of 0xFF indicates PHB was not found in VPD Data.
 */
static int __init iseries_parse_phbid(u8 *area, int len)
static u8 __init iseries_parse_phbid(u8 *area, int len)
{
	u8 *phb_ptr = area;
	int data_len = len;
	char phb = 0xFF;

	while (data_len > 0) {
		if ((*phb_ptr == 'B') && (*(phb_ptr + 1) == 'U')
				&& (*(phb_ptr + 2) == 'S')) {
			phb_ptr += 3;
			while (*phb_ptr == ' ')
				++phb_ptr;
			phb = (*phb_ptr & 0x0F);
			break;
	while (len > 0) {
		if ((*area == 'B') && (*(area + 1) == 'U')
				&& (*(area + 2) == 'S')) {
			area += 3;
			while (*area == ' ')
				area++;
			return *area & 0x0F;
		}
		++phb_ptr;
		--data_len;
		area++;
		len--;
	}
	return phb;
	return 0xff;
}

/*
 * Parse out the VPD Areas
 */
static void __init iseries_parse_vpd(u8 *data, int vpd_data_len,
static void __init iseries_parse_vpd(u8 *data, int data_len,
		HvAgentId agent, u8 *frame, char card[4])
{
	u8 *tag_ptr = data;
	int data_len = vpd_data_len - 3;
	u8 phb = 0xff;

	while ((*tag_ptr != VPD_END_OF_AREA) && (data_len > 0)) {
		int len = *(tag_ptr + 1) + (*(tag_ptr + 2) * 256);
		u8 *area  = tag_ptr + 3;
	while (data_len > 0) {
		int len;
		u8 tag = *data;

		if (*tag_ptr == VPD_ID_STRING)
			phb = iseries_parse_phbid(area, len);
		else if (*tag_ptr == VPD_VENDOR_AREA)
			iseries_parse_mfg_area(area, len,
		if (tag == VPD_END_OF_AREA)
			break;
		len = *(data + 1) + (*(data + 2) * 256);
		data += 3;
		data_len -= 3;
		if (tag == VPD_ID_STRING)
			phb = iseries_parse_phbid(data, len);
		else if (tag == VPD_VENDOR_AREA)
			iseries_parse_mfg_area((struct mfg_vpd_area *)data, len,
					agent, &phb, frame, card);
		/* Point to next Area. */
		tag_ptr  = area + len;
		data += len;
		data_len -= len;
	}
}