2024-03-19 09:30:16 +01:00
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright ( c ) 2023 - 2024 Intel Corporation
*
* Authors : Cezary Rojewski < cezary . rojewski @ intel . com >
* Amadeusz Slawinski < amadeuszx . slawinski @ linux . intel . com >
*/
# ifndef __ACPI_NHLT_H__
# define __ACPI_NHLT_H__
# include <linux/acpi.h>
# include <linux/kconfig.h>
# include <linux/overflow.h>
# include <linux/types.h>
# define __acpi_nhlt_endpoint_config(ep) ((void *)((ep) + 1))
# define __acpi_nhlt_config_caps(cfg) ((void *)((cfg) + 1))
/**
* acpi_nhlt_endpoint_fmtscfg - Get the formats configuration space .
* @ ep : the endpoint to retrieve the space for .
*
* Return : A pointer to the formats configuration space .
*/
2024-03-19 09:30:18 +01:00
static inline struct acpi_nhlt_formats_config *
acpi_nhlt_endpoint_fmtscfg ( const struct acpi_nhlt_endpoint * ep )
2024-03-19 09:30:16 +01:00
{
struct acpi_nhlt_config * cfg = __acpi_nhlt_endpoint_config ( ep ) ;
2024-03-19 09:30:18 +01:00
return ( struct acpi_nhlt_formats_config * ) ( ( u8 * ) ( cfg + 1 ) + cfg - > capabilities_size ) ;
2024-03-19 09:30:16 +01:00
}
# define __acpi_nhlt_first_endpoint(tb) \
( ( void * ) ( tb + 1 ) )
# define __acpi_nhlt_next_endpoint(ep) \
( ( void * ) ( ( u8 * ) ( ep ) + ( ep ) - > length ) )
# define __acpi_nhlt_get_endpoint(tb, ep, i) \
( ( i ) ? __acpi_nhlt_next_endpoint ( ep ) : __acpi_nhlt_first_endpoint ( tb ) )
# define __acpi_nhlt_first_fmtcfg(fmts) \
( ( void * ) ( fmts + 1 ) )
# define __acpi_nhlt_next_fmtcfg(fmt) \
( ( void * ) ( ( u8 * ) ( ( fmt ) + 1 ) + ( fmt ) - > config . capabilities_size ) )
# define __acpi_nhlt_get_fmtcfg(fmts, fmt, i) \
( ( i ) ? __acpi_nhlt_next_fmtcfg ( fmt ) : __acpi_nhlt_first_fmtcfg ( fmts ) )
/*
* The for_each_nhlt_ * ( ) macros rely on an iterator to deal with the
* variable length of each endpoint structure and the possible presence
* of an OED - Config used by Windows only .
*/
/**
* for_each_nhlt_endpoint - Iterate over endpoints in a NHLT table .
* @ tb : the pointer to a NHLT table .
* @ ep : the pointer to endpoint to use as loop cursor .
*/
# define for_each_nhlt_endpoint(tb, ep) \
for ( unsigned int __i = 0 ; \
__i < ( tb ) - > endpoints_count & & \
( ep = __acpi_nhlt_get_endpoint ( tb , ep , __i ) ) ; \
__i + + )
/**
* for_each_nhlt_fmtcfg - Iterate over format configurations .
* @ fmts : the pointer to formats configuration space .
* @ fmt : the pointer to format to use as loop cursor .
*/
# define for_each_nhlt_fmtcfg(fmts, fmt) \
for ( unsigned int __i = 0 ; \
__i < ( fmts ) - > formats_count & & \
( fmt = __acpi_nhlt_get_fmtcfg ( fmts , fmt , __i ) ) ; \
__i + + )
/**
* for_each_nhlt_endpoint_fmtcfg - Iterate over format configurations in an endpoint .
* @ ep : the pointer to an endpoint .
* @ fmt : the pointer to format to use as loop cursor .
*/
# define for_each_nhlt_endpoint_fmtcfg(ep, fmt) \
for_each_nhlt_fmtcfg ( acpi_nhlt_endpoint_fmtscfg ( ep ) , fmt )
# if IS_ENABLED(CONFIG_ACPI_NHLT)
/*
* System - wide pointer to the first NHLT table .
*
* A sound driver may utilize acpi_nhlt_get / put_gbl_table ( ) on its
* initialization and removal respectively to avoid excessive mapping
* and unmapping of the memory occupied by the table between streaming
* operations .
*/
acpi_status acpi_nhlt_get_gbl_table ( void ) ;
void acpi_nhlt_put_gbl_table ( void ) ;
2024-03-19 09:30:18 +01:00
bool acpi_nhlt_endpoint_match ( const struct acpi_nhlt_endpoint * ep ,
2024-03-19 09:30:16 +01:00
int link_type , int dev_type , int dir , int bus_id ) ;
2024-03-19 09:30:18 +01:00
struct acpi_nhlt_endpoint *
acpi_nhlt_tb_find_endpoint ( const struct acpi_table_nhlt * tb ,
2024-03-19 09:30:16 +01:00
int link_type , int dev_type , int dir , int bus_id ) ;
2024-03-19 09:30:18 +01:00
struct acpi_nhlt_endpoint *
2024-03-19 09:30:16 +01:00
acpi_nhlt_find_endpoint ( int link_type , int dev_type , int dir , int bus_id ) ;
2024-03-19 09:30:18 +01:00
struct acpi_nhlt_format_config *
acpi_nhlt_endpoint_find_fmtcfg ( const struct acpi_nhlt_endpoint * ep ,
2024-03-19 09:30:16 +01:00
u16 ch , u32 rate , u16 vbps , u16 bps ) ;
2024-03-19 09:30:18 +01:00
struct acpi_nhlt_format_config *
acpi_nhlt_tb_find_fmtcfg ( const struct acpi_table_nhlt * tb ,
2024-03-19 09:30:16 +01:00
int link_type , int dev_type , int dir , int bus_id ,
u16 ch , u32 rate , u16 vpbs , u16 bps ) ;
2024-03-19 09:30:18 +01:00
struct acpi_nhlt_format_config *
2024-03-19 09:30:16 +01:00
acpi_nhlt_find_fmtcfg ( int link_type , int dev_type , int dir , int bus_id ,
u16 ch , u32 rate , u16 vpbs , u16 bps ) ;
2024-03-19 09:30:18 +01:00
int acpi_nhlt_endpoint_mic_count ( const struct acpi_nhlt_endpoint * ep ) ;
2024-03-19 09:30:16 +01:00
# else /* !CONFIG_ACPI_NHLT */
static inline acpi_status acpi_nhlt_get_gbl_table ( void )
{
return AE_NOT_FOUND ;
}
static inline void acpi_nhlt_put_gbl_table ( void )
{
}
static inline bool
2024-03-19 09:30:18 +01:00
acpi_nhlt_endpoint_match ( const struct acpi_nhlt_endpoint * ep ,
2024-03-19 09:30:16 +01:00
int link_type , int dev_type , int dir , int bus_id )
{
return false ;
}
2024-03-19 09:30:18 +01:00
static inline struct acpi_nhlt_endpoint *
acpi_nhlt_tb_find_endpoint ( const struct acpi_table_nhlt * tb ,
2024-03-19 09:30:16 +01:00
int link_type , int dev_type , int dir , int bus_id )
{
return NULL ;
}
2024-03-19 09:30:18 +01:00
static inline struct acpi_nhlt_format_config *
acpi_nhlt_endpoint_find_fmtcfg ( const struct acpi_nhlt_endpoint * ep ,
2024-03-19 09:30:16 +01:00
u16 ch , u32 rate , u16 vbps , u16 bps )
{
return NULL ;
}
2024-03-19 09:30:18 +01:00
static inline struct acpi_nhlt_format_config *
acpi_nhlt_tb_find_fmtcfg ( const struct acpi_table_nhlt * tb ,
2024-03-19 09:30:16 +01:00
int link_type , int dev_type , int dir , int bus_id ,
u16 ch , u32 rate , u16 vpbs , u16 bps )
{
return NULL ;
}
2024-03-19 09:30:18 +01:00
static inline int acpi_nhlt_endpoint_mic_count ( const struct acpi_nhlt_endpoint * ep )
2024-03-19 09:30:16 +01:00
{
return 0 ;
}
2024-03-19 09:30:18 +01:00
static inline struct acpi_nhlt_endpoint *
2024-03-19 09:30:16 +01:00
acpi_nhlt_find_endpoint ( int link_type , int dev_type , int dir , int bus_id )
{
return NULL ;
}
2024-03-19 09:30:18 +01:00
static inline struct acpi_nhlt_format_config *
2024-03-19 09:30:16 +01:00
acpi_nhlt_find_fmtcfg ( int link_type , int dev_type , int dir , int bus_id ,
u16 ch , u32 rate , u16 vpbs , u16 bps )
{
return NULL ;
}
# endif /* CONFIG_ACPI_NHLT */
# endif /* __ACPI_NHLT_H__ */