Initial commit
This commit is contained in:
commit
169c65d57e
51358 changed files with 23120455 additions and 0 deletions
220
drivers/misc/ibmasm/ibmasm.h
Normal file
220
drivers/misc/ibmasm/ibmasm.h
Normal file
|
@ -0,0 +1,220 @@
|
|||
|
||||
/*
|
||||
* IBM ASM Service Processor Device Driver
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* Copyright (C) IBM Corporation, 2004
|
||||
*
|
||||
* Author: Max Asböck <amax@us.ibm.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/wait.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/input.h>
|
||||
|
||||
/* Driver identification */
|
||||
#define DRIVER_NAME "ibmasm"
|
||||
#define DRIVER_VERSION "1.0"
|
||||
#define DRIVER_AUTHOR "Max Asbock <masbock@us.ibm.com>, Vernon Mauery <vernux@us.ibm.com>"
|
||||
#define DRIVER_DESC "IBM ASM Service Processor Driver"
|
||||
|
||||
#define err(msg) printk(KERN_ERR "%s: " msg "\n", DRIVER_NAME)
|
||||
#define info(msg) printk(KERN_INFO "%s: " msg "\n", DRIVER_NAME)
|
||||
|
||||
extern int ibmasm_debug;
|
||||
#define dbg(STR, ARGS...) \
|
||||
do { \
|
||||
if (ibmasm_debug) \
|
||||
printk(KERN_DEBUG STR , ##ARGS); \
|
||||
} while (0)
|
||||
|
||||
static inline char *get_timestamp(char *buf)
|
||||
{
|
||||
struct timeval now;
|
||||
do_gettimeofday(&now);
|
||||
sprintf(buf, "%lu.%lu", now.tv_sec, now.tv_usec);
|
||||
return buf;
|
||||
}
|
||||
|
||||
#define IBMASM_CMD_PENDING 0
|
||||
#define IBMASM_CMD_COMPLETE 1
|
||||
#define IBMASM_CMD_FAILED 2
|
||||
|
||||
#define IBMASM_CMD_TIMEOUT_NORMAL 45
|
||||
#define IBMASM_CMD_TIMEOUT_EXTRA 240
|
||||
|
||||
#define IBMASM_CMD_MAX_BUFFER_SIZE 0x8000
|
||||
|
||||
#define REVERSE_HEARTBEAT_TIMEOUT 120
|
||||
|
||||
#define HEARTBEAT_BUFFER_SIZE 0x400
|
||||
|
||||
#ifdef IA64
|
||||
#define IBMASM_DRIVER_VPD "Lin64 6.08 "
|
||||
#else
|
||||
#define IBMASM_DRIVER_VPD "Lin32 6.08 "
|
||||
#endif
|
||||
|
||||
#define SYSTEM_STATE_OS_UP 5
|
||||
#define SYSTEM_STATE_OS_DOWN 4
|
||||
|
||||
#define IBMASM_NAME_SIZE 16
|
||||
|
||||
#define IBMASM_NUM_EVENTS 10
|
||||
#define IBMASM_EVENT_MAX_SIZE 2048u
|
||||
|
||||
|
||||
struct command {
|
||||
struct list_head queue_node;
|
||||
wait_queue_head_t wait;
|
||||
unsigned char *buffer;
|
||||
size_t buffer_size;
|
||||
int status;
|
||||
struct kref kref;
|
||||
spinlock_t *lock;
|
||||
};
|
||||
#define to_command(c) container_of(c, struct command, kref)
|
||||
|
||||
void ibmasm_free_command(struct kref *kref);
|
||||
static inline void command_put(struct command *cmd)
|
||||
{
|
||||
unsigned long flags;
|
||||
spinlock_t *lock = cmd->lock;
|
||||
|
||||
spin_lock_irqsave(lock, flags);
|
||||
kref_put(&cmd->kref, ibmasm_free_command);
|
||||
spin_unlock_irqrestore(lock, flags);
|
||||
}
|
||||
|
||||
static inline void command_get(struct command *cmd)
|
||||
{
|
||||
kref_get(&cmd->kref);
|
||||
}
|
||||
|
||||
|
||||
struct ibmasm_event {
|
||||
unsigned int serial_number;
|
||||
unsigned int data_size;
|
||||
unsigned char data[IBMASM_EVENT_MAX_SIZE];
|
||||
};
|
||||
|
||||
struct event_buffer {
|
||||
struct ibmasm_event events[IBMASM_NUM_EVENTS];
|
||||
unsigned int next_serial_number;
|
||||
unsigned int next_index;
|
||||
struct list_head readers;
|
||||
};
|
||||
|
||||
struct event_reader {
|
||||
int cancelled;
|
||||
unsigned int next_serial_number;
|
||||
wait_queue_head_t wait;
|
||||
struct list_head node;
|
||||
unsigned int data_size;
|
||||
unsigned char data[IBMASM_EVENT_MAX_SIZE];
|
||||
};
|
||||
|
||||
struct reverse_heartbeat {
|
||||
wait_queue_head_t wait;
|
||||
unsigned int stopped;
|
||||
};
|
||||
|
||||
struct ibmasm_remote {
|
||||
struct input_dev *keybd_dev;
|
||||
struct input_dev *mouse_dev;
|
||||
};
|
||||
|
||||
struct service_processor {
|
||||
struct list_head node;
|
||||
spinlock_t lock;
|
||||
void __iomem *base_address;
|
||||
unsigned int irq;
|
||||
struct command *current_command;
|
||||
struct command *heartbeat;
|
||||
struct list_head command_queue;
|
||||
struct event_buffer *event_buffer;
|
||||
char dirname[IBMASM_NAME_SIZE];
|
||||
char devname[IBMASM_NAME_SIZE];
|
||||
unsigned int number;
|
||||
struct ibmasm_remote remote;
|
||||
int serial_line;
|
||||
struct device *dev;
|
||||
};
|
||||
|
||||
/* command processing */
|
||||
struct command *ibmasm_new_command(struct service_processor *sp, size_t buffer_size);
|
||||
void ibmasm_exec_command(struct service_processor *sp, struct command *cmd);
|
||||
void ibmasm_wait_for_response(struct command *cmd, int timeout);
|
||||
void ibmasm_receive_command_response(struct service_processor *sp, void *response, size_t size);
|
||||
|
||||
/* event processing */
|
||||
int ibmasm_event_buffer_init(struct service_processor *sp);
|
||||
void ibmasm_event_buffer_exit(struct service_processor *sp);
|
||||
void ibmasm_receive_event(struct service_processor *sp, void *data, unsigned int data_size);
|
||||
void ibmasm_event_reader_register(struct service_processor *sp, struct event_reader *reader);
|
||||
void ibmasm_event_reader_unregister(struct service_processor *sp, struct event_reader *reader);
|
||||
int ibmasm_get_next_event(struct service_processor *sp, struct event_reader *reader);
|
||||
void ibmasm_cancel_next_event(struct event_reader *reader);
|
||||
|
||||
/* heartbeat - from SP to OS */
|
||||
void ibmasm_register_panic_notifier(void);
|
||||
void ibmasm_unregister_panic_notifier(void);
|
||||
int ibmasm_heartbeat_init(struct service_processor *sp);
|
||||
void ibmasm_heartbeat_exit(struct service_processor *sp);
|
||||
void ibmasm_receive_heartbeat(struct service_processor *sp, void *message, size_t size);
|
||||
|
||||
/* reverse heartbeat - from OS to SP */
|
||||
void ibmasm_init_reverse_heartbeat(struct service_processor *sp, struct reverse_heartbeat *rhb);
|
||||
int ibmasm_start_reverse_heartbeat(struct service_processor *sp, struct reverse_heartbeat *rhb);
|
||||
void ibmasm_stop_reverse_heartbeat(struct reverse_heartbeat *rhb);
|
||||
|
||||
/* dot commands */
|
||||
void ibmasm_receive_message(struct service_processor *sp, void *data, int data_size);
|
||||
int ibmasm_send_driver_vpd(struct service_processor *sp);
|
||||
int ibmasm_send_os_state(struct service_processor *sp, int os_state);
|
||||
|
||||
/* low level message processing */
|
||||
int ibmasm_send_i2o_message(struct service_processor *sp);
|
||||
irqreturn_t ibmasm_interrupt_handler(int irq, void * dev_id);
|
||||
|
||||
/* remote console */
|
||||
void ibmasm_handle_mouse_interrupt(struct service_processor *sp);
|
||||
int ibmasm_init_remote_input_dev(struct service_processor *sp);
|
||||
void ibmasm_free_remote_input_dev(struct service_processor *sp);
|
||||
|
||||
/* file system */
|
||||
int ibmasmfs_register(void);
|
||||
void ibmasmfs_unregister(void);
|
||||
void ibmasmfs_add_sp(struct service_processor *sp);
|
||||
|
||||
/* uart */
|
||||
#ifdef CONFIG_SERIAL_8250
|
||||
void ibmasm_register_uart(struct service_processor *sp);
|
||||
void ibmasm_unregister_uart(struct service_processor *sp);
|
||||
#else
|
||||
#define ibmasm_register_uart(sp) do { } while(0)
|
||||
#define ibmasm_unregister_uart(sp) do { } while(0)
|
||||
#endif
|
Loading…
Add table
Add a link
Reference in a new issue