15f616912SHiten Pandya.\" 25f616912SHiten Pandya.\" Copyright (c) 2003 Bruce M Simpson <bms@spc.org> 35f616912SHiten Pandya.\" All rights reserved. 45f616912SHiten Pandya.\" 55f616912SHiten Pandya.\" Redistribution and use in source and binary forms, with or without 65f616912SHiten Pandya.\" modification, are permitted provided that the following conditions 75f616912SHiten Pandya.\" are met: 85f616912SHiten Pandya.\" 1. Redistributions of source code must retain the above copyright 95f616912SHiten Pandya.\" notice, this list of conditions and the following disclaimer. 105f616912SHiten Pandya.\" 2. Redistributions in binary form must reproduce the above copyright 115f616912SHiten Pandya.\" notice, this list of conditions and the following disclaimer in the 125f616912SHiten Pandya.\" documentation and/or other materials provided with the distribution. 135f616912SHiten Pandya.\" 145f616912SHiten Pandya.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 155f616912SHiten Pandya.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 165f616912SHiten Pandya.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 175f616912SHiten Pandya.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 185f616912SHiten Pandya.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 195f616912SHiten Pandya.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 205f616912SHiten Pandya.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 215f616912SHiten Pandya.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 225f616912SHiten Pandya.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 235f616912SHiten Pandya.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 245f616912SHiten Pandya.\" SUCH DAMAGE. 255f616912SHiten Pandya.\" 265f616912SHiten Pandya.\" $FreeBSD$ 275f616912SHiten Pandya.\" 285f616912SHiten Pandya.Dd May 12, 2003 295f616912SHiten Pandya.Dt RMAN 9 305f616912SHiten Pandya.Os 315f616912SHiten Pandya.Sh NAME 325f616912SHiten Pandya.Nm rman , 335f616912SHiten Pandya.Nm rman_activate_resource , 345f616912SHiten Pandya.Nm rman_await_resource , 355f616912SHiten Pandya.Nm rman_deactivate_resource , 365f616912SHiten Pandya.Nm rman_fini , 375f616912SHiten Pandya.Nm rman_init , 385f616912SHiten Pandya.Nm rman_manage_region , 395f616912SHiten Pandya.Nm rman_release_resource , 405f616912SHiten Pandya.Nm rman_reserve_resource , 415f616912SHiten Pandya.Nm rman_reserve_resource_bound , 425f616912SHiten Pandya.Nm rman_make_alignment_flags , 435f616912SHiten Pandya.Nm rman_get_start , 445f616912SHiten Pandya.Nm rman_get_end , 455f616912SHiten Pandya.Nm rman_get_size , 465f616912SHiten Pandya.Nm rman_get_flags , 475f616912SHiten Pandya.Nm rman_set_virtual , 485f616912SHiten Pandya.Nm rman_get_virtual , 495f616912SHiten Pandya.Nm rman_set_bustag , 505f616912SHiten Pandya.Nm rman_get_bustag , 515f616912SHiten Pandya.Nm rman_set_bushandle , 525f616912SHiten Pandya.Nm rman_get_bushandle , 535f616912SHiten Pandya.Nm rman_set_rid , 545f616912SHiten Pandya.Nm rman_get_rid 555f616912SHiten Pandya.Nd resource management functions 565f616912SHiten Pandya.Sh SYNOPSIS 575f616912SHiten Pandya.In sys/rman.h 585f616912SHiten Pandya.Ft int 595f616912SHiten Pandya.Fn rman_activate_resource "struct resource *r" 605f616912SHiten Pandya.Ft int 615f616912SHiten Pandya.Fn rman_await_resource "struct resource *r" "int pri2" "int timo" 625f616912SHiten Pandya.Ft int 635f616912SHiten Pandya.Fn rman_deactivate_resource "struct resource *r" 645f616912SHiten Pandya.Ft int 655f616912SHiten Pandya.Fn rman_fini "struct rman *rm" 665f616912SHiten Pandya.Ft int 675f616912SHiten Pandya.Fn rman_init "struct rman *rm" 685f616912SHiten Pandya.Ft int 695f616912SHiten Pandya.Fn rman_manage_region "struct rman *rm" "u_long start" "u_long end" 705f616912SHiten Pandya.Ft int 715f616912SHiten Pandya.Fn rman_release_resource "struct resource *r" 725f616912SHiten Pandya.Ft struct resource * 735f616912SHiten Pandya.Fn rman_reserve_resource "struct rman *rm" "u_long start" "u_long end" "u_long count" "u_int flags" "struct device *dev" 745f616912SHiten Pandya.Ft struct resource * 755f616912SHiten Pandya.Fn rman_reserve_resource_bound "struct rman *rm" "u_long start" "u_long end" "u_long count" "u_long bound" "u_int flags" "struct device *dev" 765f616912SHiten Pandya.Ft uint32_t 775f616912SHiten Pandya.Fn rman_make_alignment_flags "uint32_t size" 785f616912SHiten Pandya.Ft u_long 795f616912SHiten Pandya.Fn rman_get_start "struct resource *_r" 805f616912SHiten Pandya.Ft u_long 815f616912SHiten Pandya.Fn rman_get_end "struct resource *_r" 825f616912SHiten Pandya.Ft u_long 835f616912SHiten Pandya.Fn rman_get_size "struct resource *_r" 845f616912SHiten Pandya.Ft u_int 855f616912SHiten Pandya.Fn rman_get_flags "struct resource *_r" 865f616912SHiten Pandya.Ft void 875f616912SHiten Pandya.Fn rman_set_virtual "struct resource *_r" "void *_v" 885f616912SHiten Pandya.Ft void * 895f616912SHiten Pandya.Fn rman_get_virtual "struct resource *_r" 905f616912SHiten Pandya.Ft void 915f616912SHiten Pandya.Fn rman_set_bustag "struct resource *_r" "bus_space_tag_t _t" 925f616912SHiten Pandya.Ft bus_space_tag_t 935f616912SHiten Pandya.Fn rman_get_bustag "struct resource *_r" 945f616912SHiten Pandya.Ft void 955f616912SHiten Pandya.Fn rman_set_bushandle "struct resource *_r" "bus_space_handle_t _h" 965f616912SHiten Pandya.Ft bus_space_handle_t 975f616912SHiten Pandya.Fn rman_get_bushandle "struct resource *_r" 985f616912SHiten Pandya.Ft void 995f616912SHiten Pandya.Fn rman_set_rid "struct resource *_r" "int _rid" 1005f616912SHiten Pandya.Ft int 1015f616912SHiten Pandya.Fn rman_get_rid "struct resource *_r" 1025f616912SHiten Pandya.Sh DESCRIPTION 1035f616912SHiten PandyaThe 1045f616912SHiten Pandya.Nm 1055f616912SHiten Pandyaset of functions provides a flexible resource management abstraction. 1065f616912SHiten PandyaIt is used extensively by the bus management code. 1075f616912SHiten PandyaIt implements the abstractions of region and resource. 1085f616912SHiten PandyaA region descriptor is used to manage a region; this could be memory or 1095f616912SHiten Pandyasome other form of bus space. 1105f616912SHiten Pandya.Pp 1115f616912SHiten PandyaEach region has a set of bounds. 1125f616912SHiten PandyaWithin these bounds, allocated segments may reside. 1135f616912SHiten PandyaEach segment, termed a resource, has several properties which are 1145f616912SHiten Pandyarepresented by a 16-bit flag register, as follows. 1155f616912SHiten Pandya.Bd -literal 1165f616912SHiten Pandya#define RF_ALLOCATED 0x0001 /* resource has been reserved */ 1175f616912SHiten Pandya#define RF_ACTIVE 0x0002 /* resource allocation has been activated */ 1185f616912SHiten Pandya#define RF_SHAREABLE 0x0004 /* resource permits contemporaneous sharing */ 1195f616912SHiten Pandya#define RF_TIMESHARE 0x0008 /* resource permits time-division sharing */ 1205f616912SHiten Pandya#define RF_WANTED 0x0010 /* somebody is waiting for this resource */ 1215f616912SHiten Pandya#define RF_FIRSTSHARE 0x0020 /* first in sharing list */ 1225f616912SHiten Pandya#define RF_PREFETCHABLE 0x0040 /* resource is prefetchable */ 1235f616912SHiten Pandya.Ed 1245f616912SHiten Pandya.Pp 1255f616912SHiten PandyaThe remainder of the flag bits are used to represent the desired alignment 1265f616912SHiten Pandyaof the resource within the region. 1275f616912SHiten Pandya.Pp 1285f616912SHiten PandyaThe 1295f616912SHiten Pandya.Fn rman_init 1305f616912SHiten Pandyafunction initializes the region descriptor, pointed to by the 1315f616912SHiten Pandya.Fa rm 1325f616912SHiten Pandyaargument, for use with the resource management functions. 1335f616912SHiten PandyaIt also initializes any mutexes associated with the structure. 1345f616912SHiten Pandya.Pp 1355f616912SHiten PandyaThe 1365f616912SHiten Pandya.Fn rman_fini 1375f616912SHiten Pandyafunction frees any structures associated with the structure 1385f616912SHiten Pandyapointed to by the 1395f616912SHiten Pandya.Fa rm 1405f616912SHiten Pandyaargument. If any of the resources within the managed 1415f616912SHiten Pandyaregion have the 1425f616912SHiten Pandya.Dv RF_ALLOCATED 1435f616912SHiten Pandyaflag set, it will return 1445f616912SHiten Pandya.Er EBUSY ; 1455f616912SHiten Pandyaotherwise, any mutexes associated with the structure will be released 1465f616912SHiten Pandyaand destroyed, and the function will return 0. 1475f616912SHiten Pandya.Pp 1485f616912SHiten PandyaThe 1495f616912SHiten Pandya.Fn rman_manage_region 1505f616912SHiten Pandyafunction establishes the concept of a region which is under 1515f616912SHiten Pandya.Nm 1525f616912SHiten Pandyacontrol. 1535f616912SHiten PandyaThe 1545f616912SHiten Pandya.Fa rman 1555f616912SHiten Pandyaargument points to the region descriptor. 1565f616912SHiten PandyaThe start and end arguments specify the bounds of the region. 1575f616912SHiten Pandya.Pp 1585f616912SHiten Pandya.Em NOTE : 1595f616912SHiten PandyaThis interface is not robust against programming errors which 1605f616912SHiten Pandyaadd multiple copies of the same region. 1615f616912SHiten Pandya.Pp 1625f616912SHiten PandyaThe 1635f616912SHiten Pandya.Fn rman_reserve_resource_bound 1645f616912SHiten Pandyafunction is where the bulk of the 1655f616912SHiten Pandya.Nm logic is located. 1665f616912SHiten PandyaIt attempts to reserve a contiguous range in the specified region 1675f616912SHiten Pandya.Fa rm 1685f616912SHiten Pandyafor the use of the device 1695f616912SHiten Pandya.Fa dev . 1705f616912SHiten PandyaThe caller can specify the start and end of an acceptable range, as well as 1715f616912SHiten Pandyaalignment, and the code will attempt to find a free segment which fits. 1725f616912SHiten PandyaThe default behavior is to allocate an exclusive segment, unless the 1735f616912SHiten Pandya.Dv RF_SHAREABLE 1745f616912SHiten Pandyaor 1755f616912SHiten Pandya.Dv RF_TIMESHARE 1765f616912SHiten Pandyaflags are set, in which case a shared 1775f616912SHiten Pandyasegment will be allocated. 1785f616912SHiten PandyaIf this shared segment already exists, the caller has its device 1795f616912SHiten Pandyaadded to the list of consumers. 1805f616912SHiten Pandya.Pp 1815f616912SHiten PandyaThe 1825f616912SHiten Pandya.Fn rman_reserve_resource 1835f616912SHiten Pandyafunction is used to reserve resources within a previously established region. 1845f616912SHiten PandyaIt is a simplified interface to 1855f616912SHiten Pandya.Fn rman_reserve_resource_bound 1865f616912SHiten Pandyawhich passes 0 for the 1875f616912SHiten Pandya.Fa flags 1885f616912SHiten Pandyaargument. 1895f616912SHiten Pandya.Pp 1905f616912SHiten PandyaThe 1915f616912SHiten Pandya.Fn rman_make_alignment_flags 1925f616912SHiten Pandyafunction returns the flag mask corresponding to the desired alignment 1935f616912SHiten Pandya.Fa size . 1945f616912SHiten PandyaThis should be used when calling 1955f616912SHiten Pandya.Fn rman_reserve_resource_bound . 1965f616912SHiten Pandya.Pp 1975f616912SHiten PandyaThe 1985f616912SHiten Pandya.Fn rman_release_resource 1995f616912SHiten Pandyafunction releases the reserved resource 2005f616912SHiten Pandya.Fa r . 2015f616912SHiten PandyaIt may attempt to merge adjacent free resources. 2025f616912SHiten Pandya.Pp 2035f616912SHiten PandyaThe 2045f616912SHiten Pandya.Fn rman_activate_resource 2055f616912SHiten Pandyafunction marks a resource as active, by setting the 2065f616912SHiten Pandya.Dv RF_ACTIVE 2075f616912SHiten Pandyaflag. 2085f616912SHiten PandyaIf this is a time shared resource, and the caller has not yet acquired 2095f616912SHiten Pandyathe resource, the function returns 2105f616912SHiten Pandya.Er EBUSY. 2115f616912SHiten Pandya.Pp 2125f616912SHiten PandyaThe 2135f616912SHiten Pandya.Fn rman_deactivate_resource 2145f616912SHiten Pandyafunction marks a resource 2155f616912SHiten Pandya.Fa r 2165f616912SHiten Pandyaas inactive, by clearing the 2175f616912SHiten Pandya.Dv RF_ACTIVE 2185f616912SHiten Pandyaflag. 2195f616912SHiten PandyaIf other consumers are waiting for this range, it will wakeup their threads. 2205f616912SHiten Pandya.Pp 2215f616912SHiten PandyaThe 2225f616912SHiten Pandya.Fn rman_await_resource 2235f616912SHiten Pandyafunction performs an asynchronous wait for a resource 2245f616912SHiten Pandya.Fa r 2255f616912SHiten Pandyato become inactive, that is, for the 2265f616912SHiten Pandya.Dv RF_ACTIVE 2275f616912SHiten Pandyaflag to be cleared. 2285f616912SHiten PandyaIt is used to enable cooperative sharing of a resource 2295f616912SHiten Pandyawhich can only be safely used by one thread at a time. 2305f616912SHiten PandyaThe arguments 2315f616912SHiten Pandya.Fa pri 2325f616912SHiten Pandyaand 2335f616912SHiten Pandya.Fa timo 2345f616912SHiten Pandyaare passed to the 2355f616912SHiten Pandya.Fn rman_await_resource 2365f616912SHiten Pandyafunction. 2375f616912SHiten Pandya.Pp 2385f616912SHiten PandyaThe 2395f616912SHiten Pandya.Fn rman_get_start , 2405f616912SHiten Pandya.Fn rman_get_end , 2415f616912SHiten Pandya.Fn rman_get_size , and 2425f616912SHiten Pandya.Fn rman_get_flags 2435f616912SHiten Pandyafunctions return the bounds, size and flags of the previously reserved 2445f616912SHiten Pandyaresource 2455f616912SHiten Pandya.Fa r . 2465f616912SHiten Pandya.Pp 2475f616912SHiten PandyaThe 2485f616912SHiten Pandya.Fn rman_set_bustag 2495f616912SHiten Pandyafunction associates a bus_space_tag_t 2505f616912SHiten Pandya.Fa t 2515f616912SHiten Pandyawith the resource 2525f616912SHiten Pandya.Fa r . 2535f616912SHiten PandyaThe 2545f616912SHiten Pandya.Fn rman_get_bustag 2555f616912SHiten Pandyafunction is used to retrieve this tag once set. 2565f616912SHiten Pandya.Pp 2575f616912SHiten PandyaThe 2585f616912SHiten Pandya.Fn rman_set_bushandle 2595f616912SHiten Pandyafunction associates a bus_space_handle_t 2605f616912SHiten Pandya.Fa h 2615f616912SHiten Pandyawith the resource 2625f616912SHiten Pandya.Fa r . 2635f616912SHiten PandyaThe 2645f616912SHiten Pandya.Fn rman_get_bushandle 2655f616912SHiten Pandyafunction is used to retrieve this handle once set. 2665f616912SHiten Pandya.Pp 2675f616912SHiten PandyaThe 2685f616912SHiten Pandya.Fn rman_set_virtual 2695f616912SHiten Pandyafunction is used to associate a kernel virtual address with a resource 2705f616912SHiten Pandya.Fa r . 2715f616912SHiten PandyaThe 2725f616912SHiten Pandya.Fn rman_get_virtual 2735f616912SHiten Pandyafunction can be used to retrieve the KVA once set. 2745f616912SHiten Pandya.Pp 2755f616912SHiten PandyaThe 2765f616912SHiten Pandya.Fn rman_set_rid 2775f616912SHiten Pandyafunction associates a resource identifier with a resource 2785f616912SHiten Pandya.Fa r . 2795f616912SHiten PandyaThe rman_get_rid function retrieves this RID. 2805f616912SHiten Pandya.Pp 2815f616912SHiten PandyaThe 2825f616912SHiten Pandya.Fn rman_get_device 2835f616912SHiten Pandyafunction returns a pointer to the device which reserved the resource 2845f616912SHiten Pandya.Fa r . 2855f616912SHiten Pandya.Pp 2865f616912SHiten Pandya.Sh SEE ALSO 2875f616912SHiten Pandya.Xr bus_activate_resource 9 , 2885f616912SHiten Pandya.Xr bus_alloc_resource 9 , 2895f616912SHiten Pandya.Xr bus_release_resource 9 , 2905f616912SHiten Pandya.Xr bus_set_resource 9 , 2915f616912SHiten Pandya.Xr mutex 9 2925f616912SHiten Pandya.Sh AUTHORS 2935f616912SHiten PandyaThis man page was written by 2945f616912SHiten Pandya.An Bruce M Simpson Aq bms@spc.org . 295