[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL v2 15/65] libqos/ahci: Functional register helpers
From: |
Stefan Hajnoczi |
Subject: |
[Qemu-devel] [PULL v2 15/65] libqos/ahci: Functional register helpers |
Date: |
Mon, 16 Feb 2015 15:45:40 +0000 |
From: John Snow <address@hidden>
Introduce a set of "static inline" register helpers that are intended to
replace the current set of macros with more functional versions that are
better suited to inclusion in libqos than porcelain macros.
As a stopgap measure before eliminating the porcelain macros, define them
to use the new functions defined in the ahci.h header.
Signed-off-by: John Snow <address@hidden>
Reviewed-by: Paolo Bonzini <address@hidden>
Message-id: address@hidden
Signed-off-by: Stefan Hajnoczi <address@hidden>
---
tests/ahci-test.c | 25 ++++++++++-----------
tests/libqos/ahci.h | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 74 insertions(+), 14 deletions(-)
diff --git a/tests/ahci-test.c b/tests/ahci-test.c
index bb98968..25e54b8 100644
--- a/tests/ahci-test.c
+++ b/tests/ahci-test.c
@@ -47,22 +47,19 @@ static char tmp_path[] = "/tmp/qtest.XXXXXX";
static bool ahci_pedantic;
/*** IO macros for the AHCI memory registers. ***/
-#define AHCI_READ(OFST) qpci_io_readl(ahci->dev, ahci->hba_base + (OFST))
-#define AHCI_WRITE(OFST, VAL) qpci_io_writel(ahci->dev, \
- ahci->hba_base + (OFST), (VAL))
-#define AHCI_RREG(regno) AHCI_READ(4 * (regno))
-#define AHCI_WREG(regno, val) AHCI_WRITE(4 * (regno), (val))
-#define AHCI_SET(regno, mask) AHCI_WREG((regno), AHCI_RREG(regno) | (mask))
-#define AHCI_CLR(regno, mask) AHCI_WREG((regno), AHCI_RREG(regno) & ~(mask))
+#define AHCI_READ(OFST) ahci_mread(ahci, (OFST))
+#define AHCI_WRITE(OFST, VAL) ahci_mwrite(ahci, (OFST), (VAL))
+#define AHCI_RREG(regno) ahci_rreg(ahci, (regno))
+#define AHCI_WREG(regno, val) ahci_wreg(ahci, (regno), (val))
+#define AHCI_SET(regno, mask) ahci_set(ahci, (regno), (mask))
+#define AHCI_CLR(regno, mask) ahci_clr(ahci, (regno), (mask))
/*** IO macros for port-specific offsets inside of AHCI memory. ***/
-#define PX_OFST(port, regno) (HBA_PORT_NUM_REG * (port) + AHCI_PORTS + (regno))
-#define PX_RREG(port, regno) AHCI_RREG(PX_OFST((port), (regno)))
-#define PX_WREG(port, regno, val) AHCI_WREG(PX_OFST((port), (regno)), (val))
-#define PX_SET(port, reg, mask) PX_WREG((port), (reg), \
- PX_RREG((port), (reg)) | (mask));
-#define PX_CLR(port, reg, mask) PX_WREG((port), (reg), \
- PX_RREG((port), (reg)) & ~(mask));
+#define PX_OFST(port, regno) ahci_px_ofst((port), (regno))
+#define PX_RREG(port, regno) ahci_px_rreg(ahci, (port), (regno))
+#define PX_WREG(port, regno, val) ahci_px_wreg(ahci, (port), (regno), (val))
+#define PX_SET(port, reg, mask) ahci_px_set(ahci, (port), (reg), (mask))
+#define PX_CLR(port, reg, mask) ahci_px_clr(ahci, (port), (reg), (mask))
/*** Function Declarations ***/
static QPCIDevice *get_ahci_device(uint32_t *fingerprint);
diff --git a/tests/libqos/ahci.h b/tests/libqos/ahci.h
index 8e92385..645f05b 100644
--- a/tests/libqos/ahci.h
+++ b/tests/libqos/ahci.h
@@ -354,4 +354,67 @@ typedef struct PRD {
/* For calculating how big the PRD table needs to be: */
#define CMD_TBL_SIZ(n) ((0x80 + ((n) * sizeof(PRD)) + 0x7F) & ~0x7F)
+/* Helpers for reading/writing AHCI HBA register values */
+
+static inline uint32_t ahci_mread(AHCIQState *ahci, size_t offset)
+{
+ return qpci_io_readl(ahci->dev, ahci->hba_base + offset);
+}
+
+static inline void ahci_mwrite(AHCIQState *ahci, size_t offset, uint32_t value)
+{
+ qpci_io_writel(ahci->dev, ahci->hba_base + offset, value);
+}
+
+static inline uint32_t ahci_rreg(AHCIQState *ahci, uint32_t reg_num)
+{
+ return ahci_mread(ahci, 4 * reg_num);
+}
+
+static inline void ahci_wreg(AHCIQState *ahci, uint32_t reg_num, uint32_t
value)
+{
+ ahci_mwrite(ahci, 4 * reg_num, value);
+}
+
+static inline void ahci_set(AHCIQState *ahci, uint32_t reg_num, uint32_t mask)
+{
+ ahci_wreg(ahci, reg_num, ahci_rreg(ahci, reg_num) | mask);
+}
+
+static inline void ahci_clr(AHCIQState *ahci, uint32_t reg_num, uint32_t mask)
+{
+ ahci_wreg(ahci, reg_num, ahci_rreg(ahci, reg_num) & ~mask);
+}
+
+static inline size_t ahci_px_offset(uint8_t port, uint32_t reg_num)
+{
+ return AHCI_PORTS + (HBA_PORT_NUM_REG * port) + reg_num;
+}
+
+static inline uint32_t ahci_px_rreg(AHCIQState *ahci, uint8_t port,
+ uint32_t reg_num)
+{
+ return ahci_rreg(ahci, ahci_px_offset(port, reg_num));
+}
+
+static inline void ahci_px_wreg(AHCIQState *ahci, uint8_t port,
+ uint32_t reg_num, uint32_t value)
+{
+ ahci_wreg(ahci, ahci_px_offset(port, reg_num), value);
+}
+
+static inline void ahci_px_set(AHCIQState *ahci, uint8_t port,
+ uint32_t reg_num, uint32_t mask)
+{
+ ahci_px_wreg(ahci, port, reg_num,
+ ahci_px_rreg(ahci, port, reg_num) | mask);
+}
+
+static inline void ahci_px_clr(AHCIQState *ahci, uint8_t port,
+ uint32_t reg_num, uint32_t mask)
+{
+ ahci_px_wreg(ahci, port, reg_num,
+ ahci_px_rreg(ahci, port, reg_num) & ~mask);
+}
+
#endif
--
2.1.0
- [Qemu-devel] [PULL v2 01/65] nbd: Drop BDS backpointer, (continued)
- [Qemu-devel] [PULL v2 01/65] nbd: Drop BDS backpointer, Stefan Hajnoczi, 2015/02/16
- [Qemu-devel] [PULL v2 04/65] libqos: Split apart pc_alloc_init, Stefan Hajnoczi, 2015/02/16
- [Qemu-devel] [PULL v2 02/65] iotests: Add "wait" functionality to _cleanup_qemu, Stefan Hajnoczi, 2015/02/16
- [Qemu-devel] [PULL v2 06/65] libqos: create libqos.c, Stefan Hajnoczi, 2015/02/16
- [Qemu-devel] [PULL v2 08/65] libqos: add alloc_init_flags, Stefan Hajnoczi, 2015/02/16
- [Qemu-devel] [PULL v2 07/65] libqos: add qtest_vboot, Stefan Hajnoczi, 2015/02/16
- [Qemu-devel] [PULL v2 05/65] qtest/ahci: Create ahci.h, Stefan Hajnoczi, 2015/02/16
- [Qemu-devel] [PULL v2 09/65] libqos: Update QGuestAllocator to be opaque, Stefan Hajnoczi, 2015/02/16
- [Qemu-devel] [PULL v2 10/65] libqos: add pc specific interface, Stefan Hajnoczi, 2015/02/16
- [Qemu-devel] [PULL v2 12/65] qtest/ahci: finalize AHCIQState consolidation, Stefan Hajnoczi, 2015/02/16
- [Qemu-devel] [PULL v2 15/65] libqos/ahci: Functional register helpers,
Stefan Hajnoczi <=
- [Qemu-devel] [PULL v2 11/65] qtest/ahci: Store hba_base in AHCIQState, Stefan Hajnoczi, 2015/02/16
- [Qemu-devel] [PULL v2 13/65] qtest/ahci: remove pcibus global, Stefan Hajnoczi, 2015/02/16
- [Qemu-devel] [PULL v2 16/65] qtest/ahci: remove getter/setter macros, Stefan Hajnoczi, 2015/02/16
- [Qemu-devel] [PULL v2 17/65] qtest/ahci: Bookmark FB and CLB pointers, Stefan Hajnoczi, 2015/02/16
- [Qemu-devel] [PULL v2 14/65] qtest/ahci: remove guest_malloc global, Stefan Hajnoczi, 2015/02/16
- [Qemu-devel] [PULL v2 18/65] libqos/ahci: create libqos/ahci.c, Stefan Hajnoczi, 2015/02/16
- [Qemu-devel] [PULL v2 19/65] dataplane: endianness-aware accesses, Stefan Hajnoczi, 2015/02/16
- [Qemu-devel] [PULL v2 20/65] libqos/ahci: Add ahci_port_select helper, Stefan Hajnoczi, 2015/02/16
- [Qemu-devel] [PULL v2 24/65] libqos/ahci: Add ahci_port_check_error helper, Stefan Hajnoczi, 2015/02/16
- [Qemu-devel] [PULL v2 21/65] libqos/ahci: Add ahci_port_clear helper, Stefan Hajnoczi, 2015/02/16