xref: /netbsd-src/sys/arch/x86/pv/pvbus.c (revision b6dff75ee3534b1bb1ce416b10b6b156eb30b26d)
1*b6dff75eSriastradh /*	$NetBSD: pvbus.c,v 1.2 2025/01/14 08:03:40 riastradh Exp $	*/
2d41b2b9cSimil 
3d41b2b9cSimil /*-
4d41b2b9cSimil  * Copyright (c) 2024 The NetBSD Foundation, Inc.
5d41b2b9cSimil  * All rights reserved.
6d41b2b9cSimil  *
7d41b2b9cSimil  * This code is derived from software contributed to The NetBSD Foundation
8d41b2b9cSimil  * by Emile 'iMil' Heitor.
9d41b2b9cSimil  *
10d41b2b9cSimil  * Redistribution and use in source and binary forms, with or without
11d41b2b9cSimil  * modification, are permitted provided that the following conditions
12d41b2b9cSimil  * are met:
13d41b2b9cSimil  * 1. Redistributions of source code must retain the above copyright
14d41b2b9cSimil  *    notice, this list of conditions and the following disclaimer.
15d41b2b9cSimil  * 2. Redistributions in binary form must reproduce the above copyright
16d41b2b9cSimil  *    notice, this list of conditions and the following disclaimer in the
17d41b2b9cSimil  *    documentation and/or other materials provided with the distribution.
18d41b2b9cSimil  *
19d41b2b9cSimil  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20d41b2b9cSimil  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21d41b2b9cSimil  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22d41b2b9cSimil  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23d41b2b9cSimil  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24d41b2b9cSimil  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25d41b2b9cSimil  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26d41b2b9cSimil  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27d41b2b9cSimil  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28d41b2b9cSimil  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29d41b2b9cSimil  * POSSIBILITY OF SUCH DAMAGE.
30d41b2b9cSimil  */
31d41b2b9cSimil 
32d41b2b9cSimil #include <sys/param.h>
33*b6dff75eSriastradh 
34d41b2b9cSimil #include <sys/bus.h>
35*b6dff75eSriastradh #include <sys/cdefs.h>
36d41b2b9cSimil #include <sys/device.h>
37d41b2b9cSimil #include <sys/kernel.h>
38d41b2b9cSimil #include <sys/systm.h>
39d41b2b9cSimil 
40d41b2b9cSimil #include <machine/bus_private.h>
41d41b2b9cSimil 
42d41b2b9cSimil #include <arch/x86/pv/pvvar.h>
43d41b2b9cSimil 
44d41b2b9cSimil static int _pv_dma_may_bounce(bus_dma_tag_t, bus_dmamap_t, int, int *);
45d41b2b9cSimil static int pv_match(device_t, cfdata_t, void *);
46d41b2b9cSimil static void pv_attach(device_t, device_t, void *);
47d41b2b9cSimil static int pv_submatch(device_t, cfdata_t, const int *, void *);
48d41b2b9cSimil 
49d41b2b9cSimil struct x86_bus_dma_tag pvbus_bus_dma_tag = {
50d41b2b9cSimil 	._tag_needs_free	= 0,
51d41b2b9cSimil 	._bounce_thresh		= 0,
52d41b2b9cSimil 	._bounce_alloc_lo	= 0,
53d41b2b9cSimil 	._bounce_alloc_hi	= 0,
54d41b2b9cSimil 	._may_bounce		= _pv_dma_may_bounce,
55d41b2b9cSimil };
56d41b2b9cSimil 
57d41b2b9cSimil CFATTACH_DECL_NEW(pv, sizeof(struct pv_softc),
58d41b2b9cSimil     pv_match, pv_attach, NULL, NULL);
59d41b2b9cSimil 
60d41b2b9cSimil static int
61d41b2b9cSimil _pv_dma_may_bounce(bus_dma_tag_t t, bus_dmamap_t map, int flags,
62d41b2b9cSimil     int *cookieflagsp)
63d41b2b9cSimil {
64*b6dff75eSriastradh 
65d41b2b9cSimil 	if ((map->_dm_size / PAGE_SIZE) > map->_dm_segcnt)
66d41b2b9cSimil 		*cookieflagsp |= X86_DMA_MIGHT_NEED_BOUNCE;
67d41b2b9cSimil 
68d41b2b9cSimil 	return 0;
69d41b2b9cSimil }
70d41b2b9cSimil 
71d41b2b9cSimil static int
72d41b2b9cSimil pv_match(device_t parent, cfdata_t match, void *aux)
73d41b2b9cSimil {
74*b6dff75eSriastradh 
75d41b2b9cSimil 	return 1;
76d41b2b9cSimil }
77d41b2b9cSimil 
78d41b2b9cSimil static void
79d41b2b9cSimil pv_attach(device_t parent, device_t self, void *aux)
80d41b2b9cSimil {
81d41b2b9cSimil 	struct pv_attach_args pvaa;
82d41b2b9cSimil 
83d41b2b9cSimil 	pvaa.pvaa_memt = x86_bus_space_mem;
84d41b2b9cSimil 	pvaa.pvaa_dmat = &pvbus_bus_dma_tag;
85d41b2b9cSimil 
86d41b2b9cSimil 	aprint_naive("\n");
87d41b2b9cSimil 	aprint_normal("\n");
88d41b2b9cSimil 
89d41b2b9cSimil 	config_found(self, &pvaa, NULL, CFARGS(.search = pv_submatch));
90d41b2b9cSimil }
91d41b2b9cSimil 
92d41b2b9cSimil static int
93d41b2b9cSimil pv_submatch(device_t parent, cfdata_t cf, const int *ldesc, void *aux)
94d41b2b9cSimil {
95d41b2b9cSimil 	struct pv_attach_args *pvaa = aux;
96d41b2b9cSimil 
97d41b2b9cSimil 	if (config_probe(parent, cf, pvaa)) {
98d41b2b9cSimil 		config_attach(parent, cf, pvaa, NULL, CFARGS_NONE);
99d41b2b9cSimil 		return 0;
100d41b2b9cSimil 	}
101d41b2b9cSimil 	return 0;
102d41b2b9cSimil }
103