Commit 5b9db0cb authored by Tristan Gingold's avatar Tristan Gingold

dev: extract console-ipmi.c from console.c

parent 43dd3a2a
/*
* This work is part of the White Rabbit project
*
* Copyright (C) 2012-2020 CERN (www.cern.ch)
*
* Released according to the GNU GPL, version 2 or any later version.
*/
#include <stdint.h>
#include <errno.h>
#include "board.h"
#include "dev/console.h"
#ifdef CONFIG_IPMI_CONSOLE
#define IPMI_CON_TX_BUF_SIZE 1024
#define IPMI_CON_RX_BUF_SIZE 128
#define IPMI_CON_RX_TIMEOUT 1000
struct ring_buffer
{
uint8_t *data;
int head, tail, size, count;
};
struct console_ipmi_priv_data
{
uint8_t tx_buf_mem[IPMI_CON_TX_BUF_SIZE];
uint8_t rx_buf_mem[IPMI_CON_RX_BUF_SIZE];
struct ring_buffer rx_buf;
struct ring_buffer tx_buf;
};
struct console_device console_ipmi_dev;
struct console_ipmi_priv_data console_ipmi_priv;
static inline void rbuf_put( struct ring_buffer* buf, uint8_t c )
{
if (buf->count >= buf->size)
return;
buf->data[buf->head] = c;
buf->head++;
buf->count++;
if (buf->head >= buf->size)
buf->head = 0;
}
static inline int rbuf_get( struct ring_buffer* buf )
{
if( !buf->count )
return -1;
int rv = buf->data[buf->tail];
buf->tail++;
if (buf->tail >= buf->size)
buf->tail = 0;
buf->count--;
return rv;
}
static inline int rbuf_init( struct ring_buffer *buf, int size, uint8_t *mem )
{
buf->head = buf->tail = buf->count = 0;
buf->size = size;
buf->data = mem;
return 0;
}
static inline int rbuf_full(struct ring_buffer *buf)
{
return buf->size == buf->count;
}
static inline int rbuf_purge(struct ring_buffer *buf)
{
buf->head = buf->tail = buf->count = 0;
return 0;
}
static int con_ipmi_put_string(struct console_device* dev, const char *s)
{
struct console_ipmi_priv_data* priv = (struct console_ipmi_priv_data*) dev->priv;
int c, n = 0;
while( (c = *s++) != 0 )
{
rbuf_put( &priv->tx_buf, c );
n++;
}
if( rbuf_full(&priv->tx_buf ) )
rbuf_purge(&priv->tx_buf);
return n;
}
static int con_ipmi_getc(struct console_device* dev)
{
struct console_ipmi_priv_data* priv = (struct console_ipmi_priv_data*) dev->priv;
return rbuf_get( &priv->rx_buf );
}
int console_ipmi_process_request(struct console_device* dev, uint8_t *req, int size, uint8_t *rsp, int rsp_size )
{
struct console_ipmi_priv_data* priv = (struct console_ipmi_priv_data*) dev->priv;
int i;
for(i = 0; i < size; i++ )
{
rbuf_put( &priv->rx_buf, req[i] );
}
for(i = 0; i < rsp_size; i++)
{
if ( priv->tx_buf.count == 0 )
break;
rsp[i] = rbuf_get( &priv->tx_buf );
}
return i;
}
void console_ipmi_init( void )
{
console_ipmi_dev.priv = &console_ipmi_priv;
console_ipmi_dev.get_char = con_ipmi_getc;
console_ipmi_dev.put_string = con_ipmi_put_string;
rbuf_init(&console_ipmi_priv.rx_buf, IPMI_CON_RX_BUF_SIZE, console_ipmi_priv.rx_buf_mem);
rbuf_init(&console_ipmi_priv.tx_buf, IPMI_CON_TX_BUF_SIZE, console_ipmi_priv.tx_buf_mem);
console_register_device( &console_ipmi_dev );
}
#endif
......@@ -135,7 +135,7 @@ void console_uart_set_crlf_mode(int on)
console_uart_dev.flags &= ~CONSOLE_FLAGS_INSERT_CRLF;
}
static void console_register_device( struct console_device *dev )
void console_register_device( struct console_device *dev )
{
int i;
for(i = 0; i < BOARD_MAX_CONSOLE_DEVICES; i++)
......@@ -148,144 +148,6 @@ static void console_register_device( struct console_device *dev )
}
}
#ifdef CONFIG_IPMI_CONSOLE
#define IPMI_CON_TX_BUF_SIZE 1024
#define IPMI_CON_RX_BUF_SIZE 128
#define IPMI_CON_RX_TIMEOUT 1000
struct ring_buffer
{
uint8_t *data;
int head, tail, size, count;
};
struct console_ipmi_priv_data
{
uint8_t tx_buf_mem[IPMI_CON_TX_BUF_SIZE];
uint8_t rx_buf_mem[IPMI_CON_RX_BUF_SIZE];
struct ring_buffer rx_buf;
struct ring_buffer tx_buf;
};
struct console_device console_ipmi_dev;
struct console_ipmi_priv_data console_ipmi_priv;
static inline void rbuf_put( struct ring_buffer* buf, uint8_t c )
{
if (buf->count >= buf->size)
return;
buf->data[buf->head] = c;
buf->head++;
buf->count++;
if (buf->head >= buf->size)
buf->head = 0;
}
static inline int rbuf_get( struct ring_buffer* buf )
{
if( !buf->count )
return -1;
int rv = buf->data[buf->tail];
buf->tail++;
if (buf->tail >= buf->size)
buf->tail = 0;
buf->count--;
return rv;
}
static inline int rbuf_init( struct ring_buffer *buf, int size, uint8_t *mem )
{
buf->head = buf->tail = buf->count = 0;
buf->size = size;
buf->data = mem;
return 0;
}
static inline int rbuf_full(struct ring_buffer *buf)
{
return buf->size == buf->count;
}
static inline int rbuf_purge(struct ring_buffer *buf)
{
buf->head = buf->tail = buf->count = 0;
return 0;
}
static int con_ipmi_put_string(struct console_device* dev, const char *s)
{
struct console_ipmi_priv_data* priv = (struct console_ipmi_priv_data*) dev->priv;
int c, n = 0;
while( (c = *s++) != 0 )
{
rbuf_put( &priv->tx_buf, c );
n++;
}
if( rbuf_full(&priv->tx_buf ) )
rbuf_purge(&priv->tx_buf);
return n;
}
static int con_ipmi_getc(struct console_device* dev)
{
struct console_ipmi_priv_data* priv = (struct console_ipmi_priv_data*) dev->priv;
return rbuf_get( &priv->rx_buf );
}
int console_ipmi_process_request(struct console_device* dev, uint8_t *req, int size, uint8_t *rsp, int rsp_size )
{
struct console_ipmi_priv_data* priv = (struct console_ipmi_priv_data*) dev->priv;
int i;
for(i = 0; i < size; i++ )
{
puts_direct = 1;
//pp_printf("put %x\n", req[i] );
puts_direct = 0;
rbuf_put( &priv->rx_buf, req[i] );
}
for(i = 0; i < rsp_size; i++)
{
if ( priv->tx_buf.count == 0 )
break;
rsp[i] = rbuf_get( &priv->tx_buf );
}
puts_direct = 1;
//pp_printf("ConIPMIReq in %d out %d txb %d\n", size, i, cnt);
puts_direct = 0;
return i;
}
void console_ipmi_init( void )
{
console_ipmi_dev.priv = &console_ipmi_priv;
console_ipmi_dev.get_char = con_ipmi_getc;
console_ipmi_dev.put_string = con_ipmi_put_string;
rbuf_init(&console_ipmi_priv.rx_buf, IPMI_CON_RX_BUF_SIZE, console_ipmi_priv.rx_buf_mem);
rbuf_init(&console_ipmi_priv.tx_buf, IPMI_CON_TX_BUF_SIZE, console_ipmi_priv.tx_buf_mem);
console_register_device( &console_ipmi_dev );
}
#endif
static int con_netconsole_getc(struct console_device* dev)
{
return netconsole_read_byte();
......
......@@ -54,6 +54,8 @@ obj-$(CONFIG_TEMP_FAKE) += dev/temp-fake.o
obj-$(CONFIG_ETHERBONE) += dev/etherbone.o
obj-$(CONFIG_IPMI_CONSOLE) += dev/console-ipmi.o
# board specific dev
obj-$(CONFIG_TARGET_GENERIC_PHY_8BIT) += \
......
......@@ -39,8 +39,11 @@ int console_binary_recv_byte( struct console_device *dev );
void console_set_mode_switch_hook( struct console_device *dev, void (*callback)(int) );
void console_register_device( struct console_device *dev );
#ifdef CONFIG_IPMI_CONSOLE
int console_ipmi_process_request(struct console_device* dev, uint8_t *req, int size, uint8_t *rsp, int rsp_size );
void console_ipmi_init( void );
#endif
#endif
......
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