diff options
Diffstat (limited to 'src/mainboard/arima')
-rw-r--r-- | src/mainboard/arima/hdama/Config.lb | 14 | ||||
-rw-r--r-- | src/mainboard/arima/hdama/cmos.layout | 2 | ||||
-rw-r--r-- | src/mainboard/arima/hdama/mainboard.c | 307 |
3 files changed, 10 insertions, 313 deletions
diff --git a/src/mainboard/arima/hdama/Config.lb b/src/mainboard/arima/hdama/Config.lb index 0799be0117..f812868f4a 100644 --- a/src/mainboard/arima/hdama/Config.lb +++ b/src/mainboard/arima/hdama/Config.lb @@ -32,7 +32,11 @@ default _ROMBASE = ( CONFIG_ROM_STREAM_START + PAYLOAD_SIZE ) default XIP_ROM_SIZE=65536 default XIP_ROM_BASE = ( _ROMBASE + ROM_IMAGE_SIZE - XIP_ROM_SIZE ) -arch i386 end +## +## Set all of the defaults for an x86 architecture +## + +arch i386 end ## ## Build the objects we have code for in this directory. @@ -77,11 +81,11 @@ ldscript /cpu/x86/32bit/entry32.lds ## Build our reset vector (This is where linuxBIOS is entered) ## if USE_FALLBACK_IMAGE - mainboardinit cpu/x86/16bit/reset16.inc - ldscript /cpu/x86/16bit/reset16.lds + mainboardinit cpu/x86/16bit/reset16.inc + ldscript /cpu/x86/16bit/reset16.lds else - mainboardinit cpu/x86/32bit/reset32.inc - ldscript /cpu/x86/32bit/reset32.lds + mainboardinit cpu/x86/32bit/reset32.inc + ldscript /cpu/x86/32bit/reset32.lds end ### Should this be in the northbridge code? diff --git a/src/mainboard/arima/hdama/cmos.layout b/src/mainboard/arima/hdama/cmos.layout index ea027282c4..1ab6187288 100644 --- a/src/mainboard/arima/hdama/cmos.layout +++ b/src/mainboard/arima/hdama/cmos.layout @@ -93,5 +93,3 @@ enumerations checksums checksum 392 983 984 - - diff --git a/src/mainboard/arima/hdama/mainboard.c b/src/mainboard/arima/hdama/mainboard.c index 95ed7368f9..69b738e2b4 100644 --- a/src/mainboard/arima/hdama/mainboard.c +++ b/src/mainboard/arima/hdama/mainboard.c @@ -7,315 +7,10 @@ #include <part/hard_reset.h> #include <device/smbus.h> #include <delay.h> - -#include <arch/io.h> -#include "../../../northbridge/amd/amdk8/northbridge.h" -#include "../../../northbridge/amd/amdk8/cpu_rev.c" #include "chip.h" -#include "pc80/mc146818rtc.h" - - -#undef DEBUG -#define DEBUG 0 -#if DEBUG -static void debug_init(device_t dev) -{ - unsigned bus; - unsigned devfn; -#if 0 - for(bus = 0; bus < 256; bus++) { - for(devfn = 0; devfn < 256; devfn++) { - int i; - dev = dev_find_slot(bus, devfn); - if (!dev) { - continue; - } - if (!dev->enabled) { - continue; - } - printk_info("%02x:%02x.%0x aka %s\n", - bus, devfn >> 3, devfn & 7, dev_path(dev)); - for(i = 0; i < 256; i++) { - if ((i & 0x0f) == 0) { - printk_info("%02x:", i); - } - printk_info(" %02x", pci_read_config8(dev, i)); - if ((i & 0x0f) == 0xf) { - printk_info("\n"); - } - } - printk_info("\n"); - } - } -#endif -#if 0 - msr_t msr; - unsigned index; - unsigned eax, ebx, ecx, edx; - index = 0x80000007; - printk_debug("calling cpuid 0x%08x\n", index); - asm volatile( - "cpuid" - : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) - : "a" (index) - ); - printk_debug("cpuid[%08x]: %08x %08x %08x %08x\n", - index, eax, ebx, ecx, edx); - if (edx & (3 << 1)) { - index = 0xC0010042; - printk_debug("Reading msr: 0x%08x\n", index); - msr = rdmsr(index); - printk_debug("msr[0x%08x]: 0x%08x%08x\n", - index, msr.hi, msr.hi); - } -#endif -} - -static void debug_noop(device_t dummy) -{ -} - -static struct device_operations debug_operations = { - .read_resources = debug_noop, - .set_resources = debug_noop, - .enable_resources = debug_noop, - .init = debug_init, -}; - -static unsigned int scan_root_bus(device_t root, unsigned int max) -{ - struct device_path path; - device_t debug; - max = root_dev_scan_bus(root, max); - path.type = DEVICE_PATH_PNP; - path.u.pnp.port = 0; - path.u.pnp.device = 0; - debug = alloc_dev(&root->link[1], &path); - debug->ops = &debug_operations; - return max; -} -#endif - -#if 0 -static void handle_smbus_error(int value, const char *msg) -{ - if (value >= 0) { - return; - } - switch(value) { - case SMBUS_WAIT_UNTIL_READY_TIMEOUT: - printk_emerg("SMBUS wait until ready timed out - resetting..."); - hard_reset(); - break; - case SMBUS_WAIT_UNTIL_DONE_TIMEOUT: - printk_emerg("SMBUS wait until done timed out - resetting..."); - hard_reset(); - break; - default: - die(msg); - break; - } -} - -#define ADM1026_DEVICE 0x2c /* 0x2e or 0x2d */ -#define ADM1026_REG_CONFIG1 0x00 -#define CFG1_MONITOR 0x01 -#define CFG1_INT_ENABLE 0x02 -#define CFG1_INT_CLEAR 0x04 -#define CFG1_AIN8_9 0x08 -#define CFG1_THERM_HOT 0x10 -#define CFT1_DAC_AFC 0x20 -#define CFG1_PWM_AFC 0x40 -#define CFG1_RESET 0x80 -#define ADM1026_REG_CONFIG2 0x01 -#define ADM1026_REG_CONFIG3 0x07 - - - -#define BILLION 1000000000UL - -static void verify_cpu_voltage(const char *name, - device_t dev, unsigned int reg, - unsigned factor, unsigned cpu_volts, unsigned delta) -{ - unsigned nvolts_lo, nvolts_hi; - unsigned cpuvolts_hi, cpuvolts_lo; - int value; - int loops; - - loops = 1000; - do { - value = smbus_read_byte(dev, reg); - handle_smbus_error(value, "SMBUS read byte failed"); - } while ((--loops > 0) && value == 0); - /* Convert the byte value to nanoVolts. - * My accuracy is nowhere near that good but I don't - * have to round so the math is simple. - * I can only go up to about 4.2 Volts this way so my range is - * limited. - */ - nvolts_lo = ((unsigned)value * factor); - nvolts_hi = nvolts_lo + factor - 1; - /* Get the range of acceptable cpu voltage values */ - cpuvolts_lo = cpu_volts - delta; - cpuvolts_hi = cpu_volts + delta; - if ((nvolts_lo < cpuvolts_lo) || (nvolts_hi > cpuvolts_hi)) { - printk_emerg("%s at (%u.%09u-%u.%09u)Volts expected %u.%09u+/-%u.%09uVolts\n", - name, - nvolts_lo/BILLION, nvolts_lo%BILLION, - nvolts_hi/BILLION, nvolts_hi%BILLION, - cpu_volts/BILLION, cpu_volts%BILLION, - delta/BILLION, delta%BILLION); - die(""); - } - printk_info("%s at (%u.%09u-%u.%09u)Volts\n", - name, - nvolts_lo/BILLION, nvolts_lo%BILLION, - nvolts_hi/BILLION, nvolts_hi%BILLION); - -} - -static void adm1026_enable_monitoring(device_t dev) -{ - int result; - result = smbus_read_byte(dev, ADM1026_REG_CONFIG1); - handle_smbus_error(result, "ADM1026: cannot read config1"); - - result = (result | CFG1_MONITOR) & ~(CFG1_INT_CLEAR | CFG1_RESET); - result = smbus_write_byte(dev, ADM1026_REG_CONFIG1, result); - handle_smbus_error(result, "ADM1026: cannot write to config1"); - - result = smbus_read_byte(dev, ADM1026_REG_CONFIG1); - handle_smbus_error(result, "ADM1026: cannot reread config1"); - if (!(result & CFG1_MONITOR)) { - die("ADM1026: monitoring would not enable"); - } -} - - -static unsigned k8_cpu_volts(void) -{ - unsigned volts = ~0; - if (is_cpu_c0()) { - volts = 1500000000; - } - if (is_cpu_b3()) { - volts = 1550000000; - } - return volts; -} - -static void verify_cpu_voltages(device_t dev) -{ - unsigned cpu_volts; - unsigned delta; -#if 0 - delta = 50000000; -#else - delta = 75000000; -#endif - cpu_volts = k8_cpu_volts(); - if (cpu_volts == ~0) { - printk_info("Required cpu voltage unknwon not checking\n"); - return; - } - /* I need to read registers 0x37 == Ain7CPU1 core 0x2d == VcppCPU0 core */ - /* CPU1 core - * The sensor has a range of 0-2.5V and reports in - * 256 distinct steps. - */ - verify_cpu_voltage("CPU1 Vcore", dev, 0x37, 9765625, - cpu_volts, delta); - /* CPU0 core - * The sensor has range of 0-3.0V and reports in - * 256 distinct steps. - */ - verify_cpu_voltage("CPU0 Vcore", dev, 0x2d, 11718750, - cpu_volts, delta); -} - -#define SMBUS_MUX 0x70 - -static void do_verify_cpu_voltages(void) -{ - device_t smbus_dev; - device_t mux, sensor; - struct device_path mux_path, sensor_path; - int result; - int mux_setting; - - /* Find the smbus controller */ - smbus_dev = dev_find_device(0x1022, 0x746b, 0); - if (!smbus_dev) { - die("SMBUS controller not found\n"); - } - - /* Find the smbus mux */ - mux_path.type = DEVICE_PATH_I2C; - mux_path.u.i2c.device = SMBUS_MUX; - mux = find_dev_path(smbus_dev, &mux_path); - if (!mux) { - die("SMBUS mux not found\n"); - } - - /* Find the adm1026 sensor */ - sensor_path.type = DEVICE_PATH_I2C; - sensor_path.u.i2c.device = ADM1026_DEVICE; - sensor = find_dev_path(mux, &sensor_path); - if (!sensor) { - die("ADM1026 not found\n"); - } - - /* Set the mux to see the temperature sensors */ - mux_setting = 1; - result = smbus_send_byte(mux, mux_setting); - handle_smbus_error(result, "SMBUS send byte failed\n"); - - result = smbus_recv_byte(mux); - handle_smbus_error(result, "SMBUS recv byte failed\n"); - if (result != mux_setting) { - printk_emerg("SMBUS mux would not set to %d\n", mux_setting); - die(""); - } - - adm1026_enable_monitoring(sensor); - - /* It takes 11.38ms to read a new voltage sensor value */ - mdelay(12); - - /* Read the cpu voltages and make certain everything looks sane */ - verify_cpu_voltages(sensor); -} -#else -#define do_verify_cpu_voltages() do {} while(0) -#endif - -static void mainboard_init(device_t dev) -{ - root_dev_init(dev); - - do_verify_cpu_voltages(); -} - -static struct device_operations mainboard_operations = { - .read_resources = root_dev_read_resources, - .set_resources = root_dev_set_resources, - .enable_resources = root_dev_enable_resources, - .init = mainboard_init, -#if !DEBUG - .scan_bus = root_dev_scan_bus, -#else - .scan_bus = scan_root_bus, -#endif - .enable = 0, -}; -static void enable_dev(struct device *dev) -{ - dev->ops = &mainboard_operations; -} struct chip_operations mainboard_arima_hdama_ops = { - .enable_dev = enable_dev, + CHIP_NAME("Arima Hdama mainboard") }; |