• Nathan Lynch's avatar
    powerpc/rtas: improve function information lookups · 8252b882
    Nathan Lynch authored
    The core RTAS support code and its clients perform two types of lookup
    for RTAS firmware function information.
    
    First, mapping a known function name to a token. The typical use case
    invokes rtas_token() to retrieve the token value to pass to
    rtas_call(). rtas_token() relies on of_get_property(), which performs
    a linear search of the /rtas node's property list under a lock with
    IRQs disabled.
    
    Second, and less common: given a token value, looking up some
    information about the function. The primary example is the sys_rtas
    filter path, which linearly scans a small table to match the token to
    a rtas_filter struct. Another use case to come is RTAS entry/exit
    tracepoints, which will require efficient lookup of function names
    from token values. Currently there is no general API for this.
    
    We need something much like the existing rtas_filters table, but more
    general and organized to facilitate efficient lookups.
    
    Introduce:
    
    * A new rtas_function type, aggregating function name, token,
      and filter. Other function characteristics could be added in the
      future.
    
    * An array of rtas_function, where each element corresponds to a known
      RTAS function. All information in the table is static save the token
      values, which are derived from the device tree at boot. The array is
      sorted by function name to allow binary search.
    
    * A named constant for each known RTAS function, used to index the
      function array. These also will be used in a client-facing API to be
      added later.
    
    * An xarray that maps valid tokens to rtas_function objects.
    
    Fold the existing rtas_filter table into the new rtas_function array,
    with the appropriate adjustments to block_rtas_call(). Remove
    now-redundant fields from struct rtas_filter. Preserve the function of
    the CONFIG_CPU_BIG_ENDIAN guard in the current filter table by
    introducing a per-function flag that is set for the function entries
    related to pseries LPAR migration. These have never had working users
    via sys_rtas on ppc64le; see commit de0f7349 ("powerpc/rtas:
    prevent suspend-related sys_rtas use on LE").
    
    Convert rtas_token() to use a lockless binary search on the function
    table. Fall back to the old behavior for lookups against names that
    are not known to be RTAS functions, but issue a warning. rtas_token()
    is for function names; it is not a general facility for accessing
    arbitrary properties of the /rtas node. All known misuses of
    rtas_token() have been converted to more appropriate of_ APIs in
    preceding changes.
    Signed-off-by: default avatarNathan Lynch <nathanl@linux.ibm.com>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20230125-b4-powerpc-rtas-queue-v3-8-26929c8cce78@linux.ibm.com
    8252b882
rtas.c 50.4 KB