1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Memory range attribute operations, peformed on /dev/mem 3*4882a593Smuzhiyun */ 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #ifdef HAVE_XORG_CONFIG_H 6*4882a593Smuzhiyun #include <xorg-config.h> 7*4882a593Smuzhiyun #endif 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #ifndef _MEMRANGE_H 10*4882a593Smuzhiyun #define _MEMRANGE_H 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun /* Memory range attributes */ 13*4882a593Smuzhiyun #define MDF_UNCACHEABLE (1<<0) /* region not cached */ 14*4882a593Smuzhiyun #define MDF_WRITECOMBINE (1<<1) /* region supports "write combine" 15*4882a593Smuzhiyun * action */ 16*4882a593Smuzhiyun #define MDF_WRITETHROUGH (1<<2) /* write-through cached */ 17*4882a593Smuzhiyun #define MDF_WRITEBACK (1<<3) /* write-back cached */ 18*4882a593Smuzhiyun #define MDF_WRITEPROTECT (1<<4) /* read-only region */ 19*4882a593Smuzhiyun #define MDF_ATTRMASK (0x00ffffff) 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun #define MDF_FIXBASE (1<<24) /* fixed base */ 22*4882a593Smuzhiyun #define MDF_FIXLEN (1<<25) /* fixed length */ 23*4882a593Smuzhiyun #define MDF_FIRMWARE (1<<26) /* set by firmware (XXX not useful?) */ 24*4882a593Smuzhiyun #define MDF_ACTIVE (1<<27) /* currently active */ 25*4882a593Smuzhiyun #define MDF_BOGUS (1<<28) /* we don't like it */ 26*4882a593Smuzhiyun #define MDF_FIXACTIVE (1<<29) /* can't be turned off */ 27*4882a593Smuzhiyun #define MDF_BUSY (1<<30) /* range is in use */ 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun struct mem_range_desc { 30*4882a593Smuzhiyun u_int64_t mr_base; 31*4882a593Smuzhiyun u_int64_t mr_len; 32*4882a593Smuzhiyun int mr_flags; 33*4882a593Smuzhiyun char mr_owner[8]; 34*4882a593Smuzhiyun }; 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun struct mem_range_op { 37*4882a593Smuzhiyun struct mem_range_desc *mo_desc; 38*4882a593Smuzhiyun int mo_arg[2]; 39*4882a593Smuzhiyun #define MEMRANGE_SET_UPDATE 0 40*4882a593Smuzhiyun #define MEMRANGE_SET_REMOVE 1 41*4882a593Smuzhiyun /* XXX want a flag that says "set and undo when I exit" */ 42*4882a593Smuzhiyun }; 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun #define MEMRANGE_GET _IOWR('m', 50, struct mem_range_op) 45*4882a593Smuzhiyun #define MEMRANGE_SET _IOW('m', 51, struct mem_range_op) 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun #ifdef _KERNEL 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun struct mem_range_softc; 50*4882a593Smuzhiyun struct mem_range_ops { 51*4882a593Smuzhiyun void (*init) __P((struct mem_range_softc * sc)); 52*4882a593Smuzhiyun int (*set) 53*4882a593Smuzhiyun __P((struct mem_range_softc * sc, struct mem_range_desc * mrd, 54*4882a593Smuzhiyun int *arg)); 55*4882a593Smuzhiyun void (*initAP) __P((struct mem_range_softc * sc)); 56*4882a593Smuzhiyun }; 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun struct mem_range_softc { 59*4882a593Smuzhiyun struct mem_range_ops *mr_op; 60*4882a593Smuzhiyun int mr_cap; 61*4882a593Smuzhiyun int mr_ndesc; 62*4882a593Smuzhiyun struct mem_range_desc *mr_desc; 63*4882a593Smuzhiyun }; 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun extern struct mem_range_softc mem_range_softc; 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun extern int mem_range_attr_get __P((struct mem_range_desc * mrd, int *arg)); 68*4882a593Smuzhiyun extern int mem_range_attr_set __P((struct mem_range_desc * mrd, int *arg)); 69*4882a593Smuzhiyun extern void mem_range_AP_init __P((void)); 70*4882a593Smuzhiyun #endif 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun #endif 73