1a9643ea8Slogwang /* 2a9643ea8Slogwang * Memory range attribute operations, performed on /dev/mem 3a9643ea8Slogwang * 4a9643ea8Slogwang * $FreeBSD$ 5a9643ea8Slogwang */ 6a9643ea8Slogwang 7a9643ea8Slogwang #ifndef _SYS_MEMRANGE_H_ 8a9643ea8Slogwang #define _SYS_MEMRANGE_H_ 9a9643ea8Slogwang 10a9643ea8Slogwang /* Memory range attributes */ 11a9643ea8Slogwang #define MDF_UNCACHEABLE (1<<0) /* region not cached */ 12a9643ea8Slogwang #define MDF_WRITECOMBINE (1<<1) /* region supports "write combine" action */ 13a9643ea8Slogwang #define MDF_WRITETHROUGH (1<<2) /* write-through cached */ 14a9643ea8Slogwang #define MDF_WRITEBACK (1<<3) /* write-back cached */ 15a9643ea8Slogwang #define MDF_WRITEPROTECT (1<<4) /* read-only region */ 16a9643ea8Slogwang #define MDF_UNKNOWN (1<<5) /* any state we don't understand */ 17a9643ea8Slogwang #define MDF_ATTRMASK (0x00ffffff) 18a9643ea8Slogwang 19a9643ea8Slogwang #define MDF_FIXBASE (1<<24) /* fixed base */ 20a9643ea8Slogwang #define MDF_FIXLEN (1<<25) /* fixed length */ 21a9643ea8Slogwang #define MDF_FIRMWARE (1<<26) /* set by firmware (XXX not useful?) */ 22a9643ea8Slogwang #define MDF_ACTIVE (1<<27) /* currently active */ 23a9643ea8Slogwang #define MDF_BOGUS (1<<28) /* we don't like it */ 24a9643ea8Slogwang #define MDF_FIXACTIVE (1<<29) /* can't be turned off */ 25a9643ea8Slogwang #define MDF_BUSY (1<<30) /* range is in use */ 26a9643ea8Slogwang #define MDF_FORCE (1<<31) /* force risky changes */ 27a9643ea8Slogwang 28a9643ea8Slogwang struct mem_range_desc 29a9643ea8Slogwang { 30a9643ea8Slogwang u_int64_t mr_base; 31a9643ea8Slogwang u_int64_t mr_len; 32a9643ea8Slogwang int mr_flags; 33a9643ea8Slogwang char mr_owner[8]; 34a9643ea8Slogwang }; 35a9643ea8Slogwang 36a9643ea8Slogwang struct mem_range_op 37a9643ea8Slogwang { 38a9643ea8Slogwang struct mem_range_desc *mo_desc; 39a9643ea8Slogwang int mo_arg[2]; 40a9643ea8Slogwang #define MEMRANGE_SET_UPDATE 0 41a9643ea8Slogwang #define MEMRANGE_SET_REMOVE 1 42a9643ea8Slogwang /* XXX want a flag that says "set and undo when I exit" */ 43a9643ea8Slogwang }; 44a9643ea8Slogwang 45a9643ea8Slogwang #define MEMRANGE_GET _IOWR('m', 50, struct mem_range_op) 46a9643ea8Slogwang #define MEMRANGE_SET _IOW('m', 51, struct mem_range_op) 47a9643ea8Slogwang 48*22ce4affSfengbojiang #define ME_STATE_INVALID 0 49*22ce4affSfengbojiang #define ME_STATE_VALID 1 50*22ce4affSfengbojiang #define ME_STATE_MAPPED 2 51*22ce4affSfengbojiang 52*22ce4affSfengbojiang struct mem_extract { 53*22ce4affSfengbojiang uint64_t me_vaddr; 54*22ce4affSfengbojiang uint64_t me_paddr; 55*22ce4affSfengbojiang int me_domain; 56*22ce4affSfengbojiang int me_state; 57*22ce4affSfengbojiang uint64_t pad1[5]; 58*22ce4affSfengbojiang }; 59*22ce4affSfengbojiang 60*22ce4affSfengbojiang #define MEM_EXTRACT_PADDR _IOWR('m', 52, struct mem_extract) 61*22ce4affSfengbojiang 62a9643ea8Slogwang #ifdef _KERNEL 63a9643ea8Slogwang 64a9643ea8Slogwang MALLOC_DECLARE(M_MEMDESC); 65a9643ea8Slogwang 66a9643ea8Slogwang struct mem_range_softc; 67a9643ea8Slogwang struct mem_range_ops 68a9643ea8Slogwang { 69a9643ea8Slogwang void (*init)(struct mem_range_softc *sc); 70a9643ea8Slogwang int (*set)(struct mem_range_softc *sc, struct mem_range_desc *mrd, int *arg); 71a9643ea8Slogwang void (*initAP)(struct mem_range_softc *sc); 72a9643ea8Slogwang void (*reinit)(struct mem_range_softc *sc); 73a9643ea8Slogwang }; 74a9643ea8Slogwang 75a9643ea8Slogwang struct mem_range_softc 76a9643ea8Slogwang { 77a9643ea8Slogwang struct mem_range_ops *mr_op; 78a9643ea8Slogwang int mr_cap; 79a9643ea8Slogwang int mr_ndesc; 80a9643ea8Slogwang struct mem_range_desc *mr_desc; 81a9643ea8Slogwang }; 82a9643ea8Slogwang 83a9643ea8Slogwang extern struct mem_range_softc mem_range_softc; 84a9643ea8Slogwang 85a9643ea8Slogwang extern void mem_range_init(void); 86a9643ea8Slogwang extern void mem_range_destroy(void); 87a9643ea8Slogwang 88a9643ea8Slogwang extern int mem_range_attr_get(struct mem_range_desc *mrd, int *arg); 89a9643ea8Slogwang extern int mem_range_attr_set(struct mem_range_desc *mrd, int *arg); 90a9643ea8Slogwang 91a9643ea8Slogwang #endif /* _KERNEL */ 92a9643ea8Slogwang 93a9643ea8Slogwang #endif /* _SYS_MEMRANGE_H_ */ 94