source: rtems/bsps/shared/irq/irq-affinity.c @ 23ec04c

Last change on this file since 23ec04c was 23ec04c, checked in by Sebastian Huber <sebastian.huber@…>, on 07/06/21 at 16:39:57

bsps/irq: bsp_interrupt_get_affinity()

Return a status code for bsp_interrupt_get_affinity().

Update #3269.

  • Property mode set to 100644
File size: 3.1 KB
Line 
1/* SPDX-License-Identifier: BSD-2-Clause */
2
3/**
4 * @file
5 *
6 * @ingroup bsp_interrupt
7 *
8 * @brief This source file contains the implementation of
9 *   rtems_interrupt_get_affinity() and rtems_interrupt_set_affinity().
10 */
11
12/*
13 * Copyright (C) 2017 embedded brains GmbH (http://www.embedded-brains.de)
14 *
15 * Redistribution and use in source and binary forms, with or without
16 * modification, are permitted provided that the following conditions
17 * are met:
18 * 1. Redistributions of source code must retain the above copyright
19 *    notice, this list of conditions and the following disclaimer.
20 * 2. Redistributions in binary form must reproduce the above copyright
21 *    notice, this list of conditions and the following disclaimer in the
22 *    documentation and/or other materials provided with the distribution.
23 *
24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
25 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
28 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
29 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
30 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
31 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
32 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
33 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34 * POSSIBILITY OF SUCH DAMAGE.
35 */
36
37#include <bsp/irq-generic.h>
38
39#include <rtems/score/processormask.h>
40
41rtems_status_code rtems_interrupt_set_affinity(
42  rtems_vector_number  vector,
43  size_t               affinity_size,
44  const cpu_set_t     *affinity
45)
46{
47  Processor_mask             set;
48  Processor_mask_Copy_status status;
49
50  if ( affinity == NULL ) {
51    return RTEMS_INVALID_ADDRESS;
52  }
53
54  if (!bsp_interrupt_is_valid_vector(vector)) {
55    return RTEMS_INVALID_ID;
56  }
57
58  status = _Processor_mask_From_cpu_set_t(&set, affinity_size, affinity);
59  if ( !_Processor_mask_Is_at_most_partial_loss( status ) ) {
60    return RTEMS_INVALID_NUMBER;
61  }
62
63#if defined(RTEMS_SMP)
64  bsp_interrupt_set_affinity(vector, &set);
65#endif
66  return RTEMS_SUCCESSFUL;
67}
68
69rtems_status_code rtems_interrupt_get_affinity(
70  rtems_vector_number  vector,
71  size_t               affinity_size,
72  cpu_set_t           *affinity
73)
74{
75  rtems_status_code          sc;
76  Processor_mask             set;
77  Processor_mask_Copy_status status;
78
79  if ( affinity == NULL ) {
80    return RTEMS_INVALID_ADDRESS;
81  }
82
83  _Processor_mask_Zero( &set );
84
85  if ( bsp_interrupt_is_valid_vector( vector ) ) {
86#if defined(RTEMS_SMP)
87    sc = bsp_interrupt_get_affinity( vector, &set );
88#else
89    _Processor_mask_From_index( &set, 0 );
90    sc = RTEMS_SUCCESSFUL;
91#endif
92  } else {
93    sc = RTEMS_INVALID_ID;
94  }
95
96  status = _Processor_mask_To_cpu_set_t( &set, affinity_size, affinity );
97  if ( sc == RTEMS_SUCCESSFUL && status != PROCESSOR_MASK_COPY_LOSSLESS ) {
98    return RTEMS_INVALID_SIZE;
99  }
100
101  return sc;
102}
Note: See TracBrowser for help on using the repository browser.