Commit 4cf395d4 authored by Evan Lojewski's avatar Evan Lojewski Committed by Raptor Engineering Development Team
Browse files

i2c: Limit number of CPUs to max supported by firmware.

parent 1d87af65
......@@ -103,13 +103,33 @@ typedef struct
{
int8_t index;
uint8_t *i2c_master;
uint8_t vdd_regulator_addr;
uint8_t vdn_regulator_addr;
uint8_t vdd_smbus_addr;
uint8_t vdn_smbus_addr;
} cpu_info_t;
static const cpu_info_t g_cpu_info[] = {
{ .index = 0, .i2c_master = (uint8_t *)I2CMASTER1_BASE },
{
.index = 0,
.i2c_master = (uint8_t *)I2CMASTER1_BASE,
.vdd_regulator_addr = 0x70,
.vdn_regulator_addr = 0x73,
.vdd_smbus_addr = 0x28,
.vdn_smbus_addr = 0x2b,
},
#ifdef I2CMASTER2_BASE
{ .index = 1, .i2c_master = (uint8_t *)I2CMASTER2_BASE },
{
.index = 1,
.i2c_master = (uint8_t *)I2CMASTER2_BASE,
.vdd_regulator_addr = 0x70,
.vdn_regulator_addr = 0x73,
.vdd_smbus_addr = 0x28,
.vdn_smbus_addr = 0x2b,
},
#endif
};
#define MAX_CPUS_SUPPORTED (sizeof(g_cpu_info) / sizeof(g_cpu_info[0]))
void primary_service_event_loop(void);
......@@ -1379,7 +1399,7 @@ static int apply_avsbus_workarounds_cpu(const cpu_info_t *cpu)
printf("\tVDD/VCS %d: Enabling AVSBus CLK/MDAT pullups and selecting "
"VIH/VIL 0x2 (0.65V/0.55V)\n",
cpu->index);
if (i2c_write_register_byte(cpu->i2c_master, 0x28, 0x2e, 0x23))
if (i2c_write_register_byte(cpu->i2c_master, cpu->vdd_smbus_addr, 0x2e, 0x23))
{
return -1;
}
......@@ -1387,7 +1407,7 @@ static int apply_avsbus_workarounds_cpu(const cpu_info_t *cpu)
printf("\tVDN %d: Enabling AVSBus CLK/MDAT pullups and selecting VIH/VIL "
"0x2 (0.65V/0.55V)\n",
cpu->index);
if (i2c_write_register_byte(cpu->i2c_master, 0x2b, 0x2e, 0x23))
if (i2c_write_register_byte(cpu->i2c_master, cpu->vdn_smbus_addr, 0x2e, 0x23))
{
return -1;
}
......@@ -1415,31 +1435,31 @@ static int apply_avsbus_workarounds(const cpu_info_t *cpu_info, int cpu_count)
static int enable_avsbus_pmbus_cpu(const cpu_info_t *cpu)
{
printf("\tVDD %d: Placing device in AVSBus voltage command mode\n", cpu->index);
if (i2c_write_register_byte(cpu->i2c_master, 0x70, 0x00, 0x00))
if (i2c_write_register_byte(cpu->i2c_master, cpu->vdd_regulator_addr, 0x00, 0x00))
{
return -1;
}
if (i2c_write_register_byte(cpu->i2c_master, 0x70, 0x01, 0xb0))
if (i2c_write_register_byte(cpu->i2c_master, cpu->vdd_regulator_addr, 0x01, 0xb0))
{
return -1;
}
printf("\tVCS %d: Placing device in AVSBus voltage command mode\n", cpu->index);
if (i2c_write_register_byte(cpu->i2c_master, 0x70, 0x00, 0x01))
if (i2c_write_register_byte(cpu->i2c_master, cpu->vdd_regulator_addr, 0x00, 0x01))
{
return -1;
}
if (i2c_write_register_byte(cpu->i2c_master, 0x70, 0x01, 0xb0))
if (i2c_write_register_byte(cpu->i2c_master, cpu->vdd_regulator_addr, 0x01, 0xb0))
{
return -1;
}
printf("\tVDN %d: Placing device in AVSBus voltage command mode\n", cpu->index);
if (i2c_write_register_byte(cpu->i2c_master, 0x73, 0x00, 0x00))
if (i2c_write_register_byte(cpu->i2c_master, cpu->vdn_regulator_addr, 0x00, 0x00))
{
return -1;
}
if (i2c_write_register_byte(cpu->i2c_master, 0x73, 0x01, 0xb0))
if (i2c_write_register_byte(cpu->i2c_master, cpu->vdn_regulator_addr, 0x01, 0xb0))
{
return -1;
}
......@@ -1467,31 +1487,31 @@ static int enable_avsbus_pmbus(const cpu_info_t *cpu_info, int cpu_count)
static int disable_avsbus_pmbus_cpu(const cpu_info_t *cpu)
{
printf("\tVDD %d: Placing device in immediate off mode\n", cpu->index);
if (i2c_write_register_byte(cpu->i2c_master, 0x70, 0x00, 0x00))
if (i2c_write_register_byte(cpu->i2c_master, cpu->vdd_regulator_addr, 0x00, 0x00))
{
return -1;
}
if (i2c_write_register_byte(cpu->i2c_master, 0x70, 0x01, 0xb0))
if (i2c_write_register_byte(cpu->i2c_master, cpu->vdd_regulator_addr, 0x01, 0xb0))
{
return -1;
}
printf("\tVCS %d: Placing device in immediate off mode\n", cpu->index);
if (i2c_write_register_byte(cpu->i2c_master, 0x70, 0x00, 0x01))
if (i2c_write_register_byte(cpu->i2c_master, cpu->vdd_regulator_addr, 0x00, 0x01))
{
return -1;
}
if (i2c_write_register_byte(cpu->i2c_master, 0x70, 0x01, 0xb0))
if (i2c_write_register_byte(cpu->i2c_master, cpu->vdd_regulator_addr, 0x01, 0xb0))
{
return -1;
}
printf("\tVDN %d: Placing device in immediate off mode\n", cpu->index);
if (i2c_write_register_byte(cpu->i2c_master, 0x73, 0x00, 0x00))
if (i2c_write_register_byte(cpu->i2c_master, cpu->vdn_regulator_addr, 0x00, 0x00))
{
return -1;
}
if (i2c_write_register_byte(cpu->i2c_master, 0x73, 0x01, 0xb0))
if (i2c_write_register_byte(cpu->i2c_master, cpu->vdn_regulator_addr, 0x01, 0xb0))
{
return -1;
}
......@@ -1500,19 +1520,21 @@ static int disable_avsbus_pmbus_cpu(const cpu_info_t *cpu)
}
static int disable_avsbus_pmbus(const cpu_info_t *cpu_info, int cpu_count)
{
int status = 0;
printf("Disabling AVSbus PMBUS functionality...\n");
while (--cpu_count)
{
// Attempt to turn of power on all CPUs, even if one isn't responding.
if (disable_avsbus_pmbus_cpu(&cpu_info[0]))
{
return -1;
status = -1;
}
cpu_info++;
}
printf("\tAVSBus PMBUS functionality disabled!\n");
return 0;
return status;
}
static void power_off_chassis(void)
......@@ -1584,6 +1606,11 @@ static int power_on_chassis(void)
}
printf("Chassis power verified active\n");
configured_cpu_count = cpu_count;
if (cpu_count > MAX_CPUS_SUPPORTED)
{
configured_cpu_count = cpu_count = MAX_CPUS_SUPPORTED;
printf("Limiting number of CPUs to %d\n", MAX_CPUS_SUPPORTED);
}
printf("%d CPU(s) installed\n", cpu_count);
// Apply AVSBus workarounds
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment