#ifndef _SYS_ACPIDEV_DR_H
#define _SYS_ACPIDEV_DR_H
#include <sys/types.h>
#include <sys/obpdefs.h>
#include <sys/cpuvar.h>
#include <sys/memlist.h>
#include <sys/sunddi.h>
#include <sys/acpi/acpi.h>
#include <sys/acpica.h>
#include <sys/acpidev.h>
#include <sys/acpidev_rsc.h>
#ifdef __cplusplus
extern "C" {
#endif
#ifdef _KERNEL
#define ACPIDEV_DR_MAX_BOARDS 0x40
#define ACPIDEV_DR_SEGS_PER_MEM_DEV 0x10
#define ACPIDEV_DR_MEMLISTS_PER_SEG 0x10
#define ACPIDEV_DR_MAX_MEMLIST_ENTRIES 0x10000
#define ACPIDEV_DR_PROP_PORTID "portid"
#define ACPIDEV_DR_PROP_BOARDNUM OBP_BOARDNUM
#define ACPIDEV_DR_PROP_DEVNAME OBP_NAME
#define ACPIDEV_DR_CPU_BD_FMT "CPU%u"
#define ACPIDEV_DR_MEMORY_BD_FMT "MEM%u"
#define ACPIDEV_DR_IO_BD_FMT "IO%u"
#define ACPIDEV_DR_SYSTEM_BD_FMT "SB%u"
typedef enum {
ACPIDEV_INVALID_BOARD = 0,
ACPIDEV_CPU_BOARD,
ACPIDEV_MEMORY_BOARD,
ACPIDEV_IO_BOARD,
ACPIDEV_SYSTEM_BOARD
} acpidev_board_type_t;
extern int acpidev_dr_capable(void);
extern uint32_t acpidev_dr_max_boards(void);
extern uint32_t acpidev_dr_max_mem_units_per_board(void);
extern uint32_t acpidev_dr_max_io_units_per_board(void);
extern uint32_t acpidev_dr_max_cmp_units_per_board(void);
extern uint32_t acpidev_dr_max_cpu_units_per_cmp(void);
extern uint32_t acpidev_dr_max_segments_per_mem_device(void);
extern uint32_t acpidev_dr_max_memlists_per_segment(void);
extern ACPI_STATUS acpidev_dr_get_mem_alignment(ACPI_HANDLE hdl, uint64_t *ap);
extern void acpidev_dr_init(void);
extern void acpidev_dr_check(acpidev_walk_info_t *infop);
extern ACPI_STATUS acpidev_dr_initialize(dev_info_t *pdip);
extern ACPI_STATUS acpidev_dr_get_board_handle(uint_t board,
ACPI_HANDLE *hdlp);
extern acpidev_board_type_t acpidev_dr_get_board_type(ACPI_HANDLE hdl);
extern ACPI_STATUS acpidev_dr_get_board_number(ACPI_HANDLE hdl,
uint32_t *bnump);
extern ACPI_STATUS acpidev_dr_get_board_name(ACPI_HANDLE hdl,
char *buf, size_t len);
extern ACPI_STATUS acpidev_dr_get_attachment_point(ACPI_HANDLE hdl,
char *buf, size_t len);
extern acpidev_class_id_t acpidev_dr_device_get_class(ACPI_HANDLE hdl);
extern ACPI_STATUS acpidev_dr_device_get_memory_index(ACPI_HANDLE hdl,
uint32_t *idxp);
extern int acpidev_dr_device_is_board(ACPI_HANDLE hdl);
extern int acpidev_dr_device_is_present(ACPI_HANDLE hdl);
extern int acpidev_dr_device_is_powered(ACPI_HANDLE hdl);
extern int acpidev_dr_device_hotplug_capable(ACPI_HANDLE hdl);
extern int acpidev_dr_device_has_edl(ACPI_HANDLE hdl);
extern int acpidev_dr_device_getprop(ACPI_HANDLE hdl, char *name,
caddr_t buf, size_t len);
extern ACPI_STATUS acpidev_dr_device_get_regspec(ACPI_HANDLE hdl,
boolean_t assigned, acpidev_regspec_t **regpp, uint_t *cntp);
extern void acpidev_dr_device_free_regspec(acpidev_regspec_t *regp,
uint_t count);
extern ACPI_STATUS acpidev_dr_device_walk_edl(ACPI_HANDLE hdl,
ACPI_WALK_CALLBACK cb, void *arg, void **retval);
extern ACPI_STATUS acpidev_dr_device_walk_ejd(ACPI_HANDLE hdl,
ACPI_WALK_CALLBACK cb, void *arg, void **retval);
extern ACPI_STATUS acpidev_dr_device_walk_device(ACPI_HANDLE hdl,
uint_t max_lvl, ACPI_WALK_CALLBACK cb, void *arg, void **retval);
extern ACPI_STATUS acpidev_dr_device_check_status(ACPI_HANDLE hdl);
extern ACPI_STATUS acpidev_dr_device_poweron(ACPI_HANDLE hdl);
extern ACPI_STATUS acpidev_dr_device_poweroff(ACPI_HANDLE hdl);
extern ACPI_STATUS acpidev_dr_device_insert(ACPI_HANDLE hdl);
extern ACPI_STATUS acpidev_dr_device_remove(ACPI_HANDLE hdl);
extern void acpidev_dr_lock_all(void);
extern void acpidev_dr_unlock_all(void);
extern ACPI_STATUS acpidev_dr_allocate_cpuid(ACPI_HANDLE hdl,
processorid_t *idp);
extern ACPI_STATUS acpidev_dr_free_cpuid(ACPI_HANDLE hdl);
extern int acpidev_dr_get_cpu_numa_info(cpu_t *cp, void **hdlpp,
uint32_t *apicidp, uint32_t *pxmidp, uint32_t *slicntp, uchar_t **slipp);
extern void acpidev_dr_free_cpu_numa_info(void *hdlp);
extern ACPI_STATUS acpidev_dr_get_mem_numa_info(ACPI_HANDLE hdl,
struct memlist *ml, void **hdlpp, uint32_t *pxmidp,
uint32_t *slicntp, uchar_t **slipp);
extern void acpidev_dr_free_mem_numa_info(void *hdlp);
#endif
#ifdef __cplusplus
}
#endif
#endif