xref: /linux/arch/arm/mach-sa1100/include/mach/bitfield.h (revision e5451c8f8330e03ad3cfa16048b4daf961af434f)
11da177e4SLinus Torvalds /*
21da177e4SLinus Torvalds  *	FILE    	bitfield.h
31da177e4SLinus Torvalds  *
41da177e4SLinus Torvalds  *	Version 	1.1
51da177e4SLinus Torvalds  *	Author  	Copyright (c) Marc A. Viredaz, 1998
61da177e4SLinus Torvalds  *	        	DEC Western Research Laboratory, Palo Alto, CA
71da177e4SLinus Torvalds  *	Date    	April 1998 (April 1997)
81da177e4SLinus Torvalds  *	System  	Advanced RISC Machine (ARM)
91da177e4SLinus Torvalds  *	Language	C or ARM Assembly
101da177e4SLinus Torvalds  *	Purpose 	Definition of macros to operate on bit fields.
111da177e4SLinus Torvalds  */
121da177e4SLinus Torvalds 
131da177e4SLinus Torvalds 
141da177e4SLinus Torvalds 
151da177e4SLinus Torvalds #ifndef __BITFIELD_H
161da177e4SLinus Torvalds #define __BITFIELD_H
171da177e4SLinus Torvalds 
181da177e4SLinus Torvalds #ifndef __ASSEMBLY__
191da177e4SLinus Torvalds #define UData(Data)	((unsigned long) (Data))
201da177e4SLinus Torvalds #else
211da177e4SLinus Torvalds #define UData(Data)	(Data)
221da177e4SLinus Torvalds #endif
231da177e4SLinus Torvalds 
241da177e4SLinus Torvalds 
251da177e4SLinus Torvalds /*
261da177e4SLinus Torvalds  * MACRO: Fld
271da177e4SLinus Torvalds  *
281da177e4SLinus Torvalds  * Purpose
291da177e4SLinus Torvalds  *    The macro "Fld" encodes a bit field, given its size and its shift value
301da177e4SLinus Torvalds  *    with respect to bit 0.
311da177e4SLinus Torvalds  *
321da177e4SLinus Torvalds  * Note
331da177e4SLinus Torvalds  *    A more intuitive way to encode bit fields would have been to use their
341da177e4SLinus Torvalds  *    mask. However, extracting size and shift value information from a bit
351da177e4SLinus Torvalds  *    field's mask is cumbersome and might break the assembler (255-character
361da177e4SLinus Torvalds  *    line-size limit).
371da177e4SLinus Torvalds  *
381da177e4SLinus Torvalds  * Input
391da177e4SLinus Torvalds  *    Size      	Size of the bit field, in number of bits.
401da177e4SLinus Torvalds  *    Shft      	Shift value of the bit field with respect to bit 0.
411da177e4SLinus Torvalds  *
421da177e4SLinus Torvalds  * Output
431da177e4SLinus Torvalds  *    Fld       	Encoded bit field.
441da177e4SLinus Torvalds  */
451da177e4SLinus Torvalds 
461da177e4SLinus Torvalds #define Fld(Size, Shft)	(((Size) << 16) + (Shft))
471da177e4SLinus Torvalds 
481da177e4SLinus Torvalds 
491da177e4SLinus Torvalds /*
501da177e4SLinus Torvalds  * MACROS: FSize, FShft, FMsk, FAlnMsk, F1stBit
511da177e4SLinus Torvalds  *
521da177e4SLinus Torvalds  * Purpose
531da177e4SLinus Torvalds  *    The macros "FSize", "FShft", "FMsk", "FAlnMsk", and "F1stBit" return
541da177e4SLinus Torvalds  *    the size, shift value, mask, aligned mask, and first bit of a
551da177e4SLinus Torvalds  *    bit field.
561da177e4SLinus Torvalds  *
571da177e4SLinus Torvalds  * Input
581da177e4SLinus Torvalds  *    Field     	Encoded bit field (using the macro "Fld").
591da177e4SLinus Torvalds  *
601da177e4SLinus Torvalds  * Output
611da177e4SLinus Torvalds  *    FSize     	Size of the bit field, in number of bits.
621da177e4SLinus Torvalds  *    FShft     	Shift value of the bit field with respect to bit 0.
631da177e4SLinus Torvalds  *    FMsk      	Mask for the bit field.
641da177e4SLinus Torvalds  *    FAlnMsk   	Mask for the bit field, aligned on bit 0.
651da177e4SLinus Torvalds  *    F1stBit   	First bit of the bit field.
661da177e4SLinus Torvalds  */
671da177e4SLinus Torvalds 
681da177e4SLinus Torvalds #define FSize(Field)	((Field) >> 16)
691da177e4SLinus Torvalds #define FShft(Field)	((Field) & 0x0000FFFF)
701da177e4SLinus Torvalds #define FMsk(Field)	(((UData (1) << FSize (Field)) - 1) << FShft (Field))
711da177e4SLinus Torvalds #define FAlnMsk(Field)	((UData (1) << FSize (Field)) - 1)
721da177e4SLinus Torvalds #define F1stBit(Field)	(UData (1) << FShft (Field))
731da177e4SLinus Torvalds 
741da177e4SLinus Torvalds 
751da177e4SLinus Torvalds /*
761da177e4SLinus Torvalds  * MACRO: FInsrt
771da177e4SLinus Torvalds  *
781da177e4SLinus Torvalds  * Purpose
791da177e4SLinus Torvalds  *    The macro "FInsrt" inserts a value into a bit field by shifting the
801da177e4SLinus Torvalds  *    former appropriately.
811da177e4SLinus Torvalds  *
821da177e4SLinus Torvalds  * Input
831da177e4SLinus Torvalds  *    Value     	Bit-field value.
841da177e4SLinus Torvalds  *    Field     	Encoded bit field (using the macro "Fld").
851da177e4SLinus Torvalds  *
861da177e4SLinus Torvalds  * Output
871da177e4SLinus Torvalds  *    FInsrt    	Bit-field value positioned appropriately.
881da177e4SLinus Torvalds  */
891da177e4SLinus Torvalds 
901da177e4SLinus Torvalds #define FInsrt(Value, Field) \
911da177e4SLinus Torvalds                 	(UData (Value) << FShft (Field))
921da177e4SLinus Torvalds 
931da177e4SLinus Torvalds 
941da177e4SLinus Torvalds /*
951da177e4SLinus Torvalds  * MACRO: FExtr
961da177e4SLinus Torvalds  *
971da177e4SLinus Torvalds  * Purpose
981da177e4SLinus Torvalds  *    The macro "FExtr" extracts the value of a bit field by masking and
991da177e4SLinus Torvalds  *    shifting it appropriately.
1001da177e4SLinus Torvalds  *
1011da177e4SLinus Torvalds  * Input
1021da177e4SLinus Torvalds  *    Data      	Data containing the bit-field to be extracted.
1031da177e4SLinus Torvalds  *    Field     	Encoded bit field (using the macro "Fld").
1041da177e4SLinus Torvalds  *
1051da177e4SLinus Torvalds  * Output
1061da177e4SLinus Torvalds  *    FExtr     	Bit-field value.
1071da177e4SLinus Torvalds  */
1081da177e4SLinus Torvalds 
1091da177e4SLinus Torvalds #define FExtr(Data, Field) \
1101da177e4SLinus Torvalds                 	((UData (Data) >> FShft (Field)) & FAlnMsk (Field))
1111da177e4SLinus Torvalds 
1121da177e4SLinus Torvalds 
1131da177e4SLinus Torvalds #endif /* __BITFIELD_H */
114