1/* 2 * Copyright 2022, Haiku, Inc. All Rights Reserved. 3 * Distributed under the terms of the MIT License. 4 */ 5#ifndef _FBSD_COMPAT_SYS_BUS_H_ 6#define _FBSD_COMPAT_SYS_BUS_H_ 7 8 9#include <sys/haiku-module.h> 10 11#include <sys/_bus_dma.h> 12#include <sys/_bus_macros.h> 13 14#include <sys/queue.h> 15 16 17#define FILTER_STRAY B_UNHANDLED_INTERRUPT 18#define FILTER_HANDLED B_HANDLED_INTERRUPT 19#define FILTER_SCHEDULE_THREAD B_INVOKE_SCHEDULER 20 21/* Note that we reversed the original order, so whenever actual (negative) 22 numbers are used in a driver, we have to change it. */ 23#define BUS_PROBE_SPECIFIC 0 24#define BUS_PROBE_LOW_PRIORITY 10 25#define BUS_PROBE_DEFAULT 20 26#define BUS_PROBE_GENERIC 100 27 28#define __BUS_ACCESSOR(varp, var, ivarp, ivar, type) \ 29 \ 30static __inline type varp ## _get_ ## var(device_t dev) \ 31{ \ 32 return 0; \ 33} \ 34 \ 35static __inline void varp ## _set_ ## var(device_t dev, type t) \ 36{ \ 37} 38 39 40struct resource; 41 42struct resource_spec { 43 int type; 44 int rid; 45 int flags; 46}; 47 48enum intr_type { 49 INTR_TYPE_NET = 4, 50 INTR_MPSAFE = 512, 51}; 52 53 54int bus_generic_detach(device_t dev); 55int bus_generic_suspend(device_t dev); 56int bus_generic_resume(device_t dev); 57void bus_generic_shutdown(device_t dev); 58 59typedef int (driver_filter_t)(void *arg); 60typedef void driver_intr_t(void *); 61 62 63int resource_int_value(const char *name, int unit, const char *resname, 64 int *result); 65int resource_disabled(const char *name, int unit); 66 67struct resource *bus_alloc_resource(device_t dev, int type, int *rid, 68 unsigned long start, unsigned long end, unsigned long count, uint32 flags); 69int bus_release_resource(device_t dev, int type, int rid, struct resource *r); 70int bus_alloc_resources(device_t dev, struct resource_spec *resourceSpec, 71 struct resource **resources); 72void bus_release_resources(device_t dev, 73 const struct resource_spec *resourceSpec, struct resource **resources); 74 75int bus_child_present(device_t child); 76void bus_enumerate_hinted_children(device_t bus); 77 78static inline struct resource * 79bus_alloc_resource_any(device_t dev, int type, int *rid, uint32 flags) 80{ 81 return bus_alloc_resource(dev, type, rid, 0, ~0, 1, flags); 82} 83 84static inline struct resource * 85bus_alloc_resource_anywhere(device_t dev, int type, int *rid, 86 unsigned long count, uint32 flags) 87{ 88 return (bus_alloc_resource(dev, type, rid, 0, ~0, count, flags)); 89} 90 91bus_dma_tag_t bus_get_dma_tag(device_t dev); 92 93int bus_setup_intr(device_t dev, struct resource *r, int flags, 94 driver_filter_t* filter, driver_intr_t handler, void *arg, void **_cookie); 95int bus_teardown_intr(device_t dev, struct resource *r, void *cookie); 96int bus_bind_intr(device_t dev, struct resource *r, int cpu); 97int bus_describe_intr(device_t dev, struct resource *irq, void *cookie, 98 const char* fmt, ...); 99 100const char *device_get_name(device_t dev); 101const char *device_get_nameunit(device_t dev); 102int device_get_unit(device_t dev); 103void *device_get_softc(device_t dev); 104void device_set_softc(device_t dev, void *softc); 105int device_printf(device_t dev, const char *, ...) __printflike(2, 3); 106void device_set_desc(device_t dev, const char *desc); 107void device_set_desc_copy(device_t dev, const char *desc); 108const char *device_get_desc(device_t dev); 109device_t device_get_parent(device_t dev); 110u_int32_t device_get_flags(device_t dev); 111devclass_t device_get_devclass(device_t dev); 112int device_get_children(device_t dev, device_t **devlistp, int *devcountp); 113 114void device_set_ivars(device_t dev, void *); 115void *device_get_ivars(device_t dev); 116 117device_t device_add_child(device_t dev, const char* name, int unit); 118device_t device_add_child_driver(device_t dev, const char* name, driver_t* driver, 119 int unit); 120int device_delete_child(device_t dev, device_t child); 121int device_is_attached(device_t dev); 122int device_attach(device_t dev); 123int device_detach(device_t dev); 124int bus_print_child_header(device_t dev, device_t child); 125int bus_print_child_footer(device_t dev, device_t child); 126int bus_generic_print_child(device_t dev, device_t child); 127void bus_generic_driver_added(device_t dev, driver_t *driver); 128int bus_generic_attach(device_t dev); 129int device_set_driver(device_t dev, driver_t *driver); 130int device_is_alive(device_t dev); 131 132 133static inline struct sysctl_ctx_list * 134device_get_sysctl_ctx(device_t dev) 135{ 136 return NULL; 137} 138 139 140static inline void * 141device_get_sysctl_tree(device_t dev) 142{ 143 return NULL; 144} 145 146devclass_t devclass_find(const char *classname); 147device_t devclass_get_device(devclass_t dc, int unit); 148int devclass_get_maxunit(devclass_t dc); 149 150#endif /* _FBSD_COMPAT_SYS_BUS_H_ */ 151