#ifndef _SYS_RMAN_H_
#define _SYS_RMAN_H_ 1
#ifndef _KERNEL
#include <sys/queue.h>
#else
#include <sys/_mutex.h>
#include <machine/_bus.h>
#include <machine/resource.h>
#endif
#define RF_ALLOCATED 0x0001
#define RF_ACTIVE 0x0002
#define RF_SHAREABLE 0x0004
#define RF_SPARE1 0x0008
#define RF_SPARE2 0x0010
#define RF_FIRSTSHARE 0x0020
#define RF_PREFETCHABLE 0x0040
#define RF_OPTIONAL 0x0080
#define RF_UNMAPPED 0x0100
#define RF_ALIGNMENT_SHIFT 10
#define RF_ALIGNMENT_MASK (0x003F << RF_ALIGNMENT_SHIFT)
#define RF_ALIGNMENT_LOG2(x) ((x) << RF_ALIGNMENT_SHIFT)
#define RF_ALIGNMENT(x) (((x) & RF_ALIGNMENT_MASK) >> RF_ALIGNMENT_SHIFT)
enum rman_type { RMAN_UNINIT = 0, RMAN_GAUGE, RMAN_ARRAY };
#define RM_TEXTLEN 32
#define RM_MAX_END (~(rman_res_t)0)
#define RMAN_IS_DEFAULT_RANGE(s,e) ((s) == 0 && (e) == RM_MAX_END)
struct u_resource {
uintptr_t r_handle;
uintptr_t r_parent;
uintptr_t r_device;
char r_devname[RM_TEXTLEN];
rman_res_t r_start;
rman_res_t r_size;
u_int r_flags;
};
struct u_rman {
uintptr_t rm_handle;
char rm_descr[RM_TEXTLEN];
rman_res_t rm_start;
rman_res_t rm_size;
enum rman_type rm_type;
};
#ifdef _KERNEL
struct resource {
struct resource_i *__r_i;
bus_space_tag_t r_bustag;
bus_space_handle_t r_bushandle;
};
struct resource_i;
struct resource_map;
TAILQ_HEAD(resource_head, resource_i);
struct rman {
struct resource_head rm_list;
struct mtx rm_mtx;
TAILQ_ENTRY(rman) rm_link;
rman_res_t rm_start;
rman_res_t rm_end;
enum rman_type rm_type;
const char *rm_descr;
};
TAILQ_HEAD(rman_head, rman);
int rman_activate_resource(struct resource *r);
int rman_adjust_resource(struct resource *r, rman_res_t start, rman_res_t end);
int rman_first_free_region(struct rman *rm, rman_res_t *start, rman_res_t *end);
bus_space_handle_t rman_get_bushandle(const struct resource *);
bus_space_tag_t rman_get_bustag(const struct resource *);
rman_res_t rman_get_end(const struct resource *);
device_t rman_get_device(const struct resource *);
u_int rman_get_flags(const struct resource *);
void *rman_get_irq_cookie(const struct resource *);
void rman_get_mapping(const struct resource *, struct resource_map *);
int rman_get_rid(const struct resource *);
rman_res_t rman_get_size(const struct resource *);
rman_res_t rman_get_start(const struct resource *);
int rman_get_type(const struct resource *);
void *rman_get_virtual(const struct resource *);
int rman_deactivate_resource(struct resource *r);
int rman_fini(struct rman *rm);
int rman_init(struct rman *rm);
int rman_init_from_resource(struct rman *rm, struct resource *r);
int rman_last_free_region(struct rman *rm, rman_res_t *start, rman_res_t *end);
uint32_t rman_make_alignment_flags(uint32_t size);
int rman_manage_region(struct rman *rm, rman_res_t start, rman_res_t end);
int rman_is_region_manager(const struct resource *r, const struct rman *rm);
int rman_release_resource(struct resource *r);
struct resource *rman_reserve_resource(struct rman *rm, rman_res_t start,
rman_res_t end, rman_res_t count,
u_int flags, device_t dev);
void rman_set_bushandle(struct resource *_r, bus_space_handle_t _h);
void rman_set_bustag(struct resource *_r, bus_space_tag_t _t);
void rman_set_device(struct resource *_r, device_t _dev);
void rman_set_irq_cookie(struct resource *_r, void *_c);
void rman_set_mapping(struct resource *, struct resource_map *);
void rman_set_rid(struct resource *_r, int _rid);
void rman_set_type(struct resource *_r, int _type);
void rman_set_virtual(struct resource *_r, void *_v);
extern struct rman_head rman_head;
#endif
#endif