From 5a16b68db57beb35423a4550a25c70719ce5d041 Mon Sep 17 00:00:00 2001 From: Thomas Schoebel-Theuer Date: Mon, 5 Jul 2010 16:56:58 +0100 Subject: [PATCH] import mars-11.tgz --- mars.h | 66 ++++++++++++++++++++++++++++++++++++++---------- mars_dummy.c | 59 ++++++++++++++++++++++++++++++------------- mars_dummy.h | 5 ++++ mars_generic.c | 6 +++++ mars_if_device.h | 3 +++ 5 files changed, 107 insertions(+), 32 deletions(-) diff --git a/mars.h b/mars.h index b69c20e3..f5229c1d 100644 --- a/mars.h +++ b/mars.h @@ -206,26 +206,26 @@ struct generic_output { GENERIC_OUTPUT(generic); }; -#define _GENERIC_CALL(ERROR,PTR,OP,...) \ - ((PTR)->ops->OP ? (PTR)->ops->OP(__VA_ARGS__) : ERROR) \ +#define GENERIC_OUTPUT_CALL(OUTPUT,OP,...) \ + ((OUTPUT) && (OUTPUT)->ops->OP ? \ + (OUTPUT)->ops->OP(OUTPUT, ##__VA_ARGS__) : -ENOSYS) \ -#define GENERIC_CALL(PTR,OP,...) \ - _GENERIC_CALL(0, PTR, OP, __VA_ARGS__) \ - -#define GENERIC_CALL_FORCE(PTR,OP,...) \ - _GENERIC_CALL(-ENOSYS, PTR, OP, __VA_ARGS__) \ +#define GENERIC_INPUT_CALL(INPUT,OP,...) \ + ((INPUT) && (INPUT)->connect ? \ + GENERIC_OUTPUT_CALL((INPUT)->connect, OP, ##__VA_ARGS__) : \ + -ENOSYS) \ #define GENERIC_BRICK_OPS(PREFIX) \ - int (*brick_start)(struct PREFIX##_brick *brick); \ - int (*brick_stop)(struct PREFIX##_brick *brick); \ + /*int (*brick_start)(struct PREFIX##_brick *brick);*/ \ + /*int (*brick_stop)(struct PREFIX##_brick *brick);*/ \ struct generic_brick_ops { GENERIC_BRICK_OPS(generic); }; #define GENERIC_OUTPUT_OPS(PREFIX) \ - int (*output_start)(struct PREFIX##_output *output); \ - int (*output_stop)(struct PREFIX##_output *output); \ + /*int (*output_start)(struct PREFIX##_output *output);*/ \ + /*int (*output_stop)(struct PREFIX##_output *output);*/ \ int (*make_object_layout)(struct PREFIX##_output *output, struct generic_object_layout *object_layout); \ struct generic_output_ops { @@ -475,15 +475,15 @@ extern inline int INPUT_PREFIX##_##OUTPUT_PREFIX####_disconnect( \ } \ ) +///////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////// // MARS-specific definitions // object stuff -#define HT_SHIFT 6 //???? -#define MARS_MAX_SEGMENT_SIZE (1U << (9+HT_SHIFT)) - +/* mars_io */ extern const struct generic_object_type mars_io_type; struct mars_io_aspect { @@ -507,11 +507,44 @@ struct mars_io_object { MARS_IO_OBJECT(mars_io); }; +/* mars_buf */ +#define MARS_BUF_UPTODATE 1 +#define MARS_BUF_DIRTY 2 + +extern const struct generic_object_type mars_buffer_type; + +struct mars_buf_aspect { + GENERIC_ASPECT(mars_buf); +}; + +struct mars_buf_aspect_layout { + GENERIC_ASPECT_LAYOUT(mars_buf); +}; + +struct mars_buf_object_layout { + GENERIC_OBJECT_LAYOUT(mars_buf); +}; + +#define MARS_BUF_OBJECT(PREFIX) \ + MARS_IO_OBJECT(PREFIX); \ + spinlock_t buf_lock; \ + void *buf_data; \ + int buf_len; \ + int buf_flags; \ + loff_t buf_pos; \ + +struct mars_buf_object { + MARS_BUF_OBJECT(mars_buf); +}; + GENERIC_OBJECT_LAYOUT_FUNCTIONS(mars_io); +GENERIC_OBJECT_LAYOUT_FUNCTIONS(mars_buf); GENERIC_OBJECT_FUNCTIONS(mars_io); +GENERIC_OBJECT_FUNCTIONS(mars_buf); // brick stuff +extern const struct generic_object_type mars_buf_type; #define MARS_BRICK(PREFIX) \ GENERIC_BRICK(PREFIX); \ @@ -540,8 +573,13 @@ struct mars_output { #define MARS_OUTPUT_OPS(PREFIX) \ GENERIC_OUTPUT_OPS(PREFIX); \ + /* mars_io */ \ int (*mars_io)(struct PREFIX##_output *output, struct mars_io_object *mio); \ loff_t (*mars_get_size)(struct PREFIX##_output *output); \ + /* mars_buf */ \ + int (*mars_buf_get)(struct PREFIX##_output *output, struct mars_buf_object **mbuf, struct mars_buf_object_layout *buf_layout, loff_t pos, int len); \ + int (*mars_buf_put)(struct PREFIX##_output *output, struct mars_buf_object *mbuf); \ + int (*mars_buf_io)(struct PREFIX##_output *output, struct mars_buf_object *mbuf, int rw, int(*buf_endio)(struct mars_buf_object *mbuf)); \ // all non-extendable types #define _MARS_TYPES(PREFIX) \ diff --git a/mars_dummy.c b/mars_dummy.c index d63cba84..a41a89fb 100644 --- a/mars_dummy.c +++ b/mars_dummy.c @@ -17,47 +17,67 @@ static int dummy_io(struct dummy_output *output, struct mars_io_object *mio) { struct dummy_input *input = output->brick->inputs[0]; - struct dummy_output *other; - if (unlikely(!input)) - return -ENOSYS; - other = input->connect; - if (unlikely(!other || !other->ops || !other->ops->mars_io)) - return -ENOSYS; - return other->ops->mars_io(other, mio); + return GENERIC_INPUT_CALL(input, mars_io, mio); } static loff_t dummy_get_size(struct dummy_output *output) { struct dummy_input *input = output->brick->inputs[0]; - struct dummy_output *other; - if (unlikely(!input)) - return -ENOSYS; - other = input->connect; - if (unlikely(!other || !other->ops || !other->ops->mars_get_size)) - return -ENOSYS; - return other->ops->mars_get_size(other); + return GENERIC_INPUT_CALL(input, mars_get_size); +} + +static int dummy_buf_get(struct dummy_output *output, struct mars_buf_object **mbuf, struct mars_buf_object_layout *buf_layout, loff_t pos, int len) +{ + struct dummy_input *input = output->brick->inputs[0]; + return GENERIC_INPUT_CALL(input, mars_buf_get, mbuf, buf_layout, pos, len); +} + +static int dummy_buf_put(struct dummy_output *output, struct mars_buf_object *mbuf) +{ + struct dummy_input *input = output->brick->inputs[0]; + return GENERIC_INPUT_CALL(input, mars_buf_put, mbuf); +} + +static int dummy_buf_io(struct dummy_output *output, struct mars_buf_object *mbuf, int rw, int(*buf_endio)(struct mars_buf_object *mbuf)) +{ + struct dummy_input *input = output->brick->inputs[0]; + return GENERIC_INPUT_CALL(input, mars_buf_io, mbuf, rw, buf_endio); } //////////////// object / aspect constructors / destructors /////////////// -static int dummy_aspect_init_fn(struct mars_io_aspect *_ini, void *_init_data) +static int dummy_mars_io_aspect_init_fn(struct mars_io_aspect *_ini, void *_init_data) { struct dummy_mars_io_aspect *ini = (void*)_ini; ini->my_own = 0; return 0; } +static int dummy_mars_buf_aspect_init_fn(struct mars_buf_aspect *_ini, void *_init_data) +{ + struct dummy_mars_buf_aspect *ini = (void*)_ini; + ini->my_own = 0; + return 0; +} + static int dummy_make_object_layout(struct dummy_output *output, struct generic_object_layout *object_layout) { const struct generic_object_type *object_type = object_layout->type; int res; + int aspect_size = 0; struct dummy_brick *brick = output->brick; int i; - if (object_type != &mars_io_type) + if (object_type == &mars_io_type) { + aspect_size = sizeof(struct dummy_mars_io_aspect); + res = mars_io_add_aspect(object_layout, aspect_size, dummy_mars_io_aspect_init_fn, output); + } else if (object_type == &mars_buf_type) { + aspect_size = sizeof(struct dummy_mars_buf_aspect); + res = mars_buf_add_aspect(object_layout, aspect_size, dummy_mars_buf_aspect_init_fn, output); + } else { return 0; + } - res = mars_io_add_aspect(object_layout, sizeof(struct dummy_mars_io_aspect), dummy_aspect_init_fn, output); if (res < 0) return res; @@ -73,7 +93,7 @@ static int dummy_make_object_layout(struct dummy_output *output, struct generic_ } } - return res + sizeof(struct dummy_mars_io_aspect); + return res + aspect_size; } ////////////////////// brick constructors / destructors //////////////////// @@ -99,6 +119,9 @@ static struct dummy_output_ops dummy_output_ops = { .make_object_layout = dummy_make_object_layout, .mars_io = dummy_io, .mars_get_size = dummy_get_size, + .mars_buf_get = dummy_buf_get, + .mars_buf_put = dummy_buf_put, + .mars_buf_io = dummy_buf_io, }; static struct dummy_input_type dummy_input_type = { diff --git a/mars_dummy.h b/mars_dummy.h index 4ff04d6d..e70dd76c 100644 --- a/mars_dummy.h +++ b/mars_dummy.h @@ -7,6 +7,11 @@ struct dummy_mars_io_aspect { int my_own; }; +struct dummy_mars_buf_aspect { + GENERIC_ASPECT(mars_buf); + int my_own; +}; + struct dummy_brick { MARS_BRICK(dummy); int my_own; diff --git a/mars_generic.c b/mars_generic.c index 72a8ffe1..c10303f2 100644 --- a/mars_generic.c +++ b/mars_generic.c @@ -17,6 +17,12 @@ const struct generic_object_type mars_io_type = { }; EXPORT_SYMBOL_GPL(mars_io_type); +const struct generic_object_type mars_buf_type = { + .object_type_name = "mars_buf", + .default_size = sizeof(struct mars_buf_object), +}; +EXPORT_SYMBOL_GPL(mars_buf_type); + ////////////////////////////////////////////////////////////// // brick stuff diff --git a/mars_if_device.h b/mars_if_device.h index d6acf6a7..04a4da44 100644 --- a/mars_if_device.h +++ b/mars_if_device.h @@ -2,6 +2,9 @@ #ifndef MARS_IF_DEVICE_H #define MARS_IF_DEVICE_H +#define HT_SHIFT 6 //???? +#define MARS_MAX_SEGMENT_SIZE (1U << (9+HT_SHIFT)) + struct if_device_brick { MARS_BRICK(if_device); };