This commit is contained in:
Carl-Benedikt Krüger 2011-08-04 15:20:18 +02:00
parent 8082128fc1
commit 070fffd9c0

View file

@ -18,7 +18,7 @@
#define kmalloc malloc
#define kfree(x,y) free(x)
#define RCCE_shfree(x) VirtualFree(x,NULL,NULL);
#define RCCE_shmalloc(x) VirtualAlloc((char*)0x41000000,x,MEM_COMMIT|MEM_RESERVE,PAGE_READWRITE);
#include "mailbox.h" /* mailbox_ptr_t */
#else
#include <metalsvm/mailbox.h> /* mailbox_ptr_t */
@ -168,6 +168,7 @@ typedef struct mmnif_device_stats
} mmnif_device_stats_t;
/* receive descror structure */
typedef struct rx_desc
{
uint8_t stat;
@ -192,44 +193,48 @@ typedef struct mm_rx_buffer
uint16_t head;
uint16_t tail;
spinlock_t rlock;
/*
*
/* descritpor queue
* desc_table : descriptor table
* dcount : descriptor's free in queue
* dread : next descriptor to read
* dwrite : next descriptor to write
* dlock : lock to protect these members
*/
rx_desc_t desc_table[MMNIF_MAX_DESCRIPTORS];
uint8_t dcount;
uint8_t dread;
uint8_t dwrite;
spinlock_t dlock;
} mm_rx_buffer_t;
typedef struct mmnif
{
struct mmnif_device_stats stats;
struct mmnif_device_stats stats;
/* Interface constants:
* - ehternet address
* - local ip address
* - local ip address
*/
struct eth_addr* ethaddr;
uint32_t ipaddr;
struct eth_addr* ethaddr;
uint32_t ipaddr;
/* memory interaction variables:
* - transmit queue
* - pointer to transmit buffer
* - pointer to recive buffer
*/
uint8_t tx_queue;
uint8_t* tx_buff[MMNIF_TX_QUEUELEN];
mm_rx_buffer_t* rx_buff;
uint8_t tx_queue;
uint8_t* tx_buff[MMNIF_TX_QUEUELEN];
mm_rx_buffer_t* rx_buff;
spinlock_t lock;
/* lock to protect members
*/
spinlock_t lock;
sem_t com_poll;
/*
*/
sem_t com_poll;
/* comunication mailbox
*/
mailbox_ptr_t mbox;
}mmnif_t;
@ -253,7 +258,7 @@ __inline int RCCE_ue(void){
#endif
/* trigger an interrupt on the remote processor
*
* so he knows there is a packet to read
*/
__inline int mmnif_trigger_irq(dest_ip)
{
@ -279,45 +284,8 @@ __inline int mmnif_trigger_irq(dest_ip)
return 0;
#endif
};
/* Allocate Shared Memory for communication this could be:
* - in Message Passing Buffer
* - Shared Memory Address Space (0x8000000 + )
*
* Note: under windows this is kernel space so we take arbitrary 0x41000000 here
*/
__inline void* mmnif_shmalloc()
{
#ifdef WIN32
mpb_size = sizeof(mm_rx_buffer_t) + MMNIF_RX_BUFFERLEN;
mpb_start_address = VirtualAlloc((char*)0x41000000 /*+
(mpb_size) * (own_ip_address - router_ip_address)*/,
mpb_size *MMNIF_CORES,MEM_COMMIT|MEM_RESERVE,PAGE_READWRITE);
return (char*)0x41000000 + (mpb_size) * (own_ip_address - router_ip_address);
#else
mpb_size = (sizeof(mm_rx_buffer_t) + MMNIF_RX_BUFFERLEN);
mpb_start_address = RCCE_shmalloc(mpb_size*MMNIF_CORES);
return mpb_start_address + (mpb_size) * (own_ip_address - router_ip_address);
#endif
}
/* mmnif_timestamp(): genereate a timestamp for the
* packets
*/
__inline int mmnif_timestamp()
{
#ifdef WIN32
return GetTickCount();
#else
return get_clock_tick();
#endif
}
/* mmnif_get_device_stats(): Returns a copy of the
* current device
*/
@ -333,7 +301,6 @@ mmnif_device_stats_t mmnif_get_device_stats()
return stats;
}
/* mmnif_print_stats(): Print the devices stats of the
* current device
*/
@ -408,14 +375,15 @@ uint8_t mmnif_get_destination(struct netif* netif, struct pbuf* p)
return core;
}
/*
*
/* mmnif_rxbuff_alloc():
* this function allocates a continues chunk of memory
* right inside of the buffer which is used for communication
* with the remote end
*/
uint32_t mmnif_rxbuff_alloc(uint8_t dest,uint16_t len)
{
mmnif_t* mmnif = mmnif_dev->state;
mm_rx_buffer_t* rb = (mm_rx_buffer_t*)((char*)mpb_start_address + ( dest -1 ) * mpb_size);
char* memblock = (char*)rb + sizeof(mm_rx_buffer_t);
char* memblock = (char*)rb + sizeof(mm_rx_buffer_t);
uint32_t ret;
@ -506,12 +474,12 @@ uint32_t mmnif_rxbuff_alloc(uint8_t dest,uint16_t len)
}
}
/*
*
/* mmnif_commit_packet: this function set the state of the (in advance)
* allocated packet to RDY so the recieve queue knows that it can be
* processed further
*/
int mmnif_commit_packet(uint8_t dest,uint32_t addr)
{
mmnif_t* mmnif = mmnif_dev->state;
mm_rx_buffer_t* rb = (mm_rx_buffer_t*)((char*)mpb_start_address + ( dest -1 ) * mpb_size);
uint32_t i;
@ -739,8 +707,12 @@ err_t mmnif_init(struct netif* netif)
/* Alloc and clear shared memory for rx_buff
*/
mmnif->rx_buff = mmnif_shmalloc();
if (!(mmnif->rx_buff))
mpb_size = (sizeof(mm_rx_buffer_t) + MMNIF_RX_BUFFERLEN);
mpb_start_address = RCCE_shmalloc(mpb_size*MMNIF_CORES);
mmnif->rx_buff = mpb_start_address + (mpb_size) * (own_ip_address - router_ip_address);
if (!(mpb_start_address))
{
DEBUGPRINTF("mmnif init(): allocating shared memory failed\n");
return ERR_MEM;