#include <linux/kernel.h>
#include <linux/timer.h>
#include <linux/vmalloc.h>
-#include <asm/sn/sgi.h>
#include <asm/mca.h>
#include <asm/sal.h>
#include <asm/sn/sn_sal.h>
-
-
/*
* Interval for calling SAL to poll for errors that do NOT cause error
* interrupts. SAL will raise a CPEI if any errors are present that
*/
#define CPEI_INTERVAL (5*HZ)
-
struct timer_list sn_cpei_timer;
void sn_init_cpei_timer(void);
* info for platform errors. buf is appended to sn_oemdata, resizing as
* required.
*/
-static int
-print_hook(const char *fmt, ...)
+static int print_hook(const char *fmt, ...)
{
char buf[400];
int len;
while (*sn_oemdata_size + len + 1 > sn_oemdata_bufsize) {
u8 *newbuf = vmalloc(sn_oemdata_bufsize += 1000);
if (!newbuf) {
- printk(KERN_ERR "%s: unable to extend sn_oemdata\n", __FUNCTION__);
+ printk(KERN_ERR "%s: unable to extend sn_oemdata\n",
+ __FUNCTION__);
return 0;
}
memcpy(newbuf, *sn_oemdata, *sn_oemdata_size);
return 0;
}
-
-static void
-sn_cpei_handler(int irq, void *devid, struct pt_regs *regs)
+static void sn_cpei_handler(int irq, void *devid, struct pt_regs *regs)
{
/*
* this function's sole purpose is to call SAL when we receive
ia64_sn_plat_cpei_handler();
}
-
-static void
-sn_cpei_timer_handler(unsigned long dummy)
+static void sn_cpei_timer_handler(unsigned long dummy)
{
sn_cpei_handler(-1, NULL, NULL);
mod_timer(&sn_cpei_timer, jiffies + CPEI_INTERVAL);
}
-void
-sn_init_cpei_timer(void)
+void sn_init_cpei_timer(void)
{
init_timer(&sn_cpei_timer);
sn_cpei_timer.expires = jiffies + CPEI_INTERVAL;
}
static int
-sn_platform_plat_specific_err_print(const u8 *sect_header, u8 **oemdata, u64 *oemdata_size)
+sn_platform_plat_specific_err_print(const u8 * sect_header, u8 ** oemdata,
+ u64 * oemdata_size)
{
- sal_log_plat_specific_err_info_t *psei = (sal_log_plat_specific_err_info_t *)sect_header;
- if (!psei->valid.oem_data)
- return 0;
down(&sn_oemdata_mutex);
sn_oemdata = oemdata;
sn_oemdata_size = oemdata_size;
sn_oemdata_bufsize = 0;
- ia64_sn_plat_specific_err_print(print_hook, (char *)psei);
+ ia64_sn_plat_specific_err_print(print_hook, (char *)sect_header);
up(&sn_oemdata_mutex);
return 0;
}
int sn_salinfo_platform_oemdata(const u8 *sect_header, u8 **oemdata, u64 *oemdata_size)
{
efi_guid_t guid = *(efi_guid_t *)sect_header;
+ int valid = 0;
*oemdata_size = 0;
vfree(*oemdata);
*oemdata = NULL;
- if (efi_guidcmp(guid, SAL_PLAT_SPECIFIC_ERR_SECT_GUID) == 0 ||
- efi_guidcmp(guid, SAL_PLAT_MEM_DEV_ERR_SECT_GUID) == 0)
+ if (efi_guidcmp(guid, SAL_PLAT_SPECIFIC_ERR_SECT_GUID) == 0) {
+ sal_log_plat_specific_err_info_t *psei = (sal_log_plat_specific_err_info_t *)sect_header;
+ valid = psei->valid.oem_data;
+ } else if (efi_guidcmp(guid, SAL_PLAT_MEM_DEV_ERR_SECT_GUID) == 0) {
+ sal_log_mem_dev_err_info_t *mdei = (sal_log_mem_dev_err_info_t *)sect_header;
+ valid = mdei->valid.oem_data;
+ }
+ if (valid)
return sn_platform_plat_specific_err_print(sect_header, oemdata, oemdata_size);
- return 0;
+ else
+ return 0;
}
static int __init sn_salinfo_init(void)