Example #1
0
/* ------------------------------------------------------------------------*//**
 * @FUNCTION		cm54xx_export
 * @BRIEF		export module register content to file, in XML format.
 * @RETURNS		0 in case of success
 *			OMAPCONF_ERR_CPU
 *			OMAPCONF_ERR_ARG
 *			OMAPCONF_ERR_INTERNAL
 * @param[in,out]	fp: output file stream (opened for write operations)
 * @param[in]		id: CM module ID
 * @DESCRIPTION		export module register content to file, in XML format.
 *//*------------------------------------------------------------------------ */
int cm54xx_export(FILE *fp, cm54xx_mod_id id)
{
	reg **mod;
	unsigned int i;

	CHECK_CPU(54xx, OMAPCONF_ERR_CPU);
	CHECK_NULL_ARG(fp, OMAPCONF_ERR_ARG);
	CHECK_ARG_LESS_THAN(id, CM54XX_MODS_COUNT, OMAPCONF_ERR_ARG);

	if ((cpu_revision_get() != REV_ES1_0) &&
		(id == CM54XX_L4PER_CM_CORE)) {
		fprintf(stderr, "omapconf: %s(): L4_PER does not exist!!!\n",
			__func__);
		return OMAPCONF_ERR_ARG;
	}

	dprintf("%s(): exporting CM %s (%u) module ...\n", __func__,
		cm54xx_mod_name_get(id), id);

	if (cpu_revision_get() == REV_ES1_0)
		mod = cm54xxes1_mods[id];
	else
		mod = cm54xx_mods[id];
	if (mod == NULL) {
		fprintf(stderr, "omapconf: %s(): mod == NULL!!!\n", __func__);
		return OMAPCONF_ERR_INTERNAL;
	}

	if ((id == CM54XX_INSTR_CM_CORE) &&
		!cm54xx_is_profiling_running(CM54XX_INSTR_CM_CORE)) {
		dprintf(
			"%s(%s): CM module is not accessible, don't export registers\n",
			__func__, cm54xx_mod_name_get(id));
		return 0;
	} else if ((id == CM54XX_INSTR_CM_CORE_AON) &&
		!cm54xx_is_profiling_running(CM54XX_INSTR_CM_CORE_AON)) {
		dprintf(
			"%s(%s): CM module is not accessible, don't export registers\n",
			__func__, cm54xx_mod_name_get(id));
		return 0;
	}

	fprintf(fp, "          <submodule id=\"%u\" name=\"%s\">\n",
		id, cm54xx_mod_name_get(id));

	for (i = 0; mod[i] != NULL; i++)
		fprintf(fp,
			"            <register id=\"%u\" name=\"%s\" addr=\"0x%08X\" data=\"0x%08X\" />\n",
			i, reg_name_get(mod[i]), reg_addr_get(mod[i]),
			reg_read(mod[i]));

	fprintf(fp, "          </submodule>\n");
	fflush(fp);

	dprintf("%s(): CM %s (%u) module exported.\n", __func__,
		cm54xx_mod_name_get(id), id);
	return 0;
}
Example #2
0
/* ------------------------------------------------------------------------*//**
 * @FUNCTION		emif54xx_export
 * @BRIEF		export module register content to file, in XML format.
 * @RETURNS		0 in case of success
 *			OMAPCONF_ERR_CPU
 *			OMAPCONF_ERR_ARG
 *			OMAPCONF_ERR_REG_ACCESS
 *			OMAPCONF_ERR_INTERNAL
 * @param[in,out]	fp: output file stream (opened for write operations)
 * @param[in]		id: EMIF module ID
 * @DESCRIPTION		export module register content to file, in XML format.
 *//*------------------------------------------------------------------------ */
int emif54xx_export(FILE *fp, emif54xx_mod_id id)
{
	reg **mod;
	unsigned int i, accessible;

	CHECK_CPU(54xx, OMAPCONF_ERR_CPU);
	CHECK_NULL_ARG(fp, OMAPCONF_ERR_ARG);
	CHECK_ARG_LESS_THAN(id, EMIF54XX_MODS_COUNT, OMAPCONF_ERR_ARG);

	switch (id) {
	case EMIF54XX_EMIF1:
		accessible = module_is_accessible(MOD_EMIF1);
		break;
	case EMIF54XX_EMIF2:
		accessible = module_is_accessible(MOD_EMIF2);
		break;
	default: /* should not happen as already checked just before ... */
		return OMAPCONF_ERR_INTERNAL;
	}

	if (!accessible) {
		printf("%s export: module not running, skipping "
			"registers export.\n", emif54xx_mod_name_get(id));
		return 0;
	}

	if (cpu_revision_get() == REV_ES1_0)
		mod = emif54xxes1_mods[id];
	else
		mod = emif54xx_mods[id];

	fprintf(fp, "          <submodule id=\"%u\" name=\"%s\">\n",
		id, emif54xx_mod_name_get(id));

	if (cpu_revision_get() == REV_ES1_0) {
		for (i = 0; i < OMAP5430ES1_EMIF1_MOD_REGCOUNT; i++)
			fprintf(fp, "            <register id=\"%u\" name=\"%s\" "
				"addr=\"0x%08X\" data=\"0x%08X\" />\n", i,
				(mod[i])->name, (mod[i])->addr, reg_read(mod[i]));
	} else {
		for (i = 0; i < OMAP5430_EMIF1_MOD_REGCOUNT; i++)
			fprintf(fp, "            <register id=\"%u\" name=\"%s\" "
				"addr=\"0x%08X\" data=\"0x%08X\" />\n", i,
				(mod[i])->name, (mod[i])->addr, reg_read(mod[i]));
	}

	fprintf(fp, "          </submodule>\n");

	return 0;
}
Example #3
0
/* ------------------------------------------------------------------------*//**
 * @FUNCTION		prm54xx_import
 * @BRIEF		import OMAP PRM registers from XML file
 * @RETURNS		0 in case of success
 *			OMAPCONF_ERR_ARG
 *			OMAPCONF_ERR_UNEXPECTED
 * @param[in,out]	fp: XML import file descriptor
 * @param[in]		id: CM module ID
 * @DESCRIPTION		import OMAP PRM registers from XML file,
 *			generated with lib54xx_export().
 *//*------------------------------------------------------------------------ */
int prm54xx_import(FILE *fp, prm54xx_mod_id id)
{
	reg **mod;
	char line[256], sline[256];
	char *xml_entry;
	int ret, i, n;

	CHECK_NULL_ARG(fp, OMAPCONF_ERR_ARG);
	CHECK_ARG_LESS_THAN(id, PRM54XX_MODS_COUNT, OMAPCONF_ERR_ARG);

	if (cpu_revision_get() == REV_ES1_0)
		mod = prm54xxes1_mods[id];
	else
		mod = prm54xx_mods[id];
	rewind(fp);

	/* Search for the PRM module tag */
	sprintf(sline, "<submodule id=\"%u\" name=\"%s\">",
		id, prm54xx_mod_name_get(id));
	while (fgets(line, sizeof(line), fp) != NULL) {
		if (strstr(line, sline) == NULL)
			continue;
		/* Import register content */
		for (i = 0; mod[i] != NULL; i++) {
			if (fgets(line, sizeof(line), fp) == NULL)
				return OMAPCONF_ERR_UNEXPECTED;
			line[strlen(line) - 1] = '\0'; /* remove ending '\n' */
			xml_entry = strstr(line, "<"); /* remove spaces */

			dprintf("%s(%u (%s)): xml_entry=%s\n", __func__, id,
				prm54xx_mod_name_get(id), xml_entry);

			/* Check register id is correct */
			ret = sscanf(xml_entry, "<register id=\"%u\" %s",
				&n, sline);
			if (ret != 2) {
				dprintf("%s(%u (%s)): could not get id\n",
					__func__, id, prm54xx_mod_name_get(id));
				return OMAPCONF_ERR_UNEXPECTED;
			}
			if (n != i) {
				dprintf(
					"%s(%u (%s)): register id does not match! (n=%u, i=%u)\n",
					__func__, id,
					prm54xx_mod_name_get(id), n, i);
				return OMAPCONF_ERR_UNEXPECTED;
			}

			ret = reg_xml_import(mod[i], xml_entry);
			if (ret != 0)
				return ret;
		}
		dprintf("%s(%u (%s)): all registers imported.\n", __func__, id,
			prm54xx_mod_name_get(id));
		break;
	}

	return 0;
}
Example #4
0
/* ------------------------------------------------------------------------*//**
 * @FUNCTION		powerdm_emu_disable
 * @BRIEF		Power OFF EMU domain and clocks.
 * @DESCRIPTION		Power OFF EMU domain and clocks.
 *//*------------------------------------------------------------------------ */
void powerdm_emu_disable(void)
{
	if (cpu_is_omap44xx()) {
		mem_write(OMAP4430_CM_L3INSTR_L3_3_CLKCTRL, 0);
	} else if (cpu_is_omap54xx()) {
		if (cpu_revision_get() == REV_ES1_0)
			mem_write(OMAP5430ES1_CM_L3INSTR_L3_MAIN_3_CLKCTRL,
				0x0);
		else
			mem_write(OMAP5430_CM_L3INSTR_L3_MAIN_3_CLKCTRL, 0x0);
	} else {
		fprintf(stderr,
			"omapconf: %s(): warning: cpu not supported, skipping it.\n",
			__func__);
	}
}
Example #5
0
/* ------------------------------------------------------------------------*//**
 * @FUNCTION		prm54xx_is_profiling_running
 * @BRIEF		return 1 if profiling module (PMI) is running,
 *			0 otherwise
 * @RETURNS		1 if profiling module (PMI) is running,
 *			0 otherwise
 * @DESCRIPTION		return 1 if profiling module (PMI) is running,
 *			0 otherwise
 *//*------------------------------------------------------------------------ */
unsigned int prm54xx_is_profiling_running(void)
{
	reg *cm_clkctrl_reg;
	unsigned int cm_clkctrl;

	if (cpu_revision_get() == REV_ES1_0)
		cm_clkctrl_reg = &omap5430es1_cm_prm_profiling_clkctrl;
	else
		cm_clkctrl_reg = &omap5430_cm_prm_profiling_clkctrl;

	if (cm_clkctrl_reg == NULL) {
		dprintf("%s(): cm_clkctrl_reg == NULL!!!\n", __func__);
		return 0;
	}

	cm_clkctrl = reg_read(cm_clkctrl_reg);
	return mod_is_accessible(cm_clkctrl);
}
Example #6
0
void nosleep_32k_disable(void)
{
	unsigned int reg;
	unsigned int reg_clk;

	if (cpu_is_omap54xx()) {
		if (cpu_revision_get() == REV_ES1_0)
			reg_clk = OMAP5430ES1_CM_WKUPAON_CLKSTCTRL;
		else
			reg_clk = OMAP5430_CM_WKUPAON_CLKSTCTRL;
	} else if (cpu_is_omap44xx()) {
		reg_clk = OMAP4430_CM_WKUP_CLKSTCTRL;
	}

	mem_read(reg_clk, &reg);
	reg = reg | nosleep_32k_reg;
	mem_write(reg_clk, reg);
}
Example #7
0
/* ------------------------------------------------------------------------*//**
 * @FUNCTION		cm54xx_is_profiling_running
 * @BRIEF		return 1 if profiling module (CMI) is running,
 *			0 otherwise
 * @RETURNS		1 if profiling module (CMI) is running, 0 otherwise
 * @param[in]		id: instrumentation ID
 *			(CM54XX_INSTR_CM_CORE or CM54XX_INSTR_CM_CORE_AON)
 * @DESCRIPTION		return 1 if profiling module (CMI) is running,
 *			0 otherwise
 *//*------------------------------------------------------------------------ */
unsigned int cm54xx_is_profiling_running(cm54xx_mod_id id)
{
	reg *cm_clkctrl_reg;
	unsigned int cm_clkctrl;

	if (cpu_revision_get() == REV_ES1_0) {
		if (id == CM54XX_INSTR_CM_CORE_AON) {
			cm_clkctrl_reg =
				&omap5430es1_cm_cm_core_aon_profiling_clkctrl;
		} else if (id == CM54XX_INSTR_CM_CORE) {
			cm_clkctrl_reg =
				&omap5430es1_cm_cm_core_profiling_clkctrl;
		} else {
			fprintf(stderr,
				"%s(): called with incorrect ID (%s)!!!\n",
				__func__, cm54xx_mod_name_get(id));
			return 0;
		}
	} else {
		if (id == CM54XX_INSTR_CM_CORE_AON) {
			cm_clkctrl_reg =
				&omap5430_cm_cm_core_aon_profiling_clkctrl;
		} else if (id == CM54XX_INSTR_CM_CORE) {
			cm_clkctrl_reg =
				&omap5430_cm_cm_core_profiling_clkctrl;
		} else {
			fprintf(stderr,
				"%s(): called with incorrect ID (%s)!!!\n",
				__func__, cm54xx_mod_name_get(id));
			return 0;
		}
	}

	if (cm_clkctrl_reg == NULL) {
		fprintf(stderr, "omapconf: %s(): cm_clkctrl_reg == NULL!!!\n",
			__func__);
		return 0;
	}

	cm_clkctrl = reg_read(cm_clkctrl_reg);
	return mod_is_accessible(cm_clkctrl);
}
Example #8
0
/* ------------------------------------------------------------------------*//**
 * @FUNCTION		ctrlmod54xx_export
 * @BRIEF		export CONTROL MODULE registers content to file, in
 *			XML format.
 * @RETURNS		0 in case of success
 *			OMAPCONF_ERR_CPU
 *			OMAPCONF_ERR_ARG
 *			OMAPCONF_ERR_REG_ACCESS
 * @param[in,out]	fp: output file stream (opened for write operations)
 * @param[in]		id: module ID
 * @DESCRIPTION		export CONTROL MODULE registers content to file, in
 *			XML format.
 *//*------------------------------------------------------------------------ */
int ctrlmod54xx_export(FILE *fp, ctrlmod54xx_mod_id id)
{
	reg **mod;
	unsigned int i;

	CHECK_NULL_ARG(fp, OMAPCONF_ERR_ARG);
	CHECK_ARG_LESS_THAN(id, CTRLMOD54XX_MODS_COUNT, OMAPCONF_ERR_ARG);

	if (cpu_revision_get() == REV_ES1_0)
		mod = ctrlmod54xxes1_mods[id];
	else
		mod = ctrlmod54xx_mods[id];
	fprintf(fp, "          <submodule id=\"%u\" name=\"%s\">\n",
		id, ctrlmod54xx_mod_name_get(id));

	for (i = 0; mod[i] != NULL; i++)
		fprintf(fp, "            <register id=\"%u\" name=\"%s\" "
			"addr=\"0x%08X\" data=\"0x%08X\" />\n", i,
			(mod[i])->name, (mod[i])->addr, reg_read(mod[i]));

	fprintf(fp, "          </submodule>\n");

	return 0;
}
Example #9
0
/* ------------------------------------------------------------------------*//**
 * @FUNCTION		opp54xx_init
 * @BRIEF		initialize internal data
 * @DESCRIPTION		initialize internal data (architecture dependent)
 *//*------------------------------------------------------------------------ */
void opp54xx_init(void)
{
	opp_t opp;

	/* ES1.0 */
	static const opp_t mpu_opp_low_es1  = {OPP_LOW,	 950000,  400000};
	static const opp_t mpu_opp_nom_es1  = {OPP_NOM,	 1040000, 800000};
	static const opp_t mpu_opp_high_es1 = {OPP_HIGH, 1220000, 1100000};

	static const opp_t mm_opp_low_es1 =  {OPP_LOW,	950000,  177333};
	static const opp_t mm_opp_nom_es1 =  {OPP_NOM,	1040000, 354667};
	static const opp_t mm_opp_high_es1 = {OPP_HIGH,	1220000, 532000};

	static const opp_t core_opp_low_es1 = {OPP_LOW,	950000,  133000};
	static const opp_t core_opp_nom_es1 = {OPP_NOM,	1040000, 2660000};

	/* ES2.0 */
	static const opp_t mpu_opp_low  = {OPP_LOW,	880000,  500000};
	static const opp_t mpu_opp_nom  = {OPP_NOM,	1060000, 1000000};
	static const opp_t mpu_opp_high = {OPP_HIGH,	1250000, 1500000};
	static const opp_t mpu_opp_sb =   {OPP_SB,	1290000, 1700000};

	static const opp_t mm_opp_low =  {OPP_LOW,	880000,  195000};
	static const opp_t mm_opp_nom =  {OPP_NOM,	1030000, 389000};
	static const opp_t mm_opp_high = {OPP_HIGH,	1120000, 532000};

	static const opp_t core_opp_low = {OPP_LOW,	880000,  133000};
	static const opp_t core_opp_nom = {OPP_NOM,	1040000, 2660000};

	#ifdef OPP54XX_DEBUG
	int i, count;
	voltdm54xx_id vdd;
	#endif

	if (!opp54xx_init_done) {
		genlist_init(&vdd54xx_wkup_opp_list);
		opp.name = OPP_NOM;
		opp.voltage = 1.0;
		opp.rate = clk54xx_sysclk_rate_get();
		genlist_addtail(&vdd54xx_wkup_opp_list,
			(void *) &opp, sizeof(opp_t));

		genlist_init(&vdd54xx_mpu_opp_list);
		if (cpu_revision_get() == REV_ES1_0) {
			genlist_addtail(&vdd54xx_mpu_opp_list,
				(void *) &mpu_opp_low_es1, sizeof(opp_t));
			genlist_addtail(&vdd54xx_mpu_opp_list,
				(void *) &mpu_opp_nom_es1, sizeof(opp_t));
			genlist_addtail(&vdd54xx_mpu_opp_list,
				(void *) &mpu_opp_high_es1, sizeof(opp_t));

			genlist_init(&vdd54xx_mm_opp_list);
			genlist_addtail(&vdd54xx_mm_opp_list,
				(void *) &mm_opp_low_es1, sizeof(opp_t));
			genlist_addtail(&vdd54xx_mm_opp_list,
				(void *) &mm_opp_nom_es1, sizeof(opp_t));
			genlist_addtail(&vdd54xx_mm_opp_list,
				(void *) &mm_opp_high_es1, sizeof(opp_t));

			genlist_init(&vdd54xx_core_opp_list);
			genlist_addtail(&vdd54xx_core_opp_list,
				(void *) &core_opp_low_es1, sizeof(opp_t));
			genlist_addtail(&vdd54xx_core_opp_list,
				(void *) &core_opp_nom_es1, sizeof(opp_t));
		} else {
			genlist_addtail(&vdd54xx_mpu_opp_list,
				(void *) &mpu_opp_low, sizeof(opp_t));
			genlist_addtail(&vdd54xx_mpu_opp_list,
				(void *) &mpu_opp_nom, sizeof(opp_t));
			genlist_addtail(&vdd54xx_mpu_opp_list,
				(void *) &mpu_opp_high, sizeof(opp_t));
			genlist_addtail(&vdd54xx_mpu_opp_list,
				(void *) &mpu_opp_sb, sizeof(opp_t));

			genlist_init(&vdd54xx_mm_opp_list);
			genlist_addtail(&vdd54xx_mm_opp_list,
				(void *) &mm_opp_low, sizeof(opp_t));
			genlist_addtail(&vdd54xx_mm_opp_list,
				(void *) &mm_opp_nom, sizeof(opp_t));
			genlist_addtail(&vdd54xx_mm_opp_list,
				(void *) &mm_opp_high, sizeof(opp_t));

			genlist_init(&vdd54xx_core_opp_list);
			genlist_addtail(&vdd54xx_core_opp_list,
				(void *) &core_opp_low, sizeof(opp_t));
			genlist_addtail(&vdd54xx_core_opp_list,
				(void *) &core_opp_nom, sizeof(opp_t));
		}

		opp54xx_init_done = 1;
		#ifdef OPP54XX_DEBUG
		printf("%s(): init done.\n", __func__);
		printf("OPP List:\n");
		for (vdd = VDD54XX_WKUP; vdd <= VDD54XX_CORE; vdd++) {
			count = genlist_getcount(
				(genlist *) opp54xx_list_table_es1[vdd]);
			printf("  %s (%d): ", voltdm54xx_name_get(vdd), count);
			for (i = 0; i < count; i++) {
				genlist_get(
					(genlist *) opp54xx_list_table_es1[vdd],
					i, (void *) &opp);
				printf("%s (%.1lfMHz, %.3lfV)",
					opp.name, khz2mhz(opp.rate),
					uv2v(opp.voltage));
				if (i != count - 1)
					printf(", ");
			}
			printf(".\n");
		}
		#endif
	}
}
Example #10
0
/* ------------------------------------------------------------------------*//**
 * @FUNCTION		prm54xx_dump
 * @BRIEF		dump selected registers and pretty-print it in
 *			selected output stream
 * @RETURNS		0 in case of success
 *			OMAPCONF_ERR_CPU
 *			OMAPCONF_ERR_ARG
 * @param[in,out]		stream: output stream
 * @param[in]		id: PRM module ID - If id == PRM54XX_MODS_COUNT,
 *			dump all PRM registers.
 * @DESCRIPTION		dump selected registers and pretty-print it in
 *			selected output stream
 *//*------------------------------------------------------------------------ */
int prm54xx_dump(FILE *stream, prm54xx_mod_id id)
{
	unsigned int i = 0, mid;
	unsigned int val = 0;
	int err = 0;
	reg **mod;
	reg *r;
	char s[TABLE_MAX_ELT_LEN];
	char table[TABLE_MAX_ROW][TABLE_MAX_COL][TABLE_MAX_ELT_LEN];
	unsigned int row;


	if (stream == NULL) {
		fprintf(stderr, "%s(): stream == NULL!!!\n", __func__);
		err = OMAPCONF_ERR_ARG;
		goto prm54xx_dump_end;
	}

	if (id > PRM54XX_MODS_COUNT) {
		fprintf(stderr, "%s(): id (%u) > PRM54XX_MODS_COUNT!!! (%u)\n",
			__func__, id, PRM54XX_MODS_COUNT);
		err = OMAPCONF_ERR_ARG;
		goto prm54xx_dump_end;
	}

	autoadjust_table_init(table);
	row = 0;

	if (id != PRM54XX_MODS_COUNT)
		snprintf(table[row][0], TABLE_MAX_ELT_LEN, "%s Reg. Name",
			prm54xx_mod_name_get(id));
	else
		strncpy(table[row][0], "PRM Reg. Name", TABLE_MAX_ELT_LEN);
	strncpy(table[row][1], "Reg. Address",
		TABLE_MAX_ELT_LEN);
	strncpy(table[row][2], "Reg. Value", TABLE_MAX_ELT_LEN);
	row++;

	for (mid = PRM54XX_DSS_PRM; mid < PRM54XX_MODS_COUNT; mid++) {
		if ((id != PRM54XX_MODS_COUNT) && (mid != id))
			continue;
		else {
			if (cpu_revision_get() == REV_ES1_0)
				mod = prm54xxes1_mods[mid];
			else
				mod = prm54xx_mods[mid];
			for (i = 0; mod[i] != NULL; i++) {
				r = mod[i];
				/* Read register */
				val = reg_read(r);
				/* Show register name, addr & content */
				snprintf(s, TABLE_MAX_ELT_LEN, "%s", r->name);
				autoadjust_table_strncpy(table, row, 0, s);

				snprintf(s, TABLE_MAX_ELT_LEN, "0x%08X",
					r->addr);
				autoadjust_table_strncpy(table, row, 1, s);

				snprintf(s, TABLE_MAX_ELT_LEN, "0x%08X", val);
				autoadjust_table_strncpy(table, row++, 2, s);
			}
		}
	}

	autoadjust_table_print(table, row, 3);

prm54xx_dump_end:
	return err;
}
Example #11
0
/* ------------------------------------------------------------------------*//**
 * @FUNCTION		mpu44xx_config_show
 * @BRIEF		analyze MPU power configuration
 * @RETURNS		0 in case of success
 *			OMAPCONF_ERR_CPU
 *			OMAPCONF_ERR_REG_ACCESS
 * @param[in]		stream: output file stream
 * @DESCRIPTION		analyze MPU power configuration
 *//*------------------------------------------------------------------------ */
int mpu44xx_config_show(FILE *stream)
{
	unsigned int pm_pda_cpu0_pwrstctrl;
	unsigned int pm_pda_cpu0_pwrstst;
	unsigned int rm_pda_cpu0_context;
	unsigned int cm_pda_cpu0_clkctrl;
	unsigned int cm_pda_cpu0_clkstctrl;
	unsigned int pm_pda_cpu1_pwrstctrl;
	unsigned int pm_pda_cpu1_pwrstst;
	unsigned int rm_pda_cpu1_context;
	unsigned int cm_pda_cpu1_clkctrl;
	unsigned int cm_pda_cpu1_clkstctrl;
	unsigned int scu_cpu_power_status;
	char s0[32], s1[32];
	unsigned int cm_clkmode_dpll_mpu;
	unsigned int cm_idlest_dpll_mpu;
	unsigned int cm_autoidle_dpll_mpu;
	omap4_dpll_params dpll_mpu_params;
	unsigned int pm_pwstctrl;
	unsigned int pm_pwstst;
	unsigned int cm_clkstctrl;
	unsigned int rm_context;
	unsigned int cm_clkctrl;
	int ret;

	CHECK_CPU(44xx, OMAPCONF_ERR_CPU);

	if (!init_done)
		mpu44xx_regtable_init();

	if (mem_read(OMAP4430_PM_PDA_CPU0_PWRSTCTRL,
		&pm_pda_cpu0_pwrstctrl) != 0)
		return OMAPCONF_ERR_REG_ACCESS;
	if (mem_read(OMAP4430_PM_PDA_CPU0_PWRSTST, &pm_pda_cpu0_pwrstst) != 0)
		return OMAPCONF_ERR_REG_ACCESS;
	if (mem_read(OMAP4430_RM_PDA_CPU0_CPU0_CONTEXT,
		&rm_pda_cpu0_context) != 0)
		return OMAPCONF_ERR_REG_ACCESS;
	if (mem_read(OMAP4430_CM_PDA_CPU0_CPU0_CLKCTRL,
		&cm_pda_cpu0_clkctrl) != 0)
		return OMAPCONF_ERR_REG_ACCESS;
	if (mem_read(OMAP4430_CM_PDA_CPU0_CLKSTCTRL,
		&cm_pda_cpu0_clkstctrl) != 0)
		return OMAPCONF_ERR_REG_ACCESS;
	if (mem_read(OMAP4430_PM_PDA_CPU1_PWRSTCTRL,
		&pm_pda_cpu1_pwrstctrl) != 0)
		return OMAPCONF_ERR_REG_ACCESS;
	if (mem_read(OMAP4430_PM_PDA_CPU1_PWRSTST,
		&pm_pda_cpu1_pwrstst) != 0)
		return OMAPCONF_ERR_REG_ACCESS;
	if (mem_read(OMAP4430_RM_PDA_CPU1_CPU1_CONTEXT,
		&rm_pda_cpu1_context) != 0)
		return OMAPCONF_ERR_REG_ACCESS;
	if (mem_read(OMAP4430_CM_PDA_CPU1_CPU1_CLKCTRL,
		&cm_pda_cpu1_clkctrl) != 0)
		return OMAPCONF_ERR_REG_ACCESS;
	if (mem_read(OMAP4430_CM_PDA_CPU1_CLKSTCTRL,
		&cm_pda_cpu1_clkstctrl) != 0)
		return OMAPCONF_ERR_REG_ACCESS;
	if (mem_read(OMAP4430_SCU_CPU_POWER_STATUS,
		&scu_cpu_power_status) != 0)
		return OMAPCONF_ERR_REG_ACCESS;
	if (mem_read(OMAP4430_CM_CLKMODE_DPLL_MPU,
		&cm_clkmode_dpll_mpu) != 0)
		return OMAPCONF_ERR_REG_ACCESS;
	if (mem_read(OMAP4430_CM_IDLEST_DPLL_MPU,
		&cm_idlest_dpll_mpu) != 0)
		return OMAPCONF_ERR_REG_ACCESS;
	if (mem_read(OMAP4430_CM_AUTOIDLE_DPLL_MPU,
		&cm_autoidle_dpll_mpu) != 0)
		return OMAPCONF_ERR_REG_ACCESS;

	ret = dpll44xx_dpll_params_get(DPLL44XX_MPU,
		&dpll_mpu_params, 0);
	if (ret < 0)
		return ret;

	/* MPU LPRM config */
	fprintf(stream, "|----------------------------------------------------"
		"----|\n");
	fprintf(stream, "| %-30s | %-9s | %-9s |\n", "MPU LPRM Configuration",
		"CPU0",	"CPU1");
	fprintf(stream, "|--------------------------------|-----------|-------"
		"----|\n");
	pwrdm_state2string(s0,
		(pwrdm_state) extract_bitfield(pm_pda_cpu0_pwrstst, 0, 2));
	pwrdm_state2string(s1,
		(pwrdm_state) extract_bitfield(pm_pda_cpu1_pwrstst, 0, 2));
	fprintf(stream, "| %-30s | %-9s | %-9s |\n", "Current Power State",
		s0, s1);
	fprintf(stream, "| %-30s | %-9s | %-9s |\n", "Current Logic State",
		((extract_bit(pm_pda_cpu0_pwrstst, 2) == 1) ? "ON" : "OFF"),
		((extract_bit(pm_pda_cpu1_pwrstst, 2) == 1) ? "ON" : "OFF"));
	pwrdm_state2string(s0,
		(pwrdm_state) extract_bitfield(pm_pda_cpu0_pwrstst, 4, 2));
	pwrdm_state2string(s1,
		(pwrdm_state) extract_bitfield(pm_pda_cpu1_pwrstst, 4, 2));
	fprintf(stream, "| %-30s | %-9s | %-9s |\n",
		"Current L1$ State", s0, s1);
	pwrdm_state2string(s0,
		(pwrdm_state)extract_bitfield(pm_pda_cpu0_pwrstctrl, 0, 2));
	pwrdm_state2string(s1,
		(pwrdm_state) extract_bitfield(pm_pda_cpu1_pwrstctrl, 0, 2));
	fprintf(stream, "| %-30s | %-9s | %-9s |\n",
		"Standby Status",
		((extract_bit(cm_pda_cpu0_clkctrl, 0) == 1) ?
			"STANDBY" : "RUNNING"),
		((extract_bit(cm_pda_cpu1_clkctrl, 0) == 1) ?
			"STANDBY" : "RUNNING"));
	fprintf(stream, "| %-30s | %-9s | %-9s |\n", "", "", "");
	fprintf(stream, "| %-30s | %-9s | %-9s |\n", "Target Power State",
		s0, s1);
	fprintf(stream, "| %-30s | %-9s | %-9s |\n",
		"Logic State When Domain is RET",
		((extract_bit(pm_pda_cpu0_pwrstctrl, 2) == 1) ? "RET" : "OFF"),
		((extract_bit(pm_pda_cpu1_pwrstctrl, 2) == 1) ? "RET" : "OFF"));
	fprintf(stream, "| %-30s | %-9s | %-9s |\n", "Clock Control",
		clkdm_ctrl_mode_name_get((clkdm_ctrl_mode)
			extract_bitfield(cm_pda_cpu0_clkstctrl, 0, 2)),
		clkdm_ctrl_mode_name_get((clkdm_ctrl_mode)
			extract_bitfield(cm_pda_cpu1_clkstctrl, 0, 2)));
	fprintf(stream, "| %-30s | %-9s | %-9s |\n", "", "", "");
	if ((cpu_is_omap4430() && (cpu_revision_get() != REV_ES1_0)) ||
		cpu_is_omap4460() || cpu_is_omap4470()) {
		pwrdm_state2string(s0, (pwrdm_state)
			extract_bitfield(pm_pda_cpu0_pwrstst, 24, 2));
		pwrdm_state2string(s1, (pwrdm_state)
			extract_bitfield(pm_pda_cpu1_pwrstst, 24, 2));
		fprintf(stream, "| %-30s | %-9s | %-9s |\n", "Last Power State",
			s0, s1);
	}
	fprintf(stream, "| %-30s | %-9s | %-9s |\n", "Last L1$ Context",
		((extract_bit(rm_pda_cpu0_context, 8) == 1) ?
			"LOST" : "RETAINED"),
		((extract_bit(rm_pda_cpu1_context, 8) == 1) ?
			"LOST" : "RETAINED"));
	fprintf(stream, "| %-30s | %-9s | %-9s |\n", "Last CPU Context",
		((extract_bit(rm_pda_cpu0_context, 0) == 1) ?
			"LOST" : "RETAINED"),
		((extract_bit(rm_pda_cpu1_context, 0) == 1) ?
			"LOST" : "RETAINED"));
	fprintf(stream, "|----------------------------------------------------"
		"----|\n");
	fprintf(stream, "\n");

	/* SCU Configuration */
	fprintf(stream, "|----------------------------------------------------"
	"----|\n");
	fprintf(stream, "| %-30s | %-9s | %-9s |\n",
		"SCU Configuration", "CPU0", "CPU1");
	fprintf(stream, "|--------------------------------|-----------|-------"
		"----|\n");
	OMAPCONF_SCU_CPU_POWER_STATUS_2_STRING(s0,
		extract_bitfield(scu_cpu_power_status, 0, 2));
	OMAPCONF_SCU_CPU_POWER_STATUS_2_STRING(s1,
		extract_bitfield(scu_cpu_power_status, 8, 2));
	fprintf(stream, "| %-30s | %-9s | %-9s |\n", "CPU Power Status",
		s0, s1);
	fprintf(stream, "|---------------------------------------------------"
		"-----|\n");
	fprintf(stream, "\n");

	/* MPU Power Domain Configuration */
	if (mem_read(OMAP4430_PM_MPU_PWRSTCTRL, &pm_pwstctrl) != 0)
		return OMAPCONF_ERR_REG_ACCESS;
	if (mem_read(OMAP4430_PM_MPU_PWRSTST, &pm_pwstst) != 0)
		return OMAPCONF_ERR_REG_ACCESS;
	ret = pwrdm44xx_config_show(stream, "MPU",
		OMAP4430_PM_MPU_PWRSTCTRL, pm_pwstctrl,
		OMAP4430_PM_MPU_PWRSTST, pm_pwstst);
	if (ret != 0)
		return ret;

	/* MPU Clock Domain Configuration */
	if (mem_read(OMAP4430_CM_MPU_CLKSTCTRL, &cm_clkstctrl) != 0)
		return OMAPCONF_ERR_REG_ACCESS;
	ret = clkdm44xx_config_show(stream, "MPU",
		OMAP4430_CM_MPU_CLKSTCTRL, cm_clkstctrl);
	if (ret != 0)
		return ret;

	/* MPU Module Power Configuration */
	if (mem_read(OMAP4430_CM_MPU_MPU_CLKCTRL, &cm_clkctrl) != 0)
		return OMAPCONF_ERR_REG_ACCESS;
	if (mem_read(OMAP4430_RM_MPU_MPU_CONTEXT, &rm_context) != 0)
		return OMAPCONF_ERR_REG_ACCESS;
	ret = mod44xx_config_show(stream, "MPU",
		OMAP4430_CM_MPU_MPU_CLKCTRL, cm_clkctrl,
		OMAP4430_RM_MPU_MPU_CONTEXT, rm_context);
	if (ret != 0)
		return ret;

	/* MPU DPLL Configuration */
	fprintf(stream, "|----------------------------------------------------"
		"----|\n");
	fprintf(stream, "| MPU DPLL Configuration                             "
		"    |\n");
	fprintf(stream, "|--------------------------------|-------------------"
		"----|\n");
	fprintf(stream, "| %-30s | %-21s |\n", "Status",
		dpll_status_name_get((dpll_status) dpll_mpu_params.status));
	sprintf(s0, "%d", (unsigned int) dpll_mpu_params.M2_speed);
	fprintf(stream, "| %-30s | %-21s |\n", "Clock Speed (MHz)", s0);
	fprintf(stream, "| %-30s | %-21s |\n", "Mode",
		dpll_mode_name_get((dpll_mode) dpll_mpu_params.mode));
	fprintf(stream, "| %-30s | %-21s |\n", "Low-Power Mode",
		(dpll_mpu_params.lpmode == 1) ? "Enabled" : "Disabled");
	fprintf(stream, "| %-30s | %-21s |\n", "Autoidle Mode",
		dpll_autoidle_mode_name_get((dpll_autoidle_mode)
			dpll_mpu_params.autoidle_mode));
	fprintf(stream, "| %-30s | %-21s |\n", "M2 Output Autogating",
		(dpll_mpu_params.M2_autogating == 1) ? "Enabled" : "Disabled");
	fprintf(stream, "|----------------------------------------------------"
		"----|\n");
	fprintf(stream, "\nNB: type \"omapconf dplls cfg\" "
		"for detailed DPLL configuration.\n\n");

	return 0;
}
Example #12
0
/* ------------------------------------------------------------------------*//**
 * @FUNCTION		mpu44xx_regtable_init
 * @BRIEF		initialize reg_table fields (not possible statically)
 * @RETURNS		0 in case of success
 *			OMAPCONF_ERR_CPU
 * @DESCRIPTION		initialize reg_table fields (not possible statically)
 *//*------------------------------------------------------------------------ */
int mpu44xx_regtable_init(void)
{
	int i = 0;

	CHECK_CPU(44xx, OMAPCONF_ERR_CPU);

	/* Init PRCM MPU registers table */
	strcpy(prcm_mpu_reg_table[i].name, "PM_PDA_CPU0_PWRSTCTRL");
	prcm_mpu_reg_table[i++].addr = OMAP4430_PM_PDA_CPU0_PWRSTCTRL;
	strcpy(prcm_mpu_reg_table[i].name, "PM_PDA_CPU0_PWRSTST");
	prcm_mpu_reg_table[i++].addr = OMAP4430_PM_PDA_CPU0_PWRSTST;
	strcpy(prcm_mpu_reg_table[i].name, "RM_PDA_CPU0_CONTEXT");
	prcm_mpu_reg_table[i++].addr = OMAP4430_RM_PDA_CPU0_CPU0_CONTEXT;
	strcpy(prcm_mpu_reg_table[i].name, "RM_PDA_CPU0_RSTCTRL");
	prcm_mpu_reg_table[i++].addr = OMAP4430_RM_PDA_CPU0_CPU0_RSTCTRL;
	strcpy(prcm_mpu_reg_table[i].name, "CM_PDA_CPU0_CLKCTRL");
	prcm_mpu_reg_table[i++].addr = OMAP4430_CM_PDA_CPU0_CPU0_CLKCTRL;
	strcpy(prcm_mpu_reg_table[i].name, "CM_PDA_CPU0_CLKSTCTRL");
	prcm_mpu_reg_table[i++].addr = OMAP4430_CM_PDA_CPU0_CLKSTCTRL;
	strcpy(prcm_mpu_reg_table[i].name, "PM_PDA_CPU1_PWRSTCTRL");
	prcm_mpu_reg_table[i++].addr = OMAP4430_PM_PDA_CPU1_PWRSTCTRL;
	strcpy(prcm_mpu_reg_table[i].name, "PM_PDA_CPU1_PWRSTST");
	prcm_mpu_reg_table[i++].addr = OMAP4430_PM_PDA_CPU1_PWRSTST;
	strcpy(prcm_mpu_reg_table[i].name, "RM_PDA_CPU1_CONTEXT");
	prcm_mpu_reg_table[i++].addr = OMAP4430_RM_PDA_CPU1_CPU1_CONTEXT;
	strcpy(prcm_mpu_reg_table[i].name, "RM_PDA_CPU1_RSTCTRL");
	prcm_mpu_reg_table[i++].addr = OMAP4430_RM_PDA_CPU1_CPU1_RSTCTRL;
	strcpy(prcm_mpu_reg_table[i].name, "CM_PDA_CPU1_CLKCTRL");
	prcm_mpu_reg_table[i++].addr = OMAP4430_CM_PDA_CPU1_CPU1_CLKCTRL;
	strcpy(prcm_mpu_reg_table[i].name, "CM_PDA_CPU1_CLKSTCTRL");
	prcm_mpu_reg_table[i++].addr = OMAP4430_CM_PDA_CPU1_CLKSTCTRL;
	strcpy(prcm_mpu_reg_table[i].name, "PM_MPU_PWRSTCTRL");
	prcm_mpu_reg_table[i++].addr = OMAP4430_PM_MPU_PWRSTCTRL;
	strcpy(prcm_mpu_reg_table[i].name, "PM_MPU_PWRSTST");
	prcm_mpu_reg_table[i++].addr = OMAP4430_PM_MPU_PWRSTST;
	strcpy(prcm_mpu_reg_table[i].name, "RM_MPU_MPU_CONTEXT");
	prcm_mpu_reg_table[i++].addr = OMAP4430_RM_MPU_MPU_CONTEXT;
	strcpy(prcm_mpu_reg_table[i].name, "CM_MPU_CLKSTCTRL");
	prcm_mpu_reg_table[i++].addr = OMAP4430_CM_MPU_CLKSTCTRL;
	strcpy(prcm_mpu_reg_table[i].name, "CM_MPU_MPU_CLKCTRL");
	prcm_mpu_reg_table[i++].addr = OMAP4430_CM_MPU_MPU_CLKCTRL;
	strcpy(prcm_mpu_reg_table[i].name, "CM_MPU_STATICDEP");
	prcm_mpu_reg_table[i++].addr = OMAP4430_CM_MPU_STATICDEP;
	strcpy(prcm_mpu_reg_table[i].name, "CM_MPU_DYNAMICDEP");
	prcm_mpu_reg_table[i++].addr = OMAP4430_CM_MPU_DYNAMICDEP;
	strcpy(prcm_mpu_reg_table[i].name, "SCU_CPU_POWER_STATUS");
	prcm_mpu_reg_table[i++].addr = OMAP4430_SCU_CPU_POWER_STATUS;
	strcpy(prcm_mpu_reg_table[i].name, "CM_CLKMODE_DPLL_MPU");
	prcm_mpu_reg_table[i++].addr = OMAP4430_CM_CLKMODE_DPLL_MPU;
	strcpy(prcm_mpu_reg_table[i].name, "CM_IDLEST_DPLL_MPU");
	prcm_mpu_reg_table[i++].addr = OMAP4430_CM_IDLEST_DPLL_MPU;
	strcpy(prcm_mpu_reg_table[i].name, "CM_AUTOIDLE_DPLL_MPU");
	prcm_mpu_reg_table[i++].addr = OMAP4430_CM_AUTOIDLE_DPLL_MPU;
	strcpy(prcm_mpu_reg_table[i].name, "PRM_IRQSTATUS_MPU_A9");
	prcm_mpu_reg_table[i++].addr = OMAP4430_PRM_IRQSTATUS_MPU;
	strcpy(prcm_mpu_reg_table[i].name, "PRM_IRQSTATUS_MPU_A9_2");
	prcm_mpu_reg_table[i++].addr = OMAP4430_PRM_IRQSTATUS_MPU_2;
	strcpy(prcm_mpu_reg_table[i].name, "PRM_IRQENABLE_MPU_A9");
	prcm_mpu_reg_table[i++].addr = OMAP4430_PRM_IRQENABLE_MPU;
	strcpy(prcm_mpu_reg_table[i].name, "PRM_IRQENABLE_MPU_A9_2");
	prcm_mpu_reg_table[i++].addr = OMAP4430_PRM_IRQENABLE_MPU_2;
	strcpy(prcm_mpu_reg_table[i].name, "END");
	prcm_mpu_reg_table[i].addr = 0;

	/* ES2.0 updates */
	if ((cpu_is_omap4430() && (cpu_revision_get() != REV_ES1_0))
		|| cpu_is_omap4460() || cpu_is_omap4470()) {
		strcpy(omap44xx_prm_irq_names[22], "VC_CORE_VPACK");
		strcpy(omap44xx_prm_irq_names[7], "RESERVED");
		strcpy(omap44xx_prm_irq_names[5], "RESERVED");
	}

	init_done = 1;
	return 0;
}
Example #13
0
/* ------------------------------------------------------------------------*//**
 * @FUNCTION		lib54xx_export
 * @BRIEF		export OMAP registers in XML format into file
 * @RETURNS		0 in case of success
 *			OMAPCONF_ERR_ARG otherwise
 * @param[in]		file: export file name (default if == NULL)
 * @DESCRIPTION		export OMAP registers in XML format into file. If no
 *			file name provided, generate one using current date.
 *//*------------------------------------------------------------------------ */
int lib54xx_export(char *file)
{
	FILE *fp = NULL;
	char default_file[64];
	char export_date[32];
	char version[RELEASE_VERSION_MAX_LENGTH];
	char type[RELEASE_TYPE_MAX_LENGTH];
	char date[RELEASE_DATE_MAX_LENGTH];
	char kversion[KERNEL_VERSION_MAX_LENGTH];
	char kauthor[KERNEL_AUTHOR_MAX_LENGTH];
	char ktoolchain[KERNEL_TOOLCHAIN_MAX_LENGTH];
	char ktype[KERNEL_TYPE_MAX_LENGTH];
	char kdate[KERNEL_DATE_MAX_LENGTH];
	char dev_name[CPU_NAME_MAX_LENGTH];
	char dev_rev[CPU_REVISION_MAX_NAME_LENGTH];
	char dev_type[CPU_DEVICE_TYPE_MAX_NAME_LENGTH];
	char dev_si_type[CPU_SI_TYPE_MAX_NAME_LENGTH];
	unsigned int dev_max_speed;
	unsigned int i;
	time_t t;
	struct tm *tmp;

	CHECK_CPU(54xx, OMAPCONF_ERR_CPU);

	/* Get date */
	t = time(NULL);
	tmp = localtime(&t);

	/* Open export file */
	if (file == NULL) {
		/* No file name given, generate default one */
		strcpy(default_file,
			"omapconf_export_Mon_Jan_01_00_00_00_CET_1970.xml");
		if (tmp != NULL)
			strftime(default_file, 64,
				"omapconf_export_%a_%b_%d_%H_%M_%S_%Z_%Y.xml",
				tmp);
		fp = fopen(default_file, "w");
	} else {
		fp = fopen(file, "w");
	}
	if (fp == NULL) {
		printf("Oups... could not create %s!!!\n\n", file);
		return 0;
	}

	/* XML header */
	fprintf(fp, "<?xml version=\"1.0\"?>\n\n");

	strcpy(export_date, "Mon Jan 01 00:00:00 CET 1970");
	if (tmp != NULL)
		strftime(export_date, sizeof(export_date),
			"%a %b %d %H:%M:%S %Z %Y", tmp);

	fprintf(fp,
		"<omapconf_export export_date=\"%s\" omapconf_version=\"%u.%u\" omapconf_builddate=\"%s\">\n",
		export_date, OMAPCONF_REV_MAJOR, OMAPCONF_REV_MINOR, builddate);
	release_details_get(version, type, date);
	if (os_is_android())
		fprintf(fp,
			"  <buildinfo os=\"android\" version=\"%s\" type=\"%s\" date=\"%s\">\n",
			version, type, date);
	else
		fprintf(fp, "  <buildinfo os=\"linux\" version=\"%s\">\n",
			version);

	kernel_details_get(kversion, kauthor, ktoolchain, ktype, kdate);
	fprintf(fp,
		"    <kernel version=\"%s\" author=\"%s\" toolchain=\"%s\" type=\"%s\" date=\"%s\">\n",
		kversion, kauthor, ktoolchain, ktype, kdate);

	cpu_gets(dev_name);
	cpu_revision_gets(dev_rev);
	cpu_device_type_gets(dev_type);
	cpu_silicon_type_gets(dev_si_type);
	dev_max_speed = cpu_silicon_max_speed_get();
	fprintf(fp,
		"      <device name=\"%s\" revision=\"%s\" type=\"%s\" silicon_type=\"%s\" max_speed_mhz=\"%u\">\n",
		dev_name, dev_rev, dev_type, dev_si_type, dev_max_speed);

	/* Export PRM registers */
	fprintf(fp, "        <module name=\"PRM\">\n");
	for (i = 0; i < PRM54XX_MODS_COUNT; i++) {
		if ((cpu_revision_get() != REV_ES1_0) &&
			(i == PRM54XX_L4PER_PRM))
				/* L4_PER does not exist on ES2.x */
				continue;
		prm54xx_export(fp, (prm54xx_mod_id) i);
	}
	fprintf(fp, "        </module>\n");

	/* Export CM registers */
	fprintf(fp, "        <module name=\"CM\">\n");
	for (i = 0; i < CM54XX_MODS_COUNT; i++) {
		if ((cpu_revision_get() != REV_ES1_0) &&
			(i == CM54XX_L4PER_CM_CORE))
			/* Does not exist on ES2.x */
			continue;
		cm54xx_export(fp, (cm54xx_mod_id) i);
	}
	fprintf(fp, "        </module>\n");

	/* Export Smart-Reflex registers */
	fprintf(fp, "        <module name=\"SR\">\n");
	sr54xx_export(fp, SR54XX_SMARTREFLEX_MPU);
	sr54xx_export(fp, SR54XX_SMARTREFLEX_MM);
	sr54xx_export(fp, SR54XX_SMARTREFLEX_CORE);
	fprintf(fp, "        </module>\n");

	/* Export CONTROL MODULE registers */
	fprintf(fp, "        <module name=\"CONTROL MODULE\">\n");
	ctrlmod54xx_export(fp, CTRLMOD54XX_CTRL_MODULE_CORE);
	ctrlmod54xx_export(fp, CTRLMOD54XX_CTRL_MODULE_CORE_PAD);
	ctrlmod54xx_export(fp, CTRLMOD54XX_CTRL_MODULE_WKUP);
	ctrlmod54xx_export(fp, CTRLMOD54XX_CTRL_MODULE_WKUP_PAD);
	fprintf(fp, "        </module>\n");

	/* Export EMIF registers */
	fprintf(fp, "        <module name=\"EMIF\">\n");
	emif54xx_export(fp, EMIF54XX_EMIF1);
	emif54xx_export(fp, EMIF54XX_EMIF2);
	fprintf(fp, "        </module>\n");

	fprintf(fp, "      </device>\n");
	fprintf(fp, "    </kernel>\n");
	fprintf(fp, "  </build>\n");
	fprintf(fp, "</omapconf_export>");

	/* Close file */
	if (fp != NULL)
		fclose(fp);

	if (file == NULL)
		printf("Registers successfully exported in \"%s\" file.\n\n",
			default_file);
	else
		printf("Registers successfully exported in \"%s\" file.\n\n",
			file);

	return 0;
}
Example #14
0
/* ------------------------------------------------------------------------*//**
 * @FUNCTION		pwrdm44xx_config_show
 * @BRIEF		analyze power domain configuration
 * @RETURNS		0 in case of error
 * @param[in,out]	stream: output file
 * @param[in,out]	name: domain name
 * @param[in]		pm_pwstctrl_addr: PM_xyz_PWSTCTRL register address
 * @param[in]		pm_pwstctrl: PM_xyz_PWSTCTRL register content
 * @param[in]		pm_pwstst_addr: PM_xyz_PWSTST register address
 * @param[in]		pm_pwstst: PM_xyz_PWSTST register content
 * @DESCRIPTION		analyze power domain configuration
 *//*------------------------------------------------------------------------ */
int pwrdm44xx_config_show(FILE *stream, const char name[11],
	unsigned int pm_pwstctrl_addr, unsigned int pm_pwstctrl,
	unsigned int pm_pwstst_addr, unsigned int pm_pwstst)
{
	char curr[32], tgt[32], last[32];

	dprintf("%s(): name=%s\n", __func__, name);
	dprintf("%s(): pm_pwstctrl addr=0x%08X\n", __func__, pm_pwstctrl_addr);
	dprintf("%s(): pm_pwstctrl=0x%08X\n", __func__, pm_pwstctrl);
	dprintf("%s(): pm_pwstst addr=0x%08X\n", __func__, pm_pwstst_addr);
	dprintf("%s(): pm_pwstst=0x%08X\n", __func__, pm_pwstst);
	dprintf("\n");

	fprintf(stream, "|---------------------------------------------------"
		"-----------|\n");
	fprintf(stream, "| %-10s Power Domain Configuration                  "
		"      |\n", name);
	fprintf(stream, "|---------------------------------------------------"
		"-----------|\n");
	fprintf(stream, "| %-30s | %-7s | %-7s | %-7s |\n", "Power State",
		"Current", "Target", "Last");
	fprintf(stream, "|--------------------------------|---------|--------"
		"-|---------|\n");
	pwrdm_state2string(curr,
		(pwrdm_state) extract_bitfield(pm_pwstst, 0, 2));
	pwrdm_state2string(tgt,
		(pwrdm_state) extract_bitfield(pm_pwstctrl, 0, 2));
	if ((cpu_is_omap4430() && (cpu_revision_get() != REV_ES1_0)) ||
		cpu_is_omap4460() || cpu_is_omap4470()) {
		switch (pm_pwstst_addr) {
		case OMAP4430_PM_MPU_PWRSTST:
		case OMAP4430_PM_DSP_PWRSTST:
		case OMAP4430_PM_ABE_PWRSTST:
		case OMAP4430_PM_CORE_PWRSTST:
		case OMAP4430_PM_IVAHD_PWRSTST:
		case OMAP4430_PM_L3INIT_PWRSTST:
		case OMAP4430_PM_L4PER_PWRSTST:
			pwrdm_state2string(last, (pwrdm_state)
				extract_bitfield(pm_pwstst, 24, 2));
			break;
		case OMAP4430_PM_CAM_PWRSTST:
		case OMAP4430_PM_DSS_PWRSTST:
		case OMAP4430_PM_GFX_PWRSTST:
		case OMAP4430_PM_EMU_PWRSTST:
			if (!cpu_is_omap4430())
				pwrdm_state2string(last, (pwrdm_state)
					extract_bitfield(pm_pwstst, 24, 2));
			else
				strcpy(last, "");
			break;
		default:
			strcpy(last, "");
		}
	} else {
		strcpy(last, "");
	}
	fprintf(stream, "| %-30s | %-7s | %-7s | %-7s |\n",
		"Domain", curr, tgt, last);

	if ((pm_pwstctrl_addr == OMAP4430_PM_CAM_PWRSTCTRL) ||
			(pm_pwstctrl_addr == OMAP4430_PM_EMU_PWRSTCTRL) ||
			(pm_pwstctrl_addr == OMAP4430_PM_GFX_PWRSTCTRL)) {
		fprintf(stream, "| %-30s | %-7s | %-7s |         |\n", "Logic",
			((extract_bit(pm_pwstst, 2) == 1) ? "ON" : "OFF"),
			"");
	} else {
		fprintf(stream, "| %-30s | %-7s | %-7s |         |\n", "Logic",
			((extract_bit(pm_pwstst, 2) == 1) ? "ON" : "OFF"),
			((extract_bit(pm_pwstctrl, 2) == 1) ? "RET" : "OFF"));
	}
	fprintf(stream, "| %-30s | %-7s | %-7s |         |\n",
		"Memory", "", "");
	switch (pm_pwstctrl_addr) {
	case OMAP4430_PM_CORE_PWRSTCTRL:
		pwrdm_state2string(curr, (pwrdm_state)
			extract_bitfield(pm_pwstst, 12, 2));
		pwrdm_state2string(tgt, (pwrdm_state)
			extract_bit(pm_pwstctrl, 12));
		fprintf(stream, "| %-30s | %-7s | %-7s |         |\n",
			"    OCP_WP Bank & DMM Bank2", curr, tgt);
		break;
	default:
		break;
	}

	switch (pm_pwstctrl_addr) {
	case OMAP4430_PM_IVAHD_PWRSTCTRL:
		pwrdm_state2string(curr, (pwrdm_state)
			extract_bitfield(pm_pwstst, 10, 2));
		pwrdm_state2string(tgt, (pwrdm_state)
			extract_bit(pm_pwstctrl, 11));
		fprintf(stream, "| %-30s | %-7s | %-7s |         |\n",
			"    TCM2", curr, tgt);
		break;
	case OMAP4430_PM_CORE_PWRSTCTRL:
		pwrdm_state2string(curr, (pwrdm_state)
			extract_bitfield(pm_pwstst, 10, 2));
		pwrdm_state2string(tgt, (pwrdm_state)
			extract_bit(pm_pwstctrl, 11));
		fprintf(stream, "| %-30s | %-7s | %-7s |         |\n",
			"    MPU_M3 Unicache", curr, tgt);
	default:
		break;
	}

	switch (pm_pwstctrl_addr) {
	case OMAP4430_PM_MPU_PWRSTCTRL:
		pwrdm_state2string(curr, (pwrdm_state)
			extract_bitfield(pm_pwstst, 8, 2));
		pwrdm_state2string(tgt, (pwrdm_state)
			extract_bit(pm_pwstctrl, 10));
		fprintf(stream, "| %-30s | %-7s | %-7s |         |\n",
			"    RAM", curr, tgt);
		break;
	case OMAP4430_PM_DSP_PWRSTCTRL:
		pwrdm_state2string(curr, (pwrdm_state)
			extract_bitfield(pm_pwstst, 8, 2));
		pwrdm_state2string(tgt, (pwrdm_state)
			extract_bit(pm_pwstctrl, 10));
		fprintf(stream, "| %-30s | %-7s | %-7s |         |\n",
			"    EDMA", curr, tgt);
		break;
	case OMAP4430_PM_DSS_PWRSTCTRL:
	case OMAP4430_PM_CAM_PWRSTCTRL:
	case OMAP4430_PM_GFX_PWRSTCTRL:
		pwrdm_state2string(curr, (pwrdm_state)
			extract_bitfield(pm_pwstst, 4, 2));
		pwrdm_state2string(tgt, (pwrdm_state)
			extract_bit(pm_pwstctrl, 8));
		fprintf(stream, "| %-30s | %-7s | %-7s |         |\n",
			"    MEM", curr, tgt);
		break;
	case OMAP4430_PM_IVAHD_PWRSTCTRL:
		pwrdm_state2string(curr, (pwrdm_state)
			extract_bitfield(pm_pwstst, 8, 2));
		pwrdm_state2string(tgt, (pwrdm_state)
			extract_bit(pm_pwstctrl, 10));
		fprintf(stream, "| %-30s | %-7s | %-7s |         |\n",
			"    TCM1", curr, tgt);
	case OMAP4430_PM_CORE_PWRSTCTRL:
		pwrdm_state2string(curr, (pwrdm_state)
			extract_bitfield(pm_pwstst, 8, 2));
		pwrdm_state2string(tgt, (pwrdm_state)
			extract_bit(pm_pwstctrl, 10));
		fprintf(stream, "| %-30s | %-7s | %-7s |         |\n",
			"    MPU_M3 L2 RAM", curr, tgt);
	default:
		break;
	}

	switch (pm_pwstctrl_addr) {
	case OMAP4430_PM_ABE_PWRSTCTRL:
		pwrdm_state2string(curr, (pwrdm_state)
			extract_bitfield(pm_pwstst, 8, 2));
		pwrdm_state2string(tgt, (pwrdm_state)
			extract_bit(pm_pwstctrl, 10));
		fprintf(stream, "| %-30s | %-7s | %-7s |         |\n",
			"    PERIPHMEM", curr, tgt);
		pwrdm_state2string(curr, (pwrdm_state)
			extract_bitfield(pm_pwstst, 4, 2));
		pwrdm_state2string(tgt, (pwrdm_state)
			extract_bit(pm_pwstctrl, 8));
		fprintf(stream, "| %-30s | %-7s | %-7s |         |\n",
			"    AESSMEM", curr, tgt);
		break;
	case OMAP4430_PM_MPU_PWRSTCTRL:
		pwrdm_state2string(curr, (pwrdm_state)
			extract_bitfield(pm_pwstst, 6, 2));
		pwrdm_state2string(tgt, (pwrdm_state)
			extract_bit(pm_pwstctrl, 9));
		fprintf(stream, "| %-30s | %-7s | %-7s |         |\n",
			"    L2$", curr, tgt);
		if (cpu_is_omap4430())
			pwrdm_state2string(curr,
				extract_bitfield(pm_pwstst, 4, 2));
		else
			strcpy(curr, ""); /* not available on OMAP44[60-70] */
		pwrdm_state2string(tgt,
			extract_bit(pm_pwstctrl, 8));
		fprintf(stream, "| %-30s | %-7s | %-7s |         |\n",
			"    L1$", curr, tgt);
		break;
	case OMAP4430_PM_DSP_PWRSTCTRL:
		pwrdm_state2string(curr, (pwrdm_state)
			extract_bitfield(pm_pwstst, 6, 2));
		pwrdm_state2string(tgt, (pwrdm_state)
			extract_bit(pm_pwstctrl, 9));
		fprintf(stream, "| %-30s | %-7s | %-7s |         |\n",
			"    L2$", curr, tgt);
		pwrdm_state2string(curr,
			extract_bitfield(pm_pwstst, 4, 2));
		pwrdm_state2string(tgt,
			extract_bit(pm_pwstctrl, 8));
		fprintf(stream, "| %-30s | %-7s | %-7s |         |\n",
			"    L1$", curr, tgt);
		break;
	case OMAP4430_PM_IVAHD_PWRSTCTRL:
		pwrdm_state2string(curr, (pwrdm_state)
			extract_bitfield(pm_pwstst, 6, 2));
		pwrdm_state2string(tgt, (pwrdm_state)
			extract_bit(pm_pwstctrl, 9));
		fprintf(stream, "| %-30s | %-7s | %-7s |         |\n",
			"    SL2", curr, tgt);
		pwrdm_state2string(curr, (pwrdm_state)
			extract_bitfield(pm_pwstst, 4, 2));
		pwrdm_state2string(tgt, (pwrdm_state)
			extract_bit(pm_pwstctrl, 8));
		fprintf(stream, "| %-30s | %-7s | %-7s |         |\n",
			"    HWA", curr, tgt);
		break;
	case OMAP4430_PM_L4PER_PWRSTCTRL:
		pwrdm_state2string(curr, (pwrdm_state)
			extract_bitfield(pm_pwstst, 6, 2));
		pwrdm_state2string(tgt, (pwrdm_state)
			extract_bit(pm_pwstctrl, 9));
		fprintf(stream, "| %-30s | %-7s | %-7s |         |\n",
			"    NONRETAINED", curr, tgt);
		pwrdm_state2string(curr, (pwrdm_state)
			extract_bitfield(pm_pwstst, 4, 2));
		pwrdm_state2string(tgt, (pwrdm_state)
			extract_bit(pm_pwstctrl, 8));
		fprintf(stream, "| %-30s | %-7s | %-7s |         |\n",
			"    RETAINED", curr, tgt);
		break;
	case OMAP4430_PM_CORE_PWRSTCTRL:
		pwrdm_state2string(curr, (pwrdm_state)
			extract_bitfield(pm_pwstst, 6, 2));
		pwrdm_state2string(tgt, (pwrdm_state)
			extract_bit(pm_pwstctrl, 9));
		fprintf(stream, "| %-30s | %-7s | %-7s |         |\n",
			"    OCM RAM", curr, tgt);
		pwrdm_state2string(curr, (pwrdm_state)
			extract_bitfield(pm_pwstst, 4, 2));
		pwrdm_state2string(tgt, (pwrdm_state)
			extract_bit(pm_pwstctrl, 8));
		fprintf(stream, "| %-30s | %-7s | %-7s |         |\n",
			"    DMA/ICR Bank & DMM Bank1", curr, tgt);
		break;
	case OMAP4430_PM_L3INIT_PWRSTCTRL:
		pwrdm_state2string(curr, (pwrdm_state)
			extract_bitfield(pm_pwstst, 4, 2));
		pwrdm_state2string(tgt, (pwrdm_state)
			extract_bit(pm_pwstctrl, 8));
		fprintf(stream, "| %-30s | %-7s | %-7s |         |\n",
			"    L3INIT Bank1", curr, tgt);
		break;
	case OMAP4430_PM_EMU_PWRSTCTRL:
		pwrdm_state2string(curr, (pwrdm_state)
			extract_bitfield(pm_pwstst, 4, 2));
		pwrdm_state2string(tgt, (pwrdm_state)
			extract_bitfield(pm_pwstctrl, 16, 2));
		fprintf(stream, "| %-30s | %-7s | %-7s |         |\n",
			"    EMU Bank", curr, tgt);
		break;
	default:
		break;
	}
	fprintf(stream, "|---------------------------------------------------"
		"-----------|\n");
	fprintf(stream, "| %-30s | %-27s |\n", "Ongoing Power Transition?",
		((extract_bit(pm_pwstst, 20) == 1) ? "YES" : "NO"));
	fprintf(stream, "|---------------------------------------------------"
		"-----------|\n");
	fprintf(stream, "\n");

	return 0;
}
Example #15
0
/* ------------------------------------------------------------------------*//**
 * @FUNCTION		cpu_detect
 * @BRIEF		Detect cpu and set internal global variables accordingly
 * @RETURNS		0 on success
 *			OMAPCONF_ERR_UNEXPECTED
 *			OMAPCONF_ERR_CPU if cpu not recognized
 *			OMAPCONF_ERR_REG_ACCESS
 * @param[in]		none
 * @DESCRIPTION		Detect cpu and set internal global variables accordingly
 *//*------------------------------------------------------------------------ */
int cpu_detect(void)
{
	unsigned int status;
	unsigned int efuse;
	unsigned int prod_id_1;
	int ret;
	unsigned char status_bit_start;

	#ifdef CPUID_DEBUG
	char s[CPU_FULL_NAME_MAX_LENGTH];
	char rev_s[CPU_REVISION_MAX_NAME_LENGTH];
	char dev_type_s[CPU_DEVICE_TYPE_MAX_NAME_LENGTH];
	#endif

	/* Init variables */
	cpu_init();

	/* Retrieve OMAP chip & ES */
	/* Determine if device is of the AM or OMAP family */
	if (cpu_is_omap())
		ret = identify_omap();
	else
		ret = identify_sitara();

	if (ret)
		return ret;

	dprintf("%s(): Chip is %s ES%s\n", __func__,
		cpu_gets(s), cpu_revision_gets(rev_s));


	/* Retrieve device type */
	if (cpu_is_omap44xx()) {
		ret = mem_read(OMAP44XX_STATUS, &status);
		status_bit_start = 8;
	} else if (cpu_is_omap54xx() || cpu_is_dra7xx()) {
		ret = mem_read(OMAP54XX_STATUS, &status);
		status_bit_start = 6;
	} else if (cpu_is_am335x() || cpu_is_am437x()) {
		ret = mem_read(AM335X_STATUS, &status);
		status_bit_start = 8;
	} else {
		ret = -1;
	}

	if (ret)
		return OMAPCONF_ERR_REG_ACCESS;
	dprintf("%s(): OMAP44XX_STATUS = 0x%08X\n", __func__, status);
	switch (extract_bitfield(status, status_bit_start, 2)) {
	case 3:
		cpu_device_type_set(DEV_GP);
		break;
	case 2:
		cpu_device_type_set(DEV_HS);
		break;
	case 1:
		cpu_device_type_set(DEV_EMU);
		break;
	default:
		cpu_device_type_set(DEV_TEST);
	}
	dprintf("%s(): Device Type is %s\n", __func__,
		cpu_device_type_gets(dev_type_s));

	/* Retrieve silicon performance type from EFuse */
	if (cpu_is_omap44xx()) {
		if (mem_read(CONTROL_STD_FUSE_PROD_ID_1, &prod_id_1) != 0) {
			fprintf(stderr,
				"omapconf (%s()): could not read CONTROL_STD_FUSE_PROD_ID_1 register!\n",
				__func__);
			return OMAPCONF_ERR_REG_ACCESS;
		}
		dprintf("%s(): CONTROL_STD_FUSE_PROD_ID_1 = 0x%08X\n",
			__func__, prod_id_1);
		si_type = (silicon_type) extract_bitfield(prod_id_1, 16, 2);
	} else if (cpu_is_omap54xx()) {
		if (cpu_revision_get() == REV_ES1_0) {
			if (cpu_silicon_max_speed_get() != 1200)
				cpu_silicon_type_set(STANDARD_PERF_SI);
			else
				cpu_silicon_type_set(SPEEDBIN_SI);
		} else {
			if (cpu_silicon_max_speed_get() != 1700)
				cpu_silicon_type_set(STANDARD_PERF_SI);
			else
				cpu_silicon_type_set(SPEEDBIN_SI);
		}
	} else if (cpu_is_dra7xx()) {
		/* TBD: implement true detection when ID data is available */
		cpu_silicon_type_set(STANDARD_PERF_SI);

	} else if (cpu_is_am335x()){
		if (mem_read(EFUSE_SMA_REG, &efuse) != 0) {
			fprintf(stderr,
				"omapconf: (%s()): could not read EFUSE_SMA register!\n",
				__func__);
			return OMAPCONF_ERR_REG_ACCESS;
		}
		switch (extract_bitfield(efuse, 16, 2)) {
		case 0:
			/*
			 * Silicon revision 1.0 does not support EFUSE SMA REG
			 * (returns all 0's if read)
			 * Setting as unknown until there is an alternate method
			 */
			cpu_package_type_set(PACKAGE_TYPE_MAX);
			break;
		case 1:
			cpu_package_type_set(ZCZ);
			break;
		case 2:
			cpu_package_type_set(ZCE);
			break;
		default:
			fprintf(stderr,
				"omapconf: (%s()): could not identify package type!\n",
				__func__);
			return OMAPCONF_ERR_UNEXPECTED;
		}
	}
	dprintf("%s(): Silicon performance type is %s (%uMHz)\n",
		__func__, cpu_silicon_type_gets(s),
		cpu_silicon_max_speed_get());

	/* Set CPU full name */
	cpu_full_name_set();
	dprintf("%s(): CPU full name is %s\n", __func__, cpu_full_name);

	return 0;
}
Example #16
0
/* ------------------------------------------------------------------------*//**
 * @FUNCTION		emif54xx_dump
 * @BRIEF		dump selected registers
 * @RETURNS		0 in case of success
 *			OMAPCONF_ERR_CPU
 *			OMAPCONF_ERR_ARG
 * @param[in,out]	stream: output stream
 * @param[in]		id: EMIF module ID
 *			If id == EMIF54XX_MODS_COUNT, dump all EMIF registers.
 * @DESCRIPTION		dump selected registers and pretty-print it in selected
 *			output stream
 *//*------------------------------------------------------------------------ */
int emif54xx_dump(FILE *stream, emif54xx_mod_id id)
{
	unsigned int i = 0, mid, accessible;
	unsigned int val = 0;
	int err = 0;
	reg **mod;
	reg *r;
	char s[TABLE_MAX_ELT_LEN];
	char table[TABLE_MAX_ROW][TABLE_MAX_COL][TABLE_MAX_ELT_LEN];
	unsigned int row;


	CHECK_CPU(54xx, OMAPCONF_ERR_CPU);
	CHECK_NULL_ARG(stream, OMAPCONF_ERR_ARG);

	if (id > EMIF54XX_MODS_COUNT) {
		fprintf(stderr, "%s(): id (%u) > EMIF54XX_MODS_COUNT!!! (%u)\n",
			__func__, id, EMIF54XX_MODS_COUNT);
		err = OMAPCONF_ERR_ARG;
		goto emif54xx_dump_end;
	}

	autoadjust_table_init(table);
	row = 0;

	if (id != EMIF54XX_MODS_COUNT)
		snprintf(table[row][0], TABLE_MAX_ELT_LEN, "%s Reg. Name",
			emif54xx_mod_name_get(id));
	else
		strncpy(table[row][0], "EMIF Reg. Name", TABLE_MAX_ELT_LEN);
	strncpy(table[row][1], "Reg. Address",
		TABLE_MAX_ELT_LEN);
	strncpy(table[row][2], "Reg. Value", TABLE_MAX_ELT_LEN);
	row++;

	for (mid = 0; mid < EMIF54XX_MODS_COUNT; mid++) {
		if ((id != EMIF54XX_MODS_COUNT) && (mid != id))
			continue;
		else {
			switch (mid) {
			case EMIF54XX_EMIF1:
				accessible = module_is_accessible(MOD_EMIF1);
				break;
			case EMIF54XX_EMIF2:
				accessible = module_is_accessible(MOD_EMIF2);
				break;
			default:
				accessible = 0;
			}

			if (!accessible) {
				printf("%s module is not running, registers not"
					" accessible.\n",
					emif54xx_mod_name_get(mid));
				return 0;
			}

			if (cpu_revision_get() == REV_ES1_0)
				mod = emif54xxes1_mods[mid];
			else
				mod = emif54xx_mods[mid];
			for (i = 0; mod[i] != NULL; i++) {
				r = mod[i];
				/* Read register */
				dprintf("%s(): read %s 0x%08X\n", __func__,
					r->name, r->addr);
				val = reg_read(r);
				dprintf("%s(): OK\n", __func__);
				/* Show register name, addr & content */
				snprintf(s, TABLE_MAX_ELT_LEN, "%s", r->name);
				autoadjust_table_strncpy(table, row, 0, s);

				snprintf(s, TABLE_MAX_ELT_LEN, "0x%08X",
					r->addr);
				autoadjust_table_strncpy(table, row, 1, s);

				snprintf(s, TABLE_MAX_ELT_LEN, "0x%08X", val);
				autoadjust_table_strncpy(table, row++, 2, s);
			}
		}
	}

	autoadjust_table_print(table, row, 3);

emif54xx_dump_end:
	return err;
}
Example #17
0
/**
 * Function: dpll44xx_init_regtable
 * Role: initialize .addr field of reg_table (not possible statically)
 * Parameters:
 *	none
 * Return:
 *	0
 *	OMAPCONF_ERR_CPU
 */
int dpll44xx_init_regtable(void)
{
	unsigned int i = 0;

	CHECK_CPU(44xx, OMAPCONF_ERR_CPU);

	if (dpll44xx_prcm_reg_table_init_done == 1)
		return 0;

	/* Init DPLLs registers table */
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_CLKMODE_DPLL_CORE;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_CLKMODE_DPLL_CORE");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_IDLEST_DPLL_CORE;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_IDLEST_DPLL_CORE");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_AUTOIDLE_DPLL_CORE;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_AUTOIDLE_DPLL_CORE");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_CLKSEL_DPLL_CORE;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_CLKSEL_DPLL_CORE");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_DIV_M2_DPLL_CORE;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_DIV_M2_DPLL_CORE");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_DIV_M3_DPLL_CORE;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_DIV_M3_DPLL_CORE");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_DIV_M4_DPLL_CORE;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_DIV_M4_DPLL_CORE");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_DIV_M5_DPLL_CORE;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_DIV_M5_DPLL_CORE");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_DIV_M6_DPLL_CORE;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_DIV_M6_DPLL_CORE");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_DIV_M7_DPLL_CORE;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_DIV_M7_DPLL_CORE");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_SSC_DELTAMSTEP_DPLL_CORE;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_SSC_DELTAMSTEP_DPLL_CORE");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_SSC_MODFREQDIV_DPLL_CORE;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_SSC_MODFREQDIV_DPLL_CORE");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_EMU_OVERRIDE_DPLL_CORE;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_EMU_OVERRIDE_DPLL_CORE");

	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_CLKMODE_DPLL_PER;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_CLKMODE_DPLL_PER");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_IDLEST_DPLL_PER;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_IDLEST_DPLL_PER");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_AUTOIDLE_DPLL_PER;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_AUTOIDLE_DPLL_PER");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_CLKSEL_DPLL_PER;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_CLKSEL_DPLL_PER");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_DIV_M2_DPLL_PER;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_DIV_M2_DPLL_PER");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_DIV_M3_DPLL_PER;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_DIV_M3_DPLL_PER");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_DIV_M4_DPLL_PER;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_DIV_M4_DPLL_PER");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_DIV_M5_DPLL_PER;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_DIV_M5_DPLL_PER");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_DIV_M6_DPLL_PER;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_DIV_M6_DPLL_PER");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_DIV_M7_DPLL_PER;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_DIV_M7_DPLL_PER");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_SSC_DELTAMSTEP_DPLL_PER;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_SSC_DELTAMSTEP_DPLL_PER");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_SSC_MODFREQDIV_DPLL_PER;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_SSC_MODFREQDIV_DPLL_PER");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_EMU_OVERRIDE_DPLL_PER;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_EMU_OVERRIDE_DPLL_PER");

	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_CLKMODE_DPLL_MPU;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_CLKMODE_DPLL_MPU");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_IDLEST_DPLL_MPU;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_IDLEST_DPLL_MPU");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_AUTOIDLE_DPLL_MPU;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_AUTOIDLE_DPLL_MPU");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_CLKSEL_DPLL_MPU;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_CLKSEL_DPLL_MPU");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_DIV_M2_DPLL_MPU;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_DIV_M2_DPLL_MPU");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_SSC_DELTAMSTEP_DPLL_MPU;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_SSC_DELTAMSTEP_DPLL_MPU");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_SSC_MODFREQDIV_DPLL_MPU;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_SSC_MODFREQDIV_DPLL_MPU");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_BYPCLK_DPLL_MPU;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_BYPCLK_DPLL_MPU");

	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_CLKMODE_DPLL_IVA;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_CLKMODE_DPLL_IVA");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_IDLEST_DPLL_IVA;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_IDLEST_DPLL_IVA");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_AUTOIDLE_DPLL_IVA;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_AUTOIDLE_DPLL_IVA");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_CLKSEL_DPLL_IVA;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_CLKSEL_DPLL_IVA");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_DIV_M4_DPLL_IVA;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_DIV_M4_DPLL_IVA");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_DIV_M5_DPLL_IVA;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_DIV_M5_DPLL_IVA");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_SSC_DELTAMSTEP_DPLL_IVA;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_SSC_DELTAMSTEP_DPLL_IVA");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_SSC_MODFREQDIV_DPLL_IVA;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_SSC_MODFREQDIV_DPLL_IVA");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_BYPCLK_DPLL_IVA;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_BYPCLK_DPLL_IVA");

	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_CLKMODE_DPLL_ABE;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_CLKMODE_DPLL_ABE");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_IDLEST_DPLL_ABE;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_IDLEST_DPLL_ABE");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_AUTOIDLE_DPLL_ABE;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_AUTOIDLE_DPLL_ABE");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_CLKSEL_DPLL_ABE;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_CLKSEL_DPLL_ABE");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_DIV_M2_DPLL_ABE;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_DIV_M2_DPLL_ABE");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_DIV_M3_DPLL_ABE;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_DIV_M3_DPLL_ABE");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_SSC_DELTAMSTEP_DPLL_ABE;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_SSC_DELTAMSTEP_DPLL_ABE");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_SSC_MODFREQDIV_DPLL_ABE;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_SSC_MODFREQDIV_DPLL_ABE");

	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_CLKMODE_DPLL_USB;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_CLKMODE_DPLL_USB");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_IDLEST_DPLL_USB;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_IDLEST_DPLL_USB");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_AUTOIDLE_DPLL_USB;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_AUTOIDLE_DPLL_USB");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_CLKSEL_DPLL_USB;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_CLKSEL_DPLL_USB");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_DIV_M2_DPLL_USB;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_DIV_M2_DPLL_USB");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_SSC_DELTAMSTEP_DPLL_USB;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_SSC_DELTAMSTEP_DPLL_USB");
	dpll44xx_prcm_reg_table[i].addr = OMAP4430_CM_SSC_MODFREQDIV_DPLL_USB;
	strcpy(dpll44xx_prcm_reg_table[i++].name, "CM_SSC_MODFREQDIV_DPLL_USB");

	if (cpu_is_omap4430() && (cpu_revision_get() == REV_ES1_0)) {
		dpll44xx_prcm_reg_table[i].addr =
			OMAP4430_CM_CLKMODE_DPLL_UNIPRO;
		strcpy(dpll44xx_prcm_reg_table[i++].name,
			"CM_CLKMODE_DPLL_UNIPRO");
		dpll44xx_prcm_reg_table[i].addr =
			OMAP4430_CM_IDLEST_DPLL_UNIPRO;
		strcpy(dpll44xx_prcm_reg_table[i++].name,
			"CM_IDLEST_DPLL_UNIPRO");
		dpll44xx_prcm_reg_table[i].addr =
			OMAP4430_CM_AUTOIDLE_DPLL_UNIPRO;
		strcpy(dpll44xx_prcm_reg_table[i++].name,
			"CM_AUTOIDLE_DPLL_UNIPRO");
		dpll44xx_prcm_reg_table[i].addr =
			OMAP4430_CM_CLKSEL_DPLL_UNIPRO;
		strcpy(dpll44xx_prcm_reg_table[i++].name,
			"CM_CLKSEL_DPLL_UNIPRO");
		dpll44xx_prcm_reg_table[i].addr =
			OMAP4430_CM_DIV_M2_DPLL_UNIPRO;
		strcpy(dpll44xx_prcm_reg_table[i++].name,
			"CM_DIV_M2_DPLL_UNIPRO");
		dpll44xx_prcm_reg_table[i].addr =
			OMAP4430_CM_SSC_DELTAMSTEP_DPLL_UNIPRO;
		strcpy(dpll44xx_prcm_reg_table[i++].name,
			"CM_SSC_DELTAMSTEP_DPLL_UNIPRO");
		dpll44xx_prcm_reg_table[i].addr =
			OMAP4430_CM_SSC_MODFREQDIV_DPLL_UNIPRO;
		strcpy(dpll44xx_prcm_reg_table[i++].name,
			"CM_SSC_MODFREQDIV_DPLL_UNIPRO");

		dpll44xx_prcm_reg_table[i].addr =
			OMAP4430_CM_CLKMODE_DPLL_DDRPHY;
		strcpy(dpll44xx_prcm_reg_table[i++].name,
			"CM_CLKMODE_DPLL_DDRPHY");
		dpll44xx_prcm_reg_table[i].addr =
			OMAP4430_CM_IDLEST_DPLL_DDRPHY;
		strcpy(dpll44xx_prcm_reg_table[i++].name,
			"CM_IDLEST_DPLL_DDRPHY");
		dpll44xx_prcm_reg_table[i].addr =
			OMAP4430_CM_AUTOIDLE_DPLL_DDRPHY;
		strcpy(dpll44xx_prcm_reg_table[i++].name,
			"CM_AUTOIDLE_DPLL_DDRPHY");
		dpll44xx_prcm_reg_table[i].addr =
			OMAP4430_CM_CLKSEL_DPLL_DDRPHY;
		strcpy(dpll44xx_prcm_reg_table[i++].name,
			"CM_CLKSEL_DPLL_DDRPHY");
		dpll44xx_prcm_reg_table[i].addr =
			OMAP4430_CM_DIV_M2_DPLL_DDRPHY;
		strcpy(dpll44xx_prcm_reg_table[i++].name,
			"CM_DIV_M2_DPLL_DDRPHY");
		dpll44xx_prcm_reg_table[i].addr =
			OMAP4430_CM_DIV_M4_DPLL_DDRPHY;
		strcpy(dpll44xx_prcm_reg_table[i++].name,
			"CM_DIV_M4_DPLL_DDRPHY");
		dpll44xx_prcm_reg_table[i].addr =
			OMAP4430_CM_DIV_M5_DPLL_DDRPHY;
		strcpy(dpll44xx_prcm_reg_table[i++].name,
			"CM_DIV_M5_DPLL_DDRPHY");
		dpll44xx_prcm_reg_table[i].addr =
			OMAP4430_CM_DIV_M6_DPLL_DDRPHY;
		strcpy(dpll44xx_prcm_reg_table[i++].name,
			"CM_DIV_M6_DPLL_DDRPHY");
		dpll44xx_prcm_reg_table[i].addr =
			OMAP4430_CM_SSC_DELTAMSTEP_DPLL_DDRPHY;
		strcpy(dpll44xx_prcm_reg_table[i++].name,
			"CM_SSC_DELTAMSTEP_DPLL_DDRPHY");
		dpll44xx_prcm_reg_table[i].addr =
			OMAP4430_CM_SSC_MODFREQDIV_DPLL_DDRPHY;
		strcpy(dpll44xx_prcm_reg_table[i++].name,
			"CM_SSC_MODFREQDIV_DPLL_DDRPHY");
	}
	dpll44xx_prcm_reg_table[i].addr = 0;
	strcpy(dpll44xx_prcm_reg_table[i].name, "END");

	dpll44xx_prcm_reg_table_init_done = 1;
	return 0;
}
Example #18
0
/* ------------------------------------------------------------------------*//**
 * @FUNCTION		ctrlmod54xx_io_audit
 * @BRIEF		OMAP5 PADCONF/IO audit.
 * @RETURNS		0 in case of success
 *			OMAPCONF_ERR_ARG
 *			OMAPCONF_ERR_CPU
 * @param[in,out]	stream: output file - NULL: no output (silent)
 * @param[in,out]	err_nbr: pointer to return audit error number
 * @param[in,out]	wng_nbr: pointer to return audit warning number
 * @DESCRIPTION		OMAP5 PADCONF/IO audit.
 *//*------------------------------------------------------------------------ */
int ctrlmod54xx_io_audit(FILE *stream, unsigned int *err_nbr,
	unsigned int *wng_nbr)
{
	const char pass[5] = "pass";
	const char fail[5] = "FAIL";
	const char ignore[5] = "ign.";
	const char warning[5] = "warn";
	char *status;
	char table[TABLE_MAX_ROW][TABLE_MAX_COL][TABLE_MAX_ELT_LEN];
	unsigned int row, i, j, curr, expected, max;
	ctrlmod54xx_golden_item *golden_values;
	reg **ctrlmod_regs;

	CHECK_CPU(54xx, OMAPCONF_ERR_CPU);
	CHECK_NULL_ARG(err_nbr, OMAPCONF_ERR_ARG);
	CHECK_NULL_ARG(wng_nbr, OMAPCONF_ERR_ARG);

	*err_nbr = 0;
	*wng_nbr = 0;

	if (cpu_revision_get() != REV_ES1_0) {
		fprintf(stream,
			"No golden settings available for OMAP5430 ES2.x, sorry...\n\n");
		status = (char *) warning;
		(*wng_nbr)++;
		return OMAPCONF_ERR_CPU;
	}

	for (j = 0; j < 4; j++) {
		autoadjust_table_init(table);
		row = 0;
		switch (j) {
		case 0:
			snprintf(table[row][0], TABLE_MAX_ELT_LEN,
				"CONTROL MODULE CORE registers AUDIT");
			if (cpu_revision_get() == REV_ES1_0) {
				golden_values = (ctrlmod54xx_golden_item *)
					ctrlmod_core54xxes1_golden_values;
				ctrlmod_regs = omap5430es1_ctrl_module_core_mod;
				max = OMAP5430ES1_CTRL_MODULE_CORE_MOD_REGCOUNT;
			} else { /* FIXME WHEN ES2.0 targets available */
				golden_values = (ctrlmod54xx_golden_item *)
					ctrlmod_core54xxes1_golden_values;
				ctrlmod_regs = omap5430_ctrl_module_core_mod;
				max = OMAP5430_CTRL_MODULE_CORE_MOD_REGCOUNT;
			}
			break;
		case 1:
			snprintf(table[row][0], TABLE_MAX_ELT_LEN,
				"CONTROL MODULE CORE PADCONF Registers AUDIT");
			if (cpu_revision_get() == REV_ES1_0) {
				golden_values = (ctrlmod54xx_golden_item *)
					ctrlmod_core_pad54xxes1_golden_values;
				ctrlmod_regs =
					omap5430es1_ctrl_module_core_pad_mod;
				max = OMAP5430_CTRL_MODULE_CORE_PAD_MOD_REGCOUNT;
			} else {
				golden_values = (ctrlmod54xx_golden_item *)
					ctrlmod_core_pad54xxes1_golden_values;
				ctrlmod_regs =
					omap5430_ctrl_module_core_pad_mod;
				max = OMAP5430_CTRL_MODULE_CORE_PAD_MOD_REGCOUNT;
			}
			break;
		case 2:
			snprintf(table[row][0], TABLE_MAX_ELT_LEN,
				"CONTROL MODULE WKUP Registers AUDIT");
			if (cpu_revision_get() == REV_ES1_0) {
				golden_values = (ctrlmod54xx_golden_item *)
					ctrlmod_wkup54xxes1_golden_values;
				ctrlmod_regs = omap5430es1_ctrl_module_wkup_mod;
				max = OMAP5430ES1_CTRL_MODULE_WKUP_MOD_REGCOUNT;
			} else { /* FIXME WHEN ES2.0 targets available */
				golden_values = (ctrlmod54xx_golden_item *)
					ctrlmod_wkup54xxes1_golden_values;
				ctrlmod_regs = omap5430_ctrl_module_wkup_mod;
				max = OMAP5430ES1_CTRL_MODULE_WKUP_MOD_REGCOUNT;
			}
			break;
		case 3:
			snprintf(table[row][0], TABLE_MAX_ELT_LEN,
				"CONTROL MODULE WKUP PADCONF Registers AUDIT");
			if (cpu_revision_get() == REV_ES1_0) {
				golden_values = (ctrlmod54xx_golden_item *)
					ctrlmod_wkup_pad54xxes1_golden_values;
				ctrlmod_regs = omap5430_ctrl_module_wkup_pad_mod;
				max = OMAP5430_CTRL_MODULE_WKUP_PAD_MOD_REGCOUNT;
			} else { /* FIXME WHEN ES2.0 targets available */
				golden_values = (ctrlmod54xx_golden_item *)
					ctrlmod_wkup_pad54xxes1_golden_values;
				ctrlmod_regs = omap5430_ctrl_module_wkup_pad_mod;
				max = OMAP5430_CTRL_MODULE_WKUP_PAD_MOD_REGCOUNT;
			}
			break;

		}
		snprintf(table[row][1], TABLE_MAX_ELT_LEN, "Current");
		snprintf(table[row][2], TABLE_MAX_ELT_LEN, "Expected");
		snprintf(table[row++][3], TABLE_MAX_ELT_LEN, "STATUS");

		for (i = 0; i < max; i++) {
			/* Read register */
			curr = reg_read(ctrlmod_regs[i]);

			/* Store name & register read content in table */
			snprintf(table[row][0], TABLE_MAX_ELT_LEN, "%s",
				(ctrlmod_regs[i])->name);
			snprintf(table[row][1], TABLE_MAX_ELT_LEN, "0x%08X",
				curr);

			/* Compare to golden value */
			switch (golden_values[i].valid) {
			case DATA_INVALID:
			case DATA_TBD:
				status = (char *) warning;
				(*wng_nbr)++;
				snprintf(table[row][2], TABLE_MAX_ELT_LEN,
					"   TBD");
				break;

			case DATA_VALID:
				expected = golden_values[i].golden_value;
				snprintf(table[row][2], TABLE_MAX_ELT_LEN,
					"0x%08X", expected);
				if (curr != expected) {
					status = (char *) fail;
					(*err_nbr)++;
				} else {
					status = (char *) pass;
				}
				break;

			case DATA_IGNORE:
				status = (char *) ignore;
				break;

			default:
				fprintf(stderr,
					"%s(): something's wrong here?! (j=%u, "
					"i=%u, golden_values[i].valid=%u)\n",
					__func__, j, i,	golden_values[i].valid);
			}
			/* Store status in table */
			snprintf(table[row++][3], TABLE_MAX_ELT_LEN, "%s",
				status);
		}

		if (stream != NULL) {
			autoadjust_table_fprint(stream, table, row, 4);
			fprintf(stream, " ### WARNING: PRELIMINARY ###\n");
			fprintf(stream, " ### GOLDEN VALUES STILL TO BE "
				"VERIFIED/COMPLETED!!! ###\n\n");
		}
	}

	/* Print audit results summary */
	if (stream != NULL) {
		if (*err_nbr == 0)
			fprintf(stream, "\nSUCCESS! Clock Speed audit "
				"completed with 0 error (%d warning(s))\n\n",
				*wng_nbr);
		else
			fprintf(stream, "\nFAILED! Clock Speed audit "
				"completed with %d error and %d warning.\n\n",
				*err_nbr, *wng_nbr);
	}

	return 0;
}