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 ...@@ -103,13 +103,33 @@ typedef struct
{ {
int8_t index; int8_t index;
uint8_t *i2c_master; 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; } cpu_info_t;
static const cpu_info_t g_cpu_info[] = { 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 #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 #endif
}; };
#define MAX_CPUS_SUPPORTED (sizeof(g_cpu_info) / sizeof(g_cpu_info[0]))
void primary_service_event_loop(void); void primary_service_event_loop(void);
...@@ -1379,7 +1399,7 @@ static int apply_avsbus_workarounds_cpu(const cpu_info_t *cpu) ...@@ -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 " printf("\tVDD/VCS %d: Enabling AVSBus CLK/MDAT pullups and selecting "
"VIH/VIL 0x2 (0.65V/0.55V)\n", "VIH/VIL 0x2 (0.65V/0.55V)\n",
cpu->index); 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; return -1;
} }
...@@ -1387,7 +1407,7 @@ static int apply_avsbus_workarounds_cpu(const cpu_info_t *cpu) ...@@ -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 " printf("\tVDN %d: Enabling AVSBus CLK/MDAT pullups and selecting VIH/VIL "
"0x2 (0.65V/0.55V)\n", "0x2 (0.65V/0.55V)\n",
cpu->index); 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; return -1;
} }
...@@ -1415,31 +1435,31 @@ static int apply_avsbus_workarounds(const cpu_info_t *cpu_info, int cpu_count) ...@@ -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) static int enable_avsbus_pmbus_cpu(const cpu_info_t *cpu)
{ {
printf("\tVDD %d: Placing device in AVSBus voltage command mode\n", cpu->index); 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; 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; return -1;
} }
printf("\tVCS %d: Placing device in AVSBus voltage command mode\n", cpu->index); 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; 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; return -1;
} }
printf("\tVDN %d: Placing device in AVSBus voltage command mode\n", cpu->index); 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; 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; return -1;
} }
...@@ -1467,31 +1487,31 @@ static int enable_avsbus_pmbus(const cpu_info_t *cpu_info, int cpu_count) ...@@ -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) static int disable_avsbus_pmbus_cpu(const cpu_info_t *cpu)
{ {
printf("\tVDD %d: Placing device in immediate off mode\n", cpu->index); 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; 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; return -1;
} }
printf("\tVCS %d: Placing device in immediate off mode\n", cpu->index); 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; 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; return -1;
} }
printf("\tVDN %d: Placing device in immediate off mode\n", cpu->index); 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; 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; return -1;
} }
...@@ -1500,19 +1520,21 @@ static int disable_avsbus_pmbus_cpu(const cpu_info_t *cpu) ...@@ -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) static int disable_avsbus_pmbus(const cpu_info_t *cpu_info, int cpu_count)
{ {
int status = 0;
printf("Disabling AVSbus PMBUS functionality...\n"); printf("Disabling AVSbus PMBUS functionality...\n");
while (--cpu_count) 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])) if (disable_avsbus_pmbus_cpu(&cpu_info[0]))
{ {
return -1; status = -1;
} }
cpu_info++; cpu_info++;
} }
printf("\tAVSBus PMBUS functionality disabled!\n"); printf("\tAVSBus PMBUS functionality disabled!\n");
return 0; return status;
} }
static void power_off_chassis(void) static void power_off_chassis(void)
...@@ -1584,6 +1606,11 @@ static int power_on_chassis(void) ...@@ -1584,6 +1606,11 @@ static int power_on_chassis(void)
} }
printf("Chassis power verified active\n"); printf("Chassis power verified active\n");
configured_cpu_count = cpu_count; 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); printf("%d CPU(s) installed\n", cpu_count);
// Apply AVSBus workarounds // 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