Skip to content

Commit

Permalink
[linda] Use standard readq() and writeq() implementations
Browse files Browse the repository at this point in the history
This driver is the original source of the current readq() and writeq()
implementations for 32-bit iPXE.  Switch to using the now-centralised
definitions, to avoid including architecture-specific code in an
otherwise architecture-independent driver.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
  • Loading branch information
mcb30 committed Mar 12, 2016
1 parent cc9f31e commit 5229662
Showing 1 changed file with 8 additions and 26 deletions.
34 changes: 8 additions & 26 deletions src/drivers/infiniband/linda.c
Expand Up @@ -112,32 +112,21 @@ struct linda {
* This card requires atomic 64-bit accesses. Strange things happen
* if you try to use 32-bit accesses; sometimes they work, sometimes
* they don't, sometimes you get random data.
*
* These accessors use the "movq" MMX instruction, and so won't work
* on really old Pentiums (which won't have PCIe anyway, so this is
* something of a moot point).
*/

/**
* Read Linda qword register
*
* @v linda Linda device
* @v dwords Register buffer to read into
* @v qword Register buffer to read into
* @v offset Register offset
*/
static void linda_readq ( struct linda *linda, uint32_t *dwords,
static void linda_readq ( struct linda *linda, uint64_t *qword,
unsigned long offset ) {
void *addr = ( linda->regs + offset );

__asm__ __volatile__ ( "movq (%1), %%mm0\n\t"
"movq %%mm0, (%0)\n\t"
: : "r" ( dwords ), "r" ( addr ) : "memory" );

DBGIO ( "[%08lx] => %08x%08x\n",
virt_to_phys ( addr ), dwords[1], dwords[0] );
*qword = readq ( linda->regs + offset );
}
#define linda_readq( _linda, _ptr, _offset ) \
linda_readq ( (_linda), (_ptr)->u.dwords, (_offset) )
linda_readq ( (_linda), (_ptr)->u.qwords, (_offset) )
#define linda_readq_array8b( _linda, _ptr, _offset, _idx ) \
linda_readq ( (_linda), (_ptr), ( (_offset) + ( (_idx) * 8 ) ) )
#define linda_readq_array64k( _linda, _ptr, _offset, _idx ) \
Expand All @@ -147,22 +136,15 @@ static void linda_readq ( struct linda *linda, uint32_t *dwords,
* Write Linda qword register
*
* @v linda Linda device
* @v dwords Register buffer to write
* @v qword Register buffer to write
* @v offset Register offset
*/
static void linda_writeq ( struct linda *linda, const uint32_t *dwords,
static void linda_writeq ( struct linda *linda, const uint64_t *qword,
unsigned long offset ) {
void *addr = ( linda->regs + offset );

DBGIO ( "[%08lx] <= %08x%08x\n",
virt_to_phys ( addr ), dwords[1], dwords[0] );

__asm__ __volatile__ ( "movq (%0), %%mm0\n\t"
"movq %%mm0, (%1)\n\t"
: : "r" ( dwords ), "r" ( addr ) : "memory" );
writeq ( *qword, ( linda->regs + offset ) );
}
#define linda_writeq( _linda, _ptr, _offset ) \
linda_writeq ( (_linda), (_ptr)->u.dwords, (_offset) )
linda_writeq ( (_linda), (_ptr)->u.qwords, (_offset) )
#define linda_writeq_array8b( _linda, _ptr, _offset, _idx ) \
linda_writeq ( (_linda), (_ptr), ( (_offset) + ( (_idx) * 8 ) ) )
#define linda_writeq_array64k( _linda, _ptr, _offset, _idx ) \
Expand Down

0 comments on commit 5229662

Please sign in to comment.