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