Esempio n. 1
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
	}
}
Esempio n. 2
0
const char *opp_by_voltage_get(const char *voltdm, unsigned short quiet)
{
	int volt;
	opp_t opp;
	const genlist *opp_list;
	int i, opp_count;
	const char *opp_name = NULL;
	const char *opp_name2 = NULL;

	CHECK_NULL_ARG(voltdm, NULL);

	opp_init();

	volt = voltdm_nominal_voltage_get(voltdm);
	if (volt < 0) {
		dprintf("%s(%s): could not get voltage!\n", __func__, voltdm);
		return NULL;
	}
	dprintf("%s(%s): nominal voltage is %duV\n", __func__, voltdm, volt);

	opp_list = opp_list_get(voltdm);
	if (opp_list == NULL) {
		dprintf("%s(%s): could not get OPP list!\n", __func__, voltdm);
		return NULL;
	}

	opp_count = opp_count_get(voltdm);
	if (opp_count <= 0) {
		dprintf("%s(%s): could not get OPP count!\n", __func__, voltdm);
		return NULL;
	}
	dprintf("%s(%s): found %d possible OPP\n", __func__, voltdm, opp_count);

	for (i = 0; i < opp_count; i++) {
		genlist_get((genlist *) opp_list, i, (opp_t *) &opp);
		dprintf("%s(%s): POR nominal voltage for %s is %duV\n",
			__func__, voltdm, opp.name, opp.voltage);
		if (volt == opp.voltage) {
			/*
			 * OPP DPLL_CASC and OPP[50-NOM] shares the same
			 * voltage.
			 * This is also the case for OPP_NITRO and OPP_NITRO_SB.
			 * Must double-check with frequencies.
			 */
			if ((strcmp(opp.name, OPP_DPLL_CASC) != 0) &&
				(strcmp(opp.name, OPP_NITRO) != 0)) {
				opp_name = opp.name;
				dprintf("%s(%s): OPP found: %s\n", __func__,
				voltdm, opp_name);
				break;
			}
			dprintf(
				"%s(%s): %s found, double-checking using rates (same voltage apply to more than 1 OPP.\n",
				__func__, voltdm, opp.name);
			opp_name2 = opp_by_rate_get(voltdm, 1);
			if (strcmp(opp_name2, opp.name) == 0) {
				opp_name = opp.name;
				dprintf("%s(%s): OPP found: %s\n", __func__,
				voltdm, opp_name);
				break;
			}
			dprintf(
				"%s(%s): this was not %s, but probably the next one.\n",
				__func__, voltdm, opp.name);
		}
	}

	if ((quiet == 0) && (opp_name == NULL))
		fprintf(stdout,
			"omapconf: warning: no matching %s OPP for %lfV nominal voltage. Please check voltage against Data Manual recommendations.\n",
			voltdm, uv2v(volt));

	return opp_name;
}
Esempio n. 3
0
/* ------------------------------------------------------------------------*//**
 * @FUNCTION		opp_show
 * @BRIEF		show current operating voltages and key clock rates.
 * @RETURNS		0 in case of success
 *			OMAPCONF_ERR_REG_ACCESS
 *			OMAPCONF_ERR_CPU
 *			OMAPCONF_ERR_INTERNAL
 * @param[in,out]	stream: output file stream (opened, != NULL)
 * @DESCRIPTION		show current operating voltages and key clock rates.
 *//*------------------------------------------------------------------------ */
int opp_show(FILE *stream)
{
	int volt, volt2;
	const char *opp_s, *opp_s2;
	int temp;
	int rate_mpu, rate_mpu_por;
	int rate_dsp, rate_iva, rate_gpu;
	int rate_dsp_por, rate_iva_por, rate_gpu_por, rate_aess_por;
	int rate_l3, rate_l3_por;
	int rate_l4, rate_emif, rate_lpddr2, rate_aess, rate_iss,
		rate_fdif, rate_dss, rate_bb2d, rate_hsi;
	mod_module_mode mmode;
	int rate_cal, rate_ipu, rate_c2c;
	char table[TABLE_MAX_ROW][TABLE_MAX_COL][TABLE_MAX_ELT_LEN];
	unsigned int row = 0;
	unsigned int retry_cnt = 0;
	unsigned int found = 0;
	const genlist *voltdm_list;
	int i, vdd_count;
	const char voltdm[VOLTDM_MAX_NAME_LENGTH];
	char prev_gov[CPUFREQ_GOV_MAX_NAME_LENGTH],
		prev_gov2[CPUFREQ_GOV_MAX_NAME_LENGTH];
	const char *temp_sensor;

	/* Switch to userspace governor temporarily,
	 * so that OPP cannot change during audit and does not false it.
	 */
	cpufreq_scaling_governor_set("userspace", prev_gov);

	autoadjust_table_init(table);
	row = 0;
	strncpy(table[row][1], "Temperature", TABLE_MAX_ELT_LEN);
	strncpy(table[row][2], "Voltage", TABLE_MAX_ELT_LEN);
	strncpy(table[row][3], "Frequency", TABLE_MAX_ELT_LEN);
	strncpy(table[row][4], "OPerating Point", TABLE_MAX_ELT_LEN);
	row++;

	/*
	 * In order to make sure all details (OPP, voltage, clock rates) are
	 * coherent (due to potential OPP change in between), must use a loop,
	 * checking that OPP and voltage did not change and that at least ONE
	 * clock rate is aligned to expected rate for the detected OPP.
	 */
	dprintf("%s():\n", __func__);

	voltdm_list = voltdm_list_get();
	if (voltdm_list == NULL)
		return OMAPCONF_ERR_INTERNAL;
	vdd_count = voltdm_count_get();
	if (vdd_count < 0)
		return OMAPCONF_ERR_INTERNAL;
	dprintf("found %d voltage domains\n", vdd_count);
	for (i = 1; i < vdd_count; i++) {
		genlist_get((genlist *) voltdm_list, i, (char *) &voltdm);
		snprintf(table[row][0], TABLE_MAX_ELT_LEN, "%s / VDD_CORE%u",
				voltdm, i);
		dprintf("  %s:\n", voltdm);

		/* Retrieve OPP and clock rates */
		retry_cnt = 0;
		found = 0;
		do {
			dprintf("    TRY #%u:\n", retry_cnt);
			if (retry_cnt == 0)
				/* Print warning on first try */
				opp_s = opp_get(voltdm, 0);
			else
				opp_s = opp_get(voltdm, 1);
			if (opp_s == NULL) {
				dprintf("      OPP NOT detected!\n");
				opp_s = OPP_UNKNOWN;
			} else {
				dprintf("      OPP detected: %s\n", opp_s);
			}

			volt = voltdm_voltage_get(voltdm);
			dprintf("      Voltage: %duV\n", volt);

			if (strcmp(voltdm, "VDD_MPU") == 0) {
				rate_mpu = mod_clk_rate_get("MPU");
				if (strcmp(opp_s, OPP_UNKNOWN) != 0)
					rate_mpu_por = mod_por_clk_rate_get(
						"MPU", opp_s);
				else
					rate_mpu_por = -1;
				dprintf(
					"      MPU Rate: %dKHz, POR Rate: %dKHz\n",
					rate_mpu, rate_mpu_por);
			} else if ((strcmp(voltdm, "VDD_IVA") == 0) ||
				(strcmp(voltdm, "VDD_MM") == 0)) {
				rate_dsp_por = -1;
				rate_iva_por = -1;
				rate_aess_por = -1;
				rate_gpu_por = -1;
				rate_dsp = mod_clk_rate_get("DSP");
				rate_iva = mod_clk_rate_get("IVA");
				if (cpu_is_omap44xx())
					rate_aess = mod_clk_rate_get("AESS");
				else if (cpu_is_omap54xx())
					rate_gpu = mod_clk_rate_get("GPU");

				if (strcmp(opp_s, OPP_UNKNOWN) != 0) {
					rate_dsp_por = mod_por_clk_rate_get(
						"DSP", opp_s);
					rate_iva_por = mod_por_clk_rate_get(
						"IVA", opp_s);
					if (cpu_is_omap44xx())
						rate_aess_por =
							mod_por_clk_rate_get(
								"AESS", opp_s);
					else if (cpu_is_omap54xx())
						rate_gpu_por =
							mod_por_clk_rate_get(
								"GPU", opp_s);
				}
				dprintf(
					"      DSP Rate: %dMHz, POR Rate: %dMHz\n",
					rate_dsp, rate_dsp_por);
				dprintf(
					"      IVA Rate: %dMHz, POR Rate: %dMHz\n",
					rate_iva, rate_iva_por);
				if (cpu_is_omap44xx()) {
					dprintf(
						"      AESS Rate: %dMHz, POR Rate: %dMHz\n",
						rate_aess, rate_aess_por);
				} else if (cpu_is_omap54xx()) {
					dprintf(
						"      GPU Rate: %dMHz, POR Rate: %dMHz\n",
						rate_gpu, rate_gpu_por);
				}
			} else if (strcmp(voltdm, "VDD_CORE") == 0) {
				rate_l3 = mod_clk_rate_get("L3");
				if (strcmp(opp_s, OPP_UNKNOWN) != 0)
					rate_l3_por = mod_por_clk_rate_get(
						"L3", opp_s);
				else
					rate_l3_por = -1;
				dprintf(
					"      L3_1 Rate: %dMHz, POR Rate: %dMHz\n",
					rate_l3, rate_l3_por);

				rate_emif = mod_clk_rate_get("EMIF");
				rate_lpddr2 = mod_clk_rate_get("MEM");
				rate_l4 = mod_clk_rate_get("L4");
				if (cpu_is_omap44xx())
					rate_gpu = mod_clk_rate_get("GPU");
				else if (cpu_is_omap54xx())
					rate_aess = mod_clk_rate_get("AESS");
				rate_iss = mod_clk_rate_get("ISS");
				rate_fdif = mod_clk_rate_get("FDIF");
				if (!cpu_is_omap44xx())
					rate_cal = mod_clk_rate_get("CAL");
				else
					rate_cal = -1;
				rate_ipu = mod_clk_rate_get("IPU");
				rate_dss = mod_clk_rate_get("DSS");
				rate_hsi = mod_clk_rate_get("HSI");
				if (cpu_is_omap4470() || cpu_is_omap54xx())
					rate_bb2d = mod_clk_rate_get("BB2D");
				else
					rate_bb2d = -1;
				rate_c2c = mod_clk_rate_get("C2C");
			}


			if (strcmp(opp_s, OPP_UNKNOWN) == 0) {
				dprintf(
					"      Could not detect OPP, aborting for this domain.\n");
				break;
			}

			opp_s2 = opp_get(voltdm, 1);
			if (opp_s2 == NULL) {
				dprintf("      OPP NOT detected! (2)\n");
				opp_s2 = OPP_UNKNOWN;
			} else {
				dprintf("      OPP detected: %s (2)\n", opp_s2);
			}

			volt2 = voltdm_voltage_get(voltdm);
			dprintf("      Voltage (2): %dV\n", volt2);

			if (strcmp(voltdm, "VDD_MPU") == 0) {
				found = ((rate_mpu == rate_mpu_por) &&
					(strcmp(opp_s, opp_s2) == 0) &&
					(volt == volt2));
			} else if (strcmp(voltdm, "VDD_IVA") == 0) {
				found = ((strcmp(opp_s, opp_s2) == 0) &&
					(volt == volt2) &&
					(((unsigned int) rate_dsp == (unsigned int) rate_dsp_por) ||
						((unsigned int) rate_iva == (unsigned int) rate_iva_por) ||
						((unsigned int) rate_aess == (unsigned int) rate_aess_por)));
			} else if (strcmp(voltdm, "VDD_MM") == 0) {
				found = ((strcmp(opp_s, opp_s2) == 0) &&
					(volt == volt2) &&
					((rate_dsp == rate_dsp_por) ||
						(rate_iva == rate_iva_por) ||
						(rate_gpu == rate_gpu_por)));
			} else if (strcmp(voltdm, "VDD_CORE") == 0) {
				found = ((strcmp(opp_s, opp_s2) == 0) &&
					(volt == volt2) &&
					(rate_l3 == rate_l3_por));
			}
			dprintf("      found=%u\n", found);

			retry_cnt++;
		} while ((retry_cnt < OPP_MAX_RETRY) && (found == 0));

		/* Print temperature */
		temp_sensor = temp_sensor_voltdm2sensor(voltdm);
		if (temp_sensor == NULL) {
			snprintf(table[row][1], TABLE_MAX_ELT_LEN, "NA");
		} else {
			temp = temp_sensor_get(temp_sensor);
			if (temp != TEMP_ABSOLUTE_ZERO)
				snprintf(table[row][1], TABLE_MAX_ELT_LEN,
					"%dC / %dF", temp,
					celcius2fahrenheit(temp));
			else
				snprintf(table[row][1], TABLE_MAX_ELT_LEN,
					"NA");
		}

		/* Print voltage */
		if (volt < 0)
			snprintf(table[row][2], TABLE_MAX_ELT_LEN, "NA");
		else if (!cpu_is_omap44xx())
			snprintf(table[row][2], TABLE_MAX_ELT_LEN, "%.3lf V",
				uv2v(volt));
		else
			snprintf(table[row][2], TABLE_MAX_ELT_LEN, "%.6lf V",
				uv2v(volt));

		/* Print OPP */
		if (retry_cnt < OPP_MAX_RETRY) {
			strncpy(table[row][4], opp_s,
				TABLE_MAX_ELT_LEN);
		} else {
			fprintf(stderr,
				"omapconf: too many %s OPP changes, could not retrieve it!!!\n",
				voltdm);
			strncpy(table[row][4], "ERROR", TABLE_MAX_ELT_LEN);
		}
		row++;

		/* Print clock rates */
		if (strcmp(voltdm, "VDD_MPU") == 0) {
			if (cpu_is_online(1) == 1)
				strncpy(table[row][0], "  MPU (CPU1 ON)",
					TABLE_MAX_ELT_LEN);
			else
				strncpy(table[row][0], "  MPU (CPU1 OFF)",
					TABLE_MAX_ELT_LEN);
			snprintf(table[row][3], TABLE_MAX_ELT_LEN, " %-4d MHz",
				rate_mpu / 1000);
			row += 2;
		} else if ((strcmp(voltdm, "VDD_IVA") == 0) ||
			(strcmp(voltdm, "VDD_MM") == 0)) {
			strncpy(table[row][0], "  IVA", TABLE_MAX_ELT_LEN);
			mmode = mod_mode_get("IVA");
			if (mmode == MOD_DISABLED_MODE)
				snprintf(table[row][3], TABLE_MAX_ELT_LEN,
					"(%-4d MHz) (1)", rate_iva / 1000);
			else
				snprintf(table[row][3], TABLE_MAX_ELT_LEN,
					" %-4d MHz", rate_iva / 1000);
			row++;

			if (cpu_is_omap44xx()) {
				strncpy(table[row][0], "  AESS",
					TABLE_MAX_ELT_LEN);
				mmode = mod_mode_get("AESS");
				if (mmode == MOD_DISABLED_MODE)
					snprintf(table[row][3],
						TABLE_MAX_ELT_LEN,
						"(%-4d MHz) (1)",
						rate_aess / 1000);
				else
					snprintf(table[row][3],
						TABLE_MAX_ELT_LEN,
						" %-4d MHz", rate_aess / 1000);
				row++;
			} else if (cpu_is_omap54xx()) {
				strncpy(table[row][0], "  GPU",
					TABLE_MAX_ELT_LEN);
				mmode = mod_mode_get("GPU");
				if (mmode == MOD_DISABLED_MODE)
					snprintf(table[row][3],
						TABLE_MAX_ELT_LEN,
						"(%-4d MHz) (1)",
						rate_gpu / 1000);
				else
					snprintf(table[row][3],
						TABLE_MAX_ELT_LEN,
						" %-4d MHz", rate_gpu / 1000);
				row++;
			}

			strncpy(table[row][0], "  DSP", TABLE_MAX_ELT_LEN);
			mmode = mod_mode_get("DSP");
			if (mmode == MOD_DISABLED_MODE)
				snprintf(table[row][3], TABLE_MAX_ELT_LEN,
					"(%-4d MHz) (1)", rate_dsp / 1000);
			else
				snprintf(table[row][3], TABLE_MAX_ELT_LEN,
					" %-4d MHz", rate_dsp / 1000);
			row += 2;
		} else if (strcmp(voltdm, "VDD_CORE") == 0) {
			strncpy(table[row][0], "  L3", TABLE_MAX_ELT_LEN);
			snprintf(table[row][3], TABLE_MAX_ELT_LEN, " %-4d MHz",
				rate_l3 / 1000);
			row++;

			strncpy(table[row][0], "  DMM/EMIF", TABLE_MAX_ELT_LEN);
			snprintf(table[row][3], TABLE_MAX_ELT_LEN, " %-4d MHz",
				rate_emif / 1000);
			row++;

			strncpy(table[row][0], "    LP-DDR2",
				TABLE_MAX_ELT_LEN);
			snprintf(table[row][3], TABLE_MAX_ELT_LEN, " %-4d MHz",
				rate_lpddr2 / 1000);
			row++;

			strncpy(table[row][0], "  L4", TABLE_MAX_ELT_LEN);
			snprintf(table[row][3], TABLE_MAX_ELT_LEN, " %-4d MHz",
				rate_l4 / 1000);
			row++;

			if (cpu_is_omap44xx()) {
				strncpy(table[row][0], "  GPU",
					TABLE_MAX_ELT_LEN);
				mmode = mod_mode_get("GPU");
				if (mmode == MOD_DISABLED_MODE)
					snprintf(table[row][3],
						TABLE_MAX_ELT_LEN,
						"(%-4d MHz) (1)",
						rate_gpu / 1000);
				else
					snprintf(table[row][3],
						TABLE_MAX_ELT_LEN,
						" %-4d MHz", rate_gpu / 1000);
				row++;
			} else if (cpu_is_omap54xx()) {
				strncpy(table[row][0], "  AESS",
					TABLE_MAX_ELT_LEN);
				mmode = mod_mode_get("AESS");
				if (mmode == MOD_DISABLED_MODE)
					snprintf(table[row][3],
						TABLE_MAX_ELT_LEN,
						"(%-4d MHz) (1)",
						rate_aess / 1000);
				else
					snprintf(table[row][3],
						TABLE_MAX_ELT_LEN,
						" %-4d MHz", rate_aess / 1000);
				row++;
			}

			strncpy(table[row][0], "  FDIF", TABLE_MAX_ELT_LEN);
			mmode = mod_mode_get("FDIF");
			if (mmode == MOD_DISABLED_MODE)
				snprintf(table[row][3], TABLE_MAX_ELT_LEN,
					"(%-4d MHz) (1)", rate_fdif / 1000);
			else
				snprintf(table[row][3], TABLE_MAX_ELT_LEN,
					" %-4d MHz", rate_fdif / 1000);
			row++;

			if (cpu_is_omap54xx()) {
				strncpy(table[row][0], "  CAL",
					TABLE_MAX_ELT_LEN);
				mmode = mod_mode_get("CAL");
				if (mmode == MOD_DISABLED_MODE)
					snprintf(table[row][3],
						TABLE_MAX_ELT_LEN,
						"(%-4d MHz) (1)",
						rate_cal / 1000);
				else
					snprintf(table[row][3],
						TABLE_MAX_ELT_LEN,
						" %-4d MHz",
						rate_cal / 1000);
				row++;
			}

			strncpy(table[row][0], "  IPU", TABLE_MAX_ELT_LEN);
			mmode = mod_mode_get("IPU");
			if (mmode == MOD_DISABLED_MODE)
				snprintf(table[row][3], TABLE_MAX_ELT_LEN,
					"(%-4d MHz) (1)", rate_ipu / 1000);
			else
				snprintf(table[row][3], TABLE_MAX_ELT_LEN,
					" %-4d MHz", rate_ipu / 1000);
			row++;
			if (cpu_is_omap44xx()) {
				strncpy(table[row][0], "    Cortex-M3 Cores",
					TABLE_MAX_ELT_LEN);
				if (mmode == MOD_DISABLED_MODE)
					snprintf(table[row][3],
						TABLE_MAX_ELT_LEN,
						"(%-4d MHz) (1)",
						rate_ipu / 2000);
				else
					snprintf(table[row][3],
						TABLE_MAX_ELT_LEN,
						" %-4d MHz", rate_ipu / 2000);
				row++;
			} else if (cpu_is_omap54xx()) {
				strncpy(table[row][0], "    Cortex-M4 Cores",
					TABLE_MAX_ELT_LEN);
				if (mmode == MOD_DISABLED_MODE)
					snprintf(table[row][3],
						TABLE_MAX_ELT_LEN,
						"(%-4d MHz) (1)",
						rate_ipu / 2000);
				else
					snprintf(table[row][3],
						TABLE_MAX_ELT_LEN,
						" %-4d MHz", rate_ipu / 2000);
				row++;
			}

			strncpy(table[row][0], "  ISS", TABLE_MAX_ELT_LEN);
			mmode = mod_mode_get("ISS");
			if (mmode == MOD_DISABLED_MODE)
				snprintf(table[row][3], TABLE_MAX_ELT_LEN,
					"(%-4d MHz) (1)", rate_iss / 1000);
			else
				snprintf(table[row][3], TABLE_MAX_ELT_LEN,
					" %-4d MHz", rate_iss / 1000);
			row++;

			strncpy(table[row][0], "  DSS", TABLE_MAX_ELT_LEN);
			mmode = mod_mode_get("DSS");
			if (mmode == MOD_DISABLED_MODE)
				snprintf(table[row][3], TABLE_MAX_ELT_LEN,
					"(%-4d MHz) (1)", rate_dss / 1000);
			else
				snprintf(table[row][3], TABLE_MAX_ELT_LEN,
					" %-4d MHz", rate_dss / 1000);
			row++;

			if (cpu_is_omap4470() || cpu_is_omap54xx()) {
				strncpy(table[row][0], "  BB2D",
					TABLE_MAX_ELT_LEN);
				mmode = mod_mode_get("BB2D");
				if (mmode == MOD_DISABLED_MODE)
					snprintf(table[row][3],
						TABLE_MAX_ELT_LEN,
						"(%-4d MHz) (1)",
						rate_bb2d / 1000);
				else
					snprintf(table[row][3],
						TABLE_MAX_ELT_LEN, " %-4d MHz",
						rate_bb2d / 1000);
				row++;
			}

			strncpy(table[row][0], "  HSI", TABLE_MAX_ELT_LEN);
			mmode = mod_mode_get("HSI");
			if (mmode == MOD_DISABLED_MODE)
				snprintf(table[row][3], TABLE_MAX_ELT_LEN,
					"(%-4d MHz) (1)", rate_hsi / 1000);
			else
				snprintf(table[row][3], TABLE_MAX_ELT_LEN,
					" %-4d MHz", rate_hsi / 1000);
			row++;

			strncpy(table[row][0], "  C2C", TABLE_MAX_ELT_LEN);
			mmode = mod_mode_get("C2C");
			if (mmode == MOD_DISABLED_MODE)
				snprintf(table[row][3], TABLE_MAX_ELT_LEN,
					"(%-4d MHz) (1)", rate_c2c / 1000);
			else
				snprintf(table[row][3], TABLE_MAX_ELT_LEN,
					" %-4d MHz", rate_c2c / 1000);
			row++;
		}
	}

	/* Display table */
	autoadjust_table_fprint(stream, table, row, 5);

	fprintf(stream, "Notes:\n");
	fprintf(stream,
		"  (1) Module is disabled, rate may not be relevant.\n\n");

	/* Restore CPUFreq governor */
	cpufreq_scaling_governor_set(prev_gov, prev_gov2);

	return 0;
}
Esempio n. 4
0
/* ------------------------------------------------------------------------*//**
 * @FUNCTION		opp_dra7xx_init
 * @BRIEF		initialize internal data
 * @DESCRIPTION		initialize internal data (architecture dependent)
 *//*------------------------------------------------------------------------ */
void opp_dra7xx_init(void)
{
	static const opp_t core_opp_nom = {OPP_NOM,	1030000, 266000};

	static const opp_t mpu_opp_nom  = {OPP_NOM,	1060000, 1000000};
	static const opp_t mpu_opp_od =   {OPP_OD,	1160000, 1176000};
	static const opp_t mpu_opp_high = {OPP_HIGH,	1250000, 1500000};

	/*
	 * opp_dra7xx_list is just a reference of how many opp that a
	 * voltage manager has, so only need to add either dsp or eve,
	 * to indicating there are opp_nom, and opp_od for VDD_DSPEVE.
	 */
	static const opp_t dsp_opp_nom =  {OPP_NOM,	1060000, 600000};
	static const opp_t dsp_opp_od =   {OPP_OD,	1150000, 700000};

	static const opp_t iva_opp_nom  = {OPP_NOM,	1060000, 388300};
	static const opp_t iva_opp_od =   {OPP_OD,	1160000, 430000};
	static const opp_t iva_opp_high = {OPP_HIGH,	1250000, 532000};

	static const opp_t gpu_opp_nom  = {OPP_NOM,	1060000, 425600};
	static const opp_t gpu_opp_od =   {OPP_OD,	1160000, 500000};
	static const opp_t gpu_opp_high = {OPP_HIGH,	1250000, 532000};

	static const opp_t rtc_opp_nom = {OPP_NOM,	1030000, 34000};

	#ifdef OPP_DRA7XX_DEBUG
	int i, count;
	voltdm_dra7xx_id vdd;
	#endif

	if (!opp_dra7xx_init_done) {
		genlist_init(&vdd_dra7xx_core_opp_list);
		genlist_addtail(&vdd_dra7xx_core_opp_list,
			(void *) &core_opp_nom, sizeof(opp_t));

		genlist_init(&vdd_dra7xx_mpu_opp_list);
		genlist_addtail(&vdd_dra7xx_mpu_opp_list,
			(void *) &mpu_opp_nom, sizeof(opp_t));
		genlist_addtail(&vdd_dra7xx_mpu_opp_list,
			(void *) &mpu_opp_od, sizeof(opp_t));
		genlist_addtail(&vdd_dra7xx_mpu_opp_list,
			(void *) &mpu_opp_high, sizeof(opp_t));

		genlist_init(&vdd_dra7xx_dspeve_opp_list);
		genlist_addtail(&vdd_dra7xx_dspeve_opp_list,
			(void *) &dsp_opp_nom, sizeof(opp_t));
		genlist_addtail(&vdd_dra7xx_dspeve_opp_list,
			(void *) &dsp_opp_od, sizeof(opp_t));

		genlist_init(&vdd_dra7xx_iva_opp_list);
		genlist_addtail(&vdd_dra7xx_iva_opp_list,
			(void *) &iva_opp_nom, sizeof(opp_t));
		genlist_addtail(&vdd_dra7xx_iva_opp_list,
			(void *) &iva_opp_od, sizeof(opp_t));
		genlist_addtail(&vdd_dra7xx_iva_opp_list,
			(void *) &iva_opp_high, sizeof(opp_t));

		genlist_init(&vdd_dra7xx_gpu_opp_list);
		genlist_addtail(&vdd_dra7xx_gpu_opp_list,
			(void *) &gpu_opp_nom, sizeof(opp_t));
		genlist_addtail(&vdd_dra7xx_gpu_opp_list,
			(void *) &gpu_opp_od, sizeof(opp_t));
		genlist_addtail(&vdd_dra7xx_gpu_opp_list,
			(void *) &gpu_opp_high, sizeof(opp_t));

		genlist_init(&vdd_dra7xx_rtc_opp_list);
		genlist_addtail(&vdd_dra7xx_rtc_opp_list,
			(void *) &rtc_opp_nom, sizeof(opp_t));

		opp_dra7xx_init_done = 1;
		#ifdef OPP_DRA7XX_DEBUG
		printf("%s(): init done.\n", __func__);
		printf("OPP List:\n");
		for (vdd = VDD_DRA7XX_WKUP; vdd < VDD_DRA7XX_ID_MAX; vdd++) {
			count = genlist_getcount(
				(genlist *) opp_dra7xx_list_table[vdd]);
			printf("  %s (%d): ", voltdm_dra7xx_name_get(vdd), count);
			for (i = 0; i < count; i++) {
				genlist_get(
					(genlist *) opp_dra7xx_list_table[vdd],
					i, (void *) &opp);
				printf("%s (%.1lfMHz, %.3lfV)",
					opp.name, khz2mhz(opp.rate),
					uv2v(opp.voltage));
				if (i != count - 1)
					printf(", ");
			}
			printf(".\n");
		}
		#endif
	}
}