From b937f9bf750907602606691dd92fb6d70e9f88da Mon Sep 17 00:00:00 2001 From: John Baldwin Date: Tue, 24 Feb 2026 15:29:40 -0500 Subject: [PATCH] bus: Add __BUS_ACCESSOR_DEFAULT This macro is similar to __BUS_ACCESSOR in that it creates three helper routines for an ivar, but the "get" wrapper returns a default value if BUS_READ_IVAR does not return a value. Reviewed by: imp Differential Revision: https://reviews.freebsd.org/D55353 --- sys/sys/bus.h | 46 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 32 insertions(+), 14 deletions(-) diff --git a/sys/sys/bus.h b/sys/sys/bus.h index 0d1baaafb4c..a2e315bb9de 100644 --- a/sys/sys/bus.h +++ b/sys/sys/bus.h @@ -943,7 +943,7 @@ DECLARE_MODULE(_name##_##busname, _name##_##busname##_mod, \ /** * Generic ivar accessor generation macros for bus drivers */ -#define __BUS_ACCESSOR(varp, var, ivarp, ivar, type) \ +#define __BUS_ACCESSOR_COMMON(varp, var, ivarp, ivar, type) \ \ static __inline bool \ varp ## _has_ ## var(device_t dev) \ @@ -956,19 +956,6 @@ varp ## _has_ ## var(device_t dev) \ return (e == 0); \ } \ \ -static __inline type \ -varp ## _get_ ## var(device_t dev) \ -{ \ - uintptr_t v = 0; \ - int e __diagused; \ - e = BUS_READ_IVAR(device_get_parent(dev), dev, \ - ivarp ## _IVAR_ ## ivar, &v); \ - KASSERT(e == 0, ("%s failed for %s on bus %s, error = %d", \ - __func__, device_get_nameunit(dev), \ - device_get_nameunit(device_get_parent(dev)), e)); \ - return ((type) v); \ -} \ - \ static __inline void \ varp ## _set_ ## var(device_t dev, type t) \ { \ @@ -981,6 +968,37 @@ varp ## _set_ ## var(device_t dev, type t) \ device_get_nameunit(device_get_parent(dev)), e)); \ } +#define __BUS_ACCESSOR(varp, var, ivarp, ivar, type) \ + __BUS_ACCESSOR_COMMON(varp, var, ivarp, ivar, type) \ + \ +static __inline type \ +varp ## _get_ ## var(device_t dev) \ +{ \ + uintptr_t v = 0; \ + int e __diagused; \ + \ + e = BUS_READ_IVAR(device_get_parent(dev), dev, \ + ivarp ## _IVAR_ ## ivar, &v); \ + KASSERT(e == 0, ("%s failed for %s on bus %s, error = %d", \ + __func__, device_get_nameunit(dev), \ + device_get_nameunit(device_get_parent(dev)), e)); \ + return ((type) v); \ +} + +#define __BUS_ACCESSOR_DEFAULT(varp, var, ivarp, ivar, type, default) \ + __BUS_ACCESSOR_COMMON(varp, var, ivarp, ivar, type) \ + \ +static __inline type \ +varp ## _get_ ## var(device_t dev) \ +{ \ + uintptr_t v = 0; \ + int e; \ + \ + e = BUS_READ_IVAR(device_get_parent(dev), dev, \ + ivarp ## _IVAR_ ## ivar, &v); \ + return (e == 0 ? (type) v : (default)); \ +} + struct device_location_cache; typedef struct device_location_cache device_location_cache_t; device_location_cache_t *dev_wired_cache_init(void);