Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/dev/bhnd/bhnd_bus_if.m
39507 views
1
#-
2
# Copyright (c) 2015-2016 Landon Fuller <[email protected]>
3
# Copyright (c) 2017 The FreeBSD Foundation
4
# All rights reserved.
5
#
6
# Portions of this software were developed by Landon Fuller
7
# under sponsorship from the FreeBSD Foundation.
8
#
9
# Redistribution and use in source and binary forms, with or without
10
# modification, are permitted provided that the following conditions
11
# are met:
12
# 1. Redistributions of source code must retain the above copyright
13
# notice, this list of conditions and the following disclaimer.
14
# 2. Redistributions in binary form must reproduce the above copyright
15
# notice, this list of conditions and the following disclaimer in the
16
# documentation and/or other materials provided with the distribution.
17
#
18
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21
# IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
22
# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
25
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
27
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
#
29
30
#include <sys/types.h>
31
#include <sys/bus.h>
32
#include <sys/rman.h>
33
34
#include <dev/bhnd/bhnd_types.h>
35
#include <dev/bhnd/bhnd_erom_types.h>
36
37
INTERFACE bhnd_bus;
38
39
#
40
# bhnd(4) bus interface
41
#
42
43
HEADER {
44
/* forward declarations */
45
struct bhnd_board_info;
46
struct bhnd_core_info;
47
struct bhnd_chipid;
48
struct bhnd_dma_translation;
49
struct bhnd_devinfo;
50
struct bhnd_resource;
51
}
52
53
CODE {
54
#include <sys/systm.h>
55
56
#include <dev/bhnd/bhndvar.h>
57
58
static bhnd_erom_class_t *
59
bhnd_bus_null_get_erom_class(driver_t *driver)
60
{
61
return (NULL);
62
}
63
64
static struct bhnd_chipid *
65
bhnd_bus_null_get_chipid(device_t dev, device_t child)
66
{
67
panic("bhnd_bus_get_chipid unimplemented");
68
}
69
70
static int
71
bhnd_bus_null_read_ioctl(device_t dev, device_t child, uint16_t *ioctl)
72
{
73
panic("bhnd_bus_read_ioctl unimplemented");
74
}
75
76
77
static int
78
bhnd_bus_null_write_ioctl(device_t dev, device_t child, uint16_t value,
79
uint16_t mask)
80
{
81
panic("bhnd_bus_write_ioctl unimplemented");
82
}
83
84
85
static int
86
bhnd_bus_null_read_iost(device_t dev, device_t child, uint16_t *iost)
87
{
88
panic("bhnd_bus_read_iost unimplemented");
89
}
90
91
static bool
92
bhnd_bus_null_is_hw_suspended(device_t dev, device_t child)
93
{
94
panic("bhnd_bus_is_hw_suspended unimplemented");
95
}
96
97
static int
98
bhnd_bus_null_reset_hw(device_t dev, device_t child, uint16_t ioctl,
99
uint16_t reset_ioctl)
100
{
101
panic("bhnd_bus_reset_hw unimplemented");
102
}
103
104
105
static int
106
bhnd_bus_null_suspend_hw(device_t dev, device_t child)
107
{
108
panic("bhnd_bus_suspend_hw unimplemented");
109
}
110
111
static bhnd_attach_type
112
bhnd_bus_null_get_attach_type(device_t dev, device_t child)
113
{
114
panic("bhnd_bus_get_attach_type unimplemented");
115
}
116
117
static int
118
bhnd_bus_null_read_board_info(device_t dev, device_t child,
119
struct bhnd_board_info *info)
120
{
121
panic("bhnd_bus_read_boardinfo unimplemented");
122
}
123
124
static void
125
bhnd_bus_null_child_added(device_t dev, device_t child)
126
{
127
}
128
129
static int
130
bhnd_bus_null_alloc_pmu(device_t dev, device_t child)
131
{
132
panic("bhnd_bus_alloc_pmu unimplemented");
133
}
134
135
static int
136
bhnd_bus_null_release_pmu(device_t dev, device_t child)
137
{
138
panic("bhnd_bus_release_pmu unimplemented");
139
}
140
141
static int
142
bhnd_bus_null_get_clock_latency(device_t dev, device_t child,
143
bhnd_clock clock, u_int *latency)
144
{
145
panic("bhnd_pmu_get_clock_latency unimplemented");
146
}
147
148
static int
149
bhnd_bus_null_get_clock_freq(device_t dev, device_t child,
150
bhnd_clock clock, u_int *freq)
151
{
152
panic("bhnd_pmu_get_clock_freq unimplemented");
153
}
154
155
static int
156
bhnd_bus_null_request_clock(device_t dev, device_t child,
157
bhnd_clock clock)
158
{
159
panic("bhnd_bus_request_clock unimplemented");
160
}
161
162
static int
163
bhnd_bus_null_enable_clocks(device_t dev, device_t child,
164
uint32_t clocks)
165
{
166
panic("bhnd_bus_enable_clocks unimplemented");
167
}
168
169
static int
170
bhnd_bus_null_request_ext_rsrc(device_t dev, device_t child,
171
u_int rsrc)
172
{
173
panic("bhnd_bus_request_ext_rsrc unimplemented");
174
}
175
176
static int
177
bhnd_bus_null_release_ext_rsrc(device_t dev, device_t child,
178
u_int rsrc)
179
{
180
panic("bhnd_bus_release_ext_rsrc unimplemented");
181
}
182
183
static int
184
bhnd_bus_null_read_config(device_t dev, device_t child,
185
bus_size_t offset, void *value, u_int width)
186
{
187
panic("bhnd_bus_null_read_config unimplemented");
188
}
189
190
static void
191
bhnd_bus_null_write_config(device_t dev, device_t child,
192
bus_size_t offset, void *value, u_int width)
193
{
194
panic("bhnd_bus_null_write_config unimplemented");
195
}
196
197
static device_t
198
bhnd_bus_null_find_hostb_device(device_t dev)
199
{
200
return (NULL);
201
}
202
203
static struct bhnd_service_registry *
204
bhnd_bus_null_get_service_registry(device_t dev)
205
{
206
panic("bhnd_bus_get_service_registry unimplemented");
207
}
208
209
static bool
210
bhnd_bus_null_is_hw_disabled(device_t dev, device_t child)
211
{
212
panic("bhnd_bus_is_hw_disabled unimplemented");
213
}
214
215
static int
216
bhnd_bus_null_get_probe_order(device_t dev, device_t child)
217
{
218
panic("bhnd_bus_get_probe_order unimplemented");
219
}
220
221
static uintptr_t
222
bhnd_bus_null_get_intr_domain(device_t dev, device_t child, bool self)
223
{
224
/* Unsupported */
225
return (0);
226
}
227
228
static u_int
229
bhnd_bus_null_get_intr_count(device_t dev, device_t child)
230
{
231
return (0);
232
}
233
234
static int
235
bhnd_bus_null_get_intr_ivec(device_t dev, device_t child, u_int intr,
236
u_int *ivec)
237
{
238
panic("bhnd_bus_get_intr_ivec unimplemented");
239
}
240
241
static int
242
bhnd_bus_null_map_intr(device_t dev, device_t child, u_int intr,
243
rman_res_t *irq)
244
{
245
panic("bhnd_bus_map_intr unimplemented");
246
}
247
248
static int
249
bhnd_bus_null_unmap_intr(device_t dev, device_t child, rman_res_t irq)
250
{
251
panic("bhnd_bus_unmap_intr unimplemented");
252
}
253
254
static int
255
bhnd_bus_null_get_port_rid(device_t dev, device_t child,
256
bhnd_port_type port_type, u_int port, u_int region)
257
{
258
return (-1);
259
}
260
261
static int
262
bhnd_bus_null_decode_port_rid(device_t dev, device_t child, int type,
263
int rid, bhnd_port_type *port_type, u_int *port, u_int *region)
264
{
265
return (ENOENT);
266
}
267
268
static int
269
bhnd_bus_null_get_region_addr(device_t dev, device_t child,
270
bhnd_port_type type, u_int port, u_int region, bhnd_addr_t *addr,
271
bhnd_size_t *size)
272
{
273
return (ENOENT);
274
}
275
276
static int
277
bhnd_bus_null_get_nvram_var(device_t dev, device_t child,
278
const char *name, void *buf, size_t *size, bhnd_nvram_type type)
279
{
280
return (ENODEV);
281
}
282
283
}
284
285
/**
286
* Return the bhnd(4) bus driver's device enumeration parser class.
287
*
288
* @param driver The bhnd bus driver instance.
289
*/
290
STATICMETHOD bhnd_erom_class_t * get_erom_class {
291
driver_t *driver;
292
} DEFAULT bhnd_bus_null_get_erom_class;
293
294
/**
295
* Register a shared bus @p provider for a given @p service.
296
*
297
* @param dev The parent of @p child.
298
* @param child The requesting child device.
299
* @param provider The service provider to register.
300
* @param service The service for which @p provider will be registered.
301
*
302
* @retval 0 success
303
* @retval EEXIST if an entry for @p service already exists.
304
* @retval non-zero if registering @p provider otherwise fails, a regular
305
* unix error code will be returned.
306
*/
307
METHOD int register_provider {
308
device_t dev;
309
device_t child;
310
device_t provider;
311
bhnd_service_t service;
312
} DEFAULT bhnd_bus_generic_register_provider;
313
314
/**
315
* Attempt to remove the @p service provider registration for @p provider.
316
*
317
* @param dev The parent of @p child.
318
* @param child The requesting child device.
319
* @param provider The service provider to be deregistered.
320
* @param service The service for which @p provider will be deregistered,
321
* or BHND_SERVICE_INVALID to remove all service
322
* registrations for @p provider.
323
*
324
* @retval 0 success
325
* @retval EBUSY if active references to @p provider exist; @see
326
* BHND_BUS_RETAIN_PROVIDER() and
327
* BHND_BUS_RELEASE_PROVIDER().
328
*/
329
METHOD int deregister_provider {
330
device_t dev;
331
device_t child;
332
device_t provider;
333
bhnd_service_t service;
334
} DEFAULT bhnd_bus_generic_deregister_provider;
335
336
/**
337
* Retain and return a reference to the registered @p service provider, if any.
338
*
339
* @param dev The parent of @p child.
340
* @param child The requesting child device.
341
* @param service The service for which a provider should be returned.
342
*
343
* On success, the caller assumes ownership the returned provider, and
344
* is responsible for releasing this reference via
345
* BHND_BUS_RELEASE_PROVIDER().
346
*
347
* @retval device_t success
348
* @retval NULL if no provider is registered for @p service.
349
*/
350
METHOD device_t retain_provider {
351
device_t dev;
352
device_t child;
353
bhnd_service_t service;
354
} DEFAULT bhnd_bus_generic_retain_provider;
355
356
/**
357
* Release a reference to a service provider previously returned by
358
* BHND_BUS_RETAIN_PROVIDER().
359
*
360
* @param dev The parent of @p child.
361
* @param child The requesting child device.
362
* @param provider The provider to be released.
363
* @param service The service for which @p provider was previously
364
* retained.
365
*/
366
METHOD void release_provider {
367
device_t dev;
368
device_t child;
369
device_t provider;
370
bhnd_service_t service;
371
} DEFAULT bhnd_bus_generic_release_provider;
372
373
/**
374
* Return a struct bhnd_service_registry.
375
*
376
* Used by drivers which use bhnd_bus_generic_sr_register_provider() etc.
377
* to implement service provider registration. It should return a service
378
* registry that may be used to resolve provider requests from @p child.
379
*
380
* @param dev The parent of @p child.
381
* @param child The requesting child device.
382
*/
383
METHOD struct bhnd_service_registry * get_service_registry {
384
device_t dev;
385
device_t child;
386
} DEFAULT bhnd_bus_null_get_service_registry;
387
388
/**
389
* Return the active host bridge core for the bhnd bus, if any.
390
*
391
* @param dev The bhnd bus device.
392
*
393
* @retval device_t if a hostb device exists
394
* @retval NULL if no hostb device is found.
395
*/
396
METHOD device_t find_hostb_device {
397
device_t dev;
398
} DEFAULT bhnd_bus_null_find_hostb_device;
399
400
/**
401
* Return true if the hardware components required by @p child are unpopulated
402
* or otherwise unusable.
403
*
404
* In some cases, enumerated devices may have pins that are left floating, or
405
* the hardware may otherwise be non-functional; this method allows a parent
406
* device to explicitly specify if a successfully enumerated @p child should
407
* be disabled.
408
*
409
* @param dev The device whose child is being examined.
410
* @param child The child device.
411
*/
412
METHOD bool is_hw_disabled {
413
device_t dev;
414
device_t child;
415
} DEFAULT bhnd_bus_null_is_hw_disabled;
416
417
/**
418
* Return the probe (and attach) order for @p child.
419
*
420
* All devices on the bhnd(4) bus will be probed, attached, or resumed in
421
* ascending order; they will be suspended, shutdown, and detached in
422
* descending order.
423
*
424
* The following device methods will be dispatched in ascending probe order
425
* by the bus:
426
*
427
* - DEVICE_PROBE()
428
* - DEVICE_ATTACH()
429
* - DEVICE_RESUME()
430
*
431
* The following device methods will be dispatched in descending probe order
432
* by the bus:
433
*
434
* - DEVICE_SHUTDOWN()
435
* - DEVICE_DETACH()
436
* - DEVICE_SUSPEND()
437
*
438
* @param dev The device whose child is being examined.
439
* @param child The child device.
440
*
441
* Refer to BHND_PROBE_* and BHND_PROBE_ORDER_* for the standard set of
442
* priorities.
443
*/
444
METHOD int get_probe_order {
445
device_t dev;
446
device_t child;
447
} DEFAULT bhnd_bus_null_get_probe_order;
448
449
/**
450
* Return the BHND chip identification for the parent bus.
451
*
452
* @param dev The device whose child is being examined.
453
* @param child The child device.
454
*/
455
METHOD const struct bhnd_chipid * get_chipid {
456
device_t dev;
457
device_t child;
458
} DEFAULT bhnd_bus_null_get_chipid;
459
460
/**
461
* Return the BHND attachment type of the parent bus.
462
*
463
* @param dev The device whose child is being examined.
464
* @param child The child device.
465
*
466
* @retval BHND_ATTACH_ADAPTER if the bus is resident on a bridged adapter,
467
* such as a WiFi chipset.
468
* @retval BHND_ATTACH_NATIVE if the bus provides hardware services (clock,
469
* CPU, etc) to a directly attached native host.
470
*/
471
METHOD bhnd_attach_type get_attach_type {
472
device_t dev;
473
device_t child;
474
} DEFAULT bhnd_bus_null_get_attach_type;
475
476
477
/**
478
* Find the best available DMA address translation capable of mapping a
479
* physical host address to a BHND DMA device address of @p width with
480
* @p flags.
481
*
482
* @param dev The parent of @p child.
483
* @param child The bhnd device requesting the DMA address translation.
484
* @param width The address width within which the translation window must
485
* reside (see BHND_DMA_ADDR_*).
486
* @param flags Required translation flags (see BHND_DMA_TRANSLATION_*).
487
* @param[out] dmat On success, will be populated with a DMA tag specifying the
488
* @p translation DMA address restrictions. This argment may be NULL if the DMA
489
* tag is not desired.
490
* the set of valid host DMA addresses reachable via @p translation.
491
* @param[out] translation On success, will be populated with a DMA address
492
* translation descriptor for @p child. This argment may be NULL if the
493
* descriptor is not desired.
494
*
495
* @retval 0 success
496
* @retval ENODEV If DMA is not supported.
497
* @retval ENOENT If no DMA translation matching @p width and @p flags is
498
* available.
499
* @retval non-zero If determining the DMA address translation for @p child
500
* otherwise fails, a regular unix error code will be returned.
501
*/
502
METHOD int get_dma_translation {
503
device_t dev;
504
device_t child;
505
u_int width;
506
uint32_t flags;
507
bus_dma_tag_t *dmat;
508
struct bhnd_dma_translation *translation;
509
} DEFAULT bhnd_bus_generic_get_dma_translation;
510
511
/**
512
* Attempt to read the BHND board identification from the parent bus.
513
*
514
* This relies on NVRAM access, and will fail if a valid NVRAM device cannot
515
* be found, or is not yet attached.
516
*
517
* @param dev The parent of @p child.
518
* @param child The bhnd device requesting board info.
519
* @param[out] info On success, will be populated with the bhnd(4) device's
520
* board information.
521
*
522
* @retval 0 success
523
* @retval ENODEV No valid NVRAM source could be found.
524
* @retval non-zero If reading @p name otherwise fails, a regular unix
525
* error code will be returned.
526
*/
527
METHOD int read_board_info {
528
device_t dev;
529
device_t child;
530
struct bhnd_board_info *info;
531
} DEFAULT bhnd_bus_null_read_board_info;
532
533
/**
534
* Notify a bhnd bus that a child was added.
535
*
536
* This method must be called by concrete bhnd(4) driver impementations
537
* after @p child's bus state is fully initialized.
538
*
539
* @param dev The bhnd bus whose child is being added.
540
* @param child The child added to @p dev.
541
*/
542
METHOD void child_added {
543
device_t dev;
544
device_t child;
545
} DEFAULT bhnd_bus_null_child_added;
546
547
/**
548
* Read the current value of @p child's I/O control register.
549
*
550
* @param dev The bhnd bus parent of @p child.
551
* @param child The bhnd device for which the I/O control register should be
552
* read.
553
* @param[out] ioctl On success, the I/O control register value.
554
*
555
* @retval 0 success
556
* @retval EINVAL If @p child is not a direct child of @p dev.
557
* @retval ENODEV If agent/config space for @p child is unavailable.
558
* @retval non-zero If reading the IOCTL register otherwise fails, a regular
559
* unix error code will be returned.
560
*/
561
METHOD int read_ioctl {
562
device_t dev;
563
device_t child;
564
uint16_t *ioctl;
565
} DEFAULT bhnd_bus_null_read_ioctl;
566
567
/**
568
* Write @p value with @p mask to @p child's I/O control register.
569
*
570
* @param dev The bhnd bus parent of @p child.
571
* @param child The bhnd device for which the I/O control register should
572
* be updated.
573
* @param value The value to be written (see also BHND_IOCTL_*).
574
* @param mask Only the bits defined by @p mask will be updated from @p value.
575
*
576
* @retval 0 success
577
* @retval EINVAL If @p child is not a direct child of @p dev.
578
* @retval ENODEV If agent/config space for @p child is unavailable.
579
* @retval non-zero If writing the IOCTL register otherwise fails, a regular
580
* unix error code will be returned.
581
*/
582
METHOD int write_ioctl {
583
device_t dev;
584
device_t child;
585
uint16_t value;
586
uint16_t mask;
587
} DEFAULT bhnd_bus_null_write_ioctl;
588
589
/**
590
* Read the current value of @p child's I/O status register.
591
*
592
* @param dev The bhnd bus parent of @p child.
593
* @param child The bhnd device for which the I/O status register should be
594
* read.
595
* @param[out] iost On success, the I/O status register value.
596
*
597
* @retval 0 success
598
* @retval EINVAL If @p child is not a direct child of @p dev.
599
* @retval ENODEV If agent/config space for @p child is unavailable.
600
* @retval non-zero If reading the IOST register otherwise fails, a regular
601
* unix error code will be returned.
602
*/
603
METHOD int read_iost {
604
device_t dev;
605
device_t child;
606
uint16_t *iost;
607
} DEFAULT bhnd_bus_null_read_iost;
608
609
610
/**
611
* Return true if the given bhnd device's hardware is currently held
612
* in a RESET state or otherwise not clocked (BHND_IOCTL_CLK_EN).
613
*
614
* @param dev The bhnd bus parent of @p child.
615
* @param child The device to query.
616
*
617
* @retval true If @p child is held in RESET or not clocked (BHND_IOCTL_CLK_EN),
618
* or an error occurred determining @p child's hardware state.
619
* @retval false If @p child is clocked and is not held in RESET.
620
*/
621
METHOD bool is_hw_suspended {
622
device_t dev;
623
device_t child;
624
} DEFAULT bhnd_bus_null_is_hw_suspended;
625
626
/**
627
* Place the bhnd(4) device's hardware into a low-power RESET state with
628
* the @p reset_ioctl I/O control flags set, and then bring the hardware out of
629
* RESET with the @p ioctl I/O control flags set.
630
*
631
* Any clock or resource PMU requests previously made by @p child will be
632
* invalidated.
633
*
634
* @param dev The bhnd bus parent of @p child.
635
* @param child The device to be reset.
636
* @param ioctl Device-specific I/O control flags to be set when bringing
637
* the core out of its RESET state (see BHND_IOCTL_*).
638
* @param reset_ioctl Device-specific I/O control flags to be set when placing
639
* the core into its RESET state.
640
*
641
* @retval 0 success
642
* @retval non-zero error
643
*/
644
METHOD int reset_hw {
645
device_t dev;
646
device_t child;
647
uint16_t ioctl;
648
uint16_t reset_ioctl;
649
} DEFAULT bhnd_bus_null_reset_hw;
650
651
/**
652
* Suspend @p child's hardware in a low-power RESET state.
653
*
654
* Any clock or resource PMU requests previously made by @p dev will be
655
* invalidated.
656
*
657
* The hardware may be brought out of RESET via bhnd_reset_hw().
658
*
659
* @param dev The bhnd bus parent of @p child.
660
* @param dev The device to be suspended.
661
* @param ioctl Device-specific I/O control flags to be set when placing
662
* the core into its RESET state (see BHND_IOCTL_*).
663
*
664
* @retval 0 success
665
* @retval non-zero error
666
*/
667
METHOD int suspend_hw {
668
device_t dev;
669
device_t child;
670
uint16_t ioctl;
671
} DEFAULT bhnd_bus_null_suspend_hw;
672
673
/**
674
* Allocate per-core PMU resources and enable PMU request handling for @p child.
675
*
676
* The region containing the core's PMU register block (if any) must be
677
* allocated via bus_alloc_resource(9) (or bhnd_alloc_resource) before
678
* calling BHND_BUS_ALLOC_PMU(), and must not be released until after
679
* calling BHND_BUS_RELEASE_PMU().
680
*
681
* @param dev The parent of @p child.
682
* @param child The requesting bhnd device.
683
*
684
* @retval 0 success
685
* @retval non-zero if enabling per-core PMU request handling fails, a
686
* regular unix error code will be returned.
687
*/
688
METHOD int alloc_pmu {
689
device_t dev;
690
device_t child;
691
} DEFAULT bhnd_bus_null_alloc_pmu;
692
693
/**
694
* Release per-core PMU resources allocated for @p child. Any
695
* outstanding PMU requests are discarded.
696
*
697
* @param dev The parent of @p child.
698
* @param child The requesting bhnd device.
699
*/
700
METHOD int release_pmu {
701
device_t dev;
702
device_t child;
703
} DEFAULT bhnd_bus_null_release_pmu;
704
705
/**
706
* Return the transition latency required for @p clock in microseconds, if
707
* known.
708
*
709
* The BHND_CLOCK_HT latency value is suitable for use as the D11 core's
710
* 'fastpwrup_dly' value.
711
*
712
* @note A driver must ask the bhnd bus to allocate PMU request state
713
* via BHND_BUS_ALLOC_PMU() before querying PMU clocks.
714
*
715
* @param dev The parent of @p child.
716
* @param child The requesting bhnd device.
717
* @param clock The clock to be queried for transition latency.
718
* @param[out] latency On success, the transition latency of @p clock in
719
* microseconds.
720
*
721
* @retval 0 success
722
* @retval ENODEV If the transition latency for @p clock is not available.
723
*/
724
METHOD int get_clock_latency {
725
device_t dev;
726
device_t child;
727
bhnd_clock clock;
728
u_int *latency;
729
} DEFAULT bhnd_bus_null_get_clock_latency;
730
731
/**
732
* Return the frequency for @p clock in Hz, if known.
733
*
734
* @param dev The parent of @p child.
735
* @param child The requesting bhnd device.
736
* @param clock The clock to be queried.
737
* @param[out] freq On success, the frequency of @p clock in Hz.
738
*
739
* @note A driver must ask the bhnd bus to allocate PMU request state
740
* via BHND_BUS_ALLOC_PMU() before querying PMU clocks.
741
*
742
* @retval 0 success
743
* @retval ENODEV If the frequency for @p clock is not available.
744
*/
745
METHOD int get_clock_freq {
746
device_t dev;
747
device_t child;
748
bhnd_clock clock;
749
u_int *freq;
750
} DEFAULT bhnd_bus_null_get_clock_freq;
751
752
/**
753
* Request that @p clock (or faster) be routed to @p child.
754
*
755
* @note A driver must ask the bhnd bus to allocate PMU request state
756
* via BHND_BUS_ALLOC_PMU() before it can request clock resources.
757
*
758
* @note Any outstanding PMU clock requests will be discarded upon calling
759
* BHND_BUS_RESET_HW() or BHND_BUS_SUSPEND_HW().
760
*
761
* @param dev The parent of @p child.
762
* @param child The bhnd device requesting @p clock.
763
* @param clock The requested clock source.
764
*
765
* @retval 0 success
766
* @retval ENODEV If an unsupported clock was requested.
767
* @retval ETIMEDOUT If the clock request succeeds, but the clock is not
768
* detected as ready within the PMU's maximum transition
769
* delay. This should not occur in normal operation.
770
*/
771
METHOD int request_clock {
772
device_t dev;
773
device_t child;
774
bhnd_clock clock;
775
} DEFAULT bhnd_bus_null_request_clock;
776
777
/**
778
* Request that @p clocks be powered on behalf of @p child.
779
*
780
* This will power on clock sources (e.g. XTAL, PLL, etc) required for
781
* @p clocks and wait until they are ready, discarding any previous
782
* requests by @p child.
783
*
784
* @note A driver must ask the bhnd bus to allocate PMU request state
785
* via BHND_BUS_ALLOC_PMU() before it can request clock resources.
786
*
787
* @note Any outstanding PMU clock requests will be discarded upon calling
788
* BHND_BUS_RESET_HW() or BHND_BUS_SUSPEND_HW().
789
*
790
* @param dev The parent of @p child.
791
* @param child The bhnd device requesting @p clock.
792
* @param clock The requested clock source.
793
*
794
* @retval 0 success
795
* @retval ENODEV If an unsupported clock was requested.
796
* @retval ETIMEDOUT If the clock request succeeds, but the clock is not
797
* detected as ready within the PMU's maximum transition
798
* delay. This should not occur in normal operation.
799
*/
800
METHOD int enable_clocks {
801
device_t dev;
802
device_t child;
803
uint32_t clocks;
804
} DEFAULT bhnd_bus_null_enable_clocks;
805
806
/**
807
* Power up an external PMU-managed resource assigned to @p child.
808
*
809
* @note A driver must ask the bhnd bus to allocate PMU request state
810
* via BHND_BUS_ALLOC_PMU() before it can request PMU resources.
811
*
812
* @note Any outstanding PMU resource requests will be released upon calling
813
* BHND_BUS_RESET_HW() or BHND_BUS_SUSPEND_HW().
814
*
815
* @param dev The parent of @p child.
816
* @param child The bhnd device requesting @p rsrc.
817
* @param rsrc The core-specific external resource identifier.
818
*
819
* @retval 0 success
820
* @retval ENODEV If the PMU does not support @p rsrc.
821
* @retval ETIMEDOUT If the clock request succeeds, but the clock is not
822
* detected as ready within the PMU's maximum transition
823
* delay. This should not occur in normal operation.
824
*/
825
METHOD int request_ext_rsrc {
826
device_t dev;
827
device_t child;
828
u_int rsrc;
829
} DEFAULT bhnd_bus_null_request_ext_rsrc;
830
831
/**
832
* Power down an external PMU-managed resource assigned to @p child.
833
*
834
* @note A driver must ask the bhnd bus to allocate PMU request state
835
* via BHND_BUS_ALLOC_PMU() before it can request PMU resources.
836
*
837
* @param dev The parent of @p child.
838
* @param child The bhnd device requesting @p rsrc.
839
* @param rsrc The core-specific external resource number.
840
*
841
* @retval 0 success
842
* @retval ENODEV If the PMU does not support @p rsrc.
843
* @retval ETIMEDOUT If the clock request succeeds, but the clock is not
844
* detected as ready within the PMU's maximum transition
845
* delay. This should not occur in normal operation.
846
*/
847
METHOD int release_ext_rsrc {
848
device_t dev;
849
device_t child;
850
u_int rsrc;
851
} DEFAULT bhnd_bus_null_release_ext_rsrc;
852
853
/**
854
* Read @p width bytes at @p offset from the bus-specific agent/config
855
* space of @p child.
856
*
857
* @param dev The parent of @p child.
858
* @param child The bhnd device for which @p offset should be read.
859
* @param offset The offset to be read.
860
* @param[out] value On success, the bytes read at @p offset.
861
* @param width The size of the access. Must be 1, 2 or 4 bytes.
862
*
863
* The exact behavior of this method is bus-specific. On a bcma(4) bus, this
864
* method provides access to the first agent port of @p child; on a siba(4) bus,
865
* this method provides access to the core's CFG0 register block.
866
*
867
* @note Device drivers should only use this API for functionality
868
* that is not available via another bhnd(4) function.
869
*
870
* @retval 0 success
871
* @retval EINVAL If @p child is not a direct child of @p dev.
872
* @retval EINVAL If @p width is not one of 1, 2, or 4 bytes.
873
* @retval ENODEV If accessing agent/config space for @p child is unsupported.
874
* @retval EFAULT If reading @p width at @p offset exceeds the bounds of
875
* the mapped agent/config space for @p child.
876
*/
877
METHOD int read_config {
878
device_t dev;
879
device_t child;
880
bus_size_t offset;
881
void *value;
882
u_int width;
883
} DEFAULT bhnd_bus_null_read_config;
884
885
/**
886
* Read @p width bytes at @p offset from the bus-specific agent/config
887
* space of @p child.
888
*
889
* @param dev The parent of @p child.
890
* @param child The bhnd device for which @p offset should be read.
891
* @param offset The offset to be written.
892
* @param value A pointer to the value to be written.
893
* @param width The size of @p value. Must be 1, 2 or 4 bytes.
894
*
895
* The exact behavior of this method is bus-specific. In the case of
896
* bcma(4), this method provides access to the first agent port of @p child.
897
*
898
* @note Device drivers should only use this API for functionality
899
* that is not available via another bhnd(4) function.
900
*
901
* @retval 0 success
902
* @retval EINVAL If @p child is not a direct child of @p dev.
903
* @retval EINVAL If @p width is not one of 1, 2, or 4 bytes.
904
* @retval ENODEV If accessing agent/config space for @p child is unsupported.
905
* @retval EFAULT If reading @p width at @p offset exceeds the bounds of
906
* the mapped agent/config space for @p child.
907
*/
908
METHOD int write_config {
909
device_t dev;
910
device_t child;
911
bus_size_t offset;
912
const void *value;
913
u_int width;
914
} DEFAULT bhnd_bus_null_write_config;
915
916
/**
917
* Allocate a bhnd resource.
918
*
919
* This method's semantics are functionally identical to the bus API of the same
920
* name; refer to BUS_ALLOC_RESOURCE for complete documentation.
921
*/
922
METHOD struct bhnd_resource * alloc_resource {
923
device_t dev;
924
device_t child;
925
int type;
926
int *rid;
927
rman_res_t start;
928
rman_res_t end;
929
rman_res_t count;
930
u_int flags;
931
} DEFAULT bhnd_bus_generic_alloc_resource;
932
933
/**
934
* Release a bhnd resource.
935
*
936
* This method's semantics are functionally identical to the bus API of the same
937
* name; refer to BUS_RELEASE_RESOURCE for complete documentation.
938
*/
939
METHOD int release_resource {
940
device_t dev;
941
device_t child;
942
int type;
943
int rid;
944
struct bhnd_resource *res;
945
} DEFAULT bhnd_bus_generic_release_resource;
946
947
/**
948
* Activate a bhnd resource.
949
*
950
* This method's semantics are functionally identical to the bus API of the same
951
* name; refer to BUS_ACTIVATE_RESOURCE for complete documentation.
952
*/
953
METHOD int activate_resource {
954
device_t dev;
955
device_t child;
956
int type;
957
int rid;
958
struct bhnd_resource *r;
959
} DEFAULT bhnd_bus_generic_activate_resource;
960
961
/**
962
* Deactivate a bhnd resource.
963
*
964
* This method's semantics are functionally identical to the bus API of the same
965
* name; refer to BUS_DEACTIVATE_RESOURCE for complete documentation.
966
*/
967
METHOD int deactivate_resource {
968
device_t dev;
969
device_t child;
970
int type;
971
int rid;
972
struct bhnd_resource *r;
973
} DEFAULT bhnd_bus_generic_deactivate_resource;
974
975
/**
976
* Return the interrupt domain.
977
*
978
* This globally unique value may be used as the interrupt controller 'xref'
979
* on targets that support INTRNG.
980
*
981
* @param dev The device whose child is being examined.
982
* @param child The child device.
983
* @param self If true, return @p child's interrupt domain, rather than the
984
* domain in which @p child resides.
985
*
986
* On Non-OFW targets, this should either return:
987
* - The pointer address of a device that can uniquely identify @p child's
988
* interrupt domain (e.g., the bhnd bus' device_t address), or
989
* - 0 if unsupported by the bus.
990
*
991
* On OFW (including FDT) targets, this should return the @p child's iparent
992
* property's xref if @p self is false, the child's own node xref value if
993
* @p self is true, or 0 if no interrupt parent is found.
994
*/
995
METHOD uintptr_t get_intr_domain {
996
device_t dev;
997
device_t child;
998
bool self;
999
} DEFAULT bhnd_bus_null_get_intr_domain;
1000
1001
/**
1002
* Return the number of interrupt lines assigned to @p child.
1003
*
1004
* @param dev The bhnd device whose child is being examined.
1005
* @param child The child device.
1006
*/
1007
METHOD u_int get_intr_count {
1008
device_t dev;
1009
device_t child;
1010
} DEFAULT bhnd_bus_null_get_intr_count;
1011
1012
/**
1013
* Get the backplane interrupt vector of the @p intr line attached to @p child.
1014
*
1015
* @param dev The device whose child is being examined.
1016
* @param child The child device.
1017
* @param intr The index of the interrupt line being queried.
1018
* @param[out] ivec On success, the assigned hardware interrupt vector will be
1019
* written to this pointer.
1020
*
1021
* On bcma(4) devices, this returns the OOB bus line assigned to the
1022
* interrupt.
1023
*
1024
* On siba(4) devices, this returns the target OCP slave flag number assigned
1025
* to the interrupt.
1026
*
1027
* @retval 0 success
1028
* @retval ENXIO If @p intr exceeds the number of interrupt lines
1029
* assigned to @p child.
1030
*/
1031
METHOD int get_intr_ivec {
1032
device_t dev;
1033
device_t child;
1034
u_int intr;
1035
u_int *ivec;
1036
} DEFAULT bhnd_bus_null_get_intr_ivec;
1037
1038
/**
1039
* Map the given @p intr to an IRQ number; until unmapped, this IRQ may be used
1040
* to allocate a resource of type SYS_RES_IRQ.
1041
*
1042
* On success, the caller assumes ownership of the interrupt mapping, and
1043
* is responsible for releasing the mapping via BHND_BUS_UNMAP_INTR().
1044
*
1045
* @param dev The bhnd bus device.
1046
* @param child The requesting child device.
1047
* @param intr The interrupt being mapped.
1048
* @param[out] irq On success, the bus interrupt value mapped for @p intr.
1049
*
1050
* @retval 0 If an interrupt was assigned.
1051
* @retval non-zero If mapping an interrupt otherwise fails, a regular
1052
* unix error code will be returned.
1053
*/
1054
METHOD int map_intr {
1055
device_t dev;
1056
device_t child;
1057
u_int intr;
1058
rman_res_t *irq;
1059
} DEFAULT bhnd_bus_null_map_intr;
1060
1061
/**
1062
* Unmap an bus interrupt previously mapped via BHND_BUS_MAP_INTR().
1063
*
1064
* @param dev The bhnd bus device.
1065
* @param child The requesting child device.
1066
* @param intr The interrupt number being unmapped. This is equivalent to the
1067
* bus resource ID for the interrupt.
1068
*/
1069
METHOD void unmap_intr {
1070
device_t dev;
1071
device_t child;
1072
rman_res_t irq;
1073
} DEFAULT bhnd_bus_null_unmap_intr;
1074
1075
/**
1076
* Return true if @p region_num is a valid region on @p port_num of
1077
* @p type attached to @p child.
1078
*
1079
* @param dev The device whose child is being examined.
1080
* @param child The child device.
1081
* @param type The port type being queried.
1082
* @param port_num The port number being queried.
1083
* @param region_num The region number being queried.
1084
*/
1085
METHOD bool is_region_valid {
1086
device_t dev;
1087
device_t child;
1088
bhnd_port_type type;
1089
u_int port_num;
1090
u_int region_num;
1091
};
1092
1093
/**
1094
* Return the number of ports of type @p type attached to @p child.
1095
*
1096
* @param dev The device whose child is being examined.
1097
* @param child The child device.
1098
* @param type The port type being queried.
1099
*/
1100
METHOD u_int get_port_count {
1101
device_t dev;
1102
device_t child;
1103
bhnd_port_type type;
1104
};
1105
1106
/**
1107
* Return the number of memory regions mapped to @p child @p port of
1108
* type @p type.
1109
*
1110
* @param dev The device whose child is being examined.
1111
* @param child The child device.
1112
* @param port The port number being queried.
1113
* @param type The port type being queried.
1114
*/
1115
METHOD u_int get_region_count {
1116
device_t dev;
1117
device_t child;
1118
bhnd_port_type type;
1119
u_int port;
1120
};
1121
1122
/**
1123
* Return the SYS_RES_MEMORY resource-ID for a port/region pair attached to
1124
* @p child.
1125
*
1126
* @param dev The bus device.
1127
* @param child The bhnd child.
1128
* @param port_type The port type.
1129
* @param port_num The index of the child interconnect port.
1130
* @param region_num The index of the port-mapped address region.
1131
*
1132
* @retval -1 No such port/region found.
1133
*/
1134
METHOD int get_port_rid {
1135
device_t dev;
1136
device_t child;
1137
bhnd_port_type port_type;
1138
u_int port_num;
1139
u_int region_num;
1140
} DEFAULT bhnd_bus_null_get_port_rid;
1141
1142
1143
/**
1144
* Decode a port / region pair on @p child defined by @p type and @p rid.
1145
*
1146
* @param dev The bus device.
1147
* @param child The bhnd child.
1148
* @param type The resource type.
1149
* @param rid The resource ID.
1150
* @param[out] port_type The port's type.
1151
* @param[out] port The port identifier.
1152
* @param[out] region The identifier of the memory region on @p port.
1153
*
1154
* @retval 0 success
1155
* @retval non-zero No matching type/rid found.
1156
*/
1157
METHOD int decode_port_rid {
1158
device_t dev;
1159
device_t child;
1160
int type;
1161
int rid;
1162
bhnd_port_type *port_type;
1163
u_int *port;
1164
u_int *region;
1165
} DEFAULT bhnd_bus_null_decode_port_rid;
1166
1167
/**
1168
* Get the address and size of @p region on @p port.
1169
*
1170
* @param dev The bus device.
1171
* @param child The bhnd child.
1172
* @param port_type The port type.
1173
* @param port The port identifier.
1174
* @param region The identifier of the memory region on @p port.
1175
* @param[out] region_addr The region's base address.
1176
* @param[out] region_size The region's size.
1177
*
1178
* @retval 0 success
1179
* @retval non-zero No matching port/region found.
1180
*/
1181
METHOD int get_region_addr {
1182
device_t dev;
1183
device_t child;
1184
bhnd_port_type port_type;
1185
u_int port;
1186
u_int region;
1187
bhnd_addr_t *region_addr;
1188
bhnd_size_t *region_size;
1189
} DEFAULT bhnd_bus_null_get_region_addr;
1190
1191
/**
1192
* Read an NVRAM variable.
1193
*
1194
* It is the responsibility of the bus to delegate this request to
1195
* the appropriate NVRAM child device, or to a parent bus implementation.
1196
*
1197
* @param dev The bus device.
1198
* @param child The requesting device.
1199
* @param name The NVRAM variable name.
1200
* @param[out] buf On success, the requested value will be written
1201
* to this buffer. This argment may be NULL if
1202
* the value is not desired.
1203
* @param[in,out] size The capacity of @p buf. On success, will be set
1204
* to the actual size of the requested value.
1205
* @param type The data type to be written to @p buf.
1206
*
1207
* @retval 0 success
1208
* @retval ENOENT The requested variable was not found.
1209
* @retval ENOMEM If @p buf is non-NULL and a buffer of @p size is too
1210
* small to hold the requested value.
1211
* @retval ENODEV No valid NVRAM source could be found.
1212
* @retval EFTYPE If the @p name's data type cannot be coerced to @p type.
1213
* @retval ERANGE If value coercion would overflow @p type.
1214
* @retval non-zero If reading @p name otherwise fails, a regular unix
1215
* error code will be returned.
1216
*/
1217
METHOD int get_nvram_var {
1218
device_t dev;
1219
device_t child;
1220
const char *name;
1221
void *buf;
1222
size_t *size;
1223
bhnd_nvram_type type;
1224
} DEFAULT bhnd_bus_null_get_nvram_var;
1225
1226
1227
/** An implementation of bus_read_1() compatible with bhnd_resource */
1228
METHOD uint8_t read_1 {
1229
device_t dev;
1230
device_t child;
1231
struct bhnd_resource *r;
1232
bus_size_t offset;
1233
}
1234
1235
/** An implementation of bus_read_2() compatible with bhnd_resource */
1236
METHOD uint16_t read_2 {
1237
device_t dev;
1238
device_t child;
1239
struct bhnd_resource *r;
1240
bus_size_t offset;
1241
}
1242
1243
/** An implementation of bus_read_4() compatible with bhnd_resource */
1244
METHOD uint32_t read_4 {
1245
device_t dev;
1246
device_t child;
1247
struct bhnd_resource *r;
1248
bus_size_t offset;
1249
}
1250
1251
/** An implementation of bus_write_1() compatible with bhnd_resource */
1252
METHOD void write_1 {
1253
device_t dev;
1254
device_t child;
1255
struct bhnd_resource *r;
1256
bus_size_t offset;
1257
uint8_t value;
1258
}
1259
1260
/** An implementation of bus_write_2() compatible with bhnd_resource */
1261
METHOD void write_2 {
1262
device_t dev;
1263
device_t child;
1264
struct bhnd_resource *r;
1265
bus_size_t offset;
1266
uint16_t value;
1267
}
1268
1269
/** An implementation of bus_write_4() compatible with bhnd_resource */
1270
METHOD void write_4 {
1271
device_t dev;
1272
device_t child;
1273
struct bhnd_resource *r;
1274
bus_size_t offset;
1275
uint32_t value;
1276
}
1277
1278
/** An implementation of bus_read_stream_1() compatible with bhnd_resource */
1279
METHOD uint8_t read_stream_1 {
1280
device_t dev;
1281
device_t child;
1282
struct bhnd_resource *r;
1283
bus_size_t offset;
1284
}
1285
1286
/** An implementation of bus_read_stream_2() compatible with bhnd_resource */
1287
METHOD uint16_t read_stream_2 {
1288
device_t dev;
1289
device_t child;
1290
struct bhnd_resource *r;
1291
bus_size_t offset;
1292
}
1293
1294
/** An implementation of bus_read_stream_4() compatible with bhnd_resource */
1295
METHOD uint32_t read_stream_4 {
1296
device_t dev;
1297
device_t child;
1298
struct bhnd_resource *r;
1299
bus_size_t offset;
1300
}
1301
1302
/** An implementation of bus_write_stream_1() compatible with bhnd_resource */
1303
METHOD void write_stream_1 {
1304
device_t dev;
1305
device_t child;
1306
struct bhnd_resource *r;
1307
bus_size_t offset;
1308
uint8_t value;
1309
}
1310
1311
/** An implementation of bus_write_stream_2() compatible with bhnd_resource */
1312
METHOD void write_stream_2 {
1313
device_t dev;
1314
device_t child;
1315
struct bhnd_resource *r;
1316
bus_size_t offset;
1317
uint16_t value;
1318
}
1319
1320
/** An implementation of bus_write_stream_4() compatible with bhnd_resource */
1321
METHOD void write_stream_4 {
1322
device_t dev;
1323
device_t child;
1324
struct bhnd_resource *r;
1325
bus_size_t offset;
1326
uint32_t value;
1327
}
1328
1329
/** An implementation of bus_read_multi_1() compatible with bhnd_resource */
1330
METHOD void read_multi_1 {
1331
device_t dev;
1332
device_t child;
1333
struct bhnd_resource *r;
1334
bus_size_t offset;
1335
uint8_t *datap;
1336
bus_size_t count;
1337
}
1338
1339
/** An implementation of bus_read_multi_2() compatible with bhnd_resource */
1340
METHOD void read_multi_2 {
1341
device_t dev;
1342
device_t child;
1343
struct bhnd_resource *r;
1344
bus_size_t offset;
1345
uint16_t *datap;
1346
bus_size_t count;
1347
}
1348
1349
/** An implementation of bus_read_multi_4() compatible with bhnd_resource */
1350
METHOD void read_multi_4 {
1351
device_t dev;
1352
device_t child;
1353
struct bhnd_resource *r;
1354
bus_size_t offset;
1355
uint32_t *datap;
1356
bus_size_t count;
1357
}
1358
1359
/** An implementation of bus_write_multi_1() compatible with bhnd_resource */
1360
METHOD void write_multi_1 {
1361
device_t dev;
1362
device_t child;
1363
struct bhnd_resource *r;
1364
bus_size_t offset;
1365
uint8_t *datap;
1366
bus_size_t count;
1367
}
1368
1369
/** An implementation of bus_write_multi_2() compatible with bhnd_resource */
1370
METHOD void write_multi_2 {
1371
device_t dev;
1372
device_t child;
1373
struct bhnd_resource *r;
1374
bus_size_t offset;
1375
uint16_t *datap;
1376
bus_size_t count;
1377
}
1378
1379
/** An implementation of bus_write_multi_4() compatible with bhnd_resource */
1380
METHOD void write_multi_4 {
1381
device_t dev;
1382
device_t child;
1383
struct bhnd_resource *r;
1384
bus_size_t offset;
1385
uint32_t *datap;
1386
bus_size_t count;
1387
}
1388
1389
/** An implementation of bus_read_multi_stream_1() compatible
1390
* bhnd_resource */
1391
METHOD void read_multi_stream_1 {
1392
device_t dev;
1393
device_t child;
1394
struct bhnd_resource *r;
1395
bus_size_t offset;
1396
uint8_t *datap;
1397
bus_size_t count;
1398
}
1399
1400
/** An implementation of bus_read_multi_stream_2() compatible
1401
* bhnd_resource */
1402
METHOD void read_multi_stream_2 {
1403
device_t dev;
1404
device_t child;
1405
struct bhnd_resource *r;
1406
bus_size_t offset;
1407
uint16_t *datap;
1408
bus_size_t count;
1409
}
1410
1411
/** An implementation of bus_read_multi_stream_4() compatible
1412
* bhnd_resource */
1413
METHOD void read_multi_stream_4 {
1414
device_t dev;
1415
device_t child;
1416
struct bhnd_resource *r;
1417
bus_size_t offset;
1418
uint32_t *datap;
1419
bus_size_t count;
1420
}
1421
1422
/** An implementation of bus_write_multi_stream_1() compatible
1423
* bhnd_resource */
1424
METHOD void write_multi_stream_1 {
1425
device_t dev;
1426
device_t child;
1427
struct bhnd_resource *r;
1428
bus_size_t offset;
1429
uint8_t *datap;
1430
bus_size_t count;
1431
}
1432
1433
/** An implementation of bus_write_multi_stream_2() compatible with
1434
* bhnd_resource */
1435
METHOD void write_multi_stream_2 {
1436
device_t dev;
1437
device_t child;
1438
struct bhnd_resource *r;
1439
bus_size_t offset;
1440
uint16_t *datap;
1441
bus_size_t count;
1442
}
1443
1444
/** An implementation of bus_write_multi_stream_4() compatible with
1445
* bhnd_resource */
1446
METHOD void write_multi_stream_4 {
1447
device_t dev;
1448
device_t child;
1449
struct bhnd_resource *r;
1450
bus_size_t offset;
1451
uint32_t *datap;
1452
bus_size_t count;
1453
}
1454
1455
/** An implementation of bus_set_multi_1() compatible with bhnd_resource */
1456
METHOD void set_multi_1 {
1457
device_t dev;
1458
device_t child;
1459
struct bhnd_resource *r;
1460
bus_size_t offset;
1461
uint8_t value;
1462
bus_size_t count;
1463
}
1464
1465
/** An implementation of bus_set_multi_2() compatible with bhnd_resource */
1466
METHOD void set_multi_2 {
1467
device_t dev;
1468
device_t child;
1469
struct bhnd_resource *r;
1470
bus_size_t offset;
1471
uint16_t value;
1472
bus_size_t count;
1473
}
1474
1475
/** An implementation of bus_set_multi_4() compatible with bhnd_resource */
1476
METHOD void set_multi_4 {
1477
device_t dev;
1478
device_t child;
1479
struct bhnd_resource *r;
1480
bus_size_t offset;
1481
uint32_t value;
1482
bus_size_t count;
1483
}
1484
1485
/** An implementation of bus_set_region_1() compatible with bhnd_resource */
1486
METHOD void set_region_1 {
1487
device_t dev;
1488
device_t child;
1489
struct bhnd_resource *r;
1490
bus_size_t offset;
1491
uint8_t value;
1492
bus_size_t count;
1493
}
1494
1495
/** An implementation of bus_set_region_2() compatible with bhnd_resource */
1496
METHOD void set_region_2 {
1497
device_t dev;
1498
device_t child;
1499
struct bhnd_resource *r;
1500
bus_size_t offset;
1501
uint16_t value;
1502
bus_size_t count;
1503
}
1504
1505
/** An implementation of bus_set_region_4() compatible with bhnd_resource */
1506
METHOD void set_region_4 {
1507
device_t dev;
1508
device_t child;
1509
struct bhnd_resource *r;
1510
bus_size_t offset;
1511
uint32_t value;
1512
bus_size_t count;
1513
}
1514
1515
/** An implementation of bus_read_region_1() compatible with bhnd_resource */
1516
METHOD void read_region_1 {
1517
device_t dev;
1518
device_t child;
1519
struct bhnd_resource *r;
1520
bus_size_t offset;
1521
uint8_t *datap;
1522
bus_size_t count;
1523
}
1524
1525
/** An implementation of bus_read_region_2() compatible with bhnd_resource */
1526
METHOD void read_region_2 {
1527
device_t dev;
1528
device_t child;
1529
struct bhnd_resource *r;
1530
bus_size_t offset;
1531
uint16_t *datap;
1532
bus_size_t count;
1533
}
1534
1535
/** An implementation of bus_read_region_4() compatible with bhnd_resource */
1536
METHOD void read_region_4 {
1537
device_t dev;
1538
device_t child;
1539
struct bhnd_resource *r;
1540
bus_size_t offset;
1541
uint32_t *datap;
1542
bus_size_t count;
1543
}
1544
1545
/** An implementation of bus_read_region_stream_1() compatible with
1546
* bhnd_resource */
1547
METHOD void read_region_stream_1 {
1548
device_t dev;
1549
device_t child;
1550
struct bhnd_resource *r;
1551
bus_size_t offset;
1552
uint8_t *datap;
1553
bus_size_t count;
1554
}
1555
1556
/** An implementation of bus_read_region_stream_2() compatible with
1557
* bhnd_resource */
1558
METHOD void read_region_stream_2 {
1559
device_t dev;
1560
device_t child;
1561
struct bhnd_resource *r;
1562
bus_size_t offset;
1563
uint16_t *datap;
1564
bus_size_t count;
1565
}
1566
1567
/** An implementation of bus_read_region_stream_4() compatible with
1568
* bhnd_resource */
1569
METHOD void read_region_stream_4 {
1570
device_t dev;
1571
device_t child;
1572
struct bhnd_resource *r;
1573
bus_size_t offset;
1574
uint32_t *datap;
1575
bus_size_t count;
1576
}
1577
1578
/** An implementation of bus_write_region_1() compatible with bhnd_resource */
1579
METHOD void write_region_1 {
1580
device_t dev;
1581
device_t child;
1582
struct bhnd_resource *r;
1583
bus_size_t offset;
1584
uint8_t *datap;
1585
bus_size_t count;
1586
}
1587
1588
/** An implementation of bus_write_region_2() compatible with bhnd_resource */
1589
METHOD void write_region_2 {
1590
device_t dev;
1591
device_t child;
1592
struct bhnd_resource *r;
1593
bus_size_t offset;
1594
uint16_t *datap;
1595
bus_size_t count;
1596
}
1597
1598
/** An implementation of bus_write_region_4() compatible with bhnd_resource */
1599
METHOD void write_region_4 {
1600
device_t dev;
1601
device_t child;
1602
struct bhnd_resource *r;
1603
bus_size_t offset;
1604
uint32_t *datap;
1605
bus_size_t count;
1606
}
1607
1608
/** An implementation of bus_write_region_stream_1() compatible with
1609
* bhnd_resource */
1610
METHOD void write_region_stream_1 {
1611
device_t dev;
1612
device_t child;
1613
struct bhnd_resource *r;
1614
bus_size_t offset;
1615
uint8_t *datap;
1616
bus_size_t count;
1617
}
1618
1619
/** An implementation of bus_write_region_stream_2() compatible with
1620
* bhnd_resource */
1621
METHOD void write_region_stream_2 {
1622
device_t dev;
1623
device_t child;
1624
struct bhnd_resource *r;
1625
bus_size_t offset;
1626
uint16_t *datap;
1627
bus_size_t count;
1628
}
1629
1630
/** An implementation of bus_write_region_stream_4() compatible with
1631
* bhnd_resource */
1632
METHOD void write_region_stream_4 {
1633
device_t dev;
1634
device_t child;
1635
struct bhnd_resource *r;
1636
bus_size_t offset;
1637
uint32_t *datap;
1638
bus_size_t count;
1639
}
1640
1641
/** An implementation of bus_barrier() compatible with bhnd_resource */
1642
METHOD void barrier {
1643
device_t dev;
1644
device_t child;
1645
struct bhnd_resource *r;
1646
bus_size_t offset;
1647
bus_size_t length;
1648
int flags;
1649
}
1650
1651