coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
mmio.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <assert.h>
4 #include <device/mmio.h>
5 
6 /* Helper functions for various MMIO access patterns. */
7 
8 void buffer_from_fifo32(void *buffer, size_t size, void *fifo,
9  int fifo_stride, int fifo_width)
10 {
11  u8 *p = buffer;
12  int i, j;
13 
14  assert(fifo_width > 0 && fifo_width <= sizeof(u32) &&
15  fifo_stride % sizeof(u32) == 0);
16 
17  for (i = 0; i < size; i += fifo_width, fifo += fifo_stride) {
18  u32 val = read32(fifo);
19  for (j = 0; j < MIN(size - i, fifo_width); j++)
20  *p++ = (u8)(val >> (j * 8));
21  }
22 }
23 
24 void buffer_to_fifo32_prefix(const void *buffer, u32 prefix, int prefsz, size_t size,
25  void *fifo, int fifo_stride, int fifo_width)
26 {
27  const u8 *p = buffer;
28  int i, j = prefsz;
29 
30  assert(fifo_width > 0 && fifo_width <= sizeof(u32) &&
31  fifo_stride % sizeof(u32) == 0 && prefsz <= fifo_width);
32 
33  uint32_t val = prefix;
34  for (i = 0; i < size; i += fifo_width, fifo += fifo_stride) {
35  for (; j < MIN(size - i, fifo_width); j++)
36  val |= *p++ << (j * 8);
37  write32(fifo, val);
38  val = 0;
39  j = 0;
40  }
41 
42 }
static void write32(void *addr, uint32_t val)
Definition: mmio.h:40
static uint32_t read32(const void *addr)
Definition: mmio.h:22
#define assert(statement)
Definition: assert.h:74
#define MIN(a, b)
Definition: helpers.h:37
void buffer_from_fifo32(void *buffer, size_t size, void *fifo, int fifo_stride, int fifo_width)
Definition: mmio.c:8
void buffer_to_fifo32_prefix(const void *buffer, u32 prefix, int prefsz, size_t size, void *fifo, int fifo_stride, int fifo_width)
Definition: mmio.c:24
u8 buffer[C2P_BUFFER_MAXSIZE]
Definition: psp_smm.c:18
unsigned int uint32_t
Definition: stdint.h:14
uint32_t u32
Definition: stdint.h:51
uint8_t u8
Definition: stdint.h:45
u8 val
Definition: sys.c:300