/* SPDX-License-Identifier: GPL-2.0-or-later */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <inttypes.h>
#include <errno.h>
#include "inteltool.h"

extern volatile uint8_t *mchbar;

static uint32_t read_mchbar32(uint32_t addr)
{
	return *(volatile uint32_t *)(mchbar + addr);
}

static void
print_time(const char *string, unsigned long long time, unsigned long long tCK)
{
	printf(".%s = %lld /* %lld clocks = %.3lf ns */,\n",
	       string, time, time, (time * tCK) / 256.0);
}

static unsigned int
make_spd_time(unsigned long long time, unsigned long long tCK)
{
	return (time * tCK) >> 5;
}

static u16 spd_ddr3_calc_crc(u8 * spd)
{
	int n_crc, i;
	u8 *ptr;
	u16 crc;

	/* Find the number of bytes covered by CRC */
	if (spd[0] & 0x80) {
		n_crc = 117;
	} else {
		n_crc = 126;
	}

	/* Compute the CRC */
	crc = 0;
	ptr = spd;
	while (--n_crc >= 0) {
		crc = crc ^ (int)*ptr++ << 8;
		for (i = 0; i < 8; ++i)
			if (crc & 0x8000) {
				crc = crc << 1 ^ 0x1021;
			} else {
				crc = crc << 1;
			}
	}
	return crc;
}

void ivybridge_dump_timings(const char *dump_spd_file)
{
	u32 mr0[2];
	u32 mr1[2];
	u32 reg;
	unsigned int CAS[2] = { 0 };
	int tWR = 0, tRFC = 0;
	int tFAW[2], tWTR[2], tCKE[2], tRTP[2], tRRD[2];
	int channel, slot;
	u32 reg_4004_b30[2] = { 0, 0 };
	unsigned int tREFI;
	int rankmap[2];
	u32 mad_dimm[2];
	unsigned int tRCD[2], tXP[2], tXPDLL[2], tRAS[2], tCWL[2], tRP[2],
	    tAONPD[2];
	unsigned int tXSOffset;
	int two_channels = 1;
	struct slot_info {
		unsigned int size_mb;
		unsigned int ranks;
		unsigned int width;
	} slots[2][2];
	unsigned int tCK;
	u8 spd[2][2][256];

	memset(slots, 0, sizeof(slots));

	for (channel = 0; channel < 2; channel++) {
		rankmap[channel] = read_mchbar32(0xc14 + 0x100 * channel) >> 24;
	}

	if ((rankmap[0] == 0) && (rankmap[1] == 0)) {
		fputs("Error: no memory channels found\n", stderr);
		exit(1);
	}

	two_channels = rankmap[0] && rankmap[1];

	mr0[0] = read_mchbar32(0x0004);
	mr1[0] = read_mchbar32(0x0008);
	mr0[1] = read_mchbar32(0x0104);
	mr1[1] = read_mchbar32(0x0108);

	if (mr0[0] != mr0[1] && two_channels)
		printf("MR0 mismatch: %x, %x\n", mr0[0], mr0[1]);
	if (mr1[0] != mr1[1] && two_channels)
		printf("MR1 mismatch: %x, %x\n", mr1[0], mr1[1]);

	reg = read_mchbar32(0x5e00) & ~0x80000000;
	printf(" .tCK = TCK_MHZ%d,\n", 400 * reg / 3);

	tCK = (64 * 10 * 3) / reg;

	for (channel = 0; channel < 2; channel++) {
		mad_dimm[channel] = read_mchbar32(0x5004 + 4 * channel);

		if (mr0[channel]) {
			if (mr0[channel] & 1) {
				CAS[channel] = ((mr0[channel] >> 4) & 0x7) + 12;
			} else {
				CAS[channel] = ((mr0[channel] >> 4) & 0x7) + 4;
			}
		}
	}

	printf(".rankmap = { 0x%x, 0x%x },\n", rankmap[0], rankmap[1]);

	printf(".mad_dimm = { 0x%x, 0x%x },\n", mad_dimm[0], mad_dimm[1]);

	for (channel = 0; channel < 2; channel++)
		if (rankmap[channel]) {
			int ctWR;
			static const u8 mr0_wr_t[12] =
			    { 1, 2, 3, 4, 0, 5, 0, 6, 0, 7, 0, 0 };
			reg = read_mchbar32(0x4004 + 0x400 * channel);

			ctWR = (reg >> 24) & 0x3f;
			if (tWR && ctWR != tWR)
				printf("/* tWR mismatch: %d, %d */\n", tWR,
				       ctWR);
			if (!tWR)
				tWR = ctWR;
			if (mr0[channel] && ((mr0[channel] >> 9) & 7) != mr0_wr_t[tWR - 5])
				printf("/* encoded tWR mismatch: %d, %d */\n",
				       ((mr0[channel] >> 9) & 7),
				       mr0_wr_t[tWR - 5]);
			reg_4004_b30[channel] = reg >> 30;
			tFAW[channel] = (reg >> 16) & 0xff;
			tWTR[channel] = (reg >> 12) & 0xf;
			tCKE[channel] = (reg >> 8) & 0xf;
			tRTP[channel] = (reg >> 4) & 0xf;
			tRRD[channel] = (reg >> 0) & 0xf;

			reg = read_mchbar32(0x4000 + 0x400 * channel);
			tRAS[channel] = reg >> 16;
			tCWL[channel] = (reg >> 12) & 0xf;
			if (CAS[channel]) {
				if (CAS[channel] != ((reg >> 8) & 0xf))
					printf("/* CAS mismatch: %d, %d. */\n", CAS[channel],
					       (reg >> 8) & 0xf);
			} else {
				CAS[channel] = (reg >> 8) & 0xf;
			}
			tRP[channel] = (reg >> 4) & 0xf;
			tRCD[channel] = reg & 0xf;

			reg = read_mchbar32(0x400c + channel * 0x400);
			tXPDLL[channel] = reg & 0x1f;
			tXP[channel] = (reg >> 5) & 7;
			tAONPD[channel] = (reg >> 8) & 0xf;
		}
	printf(".mobile = %d,\n", (mr0[0] >> 12) & 1);

	if (two_channels && CAS[0] != CAS[1])
		printf("/* CAS mismatch: %d, %d */\n", CAS[0], CAS[1]);
	print_time("CAS", CAS[0], tCK);
	print_time("tWR", tWR, tCK);

	printf(".reg_4004_b30 = { %d, %d },\n", reg_4004_b30[0],
	       reg_4004_b30[1]);

	channel = (rankmap[0] != 0) ? 0 : 1;

	if (two_channels && tFAW[0] != tFAW[1])
		printf("/* tFAW mismatch: %d, %d */\n", tFAW[0], tFAW[1]);
	print_time("tFAW", tFAW[channel], tCK);
	if (two_channels && tWTR[0] != tWTR[1])
		printf("/* tWTR mismatch: %d, %d */\n", tWTR[0], tWTR[1]);
	print_time("tWTR", tWTR[channel], tCK);
	if (two_channels && tCKE[0] != tCKE[1])
		printf("/* tCKE mismatch: %d, %d */\n", tCKE[0], tCKE[1]);
	print_time("tCKE", tCKE[channel], tCK);
	if (two_channels && tRTP[0] != tRTP[1])
		printf("/* tRTP mismatch: %d, %d */\n", tRTP[0], tRTP[1]);
	print_time("tRTP", tRTP[channel], tCK);
	if (two_channels && tRRD[0] != tRRD[1])
		printf("/* tRRD mismatch: %d, %d */\n", tRRD[0], tRRD[1]);
	print_time("tRRD", tRRD[channel], tCK);

	if (two_channels && tRAS[0] != tRAS[1])
		printf("/* tRAS mismatch: %d, %d */\n", tRAS[0], tRAS[1]);
	print_time("tRAS", tRAS[channel], tCK);

	if (two_channels && tCWL[0] != tCWL[1])
		printf("/* tCWL mismatch: %d, %d */\n", tCWL[0], tCWL[1]);
	print_time("tCWL", tCWL[channel], tCK);

	if (two_channels && tRP[0] != tRP[1])
		printf("/* tRP mismatch: %d, %d */\n", tRP[0], tRP[1]);
	print_time("tRP", tRP[channel], tCK);

	if (two_channels && tRCD[0] != tRCD[1])
		printf("/* tRCD mismatch: %d, %d */\n", tRCD[0], tRCD[1]);
	print_time("tRCD", tRCD[channel], tCK);

	if (two_channels && tXPDLL[0] != tXPDLL[1])
		printf("/* tXPDLL mismatch: %d, %d */\n", tXPDLL[0], tXPDLL[1]);
	print_time("tXPDLL", tXPDLL[channel], tCK);

	if (two_channels && tXP[0] != tXP[1])
		printf("/* tXP mismatch: %d, %d */\n", tXP[0], tXP[1]);
	print_time("tXP", tXP[channel], tCK);

	if (two_channels && tAONPD[0] != tAONPD[1])
		printf("/* tAONPD mismatch: %d, %d */\n", tAONPD[0], tAONPD[1]);
	print_time("tAONPD", tAONPD[channel], tCK);

	reg = read_mchbar32(0x4298);
	if (reg != read_mchbar32(0x4698) && two_channels)
		printf("/* 4298 mismatch: %d, %d */\n", reg,
		       read_mchbar32(0x4698));

	tREFI = reg & 0xffff;
	print_time("tREFI", tREFI, tCK);
	if ((tREFI * 9 / 1024) != (reg >> 25))
		printf("/* tREFI mismatch: %d, %d */\n", tREFI * 9 / 1024,
		       (reg >> 25));
	tRFC = (reg >> 16) & 0x1ff;
	print_time("tRFC", tRFC, tCK);

	reg = read_mchbar32(0x42a4);
	if (reg != read_mchbar32(0x46a4) && two_channels)
		printf("/* 42a4 mismatch: %d, %d */\n", reg,
		       read_mchbar32(0x46a4));

	print_time("tMOD", 8 + ((reg >> 28) & 0xf), tCK);

	tXSOffset = 512 - ((reg >> 16) & 0x3ff);
	print_time("tXSOffset", tXSOffset, tCK);
	if (tXSOffset != ((reg >> 12) & 0xf))
		printf("/* tXSOffset mismatch: %d, %d */\n",
		       tXSOffset, (reg >> 12) & 0xf);
	if (512 != (reg & 0xfff))
		printf("/* tDLLK mismatch: %d, %d */\n", 512, reg & 0xfff);

	reg = read_mchbar32(0x5064);
	printf(".reg5064b0 = 0x%x,\n", reg & 0xfff);
	if ((reg >> 12) != 0x73)
		printf("/* mismatch 0x%x, 0x73.  */\n", reg << 12);

	unsigned int ch0size, ch1size;

	switch (read_mchbar32(0x5000)) {
	case 0x24:
		reg = read_mchbar32(0x5014);
		ch1size = reg >> 24;
		if (((reg >> 16) & 0xff) != 2 * ch1size)
			printf("/* ch1size mismatch: %d, %d*/\n",
			       2 * ch1size, ((ch1size >> 16) & 0xff));
		printf(".channel_size_mb = { ?, %d },\n", ch1size * 256);
		break;
	case 0x21:
		reg = read_mchbar32(0x5014);
		ch0size = reg >> 24;
		if (((reg >> 16) & 0xff) != 2 * ch0size)
			printf("/* ch0size mismatch: %d, %d*/\n",
			       2 * ch0size, ((ch0size >> 16) & 0xff));
		printf(".channel_size_mb = { %d, ? },\n", ch0size * 256);
		break;
	}

	for (channel = 0; channel < 2; channel++) {
		reg = mad_dimm[channel];
		int swap = (reg >> 16) & 1;
		slots[channel][swap].size_mb = (reg & 0xff) * 256;
		slots[channel][swap].ranks = 1 + ((reg >> 17) & 1);
		slots[channel][swap].width = 8 + 8 * ((reg >> 19) & 1);
		slots[channel][!swap].size_mb = ((reg >> 8) & 0xff) * 256;
		slots[channel][!swap].ranks = 1 + ((reg >> 18) & 1);
		slots[channel][!swap].width = 8 + 8 * ((reg >> 20) & 1);
	}
	/* Undetermined: rank mirror, other modes, asr, ext_temp.  */
	memset(spd, 0, sizeof(spd));
	for (channel = 0; channel < 2; channel++)
		for (slot = 0; slot < 2; slot++)
			if (slots[channel][slot].size_mb) {
				printf("/* CH%dS%d: %d MiB  */\n", channel,
				       slot, slots[channel][slot].size_mb);
			}
	for (channel = 0; channel < 2; channel++)
		for (slot = 0; slot < 2; slot++)
			if (slots[channel][slot].size_mb) {
				int capacity_shift;
				unsigned int ras, rc, rfc, faw;
				u16 crc;
				capacity_shift =
				    ffs(slots[channel][slot].size_mb *
					slots[channel][slot].width /
					(slots[channel][slot].ranks * 64)) - 1 -
				    5;

				spd[channel][slot][0] = 0x92;
				spd[channel][slot][1] = 0x11;
				spd[channel][slot][2] = 0xb;	/* DDR3 */
				spd[channel][slot][3] = 3;	/* SODIMM, should we use another type for desktop?  */
				spd[channel][slot][4] = capacity_shift | 0;	/* 8 Banks.  */
				spd[channel][slot][5] = 0;	/* FIXME */
				spd[channel][slot][6] = 0;	/* FIXME */
				spd[channel][slot][7] =
				    ((slots[channel][slot].ranks -
				      1) << 3) | (ffs(slots[channel][slot].
						      width) - 1 - 2);
				spd[channel][slot][8] = 3;	/* Bus width 64b. No ECC yet. */
				spd[channel][slot][9] = 0x52;	/* 2.5ps. FIXME: choose dynamically if needed.  */
				spd[channel][slot][10] = 0x01;
				spd[channel][slot][11] = 0x08;	/* 1/8 ns. FIXME: choose dynamically if needed.  */
				spd[channel][slot][12] = make_spd_time(1, tCK);
				spd[channel][slot][13] = 0;
				spd[channel][slot][14] =
				    (1 << (CAS[channel] - 4)) & 0xff;
				spd[channel][slot][15] = (1 << (CAS[channel] - 4)) >> 8;
				spd[channel][slot][16] =
				    make_spd_time(CAS[channel], tCK);
				spd[channel][slot][17] =
				    make_spd_time(tWR, tCK);
				spd[channel][slot][18] =
				    make_spd_time(tRCD[channel], tCK);
				spd[channel][slot][19] =
				    make_spd_time(tRRD[channel], tCK);
				spd[channel][slot][20] =
				    make_spd_time(tRP[channel], tCK);
				ras = make_spd_time(tRAS[channel], tCK);
				rc = 0x181;	/* FIXME: should be make_spd_time(tRC, tCK).  */
				spd[channel][slot][22] = ras;
				spd[channel][slot][23] = rc;
				spd[channel][slot][21] =
				    ((ras >> 8) & 0xf) | ((rc >> 4) & 0xf0);
				rfc = make_spd_time(tRFC, tCK);
				spd[channel][slot][24] = rfc;
				spd[channel][slot][25] = rfc >> 8;
				spd[channel][slot][26] =
				    make_spd_time(tWTR[channel], tCK);
				spd[channel][slot][27] =
				    make_spd_time(tRTP[channel], tCK);
				faw = make_spd_time(tFAW[channel], tCK);
				spd[channel][slot][28] = faw >> 8;
				spd[channel][slot][29] = faw;
				spd[channel][slot][30] = 0;	/* FIXME */
				spd[channel][slot][31] = 0;	/* FIXME */
				spd[channel][slot][32] = 0;	/* FIXME */
				spd[channel][slot][33] = 0;	/* FIXME */
				spd[channel][slot][62] = 0x65;	/* Reference card F.  FIXME */
				spd[channel][slot][63] = 0;	/* FIXME */
				crc = spd_ddr3_calc_crc(spd[channel][slot]);
				spd[channel][slot][126] = crc;
				spd[channel][slot][127] = crc >> 8;
			}

	printf("/* SPD matching current mode:  */\n");

	FILE *dump_spd = NULL;

	if (dump_spd_file) {
		dump_spd = fopen (dump_spd_file, "wb");
		if (!dump_spd) {
			fprintf (stderr, "Couldn't open file %s: %s\n", dump_spd_file,
				 strerror (errno));
			exit (1);
		}
	}

	for (channel = 0; channel < 2; channel++)
		for (slot = 0; slot < 2; slot++)
		{
			if (slots[channel][slot].size_mb) {
				int i;

				printf("/* CH%dS%d  */\n", channel, slot);

				for (i = 0; i < 256; i++) {
					if ((i & 0xf) == 0x0)
						printf("%02x: ", i);
					printf("%02x ", spd[channel][slot][i]);
					if ((i & 0xf) == 0xf)
						printf("\n");
				}
				printf("\n");

				if (dump_spd) {
					fwrite(spd[channel][slot], 1, 256, dump_spd);
				}
			} else {
				if (dump_spd) {
					char zero[256];
					memset (zero, 0, 256);
					fwrite(zero, 1, 256, dump_spd);
				}
			}
		}
	if (dump_spd) {
		fclose (dump_spd);
	}

}
