2023-06-26 11:44:57 -07:00
|
|
|
// SPDX-License-Identifier: BSD-2-Clause-Views
|
2022-07-28 17:52:19 -07:00
|
|
|
/*
|
2023-06-26 11:44:57 -07:00
|
|
|
* Copyright (c) 2022-2023 The Regents of the University of California
|
|
|
|
*/
|
2022-07-28 17:52:19 -07:00
|
|
|
|
|
|
|
#include "reg_if.h"
|
|
|
|
|
|
|
|
int mqnic_reg_if_read8(const struct mqnic_reg_if *reg, ptrdiff_t offset, uint8_t *value)
|
|
|
|
{
|
|
|
|
if (!reg || !reg->ops || !reg->ops->read8)
|
|
|
|
return -1;
|
|
|
|
return reg->ops->read8(reg, offset, value);
|
|
|
|
}
|
|
|
|
|
|
|
|
int mqnic_reg_if_write8(const struct mqnic_reg_if *reg, ptrdiff_t offset, uint8_t value)
|
|
|
|
{
|
|
|
|
if (!reg || !reg->ops || !reg->ops->write8)
|
|
|
|
return -1;
|
|
|
|
return reg->ops->write8(reg, offset, value);
|
|
|
|
}
|
|
|
|
|
|
|
|
int mqnic_reg_if_read16(const struct mqnic_reg_if *reg, ptrdiff_t offset, uint16_t *value)
|
|
|
|
{
|
|
|
|
if (!reg || !reg->ops || !reg->ops->read16)
|
|
|
|
return -1;
|
|
|
|
return reg->ops->read16(reg, offset, value);
|
|
|
|
}
|
|
|
|
|
|
|
|
int mqnic_reg_if_write16(const struct mqnic_reg_if *reg, ptrdiff_t offset, uint16_t value)
|
|
|
|
{
|
|
|
|
if (!reg || !reg->ops || !reg->ops->write16)
|
|
|
|
return -1;
|
|
|
|
return reg->ops->write16(reg, offset, value);
|
|
|
|
}
|
|
|
|
|
|
|
|
int mqnic_reg_if_read32(const struct mqnic_reg_if *reg, ptrdiff_t offset, uint32_t *value)
|
|
|
|
{
|
|
|
|
if (!reg || !reg->ops || !reg->ops->read32)
|
|
|
|
return -1;
|
|
|
|
return reg->ops->read32(reg, offset, value);
|
|
|
|
}
|
|
|
|
|
|
|
|
int mqnic_reg_if_write32(const struct mqnic_reg_if *reg, ptrdiff_t offset, uint32_t value)
|
|
|
|
{
|
|
|
|
if (!reg || !reg->ops || !reg->ops->write32)
|
|
|
|
return -1;
|
|
|
|
return reg->ops->write32(reg, offset, value);
|
|
|
|
}
|
|
|
|
|
|
|
|
int mqnic_reg_if_read64(const struct mqnic_reg_if *reg, ptrdiff_t offset, uint64_t *value)
|
|
|
|
{
|
|
|
|
if (!reg || !reg->ops || !reg->ops->read64)
|
|
|
|
return -1;
|
|
|
|
return reg->ops->read64(reg, offset, value);
|
|
|
|
}
|
|
|
|
|
|
|
|
int mqnic_reg_if_write64(const struct mqnic_reg_if *reg, ptrdiff_t offset, uint64_t value)
|
|
|
|
{
|
|
|
|
if (!reg || !reg->ops || !reg->ops->write64)
|
|
|
|
return -1;
|
|
|
|
return reg->ops->write64(reg, offset, value);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int mqnic_reg_if_raw_read8(const struct mqnic_reg_if *reg, ptrdiff_t offset, uint8_t *value)
|
|
|
|
{
|
|
|
|
uint8_t *regs = (uint8_t *)reg->priv;
|
|
|
|
*value = *(volatile uint8_t *)(regs+offset);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int mqnic_reg_if_raw_write8(const struct mqnic_reg_if *reg, ptrdiff_t offset, uint8_t value)
|
|
|
|
{
|
|
|
|
uint8_t *regs = (uint8_t *)reg->priv;
|
|
|
|
*(volatile uint8_t *)(regs+offset) = value;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int mqnic_reg_if_raw_read16(const struct mqnic_reg_if *reg, ptrdiff_t offset, uint16_t *value)
|
|
|
|
{
|
|
|
|
uint8_t *regs = (uint8_t *)reg->priv;
|
|
|
|
*value = *(volatile uint16_t *)(regs+offset);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int mqnic_reg_if_raw_write16(const struct mqnic_reg_if *reg, ptrdiff_t offset, uint16_t value)
|
|
|
|
{
|
|
|
|
uint8_t *regs = (uint8_t *)reg->priv;
|
|
|
|
*(volatile uint16_t *)(regs+offset) = value;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int mqnic_reg_if_raw_read32(const struct mqnic_reg_if *reg, ptrdiff_t offset, uint32_t *value)
|
|
|
|
{
|
|
|
|
uint8_t *regs = (uint8_t *)reg->priv;
|
|
|
|
*value = *(volatile uint32_t *)(regs+offset);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int mqnic_reg_if_raw_write32(const struct mqnic_reg_if *reg, ptrdiff_t offset, uint32_t value)
|
|
|
|
{
|
|
|
|
uint8_t *regs = (uint8_t *)reg->priv;
|
|
|
|
*(volatile uint32_t *)(regs+offset) = value;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int mqnic_reg_if_raw_read64(const struct mqnic_reg_if *reg, ptrdiff_t offset, uint64_t *value)
|
|
|
|
{
|
|
|
|
uint8_t *regs = (uint8_t *)reg->priv;
|
|
|
|
*value = *(volatile uint64_t *)(regs+offset);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int mqnic_reg_if_raw_write64(const struct mqnic_reg_if *reg, ptrdiff_t offset, uint64_t value)
|
|
|
|
{
|
|
|
|
uint8_t *regs = (uint8_t *)reg->priv;
|
|
|
|
*(volatile uint64_t *)(regs+offset) = value;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static const struct mqnic_reg_if_ops mqnic_reg_if_raw_ops = {
|
|
|
|
.read8 = mqnic_reg_if_raw_read8,
|
|
|
|
.write8 = mqnic_reg_if_raw_write8,
|
|
|
|
.read16 = mqnic_reg_if_raw_read16,
|
|
|
|
.write16 = mqnic_reg_if_raw_write16,
|
|
|
|
.read32 = mqnic_reg_if_raw_read32,
|
|
|
|
.write32 = mqnic_reg_if_raw_write32,
|
|
|
|
.read64 = mqnic_reg_if_raw_read64,
|
|
|
|
.write64 = mqnic_reg_if_raw_write64
|
|
|
|
};
|
|
|
|
|
|
|
|
void mqnic_reg_if_setup_raw(struct mqnic_reg_if *reg, void *regs)
|
|
|
|
{
|
|
|
|
reg->priv = regs;
|
|
|
|
reg->ops = &mqnic_reg_if_raw_ops;
|
|
|
|
}
|