DDK update - includes

git-svn-id: svn://kolibrios.org@1970 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Sergey Semyonov (Serge) 2011-06-24 15:16:16 +00:00
parent 6ffb5af90e
commit 99ca1d651b
23 changed files with 221 additions and 99 deletions

View File

@ -7,7 +7,7 @@ DRV_INCLUDES = $(DRV_TOPDIR)/include
INCLUDES = -I$(DRV_INCLUDES) -I$(DRV_INCLUDES)/linux -I$(DRV_INCLUDES)/linux/asm INCLUDES = -I$(DRV_INCLUDES) -I$(DRV_INCLUDES)/linux -I$(DRV_INCLUDES)/linux/asm
DEFINES = -DKOLIBRI -D__KERNEL__ -DCONFIG_X86_32 DEFINES = -DKOLIBRI -D__KERNEL__ -DCONFIG_X86_32
CFLAGS = -c -Os $(INCLUDES) $(DEFINES) -march=i486 -fomit-frame-pointer -fno-builtin-printf \ CFLAGS = -c -Os $(INCLUDES) $(DEFINES) -march=i586 -fomit-frame-pointer -fno-builtin-printf \
-mno-stack-arg-probe -mpreferred-stack-boundary=2 -mincoming-stack-boundary=2 -mno-stack-arg-probe -mpreferred-stack-boundary=2 -mincoming-stack-boundary=2
NAME:= libddk NAME:= libddk
@ -81,3 +81,7 @@ libcore.a: core.S Makefile
%.o: %.c Makefile ../include/*.h ../include/linux/*.h %.o: %.c Makefile ../include/*.h ../include/linux/*.h
$(CC) $(CFLAGS) -o $@ $< $(CC) $(CFLAGS) -o $@ $<
clean:
-rm -f */*.o

View File

@ -9,12 +9,6 @@
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
typedef u64 dma64_addr_t; typedef u64 dma64_addr_t;
#if defined(CONFIG_X86_64) || defined(CONFIG_HIGHMEM64G)
/* DMA addresses come in 32-bit and 64-bit flavours. */
typedef u64 dma_addr_t;
#else
typedef u32 dma_addr_t;
#endif
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */

View File

@ -55,7 +55,8 @@
* bitmap_parse(buf, buflen, dst, nbits) Parse bitmap dst from kernel buf * bitmap_parse(buf, buflen, dst, nbits) Parse bitmap dst from kernel buf
* bitmap_parse_user(ubuf, ulen, dst, nbits) Parse bitmap dst from user buf * bitmap_parse_user(ubuf, ulen, dst, nbits) Parse bitmap dst from user buf
* bitmap_scnlistprintf(buf, len, src, nbits) Print bitmap src as list to buf * bitmap_scnlistprintf(buf, len, src, nbits) Print bitmap src as list to buf
* bitmap_parselist(buf, dst, nbits) Parse bitmap dst from list * bitmap_parselist(buf, dst, nbits) Parse bitmap dst from kernel buf
* bitmap_parselist_user(buf, dst, nbits) Parse bitmap dst from user buf
* bitmap_find_free_region(bitmap, bits, order) Find and allocate bit region * bitmap_find_free_region(bitmap, bits, order) Find and allocate bit region
* bitmap_release_region(bitmap, pos, order) Free specified bit region * bitmap_release_region(bitmap, pos, order) Free specified bit region
* bitmap_allocate_region(bitmap, pos, order) Allocate specified bit region * bitmap_allocate_region(bitmap, pos, order) Allocate specified bit region
@ -129,6 +130,8 @@ extern int bitmap_scnlistprintf(char *buf, unsigned int len,
const unsigned long *src, int nbits); const unsigned long *src, int nbits);
extern int bitmap_parselist(const char *buf, unsigned long *maskp, extern int bitmap_parselist(const char *buf, unsigned long *maskp,
int nmaskbits); int nmaskbits);
extern int bitmap_parselist_user(const char __user *ubuf, unsigned int ulen,
unsigned long *dst, int nbits);
extern void bitmap_remap(unsigned long *dst, const unsigned long *src, extern void bitmap_remap(unsigned long *dst, const unsigned long *src,
const unsigned long *old, const unsigned long *new, int bits); const unsigned long *old, const unsigned long *new, int bits);
extern int bitmap_bitremap(int oldbit, extern int bitmap_bitremap(int oldbit,

View File

@ -109,6 +109,17 @@ static inline __u8 ror8(__u8 word, unsigned int shift)
return (word >> shift) | (word << (8 - shift)); return (word >> shift) | (word << (8 - shift));
} }
/**
* sign_extend32 - sign extend a 32-bit value using specified bit as sign-bit
* @value: value to sign extend
* @index: 0 based bit index (0<=index<32) to sign bit
*/
static inline __s32 sign_extend32(__u32 value, int index)
{
__u8 shift = 31 - index;
return (__s32)(value << shift) >> shift;
}
static inline unsigned fls_long(unsigned long l) static inline unsigned fls_long(unsigned long l)
{ {
if (sizeof(l) == 4) if (sizeof(l) == 4)
@ -137,7 +148,7 @@ static inline unsigned long __ffs64(u64 word)
#ifdef __KERNEL__ #ifdef __KERNEL__
#ifdef CONFIG_GENERIC_FIND_LAST_BIT #ifndef find_last_bit
/** /**
* find_last_bit - find the last set bit in a memory region * find_last_bit - find the last set bit in a memory region
* @addr: The address to start the search at * @addr: The address to start the search at
@ -147,7 +158,7 @@ static inline unsigned long __ffs64(u64 word)
*/ */
extern unsigned long find_last_bit(const unsigned long *addr, extern unsigned long find_last_bit(const unsigned long *addr,
unsigned long size); unsigned long size);
#endif /* CONFIG_GENERIC_FIND_LAST_BIT */ #endif
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
#endif #endif

View File

@ -34,8 +34,12 @@
__asm__ ("" : "=r"(__ptr) : "0"(ptr)); \ __asm__ ("" : "=r"(__ptr) : "0"(ptr)); \
(typeof(ptr)) (__ptr + (off)); }) (typeof(ptr)) (__ptr + (off)); })
#ifdef __CHECKER__
#define __must_be_array(arr) 0
#else
/* &a[0] degrades to a pointer: a different type from an array */ /* &a[0] degrades to a pointer: a different type from an array */
#define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0])) #define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0]))
#endif
/* /*
* Force always-inline if the user requests it so via the .config, * Force always-inline if the user requests it so via the .config,
@ -92,3 +96,11 @@
#if !defined(__noclone) #if !defined(__noclone)
#define __noclone /* not needed */ #define __noclone /* not needed */
#endif #endif
/*
* A trick to suppress uninitialized variable warning without generating any
* code
*/
#define uninitialized_var(x) x = x
#define __always_inline inline __attribute__((always_inline))

View File

@ -21,11 +21,3 @@
# error "GCOV profiling support for gcc versions below 3.4 not included" # error "GCOV profiling support for gcc versions below 3.4 not included"
# endif /* __GNUC_MINOR__ */ # endif /* __GNUC_MINOR__ */
#endif /* CONFIG_GCOV_KERNEL */ #endif /* CONFIG_GCOV_KERNEL */
/*
* A trick to suppress uninitialized variable warning without generating any
* code
*/
#define uninitialized_var(x) x = x
#define __always_inline inline __attribute__((always_inline))

View File

@ -12,13 +12,6 @@
#define __used __attribute__((__used__)) #define __used __attribute__((__used__))
#define __must_check __attribute__((warn_unused_result)) #define __must_check __attribute__((warn_unused_result))
#define __compiler_offsetof(a,b) __builtin_offsetof(a,b) #define __compiler_offsetof(a,b) __builtin_offsetof(a,b)
#define __always_inline inline __attribute__((always_inline))
/*
* A trick to suppress uninitialized variable warning without generating any
* code
*/
#define uninitialized_var(x) x = x
#if __GNUC_MINOR__ >= 3 #if __GNUC_MINOR__ >= 3
/* Mark functions as cold. gcc will assume any path leading to a call /* Mark functions as cold. gcc will assume any path leading to a call
@ -53,13 +46,12 @@
#define __noclone __attribute__((__noclone__)) #define __noclone __attribute__((__noclone__))
#endif #endif
#endif #endif
#if __GNUC_MINOR__ > 0 #if __GNUC_MINOR__ > 0
#define __compiletime_object_size(obj) __builtin_object_size(obj, 0) #define __compiletime_object_size(obj) __builtin_object_size(obj, 0)
#endif #endif
#if __GNUC_MINOR__ >= 4 #if __GNUC_MINOR__ >= 4 && !defined(__CHECKER__)
#define __compiletime_warning(message) __attribute__((warning(message))) #define __compiletime_warning(message) __attribute__((warning(message)))
#define __compiletime_error(message) __attribute__((error(message))) #define __compiletime_error(message) __attribute__((error(message)))
#endif #endif

View File

@ -151,6 +151,8 @@ struct dentry;
#define FB_ACCEL_PROSAVAGE_DDR 0x8d /* S3 ProSavage DDR */ #define FB_ACCEL_PROSAVAGE_DDR 0x8d /* S3 ProSavage DDR */
#define FB_ACCEL_PROSAVAGE_DDRK 0x8e /* S3 ProSavage DDR-K */ #define FB_ACCEL_PROSAVAGE_DDRK 0x8e /* S3 ProSavage DDR-K */
#define FB_ACCEL_PUV3_UNIGFX 0xa0 /* PKUnity-v3 Unigfx */
struct fb_fix_screeninfo { struct fb_fix_screeninfo {
char id[16]; /* identification string eg "TT Builtin" */ char id[16]; /* identification string eg "TT Builtin" */
unsigned long smem_start; /* Start of frame buffer mem */ unsigned long smem_start; /* Start of frame buffer mem */
@ -404,6 +406,7 @@ struct fb_cursor {
#include <linux/list.h> #include <linux/list.h>
#include <linux/mutex.h> #include <linux/mutex.h>
//#include <linux/backlight.h> //#include <linux/backlight.h>
#include <linux/slab.h>
//#include <asm/io.h> //#include <asm/io.h>
struct vm_area_struct; struct vm_area_struct;
@ -531,14 +534,14 @@ struct fb_cursor_user {
#define FB_EVENT_GET_CONSOLE_MAP 0x07 #define FB_EVENT_GET_CONSOLE_MAP 0x07
/* CONSOLE-SPECIFIC: set console to framebuffer mapping */ /* CONSOLE-SPECIFIC: set console to framebuffer mapping */
#define FB_EVENT_SET_CONSOLE_MAP 0x08 #define FB_EVENT_SET_CONSOLE_MAP 0x08
/* A hardware display blank change occured */ /* A hardware display blank change occurred */
#define FB_EVENT_BLANK 0x09 #define FB_EVENT_BLANK 0x09
/* Private modelist is to be replaced */ /* Private modelist is to be replaced */
#define FB_EVENT_NEW_MODELIST 0x0A #define FB_EVENT_NEW_MODELIST 0x0A
/* The resolution of the passed in fb_info about to change and /* The resolution of the passed in fb_info about to change and
all vc's should be changed */ all vc's should be changed */
#define FB_EVENT_MODE_CHANGE_ALL 0x0B #define FB_EVENT_MODE_CHANGE_ALL 0x0B
/* A software display blank change occured */ /* A software display blank change occurred */
#define FB_EVENT_CONBLANK 0x0C #define FB_EVENT_CONBLANK 0x0C
/* Get drawing requirements */ /* Get drawing requirements */
#define FB_EVENT_GET_REQ 0x0D #define FB_EVENT_GET_REQ 0x0D
@ -795,7 +798,7 @@ struct fb_tile_ops {
/* A driver may set this flag to indicate that it does want a set_par to be /* A driver may set this flag to indicate that it does want a set_par to be
* called every time when fbcon_switch is executed. The advantage is that with * called every time when fbcon_switch is executed. The advantage is that with
* this flag set you can really be sure that set_par is always called before * this flag set you can really be sure that set_par is always called before
* any of the functions dependant on the correct hardware state or altering * any of the functions dependent on the correct hardware state or altering
* that state, even if you are using some broken X releases. The disadvantage * that state, even if you are using some broken X releases. The disadvantage
* is that it introduces unwanted delays to every console switch if set_par * is that it introduces unwanted delays to every console switch if set_par
* is slow. It is a good idea to try this flag in the drivers initialization * is slow. It is a good idea to try this flag in the drivers initialization
@ -822,6 +825,7 @@ struct fb_tile_ops {
#define FBINFO_CAN_FORCE_OUTPUT 0x200000 #define FBINFO_CAN_FORCE_OUTPUT 0x200000
struct fb_info { struct fb_info {
atomic_t count;
int node; int node;
int flags; int flags;
struct mutex lock; /* Lock for open/release/ioctl funcs */ struct mutex lock; /* Lock for open/release/ioctl funcs */
@ -867,7 +871,7 @@ struct fb_info {
void *fbcon_par; /* fbcon use-only private area */ void *fbcon_par; /* fbcon use-only private area */
/* From here on everything is device dependent */ /* From here on everything is device dependent */
void *par; void *par;
/* we need the PCI or similiar aperture base/size not /* we need the PCI or similar aperture base/size not
smem_start/size as smem_start may just be an object smem_start/size as smem_start may just be an object
allocated inside the aperture so may not actually overlap */ allocated inside the aperture so may not actually overlap */
struct apertures_struct { struct apertures_struct {

View File

@ -1,10 +1,10 @@
#ifndef _LINUX_FIRMWARE_H #ifndef _LINUX_FIRMWARE_H
#define _LINUX_FIRMWARE_H #define _LINUX_FIRMWARE_H
#include <linux/module.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/compiler.h> #include <linux/compiler.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/module.h>
#define FW_ACTION_NOHOTPLUG 0 #define FW_ACTION_NOHOTPLUG 0
#define FW_ACTION_HOTPLUG 1 #define FW_ACTION_HOTPLUG 1

View File

@ -52,8 +52,8 @@ extern int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs,
/** /**
* struct i2c_driver - represent an I2C device driver * struct i2c_driver - represent an I2C device driver
* @class: What kind of i2c device we instantiate (for detect) * @class: What kind of i2c device we instantiate (for detect)
* @attach_adapter: Callback for bus addition (for legacy drivers) * @attach_adapter: Callback for bus addition (deprecated)
* @detach_adapter: Callback for bus removal (for legacy drivers) * @detach_adapter: Callback for bus removal (deprecated)
* @probe: Callback for device binding * @probe: Callback for device binding
* @remove: Callback for device unbinding * @remove: Callback for device unbinding
* @shutdown: Callback for device shutdown * @shutdown: Callback for device shutdown
@ -94,8 +94,8 @@ struct i2c_driver {
* removed. You should avoid using this, it will be removed in a * removed. You should avoid using this, it will be removed in a
* near future. * near future.
*/ */
int (*attach_adapter)(struct i2c_adapter *); int (*attach_adapter)(struct i2c_adapter *) __deprecated;
int (*detach_adapter)(struct i2c_adapter *); int (*detach_adapter)(struct i2c_adapter *) __deprecated;
/* Standard driver model interfaces */ /* Standard driver model interfaces */
int (*probe)(struct i2c_client *, const struct i2c_device_id *); int (*probe)(struct i2c_client *, const struct i2c_device_id *);
@ -252,7 +252,7 @@ struct i2c_adapter {
}; };
#define to_i2c_adapter(d) container_of(d, struct i2c_adapter, dev) #define to_i2c_adapter(d) container_of(d, struct i2c_adapter, dev)
static inline void *i2c_get_adapdata(const struct i2c_adapter *dev) static inline void *i2c_get_adapdata(struct i2c_adapter *dev)
{ {
return dev_get_drvdata(&dev->dev); return dev_get_drvdata(&dev->dev);
} }

View File

@ -11,6 +11,7 @@
#include <linux/stddef.h> #include <linux/stddef.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/compiler.h> #include <linux/compiler.h>
#include <linux/bitops.h>
#define USHRT_MAX ((u16)(~0U)) #define USHRT_MAX ((u16)(~0U))
#define SHRT_MAX ((s16)(USHRT_MAX>>1)) #define SHRT_MAX ((s16)(USHRT_MAX>>1))
@ -54,6 +55,20 @@
#define KERN_NOTICE "<5>" /* normal but significant condition */ #define KERN_NOTICE "<5>" /* normal but significant condition */
#define KERN_INFO "<6>" /* informational */ #define KERN_INFO "<6>" /* informational */
#define KERN_DEBUG "<7>" /* debug-level messages */ #define KERN_DEBUG "<7>" /* debug-level messages */
extern const char hex_asc[];
#define hex_asc_lo(x) hex_asc[((x) & 0x0f)]
#define hex_asc_hi(x) hex_asc[((x) & 0xf0) >> 4]
static inline char *pack_hex_byte(char *buf, u8 byte)
{
*buf++ = hex_asc_hi(byte);
*buf++ = hex_asc_lo(byte);
return buf;
}
extern int hex_to_bin(char ch);
extern void hex2bin(u8 *dst, const char *src, size_t count);
//int printk(const char *fmt, ...); //int printk(const char *fmt, ...);
@ -77,6 +92,52 @@
(void) (&_max1 == &_max2); \ (void) (&_max1 == &_max2); \
_max1 > _max2 ? _max1 : _max2; }) _max1 > _max2 ? _max1 : _max2; })
#define min3(x, y, z) ({ \
typeof(x) _min1 = (x); \
typeof(y) _min2 = (y); \
typeof(z) _min3 = (z); \
(void) (&_min1 == &_min2); \
(void) (&_min1 == &_min3); \
_min1 < _min2 ? (_min1 < _min3 ? _min1 : _min3) : \
(_min2 < _min3 ? _min2 : _min3); })
#define max3(x, y, z) ({ \
typeof(x) _max1 = (x); \
typeof(y) _max2 = (y); \
typeof(z) _max3 = (z); \
(void) (&_max1 == &_max2); \
(void) (&_max1 == &_max3); \
_max1 > _max2 ? (_max1 > _max3 ? _max1 : _max3) : \
(_max2 > _max3 ? _max2 : _max3); })
/**
* min_not_zero - return the minimum that is _not_ zero, unless both are zero
* @x: value1
* @y: value2
*/
#define min_not_zero(x, y) ({ \
typeof(x) __x = (x); \
typeof(y) __y = (y); \
__x == 0 ? __y : ((__y == 0) ? __x : min(__x, __y)); })
/**
* clamp - return a value clamped to a given range with strict typechecking
* @val: current value
* @min: minimum allowable value
* @max: maximum allowable value
*
* This macro does strict typechecking of min/max to make sure they are of the
* same type as val. See the unnecessary pointer comparisons.
*/
#define clamp(val, min, max) ({ \
typeof(val) __val = (val); \
typeof(min) __min = (min); \
typeof(max) __max = (max); \
(void) (&__val == &__min); \
(void) (&__val == &__max); \
__val = __val < __min ? __min: __val; \
__val > __max ? __max: __val; })
/* /*
* ..and if you can't take the strict * ..and if you can't take the strict
* types, you can specify one yourself. * types, you can specify one yourself.
@ -112,17 +173,6 @@ static inline void *kcalloc(size_t n, size_t size, uint32_t flags)
return kzalloc(n * size, 0); return kzalloc(n * size, 0);
} }
extern const char hex_asc[];
#define hex_asc_lo(x) hex_asc[((x) & 0x0f)]
#define hex_asc_hi(x) hex_asc[((x) & 0xf0) >> 4]
static inline char *pack_hex_byte(char *buf, u8 byte)
{
*buf++ = hex_asc_hi(byte);
*buf++ = hex_asc_lo(byte);
return buf;
}
void free (void *ptr); void free (void *ptr);

View File

@ -24,5 +24,7 @@ struct kref {
void kref_init(struct kref *kref); void kref_init(struct kref *kref);
void kref_get(struct kref *kref); void kref_get(struct kref *kref);
int kref_put(struct kref *kref, void (*release) (struct kref *kref)); int kref_put(struct kref *kref, void (*release) (struct kref *kref));
int kref_sub(struct kref *kref, unsigned int count,
void (*release) (struct kref *kref));
#endif /* _KREF_H_ */ #endif /* _KREF_H_ */

View File

@ -5,8 +5,6 @@
#include <linux/stddef.h> #include <linux/stddef.h>
#include <linux/poison.h> #include <linux/poison.h>
#define prefetch(x) __builtin_prefetch(x)
/* /*
* Simple doubly linked list implementation. * Simple doubly linked list implementation.
* *
@ -97,6 +95,11 @@ static inline void __list_del(struct list_head * prev, struct list_head * next)
* in an undefined state. * in an undefined state.
*/ */
#ifndef CONFIG_DEBUG_LIST #ifndef CONFIG_DEBUG_LIST
static inline void __list_del_entry(struct list_head *entry)
{
__list_del(entry->prev, entry->next);
}
static inline void list_del(struct list_head *entry) static inline void list_del(struct list_head *entry)
{ {
__list_del(entry->prev, entry->next); __list_del(entry->prev, entry->next);
@ -104,6 +107,7 @@ static inline void list_del(struct list_head *entry)
entry->prev = LIST_POISON2; entry->prev = LIST_POISON2;
} }
#else #else
extern void __list_del_entry(struct list_head *entry);
extern void list_del(struct list_head *entry); extern void list_del(struct list_head *entry);
#endif #endif
@ -136,7 +140,7 @@ static inline void list_replace_init(struct list_head *old,
*/ */
static inline void list_del_init(struct list_head *entry) static inline void list_del_init(struct list_head *entry)
{ {
__list_del(entry->prev, entry->next); __list_del_entry(entry);
INIT_LIST_HEAD(entry); INIT_LIST_HEAD(entry);
} }
@ -147,7 +151,7 @@ static inline void list_del_init(struct list_head *entry)
*/ */
static inline void list_move(struct list_head *list, struct list_head *head) static inline void list_move(struct list_head *list, struct list_head *head)
{ {
__list_del(list->prev, list->next); __list_del_entry(list);
list_add(list, head); list_add(list, head);
} }
@ -159,7 +163,7 @@ static inline void list_move(struct list_head *list, struct list_head *head)
static inline void list_move_tail(struct list_head *list, static inline void list_move_tail(struct list_head *list,
struct list_head *head) struct list_head *head)
{ {
__list_del(list->prev, list->next); __list_del_entry(list);
list_add_tail(list, head); list_add_tail(list, head);
} }
@ -362,18 +366,15 @@ static inline void list_splice_tail_init(struct list_head *list,
* @head: the head for your list. * @head: the head for your list.
*/ */
#define list_for_each(pos, head) \ #define list_for_each(pos, head) \
for (pos = (head)->next; prefetch(pos->next), pos != (head); \ for (pos = (head)->next; pos != (head); pos = pos->next)
pos = pos->next)
/** /**
* __list_for_each - iterate over a list * __list_for_each - iterate over a list
* @pos: the &struct list_head to use as a loop cursor. * @pos: the &struct list_head to use as a loop cursor.
* @head: the head for your list. * @head: the head for your list.
* *
* This variant differs from list_for_each() in that it's the * This variant doesn't differ from list_for_each() any more.
* simplest possible list iteration code, no prefetching is done. * We don't do prefetching in either case.
* Use this for code that knows the list to be very short (empty
* or 1 entry) most of the time.
*/ */
#define __list_for_each(pos, head) \ #define __list_for_each(pos, head) \
for (pos = (head)->next; pos != (head); pos = pos->next) for (pos = (head)->next; pos != (head); pos = pos->next)
@ -384,8 +385,7 @@ static inline void list_splice_tail_init(struct list_head *list,
* @head: the head for your list. * @head: the head for your list.
*/ */
#define list_for_each_prev(pos, head) \ #define list_for_each_prev(pos, head) \
for (pos = (head)->prev; prefetch(pos->prev), pos != (head); \ for (pos = (head)->prev; pos != (head); pos = pos->prev)
pos = pos->prev)
/** /**
* list_for_each_safe - iterate over a list safe against removal of list entry * list_for_each_safe - iterate over a list safe against removal of list entry
@ -405,7 +405,7 @@ static inline void list_splice_tail_init(struct list_head *list,
*/ */
#define list_for_each_prev_safe(pos, n, head) \ #define list_for_each_prev_safe(pos, n, head) \
for (pos = (head)->prev, n = pos->prev; \ for (pos = (head)->prev, n = pos->prev; \
prefetch(pos->prev), pos != (head); \ pos != (head); \
pos = n, n = pos->prev) pos = n, n = pos->prev)
/** /**
@ -416,7 +416,7 @@ static inline void list_splice_tail_init(struct list_head *list,
*/ */
#define list_for_each_entry(pos, head, member) \ #define list_for_each_entry(pos, head, member) \
for (pos = list_entry((head)->next, typeof(*pos), member); \ for (pos = list_entry((head)->next, typeof(*pos), member); \
prefetch(pos->member.next), &pos->member != (head); \ &pos->member != (head); \
pos = list_entry(pos->member.next, typeof(*pos), member)) pos = list_entry(pos->member.next, typeof(*pos), member))
/** /**
@ -427,7 +427,7 @@ static inline void list_splice_tail_init(struct list_head *list,
*/ */
#define list_for_each_entry_reverse(pos, head, member) \ #define list_for_each_entry_reverse(pos, head, member) \
for (pos = list_entry((head)->prev, typeof(*pos), member); \ for (pos = list_entry((head)->prev, typeof(*pos), member); \
prefetch(pos->member.prev), &pos->member != (head); \ &pos->member != (head); \
pos = list_entry(pos->member.prev, typeof(*pos), member)) pos = list_entry(pos->member.prev, typeof(*pos), member))
/** /**
@ -452,7 +452,7 @@ static inline void list_splice_tail_init(struct list_head *list,
*/ */
#define list_for_each_entry_continue(pos, head, member) \ #define list_for_each_entry_continue(pos, head, member) \
for (pos = list_entry(pos->member.next, typeof(*pos), member); \ for (pos = list_entry(pos->member.next, typeof(*pos), member); \
prefetch(pos->member.next), &pos->member != (head); \ &pos->member != (head); \
pos = list_entry(pos->member.next, typeof(*pos), member)) pos = list_entry(pos->member.next, typeof(*pos), member))
/** /**
@ -466,7 +466,7 @@ static inline void list_splice_tail_init(struct list_head *list,
*/ */
#define list_for_each_entry_continue_reverse(pos, head, member) \ #define list_for_each_entry_continue_reverse(pos, head, member) \
for (pos = list_entry(pos->member.prev, typeof(*pos), member); \ for (pos = list_entry(pos->member.prev, typeof(*pos), member); \
prefetch(pos->member.prev), &pos->member != (head); \ &pos->member != (head); \
pos = list_entry(pos->member.prev, typeof(*pos), member)) pos = list_entry(pos->member.prev, typeof(*pos), member))
/** /**
@ -478,7 +478,7 @@ static inline void list_splice_tail_init(struct list_head *list,
* Iterate over list of given type, continuing from current position. * Iterate over list of given type, continuing from current position.
*/ */
#define list_for_each_entry_from(pos, head, member) \ #define list_for_each_entry_from(pos, head, member) \
for (; prefetch(pos->member.next), &pos->member != (head); \ for (; &pos->member != (head); \
pos = list_entry(pos->member.next, typeof(*pos), member)) pos = list_entry(pos->member.next, typeof(*pos), member))
/** /**
@ -659,8 +659,7 @@ static inline void hlist_move_list(struct hlist_head *old,
#define hlist_entry(ptr, type, member) container_of(ptr,type,member) #define hlist_entry(ptr, type, member) container_of(ptr,type,member)
#define hlist_for_each(pos, head) \ #define hlist_for_each(pos, head) \
for (pos = (head)->first; pos && ({ prefetch(pos->next); 1; }); \ for (pos = (head)->first; pos ; pos = pos->next)
pos = pos->next)
#define hlist_for_each_safe(pos, n, head) \ #define hlist_for_each_safe(pos, n, head) \
for (pos = (head)->first; pos && ({ n = pos->next; 1; }); \ for (pos = (head)->first; pos && ({ n = pos->next; 1; }); \
@ -675,7 +674,7 @@ static inline void hlist_move_list(struct hlist_head *old,
*/ */
#define hlist_for_each_entry(tpos, pos, head, member) \ #define hlist_for_each_entry(tpos, pos, head, member) \
for (pos = (head)->first; \ for (pos = (head)->first; \
pos && ({ prefetch(pos->next); 1;}) && \ pos && \
({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \
pos = pos->next) pos = pos->next)
@ -687,7 +686,7 @@ static inline void hlist_move_list(struct hlist_head *old,
*/ */
#define hlist_for_each_entry_continue(tpos, pos, member) \ #define hlist_for_each_entry_continue(tpos, pos, member) \
for (pos = (pos)->next; \ for (pos = (pos)->next; \
pos && ({ prefetch(pos->next); 1;}) && \ pos && \
({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \
pos = pos->next) pos = pos->next)
@ -698,7 +697,7 @@ static inline void hlist_move_list(struct hlist_head *old,
* @member: the name of the hlist_node within the struct. * @member: the name of the hlist_node within the struct.
*/ */
#define hlist_for_each_entry_from(tpos, pos, member) \ #define hlist_for_each_entry_from(tpos, pos, member) \
for (; pos && ({ prefetch(pos->next); 1;}) && \ for (; pos && \
({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \
pos = pos->next) pos = pos->next)

View File

@ -430,16 +430,8 @@ do { \
#endif /* CONFIG_LOCKDEP */ #endif /* CONFIG_LOCKDEP */
#ifdef CONFIG_TRACE_IRQFLAGS #ifdef CONFIG_TRACE_IRQFLAGS
extern void early_boot_irqs_off(void);
extern void early_boot_irqs_on(void);
extern void print_irqtrace_events(struct task_struct *curr); extern void print_irqtrace_events(struct task_struct *curr);
#else #else
static inline void early_boot_irqs_off(void)
{
}
static inline void early_boot_irqs_on(void)
{
}
static inline void print_irqtrace_events(struct task_struct *curr) static inline void print_irqtrace_events(struct task_struct *curr)
{ {
} }
@ -489,12 +481,15 @@ static inline void print_irqtrace_events(struct task_struct *curr)
#ifdef CONFIG_DEBUG_LOCK_ALLOC #ifdef CONFIG_DEBUG_LOCK_ALLOC
# ifdef CONFIG_PROVE_LOCKING # ifdef CONFIG_PROVE_LOCKING
# define mutex_acquire(l, s, t, i) lock_acquire(l, s, t, 0, 2, NULL, i) # define mutex_acquire(l, s, t, i) lock_acquire(l, s, t, 0, 2, NULL, i)
# define mutex_acquire_nest(l, s, t, n, i) lock_acquire(l, s, t, 0, 2, n, i)
# else # else
# define mutex_acquire(l, s, t, i) lock_acquire(l, s, t, 0, 1, NULL, i) # define mutex_acquire(l, s, t, i) lock_acquire(l, s, t, 0, 1, NULL, i)
# define mutex_acquire_nest(l, s, t, n, i) lock_acquire(l, s, t, 0, 1, n, i)
# endif # endif
# define mutex_release(l, n, i) lock_release(l, n, i) # define mutex_release(l, n, i) lock_release(l, n, i)
#else #else
# define mutex_acquire(l, s, t, i) do { } while (0) # define mutex_acquire(l, s, t, i) do { } while (0)
# define mutex_acquire_nest(l, s, t, n, i) do { } while (0)
# define mutex_release(l, n, i) do { } while (0) # define mutex_release(l, n, i) do { } while (0)
#endif #endif
@ -516,12 +511,15 @@ static inline void print_irqtrace_events(struct task_struct *curr)
#ifdef CONFIG_DEBUG_LOCK_ALLOC #ifdef CONFIG_DEBUG_LOCK_ALLOC
# ifdef CONFIG_PROVE_LOCKING # ifdef CONFIG_PROVE_LOCKING
# define lock_map_acquire(l) lock_acquire(l, 0, 0, 0, 2, NULL, _THIS_IP_) # define lock_map_acquire(l) lock_acquire(l, 0, 0, 0, 2, NULL, _THIS_IP_)
# define lock_map_acquire_read(l) lock_acquire(l, 0, 0, 2, 2, NULL, _THIS_IP_)
# else # else
# define lock_map_acquire(l) lock_acquire(l, 0, 0, 0, 1, NULL, _THIS_IP_) # define lock_map_acquire(l) lock_acquire(l, 0, 0, 0, 1, NULL, _THIS_IP_)
# define lock_map_acquire_read(l) lock_acquire(l, 0, 0, 2, 1, NULL, _THIS_IP_)
# endif # endif
# define lock_map_release(l) lock_release(l, 1, _THIS_IP_) # define lock_map_release(l) lock_release(l, 1, _THIS_IP_)
#else #else
# define lock_map_acquire(l) do { } while (0) # define lock_map_acquire(l) do { } while (0)
# define lock_map_acquire_read(l) do { } while (0)
# define lock_map_release(l) do { } while (0) # define lock_map_release(l) do { } while (0)
#endif #endif

View File

@ -382,6 +382,23 @@ struct ssb_device_id {
#define SSB_ANY_ID 0xFFFF #define SSB_ANY_ID 0xFFFF
#define SSB_ANY_REV 0xFF #define SSB_ANY_REV 0xFF
/* Broadcom's specific AMBA core, see drivers/bcma/ */
struct bcma_device_id {
__u16 manuf;
__u16 id;
__u8 rev;
__u8 class;
};
#define BCMA_CORE(_manuf, _id, _rev, _class) \
{ .manuf = _manuf, .id = _id, .rev = _rev, .class = _class, }
#define BCMA_CORETABLE_END \
{ 0, },
#define BCMA_ANY_MANUF 0xFFFF
#define BCMA_ANY_ID 0xFFFF
#define BCMA_ANY_REV 0xFF
#define BCMA_ANY_CLASS 0xFF
struct virtio_device_id { struct virtio_device_id {
__u32 device; __u32 device;
__u32 vendor; __u32 vendor;

View File

@ -1,7 +1,11 @@
#ifndef _LINUX_MODULE_H #ifndef _LINUX_MODULE_H
#define _LINUX_MODULE_H #define _LINUX_MODULE_H
/*
* Dynamic loading of modules into the kernel.
*
* Rewritten by Richard Henderson <rth@tamu.edu> Dec 1996
* Rewritten again by Rusty Russell, 2002
*/
#include <linux/list.h> #include <linux/list.h>
#include <linux/compiler.h> #include <linux/compiler.h>
#include <linux/kernel.h> #include <linux/kernel.h>
@ -19,4 +23,3 @@
struct module {}; struct module {};
#endif /* _LINUX_MODULE_H */ #endif /* _LINUX_MODULE_H */

View File

@ -14,11 +14,13 @@
* PCI System Design Guide * PCI System Design Guide
*/ */
#ifndef LINUX_PCI_H
#define LINUX_PCI_H
#include <types.h> #include <types.h>
#include <list.h> #include <list.h>
#ifndef __PCI_H__
#define __PCI_H__
#define PCI_ANY_ID (~0) #define PCI_ANY_ID (~0)

View File

@ -223,7 +223,7 @@
#define PCI_PM_CAP_PME_CLOCK 0x0008 /* PME clock required */ #define PCI_PM_CAP_PME_CLOCK 0x0008 /* PME clock required */
#define PCI_PM_CAP_RESERVED 0x0010 /* Reserved field */ #define PCI_PM_CAP_RESERVED 0x0010 /* Reserved field */
#define PCI_PM_CAP_DSI 0x0020 /* Device specific initialization */ #define PCI_PM_CAP_DSI 0x0020 /* Device specific initialization */
#define PCI_PM_CAP_AUX_POWER 0x01C0 /* Auxilliary power support mask */ #define PCI_PM_CAP_AUX_POWER 0x01C0 /* Auxiliary power support mask */
#define PCI_PM_CAP_D1 0x0200 /* D1 power state support */ #define PCI_PM_CAP_D1 0x0200 /* D1 power state support */
#define PCI_PM_CAP_D2 0x0400 /* D2 power state support */ #define PCI_PM_CAP_D2 0x0400 /* D2 power state support */
#define PCI_PM_CAP_PME 0x0800 /* PME pin supported */ #define PCI_PM_CAP_PME 0x0800 /* PME pin supported */
@ -300,13 +300,23 @@
#define PCI_MSI_DATA_64 12 /* 16 bits of data for 64-bit devices */ #define PCI_MSI_DATA_64 12 /* 16 bits of data for 64-bit devices */
#define PCI_MSI_MASK_64 16 /* Mask bits register for 64-bit devices */ #define PCI_MSI_MASK_64 16 /* Mask bits register for 64-bit devices */
/* MSI-X registers (these are at offset PCI_MSIX_FLAGS) */ /* MSI-X registers */
#define PCI_MSIX_FLAGS 2 #define PCI_MSIX_FLAGS 2
#define PCI_MSIX_FLAGS_QSIZE 0x7FF #define PCI_MSIX_FLAGS_QSIZE 0x7FF
#define PCI_MSIX_FLAGS_ENABLE (1 << 15) #define PCI_MSIX_FLAGS_ENABLE (1 << 15)
#define PCI_MSIX_FLAGS_MASKALL (1 << 14) #define PCI_MSIX_FLAGS_MASKALL (1 << 14)
#define PCI_MSIX_TABLE 4
#define PCI_MSIX_PBA 8
#define PCI_MSIX_FLAGS_BIRMASK (7 << 0) #define PCI_MSIX_FLAGS_BIRMASK (7 << 0)
/* MSI-X entry's format */
#define PCI_MSIX_ENTRY_SIZE 16
#define PCI_MSIX_ENTRY_LOWER_ADDR 0
#define PCI_MSIX_ENTRY_UPPER_ADDR 4
#define PCI_MSIX_ENTRY_DATA 8
#define PCI_MSIX_ENTRY_VECTOR_CTRL 12
#define PCI_MSIX_ENTRY_CTRL_MASKBIT 1
/* CompactPCI Hotswap Register */ /* CompactPCI Hotswap Register */
#define PCI_CHSWP_CSR 2 /* Control and Status Register */ #define PCI_CHSWP_CSR 2 /* Control and Status Register */
@ -425,7 +435,7 @@
#define PCI_EXP_LNKCAP_L0SEL 0x00007000 /* L0s Exit Latency */ #define PCI_EXP_LNKCAP_L0SEL 0x00007000 /* L0s Exit Latency */
#define PCI_EXP_LNKCAP_L1EL 0x00038000 /* L1 Exit Latency */ #define PCI_EXP_LNKCAP_L1EL 0x00038000 /* L1 Exit Latency */
#define PCI_EXP_LNKCAP_CLKPM 0x00040000 /* L1 Clock Power Management */ #define PCI_EXP_LNKCAP_CLKPM 0x00040000 /* L1 Clock Power Management */
#define PCI_EXP_LNKCAP_SDERC 0x00080000 /* Suprise Down Error Reporting Capable */ #define PCI_EXP_LNKCAP_SDERC 0x00080000 /* Surprise Down Error Reporting Capable */
#define PCI_EXP_LNKCAP_DLLLARC 0x00100000 /* Data Link Layer Link Active Reporting Capable */ #define PCI_EXP_LNKCAP_DLLLARC 0x00100000 /* Data Link Layer Link Active Reporting Capable */
#define PCI_EXP_LNKCAP_LBNC 0x00200000 /* Link Bandwidth Notification Capability */ #define PCI_EXP_LNKCAP_LBNC 0x00200000 /* Link Bandwidth Notification Capability */
#define PCI_EXP_LNKCAP_PN 0xff000000 /* Port Number */ #define PCI_EXP_LNKCAP_PN 0xff000000 /* Port Number */
@ -494,10 +504,22 @@
#define PCI_EXP_RTCTL_CRSSVE 0x10 /* CRS Software Visibility Enable */ #define PCI_EXP_RTCTL_CRSSVE 0x10 /* CRS Software Visibility Enable */
#define PCI_EXP_RTCAP 30 /* Root Capabilities */ #define PCI_EXP_RTCAP 30 /* Root Capabilities */
#define PCI_EXP_RTSTA 32 /* Root Status */ #define PCI_EXP_RTSTA 32 /* Root Status */
#define PCI_EXP_RTSTA_PME 0x10000 /* PME status */
#define PCI_EXP_RTSTA_PENDING 0x20000 /* PME pending */
#define PCI_EXP_DEVCAP2 36 /* Device Capabilities 2 */ #define PCI_EXP_DEVCAP2 36 /* Device Capabilities 2 */
#define PCI_EXP_DEVCAP2_ARI 0x20 /* Alternative Routing-ID */ #define PCI_EXP_DEVCAP2_ARI 0x20 /* Alternative Routing-ID */
#define PCI_EXP_DEVCAP2_LTR 0x800 /* Latency tolerance reporting */
#define PCI_EXP_OBFF_MASK 0xc0000 /* OBFF support mechanism */
#define PCI_EXP_OBFF_MSG 0x40000 /* New message signaling */
#define PCI_EXP_OBFF_WAKE 0x80000 /* Re-use WAKE# for OBFF */
#define PCI_EXP_DEVCTL2 40 /* Device Control 2 */ #define PCI_EXP_DEVCTL2 40 /* Device Control 2 */
#define PCI_EXP_DEVCTL2_ARI 0x20 /* Alternative Routing-ID */ #define PCI_EXP_DEVCTL2_ARI 0x20 /* Alternative Routing-ID */
#define PCI_EXP_IDO_REQ_EN 0x100 /* ID-based ordering request enable */
#define PCI_EXP_IDO_CMP_EN 0x200 /* ID-based ordering completion enable */
#define PCI_EXP_LTR_EN 0x400 /* Latency tolerance reporting */
#define PCI_EXP_OBFF_MSGA_EN 0x2000 /* OBFF enable with Message type A */
#define PCI_EXP_OBFF_MSGB_EN 0x4000 /* OBFF enable with Message type B */
#define PCI_EXP_OBFF_WAKE_EN 0x6000 /* OBFF using WAKE# signaling */
#define PCI_EXP_LNKCTL2 48 /* Link Control 2 */ #define PCI_EXP_LNKCTL2 48 /* Link Control 2 */
#define PCI_EXP_SLTCTL2 56 /* Slot Control 2 */ #define PCI_EXP_SLTCTL2 56 /* Slot Control 2 */
@ -515,6 +537,7 @@
#define PCI_EXT_CAP_ID_ARI 14 #define PCI_EXT_CAP_ID_ARI 14
#define PCI_EXT_CAP_ID_ATS 15 #define PCI_EXT_CAP_ID_ATS 15
#define PCI_EXT_CAP_ID_SRIOV 16 #define PCI_EXT_CAP_ID_SRIOV 16
#define PCI_EXT_CAP_ID_LTR 24
/* Advanced Error Reporting */ /* Advanced Error Reporting */
#define PCI_ERR_UNCOR_STATUS 4 /* Uncorrectable Error Status */ #define PCI_ERR_UNCOR_STATUS 4 /* Uncorrectable Error Status */
@ -671,6 +694,12 @@
#define PCI_SRIOV_VFM_MO 0x2 /* Active.MigrateOut */ #define PCI_SRIOV_VFM_MO 0x2 /* Active.MigrateOut */
#define PCI_SRIOV_VFM_AV 0x3 /* Active.Available */ #define PCI_SRIOV_VFM_AV 0x3 /* Active.Available */
#define PCI_LTR_MAX_SNOOP_LAT 0x4
#define PCI_LTR_MAX_NOSNOOP_LAT 0x6
#define PCI_LTR_VALUE_MASK 0x000003ff
#define PCI_LTR_SCALE_MASK 0x00001c00
#define PCI_LTR_SCALE_SHIFT 10
/* Access Control Service */ /* Access Control Service */
#define PCI_ACS_CAP 0x04 /* ACS Capability Register */ #define PCI_ACS_CAP 0x04 /* ACS Capability Register */
#define PCI_ACS_SV 0x01 /* Source Validation */ #define PCI_ACS_SV 0x01 /* Source Validation */

View File

@ -1,3 +1,8 @@
/* stub */ /* stub */
#ifndef _LINUX_SEQ_FILE_H
#define _LINUX_SEQ_FILE_H
#include <errno.h> #include <errno.h>
#endif

View File

@ -8,13 +8,13 @@
* *
* on SMP builds: * on SMP builds:
* *
* asm/spinlock_types.h: contains the raw_spinlock_t/raw_rwlock_t and the * asm/spinlock_types.h: contains the arch_spinlock_t/arch_rwlock_t and the
* initializers * initializers
* *
* linux/spinlock_types.h: * linux/spinlock_types.h:
* defines the generic type and initializers * defines the generic type and initializers
* *
* asm/spinlock.h: contains the __raw_spin_*()/etc. lowlevel * asm/spinlock.h: contains the arch_spin_*()/etc. lowlevel
* implementations, mostly inline assembly code * implementations, mostly inline assembly code
* *
* (also included on UP-debug builds:) * (also included on UP-debug builds:)
@ -34,7 +34,7 @@
* defines the generic type and initializers * defines the generic type and initializers
* *
* linux/spinlock_up.h: * linux/spinlock_up.h:
* contains the __raw_spin_*()/etc. version of UP * contains the arch_spin_*()/etc. version of UP
* builds. (which are NOPs on non-debug, non-preempt * builds. (which are NOPs on non-debug, non-preempt
* builds) * builds)
* *
@ -60,7 +60,7 @@
/* /*
* Must define these before including other files, inline functions need them * Must define these before including other files, inline functions need them
*/ */
#define LOCK_SECTION_NAME ".text.lock."KBUILD_BASENAME #define LOCK_SECTION_NAME ".text..lock."KBUILD_BASENAME
#define LOCK_SECTION_START(extra) \ #define LOCK_SECTION_START(extra) \
".subsection 1\n\t" \ ".subsection 1\n\t" \
@ -75,12 +75,12 @@
#define __lockfunc __attribute__((section(".spinlock.text"))) #define __lockfunc __attribute__((section(".spinlock.text")))
/* /*
* Pull the raw_spinlock_t and raw_rwlock_t definitions: * Pull the arch_spinlock_t and arch_rwlock_t definitions:
*/ */
#include <linux/spinlock_types.h> #include <linux/spinlock_types.h>
/* /*
* Pull the __raw*() functions/declarations (UP-nondebug doesnt need them): * Pull the arch_spin*() functions/declarations (UP-nondebug doesn't need them):
*/ */
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
# include <asm/spinlock.h> # include <asm/spinlock.h>

View File

@ -123,6 +123,7 @@ extern char **argv_split(gfp_t gfp, const char *str, int *argcp);
extern void argv_free(char **argv); extern void argv_free(char **argv);
extern bool sysfs_streq(const char *s1, const char *s2); extern bool sysfs_streq(const char *s1, const char *s2);
extern int strtobool(const char *s, bool *res);
#ifdef CONFIG_BINARY_PRINTF #ifdef CONFIG_BINARY_PRINTF
int vbin_printf(u32 *bin_buf, size_t size, const char *fmt, va_list args); int vbin_printf(u32 *bin_buf, size_t size, const char *fmt, va_list args);

View File

@ -150,6 +150,12 @@ typedef unsigned long blkcnt_t;
#define pgoff_t unsigned long #define pgoff_t unsigned long
#endif #endif
#ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT
typedef u64 dma_addr_t;
#else
typedef u32 dma_addr_t;
#endif /* dma_addr_t */
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
/* /*
@ -370,8 +376,3 @@ struct timeval
#define PCI_DEVICE_ID_ATI_RADEON_QY 0x5159 #define PCI_DEVICE_ID_ATI_RADEON_QY 0x5159
#endif /* _LINUX_TYPES_H */ #endif /* _LINUX_TYPES_H */

View File

@ -148,3 +148,6 @@ $(NAME).dll: $(NAME_OBJS) $(FW_BINS) $(SRC_DEP) $(HFILES) $(LIBPATH)/libcore.a $
fwblob.o: fwblob.asm $(FW_BINS) Makefile fwblob.o: fwblob.asm $(FW_BINS) Makefile
$(FASM) $< $@ $(FASM) $< $@
clean:
-rm -f */*.o